<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>へびにっき &#187; Erlang</title>
	<atom:link href="http://wp.serpere.info/archives/category/programing/erlang-programing/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Thu, 09 Feb 2012 11:35:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Mac OS X で Erlang/OTP R13B</title>
		<link>http://wp.serpere.info/archives/503</link>
		<comments>http://wp.serpere.info/archives/503#comments</comments>
		<pubDate>Sun, 31 May 2009 11:21:12 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=503</guid>
		<description><![CDATA[いつの間にか MacPorts で R13B が提供されていたので、port upgrade erlang してみた。すると X を含む大量のパッケージのアップデートが始まってしまい、予想外の大仕事になってしまった。 途中、tiffパッケージのアップグレードで次のようなエラーが出た。 ---> Extracting tiff Error: Target org.macports.extract returned: can't read "macosx_version": no such variable Error: Status 1 encountered during processing. 検索してもズバリな情報は出てこなかったのだが、お手入れ tiff 3.8.2の場合 &#8211; 逃走航路@hatena を参考に XCode のバージョンを 3.1.2 に上げたら解消された。 Ubuntu で散々苦労した wxWidgets もあっさりインストールされた。素晴らしい…。またこのバージョンからは標準で smp オプションが入るようだ。 erl を起動して Unicode 対応をチェック。日本語を入力してダイレクトに Unicode コードポイントが返される様はちょっと感動的だ。 1&#62; &#34;日本語&#34;. &#91;26085,26412,35486&#93; [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F503%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mac%20OS%20X%20%E3%81%A7%20Erlang%2FOTP%20R13B%22%20%7D);"></div>
<p>いつの間にか MacPorts で R13B が提供されていたので、port upgrade erlang してみた。すると X を含む大量のパッケージのアップデートが始まってしまい、予想外の大仕事になってしまった。</p>
<p>途中、tiffパッケージのアップグレードで次のようなエラーが出た。</p>
<pre>
--->  Extracting tiff
Error: Target org.macports.extract returned: can't read "macosx_version": no such variable
Error: Status 1 encountered during processing.
</pre>
<p>検索してもズバリな情報は出てこなかったのだが、<a href="http://d.hatena.ne.jp/tenkoma/20090502/1241296630">お手入れ tiff 3.8.2の場合 &#8211; 逃走航路@hatena</a> を参考に XCode のバージョンを 3.1.2 に上げたら解消された。</p>
<p><a href="http://wp.serpere.info/archives/325">Ubuntu で散々苦労した</a> wxWidgets もあっさりインストールされた。素晴らしい…。またこのバージョンからは標準で smp オプションが入るようだ。</p>
<p>erl を起動して Unicode 対応をチェック。日本語を入力してダイレクトに Unicode コードポイントが返される様はちょっと感動的だ。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff9600;">1</span><span style="color: #014ea4;">&gt;</span> <span style="color: #ff7800;">&quot;日本語&quot;</span><span style="color: #6bb810;">.</span>
<span style="color: #109ab8;">&#91;</span><span style="color: #ff9600;">26085</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">26412</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">35486</span><span style="color: #109ab8;">&#93;</span></pre></div></div>



<p>io:format 等で Unicode 文字列を表示する場合は、修飾子の前に t を付ければうまく処理される。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff9600;">4</span><span style="color: #014ea4;">&gt;</span> <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;~s~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff7800;">&quot;日本語&quot;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">**</span> exception exit: <span style="color: #109ab8;">&#123;</span>badarg<span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>io<span style="color: #6bb810;">,</span>format<span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#91;</span><span style="color: #014ea4;">&lt;</span>0<span style="color: #6bb810;">.</span>26<span style="color: #6bb810;">.</span>0<span style="color: #014ea4;">&gt;</span><span style="color: #6bb810;">,</span><span style="color: #ff7800;">&quot;~s~n&quot;</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#91;</span><span style="color: #ff9600;">26085</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">26412</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">35486</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
                            <span style="color: #109ab8;">&#123;</span>erl_eval<span style="color: #6bb810;">,</span>do_apply<span style="color: #6bb810;">,</span><span style="color: #ff9600;">5</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
                            <span style="color: #109ab8;">&#123;</span>shell<span style="color: #6bb810;">,</span>exprs<span style="color: #6bb810;">,</span><span style="color: #ff9600;">6</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
                            <span style="color: #109ab8;">&#123;</span>shell<span style="color: #6bb810;">,</span>eval_exprs<span style="color: #6bb810;">,</span><span style="color: #ff9600;">6</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
                            <span style="color: #109ab8;">&#123;</span>shell<span style="color: #6bb810;">,</span>eval_loop<span style="color: #6bb810;">,</span><span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span>
     in <span style="color: #fa6fff;">function</span>  <span style="color: #ff4e18;">io</span>:<span style="color: #006600;">o_request</span><span style="color: #014ea4;">/</span><span style="color: #ff9600;">3</span>
<span style="color: #ff9600;">5</span><span style="color: #014ea4;">&gt;</span> <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;~ts~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff7800;">&quot;日本語&quot;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
日本語
ok</pre></div></div>



<p>久しぶりにまた Erlang で遊ぼうかなあ。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/503/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang/OTP R13A の Unicode サポート</title>
		<link>http://wp.serpere.info/archives/339</link>
		<comments>http://wp.serpere.info/archives/339#comments</comments>
		<pubDate>Sun, 29 Mar 2009 03:34:50 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=339</guid>
		<description><![CDATA[先日に引き続き、Erlang/OTP R13A の Unicode サポートについて調査していく。 リストとバイナリの混成 iodata() と同様のコンセプトの Unicode 対応版として、*chardata() というデータ型が導入される。 chardata() UTF-8 でエンコードされたバイナリと、妥当な Unicode コードポイントからなるリストの混成 latin1_chardata() latin1(iso-8859-1) でエンコードされたバイナリと、latin1 文字コードからなるリストの混成。iodata() と直接の互換性がある external_chardata() UTF-8 以外の Unicode 系エンコーディング（UTF-16/UTF-32）でエンコードされたバイナリと、妥当な Unicode コードポイントからなるリストの混成 このうち標準となるのが chardata() であり、Erlang/OTP 内部ではこの表現で統一するよう推奨されている。latin1_chardata() と external_chardata() は（少なくとも現時点では）後方互換性と外部システムとの連携のために用意されたものだと言える。実際 latin1_chardata() の定義におけるリストの制限は露骨に後方互換性を意識したものであることを示しているし、external_chardata() の定義はかなりテキトーだ（バイナリのエンコーディングに制限がないので、複数のエンコーディングが混在しても定義に適う。もちろんそれでは使い物にならないはずだが）。 unicode モジュール *chardata() をフラットなリスト/バイナリに変換するための関数が unicode モジュールに用意される。詳細はマニュアルを参照。基本となるのは次の2つの関数である。 characters_to_list(Data, InEncoding) Data を InEncoding でデコードして、Unicode コードポイントのリストに変換する characters_to_binary(Data, InEncoding, OutEncoding) Data [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F339%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Erlang%2FOTP%20R13A%20%E3%81%AE%20Unicode%20%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%22%20%7D);"></div>
<p><a href="http://wp.serpere.info/archives/318">先日</a>に引き続き、Erlang/OTP R13A の Unicode サポートについて調査していく。</p>
<h3>リストとバイナリの混成</h3>
<p>iodata() と同様のコンセプトの Unicode 対応版として、*chardata() というデータ型が導入される。</p>
<dl>
<dt>chardata()</dt>
<dd>UTF-8 でエンコードされたバイナリと、妥当な Unicode コードポイントからなるリストの混成</dd>
<dt>latin1_chardata()</dt>
<dd>latin1(iso-8859-1) でエンコードされたバイナリと、latin1 文字コードからなるリストの混成。iodata() と直接の互換性がある</dd>
<dt>external_chardata()</dt>
<dd>UTF-8 以外の Unicode 系エンコーディング（UTF-16/UTF-32）でエンコードされたバイナリと、妥当な Unicode コードポイントからなるリストの混成</dd>
</dl>
<p>このうち標準となるのが chardata() であり、Erlang/OTP 内部ではこの表現で統一するよう推奨されている。latin1_chardata() と external_chardata() は（少なくとも現時点では）後方互換性と外部システムとの連携のために用意されたものだと言える。実際 latin1_chardata() の定義におけるリストの制限は露骨に後方互換性を意識したものであることを示しているし、external_chardata() の定義はかなりテキトーだ（バイナリのエンコーディングに制限がないので、複数のエンコーディングが混在しても定義に適う。もちろんそれでは使い物にならないはずだが）。</p>
<h3>unicode モジュール</h3>
<p>*chardata() をフラットなリスト/バイナリに変換するための関数が unicode モジュールに用意される。詳細は<a href="http://erlang.org/doc/man/unicode.html">マニュアル</a>を参照。基本となるのは次の2つの関数である。</p>
<dl>
<dt>characters_to_list(Data, InEncoding)</dt>
<dd>Data を InEncoding でデコードして、Unicode コードポイントのリストに変換する</dd>
<dt>characters_to_binary(Data, InEncoding, OutEncoding)</dt>
<dd>Data を InEncoding でデコードして、OutEncoding でエンコードしたバイナリを返す</dd>
</dl>
<p>InEncoding に latin1 を指定した場合、Data は latin1_chardata() でなければならない。すなわちリスト内に含まれる整数は 255 以下に制限される。</p>
<p>例1：リストで表現された&#8221;日本語&#8221;という文字列を UTF-8 バイナリに変換</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff4e18;">unicode</span>:<span style="color: #ff3c00;">characters_to_binary</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #ff9600;">26085</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">26412</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">35486</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> utf8<span style="color: #6bb810;">,</span> utf8<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #666666; font-style: italic;">%% -&gt; &lt;&lt;230,151,165,230,156,172,232,170,158&gt;&gt;</span></pre></div></div>



<p>例2：UTF-8 でエンコードされた&#8221;日本語&#8221;という文字列を UTF-16LE に変換</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff4e18;">unicode</span>:<span style="color: #ff3c00;">characters_to_binary</span><span style="color: #109ab8;">&#40;</span>
	<span style="color: #ee3800;">&lt;&lt;</span><span style="color: #ff9600;">230</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">151</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">165</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">230</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">156</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">172</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">232</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">170</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">158</span><span style="color: #ee3800;">&gt;&gt;</span><span style="color: #6bb810;">,</span>
	utf8<span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#123;</span>utf16<span style="color: #6bb810;">,</span>little<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #666666; font-style: italic;">%% -&gt; &lt;&lt;229,101,44,103,158,138&gt;&gt;</span></pre></div></div>



<p>例3：&#8221;日本語&#8221;という文字列のリスト表現と UTF-16LE バイナリ表現を連結してフラットなリストに変換</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff4e18;">unicode</span>:<span style="color: #ff3c00;">characters_to_list</span><span style="color: #109ab8;">&#40;</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#91;</span><span style="color: #ff9600;">26085</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">26412</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">35486</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span><span style="color: #ee3800;">&lt;&lt;</span><span style="color: #ff9600;">229</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">101</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">44</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">103</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">158</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">138</span><span style="color: #ee3800;">&gt;&gt;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span>
	<span style="color: #109ab8;">&#123;</span>utf16<span style="color: #6bb810;">,</span>little<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #666666; font-style: italic;">%% -&gt; [26085,26412,35486,26085,26412,35486]</span></pre></div></div>



<p>続く。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/339/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang/OTP R13A を Ubuntu にインストール</title>
		<link>http://wp.serpere.info/archives/325</link>
		<comments>http://wp.serpere.info/archives/325#comments</comments>
		<pubDate>Thu, 26 Mar 2009 12:06:05 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=325</guid>
		<description><![CDATA[最新の Erlang/OTP R13A を Ubuntu 8.10 にインストール。せっかくだから wxErlang も動くようにしよう！と欲を出したせいでひどく苦労した。普通にインストールするだけなら ./configure --prefix=/usr/local/otp_r13a make sudo make install で良いはず（既存のバージョンとは別のディレクトリにインストールしている）。 wxErlang を有効にするには……正確な方法はよく分からない。いろいろ試行錯誤した揚げ句、何が最低限必要だったのか分からなくなってしまった。最初は apt に標準で用意されている wxWidgets 関連パッケージをインストールしまくったのだが、configure で「wxWidgets don&#8217;t have gl support」とか「wxWidgets don&#8217;t have wxStyledTextControl (stc.h)」とかのエラーが出てしまい、最終的にはwxErlang のページに従ってまず wxWidgets をソースからインストールして、それから以下のようにコンパイル＆インストールした。 ./configure --enable-wx=/usr/local \ --enable-smp-support \ --prefix=/usr/local/otp_r13a make sudo make install これでも configure の最後で先述のエラーは出るのだが（wxWidgets のコンパイル時に OpenGL サポートは追加しているし、stc.h も存在するのに）、そのまま make &#038;&#038; make install [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F325%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Erlang%2FOTP%20R13A%20%E3%82%92%20Ubuntu%20%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%22%20%7D);"></div>
<p>最新の Erlang/OTP R13A を Ubuntu 8.10 にインストール。せっかくだから wxErlang も動くようにしよう！と欲を出したせいでひどく苦労した。普通にインストールするだけなら</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>otp_r13a
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>



<p>で良いはず（既存のバージョンとは別のディレクトリにインストールしている）。</p>
<p>wxErlang を有効にするには……正確な方法はよく分からない。いろいろ試行錯誤した揚げ句、何が最低限必要だったのか分からなくなってしまった。最初は apt に標準で用意されている wxWidgets 関連パッケージをインストールしまくったのだが、configure で「wxWidgets don&#8217;t have gl support」とか「wxWidgets don&#8217;t have wxStyledTextControl (stc.h)」とかのエラーが出てしまい、最終的には<a href="http://apps.sourceforge.net/mediawiki/wxerlang/index.php?title=Getting_Started">wxErlang のページ</a>に従ってまず wxWidgets をソースからインストールして、それから以下のようにコンパイル＆インストールした。</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--enable-wx</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> \
	    <span style="color: #660033;">--enable-smp-support</span> \
	    <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>otp_r13a
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>



<p>これでも configure の最後で先述のエラーは出るのだが（wxWidgets のコンパイル時に OpenGL サポートは追加しているし、stc.h も存在するのに）、そのまま make &#038;&#038; make install したらうまくインストールできた。もしかしたら apt の標準パッケージでもできていたのかも知れない。</p>
<p>あと SMT を有効にしておかないと「WX ERROR: SMT emulator required」となるので、&#8211;enable-smp-support は必須（デフォルトで有効になる？）。あと erl の起動時にも -smp オプションが必要。</p>
<pre>
/usr/loca/otp_r13a/bin/erl -smp
</pre>
<p><a href="http://d.hatena.ne.jp/inajob/20081013/1223914405">1章 「wxErlang」 &#8211; INAの日記</a>を参考に最小限のサンプルを動かして、とりあえずウィンドウが表示されるところまでは確認した。長い道のりだった……。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/325/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Erlang/OTP R13Aリリース</title>
		<link>http://wp.serpere.info/archives/318</link>
		<comments>http://wp.serpere.info/archives/318#comments</comments>
		<pubDate>Wed, 25 Mar 2009 12:53:43 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=318</guid>
		<description><![CDATA[3月17日に Erlang/OTP の次期バージョン R13A がリリースされた。これはβリリースであり、正式版となる R13B は4月29日にリリースされるとのこと。 このリリースのハイライトとして、トップページでは以下の内容が紹介されている： SMP/マルチコア環境における大幅なパフォーマンス改善 Unicode サポートの追加 WxErlang（GUIライブラリ WxWidgets に対するバインディング）の追加 リリース管理ツール RelTools の追加 マルチバイト圏の人間としては、何と言っても Unicode サポートの追加が嬉しい。仕様は EEP10 に基づいているとのことなので、一通り目を通してみた。 Erlang/OTP R13A の Unicode サポート Erlang において「文字列」を表現するには、リストによる方法とバイナリによる方法の二通りがあるが、R13A 以降はそれぞれ次のように変化する。 リスト R12B までは 0 ~ 255 の整数が iso-8859-1 の1文字を表すと見なされ、0 ~ 255 の範囲の整数のみを含むリストが「文字列」として扱われていた。R13A 以降はこれが 0 ~ 16#10fff の範囲に拡張され、整数1つは Unicode のコードポイントと見なされるようになる。 Unicode のコードポイントにおける 0 ~ 255 の範囲は [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F318%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Erlang%2FOTP%20R13A%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%22%20%7D);"></div>
<p>3月17日に Erlang/OTP の次期バージョン R13A がリリースされた。これはβリリースであり、正式版となる R13B は4月29日にリリースされるとのこと。</p>
<p>このリリースのハイライトとして、<a href="http://erlang.org/">トップページ</a>では以下の内容が紹介されている：</p>
<ul>
<li>SMP/マルチコア環境における大幅なパフォーマンス改善</li>
<li>Unicode サポートの追加</li>
<li>WxErlang（GUIライブラリ WxWidgets に対するバインディング）の追加</li>
<li>リリース管理ツール RelTools の追加</li>
</ul>
<p>マルチバイト圏の人間としては、何と言っても Unicode サポートの追加が嬉しい。仕様は <a href="http://www.erlang.org/eeps/eep-0010.html">EEP10</a> に基づいているとのことなので、一通り目を通してみた。</p>
<h3>Erlang/OTP R13A の Unicode サポート</h3>
<p>Erlang において「文字列」を表現するには、リストによる方法とバイナリによる方法の二通りがあるが、R13A 以降はそれぞれ次のように変化する。</p>
<dl>
<dt>リスト</dt>
<dd>R12B までは 0 ~ 255 の整数が iso-8859-1 の1文字を表すと見なされ、0 ~ 255 の範囲の整数のみを含むリストが「文字列」として扱われていた。R13A 以降はこれが 0 ~ 16#10fff の範囲に拡張され、整数1つは Unicode のコードポイントと見なされるようになる。
</dd>
<dd>Unicode のコードポイントにおける 0 ~ 255 の範囲は iso-8859-1 の文字コードと互換性があるので、<br />
R13A 以降の「文字列」は、R12B 以前の「文字列」の上位互換だと言うことができる。
</dd>
<dt>バイナリ</dt>
<dd>R12B までは8ビットが1区切りとされ、それぞれが iso-8859-1 の1文字を表すと見なされていた。しかしR13A 以降、バイナリで文字列を表現する場合は UTF-8 でエンコードするのが標準となる。ただし iso-8859-1 他のエンコーディングで扱う方法もある。
</dd>
</dl>
<p>要するに、抽象的な概念としての「文字」と、具体的な表現としての「バイナリ」が厳密に区別されるようになった、ということになる。今までの Erlang ではこの区別が曖昧なところがあった。iso-8859-1 の範囲で考える限り、バイト列＝文字列と見なして問題なかったからだ。しかし今後は、文字を文字として扱いたいときはリストを用いて操作を行い、外部システムやファイルとのやり取りで具体的なビット表現が必要なときはバイナリとして扱う、という区別が必要になる。</p>
<p>抽象概念としての文字は一意な存在なので、リストを用いた文字列の表現はただ一通りに定まる。&#8221;日本語&#8221;という文字列を表すリストは<br />
 [26085,26412,35486] しかあり得ない。しかしこれをバイナリとして表現する方法は幾通りもあり得る。UTF-8 で表現すれば <<230,151,165,230,156,172,232,170,158>> となり、UTF-16ビッグエンディアンで表現すれば <<101,229,103,44,138,158>> となる。</p>
<p>これから実際にインストールして、動作を確かめてみたい。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/318/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>タプルを使用した関数呼び出し</title>
		<link>http://wp.serpere.info/archives/310</link>
		<comments>http://wp.serpere.info/archives/310#comments</comments>
		<pubDate>Sun, 22 Mar 2009 07:58:08 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=310</guid>
		<description><![CDATA[「Erlang dict」で検索すると最初に引っかかるページ「Erlang クエックブック」。このページにおいてdictの使い方は次のように説明されている： D1 = dict:new&#40;&#41;. % 作成 D2 = D1:store&#40;key1, value1&#41;. % キーと値のペアを入れる 新しく作った辞書を「モジュール名として」指定して、dict モジュールの関数を呼び出している。まるでオブジェクト指向におけるメソッド呼び出しのような奇妙な記法だが、確かにこれで動作する。 なぜだろう？ いろいろと調べた結果、これは dict に特有の話ではなく、モジュール名としてタプルを指定した場合の特殊な動作だということが分かった（dict モジュールは個々の辞書をタプルとして表現している）。Mod:Fun(Arg1,..ArgN) の評価を疑似コードで書くと次のようになる： &#123;Mod,Fun,Args&#125; when is_tuple&#40;Mod&#41;, is_atom&#40;element&#40;1, Mod&#41;&#41; -&#62; erlang:apply&#40;element&#40;1, Mod&#41;, Fun, Args ++ &#91;Mod&#93;&#41; 次のように動作を確かめることができる。 erl&#62; M1 = &#123;erlang, 1, 2, 3&#125;. &#123;erlang,1,2,3&#125; erl&#62; M1:tuple_to_list&#40;&#41;. &#91;erlang,1,2,3&#93; 問題は、この動作が公式なドキュメントのどこにも書いていないということだ。少なくとも私は見つけられなかった。 これとよく似た例として、{Module, FunctionName} という形式のタプルが Module:FunctionName として評価されることはいくつかのドキュメントで触れられており、「非推奨」だとされている。よってこれも既に使われなくなった、古い形式の呼び出し方だということだろうか……？]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F310%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%82%BF%E3%83%97%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%96%A2%E6%95%B0%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%22%20%7D);"></div>
<p>「Erlang dict」で検索すると最初に引っかかるページ「<a href="http://ancient.s6.xrea.com/erlang/cookbook.html">Erlang クエックブック</a>」。このページにおいてdictの使い方は次のように説明されている：</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #45b3e6;">D1</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">dict</span>:<span style="color: #ff3c00;">new</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>                            <span style="color: #666666; font-style: italic;">% 作成</span>
<span style="color: #45b3e6;">D2</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">D1</span>:<span style="color: #ff3c00;">store</span><span style="color: #109ab8;">&#40;</span>key1<span style="color: #6bb810;">,</span> value1<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>                <span style="color: #666666; font-style: italic;">% キーと値のペアを入れる</span></pre></div></div>



<p>新しく作った辞書を「モジュール名として」指定して、dict モジュールの関数を呼び出している。まるでオブジェクト指向におけるメソッド呼び出しのような奇妙な記法だが、確かにこれで動作する。</p>
<p>なぜだろう？</p>
<p>いろいろと調べた結果、これは dict に特有の話ではなく、モジュール名としてタプルを指定した場合の特殊な動作だということが分かった（dict モジュールは個々の辞書をタプルとして表現している）。Mod:Fun(Arg1,..ArgN) の評価を疑似コードで書くと次のようになる：</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Mod</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">Fun</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">Args</span><span style="color: #109ab8;">&#125;</span> <span style="color: #186895;">when</span> <span style="color: #ff3c00;">is_tuple</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Mod</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #fa6fff;">is_atom</span><span style="color: #109ab8;">&#40;</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mod</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
	<span style="color: #ff4e18;">erlang</span>:<span style="color: #fa6fff;">apply</span><span style="color: #109ab8;">&#40;</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Mod</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Fun</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Args</span> <span style="color: #014ea4;">++</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Mod</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span></pre></div></div>



<p>次のように動作を確かめることができる。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;">erl<span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">M1</span> <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#123;</span>erlang<span style="color: #6bb810;">,</span> <span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">2</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
<span style="color: #109ab8;">&#123;</span>erlang<span style="color: #6bb810;">,</span><span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">2</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#125;</span>
erl<span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">M1</span>:<span style="color: #fa6fff;">tuple_to_list</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #109ab8;">&#91;</span>erlang<span style="color: #6bb810;">,</span><span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">2</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#93;</span></pre></div></div>



<p>問題は、この動作が公式なドキュメントのどこにも書いていないということだ。少なくとも私は見つけられなかった。</p>
<p>これとよく似た例として、{Module, FunctionName} という形式のタプルが Module:FunctionName として評価されることはいくつかのドキュメントで触れられており、「非推奨」だとされている。よってこれも既に使われなくなった、古い形式の呼び出し方だということだろうか……？</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/310/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>トライグラム反復子</title>
		<link>http://wp.serpere.info/archives/289</link>
		<comments>http://wp.serpere.info/archives/289#comments</comments>
		<pubDate>Sun, 15 Mar 2009 12:17:43 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[『プログラミングErlang』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=289</guid>
		<description><![CDATA[『プログラミングErlang』15章本文では 単語ごとに分割する 単語の両端に空白を付加する 3文字ずつ取り出す という3段階の手順になっている。これを1段階に、すなわち先頭から順番に3文字ずつ抜き出していくアルゴリズムに変更してみた。 -define&#40;NL, $\r,$\n&#41;. &#160; % 先頭に改行を付加して処理開始 my_scan_trigrams&#40;&#91;?NL&#124;_&#93;=L, F, A&#41; -&#62; each_trigram&#40;L, F, A&#41;; my_scan_trigrams&#40;L, F, A&#41; -&#62; each_trigram&#40;&#91;?NL&#124;L&#93;, F, A&#41;. &#160; each_trigram&#40;L, F, A&#41; -&#62; case L of %% 終端の処理 &#91;?NL&#93; -&#62; A; &#91;?NL, X&#93; -&#62; F&#40;&#91;$\s, X, $\s&#93;, A&#41;; &#91;X, Y&#93; -&#62; F&#40;&#91;X, Y, $\s&#93;, A&#41;; %% 単語の先頭 &#91;?NL, X, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F289%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E3%83%88%E3%83%A9%E3%82%A4%E3%82%B0%E3%83%A9%E3%83%A0%E5%8F%8D%E5%BE%A9%E5%AD%90%22%20%7D);"></div>
<p>『プログラミングErlang』15章本文では</p>
<ol>
<li>単語ごとに分割する</li>
<li>単語の両端に空白を付加する</li>
<li>3文字ずつ取り出す</li>
</ol>
<p>という3段階の手順になっている。これを1段階に、すなわち先頭から順番に3文字ずつ抜き出していくアルゴリズムに変更してみた。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">define</span><span style="color: #109ab8;">&#40;</span><span style="color: #6941fd;">NL</span><span style="color: #6bb810;">,</span> $\r<span style="color: #6bb810;">,</span>$\n<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">% 先頭に改行を付加して処理開始</span>
<span style="color: #ff3c00;">my_scan_trigrams</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span>|_<span style="color: #109ab8;">&#93;</span><span style="color: #014ea4;">=</span><span style="color: #45b3e6;">L</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">L</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">my_scan_trigrams</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">L</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span>|L<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">L</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">case</span> <span style="color: #45b3e6;">L</span> <span style="color: #186895;">of</span>
	<span style="color: #666666; font-style: italic;">%% 終端の処理</span>
	<span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span><span style="color: #109ab8;">&#93;</span>      <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">A</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #109ab8;">&#93;</span>   <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>$\s<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> $\s<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #109ab8;">&#93;</span>   <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> $\s<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #666666; font-style: italic;">%% 単語の先頭</span>
	<span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">NL</span>|T<span style="color: #109ab8;">&#93;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span> |T<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>$\s<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> $\s<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Y</span>  |T<span style="color: #109ab8;">&#93;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Y</span>|T<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>$\s<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Y</span>  <span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #666666; font-style: italic;">%% 単語の途中</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">NL</span>|T<span style="color: #109ab8;">&#93;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>?<span style="color: #6941fd;">NL</span> |T<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> $\s<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Z</span>  |T<span style="color: #109ab8;">&#93;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">each_trigram</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Z</span>|T<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">F</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">X</span><span style="color: #6bb810;">,</span>   <span style="color: #45b3e6;">Y</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Z</span>  <span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">A</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>微々たる差ではあるが、少しだけ速い。</p>
<pre>
Counting by my_scan_trigrams - No of trigrams=3357707 time/trigram=0.46476926068891655
Counting by scan_word_list - No of trigrams=3357707 time/trigram=0.5411714006016606
</pre>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>raw モードで開いたファイルの後始末</title>
		<link>http://wp.serpere.info/archives/284</link>
		<comments>http://wp.serpere.info/archives/284#comments</comments>
		<pubDate>Sat, 14 Mar 2009 08:19:58 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[『プログラミングErlang』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=284</guid>
		<description><![CDATA[先日の続き。 file:open/2 に raw オプションを指定した場合の IoDevice の実体はポート+αだった。ということは、ポートに対するBIFを使えば、プロセス終了時の挙動も確かめられるはずである。 次のようなコードで確認してみた（rpc/2 の定義は省略）。 -module&#40;raw_test&#41;. -compile&#40;export_all&#41;. &#160; start&#40;&#41; -&#62; Pid = spawn&#40;fun test/0&#41;, io:format&#40;&#34;The process which opened the file is ~p.~n&#34;, &#91;Pid&#93;&#41;, Port = rpc&#40;Pid, get&#41;, io:format&#40;&#34;The opened port is ~p.~n~n&#34;, &#91;Port&#93;&#41;, io:format&#40;&#34;is_process_alive: ~p~n&#34;, &#91;erlang:is_process_alive&#40;Pid&#41;&#93;&#41;, io:format&#40;&#34;port_info: ~p~n~n&#34;, &#91;erlang:port_info&#40;Port&#41;&#93;&#41;, rpc&#40;Pid, close&#41;, io:format&#40;&#34;is_process_alive: ~p~n&#34;, &#91;erlang:is_process_alive&#40;Pid&#41;&#93;&#41;, io:format&#40;&#34;port_info: ~p~n&#34;, &#91;erlang:port_info&#40;Port&#41;&#93;&#41;. &#160; test&#40;&#41; -&#62; %% [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F284%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22raw%20%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E9%96%8B%E3%81%84%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%BE%8C%E5%A7%8B%E6%9C%AB%22%20%7D);"></div>
<p><a href="http://wp.serpere.info/archives/278">先日</a>の続き。</p>
<p>file:open/2 に raw オプションを指定した場合の IoDevice の実体はポート+αだった。ということは、ポートに対するBIFを使えば、プロセス終了時の挙動も確かめられるはずである。</p>
<p>次のようなコードで確認してみた（rpc/2 の定義は省略）。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>raw_test<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">compile</span><span style="color: #109ab8;">&#40;</span>export_all<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">Pid</span> <span style="color: #014ea4;">=</span> <span style="color: #fa6fff;">spawn</span><span style="color: #109ab8;">&#40;</span><span style="color: #186895;">fun</span> test<span style="color: #014ea4;">/</span><span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;The process which opened the file is ~p.~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Pid</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">Port</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">rpc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> get<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;The opened port is ~p.~n~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;is_process_alive: ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff4e18;">erlang</span>:<span style="color: #006600;">is_process_</span><span style="color: #fa6fff;">alive</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;port_info: ~p~n~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff4e18;">erlang</span>:<span style="color: #fa6fff;">port_info</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">rpc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> close<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;is_process_alive: ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff4e18;">erlang</span>:<span style="color: #006600;">is_process_</span><span style="color: #fa6fff;">alive</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff4e18;">io</span>:<span style="color: #ff3c00;">format</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;port_info: ~p~n&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #ff4e18;">erlang</span>:<span style="color: #fa6fff;">port_info</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">test</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #666666; font-style: italic;">%% IoDeviceのUndocumentedな内部構造に依存</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Port</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">open</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;raw_test.erl&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>read<span style="color: #6bb810;">,</span> raw<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">test</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">test</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">receive</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">From</span><span style="color: #6bb810;">,</span> get<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span>
	    <span style="color: #ff3c00;">test</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Port</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">From</span><span style="color: #6bb810;">,</span> close<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> close<span style="color: #109ab8;">&#125;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>実行結果は次のようになった。</p>
<pre>
The process which opened the file is <0.60.0>.
The opened port is #Port<0.1695>.

is_process_alive: true
port_info: [{name,"efile"},
            {links,[<0.60.0>]},
            {id,1695},
            {connected,<0.60.0>},
            {input,9},
            {output,18}]

is_process_alive: false
port_info: undefined
</pre>
<p>ファイルを開いたプロセスが生きているときにはきちんとポートの情報が取れる。links や connected に pid が入っていることも確認できる。プロセスが終了するとポート情報は undefined となり、ポートが閉じられたことが分かる。</p>
<p>IoDevice の内部実装についてはともかく、「ファイルを開いたプロセスが終了したとき、自動的にファイルが閉じられる」という挙動については信用しても良さそうだ。例えば『プログラミングErlang』14章のSHOUTcastサーバではクライアントがTCP接続を閉じたときにコントローラプロセスがクラッシュするという仕様になっているが、このときにもきちんとファイルは close される、ということになる。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/284/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>開いたファイルの後始末</title>
		<link>http://wp.serpere.info/archives/278</link>
		<comments>http://wp.serpere.info/archives/278#comments</comments>
		<pubDate>Thu, 12 Mar 2009 09:05:15 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=278</guid>
		<description><![CDATA[erl -man file より引用： IoDevice is really the pid of the process which handles the file. This process is linked to the process which originally opened the file. If any process to which the IoDevice is linked terminates, the file will be closed and the process itself will be terminated. An IoDevice returned from this [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F278%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E9%96%8B%E3%81%84%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%BE%8C%E5%A7%8B%E6%9C%AB%22%20%7D);"></div>
<p>erl -man file より引用：</p>
<blockquote><p>
IoDevice is really the pid of the process which handles the file. This process is linked to the process which originally  opened  the  file. If any process to which the IoDevice is linked terminates, the file will be closed and the process itself will be terminated. An IoDevice returned from this call can be used as an argument to  the  IO  functions (see io(3)).
</p></blockquote>
<p>IoDevice の実体はファイルを操作するプロセスの Pid であり、ファイルを open したプロセスとリンクされている。そしてそのプロセスが終了したとき、ファイルが自動的に close されるようになっている。サーバを書く上では実に頼もしい仕様だ。</p>
<p>ところで file:open/2 で指定できるオプションには raw というものがある。同じく erl -man file によれば、このオプションを指定するとアクセスが高速化される反面、次のような制限が加わる：</p>
<ul>
<li>io モジュールの関数を使えなくなる</li>
<li>ファイルを open したプロセスからしかアクセスできなくなる</li>
<li>リモートErlangファイルサーバ（これが何なのかよく分からないが）を使用することができなくなる</li>
</ul>
<p>「ファイルを open したプロセスが終了しても、自動的にファイルが閉じられなくなる」とは書いていないから、冒頭に引用した部分の説明は raw オプションを指定した場合でも基本的に有効、と判断して良いのだろうか。</p>
<p>erlシェルで見る限り、raw を指定した場合の IoDevice の実体はポート+αらしい。ポートもまた Erlang が提供する抽象のひとつだから、やはりプロセス終了時には自動的に後片づけしてくれる、と思いたくなる。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;">erl<span style="color: #014ea4;">&gt;</span> <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Io2</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">open</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff7800;">&quot;m1.erl&quot;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>read<span style="color: #6bb810;">,</span> raw<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span>file_descriptor<span style="color: #6bb810;">,</span>prim_file<span style="color: #6bb810;">,</span><span style="color: #109ab8;">&#123;</span>#Port<span style="color: #014ea4;">&lt;</span><span style="color: #ff9600;">0.420</span><span style="color: #014ea4;">&gt;</span><span style="color: #6bb810;">,</span><span style="color: #ff9600;">9</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span></pre></div></div>



<p>実際もし自動的にファイルが close されないとなると、この IoDevice にアクセスできるのは open した当のプロセスだけなのだから、実質的に close する手段が無くなってしまう。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/278/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>外部イテレータとか内部イテレータとか</title>
		<link>http://wp.serpere.info/archives/260</link>
		<comments>http://wp.serpere.info/archives/260#comments</comments>
		<pubDate>Tue, 10 Mar 2009 12:07:04 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[『プログラミングErlang』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=260</guid>
		<description><![CDATA[先日示したコード play_songs&#40;Socket, Pid, I&#41; -&#62; &#123;Bin, Header&#125; = rpc&#40;Pid, next_block&#41;, write_data&#40;Socket, Bin, &#123;I, Header&#125;&#41;, play_songs&#40;Socket, Pid, I+1&#41;. これは形式的には「外部イテレータ」のように見える。 そして「内部イテレータ」の形式に書き換えることもできる。 play_songs&#40;Socket&#41; -&#62; each_song_block&#40;fun&#40;Bin, Header, I&#41; -&#62; write_data&#40;Socket, Bin, &#123;I, Header&#125;&#41;, I+1 end, 0&#41;. この場合は別プロセスを立ち上げる必要は無い。逆に考えると、プロセスとメッセージパッシングの考え方を用いることで、内部イテレータ（的な処理）を外部イテレータ（的な処理）に書き換えることができる……と言えそうである。 内部イテレータを外部イテレータに、という話題では、確か「コルーチン」が云々という議論があったはず……と思って検索してみたら、案の定興味深いページがいろいろと見つかった。 メイン・ルーチン、サブルーチンそしてコルーチン [Think IT]第4回：並列処理が可能な関数型言語「Erlang」 アクターモデル &#8211; Wikipedia マルチプロセスとメッセージパッシングによる真の並列性を備えたErlangならば、コルーチンと同等の構造も容易に作れる……という理解で良いのだろうか。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F260%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%E5%A4%96%E9%83%A8%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%8B%E5%86%85%E9%83%A8%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%81%8B%22%20%7D);"></div>
<p><a href="http://wp.serpere.info/archives/255">先日</a>示したコード</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">play_songs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">rpc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> next_block<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">write_data</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">I</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">play_songs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">I</span><span style="color: #014ea4;">+</span><span style="color: #ff9600;">1</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>これは形式的には「外部イテレータ」のように見える。</p>
<p>そして「内部イテレータ」の形式に書き換えることもできる。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">play_songs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
   <span style="color: #ff3c00;">each_song_block</span><span style="color: #109ab8;">&#40;</span><span style="color: #186895;">fun</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
                            <span style="color: #ff3c00;">write_data</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">I</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
                            <span style="color: #45b3e6;">I</span><span style="color: #014ea4;">+</span><span style="color: #ff9600;">1</span>
                    <span style="color: #186895;">end</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>この場合は別プロセスを立ち上げる必要は無い。逆に考えると、プロセスとメッセージパッシングの考え方を用いることで、内部イテレータ（的な処理）を外部イテレータ（的な処理）に書き換えることができる……と言えそうである。</p>
<p>内部イテレータを外部イテレータに、という話題では、確か「コルーチン」が云々という議論があったはず……と思って検索してみたら、案の定興味深いページがいろいろと見つかった。</p>
<ul>
<li><a href="http://madeira.cc.hokudai.ac.jp/RD/yamamoto/Essay/11.html">メイン・ルーチン、サブルーチンそしてコルーチン</a></li>
<li><a href="http://www.thinkit.co.jp/cert/article/0711/4/4/3.htm">[Think IT]第4回：並列処理が可能な関数型言語「Erlang」</a></li>
<li><a href="http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB">アクターモデル &#8211; Wikipedia</a></li>
</ul>
<p>マルチプロセスとメッセージパッシングによる真の並列性を備えたErlangならば、コルーチンと同等の構造も容易に作れる……という理解で良いのだろうか。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/260/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>14章SHOUTcastサーバのリファクタリング</title>
		<link>http://wp.serpere.info/archives/255</link>
		<comments>http://wp.serpere.info/archives/255#comments</comments>
		<pubDate>Fri, 06 Mar 2009 12:40:24 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Erlang]]></category>
		<category><![CDATA[『プログラミングErlang』]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=255</guid>
		<description><![CDATA[14.7の『SHOUTcastサーバ』はこの本の中で2番目の山場だと思う。send_file/5 とか、処理の見通しが悪過ぎて投げ出したくなった……。が、頑張ってなんとか読み進めている。 まず「ファイルの中の、ある範囲内にランダムアクセスする」処理を分離したい。というわけで次のようなモジュールを書いた。一見して明らかなように、露骨にOOを意識している。 -module&#40;filerange&#41;. -export&#40;&#91;open/2, close/1, pread/3&#93;&#41;. -record&#40;file_with_range, &#123; io, min, max &#125;&#41;. &#160; open&#40;File, Min, Max&#41; -&#62; &#123;ok, Io&#125; = file:open&#40;File, &#91;read, binary, raw&#93;&#41;, #file_with_range&#123;io=Io, min=Min, max=Max&#125;. &#160; close&#40;#file_with_range&#123;io=Io&#125;&#41; -&#62; file:close&#40;Io&#41;. &#160; pread&#40;#file_with_range&#123;io=Io, min=Min, max=Max&#125;, Offset, Size&#41; -&#62; Start = Min + Offset, End = Start + Size, if End &#62; Max -&#62; case [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F255%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%2214%E7%AB%A0SHOUTcast%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%22%20%7D);"></div>
<p>14.7の『SHOUTcastサーバ』はこの本の中で2番目の山場だと思う。send_file/5 とか、処理の見通しが悪過ぎて投げ出したくなった……。が、頑張ってなんとか読み進めている。</p>
<p>まず「ファイルの中の、ある範囲内にランダムアクセスする」処理を分離したい。というわけで次のようなモジュールを書いた。一見して明らかなように、露骨にOOを意識している。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>filerange<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>open<span style="color: #014ea4;">/</span><span style="color: #ff9600;">2</span><span style="color: #6bb810;">,</span> close<span style="color: #014ea4;">/</span><span style="color: #ff9600;">1</span><span style="color: #6bb810;">,</span> pread<span style="color: #014ea4;">/</span><span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">record</span><span style="color: #109ab8;">&#40;</span><span style="color: #d400ed;">file_with_range</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span> io<span style="color: #6bb810;">,</span> min<span style="color: #6bb810;">,</span> max <span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">open</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">File</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Io</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">open</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">File</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>read<span style="color: #6bb810;">,</span> <span style="color: #fa6fff;">binary</span><span style="color: #6bb810;">,</span> raw<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    #<span style="color: #d400ed;">file_with_range</span><span style="color: #109ab8;">&#123;</span>io<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> min<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> max<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">close</span><span style="color: #109ab8;">&#40;</span>#<span style="color: #d400ed;">file_with_range</span><span style="color: #109ab8;">&#123;</span>io<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Io</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">close</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">pread</span><span style="color: #109ab8;">&#40;</span>#<span style="color: #d400ed;">file_with_range</span><span style="color: #109ab8;">&#123;</span>io<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> min<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> max<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Offset</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">Start</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Min</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">Offset</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">End</span>   <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Start</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span>
    <span style="color: #186895;">if</span>
	<span style="color: #45b3e6;">End</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">Max</span> <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #186895;">case</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">pread</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Start</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span> <span style="color: #014ea4;">-</span> <span style="color: #45b3e6;">Start</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span>
		<span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #109ab8;">&#123;</span>less<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
		eof <span style="color: #6bb810;">-&gt;</span> <span style="color: #109ab8;">&#123;</span>less<span style="color: #6bb810;">,</span> <span style="color: #ee3800;">&lt;&lt;&gt;&gt;</span><span style="color: #109ab8;">&#125;</span>
	    <span style="color: #186895;">end</span><span style="color: #6bb810;">;</span>
	true <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">pread</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Start</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
	    <span style="color: #109ab8;">&#123;</span>exact<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>しかしこれではイマイチだ。グローバルなモジュールの名前空間を占有する割には、さほど汎用的なコードではない。というか別に汎用的にするつもりもない。単に処理のスコープを分割したいだけだ。しかしそういう気軽な分割に用いるには、モジュールという単位は大げさ過ぎる……。</p>
<p>そこでふと、<a href="http://wp.serpere.info/archives/149">以前</a>に「<strong>様々なプログラミングパラダイムを全てプロセスとメッセージ送信に還元していくのがErlang流だ</strong>」と考えたことを思い出した。そうだ、これも別プロセスで動かしてしまおう！</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">filerange_server</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">File</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Io</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">open</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">File</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span>read<span style="color: #6bb810;">,</span> <span style="color: #fa6fff;">binary</span><span style="color: #6bb810;">,</span> raw<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">filerange_loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">filerange_loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">receive</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">From</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>pread<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Offset</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #45b3e6;">Start</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Min</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">Offset</span><span style="color: #6bb810;">,</span>
	    <span style="color: #45b3e6;">End</span>   <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Start</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span>
	    <span style="color: #186895;">if</span>
		<span style="color: #45b3e6;">End</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">Max</span> <span style="color: #6bb810;">-&gt;</span>
		    <span style="color: #186895;">case</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">pread</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Start</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span> <span style="color: #014ea4;">-</span> <span style="color: #45b3e6;">Start</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span>
			<span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>less<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span>
			eof        <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>less<span style="color: #6bb810;">,</span> <span style="color: #ee3800;">&lt;&lt;&gt;&gt;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span>
		    <span style="color: #186895;">end</span><span style="color: #6bb810;">;</span>
		true <span style="color: #6bb810;">-&gt;</span>
		    <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">pread</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Start</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
		    <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>exact<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span>
	    <span style="color: #186895;">end</span><span style="color: #6bb810;">,</span>
	    <span style="color: #ff3c00;">filerange_loop</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Min</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Max</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
	<span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">From</span><span style="color: #6bb810;">,</span> close<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span>
	    <span style="color: #45b3e6;">From</span> <span style="color: #014ea4;">!</span> <span style="color: #109ab8;">&#123;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #ff4e18;">file</span>:<span style="color: #ff3c00;">close</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Io</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>これで名前空間は適切に分割され、汎用の rpc で呼び出せるようになった。デバッグも簡単だ。</p>
<pre>
erl> Pid = spawn(fun() -> myshout:filerange_server("AtoZ.txt", 5, 20) end).
<0.37.0>

erl> myshout:rpc(Pid, {pread, 0, 5}).
{exact,<<"FGHIJ">>}

erl> myshout:rpc(Pid, {pread, 10, 5}).
{exact,<<"PQRST">>}

erl> myshout:rpc(Pid, {pread, 0, 100}).
{less,<<"FGHIJKLMNOPQRST">>}
</pre>
<p>さらに調子に乗って play_songs/3 の中の曲選択部分も別プロセスとして分離した結果、「曲データを無限に読み出し続ける」という処理は次のように簡潔な記述になった。</p>


<div class="wp_syntax"><div class="code"><pre class="erlang" style="font-family:monospace;"><span style="color: #ff3c00;">play_songs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">I</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">rpc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> next_block<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">write_data</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Bin</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">I</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Header</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">play_songs</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">I</span><span style="color: #014ea4;">+</span><span style="color: #ff9600;">1</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span></pre></div></div>



<p>いい感じだ。何となくErlangのプロセスの面白さが分かってきた気がする。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/255/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

