scrcal
* SCRCAL 概要
* 例えばこんな事出来ます
* スクリプトランゲージ
* タスクスイッチ機能の実現
* 三項演算子について
* switch文について
* 作者のノートパソコンについて
* サポート
* 更新履歴

[SCRCAL 概要]

SCRCALはScript Calculatorの略で、当初はスクリプトを書いて複雑な計算を行うのが目的で開発しました。その後、多目的に使用出来るように、Windows操作、ファイル入出力、ユーザーインターフェース、ホットキー呼び出しなどの諸機能を取り入れました。

このプログラムはスクリプトランゲージであり、ユーザーは各自、ヘルプを参照しながら、ほぼC言語に似た文法に従ってスクリプトを作成して実行するものです。

作成したスクリプトは登録しておけば、ホットキーで選択ダイアログを呼び出し、1文字入力で実行できます。マウス操作、キーボード入力含めて、日常繰り返されるWindows操作を自動化できるので生産性の向上に寄与できます。

[インストール・アンインストール]

特別なインストール・アンインストールはありません。ただ解凍したフォルダーから実行し、必要なくなれば、そのフォルダーを削除するだけです。

[Version 3.0.0.0の変更について]

[例えばこんな事出来ます]

タスクスイッチ
リスタート後によく使うWindowを登録し、ホットキー+選択キーで選択したWindowを前面に出す。またはホットキーのみで目的のWindowを前面に出すこともできる。 Alt+タブでは同じアプリで複数のWindowを開いていると瞬時に判別できないことがあるので効率がよい。Notebook PCをTVに接続し、例えば1:Alt+3(ユーチューブ専用Windowを前面に出す), 2:Alt+S(movsecm.tstでTVに移動して最大化) 3:マウス左クリック(マウスカーソルは自動でセンターに移動しているので再生スタート)のたった3アクションでユーチューブ再生できる。 最多使用頻度。Ver 2.0.3.0 新機能。
npadplay
単独キーだけでもdirect hotkeyに登録できるようにして、数値パッドの*キーで呼び出す。最初に音楽プレイリストか音声のフォルダーを選択し、次に各フォルダーのファイルを選択しdshowplay.tstで再生する。これにより、事前にファイルを選択する必要もないし、終了して元に戻すことが出来ないこともなくなる。
mp3 mp4 dshowplay
らじれこで録音した長時間のmp3を再生していると途中で眠ってしまうことがあるので、15分の操作無しで自動停止。矢印キーで不快なCMを10秒のスキップ。最近使用した20個のファイルまで前回の再生位置を記録しているのでその位置から再生再開できる。プレイリストの再生では最近使用した30個のファイルまで前回の再生ファイルを記録しているのでそのファイルから再生再開できる。 ブルートゥーススピーカー数値パッドを使えば風呂場での再生操作が可能。ファイル毎に複数のブックマークが記憶出来てABリピートにも利用可能。既定のアプリとして使用していてもデコーダーを外部パッケージに依存しているのでほぼ問題のないレベル。Ver 2.0.3.0 新機能。
search_open
複数のフォルダーを指定したワードをファイル名に含むファイルを検索してOpenする。この基本機能は移動(search_move.tst))又は日付変更(setdate.tst))のスクリプトに共同使用するこが可能であり、オプションを指定して実行する。主にYoutubeからダウンロードした動画再生に使用する。検索するフォルダ毎にINIファイルを作成しオープン履歴を保管することにより、最新のファイルに移動表示する。つまり前回の選択時状態に戻せる。巡回履歴移動でShift+Nキーにより、最初にオープンしたファイルへ移動できる。検索結果数が多い場合便利な機能となる。
search_move
ファイルの移動コピーといっても、宛先が同じ又は別だったり、ソースか1つか複数だったり、リーネームを必要としたり形態も様々である。そこでsearch_open.tstとtagfol.tstを併用して最終コマンドもviewbox関数を用いて長いファイル名でフルで確認できるようにした。また Windowsスポットライトの画像を別フォルダにリネームしてコピーできる。
radikohot, radikosw
radikohotはdirect hotkeyに登録して、数値パッドの/キーで呼び出し、常駐用のradikoswを前面にしたりまたは起動する。最風呂場で防水ラジオもよいが、電波状況が良くないのでFMが聞けないのがいたい。そこでブルートゥース数値パッドの0-9の入力でラジコの放送を選局できるようにする。またdshowplayと併用したいので、'/'と'*'をホットキーにして切り替え可能にする。またどの放送局を再生しているのか確認できるように読み上げ機能を付加した。
spellout
上のrajikoswで使われているストリングの文字を読み上げる機能。あらかじめ各々の文字のWAVEファイルをダウンロードしおく必要がある。
soundsel
どうもdefaultのAudio Deviceを設定するAPIが存在しないようなので、通常手順をふまえて接続デバイスを表示選択通して設定するスクリプトを作成した。。Ver 2.0.4.0 新機能
clipboardmon, clipboardpaste
clipboardmonは常駐してTextとHdrop最新履歴を26個まで記録。clipboardpasteはその中から選択してclipboardにセット。またHdropからTextにコンバージョンする機能もあり、dshowplay.tstで使う音楽リストファイルを簡単に作成できる。
Window上に下線
Window上に下線を引いて文章を読みやすくする。英語や文字が小さい場合に便利。高使用頻度。Ver 2.0.3.0より縦書き対応のため縦線機能追加。Ver3.0.0.0においてデスクトップに直接描画するのをやめてコピーしたWindow上に描画する方法に変更。Lenovo ThinkPadのみで使用可能。
マウスの位置表示
外部モニターが二つもあるとマウスの位置を把握するのが難しくなる。コントロールキーで位置を表示してくれる機能はあるが、なぜか作者のPCでは動作してくれないことがある。そこでマウスの位置に小さいWindowを開いて2−3秒点滅して表示する。しかしながらポインターのサイズを大きくしたほうが見つからない問題に対しては有効かもしれない。
screenshot
マウスカーソル下のWindowぼスクリーンショットが撮れる。Alt+PrintでNGな場合でも保存できた。 Ver 3.0.0.0新機能。Lenovo ThinkPadのみで使用可能。
ミラーボックス
対人でモニターを相手に向けても、説明Windowのミラーを手元で確認をしながら操作できる。Ver 3.0.0.0新機能。Lenovo ThinkPadのみで使用可能。
grep, 置換, searchfile
Ver 2.0.5.0において正規表現機能を実装。正規表現によるGrepを実現。通常の置換では、編集ソフトで一つずつ確認しながら実行するが、置換数が多い場合は一遍に置換してから、問題があれば元に戻すほうが効率がよい。置換元は触らず、作成日付をファイル名に含めた別ファイルで保存する。結果表示部分にVer2.1.0.0で追加したviewbox関数を使用して選択した部分をsearchfile.tstを起動してマッチした部分に移動して確認できるようにした。searchfile.tstでは#if 0-#endif, /* */, // などのコメント部分を検索対象から除外する機能を追加した。 
searchfilesl
fspread(),fsdread()のサポートにより全行一括検索を可能とした。windbg.exeを使ってクラッシュ箇所を特定したい場合、objdump.exeでダンプしたファイルに複数行にまたがる機械語羅列を検索して特定しやすくなる。
アナログ時計
Direct2Dの作画機能をdrawbox()関数に取り入れた。作画の特徴としては多種多様な対象があり、繰り返される作業が多く、更に計算が必要とされるのでスクリプト言語との親和性が高い。drawbox関数であらかじめ時計盤、分針、時針、7セグデジタル数字の画像を用意してそれらを回転するなどしてアナログ時計を実現しました。ディジタル時計では味気ないが、1秒毎に秒針が動いてくれるので振り子時計のような癒し効果がある。 Ver 3.0.0.0新機能。Lenovo ThinkPadのみで使用可能。
kill_scrcal
スクリプトにバグがありマウス移動等を含むコードが無限ループに入った場合、収拾がつかず再起動せざるを得ない。そこでscrcal.exeの全プロセスを終了するスクリプトをダイレクトホットキーの登録して実行すれば再起動を回避できる。
スライドショー
スクリプト実行であればホットキーで簡単に実行終了できるのので便利。Ver 3.0.0.0新機能。Lenovo ThinkPadのみで使用可能。
cpu monitor
1秒毎にCPU使用率を監視し、アイドルが25%以下になれば、Worst10のプロセス情報をログに残す。パソコンが重くて犯人を探すときにProcess Explorerの補助として使える。
矢印キーによるマウス操作
移動量を調節して、速く正確にマウスカーソルを移動。動画再生のスライダーの選択範囲が狭い場合に使える。1-9の数字キーで微小ピクセル数のドラッグはラジコタイムフリーのスキッププレイに使える。
バックアップ
バックアップ元とバックアップ先間のサブディレクトリを含めてのミラーコピー。削除や新しいファイルの上書きでは確認ダイアログを表示。再帰関数を使って簡単に実現。最初はANSIバージョンでフォルダーやファイルの名前にラテン文字などが入っていると対応できなかったのでUNICODEバージョンに変更して対応。スクリプトランゲージのオーバーヘッドがあるので、専門のバックアップソフトのパフォーマンスは出ないので大容量のバックアップには向きませんが、小容量であればホットキーからこまめにバックアップできるので便利ではないか。
カウントアップタイマー
最重要スクリプト。目標時間の前後で各々の間隔でチェックポイント ワーニングを表示。PC上での作業はだらだら続けやすいので、目標時間を目安に別作業への移行を促し、時間の有効活用、座り続けの防止を図る。佐々木俊尚さんが飯田浩司のOK! Cozy up!で15分の目安を提示したのでデフォルトを15分に変更。
サスペンド
ホットキーと数字入力でサスペンド。マウスでスタート, 電源, スリープとクリックするよりは簡単。ノートブックPCのリッドクローズではセカンダリモニターのWindowがプライマリーモニターに移動してしまうので使えない。
tilemv
画面サイズの水平1/2、垂直1/2、水平1/2、垂直1/3、1/4, 1/6, 1/9のサイズでタイル区画で移動。又は、手動で位置サイズを決めてから番号を指定してINIファイルに登録してその番号で移動。
movmon
カーソル下のWindowsをマルチモニター間をトグルして移動。ついでにマウスカーソルも中央に移動。Youtubeの動画をワンタッチでTVに全画面移動が出来て便利。
usbeject
ドライブレターを指定してUSBドライブを取り外し。Ver 2.0.3.0 新機能。
hotkeyact
ホットキーで前面にしたいスクリプトが複数ある場合、衝突を避けるためホットキーを別にしなければならないが、通常忘れてしまいがちである。そこで専用のスクリプトを用意して、前面にしたいハンドル値を登録する形にして、単一のホットキーのみで操作を可能にする。
NHKネットラジオの再生停止
ホットキーからNHKネットラジオの再生停止。Windowのサイズが変わらない限り、Windowの位置によらずボタンの押し間違いはない。
学校チャイム
通常、定時にチャイムを鳴らしたい場合はタスクスケジューラを使うが、一時的に停止したいと思っても変更は容易ではない。ホットキーからの実行では、デフォルトでWindowは非表示でタスクバーに現れないので気にならない。
NHKネットラジオまたはラジコの留守録
指定時刻にサスペンドからリジュームして、NHKネットラジオ・ラジコの再生並びに外部録音アプリの録音を開始して、指定時間後に再生録音を停止してサスペンドする。ラジコのタイムフリーにも若干の修正で対応可能。
コピペ
よく使う文字列をFileにあらかじめ登録し、ホットキーからの起動でそれを参照しながら、登録ナンバーの入力でコピペする。またバックグラウンドプロセスでクリップボードの変更を監視して、変更内容をINI Fileに保管して後にコピペに使用可能。
音量調整
ホットキーから選択メニューで音量を設定。これでマウスを使ってスライドバーを操作する必要がない。
ローンシミュレーション
借入額、年利、返済年数により返済月額を計算して、実際の返済経過をシミュレーションして確認する。
家計簿
スクリプト形式のほうが、支出の追加、項目分けで柔軟性があってエクセルよりは抵抗感が少ない。一番手間のかかる支出の追加に日常使用する編集ソフトが使える。
大量のファイルの整理
大量のファイルが複数のフォルダーのまたがって存在するときに、キーワードで検索して、選択的にキーワードをファイル名の先頭に付加して指定フォルダーに移動して整理する。
ストップウォッチ
複数のラップタイムを含めてまとめて表示。

