Friday, October 4, 2013

ピラミッド(指数)のパワー(2)

以前のポストの回答です.

A1. 

ここでは 5 階層と 6 階層の勧誘に成功したと仮定します.その場合,ヒトシ君の得られるお金は

40^2 * 0.25 * 10万 * 0.9 - 10万 = 3590万円

答.ヒトシ君は毎月 3590万円の収入が得られます.

A2.

カズヒロ君ももちろん同じ金額を入手します.ただし,この問題では東京の人口を考えなくてはいけません.カズヒロ君が収入を得るには 7 階層が完全に埋まることが必要です.7 階層の人数は,

1 + 40 + 40^2 + 40^3 + 40^4 +40^5 + 40^6 = 4201025641

42 億人必要です.東京の人口は 1400 万人としたので,カズヒロ君の収入は,

0 - 10万

で毎月10万円の損失です.

答: カズヒロ君の収入毎月 -10万円

A3.

ヒトシ君の必要な階層数は 6 です.

1 + 40 + 40^2 + 40^3 + 40^4 +40^5 = 105025641

これは 1 億人を越えていますので,ヒトシ君の実際の収入はやはりマイナス10万円です.

答: ヒトシ君の収入毎月 -10万円

ところで,カズヒロ君はヒトシ君に騙されたということでもう友達ではなくなってしまいました.

答: ヒトシ君の収入毎月 -10万円,その上友達がいなくなりました.

マルチ商法は,基本的には奴隷が王様に税金を収める仕組みですので,王様にならないとお金持ちにはなれません.全員が王様になるということはできませんし,勧誘も王様になる可能性があるということを納得させられます.それは嘘ではありません.誰かは王様になれます.しかし問題はあなたが王様になれるかですが,まあ,この数を見た場合,もし100人他にやっている人がいるのならば奴隷になることは覚悟した方がいいかと思います.

エッセイ問題: 一部のマルチ商法システムが海外進出を図る理由を述べなさい.

会社の近所にできた新しい店

会社の近所にできた新しい店,以前は中華料理屋だった.

ピラミッド(指数)のパワー (1)

算数の練習問題を作成していて,指数についての次の問題を考えた.指数というのがいかに急成長する数なのかについての実感を持ってもらうのがこの問題の狙いである.

ヒトシ君はお金に困っていたので,ピラミッド式販売方法(マルチ商法)に参加することを考えました.このシステムでは会員になると毎月10万円の買い物をある特定の会社からしないといけませんが,ヒトシ君が下部の会員を 40 人勧誘することに成功すれば,2階層下の会員の買い物の 25% がリベートして入ります.ただし,リベートのうちの10%はさらに2階層上に支払わなくてはいけません.彼は今東京に住んでいます.彼が参加したマルチ商法では,彼は比較的上の階層でしたが,それは 4 階層目でした.ここでは東京の人口を1400万人と仮定し,ヒトシ君の勧誘は東京に限られることとします.

Q1. 東京の人口は一時的に忘れることにして,ヒトシ君が40人の勧誘に成功し,その下の階層も勧誘に成功したとして毎月受けとる金額はいくらでしょうか?

Q2. ヒトシ君は友達のカズヒロ君を5階層目に勧誘しました.カズヒロ君の毎月の収入としてみこめるのはいくらでしょうか? 勧誘は東京の人口を越えないとします.

Q3. ヒトシ君の場合で,東京の人口を考慮して平均的に可能な収入を算出しなさい.

回答は次のポストで.

Friday, September 6, 2013

私はクーダムで私を襲って怪我をさせて逃げた男を探している

奇妙な紙をしょった男が駅に座っていた.彼の紙には次のように書いてある."Ich suche nach einem Mann, der mich am 5.9 um 0:40 Uhr auf dem Ku'damm tätlich angegriffen hat und dann weggelaufen ist. Er rief, dass er alle Ausländer, Chinesen und Japaner hasse. Wenn er wirklich dir Zukunft von Deutschland (und der Welt) retten will, dann kann ich ihm einen Job anbieten. Aber nur für kurze Zeit. Sehe sundayresearch.eu".

私の翻訳 「私は9月5日 0:40 にクーダムで私を襲って怪我をさせて逃げた男を探している.その男は全ての外国人,中国人に日本人が憎い.と言っていた.彼が本当にドイツ(と世界)を救おうという気があるのなら,私には彼に仕事を与えることができる.しかしすぐでないといけない.sundayresearch.euを見よ.」

A man with eyepatch.

Zoom in to the message.

Wednesday, September 4, 2013

空白を含むコマンドラインオプションを bash スクリプトに渡す:$* と $@

私は bash にしろ C++ のプログラムにしろ,コマンドラインを処理する時にはできるだけ規則的なものだけにして極力簡単で済ませるようにしている.たとえば,全ての引数は
'-arg_key value'
のようなものであり,たとえ必要なファイル名であってもできるだけこの規則に従うようにしている.この場合,コマンドラインのオプションは必ず key を持つのでその結果は map に入れておけば良い.こうするだけでパースのコードは驚くほど簡単になり,getopt などを使う必要もない.また,コマンドラインのサポートはできるだけ簡単にしてできるだけconfig ファイルを用いることにしている.というのは,1つはこの方法では負の数値の指定に困るからであり,もう1つはテストなどでの再現が簡単だからである.

しかし,この方法はコマンドラインオプションの value が空白を含む場合には問題が起きる.できれば config file だけですませたいが,そうもいかないこともある. そのような例を示そう.

たとえば vector 値を渡したい場合に

   command -eye_position '0 0 -10' -up_vector '0 1 0'

とするような場合を考える.C++ のプログラムを手動で起動する場合には問題はないが,これが test case などで shell script や python から呼び出したい場合には注意が必要である. この例を test_1.sh に示す.

-- test_1.sh --
echo "call with two args, but the second one has spaces."
echo "./test_2.sh args0 'args1_1 args1_2 args1_3'"

./test_2.sh args0 'args1_1 args1_2 args1_3'
-- test_1.sh --

呼び出される test_2.shはコマンドラインがどのように解釈されるかを示す.

-- test_2.sh --
echo "show the args with \$*."

for i in $*
do
    echo " $i"
done

echo "show the args with quoted \"\$*\"."

for i in "$*"
do
    echo " $i"
done

echo "show the args with \$@."

for i in $@
do
    echo " $i"
done

echo "show the args with quoted \"\$@\"."

for i in "$@"
do
    echo " $i"
done
-- test_2.sh --

私が test_2.sh で引数として解釈して欲しいのは,

  • $1: args0 
  • $2: args1_1 args1_2 args1_3

のように2つの引数で2つ目の引数には空白が残っているものである. このスクリプトの実行結果は以下のようになる.

-- result --
call with two args, but the second one has spaces.
./test_2.sh args0 'args1_1 args1_2 args1_3'
show the args with $*.
 args0
 args1_1
 args1_2
 args1_3
show the args with quoted "$*".
 args0 args1_1 args1_2 args1_3
show the args with $@.
 args0
 args1_1
 args1_2
 args1_3
show the args with quoted "$@".
 args0
 args1_1 args1_2 args1_3
-- result --

$*や$@ではスペースがあるために他の引数として解釈されてしまう.そこで quote すると"$*"では1つの引数として考えられてしまう."$@"が私の欲しいものである.これが bash での$*と$@の違いである.細かいことであり,知らなくてもいいことではあるが,これを知っているとちょっといいかもしれない.

Myron Krueger の驚きのデモ 1988.

インタラクティブアートや virtual reality のさきがけということである.既に二本指を広げることで画像を拡大したり,指で画像を移動させるという,今ならタブレットやスマートフォンでよく見ることが実験されている.(4:30あたり)

http://youtu.be/dmmxVA5xhuo?t=4m30s

しかし,ちょっと変だと思ったのは,昨年の訴訟ではこれは Apple の発明の1つであり,Samsung はこれらによって 10 億ドルを支払うという話があった.

