『基本的人権』とは何か?

 まず、私の手元にある国語辞典を引いてみましょう。すると、こういう意味だと書かれていました。「憲法にきめられている、いかなる権力にもおかされない、人間が当然にもつべき権利。人権。[個人の精神・身体の自由や、物質的生活手段の確保などを中心とする]」と、ありました。何だか、わけがわかったようなわからないような説明です。私たち日本人は、これと同じような説明をこれまでも何度か聞かされてきました。「へぇ〜。今の日本の憲法でそう決まっているのか。そういうものなんだな。」と納得しないと、時代に乗り遅れるように感じたり、今の世の中から取り残されてしまうような気持ちになってしまいます。
 だから、『基本的人権』という言葉の正体がつかめないまま、それをどうやって尊重したらいいのかわかりません。この言葉を読むことはできても、何度読んでもよくわからないから、知っているふりをしようというのが、これまでの私たちの本音だったと思います。
 「これからの世の中は、人は個人として尊重されるんだよ。」と他人から言われたりします。言うことをきかない我が子に手を上げてはいけない、と諭(さと)されたお父さんお母さんは一体どうしたらいいのか困り果ててしまいます。結局我が子を甘やかしてしまい、人として基本的なことを身につけさせてあげられなかったりします。
 だから、「日本人はこうあるべきだ。」とか「我々日本の社会、あるいは、世の中はこうあるべきだ。」とか「日本国はこうあるべきだ。」という理想を掲げることが大切だ、と考える人たちも増えているのです。それなのに、現行の日本国憲法にはどうして、このような日本人として、あるいは、人間として道義的に大切な理想が述べられていないのか。こんなことでは、日本人は、日本の社会、あるいは、日本国は、乱れていく一方である。全ての法律のおおもとである、憲法のこうした悪しき内容を変えて、戦後にわかに蔓延(はびこ)ってきたそうした悪しき状態から日本人や日本国を救わなければいけない。そうした使命感を持つ人たちが、そんなふうに考えていることは、無理からぬことと言えましょう。
 ところが、最近、思いがけない事件が起きてしまいました。このことを話せば、若い人たちにも理解ができると思うので、ここであえて述べさせていただきます。昨年の、横綱日馬富士暴行事件です。その事件についての詳細は、ここでは割愛させていただきます。テレビを通じて私は、「これは、今の日本人と風習の違うモンゴル人同士が起こした暴力事件である。」ということと「日本の相撲協会の古い体質が、そうした暴行事件を内々のものとして隠蔽して、被害者の人権を侵害してしまう可能性があった。(注・日本相撲協会は、被害者の力士の人権を実際には侵害してはおりません。私の前の記述では、そこを間違って受け取られる心配がありましたので、訂正いたしました。日本相撲協会様に、陳謝いたします。ファンの方々も安心してお相撲を観覧ください。)」ということを知りました。実は、こうしたニュースの背景には、語るのも恥ずかしい、私たち日本国の失敗と反省の歴史があると思うのです。
 「力士としてこうあるべきだ。」とし、後進を指導した元横綱日馬富士だった人は、後進が言うことをきいてくれないと判断して暴力的な指導をして、それがエスカレートしてしまいました。結果、後進の一人に大怪我を負わせて、世の中で大騒ぎになったことは周知のことです。実は、このようなことは戦前戦中における軍国主義の日本においては、日常茶飯事(さはんじ)でした。子供の頃に私は、両親や祖父母から、慰安婦のことは一度も聞いたことはありませんが、彼らの世代の多くの人々が、教育指導のもとに暴行を受けて、殴られたり引っ叩かれたりしたそうです。そして、その後遺症で、片目の視力が落ちたり、片耳が聞こえづらくなってしまったという話をよく聞かされました。
 教育や指導をする側の暴力というものは、DVなんかもそうですが、躾(しつけ)や教育や指導といった正当な理由があったとしても、相手が言うことをきいてくれないとわかるとエスカレートしたり、常習化してしまうものなのです。誰か止めにはいる人や言葉で注意する人がいないと、歯止めがきかなくなったり、罪の自覚が全くないということが多いのです。だから、後進を教育指導する立場の人は、注意しましょう。指導をする側の私たちが折角(せっかく)正しい志を持っていたとしても、相手にそれが伝わらず、迷惑をかけてしまうということになってしまうのです。
 さらに、精神的な影響力に関しても、注意が必要です。そのように教育や指導を、拷問や体罰などの暴力をともなって行うことによって、それなりの効果は期待できるかもしれません。拷問や体罰などで暴力を受けた側には、二度とそんなイヤな気分は味わいたくないと感じさせて、行動を改めさせやすいと言えます。しかし、それは同時に、暴力の肯定や正当化を学ばせることになります。普段の規律さえ守っていれば、(身の危険を感じたなどの)自分勝手に正当化された理由によって、暴力や、殺人さえもしてよいということになるのです。これは、教育や指導をする側の盲点です。まさか教育指導をされる側がそんなことを感じて学んでいるなんて、これまでの常識では全く考えられないことだったと思います。
 過去の日本の歴史を振り返ってみても、道義的に正しいことをしていた人が、いきなり暗殺されたりする事件が時々あったりします。立場の違う人の恨みを買ったからだと、私たちは考えがちです。これまでは、それが全ての原因だったと、私たちは考えていたと思います。けれども、本当にそれだけだったのかな、と疑うことも、ひょっとしたら必要なのかもしれません。「日本人はこうあるべきだ。」と道義的に強く主張される人を、私は否定しませんが、慎重に述べて頂き、くれぐれも事故など起きて欲しくないなと祈るばかりです。
 さて、ここからは具体例に基づく話はやめにしましょう。学校のいじめの話もそうですが、人権にまつわる私たちの日常の経験を語りだすと、人権侵害の例などに話が及んで、際限なく身が沈んでいく泥沼のようになってしまうからです。それでは、いつまでたっても、らちがあかないと思います。もっと原理原則的に話を進めましょう。
 そもそも『基本的人権』とは何か、と私たちは考えます。人権に基本的なものとそうでないものがあるのかな、と考えます。基本的な人権って何だろう、よくわからないから、私たちが理解しやすい言葉に変えて、『基本的人権』は削除しよう。誰だって、このように考えてしまうと思います。
 かつて私が学校でこの言葉を社会科で学んで覚えた時も、言葉の意味がよくわかりませんでした。しかも、大人になって、つい最近までの長い時間が流れても、いっこうにこの言葉の意味するところが理解できませんでした。だけど、世の中のみんなが「基本的人権は尊重しなければいけない。」と言っているので、みんなと同じようにそう思い込まないといけないと思っていました。でも、これでは民主主義ではなくて、宗教です。
 本当のことを申しましょう。私たちの世の中に、『基本的人権』という、そういう特別な人権があるわけではないのです。これは、法律の世界の中の言葉です。砕いて言えば、『人権』のことです。なぜ「基本的」とわざわざ形容しているのかと申しますと、以下の二つの意図、すなわち、先人の知恵が感じられます。
 一つは、法律上で変えてはいけない基本的なものであることを示すためです。すなわち、人権とは、「(私たち人間が)変えてはいけない、あるいは、失くしてはいけない基本的なものであるところのもの」です。「そんなこと、わざわざ、法律に書いていなくてもわかっているじゃないか。人間として当たり前のことだ。言わなくてもわかる常識だ。」と、しばしば私たちは反発します。しかし、私たちは、時と場合に応じて、しばしば非人間的なことをしてしまいます。それが、私たち人間の現実なのです。それを法律や道徳で取り締まろうとします。けれども、それにも限界があります。それもまた、私たち人間の現実なのです。
 もう一つは、『人権』という言葉の濫用を防ぐためと考えられます。私の戯言(たわごと)にすぎないかもしれませんが、人権人権とただ繰り返すのは簡単なことです。あれも人権だ、これも人権だということになると、何でも人権だということになって際限がなくなります。しかるに、『基本的人権』と言わなければならないとすると、その言葉の扱いに重みが加わります。『人権』という言葉の意味することがたやすく用いられたり、軽々しく扱われることを防ぐことができると思うのです。
 したがって、「(人権を)尊重する」という言い回しの意味方向も、次のように考えることができると思います。その文言(もんごん)を言い換えるとするならば、「(人権を)軽んじない、軽視しない、あるいは、軽々しく扱わない」ということだと思います。
 そしてまた、「人権を守る」ではなくて「人権を尊重する」ということはどういうことなのかを考えましょう。「守る」というと、害がないように防ぐとか、決められた規則などに従わせるという、周りから何かを人に強制させないといけないようなイメージになってしまいます。しかし一方、「尊重する」となると、人権にかかわる双方が双方のことを認められるように、おのおの自発的に努力し、その意志を持つというイメージになると思います。強制的にではなくて自発的・自主的にという言葉のニュアンスが、「尊重する」という言葉の表現には含まれていると思います。
 最後に、ひと言ことわっておきます。TPOに合わせて的確に内容をとらえなければならない場合、日本語は難しいです。今までほとんど手伝ったことさえなかった農業を学ぶために、四十代の私は農家研修に行きました。そして、六十代の農家さんの「〇×△しろ。」という動詞だけの命令語がわからなくて、何をしていいかわかりませんでした。「お前は日本人なのに、日本語がわからないのか。」とその度に叱られて、頭を拳でゴツンと叩かれました。私はそのことに手向かいはしませんでしたが、その無抵抗はかえって、農家さんの暴力的な指導をさらにエスカレートさせてしまうこととなりました。
 私は、このような経験から、日本語を理解するためには、その背景となる予備知識(あるいは、先人の知恵)を知らないと上手くいかないことを知りました。現代の私たちは、新しいものに目を奪われがちですが、古いものを理解する力も無いといけない、ということです。学校で、古文や漢文などの古典や、世界史や日本史などの歴史を学ぶのは、受験勉強のためばかりではなく、社会に出てからも必要な見方であり、かつ、必要な素養なのです。私はそう理解しています。

