昔の最近の出来事(2025.12)

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 PREV