モロッコインゲン豆に恋!?

 私は女性に優しすぎるのかもしれません。だから、いまだに結婚ができないのかもしれません。それは、『フーテンの寅さん』の映画のようなものかもしれません。しかし、今回はガラッと視点を変えて、人間の女性以外への恋をつづってみたいと思います。

 そもそもの馴れ初めは、こうです。昨年の秋、私はパスタを鍋で茹でていました。その時に、何となく「簡単にタンパク質をとりたいな。」と思いました。そして、近くの農産物直売所で、一袋100円のモロッコインゲンを見つけたのです。その食べ物は、薄緑色のさやの中に未熟な豆がいくつも入っていました。そのさやと豆が、粘膜に優しくてヘルシーなのです。滝沢カレンさんの『美食遺産のコーナー』みたいな言い方になってしまいましたが、その時に合理的なある方法を考えつきました。

 それは何かと申しますと、パスタを鍋で茹でている最中に、爪を取ったモロッコインゲンを丸々投げ入れて、パスタと一緒に茹でてしまうという方法です。そうして茹で上がったパスタとモロッコインゲンにトマトケチャップなんかをかけて一緒にいただくというわけです。しばらく、その方法で食事を作ることに何回かハマっていました。

 今年は、春先にキュウリの苗を購入したものの、それを植える直前に、急な霜で全滅させられてしまいました。キュウリの苗を植える場所が、そのために空いてしまいました。そこで、急きょモロッコインゲンの種を買ってきて、そこで栽培することにしました。キュウリのたな、すなわち、きゅうりの栽培ネットはそのまま使えそうだし、きゅうりの栽培期間と重なるので、丁度いいと思いました。

 種を土に植えて55日以降に、小さな白い花が無数に咲いて、それから2週間くらいで、りっぱな薄緑色のさやが垂れ下がるようになりました。それらを収穫して、長さをそろえて袋に詰めて、その重さを基準に合わせて、農産物直売所に出荷しました。それを何度かやっているうちに面倒くさくなって、その出荷をやめて、自分で食べることにしました。

 ところが、今年になってパスタの値段が上がってしまったので、ご飯のおかずとして考えることとなりました。ご飯すなわちお米と一緒に炊いて作るわけにはいきません。そこで考えたのが新メニューです。ハサミなんかで切断したモロッコインゲンをカレーの具にして、モロッコインゲン・カレーを作って、ご飯にかけて食べるというものです。モロッコインゲンのさやと豆の独特の食感と味覚を引き出す、不思議なカレーライスが出来上がりました。これは、結構長期間ハマりました。最近は、市販のカレールーの扱い方が簡単になったため、レトルトカレーの手間とそれほど変わらないと、私には思われました。

 そのうち、ツルからインゲンのさやを収穫するのが面倒くさくなりました。しばらくそれを放置していました。すると、さやがしぼんで枯れてしまいました。もうこうなっては、インゲンのさやは食べられません。けれども、そのさやの中で熟した豆は収穫することができます。それを水に浸しておいて、鍋の水の中に入れて、火をつけて煮ます。後でお好みの味付けをして、煮豆として食べられます。

 モロッコインゲンは、栽培上、樹の勢いが突然弱って枯れてしまうことがありますが、それとは逆に、しばらく生(な)り続けることもあります。その意味では、大豆やその未熟な豆(枝豆)よりも、栽培しやすく、収穫しやすい作物です。枝豆などよりも、手っ取り早く食(しょく)にありつきたいと思う人は、是非モロッコインゲンを栽培して欲しいと思います。ただし、きゅうりネットのような設備があることがその前提条件の一つではありますが…。

 今回私が思い切ってそれを栽培してみたのは、畑(つまり農地)でタンパク質が作れるからです。タンパク質というと、肉や魚や鶏卵などの動物性たんぱく質を想起しますが、畑のタンパク質と呼ばれる大豆をはじめとして、豆類も本当は無視できないと思います。勿論私はベジタリアン菜食主義者)ではありません。しかし、大豆の匂いや味に拒絶反応を起こさない日本人だからこそ、腸が長くて植物性栄養素の消化吸収に長(た)けている日本人だからこそ、植物性タンパク質の消化吸収を改めて考えてみてもいいのではないかと思います。

 もう一つの理由は、自給のしやすさにあります。小規模の栽培で作るのならば、大豆よりもお得です。ツルにインゲンのさやが生(な)りだすと、しばらく収穫できて食べられます。家庭菜園のように食物の自給を目的とするのならば、枝豆(もしくは大豆)もいいけれど、インゲン豆にも挑戦してみてはいかがでしょうか。

 

千曲川氾濫のヒミツ

 先日の台風19号の影響で、長野県を流れる千曲川が氾濫し、その堤防の一部が決壊して、その地域住民の多くが甚大な被害を被りました。氾濫した千曲川が運んできた土砂が、ドロドロした泥で、しかも、それが乾くと塵灰(じんばい)となって、地元住民の日常生活に支障をきたしている、とテレビの報道でも伝えられています。

 そうしたことは、私もよく知っていました。私は、私の母の実家が松代にあって、4年に一回くらい帰省する母親に連れて行かれました。その折に、善光寺さんへお参りに行くのですが、バスや車で必ず千曲川犀川(さいがわ)を横切ります。丸い河原の石が転がって澄んだ水が流れる犀川に対して、いつも泥で茶色く濁っている水の流れの千曲川が、私は好きではありませんでした。

 五木ひろしさんの楽曲『千曲川』を聴いてもわかるように、戸倉・上山田温泉あたりの千曲川の普段の水の流れは穏やかです。けれども、ひとたび大雨が降ると、その支流のいくつかから、濁流が一気に流れ込んでて来て、いつ洪水で両岸にあふれ出してもおかしくない川へと変貌してしまいます。

 例えば、現在私の居る上田でも、この千曲川の川東(かわひがし。つまり、東岸の側)に、神川(かんがわ)という支流があって、今回の台風が通り過ぎた影響で、三日三晩、あふれんばかりの濁った泥水による濁流激流が続いていました。この神川といえば、戦国時代に真田家と徳川家が両岸に対峙したことでも有名な川です。現在その上流には、菅平のダムがあって、土砂崩れやダム決壊を防ぐために、多量の放流がされたのかもしれません。

 そもそも、『千曲川』というネーミングからして、多くの人々は疑ってかかるべきだったのかもしれません。「千(通り)に曲がる川」です。その近くに住むことは、そうそう無事で居られるわけがありません。大雨で千曲川が氾濫することは、昔から地元では周知のこと、すなわち常識の一つだったのかもしれません。

 それと同じことは、私の実家のある東京都足立区を流れる荒川と隅田川にも言えると思えます。実は、現在の一級河川であるその荒川は、以前は『荒川放水路』と呼ばれていました。大正時代の古い地図では、その荒川放水路は、人造の運河として掘削機関車により建設中でした。そして、現在の墨田川が、東京(当時は東京府)では自然に蛇行して流れていた河川で、『荒川』と当時は呼ばれていました。荒川すなわち「荒れる川」は、大雨が降る毎に氾濫して、つまりその川筋が蛇のように変化して、当時は甚大な被害を与えていました。まさに、その川の蛇行で引き起こされる水害を防ぐための治水工事が、荒川放水路だったのです。現在の地図を見ても、隅田川の東京都流域の上流には、岩渕水門という所があって、荒川放水路と交わっていることが確認できると思います。先日の台風19号の大雨で、隅田川の沿岸の『隅田公園』のベンチが水没しそうになっていましたが、もしも、岩渕水門や荒川放水路が無かったならば、それだけでは済まされなかったはずです。墨田川流域の治水管理として、もしもその水位が上がるようだったらば、その上流の水を岩渕水門の所で荒川放水路へ流す準備が常にできているのです。

 しかしながら、その荒川放水路の人工的なカーブが想定外の放水量により災いしてしまったことが過去に一度ありました。昭和30年代の伊勢湾台風あたりの大雨洪水により、私の東京の実家から南側にあった土手が決壊して床下浸水を起こしました。私の東京の実家では、一階の畳を二階にすべて退避していました。その後、土手の補強工事や強靭化のための工事が行われ今日に至りますが、新たに下水ポンプ場がそこにできたために、下水逆流の心配も起きています。自治体から公開されたハザードマップによると、そうした原因による家屋水没の可能性が指摘されているそうです。

 それはともかく、千曲川の氾濫について話を戻しましょう。私の母が10代の頃、大雨による千曲川の氾濫が松代の河川敷でありました。それはもとより、堤防の近くにも田畑があって、母の両親がそこへ観に行ったところ、堤防が決壊して農地が水没して大変なことになっていたそうです。彼らは、命かながら帰ってきて無事でした。しかし、どうにもならなかったと、つぶやいていたそうです。

 その時の母の両親の話によると、その田畑は「ねこじまの畑」と呼ばれていて、長野県では珍しく、砂地で肥えている土地でした。過去に千曲川の度々の氾濫で、山の肥沃な土砂が運ばれてきてできた場所だそうでした。昔のことだから、化学肥料も、大量の有機肥料もありません。しかし、そんなものを入れなくても、度重なる千曲川の氾濫で肥えた農地となったのだそうです。そこで米でも野菜でも果樹でも何を栽培しても、よくできた(あるいは、良く実った)そうです。

 その近辺に、松代の清野(きよの)というところが、千曲川の堤防に沿ってありますが、そこも昔から砂地で肥沃な田んぼや畑でした。しかも、河川敷ではありません。私は、4年に一回くらい母に連れられて、東京の上野駅から湯田中行きの電車に乗って、その清野の田園風景を車窓の中から見ていた記憶があります。

 千曲川が流れる長野県の北信地域は、長野オリンピック以降、多くの農地が建物や道路になってしまいました。急激な地域経済の発展のために、それは仕方がなかったことかもしれません。けれども、今回の千曲川の氾濫が、単なる自然災害や水害や治水の問題だけには、どうしても私には思えないのです。昨今の専門家さんが、ネガティブなことばかり言われているのも、私には気に入りません。昨今の議員さんたちが、土地利用のことを口にされるのならば、どうして先人の知恵や過去の歴史を学ばないのかと、私は疑わざるをえません。

 つまり、この自然災害というピンチは、私共庶民が、これまでの日常生活を見直すチャンスでもあるはずなのです。私たちの人間社会に関わることは、災害にあったら(例えば停電などを)復旧することで事足りると思います。しかし、私共が自然に関わる場合は、それだけでは足りないと思います。

 自然現象は、刻一刻と変化しているからです。地球温暖化の例を挙げると、そのことは明白です。例えば、北極の氷山が溶けることに、私たちは地球温暖化の脅威を感じます。もうこれ以上、その氷山を崩壊させてはいけない、と誰もが考えます。しかし、それを元に戻す(つまり、その氷山を復旧する)段になると、一体、何百年かかるのかは、誰にもわかりません。もし仮に地球温暖化の問題が、突然明日解決するとわかっていても、ああして崩れ去った氷山の一つでも復旧できるめどが立つのはいつになるかは、誰にもわからないと思います。自然界では、「一度壊れたものを、そっくり元通りにする」ということを考えること自体、無意味なことが多いのです。

 私は、今回の台風被災や千曲川の氾濫被災に対して、復旧だけではなくて復興を主張させていただきました。これは、絵空事で終わってしまうかもしれませんが、もしやピンチをチャンスに変えたい人が現在生きている長野県民の中に一人でもいるかもしれないと思いつつ、意見を以下に述べておきたいと思います。何かの参考になると良いかもしれません。

 まず、長芋の畑が水びだしになった地域の農家さんは、来年もう一回チャレンジしてみてはどうでしょうか。今年よりも、もっとよく栽培ができるかもしれません。総じて、千曲川の氾濫で運ばれてきた土砂あるいは泥を利用して、肥えた農地を作ることをお勧めします。何を栽培しても良いかもしれませんが、メロンなんかを栽培して大量に売りさばけたら、メロン御殿が建つかもしれません。

 私は、千曲川流域の過去の歴史に思いをはせることにしました。おそらくエジプトのナイル川流域と同じように、肥沃な土地を求めて、昔の人は千曲川流域にたどり着いたのかもしれません。川中島(昔は、『八幡原』と呼びました。)をめぐっての上杉謙信武田信玄の戦いも、ただの領地拡張争いではありませんでした。犀川千曲川に挟まれた八幡原が、肥沃な穀倉地帯であったことがもともとの原因でした。また、真田家が上田や松代を統治したのも、決して彼らの好みの問題ではなかったと思います。それだけ、その土地でよい食べ物がよく栽培できるかということが大切だったと、私には思えてなりません。

 山を切り開いて農地とするよりも、川で運ばれた土砂を利用するほうが効率的であることは言うまでもないことだと思います。そうして、その場所で農業を営む人が増えれば、農業以外の商売をする人も増えて、河川の氾濫はあっても、その川の流域に人が多く集まってきたのだと思います。これが、私が過去の歴史に想像した『スーパーシティ構想』でした。

 

