2006年7月28日星期五

google提供source hosting的幕后

原来subversion的开发者们都被google网罗过去了(出处)。google到底想干嘛?我真是越来越猜不透你了。我猜不透没关系,微软肯定很担心。我倒是希望google能更多的支持开源世界,加快开源软件的进步。

有时想的发散一点,公司跟国家有相似的地方。为什么美国能从建国到现在几百年稳健的发展?为什么日本的明治维新能迅速的富国强兵?为什么微软能独领软件行 业风骚10几年(从95年算起吧)?为什么google能迅速异军突起,俨然成为一个新帝国?这恐怕不是几个政治家或CEO做做秀就能办到的。值得思索 啊!美国和日本的历史值得研究。

BTW:中国人对帝国这个词有本能的抵触心理,其实帝国也有邪恶、正直或中性之分,google帝国?我能接受;美帝国?也还好啦;日本帝国?No way;)

gettext的用法的补充

developerwork上出了一篇文章,挺不错,有兴趣的可以看看。

使用 GTK+ 进行健壮的国际化

2006年7月24日星期一

Linux下纯软件的多头显示

我有一个破笔记本,一直没什么用处。我一直觉得我的显示器太小,梦想着能有两个显示器多头显示,但那需要两个显卡或者是支持多头显示的显卡,我都没有。
今天我才知道,原来用软件,就能利用这台笔记本的显示器实现多头显示。
这里有很详细的步骤说明
补充一点,因为现在大部分系统缺省X server都是不做TCP监听的,所以如果用文中的方法,就需要打开TCP监听。也许用ssl forward也可以,我还没有试。

2006年7月18日星期二

Gnome, Mono和.Net

一大早起来就看见这样一封信,信中对Gnome开发社区对.Net,对High Level语言的抵制表示了强烈的不满。作者的观点跟我的很相似,而且更深入。他指出,如果Gnome开发社区还把c语言作为主要的开发语言,就会失去大部分新生代开发人员。呵呵,我不是新生代,但是打死我我也不想用c来写GUI程序。
软件就是一层层的封装。在理想世界中,每个程序员只需要在满足他需求的层上工作,而他的工作是给出刚刚好足够的信息,向系统描述这个软件的特征。
这么多年的技术发展在很大程度上是朝着这个方向前进的,比如各种High level的编程语言,再比如ruby on rails,再比如.Net。
我以前说过,.net是个好技术。上帝因为害怕人类修成通往天堂的高塔,而让人类说不同的语言以限制人类的合作。在软件世界里,多种语言的存在也一直是知识积累再利用的巨大障碍。.Net在很大程度上解决了这个问题。
所以说,开源世界更需要.Net,一旦丰富的开源资源借助.Net的方式,可以方便快捷的使用,其力量真是不可估量。说不定这次微软养出的孩子最终要将微软送入坟墓了。
话说回来,目前开源世界的两个重量级桌面环境对新技术的支持、采用还相当欠缺,Gnome如此,KDE也好不到哪去。不过这并不妨碍大家现在就采用mono,来写你们的程序。
别犹豫了,赶快下载mono和monodevelop吧,用gtk sharp来写你们的程序,那可是在Windows,Unix,linux和MacOSX都能运行的哦:)

2006年7月16日星期日

gettext的用法

gettext是GNU世界里用来实现i18n的标准方式,下面用一个小例子来演示它的用法。
源文件gettext_demo.c
#include

#include
#include

int main()
{
// 设置程序的locale
setlocale(LC_ALL, "");
// 为你的程序选择一个domain
textdomain("gettext_demo");
// 为这个domain绑定一个目录,就用当前目录吧
bindtextdomain("gettext_demo", ".");
// 指定输出所用的编码,通常你不需要用它
bind_textdomain_codeset("gettext_demo", "UTF-8");

// 来,跟大家say hello一下
printf(gettext("Hello\n"));
return 1;
}

编译执行之:
$gcc gettext_demo.c
$./a.out
Hello

