erlang

erlang + autoconf

autoconf を、生まれて初めて書いた。 gist: 20329 ― GitHub 識者の突っ込みを募集中です m(_ _)mautomake は、また今度お勉強する。何故か FreeBSD 6.3 + autoconf 2.62 の環境で作った configure が Erlang ライブラリの検出に失敗する。 OSX 環境で作った…

quickrun.vim + erlang

ちょっと強引かもしれないけれど・・・これを ~/bin/erle に保存して、quickrun.vim の augroup plugin-quickrun の中に下記を含める。 autocmd Filetype erlang call s:set_quickrun_command('~/bin/erle') ちなみに、ただの file:eval/1 のラッパーコマン…

yecc/leex で簡易的な電卓を作ってみた

reia の Source を追ってる途中、気が向いたので yecc と leex を使い yacc/lex で言うところの "Hello World." 的な儀式である電卓を作りに挑戦してみました。gist: 13773 - GitHub reia の Source に付属する escript で書かれた yecc と leex へのラッパ…

Re:Kademliaについて細かい話

Kademliaについて細かい話 - NO!と言えるようになりたい コードを読んでもらえて、しかも、返信を頂けると、とても嬉しいです。 ありがとうございます! タイムアウトしたノード情報を保持し続ける為、churn 下でパフォーマンスが落ちる件 タイムアウトした…

Erlang で分散ハッシュテーブル(kademlia)を使った Key-Value Store 作ってみたよ

Kai に kademlia の組み込みを提案する為、試しに作っていたのですが、README に書いた How to Use の項目が動くようになったので晒してみます。 cooldaemon's ermlia at master ― GitHub 設置方法なんかも README に書いてあるので、ご興味のある方は、そち…

テスト時に smerl.erl を使って依存しているモジュールをモックに置き換える

