Meet us every second Tuesday of the month!
Text Size






libelf-devel is required when building kernel module

For most documents about kernel module building just need a Makefile like this,

HELLO = helloworld

obj-m += $(HELLO).o

$(HELLO)-objs := hello.o world.o

KERNEL_SOURCE := /lib/modules/`uname -r`/build/


        $(MAKE) -C $(KERNEL_SOURCE) M=`pwd` modules


        $(MAKE) -C $(KERNEL_SOURCE) M=`pwd` clean

        $(RM) Module.markers modules.order

Then type “make” will make everything set. (Of cause source of current kernel is ready at /lib/modules/`uname -r`/build).

But yesterday when I tried to build a kernel module for Linux-4.6-rc5 (openSUSE vanilla) kernel, I observed an error never saw before.

helloworld> make

make -C /lib/modules/`uname -r`/build/ M=`pwd` modules

make[1]: Entering directory ‘/home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla’

make[2]: *** No rule to make target ‘/home/colyli/source/tmp/helloworld/hello.o’, needed by ‘/home/colyli/source/tmp/helloworld/helloworld.o’.  Stop.

Makefile:1428: recipe for target ‘_module_/home/colyli/source/tmp/helloworld’ failed

make[1]: *** [_module_/home/colyli/source/tmp/helloworld] Error 2

make[1]: Leaving directory ‘/home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla’

Makefile:10: recipe for target ‘default’ failed

make: *** [default] Error 2

It seems nothing missed, but the error message was there.  Today a friend (Chang Liu from Memblaze) tells me maybe I should check the output of “make modules_prepare” in the kernel source directory, here is my result,

linux-4.6-rc5-vanilla> make modules_prepare

Makefile:1016: “Cannot use CONFIG_STACK_VALIDATION, please install libelf-dev or elfutils-libelf-devel”

This is an informative clue, so I install libelf-dev package and re-run “make modules_prepare”,

linux-4.6-rc5-vanilla> make modules_prepare

  CHK     include/config/kernel.release

  CHK     include/generated/uapi/linux/version.h

  CHK     include/generated/utsrelease.h

  CHK     include/generated/bounds.h

  CHK     include/generated/timeconst.h

  CHK     include/generated/asm-offsets.h

  CALL    scripts/

  DESCEND  objtool

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/fixdep.o

  LD       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/fixdep-in.o

  LINK     /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/fixdep

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/exec-cmd.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/help.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/pager.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/parse-options.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/run-command.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/sigchain.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/subcmd-config.o

  LD       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/libsubcmd-in.o

  AR       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/libsubcmd.a

  GEN      /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/arch/x86/insn/inat-tables.c

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/arch/x86/decode.o

  LD       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/arch/x86/objtool-in.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/builtin-check.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/elf.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/special.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/objtool.o

  CC       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/libstring.o

  LD       /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/objtool-in.o

  LINK     /home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla/tools/objtool/objtool

No complain anymore, then I back to kernel module source directory, run “make” again,

helloworld> make

make -C /lib/modules/`uname -r`/build/ M=`pwd` modules

make[1]: Entering directory ‘/home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla’

  CC [M]  /home/colyli/source/tmp/helloworld/hello.o

  CC [M]  /home/colyli/source/tmp/helloworld/world.o

  LD [M]  /home/colyli/source/tmp/helloworld/helloworld.o

  Building modules, stage 2.

  MODPOST 1 modules

  CC      /home/colyli/source/tmp/helloworld/helloworld.mod.o

  LD [M]  /home/colyli/source/tmp/helloworld/helloworld.ko

make[1]: Leaving directory ‘/home/colyli/source/suse-kernel/patched/linux-4.6-rc5-vanilla’

Everything is cool, the kernel module is built. So installing libelf-devel package solve the problem.

But it is still not clear to me, why missing libelf-devel may cause kernel module building failed. If you know the reason, please give me a hint. Thanks in advance.

Happy Hardware Freedom Day!

Today is the new selected date for Hardware Freedom Day. We did a community survey a few months back and that was by far the most popular time. While our website is back up the wiki and registration are still down though. Considering the status we’re hoping to get things back up and encourage people who missed the date to celebrate a HFD on their schedule. Following up our mail list you may know there are events in Barcelona and India or can simply ping us there.

Thank you all and happy HFD!

Happy Document Freedom Day

Today is Document Freedom Day. As in the past 8 years we celebrate DFD on the last Wednesday of March all around the world. While the date is recommended this year DFD is being celebrated from March 16th to April 5th so far (we’ re still getting new registration as of this writing) .

DFD is the international day to celebrate and raise awareness of Open Standards. Open Standards goes beyond essays and spreadsheets and covers all digital formats from artwork, sheet and recorded music, email, or statistics. They provide freedom from data lock-in and the subsequent supplier lock-in.

Today people around the globe come together to run local events and let the public know about freedom of information accessibility. Join us by attending an event close to you, help spreading the word or see other ways of how to get involved.

Happy DFD to all!

Celebrate Document Freedom Day on March 30

The FSFE has handed over Document Freedom Day to us earlier this year and while it took us a bit of time to get familiar with the way the current DFD website handles the events registration we have been steadily gathering more and more locations all over the world. So Document Freedom Day is happening on the last Wednesday of March, which is March 30th this year and Latin America seems very active in promoting Open Standards. We are very happy to meet new people thanks to the effort and will also celebrate our local DFD in Phnom Penh but slightly later on April 5th. If you are in the area please drop by, and if not please check the Document Freedom Day website for an event in your area. Happy DFD!


因为爱人小鱼在墨尔本机场工作,一家就搬到了墨尔本。一开始住在Brunswick,Sydney Street附近,街旧店旧房旧。这算是本地特色,百年老街,法律保护,不能改扩建。寄宿别人家,没有办法做饭,街上食物也乏善可陈,还吃到一家穆斯林做的半生的肉馅,小鱼拒绝付钱,店家也没办法。后来我终于考到驾照,于是租到离机场近的房子(没有驾照的话,可选的住处太少),前天搬进新宅,总算日子好过一点。




机场近处属于City of Hume,居民复杂,我们早上吃阿拉伯人的早餐,中午吃印度人做的咖喱,晚上吃土尔其人的烤土豆,大家说什么语言都不懂,总是担心各色人种之中有坏人。坏人也许有,我们没遇上,愣头青确实遇上了,晚上又开快车又鸣笛的就是,估计是酒也喝了不少。

FlightGear 官方手册中文翻译全部完成

最近花了一些时间,重新翻译了官方手册 Getstart。利用官方发布 3.4 之后一直到下一个版本 2016.1.0 之前的空隙时间,抓紧将所有都翻译好了。 下载 PDF 文件: 翻译项目地址: 项目使用了 CI 系统帮助构建,可以大幅减少本地构建的开销。不过我依旧使用本地了本地构建,为了使最终效果达到最好。README 文件详细讲解了如何在 Debian/Ubuntu 下从源码构建手册的过程。 为了与英文手册兼容,也为了更方便的跟上官方发布的脚步。依旧使用 Latex 语言编写,为了兼容中文我增加了 xeCJK 包,对手册代码做了大量的hack,编译命令也从pdflatex改成了 xelatex,虽然与原文保持了兼容,但缺点是目前看来只能编译 PDF,而不能编译 HTML。而且这个改动只对中文有效,若编译其他语言可能会出现问题,所以这个翻译基本就算是 Chinese Only 了。毕竟我对 Latex 不是很熟悉,很多地方都是现学现卖,大量 Dirty hack 也可以在代码里发现,若出现问题也非我本人力所能及。 这次把所有内容都翻译了,从 FlightGear 的安装到配置,飞行教程,还有最后的附录,包括一大堆贡献者的名字和他们的贡献介绍。翻译快完成时才注意到此网站竟然也有中文翻译的教程,但并不全,缺失了很多内容。我的翻译可以算是补充和提高了既有翻译。 有关民航相关专业名词和飞行相关技能的中文翻译,参考了《私用飞行员教程》和《商用飞行员教程》(2003,西南交通大学出版社,张泽龙主编),以及中国民航网站的公开可访问的内容,另外还有台湾飞友翻译的 FAA 《飞行员航空知识手册》(2003版)。在翻译过程中我尽力保证航空专业性。但也注重新人易读性,对里面出现的很多专业内容我增加了页脚的“译者注”,这在第八、第九、第十和第十一章的飞行教程里更常出现,以方便新手入门。翻译过程中也参考过一些非授权内容,比如真实塞斯纳172P的飞行手册(网上搜出来的)等。 手册里所有出现的教程,我都亲自在 FlightGear 里试飞过,可保证教程的真实有效可操作性。 话说,我是2003年开始入坑飞行模拟的,早年从微软 FS2002 开始一直飞到 FSX。后来加入了中国模拟飞行组织(CFSO),也许有人听说过这个组织,现在已经不复存在了。我的 CFSO 编号是 3192。后来还在 IVAO 和 VATSIM 里都有飞过,也做过虚拟空中交通管制。我从 2008 年开始关注 FlightGear,2012 年加入到 FlightGear 官方社区里,很希望可以为这款自由软件的本地化做自己的贡献。 任何人对此翻译项目有任何想法都可以提出,可以在 Github 项目页面直接提交 issuse。若懂 Latex 那就太好了,欢迎直接提交 Pull Request!也欢迎有经验的朋友不吝赐教,大家一起完善 FlightGear 的中文本地化。 后面,我可能会开始翻译 FlightGear 的界面,目前还不是中文的,争取能在最新的 2016.1.0 版本中加入中文界面。

Securing DNS Traffic in China


DNS poisoning is one of the most common cause of nuisance when accessing websites
that are outside this 1.4 billion-people Oriental country. So far, the best way to protect yourself from this trouble is to route all your DNS traffic through an encrypted channel, and the method I am going to introduce is DNSCrypt. There is not yet a standard for encrypted DNS, DNSCrypt is a project done by OpenDNS. According my experience, DNSCrypt is very reliable and robust, the cryptography of the protocol is called DNSCurve, which is a public-key crypto that employes an extremely strong elliptic-curve cryptography called Curve25519.

If you have read my previous writing, you should know my setup is a Raspberry Pi, and so the rest of this article is based on that, running Raspbian. Dnsmasq will be used as the first DNS caching proxy to serve incoming DNS queries from machines on the network. If the queried domain name is a China one, the request will be served by a China DNS. This is necessary because for some domains, answers from DNS servers in China and global ones could be different. If the requested domain does not belong to any known China domains, the request will be forwarded to dnscrypt-proxy, which will ask a DNSCrypt server for an answer.

After DNSCrypt is used, your DNS traffic will look like this:

                                             |   China DNS server   |
                                      +----> |                      | 
                                      |      | e.g. |
                                    China    +----------------------+
                                | +-------+   Other   +----------------+|
       +------+                 | |dnsmasq|---------->| dnscrypt-proxy ||
       | Host |-- DNS query --> | +-------+  domains  +----------------+|
       +------+                 |                              |        |
                                |            Raspberry Pi      |        |
                                                       |DNSCrypt server|

Setting up DNSCrypt

As illustrated in the above diagram, dnscrypt-proxy is the piece of software that handles DNSCrypt, but it is not available in Raspbian’s Wheezy and Jessie releases, only in testing (currently Stretch). You can either compile it yourself, or grab the debian package I built and install it. You can find the package here. It is based on the Raspbian package in testing repo, with some modification to debian packaging files, since the one in testing depends on systemd, which had not yet been adopted when Wheezy was released.

If you really want to build the package yourself, first install the libsodium packages. The package are also not available in Wheezy repo but the ones from testing, libsodium13_1.0.3-1_armhf.deb and libsodium-dev_1.0.3-1_armhf.deb, can be installed without any problem. Download and install them, then follow these steps to build your dnscrypt-proxy package:

$ sudo apt-get install autotools-dev debhelper pkg-config
$ git clone
$ cd dnscrypt-proxy-raspbian-wheezy.git
$ fakeroot debian/rules binary

After dnscrypt-proxy is installed, you have to update the port it uses. Change DNSCRYPT_PROXY_LOCAL_ADDRESS in /etc/default/dnscrypt-proxy to another port other than 53 (as it will be used by dnsmasq later), like this:


You can also change the remote DNSCrypt server, but since the default (cisco) works well for me, I left it unchanged.

Now test it to make sure it works as expected:

$ dig @localhost -p 5353

; <
> DiG 9.8.4-rpz2+rl005.12-P1 <
> @localhost -p 5353
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9735
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

; EDNS: version: 0, flags:; udp: 4096
;      IN  A

;; ANSWER SECTION:   2725    IN  CNAME 47 IN  A

;; Query time: 140 msec
;; WHEN: Mon Jan 18 00:39:36 2016
;; MSG SIZE  rcvd: 90

$ dig @localhost -p 5353

; <
> DiG 9.8.4-rpz2+rl005.12-P1 <
> @localhost -p 5353
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22371
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

; EDNS: version: 0, flags:; udp: 4096
;       IN  A

;; ANSWER SECTION:    2733    IN  CNAME    3580    IN  CNAME 1261 IN CNAME  20  IN  A  20  IN  A

;; Query time: 125 msec
;; WHEN: Mon Jan 18 00:38:25 2016
;; MSG SIZE  rcvd: 171

Setting up dnsmasq

Dnsmasq is very common and is available in Raspbian, installing it is easy:

$ sudo apt-get install dnsmasq

Now we have to do some configuration in /etc/dnsmasq.conf. These are my recommended settings. Please note that the interface option is the network interface that dnsmasq will serve, and in my case that is wlan0. You have to change it to the one that applies to your case.


Now comes the interesting part. We are going to tell dnsmasq to use a China DNS server ( in my example) for China domains and DNSCrypt server for all others. This is done by using the server option in /etc/dnsmasq.conf. Here is an example:

# Add other name servers here, with domain specs if they are for
# non-public domains.

This is pretty straightforward. The last line tells dnsmasq to use your dnscrypt proxy if the domain you query does not match any China domains. In my config file there are 12238 lines for China domains so I’m not going to post them all here, you can get the snippet of my dnsmasq.conf here, and put it into your own dnsmasq.conf. The problem is to maintain the list for all China hosts. I am now using the list from the fqrouter project, it has been serving me well, since most common domains are already there. What’s worrying is due to the abandon of the project by it’s author, the list is now unmaintained. If you know a more updated list, please let me know!

The post Securing DNS Traffic in China appeared first on Anthony Wong.

Debian 哀悼 Ian Murdock 離世 上發佈了 Ian Murdock 的死訊,由於對 Ian 十分敬佩,看到之後立馬把它翻譯過來,本來已經在上月31號翻好並發到 debian-publicity 郵件列表,可是不知什麼原因那邊一直沒收到(已經用了兩個不同的 email)。由於剛好那段時間在日本旅遊,也就沒太注意。今天打算再看看什麼問題的時候,發現 Anthony Fok 已經把另一篇由 Bootingman 翻譯的中文版放上網站,既然如此我也不好把它換掉。可是翻譯畢竟已經完成,而且還花了點心血,結果還算滿意,因此就在這公佈一下。


Ian Murdock 是一位自由/開源軟件的忠實擁護者、一名父親、兒子、以及 Debian 中的 ‘ian’,我們懷著沉重的心情,對 Ian 的離世致以深切哀悼。

Ian 於 1993 年 8 月啓動 Debian 計劃,並於同年不久推出首個版本。之後,Debian 逐漸成爲世界上的一個通用作業系統,無論從嵌入式設備,乃至國際太空站,皆能尋到它的蹤跡。

Ian 在創造 Debian 發行版與發展社羣文化時,無不專注於確保在道德層面,抑或技術層面,所做的事情都是正確的。譬如每個版本只會在最终完備時發佈,而 Debian 計劃對自由軟件的堅定立場,現已被視爲自由與開源領域的標準。

Ian 對於做正確事情的執著,使得他在 Debian 及往後的日子裏,一直朝向最美好的未來邁進。

Ian 的夢想猶在,Debian 社羣仍然非常活躍,上千的開發人員奉獻數不盡的日日夜夜,帶給世界一個穩定及安全的作業系統。

在這個傷痛的時刻,Debian 社羣眾人與 Ian 的家人心繫一起。他的家人亦請求各位,在這段艱難時期重視他們的私隱,我們對此表示尊重。各位來自 Debian 以及廣大 Linux 社羣的朋友,請將您們的慰問發送至,所有唁函將被永遠保存。

譯者:黃彥邦 (Anthony Wong)

The post Debian 哀悼 Ian Murdock 離世 appeared first on Anthony Wong.


花了一点时间,写了一个XMPP+OTR的快速上手指南。之前曾写过一篇文章,已经安利过XMPP的种种好处了。 这次使用Libreoffice,做了一个两页纸的教程,以方便自由开源社群活动时使用。 下载 PDF版。目前只有简体中文版,若有人想帮忙,可以翻译为其他语言。ODT源文件在此


声明:此文只代表我个人浅浅的认知观点,有任何不妥之处欢迎指正! 本文比较了两岸草根开源社群之间的异同,提出了草根社群共同面对的挑战和压力。也许两岸开源社群深度合作,才能解决这些问题吧。本来计划在9月份完成本文,却先后因为个人的感情变故、工作转变和亲人生病亡故一直拖到年底。
2014 年参加完台湾 COSCUP 以后我写了《两岸开源文化面面观》一文,在两岸开源社群中引发讨论。甚至还引起台湾出版业巨擘郝明义先生的关注,并在今年9月出版的他的新书《如果台湾四周是海洋》中提到并引用,同时郝先生也亲自参加了今年的台湾 COSCUP 2015。一年后,当我再回头看这篇文章时,难免觉得仍然有些片面,缺少实践考察和足够广泛的了解,还有很多地方需要再来补足。 从 2014 到 2015 这一年,通过各种平台,我不断与对岸的草根开源社群保持联系,持续考察和比较两岸开源社群的差异。今年参加 COSCUP 2015 期间,更是想办法补足之前缺失的地方,特别是与去年没能深入交流的朋友,加深了联系和交流,又与某些“COSCUP-Hater”聊,听听他们的看法。今年不仅与年轻人聊,更与年纪大的人交流,与传统大公司的人员交流,以获取更多"世代"之间的看法。与去年参加 COSCUP 之后对台湾开源社群的盛赞不同,今年我更多了几分理性和开明。也许也与这一年多来我本人心智看法的变动有关系。 [caption id="attachment_1208" align="aligncenter" width="500"]COSCUP 2015 的主题是“开放文化” COSCUP 2015 的主题是“开放文化”[/caption] 近几年,我更偏重去中心化、草根化的社群治理,所以这次去台湾完全只关注草根社群,已经不再丝毫考虑其他组织形式。决定在去年《两岸开源文化面面观》一文的基础上,再写一篇《两岸开源社群面面观》。

散兵游勇 VS 自治共荣

大陆的草根开源社群,很难有形成规模,形成社群优势的。即便是我参与的北京Linux用户组(BLUG)也无法很好的发挥社群优势,这与社群成员闲散,社群整体偏向自由的风格是密不可分的。然而更多的草根社群,则是因为太过闲散,无法组织起有效的开发,或组织新的活动,也就无法产生什么新的价值,大量曾经活跃的社群名存实亡。产生这个问题的原因是,社群成员个人自治能力欠缺,总希望让别人来帮忙,没有意识到自己动手治理自己的社群。 [caption id="attachment_1207" align="aligncenter" width="500"]参加 Hacking Thursday 和 WoFOSS 联合举办的活动 参加 Hacking Thursday 和 WoFOSS 联合举办的活动[/caption] 相对来说,台湾开源社群的自治能力很强,成员的自治能力,自我负责的意识也比大陆强一些。这次在台湾恰逢 Hacking ThursdayWoFOSS 两个社群一起联合举办活动,在参加活动的过程中,我与很多新朋友交流,发现台湾开源社群成员的自主意识比较强,社群自我治理的能力比较强。也就是相对大陆开源社群而言,台湾的开源社群更加成熟,有更多自身的价值,这样就能有稳定的社群文化输出,有更稳定的社群影响力。关于这一点,本文下面会多次提到。

商业导向 VS 社群主导

从成果的角度来比较,这么多年大陆几乎没有在国际上很响当当的,或具有开创性的开源项目,也许可以想起来的是阿里巴巴的 Tengine 比较国际知名,然而却不是一个由草根社群发起或维护的开源项目。OSChina网站收录了 5800 多个国产开源软件,看看有哪些是国际知名或有国际开创性的,有哪些是真正由草根社群维护或主导的。我的意思不是大陆没有国际知名的,像 fcitx 输入法框架、文泉驿字体等等也有一些,真正具有开创性和全球普遍应用的少很多。即便有,往往也不是由草根社群来维护和传承的。 既然没有自己的国际开源项目,那么我们就在现有的国际项目里挤进自己的位置吧。借着民族主义和政府”自主可控“的想法,比如国内某超级大公司(不能说其名字),鼓励公司员工贡献到国际主流开源项目里,或者从开源基金会的成员里挖人,比如 Linux 基金会、Docker 基金会、OpenStack 基金会、Linaro 等等。这家大公司贡献的同时,更利用强大的财力和人员优势,可以从这些基金会中争取到足够的话语权,甚至影响这些基金会最终为己所用,最终可以服务其商业目的,甚至为民族主义和政府的“自主可控”背书! 这次在台湾的一个收获是,听了 LXDE 桌面环境的作者,同时也是 Android 项目的主要贡献者 Jim Huang (黄敬群,Jserv) 的封麦演讲。在演讲中,他回顾了台湾这十几年来开源历程,其中一个个响当当的开源项目,让我知道除了 LXDE 和 PCManX 以外,还有那么多国际知名的开源项目,比如 CLE(中文化的Linux桌面)、Open Webmail,Firefox OS(台湾 Mozilla 主导),MCLinker(LLVM 链接器,MediaTek 开发),uming/ukai 自由字体……除少数外,几乎没有大公司的主导或者影响。 [caption id="attachment_1204" align="aligncenter" width="500"]IMAG0657 黄敬群在 COSCUP 2015 的封麦演讲[/caption] 草根社群基于兴趣开发的开源项目,在大陆并不是没有,最终往往还没成气候就死掉,或者被大公司收入囊中,亦或者封闭起来自己创业,沦为商战炮灰。在商业大潮中,我们需要涌现更多由草根底层社群维护的开源项目,这需要从社群治理到项目管理等多方面共同入手和改变。

学校领导 VS 学生自治

草根社群的一个重要组成和人才来源就是学生社团。自从去年在 COSCUP 上知道了台湾的 SITCON(学生计算机年会) 之后就一直很关注此组织的发展和其活动方式,我还曾观看 SITCON 2015 的在线直播。 除了办会,还在这两年推出了夏令营,社群讨论会等等多种活动形式。在我看来,像 SITCON 这种跨学校间的大范围社团联盟组织,具有非常强的生命力和社群影响力。今年 COSCUP 2015 上,无论是学生志愿者还是演讲者,很多都是 SITCON 的成员。他们在传播开源理念,传递贡献精神和参与意识上,付出了巨大的努力。 [caption id="attachment_1210" align="aligncenter" width="500"]SITCON 在今年香港开源年会上的演讲,SITCON 现已发展到香港 SITCON 在今年香港开源年会上的演讲,SITCON 现已发展到香港[/caption] 中国大陆没有一个跨学校间的社团联盟组织,即便有也会被取缔或者被党团收编,强力管控起来。很多高校都有自己的开源社团、Linux 协会等组织,绝大多数都在学校党委、团委等领导的强力管控之下,活动自由受到极大影响,更不可能有丝毫的社团影响力,难以在学校中吸引到学生群体的注意。更有些社团组织在学校的影响之下,变成了创业推进社团,完全走向了逐利。不过也有一些夹缝生存的社团组织,他们尽其所能创新活动形式,引入适宜学生的开源项目,引导学生进入开源贡献的队伍。这其中的佼佼者如中科大的 USTC LUG 和清华大学的 TUNA 协会。 根据几年前我的观察,发现社团里的学生群体普遍缺少自治能力、自我约束和自负其则,这一点在二类本科和三类本科学校尤为明显。去年我工作过的公司就是利用了学生的这个特点,瞄准差一些的学校学生,急于追赶且忧虑就业的心情,向学生群体灌输“开源即免费分享”、“开源贡献=大公司敲门砖”的思想。这种做法虽不能算错,但让学生群体如此“利欲熏心”,是非常不利于学生自治能力提高的,更不利于草根开源社群的构建和发展壮大。


  • 青黄不接的代际传承
很多开源社群都面临这样一个问题,都在担心“继承人”的问题,很多社群就是因为没有人继承而慢慢死掉了。现在面临的情况是新的社群成员还没成气候,老的社群成员就离开了(事业变动,个人原因等等)。即便是北京有像 BLUG 这样从很早就定下代际传承的,也依旧面临青黄不接的问题,深深的担忧。这次参加台湾 TOSSUG(台北开源软件用户组)的活动时,发现他们也同样发愁这个问题,很多时候发现开源贡献者或者参加线下活动的就是那些人,很少见到新面孔。 如何解决呢?11月黄敬群来北京,参加活动并和 BLUG 一起聚会聊天。他一针见血的说到“开源社群需要更‘开源’”(广开源路),需要社群更多包容能力,需要拓展更多的渠道,也需要积极培养新手的成长(这正是黄敬群现在台湾做的事情)。在大陆草根开源社群的生存空间和渠道很窄,这就限制了发展的能力,加之社群能力有限,发展困局非常严重。我依旧会在 BLUG 多作尝试,探索社群治理的新模式,努力开拓更多渠道和生存空间。
  • 中心化的压力和诱惑
另一项挑战是大公司看到开源社群的价值以后,希望“招安”。有人会说,这样不会很好吗?但这样会牺牲掉社群的独立性和轻利性,会进一步削弱自治能力。对缺少自主能力的人,大公司的诱惑力很强的。黄敬群在今年 COSCUP 的封麦演讲上直言:“本来你就可以自己改,不要沦落为某些商业公司的‘抬轿者’”。比如国内某 Linux 发行版,最后就是创业并走入政府热门行业“国产操作系统”,甚至为“自主可控”的民族主义背书,实在让人唏嘘不已。 我本人是非常看重社群自治和自主能力的,可以参考今年5月写的文章《开源社区最需要什么?》
  • 经济价值的转化
面临挑战,同时也蕴藏机遇。草根开源社群虽然轻视经济利益,但如果能有很好的产品,显然对其自身发展有极大的帮助。今年台湾 Ezgo 团队带我一起拜访了 Banana Pi 的设计者洪宗胜老师,顺便参观了他的工作室。Banana Pi 是洪宗胜老师和深圳的开源硬件社群一起完成的产品,非常成功也有极大的影响力。目前还有很多芯片厂商希望与其合作。 [caption id="attachment_1206" align="aligncenter" width="500"]Banana Pi 的设计者洪宗胜老师 Banana Pi 的设计者洪宗胜老师[/caption] 同样,还有脱胎自 COSCUP 的 “CPR 线路组”,成功创业承接会务专业布线和网络架设的业务。 “线路组”和 Bnanana Pi 的成功并不是孤立的现象,这背后既有社群治理的成功,同时也有敏锐捕捉市场需求的能力,最重要的依旧是踏实奋进,自主创新的实干精神。我们不需要天天混吃混喝,聚会打嘴炮吹牛逼的社群,我们需要能够创造交流合作机会(如 SITCON 和 Hacking Thrusday),或有能够产出具体成果(如“线路组”和 Banana Pi),或者可以主导和维护有国际影响力开源项目(如 LXDE)的草根社群组织。