私の本業 復興することをあきらめないこと

 久々に、ネットのメールを整理していたら、この『はてなブログ』からメッセージが2通くらい届いていました。いずれも、このブログ更新がここ1カ月くらい滞っていますがどうしましたか、みたいな内容のメールでした。それも、しばらく前に受信したメールでした。

 今回私がメール整理をしていたのは、台風の暴風雨で屋外の作業ができず、やむおえず家の中で避難していなければならなくなったからでした。 今年はまだ、秋の長雨が来ることがなく、来る日も来る日も日中に青く澄み渡った空を見上げて、地面の乾燥を懸念する日々が続いていました。キュウリの栽培にとって、この干ばつでツルが干からびて枯れてしまうことを毎日心配しなければなりませんでした。ところが、こういう形でこのブログ記事を書く機会がまわってくるとは思いませんでした。

 現在私の借りている田んぼでは、先週の3日間で稲刈りしたものをここ数日で、はぜかけしていました。しかし、畑のキュウリも面倒を看なければならなかったので、お米の収穫が台風が来る前に間に合わず、すっかり遅れてしまいました。

 雨は、昨日の夕方から夜にかけて、さらに今日一日降り続き、風は今夜に吹き荒れて、おそらく田んぼでも畑でも甚大な被害をもたらしたことでしょう。しかし、それを確認しに行くことはできません。身の安全を確保することが第一だからです。例えそれを見に行けたとしても、人間には何もできないということを思い知るだけです。自然の猛威の前では、誰もが無力なのです。

 数年前のこの時期に、大雨が降ってから暴風が来て、田んぼのはぜかけが全部倒されたことを思い出します。畑のビニールハウスの屋根もボロボロに破けて、どうにもなりませんでした。畑のハウスのキュウリは傷だらけで売り物にならず、葉っぱは擦り切れて修復不能でした。せめて、水びだしになった田んぼで、5日間かけて、はぜかけを修復することになりました。

 改めて述べておきますが、自然現象の前では、人間は無力です。少しでも命が助かるように行動するだけで、精一杯なのかもしれません。人間にとってできることは、そうして自然から受けた被害から立ち直ることくらいです。また面倒なことになるなあ、とは思いますが、それもまた自身の命あってのことです。

社会的腐敗と選挙の関係について

 毎度のことで農作業の人手不足で、なかなかこのブログ記事が書けませんでした。また、テレビなどのマスコミからの情報でいろいろと問題意識があったのですが、ここに書いてはいけないようなことも少なからずあって、黙っていることにしました。

 しかし、少し考えが変わりました。昨日、参議院議員通常選挙の投票所へ行って来ました。選挙の投票に行けるくらいならば、このブログ記事を書く余裕くらいはあるはずだ、と気づきました。そこでまず、その選挙の投票に行ったことをネタにして書いてみることにしました。

 誰に投票するかはあらかじめ決めていましたが、比例代表でどの党に投票しようか考えるのを忘れていました。そこで、投票する2、3秒前にエイっと直感で決めてしまいました。一番議席を取れなそうな弱小の党の名前を書いて、投票しました。ちょっと誤字があったかもしれませんから、無効票になったかもしれません。

 そんな私の行為に対して、日本国民の大部分の人たちは「せっかく投票所にまで行って、何てもったいないことをするのだ。」とか「一票の重みが感じられないじゃないか。」とか「結果が反映されない投票をするくらいならば、投票に行かなくてよかったんじゃないか。」とか「それじゃあ、投票に行かない人と結果、同じじゃないか。」と苦言を呈することでしょう。

 しかしながら、私はそうは思いませんでした。なぜならば、自らの意志で選挙の投票に行ったからです。極端な話、投票したい政党が無かったならば、比例代表で「悪党党」と記入してもよかったのです。もちろん、それは無効票になります。

 でも、無効票になる事例は他にもいくつもあります。投票した候補者が落選したり、投票した政党が議席を取れなかったすることは、何度もあります。投票した候補者が当選しても、議員になった途端に辞めてしまう、ということもありました。そんな時、「せっかくあの人に投票したのに…。」と、有権者は誰でもがそう思います。

 しかし、有権者は誰もがそのことを苦にする必要がありません。選挙には、『秘密投票』の原則があって、誰が誰に一票を入れたかは明らかにされません。選挙の結果が出ても、そこで熱くならずに涼しい顔をしていればいいのです。政治なんて、誰がやっても同じならば、誰が当選しようと、その当選者を認めようと認めまいと、それは各人の自由なのです。

 要するに、有権者にとっては、選挙で勝った負けたとか、投票結果が思い通りになったならなかったとかいうことよりも、もっと大事なことがあると思います。今回の参議院議員選挙は、日本国憲法の定める所により定期的に行われるものでした。有権者投票率が下がったということですが、その投票前にいろんな試みがなされたように、私はテレビなどからうかがっています。にもかかわらず、それほど成果が上がらなかったようです。

 私はその道の専門家ではありません。しかし、市民感情として、選挙に投票したくないという思いは理解できます。(テレビで謝罪会見する芸人さんの気持ちよりもよくわかります。)選挙に投票したって何も変わらないし、何も思い通りにはならない。政治に絡む社会問題を気にするのも面倒だ。そんなふうに、選挙に対する有権者の無力感があると思います。

 しかし、それは裏を返せば、有権者は重大な責任を負わなくていいということになります。政治家の誰かに何も期待しなくていいのです。無理して、いろんな政治家の政権公約をネットで調べることも必要ないと思います。誰を選んだらいいか迷うだけです。

 むしろ、有権者が、議員に当選すべき人物を間違えることをお勧めします。そもそも現代は、個人が個性を発揮をすることを重視しすぎます。選挙で投票することに、個性など必要ありません。誰が誰に投票したとわからないのですから、そんなに真面目に考えなくてもいいのです。

 それよりも、むしろ危険なのは、芸人的な会見で上手すぎる話をして、多くの有権者の心を動かしてしまう人物が現れてしまうことです。そういうナチスヒトラー的な人物にダマされないように、有権者は日頃から心しておく必要がありそうです。

  要するに、選挙の持つ役割を、私たち日本国民のほとんどは学校で学んでいなかったことに問題がありそうです。「選挙で国民の真意を問う」というフレーズの意味が、「現政権を継続するか否か」という意味にしか取れないことに、それはよく表わされています。例えば、急に明日から日本の政治が与党一党の独裁になったとしたら、多くの日本国民は違和感を持つと思います。それでは国民主権は名ばかりのものになってしまいます。現在の参議院のように、いろんな立場のいろんな議員や党に選挙で議席が割りふられてこそ、民主主義国家の意味があると言えましょう。与党もまた、選挙の投票によって多数の有権者の支持が明らかにされることによって、決して独裁的な政党ではないということが確かめられるというわけです。

 話変わりますが、『腐敗』という言葉について、私の所見を述べたいと思います。腐敗した社会、腐敗した政治、腐敗した芸能界、等々をこれまで言葉として私は耳にしたことがあります。一般に、この『腐敗』という言葉は「腐った」とか「堕落した」とかという意味で使われています。

 先日私は、天安門広場で昔起きた時の映像をテレビで観ました。その中で「腐敗した政府」という気になる言葉を何度も聞きました。しかし、私はその言葉に違和感がありました。文字通りの意味にとれば、中国中央政府に対して失礼な話です。そこで私は考えました。もともと民主主義というものは欧米由来のものであり、日本人も中国人も、その思想が渡ってきた時に十分消化できなかったと思われます。戦後間もない日本の学校教育で、男女の学生が手をつないでフォークダンスを踊らされて、「これが民主主義だ。」と教えられた、と私の母から聞かされたことがあります。それのどこが民主主義なのか、いまだに私は理解に苦しんでいます。

 おそらく多様性とか、「意見のバラバラなみんなが承認する」という面倒くさい作業が入るということが、民主主義なのではないか、ということに現在の私の考えは落ち着いています。そして、社会的な『腐敗』という言葉の場合、その意味が「腐った」とか「堕落した」という本来の意味ではなくて、民主主義的な立場から見た『腐敗』、すなわち、「少数の黒幕的人物に圧力をかけられていると感じられる窮屈な社会的状況」を意味していると思われます。理屈っぽくなりましたが、目上を気にして忖度(そんたく)をしたり、上司からパワハラを受けたり、といった日常よくあることです。社会的腐敗というと、何か重大な汚点のように感じられるかもしれませんが、実際はもっと日常的で軽いものです。

 例えば、私は子供の頃からずっと何十年も「腐敗した芸能界」という言葉を日常的に周りから聞かされてきました。ですから、私自身は芸能界に入って働きたいと一度も思ったことはありません。人気商売だし、一般人の目から見ると、ある程度それは仕方がないと理解もしています。だから、そこから脱却するために裏方の人のされている苦労は大変だと思います。(これは私の意見ですが、その意味では、吉本興業の岡本社長の言い分もよくわかると思います。)

 さて、選挙の話に戻りますが、「清き一票を」という言葉をよく聞きます。ここまで読んでいただいた人にはわかると思いますが、この言葉の意味も本当は多くの人々に誤解されています。一般的には、「あなたのウソ偽りのない一票で政治を変えてください。」と有権者に訴えている、というふうに理解されています。一方、私の示す新しい解釈ではこうです。「あなたが投票すること、まさにそれ自体が、あなたが民主主義に参加することなのです。そして、民主主義的にみて、日本の政治が腐敗しないことにつながるのです。」と、投票しない有権者に訴えている、とも理解できると思います。つまり、選挙の役割とは、民主主義的にみて、政治を社会的に腐敗させないことにあったのです。これが、今回私が一番言いたかった結論です。

 