http://itpro.nikkeibp.co.jp/article/NEWS/20120827/418281/?ST=smartphone

この発明は Apple の 2005 年の発明であるそうだ.

さらに不思議なのは,このズームのジェスチャーを 1993 年に発明したという人があらわれて,Apple に勝訴しているということである.
http://easthamptonstar.com/News/2013829/Springs%E2%80%99-Own-Beats-Apple

Myron Krueger のデモはいくつもの意味ですごいものだ.それ自身のすごさがあり,そしてこの訴訟の無意味さを示し,特許制度の破綻まで示している.

Friday, July 19, 2013

マララ・ユサフザイ国連スピーチ字幕(日本語・英語)

子供達の教育を訴えたため,昨年の10月にタリバーンの銃撃にあい,奇跡的に回復したマララ・ユサフザイ.16歳になったばかりの彼女の国連の全スピーチに字幕をつけました.英語と日本語の字幕があります.HTML5 JavaScript 対応のブラウザ(Firefox, Chrome, IE10, 等)でご覧下さい.もしこのページでビデオを見ることに問題がある場合には,こちら のページをお試し下さい.


Monday, July 8, 2013

参院選

今日私は大使館を訪ね,参院選の投票をした.昨今の報道は自民党の圧勝とその後の原発の再稼動についてしきりである.私は今回,日本の終焉というものを感じる.原発のことではない.人々の精神の変化である.

かつて日本が災害に面した時,人々は助けあい,新しい技術を開発し,そして街を再建してきた.しかも以前以上のものを再建してきた.災害は苦しく大変なものにもかかわらず,かつての日本人はそこから立ち直り,しかもそれをばねして次のレベルに進む原動力にするほどの底力を持っていた.今回福島には街の再建はまだならず,新規エネルギーのめどは立たず,一歩下がって原発に頼ろうにも,高速増殖炉もプルサーマルも遅れている現状で,原発自身の未来すら見えない状況である.核融合の実現予定ははるか未来である.過去の遺産のエネルギーに頼るのが政策となる...かつての日本の底力はどこにいったのだ? 死にかけているのにそれに気がつきもせず数年の延命に頼るようになったのはいつからなのだ?いつから未来が見えなくなったのだ?

私は自分自身に,「日本というのは一つの国でしかなく,世界全部に比較したら小さなものである」と言ってきた.それでも,それが滅ぶのは見たくない.こういう感情は知らなかった: かつて栄えたすばらしい国が滅んでいくのを見るのは,悲しい.特にそれが自分の育った国であれば.

Tuesday, June 25, 2013

Why does he need to run.


Edward Snowden が逃亡中です.私は最初思いました.何故逃げる? 大統領が彼の言っていることはそのとおりと言った今,なぜ彼が逃げる必要がある?

以下は私の思考実験です.もしかしたらあまり気分が良くないかもしれません.それは私の思考実験は人間性まで無視することがあるからです.ですから私は通常これを人に見せません.今回ここに書くのは,私は彼が害を受けるのを見たくないからです.

「彼を殺す価値はない」と私は最初思いました.もし誰,あるかはどこかの組織が彼を殺すとしたら,その効果は何を狙ったものになるだろうか.

私は2つの彼を殺したい動機の可能性があることに気がつきました.

一つめは政府です.ドミノ効果を避けるためです.第二第三のSnowdenの出現を妨げるためです.しかし,これはあまりにも明らかで,もし政府が彼を殺したら,どういいわけしても世界が責めるのは必至です.

二つめはこれを利用しようとする政府を貶めようとする組織です.最初の動機があまりに簡単なので,もし政府を貶めようとする組織であれば,彼を殺し,そして政府を責めるでしょう.「見たか,政府のしわざだ.あの政府こそ邪悪なのだ.」と.

ここまで考えると,彼の命の重要性がますます増してきます.私でさえこのようなシナリオを想像できるのですから,これを政府が逆手に取ろうとするかもしれません.そして政府は二番目のシナリオを宣伝し,対抗組織を貶めようとする.

彼は今は逃げなくてはいけません.しかし,もし彼が死ねば,政府を疑う人がいるのは避けられません.そこで私は政府に提案します.彼を守るべきです.そうでなければ,あらゆる反対者がこの機会を利用しようとするでしょう.


Sunday, May 26, 2013

私は教育がほぼ唯一世界を良くする可能性と信じています.一緒にやりませんか.


この手紙は,先日私が以前一緒に東北大震災の津波の募金活動をした友人に送ったものです.


皆さん.

おげんきですか.長いことお会いしていませんね.

私は今出も東北の津波の被害の人達のことを気にかけています.しかしほとんどの皆さんにはもう古い話でしょう.そうであれば,この手紙を読む必要はありません.既に次の何かに挑戦していらっしゃることだと思います.

でも,また気にかけている方,ようこそ.ついに私は一つの考えに至りました.

おにぎりの活動中,片親,両親をなくした子供達が学校で授業についていけないという記事を読み,それがなかなか頭を離れませんでした.私が子供達への支援を固執していたことを覚えていらっしゃる方々もいるかもしれません.

私は教育こそが唯一世界を良くする可能性のあるものだと信じています.教育さえしていればいいというわけではありませんが,私には教育なしでは未来を見ることが難しいのです.しかし言うのは簡単,実際に何をしたらいいのか長いことわかりませんでした.数ヶ月前に,私は同じような考えを持ち,しかし,方法を持っている人達の活動を知るに至りました.彼らは既にそのためのシステムを作成し,世界の誰もが無料で利用することができます.しかし,彼らは助けを必要としています.

その組織はカーンアカデミーと言います.その趣旨は,次のようなものです.「カーンアカデミーは現在その使命を実行中の組織です. 我々は営利企業ではありません. 世界レベルの教育を誰にでも, どこにでも無料で提供することによって教育そのものをよりよくすることが我々の目的です.」私はこのシステムを利用して4ヶ月ほどですが,とてもすばらしいと思います.今,私はここで生物学,歴史,そして数学の授業をとってほぼ毎日学んでいます.ただ一つ残念なことは,英語のシステムしかないことです.しかし,先月からこのサイトの翻訳活動を誰もが協力できる環境が整いました.

このシステムを利用している人達は何百万人を越えています.このシステムが日本やドイツの子供達も利用できたらいいと思いませんか.私にとってはこのシステムが英語であるが故に利用できないというのは悲しいことです.私はかつでの Berlin で語学を学んでいた友人が,翻訳によって人々がより良く理解できることのすばらしさを言っていたことを羨しく思いました.それが今私にもできます.

この活動は長く続けることが重要です.一度のパーティではありません.しかし,これは長期に渡って世界にインパクトを与えるものです.私は既にそのインパクトを受けました.私は一日30分ほどしかこの翻訳をしていませんが,できるだけ毎日続けるようにしています.しかし,思ったほど簡単な仕事でないことがわかりました.もしあなたの誰かが参加して下されば,ゴールが近くなることは確実です.

カーンアカデミーについてもし興味を持たれたら,その創設者がビル・ゲイツに紹介されたビデオが以下にあります.(日本語字幕あり)
http://www.ted.com/talks/salman_khan_let_s_use_video_to_reinvent_education.html

カーンアカデミーを利用している学校の先生のインタビューがここにあります.(日本語字幕あり)
https://www.khanacademy.org/coach-res/KA-in-the-classroom/classroom-vision/v/why-use-ka

カーンアカデミーのサイトです.
https://www.khanacademy.org/

そしてどうやって翻訳の仕事に参加するのかを以下に説明しておきます.これは日本の子供達のために限りません,私はドイツ語への翻訳にも参加しています.
  1. https://crowdin.net/join へ行き,Crowdin account を作成します.
  2. "Edit Profile" の下で "Assistance Languages." を選択します.
  3. https://crowdin.net/project/khanacademy をクリックし,言語を選択します.
  4. 緑の "translate" ボタンをクリックし,次のページに行きます.
  5. 翻訳開始!

