コミケ告知

サークル活動の詳細は circle タグの記事へ。
ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示
2013年3月31日日曜日

Fluentdの出力をWebSocketに流すoutput pluginを書いた

Fluentdの出力をWebSocketに流すだけのoutput pluginを書いてみました。Rubyが全然わからないので、使い方をぐぐりながら。
普通はモニタリングしたければログなり標準出力なりに出せばいいので、広く一般に使えるものではないでしょう。リモートで動いているFluentdが吐くデータを、ちょっと手元のブラウザに出してみたかったんじゃよ。

いわゆる自分用プラグインです。インストールは「pluginディレクトリに置いてくれ」「em-websocketに依存してるからあれ入れてね」というバルクな仕様。他に使う人がいれば、Gemにした方が良いのかもしれません。

はじめてのRuby雑感

何かの勉強会でサンプルがRubyだったため、1回書いたことがあるような気がしますが、何も覚えていませんでした。変数の種類とかifの書き方とかを検索するレベル。
Rubyでは、変数に関数を直接代入は出来ないという理解であってますかね?検索したら proc というのが出てきたので、とりあえずそれを使ってみました。変数に直接関数入れられる言語と比べると、めんどくせーなーという印象です。

はじめてのWebSocket (クライアント側) 雑感

WebSocketってきっと面倒で、専用のライブラリがあってそれを使うのかな…と想像していましたが、生のWebScoketオブジェクトを使ってちょろっと送受信するだけなら簡単でした。
websocket.orgにechoのサンプルがあるので見ると、WebSocketのオブジェクトをnewして、あとはハンドラ(onXXX)に必要なものをセットするだけです。サンプルをここに書きおこす必要は感じられない程度に、シンプル。
最初はサーバーを自前で立てなくても、サンプルで使っているws://echo.websocket.orgで試せるのも有難いです。サーバーの動作を疑わなくてもよい点で。

はじめてのWebSocket (サーバー側) 雑感

FluentdのプラグインはRubyである必要があるため、em-websocketを使いました。作者が作者だけにrev-websocketで…とまず思ったけど、3年間更新されてませんね。動きませんでした。
exampleの中にあるmulticastのサンプルを見ながら動かしたら、意外とあっさり複数接続も出来ているようです。

FluentdはMessagePackフォーマットで出すのも簡単なため、受信側にmsgpack.jsを組み込んで、バイナリ送信にも対応しました。その際、いつものsendメソッドで送ろうとしたら接続が切れてしまうので何かと思ったら、どうやらsend_binaryという別のメソッドがあったようです。pull requestの履歴の中にありました。READMEの範囲では、そんなのわからなかったよ…
2013年2月20日水曜日

rvmのfirewall対策 (gitのプロトコル変更)

Ruby言語は自分では書かないし使うこともあまりないのですが、バージョンが依存があってめんどくさいので、複数のバージョンをひとつの環境内に共存させるのが割と定番みたいです。 そういった環境管理ツールのひとつがrvmなのですが、内部でgitを呼び出すときに、HTTPではない(ファイアウォールで閉じられていることの多々ある)ポート番号を使おうとする上にエラー処理が適当なので困ります。

debian# rvm install 1.9.3-head
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-1.9.3-head, this may take a while depending on your cpu(s)...
Cloning from git://github.com/ruby/ruby.git, this may take a while depending on your connection...

タイムアウト処理が一切ないようで、接続できなければ永遠に待ちます。gitのプロトコルが使えないのに待っていても成功することはないので、どうにかします。 rvmの中をgit://という文字列で検索をかけたところ、rvmのディレクトリ/config/dbに設定があり、こいつの中身を置換すればいいようです。

git:/をhttps:/に一括置換したところ、うまくいきました。