2008年01月


目次


2008年01月30日

1つの言語に囲い込まれるリスク

MatzがまたPHPの良くないところを批判して炎上してるなぁ。

唯一の言語に囚われるリスク

PHP使いの反論 @ Matzにっき:

たとえばPHPしか知らないとしたら、PHPの欠点を指摘されると自分のやり方全体が否定されたと感じるのではないだろうか。

なんとなく、他の言語も知っているが諸般の事情でPHPを使う、という人は「批判はわかる」と言っているような気がする。たとえば「Rauru Blog >> 悪いのはPHP自体じゃないかもしれないけど」とか。例に出して悪いけど。

(中略)

弾さんの 「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い でも指摘されているように私のPHP批判に怒っている人はあまり外のことを知らないで怒っているような気がするな。

今回の議論に関して上記のMatzの指摘については、コメント欄にある「根拠レス」という指摘があたってるとは思う。「外のことを知らないで怒っているような気がする」と「気がする」だから、別に根拠はなくて良いんだけど、とにかく根拠は提示してないよね。

うんと (2008-01-30 16:44)

なんだかPHP書く人(あるいは怒っている人)は、PHPしか書けない(と思い込んでいる)みたいに読めるけども、

それってソースあるの?

俺俺ソースで書きこんでません?

でもなー、このコンテキストを離れて、「一般に、1つの技術にロックインされた人はその技術を批判されると非生産的な怒りを表明しがち」というのは当たってないか。今回Matzに怒ってる人たちがそうであるかどうかは判断できないけど。

健全な反応

PHPは定期的にネタにされるを読んで、

日本のPerlハッカーの一人と認知されている小飼弾さんが、Rubyのダメなところを列挙したら、Ruby使いの人も反論するはずです。

には最初は「ねーよwww」と思ったわけです。

私の周囲のRubyistは「Haskellかっけー」と言って勉強して、「Erlangのグリーンスレッド実装はあんなに効率的なのに、Rubyはどうしてこんなに酷いんだ? ちょっとErlang勉強してみる」と言って勉強会開いて、「Perl6すげー。Rubyも真似しようよ」「いや、Rubyを捨てて乗り換えるんだ」「むしろこれからはScala」「Rubyだってここを直せば良い感じになる。このパッチよろ」っていう人たちだから。

弾さんがRubyのダメなところを列挙したら、事実に反するところは反論するだろう。でも、「どの言語でもダメなプログラムは書ける」とは言わない。Perlに比べるとRubyは押しつけがましくて拘束的な言語だから。Perlには自由があって、それは思想の違いだから「何でRubyではこう書けないの?」と言われたら「ま、Perlから見たらそうだよね」「でもRubyはこういう価値を重視してるから、そのためにはこういう形の必要があって、これでいいんだ」か、または「なるほど、ちょっとパッチ書いてみた」で終わる。

と思ったんだけど、それはあくまでもRubyに囚われてない人の話だよね。ロックインされてる人はやっぱり「Rubyばっかり悪いんじゃないやい。完全なものはないんだい(程度問題無視)」とか「Ruby最高 m9(^Д^)プギャー」とか言うかもしれない。現状で、Rubyが市場では新参であるためにRubyしか知らないプログラマはそう多くないから目立たないだけで。

結論

言語に囚われるのは良くないね。「無理」とか情けないこと言わずに、WebプログラマならPerl, Python, Ruby, PHP, Java, C#, JavaScriptぐらいは仕事で使えるレベルにしとこうよ。あと、楽しいからC++もやろうよC++。C++かわいいよC++。

本当に言いたかったこと

arcリリースおめでとう!


2008年01月29日

MacBookのハードディスク換装 後日談

MacBookのハードディスクを入れ替えた訳だが、その後色々あった。

その後インストールしたもの

$ port installed
The following ports are currently installed:
  apr @1.2.12_0+darwin_9 (active)
  apr-util @1.2.12_0 (active)
  atk @1.20.0_1 (active)
  autoconf @2.61_1 (active)
  automake @1.10_0 (active)
  bison @2.3_1
  bison @2.3_2 (active)
  bvi @1.3.1_0 (active)
  bzip2 @1.0.4_1 (active)
  cairo @1.4.12_0+atsui+pdf+quartz (active)
  clamav @0.92_0+darwin_i386 (active)
  coreutils @6.9_1+darwin_9 (active)
  db44 @4.4.20_1 (active)
  docbook-xml @4.5_1 (active)
  docbook-xml-4.1.2 @4.1.2_1 (active)
  docbook-xml-4.2 @4.2_0 (active)
  docbook-xml-4.3 @4.3_0 (active)
  docbook-xml-4.4 @4.4_0 (active)
  docbook-xml-4.5 @4.5_0 (active)
  docbook-xsl @1.72.0_0 (active)
  doxygen @1.5.4_0 (active)
  expat @2.0.1_0 (active)
  flex @2.5.34_0 (active)
  fontconfig @2.5.0_0+macosx (active)
  freetype @2.3.5_1 (active)
  fusefs @1.1_3+darwin_9 (active)
  gawk @3.1.5_2
  gawk @3.1.6_0 (active)
  gd2 @2.0.35_0 (active)
  gettext @0.17_2
  gettext @0.17_3 (active)
  ghostscript @8.61_0 (active)
  glib2 @2.14.4_1+darwin_9
  glib2 @2.14.5_0+darwin_9 (active)
  gmake @3.81_0 (active)
  gmp @4.2.2_1 (active)
  graphviz @2.16.1_0 (active)
  groff @1.19.2_1 (active)
  gsed @4.1.5_2 (active)
  gtk-doc @1.9_0 (active)
  gtk2 @2.12.2_0+x11 (active)
  gzip @1.3.12_0 (active)
  help2man @1.36.4_1 (active)
  jpeg @6b_2 (active)
  less @409_0
  less @418_0 (active)
  lha @1.14i-ac20050924p1_2 (active)
  libfuse @2.7.1_3+darwin_9 (active)
  libiconv @1.12_0 (active)
  libpng @1.2.24_0 (active)
  libtool @1.5.24_1 (active)
  libxml2 @2.6.30_0 (active)
  libxslt @1.1.22_0 (active)
  lighttpd @1.4.18_0 (active)
  lv @4.51_2 (active)
  m4 @1.4.10_1 (active)
  monafont @2.90_0 (active)
  mplus-fonts @2.2.4_0 (active)
  ncftp @3.2.1_0 (active)
  ncurses @5.6_0 (active)
  ncursesw @5.6_0+darwin_9
  ncursesw @5.6_1 (active)
  neon @0.26.4_0 (active)
  netcat @1.10_2 (active)
  nkf @2.0.8b_0 (active)
  openssl @0.9.8g_0 (active)
  p5-locale-gettext @1.05_0 (active)
  p5-xml-parser @2.36_0 (active)
  pango @1.18.3_0 (active)
  pcre @7.4_0 (active)
  perl5.8 @5.8.8_0 (active)
  pkgconfig @0.22_0
  pkgconfig @0.23_0 (active)
  pTeX @20071212_0+darwin_9+nox11+utf8 (active)
  rb-gnome @0.16.0_5+only_gtk2+rcairo (active)
  rb-htree @0.6_0 (active)
  rb-rabbit @0.5.4_0 (active)
  rb-rake @0.7.3_0 (active)
  rb-rcairo @1.5.0_0 (active)
  rb-rdtool @0.6.20_3 (active)
  rb-rubygems @0.9.4_0 (active)
  readline @5.2.007_0+darwin_9 (active)
  render @0.9_1 (active)
  ruby @1.8.6-p110_0+darwin_9+mactk+thread_hooks (active)
  sazanami-font @20040629_0 (active)
  scala @2.6.1_1 (active)
  screen @4.0.3_0 (active)
  scrollkeeper @0.3.14_6 (active)
  sqlite3 @3.5.4_0 (active)
  sshfs @1.8_2 (active)
  subversion @1.4.6_0 (active)
  t1lib @5.1.1_0 (active)
  texi2html @1.76_3 (active)
  texinfo @4.11_0 (active)
  tiff @3.8.2_1+macosx (active)
  urw-fonts @1.0.7pre44_0 (active)
  vim @7.1.203_0+cscope+nls (active)
  wget @1.10.2_0 (active)
  Xft2 @2.1.12_0 (active)
  xmlcatmgr @2.2_1 (active)
  xorg-util-macros @1.1.5_0 (active)
  xorg-xproto @7.0.11_1 (active)
  xrender @0.9.0_2 (active)
  zlib @1.2.3_1 (active)
  zsh-devel @4.3.4_4+doc+mp_completion (active)