もしあなたがたの誰かが興味を持って20分間カーンアカデミーのビデオをご覧下さったらそれだけでも僥倖です.どうです,面白いとは思いませんか.

どうもありがとうございます.


Monday, May 20, 2013

Fascist hunter

Kilgore Trout ほど有名ではないが,売れないことに関してはおそらく同等の友人が書いた小説に「Fascist hunter」というものがある.



Umaya は Fascist hunter である.Fascist hunter は「真のFascism」と呼ばれる人々をみつけ逮捕する賞金稼ぎである.真のFascistたちをみつけることは困難である.通常彼らは普通の市民と見分けがつかない.それに手を焼いた各国政府は真のFascist達とその組織に賞金をかけている.真のFascistは組織立っているらしい.Umaya の世界では人々は生存時間に税金を払う必要があり,支払いがとどこおると,suspend されてしまう.ただし,5年に1年は税金を収める必要がない.彼は一度事業に失敗し,4年間冷凍睡眠させられていた.

彼は自己の幸福の追求のために,手っ取り早い収入として,危険はあるがハンターとなることを選んだ.ハンターたちは思想強化装置を脳に埋めこむ必要がある.なぜなら,真の Fascist 達は洗脳をすると信じられているからである.ハンターのうちで真の Fascist 達の仲間になるものが絶えない.この装置は,個人の自由と個人の幸福の権利こそが最重要なものであるということを脳に感じさせ,洗脳に抵抗することができる.

真のFascistたちは,普通の市民に見えて,時に市民を殺害することがある.今回犠牲になったのは,巨大電力会社の役員と農作物の種を生産するバイオ会社の主任研究者である.

Umaya は苦労の末,真のFascist の一員と思われる Leuko という医師に接触することに成功する.彼は身分をいつわり,真のFascist に興味のあるふりをしている.Leuko とその友人達はなかなか正体を示さない.Leuko たちは,学校を尋ね子供達に生物学を教えたりしている.Umaya は一度,Leuko の公開授業に呼ばれる.Umaya は彼らが公開の授業で何か洗脳をしていないだろうかと疑う.授業では細胞の増殖の話がある.子供達は興味深く Leuko らの話を聞いている.細胞はあまりに増殖すると,増殖を自分で抑制したり,あるいは自分自身に異常をみつけると Apoptosis という自殺をする.それによって他の健康な細胞を生かすのである.細胞自身が自分の食べたいだけ食べ,自分の増えたいだけ増殖する異常を示すことがあり,それを癌と呼ぶ.などという話である.Umaya は授業での洗脳活動の痕跡を見い出すことができない.

Umaya はいかにしたら,Leuko が真の Fascist たちの一員であるかどうかわかるか考えるが,ある時深入りしすぎて囚われてしまい,彼の思想強化装置は除かれてしまう.しかし,Umaya は洗脳は受けない.

Leuko は彼らの活動の真意を説明する.Real fascism は実は非営利の企業である.その目的は人類の種の存続である.人類全ての生存と,個人の幸せの追求は時に矛盾する.個人が楽をするためにエネルギーを無制限に利用し,代替エネルギーを開発しなければ,子孫はエネルギの枯渇に直面し,人類は滅亡の危機に立つ.個人の権利を無制限に追求するのは,まさに癌細胞と同じである.DNA がfascist の祖であった.DNA は自分とそのコピーの利益のみを最大化する.Fascismは その範囲を広げてきた.細胞,個体,家族,部族,国家,会社.個人の幸福を追求することも Fascism の一種であり,しかしそれは単に範囲が狭いだけである.

彼らはその名の通り,真の Fascist なのだ.彼らは人類という種のために活動しており,そのためには個人の幸せを追求する権利を二番目に置くのである.かつて Fascist たちは特定の国の特定の人達の利益のみを考えていた.彼らは真のFascist ではない.真の Fascist たちは国,人種,宗教を問わず,人類全体の利益のみを考えているのだ.この世界では個人の自由と幸せになる権利はもっとも重要なもので,ある組織のためにそれらが犠牲になる fascism はタブーである.Fascism は次の段階に入っている.それは人類全体という組織を優先する考えである.そして Leuko は言う,我々の Fascism は第三段階目に入った.それは人類だけではなく地球に住む生命全体の幸福を追求する段階に進むところである.いつかこれが宇宙全体を考えるところまで発展するであろう.この Fascism は悪なのか,Umaya にはわからなくなった.

「真の Fascism にようこそ.」



私は内容はユニークで面白いと思った.Fascism というと考えることもなしに悪であり,それについて考えることがタブーであったりもする.私は自分自身がこの「思考停止」に陥いっていたことに気がついたので,その意味で興味深いと思った.

しかし,終わりが Kilgore Trout の小説「ドッグハウスにようこそ」を思い起こすので,それはやめた方がいいのではないかとBilly に話した.彼は,「ドッグハウスにようこそ」を読んだら誰でもこういう終わり方を一回はやってみたくなる.でも,最後の一文は出版する時にはなくそうと思う.ということである.

Saturday, May 4, 2013

選択されない男


Kilgore Trout ほど有名ではないが,売れないことに関してはおそらく同等の友人が書いた小説にこんなものがある.SF なのかロマンなのかちょっとわからない.タイトルは「選択されない男」である.

主人公はそこそこ成功しているビジネスマンである.しかし,彼は見た目には魅力的であるが,女性に関してはうまくいった試しがない.実は母親も彼の姉妹達も彼とは距離を置いていた.
 ビジネスの世界での成功はあまり彼に喜びをもたらさない.何が彼に喜びをもたらすのか,様々な趣味を試し,世界を見てまわり,結局彼の町に戻ってきて考えたのは,子供に何かを教えるということだった.彼は教育以外に世界を良くする方法をみつけることができなかったのだ.
彼は彼のビジネスをやめ,彼の財産をはたいて小さな学校をつくる.彼は彼の夢を追いながら,それを共有してくれるパートナーを探すが,やはり上手くいかない.彼が素敵だと思った女性は常に同じ答えを彼に返す「あなたは素敵で,私はあなたを好きだけれども,それは友達としであって,人生を共有するのは何となく正しいことではないと思うの.」 
ある日彼は Berlin の白熊の話を目にする.Knut という熊は母親から見捨てられる.また,複数の雌熊と暮らすが,つがいをつくることはなかった.その熊が溺れて死に,彼は脳の病気であったらしいということがわかる.ある動物学者は私見としてではあるが,これが原因で母熊から見捨てられ,雌熊もつがいをつくらなかったのではという仮説を述べていた. 
彼はそれを見てあることを思う.彼も脳の病気を持っている.女性達はそれを感じるのだ.彼は自分の子供を持ち,その子供に世界を教えることを夢見ていたが,それがかなわないと考える.そして,ある日,部屋を黒いテープで密封して死んでしまった.

この話における選択とは natural selection である.natural selection で選択されない男の話である.概要では上手く伝えられないが,主人公の苦しみは,誰にも受け入れられないまま生きることの苦しみであった.主人公の脳の問題は特殊で,女性達はそれを直感的に感じてしまうのだ.彼の魅力は認めているが,ただただ「何か正しいことではない」と感じるのだ.彼は人類のために生きるが,自然選択からは外されている.これは思考実験としては面白いかもしれないが,私は話としては面白くないと思った.

そこで私は Billy (この話の著者)に問うた.「生きているのはいいことではないのか.」彼は答えた:「苦しんで生きることには価値があるのかわからなかった.ある主の depression の患者が感じるように,彼は悲しいというわけではない.ただ,喜びや興味を感じないことが苦しみとなっていたのだ.その人に私はそれでも生きろとは言えなかった.」私は驚いた.Billy がある種の心理療法を受けていることを一度聞いていたからだ.しかし,命はそういうものではないのかもと思うと言うと,彼は続けた.「この結末は確かにあまり良くないと思っている.出版されているわけではないし,その見込みもないんだが,できれば変えられないかと思う.でも,今はこの結末しか見えないんだ.」

