Free parking in London

Parking restriction
Parking restriction

多年来,我想当然地认为伦敦一区是不会有 unrestricted area 可供全天免费停车的。

但是网上说有,而且很多。年初认识到这个停车地图,因为开车去伦敦市区的机会不多,直到明天才有机会检验一下。

如果情况属实,特别鄙视布莱顿市政府,停车搞得比伦敦还难,太失败了。

Nice delivery of copier paper

Copier paper delivered
Copier paper delivered

我今天收到 ebuyer 两个箱子,是 UKMail 和 Yodel 送的各一刀 A4 复印纸。订单分别是本月 7 号和 13 号(周日)下的,选择的服务分别是 within 5 working days 和 next working day。

每个箱子 4kg 重,包装一如既往地好,偌大个箱子用了很多 air bags 填满,把复印纸像易碎品一样保护妥当。总之,产品和服务我都很满意。

每刀纸售价 £1.95 + VAT,free delivery。我是信用卡付的款,再优惠的信用卡费率,银行扣商家不会少于 £0.10 吧;发货是机器人发货,折旧电费总难免,算 £0.10;包装纸箱和 air bags,就算大批量采购,也要 £0.10。最大的成本是送货费,也是我最想不通的地方。目前 RoyalMail 寄封 1st class 平信都要贴 £0.62 的邮票,挂号信要 £1.72,更别说包裹了。 当然你可以说 RoyalMail “国营”的,没有竞争力,价格没有参考价值。那么 UKMail 5kg 以下包裹的公开最低报价是 £4.24 + VAT(自送 depot),超级电商跟 UKMail 的签约价我不敢猜测,但送货员规模效应十分有限,按每小时送 10 件包裹计算,每个包裹的成本也要 £2.00。不含货物成本,各项运营费用相加已达 £2.30,还是最保守的估计。

ebuyer 赚钱点在哪里?好像也不像赔本赚吆呼——通常博眼球的活动不会持久。Canon 厂家补贴电商赚吆呼?也不像。

Disposable printers eco concern

我支持环保,但是打印机市场的现实情况让我觉得很无奈。

我发现 £200 以下的低端激光打印机,几乎无一例外,换墨盒不如换新机。比如说,彩打 Lexmark C544dn,时有促销,可以以 £150 的价格拿下,带 2,500 页的黑墨和 2,000 页的彩墨;而如果单买墨盒,即使买超高容量的 6,000 页黑墨和 4,000 页彩墨套装,价格不低于 £400,计算单张打印成本,还不如换一台新机。我就用着一台 Lexmark C544dn,我准备在用完墨粉后,直接扔掉打印机,再买一台新的。本可重复使用的打印机用起来象个一次性打印机。不环保?是厂家不合理的定价策略逼的。要厂家撤销这种定价策略,我估计只有等 WEEE 有关部门发现废弃过多的半新打印机,才能搞个什么政策出来,逼厂家修改这种定价,不过这个又有干涉市场之嫌,该怎么做,留给政府去考虑吧。目前看来厂家的策略似乎是成功的,要不怎么买不到便宜的墨盒?

准确地说,要买比打印机便宜的墨盒,不是没有,得买高端的。基本是越贵的打印机,越低的单页成本。但是,我打印量不大,追求高端不合适啊。

Dell 3335dn Multi-Function 38ppm Mono Laser Printer
Dell 3335dn Multi-Function 38ppm Mono Laser Printer

凡事都有例外。今天我无意发现一台高端的打印扫描传真一体机 Dell 3335dn 竟然在 ebuyer 只售 £199.99 + VAT,都有点怀疑 ebuyer 是不是标错价格了。考虑到 Dell 还有 £100 cash back 促销,这款机器实际的拥有成本只有 £139.99 inc VAT。横向对比其他大网站售价都高达 £400 – £500 多,我觉得价格上它算是高端中的入门级。

我判断是否高端的标准:每分钟打印页数是否够快、单张打印成本是否够低、换墨盒的成本是否低于换新机。Dell 3335dn 的指标分别是 38ppm、1ppp、£140 的墨盒可打印 14,000 张(新机配的墨盒可打印8,000张,所以换墨盒比换新机便宜)。

本无采购计划,但我就买下了 Dell 3335dn,等之前的一台黑白打印机(不是指彩打 Lexmark C544dn)的墨盒耗尽就可以换新机了。以后也不用频繁扔打印机了,在成本和环保能两全其美的时候,我还是非常愿意支持环保的。

目前还缺一台 A3 激光彩打,等待促销够劲、性能高端、符合我的环保指标的机型出场。

Weird procurement

我觉得我的采购行为很奇怪。

A ream of Canon 80gsm copier paper
A ream of Canon 80gsm copier paper

