カテゴリー「Erlang」の7件の投稿

2010年11月 6日 (土)

MacPortsでCouchDBをインストール

MacPortsRuby on Railsが動作するPaaS環境HerokuNoSQLなアドオンとしてCouchDBが利用できるようになったらしい。

ということでCouchDBをMac OS Xにインストール。

$ sudo port list couchdb
couchdb @1.0.1 databases/couchdb
現時点でのMacPortsリポジトリに上がってるバージョンは1.0.1。

さっそくインストール。

$ sudo port install couchdb
---> Computing dependencies for couchdb
---> Dependencies to be installed: autoconf help2man p5-locale-gettext perl5 perl5.8 m4 automake curl curl-ca-bundle libidn openssl zlib pkgconfig icu libtool spidermonkey nspr readline
---> Fetching perl5.8
---> Attempting to fetch perl-5.8.9.tar.bz2 from http://www.cpan.org/src/
---> Verifying checksum(s) for perl5.8
---> Extracting perl5.8
---> Applying patches to perl5.8
---> Configuring perl5.8
---> Building perl5.8
---> Staging perl5.8 into destroot
---> Installing perl5.8 @5.8.9_3
---> Activating perl5.8 @5.8.9_3
---> Cleaning perl5.8
---> Fetching perl5
---> Verifying checksum(s) for perl5
---> Extracting perl5
---> Configuring perl5
---> Building perl5
---> Staging perl5 into destroot
---> Installing perl5 @5.8.9_0
---> Activating perl5 @5.8.9_0
---> Cleaning perl5
---> Fetching p5-locale-gettext
---> Attempting to fetch gettext-1.05.tar.gz from ftp://ftp.cpan.org/pub/CPAN/modules/by-module/Locale
---> Verifying checksum(s) for p5-locale-gettext
---> Extracting p5-locale-gettext
---> Applying patches to p5-locale-gettext
---> Configuring p5-locale-gettext
---> Building p5-locale-gettext
---> Staging p5-locale-gettext into destroot
---> Installing p5-locale-gettext @1.05_3
---> Activating p5-locale-gettext @1.05_3
---> Cleaning p5-locale-gettext
---> Fetching help2man
---> Attempting to fetch help2man-1.38.2.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/help2man
---> Verifying checksum(s) for help2man
---> Extracting help2man
---> Configuring help2man
---> Building help2man
---> Staging help2man into destroot
---> Installing help2man @1.38.2_0
---> Activating help2man @1.38.2_0
---> Cleaning help2man
---> Fetching m4
---> Attempting to fetch m4-1.4.15.tar.bz2 from ftp://ftp.dti.ad.jp/pub/GNU/m4
---> Verifying checksum(s) for m4
---> Extracting m4
---> Configuring m4
---> Building m4
---> Staging m4 into destroot
---> Installing m4 @1.4.15_0
---> Activating m4 @1.4.15_0
---> Cleaning m4
---> Fetching autoconf
---> Attempting to fetch autoconf-2.68.tar.bz2 from ftp://ftp.dti.ad.jp/pub/GNU/autoconf
---> Verifying checksum(s) for autoconf
---> Extracting autoconf
---> Configuring autoconf
---> Building autoconf
---> Staging autoconf into destroot
---> Installing autoconf @2.68_0
---> Activating autoconf @2.68_0
---> Cleaning autoconf
---> Fetching automake
---> Attempting to fetch automake-1.11.1.tar.bz2 from ftp://ftp.dti.ad.jp/pub/GNU/automake
---> Verifying checksum(s) for automake
---> Extracting automake
---> Configuring automake
---> Building automake
---> Staging automake into destroot
---> Installing automake @1.11.1_0
---> Activating automake @1.11.1_0
---> Cleaning automake
---> Fetching curl-ca-bundle
---> Attempting to fetch curl-7.21.2.tar.bz2 from http://distfiles.macports.org/curl
---> Attempting to fetch certdata-1.65.txt from http://distfiles.macports.org/curl
---> Verifying checksum(s) for curl-ca-bundle
---> Extracting curl-ca-bundle
---> Applying patches to curl-ca-bundle
---> Configuring curl-ca-bundle
---> Building curl-ca-bundle
---> Staging curl-ca-bundle into destroot
---> Installing curl-ca-bundle @7.21.2_0
---> Activating curl-ca-bundle @7.21.2_0
---> Cleaning curl-ca-bundle
---> Fetching libidn
---> Attempting to fetch libidn-1.19.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/libidn
---> Verifying checksum(s) for libidn
---> Extracting libidn
---> Configuring libidn
---> Building libidn
---> Staging libidn into destroot
---> Installing libidn @1.19_0
---> Activating libidn @1.19_0
---> Cleaning libidn
---> Fetching zlib
---> Attempting to fetch zlib-1.2.5.tar.bz2 from http://distfiles.macports.org/zlib
---> Verifying checksum(s) for zlib
---> Extracting zlib
---> Applying patches to zlib
---> Configuring zlib
---> Building zlib
---> Staging zlib into destroot
---> Installing zlib @1.2.5_0
---> Activating zlib @1.2.5_0
---> Cleaning zlib
---> Fetching openssl
---> Attempting to fetch openssl-1.0.0a.tar.gz from http://distfiles.macports.org/openssl
---> Verifying checksum(s) for openssl
---> Extracting openssl
---> Applying patches to openssl
---> Configuring openssl
---> Building openssl
---> Staging openssl into destroot
---> Installing openssl @1.0.0a_1
---> Activating openssl @1.0.0a_1
---> Cleaning openssl
---> Fetching pkgconfig
---> Attempting to fetch pkg-config-0.25.tar.gz from http://distfiles.macports.org/pkgconfig
---> Verifying checksum(s) for pkgconfig
---> Extracting pkgconfig
---> Applying patches to pkgconfig
---> Configuring pkgconfig
---> Building pkgconfig
---> Staging pkgconfig into destroot
---> Installing pkgconfig @0.25_1
---> Activating pkgconfig @0.25_1
---> Cleaning pkgconfig
---> Fetching curl
---> Verifying checksum(s) for curl
---> Extracting curl
---> Configuring curl
---> Building curl
---> Staging curl into destroot
---> Installing curl @7.21.2_1+ssl
---> Activating curl @7.21.2_1+ssl
---> Cleaning curl
---> Fetching icu
---> Attempting to fetch icu4c-4_3_4-src.tgz from http://distfiles.macports.org/icu
---> Verifying checksum(s) for icu
---> Extracting icu
---> Applying patches to icu
---> Configuring icu
---> Building icu
---> Staging icu into destroot
---> Installing icu @4.3.4_0
---> Activating icu @4.3.4_0
---> Cleaning icu
---> Fetching libtool
---> Attempting to fetch libtool-2.4.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/libtool
---> Verifying checksum(s) for libtool
---> Extracting libtool
---> Configuring libtool
---> Building libtool
---> Staging libtool into destroot
---> Installing libtool @2.4_0
---> Activating libtool @2.4_0
---> Cleaning libtool
---> Fetching nspr
---> Attempting to fetch nspr-4.8.6.tar.gz from http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v4.8.6/src/
---> Verifying checksum(s) for nspr
---> Extracting nspr
---> Configuring nspr
---> Building nspr
---> Staging nspr into destroot
---> Installing nspr @4.8.6_0
---> Activating nspr @4.8.6_0
---> Cleaning nspr
---> Fetching readline
---> Attempting to fetch readline61-001 from ftp://ftp.dti.ad.jp/pub/GNU/readline/readline-6.1-patches/
---> Attempting to fetch readline61-002 from ftp://ftp.dti.ad.jp/pub/GNU/readline/readline-6.1-patches/
---> Attempting to fetch readline-6.1.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/readline
---> Attempting to fetch readline-6.1.tar.gz from http://mirror.facebook.net/gnu/gnu/readline
---> Verifying checksum(s) for readline
---> Extracting readline
---> Applying patches to readline
---> Configuring readline
---> Building readline
---> Staging readline into destroot
---> Installing readline @6.1.002_0
---> Activating readline @6.1.002_0
---> Cleaning readline
---> Fetching spidermonkey
---> Attempting to fetch js-1.7.0.tar.gz from http://ftp.mozilla.org/pub/mozilla.org/js/
---> Verifying checksum(s) for spidermonkey
---> Extracting spidermonkey
---> Applying patches to spidermonkey
---> Configuring spidermonkey
---> Building spidermonkey
---> Staging spidermonkey into destroot
---> Installing spidermonkey @1.7.0_4
---> Activating spidermonkey @1.7.0_4
---> Cleaning spidermonkey
---> Fetching couchdb
---> Attempting to fetch apache-couchdb-1.0.1.tar.gz from ftp://ftp.infoscience.co.jp/pub/net/apache/dist/couchdb/1.0.1/
---> Attempting to fetch apache-couchdb-1.0.1.tar.gz from http://mirror.facebook.net/apache/couchdb/1.0.1/
---> Verifying checksum(s) for couchdb
---> Extracting couchdb
---> Configuring couchdb
---> Building couchdb
---> Staging couchdb into destroot
---> Installing couchdb @1.0.1_0
---> Activating couchdb @1.0.1_0
########################################################################
# Run the following command to install the CouchDB launchd
# startup item in order to start and re-start service automatically:
#
# sudo launchctl load -w /Library/LaunchDaemons/org.apache.couchdb.plist
########################################################################
---> Cleaning couchdb
依存パッケージが大量にインストールされた。Perlも入ってんなぁ。

