12.04, 14.04 LTS

ipadを使い始めてから1年経った。

女房が8割がたの時間、使ってる。おいらはその合間を縫って使うって訳。老眼には勝てなくて、 連続して使うと目がおかしくなるんだ。よって、連続使用時間は15分と決めている。

アプルは次なる票田の自動車の方へ行くのは結構だけど、年寄りの事考えて、もっと大きな 板を作らんかね。これからは、少子高齢化なんだから。。どの先進国を見たって、そうでしょ。

ああ、目への労わりと言えば、パソコンと読書の時間帯は、朝食後から夕食前までと、密かに 自己規制をかけているんだった。鳥目も混じっているんかい? ああ、辛い。

ipadの電池もへたりぎみになってきたな。5時間充電ってのは、当初から変わらないけど、 持久力が無くなってきた。当初は15時間は無給電で走ってくれたものが、もう10時間で 息も切れ切れ。銀座クリニックに入院するのは、いつの日だ? その日の為に、入院貯金を しておかんとな。ええ、保険には入っていないもので。

ipadのブラウザーとしてずっと標準のやつを使ってきたけど、ちと使いずらかったんだ。 何が?

そう、Webのページによっては字が小さすぎたりして、そういう時は拡大するんだけど、 そうすると、指で右左しなきゃならないので面倒。iOS 7 になってもこのreaderモードが 出たり出なかったり。たとえreaderモードが使えたとしても文字の大きさ固定、広い?画面の 中心付近にしか表示されないって いう、アプルの気まぐれ年寄り虐めにあっていたんだ。

で、とうとう我慢が出来なくなって非標準品を探してみたよ。年寄りのためのブラウザーね。 ぴったりしたのが有った。Mercuryってやつ。unixで言ったら、w3m-img って事です。 文字サイズを自由に設定できて、それを覚えていてくれる。画面を有効利用してくれる。 、年寄りにはうってつけ。これで、読書もはかどるって訳です。

そういうおまえは、アプルが無料提供してる、iBookのやつを大量に落としてきてあるけど、 全部読んだか? いいえマダです。そんじゃ、嫁よ。

面白そうなのが有ったぞ。『神主さんが教えたい伊勢神宮』ですって。去年は、 式年遷宮で、賑わっていたなあ。神様のお住まいの移転。これ、神様の為じゃなくて、 人間様の技術伝承のための儀式なのね。20年毎に建てかえる。昔の人は寿命が短かった らしいので、20年とは一世代に相当するのかな。祖父から父へ、父から子へと技術が 伝承されてく間隔が絶妙だな。

そうだ、おいらも式年遷宮してみよう。

12.04

式年遷宮って事で、ウブのサーバーの建て方を忘れないように、再度やっておく事にする。 取り合えずazprologがあるんで、それが素直に動くように、12.04のサーバー版を入れて みる事にする。木曽の檜だか、白山山系のやつだか知らんが、産地は この辺のやつ

で、何処に建てるかなんだけど、Diskも窮屈なんで、Debianを潰して更地にし、そこに 新宮を建立する事にした。新しく建てると、IPアドレスが変わってしまうので、VMWAREの VMはそのままって方針を採る事にした。そうすると、新たなCD(iso)からbootせにゃならん。

boot deviceの優先順序はBIOSのメニューで決めるんだったな。えと、起動時にF2だかESC キーを連打すればいいはず。。。なんだけど、反射神経が鈍くなってて、何度やっても Debian様が起動してきちゃう。はてどうすべ?

ぐぐったら、 vmware-biosなんてのを 教えられた。

bios.forceSetupOnce = "TRUE"
bios.bootDelay = "15000"

とかしておくと、年寄りも安心。ああ、歳は取りたくないねえ。

インストールは簡単だったよ。途中で、どんなサーバーにしたいか聞いてくるんで、 open-sshだけを選んであげた。後で気か変わってDeskTopにしたいなんて時は、 taskselってやって、追加を入れられる。このコマンド、おいらの感覚からすると、task じゃなくて、キャラクターと思うぞ。taskなんて言うと、仕事っぽいな。

ああ、VMWAREが振ってくれるIPアドレスは、固定に出来るのね。 VMWARE DHCPで、初めて 知りましたよ。これで、新規にサーバーを建てても、由緒あるIPアドレスを使い回せますよ。 今はもうPerlはお役御免にしちゃったけど、その節は近藤先生のラクダ本に助けられたものです。 ああ、懐かしいなあ。

後はいろいろ入れてく訳だけど、USからダウンロードするんじゃ遅くてかなわん。近藤先生が sed技を繰り出しておられたので、有り難く利用させて貰いましたよ。

