最近あったちょっと不便なこと
私は JXA で Google Chrome を Incognito Window (シークレットモード) で開き直す でも述べているように、
頻繁に使うサイトは Fluid で専用アプリ化している。
ところで、各サイトはそれぞれログイン機能を持っていて Cookie で Session を保持している。
それぞれの Session には有効期限がある。
短いもので 30 分間、長いものでは数ヶ月くらいアプリを立ち上げないでいると有効期限が切れてしまう。
アプリをしばらく起動しないでいると、ログインからやり直しになってしまう。
こんな時にまたパスワード入力するのは面倒くさい。
2 段階認証をオンにしているサービスもあるので、手間も 2 倍になる。
(もちろんこれは Fluid だからということではなく、あらゆるブラウザで起きる話。)
対処
そこで、信用できるローカル環境では、しばらく開く予定のない場合も定期的にアプリを立ち上げることにする。
定期的に立ち上げれば、まともなサイトならページを読み込むたびに Session の有効期限が延びる。
次のような方針を考えてみた。
方針
- 対象のアプリに対してそれぞれ
- 現在、起動していればスキップ
- 起動していなければ
- すぐに起動する。
- 読み込みが完了する程度の時間を待機する。 (とりあえず決め打ちで 2 秒とした)
- 終了する。
- ↑ を各アプリに対してシェルスクリプトで実行する。
- ↑ を定期実行する。
実装
せっかくなので、また JXA をつかって次のようなスクリプトを作って対処してみた。
# !/usr/bin/env osascript -l JavaScript
function run(argv) {
argv.forEach(function (appName) {
reloadSession(appName);
});
}
function reloadSession(appName) {
if (isAppWaking(appName)) {
console.log('Skipping:\t' + appName);
return;
}
var app = Application(appName);
console.log('Reloading:\t' + appName);
restartApp(app, 2.0);
}
function isAppWaking(appName) {
var se = Application('System Events')
return se.processes[appName].exists()
}
function restartApp(app, duration) {
if (typeof duration === 'undefined') {
dulation = 0;
}
delay(duration);
return app.quit();
}
# !/usr/bin/env bash
./reloadSesion.js \
'Qiita' \
'AWS' \
'GitHub' \
'Bitbucket' \
'Ikaring'
※ Ikaring とは イカリング のこと。
定期実行
OSX での定期実行については launchd に登録すればいい。
plist を書くのが億劫なときは、 plist ファイルの代わりに YAML を使ってみた のやり方で簡単に書ける。
余談
なお、これを 1 日 1 回のペースで実行することにした。
有効期限が 30 分のものは、ブラウザを開いている間にも切れてしまうことがある。
なので、 Fluid の各アプリに仕込める User Script に 10 分ごとのリロード設定を追加してある。
他のアプリでも開きっぱなしかつ、ずっとリロードしないでいれば同じことが発生しうる。