ブログトップ 記事一覧 ログイン 無料ブログ開設

とはえ領域

2012-02-06

40分かかる豚の角煮を作ろうとして、30分かけてクックパッドの右カラムにつくれぽを出すChromeのユーザースクリプトを書いた

スーパーで豚バラブロックが安かったので、クックパッドの人に誕生日プレゼントでもらった圧力鍋て豚の角煮を作ろうとぐぐってクックパッドを見てた。

クックパッドの有料会員の場合は人気順でソートできるけど、有料会員ではないため「料理名 cookpad」のようにGoogleで検索して、出てきたレシピのつくれぽ数を見て数が多いものを作ってるユーザーは多いと思う。たぶん。

ただつくれぽはページ下部にあるためスクロールして見るのがだるい。だるいとは思いながらも今まで使ってたんだけど、いい加減めんどくさくなってきたのでユーザースクリプト書くことにした。

FirefoxだとGreasemonkeyが有名で年に2回くらい書くけど、Chromeのは書いたことがなかったのでこれを機に書いてみた。

twitterでどう書くのか聞いてみたらNinjaKitというのを使えば楽だという助言を受けた。

NinjaKit - 0xFF

グリモンと同じように書けて便利やんけと思ったらクックパッドの人が作ったものだった。またここでもクックパッドに世話になるのか…。

このツールは確かに便利で、インストールして拡張機能からオプションを選び、Add new scriptを選んで下記のコードを保存すれば動いた。

// ==UserScript==
// @name           kakuni
// @namespace      buta
// @include        http://cookpad.com/recipe/*
// @require             https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==

(function(){
  var $tsukurepo = $("#tsukurepo_container").clone();
  $(".content_title_with_line", $tsukurepo).text("つくれぽ");
  $(".tsukurepo_title", $tsukurepo).attr("style", "width: 280px;");
  $("#side").prepend($tsukurepo);
})();

jQueryをrequireしてページ下部のつくれぽをcloneして要素をちょっと書き換えて右カラムに追加しただけ。たぶんグリモンでも動くし、簡単ですね!

ちなみに見た目はこんな感じになる。

f:id:tohae:20120207020702p:image

雑な対応なんでソースも見た目も雑だけど、個人的な要望は満たせたかなと。

ただスクリプトを書く時間とブログを書く時間を合わせれば豚の角煮作れたなと思うとちょっと悲しい…。

2012-02-04

最近やってるRailsプロジェクトのテスト方法

Railsエンジニアになってから1年半くらいが経ち、社内のRailsのプロジェクトを全部で5つくらい触って、今やってるAbilie*1でようやく人並みにテストを書いてる気がしてきたので、現時点でやってるテストの方法をまとめておく。

テストのルール的なの

rspecでは必ずモデルのテストは書くようにしてる。ヘルパーも大体書いてるけど、コントローラやルーティングのテストはあまり書いてない。

というのも、コントローラーのコードを極力短くしてモデルを太らせているのでコントローラのテストはあんまり意味が無い気がしていて、その代わりにCapybaraでテストを書いておけば十分なんじゃないかなと思ってきたから。Capybaraは書いてるので、そういう意味では書いてるとも言える。

社内の管理者だけが使える管理画面も作ってるけど、そっちはテストあんまり書いてない。ここは動かなくなっても一般ユーザーには影響が無いので、動かなくなったのを気づいてから直せばいいかなーという感じ。

テストの実行

GuardとSporkを組み合わせて使い、結果をGrowlで出力してる

guard/guard - GitHub

guard/guard-spork - GitHub

Guardはファイルに変更があったらなにかしてくれるもの。

Sporkは事前にRailsのコードを事前に読み込んでおいてrspecの起動時間を短縮してくれる。

GrowlMacだったらみんな使ってるアレですね。最近有料になりましたが、会社に #金くれ って言ったら買ってくれました。

Guardに関して紹介してるブログとか読むと、guardを起動時に全体のテストを流し、モデルなどのテストを通ったらまた全体のテストを流すように設定してあるけど、全体テストが流れると時間がかかるので設定を無効化してる

Guardfileを以下のように書けばいい。

guard 'rspec', :version => 2, :cli => "--drb", :all_after_pass => false, :all_on_start => false do

