最近の出来事

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