昔の最近の出来事(2024.07)

2024/07/31

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

先日の diredで複数選択したファイルを開く件。Web検索したら こちらのような やり方を知ったり。なるほど。

2024/07/30

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

そういえば、夏前くらいにInkscapeの1.4が来るのかしら?と思っていたのですが、 まだ動きは無いみたい。

そういえば、Emacsのdiredで複数のファイルを選択して、それらを開くことってできないのだっけ? と思ったりも。頻繁に使うものではないかも知れませんが。

2024/07/29

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

パリって緯度的に北海道よりも北になるのか。暑さ対策的なものは不要なのね。
先日の 電卓。というか英語。「数式」をGoogle翻訳したらformulaって出てきたのですが、 そういやexpressionじゃないのだっけ?と今頃思ったり。math expressionも「数式」って翻訳されたので 日本語的には使い分けがよく判らんと思ったりも。 で、調べてみた感じ formulaは「公式」的な意味合いが強いらしい。 という訳で先日のELISPコードは シレっと expressionに変えておきました😅。

2024/07/28

昼前起床。

掃除したり洗濯したり。

そういえば、自分以外の人がテキスト編集をどうやってるのかってあまり見たこと無いなぁ? と思ったりも。たまに 本物お仕事のオンライン打合せで、ちょこっと直すだけ(とういう想定) みたいなのを見ていると、割とちょこっと感の無い方法で編集しているなぁ... と思う事はあります。

  1. 行末にセミコロンを追加して。
  2. 複数行を繋げた長い文字列にして。
  3. x行目からy行分 行コメントでコメントアウトして。
  4. 3.の例のコメントアウトしたのを戻して。
  5. MACアドレスやUUIDみたいな二つの文字列を入れ替えて (例えばxx-xx-xx-xx-xx-xxとyy-yy-yy-yy-yy-yyをスワップしたい)。
  6. 行末の不要な空白文字を削除しておいて。
  7. 以下のように整形して。
    |  aaaaa      bbbbbbbb
    |     cc  ddddd
    |        eeeeeeeeeee  ffffffff
    
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
    |aaaaa       bbbbbbbb
    |cc          ddddd
    |eeeeeeeeeee ffffffff
        
  8. CSVのx番目のフィールドとy番目のフィールドを入れ替えて。

いずれも 1,2行なら大した話では無いかと思いますが、数十行から数百行オーダーになると ちょこっとと思える人と そうでない人に分かれてくるのではないかと思います。

最適では無いかも知れませんが、前述要件をEmacsでやるならこうするかな?

  1. いくつか方法はあるかと思います。
  2. 地味に良い感じのは無いかも。
  3. いくつか方法はあるかと思います。
  4. いくつか方法はあるかと思います。
  5. あまり簡単な方法は無いかも。基本的には
    1. 「xx-xx-xx-xx-xx-xx」を「xx-xx-xx-xx-xx-xxqqq」とかで一度置換しておく。
    2. 「yy-yy-yy-yy-yy-yy」を「xx-xx-xx-xx-xx-xx」に置換。
    3. 「xx-xx-xx-xx-xx-xxqqq」を「yy-yy-yy-yy-yy-yy」に置換。
    を replace-stringなどで行なう事になるかと思います。ミニバッファで置換文字列を指定するとき 「M-p」とかで一度指定した文字列をうまく使う(手で入力すると間違える可能性が上がるから) という所でしょうか。
  6. Emacsの場合は ほぼ一択かも知れません。
  7. 簡単になる場合とそこそこ面倒臭い場合があるかも知れません。
  8. あまり簡単な方法は無いかも知れませんが、キーボードマクロで繰り返すにあたり、元になる一行分の編集手順を 可変のフィールド長に対応する為に、インクリメンタルサーチをうまく使うのがポイントになるかも知れません。
    1. x番目のフィールドの手前の","を「C-s」でインクリメンタルサーチし、フィールドの始まりをマーク。
    2. x番目のフィールドの後ろの ","をインクリメンタルサーチし、「C-w」でx番目のフィールドをリージョンに取り込み。
    3. y番目のフィールドの手前の","をインクリメンタルサーチしてカーソル移動し 「C-y」でx番目のフィールドをヤンク。
    4. x番目のフィールドをヤンクした位置がy番目のフィールドの開始位置になるのでマークしてからy番目の フィールドの後ろの","をインクリメンタルサーチ&「C-w」でリージョン取り込み。
    5. 「C-a」で行頭に戻り、","をインクリメンタルサーチして元x番目のフィールド位置まで移動して y番目のフィールドをヤンク。
    6. 「C-a C-n」で次の行の先頭にカーソル移動。
    行数が多いとキー(例えばF4)を押しっぱなしにしても時間がかかるので、 「C-u 1000 F4」とかで出来上がるのを少し待つ感じになるでしょうか。

個人的に、ちょっとした事でもすぐにキーボードマクロを使ってしまいます (文字列置換ですら インクリメンタルサーチと 文字書き換え をキーボードマクロで繰り返す事で 行なってしまう😅(以前のメモ))。 しかし、そのためか 少々変更量が多い編集でも 大した事は無いと感じることが多いです。

