Zend_Db ignore default charset of Mysql

While I set my Mysql database default character set as UTF-8, Zend_Db_Adapter does not pick up the setting. Zend_Db write to Mysql using its own default character set (I guess it’s ISO-8859-1), unless it is specifically told by

$dbAdapter->query(“SET NAMES ‘utf8′”);

before

Zend_Db_Table::setDefaultAdapter($dbAdapter);

Resin and chrome

我发现 Resin (Web Server) 和 Chrome (Browser) 竟然使用相同的 Widows 任务栏图标。Is Resin project sponsored by Google? Is GWS (Google Web Server) based on Resin? It’s just my guess. Resin does not say anything about Google on its site.

When I tried to search the relationship between Resin and Chrome, I found Resin and Chrome is a kind of storage basket. But it’s difficult to describe resin and chrome in Chinese – 带支架的藤条箱? Maybe.

resin chrome
resin chrome

However, if you search Resin and Chrome in Google Image Search, nothing like 带支架的藤条箱 show up in first 2 pages. So, what is Resin and Chrome?

resin chrome google image search result
resin chrome google image search result

Bonjour is not virus

Bonjour bundled with Sarifi
Bonjour bundled with Sarifi

不知道 Bonjour 是怎么进入到我的电脑的,我不用Sarifi已经好多年。我不喜欢Apple的东西,装Sarifi只是为了测试,测试完毕重装系统也没再想着把Sarifi装回来。

第一次注意到 Bonjour 进程的存在着实让我担心了一把,还以为是什么病毒,Google 了一下才知道是 Apple 开发的一个玩意儿才打消了我的顾虑。今天我再次安装Sarifi,里面提到 Bonjour,因为事先跟 Bonjour 有过接触,所以注意到了,拷屏下来告诉初识 Bonjour 的人,Bonjour 是无害的(但我也没意识到 Bonjour 有什么好处)。

Run Magento on GAE

Google App Engine 不久前开始支持第二种语言 Java,我当时听到这个消息马上开始期盼什么时候 GAE 支持 PHP。

今天看到 Quercus 项目,它可以让 PHP 运行在 Java 环境,我才意识到不用再期盼在 GAE 跑 PHP 程序,这已成为现实。这下我有事情做了——怎么把 Magento 跑在 GAE 上?

Skiing knowhow

今天一天在瑞士 Titlis (铁力士) 雪山度过。

在雪山当然是滑雪。我们一组18个人请了个教练,教了我们2个小时,教到后来我都饿了,没力气学了。于是吃饭,我胃口不错,大块大块的蹄膀也对我的胃口。雪山上的餐馆的价格反而比山下的便宜,倒出我意外。另一件意外是终年积雪的山顶并不冷。

吃饱了有力气了就自己练习,我从山坡上往下滑老是摔跤,摔了很多引人注目的跤,差不多到最后一刻收工才领会到滑雪最基本的技巧:要想不摔跤,就要克服心理障碍,因为从山坡上加速下滑时,人本能地想控制住速度,希望通过重心后移来减速,但事实上,重心后移就会摔个人仰马翻,只有顺势前倾,才能不倒。我只在最后时刻成功地优雅地下坡两次,就听有人喊,赶快下山,缆车5点停机。

哇,错过缆车末班车怎么办?听说也不要紧,有雪道可以从山顶一直滑到山脚。但是凭着我刚掌握的下坡动作恐怕还做不到这一点,还是赶紧跟着大部队坐缆车下山吧。

轻触米兰

在有限的天数内游历尽可能的地方,这种旅游思维还是有很多支持者的。我们的旅游团有一个可选的项目就是用一天时间顺访意大利米兰,结果90%的人都选择去。

我们在报名的时候就选择去米兰,现在想想,倒有些后悔——既然来了瑞士,应该留在瑞士多看几个城市,何必又跑出瑞士去意大利呢?旅游团行程中没安排日内瓦和苏黎世,我们就可以趁今天空档自己去。不过想太多也没用,反正钱已经交了,意大利也没去过。

还没下车,导游提醒说,米兰扒手多,要我们小心钱物。我们想到上个月在巴黎地铁遭遇女扒手的经历(她们偷窃未遂),旅游中就带着小心,或多或少影响了兴致。一个城市要是不能给游客以安全感,那是整个城市的悲哀。

米兰在我眼里没有什么可圈可点的,看了一圈,算是来过了。足球场是应该去看看,可是听说去一趟挺费时间,就作罢了;时尚品牌店满地都是,但是这么贵的价格,不符合我的购物理念(我喜欢 Boxing Day 品牌打折时的那种疯狂),所以啥也没买。

Luzern小镇静悄悄

这次行程中没有安排苏黎世(Zurich)和日内瓦(Geneva),不过看过卢塞恩(Luzern),我也能想象瑞士其他城市的风格——安静平和。

