How to: Implement Dynamic Route in CakePHP

I’ve found a method to implement Dynamic Route in CakePHP.
If we develop a CMS program using CakePHP, we often let people to define their menu code. The menu code basically is the URL path.
For example: An admin create a menu named ‘Milk Product’, and give this menu a code ‘product’.
He wish to access this menu via /product

So we can add a static route in routes.php
Router::connect(‘/product’, array(‘controller’ => ‘product’, ‘action’ => ‘index’));

But one day, he want to change the menu code from ‘product’ to ‘milkproduct’? What to do then? Ask the site admin to edit the routes.php? Of course not.

We can use the code below to resolve this problem.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$menus = '';
Cache::delete('routemenus');
if($menus = Cache::read('routemenus') === false){
    echo 'load from db';
    $menusModel = ClassRegistry::init('Menu');
    $menus = $menusModel->find('all', array('conditions' => array('parent_id' => '1')));
    Cache::write('routemenus', $menus);
}
 
foreach($menus as $menuitem){
    Router::connect('/' . $menuitem['Menu']['code'] . '/:action/*', array('controller' => $menuitem['MenuType']['code'], 'action' => 'index'));
}
 
Router::connect('/', array('controller' => 'homepage', 'action' => 'index'));

We have 2 menu related tables: menus and menu_types.
Their structure as belows:

menus
    id
    menu_type_id
    parent_id
    lft
    rght
    code
    name
    created
    modified

menu_types
    id
    code
    name
    created
    modified

The code in menu_types means the controller name, and the code in menus means the path.

  • Share/Bookmark

我的手机, 以及心目中的主流触摸屏手机

我的手机是07年12月买的, 水货Nokia E70. 当时用的手机是Siemens 2128, 由于没用过智能机, 对智能机也不是很了解, 只是知道它可以安装软件. 于是就选择了带有全键盘的E70.

但是随着使用上的深入, 我发现这个手机有很多问题:

  • CPU速度低, 对整个机器影响最大. 看条短信都需要5-10秒钟的时间. 运行Gmail的手机客户端都比较慢, 刷新邮件列表也是.
  • 可用内存小, 在我做优化后, 开机内存为19M, 但是运行了一段时间后, 可用内存就变到10M左右. 10M的内存一般只能开一个程序, 要听音乐就不能用Opera. 更别提一边Opera, 一边MSN了.
  • 系统不稳定. 因为系统不稳定, 所以我从2.0中文版升级到了3.0英文版, 没想到3.0比2.0还不稳定. 有时死机, 有时重启. 有时来个电话都能死机.
  • 手机屏幕小, 虽然分辨率到了352*416, 但是2.2寸的屏幕实在是太小, 看起来比较费劲.

我平时用手机主要做以下事情:

  • 浏览网页, 主要用Opera Mini
  • 上MSN, QQ, 飞信, Skype
  • 收发邮件, 用自带的邮件软件和Gmail客户端
  • Twitter, 用Gravity
  • 听音乐,用 OggPlayer
  • 拍照
  • 地图, 定位, 用Google Map
  • 看书, 用掌上书院
  • SSH, 用Putty

如果我的手机屏幕大, 并且性能高, 我应该会做以下的事情:

  • 视频播放, 以前看过, 但是屏幕小, 看起来不舒服
  • 股票, 只是一个计划中的功能, 还没涉及这一块
  • 游戏, 没怎么装过, 而且感觉用那易坏的摇杆玩游戏, 我很心疼

下面说说我心目中的理想手机应该是什么样的:

  • 原生上网能力(能通过GPRS和3G上网)
  • 支持Wifi
  • 能浏览网页, 最起码能支持大多数的网页. 如果能对Javascript提供完整的原生支持就更好了. 最好能支持Ajax.
  • 要有一个好的邮件客户端
  • 能上MSN, QQ, 飞信, Skype
  • 大屏幕, 高分辨率
  • CPU起码500MHz以上
  • 足够的可用内存, 不会因为某个软件内存泄漏而造成内存不足. 起码开机后要有60M以上的内存吧. 我朋友的N83开机后有96M的可用内存.
  • 可以安装的软件多, 社区活跃
  • 能和Google同步联系人, 日历等
  • 音乐, 视频播放能力. 最好能支持FLAC, APE等格式的音乐, 以及高分辨率(相对手机屏幕来说)电影播放能力
  • 摄像头, 起码自动对焦3M像素吧
  • 能同时运行多个程序, 让我很流畅的一边看网页一边听音乐, 还能时不时的MSN或者QQ一下
  • 大内置闪存, 内置闪存肯定比外插的TF卡要快, 而且省电
  • 支持多点触摸的触摸屏