比如,我本来想买一箱(五刀)A4 复印纸的。但发现有个网站一刀名牌 80gsm A4 复印纸,只卖 £1.95 plus VAT,竟然还是 free delivery。我就想“那它还有多少钱挣?”当然我是不担心它会亏本,我就是想看看它为单独一刀的一个订单发一个件是什么个情况,于是,我下五个单,每次一刀。

再比如,我本来想买一个 VDSL 路由器的。但在比较价格的时候,发现心仪牌子的 cable/3G dual WAN 路由器(就是没有 VDSL 功能)DrayTek Vigor 2910n,标示全新,£1.99 起拍,没人拍,真是怪事。于是我上,最后 £2.75 竞得。而真正需要的 VDSL 路由器还没着落。

Won DrayTek 2910
Won DrayTek 2910

I am paving my driveway

之前找的波兰工人干的活实在让我忍无可忍,过完圣诞节我就没让他继续 driveway 的活,留下一个烂尾工程一直没找人接着干。

image

image

自我反思一下,其实我早就不满意这个工人,我之所以忍了他那么长时间,其实是因为我懒:懒于换人、懒于监工,总觉得他干活总比我干活好一些吧。

今天天气真好。我突然想,为什么不自己动手呢?虽然早有人警告说,做 driveway 要找 professionals,否则 driveway does not last。但是,专家者,砖家也,在 driveway 这件事上,我就直接无视了。Driveway 再不济,也不至于让上面停的车陷泥里去了吧。

所以,我决定自己动手完成这活。今天花了两个小时,铺了大约 50 块 paving blocks,1 平米,自我感觉跟波兰工人成果差不多。就这个效率,两个月也能完工。

Hands on GeoIP for Nginx on Fedora and CentOS

最近研究了一下如何根据用户的 IP 获得他的地理位置(我只关心 country 级,不关心 city 级),区别性地在 Ngnix 层面做一些限制性访问。这里用到 GeoIP 软件包和 MaxMind 的数据库。

在 Fedora 20 下,Nginx (目前 1.4.7) 依赖于 GeoIP。等于说,装好 Nginx,ngx_http_geoip_module 自然就启用了,只要在两个配置文件略作修改。

Fedora nginx -V output
Fedora nginx -V output

1. 在/etc/nginx/nginx.conf 里添加


http {

...

geoip_country /usr/share/GeoIP/GeoIP.dat;

...

}

2. 在 /etc/nginx/fastcgi_params 里添加


fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
 fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;

还有其他参数可用,请自行查手册。重启 Nginx 就可以使用 GeoIP 的信息了。

在 CentOS 6.5 下,事情要复杂一些。网上说 CentOS 下的 Nginx 同样依赖于 GeoIP,可在我这里事实并非如此。同样是最新的 1.4.7 版,Nginx for CentOS 是不带 ngx_http_geoip_module 编译的。即使我用 yum install GeoIP 安装了 GeoIP 软件包,但 Nginx 不从源码编译就不能启用 geoip 模块。

CentOS nginx -V output
CentOS nginx -V output

着重提一下,我说的 CentOS 6.5 是 VPS 版,Nginx 和 GeoIP 无依赖是不是这个版本特有的?不得而知。我不想为之专门装一次 CentOS 来探究。我也不想从源码编译 Nginx,因为我太喜欢 yum,就为一个 ngx_http_geoip_module 搞砸了其他功能就不值得了。

退而求其次,CentOS 下不妨用 php 调用 GeoIP,只是感觉同样功能用 php 实现会消耗更多资源。另外,Nginx 能进行全面的限制,而 php 无法利用 GeoIP 信息限制对静态文件的访问。但是,Nginx 的全面限制也只能阻止低级用户,不可能阻止稍有点 IT 知识、一心要绕开地理位置限制来访问的用户,所以 php 对动态文件的限制其实也起到了相同的效果。

CentOS 下,安装 GeoIP for php,首先要装有 GeoIP,前面已经说了,要单独装:


yum install GeoIP

然后,安装  php-pecl-geoip:


yum install php-pecl-geoip

哈哈,都是我喜欢的yum。然后重启一下 php-fpm,即可在 php 下获得 geoip 信息。函数有很多,geoip_country_code_by_name()、geoip_country_name_by_name() 等等,请自行查手册。

顺便提一下,CentOS 6.5 VPS 版安装 GeoIP 后,带来的 country 数据库(GeoIP.dat, 6 Sep, 2011)有 1,183,408 字节,而 Fedora 20 的 GeoIP country(GeoLiteCountry.dat, 18 Jun, 2013) 数据库只有 581,110 字节,从 MaxMind 网站上下载最新的 GeoLite Country 数据库(GeoIP.dat, 每月第一个周二更新)也只有668,134 字节。考虑到 MaxMind 的数据库是分免费和收费的,那么,CentOS GeoIP.dat 这么大,是不是更接近于收费版?我不知道收费版是啥样的,因此无从考证。

