最近の出来事

2026/01/18

AM中に起床。

掃除したり洗濯したり。

Emacsの31系になる予定のmainブランチをcloneしてパッチ無しの動きを確認できるようにビルドしたり。 ビルド自体は問題無くできたのですが、拙作のsysmonのテキストモードが動かなくなっているなぁ? というのに気づいて調べたり。どうやら aset関数にマルチバイト文字を指定することができなくなっている模様。 グラフィックスアレイの座標位置にピクセルをセットする感覚で、テキストアレイの文字座標位置の文字を asetで書き換えるような使い方をしていたのですがダメになったらしい。仕方ないので substringやらconcatやらを使って切ったり貼ったりする方式に書き換え。釈然とはしていない🙁。

2026/01/17

AM中に起床。

何気にJXL画像をEmacsで表示しようとしたら表示できなくなっていたり。 Cygwinの ImageMagickではJXLフォーマットはサポートされていないので 拙作のperlスクリプトで ラップして見かけ上 JXLフォーマットの読み込みをサポートしている風にしているのですが、 なぜかうまく動かなくなっていたので調べてみたり。 どうやら「magick convert ...」と実行すると 「WARNING: The convert command is deprecated in IMv7, use "magick" instead of "convert" or "magick convert"」 というメッセージが出るようになっているのですが、このメッセージが出ることが悪さをしているようだったので、 「magick」だけにしてみたところ、コマンドラインではうまく動くようになったのですが、 やっぱりEmacs上では表示がうまくできなかったり。なんでだ?🤔

どうやら「magick convert」と「magick」とではコマンド解釈や処理に互換性が無くなっている部分があるようです。


という訳で、BMPファイルの方はどうにかして修復する方法を調べたり。 ダメなのは RLE圧縮されているBMPで、8bit,4bit パレットのバリエーションがあります。 ImageMagickで修復を試したのですがどうにもうまくゆかず。 結局GIMPを使って RLE圧縮前のファイルを読み込ませてRLE圧縮指定で名前を付けてエクスポートし直すと パレットが壊れる(例えば4bitだったのが8bitになってしまうとか)ような事は無く修復されて エクスポートされているようだったので、これで良しとしてみました。

-auto-orient の位置の方にも一つ問題があります。そもそも -auto-orient を使用する理由は、 以前 TGAフォーマットの画像を表示したとき、 上下が逆に表示されるものがあったからでした。TGAには格納方向フラグというものがあって、 このフラグを考慮しないと上下が思った方向に表示されない場合があります。 Emacsの組み込みImageMagickではMagickAutoOrientImage()という関数を使用していて、 どっち格納かによらず所望の方向で表示されるのですが、外部convertの場合は明示的に -auto-orientを指定する必要がありました。 で、このオプションをどうやって追加するか?という事なのですが、 lisp/image/image-converter.el内でdefvar定義されている変数image-converter--convertersを、 「(imagemagick :command ("wrapped_convert" "-auto-orient") :probe ("-list" "format"))」 というように書き換えていました。しかし、今回の非互換に対応しようとすると、 入力ファイル指定の後に オプションを指定しなければならないのですが、 そういうオプション指定体系に対応していないという問題があります。 とはいえ、image-modeで表示しようとすると 外部コンバータを使用するように指定したファイルが 全てコマンドラインエラーで表示できなくなる為、-auto-orient指定を外すことにしました🥺。
個人的に「command [options] [files....]」となっていないのが筋が悪いと言いますか。 ただ、ImageMagickの場合はオプションの体で処理の順番を明示している所もあるので 正直面倒臭いです。「magick convert」が非推奨なのもよくわからないなぁと思う所もあります。

-auto-orientの影響を確認してみたのですが、外してもデフォルトで-auto-orientが有効な感じに なっているようです。ならば問題になる事は無いかも? だた、現在開発中のmasterブランチ(Emacs31系)では「("convert" "-layers" "merge")」 としているようなので、もしmagickコマンドだけになると動かなくなります。

2026/01/16

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

そういえばと思い、gptelを使って次のようなことをさせてみたり。
以下のようなテキストがあったとして、

 | 1 |  1.2.3.4 , 100.101.102.103 |
 | 2 |  1.2.3.4 , 100.101.102.103 |
 | 3 |  100.101.102.103 , 1.2.3.4 |
 | 4 |  1.2.3.4 , 100.101.102.103 |
 | 5 |  100.101.102.103 , 1.2.3.4 |
 | 6 |  1.2.3.4 , 100.101.102.103 |
 | 7 |  1.2.3.4 , 100.101.102.103 |
 | 8 |  1.2.3.4 , 100.101.102.103 |
 | 9 |  100.101.102.103 , 1.2.3.4 |

gptel-rewriteで 「Rewrite: 文字列「1.2.3.4」を「100.101.102.103」に、「100.101.102.103」を「1.2.3.4」に入れ替えるように置換してください」 という指示で置換を行わせてみたところ、

| 1 | 100.101.102.103 , 1.2.3.4 |
| 2 | 100.101.102.103 , 1.2.3.4 |
| 3 | 1.2.3.4 , 100.101.102.103 |
| 4 | 100.101.102.103 , 1.2.3.4 |
| 5 | 1.2.3.4 , 100.101.102.103 |
| 6 | 100.101.102.103 , 1.2.3.4 |
| 7 | 100.101.102.103 , 1.2.3.4 |
| 8 | 100.101.102.103 , 1.2.3.4 |
| 9 | 1.2.3.4 , 100.101.102.103 |

のように書き換えられました。行頭の空白が無くなっているなど、細かなところで 「その書き換えはしなくてよい」という所はありますが、この程度であれば期待通りに書き換えられるようです。 このような「入れ替え」の置換を普通にやると、一時的に存在しない文字列に置き換えてから2回置換を 実行する(正味3回置換)必要があるかと思います。 ただ、今のところ意外と時間がかかります😅。100倍くらい速くなれば「AI置換」みたいな 編集コマンドとして使えるようになるかも知れません。 EmacsならELISPでそういうのを書けば良いのかも知れませんが(身も蓋もなし)。

もしやと思い、GoogleのAIモードで 「Emacsで文字列Aと文字列Bを入れ替えるような置換を行うことはできますか?」 と聞いてみたら、
はい、Emacsでは正規表現置換(query-replace-regexp)とLisp式を組み合わせることで、
文字列Aと文字列Bを一度に入れ替えることが可能です。

以下の手順で操作します:

