more vim

Arch Linuxの肥大化防止

Archを入れて1月が経過した。dfすると順調に太っている。肥満は体によくないSDDにもよくない。で、ダイエットです。

肥大化の原因は分っている。もしもの為って亊で、pacmanで更新したパッケージがキャッシュされ続けてしまうため。現状を確認。

[sakae@arch pacman]$ du -s pkg/
2712924 pkg/
[sakae@arch pacman]$ ls pkg/*.zst | wc -l
511

キャッシュの内容の一部。ちょっとづつ古いものも、大事に取ってあるんだ。

-rw-r--r-- 1 root root  13630192 Jun 12 01:25 qt5-base-5.15.4+kde+r168-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root  13630798 Jun 19 19:50 qt5-base-5.15.5+kde+r163-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root  13634191 Jun 30 16:10 qt5-base-5.15.5+kde+r166-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root  13633636 Jul  4 19:50 qt5-base-5.15.5+kde+r167-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 root root  13634074 Jul  6 06:50 qt5-base-5.15.5+kde+r170-1-x86_64.pkg.tar.zst

ええい、ダイエット実施

[sakae@arch ~]$ sudo pacman -Sc
Packages to keep:
  All locally installed packages

Cache directory: /var/cache/pacman/pkg/
:: Do you want to remove all other packages from cache? [Y/n] y
removing old packages from cache...

Database directory: /var/lib/pacman/
:: Do you want to remove unused repositories? [Y/n] y
removing unused sync repositories...

これで、どのぐらいになったんだろう。期待の確認。

[sakae@arch pacman]$ du -s pkg/
1005508 pkg/
[sakae@arch pacman]$ ls pkg/*zst | wc -l
414

月に一度ぐらいは、実施せいという亊だな。

ed

前回はOpenBSDのedを紙上?追跡してみた。でも、やっぱり生態解剖したい。要になるのは、ed.hに定義されてる、下記の構造体だ。一行を表す双方向のリンクリストだ。何故、双方向かは、素早く必要な場所に辿りつくため。データとしては、どこかに有るバッファーの先頭からの位置(seek)とその長さだ。

こうしておけば、何処かにあるバッファーは、メモリー上でもいいし、追記出来るファイルでもよい。行が編集されて内容が変っても、それを書き換えず、新しい行の内容を追記し、それを指し示すように、 line_t を変更するだけだ。

インメモリーで管理しなきゃいけないのは、この line_t の連なりだけなんで、メモリーを有効利用出来、より大きなファイルを扱えるようになる。

/* Line node */
typedef struct  line {
        struct line     *q_forw;
        struct line     *q_back;
        off_t           seek;           /* address of line in scratch buffer */
        int             len;            /* length of line */
} line_t;
,n
1       A
2       BC
3       DEF
4       GHIJ

こんなデータを用意しておいて、行の表現を追跡してみた。