CouchDBをサービス(daemon)化するにはlaunchctlを使用する。

$ sudo launchctl load -w /opt/local/Library/LaunchDaemons/org.apache.couchdb.plist
ブラウザでhttp://localhost:5984/_utils/にアクセスするとFutonという管理ツールが起動する。

Futon

| | コメント (4) | トラックバック (0)

2010年5月19日 (水)

(続)Ernie : Ruby/Erlang Hybrid BERT-RPC Server

ErlangRubyBERT-RPC ServerのRuby/Erlang実装であるErnieについて、面白そうなところなど。
インストール方法等はこちらをどうぞ。

ちなみに、BertもErnieもセサミストリートに登場するキャラクターだそうです。

Bert + Ernie

こういう遊び心、好きですヨ。


さて、Ernieを動作させるためにはconfigファイルが必要なので、下記のように作成し、config.cfgというファイル名で保存することにします。

[{module, ext},
{type, external},
{command, "ruby rpc-handler.rb"},
{count, 3}].
外部モジュールとして"ruby rpc-handler.rb"を実行し、そのプロセス数は3つ、という意味です。
従って、RPCとして動作させる(Ruby)コードはrpc-handler.rbというファイル名で保存すればイイわけですね。

サーバでコードが実行できる

RPCなので当たり前ですけど、リモートのコードをローカルから呼び出せます。 上記config.cfgファイルをリモート(サーバ側)に配置し、次にrpc-handler.rbというファイル名で下記をリモート側に保存します。
#rpc-handler.rb
require 'rubygems'
require 'ernie'
module Ext def hello(name) return "Hi, #{name}. I'm #{`hostname`.chomp}." end end
Ernie.expose(:ext, Ext)
コマンドプロンプトで以下を実行し、Ernieを起動します。
$ ernie -d -p 9999 -c config.cfg
最後にローカル(クライアント側)で下記スクリプト(client.rb)を実行します。
#client.rb
require 'rubygems'
require 'bertrpc'
service = BERTRPC::Service.new('リモートサーバ名', 9999) puts service.call.ext.hello('bar')
リモートサーバ名はDNSで解決できる名前かサーバのIPアドレスを適宜入力します。 サーバ名がfooの場合、実行結果は以下のようになります。
$ ruby client.rb 
Hi, bar. I'm foo.
このfooという名前は、リモート側で
`hostname`
を実行した結果ですので、確実にリモートでの実行結果をローカルで呼び出していることが分かります。