Newly installed BT Infinity keeps dropping continued

BT new Home Hub 5 replacement
BT new Home Hub 5 replacement

前文说到新装的 BT Infinity VDSL 经常掉线,我拿着 log 向 BT 反映,他们二话不说,给我寄来了第二个路由器。这里还是数据说话,否则 BT 总怀疑用户 IT 能力,肯定要磨叽半天才肯换一个路由器。

但是,很失望,换了个路由器,仍然掉线频繁。

我想,该不是 FreePBX 在使用带来的一些通讯流量造成的吧?我是基于这么个假设:BT Infinity 不会如此不稳定,否则怎么推广啊?应该是我使用的某种应用造成的不稳定。大部分用户不会组建 FreePBX,这个问题不会被触发。

于是我把 FreePBX 服务器搬回家,接在了 ADSL 上。真遗憾,我是为 FreePBX 升级到 BT Infinity,结果还得搬回家继续用 ADSL。不过,两害取其轻,FreePBX 在我家的 ADSL 上并没有造成频繁掉线。

现在再看没有了 FreePBX 的 BT Infinity,确实稳定多了,偶有掉线(一天一次)。这初步验证了上一个假设。

然后,我再一次假设,FreePBX 造成 BT Infinity 频繁掉线,不会是 VDSL 方面的问题,而是 BT Home Hub 5 似乎跟 FreePBX 不对口。

看来得买一个商业级的 VDSL 路由器了。我相中 DrayTek Vigor 2860n Plus,犹豫着要不要买,而且心里有点不爽——我不喜欢基于一堆假设去采购。

When to use Magento layered navigation?

Rcah module for Magento
Rcah module for Magento

Although I released a Magento module “Root Category as Homepage“, which enables replacing the default CMS page with the root category as homepage, thus the users can start layered navigation from the very top level of category, the usage of this module should be limited, for the sake of usability.

In short, use Magento layered navigation only to narrow down the choice of products. Do not use it for the purpose of grouping products by some filter attributes. There are many other ways to group products together.

I will explain in details when I have some more time.

Fixed NextGenGallery 0 images were uploaded error

Nggallery 0 images were uploaded
Nggallery 0 images were uploaded

不知从何版本起,NextGenGallery 插件在我的 WordPress 上就不工作了,主要症状是:

  • 后台无法在 Gallery 里上传图片,显示 “Upload complete. 0 images were uploaded.”(WordPress 自身的 Media 上传正常)。
  • 后台无法批量导入图片,服务器的文件夹根本就不显示。
  • 已有的 Gallery 在前台只能显示第一张图,点下一张图就是 404 错误。

这个问题困扰了我约有半年。期间发现把 Permalinks 改为 Default 模式能让 NextGenGallery 恢复正常,但我不可能为了 NextGenGallery 修改 Permalinks 啊,只好任由这个问题存在。所幸迄今为止只有 5 galleries,而且都不怎么重要,所以这个问题不突出。

上个周末突然犟了一下,我觉得不该卡在这个问题无从下手啊,调用 google N 多次,终于在一个角落里给我找到一点端倪,再做了 N 多次试验,得出的结论是此问题在 PHP installed as an Apache module 时不存在,我恰用的是 Nginx,罪魁祸首是 fastcgi_param 没弄好。

出现此类问题是小概率事件,即使是一个不完善的 fastcgi_param 配置,我的 Nginx 也让大部分 PHP 跑了多年没出其他问题。NextGenGallery 也有一定责任,使用了一种不推荐的环境变量,在 PHP installed as an Apache module 下不会激发这个 bug,但在 Ngnix + 不完善的 fastcgi_param 会。而我用的不完善的 fastcgi_param,我相信很多人都在用,所以有一定的普遍性。

言归正传,怎么改?

有人说把 NextGenGallery 的 class.router.php 的 function get_request_uri 的 if (isset($_SERVER[‘PATH_INFO’])) 改为 if (empty($_SERVER[‘PATH_INFO’])),确实能奏效,但我认为不理想。因为:

  • NextGenGallery 虽有错,但大错不在它,而在 Nginx 没配好。
  • 这个问题被反应到 NextGenGallery 开发者很久了,期间 NextGenGallery 升级了无数次,也没见他修正此 bug,可能他认为此 bug 非 bug。

我认为解决问题的根本办法是在 fastcgi_param 文件里,把通常人用的

fastcgi_param  PATH_INFO          $fastcgi_path_info;

改为

fastcgi_param  PATH_INFO          $fastcgi_path_info if_not_empty;