2012年4月30日 (月)

超エンジニアミーティング(ニコニコ超会議)でビデオ出演しました

4/28(土)4/29(日)幕張メッセで開催された「ニコニコ超会議」のサブイベント「超エンジニアミーティング」の「エンジニア100連発」企画にて、ビデオ出演させていただきました。そのときの録画をニコニコ動画にアップロードしましたので、お知らせします。

過去の私の作品の中から「ニコニコ」にちなんだ「顔文字」系プログラミングの話をピックアップしていくつか紹介させていただきました。元の依頼が、完成度・すでに発表済みであるかどうかなどを問わず、自由な発想の元に作られた作品をテンポよくプレゼンし、聴衆の「今すぐ何かを作りたい!」という創作意欲を掻き立てるようなデモに下さい、という依頼でしたので、そのような構成で引き受けました。

いろいろ過去に発表しているネタとほとんどかぶっているので、私のプレゼンを見ている人にとって新鮮味はないかと思いますが、部屋で淡々と一人で解説している貴重な動画ですので、お楽しみいただければと思います。音声にノイズが混じっていてすみません。収録したのがノートパソコン付属のマイクで、しかも夜中の一人部屋の中だったので、少しテンションが低めになっています。テンションが低いことを予めご了承いただければと思います。

ニコニコ超会議「超エンジニアミーティング」ビデオ出演で申し訳ありません。現在、私はどこで何をしているかと言うと、長野県の標高650mの(東京スカイツリーより若干高い)宿舎で洗濯を干しています

「ニコニコ超会議」は「ニコニコ動画のすべて(だいたい)を地上に再現する」をコンセプトとして開催されたニコニコ動画のあらゆるジャンルを網羅したフェスイベントということで、私も参加したかったのですが、あいにくこの時期は長野県に滞在していたため、現地での参加は見送り、ビデオ出演(録画放送)での登壇となりました。

当日、登壇者用の机はこんな感じだったらしいですw
登壇者用の机

他の登壇者の皆さんも面白い発表をされていたようで、現地に参加できず残念でした。

エンジニア100連発

次回もしもこのような機会がまたあるとすれば今度は新ネタ盛りだくさんで現地に行きたいと思います。貴重な機会をありがとうございました。

【参考記事】

  1. 「超エンジニアミーティング」 in ニコニコ超会議を全部取材してみた
  2. 超エンジニアミーティング in ニコニコ超会議 #cho_engmtg - Togetter

2012年4月12日 (木)

昨年に引き続きサイボウズ・ラボユース第2期生を募集

本日2012年4月12日(木)より、サイボウズ・ラボユース第2期生の募集を開始しました。

Cybozupr20120412

2011年より開始した第1期の試みが好評でしたので、第2期も継続してこのような取り組みをすることにいたしました。

応募の締め切りが4月24日(火)17時までとなっていますので、早めのご応募をお待ちしております。

SECCON CTFで出題したマインスイーパー問題

今年の2月、九州工業大学の飯塚キャンパスにて「第1回SECCON CTF福岡大会」有志のボランティアメンバーで開催しました。

P1090216.JPG

CTF(Capture The Flag)の競技大会の中では、セキュリティ技術(フォレンジック、暗号、リバースエンジニアリング、ネットワーク解析、Web脆弱性)にフォーカスしたものだけではなく、コンピュータ技術に関する幅広い知識や経験を問うこと言うことで、純粋にプログラミングに関する問題も出しているのですが、その中で、私の出題したPerlワンライナーの問題もこちらのブログで公開してみます。

■問題:マインスイーパー

改行コードがLFの以下の2つのファイルがあるとする。
(※CR LFでないことに注意)

$ cat 16x8.txt
................
................
....***.....***.
...**.*....**.*.
..**......**....
...*****...*****
...*.*.*...*.*.*
...*.***...*.***

