2012年6月17日日曜日

エンジニアライフのオフ会に行ってきたはなし


木曜日から会社の研修で東京に行ってきた。

研修後、そのまま滞在してエンジニアライフのオフ会に参加。
一昨年の9月にぼくがライトニングトークデビューを果たしたイベントで、今回で3回目の参加である。

旧知の人や新しい人など、いろいろな人とお話したが、やっぱりこのイベントが自分の原点かもなーと思う。


一昨年の7月に、エンジニアとしての自分のキャリアに漠然とした閉塞感を感じ、それを打開したいと思ってエンジニアライフのコラムニストになった。

その年の9月にイベントに参加し、いろんな人と出会った。その時に出会った人たちは、今でも付き合いの続く大切な友人だちだ。

その後、いろんな勉強会に参加して、いろんな人たちと出会ったけれど、やっぱりあの日エンジニアライフで出会った友人たちとの出会いが原点だなーと思う。

あれから2年弱ほど経って、自分も含めて多くの人が当時とは違う生活をしている。
会社が変わったり、住む場所が変わったり、結婚したり。

みんなの新しいチャレンジに刺激を受けて、ぼくも今はあのときと違う会社で仕事をしている。

一昨年の9月に、あのイベントに参加していなかったら、間違いなくぼくはこの場所にいないと思う。
Excel方眼紙と向きあう日々に嫌気がさしていたあの頃のぼくから2年弱経って、LTで「ソーシャルゲームの開発やってます」と自己紹介してる日がくるなんて想像もしてなかった。

なんだか不思議な縁だなぁと思う。おもしろい人生だなぁと思う。

これからもみんな、頑張っていこうぜ。

2012年6月10日日曜日

プログラム言語で詩を書くという試み.

ある本を読んでいて、エドウィン・モーガンという詩人と出会った。

グラスゴー大学で英文学を教えるかたわら、創作活動をした人物で、実験的な詩も多く残している。

その作品群の中に、"Message clear"という作品がある。
http://www.elgin.free-online.co.uk/misc/message.htm

1968年出版の詩集に含まれ、「コンピュータが文章を書いたらどうなるか」という当時流行した議論をテーマに書かれている。

この作品で人格を与えられたコンピュータが最終的に伝えたい言葉は、

"i am the resurrection and the life"

「ヨハネによる福音書」11章25節でつづられる「わたしは復活であり、命である」という言葉である。

この大変面白い詩にインスピレーションを受け、この詩をプログラム言語で表現してみたいと考えた。

しかし、プログラムは、モーガンの書いた「言葉にできずに迷う人格」を表現することはできない。なぜなら、プログラムは、コンピュータを決定論的に動作させるために用いられる言語だからである。

まぁ、それはそうなのだけれど、プログラム言語でその世界をなんとか表現しようと試みてみた。

"i am the resurrection and the life"という文字列のそれぞれの文字のインデックスに対して、どの文字を出力するか。その数列を、コンピュータの迷いの表現に見立てて書いてみた。

それがこれ。
https://gist.github.com/2900182

まぁ。なんとなくそれっぽくなったんじゃないだろうか。

2012年5月13日日曜日

大都会岡山にLTしにきた〜 オープンセミナー岡山@2012

勉強会界隈の情報をウォッチしていると、大都会岡山が熱いらしい。懇親会ではスタジアムみたいなところでLTやったり、なんか楽しそうな噂を耳にした。 で、岡山の勉強会に遊びに行きたいとTwitterでつぶやいたら、@razon さんが OSO2012というイベントを教えてくれた。 http://kokucheese.com/event/index/26302/

和田さんや小飼さんが来られるのか! そしてその人たちにLT見てもらえるのか!! これはもう行くしかないだろ!! と、光の速さで懇親会LTと共に参加を申し込んだ。
岡山クラスタの方は何人か変態アドベントカレンダー に寄稿していただいたりもしたので、一度お会いしたかったし。

和田さんには今までお会いしたことは無かったのだけど、きのこ本を読んで自分も108番目のきのこを書きたい、と思い、ブログを書いたことがある。
http://daiksy.blogspot.jp/2010/12/108.html
このエントリは和田さんにも読んでいただいたらしく、そのご縁でTwitterでフォローしてもらったりしていたので、是非きのこ本にサインをいただきたいと思っていた。

そんなこんなで@irofさんと一緒に@Posauneさんの車に乗せていただき、岡山までやってきた!!

