OpenBSD 5.9 & Ubuntu 16.04

OpenBSDの新版が前倒しで出たというので、1年ぶりに入れてみた。isoファイルを 取りに行ったら、2月製造って刻印が有ったぞ。i386版は順調に仕上がったけど、64Bit版が ごたごたしてて足を引っ張ったんですかねぇ。元気に色々改正されてるようですから。

5.7から5.9への変更では、オイラーには何が変わったか検知出来ず。先端機能を 触っていないんで当然か。

srcは勿論新しくした。相変わらずlib等がgdbにかけられるようになってて有り難い。 portsはrsyncでコピーして済ませた。

XをWindows側に投げようとしたら反応せず。ずーーーーーーと思い出を辿って、/etc/ss/sshd.confの X11Forwarding yesを忘れていた。情けない。

この設定をしておかないと、startxした時も随分待たされるのね。これってどういう理屈? xauthが関係してるっぽいけど、考えがまとまらないな。

例によってデフォで起動するものを極力抑えている。

[ob: ~]$ cat /etc/rc.conf.local
smtpd_flags=NO
sndiod_flags=NO
pflogd_flags=NO
ntpd_flags=NO

[ob: ~]$ ps awx
  PID TT  STAT       TIME COMMAND
    1 ??  Is      0:01.05 /sbin/init
 2836 ??  Is      0:00.01 dhclient: vic0 [priv] (dhclient)
 7022 ??  Isp     0:00.00 dhclient: vic0 (dhclient)
 3489 ??  Isp     0:00.02 syslogd: [priv] (syslogd)
15775 ??  Sp      0:00.09 /usr/sbin/syslogd
17255 ??  Is      0:00.02 /usr/sbin/sshd
 8677 ??  Ssp     0:00.02 /usr/sbin/cron
 1354 ??  Is      0:00.11 sshd: sakae [priv] (sshd)
 6780 ??  R       0:04.82 sshd: sakae@ttyp0 (sshd)
28928 ??  Rs      0:00.53 SCREEN -U (screen)
27602 ??  Is      0:02.68 emacs --daemon (emacs-24.5)
 2526 p0  Isp     0:00.02 -ksh (ksh)
  871 p0  S+      0:00.04 screen -U
14620 p1  Ssp     0:00.06 -/bin/ksh
14512 p1  R+p     0:00.00 ps -awx
 6880 p2  Is+p    0:00.03 -/bin/ksh
22385 C0  Is+p    0:00.02 /usr/libexec/getty std.9600 ttyC0
 1041 C5  Is+p    0:00.01 /usr/libexec/getty std.9600 ttyC5

ああ、今気が付いたけど、kshのデフォルトのプロンプトがちょっと変わって親切に なってるな。ちゃんと気が付かないと、女房に怒られますから。。。

初回は時間がかかる

前回、qsp.hってC語のマクロを作った。これを作りきっかけがgdbでコードを追ってる時、 初めての関数が呼ばれる場合、随分とあちこちを引き回される事に端を発してる。 どのぐらいオーバーヘッドが有るか。測ってみろ。

mainに、

   QSP( z = sin(10) );
   QSP( z = sin(11) );
   QSP( z = cos(12) );
   QSP( z = cos(13) );

こんな意味も無いコードを書いて実行すると

exec time =   0.000105
exec time =   0.000009
exec time =   0.000032
exec time =   0.000008

初回の関数呼出が断トツで遅い結果となった。cosも初回は遅いけど、一番最初のsinに 比べれば、それほどでもない。

初回のsin呼びを分解する意味で、測定対象の無い時間測定のマクロを追加する。

   QSP( ; );
   QSP( z = sin(10) );
   QSP( z = sin(11) );
   QSP( z = cos(12) );
   QSP( z = cos(13) );

結果は

exec time =   0.000052
exec time =   0.000070
exec time =   0.000008
exec time =   0.000035
exec time =   0.000008

初回のsin呼び出し時間が、前回よりは緩和された。同じ事をFreeBSDやFedoraで行うと このような顕著な差は出ない。何故? objdumpしてコードを見たら、OpenBSDは馬鹿真面目に cosとかの関数を呼び出していた。FreeBSDとかだと、計算した値が使われ、cosの 呼び出しは行われていなかった。ずるいぞ。

OpenBSDの名誉の為に言っておくと、-O2とかのオプションを付けてコンパイルすると、 FreeBSDと同様になった。

static

じゃ、cosとかの関数を自分の中に取り込んで、呼び出しを簡素化したらどうなる?

[ob: z]$ cc -g -static t.c -lm
[ob: z]$ ./a.out
exec time =   0.000039
exec time =   0.000009
exec time =   0.000008
exec time =   0.000008
exec time =   0.000008

やはりcosとかの呼び出しは速くなった。初回のダミーはやはり遅さが目立っているな。 ここで、ちょっと8087の資料を漁っておく。

libmのpow()関数を高速化改造する

long double の利用法

浮動小数点演算(8087コプロセッサ)

浮動小数点演算命令

浮動小数点演算

数値計算ガイド

ARM 浮動小数点演算のサポート

