vi vs. emacs
Table of Contents
医療費控除
今年も確定申告の季節がやってきた。今回は、医療費控除の申告が必要なんで、 それってどうやるの?
Excel無いんですけどと案内を見ていったら、LibreOffice{7.5, 7.6} でも許してもらえるみたい。
Downlod LibreOffice こだわりなんて微塵にも無いので 7.6.4 にした。 最初、そりゃDebianでと思ったけど、フォント問題とか有りそうなんで却下で すよ。
DL SIZE: 353M, Install SIZE: 755M だった。
どんな項目を入力するの? ファイルを開いてみた。項目が横に長いな。一画 面に収まらないじゃん。こんな糞みたいな奴に入力するって、オイラー的には 耐えられん。女房に任せてしまうか。
それとも、マクロを作って、一項目を入力するフォームにするか。そう、昔々 に使った事があるFileMakerみたいな画面ね。
それにしてもEXCEL方言な象形文字(アイコンの事ね)のオンパレードには、追 従出来ませんです。毎日使っていると覚えちゃうんだろうけど。
iryouhi_form_v3.xlsx
現実逃避です。まずは外観だな。
ob$ ls -sk iryouhi_form_v3.xlsx 63 iryouhi_form_v3.xlsx ob$ file iryouhi_form_v3.xlsx iryouhi_form_v3.xlsx: Zip archive data, at least v2.0 to extract
展開してやる。ファイル類がちらばるんで、後で一遍に削除できる様に、適当 なdirで行なう事。
ob$ unzip iryouhi_form_v3.xlsx ob$ tree . |-- [Content_Types].xml |-- _rels |-- docProps | |-- app.xml | `-- core.xml |-- iryouhi_form_v3.xlsx `-- xl |-- _rels | `-- workbook.xml.rels |-- calcChain.xml |-- printerSettings | |-- printerSettings1.bin | `-- printerSettings2.bin |-- sharedStrings.xml |-- styles.xml |-- theme | `-- theme1.xml |-- workbook.xml `-- worksheets |-- _rels | |-- sheet1.xml.rels | `-- sheet2.xml.rels |-- sheet1.xml `-- sheet2.xml
xmlなファイルは、勿論UTF-8だったよ。シートが2枚になってるけど、説明書 になってた。細密充填のxmlファイルを開いてみると、MS P ゴシック なんて のがチラホラ。Debianとかだと、どう解釈されるのかな。桑原桑原。
あれ? 提出はどうするん?
確定申告作成コーナーの入力画面で読み込む事で反映される、ってさ。印刷範 囲なんて書いてあるって事は、画面dumpな証拠も必要なんだな。PDFにして、 コンビニへgoか。
getloadavg
前回の、getloadavgが、どうなっているかgdbで追求。
/usr/src/lib/libc/gen/getloadavg.c
getloadavg(double loadavg[], int nelem) { struct loadavg loadinfo; B const int mib[2] = { CTL_VM, VM_LOADAVG }; int i; size_t size; size = sizeof(loadinfo); if (sysctl(mib, 2, &loadinfo, &size, NULL, 0) == -1) return (-1); => nelem = MINIMUM(nelem, sizeof(loadinfo.ldavg) / sizeof(fixpt_t)); for (i = 0; i < nelem; i++) loadavg[i] = (double) loadinfo.ldavg[i] / loadinfo.fscale; return (nelem); }
こちらが、生データ。言わゆる、カーネルからの直送データになります。
(gdb) p loadinfo $1 = {ldavg = {1049, 1084, 860}, fscale = 2048}
失敗した
河豚板からgitを使おうとしたら、
fug$ git clone https://github.com/ykaw/PiCW.git ksh: git: not found
そんなの無いと。母艦に入れたのを思い出したんで、マウント。
fug$ /ram/opt/Elocal/bin/git clone https://github.com/ykaw/PiCW.git Cloning into 'PiCW'... warning: templates not found in /usr/local/share/git-core/templates fatal: unable to find remote helper for 'https' fug$ PATH=$PATH:/ram/opt/Elocal/bin fug$ git clone https://github.com/ykaw/PiCW.git Cloning into 'PiCW'... warning: templates not found in /usr/local/share/git-core/templates git: 'remote-https' is not a git command. See 'git --help'.
最初は絶対パスでアクセス。文句を言われたので、パスに登録するも、エラー。 密かに恐れていた事が露見した(emacsのTAGS問題で兆候はキャッチしていたけ ど)。
さあ、どうする? 取りあえず、母艦の /usr をマウントしてみるか。
fug$ ls /ram/opt/Dusr/ X11R6/ games/ lib/ libexec/ mdec/ ports/ share/ xobj/ bin/ include/ libdata/ local/ obj/ sbin/ src/ fug$ ls /ram/opt/Dusr/local/
ちゃんと任意インストールのportsは有るんだけど、期待のlocalは中身が空。 そりゃそうだ。母艦で起動させた時、/etc/rcがfstabを参照して、マウントす るのだった。だから、もぬけの空があたり前。gitだとかgnuplotやRみたいな 重量級は、母艦で使えが正しいんだな。
悪あがき
せめて、母艦の/usrだけでも河豚板から使えないか?
fug$ ls -L /bin [* cpio* ed* ls* pwd* sha512* cat* csh* eject* md5* rksh* sleep* chgrp* date* expr* mkdir* rm* stty* chio* dd* hostname* mt* rmdir* sync* chmod* df* kill* mv* sh* tar* cksum* domainname* ksh* pax* sha1* test* cp* echo* ln* ps* sha256*
これが基本の基。doasは/usr/bin/に有るので使えないな。よって su を使う。
fug$ su - Password: fug# mount /dev/sd0d /ram/opt/Dusr/ fug# cd / fug# rm usr fug# ln -s /ram/opt/Dusr usr
これで、一見良さそうなんだけど、emacsが行方不明。これも当然の報いだな。 emacsはパッケージなんで、/usr/local/binの中なんだけど、母艦の /usr/localは空だもの。
だったら、母艦のlocalを母艦の/usrにマウントすればOK. 上のセッションに チョイ足しして、台本(スクリプト)を作成。どこかに転がしておけば良い。 河豚起動時からと言う要望なら、/etc/rc.localに展開だな。 でも、そこまでやったら、河豚じゃ無くなっちゃう。
そうそう、上のセッション見てて、rm usrは無駄。その代わり ln -sf にした 方がスマートと思ったぞ。
ついでなんで、/etc/rc がどうfstabを利用してるか調査。
mount -s /var >/dev/null 2>&1 # cannot be on NFS mount -s /var/log >/dev/null 2>&1 # cannot be on NFS mount -s /usr >/dev/null 2>&1 # if NFS, fstab must use IP address # Check and mount remaining file systems and enable additional swap. mount -a swapctl -A -t noblk do_fsck -N mount -a -N
陽にfstabを参照してはいなかった。mount -a が裏で参照。これって、オブジェ クト指向の考え方だな。で、そのオブジェクトは、
ob$ cat /etc/fstab 4a2f0a6c27eb2522.b none swap sw 4a2f0a6c27eb2522.a / ffs rw 1 1 4a2f0a6c27eb2522.f /home ffs rw,nodev,nosuid 1 2 4a2f0a6c27eb2522.d /usr ffs rw,nodev 1 2 4a2f0a6c27eb2522.e /usr/local ffs rw,wxallowed,nodev 1 2 4a2f0a6c27eb2522.g /var ffs rw,nodev,nosuid 1 2 swap /tmp mfs rw,nodev,nosuid,-s=768m 0 0
mountを紐解いたら面白いかもです。でも、先に進むよ。
vi vs. emacs
tag jumpしたら、リソースはどう、消費されるか?
まずは、vi
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 21801 sakae 3 0 1316K 2032K idle ttyin 0:00 0.00% vi
using tags
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 21801 sakae 3 0 1396K 2292K idle ttyin 0:00 0.00% vi
今度は、emacs
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 93080 sakae 2 0 16M 24M sleep kqread 0:01 2.98% emacs
using TAGS
PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 93080 sakae 2 0 284M 293M sleep kqread 0:04 7.76% emacs
ガベコレ時の応答
ELISP> (garbage-collect) ((conses 8 290185 23532) (symbols 24 13264 6) (strings 16 90658 8252) (string-bytes 1 2230985) (vectors 8 19936) (vector-slots 4 335145 35692) (floats 8 22 301) (intervals 28 5252 57) (buffers 568 13))
TAGSした時の応答
ELISP> (garbage-collect) ((conses 8 295955 20120) (symbols 24 14026 11) (strings 16 93097 5813) (string-bytes 1 2304446) (vectors 8 20853) (vector-slots 4 348678 50018) (floats 8 34 289) (intervals 28 5271 57) (buffers 568 14))
vi tags
viでタグジャンプする方法(for vi)を調べてみた。非常時を想定ね。 何が無くても、ジャンプ・テーブルを作成しとく。
ctags -R
次はコマンド・レファレンス。
vi -t fuga jump Ctl + ] or :tag fuga pop Ctl + t or :pop
fugaって関数もしくは定義を見つけて飛んでケェーです。vimだともう少し便 利な機能が有るみたいだが、余計な機能満載な奴は好みでは無いので略です。 それじゃ、emacsはどうよってののオイラーの見解。emacsは(開発)環境です。 その一部にedit機能が提供されてるんです。
これだけだと、並なんで、jump into vi
inside vi
gdb出来るようにします。
src/usr.bin/vi と src/usr.bin/Makefile.inc を /tmpにコピー。次に build/Makefileを編集して、gdb対応にレシピを改造。
fug$ gdb -q build/vi Reading symbols from build/vi... (gdb) r
これで、全面が ~ の vi 画面が出現。続いてgdbを起動する為、Ctl + C しま す。
Program received signal SIGINT, Interrupt. ~ _thread_sys_read () at /tmp/-:3 3 /tmp/-: No such file or directory. (gdb) bt #0 _thread_sys_read () at /tmp/-:3 #1 0x0aef5866 in _libc_read_cancel (fd=0, buf=0x4b34a200, nbytes=255) at /usr/src/lib/libc/sys/w_read.c:27 #2 0x1834be56 in cl_read (sp=0x4b31e000, flags=0, bp=0x4b34a200 "", blen=256, nrp=0xcf7ed648, tp=0x0) at ../cl/cl_read.c:229 #3 0x1834b8b9 in cl_event (sp=0x4b31e000, evp=0xcf7ed7b8, flags=0, ms=0) at ../cl/cl_read.c:97 #4 0x1837663f in v_event_get (sp=0x4b31e000, argp=0xcf7ed7b8, timeout=0, flags=2) at ../common/key.c:531 #5 0x183a0463 in v_key (sp=0x4b31e000, command_events=1, evp=0xcf7ed7b8, ec_flags=2) at ../vi/vi.c:1165 #6 0x1839efe6 in v_cmd (sp=0x4b31e000, dp=0x4b319e98, vp=0xcf7ed834, ismotion=0x0, comcountp=0xcf7ed830, mappedp=0xcf7ed82c) at ../vi/vi.c:483 #7 0x1839e15c in vi (spp=0xcf7ed930) at ../vi/vi.c:152 #8 0x1837aa5d in editor (gp=0x4b34c760, argc=0, argv=0xcf7edaf8) at ../common/main.c:429 #9 0x1834adb8 in main (argc=1, argv=0xcf7edaf4) at ../cl/cl_main.c:97 (gdb) ~ ~
これで、viが入力待ちになってる状況が分かりました。ソースでの定義場所が 表示されているので、後をそれを開いて見るだけです。が、それじゃつまらな いので、あえて、tagsを使ってみます。
ctags
tag jumpしたいので、tagsを作成します。
fug$ ctags -R ctags: unknown option -- R usage: ctags [-aBdFuvwx] [-f tagsfile] file ... fug$ ctags `find . -name '*.[ch]'` Duplicate entry in files ./common/util.c and ./common/key.c: MAXIMUM (Warning only) Duplicate entry in files ./ex/ex_global.c and ./ex/ex_append.c: which (Warning only) Duplicate entry in files ./ex/ex_shell.c and ./common/seq.c: MINIMUM (Warning only) Duplicate entry in files ./vi/v_txt.c and ./ex/ex_txt.c: txt_dent (Warning only) fug$ wc tags 745 5167 47512 tags
セオリー通りにやったらエラーしました。ctagsがemacs由来なので多分イジワ ルしたんでしょう。こういうのググルの検索結果には書いていませんので、自 分で手を動かしてナンボです。別の手を試してみたら、ちょいと警告が出てき ました。こういう手合いは、-w を付ければ心の平安が保てます(それで、いい のか)。
早速、試運転します。gdbのトレースで重要そうな、フレーム番号6番、
v_cmd
さんを呼出てジロジロとナメ回すように眺めてみましょう(このエロ
爺め、本性むき出しだな)。
fug$ build/vi -t v_cmd
ちょっと見た場所が悪かったみたい。自由に飛び回れるのだから、最上位から、 深部に行くのが良さそうです。
how to work tag jump
そろりそろりとviを見ていても埒があかないので、ex系です。 ex/ec_cmd.c
を
覗くと、
/* C_TAG */ {"tag", ex_tag_push, E_NEWSCREEN, "!w1o", "ta[g][!] [string]", "edit the file containing the tag"},
こんなコマンド・テーブルが有ったので、起動してるviにgdbをアタッチして から、勘でBPを設定。
(gdb) bt #0 ex_tag_push (sp=0x7814c500, cmdp=0x781817c8) at ../ex/ex_tag.c:102 #1 0x160ce197 in ex_cmd (sp=0x7814c500) at ../ex/ex.c:1371 #2 0x1610543f in v_ex (sp=0x7814c500, vp=0xcf7c0a94) at ../vi/v_ex.c:433 #3 0x16119469 in vi (spp=0xcf7c0b90) at ../vi/vi.c:232 #4 0x160f5a5d in editor (gp=0x78181760, argc=0, argv=0xcf7c0d58) at ../common/main.c:429 #5 0x160c5db8 in main (argc=1, argv=0xcf7c0d54) at ../cl/cl_main.c:97
後は、散策するだけーーー。
ひとつ問題があった。ptraceが拒否されちゃうんだ。
fug$ doas sysctl kern.global_ptrace=1
を実行して、難を逃れたよ。
母艦と強結合
これをやっちゃうと河豚板の良さが失われてしまうけど、何かの折りに役立つ だろう。
fug$ cat strong.sh # strong connection with base machine mount /dev/sd0d /ram/opt/Dusr/ cd / rm usr ln -s /ram/opt/Dusr usr mount /dev/sd0e /usr/local
マウント状況。この見掛けに騙されてはいけない。見ると目に毒。
fug$ df -h Filesystem Size Used Avail Capacity Mounted on /dev/rd0a 1.5M 955K 597K 62% / /dev/sd1a 830M 812M 17.6M 98% /sysmedia /dev/vnd5a 792M 785M 7.7M 100% /fuguita mfs:54830 991M 501M 441M 54% /ram /dev/sd0d 23.2G 3.6G 18.5G 17% /ram/opt/Dusr /dev/sd0e 38.7G 2.1G 34.7G 6% /ram/opt/Dusr/local
普通に使っとけ。
fug$ ls /usr/local/bin/ | wc 847 847 9288
元に戻すには、ram/usr にするだけだけど。
fug$ ls -l /usr lrwxr-xr-x 1 root wheel 13 Feb 10 08:48 /usr@ -> /ram/opt/Dusr fug$ ls -l /var lrwxr-xr-x 1 root wheel 7 Feb 10 05:19 /var@ -> ram/var
実戦投入
以前作成した tagsは、こんな風になっている。中央の項が、ファイル名なん だけど、しっかり絶対パスになってる。よって、このパスに沿ってファイルが 存在していないと、結果が無いと言う事になる。
こんな時に、上記の母艦と強結合をさせるのさ。
A10_CLK_AHB_EHCI0 /usr/src/sys/arch/i386/../../dev/fdt/sxiccmu_clocks.h /^#define A10_CLK_AHB_EHCI0 27$/ A10_CLK_AHB_EHCI1 /usr/src/sys/arch/i386/../../dev/fdt/sxiccmu_clocks.h /^#define A10_CLK_AHB_EHCI1 29$/ A10_CLK_AHB_EMAC /usr/src/sys/arch/i386/../../dev/fdt/sxiccmu_clocks.h /^#define A10_CLK_AHB_EMAC 42$/