日本国憲法風戯言案??

 あらかじめ断っておきますが、今回のブログ記事は、誰も見ていないことを前提にして書いてみたいと思います。私自身の主義主張というよりも、戯言(たわごと)に近いと思うからです。今日は、憲法記念日です。本当は、『基本的人権』について私の知っていることを述べてみたかったのですが、もう少し考えを練ってみる必要がありそうです。そういうわけで、『基本的人権』については、別の機会に述べてみたいと思っています。
 そのかわりに、ここのところ話題となっている、日本国憲法9条にもしも自衛隊について明記されるとしたならば、日本国民の一人にすぎない私にとって、どんな条文だったら気に入るだろうかと考えてみました。ただし、これは、あくまでも私の戯言(たわごと)ですので、その良し悪しを気にかけて議論などしないで、聞き流して頂いて結構です。私としても、ちょっと興味がわいただけなのです。
 さて、いきなり本題に入りましょう。いきなり、結論から入ります。憲法第9条3項として「ただし、自衛隊およびそれを定める法律は、国際平和および公共の福祉に反しないかぎり合憲とする。」という限定の条文を追加するといいと、私は思いました。「何だ。このまんまズバリじゃないか。」と、多くの人たちから批判を受けてしまうような文の内容です。
 今回の問題は、「今のままでは自衛隊(および、それを規定する自衛隊法)が憲法違反(つまり、違憲)のままになってしまう。」ということにあると思います。憲法が取り締まるものは、人ではなく、法律です。憲法違反と判断される法律は、いずれ法律として認められなくなります。しかし、自衛隊法がなくなってしまうと、それが巡り巡って困ることになるのは私たち日本国民自身です。国のつくった組織が、国の法律で規定されていないなどということは、あってはならないことです。それは法治国家とは言えませんし、その組織が暴走した時に誰も止められない、ということになりかねません。
 しかも、自衛隊がたとえ違憲であっても、現在の自衛隊が無くてもいいと思っている日本国民は、ほとんどいないと思います。災害救助にしても、国際協力が必要な問題においても、自衛隊が必要であることは明らかです。しかも、今日までの自衛隊が、軍隊と同等の装備と武力を持ちながら、日本の国益を損なわないように慎重に行動してきたことも事実だと思います。
 日本国憲法の第9条2項に、「陸海空軍その他の戦力は、これを保持しない。」とあります。だから、自衛隊は実質上軍隊であり、憲法違反であるということになります。しかし、現実に軍隊があることが即、憲法の条文内容とそぐわないから、違反していると決めつけてよいのかということが問題になると思います。そんなに物事が簡単に片付くのであれば、シビリアンコントロール文民統制)などというものは、そもそも不要なのではないか、とも考えられるのです。
 私は、中学と高校の地理の授業で、あの軍事的中立国のスイスのことを学びました。スイスの国は、中立国なのですが軍隊があります。すなわち、自らが武器を持って戦うことを、スイス国民は国民投票で承認しています。彼らの軍隊は、国際紛争を解決する手段のためにあるのではありません。ドイツやフランスなどの近隣国の戦争に巻き込まれて、生活圏がおびやかされることから彼ら自身を守るために、それは歴史的にあるのです。
 日本国憲法は、70年くらい前に制定されたということもあって、日本の『戦争を全く知らない子供たち』にとって、全く予備知識がないために、その条文内容が理解しにくいものと言えるかもしれません。(私も戦後生まれなので、その一人かもしれませんが…。)中学と高校の公民の授業でその条文と内容を学んだ、私はこう考えます。これは、企業で言えば、始末書のようなものなのだ。日中戦争や太平洋戦争において、日本が国家として書いた反省文なのだ、と私は感じていました。ただし、それは、ただの始末書や反省文に終わりませんでした。終戦後当時の日本が、これからどういうビジョンを持って、どういう方向に進んでいくのかを示した法律の条文でもあったのです。そういう意味では、今日までの日本国憲法は、世界無形文化遺産に申請してもよいのかもしれません。
 なお、私が戯言(たわごと)として考えた3項の条文では、「国際平和および公共の福祉に反しない」そのかぎりにおいては、という縛り、すなわち、シビリアンコントロールみたいなものを入れてみました。国際平和および公共の福祉に反した場合には、自衛隊および自衛隊法は違憲になり、法として無効になるとしてみました。そうならなければ、それらは合憲であり、日本の法律の定めるところによりその存在意義が公に(つまり、法的にも)認められるとしたわけです。本当のシビリアンコントロールは、国民主権のもとに、日本国民自身が責任をもって行うことに変わりはありません。

