ちなみに

火曜日の空は僕を押しつぶした。

第34回Ruby/Rails勉強会@関西に参加しました

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つ挙げよ。」が最高でした。
個人的には

  1. froとtypoしやすいから
  2. 直感的でないから(for i in hogeは英語的には正しいかもしれないけどiの内容がhogeに入りそうなイメージ)
  3. 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'