SublimeText2 を使い始める
SublimeText2 が話題になっているので本格的に使い始めることにした。
以前、インストールして少し試してみたが、すぐに emacs に戻った。
ただ、twitter 上の TL 上でまた話題になっていたので再度使ってみることにした。
以下からダウンロードする。
Windows, Mac, Linux とどの環境でも使えるのがうれしい。
サイドバーにフォルダ表示ができ、 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 を使用しているのでやってみようと思いました。
以下の環境にインストールしてみる
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 の開発をしやすいように主に以下の一気にインストールしてくれるものである。
- Ruby
- Ruby on Rails
- Git
- SQLite
- Bundler
- RubyInstaller Development Kit
これだけあれば一通り開発が行える。
インストール
ここからダウンロード
基本的にはインストーラーを起動して数回クリックするだけ。
注意したいのは、 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 のほうが便利。