Erlang でできた Twitter クローン、 Twoorl をインストールしてみました。

| | コメント(2)
所長の関です。

ちょっと時間ができた時にたまたま Twitter で「Erlang でできたオープンソースの Twitter クローンが公開された」というつぶやきを見かけたので、早速インストールして動かしてみました。

Twoorl という名前のアプリケーションです。 作者の Palo Alto さんのブログはこちら。
http://yarivsblog.com/articles/2008/05/28/announcing-twoorl-an-open-source-erlyweb-based-twitter-clone/

週末に雨が降っていて、寒かったのでちょっと作ってみたそうです。すごいですね。
丸1日と、数回の午後を使って、コード は 1,700 行ほどとか。

作者が Twoorl を作った理由に
- Erlang の Web フレームワークである、ErlyWeb の使いかたを示すショーケースとして
- Twitter は中毒になるほど楽しいが、作ってみるのも楽しいと思った
- Twitter は有名だが、作者の知るかぎりオープンソースのクローンがない。誰か望む人がいると思った
- Erlang は web アプリケーションを作るのに向いていないという人がいるが、その人が間違っていることを証明したかった
- 並列処理が機能の恩恵を活かすことができるので、 Erlang は Twitter クローンを作るのにとても向いている。

というようなことを上げています。
また、作者は、Twoorl は現状では完全にスケールする作りにはなっていないとも書いています。

インストールは Leopard 上で行いました。mysql は MAMP のものをインストール済です。
順番にインストールをしていけばいいですが、ErlyWeb は バイナリで提供されているものではなく、trunk のソースからコンパイルしないとエラーになります。

以下、インストール手順です。

1.Erlang をインストール
http://www.erlang.org/download/ から、最新版の Erlang をダウンロードして、インストールをします。
ダウンロード後、./configure → make → make install でインストールできました。
wget http://www.erlang.org/download/otp_src_R12B-2.tar.gz
tar xvzf otp_src_R12B-2.tar.gz
cd otp_src_R12B-2
./configure
make
sudo make install
無事インストールできていれば、erl コマンドで Erlang が使えます。

2. Yaws をインストール
Erlang で書かれたウェブサーバである、Yaws をインストールします。
http://yaws.hyber.org/ からダウンロードできます。
こちらも、特に問題なくインストールできました。
wget http://yaws.hyber.org/download/yaws-1.76.tar.gz
tar xvzf yaws-1.76.tar.gz
cd yaws-1.76
./configure
make
sudo make install
まだサーバは起動せず次へいきます。

3.ErlyWeb をインストール
Yaws 上で ORマッパやテンプレート機能を提供する ErlyWeb をインストールします。
trunk のソースからコンパイルする必要があります。
まずは、Erlang のライブラリ以下に erlyweb のソースをチェックアウトします。
cd /usr/local/lib/erlang/lib
svn co http://erlyweb.googlecode.com/svn/trunk/ erlyweb
cd erlyweb
Makefile を環境に合わせて書き換え、make.sh を実行します。
vi Emakefile
# {"src/erlyweb/*", [debug_info, {outdir, "ebin"}, {i,"/opt/local/lib/yaws/include"}]}.
# の行を書き換え。この場合は /opt/local/lib/yaws/include を /usr/local/lib/yaws/include
sh make.sh
4.Twoorl をインストール
http://code.google.com/p/twoorl/ から、ソースコードをダウンロードします。
アプリケーションは、~/yaws_apps に置くことにしました。
cd /tmp
wget http://twoorl.googlecode.com/files/twoorl-0.2.tar.gz
mkdir ~/yaws_apps
cd ~/yaws_apps
tar xvzf /tmp/twoorl-0.2.tgz
cd twoorl
twoorl.sql というファイルがあるので、mysql のデータベースを作成します。
twoorl というデータベースを作成してあるものとします。
mysql -utwoorl -ppassword twoorl < twoorl.sql

# src/twoorl_app.hrl の内容を今回のアプリケーションに合わせ書き換えます。
vi src/twoorl_app.hrl

-define(DB_HOSTNAME, "localhost").
-define(DB_USERNAME, "twoorl").
-define(DB_PASSWORD, "password").
-define(DB_DATABASE, "twoorl").
-define(APP_PATH, "/path/to/yaws_apps/twoorl").
5.Yaws の起動
今回のアプリケーションに合わせ、/usr/local/etc/yaws.conf を書き換えます。
server ディレクティブ部分のみ書き換えればいいでしょう。
SSL 用の設定などもありますが、余計な server 部分は消してかまいません。
<server localhost>
        port = 80
        listen = 0.0.0.0
        docroot = /path/to/yaws_apps/twoorl/www
        appmods = <"/", erlyweb>
        <opaque>
          appname = twoorl
        </opaque>
</server>
書き換えたら、yaws コマンドで Yaws サーバが起動できます。( .... 以下は実行結果 )
sudo yaws -i
Password:
....
=INFO REPORT==== 31-May-2008::01:18:50 ===
Yaws: Listening to 0.0.0.0:80 for servers
 - http://localhost under /path/to/yaws_apps/twoorl/www