sed -i".bak" 's/http:\/\/us.archive.ubuntu.com\/ubuntu/http:\/\/ftp.jaist.ac.jp\/pub\/Linux\/ubuntu/' sources.list

どんな物を入れたかと言うと、

build-essential  開発環境
xorg twm         X関係
open-vm-tools    Diskの掃除用(vmware-toolbox-cmd disk shrink / ) 
nvi              vim嫌いな人の為に
emacs23          ちと古いけど

Virtual Boxには、DISKの圧縮機能が付いていないけど、VMWAREは上記コマンドでGC出来るんで、 便利だわい。

Xを上げると、画面が600x400ぐらいだったので、 VMware上のLinux(X-Window)で画面解像度を自由に設定する を参考にして、広く利用出来るようにしたよ。

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

Section "Screen"
        Identifier "Screen0"
    :
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes     "1360x768"
        EndSubSection
EndSection

twmのタイトル枠とメニューの縦幅ががみっとも無いぐらいに拡がってしまっている。何で? 調べてみたら、.twmrc内で設定してるフォントが悪さをしてた。悪いのはアドビのフォントか。 それを扱うX11軍団かは不明だけど、改修したよ。

TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*"
   to
TitleFont "-misc"

上記の近藤先生のネタ帳を見てたら、参考になりそうなものが有ったので、引き写し。

Emacsパッケージ特集

go-lang

14.04

古いウブもいいんだけど、先月出たやつにもチャレンジしとくか。何か気が変わって、 新しいアプリを試そうとした時に便利だから。 ソースは適当に下記あたりから。

http://ubuntutym2.u-toyama.ac.jp/ubuntu/14.04/

http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/14.04/

http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/

新しいVMを起動しようとしたら、CD(iso)を認識しない。ファイル名を切り詰めたら認識した。 変なの! それに、起動時一度ハングしたけど、やり直したら継続した。まあ、ちゃんと インスコ出来たから文句は言うまい。 ユーザーの情報を登録してあげるだけで、インストール完了。これじゃ、 式年遷宮の用を為さないな。ああ、時計がカリフォーニア時間になってたので

dpkg-reconfigure tzdata

手直ししたよ。秘伝の虎の巻は、 Ubuntu 14.04 LTSをインストールした直後に行う設定 & インストールするソフト を見ろとな。わざわざ14.04って断ってる所を見ると、その時代にマッチした方式が有る訳ね。

なお、自宅にパソコンが無い人は、さくらのVPSでUbuntu 14.04 LTSを動かす を参考に他人の褌で相撲を取ってみるのも一興かと。をぃ、ipadで接続出来るんか? 筆者の方は、そういう所に突っ込みを入れていないなんて、当世風じゃないですよ。 若者はパソコンなんて、きっと持っていないだろうから、おじさん向けの記事だな。

日経Linuxにもウブ14.04 LTSとかFreeBSD 10.0が付いてくるようだから、楽しんで みると良い鴨。OpenBSD 5.5は間に合わなかったみたいだね。残念!

記念に、azprologに付いてたベンチをやってみる。azprologの対抗馬は、swipl 6.6.4.

-----------------------------------------------------------------------------
RuntimeSeconds(Rate) Verify "T":Base "t":SameToBase "F":NotSame "_":NoResult

                           <========  AZ-Prolog.V7  ==========>
