2009-07
26

注:本文使用的CakePHP版本为 1.2.3.8166。

使用CakePHP开发时,免不了要将调试级别设置为2, 这样页面上会显示出执行的SQL语句及结果,很方便。 但在做API页面时就比较麻烦。一般API页面的输出结果是XML或者JSON格式, 如果后面多了些调试信息,客户端就无法正确解析了。

解决方法很简单,只要在API的action函数中改写调试等级即可:

function api_index() {
  ...
  Configure::write('debug', 0);
}

不过,每个action都要写这么一行,太麻烦了。能不能想个办法,自动地关闭所有API页面的调试信息?

阅读全文 »
2009-04
21

谢谢fcicq指出书中的一些错误。也请其他读者在发现错误后告诉我,如果这本书有幸重印,我会在重印时改正这些错误的。给大家阅读带来不便,真是对不起。

P3,倒数第2段第3行:
用户想把音量调低,但我却没有把它设置到一个较高的音量,以便用户能通过软件来控制它。
修改为:
音箱的音量太小了,我根本没想到应该把音量调大些,这样用户才能通过软件来控制音量。

P5,最后两行:
以及如何进行高可用性的开发。
修改为:
以及如何开始符合高可用性的开发。

P37,“试一试”的第一行:
什么沟通障碍可能会阻碍项目创建高可用性?
修改为:
什么样的沟通障碍可能会阻碍项目创建高可用性?

P57,第2段第4行
请习惯这个思维。
修改为:
拥有这种想法很重要。


2009-03
05

通过把Content-Type设置为application/octet-stream, 可以把动态生成的内容当作文件来下载,相信这个大家都会。 那么用Content-Disposition设置下载的文件名, 这个也有不少人知道吧。 基本上,下载程序都是这么写的:

< ?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";
?>

这样用浏览器打开之后,就可以下载document.doc。

但是,如果$filename是UTF-8编码的,有些浏览器就无法正常处理了。 比如把上面那个程序稍稍改一下:

< ?php
$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);

print "Hello!";
?>

把程序保存成UTF-8编码再访问,IE6下载的文件名就会乱码。 FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。

阅读全文 »
2008-12
30

在抓虾上看到一篇Web开发分析工具的文章(链接就免了),怎么远没有我用的东西好用呢? 还是介绍介绍我用的吧。由于平常开发只用FireFox,完成后再去调试IE, 所以这些工具绝大部分是针对FireFox的。

如果把Web通信从上到下分为许多层——XMLHttpRequest层,HTTP层,TCP层, 那么这些工具可以分别抓取每个层的通信数据进行分析,结合使用极其强大。

2008/12/31:另外可以参考daniel同学的Web开发常用工具一文,相信会大有帮助哦。

阅读全文 »
2008-12
19

经过两个多月的努力,这本名为《Web开发修炼之道——创建高可用性的Web内容》 (豆瓣链接出版社预告勘误表)的书终于要与大家见面了。 这恐怕是国内第一本讨论可用性(Accessibility)的中文书籍——在豆瓣上搜索“可用性”, 找到的都是usability、availability等,没发现 accessibility。 可能这也是中国的网站在可用性方面做得很差的原因之一吧。

design-accessible-web-sites-cn.jpg

原书名为《Design Accessible Web Sites》(豆瓣链接), 书很不错,刚刚开始翻译时fcicq还在豆瓣上推荐了一把。 不过我现在还没拿到书的ISBN,所以暂时没法将中文版放到豆瓣上,抱歉。拿到时再补上吧。

简单介绍一下书的内容吧。可用性(Accessibility)就是说让网站能在任何平台、任何浏览器上运行, 并且残障人士也能毫无障碍地使用网站。这就要求开发网站时必须做到:

  • 符合标准(以便跨浏览器跨平台)
  • 为图片、视频等加上文字描述(供不支持图片的浏览器使用,同时考虑盲人所用的屏幕阅读器)
  • 使用易于阅读的字体和颜色(考虑弱视、色盲)
  • 使用简洁易懂的语言(考虑理解能力弱的用户)
  • 足够大的导航和链接(让运动不方便的用户容易点击)
  • 避免使用闪烁效果(防止诱发癫痫症)

不幸的是,国内的网站在这些方面做得极其差劲(原谅我用极其这个词), 特别是本该为残障人士周全地考虑的政府网站,在这方面简直是一片空白。 希望这本书能为国内的网站设计提供参考。

下面是本书的内容简介,请点开阅读。

阅读全文 »
2008-09
01

应该很多人都在为mod_perl的调试方法发愁吧。通常只能使用print,或者输出到syslog中, 但都需要猜测错误位置并添加相应的日志输出,然后重启服务器,刷新,看结果…… 虽然使用Apache::Reload能减少重启服务器的麻烦,但Apache::Reload用多了就会出错,而必须重启, 何况打日志总不像交互式调试器方便。

