2008-01-01から1年間の記事一覧

常駐している Erlang プロセスのコードを入れ替える事ができる条件

常駐している Erlang プロセスのコードを無停止で動的に入れ替えるには、設計の段階で、入れ替えが発生すると思われる箇所を、プロセスとは異なる別モジュールに切り離しておく必要がある。 常駐している Erlang プロセスのコードの入れ替えに失敗する例 ま…

kai_tcp_server: a simple module for implementing concurrent TCP servers

Last July, Kai developer team made a simple module named "kai_tcp_server", which has the following features: Makes it easy to implement concurrent TCP servers, Provides typical TCP server behaviours, listen, accept, and so forth, Handles m…

Selenium のテストケースに一定の待ち時間を入れる

Perl で Test::WWW::Selenium を使う際には関係のない話ではあるのですが...、HTML と JavaScript (Selenium IDE 上)だけで sleep を実現したいという要望を頂いたので下記を提案してみました。 <tr> <td>waitForCondition</td> <td>var et = (new Date()).getTime() + 3000; </td></tr>…

第二回 Erlang 分散システム勉強会の感想

感想 Process Design and Polymorphism: Lessons Learnt from Development of Kai 並列性を確保する為、何をプロセス化し、何をプロセス化しないのか?の指標を提示されていたのが、一番興味深かったです。 質疑応答の中で、設定値を保持する箇所をプロセス…

久しぶりに どう書く?.org に投稿

疑似並行処理 どう書く?org どう見ても Erlang 向けのお題だったので解いてみました。 どう書く?org 8013 cooldaemon: Erlang のプレーンな例は、他の方が...(疑似並行処理) - 投稿の詳細 lists を多用しているので、下記のように import した方がスッキリ…

第2回 Erlang 分散システム勉強会が開催されます

詳細は・・・ たけまる / 第2回 Erlang 分散システム勉強会 上限30名の所に、既に10名ほど予約が入っているので、参加希望の方は早めに参加予約した方が良いと思います。 ちなみに、スピーカーも募集中です。個人的には erlang の話だけではなく、p2p、DHT …

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 のラッパーコマン…

Webistrano で Catalyst で作ったアプリをデプロイする

とある Subversion をリポジトリとするプロジェクトで、デプロイツールとして Capistrano を使用しようと思ったのですが、私と同僚の開発環境が異なる事を理由に、前から目を付けていた Webistrano を試してみました。 動作環境 apache 2.2.9 mysql 5.0.67 r…

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…

Danga::Socket を使って Echo Server と Client を書いてみた

erlang perl 間を TCP/IP で接続しようと思い立ち、そーいや Danga::Socket ってのがあったなーと思い出したので、試しに Echo Server と、その Client を作ってみた。 こんな感じで良いのだろうか? とりあえず、動いてる。 参考 URI Danga::Socket::Callba…

先日、git の alias を見直してみた

git

「alias g='git'」を設定して、.gitconfig をこんな感じにしてみた。 「g st」で「git status」となるのでタイプ数がかなり減った気がする。

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…

Perl + MySQL で cp932 を使っている際、'表' 等のように 0x5C が含まれる文字を INSERT するとエラーになる場合の対処方法

悲しい大人の事情で、MySQL に cp932 のデータを保存する事になったので、そのメモ。 環境 CentOS 5.1 perl 5.10.0 DBD::mysql 4.007 CREATE DATABASE foo CHARACTER SET cp932; GRANT SELECT, DELETE, UPDATE, INSERT ON foo.* TO bar@localhost IDENTIFIED…