注:本文使用的CakePHP版本为 1.2.3.8166。
使用CakePHP开发时,免不了要将调试级别设置为2, 这样页面上会显示出执行的SQL语句及结果,很方便。 但在做API页面时就比较麻烦。一般API页面的输出结果是XML或者JSON格式, 如果后面多了些调试信息,客户端就无法正确解析了。
解决方法很简单,只要在API的action函数中改写调试等级即可:
function api_index() {
...
Configure::write('debug', 0);
}
不过,每个action都要写这么一行,太麻烦了。能不能想个办法,自动地关闭所有API页面的调试信息?
阅读全文 »第一次看到这个标题时我也很惊讶,Apache居然还能做负载均衡?真是太强大了。 经过一番调查后发现的确可以,而且功能一点都不差。 这都归功于 mod_proxy 这个模块。 不愧是强大的Apache啊。
废话少说,下面就来解释一下负载均衡的设置方法。
阅读全文 »熟悉J2EE开发的人应该对此不屑一顾吧,俺是Java新手,没办法……做个笔记先。 Tomcat 5.5下测试通过。
首先要添加管理员用户。打开 conf/tomcat-users.xml,在其中加入这样一行:
<user username="manager" password="password" roles="standard,manager"/>
然后重启Tomcat。
之后访问以下地址:
http://localhost:8080/manager/status
输入刚才设置好的管理员用户名和密码,就能看到服务器状态的页面。 其中几个比较重要的数值:
- Max threads: 150 最大线程数
- Min spare threads: 25 最小空闲线程数
- Max spare threads: 75 最大空闲线程数
- Current thread count: 25 当前线程数
- Current thread busy: 2 当前繁忙线程数
GreaseMonkey这个插件大家都早已熟悉了。最近我遇到一个问题:需要让页面在调用完某个函数之后自动执行我的函数。 其实这个并不难,写个函数替换原有的函数即可:
function hook() {
var f = unsafeWindow.foo; // 保存旧函数
unsafeWindow.foo = function() { // 定义新函数
alert("Hello!"); // 先执行我们的处理
f(); // 再执行旧函数
}
}
然后加载到页面上:
setTimeout(hook, 1000);
这样,页面再执行foo函数时,就会先执行我们的alert("Hello!")了。
不过这个函数还有很大的问题。比如,原有函数的参数不能正确传给foo,返回值无法取出来,无法应用到对象中的方法,通用性不好等。 下面来一个个解决。
阅读全文 »通过把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下一切正常。
阅读全文 »在抓虾上看到一篇Web开发分析工具的文章(链接就免了),怎么远没有我用的东西好用呢? 还是介绍介绍我用的吧。由于平常开发只用FireFox,完成后再去调试IE, 所以这些工具绝大部分是针对FireFox的。
如果把Web通信从上到下分为许多层——XMLHttpRequest层,HTTP层,TCP层, 那么这些工具可以分别抓取每个层的通信数据进行分析,结合使用极其强大。
2008/12/31:另外可以参考daniel同学的Web开发常用工具一文,相信会大有帮助哦。
阅读全文 »经过两个多月的努力,这本名为《Web开发修炼之道——创建高可用性的Web内容》 (豆瓣链接, 出版社预告, 勘误表)的书终于要与大家见面了。 这恐怕是国内第一本讨论可用性(Accessibility)的中文书籍——在豆瓣上搜索“可用性”, 找到的都是usability、availability等,没发现 accessibility。 可能这也是中国的网站在可用性方面做得很差的原因之一吧。

原书名为《Design Accessible Web Sites》(豆瓣链接),
书很不错,刚刚开始翻译时fcicq还在豆瓣上推荐了一把。
不过我现在还没拿到书的ISBN,所以暂时没法将中文版放到豆瓣上,抱歉。拿到时再补上吧。
简单介绍一下书的内容吧。可用性(Accessibility)就是说让网站能在任何平台、任何浏览器上运行, 并且残障人士也能毫无障碍地使用网站。这就要求开发网站时必须做到:
- 符合标准(以便跨浏览器跨平台)
- 为图片、视频等加上文字描述(供不支持图片的浏览器使用,同时考虑盲人所用的屏幕阅读器)
- 使用易于阅读的字体和颜色(考虑弱视、色盲)
- 使用简洁易懂的语言(考虑理解能力弱的用户)
- 足够大的导航和链接(让运动不方便的用户容易点击)
- 避免使用闪烁效果(防止诱发癫痫症)
不幸的是,国内的网站在这些方面做得极其差劲(原谅我用极其这个词), 特别是本该为残障人士周全地考虑的政府网站,在这方面简直是一片空白。 希望这本书能为国内的网站设计提供参考。
下面是本书的内容简介,请点开阅读。
阅读全文 »memcached全面剖析的连载已经结束,翻译工作也已经全部完成了。 为了方便阅读,现将原来的翻译结果打包成PDF文档。可在本文末尾处下载。
原来的各篇翻译的地址如下:
- 第1章:http://tech.idv2.com/2008/07/10/memcached-001/
- 第2章:http://tech.idv2.com/2008/07/11/memcached-002/
- 第3章:http://tech.idv2.com/2008/07/16/memcached-003/
- 第4章:http://tech.idv2.com/2008/07/24/memcached-004/
- 第5章:http://tech.idv2.com/2008/07/31/memcached-005/
感光症癫痫(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.
警告:下記のビデオに激しい光の点滅が含まれています。視聴は自己責任でお願いします。特に光過敏性症候群の方はプレイしないでください。
阅读全文 »今天在开发时突然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]`'
