知識やスキルを売買するサイト、Abilieをリリースしました

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

以前にもブログで紹介したAbilieというサイトををようやくリリースしました。実装疲れた〜
という訳で、今回はAbilieについての説明を簡単にします。
技術的な話もいつか書きたいですが、Railsのレールに乗って普通に開発してるだけなのでそこらの発表資料以上のことが無いような気がします。

Abilieの由来

Abilie(アビリエ)は一風変わった名前ですが、Ability(能力) + enhancement(高める)を組み合わせた造語です。このサイトを通じて能力を高めてもらいたいとい意味が込められています。
購入者は何らかの商品(能力)を購入し、今まで知らなかったことやできなかったことを知ることができます。
出品者も購入者からのフィードバックを得たり、購入者から「他にもこういう商品を売って欲しい!」と言ったリクエストに答えることで、次第に能力を高めていくことができるでしょう。そもそも人に何かを教えるにはより多くの理解が必要と言われていますので、改めて自分の能力を売る際に得るものは多いと思います。

Abilieでできること

商品を出品するにも購入するにもまずはアカウント登録が必要です。
登録はFacebookTwitterのアカウントを使って登録できます。
購入は現時点ではクレジットカード決済のみです。Paypalやキャリア決済などは今後色々対応していく予定です。
商品のやり取りは電子データのみです。商品購入後にメッセージ機能をつかってやり取りしてください。また直接出会って何かをするのは禁止しています。今後はPDFや動画、メールマガジンの販売が簡単にできるようになる予定です。
簡単なコミュニケーションが取れるように、ボード機能(つぶやき的な)ものがあります。これを使って「○○な商品がほしい!」とか、「こういうのを出品しようとしているけどどうよ?」的なコミュニケーションが取れるようになっています。