バグ修正、そして、その先にあるもの

 以前『人工知能もどき開発事情』(2018年11月19日)で述べたHTMLアプリケーションのプログラム(Reversi V1.55.hta)を動かしてテストしていたら、おかしなところを発見してしまいました。いわゆるバグ(不具合)なのですが、コンピュータ側が四隅よりも辺を優先して石を打ってしまう場合がありました。当然のことながら、辺よりも四隅を優先して石を打つのが正しい動作です。
 盤上で石が打てる隅と辺がある場合、それぞれの評価値を

Const BAD =0
Const BONUS = 8
Const GOOD = 16
Const BEST = 32

という定数の設定でコントロールしていました。隅に石が打てる場合は、その評価値を(ひっくり返せる相手の石の数)+(BESTの値)にしています。それは正しかったのですが、辺に石を打てる場合に問題がありました。(ひっくり返せる相手の石の数)+(GOODの値)+(横方向の優位を表すBONUSの値)+(縦方向の優位を表すBONUSの値)をその評価値にしていたのですが、通常は、前者の場合が後者の場合よりも評価値が大きいので問題ありません。ところが、ある条件下では評価値の大きさが、前者と後者とで逆転してしまいました。つまり、隅に石が打てても、辺に石を打つことを優先してしまう場合が生じてしまいました。
 そこで、BESTの値を大きくして、32から64に修正しました。

Const BEST = 64

という変更です。珍しいことに、たった1行の修正でこの件は直りました。
 今回はさらにもう一つ、バグ(不具合)を見つけてしまいました。たまたま見つけたのですが、ゲームの終盤で、最後の1マスに白黒どちらの石も置けないケースが起きました。そこでは、白黒双方の石数を明示して終局する(ゲームを終了する)のが普通です。ところが、今回のプログラムReversi V1.55.htaでは、そのケースに限って、白黒どちらも相手に手を譲ってしまい、永遠に終局しないということが起こりました。
 言いわけがましいとは思いますが、私としては、プログラムができた時点で正常に終局するように処理を入れたつもりでした。しかし、プログラム公開後も、コンピュータと何度も対戦してテストしていました。そのうちに上手くいかないケースに遭遇して、初めてそのバグ(不具合)に気がついたのです。作ったプログラムがモジュール構造化していたために、修正箇所を一つの関数内に絞ることができました。

ゲーム終局の条件をチェックする関数(EndChecking()関数)
   A.盤上のすべてのマス目が石で埋まった。
   B.盤上の石が黒石だけ、あるいは、白石だけになった。
   C.盤上に石の置いていないマス目があっても、黒石も白石も置くことができない。

 元のプログラムでは、Cの条件で処理が複雑化していて、余計な条件文が入っていました。それを取り除いても、プログラムの正しい動作に支障がないことが、別の動作テストで確かめられました。もちろん、問題のケース(最後の1マスに白黒どちらの石も置けないケース)でも、正しく終局することができるようになりました。よって、最小限のプログラム修正で、このバグ(不具合)についても直すことができました。
 このようなバグ(不具合)修正をしながら、私には思うことがありました。以下に、そのことを述べてみましょう。コンピュータをプログラミングすることを趣味として始めて以来、私がいつも使っている方法は、いわゆるThink&Make(ティンク・アンド・メイク)という方法です。つまり、処理を思いついたら、そのままコンピュータのキーボードでプログラムを打ちこむペーパーレスな(紙を使わない)方法です。今の若い人たちにとっては、普通の方法かもしれません。
 でも、私がプログラマの仕事をしていた時は、指示書や仕様書などの文書を大量に読み書きして、その後でやっとコンピュータのキーボードでプログラムを打ちこむ(コーディングをする)作業に移るという段取りでした。当時は、コンピュータ・システム本体(ハードウェア側)が高価だったので、それと比較して安価だった紙と鉛筆と労働者(ソフトウェア側)を十二分に活用する方法がとられていました。プログラムを作るのも、修正するのも、バグ(不具合)を無くすのも、まずはすべて紙の上で作業させられました。言い換えると、プログラムの形がある程度出来上がるまで、マシン(コンピュータ・システム)に一切触(さわ)らせてもらえませんでした。コンピュータの画面をじっと見て、一瞬でも考え込んでいると、その姿を先輩に見つけられて、叱られることがしばしばありました。「マシンの前に座ってボーっと考え込んでいないで、紙の上(あるいは、机上で)でコンピュータを動かしてみろ。」などと、とんでもないことを言われて、いつも厳しく教え込まれました。
 机上デバッグといって、コンピュータの実機が動作テストで動かなくなると、そのテストをしていた先輩が「黒田ぁ、コンピュータが動かないぞぉ。」「すいません。」「謝っていないで、早く動くようにしろよ。」と、しばしば仕事上で脅されたことを思い出します。プリント専用紙に打ち出されたプログラムリストを、作業テーブルの上に広げて、紙の上でコンピュータの動きを追いかける(トレースする)地道な仕事でした。プログラムが動かない原因を、紙の上だけで読み書きして探し出すのが、この『机上デバッグ』という作業でした。紙に赤ペンなどを入れて、修正箇所を直す段になって初めて、マシン(プログラム編集用のパソコン)に触(ふ)れることが許されました。
 この「紙の上でコンピュータを動かす」という旧式な方法は、プログラムのドキュメンテーション(Documentation 文書化)という方法と結びついて、バグの修正や、プログラムを開発する上で有効な手段の一つでした。
 確かに現代のIT技術は、ペーパーレスの方向に進んでいるとは思います。その是非はともかくとして、その結果の事実として、人間が紙の上で文字を使って思考する、ということが下手になっている感じがします。今回のバグ(不具合)についても、いろんなケースを考えて、私はパソコン上でプログラミングをしたつもりだったのですが、(些細なこととはいえ)基本的なことがなおざりにされてしまった感じがします。
 プログラムのドキュメンテーション(Documentation 文書化)にしても、その手段は、作業の効率化や経費の削減という現代の流れには沿わないものなのかもしれません。しかし、プログラムが誤動作する(あるいは、思うように動かなくなる)ことへの危機管理になることに変わりはありません。プログラムが複雑化して内容がわからなくなった時に、その文書化が役立つことがしばしばあります。
 文書化というと、「俺は文章を書くのが苦手だから(できない)」と主張する理系肌の人も多かったと思います。身の丈以上のことをやろうとするから、無理だと考えてしまうわけです。一度プログラムを作ってしまえば、それに関する様々な仕様書など何の役にも立たないし不要になってしまうだろう、と考えるのは自然なことです。そんなことに労力を使うくらいならば、新たなプログラムを開発したほうが生産的で効率的と言えるじゃないか、と考えるのももっともなことです。
 でも、プログラム処理のとりうるケースが多くなったり複雑化したりすると、そのプログラムの筋道(ロジック)を整理しないといけなくなります。複雑化したプログラムが何らかの問題で動かなくなると、それを簡単に直せなくなって大変なことになります。そのような複雑化したプログラムの内容をスッキリと整理することが、それを文書化する真の目的なのです。急がば回れ、ということなのです。
 私がEndChecking()関数を修正した例で示したように、プログラムを部分的あるいは断片的に文書化してもバグ(不具合)修正には役立ちます。コンピュータのプログラムは、いつでも修正変更が多いものです。だから、作ったプログラム全てを文書化する(ドキュメントを作る)必要はないのです。
 さらに私は、新たなプログラムの変更を考えるようになりました。これまでのプログラム(Reversi V1.55.hta)では、バグとまでは言えなくても、何か使いにくい感じがしました。ゲームの盤面をじっと見ていないと、コンピュータが、知らない間に手を打ってしまうことがあるのです。どこに石を置いたか、どの石がひっくり返されたのかを人間の側が確認できません。かといって、人間が盤面に集中し続けると、スマホを見続けるのと同じで、目が疲れるしストレスがたまります。
 それにまた、ただ思考して、ただ石を置いて、ただ石をひっくり返すというシーケンス(段取り)を、そのままコンピュータにやらせることは、対戦する人間の側からみて何かそっけない感じがしました。機械的な冷たさをも感じさせます。そこで、いくつかの視覚的な効果をプログラムに入れてみました。対戦する人間の側が、いかにも『人工知能』あるいは『人工頭脳』を相手にしているかのような、そのように錯覚させるか、あるいは、それを実感できるような工夫をしてみました。それを、どのようなプログラムの仕掛けで実現したのかの、その説明は次回に譲りたいと思います。差し当たり、そうした修正変更をふくめて、バージョンアップしたプログラムを以下に付録として掲載しておきます。

