ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java7 Files(NIO2)

2011-07-30 23:59:04 | PG(Java)

ちょっとファイルのコピーをしたいと思って、そういえばJava SE 7で新しいファイルライブラリーが出たはずだからそこだけ見てみようと思っていたのに、どっぷり時間を使ってしまった^^;
tryの新しい構文と併せて、これは意外と便利そうだぞ!?

Filesは、今までInputStreamやらBufferedReaderやらをインスタンス化するのが面倒だった部分が綺麗にライブラリーの中に隠された。これ、Scalaにも欲しいなw
ファイル名やエンコード名の指定がPath・Charsetのみであり、Stringで指定できないのが少々面倒だけど、Scalaだったら暗黙変換を使って何とでも出来るし。

しかしファイルオープン時の属性を色々指定できるようになったのは便利だけど、指定の仕方がなんだか微妙…。enumの値を可変長引数で並べるという(苦笑)

あと、POSIXファイル権限の設定・取得も微妙。Windowsで実行すると例外吐くのが良くない。
UNIX向けJavaプログラムを無理矢理Windowsで動かすことをたまにやるのだが、POSIXファイル権限のメソッドを使われちゃったら、外部からは回避不能だよ(汗)

リソース付きtry文(AutoCloseable)関連は、close()で例外が発生したらどうするんだろうと思っていたのだが、ThrowableにSuppressedという新しいフィールドが追加になっていた。
思っていたより高機能だなー!

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

systemとexec

2011-07-29 22:49:07 | PG(C言語)

昨日作ったC言語のプログラムを(ちょっとだけど)早速修正(苦笑)

C言語で外部プロセスを呼び出すにはsystem関数とexec系関数がある。
これを使ってCygwin上のシェルを呼び出すのに、昨日公開したやつは
system("bash.exe /home/hishidama/run.sh")
という形の呼び出しをしていた。

でもsystem関数はシェルを直接呼び出せるので、
system("/home/hishidama/run.sh")
でいい。

もしくは、exec系の関数を使うなら
execlp("bash.exe", "bash.exe", "/home/hishidama/run.sh", NULL)
の様に、bash.exe経由で呼び出すことになる。

昨日のはsystem関数を使ってるんだから、わざわざbash.exeを呼び出す必要は無い。色々試してる内に混ざっちゃったかな(汗)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

JavaからCygwin経由でシェルを呼び出す方法その2

2011-07-28 23:59:52 | PG(Java)

久しぶりにJavaのネタ。今日はJava7がリリースされた…んだけど、それとは全く無関係(爆)
それどころか超久しぶりにC言語までコーディングしちゃったし^^;

Windows環境で、JavaからCygwin経由でシェルを呼び出す新しい方法を思い付いたので、試してみた。

以前から、JavaのProcessBuilderで、直接シェルを指定する代わりにCygwinのbash.exeを呼び出して間接的にシェルを実行することは出来ていた。
でもこの方法だとJavaのプログラム内でWindows(Cygwin)かどうかを判定してWindows専用の処理を入れてやる必要があった。

新しく思い付いた方法は、Javaのプログラムはシェル呼び出しの形のまま、何も変える必要は無い。
呼ばれる側をシェルではなく「.sh.exe」という拡張子のexeファイルにする。exeファイルを実行する(呼び出す)ときは拡張子「.exe」を省略して指定できるので、表面上はJavaから直接シェルを呼んでいるように見えるというわけ(笑)
で、このexeファイルは、自分と同名のシェルをbash.exe経由で呼び出すように作っておけば、最終的にちゃんとシェルが呼ばれる。

exeファイルはCygwinのgccで作った。
なにせ超久しぶりにC言語のコーディングなんてやったもんだから、文字列の操作とか面倒くせー^^;
マルチバイト文字(UTF-8)の考慮なんて、どうすればいいのか分からん(汗)
(この辺りはJavaの方がはるかに楽だ。(そして配列操作はScalaの方がさらに便利だ(笑)))
本格的に使うとなったらそういった点もちゃんと作らないといけないだろうが、まぁとりあえずはいいやw

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

第三回Asakusaソースコードリーディングの感想

2011-07-27 23:59:41 | PG(分散処理)