私のプロフィール 受験勉強の奇跡

 以前私は、私自身のブログ記事で、高校入試の数学の試験で、時間内に問題が解けなかったという大失敗をしてしまった、ということを書きました。今回は、それとは逆に、大学入試の世界史の試験(選択科目の試験)で上手く解答できた、その経緯(いきさつ)について述べてみたいと思います。2012年10月21日付の私自身のブログ記事『主権在民について』で、そのことを簡単に書いていましたが、今回はもう少し詳しく述べてみましょう。
 ご存知のとおり、私の学校時代は、受験戦争と詰め込み教育の全盛期でした。大量に勉強の知識を記憶している人ほど、学校の勉強ができて、テストの成績が良くなって、良い学校の入試にも合格できるという時代でした。そのことの良否は別として、それが当時の私の直面していた現実だったのです。
 それにしても、高校二年の一年間の授業で週一、二時間学んでいた、青緑色の表紙カバーの世界史の教科書が分厚(ぶあつ)かったことは、この歳(とし)になった今でも忘れられません。学校の授業を学ぶのに使われた教科書の中で、当時のその世界史の教科書ほど厚みのある教科書は、他にはなかったと思います。高校三年の一年間の授業で同じく週一、二時間学ぶのに使っていた黄色の表紙カバーの日本史の教科書よりも、その厚みがずっとありました。
 私は、普通科の高校へ通っていましたが、地理・世界史・日本史・公民という区分けで社会科の各科目を学ばされていました。高校一年で地理、高校二年で世界史、高校三年で日本史と公民の授業があって、各学年でそれらの科目の単位を取得しました。高校時代の私は、個人的に世界文学に興味を持っていたので、大学で外国文学を勉強したいと思っていました。その一方で、数学や物理では、興味はあったものの、その授業や試験や通信添削などで数多くの挫折を経験していました。とてもじゃないけれど得意科目とは言えませんでした。当時の大学入試では、選択テスト科目として、社会科か理科の系統の得意科目を最低一つ作っておかなくてはなりませんでした。したがって、高校三年では、受験勉強のために世界史を勉強することを、私は選ぶこととなりました。
 ところが、ここで、当時の私は、世界史をどうやって勉強しようかと考えることになりました。高校二年の一年間に授業で勉強したものの、その実際に学んだ事柄は、教科書上では飛び飛びで、しかも、その分厚い教科書の内容の三分の一は、授業で学ぶ時間がありませんでした。世界史の参考書を買って、目を通したものの、教科書よりも沢山覚える事柄が書かれていて、さらに勉強が困難になってしまいました。このまま受験勉強のために、予備校に行ったとしても、通信添削を利用したとしても、頭に詰め込む知識が増えるばかりで上手くいかないと、私は一人勝手に考えていました。
 そこで、「急がば回れ。」というか、少々時間はかかっても一番ケチな方法を考案することとなりました。「読書百遍、意おのずから通ず。」という諺(ことわざ)にもあるように、どんなに理解が困難な文章や書物の内容であっても、何遍(なんべん)も読めば、その意味内容が自然にハッキリとわかって理解や記憶ができてくるものだ、と当時すでに私はそう考えていました。そこで、世界史の教科書を、受験シーズンが来る前に、最初のページから最後のページまで、最低三回は読んでおこうと決めました。
 また、中学時代に私は、NHK総合テレビで毎日夕方になると『新八犬伝』という人形劇を観ていました。その劇中で、「因果は巡る糸車。」という、今は亡き坂本九さんの語りをよく聴きました。その通り、そうです。人間の歴史は、日本であろうと、世界であろうと、今であろう、昔であろうと、「因果は巡る糸車。」なのです。数字の細かい年号の暗記なんか、関係ないのです。何世紀ごろあたりのことだとわかっていればいいとわかったので、その『分厚い』世界史の教科書のみを三回読み込んで、その記述内容を理解するという勉強を実際にやってみました。
 H大学の入試で、世界史を選択しました。すると、いくつかの選択肢型の設問に続いて、記述式の設問がありました。「イギリスからのキリスト教布教と、中国のアヘン戦争について80文字以内で述べよ。」という設問でした。高校で受けた世界史の授業では、全く学んでいない箇所でした。しかし、当時の私にとっては、全く焦(あせ)りが感じられませんでした。あの分厚い世界史の教科書の全ページを読んでいたので、何を書いたらいいかはすぐわかりました。今になってみると、その書いた内容は全く覚えていません。けれども、私自身が教科書を読んで記憶したことの5W1Hは、ちゃんと記述できたと思います。しかも、80文字目のマス目に「。」を入れて、ぴったりと解答できたことが、私の心の中では一番の自慢でした。
 結局、後にその大学入試に合格したことを知りましたが、そうやってH大学に入学できたことは、私には思ってもみなかったことでした。ほぼ独学みたいな受験勉強の仕方で、世界史の試験がうまくいったことは、その後の私自身の人生に大きな自信と影響を与えてくれたと思います。
 よく、受験勉強なんて、学校の受験の時にしか役に立たない、若い時にしか役に立たない。大人として生活していくのに、何の役にも立たない。あんな勉強の知識など、出世につながらなければ、やるだけムダじゃないかと、世間一般は言うかもしれません。ある意味、それはその通りです。そんな余計な学問や教養を身につけなくても、立派に一人前の生活を営んでいる人は、世の中には沢山います。
 だから、私はこう考えます。何をどれだけ勉強したかが重要なのではなく、本当は、どのように勉強したのか、あるいは、どのように苦労したのかが重要なのかもしれない。その結果として、思いもよらない奇跡みたいなことが可能となるのかもしれない。そんなふうに、私は、考えています。

本当に怖ろしいことは何か?

 私は、名声も地位も財産も無いので、女性記者や女子高生などから最初から相手にされませんし、相手にされたこともありません。最近テレビで騒がれているような女性問題には引っかかりにくいようです。そんなふうに言うと、何か油断しているように見られるかもしれませんが、世の中の社会や組織のこと、こうした世の中の風潮や、緊縮した雰囲気などを危惧してはおります。多くの世間一般の人たちも、誰もがそう思っていることでしょう。
 私は、幼稚園や小学校、中学・高校・大学ですべて男女共学でした。社会に出ても、女性の社会進出が始まった頃で、その流れと男社会の狭間で、持つべき価値観が左右に揺らいでいました。もちろん、若い頃の私は、対人的に迷惑をかけたこともあったと思われます。そうした時は、必ず相手に人として嫌われたことを痛感していました。
 未成年あるいは未熟な成人としての私は、自らのそうした軽率だった言動に、心に一生残る傷としてイヤな気持ちを持ち続けることとなりました。その記憶と気持ちは今も変わりません。そうして、結局、私は私自身の心の中で責任を負いました。
 しかし、そうした辛い経験を若い頃にしたからこそ、そのまま間違った言動がエスカレートすることがなかったのです。また、相手の人間からストーカーとかセクハラとか言われて、公に訴えられることもなかったのだと思います。さらに、若い私の些細な失敗が、大ごとに至らなくて済んだのだと思います。
 私の言いわけに過ぎないかもしれませんが、人間だから誰だって『個人的に』多少の過ちを犯してしまっても仕方ないのかもしれません。もちろん、そのことを全面的に容認してもいいとは申しません。けれども、それに多くの人たちが過剰反応をして批難することは、余りにも大人気(おとなげ)の無いことです。つまり、私たちの生きている社会の人間関係をギスギスさせてしまうことに、結局なると思います。個人の気持ちや主張を大事にしすぎる余り、他人の気持ちや主張が理解しにくくなってしまうのです。
 そのようなことの例の一つとして、最近私がテレビで観たある映像の話を致しましょう。それは、ある雪山で、熊の子供(と言っても、大型犬くらいの大きさの動物)が、人間に近づいてきたので、人間の側が大声をあげてその熊を追い払う、というシーンを撮影したものでした。人間が大声をあげて熊を追い払うその行為が良いのか悪いのかは別として、私には次のような思い違いがありました。
 一般的に考えれば、近づいてきた熊を人間が追い払う行為は、当たり前のことと言えます。近づいてきた熊によって、人間が殺傷されるということが、私たち人間誰もが持っている常識だからです。しかし、私は、その映像を見た瞬間に、全く違う解釈・理解をしてしまいました。その熊の子供は、人慣れしていて、人間のおじさんを襲うどころか、頭をなでてもらいに人間に近づいてきたのかもしれないと考えてしまったのです。(世界の動物愛護団体からは表彰されるかもしれません。でも、熊に命を奪われてしまっては元も子もないのも事実です。)
 もしも、そんな考えの私が現場にいたら、熊に殺傷されてしまったことでしょう。戦場で、敵国の兵士と鉢合わせして、何の抵抗もなく殺されてしまうのと同じかもしれません。このように、私たちの常識は、私たち自身の自由な発想や主張を、常に制限するためにあるのです。だから、その常識でもって、私たちがいくら辛い思いをし、いくら納得がいかなくても仕方がないと思うのです。その常識を無視することは、自らの破滅や自縄自縛に結局なってしまいます。私たちが、本当に気をつけなければいけないことは、あるいは、本当に恐ろしいと思わなければいけないことは、その現場に私自身が居たとしたならばどう判断するべきなのだろうか、という想像力を欠いてしまうことだと思います。
 実を言いますと、私は、『女性』という言葉は好きではありません。『女人』という言葉のほうがしっくりときます。女性差別の『女性』という言葉のニュアンスと、女人禁制の『女人』という言葉のニュアンスは同じではありません。私が、その辺の言葉のニュアンスをどういうふうに考えているかを説明しましょう。
 『女人』という言葉に違和感があるというのならば、『女の人』と言い換えてみましょう。『女』も、男の私と同じ『人』であるという意味です。男女共学の中で得た成果と申しましょうか、これまで生きてきた私の感覚では、これからの女の人は『女性』である前に『人』であるべきだと思うのです。そんなに難しいことではありませんが、『人』として責任をしっかりと持つべきです。(当然、男も同じです。男女を問わず、頑張っている人もいらっしゃることを、私はよく知っています。)外国の状況をよく精査してください。場合によっては、男からの助力、あるいは、他者からの助力を期待できずに自己責任を負うことも少なくありません。
 つまるところ、私の心の中では、レディーファーストの考えも、男性優先の考えもありません。得るべきものは得て、失わざるを得ないものは失うしかありません。そのことに対して、覚悟や勇気を持つべきだと思います。