1.C-M-% (または M-x query-replace-regexp)を入力します。
2.置換対象(Query replace regexp)に次のように入力し、Enter を押します。
  \(文字列A\)\|\(文字列B\)
3.置換後(with)に次のように入力し、Enter を押します。
  \,(if \1 "文字列B" "文字列A")
  ※ \, は後に続くLisp式を評価することを意味します。この式は「もし1番目のグループ
    (文字列A)にマッチしたら文字列Bに、そうでなければ文字列Aに置き換える」という
    処理を行います。
4.あとは通常の置換と同様に、y(置換する)や !(すべて置換する)で進めます。

という回答が返ってきて、やってみたら所望の通りに入れ替え置換ができました。マジっすか😮 置換対象を正規表現で指定するのはともかく、どのような文字列に置換するかにLISP式が書けるって 応用範囲が広すぎです。そんな訳で「それ、できるよ」ってことでした。

2026/01/15

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

BIOSアップデートが来ていたので入れたり。念のためUSB-typeCは本体から外しておいた為か今回も失敗はせず。

2026/01/14

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

Emacsのハング確認。パッチをあてたCygwin3.6.6で丸4日ほど Emacsのimage-dired+スライドショーで 負荷確認をしていましたが期待通りハングせず。WindowsUpdateのため一旦終了。

WindowsUpdate後に Winボタンからアプリを探そうとしたら変なカテゴライズをされていて これまでの縦に全部表示されるメニューが無くなっているようだったり。 表示方法は切り替えられるようですが、自分で分類できないカテゴリ表示なんて誰が使うの?

2026/01/13

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

先日のorg-modeで表をHTMLエクスポートしない記述方法を含んで 「Emacs Org-mode の覚え書き」 を更新してみました。御参考まで。

2026/01/12

AM中に起床。

そういえば、org-modeで 表を元にして gnuplotや Rを使ってグラフ画像を描くことができますが、 HTMLなどにエクスポートする際にはグラフ画像だけをエクスポートしたいと思ったとき、 org-modeの8.3以降では方法が分らないという事がありました(以前のメモ)。 何気に検索してみると、AI回答に方法が示されていたので試してみたところ、所望の結果が得られたり。

#+BEGIN_SRC R :var data=R_data :file noexport_test4.png :width 640 :height 400 :results graphics :exports results
split.screen(c(1,2))
screen(1);pie(data[,2],labels=data[,1], clockwise=TRUE)
screen(2);barplot(data[,2],names.arg=data[,1])
#+END_SRC

[[./noexport_test4.png]]

*** データテーブル群 :noexport:
#+NAME: R_data
| a | 0.35 |
| b | 0.45 |
| c |  0.1 |
| d |  0.1 |

どういう事かと言うと、適当なセクション(この例では「*** データテーブル群」)を用意して、 そのセクションは丸ごとエクスポートしない、でも表R_dataは参照できるので、 Rブロックではグラフ画像が生成され、そのグラフ画像だけを参照するようなHTMLが生成される という事のようです。応用の範囲という感じかも知れませんが、もっと直観的に 「#+NAME: R_data :exports none」とかにはならないのだろうか?と思わなくはありません。 しかしながら、データをビジュアライズするためのプリプロセッサとしてorg-modeを使うのが 少し手軽になるような気はします。

2026/01/11

AM中に起床。

掃除したり。

ちょっとだけ「Emacsの雑記」を更新しました。 最近のハングの件とか、パッケージのImageMagickが更新されたのに対応したパッチ更新とか、 本文のマイナーな更新を行いました。Emacs本体のパッチの更新はありません。御参考まで。

よく見るとDMDの2.112.0がリリースされてるみたい (Change Log: 2.112.0)。
インストールして手持ちのコードでICE落ちする件 (以前のメモ1, 以前のメモ2) がどうなっているか確認してみたのですが、 状況変わらず。

$ dmd -m64 -O -I. -version=Unicode -version=Windows10 -version=IE5   -c GameFrame.d -of=GameFrame.obj
tym = x14
Illegal instruction

$ dmd --version
DMD32 D Compiler v2.112.0
Copyright (C) 1999-2025 by The D Language Foundation, All Rights Reserved written by Walter Bright

「-O」を付けなければ大丈夫そうなのも変わらず。コピーライトの年号が2025のままなので内容的には betaと同じレベルのものがリリースされてそうな予感。 因みに再現する最小コードは作れていません。他の人が同様の事象に遭遇する事に期待したいのですが....

2026/01/10

AM中に起床。

アパート契約更新にお出かけ。ほどなくして手続き完了。

以前、sortコマンドのフィールドの解釈がよくわからないという事を 記したのですが、そういやと思い ローカルLLMのgpt-oss-safeguard:120bで 「sortコマンドで行頭に任意数の空白文字があるとき、第1フィールドはどういう文字列と解釈されますか?」 と聞いてみたところ、行頭の空白文字は無いものと見なされるという返事が返ってきました。 例として以下のように記されていたのですが、

#+begin_src bash
$ cat file
    banana 2
apple 10
   cherry 30

# 第1フィールドで文字列比較(行頭空白は無視される)
$ sort -k1 file
apple 10
banana 2
cherry 30
#+end_src

実際にやってみるとそうはなりません(結果行の行頭空白文字が削られているのは御愛嬌だとは思いますが)。 実際にやってみると以下のようになります(coreutilsのsort。CygwinもLinux(Fedora)も同じ)。

$ cat sorttest.txt
    banana 2
apple 10
   cherry 30

$ sort -k1 sorttest.txt
    banana 2
   cherry 30
apple 10

GoogleのAIモードで聞いてみたらどうか?と思い試してみたところ、違う答えが返ってきました。
sortコマンドの第1フィールドの解釈 AI回答
こちらの説明の方が正しいと思われます。実際に第1フィールドの文字列に行頭からの空白文字が含まれていれば 前述のようなsort結果になるし、-bオプションを付けると、

$ cat sorttest.txt
    banana 2
apple 10
   cherry 30

$ sort -k1 -b sorttest.txt
apple 10
    banana 2
   cherry 30

となりますので、実際の動作とも合っています。でも、いちいち-bを付けないとダメなのはやっぱり面倒臭いです。
因みにEmacsには sort-fields や sort-numeric-fields というコマンドがありますが、 前述のデータに対して「C-u 1 M-x sort-fields」を実行すると、「sort -k1 -b」と同じ結果が得られます。 とはいえ、sortコマンドのように複雑な条件を指定することはできないので適材適所という感じかも知れません。 フィールドの区切り方の違いがある点は認識しておかないとダメな事に変わりはありませんが。