Breakpoint 2, display_lines (from=1, to=4, gflag=8) at main.c:1221
1221            if (!from) {
(gdb) n
1225            ep = get_addressed_line_node(INC_MOD(to, addr_last));
(gdb)
1226            bp = get_addressed_line_node(from);
(gdb)
1227            for (; bp != ep; bp = bp->q_forw) {
(gdb) p bp
$8 = (line_t *) 0x6d424f40
(gdb) p *$
$9 = {q_forw = 0x6d43c860, q_back = 0x34a0d278 <buffer_head>, seek = 0, len = 1}
(gdb) p *$.q_forw
$10 = {q_forw = 0x6d43c640, q_back = 0x6d424f40, seek = 1, len = 2}
(gdb)
$11 = {q_forw = 0x6d4566e0, q_back = 0x6d43c860, seek = 3, len = 3}
(gdb)
$12 = {q_forw = 0x34a0d278 <buffer_head>, q_back = 0x6d43c640, seek = 6, len = 4}
(gdb)
$13 = {q_forw = 0x6d424f40, q_back = 0x6d4566e0, seek = 0, len = 0}
(gdb) p *$.q_back
$14 = {q_forw = 0x34a0d278 <buffer_head>, q_back = 0x6d43c640, seek = 6, len = 4}
(gdb)
$15 = {q_forw = 0x6d4566e0, q_back = 0x6d43c860, seek = 3, len = 3}
(gdb)
$16 = {q_forw = 0x6d43c640, q_back = 0x6d424f40, seek = 1, len = 2}
(gdb)
$17 = {q_forw = 0x6d43c860, q_back = 0x34a0d278 <buffer_head>, seek = 0, len = 1}

nvimの成分分析

前回やったneovimことnvimの成分がどうなってるか、調べてみる。成分分析表は、lddで得られる。下記は、arch linuxに入れたやつ。

[sakae@arch ~]$ ldd /usr/bin/nvim
        linux-vdso.so.1 (0x00007fffd6327000)
        libluv.so.1 => /usr/lib/libluv.so.1 (0x00007fadca577000)
        libuv.so.1 => /usr/lib/libuv.so.1 (0x00007fadc91ce000)
        libmsgpackc.so.2 => /usr/lib/libmsgpackc.so.2 (0x00007fadca56d000)
        libvterm.so.0 => /usr/lib/libvterm01/libvterm.so.0 (0x00007fadc91bc000)
        libtermkey.so.1 => /usr/lib/libtermkey.so.1 (0x00007fadca561000)
        libunibilium.so.4 => /usr/lib/libunibilium.so.4 (0x00007fadc91a7000)
        libtree-sitter.so.0 => /usr/lib/libtree-sitter.so.0 (0x00007fadc9178000)
        libm.so.6 => /usr/lib/libm.so.6 (0x00007fadc9091000)
        libluajit-5.1.so.2 => /usr/lib/libluajit-5.1.so.2 (0x00007fadc9001000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fadc8fe1000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007fadc8c00000)
        libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fadc8fdc000)
        libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fadc8fd5000)
        /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fadca5b6000)

debianとかだと、libのエリアが64,32bit用に分離されてて煩わしいけど、archはすっきりだ。64bitしか許容しないんで、分る必要が無いんだね。

で、これらのlibがどんな働きをするものか、どうやって調べる? ウーンと唸って辿り付いた方法が、OpenBSDのportsのMakefileを眺める亊。一体、どんなロジックでそんな発想になる? 全く関係ないだろう。

この間、NHKで始まった、数学なんちゃらって番組で素数が採り上げられていた。素数が哀られる間隔に数学的な根拠があるのか? 数学の学者が頭を悩ましていた問題。考え過ぎて人生をぼうに振ってしまった人がいるらしい。

で、どうやらこうでないかいと言う式が建られた。知の殿堂のある研究所で、たまたま物理学者とその数学者が雑談。素数の間隔は、こんな式で表わせそうって数学者。物理学者は、その式を見て、あれ、この式、原子核のエネルギー順位を表す式と一緒じゃん。別の業界の話も聞いてみるものだ。

で、話を戻して、Makefile内の一節

LIB_DEPENDS =           devel/gettext,-runtime \
                        devel/libtermkey \
                        devel/libuv \
                        devel/libvterm \
                        devel/msgpack \
                        devel/unibilium \
                        textproc/tree-sitter

これの何が嬉しい? 例えば、tree-sitterに何様って調べたい。ならば、

ob$ cat /usr/ports/textproc/tree-sitter/pkg/DESCR
Tree-sitter is a parser generator tool and an incremental parsing library. It
can build a concrete syntax tree for a source file and efficiently update the
syntax tree as the source file is edited.

Tree-sitter aims to be:

  General enough to parse any programming language
  Fast enough to parse on every keystroke in a text editor
  Robust enough to provide useful results even in the presence of syntax errors
  Dependency-free so that the runtime library (which is written in pure C) can
  be embedded in any application

editorの癖にパーサーが必要って、オイラー的にはイカレてると思うぞ。典型的な、なんでも症候群のような気がする。まあ、中の人に言わせると、色を付けるとか構文の間違いを簡単に指摘出来るでしょ、って亊になるのかな。