ショッピングサイトではなくコミュニティサイトです(キリッ

とは、CTOのお言葉。
ただただ商品が並んでいて、出品して購入できるだけでは他のショッピングサイトと違いがない。
このサイトでは出品者と販売者が購入し、購入後も出品者のファンとなってコミュニケーションを取ることでお互いの能力を高めていくサイトにしたいとのこと。

例えばGumroadはとてもシンプルに売買ができますが、一回その商品を売って買って終わってしまいます。(そのシンプルさがすごいのですが…)
Abilieでは売って買って終わりではなく、購入後も出品者のファンとなってコミュニケーションを取り合い、リピーターとなるような仕組みづくりをがんばってます。

とは言ったものの、現状は取って付けたようなボード機能しかなく、そのあたりは今後の課題です。

まとめ

まだまだ必要な機能がなかったり、微妙な機能もあったりしますが、そのあたりはユーザーの意見を取り入れ少しずつよくしていきたいと思います。
何か出品できそうなものがあったら出品してみてください!

あとFacebookのファンページもあるので、いいねをお願いします><
https://www.facebook.com/abiliecom

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

雑な対応なんでソースも見た目も雑だけど、個人的な要望は満たせたかなと。
ただスクリプトを書く時間とブログを書く時間を合わせれば豚の角煮作れたなと思うとちょっと悲しい…。

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

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

テストのルール的なの

rspecでは必ずモデルのテストは書くようにしてる。ヘルパーも大体書いてるけど、コントローラやルーティングのテストはあまり書いてない。
というのも、コントローラーのコードを極力短くしてモデルを太らせているのでコントローラのテストはあんまり意味が無い気がしていて、その代わりにCapybaraでテストを書いておけば十分なんじゃないかなと思ってきたから。Capybaraは書いてるので、そういう意味では書いてるとも言える。
社内の管理者だけが使える管理画面も作ってるけど、そっちはテストあんまり書いてない。ここは動かなくなっても一般ユーザーには影響が無いので、動かなくなったのを気づいてから直せばいいかなーという感じ。

テストの実行

GuardとSporkを組み合わせて使い、結果をGrowlで出力してる
guard/guard · GitHub
guard/guard-spork · GitHub

Guardはファイルに変更があったらなにかしてくれるもの。
Sporkは事前にRailsのコードを事前に読み込んでおいてrspecの起動時間を短縮してくれる。
GrowlはMacだったらみんな使ってるアレですね。最近有料になりましたが、会社に #金くれ って言ったら買ってくれました。
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 · defunkt/resque Wiki · 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を使ってる。
thoughtbot/capybara-webkit · GitHub
今のところそんな特殊なJavascriptを書いてるわけではなく、ほとんどjQueryに頼ったものなのでこれで十分間に合ってる。
ただ、隣の人からJSのカバレッジも見たいという要望も出てるので、poltergeistを使ったほうが良いのかもしれない。
jonleighton/poltergeist · GitHub

あとCapybara-Webkitrspecとは別のスレッドで動くらしく、factory_girlで作ったデータをCapybara側で読めない。
CapybaraのgithubでActiveRecordの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とかも組み込めるといいかなと思ったりしてる。

おわりに

入社した直後に引き継いだプロジェクトはテストも無く、チームにテストを書く文化もなく、業務でちゃんとテストを書いたことがなかったぼくですが、入社半年後くらいからテストを書き始め、少しずつテストを書く文化ができてきてよかったかなと。
とは言っても僕の担当してるプロジェクト以外は相変わらずテストが書かれてないものが多いので、そのあたりが今年の課題な気はしてる。

*1:詳しくはhttp://d.hatena.ne.jp/tohae/20111222/1324533072

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年もよろしくお願いします。

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

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

夏ごろはやることなくて社長の思いつきを数日で作ったりしてましたが、ここ2,3ヶ月くらいはAbilieというサイトを作ってます。
まだ告知ページだけなんですが、自分の持ってる知識や特技を有料で売買しようというサイトです。なぜかECサイトを作ってて自分でも困惑してます。

社長曰く「産業は農業、工業、サービス業と来ていて、その時代ごとに農場、工場の場所があった。次は情場が必要になる」とか言ってた気がします。気がするだけで違うかもしれません。忘れました。なんか10年くらい前から?ずっとやりたかったらしいです。
最近だと国内外でもこのようなサービスが増えてきて、ようやく時代が追いついた?的な感じになったらしくプロジェクトがスタートしました。海外だとpaygrとかfiverrなんかが有名みたいです。
Buy, Sell & Make Money on Paygr
Fiverr - Hire people to do things for $5

OKWaveやYahoo知恵袋のようなQ&Aサイトは無料で解決できるのがうれしいですが、本当に困ってる問題は金払ってもいいような場合があります。
僕が最近困ったことで金払っても良いなって思ったのは、10月に友人の結婚式でPerfumeチョコレイト・ディスコを踊った時のことで、3人ともダンス素人だったのですごく大変でした。もし素人でも簡単に踊れる動画解説付きのものがあれば金払って買ったかもしれませんね!

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

[ごはん日記]恵比寿の行列の出来るラーメン店阿夫利の隣にある餃子屋がランチだけやってる辛味噌ラーメン

恵比寿の東口には阿夫利ってラーメン屋が人気で、女性も結構並ぶほどの有名店な訳ですが、個人的にラーメンはこってり、がっつり、どかーん的なモノを求めているので阿夫利は口に合いません。その店の隣に餃子屋があるんですけど、そこは昼だけラーメンをやっていて、何気にこれがうまいのです。
タンメンみたいに野菜がいっぱいはいってて、胡椒が辛いくらいにかかっててうまい。タンメンっていうかちゃんぽんっぽいなと思ってたら、最近ちゃんぽんもメニューに増えました。麺は太麺でもちもちで、スープはいい具合に辛くてうまい。量も大盛りにしなくても野菜が大盛りなので腹一杯になる。値段が850円でもう少し安いといいなって感じだけどまぁ恵比寿のランチだったらこんなもんっすね。また行きます。
以上レポっす。チラシの裏すんません。

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ってファイルが無いらしい。確かに無い。
で、エラーメッセージでぐぐってみたらアップルのサポートコミュニティが出てきた。
Apple

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

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!!!!!!したら無事に届いた。