[スクリプトランゲージ]

様々なタスクを自動化ソフト化する場合、それぞれをいちからプログラミングをしたら、結果的に長時間かかります。構成要素を関数化しておき、組み合わせの指定で実現するスクリプトランゲージを用意して、後に短時間でスクリプトを作成すれば、それらの自動化が実現できて、生産性の向上をもたらすことができます。
特にテストにおいては、テストカバレッジを増やすために、多くテストケースを作成して、問題の発生に応じて柔軟に修正することが求められるので、スクリプトランゲージは有効な手法であり、このプログラムはテスト使用も想定しています。
このスクリプトランゲージは、自分使用目的で開発しました。自作なので自分の目的に応じていかようにも更新可能です。例えばバックアップに使おうと思えば、CreatedirectoryやCopyfileなど関数を付け加えることができます。また本格的に使おうとしたら、時間のかかる部分を内部関数化にすることによって高速化を図ることができます。
構成要素の数が多く、プログラム量は膨大ですが、大変充実した作業でした。簡単なC言語コンパイラを作るようなものですから、結果的にC言語の極意を習得できます。時間に余裕があれば自作のスクリプトランゲージはおすすめです。

[スクリプトの拡張子]

tstとしたのは、txtとして新規作成して、xをsと変えるだけ済むということと、Testcaseをスクリプトとして作成することはよくあるからです。