もう一例、msgpackって何者ぞ?

ob$ cat /usr/ports/devel/msgpack/pkg/DESCR
MessagePack is an efficient binary serialization format, which lets you
exchange data among multiple languages like JSON, except that it's
faster and smaller. Small integers are encoded into a single byte while
typical short strings require only one extra byte in addition to the
strings themselves.

多分、外部アプリと通信を素早くやりたい為の部品集なのでしょう。マイクロソフトご提案の 、ランゲッジ・サーバーあたりと通信して、補完をしたいなんて場合、速やかにデータ交換が必要。

こんな調子で、異OSと交流すると、良い亊があるよって例でした。こんな亊、debianだけで、簡単に調べる方法って有るのだろうか? 多分、難解なパッケージのインフォメーションでも紐解く必要が有るんだろうね。

apt (list|show)

忘れないうちに調べてみた。apt listを使って、パッケージ名を割り出す。apt listの代わりに、apt-file search hogeでもいいのかな。

sakae@pen:~$ apt list --installed|grep libuv

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libuv1/stable,now 1.40.0-2 amd64 [installed,automatic]

次に、そのパッケージの詳細を確認するとな。

sakae@pen:~$ apt show libuv1
  :
Description: asynchronous event notification library - runtime library
 Libuv is the asynchronous library behind Node.js. Very similar to libevent or
 libev, it provides the main elements for event driven systems: watching and
 waiting for availability in a set of sockets, and some other events like timers
 or asynchronous messages. However, libuv also comes with some other extras
 like:

vim + gdb

【Vim8.1.xから標準機能】VimからGDBを起動する方法

6. デバッグ by vim-jp

pdbはどうするんだとか、あるけど、まあ目出度い亊だ。Debianが入ってるThinkPad SL510だと、コンソールで使うと stty -a で48x170 となってた。

これだけ広ければ、左上にgdb、左下にアプリ用のコンソール、右側でソース表示っていう、憧れの環境を楽しめる。

vim on OpenBSD

遂にOpenBSDにもvimを入れる亊にした。今迄emacs一本槍だったけど、利用方法を思い出すと、tagさーチとgdbの利用、それにファイル閲覧ぐらいしか使っていなかったから。このどれもvimで代用出来る亊を知った今、セカンド・オピニオンって亊でね。

vim-8.2.4600-gtk3-lua.tgz                    2022-04-11 8.9M
vim-8.2.4600-gtk3-perl-python3-ruby.tgz      2022-04-11 9.0M
vim-8.2.4600-gtk3-python3.tgz                2022-04-11 8.9M
vim-8.2.4600-gtk3.tgz                        2022-04-11 8.8M
vim-8.2.4600-no_x11-lua.tgz                  2022-04-11 8.7M
vim-8.2.4600-no_x11-perl-python3-ruby.tgz    2022-04-11 8.9M
vim-8.2.4600-no_x11-python3.tgz              2022-04-11 8.7M
vim-8.2.4600-no_x11-ruby.tgz                 2022-04-11 8.9M
vim-8.2.4600-no_x11.tgz                      2022-04-11 8.7M

こんなのが用意されたので、言語無し、x11無しっていう軽いやつを選んだ。 知らないライブラリーが使われていた。libsodiumですって。早速調べてみる。

vbox$ cat /usr/ports/security/libsodium/pkg/DESCR
NaCl (pronounced "salt") is a new easy-to-use high-speed software library
for network communication, encryption, decryption, signatures, etc.
NaCl's goal is to provide all of the core operations needed to build
higher-level cryptographic tools.

Sodium is a fork of NaCl with a compatible API. Unlike NaCl, Sodium
performs checks for hardware features at runtime instead of compile time,
making it suitable for packaging.

NaClっていう化学式で表されるやつがあったとな。世間一般には、塩ってやつだ。それが分離したんか、だったらMgClぐらいにしとけと思うのはオイラーだけ。ああ、MgClって、にがりの亊ね。これなしでは豆腐を作れないぞ。日本人にお馴染だ。これなら愛着がわくのに。

vimrc