好像没什么变化,别急,让我们看看底层发生了什么!
$strace ./a.out
....(略去无关输出)
open("/workspace/learn/gettext/./zh_CN.UTF/LC_MESSAGES/gettext_demo.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/workspace/learn/gettext/./zh_CN/LC_MESSAGES/gettext_demo.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/workspace/learn/gettext/./zh.gb2312/LC_MESSAGES/gettext_demo.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/workspace/learn/gettext/./zh/LC_MESSAGES/gettext_demo.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
....(略去无关输出)

看起来,程序在试图找到一个叫gettext_demo.mo的文件。这个文件里保存了"Hello"在当前locale下应该被翻译成什么的信息。下面让我们来生成这个文件。
$xgettext gettext_demo.c // 从源文件里获取要翻译的字符串,得到一个叫message.po的文件
打开这个文件看看,稍微有点脑子的人就知道是怎么回事。你当然可以用vi之类的编辑器来编辑,不过还有专门的工具像poedit,kbabel,推荐使用这些工具,把msgid "Hello\n"对应的msgstr设成"你好\n"就算翻译完了。然后执行:
$msgfmt message.po
这样你得到一个message.mo的文件(po是potable object的意思,mo是machine object的意思),这个东东就是上面程序在找的gettext_demo.mo。下一步把message.mo放到合适的位置就行了。
$mkdir -p zh_CN.UTF/LC_MESSAGES
$mv message.mo zh_CN.UTF/LC_MESSAGES/gettext_demo.mo
再执行./a.out,程序就会输出“你好”了。

课外习题:
1. 研究一下bind_textdomain_codeset的用处

介绍两个开源的软件:blender和solfege

开源的软件多啊,说不准哪些就是你需要的。今天给大家介绍两个。
一个是blender,这是我见过的界面最cool、最好用、最有 创意的软件。它是用来做3D动画的,我曾经拿它做了新房的模型,效果惨不忍睹。不过这不能怪blender,它可是专业级的3D动画创作软件,《蜘蛛人》 就用过它,《elephants dream》更是完全用blender完成的。
还有一个是solfege,这是个音乐学习软件,可以拿来练练耳朵;)

python,gtk和多线程

前几天用python和Gtk写了个测试监控程序,主线程是GTK的图形界面,另外还起了一个后台线程定时运行测试脚本,检查测试结果。
写完一跑,发现后台线程没有运行。要是在主线程进入图形界面之前sleep一会,后台线程就能运行,但是主线程一醒,后台线程又停了。
先google一下,发现2003年有个哥们在python的mail list里问了同样的问题,可惜没人回答。再接着google就没有相关的内容了。这种迹象表明,该问题可能是个很傻的问题。从各方面看,这个问题都和GTK相关,于是就查pygtk的文档,果然找到这么个函数:

gtk.gdk.threads_init

这个函数可以让多个线程使用python解释器。这个函数要在gtk.main之前调用,如果不调用这个函数就调用gtk.main,那gtk.main所在的线程就会独占python解释器,使其他线程无法执行。

OK,加入这个函数,运行,两个线程跑得钢钢的。文档不余欺也。

使用glade生成图形界面的一个例子

胖胖同学问如何在一个glade文件里描述多个窗口,如何只描述窗口的一部分。我写了下面这个例子,希望能有所帮助。

源文件forpp.cpp:


#include


#include

int main(int argc, char** argv)

{

Gtk::Main kit(argc, argv);

Glib::RefPtr refXml = Gnome::Glade::Xml::create("forpp.glade", "window1");

Gtk::Window* pWnd = NULL;

Gtk::HPaned* pHP = NULL;

refXml->get_widget("window1", pWnd);

refXml->get_widget("hpaned1", pHP);


refXml = Gnome::Glade::Xml::create("forpp.glade", "frame1");

Gtk::Frame* pFr = NULL;

refXml->get_widget("frame1", pFr);

pHP->add2(*pFr);


Gtk::Main::run(*pWnd);

}


因为在这贴XML文件很麻烦,我就不把glade文件贴出来了。这个glade文件对应的窗口如下图:



2006年7月1日星期六

KDE抛弃autotools,转投cmake

来自LWN的文章
KDE4.0的编译配置系统不再使用automake、autoconf这一套工具,转而使用cmake。在cmake的支持下,kdelibs可以在Windows,Mac OS X,Linux,Unix上编译成功。
显然,KDE4的目标是要支持更多的平台,连Windows都在List上;)
另外,既然KDE4的开发者已经选择了cmake,被autotools弄得焦头烂额的诸位大可尝试一下。

PS:
早些日子,KDE的版本管理从cvs转向了svn。个人觉得,如果没有特殊的理由,现在已经没有必要使用CVS来管理版本了。

Google Trends的Missing feature

首先感谢Google,为我们提供了如此众多的惊人的工具。
然后再表达一下对Google的憎恨,因为它的存在,给我这样希望靠创意来谋生的人很大的压力:(
最后给Google提个意见:
Google Trends是个好东东,能找出某个关键词被世界各地搜索的次数、频数、变化趋势等,但是它缺少一个很重要的功能,即提供一个关键词的关联关键词列表。
很多时候用户想知道与某个关键词关联的关键词中哪个最Hot,而不是这个关键词本身。比如,我在Trends里搜索Game,并不是想看“Game”被大 家检索的统计信息,而是想知道大家都是用什么词+game一块搜索的,是“DOOM+game“还是”SIMS+game“。