ゆるふわ.rb の第1回目を開催しました

ゆるふわ.rb の第1回目を開催しました。
ゆるふわ.rb in 大洲 〜新鮮な刺身と共に〜 - ゆるふわ.rb | Doorkeeper

ゆるふわ.rb というのは私が発起人となった四国初のRubyコミュニティです。
その名の通り、ゆる〜くRubyについて語り合う場としたいという想いで立ち上げました。
あとはプログラミングの原点である「プログラムしたものが動くって楽しい♪」ということを実感出来る場にしたいとも思っています。
今後もそういう方向性でやっていこうと思っていますので、興味がある方は都合の合う時に訪れてみてください。

それではここからは当日のお話を。

会場は調理室

実は今回の勉強会は調理室で実施しました。
刺身を捌きたいからというのもあったんですが、調理室でやるのって前例もなさそうだし面白いかも?というノリでそうしました。
参加者のみなさんにはもちろん黙ってたんですが、入ってくるなり「調理室で勉強会って新しいねw」という反応を頂いて掴みはOKって感じでした。
学生時代の調理実習みたいで面白かったですよ。

微妙に名前が間違ってましたがw(正しくは「ゆるふわ.rb」です!><)

ウェルカムドリンクと自己紹介

まずはみなさんが和むようにウェルカムドリンクを用意しました。
ウェルカムドリンクと言ってもお酒ではなくみそ汁ですけどw

みそ汁を飲んでぽかぽかしながら参加者のみなさんに自己紹介頂きました。
とりあえずバリバリのRubyマスターはいなくてホッとしました。(私自身Ruby歴は浅いのでいきなり達人が現れたらどうしようかとビビってましたw)
そんな感じでゆるりとスタートしました。

たった100行のGUIプログラムをひも解く

次はShoes(Shoes! The easiest little GUI toolkit, for Ruby.)というGUIツールキットを利用して書かれた100行のタイピングゲームについて語り合いました。
はじめに作成者の私が全体構成やらなんやらプログラムについて説明し、以降はコードを見てもらったり動かしてみてもらったり参加者のみなさんに自由にいじってもらいました。

プログラムはこんな感じです。(githubにもあげてます。GitHub - yurufuwarb/typing

# -*- coding: utf-8 -*-
require 'csv'

#----------------------------------------
# タイピング定義
#----------------------------------------
definitions_ja = []
definitions_roma = []

CSV.foreach('definitions.csv') do |row|
  definitions_ja << row[0]
  definitions_roma << row[1]
end

#----------------------------------------
# タイピング
#----------------------------------------
TITLE = "たった100行のタイピングゲーム"
Shoes.app(title: TITLE, width: 900,resizable: false) do
  background white

  # ランダムに円を描く
  fill rgb(0, 0.6, 0.9, 0.1)
  stroke rgb(0, 0.6, 0.9)
  strokewidth 0.25
  140.times do
    oval( left:   (-5..self.width).rand,
          top:    (-5..self.height).rand,
          radius: (25..50).rand)
  end

  # 入力フィールド
  @line = edit_line(width: 0, height: 0)

  # ゲーム開始確認
  exit if !confirm('Are you ready?')

  # 正解タイプ数、ミスタイプ数
  good = 0
  mistake = 0

  stack :margin => 0.1 do
    background white
    @line.focus
    index = Random.rand definitions_ja.length

    stack :margin => 12 do
      ja = subtitle(strong(definitions_ja[index]),:font => "MS Gothic")
      roma = tagline(definitions_roma[index], :font =>"Arial Black")

      @line.change do |input|
        if input.text.downcase == roma.text[0].downcase
          good += 1
          roma.text = roma.text[1..roma.text.length]
        else
          mistake += 1
        end

        input.text = ""

        if roma.text.length == 0
          index = Random.rand definitions_ja.length
          ja.text = definitions_ja[index]
          roma.text = definitions_roma[index]
        end
      end
    end
  end

  stack :margin => 0.1 do
    caption(strong("制限時間"),:font => "MS Gothic")
    p = progress :width => 1.0
    a = animate(5) do |i|
      p.fraction = (i % 100) / 100.0
      next if i < 100

      # アニメーション終了
      a.stop

      # タイピング結果画面
      dialog(title: TITLE, width: 500, resizable: false) do
        background white

        # ランダムに円を描く
        fill rgb(0, 0.6, 0.9, 0.1)
        stroke rgb(0, 0.6, 0.9)
        strokewidth 0.25
        60.times do
          oval( left:   (-5..self.width).rand,
                top:    (-5..self.height).rand,
                radius: (25..50).rand)
        end

        stack :margin => 0.1 do
          score = good * 3
          ratio = (good.to_f / (good + mistake).to_f) * 100
          rank = "C"
          if score >= 360 && ratio >= 99.5
            rank = "SS"
          elsif score >= 330 && ratio >= 98
            rank = "S"
          elsif score >= 300 && ratio >= 96.5
            rank = "A"
          elsif score >= 270 && ratio >= 94
            rank = "B"
          end

          subtitle(strong("得点        :#{score}"),:font => "MS Gothic")
          subtitle(strong("ランク      :#{rank}"),:font => "MS Gothic")
          subtitle(strong("正解タイプ数:#{good}"),:font => "MS Gothic")
          subtitle(strong("ミスタイプ数:#{mistake}"),:font => "MS Gothic")
          subtitle(strong("正解率      :#{ratio.round(1)}"),:font => "MS Gothic")
        end

        stack :margin_left => '30%' do
          button "おしまい" do
            exit
          end
        end

      end   # dialog(...) do
    end     # animate(...) do
  end
end

今回初めてShoesを触ったんですが、すごく手軽に&直感的にプログラム出来て感触が良かったです。

えっ?刺身でビアバッシュ??

次はメインの(?)ビアバッシュ、鯛とカンパチをつまみにビール・日本酒を頂きました。
(私はここで飲み過ぎたようで翌日の昼過ぎまで身動きが取れない状態となってしまいました・・・)

そして私が旗ふりすることなくいつの間にか始まった Ruby Warrior (Ruby Warrior - Popular Free Ruby Programming Tutorial Game)、気が付いたらペアプロっぽくなっていました。
ちなみにコーディングしている人はシラフ、教えている人は酔っぱらいですw


チェックアウト

最後にみんなで片付けをして、来たときよりも美しく!して撤収しました。

今回は手作り感満載の第1回目でしたが、楽しい場としたいという私の想いは実現出来たかなと思っています。
参加して頂いたみなさんにも嬉しいご意見をたくさん頂きました。
これからも構えないで参加出来るゆるい勉強会、プログラミングの楽しさを実感出来る勉強会を目指してやっていきたいと思います。