技术

jQuery 初探


记得两年前刚开始玩 flickr 的时候,贴心的使用体验一下子就征服了我。其中对一个更改照片主题的效果印象尤其深刻:鼠标移到照片的主题上,这条文本背景变成淡黄色;左键点击,文本变成输入框;输入新名字后回车,名字更改完毕。整个过程不像在操作网页,倒是像在使用文本编辑器。

由于对 html,javascript 所知甚少,隐藏在这神奇效果后面的技术令我叹服不止且念念不忘。随着后来看了一点点 Ajax 方面的东东,感觉到这应该是页面上的元素替换。这两天尝试了一下 jQuery,想起了这个当年让我耳目一新的页面效果,实现之:

  1.  
  2. $(document).ready( function() { //网页 ready 后加载此方法
  3.     $('span[id=email]') //定位到<span id="email">元素
  4.         .mouseover( function() { $(this).css("background-color",
  5. "#ffff90") }) //鼠标移上<span id="email">元素后改其css里background-
  6. color的值
  7.         .mouseout( function() { $(this).css("background-color",
  8. "white") }) //鼠标移离<span id="email">元素后改其css里background-
  9. color的值
  10.         .click( function() { //给<span id="email">元素绑定 click 事件
  11.             var origEmail = $(this).text() //取得<span>元素包含的文本
  12.             $(this).hide() //隐藏自身
  13.             $('<input name="email" value="' + origEmail + '" type="text"/>') //创建
  14. 一个<input>元素其值为原来的 email
  15.                 .appendTo("div#email") //把该元素添加到<div id="email">中
  16.                 .focus() //把焦点移到该元素上
  17.                 .keydown( function(ev) { //绑定 keydown 事件
  18.                     if (ev.which == 13) { //回车的键盘 key code 为 13
  19.                         var email = $(this).val() //取出<input>元素此时的值
  20.                         $(this).remove() //移除该<input>元素
  21.                         $('span[id=email]').text(email).show() //显示
  22. 原来的<span>元素并将 email 添加其中
  23.                     }                  
  24.                 })
  25.         })
  26. })

完成后,心情一阵悸动,哈哈,好久没这么爽了,两年来压在心头的谜团就这么解掉了。

示例页面:input_replace_span.html

更新:

上面的代码是精炼过的,本来面目可不是这样,花了许多时间 refine,将收获总结如下

1.用 hover 的方法可以替换 mouseover 和 mouseout,将两句话写在一句里面。但是在这个地方,hover 却还有些问题,input 变成 span 后,有时鼠标不在 span 上,它的背景色仍然是淡黄色(Fx 有此问题,IE 没有)

2.attr 修改属性的方法固然好,但是对于 style 属性因为 css 里面又有各种描述,所以 jQuery 做一个 css 方法不是白做的,理由见回复

3.在匿名函数里面,本元素用 $(this) 表示就 ok 了,没必要再用 selector 定位一次

4.span 在被 input 替换的时候,不用 remove,只用 hide 即可,到需要它的时候再 show 出来。这种方法明显对性能有好处,否则如果 remove 掉再 appendTo 进来时,还要重新绑定一系列事件响应函数

5.jQuery 的 API 文档里面对事件响应内的匿名函数的参数没有言及,它是可以传递参数的,代码里的 keydown 事件就传了 ev 进去

6.对于键盘响应的 key code,Fx 和 IE 支持的标准不同,网上的示例基本都是 key=window.event?ev.keyCode:ev.which 这样解决的。jQuery 包装了一层,所以在这里用 ev.which 即可

7.可以将 appendTo,keydown,focus 这些函数写在一条语句里面,不过保证性能的同时也要兼顾代码可读性

Write Less, Do More. Let's Go!

Topic: 技术 网络

关于 "直觉"

认识这么一个程序员,工作挺努力,也乐于拓展自己的知识面,理论基础、开发经验什么的也算积累了一些了,但写起程序来就是给人一种有劲使不出的感觉;百思不得其解,终于一天想明白了,他的问题是缺乏"直觉"。

我认为,对于编程工作来说,大多数情况下程序员是在做选择:用 A 模式还是 B 模式?用 C 方法还是 D 方法?E 成员应该是公有的还是被保护的?用 gdb 跟踪还是 tcpdump 听包?... 乃至查找问题是用 google 还是百度一下?

我所观察到这个程序员的情况就是:可能有一半重大问题的选择上,他首先去尝试错误的方法,尝试失败了再去寻找下一个可能的方法,或者直接在这条错误的道路上继续前进。

