2009年10月27日火曜日

10/27 勘違い

ストリームを受け取るタイプのUDOPで陥った勘違いだが、一度ProcessInput0メソッドが実行されるとそれが終了するまではいくら待てどもtuple.get_XXX()の結果は常に同じものを返すということだ。
二度目のtupple.get_XXX()実行時には次のSDOからデータを受け取るとばかり思っていたので実行結果がおかしくなってしまっていた。

2009年10月26日月曜日

10/26 STCP

とりあえず負荷分散的なことを行えそうな気がするプログラムは完成した。
負荷情報をSource OPのサーバTCPで受け付けているが、
何故かスタンドアロンモードだと通信できるが、デーモンだとうまくいかない。

rootでlsof -i:PORT_NUMBERとすると、スタンドアロンではアプリが確認できるが、
デーモンを立ち上げた状態だとコマンドが反応を返さないのでやはりうまくいっていない模様。

うまくいったときの反応
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
shedding 17153 matsuura 9u IPv4 3024160 TCP *:ddi-tcp-1 (LISTEN)

謎だ。

2009年10月21日水曜日

10/21 SPADEとTCP

stream foo = Source()["uri"]{}

uri部分をstcp://addr:portとするとTCPサーバ、
ctcp://addr:portとするとTCPクライアントとなる。

Rubyなどで直接これらにデータを与えるようなコードを書くような機会は多いと思うが、
System SではTCPで受け取ったデータの区切りを改行コードで判定しているようなのでそこは注意。

sock.write(ARGV[0])みたいなコードでstcpとやりとりすると、何度実行しても結果が反映されません。
改行コードがやってくるまでストリームを流さず、ひたすらデータをバッファして待ち受けているからです。

◎: sock.write(ARGV[0] + "\n")
×: sock.write(ARGV[0])

2009年10月9日金曜日

10/9 SPADE with Perl

今日は遅刻してしまった。
最近夜型になってしまったので再びインターンのときのような健康的な生活に改めたいです。

SPADEではプリプロセッサとしてPerlを利用できる。
ファイル名を.dpsから.dmmに変更すると、<% ~ %>で囲まれた部分はPerlで処理される。
(ブログの制約で、<>は本当は半角なのだが全角で書いている 10/26追記)

この場合、#define文や%1,%2...によるspadecへの引数が使えなくなるので要注意!
代わりに、<% $foo = $ARGV[0]; $var = $ARGV[1]; %>とでもして、
Perlの変数に引数を渡すようにして解決しましょう。

Func0-0,Func0-1.....Func9-8,Func9-9というようなストリームを作る場合。

<% for($i = 0; $i < 10; $i++){ %>
  <% for($j = 0; $j < 10; $j++){ %>
Func<$=${i}."-"${j}%>
  <% } %>
<% } %>

とすればOK。「<%=」は内部的には「<% print 」として評価される。

.dmmファイルは、内部では逆に<% %>外の部分をprintしつつ<% %>内の部分を実行させるようなPerlスクリプトに変換され、その生成結果を.dpsファイルとしていつもどおりにコンパイルを行うようになっている。
この処理は内部でspadecが勝手にやってくれるので、Makefileの.dpsという部分を.dmmに変えて、
いつものようにmakeするだけで.dmmファイルでPerlを利用することができる。
コンパイルがうまくいかない場合、途中生成された.dpsファイルを見ればどこがおかしいかはだいたいわかる。

ごく普通のPerlを実行しているので、複雑な演算や処理も可能。ただし、コードの可読性が著しく落ちる。

2009年10月8日木曜日

10/8 cpan

teslaにてcpanの設定を行い、モジュールをインストール。

・Encode //文字コード変換
・XML::FeedPP //RSS解析
・Net::Twitter //TwitterAPIのPerlバインド

この三つをインストールした。
今後、teslaでperlモジュールをインストールする場合は、
# perl -MCPAN -e shellで行ってください。

2009年10月7日水曜日

10/7 UDOP Tips1

UDOPでバイナリファイルを読み込むときの注意。

基本的に読み込みはprocessメソッドで行う。

ifstream in(<ファイルの絶対パス>);
ここは絶対パスな点に注意。UDOPはdataディレクトリなんぞ気にしません。

SPADEではByteListを使って読み込む場合、C++ではdlistとなるので注意。
このあたりの対応関係はマニュアルに記載されている。

ファイルから直接dlistへは書き込めないようなので、(>> などは使えなかった)
愚直にwhile文を使ってバッファに一度書き込んでから追記する。
dlistは内部ではvectorから継承されたものなので、push_backを使えばOK.。

まとめると、以下のようになる。

dlist buf;
unsigned char tmp;
ifstream in("FILE PATH");

while( in >> tmp)
buf.push_back(tmp);

これで、bufにファイルの内容が読み込まれる。
あとはoTuple.set_VAL(buf);とでもすれば、ストリームとしてバイナリを出力できる!

2009年10月6日火曜日

10/6 画像とSystem S

1.DSPSによる巨大データの転送実験
とりあえず、適当なテキストを読み込んで、その行数をカウントするプログラムを作成。
これは成功で、このプログラムに時間測定部分を付ければとりあえず計測は可能になる。

次は6MB程度の画像を作ってそれを転送してカウントする実験を行った。
しかし、画像が一枚の段階でもうまくカウントされない。
同様にテキストデータを作成してもうまくいかなかった。

2.環境整備
研究室内では二つのLANにまたがるノードを用いて計算環境に接続できるようにした。
これでルータを介さずアクセスできるので、寸断現象を抑えられると予想。
(今のところこの予想は正しかった模様 寸断現象は起きていない)
PowerEdge 650の二つのLANポートをそれぞれ111と112に接続することで実現している。
今のところ、111からのアクセスは全て許容し、112からは全て拒否するようになっている。
111からもssh以外は禁止にする予定。また、アカウントの管理が面倒なのでNISクライアントにすべきかも。
ゆくゆくはNFSのバックアップを行いたいので、ホームもNFSをマウントすべきか。
これは明日先生と相談することになりそう。

2009年10月5日月曜日

10/05 石井とミーティング

15時半より石井とミーティングを行う。

作業内容
・サーバ環境のセッティング
・SystemSの簡単な使い方の説明
・teslaへのMeCab、辞書、CPANモジュールのインストール

MeCabのインストールファイルなどは/rootに保管してある。
MeCabの動作を確認するため、teslaの文字コードはUS_UTF-8からJP_UTF-8に変更。
(/etc/sysconfig/i18nを書き直してreboot)

mecab, mecabのipa辞書,mecabのPerlモジュールのインストール
基本的にはtar.gzを展開してconfigure、make、make installでOK。
失敗した場合や消す場合は、make uninstallで一発。
IPAはUTF-8でインストールしたいので、コンフィグ時に./configure --with-charset=utf8を指定。
詳しくはmecabのページを参照するように。
perlモジュールの./test.plが動けば成功。