vimには 挿入モードで「C-r =」を押すと電卓モードになり、計算式を入力するとその計算結果を挿入できる 機能があるのを知ったり。ほぅ...。Emacsにも calcという電卓機能はありますが、calc-modeで使う 独立したアプリって感じなので、vimのそれに比べるとやりたい事に対してオーバースペックという 感じです。で、そういや関数calc-evalがあるのは知っていた (以前の日記)のですが、ミニバッファで式を入力するという 発想が無かったです😓。雑に以下のような感じのを.emacsに直置きしてみました。

(defun my-calc (expr)
  "my simple calc"
  (interactive (list (read-from-minibuffer "expression: ")))
  (insert (calc-eval expr))
  )

因みに円周率piは使えないようですが、三角関数の引数はDegreeで指定すれば良いみたい。 「sin(90)→1」、 「sin(12)^2+cos(12)^2→1.」、 「log10(2^32)/log10(2)→32.」、 「12^34→4922235242952026704037113243122008064」、 「12.0^34.0→4.92223524295e36」、 「sqrt(3^2+4^2)→5」 てな感じで、ちょっとした計算なら事足りそう。

2024/07/27

昼過ぎ起床。寝すぎ。

Linuxやネットワークを含んだテストにVMwareを使っているのですが、ネットワーク経由の ファイルアクセスを行なった際にやたらCPUを食うのとアクセスが遅いのが気になっていました。 で、VirtualBoxだとどうなのだろう?と思い試してみていました。 Windows10ホストのCygwin Emacsから VirtualBoxの Fedora40上の画像ファイルで image-diredを試した感じ、VMwareよりもCPUの負荷がかからないように見えます。 VMwareではネットワーク経由でファイル転送を行なうと 「VMware Workstation VMX」というプロセスが高負荷で動きます。 加えて Windowsの「Antimalware Service Executable」てプロセスも同時に動くようで、 これらがCPU高負荷だったりなんだかファイル転送速度が遅い原因みたい。

VirtualBoxにFedora40を新規インストールしたついでに Emacsとかもパッケージインストールしてみたり。 環境構築の過程の中でパッケージに 「emacs-anthy-unicode.noarch : Emacs files for anthy-unicode」 なるものが存在しているのを知りました。Emacs-29にも対応しているようです。 VMwareのFedora40では随分前に入れたanthyのパッケージがずっと引き継がれているのですが、 Emacs27になった時に動かなくなってしまい、 手動でパッチを当てていました。しかし、Fedoraをアップグレードする度にパッチが剥がれて 先祖返りしてしまい、毎回手で直すって事を繰り返していました (過去メモ1, 2, 3)。 という訳でVMwareのFedoraも anthy-unicodeに変更してみました。

wrapped_convertをテストしていたのですが、色々バグらかしていたのを直したり😓。 BPGやJXRのリモート画像サムネイル生成に失敗していました。

2024/07/26

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

D言語版の wrapped_convertをテストしていてSegfaultするケースがあったり。 ssh接続で失敗したとき、tmpファイルには何も書かれないのですが std.file.deleteme()を使った場合、何か書かれるまでファイルの実体は生成されないようです。 このとき「scope(exit) tmp.remove();」みたいになっていると、 何か書かれてファイルが存在していれば tmp.remove() は成功するのですが、何も書かれていなくて ファイルが存在しないと tmp.remove()がSegfaultするという感じになっていました。 D言語のサンプルコード通りにしていたのですが、うまく動かない場合があるという罠。 「scope(exit){if(exists(tmp)) tmp.remove();}」みたいに対応してみたのですが、 普通はどうするものなのかはよく判っていません😓

2024/07/25

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

先日の続き。D言語版の wrapped_convertを対応している途中で 何故かファイルのフレーム番号指定が解釈されなくて悩んだり。
原因は単なる勘違い。D言語版では パイプを使わない代わりに一時ファイルを介してリモートファイルを ローカルにコピーしてから magick convertに食わせているのですが、 その時の一時ファイル名にフレーム番号を付けてしまっていたのが原因でした。 foo.gifという元ファイル名の場合 コマンド引数は foo.gif[0] のように指定するのですが、 一時ファイル名がtmp.gif[0]のようになっていても、これはフレーム指定した事にはならない (tmp.gif[0][0]とかにしなくてはダメ)という事でした。 修行が足りません。ひとまず D言語版も対応できたつもり。

2024/07/24

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

Emacsの image-dired でリモートファイルに対応する為の拙作スクリプト wrapped_convert を改善。 拡張子が .jfifだった場合に変換できなかったのと、アニメーションgif/webp でファイル名に フレーム番号指定した場合(例えば foo.gif[0]とか)に変換できなかったのを対応してみたり。

2024/07/23

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

調べ事をして終了。

2024/07/22

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

Web巡回して終了。

2024/07/21

昼過ぎ起床。寝すぎ。

掃除したり洗濯したり。

調べ事をしたりぐうたら過ごして終了。

