Skip to main content

Posts

Showing posts from November, 2012

Progress in three months

C 嬢は三ヶ月前には一桁の足し算を練習していた.一桁の足し算は良いとしても二桁になるとなかなか難しい.ところが次の週になると同じ問題を一瞥しただけで ``Geht's nicht (できない)'' と投げ出してしまうのだ.それが一ヶ月以上続いた.なかなか難しいなと思った. 私は「数学は言葉であり,人の意思の反映の一つである.というようなことは今はわからなくてもいいけど,でも,式には皆意味があるのだ.3+4はどういう意味なのだろうか.」というような話を毎回した.ある時は図を使って,ある時はブロックを使って話をした.彼女はそんなことよりも宿題の答を教えて欲しいと泣くこともあった.私は「答は重要じゃない.わかったかどうかが重要なのだ.」という話をした.しかし,まあ,彼女にはそれはどうでもいいことで,宿題をしていかないと明日が困るということだった.どうやらこの子の学校の先生は,Hasenschule が宿題を助けてくれることを期待しているらしく,そういう意味では,私は学校の期待に応えない役立たずであった.しかし,私には宿題の答えが書かれているかどうかなどはどうでもよく,この子が一つでも何か理解できるかが重要と思っていた.ある時,この子は私の教室から抜け出して他の先生に宿題を助けてもらっていたこともあった. この子はもう二年もこんな調子だったそうである.ところが,ここ二三週間の進捗には私は驚いた.先週は私達は三桁の引き算を勉強した.一桁の足し算とは話が違う.802-456 というようなものである.最初彼女は,2 から 6 引くことは``Geht's nicht'' と言ったので,難しいかなと思ったのであるが,彼女は 5 の下に 1 を置いて,12-6は 6 と言ったのだ.私それでは後で困るぞ,と思ってみていた.私は彼女が, 802 - 456 = 800 + 12 - (450 + 6)     ... (1) のように計算しようとしているのだと思ったのだ.これは, 802 - 456 = 790 + 12 - (450 + 6)     ... (2) でなくてはいけない.したがって私は彼女が間違えると考えた.しかし,実は彼女は 802 - 456 = 800 + 12 - (450 +

Fast lookup child

L 嬢はなまけ癖があるが,それでも時々結構早く課題をこなしてくる.同じ問題を間違える癖がある.たとえば,3+7 を 12 と答える.しかし,聞けば時間はかかるが正しい答えに到達する.ふと気がついたのだが,このスピードでどうしてこの課題をこんなに早く解くのだろうか.そこで私は彼女の横に座ってどうやって解くのか見ることにした. なんと,彼女は全然計算をしないのだ.彼女は過去にやった問題を次々に探して同じ問題をみつけては答えを写していたのである.それがかなり速い.私よりもずっと速い.道理で同じ問題を間違えるはずである.Bitte nicht angucken! が私が新しく覚えた言葉である.「見てずるをしないこと.」 しかし,彼女のずるの速度はちょっと見物である.これも才能なのかもしれない.この才能を discourage するべきなのか,私にはわからない.でも,計算はできるようになって欲しいので,やっぱり私は今日も Bitte nicht angucken! と彼女に言うのであった.教えるというのは難しい.

詳細を知りたくない bug: どうやって global static destructor を二度呼ぶのか

Abstract ACM の Kode Vicious コラムは私の好きなコラムの一つである.(e.g., http://doi.acm.org/10.1145/1364782.1364791 ) プログラマとして働いていると時に彼の血圧を上昇させるバグに出会う.今回のバグは global な staticconstructor と destructor が二回呼ばれるというバグである. Contents 私は global な static object を作ることを基本的に避ける.static なobject はいくつかの副作用があるからである.特に C++ ではどのようにそれらが呼ば れ るかはプログラマの制御下にない.ではなぜ私はこんなバグにあうのか,それは私の書いたコードではないからである.しかし仕事であるからには文句ばかりも言っていられない. 今回デバッグしていてわかったのは,ある static object の destructor が二回呼ばれていることである.私はそんなことが可能であることを知らなかった.C++ では static object は main が呼ばれる前に construt され,main が終了 した後に destruct され,それらの call の回数はコンパイラが一度だけに保 証 するはずだからである. しかし,どのように binary を作成するかによっては以下のようにして二度呼ぶことが可能である.アイデアは dlopen を使う以下のようなものである. main のある application に static object A を link する. static object A のある shared library S を作成する. main は S を動的に load し,unload する. あとは詳細である.コードの例を示す.  example_factory.h は shared library 内部にあって application 側で利用する IExample_class を作成する factory IExample_factoryの宣言である.  example_factory_impl.h, example_factory_impl.cpp は shared li

マルコフ行列の中の著者達: どの著者がもっとも人々に影響を与えたのか? (付録 A)

付録 A: Matrix とは何か グラフを記述するのに matrix を使った.ところで matrix とはなんだろうか.簡単に言えば,matrix は数を並べた表である. 通常,いくつもの数を並べたものはやはりいくつもの数を並べたものである.たとえば,以下のようないくつかの都市の距離の表を考えてみる. \begin{eqnarray*}   \begin{array}{lrrr}    & \mbox{東京}   &  \mbox{Berlin} &  \mbox{Auckland} \\    \mbox{東京}     & 0     &    8940 &   8811    \\    \mbox{Berlin}   & 8940  &       0 &  17742    \\    \mbox{Auckland} & 8811  &   17742 &      0   \end{array} \end{eqnarray*} マトリックス(matrix) は数をこのように行と列で並べた表である.日本語では「行列」という.しかし数学ではこの表を一つのかたまりとみる.時にこの表を,奇妙なことかもしれないが,一つの数のように扱うのである.一つの数のように扱うというのは,数と同様に matrix の間での演算があるということである.たとえば,matrix 間での足し算やかけ算というものを考える.それには数の 0 に相当する matrix や,数の 1 に相当する matrix が存在するということである.めんどうくさがりやの数学者は多数の数の間の関係をいちいち書くということに飽きて,ある数のまとまりの関係が一つの関係でおさまることを発見した.それを一つの対象 --- matrix --- として考えることで,様々な関係を簡潔に示すことができることを見い出したのである. ここで matrix の用語を少し述べよう.matrix には「行」と「列」がある.matrix が 3 列,4 行の表である場合,\(3\times 4\) の matrix であるという.matrix を構成するそれぞれの数のことを matrix の「

マルコフ行列の中の著者達: どの著者がもっとも人々に影響を与えたのか? (7)

隣接行列 行列は数を二次元のます目上に並べた表である.ある規則で数を並べると,それがグラフを示すことと同じことになるので,ここで述べる.つまり動機はグラフを記述することにある.そのようにグラフを表現する方法の一つとして隣接行列がある.ここでその定義を述べておこう.行列に関して簡単な紹介を付録 A に記しておく.さらに行列に関して知りたい読者には文献[7]を参照して欲しい. Definition: 隣接行列は N 個の点を持つグラフを表現するものであり,\(N \times N\) の大きさを持つ.ここで,点\(i\) と点 \(j\) 間に有向辺がある場合,行列の成分 \(a_{i,j}\) を \(1\) とし,辺がない場合には\(0\) とする. これだけである.つまり隣接する点(= 辺で接続されている点)の要素を 1,そうでない要素を 0 とするような行列を隣接行列と呼ぶ. 例として人間関係のグラフを考え,好きか嫌いかの関係を隣接行列で示そう.好きという関係がある場合には点の間に辺を置くとここでは決める.嫌いな場合に辺を置くとしても良いが,私は嫌いな関係よりも好きな関係を知りたいので,今回は好きな関係とする.注意して欲しいのはこういう部分は私が勝手に決めることができるということである.これは事実とかではなくて,問題を解こうとしている人が矛盾が起きない限り,勝手に決めることができる.もし私が,「定義する」とか「仮定する」とか「と,考えてみよう」と言ったら,それは私が決めたことであって,読者には賛成してもらいたいと思っている.もし読者が賛成しない場合,その後の議論は意味をなさない. 次回は Alice に登場してもらって好き嫌いグラフを書いてみることにする. 文献 [7] Gilbert Strang, ``Introduction to Linear Algebra, 4th Edition,'' Wellesley-Cambridge Press, 2009