当前位置

技术

技术

What every programmer should know about memory

Ulrich Drepper 最近的大作,在 lwn.net 上 已经 免费 发布 到了 第 6 部分最后一个章节目前只有 lwn 的付费读者可以看到,普通读者还得静心等待一段时间才能一窥全貌。

Ulrich Drepper 是我所知道的 RedHat 的除 Ingo Molnar 之外的另一个大牛,(哦,不好意思,我还认识 RH 的一个小牛牛阿壮),以至于偶尔把这两个人搞混。Ingo 是内核高手,Ulrich 则是 glibc 强人...既然牛人已经说了这份文档讲的是 What every programmer should know about memory,所以我想咱们这种水平很糟糕的程序员还是老老实实的看看吧。

PS: 是否应该翻译成中文呢??

Topic: 

cPickle 和 marshal 到底哪个快?

为了将 python 对象得以持久化保持(比如为了 web app 的 session/cache 需要),我们不得不将其序列化后转成字符串扔进文件或者数据库里。

Python 提供了两个基于 C 的模块 cPickle 和 marshal 来做这个序列化反序列化的操作。marshal 貌似仅限于少数几种 python 内置数据对象,所以想象起来好像 marshal 比 cPickle 要快一些,而且我们自己做的几次benchmark好像也证明了这点。但实际上果真如此吗?

scaner 也曾写 blog 说明他的测试是 marshal 比 cPickle 快,但有留言说用同样的程序得到了相反的结论..

今天在搜索中发现有老外做过比较全面的测试(07年10月18日的文章),结论是在某些情况下--比如浮点数、长的字符串--cPickle 是比 marshal 要快滴。最后他的建议是: "...even for simple data structures, for a caching layer you might as well use cPickle; you are not particularly slower for the thing you're going to be doing a lot, and you get a bunch of (potential) benefits in return."

其测试程序在http://utcc.utoronto.ca/~cks/programs/python/marshal-vs-cpickle.py

Topic: 

Python for S60 1st Edition 1.4.0

Python S60 对 1st 的支持在 1.3.1 之后就不再提供官方支持了,可能觉得这部分用户群实在是太少了。

不过还是有某牛自制了 1.4.0 的 sis,让老机器用户仍然可以享受最新版 PyS60 的功能(比如对中文 SMS 的支持)

其地址是:http://cyke64.googlepages.com/pys60distribution (注意:发表本文时 googlepages 貌似正在被盾中...)

这个哥们还提供了一堆有意思的库(http://cyke64.googlepages.com/),有些不错的东西

Topic: 

生成 Google 翻译效果页面工具

这个题目有点长还有点拗口似乎。

话要说到去年底我翻译的这篇 web.py 0.2 教程,这个页面发布不久后,收到一封陌生人的 email,问我这个页面是手工做出来的,还是用工具做的。我据实回答。他说能不能做个工具自动做呢?我还真没想过这个问题,平时也很少翻译东东,所以就不了了之。但他的“拷问”倒是一直敲打着我。

最近 jQuery 玩了玩,于是做了这个工具来练手。如果要做到跟被翻译的页面风格一致,应该要另写一个程序去解析页面,把什么 <h1>、<p> 之类的拆出来,万一页面要是用 <div id="..."> 去控制格式,那就更不知该如何处理了,困难不小,头比较大,没有继续这个更高的需求。

欢迎有需要的人试用生成 Google 翻译效果页面工具

Topic: 

思维跳跃 -- 重新审视 .NET Framework

HttpWatch 一个很酷的功能就是告诉你哪些内容是直接 cache 的,哪些是 304 缓存的

Fiddler2 做不到这一点.... 那么何不俺自己开发一个?

但涉及到开发 BHO... 还是用 python + comtypes 来搞吧...

可 BHO 是要 dll 的,貌似 python 只能玩个 py2exe。

难道采用 C embed Python ?? 还是看看 IronPython 吧。

在 IronPython 网站上找到了 Pyc 这个例子。成功的按例子把脚本编译成 .exe(winform 的 HelloWorld 例子编译后不过 6kb 大小),看起来生成 dll 是没有问题的。

没有继续下去开发 BHO (经过这么一番浏览后俺已经很累了)。 只是想,按照这样方法做出来的 dll 大抵也可以做得很小,只不过需要运行系统上有一套 .NET Framework 罢了,这算什么,貌似很多软件现在都需要 .NET Framework 呢。

IronPython 主页上的一则消息吸引了俺的注意:Silverlight v1.1 Alpha includes IronPython support!

Silverlight 是什么?以前只知道它是 MS 推出的一项类似 Flash 的技术。Flash 是用 ActionScript 开发的,而 Silverlight 用什么语言开发,却一直没有研究过,想来也是一个 js-like 的语言而已。但......可以用 python 来开发 Silverlight 应用???????

立刻合上笔记本屏幕,仔细的想了想这里面的关系。
* .NET 是套完整的运行环境,所以 6k 的 exe 文件就可以画一个窗体
* .NET 是跨平台的(跨平台其实不太稀奇,但跨平台的运行环境就很稀奇了)
* .NET 是跨语言的 (这一点比 Java 强太多了)
* 而 Silverlight 是基于 .NET 的,跨浏览器的,RIA执行平台

我这才觉得自己算是稍微有点理解 .NET Framework 了。真是了不起,在PC终端上,微软的理念无人能比。(但它的公关经理好像不怎么称职,hehe)

附: 这段时间我每天有相当长的时候是用 IE7,而不是 Maxthon or Firefox。老实说,IE7 确实是一款不错的浏览器——对普通用户而言。今天尝试了最新的 Safari(310A18) + 最新的 WebKit,支持了中文输入,除了某些页面上中文显示有问题外,还是蛮顺手的。

Topic: 

推荐一款 IE 下的 JS 调试工具

前不久从 Ajaxian 上看到一个叫 Companion.JS 的东东发布了 0.2 版本。今天得空测试了一下,相当不错强烈推荐。

有意思的是这个工具支持 Firebug 的 console API. 感觉 Firebug 现在是确定了 JS 调试的权威地位,后来者都以它为标杆来追赶。

IE Developer Toolbar + Fiddler2 + Companion.JS,现在 IE 终于有了一个还过得去的调试环境。说不定哪天 MS 把 Companion.JS 也收购了,反正比 Facebook 便宜多了,哈

Topic: 

PhotoRec 恢复照片的功能还不错

前不久,向 U 盘上拷了一张照片打算去冲洗,但就在出门前,突然发现 U 盘无法访问,提示未格式化的驱动器...

这有何难,立刻想起曾两次挽回俺分区的 TestDisk,正好用来恢复分区。于是信心满满的执行,它也发现了 U 盘上的 FAT 分区表,预览前看了看分区表里的根目录信息,完全正确,写入!

随即俺就傻眼了,虽然恢复后的 U 盘可以访问了,看起来文件也都一个不拉的挺好,但文件内容统统都不对了..

懊恼中突然想起 TestDisk 作者还提供了一个数码照片恢复工具,在 TestDisk 目录里面就有,于是试了试,效果还不错,把丢的那张照片找回来了!!

PhotoRec 的工作起来是扫描所有磁道信息,发现可疑的曾经存有文件的数据(而且格式它能识别的)就 copy 出来,这样甚至可以起到一个 Undelete 的效果。俺 1G 的 U 盘最后恢复出的数据有好几G,当然实际上不少文件实际上数据是错误的了。

PhotoRec 除了能恢复照片,还能恢复 pdf、txt/html、doc、甚至 rm 等许多格式,强烈推荐!!

附:最后去冲洗店,把俺的 U 盘一插,就看见里面除了 1 张照片外又多了 2 个 .exe 文件和一个 autorun.inf。恶心的是和店员反馈他们的机器有木马,竟然满不在乎的说到处都是,也懒得管。真恐怖! 以后去数码冲印要小心

Topic: 

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!

附件大小
HTML 图标 input_replace_span.html1.7 KB
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: 
订阅 RSS - 技术