Billy は言う「誰にも受けいれられないまま生きるほど強い人間はいない.生きていた方がいいとは簡単に言える.私にはどんな結末がいいのかわからない.」

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 Unported License.

記憶漏れ


Kilgore Trout ほど有名ではないが,売れないことに関してはおそらく同等の友人が書いた SF 小説にこんなものがある.ここに書かなければおそらく誰も知らないままであろうから,本人の許可を得て概要をここに記す.本のタイトルは「記憶漏れ」である.

この小説の主人公は,生まれかわりを研究している.その世界では生まれかわりと呼ばれているが,実際には記憶の共有であることがわかってきた.主人公は二人の過去の記憶を持つ人もいることを発見する.
ある日,主人公自身が,自分の娘と一部の記憶を共有していることに気がつく.つまり記憶の共有は過去の人間である必要はない.ある日,彼の妻と娘が宇宙飛行中に事故にあう.娘との最後の記憶の共有は彼に一つの仮説を与える.それは世界が現実の世界ではなく,仮想世界のシミュレーションであるというものである.悲しみの中,他人からは狂ってしまったと思われながら,彼は,この世界のシミュレーションに何らかのバグがあり,それが人の記憶のリークとして観測されるというものをつきとめ,それを利用して娘と妻をとり戻そうとする.
仮想世界についてはいろいろな SF がある(魔法が使えるシミュレーション世界や,タイムマシンが使えるシミュレーション世界など)が,生まれかわりはシミュレータのバグであるというのは面白いと思った.

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 Unported License.

Thursday, April 25, 2013

Math objects on programming (2)


単純な組合せを生成することは前回で述べた.しかし,私の仕事では,GPU という高速ではあるが,メモリサイズが小さい計算機を使う必要がある.ここでの data size は GB の単位であり,64 GB とか 512 GB というのは現在のところ,一台の GPU には収まらない.512 GBは我々の使っている一台の計算機の実メモリにも収まらない.そこで,何十台かの計算機に複数の GPU を搭載して,それを協調して使うわけである.ほとんど全ての我々のクライアントは計算機の台数と性能の関係についての情報を要求する.それは我々のクライアントは特定の問題を解く必要があり,そのためには何台の計算機と何台の GPU を購入する必要があるかを知りたいためである.したがって,計算機を何台使ったかについてプログラムのデータ処理のスループット性能がどうかを見たい.そこで,計算機の台数を新たなパラメータとする.
data_size_list = [ 5, 64, 512, ]
screen_resolution_list = [ 
  '2560x1440', '3840x2160', ]
node_count_list = [ 
  1, 2, 4, 8, 16, 32, 64, ]
しかし,データがメモリに収まらなければ遅いことは確実にわかっているので,テストに際しては計算機の台数は data size によって変化させたい.ループの場合には,不要なものを filter out するということが簡単に思いつく.以下のようなプログラムになるだろう.

for d in data_size_list:
  for s in screen_resolution_list:
    for n in node_count_list:
      # FILTER: filter some cases.
      # assume one node can handle 
      # 64G, but not more
      if (n * 64 < d):
        continue
      item_list = [
        d, s, n,
      ]
      comb_list.append(item_list)
しかし,これを直積の考えに適用しようとするとどうなるだろうか.ループの考えから出発すると,データ毎にフィルタ関数を持たせるということを考える.しかし,これでは各リストがフィルタ関数を持つことになる.この考えではプログラムが複雑になる.実際に私はそういう実装をしようとしたが,あまりに複雑な感じがしてしまった.しかもほとんどの filter 関数は何もしないのである.プログラムを少し拡張しようとするともっと複雑になる.ここでの「感じ」というのは上手く説明できないのだが,「なぜこの問題がこんなに複雑な解答になってしまうのだろうか」という疑問である.私は問題を良く理解していない場合,このような疑問を持つことが多い.

そこで数学に戻って考えてみた.生成される組合せは,data size の関数である.だが,これをフィルタ関数とするというのはどういうことだろうか.これはgenerate and test 方式に似ている.しかし,どの組合せが生成されるのかは,data size だけの関数である.ここでようやくわかった.これは data size から node 数への単なる map 関数だったのに,それを数学的には意味のない方法で実装してしまったのだ.結局次のようなコードを実装した.

data_size_list = [ 5, 64, 512, ]
screen_resolution_list = [ 
   '2560x1440', '3840x2160', ]
data_size_node_count_map = {
  5: [1, 2, 4, 8, 16, 32, 64]
  64: [8, 16, 32, 64]
  512: [32, 64]
}
all_list = [
  data_size_list,
  screen_resolution_list,
]
comb_list = []
c_tuple = [''] * len(all_list) 

def make_tuple(idx):
  if(idx >= len(all_list)):
    comb_list.append(
        copy.deepcopy(c_tuple))
  else:
    for i in range(len(all_list[idx])):
      c_tuple[idx] = all_list[idx][i]
      make_tuple(idx + 1)

def gen_combination_list():
    make_tuple(0)
    for i in comb_list:
        gen_with_node(i)
gen_with_node() 関数が data_size_node_count_map()を使って node 数に関する組合せを生成する.このようにすることで,効率的で簡単な実装を作ることができた.私は時々他の人のコードを見て,数学的に変なコードだというふうに思うことがある.これは特に実装する能力は高いが,数学的な思考をコーディングではあまり利用しない人に見られる.

以前私はこういう実装能力の高い人達を尊敬しており,そういうプログラムを書こうとする傾向があった.しかし,数学的 object を導入するとコードが簡単になることがしばしばである.驚いたことには,実装能力の高い人達と遜色のない,時には高速なプログラムが書けることがわかって,その能力をあまり必要とみなくなってしまった.もちろん同じアルゴリズムを実装するのであれば,私のコードの方が遅い.しかし,今回のように間違ったアルゴリズムを採用してしまえば,実装能力の高さは比較的問題にならないことが多い.コードがシンプルな分,バグも少ないことが多い.

今回は自分が数学的 object を正しく使えないという間違いをおかしてしまった.自分をもっと見直すべきだと反省する.

ところで,数学的 object が上手くいくのはなぜだろうか.私は2つの理由を思いつく.一つは数学では何世紀にもわたって問題がどういう部分問題に分解され,よくでてくるパターンが何かが研究されてきている.私がその場で考えた解答よりも多数の天才が何百年にもわたって考えてきた方法が上手くいくことが多いことに不思議はない.実は,私には天才達の考えよりも上手くいったことがある覚えはない.二つ目の理由としては,数学的 object はプログラミング言語でも既にサポートされていることが多いということである.言語のデザイナの多くも数学的 object の問題解決に対する有用性を見い出したのだろうと思う.数学的object が言語によってサポートされている場合,その object はシンプル,かつ効率的に書けることが多い.ここでは 直積と map の考えを使った.map の考えはpython では dictというデータ構造として既にサポートされている.lisp ではmapcar, Java には util に Map, C++ の STL にはそのもの map というtemplate class がある.

簡単な問題ではあるが,興味深い経験でもあった.

References

[1] Hisao Tamaki, ``Introduction to probability theory for the information scientist (in Japanese)'', Saiensu, ISBN4-7819-1012-2, 2002

Implementation example

http://sundayresearch.de/hitoshi/sundayresearch/programming/Python/20130323_math_object/enum_code_20130323.zip

Wednesday, April 24, 2013

Python PIL experiment (a image comparison tool) continued


numpy and PIL

実際に画像に適用してみた所,1024x1024 の大きさの画像では処理に 6 秒程度,消費するメモリサイズは230MBなのだが,3840x2160の画像を利用すると,2.3GBのメモリと263秒の時間がかかることがわかった.この2つの解像度はpixel の数で言えば 8 倍程度で,メモリの処理が比例しているのは良いとしても,処理の時間がかかりすぎる.また,メモリの消費量自体も多すぎる.私はプログラム中で3つのバッファを使っているだけであり,1024x1024の場合には 10 MB程度,3840x2160 の場合には,72MB程度と思っていた.しかし,30倍ものメモリが消費されている.