mod_perl的官方文档中写明了如何使用调试器来调试, 不过这个方法在RHEL4下似乎不太好用(自己编译mod_perl的同学就应该没这个问题)。 查看了一下,原来RHEL4自带的mod_perl是 mod_perl-1.99_16-4, 而在官方的mod_perl的下载页面上最高版本只有 1 系的 1.30 和2系的2.0.4,并没有所谓的1.99版。 看这个mod_perl-1.99的内容,应该是1系和2系的混合体吧。 Apache::DB这个包与mod_perl-1.99不兼容,于是就无法正常调试了。

阅读全文 »
2008-08
25

这篇文章,对于能看懂的同学是非常非常重要的资料,对于看不懂的同学就一点用处都没有啦。

调查一下mod_perl下BEGIN/INIT/CHECK/END等块的行为如何?

测试程序,保存为life.cgi:

#!/usr/bin/perl

print "pid = $$\n";
print "Start main running here\n";

BEGIN   { print "BEGIN\n"; }
INIT    { print "INIT\n";  }
CHECK   { print "CHECK\n"; }
END     { print "END\n";   }

如果直接执行就是这样的:

$ ./life.cgi
BEGIN
CHECK
INIT
pid = 4610
Start main running here
END

不论执行多少次,结果都相同(除了每次的pid不同之外)。但如果放到mod_perl下,结果就完全不一样了。 先单进程启动(httpd -X),再从浏览器中访问,结果如下:

BEGIN
pid = 4557
Start main running here
END

刷新一次,结果是:

pid = 4557
Start main running here
END

可见,mod_perl下没有INIT和CHECK过程,只有BEGIN和END。其中END在每次请求时必然执行, 但BEGIN只有在进程刚创建后的第一次请求时才执行,以后的请求就不执行了。

如果你用了 Apache::Reload,那么可以修改一下life.cgi试试看,哪怕是一点小小的改动也行。 修改之后刷新,可以看到BEGIN又回来了,不过再刷一次就没有了。 所以Apache::Reload会在重新加载程序后再执行一遍BEGIN。

根据上述结论再引申一下,use = BEGIN { requre + import }, 可以推断,在同一进程下两次加载执行了use的页面,那么第二次的use是不起作用的。


2008-08
17

memcached全面剖析的连载已经结束,翻译工作也已经全部完成了。 为了方便阅读,现将原来的翻译结果打包成PDF文档。可在本文末尾处下载。

原来的各篇翻译的地址如下:


2008-08
16

感光症癫痫(Photosensitive Epilepsy) 是一种罕见的癫痫症。高速闪烁的灯光、连续出现的图案、闪烁的视频,甚至树叶被风吹动时摇曳的影子都有可能会引起感光症发作。

感光症引起各国的重视,是由于1997年的口袋妖怪事件。 1997年12月16日,《口袋妖怪》第38话《电脑战士3D龙》在日本播出。该片为了表现电脑内部的爆炸效果, 而多次使用了红->蓝->红->蓝的高速颜色切换,导致日本全国约750名儿童被送往医院,其中150人需要住院治疗。 因此导致《口袋妖怪》被停播数月,恢复后,导致事故发生的主角“3D龙”也没能在电视中继续出现。

所以现在日本的动画片开头都会添加字幕,请观众在观看时远离屏幕,并打开室内灯光,以减少感光症发作的可能性。

而在2007年播放的一段2012年伦敦奥运会宣传片上,由于使用了闪烁效果,也导致了英国数人感光症发作。

下面这段视频就是被禁播的《电脑战士3D龙》。大家可以注意10:13、11:48、14:56、15:54和17:39的闪烁镜头。 不过,有感光症的读者还是不要看的好。

警告:以下视频包含强烈的闪烁,请在观看时自行承担一切责任。特别是有感光症癫痫史的读者请不要观看。

WARNING: The following video contains flicker effects. Please take responsibility yourself while watching. DO NOT watch if you have photosensitive epliepsy.

警告:下記のビデオに激しい光の点滅が含まれています。視聴は自己責任でお願いします。特に光過敏性症候群の方はプレイしないでください。

阅读全文 »
2008-08
15

今天在开发时突然apache无法启动了。表现为,输入 httpd -X 后片刻自动退出, 同时在error_log中有如下内容:

[Fri Aug 15 10:54:31 2008] [emerg] (28)No space left on device: Couldn't create accept lock

df一下发现不是磁盘空间的问题。Google了一下就找到了解决方案,原来是系统的信号量(?)不够用了。 用以下命令可以查看所有的信号量:

# ipcs -s
------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 19234816   nobody    600        1
0x00000000 19267585   nobody    600        1
0x00000000 19300354   nobody    600        1
0x00000000 19398659   nobody    600        1
0x00000000 19431428   nobody    600        1
0x00000000 19464197   nobody    600        1
0x00000000 19562502   nobody    600        1

然后用这行命令删除所有的信号量即可:

ipcs -s | grep nobody | perl -lane 'print `ipcrm sem $F[1]`'