下面是最好能拥有的功能:

  • 最好能插存储卡, 方便扩容
  • 最好是Linux系统
  • 最好能支持在手机里用gcc编译软件, 这样一些常用的Linux软件就可以移植到手机里了
  • 最好能有3.5mm耳机插孔
  • 最好能方便的开发手机程序
  • 最好能有实体键盘
  • 最好能支持3d游戏

目前我看上的手机分别是:

  • Apple iPhone 3G/3Gs
  • HTC Hero
  • HTC Magic
  • Palm Pre

请看我总结的表格<<我心中的主流触摸屏手机比较>>

以上几款手机各有长短:

iPhone两款主要是价格高, 但是功能非常全面. 如果抛开价格因素, 肯定是首选.

Pre价格适中, 操作系统是全新的. 可以很方便的开发Pre程序, 纯粹作为上网手机/商务手机来说是个非常好的选择. 但是目前的系统不支持3d游戏, 不支持java程序, 这样可用的软件就非常少. 而且CDMA2000的手机需要烧号, 比较麻烦. 期待其GSM版的推出.

Hero和Magic都是用的Android系统, 硬件配置基本相同. Magic刷Hero的Rom, 可以实现Hero一样的多点触摸功能和HTC Sense界面.

以我目前的情况来看, 如果Pre近几年不会支持Java, 不支持3d游戏, 那么我就会买Hero或Magic. 否则的话Pre是首选.

Hero和Magic硬件配置基本相同, 唯一一个硬伤是Magic没有3.5mm耳机插孔. 不过两者相差1000块, Magic的性价比还是很高的.

  • Share/Bookmark

Windows 7 英文版 SHA1大全

Windows 7的RTM出来了, MSDN上今天放出了下载. 但是我没权限下载, MSDN订阅一直是Pending状态. 所以就把SHA1奉献出来, 希望大家能下载到真正的MSDN版的Windows 7

Windows 7 Starter (x86) – DVD (English)     :5DC1457BC4B3D94097F499B15DFDB3C21DADCDF5
Windows 7 Home Basic (x86) – DVD (English)  :101574FAA17FDB430BB027271EF0A58F0E18AD47
Windows 7 Home Premium (x64) – DVD (English):336779EA6B65F63E11A609B4D021439C47AB315B
Windows 7 Home Premium (x86) – DVD (English):CC9D8220B2179E784D85BF1EA98D2EE2190D534F
Windows 7 Professional (x64) – DVD (English):50127304441A793EE51B3F501289F6599A559E9F
Windows 7 Professional (x86) – DVD (English):697FA06554502FB21D30275273B25747299C020D
Windows 7 Enterprise (x64) – DVD (English)  :A89DCE706D527206CB464EF86ACD3A3D13A332DB
Windows 7 Enterprise (x86) – DVD (English)  :C6B905E48FDB6CB5BFCA967715A64461B812D40C
Windows 7 Ultimate (x64) – DVD (English)    :326327CC2FF9F05379F5058C41BE6BC5E004BAA7
Windows 7 Ultimate (x86) – DVD (English)    :5395DC4B38F7BDB1E005FF414DEEDFDB16DBF610

点击看完整图

  • Share/Bookmark

2009年7月22号日全食

为了看日食, 我买了眼镜, 做了滤镜. 就在都准备好, 准备第二天看的时候, 晚上下雨了, 而且还不小. 这下完蛋了, 估计8成看不到了.

到AccuWeather上查了查22日天气, 发现8点是阴天, 9点开始就下雨. 这果然很有预谋, 诚心不让我看日全食.

公司考虑到大家看日全食, 特意安排早上9点50上班.