プロファイルの結果,最内ループの tuple の生成と abs 関数にほとんどの時間がかかっていることがわかった.そこで,この部分を numpy で書くことにした.結果を以下に示す.Intel Core i7-2720 2.20GHz Linux(Kubuntu 12.10, kernel 3.5.0-27), Python 2.7 における結果である.

  • native  230MB, 6.0 seconds for 1024x1024 image
  • numpy 110 MB, 0.21 second for 1024x1024 image
  • native  2300MB, 263 seconds for 3840x2160 image
  • numpy 320 MB, 1.18 second for 3840x2160 image

計算速度は 30 倍から200倍に, メモリサイズも 50% から 15% の消費量と激減している.実は最初の実装では倍程度にしか高速化できなかったので,私は多少失望したのであるが,profile した結果,非0の要素をカウントするための sum関数がほとんどの時間を占めていることに気がついた.この sum 関数は pythonのbuildin のもので,おそらく numpy の data 構造から毎回値を取り出しては計算しているのであろう.これを numpy.sum に変更した所,ほどんどの時間を占めていた sum 関数の消費時間が profile ではほぼ 0 になり,200倍の高速化が達成された.これは matlabに似ている.(実際,numpy は matlab の Python portであるが,いかに性能を出すかでも似ているという意味である.)

ImgCompNumpy.py code

Tuesday, April 23, 2013

Python PIL experiment (a image comparison tool)


概要:
Python の画像 module PIL を使ってみた.

Python PIL module

Python には画像ファイルを処理するのに便利な Python Imaging Library (PIL)という module がある.今回はファイルフォーマットは異なるが,内容が同一かどうかをテストしたいという状況にあった.たとえば,テストの参照となるファイルは圧縮されているが,それと比較するファイルはそうではないというようなものである.convert などのツールを使うということも考えたが,時には使ったことのないツールを使ってみるのもよいだろうと PIL で画像を比較するツールを書いた.

Monday, April 22, 2013

Math objects on programming (1)

概要

プログラミングにおいて数学的な object を使うとプログラムが簡単になることがある.今回この考えが上手くいった例に会ったのでそれを示す.

数学的 object とプログラミング


プログラムのテストにおいて,異るパラメータの組合せを考えるということはよくあることである.組合せを生成する簡単な方法は,多重ループを使うことである.

ここではpython 風の pseudo code を使う.また,実際に動く python のプログラムも公開する.

たとえば,2つのパラメータのリストがあった場合,

 data_size_list = [ 5, 64, 512, ]
 screen_resolution_list = [ 
   '2560x1440', '3840x2160', ]

この組合せは,

  for d in data_size_list:
    for s in screen_resolution_list:
      print_comb(d, s) # output

のように書いて出力することができる.この方法は簡単であるが,ある特定のリストが不要な場合,プログラムコードを変更する必要がある.それで直積の考えを使って組み合わせを生成することにする [1].何の積かというと,集合の積である.ここに k 個の集合があり,その要素の全ての組合せを考える時,k 個の集合の直積を考えている.これは再帰的に定義することができる.

  1. \(k = 0\), つまり 0 個の集合の直積は一つの空リスト([])である.
  2. \(k \geq 0\) の時,       \begin{eqnarray*}       A_1 \times \cdots \times A_k   &=&\left\{(a,t)| a \in A_1, t \in A_2 \times \cdots \times A_k        \right\} \end{eqnarray*}
である.二番目の条件の意味は,既に \(k-1\)の集合から1つづつ要素をとった組合せのリストが生成されているのであれば,\(k\)個の集合のリストを生成するには,\(k\)番目の集合から \(a\) を一つとってリストを生成すれば良いという意味である.この実装例は以下のようになる.

data_size_list = [ 5, 64, 512, ]
screen_resolution_list = [ 
   '2560x1440', '3840x2160', ]
all_list = [
  data_size_list,
  screen_resolution_list,
]
comb_list = []
c_tuple = [''] * len(all_list) 

def make_tuple(idx):
  if(idx >= len(all_list)):
    comb_list.append(
        copy.deepcopy(c_tuple))
  else:
    for i in range(len(all_list[idx])):
      c_tuple[idx] = all_list[idx][i]
      make_tuple(idx + 1)

def gen_combination_list():
    make_tuple(0)
    for i in comb_list:
        print i

make_tuple() 関数が直積の実装になっている.

これは直積という数学的 Object を使って組み合わせのプログラムを一般化した例である.こうすることによって,プログラムのコードがデータの方に移った.つまり,データによって何重ループになるかが決まるのであり,どんな組合せのテストをするかが変化するような場合に,プログラムを変更する必要がない.このプログラムの例は単純でループで実装しても良いように思えるがもしれない.確かにこの場合には不要であろうが,今回,私は組合せが多く,様々な条件がテスト毎に変化する状況であったので,このように実装するのは有益であった.

次回は私がこの問題で数学的 object でどんな間違いをしたのか説明しよう.

Thursday, March 28, 2013

Hasenschule: A girl who invented a matrix.


行列を発明してしまった子

C は教えていてとても面白い子である.6ヶ月前にはいつも泣いていた一桁の足し算に苦労していた子である.しかし今は3桁の引き算もこなす.

今回,彼女が解いていた問題を図 1 に示す.

Figure 1. The question.
私はこの答えが次の図 2のようなものだったらとてもうれしいと考えた.

Figure 2. Expected answer

私が他の子を見ている間,彼女はどうやら集中して計算しているようだ.私はどうやっているのかと彼女の机に近付いて見たものは,なんということだ,行列だ!(図3).
Figure 3. A matrix is invented.
私は彼女に,「ちょっと待った.これは自分で考えたの?」と聞いたら.「もちろん,どこか計算を間違ってる?」という答えであった.

私には計算はどうでもよかった.彼女が自分でこのように答えを並べたことに驚いたのである.問題の2つの数字の組はどちらも横に並べてあったものである.片方を縦にしてそして,全てに適用する演算子を一つだけ左上に書き,答えを表にして並べたのである.

こう書くのはとても合理的である.図4にどれだけ無駄な繰り返しが図 2にあるのかを示した.まず,各数字は3回コピーされている.'+'と '=' の記号はそれぞれ9回コピーされている.
Figure 4. Unnecessary duplications
彼女の書いた図3の上図を見ると,全ては '+' なのであるから'+'は一回だけ書かれている.これもすばらしい,下図には '-' が書かれている.

この図3にはコピーされている数字は一つもない.必要最小限でかつ十分な情報が書かれている.人はコピーすると間違えるものであるから,このように書く方式が長い年月を経て洗練されてきた.Excel などのスプレットシートを使う人ならば,どうしてこのように書くのかご存知であろう.そしてそれが図 2よりもずっと便利であることもご存知であろう.

彼女はどこかでこれを見たのかもしれない.たとえそうでも私は彼女がこのように書く方法を自然に思って疑問なく書いたことにとても感激した.それで私は金のシールを貼ってこれはとてもすごいことだと言った.彼女にはこれが自然すぎて,何か良いことなのかわからないかもしれない.でもいつかわかる日が来るんだろう.私が一つ心配なのは,誰かがこれを難しいものと考えて,図 2のように訂正しようとすることである.

この日,私はいかに子供が自由に数学をするのかを見て,本当に驚き,嬉しかった.

Friday, March 8, 2013

Hasenschule: Was bedeutet das? Bitte erklären das mir. What does it mean? Please explain me that. (3)


Case A.

もう一つのケースは A 孃である.彼女は幾何を勉強していたが,たまたまそれをRechtschreibung の M 先生が教えていた.直線(Gerade)が交わる点(Schnittpunkt)はいくつあるかという問題である.図には交差点が強調されているのだが,A 孃はどうしてもわからないらしい.M 先生は私に A 孃を助けるように頼んだ.

私は毎回同様,「直線って何か説明して?(Bitte erklären mir was ist Gerade.)」と頼んだ.A 孃の答は,「直線は直線です.(Gerade ist Gerade.)」である.まあ,予想した通りではある.そこで私は尋ねた.

