ブログエントリで振り替える2010年
年末なので、今年一年で書いたブログエントリを振り替えってみます。
いろいろ作った
- atig.rb - Another Twitter Irc Gatewayをつくってみたよ - みずぴー日記
- 名古屋の勉強会支援サービス「生涯学習センター横断検索」を作ったよ - みずぴー日記
- Eclipse用C言語コーディングスタイルチェックプラグイン『KariyaSiesta』をリリースしました - みずぴー日記
もうちょと色々作ってるつもりだったけど、ちゃんとエントリに書いたのはこの3つだけらしいです。
atig.rbは、普段使っているのでぼちぼちメンテしていくつもりです。
グリーンバンド
TDDBC名古屋で紹介されてたグリーンバンド伝説が胸にキュンと来たので、うっかり作っちゃいました。てへ。
ただの思い付きだったのですが、その後いろいろとあってたのしかったです。
- Rubyist用のレッドバンドが作られた。
- 内定式につけていったら先輩と仲良くなった人がいる
- id:clairvy さんが100個近く、追加生産したらしい
勉強会/LT
- 『CSNagoya 第5回GC本読書会』に行ってきました - みずぴー日記
- OCamlMeeting 2010 NagoyaでLTしてきました - みずぴー日記
- Coq庵で発表してきました - みずぴー日記
- Scala座で「Scalaによる型推論の実装」という発表をしてきました - みずぴー日記
- CoqPratyで『CoqからRubyへ』という発表をしてきた - みずぴー日記
- NGK忘年会2010でCoqの紹介をしてきました - みずぴー日記
今年はいろんなとこで発表やLTをさしてもらいました。ちょーたのしかったです。
Coq、Coqばかり言ってたような気がしたのですが、ちゃんとScalaやOCamlの話もしてたんですね。よかった。
来年は、とりあえずわんくま同盟とpartake.inで話す予定になってます。
イベント
こんな感じの適当な、もとい、ゆるい感じのイベントもいくつかやりました。
みんなで集って各自が好きなことをやるのは結構たのしい(とボクは思ってる)ので、来年もそんな感じのイベントをやっていきたいと思います。
とりあえずpartake.inと3月5日 リリカル合宿(愛知県)をやるので、みんな来てね。
まともなエントリ
12月のあたりから「ちょっとまじめにエントリを書いてみようかな」と思っていくつか書いています。
一回目に書いたRedmineネタがブクマ数をかせぎすぎてて、逆にハードルがあがった気がしてます。
まとめ
- イベント系は楽しいので、来年もがんがん参加していきたい。
- 今、つくってるやつを来年の前半には、公開できるレベルにしたいなぁ。
- 来年は、名古屋ギーク部室計画をちょっとすすめたいなぁ。
リストモナドを使ってみる
このエントリはScala Advent Calendar jp 2010 : ATNDの25日のものです。
メリークリスマス! クリスマスは楽しくみんなでパズルを解いて遊びましょう。
パズルみたいな探索問題をScalaで解く場合は、リストモナドを使うとキレイに書けます。
例: SEND+MORE=MONEY
例として覆面算を解いてみましょう。
各アルファベットに異なる数字が割り当てれる。その数字は何か?
ただし最上位桁が0ではない。
普通にforループを使って解くと、ネストの深さが酷いことになります:)。
// int(1,2,3)を123にする関数 def int(xs : Int*) : Int = xs.foldLeft(0)( _ * 10 + _) // SEND+MORE=MONEYの答えを探索する def solve : (Int,Int,Int) = { for( s <- 0 to 9) for( e <- 0 to 9) for( n <- 0 to 9) ................ for( y <- 0 to 9) if(s != 0 && m != 0 && int(s,e,n,d) + int(m,o,r,e) == int(m,o,n,e,y)) return (int(s, e, n, d) , int(m, o, r, e) , int(m, o, n, e, y)) }
これをリストモナドを使って書くと次のようになります。あいかわらずforを使ってるように見えるかもしれませんが、それは幻想です:)。
def solve : Seq[(Int, Int,Int)] = { val digits = 0 to 9 for { // sは0〜9のどれか s <- digits // eは0〜9からsをのぞいたもののどれか e <- digits diff List(s) // nは0〜9からsとeをのぞいたもののどれか n <- digits diff List(s, e) // dは(ry d <- digits diff List(s, e, n) m <- digits diff List(s, e, n, d) o <- digits diff List(s, e, n, d, m) r <- digits diff List(s, e, n, d, m, o) y <- digits diff List(s, e, n, d, m, o, r) // sは0ではない if s != 0 // mも0ではない if m != 0 // SEND+MORE == MONEYを満すかどうかをチェック if int(s, e, n, d) + int(m, o, r, e) == int(m, o, n, e, y) } yield (int(s, e, n, d) , int(m, o, r, e) , int(m, o, n, e, y)) }
ネストが浅くなって超クール!
適当な解説
Eclipse用C言語コーディングスタイルチェックプラグイン『KariyaSiesta』をリリースしました
- 伊東まで開発合宿に行って、みんなでC言語のコーディングスタイルチェッカーを作ってました。 => KariyaSiesta | C 言語向けのコーディングチェッカ
- 配布サイトも作りました。
- ルールを簡単にカスタマイズできるようになってるので、みんな使うといいでゲソ。
特徴
F#でbegin/endを使う
このエントリはF# Advent Calendar jp 2010の第5回のものです。
F# Advent Calendarって?
- クリスマスまで一人一個づつF#にまつわる何かをブログに書いていくお祭り。
- F#に関係してるなら、なんでもいいらしいので、みんな参加してね! →参加登録
begin/end
さて、F#では丸括弧の代わりにbegin/endが使えます。
とりあえず、対話環境(fsi)で試してみましょう。
(* (1 + 2) * 3 と同じ意味 *) > begin 1 + 2 end * 3;;val it : int = 9
丸括弧のかわりに使えるので、当然begin endでunitになります。
(* begin endでunitになる *) > let x = begin end;; val x : unit = ()
高階関数との組合せ
一見意味なさげみ見えますが、高階関数と組合せると見た目がクールになります。
{ 1 .. 10 }|> Seq.map begin fun x -> let y = x + 1 let z = y * 2 z - 5 end
無名関数の中身が長い場合は普通の丸括弧のかわりにbegin/endを使うほうが読みやすくなります。そこはかとなくただようRubyっぽさがステキです。
当然、渡す関数が最後から二番目にないと使えません。
{ 1 .. 10 } |> Seq.fold begin fun x y -> x + y end 0 (* <- ダサい *)
そういう場合は、flipを使って引数の位置を調節します。
(* 引数の順番をいれかえる関数 *) let flip f x y = f y x (* クール!! *) { 1 .. 10 } |> flip Seq.fold 0 begin fun x y -> x + y end
まとめ
- F#では()の代わりにbegin/endが使えます。
- 高階関数と組合せるとハッピーです。
- みんなF# Advent Calendarに参加してね!
NGK忘年会2010でCoqの紹介をしてきました
NGK忘年会2010(昼の部) : ATNDという名古屋の全コミュニティ合同の忘年会に参加してきました。
発表したこと
CoqPartyのスライドの使いまわしです。
Coq楽しいよ、盛り上ってるよ、って話をだらだらしてきました。
CoqPratyで『CoqからRubyへ』という発表をしてきた
CoqPartyに参加してきました。すっげー楽しかった。
発表したこと
- CoqのRuby Extractionを書いたときの話をしてきました。
- Extractionを書けば、どの勉強会にもCoqの話で乗り込めるよ!
- 内容がid:yoshihiro503さんとかぶってたので、生成されたコードの解説をメインでしてました。