いけがみを召喚するには、出現予定を参考にしてください。三週間前までにメールをくだされば、日程を追加するなどしてスケジュールに組み込むことができるかもしれません。勉強会や個人的な会合、中途採用面接などに応じます。日記に書かないことはこちら。
今年もいたらない私をよろしくお願いします。あと全国のサユリストのためにも小百合さん年賀状を。マナカナさんもユキエさんも捨てがたいいいアイデアだと思うのですがどうでしょうか、ってもう遅いか。
ともあれ、皆様のご多幸と健康を心からお祈りいたします。
[追記:ヤッターマンかよ...]
ミクシィ年賀状作成にあたって、どれくらいの努力が必要なのか存じ上げないのですが、大変申し訳ありませんが全部拒否の方向で。裏書の中身くらいプレビューで見せろよ、ミクシィ。送ってくれた方には、大変申し訳ない気持ちでいっぱいです。
ミクシィ年賀状は、知り得た住所についてこう述べています:
- ・受取人が入力した個人情報について
受取人が年賀状の受取先としてご登録した個人情報は、株式会社ミクシィが厳重に管理し、弊社のプライバシーポリシーに則り適切に取り扱うものとします。また、ユーザーの個人情報について、ユーザーご本人の同意を得ずに第三者に提供することは原則としておこないません。
[個人情報の取り扱いについて - ミクシィ年賀状:よくある質問より引用]
「弊社(=mixi)のプライバシーポリシー」には、私が見逃せない点がありました。
8. 個人情報の第三者への提供
弊社は、ユーザーの個人情報について、ユーザーご本人の同意を得ずに第三者に提供することは原則としておこないません。提供先・提供内容を特定したうえで、ユーザーの同意を得た場合に限り、提供します。ただし、以下の場合はこの限りではありません。
- 弊社の業務委託先が、弊社に代わってダイレクトメール、電子メールその他手段で情報または役務を提供する場合
- 弊社の業務委託先が、弊社に代わってアフターサービスなどの個別の役務を提供するために必要がある場合
- 統計的情報を提供する目的で、個々の個人情報を集積または分析し、個人を識別できない形式に加工して、その統計データを開示する場合
- 有料サービスを利用しているユーザーに利用料金を請求する目的で、弊社の業務委託先である決済システム会社、クレジット会社および銀行(秘密保持契約を締結)に有料サービスを利用しているユーザーの個人情報を預託する場合
- プレゼントの発送等のために配送業者にユーザーの個人情報を提供する場合
- 法令により開示または提供が許容されている場合
[株式会社ミクシィ|個人情報保護(平成20年12月5日 改訂)より引用]
ダイレクトメールは嫌いです。ダイレクトメールは嫌いです。
加えて、僕は mixi.jp が 2006年2月頃にやらかしたソースコードの流出を覚えてます。Perl ですか。使うけど。書くけど。プライベートな目的にしか Perl は使いません。業務用途で Perl とか信じられない。2009年ですよ? そのあと全面的にリプレースしたんでしょうか。ちょっと信じられないです。
誤解のない様に付け加えておくと、このブログは Ruby 1.8.1 とそのうえのライブラリ、日記システム上で動いていますが、これは君のプライベートではない、私のプライベートだ。しかも漏洩して構わないことしか書いてません。編集のために必要な id と password はユニークであり、これが万が一漏れたところで、悲しい気持ちを持つだけです。Perl を Ruby にしろと言っているわけではないので、勘違いのなきように。だいたい tDiary 2.2.0 は BASIC 認証だしな。
11. 免責
以下の場合は、第三者による個人情報の取得に関し、弊社は何らの責任を負いません。
- ユーザーご本人が弊社サービスの機能または別の手段を用いて第三者に個人情報を明らかにした場合
- ユーザーが弊社サービス上に入力した情報等により、個人が識別できてしまった場合
[株式会社ミクシィ|個人情報保護 (平成20年12月5日 改訂)より引用]
これ読んだあとでは、受取人の住所なんか自分=ユーザが書くわけないじゃん…
もうとっくのとうに誰かに指摘され済みかもしれませんが、当事者になって気がついたのでここに書いておきます。ミクシィの法務部関連のひとはもうちょっとなんとかしてください。
今年に入って、自炊生活が充実している。ま、まだ一週間とちょっとしか経ってないからこれからだらだらと外食に移行してしまうのかもしれないけど。
大きく違うのは、「夕飯のメニュー」を昼飯前の数分に考えるようになったことだ。今までは、帰宅途中に買い物に寄りながら考えていた。仕事が終わって疲れて痺れてグダグダな状態で考えていた。ハラペコを通り越して「もう夕飯は抜きでもいいんじゃネ」と思う日も度々あった。
昼飯前はまだ元気が残っている。それどころか、ハラペコで何を食べようかムチューである。ムチューです!もうムチューです!昼休みが短いので、昨晩の夕飯があまらない限りは自作弁当ではなく外食なのだけれど、頭の中は昼食のメニューで占められている。このとき、ついでに夕飯の材料も考える。材料が決まると、料理のレパートリーもある程度決まってきて、これなら1時間、あれなら30分で済むなどと想像が膨らむ。
こうなると、重要なポイントの一つに、朝出かける前に冷蔵庫の中身をチェックしておく、という作業が入ることになる。無駄な買い物を避けるためである。余っている材料から、夕飯のメニューが決まることもある。
夕飯を作るのに何を使うかがある程度決まると、昼飯との栄養バランスもしっかりしてくる。こいつはいいや。
知り合いのシェフに聞いたところ、シェフは空腹を保たないと決していい料理は作れないそうだ。だから、激務にもかかわらず食べる量は細い。代わりに作りながらの味見と休憩の水分補給で毎日休まず営業するだけの体作りをしているんだそうである。ま、彼からしか聞いたことないので、どの程度一般的かはわからないけどね。
夕飯の材料を昼飯前に決めるというアイデアは、この話を聞いたときに思いついた。
同様に、趣味としてのコーディングや研究も「物足りなさ」を解消するところからスタートすることにする。仕事が終わった後の疲れた頭でやるんじゃなくて、元気なときに作ろう。欲求が満たされずにやきもきしている状態で、なおかつ元気ならば新しいアイデアが浮かぶに違いない。
これは別の機会に聞いたことだが、大阪商業大学・中小機構近畿支部の創業実践セミナーで面白い質問を受けた。
コンビニエンスストアは、商品の値段は安くはないし、店員がお勧めの商品を薦めてくれるようなサービスもない。心のこもったおもてなしをしてくれるわけでもない。なのに、なんで客は車に乗ってまでコンビニに行くのか。
講師の方のプレゼンテーションはとても上手かったので、名前を失念してしまったのが悔やまれる。その方はこう言われた:「コンビニエンスストアは、『不便』を解消しているのです」と。コンビニエンスは「便利」という単語であると。
起業にあたって必要なものは、資本金(最低1000万円、これは主に最初の年の自分の生活費と事業の設備投資・運用費に消える)に加えて、「ニーズ」がなければ成り立たない。ファミリーレストランが並んでいる通りに高級料理店を出しても当たらないのである。そういう通りには、焼肉チェーンや回転寿司などが立ち並んでいることだろう。
起業しようとしている人間は、そいつがイカれてさえいなければ、何らかの金になると思っている技術やアイデアを持っている。これを講師は「シーズ」と呼んでいた。シーズはニーズになって初めて金になり次の運転資金となる。では、ニーズをどのように探したらよいか。方法は一通りではないし、誰にでもわかる方法があれば今頃は皆金持ちだ。
講師の方は、シーズをニーズに変換するのに着目すべき点を3つ挙げていた:
さらに、この3つを覚えやすいように3Hと呼んでおられた。起業人は 3H に着目すれば、自分のシーズをターゲットのニーズに替えられるのではないかと。
晩飯の話がいつのまにかベンチャー起業の話にまで及んでしまったが、自炊とて自分の持っている調理スキルと冷蔵庫の中身をどのようにして自分が満足させられるかに変換させる行為だとすれば、晩飯における 3H の解消は見逃せない重要な点なのである。そして、趣味としてのコーディングや研究のテーマ探しにも共通して見てとることができるのである。
まあ、要するに、散らばった話をまとめると、夕飯のメニューを考える最良の時はハラヘリのとき、すなわち昼飯前ってことだ。新しいサービスやソフトウェアを作るときにも、そのタイミングが重要であることもあろう。
なんか、メールも出さずに自分のブログで舞い上がっちゃってすみません。自意識過剰です、自意識過剰です。同僚の人に「名古屋に行ったとき、いけがみくんの名前を知ってる人がいたよ、どういうこと」とか言われて嬉しくなってしまったのです。これはもうお知り合いになりたいな、と。
遅くとも 1/12 には宿とスケジュールを確定するつもりでいます。1/26, 27 のどちらも都合がいいし、26 日の懇親会に参加してくださってもお会いすることができると思います。
懇親会の出欠は 26 日の会場で取るのだと思います。プログラムに参加の条件が書いていないので、おそらく、どなたでも講演を聴講したり、懇親会に参加することはできるのでしょう。
1/27 なら、最後のご発表のあと、愛知工業大学の方との打ち合わせの先約があって、17 時以降から時間の余裕が取れます。27 日は名古屋に宿泊しますので、そのあとの夕方は自由です。
肩の力を抜いた居心地の良い話ができたらいいなと思っています。よろしくご検討ください。
いたるところで、 unsafePerformIO を見かけるようになったのでひとこと言うといたるわ。「Unsafe やって書いてある」やろ。おっと、地が出てしもた。
unsafePeformIO はもともと Haskell の規格 Haskell98 にはありません。初めて現れたのは、 "The Haskell 98 Foreign Function Interface 1.0 An Addendum to the Haskell 98 Report" の 5節 Marshalling についての、5.1 節 Foreign モジュールが提供するインターフェースについてです。
unsafePerformIO :: IO a -> a
Return the value resulting from executing the IO action. This value should be independent of the environment; otherwise, the system behaviour is undefined.
If the IO computation wrapped in unsafePerformIO performs side effects, then the relative order in which those side effects take place (relative to the main IO trunk, or other calls to unsafePerformIO) is indeterminate. Moreover, the side effects may be performed several times or not at all, depending on lazy evaluation and whether the compiler unfolds an enclosing definition.
Great care should be exercised in the use of this primitive. Not only because of the danger of introducing side effects, but also because unsafePerformIO may compromise typing; to avoid this, the programmer should ensure that the result of unsafePerformIO has a monomorphic type.
[5.1 Foreign - The Haskell 98 Foreign Function Interface 1.0 An Addendum to the Haskell 98 Reportより引用]
ね、めったなことじゃ使っちゃダメだって書いてあるでしょ。ただ、型があまりにも便利そうなので、初心者は使いがちである(特に IO モナドを理解していない人)。unsafePerformIO は Foreign Function Interface (FFI) のために必要になったのであって、IO を外すために作られたわけじゃないんだ。
Haskell では、main :: IO ()なので、プログラムを書くときはいつも IO モナドの中に閉じ込められることになる。これが、慣れないときは気持ちが悪い。つい、IO a から a を取り出したくなって unsafePerformIO :: IO a -> a を使いたくなる気持ちはとてもよくわかるんだ。でも使ってはならない。
まず、ほかの言語から Haskell に入ってきた人は、グローバル変数が欲しくなる。関数の引数に付け回して獄門!というのが気持ちが悪い。もちろん、Haskell プログラマはそんなことはしない。初心者が触りやすいインターフェースを持つ、Data.IORefというのが用意されている。
別の目的でグローバル変数が必要になることもある。並行プログラミングにおいて、複数のプロセスが同じ変数を参照するときである。これについても、Data.IORef の atomicModifyIORef :: IORef a -> (a -> (a, b)) -> IO b を使えばよい。
初心者から脱却して、State モナドの意味がわかってくると、グローバル変数を使う目的で IORef はむしろ邪悪だということがわかる。変数をよりローカルに安全に参照・更新するために Reader/Writer State モナドを使うようになる。
さて、こういった、Haskell ライブラリ固有の事情はともかく、まず最初に関数型言語Haskell の特徴のひとつを思い出して欲しい。 Haskell には、代数的データ型がある。これはグローバルに参照することもできるし、スコープを制限することもできる。
たとえば、プログラムに与えられた引数のリストを知りたいときを考えてみよう。System.Environment ライブラリの関数 getArgs :: IO [String] がそれである。ここで、安易に unsafePerformIO をかまして [String] を得たくなる気持ちはわかるが、それは危険なうえに、Haskell的ではない。
以下、プログラムに与えられた一番目の引数 n が "-" で始まってなければ、"Hello, " ++ n を表示し、さもなければ usage を表示するプログラムを Haskell で書いてみよう。読者の Haskell 歴はまちまちであろうから、ソースコードを全て書いてから説明に移ろう。
module Main where
import System.Environment(getArgs)
main :: IO ()
main = do args <- getArgs
case args of
[x] -> printHello x
_ -> showUsage
printHello :: String -> IO ()
printHello x = do if null x || head x == '-'
then showUsage
else putStrLn ("Hello, " ++ x)
showUsage :: IO ()
showUsage = putStrLn "Give a name after the command name, please."
これについては、まあ、異論はないと思う。unsafePerformIO の入る余地はない。
次に、これと同じ事をするプログラムを getArgs の代わりに System.Console.GetOpt ライブラリを使って実装してみる(overweight だが比較のために)。こいつは GNU getopt ライブラリを使ったことがある人はすぐに使えるし、そうでない人でも各関数の型と説明を見れば使い方がわかる。 getOpt は IO モナドな関数ではないので、これまた unsafePerformIO を使いたくなるが、使ってはいけない。
module Main where
import System.Console.GetOpt(ArgOrder(..), getOpt)
import System.Environment(getArgs)
main :: IO ()
main = do args <- getArgs
let (_, n, e) = getOpt RequireOrder [] args
if null e then printHello n
else showUsage
printHello :: [String] -> IO ()
printHello x = do if null x
then showUsage
else putStrLn ("Hello, " ++ head x)
showUsage :: IO ()
showUsage = putStrLn "Give a name after the command name, please."
今回の例では、作成したプログラムのオプションに引数が出てこなかったので、unsafePerformIO が必要ないのは当然である。そこで、引数があってすら unsafePerformIO が必要ないことを言おう。オプション "-q (or --quit) name" を付けたときは、"Hello, " の代わりに "See you, " と言おうではないか。さあどうするか。引数を下位の関数に次々と回さなければならないのだろうか。そんなことはない、ということを以下に具体例で示す。
module Main where
import System.Environment(getArgs)
import System.Console.GetOpt
(ArgDescr(..), ArgOrder(..), OptDescr(..),
getOpt)
data Greeting = Hello
| SeeYou
greet :: Greeting -> [String] -> IO ()
greet _ [] = showUsage
greet Hello x = putStrLn ("Hello, " ++ head x)
greet SeeYou x = putStrLn ("See you, " ++ head x)
data Action = Quit { seeYou :: [String] -> IO () }
options :: [OptDescr String]
options = [Option ['q'] ["quit"] (NoArg ' ') "Say bye."]
getAction :: Char -> Action
getAction c
= case c of
'q' -> Quit { seeYou = greet SeeYou }
_ -> undefined
main :: IO ()
main = do args <- getArgs
let (c, n, e) = getOpt RequireOrder options args
if null c
then if null e
then greet Hello n
else showUsage
else seeYou (getAction (head c)) n
showUsage :: IO ()
showUsage = putStrLn "Give a name after the command name, please."
まとめ:unsafePerformIO を用いずにオプションと引数を使いまわすコツは、代数的データ型に IO アクションを持たせることです。代数的データ型はモジュールの中ではグローバルに参照することができ、モジュールの外にエクスポートすることも可能です。getArgs から getOpt 経由で IO アクションを渡す関数を書いてあげればよいのです。
[補足 1.]Simon PEYTON JONES, "Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell", Tech. Rep. the 2000 Marktoberdorf Summer School, Feb. 5, 2008.[PDF] 2.6 Leaving the safety belt at home 節に書いてあるように、処理系によっては unsafePerformIO をいろいろな用途で用いることができる(該当チュートリアルのAbstract)。しかし、こういうことは ghc の中身に詳しい Simon だから言えるのであって、真似をしてはいけない。unsafePerformIO は Haskell 処理系の実装に依存する。
[補足 2.] その他 unsafePerformIO の濫用を警告している記事リンク
[どうでもいい補足 3.]
「unsafePerformIO について、詳しく説明しているとこない?」って freenode#Haskell で聞いたら、「お前がそれを聞くのは初めてかもしれないが、俺たちがそれに答えるのはこれで100回目だ!」って言われた。これは冗談で、いろいろなことをきちんと教えてもらえましたけどね。
BSD /bin/testの Haskell による実装例。オプションが猛烈にあるのはご存知の通り。
今回紹介した Simon PEYTON JONES のチュートリアルが行われた Marktoberdorf Summer School というのは大変すばらしいところなので、行く機会があったらぜひ行くことをお勧めする。
Real World Haskell (第一版)では、適切に unsafePerformIO を説明している。それは、Chapter 17. Interfacing with C - the FFI p.424 である。前に述べたように、unsafePerformIO は主に FFI のためにある。
While it is possible to do IO in Haskell, this is only spoken of in whispers, and there is only one function to do IO: System.IO.Unsafe.Really.IMeanIt.reallyReallyAbsurdlyUnsafePerformIOShameOnYou.
[Haskell(en.Uncyclopedia)より引用]
いけがみも博士課程を卒業して、5年以上経ち(辞めないで、よく勤めたものだと感心した)、時には査読を依頼されるようにもなった。ただし、いけがみの書いたものは少ない上に、その分野が複数にまたがってしまっているため、メジャーな分野でバリバリ発表なり論文を書いている人に比べると、査読を頼まれる回数は圧倒的に少ない。本当の理由は、いけがみが「ぷろふぇっしょなる」だと認知されていないことにある。それは正しい。ここで書いているように「まっど」である。
さて、大学授業の心得で参考に挙げた、Krantz 先生はもう一つ面白い本を書いています。『数学者の書きもの心得 ー 英語表現から出版まで』
この本には、様々な事柄について簡潔かつ必要十分な情報がつまっているので、お勧めします。査読を依頼されたときについて、Krantz 先生がおっしゃっていることをまとめてみました:
依頼されたときは、原則として断らないこと(注:何が原則かは後述しよう)。論文誌編集者は、査読者を「その分野におけるプロフェッショナル」だと考えている。査読の目的は「論文誌にふさわしい論文であれば、それを丁寧に推薦すること」であり、守るべきことは「〆切」であり、やってはならないのは「些末な事柄を指摘すること」である。
このことを適用すると、リジェクトする場合は、「推薦できない」理由があるときであり、修正付きで採択を認める場合は、「いくつかの不備を除けば、推薦できる」ときである。
もう一つ気をつけなければならないことは、論文誌の性格である。厳格な論文誌であれば、推薦するにあたってはその新規性と正当性と将来への期待がなくてはならない。逆に、そこまで厳格でない論文誌や速報、会議であれば、重要視するのは「推薦できるレベルにある」ことである。これは、査読者の気持ちにもよるが、「よく書けているので推薦する」ことと「まあ、採択しない理由が見つからない、というような気持ちで推薦する」の間を彷徨うことになろう。
査読には時間がかかる。査読にかける時間と、自分の研究に費やす時間はトレードオフになる。査読は原則として引き受けよ、と前に述べたが、時間がないときはしかたがないものだ。断るべきである。断る時のマナーとして、できることなら、自分以外にバトンを渡すのがよいらしい。編集者は、普通、推薦者の名は秘匿する。
Doing reviews takes time. On average, an experienced reviewer spends about 2 hours reviewing a 12-page conference paper, and 4-8 hours reviewing a 15-page journal paper. If you are inexperienced, you need to schedule more time. Before accepting to do reviews, be prepared to dedicate enough time to them.
["How to Write a Review?", by J.P. Martin-Flatin and E. Lupu, April 2004より引用]
これを読めば、論文をリジェクトされた経験のある方は「査読者は論文をきちんと読んでいない!」と感じたことについて、合点がいくと思う。慣れた査読者は、12 page の会議論文(two columns が多い)の査読に、たったの 2 時間しかかけないのだ。
ともあれ、少なくとも私はそこまで非情もなれないし、決断力もない。したがって、より多くの時間を必要とすることになる。査読にあたっては、それぞれ査読のフォームが決まっていることが決まっていることが通常だが、私はまず "How to write a good review paper"[PDF] に書かれている「四節原則」を実行する。これが査読の最初のプロセスになる。バージョン管理ツールを活用するために、initial patch として、元論文。元論文で引用している参考文献をひたすらかきあつめて record (全部読む必要はない)。で、「四節原則」を書いたテキストを作り record 。これが最初のプロセスである。これだけでも、2 時間以上は絶対かかると思うのだがどうかね。
二番目のステップは、「四節原則」と重複する部分も多いが、Krantz 先生の本や、さきほど挙げた "How to write a review?", Martin-Flatin and Lupu, 2004 を参考に、丁寧に論文を読む。忘れてはならないのは「推薦できるか否か」の二択である。最後に、編集者からもらったフォームと〆切を守ることを忘れないこと。
論文を書く人は、推薦できると説得できる論文を書きたまえ。
なお、Krantz 先生の和訳書で勧められるのは、二冊しかありません。他は洋書で直接読んだほうが身に付くと思います。Krantz 先生期待の新作(もうすぐ発売予定らしい、これが届くと蔵書のちょうど1,300冊目となる) "The Proof Is in the Pudding: The Changing Nature of Mathematical Proof"
学部のとき、いわゆる就職活動をしたのだが、履歴書に書く「趣味」欄に何を書いたらよいものか迷った。というのは、趣味といった趣味を持っていなかったからである。
年をとった今、考えるとそれも当然で、アノ頃は「やるべきことをやるだけ」という時間の使い方をしていたのだ。現在はそうでもなくなった。
今月の連休に行ったこと(これが、趣味というものなのだろう):
査読のときにも触れたが、時間は重要である。最近は、何よりも拘束されない時間が重要だと感じるようになってきている。以下の本も訳書ではなく原著をお勧めする。(前にも紹介したことがあるのだが、どうやら新版がでたらしい、ハードカバーからペーパーバックに落ちたのね、僕はこの本の 「すべて」には賛同できない)
職場でも居室でも論文は読むのだが、分量が違いすぎる。職場で読むほうが圧倒的に多いのである。一日あたりをいうと、少ないときは0本(ここは笑う場面です)、多いときはこれは例外的でちょうど70本読んだ。
70ってのはおかしすぎで、実際読んだだけで一日を終えた。これは、詳しくはいえないが、「対象についていけがみがよくわかっていない論文」の査読を依頼されたときである。しかし、著者の主張の解決策は理解できたし、私が詳細に確かめるのも悪くはないかと感じたのだった。そこで、編集者に「私、その対象については、門外漢ですが、査読にあたって最大の努力はしますよ、それで不都合があれば査読者を下ろしてください」というようなやりとりがなされたあとで、査読した(実際、差読者は複数いて、対象の専門の方も査読をなさるということだった)。
で、査読論文の1次参考文献、2次参考文献(1次が引用しているもの、以下同様)、3次参考文献全部と、いわゆる "Introduction to ..." で始まるものをいくつか集めてみた。この段階では集めただけで読んでない。ていうか、何件あるか忘れたくらいたくさんあった。
査読論文の Introduction に書いている情報と、これらの収集物から、私が知らなかった「対象」が何であるかを理解するのにさほど時間はかからなかった。そういう意味で、編集者が私を選んだのは適任だったといえる。しかし、論文誌に権威があるため、推薦するためには「新規性」と「重要性」の二つを言わねばならない。どこかに、同じ手で解決してしまっている論文はないか、あるいは、もっと強い結果を出してしまっている論文はないか、これはある意味 悪魔の証明 である。まあでも、掲載されたあとで、それダサいとか言われると、いくら匿名とはいえ悶え苦しむはめになるので70本という数字がでてくるわけである。この査読は締め切りを守った。
査読は匿名のボランティアであって、給料はでない。給料の出る仕事に対する論文読みはどうかというと、最近の傾向は、だいたい一日平均で5から10本である。これは職業的研究者としては究極的に少ない本数であるが、いけがみはマッドなので、それでよいとされている。大変ありがたい職場である。代わりに、させられていることは…おっと職場の機密はここまでだ(という、契約を結んでいる)。
職場でどんな論文を読んでいるか、興味をお持ちの方もおられるかもしれないが、そういう方は我々の書いた論文・テクニカルレポートの参考文献を参照していただきたい。職業的研究者はブログなどで論文について何か述べる暇があったら、自分の論文を書くことに専念しているはずである(そして、ウェブサーフィンなどもしないので、このページも決して見ない)。
2008 論文ファイブとか見て、いいなーと思ったのだけど、上記の大人の事情で書けないことが判明した。内容が仕事と関連すると、あとで呼び出されるから(なんで読んでるんだよ、おかしいね)、Haskell に限定する。気に入った論文を読めばいいと思うよ。リンクは、各著者のページとなっている。
Haskell 98 策定者の一人。しかし、彼の興味は Haskell にとどまらないので(Java とか)、Haskell 以外の人も Wadler の論文を読めばいいと思う。しかし、論文も Wadler's Blog も相当に辛口の英語を使う人である。会ったことはないのだが。あなたが初学者なら、彼の言い方だけは真似しないことをお勧めする。Wadler くらいすごい人になったら、こういう言い方も許されるのだと思われる。
二人の Simon の一人。unsafePerformIO を自由に使うことを許されているたった二人のうちの一人。GHC の中身を熟知しているだけでなく、サポートツール Haddock, Happy, Alex, Cabal にも関与している。この人について言いたいことはいろいろあるのだが、余人におまかせする。最新の GHC の仕組みをしりたかったら、彼の論文を読むべき。
二人の Simon のもう一人。unsafePerformIO を自由に使うことを許されているたった二人のうちの一人。この人に聞きたいことはいろいろあるのだが、私にはその機会はあまり残されていない。Haskell 98 策定者の一人。最新の GHC の仕組みをしりたかったら、彼の論文を読むべき。
Haskell 98 策定者の一人であり、Haskellの Pretty Printer Combinator や QuickCheck, そして「なぜ関数プログラミングは重要か」の著者でもある。上級のスキーヤーであり、ゼミや会議中に皆を笑わせるジョークが好き。必ず大きな腰袋を提げており(中には何が入っているのか教えたりはしない)、部屋は PC のダンボール箱であふれかえっている。John の論文は、なんというか、面白い英文だ。たしかにイギリスっぽい。Arrow に関しては、まず John の論文を読むべきである。が、上級を目指さない Haskell プログラマにとっては関係ない。著名な監督(Home Aloneなど)と同姓同名なのでぐぐるのが難しい。keyword に Haskell を足すこと。
John からは「リーダーとは何か」を学んだ。たとえば、彼がリーダーになるとき、各メンバーに Wiki 上で 「アポなし訪問して構わない曜日と時間を必ず書け」と命令し、実際にそれを行う。彼は、アポなし突撃で「今、あなたは何が問題だと考えているのか」「困っていることは何か」「解決するためのアイデアを簡単に説明してみよ」などとジョーク交じりで要求し、適切かつ知性を感じさせるアドバイスを授ける。熟練した John がこれらのことを行うためには、たったの15分しか必要ない。まさかと思うかもしれないが、想像してみて欲しい。あなたが生まれて初めてスーパーマリオをクリアしたいと思っているとする。しかし、初めてのことなのでまだ達成できない。これが問題だ。ははは。これに対するアドバイスを 15 分で行うことは可能である。そうだろ。John はとても親切で優しい(ただし、相手によるのは、もちろんのことである)。リーダーがチームのところに訪れてアドバイスを行うという行為を、僕は John から学んだ。もうひとつは、進捗状況を報告するミーティングのやり方である。彼は長い時間のミーティングを好まない。15 分で終わらせる。円卓に座り、隣から順番に、今週の進捗を簡潔に述べさせる。スーパーマリオの例をもう一度出せば、A : スタート地点のクリボーに激突 B: ワープできることを知った、こいつはすげえ C: ブロックにのめりこめることを見つけた、これはバグなのか? ... そして、これは強調したいのだが、 Z : nothing! この参加者を寛容にも許すことである。nothing というのはファミコンの電源すら入れていないことを意味する。が、これでもよい。ミーティングで、他者の進捗状況を知るので、それぞれ自然と競争原理が働くのである。糾弾することは簡単だが、それはチームの士気を下げるだけで、何のメリットもない。John は大好きな叔父のような人物なので、紹介に熱が入ってしまった。
Koen は John と一緒に QuickCheck を書いた、という意味で Haskell hacker なのだが、彼の研究の興味はこのリストに載せた人物からすこし外れている。というか、Haskell っぽくない研究と Haskell に関する研究の両方をバランスよく行っているという意味で、僕が見習いたいと感じる。論文リストを見ると、どのようにしてそのバランスをとっているかがわかる。いつぞやのスキー旅行では、リーダーとして見本を見せてくれた。「ありがとう」を相手の国の言葉で言うことにしている、という彼の態度を私はいたく気に入っている。Tack.
品の良い Haskell 入門書を書いた人。それについては、過去にさんざんここで書いた。論文リストに、Haskell プログラマが上級になるために読むべき論文がいくつもある。上級を目指さない人はどうでもいい。
Conor McBride はとても特別な人だ。論文も面白いが、国際会議での発表を見る機会があれば、ぜひ見ることをお勧めする。k.inaba さんはひとつだけ挙げていたが、上級を目指す Haskell プログラマは、Conor の論文を全部読むべき。上級を目指さない人は Conor にとっても関係ない人だろう。
以上、駆け足での紹介になり、5人ではおさまらなかったので有名すぎるほど有名な7人にしてみたが、本当に紹介したい人はまだまだたくさんいる(Conal Elliottとか、Peng Liとか...)。上級初級問わず、Haskell プログラマは The Haskell Sequence | News about Haskell を購読するべきである。
Haskell に関する発表があると聞いてすっ飛んでいきました。ていうのは、ひとつの口実で、本音は名古屋大学に行ってみたかった。ガリグ先生が素敵だった。
[2009-02-03:追記] 2009-01-27(火) に参加した OCaml-Nagoya の参加記です。
ヒビルテのOCaml-Nagoyaの飲み会に参加というのが楽しそうだったから、というのと、去年のFLOPS2008で、私のことを知っていた人がいた、というのを耳にしたので、一度お邪魔したかったのでした。去年は今年以上に体調が悪かったので、どちらも参加していませんでした。
小笠原さんとよしひろさんには、前日の懇親会の前の空白の時間と当日の、名古屋大への移動でお世話になりました。ありがとうございます。特に、よしひろさんとはもう少しですれ違うところでした。あれは不思議なもので、いったん駅に向かったあと、「ここは引き返すべきだろう、JK」みたいな気持ちがふっと沸いたんだよね。で、ひき返したらよしひろさんと出会えたという。
迷惑がかかるといけないので、名前は出しませんが、院生室でくつろがせてもらいました。名大の皆もやさしかったです、ありがとう!けいごさんと同輩の方には、最終日の帰りに宿まで送ってもらいました。これは本当に助かったです。
あとでわかったことなのですが、参加者のブログは私の巡回先にしっかり入っていたという。なんだ、みんな OCaml-Nagoya の人だったのか...
で、当日ですが、私は 72 回 PRO の準備に意外と手間取りまして、(情報処理学会に参加すること自体が初めてだったということもある)発表スライドは手抜きでおにいちゃんのlessプレゼンを使いました。準備するものは、発表スライドの順番に対応する名前のテキストファイルです。プレゼン資料のディレクトリはこんなかんじになります。lessプレゼンは知らなかった人もいたみたいです。連番のファイルの扱い(特に名前の付け替え)や、正規表現をファイルに全部適用、みたいなオールドタイプな技さえ習得していれば、ストレスなくプレゼン資料を作れます。zsh + screen 推奨。参考までに、lessプレゼンmeets高橋メソッドという、さらなる発展版(これもlessプレゼンの発明者の人の改良版)があります。エスケープシーケンス使えば色とかマスクとか使えるんだね。今回は、そこまで頑張る気力はなかった。
私の発表内容: 自己紹介のあと
皆さん、わりとフツーでした。ていうか、Work for Work(W4W) は敵だよな、やっぱり。よしひろさんが、Coq は coqtop でコピペ多用、というのに驚いた。それは本当にすごいことだ。
私は逆に Emacs 上の haskell-mode の紹介をしたり。きちんと説明しませんでしたが、Emacs22 標準の FlyMake と、補完機能を一部拡張したりしています。あと、最近できた hlint の hlint-Emacs 版など。ネットワークにつながってないので Hoogle 拡張やHayoo 拡張とかはお見せすることができなかった。お手軽テスト環境も QuickCheck の説明が必要になるので、スキップ。などなど。
ここらへんの Emacs tips は、Haskell界隈で共有していて Haskell mode for Emacs - HaskellWiki に書いてあることばかりです。非常にどうでもいい文末空白削除術なども使っていたりする。
Why - a software verification platformのアイデアがすばらしいんだけど、Caduceusのサンプルの一番最初が動かないっていう。これは当日もどうにもならなくて、もうしばらく手を動かす必要がありそう。
Haskell は OCaml より遅いよね。コンパイル時間とか、実行時間とか。ghc 以外の処理系もざっと紹介した。lhc も。
レゴブロックみたいに結合。ループもあるよ。
今後のアイデアとか。まずは、Frisby の改良を最初のマイルストーンにする予定。
私の話は以上でした。逆に、OCaml-Nagoya の人から聞いた話:
とか、小笠原さんをはじめとする OCaml/Coq な人たちの雑談とか。大変ためになりました。何か記憶から抜けているところがあったら教えてください。中華もからくておいしかったです(辛いもの好き)。
帰りはけいごさんと同僚の人(すみません、名前お聞きしたんだけど)に、宿まで送ってもらいました。とても助かりました。また機会を見つけて来たいなあ。そのときは、もっと OCaml 触っておきます。Coq は実はさんざん触っていたりします。いろいろ忘れかけてきたけど。
RSS feed を再開しました。RSS の思想を尊重するために全文配信はしません、あしからず。