惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
S
SegmentFault 最新的问题
D
DataBreaches.Net
H
Help Net Security
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Martin Fowler
Martin Fowler
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
罗磊的独立博客
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)

博客园 - 坚强2002

[Erlang 0129] Erlang 杂记 VI Graphviz绘制百家争鸣图 [Erlang 0128] Term sharing in Erlang/OTP 下篇 [Erlang 0127] Term sharing in Erlang/OTP 上篇 Elixir 1.0 Release [Erlang 0126] 我们读过的Erlang论文 读几首诗 [Erlang 0125] Know a little Erlang opcode "Becoming Functional" 阅读笔记+思维导图 [Erlang 0124] Erlang Unicode 两三事 - 补遗 [Erlang 0123] Erlang EPMD [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集 [Erlang 0121] 当我们谈论Erlang Maps时,我们谈论什么 Part 3 [Erlang 0120] Know a little Core Erlang [Erlang 0119] Erlang OTP 源码阅读指引 [Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2 [Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1 致鸡鸣狗盗 一个技术人的知识管理方法论
[Erlang 0118] Erlang 杂记 V
坚强2002 · 2014-03-06 · via 博客园 - 坚强2002
 做笔记
  1. 一开始笔记软件做的不好的时候就发邮件给自己,然后不断的回顾更新笔记;
  2. 后来用OneNote,由于这玩意当时不是云同步的,硬盘坏掉的时候丢了一些数据,打击还是挺大,好多事情要从头开始
  3. 再后来用过一段时间Google Wave,还以和朋友分享讨论笔记,结果,你们知道关闭服务了,费力导出来
  4. 现在转战Evernote和思维导图Conceptdraw
     记忆是靠不住的,会自然淘汰长时间不用的数据,一旦需要重新加载,如果从0开始那成本就太高了,而笔记和思维导图是自己思考方式的组织的,可以快速加载; 

       我一直认为"做笔记"对于我这种资质平庸的人是一个非常有威力的武器,加上经常性的回顾更新,能够看到自己能力成长过程,能够帮我把一个宏大的目标变成一件件具体的事情.经常的回顾可以让我把一个个知识点融入到自己的知识体系中.胡适先生说功不唐捐,但愿如此.

   下面这些内容零零散散记录了很久,当时记录的时候可能还是新东西,过了那么久新东西也都成常识了,算不得"新"了;删之可惜,继续放在Erlang杂记里面吧,无论如何都是一个知识积累的记录;另外,分享记录还可以发现盲点,比如下面代码就是我曾经的盲点之一,我曾经使用非常绕的方法解决ETS进程依赖Shell进程的问题,很快就有朋友指出其实只需要执行下catch_exception(true)就可以搞定.

Eshell V6.0  (abort with ^G)
1> self().
<0.33.0>
2> 1/0.
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  '/'/2
        called as 1 / 0
3> self().  %% 注意这里 已经重启
<0.36.0>
4> catch_exception(true).
false
5> 1/0.
* exception error: an error occurred when evaluating an arithmetic expression
    in operator  '/'/2
       called as 1 / 0
6> self().
<0.36.0>
7> 

    比起"你应该知道的XX","你必须知道的XX","原来你不知道XX","XX原来可以这样用","你可能不知道的XX",这些名字,"Erlang杂记"这个不招摇的名字能让我们更关注内容而不是纠结于"谁说我不知道了,你才不知道呢,就你知道",当然了"XX的76个原则"这种伪装人生导师颐指气使的鸡汤标题就更惹人厌了.

ETS 数据压缩

版本: R14B01 ERTS5.8.2

   compressed If this option is present, the table data will be stored in a more compact format to consume less memory. The downside is that it will make table operations slower. Especially operations that need to inspect entire objects, such as match and select, will get much slower. The key element is not compressed in current implementa

  如果使用了compressed选项,表数据在内存中会更紧密的排列,占用更少的内存.代价就是一些操作变慢,比如match,select.另外,因为压缩本身的开销,数据量不大的情况下做压缩可能适得其反,下面的第一个例子就是这样,test2表在压缩之后占用内存反而多了.目前的版本中Key没有做压缩.官方曾表示对于复杂数据可以达到50%甚至更高的压缩比.如果全局应用压缩策略可以使用 erl +ec 

 
 Eshell V6.0  (abort with ^G)
1> catch_exception(true).
false
2> ets:new(test,[named_table]).
test
3>  [ ets:insert(test,{N,1,1,2}) || N <- lists:seq(1,10) ].   
[true,true,true,true,true,true,true,true,true,true]
4>   
4> ets:info(test).
[{compressed,false},
{memory,389},
{owner,<0.33.0>},
{heir,none},
{name,test},
{size,10},
{node,nonode@nohost},
{named_table,true},
{type,set},
{keypos,1},
{protection,protected}]
5> ets:new(test2,[named_table,compressed]).
test2
6>  [ ets:insert(test2,{N,1,1,2}) || N <- lists:seq(1,10) ].   
[true,true,true,true,true,true,true,true,true,true]
7>   
7> ets:info(test2).
[{compressed,true},
{memory,399},
{owner,<0.33.0>},
{heir,none},
{name,test2},
{size,10},
{node,nonode@nohost},
{named_table,true},
{type,set},
{keypos,1},
{protection,protected}]
 
Eshell V6.0  (abort with ^G)
1> catch_exception(true).
false
2>  ets:new(t,[named_table]).
t
3> [ ets:insert(t,{N,[1,1,2],[a,b],{2,1,1024}}) || N <- lists:seq(1,100000) ].
[true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true|...]
4> ets:info(t).
[{compressed,false},
{memory,2314637},
{owner,<0.33.0>},
{heir,none},
{name,t},
{size,100000},
{node,nonode@nohost},
{named_table,true},
{type,set},
{keypos,1},
{protection,protected}]
5> ets:new(t2,[named_table,compressed]).
t2
6>  [ ets:insert(t2,{N,[1,1,2],[a,b],{2,1,1024}}) || N <- lists:seq(1,100000) ].
[true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true|...]
7>  [ ets:insert(t2,{N,[1,1,2],[a,b],{2,1,1024}}) || N <- lists:seq(1,100000) ].
[true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true,true,true,true,true,true,true,
true,true,true,true,true,true|...]
8> ets:info(t2).
[{compressed,true},
{memory,1414637},
{owner,<0.33.0>},
{heir,none},
{name,t2},
{size,100000},
{node,nonode@nohost},
{named_table,true},
{type,set},
{keypos,1},
{protection,protected}]
9> 

检查是否有旧版本的代码

R14B04 Erts 5.8.5 添加

-module(a).
-compile(export_all).
 v()-> 1.0.

Eshell V6.0  (abort with ^G)
1> c(a).
{ok,a}
2> a:v().
1.0
3> c(a). %% 代码已经修改过了
{ok,a}
4> erlang:check_old_code(a).
true
5> a:v().
2.0
6> 

erlang:external_size

R14B04 Erts 5.8.5 添加

erlang:external_size(Term) -> integer() >= 0

7> B= <<"binary_test_demo">>.
<<"binary_test_demo">>
8> erlang:external_size(B).
27
9> byte_size(B).
16
10> 

process_limit

Returns the maximum number of simultaneously existing processes at the local node as an integer. This limit can be configured at startup by using the +P command line flag of erl(1).

The previous default of a maximum of 32768 simultaneous processes has been raised to 262144

Tuple insert_element delete_element

 erlang:insert_element(2, {one, two, three}, new).
{one,new,two,three}
> erlang:delete_element(2, {one, two, three}).
{one,three}

float integer

> float_to_list(7.12, [{decimals, 4}]).
"7.1200"
> float_to_list(7.12, [{decimals, 4}, compact]).
"7.12"
> float_to_binary(7.12, [{decimals, 4}]).
<<"7.1200">>
> float_to_binary(7.12, [{decimals, 4}, compact]).
<<"7.12">>
13> erlang:binary_to_integer(<<"10204">>).
10204
14> erlang:integer_to_binary(10204).
<<"10204">>
15> 

Non-blocking code loading. Erts 5.10

  Earlier when an Erlang module was loaded, all other execution in the VM were halted while the load operation was carried out in single threaded mode. Now modules are loaded without blocking the VM. Processes may continue executing undisturbed in parallel during the entire load operation. The load operation is completed by making the loaded code visible to all processes in a consistent way with one single atomic instruction. Non-blocking code loading will improve realtime characteristics when modules are loaded/upgraded on a running SMP system.

这个有意思,后面我会做更详细的梳理.

Runtime's maximum number of ETS tables.  

Erts 5.10.4

16> erlang:system_info(ets_limit) .
2053
17> 

颜色RGB 表示与16进制表示转换

这个并没有什么难度,只是提醒想想问题的本质是什么,是不是手头的工具就可以搞定

1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:24>>.
<<240,154,41>>

io:printable_range

This flag affects what is interpreted as string data when doing heuristic string detection in the shell and in io/io_lib:format with the "~tp" and ~tP formatting instructions, as described above. [Doc]

[root@nimbus record]# erl  +pc unicode

Eshell V6.0  (abort with ^G)
1> io:printable_range().
unicode
2> io:format("~tp",["开心"]).
"开心"ok

2014-4-19 11:41:35补充

Run distributed Erlang through a firewall? 
The simplest approach is to make an a-priori restriction to the TCP 
ports distributed Erlang uses to communicate through by setting the 
(undocumented) kernel variables 'inet_dist_listen_min' and 
'inet_dist_listen_max': 

        application:set_env(kernel, inet_dist_listen_min, 9100). 
        application:set_env(kernel, inet_dist_listen_max, 9105). 

This forces Erlang to use only ports 9100--9105 for distributed Erlang 
traffic. 

 好,就到这里吧,昨天儿子闹了一晚上,今天真累了,晚安!

发表于 2014-03-06 22:57  坚强2002  阅读(4092)  评论()    收藏  举报

Powered By 博客园