$ gem list
 *** LOCAL GEMS ***
activesupport (2.0.2)
fastri (0.3.0.1)
hpricot (0.6)
rake (0.8.1, 0.7.3)
ruby-debug (0.10.0)
ruby-debug-base (0.10.0)
rubygems-update (1.0.1)
sources (0.0.1)
vim-ruby (2007.05.07)
  • MailTags
  • CamTwist
  • Jude
  • Last.fm
  • NeoOffice
  • Opera
  • プリンタドライバ(ip5200rosx483ej7.dmg)
  • TerminalColoreopard

赤外線受光装置異常

Apple Remoteの操作を受け付けなくなった。Genius Barで相談してみたら、どうもハードディスクのそばにあった受光装置のケーブルが断線してるっぽい。そばにある、スリープ時の点滅ランプも点かなくなってる。有償修理が必要だって。わーい。


Coerce via aliased methods

ruby-dev:33095にレスが付かずに放置されてるので、RHGの逆襲のあと、笹田さんに聞いてみた。

問題

うん。問題は数値二項演算メソッドがcoercingを必要とするときの処理が全部、rb_num_coerceやrb_big_coerceに委譲されてるっていうことなんだ。rb_xxx_coerceは引数に演算の名前を取らない。だから、委譲された演算本体の処理を行うためには、スタックフレームから呼び出し元の演算名を取り出さないといけない。このスタックフレームに積まれてる名前が、違ってる。Ruby 1.8ではaliasされたメソッドは「定義時の名前」が積まれていた。YARVでは「aliasされた名前」が積まれている。

笹田さんに聞いてみたら、これは意図した仕様じゃないみたい。でも、直そうと思ったらYARVの深いところをいじらなくちゃいけないので大変らしい。YARVでは今、AST段階で使ってたRNodeを使い回すのをやめて、バイトコード実行時には独自の構造体を使うように変更中らしい。これと絡むとか。

私の都合

私がcoerce問題を見つけたのはrationalのテストケースを書いてたとき。rationalを組み込み化するにあたって、とりあえず今のrationalの仕様を定義したい。だから、今のrationalには100%テストにパスしてもらいたい。でも、coerce問題のせいで1 ** Rational(1, 2)は動作しない。


方針

するってーと、どうすれば良いんだ? Fixnum, Bignum, Floatの二項演算メソッド、これのcoerce呼び出し部分を変えてやればとりあえずrationalは動くようになる。でも、そのためだけにFixnumとかをいじるのか? でもなー、とりあえずこれはtrunkにおいてcoerceメカニズムがうまく働いてないわけで、Fixnumとかのバグではあるわけだよね。直しちゃって良いんだろうか。でも、rb_num_coerceのシグネチャは拡張ライブラリ向けAPIだから変えられないぞ。組み込みの二項演算は何かrb_num_coerce以外の静的関数呼べば直るとして、でもYARVが直らないとこのシグネチャを保ったままrb_num_coerceは動作するようにならないぞ。

そもそも、aliasされたメソッドの中でcoerceしたら、変換された値たちをエイリアスと定義時の名前と、どちらのメソッドに掛けるべきだろう。どっちがRubyとして自然なんだろう。「驚き最小の法則」。これはRubyの世界観の話だからMatzの判断を仰ぎたいんだけど、返事がない。ただの屍のようだ。笹田さんによれば「なんか最近忙しそう」ってことだから、ちょっと待つか。


2008年01月28日

第1回RHGの逆襲 発表資料

第1回RHGの逆襲を開催しました。お越しいただいた方々、ご覧くださった方々、ありがとうございました。

  • 発表資料: rhg-strikes-back-1.zip
  • ustream.tv:
    • 最初 始まり - 笹田さんによる解説が始まるまで
    • 中盤 笹田さんの解説が終わった後 - 再び私のターン
    • 残り コードリーディングするつもりだったけど、HotRubyの解説が始まった。

発表資料は、あんまりまとまってません。その場でソースコードを開いたり色々するつもりだったのでself-containedではないです。その割には途中で資料を辿るのに必死になりすぎて、笹田さんのように華麗な解説とは行かなかったのが残念です。笹田さんのおかげで途中で目が覚めて、ホワイトボードで解説をしてるのが中盤以降です。人に伝える技術の未熟を痛感します。

