クラウドワークス エンジニアブログ

日本最大級のクラウドソーシング「クラウドワークス」の開発の裏側をお届けするエンジニアブログ

RubyKaigi 2014 2日目 参加レポート by @mumoshu

9/19(金)に開催された RubyKaigi 2014 2日目の参加レポートです。 弊社クラウドワークスも、多くの有名企業に並んでスポンサーをさせていただいているので、全力で宣伝させていただきます!

聴講しながら勢いてまとめているので読みづらい点もあると思いますが、全力で更新していきます!!

f:id:koichiroo:20160112045830p:plain

各種情報

スケジュール

RubyKaigiの公式サイトにスケジュールが掲載されています。

RubyKaigi 2014 | Schedule

Ustream

当日参加できない方向けには、USTが用意されていました。素晴らしいですね!

9:30- Pixivさんのスポンサーアピール

9:40- キーノート by matz

  • 未来の話をします
  • Heroku本は機能のうちに売り切れたが、今日追加があるかどうか?
  • Herokuで2.2.0 Preview 1が早速使えるようになりました
  • RubyConf 2001
    • 11月に開催された。9.11の後だった。フロリダあたりでは炭疽菌が話題になっていたが、家族に止められつ参加。
    • このとき既にRuby 2の話をしていた。
    • Ruby 2の話は結局「Virtual Machine」をつくるよ、という話。
    • VMが実現するまでバージョン1.9、2007年までかかった
    • VMは簡単なものを書くのは1週間くらいだった。でもmatzは挫折。その頃、いろいろなVMを書く試みがあったが、笹田先生がYARVを提案。Yet Anotherだけあってまたきたよ、という感じだったが、最終的にはこれがRubyに取り込まれることになった。
  • RubyConf 2002
    • このときもRuby 2の話をしていた
    • このとき言っていたRuby 2には
      • M17N (1.9 -> 2007)
      • Native thread (1.9 -> 2007)
      • Generational GC (2.1 -> 2013)
  • RubyConf 2003
    • Local variable scope (互換性を決定的に破壊することになるので断念)
    • Multiple assignment (1.9 -> 2007)
    • Method visibility
    • Keyword argument (2.0 2013)
    • Method combination (2.0)
    • SElector namespace (2.0, Refinemenetとして)
    • Optional static type (結局入る気配なし)
  • RubyConf 2004
    • 唯一欠席した。末の娘が生まれたので、さすがにそのとき渡米すると一生なにか言われそうだったからw
    • 笹田先生、YARV発表
  • RubyConf 2005
    • Stabby lambda (->)
      • ものすごい評判が悪くて、こんなの絶対ダメだ、と言われた
      • いざ入れてみたら、結構いいじゃん、と言われた
      • 他の人の印象は参考にならない例
    • Real multi-value
    • Traits
  • RubyConf 2006
    • Bikeshed argument encourage
      • 自転車小屋の矛盾はみんな乗ってくる
      • 原子力発電所をどこに置くか、という話は誰も乗ってこない
  • RubyConf 2007
    • 1.9 introduced
    • 1.9がきたのでそのsj崩壊
  • RubyConf 2008
    • Philosophy explained
    • RUbyの背景にある哲学を紹介
  • RubyConf 2009
  • RubyKaigi 2009
    • Complex literal (2.1, 2013)
    • Rational literal (2.1)
    • True divisonn (1/2 => 1/2) 結局入らず
    • Bitmap marking (2.0, 2013)
    • Symbol GC (2.2, 2014)
  • RubyConf 2010
    • Mix (traits)
    • Module#prepend
    • Refinement
    • Rite (のちのmruby)
  • RubyConf 2011-2014
    • No new ideas
  • 過去のRubyConf, RubyKaigiでは「こんなアイデアを将来のRubyに入れたいよね」という話をしてきた。
  • 結果、入ったものもあれば、入らなかったものもアッた。7/22は入らなかった。False rate = 32%。
  • 注目しなければならないのは2011-2014
    • Ruby 2が出てから先の話をしてない
    • Ruby 2の改善に注力していたから
  • "OSS Community is like a shark" 私たちは泳ぎ続けないと死んでしまう
  • 「そろそろ燃料を投下するべきではないか!」
  • そこでRuby 3.0
  • "May happen in next 10 year" Ruby 3.0、次の10年に実現するかもしれないこと。
  • Concurrency
  • JIT (LLVM?) "パフォーマンスが良いことに対して文句を言う人はいない" インラインアセンブラかどうかわからないが、何か
  • Static typing
  • Static typing?
  • "All new kids in the street"
  • 20世紀に生まれた言語の多くは、スクリプト言語のようなものは変数に型のないような言語が多かった。Perl, Python, Ruby
  • 最近登場してきた言語Scala, TypeScript, Dirt, Goのようあんものはスクリプト言語っぽい使われ方をするようなものでも肩が付いている
  • Feature #9999 by Davido
