打,打个大西瓜
老纪最近看了个短片,《打,打个大西瓜》,比较震撼,因为它是一个人做出来的,创意、音效、场景没话说,所以老纪特意推荐一下
这里是个链接:打,打个大西瓜
1. 监督规则
一个监督者负责启动、停止、监控他的子进程。监督者的一个基本概念就是当必要的时候重启子进程保证它们的存活
哪个子进程要重启和被监控是由一个子规程列表决定的,子进程按照列表中指定的顺序启动,并按相反的顺序终止
2. 实例
监督者的回调模块
-module(ch_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
supervisor:start_link(ch_sup, []).
init(_Args) ->
{ok, {{one_for_one, 1, 60},
[{ch3, {ch3, start_link, []},
permanent, brutal_kill, worker, [ch3]}]}}.
one_for_one是重启策略1和60定义了最大重启频率{ch3, …}是子规程
3. 重启策略
one_for_one
假如一个进程终止了,仅仅这个进程会被重启
one_for_all
假如一个进程停止了,所有其他子进程也要被停止,然后所有子进程,包括这个引发停止的子进程都被重启
rest_for_one
假如一个进程停止了,它后面的子进程,也就是以启动顺序来说这个被终止的进程后面的子进程都将被停止,然后他们又被启动。
1. 事件处理规则
在OTP中,事件管理器是一个事件可以发送到的命名对象,一个事件可以是一个错误、一个警告、或者一些要写入日志的信息
在事件管理器中,有0个、一个或者多个事件处理器被安装,当事件管理器被一个事件通知时,这个事件将被安装在事件管理器中的事件处理器处理,
事件管理器用一个进程实现,事件处理器用回调模块实现。事件管理器本质上维护一个{Module, State}列表,每一个Module为一个事件处理器,而State为事件处理器的内部状态。
2. 例子
事件处理器的回调模块把错误信息写入终端
-module(terminal_logger).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(_Args) ->
{ok, []}.
handle_event(ErrorMsg, State) ->
io:format("***Error*** ~p~n", [ErrorMsg]),
{ok, State}.
terminate(_Args, _State) ->
ok.
事件处理器的回调模块把错误信息写入文件
-module(file_logger).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(File) ->
{ok, Fd} = file:open(File, read),
{ok, Fd}.
handle_event(ErrorMsg, Fd) ->
io:format(Fd, "***Error*** ~p~n", [...]
对于在linux下用ftdi芯片的ubs转串口进行编程的人员来说,老纪下面讲的可就是你的福音了,自内核2.6.31-7到现在的2.6.31-16,ftdi_sio驱动都有个问题,就是能够正确识别usb转串口线,但就是通讯不了,老纪在曾做的一个项目中因为这个问题困扰了很久,最终找到了问题的症结,并找到了解决方案。
所有在驱动以上层面提供解决方案的都是徒劳,下面就是这个问题的解决之道
下载ftdi_sio驱动,链接在这里ftdifix.tar.gz,解压到一个临时目录
转移到那个目录,并make,确保你已经安装了内核头文件
在root权限下执行make install,这样就over了,你的usb转串口可以用了
翻译了老半天erlang-scala真锋对决,太长了,看来得一段时间,心急吃不了热豆腐,慢慢来吧。
今天看到firefox 4.0 界面预览,看样子它是借鉴了多种现代界面设计元素,重点借鉴了谷歌Chrome浏览器和微软Office 2010的界面,使界面清爽,操作更重点化。借鉴不是错,连牛顿都说站在巨人的肩膀上呢。
3.5到4.0菜单栏的变化在于将stop/refresh/go按钮3合一,以颜色区分。而且在有一个新的按钮 APP 按钮
APP按钮的作用类似windows 7 和office 2010的菜单按钮,把许多选项揉到这一个地方,去掉了 File\Eidt等这样长时间占地方的选项,而只留下一个Firefox的按钮在顶部
More »今天介绍erlang的一个非常重要的behaviour,就是gen_fsm-有限状态机,有限状态机的作用非常之多,比如文本解析,模式匹配、游戏逻辑等等方面的处理都是它的强项,所以这个behaviour非常之重要
1. 有限状态机
有限状态机可以用下面这个公式来表达
State(S) x Event(E) -> Actions(A), State(S’)
表示的就是在S状态时如果有事件E发生,那么执行动作A后把状态调整到S’。理解很好理解,如果能够熟练应用必须得下苦功,多练习。
2. 一个例子
erlang手册中用这个例子来解释的:开锁问题,有一个密码锁的门,它就可以看作一个状态机,初始状态门是锁着的,任何时候有人按一个密码键就会产生一个事件,这个键值和前面的按键组合后与密码相比较,看是否正确,如果输入的密码顺序是对的,那么将门打开30秒,如果输入密码不完全,则等待下次按钮按下,如果输入密码顺序是错的,则重新开始等待按键按下。
-module(code_lock).
-behaviour(gen_fsm).
-export([start_link/1]).
-export([button/1]).
-export([init/1, locked/2, open/2]).
start_link(Code) ->
gen_fsm:start_link({local, code_lock}, code_lock, Code, []).
button(Digit) ->
gen_fsm:send_event(code_lock, {button, Digit}).
init(Code) ->
{ok, locked, {[], Code}}.
locked({button, Digit}, {SoFar, Code}) ->
case [Digit|SoFar] of
Code ->
[...]
郁闷的一天,今天本想把openvpn配好,好能够浏览外边真正的精彩网站,呵呵,但是所有的安装配置都完成了,并且能从客户端ping通服务器,但是就不知道怎么才能穿墙, 设置了push “redirect-gateway def1″还是不行,究竟是怎么回事呢?就差这一步了,今天本想如果配置成功后把它写出来,好让大家参考,看来还多继续琢磨了,哎,一整天的时间呀!
中国现在的互联网环境,如果没有点崂山道士的法力还真的有点不行,继续努力,有高手吗,透漏透露!
今天看到一篇关于erlang和scala这两个分布式程序设计语言的文章,且对他们之间的好坏优劣做了个比较,老纪今天把它翻译出来供大家参考, 原文在这里
在我把时间浪费在可恶的社会新闻站点的活动上时,我看到越来越多关于scala的文章,我对scala开始感兴趣的主要原因有两点:1)scala是OO(面向对象)/FP(函数编程)的混杂体,我想任何把函数编程的理念引入到面向对象的世界都是很好的一件事。2)scala的actor库严重的受到erlang的影响,scala有时作为一个伟大的构建可扩展的并行应用语言而被提及到,就像erlang一样。
有几次,我看到scala和erlang的比较资料。erlang对于并行编程是非常好的,在他的应用环境中有很好的运行记录,但是他很难成为主流,他是陌生的,也没有很多库的支持。而scala这两点都很占优,他有函数编程的语义,他的Actors库提供了erlang式的并行,他运行在jvm上且能使用所有的java库,这些组合使scala在构建并行应用上成为更好的选择,特别是在java上已经有了投资的公司。
我没有用scala编过代码,但是我对他进行了一些很好的研究,看起来它是一个非常好的语言。我认识的一些最好的程序员都称赞过它。我想scala会是java的一个很好的替代品,函数对象、类型推导、混合、模式匹配都是非常好的语言特性,而这些正是java严重缺乏的。
尽管我相信scala是一个明显优于java的伟大的语言,但scala不会取代erlang成为我构建高可用、低延、大规模并行应用的语言。scala的actors库是一个大的改善,这是java在并行编程方面必须面对的。但是它没有提供所有erlang式并行的好处,而这使erlang在并行处理方面成为一个伟大的工具。我在这些方面做了大量的研究,这些是我认为一个人在scala和erlang中做出选择时而必须考虑的几个重要不同点。
extjs老纪曾经接触过,对于它能够实现桌面系统的大部分功能而感到折服,extjs的主要应用方面我认为主要是BS结构的企业应用,比如ERP、OA等,因为这种环境大部分构建于局域网内,访问速度会有保证,且通过extjs能够实现华丽的桌面效果和减少很大部分的编码工作
现在extjs发布了3.1版,更新了一下几个方面
IE内存方面得到优化和提高
优化了layout,layout的用途就是布局你的页面元素
事件管理器进行了重构
提高了灵活性
增加了新组件