RubyKaigi2014にて

Ruby Kaigiのメモ。
走り書きなので、間違いあるかも。
適宜修正します。

Symbol GC
Symbolについての話から。Rubyは皆さんを飽きさせないために、落とし穴沢山。

Symbolを沢山生成することでメモリ圧迫する脆弱性がある。

ScalaSmallTalkにもSymbolがある。
Javaでは弱参照使ってSymbolGCが実現

RubyのSymbol。"symbol".to_symする"symbol"という値とIDが格納される。

immortal symbol(Cの世界)とMortal Symbol(rubyの世界)
Immortal Symbol GCしない。IDされると生き続ける
Immortalからmortalにはいけない

Mortal Symbolはidを持たない
"sym".to_sym => mortal symbol

bar.to_symで作成。CのSymbolテーブルに値がはいるがbarが消えるとSymbolテーブルからも消える。
mortal symboleが既にあったらそれを優先して使う。

Immortal symbolはGCされないもの。
Mortalはidをもたず。
Symbol.all_symbols.sizeでSymbolのサイズをチェック
資料はこれ

Continuous Delivery at GitHub
継続的Deliberyはいつでもソフトウエアをディプロイできるようになっていること。
Long Lived brancheds are a smell.
Gemfileに環境変数をみて分岐するロジックをいれてバージョンアップ対応
hubotさん使ってDeploy。
  /deploy
/ci
などなど

Egison Pattern Matching in Ruby
Egisonという言語の話。パターンマッチをする言語

pattern matchとは。
 データの分解と条件分岐をif分とか使わずにやる。
Edisonでは、更に簡単にできる。

Hypermedia: the Missing Element to Building Adaptable Web APIs in Rails
資料
Web APIについて
蜘蛛の巣の用なAPI蜘蛛の糸のようなAPI。前者はAPIで後者はprivate
APIはRestfuleにするかどうかは要件次第。今回は蜘蛛の巣のようなAPIの話
キーワードは「change」。web apiも変化に適用できないといけない。
変化にはBreaking changeとNo breaking change。後者の方がいいが、どうすれば良いか。
何故breaking changeがおきる?
 URLが変わると動かなくなるということがおきるが・・・。
jsonapiの使い方が書いてあって、そこからジェネレートする。でも結局URL変更

密結合だからこういう問題おきる。
粗結合にすることが必要!!!
ではどうするか??

root = HTTP.get_root
answer = root.link('first').follow
puts answer
while answer.link('next').present?
  answer = answer.link'('next').follow
  puts answer
end

例えば上記みたいにすればよい。
ハードコードしない。クライアントからみた次を読むを

Microdataこれ大事。
HTMLがWeb APIとして使える.
がHTMLはパースが必要だし。。JSONでやりたいなということもあるので。
Jsonのフォーマットだけどlinkやformを洗わせる。。。

ということで、Hypermicrodata gemという。HTMLをサーバサイドでJSONに変換。ではRailsでどう使う
1.resoueceの設計。
modelとcontrollerを設計
2.クライント体験から状態遷移を書く。
HTMLの画面遷移と似た感じでAPIクライアントの状態遷移を設計

3.データの名前とURLの対応をする
4.HTMLテンプレートを作成。

これにより
DRYで

もしHTML書かずにJSONだけでといっても
状態遷移は必要。
リンクやFormをもったJson-basedのフォーマットを使う