22日早上果然阴天, 不过还好, 时不时能看到太阳. 公司在徐家汇, 为了能9点50到公司, 我就把观测地点选在了徐家汇公园(就在公司楼下, 嘿嘿).

8点就到了徐家汇公园, 找张石椅坐了下来, 拿出相机准备抓拍. 公园里已经好多人了, 那场面真是红旗招展,锣鼓喧天,人山人海,鞭炮齐鸣啊.

太阳总是露脸1秒钟就消失, 好不容易才抓拍到一张, 还忘记用长焦了. 此时日食还没开始.

后来就再也没见过太阳. 拍不到日食就拍看日食的人群吧.

还有人带着电焊面罩过来看日食.

来个观测现场的全景.

之后转战徐家汇天桥. 天桥两边站满的人.

此时看到twitter上的报道, 说太阳已经被吃掉快一半了. 路灯都亮起来了.

此时已经有点下雨了, 不大. 我又准备回到徐家汇公园. 到公园后雨开始渐渐大了起来. 此时的天已经像晚上7点多了. 比较黑了.

几分钟之后, 太阳被完全遮住. 天顿时黑了下来. 可以看到这栋楼的窗户边站满了人.

还是拍同一地点. 由于下雨, 不敢到没有护栏的台阶上拍.

生光的时候, 雨就停了. 这次难得的日全食就被天气给搅了.

如果以后有时间, 一定要亲眼目睹一次日全食.

  • Share/Bookmark

DIY日全食相机滤镜(巴德膜版)

我买的巴德膜到了, 昨天晚上和老婆一起把它做成了相机滤镜, 外形跟上次做的电焊护目镜版的滤镜一样.

只是我感觉到买的巴德膜是假的.

我有700多度的近视, 当我摘掉眼镜拿着这个滤镜对着强光看过去的时候, 发现膜上有一些不均匀的地方, 比如很亮的点, 还有线等.

这个一般人不能体会, 近视患者的眼焦距较短, 所以能看清很近的地方.

今天早上我试着用相机拍摄膜的亮点等情况, 没拍成功.

如果各位有条件的话也可以模拟一下我的做法, 只是需要把筒子做的更长一点, 这样好能看清膜.

Update: 我在论坛上询问膜的情况, 有几个人说他们的膜也是这样, 但应该是真的.

老婆在帮我做镜筒

做好的成品

装在相机上的效果

这是使用滤镜拍摄的太阳

  • Share/Bookmark

DIY日全食相机滤镜(电焊护目镜版)

7月22日就是日全食了. 我小时候看过日环食, 后来因为各种原因再也没看过日食. 这次终于又有一次机会了, 赶紧准备起来.

