basyura's blog

あしたになったらほんきだす。

北海道旅行

のんびりする予定で合間の時間がそれなりにある想定だったので MacBook Air を持って行った。のんびりネットしたり文章を書いたりするに良いかなと。

ゲームもできてスペックも良い windows デスクトップマシンをメインとしていたので買ったもののあまり使って来なかった。旅行を通して使ってみると性能的に気になるところは無いしバッテリーの持ちがいい。アンチグレアのフィルムを貼ったことでディスプレイの見やすさが向上して愛着が湧き始めている。キーボードが微妙と思っていたけど慣れなのか特に気にならなくなった。総合的に良い。

家に引き込もってるのもいいけど、カフェ (と言ってもエクセルシオールかスタバかタリーズあたりになるのだが) でドヤリングするのもいいかもしれない。前はよくやっていた。コロナになってから家環境が充実したのもあってあまり出なくなってるが。また始めて見るか。

宿の部屋に Tivoli MSYBTiB6B31 があったので Youtube Music でのんびり曲を流していた。波の音と相まってとても良い。次に住むのは海の近くか山の中がいいかもしれない。

Amazon で見たらそれなりの金額。家の iPad Pro でも音質は悪くないので買うかというと・・・うーん。スピーカーが二つあるので音は割といい印象だし。

Tivoli MSYBTiB6B31 は音が良くも悪くもこもってる感じの印象だけど柔らかい音で聞こえる。木を中心に作られた別荘で聞くと雰囲気が良さそうなイメージ。

夏休みをのんびり過ごせて良かった。

曇りと小雨が多かったけど水平線がずっと見えてて良かった。

cVim : manifest v3 対応

夏休みで北海道に来た。一つの宿に連泊してのんびりしている。

困る

作者の 1995eaton はどこに行ってもうたんや。 2018 年あたりで活動が止まり、たまに動いたと思ったら 2022 年を最後にまた止まった。

僕のブラウジングにおいて無くてはならないものとなった chromium-vim は chrome 拡張の manifest v2 なので、 v3 に対応しないと動かなくなる。

同様に無くてはならないものとなっているブラウザの vivaldi はカスタマイズ性を重視している。v2 も並行サポートしたりしないかと期待したけど最大 2025/06 までのよう。

cVim は MIT license でソースコードもあるから必要な人が Fork して直せばいいだけではある。 念の為、Issue や Pull Request を確認したけど特に無い (どちらも 2022 で止まっているので、使う側も諦めているぽい)。自分が困る前にやるしかない。

対応

manifest.json はルールにそって変える程度。

  • manifest_version を 2 から 3 に変更。
  • background スクリプトの指定を scripts から service_worker に変更。
  • content_security_policy の書式を変更。
  • browser_action を action に変更。

各種 API の変更。動かしてエラーが出るところを随時見直していく。

  • storage
  • XMLHttpRequest → fetch
  • tabs → scripting
  • extension → runtime
  • などなど

設定の読み込み

最初に service worker で取得した設定を保持しているはずが、cmdline_frame.html 経由でページを開くと消える。アドレスバーから開いた場合は設定がある。意味不明でずっとハマっていたが、取れていない場合は storage から取得し直すように対応を入れた。

heart beat

ようやく動くようになったと思って喜んでいたら一定期間後に動かなくなる。ページを開きっぱなしにしていたら、何もしていないのに動かなくなる。

v3 からの仕様で一定期間後?に切断されてしまうようだ。onDisconnect が実行されることは console.log で確認できた。

messenger.js

var port = chrome.runtime.connect({ name: "main" });
port.onDisconnect.addListener(function () {

本来は storage を使ってどうのこうのとか、接続し直してどうのこうのするのが正しいようだけどめんどくさいので定期的にメッセージを送信するように修正。

setInterval(() => {
  keep_count ++
  console.log("keep alive : ", keep_count)
  ECHO("keepalive", {});
}, 20000)

service worker に通信を投げるのも無駄だなと思って記事を読んでいたら、公式に非推奨だけど?回避方法がばっちり書いてあった。

こちらも定期実行で setInterval を使って 20s ごとに storage の api を叩いてるだけ。

let heartbeatInterval;
async function runHeartbeat() {
  await chrome.storage.local.set({ 'last-heartbeat': new Date().getTime() });
}
async function startHeartbeat() {
  runHeartbeat().then(() => {
    heartbeatInterval = setInterval(() => {
      console.log("heart beat")
      runHeartbeat()
    }, 20 * 1000);
  });
}
startHeartbeat()

公式の方法に従う。

eval

元々の cVim には無いのだけど、自分でコマンド (js) を定義して実行できる機能を追加していた。設定画面にあるテキストを読み込んで eval することで実現していた。これが v3 ではできなくなった。

動的に外部コードを読み込むのは難しそう。会社端末には会社用コマンドを追加して常用しているので困る。他の人に公開するわけでは無いので、ローカル編集用 js を置いて各端末で編集すればいいかと思っている。

動いた

自分のスキル的に動作サポートされるギリギリまでかかるかと思ったけど案外うまく行った。動いた。とはいえ、なんとなく調べ始めてから途中で何回か諦めたりして 3 ヶ月弱かかった。

また一つ便利になったというわけではないが、v2 のサポートが切れてもブラウジング効率が下がることは無さそうだ。

コードが大きいので、自分にとって不要な機能は削っていくかな。

MacBookAir M2 2022 にアンチグレアフィルムを貼る

いつだったかなぁと過去の記録 (エントリー) を探したら、購入してもうすぐ一年経つことが分かって愕然とする。どんどん早くなる。毎日無駄に過ごしてるな。

Mac を使い始めて四台目。当初から使っていたクリスタルなんとかフィルムを今回も購入。今まで (最後は八年ぐらい前かも?) は事務所に持ち込みで貼り付けてもらっていたけど、いつの間にか事務所が入っているビル?のロビーか、どこか出張先での待ち合わせてに変わっていた。お願いのメールをしたものの、ドーナツ屋でコーヒーを飲みながらどうのこうのてきな返事が来たので不安になって "雑多なところでやって大丈夫なの?" と返したら大丈夫と回答があった。とはいえ、あなたにとっては沢山ある端末のうちの一つとは思うが、僕にしては唯一なのだ。信用できなくなって日を改めることにした。ドーナツ代をこちらで払うのか?とか、貼り付け終わった後もなんか談笑しないといけないのか?とか考えるとめんどくさいのも大きい。日を開けて改めて依頼したら同じ人からの回答。嫌な予感しかしなかったが依頼をしたら忙しいからどうのこうので来月になるので連絡するといった回答。連絡来なかったけど。想定通り。非常に残念ですメールを書いて終了。メールが来てもルールで即削除するようにしたので返事は要らない旨も添えて。

買ったまま部屋の隅に置いていたのを一念(一年)発起で取り掛かる。

手順

  • 本体の電源を切る。
  • ディスプレイをきれいに拭く。
  • エアダスター (ブロアー) を使ってホコリを飛ばす。
  • 本体ではなくディスプレイ側を下にする。
  • フィルムを貼り付ける。
  • 空気を抜く。

雑な正確なのでちょっとずつ丁寧にってのがなかなかできないのだけど、我ながら過去最高の出来栄えで非常に満足している。良かった。

いろいろあったので次回も同じ製品を買うかは悩みどころ。前の MacBook Pro は 2015 で長く使っていたし、最近は Windows 端末を家でもメインで使うことが多い。どうするか考えるのはだいぶ先。

CraftLaunch - フォルダーを開く

'%' must be followed by '%' or '(', found: "%windir%\\\\system32')"

v3 で対象コマンドのフォルダを開く際に上記のエラーが出るのは認識していたけど、ようやく解決。 気にはなっていたけど、困っていなかった (自分で該当フォルダを開いていた) のでスルーしていた。使用頻度が低い自宅端末が v3 で、会社では v2 を使っている。v2 は特に問題なし。

自分で定義しているのは↑で、どこかから引っ張ってきたと思うのだけど記憶にない。python 得意じゃない (しっくりこない) ので放置状態。デバッグしたところでは ConfigParser の結果からコマンドを取得するところで例外が発生しているのは分かる。

cmds[cmd]

これ以上に分解できない。どうするの?と困ったけど、心強い味方 (ChatGPT) がすぐに教えてくれた。ほんと便利。

- ini = configparser.ConfigParser()
+ ini = configparser.ConfigParser(interpolation=None)

便利。

Inkdrop : sidetoc 2.4.0 release

ヘッダーが無い場合には必要がない (表示するものが無い) ので非表示にしているけど、サイドバーをキー操作で非表示にしてしまっているのか意図的に非表示にしているのか分からないことがあるのでヘッダーが無くても領域を表示するオプションを追加した。

オプションは "常に表示する" にした方がよいかは迷った (将来的にゴチャゴチャしそう)。

keyhac - エラー発生時にコンソールを表示しない

キーカスタマイズツールの keyhac を大変ありがたく常用している。非常に柔軟で便利なのだけど、一点だけ気になるところがある。エラー発生時にコンソールが表示される。

エラー

ERROR : 予期しないエラーが発生しました : _onKeyDown

Traceback (most recent call last):
  File ".\keyhac_keymap.py", line 577, in strToMod
KeyError: '<C'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".\keyhac_keymap.py", line 1335, in setInput_FromString
  File ".\keyhac_keymap.py", line 579, in strToMod
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".\keyhac_keymap.py", line 975, in _onKeyDown
  File ".\keyhac_keymap.py", line 914, in _keyAction
  File ".\keyhac_keymap.py", line 1342, in setInput_FromString
ValueError

こういったエラーが発生した場合にコンソールウインドウが表示される。表示されるけど、 "だから何?" で操作には特に影響が無いのでウインドウを閉じる。日に何回か出る。無視して表示したままにしてもいいのだけど無駄に表示されているのを見ると閉じてしまう。気になる。そもそも表示されないで欲しい。

ソースコードがあるので何日かかけてビルドできるようにしたけど、結果的にはそんなことしなくてよかった。

python コードを直す

keyhac の実行フォルダに library.zip があるので、これを解凍する。 解凍後に作られた library フォルダを library.zip にリネームする。 * .pyc の代わりに対応する .py ファイルを置けば良い。

diff --git a/keyhac_consolewindow.py b/keyhac_consolewindow.py
index 779493b..cf59b01 100644
--- a/keyhac_consolewindow.py
+++ b/keyhac_consolewindow.py
@@ -434,7 +434,7 @@ class ConsoleWindow(ckit.TextWindow):
         class Stderr:
             def write( writer_self, s ):
                 writeCommon(s)
-                self.show(True,False)
+                //self.show(True,False)

         if not self.debug:

今回は keyhac_consolewindow.py を直して格納するだけ。

まとめ

また一つ便利になった。

が、ここまで書いて気がついたけどコメント行は # じゃないのか?内部エラー出てるのかもしれないけど、期待通りになっている (エラーコンソールが表示されない)。