什么是写程序的"直觉"? 直觉就是能下意识的做出正确的判断,或者能尽早醒悟到"我这样做是不是有问题?"。它是对以往经验的有效积累,能在很短时间内判断出最有效的路径的能力。

这种直觉能不能培养和训练?我想是可以的。后来私下和他就这个不足谈了谈,希望他以后能成为一个优秀的程序员。 :)

Topic: 技术

今日发现之 connlimit

connlimit 是 netfilter/iptables 的一个扩展,用来限制并发连接数,规则甚至可以限制某个子网的总并发数,用来挡攻击可以说再好不过。

实际上我计划的是用它来限制主机向外的连接... 比如与其费尽心思做一个 mysql 连接池避免耗尽 mysql server 连接上限,说不定还不如暴力的用这个模块直接限制到 mysqld 3306 的连接数目来得爽快。

我打算在 AS3 上使用它,同时并不打算重新编译整个内核.. 现在可以确认在这个平台上,使用 netfilter team 第一次正式发布的 P-O-M 就可以(20040302),从第二次发布起就只能在 2.4.22 之后的内核上工作了。

试用 P-O-M 的过程中还发现自 20060726 开始,connlimit 就神秘的从 snapshot 里面消失了 (从 CU 上看,netfilter 在 20050919 还一次性少了 1/3 的模块),现在 netfilter 的邮件列表归档也无法访问了,不晓得出了什么状况。

不过在搜索中发现一年以后(20070715)有某牛人 connlimit 合并到 2.6 内核里面,换句话说就是从 2.6.23 开始,无需 P-O-M 就可以直接编译出 connlimit 了.

从目前看,20050918 的 P-O-M 应该是功能最全的一个版本了(但很多只能在 2.4 内核上跑),想要的搜索一下 patch-o-matic-ng-20050918.tar.bz2 应该还能找到。

Topic: 技术

编译了一个 FastCGI 的 Apache 2.2 模块


下一个项目打算采用 FastCGI 部署,对于习惯在 Windows 桌面环境里开发的程序员,开发环境计划配置成 Apache + mod_fastcgi/mod_rewrite,通过 FastCGIExternalServer 配置连接到本机的 fastcgi 进程。

现在 Apache 主流版本已经是 2.2.x,但 http://www.fastcgi.com/dist/ 里提供的 dll 不晓得为什么配置成禁止下载。于是就从源码(mod_fastcgi-SNAP-0709231442)编译了一份(见附件 http://www.dup2.org/files/mod_fastcgi.dll
for Apache 2.2.x win32)

以前写过一篇里面提到如何在 Win32 下编译的 apache module 的...

cl /MD /D "WIN32" /c fcgi_buf.c
cl /MD /D "WIN32" /c fcgi_config.c
cl /MD /D "WIN32" /c fcgi_pm.c
cl /MD /D "WIN32" /c fcgi_protocol.c
cl /MD /D "WIN32" /c fcgi_util.c
cl /MD /D "WIN32" /c mod_fastcgi.c

link /DLL mod_fastcgi.obj fcgi_util.obj fcgi_protocol.obj 
 fcgi_pm.obj fcgi_config.obj fcgi_buf.obj 
 libhttpd.lib libapr-1.lib libaprutil-1.lib ws2_32.lib

用更复杂的编译选项可以获得一个稍微小一些的 dll (参考 apache win32 的编译参数)
cl /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "SHARED_MODULE" /FD /c *.c
link /DLL /nologo /subsystem:console /incremental:no ......

Topic: 技术

web.py 的最新消息

1. session 支持已经完成 (很难想象一个 web framework 居然以前一直没有 session, 是不是? )

这个是在 0.21 branch 上开发的,我已经在俺业余写的一个 web 工具上应用。马马虎虎,对于我自己的一个需求——登录后浏览器会话周期内 session 有效——需要额外配置几个参数才能工作,不是太直观;而且还没有找到全局配置后自动应用在每个 ctx 里的办法

2. web.py 已经全部转换为 bazaar 进行管理,抛弃了以前的 svn。

bazaar 是一个 pure python 应用,Ubuntu 好像是主要支持者之一

3. web.py 0.3 roadmap 前两天公布了,老代码不兼容,“There will be some changes to API, which breaks the backward compatability. But I promise, it is not going to change very much.”

不过我喜欢 0.3 用 return 代替了 print, 这是否意味着我以后可以用 print 来向 console 上输出了?有时间的话打算尝试一下

session 支持已经合并进入了主干,虽然还不能正常工作,但可以确认 0.3 版本将正式带上 session 支持

Topic: 技术

没有垃圾语言,只有垃圾程序员