今回の付録
Reversi V1.58.hta

<STYLE TYPE="text/css">

    BODY         { font-size:16pt; background-color:rgb(20%,60%,20%); scroll:no; }
    .scaleW      { font-size:16pt; font-family:"MS ゴシック"; text-align:center; }
    .scaleH      { font-size:16pt; font-family:"MS ゴシック"; text-align:left; 
                   line-height:18pt; position:relative; top:-220pt; }
    .banmen      { font-size:16pt; font-family:"MS ゴシック"; text-align:center;
                   border:1pt solid black; padding:5pt; margin:10pt 20pt;
                   cursor:default; }
    .message     { font-size:12pt; font-family:"MS ゴシック"; text-align:center;
                   padding:5pt; margin:10pt 5pt; }

    #fakebtn    { font-size:12pt; font-family:"MS ゴシック"; background-color:white;
                   border-style:outset; padding:5pt; margin:10pt 5pt;
                   cursor:default; display:none; }

</STYLE>

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


<SCRIPT language="VBScript">
Option Explicit

Randomize

Const BLACK = "●"
Const WHITE = "○"
Const BLANK = "+"
Const BAD   = 0
Const BONUS = 8
Const GOOD  = 16
Const BEST  = 64

Dim WSHShell
Set WSHShell = CreateObject("WScript.Shell")

Dim Q(7,7), R(63), vx(7), vy(7)
Dim PointJustNow, ThinkingTime, RecoveringTime, bm, wb, cp
Dim ManMove, ComMove, LargeMode, SaveMes, Selflag


Call ResizeTo(280, 390)

Document.Title = "Reversi V1.58"

Set wb = New WatchingBoardSpace
Set cp = New CornerProcessingList
Set bm = New BoardMarkingAction


Sub Window_Onload
    Dim yy, xx, idx

    ManMove = BLACK
    ComMove = WHITE
    LargeMode = False

    idx = 0

    For yy = 0 to 7

        For xx = 0 to 7

            Set R(idx) = Document.all.tags("SPAN")(idx)
            Set Q(yy, xx) = R(idx)

            idx = idx + 1
        Next
    Next

    vy(0) = -1 : vy(1) = -1 : vy(2) = -1 : vy(3) = 0 : vy(4) = 0
    vy(5) = 1  : vy(6) = 1  : vy(7) =  1

    vx(0) = -1 : vx(1) = 0 : vx(2) = 1 : vx(3) = -1 : vx(4) = 1
    vx(5) = -1 : vx(6) = 0 : vx(7) = 1

    Call InitBan()

End Sub


Sub InitBan()
    Dim idx

    For idx = 0 to 63

        R(idx).InnerText = BLANK

    Next

    P33.InnerText = WHITE
    P34.InnerText = BLACK
    P43.InnerText = BLACK
    P44.InnerText = WHITE

    PointJustNow = ""
    ThinkingTime = False
    RecoveringTime = False

    Call wb.Clear()

    fakebtn.style.display = "none"
    mouth.InnerText = "さあ、始めましょう!"
    Call SelectStones()

End Sub


Private Sub SelectStones()

   Selflag = True

   TurnB.InnerHTML = "黒番?" : BStones.InnerHTML = " それとも、"
   TurnW.InnerHTML = "白番?" : WStones.InnerHTML = ""
   TurnB.style.cursor = "help"
   TurnW.style.cursor = "help"


End Sub


Class WatchingBoardSpace
    Private List(59), Lptr

    Public Sub Clear()

        Lptr = 0

    End Sub

    Public Property Let Watch(tid)

        If Not Found(tid) Then

           List(Lptr) = tid
           Lptr = Lptr + 1

        End If

    End Property

    Private Function Found(id)
        Dim idx, rfg

        rfg = False

        For idx = 0 to Lptr - 1

            If List(idx) = id Then

               rfg = True
               Exit For

            End If

        Next

        Found = rfg

    End Function

    Public Function AnyMore()
        Dim Empties

        Empties = GetBlanks()

        If (Lptr = 0) Or (Lptr < Empties) Then

           AnyMore = True

        Else

           AnyMore = False

        End If

    End Function

    Private Function GetBlanks()
        Dim idx, cnt

        cnt = 0

        For idx = 0 to 63

            If R(idx).InnerText = BLANK Then

               cnt = cnt + 1

            End If
        Next

        GetBlanks = cnt

    End Function

End Class


'
' Event Driven Routines
'
' On mouse over, On mouse out  ---  for user interface
' On click -- for user interface and the trigger on computer thinking
' On key press -- Monotor switch on/off
'
Sub Document_Onmouseover
    Dim target

    If ThinkingTime Then Exit Sub

    Set target = Window.event.srcElement

    If Selflag Then

       If target.tagname = "SPAN" Then

          If Left(target.id, 4) = "Turn" Then

             With target.style
                  .color = "white"
                  .backgroundcolor = "rgb(10%,10%,10%)"
             End With

          End If
       End If

       Exit Sub

    End If

    If target.tagname = "SPAN" Then

       If Left(target.id, 1) = "P" Then

          If target.InnerText = BLANK Then

             wb.Watch = target.id

             If CountEnemy(target.id, ManMove, ComMove) > 0 Then

                With target.style
                     .backgroundcolor = "rgb(50%,80%,50%)"
                     .cursor = "help"
                End With

                PointJustNow = target.id

                Call wb.Clear()

             Else

                If Not wb.AnyMore() Then

                   Call bm.ClearBlink()

                   mouth.InnerText = "打てませんね ...思考中"
                   ThinkingTime = True

                   Call setTimeout("NowThinking()", 2000)

                End If

             End If

          End If
       End If
    End If

End Sub


Sub Document_Onmouseout
    Dim target

    If ThinkingTime Then Exit Sub

    Set target = Window.event.srcElement

    If Selflag Then

       If target.tagname = "SPAN" Then

          If Left(target.id, 4) = "Turn" Then

             With target.style
                  .color = "black"
                  .backgroundcolor = "rgb(20%,60%,20%)"
             End With

          End If
       End If

       Exit Sub

    End If

    If target.tagname = "SPAN" Then

       If Left(target.id, 1) = "P" Then

          If target.innerText = BLANK Then

             With target.style
                  .backgroundcolor = ""
                  .cursor = "default"
             End With

             PointJustNow = ""

          End If
       End If
    End If

End Sub


Sub Document_Onclick
    Dim target, yy, xx

    If ThinkingTime Then Exit Sub

    Set target = Window.event.srcElement

    If target.id = "" Then Exit Sub


    If Selflag Then

       If Left(target.id, 4) = "Turn" Then

          With target.style
               .color = "black"
               .backgroundcolor = "rgb(20%,60%,20%)"
          End With

          TurnB.style.cursor = "default"
          TurnW.style.cursor = "default"

          Call FixTurn(target.InnerText)

          Selflag = False

          If ComMove = BLACK Then

             mouth.InnerText = "思考中 ..."
             ThinkingTime = True

             Call setTimeout("NowThinking()", 2000)

          End If

       End If

       Exit Sub

    End If


    If Left(target.id, 1) <> "P" Then Exit Sub

    If PointJustNow <> "" Then

       Call bm.ClearBlink()

       yy = Mid(target.id, 2, 1)
       xx = Mid(target.id, 3, 1)

       Q(yy, xx).InnerText = ManMove

       With target.style
            .backgroundcolor = ""
            .cursor = "default"
       End With

       PointJustNow = ""

       Call ReverseEnemy(ManMove, yy, xx, ComMove)

       If Not EndChecking(ManMove) Then

          mouth.InnerText = "思考中 ..."
          ThinkingTime = True

          Call setTimeout("NowThinking()", 2000)

       End If

    End If

End Sub


Private Sub FixTurn(sterm)
    Dim st, dstr

    If sterm = "黒番?" Then

       st = BLACK

    ElseIf sterm = "白番?" Then

       st = WHITE

    Else

        msgbox"Illegally  selected [" & sterm & "]"

    End If

    If ManMove <> st Then

       ComMove = ManMove : ManMove = st

    End If


    TurnB.InnerText = "黒"
    TurnW.InnerText = "白"
    dstr = "(あなた)"

    If ManMove = BLACK Then

       TurnB.InnerText = TurnB.InnerText & dstr

    Else

       TurnW.InnerText = TurnW.InnerText & dstr

    End If

    BStones.innerText = " 2 個 "
    WStones.innerText = " 2 個"

End Sub


Private Sub NowThinking()

    If Not TurnToComputer() Then

       If Not EndChecking(ComMove) Then

          mouth.InnerText = "打つ手がありません。"

       End If

       ThinkingTime = False

    End If

End Sub


Public Function EndChecking(mside)
    Dim bcnt, wcnt, mes


    bcnt = CalcStones(BLACK)
    wcnt = CalcStones(WHITE)
    BStones.innerText = " " & bcnt & " 個 "
    WStones.innerText = " " & wcnt & " 個"

    If isFinish(bcnt, wcnt) Then

       If bcnt = wcnt Then

          mes = "引き分けです。"

       ElseIf bcnt > wcnt Then

          mes = "黒の勝ちです。"

       Else
       
          mes = "白の勝ちです。"

       End If
    Else

       If bcnt = 0 Then

          mes = "白の勝ちです。"
       
       ElseIf wcnt = 0 Then

          mes = "黒の勝ちです。"

       Else

          EndChecking = False
          Exit Function

       End If
    End If

    If mside = ComMove Then
       Call bm.ClearBlink()
    End If

    fakebtn.style.display = "inline"
    mouth.InnerText = mes
    EndChecking = True

End Function


Private Function isFinish(bcnt, wcnt)
    Dim flg

    If bcnt + wcnt = 64 Then

       flg = True

    Else

       If Not wb.AnyMore() Then
          flg = True
       Else
          flg = False
       End If

    End If

    isFinish = flg

End Function


