basyura's blog

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

Simple Clock App for Windows

タスクバー非表示教なので、時間を確認するのに一手間必要。仕事中はノート PC + 外部ディスプレイ二枚構成なので、そのうちの一つに時計を表示している。時計アプリを探したけどコレというものがなく、https://watch.onl.jp サイトを Vivaldi のアプリケーション機能を使って表示することを長らくやっていた。

特に困ることは無いけど、Vivaldi のアップデートに巻き込まれて再起動した際の位置移動とか、たまに cookie 切れか背景白で上がってくるのでダークモードに変える手間があるぐらい。

ただ、ウインドウサイズが最小にしても大きいとか、タイトルバーが要らないとかが気になっていたので ChatGPT を使って生成してみた。

ChatGPT 4o を使っているが、今回に限らず生成内容は大丈夫なのだけど応答しなくなることが頻発して効率が悪い。そもそもサイトが読み込まれなくなるとか。ブラウザを切り替えたら直後は大丈夫だったりするので頻繁に切り替えながら生成してた。

指示をリスト化して、で出力された内容

  1. アナログ時計を表示する C# のプログラムを生成して
  2. WPF で実装して
  3. namespace を Clock にして
  4. Canvas の usingが不足しています
  5. 実行時のエラー対応
  6. 0 から 11 までの時間を表す文字を表示して
  7. 背景を黒にして
  8. タイトルバーを黒くして
  9. マウス操作でドラッグできるようにして
  10. ウインドウサイズを変えられるようにして
  11. カーソルをウインドウの境界に移動すると、ポインタをドラッグ可能な形に変えて、マウス操作でウインドウサイズが変えられるようにして
  12. ドラッグ中は描画を止めてください
  13. サイズ変更は縦と横が 1:1 になるように制限してください
  14. 時計の外側の背景を透明にして、カーソルが時計の上にあるときだけ黒で表示するように修正して
  15. タイトルバーを非表示にしてください
  16. カーソルがウインドウ内にある場合だけウインドウの枠に色をつけてください。枠の色は今より薄くしてください
  17. カーソルが外れた際に背景を透明にするのは 1s 後にしてください。1s 以内にカーソルがウインドウ内に戻ったときの考慮も入れてください
  18. ウインドウの枠は Brushes.DarkSlateGray に、ウインドウを離れて透明化するまでの時間を 1s から 0.5s に変更してください
  19. 左下をドラッグした場合もサイズが変更できるようにして
  20. 中央に日付を m/d (曜日) のフォーマットで表示して
  21. 日付が表示されません
  22. 日付が見えません(表示されません)
  23. 表示位置を下げてください
  24. Windows + D キーを押した際も最小化されないようにできますか

割と満足だけど、なかなか思うように生成されないというか意図が伝わらない事がちょいちょいある。今の仕事の状況と同じなので慣れているとも言えるが、僕の指示が悪いとも言える (反省はしてない)。

Windows + D したときに最小化されず、定位置に埋め込まれているような振る舞いをさせたいのだけど ChatGPT さんは無理だと言ってる。タイマーで位置をキープするようするとか考えたい。

最近の go 触り

とある端末で gopls の挙動がおかしかった。go.mod を作った際のバージョンが

go 1.21.1

だとが動かなくて (補完が効かなくて)

go 1.21

と、三桁目を消すと動く(補完が効く)のがおかしいなぁとは薄々思っていつつ特に困らなかったのでそのままにしてた。

とある便利ツールを作るときに sammber/lo を使おうとしたら gopls が謎のエラーを吐いてくる。引数がおかしいと。sammber/lo の document を見ても合っているし、go build でコンパイルが通るので実行は問題ない。 vim + gopls の場合だけ。

流石にそろそろ lo.Map(...) とか使ってある程度は簡潔に書きたいと思うので、vim のバージョンを上げたり vim-lsp のバージョンを上げたり :LspInstallServer を何回かしてみたりしたけど改善しない。

動いている端末と設定を一つずつ比較するか・・・の前になんとなく which gopls を実行したら分かった。古い gopls にパスが通ってた・・・。vs code で go を書いてみようかとしたときの残骸なのかよくわからないけど、これを消して解決。

go は vim + gopls で書くのが快適だ。

Inkdrop - 空白調整

先に結果

before after

狭くしたい

特に Distraction Free 表示 (サイドバーとノート一覧を非表示) にして使う場合などにタイトル部やメタ情報の領域の空白が気になってしまう。でかいモニターを使えば気になくなりそうではあるけど、でかいモニターを使うと目がしんどいので 21.5 inch にとどめている。そろそろもう少し大きくしても大丈夫ではと思っているけど、検証が難しい。買って無駄になるのも辛いし。

Styles.less

いじればいけるとは思うのだけどうまくいかない。右上 X の下にある の位置がうまくいかない。単純に .editor-meta-tags の位置を上げると X と被る上に絶妙に押せない。うまく押せないと X でウインドウが閉じてしまう。いっそのこと X を消して調整も試みたけどしっくりこない。

init.js

css でうまくいかないので js で。ボタンを取り出して .note-tags-bar-input にぶち込む。

inkdrop.onEditorLoad((_) => {
  const more = document.querySelector(".editor-header-more button");
  more.style.position = "absolute";
  more.style.marginLeft = "-25px";
  more.style.background = "none";
  more.style.border = "none";
  more.style.cursor = "pointer";

  const g = more.querySelector("g");
  g.setAttribute("stroke", "darkgray");

  const tags = document.querySelector(".note-tags-bar-input");
  tags.appendChild(more);
});

まとめ

まんぞく。

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

また変わった。fruitjuice とは。

- let ele = document.querySelector("button[data-testid='send-button']")
+ let ele = document.querySelector("button[data-testid='fruitjuice-send-button']")

全体

// ==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';

    document.body.addEventListener('keydown', function(e) {

        // Enter キー以外は何もしない
        // Mac の vivaldi でのアドレスバー等での予測変換の考慮を karabiner-elements を設定しているため。
        if (e.key != 'Enter' && e.key != ']') {
            return;
        }

        // 送信 (ctrl + enter) じゃない、または変換中はイベント中断
        if (!e.ctrlKey || e.isComposing) {
            e.stopPropagation();
            return;
        }

        // イベント発生元がテキストボックスじゃない場合
        if (e.srcElement.id != "prompt-textarea") {
            return;
        }

        // 送信ボタンをクリック
        let ele = document.querySelector("button[data-testid='fruitjuice-send-button']")
        ele.click();

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