作者: 機械伯爵
日時: 2005/12/12(23:18)
DINGO:Oh, wicked, wicked Zoot.  Oh, she is a naughty
person and she must pay the penalty, and here in
Castle Anthrax, we have but one punishment for
setting alight the grail-shaped beacon: you must tie
her down on a bed and spank her.
GIRLS:  A spanking!  A spanking!

ディンゴ (卑怯者):おお、みだらな、みだらな、ズート
(気取り屋)。なんとふらちな。彼女は罰を受けなければ
なりません。このアンスラックス (炭疽菌) 城で、一人
を除く私たちは、聖杯型の灯台を光らせるという処罰を
うけています。あなたはベッドの上で彼女を縛りつけて、
彼女のお尻を叩くべきですわ
女の子:お尻叩きっ☆ お尻叩きっ☆

by "MONTY PYTHON AND THE HOLY GRAIL"



0000-1001.星空のメッセージ

 おおきなて
 おおきなて

 だきしめられて
 だきしめられて

 はしる
 はしる

 そしてひとり

 ぽつんと

 ひとり
 ぬくもりをおもいだして

 ひとり
 さむさ

 よびとめないと

 こえを、だして
 よびとめないと

 そして、こころを
 しっかりと、きめる

        ☆      ☆      ☆

「おいしーわね、ここのお汁粉」
 小豆の香ばしい匂いが湯気を立てる椀から、白玉をつ
まみあげて、口に運ぶ望美。
 そんな様子を見つつ、巽は大きくため息をついた。
「ねぇ、坂下。本題に入らないか」
 ここは、数日前に八重と入った甘味処『よもやまばな
し』である。
 今日は、望美に『話がある』といわれて、強引に連れ
てこられたのだった。
 湯気に曇っためがねを外して拭きながら、美央がにや
にやと笑う。
「ん? もう、いいじゃないあせらなくったって。せっ
かくこーして、巽と一緒にいる時間も含めて、ゆぅ〜っ
くり味わってるんだから」
「僕は塩か?」
「ん、そゆこと。お汁粉は、一つまみの塩が味を引き立
てるのよね」
 巽はあきらめて、自分の分の椀を持ち上げた。
「巽、自治会再編案の話、知ってる?」
 巽が箸を進めたタイミングを見計らって、望美が言う。
 巽は黙って(口の中にモノが入っていて喋れないので)
首を横に振る。
「簡単に言えば、今の執行部と報道局の二つに加えて、
情報部を新設して、生徒自治会関連のデータを一括管理
するって案よ」
「公文書管理部門?」
「それと会計監査ね。あらゆる文書やデータは、情報部
で管理されることになるわ。執行部は企画・行事執行に
専念できるってこと。合理的でしょ?」
 巽は少し考えた。
「そうだね。どうせなら情報部のメインデータベースは
完全にクローズドネットにして、閲覧しか出来ない端末
を各部署に配置、入力は専用端末で一括管理にすればい
い。そうすれば、今みたいに外のインターネットと乗り
入れになってる状態より、かなり安全になると思うよ…
……」
「あら、えらく乗り気ね」
 予想通り乗ってきた巽に、望美が言葉を合わせる。
 巽は、喋りすぎた、とばかりに、肩をすくめた。
「ヲタのたわごとだと思って聞き流して」
「ところが、そうもいかないのよね。巽にも関係あるこ
となんだから」
「なんで? あ、そうか」
 巽は急に立ち上がり、望美の両手を取った?
「え?」
 望美は、一瞬のことで、何が何だからわからなかった。
「ありがとう、坂下」
「え? え? ええっーっ? !」
 満面笑みをたたえる巽に、望美は完全に意表をつかれ
て軽いパニック状態に陥る。
「執行部に会計が無くなるってことは、僕は解放される
ってことだよね。ああよかった。そろそろこの仕事、飽
きてきたトコだったんだよ」
「あ………え、?」
 少しずつ、混乱が収まってくるにつれて、巽の言葉が
