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$/

This year's Index

Home