infoで sort-fields の事を調べていたら、reverse-region というコマンドがあるのを知りました。 昇順でソートされた後に全体を逆順に入れ替えることで降順のソートを行ったのと同じにするのに使うっぽいです。 「tac」という「cat」の逆順出力コマンドの存在は知っていたので、 稀に「C-u M-x | tac」で逆順にする事はあったのですが、reverse-regionがあるのも覚えておこう。


Cygwinの3.6.6がリリースされていたり。 3.6.5では負荷をかけるとEmacsがハングするのでパッチをあてているのですが、 3.6.6でどうなるかを確認。 アナウンス によればいくつかデッドロックに関する修正が行われているようですが、Emacsハングに関連しているのかは分らず。 一応 3.6.6にもパッチを当てたcygwin1.dllもビルドしておいたり。さてどうなるか.....?

gdb上でemacsを実行すると謎のSIGTRAPが通知される件もどうなっているか確認してみたのですが、 やっぱり謎のSIGTRAPが通知されるままで変わらず。

Cygwin3.6.6でのEmacsハング再現確認。結果から言うとハング再現しました。デスクトップPCとノートPCの 両方で確認していましたが、ノートPCの方で再現したので 先にパッチをあてたcygwin1.dllに差し替えて ハングしない事の確認に切り替えたり。いずれデスクトップPCの方も再現すると思われますが確認継続。

ほどなくしてデスクトップPCの方でもハングが再現したので、こちらもパッチをあてたcygwin1.dllに入れ替え。 まだ当面はパッチを外すことはできなさそう。

2026/01/09

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

Web巡回して終了。

2026/01/08

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

調べごとをして終了。

2026/01/07

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

調べごとをして終了。

2026/01/06

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

ちょろり実験コーディング。

2026/01/05

AM中に起床。今日までお休み。

掃除したり。

微妙に不調。

2026/01/04

AM中に起床。

「オトメの帝国(20)」。まさか2周目に入るとは思っていませんでしたが最終巻です。

「推しが武道館行ってくれたら死ぬ(12)」。 「おまえは好きな相手が同じ次元にいるだけでありがたいと思え」(以前のメモ) は個人的に名言と思っています😅。この頃はアニメやドラマになるとは全く想像していませんでしたが。 こちらも最終巻です。

2026/01/03

AM中に起床。

たまたま観た「ミッシング・リンク」というアニメ映画。ずっとCGアニメーションだと思って 観ていたのですが、エンディングロールでストップモーションアニメーションだというのが分り マジでか?と思ったりも。 制作スタジオの「ライカ(Laika)」(Wikipedia) で、画像検索してみると あれもこれもそういやそうだと 気づく感じでした。

Inkscapeでいわゆる等角投影図(アイソメ図)を描く用のグリッド表示ってできるんだっけ?と思って 調べてみたらちゃんとできるようです(参考ページ)。 でも、グリッド設定ではなくて図の角度設定で描いている例も意外と多いみたいです。

先週知った通り、Eテレで放送されていた「AKIRA」を観たり。 今の技術を使うとどうなるだろうか?と思います。

2026/01/02

AM中に起床。

ぐうたら過ごして終了。

2026/01/01

あけましておめでとうございます。今年もよろしくお願いいたします。

EmacsのIMEパッチと「Copilot Keyboard」の組み合わせで長い文を入力するとスローダウンする件。 なんとなく条件があるっぽい。 一つは「nyan-modeでアニメーション表示をしている」と再現し易いみたい。 再現している状態でウインドウメッセージを観察していると「WM_IME_NOTIFY(0x0282)」だけで 埋め尽くされる状況になっている、という感じの模様。 WM_IME_NOTIFYに絞ってwParamを確認してみたところ、「0xf」というパラメータ値で大量にメッセージが 送られてきているようでした。ただ、この0xfという値のパラメータについては定義が無くて、 どういう目的でどのような時に送られてくるメッセージなのかが分らず。 因みに0xfのパラメータは元のMS-IMEでも送られてくるので「何かわからないけどそういうもの」 なのかも知れません。

nyan-modeとの因果関係がわからないと思ったのですが、もしやと思い nyan-animation-frame-interval というアニメーション速度を調節するカスタム変数の値を少し大きくしてみた (==アニメーションスピードを下げた)ところスローダウンが軽減されるようです。 どうやら WM_IME_NOTIFYの発生は Emacs側にも関係しているようで、Emacs側で何かしら描画に関する処理 (例えばnyan-modeの描画だったりカーソルのブリンク表示だったり)が行われるとメッセージが発生しているようです。 nayn-modeを止めて且つカーソルのブリンク表示が止まった状態であれば、Emacs側起因ではメッセージは発生しないようで、 文字入力したタイミングに合わせたメッセージのみが発生しているようでした。 この場合のメッセージ処理はIMEのものしか無い為、待たされてスローダウンすることも無いようです。 いずれにしてもMS-IMEの時には問題になるようなことは無いので、Copilot Keyboard特有の現象のように思えます。

nyan-modeはいつも(nyan-start-animation)で使用しているのですが、(nyan-stop-animation)すると 何も表示されなくなるなぁ?というのに気づいたり。 Emacs29からできるようになった 「C-M-<wheel-up> や C-M-<wheel-down> でフレームやウインドウのサイズはそのままに フレームのフォントを大きくしたり小さくしたりする」 機能に対応する為にパッチを当てていたのですが、アニメーションしない場合の処理がバグっていました。 修行が足りません🥺。

2025/12/31

AM中に起床。

EmacsのIMEパッチと「Copilot Keyboard」の組み合わせで長い文を入力するとスローダウンする件を 少し調べてみたのですが当たりは付かず。

そんな訳で今年を振り返り。


今年はSAI2のアップデートはありませんでした。PCを買い替えたので 液タブ接続の都合でテーブルを 買ったりして整えてみたものの、やっぱり全然使えていません😓。

そんな感じで今年の更新はここまで。それでは皆さん良いお年を。

2025/12/30

AM中に起床。

AI連携した日本語変換って無いのだっけ?と思って検索していたところ、 「Copilot Keyboard」なるものがストアアプリにあるというのを知り少し試してみたり。 結果から言うと変換自体の性能についてはよくわからず。そちらよりも入力ミスを修正するエディタ機能の ほうがイマイチで、途中で間違えていた部分を変換確定せずに入力し直す方法がわかりませんでした。 また、間違った変換をうっかり確定させてしまった場合に、それを削除する手段もまだ機能していないようです。 あと、EmacsのIMEパッチに原因がありそうですが、40文字程度のひらがな原文を入力したところで 異常に動作が遅くなります。メモ帳ではそんなことにはならないようなので、原因を調べてみる必要が あるかもしれません。

