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つくった
インスパイアードバイ 調布市第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のためだけにその使い方を覚えるのも・・・
要点
やること
- 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を生成するサブコマンドを追加してみました。
powder indexとすると、~/.pow/powder_index/public/index.html が生成されます。powder_index.devをブラウザからひらくことで、Powを使っているローカルのRackアプリに簡単にアクセスすることができます。ブラウザのホームとかに設定しておくと嬉しいかもしれません。
まとめ
clenaupとindexというサブコマンドを作成してみました。どちらも絶賛Pull Request中*1なのですが、今のところ動きがないです。もし便利で使ってみたいと思われたら私のリポジトリのmasterからもっていくか、本家にマージされることを祈ってくださいませ。
ちなみにですが、Pow自体はコマンドをもっていないため、powでpowderが実行されるようにコマンドエイリアスを作成するともっと便利かもしれません。
実はRackアプリ以外でも使えるPow
Pow: Zero-configuration Rack server for Mac OS X
Rackアプリをローカルで簡単に複数うごかせることでおなじみのPowですが、実は静的ファイルの表示もできたりします。
2.4 Serving Static Files
やり方は簡単、publicディレクトリにindex.htmlを置くだけ。あとはRackアプリと同様にシンボリックリンクを作成すれば動作してくれます。
これで、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