2006-07-07[n年前へ]
■「プログラミングスタイル」と「こころを喜ばせる科学」
from n年前へ.
A: 美人プログラムスタイルって、なんですか? G: 中身は別にして、眺めるだけで幸せになる プログラムじゃ 。A: ははぁ、アルゴリズムやクラス構造などの 中身でなく、外見重視なんですね? G: 昔から「色白美人は、七難を隠す」というじゃろ。 A: え、つまり、バグが7個あると言うんですか?
科学は応用を通じて実生活に関わり、知的追求というこころの喜びにも関わる二面を持っています…多くの人に、こころを喜ばせる科学を楽しんでもらいたいですね。 H.Hirax, A.Kurotani
2006-07-17[n年前へ]
■小さな庭でゴジラがノリノリ・ダンス
ここ何日か、Mac OS X 上でプログラミングをしている。Macintosh上でプログラミングをするのは、(「Macintoshプログラミング100の定石」を使っていた)10年振りくらいだ。7, 8年振りということは、名前は同じMacintoshでも、全くの別の世界だ。ソフトウェアの構造も全くわからないし、ユーザ像だって全然想像がつかない。それどころか、ファイルコピーの仕方すらわからない…。
一体、どうしたものかなぁ…?と悩んでいると、ちょうどmixi内のユーザ日記ページで「Macユーザの方に質問」というエントリが書かれていた。「平均的Macユーザはシェルなんか使わない」というような内容で、わきあいあいと意見を交わしている。なるほどね…と思いながら興味深く読んでいると、とんでもなく面白い出来事が始まった。わきあいの井戸端会議に、いきなりスーパー・ハッカーが混じっているのである。そして、「Terminalからirb(Rubyの対話処理コマンド)を起動しよう」「FireFoxのツールメニューから"JavaScriptコンソール"を起動しよう」と「全世界ハッカーになろう!」運動を始めていた…。まさに、「小さな庭で(超人)ゴジラがノリノリ・ダンス」状態だ。あぁ、なんて面白い世界なんだ。
2006-10-09[n年前へ]
■「オッパイ星人」だって、ハッカーになりたい……!?
■ 「ハッカー」でない私ですが…
高校時代の同級生だった川合史朗さんからバトンが回ってきましたが、私は「ハッカー」ではありません。コンピュータを使い出したのは'80年くらい*1でしたから、コンピュータ歴だけは長いことになります。けれど、プログラミングをしていたと言えるのは、地震予知のための計測システム開発*2のためにCで岩盤変形のシミュレーション・プログラム*3を組んでいた大学院時代だけで、「ハッカー」の「ハ」の字も知らないうちに現在に至ってしまいました。たまに、遊びで小さなプログラムを作ることもありますが、アイデア一発型のネタばかり*4で作った後はいつも放置してしまう…という情けない状態です…。
そんな私ですが、スイカに塩を振りかければより甘くなる、という例もあります。ハッカー猛者の方々に「ハッカーになれなかった人」が混じってみるのもちょっと面白いかもしれない*5と期待し、ハッカーの気持ちを適当に想像(妄想)しながら*6、思いついたことを書いてみます。
*1 あまり表だっては言いづらいのですが、秋葉原でapple][ コンパチの部品を買って組み立て使っていた世代です…。
*2 この研究を数年後に引き継いでいたのが「スーパー・ハッカー」近藤淳也 はてな社長です。私とはまさに天と地ほどの差がある方です…。
*3 そのときに使った参考書が「C言語による有限要素法入門」著者は(今ではベストセラー推理小説を量産する作家として有名になってしまった)森博嗣氏です。
*4 日本語変換のATOKにPerl・Ruby・Cなどで各種拡張機能をさせるプログラムとか、ノートPC内蔵の加速度センサを利用して立体ディスプレイモドキを実現するソフトとか…。
*5 なにしろ、川合さんが私にバトンを放り投げた理由も「見慣れた面子ばかりだと面白くないので、趣向を変えて(ハッカーというわけではないが)平林さんを」なのですから… _|‾|○
*6 2006年3月号で高林 哲氏がハッカーの習性として書かれていたハッカー精神「深追い、佳境、バッドノウハウ」と共通することもあるかもしれません→「オッパイ星人とバッドノウハウ」を参考に。
■ 「自分のための勉強」を楽しくやろう
就職して数年した頃、「自分の知識・技術を向上させる機会」や「考えたことを残しておく場所」がほとんどないことに気づきました。そこで、自分が知りたいことを定期的に学び・考えてみることにしたわけです。そして、その「学び・考えた」結果を残しておく場として作ったのが、"hirax.net"です。ですから、サイト"hirax.net"というのは私にとって「自分のための勉強ノート」です。
当初、この「自分のための勉強ノート」は勤務先のイントラ内サイトとして作りました。しかし、企業内インフラの利用制限が厳しくなってきたこともあり、'98年頃に勤務先のイントラ内部から外のインターネットの世界に引っ越して、現在の"hirax.net"になりました。また、それと同時に「自分のための勉強ノート」の内容を「役に立たない(ように見える)こと」に変えました。それは、「書く内容を業務から離れたものにする」ためです。企業内で研究開発という仕事をしていると、やはり業務内容に近いことを考えていることが多いわけですが、そういう内容を外で公開するわけにはいきません。そこで、(勤める会社のためでなく)自分自身のために「高度な技術」を勉強するけれど、その技術を適用して考えてみる対象・内容は「実利的には何の役にも立たないこと」にしよう、と決めたわけです。
その結果、流体力学のナヴィエ・ストークスの方程式の解法プログラムの勉強をするけれど、その計算対象は「スクール水着の周りの水の動き」であったり…、有限要素法のプログラムを勉強はするけれど、その解析対象は「女性のバスト」であったり「男性のアレ」だったり、ということになってしまいました…。つまりは、それが、"hirax.net"の「高度な技術を無駄に使う」というスタイルです。そういうスタイルにしたことで、「自分の勉強」を楽しくやることができました。何しろ、難解な流体力学の教科書も(女性のバストと同じような感覚を空気抵抗で再現することができると想像すると)ワクワクする気持ちで読むことができますし、行列計算プログラムを作る作業も(女性のバストの変形を計算できると思えば)素晴らしく楽しい作業に変わるのですから*7。
*7 男とはそういうものです(女性読者の方々へ)。なお、女性のためには、科学の粋を凝らした「豊胸ブラジャー」「美人化ソフト」も用意しています。
■ 「やりたいこと」はやってみないとわからない
「自分のための勉強ノート」ですから、いつでも私は「自分がやりたい」勉強をしていました、と言いたいところですが、そういうわけではありませんでした。なぜかと言うと、「自分のやりたいこと(勉強したいこと)」はこれだ、と自分でハッキリわかっていなかったからです。「(自分がやりたい)何か一つのこと」がよくわからないまま、「ずっと、その場その場で気になったことを勉強して(遊んで)きた」感じでした。その瞬間その瞬間の好奇心の赴くままに、目の前の謎・パズルを(その秘密を解くことができそうな科学技術を勉強しつつ)、楽しみながら考え続けるということを長く続けているうちに、自分のやりたいこと、「楽しくなる科学技術」という方向性*8がようやく見えてきたというのが本当のところです*9。
「やりたいこと」をいきなり思いつき、一晩ノリノリ体力バリバリにプログラミングをして、それを作り出すことができるスーパー「ハッカー」も世の中にはいるだろうと思いますが、私のように、「自分のしたいこと」を自分自身でもよくわからないという方も多いと思います*10。そんな人(時)は、とりあえず何でもいいから続けてみるのもコツだったりするのかもしれません。そうすれば、「将来長い時間をかけて自分がやりたいこと」も浮かび上がってくるだろうし、そういった「将来・現在やりたいこと」が「これまでにやったこと」と繋がってくること*11も多いと思うのです。
*8 Tech総研の編集者いわく「平林さんのやりたいことは、科学技術と男と女ですね、」だそうですから。
*9 「数字がバラバラに書いてあって、その数字を順番になぞっていくと最後に絵が浮かび上がるパズル」みたいなものですね。
*10 川合史朗さんが訳されたPaul Grahamの「知っておきたかったこと」には、若い人がやりたいことを見つけるにはどうしたら良いかが書かれています。
*11 自分用のプログラム・ライブラリを作っていくと、作業が楽になるようなものです。
■ 「長く続ける」コツ
「とりあえず何でもいいから続けてみる」と書きましたが、「続けるということ」は実は難しいことだろう、と思います。(飽きっぽさでは天下一品の)私が比較的長く続けることができた理由の一つは、「その瞬間その瞬間の好奇心の赴くまま」=「いつでも、その瞬間に好きなことを楽しんでいた」からだったと思います。だから、飽きることなく(内容は実は変わっているわけですから)続けることができたわけです。
「自分の好きなことをする」と長く続けることができると思うのですが、そのためには「自分の好きなことを見失わないようにする」ことが必要です。そして、「自分の好きなことを見失わないようにする」ためには、「他人の感想を(あんまり)気にしない」ということが一番です。一回、自分のイメージをどん底まで突き落としてみるのも良いかもしれません*12。
自分が「これは凄い!」と思うことが、他の人にとっては「これ、何だか全然面白くないなぁ…」と感じられることはよくある話です。人それぞれ、好みも背景も色々なことが違うのですから、それは当然です。「ただ一つの正解があるようなこと」を追求したいなら別だと思うのですが、そうでない「自分の好みを追求」しようとするならば「他人を参考にして学ぶのは良いけれど、あんまり他人の感想は気にしない」ということが結構良いような気がします。他人の感想を気にしすぎると否定的な感想に凹んでしまうこともありますし、他人の期待に沿ってやることを変えていってしまうと、いつの間にか「自分の好きでないあたり」まで流れていってしまうことも多いと思います。
*12 私の場合、「オッパイ大好きな変態じゃないの?」というような感想を言われまくりで、自分のプライドなんかどっか遠くに消えていってしまいました。その結果、他の人の感想(的確な指摘とも言う)を気にしないというワザが使えるようになったのです…。
■ やっぱり他の人に伝えたいから「わかりやすく」
他人は自分とは違うものですから、他の人をあまり気にしないようにしたいと思ってはいます。それでも、やっぱり「自分が楽しいと思うことを他の人に伝えたい」とも思っています。自分が面白いと思うことを見つけた時、それに共感してくれる人がいたらうれしいものです。他の人を過剰に気にしないようにした方がいいとは思う一方で、「自分の考えたこと・感じたことを他の人に伝え」「自分の作ったものを公開する」上で「他の人にもわかりやすく・他の人が眺めやすい」ようにしようという試行錯誤は続けていこうと思っています*13。
*13 そんな「他の人に伝える」ための試行錯誤の結果、面白く人にわかりやすくプレゼンテーションをするにはどうしたら良いか?という書籍「理系のためのプレゼンのアイデア」を技術評論社から11月に刊行予定です
■ 「バトン」が次に飛ぶ先は…?
さて、次回へのバトンは増井俊之さんに渡そうと思います。「わかりやすさ」「スーパー・ハック」を華麗に両立させている増井さんの秘密を伺ってみたいと思います。
2007-04-29[n年前へ]
■「無名関数」と「吾輩は猫である」
夏目漱石の「吾輩は猫である」は、雑誌「ホトトギス」に1905年1月に発表された。最初は、冒頭の章だけで完結する短い読み切り小説だった。
吾輩は猫である。名前はまだ無い。 …吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。どこへ行っても跳ね付けられて相手にしてくれ手がなかった。いかに珍重されなかったかは、今日に至るまで名前さえつけてくれないのでもわかる。数学ソフトウェア Mathematica でプログラムのスケッチ(素描)を作りながら、「この「名前はまだ無い・名前をつけてくれない」という言葉が頭の中に浮かんだ。
「吾輩は猫である」を連想したのは、Mathematicaの「純関数」の勉強のための練習題材を書いていたときだ。Mathematica の入門・中級の講習会に参加すると、この純関数とやらが登場した途端に、講師が話す内容を見失ってしまうことが多い。講師の筋道が見えなくなってしまう理由は、純関数の必要性・存在価値といったものが今ひとつわからないままに、純関数がいきなり登場してくるからである。もちろん、「(数値でなく)関数を引数として与える」ということに慣れていない生徒が多いこともあって、いつも、純関数が登場した瞬間に、何かその場が失速したような感覚を受ける。
話の流れ・必然性がなくても、文法をただ暗記することができる人であれば、おそらく何の問題もないのだと思う。あるいは、他のプログラミング言語をよく知っていて、文法の必然性が自然と理解できる人たちであったなら、これもまた問題は起きないのだろうと思う。しかし、私も含めて、入門・中級の講習会に来ているような、そうでない多くの人たちの場合は、純関数が登場した途端に、話についていけなくなることが多いように感じるのである。
Mathematica における純関数 "Pure Function" というのは名前(シンボル)を持たない関数で、ほかの関数への引数などとして、関数の内容を書いた一瞬だけ使われるものだ。もう少し違う呼び方をしてしまえば、つまりそれは「無名関数」だ。「無名」というところが重要で、名前がないから、使ったら最後もう二度と呼ぶ・使うことはできない、ということである。つまりは、「使い捨ての関数」だ。この「関数を使い捨てる」というところで、どうしても引っかかってしまう。値を入力するのであれば、あまり考えることなどせずに、数字キーを2・3回押せばすむ。だから、値に名前(シンボル)と付けずに、使い捨てにすることには慣れている。けれど、関数を書く場合には、(ハッカーでない私たちは)頭も多少使わざるをえない。すると、せっかく考えて・苦労して書いたのだから、名前をつけて、あとで呼んでまた使うことができるようにしたい、などと思ってしまうのである。使い捨ての「無名」ということと、苦労をともなう「関数」ということを、なかなか重ね合わせることができないのである。
そこで、自分なりの「純関数の存在価値・意義」を作ることで、その存在意義を納得したくて、純関数を使った例題を作ってみた。実は、それが前回の Spectrum Color Conversion を動かしているベース部分、「離散化を必要としない連続的なスペクトル演算・表示を扱うためのパッケージ」である。これは、無名関数(純関数)を使うための例題である。このパッケージを使うと、スペクトルを描くのに、
plotSpector[ (128 red[#] + 255 blue[#])& ];というような命令でスペクトルを描くことができる。これは「強度128の赤色と強度255の青色を足したスペクトル」を描けという命令なのだが、この中の
(128 red[#] + 255 blue[#])&という部分が、「強度128の赤色と強度255の青色を足したスペクトル」を表す無名関数だ。あるいは、
rgb=fitSpector[(D65[#]-128 cyan[#])&,red,green,blue]というのは、「シアン色が128載せられた色」を、赤色と青色と緑色で近似しろという命令であるが、この (D65[#] - 128 cyan[#])& というのも、「シアン色が128載せられた色」という無名関数である。こういう書き方をしてみると、スペクトルを示す「関数」ではあるが、見方によっては、スペクトルという「値」のようにも見えると思う。値のように見えることで、スペクトルを示す無名関数を引数として他の関数(命令)に渡すことへのアレルギーを低減してみようとしたのである。そして、(128 red[#] + 255 blue[#])& というようにあまり考えることなく直感的に無名関数を書くことができるようにすることで、その関数を使い捨てることへの違和感を減らそうとしてみた。さらに、こういった内容であれば、下手な名前をつけてしまうよりも、式そのままの方が内容・意味がわかりやすい、ということを実感してみようとしたのである。たとえば、(128 red[#] + 255 blue[#])& であれば、この式自体が「強度128の赤色と強度255の青色を足したスペクトル」という風に話しかけてくるように感じられ、下手に名前をつけてしまうよりは内容が見えることがわかると思う。
こんな例題を作ることで、無名関数アレルギーが低減した、と言いたいところなのだけれど、関数を使い捨てることには、やはりまだ慣れることができそうにない。関数を引数として渡すことは自然に感じられるようになっても、無名関数に名前をつけて、再度その関数を呼んでみたい気持ちはなかなか止められそうにない。名前をつけるより、その関数の中身をそのまま書いた方がわかりやすいとわかっていても、単純な名前をつけてしまいたくなる欲望はなかなか止められそうにない。
その理由を考えてみると、やはり、苦労をともなう「関数」を使い捨ての「無名」にしてしまう、ということに一因がある。そして、もう一つ、名前をつけることで、単純化して安心してしまいたくなる、ということがあるように思う。ほんの何文字かの関数であっても、その内容を自分の頭で考えるよりは、なにがしかの単純な言葉で表現された関数名を聞いて納得したくなることがあるように思う。
「吾輩は猫である」の第一章の最後、つまり、当初の読み切り短編小説「吾輩は猫である」はこのように結ばれる。
吾輩は御馳走も食わないから別段 肥りもしないが、まずまず健康でびっこにもならずにその日その日を暮している。鼠は決して取らない。おさんは未だに嫌いである。名前はまだつけてくれないが、欲をいっても際限がないから生涯この教師の家で無名の猫で終るつもりだ。「吾輩は猫である」を思い浮かべながら、無名関数について考えたせいか、それ以来、無名関数が「吾輩は~」と話しかけてくるような気がするようになった。無名関数を書くと、どこかで世界を眺めながら、「我が輩は青色と緑色を足した色である。名前はまだない」「名前はまだつけてくれないが、欲をいっても際限がないから生涯ここで無名で終るつもりだ」と無名関数が呟いているさまが目に浮かぶようになった。存在意義はあるけれど、無名のままの関数、そんなものを思い浮かべながら作ったのがSpectrum Color Conversion である。
2007-05-11[n年前へ]
■「画像ジェネレータ・サービス」を簡単に作るジェネレータ・サービス
15秒で作る画像処理サーバ
「画像ジェネレータ・サービス」を簡単に作るジェネレータ・サービスで、「画像処理ジェネレータ・サービス」を作り出す"Imagenerator"を作りました。例えば、下に貼り付けたのは、Imageneratorで作り出した「古いポートレート」ジェネレータです。このように処理ページを独立に作ることもできますし、下に貼り付けたように他のページ内に貼り付けることもできます。
一方、自分の画像を自分で変えて楽しむのはImagination You Makeです。現時点の「画像処理ジェネレータ・サービス」を作り出す"Imagenerator"とImagination You Makeが一番異なるのは、画像間合成機能とテキスト描画機能です。この二つの機能を知ることが、"Imagenerator"を使いこなすコツです。なぜなら、いわゆる(滝川クリステルジェネレータのような)「画像処理ジェネレータ」の面白さ・楽しさを決めるのは、マスク画像とコメントの内容であることが多いからです。もちろん、イラストレーション化や色調補正を用いた画像処理サービスを作るために使う場合には、マスク画像とコメントの内容がすべてなどということはありません。けれど、このような場合でも、マスク画像の使いこなし方を知れば、画像加工の種類を増やすことができます。あなたがマスク画像としてめにアップロードした画像は、いわば(あなたの)"Imagenerator"の機能拡張になるのです。
"Imagenerator"では、いつでも"CURRENT IMAGE"に対して画像処理がかけられます。"CURRENT IMAGE"と"MASK IMAGE"は、"Swap backup and current"ボタンを押すことでいつでも交換することができます。ですから、自分がアップロードした画像を"CURRENT IMAGE"として使うこともできますし、"MASK IMAGE"として使うこともできるのです。また、「"Imagenerator"であなたがPublishした瞬間のMask Imageが、ユーザーが画像をアップロードした瞬間のMask Imageになる、ということ」と「StartボタンとStopボタンを押すまでの作業だけが、ユーザーが投稿した画像に対して行われる」という2つのことが、マスク画像機能を使いこなすためにはとても大切です。
"Imagenerator"には、三種類の画像間合成機能があります。1つは、マスク画像の左上の点の色を透過色として用い、マスク画像とユーザ投稿画像を合成する機能です。例えば、左上の画像がRGB値で[255,0,0]の赤色だったとしたら、"CURRENT IMAGE"は"MASK IMAGE"の[255,0,0]の赤色に近い部分に"CURRENT IMAGE"が合成されたような画像になります。だから、雑誌の表紙風「画像ジェネレータ」を作りたい時には、「雑誌のタイトルや文字部分」以外を同じ色で塗りつぶし、画像の左上の点をその色にしておけば良いのです。「POPULAR SCIENCEの表紙」風画像ジェネレータは、そのようにして作成したものです。
2番目の画像間合成機能は、マスク画像をユーザ投稿画像の透過度合いとして用いることで、新しい画像を作成する機能です。例えば、黒背景に白い色で字を描いた画像を"MASK IMAGE"として用いれば、"CURRENT IMAGE"の「白い字」の部分だけが残り、それ以外の部分は白い色で塗りつぶされます。この種類の画像合成機能を使えば、ユーザがアップロードした画像を好きな形で切り抜いたりする機能を簡単に実現することができます。
そして、3番目の画像間合成機能が「顔合成用の機能」です。これは、"CURRENT IMAGE"と"MASK IMAGE"に入っている顔を合成する機能です。前もって、顔位置検出機能を使って、"CURRENT IMAGE"と"MASK IMAGE"の顔の瞳や口の位置を合わせておいて、"CURRENT IMAGE"の髪型や顔の形に"MASK IMAGE"の瞳や鼻や口を合成するのです。つまり、「他の人の髪・顔型を自分がしたらどうなるか」「自分の髪・顔型に芸能人の目・鼻・顔を合成したら、どうなるか」なんていうことを眺めることができる画像処理サービスを作ることができるのです。
また、現在の(吹き出し機能ではなく)単純なテキスト描画は"Imagination You Make"と違って、描画する場所を選ぶことができません。文字描画位置は自由ではありません。とはいえ、「ニュース画面などでは説明文章が下部に表示されることが多い」ので、画像ジェネレータを作る用途には、ある程度使いものになる…ことを願っています。