「学校で習った直線は終わりがありましたか?ずっと続いているとかいう話はありましたか?」「直線はずっと続いています.」なるほど.では彼女は直線と半直線と線分を習っているわけだ.次に,交差点(Schnittpunkt)というのは何かな? と尋ねると,しばらく考えた後に,知らないという答えであった.交差点というのはどういう意味か知らなければ,それに答えられるわけがない.実は私もSchnittpunkt というのが交差点という意味だとは知らなかったので,他の先生に尋ねた.さて,これで問題がわかった.そこで質問に戻ったら,何の問題もなかった.問題の図では線が途中で止まっているにもかかわらず,彼女は三本の直線の交差点が 0, 1, 2, 3 の場合を全て正しく分類した.

問題が何かわからないことは結構多い.彼女は家では英語とスペイン語を使っているらしい.問題の意味がわからないということを,自分でみつけられるようになって欲しい.と私は願っている.私はまた授業で,「この問題がどういう意味か説明してよ」と生徒さんに尋ねてまわるのである.私が問題の意味もわからないかわった数学の先生と思っている生徒さんもいるようだが,実はまったくその通りなのである.

何日か前,たまたま私の算数の授業に来たのが A 孃だけであった.彼女は他の先生に習っていたので,私は彼女の暦の計算をずっと横で見ていた.そこには,Schaltjahrという言葉があった.私は彼女に,Schaltjahr とは何かと尋ねた.それは上手く説明してもらえた.そこで次になぜ,Schaltjahr と言うのか,いったい Schaltってなんなのか,どうしてそんなものが存在するのかを尋ねた.知らないということであった.私はそれを説明したくてたまらなかったのだが,彼女の先生はそれよりも暦の計算が重要であると考えたようで,説明する機会がなかった.私は次の授業で,もし彼女を担当したら話をしようと思った.

Hasenschule: Was bedeutet das? Bitte erklären das mir. What does it mean? Please explain me that. (2)


Case S

S 嬢はかけ算の問題を解いていた.黒パン一つが 2.9 ユーロなら,次の数量2,4, 6, 8 ではいくらでしょうか? という問題である.図 1 がその問題である.
Figure 1. Case S. question.
彼女は最初のAnzahl (数量) 2 に正しく 5.8 ユーロと答えた.(ドイツあるいはヨーロッパのいくつかの国では小数点にカンマを使うが,本文ではピリオドを使う.) 私は,なるほどと思ったが,次の数 4 を計算するのに,彼女は 2.9 x 5.8を計算している.そこで私はなぜそうするのか尋ねた.(図2にその跡がある.)

彼女はそうするべきだと思っているらしいが,理由は彼女にもわからない.そこで私は,図 2 を書き,4つのパンを買う時には,4 x 2.9 を計算するように説明した.
Figure 2. How to calculate the price?
彼女が最初にやったのは,私の図を修正することである.彼女はパンに影をつけ,よりリアルなパンを描いた.

しかし次の問題,数量 6 でまたわからないという.私は不思議に思った.彼女はかけ算の概念をわかっていないのだろうか? 私は質問を普通の文で書くようにとお願いした.問題を正しく表現できるかをみるためである.しかし,それもどうもわからないらしい.私は例として,図2 にあるのだが,問題の意味は,「2.9 ユーロのパンを4つ買いたい,いくら支払うのか」と意味であるとした.彼女はそれはわかるのだが,しかしそれがなぜ今の問題と結びついているのかがわからないらしい.

問題にある言葉を一つづつ尋ねていった.「黒パン」は何か知っている.2.9 ユーロも問題ない.次に私は,「数量って何? (Was ist die Anzahl?)」と尋ねた.「知らない.(Ich weiss nicht.)」という答えである.なるほど,考えてみると私も良く知らない.そこで,「多分,いくつという意味だけれども,他の先生に尋ねてみよう」と他の先生に尋ねると,私の想像は正しかった.彼女は「ああ,いくつあるかという意味なの.(Wie viel Stück)」

その後,6個,8個の問題は彼女には簡単だった.何がわからないかをみつけるのはなかなか難しい.しかし,問題はこんなところにあることもある.私は彼女に家で何語を使っているのかを尋ねた.父親とはドイツ語で,母親とはトルコ語で話をするようである.

日本では文系,理系という考えがあったが,私は当時から疑問に思っていた.日本語がわからないのに数学がわかるというようなことはないからである.数学を習う前に言葉がわかる必要がある.私は Hasenschule で教えているが,いつも最初に言葉を習うことになる.今回私は S孃 と一緒に Anzahl という言葉を習った.

ところで日本では4つのパンの場合,2.9 x 4を計算するように説明し,この順番ではないと間違いとする場合があると朝日新聞の記事にあった.日本語では,「パンを4つ買いました」.というのが自然なので,その順番にするのだろうが,英語やドイツ語では「4つのパンを買いました.」の言い方も自然でありどちらが特に自然というわけでもないように思う.後に代数を習うと x の定数倍は ax と書き,xa ではない.私見だが,これは2つの意味で害になると思う.1. 数年後に代数を習うと以前正しいとされていたことが得に有益だという理由なしに間違いとなる.2. 国際化の時代,国際標準を間違いとする.以上の2つの理由で,どちらの順番で計算しても正解にするべきであると思う.

Hasenschule: Was bedeutet das? Bitte erklären das mir. What does it mean? Please explain me that. (1)


生徒さんが私に問題について尋ねると,私の答えはたいていこうである.

``Was bedeutet das? Bitte erklären das mir.''

「それはどういう意味なのかな.説明してくれる?」

私は続ける.

``Mathe ist eine Sprache. Es gibt eine Bedeutung.''

「数学は言葉の一つです.何か意味があります」

生徒さんに説明してとお願いすると,時には「生徒が教えるんじゃなくて,先生が教えるものだ」と答えることがある.なるほど.しかし私は実は説明することも学んで欲しいのである.それで,「それはどういう意味?」「それは本当なの?」「説明してよ」と尋ねるのである.


時には,「私が答えを教えてくれない」,「助けてくれない」と泣き出す生徒さんもいる.私は,「答えはそんなに重要ではないんだよ,この問題を解いてもらうのは,どうやったら学べるかを学んでもらう練習なんだ.君らにはいつか人類がこれまで直面してこなかった問題を解かねばならない時が来る.私はその時にどう考えるかを教えたい.私の助けがいらなくなるように勉強して欲しい.だから考えてみて」と思いつつ,私自身も新しい問題をどう解くのかを勉強している身なので,こう断言できるのか不安がある.そこで,「泣かなくても大丈夫,ゆっくり考えればきっとわかるよ.今日できなくても明日がある.答えが正しいかそんなに重要ではない.重要なのは理解したかどうかなんだ.」となだめている.ところでドイツ語では正しいがrichtig で重要が wichtig であり,私がこれを上手く言えないとおかしいらしい.(Richtig ist nicht so wichtig.)


5ヶ月前にはいつも泣いていた常に 5 の成績だった子が,今は成績 2 になったのがとても嬉しい.(ドイツでは日本とは逆で 1 が最高の成績で,5 が落第である.)

今回は,2つのお話を紹介する.

Sunday, February 24, 2013

Web hosting story: Could you google your company's advertisement?


今回,Web hosting の必要が生じたので,現在のプロバイダの契約にこれが含まれていたので,これはいいと試してみたが上手くいかなかったという話である.

私は契約の解除期間が短いために 2009年から Alice をプロバイダとして選択して利用している.Alice には comfort という契約があって,当時,毎月15ユーロほど余計に支払うと,30秒以内にサポートにつながるというサービスがある.私はこの契約を結んでいる.当時トラブル時にこのサービスを使って,サポートの良さに満足していた.

それは 2009 年頃の話である.その後 Alice は O2 の傘下に入ったが私はトラブルもなかったので,同じ契約を続けていた.