ようやく飲み込めてくる。
「あ、情報部の立ち上げくらいは手伝うよ。責任者は誰
がなるか知らないけど、そいつの注文どおりDBを組ん
であげるよ。あと………そうだなぁ、ひと月に一回くら
いはメンテに入ってもいいかな?」
「ちょ、ちょっと待ってよ!」
 望美は、思わず巽の手を振り払った。
「あ、ごめん」
「え? あ、ああ、手を握るのはいいんだけど………巽
の考え、根本的なとこ、違ってるよ」
「そう? だって、会計も書記も要らないなら、僕はお
払い箱だろ? 普通の執行委員の仕事には、僕は役立た
ずだし」
「だからっ! 聞きなさいってっ!」
「うん………?」
 きょとん、とする巽に、望美はため息をついた。

        ったく、なんでそういう話になるのよ

「誰も、執行部に残れ、なんて言ってないわよ。この話
からすれば、あんたがやるべきことは、明白だと思わな
い?」
「ん? だから、システム立ち上げの手伝いだろ? そ
れくらいやるってば」
「違うって」
「じゃ、僕に何しろっての?」
「決まってるじゃない。情報部の初代管理部長の依頼よ」
「……………」
 巽は、ぽりぽりと頭を掻いた。
「言ってることが、よくわかんないんだけど」
「だから、情報部は、あんたが仕切るの」
「……………」
 しばし、沈黙。
「なんで?」
「そりゃ、あんたしかその能力持った人間、いないから
でしょ?」
 ようやく事態を理解した巽は、猛然と反論を始めた。
「冗談だろ? 僕がなんでそんなこと、しなきゃならな
いのさ」
「大鳥先輩を見返すいい機会だと思わない?」
 望美は、にこにこと笑いながら言う。
 今度は巽が意表をつかれて、勢いを挫かれる。
「翔子を? なんでここで、翔子の話がでてくるんだ?」
「犬扱いされて、悔しく無いの?」
 巽は、露骨にイヤな顔をする。
「だから、翔子は関係ないって」
「大鳥先輩の言葉だから、執行部に居るんでしょ?」
 望美の言葉は、じわじわと巽を追い詰める。
「そ、それはそうだけど………」
「巽がやりたいって言えば、大鳥先輩は反対しないわ。
巽が普通のコトに関心向けることも、大鳥先輩が巽を執
行部にひっぱりこんだ目的だものね」
「………」
 望美は巽の様子を見ながら、言葉を続けた。
「情報部立ち上げの時は、あたし、報道局から情報部に
移るつもりなの」
「僕には関係無いよ」
「あるのよ。あたしは、巽がいるから、情報局に移るん
だから」
「………」
「あ、そうそう、もちろん美央も書記だから、基本的に
は情報局に移ってもらうわ」
「木崎も?」
 にたっっと笑う望美。
「あら、美央の話には反応するの? 妬けるわね」
「木崎は、執行部に残るんじゃないか?」
「そんなことないわ。巽が情報局にいるなら、美央は間
違いなくこっちにくるわよ」
 なんで、と聞きかけて、巽は言葉を止めた。
「うそ………だろ?」
 面白そうに笑う望美から視線を外すように、目を伏せ
る。
「こんな面倒なからかい方しないわよ。あたしも美央も
本気よ」
「……………」
「そうね、はっきり言っておかないと、なんだかんだっ
て後で解釈されちゃうのヤだから言っとくけど………」
 いきなり、ぐぐっっと顔を近づける望美。
 そして………
 レンズの向こうには、思いもよらなかった優しい眼差
し。
「あたしは、巽のこと、好きなんだからね………」
「さ、坂下………」
 ふ、とその目がさびしげに微笑む。
「名前、呼んでくれないんだ……………」
「あ………えっと………」
 望美が、『朽縄くん』から『巽』と呼び名を変えたこ
とには気付いていた。
 しかし………