数値、stringや配列、ハッシュマップ、正規表現等が流せる

BERT and BERT-RPC 1.0 SpecificationによるとBERTとして流せるデータ型は下記の通り。
  • integer
  • float
  • atom
  • tuple
  • bytelist
  • list
  • binary
  • nil
  • boolean
  • time
  • regex
上の例ではhelloメソッドの戻り値がstringとしてBERTでローカルに流れていることになります。

それではlistに該当すると思われる配列をBERTで流してみます。
rpc-handler.rbに下記メソッドを追加し、Ernieを再起動します。

def list()
return [1, 2,'three',[4,5,'six'],7]
end
client.rbのRPC呼び出し部分は下記のように変更します。
p service.call.ext.list()
実行結果は下記の通り、期待通りに配列が取得できています。
$ ruby client.rb
[1, 2, "three", [4, 5, "six"], 7]
ハッシュも流せます。
def hashlist()
return {:a=>'a', :b=>1, :list=>list}
end
の結果は
{:a=>"a", :list=>[1, 2, "three", [4, 5, "six"], 7], :b=>1}
ハッシュなので順番は保持されませんが、正しい動作です。

次はtimeを流してみます。
rpc-handler.rbに下記メソッドを追加し、Ernieを再起動します。

def what_time?
Time.now
end
ローカルの
p service.call.ext.what_time?
の結果は期待通り
Sun May 16 02:21:13 +0900 2010
のようになります。

