Sooey

2011-05-18 23:06:57 +0900

Erlangも面白そうで本も買ってあるんだけど、LLで育ってきたヌルいプログラマーにはなかなかハードルが高い。

そんななか、コペンハーゲンで開催されたソフトウェア開発のカンファレンス GOTO Copenhagen 2011にて、デンマークのデベロッパ Trifork社のCTOであるKresten Krab Thorup氏がオブジェクト指向とアクターモデルを対比させてErlangの魅力について紹介したスライドがありました。なかなか面白い。

2011-05-16 16:05:50 +0900

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が固定でインストールされるような気がします。

2011-05-10 02:29:48 +0900

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 ForemanApplying the Unix Process Model to Web Appsをどうぞ。

2011-05-08 23:00:07 +0900

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

2011-05-07 20:48:35 +0900

nodeconfのスライドを眺めてみた。個人的に面白かったのはこのへん(すべてPDFファイルへのリンク)。