「ねぇ?」
「えっと…………………………」
「ん?」
「…………………………名前、なんだっけ?」
 望美は、そのまま石化した。

        ☆      ☆      ☆

「なによ、その左ほっぺたの紅葉は?」
 紅葉というには、すこし大きい赤いあざを見て、翔子
はくすくすと笑った。
「坂下望美にビンタを食らった」
 痛みの代償に覚えた名前を復唱しながら、巽は不貞腐
れて言った。
「あら、坂下ちゃんなの。あんた、見境無く手を出して、
ソデにされたの?」
「名前を知らなかっただけだ」
 翔子は、思わず望美に同情した。
「あんた、そのうち女の子に刺されるわよ」
「知らないよそんなの。僕が何したってんだ。自慢じゃ
ないけどクラスの女子の名前なんか、殆ど覚えてないん
だぞ。木崎だって坂下だって、生徒会で仕事してるから
覚えただけだっ。フルネームなんか、知るもんか」
「木崎ちゃんのフルネームも知らないの?」
 巽は首を横に振る。
「ソレくらいは知ってるよ。木崎美央。名簿で何度も見
てるからね」
「羽島先輩は?」
「羽島八重。これも名簿で見てるから知ってる」
 翔子は、さらに望美への同情をさらに深めた。
「よくよく坂下ちゃん、男見る目無いのね」
「ど、どういうことだよ?」
「決まってるじゃない。ファーストネームがどうこうな
んて話が出てくるってことは、あんた、坂下ちゃんに言
い寄られたんでしょ?」
「………ん、まぁ………」
 全くその通り。
「その当人が名前すら知らないなんて、ショックでしょ
うね」
 もっともないいぐさに、巽はやや逆切れ気味に言い返す。
「だったら言い寄る前にアピールしてくれ。編集長のフ
ルネームは知ってても、ヒラの報道局員の名前なんか、
目にする機会、あるわけないじゃないか」
 聞きようによっては、ヒドい言い方である。
「クラス名簿はどうなのよ?」
「必要な時以外見ないし、覚えるモンじゃない」
 翔子はジト目で、巽を睨む。
「………あんた、クラスで孤立してるんじゃないの?」
「勝手なこと言わないでくれ。男子の名前は全員覚えて
るし、ちゃんとコミュニケーション取れてるよ」
「じゃ、何で女の子の名前は覚えないのよ?」
「話す必要無いし、最低限苗字を覚えてればなんとかな
る」
「………あんた、もしかしてゲイ?」
「ノーマルだ」
「じゃ、なんで女の子に興味ないのよ? ははぁ、さて
は恥ずかしいから、そういうの気にしないってポーズ取
ってるの?」
「必要が無い、と言っただろ? 実際共通の話題なんか
無いし、話すとしても木崎と自治会のこと話すくらいの
もんだ」
「あ、そっか。木崎ちゃんとは教室でも普通にしゃべっ
てるわけね」
「そうだよ。ついでに言えば、話しかけられれば坂下と
だって普通に話してるよ」
「じゃ、恥ずかしいってのは、あたしの間違いね」
「恥ずかしいというなら、翔子が乗り込んできて話すの
は、多少恥ずかしい」
「え? あたし?」
「うん。内容が傍若無人で自己中心的で唯我独尊な幼な
じみと話しているのを聞かれるのは、心臓に負担が大き
い」

        ぽかっ

「よけいなこと言わなくていい」
「はい………」
「で、今日は何なのよ?」
「ん? ちょっと用意してきたファイルがあるから、オ
プションiを使ってファイルを読み込んで」
「オプションi?」
「うん。ファイルを実行した後に、インタープリタモー
ドに入るんだ。インタープリタで使うファイルをあらか
じめ読み込んでおくときには便利だよ」

        C:\work>python -i mks.py
        >>>

