ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】Amazon の商品を編集中のはてなブログに埋め込む。

f:id:yasushiito:20190403184928p:plain

タブを URL 探索できるようになった。

Google Chromecurrent タグで表示中のページの URL を 入力フォーカスを失わずに取得できるようになりました。
その成果もあって、前回にGitHubソースコードページを探しながらタグ挿入できるようになりました
Amazon の商品紹介についても同じような不満があったので今回はそこを改善したいと思います。

コードを修正する。

Amazon の商品紹介を編集中の記事に差し込む処理は既に作成されています。
URL をコピペしてタグを生成する前に Amazon タブを探すように変えるだけで済みますね。

まとめ。

少し便利になりました。
ただ Amazon ってクリックするたびに新しいタブでページを開いていくので、知らない間にアマゾンタブが増殖しているんですよね。
今回の修正の恩恵に与ろうとすると、余分な Amazon のタブをこまめに閉じなければならんかも。


配布中のAutoHotkeyスクリプトの使い方を文章化してみる。

この記事は何?

はてなブログの記事をテンプレートとして利用できるようになったので、AutoHotkeyの記事で導入法を最低限でも紹介できるように頑張ってみました。


この記事に登場するAutohotkey スクリプトについて。

この記事の中で私が作成したプログラムは、全て公開されて無料で配布されています。
誰でも自由に使うことができます。
スクリプトは様々なファイルと連携しながら動作するので、記事中のスクリプトだけでは動作しません。
ご利用にはスクリプト群全体を PC にダウンロードすることになります。
スクリプトは常に更新メンテナンスされていますので、記事とコードに差があることもあります。
利用に関しては下記を参考にしてください。

ダウンロード&インストール。

AutoHotkey公式サイトからAutoHotkeyをダウンロード、インストールしてください。
スクリプト全体をGitHubのリポジトリからダウンロードしてください。
ダウンロードと展開方法についてはこちらをお読みください。

利用方法。

展開したファイルは好きな場所にコピーしてください。
私はdocumentの下にAutoHotkeyというディレクトリを作成しています。
拡張子.ahk のファイルを実行すれば利用できます。
その中でも特別なのはfull.ahkファイルです。
私が頻繁に利用する自動化処理はこのファイルを実行することでホットキーに割り当てられます。
占有されるホットキーと動作の仕様など、詳しくはこちらをお読みください。

【AutoHotkey】ブログの編集フォームにGitHubのソースコードを埋め込む時にGitHubのページを探索させる。

f:id:yasushiito:20190403184928p:plain

タブをいったりきたり。

以前の画期的な成果でワンクリックでGitHubのリポジトリ内のファイルをブログ記事に差し込めるようになりました。

そのおかげで、ファイル差し込み作業がだいぶ軽減されました。
しかし、この機能は事前に差し込みたいGitHubファイルのタブを選択してなければ正常に動作しません。
編集フォームの差し込み場所を確認してから実行しようとすると、あっちのタブこっちのタブと行ったり来たりしてしまいます。
なんだか不毛な動作をしているな。
タブの中からGitHubのファイルを探すことはできんのか?
せめてカレントタブが明らかにGitHub上のファイルでなければ可能な限り努力して探してほしい。
URL のドメイン名からある程度判断できるでしょ。

やりたくてもできなかった。

AutoHotkeyGoogle Chrome から取れる情報はウィンドウタイトルで精一杯です。
URL を取得することは可能ですが副作用なしでの取得は結構難しい。
URL を取得する際に入力フォーカスが URL バーに移ってしまうので、記事を編集している時に URL をゲットしようとすると、編集フォームに入力フォーカスを戻す作業が発生してしまいます。
それで面倒ながらも我慢していたのですが、先日入力フォーカスを汚染することなく URL を取得できるようになったので挑戦可能になりました。

実装してみる。

タブを探す処理。

大前提として必ずしも差し込みたいGitHubファイルを探せるわけではありません。
URL を判断する手がかりはドメイン名くらいしかありません。
リポジトリの中か外かすら判別できそうにありません。
Chrome 上で複数のGitHubページを開いている場合は最初に見つかったGitHubドメインのページを差し込みます。

まずはタブを探す処理の修正です。
タイトルだけでなく URL の判定の要素に加えます。