我在《两岸开源文化面面观》一文的结尾发问“一弯浅浅海峡隔开的是什么?”,呼吁大陆可以通过开源社群的发展,进而推动公民自治。一年过去了,草根开源社群的非但没有发展,反而大跨步退化。自治能力丝毫没有提高,开源社群一个个倒掉,或投入大公司和政府的怀抱,就更别提什么公民自治了! 大陆和台湾的草根开源社群,面对的挑战是相似相同的。台湾因为成员有相对较高的自治能力,社会环境比较自由(主要是互联网),解决问题也许会容易一些,社群治理会简单一些;而大陆的优势则是机会比较多,资本相对集中,适宜创业开发。既然如此,大陆和台湾的草根开源社群完全可以合作,共同建立跨越海峡的开源社群,推进开源在两岸间的双向落地。我相信草根开源社群,也就是去中心化的社群合作,要比其他方面的合作更容易,因为年轻人之间有相似或相同的文化,对去中心化的社群治理有广泛的认同,大家对真正的开源精神(黑客伦理)也有更多的共识——这是真实存在的共识,不是“没有共识,强说共识”。 [caption id="attachment_1202" align="aligncenter" width="500"]郝明义先生的赠书 郝明义先生的赠书[/caption] 我希望两岸间的开源社群合作,可以遵循“自由自治,相互尊重,草根融合,联结共荣”的原则。每个社群应懂得“自己的社群自己治理”;社群里的每个成员也应自负其则,切实负起发展自身社群的责任。同时社群和社群、人与人之间也应该尊重彼此社群的特性,尊重对方选择的社群发展路线(比如创业或停掉)。同时我希望的是底层草根之间的融合与合作,而不涉及企业商业公司社群,甚至政府部门;只有草根社群之间才有可能对真正的开源精神(也就是黑客伦理)有较多的共识,才有可能深度融合与联结。最终达到两岸开源社群的共同繁荣。为何我要提出这十六字原则,也与这一年来我对开源社群治理的看法有关,我认为只有自治才能共治,只有自私才能无私,只有自由才能共荣。郝明义先生在《如果台湾的四周是海洋》一书中说“要敢于和对岸合作”,这句话不仅说给台湾人,也说给大陆人。合作才能创造价值,闭门造车最终只会毁了自己。更何况,开源精神的本质,就是通过促进人与人之间的联结,创造更大的价值。 2015 年是 COSCUP 的第十年,十年来 COSCUP 为台湾本地的开源推广和开源发展,推进人与人之间的联结,社群之间的合作,作出了不可磨灭的贡献。展望 COSCUP 2016,即将到来的 2016 年将会开启 COSCUP 的“后十年时代”,这里我斗胆提个不成熟的建议:不妨将 2016 年 COSCUP 的主题定为“两岸开源社群合作”吧。我衷心希望两岸开源社群可以加深合作,互通有无,互相融合,让 2016 年成为两岸开源社群合作的元年。 [caption id="attachment_1205" align="aligncenter" width="500"]感谢200多位志愿者的努力,让此次 COSCUP 如此成功 感谢200多位志愿者的贡献与付出,让今年 COSCUP 如此成功[/caption]


从CCTV得知家乡空气治理得好,得了联合国大奖,叫做《今日变革进步奖》。我不免心里高兴,想说给朋友们听。客居澳洲,给人说事得用英语。好在CCTV说得清楚,这个奖名字叫做“Today Reform Progress Prize”。


Today Reform Progress Prize

Today Change Progress Award
来自 get-top-news.com的这篇报道英文极差,原本不值得引用,但是除了它再没兰州得奖的英文报道了。这虽然是英文新闻网站,从原代码里的方块字来看是国内出品。
Award for Today’s Transformative Step





兰州空气治理得到底怎么样?其实兰州不出名,找到翔实资料还不太容易。NGO Clean Air Asia年度报告报告数据量大,没官腔和颂歌,里有提到兰州去年的情况。去年2014年PM2.5兰州大体相当于全国74个采样城市的平均值,在65左右。北京是85,兰州胜出。2014年PM10兰州150多一些,北京在118左右,北京胜出。治理得怎样?PM10兰州在去年2014年比前年2013年更严重,增加了25%左右,同期全国平均值增加了15%左右。这就是不怎么样的意思。PM2.5方面,缺少往年数据来评定去年变化。2015年的第三方数据还没出来,也许兰州今年做得特别好,也末见得。自娱自乐之外是不是有真的进步,我们等今年的报道出来看看。

Obfuscated SSH tunnel

VPN providers were cracked down, open source anti-censorship tools were eliminated. This is what’s happening in China and has become even more severe than ever. Shadowsocks alone is no longer reliable due to more powerful deep packet inspection implemented at the GFW.

I am now replacing shadowsocks on my gateway with obfuscated SSH tunnel, based on Tor‘s obfsproxy. To the impatient ones, I will first give a concise summary of the necessary steps of my set up. You can follow it without drilling down the details. I will explain in more details later. But please note that you have to follow the other instructions in this blog post to complete the whole set up.

Quick Set up

On your server

Assume your server runs Debian 8 (jessie) or Ubuntu, and its IP is, run these commands:

$ sudo apt-get install obfsproxy
$ mkdir /tmp/obfsproxy-temp
$ obfsproxy --data-dir=/tmp/obfsproxy-temp scramblesuit --password=QWLY42YHB75J3B57XOKYNNFJPOQ7APHL --dest= server

On Raspberry Pi gateway

$ sudo apt-get install python-dev
$ sudo pip install obfsproxy

Edit ~/.ssh/config:

  ProxyCommand nc -X 5 -x %h 7700

Run these commands:

$ obfsproxy --log-file=obfsproxy.log --log-min-severity=info scramblesuit --password=QWLY42YHB75J3B57XOKYNNFJPOQ7APHL socks
$ ssh user@ -N -D 1080

The post Obfuscated SSH tunnel appeared first on Anthony Wong.

SFD Phnom Penh 2015 roundup

It’s the second time I organize Software Freedom Day in Phnom Penh! I would like to thank everyone who volunteered, joined and/or presented yesterday. We had a great event and a nice turnout. It seems we managed to have a better focus on our audience this year.

What is coming out of the event is a multirotor course with free and open source software with the National Institute of Posts Telecommunications and ICT (NIPTICT) and more regular PPLUG meetings, a few planned events with specific schedules, e.g. Sirko Kemter from Fedora already committed to help us to host our very first Fedora release party and installfest in Phnom Penh in November. NIPTICT’s President also mentioned that they are having a new building under renovation at the moment and we will be able to host a bigger event with 200 people capacity for Software Freedom Day in 2016.

Here are some of our great moments to share with you:

sfd2015-preparationPreparation before the event
sfd2015mozillaMozilla Local Team
fedoraThanks to Sirko Kemter, we had a Fedora booth!
sfd2015presidentOpening speech by NIPTICT’s President
sfd2015fredmFree Software: what’s it and what can I do with it? by Fred
sfd2015fredBuilding multirotors with free software
sfd2015localizationLocalizing free software by Khoem Kokhem for everybody by Sirko Kemter
sfd2015mozilla1Contributing to Mozilla community by Vannak Eng
sfd2015mappingOpen Source Mapping by Nhiep Seila
sfd2015leapUnderstanding virtualization by Sok Leap
We finished the event by playing drones together! We finished the event by flying quadcopters together!

Celebrate Software Freedom Day today!

Free and Open Source Software has come a long way since its inception and while we’re celebrating SFD for the twelfth time, the FSF is celebrating its 30th anniversary. Every software company now tends to use Free and Open Source Software but unfortunately that has just set the Software more as a commodity with very little benefit for advocacy, education or awareness. And so, in a world with Free Software used almost everywhere very few people notice or even care.

Software Freedom Day is here to tell people why we need to remind ourselves of the importance of Software Freedom and to get all the communities together to celebrate and introduce their philosophy to newcomers. Probably more than ever we need to go out and demonstrate the great many things that Free Software has done and enables everyone to do.

As usual events are listed on the SFD Map and should there be no event in your area you can always get together and run one in the upcoming few weeks. On top of all the good things Free Software brings we would also like to remind people that a good way to get started can be through Outreachy, a remote internships in Free and Open Source Software open to everyone regardless of their origins or differences. The next round of internships is from December 7 to March 7 with applications deadline on November 2. This is of course ideal for students in the south hemisphere as the program requires you to be available 40 hours a week but also for anyone either looking for a career change or applies what he/she has learned in a real software environment.

With all these years of experience we are sure your events will shine. And if you’re a little short of ideas you can always refer to our resources. One of note could be the latest Blender movie released end of August maybe followed by a discussion of how the Blender Foundation has been so successful over the years.

Finally we would like to thank all the people making SFD possible and that is our sponsors like the Google Open Source Programs Office, Linode, the Free Software Foundation and our various supporters in the media and community arena. But of course more importantly all the various Free Software communities from Google Developer Groups to Free Software Groups, GNU/Linux User Groups and the various universities interested in Free Software among them.

So, Happy Software Freedom Day to all of you!

Celebrate SFD with us on 19 September 2015!

Software Freedom Day 2015 Phnom Penh

blog-sfd-pp2015The Digital Freedom Foundation is organizing our Software Freedom Day event in Phnom Penh together with the National Institute of Posts Telecommunications and ICT and the Ministry of Posts and Telecommunications on September 19, 2015 at the NIPTICT Building. There will be 10 presentations and several lightening talks with topics covering free and open source software ranging from operating system, virtualization, drones, mapping, servers, to security. Here is the detailed schedule.

We aim to target both the university audience and the young workforce and expect to have a hundred audiences to join. All in all it’s been a joy preparing for this event together with Makara, Rapid, Arky and Fred. It also allows us to talk and plan resources with people from different local communities such as the Open Institute and FPV Cambodia.

The event will start at 1:30pm tomorrow, if you happen to be in Phnom Penh please do drop by!



上个月为了准备COSCUP的演讲,我又翻阅了《Linux/Unix设计思想》(作者是 Mike Gancarz)这本书,虽然后来这本书里的内容并没有被我用到COSCUP的演讲中。但却让我联想到了正在经历的恋情,以及之前爱情的经验,赫然发现UNIX哲学竟然可以在爱情中找到应用,而这些应用却一点也不牵强附会,让我不由得对伟大的UNIX哲学,更敬三分! 本文更多的谈论自己的理解和感悟,以期用 Hacker 的思维模式和新颖的角度看待爱情。欢迎交流哦!


提到“UNIX哲学”,很多人会首先想到KISS原则(Keep It Simple and Stupid),这就是为什么我会将UNIX哲学和爱情联想到一起,因为KISS嘛(哈哈哈~)~其实UNIX哲学中不仅仅包含KISS原则,更有其他一些相关细节,但KISS原则依旧是核心思想。 事实上,所谓“UNIX哲学”有很多版本,可以看到维基百科就列出了四种解释,另外还有Eric.S.Raymond在《UNIX编程艺术》一书中总结出来了17条原则。而这里我更倾向于选取 X Window 系统开发组成员之一的 Mike Gancarz 所写的九条格言,因为这是目前最广泛接受的。 1 小即是美 2 让每一个程序只做好一件事情 3 尽快建立原型 4 舍高效率而取可移植性 5 使用纯文本文件来存储数据 6 充分利用软件的杠杆作用 7 使用shell脚本来提高杠杆作用和可移植性 8 避免强制性的用户界面 9 让每一个程序都成为过滤器 目前很多人认为UNIX哲学已经弱化了,已经无法追上时代脚步了,比如 systemd 和其追随者都认为UNIX哲学已经不够为现今时代所用,不过我倒认为 systemd 恰好是黑客伦理和UNIX哲学的体现呢。因为本文并不是讨论UNIX哲学,因此相关展开和外延可以搜索相关文档,也可以看 Mike Gancarz 写的《Linux/Unix设计思想》(Linux and the Unix Philosophy)一书,或者是ESR的《UNIX编程艺术》。



1. 从小处着眼,创造小感动

简单说就是“小即是美”,也就是用一切机会创造小感动,加深感情。这种小感动,可能是一个小礼物,一次小约会,一个吻,一次温馨的聊天,甚至仅仅只是一句话而已。 11870941_10204945790024977_4419727180094315724_n 女神Eris在今年七夕节时发我的信息,当天我还在台湾刚刚参加完COSCUP。 想象一下,对方送你一辆豪车和一个贴心的小礼物,哪个产生的感动更强?哪个更能增加俩人之间的连结?很多时候大而全,不如小而精,人性在情感的选择上很有意思,可能会忽略大量付出,但却对一两次小的感动无法自拔。这是因为每一次的感动背后,其实都蕴藏着建立连结,蕴藏着丰富的人性关系。

2. 和TA在一起,只需做好这一件事

很多事情在头脑中萦绕不去,比如我依旧会时常回忆和女神Eris一起畅游京城,一起喝咖啡,一起牵手走过黑夜的胡同和小巷。为什么这些事情在我脑海里不断重演,在于我内心将这件事和她联系在了一起——建立连结。 通过几次恋爱经历,我学到一件事,就是无所谓两个人在一起做什么事情,无论是一起看电影,看书,写代码,调bug,学习,工作,吃饭……只要是和她在一起,这件事情往往印象深刻,于此相关的各种记忆也大量涌来。因此一件事情在我脑海里变得有意义,是因为和喜欢的人在一起,共享同一段时光。 这就教会我一个经验,和她在一起就要专心于她,而不是解决事情本身。因此和她一起的时候,最好安排一些没什么意义的活动,比如吃饭啊,看书啊,看电影,旅游啊这种,因为一个人做也是做,俩人做也是做,但会因为多了她而赋予意义感。当然这也要另当别论的考虑,比如有些女孩喜欢做一些有意义的事情,这时候给予陪伴就是最好的爱。

3. 尽快表白,减少暧昧

当爱情展露出些许“原型”的时候,就应该将其明确,而不是保持暧昧,这也是女神Eris教会我的。表白的作用就是将这样的情感以爱情的形式明确下来,让双方都可以转换角色投入其中,而不会在暧昧关系中试探和浪费时间。 我很喜欢的Hacker,也是《大教堂与集市》一书的作者 Eric S. Raymond 在《大教堂与集市》中提出“Release Early, Relase Often”(早发布勤发布)。同样的,这句话放到爱情中,也可以表述为“早表白,常言爱”,也就是在恋爱关系已经初露端倪之时,就尽快明确下来,否则早一点结束暧昧,对双方都有好处。另一方面,如果能够在关系相处中,经常表达爱意,也能明确和加深互相之间的感情。

4. 多移植经验,少冒险少作

谁都不是天生就会恋爱的,而很多经验也是需要从别人那里学来。无论是网上还是朋辈,多多学习别人的经验确实有帮助。但注意哦,学习不等于是生搬硬套的移植,这就如同很多代码与运行其的环境有很大关联,这样的代码就不要移植过来,因为可能要同时把各种部署环境都一并带过来,这就太臃肿了。我们需要移植的是两类,一类是与我们目前境遇相似的,就如同在Ruby平台上运行Ruby代码是很合适的,但此时如果弄了段Node.js代码过来,我们就要做大量适配工作;另一类是本身就具有高可移植性的经验,针对某一类问题,总结出的相应的解决方法,因此这类经验就很好。 另外,父母的恋爱经验是最好的学习素材。因为心理学(主要是客体心理学)认为人的恋爱关系往往是与父母亲密关系的投射,因此父母的恋爱经验,或者他们之间的幸福故事,简直是绝佳的教材。因为我们首先在恋爱中倾注和投射了与父母关系的模型(部署了环境),因此在这个基础上构建的亲密关系(构建代码项目),因此很多经验甚至可以直接移植过来。 移植经验的同时,不要做太多冒险的事情,不要作。传统的虽然未必会带来更多好处,但绝对不会产生问题,因此保守一点的恋爱并非有问题。还有就是不要考验对方,考验一段情感关系,这是相当愚蠢的!当然做一些有创意的事情挺好,送对方一些有创意的小惊喜啊(注意,一定要小),做一些颇有情趣的小事啊(一定是小事),也是很不错的。

5. 爱要多多表达,直白胜于婉转

中国人的传统认为爱是内敛和含蓄的,认为既然在一起,只要多做就行了,不需要表达出来。但其实殊不知,更多爱的表达,会大大推进情感的加深,更多多让双方明确感情关系,明确内心的需求,也明确爱的责任。曾经很喜欢美国作家欧-亨利的短篇小说《麦琪的礼物》,认为里面讲的爱情很感人,但最近几年越来越觉得这样的爱情太伤人,里面的故事恰好是因为缺少沟通而导致的悲剧啊。所以有爱就多多表达,不要再想什么只要做了对方就一定会开心,其实不表达出来,对方为什么会开心? 估计会有人拿UNIX哲学里的一条反驳我,因为UNIX下当命令成功执行,屏幕上是不会有多余输出的。但人不是机器,当我替对方做了一件事情的时候,我其实是期望着对方有反馈的,这应该是人之常情嘛。因此多多表达出来肯定是有好处的。 同样的,愤怒、哀怨、失望和无助,也是需要表达出来的,这样对方才会一起分担,痛苦才会变得更少,更容易相处。对方如果做了不好的事情,说了伤自己的话,第一时间以不伤对方自尊的方式告诉TA,也能更好的让对方接受自己的错误,更能让关系进一步。 很多时候,我们为了关系着想,或者避免争吵,会刻意压抑自己内心的想法和诉求,不愿意向对方提出来,这样的结果往往会造成更深的伤害,或者放纵对方的错误做法。所以多多沟通内心的感受是非常非常有必要的,内心的感受只有自己最清楚,说出来才能让对方感同身受,让对方接受和体谅此时此刻的心境。

6. 充分利用亲朋好友的杠杆作用

很多网上的文章都谈到了,要想搞定一个妹子,如果能让她的亲朋好友也接受自己,会搞定妹子。这不是没有道理的,亲朋好友对一段感情的认可,不仅可以减少对情感的干预和阻碍,更可以在感情可能进入歧途的时候,帮助修正。 不仅要搞定对方的家人朋友,很多时候自己这边的朋友更重要。有些朋友会因为羡慕产生嫉妒,有些时候甚至是下意识的想法,会奚落、诅咒甚至是阻碍俩人之间的感情。所以安抚或者远离身边的各色朋友,也是非常有帮助的。

7. 使用社交平台公开和固化情感关系

与父辈那一代不同,随着科技的发展,我们有了更多机会和平台”秀恩爱“,利用社交网络表达关系,真的是一种非常好的方式,公开表达的情感关系,也是一种公开的责任,这也对双方来说增加了一些公开的制约。 因此在社交网络”秀恩爱“,并不是像很多人说的那样,”秀恩爱死的快“,而恰恰相反——”秀恩爱更有爱“!因此大胆在公开的社交平台秀恩爱放闪,是一件非常好的事情。 当然,照顾一下单身狗也是必要的,太过甜腻咸湿和限制级的照片文字,最好不要发出来。反倒是情趣幽默又温馨的往往会感染所有人,当然也包括情侣自身。也许多年以后,翻到曾经的这些甜蜜记录,也是让人心头一暖。

8. 避免过强的控制欲,减少单一化选择

毋庸置疑,爱情是排他的,是只属于两个人的。但过度控制和限制对方,短期虽然可以巩固关系,但长久来说却是不利于情感发展的。当一个人缺少自信的时候,也会不相信对方,失去信任别人的能力,进而增加控制欲,这在依恋模式是”焦虑型依赖模式“的情侣身上,经常可以看到。 另一方面,过度的控制对方,不仅仅是限制其自由,更是斩断其对外界的连结,当一个人对外界的连结变少的时候,就会变得缺少自信,增加猜忌。此时两个互相不自信,又互相猜忌的人,怎么可能会有稳定的关系。 因此如果是真爱,就要给对方足够的空间和自由度,更要允许其与外界建立更广泛的连结,当然于此同时自身也要多多与外界建立连结,只有这样才能让双方都更自信,也更信任对方。

9. 让生活的每一处都成为情感的连结

之前看过一篇文章很有意思,说追女生可以每天给她送早餐,送到第十天的时候突然不送了,因为巴普洛夫条件反射原理,这个姑娘一定会产生怀疑,因此变得怀念和感动。这其实就是“小即是美”的应用之一,因为创造了连结,增加了俩人之间的亲密感。 因此生活处处都可以成为沟通感情的连结,发挥和制造一切机会,从小处着眼,发挥连结的价值,让感情在连结中越来越深入。


爱情中没有”42”(代表The answer to life, the universe and everything),不要妄图用一套固定方法解决所有问题。面对不同的人有不同的做法,此文里所写的只是我的个人经验,外加一些从网上看到的文章总结,并不能涵盖大多数情况。


我认为,UNIX哲学的核心虽然是KISS原则,但其真正理念却是“创造连结,成就伟大”。比如我们都熟知的“一个程序只做好一件事”,这背后的理念是通过管道和重定向等机制,将小程序有机的连结在一起,来做更多更好的事情。还比如开源社区,其本质也是创造人与人的连结,发挥人在连结中的作用,充分合作和创新,产生更多伟大的开源软件。而爱情也是如此,通过创造两个人之间更多的连结,来加深感情,而这一点与UNIX哲学是异曲同工的! 因此,找到自己爱情中的一套方法并善加利用,记得多多建立连结,一定会有幸福的未来!祝各位 Happy Hacking! Happy Loving!





最让人喜欢的不是风景,而是人。小鱼在店里端详礼品,退了几步,撞到一位老人。他说:“My life has changed! A lady in my arms!” 待到小鱼和我回过神来,听懂了老人的幽默,他已经信步走出门了。都铎街(Tudor)和娈峰街(Beaumout)交接的地方有蜗窄的小小市场,算是本地唯一每日运作的市场了,里面有七八个商家,一个小姑娘搭了个凉棚在里面弹唱,边上写着“请资助我游欧洲”。大凡有市场,就有人在边上弹唱,澳洲的日常市场就是这样。我买了一个印有美元票面的钱包,店家说,你去过美国吗?你看,这些商贩真是没话找话,这样算打开话题了,聊了十来分钟。店家是南非人,早年移民到美国,晚年在这里享受生活,走的时候我对他们家三代都很了解了。

Hiring Pike Programmers

Once in a while i have someone reject to work with me because they don't know Pike. What they are really saying is, that they are not willing to learn something new.

If you are a decent programmer, then learning a new programming language is not hard. Technology changes all the time, and every year you'll learn new frameworks and tools. That's part of your work. So why shy away from learning a new language?

If you can't bring yourself to learn a new language then i suspect you'll also have a hard time learning anything else. So actually i should thank you by refusing the job because of that.

You say: learning a new language is hard.