「これ、何のファイル?」
「うん。実はコレ、物理の計算で単位を確認するための
モジュールなんだ」
「物理って?」
「MKS単位系(MKS System)って知ってる?」
「なによそれ?」
「メートル、キログラム、セカンド (秒) を基準とする
単位系だよ。例えば速度ならメートル・パー・セカンド、
つまり毎秒何メートルってあらわすんだ」
「キログラムは何に使うのよ?」
「たとえば力の単位ニュートンは、キログラム・メート
ル・パー・セカンド・スクェア、つまり秒の二乗分の、
キログラム・メートルで表すんだ」
「面倒くさそうね」
「うん、結構面倒くさい。もちろん数字だけで計算でき
るんだけど、単位が間違っていないかどうか、確認しづ
らいんだ。そこで、単位付きで計算できるってのがこの
モジュールのいいとこだよ」
「もしかして、メートル、割る、秒、とかしたら、メー
トル毎秒、になるの?」
「そのとーり。便利っぽいでしょ?」
「びみょー」
「ううう………とりあえず、見てよ」

        >>> x = 10 * m
        >>> y = 5 * kg
        >>> z = 2 * sec
        >>>

「掛け算?」
「まぁね。m は1メートルだと思ってよ。1m っていう変
数は使えないからね」
「ぎりぎり許可ってトコね」

        >>> x
        10.0 m
        >>> y
        5.0 kg
        >>> z
        2.0 sec
        >>>

「表示は、単位つきになるのね」
「うん、見やすいでしょ?」
「でも、何で浮動小数点数になってるの?」
「計算しやすいから、内部で変換してるんだ」
「ふぅん」

        >>> v = x / z
        >>> v
        5.0 m/s
        >>>

「あ、毎秒になった」
「ちょっといいでしょ?」
「うん。ちょっといいかも。ところで、速度の記号って
何でvを使うの?」
「速度がVelocityだからじゃないかな?」
「単に英語なのね」
「そんなもんだよ」

        >>> a = v / z
        >>> a
        2.5 m/s^2
        >>>

「これは………加速度ね」
「そのとおり」
「Acceleration、だっけ?」
「多分」

        >>> f = y * a
        >>> f
        12.5 N
        >>>

「力(Force)って、質量×加速度だっけ?」
「うん。例えば1キログラムの質量のモノが地球に引っ
張られる力は、地球の重力加速度を掛けて、9.8ニュー
トンだよ」
「あ、それが確か『重さ』よね」
「そうそう」
「ところで『重さ』が力なら、質量って何?」
「なんだかわかんないけど、重力に作用されない物体に
固有の値」
「なんだかわからないのね?」
「なんだかわからないんだ」
 慣性質量とかもあるが、でも実感しにくい値であるこ
とは事実だ。

        >>> w = f * x
        >>> w
        125.0 J
        >>>

「ジュール、って読むのよね、コレ」
「うん。仕事(Work)の単位だよ」
「熱の単位じゃなかったっけ?」
「それにも使う。以前は熱はカロリーを使ってたけど、MKS
にあわせてジュールを使うように統一しつつあるんだ」
「で、混乱してる、と」
「うん、混乱してる。でも、ま、仕方ないよね」
「仕方ないのかなぁ………?」

        >>> p = w / z
        >>> p
        62.5 W
        >>>

「最後が仕事率 (Power)。ワットは電力の単位でもある
から、おなじみだよね」
「百ワット電球ね」
「百ワットは、百キロの重さの物に毎秒1メートルのス
ピードを1秒毎に加速させる力で1メートル動かす仕事
を1秒間に行う仕事率だよ」
「自分で言ってること、わかってる?」
「判ってるけど、イメージは全く出来ない」
「じゃ、言わないで」
「はい」
「これでおしまい?」
「まだまだ。たとえば、m/s や m/s^2 っていう単位は使
えないから、m_s と m_ss になってるけど、距離を速度
で割る、とかにも対応できるんだ」

        >>> (100 * m)/(10 * m_s)
        10.0 sec
        >>>