渋滞があって、少し遅れてしまったのだけど、受付で岡山クラスタの方たちとご挨拶。
「粕谷です。Twitterでお世話になってます^^」
「あー。変態アドベントカレンダー創始者だ!!」
「ええ、そうです ///」
「ぼく、Twitterで筆頭変態と呼ばれている者です(笑」
「おお!あの!!!」
という謎の自己紹介を繰り広げ、はやくもテンションが上がる。

会場は岡山県立大学。広い階段上の教室で、学生時代を思い出す。

発表はどれもすごく面白く、岡山のITエンジニアたちの熱さを感じた。
スタッフさんの運営も見事だし、どの発表もクオリティ高いし、すごくいい勉強会だと思う。

個人的にはKinectが面白かった。長らく使っていないWindowsを起動させるときが来たか。。。

休憩時間のサイン会で、和田さんと小飼さんに念願のサインをいただいた。
来て良かった。。。。。本当に。。。。

関西に住んでいて、和田さんと小飼さんの講演を一度に聴ける機会はめったにないので、すごく贅沢な時間を過ごすことができた。

本編終了後は、噂の懇親会である。
会場が元映画館を改造した居酒屋だそうで、スクリーンに向かって階段上に座席が並んでいる座・スタジアムという会場。

ぼくもそこでLTを披露した。わりとウケたけれど、司会の方から「少し笑い要素が少なめでしたね」という手痛い批評。もう一回リベンジしに来る!!!

懇親会では、エンジニアライフのコラムニスト仲間であるひでみさんの会社の社長さんがお越しになっていて、挨拶してくださった。業界狭いなー。

それにしても、初の岡山勉強会はめちゃくちゃ楽しかった。
熱くて、ユーモラスで、楽しくて、すごく雰囲気の良いコミュニティで、全然アウェイな感じが無いステキな勉強会だった。

また遊びに来るお!

2012年5月4日金曜日

メソッドチェーンなクラスをScalaで書いたらこうなった。

Play2.0でATNDをゴニョゴニョするアプリを作ろうと思い、コードを書いていた。

まず手始めに、ATND APIを叩くためのクラスを作っていたのだが、いかんせんパラメータが多い。
検索の関数が大量の引数を受け取るというのはあまりにも不細工だ。

そこでふと、Effective Javaの第2章 項目2 を思い出した。

メソッドチェーンな感じでパラメータを受け取ればいいんだなと。

で、書いてみた。


なるほど。できた。
しかし、ミュータブルな変数多すぎ。。。。

Twitterでいろいろ悩んでいると、こんなアドバイスが。



なるほど。
http://blog.rafaelferreira.net/2008/07/type-safe-builder-pattern-in-scala.html
を参考に書きなおしてみる。

https://gist.github.com/2585850

パラメータをセットする関数が、必要なパラメータのみを書き換えた自身のクラスの新しいインスタンスを返すので、ミュータブルな変数がいらないということか。
うーん。でも、なんか微妙。。。



なるほど! case classのcopyメソッドか! で。書きなおしてみる。

https://gist.github.com/2586213

ちょびっとスッキリした。

2012年4月30日月曜日

鹿駆動勉強会とはなんだったのか

プログラマーズナイトからその流れで鹿駆動勉強会というハードな二日間が終了しました。
blogを書くまでが勉強会なので、まとめておこうと思います。

■プログラマーズナイト #3


http://atnd.org/events/27094

プログラマーが集まって、DJとかLTとか夜通し騒ぐ、というイベント。
なんかもう、とにかくやばかったです。

ぼくもテキーラ・レッドブル飲みながらJoJo LTしてきました。
http://www.slideshare.net/daiksy/jojo-8930790
あのネタをやるのはこれで3回目なのですが、今回も好評で、完全にぼくの持ちネタです。

初演を見て下さった人から、コピペ開発はよくないよという主旨にもかかわらず、スライドをコピペしてるじゃねーか、という辛辣なツッコミをいただきましたw

■そして鹿駆動


同僚の家で仮眠をとらせてもらい、奈良へ鹿駆動勉強会に参加しに行きました。
こちらはスタッフとしての参加です。
ATND: http://atnd.org/events/24587
告知記事: http://el.jibun.atmarkit.co.jp/topics/2012/04/post-8fd1.html

当初は完全に勢いだけのスタートでした。
参考「Togetter:奈良で勉強会しようず」http://togetter.com/li/244813
ただ、同じ方向を向いてる仲間が何人かいて、みんなが本気を出せばこんな勢いだけの企画も成立してしまうんですね。

結果100人を超える参加希望者と、20人のスピーカーと、奈良の能楽ホールというあり得ない勉強会が実現してしまいました。

ぼくたちはITのプロとして仕事をしています。数人から数十人のチームを組んで、要望を具体化し、手順を経てコンピュータソフトウェアという成果物を作り出します。

今回の鹿駆動では、当初の思いつきから実現にいたるまで、いろいろなことがありました。
当初は思いつきで、10人くらいで奈良で勉強会をしたいといういつもの仲間うちの勉強会のノリでした。
そこへ、能楽ホールというエッセンスが加わり、能楽ホールでなら発表してみたいというスピーカーが集まり、次第に形を変えて規模も大きくなりました。
時間が経つごとに状況が変わり、ぼくたちスタッフも何度か打ち合わせをして、その変化する状況に対応しながらコツコツと実現へのステップを組み立てて行きました。

これらのプロセスは、ITのプロとしての経験があってこそやり切れたという側面はあると思います。

そして何より感謝したいのは、IT勉強会はほんとうにすべての参加者の善意で成り立っているということです。

スピーカー、参加者、スタッフ。彼ら全員が「面白そうだからやってみよう」「楽しそうだから行ってみよう」というモチベーションで少しずつの善意を持ち寄って、ここまで大きな企画が実現したのです。

企業スポンサーがついたわけでもない、個人の善意の集まりだけで、鹿駆動勉強会みたいな企画が実現できてしまうITという業界をぼくは誇りに思います。



懇親会もすごく盛り上がったし、すごい勉強会でした。
みなさん、本当にありがとうございました。

「Togetter:鹿駆動勉強会」http://togetter.com/li/295148

ニコニコ超会議の裏でTitterトレンドに#shikadrivenが上がるとかありえないだろJK

■もうひとつの奇跡


今回の鹿駆動勉強会は、遠方からお越しの方がたくさんおられました。
その中のお一人から、とてもステキなフィードバックをもらいました。

去年、東京カルチャーカルチャーでITコミュニティ夏祭りというイベントを開催しました。
http://daiksy.blogspot.jp/2011/09/it.html

このイベントをきっかけに勉強会に参加するようになり、その流れで鹿駆動に遊びに来た、という人がいらしたのです。

小さなことですが、自分たちの活動が他の人になにかしらの影響与えているのだなー、と幸せな気持ちになれた出来事でした。

2012年4月17日火曜日

【Scala】コンストラクタ実装したtraitをobjectにmixinしたらなるほど、こうなるよな、という話

あるリクエストを受け取ったときに、ユーザに関連する情報を一括で削除したい、という要件があった。

対象のテーブルがたくさんあったので、いちいちhoge.deleteみたいな記述を羅列するのは避けたい。削除対象テーブルは今後の開発で余裕で増えるだろうし。

で、こんなコードを書いてみた。

    object CleanerContainer {
        import scala.collection.mutable.ListBuffer
        private val list: ListBuffer[Cleaner] = new ListBuffer[Cleaner]

        def append(cleaner: Cleaner) = this.list.append(cleaner) 

        def execute(userId: String): Unit = list.foreach(_.clean(userId))
    }

    /**
    * コンストラクタで自分自身をCleanerContainer に追加するので、
    * これをmixinするだけでCleanerContainer.executeの処理対象になるはず。
    */
    trait Cleaner {
        CleanerContainer.append(this)

        def clean(userId: String): Unit
     }

     /** DBのCRUDを実装したmodelのコンパニオンオブジェクトと仮定  */
     object hogeModel extends Cleaner {
         override def clean(userId: String) = {
             hoge.delete(userId)
         }
         // (以下の実装は省略)
     }

CleanContainerは、一括削除の対象となるmodelをListで保有し、executeでそれらのcleanメソッドをまとめて実行する。

CRUDを実装しているmodelのコンパニオンオブジェクトが、Cleanerというtraitをmixinすることで、Cleanerのコンストラクタで自分自身をCleanContainerに追加しているから、hogeModelのようにclean関数に自信の対象レコードを削除する処理を記述すれば、CleanContainer.executeを任意のタイミングで実行することで、対象のデータを一括で削除できるはず!!!

で、意気揚々と実行してみたが、全然データが消えない。

…あ! objectにmixinしたtraitのコンストラクタ実装って、objectが最初に呼ばれたタイミングでないと実行されないじゃん!! シングルトンオブジェクトなんだからそりゃそうじゃん!!!

てっきりobjectってアプリケーションが起動したタイミングでオブジェクトが生成されるものだと勘違いしていたという、失敗談でした……。

2012年3月29日木曜日

play2.0でtwitter4jを使ってdaiksyプラグインを作ってみた.

play2.0でプラグインを作って遊ぼうと思いたち、とりあえず自分のユーザタイムラインを取得する誰得プラグインを作ってみた。

twitter4jを使ったのだが、もっといろいろ詰まると思ったらすごく簡単にできたので、とりあえずまとめておく。

play2.0でプロジェクトを作る。
https://github.com/playframework/Play20/wiki/Anatomy によるとアンマネージなjarとかはlibに置くんだよ、と書いてあったので、libディレクトリを作ってtwitter4j-coreをそこに置く。

コンソールでeclipsifyしたら、参照ライブラリに追加された!



ちなみに今回書いたコードはこちら。

さて。何して遊ぼうかなー。