nohupで終了するまで標準出力がなされないことの対策
毎秒現在時刻を出力するRubyコードをnohupで実行し、その標準出力をリアルタイムにファイルに書き出すことを考えます。
$ nohup ruby -e 'loop{puts Time.now; sleep 1}' >exec.log & $ tail -F exec.log
こう書くと、exec.logの中身がnohupをkillするまで出力されない場合があります。リアルタイムにログを確認する時、そうなってしまうと不便です。これはSTDOUT.flushすることで解決できます。
nohup ruby -e 'loop{puts Time.now; STDOUT.flush; sleep 1}' > exec.log &
他のスクリプト言語でも、この問題が発生する場合は標準出力のflushを明示すると良いと思われます。
怠惰なCLIクラスを書いてみました
最近、CLIをRubyベースのものもちょこちょこと書いている気がします。一コマンドで完結するものはoptparseを使っていますが、gemのコマンドとしてジェネレータや開始、停止を持つようなものはサブコマンドを使った実装が欲しくなります。それを簡単に書くLazyCLIを作りました。
と、言っても100行に満たない小さな実装なのでgistにペトッと貼り付けました。
使い方は簡単で継承して、サブコマンドにしたいメソッドをcmd関数の第一引数で指定して、runメソッドを呼ぶだけです。あとは良きに計らって使用法とか生成されます。
これでオレオレCLIライフがはかどりますね。
TODO: *argsをoptparseに放り込んだ時の挙動を考える。
Thorというgemがあることを知りました。gem探すの難しい><
プロジェクトを簡単で綺麗に始めれるdodonpaというのを作りました
クリーンなRuby on Rails環境を手軽に作るシェルスクリプトdodonpaというのを作ってみました。
rails new my_appを使ってはいけない!
Railsプロジェクトを始めるに当たって、rails new my_appは標準とされているやり方です。しかし、これをやるにはgem i railsをしたりするので、グローバルのgemが汚染されてしまいます。1マシンで環境が解決するなら別にいいのですが、いくつかプロジェクトを作って、それぞれのバージョンが異なり始めるとちゃんとbundleでインストールするときにパスを指定したくなってきます。
すると、まあ、大体次の感じでコマンドを打ちます。
$ mkdir my_app $ cd my_app $ echo "source 'https://rubygems.org'\n\ngem 'rails'" > Gemfile $ bundle install --path vendor/bundle --without production $ bundle exec rails new . -f -T --skip-bundle $ echo '/vendor/bundle' >> .gitignore
これでプロジェクトの中にbundlerでインストールされて、グローバルのgemは汚染されなくなります。起動するときはbundle exec rails sみたいな感じになるやつです。
ただ、毎回プロジェクトを始めるときにこれを調べて打つのはメンドイです。というわけで、こういう綺麗にプロジェクトを立ち上げるシェルスクリプトとして、dodonpaというのを作ってみました。名前は世界最速で発進するコースターにあやかりました。
dodonpaの使い方
dodonpa/binにパスを通すとdodonpaコマンドが使えます。すると上のようなプロジェクトを立ち上げるには以下のコマンドでいけるようになります。
$ dodonpa rails my_app
今後の展開
dodonpaのコア部分のスクリプトはdodonpa subcommandを受け取ってdodonpa-subcommandに丸投げするだけの単純なものになっています。つまり、Rails以外のプロジェクトを今後追加することも可能になっています。むしろ、sinatraとかexpressとかやりそうな気がします。
また、dodonpa subcommand:actionという形式も受け取れるようになっています。まだ、作っていませんがrailsのforeman対応ということでdodonpa rails:foreman my_appとかもできるようになる予定です。
そういうマイベストプラクティス集として、自分とともに成長すれば良いかなと思っています。