erlang 安装有什么奇技淫巧

英['?:lae?]
美['?:lae?]
厄兰(话务单位)
1.a unit of traffic intensity in a telephone system
只有登录后,才能查看此项,现在是否?
好文推荐:在开发网页游戏服务端方面?c++/erlang/java或者其它语言,优劣分别是什么呢?_百度知道在技术层面上,和Erlang/OTP 相比,Node.js有什么优势_百度知道【erlang工程师岗位职责|erlang工程师是做什么的】-看准网
erlang工程师工资所有工资由公司员工匿名提交
各公司erlang工程师工资
最后更新&&
平均工资/月
最高工资 ¥7,400
最低工资 ¥3,400
最高工资 ¥6,800
最低工资 ¥6,800
最高工资 ¥3,400
最低工资 ¥3,400
最高工资 ¥11,500
最低工资 ¥11,500
最高工资 ¥4,000
最低工资 ¥4,000
(共19条,18个公司)
erlang工程师面试所有面试经历由面试过该职位的用户匿名提交
匿名用户面试的Erlang工程师&-& 成都
感觉没戏&&&面试感受:一般&&&面试难度:有难度
面试经历:
进去就是到前台拿笔试题做,共5道题,四道算法一道考验面向对象的理解题,这些题并不是专用招哪一个语言的专用题,而是程序员通用题。有道排序题,本来开始准备写一个快排的,但当时有点紧张,怕写错,而且笔试时不准用手机,所以后来还是写了个简单的冒泡。题做完了就让你等通知,不知道是前台还是Hr说大概要等一周的时间。
匿名用户面试的erlang工程师&-& 广州
感觉没戏&&&面试感受:一般&&&面试难度:一般
面试经历:
首先是上机填个人信息,然后还是上机,做笔试,大多数的简答题,但是比较基础,接着就是人事面,最后才是技术面,基本上都是围绕笔试题来提问。
(共7条,6个公司)
erlang工程师就业趋势
erlang工程师热门公司工资
2条信息1&&0.0
1条信息2&&0.0
1条信息3&&2.8
1条信息4&&0.0
1条信息5&&3.5
1条信息6&&0.0
1条信息7&&0.0
1条信息8&&0.0
1条信息9&&4.0
1条信息10&&0.0
erlang工程师热门公司面试
2条信息1&&4.0
1条信息2&&3.5
1条信息3&&2.8
1条信息4&&0.0
1条信息5&&0.0
1条信息6&&0.0
请问您的需求是
求助职业问题
查看公司点评
找到合适的职位投递简历
找到正在招聘的Boss直接谈
求助职业问题
在问答功能提出你的问题
找到正在招聘的Boss直接问
查看公司点评
搜索关心的公司看匿名点评
与关心的Boss直接聊Erlang有什么奇技淫巧?
有意思的日常小总结:1. Erlang Shell小技巧:v(Line). %%把Line行函数重新执行一次
v(-1). %%把前一行的函数重新执行一次
rr(Module).%%把Module中的Record加载到Shell中,【超有用】
rr("*/*"). %%把在这个子目录下的所有Module里面的Record给加载到Shell里面
after Time这个Time最大值是50*24*60*60*1000,当时间大于50天时(这种场景真是少之又少),就会报错:
所以要把Time拆成小于最大值的列表: normalize(Time) –&
Limit = 49*24*60*60,
[Time rem Limit | lists:duplicate(Time div Limit, Limit)].
loop([T|Next]}) –&
{Server, Ref, cancel} –&
Server ! {Ref, ok}
after T*1000 –&
if Next =:= [] –&
Server ! {done, S#state.name};
Next =/= [] –&
loop(Next})
用于把信箱中特定的消息清空:flush_timeouts() -&
{timeout, TRef, ?MODULE} when is_reference(TRef) -&
flush_timeouts()
after 0 -&
3.相比于在列表List尾加数据:1& List = [1,2,3].
2& lists:reverse([4|lists:reverse(List)]).
或:3&List++[4]
Binary可以在头或尾任意加数据:4& Bin = &&1,2,3&&.
5& &&Bin/binary,4&&.
&&1,2,3,4&&
4. gen_server 的call_back函数返回值里面有一个timeout时间:如init/1的返回值:{ok,State} | {ok,State,Timeout} | {ok,State,hibernate}| {stop,Reason} | ignoreState = term()Timeout = int()&=0 | infinityReason = term()If an integer timeout value is provided, a timeout will occur unless a request or a message is received within Timeout milliseconds. A timeout is represented by the atom timeout which should be handled by the handle_info/2 callback function. The atom infinity can be used to wait indefinitely, this is the default value.gen_server 设置了超时后,一旦超时触发,就会产生一条由原子timerout构成的带外信息,这个消息将由handle_info/2处理,该机制常用于处理服务器 在超时时间内未收到任何请求的情况下,用它来唤醒服务器燕执行一些指定的操作。一个众所周知的技巧:让iniit/1函尽快结束以免 start_link(....)挂起。些些同时,你也能确保服务器立即跑到指定的handle_info/2处理timeout处继续执行未完成的更加 耗时的操作。上一节出自Eralng OTP并发实践P95:5. 保护式(guard)中如果出错,不会crash,只能返回false:case 1=:1 of
true when not erlang:length(t) =:= 1 orelse true -&
Result is:
error保护式中对t (atom) 求length会出错,本应crash掉,但因为在保护式中,默认出错后结束此保护式计算并返回false,这也是为什么保护式不接受复杂的函数,只能用erlang的bif来做的原因之一。6.如果是把本节点上所有的Erlang节点都杀死(测试时非常有用):killall beam.smp
7.对于gen_server标准的进程,可以使用sys模块来对进程做你想要做的任何处理:允许自定义trace函数, 记录所有类型的事件等等。 它非常完善且可以很好地用于开发。 但它会稍微影响处于生产 环境的系统, 因为它没有把IO重定向到远程的shell中, 而且他没有限制trace消息的速度。如查看一个进程的数据:sys:get_status(whereis(Server)).
8.rpc:call/4 会把使用io:format的打印字符在本地打印:(foo@host) rpc:call('bar@host', io, format, ["~p", [test]]).这会在foo节点上打印test。这是因为rpc:call时会默认把本节点的group_leader传过去所以:如果使上面的操作在远程节点上直接打印出来:erl -sname a
(a@localhost)1& global:register_name(global_io_srv, group_leader()).
erl -sname b
(b@localhost)1& net_kernel:connect(a@localhost).
(b@localhost)2& io:format(global:whereis_name(global_io_srv),"it should be printed on remote node~n",[]).
9.使用receive达到收消息时不同的优先级:receive -&
{priority_msg, Data1} -& priority(Data1)
{priority_msg, Data1} -& priority(Data1)
{normal_msg, Data2} -& normal(Data2)
10.如果想生成非常长的list 如:lists:seq(1,).
非常慢且一次性占用超多的内在(有可能造成进程crash)。可以转为动态生成的方式:-module(lazy).
-export([seq/2]).
seq(M, N) when M =& N -&
fun() -& [M | seq(M+1, N)] end;
seq(_, _) -&
fun () -& [] end.
1& Lists = lazy:seq(1, ).
#Fun&lazy.0.&
2& hd(Lists()).
3& Lists2 = tl(Lists()).
#Fun&lazy.0.&
4& hd(Lists2()).
11.进程中邮箱里面的存着的messages会在每个新message来之后重新匹配一次:start(State) -&
{ok, spawn(fun() -& loop(State) end)}.
loop(State) -&
first_msg when State == nil -&
io:format("first_msg when state == nil"),
loop(first_msg);
second_msg when State == first_msg -&
io:format("second_msg when state == first_msg"),
loop(second_msg)
1& {ok, Pid} = msg_test:start(nil).
{ok,&0.53.0&}
2& Pid ! nil.
3& Pid ! second_msg.
second_msg
4& Pid ! first_msg.
first_msg when state == nilfirst_msg
second_msg when state == first_msg
12. erlang:get_stacktrace()
Get the call stack back-trace (stacktrace) of the last exception in the calling process as a list of {Module,Function,Arity,Location} tuples.得到的此进程最后一次的exception,如果你在没有发生exception处查看堆栈调用,就应该:Trace = try throw(42) catch 42 -& erlang:get_stacktrace() end,
erlang:display(Trace)
recursion 与 recursion的区别例子:求值2的5次幂使用非尾递归实现:pow(x, 1) -&
pow(x, N) -& x * pow(x, N-1).
其调用过程:pow(2,5)2 * pow(2, 4)2 * (2 * pow(2, 3))2 * (2 * (2 * pow(2, 2)))2 * (2 * (2 * (2 * pow(2, 1))))2 * (2 * (2 * (2 * 2)))32注意到真正的计算开始是在最后的pow(2, 1)然后再一步步反推回pow(2,5)才得到的结果。再看看尾递归的实现tail_pow(x, 1, acc) -& x *
tail_pow(x, N, acc) -& tail_pow(x, N-1, acc * x).
其调用过程:tail_pow(2, 5, 1)tail_pow(2, 4, 4)tail_pow(2, 3, 8)tail_pow(2, 2, 16)tail_pow(2, 1, 32)32可以看出他的求值顺序就是从5到1的,两点一对比,可以更加理解Joe所说的:The important thing to note about tail-recursive functions is that they can run in loops without consuming stack space. Such function are called “iterative functions.使用以上2个例子求2的1次幂到2的64次幂之和(不要使用等比数列求和公式2的65次幂-1。。)对比下时间会更加直观。可以这样:timer:tc(fun() -& lists:foldl(fun(x,acc) -& pow(2,x)+ acc end, 0, lists:seq(1,64)) end).
timer:tc(fun() -& lists:foldl(fun(x,acc) -& tail_pow(2,x,1)+ acc end, 0, lists:seq(1,64)) end).
gen_server的loop就是尾递归的典范。如果你觉得理解了,请尝试用纯erlang实现高效的lists:append/2和lists:concat/1(不要借助于lists模块的函数和 ++ 哦)测试用例:mylist:append(lists:seq(1,1000000), lists:seq(0000))
mylists:concat([begin lists:seq(1,10) end||Small &- lists:seq(1,1000000)]).
看看你会用多久~14.如果你发现crash时的堆椎调用信息不够详细或太过详细,都可以使用erlang:system_flag(backtrace_depth,10).
来调整,默认为8。15.判断空列表case List of
[_|_] -& do_not_empty_work(List);
_ -& do_other_work(List)
16.io_lib:format/2里面的占位符自动补全功能。1010& {{Year, Month, Day}, {Hour, Min, Sec}} = calendar:local_time(),
lists:flatten(io_lib:format("~4..0w~2..0w~2..0w~2..0w~2..0w~2..0w",[Year, Month, Day, Hour, Min, Sec])).
17. 保护式中andalso/orelse与;/,的区别andalso/orelse如果表达式crash掉,那么整个表达式会返回false, 后者则只是crash部分返回false.21& F1 = fun(X)when X/0 == 0; true -& X;
21& (X) -& X+1 end.
#Fun&erl_eval.6.&
22& F1(10).
23& F2 = fun(X)when X/0 == 0 orelse true -& X;
23& (X) -& X + 1 end.
#Fun&erl_eval.6.&
24& F2(10).
15.判断空列表case List of
[_|_] -& do_not_empty_work(List);
_ -& do_other_work(List)
你的代码跟标题不符合。上面的代码更适合用来判断非空列表。因为优先匹配的是非空的情况。如果需要判断空列表,为啥不直接跟"[]"比较呢?从执行效率上看,直接跟"[]"比较会比较快。
erlang不需要奇技淫巧, 我觉得能遵循fp编程范式,把代码和文档写清晰是最大的功力。推荐个项目:recon 见
是个很好的教材,非常漂亮。
当在gen_server 的handle_call中有费时操作,但是State需要马上更改的场景下。可以试试在handle_call中创建进程。foo(X) -&
gen_server:call(?Mod, {foo, X}).
handle_call({foo, X}, From, State) -&
State1 = func1(X, State),
State2 = func2(X, State),
spawn_link(fun() -& do_something(State1, X, From) end),
{noreply, State2}.
do_something(State, X, From) -&
Reply = func3(X, State),
gen_server:reply(From, Reply).
gen_server状态已经改为State2,但此时不返回给调用者,等do_something完了,才会reply回去。
为什么知乎上的程序员都觉得自已说的话都是真理,看起来好牛B的样子。但总让人觉得一直在语言的表面浮着,没有一些很有哲理的总结呢。看过之后,觉得各位大神说的话都好像不那么可信。好像大神们的思唯是一直停自已的那一边,对自已分析的总好像头头是道。觉得从来没有正真怀疑过自已的能力,难道知乎上的真的都是神一样的人物么。思考问题总是单纯的表达自已的观点,从来没有考虑过不与自已相同的人为什么会用其他方法,也没有考虑过与自已思维方式不同的人为什么会不同。所以我不喜欢知乎的氛围。
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 erlang otp是什么意思 的文章

 

随机推荐