AM中に起床。
EmacsのIMEパッチと「Copilot Keyboard」の組み合わせで長い文を入力するとスローダウンする件を
少し調べてみたのですが当たりは付かず。
そんな訳で今年を振り返り。
AM中に起床。
AI連携した日本語変換って無いのだっけ?と思って検索していたところ、
「Copilot Keyboard」なるものがストアアプリにあるというのを知り少し試してみたり。
結果から言うと変換自体の性能についてはよくわからず。そちらよりも入力ミスを修正するエディタ機能の
ほうがイマイチで、途中で間違えていた部分を変換確定せずに入力し直す方法がわかりませんでした。
また、間違った変換をうっかり確定させてしまった場合に、それを削除する手段もまだ機能していないようです。
あと、EmacsのIMEパッチに原因がありそうですが、40文字程度のひらがな原文を入力したところで
異常に動作が遅くなります。メモ帳ではそんなことにはならないようなので、原因を調べてみる必要が
あるかもしれません。
パルコのパプリカのコラボCM。なぜパプリカ?と思ったのですが色々あるっぽい。
公開20周年で4Kリマスターでリバイバル上映されるというのも関係があるみたい。
PS3とFullHDのディスプレイを買った直後にBlu-Rayソフトとして買って観たのも
それくらい前かと思ったりも。
監督の今敏氏は2010年に亡くなられた(以前のメモ)のですが、
作品は残り続けるだろうと思います。
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の実装の事を問わなければ「そんな訳ないでしょ?」
と思ったりも。短く区切ると文脈が分からないので単語だけで変換したときの誤変換は増えると思います。
ただし実際に「文脈を読み取っていれば」ですが。
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
(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
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)))
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(-)
テレワーク。早めに終了。
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>」です。」
と判断しているみたいです。
元の文書も マウス操作についてのセクションがある割にはそこには選択については記されておらず、
矩形のセクションに取ってつけたような文言でマウスの矩形選択操作が記されているわで、
やっぱ元の文書も分かりにくいのかなぁ?と思わなくもありません。
テレワーク。早めに終了。
Web巡回して終了。
テレワーク。早めに終了。
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();
}
テレワーク。早めに終了。
調べごとをして終了。
テレワーク。早めに終了。
H3ロケット8号機の打ち上げ失敗。同じ型の3,4,5号機は成功していたようですが
今回は何か違ったのだろうか?
そういえば以前 gptel+Ollama+oss:20b で矩形選択の
方法を聞いても全然ダメなのが返ってきていたのですが、GoogleのAIモードだとどうだろう?
と思い聞いてみたところ、イケてる回答が返ってきました。
定点観測している「least」のGoogle翻訳。前回は2021年4月
(それより前は
2019年3月,
2016年9月)
ですが、「いらばん少ない」は変わらず。

辞書の改訂はしていないのだろうなと思えます。
AM中に起床。
掃除したり洗濯したり。
ちょろり実験コーディング。
AM中に起床。通院。
VirtualBoxのFedoraでvncserverの起動。
どうにもならなかったので、Xfceというデスクトップ環境
をインストールしてそちらを立ち上げてみることにしたり。でもやっぱりVNCで繋がるものの黒い画面だったのですが、
VirtualBox画面のgnomeデスクトップの方にXfceのメニューバーなどが表示されているという謎な状況になっていたり。
よく分かりませんが、VirtualBox画面ではログインせず vncserverを起動すれば 黒い画面ではなくデスクトップが
表示されました。でも、VNCで表示できている状態で VirtualBox画面でgnomeデスクトップにログインした後、
VNCのXfce側でターミナルアプリを起動するとVNC側ではなくVirtualBox画面側のgnomeデスクトップに
起動したターミナルウインドウが表示されるという謎な状況になりました。
ディスプレイは :0 と :1 で別になっていそうなのですが、表示がめちゃくちゃになっています。なんだこれ?🤔
テレワーク。早めに終了。
気づいてませんでしたがGIMPの3.2RC2が出ている模様
(アナウンス)。
VirtualBoxのFedoraでvncserverを起動して UltraVNCで接続しようとしたのですが繋がらず。
vncserverの起動で実行される xstartupスクリプト の中で /etc/X11/xinit/xinitrc がコアダンプしてる模様。
なんで? gnome-session を実行するように書き換えてみたところ、こちらもエラーが発生していて、
接続はできるのですがウインドウマネージャが無い状態になってて用事にならず。
旧PCで試した時は記憶に残っていないくらい問題なくデスクトップに接続できていたような気がするのですが?🤔
テレワーク。気持ち早めに終了。
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」は同じじゃないのか?🤔
テレワーク。早めに終了。
Web巡回して終了。
テレワーク。早めに終了。
Ollama+gpt-oss-safeguard:120b+gptel で生成させたD言語のコードの中に
bool[][] visited = new bool[][maze_height]; foreach (i; 0 .. maze_height) visited[i] = new bool[maze_width];
bool[][] visited ; visited.length=maze_height; foreach (i; 0 .. maze_height) visited[i].length=maze_width;

