【转】使用target_system进行erlang应用的发行
原文地址:avindev.javaeye.com
原文作者:Avindev
好久之前捣鼓过的东西,怕忘记了,记录一下。
一个简单实现了OTP的Server:echoline,一个Helloworld级别的OTP应用,目录结构如下:
- ./src/echoline_app.erl
- ./src/echoline_sup.erl
- ./src/echoline_server.erl
- ./src/tcp_server.erl
- ./ebin/echoline_app.app
- ./priv/
- ./include/
- ./echoline_rel.rel
- ./Emakefile
这是一个普通的Erlang应用,可以直接使用 erl -make 来编译, Emakefile 内容如下:
- {'src/*', [debug_info,{i,'include'},{outdir,'ebin'}]}.
echoline_app.app 内容如下:
- {application, echoline_app,
- [{description, "Echoline Server"},
- {vsn, "1"},
- {modules, [echoline_app, echoline_sup, echoline_server, tcp_server]},
- {registered, []},
- {applications, [kernel, stdlib, sasl]},
- {mod, {echoline_app,[]}}
- ]}.
但是这个应用仅仅只能在安装了Erlang的环境下启动。这时候可以这样:
【转】Simple Dynamic Record Access
原文地址:Programming Experiments
原文作者:Brian Olsen
There is one thing I hate about Erlang, and it is records. It is not so much that the syntax is annoying (yet I am getting used to it), but you cannot use that syntax for dynamic field access; records are a compile-time feature.
So, without using Yariv’s Smerl for something like this, I opted for a simpler solution. Records are tuples after all, and you can get record information in a list. So, you can use these two facts to create a function to get the field you specify. Not anything stellar, but for dynamic record access, it works:
- find(Item, List) ->
- find_(Item, List, 1).
- find_(Item, [], _) -> not_found;
- find_(Item, [H|T], Count) ->
- case H of
- Item ->
- Count;
- _ ->
- find_(Item, T, Count+1)
- end.
- get_rec_value(Key, Rec, RecordInfo) ->
- case find(Key, RecordInfo) of
- not_found ->
- undefined;
- Num ->
- element(Num+1, Rec)
- end.
I couldn’t find something like “lists:find/2″, so I implemented my own. But the main function is “get_rec_value/3″. So you do this:
- 1> rd(person, {id, name, email}).
- 2> get_rec_value(name, #person{name="Brian"}, record_info(fields, person)).
- "Brian"
For fun, I also did setting record value.
- set_rec_value(Key, Value, Rec, RecordInfo) ->
- RecList = tuple_to_list(Rec),
- case find(Key, RecordInfo) of
- not_found ->
- Rec;
- Num ->
- List1 = lists:sublist(RecList, Num),
- List2 = lists:sublist(RecList, Num+2, length(RecList)),
- tuple_to_list(List1 ++ [Value] ++ List2)
- end.
- 3> set_rec_value(email, "c", #person{name="Brian", id="1", email="b"}, record_info(fields, person)).
I know this stuff looks really simple, but since I thought this was a bit of a nuisance, the fact that I cannot access records without hardcoding the values, something needed to be written.
Did I miss something though? I’d like to know. Please comment.
在 Comment 中, Philip Robinson 提供了解决这一问题的另一种方法。
他的方案是通过 EMP1 (Erlang Macro Processor v1) 在编译期解决这一问题。
[本文由 Sander 收集,Jackyz 对此进行了编辑(增加了原文链接和原文作者)]
jackyz: 对于我来说,好像并不觉得 Record 是一个多大的问题,呵呵。 ![]()
CEAN安装的Yaws如何启动?
最近被 CEAN 迷住了,能直接安装 Erlang ,省掉了漫长的编译过程。而且,大量 Package 可以随需安装,简直方便得不得了。不过,毕竟不是各个安装包本身。小问题总是有的。这时候,就需要 hack in 了。
一个严重的问题是 CEAN 弄下来的 Yaws 貌似不能正常的启动。忙活了半天,连 Yaws 都用不了,兴奋的输入 yaws:start(). 会返回给你若干错误,伤害劳动人民的感情啊。没关系,稍微进行一下深入的研究,我们就能找到办法。
【转】Erlang中的Module级别热部署
原文地址:avindev.javaeye.com
原文作者:AvinDev
Java里面要实现Code Replacement,也就是什么热部署,通常是使用ClassLoader机制。不久前看到了一篇Google的Paper,里面讲解的C++代码热部署更为复杂。
在Erlang里面,实现Code Replacement其实很简单,最方便的方法可以参考 《Erlang Reference Manual》的12.3:
- -module(m).
- -export([loop/0]).
- loop() ->
- receive
- code_switch ->
- m:loop();
- Msg ->
- …
- loop()
- end.
这种简单的HelloWorld例子,不能满足我的疑问。在一个更加复杂的应用里面,比如有多个Process,部分Process的代码更换后,其他没有更新的Process会怎样呢?下面做个试验。
【转】读《谈分布式网络程序设计》,思Erlang
原文地址:avindev.javaeye.com
原文作者:AvinDev
163的zhousen写了几篇文章,《谈分布式网络程序设计》
第一篇,第二篇,第三篇
简单谈谈感想。
1.网络数据的收发的设计方式
文中说:
使用select,一个线程专门负责所有的连接的接受和发送
通常在高性能的服务器程序 则使用的是第二种方式,占系统资源少,而且性能也很好。此外,流水线技术是目前cpu中最基本的技术之一,若将此用于网络程序设计,也可以大幅提高性能。 它在网络程序中的表现实际上就是使用队列,若请求的处理过程分好几步,那么在每一步都设置一个队列,性能比将大大提升。cpu的流水线技术的原因在于各个 部件都处于繁忙状态,所以cpu单位时间内处理性能提高。而网络程序采用流水线技术(队列)则能尽量促使各个节点处于繁忙状态,从而提高程序的性能
这种做法,目前我从事的项目也在使用,将逻辑转换为大量的Task,然后放在多个线程中以流水线方式执行,以此充分利用CPU。但是这种方法存在问 题,就是将对于每个连接,本应按照同步进行处理的逻辑,拆成了异步执行,在调错方面存在难度,而且程序也复杂了难于理解。如果使用Erlang,大可以一 个Process对应于一个连接,由于Erlang的进程调度都是在用户态完成,因此能够最大化使用CPU,而且调试等也是很方便。
Ten Questions with Sanjiv Shah(OpenMP)以及 Blah Blah
ThinkingParallel 发布了 Interviewing the Parallel Programming Idols 系列的第三部—— Ten Questions with Sanjiv Shah about Parallel Programming and OpenMP 让我对于并行计算的其他解决方案(这次是OpenMP)有了一些了解。
下面是 Blah Blah。
让WEB程序员FT的5大需求
正如我之前提到过的,俺这个“老人家”,做web开发,已经好多年了。
回想起来,这些年的开发之中,可能大家都曾经碰过一些在技术人员看来,极度“BT” 的需求。实话实说,其实,这些需求虽然天马行空,惊世骇俗,可仔细想来,如果能够实现,也挺有意思的。
简单回顾一下这些好玩的需求,大概也是一件有意思的事情吧。
【转】探索 Erlang Abstract Form
Potian的Blog上面,有一系列对Erlang Abstract Form的深入研究。由于版权原因,这里只贴出地址。
源地址:agileprogrammer.blogspot.com
最近貌似blogspot被ban了,可以使用这个地址取代访问
www.pkblogs.com/agileprogrammer
p.s,如今对Erlang底层分析的文章还是相当的少啊,大部分都是一些Paper。
【转】Erlang 的分布通讯安全策略
原文地址:avindev.javaeye.com
原文作者:AvinDev
Erlang的分布式通讯安全策略,可以归结为 All or None。要不拥有全部的权限,要不就完全没有。
它的节点安全设置,是通过一个magic cookie来实现的。这个文件默认放到
$HOME/.erlang.cookie ,文件内容是字符串。
当启用分布通讯的时候,这个magic cookie就很重要了。如果在命令行里面带上 -setcookie ,则在当前节点使用这个cookie值,否则会使用 $HOME/.erlang.cookie
目录结构习惯的Make解决
自从用惯了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 环境中完成嘛。新的文件路径是:


Recent Comments