パルコのパプリカのコラボCM。なぜパプリカ?と思ったのですが色々あるっぽい。 公開20周年で4Kリマスターでリバイバル上映されるというのも関係があるみたい。 PS3とFullHDのディスプレイを買った直後にBlu-Rayソフトとして買って観たのも それくらい前かと思ったりも。 監督の今敏氏は2010年に亡くなられた(以前のメモ)のですが、 作品は残り続けるだろうと思います。

2025/12/29

AM中に起床。

ちょろりお出かけ。

先日のキーボードマクロの記録を調べるのに拙作の kbm-cheat-sheet.el というのを使ってますが、 そういやひとつ前に放流したのは 29系以降の対応が入っていないなぁ? というのに気づいたり。ついでにデバッグの時に表示の幅が足りなくてコードを弄ったりしていたのを カスタム変数で変更できるようにしてみました。今のところmasterブランチ(31系)でも使えてそうなので、 放流してみます(kbm-cheat-sheet_251229.tar.xz)。 御参考まで。

気づいていませんでしたが、Inkscapeの1.4.3がリリースされていました。 バグフィックスリリースの模様。

TV放送していた「Avatar: The Way of Water」。ただただ「水スゲー」と思いました。 2009年公開の1作目から2022年公開の本作品までの 13年間で映像技術も大きく進歩した結果なのでしょうか。 一部のシーンでは実写との合成もありそうですが、全部CGと言われても驚きは無い感じかも知れません。

何気に「ime 誤変換を減らす方法」でGoogle検索してみたところ、AI回答の中に 「入力の工夫」として 「こまめに変換する: 長い文章を一括で変換するよりも、文節ごとなど短く区切ってこまめに変換することで、誤変換のリスクを減らせます。」 ということが記されていたのですが、実際のIMEの実装の事を問わなければ「そんな訳ないでしょ?」 と思ったりも。短く区切ると文脈が分からないので単語だけで変換したときの誤変換は増えると思います。 ただし実際に「文脈を読み取っていれば」ですが。

2025/12/28

AM中に起床。

掃除したり洗濯したり。

Emacsのキーボードマクロのシーケンスに isearchとIMEパッチによるIMEからの文字列入力を含むと、 with-keyboard-codingというシーケンスが追加されるのですが、マクロ実行するとエラーで停止してしまいます。 例えば以下のようなシーケンスの場合とその時に記録されている内容です。

;C-oはIMEのON/OFFトグルで、C-sで文字「あ(\30102)」を探して「い(\30104)」に書き換える
Seq: C-s C-o \30102 <with-keyboard-coding> \30102 C-o C-b C-d C-o \30104 C-o

この場合「<with-keyboard-coding> \30102」のところでエラー停止するという事になります。 で、「この邪魔なシーケンスを取り除けば意図通りのマクロになるのに」と思い、 次のような関数を作成してみました。