$ cat minesweeper16.pl
#!perl -p0
s+\.+map/\e/g,$`.000000x3^($^x3).$_+eg

このファイルを実行すると以下の出力結果が得られる。

$ ./minesweeper16.pl < 16x8.txt
0000000000000000
0000000000000000
0000***00000***0
000**0*0000**0*0
00**000000**0000
000*****000*****
000*0*0*000*0*0*
000*0***000*0***

このとき、入力の*をマインスイーパーの爆弾のある場所と見立てて、
周辺にある爆弾の個数を数えて0~8の数字を出力するように
元のプログラムの一部を書き換えよ。

具体的には、以下の出力が得られるようにプログラムを修正せよ。

$ ./minesweeper16.pl < 16x8.txt > correct_answer
$ cat correct_answer
0000000000000000
0001232100012321
0013***20013***2
013**5*2013**5*2
01**654311**6543
014*****214*****
003*7*8*303*7*8*
002*4***202*4***

回答は、プログラム中の「000000」の箇所を置き換えた文字列を入力せよ。
ただし、入力行の幅は半角16文字+改行LF(1文字)で固定として良い。

置き換える文字列は7bit-ASCIIの印字可能な範囲内の文字とし、
複数の回答が考えられる場合は最短の文字列を正解とする。
同じ長さで複数回答が考えられる場合は、ASCIIの辞書順に
ソートし、若い方の回答を正解とする。
■ヒント

ヒント1:「000000」を「111111」に置き換えて実行してみよ 
ヒント2:「000000」を「111e11」に置き換えて実行してみよ 
ヒント3:「000000」を「555555」に置き換えて実行してみよ 
ヒント4:1行目!#perl -p0 はどんな意味を持つか調べてみよ 

実は、出題日と同日に発売された「Software Design 2012年3月号」のハック特集のページで、この問題の回答そのものが紹介されていたのですが、会場にいる参加者は誰も気づかなかったというヲチがありました。

自分の力で解いてみるのも面白いので、ある程度の期間が過ぎたら回答と解説のページを別途掲載するようにしてみたいと思います。

2012年4月 1日 (日)

PRML副読本「パターン認識と機械学習の学習」を出版します

2010年~2011年に社内で開催した機械学習勉強会の『パターン認識と機械学習』読書会で、光成さんが素晴らしいアンチョコを作ってくれました。PDFファイルは既にgithub 上で公開されていますが、このまま埋もれさせておくのはもったいないということで、暗黒通信団の同人誌として正式に出版されることが決まりました。

20120401prml

※ 表紙のデザインは今後変更される可能性があります。

目次は以下の通りです。

第 1 章  「序論」のための確率用語

   1.1      確率変数は変数なのか..............................  7 
        1.1.1   確率空間(Ω, F, P).............................  7 
        1.1.2   σ 加法族.....................................  8 
        1.1.3   確率変数X.....................................  8 
        1.1.4   確率変数は写像である..........................  9 

第 2 章  「確率分布」のための数学

   2.1      微積分の復習...................................... 11 
        2.1.1   変数変換...................................... 11 
        2.1.2   奇関数の積分.................................. 11 
        2.1.3   exp(−x) の積分................................ 12 
        2.1.4   ガウス分布の積分.............................. 13 
   2.2      線形代数の復習.................................... 14 
        2.2.1   行列の積...................................... 14 
        2.2.2   トレース...................................... 14 
        2.2.3   行列式........................................ 14 
        2.2.4   行列の種類.................................... 15 
        2.2.5   ブロック行列の逆行列.......................... 16 
        2.2.6   三角化........................................ 18 
        2.2.7   対称行列...................................... 18 
        2.2.8   2 次形式...................................... 19 
        2.2.9   多変量ガウス分布.............................. 20 
        2.2.10  行列の微分.................................... 21 
        2.2.11  ガウス分布の最尤推定.......................... 25 

第 3 章  「線形回帰モデル」のための数学

   3.1      最小二乗法........................................ 27 
        3.1.1   微分の復習.................................... 27 
        3.1.2   誤差関数の最小化.............................. 27 
        3.1.3   正射影........................................ 28 
        3.1.4   行列での微分.................................. 29 
        3.1.5   Woodbury の逆行列の公式....................... 29 
        3.1.6   正定値対称行列................................ 30 
        3.1.7   予測分布の分散................................ 31 
        3.1.8   カルバック距離................................ 32 
        3.1.9   エビデンス関数の評価の式変形.................. 33 
        3.1.10  ヘッセ行列.................................... 34 
        3.1.11  エビデンス関数の最大化の式変形................ 34 
        3.1.12  パラメータの関係.............................. 35 

第 4 章  「線形識別モデル」のための数学

        4.1      クラス分類問題............................... 39 
        4.2      行列の微分の復習............................. 40 
        4.3      多クラス..................................... 41 
        4.4      分類における最小二乗......................... 42 
        4.5      フィッシャーの線形判別....................... 42 
        4.6      最小二乗との関連............................. 44 
        4.7      確率的生成モデル............................. 46 
        4.8      連続値入力................................... 46 
        4.9      最尤解....................................... 47 
        4.10     ロジスティック回帰........................... 49 
        4.11     反復再重み付け最小二乗....................... 50 
        4.12     Jensen の不等式.............................. 52 
        4.13     多クラスロジスティック回帰................... 53 
        4.14     プロビット回帰............................... 54 
        4.15     正準連結関数................................. 55 
        4.16     ラプラス近似................................. 57 
        4.17     モデルの比較とBIC............................ 58 
        4.18     ディラックのデルタ関数....................... 59 
        4.19     ロジスティックシグモイド関数と
                 プロビット関数の逆関数....................... 59 
        4.20     ベイズロジスティック回帰..................... 61 

第 9 章  「混合モデルと」の数式の補足

   9.1      復習.............................................. 65 
        9.1.1    行列の公式................................... 65 
        9.1.2    微分......................................... 65 
        9.1.3    ガウス分布................................... 66 
   9.2      混合ガウス分布.................................... 66 
   9.3      混合ガウス分布の EM アルゴリズム.................. 67 
   9.4      混合ガウス分布再訪................................ 69 
   9.5      K-means  との関連................................. 70 
   9.6      混合ベルヌーイ分布................................ 71 
   9.7      ベイズ線形回帰に関する EM アルゴリズム............ 73 
   9.8      一般の EM アルゴリズム............................ 74 
   9.9      混合ガウス分布のオンライン版 EM アルゴリズム...... 76 

第 10 章 「近似推論法」の数式の補足

    10.1     この章でよく使われる公式......................... 79 
         10.1.1  ガンマ関数................................... 79 
         10.1.2  ディリクレ分布............................... 79 
         10.1.3  ガンマ分布................................... 80 
         10.1.4  正規分布..................................... 80 
         10.1.5  スチューデントのt 分布....................... 80 
         10.1.6  ウィシャート分布............................. 80 
         10.1.7  行列の公式................................... 81 
         10.1.8  カルバック距離............................... 81 
    10.2     下限と下界....................................... 81 
    10.3    分解による近似の持つ性質.......................... 82 
    10.4    α ダイバージェンス............................... 83 
    10.5    例:一変数ガウス分布.............................. 84 
    10.6    モデル比較........................................ 86 
         10.6.1  変分混合ガウス分布........................... 87 
         10.6.2  変分事後分布................................. 87 
    10.7    変分下限.......................................... 91 
    10.8    予測分布.......................................... 95 

索引

ISBNを取得していますので、将来的には一般書店やオンラインショップでも取り扱いは可能になるかと思います。 まだ流通はしていません。価格は現在調整中で、印刷所に見積もりをもらった結果、予価1,000円前後になる見込みです。 一般書店に流通させる場合は、即売会とは異なり、定価よりも安い値段で卸す必要があるため、原価相当での設定となります。

今回の同人誌出版にさしあたって、事前に関係者にご相談させていただいたところ、原著からコピーしているのではなく自分で一から数式を書き起こしているのであれば問題ないでしょう、というコメントをいただきました。 今後のスケジュールですが、数式の校正とレイアウトの調整、第 11 章の補足なども付け加えて、ページ数は 120 程度、5月下旬頃に正式に出版となる予定です。

というお話なのですが、マニアックすぎて、誰も買いませんよね。。。

2012年3月22日 (木)

サイボウズ・ラボユースを1年間やってみてわかったこと

サイボウズ・ラボユースとは、2011年から始めた学生支援制度で、詳細は…中谷さんによる解説サイボウズ・ラボユースってなに? - Mi manca qualche giovedi`?が詳しいです。 一部、引用すると:

サイボウズ・ラボユースで「何をやってもらう」か。
実は設問がすでに間違っている。ラボユースは「やってもらう」ところではなく、自分から「やりたいこと」をやるところ。 というわけでインターンとは全然違う。サイボウズの業務の一部をやってもらうなんてありえない(本人がよほど強く希望でもしない限り)。そもそも NDA(秘密保持契約)すら結ばないし。
サイボウズ・ラボユースに応募するには
対象が学生なのはさすがにわかると思うのでおいとくと、上で書いたように「やりたいこと」がある人というのが必須要件。 「開発支援」なので、コンピュータの上で動く何かを作ることが核になっていること。 そして成果をサイボウズも利用できる形式(ライセンス等)でオープンにできること。 この2点が満たされていればOK。
サイボウズ・ラボユースで何が得られるか
サイボウズ・ラボに通うことができれば、奨励金がもらえる。 ぶっちゃけて言ってしまえば、アルバイトだ。といっても上で書いたように指示された仕事をするのではなく、自分のやりたい開発をやる。 遠方であるなどの事情でサイボウズ・ラボに通えない場合は、ラボユースのサブメンバーといって、オンラインで同様のサポートを受けたり、遠方の学会/カンファレンスなどへの参加費(交通費・宿泊費)の援助が受けられる。