Private Function CalcStones(side)
    Dim idx, cnt

    cnt = 0

    For idx = 0 to 63

        If R(idx).InnerText = side Then

           cnt = cnt + 1

        End If
    Next

    CalcStones = cnt

End Function


Sub Document_OnKeyPress()
    Dim tk, kc

    If ThinkingTime Then Exit Sub
    If RecoveringTime Then Exit Sub

    If fakebtn.style.display = "inline" Then Exit Sub

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

    RecoveringTime = True

    If kc = "l" Or kc = "L" Then

       LargeMode = Not LargeMode
       Call ChangeScale()

    Else

       RecoveringTime = False
    End If

End Sub


Private Sub ChangeScale()
    Dim mes

    If  LargeMode Then
       mes = "盤を拡大サイズにします。"
    Else
       mes = "盤を通常サイズにします。"
    End If

    SaveMes = mouth.InnerText
    mouth.InnerText = mes

    Call setTimeout("RecoverMessage2()", 2000)

End Sub


Private Sub RecoverMessage2()

    If LargeMode Then

       Call ChangeScale2(420, 600, 22, 28, 24, 4, 31, -358, 24)

    Else

       Call ChangeScale2(280, 390, 12, 16, 16, 1, 18, -220, 12)

    End If

    RecoveringTime = False

End Sub


Private Sub ChangeScale2(sx, sy, fontSiz1, fontSiz2, fontSiz3, bSiz, Lh, topos, btnSiz)
    Dim obj, idx, cnm, styp

    Call ResizeTo(sx, sy)

    For idx = 0 to document.all.length - 1

        Set obj = document.all(idx)

        If obj.tagName = "DIV" Then

           cnm = obj.className
           Set styp = obj.style

           If cnm = "message" Then

              styp.fontSize = fontSiz1 & "pt"

           ElseIf cnm = "banmen" Then

              styp.fontSize = fontSiz2 & "pt"
              styp.border = bSiz & "pt solid black"
           Else

              styp.fontSize = fontSiz3 & "pt"

              If cnm = "scaleH" Then

                 styp.lineHeight = Lh & "pt"
                 styp.position = "relative"
                 styp.top = topos & "pt"
              End If
              
           End If

        ElseIf obj.id = "fakebtn" Then

           obj.style.fontSize = btnSiz & "pt"
        Else

        End If
    Next

    mouth.InnerText = SaveMes

End Sub


'
'  Heuristic AI Thinking subroutines
'
'
Function TurnToComputer()
    Dim tId(), tCnt1(), tCnt2(), tLast

    tLast = ListingHands(ComMove, ManMove, tId, tCnt1)

    If tLast = -1 Then

       TurnToComputer = False

       Exit Function

    End If

    Call bm.BuildMarking(tId, tLast)
    Call bm.ColorMarking("rgb(80%,50%,50%)")

    Call CopyTable(tCnt1, tCnt2, tLast)

    bm.DelayPoint = EvaluateMax(tId, tCnt2, tLast)

    Call setTimeout("bm.ClearMarking()", 1000)

    TurnToComputer = True

End Function


Class BoardMarkingAction
    Private tny, tnx, svLast
    Private DelayIndex, svyy, svxx
    Private Bnkflag, BListy, BListx, BLastIdx, bflag

    Private Sub Class_Initialize
        Bnkflag = False
        BLastIdx = -1
        bflag = False
    End Sub

    Public Sub BuildMarking(tId, tLast)
        Dim idx

        DelayIndex = -1
        svLast = tLast
        ReDim tny(svLast), tnx(svLast)

        For idx = 0 to svLast
            tny(idx) = Mid(tId(idx), 2, 1)
            tnx(idx) = Mid(tId(idx), 3, 1)
        Next

    End Sub

    Public Sub ColorMarking(col)
        Dim idx, p

        For idx = 0 to svLast

            Set p = Q(tny(idx), tnx(idx))
            p.style.backgroundcolor = col
        Next
 
    End Sub

    Property Let DelayPoint(Index)

        DelayIndex = Index
        svyy = tny(DelayIndex)
        svxx = tnx(DelayIndex)

    End Property

    Public Sub ClearMarking()
        Dim idx, p

        For idx = 0 to svLast

            If idx <> DelayIndex Then

               Set p = Q(tny(idx), tnx(idx))
               p.style.backgroundcolor = ""

            End If
        Next

        If DelayIndex > -1 Then
           Call setTimeout("bm.ClearMark1()", 1000)
        End If
 
    End Sub

    Public Sub ClearMark1()

        Q(svyy, svxx).InnerText = ComMove
        Q(svyy, svxx).style.backgroundcolor = ""

        mouth.InnerText = "操作中です。"
        Call setTimeout("bm.DoReverse()", 500)

    End Sub

    Public Sub DoReverse()

        Call ReverseEnemy(ComMove, svyy, svxx, ManMove)

        Call wb.Clear()

        If Not EndChecking(ComMove) Then

           mouth.InnerText = "あなたの手番です。"
           Bnkflag = True
           Call setTimeout("bm.Blinkon()", 5000)
        End If

        ThinkingTime = False

    End Sub

    Public Sub Blinkon()

        If bnkflag Then
           Q(svyy, svxx).style.backgroundcolor = "rgb(80%,50%,50%)"
           Call setTimeout("bm.Blinkon2()", 400)
        End If

    End Sub

    Public Sub Blinkon2()
        Dim idx, yy, xx

        If bnkflag Then
           For idx = 0 to BLastIdx

               yy = BListy(idx)
               xx = BListx(idx)
               Q(yy, xx).style.backgroundcolor = "rgb(80%,50%,50%)"
           Next
           Call setTimeout("bm.Blinkoff()", 800)
        End If

    End Sub

    Public Sub Blinkoff()

        Call ClearbgColor()

        If bnkflag Then
           Call setTimeout("bm.Blinkon()", 4000)
        End If

    End Sub

    Public Sub ClearBlink()

        If Bnkflag Then
           Bnkflag = False
           Call ClearbgColor()
        End If

    End Sub

    Private Sub ClearbgColor()
        Dim idx, yy, xx

        For idx = 0 to BLastIdx

            yy = BListy(idx)
            xx = BListx(idx)
            Q(yy, xx).style.backgroundcolor = ""
        Next

        Q(svyy, svxx).style.backgroundcolor = ""

    End Sub

    Public Sub RecordReset(mside)

        If mside = ManMove Then
           bflag = False
        Else
           ReDim BListy(0)
           ReDim BListx(0)
           BLastIdx = -1
           bflag = True
        End If

    End Sub

    Public Sub Record(ay, ax)

        If bflag Then

           BLastIdx = BLastIdx + 1
           ReDim Preserve BListy(BLastIdx)
           ReDim Preserve BListx(BLastIdx)
           BListy(BLastIdx) = ay
           BListx(BLastIdx) = ax

        End If

    End Sub

End Class


Private Function ListingHands(fside, eside, tI, tC)
    Dim idx, cnt, tL

    tL = -1

    For idx = 0 to 63

        If R(idx).InnerText = BLANK Then

           cnt = CountEnemy(R(idx).id, fside, eside)

           If cnt > 0 Then

              tL = tL + 1
              ReDim Preserve tI(tL), tC(tL)

              tI(tL) = R(idx).id
              tC(tL) = cnt

            End If
        End If
    Next

    ListingHands = tL

End Function


Private Sub CopyTable(tC1, tC2, tL)
    Dim idx

    ReDim tC2(tL)

    For idx = 0 to tL

        tC2(idx) = tC1(idx)
    Next

End Sub


Function EvaluateMax(tI, tC, tL)
    Dim idx, py, px, any

    For idx = 0 to tL

        py = Mid(tI(idx), 2, 1)
        px = Mid(tI(idx), 3, 1)

        If cp.RealCorner(py, px) Then

           tC(idx) = tC(idx) + BEST

        Else

           If CornerPriority(py, px) Then

              any = OtherPriority(py, px, tC(idx))

              If tC(idx) <> any Then

                 tC(idx) = any

              End If

           Else

              tC(idx) = BAD

           End If
       End If

    Next

    EvaluateMax = GetMaxIndex(tC, tL)

End Function


Private Function GetMaxIndex(tC, tL)
    Dim idx, retidx, maxcnt, Lst(), Lsts

    maxcnt = BAD - 1

    For idx = 0 to tL

        If tC(idx) > maxcnt Then

           maxcnt = tC(idx)
           retidx = idx

        End If
    Next

    Lsts = -1

    For idx = 0 to tL

        If maxcnt = tC(idx) Then

           Lsts = Lsts + 1
           ReDim Preserve Lst(Lsts)
           Lst(Lsts) = idx

        End If
    Next

    If Lsts > 0 Then

       idx = Int(Rnd * (Lsts + 1))
       retidx = Lst(idx)

    End If

    GetMaxIndex =retidx

End Function


Private Function CornerPriority(ay, ax)
    Dim pos

    If cp.CornerTL(ay, ax) Then

       pos = 0

    ElseIf cp.CornerBL(ay, ax) Then

       pos = 1

    ElseIf cp.CornerTR(ay, ax) Then

       pos = 2

    ElseIf cp.CornerBR(ay, ax) Then

       pos = 3

    Else

       CornerPriority = True
       Exit Function

    End If

    CornerPriority = cp.AroundCorner(ay, ax, pos)

End Function


Private Function OtherPriority(ay, ax, NowCnt)
    Dim ret

    If (ay = 0) Or (ay = 7) Then

       ret = OtherEvaluation(0, ay, ax, NowCnt)

    ElseIf (ax = 0) Or (ax = 7) Then

       ret = OtherEvaluation(1, ay, ax, NowCnt)

    ElseIf ComSide(0, 0) Or ComSide(7, 7) Then

       If cp.DiagonalTLBR(ay, ax) Then

          ret = OtherEvaluation(2, ay, ax, NowCnt)

       Else

          ret = NowCnt

       End If

    ElseIf ComSide(7, 0) Or ComSide(0, 7) Then

       If cp.DiagonalBLTR(ay, ax) Then

          ret = OtherEvaluation(3, ay, ax, NowCnt)

       Else

          ret = NowCnt

       End If

    Else

       ret = NowCnt

    End If

    OtherPriority = ret

End Function


Private Function ComSide(ay, ax)

    If Q(ay, ax).InnerText = ComMove Then
       ComSide = True
    Else
       ComSide = False
    End If

