http://jp.rubyist.net/?KansaiWorkshop34
[追記]
スライドアップロードしました
http://www.slideshare.net/Sixeight/sinatra-1658721
[ここまで]
1週間前ですが7/20(土)に開催されましたRuby勉強会に参加してきました
- Sinatra 事始め by 僕
- Webhooks (real-time web) by ストヤンさん
- ActiveResource が面白すぎる件 by 松本さん
- ruby-processing 入門 by kyara さん
- Ruby 初級者向けレッスン第 28 回 by okkez さん
というラインナップでした
自分の発表については、前回と比べるとゆっくり話すことが出来たのは進歩ですが、
- スライドの文字が小さい
- 聞いてくださっている方をちゃんと見ておらず自分中心のペースだった
- 用語に対する説明がなく知らない人を置いていく発表だった
- 余裕がなく、たんたんと説明するしかできなかった
などなど反省点盛りだくさんですが、こうやって経験を積んでうまくなっていきたいです
次のストヤンさんのWebhooksの話がとてもおもしろく参考になりました
Webhooksというのは、あるサービスに任意のURLを渡しておくことによって特定のタイミングでパラメタ付きでそのURLをキックしてもらうというものです
なんのことか分かりにくいと思うのですが、例えば明日の天気を教えてくれるサービスがあったとして、そのサービスに自分の作ったサービスのURL(e.g. http://www.example.com/weather/)を渡しておくと、天気のデータが更新されたときに自動的にJSONなど形式で天気データを格納したうえで先ほどのURLを呼び出してくれます。呼び出された自分のサービス側はデータを受け取っているのでそれを処理するだけになります。
これによって定期的にポーリングすることなく、リアルタイムにデータのやり取りが出来る訳です。
ObserverパターンのWeb版といった雰囲気ですね。
Hubになってくれるようなサービスもあるみたいなのでそちらでデータを欲しい形に成形して、実際のサービスに渡すなんてUNIXパイプみたいなことも出来るようです。
夢が広がりまくりですね
Lang-8の松本さんのActiveResourceの話はUstream.tvでの配信担当を変わったばっかりだったので、あたふたしてしまってあまり聞けませんでした。暗すぎて見えなかったスライドが見えるようにとあーだこーだやったらちゃんと見えるようになってみたいで良かったのですが、最初の方がきれいに映せなくて申し訳なかったです
kyaraさんのProcessingの話はもともと興味があって個人的に遊んだこともあったので、ちゃんとして使い方が分かって良かったです。その後研究室でも遊んだりしてました。時間があったらちゃんと使いこなせるようになりたいところ。
さて、最後はお待ちかねokkezさんの初級者レッスン
今回は「なぜRubyでforが使われないか、理由を考えて3つ挙げよ。」が最高でした。
個人的には
- froとtypoしやすいから
- 直感的でないから(for i in hogeは英語的には正しいかもしれないけどiの内容がhogeに入りそうなイメージ)
- forは都市伝説だから
くらいしか思いつきませんでした
残りの課題は以下に
def assert(exp, desc) print "#{desc}: " puts exp ? 'ok' : 'no' end def factor_loop(n) res = 1 (1..n).each {|i| res *= i } res end def factor_inject(n); (1..n).inject(:*) end def factor_recursion(n) return 1 if n <= 1 n * factor_recursion(n - 1) end def fib_recursion(n) return 1 if n < 3 fib_recursion(n - 1) + fib_recursion(n - 2) end def fib_loop(n) a = b = 1 (n-2).times { a, b = a + b, a } a end def en2_recursion(n) return 1 if n < 4 en2_recursion(n - 1) + en2_recursion(n - 2) + en2_recursion(n - 3) end def en2_loop(n) a = b = c = 1 (n - 3).times { a, b, c = (a + b + c), a, b } a end class Array def bsearch(target) _bsearch = lambda do |target, head, tail| return -1 if tail < head middle = (head + tail) / 2 return middle if (now = at(middle)) == target if target < now return _bsearch[target, head, middle - 1] end _bsearch[target, middle + 1, tail] end _bsearch.call(target, 0, size) end end assert factor_loop(5) == 120, 'factor_loop' assert factor_inject(5) == 120, 'factor_inject' assert factor_recursion(5) == 120, 'factor_recursion' assert factor_loop(10) == factor_inject(10) && factor_recursion(10) == factor_inject(10) && factor_loop(10) == factor_recursion(10), 'factor' assert fib_recursion(8) == 21, 'fib_recursion' assert fib_loop(8) == 21, 'fib_loop' assert fib_recursion(20) == fib_loop(20), 'fib' assert en2_recursion(7) == 17, 'en2_recursion' assert en2_loop(7) == 17, 'en2_loop' assert en2_recursion(7) == en2_loop(7), 'en2' assert (0..1000).to_a.bsearch(824) == 824, 'bsearch'