在前面某篇文章中我提到了我买了片电焊护目镜, 但是因为那个护目镜是墨绿色的, 所以看到的太阳也是绿色的, 如果能是正常的颜色就更好了. 今天在逛牧夫天文论坛, 看到上面在讨论一个叫巴德膜(Baader AstroSolar Filter Foil, 网址:http://www.baader-planetarium.com/)的东西, 搜索了一下, 就决定在淘宝上买两个使用巴德膜的观测镜, 再买一片70*70mm的巴德膜作为相机的滤镜.

小时候爸爸给我一片电焊护目镜让我看日环食, 所以这次特意买了两个观测镜寄给爸妈, 希望他们也能看到日偏食.

在巴德膜寄到我手中之前, 我先拿护目镜DIY了一个相机滤镜, 感觉还不错, 大小正合适, 而且套到镜头上还能作为变焦环来用. 哇咔咔.

做法就不细说了, 看了图片应该就知道了. 我手工差, 望各位不要笑话.

这是装上滤镜后的拍摄效果, 没用三脚架. 手持2秒拍摄

这是第二天早上拍的太阳, f/29, 1/1600, ISO 100, 55mm(没有其他镜头了). 这是原图裁切后的. 可以看出太阳非常绿, 而且看不到表面细节. 希望巴德膜版本能给我带来惊喜.

过两天巴德膜到了, 我再做个巴德膜版本的滤镜, 以那个为主力, 护目镜版滤镜作为后备. 这个周末先试拍一下找找感觉.

  • Share/Bookmark

自制绿豆芽2(完)

我是周五晚上泡的绿豆, 周六早上种下的. 经过周六,周日,周一三天的生长, 我的绿豆芽终于成型了.

为了让他长得粗壮, 特意压了一个装满水的水壶在豆芽上, 估计有5斤左右吧. 豆芽竟然把水壶顶起来了. 种子的力量果然不可小看.

缺点是长的太狠了, 有点出叶子了. 根长的也太长. 如果今天早上收获, 可能就更好了.

口感方面跟买来的没什么区别, 没有买来的粗. 但是自己弄的豆芽放心. 听说外面会用增粗剂, 去根剂, 漂白剂. 太恐怖了.

长的还不错吧, 科科.

这是纱布底部, 已经被根插透了. 我是用刀将绿豆芽割下来的. 之后花费我将近1小时的时间把根从纱布上清理干净.

  • Share/Bookmark

自制绿豆芽1

最近两天连续看到订阅的Blog中笨鸟开始学种菜(笨鸟学种菜1, 笨鸟学种菜2, 笨鸟学种菜3); 还有张翼轸发绿豆芽.还有这篇自制无公害绿豆芽.

我也知道外面卖的绿豆芽会掺东西保持豆芽的新鲜, 而这种能保鲜的化学物质是一种强氧化剂, 是不能食用的. 所以自己发绿豆芽是个不错的主意哦.

如何发绿豆芽请参考前面提到的几篇文章.

这是我泡过一夜的绿豆, 现在放在菜框里的, 下面铺了纱布. 现在已经长出来一点点芽.

全貌, 哈哈

盖上纱布后.

  • Share/Bookmark

用胶片或者刷墨汁的玻璃能看日全食吗?

我没能力详细说清楚其中的来龙去脉, 我会先说说我理解的, 再附上两篇文章供继续阅读.

我小时候看过一次日环食, 97年的时候有次非常壮观的日全食和海尔波普彗星同时出现, 但是因为天气原因, 我没能看到.

小时候听家长说看日食有几种方法:
1. 用电焊工的护目镜
2. 在玻璃两面涂上墨汁(或者用烟熏黑)
3. 水盆里放一盆水, 然后滴上墨汁
4. 用外面卖的日食观测卡(两张纸片, 中间放上一层会反光的类似包装纸一样的反光纸)
5. 用几张胶片重叠在一起
6. 多戴几个太阳眼镜

我用的是第一种方法: 电焊护目镜.

上面说的几种方法确实能起到阻隔可见光的作用. 但是我们知道, 太阳光中除了可见光还有大量的红外线和紫外线. 那么这些东西是否能隔离红外线和紫外线呢?

首先说说红外线和紫外线会对眼睛造成什么伤害.

红外线的生物效应主要是热效应。红外线易被深色物体所吸收,高强度的红外中使组织坏死,蛋白质凝固。远红外线只能穿入组织0.5cm左面,几乎完全被角膜及房水吸收,近红外线可穿透组织3~cm而达视网膜,在虹膜及视网膜均被色素所吸收。
来源: http://www.qqyy.com/jibing/yanke/080509/12051.html

从太阳发出的紫外线可以分为三种UV-A, UV-B, UV-C. 其中UV-C波长最短, 所以能量也就越大, 越对人体有害. 但庆幸的是, UV-C基本被大气层吸收光了. 能到地面的也就只有UV-A和UV-B了.UV-A可以使皮肤变黑, 而UV-B因为能量大, 能造成皮肤晒伤, 皮肤癌. 高强度的UV-B照射, 可以引起眼部疾病, 如白内障, 结膜黄斑等.

High intensities of UVB light are hazardous to the eyes, and exposure can cause welder’s flash (photokeratitis or arc eye) and may lead to cataracts, pterygium,[19][20] and pinguecula formation.
来源:http://en.wikipedia.org/wiki/UV-A

我们的眼睛构造很奇特, 瞳孔是一个可以放大缩小的孔, 用来控制进光量. 当光线强的时候, 瞳孔缩小, 进入到眼睛的光线变少, 同样进入的红外线紫外线也少了. 当光线暗的时候, 瞳孔放大. 当我们戴上墨镜的时候, 由于到达眼睛的可见光变暗了, 所以瞳孔会比不戴的时候大. 如果墨镜不能阻挡紫外线, 那么进入眼睛的紫外线比不戴要多. 所以这种墨镜更有危害.

在了解我想表达的意思后, 请仔细阅读下面两篇文章.
目视观测日全食的安全指南
观测日全食的防护镜有讲究

  • Share/Bookmark

Wordpress不能在别人评论后给我发送邮件的解决办法

这是一个非常诡异的问题.

遇到问题后, 我google了一下. 发现有些人遇到了和我类似的问题. 但是他们的问题原因仅仅是服务器不支持php的mail函数, 他们只需要安装wp mail smtp组件就可以发送了.

而我确定我的服务器支持mail函数.

我对于php还是新手, 还不知道怎么在windows上测试php的mail函数. 所以就只能在本地把文件改改, 然后上传到服务器上做发送邮件测试.

Wordpress调用的是PHPMailer组件发送邮件, 经过几个小时的调试之后, 我发现问题的原因在于2点:

1. PHPMailer的Sender属性为空. 这个属性为空将直接导致不会发送任何邮件.

2. PHPMail的MailSend方法中是这么调用mail函数的:

$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);

