Category: 小小草

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

  • Upgrade VirtualBox to 3.1.x

    刚从国内回来,电脑上积累了很多更新。其中 VirtualBox 有了 3.1.2 r56127,我从 3.0.x 直接升级失败,抛出一大堆的文件冲突信息。

    于是
    yum remove VirtualBox -y
    然后再
    yum localinstall -y --nogpgcheck VirtualBox-3.1-3.1.2_56127_fedora11-1.x86_64.rpm
    成功!

    此删除和重安装操作无须备份和恢复原有的 guest OS(but as a good practice, you should backup files before major changes)。

  • Expires affects Firefox

    我把 Magento 网店从 A 服务器迁移到 B 服务器后,发现一个问题:在 Firefox 下点 “Add to cart”,无论添加是否成功,系统没有提示(购物车有个选项是添加商品后留在当前页面),非得 F5 刷新后才能看到成功或错误信息。Safari 下正常,IE 下未实测。

    我原以为是 Magento cache 的问题,但禁用 Magento cache 后问题依旧。而且,只有 B 服务器才有这样的毛病。想来半天,觉得跟服务器参数有关。

    于是我查看了 Magento 在两台服务器的 http header,发现 B 服务器多了 cache 和 expiry 等 headers。这才特别关注了一下 nginx 的配置问题,发现 B 服务器的 server {} 里有一句 expires 1d; 不知这句是谁写到 nginx conf 文件里。这指名 Firefox 直接从本地读取,除非 F5。去掉 expires 这条目就好了。

  • Self-contained form

    Self-contained form
    Self-contained form

    视表单为一个对象

  • Knockout background using Photoshop action

    Knockout Background Using Photoshop Action
    Knockout Background Using Photoshop Action

    抠图是我最不想干的活。

  • 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 来得更安全(至少心理上更舒服)。

  • 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.