RubyKaigi2009 三日目メモ

いよいよ最終日。スタッフのみなさま、本当におつかれさまでした。
そして、今年もありがとうございました。 <(_ _)>


ソケットライブラリの改善

  • TCPServer、UDPServer はプロトコル依存
  • 気にいらなかったこと
    • 分かりにくい引数 (SOCKET、SOCKET、SOCKET..)
    • 戻り値がバイナリ
    • port,host の順番
  • IPv6のソケットは IPv4 を使えるか
    • いろいろ
    • GNU Linux はデフォルトOK、Windows は絶対に NG
    • FreeBSD はデフォルト NG
  • プロトコル非依存な UDP は難しい
    • サーバは待てばいいがクライアントは 3 way hand shake もないので判定できない
    • マルチホーム環境で届いたアドレスから返したい
  • 今の Socket ライブラリは大クラス主義が認識されてない頃の設計かも
    • だから今回は TCPServer ではなく、Socket に集めた
    • でも使う側的には分かりにくくね?っていう質問もあった
  • デザインデシジョン
    • inspect 可能 = 意味がオブジェクト内で決まるということ
    • 何をオブジェクトすべきかにもつながってくる

スクリプト言語 Ruby

  • バッチファイルに Ruby を埋め込む
    • -x オプション
    • バッチと Ruby の共存が可能になる
  • Unix Tools
  • fork はよろしくないので spawn を使ってください

RubyGems の落とし穴

  • Web に転がっている事例として reliable-msg が登場した
    • そして自分のブログ (^^;
    • そして irc には MDD..
  • 処方箋
    • 複数バージョンの gem は混ぜない
    • GEM_HOME で完全に分けるとか?
  • .gemrc に追加するといいかかも
    • --format-executable

Ruby製アプリを配布する n 個の方法

  • 最近は Ruby の仕様を書いているとのこと
    • わからなかったら隣のひと (まつもとさん) に聞くらしいw
  • デスクトップアプリの配布
    • Ruby インタプリタ必要
    • native コードに変換してくれる実用的なライブラリはまだない
    • どこ向けに、どこでパッケージ作成するかも問題
  • RubyScript2Exe (03-07)
    • 開発はとまっている
    • 動くことは動くらしい # Ruby1.8.6 以降で動かないらしい
    • Ruby のインタプリタごとひとまとめにするので、起動が遅い
  • Exerb (02-09)
    • クロスコンパイルできる
    • require を書きかえてる
  • Ocra (09-)
  • Crate (08-)
  • sqlite3 に Ruby のファイルをつっこんで、実行ファイル 1つ
  • Zip
    • Win 用の Ruby を解凍して自分のファイルをつっこんで起動スクリプト書いて、再び固める
    • 最強w
  • Rails でデスクトップアプリ
    • Ramaze ã‚„ Sinatra でもできる
    • zip it
    • HTML と JavaScript でけっこう柔軟にかける
    • が、port が覚えられなくなる
  • RubyStation
    • Gem の機構をそのまま使っている
    • インタプリタの問題は RubyStation が動いてるならインタプリタあるはずってことで逃げ
    • もう少し開発が進めば、RubyStation のインストールをうまくやりたいとのこと
    • github
  • port の管理は?
    • RubyStation が適当にランダムにあててる
  • アクセス制御
    • 127.0.0.1 以外から蹴る?
    • でも家庭内 LAN で使いたいよね
    • RubyStation で設定可能なインターフェースを提供するのが正解かな

tDiary の Ruby 1.9 対応の過程と今後のロードマップ

  • 1.9 対応
  • compatible.rb
    • for 1.9: String.each_line、String.to_a
    • for 1.8: String.force_encoding、String.byte_size
    • 意外とほかのアプリでも require するだけで 1.9 対応できるかも
  • 1行目に任意の文字列を挿入するワンライナー、すぐに思いつく?
    • sed を使うんだwww
  • File.open(FILE__NAME, 'r:UTF-8')
    • これだと 1.8 で動かないので却下
    • Encoding::default_external='UTF-8' で対応
    • でも、Ruby バージョン で分岐させるのはよくない by yugui
    • begin resucue end で対応
  • 細かいこと
    • cgi:cookies が ASCII-8BIT と認識されるので、encoding を個別に指定する
    • ブロックをつけない map は Enumerator を返すようになったので、to_a する
    • get の第二引数が nil を許容しなくなった
  • その他
    • cache フォルダに cache じゃないデータがある
    • 消すと不幸なことにw

Haml と Sass

  • RHTML、CSS から Haml、Sass へ
    • Haml を使うとコードが 50 %減
    • Haml は行思考なので閉じない、複数行に渡るものはインデントで表現
    • 属性はハッシュで書く
 %div{ :class => "block"}
 %div.block
 .block
  • ふつうに Ruby が評価される
    • eruby でありがちなタグのなかにタグが入るようなことがない
  • ちなみに end をつけると Syntax エラーw
    • メソッドチェーンするときに限って end をつけられる
  • !!! だけで DocType 指定ができる
  • python + yaml ?
  • Sass
    • ロゴが変なのは作者のセンス
    • CSS はすべてのルールがフラット
    • Sass だとインデントで構造化できる
  • ! ではじまるのが変数
    • color = !base_color-#666 みたく、演算もできる
  • 「=」がマクロで「+」で展開される
 get install haml
 haml --rails path/to/rails_app
  • デザイナとの協業は?
    • 困難
  • html2haml コマンドがある
    • css2sass もある (変換精度はあまり期待しないほうがいい)
    • ページ単位での段階的な移行も可能
  • :ugly オプション
    • 指定するとパフォーマンスはよくなるが、インデントがつかなくなる
    • パフォーマンスの劣化は 20% くらい。

Erubis 徹底解説

  • Erubis は高機能かつ拡張性が高い
  • 設計が美しい
    • Enhancer 機能追加のためのモジュール
    • include / extend するだけ
    • コマンドラインからも指定できる
  • Ruby 以外の言語にも対応
  • eRuby の (に関連した) 問題点とその解決策
    • binding を使うとローカル変数がローカルでなくなってしまう
    • ERB の解決策: Struct を使う方法@Seki3のブログ
    • Erubis の解決策: Binding のかわりに Hash を使う
  • 余分な改行
    • 式と文で挙動を変えるだけで対応
    • 同じに見えるけど、実はちがうものと認識することが重要
  • テンプレートシステムの将来
    • テンプレートは一種のメソッド、コンテキストデータは引数とみなせる
    • テンプレートにも仮引数宣言が可能になったらいいな..
    • Django のテンプレートには継承がある
  • eruby の仕様的には parse (構文解析) まではしていない
    • ゆえにブロックの認識が難しい (ほかの if の end とかと被る)
    • だから merb では、記号をつけて拡張している
  • ERB ã‚‚ Erubis も時代遅れ
    • しょせんテキストプロセッサなので、テンプレートエンジンとしての機能が貧弱
    • そこで、高速高機能なテンプレートエンジン、Tenjin
    • いいらしい?