ustreamの動画のほうも、笹田さん側の動画がRECORDされてないこと、そもそも二本のチャンネルを並行して使ってたっていう構成上、後で参照する資料としてはあまり出来が良くないですね。

そもそも、苦肉の策だったとはいえ二カ所に分散して開催するというのはよくありませんでした。それにしても、こんなにも多くの人に関心を持っていただき、交流の場を作れたという点だけは良かったと思っています。次回以降の改善方法についていくつかの意見をいただいています。

  • 簡単すぎるのでもっと敷居をあげて、ターゲットをはっきりした方が良い。
  • レベルはこれぐらいで良い。興味深い。
  • とにかく1カ所で開催する
  • むしろ、全員自宅から参加する。完全オンライン。
  • 発表者はその場でランダムに決める。みんな予習をしてくる。
  • 講義形式は良くない。講義と勉強会は違う。
  • Lingrを使う
  • Skypeを使う

細かいことは後で書く。


2008年01月26日

性同一性障害と仏教

私は仏教徒ではない。民俗神道は私の価値観に強く影響しているし、形而上の問題に関してはキリスト教も影響が大だ。私の理性は儒教はナンセンスと言っているけれども、私はまだ儒教価値観から脱することができていない。でも、私は仏教徒ではない。

たぶん、四苦という認識の枠組みや、その上での解脱という発想が気にくわないんだろう。

人間にとって生が苦痛を伴うものであるかどうか断言することはできない。でも、私にとって生は苦痛だ。生に多くの喜びがあるのと同様、苦痛があって、それは良くある話だ。私に関して言うならば、性同一性障害という問題は私にとってとても大きい。私の身体の有り様が私に苦痛をもたらす。だが、身体性から独立した人格、自己同一性はあり得ない。故に、私は、私が在る様が苦痛である。私は、私が生きていることが苦痛である。

だが、もうこれ以上の人間が、私のような思いをしなくてもすむのではないかと私は考えた。今の私はその考えから出発している。その果てにある発想として、苦のない生があるべきだと考えた。生からの脱出でなく。故に、私が理解している限りの仏教のことを、私は好きでないのだろう。そう気づいた。

でもなー、「苦のない生」を「生老病死のない存在」と言い換えたら、それは釈迦とどう違うんだ? と、今思った。


2008年01月24日

Ruby 1.6.8 on MacOSX Leopard

懐かしのRuby 1.6をコンパイルする。

ソース取得

ソースは http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_6 にある。

コンパイル

$ autoconf
$ ./configure --program-suffix=-1.6
$ make miniruby

ここまでは良い。問題は添付拡張ライブラリのコンパイルである。

lib/mkmf.rb

61行目付近にあるrm_fがうまく動作しない。conftestで作成するバンドルのところで転ける。システムにとってはライブラリファイルだけどUNIXインターフェースにとってはディレクトリ、という状況を想定してないのだろう。

面倒なので、こう書き換える

  def rm_f(*files)
    system 'rm', '-rf', *files
    return
    # .... もとの実装
  end

ext/extmk.rb

44行目付近にあるrm_fが同じく

rbconfig.rb

まず、12行目のsrcdir。/path/to/checkout/dir/'.'とか、余計な'.'が付いているので削除する。

それから、あちこちによく分からない|_#!!#_|という記号が付いているので全部削除する。

readline

readlineのヘッダと整合性がとれてなくてコンパイルできないっぽい。直すのが面倒なので捨てる。

ext/readline/extconf.rbの9行目を

if false and have_header("readline/readline.h") and

と無効にしてしまう。

ext/readlineのディレクトリ丸ごと消すのでも良いと思う。

make

ここまででmakeできる。

make install

make installすると、ftools.rbが見つからなくてinstruby.rbが転ける。Makefileを編集して、installのルールのminirubyを実行してるやつに、"-Ilib"を足す。

./miniruby$(EXEEXT) -Ilib $(srcdir)/instruby.rb --mantype=$(MANTYPE) $(DESTDIR)

それから、ruby_install_nameがなくて nil + Stringで例外が起きる。これを避けるためにrbconfig.rbを編集する。

  CONFIG["RUBY_INSTALL_NAME"] = "ruby-1.6"

とか書いてある行があるので、これをコピーして

  CONFIG["ruby_install_name"] = "ruby-1.6"

みたいな行を作る。

これでmake installできる。

おことわり

言うまでもないけど、くれぐれも自己責任で。うっかりruby 1.8を上書きして泣かないように。


2008年01月21日

JudeをMacOSXのアプリケーションにする

モデリングツールのJudeは気に入ってる。マインドマップとUMLとコード生成を連携させるっていうことができるし、何よりも開発者の顔が見えるのが良い。中の人たちはちょくちょくオープンソース系のイベントに顔を出してるので、言いたいことはすぐに言える。

そう言うわけで、これをMacでも使いたいわけだ。(ちなみに、JudeはJavaアプリケーションなのでrun anywhereだけれども、Macはサポート対象外である)どうせなら標準バンドルのアプリケーションと同じように、独自のアイコンを持っていて、アプリケーションのディレクトリをダブルクリックするだけで起動するようにしたい。ディレクトリツリーをFinderから実行可能にするのはそれほど難しいわけじゃない。でも、前にもやったのにやり方の細かいところを忘れていたので今回はメモしようと思う。

バージョンの選択

Jude Professional 5.1.1にした。5.2 beta 1はぬるぽを投げて起動してくれなかった。

KeyStr =  is invalid
java.lang.NullPointerException
	at java.lang.String.endsWith(String.java:1296)
	at jE.a(X:222)
	at jE.a(X:227)
	at jE.a(X:204)
	at jE.c(X:72)
	at wA.n(X:151)
	at aI.(X:59)
	at JP.co.esm.caddies.jomt.Jude.e(X:516)
	at JP.co.esm.caddies.jomt.Jude.f(X:419)
	at JP.co.esm.caddies.jomt.Jude.a(X:75)
	at jS.run(X:406)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

環境は

$ java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)
$ uname -a
Darwin yugui-macbook.local 9.1.0 Darwin Kernel Version 9.1.0: Wed Oct 31 17:46:22 PDT 2007; root:xnu-1228.0.2~1/RELEASE_I386 i38

