blog.katsuma.tv
WEB+DB PRESS vol.68に寄稿しました
年末に発売されたWEB+DB PRESS Vol.66
のクックパッド特集のご縁から、同僚の @tadai, @makimotoと、4月24日発売の WEB+DB PRESS Vol.68
に「速習 リーンスタートアップ」という記事を書きました。
今、スタートアップを始めとするWebサービス界隈で話題の「リーン・スタートアップ
」について、その概要や理論と併せて、クックパッドにおける実践内容について15ページで紹介してます。(未確認だけど)訳本が出て間もないこのタイミングで、リーンスタートアップの概要と実践的な内容をここまでキュッとコンパクトにまとまった内容は、なかなか他で見れないんじゃないかなと思うので、リーンスタートアップについて興味を持っている人は手前味噌ながら必読かと思います!
あと、リーンスタートアップ特集以外にも、最近のトレンドをコンパクトにまとめた「Web技術まるごと整理」や「Node.js特集」をはじめ、豪華すぎる執筆陣の新連載... と、かなり濃厚な内容になっています。
と、いうわけで、書店で見かけたらぜひ手にとってみてください。連休のお供にもぜひどうぞ!
githubにPushしたらwebhooksとSinatraを利用してサイトを自動的に更新する
githubにはwebhooks機能があり、これを利用することで、git pushすると同時に様々な処理を実行することができます。たとえば、サイトをgithubで丸ごと管理している場合、pushと同時にサイトを更新することも可能です。
僕は趣味のとんかつサイトTON.KATSUma.tvを遊びで作っていますが、このサイトは今はgithubで管理して、手元でgit pushするとサイトが更新される仕組みにしています。id:viverさんが素晴らしい記事を書いて下さっていますが、今回はその復習的備忘録です。
Post-Receive URLs
webhooks機能を利用するためには、githubから送信されるHTTP POST命令の処理するWebサーバが必要になります。 僕は前回紹介したようなSinatraでwebhooksのPOST命令だけを受け付けるCGIを動かすhook.katsuma.tvの環境をさくらインターネット上に用意して、こいつで更新作業を行なっています。
セキュリティ無視して必要部分だけ抜粋すると、こんなかんじのスクリプトをSinatraで動かして更新しています。指定されたアプリケーションをgit pullしてrsyncさせてるだけ。もろもろ必要な情報は変数payloadにデータが載ってくるので、それを処理するようにしておきます。
#!/home/katsumatv/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
ENV['GEM_HOME'] = '/home/katsumatv/.rvm/gems/ruby-1.9.3-p125'
ENV['PATH'] = "#{ENV['PATH']}:/home/katsumatv/.rvm/gems/ruby-1.9.3-p125/bin:/home/katsumatv/bin"
require 'rubygems'
require 'sinatra'
require 'json'
post '/deploy' do
user = 'user_name'
server = 'host_name'
workspace = "/path/to/cache"
target_dir = "/path/to/www/"
payload = params[:payload] ? JSON.parse(params[:payload]) : nil
status 403 && return if payload.nil?
app = payload["repository"]["name"]
`cd #{workspace}/#{app} && git pull origin master`
`rsync -avz #{workspace}/#{app}/public/ #{user}@#{server}:#{target_dir}`
"done"
end
set :run => false
Rack::Handler::CGI.run Sinatra::Application
これで、http://hook.katsuma.tv/deploy で、POST命令を受け付ける準備ができたので、githubのPost-Receive URLsの設定を行います。
「アプリケーションのレポジトリ」>「Admin」>「Service Hooks」>「Post-Receive URLs」を辿るとURL設定フォームが表示されるので、上記URLを指定しておきます。
ちなみに、ここで「Tesh Hook」ボタンを押すと、実際にgit pushしたときと同じ情報がPost-Receive URLに発行されるので、開発時はこのボタンを利用すれば便利です。(最初これに気づかずに何度も空Pushしまくってました...)
今回はrsyncするだけの簡単な更新処理でしたが、Capistranoを利用してもう少し細かなデプロイ作業をしたり、デプロイだけじゃなくてCIの実行、メール送信、tweet。。など、 Hookから遊べそうなことは多いので、これを機にいろいろ試してみてはいかがでしょうか。
参考
さくらインターネットでrvm+Ruby1.9.3環境下でSinatraをCGIで動かす
このご時世、VPSでもクラウドでもなく、さくらインターネットのレンタルサーバでCGIを動かす必要があったので、その備忘録。KENT-WEBみたいなかんじのPerlでもよかったのですが、せっかくなのでモダンな環境を用意してSinatraで動かしてみました。
rvm+Ruby1.9.3のインストール
さくらでRubyをインストールするときは、googleで調べるかぎりソースからコンパイルして導入しているケースが多いのですが、面倒くさいだけなのでrvmを利用します。特に変わった設定は不要で、いつも通りの感じでインストールできます。
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
で、rvmのインストール完了。パスの設定なんかが書かれた$HOME/.profileが作成されているので、
source ~/.profile
しておきます。
また、rubyは1.9.3の最新版をインストールしました。
rvm install ruby-1.9.3 # default設定 rvm alias create default ruby-1.9.3
rvm listの結果がこんなかんじになっていたらインストール成功です。
$ rvm list rvm rubies =* ruby-1.9.3-p125 [ i386 ] # => - current # =* - current && default # * - default
sinatraの導入
特に何も気にせず最新版を導入します。
gem install sinatra
ちなみにインストールしたgemのバージョンはこんな感じです。
$ gem list *** LOCAL GEMS *** bundler (1.0.22) rack (1.4.1) rack-protection (1.2.0) rake (0.9.2) sinatra (1.3.2) tilt (1.3.3)
さて、さくらインターネットの設定で、CGIを動かすファイルの拡張子は.cgiである必要があるので、sinatraのスクリプトも*.cgiの名前で作成します。rubyのパスはrvmでインストールされたrubyのパスを設定する必要があるので、以下のような内容になります。
#!/home/katsumatv/.rvm/rubies/ruby-1.9.3-p125/bin/ruby ENV['GEM_HOME'] = '/home/katsumatv/.rvm/gems/ruby-1.9.3-p125' require 'rubygems' require 'sinatra' get '/' do 'Hello, World!!' end get '/foo' do 'foo!' end set :run => false Rack::Handler::CGI.run Sinatra::Application
ポイントは2つ。1つめは、GEM_HOMEのパスを明示的に指定してあげることです。これ、外から指定する方法がよくわからなかった上に、指定しないと動作しなかったので、シンプルにできる方法わかる方は教えていただきたいです。2つ目のポイントは最後の2行で、CGIで動作させる場合の設定として必要なことです。このへんの情報、Sinatraのドキュメント見てもよくわからなかったので、結構ハマりました。。
.htaccessの設置
さて、この状態で、start.cgiのパーミッションを755にすると、http://foo.com/start.cgiにアクセスすると「Hello, World!!」が表示されます。一方で、/fooにアクセスするためには「/start.cgi/foo」なURLでアクセスする必要があります。これはちょっとダサいので、mod_rewriteでいじることにします。httpd.confは編集できないので、.htaccessで次のような設定を記述します。
DirectoryIndex start.cgi
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ start.cgi/$1 [QSA,L]
これで、/fooにアクセスすると「foo!」と表示され、いつものSinatraな動作が可能になります。
まとめ
rvmを使うことで最新のRuby+Sinatra環境でcgiを動作させることができました。次はこの環境で、もう一歩踏み込んだ遊びをしてみたいと思います。
京都で企業説明会とイベントを開催します
アナウンスが若干遅れましたが、週末2/17(金), 2/18(土)にそれぞれクックパッドの企業説明会とイベントを開催します。
ちょうどいま実際に開発を進めているものの話も話す予定なので、興味のある方はぜひいらしていただければと思います。まさにこの記事書きながら今も資料を作っているのですが、いまから楽しみです!
2011年を振り返る
執筆
今年の目標、というかここ1,2年の目標で「本にモノを書いて自分が得た知見、考えをもとに価値を提供する」みたいなものをずっと考えていました。それがひょんな所からかなって、Web+DB PRESS vol.66で記事を書かせていただきました。
今回の記事の後も技評の稲尾さんとは仲良くさせていただいているので、今後もいろいろ僕なりのものを提供し続けられればな、と思っています。
仕事
仕事については、全体として良くも悪くも個人的にはスカっとできない感じがずっと続いていたと思います。。
一方で、震災の時にやった「限られた食材で工夫」の話だったり、ここ最近のいろいろ責任が増えた中でリリースしたものだったり(割といい数字が出た)を振り返ると、やっぱり自分は追い込まれてる時のほうがいい結果が出やすいのかなぁと感じています。縛りのある中の方がパフォーマンスが出やすいというか。
どんな時でもお前なんとかしろよ、な話ではあるかと思いますが、2012年は縛りをいい感じに自分でうまく設定して、パフォーマンスを上げていきたいですね。
プライベート
gem初めて作ったのはいい経験でした。
同じように、最近YouTube絡みのコードも書きました。
それぞれニッチなとこを狙ったものではありますが、自分も日常的に使うものになってるし、音楽に絡むコードを書く楽しさはこれらのコードを書くことを通じて再確認したので、来年もこんな感じのコードは書き続けたいな、と。
2012年
仕事でもっと圧倒的な結果を出したいですね!!!!1 それを元にして自分の知見だったり考えだったりをもっと外に広げたい、サービス開発エンジニアとしてはこれはやっぱり一番強く思っています。あと、仕事以外では、デバイス絡みでなんか作りたいと思っています。思っているというか構想はあるので、少しづつそれも実現していきたいですね。(最近また復活してきましたが)blogももっと書きますぞ!
と、いうわけで来年もよろしくお願いします!
YouTubeの音声をiTunesに転送する
年の瀬になんかちゃっちゃと作りたかったので、単機能musicalみたいなtaifuというスクリプトを書きました。
これは何?
YouTubeでかっこういい動画を見つけたときに、iTunesで音だけでも聴きたい!な時は割とあるかと思いますが、それを実現するスクリプトです。実行権限を追加して
taifu http://www.youtube.com/watch?v=KPWfBfFFrwsx
で、wavデータを標準のエンコーダ設定でエンコードして何事もなかったようにiTunesに追加します。(要VLC.app)
タグ情報はどうなってるの?
「TAIFU_NAME」「TAIFU_ARTIST」「TAIFU_ALBUM」の名前でタグ付けされているので、iTunes上から「TAIFU」で検索したら追加された曲が見つかるはずです。あとは自分の好みのタグ情報に更新ください。オプションで渡すことも考えたけど、iTunes上で編集したほうが楽だったのでやめました。
「あーこれいつでも聴いていたいな〜」なものを見つけたとき、ご利用ください!
WEB+DB PRESS vol.66に寄稿しました
Webエンジニアの教科書的存在であるWEB+DB PRESSですが、本日12/23に発売のvol.66でのクックパッド特集で寄稿させていただきました。
第三章「ユーザを向いたものづくり」が僕の担当です。サービス開発の進め方について余すこと無くクックパッドでのプロセスを全部まとめています。ユーザを徹底的に向いた開発手法について興味のある方は是非一読ください。
僕以外の記事もインフラ、開発基盤、スマートフォン開発、DevOpsと多岐に渡る分野の内容になっていて、かなり面白い内容になっていると思います。
読もう! WEB+DB PRESS!
このBlogは白金台のとある企業に勤めるWeb屋がLLネタや情報技術について直感で思ったことを何も考えず発信するサイトです。コメントはOpenID経由で直接いただくか、Trackback、SBM、メールなどでお待ちしています。