9/19(金)に開催された RubyKaigi 2014 2日目の参加レポートです。 弊社クラウドワークスも、多くの有名企業に並んでスポンサーをさせていただいているので、全力で宣伝させていただきます!
聴講しながら勢いてまとめているので読みづらい点もあると思いますが、全力で更新していきます!!
各種情報
スケジュール
RubyKaigiの公式サイトにスケジュールが掲載されています。
Ustream
当日参加できない方向けには、USTが用意されていました。素晴らしいですね!
9:30- Pixivさんのスポンサーアピール
9:40- キーノート by matz
- 未来の話をします
- Heroku本は機能のうちに売り切れたが、今日追加があるかどうか?
- Herokuで2.2.0 Preview 1が早速使えるようになりました
- RubyConf 2001
- RubyConf 2002
- 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
- Stabby lambda (->)
- RubyConf 2006
- Bikeshed argument encourage
- 自転車小屋の矛盾はみんな乗ってくる
- 原子力発電所をどこに置くか、という話は誰も乗ってこない
- Bikeshed argument encourage
- RubyConf 2007
- 1.9 introduced
- 1.9がきたのでそのsj崩壊
- RubyConf 2008
- Philosophy explained
- RUbyの背景にある哲学を紹介
- RubyConf 2009
- DSLの力
- 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
- "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
- "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
- Set of methods: 型はメソッドの集合として表される
- これはBest-effort type checker
- お行儀の良いプログラムを書いているといい線いくのではないか
- Rubyはお行儀の悪いプログラムも書ける
- そこでTarget subset of the language
- Subset
- Soft-typed language
- Dynamic typed language
- Fallback to super-set
- Strongly encouraging the former
- 将来起きるかもしれないし、起きないかもしれない
- Ruby 2が一般化して色々な事ができるようになったいま、そろそろ新しいことを始めようじゃないか
- 未来に備えよう、コミュニティとして死なないように、ワクワクすることを考え続けよう
- Happy Hacking
(衣装提供: VASILYさん)
- Q: Rubyに型をつける研究が過去にあったが、はやらなかった理由は?
- 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
- またrubygems.orgをRebuildした
- 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
- 現状
- 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
- github.com/bundler/bundler
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までは
- Safe Level
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
- statfs in 2.0.0-dev
- 「色々込み入っているので最低限はtestに、それ以上はgemに」 by matz
- Symbol < String in 2006 (1.9.0-dev)
- まとめ
- いくつかの機能は開発版だけで消えてしまった
- 理由を考えることで今後の新機能提案に活かしてください
- Q: 次に消えそうな機能はなんですか
- A: 全然考えてなかったw
- Q: 消えて欲しい機能は?
- A: 正規表現のオプションは整理してもいいんじゃないのかなと思います
Make "bundle update" more fun to review
- Solution
- GitHubのCompare View URLを活用したい
- https://github.com/markevans/dragonfly/compare/v1.0.0...v1.0.7
- バージョンタグやコミットID間で差分を見ることができる
- GitHubのCompare View URLを活用したい
- Motivation
- 昨年"Continuous gem dependency ~"の発表をした
- "bundle update"はよく忘れられる
- 定期的に人力でやるのは面倒
- 自動化!
- quipper/schemaというprivateなgemにビジネスロジックをまとめている?
- qlink, qcreateなどのサービスはschemaが更新されたらbundle updateする必要がある
- それを手動でやる必要はない
- 昨年"Continuous gem dependency ~"の発表をした
- 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が自動的に飛ぶ
- 問題
- 教訓
- 継続的改善が重要
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も現役で使われている
- 1st gen = RCX
- EV3の開発環境: ビジュアルプログラミング。対象年齢10歳以上
- Remote control対応。PCから遠隔操作することもできる。
- ファームウェアアーキテクチャ。Linuxなので起動にも終了にも数秒かかる。
- 拡張ファームウェア
- What's mruby?
- 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ビルドが通ったものを日中だけデプロイ可能。エラーが出たら戻してください。」
- これまではデプロイサーバからCapistranoでssh+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はどうか
- 新しいツールをつくった
- sorah/mamiya
- Rubyで書かれている
- Serfをオーケストレーション用に使っている
- ファイル配布にS3利用
- Capistranoとディレクトリ構造に互換性があるので移行しやすい
- Serf
- Gossip protocol
- うわさ話が広がるようにメッセージをfanoutしていく
- hashicorp/serf
- SSHでやるより速いだろう
- sorah/villein
- Gossip protocol
- 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
- Master node
- これで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 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
- アーキテクチャ
- Dynamic reconfigurationの仕組みが用意されている。
- Workerにreloadメソッドを用意しておく
- Log rotation
- Signal handling
- Queue based signal handling
- CRubyのSignalハンドリングはメインスレッドで行われる
- マルチスレッド環境ではデッドロックする
- そこでSignalThreadでキューベースでシグナルを処理
- Fluentdではシグナル毎にスレッドを起動していていけてないのでこうした
- Queue based signal handling
- Live Restarrt
- サーバ再起動時間を最小化する
- Fluentdでout_forward使ってると、再起動時に切れてクライアント側で例外処理する必要がある。
- 接続を保ったまま再起動して欲しい
- 工夫しないと完全には実装できないが、その基盤をServerEngineが用意している
- SIGINT時にサーバを多重に起動して、送り先を切り替える。
- supervisorを使ってる時しかできない
- sigdump gem
- 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
- Ruby プログラミング少年団
- 青少年のための任意団体
- 毎月第3日曜日に親子向けのプログラミング教育を実施
- 将来は各地にチームがあって、地区大会・県大会・全国大会があるような少年団をつくりたい
- プログラミング教育の現状
- 多くのワークショップではMIT Media LabのScratchがよく使われる
- 全世界で200万人が利用している
- プログラミング教育が盛り上がっているが、それをRubyでもやりたい
- 発表者は中学生に6年間Rubyを教えたが・・
- 英語・キーボードが難しくて、プログラミングが楽しくなる前にやめてしまう
- そこでSmalruby開発
- ビジュアルプログラミング環境
- 実装
- やりたいことが決まっている子供がいる
- 素数を求めたい、とか言う
- 早いタイミングでブロックでは足りなくなって、コードを書きたくなる
- これまで6回のイベントを開催したが、「こんな簡単なことはやりたくないので次からきません」みたいな人もいた
- そこでSmalrubyではコード生成。コードも書けるようにした。
- Rubyコードからブロックの生成は、Railsアプリ側で正規表現ベースで行っている
- Programmingとは、Creativity とLogical thinking
- 命令ブロックでプログラミングの基礎を学んだあとは、早い時期にコードを書いて欲しい
- Smalrubyは基本的に一人で開発している。興味がある人はプルリクエストを送って欲しい
- ワークショップ開催したい人は、教科書などCreative Commonsで用意しているので声をかけて欲しい
- 「私たちは自分の生活で使っているツールを自分で直せる」ということが重要。OSSに関わっている人なら共感してもらえるのでは。
- 子どもたちに最高の道具を授けたいと思い、こういう活動を行っている。
- Q&A
- ハードウェア制御をSmalrubyでやれるようにすることはあるか?
- Arudino対応。例えばブロックの中に「アクチュエータ」というのがあって、Arudinoで作られた車を制御する、ということができる
- なぜそんな遅いのか?
- 日本語以外の言語をサポートする予定はありますか?
- RubyConfでSmalrubyを紹介することになったので、それまでに多言語対応したい
- Blocklyはもともと国際化対応されていた
- 実行ボタンおした時の結果はどこで動いているのか?
- dxruby + rubyでネイティブで動いている。ブラウザで動いているように見えるが、実はネイティブ。
- ハードウェア制御をSmalrubyでやれるようにすることはあるか?
17:30- LT
Practical factory_girl
- 7年くらいRubyやRailsを使った開発をしてきた
- 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
- describeとcontextで構成されたスタイル
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
- モチベーション
- デモ
- Balls
- Wave clock
- ブロック崩し
- ここまですべて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号本日リリース
- 目玉記事
- 通常号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をリリースしてください!