2011-05-18 23:06:57 +0900
Erlangも面白そうで本も買ってあるんだけど、LLで育ってきたヌルいプログラマーにはなかなかハードルが高い。
そんななか、コペンハーゲンで開催されたソフトウェア開発のカンファレンス GOTO Copenhagen 2011にて、デンマークのデベロッパ Trifork社のCTOであるKresten Krab Thorup氏がオブジェクト指向とアクターモデルを対比させてErlangの魅力について紹介したスライドがありました。なかなか面白い。
Erlangも面白そうで本も買ってあるんだけど、LLで育ってきたヌルいプログラマーにはなかなかハードルが高い。
そんななか、コペンハーゲンで開催されたソフトウェア開発のカンファレンス GOTO Copenhagen 2011にて、デンマークのデベロッパ Trifork社のCTOであるKresten Krab Thorup氏がオブジェクト指向とアクターモデルを対比させてErlangの魅力について紹介したスライドがありました。なかなか面白い。
Rails 3.1ではjQueryが標準になるそうなので、すぐに要らない知識になるかもしれませんが、Rails 3.0でのjquery-railsの使い方を残しておきます(このエントリの対象はjquery-rails 1.0.2
)。
まず、Gemfile
に以下のような記述を追加して、bundle
します。
gem 'jquery-rails''
ジェネレータを実行して、不要なファイルの削除と必要なファイルの生成を行います。
$ rails g jquery:install
このジェネレータによって、prototype.js関連の以下のファイルが削除され、
public/javascripts/prototype.js
public/javascripts/effects.js
public/javascripts/dragdrop.js
public/javascripts/controls.js
jQuery関連の以下のファイルが生成されます(jquery-rails 1.0.2
の場合はjQuery 1.6がインストールされます)。
public/javascripts/jquery.js
public/javascripts/jquery.min.js
public/javascripts/jquery_ujs.js
(各種ヘルパーで生成した要素にイベントハンドラを設定したりするもの。かつてのrails.js
)jQuery UIのファイルもあわせて生成する場合はジェネレータに--ui
オプションを指定します。
$ rails g jquery:install --ui
この場合、以下の2つのファイルも生成されます。
public/javascripts/jquery-ui.js
public/javascripts/jquery-ui.min.js
あとは、config/application.rb
で以下のようにデフォルト(:defaults
)で読み込むJavaScriptファイルを指定して、
# JavaScript files you want as :defaults (application.js is always included).
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
レイアウトファイルなどからjavascript_include_tag
ヘルパーを使い:defaults
をインクルードさせます(当然、個別にSCRIPT要素で指定しても問題ない)。
<%= javascript_include_tag :defaults %>
jquery-rails
がアップデートした場合は(バンドルされるjQueryのバージョンアップ時など)、ジェネレータを再度実行して*.js
ファイルを上書きしたものをリポジトリにコミットすればOK。
なお、ヘルプによると--version
オプションを指定することで、インストールされるjQueryのバージョンを明示できるようですが、今の実装だと1.6が固定でインストールされるような気がします。
Webアプリケーションへのエントリポイントは1つだけとは限らない。たとえば、一般的なRailsアプリケーションなら、Webサーバープロセスへのリクエスト経由で動き出す場合と、delayed_jobやResqueといったジョブキューのワーカープロセス経由で動き出す場合があったりします。
普段、開発環境なんかではrails server
しつつ別ターミナルでrake jobs:work
しておいたりしますが、HerokuのDavid Dollarさん(He also maintains heroku.gem!)がリリースしたForemanというgemを使うと、こういった複数の種類のプロセスを一括して管理できるようになるみたいなので、試してみました。
まず、foreman
をインストール。
$ gem install foreman
例えば、delayed_jobを使ったRailsアプリケーションの場合、Procfile
というファイルにこんな感じでプロセスタイプを定義する。
web: bundle exec rails server
worker: bundle exec rake jobs:work
foreman start
すると、それぞれのプロセスタイプ毎にプロセスが立ち上がって、それぞれのプロセスの出力がHerokuのログっぽく統合して出力される(実際はちゃんとカラフルに色分けされます)。
$ foreman start
02:18:23 web.1 | started with pid 51353
02:18:23 worker.1 | started with pid 51356
02:18:28 worker.1 | (in /Users/juno/src/my-awesome-app)
02:18:45 web.1 | => Booting WEBrick
02:18:45 web.1 | => Rails 3.0.7 application starting in development on http://0.0.0.0:3000
02:18:45 web.1 | => Call with -d to detach
02:18:45 web.1 | => Ctrl-C to shutdown server
02:18:55 worker.1 | [Worker(host:galois.local pid:51358)] Starting job worker
02:18:57 web.1 | [2011-05-10 02:18:57] INFO WEBrick 1.3.1
02:18:57 web.1 | [2011-05-10 02:18:57] INFO ruby 1.9.2 (2011-02-18) [x86_64-darwin10.7.0]
02:18:57 web.1 | [2011-05-10 02:18:57] INFO WEBrick::HTTPServer#start: pid=51355 port=3000
終了するにはCtrl-C
。
とても簡単で良くできています。
もっと掘り下げた話は、Introducing ForemanやApplying the Unix Process Model to Web Appsをどうぞ。
RubyGems.orgには登録しないプライベートなgemを作った場合、Railsプロジェクトからはどのように利用するか。
まず、Railsプロジェクトのvendor/gems
以下にpkg/foo-1.0.0.gem
を、展開する。
$ cd /path/to/some_rails_project
$ gem unpack /path/to/foo-1.0.0.gem --target vendor/gems
$ ls vendor/gems
foo-1.0.0
次にGemfile
に以下のようなエントリを追加する(:path
が相対パスだった場合は、Gemfile
のあるパスが起点となる)。
gem 'foo', :path => 'vendor/gems/foo-1.0.0'
この状態でbundle
すれば、あとはbundler
が*.gemspec
ファイルを参照して上手いことやってくれる。
$ bundle
gemを展開したvendor/gems/foo-1.0.0
ディレクトリ内に*.gemspec
ファイルが存在しない場合は、以下のようにバージョンを明示する必要があるみたい。
gem 'foo', '= 1.0.0', :path => 'vendor/gems/foo-1.0.0'
参考:ruby on rails - How do I vendorize gems for Rails3/Bundler - Stack Overflow
nodeconfのスライドを眺めてみた。個人的に面白かったのはこのへん(すべてPDFファイルへのリンク)。