我注意到如果把$this->EncodeHeader($this->SecureHeader($this->Subject))替换成固定的字符串, 并且将Sender属性设置为我的email地址, Wordpress就可以给我发送评论邮件了.

关于字符编码的问题我不是很懂, 大概看看这个EncodeHeader函数, 没看懂.

$this->Subject的内容是”[想当摄影师的程序员] Comment: “Symbian S60 V3系统不破解也能提升权限”"

如果直接用var_dump($this->EncodeHeader($this->SecureHeader($this->Subject))), 会得到一串加了编码前缀的base64字符串. “=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?=”

bin2hex函数可以将任意内容转换成十六进制的字符串.

于是我调用了两次bin2hex方法.

var_dump(bin2hex($this->EncodeHeader($this->SecureHeader($this->Subject))))

var_dump(bin2hex(“=?utf-8?B?W+aDs+W9k+aRhOW9seW4iOeahOeoi+W6j+WRmF0gTmV3IENvbW1lbnQgT24=?= =?utf-8?B?OiBTeW1iaWFuIFM2MCBWM+ezu+e7n+S4jeegtOino+S5n+iDveaPkOWNhw==?= =?utf-8?B?5p2D6ZmQ?=”))

发现转出来的十六进制码竟然有差别.

3d3f7574662d383f423f572b6144732b57396b2b6152684f573973655734694f6561684f656f692b57366a2b57
526d463067546d563349454e766257316c626e51675432343d3f3d0a203d3f7574662d383f423f4f694254655
731696157467549464d324d4342574d2b657a752b65376e2b53346a656567744f696e6f2b53356e2b6944766
561506b4f574e68773d3d3f3d0a203d3f7574662d383f423f35703244365a6d513f3d

3d3f7574662d383f423f572b6144732b57396b2b6152684f573973655734694f6561684f656f692b57366a2b57
526d463067546d563349454e766257316c626e51675432343d3f3d203d3f7574662d383f423f4f694254655
731696157467549464d324d4342574d2b657a752b65376e2b53346a656567744f696e6f2b53356e2b6944766
561506b4f574e68773d3d3f3d203d3f7574662d383f423f35703244365a6d513f3d

你会看到第一个方法比第二个方法多出两个0a

不知道为什么.

为了不使用PHPMailer的EncodeHeader函数, 我调用了PHP自带的函数. 做了以下修改:

$subject = ‘=?UTF-8?B?’ . base64_encode($this->Subject) . ‘?=’;
$rt = @mail($to, $subject, $body, $header, $params);

这样我就可以收到邮件了.

关于刚才说的第一个问题, 我也不清楚是怎么回事.

干脆我就直接给Sender属性赋值好了. 将以下两句加到MailSend函数的开头.

$this->Sender = ‘这里填上自己的email地址’;

  • Share/Bookmark
Page 1 of 4312345»102030...Last »