方針としては次のようなスタイルで行きます。

  • URL が正規表現で一致するものを対象とします。
  • 第3パラメータは URL で省略可能とします。
  • 第2パラメータのタイトルは省略できませんが、空文字列を渡せばタイトルは無視して URL だけでタブを探します。今のところ左一致で判断していますので、タイトルの途中の文字で判定することはできません。
  • 第2第3パラメータ両方与えれば両方一致した物を探します。
  • 戻り値はタブが見つかった場合 TRUE 見つからなかった場合 false が戻ります。

そして今回、タブ移動のタイミングを変更しました。
これまでカレントタブが操作対象では絶対ないと分かっている場合にタブの探索が呼び出されていました。
しかしこれからはカレントタブを確認してから他のタブを探します。
そうしないと、差し込みたいページをタブ選択しているのにブラウザを一周して探すことになります。

タグ差し込み処理。

ブログ差し込み処理はこんな感じです。
GitHubのタブを探しながらセレクトして差し込みタグを作成して、ブログ編集ページをタブ探索しながらセレクトして貼り付けます。
仕様通りに言いつけを守ってGitHubページを選択してから呼び出した場合、 URL 取得が2回走って URL バーが無駄にパカパカしますけど、そこは目をつぶってください。


まとめ。

完全ではありませんが機械が判断できる範囲で努力してくれるようになりました。
これ以上のことはきっと難しいので、きっとイライラしないでしょう。

次は Amazon アイテムの差し込みもこれに対応させたいと思います。

動かすには。

今回の記事に登場するプログラムは、それ一つでは動きません。
いくつものファイルが連携しあって動作します。
動作させるには、AutoHotkeyをインストールするだけでなくプログラム全体をダウンロードさせます。
プログラムは全て共有サイトGitHubで公開されています。

スクリプト全体をダウンロードしたい方はこちら。
github.com
どのボタンでダウンロードすれば良いか分からない方はこちら。
yasushiito.hatenablog.com

狂おしいほどにホットサンド食べたいよ。

今、私の周囲では空前のアウトドアブームです。
毎日のようにキャンプ道具をチェックして毎週末のようにキャンプに出かけます。

「キャンプ帰りにはアウトドアグッズ販売店に立ち寄る。そこで今回の反省を交えながら今度使いたいグッズを購入する。そして次回の休みには新しく参入したアイテムを試すためにキャンプに出かける。」

レンタルビデオを返しに行ったついでに次のビデオを借りてくるようなノリでキャンプしています。
今最もおすすめなアイテムがトランギアのメスティンだそうです。
アルミ製の飯盒で多目的な調理が可能です。
100円均一で売っているような固形燃料を着火して放置しておくだけでご飯が炊ける。
焚き火でメインを料理しながら片手間でご飯が炊けるのが嬉しいそうです。
つまり野外料理でも温かいご飯を食べられるということです。
スープも作れるし。
複数同時に購入しても余ることはありません。
現在とっても品薄で転売案件になっているほどだそうです。

trangia(トランギア) ラージメスティン レッドハンドル TR-309

trangia(トランギア) ラージメスティン レッドハンドル TR-309

こんなやつですね。
サイズのバリエーションがあるので人数や用途に合わせた最適な大きさを選ぶと良いです。
小型のごとくに固形燃料の組み合わせは料亭の一人鍋とにたようなものですから換気に気をつければ家庭内でも使えるかと思います。
目の前で炎で炊き上げるご飯はちょっとしたごちそうです。
子供たちのテンションが上がって普段よりよく食べるそうですよ。

エスビットと同サイズの固形燃料ストーブ

エスビットと同サイズの固形燃料ストーブ

こちらもサイズを確認して……。
しまった。
ホットサンドの話のはずがご飯を炊いている!

話を戻しまして、そんな私はといえば、土産話を楽しく聞くだけです。
そんな話を聞いて、昔は外に出られない自分の境遇にイラついたものですが、ここまで進退状況が悪くなるとそんな気持ちにもならず、自分ができないことを代わりにやってくれるのが嬉しくて仕方がないです。
そして時折時間を見つけては YouTube でアウトドア動画を眺めます。
炭火や焚き火で料理する絵を見ているだけで満足。