手順

  1. JREやらWindows用インストーラーなんかは不要だ。本体だけzipで固めたやつを落としてくる。
  2. zipを展開するとjude_professionalディレクトリが出てくる。これをResourcesに改名
  3. Contentsディレクトリを作って、Resourcesをその中に移動。
  4. Contents/MacOSディレクトリを作成。
  5. Contents/MacOS/Judeを作成。../Resources/judeへのsymlink
  6. 8行目のJUDE_HOMEの設定をJUDE_HOME="`dirname $0`/../Resources"に変更
  7. Resources/jude.icoとjude-doc.icoをPreview.appでも他の何かでも、適当なツールでTIFFに変換。
  8. tiff2icnsでTIFFをicnsデータに変換。
  9. 下記の内容のContents/Info.plistを作成。
  10. ディレクトリJudeの中にContentsを移動。JudeをJude.appと改名。

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>Japanese</string>
	<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeExtensions</key>
			<array>
				<string>jude</string>
			</array>
			<key>CFBundleTypeIconFile</key>
			<string>jude-doc.icns</string>
			<key>CFBundleTypeName</key>
			<string>Jude Document File</string>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
		</dict>
	</array>
	<key>CFBundleExecutable</key>
	<string>Jude</string>
	<key>CFBundleIconFile</key>
	<string>jude.icns</string>
	<key>CFBundleIdentifier</key>
	<string>jp.co.esm.caddies.jomt.jude</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>Jude</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleVersion</key>
	<string>5.1.1</string>
	<key>NSMainNibFile</key>
	<string>MainMenu</string>
	<key>NSPrincipalClass</key>
	<string>NSApplication</string>
</dict>
</plist>

2008年01月16日

ビブリオマニア

ビブリオマニアが主人公だということで紹介してもらった「R.O.D」を読んだ。何という既視感!

とても身近な現象をそのまま極端に拡大した風景が描かれている。私も、外出するときになぜそんなに本を持ち歩いているのかとよく問われるよ。決まってるじゃないか、行きに読むのと帰りに読むの、それから予備、それから途中の書店で買ったやつともう一軒はしごした店で買ったやつと、途中の古本屋で買ったやつだ。さすがに1店買いはしたことないなぁ。お金があればしてみたいけど。

他に活字がなければ定期券の注意書きまで読む、電話帳を喜んで読むっていうのは本当にやったことあるし。

稀覯本趣味は無いのでその辺はよく分からないけど、とにかく作者が本を愛してるのはよく分かった。仮にも本好きが本好きを語るならばもう少し叙述に凝って欲しかった感は無いではないけど。ライトノベルという制約はあるにせよ、もう少し書いても罰は当たらんだろう。物語として良いとかそういうのとは別に、身近さと、自分に通じる性質を極限まで拡大した登場人物への憧れと、そんなものを楽しませてもらった。


2008年01月13日

ファーストクラスオブジェクトとしてのメソッド

Rubyと高階関数:

関数そのものがファーストクラスではない

やー、Rubyのメソッドはファーストクラスですよ。返り値にできて、変数に格納して演算できて、引数にできるという意味では。

確かに、RubyはPythonやJavaScriptやSchemeに比べると高階関数を陽に使うプログラミング†1は不格好になる。Pythonなら簡単なのに、

bound_function = obj.hoge
bound_function(arg1, arg2, arg3)

Rubyは余計なメソッド呼び出しがくっついて不格好だ。

method = obj.method(:hoge)
method.call(arg1, arg2, arg3)

私もこの点が気にくわなくてまつもとさんに「メソッドがファーストクラスだったらいいのに」と言ったことがある。でも、まつもとさんの考えではすでにファーストクラスということだった。

名前空間

もう細かいところは記憶が定かでないので、以下は私の理解になる。メソッドはただ、名前空間が違うんだ。

既存のメソッドと同名の識別子に値を代入すると、それはローカル変数の初期化になる。けれども、メソッド呼び出しでは依然として元のメソッドを参照する。

p = 1
p p #=> 1

変数の名前空間とメソッドの名前空間は別だ。メソッド呼び出しではメソッドの空間を規定の順序で探索する。値の代入では変数の名前空間を探索する。値の参照においては、ローカル変数をまず探して、存在しなければ引数を持たないメソッドとみなして探索する。

メソッドの名前空間にあるものは呼び出すことができる。変数の名前空間にあるものは呼び出すことができない。ただ、変数の名前空間にあるものに対しては「メソッドを呼ぶ」ことはできる。だから、メソッドあるいはそれに類するものには「それがメソッドの名前空間にあるかのように呼び出す」というcallメソッドが備わっている。

メソッドObject#methodはメソッドの名前空間からメソッドを取り出して、変数の名前空間に持ってくるメソッドだ。一方、Module#define_methodは逆操作をする。

Rubyの選択

私としてはScheme方式のほうが格好いいとは思う。Rubyの名前空間分離方式っていうのはCommon Lispから継承した代物だよね。たぶん。いや、CL以前のLispのどれかかもしれないけど。

でも、名前空間を一緒くたにすると「selfを省略可能」「引数の括弧を省略可能」というのは難しくなってしまう。Rubyとしては、高階関数を綺麗に書けることよりもこれらのほうが重要だろうと判断しての選択だ、とまつもとさんは言っていた。Ruby 1.9では今のところは

proc.(arg1, arg2, arg3)

はできるようになっているけれども。この点についてはまつもとさんも苦心しているのが見えて、対案がないことにはどうも文句を言いづらい。

結論

というわけで、名前空間の違いですよー、と。

  • †1: ご指摘の通り、暗に使うのがブロック構文ね

2008年01月09日

RubyのMatrix

ruby の Matrix#determinant の実装が間違ってる経由。

[ruby-dev:27548]の問題、

Matrix[Float]

とか

 Matrix[Rational]

とか書いて新しいClassオブジェクトを返すようにして、係数体(or 環)を指定するようにしたら解決しないのかな。

require 'matrix'
class << Matrix
  alias :"[]_orig" []
  def [](*args)
    if args.length == 1 and args[0].kind_of? Class
      ring = args[0]
      name = ring.name
      return const_get(name) if const_defined? name
      normalizer = Kernel.instance_method(name).bind(self)
      klass = Class.new(Matrix)
      (class << klass; self end).class_eval do
        define_method(:[]) do |*args|
          args = args.map { |row|
            row.map{|element| normalizer[element]}
          }
          __send__(:"[]_orig", *args)
        end
      end
      klass.const_set(:COEFF_RING, ring)
      self.const_set(name, klass)
      klass
    else
      Matrix[Float][*args]
    end
  end