最後に、regex(正規表現)を流してみます。プロトコル上に正規表現を流すシーンがあまり思い浮かばないので、このような使い方で合っているのか分かりませんが、例えばrpc-handler.rbに下記メソッドを追加し、

def regex
return /foo(.*)baz/
end
client.rbを下記のようにします。
"foobarbaz" =~ service.call.ext.regex
puts $1
実行結果は
bar
であり、確かに/foo(.*)baz/でマッチした部分が取り出せています。

あるいは、rpc-handler.rbを

def regex(rgx)
"foobarbaz" =~ rgx
return $1
end
とし、ローカル側を
puts service.call.ext.regex(/foo(.*)baz/)
として、ローカルの正規表現をリモートに流し、その結果をstringで取得しても
bar
となります。

使い道は分かりませんが、とにかくBERTで正規表現が流せることが分かります。

無停止でハンドラを適用できる

ここまでに、rpc-handler.rbを適用するために、Ernieを何度か再起動していますが、実は無停止でハンドラを適用することができます。 gitのErnieのページのREADMEによると
reload-handlers Gracefully reload all of the external handlers
とあり、graceful reloadが使えることが分かります。

使い方は、コマンドプロンプトで下記のようにernieコマンドを実行するだけです。

$ ernie reload-handlers -p 9999
この場合、ポート9999でErnieが動作していなければ、エラーになります。

Erlangのフォールトトレランス

config.cfgファイルに{count, 3}と記載しておけば、外部モジュール(rpc-handler.rb)のプロセスが3つ立ち上がることは上で説明しました。

確かめてみます。

$ps x | grep ernie
29795 pts/0 Sl+ 0:00 /usr/local/lib/erlang/erts-5.7.4/bin/beam.smp (略) boot
30738 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [1] waiting
30740 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [1] waiting
30765 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [1] waiting
プロセスID=30738, 30740, 30765でrpc-handler.rbのプロセスがそれぞれ3つ立ち上がっていることが分かります。

ここで、30738をkillし、再びプロセスを見てみます。