そういえば Emacs30のブランチが生成されてから1ヵ月が経ちますが、そろそろ 30.0.90が来るのかしら? タイミングがイマイチよくわからない。

2024/07/20

昼過ぎ起床。寝すぎ。

先日から発生しているらしい大規模システム障害。 そういや我が家の Windows10 PCも数日前(7月19日より前)にスリープから復帰してちょっと使っていると ブルースクリーン落ちして珍しいなと思った事があったな。 今の所、再起動後にブルースクリーンの再現はしていませんが、世の中では何度も発生するケースがあるらしい。 クラウドストライク社のセキュリティソフトに原因があったようですが、我が家では使用していないので 違う原因でブルースクリーン落ちしていたのではないかと思っています。 それにしても、直接関与しない 高々 一アプリに不具合があっただけで全体に波及するとは、 今の社会システムって脆弱だなぁとは思います。

そういえば先日、find-diredの話の中でも少し触れましたが、 ターミナルのコマンドラインでファイル名が判ったとして、起動済のEmacsで開こうとすると フルパスが必要になる場合があります。 pwdコマンドを使用したり、bashの環境変数PS1でコマンドプロンプトに良い感じに表示されていたり するものを コピペして ファイルを開くのに使用する(直接開ける訳では無い)場面は良くあります。 で、bashのコマンド文字展開に「~+」というのがあるのを知りました。pwdコマンド相当の カレントディレクトリパス文字列に展開されます。 例えば「ls -l ~+/*.c」みたいするとカレントディレクトリの *.cにマッチするファイルが フルパスで表示されます。 ファイルがフルパスで表示されるので カレントディレクトリに関係無く、 起動済みEmacsや コマンドのファイル名指定に使えます。 因みに「ls -l ~+/*」とかだと恐らく想定した感じにはなっていないのではと思います。 「ls -ld ~+/*」などのlsコマンドのオプションを上手く使う必要があるので微妙に面倒な所はあるかも知れません。

2024/07/19

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

SAI2の新しいのが来ていたり。おつかれさまです。バグ修正がメインのようです。

キューの先祖返りの件。Emacs29.4の image-dired-external.el の関数image-dired-create-thumb に 先日の対応を適用してみたのですが、 何度も サムネイルファイルを生成する事はなくなったものの、Emacs30のように すぐに *image-dired* バッファの表示更新が始まる事は無いみたい。 29系でも直れば良かったのですがいたしかたなし。

2024/07/18

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

Web巡回して終了。

2024/07/17

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

調べ事をして終了。

2024/07/16

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

キューの先祖返りの再現。 特別な事はしていないように見えるけどなぁ?と思いながらも違いを調べてみたり。 調べている中で、ファイルの属性を調べる 関数file-attribute-modification-time を使っている のですが、defsubst てので宣言されているなぁ?と思ったり。 defsubstてなんぞ?と思って調べたところ、インライン関数を定義するマクロらしい。 なんか怪しい気がすると思い、関数(マクロ)の戻り値を一旦変数に置いたものをキューの登録データに使う ようにしてみたところ、キューの先祖返りが発生しなくなるようでした。んー? ほんとか?🤔 先日の最小コードに組み込んでみたのですが再現はせず。むーん🤔。

2024/07/15

AM中に起床。

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

モロコシ死んでしまったのか....。確かに出てないな?とは思ったけれども。

先日のキューの先祖返りの件を最小コードで再現できないか?と思い試してみるも 先祖返りせずに意図通りに動く模様。再現できず。むぅ🤔。

2024/07/14

AM中に起床。

掃除したり。

Emacs30.0.60のテストを始めた頃に Emacs29でリモート画像ファイルのサムネイル表示が始まるのが遅い件について、 Emacs30では パッチが影響している事が判りました。 そういやそのパッチ外しをEmacs29では試していなかったな?と思い試してみたのですが、 Emacs29ではパッチを外しても状況が改善しませんでした。 動きとしてはEmacs30で調べてた時と同じで、サムネイル画像ファイルを作っては消すを繰り返していて、 一通り終わるとサムネイルが表示され始めると共にファイルも保存され始めるというものでした。 結局、Emacs30ではパッチ外しを行なった事でなぜイケるようになったのかの因果関係が結びついていない ままなのですが、Emacs29ではもう少しちゃんと原因を追及しないとダメかも🥺。
少し見てみるも、やっぱりファイルが消える要素が見当たらないのだけどなぁ.....?🤔

よくよく観察していると、ファイルが消えているのではなくて、同じ名前で上書きされているっぽいのが判ったり。 変数image-dired-debug というimage-diredをデバッグする為の変数があった為、 それを使って動きを見てみたり。 どうやら、画像ファイルをマークする時に何やらサムネイルを生成しようとしているのですが、 マークされたうち最初の方の6個分のファイルの サムネイル生成を繰り返しているようでした。 この「6」はサムネイル生成を非同期実行する並列数(image-dired-queue-active-limit)分で、 我が家では 6に設定してあるという事です。繰り返し回数はマークしたファイル数か?と思ったのですが、 マークしたファイル数よりも少ない感じなのが謎。 さておき、それが終了するとマークを外していて、その後「*image-dired*」バッファへの 描画が始まるという感じのようです。 画像ファイルをマーク→マークを外すまでの間に、無意味なサムネイル生成を繰り返している 感じにはなっているという事みたい。
で、image-dired-queue という変数が まだ未生成のサムネイルの一覧がリストで格納されている キューになっていて、空でなければ一つを取り出してサムネイルを生成するという感じなのですが、 何度も同じサムネイルを生成するには、キューが取り出されていない可能性が考えられます。 しかし、6個分の異なるサムネイルを生成しようとしているという事は、キューの取り出しは できていると考えられるかと。てことは、同じ画像のサムネイル生成を何度もキューに登録 していると仮定するのが辻褄としては合うように思ったり。 と、当たりを付けて探りを入れてみるもよく判らず🥺

よく判らないけど リストの先頭を取り出す popが動いていないように見えるのだけど...? もう少し キューの動きを観察したところ、キューのpop(先頭からの取り出し)はできてっぽいですが、 キューへの追加(nconcてのを使っている)を行なうと、何故かキューが popする前の内容に 戻っていて、それに対して追加しているように見えます。結果、pop側はまた最初からやり直している感じ。 同じ画像のサムネイル生成を何度もキューに登録しているというよりは、キューの内容が 先祖返りしてしまう為、見かけ上 何度もキューに登録している様にも見えるという感じみたい。 そもそもキューへの追加側とキューの取り出し側が別スレッドみたいな感じになっているのですが、 キューのインスタンスがスレッド共有になっていないかのような振舞いにも見えます。 29.xでは何かしらバグっているのかも。なので、30.0.60では直っててうまくいくようになった?🤔 30.0.60では 同期で行なうようにしていたパッチを外して非同期(run-at-timeを使う)に戻すと 動くようになりましたが、何かしらバグっていたとすれば因果関係が判らないのに直ったように 見えるってのも納得はできるっちゃできます。 いずれにしてもELISPが意図しない動きになっている以上はどうしようも無い感じ。 30系で直るって事にして 29系で直すのはあきらめる方向で😓。

30系で29系と同じデバッグコードを仕込んで動きを観察してみたところ、 キューへの追加が全て終わるまでは取り出しを行なわない動きになっているようです。 また、29系でもローカルディスクの場合は キューへの追加が全て終わるまでは取り出しを行なわない 動きになっていました。ただ、「取り出さない動きになっている」というよりは 「追加の間は取り出しが行なえない」のではないか?とも思ったり。 いずれにしても、なんかELISPの動きが怪しい気がします。

もしかしてこういう事が起こっているのか?と思ったり。 以下は若干パッチが当たっていますが 29.4 の lisp/image/image-dired-external.elの キューの追加と取り出しのメインとなる二つの関数です。

     1  (defun image-dired-thumb-queue-run ()
     2    "Run a queued job if one exists and not too many jobs are running.
     3  Queued items live in `image-dired-queue'.
     4  Number of simultaneous jobs is limited by `image-dired-queue-active-limit'."
     5    (while (and image-dired-queue
     6                (< image-dired-queue-active-jobs
     7                   image-dired-queue-active-limit))
     8      (cl-incf image-dired-queue-active-jobs)
     9      (apply #'image-dired-create-thumb-1 (pop image-dired-queue))))
    10
    11  (defun image-dired-create-thumb (original-file thumbnail-file)
    12    "Add a job for generating ORIGINAL-FILE thumbnail to `image-dired-queue'.
    13  The new file will be named THUMBNAIL-FILE."
    14    (setq image-dired-queue
    15          (nconc image-dired-queue
    16                 (list (list original-file thumbnail-file
    17                             (format-time-string
    18                              "%s" (file-attribute-modification-time
    19                                    (file-attributes original-file)))))))
    20    (run-at-time 0 nil #'image-dired-thumb-queue-run)
    21    )

11行目の 関数image-dired-create-thumb が元の画像ファイルと生成するサムネイルのファイル名を 指定して、キュー(image-dired-queue)に追加しています(14~19行目でnconcを使っている)。 20行目では run-at-time でキューに登録されている値を取り出すように 関数image-dired-thumb-queue-runを 実行するように指定しています。 キューの取り出し側の方は 関数image-dired-thumb-queue-run の中でキューが空でなくて 実行可能スレッド数の上限を超えていなければ 9行目で キューの先頭を取り出して サムネイルの生成を行なう 関数image-dired-create-thumb-1 を実行します。 ここでは示していませんが 関数image-dired-create-thumb-1 の中では、サムネイルの生成が終わった所で キューが空でなければまたキューから取り出しを行なって次のサムネイル生成が行なわれる為、 キューが空になるまで次々サムネイル生成を続ける感じになります。 で、30系や29系のローカルディスクの場合は、関数image-dired-create-thumb で1ファイルずつ キューに追加するのですが、run-at-timeによる 関数image-dired-thumb-queue-runの実行が直ぐには 発動していないような動きになっているように見えます。 少し前に同期実行を非同期に戻したというのは 20行目を「(image-dired-thumb-queue-run)」として直ぐに実行するようにしていました。 これを現在の20行目のように run-at-time を使うように戻した訳ですが、同期実行だと キューへの追加後、すぐにキューの取り出し&サムネイル作成 が行なわれます。 このとき、関数image-dired-create-thumb で次のファイルをキューに登録する事で キューが先祖返りしていると、 同期でサムネイルファイルが生成されては消える(厳密には同じ名前で何度も生成されていた) 動きになっている状況とも辻褄が合います。まとめると、


という訳で、上記一番最初の image-dired-queueから popで取り出した分が 関数image-dired-create-thumb 内の nconcで追加する事で(?)先祖返りしなければ、如何なる場合もOKになるんじゃないかと考えます。 結局 30系でも「今は大丈夫なように動いているだけ」で、全てのファイルの追加が完了する前に 取り出しが始まるような事があればやっぱりダメになると思われます。 一応これで 起こっている全ての事象の辻褄は合っている気がします。 いずれにしてもELISPの動きが想定と違う事は言えるかと思います。

変数 message-log-max で 「*Messages*」バッファの保存行数を変えたり無制限にしたりできる。 以前使った事がありましたが、 変数名を覚えていなかったのでまた検索しなおしてました😓。 という訳で、デフォルトよりもちょっと増やした設定値を .emacsに追加しておきました。 ひとまずこれで探せるだろう。

2024/07/13

AM中に起床。

例えば 全く土地勘のないディレクトリ構造の中で、ファイル名だけは なんとなくこんな感じ っていうのが分っている時、findコマンドを使う事がよくあります。 「find . -iname '*image*.c'」のようなので ファイル名が分ったとして、 それを 既に起動しているEmacsで開こうとすると、ファイルパスをフルパスになるように ごにょごにょ加工して...みたいに微妙なひと手間がかかるのですが、そういうもんだと思ってました😓。
で、Emacsに find-dired や find-name-dired というコマンドがあるのを知りました。 雑に要約すると findコマンドの実行結果を diredで表示/操作できる感じのものみたい。 find-name-diredは findコマンドの -inameオプションの引数を指定するファイル名検索に特化したもので、 find-diredは findコマンドの生オプション(例えば「-name 'Image*' -type f」とか)を細かく 指定したい場合に使うみたいです。 デフォルト設定で実行すると find コマンドの -lsオプションが指定されていて表示がイマイチなのですが、 変数 find-ls-optionで findコマンドの -execオプションを使った出力で調整する事もできるようです。 diredの普段使い設定が 「(setq dired-listing-switches "-la --time-style=long-iso --group-directories-first")」 みたいな感じなので、それと合わせる感じで 「(setq find-ls-option '("-exec ls -ld --time-style=long-iso --group-directories-first {} +" . "-ld --time-style=long-iso --group-directories-first"))」 てな感じにしてみました。変数find-ls-option のhelpを読む感じ、 (FIND-OPTION . LS-SWITCHES)のような設定の対になっているようですが、LS-SWITCHESは findコマンド側で出力される lsの表示に合ったものを指定すれば良いみたい。 でも、--group-directories-first は効いてなさげ🤔。 個人的に TRAMP接続した場合でも使えるか? が重要だったりするのですが イケるようです。 スゴイ😲。
ただし、「*Find*」というバッファを共用するようです。なので ローカルとリモートで探した結果を見比べるみたいなのは少し手間をかける必要がありそうですが、 ターミナルでローカルとリモートで findコマンドを実行して もにゃもにゃするよりは少しマシ かも知れません。

dired表示の1行目にディレクトリパスが表示されていますが、 たまたまマウスカーソルがパスの途中に乗っていて、なにやらクリッカブルになっているのに気づいたり。 クリックしてみると(Windowsのファイルエクスプローラと似た感じで)クリックしたディレクトリ階層が diredで表示されるというのを偶然知りました😅。テキストカーソルを移動して RETでも同様に開く事が できるというのも知ったのですが、マウスカーソルをかざした時と違ってハイライトもされなければ ToolTipが開く訳でも無いので、まさか開けるとは思わなかったという感じです。 find-diredの話も含め、毎度の事ですが まだまだ知らない事が沢山あるなぁと思います。

2024/07/12

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

Web巡回して終了。

2024/07/11

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

Emacs 30.0.60でのstippleパターン表示。 0x80以上の文字がマルチバイト文字として文字列に含まれていた為、bitmap生成関数でうまく 値が取り出せない状況になっていたみたい。 「:stipple (list 8 8 (string ?\x1 ?\x2 ?\x4 ?\x8 ?\x10 ?\x20 ?\x40 ?\x80))」みたいに データを指定した場合、最後の 0x80がユニバイト文字になりません。 「:stipple (list 8 8 (string-to-unibyte (apply 'concat (mapcar 'byte-to-string '(#x01 #x02 #x04 #x08 #x10 #x20 #x40 #x80))))」 て感じにすれば 0x80を含むユニバイト文字列としてbitmap生成関数にうまく伝わるようです。 なんか面倒臭いですがこういうものらしいという事で。

2024/07/10

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

Emacs 30.0.60でのstippleパターン表示。 なにやら8x8サイズにすると一部データが化けているように思ったので、デバッグコードを仕込んで観察してみたり。 確かに化けてっぽいデータが渡ってきているようなのですがなぜそうなっているかはまだ分らず。 そういやデータ指定する場合は文字列データで指定する事になっていますが、 0x80以上ってASCIIコード的にどういう扱いなんだっけ?🤔

2024/07/09

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

Web巡回して終了。

2024/07/08

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

Emacs 30.0.60 で text-scale-adjustでスケールを変更すると stippleパターン表示が変になる場合がある件。 先日 bitmap_idが重複して割当たっているという所から探ってみた所、ここかな?というのを見つけたり。 src/image.c内の 関数image_create_bitmap_from_file() と 関数image_create_bitmap_from_data() が bitmapを読み込んでパターンテーブルに登録する関数のようです。 bitmap_idの払い出しは 関数image_allocate_bitmap_record()で行なっていて、基本的には新しいテーブルを 登録したら新しいIDを払い出しているのですが、リファレンスが無くなったテーブルエントリはそのID を再度払い出すというロジックのようです。IDが増えないのは、このリファレンスが無くなった テーブルエントリを再払い出しする時のようです。ただ、関数 image_allocate_bitmap_record() では IDの払い出しを行なうだけで、リファレンスの有無を示すリファレンスカウンタはこの関数の外で 正しく制御する必要があるみたい。 で、長くなりましたが、データからbitmapを生成する 関数image_create_bitmap_from_data() では bitmapの読み込みに成功したら リファレンスカウントを1 にしているのですが、 ファイルからbitmapを生成する 関数image_create_bitmap_from_file() では プラットフォーム毎に ifdefブロックが別れていて HAVE_NTGUIの場合を確認すると リファレンスカウンタを設定するコードが抜けているようです。HAVE_PGTKなど他のブロックを参照すると いずれも リファレンスカウンタを1 にしているようです。 データからbitmapを生成する 関数image_create_bitmap_from_data() ではリファレンスカウンタの 設定は共通コードで実行するようになっていますが、 ファイルから bitmapを生成する 関数image_create_bitmap_from_file() は共通コードは無いように 書かれているので各ブロックで漏れなく記す必要があるかと思われます。

$ diff -u src/image.c.orig  src/image.c
--- src/image.c.orig    2024-07-06 11:40:39.726123700 +0900
+++ src/image.c 2024-07-08 23:23:25.459487200 +0900
@@ -780,6 +780,7 @@
   id = image_allocate_bitmap_record (f);
   bitmap = w32_create_pixmap_from_bitmap_data (width, height, data);

+  dpyinfo->bitmaps[id - 1].refcount = 1;
   dpyinfo->bitmaps[id - 1].height = width;
   dpyinfo->bitmaps[id - 1].width = height;
   dpyinfo->bitmaps[id - 1].stipple = bitmap;


直してちょろっと試した感じ大丈夫そうなのですが、メモリリークしないよね?みたいなのは 少し使って様子を見てみる方向で。

2024/07/07

昼過ぎ起床。寝すぎ。

掃除したり洗濯したり。

Emacs 30.0.60 で text-scale-adjustでスケールを変更すると stippleパターン表示が変になる場合がある件。 デバッグコードを仕込んで様子を少し見てみたり。 src/w32term.c内の 関数 w32_fill_stipple_pattern() が実際に Win32APIの CreatePatternBrush()と FillRect() を使ってパターン描画を行なっている箇所になるのですが、 パターンの一覧を保持した bitmapsという配列から face毎に保持されているパターンの選択値を使って 描画するパターンを選択しているようです。しかし、face毎に保持されているパターンの選択値が 既に壊れている場合があるようで、この関数では壊れた値の通りのパターンで描画しているだけと いう感じみたい。どこでface毎のパターン選択値が化けているのかを調べる必要がありそう。

もう少しだけ調べてみた所、src/xfaces.c 内の 関数load_pixmap() でface毎のbitmapをロードしている ようなのですが、 何故か違うパターンに対して同じ bitmap_idを返す場合があって、 これが選択を誤る(というか返ってきたIDに従っているだけですけど)直接の原因になっていそう。 なぜそうなるのかはまだ判らず。

2024/07/06

AM中に起床。

Emacs 30.0.60 を今日時点の最新にしてみたり。 少し前に、 Cygwinのw32ビルドで harfbuzzの DLLがロードできていないバグが修正されてっぽいと 記したのですが、UNICODE=1でビルドするとワーニングになる箇所があったので微妙に直したり。 あと、Cygwinじゃない場合のコードが壊れてるんじゃないか? 変数uniscribe_availableを 1にするコードが WINDOWSNT(MinGWとか)の場合に機能しなくなってるように思ったりも。 ちょろっと動かしてみた感じではいきなりズッコケたりはしなさげ。

そういやVMware上で動いているFedoraで Emacsを起動して、クライアントの VcXsrvで受けて 表示するってのをこれまでもやっていたのですが、なぜか開かなくなっていたり。 同じようにImageMagickのdisplayコマンドを実行すると開くので、環境変数DISPLAYの設定とかは合っているハズですが?🤔。 もしやと思い、VMware上で開いたデスクトップをログアウトしたら開くようになったり。 でも、なにやらメッセージ表示のウインドウも同時にひらいて、

「You are trying to run Emacs configured with the "pure-GTK" interface under the X Window System. That configuration is unsupported and will lead to sporadic crashes during transfer of large selection data. It will also lead to vanous problems with keyboard input. Install emacs-gtk+x11 or emacs-lucid package.」
(Google翻訳: X Window System で「pure-GTK」インターフェースで構成された Emacs を実行しようとしています。この構成はサポートされていないため、大規模な選択データの転送中に散発的なクラッシュが発生します。また、キーボード入力にさまざまな問題が発生する可能性があります。 emacs-gtk+x11 またはemacs-lucid パッケージをインストールします。)

と記されていたり。全く気づいていなかったのですが emacs-gtk+x11 てのが知らないうちに インストールされていて、そちらならばこれまで通りの感じで使えるようです。

Emacs30では :stippleというテキストプロパティが Windowsでもサポートされたらしいのですが、 そもそも何?ってのがほぼ説明が無かったので調べてみたり。 背景をbitmapパターンでハッチング表示するプロパティらしい。

stipple表示テスト

インストールせずに使っているのもあってか、パターンの元になるxbm形式のビットマップファイルを いちいちフルパス指定する必要があるっぽい。また、リストでビットマップデータを示す事も できるようですが、文字列によるデータの指定方法が分りにくいです。 スクリーンショット画像では 「:stipple (list 4 4 (string ?\x3 ?\x3 ?\xc ?\xc))」だと 幅4ドット 高さ4ドットで、 16進の文字コードで示す感じになるようです。この例だと
    0 1 2 3
 0:1100
 1:1100
 2:0011
 3:0011

のような模様を指示している感じになるようです。
あと、スクリーンショット画像はうまく表示されたものですが、 スケールを変更すると ビットマップパターンがうまく切り替わらなかったりと、 何やらバグっているようには思ったりも。

2024/07/05

気持ち早めに帰着。

調べ事をして終了。

2024/07/04

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

Web巡回して終了。

2024/07/03

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

先日の「⛓️‍💥」のシーケンスが足されると「⛓(VS16無し)」と「⛓️(VS16有り)」の切り替えができなくなる件 の対応を Emacs-29.4にも行なってみたり。 以前から Emacs-29.1で Uicode15.1対応して使っていたのですが、 emoji-listとかでも「⛓」だけがSegoe UI Symbolで表示されているのは まるで気づいていませんでした😓。 てか、今回のも Windows11で Unicode15.1の絵文字表示が対応されたのに たまたま「⛓️‍💥」が表示できていない のに気づいた所が発端になっている訳ですが、もし「⛓️‍💥」が表示できる方に倒れていて、 「⛓(VS16無し)」と「⛓️(VS16有り)」の表示が切り替わらないだけだったら、変な事に絶対気づいて いなかったかも。

librsvgって現在はRustに移行しているってのを知ったり。CygwinネイディブなRustコンパイラは無いので 面倒臭い事になっているかも。 gcc-14.1では gcc-rustが実験的に入っているようですが(以前のメモ)、 Cygwinで使えるようになるのかは判りません。結局 gdcも gcc-12以降 ブートストラップできなくなるのですが (以前のメモ)、 Cygwinで動くlibdruntimeやPhobosがビルドされそうな気配は無いですし。

2024/07/02

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

Emacsで「⛓(VS16無し)」と「⛓️(VS16有り)」で表示が切り替わらない件。 順番に Unicode15.1から15.0に近づけてみようと試してみたら、1つ目の変更で切り替わる状態になったり😅。

  1. admin/unidata/emoji-zwj-sequences.txt の「broken chain」のシーケンスをコメントアウト。
えー?「⛓️‍💥」のシーケンスが足されると「⛓(VS16無し)」と「⛓️(VS16有り)」の切り替えができなくなる ように見えるって 事になります。
すぐ近くにあった似た様な u+2764 は「❤(VS16無し)」と「❤️(VS16有り)」は切り替わり (あー、HEAVY BLACK HEARTなので EdgeやChromeブラウザでは切り替わらないのだった)、 合字の「❤️‍🔥(heart on fire; 2764 FE0F 200D 1F525)」なんかも大丈夫なのに。 admin/unidata下のファイルを grepなどで絞って 「⛓(u+26d3)」と「❤(u+2764)」とで 記述の違いが無いかを見てみたのですが、これといった違いは無いように見えたりも。 うーむ、判らん🤔

ぼんやりと、何かしら ZWJで繋ぐ場合とそうでない場合とを区別する為の何か仕掛けがあるのだろうか? と思ったり。 admin/unidata/emoji-zwj.awk という awkスクリプトでデータを生成しているようだったので、 何か判るかと眺めてみたのですが、何かしら特定の文字コードを特別扱いしてるんじゃないか? と思われる所があったのと、これはたまたま偶然なのですが、「❤(u+2764)」がその中に含まれている ところから、もしやと思って以下のように emoji-zwj.awk を変更してみたり。

$ diff -u admin/unidata/emoji-zwj.awk.orig admin/unidata/emoji-zwj.awk
--- admin/unidata/emoji-zwj.awk.orig    2024-06-25 22:42:47.000000000 +0900
+++ admin/unidata/emoji-zwj.awk 2024-07-03 00:59:54.674572700 +0900
@@ -70,18 +70,19 @@
      # try to display them with the emoji font anyway.

      trigger_codepoints[1] = "261D"
-     trigger_codepoints[2] = "26F9"
-     trigger_codepoints[3] = "270C"
-     trigger_codepoints[4] = "270D"
-     trigger_codepoints[5] = "2764"
-     trigger_codepoints[6] = "1F3CB"
-     trigger_codepoints[7] = "1F3CC"
-     trigger_codepoints[8] = "1F3F3"
-     trigger_codepoints[9] = "1F3F4"
-     trigger_codepoints[10] = "1F441"
-     trigger_codepoints[11] = "1F574"
-     trigger_codepoints[12] = "1F575"
-     trigger_codepoints[13] = "1F590"
+     trigger_codepoints[2] = "26D3"
+     trigger_codepoints[3] = "26F9"
+     trigger_codepoints[4] = "270C"
+     trigger_codepoints[5] = "270D"
+     trigger_codepoints[6] = "2764"
+     trigger_codepoints[7] = "1F3CB"
+     trigger_codepoints[8] = "1F3CC"
+     trigger_codepoints[9] = "1F3F3"
+     trigger_codepoints[10] = "1F3F4"
+     trigger_codepoints[11] = "1F441"
+     trigger_codepoints[12] = "1F574"
+     trigger_codepoints[13] = "1F575"
+     trigger_codepoints[14] = "1F590"

      print "(setq auto-composition-emoji-eligible-codepoints"
      print "'("


配列要素の最初の方に追加したので差分が多くなっていますが 「⛓(u+26D3)」を追加した感じです。さておき、イケた気がする。

CHAIN 絵文字シーケンス修正テスト

「❤(u+2764)」の文字コードをたまたま見ていたから気づいただけで 単に運が良かっただけかも😅。 それにしても絵文字は罠が多すぎる🥺。

2024/07/01

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

調べ事をしていて、 sincos() や sincosf() という正弦と余弦を同時に計算する関数があるのを知ったり。 確かに回転行列の中には sin(Θ)と cos(Θ)が含まれていて 最初に計算しますけれども。 GNUによる拡張らしいのですが、いつ頃から存在していたのだろう?

Emacsで「⛓(VS16無し)」と「⛓️(VS16有り)」で表示が切り替わらない件。 「⛓(u+26d3;chains)」の すぐ近くの「⛑(u+26d1;rescue worker’s helmet)」や 「⛩(u+26e9;shinto shrine)」は 「⛑(VS16無し)」と「⛑️(VS16有り)」や「⛩(VS16無し)」と「⛩️(VS16有り)」は 表示が切り替わります。なぜ ⛓ だけが切り替わらないのかやっぱり謎🤔。 VS16の有無でフォントを切り替える処理はどこで行なわれているのだろうか?

Cygwinパッケージのオリジナルの 29.4 emacs-w32バイナリで確認してみたところ、 「⛓(VS16無し)」と「⛓️(VS16有り)」の表示が切り替わる事が判ったり。 そして、パッチ版(harfbuzzが使える)の Unicode15.0までの対応としている emacs-w32バイナリでも 「⛓(VS16無し)」と「⛓️(VS16有り)」の表示が切り替わりました。

| emacs                   | 対応Unicode | Backend   | 結果       | 備考                                                                     |
|-------------------------+-------------+-----------+------------+--------------------------------------------------------------------------|
| original 29.4 emacs-w32 |        15.0 | uniscribe | 切り替えOK |                                                                          |
| パッチ版 29.4 emacs-w32 |        15.0 | harfbuzz  | 切り替えOK |                                                                          |
| パッチ版 29.4 emacs-w32 |        15.1 | harfbuzz  | 切り替えNG | admin/unidata/emoji-zwj-sequences.txtを手動で unicode 15.1対応に入れ替え |
| パッチ版 30.0.60 emacs  |        15.1 | harfbuzz  | 切り替えNG |                                                                          |
| パッチ版 30.0.60 emacs  |        15.1 | uniscribe | 切り替えNG | ./src/emacs -xrm Emacs.fontBackend:uniscribe で起動                      |

単純に、Unicode15.1 の絵文字に対応した admin/unidata/emoji-zwj-sequences.txt を 使うと切り替えNGになるという模様が付いているように見えます。 「⛓(u+26d3;chains)」に関係する Unicode15.1 用対応をちょっとずつ外して Unicode15.0 に近づけていけばどこかに境界線が見えるのではないか?と思ったり。 どうにか調べられそうな気も。気のせいかもしれませんが。


TOP PREV