end
p Matrix[Integer][[1.0, 2.0], [3.0, 4.0]]

やっぱり整除演算子はあったほうがいい気がするが、今は/が除算と整除で混ざって使われてるので互換性維持が難しいし、整除演算子は昔Matzが蹴ってたよなぁ。まあ、数学の人以外は現状で不便がないだろうから、divとquoで我慢するか。逆元が無いとき用に環でundefinedな除算メソッドが欲しいところだが。

Pythonは整除の導入はよくやったよなぁ。やっぱり段階的にfeatureを移行させていく例のシステム(なんつったか)が有効に働いてる。


はてなに問い合わせたけど反応がないので晒してみる

はてなにはてブの仕様を問い合わせたけど、メールにて回答すると返信があったきり反応がない。

ので、誰かが「それYuguiの勘違いだよ」とか「フィルタに引っかかってるんでね?」とか言ってくれるのを期待して晒してみる。

追記

2008-01-10追記

今日、この記事を見たと言うことで「改めて」はてなから返信をいただいた。その返信には「前の返信」が念のため引用されていた。「前の返信」に見覚えがなかったのでスパムフィルタに引っかかったメールの山を漁ってみると、そこに発見。質問投げたその日のうちにちゃんと反応はくれてたのね。どうも失礼しました。

「前の返信」では「スタッフが調査するのでしばらくお待ちください」だったけど、今回の返信では「最初のブックマーク時に対象記事へのリンクが存在しなかったのでは?」という指摘。や、それはないよ。念のため実験をして確認した後、再度返信した。

追記

2008-01-29追記: その後、はてなアイデアに登録されています

問い合わせ内容

From: info@hatena.ne.jp

Subject: 【はてな】質問を登録しました

Date: Wed, 19 Dec 2007 11:03:15 +0900

To: yugui@yugui.jp

Message-id: <200712190203.lBJ23FO04173@yamanaka.hatena.ne.jp>



お問い合わせありがとうございました。

はてなスタッフがメールにてご回答いたしますので、しばらくお待ち下さい。

お返事には数日かかることがございます。

このメールにお心当たりのない場合は、お手数ですがその旨を明記の上、ご返

信いただきますようお願いいたします。

質問内容

============

質問者   yugui 様

メール   yugui@yugui.jp

カテゴリー はてなブックマークについて

登録日時  2007/12/19 11:03:14


いつもお世話になっております。id:yuguiと申します。

はてなブックマークの挙動につきまして少し疑問がありますので質問いたします。

はてなブックマークにブックマークされたwebページ(A)に対して、

Aへのリンクを持つwebページ(B)があった場合、

1. Bがはてなダイアリーの記事であれば記事を公開した時点で、Aの「このエントリーを含む日記」にリストされる

2. BがブックマークされるとAの「このエントリーを含むほかのエントリー」にリストされる

という仕様であると理解していました。ところが、いつの頃からか私の管理する http://idm.s9.xrea.com 以下のページはブックマークされても「このエントリーを含む他のエントリー」にはリストされないようになりました。

例えば、私の書きました

http://idm.s9.xrea.com/ratio/2007/11/03/000691.html

は、

http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0023

に言及しており、且つブックマーク

http://b.hatena.ne.jp/entry/http://idm.s9.xrea.com/ratio/2007/11/03/000691.html

が存在しますが、言及先記事のブックマーク一覧

http://b.hatena.ne.jp/entry/http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0023

においては「このエントリーを含むほかのエントリー」にリストされておりません。

いつからこのようになったのか正確には分かりませんが上の例に限ったことではありません。

また、2006年11月の記事、

http://idm.s9.xrea.com/ratio/2006/11/23/000552.html

の場合は言及先ページのブックマーク

http://b.hatena.ne.jp/entry/http://www.djangoproject.jp/etude/1/

に「このエントリーを含むほかのエントリー」にリストされており、それ以前は私が理解したとおりの挙動が確認できます。


これは私がブックマークの仕様を正しく把握していないのでしょうか。それとも、ブックマークの挙動がおかしいのでしょうか。


何卒よろしくお願いいたします。


==========

はてなサポート窓口

info@hatena.ne.jp

==========


あるべき「有害情報」データベースの形

『有害サイト』フィルタリングは何をもたらすか」について、いくつか興味深いコメントをいただいた。

半端な技術の危険

id:kiririmode:

フィルタリングを人間の手で行うと、フィルタリングされる内容が次第に拡大していって、最終的に一部の情報は完全に手に入らなくなるような気がする

それはそうだ。だから、本質的に暴走の危険を孕んだこのような法案には反対だ。前の記事の冒頭で紹介したような「拡大解釈のおそれがあまりにも大きい」「プロバイダ責任制限法でやれ」という意見に賛同する。

ただ、もしやるならば、粗雑な実装のくせにGoogleのごとく「人間の判断は介入していない。アルゴリズムの判断だ」という言い訳を許すことだけはしてはいけない。人間がやったことならばその政治性を問うことができる。だが、「技術限界」と言われては「私を雇え」ぐらいしか言いようがない。

人間の判断の危険

だから、とりあえず現実的な解として「ブラックリスト」の可能性を検討したのだけれども、それでも暴走は止められないというのが前回の結論であった。それに、人間にやらせれば恣意性は生まれてくるという指摘は確かだろう。もし本当に「有害情報」をフィルターしたいなら、ちゃんとした技術による処理が必要だ。

id:faultier

有害な情報を見つけるのは有益な情報を見つけるのと同程度に困難だ

有害であることと有益であることは対称なのかもしれない。ならば、限定的ではあるけれども私たちは情報を価値づける方法を知っている。PageRank(TM)だ。あるいは、それに代わる次世代の何か。それがあればある程度公正に有害な情報を検出できる。情報を価値づける技術。

列島改造論

なるほど、この法案は情報大航海プロジェクトに繋がったりするんだったりして。だったら、この手の離散的計算のトップランナーに学ばない手はないよね。GoogleとAmazon。その背後にあるのはクラウド・コンピューティング。

