在使用过程中,发现了sub binary的优化似乎有Bug,先上代码: -module(dame_shit). -export([main/0, dame_shit/1, dame_shit2/1]). dame_shit(Bin) -> dame_shit(Bin, <<"\r\n">>, not_found). dame_shit(Bin, _, found) -> {found, Bin}; dame_shit(<<Tag:2/bytes, T/binary>>, Tag, not_found) -> dame_shit ...
在Erlang的 DOC erl5.6.3/doc/efficiency_guide/binaryhandling.html#4 中,第四章提到了Binary的优化。由于虚拟机经过了改良,一些在R11B使用的Binary优化技巧,在R12B就不推荐使用了。 特别注意的是sub binary的使用。举个例子,从一个大的Binary中取出以某个字节结束的一句: extract_str_end_with_tag(Data, Tag) -> extract_str_end_with_tag2(Data, <<>>, Tag). extract_str_end_with_ ...
2008-06-07

一种简单的UUID生成方法

关键字: uuid
maillist有人提供了一种简单的UUID生成方法: 引用1> crypto:start(). ok 2> <<I:160/integer>> = crypto:sha(term_to_binary({make_ref(), now()})). <<41,73,124,217,87,62,82,238,224,153,122,195,244,246,157, 142,88,71,76,61>> 3> lists:flatten(io_lib:fwrite("~40..0s", [erlang:integer_to_list(I, 16)])). "29497CD ...
最近有些空,继续捣鼓consisten hash的简单实现。先前修改gb_trees,加入了lookup_nearest(Key, Tree) 函数,通过二叉查找和回朔,来查找最接近Key的项。昨天看了下xbaytable的DHT实现,发觉其实用ets会更快捷: ets:prev(Table, Key) 和 ets:next(Table, Key) 函数,可以返回Table中Key的上一个或下一个存在的键,无论这个Key是否存在于Table中。再加上 ets:first/1、ets:last/1、ets:lookup/2,就可以实现了。 实践过程中发现了个问题,需要定义这个哈希范围的最大值 ...
突然想做IP库的解析,用Erlang,自然就碰到了Big Endian & Little Endian的事 IP在DB文件中是以little endian存储的,跟搜索的IP比较时需要转换为一个Int值,Python代码可以这样: ip = unpack('I', buf)[0] 将一个IP串转换为Int值,则是 ip = unpack('!I', socket.inet_aton(ip))[0] 两者都转换为int之后就可以直接比较了 Erlang里面可以用Binary进行匹配,非常方便。 Little Endian 存储的Binary转Int: 1> <<Int:4/ ...
先推荐两篇文章: http://www.wagerlabs.com/blog/2008/02/parsing-text-an.html http://ppolv.wordpress.com/2008/02/25/parsing-csv-in-erlang/ (都需要爬墙访问,该死的‘功夫网’) Erlang中解析文本协议,使用Binary无疑是高效的选择,但是我发现,文章中,对Binary中各个字节组合为字符串,都是使用list的: NewList = lists:reverse([Char|OldList]) 而不是 NewList = binary_to_list(<<Old ...
以前不是很了解Erlang网络编程中流量控制,现在做一下笔记。 Erlang中Socket设置了{active, true}之后,接收到的网络消息会通过{tcp, Socket, Data}的格式主动发送给进程,这样做有个弊处就是没有做流量控制。要是有个客户端疯狂发包过来,服务器不做处理就等着堆溢出。 在《Programming Erlang》的14.2里面,介绍可以使用 {active, once} 来做控制。 {ok, Listen} = gen_tcp:listen(Port, [..,{active, once}...]), {ok, Socket} = gen_tcp:ac ...
一直一来没有留意到这个问题,今天偶尔在blog上看到,就标记一下,别让自己忘记了。 文章在 http://easyerl.blogspot.com/2007/10/high-order-functions-must-be-tested.html 测试代码如下: 1> Filter = fun(Elem) -> fun({Elem, _, _}) -> true; (_) -> false end end. #Fun<erl_eval.6.49591080> 2> C = Filter(cpu). #Fun<erl_eval.6.49591080> 3> C({test ...
  • 14:40
  • 浏览 (354)
  • 评论 (0)
2007-08-07

Java 和 Erlang 的列表元素添加测试

关键字: erlang java
maillist上面对 “VM & BEAM Specs : idea for improving, the lists support”的争论很有意思,我也随手测一把看看 JDK 1.5.0_11 Erlang/OTP R11B-5 $ javac ListAppend.java $ /home/jdk/bin/java -server ListAppend Total time:3439ms $ erlc list_append.erl $ erl -noshell -noinput -s list_append main -s init stop Total time:4408ms ...
  • 12:09
  • 浏览 (600)
  • 评论 (1)
2007-07-20

对Erlang R11B-5 ssl库的修正

关键字: erlang bugfix
http://www.trapexit.org/index.php/Distributed_erlang_using_ssl_through_firewalls 这篇文章提供了一种使用ssl连接来实现Erlang各节点间通信的方法。 但是我的同事经过试验,两个节点是ping不同的,这几天有人在网上提供了一个patch来解决这事情,但是patch有点问题,需要对源文件进行修改之后才能使用patch,这里提供一下patch后的文件和源文件。
  • 20:41
  • 浏览 (403)
  • 评论 (0)
AvinDev
搜索本博客
最近加入圈子
存档
最新评论