浮動小数点演算ではまった話

数値演算コプロセッサ

コードを眺める

a.outをobjdumpしてみた。

   QSP( z = sin(10) );
 a26:   e8 69 ff ff ff          call   994 <time_now>
 a2b:   8b 83 30 00 00 00       mov    0x30(%ebx),%eax
 a31:   dd 18                   fstpl  (%eax)           ;; FPUreg -> mem
 a33:   dd 83 2c df ff ff       fldl   0xffffdf2c(%ebx) ;; mem -> FPUreg
 a39:   dd 1c 24                fstpl  (%esp)
 a3c:   e8 4f fc ff ff          call   690 <sin@plt>
 a41:   dd 5d e8                fstpl  0xffffffe8(%ebp) ;; sin result
 a44:   e8 4b ff ff ff          call   994 <time_now>
 a49:   8b 83 34 00 00 00       mov    0x34(%ebx),%eax
 a4f:   dd 18                   fstpl  (%eax)
 a51:   8b 83 34 00 00 00       mov    0x34(%ebx),%eax
 a57:   dd 00                   fldl   (%eax)            ;; sp
 a59:   8b 83 30 00 00 00       mov    0x30(%ebx),%eax
 a5f:   dd 00                   fldl   (%eax)            ;; st
 a61:   de e9                   fsubrp %st,%st(1)        ;; sp - st
 a63:   dd 5c 24 04             fstpl  0x4(%esp)
 a67:   8d 83 0d df ff ff       lea    0xffffdf0d(%ebx),%eax
 a6d:   89 04 24                mov    %eax,(%esp)
 a70:   e8 eb fb ff ff          call   660 <printf@plt>

fpuとのやり取りが気になったので、解析してみた。でも今回は、それが主目的では なくて、遅い原因を探るのだ。gdbで追って行くと、 time_now()の中から、辺な所へ行った。

(gdb) bt
#0  _dl_bind_start () at /usr/src/libexec/ld.so/i386/ldasm.S:140
#1  0x7b238000 in ?? ()
#2  0x15b17a2b in main () at t.c:8

そして実行を進めてみると

(gdb) bt
#0  0x001b3c84 in _dl_find_symbol (name=0x15b1753a "gettimeofday",
    this=0xcf7df0e4, flags=48, ref_sym=0x15b17424, req_obj=0x7b238000,
    pobj=0xcf7df0e0) at /usr/src/libexec/ld.so/resolve.c:600
#1  0x001b65cf in _dl_bind (object=0x7b238000, index=32)
    at /usr/src/libexec/ld.so/i386/rtld_machine.c:387
#2  0x001b25f7 in _dl_bind_start () at /usr/src/libexec/ld.so/i386/ldasm.S:153
#3  0x7b238000 in ?? ()
#4  0x15b17a2b in main () at t.c:8

同様にsin関数の呼び出し部分でも、辺な所へ飛ばされている。この変なものは何?

[ob: z]$ ldd a.out
a.out:
        Start    End      Type Open Ref GrpRef Name
        1b41b000 3b41f000 exe  1    0   0      a.out
        04605000 2460e000 rlib 0    1   0      /usr/lib/libm.so.9.0
        036bc000 236d9000 rlib 0    1   0      /usr/lib/libc.so.84.2
        05798000 05798000 rtld 0    1   0      /usr/libexec/ld.so

変なものは内蔵されてた。manしてみると

     ld.so is a self-contained, position independent program image providing
     run-time support for loading and link-editing shared objects into a
     process's address space.  It uses the data structures (see elf(5))
     contained within dynamically linked programs to determine which shared
     libraries are needed and loads them at a convenient virtual address using
     the mmap(2) system call.

     After all shared libraries have been successfully loaded, ld.so proceeds
     to resolve external references from both the main program and all objects
     loaded.  A mechanism is provided for initialization routines to be
     called, on a per-object basis, giving a shared object an opportunity to
     perform any extra set-up, before execution of the program proper begins.

     ld.so is itself a shared object that is initially loaded by the kernel.

一番最初にカーネルがロードするのがこいつ。こいつの力を借りて、他のライブラリィーを ロードするとな。その後も、mainとかからの要請によって、名前解決を行う。オイラーの 超訳は信用ならんかな。そういう時は、バイナリー八苦本の、#58あたりを見れば良いのかな。

同本の219ページあたりに、Linuxでは、ld.soを直接実行出来るってコンビニな事が 説明されてた。いいじゃーーないの、便利ならーを、地で行く、無節操ぶり、かな?

多分、OpenBSDはセキュリティの強化の為、ライブラリィーのロード先を、実行の度に 変えているのだろうね。だから、その都度、名前解決が必要なんだな。

