2013/08/25

ハッカーズチャンプルーに行ってきた

2013/08/24 に ハッカーズチャンプルー なるイベントがありまして、ふらっと行ってきました。
プログラムはこんな感じ

感想含む忘備録チックな感じで非常に長くなってしまった感。

カンファレンス

実はちょっと遅れて行きました。時計セットし忘れ。むむ。

きしださんな Java8 な発表は資料無しでブログとライブコーディングが資料な発表でした。
なんだかんだでブログにまとめてると後から役に立つのかな、とか。
して発表内容ですが、Java8 から lambda とか Optional とか入って良い感じになるよー、とのこと。内心では「それRubyだとあんなか」って感じで聞いてました。
けれど「Javaそのものは3年くらい遅くて、それがずっと続く感じだと思ってる」とのこと。そういうスタンスもあるのねー、とか思いました。

丸山さんの発表は、今までの時代とこれからの時代的なお話でした。特にWebアプリって何ぞ、みたいな感じ。印象に残ってるのは「WebPageはクライアント側のUpdateいらないよね」みたいな話。Packaged Web App は新しいモデル、みたいな感じなんだろうか。MVC的な感じとかとか。

CodeIQさんからはお菓子とか飲み物とか大量に貰いました。ごちそうさまです。
弁当もありがとうございました(これはスポンサーさんかな?)

dankogai さんはプログラミングってどう考えてるのみたいな話。FizzBuzzに焦点を当てて、一番単純なものから捻ったもの、はてはHaskellで書いたものまで見ていく、といった流れ。全編ライブコーディングでした。
ちなみにRubyの解説の時に当てられて答えられたのでちょっと満足。まとめとしては関数型は文脈に依存しないから並列にすると良い感じよねー、みたいな。というか Haskeller あまりいなかった。ってことはやっておく価値ありそうなんかなー、とか思いながら。

AWS な堀内さん、後藤さんは AWS使ってないこともあって事例とかはいまいちピンと来ず。そろそろ触れって感じでしょーか。

大石さんは相変らず時代劇な感じ。「安心を取るか安全を取るか」とか「情報はお金みたいなもの。重要だからって自社に全部置く? 普通は銀行に置かない?」みたいな話はなんか納得してました。あれくらい良い指摘ができるようになればそれこそクラウドを上司に認めさせられそうだなー、とか思いながら聞く。

PostgreSQL な永安さんは「すべき、べからずのn箇条。」nが何だったか憶えてない。というか一覧欲しい。
パラメタはデフォルトのままやめよう、とかあったのだけれど今のところデフォルトで十分動いちゃったりするので私にはまだ早い話だったかもしれない。
ただ、TLは大分「耳が痛い」的な話だったのでそのうち耳に染みるようになるのでしょうか。とりあえずバックアップ取らなきゃなー。

矢野さんな OKINAWA GIRL's lab のおはなしはガールズトークセッションと呼べば良いのかな。「腹を割って話さなきゃ」って言ってる通り、割と腹を割った話を会場でやってた印象。それを会社とかで言うと結構変わるのかなー、とか。いやまーとっくに言ってるかもしれないし、腹を割るってこのレベルじゃないのかもしれませんが。
とりあえず私としては、やっぱり話し合ってみなきゃ分からないよねー、みたいな印象を持ちました。こういう悩みとかあるよね、ってのを知ったのだけでも良かったのかもしれない。

米須 さんも相変らず。大事なことなのでn回良います。あのテンション良いと思います。
して、DevOps知らなかったので具体的には分からず。ただ、権限の切り分けは重要そうだな、と。
というか「本番で動かないでござる」が無くなるのならどうぞどうぞしてしまうかもしれない。

ビーチパーティー

なんとスポンサーさんの力によりバーベキュー無料。タダ飯。ありがとうございます。
yota さんが dankogai さんのサイン貰って doya-face してました。私は急いで来たから本を家に忘れてしまって貰えず。dankogaiさん来年サインください。
というかお話もできたのでなんかすごい。言い方アレかもしれないけれど、ブログの向こう側の存在が目の前に居る感じ。何事。
話しをしてると web application な脆弱性の話から system call な話になったり、 CPU architecture な話になったり、攻殻とか艦これが顔を覗かせたり。話題多いなー、と。
あとCodeIQな方とか Tokyo な方多かったですね。終電って何ですか。というか電車って何。
お酒もアリの場でしたけれど楽しめた感あります。
あと、 #世界の麦汁 さんが #世界の土下汁 になってました。おさけ良く分かりません。

かんそう

素敵なチャンプルーでした。
是非来年も開催して欲しいですねー。
ってな訳で皆々様方、ありがとうございました。

2013/08/18

Monad のようで Monad じゃないものを書いてみた

最近は すごいH本読んだり とか Haskell ってたのですが Monad が謎だったので試しに書いてみました。

結論から言えば Monad 則を満たしていないので、「Monad の instance にできてしまった何か」なのですが。
ってな訳で HookMonad なるものを作ってみた話。

HookMonad