ModuleName  Verify Iterate C-Compile  Byte-Compile  Interpreter   [SWI-Prolog]
-----------+-CBIO-+-------+----------+-------------+-------------+------------
boyer       [Tttt]     100 2.504 (1)  7.732 (3.08)  21.46 (8.57)  7.916 (3.16)
browse      [Tttt]     100 3.512 (1)  8.888 (2.53)  16.70 (4.75)  10.94 (3.11)
chat_parser [Tttt]     100 0.856 (1)  2.280 (2.66)  4.368 (5.10)  2.256 (2.63)
crypt       [Tttt]   10000 1.564 (1)  4.668 (2.98)  9.564 (6.11)  5.448 (3.48)
deriv       [Tttt]  100000 0.668 (1)  1.621 (2.42)  2.441 (3.65)  1.884 (2.82)
dynamic_uni [Tttt]   10000 1.232 (1)  2.952 (2.39)  4.257 (3.45)  3.124 (2.53)
fast_mu     [Tttt]   10000 0.503 (1)  1.368 (2.71)  2.972 (5.90)  1.588 (3.15)
flatten     [Tttt]  100000 3.016 (1)  7.396 (2.45)  18.19 (6.03)  9.012 (2.98)
itak        [Tttt]     100 3.200 (1)  4.029 (1.25)  4.931 (1.54)  7.340 (2.29)
meta_qsort  [Tttt]    5000 1.619 (1)  4.872 (3.00)  10.12 (6.25)  5.373 (3.31)
mu          [Tttt]   10000 0.389 (1)  0.827 (2.12)  2.008 (5.16)  0.951 (2.44)
nreverse    [Tttt]  100000 0.792 (1)  1.372 (1.73)  13.47 (17.0)  1.504 (1.89)
nreverse_bu [Tttt]  100000 0.620 (1)  0.936 (1.50)  1.408 (2.27)  1.000 (1.61)
poly        [Tttt]    1000 3.141 (1)  6.771 (2.15)  11.94 (3.80)  7.336 (2.33)
primes      [Tttt]   10000 0.317 (1)  1.187 (3.74)  3.404 (10.7)  1.324 (4.17)
prover      [Tttt]   10000 0.509 (1)  1.247 (2.44)  2.860 (5.61)  1.316 (2.58)
qsort       [Tttt]  100000 2.548 (1)  7.160 (2.81)  17.32 (6.80)  7.636 (2.99)
queens      [Tttt]   10000 0.692 (1)  1.376 (1.98)  4.345 (6.27)  1.708 (2.46)
query       [Tttt]  100000 1.835 (1)  6.956 (3.79)  9.616 (5.24)  7.672 (4.18)
reducer     [Tttt]     500 1.024 (1)  2.625 (2.56)  4.983 (4.86)  2.960 (2.89)
sendmore    [Tttt]     500 1.495 (1)  4.432 (2.96)  12.12 (8.10)  4.980 (3.33)
simple_anal [Tttt]     500 0.468 (1)  1.213 (2.59)  2.567 (5.48)  1.344 (2.87)
tak         [Tttt]    1000 3.529 (1)  11.43 (3.24)  42.64 (12.0)  13.12 (3.71)
unify       [Tttt]   20000 1.643 (1)  6.648 (4.04)  16.31 (9.92)  7.496 (4.56)
zebra       [Tttt]     500 1.160 (1)  1.323 (1.14)  2.741 (2.36)  1.628 (1.40)
-----------+-CBIO-+-------+----------+-------------+-------------+------------
      Total(Average)       38.83 (1)  101.3 (2.57)  242.7 (6.28)  116.8 (2.91)

azprologでazeditを使おうとすると、導入の儀式がちょいと必要で面倒。初期化ファイルに でも書いておけるかと思ったんだけど、それらしいのは無かったので、

alias prolog='prolog -c /usr/local/share/azprolog/system/ext/azedit/azedit.pl'

bashのエイリアスに登録しちゃった。生ファイルなんで、いろいろと改造を試せそう。

prologをもう少し

という事で、lispとprologの蜜月時代を探ってみる。まず出てきたのが、創価大学の ページ。この大学って創立者があの方なのね。知らんかった。

LISP and PROLOG

で、ここで紹介されたのが、B-PrologPerformanceが、公開されてて、ぶっちぎりで 速い。幸いな事にLinux版も有ったんで、入れてみたけど、ポータブルになってるんで、 動かすのも簡単。ちょいと使ってみるには便利。

次に出てきたのが LispでPrologのページ。 Paradigms of Artificial Intelligence Programming(通称PAIP本)こと、 実用 Common Lispを勉強 された時に記録だ。高価な本なので、指を咥えて眺めておきましょ。

おいらが手を動かせるやつって事で、 On Lispなんてのを発見。PGが、マクロを 炸裂させつつ、コードを例示してくれてますよ。よって、思わず、sbclとslimeを 入れちゃいましたよ。いざ動かしてみようとすると、sbclではエラーのオンパレード。 はて、どうすべ? エラーを潰すのも勉強なんだけど、それじゃ道遠からずだな。

方針変更しましょ。ってんで見つけたのがこちら。 簡易エキスパートシステムの作成 (1) 丁寧な解説が嬉しいぞ。sbclでやってみるか。簡易エキスパートシステムの作成 (3)にある コードをコピペして走らせてみると、

Lock on package COMMON-LISP violated when proclaiming ASSERT as
a function while in package COMMON-LISP-USER.
   [Condition of type SYMBOL-PACKAGE-LOCKED-ERROR]
See also:
  SBCL Manual, Package Locks [:node]
  Common Lisp Hyperspec, 11.1.2.1.2 [:section]

Restarts:
 0: [CONTINUE] Ignore the package lock.
   :

