Category: 小小草

IT 技术领域学海无涯。其实任何领域都学海无涯,无非 IT 发展太快了,让我有更多嘘唏。希望我掌握的技术有如小小草,虽然渺小,却有旺盛的生命力。

  • Play with WD MybookWorld

    先说一下我所了解的此网络硬盘的习性:

    • 首先,它在创建用户时,并不创建同名组。
    • 其次,创建用户时,会问及是否创建 User Private Share。User Private Share 是 samba 用的一个名词,我觉得很难理解:既然是 Private,何来 Share?就叫 User Home Directory 更好一些。
    • 再次,删除用户时, User Private Share 并不随之删除,在 Folder Shares 界面里才能删除它。我试过以 root 身份执行 rm 都说“device busy”。

    什么情况下需要共享?最初我想按人分,一类是平级共享,比如同一组织内两个人共事,他们可以相互访问对方的文件;另一类是分级共享,比如上级可以访问下级的文件,而反之不能。后来情况变复杂了:甲要访问乙的部分文件,乙也要访问甲的部分文件,同时甲又给丙共享另一部分文件……所以最后我按文件类别分,某类文件要给哪几个人权限,思路就很清楚了。

  • Can’t retrieve entity config: core/store_group

    老版本的 Magento (1.3.2.3) 跑在新版本的 php (5.4.3) 上有个问题:

    Can't retrieve entity config: core/store_group

    这问题有点莫名其妙,最后发现是因为 SimpleXML 这个库太老了,在新版本的 php 下无法处理 Magento 的一些 xml 文件,所以出错。

    从新版本的 Magento (1.7.0.0) 里拷贝出 lib/Varien/SimpleXML 覆盖原文件就好了。

  • Export VirtualBox snapshots

    我觉得挺奇怪的 —— VirtualBox 怎么不弄个一键连同快照导出虚拟机的功能?这功能应该很有用。

    网上搜了一圈,也没人给个系统的指导。没办法,只好自己摸索着做。其实,导出快照没我想的那么复杂,也就是拷贝和修改一下配置文件。具体步骤是:

    1. 从源机拷出某个虚拟机的整个目录。
    2. 在目标机器上创建跟源虚拟机一样配置的新虚拟机。
    3. 把拷出的目录里所有文件放到新虚拟机所在的目录。用源虚拟机的硬盘文件覆盖新虚拟机的硬盘文件,同时有个 Name_Of_Vbox.vbox 的文件也被覆盖。.vbox 有快照文件们的树形结构信息及所在位置的信息。快件文件在 Snapshots 子目录下, .vbox 里存储的是相对位置,在新虚拟机里仍然使用。.vbox 是个 xml 格式的文件,不妨打开来看一下,里面还有一个 machine uuid,把它拷出来。
    4. 打开 VirtualBox.xml,它是 VirtualBox 的配置文件,在 Fedora 下它保存在 ~/.VirtualBox/ 目录下,新建的虚拟机的 machine uuid 和源虚拟机的 machine uuid 通常是不匹配的,那就用刚刚从 .vbox 里拷出来的 machine uuid 替换。

    这样源虚拟机连同快照文件就迁移到目标机器上了。这时尝试启动虚拟机或许会提示如虚拟网卡不存在之类的错误,一般是因为源机和目标机器环境不一致或所用 VirtualBox 版本不一致所引起的,问题不大,只要重新给虚拟机一张虚拟网卡就行了。

  • Solve Google Drive Sync installation 1603 error

    我不太用Windows,最近却玩得比较多,没办法呀,谁让 Google Drive Sync for Linux 还没问世。

    在安装 Google Drive Sync 时碰到 1603 错误,最后发现要先装 Microsoft Visual C++ 2008 SP1 Redistributable Package。还有人说一定要装 2008 版,我不信邪,先装了个 Microsoft Visual C++ 2010 SP1 Redistributable Package,果然还是出错。再装一个 2008,就 OK 了。

  • System restore is useless

    Windows 里装坏了一个软件,怕卸载不干净,在卸载后运行系统还原,结果说——无法还原!换一个还原点,还是无法还原!

    Unable to perform system restore
    Unable to perform system restore

    以后干脆关闭系统还原,依赖虚拟机的快照功能或许还可靠一些。

  • Manage gallery image with customised URL in Magento

    Magento 后台对产品图片的管理操作非常简单,直接在浏览器里从本地上传,然后指定哪个作大图(image)、哪个作小图(small image)、哪个作缩略图(thumbnail)。这种傻瓜式的操作有三大缺点:

    • 不适合大批量图片的管理;
    • 图片上传后图片的存放位置乱序,不方便远程文件管理。(abc.jpg 上传后被存放在 /media/catalog/product/a/b/abc.jpg。如果之前已经有同名文件,新上传的文件自动更名为abc_1.jpg, abc_2.jpg,以此类推。)
    • 搜索引擎会从图片的 URL 里获取图片的部分信息,杂乱的 URL 不利于图片 SEO。

    我认为最理想的图片管理模式是:在本地按产品分类分级维护一个图片库,用 FTP 上传到服务器,在 Magento 后台可以浏览这些文件(对 Magento 来说是本地文件),然后为某个产品选定它的大图、小图和缩略图。这样 Magento 里保存的图片位置信息就保持了自定义的产品分类信息。

    Magento 的自动缩放图功能很好用,但自动缩放图生成的文件 URL 又臭又长,肯定不利于 SEO,而且服务器硬盘上留下一大堆乱序规则生成的文件夹,实在难看(有种屋子没打扫的感觉)。鉴于一个优质的电子商务网站本应该对整站的图片大小有统一的规范,不妨在本地制作好小图和缩略图,不依赖 Magento 的自动缩放图功能。

    好多年前我就想做个 Magento module 来优化 Magento 的图片管理,但事务繁忙,也不知道什么时候能静下心写代码。与其让听众苦等我的 module,不如我介绍一下 Magento 数据库中 gallery 的结构,让大家懂得直接操作数据库去搭 product 和 local images 之间的桥。

    首先做两个准备工作。

    一是查好每个产品的 ID 备用。如果人可以 SKU 识别产品,那就准备一张 SKU – ID 的一一对应表;如果人可以 product name 识别产品,那就准备一张 product name – ID 的一一对应表。

    二是把每个产品的大图、小图和缩略图命名得有意义,比如是大图是 product-name-1.jpg, product-name-2.jpg, product-name-3.jpg,小图是 product-name-s.jpg,缩略图是 product-name-t.jpg(因为 small 和 thumbnail 不是产品的关键字,所以没必要拼写完整,用自己人能看明白的代号就可以)。FTP 上传图片至 /media/catalog/product/category-name/sub-category-name/SKU/,一个产品的图片归在一个文件夹下。

    现在开始正式操作数据库。操作涉及到 4 个产品属性(attribute)和 4 张表(table)。

    4 个产品属性:image, small_image, thumbnail, media_gallery.

    4 张表:magento_eav_attribute, magento_catalog_product_entity_media_gallery, magento_catalog_product_entity_media_gallery_value, magento_catalog_product_entity_varchar.

    第一步:在 magento_eav_attribute 中查出 4 个产品属性的 attribute_id。在我碰到的 Magento 早期版本中,4 个产品属性的 attribute_id 分别是:

    • image: 70
    • small_image: 71
    • thumbnail: 72
    • media_gallery: 73

    在最新的 1.7.0.0 中,4 个产品属性的 attribute_id 分别是:

    • image: 85
    • small_image: 86
    • thumbnail: 87
    • media_gallery: 88

    当然可以顺便看一下 product 的 entity_type_id,不出意外的话,这应该是 4。后面会用到。

    第二步:在 magento_catalog_product_entity_media_gallery 插入记录。一张图片就是一条记录,插入记录就是定义产品和图片之间一对多的关系。

    Insert record to magento_catalog_product_entity_media_gallery
    Insert record to magento_catalog_product_entity_media_gallery

    magento_catalog_product_entity_media_gallery 中各 column 的意义是:

    • value_id:记录 ID,可以留空让数据库自动生成。
    • attribute_id:media_gallery 的 attribute_id。
    • entity_id:产品 ID。
    • value:文件存放位置信息(略去 /media/catalog/product 部分)。
    Gallery records for one product
    Gallery records for one product

    做完这两步就可以在 Magento 后台 Manage Products 的 Images 那一页上看到属于这产品的图片。后面几步可以移至 Magento 后台完成。我继续介绍如何直接操作数据库,是让大家知道如何用数据库的导入功能去批量处理。

    第三步:在 magento_catalog_product_entity_media_gallery_value 插入记录。这等效于在 Magento 后台为每个图片在各个商店设定 Label, Sort Order, Exclude 值。

    如果只有一个商店,一条 magento_catalog_product_entity_media_gallery 记录就对应一条 magento_catalog_product_entity_media_gallery_value 记录。

    如果有多个商店,default store_id 就是 0,先按一条 magento_catalog_product_entity_media_gallery 记录对应一条 magento_catalog_product_entity_media_gallery_value 插入记录。假设另有两个商店,store_id 分别是 1 和 2,store_id 1 沿用 store_id 0 的 default 值,store_id 2 则使用一组不同的 label/position/disable 值。这样,不需要为 store_id 1 多插入一条记录,因为 Magento 的 Website/Storegroup/Storeview 的规则是没有额外记录就是使用 default value。只需要为 store_id 2 多插入一条记录,这条记录优先于 default value,但只为 store_id 2 而生效。

    magento_catalog_product_entity_media_gallery_value 中各 column 的意义是:

    • value_id:匹配 magento_catalog_product_entity_media_gallery 的记录 ID。
    • store_id:商店 ID。
    • label:图片说明。
    • position:图片排序。
    • disabled:0 就是不 Exclude,1 就是 Exclude。
    Insert record to magento_catalog_product_entity_media_gallery_value
    Insert record to magento_catalog_product_entity_media_gallery_value
    Disable (Exclude) small image and thumbnail
    Disable (Exclude) small image and thumbnail

    第四步:在 magento_catalog_product_entity_varchar 插入记录。这等效于在 Magento 后台为每个产品在各个商店设定哪个是默认大图(大图可以有多张,只有一张是默认的)、哪个是小图、哪个是缩略图。

    magento_catalog_product_entity_varchar 中各 column 的意义是:

    • value_id:记录 ID,可以留空让数据库自动生成。
    • entity_type_id:不出意外的话,应该填 4。
    • attribute_id:image/small_image/thumbnail 的 attribute_id。
    • store_id:商店 ID。
    • entity_id:产品 ID。
    • value:文件存放位置信息(略去 /media/catalog/product 部分)
    Insert record to magento_catalog_product_entity_varchar
    Insert record to magento_catalog_product_entity_varchar

    假设以前用 Magento 后台上传过产品图片,删除了,保存产品,这时,服务器硬盘上的图片不会随之删除,数据库里的 image/small_image/thumbnail 记录也不会随之删除(只是 value column 的值被 NULL 代替)。这也是我不喜欢用 Magento 后台来管理产品图片的一个原因。

    Duplicate record error
    Duplicate record error

    这些 NULL 值的记录会导致插入不成功,因为 magento_catalog_product_entity_vartype 有规定 entity_id, attribute_id, store_id 三值组的唯一性。不让插的话编辑原记录。

    Search by attribute_id and entity_id
    Search by attribute_id and entity_id
    Search result by attribute_id and entity_id
    Search result by attribute_id and entity_id

    或者,把原有的 image/small_image/thumbnail 记录全删了,再插。

    Search by attribute_id
    Search by attribute_id
    Search result by attribute_id
    Search result by attribute_id

    这四步做完后,Magento 前后台就显示了指定的图片。

    Magento GUI manage products images
    Magento GUI manage products images
    Magento store front product page
    Magento store front product page

    这时 Magento 的自动缩放图功能仍在生效,需要修改模板让 Magento 直接使用指定的大图、小图和缩略图,这里不再多述。

  • Add Google as a search provider in IE

    Microsoft IE made adding Google as a search provier extremely difficult. Google is removed from the search providers list – just because Google is too good to be a search provider?

    For anyone wants to search with Google in IE, add Google UK as a search provider by visiting this link http://www.iegallery.com/gb/addons/detail.aspx?id=13438.

  • Chinese interface in Android

    我不愿意用刷中文 ROM 的方法把手机的界面变为中文。

    我看到这里苹果店的手机都能在设置里调出中文界面,觉得 Android 手机更应该内置了全球语言包。大部分英国卖的 Android 手机看不到中文语言这个选项,是网络提供商把它隐藏起来了。基于这个推理,我 Google 了好久,终于发现在 Market 里搜索 Custom Locale 就能找到若干应用,随便选装一个就能把隐藏的中文调出来。

    随后,我又发现,Android OS 本身已100%国际化,如 Map, Market, Navigation 这些程序都能显示中文。但一些手机厂商自己开发的程序,如拨电话、发短信的程序并没有中文包,比如我的 Samsung Galaxy S2 就没有这样的语言包,所以这些程序在 zh_CN locale 下只能显示英文。

    HTC 在这方面就有独到的优势,毕竟是中国人的公司,它开发的程序一般都照顾到了中文。我买过一个 HTC Wildfire 手机,在 zh_CN locale 时完美汉化,根本不用刷 ROM。

  • Windows XP cannot acquire a valid IP address from DHCP server

    最近碰到一台 Windows XP 无法获得 DHCP 服务器分配的 IP 地址,但若指定 IP 地址则能上网 。辗转好久才找到解决办法:

    首先检查 Services 里 DHCP Client 是否启动;

    其次试着运行 netsh winsock reset /catalog ——我也不清楚这干嘛用的。

    最后重启一下 Windows XP 就能获得 DHCP 服务器分配的地址。

  • Best practices of merging multiple Gmail accounts

    工作需要对外使用多个邮箱,但阅读邮件时又不希望登录多个邮箱,而是希望在单一邮箱里查看和回复邮件。现以在邮箱A查看和回复来自邮箱B的邮件为例讲解设置。

    首先,登录邮箱B,在 Mail settings >> Filters 里 Create a new filter,在 “Doesn’t have” 一栏里填入长串不可能用到的乱字符,如 “J6dPFVFwnCsSBezVfSqRY5JTLNL567Ef”,然后点 “Next step”,选中 “Never send it to Spam“,最后点 “Create Filter”。这避免一些重要邮件被误判为 Spam,留在了邮箱B,不登录就查看不到,会误事。接着,还是在  Mail settings >> Forwarding and POP/IMAP 里 Add a forwarding address,填入邮箱A,follow instructions,不详述。

    然后,登录邮箱A,在 Mail settings >> Accounts >> Send mail as 里 Add another email address you own,填入 Name:whatever 和 Email address:邮箱B,然后点 “Next step”,选中 “Send through 邮箱B SMTP servers”,按 Gmail SMTP 配置去填写 SMTP Server, Username 和 Password,最后点 “Add Account“。

    大功告成。多罗嗦一句,不用邮箱A去POP邮箱B的方法来合并邮件是因为 Gmail 最多允许 POP 5个 accounts,无法合并6个以上邮箱;而且 POP 收取邮件没有从邮箱A转发过来即时。