6.Twoorl のコンパイルと起動
まず、データベースへの接続をオープンします。
yaws コンソール上で、以下のコマンドを実行します。( .... 以下は実行結果 )
erlydb:start(mysql, [{hostname, "localhost"}, {username, "twoorl"},{password, "password"}, {database, "twoorl"}]).
....
mysql_conn:426: fetch <<"use twoorl">> (id <0.66.0>)
ok
# 最初、mysql が標準ポート以外で動いていたので、エラーになりましたが 3306 で動作させたところ繋がりました。
次に、Twoorl をコンパイルします。同じく yaws コンソール上で作業します。( .... 以下は実行結果 )
erlyweb:compile("/path/to/yaws_apps/twoorl",[{erlydb_driver, mysql}]).
....
debug:erlydb:391: Generating code for msg
debug:erlydb:391: Generating code for following
{ok,{{2008,5,31},{1,26,55}}}

いよいよ、Twoorl を起動します。( .... 以下は実行結果 )
twoorl.start().
......
debug:erlydb:391: Generating code for reply
debug:erlydb:391: Generating code for msg
debug:erlydb:391: Generating code for following
{ok,{{2008,5,31},{1,27,38}}}

この状態で、http://localhost/ にアクセスして、以下の画面が表示されれば成功です。
twoorl3.png
もちろん、ユーザー登録やつぶやき、フォローなども問題なくでき、日本語も通りました。
twoorl2.pngこの後は、複数台サーバを繋げる実験などをしてみたいと思っています。
Erlang のアプリケーションを作る際の参考にもなりそうです。皆さんも一度試してみてはいかがでしょうか。

コメント(2)

Anonymous :

手順どおり操作したつもりですが、
Webブラウザで開くと次のように表示されます。
どうもusrテーブルにsession_key列が定義されていないためエラーになっているような気がしますが、テーブルを投入するスクリプトtwoorl.sqlにも
create table usr (
id integer unsigned auto_increment primary key,
username varchar(30) not null,
password char(20) not null,
email varchar(50) not null,
num_msgs integer unsigned not null default 0,
num_replies integer unsigned not null default 0,
created_on timestamp,
unique(username, email)
) engine=innodb;
となっていて、session_keyが定義されていませんがいいのでしょうか?

以下ブラウザにひょじされるエラー
ERROR erlang code crashed:
File: appmod:0
Reason: {undef,
[{twoorl_app_controller,error,
[{arg,#Port,
{{127,0,0,1},1631},
{headers,"Keep-Alive",
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
"localhost:8081","Tue, 03 Mar 2009 08:46:19 GMT",
undefined,"\"2THG5MAAAAA\"",undefined,undefined,
undefined,undefined,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
undefined,[],undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
[{http_header,10,'Accept-Encoding',undefined,
"gzip, deflate"},
{http_header,11,'Accept-Language',undefined,"ja"}]},
{http_request,'GET',{abs_path,"/"},{1,1}},
undefined,"/",undefined,[],"c:/erlyweb/twoorl/www","/",
"c:/erlyweb/twoorl/www",undefined,undefined,,
[{app_data_module,twoorl_erlyweb_data},
{"appname","twoorl"}],
[],[],undefined},
undefined,
{error,
{mysql_result,[],[],0,
>}}]},
{erlyweb,out,2},
{yaws_server,deliver_dyn_part,8},
{yaws_server,aloop,3},
{yaws_server,acceptor0,2},
{proc_lib,init_p_do_apply,3}]}
Req: {http_request,'GET',{abs_path,"/"},{1,1}}
Stack: [{twoorl_app_controller,error,
[{arg,#Port,
{{127,0,0,1},1631},
{headers,"Keep-Alive",
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
"localhost:8081","Tue, 03 Mar 2009 08:46:19 GMT",
undefined,"\"2THG5MAAAAA\"",undefined,undefined,
undefined,undefined,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
undefined,[],undefined,undefined,undefined,undefined,
undefined,undefined,undefined,
[{http_header,10,'Accept-Encoding',undefined,
"gzip, deflate"},
{http_header,11,'Accept-Language',undefined,"ja"}]},
{http_request,'GET',{abs_path,"/"},{1,1}},
undefined,"/",undefined,[],"c:/erlyweb/twoorl/www","/",
"c:/erlyweb/twoorl/www",undefined,undefined,,
[{app_data_module,twoorl_erlyweb_data},{"appname","twoorl"}],
[],[],undefined},
undefined,
{error,
{mysql_result,[],[],0,
>}}]},
{erlyweb,out,2},
{yaws_server,deliver_dyn_part,8},
{yaws_server,aloop,3},
{yaws_server,acceptor0,2},
{proc_lib,init_p_do_apply,3}]

Anonymous :

上の自己レスです。

migrationフォルダ(WindowsXPなので)の5つのSQLを実行するとうまく動きました。
session_keyを追加するalter文なども含まれています。


Twoorlとのバージョンの関係なのでしょう。

コメントする