新案デジアナ時計

 私が初めてデジタル時計に接したのは、中学一年生の頃でした。リーフ式と言って、数字の描かれた小さな板(リーフ)が、スロー回転のモーターと歯車によって1分毎にカタっとめくれる時計でした。デジタル時計とはいっても、当時のそれはLED(液晶ディスプレイ)を使っておらず、時または分を表す数字の板を、モーターと歯車が家庭の交流式電源でゆっくりと回転して、機械的に一枚一枚めくっていくアナログ的なものでした。それでも、当時は、時計といえば、丸か四角の文字盤に長針と短針が回って動くアナログ時計が一般的だったので、上の機械式デジタル時計は意外と斬新に思われていました。
 それに、それなりの趣(おもむき)があったと思います。カタカタ時計とも呼ばれ、1分経過すると、カタっと自然に音がして数字が変わります。デジタルとは言っても、その仕組みは多分にアナログ的だったのです。
 そのようなことを踏まえて、デジタル時計とアナログ時計のどちらがどれくらい優れているのかということを私は考えてみました。結局は、どちらも一長一短があると思います。デジタル時計は、数字そのものの文字情報で時刻がわかります。言わば、人間の左脳を主に刺激すると言えましょう。一方、アナログ時計は、長針と短針の組み合わせの位置と形で、時刻がわかります。その感覚的なイメージ情報が、人間の右脳を主に刺激すると言えましょう。いずれの方式の時計も時刻が瞬時にわかりますが、人間の脳への刺激が微妙に異なっているとも言えると思います。
 現在では、時刻表示のスペースがある場合は、デジタルとアナログを併用した時計がよく使われています。それが、現在のところ一番理想的な方式であるようです。例えば、日常テレビや車などで時刻以外の情報も重要な場合は、デジタル時計がよく使われます。その一方で、私たちは、お腹が空(す)いた時などに瞬時に感覚的に時刻を知りたい場合は、壁などにかかったアナログ時計を無意識に見てしまうような気がします。そうしたそれぞれの場合のために、デジタルとアナログが併用された時計があると、その時の状況に合わせて、どちらの方式の時計を見たらいいかを選べる。そういうメリットがあると思います。
 私が今回新たに考案した時計は、デジタルとアナログの融合型です。デジタルとアナログの併用型の時計は、それぞれの時計が並んだり混在したりします。それに比べて、デジタルとアナログを渾然一体(こんぜんいったい)として区別がつかないようなものにしてしまおうというのが私のアイデアなのです。
 実は、現在の私のプログラミング環境では、グラフィックス関係のプログラミングがあまり自由にできません。パソコンのハードウェア・ソフトウェア面での進歩・発展は著しく、そのモデルチェンジあるいはバージョンアップ毎に古いものが使えなくなってゆく傾向にありました。その経験を踏まえて、私は、グラフィックスのライブラリやパッケージソフトなどの新たな追加に頼りたくないと考えるようになりました。なるべくウィンドウズOSの標準システムで、プログラミングできないかと考えるようになりました。しかしながら、作成するプログラムによっては、どうしてもグラフィックス的な表現が必要になることも少なくありません。そのため、グラフィックス関係のソフトウェアの追加なしでグラフィックスっぽい表現ができないかと考えることとなりました。
 そのヒントは、アスキーアートにありました。私がそれを見たのは、かなり古く、小学生の頃に、当時のコンピュータが打ち出した年賀状の活字印刷でした。それは、戌(いぬ)年に担任の先生が送って下さった年賀状でしたが、犬の絵を文字だけの活字でプリントしていました。その先生の手書きの書面によると、電子計算機に年賀状を入れて打ち出した、とされていました。小学生の私は、当時は実際に見たことも触れたこともない『電子計算機(コンピュータ)』というものをスゴいと思いました。
 あれから時はだいぶ流れて、今日(こんにち)では、CRTや液晶ディスプレイの画面上に四角いウィンドウを作ることができます。そのウィンドウ内では、文字をどんな位置にでも表示することができます。アスキーアートのように、昔のコンピュータで紙面に順次プリントするものから、だいぶやり方が変わってきました。けれども、文字だけで、絵などのイメージを表現するという根本的な考え方は、昔も今も変わっていないと思います。
 すなわち、私は、アナログ時計の文字盤と長針と短針をすべて数字で表現することができると考えました。これが、デジタルとアナログを融合した時計、すなわち、デジアナ時計というわけです。長針は、現在の時刻の分を表す数字を並べて作ります。また、短針は、現在の時刻の時を表す数字を並べて作ります。すると、何時何分かがぱっと見て、数字でもわかるし、長針短針の位置と形でもわかる時計ができるのです。
 こうして述べていくと、大したプログラムではないことがわかると思います。よって、以下にウィンドウズOSのパソコンで動くVBスクリプトのプログラムリストを示します。(これと同じ動作をするJスクリプトもおまけに作りました。参考までに、付録プログラムリストとして追記しました。)


デジアナ時計.hta

<STYLE type="text/css">
          SPAN  {position:absolute;}
          #pnl1 {color:white; font-size:24pt;}
          #pnl2 {color:red; font-size:24pt;}
          #sbr  {font-size:18pt; color:cyan;font-weight:bold;}
          #lbr  {font-size:10pt; color:yellow;}
</STYLE>

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


<HEAD>
   <TITLE>デジアナ時計</TITLE>

<SCRIPT LANGUAGE="VBScript">
Option Explicit

Const OrgX = 168  ' 文字盤の中心(横軸方向)
Const OrgY = 170  ' 文字盤の中心(縦軸方向)
Const pnlcnt = 12 ' 文字盤の上限数字
Const lbrcnt = 8  ' 長針(分)の文字数
Const sbrcnt = 3  ' 短針(時)の文字数

