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
package com.github.gist.daiksy
/**
* エドウィン・モーガンという現代詩人の作品に
* "message clear"というものがあります.
* http://www.elgin.free-online.co.uk/misc/message.htm
*
* これは,1968年の彼の詩集に含まれている作品で,
* コンピュータが文章を書いたらどうなるか,
* という当時流行した議論をテーマに作られた作品です.
*
* これをScalaで表現してみました.
* hesitationList は和訳すると「ためらいリスト」
* コンピュータのためらいを,このList[List[Int]]によって
* 表現しています.
*
* もう少しエレガントに書ける方法ないかなー,とも思います.
*/
case class MessageClear() {
private val message = "i am the resurrection and the life"
private val hesitationList = List(
List(2,3,31),
List(31,32),
List(0,2,3,27,28),
List(6,7,9,19),
List(6,12,13,17),
List(5,6,7,9,10,22,23,24),
List(6,7,15,16,22,23,24),
List(6,7,9,10),
List(2,20,24),
List(5,6,7,9,28),
List(0,2,3,9,31,32,33),
List(18,20),
List(11,18,19,20,22,23,24),
List(0,24,31,33),
List(2,3,7,9,10,11,15,16,17),
List(2,3,7,9,10,11,15,16,17,18,19,20),
List(19,32),
List(5,6,7,30,31,32,33),
List(19,32),
List(3,7,20),
List(11,12,13,15),
List(5,6,7,24,31,33),
List(0,11),
List(11,15,17,22,23,24),
List(0,2,3,5,6,7,11,12,13,24),
List(2,5,9,10,11,17),
List(19,30,31,32,33),
List(0,2,3,6,7,9,33),
List(0,2,16,17),
List(0,9,12,20),
List(0,3,7,10,17),
List(0,17,31,33),
List(0,11,17,22,23,24),
List(0,2,3,5,6,19,26,27),
List(0,2,3,9,22),
List(0,2,3,5,6,7,11,12,20),
List(0,2,3,5,6,7,11,19,20),
List(0,2,3,5,6,7,10,14,15,16,17,19,20,28,31,32),
List(0,2,3,9,10,20,26),
List(0,2,3,11,22,32,33),
List(0,2,3,11,15,20,26),
List(0,6,7,10,24),
List(0,5,7,11,17),
List(0,9,10,22,24),
List(2,5,6,9,10,22,24),
List(2,11,17,19,20,28),
List(2,5,9,10,22,24),
List(2,5,6,9,19,20,28),
List(0,9,10,11,12,13,14,15,16,17),
List(22,30,31,32,33),
List(0,2,3,18,20,30,31,32,33),
List(0,2,3,9,10,11,12,13,14,15,16,17,18,19,20),
List(0,2,3,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24),
List(0,2,3),
List(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33)
)
private def hisWhisper(outIndex: List[Int]) = {
message.zipWithIndex.map {case (v, i) =>
i match {
case i if outIndex.contains(i) => v
case _ => " "
}
}.mkString + "\n"
}
lazy val write = hesitationList.map(hisWhisper).mkString
}
view raw gistfile1.scala hosted with ❤ by GitHub

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