昔の最近の出来事(2024.08)

2024/08/31

AM中に起床。

先日、AVIFデータを 組み込みimagemagickで eww表示するには 変数image-type-header-regexps に 対応するヘッダ一致条件を追加すれば良い事が判ったのですが、もしやと思って image-cropで画像切り出し を行なってみたら、うまく切り出せる事が判りました。 随分前に 組み込みimagemagick で表示した画像は 画像切り出しに失敗する というのは判っていて、image-cropを使いたければその画像フォーマットは 外部コンバータで対応し、その代わりに 組み込みimagemagickでの表示はあきらめるって事にしていました。 image-cropの処理も 切り出し元の画像はファイルではなくて データ渡しで外部コマンドで切り出し 処理を行なう為、データそのものを見て画像フォーマットを判定する必要があります。 組み込みimagemagickでは 知らない画像フォーマット判定となっていた為、外部コマンドに元データを 渡せずに失敗するという事だったのですが、 変数image-type-header-regexps に追加する事で 知っているデータ判定された結果、組み込みimagemagick表示でも image-cropでの画像切り出しが うまくいくようになったという流れのようです。 JPEG2000フォーマットも 組み込みimagemagickで表示できるけど image-cropはできなかったのですが、 ハマりどころ(後述)はあったものの、ヘッダー一致条件を追加する事でimage-cropできるようになりました。 ただ、どうしてもこれができないのが TGAフォーマットで、マジックナンバーが無いので 以前 色々試してみたけど諦めました。

JPEG2000フォーマットのヘッダ判定の追加。結論から言うと うまく判定できた書き方は以下。

