Author: 芳草苑主

  • 黄飞鸿92从何而来

    Internet 会以讹传讹。

    我最近关心了一下李连杰,发现很多处提到一部《黄飞鸿92之龙行天下》,但细究之下,发现这个名字有点莫名其妙:故事情节跟黄飞鸿无关,李连杰只在1989年拍过《龙行天下》。

    黄飞鸿92之龙行天下,不知是谁首先造出来的。

    另外,我觉得大家对电影黄飞鸿系列的排法也比较乱,众说纷纭,我理了半天才理出头绪。我猜想,刚开始拍黄飞鸿第一部时,制作方可能没想到要拍这么多部续集,所以落下冠名比较混乱的毛病。我认为应该以徐克导演为线索定出:

    • 黄飞鸿1:壮志凌云 (1991)
    • 黄飞鸿2:男儿当自强 (1992)
    • 黄飞鸿3:狮王争霸 (1993)
    • 黄飞鸿4:王者之风 (1993)
    • 黄飞鸿5:龙城歼霸 (1994)
    • 黄飞鸿6:西域雄狮 (1997)

    另有一部王晶导演的《黄飞鸿:铁鸡斗蜈蚣》不应归于以上系列之中 (有人称之为黄飞鸿7)。它虽是同为李连杰主演,但完成于1993年,排为黄飞鸿7肯定不合适。既然不同导演就不同风格,就没必要归到另一系列中了。

    《黄飞鸿4:王者之风》和《黄飞鸿5:龙城歼霸》不是李连杰出演黄飞鸿,但我还是坚持以导演为线索定系列。

  • My worry about Linksys wireless security

    前文提到 Linksys IP Camera 只能连入 Linksys wireless router,一开始就不喜欢厂家设置人为技术障碍的做法。细想之下,更觉得 Linksys wireless 安全机制堪忧。

    因为 Linksys WVC210 wireless IP camera 在设置无线联网时,只问一个 SSID,只要是 Linksys wireless router,不需密码就自动联入?如果是别人家的 Linksys wireless router 怎么办?虽然我凭着一个 Linksys WVC210 wireless IP camera 也控制不了别人家的网络设备,但如果我能对 Linksys WVC210 wireless IP camera 进行编程,是不是就相当于在别人家放置了颗隐形炸弹?Linksys wireless 或许有它独到之处,或许能隔离自动联网的设备,但我总觉得 wireless device isolation 不如直接用 password 来得更安全(至少心理上更舒服)。

  • Linksys WVC210 wireless IP camera review

    最近购入 Linksys WVC210 wireless IP camera,用了几个小时后,来抒发一下感想。

    Linksys WVC210 IP camera
    Linksys WVC210 IP camera

    首先来谈谈对家用 IP camera 这类产品的看法。人的欲望是层出不穷:没有电脑的时候想要台电脑,有了电脑想要网络,有了电脑和网络却想不坐在电脑前就能远程互动,于是就有了 IP camera 的市场。所以做产品不一定要做全能的(比如带摄像头的电脑能执行 IP camera 的功能),但一定要做在合适的时间和场合提供合适的功能的产品。

    IP camera 看似卖方市场,Linksys 产品主攻边缘需求,这大概是它成功之道吧。同等条件下,我没得选择,只能买个 Linksys WVC210 wireless IP camera。说实话我根本就不喜欢 Linksys 的产品,用过的 Linksys 的产品虽然不多,但它们都坏了,而且都不到我主动淘汰它们的时限它们就“自动”退出了。我对 IT 产品比较追新,通常淘汰下来的产品都尚能使用,唯独 Linksys,唉。我没接触过标 Cisco 牌的产品,在我印象中,Cisco 标在工业级产品,而 Linksys 标在民用级产品。在售 WVC210 wireless IP camera 的网上大多标称 Cisco WVC210 wireless IP camera,但我拿到一看,明明 Linksys 才是它的牌子,我对它没有太多的期待,只希望它能经用一些。

    几小时试用,发现 Linksys WVC210 wireless IP camera 几点让我喜欢的地方。

    1. 内置的麦克风对噪音的控制极好,不用近距离对着麦克风讲话,远程的听众也有亲临现场的感觉。
    2. 内置的 webserver 响应速度快,不像 WD Mybookworld 老半天出不来一个页面。
    3. 视频的质量也不错。
    4. 打开 IE 就能用,除了自动安装一个 ActiveX 控件,不需安装任何软件。

    然而也有几个不讨人喜欢的地方。

    1. Wireless 只能接入 Linksys 的路由器(或者我没想到方法破解?)。如果厂家削弱产品的功能是从生产成本考虑情有可原,但如想以限制用户不能使用第三方产品,或者拼命买本公司产品就大错特错。如果 Linksys WVC210 wireless IP camera 能零设置接入 Linksys 路由器,但需要一些人工设置才能接入其他路由器,那么我就没有受劫持的感觉,以后如果换路由还可以优先考虑 Linksys。这类的反面例子太多,比如,Hotmail 不允许 forward 至第三方邮箱,那我干脆不用 hotmail;iPod 的车载 FM 发射端不兼容 iPhone,那我只能退了 FM 发射端,iPod 和 iPhone 一个都不用。
    2. Firefox 下不支持语音,Linksys 也没发布 for linux 的能支持语音监控端软件。
    3. 有个 Windows 下的监控软件,安装后,竟然提示 missing or corrupted resource file,没法用。我估计跟 ActiveX 的权限有关。其实这个软件没什么用,用IE监控就可以了,但我一开始不知道。
    4. Linksys / Cisco 的支持网站超级难用,死命要我注册,注册了又找不到帮助,最后还是 Google 帮了我。
  • Elements of same name in Zend_Form

    It is a rigid rule that Zend_Form can not have elements of same names. If I add a second element with the same name, the first one will be overwritten.

    When I started to use Zend_Form, I thought this rule makes life difficult. For example, if the form have “Next” and “Previous” buttons, I must give them different names. How can I tell which button is clicked? I must go through all names. I thought if these buttons could have same name but different value, it was easier to tell which button was clicked.

    It was before long I started to enjoy this rigid rule. Take the above example for example, it is NOT a good practice to judge which button was clicked by its value. Because for an internationalised program, the value may change and that is out of the programmers’ control.

    What if I want to add 5 text fields for people to fill in information like team members’ name? Two solutions. The first one looks stupid but I did not come across the second one at first.

    Solution 1:

    class MyNamespace_MyText extends Zend_Form_Element_Text {
    	protected $_name = "text";
    
    	public function init() {
    		static $sequence = 0;
    		$this->id = $this->_name . '_' . $sequence;
    		$this->_label = "Label " . ($sequence + 1);
    		$this->_name = $this->_name . '[' . $sequence . ']';
    		$sequence ++;
    	}
    }
    

    Solution 2:

    for ($sequence = 0; $sequence < 5; ++$sequence) {
    	$element = Mage::getModel('moduleName/modelName', "$sequence")
    				->setBelongsTo('text'); //my form is inside Magento
    }
    
  • Limitation of Mage::getModel method

    Magento getModel can not initialise an instance whose class requires more than 1 argument.

    I assume Magento native classes can explode options from the first argument to satisfy getModel. However, if I want to use 3rd party class like Zend_Form_Element inside Magento, there is no ways to use getModel to achieve the same result as

    $element = new Zend_Form_Text('name', $options);
    

    because

    $element = Mage::getModel('moduleName/modelName', 'name');
    

    takes 1 argument which is ‘name’ only. No way to pass $options on.

  • Drupal on php 5.3.0

    今天想安装 drupal,装了N遍终于成功。一开始想装6.14版,安装过程开始时,我按提示把 sites/default 目录设置可写,把 default.settings.php 改名为 settings.php(提示不准确!),同时设置可写,结果在数据库安装页面反复过不去。

    我联想到 Magento,猜想可能是因为 drupal 6.14 与 php 5.3.0 不兼容。

    那再试试 drupal 5.20 吧。数据库安装页面倒过去了,安装能结束,但抛出一大屏错误。试着进入后台,每个页面都抛出错误,有些功能执行不了,比如修改口令。这样怎么行?继续研究。

    我又看到 drupal 6.14 release notes,说 drupal 从 6.14 起 compatible with php 5.3.0 out of box。啊?说得这么斩钉截铁,那我重新再试。

    终于发现有人提到 drupal 6.14,sites/default 目录下不可没有 default.settings.php,也不可没有 settings.php。压缩包里只有 default.settings.php,所以提示说把它改名 settings.php 是误导,正确的做法是,新建一个 settings.php(可以是空文件),或者拷贝 default.settings.php。这下安装通过了,但还是抛出一堆错误,并不比 drupal 5.20 少。

    想了一下,可能是因为我没有给 drupal 6.14 一个全新的数据库,它是覆盖在原 5.20 的数据库上的,看来 6.14 安装过程不能自动升级数据库。于是再来一遍,这样终于成了(少数页面仍有小量错误)。

  • PDT path mapping

    今天折腾了一个晚上,终于明白一个道理:PDT 下,入口文件不能使用 path mapping,服务器上必须有入口文件才能 debug on server。入口文件所调用的文件才能 path map。

  • Make best use of Godaddy Free Products

    我不算一个好顾客——很挑剔,但可以算是 Google, Godaddy 和 Tesco 的忠实顾客,因为他们的产品或服务几乎无可挑剔——又扯远了。

    我要讲的是如何把 Godaddy 购买域名后的免费赠品用足用好。Godaddy Free Products 有 Free Hosting, Free Blogcast 和 Free Photo Album。虽然我另租 1&1 的服务器,但 Godaddy 这么客气,我想不要浪费了人家的热忱。再说,在  Godaddy Free Products 上搞搞实验,物理上跟生产服务器隔绝,用得也心安。

    只是 Godaddy Free Products 既然是免费的,同时广告也来了。拿它来建商业站点肯定是不合适的,就是自己人搞实验对着广告也烦。有没有办法去掉?我稍作搜索就有答案:可爱的 css 发挥一下

    #conash3D0 {display:none; }
    

    因为答案来得太容易,没有我发挥的空间总不心甘。于是我又想,我每装一个软件都要去改 css,太烦;有些 一键安装的产品(比如 Free Blogcast 和 Free Photo Album)也不允许我改 css,怎么办?答案是 user css。以 Mozilla Firefox 3.5.5 for Fedora 11 为例,具体做法是:

    打开 /home/{myusername}/.mozilla/profile.ini,看里面说的 profile path 是什么,通常是跟 profile.ini 同级的一个目录,名字是 {randomchars}.default。

    在 /home/{myusername}/.mozilla/{randomchars}.default/chrome 目录下新建一个 userContent.css,内容是:

    #conash3D0 {display:none !important; }
    

    使用 !important 只是保证这条规则的优先权,对付目前 Godaddy 的广告条,不用也可以。因为不在服务器端动手脚,恐怕 Godaddy 到死也不会意识到它的广告被屏蔽了。万一它改进 javascript 来探测广告条的 display 状况,那 user 再换一条规则:

    #conash3D0 {position:absolute !important; left:-10000px !important}
    

    也是一样效果(你的显示器不会大于 10,000 pixels 吧)。不过 Godaddy 不会有时间整天琢磨这些玩意,所以有两条规则备用足以。

    以此类推,对付 Godaddy Blogcast 广告,可以使用:

    iframe.adFrame, div.adBanner { display:none !important; }
    

    对付 Godaddy Photo Album 广告,可以使用:

    div#wrapper div iframe { display:none !important; }
    

    至于其他浏览器怎么建 user css,我摘抄一段前人讲的

    Internet Explorer for Windows

    1. Create a .css file in a convenient location using Notepad.
    2. Tools menu, Internet Options, General tab, Accessibility button.

    Opera

    1. Create a .css file in a convenient location using Notepad.
    2. File menu, Preferences, Page Style.

  • Known issues with PDT

    我对 PDT 还不熟,碰到很多问题,都分不清究竟是我不会用,还是 PDT 本身的错。其中一个安装在 Fedora 上的 PDT 已经用了有些日子了,配置被我改来改去,所以更加分不清是谁的错。今天狠狠心,全新下载安装了 PDT Galileo SR1 for win32 版。本来想离 Windows 远一些的,无奈,相对来说,我在 Windows 下用 PDT 比 Fedora 下更久一些,出了问题也更容易定位是什么问题。

    几个小时折腾下来,终于有了结论:

    1. PHP for Windows 本来是集成 odbc 支持的,但 PDT 带来的四个 PHP 解释器不知怎么搞的,就是不支持 odbc,我也不知道去哪里 enable odbc,因为 PHP 手册上说 windows odbc 是内置的。要在 PDT 使用 odbc,那就自己安装一个原版的 PHP 吧。
    2. 在 PDT 下安装 PHP 解释器,对话框有让我填一个 php 启动配置文件,通常是 php.ini。但如果原目录下有一个 php.ini,我想做一个专门用于调试的配置文件,取名叫 php-with-zenddebugger.ini,PDT 根本就不理我填入的文件名,直接去找 php.ini,真是浪费感情。
    3. 既然是自己的 PHP 解释器,ZendDebugger.dll 也得用原版的。当时我图省事,直接把 PDT 带来的 ZendDebugger.dll 拷到我的 PHP 解释器的目录下,不能用,后来比较了原版的,文件大小都相差好多,不知道 PDT 给的是什么版。
  • A good practice in naming rewritten Magento modules

    Magento 里的namespace, module name, controller name, action name, class name, function name, model name, router name, xml identifier name, etc, etc 实在太过复杂,凭我的脑袋实在记不全什么时候该大写,什么时候该小写,什么时候该加一个下划线。

    为了不出错,我尽量照抄 Magento source code,比如 extend Mage_Catalog 模块时,我取名 Myname_Catalog。我这个模块名作前缀重写了一些 Model 和 Block,没遇到问题。最近在重写 Controller 时,出问题了——如用/catalog/product/view/id/1 能执行重写后的 controller;但用/seo-product-page-name.html 却执行了重写前的 controller。这问题不一定是命名引起的,但我在寻找解决方案时意识到要有一个好的命名习惯。

    简言之,网上讨论比较多的 Magento upgrade safe 重写规则只适合 Model 和 Block,不适合 Controller。要写出 upgrade safe Controller 也不难,就是谈的人少,不容易找到适用于最新版 Magento 的文档。有空我整理一下如何在 Magento 1.3 下重写 controller,但这不是我今天想说的话题。

    我只想说我在重写 Controller 时意识到命名习惯。命名时肯定是用自己的 namespace,但也建议不使用原模块名。比如要重写 Mage_Catalog,不妨使用 Myname_Catalogue,这样最大程度地避免了可能的名字冲突。