あとは、サイボウズ・ラボの社員から直々に指導を得られるということで、自画自賛ですが、なかなかこんな制度をやっている会社は珍しいと思います。

■ サイボウズ・ラボユース 最終成果報告会

というわけで、3/26(月)秋葉原ダイビル5Fにて、1年やってみたサイボウズ・ラボユースの最終成果報告会を開催します!


 開催日時:2012年 3/26(月) 13:00~17:00 
 開催場所:秋葉原ダイビル5階(カンファレンスフロア5A)
 参加費用:無料(懇親会も無料)
 申し込み:必要 http://atnd.org/events/26861 (ATND参加枠を追加)
【タイムテーブル】

 13:00 開場(受付)

 13:10 サイボウズ・ラボユースの紹介
     司会:竹迫良範(サイボウズ・ラボ)

 13:15 サイボウズ・ラボユース第1期生5名による成果発表
  1. 桐井祐樹「Ruby・Raccを使用した言語処理系の日本語プログラミング化」 
  2. 新屋良磨「世界最速の正規表現JITエンジンの実装」@sinya8282 
  3. 林 拓人「型システムの拡張と型推論」 
  4. 鈴木勇介「世界で一番仕様に忠実なJavaScript処理系の作成」 
  5. 粟本真一「現役高校生の考えるクラウドOSの設計と実装」

 15:30 ライトニングトーク大会 
  1.「ラボユースを振り返って ~指導者の立場から~」光成滋生(サイボウズ・ラボ) 
  2.「拡張ライブラリ作成による高速化」itochan 
  3.「Python による自然言語処理(仮)」torotoki 
  4.「定理証明器 Agda2 による型無しλ計算の合流性の証明」pi8027 
  5.「エンジニアが儲けられるコードリーディングプラットフォーム『CodeLibrary』」はむへい 
  6.「ハニーポット上でパケットをダンプ&解析」ぷおりん 
  7.「やってよかったOS作り」川合秀実(サイボウズ・ラボ) 

 16:10 サイボウズ・ラボユース第2期生の募集について
     説明&質疑応答

 16:30 卒業式
     主 催:サイボウズ株式会社 感動課
     表 彰:青野慶久(サイボウズ株式会社 代表取締役社長)
     総 評:畑慎也(サイボウズ・ラボ株式会社 代表取締役社長)
 16:50 撤 収

 17:00 懇親会(別の会場に移動して開催、30名程度)
     参加費:無料
     乾 杯:山田理(サイボウズ株式会社 取締役副社長)

 19:30 解 散

いろいろマニアックな話からライトな話まで、プログラミングの最先端の開発の話が聞けると思います。

一つ、鈴木(id:Constellation)さんの「世界で一番仕様に忠実なJavaScript処理系の作成」は、相当マニアックな展開になることが予想されます。 RegisterVMとStackVMはどちらが速いのか、v8やSpiderMonkeyの実装がどこが駄目なのか、言語処理系の高速化のテクニック等盛りだくさんです。 発表時間がオーバーしないかどうか主催者側としては少し心配しています…。