(defun my-fix-last-kbd-macro ()
  "最新のキーボードマクロシーケンスを修正する"
  (interactive)
  (let ((olist (append last-kbd-macro nil))
        (newlist)
        )

    (while olist
      (if (eq 'with-keyboard-coding (car olist))
          (setq olist (cddr olist))
        )
      (when olist
        (setq newlist (append newlist (list (car olist))))
        (setq olist (cdr olist))
        )
      )
    (setq last-kbd-macro (vconcat newlist))
    ))

このコマンドを実行すると、先ほどのシーケンスは以下のように修正されます。

Seq: C-s C-o \30102 C-o C-b C-d C-o \30104 C-o

余計に記録される「<with-keyboard-coding> \30102」を削除しているだけですが、 これで意図通りのマクロになります。 MS-IMEのように外付けIMの場合は変換中のキーシーケンスはEmacsに伝わらないので、 結果的にうまく機能するという感じです。 AnthyのようなEmacs組み込みのIMには関係ありません。また、IMEパッチ無しで 「半角/全角キー」でMS-IMEを起動/入力した場合も関係ありません。御参考まで。

2025/12/27

AM中に起床。

ちょろりお出かけ。

Emacs31系となる予定のmasterブランチを git pullしたり。パッチ類のコンフリクトは発生せず、 ビルドも問題無さそうなのですが、以前、 list-charset-charsでグリフの無い文字の表示が変になっている件は変わらず。
そもそもどういう理屈で HexBox表示と 8進数表示 の差が出ているのかを調べてみることにしました。 どこで何をやっているのか全く見当がつかなかったのですが、w32font.cの中で GLYPHLESS_DISPLAY_HEX_CODEというenum定義を見つけたので、それを頼りに辿ってみたところ、 どうやら xdicp.c内の 関数lookup_glyphless_char_display() が判定に関係しているというのが判りました。 この関数では渡された 文字コードをキーに Vglyphless_char_display というテーブルと照らし合わせて グリフの有無(厳密には実際の表示可否はまだ決定できていない)を検査し、 グリフが無ければどのタイプで表示するかを文字毎に関連付けているようです。 因みに、グリフの無い場合の表示タイプには HexBox表示となる GLYPHLESS_DISPLAY_HEX_CODE や 半角豆腐表示となる GLYPHLESS_DISPLAY_EMPTY_BOX などがあるようです。 実際の表示に関係するのは xdisp.c内の 関数get_next_display_element() で、 ここで実際にグリフの有無が決定できるようで、グリフが無い場合は8進数(もしくは16進数)で 表示するという感じになっているようです。コードを読んで初めて知ったのですが、 display-raw-bytes-as-hexという変数をtにすれば8進数表示ではなく16進数表示に切り替えられるようです。 ほぅ....。
さておきここまでで、関数lookup_glyphless_char_display()や 関数get_next_display_element()は Emacs30.2との違いは無いのと、仕組み的に Vglyphless_char_display というテーブルの内容次第で どうにでも変わるという所から、テーブルの方に変更が加わっているのではないか?と考えられます。

Vglyphless_char_displayは ELISPからも 変数glyphless-char-display で参照/更新が可能で、 lisp/international/characters.el とかで値を設定したりしているようです。 が、ここでは関係しそうなEmacs30.2との違いが見つけられず。 「(type-of glyphless-char-display)」で調べてみると「char-table」という型のようですが、 参照の仕方がよくわからない🥺。30.2と比べてみれば表示の違いの原因が分かりそうなのですが....

うーん、デバッグコードを仕込んで観察していたのですが読み違えていたかも。 HexBox表示の文字と8進数表示の文字の両方でどうなるかを 関数lookup_glyphless_char_display() で 観察してみたのですが、どちらも Vglyphless_char_display の参照結果は NILP になっていました。 どうやら意図的に表示をコントロールするような場合に使うのか?と思ったりも。 だとすると 変数glyphless-char-display を設定するコードに違いが見当たらないのも納得できます。

メカニズムは判明。 xdisp.c内の 関数get_next_display_element() の中で表示に関する判定がいくつかあるのですが、 とあるif分の条件に「! CHAR_PRINTABLE_P (c)」というのがあり、HexBox表示の場合は0、8進数表示の場合は1 となっているようでした。この関数自体は30.2と違いが無いので、CHAR_PRINTABLE_P(c) の戻り値が 変わっているものと考えられます。printableという単語で気づいたのが、 masterブランチの lisp/international/characters.el に以下のようなコードブロックが追加されていて、

;;; Setting printable-chars.  The default is nil for control characters,
;;; otherwise t.
;;; The table is initialized in character.c with a crude approximation,
;;; which considers any non-ASCII character above U+009F to be printable.
;;; Note: this should be consistent with [:print:] character class,
;;; see character.c:printablep.
(let ((table (unicode-property-table-internal 'general-category)))
    (when table
      (map-char-table (lambda (key val)
                        ;; Cs: Surrogates
                        ;; Cn: Unassigned
                        (when (memq val '(Cs Cn))
                          (set-char-table-range printable-chars key nil)))
                      table)))

このコードを まるっとコメントアウトしてみたところ、8進数表示は無くなり全て HexBox表示となりました。
という訳で、何かしら「表示可能に違いない」というフラグがセットされるようになったみたいですが、 結果としては「表示できないのですが....」という感じになっているようです。 「フォントを設定すれば表示できるハズ」と思っているのかも知れませんが、 絵文字の領域で まだ未使用の文字コードに対しても 表示できるハズというフラグをセットしているように 見える所もあるので、なぜこの部分を足したんだ?とは思ったりも。
git log で調べてみたところ 68a37760dec83a8126b03bcacc60a96644a6831f というコミットで変更が 加わっているようです。

commit 68a37760dec83a8126b03bcacc60a96644a6831f
Author: Eli Zaretskii <eliz@gnu.org>
Date:   2025-02-28 23:22:30 +0900

    Fix the values and documentation of 'printable-chars' table

    * src/character.c (syms_of_character) <printable-chars>: Doc fix.

    * lisp/international/characters.el (printable-chars): Fix values
    for non-ASCII characters.

    * doc/lispref/nonascii.texi (Character Properties): Add
    cross-reference for what is a printable character.
    * doc/lispref/display.texi (Usual Display):
    * doc/lispref/searching.texi (Char Classes): Add indexing.
    (Bug#76611)
---
 doc/lispref/display.texi         |  1 +
 doc/lispref/nonascii.texi        |  5 ++++-
 doc/lispref/searching.texi       |  2 ++
 lisp/international/characters.el | 16 ++++++++++++++++
 src/character.c                  |  5 +++--
 5 files changed, 26 insertions(+), 3 deletions(-)

が、Docコメントを直すのはともかく 変数設定を足す必要があるのかはよく判らず。 少なくとも、list-charset-charsコマンドによる表示はぶっ壊れているので、見かけ上はエンバグしているように見えます。 ひとまず、どこを巻き戻せば良いのかは分かったので 今後の展開は様子見の方向で。

何気にTV番組表を眺めていたら、来週ですがアニメ映画の「AKIRA」がEテレで放送される予定というのに気づいたり。 Eテレで?と思いながらもCMが無いので映画として楽しめるかもとは思ったりも。 そして、それに続いて 漫勉neoの大友克洋回の再放送 コンボ。そうくるか。 そういや地上波で放送されたことってあったけ?と思い Wikipedia を調べてみたら、1990年代には何度か放送されていたらしい。 そして2004年7月10日にTBSで放送されていた分は、 TANE自身もしっかり観てました😅。

2025/12/26

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

Windowsの壁紙にシーギリヤロック(参考Wikipedia) の写真が表示されていたのですが、こんな「Horizon Zero Dawn」に出てきそうな場所が実際にあるんだと思ったり。

gptel+Ollama+gpt-ossでテキストファイルを読み込ませる事ができるという事を今更ですが知りました。 以前、「EmacsのInfoをAI検索(文章の意味検索)できれば...」 という事を書いたのですが、できるんじゃね?と思い試してみました。
テキスト化するのに docディレクトリ内で「makeinfo --plaintext -o xxxxx.txt emacs.texi」と実行すれば xxxxx.txtに全文プレーンテキストで出力されます。 で、gptelで生成したxxxxx.txtを指定して、 「このテキストファイルはEmacsの英文マニュアルです。この中にマウスを使って矩形領域を選択する方法が 記されていればその方法を日本語に翻訳して教えてください。」としてみたところ、 「Ctrlキーを押しながら左マウスボタンをドラッグする」という旨の回答が返ってきました。なんか違います🥺。 モデルはgpt-oss-safeguard:120bを使用しました。 因みに git masterブランチを使用したのですが、それでは「14.5 Rectangles」のセクション内に 「 A rectangular region can also be marked using the mouse: click and drag ‘C-M-mouse-1’ from one corner of the rectangle to the opposite.」 という文言がありますので、これを見つけられれば正解になるハズなのですが....。 世の中にはイケるモデルもあるかも知れませんが、今回試した感じではダメでした。 書いてあるけど見つけられないのか、書き方が悪いのかはよく分かりません。

もう一度「このテキストファイルはEmacsの英文マニュアルです。この中にマウスを使って矩形領域を選択する 方法が記されています。注意深く探してその方法を日本語に翻訳して教えてください。」 としてみましたが、やっぱり「Ctrlキーを押しながら左マウスボタンのドラッグ」という回答だったので、 reasoningを見てみました。翻訳した文言の中に 「標準的なEmacsでは、マウスを使って長方形を設定します。C-M-<drag-mouse-1>長方形領域を設定するには、 を押したままにします(またはM-x rectangle-mark-mode)。」 といった事が記されていて、実際に書かれている内容にカスっているように思えるのですが、 途中で「Mouse-Rectangle」なるノードの記載がある(実際には無い)ような旨が記されていて、 憶測が含まれる形で 「Emacsでは「mouse-set-rectangular-region」がC-<drag-mouse-1>にバインドされていたと思います。」 という謎のmouse-set-rectangular-regionという関数やら、どこが出所かわからない情報で 最終的に「コマンドはおそらくコピーなどのための長方形の領域を設定する「C-<drag-mouse-1>」です。」 と判断しているみたいです。
元の文書も マウス操作についてのセクションがある割にはそこには選択については記されておらず、 矩形のセクションに取ってつけたような文言でマウスの矩形選択操作が記されているわで、 やっぱ元の文書も分かりにくいのかなぁ?と思わなくもありません。

2025/12/25

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

Web巡回して終了。

2025/12/24

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

gptelのorg-modeを使用したとき、ローカルの画像ファイルをチャットバッファにドラグ&ドロップすると、 埋め込み画像にするか、リンクとして挿入するかなどを選ぶポップアップメニューが表示されます。 そういうものなのかと思っていたら、org-modeの機能だという事を知りました。 そして、30.1に同梱されているorg-modeから使えるようになった機能だったようで、29.xとかでは使えなかった模様。

gptel+Ollama+gpt-oss-safeguard:120bで指定した桁数だけ円周率を表示するD言語の関数を作成させてみたところ、

// 指定した桁数だけ円周率を表示する関数
void print_pi(int N)
{
  // πの小数部分を格納した文字列(必要な桁数まで用意)
  immutable string piDigits =
    "14159265358979323846264338327950288419716939937510"~
    "58209749445923078164062862089986280348253421170679"~
    "82148086513282306647093844609550582231725359408128"~
    "48111745028410270193852110555964462294895493038196"~
    "44288109756659334461284756482337867831652712019091"~
    "45648566923460348610454326648213393607260249141273"~
    "72458700660631558817488152092096282925409171536436"~
    "78925903600113305305488204665213841469519415116094"~
    "33057270365759591953092186117381932611793105118548"~
    "07446237996274956735188575272489122793818301194912"~
    "98336733624406566430860213949463952247371907021798"~
    "60943702770539217176293176752384674818467669405132"~
    "00056812714526356082778577134275778960917363717872"~
    "14684409012249534301465495853710507922796892589235"~
    "42019956112129021960864034418159813629774771309960"~
    "51870721134999999837297804995105973173281609631859";

  // Nが負の場合は0に補正
  if (N < 0) N = 0;

  // 出力用に必要な桁数がpiDigitsに足りない場合は切り捨て
  int maxDigits = piDigits.length;
  if (N > maxDigits) N = maxDigits;

  // 「3.」と小数部N桁を結合して表示
  write("3.");
  if (N > 0)
  {
    write(piDigits[0 .. N]);
  }
  writeln();
}

というようなのが生成されて そうきたかと思ったり。因みに文字列の結合に 「~」を必須とする前の書き方で生成されたのでそこだけ手で直してます。 さておき、間違ってはいないかも知れませんがそういうのを期待したんじゃないんだよな...とは思ったりも。 このコードでは800桁分用意されていますが、一応 GoogleのAIモードでも800桁分聞いてみた結果とは一致していました。

2025/12/23

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

調べごとをして終了。

2025/12/22

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

H3ロケット8号機の打ち上げ失敗。同じ型の3,4,5号機は成功していたようですが 今回は何か違ったのだろうか?

そういえば以前 gptel+Ollama+oss:20b で矩形選択の 方法を聞いても全然ダメなのが返ってきていたのですが、GoogleのAIモードだとどうだろう? と思い聞いてみたところ、イケてる回答が返ってきました。

定点観測している「least」のGoogle翻訳。前回は2021年4月 (それより前は 2019年3月, 2016年9月) ですが、「いらばん少ない」は変わらず。

leastの辞書誤訳

辞書の改訂はしていないのだろうなと思えます。

2025/12/21

AM中に起床。

掃除したり洗濯したり。

ちょろり実験コーディング。

2025/12/20

AM中に起床。通院。

VirtualBoxのFedoraでvncserverの起動。 どうにもならなかったので、Xfceというデスクトップ環境 をインストールしてそちらを立ち上げてみることにしたり。でもやっぱりVNCで繋がるものの黒い画面だったのですが、 VirtualBox画面のgnomeデスクトップの方にXfceのメニューバーなどが表示されているという謎な状況になっていたり。 よく分かりませんが、VirtualBox画面ではログインせず vncserverを起動すれば 黒い画面ではなくデスクトップが 表示されました。でも、VNCで表示できている状態で VirtualBox画面でgnomeデスクトップにログインした後、 VNCのXfce側でターミナルアプリを起動するとVNC側ではなくVirtualBox画面側のgnomeデスクトップに 起動したターミナルウインドウが表示されるという謎な状況になりました。 ディスプレイは :0 と :1 で別になっていそうなのですが、表示がめちゃくちゃになっています。なんだこれ?🤔

2025/12/19

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

気づいてませんでしたがGIMPの3.2RC2が出ている模様 (アナウンス)。

VirtualBoxのFedoraでvncserverを起動して UltraVNCで接続しようとしたのですが繋がらず。 vncserverの起動で実行される xstartupスクリプト の中で /etc/X11/xinit/xinitrc がコアダンプしてる模様。 なんで? gnome-session を実行するように書き換えてみたところ、こちらもエラーが発生していて、 接続はできるのですがウインドウマネージャが無い状態になってて用事にならず。 旧PCで試した時は記憶に残っていないくらい問題なくデスクトップに接続できていたような気がするのですが?🤔

2025/12/18

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

sshの-Yオプションを使ってリモートのLinuxマシンからローカルのXサーバー(VcXservを使用)に画面を出そうとしたけど出ず。 一番最後に突っかかっていた原因は Cygwinのbashでログイン前のシェルでの変数DISPLAYが「:0.0」となっている のが問題だったようです。「export DISPLAY=localhost:0.0」してから「ssh -Y user@host」でログインしたのち、 「emacs-gtk+x11 &」とかすればOKでした。「:0.0」と「localhost:0.0」は同じじゃないのか?🤔

2025/12/17

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

Web巡回して終了。

2025/12/16

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

Ollama+gpt-oss-safeguard:120b+gptel で生成させたD言語のコードの中に

  bool[][] visited = new bool[][maze_height];
  foreach (i; 0 .. maze_height) visited[i] = new bool[maze_width];

というのがありました。個人的に「new bool[][maze_height]」がどういうこっちゃ?という感じなのですが、

  bool[][] visited ;
  visited.length=maze_height;
  foreach (i; 0 .. maze_height) visited[i].length=maze_width;

という事らしい。
迷路を描かせてその答えの経路も描くという関数を生成して、文法エラーになる所を手動で直して 実行してみた結果が以下。

迷路を生成するテストの例

左上がスタート、右下がゴールという想定です。 描画は線を描く関数は用意されている体で迷路の生成&描画と正解経路の描画を行う関数を生成した感じです。 因みに、示された正解経路を追ってみると思ったよりも一本道ですが、間違えた方向を選ぶとゴールに到達 できない分岐点は一応存在しているようです。

2025/12/15

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

Web巡回して終了。

2025/12/14

AM中に起床。

掃除したり。

先日のソートのコード。flymakeの都合で肝心な箇所のメッセージが削られていて訳が判らない 感じになっていました。エラーメッセージの全文は以下のような感じでした。

C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\sorting.d(1963): Error: static assert:  "The return type of the template argument 'less' when used with the binaryFun!less template must be a bool. This is not the case, the returned type is 'int'"
    static assert(is(LessRet == bool), "The return type of the template"
    ^
gptel_test6.d(175):        instantiated from here: `sort!((a, b)
{
double angA = atan2(cast(double)a.y - cy, cast(double)a.x - cx);
double angB = atan2(cast(double)b.y - cy, cast(double)b.x - cx);
return angA < angB ? -1 : angA > angB ? 1 : 0;
}
, SwapStrategy.unstable, Point[])`
    vertices.sort!((a, b) {
            ^

エラーメッセージ自体は翻訳すると 「binaryFun!less テンプレートで使用する場合、テンプレート引数 'less'の戻り値の型は bool である必要があります。これは当てはまりません。返される型は 'int' です。」 という感じで 何言っているのかは分からないですが戻り値はboolの必要がありそうという雰囲気だけは分かります。 先日のコードを次のように書き換えれば良さそうでした。

    vertices.sort!((a, b) {
      double angA = atan2(cast(double)a.y - cy, cast(double)a.x - cx);
      double angB = atan2(cast(double)b.y - cy, cast(double)b.x - cx);
      return angA > angB ; //元→ angA < angB ? -1 : (angA > angB ? 1 : 0);
    });

今回のはエラーメッセージの全文を見ていなかったので、なんのこっちゃ?ってなっていましたが、 全文を見ても エラーメッセージが元のソースコードのどこが悪いのかを明確には指していません。 少なくとも関数定義であれば return文の行がエラー箇所として示されると思います。 こういう点がテンプレートでエラーすると直し方が判らないと毎回記している気がする要因にも思います。

全然関係無い流れで見つけた 「わりと今時のPCでWindows 95を動かしてみた結果 (Core i7-2600K)」 という動画。Windows95が出た1995年だとまだUSBもPCI-ExpressもSATAも存在していないしハイパースレッドもマルチコアも 無いか...と思ったりも。色々突っかかり所はあるようですがそれでもインストールして起動できるんだとは思ったりも。 すげぇ。

Ollama+gpt-oss-safeguard:120b+gptel で生成させたD言語のコードの中に乱数生成器を 呼び出す関数に渡して関数の中で乱数を生成するというコードがあったのですが、何故か乱数に 変化がないなぁ?という結果になっていました。最小コードと実行結果は次のような感じ。

$ cat -n random_test.d
     1  import std.stdio;
     2  import std.string;
     3  import std.random;
     4
     5  void printRnd(Random rnd)
     6  {
     7    writeln(uniform(0, 10, rnd));
     8  }
     9
    10  int main(string[] args)
    11  {
    12    auto rnd = Random(unpredictableSeed);
    13
    14    for(int i=0; i<10; i++){
    15      printRnd(rnd);
    16    }
    17
    18    return 0;
    19  }

$ dmd random_test.d

$ ./random_test
6
6
6
6
6
6
6
6
6
6

次のようにポインタ渡しにするとちゃんと乱数になるようです。

$ cat -n random_test.d
     1  import std.stdio;
     2  import std.string;
     3  import std.random;
     4
     5  void printRnd(Random* rnd)
     6  {
     7    writeln(uniform(0, 10, rnd));
     8  }
     9
    10  int main(string[] args)
    11  {
    12    auto rnd = Random(unpredictableSeed);
    13
    14    for(int i=0; i<10; i++){
    15      printRnd(&rnd);
    16    }
    17
    18    return 0;
    19  }

$ dmd random_test.d

$ ./random_test
2
3
1
5
0
5
4
8
9
6

Random()って動的オブジェクトで参照渡しになるんじゃのか? 如何せん ポインタか否かに関係無く uniform()で 何も言われないのも謎。何が悪いのか直ぐに分からない感じです。

他にも連想配列の初期値をリテラルで指定するコードがあり、 「immutable int[Dir] dx = [ Dir.North => 0, Dir.South => 0, Dir.East => 1, Dir.West => -1 ];」 のように記されていたのですが、正しくは 「immutable int[Dir] dx = [ Dir.North : 0, Dir.South : 0, Dir.East : 1, Dir.West : -1 ];」 です。何の言語と間違えているんだ?と思ったりも。perlやPHPでは「=>」を使用するようですが、 多くの言語では「:」を使用するようなので、間違えるにしてもピンポイント過ぎないか?とは思ったりも。

2025/12/13

AM中に起床。

Ollama+gpt-oss-safeguard:120b+gptel でD言語コードを生成させていたのですが、 その中に以下のような感じでソートを行うコードが生成されました。

    vertices.sort!((a, b) {
      double angA = atan2(cast(double)a.y - cy, cast(double)a.x - cx);
      double angB = atan2(cast(double)b.y - cy, cast(double)b.x - cx);
      return angA < angB ? -1 : (angA > angB ? 1 : 0);
    });

これは文法エラーでコンパイルできないのですが、文脈的には判らなくはない感じに思えます。 ラムダ式の部分を「vertices.sort!((a, b) => {...});」とかに書き換えれば良いのか?と思ったり するわけですが そういう単純な話でも無く。というかD言語でのラムダ式の書き方を調べても 「(a) => a*a」のような単純なラムダ式の例しか出てこなくて、ちょっと直せば良いだけのような気もするけど 直し方が判らないって感じになりました。 以前の乱数生成関数の時と同じく「これ、ダメなの?」とは思います。

2025/12/12

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

Ollama+qwen3-vl:30b+gptel でいくつか円が描かれた画像を示して、何個の円が描かれているかを数えさせてみたのですが、 数え間違えることの方が多いなぁ?と思ったり。

円の数を数えるテストの例

「この画像には何個の円が描かれていますか?注意深く数えてください。」と記したところ「11個」という 回答でした。正解は16個です。左下に小さな円が描かれているのですが、人間だと見逃す感じかも知れません😅。 が、機械なのでそれを見逃さないのを期待したいところです。

2025/12/11

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

なぜかまたデスクトップPCのFrimwareアップデートが来ていたり。 前回入れたのは11月末頃だったのですが、そういえば それより前のアップデートは失敗していたので、もしかするとアップデートに失敗していなければ、 こんなに高頻度でアップデートが来る訳ではなかったのかも?と思ったりも。判りませんけど。

よく分かりませんがGitHubが死んでる?

2025/12/10

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

Web散策していて知った 「第2回 1986年のCOM VS 2023年のAI 「オセロ」 COM後手編 1986 COM VS 2023 AI Othello」 という動画。AIオセロの方はどういうアプリなんだ?とは思ったりも。

2025/12/09

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

Web巡回して終了。

2025/12/08

本日休業。AM中に起床。

掃除したり洗濯したり。

ちょろりお出かけ。思わず文具を購入。

そういえばいわゆる「つけペン」のペン先ってあるかなぁ?と思って近くの比較的大型の 文具店を見てみました。以前、一点物の「ガラスペン」の存在を知り、 その後、文具店で時々見ていると一時的にガラスペンブームがあったのですが、ついでに万年筆タイプのペンも 置かれている感じはあったものの、つけペンはその並びには無いなぁ? と思ってました。で、今日なにげに見てみると つけペンのセットやペン先が置かれていて、 なんで?と思いながら試しに購入してみました。「カブラペン」の3本入りと「Gペン」の3本入りを 買ってみたのですが、各572円(税込み)でした。1本50円くらいだった記憶しかなかったものですから、 おぅ.....と思ったのは秘密。

引き出しの奥にしまってあった、随分前(多分27年くらい前)に買った「証券用インク」に値札が付いていて 450円って書かれていました。しかし35年くらい前には300円くらいで買えていたので「高くなったなぁ....」と 思ったのですが、現在は税込みで715円らしいのでやっぱり高くなってるなぁとは思ったりも。 致し方なしかも知れません。インクを検索していると こちら のような350mlの詰め替え用みたいな商品があるのを知ったり。ほぅ....。製図用だけで証券用のは無いみたい。 そういやPILOTのページでは日本語表記が「インキ」ってなってるな。 どうやら「インク」は英語のinkのカタカナ読みで、「インキ」はオランダ語のinktのカタカナ読みが由来らしい。 粘度の違いで使い分ける場合があるようですが、一般的には「インク」を使う場合が多く、 印刷業界では「インキ」を使う場合があるという感じみたいです。知りませんでした。

2025/12/07

帰省から帰着。

全然関係ない流れで セガの「OutRun」が映画化されるらしいのを知ったり (参考)。 どういう感じになるのか全く想像がつきません。

2025/12/06

AM中に起床。

ちょろり帰省。

2025/12/05

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

調べごとをして終了。

2025/12/04

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

Web巡回して終了。

2025/12/03

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

調べごとをして終了。

2025/12/02

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

gptelでD言語の乱数を使うようなコードを生成させてみたのですが、次のように乱数生成関数を 使用するようなコードが生成されました。

  auto rnd = Random(unpredictableSeed);
    :
  int x0 = cast(int)rnd.uniform(minX, maxX + 1);

コンパイルエラーになるのですが、ぱっと見は何が悪いんだっけ?という感じです。で、

  auto rnd = Random(unpredictableSeed);
    :
  int x0 = cast(int)uniform(minX, maxX + 1, rnd);

が正解だったりします。でも、rndってランダム生成器のインスタンス的なものを保持しているんだよね? UFCS使えるんだよね? って解釈すれば前者の様に書けるようになっていないのはなんでだ? uniform()の仕様って筋悪くね? と思わなくはありません。

2025/12/01

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

C言語で何気に巨大な値を代入しようとしたところ、コンパイラでワーニングが出て、そうなんだっけ? と思った事があったのでメモ。

$ cat sizet_testc.c
#include <stdlib.h>
#include <stdio.h>

int main()
{
  size_t a = 256*1024*1024*1024;
  printf("%lld\n",a);
  return 0;
}

$ cat sizet_testd.d
import std.stdio;
import std.string;

int main()
{
  size_t a = 256*1024*1024*1024;
  writef("%d",a);
  return 0;
}


結果をまとめると以下のような感じ。 因みに、gccはCygwinので64bitのみ、dmdは32bit/64bit両対応となっているのでdmdの方は-m64の有無を パラメータとして分けています。

| 言語 | コンパイラバージョン | コンパイルオプション | コンパイルメッセージ                                                               | 実行表示結果 |
|------+----------------------+----------------------+------------------------------------------------------------------------------------+--------------|
| C    | gcc 13.4.0           | 無し                 | 警告: integer overflow in expression of type ‘int’ results in ‘0’ [-Woverflow] |            0 |
| D    | dmd v2.112.0-beta.1  | 無し                 | [無し]                                                                             |            0 |
| D    | dmd v2.112.0-beta.1  | -m64                 | [無し]                                                                             |            0 |

どういう事なのかと言うと、「256*1024*1024*1024」の値は32bit整数型で扱われているためオーバーフロー して0になっているのに加えて、変数aがsize_tだとしても 型推論される訳でもなく 0が表示される という結果になっているようです。
「256*1024*1024*1024L」のように最後に「L」を付けると次のようになります。

| 言語 | コンパイラバージョン | コンパイルオプション | コンパイルメッセージ                                                                 | 実行表示結果 |
|------+----------------------+----------------------+--------------------------------------------------------------------------------------+--------------|
| C    | gcc 13.4.0           | 無し                 | [無し]                                                                               | 274877906944 |
| D    | dmd v2.112.0-beta.1  | 無し                 | Error: cannot implicitly convert expression `274877906944L` of type `long` to `uint` |   [実行不可] |
| D    | dmd v2.112.0-beta.1  | -m64                 | [無し]                                                                               | 274877906944 |

こちらは想定した感じかなと思います。 「L を付けない」場合のdmd -m64 は何の警告も無いし、型推論もできそうなのに?という感じにもかかわらず 実行結果が「0」になっているので、判りにくいバグを埋め込む可能性はあるかもと思いました。


TOP

古いの
2025.11 2025.10 2025.09 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