rvmやめてrbenvにしてみた

特にrvmで困ってたわけではないけれども。試してみたかった。
強いていうなら、rvmとzshが仲よくない感じがしていたり、gemset使い分けとかしていたわけでもなく、私の用途にはオーバースペックな感はあった。

参考

手順については、上記リンクまま。とくに問題なく入りました。

これに前後して、powをhomebrewでインストールしたらnodeのコンパイルがやたら長かったり、powderと仲悪い感じになってしまったりして困った。
rbenvでは、gem-install後にはrbenv-rehashが必要な点だけ注意。これちょっと面倒。
ちゃんと設定してるのにそれでもpowがうまく動かないよーってときはリブートすればどうにかなる。きっと。

もしもやっぱりrvmに戻したいなら

rbenvのアンインストール方法についてはどこにも書いていないみたい。
単純に、以下のものを削除すればよさそう。

~/.rbenv
/usr/local/bin/rbenv
/usr/local/Cellar/rbenv
# rcファイルに追記したrbenv関連の設定

しばらくはrbenv使ってみます。
ただ、rbenvって毎回5文字もタイプするのしんどい。

alias rvm="rbenv"

混乱をまねきそうですね^^

練馬のとある地域のゴミの日を教えてくれるTwitter Botつくった

http://twitter.com/DayGomi

インスパイアードバイ 調布市第3地区のゴミの日情報を教えてくれるtwitter-bot作った - Yamagutsu Shoesを旅する
このエントリ、もう2年近くも前になるのですね。

Herokuを使って1日1回名言をツイートするTwitter Botの作り方 - アインシュタインの電話番号☎ という素晴らしい前例があるので、Botを動作させること自体は難しいことではありませんよね。とりあえずは動いているようです。

せっかくですので、Twitterに定期ポストさせるためにはHerokuのcronではなく、cedar stackのプロセスモデルを利用してclockプロセスを動作させています。そのあたりについては、こちらのエントリをご参照ください → Herokuでcron?もう古いかも、それ - Meltdown Countdown

ソース一式は marutanm/DayGomi · GitHub に置いています。こう書いたほうがもっとRubyらしいよ!とかありましたら、ご指摘いただけると嬉しいです。テストもない突貫コードで恐縮ですが*1
todoとしてReadmeをちゃんとしなければないのですが、何曜日が何ゴミかを書いているjsonを編集すれば様々なエリアに対応可能なつくりになっています。第1・3土曜日みたいな指定もできます。

*1:きのう家に帰ってきてから作りはじめて寝る前にデプロイした

github:pagesでもモダンな静的ページ運用をしたいよね

github:pagesが、githubにリポジトリをつくってpushするだけのお手軽仕様なのでもっと有効に使っていきたい!
でも、素のhtmlやcssを書くのもなー
デフォルトでJekyllというCMSが使えるようだけど、ブログにする*1わけでもないのに混み入った構成にしたくないし、github:pagesのためだけにその使い方を覚えるのも・・・

要点

  • haml+scss+coffeescript
  • ローカルではPowでsinatraで確認
やること
  • sinatraのプロジェクトを作成

github:pagesで使うにはプロジェクトルートにindex.htmlを置く必要があるけど、そこに色々ファイルを置いてごちゃごちゃしてしまうのは嫌ですね。ひとつディレクトリをつくって、Sinatra関連のファイルをまとめる。powのシンボリックリンクもそのディレクトリにはればいいし。

  • watchrをつかって、自動でhtml、cssなどを生成

watchrをバックグラウンドで動かしておいて、hamlやscssファイルへの変更がgithub:pages用ファイルに反映されるようにしておく。
scssとcoffeeそれぞれのコマンドで自前でwatchさせてやればwatchrいらなくなる。ただし、その場合プロセスを二つはしらせる必要がある。

ローカルでPowを使ったプレビュー時にはwatchrでファイルを生成する必要はないので、必要に応じてrakeをはしらせるのもありかも。

