give IT a try

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

ブログで追体験する西脇.rb & 神戸.rbのRuby開発合宿

はじめに

僕は2013年から西脇.rbというRubyコミュニティを主催しています。
まあ実際は西脇.rb単体で活動することはなくて、Akiさん(@spring_aki)が主催している神戸.rbといつも合同で毎月1回Ruby勉強会を開くのが主な活動です。


前々からコミュニティのメンバーとは「合宿って面白そうだよねえ。いつかやってみたいよねえ」みたいな話をしていたのですが、場所を探したり、あれこれ準備をしたりするのが大変そうでなかなか着手できませんでした。


ところが、今年に入ってから新しいメンバーもどんどん増えコミュニティ的にいい感じに盛り上がってきました。
そこで「よし、じゃあみんなで合宿でも行ってみるか!!」と一念発起して開発合宿を開催することにしました。


というわけで、今回は2014年10月4日(土)と5日(日)の2日間で開催された西脇.rb & 神戸.rbのRuby開発合宿の様子を書いてみます。


f:id:JunichiIto:20141004094659j:plain
Photo by @jnchito


合宿を開催した場所はエオの森 研修センター

合宿を開催したのは兵庫県三木市にあるエオの森 研修センターです。
この研修センターは三木ホースランドパークという大きな公園の中にあります。
緑がたくさんあって、乗馬体験もできます。(このあと乗馬の写真も出てきます)


館内は無線LANが使えて、研修室ではプロジェクタを借りることもできるので、勉強会を開くのにも打ってつけです。
ただし、無線LANはときどきスムーズにつながらないことがあったので、僕はiPhoneのテザリングでネットにつなぐことが多かったです。

f:id:JunichiIto:20141007085156j:plain
Photo by @yuji_shimoda


参加してくれたメンバーはなんと14人!

この合宿にはなんと14人ものメンバーが参加してくれました。
もともとは16人の参加希望者がいたのですが、仕事の都合で来られなくなったメンバーが2人いたので結局14人になりました。
最初は「多くても10人ぐらいかな~」と思っていたので、16名も希望者が出たことにちょっとびっくりしました。


なお、合宿の告知はこれまで西脇.rb & 神戸.rbの勉強会に参加したことがある人に限定して告知しました。
みんなで一緒に泊まるとなると、どんな人か事前にわかっていないと、ちょっと不安になるからです。

合宿のテーマは「長めのもくもく会」

合宿のテーマは簡単に言うと、「長めのもくもく会」です。
基本的には個人個人が作りたいプログラムを2日間かけてじっくり作る、というのが大まかな目標です。


ただし、興味の近いメンバーがいれば一緒にチーム開発してもいいですし、「もくもく会」と言えど、何か質問や相談があれば他のメンバーとわいわい話しても全然構いません。


また、合宿の最後には成果発表会を行い、この合宿で自分が作ったものを披露してもらいます。


合宿1日目

それではここからみなさんにも僕たちの開発合宿を追体験してもらえるよう、時系列順に実施内容を紹介していきます。

10:00~10:30 自己紹介&やること宣言

最初は自己紹介とこの合宿で開発したいプログラムを各人に説明してもらいました。

Raspberry Piで何か作りたいというメンバーや、Ruby-Processingを使って鬼ごっこのアルゴリズムを可視化&シミュレートしたいというメンバーなど、やりたいことは各自様々でした。

f:id:JunichiIto:20141007203458j:plain
Photo by @spring_aki


10:30~12:00 コーディングタイム

自己紹介が終わったら早速コーディングに取りかかります。
興味の近いメンバーが何組かいたので、そういう場合は興味が近い人同士で隣り合うように席を変更しました。

f:id:JunichiIto:20141007093037j:plain
f:id:JunichiIto:20141007085828j:plain
Photo by @yuji_shimoda


12:00~13:00 昼食

お昼になったのでいったん休憩を挟みます。
1日目の昼食はカレーライスでした。

f:id:JunichiIto:20141007203102j:plain
Photo by @pinzolo


13:00~18:00 コーディングタイム

昼食が終わったらコーディング再開です。
いちおう「コーディングタイム」となっているものの、特に行動を縛るわけではなく、自由に散歩してもらったりしても良かったのですが、みんながっつりコードを書いていました。

f:id:JunichiIto:20141007090425j:plain
f:id:JunichiIto:20141007090419j:plain
Photo by @yuji_shimoda


18:00~19:00 夕食

18時からは夕食の時間です。
夕食は館内のレストランでバイキングでした。

f:id:JunichiIto:20141004175702j:plain
Photo by @jnchito


19:00~20:00 買い出し or お風呂

夜に飲みたい人たちは夕食後に近くのコンビニへ買い出しに出かけました。
特に買い出しするものがないメンバーはその時間で先にお風呂に入りました。


ちなみに、近くのコンビニといっても徒歩で行ける距離ではないので、メンバーが乗ってきた車に相乗りして出かけました。

20:00~21:00 中間発表会

1日目の締めくくりとして、現時点での進捗を各メンバーに報告してもらいました。