この法案をまともなものにするならば「Googleを超える人間にとっての価値判断代行アルゴリズムの実装を構築するぞ」としか考えられない。そこまで言うなら、私は「列島改造論」を提唱する。

列島改造。日本国38万平方キロメートルをサーバーラックで埋め尽くす。階上にはまたサーバーラック。その上にもサーバーラック。勿論、設計的に可能な限りサーバーを。人? 人はイスがあれば寝られる。立って半畳寝て一畳だ。†1サーバーは順次新機種で入れ替えて。そのサーバー群を統御する技術を国を挙げて開発する。なんという計算能力!

なるほど、これならば法案も現実味を帯びてくる。そして、次世代を担うと見込まれる技術において日本は圧倒的な競争力を持つことになるし。そもそも日本は列島を掘り返してハコを作るのは慣れてるんだからOK, OK。

国会議員はすごいことを考えるものだなぁ。プログラマの雇用も確保されて、よかったですね。†2

  • †1: ついでに山は削って谷は埋めて、海岸線をまっすぐに埋め立てて、全国を計測しやすい形にして人間を等間隔にメンテナンス要員として配置すれば、選挙区の1票の格差問題も簡単に解決します
  • †2: 誓って言うけど、前回の記事は真面目に書きました。真面目にこの法案の危険性を懸念しています

2008年01月08日

MacBookクリーンインストールの続き

昨日の続き。

iTunesのデータ

バックアップDVDからの復元に失敗したのであった。ディスクはしっかり数GB書いてあるのに、中の唯一のファイルが300KB足らずっていうのは明らかに何かがおかしい。焼き損なったかな。

元のハードディスクから復旧を試みたいけど、マウンタとか買ってくるのは面倒。なので、Ubuntuの入ったミドルタワーにSATAでつないでマウントして、scpでMusics/iTunesディレクトリをMacBookに移した。このディレクトリに対してiTunesから「ファイル」→「読み込み」したらデータを回復できた。Linuxがhfsplus対応してくれて良かった。

残りのセットアップ作業メモ

普段使ってるGUIアプリは大体インストールしたつもりだったけど、システム管理系を忘れてた。

  • Lingon
  • OnyX

まだインストールしてないけどライセンスはあるもの。あとで入れる。

ライセンスデータはオンラインストレージに入ってるので無問題。

  • Jude
  • iShowU
  • QuickTime pro

あとで暇なときに入れるもの

  • CoRD
  • Chemr
  • Flex2 SDK
  • Adobe Reader
  • NeoOffice
  • iSquint
  • Gimp
  • Seashore
  • Skype
  • プリンタのドライバ

MacBookのハードディスク換装

MacBookが最近、不規則に長時間入力を受け付けなくなる。マウスカーソルは動くけれどもアプリケーションの切り替えは重かったり、受け付けなかったりする。最初はアプリケーションがCPUを食いつぶしてる可能性やらを考えたけれども、最近のタスクスケジューラはもっと賢いだろうしなぁ。段々と症状は酷くなってきて、ただ、どうもディスクアクセスと相関がありそうなことに気がついた。

ああ、この話は聞き覚えがある。もろはしさんの事例と同じ症状だ。見てみると、コンソールにも同じログが出てる。原因はハードディスクの損傷らしい。そう思って考えれば、先日ディスクに猛烈にアクセスしてる最中にうっかり本体を蹴り上げてしまったのだった。垂直方向に猛烈な加速度が……。決まりだね。

対応

ちょうど今のハードディスクも手狭になってきたところだし、Leopardも試したいし、データのバックアップは普段から万全。基本的にデータはオンラインストレージにあるものがマスターで、ローカルのやつはただのキャッシュなのだ。

そういうわけで、ハードディスクを換装してLoepardをクリーンインストールすることにした。

秋葉原

秋葉原でLeopardとハードディスクを買ってきた。元々入ってたディスクは東芝MK6034GSX。厚さが9.5mmのやつを選ぶように注意すれば基本的に2.5インチSATAのディスクの何でも良いっぽい。でも一応、同じ東芝にしておけば安心だろうと、MK2546GSXを買ってきた。

ディスク換装

適当に検索して出てくるサイトを参考にやってみた。

裏のロックを解除してバッテリーを外す。そうすると、バッテリーで開いた空間の側面にL字型の保護金具があって内部へのアクセスができなくなってる。この金具は3点のプラスの小さいネジで止まってるので、これを外す。†1

左側にハードディスクを抜くための白いシートが出てるので、これを引っ張ってハードディスクを抜く。ハードディスクはシールドにネジで固定されてて、そのシールドごと出てくる。

ハードディスクを固定してるネジは星型のT-8。星型の小さいドライバは家にはT-10までしか無くて、これでは大きすぎたのでドライバも秋葉原で買ってきた。ラジオセンターの入り口近くのところの工具店が揃ってるという話だったので、そこへ。ああ、そっか。昔よく半田を買ってた店だ。

さて、ハードディスクを外して、新しいハードディスクを代わりに固定して。で、これを元通り差し込む。中のゴムにガイドが入ってるのでそこに載せて入れるとちょうど良いらしい。

Leopardインストール

電源入れて、インストールDVDを挿し込んでここからブートさせる。で、DVDの読み込みにちょっと待った後、インストーラーが立ち上がる。ここでメニューからディスクユーティリティを選んでハードディスクを初期化するんだけど、最初ハードディスクを認識しなくて焦った。ちゃんと入ってなかったらしい。電源落として、もう一度ハードディスクを入れ直したら認識した。

あとはインストーラーの言いなりにインストール。ちゃんと見てなかったけど、30〜40分くらいでインストール終了。

初回起動時にAppleアカウントを聞かれる。.Macのアカウントを入力したら、ユーザー名やなんかは前の設定が引き継がれた。

起動したらソフトウェアアップデートして、OSのインストールはおしまい。

細かい設定

システム環境設定

  • Mighty Mouse(Wireless)を認識させる
  • 「共有」からマシンの名前を設定
  • 「.Mac」から.Mac上のバックアップと同期。
    • iDisk Syncを有効に。
  • 「ExposeとSpaces」からSpacesを有効に。
  • Dockは最近右に移すのがお気に入り。最初は頑なに下にしてたんだけど、他のユーザーの画面見ると結構みんな右にしてるので移してみたら、画面の使い勝手が良くなった。「Dock」から位置を右に。
  • 「キーボードとマウス」から、
    • Mighty Mouseの右ボタンを「副ボタン」に割り当て
    • CapsLockをコントロールキーに変更。

