MatzがまたPHPの良くないところを批判して炎上してるなぁ。
たとえば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リリースおめでとう!
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)
Apple Remoteの操作を受け付けなくなった。Genius Barで相談してみたら、どうもハードディスクのそばにあった受光装置のケーブルが断線してるっぽい。そばにある、スリープ時の点滅ランプも点かなくなってる。有償修理が必要だって。わーい。
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の判断を仰ぎたいんだけど、返事がない。ただの屍のようだ。笹田さんによれば「なんか最近忙しそう」ってことだから、ちょっと待つか。
第1回RHGの逆襲を開催しました。お越しいただいた方々、ご覧くださった方々、ありがとうございました。
発表資料は、あんまりまとまってません。その場でソースコードを開いたり色々するつもりだったのでself-containedではないです。その割には途中で資料を辿るのに必死になりすぎて、笹田さんのように華麗な解説とは行かなかったのが残念です。笹田さんのおかげで途中で目が覚めて、ホワイトボードで解説をしてるのが中盤以降です。人に伝える技術の未熟を痛感します。
ustreamの動画のほうも、笹田さん側の動画がRECORDされてないこと、そもそも二本のチャンネルを並行して使ってたっていう構成上、後で参照する資料としてはあまり出来が良くないですね。
そもそも、苦肉の策だったとはいえ二カ所に分散して開催するというのはよくありませんでした。それにしても、こんなにも多くの人に関心を持っていただき、交流の場を作れたという点だけは良かったと思っています。次回以降の改善方法についていくつかの意見をいただいています。
細かいことは後で書く。
私は仏教徒ではない。民俗神道は私の価値観に強く影響しているし、形而上の問題に関してはキリスト教も影響が大だ。私の理性は儒教はナンセンスと言っているけれども、私はまだ儒教価値観から脱することができていない。でも、私は仏教徒ではない。
たぶん、四苦という認識の枠組みや、その上での解脱という発想が気にくわないんだろう。
人間にとって生が苦痛を伴うものであるかどうか断言することはできない。でも、私にとって生は苦痛だ。生に多くの喜びがあるのと同様、苦痛があって、それは良くある話だ。私に関して言うならば、性同一性障害という問題は私にとってとても大きい。私の身体の有り様が私に苦痛をもたらす。だが、身体性から独立した人格、自己同一性はあり得ない。故に、私は、私が在る様が苦痛である。私は、私が生きていることが苦痛である。
だが、もうこれ以上の人間が、私のような思いをしなくてもすむのではないかと私は考えた。今の私はその考えから出発している。その果てにある発想として、苦のない生があるべきだと考えた。生からの脱出でなく。故に、私が理解している限りの仏教のことを、私は好きでないのだろう。そう気づいた。
でもなー、「苦のない生」を「生老病死のない存在」と言い換えたら、それは釈迦とどう違うんだ? と、今思った。
懐かしのRuby 1.6をコンパイルする。
ソースは http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_6 にある。
$ autoconf $ ./configure --program-suffix=-1.6 $ make miniruby
ここまでは良い。問題は添付拡張ライブラリのコンパイルである。
61行目付近にあるrm_fがうまく動作しない。conftestで作成するバンドルのところで転ける。システムにとってはライブラリファイルだけどUNIXインターフェースにとってはディレクトリ、という状況を想定してないのだろう。
面倒なので、こう書き換える
def rm_f(*files)
system 'rm', '-rf', *files
return
# .... もとの実装
end
44行目付近にあるrm_fが同じく
まず、12行目のsrcdir。/path/to/checkout/dir/'.'とか、余計な'.'が付いているので削除する。
それから、あちこちによく分からない|_#!!#_|という記号が付いているので全部削除する。
readlineのヘッダと整合性がとれてなくてコンパイルできないっぽい。直すのが面倒なので捨てる。
ext/readline/extconf.rbの9行目を
if false and have_header("readline/readline.h") and
と無効にしてしまう。
ext/readlineのディレクトリ丸ごと消すのでも良いと思う。
ここまででmakeできる。
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を上書きして泣かないように。
モデリングツールの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
<?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>
ビブリオマニアが主人公だということで紹介してもらった「R.O.D」を読んだ。何という既視感!
とても身近な現象をそのまま極端に拡大した風景が描かれている。私も、外出するときになぜそんなに本を持ち歩いているのかとよく問われるよ。決まってるじゃないか、行きに読むのと帰りに読むの、それから予備、それから途中の書店で買ったやつともう一軒はしごした店で買ったやつと、途中の古本屋で買ったやつだ。さすがに1店買いはしたことないなぁ。お金があればしてみたいけど。
他に活字がなければ定期券の注意書きまで読む、電話帳を喜んで読むっていうのは本当にやったことあるし。
稀覯本趣味は無いのでその辺はよく分からないけど、とにかく作者が本を愛してるのはよく分かった。仮にも本好きが本好きを語るならばもう少し叙述に凝って欲しかった感は無いではないけど。ライトノベルという制約はあるにせよ、もう少し書いても罰は当たらんだろう。物語として良いとかそういうのとは別に、身近さと、自分に通じる性質を極限まで拡大した登場人物への憧れと、そんなものを楽しませてもらった。
関数そのものがファーストクラスではない
やー、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は逆操作をする。
私としてはScheme方式のほうが格好いいとは思う。Rubyの名前空間分離方式っていうのはCommon Lispから継承した代物だよね。たぶん。いや、CL以前のLispのどれかかもしれないけど。
でも、名前空間を一緒くたにすると「selfを省略可能」「引数の括弧を省略可能」というのは難しくなってしまう。Rubyとしては、高階関数を綺麗に書けることよりもこれらのほうが重要だろうと判断しての選択だ、とまつもとさんは言っていた。Ruby 1.9では今のところは
proc.(arg1, arg2, arg3)
はできるようになっているけれども。この点についてはまつもとさんも苦心しているのが見えて、対案がないことにはどうも文句を言いづらい。
というわけで、名前空間の違いですよー、と。
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
==========
「『有害サイト』フィルタリングは何をもたらすか」について、いくつか興味深いコメントをいただいた。
フィルタリングを人間の手で行うと、フィルタリングされる内容が次第に拡大していって、最終的に一部の情報は完全に手に入らなくなるような気がする
それはそうだ。だから、本質的に暴走の危険を孕んだこのような法案には反対だ。前の記事の冒頭で紹介したような「拡大解釈のおそれがあまりにも大きい」「プロバイダ責任制限法でやれ」という意見に賛同する。
ただ、もしやるならば、粗雑な実装のくせにGoogleのごとく「人間の判断は介入していない。アルゴリズムの判断だ」という言い訳を許すことだけはしてはいけない。人間がやったことならばその政治性を問うことができる。だが、「技術限界」と言われては「私を雇え」ぐらいしか言いようがない。
だから、とりあえず現実的な解として「ブラックリスト」の可能性を検討したのだけれども、それでも暴走は止められないというのが前回の結論であった。それに、人間にやらせれば恣意性は生まれてくるという指摘は確かだろう。もし本当に「有害情報」をフィルターしたいなら、ちゃんとした技術による処理が必要だ。
有害な情報を見つけるのは有益な情報を見つけるのと同程度に困難だ
有害であることと有益であることは対称なのかもしれない。ならば、限定的ではあるけれども私たちは情報を価値づける方法を知っている。PageRank(TM)だ。あるいは、それに代わる次世代の何か。それがあればある程度公正に有害な情報を検出できる。情報を価値づける技術。
なるほど、この法案は情報大航海プロジェクトに繋がったりするんだったりして。だったら、この手の離散的計算のトップランナーに学ばない手はないよね。GoogleとAmazon。その背後にあるのはクラウド・コンピューティング。
この法案をまともなものにするならば「Googleを超える人間にとっての価値判断代行アルゴリズムの実装を構築するぞ」としか考えられない。そこまで言うなら、私は「列島改造論」を提唱する。
列島改造。日本国38万平方キロメートルをサーバーラックで埋め尽くす。階上にはまたサーバーラック。その上にもサーバーラック。勿論、設計的に可能な限りサーバーを。人? 人はイスがあれば寝られる。立って半畳寝て一畳だ。†1サーバーは順次新機種で入れ替えて。そのサーバー群を統御する技術を国を挙げて開発する。なんという計算能力!
なるほど、これならば法案も現実味を帯びてくる。そして、次世代を担うと見込まれる技術において日本は圧倒的な競争力を持つことになるし。そもそも日本は列島を掘り返してハコを作るのは慣れてるんだからOK, OK。
国会議員はすごいことを考えるものだなぁ。プログラマの雇用も確保されて、よかったですね。†2
昨日の続き。
バックアップDVDからの復元に失敗したのであった。ディスクはしっかり数GB書いてあるのに、中の唯一のファイルが300KB足らずっていうのは明らかに何かがおかしい。焼き損なったかな。
元のハードディスクから復旧を試みたいけど、マウンタとか買ってくるのは面倒。なので、Ubuntuの入ったミドルタワーにSATAでつないでマウントして、scpでMusics/iTunesディレクトリをMacBookに移した。このディレクトリに対してiTunesから「ファイル」→「読み込み」したらデータを回復できた。Linuxがhfsplus対応してくれて良かった。
普段使ってるGUIアプリは大体インストールしたつもりだったけど、システム管理系を忘れてた。
まだインストールしてないけどライセンスはあるもの。あとで入れる。
ライセンスデータはオンラインストレージに入ってるので無問題。
あとで暇なときに入れるもの
MacBookが最近、不規則に長時間入力を受け付けなくなる。マウスカーソルは動くけれどもアプリケーションの切り替えは重かったり、受け付けなかったりする。最初はアプリケーションがCPUを食いつぶしてる可能性やらを考えたけれども、最近のタスクスケジューラはもっと賢いだろうしなぁ。段々と症状は酷くなってきて、ただ、どうもディスクアクセスと相関がありそうなことに気がついた。
ああ、この話は聞き覚えがある。もろはしさんの事例と同じ症状だ。見てみると、コンソールにも同じログが出てる。原因はハードディスクの損傷らしい。そう思って考えれば、先日ディスクに猛烈にアクセスしてる最中にうっかり本体を蹴り上げてしまったのだった。垂直方向に猛烈な加速度が……。決まりだね。
ちょうど今のハードディスクも手狭になってきたところだし、Leopardも試したいし、データのバックアップは普段から万全。基本的にデータはオンラインストレージにあるものがマスターで、ローカルのやつはただのキャッシュなのだ。
そういうわけで、ハードディスクを換装してLoepardをクリーンインストールすることにした。
秋葉原でLeopardとハードディスクを買ってきた。元々入ってたディスクは東芝MK6034GSX。厚さが9.5mmのやつを選ぶように注意すれば基本的に2.5インチSATAのディスクの何でも良いっぽい。でも一応、同じ東芝にしておけば安心だろうと、MK2546GSXを買ってきた。
適当に検索して出てくるサイトを参考にやってみた。
裏のロックを解除してバッテリーを外す。そうすると、バッテリーで開いた空間の側面にL字型の保護金具があって内部へのアクセスができなくなってる。この金具は3点のプラスの小さいネジで止まってるので、これを外す。†1
左側にハードディスクを抜くための白いシートが出てるので、これを引っ張ってハードディスクを抜く。ハードディスクはシールドにネジで固定されてて、そのシールドごと出てくる。
ハードディスクを固定してるネジは星型のT-8。星型の小さいドライバは家にはT-10までしか無くて、これでは大きすぎたのでドライバも秋葉原で買ってきた。ラジオセンターの入り口近くのところの工具店が揃ってるという話だったので、そこへ。ああ、そっか。昔よく半田を買ってた店だ。
さて、ハードディスクを外して、新しいハードディスクを代わりに固定して。で、これを元通り差し込む。中のゴムにガイドが入ってるのでそこに載せて入れるとちょうど良いらしい。
電源入れて、インストールDVDを挿し込んでここからブートさせる。で、DVDの読み込みにちょっと待った後、インストーラーが立ち上がる。ここでメニューからディスクユーティリティを選んでハードディスクを初期化するんだけど、最初ハードディスクを認識しなくて焦った。ちゃんと入ってなかったらしい。電源落として、もう一度ハードディスクを入れ直したら認識した。
あとはインストーラーの言いなりにインストール。ちゃんと見てなかったけど、30〜40分くらいでインストール終了。
初回起動時にAppleアカウントを聞かれる。.Macのアカウントを入力したら、ユーザー名やなんかは前の設定が引き継がれた。
起動したらソフトウェアアップデートして、OSのインストールはおしまい。
システム環境設定
あ、辞書のバックアップ忘れた。最近はデフォルトでストレス感じてなかったので、まあいいや。
ATOK 2006はインストーラーがLeopardに対応してないらしい。JUSTのサイトから対応ツールをダウンロードする。
Leopardでの動作の制限も多いね。新バージョンを買うことも検討しよう。
シリアルナンバーがどこか行ってしまった。JUSTのユーザーIDは残ってたのでこれでJUSTのサイトにログインしたら、登録済みの製品一覧にシリアルナンバーが書いてあった。
Hey, you! インストール後に再起動しようとしたまま終了しないんですけど。最初は綺麗に行きたかったんだけど、10分ほど待っても反応がないので電源ボタン長押しで落とした。
Backup.appをインストール。iTunesのバックアップディスクから復元しようとしたらなんか復元できない。ガーン。
購入したものはiPodから復元できたけど、それ以外はリッピングし直しだろうか。いや、元のハードディスクをつないでライブラリを統合すれば良いのか。あとで考える。
これだけあればとりあえず仕事はできるかな。
民主党が有害サイトの削除をプロバイダに義務付ける法案を検討しているという。
しかも、「有害な恐れがある場合は児童が閲覧できなくなるような措置」も義務付けるそうだ。
それから、昨日のNHKニュースで「警視庁の調べによれば児童・生徒の70%が携帯電話を持っており、そのうち有害情報フィルタリングが有効になっているのは2割のみ」「携帯電話各社は18歳未満の契約者に対しては初期状態でフィルタリングを有効にすることを検討中」とも言っていた。
とても良いことである、とともに、とんでもないことである。
判断力の未熟な年齢のうちに微妙な情報に変に感化されないように保護することは、一般論としては良いことであるといえる。年齢の線引きはいつでも微妙な問題なのだけれども、日本では大体18歳になる。18歳になれば平均的には相応の判断力がついてるし、馬鹿な人間は何歳になっても馬鹿だからね。
拡大解釈されて検閲につながる可能性であるとか、プロバイダ責任制限法で対応できるとか、そういう議論はすでに出ている。
私は、安価に維持できるフィルタリングは有害無益である、と改めて述べたい。
この点についてはかなり前にちょっとした調査をしたことがある。
大体が、フィルタリングを実装するプロバイダってのは、「同性愛」(同性愛的なアダルトコンテンツは含まない)を「有害情報」と断定するような連中なんだよ?
私がこれまでの調査と経験から知っていることをもう一度述べよう。
これはなぜか。日本は、ネット台頭以前に同じことを人手で一度やった経験があるからだ。これは受け売りであるけれども、日本はかつて猥褻本を強く抑圧した。私でもまあ、チャタレー事件や、渋澤龍彦のサド事件は知ってる。こういう猥褻本†1の摘発の流れの中で何が起こっていたのか。
摘発の過程で問題になったのは、いつでも「どういう表現が使われているか」だ。まあ、そりゃそうで、内容に踏み込んで想像をたくましくすると猥褻であるとか、そんなことを言っていたら何にでも難癖をつけられる。この点については豊田有恒がよく茶化していて、『非・文化人類学入門』の「ポルノ」によれば、曰く、「人魚姫の王子様はサディズムの趣味があったかもしれない」「明記されていないからこそ、いかようにでも想像できて興奮する」「究極のポルノは聖書(の系図)」
さて、こうして、「じゃあ直接描写しなければいいんだろう」ということで日本語の官能小説における隠語表現は著しく発達したのであった。この語彙の発達については『官能小説用語表現辞典』に詳しい。日本の官能小説家たちはこんなにも表現を工夫したのかと感嘆する(そして呆れる)。
そういえば、先日見た「クワイエットルームにようこそ」にも主人公が官能小説を「あぁ、どんぐり、どんぐり、どんぐり!」と読み上げるシーンがあった。日本官能小説の力をもってすればどんぐりすら官能的なのである。
要するに、日本語で性的興奮をそそるような文章を書こうとする場合、あまりにも表現が多様化しすぎていて、かつ日常用語と見分けがつかないように進化していて、単語ベースでフィルタリングするには無理がある。日常用語だけで官能小説を書くことは可能だし、おそらく実例は存在するだろう。
これに対して青少年が誤った性知識を身につけないようにするサイトであるとか、同性愛に関しての偏見を取り除こうとするサイトであるとか、性同一性障害者が生きていけるように支援するサイトであるとか、こういうサイトは概して隠語を使わない。だから、こういうサイトはフィルタリング機構がもっている「性的な単語」のデータベースにとてもよくマッチする。
したがって、意味論を考慮せずに字面でフィルタリングするような真似をすると、ポルノサイトはフィルタを通り抜けるが啓蒙的なサイトはフィルタに引っかかる傾向がある。要するに、false nagativeとfalse positiveが非常に多いのである。前述の私が行った実験も、一サービスの実装を確認したに過ぎないが、結果はこの説を支持している。
DoCoMoのフィルタリング導入の際に草実スサさんはこう書いている。
悩んでいる子供にとって、「自分と同じような人間が他にいる」という情報、「それはまったく悪いことなんかじゃない」というメッセージが、どれほど重大な意義を持つか。
抑圧されてきたマイノリティに関する情報が、ネットに接続できさえすれば手に入る。被差別少数者が、共感し、連帯できるかもしれない。こうしたことは、インターネットの普及のもっともポジティブな側面の一つではないだろうか? こういうネットの可能性を、「社会通念」の名の下にやすやすと子供から奪い取って良いものかね。
多分、フィルタリングを義務化すればこうした問題が起きるだろう。こうしたfalse positiveの問題を起こさずに有害な情報をフィルタリングしようと思ったら、唯一の方法は「よくメンテナンスされたブラックリスト」だ。だが、ブラックリスト方式はメンテナンスコストが掛かるし、false negativeを容易に起こす。
だから責任を負いたくないプロバイダはfalse negativeを減らすために単語ベースのフィルタリングを併用するだろう。false positiveが増えても気にしないだろう。あるいは、単語ベースのフィルタリングだけで「警察に目を付けられない程度」に収まると判断すればコストを優先してブラックリストのメンテナンス(あるいはフィルタリング提供企業からの購入)を止めるだろう。あるいは、ホワイトリストでfalse negativeを減らすか? だが、ホワイトリストのメンテナンスにもコストが掛かるし、所詮は少数派の声だ。DoCoMoの件で私が問題にしたような保護者の態度を見るにも、プロバイダはホワイトリストのメンテナンスに手間を掛ける価値を見出さないだろう。
こうして、「インターネットの普及のもっともポジティブな側面」は失われる。性に興味を持つ年頃の子供たちはフィルタリングを突き抜けた巧みなポルノサイトに誘導される。その手の怪しい情報に警鐘を鳴らすサイトはフィルタリングに引っかかって子供の目には触れない。「有害サイト」をフィルタリングしようとしたとき、起きるのはこういうことだ。
穿ち過ぎと思われるかもしれない。だが、だったら今のプロバイダ・ポータル各社が提供している実装は何だ? どこの会社にそんな知能的で意味論に踏み込んだ実装を提供できる技術力がある†2んだ? 今まで、子供を有害情報から保護したいという保護者のニーズかあって、各社がそれに応えようとしてきて、その結果がこれだ。法案が成立したならば、必ずそういう結果になるだろう。
そういえば、しょーもないのが流れすぎて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つどうだろう。