2013年07月

Yohoushi という分散 GrowthForecast グラフツールを作りました

こんにちは @sonots です。今日は Yohoushi (予報士) という分散 GrowthForecast グラフツールを作ったので公開します!

18

GrowthForecast
 はすごい便利なツールで、HTTP でデータを POST するだけで簡単にグラフを作ることができます。インストールも簡単ですし、とても素晴らしいツールです!o(^▽^)o

なのですが、徐々にグラフ化したいデータの数が増えるにつれて、主に2つの点において不満が生まれてきてしまいました(´・ω・`)
  1. 3階層しかもてない(/:service_name/:section_name/:graph_name の3階層)
  2. 書き込みスケーラビリティがない
    • 書き込みきれなくなった場合にもう1台足すしかない
    • そうすると、画面が分かれて使いづらい
この2つについては GrowthForecast の設計上、GrowthForecast のカスタムぐらいでは改善できなさそうでした。うちの GrowthForecast も1台では捌ききれない所に来ていて、もうそろそろ限界です。

というわけで「分散グラフツールが必要」という話になりまして、分散 GrowthForecast グラフツール Yohoushi (予報士) を作ったので OSS として公開します!

せっかくなので、上記2点の改善に加えて以下の3つの機能追加もしています。なので、この辺りの機能が欲しい、という方にとっても便利に使えるかもしれません。
  1. タグを付けて一覧表示
  2. グラフ表示期間の指定 ※ CloudForecast だとできる
  3. グラフ表示サイズの変更
Monitoring Casula Talks #4shibuyarb でトークさせてもらった時の資料もおいておきます(補足: 合体して1つにしました) :D

是非使ってみてください!



少し裏話。当初は GrowthForecast とはまったく別の分散グラフツールとして作ろうかという検討もしたのですが(MySQLにデータを保存しておき GNU Plot でグラフを描画、MySQL は Spiderでシャーディングして書き込みスケーラビリティを確保する、とか、もちろん Javascript のグラフ描画ライブラリも話にでました)、GrowthForecast にプルリク送って貢献しつつ開発していくのがOSSとしても健全なんじゃないかという結論に至りまして、分散GrowthForecastグラフツールとして実装することにしました。GrowthForecast がすでに持っている機能を再実装するのがかったるかったという話もあります ^^

なお、このグラフツールは同僚である @niku4i 氏と共同で制作しました。@niku4i 氏が所属している部署(自分とは別)でも同じような要件のグラフツールが欲しい、という話があがっていたので「似たようなもの作るんだったら一緒に作ろうぜ」という話をしました。共同活動をかる〜く許可してくれた上司と弊社の文化に感謝ですね。もちろん @niku4i にも多謝。打ち上げしましょう :D

それでは! 

perlで快適REPL生活!

最近 GrowthForecast とか GrowthForecast とかいじっているので、ruby でいうところの binding.pry みたいにコードの途中にブレークポイント貼ってごにょごにょデバグとかやりたいなーと思って、antipop さんの記事 を見て、Carp::REPL を試してみていたのですが、どうもすんなり入らないなーとか呟いていたところ、


という情報を頂いたので、Carp::Reply を試してみました。ちなみに reply というものもあって、こちらはインタラクティブシェルを起動するコマンドツールのようですね。※ コード読むと Carp::Reply が use Reply していました。

インストール
$ cpanm install Reply # こっちが reply
$ cpanm install Carp::Reply
Carp::REPL は苦戦してたのですが、こちらはすんなり入りました。Carp::REPL よりも依存モジュールが少ないので時間もかからなかった。

reply はこんなかんじでつかいます。簡単ですね!
$ reply
0> my $a = 0;
$res[0] = 0
1> $a+1;
$res[1] = 1

で、Carp::Reply はこんなかんじで使います。※比較のために antipop さんの記事 を元にしております。めんどくさかったわけじゃないw
#!/usr/bin/env perl
use strict;
use warnings;
use Carp::Reply qw(repl);

my $foo = 'foo value';
Carp::Reply::repl();        #=> ここでREPLに入る
                            #=> ↓は、REPLをC-dが:qコマンドで抜けた後に実行される

my $baz = 'baz value';
print "$baz\n";
自分は lib/GrowthForecast/Web.pm に Carp::Reply::repl(); でブレークポイントを貼って、curl でAPIを叩いて止まった所でごにょごにょとかやってました。

reply のコンソールが止まった所で #list とやると周辺ソースコードが表示されたり、#env とやると環境変数一覧が表示されたり、#bt とするとバックとレースが表示されたりするようですね。詳しくは本家のコマンド一覧を見るとよいかと思います。残念なことにステップ実行(次の行に進む)はなさそうですが ... T T

これで perl のデバグが捗るようになったのでお試しください!それでは! 

トラブルシュート

reply および Carp::Reply::repl() でヒストリ機能が使えるらしかったのですが、自分の環境では readline が動かず(´・ω・`) 結論としては、こちらのサイト のようにTerm::ReadLine::Gnu を入れたら動くようになりました! :D  同様に Linux 環境であれー?となっている方はお試しください!
$ cpanm install Term::ReadLine::Gnu
 