Dim mode, svSig, pseudo


Sub Window_OnLoad()

    Call ResizeTo(370, 410)
    Call drawShortLongHands()
    Call drawPanel()
    Call SetInterval("drawShortLongHands", 1000)

End Sub


Sub Document_OnDblClick()

    If mode = 0 Then
       mode = 1
       Call ChangeToMono()
       Document.Title = "デジアナ時計(モノトーン版)"

    ElseIf mode = 1 Then
       Call ClearInterval()
       mode = 2
       Set pseudo = New TimeForTestClass
       svSig = pseudo.Signal()
       Document.Title = "デジアナ時計テストパターン"
       Call drawShortLongHands()
       Call SetInterval("drawShortLongHands", 100)

    Else
       Call ClearInterval()
       mode = 0
       Set pseudo = Nothing
       Document.Title = "デジアナ時計"
       Call drawShortLongHands()
       Call ChangeToColor()
       Call SetInterval("drawShortLongHands", 1000)
    End If

End Sub

Private Sub ChangeToMono()
    Dim idx

    For idx = 0 to pnlcnt - 1
        pnl2(idx).style.visibility = "hidden"
    Next

    For idx = 0 to sbrcnt - 1
        sbr(idx).style.color = "white"
    Next

    For idx = 0 to lbrcnt - 1
        lbr(idx).style.color = "white"
    Next

End Sub


Private Sub ChangeToColor()
    Dim idx

    For idx = 0 to pnlcnt - 1
        pnl2(idx).style.visibility = "visible"
    Next

    For idx = 0 to sbrcnt - 1
        sbr(idx).style.color = "cyan"
    Next

    For idx = 0 to lbrcnt - 1
        lbr(idx).style.color = "yellow"
    Next

End Sub


Sub drawShortLongHands()
    Dim nowh, nowm, add, ang, bar, badj, idx, sig

    If mode = 2 Then
       nowh = pseudo.Hour()
       nowm = Pseudo.Minute()

       sig = pseudo.Signal()
       If sig <> svSig Then
          svSig = sig
          If sig Then
             Call ChangeToColor()
          Else
             Call ChangeToMono()
          End If
       End If

    Else
       nowh = CInt(Hour(Time))
       nowm = CInt(Minute(Time))
    End If

    If nowh >= 12 Then nowh = nowh - 12

    add = nowm \ 12
    ang = nowh * 30 + 270 + add * 6
    If ang >= 360 Then ang = ang - 360

    If nowh >= 10 Then
       bar = 25
       badj = 25
    Else
       bar = 20
       badj = 20
    End If

    For idx = 0 to sbrcnt - 1

        Call  drawDigi(bar, ang, nowh, sbr, idx, 0, 0)
        bar = bar + badj
    Next

    ang = nowm * 6 + 270
    If ang >= 360 Then ang = ang - 360

    bar = 10

    For idx = 0 to lbrcnt - 1

        Call  drawDigi(bar, ang, nowm, lbr, idx, 6, 10)
        bar = bar + 16
    Next

End Sub


Sub drawPanel()
    Dim bar, ang, idx

    bar = 150
    ang = 300
    For idx = 0 to pnlcnt - 1

        Call  drawDigi(bar, ang, -1, pnl1, idx, 0, 0)
        Call  drawDigi(bar, ang, -1, pnl2, idx, -5, -5)

        ang = ang + 30
        If ang = 360 Then ang = 0

    Next

End Sub


Private Sub drawDigi(bar, ang, num, br, idx, ofsx, ofsy)
    Dim rad, x, y

    rad = Round(ang * 3.14 / 180, 2)
    x = Round(bar * Cos(rad)) + OrgX + ofsx
    y = Round(bar * Sin(rad)) + OrgY + ofsy
    br(idx).style.left = x
    br(idx).style.top = y
    If num > -1 Then
       br(idx).innerText = Cstr(num)
    End If

End Sub


Class TimeForTestClass
    Private Hcnt, Mcnt, sflag

    Private Sub Class_Initialize

        Hcnt = 0
        Mcnt = -1
        sflag = False

    End Sub

    Property Get Signal()

        If Hcnt = 0 And Mcnt = 0 Then sflag = Not sflag

        Signal = sflag

    End Property

    Property Get Hour()

        Hour = Hcnt

    End Property

    Property Get Minute()

        Mcnt = Mcnt + 1
        If Mcnt > 59 Then

           Mcnt = 0
           Hcnt = Hcnt + 1
           If Hcnt > 11 Then

              Hcnt = 0
           End If           
        End If

        Minute = Mcnt        

    End Property

End Class

</SCRIPT>

</HEAD>

<BODY  bgcolor="indigo" scroll=no>

    <SCRIPT LANGUAGE="VBScript">
        Dim idx, str

        str = ""
        For idx = 1 to pnlcnt
            str = str + "<SPAN id=pnl2>" + Cstr(idx) + "</SPAN>"
            str = str + "<SPAN id=pnl1>" + Cstr(idx) + "</SPAN>"
        Next

        For idx = 1 to lbrcnt
            str = str + "<SPAN id=lbr></SPAN>"
        Next

        For idx = 1 to sbrcnt
            str = str + "<SPAN id=sbr></SPAN>"
        Next

        Document.write(str)

    </SCRIPT>

