最近の出来事

2025/11/02

AM中に起床。

掃除したり。

そういえば Emacs31系はまだmasterから分岐はしていませんが いつ出す予定だろうか?

Qwen3-VLで画像の内容ではなくフォーマットについて尋ねたところ、なんだかモンヤリした推測交じりの 回答が返って来たり。恐らく画像認識にはデコード済の状態で渡されるので、デコード前のフォーマットに ついては知りえないという事なのだろうと思われます。「仕組み的に元の画像ファイルフォーマットは判らない」と 回答してくれれば良いようにも思うのですが、何やら頑張って推測するようです。

先日アップデートした新しい gptelのチャットでは回答結果に「#+begin_reasoning ~ #+end_reasoning」というブロックが 表示されるようになっているようです。推論の過程が表示されているようで、これらを踏まえて回答結果が表示される という感じになっているようです。gpt-oss:20bでは割とあっさりとした内容ですが、 qwen3:30bでは割と長めの(場合によっては最終的な回答よりも長い)自問自答を行っているようです。 英語で表示されていますが、HTMLにエクスポートしてChromeで表示してページ翻訳すると人間にも意味が判るように 推論していて面白いなぁと思いました。画像認識の場合は色々推論して間違えてるってパターンもあるようです😓。 さておき、reasoningブロックは HTMLにエクスポートすると非表示にはできないので、 回答結果を読むのに邪魔になる場合があります。カスタム変数 gptel-include-reasoning を nilに設定すると reasoningブロックは出力されなくなるようです。

qwen3の推論(reasoning)の中でEmacsユーザーである可能性について触れられている事があったので 「なんで分かるんだ?🤔」と思ったのですが、gptel-directives という変数の中で 「(default . "あなたはEmacs上で動作する大規模な言語モデルで、役立つアシスタントです。詳しく教えてください。")」 って記してあるからっぽい。 言ってなければ判る訳が無いので、判っているという事はどこかで言っているって事になるのかなと思います。 これって対人の時は逆の方向で気を付ける所かも。 直接会話ではない公開チャットのようなもので言ったつもりになったところで、 それをみんなが読んでいるとも 意図通りに解釈しているとも 限らないってのはよくある事です😓。

2025/11/01

AM中に起床。

Ollamaのv0.12.7というアップデートが来ていたのですが(ついさっき見たらv0.12.8が出てましたが😅)、 Qwen3-VLというモデルを使用可能になったらしい。 どんなモデルなのかと思って調べてみたら画像も認識できるらしいというのを知り試してみたり。 話は一瞬逸れますが モデルのファイルサイズってダウンロードしてみるまで判らないのだろうか?🤔 さておき、適当に試しながらダウンロードしてみたところ 以下のようなサイズのようです。

$ ollama list
NAME            ID              SIZE      MODIFIED
qwen3-vl:8b     901cae732162    6.1 GB    7 hours ago
qwen3:30b       ad815644918f    18 GB     7 hours ago
qwen3-vl:30b    eda0be100877    19 GB     8 hours ago
gpt-oss:20b     17052f91a42e    13 GB     2 weeks ago
gpt-oss:120b    f7f8e2f8f4e0    65 GB     6 weeks ago

qwen3-vlの方が画像認識機能(Vision Language model)も持つ方みたい。 Emacsのgptelで試してみたのですが、 「現在の設定ではファイルシステムにアクセスできないため、画像の内容を確認する事ができません。」 という回答が返ってきました。OllamaのGUIでは画像ファイルをドラッグ&ドロップして「画像の説明をしてください」 というメッセージを送ると解釈しているようなので、Emacsおよびgptel側の方に問題がありそうな予感はしたりも。
そういやと思い、GUIの方で「describe this image '/path/to/foo.jpg'」というメッセージを送ると、 やっぱりローカルファイルにアクセスできないという旨の回答が返ってきました。 でも、コマンドラインから「$ ollama run qwen3-vl:8b 'descrive this image ./foo.jpg'」と実行すれば うまく動くようです。画像の渡し方に秘密がありそうな予感がしたりも。

使用しているgptelは 20250909.1755 というバージョンで 画像ファイルの送信には対応していそうに思ったのですが、 更新版が出てそうだったのでgptelパッケージを 20251031.251 というのにアップデートしてみたり。 ファイルを送るか否かの表示が判りやすくなった感じだったので送れるか? と思ったのですが、「error in process sentinel: Search failed: "....."」というエラーが出て 実行に失敗しているようだったり。むーん?

原因判明。データを含むような場合、Ollamaに投げるリクエストは リクエストボディを 一旦 tmpの.jsonファイルに保存しておき、それを curlで送っているっぽいのですが、 curlに「--data-binary @/tmp/*/gptel-curl-*.json」のような感じでファイル名渡ししているようです。 しかし、curlは Windows標準の c:/Windows/System32/curl を使っていた為、 /tmp/* はCygwinパスでWindows標準のcurlにはパスが解釈できず実行に失敗しているという感じのようでした。 Cygwinパッケージのcurlをインストールして(デフォルトでスキップになっている模様)みたところ、 画像ファイルのデータを送って答えを得る事ができました。前述した通り途中で .jsonファイルを生成しますが、 画像ファイルはbase64エンコードして画像データとして埋め込まれる感じになっているので、 画像ファイル自体のパスは問題にならないようです。 この為、curlのファイルパス指定問題が解決すればデータの添付に関する問題は全て解消する感じだと思います。

2025/10/31

テレワーク。早めに終了。

調べ事。

2025/10/30

テレワーク。早めに終了。

GoogleのDoodleがハロウィン仕様のパックマン。ハロウィンは判るのですが何故パックマン? と思ったところ、1980年の稼働(日本では7月、アメリカでは10月26日)から45周年という事らしい。

2025/10/29

テレワーク。早めに終了。

先日のorg-modeで attachment: のファイルがHTMLエクスポートすると絶対パスになる件。 expand-file-nameで展開しているというのもあるのですが、他にも絶対パスになっている事をチェックしているようで、 ちょっと弄れば相対パスにできるという感じでは無さそうだったり。LaTeXの式をレンダリングした画像と 同じような扱いなのかと思いきや全然扱いが違ってて挫けました😓。

2025/10/28

テレワーク。早めに終了。

調べごとをして終了。

2025/10/27

テレワーク。早くもなく遅くもなく終了。

Web巡回して終了。

2025/10/26

AM中に起床。

掃除したり洗濯したり。

現在開発中の Emacs31系のWindows向けビルドでは yank-media というクリップボード画像の貼り付けがサポートされる予定です。 org-modeでは貼り付けに対応しているのですが、.orgファイルに貼り付けた後にHTMLにexportすると 画像のリンクが expand-file-name で展開された絶対パスになってしまいます。 Cygwinビルドでは ewwで見るのは大丈夫ですが、EdgeやChromeなどの外部ブラウザを使用すると ファイルパスがCygwinパスになっている為、画像が表示されないという事が起こっています。 クリップボードから貼り付けた画像はデフォルトでは.orgファイルと同じディレクトリの dataという ディレクトリ内に保存されます。 画像の参照は「[[attachment:clipboard-20251026T121446.png]]」のような感じで、attachment:という 特別なキーワードと clipboard-yyyymmddThhmmss.* という形式の自動生成名から成り、 途中のパスは何かしら自動生成されるハッシュ値的な物(UUIDっぽくも見える)を使用しているようです。 HTMLにexportする際に 相対パスで「src=./data/.../clipboard-...」と記してくれれば良いのですが、 色んなところで expand-file-name で展開した絶対パス名を使用しているようです。 また、設定値の書き方とかで対応できる感じにもなっていないようです。 CygwinパスとWindowsパスの違いの問題もありますが、そもそも絶対パスだと 画像ファイルの置き場所を移動すると 表示できなくなってしまうし、公開Webページとしてアップロードしてもリンク切れになってしまうなど、 デメリットしか無いように思われます。なんとかならないっすかね?とは思ったりも。

minibufferでファイルパス名に文字「?」を入れようとしたら minibuffer-completion-help 実行にバインドされているなぁ? と思ったり。以前シェルのglobstarなるものを知り、 時々find-diredの代わりに使う事があるのですが、正規表現を少し細かく「**/*.??g」のような指定をしたい と思ったところ、文字「?」が入れられないので気づいた次第。 .emacsに「(define-key minibuffer-local-completion-map "?" nil)」を記して無効化する方向で。

2025/10/25

AM中に起床。通院。

Web巡回していたら、PlemolJPのv3.0.0が 今年の6月29日に出ていたというのに気づいたり。 元になっているIBM Plexの「IBM Plex Sans JP」 がv2.0.0になったのに追従したアップデートだった模様。グリフが大量に追加されているらしいですが、 異体字セレクタに対応している訳では無さげ。 因みに、IBM Plex Sans JP の方はv3.0.0が今年の9月2日に出ているようです (Releases @ibm/plex-sans-jp@3.0.0)。 また、IBM PlexはGoogle Fontsでもダウンロードできるように なっているっぽいですが、v1.001なのでちょっと古いのが置かれているようです。

2025/10/24

テレワーク。早めに終了。

Emacs30.2で zlc-modeの補完がうまく動いていない件。 29.4の lisp/minibuffer.el を読み込むと解消したので、30.2との差分を調べてみたところ、 なにやら余計なテキストプロパティが追加されるようになっているようです。 以下のようなパッチでひとまず機能するようになりましたが副作用があるかも知れません。

$ diff -u lisp/minibuffer.el.orig  lisp/minibuffer.el
--- lisp/minibuffer.el.orig     2025-03-15 22:19:26.000000000 +0900
+++ lisp/minibuffer.el  2025-10-24 19:31:05.140339100 +0900
@@ -703,12 +703,12 @@
                    ;; on the first character of the completion.  Make
                    ;; sure the quoted completion has these properties
                    ;; too.