とはいえ抑えきれない食欲もあるもので。
今私は無性にホットサンドが食べたいです。

私は障害者施設で生活しているので三度の食事は施設が提供する給食です。
決して悪い内容ではないのですが、一生この内容しか食べられないとなると話は変わってきます。
予算の都合、設備の都合、法律の壁でどうしても出せないものはあるのです。
時々栄養士さんから食べたいものは何ですかとリクエストを受けるのですが、頼んでも出せないものを食べたいというトートロジー
そのメニューの中の一つがタイトルの通りホットサンドです。

悔しいので私が好きな YouTuber動画を貼り付けておきます。
焚き火のスペシャリスト ALPHA TECさんです。

最高の朝食ですよね。

ホットサンド、一般の方々にはごく当たり前の食べ物です。
軽く喫茶店に入れば大金をかけることなくいただけます。
まさに大衆料理。
ところが我々にとっては違います。
施設内の設備ではこんがり焼くという調理法はちょっと難しい。
ましてや一人前ずつ調理するのは苦手です。
炒め物や煮物のように一気に調理できなければ効率が悪くて提供できません。
ホットサンドはまさにその対極にある料理と言えるでしょう。
ホットサンドに限らず、あなただけのために1枚ずつ丁寧に焼き上げた料理って最高に贅沢ですよ。
当たり前のことが当たり前だった頃には分かりませんでしたね。


ホットサンドメーカーについてはこだわりがないので各自勝手に検索してください。
どちらかと言うとレシピで妄想したいので、レシピ本を紹介しておきます。

【AutoHotkey】ブラウザで表示中のページの URL を取得したい。

f:id:yasushiito:20190403184928p:plain

タブブラウザではタブ選択したい。

ブラウザでタブを判別して、目的のタブを選択したいことがあります。
AutoHotkeyではウインドウのタイトルを利用して判別することになります。

表示中のページに判別の手がかりになる決定的なキーワードが含まれるページを表示していれば良いのですが、情報量が少なくてなんともしがたいことも往々にしてあります。
表示ページの URL さえ手に入れることができれば決定的なのですが、 Auto HOT key からはそれを取得することはできません。
キーボードショートカットを利用してブラウザのオプションメニューなどから簡単に取得したいところですが、これが案外できそうでできません。

URL バーがあるじゃないか。

ブラウザには URL を入力する URL バーがあります。ここからからもらうのが最も確実です。
Google Chrome の場合、ショートカットキー Ctrl + L で URL バーにフォーカスできます。
ブラウザがアクティブであれば、このショートカットキーで必ず URL バーをフォーカスしてくれます。
URL バーをフォーカスした瞬間に URL が全選択されるのでそれをそのままコピーすれば良いです。
ただし、フォーカスがすでに URL バーに乗っかっている場合には何もアクションがありません。
より確実に URL をクリップボードに送りたいならば、 Ctrl + Aで全選択します。
つまり、 Ctrl + L、 Ctrl + A、Ctrl + C の順番でキー送信すれば URL は手に入ります。

ここまではググればオッケー、AutoHotkeyのユーザーコミュニティで情報が共有されているかと思います。
私は今のところこのやり方で URL を取得しています。

URL バー取得で問題が出るケース。

URL バーにフォーカスを移すので、表示ページ上のフォーカスを失います。
URL バーから tab キーを送信するとページの最初のフォーカス対象に飛びます。
つまり、入力フォームで編集している時に URL を取得すると、元の入力フィールドに戻ることができないのです。
これは痛い。
キーボードショートカットから何事もなくページ本体にフォーカスを移すそうなものですが?
Autohotkey からも入力ポジションを記憶することはできなさそうです。

Chrome 拡張による解決。

ブラウザにインストールできるなら、 Chrome 拡張の中から URL を取得してクリップボードに転送する機能を備えた物を使えば良いです。
ブラウザが得意とするJavaScript 経由で転送してもらいます。
例えば、以前紹介したCopy URL+で可能となります。
URL をコピーする拡張はたくさんありますので、お好きなものを探してください。
私の場合Cキーを入力したら URL をクリップボードにコピーするように設定しています。

chrome.google.com

何事にも例外はある。