今回の合宿ではソフトウェアで完結するプログラムだけでなく、Raspberry PiやArduinoといったハードウェアと組み合わせたプログラムを作ろうとしている人もいます。

f:id:JunichiIto:20141008042230j:plain
Photo by @spring_aki


各自が作ったプログラムはそれなりにできあがりつつありますが、まだ完成には至っていないようです。

f:id:JunichiIto:20141004203258j:plain
Photo by @jnchito


21:00~深夜2:00 (?) フリータイム

中間発表会が終わったらあとは自由です。
寝るのもOK、飲むのもOK、はたまた飲みながらコードを書くのもOKです!

f:id:JunichiIto:20141007203746j:plain
Photo by @yuji_shimoda


僕は朝型人間なので22時頃には布団に入ってしまいましたが、中には2時頃までコードを書いていたメンバーもいたみたいです。

ちなみに寝室は最大10人入れる和室を2部屋借りて、7人ずつ分かれて寝ました。

f:id:JunichiIto:20141004210934j:plain
Photo by @jnchito


合宿2日目

つづいて合宿の後半戦、2日目の様子をご紹介します。

6:00 (?) ~7:30 フリータイム

朝食は7:30からだったので、それまでは自由です。
僕は6時前に起きて、館内の図書スペースでコードを書いていました。
コードを書いていると他のメンバーも何人かやってきて、一緒にコードを書いていました。

f:id:JunichiIto:20141005065033j:plain
Photo by @jnchito


また、朝の散歩に出かけるメンバーもいました。
公園内はかなり広いので、かなり良い散歩コースになったみたいです。

f:id:JunichiIto:20141008042504j:plain
Photo by @pinzolo


7:30~8:30 食事&部屋の片付け

7:30から朝食を食べました。
朝食が終わったら、みんなで部屋の片付けをしました。

f:id:JunichiIto:20141007203136j:plain
Photo by @pinzolo


8:30~11:00 コーディングタイム or 乗馬タイム

8:30から昨日と同じようにコーディングを再開します。

f:id:JunichiIto:20141005085224j:plain
Photo by @jnchito


ただし、一部のメンバーは乗馬の予約をしていたので、9時過ぎから乗馬センターに移動して乗馬を楽しんでいました。
乗馬していたメンバーはもちろん馬の上でもコードを書いて・・・いるはずはありません(笑)。

f:id:JunichiIto:20141007091416j:plain
f:id:JunichiIto:20141007091401j:plain
Photo by @yuji_shimoda


11:00~13:00 バーベキュー大会

11時からは昼食のバーベキューを始めました。

バーベキューの材料は僕の妻に車で運んできてもらいました。
14人分の買い出しや野菜のカットなどもやってもらったので、とても大変だったと思います。
妻はこの合宿の影の功労者です。どうもありがとう!!


おかげでバーベキュー大会は非常に盛り上がりました。
野外でわーわー言いながら肉や野菜を焼くのはとても楽しかったです。

f:id:JunichiIto:20141005110807j:plain
f:id:JunichiIto:20141005112123j:plain
Photo by @jnchito


13:00~16:00 ラストのコーディングタイム

バーベキューが終わったら、またまたコーディングの時間です。

コーディングの時間はいよいよこれでおしまいです。
このあとの成果発表会に向けて、みんなラストスパートをかけます。

うまくいかないところがあれば、他のメンバーに相談したりして解決していきます。

f:id:JunichiIto:20141005140808j:plain
Photo by @jnchito


16:00~17:00 成果発表会

16時でコーディングタイムは終了です。
ここからはこの2日間の開発の成果を発表していきます。


もともとは成果発表会とコードレビューをセットにして、もっと時間を使う予定だったのですが、「もっとコードを書きたい!!」というメンバーが多かったので、コーディングの時間を増やしました。
代わりにコードレビューの時間を削り、基本的に自分の作ったプログラムの動きを見てもらうだけの時間にしました。


毎月やってる普通のもくもく会だと、時間がなくて非常に限られた部分しか作れなかったりしますが(ログイン画面だけとか)、さすがに丸2日あるとプログラムとして全体的な形が見える(データの登録や表示など、一通りの操作ができる)ものが多かったです。

f:id:JunichiIto:20141005162138j:plain
Photo by @jnchito


17:00~17:30 片付け&解散

楽しかった開発合宿もこれにて終了です。
研修室を元通りに片付けて、研修センターをあとにしました。
あっという間の2日間でした。

f:id:JunichiIto:20141007092449j:plain
Photo by @yuji_shimoda


合宿でかかった費用

合宿でかかった費用は宿泊代、研修室代、食事代を合わせて一人9500円でした。
意外とリーズナブルだと思ってるんですが、いかがでしょうか?


なお、お酒を飲む人は各自で別途購入してもらっています。
また、乗馬代も利用したメンバーだけで別途支払っています。

僕が作ったプログラム

ところで、この合宿で僕が作ったのはDossier(ドシエ)というgemをもっと便利に使うためのサンプルプログラムです。