def connect(r -> Stream, c -> Client) -> Fiber
 ...
end
  • 長年のライバルPythonの方にはPEP:3107がある
  • Functional Annotation
def connect(r: Stream, c: Client) -> Fiber:
 ...
  • Pythonの場合、実はFunctional Annotationを書いても解決しない
  • Static typingとはひとことも書いてない。実はこれはドキュメント(!)
  • mypy: optional static type checker
  • Functional Annotationを使ってtype checkしよう、という新興の処理系
  • このようにRubyに近いような言語でもStatic type checkingをしよう、という動きがある
  • 目的はこの3つだろう
    • Performance
    • Compile-time check
    • Documentation
  • Performance
    • "No one complains for faster Ruby"
    • 速くなるならそれはそれで嬉しいが、パフォーマンスのために必須なのか?
    • JavaScript V8, LuaJITなどを見ていると、必ずしも必要ないのでは?
    • これらは言語的には動的型付けなのに、大変高速である
    • 技術次第。動的型付けでも不可能ではない?
    • だから、パフォーマンスのためにtypeが必要、というのは思い込みっぽい
  • Compile-time check
    • これは嬉しい事が多い
    • Static analysis
    • 多くのバグは型の矛盾を含むので、それによってバグが見つけられる事が多い
    • Refactoring漏れの検出もできる
    • 型があってるからテストしなくてもいいか、というとそんなことはない
    • Test coverageが少なくていい、ってことにはならない
    • "But less flexible" duck typingは型宣言と相性が悪い
  • Documentation
    • Rubyのドキュメントを書いているときに、変数名で何を渡したらいいか判断するが、型がわからない
    • 文字列なのか数値なのか、ドキュメントにぼんやり書いてあることもあれば、書いてないことも
    • "Much better than comments"
    • 矛盾しているとコンパイラが指摘してくれるので、信頼性のあるドキュメントになる
    • "No investigation into detail"
      • 「こういう処理をしているから文字列を渡せばいいよね」というinvestigationが不要になり、型宣言をみるだけでよくなる
  • "Why not static typing?": static typingがいまRubyにない理由
    • なくてもちゃんと動いたから今ない、というのも理由w
    • "Duck typing" by Dave Thomas
    • 通常Nominal typingなので、Stringと同じ振る舞いをするものをStringとして渡すことができない
    • static typingを入れると、我々の作り上げてきたduck typingの美しい世界
    • いままで書かれた型のないRubyコードとの互換性なので、型はoptionalにせざるをえない
    • 型のない世界から型のある世界に渡すと、型はなくなる。復元できない。プログラムを実行する過程で、どんどん型が落ちていくことになる
    • 例えばTypeScriptはJavaScriptに決定的に型をつける仕組み。dynamic typingも例外的にできるがほおtんど決定的に型をつける。JavaScriptには型を後付してやることができる。めんどくさいけど。こういう世界では型はうれしい。
    • 「Pがつく言語みたいに、バージョン5と6は違う言語、みたいなことになりたくない」
  • DRY: Don't Repeat Yourself
    • Static typingで書こうとすると、重複を感じる。DRYに書きたい。
    • プログラムの本質はどんなことをコンピュータにさせたいか伝えることにある
    • Code & Declaration
    • 型は「どんなデータを必要とするか」ということを表す
    • コードを書いた時点で意図がある、その上でまたDeclarationを書かなければならないのが繰り返し感がある
    • Soft-typing
      • No declaration needed
      • コードから「こういう型を要求しているに違いない」という、型推論のようなことをする
      • Based on duck typing
      • Type inference
a=1 # type of a is Integer
def foo(a)
  print a.to_int
end

foo(1) # OK: 1 has to_int
foo("foo") # NG: "a" does not have to_int
  • Type is represented by:
    • Set of methods: 型はメソッドの集合として表される
      • name
      • return value
      • number and type of arguments
    • Class
  • これはBest-effort type checker
    • お行儀の良いプログラムを書いているといい線いくのではないか
  • Rubyはお行儀の悪いプログラムも書ける
  • そこでTarget subset of the language
    • 対象となるプログラムのクラスがせまい。機能的制限。
    • 例えば
      • require
      • define_method
      • method_missing
      • などには制限がかかると思う
    • 型宣言がないのでそのままDocumentationとしての働きができない
      • Generates doc / IDE info
    • このネタは日経Linux 2014年9月号/10月号に掲載予定
  • Subset
    • Rubyは長い歴史の間に「過去に入れちゃったけど捨てられない」というものがある
    • 「このサブセットのなかでプログラミングをするといいことがあります、外れるといいことはないけど互換性がえられます」
    • Rubyは互換性を大切にする
    • "Two languages in One" あるサブセットの中ではsoft-typing
  • Soft-typed language
    • Dynamic typed language
  • Fallback to super-set
    • Strongly encouraging the former
  • 将来起きるかもしれないし、起きないかもしれない
  • Ruby 2が一般化して色々な事ができるようになったいま、そろそろ新しいことを始めようじゃないか
  • 未来に備えよう、コミュニティとして死なないように、ワクワクすることを考え続けよう
  • Happy Hacking