[スクリプトの編集ソフト]

GVIMがおすすめです。前に何気なしに使おうとしたのですが、勝手にFileを作成したりしていたのでこれは使えないと思いやめてしまいました。癖があり初心者にとっては敷居の高いソフトです。 その後あまりにも評判がいいので、本格的使いこなそうと思い、本などで勉強して、今では快適に使いこなしています。

検索したいワード上で*と入力すれば、そのすべてのワードが色付けされて、n入力で検索できます。また{}や()上にカーソルを持っていけば、対となるペアが色付けされるので、付け忘れの防止となります。C言語の文法に出来るだけ従っているのは、これらの編集支援機能が活用できるからです。

[参考文献]

UNIXプログラミング環境 Brian W. Kernighan (著)

何度も図書館で借りまくって結局購入しました。スクリプトランゲージを書く人にとってはおすすめです。

プログラミング作法 Brian W. Kernighan (著)

search_open.tstで使ったquicksortのコードはこの本から引用しました。正規表現の実現方法も書かれていて次期バージョンに採用できないか検討中です。

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

何度も図書館で借りまくったが購入はできませんでした、こういう良書ぜひ再販してほしい。

猫でもわかるWindowsプログラミング 第4版 猫でもわかるシリーズ 粂井 康孝 (著)

何度も図書館で借りまくって購入しました。入門書としておすすめです。

正規表現技術入門 ――最新エンジン実装と理論的背景 (WEB+DB PRESS pus)

この本を参考にして正規表現の実装を行いました。固定長文字列探索の高速化により単純なstrstr()よりも高速になることを確認しました。

How to Prepare a USB Drive for Safe Removal

usbeject(driveletter)で参考にしました。

WMIを使用してディスプレイのデバイス名を取得

wmiproc()で参考にしました。

タスクスイッチ機能の実現

要件

高解像度のモニターにタイル状に並べるよりは、全画面で切り替えて使用したほうが作業効率が高いように思います。そこで簡便なタスクスイッチ機能の実現が求められていました。求められる機能の要件としては、
  1. ワンアクションで前面に: よく使うWindowは限られていて、それらを各々ホットキーに紐づけてそのキー入力だけで前面に出す。同時にマウスカーソルをWindowの中心に移動。従来はツーアクション以上必要でQuickではない。
  2. 非常駐: システムのリソースを食わないように非常駐であること。必要な情報はINI File等に保存する必要がある。
