basyura's blog

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

AirPods 4

ノイズキャンセルは AirPods Pro に比較すると違和感あるが、無いよりは全然よい。とびらの開けしめなどの生活音が混ざったりすると違和感がある。ちょいちょい耳に圧がある感じ。ノイズキャンセリングをオフにしても若干感じるが慣れなのかはしばらく使ってみないと分からなさそう。

ということで一週間ぐらい使ってみた。

特に音楽に関してはべースとドラムの音がよく聞こえるようになったけど、圧が強いので長時間つける際のしんどさに個人差がかなり出そう。音質が良くなったかと言われたら、好みな印象。

AirPods Pro でおこってた耳だれみたいなのは発生しなさそうなのはよい。ただ、明確にノイズキャンセルを使いたい時以外は AirPods 3 の方が生活や活動に違和感無くつかえて良いなぁと思う。今は。

ChatGpt : Enter で送信したくない - 2024.09.12

Ctrl + Enter で送信、 Enter で改行する Tampermonkey のスクリプト。結構な頻度で動かなくなってめんどくさい。

// ==UserScript==
// @name         ChatGPT
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://chat.openai.com/*
// @match        https://chatgpt.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    setTimeout(() => {
        document.body.addEventListener('keydown', function(e) {
            // Enter キー以外は何もしない
            // ] は Mac の vivaldi でのアドレスバー等での予測変換の考慮を karabiner-elements を設定しているため。
            if (e.key != 'Enter' && e.key != ']') {
                return;
            }
            // Shift + Enter
            if (e.shiftKey) {
                return;
            }
            // 変換中
            if (e.isComposing) {
                return;
            }
            // Enter は改行 (Shift + Enter) に変える
            if (!e.ctrlKey) {
                // 通常の Enter 動作をキャンセル
                event.preventDefault();
                let newEvent = new KeyboardEvent('keydown', {
                    key: 'Enter',
                    shiftKey: true,
                    bubbles: true,
                    cancelable: true
                });
                event.target.dispatchEvent(newEvent);
                return;
            }
            // 送信ボタンをクリック
            let ele = document.querySelector("button[data-testid='send-button']")
            ele.click();

        }, { capture: true });
    }, 3000);
})();

ユニコーンオーバーロード

始めてみた。ファイアーエムブレム エンゲージはムービーをチラ見した感じが微妙に見えてやめた。なのだけど、ユニコーンオーバーロードをしながら昔のファイアーエムブレムやってる時の感触を受けるのが不思議。あれこれキャラクターが出てきて育成を考えながら進んでいく感じ。

画面が 13.3 インチのモバイルモニタだからか、ちょっと目が疲れる。仕事用に使っている 21.5 インチだと、それはそれで疲れるので歳だな。色合いを変えると楽になるんだけど。PC ゲームもいいのだけど、ひたすらマウスでクリックしてるとそれはそれで肩や背中が痛くなるので困る。学生の時は徹夜でネットゲームしてたのにな。歳だな。ずっとゲームしてられると思ったらそうでもないと身にしみる。老化というのは厳しい。

いやぁ、ほんと。いろいろ厳しい。会社は若手育成が完全に失敗してて主力がジジイしかいないのがホントに詰んでる。危険を察知した若者は他へ。なんとかこなそうと残っているのがジジイ(ゲーム関係ない)。これは辛いなぁ。

あー辛い。

cVim : manifest v3 対応 - heartbeat

無くてはならない拡張。vim キーバインドでブラウジングできる。

chrome.runtime.connect({ name: "main" });

connect が定期的に切れるので heartbeat してるのだけど、やっぱり切れる。環境なのかもしれないけど。

async function runHeartbeat() {
  await chrome.storage.local.set({ "last-heartbeat": new Date().getTime() });
}
function startHeartbeat() {
  runHeartbeat().then(() => {
    setInterval(() => runHeartbeat(), 10 * 1000);
  });
}
startHeartbeat();

仕方がないので disconnect されたら connect し直すように修正した。のだけど、heartbeat の interval を 20s から 10s にしたら、そもそも disconnect されなくなった (気のせいかもしれない)。

vivaldi : アプリケーション化したウインドウでのコピペショートカット変更

Mac で Karabiner-Elements を使う場合。

{
  "title": "Vivaldi Apps",
  "rules": [
    {
      "description": "vivaldi apps : copy - Ctrl+C",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "c",
            "modifiers": { "mandatory": ["control"] }
          },
          "to": [
            { "key_code": "c", "modifiers": ["command"]  }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": ["^com\\.vivaldi\\.Vivaldi\\.app.*"]
            }
          ]
        }
      ]
    },
    {
      "description": "vivaldi apps : paste - Ctrl+V",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "v",
            "modifiers": { "mandatory": ["control"] }
          },
          "to": [
            { "key_code": "v", "modifiers": ["command"]  }
          ],
          "conditions": [
            {
              "type": "frontmost_application_if",
              "bundle_identifiers": ["^com\\.vivaldi\\.Vivaldi\\.app.*"]
            }
          ]
        }
      ]
    }
  ]
}

北海道旅行

のんびりする予定で合間の時間がそれなりにある想定だったので 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 のサポートが切れてもブラウジング効率が下がることは無さそうだ。

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