</BODY>


 今回のプログラムは、ウィンドウの文字盤をダブルクリックすることによって、カラー表示モード・モノトーン表示モード・テストパターンモードの3つのモードに切り替えることができるようなっています。カラー表示モードでは、少しだけ凝ったデザインにしてみました。モノトーン表示モードでは、比較的シンプルな時計のデザインをねらってみました。テストパターンモードは、アナログ時計で表される時刻を短時間で全て試して、文字盤と短針・長針の数字の重なり具合をチェックできるようにしてあります。数字が重なって読みづらくなる場合がないかどうかをテストするために作りました。
 プログラムの原理的なことを言うならば、時刻を取り出す関数をプログラムの中で使っています。コンピュータ上で作る時計プログラムは、中味はデジタル時計であることが多いことがわかります。画面上でいくらアナログ時計を作っても、中味はデジタルであることは明白です。つまり、パソコン画面上のアナログ時計は、いくらアナログっぽく見えても、本質的にはデジタルなのです。この記事の冒頭で述べた、昔のデジタル時計とは、全く正反対の性質のものだということがわかります。私が新たに考案したデジアナ時計も、基本的には今のデジタル時計と同じものなのかもしれません。
 ただし、今回の時計プログラムのアナログ表現が全く意味がなかったかというと、そうでもないような気がします。というのは、文字盤に円状に配置する数字のXY座標位置や、時刻をアナログ時計の短針・長針として配置するXY座標位置を得るために、三角関数を使っています。Sin(サイン)やCos(コサイン)の関数をプログラム上で利用する良い練習例になると思います。デジタル時計とアナログ時計とを結ぶものがSinやCosの三角関数だということは、当たり前と言ってしまえばそれまでです。けれども、そんなことは中学や高校でも習ったことがなかったので、そんな私には極めて新鮮に思われました。三角関数自体は高校などで学んだ記憶はありますが、あれから40年以上も経った今になって、時計プログラムを作るのに役に立つとは思いませんでした。(ただし、一銭にもなりませんが…。)


付録プログラムリスト
デジアナ時計js.hta

<STYLE type="text/css">
          SPAN  {position:absolute;}
          #pnl1 {color:white; font-size:24pt;}
          #pnl2 {color:red; font-size:24pt;}
          #sbr  {font-size:18pt; color:cyan;font-weight:bold;}
          #lbr  {font-size:10pt; color:yellow;}
</STYLE>

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


<HEAD>
   <TITLE>デジアナ時計 Jスクリプト版</TITLE>

<SCRIPT LANGUAGE="JScript">

var mode, svSig;


var TimeForTestClass = function() {

    var Hcnt = 0;
    var Mcnt = -1;
    var sflag = false;

    this.Signal = function () {

        if(Hcnt == 0 && Mcnt == 0) sflag = !sflag;

        return sflag;
    }

    this.Hour = function () { return Hcnt; }

    this.Minute = function () {

        Mcnt += 1;
        if(Mcnt > 59) {

           Mcnt = 0;
           Hcnt += 1;
           if(Hcnt > 11) Hcnt = 0;
        }
        return Mcnt;
    }    
}

var pseudo = new TimeForTestClass();

window.onload = function () {

    resizeTo(370, 410);
    mode = 0;
    drawShortLongHands();
    drawPanel();
    setInterval("drawShortLongHands()", 1000);
}


document.ondblclick = function () {

    if(mode == 0) {

       mode = 1;
       changeToMono();
       document.title = "デジアナ時計(モノトーン版)";
    }
    else if(mode == 1) {

       clearInterval();
       mode = 2;
       svSig = pseudo.Signal();
       document.title = "デジアナ時計テストパターン";
       drawShortLongHands();
       setInterval("drawShortLongHands()", 100);
    }
    else {

       clearInterval();
       mode = 0;
       pseudo = null;
       pseudo = new TimeForTestClass();
       document.title = "デジアナ時計 Jスクリプト版";
       drawShortLongHands();
       changeToColor();
       setInterval("drawShortLongHands()", 1000);
    }
}


function changeToMono() {

    for(i=0;i<pnlcnt;i++) pnl2[i].style.visibility = "hidden";

    for(i=0;i<sbrcnt;i++) sbr[i].style.color = "white";
 
    for(i=0;i<lbrcnt;i++) lbr[i].style.color = "white";
}


function changeToColor() {

    for(i=0;i<pnlcnt;i++) pnl2[i].style.visibility = "visible";

    for(i=0;i<sbrcnt;i++) sbr[i].style.color = "cyan";
 
    for(i=0;i<lbrcnt;i++) lbr[i].style.color = "yellow";
}


var OrgX = 168    // 文字盤の中心(横軸方向)
var OrgY = 170    // 文字盤の中心(縦軸方向)
var pnlcnt = 12;  // 文字盤の上限数字
var lbrcnt = 8    // 長針(分)の文字数
var sbrcnt = 4;   // 短針(時)の文字数

function drawShortLongHands() {
    var nowh, nowm, bar, badj

    if(mode == 2) {

       nowh = pseudo.Hour();
       nowm = pseudo.Minute();
       var sig = pseudo.Signal();

       if(sig != svSig) {

          svSig = sig;
          if(sig)
             changeToColor();
          else
             changeToMono();
       }
    }
    else{

       var now = new Date();

       nowh = now.getHours();
       nowm = now.getMinutes();
    }

    if(nowh >= 12) nowh -= 12;

    var add = Math.floor(nowm / 12);
    var ang = nowh * 30 + 270 + add * 6;

    if(ang >= 360) ang -= 360;

    if(nowh >= 10) {
       bar = 25;
       badj = 25;
    }
    else {
       bar = 20;
       badj = 20;
    }

    for(i=0;i<sbrcnt;i++) {

        drawDigi(bar, ang, nowh, sbr, i, 0, 0);
        bar += badj;
    }

    ang = nowm * 6 + 270;

    if(ang >= 360) ang -= 360;

    bar = 10;

    for(i=0;i<lbrcnt;i++) {

        drawDigi(bar, ang, nowm, lbr, i, 6, 10);
        bar += 16;
    }
}