(衣装提供: VASILYさん)

  • Q: Rubyに型をつける研究が過去にあったが、はやらなかった理由は?
    • A: Rubyに単純に型を付けるのは不可能なので、RubyにSubsetの概念を導入するのが重要。そこがなかった。
    • A: そもそも難しい。型一致じゃなくて構造一致のような型システムを後付で導入するのは難しい。それも理由ではないか。
  • Q: if分のthen-elseで違うメソッド読んでると、外側からどちらが呼ばれるからわからない。じゃあSubsetからif文を外すのかというと外せない。どうするのか?
    • A: orになるのでは
  • Q: メタプログラミングはプログラムの最初の方で行われるので、その後に解析すればいいのではないあk
    • A: そのアイデアはなかったので検討してみます

Extreme Makeover: Rubygems Edition

  • まずBundlerにDDoSがあった
    • 昨年はどうして起こったか、どう対処したかの話をした
  • 次はSecurity breahがあった
    • gemをアップロードすると任意のコードを実行されてしまう?
    • 結果的にrubygems.orgをEC2でrebuildした
  • その後、Travis network issuesがあった
    • DNSサーバを変えるなどして対処
  • 次はSSL failures
  • Budler Source CVE
  • How it works today with a fast connection, at least
  • Gemspecsの置き方を変えた
    • Original gemspecs
    • /Marshal.4.8.gz (Marshaled gemspecs)
    • /specs.4.8.gz (List of gemspecs)
  • Bundler API
    • Plan
      • Simple plaintext indexes
      • clients cache the indexes
        • 例えばgem install railするとplaintextで書かれたindexをダウンロードする必要があるが、次回以降はキャッシュ
    • put a CDN on it
      • 現状gem pushするとus-west?のサーバに保存され、クライアントはそこからダウンロードすることになる。遠い。
    • easy local mirrors
      • オフィスごとにrubygems.orgのミラーをつくって、そこからgem install?
    • The New Index
      • /versions
        • rack 1.0.0,1.0.1,1.0.2
        • sinatra 0.9.6,1.0.,1.1
        • rack 2.0.0
        • gem毎に行が分かれているので、entire fileをダウンロードする必要がない/
      • /deps/sinatra
        • 0.9.6 rack:>= 0.9.1
        • 1.0 rack:>= 1.0
        • 1.1.4 rack:~> 1.1,tilt:< 2.0...
  • 現状
    • new indexを設計した
    • bundler api経由でnew indexが取れるようになった
  • TODO
    • rubygems.orgからnew indexをとれるように
    • fastly-hosted index file
  • gem install bundler
  • export_BUNDLE_JOBS=4
    • parallel gem installs
  • rubygems.org mirror
  • New resolver
    • better erors
    • faster installs
    • many bugfixes
  • You can help!
    • github.com/bundler/bundler
      • CONTRIBUTING.md

Archeology of Ruby: Removed Features (Ruby 考古学 機能編)

  • 過去にあったのに消された機能
    • Safe Level
      • $SAFE=4 is obsolete since 2.1.0
      • 不完全なSandbox
      • Feature #8468 Remove $SAFE
        • GitHub Tokyo drinkupでmatzが合意
      • $SAFE < 4はバグ発見のためのフェールセーフ機能として残った
      • 代わりに1.9.1からあるuntrustというメソッドが追加されたが活用されず2.1.0deprecated
    • '.'が$LOAD_PATHからひっそりと削除された
      • かわりにrequire_relativeを使う
    • Ruby 1.9の多言語化対応の影響で$KCODEの代わりにEncoding
      • $KODEは既にnilを返しつつwarningになった
    • Regexp options: /n /e /s /uは互換性のために残っていて、そのうちなくなるかも
    • グローバル変数$= (ignore case)
      • 大文字小文字の無視フラグ
      • 1.8.7でdeprecate、1.9.3で削除
    • $deferr (1.6.7から1.8.0)
      • 子プロセスに影響しないエラー出力リダイレクト
      • 現在は$stderrへの代入は子プロセスに影響しない
      • STDERR.reopenなどで子プロセスに影響する
    • if cond:
      • 1.8までは