ただしこの方式で失敗するケースもあります。
入力ボックスで入力中の場合。
入力フォーカスを URL バーから安全にページに移すことはできないものでしょうか?
ここさえ乗り切れば問題を克服できそうなのですが。
そして、検索可能な状況まで問題が整備されつつあります。
検索ワード「Google Chrome フォーカスをページに」あたりでどうでしょうか。

ああ見つかりました。

randyumi.hatenablog.com

なるほど。
自分がやりたいことはこの記事の内容で間違いなさそうですが…。

JavaScript でフォーカスを戻す。

URL バーに入力して JavaScript ページを表示させるの?
URL バーを書き換えるのが気持ち悪いですけど…。
騙されたつもりで試してみましたら、期待通りに動いてくれました。

詳しいことは分かりませんが、URL バーから JavaScript を実行できて、スクリプト実行後はページにフォーカスが戻るということなのかな。
それで空っぽの JavaScript を URL バーにコマンド送信すれば、何もしないままページに戻るという理屈のようです。

JavaScript 実行後は URL が元の表示ページに書き換わってくれます。
安心して URL による JavaScript 実行できますね。

試してみる。

実際にAutoHotkeyで試してみます。

手順は次のようになります。

これくらいなら簡単ですね。
Google Chrome 専用です。
ホットキー Windows +1で起動できますから、次のスクリプトを常駐させた上で Google Chrome をアクティブにしてから試してみてください。

入力ボックスとそれ以外の場所で確認してみてくださいね。

まとめ

これで拡張機能を使わなくても状態を壊さずに URL を取得できます。

この方式にも副作用はあります。
クリップボードの内容が破壊されます。
URL バーの状態がリセットされます。
例えば URL を選択中だったり、特定の位置に入力カーソルを配置していたとしても、その状態を破棄されます。
また、 URL バーに入力フォーカスがあった場合は、強制的にページの方にフォーカスを移されます。

【AutoHotkey】連想配列を使って警告メッセージボックスを表示する処理を簡潔に書く。後編

f:id:yasushiito:20190403184928p:plain
前回からの続きです。

問題だらけのマイツール。

これまでのソースコードを見ていただければ分かりますが、処理の続行が不可能な時に黙ってアプリケーションを終了しています。
これはいけません。
プログラムが正常に処理を終わらせるのは当たり前。
プロとアマチュアで差が出るのは異常な状況に出くわしたケースでユーザが混乱しないような丁寧さを実現できているかてところです。
動けばよかろうで手っ取り早く作業を完了させてしまうのはダメな習慣です。
こんなプログラムをコピペして大量生産してしまうの、それこそ負の遺産です。
被害が小さいうちに例外書類を用意したいと思います。

どんな方法が良いか。

例外の対処方法はいろいろありますが、最も簡単確実なのはメッセージの表示でしょう。
ユーザに問題が起きた理由と対処方法をメッセージして対応してもらうことになります。
ただしメッセージボックスは実装が楽ですが、OK ボタンでリアクションしてあげないと先に進まないので自分には嬉しくありません。
タイマーをセットして一定時間が経過したらウィンドウを閉じてもいいかくらいに思ってましたが、 Auto HOT key のメッセージボックスは第4パラメータで数値を与えるだけで簡単に実現できます。
すごく便利じゃ。

目標。

メッセージを出して中断する処理はそこら中にあります。
全てのスクリプトにあると言っても過言ではありません。
頻繁に使う機能ですから可能であれば1行で簡潔に済ませたい。
メッセージの出力と処理の離脱の二つを行って欲しいです。
ここでif 文を使ってしまうと最低2行使ってしまいます。
そこで関数ライブラリにまとめることにします。
警告コードを渡せば、その警告コードにふさわしいメッセージを表示するわけです。

実装してみる。

条件と警告コードをパラメータで渡せば、条件の判断とメッセージの出力とアプリケーションからの離脱を行いたいです。
悩ましいのは誰がいつどこでメッセージを用意するかです。
include を使えば関数を読み込みながら初期化もしてくれるかなと期待しましたが、初期化はできても変数の参照ができません。
どうしても変数の参照と初期化は別のファイルになります。
メッセージはグローバル変数に持つことにします。
呼び出す側はメッセージを入れた変数を用意して初期化する責任があります。

こんな感じでどうでしょうか。
if 文は呼び出し側においたほうが可読性が良さそうな気もします。


メッセージを初期化する処理はこんな感じです。

呼び出す側はこんな感じに事前に変数を初期化してメッセージを設定してもらいます。

そして処理本体はこんな感じ。
多分ソースコードの12行目くらいにあると思いますが、メッセージを出力する条件とメッセージコードを渡しています。


まとめ。

それほどコードの可読性を失わずに警告メッセージを表示できるようになりました。
グローバル変数の初期化をもうちょっとスマートにする方法は今後の課題とします。

【AutoHotkey】連想配列を使って警告メッセージボックスを表示する処理を簡潔に書く。前編

f:id:yasushiito:20190403184928p:plain

配列でプログラムを簡潔に。

Auto HOT key に関わらず、プログラミングを始めるとすぐに処理の手順は同じだけど使うデータが違うという状況に出くわすと思います。

例えば操作したいウィンドウが見つからなくて処理の続行が不可能の場合。
ダメなプログラムでよければ何事もなかったように黙って処理を中断しても良いのですが、ユーザには中断理由が全くわからないので対処できませんよね。
そんな時に警告メッセージを表示させるのが常識なんですが、「ウィンドウが開いていません」みたいなメッセージはあらゆるプログラムで表示されるでしょうから、愚直に作り込んでしまうとプログラムのあちこちで「ウィンドウが開いていません」メッセージを用意する羽目になります。
同じエラーメッセージを何度も落ち込むなんてバカバカしくて仕方ありません。

連想配列を使えば、エラーコードを渡せばそれにふさわしいエラーメッセージを表示させるようなことができます。
これこそが「処理は同じだけどデータだけが違う」やつです。
エラーメッセージよりもエラーコードの方が圧倒的に文字の量が少ないはずです。
内部的にはエラーコードで取り扱って、ユーザ向けにメッセージを表示する時だけエラーコードからメッセージを取り出す。

連想配列は今時の言語なら大抵使えます。ここで覚えておけば後でいくらでも応用が利きます。
もちろんAutoHotkeyでも使えます。

ahkwiki.net

何か色々難しいことが書いてありますが、Objectが連想配列です。
これを変数に入れれば、その変数+キーワードで簡単にデータをセットまたはゲットできます。

実際に使って見る。

動作確認のための小さなプログラムを作ってみました。



Object()で連想配列を準備できます。
変数warnMessageに初期化した連想配列を入れています。

連想配列に値をセットしたり取り出したりするには二つの方法があります。
中にキーワードを入れるタイプ。
もう一つは. (ドット)の後ろにキーワードを入れるタイプ。
違いを確認してみます。

サンプルで動作を確認してみると次のことがわかります。
変数warnMessageに a b c dの四つの文字列、さらに数値の200をキーワードとしてメッセージを代入しています。タイプで代入して.タイプで参照することもできます。
キーワードには文字列だけでなく数値も使えます。
ただし文字列で代入した場合は文字列でないと参照できません。
同様にキーワードを数値で代入したら参照するときも数値にします。
確実な記述法はタイプです。タイプが入力する文字の量が多くてぱっと見わかりづらので、エレガントに書きたい人はドットタイプで書くことが多いです。

気をつけて落とし穴。

注意点は2点あります。
キーワードに文字列型を選択して[]タイプの記述法とる時には必ずダブルクォーテーションで囲んでください。
つまり、代入する時は[”a”] で参照するときも[“a”]とします。
ここでうっかり[a]としてしまうと、変数aの中身をキーワードとします。
aが文字列ではなく変数名と認識されてしまうのですね。

もう一つの注意点がメッセージボックスなどで値を参照する時に%warnMessage.a%のようにパーセントで挟む記述方法が使えません。
実行すると例外が発生して処理を進めることができないのでサンプルではコメントにしてあります。
では連想配列をメッセージボックスで参照できないのでしょうか?
%の後ろにスペースを一つ開ける記述法を使えば参照できます。
メッセージの先頭に% 書いておけば、その行の後ろの変数は %で挟まなくても参照してくれる様です。

時間切れ。

連想配列は便利だから確実に習得したいです。
エラーメッセージを表示する処理の実装までかきあげる予定でしたが、いつもよりはゆっくりめに進めたので、今回は前編ということで一旦ここで終わりにしますね。