前不久在 python-cn 列表上有人讨论 D 语言,然后有哥们一句:垃圾语言

今早听老婆 fwd 某达人的话:没有垃圾食品,只有垃圾吃法

突然回想起前几天看的这个 thread,遂发此感

Topic: 技术

如何突破 kmalloc 的限制

周五有人通过某渠道知道俺曾经做过 Linux 内核模块,于是特意来请俺午饭,问了我这个问题。kmalloc 好像是总共只能使用 2M 内存的,如果用更多的就只能用 vmalloc,但其性能很糟糕;我所知道解决办法非常简单:启动系统的时候增加一个 mem=xxx 启动参数,让内核不去管理后面的那部分内存,然后在模块里面把后面的内存映射过来获得一大块连续的地址,以后根据自己的需要在那块空间上操作就可以了。

不过说到后来,映射地址的函数是什么记不得了,回到计算机前 google 了好几个关键词,最后终于确认是 ioremap 这个函数,赶快记在 blog 里,避免下次遗忘。

回想起来作为一个 C 程序员其实挺幸运的:这意味着在计算机上你可以做任何事情(前提是一个 Linux or BSD 操作系统);而且随着经验增长,去理解其他语言不是难事——由 C 入 script 易,由 script 入 C 难。

再转载一篇好玩的报导:某人做了个统计,2.6.22 内核代码中共有 151,809 的结尾空白字符;如果提交 patch 把它们全部去掉的话,那么大概需要一个 15M,共 455437 行 的 patch。然后有人指出,在 2001 的统计是有 224,654 个结尾空白,看来这几年黑客们确实是在卖力地去除空格。突然想到一个问题,vim 或 emacs 都应该能配置成自动去除尾空格吧?

Topic: 技术

这段时间和人闲聊的只字片语

问:为什么用 apr 而不是 glib

答:因为 glib 没有网络封装,倒是有一个 gnet,但 RH AS4 没有包括其 RPM.. 这是我选择 apr 的三个原因之一

zhb:给空中网的 J2ME 定制一个程序2个月就在几百款手机上测试通过;但给三星或中兴做项目,5个C++程序员半年都搞不定

qyb:这个世界上只有这么几种平台——Win32、Windows Mobile、J2ME、S60、J2EE、PHP(或者准确说是 AMP)、Linux...现在浏览器也可以算是一种平台了。只有针对平台做开发,才能以最小的代价获得尽可能高的收益

以前我总说“浏览器即桌面”,以后要更正成“浏览器即平台”了。这意味这 JavaScript 程序员是一个严肃的职业,正如十年前在 Win 3.1 上用 OWL 开发一样

平台意味着标准化,这就又意味着低成本和高质量

Joel 所言,Python 大概算是半个平台

今天 Facebook 发布了 FBJS... 谁会是中国第一个发布自己 js 库的互联网公司呢?

对 webmail 这样应用来说,服务器端选择怎么样的语言已经无所谓——因为重点是在前端的 AJAX 和强健的后端服务——即使是用 C++ 来输出 XML or JSON 也没有什么好奇怪的。

Topic: 商业 技术

发现 gmail 的线索功能并不是依赖 Message-ID, In-Reply-To, References 标准实现的

sohu.com 内部开发的 MUA 部分已经能支持这个标准了。

特意在邮件列表上试了一下,修改了缺省的标题后发出,邮件列表自己能正确的归档,见:http://python.cn/pipermail/python-chinese/2007-September/thread.html

但是在 gmail 里面把它和别的区分开了..

联想起这段时间用邮件向 google groups 发信,总是不能和回信正确的排在一起,看来 google 即使是自己的产品也没有完全打理好.

莫非 google 的实现方式是首先排序近似主题,然后再根据 Message-ID 等字段做进一步处理 ???

Topic: 技术

解决 apr.h:270: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘apr_off_t’

尝试 apr 开发,什么都没有做,就是 include 了一下 apr.h,就出了这个错误.

上网搜了一下,很多人都碰到该故障,包括 xjb 同学

质疑 apache 的代码而动手改之可不是我的风格,仔细在 google 里面查找结果,发现编译应该用 pkg-config 来自动配置编译参数

cc foo.c -o foo `pkg-config apr-1 --cflags` 

联想到另外一个很常见的库 glib 也是用 pkg-config 来自动的配置的,所以建议在引用别人的库之前(尤其是这种系统预编译好的),先检查一下 /usr/lib/pkgconfig/ 目录下,看看有没有对应的 .pc 存在

Update: 我系统上 pkg-config 的结果就是 -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I/usr/include/apr-1.0

Topic: 技术
订阅 RSS - 技术 | BT的花