「ほぉほぉ」
「あと、100メートルの高さからモノを自由落下させ
たら何秒後につくか、なんて計算も、単位付きで出るよ」

        >>> g
        9.8 m/s^2
        >>> (2 * (100 * m) / g).sqrt()
        4.51753951453 sec
        >>>

「うんうん、便利だってこと、認めたげる。で、今回の
お題は、当然その、mks.py ってのを作るのよね?」
「違うよ」
「え? 違うの?」
「うん。だって、ソース見てみる?」
 開いたファイルの中身を見た翔子は、『うっ』と唸る。
「な、長いことは長いけど、それより、なんかすごくや
やこしそうなんだけど」
「うん、僕もそう思う。今回は、プログラミングという
より、考え方の話なんだ。今回使った x,y,z,v,a,f,w,p
は、ただの数値じゃなくって、それぞれ、Length, Mass,
Time, Velocity, Acceleration, Force, Work, Power っ
ていうクラスのオブジェクトなんだ。原理はちょっとや
やこしいけど、結果だけ言えば、たとえば Length オブ
ジェクトを Time オブジェクトで割ると、Velocity オブ
ジェクトで答えが出るようにしてあるんだ」
「オブジェクトを変えるとどうなるわけ?」
「今回の場合は、表示単位が変わるよね」
「あ、そっか」
「あと、計算間違いしないようになってる。たとえば、x
を z で割れば速度だけど、z を x で割っても意味ない
から、おかしいよってメッセージが出るようになってる
んだ」

        >>> x / z
        50.0 m/s
        >>> z / x
        UNKNOWN DIMENSION
        >>>

「間違った計算をしないための、予防策?」
「そういう使い方が考えられるね。単位をもった数値は、
それぞれ次元 (dimension) を持ってて、同じ次元のもの
は加減算ができるけど、違う次元だと加減算はできない。
次元が違うものは乗除算はできるけど、その結果はもと
のどちらの次元とも異なる」
「えっと、確か物理で習ったわね。長さはL,質量はM,
時間はTとして、たとえば速度はLT^-1 で表すって」
「加減算では次元は変更されず、乗除算では変更される
っていうのは、明らかに数値ではあるんだけど、数値と
は異なった性質も兼ね備えているわけだよね。そういっ
たもの別の型で表現する方法を『抽象データ型』と呼ぶ
んだ。新しい型には新しい計算法則が適用される。たと
えば、長さの Length 型のオブジェクトを時間の Time
型で割ると、速度の Velocity 型になる、とかね」
「ふぅん。でも、いくら拡張しても数値は数値でしょ?
 計算が簡単になるわけじゃなし」
「そうだね。じゃ、例えば、円や球って、基本的には半
径が決まれば、直径、円周、円の面積、球の表面積、球
の体積がすべて決まるよね」
「まぁ、そうよね。直径は2r、円周は2πr、円の面
積はπrの二乗、球の表面積は4πrの二乗、球の体積
は3分の4πrの三乗だからね」
「じゃ、円っていうクラスを作っておいて、一気に計算
できるようにするっての、どう?」
「できるの?」
「こっちは簡単だから、作ってみようよ」

	>>> class Circle:
	...   from math import pi
	...   def __init__(self, r):
	...     self._r = float(r)
	...   def radius(self):
	...     return self._r
	...   def diameter(self):
	...     return 2 * self._r
	...   def circle(self):
	...     return 2 * Circle.pi * self._r
	...   def area(self):
	...     return Circle.pi * self._r ** 2
	...   def sphere(self):
	...     return 4.0 * Circle.pi * self._r ** 2
	...   def cubage(self):
	...     return (4.0 * Circle.pi * self._r ** 3) / 3.0
	...
	>>> c = Circle(1)
	>>> c.radius()
	1.0
	>>> c.diameter()
	2.0
	>>> c.circle()
	6.2831853071795862
	>>> c.area()
	3.1415926535897931
	>>> c.sphere()
	12.566370614359172
	>>> c.cubage()
	4.1887902047863905
	>>>