End Function


Class SideStatus
    Public bfg, tfg, gfg
    Private py, px, swch, mSideCorner

    Private Sub Class_Initialize
       bfg = False
       tfg = False
       gfg = False
    End Sub

    Public Sub PositionSet(sw, ay, ax)
       swch = sw
       py = ay
       px = ax
    End Sub

    Public Sub Checking(sdt, edt, vect)
       Dim idx, it

       If swch = 2 Then py = sdt
       If swch = 3 Then py = 7 - sdt

       For idx = sdt to edt step vect

           If swch = 1 Then

              it = Q(idx, px).InnerText
           Else

              it = Q(py, idx).InnerText
           End If

           If it = BLANK Then

              bfg = True
              Exit For

           End If

           If it = ManMove Then

              tfg = True

           Else

              If idx = edt Then gfg = True

              If tfg Then tfg = False

           End If

           If swch = 2 Then py = py + vect
           If swch = 3 Then py = py - vect

       Next

    End Sub

    Public Property Get AddBonus()

       If gfg Then
          AddBonus = BONUS
       Else
          AddBonus = 0
       End If

    End Property

End Class


Private Function OtherEvaluation(sw, ay, ax, Ncnt)
    Dim o1, o2

    Set o1 = New SideStatus
    Set o2 = New SideStatus

    Call o1.PositionSet(sw, ay, ax)
    Call o2.PositionSet(sw, ay, ax)

    If sw = 1 Then

       Call o1.Checking(ay+1, 7, +1)
       Call o2.Checking(ay-1, 0, -1)

    Else

       Call o1.Checking(ax+1, 7, +1)
       Call o2.Checking(ax-1, 0, -1)

    End If

    If OtherJudgement(o1, o2) Then

       OtherEvaluation = GOOD + Ncnt + o1.AddBonus + o2.AddBonus
    Else

       OtherEvaluation = BAD
    End If

    Set o1 = Nothing
    Set o2 = Nothing

End Function


Private Function OtherJudgement(o1, o2)
    Dim rfg

    If o1.bfg And o2.bfg Then

       If Not o1.tfg And Not o2.tfg Then

          rfg = True
       Else

          rfg = False
       End If

    ElseIf o1.bfg Or o2.bfg Then

       If (Not o2.bfg And o2.tfg) Or (Not o1.bfg And o1.tfg) Then

          rfg = False
       Else

          rfg = True
       End If

    Else

       rfg = True

    End If

    OtherJudgement = rfg

End Function


Class CornerProcessingList
    Private cny, cnx
    Private scy, scx
    Private cny0, cnx0
    Private cny1, cnx1, cny2, cnx2, cny3, cnx3
    Private last
    Private dgy0, dgx0, dgy1, dgx1

    Private Sub Class_Initialize
        Dim idx

        cny = array(0, 7, 0, 7)
        cnx = array(0, 0, 7, 7)
        scy = array(1, 6, 1, 6)
        scx = array(1, 1, 6, 6)

        cny0 = array(0, 0, 1, 2)
        cnx0 = array(1, 2, 0, 0)

        last = UBound(cny0)
        ReDim cny1(last), cny2(last), cny3(last)
        ReDim cnx1(last), cnx2(last), cnx3(last)

        For idx = 0 to last

            cny1(idx) = 7 - cny0(idx)
            cnx1(idx) = cnx0(idx)
            cny2(idx) = cny0(idx)
            cnx2(idx) = 7 - cnx0(idx)
            cny3(idx) = 7 - cny0(idx)
            cnx3(idx) = 7 - cnx0(idx)
        Next    

        dgy0 = array(1, 2, 5, 6)
        dgx0 = array(1, 2, 5, 6)
        dgy1 = array(1, 2, 5, 6)
        dgx1 = array(6, 5, 2, 1)

    End Sub

    Public Function RealCorner(dy, dx)

        RealCorner = CornerCheck(dy, dx, cny, cnx)

    End Function

    Public Function CornerTL(dy, dx)

        CornerTL = CornerCheck(dy, dx, cny0, cnx0)

    End Function

    Public Function CornerBL(dy, dx)

        CornerBL = CornerCheck(dy, dx, cny1, cnx1)

    End Function

    Public Function CornerTR(dy, dx)

        CornerTR = CornerCheck(dy, dx, cny2, cnx2)

    End Function

    Public Function CornerBR(dy, dx)

        CornerBR = CornerCheck(dy, dx, cny3, cnx3)

    End Function

    Public Function DiagonalTLBR(dy, dx)

        DiagonalTLBR = CornerCheck(dy, dx, dgy0, dgx0)

    End Function

    Public Function DiagonalBLTR(dy, dx)

        DiagonalBLTR = CornerCheck(dy, dx, dgy1, dgx1)

    End Function

    Private Function CornerCheck(ay, ax, cnyy, cnxx)
        Dim rfg, idx, iy, ix

        rfg = False

        iy = CInt(ay)
        ix = CInt(ax)
        For idx = 0 to last

            If (cnyy(idx) = iy) And (cnxx(idx) = ix) Then 

               rfg = True
               Exit For
            End If
        Next

        CornerCheck = rfg

    End Function

    Public Function AroundCorner(ay, ax, Index)
        Dim rfg, what, posy, posx, alty, altx

        rfg = True
        posy = cny(Index)
        posx = cnx(Index)
        what = Q(posy, posx).InnerText

        If what = BLANK Then

           posy = scy(Index)
           posx = scx(Index)
           what = Q(posy, posx).InnerText

           If what = ManMove Then

              alty = posy + posy - ay
              altx = posx + posx - ax
              what = Q(alty, altx).InnerText

              If what = ComMove Then

                 rfg = False

              End If
           End If
        End If

        AroundCorner = rfg

    End Function

End Class


'
' Common Subroutines
'
'

Function CountEnemy(tgid, mside, yside)
    Dim cnt, yy, xx, idx, nyy, nxx, vc(7)

    yy = Mid(tgid, 2, 1)
    xx = Mid(tgid, 3, 1)

    For idx = 0 to 7

        vc(idx) = 0

        If Not OutOfRange(yy, xx, idx) Then

           nyy = yy + vy(idx)
           nxx = xx + vx(idx)

           If Q(nyy, nxx).InnerText = yside Then

              vc(idx) = FriendsExist(mside, nyy, nxx, idx)

           End If

        End If        

    Next

    cnt = 0

    For idx = 0 to 7

        cnt = cnt + vc(idx)

    Next

    CountEnemy = cnt

End Function


Function FriendsExist(mm, dy, dx, d)
    Dim y, x, ret, fr, it


    y = dy
    x = dx
    ret = 0
    fr = False

    Do 

      it = Q(y, x).InnerText

      If it = mm Then

         fr = True

      ElseIf it = BLANK then

         Exit Do

      Else

         ret = ret + 1

         If OutOfRange(y, x, d) Then

            Exit Do

         Else

            y = y + vy(d)
            x = x + vx(d)

         End If

      End If

    Loop Until it = mm


    If Not fr Then

       ret = 0

    End If

    FriendsExist = ret

End Function


Function OutOfRange(y, x, d)


    If (y = 0 And vy(d) = -1) Or (y = 7 And vy(d) = 1) Or _
       (x = 0 And vx(d) = -1) Or (x = 7 And vx(d) = 1) Then

       OutOfRange = True

    Else

       OutOfRange = False

    End If

End Function


Sub ReverseEnemy(mside, yy, xx, yside)
    Dim idx, nyy, nxx

    Call bm.RecordReset(mside)

    For idx = 0 to 7

        If Not OutOfRange(yy, xx, idx) Then

           nyy = yy + vy(idx)
           nxx = xx + vx(idx)

           If Q(nyy, nxx).InnerText = yside Then

              Call ChangeToFriends(mside, nyy, nxx, idx)

           End If

        End If        

    Next

End Sub


Sub ChangeToFriends(mm, dy, dx, d)
    Dim y, x, it, mside

    y = dy
    x = dx
    mside = False

    Do 

      it = Q(y, x).InnerText

      If it = mm Then

         mside = True

      ElseIf it = BLANK then

         Exit Do

      Else

         If OutOfRange(y, x, d) Then

            Exit Do

         Else

            y = y + vy(d)
            x = x + vx(d)

         End If

      End If

    Loop Until it = mm


    If mside Then

       Call ChangeToMySide(mm, dy, dx, d)

    End If

End Sub


Sub ChangeToMySide(mm, dy, dx, d)
    Dim y, x, it

    y = dy
    x = dx

    Do 

      it = Q(y, x).InnerText

      If it <> mm Then

         Q(y, x).InnerText = mm
         Call bm.Record(y, x)

         y = y + vy(d)
         x = x + vx(d)

      End If

    Loop Until it = mm
    Call bm.Record(y, x)

End Sub

</SCRIPT>


<BODY>

<DIV class=scaleW >a b c d e f g h</DIV>

<DIV class=banmen >

<SPAN id=P00 ></SPAN> <SPAN id=P01 ></SPAN>
<SPAN id=P02 ></SPAN> <SPAN id=P03 ></SPAN>
<SPAN id=P04 ></SPAN> <SPAN id=P05 ></SPAN>
<SPAN id=P06 ></SPAN> <SPAN id=P07 ></SPAN><BR>

<SPAN id=P10 ></SPAN> <SPAN id=P11 ></SPAN>
<SPAN id=P12 ></SPAN> <SPAN id=P13 ></SPAN>
<SPAN id=P14 ></SPAN> <SPAN id=P15 ></SPAN>
<SPAN id=P16 ></SPAN> <SPAN id=P17 ></SPAN><BR>

<SPAN id=P20 ></SPAN> <SPAN id=P21 ></SPAN>
<SPAN id=P22 ></SPAN> <SPAN id=P23 ></SPAN>
<SPAN id=P24 ></SPAN> <SPAN id=P25 ></SPAN>
<SPAN id=P26 ></SPAN> <SPAN id=P27 ></SPAN><BR>

<SPAN id=P30 ></SPAN> <SPAN id=P31 ></SPAN>
<SPAN id=P32 ></SPAN> <SPAN id=P33 ></SPAN>
<SPAN id=P34 ></SPAN> <SPAN id=P35 ></SPAN>
<SPAN id=P36 ></SPAN> <SPAN id=P37 ></SPAN><BR>