(add-to-list 'image-type-header-regexps
             '("\\`....jP  \xd\xa.\xa...\x14\x66typjp2" . imagemagick)) ;jpeg2000

最初は「'("\\`....jP .........ftypjp2" . imagemagick)」と記してみた のですが、何故かうまく判定できす。徐々に長さを増やしてみていたのですが、 「'("\\`....jP \xd\xa.\xa...\x14"」までは大丈夫なのに、 「'("\\`....jP \xd\xa.\xa...\x14f"」って書くとダメで、 どうやら「\x14と文字f」ではなくて「\x14f」という16進数という解釈をされているっぽいと気づいて 最初に記したマッチ条件に至ったという感じです。はっきりとjp2と判る情報が随分奥まった所に 記されているのが面倒臭い気はしたりも。 先日も記しましたが、このような 突っかかりどころがあるので デフォルトで --without-imagemagick にする理由は分からなくもありません。

大分前に image-type-header-regexps や image-type-file-name-regexps の初期値について記した事があるのですが、 どうにも 変数image-types を無視した設定がされているのがダメだなぁ?と思ったりも。 Emacs本体がネイティブで表示可能なタイプが 変数image-types には記されていて、 image-type-header-regexps や image-type-file-name-regexps はそれぞれのマッチ条件に対して image-typesのどれで表示するかを紐づけるようなリストになっているかと思います。 しかし、lisp/image.el では image-type-header-regexps や image-type-file-name-regexps を静的に 設定しているのですが、例えば bmp はかつて Emacs本体ネイティブで表示できないにも関わらず 設定されている為、外部コンバーターにフォールバックされず 何故か表示できないという状況に なっていました(以前のメモ)。 カスタム変数ではないのも話をこじらせているように思ったりもします。

なんか Edgeをアップデートしたら表示の雰囲気が変わったような気がしたり。 表示フォントが変わったようですが、Edgeってフォントをカスタマイズすることができなかったよなぁ? と思いつつ設定を見てみたら、使用するフォントを変えられるようになっていました。 現在は 固定幅フォントに「BIZ UDGothic」が使用されているようです。それでか。 前は 設定変更できなかったので 何だったのか判りませんが多分 MSゴシック だったように思います。

2024/08/30

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

Emacsで AVIF画像の表示の最小限設定。 ewwでの表示ができない原因が判らず。気づくとコードを調べている感じです。 先日 コードを読むのをあきらめたのですが、 逃げられないという事か🥺。

ewwでHTMLファイルをレンダリングする際、「~/.emacs.d/url/cache/${USERNAME}/file」 というディレクトリの下にキャッシュファイルが生成されています。 先日調べた時は、「Content-type: xxxxx」をどこで付加しているか 判らんとなったのですが、どうやらキャッシュファイルを読み込むコード調べていた為、 付加している箇所には到達できていませんでした。 で、そのキャッシュファイルですが、AVIFファイルの分も生成自体はされている事が判りました。 つまり、表示するものはあるが何故か表示されていないという状況のようです。 因みに同じHTMLでJPEGファイルも表示しているのですが、そちらは表示できています。 という訳で、表示できるか否かをどこかで判断していると思われるのですが、どこでやっているのかが 判らないという 振り出しに戻っている状況。ぐぅ。

どうやら create-image のtypeをnilにした時に画像フォーマットの自動判定を試みるようですが、 最小限設定だとその判定に失敗している模様。という所から手繰ってやっと判った気が。 最小限設定では image-use-external-converter が nilのままだったので、 外部コンバーターを使わない設定にしていました。 組み込みimagemagickが使えるビルドなので、image-modeなどは組み込みimagemagickで 表示しています。てっきりewwも組み込みimagemagickで表示されているのかと思いきや、 eww(というかshr.el)はそうではないという事でした。
ここでキャッシュファイルの話が関係してきます。ewwでは画像ファイルのフォーマットを URLの文字列からファイルの拡張子で判定しているのではなく、 キャッシュファイルの内容を見て判断しています。キャッシュファイル名はUUIDっぽい 32桁の16進数なので、このファイルを見ても拡張子が無いのでキャッシュファイル名から 画像フォーマットを判定する事はできません。キャッシュファイルの中には 「Content-type: image/avif」の文字列が含まれているので一応 avif画像である事は判断できます。 しかし、この image/avif は結局画像フォーマットの判定には使用されていなくて、 関数create-image はデータの内容を見てフォーマット判定するようです。 ここで、組み込みimagemagickでは知っているフォーマットと判断できず、 これがewwで AVIFフォーマットを表示できない直接の原因でした。で、外部コンバータを 有効にすると自動判定に成功するので画像が表示できるという顛末の模様。 普段使いの .emacs で表示できていたのは外部コンバーターを介して表示されていたからでした。
組み込みimagemagickでもデータを見て自動判定できるんじゃないの?と思わなくもありませんが、 Emacs本体では 変数image-type-header-regexps に画像データのヘッダとtypeを 関連付けるリストを持っていて、画像データの中身を見て画像フォーマットを判定するようです。 ここで知らない判定されてしまうと ビルトイン機構で表示できない画像という事になるようです。 つまり、組み込みimagemagickで自動判定的な事はしていません。 そこで image-type-header-regexps に 「(add-to-list 'image-type-header-regexps '("\\`....ftypavif" . imagemagick))」 てな感じで 追加してやれば、ewwで AVIFを組み込みimagemagicで表示できるようになりました。

表示できなかった原因と対応方法は判ったのですが、単純に面倒くせぇ....。 Emacs自身が画像データのヘッダを知らないとダメなのも 突っかかりどころに なる事を考えると、デフォルトで --without-imagemagick にする理由は分からなくもありません。 何か判らないデータでも とりあえず外部コンバータに丸投げして画像が得られる事が判れば OKな訳ですから話は簡単になる気がします。

2024/08/29

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

Emacsで AVIF画像の表示の最小限設定。まだewwでの表示ができてませんが、 なんか色々散らかっているっぽい。


変数image-file-name-extensions が image-modeと無関係なのはなんでだっけ?
それにしても eww は先日の通り lisp/gnus/mm-decode.el 内のカスタム変数mm-inline-media-tests が関係しているのは判っている のですが、これを記してあるだけではダメで 何かが足りないらしい。

2024/08/28

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

Emacsで AVIF画像の表示。-Qで立ち上げたところから表示できるんだっけ?と思った訳ですが 当然できず。何を足せば表示できるのかを確認してみているのですが、なぜか最小設定がよく判らず。 あれぇ? もう少し記すと、 「(add-to-list 'auto-mode-alist '("\\.avif\\'" . image-mode))」 でimage-modeで開くファイル拡張子を設定すれば AVIFファイルをimage-modeで開くのは問題無くできるのですが、 org-modeのインライン表示 や eww では表示できるようにはなりません。 org-modeは jp2や heicなども何故かインライン表示できなくなったりと、 普段使いの.emacs設定だとできている事なのですが どの設定が効いているのかよく判りません。なんだこりゃ?🤔 設定の順番とかあるんだっけ?

2024/08/27

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

Google検索。何やら「連続スクロール」なるものがあったらしいのですが、廃止されていたらしい (参考記事)。 てかなにそれ? 参考記事で何やら分析されていますが、多分そういう事では無いと考えます。 TANEのように10件では足りない人は設定で100件/ページとかに変更しているハズです。 100件あれば大体事が足ります。つまり自動スクロールなんて付けなくても、最初から 必要な量が見られればそれで必要十分です。少なくともTANEは。 むしろ連続スクロールなんてページ内の単純な文字列検索もできなくなるだろうから役に立つとも思えません。 で、連続スクロールをひっこめるのは勝手ですが(存在にも気づいてなかったし)、 ページ当たり10件に固定するのはダメだろ。少なくとも4ページ分は表示しろよとは思います。

2024/08/26

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

Google検索結果のページ当たりの表示件数が 10件しか表示されなくなってしまってて とてつもなく不便なのだが。 設定が無くなってて100件/ページに戻せない。上位10件なんて大体肝心な事が書かれていないページしか出てこないので、 次の10件以降を選択するのにちょっとスクロールしてボタンを押すとか ただただ面倒臭い。 減らすんだったら 5件くらいの表示でスクロール無しで全部見られて、次の5件をボタン連打で直ぐに出せる ようにボタン位置を固定するとか、少しは考えた痕跡があれば良いのですが、ただ設定を取っ払っただけとか なんなの?感しか無い。

2024/08/25

AM中に起床。

掃除したり洗濯したり。

先日の設定で Emacsの org-mode でAVIFファイルをインライン表示できるのですが、 HTMLにexportすると ewwでは表示できず、リンクも存在しない状態になって、なんでだ? と思ったり。因みに Edgeでの表示はできるので ewwの問題だと思われます。

exportされたHTMLファイルを見てみると、JPEGとAVIFは imgタグで表示するようになっていて、 例えば .jp2ファイルとかは a href でリンクになっていました。 Webで検索してみると、29.0.50で表示できない事が報告されていて (参考) バグだったので修正されているようです。 もう少し切り分けてみると、Webサイトに置かれた AVIFファイルを 「<img src="https://..../foo.avif">」で参照した場合は表示ができるようですが、 「<img src="./foo.avif">」みたいにローカルファイルを表示しようとすると 表示できないようです。JPEGファイルの場合は後者のローカルファイル表示も問題無くできます。 画像表示しないモードにすれば AVIFファイルでも alt属性は表示されるので、 見かけ上 ローカルファイルか否かで画像表示の可否が切り替えられているようです。 が、どこで制御しているのかがよく判らず🥺。

関数shr-get-image-data の引数にローカルファイルのURL「file:///home/.../foo.jpg」を食わせると、 データと content-type のリストが返るのですが、例えば foo.jpgだと content-type は image/jpeg になっているのですが、foo.avifだと content-typeは application/octet-stream になっていて、 これが avifのファイルを表示できない直接の原因だと推測しました。しかし、content-typeの取得は データを読み込んだ後に 関数mail-fetch-field に 文字列content-typeを指定すると検査した結果 として image/jpeg や application/octet-stream を返しているのですが、関数mail-fetch-fieldを見ても どうやって文字列を返しているのかが何故か判らず🥺。
なんか違った。 指定されたURLを「(url-cache-extract (url-cache-create-filename url))」てな感じで キャッシュデータとしてファイル名の生成とヘッダを付けたデータを生成していて、この時点で 「Content-type: xxxxx」を付加しているようです。が、やっぱりどこで付加しているのかが判りません🥺。 なんだこれ?

コードを読むのはあきらめて文字列「image/jpeg」の近くに同じようにavifを定義してみる事に。 結局 lisp/gnus/mm-decode.el 内のカスタム変数mm-inline-media-tests にimage/avifを追加してみたら ewwで「<img src="./foo.avif">」も表示されるようになりました。 てか、gnusってニュースリーダー/メールリーダー なので関係が離れすぎていて訳が判りません。 lisp/net/mailcap.el の方にも 変数mailcap-mime-extensions というのがあって、 ファイル拡張子とmime-typeの関係を記してあるのですが、こちらもどこかに効いてくる箇所が あるのかも知れません。ともかく、Webサーバー上のAVIFファイルは表示できるのに、 ローカルAVIFファイルは表示できないという時点で「なんでだよ?」と思う訳で、 加えて設定も ewwとは関係無さそうな所をいじる必要があるというところからも、 作りが良くないとは感じます。

2024/08/24

昼前起床。

全然関係無い流れから 「ガーゴイルの Wikipedia」 の存在を知ったり。本来は彫刻の施された雨樋の排出口の事だというのを知りました。 ファンタジー世界での 石像の怪物/魔物というイメージしか無かったのですが、雨樋機能 の設定は完全に無くなっているなと思ったりも。

ImageMagickって AVIFフォーマットに対応していないのだっけ?と思って調べてみたり。 HEIF/HEICのライブラリが対応しているとの事なので、HEICのデコードに対応できていれば AVIFも自動的に対応されるのかと思いきやそういう訳ではないっぽい。 Cygwinの magick convert で対応フォーマットを調べてみたところ、以下のような感じでした。

$ magick convert -list format | grep -E 'AVIF|HEIC|HEIF'
     AVIF  ---   AV1 Image File Format (1.12.0)
     HEIC  r--   High Efficiency Image Format (1.12.0)
     HEIF  r--   High Efficiency Image Format (1.12.0)

$ magick convert --version
Version: ImageMagick 7.0.10-61 Q16 x86_64 2021-01-25 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib fftw fontconfig fpx freetype heic jbig jng jp2 jpeg lcms lzma pangocairo png tiff webp x xml zlib

Fedora40の magick convertは少し新しくて以下のような感じみたいです。 因みに、「magick convert」って指定の仕方は 「WARNING: The convert command is deprecated in IMv7, use "magick"」 らしい。ほぅ.....。 ただ、magick display とか「magick tool」ってコマンド体系に変わり無いようなので、 体系に沿ってる magick convert もそのままで良いんじゃないか?とは思ったりも。

$ magick -list format | grep HEIC
     AVIF  HEIC      rw+   AV1 Image File Format (1.17.6)
     HEIC  HEIC      r--   High Efficiency Image Format (1.17.6)
     HEIF  HEIC      r--   High Efficiency Image Format (1.17.6)

$ magick --version
Version: ImageMagick 7.1.1-33 Q16-HDRI x86_64 22263 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(4.5)
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib gvc heic jbig jng jp2 jpeg jxl lcms lqr ltdl lzma openexr pangocairo png ps raqm raw rsvg tiff webp wmf x xml zip zlib zstd
Compiler: gcc (14.1)

さておき、Cygwinのmagickの方は AVIFというフォーマットの存在は知っていて一覧に出てくるのに、 何もできないってのはどういう事だ?🤔 という訳でソースコードを調べてみたり。 coders/heic.cの以下のコードでAVIFがイケる/イケないを判定しているようです。

  :
#if LIBHEIF_NUMERIC_VERSION > 0x01060200
  entry=AcquireMagickInfo("HEIC","AVIF","AV1 Image File Format");
#if defined(MAGICKCORE_HEIC_DELEGATE)
  if (heif_have_decoder_for_format(heif_compression_AV1))
    entry->decoder=(DecodeImageHandler *) ReadHEICImage;
  if (heif_have_encoder_for_format(heif_compression_AV1))
    entry->encoder=(EncodeImageHandler *) WriteHEICImage;
#endif
  :

heif_have_*coder_for_format()って関数で調べているようです。 このコードを切り出して単体コードで調べてみたのですが、確かにイケないという結果になってます。

$ cat check_avif.c
#include <stdio.h>
#include <libheif/heif.h>

int main()
{
  //heif_init(NULL);

  printf("hevc=%d\n",heif_have_decoder_for_format(heif_compression_HEVC));
  printf("AVC =%d\n",heif_have_decoder_for_format(heif_compression_AVC));
  printf("jpg =%d\n",heif_have_decoder_for_format(heif_compression_JPEG));
  printf("av1 =%d\n",heif_have_decoder_for_format(heif_compression_AV1));

  printf("hevc=%d\n",heif_have_encoder_for_format(heif_compression_HEVC));
  printf("AVC =%d\n",heif_have_encoder_for_format(heif_compression_AVC));
  printf("jpg =%d\n",heif_have_encoder_for_format(heif_compression_JPEG));
  printf("av1 =%d\n",heif_have_encoder_for_format(heif_compression_AV1));

  //heif_deinit();

  return 0;
}

$ gcc  check_avif.c -lheif

$ ./a
hevc=1
AVC =0
jpg =0
av1 =0
hevc=0
AVC =0
jpg =0
av1 =0

という訳で libheif を野良ビルドしてみたり。 AVIFに対応するにはlibaomってのが必要なのですが、こちらはCygwinパッケージがあったのでインストール。 で、ビルドできたlibheifでテストコードをコンパイル&実行してみたところ、 逆に何一つOKにならなくて なんだこれ?ってなりました。 どうやら cmake実行時のオプション指定で pluginのロードを有効にする設定をしなくてはならないらしい (参考issue)。 pluginを有効にしたところ一応イケるようにはなったっぽい。 なぜデフォルトでイケるようになっていないのかは不明。

$ cat check_avif.c
#include <stdio.h>
#include <libheif/heif.h>

int main()
{
  heif_init(NULL);

  printf("hevc=%d\n",heif_have_decoder_for_format(heif_compression_HEVC));
  printf("AVC =%d\n",heif_have_decoder_for_format(heif_compression_AVC));
  printf("jpg =%d\n",heif_have_decoder_for_format(heif_compression_JPEG));
  printf("av1 =%d\n",heif_have_decoder_for_format(heif_compression_AV1));

  printf("hevc=%d\n",heif_have_encoder_for_format(heif_compression_HEVC));
  printf("AVC =%d\n",heif_have_encoder_for_format(heif_compression_AVC));
  printf("jpg =%d\n",heif_have_encoder_for_format(heif_compression_JPEG));
  printf("av1 =%d\n",heif_have_encoder_for_format(heif_compression_AV1));

  heif_deinit();

  return 0;
}

$ gcc  check_avif.c -lheif

$ ./a
hevc=1
AVC =0
jpg =1
av1 =1
hevc=0
AVC =0
jpg =1
av1 =1


バージョンが新しくなったので heif_init(), heif_deinit() を追加。

でImageMagickを再ビルド。ところが AVIFとは全然関係無い coders/jpeg.c がコンパイルエラー。 libjpeg-turboと互換が取れなくなっているようで、 こちらのコミット のような修正が行なわれているみたい。手動で取り込んで対応。 新しいlibheifを /usr/local にインストールした都合とかもあって、リンクを手動で対応したり、 /usr/binの方の dllを置き換えたりすったもんだしましたが、以下のような感じでAVIFもイケる ようになりました。それにしても かなり面倒臭いです😓。

$ magick convert -list format | grep -E 'AVIF|HEIC|HEIF'
     AVIF  rw+   AV1 Image File Format (1.18.2)
     HEIC  r--   High Efficiency Image Format (1.18.2)
     HEIF  r--   High Efficiency Image Format (1.18.2)

Emacsにも 変数image-file-name-extensions や 変数auto-mode-alist に AVIFの設定を足して image-mode表示や image-diredでのサムネイル生成にも対応してみました。 Emacsでの画像表示が強まりました。テキストエディタだけど。

2024/08/23

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

ちょろり調べ事。

2024/08/22

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

Web巡回して終了。

2024/08/21

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

VirtualBoxのVM起動に失敗する件の続き。先日の通り管理者権限で VirtualBoxマネージャー を起動する 他に、.vdiなどのファイル群の所有者を変更することで、管理者権限でVirtualBoxマネージャー を起動 しなくても大丈夫になるみたい。結局、インストーラーの最後で起動した VirtualBoxマネージャーで操作してしまうと その操作は全て管理者権限で行なわれてしまう為、ハマりの入口に立ってしまうという事のようです。

たまたま見た IOCCC のWikipedia の中の 解説文に 「Cコンパイラでは、配列aと添字iに対してa[i]は*(a+i)として解釈される。そのためi[a]と書いても同じ結果が得られる。」 というのがあり、ウソでしょ?と思って試したら本当でした😅

$ cat ptr_trick.c
#include <stdio.h>

int main()
{
  char *str="abcdef";

  for(int i=0; i<6; i++){
    printf("%c %c\n",str[i],i[str]);
  }
  return 0;
}

$ gcc -Wall ptr_trick.c

$ ./a
a a
b b
c c
d d
e e
f f


str[i]を i[str]って書いても同じって言われても、いやいやいや....とはなります。
D言語で同じことを書くと流石に怒られます(Error: cannot use `[]` operator on expression of type `int`)。 そりゃそうだ。 むしろ C言語では int型で宣言している変数に対して [] を付けて怒られない事の方がなんでだ? とは思うかも。互換の為に敢えて許容しているのかしら?

2024/08/20

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

NVIDIAのドライバを久々にアップデートした際に再起動したのですが、再起動後 VirtualBoxのVM起動が また失敗するようだったり。またアンインストールして再インストールで復帰したのですが、 なにかバグってるんじゃないか?という疑惑。 VMのFedora40のアップデートをしてVMを再起動後にVM電源OFFし、再度VM電源ONするとまた立ち上がらなくなったり。 単純に再起動だけがトリガになっている訳でもない模様。なんだこりゃ? またアンインストールして再インストールすると復帰するので、やっぱりソフト的な何かのように思ったり。
VMを落とした後 また起動できなくなったので、設定の変更で反応が変わるか?を試そうとしたら設定変更が セーブできないと怒られたり。 ファイルの所有者がAdministratorsになっていたのですが、起動したユーザと違っていました。 もしやと思い「Oracle VM VirtualBox マネージャー」を管理者権限で起動したところ設定の変更もセーブできて VMの起動も大丈夫でした。 アンインストールして再インストールすればイケる事との関係ですが、再インストール終了後に起動される VirtualBoxマネージャーが管理者権限で起動されている為、そこからであればVM起動できるという事みたい。 VM起動後に 邪魔なのでVirtualBoxマネージャーを閉じて、その後VMを終了すると 管理者権限起動された VirtualBox関連プロセスは無くなります。この状態から 非管理者権限で VirtualBoxマネージャー を起動すると そこからのVM起動には失敗する.... というのが一連の動きになっているようです。 個人的な意見としては、VM起動失敗をなんでもかんでも「E_FAIL(0x80004005)」にしているせいで 原因が特定できない感じになっていると思います。

2024/08/19

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

調べ事をして終了。

2024/08/18

AM中に起床。

掃除したり洗濯したり。

先週 WindowsUpdateが来ていたので再起動したのですが、その時にVirtualBoxを落としたままになっていたのを、 テストの為に起動しようとしたところエラーが出て起動できなかったり。 「E_FAIL(0x80004005)」みたいなエラーだったので検索してみると、Hyper-Vを無効にするとか怪しげな方法 しか出てこなかった為、どれも試さずに結果的にVirtualBoxの再インストールで復帰しました。 インストールメニューにRepairがあったので試してみたのですが、こちらもエラーメッセージが出て失敗したので、 Removeで削除した後 再度インストールしたという感じです。
Hyper-Vを無効化する方法として bcdeditコマンドを管理者権限で実行するというものがあるようですが、 いきなり setで状態を変えるようなのしか出てこなくて、どこに関係しているか判らないようなものを、 今の状態を確認せずに変更するのはどうなの?とは思いました。 因みに、設定はそもそも無効になっていたので、やってみたところで解決はしなかったと思われますが。

2024/08/17

AM中に起床。

「宇宙兄弟(44)」。えらいこっちゃ。 そういえば宇宙兄弟の時代設定って少し未来だったよな?と思っていたのですが、 いつの間にか再来年(2026年)には日々人が日本人初のムーンウォーカーになってる事に.... えらいこっちゃ。

Windows98ビルドのEmacsって何の事を指しているのだろうか?

2024/08/16

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

Unicode文字の中に 数学用英数記号(Wikipedka)というのがあるのを知りました。ほぅ...。 ASCII文字とは違う区画に割り当てられているので 入力が難しい(面倒くさいとも言う)と思ったのですが、 math-symbolsというELISPアプリで ASCII文字列を数学英数文字列に変換する事ができるようです。 相互変換はできないのと 変換するとASCII文字での検索はできなくなるので、 通常の文書の中に飾り文字用途で使用する場合は注意が必要かも知れません。 と思ったのですが試しに「𝐓𝐡𝐞 𝐄𝐦𝐚𝐜𝐬 𝐄𝐝𝐢𝐭𝐨𝐫」と記してみたところEdgeやChromeでは ASCIIで文字列検索できるな😅。 恐るべし。普通は無理だと思うのでやっぱり注意は必要でしょう。

2024/08/15

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

bashコマンドラインで例えば複数のコマンドの出力を束ねてファイルにリダイレクトするような場合、 「(date; ./mycommand; date) > exec.log」みたいに括弧で囲んでサブシェル実行ってのをよくやるのですが、 波括弧で囲む事もできるのを今日知りました😅。 波括弧の場合「{ date; ./mycommand; date;}> exec.log」てな感じになるようですが、()と違って 「{の後ろに空白文字が必要」、「最後のコマンドも;で区切らなくてはならない」という 条件を満たす必要があるようです。ちょっと面倒臭い。 ()と{}の違いはいくつかあるようですが、個人的には ()はサブシェル実行なので環境変数は サブシェル内で一時的に変更されますが、{}はカレントシェルとして実行されるので環境変数の変更が以降も 反映されるという違いが大きいかな?と思います。

$ (TEST="Test String"; echo "==" ${TEST} "=="); echo "==" ${TEST} "=="
== Test String ==     #サブシェル内は変数TESTを参照できる
== ==                 #サブシェルの外には変数TESTは無い

$ { TEST="Test String"; echo "==" ${TEST} "==";}; echo "==" ${TEST} "=="
== Test String ==     #カレントシェルで変数TESTを定義したので
== Test String ==     #{}の外にも定義は見える

$ echo ${TEST}
Test String           #当然 変数TESTは定義されたまま


個人的には 環境変数は一時的に変えたい事の方が多いので、{}の方は使わないかもなぁ?とは思ったりも。

2024/08/14

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

SAI2の新しいのが来ていたり。おつかれさまです。前回から1ヵ月ほどしか経っていませんが、 バグ修正リリースのようです。

全然関係無い流れで アスタリスクのWikipedia の存在を知ったのですが、 Unicode文字の仲間がこんなに沢山あるの?と思ったりも。 MS-IMEで「*」を変換するといくつかは変換候補に出てきますが、コピペ以外の方法で入力できないのは 勿体ない話だとは思ったりも。

2024/08/13

AM中に起床。

唐突ですが「Emacsの雑記」を更新しました。 Emacs 29.4向けのパッチの更新なのですが、リモートファイルのimage-dired改善対応&wrapped_convert更新 (参考1,参考2)とか、 Emacs 30.1で対応予定の Unicode15.1 絵文字対応不具合修正(参考) のバックポートです。どちらも必要とする人は居ないかも知れませんが御参考まで。

Google検索で開始日指定での期間指定を行なったのですが、なんか指定が効いていないような? yyyy/mm/ddで指定すると一度は効いてない検索結果が表示されるようですが、もう一度指定メニューを開くと mm/dd/yyyy形式で記されているので内容そのままに[選択]ボタンを押せば指定が効くようです。バグなのか?

2024/08/12

AM中に起床。

掃除したり。

そういやピーマンの絵文字(🫑;BELL PEPPER)って Unicode13.0で追加されたものなのか。 MS-IMEで変換候補に出てこなかったので、絵文字になっていないのだっけ?と 思ったら Windows10の Segoe UI Emojiは Unicode12.0までの絵文字しか入っていないから.... かと思いきや、Windows11の MS-IMEでも変換候補にはピーマンの絵文字は出てこないようです。 結果的に MS-IMEをきっかけにピーマン絵文字の素性を知ったという感じです。 ところで、ピーマンのWikipedia によると、パプリカが日本に輸入されたのって1993年だったってのを知ったり。 確かに TANEの幼少期には見たことが無くて、いつの間にか存在していたなぁ?とは思ったのですが、 まだ 30年しか経っていないとは思いませんでした。 今のところ厳密にパプリカの絵文字は存在していないようで、「BELL PEPPER」の絵文字として 緑だったり赤にデザインされていたりするみたい。 一番謎なのが、Windows11の「Winキー + .」で絵文字選択パッドでピーマンにマウスカーソルを かざすと緑色のデザインなのに 「赤ピーマン」とTip表示されてて なんでや?とは思ったりも。 ピーマンのWikipediaから察するに、カラーピーマンとパプリカとの見た目の区別が付かないとか、 カラーピーマンも未熟果では緑色っていうややこしさに起因しているのかも知れません。 ピーマン絵文字の色問題、思ったよりも闇が深いかも知れません。

2024/08/11

AM中に起床。

ちょろりお出かけ。

そういえばテレビ東京で土曜午前に「オーイ!とんぼ」のアニメの再放送が行なわれていますが、 今日何気に本屋で原作単行本があるのを見て、え!?51巻まで出てるの?と思ったり。 Wikipedia によると 連載は2014年からのようですが、2016年からコミックスが発売され始めて、 1年に6冊くらいのペースで出ているもよう😲。ゴルフ雑誌での連載という事なので、 普通のマンガ雑誌での連載とは違うのかも知れませんが、スピードが尋常では無いと思ったりも。

sortコマンドの -kオプションでソートフィールドを指定できますが、 何やら思っているフィールドじゃない所でソートされていて こんなんだっけ?と思ったり。 どうやら UNIXの sortと挙動が違うというのを今日知りました😓。 awkと同じように連続する空白文字列がセパレータになると思っていたのですが、 空白orタブの1文字が区切りになるようです。この為、「colmun -t」みたいなので 空白文字でパディングして見た目の列の位置を合わせてしまうと、フィールド的に揃っていない事になるようです。 sortの-bオプションを付加すると"結果的に"連続する空白文字列がセパレータになるようです。 ただ、-bオプションの解釈がややこしいのでもう少しだけメモ。 フィールドの区切りは 1文字の空白文字で変わりませんが、-bを付けると以下のように解釈されるようです。

00000000011111111112222222
12345678901234567890123456
    ccc      111      zzz1
     bb     33       zzz2
  a          222   zzz3

↓ -bを付けた場合は 区切りを「|」、無視される空白文字を「_」で表現すると以下のような解釈に変わる模様。

00000000011111111112222222
12345678901234567890123456
____ccc|_____111|_____zzz1
_____bb|____33|______zzz2
__a|_________222|__zzz3

連続した空白の文字列をセパレータにするイメージではなく、あくまで空白文字以外の文字が現れた 位置がフィールドの始まりで、フィールド始まりの手前の空白を無視するというニュアンスのようです。 しかし、これでも解釈が合っていないようで、1番目のフィールドはさらにキーに指定しないと 思った感じにならないようです。以下は全て同じ結果になりそうですが なっていません。

$ cat sorttest.txt                     #元のデータ
    ccc      111      zzz1
     bb     33       zzz2
  a          222   zzz3

$ cat sorttest.txt | sort -b -r        #逆順ソートなので一応期待通り
    ccc      111      zzz1
     bb     33       zzz2
  a          222   zzz3

$ cat sorttest.txt | sort -b -k 1r     #第1フィールドを逆順ソート.... ん?なんで?
  a          222   zzz3
    ccc      111      zzz1
     bb     33       zzz2

$ cat sorttest.txt | sort -b -k 1br    #期待通りだけど キーにbが必要な理由がよくわからない....
    ccc      111      zzz1
     bb     33       zzz2
  a          222   zzz3

なんかややこしい。てか 解釈したフィールドに色でも付けてもらわないと訳が判りません。 いっそのこと「-t,--field-separator=SEP」で指定できるフィールドセパレータ文字を 「-t '\s+'」みたいに正規表現(のサブセット)で書けた方が良いんじゃないか?とは思ったりも。 てか、awk方式のセパレートで困ったことは無いのですが。

2024/08/10

AM中に起床。

bashスクリプトで ビルトイン設定に「set -o pipefail」を使うつもりが、 たまたまコピペしたページに「set -eo pipefail」と記されていたのを 気づかずにそのまま使っていました。 途中で「echo ${foo} | grep 'xxx' > /dev/null; rc=$?」のように 変数foo の 内容をgrepして 文字列xxxの有無で この後動きを切り替えるような事をしたかったのですが、 grep 以降が実行されずなんで? ってなってました。 見る人が見れば「もう理由が書かれてるじゃん」って感じなのですが、「set -e」は 「スクリプト内で 実行したコマンドの終了ステータスが 0以外だったらそこでスクリプトを終了する」 なので、grepで該当文字列が見つからなかった時点で終了してしまいます。 .....って事でした。修行が足りません😓。

圧縮されたアーカイブファイルから中身を取り出す事を「解凍」と言う場合があります。 TANE自身はいつの頃だったか「解凍」って言い方をするのは日本だけって話を聞いたことがあって、 確かに、inflateや uncompressや decompressや extractみたいだねぇ と思い、 以降「展開」って言い方を意識的に使っています。 因みに日記を検索してみたら「解凍」の文字列は今日の日記以外には無く、 「展開」はこのページを置いた頃(2000年3月29日) には使っていたようです。
さておき、Web検索していて、こちらの文書 を知りました。X68kのエミュレータ環境ですが、どうだったっけ?と思い調べてみたところ、 X68k版の lha(「Rel.47 <Version 2.13>(3 July, 1994)」)のマニュアルを見ると、

のように記されていました。また、 コマンド実行で アーカイブに追加する際も「圧縮中!」や「圧縮終了」という文字列が表示されますが、 アーカイブを展開する際は「解凍中!」や「解凍終了」という文字列が表示されていました。 「-z(無圧縮格納)」の場合も「圧縮中!」や「圧縮終了」と表示されているのはプログラム的な都合かも知れません。 マニュアルには「凍結」と記されているのですが、実際のコマンド実行では「圧縮」が前面に出ている一方、 展開の方はマニュアルもコマンド実行もほぼ「解凍」で記されています。 lhaの普及と実行時に目にする文字列から「圧縮/解凍」という言い方が広まったというのは まぁそうかもねと思います。
ところで奥村晴彦氏のTwitterコメントの引用に「「解凍」はLHAより古くからパソコン通信で広く使われていました」 というのがありました。 氏の「データ圧縮の昔話」 の1988年当時の書き込みに「...ishとpkxarcで解凍し...」と記されている事から そうだったのかと思った次第。 しかし、pkxarcは Phill Katz氏(参考Wikipedia)が PKZIPを開発する前に作ったソフトウェアだそうで、現在Web検索で手に入るテキストドキュメントも 英語で記されたものしか見つけられませんでした。という事は誰かが アーカイブからファイルを取り出す行為に 日本語の「解凍」をあてたのではないかと推測されます。 日本では電話回線のデータ通信が解禁されたのは 電電公社が民営化された1985年4月1日以降、 PC-VANのサービス開始は1986年4月26日、 NIFTY-Serveのサービス開始は1987年4月15日 という時系列なので、この3年間くらいの間に誰かがあてたのだと考えられるのですが そこまでは調べが付きませんでした。 ただ、大学構内はTCP/IP通信で繋がり始めていた時期とも重なるようなので、 UNIXの tar/compress/uncompress、さらに古い pack を使っていた人がスラングとして「解凍」をあてた可能性もあるかも知れません。 全然関係ありませんが ドラゴンクエストの発売日は 1986年5月27日です。

それにしても、40年くらい前の デジタルデータが存在していた頃の話なのに、 意外と当時の事が判らないものだなぁ?とは思ったりも。

2024/08/09

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

調べ事。うーん?なんか動きが変なのだが なぜそうなるのかが判らない....🤔

2024/08/08

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

宮崎での地震。そういえばTVを点けたら「南海トラフ「巨大地震注意」」って表示されていたので、 どういうこと?と思ったのですが、宮崎での地震が起こったのに関連して、これからさらに起こるかも 知れないから注意せよっていう表示みたい。今回初めて行なわれている情報表示らしい。 ただこれ、目先に起こった余震の情報表示と被ると 訳が分からなくならないかなぁ?

2024/08/07

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

調べ事をして終了。

2024/08/06

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

先日Webを散策していて、viクローンのひとつである Stevie のソースコードがあるというのを知りました(公式)。 Tim Thompson氏が 1987年に Atari ST用に書いたものだったそうです。 ソースコードファイルを見てみたところ、全部で10個、計2755行という規模のようです。 大分小さいと思ったりも。 Cygwinでコンパイルしてみたのですが、Segfaultする実行ファイルが生成されました。 調べてみたところ、静的割り当てされた文字列領域を書き換えるようなコードになっているのが 原因でした。他にも現在のgccでコンパイルすると大量にワーニングが出る為、コンパイル的に ワーニングが出ないようにも 直してみたのですが、なんか思った感じにならなかったり😓。 あれぇ? モードがいくつかあるようですが、入力した文字がそのまま表示されず、 8進数とか16進数で表示されるのですが どういう事だ?
8進数とか16進数で表示されるのはバイナリ編集モード的なものらしいのですが、 ソースコード的には普通のテキスト表示で編集できるモードが無いようにも見えます。 文字テーブルを弄ると意図したテキスト編集の感じにはなるようです。はて....?🤔

ところで、1987年時点だと 個人のPCで動作するような UnixライクOSは Minixくらいしか無いように 思うのですが、何かしらUNIXを知っているか使っていないと Atari STのようなホームコンピュータ用に viクローンを作ろうとならないのでは?とは思ったりも。

2024/08/05

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

調べ事。

2024/08/04

昼頃起床。寝すぎ。

掃除したり。

先日の新しいw3mモードで、buffer-listのオーダーが変わってしまう件。 w3mではウインドウのサイズが変更されたときに自動的に再描画を行なう機能があるようですが、 それを処理する 関数w3m-redisplay-pages-automatically の中で 関数walk-windows を使って 表示されているウインドウを一通り舐める動きを行なっているようです。 このときに ウインドウ表示されているバッファが、バッファリストのオーダー上、 最初の方に上がっているという事のようでした。 この自動再描画を制御するカスタム変数 w3m-redisplay-pages-automatically-p が用意されていて デフォルトは tですが、nilにする事によって バッファリストのオーダーが変わる事は無くなりました。 ウインドウを一つしか開いていない時には問題になる事は無いと思いますが、 複数のウインドウを開いているときに、問題になる事があるのかなと思います。 我が家では常時6個以上のウインドウが表示されている為、「M-x buffer-menu」でバッファ制御しようと する度に バッファオーダーが思っているのと違うと操作対象バッファを間違えるので、 残念ながら「(setq w3m-redisplay-pages-automatically-p nil)」で自動再描画機能は 封印する方向で対応しました。

ASSEMBLY SUMMER'24 の表彰式を見られました。「AI WILD」なんてのがあったらしい。ほぅ...。

2024/08/03

昼頃起床。寝すぎ。

そういえば、Windows10を使っていて、ここ1年くらいの間に マウスカーソルを見失う事がよくあるなぁ? と感じていました。この為、マウスポインターの設定で「ポインターの軌跡を表示する」などを 使うようになっていたのですが、それでも見失うときは見失うのでなんでだ?と思っていました。 で、今日よく見るとマウスカーソルを動かしていない時に表示されていない期間があり、 このときに見失ってしまうのではないか?と思った次第。 何を契機に非表示になっているのか判りませんが、ついさっきまで表示されていたものが消えて しまうと見失うよなぁとは思ったりも。
マウスポインターのサイズを変更できるようなので 1だったを2にしてみたのですが、大きくなると 同時にマウスカーソルが非表示にならなくなったような気が🤔。 「大きくしたところで非表示になったらやっぱり見失うだろう」ってのを確かめたかったのですが、 これでは「大きくしたら見失いにくくなった」と勘違いしてしまうじゃん?と思ったりも。 ともかく、サイズ2でしばらく使ってみる事にしよう。

何気にEmacsの w3mパケージの新しいのを入れてみた(w3m-20131203.1429→w3m-20240712.248)のですが、 org-modeで出力したHTMLファイル表示がイマイチな感じに思ったり。 よく見ると特定のファイルで読み込み時にエラーしていてそれが原因の模様。 文字コードが解釈できていない?
次のようなことが起こっているみたい。 org-modeでHTMLにエクスポートするとき、見出し(*や**など)に応じて目次を自動生成する事ができます。 このとき、見出しに日本語文字を使っていると 目次のリンク用URLは「<a href="#日本語文字">1. 日本語文字</a>」みたいな タグが生成されます。ところが、新しいw3mでは URLに日本語文字を含んでいると エラーになる場合があるようです。もう少し調べてみると、file-exists-pという関数が エラーするみたい。 例えば「(file-exists-p (w3m-url-decode-string "file:///emacs.html#一"))」のようなのが ダメで、「一」を「二」にすると大丈夫だったりするようです。なにこれ?🤔
どうやら「(file-exists-p (w3m-url-decode-string "file:///emacs.html#一" 'utf-16))」 ならば大丈夫そうで、カスタム変数 w3m-file-name-coding-system を 「(setq w3m-file-name-coding-system 'utf-16)」にすればうまく表示できるようになりました。 デフォルト設定では

;w3m.el内
(defcustom w3m-file-name-coding-system
  (if (memq system-type '(windows-nt OS/2 emx))
      'shift_jis 'euc-japan)
  "Coding system used to convert pathnames when emacs-w3m accesses files."
  :group 'w3m
  :type 'coding-system)

みたいになっていて、今のご時世 これはどうなんだ?とは思ったりもしましたが、 ともあれ、設定を変えれば大丈夫なのでひとまずOK。 一つ気になるのは w3m-20131203.1429のと比べて変わっていない所に見える事。 実際に古いのでは特に設定しなくてもやっぱり大丈夫でした。なんだろう?🤔
そういえば eww では Emacsのフレームサイズよりも画像の幅が大きい場合は縮小して表示する 機能が追加されていますが、w3mは元画像サイズのまま表示します。 zoom-outコマンドはあるのですが、自動的に縮小してくれないかなぁ?とは思ったりも。 便利な状況に慣れると堕落しますね😓。

新しいw3mモード(w3m-20240712.248)を使っていて、いくつか気になった所があるので覚書。


今更なのですが、Emacsのimage-modeで使用できる image-crop([i c]にバインドされている)って、 メニューバーにエントリされていないのかと思ったり。 image-modeで キーバインドの一覧を表示した時にかろうじて 何これ?って気づく可能性がある感じかも。 てか 存在に気づかれていないように思ったりも。

2024/08/02

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

そういえば、メガデモパーティーの ASSEMBLY SUMMER'24 が 始まってるみたい。イベントの規模も戻っている感じがします。

2024/08/01

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

Web巡回して終了。


TOP PREV