僕の仕事はWeb開発者ですが、時々、

「何が仕事で何が仕事でないんだろう?」

と思うことがあります。

  • Webと全く関係無い趣味のコードを書いてる時、それは仕事なのか。 
  • FacebookのEmpires & Alliesをやってる時、それは仕事なのか。
  • レストランで食事をする時、それは仕事なのか。 
  • くだらないジョークをTweetする時、それは仕事なのか。

仕事と遊びを区別することなどナンセンスだという考えもありますが、ある時、仕事の条件についてのアイデアを思いつき、以来気に入って使っています。

そのアイデアとは「URLを持ったら仕事だ」というものです。

  • 趣味のプログラムをネットにアップロードし、URLを持ったらそれは仕事です。
  • Empires & Alliesをプレイして感じたことをブログに書いたら、URLを持つのでそれは仕事です。 
  • レストランで食事をしてその写真をInstagramにアップロードしたら、URLを持つのでそれは仕事です。 
  • ジョークTweetもURLを持つのでそれは仕事です。(自分のサービスのマーケティングになっているかもしれません)

逆に、どんなに充実して深い考察を得たとしても、URLを持たず、ネットからアクセス可能な形を持たないとしたらそれは遊びです。

極端なアイデアなので全くの的外れかもしれません。しかし僕は直感的に気に入って使っています。

怖話.jpをHerokuからさくらVPS 512に移行したのでパフォーマンスを測ってみました。(怖話.jpのアプリに大きく依存しています。また日本向けのサービスなので手元から計測したためネットワーク的にHerokuは不利です。)

  • Heroku
    • kowabana.jp
  • さくら
    • oulu.fjord.jp

さくらVPSではnginx + unicorn + mysqlを使っています。

Apache Bench

% ab -n 1000 -c 100 http://kowabana.jp/
Requests per second:    6.12 [#/sec] (mean)
Time per request:       163.526 [ms] (mean, across all concurrent requests)
% ab -n 1000 -c 100 http://oulu.fjord.jp/
Requests per second:    38.29 [#/sec] (mean)
Time per request:       26.114 [ms] (mean, across all concurrent requests)

Chrome Developer ToolsでのDOMContent event fired

トップページをスーパーリロードした場合。

  • Heroku
    • 1.69s
  • さくら
    • 540ms

結果

人気サイトじゃないのでabの結果はそれほど気にしてませんが、DOMContent event firedはパラパラと残りのパーツが表示されるのは別として、ユーザーにとって「ページが表示された」と感じる実際の時間に近いと思います。それが3倍違うというのは結構な違いだなと思います。確かに体感速度でも速くなったように思います。

怖話.jpをHerokuからさくらVPS 512に移行することにしました。理由は下記です。

  • DB容量が無料の範囲を大幅に超えている。(一応容量オーバーしていても使える)
  • slug(リポジトリ)のサイズが制限(100MB)を超えた。(これはオーバーしているとpushできない)
  • ファイルアップロードが必要になった。(S3を使えば対応は可能)
  • 回線が遅い。(us westとかなので仕方が無い)

Amazon EC2にしなかった理由はまだ人気が無いのでお金をかけられないからです。もし売上が月数十万になったら移行します。

DB移行

HerokuのDBはPostgreSQLです。さくらVPS 512ではMySQLを使うことにしました。

現在のDB容量は37.4MB。レコード数は約2万件ぐらいです。heroku db:pullをしたら1時間たっても終わる気配がなかったので次の方法を取ることにしました。

  • herokuからローカルにpg_dumpを持ってくる。
  • ローカルのpostgresにpg_restore。
  • ローカルのmysqlにtapsサーバーを立てる。
  • ローカルのpostgresからtapsサーバーへpush。
  • ローカルのmysqlからmysqldump。
  • さくらVPSのmysqlにrestore。

大したデータ量じゃないのに、要はネット経由でtapsするととてつもなく時間がかかるのです。

「これ絶対もっと楽な方法あるよなあ」

などと思いながら作業しました。

怖話.jpのランキングの実装を考える。(ニコニコ動画で言えば総合ランキング)

下記の様に各怖い話のスコアを算出してそれでソートする。

スコア = PV数 + 怖いの数 * 1000 + コメント数 * 100

("怖いの数"というのはニコニコ動画で言えば"マイリスト数")

当分の間、特殊なランキングアルゴリズムは必要無いだろう。1000と100という重みは定数にして様子を見ながら変えていく。

人気サイトであれば裏で集計すべきだけどまだ貧弱サイトなので毎回サブクエリで集計してしまおう。

select * from stories order by view + (select count(*) from scares where scares.story_id = stories.id) * 1000 + (select count(*) from comments where comments.story_id = stories.id) * 100 desc, id desc;

我ながらとっても遅そうなクエリだ。

class Story < ActiveRecord::Base
  scope :order_by_ranking, order("view + (select count(*) from scares where scares.story_id = stories.id) * #{Scare::RANKING_WEIGHT} + (select count(*) from comments where comments.story_id = stories.id) * #{Comment::RANKING_WEIGHT} desc, stories.id desc")
end
Story.order_by_ranking.page(params[:page]).per(50)

ActiveRecordとkaminariのお陰でスマートな見た目にできたが、気をつけて実行しなければならない重いsocpeになってしまった。

% heroku plugins:install git://github.com/ddollar/heroku-sql-console.git
% heroku sql
SQL> select * from unk;

It's not psql. It's only send sql and return results.

Title is all. (via @milk1000cc)

Using Capistrano with rvm and bundler.

rvm

# config/deploy.rb:
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))

require 'rvm/capistrano'

set :rvm_ruby_string, 'ruby-1.8.7-p352@kowabana' # Add gemset name if you want to use gemset.
set :rvm_type, :user # If rvm didn't installed to system wides.

bundler

# config/deploy.rb:
require 'bundler/capistrano'

It's all. When run cap deploy:update, Capistrano install gem in shared/bundle.

$ apt-cache search git-core
git-core - fast, scalable, distributed revision control system (obsolete)
git - fast, scalable, distributed revision control system

へー。Debian Squeezeではgit-coreはgitかー。

Lokkathon #3 : ATND

LokkathonはLokka + Hack + Marathonです。 Lokkaに関する作業をモクモクとするイベントです。会場は用意されますが、Lingrのチャットのみでの参加も可能です。(むしろ推奨)

もう明日ですが、Lokkathon #3をやりたいと思います。毎週水曜日のこの時間にやってく予定です。リモート参加前提で、一応場所もあるよという感じです。というか毎週3時間はLokkaの作業をする!という自分に対する縛りです・・・。

単にLokka使ってみたいけどよくわかんないので教えて欲しいとかでも全然OKです。

デザイナーにオススメの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!