Luzern 6万人口(据说这是市中心人口,不包括乡村人口,他们也分城市和农村,挺有意思),人不多,但地方很小,游客更多,看起来也很热闹。Luzern的标志性建筑是河中央的一个八角小塔,曾经是瞭望塔兼监狱,现在开放,市民可以租来开 Party。

离市中心不远有座高山 Pilatus,中文叫皮拉图斯山,海拔2,120米,它是阿尔卑斯山脉的前部。我们坐索道上去,索道分三段,前两段连续运行,中途可以上下乘客,第三段必须换乘。第二段开始就可以看到积雪,我就是没想明白:山并不高,气温也不低,怎么还能积雪到4月?

Pilatus 相对高度只有585米,要是有时间,我倒愿意和很多当地游客一起徒步爬上去。

终于明白英吉利海峡还没有汽车隧道

今天下午2点在 Brighton St Giles 上车,开始第二次欧洲大陆之行。上一次欧洲游还是上个月的事情,有意思吧——来英国好多年都没去欧洲其他国家玩过,一月之隔却游历两次。

这次是 Discovery 的团,48人,大巴49座,基本坐满。Discovery 老板亲自带团,挺会做生意的。

一路坐车,经 Eurotunnel ,两个司机轮班倒,要赶在明天清晨8点到达瑞士 Luzern Youth Hostel International。我们旅客也是很辛苦,要在车上待十多个小时,虽然一路风光很好,也看得人昏昏欲睡。

上次去欧洲坐的是 Eurostar,这次是走 Eurotunnel。我这才明白 Eurotunnel 不是让司机驾车开过去的,而是把大大小小的车辆全都塞进一节节的闷罐车厢,由火车拉着跑的。一节闷罐车厢可以塞进一辆大巴和两辆轿车。说它是闷罐,是因为这么大车厢,每边只有四五个很小的车窗,不过隧道里没什么风光,大车窗也是摆设。

晚上在瑞士、德国和意大利三国交界的加油站小憩,领教了瑞士的高物价。

DtDdWrapper in Zend Framework

我尝试着用 Zend Framework 重写了一个程序。在 Zend_Form 上徘徊了好久,研读了 Programmer’s Reference Guide N 遍,还是没有融会贯通。比如说,我想去掉默认的DtDdWrapper,用

$element->removeDecorator(‘DtDdWrapper’);

只对某些element起作用,对 Zend_Form_Element_Text 怎么也不起作用,最后发现用

$element->removeDecorator(‘HtmlTag’);

倒可行。

问题是解决了,但还是没摸清 Zend Framework 设计思路。很累。

续:

其实,用$element->removeDecorator(‘HtmlTag’); 问题并没有完全解决。后来我用

var_dump($element->getDecorators());

查看了默认加载的装饰器以及装饰器的参数,发现对于 Zend_Form_Element_Text 来说,它的 dt 和 dd 并不是由 DtDdWrapper 加载的,事实上 Zend_Form_Element_Text 默认不加载 DtDdWrapper,难怪

$element->removeDecorator(‘DtDdWrapper’);

是不起作用的。

那么,Zend_Form_Element_Text 的 dt 和 dd 是哪里来的呢?我仔细看了 var_dump 的结果,发现

  • dt 是由默认的 Label 装饰器默认的 dt 参数带来的
  • dd 是由默认的 ViewHelper 装饰器默认的 dd 参数带来的

如果想要 Zend_Form_Element_Text 不套用 dt 和 dd,应该对症下药,修改 Label 和 ViewHelper 默认参数。

上次用 $element->removeDecorator(‘HtmlTag’); 并没有去除 dt 和 dd,只是误打误撞让页面呈现出视同没有 dt 和 dd 时的效果。

Generate a UTF-8 encoded Actinic site

I don’t like the way of Actinic tackle the problem. For example, if the web server set default charset as UTF-8, it will cause page rendering issue for Actinic. Especially for the pound sign. All the support knowledge from Actinic is redirecting people set the server using default chareset as ISO-8859-1. Then, my question is – why should I use ISO-8859-1 while UTF-8 has far better applicability, especially for multi-national sites?

Nevertheless, can Actinic generate an UTF-8 encoded site? The answer is yes and no.

Yes is because I have already achieved it; No is because Actinic can not make it happen for you (at least I won’t know how to control it), so you must do something outside Actinic. Here below is my detailed steps.

  • First, rewrite all requests to actinic generated files to index.php.
  • Second, create a bootscript, name it as index.php. This idea is inspired by Zend Framework. Make sure:
    1. The bootscript should be in utf-8 encode.
    2. The bootscript should be able to include actinic generate files according to request uri.
  • Third, in actinic templates, change meta tag charset to utf-8.
  • Last, at web server, adddefaultcharset utf-8.

The most tricky part is actinic upload its files in iso-8859-1 encoding, but bootscript is utf-8 encoded. A normal include or require by php will not render pound sign correctly. I use output buffer to hack the problem.

<?php
...
ob_start();
include($actinic);
$utf8out = utf8_encode(ob_get_contents());
ob_end_clean();
echo $utf8out;
?>