Archive

Archive for December, 2008

CN Erlounge III 作业汇总

December 29th, 2008 :: jackyz

Tim Yang 同学汇总整理了各位在 CN Erlounge III 会后的作业。很好很强大。盗版一下。

jackyz: cn erlounge iii 归来,好消息一箩筐

Shining Ray: cn erlounge iii

博文视点: Erlang大会之行(1):真低调,真聪明——Erlang大会记草原(补充三点)

litaocheng: CN Erlounge III归来!

Michael: CN Erlounge III归来,收获颇丰

还有我自己的 :)
Tim: 参加Erlang开发者大会一些记录

陈杰: 谈网游服务器的后端技术

补充:

dcaoyuan: CN Erlounge III, 英文

wangyingqi: Something about erlang社区聚会上海站

(Tim,也可以直接一稿多投嘛,省得我 ICP ,嘻嘻)

misc

cn erlounge iii 归来,好消息一箩筐

December 23rd, 2008 :: jackyz

期盼已久的 erlounge iii 已经胜利闭幕,在家歇了整整 2 天,总算缓过来点儿。一方面说明此次感冒来势凶猛(被打败了),另一方面也说明会议的“密度”实在是太高,讲座又太精彩,实在是不忍心睡觉,终于只好严重休息不足地垮掉了。

感谢本次大会的赞助商:SndaOpenGossTuringBroadview(排名不分先后),谢谢你们的支持。

需要严重表扬一下许式伟同学。筹办一台这样高质量的会议,需要花费力气去敲定的细节实在太庞杂。我只是全程听了一遍,尚且疲惫至此,而他不仅一场不落,还要忙前跑后负责组织协调那许多庞杂,实在想象不出,需要为此耗费掉多少心神。不过,所谓精力过人的神人,端地就是与众不同。一整天听完,人人脸上都带了好多疲惫,可许同学仍然还是笑呵呵的,而且目光炯炯,精神得就像刚磕完药,一问,前一天晚上还是一两点才睡的,俺那个佩服啊……。恩,许同学之外,本次会议的总设计师 —— 金良炽同学,以及超级严谨的段先德同学,还有热情细致的金夫人,都很温暖强大,大家也都辛苦了。

这次能见到这么多的朋友,聚在一起聊大家喜欢的东西,太开心了。而大家的话题[这里有一些]也足够丰富多彩,而且准备非常充分,一路听下来,除了没时间睡觉很累人之外,更是让人大开眼界。最为鼓舞人的好消息是 —— 国内终于有了两个“严肃的商用 Erlang 项目”。一个是 ery.lee 同学的“电信网管”项目,另一个是 dcaoyuan 同学的“某银行手机银行”项目。从第一线兄弟们的反馈来看,实际应用的效果都很不俗。担心会做“小白鼠”的同学,可以把心放回肚子里去了。

Read more…

misc

Mnesia的分布式

December 18th, 2008 :: Godwit