<SPAN id=P40 ></SPAN> <SPAN id=P41 ></SPAN>
<SPAN id=P42 ></SPAN> <SPAN id=P43 ></SPAN>
<SPAN id=P44 ></SPAN> <SPAN id=P45 ></SPAN>
<SPAN id=P46 ></SPAN> <SPAN id=P47 ></SPAN><BR>

<SPAN id=P50 ></SPAN> <SPAN id=P51 ></SPAN>
<SPAN id=P52 ></SPAN> <SPAN id=P53 ></SPAN>
<SPAN id=P54 ></SPAN> <SPAN id=P55 ></SPAN>
<SPAN id=P56 ></SPAN> <SPAN id=P57 ></SPAN><BR>

<SPAN id=P60 ></SPAN> <SPAN id=P61 ></SPAN>
<SPAN id=P62 ></SPAN> <SPAN id=P63 ></SPAN>
<SPAN id=P64 ></SPAN> <SPAN id=P65 ></SPAN>
<SPAN id=P66 ></SPAN> <SPAN id=P67 ></SPAN><BR>

<SPAN id=P70 ></SPAN> <SPAN id=P71 ></SPAN>
<SPAN id=P72 ></SPAN> <SPAN id=P73 ></SPAN>
<SPAN id=P74 ></SPAN> <SPAN id=P75 ></SPAN>
<SPAN id=P76 ></SPAN> <SPAN id=P77 ></SPAN>

</DIV>

<DIV Class=message >

<SPAN id=TurnB></SPAN><SPAN id=BStones></SPAN>
<SPAN id=TurnW></SPAN><SPAN id=WStones></SPAN><BR><BR>

<SPAN id=Mouth></SPAN>
<SPAN id=fakebtn OnClick="InitBan()" >最初から</SPAN>

</DIV>

<DIV class=scaleH >1<BR>2<BR>3<BR>4<BR>5<BR>6<BR>7<BR>8</DIV>

</BODY>

新元号『令和』をめぐって

 ここのところ、ネットにつながるノートパソコンのトラブルが多くて、ブログ記事を書くタイミングがつかめなくて困っていました。そのノートパソコンは、今から8年前に新品で買ったのですが、私の扱い方が乱暴だったせいか、まず、キーボードのいくつかのキーが押しても利かなくなってしまいました。そこで、他の中古パソコンのキーボードをUSB接続したところ、運よくつながりました。

 しかし、最近では、ACアダプターの接続の調子が悪くなって、とうとう変な音と煙のにおいがした後で、電源供給の役目を果たさなくなってしまいました。それでも無理をして使い続けたかったのですが、発火や爆発したら怖いと思ったので、やめました。

 そこで、またまた別の中古ノートパソコンのACアダプターを共有して使うことにしました。そのACアダプターは、トラブルのあった純正ACアダプターと出力仕様の電圧は同じ19ボルトで、電流の容量は0.5アンペアだけ大きめの、同じピンジャックの寸法と形状のものでした。最初は恐る恐る、緊急用に少しだけ使う予定でした。しかし、しばらく接続してみて、支障が無さそうだとわかって、このブログ記事を書くことにしました。(このようなマッチングは、たまたま上手く行ったと考えるべきです。普通だったならば、コンピュータの電子部品が破壊しても何の不思議もなかったのです。あくまでも、このやり方は、掟破りだということを明記しておきます。)

 それはさておき、先日の4月1日エイプリールフールに、新元号の発表がテレビでありました。その発表前のテレビ上では、今か今かと注目されていました。一方、私は仕事で行かなければならない場所があって、その発表の瞬間を観たいとは余り思っていませんでした。どうせ後でニュースを見ればいいや、くらいに思っていました。

 それで、後でニュースを観た時には、なぜだか少し意外性を感じました。『令』の字に心が引っかかったのかもしれません。ところが、その後のテレビの中で何度も「令和、令和」と聞いているうちに、2~3日でこの言葉に慣れてしまいました。恐るべき速さで、私は感化されてしまいました。マスコミ恐るべし、と言ったところでしょう。

 確かに、この『令和』という言葉、縦書きにすると末広がりに見えて、しかも語感も良いみたいです。おそらく引っかかるのは、『令』という漢字の意味だと思います。すべての違和感は、何でこの言葉が上からの達しで庶民が受け止めなければならないのか、という一点にあったと思われます。

 『令』は『命令』の『令』を表す、という主張は、ある意味間違いではないとは思います。しかし、ここにこそ、日本人の教養の有無が試されているとも言えます。私は、『広辞苑』のような分厚い辞書は持っていません。小学6年生の頃におこづかいをはたいて買った小学館の『新版 新選国語辞典 卓上版』をいまだに利用しています。その辞書によると、『令』は、『命令』という意味の文章語であり、「令する」とは「命令する」の文章語であると書かれています。ちなみに、『令月』という言葉は載っていませんでした。

 令書、令状、令達、政令、法令、勅令など、『命令』の意味を含んで、それを連想させる言葉は沢山あります。これらは、漢文上では、まさにこの意味用法に従っており、江戸時代の漢学者が『令徳』を「徳川幕府ニ命令スル」の意味に読み下しただろうことも尤(もっと)もなことと言えましょう。『令』という漢字1文字の単独の意味は、以上のとおりなのです。

 ところが、『令』という言葉が持っている日本語としての用法は、それがすべてではありません。私の持っている辞書によると、『令』という言葉のもう一つの意味用法は、「他人の家族などにつける尊敬の言い方。」なのだそうです。つまり、この言葉が接頭辞のように使われると、敬意を表す言い方になります。令嬢、令息、令夫人、令兄、令弟、令姉、令妹、令嗣、令室、令婿、令孫などなどがあります。(読み仮名を省略させていただきました。)また、令聞や令名は、「よい評判や名声」の意味だそうです。

 儒教では「巧言令色すくなし仁」とあります。それは「言葉巧みで愛想のいい人間に人格者はいない。」という意味です。その中の、『令色』が「へつらって、かざった顔つき」という意味だそうです。これは、『令』の言葉づかいの数少ない悪い例のようです。

  以上の用例は、いずれも文章語として使われているものです。『令月』ももちろんそうですが、 文書の上でしかお目にかかれないため、日本人でさえその意味用法をよく知らなかったり、他人に説明できにくかったりしているわけです。そこで、私としては、その補足説明をいろいろ考え、工夫してみることにしました。

 日本人誰もが知っていそうな言葉として、『令嬢』を例にあげてみましょう。『娘(むすめ)』という言葉を、少しばかり敬意を表す言い方にしてみると、語尾に『さん』を付けて、『娘さん』とします。同じようにして、『お嬢』を『お嬢さん』にしてみましょう。さらに、語尾を変化させて、『お嬢様』としてみます。すると、『令嬢』という文章語と同等の意味を、現代日本語口語にすると『お嬢様』になることがわかると思います。

 それでは『令月』という文章語の意味を、同様にして現代日本語口語に置き換えてみましょう。それは、『お月様』と表現できるのかもしれません。もちろん、この万葉集に詠まれた文面での『月』は、「太陽と月」などの月(moon)ではなくて、暦など日付の月(month)なので、「初春の令月」とは、「春の初めのよい時期」と解釈するほうがよいと思います。

 それでは、そもそも『令和』の意味はどうなのか、ということを考えてみたいと思います。私は、この日本に生まれて育って生活してこのかた、年号については、その意味すら深く考えたことがありませんでした。本音を言うと、年号としての『令和』がどんな意味であろうと、かまわないと思っていました。『昭和』ならば『昭和』、『平成』ならば『平成』で、周りの皆(みんな)が使うのならば、それはそれで、意味などはっきりしていなくても、別に困らないと思って生きてきました。これまで私の就いた職種が、年号で一儲けできるような類のものでなかったことも、そのことに影響していると思います。

 ところが、日本の国が、国際化するにつれて、世界各国からも いろんな解釈や憶測が生まれているようで、日本の外務省も大変だなと、テレビのニュースを観て私は思いました。『令和』の意味を英語に訳すと、”beautiful harmony”だそうです。この訳が間違っているわけでは、決してありません。けれども、疑い深い外国人の方には、この翻訳による説明では物足りないかもしれません。

 そこで、そんな外国人のあなたに、私が、尤(もっと)もらしい説明をしたいと思います。まず、ほとんどの日本人は、言葉の意味を論理的に理解していなくても、直観的かつ感覚的に理解します。言葉の語感とか、文字の形や雰囲気、思い浮かぶ情景などから、情緒的に感じとって日本語を理解しています。一方、外国人の方のほとんどは、言葉の意味に論理的なつながりがあって、その辻褄(つじつま)を合わせて理解ができます。

 典拠となる万葉集の「初春の令月にして、気淑(よ)く風和(やわら)ぎ」という情景の一節から、日本人は感覚的に『令和』の意味を理解できます。言葉の組み立て方は、『ガラパゴス携帯』を『ガラ携(けい)』と縮めて言い、『スマートホン』を『スマホ』と縮めて言うのと、ほぼ大差ないと私には思えます。しかし一方、外国人のあなたから観ると、そもそも自然と人間の心の調和や一体感がよくわからない。日本人の言いたいことは何となくわかるけれども、かと言って感覚的にわかるかと言えば、「風(かぜ)和(やわら)ぎ」とか「風(かぜ)和(なご)む」とかよくわからない、ということが問題なのだと思います。

 私としては、私流の和和翻訳をやってみたいと思います。それをもとにして、『令和』の意味を英語に訳してみましょう。まず、あの一節を、「気淑く風和む(と私にも感じられるような)初春の令月」と言葉を組み立て直してみましょう。

 実は、この『令月』や『令嬢』における『令』のような言葉づかいは、欧米語や英語にもあります。英語では、”Mr.”や”Ms.”などを敬称として付けるのが、それです。私の手元にある英和辞典(<コンパクト版> 小学館 プログレッシブ英和中辞典)によれば、地名や職業名などにも付いて、例えば”the Mr. America Contest”は『全米ボデービル大会』の意味にもなります。

 ところで、「心の和むような光景だった。」という文を英語に訳すと、”It was a heartwarming scene.”となります。気淑く風和む」という一節は自然の情景を描いていると同時に、この歌を詠む日本人の心情(あるいは、感じていること)をも表現しています。ゆえに、「心温まる」や「和む」を意味する”heartwarming”が『令和』の『和』の訳語として相応(ふさわ)しいのではないかと、私には思えました。

 『令和』の『令』が何かの敬称であるとするならば、その訳語は「良い状態」や「質の良さ」などを表す”goodness”が適切ではないかと、私は思いました。つまり、『令和』とは、”the heartwarming goodness”と英語に訳せるというのが、私の考えでした。逆にこれを日本語に直訳すれば、「心が和む良い状態」みたいな意味になります。当たらずとも遠からず、といったところだと思います。

 実は、英語への翻訳が必ずしも必要とは限らないという経験を、かつて私はしたことがありました。その時、私はJ-POPの曲の一つである、スピッツの『ロビンソン』という曲の英語カバーバージョンを作っていました。ふと、テレビを観ていたら某クイズ番組で、外国人観光客にJ-POPで好きな歌を答えてもらっているコーナーがありました。その若いアメリカ人男性は、スピッツの『ロビンソン』という曲が好きで、「ルーララ、宇宙の風になる。」と歌ってくれました。そして、その歌詞の意味を日本語でスラスラと語ってくれました。

 私は、このテレビ映像を観るまで、その歌詞の一節が外国人に理解できるとは思っていませんでした。なぜならば、宇宙は真空で風など吹くはずはないと考えていたからです。そうした一般的な科学知識に反するようなJ-POPの歌詞は、印象的なレトリックの表現なのではないかと、私は考えていました。そこで、

  Luh, La La... Full of the wind in a starry night

  (ルーララ、宇宙にいるように、星が沢山見えている夜空に、僕は沢山の風を受けている、といった意味)