テレワーク。気持ち早めに終了。
Web巡回して終了。
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) {
^
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);
});
$ 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
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);
});
テレワーク。早くもなく遅くもなく終了。
Ollama+qwen3-vl:30b+gptel でいくつか円が描かれた画像を示して、何個の円が描かれているかを数えさせてみたのですが、
数え間違えることの方が多いなぁ?と思ったり。

「この画像には何個の円が描かれていますか?注意深く数えてください。」と記したところ「11個」という
回答でした。正解は16個です。左下に小さな円が描かれているのですが、人間だと見逃す感じかも知れません😅。
が、機械なのでそれを見逃さないのを期待したいところです。
テレワーク。早くもなく遅くもなく終了。
なぜかまたデスクトップPCのFrimwareアップデートが来ていたり。
前回入れたのは11月末頃だったのですが、そういえば
それより前のアップデートは失敗していたので、もしかするとアップデートに失敗していなければ、
こんなに高頻度でアップデートが来る訳ではなかったのかも?と思ったりも。判りませんけど。
よく分かりませんがGitHubが死んでる?
テレワーク。早めに終了。
Web散策していて知った
「第2回 1986年のCOM VS 2023年のAI 「オセロ」 COM後手編 1986 COM VS 2023 AI Othello」
という動画。AIオセロの方はどういうアプリなんだ?とは思ったりも。
テレワーク。早めに終了。
Web巡回して終了。
本日休業。AM中に起床。
掃除したり洗濯したり。
ちょろりお出かけ。思わず文具を購入。
そういえばいわゆる「つけペン」のペン先ってあるかなぁ?と思って近くの比較的大型の
文具店を見てみました。以前、一点物の「ガラスペン」の存在を知り、
その後、文具店で時々見ていると一時的にガラスペンブームがあったのですが、ついでに万年筆タイプのペンも
置かれている感じはあったものの、つけペンはその並びには無いなぁ?
と思ってました。で、今日なにげに見てみると つけペンのセットやペン先が置かれていて、
なんで?と思いながら試しに購入してみました。「カブラペン」の3本入りと「Gペン」の3本入りを
買ってみたのですが、各572円(税込み)でした。1本50円くらいだった記憶しかなかったものですから、
おぅ.....と思ったのは秘密。
引き出しの奥にしまってあった、随分前(多分27年くらい前)に買った「証券用インク」に値札が付いていて
450円って書かれていました。しかし35年くらい前には300円くらいで買えていたので「高くなったなぁ....」と
思ったのですが、現在は税込みで715円らしいのでやっぱり高くなってるなぁとは思ったりも。
致し方なしかも知れません。インクを検索していると
こちら
のような350mlの詰め替え用みたいな商品があるのを知ったり。ほぅ....。製図用だけで証券用のは無いみたい。
そういやPILOTのページでは日本語表記が「インキ」ってなってるな。
どうやら「インク」は英語のinkのカタカナ読みで、「インキ」はオランダ語のinktのカタカナ読みが由来らしい。
粘度の違いで使い分ける場合があるようですが、一般的には「インク」を使う場合が多く、
印刷業界では「インキ」を使う場合があるという感じみたいです。知りませんでした。
帰省から帰着。
全然関係ない流れで セガの「OutRun」が映画化されるらしいのを知ったり
(参考)。
どういう感じになるのか全く想像がつきません。
AM中に起床。
ちょろり帰省。
テレワーク。早めに終了。
調べごとをして終了。
テレワーク。早めに終了。
Web巡回して終了。
テレワーク。早めに終了。
調べごとをして終了。
テレワーク。早めに終了。
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);
テレワーク。早めに終了。
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;
}
| 言語 | コンパイラバージョン | コンパイルオプション | コンパイルメッセージ | 実行表示結果 | |------+----------------------+----------------------+------------------------------------------------------------------------------------+--------------| | 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 |
| 言語 | コンパイラバージョン | コンパイルオプション | コンパイルメッセージ | 実行表示結果 | |------+----------------------+----------------------+--------------------------------------------------------------------------------------+--------------| | 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 |