全体テストが実行したくなったら、guardが動いてる所でEnterを押せば動く。

fixture_replacement

factory_girlで特に困ってもないので相変わらずfactory_girlを使ってる。

thoughtbot/factory_girl - GitHub

modelを作成したときにfactory_girlのファイルも生成するようにconfig/application.rbに以下のように書いてる

config.generators do |g|
  g.test_framework :rspec, :fixture => true, :fixture_replacement => :factory_girl
  g.fixture_replacement :factory_girl, :dir => 'spec/factories'
end 

あとSporkを実行してると、factory_girlのファイルに変更があっても更新してくれないので、spec_helper.rbに以下のように書いてる。

Spork.each_run do
  FactoryGirl.reload
  Deadend::Application.reload_routes!
end

カバレッジ

半年くらい前はcover_meを使ってたけど、最近はsimple-covを使ってる。

colszowka/simplecov - GitHub

出力されたカバレッジ結果のHTMLが綺麗なのと、rcov形式で出力できてJenkinsでも使えるのが良い。

Sporkで実行される場合は何か変になるので、Sporkを使ってる時は実行しないようにしてる。

あとローカルでrake specしたときはデフォルトの出力を、CIで実行した場合にはrcov形式で出力できるようにspec_helper.rbに以下のように書いてる。

unless Spork.using_spork?
  require 'simplecov'
  if ENV["JENKINS"] == 'on'
    require 'simplecov-rcov'
    SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
  end

  SimpleCov.start 'rails' do
    add_filter "/spec/"
  end
end

Redisのテスト

resqueを使ってるというのもあり、プロジェクトでRedisを使っているのでこのテストも書きたい。

RSpec and Resque - GitHub

resqueのWikiを参考に、テスト実行時にredisのconfファイル作ってredisを起動し、テストが完了後にプロセスを落としてダンプファイルも消してる。

Jenkinsで動かす場合にうまく動かなかったのでその部分だけTempFileを使うようにしてる。

REDIS_PID = "#{Rails.root}/tmp/pids/redis-test.pid"
REDIS_CACHE_PATH = "#{Rails.root}/tmp/cache/"

config.before(:suite) do
  redis_options = {
    "daemonize"     => 'yes',
    "pidfile"       => REDIS_PID,
    "port"          => 9736,
    "timeout"       => 300,
    "save 900"      => 1,
    "save 300"      => 1,
    "save 60"       => 10000,
    "dbfilename"    => "dump.rdb",
    "dir"           => REDIS_CACHE_PATH,
    "loglevel"      => "debug",
    "logfile"       => "stdout",
    "databases"     => 16
  }.map { |k, v| "#{k} #{v}" }

  if ENV["JENKINS"] == 'on'
    require 'tempfile'
    temp = Tempfile::new("redis_temp.conf", REDIS_CACHE_PATH)
    redis_options.each do |value|
      temp.puts(value)
    end

    temp.close

    Subexec.run("redis-server #{temp.path}")
  else
    redis_options = redis_options.join("\n")
    `echo '#{redis_options}' | redis-server -`
  end
end


config.after(:suite) do
   %x{
     cat #{REDIS_PID} | xargs kill -QUIT
     rm -f #{REDIS_CACHE_PATH}dump.rdb
   }
end

WebAPIのテスト

ここで言うWebAPIのテストとは、外部のWebAPI(twitterとか)を使う場合のテストのこと。

これはwebmockというgemを使えば良い。

bblimke/webmock - GitHub

ただ、webmockを使ってしまうとCapybaraがlocalhostにアクセスしたときにもすべてmockが返ってきてしまうので、localhostを除外するようにする

spec_helper.rbに以下のように書く

WebMock.disable_net_connect!(:allow_localhost => true)

Javascriptのテスト

Capybara-Webkitを使ってる。

no title

今のところそんな特殊なJavascriptを書いてるわけではなく、ほとんどjQueryに頼ったものなのでこれで十分間に合ってる。

ただ、隣の人からJSのカバレッジも見たいという要望も出てるので、poltergeistを使ったほうが良いのかもしれない。

jonleighton/poltergeist - GitHub

あとCapybara-Webkitrspecとは別のスレッドで動くらしく、factory_girlで作ったデータをCapybara側で読めない。