a -> a な関数と a な値を持つデータ構造を定義。
>>= で関数を適用する際に a -> a の関数を適用してから関数を適用する、ってものにしてみました。

適用してみる想定として座標を考える。名前は nonMinusPoint とかにしてみました。
座標用のデータ構造で、値が 0 以下になったら 0 にしてくれる、って代物。
「プログラマブルセミコロン」のたとえを聞いて最初に思いついたものがコレ。
毎回 「0 以下なら……」 的なロジックが必要無さそうなので良いのかなー、と。
ソースはこんな感じ。

どう処理してるのか

Hook に a -> a な f として「0 以下なら 0 にする」lambdaを渡してます。
そうして >>= で関数を適用したい時はその lambda を適用してから関数を適用させる、と。
それを単純に使うために nonMinusPoint とかって名前を付けておく。
値を操作する関数 add とか multi には 「値が 0 かどうか」的なロジックはいらない。はず。
(とは言っても nonMinusPoint を結局使うので、毎回 lambda 書いてるのとあまり変わらない気もするけれど)
そうすると、 >>= で関数を適用する分には値が 0 以上になることが保証されそう。
あと、 Maybe の「失敗するかもしれない演算」みたいに「マイナスになるかもしれない演算」があったとしても確実に 0 以上であることが保証される。
だから add とかじゃなくて「0 以上でないと使えない関数」を定義した方が良いのかも。

 

ちなみにこれはMonadじゃない

ただし前述したけれどこれは Monad 則を満たしてません。
ちなみにMonad 則は以下。
return a >>= f ≡ f a
m >>= return ≡ m
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
1はどうにか満たしてるはず。
2は無理。return の型を合わせるために id を使ってるので、 m >>= return すると a -> a な関数が id に変わっちゃう。
3はどうだろ。たぶん満たしてそうだけれど反例が思いつかないだけかもしれない。

さらに問題点

もともとは「数値演算をしたら non zero にする」みたいなものを作りたかったので
Hook f n >>= g = fmap f $ g n
とかにしたかった。
だけれど >>= の型は
(>>=) :: Monad m => m a -> (a -> m b) -> m b
なので、 埋め込んでる a -> a な関数を m b に fmap しようとしてダメ、って言われる。
あと HookMonad が Functor じゃないと f を数値演算後に適用できないのだけれど、 fmap の型も
fmap :: Functor f => (a -> b) -> f a -> f b
ってなってるので、 Hook (a -> a) b になっちゃってダメ。
さらに、 return に id を使ってるので、汎用性を高めるために return を使ってるようなコードだとかえって a -> a な f が id になっちゃって埋め込んでたのが消えちゃう。
完全に Monad則 の 2 がダメになっています。
ってな訳でいろいろ問題点は多し。
ただ、「演算のたんびに何かする」ことはできたので良いのかなー、とか思っています。
まー、>>= に与える関数の中でも nonMinusPoint とか書いてるから「毎回何かする」部分を毎回書いちゃってる説もありますが。
(いやでも nonMinusPoint にすることで型が Hook になるので Hook なコードを書いてたら 型チェックされる ==  非ゼロ保証 だし良いのか? うーん)

なんか良いこと

あと書いててすごいなー、と思ったこと。
この Hook ですが deriving Show してません。
どうしてかと言えば関数を持ってるから deriving だと無理。
だから getValue を定義して、値だけを取り出すようにしないと ghci で値を見られませんでした。
その getValue の中でも f を適用するようにしたので、最後の最後だけ処理後に 0 以下かどうかのチェックができてます。
あと、コメントアウトしてるのは ghci で実行してみた例なのですが、 foldl でガンガン処理していけるっぽいです。
あと途中結果を見るために scanl を使ってみたのだけれどそのままだと見られない。
scanl は計算途中の内容を List にして返すので、その List に対して fmap で getValue かけたらきちんと見られました。
ちゃんとした Functor すごいなー、とか。
あと scanl で計算結果の途中を見ると、 0 以下になるところで 0 になってるっぽい。

ってなわけで Monad のようで Monad じゃない何かを書いてみました。

2013/08/11

xHago4 に行ってきた

2013/08/10(Sat) は xHago4 でした。

機械学習を使って顔文字検出してみた ってことで発表もしてきました。
内容を一言で言えば「オリジナルの特徴ベクトル設計で単純なやつよりは良い結果出たよ」みたいな。
プレゼンとしては機械学習やってみたー、みたいな話をしたつもり。
ただ、教師あり学習とか特徴ベクトルの話は削っちゃっても良かったのかも、との指摘も頂くなど。時間足りなかったですし。
私としては「コードそのものに工夫するのではなくデータの見方とか処理とかを工夫するような世界もあるんだー」的なことを言いたかったです。
どこでもデータの見方は必要だと思いますし、データの処理でコード書かないといけませんが。

リスナーとしては、今回は良い話とかコミュニティの話が多かったなー、という印象でした。
何か作りました、って話でも内部のロジックよりはAWSでこうこう、みたいな感じ。
意外と中身話すよりも、プレゼンでインパクトで伝えて「詳しくはGithubで」くらいのが良いのかな。

あと夜の部がhagoでした。