if true:
  p true
end

という隠し機能があった

  • File.exists?
  • Ruby本体のメソッドは三単現のsを付けないルールがあるが、ついてた
  • 一度警告がでなくなったことがあったが、また出るようになった。
  • recommented: File.exist?
  • deprecated: File.exists?
  • 開発版のみに入っていたけど削除された機能
    • Symbol < String in 2006 (1.9.0-dev)
      • 問題が多かったため継承関係なくした
      • 「caseとかでたくさんのバグを産んでしまう」 by matz日記
    • __send__ cannot call private methodsになったことがあったが問題が多かった
      • 一時あったsend, send!は削除
      • public_sendが1.9.1が最終的に導入
    • real multi-value(to_splat)
      • a, b, = mvalue
    • Symbol.find in 2.0.0-dev
      • Symbolが既に存在するかを調べるメソッドが追加されたが、2.2.0でGCされるようになったので削除
      • 必要だと思ったら再度redmineでリクエストしてください、とのこと
    • statfs in 2.0.0-dev
      • 「色々込み入っているので最低限はtestに、それ以上はgemに」 by matz
  • まとめ
    • いくつかの機能は開発版だけで消えてしまった
    • 理由を考えることで今後の新機能提案に活かしてください
  • Q: 次に消えそうな機能はなんですか
    • A: 全然考えてなかったw
  • Q: 消えて欲しい機能は?
    • A: 正規表現のオプションは整理してもいいんじゃないのかなと思います

Make "bundle update" more fun to review

  • Solution
  • Motivation
    • 昨年"Continuous gem dependency ~"の発表をした
      • "bundle update"はよく忘れられる
      • 定期的に人力でやるのは面倒
      • 自動化!
    • quipper/schemaというprivateなgemにビジネスロジックをまとめている?
    • qlink, qcreateなどのサービスはschemaが更新されたらbundle updateする必要がある
    • それを手動でやる必要はない
  • Implementation
    • 方法
      • Receive webook
      • Compare Gemfile.lock(s)
      • Build URL
      • Post comment
  • Compare Gemfile.lock(s)
file = octokit.contents(
  repo_full_name, { ref: 'master' }
).find { | content| ... }

# LockfileParserでGemfile.lockをparse
old_lockfile.specs.each do |old_spec|
  new_lockfile_specs.each do |new_spec|
    if old_spec.name == new_spec.name
      if old_spec.version != new_spec.version
        # ...
  • 結果
    • schemaにプルリクエストを投げると、他のプロジェクトへschemaのバージョン更新のPRが自動的に飛ぶ
  • 問題
    • rails関連のgemはgemspecに書かれているホームページがGitHubになっていないなどの問題でうまく処理でいない
    • git push --forceするとWebHookに通常とは異なるリクエストが飛ぶが、その対応はできてない
  • 教訓
    • 継続的改善が重要

14:00- Open the door of embedded systems to IoT! mruby on LEGO Mindstorms EV3 ®

  • 自己紹介
    • ハンドルネームの「ちはやふる」は落語の演目が由来(!)
    • 日本の製造業のヒエラルキー。上から士農工商、メカ、エレキ、ソフト。私は一番下。
    • 機械のボタンの色変えろとかはないが、ソフトはいつでも変えろ、と言われる!最後のしわ寄せが来るのがソフト。
  • LEGO Mindstorms
    • ToyというよりはEducational Tool
    • 米国ではSTEM educationとも呼ばれる
      • Science
      • Technology
      • Engienering
      • Mathematics
      • のような分野の教材として使おう、ということ
  • RasberryPiの数倍の価格
    • 個人で買うと辛いが、RubyKaigiで発表ネタになれば元が取れる
  • Mindstorm
    • 1st gen = RCX
      • 1998
      • H8 16MHz
    • 2nd gen = NXT
      • 2006
      • ARM7 48MHz
    • 3rd gen = EV4
      • 2013
      • ARM9 300MHz
    • RCXも現役で使われている
  • EV3の開発環境: ビジュアルプログラミング。対象年齢10歳以上
  • Remote control対応。PCから遠隔操作することもできる。
    • PCでRubyからMindstormをリモートコントロールするLTをみたことがある
    • 今回はリモコンではなく組み込み。Standalone、EV3上でRubyで動かす。
  • ファームウェアアーキテクチャLinuxなので起動にも終了にも数秒かかる。
    • Linux
    • VM
    • System Program, User Program, Direct Command
  • 拡張ファームウェア
  • What's mruby?
    • "the lightweight implementation of Ruby language complying to (part of) the ISO standard. Its syntax is Ruby 1.9 compatible."
      • can be embedded and linked to your app
  • Can we use mruby in embedded systems?
    • 組み込み業界的にはGC大丈夫なの、仕事で使えるの?という反応
  • RubyKaigiで回路図を出してみたかった(会場笑)
  • RCX向け光センサ: 蓄電池内蔵で、充電・センシングをソフトで切り替える仕組み。RCXだとマイコンがbusyなので、mrubyだとGCなどのタイミングで切り替えが間に合わないため、光センサ使用不可
  • 最近の光センサ: 光センサにマイコンが内蔵されていてそちらで充電・センシング切り替えをやってくれるので、Mindstorm側のマイコンがbusyでも関係ない。mruby使える。
  • デモ - RubyJinja