CapybaraのgithubActiveRecordのshared_connectionを変える方法が紹介されてるけど、なんかうまく行かなかったのでDatabaseCleanerを使う方法をとってる。

JSのテスト以外は従来のtransactionを使ってデータを消し、JSの時はtruncateを全テーブルにする方法にしてる。

Capybara.javascript_driver = :webkit

config.before :each do
  if Capybara.current_driver == :rack_test
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.start
  else
    DatabaseCleaner.strategy = :truncation
  end
end

config.after :each do
  DatabaseCleaner.clean
end

画像のテスト

画像関連はCarrierWaveを使ってるんだけど、factory_girlで作られてしまうのでテストが終わった後に消してる。あとテストの場合は通常とは違うディレクトリに書き出してる。

継続的インテグレーション

Jenkinsを使ってgitにpushされたらテストを実行してる。それとは別に朝8時ごろにも流してる。

simplecov-rcovとci_reporterを使って、カバレッジとテスト数の推移をグラフで出してる。

またテストに通ったら、自動的に社内の検証環境にデプロイされるように、ビルドパイプラインの設定をしてる。

Abilieに関してはまだリリースされてないので、Jenkinsも試験的に社内のサーバに入れてるだけで、本番へのデプロイとかはやるかどうかわからない。

まだJenkinsは使い始めたばかりであまりいじってないけど、rails_best_practiceとかも組み込めるといいかなと思ったりしてる。

おわりに

入社した直後に引き継いだプロジェクトはテストも無く、チームにテストを書く文化もなく、業務でちゃんとテストを書いたことがなかったぼくですが、入社半年後くらいからテストを書き始め、少しずつテストを書く文化ができてきてよかったかなと。

とは言っても僕の担当してるプロジェクト以外は相変わらずテストが書かれてないものが多いので、そのあたりが今年の課題な気はしてる。

2011-12-31

2011年を振り返る

http://d.hatena.ne.jp/tohae/20101230/1293701571

去年もやったので今年もやる。今年はふぁぼったーとGoogle Calendarを元に振り返った。

1月

大学の同期が入社した

中学の友人の結婚式に行った

温泉行った

誕生日プレゼントをおくりゅ〜さんからいっぱいもろた

