satococoa's blog

Web や iOS アプリを作るエンジニアの日記です

Rails勉強会@東京第63回に参加

Rails勉強会@東京第63回に参加してきました。

今日のセッションは以下のとおり。

  • CoffeeScriptについて(全体)

    1. テストについて
    2. Rails 3.1について
    1. PaaSについて
    2. Rails開発のTipsなど

CoffeeScript

まずはセッション開始前にjs2coffeeというNodeのライブラリを教えてもらいました。
始めは普通に.coffeeを.jsにするものだと勘違いし、会話が成り立っていませんでした。すみません。逆なんですね。

セッションではCoffeeScriptをインストールし、公式サイトを見ながら実際に打ち込んでテストをしました。

MacでもWindowsでも、Nodeを入れなくてもruby-coffee-scriptを使えばexecjsが適切なJavaScriptの実行系を探して、CoffeeScriptコンパイルできるみたいです。

$ gem install coffee-script

この場合、コマンドラインからcoffee -> jsにするにはそれ用のスクリプトを作る必要があります。

セッションではそれぞれnodeのcoffeeコマンドで実行したり、公式サイトのTRY COFFEESCRIPTで実行したりして試しました。

-bオプションを付けるのと付けないのとで、まずはコンパイルのされ方が違うことを確認。-bオプションを付けないと、全体が無名関数に囲まれます。

$ coffee -c hello.coffee
$ coffee -bc hello.coffee

途中までは上から順番に進めていっていたのですが、「CoffeeScriptで便利なのはClassを使えるところ」という意見があり、Classを作ってみることに。

class Animal
  constructor: (@name) ->
  move: (meters) ->
    console.log @name + ' moved ' + meters + 'm.'


class Snake extends Animal
  move: ->
    console.log "Slithering..."
    super 5

sam = new Snake "Sammy the Python"
sam.move()

これでクラスの継承。簡潔ですね。@nameはjsにするとthis.nameと解釈されます。
(ずっと勘違いして今まで@.nameとわざわざ書いていたことにこのとき気付きました。)

そして、次にクラスメソッドを試してみたところで問題が発生しました。
クラスメソッドのあるクラスを継承した場合、TRY COFFEESCRIPTの実行結果とローカルでcoffeeコマンドで実行した結果が違った・・・と思って今やり直したら、同じ結果になりました。
バージョンの違いか、何か間違っていたのか、ちょっと原因はわかりませんが、以下のコードはどちらでも意図通り動きます。

class Animal
  constructor: (@name) ->
  @classmethod: () ->
    console.log "Animal's classmethod"

class Snake extends Animal
  @classmethod: () ->
    console.log "Snake's classmethod"

Animal.classmethod() #=> Animal's classmethod
Snake.classmethod()  #=> Snake's classmethod

あとは便利だなーと思ったのは=>でしょうか。

Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  $('.shopping_cart').bind 'click', (event) =>
    @customer.purchase @cart

JSだと、'click'にbindするときに、実行時のthisがAccountのオブジェクト自体にならないために通常 var self = this; するところを、=>を使うと自動的に定義時のthisが実行時にもthisとして参照できるようなコードを生成してくれます。

あと-wオプションではファイル単位ではなくディレクトリを指定することもできることを今日知りました。便利。

しかし、これを変換したjsをブラウザで実行させ、デバッグさせるとなると大変です。何かいい方法はないのでしょうか?
しかもrails3.1で使うと本番環境ではさらにuglifierによる圧縮もかかります。

Rails 3.1

中盤のセッションはRails 3.1の話題の方へ参加しました。

とりあえずrails newしてみていきなり自動的にbundleが始まり、意図せずgemsetも分けていないシステムに全gemが入っていってしまう事件を目撃しました。

ちなみに、bundleを自動的に実行させたくないときは--skip-bundleオプションを付けます。

$ rails new blog --skip-bundle

その後はapp/assets/javascripts/application.jsを見て、実際にcoffeeを書いてみて、Sprocketsをちょっと調べました。

次にHTTP Streamingを調べるためにASCIIcasts266: HTTPストリーミングを見ながら実際にcurlでコマンドを打って実験してみました。
使いどころとしては、CSVをダウンロードさせる、とかXMLをダウンロードさせる、とかかなぁ・・・という話。

次にIdentity Mapの動きをrails consoleで試し、最後にtest/unitの結果に色がついて綺麗になったところまで確認して終わり。

PaaSについて

3コマ目のセッションはPaaSについて語りました。

セッション参加者が使ったことのあるPaaSは以下のとおりで、それぞれ使ってみた感想や特徴などを話しました。

  • heroku
  • DuoStack
  • DotCloud
  • CloudFoundry
  • fluxflex(微妙だったという話)

DuoStackはDotCloudに買収され、もう新規アプリは作れなくなっていました。
herokuは課金体系が変わり、1dyno hourという単位で課金されますが、1dyno or 1workerを1ヶ月フルに動かす分+ちょっとが無料で使用できる範囲となっています。あと、CedarというstackでNodeも動くようになっています。

最後にherokuを使う上で便利なadd-onについて話しました。

  • Hoptoad: 業務で使うなら入れるべき。JSのエラーまで通知してくれる。
  • StillAlive: 公式サイトのビデオは必見。Cucumberみたいな感じに実行する操作を定義できます。

まとめ

前回より人数は少なかったみたいですが、その分実践的な話や具体的な話ができたり、わいわいと3.1を触ったりできて楽しかったです。
また、いつもながら場所を提供していただいている永和システムマネジメント様に感謝です。

また参加したいと思います。ありがとうございました。