function drawPanel() {

    var bar = 150;
    var ang = 300;

    for(i=0;i<pnlcnt;i++) {

        drawDigi(bar, ang, -1, pnl1, i, 0, 0);
        drawDigi(bar, ang, -1, pnl2, i, -5, -5);

        ang += 30;
        if(ang == 360) ang = 0;
    }
}


function drawDigi(bar, ang, num, br, idx, ofsx, ofsy) {

    var rad = ang * Math.PI / 180;
    var x = bar * Math.cos(rad) + OrgX + ofsx;
    var y = bar * Math.sin(rad) + OrgY + ofsy;
    br[idx].style.left = x;
    br[idx].style.top = y;

    if(num > -1) br[idx].innerText = num;
}

</SCRIPT>

</HEAD>

<BODY  bgcolor="indigo" scroll=no>

    <SCRIPT LANGUAGE="JScript">

        var str = ""
        for(i=1;i<=pnlcnt;i++) {
            str += "<SPAN id=pnl2>" + i + "</SPAN>";
            str += "<SPAN id=pnl1>" + i + "</SPAN>";
        }

        for(i=1;i<=lbrcnt;i++) {
            str += "<SPAN id=lbr></SPAN>";
        }

        for(i=1;i<=sbrcnt;i++) {
            str += "<SPAN id=sbr></SPAN>";
        }

        document.write(str);

    </SCRIPT>

</BODY>

ずっと気がつかなかったこと

 今回は、歌か詩のタイトルみたいな言葉で始まりましたが、年末年始で私は東京の実家に戻って、部屋の押し入れで私物をあさっていました。何か掘り出し物はないかと、過去の記憶をあてにして探してみるのですが、出てくるのは使えなくなったガラクタばかりでした。部品が古くなって、故障して動くなった昔のコンピュータがいくつもありました。30年以上前に買った、いわゆる286マシンとか386マシンとか呼ばれていたパソコンや、液晶ディスプレイが近年の東京の猛暑で焼けて溶けてただれてしまったノートパソコンなどは、電源スイッチを入れてもうんともすんとも言いません。ハードディスクやBIOS半導体チップ、あるいは電源装置がダメになったらしいのですが、少しばかりの部品交換をしたとしても動きそうにないジャンク品以下のガラクタになってしまったようです。

 5インチフロッピーディスク装置も、修理のつもりで、いじくりまわしているうちに壊れてしまいました。すると、5インチフロッピーディスク200枚以上に入った、ゲームソフトやユーティリティのプログラムとデータがすべて使えなくなりました。紙に書いた物とは違って、その中味さえ見ることができなくなりました。古い物とはいえ、その喪失感には独特のものがありました。

 そのように、コンピュータという機械は、何もしなくても壊れて役に立たなくなっていくものなのです。他の古い家電と同じ運命をたどっていくのだと思いました。でも、今回私が気がついたことはそれとは別のことでした。そうした押し入れの中の遺物には、20数年ほど前に、PCパーツを秋葉原の専門店で買って組み立てた、いわゆる自作マシンもありました。その筐体を取り出して、中の部品の基盤接続をいちいちチェックして電源を入れてみました。すると、何かしら動く音がして、ケーブル接続したCRTディスプレイに横文字のメッセージが出てきました。

 ”HEARDWARE ERROR ”(ハードウェア・エラー)というメッセージが出て、F1キーかDELキーが押されるまで、画面表示が一時停止となりました。DELキーを押したらば、BIOS設定画面になったのですが、ESCキーとF1キーが利きません。もうそれ以上操作が進まないので、コンピュータ本体のリセットキーあるいは電源キーを押して、何度もやり直すのですが、同じことの繰り返しでうまくいきません。結局、つながっているキーボード装置のESCキーとF1キーと、QやAやZキーなどを押しても利かない、すなわち、そのキーボードが機械的に壊れていることを見つけました。

 キーボードのPS/2プラグにつながるピンに損傷があるみたいなので、別のUSB接続キーボードにつなぎかえてみました。その自作マシンに装着されているマザーボードには、もともとUSB端子がついていましたが、今まで使う必要が一度もありませんでした。そのマザーボードに付属していたマニュアル冊子でその取り付けられている位置を確認して、金属片の小さな隠しカバーを外して、その自作マシンの購入以来初めて使ってみました。

 それで、ESCキーやF1キーが効くようにして、電源スイッチを入れた後の操作が続くようにしました。先の場面でF1キーを押すと、SCSI機器設定ユーティリティ・プログラムが動作して、2つのハードディスクと1つのCDーRWドライブをSCSI装置として認識して、SCSI番号を自動的に割り当ててくれました。それによって、先のHEARDWARE ERROR (ハードウェア・エラー)が解消して、ウィンドウズ・ミレニアムバージョン(Windows ME)が立ち上がりました。

 そのウィンドウズ・ミレニアムバージョン(Windows ME)というのは、ウィンドウズ98の次に発売された、当時の最新バージョンのOSソフトでした。当時の私は、自作マシンのためにウィンドウズ98を購入しましたが、それをグレードアップするために、そのME版を買いました。その頃は、インターネットを利用せずにパソコンを使っていたので、パソコン雑誌の付録CDからWindows98SP2増補版などでOSのグレードアップをしていました。このウィンドウズOSのバージョンは、ウィンドウズXPとウィンドウズ98(SP2)との間のものでしたが、HTMLやHTMLアプリケーションやWSH上でVBスクリプトのプログラムを私が組み始めた頃のものでもありました。その頃は、Turbo CやDelphi(Turbo Pascalのウィンドウズ対応版)などで、趣味の小さなプログラムを作ってもいました。

 何せ今から20年ほど前に使っていたマシンです。ここ数カ月のうちに作ったプログラムなど動かないと思っていました。本当に動かないのか試してみたくなるのが人情です。前回の私のブログ記事で紹介した3つの軟着陸ゲームのスクリプトなどを含むプログラムをUSBメモリを介して、その自作マシンのハードディスクにコピーしてみました。

 その結果としてわかったことは、機械語マシン語)レベルのプログラム(いわゆる拡張子.exeのアプリケーション実行プログラム)は、自作マシンのCPUがPentium2であったり、周辺装置のバス接続がSCSIである理由から、正しく動作しませんでした。何らかのエラーメッセージが出て、そこで強制異常終了してしまいました。一方、時計やカレンダーのスクリプトは、それなりに動作したものの、日付と時刻が不正確でした。これは、自作マシンの内蔵電池が切れているために、日付と時刻の設定が記憶できないためでした。そして、例の軟着陸ゲームの3つのスクリプト(VBスクリプト、Javaスクリプト、Jスクリプト)を動作させてみました。それぞれ拡張子.htaファイルは、その先頭一行目に”<HTML />”と、おまじないを付けるだけで、どれも正常に動作しました。つまり、最近ウィンドウズ・マシンで作ったスクリプト・プログラムが、20年余り昔に動いていた自作マシンとウィンドウズOSでも正しく動くことが確かめられたということなのです。VBスクリプトだけでなく、Javaスクリプトも、そして、日本語の混じったJスクリプトさえも、20年前の自作マシンで普通に動いていました。

 オセロゲーム型の人工知能自作プログラム(Reversi1.58.hta)も、その古い自作マシン上で何も問題なく動きました。VBスクリプトで比較的大きなプログラムでしたが、古いマシン上で普通にプレイができました。

 ここで、ふと私は気がつきました。プログラムという言葉には、語源的に見ると「前もって書かれたもの」という意味があるそうです。テレビやラジオの番組プログラム欄を見ても、コンピュータでプログラムが動作するのがいつなのかを考えてみても、わかると思います。いずれも、プログラムを組んだ後だとわかるはずです。つまり、私たち人間は、プログラムが役立つ前に、それを組んでいる(あるいは、作っている)というわけなのです。未来にそれが役立つために、プログラムを組んでいるというわけです。

 しかし、今回の私の場合は、未来ではなくて過去に対してプログラムを役立てた感じがしました。いつ壊れても不思議ではない、古い部品と技術で組み立てられた自作マシンで、つい最近作ったプログラムを動くか試してみて、動いた。ということです。タラレバになってしまいますが、もしも20年前の私に、現在の私の技術的なスキルがあったとしたならば、今回動作できたプログラムを20年前にすでに作れていたはずです。事実、そのためのコンピュータのハードウェア環境は、すでに用意されていました。現在、その自作マシンが正常に動作していることが、そのことを裏付けていると思いました。

 そのようなことに私が20年もの長い間に一度も気がつかなかったことは、さしずめ『空白の20年間』だったと言ってもよいかもしれません。悪く言えば、そうなります。けれども、それも人生経験の一つと見ることもできると思います。そう言えば、去年たまたま『遺留捜査』という刑事ドラマシリーズの再放送をテレビで録画していて、そのエンディングで流れる小田和正さんの『小さな風景』という歌の一節を知りました。

