4月から,中学生になる次男かずは,こうしろうより視力が悪い。原因はパソコンのし過ぎというか,正確にはパソコンでゲームのし過ぎである。「一回30分以内にしなさい」とか「1日1時間まで」と口がすっぱくなるほど言っても,親父の晩酌と同じでついつい過ぎてしまう。
 「自分がどれだけパソコンの前にいるのか,自覚できるように使用時間をつけなさい。」とExcelで開始時間,終了時間をつけることだけは守っている(自己申告なので,たぶん過少申告だ)。

 「Excelでいちいち入力するのが面倒だ」と,この時間の記録をHSP(Hot Soup Processor)で自動化するのだと,かずはプログラムを作り出した。「かず,おまえ,すごいな」と言いながら,原始人が道具を作り始めたときもこんな感じだったのかなあと,わけのわからないことを考えていた。

 ある晩,かずが文字列定数と変数の連結がわからず,ごちゃごちゃなコードを書いていたので,
「文字列は ダブルクォート(“)でくくって,連結はHSPでは+でするんだ。何書いてるんだ!」と疲れて帰宅したので,強い言い方をしてしまったらしく,それ以来,プログラミングをしているところをのぞき込んだり,手を出そうとすると「いま,とちゅうやから」と拒絶するようになった。
 でも,その方がいいのである。人をあてにせずに,間違っていても自分でどんどんプログラミングして行く方が早く身につくはずだ。「詰ったら,聞いてくれよ」と一歩下がった。

 これが,実行画面である。上段が開始時刻,中段が現時刻で,下段に経過時間が表示される。終了ボタンを押すとテキストファイルにログが出力される。

 「このファイルもプログラムで表示し,時間の集計も取れるようにするが。」とかずは強気である。
 いま,できているソースコードは次のようなものである。プログラム名は使用時間チェッカーだ。

---------------------------------------------------------------
//使用時間チェッカー
  screen 0,300,100
  objsize 100,33,1
  sdim siyouzikan,32000
  button "表示・閉じる",*tekisuto
  button "終了",*syuryou
  button "設定" ,*settei
  gettime hour,4 // (1)
  gettime minute,5
  gettime second,6
  font "MS ゴシック",30,1
  pos 105,0
  mes ""+hour+":"+minute+":"+second+" // (2)
  pos 230,0
  mes "開始"
  gosub *load
*main
  color 255,255,255
  boxf 100,35,300,100
  gettime hour2,4
  gettime minute2,5
  gettime second2,6
  color 0,0,0
  pos 105,35
  mes ""+hour2+":"+minute2+":"+second2+" // (3)
  pos 230,35
  mes "時刻"
  zi=hour*3600
  zi2=hour2*3600
  hun=minute*60
  hun2=minute2*60
  second=second
  second2=second2
  siyou=(zi2+hun2+second2)-(zi+hun+second) // (4)
  hour3=siyou/3600
  minute3=(siyou-(hour3*3600))/60
  second3=siyou-(hour3*3600+minute3*60)
  pos 105,70
  mes ""+hour3+":"+minute3+":"+second3+" // (5)
  pos 230,70
  mes "使用"
  title ""+hour3+":"+minute3+":"+second3+"
  wait 100
  goto*main
*tekisuto
  goto *main
*syuryou
  gettime month,1
  gettime day,3
  siyouzikan=""+month+"月"+day+"日"+" "+hour+":"+minute+":"+second+" "+hour2+":"+minute2+":"+second2+" "+hour3+":"+minute3+":"+second3+"\n"+siyouzikan
  strlen a,siyouzikan
  bsave "siyoukiroku.txt",siyouzikan,a // (6)
  end
*settei
  goto *main
*load
  z=""
  dirlist z,"siyoukiroku.txt",0 // (7)
  if stat=1 {
    strlen a,siyouzikan
    bload "siyoukiroku.txt",siyouzikan,a // (8)
  }
  return
---------------------------------------------------------------
 (1)からの数行gettimeコマンドで時,分,秒を取得している。gettimeコマンドの詳細は以下の通りである。
=======================================================
gettime 日付・時刻を取得
 gettime p1,p2
 p1:読み込み先の変数
 p2:取得するタイプ
 (0:年,1:月,2:曜日,3:日,4:時,5:分,6:秒)
=======================================================
(2)で時間を表示している。これが開始時刻である。(3)で表示している時間が現時刻。(4)のsiyou=(zi2+hun2+second2)-(zi+hun+second)で経過時間を求めている。2つの時:分:秒の差異を求めるために,(4)の数行前で,zi=hour*3600,hun=minute*60と,時には3,600を掛け,分には60を掛けてすべて秒単位に変換し,差し引きした後,こんどは割り算をして時,分に戻し,(5)で経過時間を表示している。

 「かず,このやり方,何を参考にした。」とたずねると,「自分で考えた」と胸を張ったので,いくそった(富山弁講座 いくそる:びっくりするの意)。
 かずは,あかちゃんの頃から他の寸法に比べて胸囲が大きく,検診のときに「計り間違えではないか」と医者をびっくりさせたことがある。だから,本人はそんなに胸を張ったつもりはないのかもしれないが,自力で問題解決の方法を考えだしたことにちょっと驚いた。

 (6)のbsaveがテキストファイルへの保存である。ファイル"siyoukiroku.txt"に変数siyouzikanの内容を書き出している。
 ログなので,以前に記録されているデータに追記しなくてはならない。そのために,(7)のdirlist z,"siyoukiroku.txt",0でテキストファイルが存在するか確認し,存在した場合,(8)のbloadで変数siyouzikanに読み込んでいる。
=======================================================
dirlst ディレクトリ一覧を取得
 dirlst p1,"filemak",p2
 p1:ディレクトリ一覧を格納する変数
 "filemak":ファイルマスク(一致するファイルを取得する)
 p2:ディレクトリ取得モード
(0:すべてのファイル,1:ディレクトリを除くファイルすべて,・・・)
*システム変数statに一致したファイル数が入る
=======================================================
ディレクトリ一覧を取得するdirlistコマンドでファイルの存在が確認できることは,私がアドバイスした。
今回保存したいデータとsiyouzikanに読み込んだ過去のデータを連結して出力することで,追記を行っている。

   保存するファイルを切り替えられるようすれば,コンピュータ上での各種作業時間の記録などにも応用できそうだ。良いものになったら使わせてもらおう。