設定の変更 って亊で、vimrcのお手軽設定方法が紹介されてる。けど、オイラーはあえて、自分に必要なものを付け足す亊にした。こうしておけば、不便を感じたら自分で調べるでしょ。そこから、新な知見が得られると思うから。で、下記は、そのスタート台です。

vbox$ cat .vim/vimrc
set background=dark
syntax on

packadd termdebug
let g:termdebug_wide = 126
set mouse=a

gdbの3窓を左右に分るには、上記のwide設定が必要。これが無いと、上中下に窓が出来てしまう。

単純なvimでも、ちゃんとマウスが使えた。そんなものなのか。プチ感激してるぞ。上の窓の横幅は、PuTTYを目一杯拡げた時のサイズ。これでも、何とか使えた。

tag jump

emacsを使ってOpenBSDカーネルの観光をする時に、無理してemacs用のTAGを作った。デフォでは、下記のようにctags用になってるんだけどね。で、出来たサイズが150Mを越えてたんで、emacsから注意を受けたんだ。

vimでやったらどうなる?

vbox$ cd /sys/arch/i386/
vbox$ cat Makefile
 :
tags::
        TDIR=`mktemp -d /tmp/_tagXXXXXXXXXX` || exit 1; \
        eval "S=${S}" && \
        config -s ${S} -b $${TDIR} ${.CURDIR}/conf/${KFILE} && \
        eval "_arch=\"`make -V _arch -f $${TDIR}/Makefile`\"" && \
        eval "_mach=\"`make -V _mach -f $${TDIR}/Makefile`\"" && \
        eval "_machdir=\$S/arch/$${_mach}" && \
        eval "_archdir=\$S/arch/$${_arch}" && \
        eval "HFILES=\"`find $S \( -path $S/'arch' -o -path $S/stand -o -path $S/lib/libsa -o -path $S'/lib/libkern/arch' \) -prune -o -name '*.h'; find $${_machdir} $${_archdir} $S/lib/libkern/arch/$${_mach} \( -name boot -o -name stand \) -prune -o -name '*.h'`\"" && \
        eval "SFILES=\"`make -V SFILES -f $${TDIR}/Makefile`\"" && \
        eval "CFILES=\"`make -V CFILES -f $${TDIR}/Makefile`\"" && \
        eval "AFILES=\"`make -V AFILES -f $${TDIR}/Makefile`\"" && \
        ctags -wd -f ${TAGS} $${CFILES} $${HFILES} && \
        egrep "^[_A-Z]*ENTRY[_A-Z]*\(.*\)" $${SFILES} $${AFILES} | \
            sed "s;\\([^:]*\\):\\([^(]*\\)(\\([^, )]*\\)\\(.*\\);\\3    \\1    /^\\2(\\3\\4$$/;" \
            >> ${TAGS} && \
        sort -o ${TAGS} ${TAGS} && \
        rm -rf $${TDIR}

アーキテクチャそれぞれ用にMakefileが用意される。取り敢えずi386のそれを作ってみた。

vbox$ ls -lh tags
-rw-r--r--  1 root  wheel   206M Jul 21 06:26 tags
vbox$ wc tags
 1263822 5814165 216266929 tags

200Mを越えてる。ctags -d で、#define部分も丁寧に取り込んでいるからだな。

:tags
  # TO tag         FROM line  in file/text
  1  1 sys_open            1  /sys/arch/i386/../../kern/vfs_syscalls.c
  2  1 proc             1048  /sys/arch/i386/../../kern/vfs_syscalls.c
  3  1 TAILQ_EMPTY       308  /sys/arch/i386/../../sys/proc.h

ちょいと使ってみた。tagsを開く時、文句を言われるでなし、さっと開いてくれた。動作もキビキビしてて、気持がよいぞ。

develop with vim

vimを使った開発はどうやれば良い? 少し探ってみた。

まずは、manの参照。調べたい所にカーソルを持って行ってKだ。セクションを指定して調べる時は、5Kとか、セクション番号を前置すればよい。

