Meet us every second Tuesday of the month!
Text Size
   

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

最近花了一些时间,重新翻译了官方手册 Getstart。利用官方发布 3.4 之后一直到下一个版本 2016.1.0 之前的空隙时间,抓紧将所有都翻译好了。 下载 PDF 文件:https://tonghuix.fedorapeople.org/getstart-zh.pdf 翻译项目地址:https://github.com/tonghuix/getstart-zh 项目使用了 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

Overview

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. 114.114.114.114 |
                                    China    +----------------------+
                                   domains
                                      |
                                +-----|---------------------------------+
                                | +-------+   Other   +----------------+|
       +------+                 | |dnsmasq|---------->| dnscrypt-proxy ||
       | Host |-- DNS query --> | +-------+  domains  +----------------+|
       +------+                 |                              |        |
                                |            Raspberry Pi      |        |
                                +------------------------------|--------+
                                                               V
                                                       +---------------+
                                                       |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 https://github.com/anthonywong/dnscrypt-proxy-raspbian-wheezy.git
$ 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:

DNSCRYPT_PROXY_LOCAL_ADDRESS=127.0.0.1:5353

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 www.facebook.com

; <
> DiG 9.8.4-rpz2+rl005.12-P1 <
> @localhost -p 5353 www.facebook.com
; (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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.facebook.com.      IN  A

;; ANSWER SECTION:
www.facebook.com.   2725    IN  CNAME   star-mini.c10r.facebook.com.
star-mini.c10r.facebook.com. 47 IN  A   31.13.77.36

;; Query time: 140 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Mon Jan 18 00:39:36 2016
;; MSG SIZE  rcvd: 90

$ dig @localhost -p 5353 www.sina.com.cn

; <
> DiG 9.8.4-rpz2+rl005.12-P1 <
> @localhost -p 5353 www.sina.com.cn
; (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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.sina.com.cn.       IN  A

;; ANSWER SECTION:
www.sina.com.cn.    2733    IN  CNAME   jupiter.sina.com.cn.
jupiter.sina.com.cn.    3580    IN  CNAME   region.sina.csglb.txcdn.cn.
region.sina.csglb.txcdn.cn. 1261 IN CNAME   n2wous.panthercdn.com.
n2wous.panthercdn.com.  20  IN  A   103.4.200.227
n2wous.panthercdn.com.  20  IN  A   103.4.200.235

;; Query time: 125 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; 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.

domain-needed
bogus-priv
no-resolv
interface=wlan0

Now comes the interesting part. We are going to tell dnsmasq to use a China DNS server (114.114.114.114 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.
server=/baidu.com/114.114.114.114
server=/sina.com/114.114.114.114
server=/ifeng.com/114.114.114.114
server=/phoenixtv.com/114.114.114.114
...
server=/deppon.com/114.114.114.114
server=127.0.0.1#5353

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 離世

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

原文:https://bits.debian.org/2015/12/mourning-ian-murdock.html

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

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

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

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

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

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

譯者:黃彥邦 (Anthony Wong)

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

XMPP(Jabber)聊天快速指南

花了一点时间,写了一个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(台北开源软件用户组)的活动时,发现他们也同样发愁这个问题,很多时候发现开源贡献者或者参加线下活动的就是那些人,很少见到新面孔。 [caption id="attachment_1201" align="aligncenter" width="500"]我和黄敬群 黄敬群(右)和我[/caption] 如何解决呢?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”。

就我多事。我想引用一下其它得奖的城市,如果这些城市有大名,引用它们,可以显得老家兰州跻身前列了。新闻上说从11年开始发此奖,应该不难找到。这一找倒好,搜索了半个小时,不但其它城市没有找到,这个奖的英文名字都不清楚了。相关报道一共3篇,奖名各不同。

Today Reform Progress Prize
这个名字来自CCTV英文报道原文

Today Change Progress Award
来自 get-top-news.com的这篇报道英文极差,原本不值得引用,但是除了它再没兰州得奖的英文报道了。这虽然是英文新闻网站,从原代码里的方块字来看是国内出品。
Award for Today’s Transformative Step
这个奖今年除兰州还有其它得主。另外一个得主是:中国可持续发展工商理事会(CBCSD)。这篇CBCSD的报道又给此奖取了新的英文名。

这个国际大奖的英文名虽然各异,中文名却一直是同一个。用中文名字搜索,可以看出,今年得奖的一共五家,前述兰州,前述CBCSD,中国建材集团、国家电网和晶科能源控股有限公司。去年此奖的得主是上汽集团和霍林河循环经济示范工程。前年和大前年阙如。总之,所有荣膺此奖的都来自中国。既然是联合国大奖,中国年年大满贯,不免令世界瞩目吧。

这个迷我能猜到答案。我年轻时候参与过一些中外国际合作项目,有时候,中方合作者会提出奖项,用作政绩……这往往是自家项目做了一两年,需要外界肯定的时候。国际合作单位也有中国通,知道报道是给国人的面子用,不影响单位国际信用,还可以拿来建立关系,还可以当令牌免得小鬼档道,也就放灯通行。发奖单位名义上往往是国际合作单位的上级部门,或者上上级部门,具体也不用越级请示,大家都玩得开心就好。个别也有中方和国际单位闹得像夫妻吵架,不肯发奖的。

奖是中国制造给中国消费者享用,英文名当然不统一。

本文引用的三个带有英文名称的报道,CCTV算是比较诚实的,指明发奖单位是四个,UNFCCC(联合国气候变化框架公约)之外还有四家,中外各半。其它报道都是全文中用文,都更大胆一些,比如说“兰州在巴黎气候变化大会上获奖”。

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


Welcome to Ghost

You're live! Nice. We've put together a little post to introduce you to the Ghost editor and get you started. You can manage your content by signing in to the admin area at <your blog URL>/ghost/. When you arrive, you can select this post from a list on the left and see a preview of it on the right. Click the little pencil icon at the top of the preview to edit this post and read the next section!

Getting Started

Ghost uses something called Markdown for writing. Essentially, it's a shorthand way to manage your post formatting as you write!

Writing in Markdown is really easy. In the left hand panel of Ghost, you simply write as you normally would. Where appropriate, you can use shortcuts to style your content. For example, a list:

  • Item number one
  • Item number two
    • A nested item
  • A final item

or with numbers!

  1. Remember to buy some milk
  2. Drink the milk
  3. Tweet that I remembered to buy the milk, and drank it

Want to link to a source? No problem. If you paste in a URL, like http://ghost.org - it'll automatically be linked up. But if you want to customise your anchor text, you can do that too! Here's a link to the Ghost website. Neat.

What about Images?

Images work too! Already know the URL of the image you want to include in your article? Simply paste it in like this to make it show up:

The Ghost Logo

Not sure which image you want to use yet? That's ok too. Leave yourself a descriptive placeholder and keep writing. Come back later and drag and drop the image in to upload:

Quoting

Sometimes a link isn't enough, you want to quote someone on what they've said. Perhaps you've started using a new blogging platform and feel the sudden urge to share their slogan? A quote might be just the way to do it!

Ghost - Just a blogging platform

Working with Code

Got a streak of geek? We've got you covered there, too. You can write inline <code> blocks really easily with back ticks. Want to show off something more comprehensive? 4 spaces of indentation gets you there.

.awesome-thing {
    display: block;
    width: 100%;
}

Ready for a Break?

Throw 3 or more dashes down on any new line and you've got yourself a fancy new divider. Aw yeah.


Advanced Usage

There's one fantastic secret about Markdown. If you want, you can write plain old HTML and it'll still work! Very flexible.

That should be enough to get you started. Have fun - and let us know what you think :)

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 1.2.3.4, run these commands:

$ sudo apt-get install obfsproxy
$ mkdir /tmp/obfsproxy-temp
$ obfsproxy --data-dir=/tmp/obfsproxy-temp scramblesuit --password=QWLY42YHB75J3B57XOKYNNFJPOQ7APHL --dest=127.0.0.1:22 server 0.0.0.0:7700

On Raspberry Pi gateway

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

Edit ~/.ssh/config:

Host 1.2.3.4
  ProxyCommand nc -X 5 -x 127.0.0.1:3333 %h 7700

Run these commands:

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

The post Obfuscated SSH tunnel appeared first on Anthony Wong.

SFD Phnom Penh 2015 roundup

sfd2015group

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-preparation

Preparation before the event

sfd2015mozilla

Mozilla Local Team

fedora

Thanks to Sirko Kemter, we had a Fedora booth!

sfd2015president

Opening speech by NIPTICT’s President

sfd2015fredm

Free Software: what’s it and what can I do with it? by Fred

sfd2015fred

Building multirotors with free software

sfd2015localization

Localizing free software by Khoem Kokhem

sfd2015fedora

Fedora.next for everybody by Sirko Kemter

sfd2015mozilla1

Contributing to Mozilla community by Vannak Eng

sfd2015mapping

Open Source Mapping by Nhiep Seila

sfd2015leap

Understanding 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!

200teams

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!

web-banner-chat-we-re-organizing-h

恋爱中的UNIX哲学

已经有三个多月没有更新博客了,主要是忙着参加六月香港的开源年会(HKOSC),以及八月的台湾COSCUP开源人年会,这两个会我总共有3个演讲要讲,准备演讲外加办理各种旅行证件和手续,占去了我大量的时间和精力。当然于此同时还和我的女神Eris牵手在了一起,和她交往的这些日子以来,还是很快乐和欣喜的,虽然异地相隔万里。
上个月为了准备COSCUP的演讲,我又翻阅了《Linux/Unix设计思想》(作者是 Mike Gancarz)这本书,虽然后来这本书里的内容并没有被我用到COSCUP的演讲中。但却让我联想到了正在经历的恋情,以及之前爱情的经验,赫然发现UNIX哲学竟然可以在爱情中找到应用,而这些应用却一点也不牵强附会,让我不由得对伟大的UNIX哲学,更敬三分! 本文更多的谈论自己的理解和感悟,以期用 Hacker 的思维模式和新颖的角度看待爱情。欢迎交流哦!

何谓“UNIX哲学”?

提到“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编程艺术》。

UNIX哲学的爱情启示

一点也不牵强附会的说,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!

干净、美丽、闲适、优雅的海滨煤城Newcastle

<!–
小鱼说:

风景好吗?说说看海豚的事。

大狗说:
–>
(尚末完全写完,提前发布。)

最让人喜欢的不是风景,而是人。小鱼在店里端详礼品,退了几步,撞到一位老人。他说:“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 http://www.softwarefreedomday.org. 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 enveloped.com.au

I’m running the fledging new Australian store enveloped.com.au – 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 Enveloped.com.au is the option of making purchases using Bitcoin. Enveoped.com.au 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 enveloped.com.au, will receive 0.001 of BTC to redeem however you like.

bitcoin


巴比看娃

妈咪说巴比看娃就是边

IMG_3027

2014-08-31


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 http://mirrordirector.raspbian.org/raspbian/ 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);
        wpa_scan_results_free(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;
        }
+#endif
+       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.

IMG_20150714_134341

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 tv.sohu.com 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.)

Shadowsocks

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

/usr/local/
.

pi@raspberrypi $ sudo apt-get install python-pip
pi@raspberrypi $ sudo pip install shadowsocks
Downloading/unpacking shadowsocks
  Running setup.py egg_info for package shadowsocks
    
Installing collected packages: shadowsocks
  Running setup.py 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 127.0.0.1 -l 1080

Redsocks

Install redsocks, simply apt-get from the archive:

pi@raspberrypi $ sudo apt-get install redsocks

Then you need to change the START option in

/etc/default/redsocks
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
START=yes

Then update

/etc/redsocks.conf
. Most of the default settings work fine, just need to change
local_ip
in the
redsocks
section to your address of the network interface that accepts traffic from your local network. The default is 127.0.0.1, 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 127.0.0.1 for security reasons,
         * use 0.0.0.0 if you want to listen on every interface.
         * `local_*' are used as port to redirect to.
         */
        local_ip = 192.168.0.1;
        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

chnroute.txt
:

pi@raspberrypi $ curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | 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
SS_SERVER_IP=11.22.33.44

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 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -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

Run

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
log_debug
and check if there is anything useful in
/var/log/daemon.log
.

ChinaDNS

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 https://github.com/clowwindy/ChinaDNS.git
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 $ ./autogen.sh
pi@raspberrypi $ ls
aclocal.m4  autom4te.cache  chnroute.txt  configure     COPYING  install-sh  Makefile.am  missing  packaging  src
autogen.sh  CHANGES         config.h.in   configure.ac  depcomp  iplist.txt  Makefile.in  openwrt  README.md  tests

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

After it is successfully compiled, test it out:

pi@raspberrypi $ sudo src/chinadns
pi@raspberrypi $ host video.sina.com.cn 
video.sina.com.cn has address 58.63.237.200
pi@raspberrypi $ host www.youtube.com
www.youtube.com is an alias for youtube-ui.l.google.com.
youtube-ui.l.google.com is an alias for youtube-ui-china.l.google.com.
youtube-ui-china.l.google.com has address 46.82.174.68
youtube-ui-china.l.google.com has IPv6 address 2404:6800:4005:80b::200e
pi@raspberrypi $ sudo src/chinadns -m -c chnroute.txt
pi@raspberrypi $ host video.sina.com.cn 
video.sina.com.cn has address 123.125.22.225
pi@raspberrypi $ host www.youtube.com
www.youtube.com is an alias for youtube-ui.l.google.com.
youtube-ui.l.google.com is an alias for youtube-ui-china.l.google.com.
youtube-ui-china.l.google.com has address 74.125.203.138
youtube-ui-china.l.google.com has address 74.125.203.100
youtube-ui-china.l.google.com has address 74.125.203.113
youtube-ui-china.l.google.com has address 74.125.203.139
youtube-ui-china.l.google.com has address 74.125.203.101
youtube-ui-china.l.google.com has address 74.125.203.102
youtube-ui-china.l.google.com 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.

[转]小心!八个小细节可辨出身边的小人!

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

喜欢造谣生事:

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

喜欢挑拨离间

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

喜欢奉承

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

喜欢阳奉阴违

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

喜欢见风转舵

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

踏着别人鲜血前进,踩着别人肩头攀高

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

喜欢落井下石

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

喜欢找替死鬼

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

1.不要得罪小人

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

2.敬而远之,和他们保持距离

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

3.说话谨慎,客套寒暄即可

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

发现开源社区的扫地僧——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,最多就算是我自己阶段性的感悟。

我参与的组织,提出的idea以及指导的学生

首先为那些心急的朋友,可能会好奇我今年参与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来说不仅损失金钱,更重要的是对GSoC的品牌不利,也无法达到真正帮助开源社区贡献的目的。最重要的一点,GSoC这货不能吃,不是吃的,也别问我是不是好吃。
  • 帮助就业?

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

    正如前文所言,Google这么做的目的是让学生投入到开源项目的贡献中去,因此整个计划的核心就是开源社区,不是学生也不是Google,学生是参与者,社区里的导师是评定者,左右着学生的命运和社区自身的价值契合,而Google只是审核者。

学生参加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的时候,没能谈到这几点的我都会要求其尽快补上。
  • 与导师的有效沟通,表明学生的社区参与能力

    FOSSASIA有官方的邮件列表和IRC频道,我们所有导师都会考察学生是否会使用,并参与到这些社区常用的沟通中去,懂得基本的邮件列表礼仪,IRC聊天方法和规范,并与其他社区成员打成一片。更重要的是,在Google-melange的后台,导师可以在学生的Proposal下面发评论(学生也可以回复),而这些评论,同组织内的其他导师都可以看到,也都可以参与进来,一起来评判学生是否按照导师要求修改Proposal,参与到社区活动中去。
  • 其他开源社区的参与

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

    如果你和导师在社区活动或其他情况恰好认识,关系也比较好,那么导师会格外关注你,并会帮助你完成。这不仅仅是中国特色,全世界都如此,因为站在导师的角度来看,他肯定希望由更熟悉的学生来完成,除了可以保证项目完成,更多的是因为这种互利的关系,让社区可以更好的发展。因此从一点一滴开始关注开源,与潜在导师多多搞好关系,还是很重要的。

参加GSoC的学生需要哪些“软实力”?

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

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

    参加技术开发,活用Google是基本技能,这没的说!搜索娱乐新闻和花边爆料就随便你了。
  • 英文交流和阅读能力

    这里仅限文字交流,除非导师或组织有特别要求,加入语音或视频,否则大多数情况基本的英文文字交流能力就够了。阅读能力主要是阅读各种文档,可以通过阅读Google Melange的文档来检测一下自己的英文阅读能力。根据我的平时感觉,现在大学生的英文能力足够应付了。
还有一些品质,不仅GSoC需要,参与各种开源项目也都需要,也都是一些非常重要的“软实力”
  • 时间规划的能力

    根据GSoC对Proposal的要求,学生还要提交每周的开发计划。通过开发计划可以明白学生在这段时间要做什么工作,有什么产出。往往一句话的总结,就可以说明很多问题。这个规划时间的能力,其实也算是自我管理的一部分,不过我认为单独拆分出来更好。虽然开发计划在Proposal中的占比不过10~20%,但时间规划与项目构架息息相关,时间规划能力也反映了学生对项目的理解、处置、控制和把握的能力。一个简明扼要的项目规划,往往胜过千言万语。
  • 自主学习能力。

    这是很多中国学生的短板和弱项。何为“自主学习能力”?就是自己辅导自己学习,找到所需要的学习材料,制定符合自己特点的学习计划的能力(特意加粗!)。还举我碰上的一个中国学生的例子,他的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,尝试思考一下,假如你来做你会打算怎么做这个项目?从哪里入手?需要学习什么方面的知识?如何构建自己相关知识体系?
  • 好奇心和求知欲

    很多学生在这方面都不是问题,主要体现在Proposal上,比如是否提供了足够多的参考资料,Heena的第一版Proposal里提供了超过50条参考资料和技术文档(后来删减到20多条),足见她的学习能力。
  • 沟通能力

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

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

与GSoC相似的计划

说这么多,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打头的英文单词放在一起,最终是这样的:

Purpose(目标)

一个社区无疑必须要有一个清晰且简明的目标,能够用一句话直接说明。这里仅以开源社区为例,摘录了一些著名社区的例子:
  • 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创意流水线)
上面这些例子都是国外的,国内有没有呢?当然也有,有些开源产品或开源社区的目标还是很清晰,但在表述上就比较罗嗦,无法直达人心。为什么要有清晰的目标?目的是用这些目标指导社区活动,也是为了找出愿意贡献其中的人。

People(人)

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

Practice(实践)

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

Personality(个性自主)

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

Progress(进取)

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

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

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

养Zoë是一场战斗

这几日跟Zoë一起。Zoë过了一岁生日之后会扶墙走了,现在养Zoë于是更困难,相当于养3个韡武。这里是具体说一下今早的事,每个早上都像这样。

早上一起来,Zoë去看电视。但是遥控器不好用,Zoë就去修电视。修了一回儿,电视死机了。Zoë找爸爸,爸爸正手里拿个杯子。Zoë一手指遥控器,一手指电视,意思是让爸爸修。爸爸折腾遥控器的功夫,Zoë发现爸爸把杯子放到茶几上了。Zoë拿着玩,就落在地上了。家中的玻璃杯当然早就碎完了,这是个铁杯,里面水洒了一些。爸爸和奶奶看了都不管,每件事都管肯定会累死的。爸爸重启电视机(它下面的DVD机和边上的笔记本电脑早就被Zoë玩坏了),Zoë这时候发现杯子可以当球踢,从这里踢到那里,连着地上其它东西,茶叶罐子什么的,都成她的球了。踢着踢Zoë发现地上有一个别针,还是已经打开的,原来是爸爸为了重置手机(被Zoë玩坏的)用的工具,用完之后就被Zoë连着其它东西都打翻在地上了。Zoë不认识针,不知道会被扎,不过知道拿起来总是对的,于是拿起来交给奶奶。奶奶庆幸Zoë没有把它吃掉。

过一回电视开始唱了,Zoë看电视安静了一小会儿,奶奶正抓紧了时间休息,不想借这个机会她已经拉屎拉了一地。裤子得换自不必说,地毯则只能凑合擦,这样我们家成了唯一一个大肠干菌集中在客厅的家庭。这正在换裤子的当儿,Zoë又踩到屎上了,然后还坐下。这下子所有东西都得洗了。

Zoë可以扶着东西走。对她而言就跟玩电子游戏似的,想去什么地方得计算从哪里扶着,然后跳到另外一个可以扶的东西上。先扶沙发,再转身扶茶几,再转身扶墙,再顺着墙和电视柜这就到另一个房间了。所以她可以自己去所有地方。但是她不专一,每次要去哪里,路上遇到好玩的就不去了。比如:

Zoë遇到纸巾,就一张一张取出来,一边取一边大声叫,好像是Tristan在杀龙。然后抱着一团卫生纸倒在地上口吐泡泡,好像Tristan被龙毒倒了。又遇到盒子,那就打开,里面东西全拿出来,觉得好的拿给奶奶,其它的散在地上不要了。又遇到一个耳机,上面有麦克风。对着麦克风喊了一通,没用,也许是吃的,于是把麦克风吃了,又吐出来。顺带吐一堆各种方才吃的东西。又遇到一袋饼干,因为刚才吃麦克风饱了,所以不吃,拿出来分给奶奶。奶奶不吃就哭。奶奶吃一片,再拿一片给爸爸。爸爸不吃一样要哭。然后再拿一片。这半个小时就分饼分过去了。最后一片,先给奶奶,奶奶刚要吃,Zoë又改变主意了,收回来拿给爸爸。

这只是一个片段。最近孩子闹肚子,随时拉稀,家里东西被污染扔了一大批。虽然应该是孩子难受,孩子却一点难受的样子都没有,仍然精力充沛闹个没完。奶奶常常觉得她要受不了了。我觉得如果不是奶奶和爷爷这样有耐心,如果是我俩,我俩肯定会沉思生命的意义了,为什么要我们受这样多苦之类。任何项目自然都是做不成的,更别说读书喝茶了。


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 :)

And...Organization?

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...

Future...

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...

回国第二日:郑州

回国后容易感受到压力和冷漠。比如电梯门开了,我弯腰把箱子抬起来,身子一直,所有人已经从我后面飞进去,电梯也满员了。第二次把箱子踢进去得以进入。

这些是意料之中,本不想写。又比如下了飞机坐火车,上车下车乘务员都没话。

上车没话。我当然没指望对方会说“您好”,我是问能不能从另外一头上车,我的铺最远,有两个带回国装满礼品的大行李我得从一头拉到另一头。乘务员不理我,不说可以,不说不可以,不停手,检后面的人的票。我们俩的对话仅限于我在说,对方没有在听。我可以自做决定从另一头强行上,但是知道如果这边没说可以,那边会打回来让我问这边。为什么知道?因为那就是我上次出国时坐车的经历。只好先上车,从车里拖过去。乘客看到两个行李大都让路了,也有不让的。没有抹黑中国人的意思,好坏都写,比如,放大件时有乘客主动指出哪张床下面有空间。这一点善意也是意料之中。

下车没话,是指要我换票,我在一床被子里找,说找到给您拿过去行吗?乘务员也不说话,不说可以,不说不可以,继续换其它人票。我几分钟后找到了票,找到她换票,都没对我说过一句话,也没看过我一眼。我下飞机到上火车,中间还需要坐一段公交,问公交司机坐这车方向对不对,司机沉默不语,不说对,也不说不对。我感觉到他似乎微微抬了一下眉,又不想继续做表情,也不愿再说。我灵机一动,问投币多少钱。司机说2元。我想,如果明知方向不对,却仍然说2元,就不是缺少善意,而是恶意了。按我的中国常识,人的冷漠因为缺少善意而非因为有恶意。司机不至于有恶意。回答2元就是肯定了方向正确,不然他会再不理我或者指头向外叫我出去。事实证明我是对的。

这都是意料之中,我注意这些细节仅仅是因为在国外不是如此。这次回国更换环境会显出来这区别。我完全没有不满和抱怨祖国和同胞的意思,正常的人不可能生活了三十年仍然抱怨自己的环境。我仅仅是注意到了。读者来信指出也许我在国外是外国人,受更好对待,评价中国应该按外国人在中国所受礼遇比较。我回复说悉尼和墨尔本市区华人占比15%,不是明显的外国人,另外撰文只是日记体裁,不是意在评价中国,不然一人所遇有限,不足评价。

但是今天的事却值得写下来。

从火车站转车,下了火车已经晚点,发现下次列车仅有十几分钟就要开出了。我有点慌,因为来不及先出站再入站了。我不知道下面要转的车在几站台,问列车员,一句话“不知道”。站台上这就没人可以再问了。我又问“您不知道我应该问谁”?答案一样:“不知道”。只好跟着人流到地下出站通道。出站通道是给人出站的,直通7个站台,信息提示很少,总不能每个都上去看看。我在里面团团转,找到一个穿铁路蓝制服的。我说,“没时间出站了,请问xxx次列车在几站台?”对方说不知道。我想也许具体车次谁都记不住,不如换个办法问。这里动车和普通列车都在同一个火车站,可能有些站台是专门为动车的,我应该问动车站台在哪里。又找到一个蓝制服,问“动车站台在哪?真是没时间出站再进了,不好意思”,我说。人家不语,用最小动作指了个方向(事后发现是相反方向)。我感激不尽,照所指方向去走了一段,发现是出站口,想必她是让我出站再进来,但是没兴致说清楚这个意思。每个出站检票员工面前都有几十个人,问她们肯定没人睬。有一位蓝制服身边人少,是向一位妈妈要小孩超高的补票费的,我借机去问,蓝制服说“不管这个”,然后继续跟妈妈吵。补票室的人看起来没事,我问了他,也是一句,“出站再进来”。我说怕误车,车要开走了,回答说“那个我管不着”。

真要先出站再入也不容易。出站的队卡在那里,因为一个老农满脸通红在跟检票员争执。检票的人要他补行李票,行李超重。他身材小,带一个扁担,前后各一个大包裹。他不肯补票,因为铁路从未真执行过这项起重规定,他觉得这是检票的针对他,欺负他。既然反正误车,我就不急了,在那里看这出戏,心里为他叹息了一段时间。我早上看上周的经济观察报,上面提到过一位铁路员工,在哀求之下,放行了一个送行的丈夫——他妻子带着孩子和行李。之后被铁路便衣记录下来,这位员工被停职三个月。我为老农心里叹息,是因为他面对的不是恶意,而是一套体制,一个机器。即使蓝制服想免去他的行李票,这体制也会惩罚她的善意。老农在为生活奋斗,但是阻挡他的蓝制服何尝不是?这里行李票也不是为了铁路营收——这点行李票钱,连便衣的便衣都不够——而是为了使老农们不带太多行李,便于管理海量旅客。这就是说,老农的愤怒是设计的一部分,这次刺激他一下,下次他就不带扁担了。他越回去愤怒地说这件事,越多的人不敢过线,铁路也就能更容易完成管理旅客的任务。你可以用情,用理,愤怒,哀求,总之面对体制单薄的个人抗争是可笑的。

为什么这一天的事我记下来?因为我在人山人海之中误车这事,我感觉到自己是一滴水在海洋中,既没有人关心我,我也影响不了谁。这个世界紧密联系着,却和我都没有关系。没有人关心我会不会误车,也没有人指望我关心他们。这种孤独无助的感觉是回国以来对我冲击最大的一次。

我不能指责铁路员工。我认为她们从事的是最困难的工作。她们全是女性。我记得有一个年龄和我妈妈接近的蓝制服,她小小的身子淹没在几十人围住的圈圈当中,声嘶力竭阻止一个客人进门,她的坚定和客人的坚定算是硬碰硬。好不容易解决了,另一个客人也是这样硬碰硬。得要怎样铁一样的意志,才能每天轮着跟人硬碰硬?须知旅客只需要硬一次,她却每次都得坚持到底。这份工作还需要她放弃女性关心照顾的天性,而是要拒人千里——也许只能选择天性拒人千里的女性,也许为了生存的奋斗她必须形成这种性格?也许试过男职工,结果经常引起打架,只好全换成女职工?如果是在澳洲有这样的岗位需要每天跟人吵几百次,员工不换岗位应该会去自杀吧。和她一样,所有拒绝我的铁路员工,肯定也是压力很大。也许她们每次想帮助旅客,都会使旅客提出更多要求或者无法完成任务被罚。也许旅客也没有善意,一有机会就逃票,在高铁厕所吸烟,动不动威胁投诉?这种令人绝望悲哀的生存状态是非如此不可吗?


[转载] 窗外有自由——給自己一個正確認識 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 檔的時候, 又將如何追得上更新的流行呢? 盲目追隨流行的表象, 而不去深究每一波流行的原因及它所帶來的問題, 恐怕是最能夠傷害企業永續經營的利刃之一。 蛋塔熱現象值得我們資訊人警惕。

自由的代價

讀者可以在 lwn.net、 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]: http://www.examcram.com/studyresource/openforum/old_issues.asp?num=0 也請到 http://slashdot.org/article.pl?sid=00/03/15/0747210 找到被歸類為 "Score:5" 的讀者投書。 [15]: 本頁最新版網址: http://user.frdm.info/ckhung/a/c000.php; 您所看到的版本: February 13 2012 19:32:24. [16]: 作者: 朝陽科技大學 資訊管理系 洪朝貴

回国第一日:深圳

多少习惯了客居生活,回到国内,凡是觉得不适应的地方,都是过去没想到会注意的地方。这第一篇记的是我回国后到深圳的感受。飞龙同学叫我写的。他问得细,我答得多,他说应该写下来。“细碎的东西太多,娘娘腔,写起来没意思。”我说。不过飞龙一定要我做个试验。

关于空气和拥挤这些常见感受就不说了,说点别人没说过的。

大中华物资丰富

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

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

虽然物资更丰富,但并非“啥都有”。客居习惯了喝澳洲当地的Ale,到了中国才意识到没有。超市确实进口了很多洋啤酒,都不是Ale,可能不合中国人口味?啤酒有两大类,一曰Larger,比较常见,中国市面上的都算这一类,包括市上的生啤和扎啤;一曰Ale,英国的比较出名,澳洲啤酒传承它,亦多是此类。说完啤酒说葡萄酒。中国市场上红酒虽然丰富,却几乎没有白葡萄酒,这也是件怪事。澳洲红白葡萄酒都很受欢迎。

另外一样缺少的是咖啡球和咖啡粉。澳洲超市各种espresso咖啡球,中国一种都没有。要说中国人不喜欢咖啡,为什么街上那么多咖啡店?考虑espresso咖啡球主要供应家庭和办公场合,不供应咖啡店,这就说明一个有趣的事实:中国人只在咖啡店里喝新鲜咖啡。我早先就疑心是这样,现在有了超市产品目录,可以坐实了。这是奇怪的事,如果你喜欢咖啡店里的咖啡,不应该在家做吗?如果不喜欢,不应该在咖啡店点茶吗?为什么会到了咖啡店就喜欢回了家就不喜欢?深圳一杯咖啡30元(澳洲大约15元到20元人民币),在深圳喝10杯咖啡馆咖啡的钱就可以买一个澳洲的espresso咖啡球机器(估计是中国生产的)。咖啡馆这样贵,深圳人民应该更有动机买espresso咖啡球,而超市没卖espresso咖啡球的。这事得国外生活过回国后才看得出奇怪。

编辑修改:飞龙问起来各种咖啡的区别,我增加一句科谱一下:咖啡店各种咖啡都是用espresso做的。做出来就喝的是意式咖啡,加水的是美式咖啡,加奶的是拿铁,加巧克力的是摩卡,加奶油的是卡布其诺。这不是中国人喜欢花哨,外文原文就是这样花哨。另外我上面讨论关注咖啡球而非咖啡粉,是因为球用起来跟速溶咖啡一样快,不需要技术,观察它的销售可以排除客人嫌麻烦的可能。

虽然酒类和咖啡失了些分,中国在其它物资上把分都拿回来了。给飞龙的原信里我提了些例子,如今觉得读者不会有兴趣看购物清单,在此省去了。

我又观察到市场上各种服务的价格都更贵了,从茶点到pizza(茶点跟澳洲同价,pizza比澳洲贵)都更贵了一些。如果人民负担各种服务的能力没有变差——我想是没有变化的,因为客人很多——那么说明中国人收入水平近年来又上涨了。考虑近年来工资上涨的同时人民币在升值,这说明大家和发达国家收入水平更近了,这里给祝贺一下。

深圳Pizza比澳洲更贵,是有文化因素的,澳洲当地人觉得Pizza是快餐,包括必胜客也属于快餐。这一点连pizaa的祖国意大利来的移民都赞同,说他们觉得在家做Pizza方便,便宜又好吃。刚出国的留学生们,还没找到兼职工作的,贫穷的日子可以用pizza对付过去。在深圳,文化上认为pizza是好东西。要说到正餐,还是深圳便宜。两个人三个菜,加上啤酒,100元人民币,在澳洲估计要相当于两三百元人民币。这里“便宜”说的是实价,不是消费收入比。

中国人素质逐渐提高

有一个地平线效应,讲的是人们对地平线上的逐渐变化没有感觉。有人为村子拍了照片,绿林白水。过了几年,绿林和水都少了好多。问村你的人,你们村的环境有变化吗?大家都说没有。给大家看看过去的照片,大家都吓了一跳,原来过去这样美的。这是说,人对逐渐的变化没有感觉。

在国外生活一段时间回国,就有机会看到这种逐渐的变化,当地人却不一定能感受到。中国居民素质的提高就是不容易观察到的。我来列举我的观察:

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

谈到交通,我想多说几句。

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

但是这事不是重点。重点是下面发生的事:我惊魂末定,不敢动。这时候,他应该把车在我面前开走,顺带说“你瞎了眼了!”。没想到他停在那里不走,直到我捡回我的小魂儿,慢慢走过了人行道,他才开走。这使我明白了一点,很重要:虽然司机素质还不够高,没有直接把我碾死,但是他确实觉得人行道应该让行人先通过的。读者可能以为我在取笑中国人了,其实不是,这确实是素质的提高。素质提高,首先要认识到这样做是错的,然后才能行动上慢慢改正。比如醉驾。首先要知道醉驾是错的,才有机会改,我离开中国那时候,司机们都还在谈怕醉驾被抓到,而不觉得有错。这次司机的做法已经说明,他虽然做不到安全避让,心里是知道“应该”避让的。这已经是上了一个台阶了。这样下去,不出十年,礼让行人就可以实现。

中国人钱包逐渐鼓起来

前面说到中国的服务业收费提高了。我顺手查询了一下收入水平,搜索结果第一位的是职友集网站上的信息,深圳平均工资在5650元多。当地报纸报道说随着祖国发展,生活在第一世界的华人,头上的光环已经不再。我想这是真的吧。因为中国人一方面工资上涨,一面人民币增值。12年深圳平均工资3821元(也来自职友集网),当时一澳刀对6.5元。澳洲当时平均月工资近5000刀。澳洲人民收入是深圳人的8.5倍。现在一澳刀对4.5元人民币,澳洲月平均工资过5000刀一点。澳洲人民收入是深圳人的4倍。这2年时间深圳和澳洲收入倍数8.5倍变4倍。如果澳洲居民头上过去有光环,现在至多只能算富一些而已。人民币保持强势已经是趋势了,进入IMF储备也快了。这样的发展势头,再过几年,也许深圳人的平均工资就已经超过了澳洲。

我自己是IT行业的,注意到了深圳社保局资料写着信息行业(IT业)工资指导价2014年高位数是36,735元每月。这个工资水平在澳洲比程序员的平均税前工资还高一点。就是说在有些行业(IT),中国高级员工工资水平已经是发达国家中级员工的收入水平了。澳洲IT行业最好的是Goolge了,Google给程序员首年支付大约每月4.5万人民币的薪水(薪水之外带很多福利)。我相信,按社保局统计深圳应该有些民营IT企业已经在支持这个澳洲最高水平的工资了。也许在澳洲廉价软件开发任务多包印度人是这个原因?当然这样比较有不公平的地方,澳洲程序员照例不加班,大约每周工作4天半,经常去BBQ。不看压力只看收入的话,中国确实富有了。但是我刚离开深圳那天,报纸上说深圳IT程序员张斌的死,人们说是过劳致死。十年前,报纸报道过不少深圳IT员工压力太大自杀,如今不自杀了,不知道是更好还是不好。

“国外连个喝个酒的人都没有”

这次回来跟人在深圳聊天。他说,回中国发展的朋友们都说,国外连个喝个酒的人都没有。这绝对不是真的,好像“鬼佬”不喝酒似的。这只是那个人自己找不到人喝酒而已。布村盛产酒鬼,加上有福利不容易穷死,酒鬼喝成刘伶的也大有人在,都成社会公害了。周末跟朋友们一起在公园里一边BBQ一边喝酒,这是我的海外生活的高点,喝着喝着朋友从家里拖出几条独木船,几个人一左一右摇摇晃晃在近岸的水上划船“散步”,水中树林丰茂,跟林间散步一样。虽然名义上公共场所禁酒,其实举止没失节的人警察是不会找麻烦的。虽然每年都得花纳税人的钱从海里救出我们这种人,但是我们在中国不也是总给政府添麻烦吗?政府还有时候不关心我们死活呢。“国外找人喝酒都没有”这说不过去呀,就算你不愿意找鬼佬喝,悉尼和墨尔本市区华人占比15%呢。我觉得还是成年之后客居不容易交朋友,华人之间有比拼文化也不容易交到至友,老想跟发小喝酒,才会有找不到人喝酒这种感慨。少年出国的华人就没有这种抱怨了。另外,华人有面具,酒后真言,可以起到释放效果,所以有喝酒的人是件大事。如果不必酒就可以直言,也就不必喝醉了,亦不必找酒友。

常见的“外国好还是中国好?”讨论,现在懂了

人到底是感情决定认识,还是认识决定感情?在国外和国内都待过一段时间,我有了一些特殊的证据:人的认识是感情决定的,而人基本是感情动物。

这个证据就是“中国好还是外国好”的讨论。在布村有时候我会遇到中国人说,还是出来吧。有一个人说,我的朋友们很多都出来了。

到了深圳,聚会时大家很容易谈到这个话题。大家都说,还是回来吧。有一个人说,我的朋友们出了国的都回来了。

我现在懂得,已经出去的人不想证明自己出去的决定不对,要寻找证据。国内朋友处境一样,要么出不去,要么有酸的感觉,也寻找证据证明待在国内好。尤其是外语没准备好的朋友,更是理由多,但是说出来众多理由中肯定没有外语不好这一条。

刚出国的时候,看不出这一点,觉得大家都是理性讨论。出国再回来,就明显能看出,大家用情多,理性讨论少。

如果暂时不谈文化上的不适应,在哪里生活好是显然的。发达国家社会总体达到了相当高的水平,虽然有欧洲经济危机地区的情况,总体仍然是发达国家生活更好。前往外国生活的中国人比前往中国寻找发展机遇的外国人多很多。在国外华人圈里,经常遇到的话题不是什么时候回国发展,而是如何获得签证长期待下去。这些华人回到中国就不再谈他们努力而得不到外国长期签证的痛苦了,转言回国好。这是因为,他们一旦谈求签证不得,中国同胞们就会劝他回国发展,他要是说不想,还是想在国外,那就得不到同情,不旦没拿到签证,还把周围人都得罪完了。最好说自己选择祖国机遇多,还可以多保持些中国当地朋友。这种聪明的办法也可以反着用。有的人到了澳洲对当地人说他们选择自由的国度,其实他根本不在乎自由,只是喜欢生活水平高的国家,到了不自由的新加坡他一样会很开心的。至于中国是不是机遇更多?别的我不熟悉,就因特网领域是真的,在中国发展又快用户又多,外国企业又进不来,青年正好施展。但是大部分新移民人追求三点:少干活、多收入、有福利,简单说是“少给多要”。这三个关键点发达国家都仍然比中国好。真追求自由和尊严而去西方国家的,和真追求乱世称雄(或乱世救人)去中国的,都是极少数,两种我都仅见过一位。事先并不知道人有尊严,唾面自干习惯了,到了国外生活几年被“洗脑”,开始认为尊严很重要的,我没有算在里面,因为这算老移民了。这一段只讲新移民。

大量中国留学生返华,主要是两类,一是文化不适应交不到朋友没归属感,二是拿不到居住签证。留学生理应返华的,移民政策就是如此。澳洲出口大学教育服务不等于给移民名额,留学生返回祖国是题中应有之意,发达国家留学生一样应该回祖国,我在couchsurfing活动上就遇上不少为了拿到澳洲签证到乡下打工的英国人、欧洲人(不乏软件工程师、化工工程师这样背景的),说明合法留在澳洲这里不容易,不能拿大家回祖国这件事证明中国条件好。不管是交不到朋友还是得不到签证,都是“只好回国”,这跟“选择”了回国不一样。

飞龙又建议我文章翻译成英文。读者不一样写法也就不同,直译无意义,我就没再努力。英文我也确实写了,内容不同,但是我对英文稿子比较认真,怕乱发读者有误会,所以现在还停在英文编辑手里等他改完再说。


姥姥今天走了。。。

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

弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天

国内的互联网服务越来越流氓,现在微信已经需要实名验证才能加入群聊。早在微信刚出来的时候,就非常流氓的会要求导入手机通讯录。同样的超级流氓,还包括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协议的实现。

XMPP的功能和优点

除了常用的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来帮助大家实现多人聊天。想要群聊需要先建立一个房间,比如room@conference.jabber.ru,然后其他人加入到这房间里即可多人聊天了。多人聊天是个可选服务,很多服务器提供商提供了,有些则没有提供。因此缺点就是群聊不是很方便,在现在很多聊天软件已经可以非常轻易加人构成群聊的情况下,这种方式多少还有点低端,与传统的QQ群聊很类似。

申请XMPP(Jabber)帐号

因为Jabber/XMPP是可以跨服务器的(也可以在服务器端禁用这个功能),这样只要有一个帐号就行就可以与所有人公开的人通信。这里推荐使用[https://xmpp.net/directory.php](点表头就可以排序)网站列出来的公共服务器列表。右侧两栏是安全评级,分别是客户端-服务器端(C2S)安全评级,以及服务器与服务器(S2S)之间的安全评级。A级为最高,F为最差。 我花了一些时间遴选,既考虑到安全性(必须是A评级),又考虑其提供较多的服务和低ping值。最后可选的服务器如下:
  • xmpp.jp:服务器已经迁移到AWS东京机房了。主要优势是安全性非常好,速度也挺快。因此综合考量是最佳选择。
  • dukgo.com:著名的非追踪搜索引擎 DuckDuckGo 旗下的 XMPP 服务。安全性和速度都不错。如果不在亚洲地区,这个服务器是最好的。
  • swissjabber.org: 苏黎世的服务器,老牌Jabber提供商。速度略慢,安全性也还不错。值得作为后备帐号使用。综合能力不输给其他的。
  • jabber.otr.im:这个服务器强制要求 OTR 加密,提供了较强的安全性,同时速度也不慢。追求极佳安全性的时候可以考虑。
  • wtfismyip.com:服务器在美国,AWS的云主机,ping值稳定在300多ms。其优势是安全性极佳。速度也不慢,同时还支持Tor和暗网。因为是AWS云主机,我认为稳定持久可能会不能保证,带宽可能比较少。追求极佳安全性的时候可以考虑。
选好服务器以后,如何注册呢?因为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,享受聊天

这个过程与其他IM软件几乎没有什么区别了,只是因为客户端不同而造成的操作区别而已,只是注意,如果添加好友,每个人的识别方式,不再是一个号码(类似ICQ或者QQ),或者一个字符串(微信号),这里变成了形如
username@domain.name
这样的形式有很大的好处,不用费劲去记忆大量无意义的号码了,更可以不用担心微信号冲突的问题。不过这也带来很大的缺点,就是有可能冒用身份。某人冒用了他人的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服务器,tonghuix.asia。有兴趣的朋友可以来测试。注意,服务器在墙内且未备案,虽然执行加密,仅可做普通连接和测试使用,不得作为可能涉密的使用。服务器的测试结果:客户端-服务器服务器之间

特别提醒!

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

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,并且在政府机关大力使用开源软件的印度尼西亚,还有最近几年开源社区飞速发展的马来西亚和泰国。之所以没有写在本文中,主要是因为接触的朋友太少,了解也少,写不出什么东西。 亚洲国家大多是后发现代性国家,而且几乎都有过被西方列强殖民的历史。这些国家如何接受开源这个新生事物,如何将开源与本地文化结合,并发展出本地社区的这个过程,以及他们在社区运营和治理方面的经验和教训,还是非常值得学习和借鉴的。

过去,现在和将来

我们在时代发展的哪一个环节?如今是2015年,我家Zoë到3岁时、5岁时,世界应该是什么样子?

回顾一下近5年令我惊讶的科技界事件,每个惊讶都指出了某一方面我缺少洞见和实践知识。

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

观察IT发展的趋势,过去几十年,电脑和手机主要是一种工具,需要人脑学习它。工具做得很不错,但是不错是指用户容易学习容易使用。比如,字处理软件能修正拼写错误,如果用户想标记一段重点,也很容易做到。但是字处理软件自己并不标记重点。又比如,LinkedIn能帮助用户制做简历,但是它并不为用户制做简历。它对求职者能力的评估来自其它用户,由其它用户来定。也就是说,我们的软件在做出决定这一点上十分笨拙。

如果字处理软件能提供编辑建议,并且常常是好建议,用户应该是会喜欢用的。具个例子,如果你写了这样一句:“间谍按之前所指示的等候在月台上。”如果电脑建议你改为:“间谍奉命在月台等候”你一定得是一个自大狂才会拒绝这种建议,因为这种编辑更多反映了文字功底,而非风格。我的编辑帮我改文章时候,九成的修改都反映了文字功底,没办法拒绝。

所以现在我们没有看到这样的功能,仍然是因为字处理软件还是不能提供足够好的建议。微软早些年制做clipper(小别针机器人)的时候,就认为机器辅功人编辑的时代到了,其实那时候人工智能技术很有限,建议做得很差,在用户盛怒之下这个功能取消了,之后微软也变得很保守。

为什么我们一直认为会成功的机器人技术没有进展?为什么没有机器人去擦建筑物外面玻璃?这里有两个原因,一是机械技术滞后信息技术,二是人工智能还差得很。机器人必须做出很多决定,我们仍然不能信任机器做出的决定,即使是如何绕开一个建筑物上的坑也不能信任。因为我自己做软件,我倾向于认为主要是原因二,即机器人仍然只是工具,不能做出好决定。但是如果原因二是主因,我们应该能看到很多机器傀儡,比如机器傀儡去擦建筑物外面玻璃,机器把实时视频传送出来,由坐在家中控制的人来操作。在人工昂贵的国家比如澳洲尤其应该出现这种技术。这种技术既然没有出现,说明“没有人工智能”还不是主因,机械技术滞后,没有办法廉价制造复杂机器,应该是同等重要的原因。目前即使在支付力高的发达国家,家中也没有比洗碗机更为复杂的机械结构。这很说明问题。

最近5年我看到一个有趣的变化。最重要的变化来自Google搜索结果。人们对渐变不敏感,所以不一定注意到:现在Google比之前更理解用户的意图。我不知道这是因为大数据还是人工智能(或者两者是一回事),但是结果是一样的,即Google更聪明了。我所说的有趣的变化,是机器或信息系统越来聪明。最近纽约时报报道说明我们读到的报道有很多是机器自动生成的,但是我们没有觉查到。我在澳洲本地开车时电台常收到连续数小时无语气变化的高速体育比赛报道,这可能也是机器生成的,只是我没时间追究。

这就是说,我们可能正在接近简单的人工智能。

再回到一开始的问题:我们在时代发展的哪一个环节?如今是2015年,我家Zoë到3岁时、5岁时,世界应该是什么样子?

我们先考虑我们是不是正在接近简单的人工智能。未来3、5年这方面会不会有长足发展。

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

如果有简单人工智能的高速发展,机器人不撞墙变成了基本功能,但是机械技术无法降低成本大量普及,那么我们会见到一两种标准化的机器人获得长足发展,机器人的标准化过程将开始。未来5年会有几种机器人操作系统产生,Android可能又是其中之一。当然不是我们熟悉的Android。这个品牌价值高,Google比较可能再次领先入场,又不愿意花时间建立新品牌。这些标准机器人会有一两种四旋翼直升机,几种小型陆用机器人。他们会面向操作简单但是需要判断力的领域,比如割草。这也是家俱和建筑设计更新换代的时候,新的家俱和建筑被设计成便于简单机器人工作的样子。大数据/人工智能当然在机器人之外的领域也会发展,比如会自动标记重点的电子书和智能的电子游戏,但是另文讨论吧。

如果机械技术同时变得可靠廉价又普及,那么我们会看到复杂操作的机器人,比如建筑物擦窗机器人。这是因为擦窗的动作比割草复杂得多,需要更多的液压管和机械臂。

如果人工智能没有高速发展,但是机械技术同时变得可靠廉价又普及,我们会见到很多机器傀儡,同时中国和印度的廉价劳动力将会坐在家里控制富有国家的机器傀儡。我们会看到一两个使用机器傀儡完成的凶杀案,其操作连接使用加密,所以找不到真凶,或者找到了真凶并出现一个新福尔摩斯名探,总之,使得上了年纪的人,比如80后们,大大惊讶一通,觉得自己都不熟悉自己所生活的世界了。

这是对未来的思考的第一篇文章,欢迎批评。

要是读到这里,祝贺你,这也能读下去。下面的会更无聊:我检讨一下过去5年考量,越检讨越不易再错。我过去的观点是:

拼车软件将广为流行,冲击出租车行业,并引起中国政府严厉监管。
这个预计的基础是手机定位和地图功能的完善,尤其是基于google map api的软件,以及类似于淘宝这样网上评分系统的广泛使用。考虑严厉监管会有效果,实际使用中有现金交易的拼车服务不容易做,适合先做免费社区服务。前述预计错了。错在一是高估了政府的管理力,二是低估了收费交易的力量,可以产生大量业余全职或近于全职的司机,而这才是变革的中坚力量。另外,没有预见到政府会打击Google Map API。
智能手机广泛发展,企业对智能手机使用水涨船高,软件业将努力争取企业级用户,微软有机会再发力一次
实际上企业对手机的应用是从最小的单位即个体户和微型企业开始的。从澳洲这边观察,目前报纸上报道的企业创新软件是微小的工作流程改进,解决具体而微的问题,比如供房屋评估人士使用的应用,无非是纸张评估清单的手机版,但是受到很多好评。想像中的微软掌上Office跟Google Docs大战并没有发生。这跟微机上是不同的,微机(就是PC和Mac)上传统故事是通用杀手级应用程序大战,小的应用跟进。这可能是因为Google比较有远见,将对手抛得太远;也可能是因为手机应用是场景用例,不像微机可以一个应用软件解决一万个问题(比如Microsoft Excel),而是一万个问题需要分析一万种使用场景,解决一万个用例,所以需要一千多个应用软件对应,万用办公套件不流行。这给小应用开发又带来了机会。
电子游戏更加真实,增加很多虚拟现实游戏与Second Life竞争。虚拟生活如此实际,以至很多人不再提Second Life,而是直接提到里面的事物
这件事不但完全没有发生,而且意想不到的事发生了。一是虚拟游戏式微,Second Life一年比一年没人理。二是小制做、每关只有几秒的游戏崛起。三是独立制做出现了一些艺术性特别强的作品,比如80 Days。为什么错判断?应该是因为既不理解游戏行业的运作方式,又对玩家不够理解。玩家基础扩大,总体需求就变了。
负载均衡的新技术发展
实际发生的事是书店Amazon成为最成熟的云资源服务商。记者喜欢说Amazon发现自己有过剩计算资源,所以卖出去。懂行的人知道计算资源不是煤炭资源,并不是说卖就能卖的。必须有长远打算,持续改进,才有希望卖得出去,不然ebay也有剩余资源为什么不卖。之前有多种负载均衡技术,灵活部署技术,比如刀片服务器,比如Solaris系统的Zones。但是这事没有了下文,现在大家关注的不是一种技术,而是一个云资源服务商。过去大家学习vmstat、pstree这些命令的用法,现在学习一套新的Amazon术语,这些术语不再涉及“系统如何工作”,而是关于“用户如何使用系统”。
机器人技术在各方面发展应用,超出制造业和科研这样的典型应用场景
实际上没有发生。即使是扫地这样简单的工作,机器人做的也很少,这一点中外一致。典型应该使用机器人的领域,比如摩天大厦外部保洁这样危险的工作,以及花坪剪草这样费时简单的事,都没有使用机器人,原因是机器人的效果尚差很多。安保巡逻也没有使用四旋翼和履带小车机器人。
HTML的发展会使得app变得不再重要,正如10年前html发展取代了大量桌面软件,如gmail取代电子邮件软件
实际上app因为懂得应用场景,近5年发展很快,创新想法很多,很流行。网站手机版的重要性似远不及手机应用。有些网站似无必要亦无优势发展应用(LinkedIn等等),仍然在努力推动其应用。

解決 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 能幫個大忙:https://neverpanic.de/blog/2014/03/19/downloading-google-web-fonts-for-local-hosting/,它能幫你把需要的字體下載下來並產生一個立馬能用的 CSS 文檔。

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

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

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

解決問題的具體步驟如下:

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

    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 會用到的字體在
    themes/twentyfourteen/functions.php
    的 215 行有提到:

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

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

    families+=('Lato:300')
    families+=('Lato:400')
    families+=('Lato:700')
    families+=('Lato:900')
    families+=('Lato:300italic')
    families+=('Lato:400italic')
    families+=('Lato:700italic')

  4. 執行該 script:

    $ bash ./downloadgooglefont.sh
    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:

    Lato_300italic.svg
    Lato_300italic.ttf
    Lato_300italic.woff
    Lato_300.svg
    Lato_300.woff
    Lato_400italic.svg
    Lato_400italic.ttf
    Lato_400italic.woff
    Lato_400.svg
    Lato_400.ttf
    Lato_400.woff
    Lato_700italic.svg
    Lato_700italic.ttf
    Lato_700italic.woff
    Lato_700.svg
    Lato_700.ttf
    Lato_700.woff
    Lato_900.svg
    Lato_900.ttf
    Lato_900.woff
    LNM3t2QINm
    Open_Sans_300italic.svg
    Open_Sans_300italic.ttf
    Open_Sans_300italic.woff
    Open_Sans_300.svg
    Open_Sans_300.ttf
    Open_Sans_300.woff
    Open_Sans_400italic.svg
    Open_Sans_400italic.ttf
    Open_Sans_400italic.woff
    Open_Sans_400.svg
    Open_Sans_400.ttf
    Open_Sans_400.woff
    Open_Sans_600italic.svg
    Open_Sans_600italic.ttf
    Open_Sans_600italic.woff
    Open_Sans_600.svg
    Open_Sans_600.ttf
    Open_Sans_600.woff
    font.css

  5. 把上面所有的字體上傳到 wordpress server 的
    wp-content/themes/twentyfourteen-child/
    目錄。
  6. 把 font.css 複製到 wp-content/themes/twentyfourteen-chile/style.css。
  7. 由於 twentyfourteen 在
    functions.php
    通過
    wp_enqueue_style
    加上
    fonts.googleapis.com
    的 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 才會成功。

    theme_enqueue_styles
    的前兩行是用來禁止 Open Sans 字體從 google server 加載,第3行才是禁止 Lato。
    _twentyfourteen-child/functions.php
    :

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: http://en.m.wikipedia.org/wiki/List_of_neo-noir_titles 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.

关于鱼

鱼是网站设计师,她有多年网站设计,建设及维护经验。早期她也曾在书画廊工作过多年,这些经历都和艺术相关。她也爱好开源软件(如GNOME),开源知识领域(如AdaCamp),曾参与GNOME的视觉设计等设计项目。

生活中,鱼喜欢大自然及善于发现大自然赐予的一切美,她也喜欢绘画作品,音乐,舞蹈(flamenco),旅游,或和朋友们一起谈天泡茶。

IMG_4125

IMG_4811

各种布艺


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 GNOME.asia 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!

efd-banner

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

Writable NTFS on Yosemite

Remove osxfuse if installed via homebrew:
brew uninstall osxfuse


Install osxfuse binary and choose to install the MacFUSE compatibility layer

Reboot (optional but recommended by osxfuse)

Install ntfs-3g via homebrew:
brew update && brew install ntfs-3g


Link mount_ntfs:
sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.original
sudo ln -s /usr/local/Cellar/ntfs-3g/2014.2.15/sbin/mount_ntfs /sbin/mount_ntfs


Reboot

Launch your bootcamp partition under VirtualBox

First, we add your current user account to the operator group and we give the anyone in the operator group read-write access to the raw partition. In my case it's /dev/disk0s4, but it might be different for you; mount the partition with Disk Utility and check the device with the mount command. We use VBoxManage to create vmdk wrapper for just partition 4 and make sure our regular user has access to the generated vmdk files. Add the top-level vmdk to your VM as a AHCI SATA drive; check SSD if applicable.
sudo dseditgroup -o edit -a $(whoami) -t user operator
sudo chmod 660 /dev/disk0s4
sudo echo chmod 660 /dev/disk0s4 > /etc/rc.local
sudo VBoxManage internalcommands createrawvmdk -rawdisk /dev/disk0 -filename Win8.1-bootcamp.vmdk -partitions 4
sudo chown $(whoami) Win8.1-bootcamp*.vmdk

WPAD on OpenWRT with SSH tunnel

  1. Create your PAC file, for example
    function FindProxyForURL(url, host) {
    if (shExpMatch(host, "*.google.com") || host == "google.com") {
    return "PROXY wpad:8888";
    }
    else {
    return "DIRECT";
    }
    }

  2. SCP the PAC file to root@openwrt:/www/wpad.dat

  3. Go to Luci -> Network -> Hostnames and add wpad as an alias for your OpenWRT router's IP

  4. Install the autossh software package through opkg

  5. SSH to the router and edit /etc/config/autossh
    config autossh
    option ssh '-2 -N -o ServerAliveInterval=60 -L 192.168.1.1:8888:127.0.0.1:8888 -i /root/.ssh/id_rsa user@example.com'
    option gatetime '0'
    option monitorport '0'
    option poll '600'

  6. Use dropbearkey to create an SSH keypair, save the private key in /root/.ssh/id_rsa

  7. Append the newly created public key to your server's ~/.ssh/authorized_keys

  8. Enable and start the autossh service through Luci


You can test your setup with curl:
curl wpad/wpad.dat
curl --proxy wpad:8888 google.com


This will have created an SSH tunnel from your router to your remote server, reconnecting as soon as a disconnect happens. Clients on your network will route traffic through the proxy, as determined by your logic in the PAC file.
Windows clients use WPAD by default, but for OSX clients this has to be explicitly enabled in Network Settings.

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 kernel.org at https://www.kernel.org/pub/linux/kernel/v3.x/
  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_TCP_CONG_ADVANCED=y
    CONFIG_TCP_CONG_BIC=m
    CONFIG_TCP_CONG_WESTWOOD=m
    CONFIG_TCP_CONG_HTCP=m
    CONFIG_TCP_CONG_HSTCP=m
    CONFIG_TCP_CONG_HYBLA=m
    CONFIG_TCP_CONG_VEGAS=m
    CONFIG_TCP_CONG_SCALABLE=m
    CONFIG_TCP_CONG_LP=m
    CONFIG_TCP_CONG_VENO=m
    CONFIG_TCP_CONG_YEAH=m
    CONFIG_TCP_CONG_ILLINOIS=m
    CONFIG_DEFAULT_CUBIC=y
    # 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 meetup.com 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)
  • meetup.com 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.

回顾中国的开源浪潮

作者按:这文章的大部分完成于今年9月中旬,适逢一年一度的钱塘江大潮,给了我很大的灵感。当时因为在忙北京的SFD活动,所以没有写完,现在年底补充和修改一些,遂发此文。
首先声明:文中观点只是我自己的想法,仅作参考。 经常听到一些商业宣传:“‘开源大潮’已经汹涌而来”,好像大姨妈来了,大家都没准备好卫生巾一样。那么抛开这些商业宣传,开源这个国外舶来品在中国是如何生根发芽的呢?我们不妨稍加整理,将所谓的“开源大潮”切段评判,将其在中国的推进历程,尝试以“断代”的方式分段讲述。这样做,除了可以理清开源引入中国的历程,更可以剖析开源背后的人的作用、利益诉求和其最终目标。 对开源这种“断代式”的分析起源于年初和一位前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年时那样一盘散沙,还认为社区里充斥着“伸手党”,还认为社区是低效和无能的,还认为只有依靠政府和大公司自上而下的引导,社区才有发展空间……云云。 他们基于这些想法,趁着现在新浪潮尚未成型,联合组织起来,希望通过一个强大的靠山,让别人来靠(“靠”字这里取“依靠”之意),可是不要忘了社区已经开始学会自主和自治了,这些人的这些行为只会让成熟的社区发出一声感慨——靠(这个“靠”字的意思请自行揣摩)。

结论

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

澳洲生活:由“布丁人”和“骨灰级砍价达人”延伸的论证

近日因圣诞节,像中国双十一样,澳洲各商家线上线下也打折优惠。也正值我来澳洲不到两周的时节,反正要采购很多物资,赶个正巧。

经历一番学习后,初步得出这样的推论:

众所周知在澳洲和新西兰的人工费都很昂贵(我因为在新西兰只待了10来天,所以论证主要以澳洲为主),因此人们每天工作时间少一些,赚够了就休息,有很多闲暇时间。

  • 也因此——商家推出了形形色色的打折优惠方式,满足人们闲暇时玩儿;
  • 也因此——在澳洲有了“布丁人”和”骨灰级砍价达人“;
  • 也因此——澳洲人都自己做饭;
  • 也因此——人们很珍惜自己的劳务。

先说说打折吧,人家的打折是真打折,不会先抬价再折;人家的优惠券(或优惠条款)一般可以连环使用,偶尔才会此券彼券不能同时使用。但人家形形色色的优惠方式可以把你和记账系统(想想超市的会计多难当呀)都弄晕,且看:

比如最近一项优惠活动包含

  1. 新会员注册免邮费;
  2. 满100元10%优惠;
  3. 使用××打折码10%优惠;
  4. 使用在线礼品卡(支持现买现用,可以自己买礼品卡给自己用)9.5%优惠;
  5. 最后通过银行卡的优惠可返回5%优惠;

遇上节日还有节日本身的优惠,如圣诞节优惠,礼品节(boxing day) 优惠,比如上述活动又打了40%折。这样下来,如果你善于运算的话,有时候甚至可以买到免费的商品(因为每条优惠加起来价都折完啦,比如这个只用一条优惠就变免费了)。当然,一套购买流程走下来也花了不少时间, 但是至少人家提供的优惠方案都能用,不会动辄“该活动主办方享有最终解释权”,人家承诺的返现真得会返到你银行卡里,没有花出去容易退回来难的说法(包括退货也一样)。

一种更绝的影院优惠是:当你收到短信邀请码时,如果在指定时间内赶到离你最近的公园椅子,并坐着拍个照,就可以得到一张免费电影票。(澳洲市政将所有公园里的椅子都纳入卫星定位,以便维修,也因此人们可以用手机定位离自己最近的公园椅子)

再说厨房和做饭,澳洲和新西兰青年常常在家里吃饭,也许因为下馆子很不划算。我在新西兰皇后镇就亲眼见很多轻年男女在旅馆里自己和面烤面包拉面条。说到厨房,我原先常听人家说德国人家庭的厨房像化学实验室或工具间,后来发现澳洲人也喜欢把自家厨房布置得像锅碗瓢盆量杯量勺专营店一样。

说了这么多“因此”,我们也见识一下人家是怎么珍惜自己的劳务的吧。

在新西兰我们眼看着震后受伤的建筑,两年后依然带伤遍布整个基督城,也亲眼看着维修工人在下午3点阳光最好的时光里,悠然挎着工具包从撑着支架緾着绑带的建筑里走出来,轻快地迈向回家的路。

在悉尼,我们去旅馆途中遇见被风雨刮下来的大树叉,当时有几个市政工作人员在讨论怎么处理。当晚我们再出门时发现树叉们还在,只是周边立了雪糕筒,树叉也被缠了警示带。(缠警示带是有讲究的,如独枝一杆的缠两头,带叉的得先把叉缠住,再绕成一个三角型,示意整个树叉的空间不得通行。)次日早我们离开旅馆时,又遇见几个工作人员,这次他们是来搬运树叉的,边上停着装载的车子。

———————————————————————————————————————

布丁人

美国工程师大卫·菲利普斯——一个站在巨人肩上(也站在头上)的囤积英雄,因购买12,150个巧克力布丁赚了1,253,000 点飞行积分,史称“布丁人”。

他用3000美元(3185美元)购买这些布丁,赚取了上百万英里的飞行积分。可以从美
国到澳洲飞21个来回。超市里有一项“健康之选”的促销活动:每购买10件商品即可奖励500点飞行积分,若当月完成购买再奖励500点——被这个眼尖的在加州大学任教的工程师注意到了。

菲利普首先看上了专供电视迷们用的价值2美元的快餐,但他进一步发现一种只要90美分的汤也在“健康之选”促销之列。迅速作了计算后,他意识到仅花90美分就可以赚取1000个点——反过来说每10个点还不到1分钱,太划算了。于是他就在购物车里使劲填汤。

他又到附近的食杂店买更多汤,然而一种只要25美分一个的巧克力布丁也在做活动,迅速运作他的超级数学大脑:每个积分点的成本为0.0025美分,因此买10个25美分的布丁可以赚1000英里的积分。

菲利普当即买光店里所有巧克力布丁。这还不够,他又将方圆其它三个食杂店洗劫一空。

他还向一个店主要了三批货(相当于60箱布丁)。

当菲利普买回12,150个巧克力布丁后,他才意识到为了兑换积分,他还得把每个布丁上的条码撕下来,并贴在承兑表上。而他简直不可能在活动结束前能做完。但他心生一计:征集本地的救世军队伍来帮忙,并以捐赠这些布丁作为交换。

更不可思议的是:因为这项捐赠,菲利普可以以“购买大宗布丁”的名义来抵税,那就是下次退税时他的口袋将会多出825美元。

促销的商家“健康之选”最初不承认这些积分,声称没有收到菲利普的承兑表。但在对方出示了邮递证明后,他们就承认了,并开始接收厚重的邮包以便计算兑换积分。

菲利普后来将1,037,000点积分存在美国航空,剩下的216,000放在联合,大三角和美国西北航空。

原文来自:http://www.ausbt.com.au/the-world-s-five-weirdest-tricks-to-earn-frequent-flyer-points

——————————————————————————————————————-

骨灰级砍价达人(die hard bargainer)

副标题:史上最便宜——Quilton卫生纸3层190张22.4到 24.1分每卷 @ Woolworths

大家好,

Woolworths网店在做活动,这两种卫生纸(译者略去了链接)都是10元3组。

假设你只买卫生纸:
——拍至少18卷(因为每3组才有优惠),共计60元。
——假设你有EDR号(一种超市积分卡),并输入这组 DD8R2的打折代码(如果你还没有提前用掉的话)。
——因为这是批量购,系统会自动计算20%的折价进去,而这个折价是建议零售价为基数计算的。也就是价格将由原来的6.99降到 3.33每捆。这样下来每组只要 1.93(24.1分每卷),所以总共变成34.83元。
——加上使用 WW/Big 的在线礼品卡(可买现用的)付款,此时又降为1.79每组 (22.4分每卷。)
——如果你想囤积一年的货,还可以再加上满100免10元的优惠。

现在这套方法还能用,我是12月19日买的。
–————————————————————
12月20日早10点,星期一: Woolworths网店上剩下不到6卷纸了,文中方法已不再有效。

原文来自:https://www.ozbargain.com.au/node/175577


[图文教程] 在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,但只有命令行版。

创建个人openPGP密钥对

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

导入导出密钥

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

常用的加密/解密和签名操作

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

为别人的GPG公钥签名

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

openPGP与电子邮件的结合

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

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

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

TIL tac

tac

Concatenate and write files in reverse, copies each FILE ( - means standard input), or standard input if none are given, to standard output, reversing the records (lines by default) in each file separately.

OSX doesn't have tac out of the box, but add the following line to your .bash_profile and you're good to go:
alias tac='tail -r'

漪漪找妈妈招术大全

漪漪现在7个月了,但就在近一个月里,她心眼是越来越多,心情也随天气,人物,事物而变化多端。

漪漪在半岁前想找妈妈时只知道左右前后找。半岁之后会侧着小脑袋,斜弓着身子朝我经常出没的地方找。后来要明确指定爷爷抱着找,有时我不在,她会要求来搜罗我房间。再后来她哭着要妈妈时,边竖着耳朵听脚步声,若侦测到脚步声近了就迅速降低哭声。那天我走到一半听见哭声停了就返回了,她发现后立马加倍使劲哭闹。前几天,我被招唤去后因为没有及时理她,她就气急败坏地大喊大叫,直到我表现诚心抱她为止。这难道是正正得负的遗传,还是娇惯?

不过最近她变乖了很多,偶尔见到我时会怔一下,知道我不抱她就继续玩。有时她会趁机抓住我的衣角不放,但在她手里塞上其它东西后她就作罢了。

好在这似乎是她停止发展更坏心眼的趋向,不然我真担心小小的她只顾长心眼呢?

IMG_4049

IMG_4050


Planet BLUG

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

Updated on February 10, 2016 - 07:19 UTC.
Entries are normalised to UTC time.

Subscribe

Atom 0.3
RSS 1.0
RSS 2.0
OPML
FOAF

Credits

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.