How to Quick-Switch Between Tasks in Windows 10

上のコラムにおいて要件に該当するものはないので、自作スクリプトランゲージの強みを生かして実現します。

実現方法

目的Windowの識別方法としては、タイトル名を使うのが簡単だが、Chromeの場合、前面にあるタブ名が出て可変になっているので、終了しない限り固定であるWindow Handle値を使用する。この値をINI Fileに格納するため、HEXストリングに変換する関数ctrlhv()を追加サポート。またワンアクションでスクリプト実行するためにDirect Hotkey機能を追加サポート。目的Windowを登録する作業はWindowsのリスタート後は発生するが、これは1回切りで済むので問題にならない。

使用例

自分がよく使うのは、Chrome #1:ニュースSNS等、Chrome #2:テクニカル関連、Chrome#3:ユーチューブ関連、#4: GVIM、#5:FreeCommander。#5に関してはPrimaryMonitorでの使用で対象ではない。tasksw2.tstでの使用では、
アプリケーション 選択キー
Chrome #1 'A'
Chrome #2 'B'
Chrome #3 'C'
GVIM '1'

と選択キーに紐づけ、Direct Hotkeyでの登録では、

アプリケーション ホットキー スクリプト オプション
Chrome #1 Alt+1 tasksw2.tst a /quit / hide
Chrome #2 Alt+2 tasksw2.tst b /quit / hide
Chrome #3 Alt+3 tasksw2.tst c /quit / hide
GVIM Alt+4 tasksw2.tst 1 /quit / hide

またリビングのTVと書斎のモニターでの切り替えでは、当然全てのWindowはPrimaryに移行するので、movsecm.tstをalt-sに登録すれば、alt+(1-4) and alt+sのツーアクションでsecondaryに復帰できる。一部のアプリケーションではAlt+(x)が使われていて注意が必要な場合があります。
書斎の環境では、全てセカンダリーへの移行が望まれるので、モニターの名前または解像度が一致すれば自動で移行させる。

三項演算子について

利点

if ( a > b ) 
	c = d 
else 
	c = f

これを機械語にすると

push a -> push b -> ( pop b, pop a, >, push result)-> jmp @1 if false -> [push d -> assign c] ->
jmp @e -> @1[push f -> assign c] -> @e   


c = a > b ? d : f

これを機械語にすると

push a -> push b -> ( pop b, pop a, >, push result)-> jmp @1 if false -> push d -> jmp @2 -> 
@1 push f -> @2 assign c     

わかりくい三項演算子ではあるが、利点としては、単文のなかで条件分岐ができるのでコード量を節約できる。
上の例で節約できているのは assign c。使わないよりは使ったほうがよい。

実装事由

もともと三項演算子を実現するきっかけは以下のFor文を実現したかったため。