Mnesia的分布式如何使用呢?做了个简单的测试:
代码如下:

  1. -module( db ).
  2. -compile( export_all ).
  3. -include_lib( "stdlib/include/qlc.hrl" ).
  4. -include_lib( "eunit/include/eunit.hrl" ).
  5.  
  6. %% player
  7. -record( player, {
  8. oid,        %% object id
  9. username
  10. } ).
  11.  
  12. table_data() ->
  13. [ %% The player table
  14. { player, 1, "david1" },
  15. { player, 2, "david2" },
  16. { player, 3, "david3" },
  17. { player, 4, "david4" },
  18. { player, 5, "david5" }
  19. ].
  20.  
  21. set_table_data() ->
  22. mnesia:clear_table( player ),
  23. F = fun() ->
  24. lists:foreach( fun mnesia:write/1, table_data() )
  25. end,
  26. mnesia:transaction( F ).
  27.  
  28. install( Nodes ) when is_list( Nodes ) ->
  29. mnesia:stop(),
  30. mnesia:delete_schema( Nodes ),
  31. catch ( mnesia:create_schema( Nodes ) ),
  32. mnesia:start(),
  33. case mnesia:create_table ( player, [
  34. { disc_copies, Nodes },
  35. { type, set },
  36. { attributes, record_info( fields, player ) }
  37. ] ) of
  38. { atomic, ok } ->
  39. ok;
  40. _Any ->
  41. io:format( "create table error!~n")
  42. end,
  43. ok.
  44.  
  45. do( Q ) ->
  46. F = fun() -> qlc:e( Q ) end,
  47. { atomic, Val } = mnesia:transaction( F ),
  48. Val.
  49.  
  50. demo( select_player ) ->
  51. do( qlc:q([ X || X
  52. mnesia:start(),
  53. set_table_data(),
  54. mnesia:stop().

俺用的是windows系统,在控制台下:

erl -sname a
Eshell V5.6.3  (abort with ^G)
(a@godwit)1> db:install( [node()] ).
ok
(a@godwit)2> db:init().
stopped

=INFO REPORT==== 18-Dec-2008::22:42:54 ===
application: mnesia
exited: stopped
type: temporary

(a@godwit)4> mnesia:start().
ok
(a@godwit)5> tv:start().   %% 这里你可以看到数据库内容。

然后在另一个控制台下:

erl -sname b -mnesia extra_db_nodes [a@godwit]
Eshell V5.6.3  (abort with ^G)
(b@godwit)1> mnesia:start().
ok
(b@godwit)2> tv:start(). %% 查看数据库内容,已经拷贝过来了!!!

Bingo!一般人我不告诉他!
PS:博主,我不知道我贴这么幼稚的文章行不行?:)

study

[荐] Work with Erlang

December 16th, 2008 :: jackyz

对于广大使用 emacs 的 erlanger 来说,这一篇 《Work with Erlang》实在是不可多得的“终极指南”,范围涵盖之广,不敢说绝后,至少也是空前。包括:

  • erlang-mode
  • erlware-mode
  • distel
  • wrangler
  • esense

很多工具我相信大家也都只是听说而已。而这一篇攻略则详详细细地从安装、配置、直到定制的贴心小贴示,都给你事无巨细的解释清楚了,弄完你的 emacs 就立马摇身一变,成为一个“很好很强大”的 erlang 开发环境(比如:代码格式化、自动完成、refactor,等等),再配上若干精美无比的截图,热情得一塌糊涂,你要是看完不装,简直都要觉得不好意思。

受这份热情的感染,连直接 copy & paste 我也觉得不好意思了。各位用 emacs 的同学,麻烦移步去看[英文原版],或者大家一起召唤翻译达人出手。话说贴英文版有点不那个啥,帖一个中文版,我可是非常好意思的。

btw. 其实 emacs 并不像它看起来的那么可怕,用习惯了绝对比 eclipse 能更加让你专注于代码本身,再说了,就算是去尝一尝,又损失得了啥?

misc ,

关于gen_tcp:controlling_process函数的使用

December 13th, 2008 :: Godwit

初学Erlang,碰到一个小小的问题,拿出来跟大家分享一下。:)
想用gen_server写一个简单的客户端,要求可以无阻塞的接收。开始想的很简单,关键代码如下。

  1. start( Host, Port ) ->
  2.   io:format(Client is starting…~n),
  3.   gen_server:start_link( {local, ?MODULE}, ?MODULE, [Host, Port], [] ).
  4.  
  5. init( [Host, Port] ) ->
  6. { ok, Socket } = gen_tcp:connect( Host, Port,
  7.     [ binary, { packet, 4 }, { active, true } ] ),
  8.   Pid = spawn( fun() -> sendRecvMsg( Socket ) end ),
  9.   %%该处加入gen_tcp:controlling_process( Socket, Pid ),
  10.   Data = #data{ socket = Pid },
  11.   { ok, Data }.
  12.  
  13. sendRecvMsg( Socket ) ->
  14.   receive
  15.     { tcp, Socket, Bin } ->
  16.       %% 注意:此处收不到消息
  17.       sendRecvMsg( Socket );
  18.     { send, Message } ->
  19.       gen_tcp:send( Socket, Message ),
  20.       %% 注意:此处可以收到消息,但是显然是阻塞接收的。
  21.       receive
  22.         { tcp, Socket, Bin } ->
  23.           io:format(Receive something!~n)
  24.         after 1000 ->
  25.           sendRecvMsg( Socket)
  26.       end
  27.   end.

想了好多方法,没有解决,回头认真的把书相关章节读了读,顿悟(参见《Erlang程序设计》第196页):
创建一个套接字的进程(通过调用gen_tcp:accept或gen_tcp:connect)也就是所说的该套接字的控制进程。这个套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。我们可以通过gen_tcp:controlling_process(Socket, NewPid)函数来把一个套接字的控制进程改为新的控制进程NewPid。
所以,在spawn之后加入如下语句:

gen_tcp:controlling_process( Socket, Pid ),

就可以了。

misc

无废话Erlang

December 13th, 2008 :: jackyz

这是发表在《程序员》杂志第9期上的一篇简化版Erlang介绍文章。有人提起,于是就转发到这里来了。

Erlang 是程序界的幽灵船,它凭空出现,没人知道它从哪儿来,是怎么回事,也无人知晓它来做什么,要往何处去。
——江湖传言

相信对很多人来说,上面的说法颇为传神的捕捉到了围绕在 Erlang 周围的神秘气息。我们越来越多的见到这个名词,或者道听途说有关它的种种神奇。但每次试图一探究竟,总会在面对它那“怪异”的代码时感到气馁,而那些“不合情理”种种限制,则更加让人费解。很难想象,为什么有人会发明这么怪异的语言,而它为什么又会受到广泛的关注,更别提要如何用这么“别扭”的语言来编写程序了。本文试图为这些问题提供一些线索,但真正的答案其实一直深埋在你的心底,象往常一样,也要靠你自己的思考和努力才能获取。

Read more…

misc

{转}Relax with CouchDB, first three chapters available

December 12th, 2008 :: KrzyCube

http://jan.prima.de/~jan/plok/archives/164-guid.html

Release early, release often they sayChris,Noah and I published the first results of our hard work on the CouchDB Book.

The chapters haven’t seen any editing by O’Reilly (our publisher) and we know that there are areas that need work. But we would like to know which areas are the most important ones by letting our readers have the material as soon as possible.

That is, we are looking for feedback. Each paragraph on the website has a link where you can leave your comment. We highly appreciate any input. It will help us to write a quality book. Thanks!

We are trying to get the next batch of chapters to you as soon as possible. Stay tuned!

news ,

【译】OTP Design Principles之Gen_Fsm Behaviour

December 10th, 2008 :: Godwit

OTP Design Principle中的gen_fsm,翻译了一下,希望对大家有用。:)翻译的不好,请大家结合原文来看。