「なんか一見面倒に見えるけど、同じことのくり返しね」
「うん。クラスの作り方の基本、教えとくね。まず、class
キーワードの後にクラス名を書くんだ。今回は Circle
だね。そしてブロックを始めるコロン':'を書いて中身を
書くんだ。class ブロックの中で定義された変数や関数
は、クラス名にドットをつけて呼び出すか、クラスから
生成されたオブジェクトにドットをつけて呼び出すこと
ができる。今回、pi がクラスの中で定義されてるから、
Cirecle.pi で呼び出すことができるんだ。こういう変数
を、クラス変数って呼ぶんだ」
「クラスのブロックの中でも、クラス名が必要なの?」
 巽は頷く。
「面倒に見えるけど、クラス名を指定する理由があるん
だ。すぐに説明するよ」
「そう。じゃ、続けて」
「うん。def は関数定義と同じだけど、クラスの中で定
義される関数はメソッドになるんだ。違いは、メソッド
では第一引数が必ず『自分自身』すなわち、『クラスに
よって定義されたオブジェクト』を指すことになる。第
一引数の名前は実際はなんでもいいんだけど、慣用的に
self を使うことが多い」
「じゃ、そうしたほうがいいわけね」
「そのほうがいいと思う。絶対じゃないけど、読みやす
くなるからね。この第一引数は、実際にメソッドを呼び
出す時には、省略されるんだ。つまり………

	object.method(x, y)

は、

	method(object, x, y)

になると、考えればいい」
「面倒なのね」
「若干ね。すぐ慣れると思うけど。この self は、オブ
ジェクトが持ってるオブジェクト変数やメソッドを、メ
ソッドの中で参照する時に使うんだ。今回だと、_r がオ
ブジェクト変数だから、self._r で呼び出してる」
「クラス変数とオブジェクト変数って、何か違いがあるの?」
「オブジェクト変数は、作られたオブジェクトに固有、
つまり今回は c についてのみのものだけど、クラス変数
は、クラスから作られたオブジェクト全てに共通な変数
だよ。というより、クラス名にドットつければ、クラス
やオブジェクトの外からでも参照できるから、ただの変
数、って言っていいかもしれない。まぁ、クラスの外で
定義してると間違って再定義されちゃうかもしれないか
ら、クラスの名前で保護してるってトコかな?」
「要するに単なる間違い防止なのね」
「言ってしまえば、ね。そもそも、こういうオブジェク
トを定義するオブジェクト指向プログラミングって、無
ければプログラムできないっていうモノではないんだ。
変数や関数の名前を、関連あるもの同士関連づけて、わ
かりやすくしようって趣旨で作られたものだから。もっ
とも、オブジェクト指向プログラミング言語の元祖の
Smalltalk………って、実は言語というよりシステムなん
だけど………の考え方はもう少し厳格で、プログラムを、
オブジェクトとのメッセージのやり取りのみで記述しよ
うという考え方になるんだけど」
「それは理解するところ? 聞き流すところ?」
「今は聞き流していいよ」
「……………」
「……………ごめんなさい」
 翔子はため息をついた。
「ったく。最近ちょっとはマシになったかと思ったら、
まだそーいうクセ、直ってないのね」
 巽は頭を掻きながら、苦笑いする。
「ほんと、ごめん。最近翔子、色々判るから、つい口が
滑ったんだよ。というか、結構このごろ突っ込んだ話し
ても理解してくれるから、油断したとも言うんだけどね」
「なによそれ。あんたが変わったんじゃなくて、あたし
の聞き方が変わったっての?」
「それも若干あるかな、と」
「………はぁ………あたしがヲタ化したら、意味ないじ
ゃん」
「続けていいかな?」
「いいわよ。こーなればヤケよ。最後まで付き合ったげ
るわ」

	そろそろ終わりだけどね

 巽は心の中でこっそりと呟いた。
