Blog

  • 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;
    
  • Newly installed BT Infinity keeps dropping

    Is BT Infinity stable
    Is BT Infinity stable

    BT Infinity 装了四天。前两天每天都会有一两次断线再续上,这离我心目中一个月都不断一次的设想有很大距离,但说实话,这并不影响使用。

    昨天下午开始,我注意到 BT Infinity 频繁断线,一个小时内会断好几次,这下我受不了了。我写了一个检测脚本,从凌晨2点多开始运行,收集到以下数据:

    ip up_time down_time
    86.163.4.231 2014-03-28 02:26:27 2014-03-28 02:31:34
    86.155.231.26 2014-03-28 02:34:02 2014-03-28 03:02:35
    86.163.218.228 2014-03-28 03:05:01 2014-03-28 03:34:01
    86.144.50.27 2014-03-28 03:37:01 2014-03-28 04:03:19
    86.155.228.111 2014-03-28 04:06:01 2014-03-28 04:34:01
    86.163.218.154 2014-03-28 04:37:01 2014-03-28 05:04:03
    86.164.192.9 2014-03-28 05:07:01 2014-03-28 05:36:01
    31.52.209.24 2014-03-28 05:38:01 2014-03-28 06:05:35
    86.144.50.126 2014-03-28 06:08:01 2014-03-28 06:36:02
    86.164.194.59 2014-03-28 06:39:01 2014-03-28 07:06:03
    86.164.194.91 2014-03-28 07:09:01 2014-03-28 07:38:01
    86.144.51.127 2014-03-28 07:40:01 2014-03-28 08:09:01
    86.155.228.111 2014-03-28 08:10:02 2014-03-28 08:31:02
    86.155.230.112 2014-03-28 08:41:01 2014-03-28 09:08:05
    86.149.254.255 2014-03-28 09:11:01 NULL

    我注意到从今天早上 9:11 开始,一直到现在下午 3:55,没有掉过线。我猜是 BT 在大部分人的非工作时间远程更新 Home Hub 5 的韧件,但我也并不喜欢 BT 来操控已经属于我的路由器,更不喜欢 BT 决定更新韧件的时间,是时候考虑买一个正宗的路由器,彻底堵住 BT 的后门。如果这次频繁掉线不是 BT 更新韧件引起的,那更糟糕,BT Infinity 竟然如此不稳定吗?我更换宽带,等了一个多月,等来的是如此结果?我暂不想下这个结论。不管怎样,我已经向 BT 反映了频繁掉线的问题,正等待它的反馈。

  • Publish on blog or social network?

    International social media icons
    International social media icons

    博客出现在 web 2.0 时代,社交网站算 web 后2.0 时代吧(web 3.0 概念不清,我不好拿来用)。

    博客和社交网站的界限模糊,有很多交集,比如博客发展到微博就归入了社交网站。但我这里说的博客,指的是用自主建站的方式,比如用 WordPress  搭建的博客,其他非博客类的 CMS,也可以归入博客范畴;而社交网站,指的是依托第三方的社交平台,通过开设帐号,发布消息。

    社交网站诞生多年,我的使用态度一直不积极。我相对较早使用 QQ ,但 QQ 空间至今没有开通;我也没有新浪微博、腾讯微博,更不要说什么人人网之类的;微信也是开通不足半年,还是被没有微信就活不下去的朋友逼着开通的;我也没有 Linkedin,因为它排不上前三;Facebook, Twitter 虽不缺账号,但也懒于维护;唯一用得比较多的 G+,那也是因为我是 Google 的粉丝,Google 想要在社交网站有所建树,我友情支持。

    我通常对新生事物都是积极尝新的,为什么不喜欢社交网站?我也不懂自己,勉强找了两点理由:

    1. 大部分人在社交网站发的贴没有深度,无非是“今天的大餐好好吃”、“我在公车上看到有人打架”,这些内容当时有人围观,过了一周、一月或一年,没人会关心你那时吃了什么、看了什么,连你自己也记不起来。
    2. 转贴太方便,个个都是新闻发言人,很多都是以讹传讹,即使是真实的也没有出处可循。转来转去,互联网信息急剧膨胀,原创比例急剧萎缩。

    但从商业角度看,不占领社交网站,就会失去和潜在用户联系的机会。怎么合理安排时间和精力维护这么多的社交网站?我草拟了一套方案:

    • 博客为主,社交网站为辅。就是说一定要有自己的博客,然后在时间和精力有盈余时,兼顾尽可能多的社交网站。
    • 内容只发布在博客上,社交网站只转其标题和链接。在内容有错别字或需要更新时,只要更新博客一处即可。虽然有很多工具可以自动同步多个社交网站的内容发布,但是我还没发现一款工具能做同步更新。如果要手动更新各个社交网站,工作量是很大的。而且是重复劳动,我最痛恨。把原创内容直接发布在社交网站上,从 SEO 角度看,是在给他人做嫁衣。
    • 博客要做一些社交网站做不到的事,比如说文章的分类整理、参数查询等等,方便用户记住你的博客,而不仅是你的社交网站的账号。当然你也可以放些广告,赚取额外收益,而在社交网站上这部分收益就不会归你了。
    • 博客要装有分享插件。服务端的分享插件在你发布新贴时,同步标题和链接到你的多个社交网站的账号;客户端的分享插件让用户在浏览帖子时,分享到他常用的社交网站的账号。WordPress 的社交插件有不少,但面面俱到、用起来得心应手的,我还没找到。你若有,别忘了分享给我。
    Chinese social media icons
    Chinese social media icons
  • Taobao cohabitation

    很多人都离不开淘宝了,我也一样。但很多从淘宝买来的东西都不能让我满意,当然这不是淘宝的错,从其他地方买的很多东西也不让我满意。但不可否认的是,淘宝是个鱼龙混杂的地方,而且这淌水非常浑。

    我尝试着从近十家淘宝店里买 LED 灯泡,没有一家让我满意。LED 灯泡都号称有十年寿命,可我遇不上高质量的厂家,买到的 220V 的GU10、B22、E14、E27 灯泡基本还是一年一换,12V的 MR16 和 220V 的 R7 或玉米灯则要好得多。我的结论是高电压小体积 LED 灯泡里的恒流驱动电源散热不好,也算质量不过关,都是灯头尚好的情况下变压器烧坏了。但是,在英国本地买的同型灯泡,贵是贵几倍,几年下来,没换过一个。

    我很感慨,同样 made in China 的产品,我在淘宝就没遇上高质量的供货商,而英国的进口商却能找到。

    家里的一个混水阀也是在淘宝买的,挑的是价位中等的那种,没用多久就出现少量漏水。因为不影响使用,就拖着没换。最近家里另一个水龙头和下水器又坏了(倒不是在淘宝买的),我于是决定一次把这些全换了。

    Highly priced tap
    Highly priced tap

    再给淘宝一个机会,不过这次我尝试一种不同的策略:挑贵的买。我挑了比之前贵1-2倍的产品,我期望它们如俗话说的:一分钱一分货。说实话,从照片、描述上看,我根本看不出它们跟之前的有什么不同,我也希望某些商家不要吃准我这样消费者心理,有意卖高价做一票拉到。

  • BT Infinity up and running

    BT Home Hub 5
    BT Home Hub 5

    几天前 BT Home Hub 5 寄到了。路由器很漂亮,反应很快,可惜功能太单一,连 Mac 地址绑定、远程管理等功能都没有。等有空看看能否刷零售版的韧件,把隐藏的功能都激活。

    今天 BT 工程师如约前来安装新的电话线和 BT Infinity,大约花了十分钟,就装好了。从下订单到安装让我等了一个多月,是 BT Infinity 太火爆,还是 BT 工作效率太低,不得而知。但我仍然很激动,因为终于有稳定的网络可以让 IPPBX 如鱼得水

    BT Infinity 稳定吗?过段时间我再回答。目前我只是基于对 BT 的信任做的假设。

    BT Infinity speed test
    BT Infinity speed test

    下行速度高于 30 Mbps,上行速度高于 17 Mbps。我对下行速度有点小失望,离标称的 76 Mbps 还很远。我甚至怀疑 BT 是不是搞错了,给我装了一个 BT Infinity 1(标称 38 Mbps),而我订的是 BT Infinity 2。仔细看了看,BT Infinity 1 标称上行速度只有 9.5 Mbps,那无论如何都不会是 BT Infinity 1 了。

    BT Infinity 1 or 2
    BT Infinity 1 or 2

    17 Mbps 上行还是挺给力,强力对比原来的 ADSL 只有 1 Mbps 左右的上行。这下远程办公感觉就好了。

    访问一般的网站,用 BT Infinity 和 ADSL 感觉差不多。上 YouTube 感觉了一下,如我所愿,1080p 的视频不用缓存就能播放;上优酷,也不错,超清视频也不卡;上土豆,仍然很卡,看来它不够国际化。

  • Gigabyte GM-M7800S

    在浏览创意礼品时发现一款技嘉和施华洛世奇的联手之作: Gigabyte GM-M7800S,镶了水晶的奢侈品鼠标。

    我突然很想拥有一件这样的鼠标。或者更多件,至少给家人人手一件,己所欲,施于人。我是一个追求性价比的人,通常对奢侈品不热衷,为什么对这款鼠标情有独钟?我觉得很奇怪,仔细想了想,给自己列了这几点理由。

    1. 手头的几件鼠标用起来都不顺手。
    2. 鼠标本身是一分钱一分货。我不晓得技嘉花在鼠标硬件上的成本是多少,但要配得上施华洛世奇的水晶,不至于太抠吧?否则这个产品设计就太失败了。
    3. 质量上乘的鼠标如同实木家俬,是百年品质,一次投资。
    4. 经典款说不定还能升值。
    5. 有很强的实用性,跟普通奢侈品不能完全类同。

    列了这么多,可能在别人看来纯属扯淡,我还是一个被奢侈品勾引的落入俗套者。不管这么多,我就想买它,可是,找不到哪里有卖?!

  • Change PHP directives in Magento

    Today a Magento store owner asked me why he could not create a new attribute set based on an existing one. I took a look into his store and found out the existing attribute set has many custom attributes, which led to new attribute set creation would take more than 30 seconds. But 30 seconds is the default PHP max execution time, which is set in php.ini and has not been optimised for Magento backend operation.

    My immediate reaction was changing the default value of max_execution_time to 120. I added a line in /etc/php-fpm.d/www.conf, where is my preferential place to set server wide PHP directives rather than /etc/php.ini.

    
    php_admin_value[max_execution_time] = 120
    
    

    After a while, I had another thought. I do not like to extend PHP max execution time for most of other websites on the same server. Even for the Magento store, longer execution time is only needed for the backend operations. So how can I specify different PHP directives for different websites? Particularly, how can I specify longer execution time or larger memory limit for Magento admin users?

    My first idea was creating separate php-fpm (Yes, I am using php-fpm.) profiles for this purpose. However, I rejected this idea after 2 seconds, because:

    1. I do not like to create more PHP daemons into the valuable server memory.
    2. If Magento frontend and backend are on the same domain, I have no way to assign a corresponding daemon.

    So, can I implement changing run-time PHP directives using a Magento module? Of course. I had a Magento module called Msdk (Magento SDK). I just need to add this feature to Msdk.

    Firstly, I need to find a proper event to catch. The event should be dispatched only once per request, and earliest possible when it can distinguish frontend or adminhtml route. The earliest event is “controller_front_init_before” except some database events, which are not recommend to catch anyway. But “controller_front_init_before” can not distinguish frontend or adminhtml route, i.e. it can only be put into global section in config.xml. Following the event timeline, I find “frontend or adminhtml route” is the best event to catch.

    Secondly, I put one “controller_front_init_before” event catching into frontend section and another into adminhtml section in config.xml of Msdk module.

    Thirdly, write two observers in a Helper or a Model to apply PHP directives.

    Lastly, modify system.xml to allow users to set PHP directives in Magento System Configuration.

    It sounds complicated but actually not. I finished it in a couple of hours.

    BTW, Msdk is one of my free modules. But I am not going to launch it now with only one new feature. Watch the space for updated news.

  • Cure fail2ban on FreePBX

    不知从什么时候起,FreePBX 上的 fail2ban 不能启动了。amportal restart 时,其他项都是绿色的 OK,执行到最后是 fail2ban,两行:

    Stopping fail2ban [Failed]
    Starting fail2ban [Failed]

    两个红色的 Failed 触目惊心。

    看了看 /var/log/fail2ban.log,一头雾水。再说它不更新已经很久了,估计不能启动以后就没有更新。研究它的最后几行也不知对解决问题有没有帮助,总之我缺乏细看的耐心。问 Google 吧!有人说,

    yum remove fail2ban
    yum install fail2ban
    

    就能重新工作了,就这么简单。一试,果然!

    问题虽然解决,但我对 FreePBX 软件质量的印象分有所降低——“不明原因、重装解决问题”似乎是 Windows 的特症,怎么 CentOS 下的 FreePBX 也染上了?!