読者です 読者をやめる 読者になる 読者になる

RubyKaigiに行ってきた(2): 初日

ついにRubyKaigiそのものから1ヶ月が経ってしまって完全に機を逸した感が否めないですがセッションの内容編行きます。今度からはもっと早く書くことにしよう…。 ほぼノート垂れ流し、英語のノートは日本語に直して書いています。2日目以降は記事のひな形は作ってあるので連続して出てくる予定です。…これで詰まったりしないといいんだが…


Day 1: 9/18

初日の午前中は同時通訳サポートで裏にいました。

Continuous Delivery at GitHub

GitHubでどのようにデプロイプロセスを高速化しているかの話。運用の最先端の話とあって気になる人が多かったのか会場は超満員だった。

デプロイプロセスを高速化して連続的に製品を届けようっていう思想は新しく見えるがそれを支えるプロセスは「基本をいかに高いレベルでできるか」によって支えられているのだな、という印象だった。バージョンガードとか機能フラグを直接書いているというのは意外だったが最終的にtrueに潰せてしまってからは分岐チェックを潰すのは容易だし確かに合理的な気がした。


「どのようにして1日に50回のデプロイを行うか」。

マスターブランチは常にデプロイ可能である必要がある。Continuous Deliveryによって連続した価値提供のフローをもたらす。リリース間隔を短くする、より頻繁にソフトウェアを送り出す。

なぜ必要か?→現代は変化がついてまわる、しかもその速度はどんどん速くなる一方。スタートアップはものすごい速度で生まれては消えている。

一方でソフトを送り出すのは楽しい。前職のJavaよりRubyのほうが楽しい。顧客は反応・応答を求めている、さもないと他に行ってしまう。

昔のソフトウェアの提供スケジュールは6ヶ月かけてステージングへ、で6ヶ月でプロダクション、その後に膨大なバグリストが飛んでくる。で最後に「お前の作ってるソフトは洗練されてるけど使えないな!」と言われる。→サイクルが短ければ方向転換は容易。

どのようにして?

  • 自動化
  • テスト : app 158k loc に対し test 167k loc
  • pull requests : 途中のアイデアについても話し合う。2週間かけてブランチで作業してやっとpull request投げるのは遅い。コードにどっぷり浸かる前にフィードバックをもらおう。 ** GitHubのlive updateができたのもpull requestのおかげ。JSのエキスパートやスケーリングのエキスパートにもコンタクトをとってできるかどうか聞いてみる。そうしたら3日でできた。コードは60行。
  • feature flags: ユーザーの特性によって機能をon/offできる。例えば以下のような。実験でうまく行ったらtrueに変えるだけ。1-line diffで済む。最初に送り出し、全員に適用できそうだったらtrueとする。
def live_updates_enabled?
  logged_in? && current_user.staff?
end

Feature FlagsはRails 2からRails 3での移行でも使われた。ブランチを切っていたけど違いが多すぎてめんどくさくなったので master をRails 2とRails 3でデュアルブートするようにした。バージョンガードはコードで:

GH.only_on_rails3 do
  hoge
end
  • Science: コードの対照実験ができるツール
  • Chat Ops: Hubotはそのために作られた。すべてのプロセスが可視化されていて、ログを読むだけで何が起こっているか学ぶことができる。
  • Performance Dashboard: New Relicから移行

フィードバックを集める→Twitterで壊れてるというメンションがないかを探す

今日始めよう:まずはHipChatかSlackを入手しよう

Non-Linear Pattern Matching against Unfree Data Types in Ruby (Egison Pattern Matching in Ruby)

Egison言語という強力なパターンマッチを実現する言語をRubyで実装してみた、という話。Egison言語の最初期からのフォロワーとしては見逃せませんね!キャーエギサーン!!

強力なパターンマッチがあって何が嬉しい、という話で、強力なクエリ言語として使うことができる、というのが興味深かった。重厚長大SQLを1行で書けてしまうのは非常に魅力的。データベースのパフォーマンスとの相性とかは気になるが今後の動向次第では大化けもありそう。


Very quick intro

non-linear patterns allow multiple occurences of same variables in a pattern

https://github.com/egison/egison-ruby

ポーカーの役判定を1つのパターンマッチで書ける 普通のrubyで書くと1つのスライドには収まらない

無限リストのパターンマッチもできる 複数の無限列をリストとしてパターンマッチできる 双子素数の列を1つの式で取り出せる

パターンマッチとは?

rubyにはパターンマッチがない

プログラミング言語の構文のひとつで、

  • データの分解
  • 条件分岐

をシンプルにするための構文

ifだとnestして大変になる。パターンマッチだと1つの式で書ける。egisonパターンマッチはより強力に

データ型ごとにカスタマイズ

non-linear pattern: pattern内で作った変数をもう一度使う

パターンマッチ+backtracking

List, Multiset, Setのそれぞれに対してパターンマッチを定義できる

Stream(無限列)に対するマッチ

その他、見れなかったセッション