「じゃ、続けるよ。メソッドの中でも、名前がアンダー
スコア2個で始まってアンダースコア2個で終わるもの
は、特別なんだ。中でも __init__ メソッドは『コンス
トラクタ』と呼ばれて、クラス名を関数のように呼び出
して、オブジェクトを作る時に使われるんだ。つまり、
__init__ の中の内容は、今回の場合は Circle() で行わ
れるんだ。return は絶対に書かない。返されるものは、
そのクラスの新しいオブジェクトに決まってるからね」
「もうちょっと整理して話せない?」
「う〜ん、つまるところ、クラスを作る時に行う処理は、
すべて __init__ に書けばいいってとこかな?」
「最初からそう言えばいいのに」
「………。ま、いいや。特殊なメソッドには、ほかにも
オブジェクトが削除されるときに処理されるデストラク
タの __del__ や、オブジェクトを関数みたいに呼び出す
時に使われる __call__。それに、+や−なんかの演算子
が使われた時の処理方法を決める __add__ や __sub__
なんかがあるよ。mks.py は、この演算子を規定するメソ
ッド………メソッドフックって言うんだけど………これ
を定義して、単位計算が出きるようにしたものなんだ」
「ふぅん。ところでこのオブジェクトの話って、プログ
ラムにどうやって応用するの? さっきみたいな物理の
単位を作るみたいな場合って、あんまり無さそうなんだ
けど………」
「そうだね。確かに必須じゃないけど、それは今みたい
なコンソールベースのプログラムを作ってる限りは、っ
てことだよ」
「コンソールベースって?」
「プロンプトに打ち込んで対話したり、バッチ式に一気
に実行しちゃったりするプログラムのことだよ。GUI を
使うようになると、オブジェクトの話抜きでは、ちょっ
と辛くなるからね」
「じーゆーあいって?」
「Graphical User Interface,つまり、マウスやウィンド
ウを使う、普通見てるようなアプリケーションの方式の
ことだよ」
「そんなの、できるの?」
「ん? 簡単なの、作ってみようか?」

	>>> from Tkinter import *
	>>> w = Tk()
	>>> l = Label(w, text="Hello")
	>>> l.pack()
	>>> w.mainloop()

「うぁ、うぁ、ちっちゃい窓が出たっ!」
「ゆくゆくは、こういうコンソールに触りたがらない人
でも使えるアプリケーションを作れるようになると、便
利でしょ? それにこれは、文字だけじゃなくって絵と
かも表示できるしね」
「コレいいな、コレやりたいなぁ〜」
「残念。今日はこれでおしまいだよ。ウィンドウベース
のアプリケーションを作りたければ、オブジェクトにつ
いて復習しておいてね」
「あ〜っ! ちょっとぐらい教えてくれてもいいのにっ!
 けちっ!」
 巽はにやっと笑った。
「残念だけど、理解できないことは教えないってのが、
僕の教え方のモットーだからね。教えて欲しければ、頑
張って理解してね」
「けちけちけちぃ―――――っ! ! !」

	☆	☆	☆

 翌日。
 昨日のことがショックだったのか、珍しく望美が顔を
見せず、久々に翔子と巽の二人で登校することになった。
 学校の正門前で、二人を待っている人物がいた。
「お、おはよう、朽縄くん、大鳥先輩」
 木崎美央は、なんだか妙に緊張した面持ちで、二人に
近づいてきた。
 そして、巽の前に立つと、すぅっと、深呼吸して、そ
して、目をつぶって、思いっきり、言い切るように、言
った。
「あたし、朽縄くんと一緒がいいっ!」
 言った後、巽と顔も合わせずに振り返り、脱兎のよう
に教室に向かって駆けてゆく。
「……………何なんだ一体?」
 首を傾げる巽に聞かれ、翔子が首を振る。
「あたしに聞かれても、わかるわけないでしょ?」
 それが、情報部設置の話に繋がることに巽がようやく
気付いたのは、昼休み始まりのチャイムが鳴った時だっ
た。
 そしてその巽の机に、望美と美央がやってきた。