$ kill -KILL 30738
$ ps x | grep ernie
29795 pts/0 Sl+ 0:00 /usr/local/lib/erlang/erts-5.7.4/bin/beam.smp (略) boot
30740 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [1] waiting
30765 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [1] waiting
31356 ? Ss 0:00 ernie handler unknown (ruby) - rpc-handle.rb - [0] waiting
なんと、30738はkillされましたが、代わりにプロセスID=31356が自動的に起動し、3つのプロセス数を保っています。

これはErnieがErlangで実装されていることが大きく寄与しているものと思われます。
Erlangには言語仕様としてのフォールトトレランス(耐障害性)機能があり、Erlangプロセスが落ちても自動的に復旧させることができます。

開発者が「プロセスが落ちたとき」の振る舞いに(それほど)頭を悩ませなくて済むのは大きな利点だと思います。

最後に

長々とErnieの特徴を見てきましたが、BERTというマイナーなプロトコルを扱うこと、RPCという(たぶん)トレンドではないアーキテクチャを扱っていることなどから、WEB系の開発ではErnieを使用することはあまりないかもしれません。 しかし、クラウドが隆盛をきわめている昨今においては、分散処理が重要なキーワードになる可能性があり、軽量RPC(という言い方が正しいか分かりませんが)は分散処理においても威力を発揮しそうです。

耐障害性を持ち、複雑な手順を必要とせずにリモートのコードが実行できるErnie/BERT-RPCや、その他の軽量RPCは、意外に今後注目されるかもしれません。

| | コメント (1) | トラックバック (0)

2010年4月 8日 (木)

Ernie : Ruby/Erlang Hybrid BERT-RPC Server

Erlang
Ruby
この辺で紹介したバイナリフォーマットBERT。

当時は単なるRubyでも使用できるバイナリフォーマットとRuby実装のRPCサーバ、という程度にしか認識してなかったんですけど、BERT and BERT-RPC 1.0 Specificationを再調査してたら

BERT (Binary ERlang Term) is a flexible binary data interchange format based on (and compatible with) Erlang's binary serialization format (as used by erlang:term_to_binary/1).
ということで、どうやらErlangでノード間通信するときのシリアライズフォーマットであるExternal Term Format(ETF)を拡張しているみたいです。

Erlangはちょうど勉強中ということもあり俄然、興味が沸いてきたのでもうちょっと調べたら、Ruby実装だと思っていたBERT-RPCサーバErnieはRubyとErlangによる実装だった模様。

Ernieの内部でどうやってRubyとErlangが連携しているかも興味があるし、これは試してみなければ。

まずはErlangのインストール。

次にErnieをRubyGemsでインストール。

$ sudo gem install ernie
Password:
Building native extensions.  This could take a while...
Building native extensions.  This could take a while...
Successfully installed bert-1.1.2
Successfully installed bertrpc-1.3.0
Successfully installed ernie-2.2.0
3 gems installed

BERT本体であるbertや、クライアントのbertrpcも同時にインストールされる。

んで、BERT-RPCサーバ側のハンドラを作る。
最初はIntroducing BERT and BERT-RPCと同じコードにしてみた。

# calc.rb
require 'ernie'
mod(:calc) do fun(:add) do |a, b| a + b end end

Ernieを起動。

