毎日昼飯をどこで食べるのかに本業より頭を使ってる気がするので自動化した。

require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'mail'

api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
version = 'v1.0'
station_ids = ['2800', '2811'] # hatagaya, hatsudai
page = 1
entries = 10
total_entries = 100

restaurants = []

station_ids.each do |station_id|
  while page * entries < total_entries
    url = "http://api.gourmet.livedoor.com/#{version}/restaurant/?api_key=#{api_key}&station_id=#{station_id}&sort=total"
    doc = Nokogiri::XML(open("#{url}&page=#{page}"))
    total_entries = doc.xpath('/results/total_entries').text.to_i

    doc.xpath('/results/restaurant').each do |restaurant|
      restaurants << {:name => restaurant.xpath('name').text,
                      :link => restaurant.xpath('permalink').text}
    end

    page += 1
  end
end

restaurants.shuffle!

body = ''
restaurants[0, 10].each_with_index do |restaurant, i|
  body += <<-EOS
#{i + 1}. #{restaurant[:name]}
#{restaurant[:link]}

  EOS
end

mail = Mail.new do
  from    'komagata@gmail.com'
  to      'komagata@gmail.com,machidanohimitsu@gmail.com'
  subject "Today's recommended restaurants"
  body    body
end

mail.delivery_method :sendmail
mail.deliver

ライブドアグルメの初台、幡ヶ谷の店からランダムで10個、12時になったらメールしてくれる。(これを前のエントリーの要領でcronに登録する)

Today's recommended restaurants - komagata@gmail.com - Gmail

こういうメールが届く。

これをWebサービスとして公開し、ユーザー同士で同じ店に行くことになったら偶然を利用してマッチングするというのを考えた。でもkowabana.jpをやりたいので誰か作って。

0 12 * * 1,2,3,4,5 bash -c 'source ~/.rvm/scripts/rvm; rvm ruby-1.9.2p290@default exec ~/code/random_lunch/random_lunch.rb'

Use bash -c and rvm exec