「巽、お昼休み、ちょっと話、いい?」
 望美が、真剣な顔で言った。
<つづく>

	☆	☆	☆

<参考>
# mks.py : MKS System
'''
Dimension
Length		m(L)
Mass		kg(M)
Time		sec(T)
Velocity	m/s(L/T)
Acceleration	m/s^2(L/TT)
Force		N(LM/TT)
Work		J(LMM/TT)
Power		W(LMM/TTT)
Impulse		Ns(LM/T)
'''

def isNum(v):
  return v.__class__ in (int, float, long)

L = 1
M = 2
T = 3

def getDimension(d):
  if d == [[L],[]]:
    return Length
  elif d == [[M],[]]:
    return Mass
  elif d == [[T],[]]:
    return Time
  elif d == [[L],[T]]:
    return Velocity
  elif d == [[L],[T,T]]:
    return Acceleration
  elif d == [[L,M],[T,T]]:
    return Force
  elif d == [[L,L,M],[T,T]]:
    return Work
  elif d == [[L,L,M],[T,T,T]]:
    return Power
  elif d == [[L,M],[T]]:
    return Impulse
  elif d == [[T,T],[]]:
    return SquareTime
  elif d == [[],[]]:
    return float
  else:
    return 0

def reduction(d):
  d0 = d[0][:]
  for x in d0:
    if x in d[1]:
      d[0].remove(x)
      d[1].remove(x)
  d[0].sort()
  d[1].sort()
  return

class Dimension:
  def __init__(self, value, dim1=[], dim2=[], unit='Constant'):
    self.value = float(value)
    self.dim = [dim1,dim2]
    self.unit = unit
  def __add__(self, other):
    if self.__class__ == other.__class__:
      v = self.value + other.value
      return self.__class__(v)
    else:
      print "NOT SAME DIMENSION!"
      return
  __radd__ = __add__
  def __sub__(self, other):
    if self.__class__:
      v = self.value - other.value
      return self.__class__(v)
    else:
      print "NOT SAME DIMENSION!"
      return
  def __rsub__(self, other):
    if self.__class__:
      v = other.value - self.value
      return self.__class__(v)
    else:
      print "NOT SAME DIMENSION!"
      return
  def __mul__(self, other):
    if isNum(other):
      return self.__class__(self.value * other)
    d = [self.dim[0][:],self.dim[1][:]]
    d[0] += other.dim[0]
    d[1] += other.dim[1]
    reduction(d)
    v = self.value * other.value
    c = getDimension(d)
    if c:
      return c(v)
    else:
      print "UNKNOWN DIMENSION"
      return

  __rmul__ = __mul__

  def __div__(self, other):
    if isNum(other):
      return self.__class__(self.value / other)
    d = [self.dim[0][:],self.dim[1][:]]
    d[0] += other.dim[1]
    d[1] += other.dim[0]
    reduction(d)
    v = self.value / other.value
    c = getDimension(d)
    if c:
      return c(v)
    else:
      print "UNKNOWN DIMENSION"
      return

  def __repr__(self):
    return str(self.value) + " " + self.unit

  __str__ = __repr__


class Length(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L], [], 'm')

class Mass(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [M], [], 'kg')

class Time(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [T], [], 'sec')

class SquareTime(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [T,T], [], 'sec^2')
  def sqrt(self):
    v = self.value ** 0.5
    return Time(v)

class Velocity(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L], [T], 'm/s')

class Acceleration(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L], [T,T], 'm/s^2')

class Force(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L,M], [T,T], 'N')

class Work(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L,L,M], [T,T], 'J')


class Impulse(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L,M], [T], 'Ns')


class Power(Dimension):
  def __init__(self, value):
    Dimension.__init__(self, value, [L,L,M], [T,T,T], 'W')

m    = Length(1)
kg   = Mass(1)
sec  = Time(1)
m_s  = Velocity(1)
m_ss = Acceleration(1)
N    = Force(1)
J    = Work(1)
Ns   = Impulse(1)
W    = Power(1)