随笔分类 -  erlang

gen_event中的handler和supervised handler
摘要:呃,在gen_event中有两个添加handler的方法gen_event:add_handler/3gen_event:add_sup_handler/3一开始总是有些迷惑两者的区别,今天查看了gen_event源码,总算弄清两者的区别。add_handler添加的只是把gen_event作为容器,仅仅在适当的时间调用模块的回调函数。(后面我描述为normal handler)而add_sup_hander除了在适当的时间调用模块的回调函数以外,同时link到调用该函数的进程。(后面我描述为supervised handler)首先看看在gen_event中描述handler的record- 阅读全文
posted @ 2013-05-23 17:15 文武双全大星星 阅读(402) 评论(0) 推荐(0)
riak_core的哈希散列初探
摘要:我们知道在riak_core中使用的是一致性哈希算法(关于该算法看我的日志:http://www.cnblogs.com/star-star/archive/2013/02/01/2888713.html)首先我们先看看riak_core_app:start/2启动时候的代码,可以看到设置默认的bucket属性。%% add these defaults now to supplement the set that may have been %% configured in app.config riak_core_bucket:append_bucket_defaults( ... 阅读全文
posted @ 2013-05-14 15:13 文武双全大星星 阅读(385) 评论(0) 推荐(0)
rebar发布项目记录(二)
摘要:有时候需要项目依赖其他的开源项目(比如lager),这时候我们回到example目录下,编辑rebar.config文件:%%-*- mode: erlang -*-{erl_opts, [{parse_transform, lager_transform}]}.{sub_dirs, ["rel"]}.{deps, [{lager, ".*", {git, "git://github.com/basho/lager.git", "master"}}]}.修改rel目录下reltools.config,为:{sys, 阅读全文
posted @ 2013-05-09 16:18 文武双全大星星 阅读(277) 评论(0) 推荐(0)
rebar发布项目记录(一)
摘要:首先创建目录example,进入目录创建app:[admin@localhost ~]$ mkdir example[admin@localhost ~]$ cd example/[admin@localhost example]$ rebar create-app appid=example==> example (create-app)Writing src/example.app.srcWriting src/example_app.erlWriting src/example_sup.erl创建Makefile如下:all: deps compile compile: rebar 阅读全文
posted @ 2013-05-09 10:44 文武双全大星星 阅读(391) 评论(0) 推荐(0)
poolboy简单阅读
摘要:poolboy是一个erlang编写的线程池框架,代码很简洁,项目地址:git://github.com/devinus/poolboy.git具体用法,项目上有对应范例。现在查看一下源码首先看看初始化部分:init({PoolArgs, WorkerArgs}) -> process_flag(trap_exit, true), Waiting = queue:new(), Monitors = ets:new(monitors, [private]), init(PoolArgs, WorkerArgs, #state{waiting = Waiting, moni... 阅读全文
posted @ 2013-05-06 17:24 文武双全大星星 阅读(744) 评论(1) 推荐(0)
erlang进行简单的无盘加载引导
摘要:首先,有内网两台机器:10.80.3.97 作为master,所有的代码都放在该机器上。10.80.3.98 作为slave,从master通过网络进行引导。根据kernel文档中提到的,我们可以在两个台机器上,分别如下启动两个节点(注意虚拟机最好是同一版本,安装在同一目录下):erl -kernel start_boot_server true boot_server_slaves '[{10,80,3,97}, {10,80,3,98}]' -name master@10.80.3.97 -setcookie aerl -name slave@10.80.3.98 -loa 阅读全文
posted @ 2013-04-28 17:18 文武双全大星星 阅读(458) 评论(0) 推荐(0)
简单的反汇编beam文件
摘要:beam文件的格式是 "EA IFF 1985"标准的变种,它把数据分为多个chunks。有时候我们会有这样一种需求,我们想通过beam文件得到源代码,这时候我们首先要想到的是beam_lib模块beam_lib可以用不同的标识符来访问Chunk数据,而标识符又分为两类,atoms和strings,通过atoms访问到的chunk返回的都是Compound terms而通过strings访问到的是binary。当然了,其实我们可以理解成两张哈希表,分别保留着不同类型的Key和Value值,便于用户访问,其实我们最频繁使用到的就是beam_lib:chunks/2,beam_ 阅读全文
posted @ 2013-02-28 10:01 文武双全大星星 阅读(4735) 评论(1) 推荐(0)
supervisor_bridge使用
摘要:有时候我们原先设计了一套系统,可是并没有按照otp的标准来实现,可是我们又想使用otp进程树的形式对其进行监督和管理时,这种情况下,我们就可以使用supervisor_bridge进行桥接。如果我们想将进程纳入进树的管理,一般来说,无非是实现gen_server, gen_event, gen_fsm等behaviour,然后用supervisor模块进行管理。所以supervisor_bridge本质上是一个实现了gen_server behaviour的模块,作为一个子系统进程的容器,定义了两个回调函数。init/1:supervisor_bridge进程初始化时,对子系统的回调。term 阅读全文
posted @ 2013-02-26 13:41 文武双全大星星 阅读(406) 评论(0) 推荐(0)
erlang如何保存全局状态
摘要:其实一开始是看到mailinglist有对于这个的讨论,我就加上了自己的理解扩展概括了一下,存此。首先我们要确定erlang中像全局变量这种东西是不存在的,如果你非要保存一个全局的状态也并非不可以实现。1.使用ets,将其指定为public, 这个不用多说了,随取随用。2.将其保存在一个固定进程中,无论读取都对其发出message进行操作,这个本质上并不违反以进程为中心的原则。3.使用application:set_env, application:get_env(但我看了一下application_controller的源码,其实本质上也只是往一个叫ac_tab的public ets中读写, 阅读全文
posted @ 2013-02-19 19:06 文武双全大星星 阅读(1842) 评论(0) 推荐(0)
erlang元编程杂谈(一)
摘要:说起元编程,lisp的抽象能力无疑是最强的,独特的S-expression和macro,简直是居家旅行,杀人必备之神器= =其实erlang的元编程能力也不弱。让我们一切先从smerl开始,慢慢了解erlang的metaprogrammingsmerl是erlyweb项目中内部使用的一个模块,它可以让我们很容易的动态创建编译模块,动态添加function等等。首先我们来热下身,先做个小功能,动态创建一个叫hello_world的模块,往中间添加一个echo函数,打印出"hello, world!"-module(test).-compile(export_all).test 阅读全文
posted @ 2013-01-25 15:47 文武双全大星星 阅读(739) 评论(0) 推荐(0)
解决一个关于erlang分布式连通性的小问题
摘要:今天在将erlang部署到不同机器上时候,启动节点,发现net_adm:ping完全ping不通。按我以前的经验,首先ping了一下两台机器的ip,彼此间网络是没有问题的。又看了一下empd(你可以理解成就是erlang内部所使用的dns) 所使用的4369端口,同样也是可以的,这下纠结了……查了一下网上的资料,想起来erlang节点启动时候也监听的一个动态端口,用于数据传输。所以使用empd -names查看了一下,结果如下:再看看防火墙,果然悲剧了……但是节点监听的端点是动态变化的,我又不想把防火墙全部打开,查查kernel的文档,发现了这两个参数{inet_dist_listen_min 阅读全文
posted @ 2013-01-15 10:06 文武双全大星星 阅读(922) 评论(0) 推荐(0)
cowboy源码剖析(二)
摘要:在上一篇日志里,我介绍了cowboy 的socket pool —— ranch。接下来,接着来介绍cowboy,本篇主要介绍从接受到客户端消息请求,解析,一直到路由的过程。首先,我们需要看的是cowboy_protocol模块,这个模块就是和ranch的衔接点(请看我上一篇日志http://www.cnblogs.com/star-star/archive/2012/12/19/2824008.html的分析),首先来看看每个session的初始化逻辑过程。start_link(ListenerPid, Socket, Transport, Opts) -> Pid = spawn_l 阅读全文
posted @ 2013-01-08 11:11 文武双全大星星 阅读(569) 评论(1) 推荐(0)
erlang推演实现Y组合子,实现匿名函数递归
摘要:Y组合子是用于lambda演算中实现递归逻辑的。当我们用erlang实现一个递归的匿名函数来完成阶乘,第一印象应该会写成如下这种形式:F = fun(1) -> 1; (N) -> N * F(N -1) end.如果我们在程序代码中按照这种方式书写,在数学推演中是不可能的,(虽然现代编程语言中有些编译器可以识别的),因为在lambda函数定义时,F还根本没有意义。这时候我们该怎么办呢, 如果要实现这种递归函数, 我能想到的就是把这个F变成约束变量,那么可以假设出另外存在一个高阶函数,将F作为参数传递进去,则得到F = fun(Func) -> fun(1) -> 1; 阅读全文
posted @ 2013-01-05 18:09 文武双全大星星 阅读(717) 评论(0) 推荐(0)
init模块的引导过程解析
摘要:erlang的启动引导部分代码,本文章讲解的是排除C源码,从erlang代码开始的部分,C代码部分以后补充,otp_ring0:start/2为第一个函数调用,源码内容很简单,我就不贴出来了,就是一个调用init:boot/0的功能。接下来,我们分析init:boot/0的流程init() -> register(init, self()),%将本进程注册为init进程 process_flag(trap_exit, true), start_on_load_handler_process(), %spawn一个?ON_LOAD_HANDER进程,但并没有link {S... 阅读全文
posted @ 2012-12-28 11:50 文武双全大星星 阅读(585) 评论(0) 推荐(0)
boot启动脚本的解析执行过程
摘要:这个启动脚本默认是在$ROOT/bin/start.boot文件,所以我们查看一下相应的start.script文件,内容如下%% script generated at {2012,11,27} {19,37,10}{script, {"OTP APN 181 01","R15B03"}, [{preLoaded, [erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip, zlib]}, {progress,preloaded}, {path,["$... 阅读全文
posted @ 2012-12-27 17:27 文武双全大星星 阅读(716) 评论(0) 推荐(0)
erl的启动参数分析
摘要:关于erl的启动参数主要分为emulator flags,flagsandplain argumentsemulator flags:以‘+’开头的启动参数,如+P, +W等用于控制模拟器的行为。flags:以'-'开头的启动参数,如-sname, -boot等,这些需要被传递给ert中的init模块进行解析处理。plain arguments:没有详细的定义,基本就是除了以上emulator flags,和flags,其他的都属于此类。用户自定义的flag, 在init对arguments的解析过程中进行解析和存储。模拟器flag主要控制emulator的行为或者配置,这部分 阅读全文
posted @ 2012-12-26 15:43 文武双全大星星 阅读(1174) 评论(0) 推荐(0)
刚遇到的一个module加载的小问题
摘要:最近clone了一个开源项目最新版本,代码启动的时候总是报错,超纠结,以前没这问题啊= =查看了源码错误是在erlang:function_exported(xx, xx, 0)这个函数位置。代码的执行依赖于这个函数的返回,API对此函数的说明是:Returnstrueif the moduleModuleis loaded and contains an exported functionFunction/Arity; otherwisefalse.但明明模块是有这个导出函数的啊,然后我在控制台再次手工调用了一次这个方法,显示结果是true。第一次调用时返回false,第二次调用时返回tru 阅读全文
posted @ 2012-12-25 15:44 文武双全大星星 阅读(266) 评论(0) 推荐(0)
cowboy源码剖析(一)
摘要:cowboy是一个用erlang编写的简洁,快速的http server,代码质量很高。最新版本的代码貌似把原先的网络层socket pool剥离出来,做成了一个新的项目ranch。所以首先我们先来分析一下ranch。分析ranch代码首先必须明确三个关键概念:Listeners:A listener is a set of processes whose role is to listen on a port for new connections. It manages a pool of acceptor processes, each of them indefinitely acce 阅读全文
posted @ 2012-12-19 14:25 文武双全大星星 阅读(556) 评论(0) 推荐(0)
proc_lib的简单分析
摘要:该模块主要用于gen模块中同步和异步创建进程翻开源码,就会发现最底层实际就对是erlang模块中几个spawn相关的bif做了一层代理。而proc_lib:sync_wait/2 和proc_lib:init_ack/1,2在初始化时的配对使用,又为上层提供了同步初始化的功能。添加这层封装,主要目的在于,在进程初始化的过程中往进程字典中注入一些我们感兴趣的信息。1.累积'$ancestor'字段, 基本就相当于进程树的祖先节点了,这是一个list。2.添加'$initial_call'字段, 字面意思也知道是初始化调用函数了。而进程字典中的这些信息, 在进程初始 阅读全文
posted @ 2012-12-17 11:19 文武双全大星星 阅读(234) 评论(0) 推荐(0)
error_logger的简单介绍
摘要:error logger本质上是一个事件管理器 (gen_event),可以根据需求绑定替换新的事件处理器。只需要几条特定的几条message进行处理,就可以方便的扩展一个error_logger事件处理器。error_logger进程启动后,默认绑定一个error_logger的handler。这里有一个细节就是group_leader的概念(后面我会写篇文章详细介绍),error_logger默认处理器同时将事件传递到group_leader所在的节点上,这样就隐藏了本地和跨节点log的细节。在stdlib中有两个模块error_logger_tty_h和error_logger_file 阅读全文
posted @ 2012-12-14 09:55 文武双全大星星 阅读(761) 评论(0) 推荐(0)