おいしいマクロの作り方 (6)

前回までの流れ

 第1回 第2回 第3回 第4回 第5回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
  • とりあえず作ってみた

動作検証する

いよいよ前回作ったものを[es]で動かしてみるわけですが・・・案の定動きませんw ということでデバッグ作業開始です。
CondExecは-debug=TRUEオプションをつけて起動するとデバッグモードになって、エラーチェックやアプリ実行パスを都度表示してくれるので、これを積極的に活用すると楽です。今回は、

  • 起動するためのランチャ設定orショートカット
    • プログラム=\Program Files\CondExec\CondExec.exe
    • パラメータ=-debug=TRUE -section=MannerToggle
      • そういえばこれ、前回書き忘れてました(^^;
  • ExecMulti execmulti.iniの[MannerTimer]セクション
    • \Program Files\CondExec\CondExec.exe|-execmode=open -showicon=true -debug=TRUE -section=MannerTimer

のように修正します。-debugは必ず-sectionより前に指定してください
また、CondExecやDoNothingのアイコンを表示しておくと状況を把握しやすいのでお勧めです。

CondExec CondExec.ini(実際に実行する部分)
[MannerToggle]
class=DoNothing
title=MannerTimer
check=current
trigger=running
exec=close
onunmatch=\Program Files\SimpleMenu\SimpleMenu.exe|MannerTimer.ini

check=currentとtrigger=runningを追加しました、省略時のデフォルト値を勘違いしてたためです(^^;
さらに行頭にTab文字入れてたら動かなかったんで削りました、これも勘違い(^^;

SimpleMenu MannerTimer.ini
[30分]
\Program Files\execmulti\execmulti.exe|MannerTimer_30

ここは問題ありませんでした。

ExecMulti execmulti.ini
[MannerTimer_30]
exec=\Program Files\DoNothing\DoNothing.exe|-execmode=open -alivetime=1800000 -showicon=true -title=MannerTimer
exec=\Program Files\execmulti\execmulti.exe|MannerTimer

[MannerTimer]
exec=\Program Files\SetManner\SetManner.exe|/on
exec=\Program Files\IfMsg\IfMsg.exe|マナーモードを設定しました
exec=\Program Files\CondExec\CondExec.exe|-execmode=open -showicon=true -section=MannerTimer

execが抜けてました、なんたるイージーミス・・・
そして30分=1800秒=1800000秒ですね、2桁も足りないでやんの(^^;
ただ、動作検証の際はつど30分待つのも面倒なんで短めにしてテストしたほうがいいです。

CondExec CondExec.ini
[MannerTimer]
class=DoNothing
title=MannerTimer
mode=both
trigger=closed
exec=\Program Files\SetManner\SetManner.exe|/off
exec=\Program Files\IfMsg\IfMsg.exe|マナーモードを解除しました
polling=10000

modeじゃなくてcheckでした、お恥ずかしい・・・(^^;;
前述のとおり行頭のTab文字も削ってます。



一通り動作検証が済んだら、-debugオプションを外して、タイマー時間も延ばして、利用時と同じ状況での最終検証をします。ここで問題点が見つかることも多々あります。というか今回のマクロもここで重大なのが見つかったわけでして・・・

ctrlswapminiはとっくにminiじゃないと思う

W-ZERO3[es]で2タッチ(ポケベル)入力を実現できるアプリ「ctrlswapmini」がバージョンアップしましたよ!しかも2日連続!!
その気になる変更点は以下のとおりです。

v0.17 の変更点 
起動画面で左ソフトキーがきかないバグを修正しました。 
WS003SH/WS004SH用に QWERTYキーをテンキー扱いするモードを追加しました。 
vkmap/vkmapl を使ってキーの入れ替えマップを定義できるようになりました。 
action command に画面回転できる ROTATE を追加しました。 
v0.18 の変更点 
-s で起動した直後だけ tasklist に表示されてしまう問題修正しました。 
2タッチ入力時の1打目を[クリア]でキャンセルできるモードを追加しました。 

v0.17のキーボード側をテンキーとして使う=無印03でも使える機能も便利ですが、今回の注目ポイントはそこではありません。
それはv0.18の2タッチ入力の1打目をキャンセルできるモード! 今までは1打目を間違えたら、

  • もう1打入れて(1文字入力)から[クリア]を押す(1文字削除)
  • 左キーを押して(1打目キャンセル)から右キーを押す(元の位置に戻す)

のどちらかで対応してたんですが、もうそんな必要はありません!

  • [クリア]を押す(1打目をキャンセル)

だけでいいんですよヒャッホー!! これは大げさではなく、2タッチユーザー全員が渇望していた機能だと思います!

ということで、唯一の弱点を克服したctrlswapminiをDORはこれからも応援し続けます!!!

おいしいマクロの作り方 (5)

前回までの流れ

 第1回 第2回 第3回 第4回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
    • 実行するとするとマナーモードになる
    • タイマーで指定した時間が経つとマナーモードを解除する
    • マナーモード中に再度実行すると、マナーモードを解除する
    • タイマー時間はリスト表示型ランチャーから選ぶ
  • 一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する
  • 処理開始(CondExecかExecIf)
    • タイマー起動中ならマナーモード終了処理
      • タイマー起動中=DoNothing起動中
    • タイマー未起動ならリスト表示(SimpleMenu)
  • リスト表示(SimpleMenu)
    • 30分(ExecMulti MannerTimer_30)
      • DoNothing 30分後に終了するよう起動
      • マナーモード有効化(SetManner)
      • CondExec(DoNothing監視)起動

マクロを作る

ここまで設計が固まったので、いよいよマクロを作っていきます。
各ツールの設定は、一から作ると分かりづらいと思いますので、既存の設定やマクロを修正していくと楽です。

CondExec CondExec.ini(手動で実行する部分)
[MannerToggle]
	class=DoNothing
	title=MannerTimer
	exec=close
	onunmatch=\Program Files\SimpleMenu\SimpleMenu.exe|MannerTimer.ini

CondExec、ExecIfのどちらでも対応できるのですが、今回は利用アプリ数を少なくするためCondExecを使っています。

SimpleMenu MannerTimer.ini
[30分]
\Program Files\execmulti\execmulti.exe|MannerTimer_30

他の時間はこの時点では省略します。テストしたら動かなくて作り直し、の手間を最小限にするためです(^^;

ExecMulti execmulti.ini
[MannerTimer_30]
\Program Files\DoNothing\DoNothing.exe|-execmode=open -alivetime=18000 -showicon=true -title=MannerTimer
\Program Files\execmulti\execmulti.exe|MannerTimer

[MannerTimer]
\Program Files\SetManner\SetManner.exe|/on
\Program Files\IfMsg\IfMsg.exe|マナーモードを設定しました
\Program Files\CondExec\CondExec.exe|-execmode=open -showicon=true -section=MannerTimer

MannerTimer_XXとMannerTimerを分離して、後で時間を追加する場合のメンテを楽にしてみました。

CondExec CondExec.ini
[MannerTimer]
	class=DoNothing
	title=MannerTimer
	mode=both
	trigger=closed
	exec=\Program Files\SetManner\SetManner.exe|/off
	exec=\Program Files\IfMsg\IfMsg.exe|マナーモードを解除しました
	polling=10000

マナーモード終了まで長時間常駐し続けるため、チェック間隔(polling)を標準の50ミリ秒から10000ミリ秒=10秒に変更してます。



これで動けばいいんですが・・・まぁ一発じゃ動かないでしょう(ぉぃ

おいしいマクロの作り方 (4)

前回までの流れ

 第1回 第2回 第3回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
  • マクロには以下の機能が必要
    • 起動するとマナーモードになる
    • タイマーで指定した時間が経つとマナーモードを解除する
    • マナーモードを解除した際にタイマーが残らないようにする
  • 具体的な実現方法は以下のとおり
    • A.CondExecのタイムアウト処理を使う
      • A1.CondExecの監視対象のアプリを起動してCondExecを終了する
      • A2.別のCondExecを終了オプションで起動し、CondExecを終了させる
    • B.一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する
  • BよりAのほうがスマートなのでこちらを採用する、A1・A2は保留

仕様を詳しく決める

まだ決めることの出来ない部分があるので、さらに具体的な仕様を決めます。

タイマー時間をリスト表示し、そこから選んでマナーモードにする
  • 時間を1分単位で指定できれば理想なんですが、やり方を思いつかなかったんでリスト表示から選択することにします
  • リスト表示型のランチャーということで、今回はSimpleMenuを使います
マナーモード中に再度実行すると、マナーモードを解除する
  • トグル式に処理を切り替えます
  • このように状況によって処理を切り替える場合、CondExecかExecIfを利用します

仕様を元に設計する

A.CondExecのタイムアウト処理を使う
  • 処理開始(CondExecかExecIf)
    • タイマー起動中ならマナーモード終了処理
      • タイマー起動中=CondExec(Timer_XXmin)起動中
    • タイマー未起動ならリスト表示(SimpleMenu)
  • リスト表示(SimpleMenu)
    • 30分(ExecMulti MannerTimer_30)
      • マナーモード有効化(SetManner)
      • CondExec(MannerTimer_30=30分後にタイムアウト)起動
    • 60分(ExecMulti MannerTimer_60)
    • 120分(ExecMulti MannerTimer_120)

タイマーとして起動するCondExecは、タイムアウト時間をそれぞれ指定する必要があるため、時間に応じた別々のタイトルを持つことになります(MannerTimer_30、MannerTimer_60...) そのため、チェック対象のタイトルを1つしか指定できないCondExecは使えません。全てのCondExecのタイトルをExecIfでチェックします。
結果、ExecIf、ExecMulti、CondExecのそれぞれでタイムアウト時間ごとの設定を行う必要があるわけです。これだとどうも美しくありません。そこで前回没にしたB案を再度見直してみます。

B.一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する
  • 処理開始(CondExecかExecIf)
    • タイマー起動中ならマナーモード終了処理
      • タイマー起動中=DoNothing起動中
    • タイマー未起動ならリスト表示(SimpleMenu)
  • リスト表示(SimpleMenu)
    • 30分(ExecMulti MannerTimer_30)
      • DoNothing 30分後に終了するよう起動
      • マナーモード有効化(SetManner)
      • CondExec(DoNothing監視)起動
    • 60分(ExecMulti MannerTimer_60)
    • 120分(ExecMulti MannerTimer_120)

DoNothingは起動時にパラメータで起動時間を与えられるため、別々の起動時間に同じタイトルを与えられます。A案で問題だった設定が面倒な点が解消されているわけです。

  • A案:設定は複雑だが常駐アプリが1つだけ
  • B案:設定が簡単だが常駐アプリが2つ

前回の決定を覆すようでアレですが、運用が簡単なB案でいくことにします。
作ってる最中に方針が変わることなんて、マクロ作りではよくある話なわけですよ(待て

おいしいマクロの作り方 (3)

前回までの流れ

 第1回
 第2回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
  • マクロには以下の機能が必要
    • 起動するとマナーモードになる
    • タイマーで指定した時間が経つとマナーモードを解除する
    • マナーモードを解除した際にタイマーが残らないようにする

使用するアプリを選ぶ

実現する機能が決まったら、それをどのように実現するか考えながら、マクロを作るために使うツールを決めていきます。
基本的にCondExecを使って、それでは面倒だったりできない部分をExecMulti、ExecIf、DoNothigやその他のツールで補完していきます。

マナーモードの設定/解除を行う

マクロ内で使う場合、設定/解除をパラメータとして直接指定できるものが必要です。
ということで今回はSetMannerを利用します。

一定時間経ってからSetMannerを実行する

時間経過後のアプリ実行は、CondExecを使うと以下のように実現できます。

  • A.CondExecのタイムアウト処理を使う
  • B.一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する

AでもBでもできることは一緒です。
ただ、タイマー処理中に常駐しているアプリがA=1個、B=2個であり、Aのほうがよりスマートでしょう。
ということでAを採用します。

タイマーを途中で止める

タイマーを止める=CondExecを終了してやるわけです。

  • A1.CondExecの監視対象のアプリを起動してCondExecを終了する
  • A2.別のCondExecを終了オプションで起動し、CondExecを終了させる

A1でもA2でもCondExecを終了するために別のアプリを起動していますので、A1もA2も大した差がありません。

ここでは保留にしといて、どちらを利用するかはさらに設計が進んだ段階で再検討することにしましょう。

我欲するこんなアプリ

秋の夜長のマクロ作りに(というか文章を書くのに)飽きたので、休憩がてら今欲しいツールのことなんかを。
連載がちっとも進まないのはあまり気にしないでくださいorz

レジストリ値の変更を監視できるツール

  • チェック方法を現在/変更時/両方を指定できる(CondExecみたいに)
  • チェック内容を追加/変更/削除を指定できる
  • 追加/変更の場合は、レジストリ値によって処理が分岐できる
    • 例えば「0と0以外」「0と1とその他」みたいな感じ

こういった情報を参考に「メール受信時に○○」とか「マナーモード解除時に××」ってのが簡単かつ確実にできるように・・・

超軽量ランチャ

  • ランチャ起動時に引数で設定ファイルを指定できる
  • 文字列でメニューを表示する
    • 各要素には表示名、ファイル名、引数を指定できる
  • 表示位置が指定できる
    • 最初に基準位置として画面の左上、右上、左下、右下を選択すし、そこからメニューの4隅までの距離を指定する
      • 左上/X=0/Y=0:メニュー左上隅が画面左上に来るよう表示
      • 右下/X=0/Y=50:メニュー右下隅が画面右下のバー(太さ50)の上に来るように表示
      • この指定方法だと画面回転時でも同じ場所にメニューを開けるなぁと、というか縦画面/横画面別々に表示位置を指定できればいいだけなんですが(^^;

ExecSelectNew Menu for WM5ShiftLockのメニューなどがイメージとして近いんですが、これらでは実現できないんですよね・・・

ポップアップメッセージ

  • 起動時に引数で指定した文字列を表示する
  • 指定時間での自動クローズが行える

マクロの処理中にメッセージを表示したいんですが、ちょうどいいのが見つからず・・・



「こんなアプリがあるよ」とか紹介していただけると助かります。さらに作ってくれたりするともっと助かります(バキ

おいしいマクロの作り方 (2)

いろいろとバタバタしてて更新やらコメントの返事やら遅れて申し訳ないです(^^;

前回までの流れ

 第1回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
  • マクロには以下の機能が必要
    • 起動するとマナーモードになる
    • タイマーで指定した時間が経つとマナーモードを解除する
    • マナーモードを解除した際にタイマーが残らないようにする

マクロ作りに役立つツールを知る

実際のマクロを設計し始める前に、マクロを作るうえで欠かせないツールを紹介します。

  • CondExec
    • アプリの稼動状況を監視し、アプリを実行し分けるツール
    • 1つのアプリの稼動状況を詳細に判定することができます
    • 各条件ごとに複数のアプリを連続して実行できます
    • 実行中のCondExecを終了させることができます
    • 複数のCondExecを多重起動できます
  • ExecMulti
    • 複数のアプリを連続して実行するツール
    • 途中にスリープ時間も設定できます
    • 複数のExecMultiを多重起動できます
  • ExecIf
    • アプリの稼動状況を判断し、アプリを実行し分けるツール
    • 複数のアプリの稼動状況を順次判定していくことができます
    • 各条件ごとに複数のアプリを実行できます
  • DoNothing
    • タイトルを指定できる、文字通り何もしないツール
      • ExecIfやCondExecと組み合わせて利用します
    • 実行中のDoNothingを終了させることができます
    • 複数のDoNothingを同時実行できます


状況に応じて使い分けることで、たいていの処理は行えます。

1つの処理内で複数のアプリを実行する

ExecMulti、ExecIf、CondExecで実現できますが、通常はExecMultiを利用します。ExecIf、CondExecは必要な場合だけ使ったほうがわかりやすくなります。
なお、途中で止める必要がある場合はCondExecを使います

アプリの稼動状況に応じて処理を変える

ExecIfかCondExecで実現できます。複数のアプリを判定するにはExecIf、それ以外の場合はCondExecを使えばいいでしょう
さらにDoNothingを併用すると多彩な場合分けが行えます。CondExecもタイトルを指定して起動できるのでDoNothingと同じような使い方ができます。


マクロを作るうえでの基本となる考え方は「大は小を兼ねるが、極力小で行え」です。今回紹介したような小回りの利くツールでコンパクトにまとめると、処理も軽くなるし、予定外の動きをされることも減るし、なによりカッコイイ!まさに一石三鳥です。

ということで次回から実際にマクロを設計していきます。