次はヘッダーファイルの参照。やはりカーソルを持って行って、gf だ。終了は、Ctl-O。

素早くカーソルを移動するには、サーチ機能、/hoge する。目的ワードに達していなかったら、nして、次を探せばよい。なお、カーソルのある所を取り込んで、次をさがす時は、* してからnすればよい。一旦取り込んでしまえば、N で、ファイルの頭に向ってさがすのも有り。

更に、:makeと組み合わせて、コンパイル実行。エラーが発生したら、:copenしろ。そして、エラーを修整しろなんてのが指南されてた。詳細は、 Vimをプログラム開発環境にしてしまおう

vim vs emacs

ここまで、emacsな人がvimを使ってきたんで、使い心地の感想を述べておく。勿論、個人の偏見に満ちたものだから、鵜呑みにしないように。

file viewer

結論を言うと、emacsのdired.elの方が便利。ってか、慣れている。特典は、vでファイルを開いた時、画面の移動が、スペースとバックスペースだけで濟んでしまう亊。Ctl-F, Ctl-B みたいな面倒が無いのがよい。正直、この利点は譲れないです。

ああvimの名誉の為に言うね。"$VIMRUNTIME/macros/less.sh" のが用意されてる。適当な所に取出しておいて、./less.sh hoge.txt なんてやると、vim scriptのlessが動く。けど、これのお世話にはならないだろう。

lessからviが呼び出せる。なら、vimから純正のlessを呼び出せていいと思うんだけど、我侭かな。

with gdb

どちらかと言うとvimの方が便利。利点は3つの窓が一望出来る亊。窓間の移動にキー操作だけでなくマウスが使えるのが良い。

emacsでやると、debug対象の画面が増えてしまい鬱陶しい。それを嫌って、対象を別コンソールで起ち上げ、gdbをアタッチしてた。これで、emacs画面は、gdbとソースだけには成る。但しこの方法だと、対象が定常状態になった以降しか観光出来無い。vimだとそれが無い。

但し、カーネル観光の場合は、3つの窓を開いてしまう vim系は逆に不便。今迄通りにemacsからのgdbで良い。

tag jump

甲乙つけがたいけど、vimのそれのTAG補完が出来るのが、何気に嬉しいかな。それに、OpenBSDでは、デフォでctagsを採用してるからね。

help

ぐぐっても、プラグインどーたらが目立つ。それ以前を知りたいのよ。公式のマニュアルもいいけど、こちらがお勧めだ。 ヘルプの起動/終了

vimにしろemacsにしろ、存分に使いこなすにはキーバインドが指にしみつくようになるべき、と思っていたら、Emacsのコマンドやキーバンドは別に覚えなくてもいい こういうのもあるのね。

vimだと、:help index が、相当するな。

dataset for AI

とあるサイトを見てたらAI道場用にサンプルデータの事典が掲載されてた。今週は、 Diabetes Dataset:糖尿病(年齢/血圧/血糖値などの10項目)の表形式データセット こんなデータだった。

猫も杓子もpythonって亊で、それ用の扱いが示されていたけど、Rでもいいんでないかい。 提供元へ行って、データをみたら、タブ区切のASCIIデータだった。

これなら、どうにでもなるな。年齢、BMI、平均血圧、諸血清データ、血糖値、最後は一年後の糖尿病進行度とかみたい。

オイラーが理解出来るのは血圧ぐらいだな、ってんで見ていくと、やけに値が低いぞ。平均ってのが味噌っぽい。最高血圧と最低血圧を足して2で割ったものでもなさそう。

そうすると、血圧を積分して、それを時間で割ったものなのかなあ。

scikit-learnで糖尿病データの回帰分析をやってみた

scikit-learnの糖尿病のデータセットで機械学習【回帰】

線形回帰モデル:診察データから1年後の糖尿病の進行度を予測する【Python】

scikit-learn 糖尿病患者データセットを使った「重回帰分析」

【scikit-learn】ライブラリ付属のデータセットまとめ – 概要、使い方を解説

AIの理解に必須!基礎から学ぶ機械学習 日経さんもやってた


This year's Index

Home