$ ernie -p 9999 -n 10 -h calc.rb
(略)/1.8/optparse.rb:1450:in `complete': invalid option: -n (OptionParser::InvalidOption)
  :

動かねえじゃん!!
つか、-nオプションがマズいみたいだ。

パラメタなしで起動すると…

$ ernie
A config file must be specified: ernie -c /path/to/config.yml

-cオプションでコンフィグファイルが必要みたい。

どうも初期BERTとは仕様が違うみたいなので、GitHubの最新の仕様を参照。って、サンプルも載ってんじゃん。最初から見ろよ、おれ。

というわけでハンドラを作り直し。

require 'rubygems'
require 'ernie'
module Ext def add(a, b) a + b end end
Ernie.expose(:ext, Ext)

普通のRubyモジュールの書き方なので、こっちの方がイイね。

このRubyハンドラをcalc.rbとして保存し、次にコンフィグファイルを作成。

[{module, ext},
 {type, external},
 {command, "ruby calc.rb"},
 {count, 2}].

calc.cfgとして保存。
最後がピリオド(.)で終わってるし、Erlangのリスト形式なんだと思う。
これで(たぶん)externalなハンドラ(つまりRubyのハンドラ)をextというモジュール名で、Ernieに教えてあげてるんだと思う。countはworkerの数らしい。

コンフィグファイルを使ってErnieを起動。
コンフィグファイル内で"ruby calc.rb"としているので、コンフィグファイルがあるディレクトリで下記を実行する。

$ ernie -d -p 9999 -c calc.cfg
erl -boot start_sasl -detached +Bc +K true -smp enable -pz (略)/ernie-2.2.0/bin/../ebin \
 -ernie_server_app port 9999 -ernie_server_app config '"calc.cfg"' -ernie_server_app log_level 2 -run ernie_server_app boot

うまく立ち上がった!!

$ ps x | grep ruby
 3501   ??  Ss     0:00.18 ernie handler 2.2.0 (ruby) - calc.rb - [1] waiting
 3502   ??  Ss     0:00.18 ernie handler 2.2.0 (ruby) - calc.rb - [0] waiting
 3579 s000  R+     0:00.00 grep ruby

確かにRubyプロセスが2つ待機しているようだ。

実際にErnieと通信してみる。
もちろんRubyによるクライアント実装bertrpcを使う。
スクリプトを書くほどでもないので、irbを使ってインタプリタ実行。

$ irb
>> require 'bertrpc'
=> true
>> svc = BERTRPC::Service.new('localhost',9999)
=> #<BERTRPC::Service:0x1011369b8 @port=9999, @host="localhost", @timeout=nil>
>> svc.call.ext.add(1,2)
=> 3
>> 

おお!!
call request(同期処理)がちゃんと実行されてる!!
localhostなのでありがたみがないけど。

BERTが流れる通信路の暗号化はどうすんの?とか、非同期処理(cast request)はどうすんの?とか、興味はつきないけど、ひとまず超お手軽にRPCが実現できることは分かった。

| | コメント (33) | トラックバック (0)

2010年3月19日 (金)

Erlangでライブラリのソースコードの位置を知る方法

Erlangオープンソースの良いところは、ソースコードを読もうと思えば読めるところ。
特に言語系は(おそらくネイティブで動かすために)C/C++で書かれているだろうし、少なくとも自分はRubyのソースコードを読んだことがない。
C/C++でも読もうと思えば読めるけど、C/C++をもう読みたくない/書きたくないからその言語を使っているわけで。

でも、Rubyで書かれたRuby用のライブラリは、ごく稀に読むことがある。うまく動かない場合の調査したり、場合によっては(応急の)パッチを当てたりすることもある。
また、その言語の学習中などには、ライブラリ等の(きっと)良いコードを読んでお作法の勉強ができる、という利点もある。

というアレで、Erlangについてくるライブラリモジュールのソースコードの位置を知るTIPSを紹介。

まず、Erlangシェルを起動。

$ erl
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
1>
Erlangシェルでcode:which関数を呼び出す。
この例ではioモジュールを指定している。
1> code:which(io).
"/opt/local/lib/erlang/lib/stdlib-1.16.4/ebin/io.beam"
ebinというディレクトリにはコンパイル済みモジュールのオブジェクトコードが格納されていて、srcディレクトリには元のソースコードが格納されている。ebinをsrcで置き換えた
/opt/local/lib/erlang/lib/stdlib-1.16.4/src/io.erl
がioモジュールのソースコードということになる。

これで、ライブラリのソースコードも安心して読めるようになったネ!!(安心したので必要になるまで読まないけど。)

| | コメント (0) | トラックバック (0)

2010年2月10日 (水)

CentOS 5.3にErlangをインストール

CentOSErlangで分散プログラミングを試していると、どうしても複数マシンでErlangノードを動作させたくなってくる。

今のところ、MacBookでErlangを動作させているので、今度はWindows上のVMwareで動いているCentOS 5.3にErlangをインストールしてみた。

まずは、MacBookのErlangと同じバージョン(R13B03)のソース(otp_src_R13B03.tar.gz)をここから取得。
あとは、いつもの手順。

$ tar zxvf otp_src_R13B03.tar.gz
$ cd otp_src_R13B03
$ ./configure
$ make
$ su -
# make install
CentOSでErlangシェルを起動すると
$ erl
Erlang R13B03 (erts-5.7.4) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
1>
MacBookでは
$ erl
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
1>
MacBookの方が64bit版であること以外は差異がないので、たぶんこれで大丈夫なんだと思う。

| | コメント (0) | トラックバック (0)

2010年1月13日 (水)

MacPortsでErlangをインストール

MacPortsというアレで、MacBookにErlangをインストールしてみた。

Erlangの最新版はこちらによるとR13B03らしい。
MacPortsの方は…

$ port search erlang
erlang @R13B03 (lang, erlang)
    The Erlang Programming Language

おぉ、どうやら同じバージョン。えらいえらい。

さっそくインストール。

$ sudo port install erlang
--->  Computing dependencies for erlang
--->  Fetching expat
--->  Attempting to fetch expat-2.0.1.tar.gz from http://nchc.dl.sourceforge.net/expat
--->  Verifying checksum(s) for expat
--->  Extracting expat
--->  Configuring expat
--->  Building expat
--->  Staging expat into destroot
--->  Installing expat @2.0.1_0
--->  Activating expat @2.0.1_0
--->  Cleaning expat
--->  Fetching gettext
--->  Attempting to fetch gettext-0.17.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/gettext
--->  Verifying checksum(s) for gettext
--->  Extracting gettext
--->  Applying patches to gettext
--->  Configuring gettext
Error: You cannot install gettext for the architecture(s) x86_64 because
Error: its dependency libiconv only contains the architecture(s) i386.
Error: 
Error: Did you upgrade to a new version of Mac OS X? If so, please see
Error: 
Error:     http://trac.macports.org/wiki/Migration
Error: 
Error: Target org.macports.configure returned: incompatible architectures in dependencies
Error: The following dependencies failed to build: gawk gettext
Error: Status 1 encountered during processing.
Before reporting a bug, first run the command again with the -d flag to get complete output.
あかん…。gettextとやらがインストールできないせいで、失敗。

続きを読む "MacPortsでErlangをインストール"

| | コメント (0) | トラックバック (0)

2010年1月 6日 (水)

プログラミングErlang

マルチコア、メニーコア時代が到来しつつある昨今において、関数型言語を知らないというのはちょっとマズいかもしんない。

Rubyのまつもとゆきひろ氏の日記、Matzにっきの「次」の言語というエントリを読んでから2年半。

やっとポチりました。

プログラミングErlang/オーム社

Javaは少しだけ分かるので、JavaVMで動くScalaの方が良かったかもしれないんだけど、オブジェクト指向言語で関数型言語としても使えるScalaよりはピュアな関数型言語であるErlangの方が驚きが大きいかな、と。解釈が間違ってるかもしれないけど。
それに、(小さいプログラムを書く分には)動的型付けけっこー好きだし。

まぁ、いきなりErlangを使って何かやりたい、と思ってるわけではなくて、関数型言語がどんなモノかを少し分かったアタマで、ふだん使ってるオブジェクト指向言語を見てみると面白いかなーという程度。
(でも、この言語に対する感覚のよーなものはけっこう大事にしている気がする。)

年も変わったことだし、ちょっとリセットしてみたい気分なんでした。

| | コメント (0) | トラックバック (0)