ちなみに

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

Ruby/Rails勉強会@関西

日本Rubyの会 公式Wiki - 第23回 Ruby/Rails勉強会@関西

Ruby関西主催の23回目の勉強会に行ってきました。今回初参加。

内容は

  • Ruby1.9 の仕様 − Array 関連の新しい機能 by こなみ さん
  • 純粋関数型言語Ruby(3) 30分でわかるMonad by 氏久(ujihisa)さん
  • Rails以外のWebアプリケーションフレームワーク」 by yhara さん
  • Rubyのリフレクション by 大林さん
  • Ruby初級者向けレッスン第17回 by okkezさん

こなみ先生の1.9の紹介で頭をあっためたあと、氏久さんのモナド、yharaさんのゴルフ(印象が強烈すぎたのであえてここ)、大林さんの黒魔術と非常に濃い内容が続いたためになかなか体力を消費しました。といっても、これはペースランニングのあとの1Kmタイムトライアルてきな消費ではなく、試合の前日の最終調整の軽いジョギングてきな心地の良い、そしてすこし興奮のまじった消耗でした。(この間、ほとんど口を開いていないので体力が温存されていた疑惑もあり。)

席移動をしてグループに分かれた後、初級者レッスンだったのですが、簡単そうにみえる課題がなかなかの強敵で、分かったフリをしていた僕には戒めになりました。結局2番ができず。

一応帰ってからしっかり考え直したので掲載しておきます。添削なんかしていただけたら控えめに飛び上がって喜びます。

1番

head  = "  |  " + (1..9).to_a.join('  ')
head += "\n--|" + "-" * (head.length - 3)

puts (1..9).inject(head) {|r, y|
  r + (1..9).inject("\n #{y}|") {|rr, x|
    rr + sprintf("%3d", x * y)
  }
}

injectで表を作ってしまってから表示する戦略。

2番

考え中。イテレータと全く関係ない部分でつまっているというおかしな状況に。
0から9をランダムに配置、しかもだぶらずという命題がクリアできないでいます。
ランダムじゃない問題の表示は出来ているのでそこさえクリアすれば・・・。
難しく考え過ぎなのだと思うので、もう一度冷静になって考え直してみます。

(追記)

id:rochefoltさんのコードみてソートするという概念を思い出しました。恥ずかしすぎる。

class Hmasu
  def initialize
    @op     = [:+, :-, :*, :/].at rand(4)
    shuffle = lambda { (0..9).to_a.sort_by { rand }}
    @row    = shuffle.call
    @fil    = shuffle.call
    @head   = "#{@op} |  " + @row.join('  ') + "\n--|" + "---" * @row.length
  end 

  def make_question
    puts @fil.inject(@head) {|r, v|
      r + "\n#{v} |" + (block_given? ? yield(v) : '') 
    }   
  end 

  def disp
    make_question
    puts
    make_question do |v| 
      @row.map {|i|
        sprintf("%3d", @op == :/ && i.zero? ? 0 : v.send(@op, i)) 
      }.join
    end 
  end 
end

Hmasu.new.disp

3番

file = "rgb.txt"
list = []
File.open(file, "rb") {|f|
  f.map {|l| l.split unless /\A!/ =~ l }.compact.each do |i|
    r, g, b, name = i.shift, i.shift, i.shift, i.join(' ')
    color = sprintf("#%02x%02x%02x", r, g, b)
    list << "    <span style=\"background-color:#{color};\">#{name}</span>"
  end
} 

puts <<EOS
<html>
  <head>
    <title>Color chart</title>
    <style type="text/css">
      span {
        width   : 200px;
        height  : 50px;
        margin  : 1px;
        float   : left;
      }
    </style>
  </head>
  <body>
#{list.join("\n")}
  </body>
</html>
EOS

ファイルの中身が決まっていると仮定して、1行目を飛ばして読むことに、方法はいろいろあると思うのですが、今回は正規表現で。
2行目以降の形式も固定だと考えているので、空白で分割したものをmapで集めて、それをeachでまわしながら、色の名前と16進数での値を取得しています。名前が空白で別れているので扱いをどうしようかとこなみ先生と話していたのですが、RGB値をshiftで取り出してしまってからjoinでつなぐ方式を取りました。
HTMLはインデントとかにはこだわったものの、かなり適当なので色によっては名前みえません。この辺はこだわりだすと歯止めが利かない性格なのでこのあたりで打ち止めに。
HTML部分の方が長いのがたまにきず。

まとめ

運営陣、講師、参加者の皆さんお疲れましたでした。
基礎知識から黒魔術まで幅広い知識を得る事が出来てとても良かったです。
凄い人たちの話を聞けるのはもちろんですが、同じようなレベルの方たちと一緒に課題をこなすことで良い意味でのライバル心的なものを感じ、それがむちゃくちゃ良い刺激でした。(じゃあもっと会話しろって話ですが。
懇親会に行けなかったのが残念ですが、次回はかならず参加したいと思います。
もちろん勉強会にも参加して、いづれ講師側(TAからかな)にまわれるように、しばらくは皆さんから吸収できるものは、どんどん吸収させてもらいます。
とりあえずは、2番がんばります。