今回は O2 の ftp サービスを使いたいと思ったがどうも上手くいかないので,いろいろと試すこと数日,クライアントを変更する,クライアンド側のOS を変更する,アクセスポイントを変更するなど,Forum を探す,などかなりの時間を費してしまった.まったく動かないのではなく,接続自体は成功するのだが,数秒で切れてしまうのである.

この時点で O2 に電話をしたが,なんと担当の人は ftp を知らないようだ.他の担当は夜間は対処できないので,朝にしてくれという.私は朝にまた電話をかけたが,その担当も ftp が何かを知らない.私は,``Koennen Sie googlen ``O2ftp homepage domain''? Dann Sie sehen Ihre Werbung. Das funktioniertnicht.'' 「O2 ftp homepage domain でグーゴル検索すると,あなたの会社のFTP サービスの広告がでてきますので,ご覧になって頂けますか?それが上手く動かないのです」と尋ねた.

ところで,これがその Page である.
http://hilfe.o2online.de/t5/o2online-Login/o2-Mail-DSL-Festnetz-Homepage-und-Domain/ta-p/273952

その結果,今サービスのマシンの不調があるので,後ほど試して欲しいということになった.しかし,その後二日間は結局使える状態にはならなかった.

ふと気がつくと,3日間で 8 時間は使っている.こういうことを避けるために余計にサービスに支払っているのに,無駄なことをしていると気がついた.

そこで,同僚が使っているという Strato の Web Hosting を年間 50 ユーロで買った.日曜というのに,契約が終了しましたというメイルが届き,試してみると,何の問題もなく使える.もっと早く契約すべきであった.時間を金に換算すると,これは安い.無駄にした時間はなかり高価である.

学生の頃は節約しようとして無駄をすることも多かった.年をとったせいだろう,私は Quality と時間にお金を払うようになったのに,やはり同じ失敗をしてしまった.

「ただより高いものはない.」「安物買いの銭失い.」数百年の日本の昔の人の知恵は今も有効である.

ところであなたの会社は outsourcing で同じ間違いをしていないだろうか.質の低い仕事は時間がかかる.時間は人件費にふりかかるのに,それを計算に入れていない会社もあるという.たとえば,以前は on site の IT があり,問題は一日で直っていたのに,今はそれが outsource され,どこか他の国にある.すると問題が解決するまで一週間かかったりする.それでも on site の人を雇うより安いという意見がある.この意見は隠れたコストを見ていない.問題が解決されない人が一週間働けない場合があったりする.一週間の人件費がコストに入っていないので安くみえるというだけである.


http://3d.xkcd.com/806/

Wednesday, January 2, 2013

マルコフ行列の中の著者達 Part 2 (11): 付録


付録 A: Unicode and Python 2.7.x


今回 Python 2 にて Unicode の処理をする必要が生じた.これは日本語の Web page やドイツ語の Web page の処理のためである.実際には英語の Web pageにも accent のある文字が出現することがあるので,Unicode は避けて通れなかった.プログラムの開発中に,UnicodeDecodeError と UnicodeEncodeError というexception に悩まされたので,これを解説しておく.

How the Unicode encodes characters?


Unicode は私の理解するところ,2つの map を使う coding system である.これはどのようにこの体系を理解するかにもよる.私はこの調査をするまではこのことを知らなかったので UTF-8 などという coding system があると誤解していた.UTF-8 というのは Unicode をどのように codeするのかという mapping の手法の一つであって,Unicode そのものではない.

  • Unicode: a map from characters to code (numbers)
  • UTF-X:   a map from Unicode encoded data to a specific data

Unicode そのものは code point と呼ばれる番号と文字の Description の単一のmapである.たとえば. 0x0061 'a'; LATIN SMALL LETTER A である.ここで0x0061 という数字が code point である.これが font に map されると,図形としての文字が表示される.図形としての文字は glyph と呼ばれる.Unicodeのmap は bijection であるので,文字 a は code point 0x0061 へmap されるとも言える.

この code point が Unicode,つまりある数を特定の文字への code している.しかし通常この Unicode の code point は使われない.通常使われないという意味は,テキストファイルにこの番号が save されることはまずないということである.通常もう一つの map,Unicode Transformation Format (UTF)が使われる.UTF-8, UTF-16 と endian information などが存在する.実際にはこのtransformation format に encode されたバイト列がファイルに save される.私はこのような用法が一般なので Unicode は Uni の code ではないと考えていた.Unicode の coding そのものは唯一であるが,それを実際に使う時のmapping が複数あるという意味では Uni ではない.したがって,Unicode はUni な code であるが,UTF-8, UTF-16 などは複数ある mapping の一つである.これは Unicode をそのまま使った場合に英語の Text などのサイズが増大する問題を避けるために生じた問題である.

これらの知識は [2] によった.

Python 2.7.x's Unicode representation


Python 2.x において文字列を表現するデータ型としては str 型と unicode 型がある.str 型は 8-bit の任意のデータ保持できるが,より ASCII の処理に適している.それぞれのデータ型は異なる encode への変換が可能である [2].

では,結局ほとんど同じであるのならば,文字列という一つのコンセプトを表現するために,なぜ違うデータ型が存在するのであろうか.これはおそらく歴史的な理由で,初期の python は Unicode のサポートをしていなかったため,2つのデータ型ができてしまったようである.実際,Python 3 では str 型が Unicodeを直接内部で利用可能なために,この違いはなくなっているようである.

Python 2.7 ではしかし,これが print (stream) に渡る時に問題を引き起こすことがある.Python 2.7.xにおける encode とdecode, そして文字型間の関係を図 8に示す.

Figure 8: Relationship between Unicode type and 8-bit str type in Python 2.7.x.
Python 2.7.x の unicode 型には encode method があり,str 型には decodemethod がある.これによって相互の変換が可能であるが,encode 手法によっては exception が発生する.encode 時に起きる exception がUnicodeEncodeError であり,decode 時に起きる exception がUnicodeDecodeError である.なかなかややこしい.例によって説明しよう.

まずは unicode 型の文字列を定義する.

uc = u'Wächter'
print type(uc)
-> <type 'unicode'>

これを utf-8 で str 型に encode する.

s = uc.encode('utf-8', 'ignore')
print type(s)
-> <type 'str'>

print statement は str をとるので,unicode 型が与えられると encode が呼ばれる.

print uc
-> UnicodeEncodeError: 'ascii'
codec can't encode character
u'\xe4' in position 1: ordinal
not in range(128)
uc には ascii に encode できない文字が含まれているので,error が発生した.ここで発生した error は encode の error であることに注意すること.

しかし,error を無視するように指定して encode を行えばこれは機能する.

print uc.encode('utf-8', 'ignore')
-> 'Wächter'

複雑な case としては,encode された str 型がまた decode される場合がある.

print u'{0}'.format(uc.encode('utf-8', 'ignore'))
-> UnicodeDecodeError: 'ascii'
codec can't decode byte 0xc3 in
position 1: ordinal not in
range(128)

ここでは format が str 型をとったが,それが unicode 型に対するものであったので,decode が呼ばれた.しかし,そこには decode の 'ascii' が扱えない文字が入っていたため exception が発生した.ここでは encode exceptionではないことに注意されたい.したがって,次のように最後に encode する場合にはこれは機能する.

print u'\{0\}'.format(uc).
encode('utf-8', 'ignore')
-> Wächter

付録 B: Contribution to Wikipedia


今回の実験の副作用として Wikipedia にある List の間違いが判明したので,これを修正し,Wikipedia への貢献を行なった.

今回の実験では隣接行列を生成し,eigenanalysis を用いてその行列を解析した.eigenanalysis では matrix の basis が独立していることが望ましい.しかし,今回のような matrix では一般には full rank のmatrix は望めない.たとえば,著者へのリンクのない著者の Page やリンクが張られていない page, root nodeからの同じpage への linkなどの間違いが避けられないからである.PageRank アルゴリズムはこれに対処する方法が組込まれているが,root node のリンクの間違いは簡単に修正できるので,ここではduplicated link の check を行い,それを除いた.

