March 29th, 2007 :: jackyz
原文地址:avindev.javaeye.com
原文作者:AvinDev
Erlang的分布式通讯安全策略,可以归结为 All or None。要不拥有全部的权限,要不就完全没有。
它的节点安全设置,是通过一个magic cookie来实现的。这个文件默认放到
$HOME/.erlang.cookie ,文件内容是字符串。
当启用分布通讯的时候,这个magic cookie就很重要了。如果在命令行里面带上 -setcookie ,则在当前节点使用这个cookie值,否则会使用 $HOME/.erlang.cookie Read more…
study
March 28th, 2007 :: jackyz
自从用惯了ant,就习惯把代码的目录结构整成:
project/
builid.xml
/src
/bin
/jar
这样的目录结构。然后,随时随地的一 ant,爽得不得了。而在 erlang 的 erl 中,貌似并不是这样,erlc自动编译在当前目录,一怒之下写了一个 .bat 来干 build 的活,倒也快活。
del ebin\*.beam
erlc -o ebin -I include src/game_server.erl
erlc -o ebin -I include src/game_admin.erl
erlc -o ebin -I include src/game_client.erl
最近,又觉得有些不爽——这多别扭呢。还想用 ant 来着,不过,今天又随手翻了下文档,原来人早有方案,也叫 make 。难怪 joe armstrong 说当他用完 prolog 的 compiler 之后,就再也用不到它了——都可以在 erlang 环境中完成嘛。新的文件路径是: Read more…
study
March 27th, 2007 :: jackyz
原文地址:avindev.javaeye.com
原文作者:AvinDev
gen_tcp:listen(Port, Options),Options 为一个参数列表
之前介绍过 {active, Boolean} 这个 opt,现在介绍一下 {packet, PacketType}
引用
{packet, PacketType} (TCP/IP sockets)
Defines the type of packets to use for a socket. The following values are valid:
raw | 0
No packaging is done.
1 | 2 | 4
Packets consist of a header specifying the number of bytes in the packet, followed by that number of bytes. The length of header can be one, two, or four bytes; the order of the bytes is big-endian. Each send operation will generate the header, and the header will be stripped off on each receive operation.
asn1 | cdr | sunrm | fcgi | tpkt | line
These packet types only have effect on receiving. When sending a packet, it is the responsibility of the application to supply a correct header. On receiving, however, there will be one message sent to the controlling process for each complete packet received, and, similarly, each call to gen_tcp:recv/2,3 returns one complete packet. The header is not stripped off.
The meanings of the packet types are as follows:
asn1 - ASN.1 BER,
sunrm - Sun’s RPC encoding,
cdr - CORBA (GIOP 1.1),
fcgi - Fast CGI,
tpkt - TPKT format [RFC1006],
line - Line mode, a packet is a line terminated with newline, lines longer than the receive buffer are truncated.
之前介绍过一个愚蠢的方案,用于演示Binary的匹配。现在完全可以这样做: Read more…
study
March 27th, 2007 :: jackyz
原文地址:avindev.javaeye.com
原文作者:AvinDev
在Erlang里面,Binary支持强大的模式匹配,这为编写网络通讯程序提供了便利。
比如一个协议串,格式如下
HEADER(2 Bytes) ID (1 Byte) MESSAGE(10 Bytes)
可以这样匹配
<>
有一些协议,头部是接下来数据的长度,这样就更简单了
<>
一个IPV4的头部可以这样表示
引用
<
Identification:16, FlagX:1, FlagD:1, FlagM:1,
FragmentOffset:13, TTL:8, Protocol:8,
HeaderCheckSum:16, SourceAddress:32,
DestinationAddress:32, Rest/binary>> = Packet.
具体应用
比如定义了一个协议,头部2字节为长度,接下来是Body。要接收这样一个包,有可能会不全,也有可能2个包一起接收了,这时候可以这样做:
代码
1. loop(Socket, Buffer) ->
2. RecvBinary = gen_tcp:recv(Socket,0),
3. Binary = list_to_binary(binary_to_list(Buffer) ++ binary_to_list(RecvBinary)),
4. case Binary of
5. <> ->
6. handleMessage(Body),
7. loop(Socket, Remain);
8. <<_/binary>> ->
9. loop(Socket, Binary)
10. end.
这个解决方案还是相当笨拙的,Erlang本身有更好的解决方案,这里只是为了演示。
study
March 27th, 2007 :: jackyz
原文地址:avindev.javaeye.com
原文作者:AvinDev
http://www.javaeye.com/article/60414 里面,谈到了半同步/半异步和领导者/追随者模式,在Erlang里面可以很简单得实现它
下面看看 half-sync/half-async 的例子
代码
- start() ->
- case gen_tcp:listen(80, [binary,
- {nodelay,true},
- {packet, 0},
- {reuseaddr, true},
- {active, false}]) of
- {ok, Listen} ->
- io:format(“Listning port 80 @ ~p~n”, [self()]),
- accept_loop(Listen);
- Error -> io:format(“Error occur: ~p~n”, [Error])
- end.
- accept_loop(Listen) ->
- case gen_tcp:accept(Listen) of
- {ok, Socket} ->
- io:format(“Socket ~p connected~n”, [Socket]),
- spawn(?MODULE, handler, [Socket]),
- accept_loop(Listen);
- Other -> exit(oops)
- end.
- handler(Socket) ->
- io:format(“Waiting incoming message @ ~p~n”, [self()]),
- inet:setopts(Socket, [{nodelay,true}, {active, false}]),
- case gen_tcp:recv(Socket, 0) of
- {ok, Packet} ->
- io:format(“Receive msg ~p~n”, [binary_to_list(Packet)]),
- gen_tcp:send(Socket, Packet),
- gen_tcp:close(Socket),
- handler(Socket);
- {error, Reason} ->
- io:format(“Socket ~p error ~p~n”, [Socket, Reason])
- end.
在许多“网络编程”的教程里面,都会给出类似这样的例子。首先当前线程先监听一个端口,然后accept外来Socket连接,并将Socket传 递到新的线程中处理。在C、Java这样的语言中,创建一个线程的开销是很大的,一般来说,会使用线程池来处理短连接,一些Web Server就是基于这样的模式。然而在Erlang里面,创建一个Proces的开销极少,进程间切换完全在用户态实现,这样减少了用户态和核心态间切 换的开销,使得这种模式成为了可能。 Read more…
study
March 27th, 2007 :: jackyz
原文地址:www.devmaster.net/articles/mmo-scalable-server/
原文作者:Joel Reymont
译文地址:blog.mylkcn.net/senzung.php
翻译作者:神宗冥浩
简介:
本文以我的OpenPoker项目为例介绍另一种构建大规模多人在线系统的方案。OpenPoker是一个大型多人扑克网游,内建支持了容错能力,负载平衡和无限制的规模大小。OpenPoker的源代码遵循GPL协议可以从我的网站下载,大约包含一万行代码,有三分之一是用来测试的。
在Openpoker最终版出台之前,我花了很大精力设计参考,尝试过Delphi, Python, C#,C/C++还有Scheme。我甚至还用Common Lisp完成了一个可运行的Poker引擎。虽然我花了9个多月研究设计,最终代码编写却只用了6个星期,这最后的高效率要归功于选择了Erlang作为编写平台。
根据比较,老版本的OpenPoker需要4~5个人的小组9个月时间完成。原班人马还另外完成了一个Windows版的客户端,就算把这个开发时间的一半(1个半月)算进去,也比预期的18个月少得多,就当今游戏开发的客观环境,如此可观的时间节省不可小看! Read more…
study
March 27th, 2007 :: jackyz
原文地址:avindev.javaeye.com
原文作者:AvinDev
1. Erlang 是什么
一种“小众”语言(排名50之外)
一种函数式语言 (变量只能赋值一次)
一种动态类型语言(变量类型在运行时决定,代码需要编译后才能执行,与Python,Ruby等不一样)
一种强类型语言
一种面向并发(Concurrency Oriented)的语言
《一场茶杯里的风暴》(刊于《程序员》06年9、10期),《轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统》是两篇极好的介绍性文章。
2.开始学习
先下载安装包
到 http://www.erlang.org/ 下载最新的 Erlang/OTP 版本
或者到 http://cean.process-one.net/download/ 下载一个更易于使用的发行版本,仅有3M大小
网上的资源
http://www.erlang.org/ 是官方网站,建议订阅其邮件列表
订阅 http://www.planeterlang.org/ 的RSS
http://www.trapexit.org/ 里面有不错的文章和教程
http://www.process-one.net/en/ 里面有不少Erlang项目
http://yaws.hyber.org/ 一个并发效率大大超越Apache的Web Server
http://ejabberd.jabber.ru/ 一个Erlang的Jabber服务器实现
http://kl.agile.com/ 里面有Potian和T1的一些经常讨论整理。
http://groups.google.com/group/erlang-china 里面也有一些相关讨论
http://computebank.spaces.live.com/ 这哥们翻译了Erlang的部分文档,太好了
你也可以关注JavaEye的综合版 Read more…
study
March 27th, 2007 :: jackyz
原文:Functional Programming For The Rest of Us
原文作者:Vyacheslav Akhmechet
翻译:lihaitao (电邮: lihaitao在gmail.com)
翻译原帖:函数式编程另类指南
校对:刘凯清
程序员拖沓成性,每天到了办公室后,泡咖啡,检查邮箱,阅读 RSS feed,到技术站点查阅最新的文章,在编程论坛的相关版面浏览公共讨论,并一次次地刷新以免漏掉一条信息。然后是午饭,回来后盯了IDE没几分钟,就再 次检查邮箱,倒咖啡。最后在不知不觉中,结束了一天。
不平凡的事是每隔一段时间会跳出一些很有挑战性的文章。如果没错,这些天你至少发现了一篇这类文章——很难快速通读它们,于是就将之束之高阁,直到 突然你发现自己已经有了一个长长的链接列表和一个装满了PDF文件的目录,然后你梦想着到一个人迹罕至的森林里的小木屋苦读一年以期赶上,要是每天清晨你 沿着那里的林中小溪散步时会有人带来食物和带走垃圾就更好了。
虽然我对你的列表一无所知,但我的列表却是一大堆关于函数式编程的文章。而这些基本上是最难阅读的了。它们用枯燥的学院派语言写成,即使“在华尔街 行业浸淫十年的专家(veterans)”也不能理解函数式编程(也写作FP)都在探讨些什么。如果你去问花旗集团(Citi Group)或德意志银行(Deutsche Bank)的项目经理[1],为什么选择了 JMS 而不 Erlang,他们可能回答不能在产业级的应用中使用学院派语言。问题是,一些最为复杂的,有着最严格需求的系统却是用函数式编程元素写成。有些说法不能 让人信服。
的确,关于函数式编程的文章和论文难于理解,但他们本来不必这么晦涩。这一知识隔阂的形成完全是历史原因。函数式编程的概念本身并不困难。这篇文章 可以作为“简易的函数式编程导引”。是一座从我们命令式(imperative)的思维模式到函数式编程的桥梁。去取杯咖啡回来继续读下去吧。可能你的同 事很快就会开始取笑你对函数式编程发表的观点了。
那么什么是函数式编程呢?它怎么产生?它可以被掌握吗(Is it edible)?如果它真如其倡导者所言,为什么没有在行业中得到更广泛的使用?为什么好像只有那些拿着博士学位的人才使用它?最要紧的是,为什么它就 TMD 这么难学?这些 closure, continuation, currying,惰性求值和无副作用等等究竟是些什么东西?没有大学参与的项目怎么使用它?为什么它看上去这么诡异于和我们命令式思想友好,圣洁和亲近 的一切的一切?我们将于不久扫清这些疑问。首先让我来解释形成实际生活和学界文章之间巨大隔阂的缘起,简单得像一次公园的散步。 Read more…
study
Recent Comments