きっと僕は きみの心の 小さな風景に気づかなかったんだ

という、小田和正さんの歌詞がとても印象に残りました。今回の私の場合、その『小さな風景』は、古い自作マシンがCRTディスプレイに映し出たプログラムの正常に動く姿のことだったのだと思いました。

  

Jスクリプトの使い勝手を学ぶ

 Jスクリプトは、標準的な装備のウィンドウズ搭載のパソコン(ウィンドウズ・マシン)上で動作するプログラムを組むための簡易言語の一つです。マイクロソフト社が、ネットスケイプ社との共同提案に基づいて、JavaやC言語やC++に近い言語仕様のものを作ったものです。それらの言語を習得している人(プログラマ)が習得しやすいというメリットを兼ね備えています。こと細かくはここでは説明いたしませんが、ネット上の情報によると、これまでのVisual BASIC(VB)あるいはVBスクリプトをもとにして、このJスクリプトが開発されたとも言われています。
 また、ウィンドウズ・スクリプティング・ホスト(WSH)の開発によって、インターネット・エクスプローラ(IE)によるネット上での使用から切り離されても、プログラミング言語として使えるようになりました。つまり、JスクリプトもVBスクリプトも、インターネットと接続していないウィンドウズ・マシン上で、プログラムとして組んで動作するということなのです。しかも、HTMLアプリケーション(HTA)のスクリプト・タグにそれらを組み込めば、比較的簡単に自前のウィンドウが作れて、自由に操作ができます。
 こうしたマイクロソフト社のコンピュータ・ソフトウェア開発(あるいは、その商品としての開発)には、ノウハウとして学ぶべきことが沢山あります。その背景には、マイクロソフト社独自のソフトウェア技術があって、ウィンドウズOSおよびその関連ソフトウェアを影から支えていると言えましょう。その詳細については割愛させていただきますが、そのことをざっくり知っておいていただければ十分だと思います。
 ところで、以前私はブログ記事において、軟着陸ゲームのVBスクリプトを掲載しました。どういうプログラムだったかを示すために、それを少し手直ししたものを今回のブログ記事の巻末付録として記述しておきます。さらに、それをJスクリプトに直すと、以下のようになります。

