erlang学习
By admin
先是过了一遍Erlang程序设计中文版(完整书签)。
之前在html5里看过js的webworker,当时觉得看明白了,但是现在才觉得是真的明白了那玩意什么用处,也是一个进程之间的消息传递机制。
然后打算看building_web_applications_with_erlang,发现看不下去。只好又看Erlang_OTP并发编程实战,之后对OTP有了一定了解,主要是稍微熟悉了一下OTP程序的的写法和handler。
然后再看building_web_applications_with_erlang,大概明白了,但是不太看好yaws,几年来一直依赖rails的方便,这种底层的框架要自己从头写很多东西太累,也没谱。
最后提到了ChicagoBoss,是个类rails的framework。但是按照github上的教程,编译总是报错,最后连例子也跑不起来。
后来又转到了n20,看了看文档,比ChicagoBoss完善,但复杂程度也多了,短时间吃不下去。先下了个例子运行了一下,发现和传统的web程序相差太多,除了最初的页面载入之外几乎完全是用websocket来处理。为了这个又过了一遍cowboy的guide。n2o的教程反复弄了N天,也没懂,看来步子跨大了扯了蛋。后来看了nitrogen的教程http://nitrogenproject.com/doc/tutorial.html,才逐渐自己开始明白了。最后感觉n2o用的bert这个js库没用json,教程里也明确写了不支持json,大概和angularjs比较难搭配吧,弃之。看了cowboy的教程之后突然感觉直接用cowboy来写好了,将erlang和rails结合一下erlang部分做api用,rails做一些页面生成,页面用rails生成的静态html模板,后台请求都用json请求到cowboy上。
nitrogen里的wf模块令我很在意-_-,后来从源码里发现是web framework的缩写…
rebar相当于ruby的bundle,解决依赖包问题。rebar里的ling_builder,是部署到虚拟机用的,大概看了看,还不太懂,但是感觉是部署到amazon服务上用得到,自己的服务器大概不用这个。rebar与reltool.config配套使用发布。
经过几天的使用发现rebar bug多,编译的时候erlydtl模板总是报错。现在是2014年了已经,
https://github.com/rebar/rebar/issues/46这个bug现在好像还是这样,说是已经fix但是我这下载最新的rebar重新编译之后还是报错,而且每次编译能生成一个view文件,然后报错退出,改rebar.config的erlydtl_opts, [retrun_errors]也没起作用,多编译两次就都生成了,模板文件少的时候还行。erlang.mk,一开始也出错,在Makefile里加上
ERLC_OPTS =
覆盖 -Werror的选项,关闭错误报告(隐约感觉不太对,可能导致应该报错的地方也不报了)。
这样以来就可以编译了,但是默认编译模板为xxx_dtl.beam,可能需要增加个批量改名功能在Makefile里。
erlang.mk 把makefile几乎全包办了,其中解决依赖的功能和rebar有些重叠。https://medium.com/p/708597c0dd08,我个人也倾向与用erlang.mk,因为相对简单,但是n2o的那些东西全都用rebar。erlang.mk与relx.config配套发布用。
rebar的wiki,他管compile、dependency和test。rebar可以在一开始创建项目用,就像rails new一样,先创建一个骨架出来。
erlang.mk也都管这些。
relx在OTP那本书里有推荐,是书的作者之一开发的,发布erlang程序用,和erlang.mk有配套使用。
以下为备忘:
priv目录: 用于存放各种需要随应用一起发布的其他内容。包括但不限于模板文件、共享对象文件和DLL等。定位应用priv目录的方法很简单:调用code:priv_dir(),便会以字符串形式得到priv目录的完整路径。
.app 文件里的env 和 mudules书里没写,在线手册里有http://www.erlang.org/doc/design_principles/applications.html,modules是发布时将依赖一起打包的意思,env是application:get_env(app_name, env_name)用的
html模板用slim写,再用slimrb转换,js用coffeescript写,在开发模式的时候用watchr来监视并自动编译修改过的文件。既然铁了心要用angularjs,那erlydtl模板也几乎是用不到了,全部用静态html模板就可!
riak和couchdb一样,都是有restful的api的,这样的话,除了权限安全问题不算的话,前台angularjs+后台的database就可以搞定。但安全问题靠database层应该是没戏的,中间层还是需要,但erlang都可以不用解析json,直接把前后台的数据当string传递一下即可,仅仅管理安全与权限,在必要的时候解析一下json重新包装数据。
在riak已经弄了一阵子之后,看了riak的2i和search部分,觉得riak不太适合做比较复杂的后台程序,存储基于kv,v的内容可以是任意,所以在v的内容上的搜索和索引都不会方便,导致在复杂搜索和分页方面的实现可能会有问题,不是不能实现,而是实现相对太复杂,而且可能由于程序员经验不足会导致长期不能解决的搜索效率问题,还有就是短期内不会有类似active_record那样实现模型关系的方便的封装,难道还是要用mysql,先看看couchdb吧,用基于文档的来试试。mongodb虽然更成熟一些,但在分布上面不如erlang编写的有分布优势。后来看了一下http://nosql-database.org/的分类,riak是在kv分类里,更确实了我的这个想法,我还是需要确定一个document store类型的数据库。
http://labs.linkfluence.net/nosql/2011/03/07/moving_from_couchdb_to_riak.html这篇写的也是将存储转到riak上,人家也没用riak做查询用。
然后转到couchdb上,但最后由于种种原因,还是不能符合要求。