1.3 Gem_Fsm Behaviour

本章应该结合gen_fsm(3)来阅读,在gen_fsm(3)里面有所有接口函数和回调函数的详细说明。

1.3.1 有限状态机

一个有限状态机,FSM,可以用一个关系式来描述:

State(S) x Event(E) -> Actions(A), State(S’)

这些关系解释如下:

如果我们处在状态S并且事件E发生了,那么,我们需要执行动作A,并且转变到状态S’

对于一个用gen_fsm行为实现的状态机来说,状态转变规则被写为符合如下规定的一系列Erlang函数:

StateName( Event, StateData ) ->

.. code for actions here …

{ next_state, StateName’, StateData’ }

Read more…

study

《Erlang Programming》is on the way

December 9th, 2008 :: jackyz

Erlang Programming 从华章图书的陈主任那里得到正式确认,国际图书市场上,在 Joe Armstrong 的 “那一本” 之外,仅有的 另一本 Erlang 图书,正在由他们着手引进,计划在明年的某个时刻推出(英文预计09年4月出版)。这意味着,在 Erlang 社区,至少是图书出版这个领域,我们很难得的能与国外保持高度同步。对于广大中文 Erlangers 来说,在这个冬天,这实在是为数不多的能让人感到幸福的好消息。

从目前了解到的情况来看(目录/内容还没有看到,请各位知情同学尽力提供),与 Joe Armstrong 的 “那一本” 着重讲述语言本身不同,Francesco Cesarini 的 “这一本” 很可能会侧重于实践经验的分享。我从一个实践者的角度看,觉得这两本书之间形成了一种良好的承接和配合。如果说 “那一本” 是带领我们闯入了一个全新的 “面向并发编程的世界”。那么,我们在这个美丽新世界的探险之旅,仍会时不时的碰上一些被叫做 “最佳实践” 的未明区域,有待我们辛苦的 “穿越”。此时,一本侧重于具体项目实践的图书,就好比是其他探险家留下了一份很好很强大的 “手绘地图”+“攻略” ,因而极富价值。

谈到 Francesco Cesarini ,有必要给不认识的同学简短介绍一下,他是 Erlang-Consulting 的 founder ,阅项目无数,战斗经验满载,实力绝对不容小盱。靠谱的新书降临,大家一起期待吧!

misc

一门天生就能损害人视力的语言 -> Erlang?

December 1st, 2008 :: jackyz

这次去 softcon 2008 讲了一个介绍 Erlang 的话题,也顺便见识了一回 “网络传播” 的厉害。在迅速的(紧张的)讲完准备得过于充分的 slide 之后,本来也是午饭时间,所以有了一个较为充裕的提问时间。于是获得了其中一个这样的听众提问,原话已经记不清楚了,大致是:

……
据我所知,Erlang 有损害视力的问题,那么你觉得,目前其他的语言要怎样才能具备 Erlang 这样的并发特性?
……

让我难以理解的是,明明就是从来就没有用过这门语言的同学,说起话来,却好像已经是因为这门语法 “损害视力” 而即将弃之离开一样,对其 “刚一见面” 就 “根深蒂固” 的有了这样恶劣的印象。这让我觉得,之前被我一笑置之的论战,似乎后果还真的有点严重。

Read more…

misc