ATOKインストール

あ、辞書のバックアップ忘れた。最近はデフォルトでストレス感じてなかったので、まあいいや。

ATOK 2006はインストーラーがLeopardに対応してないらしい。JUSTのサイトから対応ツールをダウンロードする。

Leopardでの動作の制限も多いね。新バージョンを買うことも検討しよう。

シリアルナンバーがどこか行ってしまった。JUSTのユーザーIDは残ってたのでこれでJUSTのサイトにログインしたら、登録済みの製品一覧にシリアルナンバーが書いてあった。

Hey, you! インストール後に再起動しようとしたまま終了しないんですけど。最初は綺麗に行きたかったんだけど、10分ほど待っても反応がないので電源ボタン長押しで落とした。

Backup

Backup.appをインストール。iTunesのバックアップディスクから復元しようとしたらなんか復元できない。ガーン。

購入したものはiPodから復元できたけど、それ以外はリッピングし直しだろうか。いや、元のハードディスクをつないでライブラリを統合すれば良いのか。あとで考える。

FireFox

  • 本体
  • NoScript
  • GreaseMonkey
    • MiniBuffer
    • AutoPagerize
    • LDRize
  • All-in-One Gestures
  • Web Developer
  • LiveHTTPHeaders
  • Download Statusbar
  • XUL/Migemo
  • TextLink
  • XHTML Ruby Support
  • iFox

その他のインストール

  • Adium
  • Growl
  • RubyCocoa
  • LimeChat
  • Caffeine
  • dotfilesを自鯖からチェックアウト

MacPorts

  • XCode
  • zsh-devel
  • vim
  • ruby
  • rb-rake
  • gmake
  • gsed
  • flex
  • bison
  • subversion
  • pTeX
  • screen
  • rb-rdtool (rabbitのprivate portから)
  • wget
  • netcat
  • lv

野良build

  • ruby: trunkからチェックアウトしてビルド。
  • sl

これだけあればとりあえず仕事はできるかな。

  • †1: 位置関係でドライバをまっすぐ当てられなくて、細い精密ドライバでないと無理そうで、どうにもこのネジ穴なめそうで怖かったので実はここを父にちょっと手伝ってもらったんだけど。どうも細かい手作業は苦手だ。

2008年01月06日

「有害サイト」フィルタリングは何をもたらすか

民主党が有害サイトの削除をプロバイダに義務付ける法案を検討しているという。

しかも、「有害な恐れがある場合は児童が閲覧できなくなるような措置」も義務付けるそうだ。

それから、昨日のNHKニュースで「警視庁の調べによれば児童・生徒の70%が携帯電話を持っており、そのうち有害情報フィルタリングが有効になっているのは2割のみ」「携帯電話各社は18歳未満の契約者に対しては初期状態でフィルタリングを有効にすることを検討中」とも言っていた。

とても良いことである、とともに、とんでもないことである。

良い側面

判断力の未熟な年齢のうちに微妙な情報に変に感化されないように保護することは、一般論としては良いことであるといえる。年齢の線引きはいつでも微妙な問題なのだけれども、日本では大体18歳になる。18歳になれば平均的には相応の判断力がついてるし、馬鹿な人間は何歳になっても馬鹿だからね。

悪い側面

拡大解釈されて検閲につながる可能性であるとか、プロバイダ責任制限法で対応できるとか、そういう議論はすでに出ている。

私は、安価に維持できるフィルタリングは有害無益である、と改めて述べたい。

フィルタリングの無益

この点についてはかなり前にちょっとした調査をしたことがある。

大体が、フィルタリングを実装するプロバイダってのは、「同性愛」(同性愛的なアダルトコンテンツは含まない)を「有害情報」と断定するような連中なんだよ?

私がこれまでの調査と経験から知っていることをもう一度述べよう。

  • 形態素解析を駆使しても、意味論を考慮しない非知能的プログラムによるフィルタリングは無力。
  • 特に、有害単語データベースによる部分文字列検索による実装は無力
  • それどころか、有害

これはなぜか。日本は、ネット台頭以前に同じことを人手で一度やった経験があるからだ。これは受け売りであるけれども、日本はかつて猥褻本を強く抑圧した。私でもまあ、チャタレー事件や、渋澤龍彦のサド事件は知ってる。こういう猥褻本†1の摘発の流れの中で何が起こっていたのか。

隠語の台頭

摘発の過程で問題になったのは、いつでも「どういう表現が使われているか」だ。まあ、そりゃそうで、内容に踏み込んで想像をたくましくすると猥褻であるとか、そんなことを言っていたら何にでも難癖をつけられる。この点については豊田有恒がよく茶化していて、『非・文化人類学入門』の「ポルノ」によれば、曰く、「人魚姫の王子様はサディズムの趣味があったかもしれない」「明記されていないからこそ、いかようにでも想像できて興奮する」「究極のポルノは聖書(の系図)」

さて、こうして、「じゃあ直接描写しなければいいんだろう」ということで日本語の官能小説における隠語表現は著しく発達したのであった。この語彙の発達については『官能小説用語表現辞典』に詳しい。日本の官能小説家たちはこんなにも表現を工夫したのかと感嘆する(そして呆れる)。

そういえば、先日見た「クワイエットルームにようこそ」にも主人公が官能小説を「あぁ、どんぐり、どんぐり、どんぐり!」と読み上げるシーンがあった。日本官能小説の力をもってすればどんぐりすら官能的なのである。

要するに、日本語で性的興奮をそそるような文章を書こうとする場合、あまりにも表現が多様化しすぎていて、かつ日常用語と見分けがつかないように進化していて、単語ベースでフィルタリングするには無理がある。日常用語だけで官能小説を書くことは可能だし、おそらく実例は存在するだろう。

これに対して青少年が誤った性知識を身につけないようにするサイトであるとか、同性愛に関しての偏見を取り除こうとするサイトであるとか、性同一性障害者が生きていけるように支援するサイトであるとか、こういうサイトは概して隠語を使わない。だから、こういうサイトはフィルタリング機構がもっている「性的な単語」のデータベースにとてもよくマッチする。

したがって、意味論を考慮せずに字面でフィルタリングするような真似をすると、ポルノサイトはフィルタを通り抜けるが啓蒙的なサイトはフィルタに引っかかる傾向がある。要するに、false nagativeとfalse positiveが非常に多いのである。前述の私が行った実験も、一サービスの実装を確認したに過ぎないが、結果はこの説を支持している。