AsakusaSCR第参回に参加してきました。今回はMonkey Magic(ジョブの運用監視ツール)について。
Togetter: 20110727_AsakusaSCR第参回(#AsakusaReading)

現在のMonkeyMagicのバージョンは0.9で、2.0で大改修すると共に名前を「Tengine」に変えてOSS化するとのこと。「T」と「engine」をくっつけて「てんじん」。
(あと、特許もとったらしい)

MonkeyMagicは2年くらい前から作り始めたそうで、元々はクラウド基盤(のリソース最適化)をターゲットにしていたらしい。その他に(値段の高い)商用製品の代わりとか、Hadoop(AsakusaFW)向けとかがターゲットになっている。

まぁ、AsakusaFWの中にMonkeyMagicIDなんて項目があったくらいだし(笑)
と思ってたんだけど、今日の話の中ではあまりAsakusaFWとの関連は出てこなかった。AsakusaFWのデファクトスタンダードになるのかと思ってたんだけどなぁ。
(主なものは、今後“AsakusaFWが動的にスケジュールを変える為の”情報提供機能を入れたい、というくらいか)

そもそも2.0で大改修するのは現在の仕組みに不都合があるとのことで、どんな不具合があったかという話と解決策の提示された。
主な原因として自前で機能を作りこみすぎて外部との連携が出来てないとか、顧客の話を聞かずに(想像で)進めたとか、これは自分も自戒しないといけないとこですね(汗)


MonkeyMagicでは、MonkeyMagicのサーバーやキューのサーバー・DBサーバー(MongoDB使用)は全て複数台(Actice-Active)で構成されていて、スケーラブルであり、単一障害点が無い。
監視対象マシンにはエージェントを入れておき、サーバーと通信(サーバーからエージェントへ設定変更したり、エージェントからサーバーへ状態を送信したり)する。このエージェントはインテリジェントではなく、エージェント間の通信も行わない。

で、Tengineではエージェントを2種類(システム監視用とジョブ実行用)に分け、通信用のキューの種類も減らす。
しかしキューを減らすと、フロントとエージェント(想定200個)の直接通信が増えて、障害時とかに問題になるんじゃないかとか、議論になった。
(クラウドの規格である)OpenStackやCloudStackではキュー指向らしい。
キューを使うにしても、優先度ごとにキューを用意する(OSではこの実装が多いらしい)・追い越しをするといった方法がある。
どういった方法をとるかが運命の分かれ道だそうで!

ジョブの制御とか障害検知時の動作とかは、まとめて「イベント」という概念で管理する。イベントに対してイベントハンドラを割り当てる。画面から有効化・無効化を設定可能。イベントハンドラはセッション(情報)を持つことが出来る。

1つのイベントに複数のイベントハンドラを登録可能とするので、どのタイミングでACK(正常応答)を返すのか(つまり障害が発生した場合の挙動)が問題になる。
これは場合によって異なるので、以下の3つの中から選択できるようにする。
1.全てのハンドラが正常終了したらACKを返す
2.1つでも完了したらACKを返す(現状はハンドラの登録順だが、優先順位をつけるべき?)
3.ハンドラ実行前にACKを返してしまう

Rubyを使ったDSLでイベントハンドラの割り当てを記述するらしい。ソースも見せてもらったけどRubyはよく知らないので雰囲気しか分からなかった^^; しかしイベントとハンドラの数ってけっこう多くなるんじゃないかと思うんだけど、記述しやすいのかなぁ?

もうひとつ出てきた概念が、「リソーストークン」。これは制御対象のリソースを表現するもので、トークンが獲得できたら処理を実行する、というもの。
例えば(これは自分の想像なので間違っているかもしれないけど)、「メモリーが4GB確保できて、ハードディスクが100GB空いたら処理を開始する」とか、「ロックを獲得できたら実行する」とか、そんな感じだと思う。「メモリー」「ハードディスク」「ロック」がリソースで、それを「トークン」という言葉で一元的に扱うのだろう。
これはなかなか面白い考え。
さらには、これを売り買いするところまで話を広がった。AmazonEC2の名前が挙がっていたけれど、確かに、クラウド上(基盤を共有)で自分が持っているリソースを他の人に売る(貸し出す)とか、緊急で使いたいときに他の人から買うとか、要望はありそうだよなぁ。

今後やりたい事として挙げられていたのは、まずリソースプロビジョニング。実行状況に合わせたサーバーの再配置とか、そういうのらしい。これと共に、AsakusaFWがジョブ最適化に必要とするデータを提供する。
もうひとつは、自動テストで非同期処理のテストを行う。RubyのFiberとObserverパターンを利用して、特定パターンの状態を再現できるんじゃないかと。(でも、非同期処理を記述するのは研究では昔から行われていて、それ専用の言語を使った方がいいんじゃないかというツッコミが…)


最後に今後のロードマップ。
8月末にOSS版を公開、9月末にジョブ機能β版、11月末にジョブ機能正式版をリリースするとのこと。

「OSS化する」と聞いていたので、今まで使われていたバージョンを公開するのかと思ったら、現在作成中(仕様検討中)のバージョンをOSSとして公開するようだ。今日の話を聞いていても検討事項はまだかなり多そうで、本当に出来るのかなぁ…?
しかも作ってすぐ公開ということになるから、実績がまた1から積み上げ直しって感じだよね…。

ジョブの運用監視ツールとしてはJP1が筆頭に挙がるし(値段が高いらしいけど)、Hadoop関連ではGangliaが紹介されていたり、色々選択肢はあるはず。
Tengineの売りって何?という疑問が会場から上がっていた。他のツールとは違う点ということで、DSLに注力したら?なんて声も。

そういえば、HadoopのMapReduceでMonkeyMagicが監視するのはJobTraker(つまり各データノードのTaskTrackerは対象外)ということでちょっと意外に思ったんだけど、普通のプロセス監視ツールでも、やっぱりTaskTrackerは対象外なのかな?
うーむ、データノードが死んだらHadoopが自動的に他のノードに処理を再割り当てするから、他のツールが監視する必要は無いのか。故障したサーバーの対処を運用者がする必要があるので、Hadoopのジョブ監視とは別のサーバー監視が要るってことか。


運用監視ツールは、障害が起きた場合も検知してちゃんと動かなきゃならない。(バッチならロールバックしてやり直せばいい、と言っても、運用ツールはそれ自体を行うものだから)こういうツールもかなり大変そう。

発表者の@akimatterさん、お疲れ様でした。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Spark saveAsTextFile(Windows)

2011-07-26 22:46:26 | PG(Scala)

Windows上で動かしたSparksaveAsTextFile()が使えなかった件、解決。

saveAsTextFile()を呼び出すと、(Sparkはファイル入出力にHDFSのAPIを使用しているので、その内部で)chmodを呼び出す。
Windowsにはchmodなんて無いから落ちる。

そこで、Cygwinのchmodを呼び出すようにしてやればよい
(以前、HadoopのMapReduceを直接Eclipseから呼び出すようにするときにやった方法なのに、うっかり忘れてたorz)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする