basyura's blog

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

テミスの剣

久しぶりに "小説" を読んだ感。満足。

振り返りと深堀りを兼ねて ChatGPT で "小説版 テミスの剣についてネタバレありで教えて" と依頼してみたが、4o では指摘しても映画版等が混ざって出力される無限ループ化した。o3 だとしっかりネタバレ含めてまとめを出してくれた。小説や映画の後は面白かった以外に細かいところの意味や記憶の定着が前々から弱いので復習を兼ねて相手してくれる ChatGPT は便利だ。

ただ、情報源を見ると Wikipedia をベースに読書レビューの各ブログエントリがメインっぽい。今後、生成 AI が吐き出した適当な内容で Web が汚染され続けられると大変なことだなぁと小物感な感想。

ついでに Wikipedia に 325 円を寄付した (初めて)。

bluesky-shortcuts

Bluesky でもショートカットキーが使えるようになる。

何かしらとバッティングしているのか、読み込みの . キーが反応しないので Tempermonkey で実装。

(function() {
    'use strict';
    document.addEventListener('keydown', function(evnt) {
        console.log(evnt)
        if (evnt.key === '.') {
            let btn = document.querySelector("button[aria-label='最新の投稿を読み込む']")
            if (btn != null) {
                btn.click();
            }
        }
    }, {capture: true});
})();

Vivaldi - Windows の場合だけ特定のスタイルを適用する

Stylus を使ってよく見るサイトは独自スタイルを適用することがよくある。ヘッダー、フッター、サイドバーを消すとか。OS に依存しない場合はいいけど、レンダリングやディスプレイによって微妙に変えたい場合に対応できない。css で OS を判断して分岐できないから。Dropbox と連携して複数環境 (と言っても二台) で Stylus の設定を同期しているので、windows では適用したいけど mac では適用したくないなどがある。特にフォント周り。それぞれの os で同期したときだけ有効と無効を切り替えればいいかと運用してたけど、都度気になってしまうので効率が悪い。Stylus に同期しない設定を追加するような機能追加をすればいいかと思って実装していたけど、npm の実装に依存して対応できなさそうなので諦めた。PR 作るにしてもテストできる範囲は限られてるし。

Stylus じゃなくて Tampermonkey で個別に対応すればいいことに気がつく。以下。

// ==UserScript==
// @name         All Windows
// @namespace    http://tampermonkey.net/
// @version      2025-05-18
// @description  try to take over the world!
// @author       You
// @match        http://*/*
// @match        https://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const style = document.createElement('style');
    style.className = 'self-tampermonkey';
    style.textContent = `
    設定したいスタイル
  `;

    // body がまだ無い場合に備えて
    function insertStyleWhenReady() {
        if (document.body) {
            document.body.insertAdjacentElement("afterend", style);
        } else {
            new MutationObserver((mutations, observer) => {
                if (document.body) {
                    document.body.insertAdjacentElement("afterend", style);
                    observer.disconnect();
                }
            }).observe(document.documentElement, { childList: true, subtree: true });
        }
    }

    insertStyleWhenReady();
})();

また便利になった。

`=` フォルダが作られる

git pull すると = フォルダが作られる。

=
+ system-commandline-sentinel-files
  + dotnet-suggest-registration-git-credential-manager, Version=2.6.1

"dotnet-suggest-registration-git-credential-manager, Version=2.6.1" はファイルで 以下の内容が出力されている。

Exception during registration:
System.ComponentModel.Win32Exception (0x80004005): 指定されたファイルが見つかりません。
   場所 System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   場所 System.Diagnostics.Process.Start()
   場所 System.CommandLine.Invocation.Process.StartProcess(String command, String args, String workingDir, Action`1 stdOut, Action`1 stdErr, ValueTuple`2[] environmentVariables)
   場所 System.CommandLine.Builder.CommandLineB

git-credential-manager が何かしら作用しているようで

DOTNET_SYSTEM_COMMANDLINE_DISABLE_SUGGEST=1

を環境変数に定義することで回避できるとあるけど改善できない。

/etc/profile を編集してみる

ORIGINAL_TMP="${ORIGINAL_TMP:-${TMP}}"
ORIGINAL_TEMP="${ORIGINAL_TEMP:-${TEMP}}"
#unset TMP TEMP
#tmp=$(exec cygpath -w "$ORIGINAL_TMP" 2> /dev/null)
#temp=$(exec cygpath -w "$ORIGINAL_TEMP" 2> /dev/null)
#TMP="/tmp"
#TEMP="/tmp"
case "$TMP" in *\\*) TMP="$(cygpath -m "$TMP")";; esac
case "$TEMP" in *\\*) TEMP="$(cygpath -m "$TEMP")";; esac
test -d "$TMPDIR" || test ! -d "$TMP" || {
  TMPDIR="$TMP"
  export TMPDIR
}

ORIGINAL_TMP="${ORIGINAL_TMP:-${TMP}}"
ORIGINAL_TEMP="${ORIGINAL_TEMP:-${TEMP}}"
unset TMP TEMP
tmp=$(exec cygpath -w "$ORIGINAL_TMP" 2> /dev/null)
temp=$(exec cygpath -w "$ORIGINAL_TEMP" 2> /dev/null)
TMP="/tmp"
TEMP="/tmp"
case "$TMP" in *\\*) TMP="$(cygpath -m "$TMP")";; esac
case "$TEMP" in *\\*) TEMP="$(cygpath -m "$TEMP")";; esac
test -d "$TMPDIR" || test ! -d "$TMP" || {
  TMPDIR="$TMP"
  export TMPDIR
}

改善した。ついでに cgo を使う mattn/go-sqlite3 を使ったビルドをする際も似たような感じ (tmp ディレクトリを認識してない) でエラーが出てたのも改善された。

進撃の巨人

読み返し。単行本が発売されたタイミングで都度読んでいた時は意味が分からんとなって流し読みになっていたけど、改めて読むと分かる。最近だと ChatGPT で質問して理解を深められるのもいい。

ChatGPT.app で Enter 送信したくない

いつまでこの戦いを続けるのか。

  • 入力中の Ctrl+Enter は GoogleIME の予測変換で使う
  • 未入力中の Ctrl+Enter で送信したい
  • Enter は改行したい

Web 版は Tampermonkey で対応したけど (たまに動かくなる) アプリ版は厳しそう。 Enter で誤送信して萎えるよりは Shift+Entetr 送信で妥協する。

GoogleIME キー設定

Composition    Shift Enter     Commit
Conversion     Shift Enter     Commit

Karabiner-Elements 設定

{
  "description": "ChatGPT : Enter to Shift+Enter",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "return_or_enter" },
      "to": [{ "key_code": "return_or_enter", "modifiers": ["shift"] }],
      "conditions": [
        { "type": "frontmost_application_if", "bundle_identifiers": ["^com\\.openai\\.chat$"] }
      ]
    }
  ]
},
{
  "description": "ChatGPT : Shift+Enter to Enter",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "return_or_enter", "modifiers": { "mandatory": ["shift"] }
      },
      "to": [{ "key_code": "return_or_enter" }],
      "conditions": [
        { "type": "frontmost_application_if", "bundle_identifiers": ["^com\\.openai\\.chat$"] }
      ]
    }
  ]
}

で運用していたけど、Shift + Enter 送信の癖が変につくと他で誤爆しそうなので Ctrl+m で送信するようにして試している。

{
  "description": "ChatGPT : control+m to Enter",
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "key_code": "m",
        "modifiers": {
          "mandatory": ["control"]
        }
      },
      "to": [{ "key_code": "return_or_enter" }],
      "conditions": [
        {
          "type": "frontmost_application_if",
          "bundle_identifiers": ["^com\\.openai\\.chat$"]
        }
      ]
    }
  ]
}