2014/07/27

Using SSL for Erlang Distribution

http://www.erlang.org/doc/apps/ssl/ssl_distribution.html に書かれているとおり。

/usr/lib/erlang/releases/17 にあるファイルをネタに次のファイルを作成。

start_ssl.rel

{release, {"Erlang/OTP","17"}, {erts, "6.1"},
[{kernel,"3.0.1"},
{stdlib,"2.1"},
{sasl, "2.4"},
{asn1, "3.0.1"},
{crypto, "3.4"},
{public_key, "0.22"},
{ssl, "5.3.5"}
]}.

boot ファイルを作成

systools:make_script("start_ssl",[]).

/home/ancient/letter/erlang/ssl/erlserver.pem にはサーバ証明書と鍵を書いておく cat pem key > erlserver.pem なイメージ

起動

erl -boot /home/ancient/letter/erlang/ssl/start_ssl -proto_dist inet_tls -ssl_dist_opt server_certfile "/home/ancient/letter/erlang/ssl/erlserver.pem" -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true -sname ssl_test
erl -boot /home/ancient/letter/erlang/ssl/start_ssl -proto_dist inet_tls -ssl_dist_opt server_certfile "/home/ancient/letter/erlang/ssl/erlserver.pem" -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true -sname ssl_test2

(ssl_test2@yarn)8> net_kernel:connect_node(ssl_test@yarn).
true
(ssl_test2@yarn)9> nodes().
[ssl_test@yarn]

ふと気付いた。ssl じゃなくて ssh でやりたかった。

2014/07/06

ren ジェネリックワード(ファンクション)

ren に Clojure のマルチメソッドみたなものを実装してみた。

:g length dup type-of ;
:m length (( list )) erlang:length/1 ;
:m length (( tuple )) erlang:size/1 ;
:m length (( binary )) erlang:size/1 ;
:m length (( map )) erlang:map_size/1 ;

:g でジェネリックファンクションを定義する。やってることはスタックトップのオブジェクトのタイプをスタックにつむだけ。 :m でメソッドを定義する。スタックトップにつまれたタイプでパターマッチングしている。

Erlang にもマップが導入された。それを使ってこんなふうに OO っぽいことをやってみた。継承をどうするかが悩ましい。

:g + over type-of over type-of ;     # x y -- x y type-of-x type-of-y
:m + (( integer _ )) erlang:+/2 ;
:m + (( float _ )) erlang:+/2 ;
:m + (( list list )) erlang:++/2 ;
: point{ ( 'point >typed-map ) '{ ;
:m + (( #{ x X1 y Y1 } #{ x X2 y Y2 } point point ))
point{ 'x X1 X2 + 'y Y1 Y2 + }
;

point{ 'x 1 'y 2 } point{ 'x 3 'y 4 } +
# => #{'-type-' => point,x => 4,y => 6} Erlang の出力のまま