という英語版の歌詞を作りました。

 ところが、その若いアメリカ人男性は、スピッツの日本語歌詞をそのまんま素直に受け入れて、何の矛盾も感じないように「宇宙の風と共に、自ら風になって飛んでいく」という情景を語ってくれました。私は、彼の日本語理解力に驚かされました。つまり、外国人向けの翻訳がなくても、彼の好きな日本文化であるJ-POPを通じて、日本語の感性を彼は理解できた、ということだと思います。

 ここで、私に提案があります。外国人の皆さんがよくご存じの日本文化であるJ-POPの源流に、いにしえに詠まれた万葉集があるということをお伝えしたいと思います。その万葉集まで勉強や研究をして欲しいとまでは申しませんが、せめてJ-POPと同じくらいに気軽に感じていただけたら良いと思います。けっして、上から下への秩序(order)ばかりを重んじるのが日本国民の気質や日本文化ではない、ということをわかって欲しいと思います。これが、今回の私の提案です。

 

大人の特撮ドラマ?

 最近、NHK総合テレビの『ドラマ10 トクサツガガガ』という連続ドラマを観ていました。若いOLの主人公が、特撮ドラマのヒーローに心酔する隠れオタクだったという物語でした。子供の頃に、彼女の母は、娘を女の子らしく育てようとして事ある毎に邪魔立てしていました。にもかかわらず、主人公の彼女は、大人の女性として働くことになっても、特撮ヒーロー好きをやめるどころか、その熱中ぶりはエスカレートする一方なのでした。
 この連続ドラマの面白いところは、特撮ドラマ仕立ての劇中劇にもありました。『救急機エマージェイソン』とか『獅風怒闘ジュウショウワン』とかいった架空の特撮ヒーローものドラマが、ドラマの途中に挿入されていました。追加戦士とか巨大ロボ合体とかヒーローショウとか、特撮ヒーローものに特徴的な要素の登場とその説明が、劇中で語られて、私には勉強になりました。テレビ朝日系列の『スーパーヒーロータイム』を観る助けにもなります。
 もともと私には6歳下の弟がいて、小中学生の頃は『仮面ライダー』を中心として様々な特撮ドラマやアニメを、弟と一緒にテレビで観ていました。(1970年代前半あたりです。)その中でも、多感な思春期初期に観た『愛の戦士 レインボーマン』(以下、『レインボーマン』と略記します。)がなかなかの傑作だと思いました。同級生の友人と遊んでいる時も、『死ね死ね団のテーマ』とか『あいつの名前はレインボーマン』とかの歌の一節や、「アノクタラサンミャクサンボダイ(と3回唱えて)、レインボー、ダッシュ、セブン」という変身の呪文(実は「アノクタラサンミャクサンボダイ」は禅宗のお経の文句)を友人からよく聞きました。
 ちなみに、その頃は、日本テレビ系の夕方前の再放送で森田健作さん(現千葉県知事)主演の『俺は男だ!』がやっていました。高校の剣道部を舞台とした、青春もののドラマでした。スポーツ根性ものとも、恋愛ものとも言い切れず、青春ものと言うのがピッタリのドラマでした。そうしたテレビドラマを、小学生から中学生にかけて成長する過程で、私や私の友人は観ていたわけです。
 ところで、『レインボーマン』についてですが、なかなかの特撮ドラマであったにもかかわらず、現在では地上波での再放送はされていません。(私は、市販VHSビデオソフトで2本(9話分)を既に持っているので、再放送は望みません。)秀作ではあったものの、日本人についての扱いが自虐的あるいは差別的だという意見があったようです。
 オンエア―当時、多感な思春期であった私がそれを見て、日本人を侮蔑しているとか差別しているとか自虐的だとか思ったことはありませんでした。(私だけでなく、私の友人たちも同じ思いだったと思います。)日本人の戦争犯罪は事実です。しかし、日本人はそれを子孫にひた隠しにしてきた、というのは外国人の思い違いです。当時12歳前後の私でさえも、戦時中子供だった親からの話や、新聞やテレビやラジオや書籍などのマスメディアや学校教育の中で、そうした歴史を断片的に学んできました。「日本人は歴史認識が無い。」などと意見するなんて、よくよく日本人を知らない外国人だな、と私は秘かに思っていました。
 ここで、日本国憲法の第9条に記された『国際平和』(an international peace)という文言について述べましょう。『国際平和』という言葉は、『世界平和』とは違います。どちらも同じ平和と思われて、混同されていますが、それにはわけがあると思います。諸説あるとは思いますが、私はその中の一つを説明したいと思います。例えば、前出の『仮面ライダー』のオープニング主題歌では、「世界の平和を守るため」というフレーズが歌われています。これは、「悪の秘密組織ショッカーが世界征服を企んでいる」というふうに劇中で説明されていることと合致します。『世界征服』とか『世界制覇』を悪の組織が狙っているので、正義のヒーローは、『世界平和』を守るものである。という道理となるのです。
 しかしながら、この『世界平和』を実現するためには、一国独裁ということがある意味で都合がよいとも考えられると思います。世界の歴史をひも解いて見ても、どの時代でも、大きな領土を支配する帝国があって、ある程度の世界的な平和を実現してきたとも言えます。近代および現代の世界がそれでいいのかというと、本当の答えはまだ出ていないと思います。
 現代の世界では、実際に戦争が起きている場所は、紛争地域と呼ばれています。また、国と国との紛争は、国際紛争(international disputes)と表現できます。従って、日本国憲法の第9条が扱っている『国際平和』(an international peace)とは、『世界平和』という茫漠とした理想ではないと思います。むしろ、現代の私たちの日常がいつ巻き込まれても不思議ではない危機と隣り合わせの平和と言えましょう。すなわち、その意味において国際平和は、「自然災害と同じ種類の危機と隣り合わせの平和」と言えるかもしれません。
 それはともかく、なぜ『レインボーマン』が日本人への侮辱や差別、自虐的ともとれるドラマの内容だったにもかかわらず、私を含む当時の子供たちにそのように感じられなかったのか、というナゾをこれから探求してみたいと思います。実は私の場合、あれから45年近く経った今でも、このドラマの自虐性とか、日本人への侮辱や差別とかが感じられません。特に、最近、隣国のK国からの慰安婦問題や徴用工問題やレーダー照射問題や竹島問題などなどを考えてみると、『レインボーマン』が特撮フィクションとして描いているものが、それらの問題に何らかの答えを用意してくれていることに気がつきました。
 それはどういうことかと申しますと、「過去に何があったとしても、(たとえ何もなかったとしても、)今の日本人を恨んだり、憎んだり、蔑(さげす)んだりする気持ちがあるかぎり、その言動は、『死ね死ね団』と同じになってしまう。その人の言動は、『死ね死ね団』の首領のミスターK(国籍不明)のように酷(ひど)いことになってしまう。」ということだと思います。(ちなみに、ウィキペディアによると、ミスターKの”K”は、原作者の川内康範さんの”K”から取ったものです。隣国のK国のみなさんとは、全く関係はありません。)
 『死ね死ね団』や『国籍不明の外国人ミスターK』について知りたい人は、ネット上で『レインボーマン』を紹介しているホームページを検索したり、YouTubeで『死ね死ね団のテーマ』や『あいつの名前はレインボーマン』や『行け!レインボーマン』(オープニング主題歌)を視聴してみてください。その芸術性の高さには、スカッとさせられると思います。日本人に対して差別的で侮蔑的なのは、『死ね死ね団』や『ミスターK』のはずなのに、その敵側の主義主張があまりに幼稚でミジメでガッカリなのが、どう見ても明らかなのです。だから、笑えてスカッとします。不幸な人間というものは、いつまでも過去にこだわっているようで、実は、現状から逃れて、現状を認めようとしない。彼らの、憎しみや恨みの正体は、結局それでしかなく、本当は、少しも同情するに値しないことがわかります。
 つまり、国と国との紛争すなわち国際紛争(international disputes)が武力的な紛争に発展しないかぎりは、外交的に何を言い合っても『国際平和』(an international peace)は保たれると考えられます。たとえその仲が険悪でなかったとしても、ウソ偽りを装って、内心ではいつか相手の寝首をかこうと狙っている、なんてことも大人の世界にはあるものです。それならば、いっそのこと、その仲が険悪でも、本心を相手にぶつけてみることは大事なのかもしれません。
 この『レインボーマン』という特撮ドラマが、本当に意図したテーマとは、日本人が外から向けられたそうした憎しみや差別感情から目をそらさず逃げない、ということにあったのかもしれません。つまり、もう少し大人になって、この特撮ドラマから明日を生きてゆく希望を読み取って欲しいという制作側からの意図があったのかもしれません。