別案

マークダウンを使うという手もいいかもしれない。github:pagesならいい感じに表示してくれるし。ただ、Sinatraでマークダウンを扱うのをどうしたものか。

参考にしてもらえるかも

marutanm.github.com/src at master · marutanm/marutanm.github.com · GitHub
Sinatraに必要なconfig.ruとapp.rbや、ファイルを変換するためのRakefileないしwatchr.rbなど置いてます。

*1:Jekyllでブログするなら[http://octopress.org/:title] が良さそう

Powderをもっと便利にしようとしています

Pow使うならPowder入れておくだァーッ! - Meltdown Countdown
Powder 便利ですよね。

powder-cleanup

しかしながら、~/.powにシンボリックリンクを作成するというPowの仕様上しかたないことではありますが、Rackアプリを作っては消し作っては消ししているとゴミが増えていくことがあります。リンク先が存在しないシンボリックリンクが~/.powに残っていたりします。ひとつひとつ確認して削除とかはしたくないですね。

解決しました。cleanupというサブコマンドを書いてみました。
powder cleanupとするだけで、~/.powにあるシンボリックリンクでリンク先がみつからないものを削除してくれます。

powder-index

PowとPowderが便利すぎて、ローカルにRackアプリが増え続けることがあります。powder-list で~/.powの一覧を表示してくれますが、それだけでは今一歩。せっかくPowが静的ページの表示をしてくれるのですから、一覧自体もPowを使ってブラウザで見られるようにindex.htmlを生成するサブコマンドを追加してみました。
f:id:marutanm:20110727111901p:image
powder indexとすると、~/.pow/powder_index/public/index.html が生成されます。powder_index.devをブラウザからひらくことで、Powを使っているローカルのRackアプリに簡単にアクセスすることができます。ブラウザのホームとかに設定しておくと嬉しいかもしれません。

まとめ

clenaupindexというサブコマンドを作成してみました。どちらも絶賛Pull Request中*1なのですが、今のところ動きがないです。もし便利で使ってみたいと思われたら私のリポジトリのmasterからもっていくか、本家にマージされることを祈ってくださいませ。
ちなみにですが、Pow自体はコマンドをもっていないため、powでpowderが実行されるようにコマンドエイリアスを作成するともっと便利かもしれません。

*1:[https://github.com/Rodreegez/powder/pull/33] と [https://github.com/Rodreegez/powder/pull/34]

実はRackアプリ以外でも使えるPow

Pow: Zero-configuration Rack server for Mac OS X
Rackアプリをローカルで簡単に複数うごかせることでおなじみのPowですが、実は静的ファイルの表示もできたりします。

2.4 Serving Static Files
やり方は簡単、publicディレクトリにindex.htmlを置くだけ。あとはRackアプリと同様にシンボリックリンクを作成すれば動作してくれます。

f:id:marutanm:20110721130212p:image
これで、github:pagesを作成するときも簡単にローカルでチェックできますね。

hubコマンドがけっこう使えるっぽい

hub · the command-line wrapper for git

gitコマンドだと、ローカルのgitをごにょごにょするに限られる。でも、gitユーザならgithub使ってるでしょ。github上でのリポジトリの作成もコマンドラインからやりたくなるでしょ。

Macには公式GUIクライアントがあって、そこからgithubコマンドを入れられたりもします。しかし、そのコマンドはGUIクライアントを起動するためのもの。GUIクライアントがあっても悪くないけど、CUIでできることをわざわざGUIでする必要もないですね。

hub

インストール
$ brew install hub

その他のインストール方法は冒頭のリンク先を参照ください。

リモートリポジトリの作成
$ hub create

コマンドひとつでgithub上にリポジトリを作ってくれる。もちろん、remotes/orignも設定してくれる。
あるいは、hub-init時に-gオプションをつけるという手も。

clone
$ hub clone https://github.com/defunkt/hub

git:// とかなんとか、ブラウザからコピーせずとも ユーザ名/リポジトリ名でcloneできてしまう。
自分のリポジトリならユーザ名は省略できるし、-pオプションでgit@github.com ではじまるリポジトリ指定してcloneもできる。

その他、hub-browseでリポジトリのgithubページをブラウザで開いたりだとか、hub-pushではカンマ区切りで複数remoteを指定できたりだとか、こまごまと便利。

このhubコマンドはgitコマンドを拡張した作りになっているようで、gitコマンドの各種サブコマンド対応可能らしい。ので、gitをhubのエイリアスとして、gitコマンドの代わりに使えるとか。なるほど。

その他、詳細なマニュアルはこちら

Herokuでcron?もう古いかも、それ

結論から言いますと、今日現在ではまだ古くありません。まだアドオンもありますし。日時cron、無料です。

でもCedar Stackがデフォルトになる頃には過去の遺物扱いになるかもしれません。なぜならば、Cedar StackからProcess modelが導入されました。
ProcfileでClockwork gemをつかったclockプロセスを指定してやることにより、cronを使わずともタスクスケジューリングできてしまうのです。

すでにherokuを使ったことがある人でしたら「clockプロセス動かすって、dyno増やすの?料金かからないの?」と思うかもしれません。実は2011年6月1日からherokuの料金体系が変わっていて750 dyno-hoursまで無料で使えるようになっています。1dyno(=1プロセス)が1ヶ月で672-744 dyno-hoursとなるので、1dyno/月までならば無料でさらに少し余裕があります。
というわけで、通常rackアプリに使われるwebプロセスを動作させず、clockプロセスだけを動作させれば無料ですね。

ローカルでためす

clockwork を使ってみる

READMEを参照しながら、clock.rbを作成します。
とりあえず10秒毎のジョブだけ

#clock.rb
require 'clockwork'
include Clockwork

handler do |job|
  puts "Running #{job}"
end

every(10.seconds, 'frequent.job')

$ clockwork clock.rb とコマンドを実行する*1ことで、10秒毎にジョブが実行されているのが確認できると思います。

foreman から動かしてみる

Procfileを作成します。

clock: bundle exec clockwork clock.rb

$ foreman start とコマンドを実行する*2ことで、先ほどと同様のジョブがclockプロセスとして実行されるのが確認できると思います。

herokuで動かしてみる

git

gitリポジトリを作成してコミットしておきます。書くまでもないかもしれませんが、次のように。

$ git init
$ git add .
$ git commit -m 'first commit'
heroku

cedarスタックを指定してheroku-createします。そしてデプロイ。

$ heroku create --stack cedar
$ git push heroku master
$ heroku scale web=0 clock=1 # webプロセスをなくし、clockをひとつ起動する

$ heroku psで、clockプロセスが一つであることを確認。
つづいて、$ heroku logs --tailでログを確認。ローカルで動作させたときと同様、10秒毎にジョブが動作しているはず。

まとめ

cedar stackから導入されたProcess modelを利用、さらにclockプロセスでclockworkを動作させることによってherokuでdaily以外のタスクスケジューリングを無料で使えちゃいます。ただし、その場合webプロセスは止めないとお金かかりますけど。
Clockwork can be run as a singleton process for a very flexible cron replacement らしいので、いずれアドオンとしてのcronからclockプロセスを動作させる方針へとシフトしていきそうな気がします。たしかにPaaSでアプリをホスティングしてもらうことを考えると、そのほうが望ましいですね。
タスクスケジューリングができるとなにが嬉しいのかというと、毎朝前日の Rails のコミットログを自分にメールするようにできちゃうかもしれないわけです。というか、ほんとはそこまでやりたかったんですが、コミットログをまとめること、メールを送ることをどうしようか考え中。いずれそこまでを、できるだけシンプルにやりたい。

Gemfileなど説明していないものは、ソースをご参照ください。
https://github.com/marutanm/heroku-cedar-clock

*1:要、clockwork gem

*2:要、foreman gem