八苦本にLinuxでは、ライブラリィーをプリロードしておいて、アプリの起動を速める 事が出来るって乗ってた。(#85) なんでも、firefoxみたいに大量のライブラリィーを 使ってるアプリに、これを適用すると、いらいらが減少するとか。何でも有りだな。

次は、何でも有り版にでも触ってみるか。

ubuntu 16.04

ウブも長期サポート版が出たと言う事で、 F T P . J A I S T . A C . J Pから、 ununtu-16.04-server-i386.isoを取ってきて、入れてみた。このjaist.ac.jpは、 出力インピーダンスの低い良いサーバーだったけど、暫くの間調子悪かったよう。 サバ菅の嘆き節が聞こえてきて、ご同情申し上げます。余り負荷をかけてHDDの 寿命を縮めるような事は控えましょう。

VMWAREに入れてみたけど、ウブのおかげで、ユーザーアカウントを設定するだけで、 インストール完了。但し、少し弊害が有ったぞ。host名が長ったらしい、アメリカ時刻を 表示してる。さくっとネット上の誰かさんに聞いて修正。ウブのローカルルールなんて 知らんがな。

やっと、デフォのパイソンが3.5になった。おめでとう。パアルはこの際、引退しても いいかと思うんだけど、何かに紛れて忍び込んでいるわい。

以前のウブに何入れていたかな? そういう時は

dpkg  --get-selections >install.log

するんだった。そして、16.04でどんなパッケージが有るかは

apt-get update
apt list >yes-we-can-supply.txt

とかやって、型録を作っておけばOk。これもウブのローカルルールだな。ローカルルールを 世界標準と持て囃すのも、実社会とそっくりだ事。

ああ、パッケージとより良いお付き合いをするための情報収集 を見ると、apt-fileってコマンドを推奨してるな。これは知らなかったぞ。

vmwareのコンソールからstartxするとXが上がってこない。しょうがないので、Xmingを 使ってお茶を濁す事にした。そこで、emacsを上げる時に文句を言われないように、 emacs24-lucid を選んでみた。

サーバー版でstraceがデフォで入っているって、手回しが良すぎないかい。

兎も角、python3になった事だし、pythonに手を出してみるかな。

sudo apt-get install python3-scipy
sudo apt-get install python3-matplotlib
sudo apt-get install ipython3-notebook

ぐらいで、取りあえず試してみるか。

matplotlib入門

Matplotlib: 作図

Scipy Lecture Notes

で、上の ipython3 notebook を、コンソールから起動したら、jsが動いてねぇぞと 怒られた。これって、ひょっとしてブラウザに依存してないか? 何も知らないオイラーが おろおろしてます。結局、ちゃんとXを動かせって事だな。CUIおじさんには、辛いものがあるなあと、 嘆いています。

X Window に取り組む

泥縄を撚ってみる事にします。えと、ウブ15.04の時はどうだった? 過去の記録と言う事で、 昔の日記を再読。

sudo apt-get -y install xserver-xorg

だけで良いそうだけど、xorgを入れちゃった。

秘伝のたれ、xorg.confを自作してるな。そして、Windows7上に置いてあるvmwareのconf ファイルを変更してる。その通りにしたけど、やはりエラー。

vmmouse.present = "FALSE" 

今度は、エラー表示のメッセージに従って、 .local/share/xorg/Xorg.0.log を参照。 これって昔は、/var/logあたりに作られていなかったかな。ここでもウブのローカルルールが 炸裂してますよ。

で、EEってタグを見つけて、それを潰す作業に没頭。20年前からちっとも進歩してないな。 反省しきりであります。今度は起動したら直ぐに終了しちゃうエラーに遭遇。

この原因は、ub15.04から持ってきた、.xinitrcの設定にあった。マネージャにawesome なんてのが指定してあったぞ。そんなの居ないから、何もでけませんという事で、即終了 しちゃったんだな。ここは古式ゆかしく twm を指定しといた。気が向いたら、icewmでも 入れてみるか。

firefox入れたら、日本語文字が豆腐になっちゃう。これは日本語フォントが入って いないからだな。何も悩まず、

sakae@ub:~$ sudo apt-get install fonts-ipafont

したよ。特にフォントには拘りが有りませんからね。 折角なので、巻末に xorg.conf を添付しておく。

アプリ間のコピペはどうやるんだっけ? GUI知らないからな。 X Window Systemのクリップボードの種類,xselコマンド,履歴ツール。 マウスでなぞった所がコピされて、中ボタンのクリックでペされると、覚えておこう。

etc

picrinのcodegenプロセスを説明してみる

プログラマの遊び

xorg.conf for Ubuntu

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        ModulePath   "/usr/lib/xorg/modules"
        FontPath     "/usr/share/fonts/X11/misc"
        FontPath     "/usr/share/fonts/X11/cyrillic"
        FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
        FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
        FontPath     "/usr/share/fonts/X11/Type1"
        FontPath     "/usr/share/fonts/X11/100dpi"
        FontPath     "/usr/share/fonts/X11/75dpi"
        FontPath     "built-ins"
EndSection

Section "ServerFlags"
    Option    "AIGLX" "off"
EndSection

Section "Module"
        Load  "glx"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
     HorizSync    1-10000
     VertRefresh  1-10000
     ModeLine "1360x768" 100 1360 1460 1560 1660 768 868 968 1068
EndSection

Section "Device"
        Identifier  "Card0"
        Driver      "vmware"
        BusID       "PCI:0:15:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes     "1360x768"
        EndSubSection
EndSection