生じる問題

DoCoMoのフィルタリング導入の際に草実スサさんはこう書いている

悩んでいる子供にとって、「自分と同じような人間が他にいる」という情報、「それはまったく悪いことなんかじゃない」というメッセージが、どれほど重大な意義を持つか。

抑圧されてきたマイノリティに関する情報が、ネットに接続できさえすれば手に入る。被差別少数者が、共感し、連帯できるかもしれない。こうしたことは、インターネットの普及のもっともポジティブな側面の一つではないだろうか? こういうネットの可能性を、「社会通念」の名の下にやすやすと子供から奪い取って良いものかね。

多分、フィルタリングを義務化すればこうした問題が起きるだろう。こうしたfalse positiveの問題を起こさずに有害な情報をフィルタリングしようと思ったら、唯一の方法は「よくメンテナンスされたブラックリスト」だ。だが、ブラックリスト方式はメンテナンスコストが掛かるし、false negativeを容易に起こす。

だから責任を負いたくないプロバイダはfalse negativeを減らすために単語ベースのフィルタリングを併用するだろう。false positiveが増えても気にしないだろう。あるいは、単語ベースのフィルタリングだけで「警察に目を付けられない程度」に収まると判断すればコストを優先してブラックリストのメンテナンス(あるいはフィルタリング提供企業からの購入)を止めるだろう。あるいは、ホワイトリストでfalse negativeを減らすか? だが、ホワイトリストのメンテナンスにもコストが掛かるし、所詮は少数派の声だ。DoCoMoの件で私が問題にしたような保護者の態度を見るにも、プロバイダはホワイトリストのメンテナンスに手間を掛ける価値を見出さないだろう。

こうして、「インターネットの普及のもっともポジティブな側面」は失われる。性に興味を持つ年頃の子供たちはフィルタリングを突き抜けた巧みなポルノサイトに誘導される。その手の怪しい情報に警鐘を鳴らすサイトはフィルタリングに引っかかって子供の目には触れない。「有害サイト」をフィルタリングしようとしたとき、起きるのはこういうことだ。

穿ち過ぎと思われるかもしれない。だが、だったら今のプロバイダ・ポータル各社が提供している実装は何だ? どこの会社にそんな知能的で意味論に踏み込んだ実装を提供できる技術力がある†2んだ? 今まで、子供を有害情報から保護したいという保護者のニーズかあって、各社がそれに応えようとしてきて、その結果がこれだ。法案が成立したならば、必ずそういう結果になるだろう。

  • †1: 私ゃ、別にチャタレーにせよサドにせよ猥褻とは思わんが
  • †2: 実はその辺の意味論の話には興味があるので、そういう技術力のある会社があったら雇ってください。お願いします

2008年01月02日

Ruby on Railsはゲットーだ

って、 Zed Shawが言ったらしいね

そういえば、しょーもないのが流れすぎてrails-talkを読まなくなって久しいな。個人的には袋小路説にちょっと同感だったり。

Rails 2.0はあるべき形に非常にすんなりと収まりすぎてつまらない。すんなり収まったのは成功の証ではあるんだが、そこに革新性はないように見える。あとはソースコード読んでみないと分からないけど、袋小路に陥ってきている可能性はある。

革新性が尽きてきたというのは、「ようやく安心して使えるようになっていく」のか「使い物にならなくなるのか」。Railsの残された問題は「アーキテクチャの保守的なところ」と「内部の黒魔術」だけれども、後者は改善されていくのか。はたまたMerbに昇華するのか。昇華というにはMerbはちょっとこじんまりした印象だけどね。

ま、早くからRails, Rails言ってたような人柱指向の人たちはその辺はちゃんと見極めようとしているように思うのでRailsを超えた大きな流れに関してはあんまり心配してない。私は何にしても、もう一回Railsのソース読んで、それで判断する。いずれにしても、「フレームワークは言語をあんな風にオレ色に染め上げても良い -- それを可能とするRubyの底力」とかその辺はどこかに生き残るし、仮にRails自体が袋小路に陥ったとしてもこの数年は「黒歴史」にはならずに「支える礎」「過去の良い教訓」として生きつづけるだろう。


資格によるプログラマの独占について

新年だから夢物語でも書くか。

全力でプログラマーを「人気の職業」に押し上げたい」は興味深い記事だった。でも、すでに各所で指摘されているように実態を改善せずにイメージだけ良くしても「使い捨てる余地」を増やすだけ。そして、SIの下のほうを見聞きするならば誰もが感じるように、人が足りないんじゃない。人が多いんだ。経験5年の人にFizzBuzzやってもらって本当にできなかったときは冗談かと思ったもの。

もし抜本的な解決を求めるなら、最終的な目標は医師や弁護士と同じく、業としてのプログラミングの資格による独占だよね。これによって絶対的な質を保証して、供給が減った分だけ値段は上がる勘定で、しかもプログラマの「無駄を省くことへの本能的欲求」と能力にまかせれば、プログラマの数を減らしても質が高ければ回る。ま、そんなのは昔からIBMだのマイクロソフトが何度も言ってることだ。

で、業としてのプログラミング行為を許す対象だけど、「基本情報技術者」以上とかぬるい話もあるけどぬるすぎるよね。専門学校で2年勉強してあれをとれない人がいるっていうのもなんともはや複雑だけれど、とにかく「基本情報技術者」ではぬるすぎる。

よく言われるようにプログラマはその究極において「言語」か「OS」か「ハードウェア」に行くらしい。じゃあ、実技込みで「題意を満たすコンパイラ、OSまたはCPUの開発」(3つのうちから1つ選択)みたいな試験にすれば良いのでは? つーか、これ、先進的なものを創造せよいうならともかく、古典的で学習的な構成のものをただ作るだけなら専攻の人にとっては学部レベルだよね? (私はコンピュータサイエンスは専攻してないからまた聞きだけど)。だから、簡単過ぎるということはあっても難しいということはないだろう。仕事でやるならコンパイラかOSかCPUか、それぐらいは作れるようにしろっと。そういうことで1つどうだろう。

Blog操作

検索


カテゴリー

このブログについて

あわせて読みたい

follow yugui at http://twitter.com

© Yugui

Powered by Movable Type 3.2-ja-2