DossierはRails上でSQLから簡単にレポートを作成できるgemです。
凝った集計レポートの作成はSQLの得意分野なので、ActiveRecordよりもSQLで直接書いてしまった方が速いです。
Dossierを使うとSQLの実行結果をそのまま画面に表示できたり、CSVに出力したりできます。
また、パラメータを追加してwhere句の条件を動的に変更したりすることもできます。


このようにSQLが得意な人にとってDossierはとても便利なgemなのですが、レポートごとにRubyのクラスを定義しなければいけないのが難点です。
レポートを追加したり、SQLを変更したりするたびにソースコードを変更しなければいけません。

# Dossierを使ってレポートを定義するコードの例
class UserBirthYearDistributionReport < Dossier::Report
  def sql
    <<-SQL
SELECT Strftime('%Y', birthday) AS birth_year, 
       Count(*) AS user_count 
FROM   users 
WHERE  annual_income > :annual_income_greater_than 
GROUP  BY birth_year 
ORDER  BY birth_year 
    SQL
  end

  def annual_income_greater_than
    options[:annual_income_greater_than].to_i
  end
end


そこで、レポートのSQLやパラメータをクラスの中で定義するのではなく、データベースに保存してレポートを簡単にCRUDできるようにしたいと思いました。
これが今回作ったサンプルプログラムの開発の動機です。


サンプルプログラムの動きはこんな感じ

最終的にはgemにして簡単に使えるようにしたいのですが、とりあえず今回は技術調査用にサンプルプログラムを開発してみました。


下の例ではユーザーの生まれた年ごとにユーザー数をカウントするレポートを作成しています。
さらに年収を検索条件として指定できるようにしています。

f:id:JunichiIto:20141008044736p:plain:w400

f:id:JunichiIto:20141008044844p:plain:w400


このように気軽にレポートを追加したり変更したりすることができれば、サイト運営者なら誰でも知りたがる月ごとの売上や新規ユーザー数の変化をサクサクとレポート化することができるはずです。


なお、今回作成したサンプルプログラムのソースコードはGitHubに置いています。
気になる方は参考にしてみてください。

GitHub - JunichiIto/dynamic-dossier-sandbox: A sandbox Rails application for Dissier gem.


合宿中の進捗や今後の展望など

1日目はDossierのコードリーディングでほとんど終わってしまい、サンプルプログラムを書き始めたのは2日目からでした。
見た目はScaffold丸出しな感じでちょっとイケてないですが、一応SQLやパラメータをCRUDして動的にレポートを作れるようにはなりました。


実はこの「簡単にレポートがCRUDできるプログラム」は前職で使っていたWindowsアプリケーションをお手本にしています。
そのアプリケーションは内製ツールだったのでもう触ることができないのですが、かなり便利だったので同じようなアプリケーションを作ってみたいな~とは前々から考えていました。


今後のもくもく会や空いた時間でこのプログラムをどんどん発展していけたらと思っています。

まとめ

というわけで今回は西脇.rb & 神戸.rbで初めて開催したRuby開発合宿の様子を紹介してみました。


毎月やっている普段の勉強会もそれはそれで楽しいのですが、合宿はそれ以上に楽しかったです。
メンバーがたくさんいたので、コーディングの最中にも質疑応答が活発に発生していい感じでした。
やりたいことにじっくり取り組めるという時間も最近あまりなかったので、個人的にも貴重な2日間となりました。


また、乗馬やバーベキューなど、ちょっと特別なイベントを挟むと、「非日常感」がより高まってテンションが上がります。
参加したメンバーもみんな楽しそうにしていたので、開催して良かったな~と思いました。
スムーズな合宿運営に協力してくれた西脇.rb & 神戸.rbのメンバーにも本当に感謝です。
今後も年一回ぐらいはこういう合宿を開催したいですね。


勉強会を主催している方で合宿はまだやったことがないという方は、一度やってみるときっと面白いはずです。
段取りや準備はちょっと大変ですが、同じ興味を持ったメンバーで合宿を開催するととても楽しいので、ぜひ参考にしてみてください!


f:id:JunichiIto:20141007095348j:plain


西脇.rb & 神戸.rbについて

西脇.rb & 神戸.rbは西脇~神戸近辺で活動するRubyコミュニティです。
毎月1回ぐらいのペースで、Rubyに関する勉強会を開いています。
参加者全員が自分の手と頭を使ってコードを書き、それをみんなでレビューする、というのを勉強会の基本スタイルとしています。


Ruby初心者の方や初めて参加する方でも大歓迎ですので、興味のある方は気軽に参加してください。
Doorkeeperのコミュニティページでメンバー登録してもらうと、勉強会の開催通知を受け取ることができます。

西脇.rb&神戸.rb | Doorkeeper
f:id:JunichiIto:20141007095904p:plain


また、西脇.rb & 神戸.rbのFacebookページもあります。
「いいね!」してもらうと、コミュニティに関する最新情報をキャッチすることができます。

西脇.rb&神戸.rb | Facebook
f:id:JunichiIto:20141007100219p:plain


あわせて読みたい

最近の活動内容をまとめたり、1年間勉強会をやって感じたことなどをまとめたエントリです。
興味のある方はこちらもどうぞ。