ちなみに

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

Ruby/Rails勉強会@関西 #28

http://jp.rubyist.net/?KansaiWorkshop28

行ってきましたRuby勉強会。6回目。(テンプレート化)

5時起き生活に切り替えて3日目、まだ早寝の習慣が身に付いてくれないので、睡眠時間が足りず一日中ぼーっとした感じが抜けなくて、全体的に発表と自分の距離が遠い感じがしてところどころ聞けてなかったり、逆に集中してたりと変な感じでした。
これで濃い発表がばんばんくる回とかだったらまずかったのですが、そんな事はなく助かった感じです。


今回は、

  • エラトステネスの嵐―Rubyの集合演算を活用する by こなみさん
  • git - 分散バージョン管理システム by 舘野祐一さん
  • Ruby 初級者向けレッスン 第 22 回 by okkez さん

というラインナップ。

エラトステネスの嵐―Rubyの集合演算を活用する by こなみさん

最初に提示した素朴な実装から、だんだんと効率の良いものに書き換えていくという筋立てがおもしろくて、Rubyで集合お扱う時の触りも勉強できるお得感がありました。
アルゴリズムにはあまり興味が持てなくて研究室でやらざるを得ない状況になってはじめてちゃんとやったのだけど、本を読んでもやっぱりピンとこない。そういう人にとってはこうやって実例で改善していく仮定を見るのこそアルゴリズムを勉強するうえで重要だなと感じました。
あと、ベンチマークの取り方とか、プロファイルの使い方をはじめてちゃんとしった知った気がします。今までは必要なときにコピペですませていたので。

git - 分散バージョン管理システム by 舘野祐一さん

gitかわいいよ、git。
gitの魅力をすばらしくうまく表現した内容。gitは大好きだけど、それをうまく言語化できないので、gitを知らない人にもgit良いかもと思わせる舘野さんはすごい。というか僕が言語化が苦手すぎるのがまずいのか。
gitの使い方については僕はかなり適当な知識しかもってなくて、使えてるから良いやから出れていない。なので、こうやって正確な知識を得て、それを伝えてくださる人がいるのは非常に助かります。(自分で調べる気ないのかよ)今回もかなり勉強になって、git力が結構あがったのではないかと思います。
githubについてもここ最近watch以外の行動を出来てなかったのが、こんなにおもしろいんだよといわれてモチベーション上がって触りたくなってきました。

ホワイトボードのRubyが好評で作った甲斐がありました。(暇つぶしだったという噂も)

Ruby 初級者向けレッスン 第 22 回 by okkez さん with モリさん

irbのお話。irb全然活用できてなかったことに気づきました。設定ファイルとか書いた事無いし、単純な使い方しかできてませんでした。irbも実は深いなぁ。

演習問題は、前半はさらっとやって、計算100つくったり、設定ファイル書いたりしていました。この段階で頭がバッテリー切れを起こしていたので、あまり集中できてなくて真面目にできてなかったのが失敗。

irbの結果の非表示は

>> 1 + 1
=> 2
>> conf.echo = false
>> 1 + 1
>> conf.echo = true
=> true

という感じみたいです。直感的で良いですね。on/offならもっと直感的だったんだけど、そこは仕方ないか。(offとやってエラーがでた)

計算100は氏久さんみたいなスマートな実装は出来なかったので、とりあえず動くものを。irb全然関係無くなってしまったのはご愛嬌。
tapを使ってみたんだけど、なんだかかゆいところに手が届く感じで気に入りました。

class Hundred
  def initialize(difficulty)
    @difficulty = difficulty
    @correct = 0
    @error   = 0
  end

  def question
    case @difficulty
    when 1
      "%d %s %d = " %
        [rand(10),  [:+, :-, :*].choice, rand(10)].tap {|a, op, b| @ans = a.send(op, b) }
    when 2
      "%d %s %d = " %
        [rand(100),  [:+, :-, :*, :/].choice, rand(100)].tap do |a, op, b|
          unless b == 0 || a < b || a % b != 0
            @ans = a.send(op, b)
          else
            retry
          end
        end
    end
  end

  def answer(ans)
    if ans == @ans
      @correct += 1
      '正解'
    else
      @error += 1
      '不正解'
    end
  end

  def result(start)
    "正解 :#{@correct}\n" +
    "不正解:#{@error}\n" +
    "時間 :#{Time.now - start} sec"
  end

end

if $0 == __FILE__
  puts '計算 100 開始'
  print '難易度を選択してください。1:かんたん 2:むずかしい > '
  difficulty = gets.chomp.to_i
  case difficulty
  when 1
    print '1:かんたんを開始します'
  when 2
    print '2:むずかしいを開始します'
  else
    puts '1か2を選択してください'
    exit 1
  end
  print ' plese enter > '
  gets

  h = Hundred.new difficulty

  start = Time.now
  100.times do |i|
    print h.question
    puts h.answer gets.chomp.to_i
    puts

    if (i+1) % 10 == 0
      puts "#{i+1}問突破"
      puts
    end
  end

  puts h.result start
end