14:30- Scalable deployments - How we deploy Rails app to 100+ hosts in a minute

  • ISUCONの宣伝(Iikanjini Speed-up CONtest)
  • 今日はなさないこと
    • Rails
    • Continuous Delivery
    • App servers auto-scaling
  • Cookpadのデプロイ規模
    • rails-statが桁あふれする規模のアプリ
    • サーバ台数max 140台
    • デプロイmax 10回/day
  • デプロイルール「CIビルドが通ったものを日中だけデプロイ可能。エラーが出たら戻してください。」
  • これまではデプロイサーバからCapistranossh+rsync
  • Deploy via Chat
  • デプロイにかかる時間の内訳
    • CIに10分
    • タグ打ち
    • デプロイに通常 10分
    • トータル15...20分
  • Capistrano 2向けのデプロイ: complicated super historical script
  • 2595行もあった
  • さすがにdead codeなんとかしたいという問題
  • SSH重いという問題
  • High CPU usage on deployment. たまにこける
  • 「たまにこける」というのが問題
  • 10分で終わるはずのデプロイが、20分くらいかかることもある。トータルで20分から30分。
  • 開発基盤チームは気持ちよく開発できるようにすることをゴールにしている。CIが遅かったらCIを高速化するし、テストの手順が複雑なら自動化するし、デプロイが遅かったら高速化する。
  • 今回はデプロイに手を加えることになった
  • Capistrano 3はどうか
    • SSHのハンドリングがまし。でもSSHにはまだ依存している。
  • 新しいツールをつくった
  • sorah/mamiya
  • Serf
    • Gossip protocol
      • うわさ話が広がるようにメッセージをfanoutしていく
    • hashicorp/serf
      • SSHでやるより速いだろう
    • sorah/villein
  • mamiyaのアーキテクチャ
    • Master node
      • HTTP API
      • serfへのメッセージ送信
      • 他のnodeの監視
    • Agent node
    • Deploy Script
      • how to build, preapre, release
    • Package
      • tarball of files to deploy
    • Storage
      • packageの置き場所
      • 標準ではS3
    • Step
      • デプロイの各処理。それぞれ呼び出すことができる
      • Fetch
      • Prepare
      • Switch
  • これでSSH依存は脱したが、まだできることがあるのでは
  • Stepはバラバラに実行できるので、bundle installや最新packageの配信はCI通った後に予め行っておく。
  • 結果的に数十秒でデプロイできるようになった
  • デモ
  • Future
    • Better documentation (soon)
    • Auto deploy when joining cluster
    • Web UI
    • Better error tracking, handling

