ブログエントリで振り替える2010年

年末なので、今年一年で書いたブログエントリを振り替えってみます。

入社

うん、まあねぇ。下手なこと言っても面倒なのでスルーで。
とりあえず社内SEをぼちぼちやっています。

いろいろ作った

もうちょと色々作ってるつもりだったけど、ちゃんとエントリに書いたのはこの3つだけらしいです。
atig.rbは、普段使っているのでぼちぼちメンテしていくつもりです。

グリーンバンド

TDDBC名古屋で紹介されてたグリーンバンド伝説が胸にキュンと来たので、うっかり作っちゃいました。てへ。
ただの思い付きだったのですが、その後いろいろとあってたのしかったです。

  • Rubyist用のレッドバンドが作られた。
  • 内定式につけていったら先輩と仲良くなった人がいる
  • id:clairvy さんが100個近く、追加生産したらしい

イベント

こんな感じの適当な、もとい、ゆるい感じのイベントもいくつかやりました。
みんなで集って各自が好きなことをやるのは結構たのしい(とボクは思ってる)ので、来年もそんな感じのイベントをやっていきたいと思います。

とりあえずpartake.in3月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))
}

ネストが浅くなって超クール!

適当な解説

  • 「sは0〜9のどれか」のようなあいまい性を含んだままプログラムが書ける非決定計算というパラダイムがあります。
  • リストモナドを使うと、この非決定計算をScalaに持ち込むことができます。
  • しかもfor構文のおかげて、わりと自然な感じに書くことができます。

まとめ

Scalaで探索問題を書くときはリストモナドが便利だよ!

Eclipse用C言語コーディングスタイルチェックプラグイン『KariyaSiesta』をリリースしました

特徴

Eclipseプラグインとして使える

  • Eclipseプラグインとして実装されているので、IDEで使えます。
  • もちろんCDTとも組合せることができます。
簡単イントール

  • 更新サイトから簡単にインストールできます。
  • もちろん自動アップデートにも対応してます。
XPathでルールで書ける
  • ルールはXPathで書くことができます。
  • 例えば『whileの内でbreakを使ってはいけない』というルールは以下のようになります。
  • こまかい書き方はマニュアルを参考にしてください。
//Stmt[@sort="While" and .//keyword[text()="break"]]

経緯

  • 伊東の旅館で大量のレッドブルを消費して作りました。
  • CX-Checkerをforkして作りました。

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に参加してね!

12/17(金)に非公式名古屋Scala勉強会やります

partake.in

12月は名古屋Scala勉強会がないので、代わりに非公式名古屋Scala勉強会やります。
せっかくなので普段できないことをやりましょう。

普段できないことの例

  • ちゃんとScalaの勉強をする。
  • これまでの復習をする。
  • 完全にScalaのことをわすれて、F#とCoqの話をする。
  • Scala Advent Calendarをみんなで作る。
  • あとは募集中

NGK忘年会2010でCoqの紹介をしてきました

DSC_0386.JPG

NGK忘年会2010(昼の部) : ATNDという名古屋の全コミュニティ合同の忘年会に参加してきました。

発表したこと

発表動画@Ustream

CoqPartyのスライドの使いまわしです。
Coq楽しいよ、盛り上ってるよ、って話をだらだらしてきました。

Coq入門記事

上のスライドでCoqに興味を持ってくれた人が数人いるらしいので、入門記事へのリンクを貼っておきます。

あとProofCafeもよろしくお願いします。

懇親会の感想・メモ

  • Scala座でニアミスした[twitter:@PG_kura]さんとやっと話せた
  • [twitter:@fate_fox]がしっかりしすぎててビビる
  • Boost.勉強会 名古屋は4月ごろ開催予定 by [twitter:@bleis]
  • 2月ごろに温泉にとまりこみでハッカソンやりたいね。仮タイトル:「NagoyaHackathon #2〜リリカル温泉〜」
  • [twitter:@wof_moriguchi]さんは次回のわんくまでF#かCoqの話をする

CoqPratyで『CoqからRubyへ』という発表をしてきた

DSC_0385.JPG

CoqPartyに参加してきました。すっげー楽しかった。

発表したこと

  • CoqRuby Extractionを書いたときの話をしてきました。
  • Extractionを書けば、どの勉強会にもCoqの話で乗り込めるよ!
  • 内容がid:yoshihiro503さんとかぶってたので、生成されたコードの解説をメインでしてました。

感想

  • Macのディスプレイアダプタをまた失くしたorz。
  • Coqの話がいっぱい聞けてたのしかったです。
  • [twitter:@maeda_]の「あなたの好きなtacticsは?」がステキすぎる。派生してあなぷるで人気のtacticsとかができたりした。
  • Redmine/Backlogにイカ娘を表示させるのは常識 by [twitter:@otf]。
  • 懇親会では[twitter:@pirapira]さんと[twitter:@yoshihiro503]さんとで課金制あなぷるとかあったら使うのにねー、って話をしてた。