-                   (add-text-properties 0 1 (text-properties-at 0 completion)
-                                        qcompletion)
+;                   (add-text-properties 0 1 (text-properties-at 0 completion)
+;                                        qcompletion)
                    ;; Attach unquoted completion string, which is needed
                    ;; to score the completion in `completion--flex-score'.
-                   (put-text-property 0 1 'completion--unquoted
-                                      completion qcompletion)
+;                   (put-text-property 0 1 'completion--unquoted
+;                                      completion qcompletion)
                   ;; FIXME: Similarly here, Cygwin's mapping trips this
                   ;; assertion.
                    ;;(cl-assert


しばらく普段使いで様子見してみよう。

パッチの差分を確認していたら、何故かdiffの日付表示に差分があって妙な時間を指しているなぁ? と思ったり。どうやら diff の 3.12 は変っぽい。

$ echo test_message > test.txt

$ ls -l
合計 1
-rw-rw-r-- 1 TANE-HP なし 13 10月 24 22:23 test.txt

$ /usr/bin/diff -u -N test.txt.orig test.txt
--- test.txt.orig       1970-01-01 09:00:00.000000000 +0900
+++ test.txt    1970-01-01 09:00:00.000000000 +0900              ★★★★日付が変
@@ -0,0 +1 @@
+test_message

$ /usr/bin/diff -v
diff (GNU diffutils) 3.12
Packaged by Cygwin (3.12-1)
Copyright (C) 2025 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.


ファイルの日付が変になっています。
前に野良ビルドして使っていた 3.8 の場合は以下のような感じ。

$ ~/develop/work/diffutils/diffutils-3.8/src/diff -u -N test.txt.orig test.txt
--- test.txt.orig       1970-01-01 09:00:00.000000000 +0900
+++ test.txt    2025-10-24 22:23:11.567447100 +0900              ★★★★ファイルの日付通り
@@ -0,0 +1 @@
+test_message

$ ~/develop/work/diffutils/diffutils-3.8/src/diff -v
diff (GNU diffutils) 3.8
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.

3.12よりも新しいのは出ていないようなので、発見されていないか発見されていても 修正リリースは出ていないという感じ。3.8と3.12の間もいくつかバージョンがあるのですが、 どのタイミングで変になったのかまでは判らず。うーむ🤔。 当面 3.8にロールバックして 3.12よりも新しいのが出たらまた確認するという方向で様子見。

2025/10/23

テレワーク。早めに終了。

Emacs30.2で zlc-modeの補完がうまく動いていないのに今頃気づきました😓。 以前、31系では上手く動かなくなっているというのに気づいて lisp/minibuffer.el の方を対応するしかないなぁという事があったのですが、 その時の「候補文字列のテキストプロパティが無くなっていて、余計な文字列が補完される。」が 30.2でも起こっている予感。と思ったのですが、 テキストプロパティの中に変なプロパティが含まれているのが原因のようです。なんだこれ?🤔 29.4では大丈夫そうで、上手く動くようにした31系と同じテキストプロパティが返っているみたい。 30系で壊れてる感じになっていた模様。

2025/10/22

テレワーク。早めに終了。

今更ですが、bashの入力キーバインドに「C-/」でUndo ができるのを知りました。 因みにEmacsスタイルです。今まで押し間違いで存在に気づいたことは無かったので、 コマンドライン編集でUndoを期待するようなことは無かったのだと思いますに、 個人的にはあまり使う場面は無いかも知れません。

2025/10/21

テレワーク。早くもなく遅くもなく終了。

Web巡回して終了。

2025/10/20

テレワーク。早くもなく遅くもなく終了。

Web巡回して終了。

2025/10/19

AM中に起床。

掃除したり洗濯したり。

Emacsのキーボードマクロの中に isearchで W32-IMEから文字を入力するという要素を含めると うまくマクロ実行できないのを調べたり。キーボードマクロを調べると、 なにやら「with-keyboard-coding」というのが記録されていて、 ./lisp/international/isearch-x.el の中でそのキーコードを受け取ったら 関数isearch-with-keyboard-coding を実行するような事が記されているのですが、そもそも「with-keyboard-coding」というキーが どこに定義されているのか判らなかったり。どういう事?🤔

2025/10/18

AM中に起床。

ちょろり買い物にお出かけ。

あまり数がある訳では無いのですが、使用済みのボタン電池を回収してもらおうと持ち込んだ所、 雑にマスキングテープで包んでいたので穴に入らず一旦断念。それにしても資源ゴミ回収では コイン型のリチウム電池(CR2032とか)は回収OKらしいのですが、一般的にもよく使うと思われる LR44とかは回収しないというのがよくわかりません。
ボタン型電池を資源ゴミで回収しないのなんでだっけ?と調べていたところ、 川崎市では 2025年11月からリチウムイオン電池などの二次電池も回収するようになるのを知ったり (川崎市ページ)。 髭剃りなどは分解不要で回収してもらえるようです。ありがたや。 で、ボタン型電池は水銀を含む場合があるので回収しないという事みたい。 水銀フリーなボタン電池も存在するのですが、見た目で区別がつかないのでダメっぽい。

カラーシャープ芯。先週買った水色は薄すぎたので、 赤と青を購入してみました。色んな色入りってのもあったのですが、0.7mmのが無かったので試せず。 ついでにもう一本0.7mmのシャープペン本体も購入。今回買ったのは300円でまぁ普通。 赤も青も想像した通りの色の濃さだったので、あまり色分けすることはありませんが普段使いしてみようと思ったり。 それよりもシャープペン本体の色が 白と青で、白の本体は重いので青の本体をよく使うだろう色に した結果、青の本体に赤芯、白の本体に青芯 を入れました。が、絶対に一回は思ったのと違う色の方を選んで 「あぁ...💦」ってなる気がします😓

Emacsの テーマのカスタマイズメニューでは、チェックボックスの描画は絵文字フォントではなくて 画像で表示されています。何気に masterブランチ(31.0.50相当)のEmacsで表示しているのを見ると なんだかズレた位置にレンダリングされた画像になっているなぁ?と思ったり。 30.2ではそんな事になっていないので、何が違うのか調べようと思ったのですが、 どこで画像を選んでレンダリングして表示しているのかよく分からず。
どうやら lisp/wid-edit.el でwidgetとして管理されるっぽい。なのですが表示の実体は SVG画像を create-imageやinsert-imageでレンダリングしているようです。さておき、以下のような感じに見えます。


30.xでは大丈夫なので、何かが壊れていると思われます。
configureで svgサポートを外して(--with-rsvg=no)ビルドしたEmacsで確認してみたところ、 etc/images/*.svgではなく etc/images/*.xpmを使用して表示するようですが、 こちらでは特に問題は無さそうです。SVGでレンダリングする際の位置に問題がある感じなのでしょうか?

どうやら一部のSVGで描かれたアイコン画像のサイズ指定の問題っぽい? 例えば etc/images/checked.svg では高さの指定に「height="1em"」というのが使われています。 1emというのはフォント指定のサイズに対する相対的な値のようで、文字のサイズが16pxならば、 1emは16pxとして扱われる事になるようです。ここからは推測ですが、 Emacs内のSVGレンダリング時にフレームで表示しているフォントのサイズが指定されているようですが、 フォントサイズが指定されているのに加えて SVG画像の表示もサイズに応じてスケールするので、 二重にスケールしているのではないかと推測します。 30.2の時にはSVGデータの中に基準になるフォントサイズ指定が無いようですが、 31.xではフレームのフォントサイズが指定されるようになってっぽい。 という訳で、etc/images/*.svgの中で 1emを使用しているものを「height="16"」に変更すると、 意図通りにレンダリングされるようです。

2025/10/17

テレワーク。気持ち早めに終了。

そういえば先日知った超連射68kの Ver1.10 って、いつ頃出ていたのかしら? と思い調べてみたり。 超連射68kのページには 特に明記は無さそうで、クレジットは「©1995 1998」となっていたので、その頃に出ていたのかな? と思ったわけですが、ゲーム本体が X68000用の xdf形式で置かれていたので、エミュレータでxdfの中を 見てみたところ、CRS68K/DOC/readme.txt に 散逸していたソースとデータを2021年頃からサルベージした 事が記されていました。全てのファイルの日付が「2023-01-01 00:00」になっていたので、 それくらいにビルドされたのだろうと想像します。 Wikipedia によると、X68000 Z EARLY ACCESS KITに 同梱されていたようで、正確なリリース日は分かりませんが 2023年4月頃だったのだろうと思われます。 という訳で、Ver1.10が出たのは 2023年なので、約27年間気づかなかった訳では無い (2年くらいは気づいてませんでしたが😅)という事でした。

背景グラフィックが変わっていたりするのですが、リプレイデータは互換があるという事で、 大昔に草の根BBSで知り合った めっちゃシューティングゲームの上手い方の ウルトラ超絶プレイの リプレイデータを食わせてみたところ ちゃんと再生されました。

2025/10/16

テレワーク。気持ち早めに終了。

Web巡回して終了。

2025/10/15

テレワーク。気持ち早めに終了。

Windows Update。Emacsのハングテストを継続していたのを一旦終了させて Update後にテスト再開。

2025/10/14

テレワーク。早くもなく遅くもなく終了。

全然関係ない流れで見つけた 「【X68000】超連射68k Ver1.10【エンディングまで】」 という動画。ん?エンディングって何?と思って最後の方を観てみたところ、ラスボス倒した後に見たこと無い映像が。 そういや背景画像も見たことない感じになっていて、TANEが知ってるのはver1.00(SZ2.Xの日付は97-12-28 19:57) だったというのに今頃気づきました😅。

2025/10/13

AM中に起床。

NHK総合で「大阪・関西万博閉会式」を放送していたのをBGVで観たり。 結局GoogleEarthでは完成版は見られるようにならなかったですが、GoogleMapの航空写真は完成版になっていたようです。

そういえばGoogle検索で期間指定ができますが、終了日を過去に指定して古い情報を探そうとしてみたのですが、 フィルターが効いていないような気が。

2025/10/12

AM中に起床。

掃除したり。

ちょろり買い物にお出かけ。「これ描いて死ね(8)」捕獲。 気にはなっていた「カラーのシャープ芯」をどんなもんかと試しに購入。0.5mmのもあったのですが 0.7mmを選択。でも0.7mmのシャープペン本体は持っていないので本体も購入。 値段を見ていなかったのですが、シャープペンの方が825円だというのに後で気づいて驚いたり😅。 なんでこんなに高いんだ?と思ったのですが、振ると芯が出てくる機構が付いているものだったらしい。 でも手持ちの他のシャーペンは普通のなので振る機構は多分使わない😓。

カラーシャープ芯。水色を買ったのですが色が薄いな。下書きを消さなくても印刷に出ないという利点が あるようですが薄くてよく見えない😅。他の色も試してみたくなりました。

2025/10/11

AM中に起床。

そういえば gpt-ossのモデルって更新されてたりするのだろうか?と思い、 ollama pull してみたところアップデートされたり。pullできるという事は何かしら変わっているという事なのかしら? 「ollama show -v gpt-oss:20b」でモデルの情報を表示してみても、 モデルのバージョンに関する情報は含まれていないようなので、いつ時点のモデルを使用しているか?は判らない予感。 因みに ollama list で出てくる MODIFIEDは pullした時点からの経過時間を示しているので、モデルが更新された 日時が判れば pullした日付と合わせてどの時点のモデルを使用しているかを判別できるかも知れません。

2025/10/10

テレワーク。早くもなく遅くもなく終了。

CygwinパッケージのImageMagickが更新されていたので、インストールする前に同じバージョンで 野良パッチの確認をしたり。HEICフォーマットの色化けはバージョンアップで直る予定だったので そちらのパッチは不要になりますが、透明度付きグレースケールのTGAフォーマットは野良パッチとして 引き続き取り込む感じに。
で、ImageMagickをインストールしようと思ったところ、Cygwin本体も 3.6.5-1 が出ていたので、 インストール前に git pullでログの確認をしたり。pull前から2つの修正が追加されていたのですが Emacsハング修正には関係していなさげ。インストールしてみて一応ハング再現するか少し様子を見る方向で。 因みに gdb上でemacs-w32を動かすと謎のSIGTRAPが発生するのは変わりないようです。 後、先週から実行していたEmacsハング回避パッチの様子見では 約1週間 Emacsハングは再現していませんでした。

いくつかEmacsを立ち上げてパッケージオリジナルの Cygwin3.6.5-1 でハング再現の様子を見てみたのですが、 数時間でハング再現しました🥺。仕方ないのでワークアラウンドパッチを当てて野良ビルドしたcygwin1.dllと 入れ替えて様子見開始。まぁ大丈夫だろうと思いますが。

2025/10/09

テレワーク。気持ち早めに終了。

調べごとをして終了。

2025/10/08

テレワーク。早くもなく遅くもなく終了。

GIMP 3.0.6がリリースされているのに気づいたり (GIMP 3.0.6 Released)。 ちょろっと触った感じでは特に問題無さげ。安定してきている気も。

2025/10/07

テレワーク。早くもなく遅くもなく終了。

全く気付いていなかったのですが、magitでの「Tracked files」表示が途中までしか出てないようだったり。 以前、gptelを試すために Transientを更新した後、 magit-20250912.1136ではダメになっている箇所があったので、magit-20230410.857に更新しました。 以前のmagitではディレクトリの中は非表示の状態になっていて、展開したり折りたたんだりできたのですが、 現在のではサブディレクトリのファイルも含めて全て表示しようとしています。 しかし、100までしか表示されていない為、トラッキングしているファイルを探す事ができなくなっています。 なんだこれ?🤔
どうやら カスタム変数magit-status-file-list-limit てのが新しく定義されているようで、 この値がデフォルトで100になっている模様。ここを20000とかに設定すれば 5000以上のファイルがある Emacsのリポジトリでもトラッキングしている全てのファイルを表示できました。 「Tracked files (xxxx)」の行で TABキーを押せば展開したり折りたたんだりできるので、 全部表示するか 全く表示しないか の二択という感じになるようです。なぜ 操作仕様を変えたのかは不明。 パフォーマンスを理由にしているみたいですが、中途半端なリストを出されても役に立たないし、 リストが必要な人は パフォーマンスを理由にして リストの取得を諦める訳が無いと思います。 考え方が理解できません。

2025/10/06

テレワーク。早くもなく遅くもなく終了。

Web巡回して終了。

Windows11の「ペイント」ってレイヤーを使えるようになってたのか。AI補助とか何気に色々変わっているっぽい。

2025/10/05

AM中に起床。

掃除したり洗濯したり。

ちょろり生活備品の調達。本屋に寄ったところ「アオイホノオ(32)」が置かれていたので捕獲。 31巻はなかなか捕獲できず (1, 2, 3, 4)、死に筋判定されているのか?と思ったのですが、置かれてたので タイミングの問題だったのか?と思ったりも。ただ、書棚には30巻はあるのに31巻は無かったので やっぱり31巻には何かあるのかも知れない😅。

2025/10/04

AM中に起床。

ノートPCで継続していたCygwinパッチの確認。合計で約3週間(478時間) 3つのEmacsを動かし続けて ハングしなかったのですが、先日副作用が見つかったので 一旦確認は終了。

Emacsハング対応のCygwinパッチ再考。 前のパッチは SIGALRM の場合は処理を完全にスキップするような感じでしたが、 スレッド数が1の場合は発動しないという条件を追加してみたり。 元々、複数のスレッドでロックが競合した場合に、何故かスレッドが切り替わらない為に ロックループがいつまでも脱出できないという動きになっていそうな感じでした。 ロックされていた場合はスキップするみたいなコードを入れてみたものの、 ロック状態確認とロック実行の間の時間を理論上0にする事ができない為、ハングしにくくはなるものの 完全対応にはなりませんでした。そこで、ダメもとで SIGALRMの場合は処理を完全スキップする としてみたところ(以前のメモ) Emacsはハングしなくなったのですが、 先日の alarm() を使ったコードでは SIGALRM が無限に保留される事となり影響があるのが分かった... という流れです。 で、そもそもシングルスレッドでは ロック競合は起こりえないハズなので、 最初に記した通りスレッド数が1の場合は発動しないという条件を加えてみたらどうか? と思った次第です。ワークアラウンドとは言え、 ひとつ前のコードと同様に「このパッチ、意図が分からん」に 拍車をかけている感は否めません😓。

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index f79978f73..bb45b0148 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -961,7 +961,7 @@ _cygtls::interrupt_now (CONTEXT *cx, siginfo_t& si, void *handler,
       if (!inside_kernel (cx, true))
        {
          HANDLE h_veh = AddVectoredExceptionHandler (0, singlestep_handler);
-         cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
+//       cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
          SetThreadContext (*this, cx);
          suspend_on_exception = true;
          in_singlestep_handler = false;
diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc
index 1c9b8037b..799476e1f 100644
--- a/winsup/cygwin/mm/cygheap.cc
+++ b/winsup/cygwin/mm/cygheap.cc
@@ -743,6 +743,8 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
   while (++ix < (int) nthreads)
     {
       /* Only pthreads have tid set to non-0. */
+      if (nthreads!=1 && (sig==14 || threadlist[ix].thread->locked () != false))
+       continue;
       threadlist[ix].thread->lock ();
       if (!threadlist[ix].thread->tid
          || !threadlist[ix].thread->initialized)

ひとまず、先日のalarm()を使うコードや diffutilsのconfigure実行は大丈夫となり、 Emacsの方はスレッド数が1では無いので、元々の SIGALRM時は処理をスキップする (3週間ハングしなかった実績のある)条件になります。 ただ、複数スレッドを起動して SIGALRMをハンドリングするようなプログラムでは依然として 何かしら副作用があるかも知れません。

という訳で、ノートPCで Emacsを3つ動かし続けて様子を見るテストを再開。 条件的にEmacsがどうにかなる事は無いハズなので、普段使いのデスクトップPCにも適用して様子見。

2025/10/03

テレワーク。気持ち早めに終了。

先日のCygwinパッチの副作用。configureでの検査の中で、以下のコードが終了しないという 感じになっていました。

     1  #include <errno.h>
     2  #include <unistd.h>
     3  #include <signal.h>
     4  static void
     5  handle_alarm (int sig)
     6  {
     7    if (sig != SIGALRM)
     8      _exit (2);
     9  }
    10
    11  int
    12  main (void)
    13  {
    14
    15      /* Failure to compile this test due to missing alarm is okay,
    16         since all such platforms (mingw, MSVC) also lack sleep.  */
    17      unsigned int pentecost = 50 * 24 * 60 * 60; /* 50 days.  */
    18      unsigned int remaining;
    19      signal (SIGALRM, handle_alarm);
    20      alarm (1);
    21      remaining = sleep (pentecost);
    22      if (remaining > pentecost)
    23        return 3;
    24      if (remaining <= pentecost - 10)
    25        return 4;
    26      return 0;
    27
    28    ;
    29    return 0;
    30  }

19行目でSIGALRMを受けた時のハンドルを設定し、20行目で1秒後にSIGALRMを送るように設定して、 1秒経つ前に 21行目でsleep()を実行という流れで、sleepは50日待つので alarm(1) が 機能していなければ50日後に先に進かも知れないけど 終了コード0にはならないという感じかと。 恐らくCygwinのパッチで SIGALRM の場合は処理しないみたいなコードにしているので、 SIGALRMが送られてこないというのにも辻褄が合っているとは思ったりも。
ただし、例えば「(./a ; echo $?)」で実行した後、Ctrl-Zでサスペンドして、 bgコマンドもしくはfgコマンドで動作継続すると 終了コードは0 になるようです。 先日のconfigure実行がバックグラウンドでエラーせずに先に進んだのとも辻褄が合います。 SIGALRM以外のシグナルを受ければ、ついでにSIGALRMも処理される感じなのかしら?🤔

2025/10/02

テレワーク。早めに終了。

何気に以前作成したdiffの -y のカラーパッチを 新しい diffutils-3.12 に対応してみたり。ところがconfigure実行で sleepのテストがいつまで経っても終わらず。 むむ、これはEmacsハングに対応する Cygwinへのパッチが 影響している気が。configure内で実行しているテストコードを切り出してコンパイル&実行してみたところ、 確かにいつまで経っても終わらないのですが、Ctrl-Zでバックグラウンドに切り替えてbgで実行継続すると 先に進むようだったので、本題のdiffutilsのconfigureはそれで進めたり。 ひとまずパッチ(diff-y_coloring_patch-3.12.diff.xz) を置きます。御参考まで。

Cygwinパッチの副作用が見つかったので 対応を考え直す必要があるなぁ....🤔

2025/10/01

テレワーク。気持ち早めに終了。

調べごとをして終了。

2025/09/30

テレワーク。早めに終了。

Web巡回して終了。

2025/09/29

テレワーク。気持ち早めに終了。

デスクトップPCのFirmwareアップデートが来ていたので適用してみたのですが、 「Intel TBT Retimer」なるもののアップデートがFailします。数週間前にもFirmwareアップデートが来ていたので、 適用してみたのですが、その時も同じようにFailしていました。 なんかアップデートできない状態にハマっている模様。 意図的に再度アップデートの有無を探して適用する方法が分からないので、 また自動チェックでアップデート通知が来るのを待つしか無いのか?むーん🤔。

BIOS(というかUEFI)メニューを見てみたところ、SystemLogにFailが記録されていたり。 前回失敗していたのは2週間くらい前でした。ただ、Failした事しか記録されていなくて、 何がFailしたかは記されていませんでした。 ところで Intel TBTってなんぞ?と思ったのですが、メニューに「Intel Turbo Boost Technology」の 項目があったのでこれなのか?と思ったものの Enable/Disableにするスイッチしか無いのでよく分からず 設定はそのまま。
特に得られる物は無さそうだったので、Windowsを起動して調べてみたのですが、 どうやら「Intel Thunderbolt Retimer」というパターンもあるようで、Retimerの文言から察するに TBTは「Turbo Boost Technology」じゃなくて「Thunderbolt」のような気がしてきたりも。 他社製のマシンでもアップデートに失敗するような例があるようですが、 USB-typeCに何か繋いでいると影響あるかも?(ただそのコメントに対するリアクションは「改善せず」でしたが) というので 一理あるかもな?と思ったりも。 液タブ用にUSB-typeCにケーブルだけ刺していたのですが、 また忘れた頃にアップデートが来るかも知れないので、ケーブルを抜いておく事にしたり。どうなるか?

2025/09/28

AM中に起床。

掃除したり。

先週に引き続き Cygwinのパッチに更に手を加えて Emacsハングの再現確認を 継続しています。ノートPCで合計2週間(336時間) 3つのEmacsを動かし続けてハングしていないので、 パッチの効果としては問題無いだろうと思っています。 また、普段使いのデスクトップPCにも適用して1週間経ちますがこちらも問題は無さげ。

そういえば、HP-UXって x86系で動作するのだっけ?と思って調べていたら、HP-UX自体が2025年12月末を以って サポート終了らしいのを知ったり(参考Wikipedia)。 PA-RISCから Intel Itaniumへと移行した後、Itaniumは2021年に製造終了となってました。 CPUと一緒にOSも店じまいという感じみたい。因みに、TANE自身は使ったことはありません😅。
過去の日記を検索してみると、10年くらい前にデバッガのGDBの 7.10で「HP/PA running HP-UX (hppa*-*-hpux*)」と「Itanium running HP-UX (ia64-*-hpux*)」の サポートを外したという話を記していましたが、 このときは「x86_64-*-hpux*」はあるのか?というような事は調べていませんでした。 結局、x86_64への対応は無いようなので、GDBでは事実上「*-*-hpux*」のサポートを外したのと等価だったようです。

2025/09/27

AM中に起床。

自転車の引き取り。駆動系が新品のためかペダルがめっちゃ軽い😅。 旧車購入から今回の新車の買い替えまでの17年間で自転車も進化しているのだろうか?

唐突にNAS-HDDを新規購入にお出かけ。6TBで約40000円也。 不思議なことにNASは8年前に購入したものと比べても 容量当たりの単価が変わっていない、なんならちょっと高いくらいという相場のようです。 一般的には「クラウドストレージで十分」という考え方もあるかと思いますので ニッチなのかも知れませんが、NASではないSSDやHDD単品の容量当たりの単価の 感覚だと「なぜこの価格?」と思ってしまうところはあるかもしれません。

置き場を整理してNAS-HDDを稼働。設定などを一通り行ってひとまず使える感じに。

2025/09/26

テレワーク。気持ち早めに終了。

調べごとをして終了。

2025/09/25

テレワーク。気持ち早めに終了。

何気にOllamaって更新頻度が高いなぁ?と思ったりも。

2025/09/24

テレワーク。早めに終了。

調べごとをして終了。

2025/09/23

AM中に起床。

タスクバーの右の方にウィジットなるボタンがあります。天気の表示が主な目的で表示ONにしているのですが、 マウスカーソルをかざすとニュースが表示されます。表示されている見出しをパッと見る感じ、 いつもテレビが元ネタと思われるものが多いなぁ?とは思ったりも。 記事の元ネタを書いている人の世代は分かりませんが、テレビっ子であることに違い無い気がします。勝手な憶測ですが。

10月13日で大阪・関西万博は閉幕となりますが、GoogleEarthの写真は建設途中のままだなぁと思ったり。 以前にも記した通り、大屋根リングは撤去予定なので 意図的に撮影しない限りは開催期間中の状態をGoogleEarthで見ることはできないかもなぁ?とは思ったりも。

何気にgptel(gpt-oss:20b)で「「やなせたかし」という人物について教えて」と聞いてみたら、 色々出てきたのですが、アンパンマンのアニメ化について 「1975年に日本テレビがアニメ版を制作。全国のテレビで毎日放送され、...」 と記されていて、何と間違えているんだ?🤔と思ったりも。 因みに少し前に調べた時には、 アニメ放送開始は1988年10月3日 という事でした。

何故かWikipeiaで、年に対応したテレビアニメの一覧が出せるようだったのですが、 1988年だと「Category:1988年のテレビアニメ」という感じみたいです。 テレビ神奈川(TVK)で日曜夜に再放送されている「美味しんぼ」のアニメ放送開始も1988年なんだっけ? と改めて思ったりも。

2025/09/22

テレワーク。早めに終了。

Web巡回して終了。

2025/09/21

AM中に起床。

掃除したり洗濯したり。

丁度一週間前からCygwinのパッチに更に手を加えて Emacsハングの再現確認をしていました。 ノートPCで一週間(168時間)、3つのEmacsを動かし続けてハングしなかったので、予想通りの動きにはなっているようです。 ノートPCでのテストはそのまま続けるとして、デスクトップPCにも適用して普段使いでEmacs以外に影響が及ばないか? を確認してみる事に。因みに、デスクトップPCの方でも9月9日からパッチを当てて 普段使いで様子見していたのですが、こちらではハングが発生する事はありませんでした。 gptelを使う為に再起動したので連続実行という点ではせいぜい一週間といった所ですが、それでも image-diredを使ったり数個起動したりするのに比べるとハング遭遇確率は大分低いという感じだったのかも。

という訳で以下のパッチをCygwinに当ててデスクトップPCでもハング再現テスト開始。 と言っても再現はしないハズなので影響確認ですが。

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index f79978f73..bb45b0148 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -961,7 +961,7 @@ _cygtls::interrupt_now (CONTEXT *cx, siginfo_t& si, void *handler,
       if (!inside_kernel (cx, true))
        {
          HANDLE h_veh = AddVectoredExceptionHandler (0, singlestep_handler);
-         cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
+//       cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
          SetThreadContext (*this, cx);
          suspend_on_exception = true;
          in_singlestep_handler = false;
diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc
index 1c9b8037b..3248813e2 100644
--- a/winsup/cygwin/mm/cygheap.cc
+++ b/winsup/cygwin/mm/cygheap.cc
@@ -743,6 +743,8 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
   while (++ix < (int) nthreads)
     {
       /* Only pthreads have tid set to non-0. */
+      if (sig==14 || threadlist[ix].thread->locked () != false)
+       continue;
       threadlist[ix].thread->lock ();
       if (!threadlist[ix].thread->tid
          || !threadlist[ix].thread->initialized)

ひとつ前のパッチとの違いは mm/cygheap.cc の方の if条件に「sig==14 ||」を追加しただけです。14は SIGALRM に対応します。 普通に考えれば「このパッチ、意図が分からん。てか大丈夫か???」という感じには思います。 とにかく Emacsでも色々enableにした上に負荷をかけても再現しにくく、 Cygwinパッケージのemacs-w32だと数日オーダーで耐えられるので、他のケースでは発見されないかも知れないなぁ? とは思ったりも。ただ、もう一つの 「gdb上で emacs-w32を動かした時に謎のSIGTRAPが発生する」件は 誰にも気づかれないのはおかしくね?と思わなくはありませんが。

何気にCygwinの git log を眺めていたら、Emacsハングに関係する lock()周りのコードは

commit b57c6c013bf0899d3b39048bfb7e46197a0a9689
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
Date:   Sat Jun 7 17:00:35 2025 +0900

    Cygwin: signal: Enable the signal mask earlier

    Currently, _cygtls::sigmask is set in call_signal_handler(), but this
    is too late to effectively prevent a masked signal from being armed.
    With this patch, deltamask, which is set in _cygtls::interrupt_setup()
    in advance, is also checked as well as sigmask to determine if the
    signal can be armed.

    Fixes: 0d675c5d7f24 ("* exceptions.cc (interrupt_setup): Don't set signal mask here or races occur with main thread.  Set it in sigdelayed in>
    Reviewed-by: Corinna Vinschen <corinna@vinschen.de>
    Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
    (cherry picked from commit 364226a4caaa277d86fcc0c58ef862cb23a50603)

 winsup/cygwin/exceptions.cc |  6 +++++-
 winsup/cygwin/mm/cygheap.cc | 13 +++++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)


というコミットで追加されたようです。 ハングしない3.6.2-1は 5月26日にリリースされています (cygwin 3.6.2-1)。 そして、件のコミットは 6月7日付けで、ハングの発生する3.6.3-1は 6月5日にリリースされています (cygwin 3.6.3-1)...... ん~~~~?ハング発生とコミットの時系列が合ってないな....?🤔 でも変更が何かしら影響しているものと考えられます。

「瑠璃の宝石」で出てきた鉱石ラジオ。そういや「電子ブロック」の最初の方にあったなぁ?と思って回路図を探してみたら こちら にありました。「No.6 ダイオード検波ラジオ」がそれで厳密には鉱石ラジオではありませんが 鉱石検波器の話も記されていますね。 ホントに絵のような規模のアンテナを張らないと聞こえなかったと記憶しています。 電子ブロックって良くも悪くも回路図だけしかないので、「AM放送がどういう仕組みなのか」を知らないと どういう原理で音が聞こえるのかが解らないって所はあったように思います。原理を知ったのは大分後になってからだったかも。 ところで、AMラジオ放送は設備更新のコスト削減などの理由で、徐々に放送休止していく事になっているみたい (参考記事)。 アナログテレビ放送はもう無くなってしまいましたが、AMラジオ放送も時間の問題になっているみたい。 ダイオード検波ラジオで放送が聞けるのは今のうちかも知れません。

2025/09/20

AM中に起床。

先日チェーンの切れてしまった自転車を近所の自転車屋さんに持ち込み。 もう修理は諦めるつもりだったので新車を購入する方向で。 最近は店頭販売ではなく注文販売になっているらしくカタログを見せてもらったり。 カラーバリエーションや変速機の有無、タイヤのサイズなどの組み合わせがある為、BTO的な感じになっているようです。 という訳で直観で選んだ1台に決定。納品予定などはまた後日連絡で、旧車は先に引き取ってもらう事に。 旧車を買ったのは約17年前で愛着もありましたが致し方なし🥲。

そういえばGoogle検索で横に「AIモード」なるボタンが追加されているのでちょっと使ってみたり。 AIチャット的な使い方をするのかと思ったのですが、一問一答で検索結果を要約して表示するという感じみたい。 なので、細かい条件を後から追加して絞り込むような使い方は面倒臭い(作文し直して再入力が必要)とは思ったりも。 むしろ「昨日のニュースを教えて」みたいな感じの方が良いようには思ったりも。 ただこれ、ニュースサイトが同じ感じにやってしまうと、そもそもニュースのネタを誰が提供するんだ? みたいなパラドックスが生じそう。あくまでニュースのネタを整理/要約する手段として使う感じに思うので、 元ネタを自分で提供しない広告収入目的のまとめサイトみたいなのは無くなる方向になるかも?とは思ったりも。

AIモードで「半年間のキーボードに関するニュースを教えて」って出てきたまとめの中に、 「ゲーミングキーボード:ラピッドトリガーの普及と進化」という見出しがありました。 ラピッドトリガーってなんぞ?と思い gptel(gpt-oss:20b)で聞いてみたら「押したキーの連射機能だ」的な 回答が返ってきたのですが、Webで調べてみた感じはそうでは無いっぽい。 一般的なメカニカルスイッチの場合、ONやOFFと判断される押し込み位置(アクチュエーションポイント;入力位置) が決まっていますが、ラピッドトリガーでは 押した/離した距離が一定距離に達するとON/OFFが確定すると いうものみたい。浅い位置で押し離ししても、深い位置で押し離ししても良いようです。 このような挙動なので、高速に連打すると自然に押し/離しの距離は短くなるのに対しても反応すると いうことなのだろうなと想像します。 ただし、ちょっと触れただけでも反応してしまうというデメリットはあるようです。 実際に可能なのかは分かりませんが、ON/OFF判定開始となる最低押し込み距離が設定できるのであれば、 問題にはならないかもなぁ?とは思います。 ともあれ、ゲーミング用途だけでなく 普通のタイピング用途でも恩恵はあるような気はします。

2025/09/19

テレワーク。気持ち早めに終了。

gptel。チャットで何度かやり取りしていると 「error in process sentinel: Search failed: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"」 みたいなエラーが出てそれ以上チャットが続けられなくなるのはそういうものなのだろうか?🤔

2025/09/18

テレワーク。早めに終了。

調べごとをして終了。

2025/09/17

テレワーク。早めに終了。

Web巡回して終了。

2025/09/16

テレワーク。早めに終了。

ちょろり自転車でコンビニに買い物に行ったその帰りにチェーンが切れてしまった予感🥺。

そういえば Emacsに関する事を検索すると、割と高い確率で macOS上で使用する例が出てくる感じがします。 でも、普段使いでmacOS使っている人ってそんなに居るのかなぁ?と思う事はあります。

全然関係無い流れで 「交通事故発生の発生件数・死傷者数の推移」 というPDF文書の存在を知りました。 中に推移のグラフがあるのですが、下がったり上がったり不思議な推移をしているなぁ?と思いました。 例えば 昭和45年は発生件数に対して死亡する割合が高かったというのが伺えます。 昭和53年くらいから発生件数は平成16年頃まで増加の一途を辿っていますが、 平成4年頃から発生件数に対して死亡件数は減少傾向になっています。 平成12年~16年に発生件数は横這いになっているもののその後は減少傾向になってるようです。 しかしながら、発生件数よりも負傷者数は必ず多いという関係ではあるようなので、 事故ると無傷で済まないという事だけは言えそうです。 昭和45~49年くらいの勢いで減少すればあっという間にゼロに近づきそうな感じに思わなくもありませんが、 自動車普及に伴って分母が増えた結果なのだろうとは思います。 事故件数は 平成16年以降は減ってはいるものの 令和になっても一日800件以上の事故が発生しているようなので、 人間の運転能力の限界なのか?と思わなくはありません。 ところで平成12年~16年をピークに発生件数は減少に転じているのですが、ここら辺で減る要因に何があったのかしら?

2025/09/15

AM中に起床。

gptelの gptel-default-mode を org-mode にしてチャットを使ってみています。 org-modeバッファとして見た場合、表とかはTABキーで整形できるしLaTeX式も「C-c C-x C-l」で レンダリング可能だったりするのですが、どうしても見づらい場合があるなぁ?とは思いました。 で、「org-modeなんだもの、我慢できなければHTMLにエクスポートして外部ブラウザで読めばいいじゃない?」 と思ってエクスポートしてみたのですが、プロンプトを示す文字列が「*** 」になっている為、 章立てがなんだか妙な事になります。何か良い方法は無いか?と思った苦肉の策として、 「*** 」を「* ** 」とかにすればいいんじゃない?と思って試してみたところ、個人的にはこれでいいかな って感じになりました。 「(add-to-list 'gptel-prompt-prefix-alist '(org-mode . "* ** "))」てなのを 設定に追加してみたり。まぁ、よき。

org-modeでは表示のスタイルを変えられますが、どうにも振る舞いが微妙な場合があります。 例えばAIチャットで「1. =ollama serve=(または =ollama start=)を実行」というのが返ってきたのですが、 「=~=」でコードスタイルとなるので、「=ollama serve=」と「=ollama start=」が固定幅フォントに なると期待するのですが、「=(または =」の部分を固定幅フォント領域と解釈しているようです。 もう少し調べてみたところ、開始は「 =」終了は「= 」で空白文字が必要ですが、それが無いのが問題みたい。 「1. =ollama serve=X(または =ollama start=X)を実行」の「X」の部分を空白にすれば大丈夫そう。 実際には、gptel-org.elてファイルの「gptel--convert-markdown->org」という関数でMarkdownをOrgに 変換してっぽいので 何かしら弄れば対応できそうですが読み切れず。 必ず空白文字が入らない、という訳でもないのがややこしいです。

以前、HTMLのimgタグにはbase64エンコードした文字列を埋め込むことで、 リンクではなくてHTML埋め込みのインライン画像表示が可能な事を知ったのですが、 org-modeって対応してるのだろうか?と思ったり。結果から言うと対応はしていなさげ。 ただし、「#+BEGIN_EXPORT html ~ #+END_EXPORT」の間に imgタグを直接書けば、HTMLエクスポートはできるので、 ewwなどのブラウザでは表示できるっちゃできます。

2025/09/14

AM中に起床。

掃除したり洗濯したり。

EmacsハングというかCygwinハングの件。ノートPCでEmacsを3つ起動して(image-diredのスライドショーを動かしたりしてます) ほったらかしていたのですが、3つのうち一つが3日ほど動いてハング再現してました。 数日前と同じ感じなので、ロックがぶつかる確率は下がってはいるけどゼロではないので 時間をかけると踏んでしまうのかなと思います。 前にロックがぶつかる頻度を調べた時は意外と多いって事は 分かっているのですが、そもそもぶつかってはならないものなのであれば、 init_cygheap::find_tls()の時は、新たなシグナルに関する処理の開始を待たせた上で、仕掛中のシグナル処理が終わるまで待つ などして、ロックがかかっていない事を保証しないと無理な気がします。どうやれば良いのかよく分かりませんが🥺

そういえば、ロックがぶつかるのは SIGALRM の時だけのようでした。 init_cygheap::find_tls()の引数にシグナル番号が渡ってくるので、SIGALRMの場合は問答無用でスキップする という 動かなくなるかも知れないパッチにしてみたり。動きが変になったらやっぱダメって事にしようと 思ったのですが、Emacs起動はできたのでダメ元で様子を見てみる事にしてみます。これまでの状況から言うと ハングはしなくなるハズです。代わりに変な事が起こるかもしれませんが😓。

何気にOllamaで gpt-oss:120b モデルをpullして使ってみたり。ファイルサイズは53GBくらいで、 Webの情報を見る限りは メインメモリ64GBだと動くかどうか分からないみたいなことが書いてありましたが、 大分遅いものの一応動くようです。GPUメモリは12GBを使って、メインメモリも55GBくらいを使う感じに なるようです。文字の出てくる速度は20bに比べると大分遅いのですが、人がゆっくりしゃべってるくらい の速度なので、長い回答でも意外と全部読んでしまうかも知れません(むしろ大量の情報を一瞬で出されると 斜め読みしかしない😅)。ローカルLLMで一人で使うのであれば、メモリ消費が多くても、多少遅くても、 確度の高い回答が得られるのであれば トータルで効率が良い場合はあるかもなぁ?とは思ったりも。

gpt-oss:120bを Emacsのgptelから使ってみたり。OllamaのGUIチャットと違って少しバッファリング されているので、読む思考をちょっと妨げられるかも知れません。 ただし、回答が表示されている間も、他のバッファに切り替えてテキスト編集を行う事はできるので、 仕上がりを待つ間は他の事をやってれば良いかも知れません。が、我慢できない場合はあるかもなぁ?😅

gpt-oss:120bでもHSV2RGB変換コードの生成を試してみたのですが、必ずしも最適っぽいのが安定的に 出力される感じではないみたい。出てきたコードの一つが以下。

/* ------------------------------------------------------------
 * HSV から RGB への変換
 *  h : 色相   (0.0〜360.0)
 *  s : 彩度   (0.0〜1.0)
 *  v : 明度   (0.0〜1.0)
 *  r,g,b : 変換結果を格納するポインタ (0.0〜1.0)
 *  戻り値 : 正常終了 0 / パラメータ範囲外 -1
 * ------------------------------------------------------------ */
int HSV2RGB(double h, double s, double v, double *r, double *g, double *b)
{
  /* 入力範囲チェック */
  if (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v < 0.0 || v > 1.0)
    return -1;

  /* s が 0 のときはグレイスケール */
  if (s == 0.0) {
    *r = *g = *b = v;
    return 0;
  }

  /* 色相を 6 区間に分割 */
  double hh = h / 60.0;          /* 0〜6 の範囲に正規化 */
  int i = (int)hh;               /* 区間番号 */
  double f = hh - i;             /* 区間内の小数部 */

  double p = v * (1.0 - s);
  double q = v * (1.0 - s * f);
  double t = v * (1.0 - s * (1.0 - f));

  switch (i) {
    case 0: *r = v; *g = t; *b = p; break;
    case 1: *r = q; *g = v; *b = p; break;
    case 2: *r = p; *g = v; *b = t; break;
    case 3: *r = p; *g = q; *b = v; break;
    case 4: *r = t; *g = p; *b = v; break;
    default:/* case 5 */ *r = v; *g = p; *b = q; break;
  }

  return 0;
}

何度か生成させてみた中で、360.0以上の場合は0.0とみなすコードが入ったり、 r,g,bのNULLチェックが入ったり、記されていないケースの対応は気分によって変わる感じのようです。 あと、このコードだとhが360.0の時に変になるなぁとは思ったりも (先日生成されたコードはswitch(i%6){}だったので大丈夫。 一昨日のはh_primeが6.0になるのですがxの値が調節されているので大丈夫)。 変換アルゴリズムの指示はともかく、エラーとする条件だとか、入力した値の正規化の有無などは、 そうしてくれと記せばそうしたコードが出てくるようなので、 結局、仕様をどれだけ細かく正確に伝えられるか次第なのかもしれません。 対人との違いは 不明確な仕様だったとしても「仕様に書いてないから適当に実装しました」と 返ってくるところかも知れません。対人ならば「これ、どうしときます?」と確認される事は期待できる かも知れません(期待できないかも知れませんが😅)。

指示をあれこれ変えてみている中で、生成されたコードのコメントに「クランピング」(clamping)という言葉を使っていたり。 上限を超えていたり下限を下回っていた場合に最寄りの上限値か下限値に丸める操作の事ですが、 普通に言葉として通じるらしい。ほぅ....。そしてクランピングは上限と下限の両方を処理するのに対して使い、 クリッピング(clipping)は上限だけを処理するのに使う という使い分けがあるらしい。 上限か下限に関係無く 範囲からはみ出た部分を切り落とす事を「クリッピング」って言っていたのですが、 使い分けないと誤解が生じる可能性がある事を知りました😅。語彙力、がんばるます。

アニメの「瑠璃の宝石」。おもしろいなぁと思って観ています。 キャラクターの絵柄が 過去にどこかでみたことあるような気がするのですが どこで見たかは思い出せず。

2025/09/13

AM中に起床。

gptel。先日のHSV2RGB変換を、コードのスタイルを少し変更する条件を加えてみたところ、 大分様子の違うコードが生成されました。

先日のに最後の一行を加えただけです。

/*
  色相と彩度と明度を 赤と緑と青 に変換するC言語の関数を作成してください。
  関数は「HSV2RGB(double h, double s, double v, double &r, double &g, double &b)」とし、
  入力となる色相は変数h、彩度は変数v、明度は変数vとし、変換結果はr,g,bはポインタ変数に
  赤はr、緑はg、青はbにそれぞれ値を格納してください。
  色相は0~360.0、彩度は0~1.0、明度は0~1.0 の範囲で指定します。
  赤、緑、青は 0~1.0の範囲に変換してください。
  関数の戻り値は変換できた場合は0を返し、入力となる色相、彩度、明度の値が範囲外の場合は-1を返してください。
  コード内コメントは日本語で、インデントは半角スペース2個で記してください。
*/

生成されたコードは以下の通り。

#include <math.h>

int HSV2RGB(double h, double s, double v, double *r, double *g, double *b)
{
  // 色相・彩度・明度の範囲チェック
  if (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v < 0.0 || v > 1.0)
    return -1;

  // 彩度が0ならグレースケール
  if (s == 0.0) {
    *r = v;
    *g = v;
    *b = v;
    return 0;
  }

  double hh = h / 60.0;
  int i = (int)floor(hh);
  double f = hh - i;
  double p = v * (1.0 - s);
  double q = v * (1.0 - s * f);
  double t = v * (1.0 - s * (1.0 - f));

  switch (i % 6) {
    case 0: *r = v; *g = t; *b = p; break;
    case 1: *r = q; *g = v; *b = p; break;
    case 2: *r = p; *g = v; *b = t; break;
    case 3: *r = p; *g = q; *b = v; break;
    case 4: *r = t; *g = p; *b = v; break;
    case 5: *r = v; *g = p; *b = q; break;
  }

  return 0;
}

関数の説明コメントは無くなり、r,g,bのNULLポインタチェックが無くなり、 色相に対応する変換の分岐がif文からswitch文に変わって少し最適化されているようです。 気まぐれで思いっきり変えられると「大丈夫か?」をチェックするのが大変だなぁ?とは思ったりも。 コンパイルエラーするレベルで間違えるならまだしも(対人だと「そんなの出してくるなよ」と思う所ですが)、 依頼する度に合ってたり間違ってたりされると、なんか無理ってなるかも知れません。 AIに限った話でも無いのかも知れませんが🥺。 今のところは「AIにまかせればいいじゃない?」は内容によるという感じに思います。 ダメそうだったら適当に諦めるのが良いかも知れません。対人だとそうもいかない場合があるかも知れませんが🥺。 人類、もう少しがんばるます。

EmacsハングというかCygwinハングを調べていてフェードアウトしてしまっていたのですが、 Emacs-31.0.50の方も確認してみたり。起動したまましばらく放置。

Google検索が新しくなった為か、いよいよクエリパラメータの「num=数」が使えなくなってしまっていて 不便極まりありません。10じゃ少ないって。

Unicode 17.0の仕様がリリースされたらしい。 追加された絵文字は8つのようですが、歪んだ顔はともかく、シャチとか宝箱って無かったのかと思ったりも。 でも、記事によって追加された絵文字が違っているような....?🤔 (参考記事1, 参考記事2)。 そういや、まだ Windows11は Unicode16.0の絵文字もサポートされていなかったような...と思って今見てみたら 表示されるようになってました。あれぇ?いつサポートされた?と思ったのですが、 C:/Windows/Fonts/seguiemj.ttf が 9月10日付けになっていたので、この前のWindowsUpdateで入ったっぽい。 という訳で1年遅れになるのは仕方ないのか?🤔。
さておき、Emacsのmasterブランチには Unicode17.0対応 が9月11日頃に入っているようです。 という訳でテストしていたEmacs-31.0.50を一旦止めて、最新を git pull し直してパッチも当て直して ビルドし直し。何故か起動できなくなって悩んだのですが、lisp/loaddefs.elを消して再生成されたら 大丈夫になりました。 あと、Noto Emojiフォントも更新。 表示してみたのが以下。

Unicode 16.0/17.0 絵文字 on Emacs31

因みにバレエダンサー(🧑‍🩰)は人とバレエシューズの合字のようなので、Fluent Emoji(Segoe UI Emoji)では 来年にならないと表示されるようにはならないと思われます。
さておき、リンゴの芯の絵文字は何かの間違いなのか?🤔 もう少し調べてみたところ、今年7月の世界絵文字デーの時に 9つの絵文字が追加されるような事が アナウンスされていた模様 (元ネタ)。 なのですが、9月のリリース時には8つの絵文字の追加となっていたようです (元ネタ)。 どれが無くなったのかは分からない感じだったようですが、結果的に「リンゴの芯」が無くなってたみたい。 なぜ引っ込められたのかは不明。ともあれ 間違った記事が存在しているのは事実です。

2025/09/12

テレワーク。早めに終了。

gptel。gptel-send や gptel-rewrite を試してみたり。どこまで書けるものか?を試してみた感じ、 ある程度内容を示せばイケるみたい。

以下のような文言を記してみました。

/*
  色相と彩度と明度を 赤と緑と青 に変換するC言語の関数を作成してください。
  関数は「HSV2RGB(double h, double s, double v, double &r, double &g, double &b)」とし、
  入力となる色相は変数h、彩度は変数v、明度は変数vとし、変換結果はr,g,bはポインタ変数に
  赤はr、緑はg、青はbにそれぞれ値を格納してください。
  色相は0~360.0、彩度は0~1.0、明度は0~1.0 の範囲で指定します。
  赤、緑、青は 0~1.0の範囲に変換してください。
  関数の戻り値は変換できた場合は0を返し、入力となる色相、彩度、明度の値が範囲外の場合は-1を返してください。
*/

そして出てきたコードが次のような感じ。

#include <math.h>

/*
 * Convert HSV to RGB.
 *
 * Parameters:
 *   h  - Hue in degrees [0, 360]
 *   s  - Saturation [0, 1]
 *   v  - Value (brightness) [0, 1]
 *   r  - Pointer to store red component [0, 1]
 *   g  - Pointer to store green component [0, 1]
 *   b  - Pointer to store blue component [0, 1]
 *
 * Returns:
 *   0  - Success
 *  -1  - One or more parameters out of range
 */
int HSV2RGB(double h, double s, double v,
            double *r, double *g, double *b)
{
    if (!r || !g || !b)
        return -1;

    if (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v < 0.0 || v > 1.0)
        return -1;

    double c = v * s;                     /* chroma */
    double h_prime = h / 60.0;
    double x = c * (1.0 - fabs(fmod(h_prime, 2.0) - 1.0));
    double m = v - c;

    double r1, g1, b1;

    if (h_prime >= 0.0 && h_prime < 1.0) {
        r1 = c;  g1 = x;  b1 = 0.0;
    } else if (h_prime >= 1.0 && h_prime < 2.0) {
        r1 = x;  g1 = c;  b1 = 0.0;
    } else if (h_prime >= 2.0 && h_prime < 3.0) {
        r1 = 0.0; g1 = c; b1 = x;
    } else if (h_prime >= 3.0 && h_prime < 4.0) {
        r1 = 0.0; g1 = x; b1 = c;
    } else if (h_prime >= 4.0 && h_prime < 5.0) {
        r1 = x;  g1 = 0.0; b1 = c;
    } else { /* h_prime >= 5.0 && h_prime < 6.0 */
        r1 = c;  g1 = 0.0; b1 = x;
    }

    *r = r1 + m;
    *g = g1 + m;
    *b = b1 + m;

    return 0;
}

合ってそうに思います。ほぅ.....。「色相は0~360.0の範囲」としか記していませんが、 コードのコメントは「Hue in degrees」となっているので、ラジアン角では無いだろうと解釈してます。 また、変換のアルゴリズムも示していません。HSVもRGBも色の表現で、 変換するアルゴリズムを知っていないとコードには落とせないと思います。 加えてC言語を知らないとダメで、ポインタも知っているという事になるかと思います。 13GBのモデルのどこかに文脈からHSVをRGBに変換するアルゴリズムとC言語の知識が 含まれているという事になるのかなぁ と思います。 仮にコードは人間が書いたコードのコピペだったとしても、文脈から変換アルゴリズムを 引き出して対応するコピペ元を紐づけられる必要はあるので、どっちにしても色々知っていないと無理だろう とは思います。器用なもんです😲。

という事から考えても、先日の「Emacsでの矩形領域の選択方法」の回答はやっぱり学習データとなる ドキュメントやWeb情報が訳わからんとなっている可能性が高いようには思ったりも😅。

2025/09/11

テレワーク。早めに終了。

記録的短時間大雨で落雷による停電がありました。体感で1分くらい停電したように思いますが、 色々リセットされてつらい。EmacsハングのテストはノートPCで行っているので継続されてました😅。

Emacsで使用できる AIチャットクライアントはいくつかあるようですが、Ollamaも使えるらしい gptelを試してみたり。 面倒臭いのは依存パッケージに Transient の 0.7.4 以降が必要なのですが、Emacs-30.2の標準パッケージのは 0.7.2.2 の為そのままでは使え無さそうです。 Transient は今や色んな所で使われつつあるので、 迂闊に新しいのを入れると色んな所がダメになりそうなのですが、仕方ないので入れてみたり。 最初に 影響を受けるであろう magit をちょろっと確認してみたのですが、「l l」でログを表示すると、 これまでのログを全て表示しようとしていたり。早速影響があるのが判明。 仕方ないのでmagitの方も更新したところ、適当な行数のログ表示で止まるようになりました。

で、本題のgptelを試したり。.emacsでの最小設定は以下くらいで良さそうです。

(require 'gptel)
(setq
 gptel-model 'gpt-oss:20b
 gptel-backend (gptel-make-ollama "Ollama"
                 :host "localhost:11434"
                 :stream t
                 :models '(gpt-oss:20b)))
(setq gptel-default-mode 'org-mode)

チャット以外にも選択したリージョンを流し込んだり、回答を挿入する事もできるみたいですが、 まだ使いこなせず😓。

何気に「テキストエディタのEmacsで矩形領域を選択する方法を教えてください。」 って聞いてみたら「矩形マークモードをオン | C-x r t」みたいなのが返ってきたのですが、 そりゃ無いわ と思ったりも。「マウスを使うことはできますか?」も 全然ダメな感じのが返ってきて、 Infoを読むしか無いのかと思ったりも😓。 なんで妙な覚え方をしているのだろう?と思わなくもありませんが、 Emacsのドキュメントが訳わからんとか、Webの情報は一つの事をやるのにいくつも方法があって やっぱり訳わからんという事を暗に示唆しているのかも知れません😓。 因みに Emacs-30.2でキーバインドを変更していなければ、 矩形選択開始は「C-x SPC」(rectangle-mark-mode)で、 マウスでの矩形選択は「C-M-<down-mouse-1>」(mouse-drag-region-rectangle)です。

とは言え「相対性理論について教えてください」みたいな質問にも答えてくれる事を考えると、 かなりの 物知り博士 には違いありません。モデルのファイルサイズは13GBくらいなのですが、 この中に大概の情報が含まれていると考えると(同じサイズの動画ファイルとかに比べると) 情報密度がかなり高いとも思えます。

2025/09/10

テレワーク。早めに終了。

ノートPCはEmacsハングのテストの為に立ち上げっぱなしにしていたのですが、 今朝 Windowsアップデートが自動的に適用されてました。Emacsハングのテストは強制終了となったものの、 それと引き換えに いつもWindowsアップデートのダウンロートが何故か全然進まない イライラがありませんでした。 次回から使ってなくてもWindowsアップデート前日に電源入れておくかと思ったりも😓。

今まであまりよく見ていなかったのですが、何故かGPUの 3Dの負荷が常時 30% くらいあるなぁ?と思ったり。 「デスクトップウインドウマネージャー」というプロセスが薄っすらGPUを使っているようなのですが、 なんぞこれ?と思ったり。そして、起動しているEmacsを最小化するとGPU負荷が 0% になるようだったり。 どういうメカニズム?🤔
Webにあるような視覚効果の無効化をいくつか適用してみたのですが、あまり変化は無いようにみえたり。 あと、ウインドウサイズを小さくすると負荷が下がり、大きくすると上がるようです。 最小化すると0になるのとも辻褄が合っていると言われればそんな気もします。 まぁ気になるなら最小化しておくかというくらいで。

Ollamaの OpenAI互換APIを CygwinのPythonから使ってみようと思い、「pip install openai」を 実行してみたのですが、jiter という依存ライブラリがインストールできないようだったり。 エラーメッセージの一部が以下。

 :
  × pip subprocess to install build dependencies did not run successfully.
  │ exit code: 1
  ╰─> [28 lines of output]
      Collecting maturin<2,>=1
        Using cached maturin-1.9.4.tar.gz (213 kB)
        Installing build dependencies: started
        Installing build dependencies: finished with status 'done'
        Getting requirements to build wheel: started
        Getting requirements to build wheel: finished with status 'done'
        Installing backend dependencies: started
        Installing backend dependencies: finished with status 'done'
        Preparing metadata (pyproject.toml): started
        Preparing metadata (pyproject.toml): finished with status 'error'
        error: subprocess-exited-with-error

        × Preparing metadata (pyproject.toml) did not run successfully.
        │ exit code: 1
        ╰─> [3 lines of output]
            Python reports SOABI: cpython-39-x86_64-cygwin
            Unsupported platform: x86_64-cygwin
            Rust not found, installing into a temporary directory
            [end of output]

        note: This error originates from a subprocess, and is likely not a problem with pip.
      error: metadata-generation-failed

      × Encountered error while generating package metadata.
      ╰─> See above for output.

      note: This is an issue with the package mentioned above, not pip.
      hint: See above for details.
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.

 :

文字通り読むと「Unsupported platform: x86_64-cygwin」で「Rust not found, installing into a temporary directory」 だからという事らしい。Rust依存なのか....🥺

仕方ないので他の方法を少し調べてみたところ、デフォルトは「localhost:11434」のみアクセス可能なようですが、 環境変数 OLLAMA_HOST と OLLAMA_ORIGINS を設定すれば、ローカルエリアネットワークのコンピュータからも アクセス可能になるようです。VirtualBoxの仮想マシンの繋がっているネットワークを許可するように 環境変数を設定してOllamaを再起動した後、仮想マシンから「curl http://xxx.xxx.xxx.1:11434」でアクセスしたら 「Ollama is running」の文字列が返ってきたのでVMからアクセスできるようです。 VMのFedoraに「pip install openai」でopenaiライブラリをインストールした後、Webのサンプル Pythonコードを実行してみたら返事が返ってきたので一応使える模様。 ただ、JSON形式で取得できるとなっているようですが、回答内容そのものは辞書型変数の中の response.choices[0].message.content に Markdown形式が文字列で格納されているだけのように思えたり。

2025/09/09

テレワーク。早めに終了。

デスクトップのWindows11もCygwinにパッチを当てて様子を見てみることに。Emacsの動作よりも、普段使いして 他のコマンドに副作用が無いかの様子を見る感じで。

タスクマネージャでGPUの使用率にCUDAが選べなかった件は、先日の参考ページの通りで 再起動したら 表示できるようになりました。Ollamaを動かしてみたところ、問に答える時にCUDA全力で動いているようです。 あとよく見ていなかったのですが、GPUメモリをバク食い(13.8GBくらい)しています。

EmacsハングのCygwinパッチ対応。一昨日から複数のEmacsを起動しっぱなしにしていたのですが、 3つあるうちの一つが止まっていたり😭。やっぱりロックが解除できない状況に陥っているようです。 確かに、パッチのロジックでは、ロックがかかっている場合は100% スキップ されますが、ロックがかかっていないと判定した後で、ロックを掛ける前にスレッドがスイッチして ロック実行を横取りされる可能性はゼロではありません。 それをアトミックに行うのが InterlockedExchange() などのような特別な関数なのでしょうけど。うーむ。 ただ、ハング発生確率はかなり低くなっているとは言えそうです。

2025/09/08

テレワーク。早めに終了。

EmacsハングのCygwinパッチ対応。昨日から複数のEmacsを48時間ほど起動しっぱなしにしていたのですが、 どれもハングすること無く動き続けてます。ひとまず今週のWindowsアップデートが来るまでそのまま継続してみよう。

唐突ですが ローカルLLMとやらを試してみたくなったので調べてみたり。 Ollamaというツールを使えば 色々なモデルが試せるようなのでインストールしてみたり。 インストール完了と同時にプロンプト入力ウインドウが開き、適当に質問を入れたらモデル(gpt-oss:20b) がダウンロードされ始め、完了すると応答が返ってきたのでこれで使えるようです。

Ollamaスナップショット

ollamaというコマンド名でコマンドラインからも使えるので(Cygwinのmintty+bash、screenコマンドを挟んでも 良いし、Emacsのvtermからも一応使えました)、どうにかすればEmacsとかからも使えるんじゃないかなー? という気がします。ただ、応答がMarkdownで表示されるようなので、普通のターミナルでは なんか読みにくいです😓。
あと、デスクトップのWindows11のタスクマネージャはGPUの使用率表示にCUDAを選べません。 見かけ上 GPUを使っていないようにも見えるのですが、 GPU-Zで負荷を見てみると一応GPUを使っているようです。 Webで検索してみるとズバリな回答があったり (参考ページ)。 再起動が必要みたいですが、今は色々動かしてて再起動したくないので明日試してみよう。

2025/09/07

AM中に起床。

掃除したり洗濯したり。

D言語で以下のような構造体のコンストラクタを書いたのですが、何故かエラーで怒られたり。

$ cat -n struct_test.d
     1  import std.stdio;
     2  import std.string;
     3
     4  struct Test{
     5    int x;
     6
     7    this(){
     8      x=3;
     9    }
    10  }

$ dmd struct_test.d
struct_test.d(7): Error: constructor `struct_test.Test.this` default constructor for structs only allowed with `@disable`, no body, and no parameters
  this(){
  ^

イマイチ何を怒られているのか分からないのですが、「this(int){x=3;}」だと怒られないようです。 何かしら引数を与えられるようにする必要があるようですが 前からこうでしたっけ?🤔

GIMPの開発版 3.1.4のリリースアナウンスが出ているのを知ったり (GIMP 3.1.4: Second Development Release towards GIMP 3.2)。 ベクターレイヤーというものが追加されるようです。ほぅ....。 パスツールを使って描く事ができるようですが、どんなUIになるのかは説明ではよくわからず。

2025/09/06

AM中に起床。

Emacsハングの件。というかCygwinハングの件。 straceでアタッチしたままほったらかしておいたところハングしてました。 ダメなのか?と思い Process Explorer で見てみたところ何故かメインスレッドがサスペンド状態 になっていました。Resumeで再開してみたらそのままSegfaultになったり。なんだこりゃ?🤔 straceでアタッチしていたのがダメなのか?とも思ったので、今度はただ起動しておくだけにしてみたり。 どうなるか....?

12時間ほど見てみたのですが、straceでアタッチしていた時のようにサスペンド状態にはならなかったり。 なにやら動きが変わるのかも知れませんが確認ムズい🥺。
一旦区切りとして、Cygwinのパッチは以下のような感じ。

diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index f79978f73..bb45b0148 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -961,7 +961,7 @@ _cygtls::interrupt_now (CONTEXT *cx, siginfo_t& si, void *handler,
       if (!inside_kernel (cx, true))
        {
          HANDLE h_veh = AddVectoredExceptionHandler (0, singlestep_handler);
-         cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
+//       cx->EFlags |= 0x100; /* Set TF (setup single step execution) */
          SetThreadContext (*this, cx);
          suspend_on_exception = true;
          in_singlestep_handler = false;
diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc
index 1c9b8037b..c34ff8c26 100644
--- a/winsup/cygwin/mm/cygheap.cc
+++ b/winsup/cygwin/mm/cygheap.cc
@@ -743,6 +743,8 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
   while (++ix < (int) nthreads)
     {
       /* Only pthreads have tid set to non-0. */
+      if (threadlist[ix].thread->locked () != false)
+       continue;
       threadlist[ix].thread->lock ();
       if (!threadlist[ix].thread->tid
          || !threadlist[ix].thread->initialized)

二つありますが、Emacsハングの対応パッチは mm/cygheap.cc の方だけです。 lockがかかっていたらスキップするという そのまんまのロジックです(以前のメモ)。 因みにstraceによるデバッグ表示無しのバージョンです。 exceptions.cc の方は 3.6.4-1 でgdb上で emacsを実行すると 謎のSIGTRAP で止まりまくるのを 回避する為のパッチ(以前のメモ)ですが、 こちらは何か副作用があるかも知れません。

2025/09/05

テレワーク。気持ち早めに終了。

Emacsハングの件。というかCygwinハングの件。 先日のコンパイルのオプティマイズレベルを上げたものでもハング再現しないようだったり。 そういや既にロックしてたらスキップするみたいなコードなのですが、一度発生したらロックしっぱなしなのか、 ぶつかりさえしなければアンロックされているのか、が気になったので調べてみる事に。 と言っても、デバッガ上で動かすと動きが変わってしまいそうなので、デバッグprintを使おうと思ったのですが、 普通のはどれも大量に使用されているようだったので、special_printf()というのを使って 「strace --mask=special ...」でメッセージを絞る感じで観察しようと思ったり。 しかし、「strace --mask=special emacs-w32」で最初から strace に乗せると、メッセージが出ていなくても 異常に遅かったので、起動を済ませた後で 「strace --mask=special -p プロセスID」でアタッチする方式で網掛け。 さて、どうなるか....?

網掛けメッセージはわりとすぐに出力されたり。ただ、持続したりはしないみたい。 ついでにシグナル番号と思われるものも表示してみていたところ、どうやら SIGALRM を受けた時に 既にロックされている場面に遭遇しているようでした。killコマンドで SIGALRM を送ったらどうなる? と何の気なしに「while true; do kill -s SIGALRM pid; done」で送りまくってみたら、 デバッグメッセージが流れるように表示されたり😅。 もしかして再現を加速できる?と思ったので Cygwin 3.6.2-1 かつ オリジナル emacs-w32 で試してみた のですが、動きが遅くなったりはするもののハングにまでは至らず。むぅ。

2025/09/04

テレワーク。早くもなく遅くもなく終了。

Emacsハングの件。というかCygwinハングの件。 先日加えたCygwinの改造を適用してEmacsを立ち上げっぱなしにしていたのですが、 26時間以上ハング再現しないという状況です。 対処方法として正しいか否かは別にして、ひとまず避けられているみたい。 一旦止めて コンパイルのオプティマイズレベルをO0からO2に戻したものに差し替えて しばらく様子を見てみよう。

2025/09/03

テレワーク。早めに終了。

Emacsハングの件。もう一度Cygwinのソースコードを眺めたり。 ロック制御している箇所の一つは winsup/cygwin/mm/cygheap.cc:init_cygheap::find_tls() の中なのですが、 もう一つ winsup/cygwin/local_includes/cygtls.h 内で定義されるクラス _cygtls の中の get_signal_arrived()というメソッドがありました。 なんとなく、シグナルが到着したら何かするって感じみたいです。 昨日の改造コードは既にロックがかかっていればそのままにするってロジックにしたのですが、 なんかダメかもなぁ?って感じだったかも。 そこで、find_tls()の方を ロックがかかっていたらそのスレッドは無視して次のスレッドを チェックするようなロジックにしてみたり。まぁこれも直している事になっているのか分かりませんが、 二重にロックしようとして脱出できなくなる事は無くなるハズ?という期待です。 そもそも、一つのスレッドで find_tls() と get_signal_arrived() を同時に実行する事は無い のだとすると、find_tls()を実行するスレッドAと、get_signal_arrived()を実行するスレッドBが ちゃんと切り替われば、ロックが脱出できなくなることは無いハズと考えられます。 しかし、実際にロック処理で脱出できなくなっているので、 「lock()~unlock()」の組がどの瞬間にも複数重ならないようにしたらどうなるか? という感じです。

Emacsハングとは関係無い話。ELISPの message関数を使ってデバッグしていて、何故かELISPエラーと なって、なんで?ってなりました。最小コードで示すと「(message "100%")」でエラーとなりました。 message関数の1番目の引数はフォーマットストリングなので「%」がダメって事でした。 実際には文字列の入っている変数を 何の気なしに「(message strvar)」とかやってしまってたのですが、 習慣的に「(message "%s" strvar)」と書く癖を付ける必要があるかもなぁ?とは思ったりも。 修行が足りません🥺。

タケモトピアノのCMがリニューアルでHD化されとる。

2025/09/02

テレワーク。早めに終了。

先日のロックコードのループにカウンタを設けて、あるカウント回数に達したら exit するようなコードにして ハングではなく終了するか?という網掛け確認してみたり。.....すぐに再現せず。

時間はかかりましたが一応 網にはかかったり。やっぱりlockを脱出できない場合があるみたい。 で、ロックを実行するコードを眺めていて思ったのですが、自分でロックをかけて用事が終わったら 自分でアンロックするという前提のコードになっているのですが、既にロックがかかっている場合は 脱出できない状況に必ず陥ると思われます。なので、ロックがかかっていない場合に限り ロックをかけるという風にしてはどうか?と思ったり。

コードを変更して実行。ひとまずハング再現待ち。と言ってもハングしない状況になるので、 どこでロックされたか分からないのに別の所でロックを外す事になるけど、それで変にならないか?という 確認になるかも知れませんが。

ん~~、なんかダメでした。何故かハングが再現する場合と、exitする網掛けに引っかかる場合があって、 なんで?な感じ。

2025/09/01

テレワーク。早めに終了。

Emacsハングの件。 Emacsをgdbに乗せずに直実行したところでハングが再現した後、以下のような操作でどこで止まっているかを 調べてみたり。

  1. Process Explorer で予めCPUをバグ食いしているスレッドIDを調べておく。
  2. 「gdb -p プロセスID」でアタッチする。
  3. 「info threads」のスレッド一覧と、1.のスレッドIDを付き合わせて、「thread #id」でスレッドを切り替える。
  4. 「si」コマンドで命令単位のステップ実行をしばらく繰り返して、Cygwin上のコード領域に脱出する。

って感じで見たところ、 winsup/cygwin/mm/cygheap.cc の中の init_cygheap::find_tls() の中の 「threadlist[ix].thread->lock ()」のロック処理が脱出できないように見えたり。 lock()は ./winsup/cygwin/local_includes/cygtls.h 内の class _cygtls の中に実装されているようで、

  void lock ()
  {
    while (InterlockedExchange (&stacklock, 1))
      {
#ifdef __x86_64__
        __asm__ ("pause");
#else
#error unimplemented for this target
#endif
        Sleep (0);
      }
  }

というコードのようですが、InterlockedExchange()が非ゼロのままだと無限ループしてしまうと いう感じになるようです。ただ、先日の truncl()とは関係無い場所にも見えるので、 本当にCPUをバク食いしている原因コードの中なのかは分からず。
まだよくわかりませんが、InterlockedExchange()は &stacklock の値が0なら1をセットして 戻り値は 変更前の0が返るのでループを脱出できるという事のようです。誰かがロックしていて &stacklockの値が1ならば、戻り値は元の&stacklock値の1が返るのでループするという感じ。 ロックされてなくて自分がロックできれば脱出できるけど、誰か他の人がロックしっぱなしだと 自分がロックできるまでループを脱出できないという事が起こる可能性はあるかも知れません。 でもそれはデッドロックしているのでダメかも。


TOP

古いの
2025.08 2025.07 2025.06 2025.05 2025.04 2025.03 2025.02 2025.01
2024.12 2024.11 2024.10 2024.09 2024.08 2024.07 2024.06 2024.05 2024.04 2024.03 2024.02 2024.01
2023.12 2023.11 2023.10 2023.09 2023.08 2023.07 2023.06 2023.05 2023.04 2023.03 2023.02 2023.01
2022.12 2022.11 2022.10 2022.09 2022.08 2022.07 2022.06 2022.05 2022.04 2022.03 2022.02 2022.01
2021.12 2021.11 2021.10 2021.09 2021.08 2021.07 2021.06 2021.05 2021.04 2021.03 2021.02 2021.01
2020.12 2020.11 2020.10 2020.09 2020.08 2020.07 2020.06 2020.05 2020.04 2020.03 2020.02 2020.01
2019.12 2019.11 2019.10 2019.09 2019.08 2019.07 2019.06 2019.05 2019.04 2019.03 2019.02 2019.01
2018.12 2018.11 2018.10 2018.09 2018.08 2018.07 2018.06 2018.05 2018.04 2018.03 2018.02 2018.01
2017.12 2017.11 2017.10 2017.09 2017.08 2017.07 2017.06 2017.05 2017.04 2017.03 2017.02 2017.01
2016.12 2016.11 2016.10 2016.09 2016.08 2016.07 2016.06 2016.05 2016.04 2016.03 2016.02 2016.01
2015.12 2015.11 2015.10 2015.09 2015.08 2015.07 2015.06 2015.05 2015.04 2015.03 2015.02 2015.01
2014.12 2014.11 2014.10 2014.09 2014.08 2014.07 2014.06 2014.05 2014.04 2014.03 2014.02 2014.01
2013.12 2013.11 2013.10 2013.09 2013.08 2013.07 2013.06 2013.05 2013.04 2013.03 2013.02 2013.01
2012.12 2012.11 2012.10 2012.09 2012.08 2012.07 2012.06 2012.05 2012.04 2012.03 2012.02 2012.01
2011.12 2011.11 2011.10 2011.09 2011.08 2011.07 2011.06 2011.05 2011.04 2011.03 2011.02 2011.01
2010.12 2010.11 2010.10 2010.09 2010.08 2010.07 2010.06 2010.05 2010.04 2010.03 2010.02 2010.01
2009.12 2009.11 2009.10 2009.09 2009.08 2009.07 2009.06 2009.05 2009.04 2009.03 2009.02 2009.01
2008.12 2008.11 2008.10 2008.09 2008.08 2008.07 2008.06 2008.05 2008.04 2008.03 2008.02 2008.01
2007.12 2007.11 2007.10 2007.09 2007.08 2007.07 2007.06 2007.05 2007.04 2007.03 2007.02 2007.01
2006.12 2006.11 2006.10 2006.09 2006.08 2006.07 2006.06 2006.05 2006.04 2006.03 2006.02 2006.01
2005.12 2005.11 2005.10 2005.09 2005.08 2005.07 2005.06 2005.05 2005.04 2005.03 2005.02 2005.01
2004.12 2004.11 2004.10 2004.09 2004.08 2004.07 2004.06 2004.05 2004.04 2004.03 2004.02 2004.01
2003.12 2003.11 2003.10 2003.09 2003.08 2003.07 2003.06 2003.05 2003.04 2003.03 2003.02 2003.01
2002.12 2002.11 2002.10 2002.09 2002.08 2002.07 2002.06 2002.05 2002.04 2002.03 2002.02 2002.01
2001.12 2001.11 2001.10 2001.09 2001.08 2001.07 2001.06 2001.05 2001.04 2001.03 2001.02 2001.01
2000.12 2000.11 2000.10 2000.09 2000.08 2000.07 2000.06 2000.05 2000.04 2000.03