女人禁制って恥ずべきことなのか?

 最近、おかしな話が多いような気がします。それだけ精神障害のようなものが、私たち現代の人間の心の中に忍び込んでいるのかもしれません。当然のことですが、私は、いかなる伝統よりも、人命救助は優先すると思います。
 しかしながら、今回の日本の事件に対する、すなわち、女人禁制に対する外国マスコミの批判はひどいと思います。『世界の流れ』か何か知りませんが、国際的に、遺憾の意を表します。文化や風習の違いかもしれませんが、日本のことを誤解しています。女人禁制の本当の目的は、女性差別ではないことを明言いたします。
 確かに、日本の相撲などの伝統文化では、女性を汚れたものだとして排除するという面があると思います。しかし、それは、そのこと自身が目的ではありません。その本当の目的は、むしろ女性の生命や人権を守るためにあるのです。
 公私いかなる場所においても、男女の淫らな行為は禁じなければなりません。つまり、女人禁制の風習は、女性の自由を制限するというよりも、男性の側の自由や権利を拘束するという意味のほうが強いのです。性欲や腕力の強い男性の側に、我慢をさせて規律を守らせるためには、女性に接触させてはならない。昨今の、日本の鉄道の、女性専用車両と同じ発想なのです。女性の気持ちや生命を公の場で守るためには、男性の側にそれを強制させなければなりません。そのためのシステムが日本の伝統として、そもそも引き継がれているにすぎません。
 折しも、全世界の女性たちが、”Me, too.”を叫んでいるではありませんか!!日本でその問題がそれほど重大視されてきていない背景には、女性に対しての、男性に淫らな気持ちや行為、そして、暴力的な行為を禁じるための、こうした日本のシステムがもともと伝統としてあることも、大いに関係していると思います。
 外国の皆さんが、日本をいい国だと思うのであれば、その背景をもっと深く理解する必要があります。うわべだけ見て、「日本はいい国だ。」とか「日本は清らかなことを大切にする国だ。」とか「日本は美しい国だ。」とか言わないでください。そんな皆さんに、日本人の伝統や風習を批判する権利はありません。

操作性の向上あるいはMMIの改善(続・連立二元一次方程式への挑戦)

 前回の私のブログ記事の最後に、「今回作ったプログラムの操作性をもっとよくできるはずだ。」みたいなことを書きました。画面上のウィンドウ内で、連立二元一次方程式を表す二行の文字列
?x+?y=?
?x+?y=?
の”?”の部分に数値を入れて、『xとyを求める』ボタンを押すという操作手順を、このプログラムを利用する時に、私たち人間は何度も繰り返すことでしょう。そう考えてみると、その操作手順がなるべく簡単で、ムダなキーボード操作が少ないと、使いやすいことがわかります。私たち人間が、コンピュータプログラムと数値などの情報(データ)をやり取りするための仕組み、すなわち、マン・マシン・インターフェース(Man-Machine Interface: 今回も、以下MMIと略します。)を工夫して、それを改善することが重要だということがわかります。
 ところで、ウィンドウズでは、HTMLやVBスクリプト・Jスクリプトなどの簡易言語が標準装備されています。人によっては、そんな簡易言語など、CやJavaなどのちゃんとした言語処理システムと比較したならば、全然使い物にならないという意見の方もいらっしゃると思います。私は、その意見を否定するつもりはありません。ただ、私は、どんなコンピュータでも、それを利用するのに小さなプログラムで簡単に操作できる、そんなシステムがあると便利だと思っているだけなのです。私は、しばしば過去において、コンピュータのプログラミングが難しくて、「コンピュータ嫌い」や「コンピュータ離れ」になってしまいそうになりました。そんな窮地を救ってくれて、プログラミングを続けさせてくれたのが、ウィンドウズに標準搭載されていたそうした簡易言語だったのです。
 私も、その使いたての最初のうちは、マニュアルに書いてある通りのプログラミングをしていました。簡易言語に普通に用意されていた命令やタグやオブジェクトなどを、決まりきった普通の使い方でプログラムを組むのに使っていました。そのうちに、私自身満足がいくものを作ってみようと考えた時に、どうしても既存の材料やその標準的な使い方では作れない、という困難に突き当たりました。そこで、マニュアルを事細かく調べたり、テストプログラムを作って実際に動かしてみたりして、あれこれできないかと考えるようになりました。
 今回のプログラムにしても、”?”に数値を入れている部分を、HTMLのINPUTタグなどを使って、画面上のウィンドウ内に6個所の空欄枠付きの入力フィールドを作れば簡単です。それが、ごく普通の、いわゆる「標準的な」プログラミングです。けれども、私は、他の人がC言語で作った、画面上に多数の空欄枠付きの入力フィールドを並べたプログラムを見たことがありました。インターネットのサイトのベクターからダウンロードをしたフリーウェアのプログラムでした。それをキーボードで操作してみて、何か使いずらいなと私は思いました。別に、そのプログラムを作った人が悪いのではありませんが、標準的な入力枠付きフィールドが多数並んでいる、その画面レイアウトが何となく私には気に入りませんでした。(という私も、仕事でプログラマをやっていた20代の頃は、クライアント(顧客)や上司先輩の指示命令で、それと同じような画面レイアウトのプログラムを作っていました。)
 そこで、「標準的な」入力枠付きフィールドをいっさい使わずに、数値を入れたい”?”の画面上の位置に矢印カーソルを移動させるだけ、という今回のスタイルにしてみたわけです。そのように、数値の取り込ませ方をなるべく簡略化することによって、従来のコンピュータの使いづらさや面倒くささを少しでも改善したかったわけです。
 そのことは、”?”の箇所全部に数値を入れてから『xとyを求める』ボタンを押して、方程式の計算を開始させるという、操作の手順にも言えることでした。いっそのこと、そのボタンをなくしてしまおう、と私は次に考えました。キーボードからの打ち込みにより、”?”の箇所全部に数値が入ったそのタイミングで方程式の計算を開始すれば、マウスで毎回そのボタンを押す手間が省けます。些細なことに思われるかもしれませんが、毎回計算を始めるためにボタンを押さなくても、自動的に計算を始めてその結果を出してくれるのは、キーボードを打つ人間の利用者(ユーザ)側から考えてもお得な話です。まさに昔、電卓のCMのキャッチフレーズに使われた「答え一発。」という言葉そのままに、その便利さを実現できる仕組みと言えましょう。
 実際にコンピュータでそのプログラムを動かしてみると、画面上のウィンドウ内から”?”が全部なくなったその瞬間、あるいは数値の変更があったその瞬間に、xとyの値が求まって、その計算結果が画面に出てきました。”?”が画面上から消えてなくなった後は、キーボードからのワンキー(one key)ごとの操作で新たな数値が定まって、刻々とその計算結果も変化してゆきました。これこそが、今回私が目指した操作性の向上あるいはMMIの改善でした。それでは、今回そのように作り変えたプログラムの内容を以下に示しましょう。