DI しとけって話なんだろうけど(w; % ..snip.. -module(mock_foo). % ..snip.. -export([setup/0, cleanup/0]). % ..snip.. -define(REAL_MODULE, foo). % ..snip.. setup() -> {ok, Mock} = smerl:for_module(?MODULE), smerl:compile(smerl:set_module(M…

vim + ManPageView で erl -man を使う

今まで、 MANPATH に /opt/local/lib/erlang/man を追加してたのですが、そもそも erlang の man は、vim 起動中にしか見ないよね?という事で、ManPageView に手を加えてみた。 78a79,82 > if !exists("g:manpageview_pgm_erl") > let g:manpageview_pgm_er…

Oreilly から 新しい Erlang 本が出るっぽい

http://www.amazon.co.jp/gp/product/0596518188 楽しみだなぁ・・・。とりあえず、目次情報求む。

split/2 を再発明して、split_map/3 と split_foldl/4 を作った

ので、list_utils.erl に追加しました。 lists:split/2 は「lists:split(2, [1]).」とかやるとエラーになる為、ループで使い難いんですよね・・・。 list_utils:split/2 を利用した例として、list_utils:split_map/3 と list_utils:split_foldl/4 も list_ut…

rpc:parallel_eval/1 を使わない single node で動く pmap を作ってみた

kademlia 絡みで UDP 通信を並列で行ないたくなったので作ってみました。 送信元の IP アドレスやポート番号が異なると困るので、rpc:parallel_eval/1 は不使用です。 処理全体のタイムアウト処理と、ワーカーのタイムアウト処理を個別に指定可能です。 list…

lists モジュール、自前の関数、リスト内包表記の速度比較

検証コード gist: 6312 ― GitHub 感想 foreach 末尾再帰できなくても自前の関数の方が早い・・・コードの書き方が悪いのかな? lists:foreach/2 を使ったからといって、可読性が劇的に上がるわけでもないので、lists:foreach/2 は使うの止めよう。foreach に…

gen_X 系モジュールの code_change を appup とは関係なく呼ぶ

gen_server や gen_fsm 等が保持する State を、サーバ停止せずに(正確には suspend するけど)入れ替える方法のメモ。 OTP から逸脱している感があるけれど、Release Handling は無視の方向で(w; ちなみに、下記の内容を試す際は、こちら をどうぞ。まずは…

Erlang の関数を繰り返し実行するジョブ・スケジューラらしきものを作ってみた

udp_server に次ぐ、erlang による kademlia 実装の副産物その2。 定期的に関数を実行したかっただけなんですが、ファイル数が増えたので別プロジェクトにしてみました。 ジョブは起動時に supervisor 配下に置かれるので、落ちても再起動されます。 また、…

野良 port の erlang(disable hipe) を R12B-3 にした

gist: 2768 ― GitHub hipe を有効にした。それに伴い、Portfile 内の name を erlang にした。

EDoc の使い方を調べてみた

EDoc を練習する為に 簡単な適当モジュール を作った。 下記のコマンドを実行すると、./doc ディレクトリ配下に EDoc から生成した HTML が作成される。 $ erl -noshell -run edoc_run application edoc_test '"."' '[{def, {vsn, "1.0"}}]'@spec を使ってい…

couch_btree と dets の速度比較

Process Dictionary、dict、ets、gb_trees の速度比較 と同様に、単純なキー・値のペアを保持する場合限定の話。 $ erl 1> couchdb_btree_vs_dets:test(). --<dets>-- set:3750(4563)ms get:1310(1618)ms --<CouchDB B-Tree>-- set:380(456)ms get:440(493)ms ok 検証コードはこち</couchdb></dets>…

udp_server を gist に設置した

gist: 1458 ― GitHub これからは、短いコード片は全て gist に置く事にした。 バージョン管理されるし、突っ込みをもらいやすいのではないかと思う。

Process Dictionary、dict、ets、gb_trees の速度比較

それぞれの用途が異なるので、速度比較に意味があるのか疑問だけれど・・・単純なキー・値のペアを保持する場合の速度比較を行なってみた。 何度か試した結果、保存・取得共に process dictionary、ets、dict、gb_trees の順に早い。 gb_trees 比べて dict …

gen_udp を Supervisor 配下に置いて UDP Server 作ってみた

Kademlia の erlang 実装で使おうと思って書いてみた。 いろいろ修正した。詳細は下記。 -module(udp_server). -author('cooldaemon@gmail.com'). -behaviour(supervisor). -record(udp_server_option, { option = [binary], port = 4000, max_restarts = 3,…

Guard 節などで使う Type Test BIF の 'is_' Prefix は省略しちゃ駄目!

今まで、Supervisor を終了させる為に、何の気無しに下記のようなコードを書いていました。 stop() -> case whereis(?MODULE) of Pid when pid(Pid) -> exit(Pid, normal), ok; _ -> not_started end. kai-devel-ja で、pid/1 って何?という質問があり、erl…

常駐したプロセスを停止する際は、exit(normal) を使った方が、お行儀が良い?

Supervisor の停止を下記の通り書いていたら・・・ stop() -> case whereis(?MODULE) of Pid when pid(Pid) -> exit(Pid, shutdown), ok; _ -> not_started end. Common Test で怒られてしまった。Application の stop は怒られないなーと思い source を追っ…

Erlang の Meta Programming 機能を smerl で簡単に実現する

個人的な意見であり、決して一般的な意見ではないと思うのだけれど、Erlang 言語でプログラムをしていると、高階関数やメタ機能の利用が面倒で困る。 つい最近も、ちょっとしたモジュールを書いている際、モジュールへ動的に関数を追加できれば、コード行数…

Erlang で Apache worker MPM っぽいことを OTP っぽく実装してみた

たけまる / Erlang で Apache worker MPM っぽいこと accept 待ちのプロセスを supervisor 配下に置いてみました。tcp_server.hrl -author('cooldaemon@gmail.com'). -define(MAX_TIME, 60). -define(SHUTDOWN_WAITING_TIME, 2000). -define(MAX_ACCEPT, 100…

Erlang 分散処理勉強会の LT 資料を公開します

http://labs.miu.vc/svn/cooldaemon/doc/mochiwebLT.pdf SlideShare に上げようとしたのですが、重くて断念しました orz という事で、株式会社 MIU 様の公開リポジトリをお借りしました。ご好意感謝致します。> drkazu 社長 SlideShare にあげた。http://www…

OSX 10.5.3 で MacPorts から入れた Erlang が動かない件の応急処理

下記、最新版では改善されたそうです。"osx10.5.3でMacPortsから入れたerlangが動くようになった! - Inquisitive!"Mac OS X 10.5.3 にあげたら MacPorts の Erlangが動かない ... - Twisted Mind /opt/local/bin/erl が動かなくなったので、あきらめました…

mochiweb を試す

ほぼ、source を読み終わったので、使い方の解説を何回かに分けて記述して行こうと思う。 とりあえず今回は、mochiweb のデモを動かすまでの手順の紹介。まずは、svn で mochiweb 本体をダウンロードし make する。 $ svn checkout http://mochiweb.googleco…

erlang の OO もどきの仕様(これっていつから?)

下記のコードのように、-module の二つ目の引数にリストを渡すと・・・ -module(new_test, [Test1, Test2, Test3]). -author('cooldaemon@gmail.com'). -export([get/1]). get(test1) -> Test1; get(test2) -> Test2; get(test3) -> Test3. new/3 が定義され…

開発中は reloader を使うべし

mochiweb に付属の reloader を使うと、更新のあった module を再読み込みしてくれるので、デバックの手間が少し減る。 source の中身 gen_server として常駐する。 timer:send_interval/2 を使って自分自身に一秒間隔でメッセージ doit を送る。 doit を受…

perl erlang プロセス間で直接メッセージを送受信する

単純に erl_interface を Inline::C から使っただけなんですが(w; erlang 側の準備 特別な準備は無し。 とりあえず、送受信するプロセスを適当に作っておく。 -module(pingpong). -compile(export_all). start() -> register(pingpong, spawn(?MODULE, loo…

erl_interface メモ

C と Erlang ノード上のプロセスの間で、直接メッセージを送受信できる便利なライブラリ erl_interface を試したみた。 以下、メモと言うより code snippets。pingpong.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "erl_interf</arpa/inet.h></netinet/in.h></sys/socket.h></string.h></stdlib.h></stdio.h>…