デザイナーにオススメのMacでのRubyの簡単な設定方法。(何故MacのGEM_HOMEはユーザー別のが先に無いのか - komagata

Snow Leopard, bashというデフォルト状態から、GEM_HOMEを設定するだけ。

~/.bash_profileというファイルに下記を書いてターミナルを再起動してください。

export GEM_HOME=~/.gem/ruby/1.8

これでsudoとかrvmとか無しで好きなrubygemが使えます。railsとかsinatraも使えるよ。

$ gem install sinatra

よくわからなくなってしまったら~/.gemフォルダを削除すれば無かったことにできます。

Let's enjoy ruby and rubygems!

これ便利さがちょっと伝わりづらいんですが、rvmで普段使いのruby(default)用にruby-1.9.2-p290@defaultとか作って指定しておくと@globalが空なので混ざらなくて良いって話。新環境作るたびに$ gem install bundlerする必要あるけど。みんなやってることかも?

RubyKaigi2011行ってきました。

Rubyコアの話はAfter Rails時代に後乗りしてきた僕にとっては耳が痛いというか、大変な苦労をされて作ってるのをタダ乗りしてる感じで申し訳無いなーと。

また、RubyKaigiに合わせて無理矢理ベータテスト開始した、怖話.jpのカードを@machidaさんに作ってもらって配ったりしました。カードを受け取ってくださった方々ありがとうございます。

!RubyKaigiではfluxflexのお話を聞かせていただいて、Lokkaがワンクリックインストール可能になっててテンションが上がったり。

Lokkaを使ってるという方やこれから使おうと思ってると声をかけていただいて嬉しかったです。CRubyに貢献できない分、僕はRubyで出来たオープンソースアプリという形で頑張らねばなあとやる気が湧きました。

一番ビックリしたのは2日目の懇親会後にサンシャイン60の下で@holman(Zach Holman)に会ったことです。

Automating Inefficiencies on Vimeo

VAGRANCEPTION on Vimeo

酔っ払って「駅どっちだ?」とかうろうろしてたら同じ状態の外人がいて、よく見たら生@holmanでした。

「うおっ、Zack Holmanだ!」

とか素で言ってしまいました。

boom gemが好きだとか日本で広めようとしてるとか言ってたら、

「You are wrong.」

とか言いつつ写真撮ってくれました。いやーびっくりした。

Paperclipで画像サイズの最後に使うコレ

has_attached_file :foo, :style => {:thumb => '100x80>'}

いつも意味忘れてググるけどImageMagickのオプションなので下記に書いてある。

Resize or Scaling -- IM v6 Examples

  • Ignore Aspect Ratio ('!')
  • Only Shrink Larger ('>')
  • Only Enlarge Smaller ('<')
  • Fill Given Area ('^')
  • Percentage Resize ('%')
  • Pixel Area Limit ('@')
  • Cropping ('#')

参照:[rails]PaperClipでクロッピング - func09

$ sudo easy_install pip && sudo pip install dotcloud
$ dotcloud setup
$ dotcloud create dotcloudrack
# Gemfile:
source :rubygems
gem 'rack'
# config.ru:
require 'rubygems'
require 'bundler'
Bundler.setup

class App
  def call(env)
    [200, {'Content-Type' => 'text/plain'}, ['unk']]
  end
end

run App.new
# dotcloud.yml:
www:
  type: ruby
$ dotcloud push dotcloudrack

http://c0435321.dotcloud.com/

dotcloud open dotcloudrackって出来てくれるといいな。

何も変えてないのにjenkinsのdailyのテストが通らなくなった。

% rake test
rake aborted!
no such file to load -- omniauth/password

(See full trace by running task with --trace)

手元でも確かに動かない。omniauthに何が起こった?bundleなどビルドプロセスが外部に依存してるとコードは変わってなくてもこういうことがあるのでdailyのテストも大事だな。

% bundle list | grep omniauth
  * omniauth (0.0.1)

OMG!

何故だかバージョン指定無しだと0.0.1が入るようになっている。

# Gemfile:
gem 'omniauth', '~> 0.2.6'

バージョンを指定して凌ぎましたが、他でも起きたら怖いので原因知ってる人がいたら教えてもらえると嬉しいです。

Herokuの新しいCedar Stackを使う。

今までと大きく違うのはforemanを使ったprocess modelが導入されたこと。要はwebアプリもcronジョブもバックグラウンドタスクもみんな宇宙船UNIX号の仲間たち、foremanで平等に扱おうよということ。具体的にはProcfileにprocessの設定を書いてforeman経由で動かす。

# Gemfile:
source :rubygems
gem 'rack'
# config.ru:
require 'rubygems'
require 'rack'

class App
  def call(env)
    [200, {'Content-Type' => 'text/plain'}, ['hello']]
  end
end

run App.new
# Procfile:
web: bundle exec rackup -p $PORT

こんな感じ。

$ gem install foreman
$ foreman start

ローカルでもforemanで試せる。

$ heroku apps:create --stack cedar
$ git push heroku master
$ heroku apps:open

http://floating-dawn-850.herokuapp.com/

いいね!

process typeを自分で定義する

unixのprocessなら何でもありなので適当に定義できる。

# Procfile:
web: bundle exec rackup -p $PORT
unk: echo unk; sleep 1000
% foreman start
02:23:42 web.1     | started with pid 77070
02:23:42 unk.1     | started with pid 77071
02:23:42 unk.1     | unk
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  WEBrick 1.3.1
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  ruby 1.8.7 (2011-02-18) [i686-darwin10.7.0]
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  WEBrick::HTTPServer#start: pid=77072 port=5000

こいつは自由だぜ。

# Gemfile:
gem 'barista'
gem 'therubyracer-heroku'
$ rails g barista:install

coffeeをrailsに提供するからバリスタってか?heroku上ではコンパイルするためのjs実装が無いのでエラーが出る(ローカルではnodejsを使ってます)。therubyracerはv8のrubyバインディング。therubyracer-herokuはそれをherokuで動かすためのもの(何やってるのかはわからない。見てない)。