連立二元一次方程式v1.50.hta

<STYLE TYPE="text/css">

  BODY  { background-color:rgb(80%,70%,70%); overflow:auto; }
  SPAN  { font-size:20pt; height:20pt; padding:4pt; margin:3pt 0pt;
          cursor:default; }
  .coef { font-size:24pt; }
  .fita { font-size:20pt; font-style:italic; }

</STYLE>

<HTA:Application Id=oHTA Scroll=no  Contextmenu=no />


<BODY scroll=No>

<SPAN CLASS=coef id=c1 >?</SPAN><SPAN CLASS=fita >x</SPAN>
<SPAN> + </SPAN>
<SPAN CLASS=coef id=c2 >?</SPAN><SPAN CLASS=fita >y</SPAN>
<SPAN> = </SPAN>
<SPAN CLASS=coef id=c0 >?</SPAN><BR>

<SPAN CLASS=coef id=c1 >?</SPAN><SPAN CLASS=fita >x</SPAN>
<SPAN> + </SPAN>
<SPAN CLASS=coef id=c2 >?</SPAN><SPAN CLASS=fita >y</SPAN>
<SPAN> = </SPAN>
<SPAN CLASS=coef id=c0 >?</SPAN><P>

<SPAN id=Mes ></SPAN>


</BODY>


<SCRIPT language="VBScript">
Option Explicit

Dim target


Call ResizeTo(400, 280)

Document.Title = "連立二元一次方程式"


Sub Document_Onmouseover

    Set target = Window.event.srcElement

    If target.classname = "coef" Then

       If target.style.color = "" Then

          target.style.color = "red"

       End If

    End If

End Sub


Sub Document_Onmouseout

    Set target = Window.event.srcElement

    If target.classname = "coef" Then

       If target.style.color = "red" Then

          target.style.color = ""

       End If

    End If

End Sub


Sub Document_OnkeyPress
    Dim tk, kc


    tk = Window.event.keyCode
    kc = Chr(tk)

    If kc = "?" Then

       Mes.InnerText = KeyinQMark() 
       Exit Sub

    End If


    If target.classname <> "coef" Then Exit Sub

    If tk = 8 Then   ' Backspace code?

       Mes.InnerText = KeyinBackspace()

    ElseIf kc = "-" Then

       Mes.InnerText = KeyinMinus()

    Else

        Mes.InnerText = KeyinNumber(kc)

    End If

End Sub


Private Function KeyinQMark()

    c1(0).InnerText = "?"
    c1(1).InnerText = "?"
    c2(0).InnerText = "?"
    c2(1).InnerText = "?"
    c0(0).InnerText = "?"
    c0(1).InnerText = "?"

    KeyinQMark = ""

End Function


Private Function KeyinBackspace()
    Dim wv

    If target.InnerText = "?" Then

       KeyinBackspace = "まず数値を入れてください。"

    Else

       wv = Abs(Eval(target.InnerText))

       If wv < 10 Then

          target.InnerText = "?"

       Else       

          target.InnerText = Cstr(wv \ 10)

       End If

       KeyinBackspace = TryAnswer()

    End If

End Function


Private Function KeyinMinus()
    Dim wv

    If target.InnerText = "?" Then

       KeyinMinus = "まず数値を入れてください。"

    Else

       wv = 0 - Eval(target.InnerText)

       If wv < 0 Then

          target.InnerText = "(" & wv & ")"

       Else

          target.InnerText = wv

       End If

       KeyinMinus = TryAnswer()

    End If

End Function


Private Function KeyinNumber(kc)
    Dim idx, wv


    idx = InStr(1, "0123456789", kc)

    If idx > 0 Then

       If target.InnerText = "?" Then

          wv = 0

       Else

          wv = Eval(target.InnerText) * 10

       End If

       target.InnerText = Cstr(wv + idx - 1)

       KeyinNumber = TryAnswer()

    Else

       KeyinNumber = "数値しか入りません。"

    End If

End Function


Private Function TryAnswer()

   If QMarkCheck() Then

      TryAnswer = ""

   Else

      TryAnswer = calcMatrix()

    End If

End Function


Private Function QMarkcheck()

    If c1(0).InnerText = "?" Or c1(1).InnerText = "?" Or _
       c2(0).InnerText = "?" Or c2(1).InnerText = "?" Or _
       c0(0).InnerText = "?" Or c0(1).InnerText = "?" Then

       QMarkcheck = True

    Else

       QMarkcheck = False

    End If

End Function


Private Function calcMatrix()
    Dim rstr, delta, elm_x, elm_y, d1(1), d2(1), d0(1)

    d1(0) = Eval(c1(0).InnerText)
    d1(1) = Eval(c1(1).InnerText)
    d2(0) = Eval(c2(0).InnerText)
    d2(1) = Eval(c2(1).InnerText)
    d0(0) = Eval(c0(0).InnerText)
    d0(1) = Eval(c0(1).InnerText)

    delta = d1(0) * d2(1) - d2(0) * d1(1)
    elm_x = d2(1) * d0(0) - d2(0) * d0(1)
    elm_y = d1(0) * d0(1) - d1(1) * d0(0)

    If delta = 0 Then

       rstr = "連立方程式ではありません。"

    Else

       rstr = "x  = " & Reduce(elm_x, delta) & " , " &_
              "y  = " & Reduce(elm_y, delta)

    End If

    calcMatrix = rstr

End Function