jquery autocomplete メモ

どれ使ったの?と聞かれたのでまとめておく。

jquery autocomple ライブラリ調査メモ. 派生大杉

色々調べた結果、dyve, devbridge のものは jquery-ui-autocomplete が ajax 対応していなかった時代に、ajax 対応したぜ、ということで作られたものっぽい。いまは jquery-ui-autocomplete が ajax 対応しているのでそれでよさそう. 完

CentOS5でrubyのsqlite3を使う

ハマってたのでメモっておきます。

CentOS5環境で rails4 アプリの開発をしていて gem 'sqlite3' を使っていたところでエラーが出ました。
$ rake db:drop db:create db:migrate
rake aborted! An error has occurred, this and all later migrations canceled: SQLite3::SQLException: not an error: INSERT INTO "schema_migrations" ("version") VALUES (?) Tasks: TOP => db:migrate (See full trace by running task with --trace)
なんだコレは、とコードを追いかけていたりしていたのですが、やっと原因がわかったのでメモ。

http://rubygems.org/gems/sqlite3 を見たら、
Note that this module is only compatible with SQLite 3.6.16 or newer.   
との記載があったので、rpm -qa でバージョンを確認してみると、
$ rpm -qa | grep sqlite
sqlite-3.3.6-6 sqlite-devel-3.3.6-6

ΣΣ(゚д゚lll)ガガーン ! そりゃ動かないわけですね。あのコード追いかけていた時間は一体 orz

じゃあアップデートだ!と思ったんですが、CentOS-Base.repo から yum update しようとしても CentOS5 の場合 3.3.6-6 が最新なんですよね。もとい、rpm と yum が sqlite を使っている(依存している)らしく、下手にアップデートすると壊れるっぽい ^ ^;; ※ 実際壊してしまった方がいらっしゃった。こわいこわい CentOS 5系からrpmとyumを消してしまった話

こうなるとソースコードからビルドして別の場所に入れるしかないようですね。http://www.sqlite.org/download.html から tar ボールをダウンロードしてビルドします。
$ cd /usr/local/src
$ wget http://www.sqlite.org/2013/sqlite-autoconf-3071700.tar.gz
$ tar zxvf sqlite-autoconf-3071700.tar.gz
$ cd sqlite-autoconf-3071700
$ ./configure
$ make
$ sudo make install
これで /usr ではなく /usr/local に入ったので、次は sqlite3 をオプション付きでインストールします。もはや bundler が使えないのが悲しいですね ... 
$ gem install sqlite3 -- --with-sqlite3-include=/usr/local/include/sqlite3 \
--with-sqlite3-lib=/usr/local/lib
これで、再度 rake db:drop db:create db:migrate したら動きました!同じハマり方をした方がいたら是非試してみてください!

それでは!
 

サブコマンドのないコマンドをthorで管理する方法

こんにちは @sonotsです。thor って便利ですよね。ということで、今日は thor の小ネタをひとつ。

thor
を使うと Ruby でサブコマンド付きのコマンドを簡単に書く事ができます。その辺については私も以前参考にさせてもらった hibariya さんのブログ Thorで簡単にコマンドラインアプリをつくる を見てもらうといいかと思います。

で、最近はもっぱら optparse ではなく thor を使ってコマンドラインツールのオプション処理をさせているのですが、特にサブコマンドの必要がないコマンドを作りたい場合も当然あって、そういう場合にどうすればいいのかぐぐっても全く出てこず苦労したのでメモっておきます。

結論から言うと default_command マクロを使って実現できます。
require 'thor'

class Command < Thor
default_command :start

desc "start", "start the command"
def start
puts "Hello World"
end
end

Command.start(ARGV) 

これで $ ./command だけでコマンドを実行できるようになります!

お気づきの通り、default_command は、サブコマンドを指定しない場合のデフォルトサブコマンドを指定するためのマクロです。デフォルトは help になっていますね。

とまぁ、書いてしまうと本当にただの小ネタなのですが、なんとオフィシャルドキュメントにも記述がないですし、ぐぐっても全く出てこない(ノД`)・゚・ということでググラビリティをあげるためにブログにしたためておきます。

これでググれるようになりますね :D
それでは!

※ ちなみに自分はソースコード読んで見つけました ^^;

A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー