星期三, 十月 31, 2007

开发者地图

这个帖子我有点不知道是该发在cblog还是eblog了,看在我今天没有给cblog发帖的份上,就发给cblog充个数吧。。。

这是Gnome的开发者地图Debian的开发者地图,从图上可以很方便的看出这些开源组织的地理分布,有些有意思的事情:
- 首先我当然关心我们的国人,还不错,在两个地图上都能看到我们同胞的坐标点,虽然只能用稀稀拉拉来形容。
- 欧洲和美国自然自然是两个大开发者聚居地,图上可以很容易看出来,那叫一个密啊。
- 南美的巴西不错哦,有超出中国的开发者数量。
- 俄罗斯人都哪去了?难道都做黑客去了。。。

当然地图是不能全信的(地图的坐标来自于开发者自己填写的用户信息),看看两张图上在南极洲正中都有一个坐标,我就不信有个世外高人躲在那个鬼地方开发Gnome和Debian。

星期二, 十月 30, 2007

SCM pattern

Pattern这个词对于程序员来说有着特殊的含义,各种各样的pattern层出不穷 -  deisgn pattern, architecture pattern... 这些都还没来得及学, 最近又接触了SCM pattern(来自于Software Configuration Management Patterns一书)。

SCM pattern主要关注软件配置管理方面的pattern,包括分支使用,build(这个词是我一直不知道的怎么用中文翻译的词,构建?编译?),集成(integration)等方面。但和其它pattern的书一样,语言简练精辟,晦涩难懂(这是我一直看不下去的原因),这可能是我对pattern留下的最深刻的印象了,看来是不适合我等粗俗之人啊。

我接触到的印象较好的SCM的知识,来自于SVN book,但是它通篇都没有提到pattern,无怪乎那么平易近人。

星期六, 十月 27, 2007

JavaScript印象

Javascript如此的有趣,它几乎是唯一对于程序员(programmer)和设计者(designer)都有用的语言,原因是它运行在网页中。对于程序员,如果需要客户端控制的动态网页时,Javascript是唯一选择了,对于设计者,需要页面效果时,Javascript也是不二选择。我曾经看过一种说法说:程序员通常认为Javascript过于不严谨(可能他们是把Javascript和Java比较了),而设计者则认为Javascript过于复杂(是啊,要学习写代码总是困难的),我没那么多讲究,我觉得Javascript还不错。

我数次"学习"过Javascript,但都因为没有持续的使用而慢慢淡忘了,不过有一个好处是现在再拿起来会快一些,虽然语言本身很快可以温习,但DOM还是要翻翻资料的(DOM是Javascript用来控制HTML文档的模型),手头有一本书还不错,可以推荐 ──《DOM Scripting》,稍嫌不爽的是这本书用了很多我不认识的单词,害的我字典一直翻 :)


星期四, 十月 25, 2007

《Learning Python》

不知道有没有在blog中赞过这本书,如果有的话,再赞一次也不算过分吧。

Oreilly的这本书介绍语言而非库,不到400页的篇幅应该不算大部头,但这本却是我最常翻看的Python参考书(截至到目前为止)。原因在于它实践性很强的系统介绍了Python"语言",对于一个非熟练Python程序员来说,Python有些地方的设计是如此的"有趣"(这个词比较中性,这里我不太敢用贬义词),没有一本好的语言参考是很难混的,而这本书满足了我这个小小的需求。

而至于库,相对来说就没那么"有趣"了,到Python网站看Reference,或者联系Google大哥,一般都能满意的解决。

星期三, 十月 24, 2007

python陷阱 - 变量作用域

这个程序会输出什么?
a = 1
def test_func():
  print a
  a = 2
  print a

print a
test_func()
print a
正确的答案是,test_func的第一个print会触发异常,这是因为python著名的"Global Unless Assigned"规则。
因为在test_func中有"a=2"这样的语句,这会导致test_func中a被作为局部变量,所以在执行第一个print a时会出错(此时尚未赋值)。解决方法是在 test_func 中加入global a这样的声明,声明甚至可以放在第一个print之后,但会导致一个告警,所以通常的写法都是写在a的引用之前,象这样:

def test_func():
  global a
  print a
  a = 2
  print a

星期二, 十月 23, 2007

Ajax 前生今世

IBM的网站上经常会有不错的文章,甚至是不错的中文文章,就如下面的两篇
http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/
http://www.ibm.com/developerworks/cn/web/wa-ajaxarch2.html

我的理解是:
WEB的早期是: 无状态客户端/无状态服务器/静态内容,
逐渐发展为:无状态客户端/无状态服务器/动态内容
再发展到:无状态客户端/有状态服务器/动态内容
而现如今则是: 有状态客户端/无状态服务器/动态内容

这里的发展不是替代的意思,而是出现了新的类型(针对不同的应用),也就是现在的Web已经复杂到以上四种架构并存,而Ajax正适应了最后一种架构,它是创建 有状态客户端/无状态服务器 Web的比较理想的方法。

难以想像以后还会怎么发展下去,这年头技术的进步快的让你稍一喘气就跟不上了。

星期日, 十月 21, 2007

如何切换widget的显示状态

这可是花了我一点时间的,我是想让一个widget切换它的显示状态,就是如果它是show的,我想调用hide,如果是hide,我想调用show,问题是如何得到它的显示状态? 方法是flags()接口,象这样:
 
if widget.flags() & gtk.VISIBLE:
  widget.hide()
else:
  widget.show()

嗯,似乎很简单,但问题马上来了,如何得到一个窗口是否被minimized(最小化)的状态呢? 等到用时再研究吧。


星期五, 十月 19, 2007

python tray icon支持

早期的pygtk中,为了支持trayicon,需要使用 egg.trayicon,这个模块可以支持gnome和kde,但不能在Windows下使用,我曾经试图用这个模块来实现trayicon,不过不幸没有成功。

而在2.10版本之后,出现了gtk.StatusIcon,这个gtk.StatusIcon更符合gtk的使用习惯,并且兼容了GNOME/KDE和Windows平台,一统天下,pygtk在安装之后,就自带了一个例子说明如何使用(一般是在/usr/lib/pygtk/2.0/demos/statusicon.py),相当的简洁。不过这个例子演示的是在tryicon上的右键操作,而不是左键,不过看看官方的说明文档,左键也不难实现的。

文档: http://www.pygtk.org/pygtk2reference/class-gtkstatusicon.html

星期四, 十月 11, 2007

makefile 的 $(wildcard)

gmake的$wildcard函数可以列举一个目录下的文件,通常的用法是$(wildcard *.cpp)之类的,但实际上gmake可以支持这类语法:
 $(wildcard */Makefile)
也就是说用wildcard来匹配所有的含makefile文件的子目录,甚至象这样的语法:
 $(wildcard */*/Makefile)
匹配二级子目录下的Makefile也能工作。

所以一些老的工具虽然看上去有些土,或不太容易上手,但由于经年的积累,它们可能非常的强大,一旦掌握,威力很大啊。