Private Function Reduce(child, adult)
    Dim rstr, idx, clower, alower, prefix, surfix
    Dim chsg, adsg, chpv, adpv, rsig


    If child < 0 Then

       chsg = -1
       chpv = Abs(child)

    Else

       chsg = 1
       chpv = child

    End If


    If adult < 0 Then

       adsg = -1
       adpv = Abs(adult)

    Else

       adsg = 1
       adpv = adult

    End If


    If chpv = adpv Then

       Reduce = Cstr(child \ adult)

       Exit Function

    End If


    For idx = adpv to 2 step -1

        If adpv mod idx = 0 Then

           If chpv mod idx = 0 Then

              Exit For

           End If

        End If

    Next

    clower = chpv \ idx
    alower = adpv \ idx
    rsig = chsg * adsg

    If alower = 1 Then

       rstr = Cstr(clower \ alower * rsig)

    Else

        If rsig = -1 Then

           prefix = "-("
           surfix = ")"

        Else

           prefix = ""
           surfix = ""

        End If

        rstr = prefix & clower & " / " & alower & surfix

    End If

    Reduce = rstr

End Function


</SCRIPT>


 前バージョン(連立二元一次方程式v1.00.hta)のプログラム内容と今回のバージョンを比較しますと、方程式の計算のプログラム部分は、全く変わっていません。つまり、プログラムで修正した部分は、ボタンの画面レイアウトとその処理に関わる部分だけです。『xとyを求める』ボタンが押された時に行われていた処理は、キーボードの打ちこみ毎の処理に変更しました。つまり、キーボードからの打ちこみで必要な数値が全てそろった直後に、その計算処理を開始します。そのような処理を、一つの関数(TryAnswerという関数)にまとめて、プログラム中の必要な箇所に配置しました。
 また、画面レイアウト上からは、『xとyを求める』ボタンと共に『数値のクリア』ボタンもなくしました。数値を全てクリアする場合は、”?”キーを押します。すると、画面上のウィンドウ内は、初期状態の”?”だらけの連立方程式に戻ります。この”?”キーは、いわゆる隠れキーです。『数値のクリア』ボタンはなくなりましたが、それまでの処理は”?”キーを押した場合の処理に移しました。
 もともと、それらのボタンはHTMLの標準で用意されているINPUTタグで作ったボタンでは実はありませんでした。私が、SPANタグにスタイルシートとVBスクリプトで細工をして作った『疑似ボタン(あるいは、言葉は悪いですが、フェイクなボタン)』でした。せっかく自作したのですが、今回のプログラムの操作性向上、すなわち、MMIの改善のために、お払い箱となりました。
 これで、今回のプログラムのバージョンアップは終わりとなります。ただし、欲を言えば、さらなるバージョンアップが考えられます。それはどういうものかと申しますと、小数値が打ちこめるようにプログラムを修正することです。そんなの大したことないじゃないか、と思われるかもしれません。今のプログラムでは、整数の数値が扱えるように作ってあります。それを整数値から小数値にすればよいのですが、計算結果を分数で画面に出す時に、その分母や分子が小数になって、わかりにくい複雑な数値となってしまう場合があるようです。
 それを解決する方法の一つは、次のとおりです。キーボードから打ちこまれた数値が小数であるならば、いったん分数に変換して、計算処理も分数で行うのです。もしも時間の余裕があったならば、この数式の実生活への応用範囲を広げるという意味でも、いつかそれにトライしてみたいと思っています。

連立二元一次方程式への挑戦

 いきなり『連立二元一次方程式』などと言うと、拒絶反応を起こす人も多いと思います。そんなもの、あまり興味がないとか、学生時代のイヤな数学の授業を思い出すという人も多いとは思います。なぜ、あえてそんなものに私が興味を持ったのかと申しますと、最近読んだ『行列とベクトルのはなし』(大村平著・日科技連出版社)で学んだ『行列』の考え方の一部をコンピュータプログラムにしてみようと思いついたからです。その『行列』や『ベクトル』などが、コンピュータに応用しやすいものであることを、そのプログラムを作って検証してみたいという欲求に駆られてしまいました。
 私は、高校時代に数学で『行列』や『ベクトル』を学んだのに、当時はよくわかりませんでした。その後も、大学の教養課程の数学で、『三角行列』を学んだのですが、十分に理解できませんでした。社会人になって、個人的な趣味で、数学雑誌や数学の書籍を買って読むことが多かったのですが、ほとんど理解できませんでした。私は、私自身に数学的なセンスや才能がないことにその度に気づかされました。しかし、それでもめげずに、今でもその『下手の横好き』が続いています。
 その安直な考え方の延長で、そんなに人間としての私自身がダメならば、機械であるコンピュータの力を借りて、複雑な数学の計算をやってしまおうと考えました。コンピュータのプログラミングであれば、計算間違いしても、それを直すのは簡単です。しかも、数の値を変えて、修正した処理を何度も再現できます。平たく言って、数学の問題を解くのを、それが得意なコンピュータという機械にやらせようと、あれこれプログラミングしてみようというわけです。
 思い起こせば、二十歳の頃、ポケットコンピュータのペーパーウェアの冊子に『行列』の計算をするためのBASICプログラムがいくつか載っていました。当時の私は、ゲームのプログラムには関心がありましたが、こうしたいわゆる数学モノには興味がわきませんでした。今になってみると残念なことです。あの頃の私の頭の中には、コンピュータを使って『行列』の計算をしてみようという考えが全くなかったのです。
 しかし、今回私は、そんなふうに若い頃は意識できなかったことを、あの頃とは違った意識でやってみようと思いつきました。なぜならば、今の私は、コンピュータの使い方のノウハウに関しては、あの頃とは比べ物にならないくらいよく知っているからです。
 と、その前に、私の手元の国語辞典で『連立二元一次方程式』に関連する言葉の意味を調べてみました。私の持っている国語辞典は、私が小学六年生の頃に買いました。つまり、45年くらい前に発行された古い国語辞典で、本の厚みと大きさがある卓上版でした。なので、持ち運びに不便です。けれども、文字が大きくて読みやすいため、いまだに私は利用しています。多少言葉の意味内容が古いかもしれませんが、今回の用語の説明には、あまり支障はないと思います。
 まず、『連立方程式』という言葉から調べました。それは、「二つ以上の方程式が同時になりたつことを求める方程式。」とのことです。何だ当たり前じゃないか、と思う人も多いと思います。例えば、
