Erlang-China

erlang 中文社区

Facebook 的 Erlang 加持


这篇消息的两个要点是:

1. Facebook 总算推出了 developer’s blog,在大家都推出自己的“开发者博”之后。
2. 这个“facebook 开发者博”透出来的第一条消息是——纯正 PHP/LAMP 血统的 Facebook 在高度 realtime 的 Chat 应用中,终于用了 Erlang 来提高性能( ejarbberd backend? 估计是 process-one 的那帮法国人最近一直都在搞的定制项目 ),我知道他迟早都会要用的。

如果觉得“干货”不过瘾,时间充裕的朋友可以移步阅读更“ juicy ”的原文—— 《Real-World Erlang Applications - Scaling Facebook Chat to 70 Million Active Users Almost Overnight》。

PS. 这篇 blog 亦可看作是《challenges of scaling up a realtime application》,所以,如果有人花时间将其 i8n 一下,那将会非常棒。

update 20080516:有人说打不开,那就“被迫盗版”一下吧。[节约版面起见,请点“继续阅读”]


运行Processing代码——在Javascript里


mebeliProcessing是一门为视觉艺术家们设计的程序设计语言。尤其是对我们中国的程序员来说,恐怕是极度的冷门。怎么说呢,因为,这个语言“既不能挣钱,又不能出名”,不过就是“画画图”,“没啥技术含量”,简直具备“一无是处”的所有特质。

早在 Turbo Pascal 的时代(199x年),我就曾因为”不慎”买了一本《分形艺术程序设计》,而掉到“用程序画图”的大窟窿里,不可自拔。确实是不慎,就因为这本书,在毕业之前耗费掉了我了大量“大脑CPU”以及“昂贵的机时”来调试和运行那些“除了好看之外,对于求职根本一无是处”的程序。当时可没想过,竟然有人会了这么“不靠谱的事情”而专门设计一个“视觉艺术程序设计语言”。后来才明白,除了写程序卖钱之外,还有很多其他的赚钱方法,只不过,我卖的是程序(工具),而人家卖的是程序的运行结果(用工具做出来的产品),这就叫做艺术(品),这也确实是艺术(商业模式)。是的,用程序来画图,将其画成一件艺术品——站在程序员(特指卖程序为生的人)的角度,这确实还是一件理解起来有点困难的事。

第一次听说这个名词,是在首图的艺术阅览室,随手拿起来的一本香港艺术杂志(名字不记得了)用了很多页的彩图来展示这门语言所创造的艺术。当时的感觉是——相当精美,回忆起了那段“掉到窟窿里的时光”,不过和我已经没啥关系。

再次听到 Processing 的名字,是从 Joho Resig 的 Blog 上看到的,这位大神的 JQuery 事关吃饭,乃是“教主宝训,时刻在心,建功克敌,无事不成”级的东西。所以,当我看到这位大神竟然花了 7 个月的时间用 5000 多行的代码将 Processing 语言请到了 JavaScript + Canvas 环境中,可以说是相当的惊讶(不好好的花精力提升吃饭用的 JQuery ,跑去搞什么不务正业的 Processing 嘛)。莫非,人吃饱了饭都会开始追求艺术么?

anyway, 从纯技术的角度来说,Web确实是“艺术最广泛的平台”,最近还看到另外一个 JavaScript Information Visualization(一个动态的六度空间图,让人印象深刻),再加上这个 Processing in JavaScript。让人被 canvas 标准喷出的炽热气息灼伤,而 web 视觉艺术的春天也正在凶猛来袭。

Javascript 的未来会很精彩。


运行Java代码——在Javascript里


Joho Resig (即 JQuery 之神),是一位知名的“ JavaScript is the next big things”论者。他最近有机会参加了一个日本的 JavaScript 交流活动,给我们带回了一个有趣 JavaScript 项目 orto 的介绍。