軟着陸ゲームClassicjs.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.mess    {font-size:14pt; text-align:center;}
  INPUT.kinbox {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.btnbox {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="kinbox" type="text" name="keyin" size=5> 
<INPUT CLASS="btnbox" type="button" name="user" value="押す"><BR>
<BR>
<DIV CLASS=mess id=param></DIV>

</BODY>

<SCRIPT LANGUAGE = JavaScript>
//--------------------------------------------------------------
//
//                                           by Kuroda Kunio
//
//   『軟着陸ゲーム』
//
//--------------------------------------------------------------

  var grav = 5;         /* 重力 m/(s*s) */
  var hei, vec, fue;

window.onload = function() {

  resizeTo(260, 260);
  keyin.value = 5; /* 使用燃料の初期値 */
  hei = 500; /* 高度の初期値 */
  vec = -50; /* 速度の初期値 */
  fue = 120; /* 燃料の初期値 */
  meterdisplay();
  message("降下開始!", 'black'); /* 状況の初期設定 */
}


user.onclick = function() {

  if(param[3].style.color != 'black') {

     param[3].style.color = 'black';
     window.onload();
     return;
  }

  var csmfue = Math.round(keyin.value);

  if(csmfue > fue || csmfue < 0) { /* 消費燃料の入力補正 */
     csmfue = 0;
  }

  // 燃料・高度・速度の更新

  fue -= csmfue;
  hei += vec + Math.round((csmfue - grav) / 2);
  vec += (csmfue - grav);
  meterdisplay();

  if(hei <= 0) {
     if(Math.abs(hei) < 5 && Math.abs(vec) < 5) {

        message("着陸成功!!", 'blue');
     }
     else{
        message("着陸失敗。さようなら。", 'red');
     }
  }
  else{
     message("降下中", 'black');
  }
}


function meterdisplay() {

   param[0].innerText = hei;
   param[1].innerText = vec;
   param[2].innerText = fue;
}


function message(mes, col) {

   param[3].innerText = mes;
   param[3].style.color = col;
}

</SCRIPT>

 確かにこれは、JavaやC言語を習得している人にとって、使いやすい道具の一つと言えます。しかも、私のウィンドウズ・マシンは中古で、ウィンドウズ8のものと、ウィンドウズ7が標準搭載のものが2台あるのですが、どちらでも普通に動作します。Javaのソースプログラムは通常UnicodeUTF-8文字コードでテキスト保存するようですが、私のマシンではメモ帳(notepad.exe)でANSI文字コードでテキスト保存して、ファイル拡張子を.txtから.jsまたは.htaに変えています。ANSI文字コードで.jsファイル拡張子のJスクリプトは、ウィンドウズ・スクリプティング・ホスト(WSH)によって、また、.htaファイル拡張子のJスクリプトを含むテキストファイルは、HTMLアプリケーション・ホストによって動作します。
 しかし、ここまでの説明でしたら、通常の簡易言語の紹介とそれほど変わらないと思います。何らかのプラスアルファ(+α)が無い限り、ブログ記事などに私は書きません。実は、はてなダイアリー(現在のはてなブログ)の10年前の古い記事に『JavaScriptで日本語プログラミング言語を作る -あと味』というtaijiさんの記述がありました。その記事によりますと、「JavaScriptは、予約語以外は全部日本語でできる。」とのことでした。だいぶ昔からその記事が私には気になっていました。けれども、Javaスクリプト自体を公私共に使う機会がありませんでした。ただ、Javaスクリプトを活用したら日本語でコンピュータを動かせるかもしれないと、あやふやなアイデアだけを持っていました。
 そしてまた、はてな匿名ダイアリーでは「プログラム日本語で書ければいい気がするけど」といった書き込みも見られました。ネット上を見回しても、日本語の記述によってコンピュータが動作するプログラミング言語がいくつも見つかります。要するに、これまで学んできたコンピュータのプログラミングがどれも英文と数式の混合体で、私たち日本人は引け目を感じてきた、ということなのだと思います。
 さらに、ネット上を見回してみますと、2009年6月8日のとある投稿型情報ブログで近藤誠さんという人が『日本語スクリプトJapaScript』という記事を書かれていました。これは、コンパイラなどで使われている解析プログラム(parser:パーサ)を一切使わずに、日本語のみで記述したプログラムをJavaScriptと同じテキストファイル上で実行させるものでした。その実用性よりも、そのアイデアとかJavaの使い勝手の良さに私は魅(ひ)かれました。
 そういえば、今から30年以上も昔、私はUNIXとC言語を扱う仕事をしていました。UNIXやC言語が流行る以前のコンピュータ・ソフトウェア技術は、ある意味、頭打ちになっていました。その生産性にも限界が見え始めていました。ところが、UNIXとC言語は、その最初の開発者が『使い勝手の良いシステム』を目指したために、これまでとは全く違う設計思想の、発展性と生産性のあるコンピュータシステムが作られることとなりました。そして、それはマイクロコンピュータの分野で、マイクロソフト社のMS-DOSやウィンドウズなどに引き継がれたのだ、と私は思います。
 おそらく、その『使い勝手の良さ』こそが今日(こんにち)のコンピュータの最大の利点になっていることに気づいていない人が多いと思います。コンピュータという機械は、生まれつき使い勝手の良いもので、人間の手を離れて急激に進化するものだと考えている人が多いと思います。昨今のAIの活躍を見ても、そもそもコンピュータは『使い勝手の良い』ものだ、と多くの人たちが当たり前のことのように思っていることでしょう。しかし、この『使い勝手の良さ』は、誰か人間が考えついて機械にやらせているだけだということを見抜いている人は少ないと思います。ちなみに、UNIXとC言語の最初の開発者は、手持ちのコンピュータシステムでスター・トレックStar Trek)のゲームをやりたいという一心でシステムとプログラムを開発したと伝えられています。
 ところで、日本語プログラミング言語について、私は以前ブログ記事で言及したように、その有用性に期待しながらも、やや否定的な意見も持っていました。つまり、日本語の記述でコンピュータという機械が動くことに魅力がある反面、次のいくつかの点で足踏みしてしまうことを否めないからです。

 1. 3つの基本的な制御構造(逐次、分岐、反復)および、それらの組み合わせを日本語の文脈で表現するのが難しい。
 2. プログラムの生産性が向上するような日本語表現が要求される。
 3. 可読性が良くなってバグがみつけやすい日本語表現が要求される。

 そもそも日本語にしても英語にしても、人間が日常使っている言語は自然言語と呼ばれています。コンピュータが理解できる機械語やそれに変換できるプログラミング言語とは別物です。ということは、今日現存する日本語プログラミング言語は、すべて日本語で記述できても、後者であることが(当たり前だけれども)わかると思います。
 そこで、私はあるアイデアを思いつきました。『漢字かな混じり文』です。漢字は(当て字はともかく)表意文字として使われることが多く、かな文字は表音文字として使われます。表音文字表意文字を混ぜこぜにして使う言語というのは、世界的にも珍しいと思いますし、一長一短はあると思います。が、私の構想は、漢字とかな文字と英単語と数式・記号をわざと組み合わせて、疑似言語にしてしまうことです。英単語や数式・記号は、主に予約語演算子に使います。漢字やかな文字は、関数名や変数名やオブジェクト名などの識別子(identifier)に使います。そうやって、日本語ですべて記述するプログラミングをあきらめて、疑似言語風にプログラミングしてみたものが、以下のJスクリプトです。何の追加装備もせず、標準のウィンドウズ8やウィンドウズ7のシステム上で作ってあります。今さらながら、Jスクリプトの使い勝手の良さに感心させられます。

軟着陸ゲームClassicjsv.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.一言    {font-size:14pt; text-align:center;}
  INPUT.入力枠 {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.ボタン {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="入力枠" type="text" name="使用燃料" size=5> 
<INPUT CLASS="ボタン" type="button" name="押しボタン" value="押す"><BR>
<BR>
<DIV CLASS=一言 id=表示></DIV>

</BODY>

<SCRIPT LANGUAGE = JScript>
//--------------------------------------------------------------
//
//                                           by Kuroda Kunio
//
//   『軟着陸ゲーム』
//
//--------------------------------------------------------------

  var 重力 = 5;         /* 重力 m/(s*s) */
  var 高度, 速度, 燃料;
  var 窓の大きさ = resizeTo;

window.onload = function() {

  窓の大きさ(260, 260);
  使用燃料.value = 5; /* 使用燃料の初期値 */
  高度 = 500; /* 高度の初期値 */
  速度 = -50; /* 速度の初期値 */
  燃料 = 120; /* 燃料の初期値 */
  メーターを表示する();
  メッセージ("降下開始!", 'black'); /* 状況の初期設定 */
}


押しボタン.onclick = function() {

  if(表示[3].style.color != 'black') {

     表示[3].style.color = 'black';
     window.onload();
     return;
  }

  var 消費燃料 = Math.round(使用燃料.value);

  if(消費燃料 > 燃料 || 消費燃料 < 0) { /* 消費燃料の入力補正 */
     消費燃料 = 0;
  }

  // 燃料・高度・速度の更新

  燃料 -= 消費燃料;
  高度 += 速度 + Math.round((消費燃料 - 重力) / 2);
  速度 += (消費燃料 - 重力);
  メーターを表示する();

  if(高度 <= 0) {
     if(Math.abs(高度) < 5 && Math.abs(速度) < 5) {

        メッセージ("着陸成功!!", 'blue');
     }
     else{
        メッセージ("着陸失敗。さようなら。", 'red');
     }
  }
  else{
     メッセージ("降下中", 'black');
  }
}


function メーターを表示する() {

   表示[0].innerText = 高度;
   表示[1].innerText = 速度;
   表示[2].innerText = 燃料;
}


function メッセージ(文句, 色) {

   表示[3].innerText = 文句;
   表示[3].style.color = 色;
}

</SCRIPT>

 余談ですが、ここに及んで一つ気づいたことがあります。Jスクリプトの頭文字『J』の意味は、これまではJavaの『J』のみでした。しかし、上記スクリプトのように、日本語(Japanese)の『J』もかけた二重の意味の『J』(つまり、Java-Japanese)を表す疑似言語プログラミングと見ることもできると思います。なお、このようなプログラミング指向は、あくまでも趣味的なお奨めであって、決して強制でも義務でもありませんから、なにとぞ悪しからず。

巻末付録
軟着陸ゲームClassic.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.meter   {font-size:14pt; text-align:center;}
  INPUT.kinbox {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.btnbox {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="kinbox" type="text" name="keyin" size=5> 
<INPUT CLASS="btnbox" type="button" name="Use" value="押す"><BR>
<BR>
<DIV CLASS=meter id=param></DIV>

</BODY>


<SCRIPT LANGUAGE = VBScript>
'//--------------------------------------------------------------
'//
'//                                           by Kuroda Kunio
'//
'//   『軟着陸ゲーム』
'//
'//--------------------------------------------------------------
Option Explicit

  Const Grav = 5 '重力 m/(s*s)
  Dim Hei, Vec, Fue

Call ResizeTo(260, 260)

Sub Window_onLoad()
  keyin.value = 5 '使用燃料の初期値
  Hei = 500 '高度の初期値
  Vec = -50 '速度の初期値
  Fue = 120 '燃料の初期値
  Call MeterDisplay()
  Call Message("降下開始!", "black") '状況の初期設定
End Sub


Sub Use_OnClick()
  Dim CsmFue

  If Param(3).style.color <> "black" Then
     Param(3).style.color = "black"
     Call Window_onLoad()
     Exit Sub
  End If

  CsmFue = CInt(keyin.value)

  If CsmFue > Fue Or CsmFue < 0 Then '消費燃料の入力補正
     CsmFue = 0
  End If

  '燃料・高度・速度の更新
  Fue = Fue - CsmFue
  Hei = Hei + Vec + Round((CsmFue - Grav) / 2)
  Vec = Vec + (CsmFue - Grav)
  Call MeterDisplay()

  If Hei <= 0 Then
     If Abs(Hei) < 5 And Abs(Vec) < 5 Then
        Call Message("着陸成功!!", "blue")
     Else
        Call Message("着陸失敗。さようなら。", "red")
     End If
  Else
     Call Message("降下中", "black")
  End If
End Sub


Sub MeterDisplay()
  param(0).InnerText = Hei
  param(1).InnerText = Vec
  param(2).InnerText = Fue
End Sub


Sub Message(mes, col)
  param(3).InnerText = mes
  param(3).style.color = col
End Sub

</SCRIPT>

予期せぬ異国の訪問者

 今から10年近く前の話になります。その日、私は、地元のJAから借りている畑で、地元の農家さんから借りた耕うん機でもって土を起こす作業をしていました。すると、いきなり30代くらいの二人の男性がやってきました。彼らは韓国人を自称し、一人は韓国の某テレビ放送局の記者さんで、もう一人は通訳兼カメラマンだと自己紹介してきました。私がここで就農しているという情報をどこからか入手してきたらしいのですが、よくわかりませんでした。取材をさせてくれませんか、とその場で申し込まれました。

 私がそれに承諾すると、カメラマンの人がピストルの形をしたものを取り出しました。「銃のような形をしていますが、銃口にレンズの付いた最新型のビデオカメラです。これで撮影します。」との説明がありました。かつて私は、衛星放送で韓国の流行歌手が、ピストルの形のマイクロホンを持って歌唱しているのを観たことがありました。その手の類(たぐい)かなと思いました。

 そういえば、その数カ月前に私は地元のNHKテレビのニュースに出ていました。悪いことや事件を起こしてテレビのニュースに出たのであれば大事(おおごと)ですが、そうではありません。その時は、私と、私がお世話になっている地元の農家さんが、NHK長野の記者さんとカメラマンさんから取材を受けていました。その模様が、テレビのローカルニュースで2、3回放映されていたのです。

 おそらくそのテレビを観て、その二人の韓国の方々はここにやって来たのかな、と私は思いました。したがって、銃のようなハンディ・カメラを見せられても、私はその二人に警戒感を持ちませんでした。

  彼らの要望で、耕うん機で土を起こしているシーンをカメラに撮りたいとのことだったので、私はその作業を始めました。以前、NHK長野のスタッフさんから取材を受けた時も、そのシーンがニュースの映像として映っていました。そのため違和感の無かった私は、しばらく銃の形をしたハンディ・カメラで撮影されていました。すると、そのうちに、記者さんが通訳兼カメラマンの人を引き止めて、突然何語かわからないような早口で、何かに感動したかのようにしゃべくり出しました。どうしたのだろうかと、しばらく私は思いました。すると、今度は通訳さんから、次のような説明がありました。

「韓国では、日本のように人口が多くないため、多数派の意見が支配的になってしまい、少数派の意見は通りません。少数派の意見のほとんどは、黙殺されてしまうことが多いです。あなたのように、都会から田舎に移住してきて、一人で農業をやるとしたら、誰も援助をしてくれないし、生活していけません。韓国の社会では、みんな右へ倣(なら)えでいなければ、生きて行けないことが一番の問題なのです。」

 そんなことを話してくる相手に、私は反論ができませんでした。民主主義国であるかぎり、多数派の意見が支配的になるのは、実は日本も同じです。ただし、個人の責任において、少数派になる自由が日本にはあるのです。そんなふうに思いながらも、私のほうからは何も彼らに言葉で伝えられませんでした。勝手気ままに農業をやっている私なんかを見て、自称韓国人の記者さんがどうしてそんなに感動してくれるのか、その辺の事情が当時の私にはよくわかりませんでした。

 やがて彼らは、一時間ほど取材をして、そのまま去っていきました。本当に彼らが韓国人だったのか、彼らの言っていたように、私が農作業をしている姿が韓国のテレビで放送されたのかどうかは、今になっても不明のままです。

 しかし、彼らが私に伝えてくれたことは、とても大切なことだと思っています。韓国と日本がお互いに異国であると認識しなければならない、ということです。つまり、現状では、両国の国民同士がお互いに理解が足りず、誤解し合っているということなのです。

 たとえば、日本人は、相手を理解すれば、相手と親密になれる、仲良くなれると考えています。けれども、現実には、相手を理解すればするほど、相手と適度な距離を置かざるを得なくなります。お互いの立場を尊重して、波風立てないようにするためにはそうするより仕方がないのです。

 その一方で、韓国人は、あまり日本人をライバル視しないほうがよいのかもしれません。現実を直視してもらえばわかることですが、日本は敵国でもライバル国でもなく、ただの隣国にすぎません。異国なのですから、いちいち日本人のやることに屈辱を感じて欲しくありません。私は、あらゆる反日感情の根っこにあるものは、そのような感情的なコンプレックス(あるいは劣等感)であることを知っています。

(その裏返しとして、日本人も、あまり韓国人のやることにいちいち神経をとがらしては、本当はいけないと思います。異国なのですから。)

 

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

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

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

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

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

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

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

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

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

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

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

 

千曲川氾濫のヒミツ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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