give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

銀座Rails#41で「Rubyプログラミング問題にチャレンジ!公開コードレビュー」という発表をしました #ginzarails

2022年1月25日に開催された銀座Rails#41で『銀座Rails版「Rubyプログラミング問題にチャレンジ!」公開コードレビュー』という発表をしてきました。

ginza-rails.connpass.com

当日使ったスライドはこちらです。


どんな発表だったの?

この発表は事前に募集していたプログラミングのお題を参加者のみなさんに解いてもらい、それを僕がレビューするという発表でした。
この発表で使ったお題は「点字メーカープログラム」です。上のスライドでもこのお題の仕様を説明しています。

github.com

当日は「一番コード量(バイト数)が少ないプログラム」ということで、pofkumaさんのコードをレビューさせてもらいました。

github.com

また、Qiitaのアドベントカレンダーでも同じようにこの「点字メーカープログラム」で自分が書いたコードと解説記事を書いてもらう、という企画をやっていました。

qiita.com

この企画でTop Contributor賞(僕が一番いいと思ったコードを選んだ賞)を取った、はるぐちさんのコードも紹介させてもらいました。

qiita.com

僕の模範解答も紹介しました

さらに、僕が書いた模範解答も紹介&解説しました。今回僕が書いたコードはこんな感じです。

# lib/tenji_maker.rb
require_relative 'tenji'

class TenjiMaker
  def to_tenji(text)
    tenji_list = text.split(' ').map { |romaji| Tenji.new(romaji) }
    join(tenji_list)
  end

  private

  def join(tenji_list)
    tenji_list
      .map { |tenji| tenji.to_s.split("\n") }
      .transpose
      .map { |row| row.join(' ') }
      .join("\n")
  end
end
# lib/tenji.rb
class Tenji
  DAN = {
    'A' => 0b100000, 'I' => 0b101000, 'U' => 0b110000, 'E' => 0b111000, 'O' => 0b011000,
  }

  GYO = {
    'K' => 0b000001, 'S' => 0b000101, 'T' => 0b000110, 'N' => 0b000010,
    'H' => 0b000011, 'M' => 0b000111, 'Y' => 0b010000, 'R' => 0b000100,
  }

  def initialize(romaji)
    @romaji = romaji
  end

  def to_i
    case @romaji.chars
    in ['Y' => gyo, 'A' | 'U' => dan] then GYO[gyo] | (DAN[dan] >> 4)
    in ['Y' => gyo, 'O' => dan]       then GYO[gyo] | (DAN[dan] >> 2)
    in ['W', 'A' => dan]              then DAN[dan] >> 4
    in [gyo, dan]                     then GYO[gyo] | DAN[dan]
    in ['N']                          then 0b000111
    in [dan]                          then DAN[dan]
    end
  end

  def to_s
    sprintf('%06b', to_i).tr('01', '-o').scan(/../).join("\n")
  end
end

僕の模範解答のポイントは以下のとおりです。

  • ローマ字→点字の変換ルールはTenjiクラスにカプセル化した
  • 点字は6ビットの2進数として扱った(ドットの番号は横読みに置き換えた)
  • 母音(段)と子音(行)の各数値をビット演算の論理和で合成した
  • ローマ字を母音と子音に分解する際の条件分岐をパターンマッチで実装した

詳しい話は冒頭に載せたスライドで解説しています。

モブプロならぬ、モブコードレビュー!?

公開コードレビューということで、当日は僕があれこれ意見を述べるだけでなく、Twitter上で参加者のみなさんにも「このコード、好き!」とか「僕だったらこう書くなあ」といった観戦ツイートを積極的に投稿してもらうようにお願いしました。

当日のみなさんのツイートはこちらのページにまとめてあるので、こちらもあわせてご覧ください。

togetter.com

動画もあります

当日の発表の様子はYouTubeで公開しています。当日参加できなかった、という方はこちらの動画をチェックしてみてください。


さらに:提出してもらったコードを全部レビューしてみました

当日は時間が限られていたため、pofkumaさんのコードしかレビューできませんでしたが、後日、他のみなさんのコードもレビューしてみました。
以下のページでみなさんに提出してもらったプルリクエストに僕がコメントを入れています。

github.com

すでにノスタルジー?すごく懐かしい気持ちになった懇親会

本編も興味深い発表がたくさんあったのですが、今回僕にとって一番楽しかったのはもしかすると本編後の懇親会だったかもしれません。

本編と同様、懇親会も当然オンラインだったのですが、他の登壇者のみなさんを中心に「privateメソッドを一段インデントするのはアリ?」とか「メソッドチェーンを書くときは最初に改行する?しない?」みたいな些細なテーマで「あーだこーだ」と延々とおしゃべりしてました。

懇親会を終えた後「そういや、コロナ禍以前はピザか何かを突っつきながらこんなふうに技術ネタを話してたなー。懐かしいなー」という思い出がよみがえってきました。

コロナ禍続きでそんなことをやってたのをずっと忘れてた。ちょっとノスタルジックな気分になった。いつになったらかつての日常は戻ってくるのだろうか・・・みたいなことをふと考えてしまいました。

まとめ

というわけで、このエントリでは銀座Rails#41で発表した『銀座Rails版「Rubyプログラミング問題にチャレンジ!」公開コードレビュー』について、いろいろ書いてみました。

去年はコロナだったり、チェリー本の執筆だったりでほとんど登壇してなかったので、(事前準備がほとんどいらないパネルディスカッションへの参加はいくつかあったものの)きっちりスライドを作り込んでお話しする登壇はかなり久しぶりでした。
そのせいか、発表の仕方やスライドの作り方の「勘」を取り戻すのにちょっと時間がかかりましたが、なんとか無事に終えることができてほっとしました。

当日参加してくださったみなさん、どうもありがとうございました。
ちなみに、イベントページを見ると参加者数が252人になっていて、あまりの多さにビックリしました!
f:id:JunichiIto:20220202110706p:plain:w350

運営の @morimorihoge さんにも感謝します。
おかげさまで当日はオンラインでもスムーズに発表することができました。
どうもありがとうございました。

いつになるかわかりませんが、そのうちまたRSpecやRubyMineの発表でもできたらな〜と思っています。
そういった機会があれば、ぜひみなさん参加してやってください😄

PR:「プロを目指す人のためのRuby入門 改訂2版」を読めば模範解答のコードが全部わかる!

当日の発表でも宣伝しましたが、僕の模範解答は去年発売された「プロを目指す人のためのRuby入門 改訂2版」を読めば、全部理解できる内容になっています。
とくに、僕のコードの中で重要な役割を果たしたパターンマッチについてはかなり詳しく説明しています。

f:id:JunichiIto:20220202112042j:plain

まだ読んでいない方はぜひチェックしてみてください!