若干名ながらATND枠も新設しましたので、ぜひお気軽にお越しください。

2012年1月 1日 (日)

プログラミング言語APLで謹賀新年Golf

2012年の元旦ということで、プログラミング言語APLで謹賀新年Golfをやってみました。

APL2012golf-73byte

APLとはA Programming Languageの略で、1957年のFORTRAN登場以降にケネス・アイバーソン博士によって発明された数式処理のための記法をIBMが対話型のプログラミング言語として修正し実装したものです。当時は⍳{iota}や⍴{rho}など特殊な記号を入力するためのAPLキーボードがあったそうです。

APL-keyboard

今ではAPLフォントの記号はすべてUnicodeの中で定義されています。
先月開催したサイボウズ・ラボユース冬の合宿では、林拓人さんが筑波大学の図書館から借りてきたAPLの教科書があったので少し斜め読みしてみました。それで、APLの記号の使い方が大体わかったので、今回の謹賀新年Golfをしてみることにしました。

まずは91文字のAPLプログラム。

11×((3⊖5 o↑1⌽(1 o⍴⍳o)∊3 o)+1⊖5 o↑1⌽(2 o⍴⍳o)∊3 7 o)+1-((5 o⍴0,⍳27)∊o(o+10))∨(5 o⍴⍳o)∊2×⍳o←13

 
 11 11 11 0 11 11 11 0 11 0 11 11 11
  0  0 11 0 11  0 11 0 11 0  0  0 11
 11 11 11 0 11  0 11 0 11 0 11 11 11
 11  0  0 0 11  0 11 0 11 0 11  0  0
 11 11 11 0 11 11 11 0 11 0 11 11 11

こんな感じで上のAPLの1行プログラムを実行すると、5×13のマトリクスで表現された 2 0 1 2 という 0 1 の数列が出力されます。バイナリアンになった気持ちで、0は空白、11はドットで塗り潰す、という心の眼で実行結果を見てください。今年の西暦2012に見えますよね?

■■■□■■■□■□■■■
□□■□■□■□■□□□■
■■■□■□■□■□■■■
■□□□■□■□■□■□□
■■■□■■■□■□■■■

もうちょっと数列の作り方を工夫すればコードが短くなるかな、と思ってGolfしたのがこちら。67文字。

11×1+(8⌽1⊖5 o↑2 1⍴1)-(⍵+3⌽⍵←4⊖5 o↑3 3⍴7⌽5<⍳9)+5 o⍴¯2⌽(o⍴⍳o←13)∊2×⍳4

 
 11 11 11 0 11 11 11 0 11 0 11 11 11
  0  0 11 0 11  0 11 0 11 0  0  0 11
 11 11 11 0 11  0 11 0 11 0 11 11 11
 11  0  0 0 11  0 11 0 11 0 11  0  0
 11 11 11 0 11 11 11 0 11 0 11 11 11

24文字も短くなっています!

非常に簡潔なコードですね。

APLの処理系はたくさんあるのですが、openAPLという処理系がオープンソースで公開されていて、Ubuntuでも何とか動かすことができました。

openAPL

しかし、X11のAPLフォントとキーバインドの設定がよくわからなかったので、結局はWindowsで動作するAPL処理系の一つNARS2000でプログラムを作成しました。林さんも合宿中はこの処理系を使ってAPLプログラミングを楽しんでいました。

■APLによるFizzBuzzとLifeGame (林拓人さん作)

APLによるFizzBuzzとLifeGame (林拓人さん作)

林さんは合宿中、自分でFizzBuzzやライフゲームのコードをフルスクラッチから書き起こしていて、かっこよかったです。

林拓人さんによるAPLプログラミング紹介

というわけで、今年の元旦は未来のプログラミング言語として評価の高いAPLの書き初めでした。

Javaアプレットとして動作するAPLetteという冗談のような名前のプログラムもあるそうです。ただ、こちらはAPLフォントによる直接入力ができないので、ASCIIテキストの記法で入力してあげる必要があります。

プログラミング言語Jの記法に馴染めなかったという人も、APLの記号ならわかりやすく理解できるかもしれません。温故知新のAPL。ぜひ、みなさんも楽しいAPLライフをお過ごしください。