这个名字看起来特别象 orz 的日本项目,可比它的名字看起来可要牛逼不少,它的野心是能让 java 代码运行在 JavaScript 之上,我的意思是 —— 用 JavaScript 做一个 JVM 出来。虽说可能不会全面支持 java 的所有特性,但至少能做一些有意思的东西,比如这个性能还不错的俄罗斯方块

它的做法相当有意思,乃是将 java 的 byte code 转换为 JavaScript 代码,比如,你会看到这样的代码:

"java/lang/Thread 1316742099":function(){var orto333=orto245[0];
var orto336=orto350(orto333);
if(orto336.orto340!=orto310){orto223("java/lang/IllegalThreadStateException",null);
return ;
}
...
case 117:orto246[orto247-2]={high:(~orto246[orto247-2].high)
  &
0xffffffff,low:(~orto246[orto247-2].low+1)&0xffffffff};
if(orto246[orto247-2].low==0){orto246[orto247-2].high++;
orto246[orto247-2].high&=0xffffffff;
orto246[orto247-2].low=0;
}break;
...
case "CHECKBOX":orto171=orto188["orto/ui/CheckBox"];
break;
case "IMAGE":orto171=orto188["orto/ui/ImageButton"];
break;
case "RADIO":orto171=orto188["orto/ui/RadioButton"];
break;

显然“不是给人读的程序”(因为是给机器读的嘛)。orto 的特性包括:

* The result is able to handle threaded application code (translating the threads into a series of yields with setTimeout (mentioned in the presentation and demonstrated in the Tetris example).
* The application can use regular Java conventions for designing and constructing the UI (as shown here, as well). User Interface components are translated to, similar, HTML ones. It’s not apparent to what extent functionality is implemented, but it is to a certain degree.
* Keyboard interactions are able to be handled and translated to normal Java callbacks.

说起来,这和 gwt 很有一些“异曲同工”的意思。这让我联想到了 rhino,呵呵,你来实现我,我又来实现你,真是一个互操作的时代。畅想一下,如果在 rhino 的基础用上跑 orto 又或者在 orto 的基础上跑 rhino ,那会是一副什么光景,又有着怎样的意义呢?

也许是我个人食古不化的误解——私下里,个人认为 orto/gwt 这种项目让我有种“狗拿耗子多管闲事”的感觉,JavaScript 这样的脚本语言,不是正好适合于“需求变化迅猛”以及“强调快速原型化开发”的 UI 层么?找两个美工,一个 js 程序员就能做界面,不正是又快又好用么,为啥非要用 java 来写?追求语言上的纯粹?又或者是 js 程序员太难找?从后端的业务逻辑到前端的用户界面,全部都用 java 来包打天下,这是合适的做法么?如果说传统“应用程序”界面的程序,用用 swing/swt 什么的还可以理解,而在 web 一桶糨糊的现如今,这语言的 babel 之塔,就这么难以建立?

呵呵,JavaScript,我支持你。


[荐]如何给你的奶奶解释“云计算”


大道至简,简单是美。在下一直以为,能“把复杂的东西解释得很简单”是件很了不起的事,远比“把简单的东西解释得很复杂”要牛逼很多倍(后面一种事,好像每天有很多人都在做)。

王小波善于通过小说将复杂的社会政治问题给广大长期被洗脑的人民解释得一清二楚(这里),而 highscalability.com 的 Todd Hoff 则善于通过博客将复杂的软件技术问题给毫无技术背景的奶奶解释得明明白白(这里)。在其中的任何一个领域,要干好这件事都需要相当的智慧,殊为不易,同样都值得推荐。

恩,推荐阅读的文章地址在[这里]。

PS. 不知道为了什么,象 highscalability.com 这样的纯技术站点也被我们“伟大的防火墙”(不知道的自己去google英文版)挡在了外面,国人无缘得见。(科技领域也搞闭关锁国?)各位无法访问的朋友,要么使用“伟大的过墙梯”(不知道的自己去google英文版)自己翻墙去看,要么看下面我“被迫的盗版”。


[blah] REST —— 一个实用主义者的思考


这几天在考虑“虚构ajax 聊天室”的 uri 设计,想用 rest 风格来试试,时髦一下嘛。但对 rest 有很多地方其实都是一知半解,于是去问老朋友—— rest in action 上的 dlee 同学——拽着问了一大堆初级问题(见这里,以及这里),回头又啃了一些文章,也算是对 rest 进行了一番独立思考吧。想到整个过程对于其它人或许也有用,于是 blah 之。

需要说明的背景是:我是一个实用主义者。也就是说:搞开发不求纯粹但求实用。乃是在“多快好省”实现需求的前提下,顺便向“有风格”的方向靠,能靠上最好,靠不上拉倒。重点不在结果,而是在过程——也就是说,设计决策中,如果我选择了 free mobile phone ringtones | cricket free phone ringtones | 1600 nokia ringtones | madonna ringtones | free ringtones converter | cheap virgin mobile ringtones | free ringtones 3gforfree | mobile phone ringtones virgin | sprint pcs ringtones | free nokia mp3 ringtones | download free ringtones nokia | download free ringtones to cellular phone | free lg ringtones verizon wireless | get ringtones | free composer ringtones | gold mp3 ringtones | motorola ringtones | alltel free music ringtones | cingular free ringtones wireless | free boost mobile ringtones | rest ,那么借鉴的是什么,如果我选择了不遵循它,那么理由又是什么。另外一个需要说明的是,尽管这几天啃了不少 rest 的文章,但“每个人的心中都有一个 xxx”(请自行将 xxx 替换为你喜欢的任何词语),加之对 rest 可能仍未吃透,所以大家凑合着看,或许某天夜里悟透了,爬起来把这里的思考全都推倒重来亦无不可能(免责声明了啊)。如果发现有错误,那太好了,欢迎之至,请随时指出。

下面就是“虚构 ajax 聊天室”的 rest 设计之旅。


[荐]RESTful Services with Erlang and Yaws


说来也巧,刚刚推荐过 InfoQ 的 The Power of Javascript 隔天就看到 InfoQ 又发了 Steve Vinoski 的一篇 RESTful Services with Erlang and Yaws ,地址在[这里],说不得,只好再次推荐。

和 Javascript/Ajax 一样,RESTful 也是风头正劲的 buzz words 。一言以蔽之,其实质就是回归 http 协议的本质,尽量在其框架之内解决问题。首先就是要 uri 化应用本身的资源,确保一个资源只有一个 uri ,以达致简洁。其次就是在 http 协议的 GET/POST/PUT/DELETE 动词(请求方法)上做文章(与之相对应的就是用户埋在 form 中的 act/op/delete/edit/modify/change/update/… 等千奇百怪的自定义参数),将其映射为 CRUD 的常规操作,再就是对 http 协议的 content-type 进行严格的清晰化,针对不同客户端的请求,返回不同“格式”的数据,除此之外,对于 status code 和 header 之类也做一番“依照规范”的改进。相比 post 带上一大坨自定义参数的“老旧风格”,不规范之余,也会让参数越来越冗长以及自定义的格式越来越糟糕, RESTful 风格则显然更多的发掘了 http 协议本身已经内置的潜力,可谓正本清源。

但我还有一个小小的疑问。RESTful 之中只定义了4个“动词”,如若我的应用更为另类,需要更多的“动词”,又该如何?自定义新的 HTTP Method 引入更多的自定义 Method 是否会破坏 RESTful 想要“规约简化”的本意?希望有人能够解答此疑惑。


[荐]The Power of JavaScript


InfoQ 网站上发布了 Glenn Vanderburg 在 Jaoo 上做的一场有关 JavaScript 的展示。地址在[这里]。

在点上面的链接过去学习(或者是bypass掉)之前,顺便说一句:自 2000 年以来 JavaScript 从“最受人误解的编程语言”开始,又重新进入大家的视野,这股潜藏在地底的趋势一直不停的奔流,直到现在重新喷薄而出时,俨然已经初具“最具人气的编程语言”的明星气质。对于 Lisp 血统的 JavaScript 来说,这确实是它的幸运。

不可否认的一点是,作为程序员,对于 web 的发展,恐怕很难有人能够完全彻底的置身事外(专搞硬件编程的大拿除外)。多少了解一下曾被我们视作 toy 的 javascript 的真正实力,畅想一下 javascript 应用的 possibility ,或者仅仅是关注这一很有些 fp 语言编出来的代码的美感,恐怕只会无害有益。

另外一个很个人化的感想是:这些日子以来在 erlang/javascript (尤其是jQuery base的)之间频繁转换频道的编程,让我觉得这两者在某个地方其实高度相通。


CouchDB 的作者 Damien Katz 炮轰 Erlang 的语法


CouchDB 的作者,即知名的 Damien Katz ,虽说他用 Erlang 写出了名动江湖的 CouchDB ,但对于“他喜爱的 Erlang ”,还是发了 一满车的牢骚 来表达他对 Erlang 诡异语法的抱怨。

这一车牢骚主要集中于:

Basic Syntax
If Expressions
You Say String of Characters, I Say List of Integers
Functional Programming Mismatch
Records
Give me memory, or give me death!
Code Organization
Uneven Libraries and Documentation

具体来说,就是:

Basic Syntax,主要是抱怨在不同的上下文中 ; 和 . 都作为代码的分割符号来使用,这使得拷贝粘贴代码需要额外的小心处理这些符号。不过我倒没觉得别扭 ; 表示的是一个子句的结束,若要拷贝一个完整的函数(或者 case 的子句),确实是应该包括它的多个子句的。

If Expressions,主要在于 if 不能使用自定义的 函数 作为判断条件,而且还必须(包括 case)要有一个返回值。这一点在 erlang 文档中已经明确指出了原因 if 只能用无副作用的 bif 来作为判断条件。而 case 和 if 作为一个语句,都必须保证要有返回值(在 erlang 中所有的语句都要有值,比如说 undefined 这个 atom)。

You Say String of Characters, I Say List of Integers,主要是没有内置的 String 类型,而是作为 List 来对待引起的。Yariv 也倾向于赞同这一点,他提出的”将 regx 之类的函数扩展到 binary,以 binary 来处理 string”我谨慎赞同(如果能够妥善解决 utf8 的话)。

Functional Programming Mismatch,主要是抱怨“不可变的变量”带来的不适。看过 Joe thesis 的人能够理解为什么 Erlang 要搞“不可变的变量”,我觉得正是因为 Erlang 在这个问题上的决策才带来了它的优越性。用 Erlang 就必须要忍受它的“不可变的变量”,我觉得这是一个风格问题。

Records,怪异的 Record 语法。这个我赞同,改成任何一种简略一些的语法应该是可以的。

Give me memory, or give me death!,Erlang 在内存分配失败时的 exit(1) 处理让 Damien 相当不适应,但,这就是 Erlang 与众不同的异常处理策略。换句话说,也是它能量的一部分。照理说 VM 应该重启(如果配置了 Monitor),但 Damien 提到的 VM 没有成功重启,Klacke 在回帖中表示,这或许是一个 bug 。

Code Organization,只有 module 这一种代码组织方式让他不爽。无语,我只能说,这事风格冲突。

Uneven Libraries and Documentation,缺少库和文档,老问题了。确实该改进。

总结一下,对于 Damien 的抱怨,我赞同他对于 String, Records, Libraries and Documents 的看法。其余的,我认为大多出于设计决定,也是可以习惯的。如果理解了“不可变的变量”,“减少副作用”以及“速错”,这些异乎寻常的设计决定是如何做出的,那么看到这样诡异的代码,也许会更加容易认同。

另外,此前我和 dcaoyuan 也聊起过对 Erlang 语法和库的不适应。对于语法,我现在认为那是一个习惯问题,的确是与你之前所习惯的大不相同,但你总能适应。而对于库,我比较赞同他的话:“Erlang 过去太专注于自己狭窄的应用领域,用在其他的领域,你会发现它缺乏一些显而易见的支持库。但你选择了 Erlang 就要做好思想准备,要么等待 OpenSource 社区的贡献,要么就自己动手丰衣足食。”

再有,生命不就在于折腾么,折腾到 Erlang 必然有自己的理由,这些也许正是乐趣的一部分——这里拿 Yariv 的话作为结尾——“Like any language, Erlang has some warts. But if it were perfect, it would be boring, wouldn’t it? :)”


ErlyBird 0.16.0 Released - An Erlang IDE based on NetBeans


I’m pleased to announce ErlyBird 0.16.0, an Erlang IDE based on NetBeans. This is an important feature release in size of 25M. If you have latest NetBeans nightly build installed, you can also install ErlyBird modules via update center.

 

CHANGELOG:

 

    * Project metadata file is changed, please see Notes

    * Instant rename (put caret on variable or function name, press CTRL+R, when rename finished, press ENTER)

    * Go-To-Declaration to macros that are defined included header files

    * Fixed: Go-To-Declaration to -inlcudelib won’t work again after this include header file was opened in editor once

    * Fixed: syntax broken for packaged import attribute

    * Fixed: syntax broken for wild attribute

    * Completion suggestion will not search other projects

    * Track GSF changes, reindex performance was improved a lot; Can live with other GSF based language support now (Ruby, Groovy etc)

 

Java JRE 5.0+ is required.

 

To download, please go to: http://sourceforge.net/project/showfiles.php?group_id=192439

 

To install:

 

   1. Unzip erlybird-bin-0.16.0-ide.zip to somewhere.

   2. Make sure ‘erl.exe’ or ‘erl’ is under your environment path

   3. For Windows user, execute ‘bin/erlybird.exe’. For *nix user, ‘bin/erlybird’.

   4. Check/set your OTP path. From [Tools]->[Options], click on ‘Erlang’, then ‘Erlang Installation’ tab, fill in the full path of your ‘erl.exe’ or ‘erl’ file. For instance: “C:/erl/bin/erl.exe”

   5. The default -Xmx option for jvm is set to 256M, ErlyBird now works good with less memory, such as -Xmx128M. If you want to increase/decrease it, please open the config file that is located at etc/erlybird.conf, set -J-Xmx of ‘default_options’.

 

When run ErlyBird first time, the OTP libs will be indexed. The indexing time varies from 10 to 30 minutes deponding on your computer.

 

Notes:

 

   1. Since project metadata format is changed, to open old ErlyBird created project, you should modify project.xml which is located at your project folder: nbproject/project.xml, change line:

 

      <type>org.netbeans.modules.languages.erlang.project</type>

 

      to:

 

      <type>org.netbeans.modules.erlang.project</type>

 

   2. If you have previous version ErlyBird installed, you should delete the old cache files which are located at:

          * *nix: “${HOME}/.erlybird/dev”

          * mac os x: “${HOME}/Library/Application Support/erlybird/dev”

          * windows: “C:\Documents and Settings\yourusername\.erlybird\dev” or some where

 

The status of ErlyBird is still Alpha, feedbacks and bug reports are welcome. 


hypernumbers whitepaper - Erlang and LAMP on web


HyperNumbersGordon Guthrie发布了Hypernumbers White Paper(PDF)。这是一篇鼓吹 Erlang 在 Web Stack 中应用的 WhitePaper (哈哈,看来我不是唯一一个持有这种想法的人啊)。

HyperNumbers是一个苏格兰的StartUp Web公司,他们的计划是用Erlang Web Stack开发自己的vixo.com应用(这是一个“基于SMS的SNS”)这个项目是SeedCamp的六个优胜项目之一,获得了投资。记得Joe Armstrong有篇mail说过:

A gang of smart programmers get so frustrated using technology X that they bail out from the mothership start own company and do stuff in Erlang

这是他多年推广Erlang观察到“spread of Erlang into commercial projects”的“模式”之一。

AnyWay,这篇不错。值得一读。Hypernumbers White Paper(PDF)