15:30- Write ruby code to change ruby code

  • ストーリー
  • Project Cで.. → もう繰り返したくない!
  • "Developers hate changing code again and again"
    • そこでAutomation
  • Metric Tools
    • cane: fails your build if code quality threasholds are not met
    • reek: examies classes modules and methods and any code problem
  • これらは何をすべきか教えてくれるだけ、その何かを自動的に行なってはくれない
  • RubyMineのようなIDE
    • rename, extract methodsリファクタリングなどのような決まりきった処理は自動的に行える
    • しかし、カスタマイズできない
  • じゃあテキストベースで変換するか?
    • `sed -i " 's/FactoryGirl.create/create/g' spec/*/.rb"
  • テキストベースだと難しいケースがある
    • User.findの古い書き方(conditionあり)から、lambdaを使った新しい書き方への変換
  • AST
  • Tools
    • ripper
    • seattlerb/parsetree
    • seattlerb/ruby_parser
    • whitequark/parser
  • Example
    • yujinakayama/transpec
  • Based on AST method: accurate, but hard to read
  • Solution: xinminlabs/synvert
  • Demo: http://xinminlabs.github.io/synvert/
    • synvert --run factory_girl/use_short_syntaxgit diff spec/
    • Rails 2.3 -> Rails 3.0, 3.2 -> 4.0への自動変換(!)
    • Rubyのキーワード引数スタイルへの書き換え(!)
  • Synvert DSL
    • within_file, within_node, if_exist_node, append/insert/insert_after/replace_with
  • http://xinminlabs.github.io/synvert/dsl/
  • synvert-tools
  • synvert-snippets
  • Want more?
    • Fork and send pull request
    • Open issues on GitHub
    • Hire us to refactor your project

16:00- ServerEngine: a framework for multiprocess servers in Ruby

  • アーキテクチャ
    • Supervisor
    • Server
    • Worker
      • worker_typeで簡単に切り替え
        • Embedded (main thread, default)
        • Thread (for jruby)
        • Process (fork, doesnt work on windows)
    • TDではjrubyを使ってないので誰かテストして欲しい(!)
  • Dynamic reconfigurationの仕組みが用意されている。
    • Workerにreloadメソッドを用意しておく
  • Log rotation
    • Ruby標準のLoggerはマルチプロセスで動かすとバグる
    • ServerEngineのロガーはその問題を解決&traceレベルに追加対応
    • Ruby 2.1以降はruby-core入り
  • Signal handling
    • Queue based signal handling
      • CRubyのSignalハンドリングはメインスレッドで行われる
      • マルチスレッド環境ではデッドロックする
      • そこでSignalThreadでキューベースでシグナルを処理
      • Fluentdではシグナル毎にスレッドを起動していていけてないのでこうした
  • Live Restarrt
    • サーバ再起動時間を最小化する
    • Fluentdでout_forward使ってると、再起動時に切れてクライアント側で例外処理する必要がある。
      • 接続を保ったまま再起動して欲しい
      • 工夫しないと完全には実装できないが、その基盤をServerEngineが用意している
    • SIGINT時にサーバを多重に起動して、送り先を切り替える。
      • supervisorを使ってる時しかできない
  • sigdump gem
    • JavaVMにはSIGQUITを送るとメモリやスレッドの状態をdumpする機能がある
      • TDでもHadoopが止まったりしたときに活躍する
    • Rubyでデーモンとか書いてるとたまにそういうことがある
      • Ruby版のsigdumpが欲しくなった
    • ServerEngineにはビルトイン。SIGINT送るとdumpされる。
    • 定期的にkill -INT pidしてやればスレッドの状態なんどをモニタできる
  • Usecase: Sneakers
    • jondot.github.com/sneakers
    • ServerEngine + RabbitMQ
  • Usecase: Fluentd v1
    • CRubyでヘヴィーなデータ加工をするとそこがボトルネックになる
    • Zero downtime restart

16:30- Kids, Ruby, Fun!: Introduction of the Smalruby and the Ruby Programming Shounendan

  • Sponsored by NaCl
  • NaCl
    • is SIer
    • 60人中30人はRubyで開発
    • Matsumotoさんはじめ6名のCRubyコミッタを擁する
    • 島根県
  • Ruby プログラミング少年団
    • 青少年のための任意団体
    • 毎月第3日曜日に親子向けのプログラミング教育を実施
    • 将来は各地にチームがあって、地区大会・県大会・全国大会があるような少年団をつくりたい
  • プログラミング教育の現状
    • 国内外で盛り上がっている
    • もっとも活発なのはアメリ
      • 幼稚園から高校まで20,000 teachersが授業に取り入れている
      • オバマ大統領が必修化を目指している
    • 5歳からアルゴリズムの初歩とプログラミング、デバッグのカリキュラム。Googleの人も参画。
    • エストニアシンガポールなどでも導入の動き
    • 日本
      • 中学校の技術家庭科で2012年度から必須。「計測と制御」、黒い線にそってロボットの車を動かす、という内容。
      • 松江市立の5500人の学生にRubyを教えることkに
        • 子供を立派なRubystに育てたかったら松江への移住を検討してください
      • 生徒一人一台のコンピュータ配布
    • 日本の民間企業の活動もある
      • PEG(GoogleNPO法人Cambusの共同プロジェクト)
        • 日本全国でワークショップ開催
        • 教育事業者向けに5000台のRasberryPi配布
      • TENTO
  • 多くのワークショップではMIT Media LabのScratchがよく使われる
    • 全世界で200万人が利用している
  • プログラミング教育が盛り上がっているが、それをRubyでもやりたい
  • 発表者は中学生に6年間Rubyを教えたが・・
    • 英語・キーボードが難しくて、プログラミングが楽しくなる前にやめてしまう
  • そこでSmalruby開発
  • ビジュアルプログラミング環境
    • ブロックをグラフィカルな画面上に配置すると、Rubyコードが自動生成される
    • Rubyコードで書いたものは、ブロックにも反映される
  • 実装
    • SmalrubyのエディタはRailsアプリ
    • 命令ブロックの組み合わせでコードを生成するところはBlocklyというライブラリで実現
      • Google Closureライブラリを使っている
      • JSレベルでブロックの定義・Rubyコード生成を行われる
  • やりたいことが決まっている子供がいる
    • 素数を求めたい、とか言う
    • 早いタイミングでブロックでは足りなくなって、コードを書きたくなる
    • これまで6回のイベントを開催したが、「こんな簡単なことはやりたくないので次からきません」みたいな人もいた
    • そこでSmalrubyではコード生成。コードも書けるようにした。
  • Rubyコードからブロックの生成は、Railsアプリ側で正規表現ベースで行っている
    • Ripperなどを使わない理由は、子どもたちが書いたシンタックス的に正しくないおしいコードもうまく変換するため
    • Rubyコードからブロック生成、ほんとにいるの?」と言われたがSmalrubyではそこを重要視している
  • Programmingとは、Creativity とLogical thinking
  • 命令ブロックでプログラミングの基礎を学んだあとは、早い時期にコードを書いて欲しい
  • Smalrubyは基本的に一人で開発している。興味がある人はプルリクエストを送って欲しい
  • ワークショップ開催したい人は、教科書などCreative Commonsで用意しているので声をかけて欲しい
  • 「私たちは自分の生活で使っているツールを自分で直せる」ということが重要。OSSに関わっている人なら共感してもらえるのでは。
  • 子どもたちに最高の道具を授けたいと思い、こういう活動を行っている。
  • Q&A
    • ハードウェア制御をSmalrubyでやれるようにすることはあるか?
      • Arudino対応。例えばブロックの中に「アクチュエータ」というのがあって、Arudinoで作られた車を制御する、ということができる
    • なぜそんな遅いのか?
      • RubyWindowsで動かしてるせい。
        • でも、教育で使うときはこだわってWindowsを使っていきたい。
        • 教育現場で使われているのはWindowsだから。
        • WindowsRubyをよりよくしていきたいと思っている
        • こだわり: Rubyそのものをインストールさせる
          • もっとプログラミングしたい、Railsやりたい、というときに、既にRubyがインストールされている状況をつくりたい
    • 日本語以外の言語をサポートする予定はありますか?
      • RubyConfでSmalrubyを紹介することになったので、それまでに多言語対応したい
      • Blocklyはもともと国際化対応されていた
    • 実行ボタンおした時の結果はどこで動いているのか?
      • dxruby + rubyでネイティブで動いている。ブラウザで動いているように見えるが、実はネイティブ。

17:30- LT

Practical factory_girl

  • 7年くらいRubyRailsを使った開発をしてきた
  • traitを使おう
    • inheritance: userと並列にdeactivated_user、admin_userを作る
    • 欠点はdeactivatedかつadminみたいな組み合わせが発生したときにどうするか?
    • 適材適所とはいえ、なるべくtraitを使おう
    • オブジェクトの状態とは継承関係で表現するものではないから
  • イベントデータはつくらないようにしよう
    • プロダクションコードと同様、createメソッドでイベントデータをつくろう
  • BDD-style
    • describeとcontextで構成されたスタイル
      • describe中ではletやsubjectを作る
      • context中でbefore
    • Find notable state, name the state

Native Libs and Gems on Heroku with Hammer

  • ネイティブライブラリのgem化方法
  • = Native Gems (or Extensions)
  • hammerを使う

ofruby - Ruby running on the iPhone

  • ファイルの編集実行まですべてiPhoneで行うことができるビジュアルプログラミング環境
  • 構成
    • mruby for scritping
    • openFrameworks for graphics
    • Objective-C
  • モチベーション
    • iPhoneは偉大
    • そのおかげで家庭用PCの売上は下がった
    • PCがないとプログラマの減少につながる。世界の危機。
    • そこでiPhoneを使ってプログラマを育てることを考えた
  • デモ
  • ここまですべてiPod touchで開発できる
  • ソースコードはすべて公開されている
  • インストールはAppStorからofrubyで検索

Keep Freedom on Ruby - A magical world, 'Diversity'

  • 万葉は今年で7歳。今年はじめてゴールドスポンサーになれました
  • "I love freedom" 性格的に自由が好き
  • Rubyは私たちに自由を与えてくれるので好き
  • Rubyは気持ちよく書ける
  • でもチームでコードを書いていると「一貫性」というプレッシャーが襲ってくる
  • privateにするかどうか、新しい設計、書き方を試したい
  • それがConsistency vs Freedom(多様性)
  • 「forのかわりにeachを使いましょう」それってほんとに必要?
  • Rubyが与えたものをプログラマが制限してはいけません、と思う」w
  • 「初心者のためにdescribe・contextだけ使いましょう」も地獄への入り口
  • 自由を手放すことには慎重になるべき
  • それを阻止するためにDiversity
  • 「やりたくない」という代わりに「それはRubyの多様性を壊す!」というのをおすすめします(会場笑)
  • 一貫性にこだわり過ぎると一部を変えたり新しいことを始めるときにつらい
  • ここでも多様性という言葉使える
  • 多様性はチャレンジを推奨してくれるので良い
  • とはいえ、みんなが知ってるメソッドはみんなが知っているように動くべき
  • I love Ruby

10th anniversary of Rubyist Magazine

  • 「RubyKaigi 2014のスピーカー・発表できなかった人、るびまで記事を書いてください!」
  • 文字にして書いてもらえると後まで残る
  • るびまは2004年リリース。今日で10年
  • 0048号本日リリース
  • 目玉記事
    • あの記事を振り返って
    • Rubyst Magazine 10周年
    • Incremental GCの導入記事(ちゃんと書いたので呼んでください by ko1さん)
  • 通常号48号、特別号5号
  • 総記事数643本
  • リリース間隔平均4ヶ月
  • 10年間ありがとうございました。今後共よろしくお願いします!

The world's fastest tour of real time web applications

  • 中止?

Let's try mruby's edge cases

  • いまこそmrubyニコントリビュートすべき
  • 64ビット整数使いたいんだよね
#define MRB_INT64
  • "You can find problmes very easily"
  • 数日後、他のところでも見つかった
  • mrubyを良くするためには困難に立ち向かう必要はありません!
  • 難しいことも残っているが、簡単なことも残っている
  • Rails 勉強会91回主催した。引き継いで下さった人に感謝

Probabilistic model for inspirations and significance of programming

  • 数学者です
  • Rubyは全く関係ありません
  • イデア、ひらめき、思いつきとは何なのか?その価値とは?を数学的な何かで考察する
  • イデアはうまくいったりうまくいかなかったりします。利益もあったりなかったり。つまり確率的な存在
  • イデアの価値とは期待値ではないか
  • 成功率 x 成功時の利益
  • しかし成功率は低いので、アイデアの価値は引くい
  • 期待値の加法性
  • 一個一個の価値は低くても、たくさんあればいいのではないか
  • 試行
  • プログラマにとってはプログラミングが試行
  • イデアの価値を引き出すためにはコーディングという試行錯誤が必要。
  • 実力をつけてコードをたくさんかかなければならない
  • イデアの加法性ってあやしくない?
  • 普通、2つのアイデアを2つ同時にためしたりしない
  • Xを試してうまくいあかなkったらYを試す→条件付き確率
  • XとYに正の相関があれば条件付き確率の期待値は下がってしまう
  • XとYが似ている=相関がある
  • = 2つのアイデアが似ていると、XがだめなときにYがだめなこともわかってしまう
  • 相関が小さいアイデアを、確率的独立に近い多種多様なアイデアが必要
  • そのためにプログラミングが必要
  • つまりわれわれは修行しなければならない
  • イデアの価値が、と言ってくる人にこういう話をして煙にまくといいと思います(会場爆笑)

(このあたりでPCの電源が切れたのでiPhoneでメモ取り始めました・・ので、分量が落ちます)

R/W splitting in Rails

  • octopus: コードベース大きい
  • acs_as_readonlyable: フリーダムにモンキーパッチあてててメンテがつらい
  • そこでswitch_pointを作った
  • initializerなどで初期化してModelに組み込むだけで使える
  • 本来RW Splittingはコネクションのレイヤーでできるはず。実際それをやってみたのがswitch_point

Invitation for v1.0.0

  • バージョンはフィーリングできめられたりする
  • v1 is GA
  • v1まではいつでもAPIは変えられることを意味する
    • v0ということは、プロダクションで使ってないということ。本当?
    • 違うならv1に上げましょう
  • norikraは一年でv1
    • public apiと機能はこわしません、という表明
  • バージョニングはコミュニケーションの一手段
  • ところでFluentdは?
    • 0.10ですね(!)
  • みなさんv1をリリースしてください!

How the RSpec team and I built the smooth upgrade process for RSpec 3

  • RSpec 3は互換性がない変更があったので、アップグレード大変だろう。
  • そのためにRSpec 2.9.9とtranspecを作った
  • transpecはASTと実行時の情報を使う。誤変換を防ぐため。
  • おすすめのアップグレードパス
    • まずRSpec 2.9.9にして、Transpec実行、その後に手修正
  • 同じアップグレード方法を他のフレームワークで使えないか?
    • specは対象コードを全部実行することができるので、実行時情報全部取れた。アプリだとそうはいかない。
    • コストをそんなにかけていいのか?
      • RSpecはポピュラーなので、労力をかける価値があった
      • 他のアプリだとそうはいかないかも

© 2016 CrowdWorks, Inc., All rights reserved.