for (i=0, ucnt=0;readini(fid[i], 'main', printf("fid_%c",i<10?i+0x30:i-10+0x61), inifid) == true; i++ )  {

iの値に応じて"fid_0"-"fid_9", "fid_a"-"fid_z"と変化する必要があり、三項演算子によりForの終条件を構成出来た。		

C言語

分かりにくい三項演算子であるが、C言語の解説書ではあまり詳しく解説されていないので解説します。
3つの被演算子をもち、1項目を評価して真であれば、2項目を評価し、偽であれば、3項目を評価して、その結果を返す演算子である。
例えば+演算子であれば、二つの被演算子をもち、それらを足した結果を返す演算子であり、ただ演算の内容少し異なる普通の演算子と理解すればよい。
従って以下のような+と組み合わせる式も可能となる。==と?:は+よりも優先順位が低いので、三項演算子の部分は()で囲む必要がある。

//-----------------------------------------------------------------
#include <stdio.h>
//-----------------------------
int main(int argc, char **argv) {
//-----------------------------
	int a,b,c,d,e;
	a=0;
	b=1;
	c=2;
	d=3;
	e=4; 
	a=(b=10)+(c==20?d=30:(e=40));
	printf("a=%d b=%d c=%d d=%d e=%d \n",a,b,c,d,e);
}
//-----------------------------------------------------------------
>>> a=50 b=10 c=2 d=3 e=40 

if else 文は三項演算子で代用できる。ただし、構成文は全て数値を返す式に限る。printf()は書き込まれた文字数を返すので使える。

//-----------------------------------------------------------------
#include <stdio.h>
//-----------------------------
int if_ret(int a)  
//-----------------------------
{
	int A,B, ret;
	if ( a==0 ) {
		A=1;
		B=2;
		printf("A=%d B=%d \n",A,B);
		ret=0;
	}
	else if ( a==1 ) {
		A=3;
		B=4;
		printf("A=%d B=%d \n",A,B);
		ret=1;
	}
	else {
		A=5;
		B=6;
		printf("A=%d B=%d \n",A,B);
		ret=2;
	}
	return(ret);
}
//-----------------------------
int ter_ret(int a)  
//-----------------------------
{
	int A,B;
	return(\
				a==0?  A=10, B=20, printf("A=%d B=%d \n",A,B), 0 :\
					(a==1?  A=30, B=40, printf("A=%d B=%d \n",A,B), 1 :\
						(A=50, B=60, printf("A=%d B=%d \n",A,B), 2)\
					)\
			);
}
//-----------------------------
int main(int argc, char **argv) {
//-----------------------------
	int a;
	for ( a=0;a<3;a++) printf("a:%d return:%d \n", a, if_ret(a));
	for ( a=0;a<3;a++) printf("a:%d return:%d \n", a, ter_ret(a));
}
//-----------------------------------------------------------------
>>>
A=1 B=2 
a:0 return:0 
A=3 B=4 
a:1 return:1 
A=5 B=6 
a:2 return:2 
A=10 B=20 
a:0 return:0 
A=30 B=40 
a:1 return:1 
A=50 B=60 
a:2 return:2 

switch文について

dshowplay.tstにおいて、機能を盛り込み過ぎて、if-else文が長くなりすぎていたのでswitch文を実現させた。if-else文では、真になるまで評価、Jumpの繰り返しになるので 効率が良くないし、プログラムの可視性も良くない。それに対してswitch文では、評価値を定数リストで検索して、一致すればそれに対応したアドレスにジャンプするので効率がよい。 いわば分散分岐から集中分岐にしたような形。

case文

case文はただ定数とそのアドレスをswitch文用のテーブルに登録するためだけで、その位置にコードが発生しないので、if文やwhile文の途中においても問題はない。

問題点

ForやWhile文と同じbreakを使っているので、switch文を抜けた後にそれを実行する必要がある。swbreakなど他の語を使えばその様な問題は発生しないがあえてC言語の 文法に従った。

作者のノートパソコンについて

作者の現在使用しているパソコンはThinkPad E470である。Right/Left/Up/DownとPgUp/PgDnがかたまって配置されている。これだと押し間違えると作業位置が大幅に移動してしまい不便に 感じることがあり、他のユーザーでも邪魔だと主張されているかたもいます。しかし、dshowplay.tstではLeft/Rightは10秒のJump、PgUp/PgDnは1分のJumpで多用します。これがかたまって キーボードの右隅に配置されていると、寝ながらラジオ番組再生しながら、キーボードを見ないでスキップ再生が出来ます。15インチになるとテンキーが配置されて、右隅にならないので 次に買い替えるとなるとThinkPad14インチを選択せざるをえません。単なる移動量の小大であるから、まとめて配置するのが自然だとおもうのだがこれは少数派意見なのだろうか。 なお、hzvtline.tstでの横線縦線の移動でもPgUp/PgDnは大変重宝しています。 2016年に購入した時点では8GBMemeory512GBHDDであったが今は32GBMemory1TBSSDに更新して高速化されている。 なお、ひらがなが印字されていると美しくないと思うので英語キーボードを選択しています。USBキーボードもトラックポイントがついてとても便利なThinkPadブランドを使用しています。

ThinkPad E14

作者が2023年に新たに購入したのは、Lenovo ThinkPad E14 Gen 4 インテル。購入動機はUSB 4 (Thunderbolt4 対応)で外部モニタが二つ可能でTVやYoutubeを見ながらPC作業が快適になった。

ベンチマーク ThinkPad E14 ThinkPad E470
CINEBENCH 7456 1972
重量 1588 g 1839 g

ノートパソコンとロードバイク

この二つの愛すべきアイテムには、きわめて相通じるものがある。

出来る自由性、実現可能性

ノートパソコンでは、場所を選ばずリモートワークで仕事、ゲームやマルチメディア、インターネット等、ありとあらゆることが周辺機器との組み合わせで実現可能になる。 ロードバイクは、道路があればスピードが出るので100Km先の遠い場所にでも簡単に出かけることができ、行ける場所の自由度が高い。

経済性

どちらも10万円台の初期投資だけで済む。ノートパソコンはせいぜい電気代、ロードバイクは年単位のタイヤ、チューブ代で済む。スマホ代の月額利用料が発生しない。 ロードバイクでは、運賃や燃料代は発生しない。ただ内臓脂肪がもえてくれるだけでこの上ない。

単独作業

どちらも単独作業であるから、こちらの都合で好きな時間に作業ができる。密にならないから、このコロナ禍の巣ごもり需要で売上をのばしているのは頷ける。 ロードバイクでは、ランニングと違って膝への衝撃がなく、長時間の有酸素運動が可能。固定ローラー台につないで、寒い冬場でも快適に汗を流すことが出来てスポーツジムいらず。 なお高級ロードバイクを固定ローラー台に使う愚をおかしてはならない。

カストマイズ性

ノートパソコンでは、メモリーを増やしHDDをSSDに交換して高速化を図れる。 ロードバイクでは、ホイールサドルを買い替えて軽量化を図れる。

キーボードについて

前のThjinkPad E740で長年使用していたせいかTの文字だけ入力できなくなっていた、そこで試しに日本語キーボードに交換してみた。英語キーボードと比較してみた考察が以下の通り。

[サポート]

不具合、質問などあれば、scott14ati@gmail.com宛にご連絡ください。
全てのシナリオを一人でカバーするのは不可能なので、問題等のご連絡は歓迎します。

Version 2.1.2.0の変更について
ストリング式の表示抑制にバグがあり、修正すると共に、パフォーマンス改善を行いました。
dshowplay.tstのbookmark機能にバグがあり修正すると共にヘルプを入れました。スクリプトとはいえ、機能が多いとヘルプはとても有用。
Version 2.1.1.0の変更について
コンマ演算子にバグがあり、修正した。
コードのダンプを検証した結果、無駄な部分かあったので、コードを圧縮してパフォーマンスの改善を行いました。
パスワードメモなどを暗号化するために必要ではないかと考え、バイナリファイルでのIO機能をサポートした。
npadplay.tstでは、音声ファイルとプレイリストのフォルダーは固定であったが、メニュー選択可能にして、複数から選択可能にした。また動画のフォルダーも追加した。
dshowplay.tstでは、長めの動画を再生するようになってきたので、レジューム再生の機能を追加した。INI Fileで音声とは別セクションで最後の再生位置ほ保存を行うようにした。
Version 2.1.0.0の変更について
せっかく実装した正規表現機能を有効活用しようということで、viewbox関数を追加して、ファイルを表示しながら検索結果に逐次検証できるようにした。 検索結果をハイライトするのみならずキーワードやコメントエリアもハイライトできるようにした。 また配列変数を使って、コメントエリアを検索対象から除外できるようにした。 これでデバッグ用にいれたprintf関数を忘れずに効率的にコメントアウトできる。今までは配列要素を含めて変数名に取り入れていたが、変数が大量にあるとstrcmpが何回も繰り返されることになるので、配列用のバッファを用意しダイレクトにアクセスできるようにしてアクセス速度の改善をはかった。 WMI機能追加により、パソコン構成要素をリストをとったり、プロセス毎のCPU使用率を調べソートしてTop10のリストとれるようになった。 dshowplay.tstではプレイリスト再生機能において、前回の最後の再生ファイルからはじめるようにして、常に最初から始まることによる再生回数の偏在の不便さを解消した。
Version 2.0.5.0の変更について
正規表現技術入門 ――最新エンジン実装と理論的背景 (WEB+DB PRESS plus)を参考にして正規表現の実装を行いました。固定長文字列探索の高速化により単純なstrstr()よりも高速になることを確認しました。従って正規表現によるGrepを日常的に使用するようになりました。 dshowplay.tstの数値パッドリモート再生では、複数ファイル処理を含めて全て単独スクリプトで処理していましたが、複雑になりすぎてよろしくないので二つに分割しました。プレイリストと音声ファイルは別フォルダーにして、最初にフォルダーの選択、次にそのフォルダー内に 存在する該当ファイルを日付順のソートして選択する構成にしました。
Version 2.0.4.0の変更について
実装が困難ではないので、コンパイル機能を持たせました。バージョンアップ毎にリコンパイルが必要であり、実行時にコンパイル時間を省略できても通常微々たるものであり、作者は常時使用するものではありません。 第三者に実行してもらうときに、ソースを秘匿できるメリットがある程度です。この変更により、arg_xxを通常変数から定数ストリングの扱いに変更しました。ストリングから整数に変換しているスクリプトは修正が必要になります。
Version 2.0.3.0の変更について
複数のホットキー登録可能にして、直接のスクリプト実行をできるようにしました。最初のSCRCALにおいてこれらのホットキーを管理していて、万が一クラッシュが発生すると、ホットキー登録が解消されないのでリスタートが必要になります。最初のSCRCALはタスクトレイに入れて、通常のスクリプトの実行は二つ目のSCRCALを開いて実行することが望ましい。
Version 2.0の変更について
実行前にスクリプトの構文解析を行い、コンパイラによりマシン語を生成しそれ実行します。これによりパーフォーマンスの改善が望めます。実際、前バージョンのフォルダーのバックアップスクリプトにおいて一部を内部関数化していましたが、そこまでしなくてもほぼ同等のパーフォーマンスを実測しました。 主要部分は大量に書き換えていて出力等の挙動がかなり変わっています。前バージョンでは実行時に構文エラーとなるのが、実行前にエラーとなります。スペースは前バージョンでは一括消去してから処理していましたが、区切り文字として意味をもちます。elseifやfunctionの後にスペースがないとエラーとなるところですが、 スクリプトの書き直しをしなくてもいいように有効としました。一部修正が必要となるのは、easybackupとデスクトップ上の下線(desktopline()のスペック変更)です。ホットキーに登録できるスクリプトは36個まででしたが、Shiftを押してからキーを打つ形で36個を増やしました。前バージョンでは&&と||の実施が 不十分でしたが修正しました。
CHMヘルプが正常に表示されない
エクスプローラ上で右クリック -> プロパティ -> [ブロックの解除]ボタンをクリック。
パフォーマンス低下が見受けられるため、SCRCAL.EXEにも同様な措置が必要。
プログレス表示について
今までeasybackupのスクリプトにおいて、プログレス表示として1ディレクトリの処理事にprintf(".")を実行していたが、これにより著しいパフォーマンス低下が判明しました。プログレス表示については、Ver1.0.2.0から導入されたstatus関数の使用が望ましい。
64ビットバージョン
Version 1.1.0.0より、32ビットバージョンから64ビットバージョンに変更になりました。正規表現を使用している場合は、bregonig.dllを64ビットバージョンに置き換える必要があります。

[更新履歴]

2023/12/10  Ver 3.0.0.0
	- To introduce and use long long int as default num type.
	- To disallow ambiguous expression snum() or str().
	- To have type declaration for argument in function prototype.
	- To have proper integer precision.
	- To use variable index instead of string copy in string stack operation for performance improvement.
	- To fix sporadic Memory leak error in tasksw2.tst.
	- To fix sporadic bull video in dshowplay. 
	- To fix initial fit size malfunction in viewbox().  
	- To fix mouse left click malfunction in viewbox().
	- To fix overflow with large font in gpbox().
	- To fix internal free function error with long file name in argument.   
	- To remove binary feature.
	- To support getexelinenum().
	- To support iadd(), idiv() and imul().
	- To support fspread(), fsdread().
	- To support >>=, <<=.
	- To support undef().
	- To support signmode().
	- To add keyin(key,,2)  
	- To support killprocess()
	- To support bitmap/jpeg feature in getclipboarddata().
	- To show dropdwon by up/dwon key in gpbox window.
	- To support clear log screen.
	- To add return code for PF key in gpbox().
	- Used handle number base entry in hotkeyact.tst 
	- Added vk_snapshot
	- Used viewbox and open history display in search_open.tst
	- Sound device selection script for windows 11

2022/11/28  Ver 2.1.2.0
	- To fix a bug and performance improvement in string operation.
	- To fix a bug in bookmark feature and add help in dshhowplay.tst.

2022/11/04  Ver 2.1.1.0
	- To fix a bug in comma operator.
	- To improve performance by code reduction in variable access.
	- To support binary format in file IO.
	- To change reserved variables as read only.

2022/09/03  Ver 2.1.0.0
	- To improve array variable access performance. 
	- To fix goto() malfunction in for loop.
	- To fix split table overflow error in match().
	- To fix open scrcal and hit enter causes app crash,
	- To fix a crash and a memory leak error of binary run.
	- To show script line number info for runtime error.
	- To add viewbox().
	- To add wmiproc().
	- To add enumfontc().
	- To add strchr() strrchr().
	- To add strpbrk()
	- To add strtok(), strtokstr().
	- To add ctrlwin(hw,iswindow).
	- To allow end of the string position in strstr().
	- To add return code 6,7 in waittime.
	- To enable scroll bar for launch menu.
	- to adjust proper window size with large font for dialogbox2, launchmenu.
	- To fix error with comment inside function.
	- To exclude continue for switch().
	- To add end offset option in match().
	- To fix esc is not working for waittime().
	- elseif is inhibited.
	- Enable resume play for playlist in dshowplay.tst
	- Added searchfile.tst/myconfig.tst/colorsample.tst/cpumon.tst in example.
	- Updated matchgrepv.tst, folsize2.tst and largefl.tst with viewbox().

2022/02/05  Ver 2.0.5.1
	- To remove external DLL dependencies.
	- To fix memory leak error in gpbox.
	- To fix copy/paste failure in gpbox. 
	- To allow more text in combbox of gpbox
	- To enlarge MAXTHREAD in regex.
	
2022/01/16  Ver 2.0.5.0
	- To fix application crash after executing a script twice.
	- To allow null string return with the key in readini().
	- To allow null string return without error in cutstr().
	- To add flag wn in fopen() to avoid overwriting existing file.
	- To support regular expression with match(),matchval(), matchstr(), subs(), subsstr().
	- To fix incorrect return code handling in movefile().
 	- To support none for combinatoin key in direct hot key.
 	- To add return code 5 for wm_setfocus in waittime.
	- To add infobox(title, string). 
	- getsysteminfo(3, num) is added for the case of "generic PnP monitor" by getsysteminfo(0, num) 
	- Added hotkeyact.tst, matchgrep.tst, youtubectl.tst, search_move.tst, substitute.tst in example. 
	
2021/05/31  Ver 2.0.4.0
	- To support compilation to make binary execution file.
	- To change arg_xx handling as constant string for binary support.
	- To use carg_xx for call().
	- To support getsysteminfo().
	- To handle nested case of #IF - #ENDIF.
	- To support switch statement.	
	- To support ?: conditional opeartor.
	- To support ! as logical not. 
	- To support dshow(style, value)
	- To make separate DLL for multimedia functions.
	- To minimize edit window area for auto execution.
	- To add append mode for gpbox().
	- To support do-while loop.
	- To add split line feature for dialogbox2().
	- Dropped vk_*button in getwmchar(1).
	- Updated search_open.tst to have sort feature and use append mode for folder. 
	- Updated clipboardpaste3.tst to have hdrop to text conversion feature.
	- Updated tasksw2.tst for auto second monitor transition with specific monitor.

2021/01/08  Ver 2.0.3.0
	- To use secured way to make another window foreground for ctrlwin(), msgbox().
	- To fix a bug in continue statement(oops).
	- To add direct hotkey launcher feature.
	- To deploy DLL structure.
	- To add ctrlhv().
	- To add mastervol().
	- To add getasynckeystate().
	- To add dshow().
	- To fix potential deadlock in waittime().
	- To add functionstr and returnstr() for string type of user function.
	- To add usbeject().
	- To add setprog() for progress indicator.
	- To add infobox(tbs,..), infobox(tbp,...) and infobox(style,value).
	- To enable other keys than alphanumeric for hotkey.
	- To add vertical scroll bar feature in dialogbox2.
	- To change default of dialogbox2 as topmost.
	- To add desktopline(cl,colorval)(vd,xpos)(vb,xpos).
	- To add topmost window option for gpbox().
	- To add other size application ICONs.
	- To add vk_*button in getwmchar(1).
	- To fix delayed key input in clipboardmon().
	- To fix malfunction of timer feature of msgbox.
	- Changed runkey default to ctrl+s.
	- Removed setfocus at run.
	- Updated tilemv4.tst to add custom size in example. 
	- Added tasksw2.tst, dshowplay.tst, usbeject.tst in example. 
	- Updated hzvtline.tst to enable vertical line in example. 
	- Updated soundvol5.tst in example.
	- Dropped getkd().

2020/05/15  Ver 2.0.2.0
	- To add retry for openclipboard failure in getclipboarddata.
	- To fix invalid token after command error in exeline.
	- To fix program is too big error in exeline.
	- To fix keyboard recognition delay in waittime.
	- To allow comment line between function() and {.
	- To fix fontheight is not working without fontname. 	 
	- To support for_loop.
 	- To Add registerhotkey(),unregisterhotkey().	
 	- To Add gpbox().	
	- To set inputfocus on tvbox window
	- To impliment charret in tvbox()
	- Updated tvbox_exp.tst in scr folder to enable keyboard shortcut.
	- Updated clipboardmon.tst and clipboardpaste3.tst to support hdrop type.
	- Updated grep2.tst to enable user interface with gpbox().
	- Updated mousemove2.tst with hot key usage and 1-9 for small pixels drag.
	- Updated search_open3.tst to enable user interface with gpbox().
	- Updated cntuptimer3.tst with hotkey usage and inputfocus indication.
	- Updated hzline2.tst with hotkey usage.

2020/03/28  Ver 2.0.1.0
	- To fix button is not working in launch menu.
	- To enable Comment /*-----*/.
	- To add mousebtn(leftdown), mousebtn(leftup)
 	- To add iscursor(arrow) iscursor(hand)
 	- To add tvbox().
	- Updated ラジオ再生.tst in example.
	- Updated mousemove2.tst in example.
	- Added tvbox_exp.tst in example.

2020/02/23  Ver 2.0.0.0
	- Enabled compiler to produce machine instructios for better performance.
	- To fix wrong display of negative value in printf.
	- Spec change for desktopline()
	- Added new options, font1, msgs1, msgu1, backc, keyc, alpha for infobox().
	- dirsetptr() function dropped.
 	- Added setfileattribute() description in help.
 	- -1 option added for waittime command.
 	- To fix waittime malfunction with concurrent process.
	- Added dialogbox2() function.
	- Updated example of underline on desktop.
	- Updated example of Tile move with various size.

2019/08/24  Ver 1.1.0.0
	- Changed to 64bit version.
	- Changed way of evaluation as it conforms C lang standard for '&&' and '||'.
	- To fix malfunction of waittime command with key input event.
	- To fix malfunction of logging command.
 	- Used WM_KEYDOWN for waittimecmd key input evenet
	- Changed the spec of kbhit() and getwmchar to add WM_KEYDOWN msg usage.
	- Added clipboardmon().
	- Changed getclipboarddata() as bool function.
	- Added example of Mousemove by INI file or arrow key
	- Added example of copipe with clipboard monitor

2019/04/08  Ver 1.0.3.0
	- To fix argument parser error in user function.
	- To fix lower performance in large script load.
	- To update fopen() to support ShiftJIS and UTF8.
	- To delay CreateFile for rw of fopen.
	- To fix abnormal operation at exit on failure.
	- To add \\?\ in copyfile command for easybackup.
	- To add shutdown(monitor_off).
	- To add setfileattributes().
	- To add strbreg() with bregonig.dll.
	- update an example of easybackup to fix access error in delete.
	- Modified count up timer example.
	- Added default size in an example for Tile move with various size.
	- Added grep example.
	
2018/12/30  Ver 1.0.2.2
	- To fix %s conversion error in printf function.
	- Modified clipboard script example.
	- Modified tile move with various size example.

2018/12/26  Ver 1.0.2.1
	- To fix internal free function error during Script Enroll.
	- To add ti parameter for waittime().
	- T add color option for infobox(font,..).
	- Modified count up timer example.
	- Added script example,Move the window under mouse cursor in tile position with 1/2, 1/4, 1/9 size.

2018/12/16  Ver 1.0.2.0
	- To add status bar and status function.
	- To add special variable hwndinfobox.
	- To add progress indication for large script file.
	- To make ctrlwin function as numeric function with some enhancements.
	- To add getforegroundwindow feature in gethwnd function.
	- To add getfilelinecnt function.
	- Modified easybackup example to remove unnecessary spaces in second script.
	- Modified count up timer example.

2018/08/20  Ver 1.0.1.0
	- To fix several potentials of app crash.
	- To fix malfunction of monrect variable usage in printf.
	- To fix scrcal.ini corruption.
	- To fix malfunction of sort by filedate in dirsort.
	- Changed the way of script input.
	- Changed variable structure for performance.
	- Changed file pointer structure for performance.
	- Changed directory pointer structure for performance.
	- 0 option as leading zero for printf.
	- Added count up timer in script sample.

2018/05/06  Ver 1.0.0.5
	- To fix no class name of window.
	- To add drag and drop support.
	- add special variable hwndmine.
	- update an example of Alarm.

2018/04/22  Ver 1.0.0.4
	- To fix incorrect display of long string in script log window.
	- To fix malfunction of Hide/show others.
	- To fix malfunction of infobox.
	- To fix incorrect execution time.
	- To add tolowerstr, kbhit, getwmchar function.

2018/04/01  Ver 1.0.0.3
	- To fix app crash by opening ANSI file.
	- add a option in strstr.

2018/02/12  Ver 1.0.0.2
	- To fix app crash in readini,writeini, and deleteini commands.
	- For performance improvement.

2018/01/25  Ver 1.0.0.1
	- To fix app crash caused by hot key usage during a run.
	- To fix malfunction of calling user function with a parameter of local string variable.

2018/01/12  Ver 1.0.0.0
	- Initial release