If you believe that, you haven't tried enough. Sure, if you pick some of the more unusual languages like Haskell, it may be hard (but i don't know, i have not tried learning Haskell yet) and in general, learning your second language is probably the hardest (because the first language you learn, everything is new and you expect it to be hard, but with the second language maybe you fear it is as dificult as the first one, and you don't want to go through that again), also learning a new syntax may take some getting used to.

But all of these hurdles are measured in days.

Pike in particular has a syntax very close to C and Java. (that is, operations that are the same in C, Java and Pike also use the same syntax, with very few exceptions). This makes the syntax also similar to Javascript, PHP, and the many other languages with a C-inspired syntax. Picking that up should not be hard.

The rest is learning the Pike libraries and figuring out what makes Pike tick. You should have that down within a few weeks.

This is the same for pretty much any other language you might start to learn.

I am talking from experience here. I'll give you a few examples:

At my first fulltime job i was hired for my Pike experience. As a junior programmer who hadn't finished univeristy yet, i didn't really have any work history. But i did have a number of Pike modules for the Roxen webapplicationserver that i could show off.

At the same time a university graduate was hired, who had not even seen Pike before joining the team. Within a few weeks she was as productive as the rest of us, and having finished her studies she arguably knew more about programming and could explain more about Pike than i could.

At another job a few years later one of my managers who had just recently joined the company fell in love with Pike, and when he left he built his own company using Pike as the main development language. This guy was not even a programmer.

When i came to china, my first job was for a python programmer. I had learned python by then, but i had no practical experiece whatsoever. I was allowed to do the programming tests in Pike (they had an automated testsuite, which of course could not handle Pike, so in my case the answers were reviewed manually. They had no problems reviewing their tests in a language they had never seen before. That's how good they were). One of the tests i did in python, and i passed and got the job. I was productive from the start.

A few years ago i hired 3 chinese students to work for me. Since this was the first time i hired anyone, i was not sure how learning a new language would go down, on the first day, possibly their first experiene working with a foreigner too. So the first project i gave them was in Java. It was a Java client for the sTeam server. Two of the students left after the summer holidays were over, but one stayed on, and his next project was in Pike. Also for the sTeam server, so he could reuse his knowledge of the APIs that he learned during the Java project, but he did have to learn the language itself. He was productive within a few days.

Last year i was hired to help with a PHP project, using the Laravel framework. I had never really written PHP code before, but the framework was not so different from others (eg Django) so that i was productive immideately. And i ended up fixing other peoples code too.

This summer, i was working with 3 students for Google Summer Of Code. One student worked on the sTeam server, and had to learn Pike for that. He did it during the get-to-know period and started churning out code from the first day of the coding-period.

Another student picked a smalltalk project. She learned smalltalk as soon as she picked the project, joined the pharo-smalltalk community and became a recognized contributor to the pharo 4.0 release. All before her proposal for the GSOC project was even accepted.

Convinced yet?

You say: Noone else uses Pike. It won't help me get a job.

That is probably true. But it is becoming less true as time goes by.

One of the problems with hiring is that, just as you believe learning a new language is hard, so do the hiring managers, and thus they search only for programmers that already know the language that they will need to use.

In the Pike community too. I was the only Pike programmer available who liked moving countries, and so i had my pick for jobs in the USA, in Germany, in New Zealand, in Latvia. Thanks to Pike i got around. Try that with a popular language.

Fortunately, this is changing. Like my first China job, more companies recognizing the ability to learn as more important than a particular language. For them it won't matter which programming languages you learned, as long as you can demonstrate your learning skill. In fact, learning an unknown language will let you stand out as someone serious about learning programming languages.

Learning new languages will also increase your confidence in your ability. For that PHP job i was never asked how much PHP experience i had. I did make clear that i had no experience with Laravel, which is something they could not expect from everyone, even if they had plenty of PHP experiece. But i had experience with similar frameworks, and i was confident that i could pick up what i needed quickly. And i proved it.

When i am hiring programmers myself, i definetly don't care which languages they know. All i care is that they know at least two languages. These people have at least gotten over the second language hump, and learning a third language will be a breeze. Whether it's Pike or any other language.

Stop telling me that you can't learn a new programming language. You can! Because if you couldn't, you would not qualify as a programmer to begin with. At least, i would not hire you.

2015 SFD registration is on!

I am very glad to share with you that registration of the twelfth edition of Software Freedom Day has been opened since early August and you can see from our SFD event map, we already have 62 events from more than 33countries shown in our map. As usual registration happens after you have created your event page on the wiki. We have a detail guide here for newcomers and for the others who need help, the SFD-Discuss mailing would be the best place to get prompt support.

Don’t forget to tell people about SFD! Simply use one of the banners we’ve made if you are organizing, participating, attending or speaking at a SFD event by placing it on your webpages and link it back to your SFD event page or You can also help us to promote SFD by placing our SFD counter with your own language as well!

So get ready to celebrate SFD on September 19 Saturday and happy preparations to all!
Celebrate SFD with us on September 20, 2014!

Bitcoin accepted on my store

I’m running the fledging new Australian store – it has lots of stuff in envelop size and I offer free postage.

Now with recent addition of bitcoin paymnent, as a special gift with everypurchase made, you will receive one free btc to redeem at one of Brisbane’s first stores to barter in this unique and decentralised payment system.

Unique to is the option of making purchases using Bitcoin. is one of the first known online busineses in Brisbane which is pioneering this great new way to shop.

If you don’t know already bitcoin is a fabulous new way to pay for products and services that allows you to shop with total freedom *see more information on bitcoin

As a special gift to you, all purchase from, will receive 0.001 of BTC to redeem however you like.






Boost WIFI Speed by Forcing 40 MHz Channels in hostapd on RPi

802.11n can double the channel bandwidth of 802.11g from 20 MHz to 40 MHz, but this operation mode is not recommended in areas that the spectrums are congested and likely interfere with existing WIFI and bluetooth devices. As a result, hostapd will not enable 40 MHz when it finds other channels are being used, like what is seen from the hostapd log below:

nl80211: New scan results available
nl80211: Received scan results (16 BSSes)
40 MHz affected channel range: [2397,2447] MHz
Neighboring BSS: 1c:fa:68:8e:a6:e0 freq=2412 pri=1 sec=5
Neighboring BSS: e0:05:c5:4c:e2:b6 freq=2427 pri=0 sec=0
Neighboring BSS: b0:48:7a:6a:9d:32 freq=2437 pri=6 sec=10
40 MHz pri/sec mismatch with BSS b0:48:7a:6a:9d:32 <2437,2457> (chan=6+) vs. <2412,2432>
20/40 MHz operation not permitted on channel pri=1 sec=5 based on overlapping BSSes

However, this is unrealistic in modern cities. You should be grateful the primary channel you choose has not been used already, let alone the additional one for 40 MHz. What can we do? We have to force hostapd to turn on 40 MHz anyway. But since hostapd does not have any configuration options for that, we have to recompile hostapd from source. Actually, this has been done in other distros. For example, OpenWRT and Arch has patched their hostapd with the noscan patch, which adds an option to force 40MHz mode regardless of the environment.

Before turning on 40 MHz, the iwconfig on my laptop is like this, notice the bit rate is only 54 Mb/s:

wlan0     IEEE 802.11abgn  ESSID:"bibiworld"  
          Mode:Managed  Frequency:2.437 GHz  Access Point: C8:3A:35:C9:17:4A   
          Bit Rate=54 Mb/s   Tx-Power=15 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-32 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:30  Invalid misc:683   Missed beacon:0

Now let us start. First you need to add a deb-src source to apt so that we can download source packages. Note that I am still using Raspbian Wheezy. If you use Jessie, change the deb-src line according to your original deb line.

pi@raspberrypi $ echo "deb-src wheezy main contrib non-free rpi" \
 | sudo tee /etc/apt/sources.list
pi@raspberrypi $ sudo apt-get update
pi@raspberrypi $ apt-get source hostapd            # download source of hostapd
pi@raspberrypi $ apt-get build-dep hostapd    # download all build dependencies
pi@raspberrypi $ cd wpa-1.0

Save the following patch into a file:

--- wpa-1.0.orig/src/ap/hw_features.c      2012-05-10 05:56:09.000000000 +0800
+++ wpa-1.0/src/ap/hw_features.c        2015-07-18 17:22:37.788215009 +0800
@@ -430,6 +430,7 @@
                oper40 = ieee80211n_check_40mhz_2g4(iface, scan_res);
+#if 0
        if (!oper40) {
                wpa_printf(MSG_INFO, "20/40 MHz operation not permitted on "
                           "channel pri=%d sec=%d based on overlapping BSSes",
@@ -439,6 +440,12 @@
                iface->conf->secondary_channel = 0;
                iface->conf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
+       wpa_printf(MSG_INFO, "Force 20/40 MHz operation on "
+                  "channel pri=%d sec=%d even there are overlapping BSSes",
+                          iface->conf->channel,
+                          iface->conf->channel +
+                          iface->conf->secondary_channel * 4);
        res = ieee80211n_allowed_ht40_channel_pair(iface);
        hostapd_setup_interface_complete(iface, !res);

pi@raspberrypi $ patch -p1 < patch.diff

Because we are going to create a new hostapd package, it’d be a good practice to increment the version number by adding a new section at the top of debian/changelog, like this:

wpa (1.0-3+deb7u3) wheezy; urgency=low

  * Force 20/40 MHz.

 -- Anthony Wong   Sat, 18 Jul 2015 16:30:43 +0800

wpa (1.0-3+deb7u2) wheezy-security; urgency=high

Now we are ready to compile the packages:

pi@raspberrypi $ fakeroot debian/rules binary

If it succeeds, install the new package with dpkg -i.

Restart hostapd, it should now force 40 MHz mode:

nl80211: New scan results available
nl80211: Received scan results (23 BSSes)
40 MHz affected channel range: [2397,2447] MHz   
Neighboring BSS: e0:05:c5:4c:e2:b6 freq=2427 pri=0 sec=0
Neighboring BSS: 00:d0:41:c4:25:31 freq=2437 pri=6 sec=2
40 MHz pri/sec mismatch with BSS 00:d0:41:c4:25:31 <2437,2417> (chan=6-) vs. <2412,2432>
Force 20/40 MHz operation on channel pri=1 sec=5 even there are overlapping BSSes
HT40: control channel: 1  secondary channel: 5
Completing interface initialization

And my iwconfig output now shows Bit Rate is 150 Mb/s, yay!

wlan0     IEEE 802.11abgn  ESSID:"bibiworld"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: C8:3A:35:C9:17:4A   
          Bit Rate=150 Mb/s   Tx-Power=15 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-28 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:31  Invalid misc:330   Missed beacon:0

The post Boost WIFI Speed by Forcing 40 MHz Channels in hostapd on RPi appeared first on Anthony Wong.

Deploy Shadowsocks on Raspberry Pi with ChinaDNS and Redsocks

Assume you already have a Raspberry Pi configured as a WIFI router like mine shown below, but you live in China and have to deal with the fact that many websites can’t be accessed due to GFW. Don’t be despair and with some hacking you can get your Internet freedom back.


The mechanism is to use shadowsocks on your router which directs any traffic to a shadowsocks server in the free world. It’s simple to get it up and running on a local machine, but on a router you need to use redsocks to redirect traffic to the shadowsocks client running on your Raspberry Pi. DNS traffic has to be routed by redsocks as well otherwise your DNS replies will be contaminated. To remain as fast as normal when accessing China websites you also need to skip routing traffic to Redsocks for anything within the China IP ranges. Even if you don’t care about performance, this is still necessary in some circumstances like geoip restriction such as does not deliver contents if you live outside of China.

Finally, we want to improve the performance even further by using ChinaDNS. To avoid DNS poisoning, we can always resolve DNS over our secured shadowsocks connection, but this is not optimal if a China website have CDNs outside China. ChinaDNS queries local DNS servers to resolve Chinese domains and queries foreign DNS servers to resolve foreign domains, and from my testing it is useful to avoid DNS poisoning with the “DNS compression pointer mutation” option. (Update: I have switched from ChinaDNS to dnsmasq+dnscrypt, please read Securing DNS Traffic in China to see how it works.)


I assume that you have shadowsocks server running on a public server, so I will skip that part and only talk about the client side.

Installing shadowsocks is very simple, note that it will be installed under


pi@raspberrypi $ sudo apt-get install python-pip
pi@raspberrypi $ sudo pip install shadowsocks
Downloading/unpacking shadowsocks
  Running egg_info for package shadowsocks
Installing collected packages: shadowsocks
  Running install for shadowsocks
    Installing sslocal script to /usr/local/bin
    Installing ssserver script to /usr/local/bin
Successfully installed shadowsocks
Cleaning up...

Start up shadowsocks while listening on local port 1080:

pi@raspberrypi $ sslocal -s <shadowsocks server IP> -p <shadowsocks server port> -k <password> -b -l 1080


Install redsocks, simply apt-get from the archive:

pi@raspberrypi $ sudo apt-get install redsocks

Then you need to change the START option in

from NO to YES, so that redsocks will start automatically at boot time and also can be started by
sudo /etc/init.d/redsocks start

pi@raspberrypi $ sudo vi /etc/default/redsocks

Then update

. Most of the default settings work fine, just need to change
in the
section to your address of the network interface that accepts traffic from your local network. The default is, but that does not work well if you want to re-route traffic from other machines on your network, so change it to something like:

redsocks {
        /* `local_ip' defaults to for security reasons,
         * use if you want to listen on every interface.
         * `local_*' are used as port to redirect to.
        local_ip =;
        local_port = 12345;

But we want traffic from other hosts in your network to be redirected by redsocks to your local shadowsocks client, which in turn sent to the the remote shadowsocks server. We need to pay special attention to DNS traffic, as DNS poisoning is prevalent in China. We need to take special care to redirect DNS traffic through redsocks/shadowsocks.

We also want all China traffic NOT to go through shadowsocks for performance. This can be easily done by looking at the destination IP, if it is in the China IP range we skip going through the REDSOCKS china. First we need to get all network segments allocated to China and save it to a file called


pi@raspberrypi $ curl '' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

These all can be accomplished by iptables. You need to run the following iptables commands, or put them in a local script and run it with sudo.

# Specify your shadowsocks server

iptables -t nat -N REDSOCKS  # Create a new chain called REDSOCKS

# Do not redirect to shadowsocks server
iptables -t nat -A REDSOCKS -d $SS_SERVER_IP -j RETURN

# Do not redirect local traffic
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN
iptables -t nat -A REDSOCKS -d -j RETURN

# China traffic does not go through REDSOCKS
while read subnet; do
  sudo iptables -t nat -A REDSOCKS -d $subnet -j RETURN
done < /tmp/chnroute.txt

# Redirect all TCP traffic to redsocks, which listens on port 12345
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

# These traffic go to REDSOCKS chain first
iptables -t nat -A PREROUTING -p tcp -j REDSOCKS


iptables -t nat -L -n
to make sure the rules have been added correctly. Now start up redsocks by
sudo /etc/init.d/redsocks start
and let’s test it out by doing some web browsing on another computer in your local network. If that works fine, congratulations and you have set up everything correctly! If not, look at shadowsocks output and also turn on redsock’s
and check if there is anything useful in


ChinaDNS is not absolutely necessary, but as explained at the beginning it is desirable. There is no pre-built package so we need to compile it. It is simple to do:

pi@raspberrypi $ sudo apt-get install git automake
pi@raspberrypi $ git clone
Cloning into 'ChinaDNS'...
remote: Counting objects: 815, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 815 (delta 0), reused 0 (delta 0), pack-reused 810
Receiving objects: 100% (815/815), 213.52 KiB | 111 KiB/s, done.
Resolving deltas: 100% (426/426), done.

pi@raspberrypi $ ./
pi@raspberrypi $ ls
aclocal.m4  autom4te.cache  chnroute.txt  configure     COPYING  install-sh  missing  packaging  src  CHANGES  depcomp  iplist.txt  openwrt  tests

pi@raspberrypi $ ./configure 
pi@raspberrypi $ make

After it is successfully compiled, test it out:

pi@raspberrypi $ sudo src/chinadns
pi@raspberrypi $ host has address
pi@raspberrypi $ host is an alias for is an alias for has address has IPv6 address 2404:6800:4005:80b::200e
pi@raspberrypi $ sudo src/chinadns -m -c chnroute.txt
pi@raspberrypi $ host has address
pi@raspberrypi $ host is an alias for is an alias for has address has address has address has address has address has address has IPv6 address 2404:6800:4005:808::200e

If it goes well, run

src/chinadns -m -c chnroute.txt
when your router boots.

That’s it! I hope these are useful to you.

Update: I have switched from ChinaDNS to dnsmasq+dnscrypt, please read Securing DNS Traffic in China to see how to set it up.

The post Deploy Shadowsocks on Raspberry Pi with ChinaDNS and Redsocks appeared first on Anthony Wong.


每个地方都有小人,通常,小人做人处事不太厚道,常以不良手段达成目的。 与小人相处,稍不谨慎,会吃大亏;学会分辨小人,非常重要。他们言行有以下特色:


通常是另有阴谋目的,并不单纯以此为乐; 有时为了升迁,衬托自己优秀,也不惜丑化对手。 他们唯恐天下不乱,惯用「听说」造句,歪曲事实,无中生有。


分化同事感情,制造纷争和事端,鹬蚌相争,结果渔翁得利。 他们口才好,善于撇清责任; 事后扮演和事佬,双面间谍,闽语所谓「双面刀鬼」。


「赞美鼓励」和「奉承拍马」不同,后者舌灿莲花有心机,热情又嘴巴甜,让人晕陶陶而迷失方向。 他们更刻意亲近上司,常伺机打小报告,备受宠爱。


工作方面,言行不一,善于表面功夫,也善于俟机邀功抢功。 待人方面,他们是表里不一两面人,有时面前夸你套出你的秘密,背后就损你出卖你。


谁得势就依附谁,谁失势就舍弃谁,所谓西瓜偎大边。 他们利用别人权势以提升自己地位,没有利用价值的人,他们不会想亲近,顶多虚以委蛇。


你种树,他乘凉;利用你替他们开路,成功时,不会报答你; 甚至翻脸无情抹煞你;他们占人便宜视为当然,怎会感激?


只要有人或跌倒或失败,他们会追上来再补一脚; 例如,四处渲染那人「罪有应得」云云。他们也是事后诸葛,常说一些幸灾乐祸的风凉话。


明明是自己言行有过错,却死不承认,昧着良心硬拗瞎掰,也要找一个冤大头(软柿子)来背黑锅。 他们口才犀利又敢发誓,很能误导大家以讹传讹,日久则众口铄金,积非成是。 有时「真相」就此石沉大海,永远被扭屈蒙蔽了。   事实上,小人的特色不只这些,凡是藐视法律,鄙弃道理,刻薄寡情,不遵循伦常道德,唯利是图,损人利己,容易鬼迷心窍…的人,通常都带有小人的性格。古人说“画虎画皮难画骨,知人知面不知心”又说“逢人且说三分话,不可全抛一片心”又说“害人之心不可有,防人之心不可无”又说“人不可貌相,海不可斗量”又 说“明枪易躲,暗箭难防”都是教导子弟看清社会,保护自己。 当你看出谁是小人之后,要懂得如何与小人相处?简单的说:


千万不要因为正义感而独自公开揭发他…. 小人从不认为自己奸诈不厚道,他们敏感度高,眼锐如鹰,舌利如剑…你绝对不是对手。


保持平淡的表面关系,千万不要亲密如友, 因为小人蜜腹剑,翻脸无情,让你措手不及,吃不完兜着走….


如果你批评或谈别人隐私,绝对变成他们兴风作浪的把柄,或是做为日后报复你的筹码; 如果他们批评或谈别人隐私,你要立刻中止,一句都不要听,因为无论如何,他们绝对会嫁祸给你… 尤其是他们拨电话寒暄聊天,常常顺便帮你录音喔! 你不要怀疑~他们这样快乐吗?干嘛那么累?这就是小人心态!

发现开源社区的扫地僧——Google Summer of Code 2015导师手记(1)

前几天,我指导的两名学生被Google接受,这样我就以导师(Mentor)身份第一次参加到Google Summer of Code中。很多朋友通过各种渠道,包括XMPP、IRC和微博私信,问我关于如何参与Google Summer of Code。我也确有想法写一篇文章,带着大家一起“骗”Google的钱。。。 三年前,洪谦兄以一篇划时代的《做一名开源社区的扫地僧 (上)》叩响了在中国推广Google Summer of Code的大门,其后在广州Linux用户组(GZLUG)邮件列表里他发表了另一篇长文,讲述参加Google Summer of Code的各种好处,以及学生参加所需要的各种经验。可以说,洪谦兄的这两篇文章,将参与开源项目必须掌握的一些内容很好的包容在里面了。 今年恰好我成为Google Summer of Code的导师(Mentor),也是我第一次做GSoC的导师。而之前当过GSoC的导师的中国人,好像也没留下什么文档。所以我打算不妨从导师的角度来谈谈,更会结合在这段时间自己的经历和学习到的东西,力求深入浅出的表达出来。特别是想告诉那些有志于从事开源贡献的同学们,如何通过GSoC赚得第一桶金,更开启自己的“开源生涯”。 注意,为了力求不与洪谦的两篇文章冲突和重复,凡是他已经着重强调过的内容、文档和相应的细节,我这里都略过不讲,毕竟他是从 Wine项目 的实践角度,我可能会从更大更通用层面去谈论。 声明:阅读本文之前,请确保已经仔细阅读过 Google Melange 上的 FAQ 文档学生手册。此文毕竟不是面向学生的FAQ,最多就算是我自己阶段性的感悟。


首先为那些心急的朋友,可能会好奇我今年参与GSoC的基本情况,所以首先就把一些事情先讲出来。GSoC主要面对的是开源社区组织,因此我参加的就是其中一个组织——FOSSASIA。FOSSASIA从2011年开始在亚洲区推荐自由和开源软件的落地工作,还是卓有成效的,他们也参加GSoC多年。去年我曾作为FOSSASIA的 Google Code-in 活动(也是Google资助的,旨在鼓励14~18岁高中生完成一些低难度的任务,进而参与到开源社区的计划)的导师参与其中,于是也就顺理成章的希望可以继续担任 GSoC 的导师了。 这次我提出来的idea也是在FOSSASIA组织下的,只有一个:Self-hosted Online communities Communication with OTR encryption。提出这个的主要目的和大概想法也是基于现实需求的,更多的依旧还是考虑这样一个项目相对简单,适宜学生群体上手,而且若有中国学生参与,也容易完成。 这个 Idea 从发出到3月27日截止,总共收到 4 份来自中国和印度学生提交的 Proposal,两名印度人,两名中国人,而且性别比例也是两男两女。从3月27日到4月27日的一个月间,与这四位学生不断交流和沟通,我按优先级排序推选出了3个Proposal,最终Google和FOSSASIA的管理员确定了其中两位幸运者,在4月27日公布最终结果。 因此最终就是这两位入选,来自中国的 Iris Gou 和来自印度的 Heena Mahour。她们两位以优秀的 Proposal 和丰富的开源社区经历,打动了包括我在内的 FOSSASIA 所有导师,还有 GSoC 活动的管理员。

什么是 Google Summer of Code?Google这土豪为什么要设立这个?

先摘录一下 Google 官方宣传材料里的说法:
Google Summer of Code(谷歌编程之夏)已经把超过8500名学生和440个开源项目聚集到一起来创造上百万行代码。我们期待导师和学生加入我们来打造2015年最好的编程之夏!谷歌编程之夏计划设计用来鼓励学生参与到开源软件开发中。从2005年开始,这个计划有这些目标: - 鼓舞年轻开发者参与到开源项目开发中 - 在暑期为计算机及其相关专业的学生提供与学习相关的工作机会 - 让学生更多地接触到真实的软件开发环境(例如邮件列表规范,软件许可问题,分布式开发等等) - 创造和发布更多的开源代码以惠及大众 - 帮助开源项目确立并带来新的开发者和提交者 我们将会为成功的学生贡献者提供5500美元的奖金,帮助他们集中精力在三个月内编写项目。这个计划完全在线实施。
从这段官方宣传文字里我们已经可以很清晰的看出GSoC的使命:鼓励大学生投身开源社区的开发中去,同时让学生学习开源开发的方法、规范和社区精神。可以说对Google这种土豪,投入巨资搞GSoC很大程度是一种公益行为,通过物质鼓励学生,贡献开源,而开源的大发展对Google来说也有利。 需要澄清的一些问题:
  • GSoC 不是……

  • 帮助就业?

    学生肯定会最关注这一点,尤其是中国的学生。实际上,这仅仅只相当于是个实习而已,对就业的直接帮助并不大。但在整个过程中学习到的知识、技能和能力锻炼,对大学知识的查缺补漏是非常有好处的,可以很大程度上提升以后工作中的发挥。很多中国公司并不知道和了解Google Summer of Code,以及它对学生能力提升的价值,但很多外企对此还是很看重的。而另一方面,参加GSoC会占用大概三个月左右的暑期时间,而这段时间对很多大学生来说,暑期往往是在各种出游闲宅或一些简单重复低层次(如饭馆打零工)的所谓“社会实践”中度过的,与其如此不如通过暑期提升自身价值和能力,是一次超越常人的挑战。事实上,一些非名牌大学,非一类本科高校毕业的学生,是完全有可能通过GSoC达到翻身的目的,更可以借此超过其他同龄人。
  • 谁是核心?



Google Melange 的 FAQ 文档里写得很清楚有关学生参加GSoC的流程,我用图示的方式帮助理解。 [caption id="attachment_1169" align="aligncenter" width="204"]学生参加GSoC的基本流程(点图片可以下载PDF版。CC-BY-SA 4.0) 学生参加GSoC的基本流程(点图片可以下载PDF版。CC-BY-SA 4.0)[/caption] 从这大致流程里可以明白,学生参加GSoC需要很早就开始准备,事实上,大概一年半年之前就投入其中是很有必要的,比如可以从前一年的组织名单中找出心仪的组织,加入其中,了解该社区的项目、文化,组织结构和人际关系,进而通过项目找到合适的贡献。这些基本都可以在洪谦兄的文章里找到,他以 Wine项目 为基础讲述的这些过程是非常非常具体和生动的。 这里要特别强调,不同的开源社区对待GSoC有不同的要求,不要根据 Wine 项目或 FOSSASIA 的情况,想当然地就认为其他社区也是如此,学生一定要仔细阅读社区内部的相关文档。这次很多学生申请FOSSASIA的时候,就发生了不熟悉FOSSASIA的规定,也没有阅读社区里相关文档,而直接被拒绝的情况。可以说Google之所以没有规范开源社区接受学生的具体做法,很大程度也是为了尊重社区的本身精神,体现以社区为中心的宗旨。


当导师比学生轻松,有能力的都来当导师吧,带着学生一起“骗”Google的钱,哈哈哈哈。。。 首先说,为什么去做导师呢?又不给钱,5500美金是给学生的,导师拿不到任何好处。也没什么名望上的提升,除了像我这样写点博客自吹自擂以外,大多数导师最终无人知晓,对自身名望的提升基本可以忽略不计。导师的工作完全是为了社区的利益,为了引导学生参与到社区中来,贡献到社区中来,所以从这个意义上说导师是完全无偿的劳动,一切都以社区利益为先。 在我自己看来,导师的角色有点像是产品经理(PM,Perject Manager)。前期提出Idea,类似产品经理与客户沟通之后,得出来的一个大致开发需求;中间审核学生的Proposal,则是与开发者共同完成需求分析、技术解读和开发计划;而开发中间与学生的互动,则可以类比成不断检查开发者完成相应的Milestone,并与开发者协调修改开发计划的过程;最后项目完成,可以看成是产品发布、验收等。 不过与产品经理不同的是,导师要考虑学生的技术实力,工作时间分配,以及随时关注与此相关的技术变化,以便更好的指导学生完成项目。同时导师也还有一部分工作,是对中期和最终项目完成作出评定和验收,写出评测报告,以示Google此学生已经完好的做完了自己的工作。 一般来说,一个项目不是只有一个导师,一般会有多个导师同时协助,一个是主要负责,其余的都是备份和协助。以防主要负责的导师因为各种各样的原因无法完成时,顶替出现。一些备份导师是由组织指派的,还有一些是由Google指派的。 GSoC对导师的资质并没有限制,只要是参与该开源社区的成员,在组织中有过贡献的,深谙开源社区精神的,经过该组织管理员认可的都可以成为导师。而且即便是提交了Idea,也可以不由提交Idea的人来指导,也可以由别的导师或该组织的管理员指派导师来完成。因此后备导师和协作导师就显的比较重要。


根据GSoC的导师手册,导师在前期是需要完成一些工作的,当然这些工作其实并不轻松。 比如首先就是如何写出一个idea,这一点其实就难住我了(不是因为如何用英文表达)。因为按照GSoS文档里提出来的建议,我的很多idea就不是很适合。比如我想到可以考虑给北京Linux用户组重建网站(因为工作量较大,且烦复不好量化而做罢),还比如我考虑给FOSSASIA会议做一个自助导览机器人(项目无法准确描述需求,而且规模太大只好算了)。 总之,最终我提出来的这个Idea还是和北京Linux用户组的同僚,并在SUSE Hackweek 12上,大家商量过以后一致觉得这还是比较好的一个Idea,所以才有了现在的状态。 其实在提出Idea之前,还有一件非常重要的工作,就是和组织的管理员沟通好,提出的Idea也能得到组织管理员的认可。比如我和FOSSASIA的管理员Mario沟通,表达我的想法,他便给了我Github的提交权限,这样我就可以提交我的Idea了。这里要说明一下,不同的组织提交Idea的方式不同,比如 GNU Fedora ProjectDebian ProjectGNOME 提交 Idea 是直接修改 Idea Page,这往往就是个 Wiki 页面,修改这个页面加上自己的Idea就行。而FOSSASIA的Idea Page是托管在Github上的,所以就用Github的方式,比如通过Pull Request,或直接提交commit。 提交了Idea之后,组织的管理员会来审核这个Idea,并与导师沟通修改,以方便学生更好的参与。


  • 首先是Proposal的专业程度,反映了学生完成项目的能力

    比如我这个Idea,学生至少应该明白OTR(Off The Record)加密是什么,以及在XMPP聊天中的应用(前面我有写博文讲过);另外还有,学生是否考察过类似的开源项目,查看过相应的代码,考虑过是否可以直接引用到此Idea中,或自己实现的能力。因此在审核Proposal的时候,没能谈到这几点的我都会要求其尽快补上。
  • 与导师的有效沟通,表明学生的社区参与能力

  • 其他开源社区的参与

    参与过其他开源社区、开源项目的人,更容易融入到GSoC中来,更容易获得导师的青睐。因此我建议打算申请GSoC的同学,可以多多参与各种国际上的开源社区,积累经验,在申请填写Proposal的时候,一定多多列举你在这些开源社区里的经验。比如我这次指导的学生 Heena,她曾在 KDE 社区中贡献多年,有深厚的社区基础,组织过印度高校的线下活动。你说不选这样的学生选谁? 关于这个多说一句,为什么推荐是国际上的开源社区,主要是因为国内的开源社区尚不够成熟,名气也不大,除非碰上懂国内开源社区的导师,否则不会太多考虑这方面的。我推荐在北京的学生可以考虑北京Linux用户组来过渡一下,因为毕竟这是个在北京的国际化社区,社区风格与国外社区比较接近,作为一个跳板和桥梁,能够让你尽快与国外开源社区接轨。
  • 人情关系



通过对学生的遴选,以及参与其他项目(也就是并非我提出的Idea)的评选。我初步可以归结出学生的一些特性和品质,而有这些品质的学生,更容易获得通过。这些内容在洪谦兄的文章里亦有大段大段的谈论,但我依旧会站在导师的角度,说一些看法。 基本上,无论最终结果如何,整个过程下来,学生可以掌握和提升很多能力。这些能力无论对从事什么工作,都非常有帮助,因此这部分内容我会着墨较多。 首先,对中国学生来说,有三个能力必须掌握,其他国家的学生在这方面不是大问题,但对中国学生来说就是三座大山,要想搞定GSoC必须首先翻过这三座大山!
  • 翻墙。

    必会!!否则你可能连Google Melange后台的网页都打不开!
  • 不要用百度

  • 英文交流和阅读能力

    这里仅限文字交流,除非导师或组织有特别要求,加入语音或视频,否则大多数情况基本的英文文字交流能力就够了。阅读能力主要是阅读各种文档,可以通过阅读Google Melange的文档来检测一下自己的英文阅读能力。根据我的平时感觉,现在大学生的英文能力足够应付了。
  • 时间规划的能力

  • 自主学习能力。

    这是很多中国学生的短板和弱项。何为“自主学习能力”?就是自己辅导自己学习,找到所需要的学习材料,制定符合自己特点的学习计划的能力(特意加粗!)。还举我碰上的一个中国学生的例子,他的Proposal写的还是不错的,经过几番交流,看他的个人博客感觉在前端开发方面还是很有能力,对Node.js/io.js非常熟悉,感觉完成项目问题不大,我因此一直很看好他,再加上是中国学生,我的民族自尊心作祟,强烈愿望想选他。直到有一天,他问出了这样一些问题,这是该学生Proposal的评论区,可以看到我发的问题,以及他的回复(中间略过一些评论): 2015-05-04-053306屏幕截图.png   注意图中,最后那两个红框里的问题。这最后两个问题恰好说明了,他自主学习能力不强,不懂得自己找寻学习材料,学会自我管理和学习。其实他是所有申请学生里唯一一个指出 lets-chat 使用 Nunjucks 模板引擎的,说明他的开发能力非常强,但却问出"Should I learn them first?"这种让我啼笑皆非的问题。。。通过摘录的这些评论,其实也能看出来,他其实并没有很好的理解项目的需求和想法没有自己的主见,事事都依赖导师的确认。再加没有足够的沟通和互动(一个月中总共只有6条互动评论,没有看到他参加IRC和邮件列表讨论)。因此我认为他可能没有强烈的愿望完成此项目,也担心一旦选定他项目有可能半路流产的危险。 另外,Google要求学生每周要写博客总结和展望,这其实也是要求学生通过GSoC,强制培养自主学习能力的一个过程。真可谓用心良苦啊! 根据几年前,我在培训机构担任培训导师的经验,国内一些高校的学生,自主学习能力普遍不足,一些二类本科和三类本科、专科学校的学生,在自主学习能力方面,还是要多多加强训练。如何检测自己的自主学习能力?可以从FOSSASIA的Ideas Page里找一些你感兴趣的 Idea,尝试思考一下,假如你来做你会打算怎么做这个项目?从哪里入手?需要学习什么方面的知识?如何构建自己相关知识体系?
  • 好奇心和求知欲

  • 沟通能力

    上面已经多次强调与导师沟通的重要性,对申请GSoC的学生来说,与导师和社区其他成员的沟通,几乎是评判学生申请能否通过的铁律。但是沟通并不是越多约好,比如因为我有挂IRC的习惯,4月中旬的时候很多申请的学生会在线问我很多问题,把我搞的不胜其烦(其他导师也同样被烦的够呛,结果他们后来都不挂IRC了。。。233)。有些时候往往在我超级忙的时候,还会发来要求解释的邮件等等。 沟通的要求是高效率的沟通。什么是高效沟通?就是在尽可能简短的沟通过程中,解决尽可能多的问题。比如这次获得通过的中国学生 Iris Gou,她问我的问题往往并不多,大多依靠自己解决,但经过点拨和线下社区活动接触,她可以很快上手修改Proposal,找到学习的方向,让社区的成员快速对她有比较好的印象,这就是高效沟通,同时外加她较强的自我学习能力,也为最终选定奠定基础。
  • 适应和社区融入能力

    这一点也是中国学生比较缺乏的。申请FOSSASIA的GSoC中,中国学生很少参与社区活动,也不在IRC聊天中露面,更不会花精力研究社区如何运作等等,往往直扑项目而去。而很多其他国家的学生会考虑参与到社区中去,并且与导师通过各种渠道搞好关系。还比如 Heena,她还没发Proposal就在各种社交网络找寻我的痕迹,从Facebook到Twitter,再到Linkein和GNOME基金会网页,几乎我有涉足之处,都被她找了个遍。。(简直人肉搜索啊),完全没任何隐私的感觉。这也反映了她希望可以拿下GSoC的强烈愿力,让人不得不佩服。 因此中国学生若想搞好GSoC,适应一个社区的氛围,参与社区,融入其中的能力非常之重要,往往看似简单的一些交流和沟通,会让社区导师对你印象大增。毕竟遴选学生,不仅仅是由导师选择自己指导的项目,有时候还会参与到其他人的评选中去,因此,与这个社区里的导师都搞好关系,还是非常有帮助的。而这也是Google设立GSoC的初衷——推进更多学生参与到开源社区中去。


  • Outreachy

    曾经是著名的Outreach Progrm for Women(OPW)计划,这是由GNOME基金会联合其他自由软件社区,自由软件基金会、Perl基金会、Debian社区、Wikimedia基金会等发起的,旨在鼓励全球女性和跨性别者参与自由软件的开发、文档、运营、市场和管理的计划。与GSoC相同,凡是成功完成者,每人也可以获得5500美金的奖励和全球开源会议的差旅补助。与GSoC不同的是,GSoC主要面向计算机相关专业的学生,项目也是以编码贡献为主。而Outreachy则开放更多层面,除了开发,更包括了文档编写,本地化翻译,美工设计,文案和新闻推广,市场和社区运营等开源社区所需的多个方面。同时也不仅仅局限在学生,只要是女性(包括跨性别者)都可以参加!事实上,目前中国有至少3名女性已经成功完成了这个计划,她们涵盖了美工设计、项目开发和本地化翻译这几个方面。而这个计划目前的要求是女性和跨性别者,因此如果男性想参加,只能挥刀自宫了!(不过可以去当导师。。嘿嘿)
  • 其他



Google Summer of Code计划高明的地方就在于,Google创造了一个共利共赢的平台,学生能拿到物质奖励,开源项目可以得到代码贡献,Google则收获了名望。正是因为这种大家都得利的状态,所以才可以使其从2005年创立的十年来不断壮大。这就是为什么国内某些“开源”平台,刚开始声势浩大,结果半年多之后就开始淡出人们视线,也很大程度是因为没有打造一个众赢的平台,而仅仅只是自己得利而已。 从Google的角度,创立Google Summer of Code的公益目的是非常明显的,它给学生的奖励除了5500美金,还有500美金的全球开源会议差旅补助,可以让学生参与开源项目的同时又能与全球开源届的大牛,面对面深度交流。而这么做的最重要目的是要求学生持续的开源社区贡献。 什么是持续的开源社区贡献?比如洪谦,他2012年参加Google Summer of Code,当年还是个大四的学生,为了“骗得”Google的5000美金奖励而加入GSoC,选择了给Wine项目报Bug,这个当年在他看来比较“清闲”的工作。当他成功拿到GSoC的5000美金之后,并没有停下在Wine项目上贡献的脚步,继续在Wine项目上作出自己的贡献,成为核心开发者,并成功入主Wine的母公司CrossOver。至今依旧活跃在Wine项目中,为大量Windows下软件可以运行在Linux和Mac OS X平台而努力。同时,他现在还自诩是“GSoC助教”推广和帮助希望申请GSoC的学生更好的加入,经过他的协助有多位学生都成功完成GSoC。他也正如他自己所说,真正成为了一名开源社区的“扫地僧”!因此,洪谦这几年的整个过程就是实践了持续的开源社区贡献。 这么多年,参加Google Summer of Code的中国学生有多少呢?拍脑袋保守估计一下,至少100有余,而参加过的导师也在3~5名左右。在洪谦之前,推广GSoC的却几乎没有(只是“闷声发大财”),很大程度因为这些学生,参加过GSoC以后,没有做到持续的社区贡献。简单来说,GSoC只是一个人“开源生涯”的起点,而不是终点。GSoC结束并不等于不需要继续贡献开源了,相反更需要持续的贡献其中,可以不再继续GSoC的那个项目,那个社区,可以转投入其他项目,其他社区贡献。这种持续的社区贡献,也正是Google Summer of Code和GNOME基金会的Outreachy(Outreach for Women)近十年来长盛不衰的法宝。 所以,作为GSoC的导师Mentor,我们的工作是什么呢?除了指导学生完成TA的GSoC项目开发,完成整个社区的开发任务,我们真正要完成的,其实是在遴选和甄别学生的过程中,发现和培养那掩藏在芸芸众生中,可以如洪谦这样为开源社区持续贡献,投入毕生力量的“扫地僧”。



前几天看了一篇文章《5 Ingredients for Building Community》,原文讲了构建一个设计师社区需要什么,作者将这些总结成了5个P打头的英文单词:Purpose(目标)、People(人)、Practice(实践)、Place(场地)和Progress(进取)。仔细想想,这5项要求几乎可以覆盖到所有社区,当然开源社区也依旧适用,不过却因为开源社区的特殊性,又有了不同的变化和含义。 我认为中国的开源社区缺少很多基本的能力,因此我将这些品质要求,与原文这5个P打头的英文单词放在一起,最终是这样的:


  • GNOME 基金会:To create a computing platform for use by the general public that is composed entirely of free software.(以完全自由软件构建公共通用的计算机平台)
  • Fedora Linux:Freedom. Friends. Features. First.
  • OpenCV: was designed for computational efficiency and with a strong focus on real-time applications. (OpenCV 是设计用来大幅度提高实时应用中的运算效率)
  • Blender: We want to build a free and open source complete 3D creation pipeline for artists and small teams. (我们的目标是为艺术家和小型团队构建一个自由开源的全3D创意流水线)


开源社区不同于其他社区,甚至与很多技术社区又有很多不同,这里面的关键是开源社区里的人是特定的一类人——黑客!每次我都要说,黑客与所谓“骇客”是不同,黑客以研究计算机并让计算机为人类服务为己任,而“骇客”则是以损坏别人的数字财物,盗取别人的隐私和财产为目的,是一种犯罪行为。“骇客”的行径是为黑客群体所不齿的。 那么黑客都有那些品质呢?这可以从《黑客——计算机革命的英雄》(Steven Levy 著)一书中得到解答,里面总结了一套黑客伦理,伦理原则强调”共享、开放、分散、为操纵机器不惜任何代价”,与PC文化与互联网文化的精神内核一脉相承:
  1. 对计算机的访问(以及任何可能帮助你认识我们这个世界的事物)应该是不受限制的
  2. 任何人都有动手尝试的权利!
  3. 所有的信息都应该可以自由获取。
  4. 不迷信权威——促进分权
  5. 评判黑客的标准应该是他们的技术,而不是那些没有实际用途的指标,比如学位、年龄、种族或职位。
  6. 你可以在计算机上创造出艺术与美。
  7. 计算机技术可以让你的生活更美好。


社区里有了人,大家做什么事呢?其实大道理都懂,但现在中国的很多开源社区,让人觉得像“死”了一样,因为其已经很久没有实践活动了,没有聚会,没有代码,没有产出,更没有人际交流,可以说完全是名存实亡了。 开源社区根据目的不同要做的事情也不尽相同,以开发开源项目为目标的,主要活动肯定是以开发展开,比如编写代码、Bug维护、文档、美工和产品推广;而以推广技术为目标的社区,主要活动会围绕技术本身展开,比如实例开发、本地化/国际化、推广活动和市场。这些活动各有各的特点,也各有各的要求,不同的实践活动因为有了合作,而突显了团队协作的重要性,同时因为跨领域、跨学科的融合,为不同学术背景的人构建了一个充分交流和合作的平台。 由此其实可以推演出一个结论,所有这些实践活动的最终都是一件事——交流。就比如台湾的COSCUP(开源人年会),他们有一个清晰的目标:四成演讲,六成交朋友。这简明而清晰的目标直接述说了开源社区的根本目标,就是人际交流而导致的产出,开源正是因为社区交流和合作,而带来的新的开发方式上的巨大变革。因此开源社区的主要实践就是要促进人际交流,促进去中心化的合作。


与《5 Ingredients for Building Community》不同,这里不是Paces(地点),而换成了Persionality(个性)。因为开源开发更多的是线上活动,线下活动比较少,更没有太多要求,而为了交流的目的任何资源都可以被利用起来,反倒是个性往往是被大家忽略的。 很多中国的开源社区有个不好的思想,认为开源社区必须“挂靠”在某个组织下面,或者大公司大企业,丝毫没有想过开源社区应该是独立自主的。其实这里我不想说太多个性,更多的是讲自主。开源社区必须有自己的风格,有独立的运营能力,而不能依靠别人的力量。因为越是依赖别人,就越是将自己应该承担的义务由别人来承担,与此同时也就把自己可以享有的权利,也一并让渡给了别人。因此开源社区必须明白这个道理。虽然俗话讲“大树底下好乘凉”,但离开了罩着你的“大树”,这个社区还能不能独立存在?还能不能独立运营下去?上面讲过的一些社区之所以后来名存实亡,就是因为缺少了独立自主的能力,最终葬送了自己。 不仅社区如此,社区里的每一个成员也都应有自主能力。能不能自主贡献开源项目,能不能找到自己在社区中的地位和价值,完全取决于自主的程度。台湾的零时政府)有一句名言“不要说‘为什么没有人’,你就是那个‘没有人’”,这句话直接回答了”为什么没有人做XXX?“这种问题。对有志于参与开源社区的人来说,永远不要问”为什么没有人做XXX?“,”怎么没有人来做XXX?“这种问题,因为当你发现需要改进的时候,就是需要你贡献的地方,不要等着别人来做而你享受成果,而应该努力贡献在你发现的问题,也许这就是你价值体现的地方。


对社区领导者来说,能否提供给社区成员个人成长的空间是很重要的,但比这更重要的却是整个社区的进取能力。如果一个社区只有各种混吃混喝,或者开发的开源产品不能跟上时代,很快被取代,没有让人看到社区进取的能力,这样的社区会最终分崩离析的。 北京一个推广某开源项目开源社区,曾在2008年的一次活动后名噪一时,也深谙开源社区需要多多交流的道理,所以利用活动剩余的赞助费,盛情招待社区成员吃吃喝喝,这本是一件很好的事,可是后来很长一段时间,大家参加社区活动都为了蹭吃蹭喝了。多年后,这个社区渐渐名存实亡,无法开展起完好的活动了,甚是可惜。回顾这段过程,并不是因为大家蹭吃蹭喝,而是因为社区在推动技术上努力太少,后期也没有什么贡献了,无法招揽并留住新成员。 再举一个我参加过的例子,2012年和几位同好决定成立一个开源硬件的社区,目的是为了构建完全开源的四旋翼飞行器Open-Drone。社区规模还是很大的,也有大量活跃成员,甚至还上了《环球时报》(英文版)和《今日北京》(英文版)等报纸。但很快随着老成员离开北京,或忙于自身事物,社区最终在去年归于平静。现在回想,大家的目标是For Fun,而在技术层面迟迟没有太多推进,产品最终也没有原型开发出来,虽然最终有很多附加产品出现,但社区却始终没能发展和留住新成员。 说到底,社区的进取是伴随着每个社区成员的不断进取奉献的。上面的两个实例可以很清楚的看出,社区成员个人要有努力进取的动力,同时社区也要给这些成员发展的空间,鼓励和促发新成员找到自身价值,尽快融合到现有社区结构中来。   简单来说,一个目标清晰明确的社区,会吸引来那些适合的人,一起来做适合的事,在交流和合作中体现价值。而这一切依赖于社区和每个人的自主能力、进取精神和上升空间。 希望此文中所讲的开源社区最需要的Purpose(目标)、People(人)、Practice(实践)、Personality(个性自主)和Progress(进取),可以帮助那些迷茫在开源社区运营中的人们,一篇小文不足以解决所有问题,但我依旧希望可以指明一个方向。

大家一起完善 OpenStreetMap 协助尼泊尔救灾

转自台湾 的林雨苍的Facebook原文
尼泊尔发生了大地震,造成许多人丧生。目前该地区亟需救援。 但救援的第一个前提是该地区的路网需要被标示,因此目前开放街图(Open Street Map)计划正在利用卫星地图快速画出当地偏远地区道路路网,协助救难人员前往该地区救灾。目前需要大量人力协助。 目前有两个协助完善路网的计画: 这是多人协作的任务,所以开始编辑时会锁定地图,可以稍微作个两三条公路就存档、解除锁定,让其他人继续编辑,所以请不要担心一编辑就要完成。不过请记得完成编辑后要解除锁定喔! 我刚刚编辑了一下,发现难度没有很高,因此写了一篇教学,请有空的朋友可以去尝试看看。 本文欢迎大家分享、转贴。 相关连结: 尼伯尔地震OSM Wiki协作指引页面 相关讨论: [1]协作指引连结和发问区: [2]twlandsat、NSPO图资使用可能: 若有问题,欢迎至 OpenStreetMap台湾 提问! PrayForNepal
本人补充两句,在大陆标注 OpenStreetMap 这种行为可以被提升到“违法”的高度,也就是所谓的“非法测绘”。我们虽然不能公开和高调的参与标注国内地标,但可以通过互联网协助其他国家,完善其地标,方便尼泊尔的救灾。人人为我,我为人人。 也许下次中国的大灾难,也会有别国的热心网友,通过互联网来帮忙!








Google Summer of Code 2015, I am a mentor…

As Google required for students, when this program starts they should post blogs every week, but no any requirements for mentors. However, as a GSoC mentor, I want to share what I thinking during this time, and post what I've learnt by the end of some mile-stones. I would like to write some notes and thinking to this blog, but may not so frequency as weekly, maybe monthly or every two weeks. As the language, I prefer English for that, but some reason, I am not good at writing English essay, so that I may post some Chinese blog future.

First time for me

When I graduated from my collage, I've heart Google Summer of Code first time, but that time was so rush, and that should be my last time to apply this program as a student. So I missed GSoC when I was a collage student. So, when I apply to GSoC this year, this should be my first time to attend GSoC ! Last year, I followed with FOSSASIA, attend Google Code-in program, which focuses on encouraging middle school student contributing FOSS projects. By the end of Google code-in, I considered that how about continue follow FOSSASIA to GSoC, cause they already attend GSoC for about four years, so that they have very large number of succeed in this program.

What project I involved?

I submitted a idea at the FOSSASIA Lab, it about what I want to do during this summer. You may curious that why I eager to start this project? You could find what I focus on recently by looking over my previous article, I am working on promoting XMPP-based instant messaging tools and chat with OTR encrypted messaging via XMPP. But for Beijing GNU/Linux User Group, we want to use a self-hosted chat sever and port encryption on it, especially for people join in easily . So that we do so many research on it, and tried so many projects, finally we find a project named lets-chat, that is a fantastic project. It has a XMPP protocol back-end, and a web clients, further more, it focuses on group chat, same as Slack do. Unfortunately, lets-chat doesn't has a support for encryption chat, so we have to port a OTR encryption on it, that's what this project doing during this GSoC 2015.

How about students?

By the end of March 26th, I received four student's proposals, two Chinese and others are Indian. After reviewing these four proposals, and make some comments on that, most students are very active with me, make some modification after my suggestion. Finally, I chose two students for this project, cause they make their best for the project, and make their contribution before this program starts, good communicating with me and other mentors. We discussed more about our project and learning what we want to implement, finding exist FOSS project that we could import in, and built a online platform for our testing. They are all genius and excellent, that means I have to do more to catch up them :)


Sorry for that, I nearly forget organization. FOSSASIA is the fifth time attend Google Summer of Code, there are a large number of success by GSoC and Google Code-in. When I met Hong Phuc first time at GNOME.Asia 2012, they just finishing a FOSS Game distribution at that year's GSoC and they managed to make a topic showing that project. Thanks to Mario and Hong Phuc, they organizing Google Summer of Code events more and more efficiency, more mature and more professional, so that a lot of mentor would like to join in their GSoC and submit lots of ideas. Besides, FOSSASIA is working on FOSSASIS summit every year, which gathering FOSS contributor and company join in a three days summit. I attend this year's FOSSASIA in Singapore, in this event, there was so many talks and workshops, more than hundreds speakers and sponsors. That was a awesome experience during this time.

More Challenge...

I was working on Embedded Linux and worked in several training agent as a training mentor and evangelist before, but for this front-end project, I am totally fresh man, it is a big challenge for myself. As a result, I have to do more research on front-end ,JavaScript, Node.js and UI design. Further more, it is my first time mentoring students out of China via Internet, that would be some problem with timezone - India has two hours later than China, and language - I never mentoring students in English before. But I believe that we could solve these problem by working together tightly! Why I start mentoring GSoC idea, not because it's easy, but because it's hard, because that program will serve to organize and measure the best of my energy and skills, because that challenge is one that I am willing to accept, one I am unwilling to postpone, and one I intend to contribute to FOSS projects...


I suppose FOSSASIA would recive more slots for their Google Summer of Code next year, and make FOSSASIA summit more successful. For mentoring students, I suggest they could be involved in FOSS project deeply, and make their contribution more and more. If it is available, I would like encourage them join in some FOSS conferences to meet more people and learning more things by traveling to other countries. And for these two girls, I suggest they could involved other program like Outreachy by GNOME Foundation, and Women Who Code, which focusing on encouraging women to FOSS projects. For me, I would be involved in Google Summer of Code time by time, and as a GNOME Foundation member, I would love to be involved in Outreachy Program as a mentor, mentoring more and more students and girls into FOSS world. And I would love to promoting FOSS in China as usual. By working in Beijing GNU/Linux User Group, Fedora China and GNOME Foundation, I could make my contributions to these projects. Yes, There's a road starts under my feet...












[转载] 窗外有自由——給自己一個正確認識 Linux 的機會

(刊載於「資訊與電腦」雜誌, 2000/08)[16] Linux 的爆發力, 廣受媒體注意; 然而此爆發力更重要的, 是它背後蘊釀已久的自由軟體思潮與文化。 企業的資訊部門主管若想作出有前瞻性的決策, 或許更應該深入了解自由軟體文化, 而不是只看到針對爆發當時的各種細節報導。 許多批評 Linux 是短暫狂熱的文章, 就像是試圖要以單獨一張飛球的照片要判斷這些飛球的去向一樣, 缺乏時間軸的縱深。 試想: 17 年前 Richard M. Stallman 創立自由軟體基金會 1; 9年前 Linux Torvalds 以 GPL2 釋放 Linux 核心, 當時的自由軟體不論從技術面、親和力, 或商業支持的角度來看, 都乏善可陳。 當時如果以靜態的眼光試圖去預測未來的發展, 如何能夠想像接下來的「軟體界變天說」、資訊大廠的挹注資金, 以至今日資訊家電棄微軟就 Linux 的趨勢? 公元2000年, 或許是某些預言的世界末日, 但並不是軟體自由化現象的終點。 且讓筆者從電腦使用者的角度著眼, 打破「Linux 不值得信任」的迷思, 說明為何使用自由軟體才符合企業與個人的長遠利益。


這是不願意使用 GNU/Linux 的企業最常問的問題。 真巧, 這也是我想請教所有合法的MS Windows與MS Word用戶的問題。 你的應用程式出現「請與程式設計師聯絡」時, 你的文件中毒時, 或者你的 Windows 罷工時, 是誰幫你解決問題的呢? 是賣 Windows 或 Word 使用權給你的微軟公司嗎? 恐怕不是。筆者倒不是在指責微軟不替中Mellisa、CIH、ILoveYou 病毒的使用者善後 -- 他們的確沒有義務這麼作。 請打開 help\licence.txt 檔看看, 清楚明白地寫著微軟並不提供軟體產品之支援服務。 購買版權私有軟體 (proprietary software) , 買到的不是保障與服務, 而是使用權。 當然, 企業級的用戶可以在購買軟體使用權之外, 另外與軟體公司簽訂維護合約。 該與誰簽約呢? 如果我是MIS部門主管, 必然選擇與該軟體的製造商, 而不與其他任何廠商簽約。 這不是在替微軟或者... (呃, 台灣還用了那些其他軟體廠商的產品呢? 一下子還真不容易想出來) 在作廣告, 而是因為只有製造商握有該軟體的原始碼, 遇到問題時, 只有他們的工程師有機會深入探究問題的核心。 「軟體可以自由拷貝, 如果出了問題該找誰服務? 」 這樣的問題, 顯然把兩件事情混為一談了。 對於 GNU/Linux 等自由軟體的用戶而言, 軟體的使用權是免費的; 但如果需要技術服務那是另外一回事, 就像版權私有軟體用戶一樣, 必須另外購買。 即使你的 Linux CD 購自廠商, 也未必附贈有技術服務, 你所購得的往往只是方便, 精美的手冊和光碟片而已。 然而不同於版權私有軟體用戶的是: 自由軟體用戶有選擇技術服務廠商的自由。 美國的 Red Hat、 台灣的網虎, 或許是當地目前最具聲望的 Linux 技術服務廠商, 但是如果有一天他們的合約費高過頭了, 或是服務品質不佳, 還有很多自由軟體的 service providers 等著與你作生意。 因為自由軟體的程式原始碼不為任何單一公司所擁有, 後者的工程師一樣可以深入原始碼解決你的問題。3 甚至是微軟, 如果他們願意的話, 也可以出售 Linux 的服務合約 -- 因為他們的工程師也看得到 Linux 的原始碼。 事實上在國外, 自由軟體的服務合約市場已越來越成熟。 例如 IBM, HP, RedHat, Suse 等廠商都出售自由軟體的服務合約。 對消費者而言, 能夠從微軟處買到什麼樣的 MS Windows 服務合約, 就一樣可以從這些公司買到相同等級的 Linux 服務合約。 更好的是, 如果對這些公司提供的服務還不夠滿意, 你甚至還可以直接找軟體作者洽談第一手的程式修改服務 -- 沒有人或公司有能力擋在消費者與程式設計師之間。 當然程式設計師是否同意這麼做是另外一回事; 但這個可能性, 在專屬軟體的世界卻是完全不存在。4 當你同時使用數種不同的軟體時 (例如作業系統, 資料庫, 網頁伺服器), 自由軟體的優勢更明顯了: 如果你使用的是版權私有軟體, 而這些軟體來自不同的廠商, 那麼發生問題時更有可能因為廠商之間彼此指責反而沒有人可以負責 5; 然而如果你使用的是原始碼公開的自由軟體, 出售服務 (而非軟體) 的廠商就沒有任何藉口可以推卸責任了. 「使用自由軟體, 出了問題, 該找誰? 」對於這個問題, 我沒有答案, 因為選擇的自由在你, 消費者的手裏。

版本眾多, 相容性問題如何解決

有些人認為 Windows 是一個比較有保障的選擇, 因為它由單一公司掌控, 版本變化較小; 反觀 Linux, 有 Red Hat、Debian、Slackware, ... 等等眾多不同的版本, 其間的紛歧將造成相容性的問題, 對消費者終究是弊多於利; 對工程師而言更會使學習的負擔增加數倍。 如果我們把這樣的邏輯套到影音設備上, 得到的結論就是: 世界上的家庭劇院產品最好是由單一公司統一包裝出售, 不要有太多不同的版本; 如果把它用到電腦硬體上, 所得到的結論就是: PC最好只有一種廠牌, 才不會有不同PC之間不相容的情形; (咦, 這不正是蘋果電腦公司的做法嗎? ) 再把它用到汽車上, 所得到的結論就是: 全世界的汽車最好只由一家廠商來生產, 以免用 Ford Escort 學開車, 之後卻遇到 Nissan Sentra 就不會開了。 相容性問題的根源不在於有多少廠商生產多少種不同的產品來競爭, 而在於參與的廠商是否全力支援公開標準的通訊介面。 影音設備市場之所以活潑、消費者之所以可以享受選擇的自由, 是因為影音設備之間的連線、接頭不外那兩三種, 這些接頭的規格不為任何一家公司所獨有, 任何廠商都可以生產相容的產品。 各家產品可以在功能上不斷推陳出新地競爭; 但接頭規格卻必須在有實質需求, 且受到眾多廠商支持時, 才會更新。 PC 硬體市場也是這樣, 從 ISA 到 PCI 架構的這段時間當中, CPU、週邊設備的功能已經由於激烈的競爭而提升許多 (另一方面價格也下降許多。 請與 Mac 比較) ; 但相容性的格式卻沒有對消費者造成太大的困擾, 只要共同支援公開的PCI介面, 從來也沒聽說過主機板和週邊設備必須來自同一廠商這樣的理論。 軟體亦復如此, 不同的 Linux Distributions, 就像是不同廠牌的音響或不同廠牌的 PC, 把它拆成零件重新組合不僅是可行的, 有時甚至是必須的。 大部分與系統核心相關性較低的套件很容易就可以互換使用。 我的 486 筆記型電腦因為硬碟太小, 又沒有光碟機, 只能安裝slackware。 然而在上面安裝來自我桌上型電腦 Red Hat 的應用軟體, 也是一件輕而易舉的事情。 工程師只要學會操作命令列及 regular expression 6 等組合性高的共通介面, 不論是從 Mandrake 換到 Debian, 甚或是從 Linux 換到 FreeBSD, 都應該像更換汽車廠牌一樣容易。 事實與先前似是而非的邏輯正好相反: 使用封閉通訊介面/檔案格式7 的軟體, 才是相容性的殺手; 而程式原始碼未公開的版權私有軟體, 正是部分廠商刻意安置封閉通訊介面/檔案格式地雷的最佳掩護。 不同版本的Word之間莫須有的不相容問題, 就是最明顯的例子。 8 GNU/Linux 及其上的自由軟體, 不僅支援公開的標準, 連程式原始碼都公開了, 廠商難以刻意製造不相容的產品, 更缺乏如此做的動機, 除非它還沒有理解微軟的壟斷手法在自由軟體時代已經不適用了。 如果真有廠商刻意如此做, 其他廠商從修改過的程式原始碼立即可以看出如何解決不相容的問題。 如果你真的在意相容性的問題, 更應該盡快以開放的 GNU/Linux 取代封閉的MS Windows。


「Linux 對硬體支援不佳、安裝困難、缺乏友善的圖形介面、欠缺應用軟體」 這些都是過時、片面、靜態的描述。 如果你有心了解當下事實的真象, 只消問任何一位熟悉 Linux 的工程師, 就會發覺即使單單從技術面考量, 微軟視窗在上述各項當中都已有許多細節遠遠落在 GNU/Linux + XFree86之後。 筆者認為更值得大家深思的, 是這類說法盛行的原因。 例如 ZIP drive 在上市一段時間之後, Linux 才能使用, 並且初期的驅動程式效率不佳。 然而仔細探究原因, 問題其實出在 IOMEGA 公司不願意公開 ZIP drive 的介面。 對於公開的標準, 如IDE、SCSI等, 自由軟體程式設計師很快就能根據 specification 寫出驅動程式; 但若買到使用 proprietary interface的硬體, 對他們而言, 就像買到沒有說明書電器一樣, 必須冒著燒毀電器的風險, 以嘗試錯誤的方式很辛苦地找出正確的操作順序。 硬體廠商不提供軟體操作介面的技術文件, 造成程式設計師必須額外投入逆向工程的時間精力以達相容的目的 (尚且不談法律問題), 最後吃虧的終究是消費者: 降低了作業系統選擇的自由度 -- 為的卻不是 (但看起來彷彿是) 技術層面的原因。 再以「難以安裝」為例, 試想如果一位使用者取得一部已安裝有 Linux 的電腦, 現在給他一片 Windows CD, 要他在保有 Linux 系統上既有資料的前提下, 把 Windows 裝在第二個分割, 那麼 Windows 的安裝又談何容易? 以這樣的邏輯來批評 Windows 難以安裝看似荒謬, 但相同的邏輯卻是許多 Linux 批評者未曾明說而直接視為理所當然的要求。 若再仔細深究, 你會發覺一部機器同時要安裝兩種以上的 OS 之所以困難, Windows 其實是最大的困擾來源。 筆者在 x86 架構上所使用過的數種作業系統當中, 唯有微軟系列的產品無法安裝在邏輯分割上, 對多個主分割支援不佳, 未提供可載入不同作業系統的真正多重開機管理程式, 卻又會暗中對 MBR (Master Boot Record) 作不必要的修改。 只有微軟。9 筆者的用意不是在貶低微軟的技術能力, 而是在指出「Linux 不好安裝」表象之下, 問題的真正根源。 一個綁匪可以對者關在囚房內的人質說: 「我提供你山珍海味, 你不需要其他食物。 有那一種食物可以像我提供的山珍海味一樣, 那麼方便地放在你的桌上呢? 」 但他不會指出其他食物之所以進不來, 是因為他刻意把它們阻擋在窗外。 他更不會告訴你山珍海味內是否施了鴉片, 讓你上癮之後, 即使重獲自由也非得繼續回來吃他的食物不可 8。 筆者認為食物是否美味還是其次, 即便綁匪所提供的美食確未下藥, 我還是必須堅持掙脫禁錮, 因為我的一輩子比一頓飯的時間要長得多。 你呢? 你的企業是否打算經營超過一個版本的 MS Word 的壽命呢? 堅持只願意看 "windows 能, 而 linux 不能" 的部分; 堅持對於 "linux 能, 而 windows 不能" 的部分視而不見, 是一件很可惜的事情. [也請看看有那些事情是自由軟體能做而版權私有軟體不能或不方便做的?]

不管你把 Linux 說得多好, 現在流行的還是 Windows 啊!

沒錯, 現在流行的是 windows. Windows 之前流行的是 dos. 更早之前流行的是 Apple II 的 basic. 在那個「個人電腦」等同於「Apple II」的時代, 如果有人跳出來說個人電腦市場的主宰者將換成 wintel 組合, 有誰會相信呢? Wintel 組合之所以能夠打敗 Apple II, 又豈是因為它本來就佔有較大的市場呢? [市場生態] 一時的流行未必是長遠的最佳選擇。 即使市場佔有率可以作為消費者選擇軟硬體品牌的參考因素, 這也是一項動態的因素。 不要忘記, 佔有率是一個比值, 當整個市場的大小成長數倍時, 舊市場的龍頭大有可能變得無足輕重。 新的競爭者毋須與舊龍頭正面交鋒, 往往只需要以其價格優勢即可進入 (應該說創造) 更低階更大圈, 舊龍頭無法進入的新市場。 而新競爭者的價格優勢從何而來? 軟硬體元件之間使用公開的資訊接駁管道, 廠商公平競爭, 消費者享有選擇元件的自由, 是電腦價格下降, 市場擴大的重要原因之一。 Macintosh 比起 Mainframe 的優勢在哪裏? 因素固然很多, 但 API 公開, 應用軟體來自眾多公平競爭的 ISV (Independent Software vendors) 是其中重要的一項。 Wintel 組合 (Windows + Intel) 比起 Macintosh 的優勢在哪裏? HPS 公開, 主機板, CPU, 介面卡, 來自眾多公平競爭的 IHM (Independent Hardware Manufactures) 以致 TCO (Total Cost of Ownership) 降低, 這是主要的因素之一。 GNU/Linux 向下可與多種不同的硬體平台組合, 向上則提供完全公開的各種資訊接駁管道 (連原始碼都公開了, 還有什麼介面隱藏得住呢?) 應用軟體研發商不需要付任何版稅即可支援 Gnome Office 的檔案格式。 有什麼力量可以阻止 GNU/Linux "勇敢地進入沒有電腦去過的地方" ("to boldly go where no one [computer] has gone before"), 像是中國, 印度, 中南美洲及非洲的偏遠地區呢? 10 當我們驚覺新世紀的多數電腦使用者礙於法律限制, 都無法讀取我們的 .doc 檔的時候, 又將如何追得上更新的流行呢? 盲目追隨流行的表象, 而不去深究每一波流行的原因及它所帶來的問題, 恐怕是最能夠傷害企業永續經營的利刃之一。 蛋塔熱現象值得我們資訊人警惕。


讀者可以在、 slashdot.org或 linuxtoday.com等網站上找到更多的事實。 如果你願意多上這些網站, 或許也會和筆者有一樣的結論: 不只是伺服器, 連桌上型電腦也應該盡快換成 Linux、FreeBSD 或 Hurd 等自由作業系統。 然而就像政治的世界當中, 爭取自由必須付出代價一樣, 全面改用 GNU/Linux 及其上的自由軟體也必須付出代價。 就像政治世界的自由, 有爭取過程的短暫痛苦, 和獲得自由之後伴隨而來的長期責任一樣, 改用自由軟體也有短暫的痛苦和長期的責任。 筆者不建議立即全面改用 Linux, 但是以下觀念與做法或可盡早實施: 從現在開始, 避免使用封閉的檔案格式與通訊協訂。 這兩者是部分版權私有軟體控制客戶的利器。 微軟內部的「萬聖節文件」11 不小心被揭露, 從他們自己的觀點來看, 更容易明瞭這個手段對消費者的傷害。 同樣道理, 避免使用介面不公開的硬體, 或者進一步站起來向這些廠商要求他們公開其產品的程式控制介面。 從現在開始改用跨平台的應用軟體。 一套侷限在單一作業平台執行的一般應用軟體, 就像一套只能擺在某戶特定公寓的家具, 或一付只能接在特定廠牌擴大器的喇叭一樣, 不論它本身品質多好, 對於永續經營的企業而言, 並不是值得長期信賴的解決方案。 Linux 的壽命會比 Windows 長很多, 但你希望企業的壽命更要長過 Linux 吧? 向拒絕轉換的技術人員說明學習 GNU/Linux 的優點。 尤其是打算長期從事技術工作的人員。 Linux 上的 GNU (革奴) 軟體及其他自由軟體一開始確實比較難上手; 但它們良好的組合力是很多資訊從業人員所忽略的重要優點。 把時間、投資在這樣的工具上, 才能讓新舊知識發揮相乘的效果, 才能讓解決問題的能力成指數成長, 6 而不致讓技術人員自己淪為軟體廠商更新版本的犧牲品, 成為歷史上某一版的MCSE。[12] 事實上在 Linux 上所學習的技術, 如果搭配適當的軟體 13, 移到 windows 下一樣有用; 只不過受限於 windows 對於 interprocess communication 支援的先天不足, 比較難伸展而已。 重視安全問題。不過我們要談的不是 「因為程式原始碼公開, 所以不安全」的問題。 那樣的想法叫「security by obscurity」, 研究資訊安全的專家都知道這是不成立的。 了解自由軟體文化的人, 認為其上資訊安全問題最弱的一環在系統管理者身上。 Linux 上解決安全問題的版本經常在問題發生後數小時至數日內釋出, 但若你的系統沒有更新, 就無法獲得保障。 其他軟體不急著追新; 但是應該給你的系統管理員足夠的「閒暇」 時間去注意最新的security patches。 改變「購買軟體, 附贈服務」的觀念。 Linux 及其上自由軟體可以自由拷貝, 但技術服務需要人力, 當然要收費。 鼓勵軟體廠商以更好的技術服務競爭, 而不是只以「附贈服務」的方式削價競爭, 才是消費者之福。 在台灣的資訊生態系內, 要完全揚棄 Windows, 改用 GNU/Linux, 短期之內恐怕不容易。 但是我們現在不這麼做, 遲早會被沒有微軟包袱的 「開發中國家」間接逼著做。10 與其到了逼不得已才勉強打破窗子, 不如現在就探出頭來真正認識窗外的世界, 主動作出理智思考後的判斷, 勇敢走出視框, 邁向自由。


[12]: 也請到 找到被歸類為 "Score:5" 的讀者投書。 [15]: 本頁最新版網址:; 您所看到的版本: February 13 2012 19:32:24. [16]: 作者: 朝陽科技大學 資訊管理系 洪朝貴





布里斯班是我心里明珠(广义的,包含了卫星城们),之前我自己在博客上赞扬过,说人类造的城市,只能这样好了。这话不是说它发达富贵,只是说它适合生活。中国人喜欢把布里斯班叫做布村,意思是它小。其实四百万人,连上卫星城,算是一个Global city,虽然比不上深圳的一半,却比兰州人口多,称为村只是见其可爱而已。

到深圳的第一天,我首先领教了大中华物资丰富,把布里斯班抛在后面。超市里琳琅满目,商场动不动四五层,真是不到中国不知道竟然有这样多的品牌在一起斗艳。在布村,服装品牌半数是临街的独立店面,而中国必是在商场里,人被店面包围,所以觉得争奇斗艳。这样四五层的商场,布村虽然没有同样多层的,确有规模相当的,Garden City是也,我每两个月会去一次。但是深圳四五层的商场是每条大街都带一个,每个地铁出口都能找到一家,每天吃个午饭都去!美食城和饭店也是一个接一个。这足令澳洲来客觉得乡下人进城了。悉尼和墨尔本的客人也许不会惊到,那里购物中心更多,但是悉尼和墨尔本应该去跟北京上海比,布村应该跟深圳比。










  • 飞机还没停稳的时候,机仓里不再有啪啪啪的解开安全带声音,大家也不抢着离开飞机了。
  • 飞机在天上的时候,我看到有趣的一幕,一位乘客觉得被冒犯了,差点跟男空乘打起来。大家一定以为又是中国人的德性了吧,其实两边都是马来人,中国乘客安静得很没事。
  • 在一个二线城市(不点名)取行李的时候,往年大家会抢着占地方,不少人跳到行李转送带中间的岛上,以便自己行李第一时间抢得到,尤其是飞机夜里到的时候。今年我到的时候午夜12点,这里秩序井然,没有人跳到行李转送带上。
  • 十字路口上,机动车道换信号灯要提前人行道几十秒。这段时间,人行道明明是红灯,大家都会统一闯红灯。今年我意外发现,只有约三成深圳市民闯红灯,大多数人等到人行道绿了再走。


我离开宝安机场到深圳大学,晚上拖着行李过人行道。这个人行道是slip line上的,就是连接三角形安全岛跟步道的人行道,不受红绿灯控制。一辆出租车以60公里速度呼啸过来,大灯开得雪亮,在我面前来个急刹车,笛声高响,吓死人了,好在没把我碾死。这事其实是我不对,我在中国长大,应该懂得的不能信任人行道,有人行道也要左看右看再三确认才可以走。这次是刚回来还没习惯,所以差点送命。

















她 曾经是上海交通大学建国后首批毕业生 曾经是朝鲜战争中首批雷达兵 曾在十年浩劫中起起落落 image 她 更是我的姥姥 她与癌症抗拒了17年 今天凌晨还是走了 与波澜壮阔的一生不同 走的时候很安详很平静 享年87岁 为缅怀,全网站采用灰黑色界面7天。


国内的互联网服务越来越流氓,现在微信已经需要实名验证才能加入群聊。早在微信刚出来的时候,就非常流氓的会要求导入手机通讯录。同样的超级流氓,还包括QQ,因其封闭其他开源实现,而自身的Linux客户端早已废置,总之放弃这样的流氓已经刻不容缓! 特别是其后还有无比流氓的天朝官府。如果不想被“有关部门”监视盯守,使用去中心化的,且完全由自由开源软件驱动的相应聊天工具,当然是再好不过了。 因此首先我会想到XMPP(Jabber)协议,Jabber是一个开放源代码形式组织产生的网络实时通信协议。XMPP原本是为即时通讯而量身定制,但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面,已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。 [caption id="" align="aligncenter" width="467"] XMPP协议图解[/caption]   早期的Google Talk也是这个协议(Hangout已经禁止跨服务器间通讯),Facebook Message也与此兼容。另外国产互联网服务里的新浪微博的私信功能是基于XMPP的,还有据称米聊、人人桌面和陌陌,也是XMPP/Jabber协议的实现。


除了常用的IM功能以外,还支持SASL和TLS加密,因为它最大的好处是分布式/去中心化的,这样就使得ISP的封锁和公愤网(GFW)无能为力。当然最重要的是因为多服务器S2S连接,产生的负载均衡效应,这不容小觑。再加它的实现方式依赖XML,因此强大的可扩展性为此增加了非常多的功能。目前XMPP标准基金会负责制订和维护相关标准。 有人认为XMPP不能发图片和传文件,实际上这些都是协议里支持的,主要是依赖客户端支持。试想,如果这些协议不能支持,那么微薄私信的发图功能怎么实现呢?当然了,在XMPP协议层里,语音视频这种SIP也是支持的,有兴趣的可以研究XMPP的Jingle协议。 XMPP也不是没有缺点。一个严重问题是因为全部都由服务器中转,服务器的压力会比较大,特别是高连接数的情况下。另外一个致命问题是某些服务器程序会丢消息(曾有人反映openfire就会丢消息),不过常见的开源软件实现,基本都解决了这问题,有些采用离线消息的方式提供暂存,进而可以解决这些问题。目前我的使用过程中,尚没有发现丢消息的问题。 多点登录,可以用多个设备同时登录(以优先级区分之)。这既是优点也是缺点,优点是多个登录端可以互相通信,缺点是不容易同步。因此若A和B通信,B有3个客户端登录,那么若A给B发送一条消息,只会默认推送到优先级高的客户端上,除非A指定B的某个已经登录的客户端。因此XMPP需要多点同步功能也是需要解决的。 多人聊天。XMPP/Jabber实现多人聊天(MUC,Multiply User Chat)是采用聊天室的方式实现的,也就是开一个群聊的服务,比如jabber.ru服务器会单独开一个conference.jabber.ru来帮助大家实现多人聊天。想要群聊需要先建立一个房间,比如,然后其他人加入到这房间里即可多人聊天了。多人聊天是个可选服务,很多服务器提供商提供了,有些则没有提供。因此缺点就是群聊不是很方便,在现在很多聊天软件已经可以非常轻易加人构成群聊的情况下,这种方式多少还有点低端,与传统的QQ群聊很类似。


因为Jabber/XMPP是可以跨服务器的(也可以在服务器端禁用这个功能),这样只要有一个帐号就行就可以与所有人公开的人通信。这里推荐使用[](点表头就可以排序)网站列出来的公共服务器列表。右侧两栏是安全评级,分别是客户端-服务器端(C2S)安全评级,以及服务器与服务器(S2S)之间的安全评级。A级为最高,F为最差。 我花了一些时间遴选,既考虑到安全性(必须是A评级),又考虑其提供较多的服务和低ping值。最后可选的服务器如下:
  •著名的非追踪搜索引擎 DuckDuckGo 旗下的 XMPP 服务。安全性和速度都不错。如果不在亚洲地区,这个服务器是最好的。
  • 苏黎世的服务器,老牌Jabber提供商。速度略慢,安全性也还不错。值得作为后备帐号使用。综合能力不输给其他的。
  •这个服务器强制要求 OTR 加密,提供了较强的安全性,同时速度也不慢。追求极佳安全性的时候可以考虑。
选好服务器以后,如何注册呢?因为XMPP/Jabber对用户注册的后端并没有规定和限制,因此各家服务提供商就各自有自己的数据存储方式,目前主流的XMPP/Jabber服务器都可以连接数据库(比如MySQL)、LDAP服务器、甚至单纯的只是文件存储。当然,这些注册也都是免费的! 常用的注册方式,比如在网页注册,有的则是在客户端直接注册(这也是XMPP协议里支持的)。下面说说客户端注册,至于网页注册嘛,大家可以自己研究咯,反正非常简单。


PC端肯定要推荐一些比较经典的啦,诸如PidginEmpathyKopeteMiranda IM(只支持Windows)或Adium(只支持Mac OS X)这样的都可以很好的兼容XMPP/Jabber协议,不过呢还有一些专门的客户端软件,比如 GajimPsi+(这是Psi的升级版,增加了更多功能)这样的XMPP专业工具。类似Pidgin这样大而全的软件可以很好的支持XMPP几乎所有的功能(通过各种插件)。而专有的软件则可以更加专注于协议的实现,更加完善,也更加富有使用的优势,特别是需要加密聊天比如OTR和PGP这样的时候,专攻XMPP协议的这些客户端就更方便可靠了。当然还有命令行下的软件,mcabber是专门设计给XMPP/Jabber使用的,可以非常方便的提供OTR和PGP加密聊天。 [caption id="" align="aligncenter" width="600"] Gajim下的基本聊天[/caption]   手机移动端。Android和iOS都可以用ChatSecure,一款知名的支持OTR的XMPP/Jabber的手机软件,很是方便。但如果希望支持PGP,则推荐使用Conversations,Android用户可以用过F-Droid非常容易的安装(这款APP在Google Play竟然是收费的!)。 [caption id="" align="aligncenter" width="253"] Android 下的客户端 ChatSecure[/caption]    


这样的形式有很大的好处,不用费劲去记忆大量无意义的号码了,更可以不用担心微信号冲突的问题。不过这也带来很大的缺点,就是有可能冒用身份。某人冒用了他人的XMPP/Jabber账户,容易产生一些问题。唯一的办法的是通过类似openPGP/GPG这样的方式来标明身份。这也就是为什么我青睐使用Psi+或者mmcabber这样客户端的。因为可以使用openPGP/GPG密钥来签名登录服务器,这样的好处是大大降低了身份被冒用的风险。 因此,添加好友,或者散发自己的XMPP/Jabber账户的时候,就可以这样以邮件地址的方式散布。很关键的一点是要告知别人如何认证你的身份,制造身份的唯一性。


目前常用IM的端对端私密聊天方式主要有两种,分别是OTR(Off The Record)OpenPGP,这两种都是利用非对称加密的原理,实现加密聊天。 OTR是XMPP/Jabber协议里提倡的加密方式,优点是速度快,可以快速建立链接,利用Deffi-Hellman密钥交换算法和前向加密原理,可以快速加密信息,并且保证安全。缺点也有,由于是基于客户端的,如果更换客户端,或者多终端登录的时候无法保证身份一致性,这要求聊天对方信任我的所有客户端密钥,这问题会导致伪造身份出现。 [caption id="" align="aligncenter" width="613"] Gajim 下的 OTR 加密聊天[/caption]   对OpenPGP的支持并不是每个客户端都有,能够符合XMPP-XEP0027要求的不多,目前Gajim、Psi+和mcabber都可以满足这个需求。openPGP毕竟是面向邮件的非对称加密,因此其速度和效率尚不足以与快速的即时消息相适应。 SSL/TLS连接也很重要,虽然对聊天双方来说都是一样的,但因为多增加了一层加密,使得聊天更加安全。

自己搭建XMPP/Jabber服务器:Prosody / ejabberd

目前自己搭建XMPP/Jabber服务器是非常可行的,常用的方案有很多,我亲测的是 Prosody 以及 ejabberd 这两种。前者更加轻量级,也简单易行,而 ejabberd 有更为强大的配置,可以自行配置强大而独立的XMPP/Jabber服务供他人使用。可以自行在互联网上搜索相关的内容,搭建起来并不复杂。 我自己架设了一个测试用的XMPP/Jabber服务器,。有兴趣的朋友可以来测试。注意,服务器在墙内且未备案,虽然执行加密,仅可做普通连接和测试使用,不得作为可能涉密的使用。服务器的测试结果:客户端-服务器服务器之间


  • 千万不要忘记密码!。大多数XMPP服务提供商并没有提供密码找回功能。因此密码要妥善保管并牢记!
  • 确定主要身份,防止冒用。莫轻信聊天的对方。OTR的方式提供了通过保密问题的方式验证身份,虽然比较LOW,不过却是目前比较好的方法了。
  • 一定选择妥善的加密服务。首先登录连接必须是SSL加密,若能选择一定考虑服务器是否支持TLSv1.2,因为这是目前比较安全的。另外聊天一定选用OTR或者PGP其中一种,一般OTR就够,若对保密要求比较高可以考虑OpenPGP。
  • 安全起见,一定选择自由开源的客户端。这毋庸赘言了!不仅客户端,包括其上的插件也必须是自由开源的。
  • 多人聊天的时候防止外人窜入。我们曾经测试MUA多人聊天的时候,一个俄国人突然窜入我们的房间,并大谈俄日争端的北方四岛问题……所以安全起见,多人聊天的时候设置房间密码比较好,我觉得如果追求最好的多人聊天,比如在线开会等,最好的还是IRC。
关于XMPP/Jabber拉拉杂杂的先说这么多,有空我可以再基于具体客户端,写一个图文的教程。目前来看,移动互联网时代,分布式去中心化一定是大势所趋,所以我觉得必须要解决的问题就是让开源的协议和客户端尽快流行起来。总之,大家都用起来,早日屏蔽流氓软件,这条路一定不会很顺利,毕竟人间正道是沧桑。 从现在开始我就弃用QQ和微信了,欢迎加我的XMPP帐号,大家一起畅聊!以下两个均可:

UPDATE: 2016年1月6日,修改了文中提到的一些 XMPP 服务提供商,因为有些已经失效,或者安全性有调整。


提前声明:此文所说的“国家”一词既包含主权国家,也包括一些地区和政治经济体。 这次我去新加坡参加FOSSASIA,认识了很多很多亚洲国家的朋友们,结合之前的体会和观察,决定将一些看法和交流的结果呈现出来。希望借由这些他山之石,可以帮助中国开源社区的治理和运营学到一些经验。原来想定此文标题为“亚洲国家开源发展一考“,但“考”字会让人误解我真的做了深入的考察,然而事实上,大多只是参加了当地的开源社区活动,和当地人交流、闲聊的结果,更何况有些国家,我其实根本没有亲身前往;另外,我本人的思想和体验也会多多少少影响到对这些国家的评价,并不客观,比如我更加青睐台湾的开源社区模式,所以后来就把文章标题改为”一瞥“,本文也就是给各位朋友开开眼界,当个旅行指南也是不错的。 再次声明:此文评价非常主观,并不代表客观真实的考察。众所周知,我更喜欢台湾开源社区模式,但也会尽量客观的评价其开源社区,及与其他国家的比较。


毕竟这次FOSSASIA在新加坡举行,我也是刚刚参加完这次活动,趁着现在依旧记忆深刻,不妨就先来说新加坡。 作为一个多文化融合的国家,新加坡本地的开源社区就像这里的饮食一样,也更多的呈现一种多民族、多种文化、多种宗教共通融合的国际化社区。因此在这方面,开源社区在新加坡也就更加具备国际化特性。实际上,国际化并不是新加坡开源社区的主要特点。新加坡开源社区的一大特色是注重开源社区的社交作用,从Hackerspace的多种活动,再到其他社区的频繁合作,整个新加坡的开源社区具备一些很多新技术的前沿特性,这里的开源社区对商业诉求不多,一切还都是For Fun的朴素社区状态。 所以一句话来总结新加坡的开源社区特色:多文化融合、国际化、一切For Fun。这种模式也有个缺点,就是大多集中在Geek层面,落地的比较少,也难以将社区规模扩大,产生更大的影响力。


2013年我曾前往韩国参加在那里举行的2013 GNOME.Asia会议,给我印象比较深的是,这里的开源社区发展还是非常初级的,甚至并没有什么成型的活动。由于大公司,如三星、LG的投入,这里的开源发展大多围绕这些大公司来布局,开源的发展偏向公司对开源技术的诉求。从某种角度来说,这种开源社区的治理模式,就是之前我曾说过的完全以商业利益为转移,完全按照商业模式指导开源社区运作。 从2013年至今,各种开源社区会议上,韩国社区的演讲虽然技术性很强,但其演讲人往往大多是商业公司职员,在开源社区往往没有什么太多贡献,使得当他参加开源社区会议的时候,很难与大家有共同语言,由于之前社交缺乏,让大家比较难与其沟通。当然也有例外,比如韩国GNOME用户组的Changwoo,他本人就很有能力,也在开源社区中有大量的贡献,以至于往往提到韩国开源社区的时候,我就会想到他。 简单来总结一下韩国开源社区的特点:韩国开源社区的发展方向遵循商业利益导向,公司发展对社区的发展影响重大。开源技术的贡献者并不少,但很难融入社区开发中。


首先声明,我并没有去过日本,不过却接触了很多日本的开源社区朋友,更结交了一些深度贡献者。总的来说,日本的开源社区更加国际化,这种国际化与上面提到的新加坡的国际化不同,日本的国际化是一种近乎脱离亚洲的那种国际化,他们往往不太在意亚洲各国举办的开源会议,也不会参与到亚洲的开源社区中来,而日本却会不遗余力的承办LinuxCon Japan,承办各种国际上著名的开源会议。总的来说,日本的开源发展正如明治天皇时代提出的日本国家路线一样,有些“脱亚入欧”或者“脱亚入美”。但是,日本因为在开源社区贡献者众多,开源社区力量比较强大,我接触比较多的是他们本地的LibreOffice社区和openSUSE社区,并与很多朋友深入交流。 日本在亚洲开源社区虽然接触少,但因为代码(包括文档、翻译等)贡献者众,使得他们在亚洲社区中的地位还是比较高的。毕竟我没有去过日本,若有机会我还是很想前去日本,参加一下那里的活动,参加一下当地的开源社区活动,与当地的朋友多多交流。


之前文章所言,我个人非常喜欢台湾开源社区的模式,相关讨论亦可以参考我之前的相关文章。那么我为什么在亚洲各国中独爱台湾的开源社区模式呢,原因有三:其一,都有共同的文化,面临相同的问题,具有同样要考虑的问题。只有政治制度和近几十年的发展与中国大陆不同;第二,台湾开源社区通过自由的社区文化,引导开源社区的成员对自己的社区负责,同时引入社交和更开放的文化,使得开源社区更加具有生命力;最后,台湾开源社区的发展,从一开始就是自下而上,最终以开源社区为中心,一切以社区利益为转移,而不听命于任何公司甚至是政府机关。 另外,我个人之所以喜欢台湾开源社区,还有一点是他们很成功的解决了,开源与商业发展之间的困局,可以在社区发展中有限度的接纳商业公司进入,让商业公司为开源社区服务,同时在这种服务中,商业公司也能找到自己的价值。 不过台湾这种模式,亦有其背景原因。台湾有很深厚的学生运动基础(从日治时期的学生运动,到“野百合学运”再到“太阳花学运”),社会很容易促发一种自组织形态。这对开源的草根发展是有利的,但对开源的更进一步发展就产生了制约,因为草根往往有民粹特性(台湾人称之为“鄉民”),当开源发展进入一种精英阶段以后,这种民粹性会形成掣肘的力量。事实上,台湾一些朋友也已经看到这种现象,甚至产生的社区分裂。其实这个问题国内也有发生,真正为开源贡献的人,却被一堆“喷子”误解,或者有些开源贡献者进入民粹和民族主义的阵营,对各种“国产”大肆热衷,投错了方向。


如果让我来评价香港的开源发展,真可用巨变来形容!2012年时,我曾参加在那里举行的GNOME.Asia,那次会议并不成功,只有大概不到100人参加,人数最少的时候只有20几个人。而香港的Linux的用家协会(也就是我们平时说的Linux用户组,LUG)平时活动也不多,与大陆众多的开源社区活动相比,更是不值一提。 但这两年香港的开源社区发展逐步走入了高速路,短短两年间就成立了HKCOTA(香港创意开放科技协会),并成功举办两届HKOSCon(香港开源年会)。如果深入了解一下就可以发现,香港的开源社区发展之所以如此迅速,有这样几个原因:其一,靠近深圳内地,可以通过硬件创业,以及深港澳的多种机遇直接与内地丰富的资源对接,这里就比如香港Wen开发的Tiny3D就借助深圳工厂的能力,实现规模化生产。第二,香港政府层面对科技文化的支持,大力推进本港IT科技创业。第三,香港各大学思想开放,自由交流,思想碰撞更多,易于组织起来,发起自组织的社团,进而有发展成开源社区的能力。 香港这种发展也蕴含着隐忧,目前主要问题是平时那些开源社区的熟人,这么多年依旧是他们,我们很难看到新鲜面孔,这也就意味着香港的开源社区尚没有实现人员的新陈代谢,人员的发展无法与社区的进步相适应,还需要大力发展新成员,进而实现社区的真正有序可持续发展。同时日常的社区活动以及社区活跃度并没有太多提高,虽然有一些变化,但整体还是比较初级,难以形成规模化社区协作模式。开源社区与国际开源社区的对接也尚有发掘的空间。


我没有到过印度,不过却认识了不少印度的开源社区朋友,很多都是Fedora社区的。某种意义上,印度是亚洲传统计算机技术最发达的地方,就连日韩都难以望其项背,不过其社区却并不如预想的那么发达。这与其整体社会发展比较初级有关,开源社区比较基础,社区成员组织起来的更加本地化,而缺少了更多的国际化联系。这也就是为什么我认识的大多是红帽员工啊什么的,公司成员比较多。而比如从事其他行业啊,其他工作进而参与到开源社区中的人就比较少了。从某种意义上,开源社区在印度是日韩两国模式的综合体,不像日本那样纯粹的脱离亚洲而国际化,同时又不像韩国那样完全为了商业利益服务。 平时我们可以看到很多印度的开源贡献者,他们要么活跃在国际知名的开源项目,比如我在GNOME项目中就遇到很多印度人;要么就活跃在像Google Summer of Code或Google Code-in这样的国际活动中,可是我们很难见到印度的社区组织,只能看到独立的个体,而看不印度本地的社区。这也是印度比较有意思的一点。 毕竟没到过印度,据参加过印度开源社区的朋友的反映,印度比较难组织好一次开源社区活动,社会比较零散,人与人之间更加缺少粘性。不过也有一些朋友说,印度的开源社区很活跃,不仅贡献者众多,平时的活动也有声有色。不过据说印度的城市之间差异也比较大,有些孟买或者班加罗尔的社区就好一些,而在其他城市的就难以为继。   希望我提供的以开源为主题的“旅游手册”能帮助到各位。还是那句话,此文具有很强的主观感受,没那么客观,不能作为对一个国家(地区)开源发展真实面貌的评判,更多只能算是我的一些信息收集整理。本文还有很多国家并没有涉及到,比如承办今年GNOME.Asia,并且在政府机关大力使用开源软件的印度尼西亚,还有最近几年开源社区飞速发展的马来西亚和泰国。之所以没有写在本文中,主要是因为接触的朋友太少,了解也少,写不出什么东西。 亚洲国家大多是后发现代性国家,而且几乎都有过被西方列强殖民的历史。这些国家如何接受开源这个新生事物,如何将开源与本地文化结合,并发展出本地社区的这个过程,以及他们在社区运营和治理方面的经验和教训,还是非常值得学习和借鉴的。




  • Google Chromebook获得成功。类似概念每年都有人提到,比如NetPC,为什么轮到Google做就成功?
  • Google Glass失败。IT巨头相争使人们忘记眼镜是市场驱动还是投资驱动的项目。
  • Episodic Video Game引起人们关注。
  • 无人飞行器技术发展很快但是应用却很少。(噱头和专业领域应用不算)
  • Tesla电动车的发展。电动车获得发现是很容量预见到的,不容易预见到的是以目前这种形势发展:有一个厂商既有远见又有叹为观止的工程力量,比大家都早走出很多步。相应,容易预见到的是油改气这样的逐步发展。
  • Bitcoin和block chain。我参与得很早,2011年,但在发生之前没有预见到这种技术是可能的。在Brisbane旧海关大楼里演讲的一位早年参与设计VRML的Mark Pesce说这个技术是可以预见的(真的吗),过去叫做Digital Money,主要困难是没办法不信任中间点,如今解决了。









如果没有,那么近3、5年的演进将主要集中在游戏规则的发展。LinkedIn就是一个很好的游戏规则,很有效果,其产品不带智能,但是游戏规则引人入盛,大家一起玩,既得到奖励又奖励别人,最后形成一个有价值的网络。AirBnB以及Instagram以及taobao都算。(instagram其实就是洪之前说的Image Labler游戏)。






这个预计的基础是手机定位和地图功能的完善,尤其是基于google map api的软件,以及类似于淘宝这样网上评分系统的广泛使用。考虑严厉监管会有效果,实际使用中有现金交易的拼车服务不容易做,适合先做免费社区服务。前述预计错了。错在一是高估了政府的管理力,二是低估了收费交易的力量,可以产生大量业余全职或近于全职的司机,而这才是变革的中坚力量。另外,没有预见到政府会打击Google Map API。
实际上企业对手机的应用是从最小的单位即个体户和微型企业开始的。从澳洲这边观察,目前报纸上报道的企业创新软件是微小的工作流程改进,解决具体而微的问题,比如供房屋评估人士使用的应用,无非是纸张评估清单的手机版,但是受到很多好评。想像中的微软掌上Office跟Google Docs大战并没有发生。这跟微机上是不同的,微机(就是PC和Mac)上传统故事是通用杀手级应用程序大战,小的应用跟进。这可能是因为Google比较有远见,将对手抛得太远;也可能是因为手机应用是场景用例,不像微机可以一个应用软件解决一万个问题(比如Microsoft Excel),而是一万个问题需要分析一万种使用场景,解决一万个用例,所以需要一千多个应用软件对应,万用办公套件不流行。这给小应用开发又带来了机会。
电子游戏更加真实,增加很多虚拟现实游戏与Second Life竞争。虚拟生活如此实际,以至很多人不再提Second Life,而是直接提到里面的事物
这件事不但完全没有发生,而且意想不到的事发生了。一是虚拟游戏式微,Second Life一年比一年没人理。二是小制做、每关只有几秒的游戏崛起。三是独立制做出现了一些艺术性特别强的作品,比如80 Days。为什么错判断?应该是因为既不理解游戏行业的运作方式,又对玩家不够理解。玩家基础扩大,总体需求就变了。

解決 WordPress 中 Google Web Font 被 GFW 屏蔽問題

自從本 blog 的 wordpress 升級並更換 theme 後,偶爾發現 page load 得很慢,用 chrome 自帶的 developer tool 查了一下才發現原來 theme 用了 google web font,因爲 google service 被牆了所以在大陸瀏覽就像卡住了一樣。由於我絕大部份時間都是科學上網,所以一開始沒有發現問題。

Google font is blocked in China

既然 google web font 不能用,最簡單就是乾脆不用,把相關代碼拿掉就行,不過這樣做的後果是網站會極其難看。上策還是把 google web font 放到 wordpress server,再將 CSS 配置好。Google 一下發現有個很棒的 shell script 能幫個大忙:,它能幫你把需要的字體下載下來並產生一個立馬能用的 CSS 文檔。

WordPress 最少有兩個地方會加載 google web font,第一是 wordpress 本身用到的 Open Sans,另外是個別 theme 可能會用到的字體。視乎你的 theme 有沒有用 google font,有可能兩個地方都要處理。

目前我用的 theme 基於 twentyfourteen(我把原來左邊的 navigation 拿掉,header 加了 facebook, twitter 等幾個 icon),best practice 是在 wordpress 的 themes 目錄開一個叫

的新目錄,裏面只放用來 override parent theme 的東西。


  1. 下載剛才介紹過的網站的 shell script,我把它命名爲
  2. 先下載 wordpress 會下載的所有 Open Sans 字體(包括不同粗幼和斜體),在

    families+=('Open Sans:300')
    families+=('Open Sans:400')
    families+=('Open Sans:600')
    families+=('Open Sans:300italic')
    families+=('Open Sans:400italic')
    families+=('Open Sans:600italic')

  3. 針對你使用的 theme,需要把 theme 用到的 google 字體寫進去。你要查一下你的 theme 會用到什麼字體,例如 twentyfourteen 會用到的字體在
    的 215 行有提到:

    'family' => urlencode( 'Lato:300,400,700,900,300italic,400italic,700italic' ),

    總共有7個字體,所以 script 需要加上:


  4. 執行該 script:

    $ bash ./
    Downloading Open Sans:300... eot woff ttf svg 
    Downloading Open Sans:400... eot woff ttf svg 
    Downloading Open Sans:600... eot woff ttf svg 
    Downloading Open Sans:300italic... eot woff ttf svg 
    Downloading Open Sans:400italic... eot woff ttf svg 
    Downloading Open Sans:600italic... eot woff ttf svg 
    Downloading Lato:300... eot woff ttf svg 
    Downloading Lato:400... eot woff ttf svg 
    Downloading Lato:700... eot woff ttf svg 
    Downloading Lato:900... eot woff ttf svg 
    Downloading Lato:300italic... eot woff ttf svg 
    Downloading Lato:400italic... eot woff ttf svg 
    Downloading Lato:700italic... eot woff ttf svg

    這些就是下載完的所有文檔,包括適用於 chrome/chromium, firefox, safari 會用到的字體,還有一個 CSS file:


  5. 把上面所有的字體上傳到 wordpress server 的
  6. 把 font.css 複製到 wp-content/themes/twentyfourteen-chile/style.css。
  7. 由於 twentyfourteen 在
    的 link 來加載 Lato 字體,要想辦法把它拿掉:

    // Add Lato font, used in the main stylesheet.
            wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );

    不過我不喜歡直接修改 parent theme,所以我選擇在 twentyfourteen-child 把它 dequeue 掉。注意 add_action 的 priority 必須低於 10,dequeue 才會成功。

    的前兩行是用來禁止 Open Sans 字體從 google server 加載,第3行才是禁止 Lato。

The post 解決 WordPress 中 Google Web Font 被 GFW 屏蔽問題 appeared first on Anthony Wong.

Building an API with Zinc-REST in Pharo Smalltalk

In this session we are going to build a simple RESTful API using the Zinc-REST package.

The base image is again Moose, now the latest build of Moose 5.1

You may watch part one, part two and part three of this series if you are interested to find out what lead to this point. They are however not needed to be able to follow this session.

A static webapplication hosted on Pharo Smalltalk

For part three of our workshop series we start from scratch, and build a small website that hosts nothing but static files from a memory FileSystem.

We are also going to explore the new development tools that are built in the Moose project

You may watch the first and second parts of this series, or you may jump right in here.

In the next session we are going to build the RESTful API to make this application functional

Building an API with Zinc REST in Pharo Smalltalk

In this session we are going to build a simple RESTful API using the Zinc-REST package.

The base image is again Moose, now the latest build of Moose 5.1

You may watch part one, part two and part three of this series if you are interested to find out what lead to this point. They are however not needed to be able to follow this session.

Osaka, Kyoto and Nara Travel Tips

Kiyomizu Dera (清水寺)Kiyomizu Dera (清水寺)

After more than 10 years I traveled to Japan again. This time I went with my wife to Kyoto, Nara and Osaka. Here are some tips about travelling to these areas I want to share and also serve as notes to myself if I will ever go there again in future, which I will definitely do as Kansai is so beautiful and relaxing.

Keep connected

Getting mobile internet connection was not easy in the past since you need Japan residency to get a SIM from telco, but nowadays the market is more open and there are now many options. In this travel, I used a SIM card called Fuji card (富士卡), which I bought from Taobao at 76 CNY (about 1450 JPY or 12 USD). This card has 1.8GB 3G data, valid for 7 days, but does not have any voice call and cannot be recharged after you have used it up. This card is backed by China Unicom and Softbank, in my experience the data connection and coverage is very good. If you live in Hong Kong, you can find this card in Sham Shui Po as well.

“Fuji” SIM card (富士卡)“Fuji” SIM card (富士卡)

If this card does not suit your purpose, you can find other alternatives:

  1. Fuji card has a cheaper sibling which has 1GB data only, sold at 66 CNY, and a more expensive sibling which has double the data to 3.2GB, sold at 155 CNY.
  2. Before the existence of Fuji card, there was Sakura card (櫻花卡). Sakura card still exists and offers 3GB of data with 7-day validity. From what I read it is slower than Fuji card’s 7.2Mbps and lesser coverage.
  3. There is also a nameless SIM which offers unlimited data. The first 100MB data each day uses 3G speed but afterwards it falls back to 2G speed. It is cheaper but I bet no one want to suffer from slow speed especially during traveling.
  4. If your phone does not support WCDMA or you are not good at fiddling mobile phone settings, you can rent a WIFI router. More expensive, and you have to return it after the trip which I find inconvenient.
  5. So-net also sells pre-paid SIM cards at the airport, at a higher price than the Fuji card.

About Hotel

Valentine’s day is not a good day to travel to Japan not (just) because restaurants are fully booked but room rates could be more expensive than normal days 2 to 3 times, even for budget hotels like Toyoko Inn. I was very lucky that I found a really nice ryokan called Kitanoya (北野家) where the rates remained the same on the special day. Only available at Jalan, so knowing some basic Japanese is a pre-requisite. In general, check Jalan and Airbnb and you might find hidden gems.

Kitanoya (北野家)Kitanoya (北野家)

Hotel near Kansai Airport

My flight landed almost at midnight so I chose to stay in a hotel close to the airport and began our journey the next day. There are not many options, the hotel at the airport is too expensive so I chose to stay at First Hotel. It is located in Izumisano (泉佐野) and very close to the Izumisano railway station, so you can take a train there, or if it is too late like my case, you can take the late night airport bus, the last stop is exactly the Izumisano railyway station.

The bus station is just outside the exit of the departure hall. After exiting the airport, turn right, look for the stand numbered ’12’. No need to buy ticket beforehand, pay when you take off, so better make sure you have 1000 yen notes or coins, which I did not have. Luckily the bus driver was able to find a lady who had ten 1000 yen notes to change for my 10000 yen note, otherwise I don’t know what would end up.

Travel to/from Kansai Airport/Kyoto

If your destination is either Osaka or Kyoto and your flight will land at the Kansai International airport, you will likely buy the “ICOCA and Haruka” ticket set to take advantage of the Haruka train (non-reserved seat) from airport to Osaka or Kyoto.

Haruka train ticket from Kansai AirportHaruka train ticket from Kansai Airport

In my journey I made a mistake of buying the one-way instead of the round-trip, thinking that I would take the Nankai railway back as many people suggest. Later I found out my hotel actually is closer to Tennoji (天王寺) where there is JR station, so at the end I took the JR Hanwa line rapid train to the airport, that costs 1060 JPY, and in total it is more expensive than the round-trip “ICOCA and Haruka” ticket set. So check the location of your hotel carefully, Google Maps is your friend.

The ticket set is sold on the 2nd floor of the JR office at Kansai airport, show them the passport when buying.

The railway system in Japan is complicated and could be astounding to new individual travelers, so
do your homework carefully in advance.

Travel in Kyoto

Kyoto is well connected with buses, they are very frequent and can reach all the popular attractions in the city. I took the bus almost exclusively in Kyoto, so I highly recommend buying the one-day bus pass. The pass costs 500 JPY and each bus ride costs 220 JPY, so the pass makes sense if you take more than 3 bus rides, not to mention you free your mind from worrying coins.

There are other passes that let you take subway as well, but since there are only two subway lines in Kyoto, I find bus to be more convenient and so subway passes may not be worth buying.

Travel in Nara

Deer in Nara ParkDeer in Nara Park

As Nara is not big and most attractions are close to each other, most people go to Nara as a day trip and stay in Osaka or Kyoto at night. For me, I stayed in Osaka and went to Nara in the morning by taking Kintetsu train to Nara Kintetsu station. Kintetsu has discount tickets called Nara-Ikaruga one-day pass (奈良・斑鳩1dayチケット) that offers unlimited bus rides in Nara and round-trip Kintetsu trains from/to Nara. Like Kyoto, you can go to many places just by bus so this ticket is highly recommended.

Nara-Ikaruga one-day pass (奈良・斑鳩1dayチケット)Nara-Ikaruga one-day pass (奈良・斑鳩1dayチケット)

Depending on which city you buy the ticket, there are additional benefits. As I bought in Osaka, I could also enjoy unlimited rides on bus, subway and new tram in Osaka.

In Osaka, the ticket can be bought at the subway station supervisor office (駅長室), which is surprisingly located after passing the gate, which could be hard to find in maze-like Osaka subway stations.

Travel in Osaka

Osaka has a good subway system that covers most key destinations so getting a one-day pass is a smart choice.

The most basic form of the one-day pass is the Enjoy Eco card, which costs 800 JPY on week days and 600 JPY on weekends and national holidays. It can be bought directly from ticket machines. This card can be used on New Tram and bus as well, and offers discounts to some attractions like Osaka Castle and Floating Garden Observatory.

Enjoy Eco CardEnjoy Eco Card

If you ever come across the Osaka Visitors’ Ticket and wonder what it is, forget it if you do not live in Hong Kong, Taiwan or Korea. It has the same benefits as the Enjoy Eco card, but with a lower price and is only sold in these 3 regions.

There are many other passes, such as Osaka Amazing Pass and Osaka Kaiyu Ticket, see which one suits you best here.

Money Matters

If you buy the “ICOCA and Haruka” ticket set, you will then have the ICOCA e-money card with 1500 JPY in it, which can be used to take trains and subways. But it is not too useful as a means in buying stuffs as many shops do not accept it, except convenient stores like 7-11. In Osaka, I found vending machines accepts PiTaPa rather than ICOCA as well.

Before leaving Japan, ICOCA can be returned at JR office and you can get 500 JPY deposit back. 220 JPY will be charged as handling fee from the remaining amount in your card, so if you have spent all the money in the card then it means no handling fee. If you think you will visit Kansai again in 10 years, you can keep the card and recharge it next time when you come back to Japan.

That’s it! Hope you enjoy Japan and find my tips useful.

The post Osaka, Kyoto and Nara Travel Tips appeared first on Anthony Wong.

neo-noir time!

In its overwhelming kindness and knowlegde, Wikipedia granted me this information: so i have been watching a few of them, starting with the asian media, and a real surprise was “Black Coal, Thin Ice” the acting is superb, the noir mood intense, and the whole setting just beautiful …

quite exited for a few more, but due to the heavyness only one film a week

Serving files through FileSystem in Pharo Smalltalk

In the second part of this series we transform our website to serve all content as files from a FileSystem object.

If you haven't yet, take a look at part 1

In the next session we will serve an actual web-application

Using the FileSystem class in Pharo Smalltalk

I am learning how to build a website with a RESTful API in Pharo Smalltalk. This project started during Google Code-In as a set of tasks for students to work on. A handful of students were interested and picked up tasks to learn Pharo.

Now that Google Code-In is over, the students are interested to continue learning and so i am running workshops with them, where we explore the tools needed to build this server.

The first workshop was held last week on sunday the 25th, and the next one will be on saturday the 31st of Jnauary. from 2pm to 6pm chinese time, that is 7am to 11am CET or 6am to 10am UTC. We will meet on freenode irc in the channels #fossasia and #pharo.

A part of website consists of static files. To simplify development and deployment, we want to serve those files from the smalltalk image. One way to hold several documents inside an image is using a memory FileSystem. The FileSystem class is described in the book "Deep into Pharo" in chapter 3.

In the first workshop we try to use the FileSystem class in a sample application. We use the tutorial "Building and deploying your first web app with Pharo" as a starting point, and adapt the code to store images in a FileSystem object.

If you want to follow along, please first complete the tutorial and then watch the screencast below to continue:

In the next session we will convert the rest of the website to using our FileSystem object.

the community calendar project at google code in

For the community-calendar project in total, 11 tasks were proposed, of which 7 got completed:

Not so much work got done on the code itself, but we now have some documentation of the API as well as the start of a testing framework to help keep the API stable.

As a sideproject, these tasks were designed to explore the ember.js framework. the calendar-widget, going to be embedded into different websites was a good target because we now can offer both versions for embedding.

For ember.js the student, samarjeet wrote about the work in his weblog. An initial comparison: Comparing the community-calendar
Creating Ember Components turned out to be more dificult, and we had to enlist outside help to solve it.
Finally, a deeper comparison of Angular.js vs. Ember.js

This leaves us with 4 tasks that were not worked on

csdn interview

I have been interviewed by CSDN. The interview has been published today in chinese.

The original english answers as i sent them are below:

1. Could you introduce yourself to us first?

I am using and developing Free Software and Open Source for more than 20 years. I am a contributor to the Pike programming language, the Foresight Linux distribution and several other Free Software Projects. I co-edited a book on Pike and organized developer conferences. I am also a mentor at FOSSASIA. Throughout my career I focused on developing and advocating Free Software. I have lived and worked in several countries around our planet Earth. I came to china in 2008. I am currently the CTO at eKita, a startup in Bangkok, and the General Manager at Realsoftservice, a Linux service firm in Beijing where i offer software development, training and internships. I live in Beijing with my family.

2. Compared with your own country, what attracts you most in China or Beijing?

China (and Asia in general) has a different culture from western countries. Learning chinese culture allows me to look at situations from a different perspective.

I believe that all the world should be united into one country. And in order to do that we need to understand the different parts of the world, what everyone can contribute to this world, and what unifies us.

China is a large part of this world, and also not much is known about china outside of it. The only way to learn about china is to be here.

China is also huge. I like to travel, and china allows me to travel long distances to places that are very different from each other without having to cross any borders.

3. What is your role in BLUG? Could you describe the important development milestones of BLUG?

I am acting as the secretary. That means i help to arrange meetings and events for the group.

I joined the BLUG in 2008 and i am not familiar with the history before. One important event before i joined was the 2007 Software Freedom Day which was chosen as the best SFD event for that year.

At the time, when i joined, the BLUG had monthly meetings, frequent quan'r dinners and BLUG Tuesday events. We also had a group aiming to build a quadcopter and a library. Active members were both foreigners and chinese.

In summer 2008 an intern at Exoweb where i worked at the time, together with me initiated a hackaton event called "Coding For Fun". I then continued hosting the event by myself as part of the BLUG. When i left Beijing other BLUG members continued hosting the event.

When I came back to Beijing some active members had left. I took over the management of the group in 2013, when most active members had left. At that time active participation was very low. I continued running the monthly meetings and Coding For Fun events. In Autumn we re-started BLUG Tuesday and used it to test new meeting locations. That way we found our current meeting place.

We slowly regained new active members, most of them chinese.

4. What kind of difficulties have BLUG encountered in the process of development, and how to solve them?

The main difficulty we have is finding good locations for the meeting and Coding For Fun events. It is still an unsolved problem. We don't have sponsors to pay for using locations, so we rely on offers for places we can use for free.

5. What are the daily activities in BLUG? Do you (or BLUG) have any interactions with other communities?

I am trying to visit and keep relations with every group that i can find in Beijing. I am regularly participating at events from the Beijing Open Party, Ruby, Python, Angular.js meetups. Barcamp and more.

Most of these groups have Linux users, but as i am a programmer, many groups are interesting to me personally too.

We also work with other groups to organize events, for example the Software Freedom Day. or we support conferences like and FUDcon or the OpenSUSE summit, all of which had volunteers who are BLUG members.

We also participated at Google Code-In with FOSSASIA.

6. Have you ever attended open source activities in other countries or regions?

What are the differences between other countries and China in Open-source activities?

Every place and every country i have lived in, i participate in the local activities. These vary in size and regularity. In some cases my visit was the motivation for a group to have more meetings. In most groups the meeting involved some form of topic presentation and discussion. But sometimes it was just going out for dinner. Really not much different from china.

7. From your personal point of view, could you share with us some tips on how to manage one open source community successfully?

Well, there are different kinds of communities, for example those that revolve around a particular software project where all members in some form contribute to that software project. The contributions to such projects are often motivated by the contributors own needs. The main goal for community managers is to get active contributors to the project.

Other communities are more loose where people just share a common ideal, but actually may contribute to different projects.

The BLUG is of the latter kind. People contribute to the BLUG more out of a desire to serve the community than out of a personal need. And many do not contribute to the BLUG directly.

The goal of the BLUG is to provide a venue for Free Software contributors and users to share and meet like-minded people. Most Free Software Communities are spread all over the world, whereas groups like the BLUG are very local.

To manage a local group, i believe persistence would be the most important aspect. If the group has meetings, they should be regular, so that new people can easily find out when and where the meetings happen. Then it takes a while for the word to spread, and attendance to grow. Keep holding the meetings, even if only two or three people join. Then keep advertising the group and invite new people. Eventually more will join and come back regularly.

8. Could you introduce us some active and outstanding members in BLUG?

It is difficult to praise the contributions of some people without unjustly leaving out others. Moreover i don't even know all the contributions of every member. Some members don't come to the meeting often but they are very active elsewhere in the Free Software and Open Source Community. This is one of the things that tends to be miss-understood about the Free Software community.

Some people worry if they release their work with a Free Software license, then others can take advantage of it without giving anything back. But we don't know if those users are not active somewhere else making contributions to our society in other ways.

This is after all what i believe is the purpose of our life. All Men have been created to carry forward an ever-advancing civilization. (人人生来是为了推动文明不断进步的)

9. GNU project founder Richard Stallman came to China in May, 2014, did you have a meet with him?

And what do you think about the Free Software campaign leaded by Richard Stallman since 1980th?

I have met richard stallman a few times before, but never had much direct interaction with him. This year he joined us for a BLUG Dinner. As for his campaign, i fully support the idea of Free Software. I believe that all knowledge should be shared, and everyone should have the opportunity to use all of the worlds knowledge in their work. To fulfill the purpose of life we should all use our work to contribute to society. And allowing others to use and modify our software is a great and very easy way of doing that.

10. The last one, could you reveal to us the BLUG's future development plan, and what kind of activity will be organized in the future days?

Future plans of the BLUG depend on its members. For now my goal is to get more active members, people who help to host events, give talks, or help contribute to our website. The BLUG website is very old and in dire need of an upgrade. but it is difficult to do if we want to keep all the data.

I am also trying to work on a community calendar where we can share all events

Education Freedom Day registration launched!


We have just opened Education Freedom Day registration, scheduled on March 21st, 2015. For its second edition EFD has been moved to March to facilitate its celebration in both the south of the planet and China (at least…) and we hope to cater to more events this year.

As usual for all our Freedom celebrations the process is similar, you get together and decide to organize an event, then create a page in our wiki and register your team. As the date approaches you get to put more information in your wiki page (or on your organization website which is linked from the wiki) such as the date and time, the location and what people can expect to see.

Education Freedom Day is really the opportunity to review all the available Free Educational Resources available, how they have improved since last year and what you should start planning to implement to deploy in the coming months. More importantly it is the celebration of what is available and letting people aware of it!

So prepare well and see you all in two months to celebrate Education Freedom Day!

Celebrate EFD with us on March 21, 2015!

30 years of FSF

After an exciting weekend celebrating Hardware Freedom Day what could possibly be better than going back to the very inspiring video made to celebrate the 30th anniversary of the Free Software Foundation? Indeed it’s been made using Free Software only and goes through the work of the foundation for the past thirty years. It’s actually nice to look at, positive and very well animated. We will definitely encourage all our software freedom day teams to use it during their events. But let us say no more and let you enjoy it if you’ve missed it so far:

And then, for the ones into this kind of work, and blender in particular, you can find a detailed explanation of the challenges that the makers of the work went through and how they fixed them right here. Definitely a great read into the whole process from design to finish. Great job guys! And of course a happy 30th anniversary to the FSF from the Digital Freedom Foundation and all its members!

Happy Hardware Freedom Day

hfd-banner2For its third edition Hardware Freedom Day got closer to the holiday season and we hope everyone who took a first step into the world of Open Hardware will use this opportunity to come and meet passionate people who spend their time (or most of it) in hackerspaces or toy with with concept of Free Software and Open Hardware. As usual we have the same strong sponsors as every year such as Google, Canonical, the Free Software Foundation, Linode, all our supporters and the additional support of Lulzbot since 2014 who makes fully Free 3D printers!
So wait no longer and join us to celebrate Hardware Freedom Day in your area!

Google Code In with FOSSASIA

Compile kernel module on Linode Debian VPS

Connection to linode hosts from within China can be poor from time to time. Choosing a suitable TCP congestion algorithm may alleviate that from insignificant to a great deal, your mileage may vary. Trying it out is always the best way to find out. Here I will show you how to do that step by step.

  1. Login to your VPS and find out the version of the running kernel

    # uname -a
    Linux jhelom 3.12.6-x86_64-linode36 #2 SMP Mon Jan 13 18:54:10 EST 2014 x86_64 GNU/Linux

    That is 3.12.6.

  2. Go get the 3.12.6 from at
  3. Extract it and copy the kernel config over from the current one.

    # tar xf linux-3.12.6.tar.xz
    # zcat /proc/config.gz > .config
    # make oldconfig
  4. Now, edit .config with an editor such as vi, look for the line CONFIG_TCP_CONG_ADVANCED, remove the line, and add the following lines there:

    # CONFIG_DEFAULT_RENO is not set
  5. Now compile the kernel and the modules.

    # make -j4
    # make modules SUBDIRS=net/ipv4
  6. If everything goes well, you will be able to load the module.

    # sudo insmod net/ipv4/tcp_hybla.ko

    Check with lsmod and make sure the kernel module is loaded successfully. If not, check dmesg for any errors.

That’s it!

The post Compile kernel module on Linode Debian VPS appeared first on Anthony Wong.

learning smalltalk with Google Code In

For years i have been meaning to learn smalltalk. my first exploration started about 10 years ago while teaching two children to make a game with squeak. Then i worked through a tutorial about making a simple game. Unfortunately it didn't capture my interest. So the my attempts to learn smalltalk were stalled as i searched for a project that i could do with it.

Why do i want to learn smalltalk? Because it is the first object-oriented language. Many of the OO concepts were invented in smalltalk. There is also the concept of working in an image that not only contains my code but also a full IDE which is used to update my code at runtime. Updating code at runtime is a concept that has been with me for more than 20 years now, ever since i started programming MUDs in LPC and writing modules for the Spinner/Roxen webserver in Pike. Pike allows recompiling classes at runtime. Any new instances will be made from the new class, while old instances remain as is. If the compilation fails, the class is not replaced and the old class continues to work. This way it is possible to make changes on a live server without restarting and disrupting ongoing requests. A decade later i discovered sTeam, the platform that also drives this very website. It takes this process even further: sTeam persists code and objects in a database. While in Roxen objects live as long as it takes to process a request, in sTeam objects are permanent, much like in a smalltalk image. sTeam then adds the capability to update live objects with new class implementations. The image concept of smalltalk is therefore already very familiar, and the major difference is smalltalk's GUI.

Recently a friend asked me what it would take to build a text search application for the Baha'i writings in chinese. There is one for english and other western languages, but not for chinese, and it does not run on mobile devices. It is also not Free Software, so i can't use it as a base to improve. But i didn't really want to take on a new project either so i just filed the idea for the time being.

One of my customers is managing access to several internal resources through htaccess and htpasswd. Because they have many interns who need to have access to some of these, and because they are now spread over multiple servers, it is becoming more and more cumbersome to manage them manually via these files. It also does not help that a salt module which we could use to help depends on apache helpers, which we can not install because apache conflicts with nginx which we are using. So i started exploring alternatives. One such alternative is a different way for nginx to verify access. It can make a request to an external service which then grants or rejects access depending on the resource and credentials. This could be implemented as a webservice with a webinterface to manage the users. I looked for some existing applications that would get me part of the way but i found nothing suitable.

Enter Google Code-In: FOSSASIA invited the BLUG to join them as mentors.

At first i put up tasks for the community-calendar project, but then i realized that this was an opportunity to explore new ideas. Figuring that teaching is the best way to learn i put up those project ideas as tasks for the students. I could ask students to learn and explore, and finally work on those projects. I would pick the technology and guide the students through a sequence of tasks to acquire the skills needed to implement the actual applications. This was my chance to get back into smalltalk. Since code-In targets middle and highschool students, it is quite unlikely that any of them already know smalltalk, or have even heared about it. so in a way this will introduce a few students to smalltalk. I picked pharo because i feel it is going in the right direction trying to improve itself and also adding things like commandline support.

The desktop application was straight-forward: find out how to embed text-documents in the image and make them searchable.

The web application took more exploration. I wanted to do it with a RESTful api and a javascript frontend. Again, the frontend was easy to define: create a user management interface. For the backend, the question was which webframework to use? AIDA/web has builtin user management and REST style url support by default. Seaside includes a REST module, but both are strong on generating html which i am not interested in. Then there is iliad, which appears more lightweight. Eventually i figured i could just let the students explore each, and i created a task for each tutorial that i could find:

(some of these i repeated because the student who did the them first time didn't pick up the follow-up tasks.)

Finally i discovered that Zinc, the HTTP server used by most frameworks is powerful enough to build a RESTful API without all the templating extras that the above frameworks provide. I also discovered teapot, a microframework that might be useful.

Once the students are familiar with the smalltalk environment, they can move on to the next steps:

Of course there are also tasks for the front-end

Related is also this task about a file editor, which i believe should make it easier to edit static assets like html and css pages from within the image:

leaning smalltalk through Google Code In

For years i have been meaning to learn smalltalk. my first exploration started about 10 years ago while teaching two children to make a game with squeak. Then i worked through a tutorial about making a simple game. Unfortunately it didn't capture my interest. So the my attempts to learn smalltalk were stalled as i searched for a project that i could do with it.

Why do i want to learn smalltalk? Because it is the first object-oriented language. Many of the OO concepts were invented in smalltalk. There is also the concept of working in an image that not only contains my code but also a full IDE which is used to update my code at runtime. Updating code at runtime is a concept that has been with me for more than 20 years now, ever since i started programming MUDs in LPC and writing modules for the Spinner/Roxen webserver.

Recently a friend asked me what it would take to build a text search application for the Baha'i writings in chinese. There is one for english and other western languages, but not for chinese, and it does not run on mobile devices. It is also not Free Software, so i can't use it as a base to improve. But i didn't really want to take on a new project either so i just filed the idea for the time being.

One of my customers is managing access to several internal resources through htaccess and htpasswd. Because they have many interns who need to have access to some of these, and because they are now spread over multiple servers, it is becoming more and more cumbersome to manage them manually via these files. It also does not help that a salt module which we could use to help depends on apache helpers, which we can not install because apache conflicts with nginx which we are using. So i started exploring alternatives. One such alternative is a different way for nginx to verify access. It can make a request to an external service which then grants or rejects access depending on the resource and credentials. This could be implemented as a webservice with a webinterface to manage the users. I looked for some existing applications that would get me part of the way but i found nothing suitable.

Enter Google Code-In: FOSSASIA invited the BLUG to join them as mentors.

At first i put up tasks for the community-calendar project, but then i realized that this was an opportunity to explore new ideas. Figuring that teaching is the best way to learn i put up those project ideas as tasks for the students. I could ask students to learn and explore, and finally work on those projects. I would pick the technology and guide the students through a sequence of tasks to acquire the skills needed to implement the actual applications. This was my chance to get back into smalltalk. Since code-In targets middle and highschool students, it is quite unlikely that any of them already know smalltalk, or have even heared about it. so in a way this will introduce a few students to smalltalk. I picked pharo because i feel it is going in the right direction trying to improve itself and also adding things like commandline support.

The desktop application was straight-forward: find out how to embed text-documents in the image and make them searchable.

The web application took more exploration. I wanted to do it with a RESTful api and a javascript frontend. Again, the frontend was easy to define: create a user management interface. For the backend, the question was which webframework to use? AIDA/web has builtin user management and REST style url support by default. Seaside includes a REST module, but both are strong on generating html which i am not interested in. Then there is iliad, which appears more lightweight. Eventually i figured i could just let the students explore each, and i created a task for each tutorial that i could find:

(some of these i repeated because the student who did the them first time didn't pick up the follow-up tasks.)

Finally i discovered that Zinc, the HTTP server used by most frameworks is powerful enough to build a RESTful API without all the templating extras that the above frameworks provide. I also discovered teapot, a microframework that might be useful.

Once the students are familiar with the smalltalk environment, they can move on to the next steps:

Of course there are also tasks for the front-end

Related is also this task about a file editor, which i believe should make it easier to edit static assets like html and css pages from within the image:

Google Code In with FOSSASIA

FOSSASIA is a mentor organization at Google Code-In, and the Beijing GNU/Linux User Group has been invited to join them as mentors.

Two of us joined and created tasks for our projects.

At first i created tasks for our community-calendar project, but then i took the opportunity to get students to work on new projects that i had been hoping to do. For a long time i wanted to learn smalltalk, but i lacked good project ideas. This changed recently, as a friend asked me about a text search application, and one of my customers needed a better solution than htpasswd to manage users for nginx. I decided that both could be done in smalltalk.

So i created tasks for three new projects: A text search application to run on the desktop, and one on mobile, and a user-management web-application. For the desktop and the web-application i stipulated pharo smalltalk as the implementation platform. For good measure i also threw in my idealist for sup, a reimplementation of the frontend for this weblog in angular.js, a t-shirt design for the BLUG, packaging pike, and exploration of the api. I also proposed a new structure of the files for the fossasia api, and helped mentor a few tasks relating to getting chinese communities added to the api.

  • community-calendar (7 tasks)
  • desktop text search application (2 tasks)
  • mobile text search application (2 tasks)
  • user-management web-application (12 tasks)
  • sup ideas (more than 50 ideas, create tasks as needed)
  • fossasia (1 task)
  • sTeam weblog ui (1 task)
  • blug t-shirt (1 task)
  • amber (2 tasks)
  • file-editor (1 task)
  • packaging pike (1 task)
  • api (3 tasks)
new tasks will be added as needed, when i get another idea for improvements on one of the projects, or if i feel a task needs to be redone.


首先声明:文中观点只是我自己的想法,仅作参考。 经常听到一些商业宣传:“‘开源大潮’已经汹涌而来”,好像大姨妈来了,大家都没准备好卫生巾一样。那么抛开这些商业宣传,开源这个国外舶来品在中国是如何生根发芽的呢?我们不妨稍加整理,将所谓的“开源大潮”切段评判,将其在中国的推进历程,尝试以“断代”的方式分段讲述。这样做,除了可以理清开源引入中国的历程,更可以剖析开源背后的人的作用、利益诉求和其最终目标。 对开源这种“断代式”的分析起源于年初和一位前CSDN同事的头脑风暴,我们赫然发现,开源在中国呈现出高潮和低潮交替的有趣局面,与高潮期的轰轰烈烈相对的,则是低潮期的暗流涌动,可以说同样重要。遂决定尝试对这种历程做一些分析和解读。

中国开源的第一次浪潮 (1999年~2002年)

  • 标志性事件:红旗Linux、蓝点Linux等的发布
  • 高峰特征:筚路蓝缕,开路先锋
  • 低潮期:互联网泡沫,催生低成本和更广阔的互联网需求
1998年,自由软件基金会的Richard Stallman第一次来到中国,在清华大学做了一次演讲。之后,1999年美军空袭中国驻南联盟大使馆,给很多人以极大的刺激,因此催生出中国要有自己的,自主可控的CPU和操作系统的战略决策。随后在政府的“关怀”和指导下,中国自主操作系统开始研制。必然选用了开源的Linux系统,这其中的佼佼者无疑是红旗Linux。从1999年红旗Linux发布第一版到2014年红旗倒掉,长达15年的时间里,红旗Linux为中国开源铺垫了坚实的力量,从应用软件本地化、国产软件标准化、软件开发流程化和国产操作系统政府采购等多个方面作出了卓越的贡献。很多Linux的组件、桌面环境以及文档的早期翻译和中文文档编写大多是红旗员工的贡献,这也为后面中国推广开源积累了大量的技术基础和人才储备。一句话来说,这一时期开源主要发生在政府推动,高校和研究机构中,还属于高层需求,基于民族产业和信息产业的自主可控的诉求。 [caption id="attachment_1096" align="aligncenter" width="300"]孙玉芳,红旗Linux的发起人 孙玉芳,红旗Linux的发起人[/caption] 这一时期,除了红旗Linux还有蓝点Linux等一些公司开发的操作系统,以替代微软Windows为旗号宣传和推广,他们共同的努力给了中国人第一次接触Linux,接触世界开源潮流的机会。但因为当时家里有电脑的人不多,且微软在华的强势推广,因此桌面Linux的推广遇到很大困难。2000年互联网泡沫更加重了这一趋势,因为有政府背景红旗Linux挺住了,但蓝点Linux等民营公司开发的操作系统就慢慢夭折了。而在此漫长的低潮期,从国外IDG引入的LinuxWorld大会丰富了此时的中国开源世界,在暗流涌动中掀起了下一波浪潮……

中国开源的第二次浪潮 (2005年~2006年)

  • 标志性事件:LinuxWorld China的成功举办
  • 高峰特征:商业开源走向前台
  • 低潮期:技术人才储备和社区孕育
事实上,有据可查的LinuxWorld China可以追溯到2000年,到2008年最后一届,连续举办了8年!LinuxWorld China分别在北京、上海和广州发展了大量开源爱好者。这样一次商业展览和交流会为中国开源的商业化发展提供了推进剂,使得Linux的服务器应用、数据库和早期桌面Linux得到了交流和展示的机会,为推动互联网产业、信息科技发展贡献了卓越的力量。其中2006年~2007年的两届LinuxWorld China最为盛大,也最为引人注目。诸如红帽、Novell等国际知名开源企业均参展,并为中国的开源人打开了企业应用的成功案例。同时,国内的红旗Linux、联想等大企业也推出了自己的开源企业级应用。 [caption id="attachment_1097" align="aligncenter" width="300"]LinuxWorld China 2006(图转自ChinaUnix) LinuxWorld China 2006(图转自ChinaUnix)[/caption] 展览归展览,但却为开源的企业级应用打开窗口,刺激了更多企业投身其中,也促发了技术的储备和人才的培养。现在很多鼎鼎大名的行业“高端”人士(有些确实做出过卓越贡献),都是在这一时期吸纳进入开源浪潮的。同时也要看到,因为商业展会只是隔靴搔痒,并没有足够的大众参与,此时对开源的带动作用只能停留在企业层面,重视应用而轻视贡献。因此到2007年和2008年的两届LinuxWorld China呈现颓势,草草收场。

中国开源的第三次浪潮 (2007年~2010年)

  • 标志性事件:王开源在比尔盖茨演讲时举牌“Free Software,Open Source”
  • 高峰特征:桌面操作系统惠及大众,开源社区发展壮大,但质次量多,难以维系,同时具有反商业特性,多种诉求并存,多种理念共进。
  • 低潮期:大潮中社区洗刷,留下精品。少量的社区贡献者产生,优质成员流失严重。社会生活水平下降,关注短期效益。
2007年4月20日上午9点45分左右,比尔盖茨参加北京大学创新活动会议,一男子突然冲到台前高喊:“我们需要开源软件,需要自由!”,并举起手里的纸牌——“Free Software,Open Source”。这位冲上讲台的男子就是王开源,这一天也就成为开源在中国第三次浪潮的发端。是时,王开源正在CSDN筹划开发力求推广自由开源的网站OSDN,后来因此事而不了了之。我曾采访CSDN里仅存不多的几位熟悉他的老员工,大家评价他平日“夸夸其谈”,满嘴“自由”和“开源”,反对微软不知所已,却并无实质成果。这里不管王开源此人如何,他在盖茨北大演讲时的奋然一举,通过新闻媒体曝光和方兴未艾的互联网媒体大肆曝光和炒作,使得开源和自由软件第一次进入普通人的视野,也开启了开源浪潮在中国最宏大的篇章!   [caption id="attachment_1099" align="aligncenter" width="300"]2007年王开源在比尔盖茨北大演讲时举牌 2007年王开源在比尔盖茨北大演讲时举牌[/caption] 从全球范围来看,2008年前后也是开源涌现最为突出的一年,是新成员新社区雨后春笋般产生最多的一年。得益于桌面级Linux越来越成熟(比如Ubuntu、SUSE和红帽),覆盖更多的硬件和PC,再加上客观上计算机的普及度增加,都推进了开源更加深入的传到到普通人的视野中,拓宽了其应用范围。这一时期,随着微软Vista系统的失败,其垄断越来越重,以及病毒和流氓软件的盛行,使得人们更加关注个人隐私、信息安全和自由软件,这为自由开源的世界观和价值观输出创作了难得的机遇。但矫枉过正,此时出现了一些开源反商业的特征出现,过度理想主义和极端思想产生,这在中国也受到波及和影响。与此同时,中国因为举办奥运会而短暂的门户开放,使得大众可以更直接的与世界开源潮流对接,这一时期大量Linux社区(比如各地的Linux用户组)和其他开源技术社区兴起并走向繁盛,比如华蟒社区、Huihu灰狐、Mozest等等具有强大影响力的开源社区步入成熟。与此伴生的还有各种开源相关的会议和展览,此时自由软件日(SFD)的活动在全国各地遍地开花,比如2008年北京的SFD活动和第一届GNOME.Asia就给很多人留下了深刻的会议,这些会议和展览散发的巨大影响力也为开源的普及提供了极强的机会。 这一时期,加入开源社区的成员很多,来自各个阶层各种层面,水平各异价值观差异巨大,其中不乏混入了很多“伸手党”,很多打酱油的,很多期待不劳而获的人。很多这一时期加入的人带有极强的现实利益诉求,或有期待投资-回报的价值观和心态,比如为个人事业或单纯为其中的投机财富,而这批人在这次浪潮中并没有满足,他们还会再次出现,因此我给这批人起个名字叫“零八派”(因为是2008年这一时期加入的嘛)。 此时推广开源追求更多的是用户数量增加,很少提及贡献者,更鲜有核心贡献者出现,当然这也是开源推广的必经之路。因此虽然社区多,人数多,但有能力贡献的人却很难跟上。结果到后期,很多小社区开始瓦解,或者追随商业利益而去,成为商战中的炮灰。而很多社区活动从技术活动转为吃吃喝喝,没什么技术含量,凡此种种这些也就导致大量社区成员流失。从社会宏观角度来看,这一时期房价高企,物价飞涨,贫富差距加大,人民生活水平一年不如一年,人们开始更加关注现实利益和短期效益,对开源这种长线的贡献回报价值体系不再有兴趣。社会矛盾更加突出,社会阶层分化更加严重,人们的诉求从单纯的经济诉求变得多元和复杂,更强调个体自由。自由开源所倡导的自由民主的普世价值观,肯定会影响到参与其中的社区成员,而这也就为后面浪潮的发展埋下了伏笔。

中国开源的第四次浪潮 (2011年~2012年)

  • 标志性事件:(无)
  • 高峰特征:云计算、大数据和移动互联网成为推动开源行业主流,官府推动力减弱。
  • 低潮期:开源硬件大器晚成,开源创业方兴未艾,开源参与者重新洗牌
这第四次浪潮可谓是来得快,去得也快。随着国外云计算、大数据的大举发展,国内也不甘示弱,特别是大公司如阿里巴巴的大举投入,使得开源应用在企业级有了更广阔的天地。这就如同Eric S. Raymond在著名的《大教堂与集市》一文中所预言的那样,互联网的基础架构会首先应用开源软件,而应用级则会稍后引入开源。同时小米、华为、中兴等国产手机制造商的崛起,为移动互联网注入了新的活力,开源的应用软件发展则在此处迸发出来。与此同时,开源商业化应用被更多的人重视和领会,更多的厂商看中了开源开发的特点,并觊觎低成本社区开发所带来的成本降低和效益提升。 [caption id="attachment_1100" align="aligncenter" width="300"]2012年的云计算大会 2012年的云计算大会(图自网络)[/caption] 但因为不得法,这次浪潮退去的却很快,究其原因其实很简单,因为没有调动社区的力量。此时经过第三次浪潮的洗礼,很多大社区分化成一个个小社区,正在进入重新洗牌的时期,影响力和独立性都非常弱,再加上很多开源开发者并不在社区中,游离于社区之外,导致无法组织有效的社区开发。这样就导致像Android和iOS应用开发往往自成一体,无法融入到现成的开源社区中去(因为现实的开源社区太弱了),给人一种无法接续的感觉。企业当然也不傻,发现没有社区支撑开发之后,他们便筹划成立基于产品开发的开源社区,这样在后期,为了运营这样的开发者社区也就催生了一个新的岗位——“开源社区运营”或者叫“开发者关系”。 这一时期的另一个重要特征就是政府在开源领域的影响力,几乎消失殆尽。随着大量盗取开源代码宣称“自主创新”的产品曝光,人们开始反感政府将咸猪手伸向开源领域。而企业选择开源产品也是基于利益考量,政府的推动作用几乎无处可用,此时官方只能通过“核高基”勉强发挥一些影响力。 与高潮期的大企业参与相对的是低潮期的小公司崛起。2011年开始以Arduino为代表的开源硬件,在国内着实火了一把,“创客”一词也走入大众视野,走入CCAV的新闻联播中。北上广深各大城市各个高校纷纷成立创客空间,开源硬件创业似乎成了解决高校毕业生就业问题的一剂良药。事实上,在这次创业大潮中,除了开源硬件,更多的其实是基于开源软件的创业,这尤以前端开发、个人云业务以及平台服务等等为代表,这些创业公司成为了推动开源的中坚力量。

中国开源新浪潮 (2014年~?)

  • 标志性事件:尚未发生
  • 高峰特征:自由开源软件社区的成熟发展并强势回归,成为推动开源在中国发展的中坚力量。
现在,企业已经深刻意识到开源社区的重要性,大力筹建和拉拢亲自己的开源社区,与此同时经过第三次开源浪潮洗礼之后,开源社区经过大浪淘沙,淘汰了大量不合格的社区。其他社区通过自主发展,学会了自治管理,学会了社区的统筹规划,懂得了如何通过社区引导和推进以社区为中心的开源商业模式,在坚持中立性和独立性的同时与多家企业保持良性互动,吸纳多层次会员,成为了开源推动的核心和主力。 以上所说并不是预言,类似的例子其实就在我们周围发生,比如北京Linux用户组和北京Python用户组这样经历大风浪的老社区,还有像Docker.CN这样的新兴开源社区。这将会是一次巨大的潮流冲击,并且将会是不同以往的潮流变化强势来袭。 [caption id="attachment_1101" align="aligncenter" width="300"]北京Linux用户组的线下活动 北京Linux用户组的线下活动[/caption] 总结前面已经发生的四次开源浪潮,不难得出这样一个结论:中国的开源发展遵循从“政府——企业——草根社区”的一种自上而下的发展体系,即首先由政府主导和推动,由企业应用产生利益诉求,再由社区开发去迎合这些利益诉求。而这两年,我与美国、欧洲、韩国、日本、新加坡和台湾香港的一些社区交流后,发现国外往往是自下而上的,也就是由草根社区首先发起和主导,由企业通过利益引导社区开发,政府给与必要的协助。中国这种自上而下的体系有很大弊端,政府层面因为有不受控制的权力,因此可以对企业和社区任意干涉,任意处置;而企业层面,可以利用社区为其商业利益服务,成为企业廉价的研发部,同时企业的开源开发往往只给这个企业自身使用,并不会惠及到其他相关企业(出于竞争考虑),成为这个企业的专属利益输送工具,因此这种开发基本相当于闭源,对整个开源大环境的提升并无益处。这样,中国的开源变为了利益的封闭循环。 如上文所说,草根社区经过第三次浪潮时期的成熟和发展,开源社区成员接受了自由开源软件承载其中的自由民主的普世价值观,不可逆转的会追求独立自主的社区成长,特别是在第三次浪潮时期依然是学生的群体,也就是90后这一批。他们已经意识到民主的前提是自主,开源要想发展,靠“伸手党”是根本不行的,因此要引导社区成员通过公民自治管理开源社区,简单说就是“自己的开源社区自己搞”。再总结了第三次浪潮发生时的种种弊端以后,社区变得更加成熟并引导整个开源环境向着更加健康的良性发展,成为推动开源的一个平台。到此时,开源在中国的发展从自上而下的体系演变成了自下而上的草根突围。正是因为如此,所以我将这次浪潮命名为中国开源新浪潮! 这个过程一定不会顺利,但潮流就是潮流,谁也阻挡不住浩浩汤汤的潮水。同时也要看到,只有开源社区懂得如何利用公民自治管理社区,推动开源平台建设,才可以更好地为自己赢得生存空间。关于这个话题,我将会在下一篇文章中阐释。


  • 国产操作系统的“复辟”
最近两年随着微软XP停服,win8疲软,苹果强势回归,伟光正提出民族复兴的中国梦,这种国产自主操作系统的提法再次甚嚣尘上。而政府也希望通过业已存在的自上而下的体系,影响企业利用开源达成目的。很多带有投机想法的公司便投其所好,为官府鞍前马后的服务,甚至不惜牺牲开源社区的利益。那么现在效果如何呢?呵呵。 [caption id="attachment_1102" align="aligncenter" width="300"]极力推动国产自主操作系统的倪光南院士(图自网络) 极力推动国产自主操作系统的倪光南院士(图自网络)[/caption]
  • “零八派”的“复辟”
前文已述,在2008年左右的第三次浪潮时期,有一批抱有投资-回报思想的人,他们的某些利益诉求在当时没有满足(我命名为“零八派”),多年后看到开源大潮已如此席卷全国,便想利用机会再次试探并满足当时的利益诉求。但是他们的想法和观念还停留在第三次浪潮时期,某些人甚至从2010年到2014年都没有参加社区活动了,他们没有看到现在的浪潮已经是自下而上的不可逆转了。他们还认为社区还像2008年时那样一盘散沙,还认为社区里充斥着“伸手党”,还认为社区是低效和无能的,还认为只有依靠政府和大公司自上而下的引导,社区才有发展空间……云云。 他们基于这些想法,趁着现在新浪潮尚未成型,联合组织起来,希望通过一个强大的靠山,让别人来靠(“靠”字这里取“依靠”之意),可是不要忘了社区已经开始学会自主和自治了,这些人的这些行为只会让成熟的社区发出一声感慨——靠(这个“靠”字的意思请自行揣摩)。


通过这篇文章,我试图将十几年来开源在中国的发展做一个简单的梳理和断代,意图总结其中的规律和必然结果。我发现,开源在中国的发展亦如其他舶来品在朝内的发展一样都是畸形的,变态的。本该自下而上的开源发展历程,在中国就变成了由政府主导,企业操纵,社区没有自主精神的自上而下的模式发展。为何是这样的发展模式,其实原因都能明白,这里就不展开了。 而我想说的是,顺应潮流的发展,还是逆潮流而上,完全取决于每个人自己的选择,毕竟开源的核心是自由,每个人都有自由选择的权利。

[图文教程] 在openSUSE下玩转GPG

关于这个话题最早首先是玛格丽特·苏在微博上贴图求助,同时也让我有兴趣好好去了解了解,特别是当时我又感兴趣于GPG与智能卡的交互。后来我曾在2014年openSUSE.Asia Summit上做过一个workshop,但效果不是很好,很多朋友觉得讲的不够细致,确实,GPG的命令行操作对初学者比较难,上手困难。 后来我就花费了一些时间考察了常用的一些GPG图形前端,最终选定了本文我要介绍的这个软件——Kleopatra。没错,名字就是来源于“埃及艳后”克里奥佩特拉(Cleopatra)。我选定Kleopatra有几个原因,第一是因为它比较简洁明了,容易上手。第二是因为功能丰富,除了常用的GPG/OpenPGP密钥操作以外,还支持x509个人证书等。第三是通用性,Kleopatra可以在包括Linux/BSD/Windows等操作系统上使用,Windows可以通过安装gpg4win来安装Kleopatra,这一点就超过了同样非常强大也非常简洁的GNOME Seahorse和Kgpg。 本文力求简明扼要地讲述如何在openSUSE下玩转GPG(其他Linux发行版、BSD和Windows也可以应用本文所有例子),力求一句话讲明与GPG相关的一些概念和操作,比如常用的加密/解密以及文件和密钥的签名及其校验。关于与电子邮件的结合,我会推荐使用Thunderbird+Engimail的组合,但不会过多详述。


  • PGP (Pretty Good Privacy):可以简单理解为是一种数据加密解密和验证的应用程序。使用散列算法。此软件是闭源商业软件。
  • OpenPGP:这是一种数据加密算法的开放标准,也就是一种加密协议(RFC 4880)。而PGP也是这个标准的实现之一。
  • GnuPG(GPG):是OpenPGP标准的开源实现,使用GPL协议的自由软件。
  • 散列算法(Hashing,哈希算法):可以简单理解为是对一段数据(可能是文件、也可能是流)取其摘要的数学运算方法,这种运算有个特性,就是不可逆性,无法根据已经摘要的数据(即哈希值或散列值)恢复成原数据。常用的散列算法有MD5、SHA-1、SHA-256、SHA-512等等。可以用这种算法来验证数据的一致性,也可为数据生成数字指纹。
  • 非对称加密:先来说“对称加密”,就是在加密和解密过程中使用的是相同的密钥。而非对称加密,就是在加密和解密的过程中使用的是不同的密钥。一个公钥,一个私钥。使用公钥加密,使用私钥解密,因为公钥只是用来加密,甚至可以随处散播。而私钥就必须妥善且私密的保管好,否则就无法解密了。同时私钥还可以用来对文件进行数字签名,也就是对文件或信息生成一个散列值,若文件在传输过程中发生更改,再做散列操作以后,这个值就变了,这样就有了形似古时通信用“封印”的效果。我们常用的非对称加密算法有DSA和RSA等。

安装 Kleopatra

这个软件包一般在kdeim组件包内,有些发行版会单独打包,比如OpenMandriva/Debian/Ubuntu,可以单独安装Kleopatra包。若没有可以从源码编译。 Windows用户可以选择安装gpg4win这个软件,选择下载完整版包含Kleopatra的就行。Mac OS 用户可以安装gpgtool,但只有命令行版。


打开 Kleopatra 之后选择文件—>新建认证,打开新建认证对话框。可以看到有两个大按钮,因为Kleopatra除了支持常用的OpenPGP协议以外,还可以用来生成个人站点x509证书。这里我们选择“创建个人 OpenPGPG 密钥对” 然后填入个人信息。特别注意名字和邮件地址不要填错。注释建议留空。之后我们按“高级设置”按钮,配置更多选项。 在这个高级设置对话框中,我们可以选择生成的算法,保持默认的RSA即可。为了更高的安全性,我们选择4096比特,这是目前gpg支持的最大位数,也是最安全的。另外就是证书有效期(也就是密钥的有效期),这里注意,为了安全起见,也为了防止密钥丢失造成的损失,这里推荐还是为密钥增加有效期,一般三年左右就行。这并不是不可修改的,还可以修改,建议逐年增加。如图所示: 然后选“下一步”。之后会有个确认信息,确认生成的密钥对是否如你所愿,特别注意名称和电子邮件地址不要写错。然后点选“创建密钥”按钮。 在创建密钥的过程中,会要求你输入一个密码,这个密码是个密钥的本地密码,强烈建议设置一个密码,不要为空!假设你的私钥丢失,落入他人之手,因为他没有此密码,也无法使用你的私钥。 密钥被创建以后,可以看到一个密钥的指纹,此指纹是对密钥对进行散列算法得到一个为了便于记忆和识别的编码。这里可以点选生成密钥对的副本,也可以邮件发送证书,目前不建议把证书(这里其实是你的公钥)上传到服务器。 如图所示,绿色阴影所在的密钥就是刚刚生成的密钥对。 双击此密钥可以获得密钥相关的细节。我们可以对其进行修改,修改好之后可以选择上传到密钥服务器,这里只会上传公钥,这样可以有更多人知道你的GPG公钥。之后别人就可以根据你的GPG公钥,给你发送加密信息了。


导出公钥的操作非常简单,只要在主界面上选中预导出的密钥,然后再按上面的“导出证书”按钮,之后就可以把此公钥另存到另一个地方了。也可以把此公钥发送给别人,也可以放到自己的网站供人下载上等等。可以下载我的个人公钥,在我个人网站的右侧栏里可以找到下载我GPG公钥的地方(如下图)。 在预导出的密钥上点右键,还有一个操作是“导出到密钥服务器”,这会将公钥上传到公共的密钥服务器上,这样大家下载起来也就更方便了。特别提醒,导出到服务器的公钥不能修改和删除,请确定你检查没问题了再上传。 若想导出公钥和私钥,可以在预导出的密钥上选右键,选择“导出私密证书”(也就是私钥),之后选择要导出的位置,建议勾选“ASCII形式”可提高一些安全性。这个操作还会把子密钥也一起导出(如果有的话)。 导入操作也很简单,直接点选主界面上的“导入证书”,之后选择你要导入的密钥备份文件即可。 如何导入公共密钥服务器中别人的公钥呢?只需点选在"在服务器上查询证书",在弹出的对话框中搜索你要导入的公钥的名称、电子邮件、指纹、指纹标识(其实就是指纹的最后8位)等。如果是指纹或者指纹标号,需要有“0x”前缀。如下图所示:


加密和的操作大同小异,非常简单。从文件—>加密/签名打开加密对话框,选择要加密的文件。如图所示,我一般会勾选“文本输出(ASCII形式)”,稍微增加一些安全性,也方便后续文本操作(比如拷贝粘贴)。如果你需要加密之后再归档打包也可以勾选相关的归档选项。 然后选择加密用的公钥,选中谁然后点选“添加”按钮,就会加入到下面的列表中。注意,如果你使用收件人的公钥加密,一定要记得把自己的公钥也加进去,否则这个文件你自己无法解密。在这个列表里若只有公钥,则会以正常字体现实,若公钥和私钥都存在,则会显示为粗体。 之后按“下一步”就会提示你加密成功。 可以看到原文件和加密以后的差别。 为文件签名与上面加密操作几乎一样,这里不再重复,但在最会一步会让你输入私钥的密码,也就是刚才我们创建密钥对的时候设置的密码。 签名以后的签名文件test.asc是下图这样。毕竟只是原文的散列,也就是原文的摘要,所以会显得很少。 如果要解密文件,则从文件—>解密/验证打开解密和验证对话框,选择要解密的文件,并选择要把解密以后的文件存放在何处。 验证文件签名,需要原文件和该文件的签名文件,本例是test文件及test.asc文件。这样才能进行验证。从文件—>解密/验证打开解密和验证对话框,选择要验证的文件签名和文件。直接选下一步即可。结果会直接显现。


除了上述所有这些,还可以给别人的GPG公钥签名,这样的好处对别人进行认证,以帮助其增加信誉度。一个人被人签名越多,其自身的信誉也就水涨船高。 我们可以先导入某人的GPG公钥,用上面的方法。然后在他的公钥上点右键,选择“认证证书”。第一步要求你选择要认证的用户编号,如果某人有多个用户编号,根据情况勾选。然后别忘了勾选最下面的“我已验证此指纹”。这里要注意,为了防止某人骗取你的签名,需要做一些基本的验证:其一他的用户编号,也就是UID是不是他本人所掌握的邮件地址,只认证可信的用户编号。其二,让他提供给你一份全部长度的密钥指纹,至少16位,并仔细核对。其三,当面签署,最好能验证其身份证上的信息与用户标号(UID)一致。 之后第二步,选择你的私钥,如果你有两个或两个以上私钥时,注意不要看错。下面选择签名方式,一种是本地签名,一种是可导出的签名。这里选择第二种——认证所有可查看证书的人。可以勾选“稍候将认证的证书发送到服务器”,也可以不选,如果不选,就需要再为他做一步“导出到服务器”操作。 因为需要用你的私钥来签名,因此会要求你输入密码。之后认证成功会有一个提示,可以看到最终结果。 可以双击那个你签名的公钥,转到"用户编号和证书"选项卡,就可以看到我给此公钥新添加的签名了。


Kleopatra与电子邮件的结合不够好,若需要解密电子邮件,可能需要客户端先把邮件导出,然后再使用Kleopatra来处理。对于加密和签名,我们虽然可以把加密和签名的内容拷贝到正文里,不过毕竟这不太方便。所以各个邮件客户端都有与OpenPGP的结合,比如GNOME下的Evolution就可以很方便的直接与OpenPGP结合,相应的KDE下的Kmail搭配Kpgp也是同样的功能。 不过从跨平台通用性考虑可以使用 Thunderbird + Enigmail。网上这类文章很多了,这里不再赘述。特别要说明的是,Engimail可以完成上面所说的所有功能,但其生成密钥的方法略有点复杂,选项比较多,不利于初学者快速掌握。此文很不错,可以做参考 最后,Kleopatra的功能是非常强大的,除本文所介绍之外,还可以检查文件的校验和等等。可以说是一款不可多得的个人加密工具前端。我花了点之间,录制了一段操作视频,解释了一下以上各操作。 墙内镜像(非高清):

[传单中译] 免受电子邮件监控的自我防御之术

之前层翻译过 FSF 的有关GnuPG 的信息图。可以看这里。 最近又发现了 FSFE 也就是 FSF的欧洲分部又基于此做了一张传单,于是我也将其翻译了,我是基于其英文版改的。 下载中译:PDF(831KB)  源文件(2.4MB)


Q1. 开源的目的是什么?大家积极推广开源的目的是什么? 你个人的看法是什么,你认为在开源群体别人的看法又是什么。开源的目的是技术创新,还是追求自由民主?  先来说开源的目的。从最初GNU和自由软件开始,源码开放的目的就是一种保障自由的手段,保障软件的用户、开发者处在平等的地位上。而最近几年开源的目的依旧没变,技术创新和反对大公司垄断是随开源伴生的副作用,包括开源降低了开发成本等等,这些都是副作用,而这些副作用的产生的本源,是因为用户和开发者处于平等的地位,没有阶级差别而产生的。这是我的理解。而其他人的理解还是比较多元的,有的人认为开源可以学到东西,有人认为开源的目的是因为大势所趋,还有人认为开源的目的是为了引来更多的贡献,为自己服务。云云。 从我个人的理解来看,开源的直接目的既不是技术创新,也不是追求自由民主,而是平权和协作。具体到开源社区中,有一个大家都认同的运行规则就是“自由和贡献相对等原则”。什么意思呢?也就是你要想在开源社区中获得额外的权利和权力,也就是除去开源本身所赋予的源码权利之外的其他权利和权力,比如社区领导人的参与权和表决权,源代码的决策权,人员任免权、提交到主流代码仓库(比如Git)的权利,或者使用特定域名的邮件转发服务、Jabber服务等等。要想获得如上这些权力,就需要与之相对等的贡献,贡献越多获得的权力也就越大。比如GNOME基金会的董事,是由GNOME基金会成员匿名投票选出,而要想获得投票权必须是GNOME基金会成员,成为基金会成员则必须具有一定的贡献(代码贡献、宣传贡献、金钱贡献均可),并被至少两名其他基金会成员提名。这里就体现了贡献和自由(也就是权力)的对等原则。也就是所有人都有平等的地位,平等的机会,要想获得更大的权力,就必须要付出相应的贡献。开源社区保障了这种基本原则得以顺利实施,同时开源这件事又可以保障软件开发活动的协作更加稳健和顺畅。 而那些反对大公司垄断的成功案例,则成为宣扬开源万能论的“元叙述“(meta-narration),说到底,反垄断不就是将大家都放到同样平等的地位上吗,所有人对开源的贡献是唯一变量,而不是你有多少钱,有多少背景或资历。 也正是因为有了这样的特性,所以开源社区是去中心化的,是平面的一个团体。而去中心化的思想核心来自于美国TMRC早期黑客的黑客伦理。下面这段话摘自Steven Levy的《黑客:计算机革命的英雄》
伦理原则强调"共享、开放、分散、为操纵机器不惜任何代价",与PC文化与互联网文化的精神内核一脉相承 1. 对计算机的访问(以及任何可能帮助你认识我们这个世界的事物)应该是不受限制的 2. 完全的任何人都有动手尝试的权利! 3. 所有的信息都应该可以自由获取。 4. 不迷信权威——促进分权 5. 评判黑客的标准应该是他们的技术,而不是那些没有实际用途的指标,比如学位、年龄、种族或职位。 6.你可以在计算机上创造出艺术与美。 7. 计算机技术可以让你的生活更美好。
另外还推荐一本书《黑客伦理与信息时代精神》。 Q2. 大公司在开源生态中究竟处于一个什么样的角色?你对它们参与到开源当中是什么样一个态度?当开源参与人群当中,个人爱好者越来越少(不确定的判断哈)、公司的代言人越来越多的话,这意味着什么?会不会跟开源最初的诉求背道而驰? 大公司在开源生态中的角色有两类:一类是金钱提供者,也就是赞助商,带有一定的慈善行为,比如Google每年都会划拨专项资金投入给开源的会议、项目或者基金会,他们既是开源的用户和受益者,利用开源开展了自己的业务,同时将钱投入到开源项目或者基金会中,以更好地推进这项事业。另一类是参与者,比如红帽、Inter和IBM等,他们既参与到开源中,贡献代码,同时也受益于此。 我对大公司参与开源的态度是谨慎的欢迎。无论是那种方式加入到开源中,都不能影响开源社区的中立和平等原则,都不能影响开源产品的最终走向,否则公司将会把一个社区拖死,社区也将成为公司的廉价劳动力,成为公司的奴仆。 举个例子,还比如GNOME基金会的董事,总共是7个人。虽然红帽对GNOME项目的影响最大,但在董事选举时有个强制规定,最多只能有2名来自同一家公司的成员,这样就限制了如红帽这样的大公司对GNOME基金会项目的影响力。 还比如Oracle收购了SUN公司以后,因为认为OpenSolaris没有商业价值,决定将这个开源产品撤销,社区也被迫解散。虽然OpenSolaris里大多数都不是SUN的员工,但因为这个产品是Solaris的开源版,受SUN的影响和控制巨大,最后就成为了整件收购事件的炮灰。 Q3.从开源组织形态上来讲,一直大家喜欢说的是开源当中所倡导的是从下而上的组织形式。但由于一些参与者混杂着个人爱好和公司代言人的双重身份,所以在开源组织和开源社区活动的组织方面,其实还是可以看得到公司的潜在影响。若是公司的影响很大的话,是否与“从下而上”的这种开源组织文化是相悖的? 自下而上的组织形式,其实是对去中心化的一种形式上的说法。通过上面GNOME基金会选举的例子就可以很明确的讲明什么是自下而上的组织形式。对于普通人而言,自下而上意味着通过自己的贡献不断提升在社区中的地位,获得更大的权力和话语权,也就是影响力。这个过程无人可以替代,也无人可以例外。 大公司加进去的好处是加快了贡献的进度和获取地位的进度,说到底是因为其贡献的多自然地位上升的也就快。一个成熟的开源社区,应该理性的思辩并将大公司的影响降至与其贡献等同的地位,同时通过契约保持社区的中立性和独立性。 上面OpenSolaris的例子就可以很好的证明这一点,而为了避免这些问题,国外的开源项目社区往往通过成立基金会的方式来规避大公司的超强影响力,保持社区的独立性和中立性。由于在中国成立基金会等这些NGO组织非常非常麻烦以致几乎不可能,这也就为保持这种社区特性留下了一定困难,不过我相信通过明确的契约和规范,这也不是不可能达到的。 Q4. 想问问你对技术的看法、态度是怎样?或者说,技术观念是什么?技术是工具,还是技术本身就包含理想?技术若是工具,那么大家运用技术工具想要达到的是什么?(又回到了第一个问题。) 我认为技术就是工具,不包含理想。比如原始人用火,就是为了取暖和烹饪,而由烹饪而产生的厨艺和饮食文化则是伴生用火这项技术产生的。还比如核技术,既是毁灭一切,又可以造福人类,而为了规避核技术的毁灭特性,以及由此伴生的核讹诈和欺骗,因此制定了《核不扩散条约》。 任何技术应该能为人类整体带来福祉,如果它只能带来毁灭,我想人类社会是无法接受的。火既可以用来烹饪,也可以纵火烧毁房屋,斧头既可以用来砍伐和切割,也可以用来杀人,核技术也是如此。也就是对一项技术的限制和控制与使用它的人有很大关系,因此技术最终是与使用者自身素质有很大关系的。 计算机技术也是如此,黑客伦理的最后一条“计算机技术可以让你的生活更美好”说的就是这个道理,人们应该通过提高自身素质让计算机技术为整个人类社会谋福祉,服务于全体,而不是为某个小圈子,某个利益集团,甚至为某个人的私利。 Q5. 对开源中商业的进入,你秉持一个什么样的态度? 开源并不排斥商业,但是开源当中最让人赞叹的最早是业余爱好者的无偿付出,但现在开源界感觉还是很混杂的感觉,商业或公司力量的无孔不入会不会破坏原有的文化? 这就谈到什么是开源文化。我认为,开源文化是基于黑客伦理的一个延伸,可以说是黑客文化的现实载体,更融合了中立性和独立性的自身特性。 大公司的加入当然是好事,但我本人对其依旧秉持谨慎的欢迎态度。因为公司毕竟是逐利的,其对开源的投入具有选择性,比如微软2011年大量贡献Linux内核代码,几乎只贡献给了Hyper-V虚拟化相关,因为这是其云平台Azure的底层架构所必需的。而2012年和2013年在Linux内核代码的贡献列表里微软再也没有进入top10的行列。同样的道理,有些公司对某项技术很感兴趣,投入巨大,比如大数据相关的Hadoop最近两年飞速发展;与此同时,之前被Intel等大公司看中并发起的Meego项目却最终夭折,被Tizen替代。 所以公司投入开源的逐利特性决定了一个开源项目或者一个开源社区的走向,其话语权和决定权也对整体发展起决定作用。也正是因为如此,更应该通过手段、契约来限制公司的话语权,避免对开源社区产生不利的影响,总之开源社区要自觉、自决而不要自掘。 Q6. 你认为“社区精神”是什么?“社区精神”在开源文化中处于一个什么地位? 社区精神其实正是上面说的黑客伦理,换个提法而已。简单说就是自由、共享、开放、分权和协作共进。 社区精神在开源文化中处在非常重要的核心地位,可以说正是因为有了独立自主的社区精神,现在的开原世界才能如此丰富多彩,才能如此蓬勃向上。

Software Freedom Day 2014 Phnom Penh

The Digital Freedom Foundation is organizing our Software Freedom Day event in Phnom Penh together with the National Institute of Posts Telecommunications and ICT and the Ministry of Posts and Telecommunications on November 1st at the NIPTICT Building. There will be 14 talks (9 in Khmer and 5 in English) with topics covering free and open source software ranging from operating system, learning platforms, website development, resource map, servers, to security. Here is the detailed schedule and speakers profiles.

We expect to have more than a hundred people to attend and aim to target both the university audience and the young workforce, on top of presentations and workshops, we (assisted by various communities) will be holding booths (e.g. Moodle, Mozilla, RouterOS, Ubuntu and Blender) to allow for more individuals discussions. All in all it’s been a joy preparing for this event, allowing us to talk and plan resources with people from different local communities such as OpenSourceCambodia and Smallworld Cambodia.

The event will start at 1:30pm tomorrow, if you happen to be in Phnom Penh please do drop by!


Planet BLUG

Planet BLUG is a window into the world, work and lives of Beijing LUG members and contributors.

Updated on May 30, 2016 - 02:14 UTC.
Entries are normalised to UTC time.


Atom 0.3
RSS 1.0
RSS 2.0


Brought to you by the Planet aggregator, cron, Python, CANDIS Group (who kindly host the BLUG server). Beautiful template adapted from an early design by Steven Garrity, concept by Seth Nickell and Diana Fong.

Planet BLUG is edited by Fred. Please contact him if you have a question or would like your blog added to the feed.