slimeと言うかsbclが、早速文句垂れてきました。訳も分からず、コピペなんてすんじゃねぇって、 教育的指導。 なんか、assertって有りそうな名前を勝手に使ったからみたいですな。それ用にコピペしろとな。 それから、sbclで抜けてるwhileも入れとけとな。whileってのは、こんなのね。

(defmacro while (test &body body)
  `(do ()
     ((not ,test))
     ,@body))

これで走り出した。prologの特徴を良く表している、appendを実験してみる。

sakae@uB:~/src/cl$ cat test.pl
((append nil ?x ?x))
((append (?u . ?x) ?y (?u . ?z)) (append ?x ?y ?z))

一枚括弧で包んでいるのが特徴です。複合項を表そうとすると、必然的にこうなるわな。 実験は、テストコードをロードしてから、質問って事ですな。真のprologのreplはlispに 任せてるって事ですな。質問は、関数です。

CL-USER> (load-data "test.pl")
NIL
CL-USER> (Q '(append (a b c) (d e f) ?z))
?Z = (A B C D E F)

NIL
CL-USER> (Q '(append ?z (c d) (a b c d)))
?Z = (A B)

NIL
CL-USER> (Q '(append ?x ?y (a b c d)))
?Y = NIL
?X = (A B C D)

?Y = (D)
?X = (A B C)

?Y = (C D)
?X = (A B)

?Y = (B C D)
?X = (A)

?Y = (A B C D)
?X = NIL

NIL

さて、じっくりコードを読むか。

別解

前回やった、酷試対策で、prologで抵抗ネットワークの計算。Lispでも同じような事が 出来るのね。がちゃがちゃと上のエラー対策を練っている時に見つけたよ。 マクロを使った双方向計算 ですって。clispで書かれている。Common Lispと言ってもちっとも共通じゃ無いんで、 素直にclispを入れる事にした。sbclが入っているウブに入れてもつまんないので、 万次郎Linuxに入れましたよ。

困った事に、万次郎にはslimeが提供されてない。しょうがないので、 SLIMEの使い方 基礎編 とか 第5回 SLIMEの使い方 開発サイクルについて を参照して、slimeの設定と操作方法を復習したよ。

早速、やってみる。定義式を定義する必要がある。それも、右辺がゼロになるような 方程式を立てて、左辺を登録するとな。

抵抗2本が直列になった回路の、電圧と電流の関係式だな。

e = (r1 + r2) * i
e - (r1 + r2) * i = 0

と、変形出来るな。こうすると、 電圧則(キルヒホッフの第二法則) を適用したように見えてくるな。後は、左辺をS式に変換して登録するんだな。

CL-USER> (defformula seri (- e (* (+ r1 r2) i)))
SERI
CL-USER> (seri -h)
(- E (* (+ R1 R2) I))
CL-USER> (seri i 3 r1 4 r2 5)
27
E
CL-USER> (seri e 27 r1 4 r2 5)
3
I
CL-USER> (seri e 27 i 3 r1 4)
5
R2

既知の値は、変数名 値を並べて設定。定義式中の未知の値を、探し出して計算してくれる。 素晴らしい仕掛けだ。 同じ要領で、抵抗2本の並列回路を定義し、計算してみた。

CL-USER> (para -h)
(- E (* (/ (* R1 R2) (+ R1 R2)) I))
CL-USER> (para i 7 r1 10 r2 25)
50
E
CL-USER> (para r1 10 e 50 i 7)
give r-min, r-max, and epsilon for R2
0 100 0.00001
25.0
R2

どうなってるか内部を覗いてみると、何やらおいらの知らないlabelなんて関数が使われて いるぞ。これは何? 手元にある、 ANSI Common Lispって本を紐解いてみたら、解説が載ってた。そして、On Lispにも 出てた、Prologの解説がこの本にも出てた。PG(ポール・グレアム)さんは、記事を 使い回してるのね。

On Lispを読む為の予習書として、この本を一度復習してみるかな。

おまけ

prologのマニュアルを見てると

is(?term, +evaluable)

こんな具合に、変数の頭にプラス、マイナス、はてな印が付いている。これって何者よ? 調べてみたら、プラスは入力専用端子、マイナスは出力専用端子、はてなマークは 入出力共用端子って事だった。

なんか、ICの規格表を見てるみたいで面白いな。C語では、何もつかなければ入力、頭に米印が 付いていると、まあ、それは入力端子なんだけど、場合によっては副作用を積極的に 使って、変化する場合もあるよってのを思い出した。出力は、関数全体で表しているんだな。