SublimeText2 を使い始める

SublimeText2 が話題になっているので本格的に使い始めることにした。
以前、インストールして少し試してみたが、すぐに emacs に戻った。
ただ、twitter 上の TL 上でまた話題になっていたので再度使ってみることにした。
以下からダウンロードする。

http://www.sublimetext.com/2

Windows, Mac, Linux とどの環境でも使えるのがうれしい。

以下は Windows 版。

サイドバーにフォルダ表示ができ、 TextMate と同じような感覚で使える。
TextMate の Bundle も使える。
(私は TextMate を使ったことはない!)

まだぜんぜん使いこなせてないが、 Rails の開発で便利なプラグインを入れてみることにした。

Package Controll のインストール


名前でわかるように、プラグインを管理するもの。 github 上から所定の場所にクローンして
使用するというのも可能だが、これを使えば自動でインストールをしてくれる。

http://wbond.net/sublime_packages/package_control

以下のコマンドでコンソールを開く。

ctrl + `

以下を入力

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

'Please restart Sublime Text to finish installation' が表示されたら再起動してインストール完了。

Sublime Text 2 Ruby Tests のインストール


Rspec や Cucumber などのテストをその場で実行できる。
テストのビューが下部にできるのでターミナル等に移動しなくていいのが楽。

https://github.com/maltize/sublime-text-2-ruby-tests

以下のコマンドでコマンドパレットを開く

ctrl + shift + p

install と打てば、「Package Controll: Install Package」が出てくるので選択する。
登録されているリポジトリからインストール可能なパッケージの一覧を作成して表示されるので
「RubyTest」と入力すれば1つになるので選択すればインストール完了!

後は、上記URLの通り、設定ファイルを置いて Rspec や Cucumber の実行方法を記載すればOK。

ctrl + shift + r  # カーソルがある行を指定してテストを実行
ctrl + shift + t  # 現在のファイルでテストを実行

Mac ではまったのが、「/bin/sh bundle exec rspec」が見つからんというエラーで実行できなかった。
標準で zsh にしているのが原因かなと思い、調べていたら解決方法があった。

http://www.sublimetext.com/docs/2/osx_command_line.html

上記URLのようにシンボリックリンクを生成し、パスを通してターミナル上から起動すれば問題なくテストが実行された。
ランチャーから起動していたのがいけなかったようだ。

その他、「ctrl + .」でプロダクトコードとテストコードの切り替えができる。

おわりに


エディタ自体の機能をあまり紹介していなが、実際に使ってみて便利だなと思うところをこれからも書いていきたい。
もっともっとたくさんプラグインや豊富な機能満載なのでライセンスを購入しようと考えている。

他のプラグイン…

Ruby 1.9 Hash Converter: 1.9記法に変換してくれる
・ Git: git コマンドが実行できる

などなど、パッケージをそれっぽいワードで検索してみるといろいろでてくると思う。
ちなみに、拡張は Python で書かれている。
勉強したくなってきた…。

リクエストパラメータをフォームの要素から作る

画面上のフォームの情報をもとにサブミットではなく、リンクやAjax通信をしたいことがあるはず。
上部に検索フォームがあって、そのフォーム外の下の方にダウンロードボタンがあったりとか。
そんなときに便利な jQuery のメソッドが2つ。

$('#hoge_form').serialize();
$('#hoge_form').serializeArray();

serialize()


form をパラメータに変換してくれる。

$('#hoge_form').serialize();
// => "foo=bar&fizz=buzz"

serializeArray()


上記の serialize と同様だが、返す値が JSON 形式になっている。
Ajax のリクエストパラメータなどに使える。

Hash の default_proc が便利

Hash を初期化した際にブロックを記述しておくと、存在しないキーを呼び出したときに実行される。

hash = Hash.new { |h, k| h[k] = [] }

または、 default_proc= で後から指定することも可能。

hash.default_proc = ->(h, k) { h[k] = [] }

例えば、上記のコードが無かった場合に下記のコードはエラーになる

hash = Hash.new
hash[:a] << 'aiueo'

特定のキーに対して配列で順次格納したい場合とかに有効だと思う。

nginx + unicorn + redmine 2.0 を ubuntu で動かしてみた。

先日、redmine 2.0 にバージョンアップされました。
Rails 3.2.3 で動いている最新バージョンです。

Ruby を触ったときないときに Passenger で動かす Redmine
サイトを見ながらやりましたが何をやっていたのか全然理解していませんでした。
今は業務でも nginx + unicorn + Rails を使用しているのでやってみようと思いました。

以下の環境にインストールしてみる

  • ubuntu 11.04
  • rbenv + rubybuild で Ruby 1.9.3 をインストール済み
  • bundler インストール済み
  • mysql インストール済み

Redmine のインストール


だいたいは公式サイトと同じなので参照してください。

1. svn からチェックアウトしてソースを取得。

svn checkout http://redmine.rubyforge.org/svn/branches/2.0-stable redmine
cd redmine

2. bundle install
rmagick, postgresql, sqlite はインストールしません。

bundle install --without development test rmagick postgresql sqlite --path vendor/bundle

3. mysql でユーザだデータベースを作成

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'my_password';
grant all privileges on redmine.* to 'redmine'@'localhost';

4. データベース設定ファイルの設定

cp config/database.yml.example config/database.yml

コピーしたファイルの編集する。コメント解除し少しだけ変える。

production:
  adapter: mysql2 # mysql2 に変更
  database: redmine # 3.で作成したデータベース名
  host: localhost
  username: redmine # 3.で作成したユーザ
  password: password # 3.で作成したユーザのパスワード
  encoding: utf8

5. rake コマンドでちょっと設定する

bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data # このあと、言語を選択するので ja と入力

6. webrick で起動確認

bundle exec rails s -e production

http://localhost:3000/ にアクセスして Redmine の画面が出れば成功です!

unicron のインストール


1. GemFile.local を作成
追加で gem を作成したい場合は GemFile.local の中に記述すればOK。

gem 'unicorn'

2. bundle install

bundle

3. config/unicorn.rb を作成して設定する
こことほぼ同じです。

worker_processes 2

listen '/tmp/redmine.sock'

stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
  
preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  
  old_pid = "#{ server.config[:pid] }.oldbin"
  unless old_pid == server.pid
    begin
      Process.kill :QUIT, File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
  
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

4. unicorn 起動
webrick を起動していた場合は ctrl + c で終了しておいてください。

bundle exec unicorn_rails -c config/unicorn.rb -E production -D

nginx のインストール


ソースからインストールしました。
PCRE(Perl 互換正規表現ライブラリ)がインストールされていないと make でエラーするので

sudo apt-get install libpcre3-dev

を実行しました。

1. インストール

wget http://nginx.org/download/nginx-1.2.0.tar.gz
tar zxvf nginx-1.2.0.tar.gz
cd nginx-1.2.0
./configure
make
sudo make install

2. 設定 /usr/local/nginx/conf/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream redmine {
        server unix:/tmp/redmine.sock;
    }
    server {
        listen       80;
        server_name  localhost;
        root /path/to/redmine;
        error_log /path/to/redmine/log/nginx_error.log;
        try_files $uri @unicorn;
        location @unicorn {
            if (-f $request_filename) { break; }
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://redmine;
        }
    }
}

だいたいデフォルトをそのまま使用し、unicorn 用にリバースプロキシの設定をします。
※ error_page 等は省略しました。
3. 起動

sudo /usr/local/nginx/sbin/nginx

これで http://localhost にアクセスすると Redmine が表示されるはずです!

RailsInstaller を使ってみる

RailsInstaller とは Windows で Ruby on Rails の開発をしやすいように主に以下の一気にインストールしてくれるものである。

これだけあれば一通り開発が行える。

インストール

ここからダウンロード

基本的にはインストーラーを起動して数回クリックするだけ。

注意したいのは、 Git が既にインストールされている場合は2重で入ることになるので、
コンテキストメニューの Git 関連がダブってしまう。先にアンインストールしておくといい。
(インストールするものを選ぶことはできず、強制的に全てインストールされる。)

インストールが終わったら Git の設定で名前とメールアドレスを設定すれば完了。
TODO サンプルアプリが C:\Sites 以下にできあがる。(ちょっと迷惑…)

Rails を動かす


とりあえず、サンプルアプリを動かしてみる。アプリのディレクトリで

$ bundle install --path vendor\bundle

さくっとうまくいった。あれ、sqlite3 が入っていない気がする…。

$ bundle exec rake db:create db:migrate

エラー! sqlite3 がないよー、って。そりゃそうだ。インストールされてなかったし。
Gemfile をのぞく。

platform :ruby do
  gem 'mysql2', '~> 0.2.7'
  gem 'pg'
  gem 'sqlite3' 
  gem 'unicorn'
end

sqlite3 をブロックの外に出して、再度 bundle install と migrate を実行。
うまくいったのでサーバを起動してみる。

$ bundle exec rails s

無事、画面がでました。

Rails のバージョンは 3.0.9 と古いので最新バージョンで試してみましょう。
Ruby のバージョンは最新の 1.9.3 なんだけれども…。

heroku でアイドリングになるのを回避する

アイドリング状態


Dynos and the Dyno Manager | Heroku Dev Center
heroku でのアイドリング状態とは1時間動いていないとなるスリープみたいなもの。
この状態でリクエストが来ると立ち上がりまで20秒位かかるので重いと勘違いされるかも。
アイドリング状態かは以下のコマンドで確認できる。

$ heroku ps
Process  State         Command                             
-------  ------------  ------------------------------------
web.1    idle for 23h  bundle exec thin -p $PORT -e $RACK..

「idle for 23h」は 23時間アイドリング だよ、とのこと。

ぐぐってみるといろいろ回避方法(New Relic, Rails 内のスケジューラ)が載っていたが失敗。cron で ping を叩くのもありみたいだけど、 cron ができるレンタルサーバがないのでやっていない。最終的に成功したのが「pingdom」を利用することだ。

pingdom を利用する


pingdom は Web サイトのモニタリングしてくれるサービスである。無料版では1サイト利用できる。
もし、落ちていたらメールやツイッターで知らせてくれる。
登録は簡単。名前とメールアドレスを入力して届いたメールのパスワードでログインする。
そして、モニタリングするサイトの URL やモニタリング方法などを設定するだけ。簡単!

ちなみに、アクティブな状態は…

$ heroku ps
Process  State      Command                               
-------  ---------  ------------------------------------  
web.1    up for 7h  bundle exec thin start -R config.r..  

「up for 7h」でアクティブであることを確認できる。

within で対象を絞る

requesut spec で検証対象を絞る場合には within メソッドを使用する。
「"hoge"が表示されている」という検証は

page.should have_content("hoge")

とするが、これだとページ全体で検索するのでどこかに"hoge"があればOKになってしまう。
そこで登場するのが within 。セレクターで検証するエリアを決めてその中で検証する。

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  page.should have_content("hoge")
end

これでテーブルの1つ目のtrの1つ目のtdの中に"hoge"があるという検証になる。
セレクターは css でも可能。

within のネストもできる。ただ、ネストしたところのセレクターにはちょっと注意が必要。
例えば…

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  find(:xpath, "//input[@type='checkbox']").set(true)
end

これは within 内のチェックボックスをオンにするというもの。 check メソッドでチェックできるので
この方法はあまり使わないと思うが。
"//input[@type='checkbox']" としているので within の中で探すかと思ったら "//..." なのでページ全体
で検索しに行ってしまった。これではまった…。なので正しくは

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  find(:xpath, ".//input[@type='checkbox']").set(true)
  find(:css, "input[type=checkbox]").set(true) # css セレクタ
end

とすればOK。単なる XPath の知識不足か。
css セレクタを使ったほうがいいかも。親を見る場合は xpath のほうが便利。