Duplicated link は間違いもあるが,Pseudonym が link されている場合もあるので目視でそのチェックを行なった.

Wikipedia への貢献が行えたことは個人的に嬉しい.


参考文献

[2] Python documentation 2.7.3, Unicode HOWTO http://docs.python.org/2/howto/unicode.html

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


結論

どの著者が Literature に影響を及ぼしているかを調べるため,Wikipedia のlink 構造を抽出し,それに PageRank アルゴリズムを適用した.その結果は表に示した通りである.また異なる言語の Wikipedia のデータを同じカテゴリ(今回の例では著者)に関して適用することで,各言語の Wikipedia 間の違いを見ることができた.

個人的に面白いなと思ったのは,たとえばイギリスの著作家に Winston Churchil や Issac Newton が入っていることである.今回始めて Winston Churchil はノーベル文学賞受賞者であることを知った.

Computational Literature


私は最近,言語や文学を理解するために,情報科学あるいは数学的なアプローチを用いている.Bren'e Brown は彼女の TED talk で ``Maybe stories arejust data with a soul.'' と述べた.もしかしたらそうかもしれないと思う.ただし,私は soul が data にかすかな影を落としているように思えてならない.もちろん,現状ではこの影から soul を再構成することなど到底できそうにない.それでも,すばらしい作品は私の心を動かす.本を読むというのは,ある意味,ただ単なるデータ,シンボルの列,を読んでいるだけなのに,感動が起こることは確かにある.私はこの魂の影がデータの中にあるのではないかと思って,このようなアプローチを試してみることがある.今回の著者の文学界への影響というものも,その一種の試みである.私はこのアプローチを何と呼んで良いのかわからないのだが,他に良い名前を思いつくまで仮に,これを計算機を用いた文学へのアプローチという意味で, Computational literature と呼んでいる.

Future work


議論で述べたこと含めてまとめておく.


  • Wikipedia の著者による bias はあるのか
  • どのように自動でデータを取得するか.カテゴリの問題を避ける方法はあるか.
  • PageRank 以外のグラフ構造解析アルゴリズムを用いてはどうか.
  • Marix が full rank でないことなど,ネットワーク構造をさらに数学的に調べたら面白いかもしれない.
  • 他の言語の Wikipedia で他の言語の著者に関しても興味がある.
  • この手法は著者に限ったことではないので,音楽家や政治家など興味ある対象があれば調べてみたい.


二部に渡る長い話におつきあい下さった方,どうもありがとうございます.この話はあと一回,Python の Unicode 処理についての付録で終わりたいと思います.

謝辞

英語と内容の両者に関してアドバイスを下さった Andy K., 昼食時にこの趣味のProject に様々なヒントを与えてくれた友人達,そしてこの Project のきっかけとなった質問をしてくれた Rebecca M. に感謝する.

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


今回も結果に関する議論の続きである.

No link found problem

ドイツ語の Wikipedia での日本の作家には人物の Link 切れの問題が印象として残った.これは数を調べたわけではなく,調査中に見うけた問題である.伸ばす音の人物のリンクが切れていることが多いという印象を持った.たとえば,良寛(Ryōkan)に言及している page がリンクのキーを Ryokan にしたり,漱石(Sōseki)に言及している page が Soseki にリンクを張ったりしているため,リンク先の page が見つからない.このような伸ばす音のある作家へのリンク切れが目についた.

Cross reference between Wikipedia


ドイツ語と英語の Wikipedia では,同じ Latin 文字の表示を用いているため,cross reference を作成することが容易であった.しかし,日本語はイギリスの著作家であってもキーとして日本語の文字を利用しているため,Crossreference をプログラムで作成するには,日本語から英語への変換の map が必要である.これを正しく作成することは手間がかかるので,今回は見送った.

Correlating with other data


友人と議論しているうちに,今回の結果と他のデータとの組合せをみたい項目がいくつかでてきた.


  • Nobel prize winner と Pagerank の結果の関係
  • Wikipedia の著者と Pagerank の結果の関係.特に Wikipedia の著者による bias というものがあるのかどうかに興味がある.


Johann Wolfgang von Goethe is 10th in Japanese Wiki


Johann Wolfgang von Goethe が日本語の Wiki では10 位と意外な低さだったことである.しかし,日本語の ドイツ文学に関するPage でネットワークを構成するページはわずか 31 ページしかないので,わずかなページが強い影響を示す可能性がある.ちなみに日本語の Wiki でのドイツ文学者の一位は Gerhart Hauptmannである.

長かったこのテーマも終わりに近付いてきたようだ.次回は結論を述べよう.

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


Wikipedia's Category problem

ここで言うカテゴリ問題とは,期待した人物が Wikipedia によっては異なるカテゴリに属しており,データの取得に失敗している問題である.以下のsubsection で示すような問題が判明した.これらに関しては何の処理もしていないので,たとえば,「Shakespeare が日本の Wikipedia 解析の結果では英国の文学者としては存在しない」というような問題でもそのまま結果に示した.

私は趣味でこのような調査をしているため,データの取得はできる限り自動で行いたい.そのため,今後どうやって自動でデータを取得するかは課題として残った.

No Shakespeare in Japanese Wikipedia result


Shakespeare はドイツ語,英語共に英国の著者としては一位であったが,日本語の Wikipedia の結果には Shakespeare が存在しない.調べた所,日本語のWikipedia では Shakespeare というカテゴリが存在し,イギリスの著作者に分類されていない.そのため,今回のようにroot page を指定した方法ではこれらの作家は存在しないことになってしまった.

図 7 にこの Page を示す.

Figure 7: The category of English authors page in ja.wikipedia.org as of 2012-11-19.


  • イギリスの小説家のカテゴリ
  • ハーバート・ジョージ・ウェルズ
  • シェイクスピア
  • ジョージ・バーナード・ショウ
  • ジョージ・ゴードン・バイロン
  • ウィリアム・ブレイク
  • オスカー・ワイルド

これらが同列の階層に位置するため,ウェルズ,シェイクスピア,ショウ,バイロン,ブレイク,ワイルドはイギリスの小説家に分類されていない.これは日本語の Wikipedia 固有の問題であり,他の言語の Wikipedia にはない問題である.(ここで問題というのは,我々が「イギリスの小説家一覧」という一覧にこれらの人物も入っていると仮定したことから生じる.我々は実験を始める前にこの仮定は妥当だと考えた.)

No Shiki Masaoka in the Japanese Wikipedia result


日本語 Wikipedia では正岡子規が存在していない.調べたところ,正岡子規は日本の歌人俳人のカテゴリに属し,日本の著作家のカテゴリには属していなかった.したがって,日本の歌人俳人は今回の調査では漏れている.これは英語とドイツ語の Wikipedia の両者で正岡子規が top に rank されたにもかかわらず,日本語の Wikipedia の結果に現れなかったので気がついた.他の言語とのWikipedia の結果との比較が有効であった例の一つである.

Not available in other Wikipedia problem


Wikipedia によっては国による著者の分類をしていないものがある.ドイツ語のWikipediaには British の著作者があるが,英語の Wikipedia では英語の作家というカテゴリなので,アメリカやオーストラリアの作家も含まれてしまい,結果,ずいぶん異なるリストの比較になってしまう.比較を困難にするもう一つの要素は,言語による作家のリストの充実度の違いである.たとえば,ドイツ語の Wikipedia には 5975 人ものドイツ語の著作家がリストされているが,一方,日本語の Wikipedia にはドイツ語の著者としてリストされているのは 136 人である.

表 7, 8 には Wikipedia 間の結果の相互比較があるが,この表に n.a. として示されるものがこの問題の存在を示している.表 8 には 40 人中 16 人もの n.a. がある.つまり,これらはドイツ語の Wikipedia の英国の作家には分類されているが,英語の Wikipedia では存在しないか,英語の作家には分類されていない.

その他にも興味深いと思われる問題があったので次回ももう少し議論を続ける.