('・c_・` )

ガラケー対応とかしてた

2月

のろくとあむひまが同じ顔で笑ってたらしい

スマフォ対応(pjaxもどき)してた

3月

地震おきたのに夜会してた

まどマギ見たほむ

くずヒマした

tohae_tonariが辞めた

4月

3DS買った

教育してたインターンが戦力になり始めたらしい

ちゃーちるを娘にほしいと思ったらしい

広島に結婚式に行った

5月

会社の同僚が結婚した

前の会社の夢を見てうなされたらしい

Ariaの画面を割ったらしい。割った状態でよく7ヶ月も使ったな…

自転車買った

6月

理由があって文フリ行かなかった

熱々のたこ焼きを美味しそうに食べるせいりょーの姿が印象的だった

E(・3・)M

7月

仕事が怪しい雰囲気になってきた

#月曜日寿司

8月

仕事は怪しい感じになってきてるけど評価はされた

やることがなくなってきたので社長のわがままに付き合った

紳助、ジョブズなどが辞めて辞任ブームに乗っかり会社辞めてもいいかなと思ったりした

MacBook Air買って、会社はiMacになった

海行ったり花火行ったり

9月

チョコレイト・ディスコの練習を始めた

月が綺麗でしたね

本気で辞めること考え始めようかなーと思ったりしてたら、tohae_tonariが辞めた。そりゃそうなるわなー。おれはもうちょっとがんばってみようと決意した気がする。

喫茶とはえやりたい

帰省

新プロジェクトがようやく始動

10月

やふゅ〜む初ライブ

仕事はない

11月

仕事はない

温泉行った

人を馬鹿にしたようなトマト画像が送られ始めてる

気づいたら結婚したことになってた

12月

Galaxy Nexux買った

仕事はようやくやることが増えてきた

実家帰った

まとめ

上半期は仕事はサービス開発やモダンな開発環境の構築など、やることもやりたいことも多く充実してたけど、下半期はいろんなことがあってやることがなかったし、よく辞めなかったなレベルでした。12月くらいから少しずつ上半期のノリに戻りつつあるので2012年はもっと仕事したいですね!!!

プライベートでは結婚式とか旅行とか、あと色々買ったりとお金をよく使った一年でした。来年も遠くに旅行いったり、ガジェット買ったりしていきたい。

大震災とかタイの洪水とか、偉人がいなくなったり社会的にいろいろ大変な年でしたが、個人的にはまぁまぁ満足度の高い一年だったと思います。

2012年もよろしくお願いします。

2011-12-22

Abilieという自分にできることをお金に変えるサイトを作ってる話

Abilie [アビリエ] │あなたの知識やスキルを共有し、みんなに販売するサイト

夏ごろはやることなくて社長の思いつきを数日で作ったりしてましたが、ここ2,3ヶ月くらいはAbilieというサイトを作ってます。

まだ告知ページだけなんですが、自分の持ってる知識や特技を有料で売買しようというサイトです。なぜかECサイトを作ってて自分でも困惑してます。

社長曰く「産業は農業、工業、サービス業と来ていて、その時代ごとに農場、工場の場所があった。次は情場が必要になる」とか言ってた気がします。気がするだけで違うかもしれません。忘れました。なんか10年くらい前から?ずっとやりたかったらしいです。

最近だと国内外でもこのようなサービスが増えてきて、ようやく時代が追いついた?的な感じになったらしくプロジェクトがスタートしました。海外だとpaygrとかfiverrなんかが有名みたいです。

Buy, Sell & Make Money on Paygr

Fiverr - Hire people to do things for $5

OKWaveYahoo知恵袋のようなQ&Aサイトは無料で解決できるのがうれしいですが、本当に困ってる問題は金払ってもいいような場合があります。

僕が最近困ったことで金払っても良いなって思ったのは、10月に友人の結婚式でPerfumeのチョコレイト・ディスコを踊った時のことで、3人ともダンス素人だったのですごく大変でした。もし素人でも簡単に踊れる動画解説付きのものがあれば金払って買ったかもしれませんね!

というわけで、Abilieは2月オープン予定です。よろしくお願いします。

2011-09-29

LionでRailsからPostfixを使ってメール送信する際の注意点

blog.auxout.jp

だいたいこれの通り設定し、Lionの場合postfixデフォルトでインストールされていたので、普通にsudo postfix startして、deliver!!!!!してみたもののメソッドの実行が終わらず、「なんか失敗したかな?」と思いながらちょっと待ったら、何のエラーも出ずに終了したので「成功したのかな?」と思ってメーラーの受信ボタンを連打してみるもなんにも届いておらず悲しんだ話。

postfixのログがどこにあるのかわからんかったけど、とりあえず/var/log/mail.logを見てみたらちゃんとエラーが出ていた

Sep 29 14:52:14 dhcp076 postfix/smtpd[37271]: fatal: open /etc/postfix/submit.cred: No such file or directory

Sep 29 14:52:15 dhcp076 postfix/master[37207]: warning: process /usr/libexec/postfix/smtpd pid 37271 exit status 1

Sep 29 14:52:15 dhcp076 postfix/master[37207]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

/etc/postfix/submit.credってファイルが無いらしい。確かに無い。

で、エラーメッセージでぐぐってみたらアップルのサポートコミュニティが出てきた。

OS X Lion postfix smtpd problems: Apple Support Communities

英語で色々書かれてたけど特に読まず、

In order to fix the problem your console is displaying, you should:

1.Create a submit.cred file in /etc/postfix directory (sudo touch /etc/postfix/submit.cred will do).

2.Create a header for that file: sudo echo "submitcred version 1" >> /etc/postfix/submit.cred

3.Add as many lines as the number of users you want to enable to submit mail, in the form hostname|user|passwd sudo echo''hostname|username|password" >> /etc/postfix/submit.cred

4.Give the file the appropriate permissions: sudo chmod 600 /etc/postfix/submit.cred

この部分だけ見て実行してみた。

$ sudo touch /etc/postfix/submit.cred

$ sudo vim /etc/postfix/submit.cred

#この2行を追加

submitcred version 1

hostname|username|password

$ sudo chmod 600 /etc/postfix/submit.cred

このあとpostfixを再起動してみて、再度deliver!!!!!!したら無事に届いた。