ax + by = c
a'x +b'y = c'
という二つの方程式があって、その未知数(元とも言います。)xとyのとりうる値がそれぞれ共通になる(例えば、x=2, y=3)ものを言います。誰だって、義務教育の数学でそれくらい勉強しているじゃないか、と思う人も多いと思います。事実、私もその一人でした。上の二つの方程式と『連立方程式』という言葉を、数学の教科書からも先生からも覚え込まされて、簡単な練習問題をやらされて答え合わせをさせられて、それで終わりでした。
 だから、子供のうちは、誰でもそのようにして獲得した知識や学力だけで十分だと思います。若者は、誰でもその程度の知識を記憶できます。そして、それは受験勉強以外には何の役にも立たないのが普通だと思います。誰も、その程度で成人して、何の不思議も問題も起こらない、と私は考えます。そんな知識を、無理やり日常生活に当てはめてみても、ムダな結果を知るのが関の山です。
 けれども、最近私は、『行列』を数学書で学び直して、プログラムでそれをコンピュータにやらせてみたところ、上の二つの方程式が連立方程式にならない場合があることを見つけてしまいました。中学の数学でそれを学んだ頃に抱いていたイメージでは、そんなことはなかったはずです。数学の先生や教科書から学んだ通り、あるいは練習問題を解いた通り、いつでも明快な答えが得られる確実な知識のはずでした。
 このことに関しては、あとでそのプログラムを示してから説明しましょう。ここでは本題に戻って、『連立方程式』周辺の言葉の意味や定義を、私の持っている国語辞典で調べることを続けてみます。そもそも、『方程式』とは、何でしょう。それは、「等式に含まれる未知数に、ある特別の数値を与える時に成立する等式。」のことだそうです。ちなみに、『等式』とは、「等号(左右双方の式が等しいことを表す=の符号)で結びつけられた二つ以上の数式」のことだそうです。その反対は、『不等式』で、「不等号(二つの数が等しくないことを示す><の符号)で結びつけられている式。」のことだそうです。また、『未知数』は、「方程式などで、まだ値の不明な数」のことで、その反対語は『既知数』で「すでに値がわかっている数」のことだそうです。
 ついでに、「二元一次方程式」についても、調べてみました。数学用語としての『元』とは、「代数方程式の未知数のこと」です。だから、xとyの二つの未知数が使われている方程式は、『二元方程式』と呼ばれます。また、数学用語としての『次』とは、未知数の乗数を表します。すなわち、一次方程式とは、一乗数の未知数からなる方程式のことです。よく中学や高校の数学で『二次方程式』というものを学びますが、二乗の未知数を持つ方程式のことです。さらに、『代数方程式』とは何かというと、「数の代わりに、aやxやnなどの文字を記号として使い、数の性質や関係を研究する数学、すなわち『代数(学)』で使われる方程式」のことです。私の持っている辞書は古いので、次のような数学用語も載っています。参考として述べておきます。『解析(学)』とは、「関数の性質を研究する、高等数学の一つ。」という意味です。また、『幾何(学)』は、「物の形・大きさ・その他空間の性質を研究する、数学の一部門のこと。」を言います。さらに、『行列』とは、「数を長方形、または、正方形に並べて、ひとまとめにしたもの。」とありました。ここまで書いてあると、意味内容の正確さよりも、表現の面白さに気をとられてしまいます。
 そもそも、「数学を専門に研究する」数学者ではない人が、数学に興味を持ってもおかしくはなかったはずです。日本の数学教育において二次関数のグラフなどで必ず学ぶことになる、あの平面上のxとyの『座標』というものを考え出したのは誰だったのかを考えてみてください。それは、あのフランスの哲学者で有名なデカルトさんでした。彼は、二つの実数によって平面上の点の位置を表すという方法、すなわち、X軸とY軸のグラフを描く『座標』という方法を発見するなどして、のちの『解析幾何学』の発展の基礎を築いたそうです。(日本の数学者の矢野健太郎さんの著作物の一つ『数学の歩み』に、そのようなことが記述されていました。)
 だいぶ前置きをしましたが、ウィンドウズのHTMLアプリケーションとして動くVBスクリプトのプログラムを以下に示しておきましょう。


連立二元一次方程式V1.00.hta

<STYLE TYPE="text/css">

  BODY  { background-color:rgb(80%,70%,70%); overflow:auto; }
  SPAN  { font-size:20pt; height:20pt; padding:4pt; margin:3pt 0pt;
          cursor:default; }
  .coef { font-size:24pt; }
  .fita { font-size:20pt; font-style:italic; }
  .wbtn { font-size:14pt; background-color:white;
          border-bottom: thin solid gray;
          border-right: thin solid gray; }

</STYLE>

<HTA:Application Id=oHTA Scroll=no  Contextmenu=no />


<BODY scroll=No>

<SPAN CLASS=coef id=c1 >?</SPAN><SPAN CLASS=fita >x</SPAN>
<SPAN> + </SPAN>
<SPAN CLASS=coef id=c2 >?</SPAN><SPAN CLASS=fita >y</SPAN>
<SPAN> = </SPAN>
<SPAN CLASS=coef id=c0 >?</SPAN><BR>

<SPAN CLASS=coef id=c1 >?</SPAN><SPAN CLASS=fita >x</SPAN>
<SPAN> + </SPAN>
<SPAN CLASS=coef id=c2 >?</SPAN><SPAN CLASS=fita >y</SPAN>
<SPAN> = </SPAN>
<SPAN CLASS=coef id=c0 >?</SPAN><BR>


<SPAN CLASS=wbtn id=Btn1 >xとyを求める</SPAN>
<SPAN>  </SPAN>
<SPAN CLASS=wbtn id=Btn2 >数値のクリア</SPAN><BR>
<SPAN id=Mes ></SPAN>

</BODY>


<SCRIPT language="VBScript">
Option Explicit

Dim target


Call ResizeTo(400, 280)

Document.Title = "連立二元一次方程式"


Sub Document_Onmouseover

    Set target = Window.event.srcElement

    If target.classname = "coef" Then

       If target.style.color = "" Then

          target.style.color = "red"

       End If

    End If

End Sub


Sub Document_Onmouseout

    Set target = Window.event.srcElement

    If target.classname = "coef" Then

       If target.style.color = "red" Then

          target.style.color = ""

       End If

    End If

End Sub


Sub Document_OnkeyPress
    Dim tk, kc


    If target.classname <> "coef" Then Exit Sub

    tk = Window.event.keyCode
    kc = Chr(tk)


    If tk = 8 Then   ' Backspace code?

       Mes.InnerText = KeyinBackspace()

    ElseIf kc = "-" Then

       Mes.InnerText = KeyinMinus()

    Else

        Mes.InnerText = KeyinNumber(kc)

    End If

End Sub


Private Function KeyinBackspace()
    Dim wv

    If target.InnerText = "?" Then

       KeyinBackspace = "まず数値を入れてください。"

    Else

       wv = Abs(Eval(target.InnerText))

       If wv < 10 Then

          target.InnerText = "?"

       Else       

          target.InnerText = Cstr(wv \ 10)

       End If

       KeyinBackspace = ""

    End If

End Function


Private Function KeyinMinus()
    Dim wv

    If target.InnerText = "?" Then

       KeyinMinus = "まず数値を入れてください。"

    Else

       wv = 0 - Eval(target.InnerText)

       If wv < 0 Then

          target.InnerText = "(" & wv & ")"

       Else

          target.InnerText = wv

       End If

       KeyinMinus = ""

    End If

End Function


Private Function KeyinNumber(kc)
    Dim idx, wv


    idx = InStr(1, "0123456789", kc)

    If idx > 0 Then

       If target.InnerText = "?" Then

          wv = 0

       Else

          wv = Eval(target.InnerText) * 10

       End If

       target.InnerText = Cstr(wv + idx - 1)

       KeyinNumber = ""

    Else

       KeyinNumber = "数値しか入りません。"

    End If

End Function


Sub Btn1_OnClick

    If QMarkcheck() Then

       Mes.InnerText = "数値に?があります。"

    Else

       Mes.InnerText = calcMatrix()

    End If

End Sub


Private Function QMarkcheck()

    If c1(0).InnerText = "?" Or c1(1).InnerText = "?" Or _
       c2(0).InnerText = "?" Or c2(1).InnerText = "?" Or _
       c0(0).InnerText = "?" Or c0(1).InnerText = "?" Then

       QMarkcheck = True

    Else

       QMarkcheck = False

    End If

End Function


Private Function calcMatrix()
    Dim rstr, delta, elm_x, elm_y, d1(1), d2(1), d0(1)

    d1(0) = Eval(c1(0).InnerText)
    d1(1) = Eval(c1(1).InnerText)
    d2(0) = Eval(c2(0).InnerText)
    d2(1) = Eval(c2(1).InnerText)
    d0(0) = Eval(c0(0).InnerText)
    d0(1) = Eval(c0(1).InnerText)

    delta = d1(0) * d2(1) - d2(0) * d1(1)
    elm_x = d2(1) * d0(0) - d2(0) * d0(1)
    elm_y = d1(0) * d0(1) - d1(1) * d0(0)

    If delta = 0 Then

       rstr = "連立方程式ではありません。"

    Else

       rstr = "x  = " & Reduce(elm_x, delta) & " , " &_
              "y  = " & Reduce(elm_y, delta)

    End If

    calcMatrix = rstr

End Function


Private Function Reduce(child, adult)
    Dim rstr, idx, clower, alower, prefix, surfix
    Dim chsg, adsg, chpv, adpv, rsig


    If child < 0 Then

       chsg = -1
       chpv = Abs(child)

    Else

       chsg = 1
       chpv = child

    End If


    If adult < 0 Then

       adsg = -1
       adpv = Abs(adult)

    Else

       adsg = 1
       adpv = adult

    End If


    If chpv = adpv Then

       Reduce = Cstr(child \ adult)

       Exit Function

    End If


    For idx = adpv to 2 step -1

        If adpv mod idx = 0 Then

           If chpv mod idx = 0 Then

              Exit For

           End If

        End If

    Next

    clower = chpv \ idx
    alower = adpv \ idx
    rsig = chsg * adsg

    If alower = 1 Then

       rstr = Cstr(clower \ alower * rsig)

    Else

        If rsig = -1 Then

           prefix = "-("
           surfix = ")"

        Else

           prefix = ""
           surfix = ""

        End If

        rstr = prefix & clower & " / " & alower & surfix

    End If

    Reduce = rstr

End Function


Sub Btn2_OnClick

    c1(0).InnerText = "?"
    c1(1).InnerText = "?"
    c2(0).InnerText = "?"
    c2(1).InnerText = "?"
    c0(0).InnerText = "?"
    c0(1).InnerText = "?"

    Mes.InnerText = ""

End Sub


</SCRIPT>


 このプログラムの操作方法は、次の通りです。マウスを操作して、画面上のカーソル矢印をウィンドウ上の”?”の位置に持っていきます。
?x+?y=?
のそれぞれの”?”の位置にカーソル矢印を持っていくと、”?”の色が黒から赤に変わります。その赤に変わった箇所に、0から9の数字をキーボードから打ちこみます。打ち込む値を間違えたならば、バックスペースキーを打って、数字を打ち直します。『数値のクリア』ボタンをマウスで押すと、打ちこんだ数値がすべて”?”に戻ります。”?”を全て数値に変えたならば、『xとyを求める』ボタンをマウスで押します。すると、ウィンドウの下の方にxとyの計算結果が整数または分数で現れます。例えば、
2x + 3y = 12
3x + 6y = 21
などと数値を打ちこんでから『xとyを求める』ボタンを押すと、
x = 3, y = 2
などと計算結果が出てきます。足し算と掛け算で検算してみると、コンピュータの出した答えが正しいことが簡単にわかります。
 あるいは、このプログラムを利用して、昔なつかしの『つるかめ算』をやってみましょう。「鶴と亀とが合わせて10匹いる。それらの足の数が総計32本である時、鶴と亀はそれぞれ何匹か。」という問題があったとします。この時、「2本足の鶴の数をx、4本足の亀の数をy」とすると、
1x + 1y = 10
2x + 4y = 32
という二つの方程式ができます。このプログラムに、画面上のウィンドウから6つの数値を打ちこみます。そして、『xとyを求める』ボタンを押すと、
x = 4, y = 6
が見事に求まります。
 実は、このプログラムの計算の仕組みは簡単です。『行列式』同士の割り算で、xとyの値がダイレクトに求まります。あとは、その割り算でできた分数の約分をできるならやって、その答えをウィンドウ画面上に出します。行列式は、足し算あるいは引き算と掛け算だけですから、基本的には四則演算の連続で、コンピュータは答えを求めることができます。それを人間がやる場合は、『つるかめ算』という算数テクニックを用いるか、あるいは、方程式の変形(加減法や代入法)によるxかyの消去法という数学テクニックを用いて、問題を解きます。以上のことから、コンピュータが問題を計算する仕組みは、人間がそれなりのテクニックを覚えて問題を解くやり方とは全く違います。だから、コンピュータと人間とでお互いのやり方を交換してやってみたら、お互いに時間と労力が余分にかかって、非能率になってしまうかもしれません。
 さて、次のような値を打ちこんで、コンピュータに計算させてみましょう。
2x + 3y = 12
4x + 6y = 24
 私たち人間は、何も気がつかないで、直観的にこの二つの方程式の答えが「x = 3, y = 2」であると出してしまいます。しかし、私の作ったコンピュータプログラムでは、途中で計算をやめて「連立方程式ではありません。」というメッセージを出します。xあるいはyを求める値は分数なのですが、その分母の側の行列式の計算が0(ゼロ)になるためです。割られる値(分子)がゼロなのは、いっこうにかまいません。けれども、割る値(分母)がゼロだと、「0で割ることはできない。」という数学のルールに違反します。上の二つの式を注意深く見ると、両辺にそれぞれ2を掛けているか否かの違いだけで、同じ方程式であることがわかります。とすると、この二元一次方程式は一つしかないのと同じになります。xとyの組み合わせの答えは、この方程式だけでは、分数の値も含めて一つに定まらないことがわかります。xとyのグラフで描くと、2本の直線がピタッと1本に重なる状態になります。
 また、次のような場合にも、「連立方程式ではありません。」というメッセージが出ます。
2x + 3y = 12
4x + 6y = 22
 今度の上下の方程式は、両辺にそれぞれ2を掛けているか否かで確かめてみると、同じものではなくて、それぞれ別の方程式のようです。しかし、例えば、上の方程式で「x = 3, y = 2」がなりたつものの、下の方程式では「x = 3, y = 2」がなりたちません。その代わりに「x = 1, y = 3」はなりたちます。が、このxとyの値の組み合わせは、上の方程式ではなりたちません。xとyのグラフで描くと、どこまで行っても平行で、交わることのない2本の直線が見られます。
 このように、連立二元一次方程式をコンピュータプログラムで計算させてみると、今まで意識することのなかった物事に気づくきっかけを与えてもらえます。言い換えると、それは、一種の『大人の数学』、すなわち、「大人になってわかる数学」のようなものです。若い頃に知識として獲得して理解していたことが貧弱であればあったほど、年老いてそれは目映(まばゆ)く感じられるものなのかもしれません。
 今回のプログラミングの計算で行列式を使ったことのメリットは、他にもありました。計算式のプログラミングが簡単であったため、そのコンピュータプログラムと値をやり取りするための仕組み、すなわち、マン・マシン・インターフェース(Man-Machine Interface: MMIと以下略します。)に注意と労力を向けることができました。HTMLやVBスクリプトでは、標準的なMMIが用意されています。しかし、あえてそれらを使わずに、自前のMMIをプログラミングしてみました。確かに、標準的なデータ入力フィールド(HTMLのINPUTタグやTEXTAREAタグ)などがありますが、画面上のウィンドウ内のレイアウトがスッキリせず、キーボードからデータを受け取った後の入力エラーチェックも面倒くさくなりそうでした。このコンピュータプログラムを少しでも操作性のある、便利に使えるものにするために、データを打ちこむ仕組みや計算結果を表す仕組みを工夫してみました。今回のプログラムの半分以上は、そのような操作性のよいMMIを実現するために組み立てられていると思います。
 しかしながら、このコンピュータプログラムは、さらにもっと操作性がよくなるような感じがしました。その辺のところを、バージョンアップして次回のブログ記事あたりで披露したいと考えています。