Emacs Lisp 盆栽的プログラミング

 Emacs Lisp でプログラムを書いてみた。

  Emacs LispEmacs というテキストエディターに付属している Lisp 風のマクロであると誤解される向きもある。Emacs に特化し、良きにつけ悪しきにつけ、Emacsバインドされつつ今日に至っているのは紛れもない事実だが、れっきした Lisp 処理系だ。

 Lisp には昔から興味だけはあったが、まとまった大きさのプログラムを書くのはこれが始めて。

 他のプログラム言語で、function (x) と書くところを (function x) と書き、なんでもかんでも()で表現し、関数型言語のくせに、戻り値を返す為の return x に当たる構文がないなど、なにかと戸惑ってしまうが、この数週間ぶっ続けで、コードを書いていたら、だいぶ慣れてきた。

 

 実際にプログラムしてみると、Lisp は面白い言語で、コーディングそのものが、パズルっぽい。シンプルな言語だが、シンプル過ぎて、どこから手をつけたらいいのか判らないという面もある。教わる方はともかく、教える方には、とても大変な言語だという印象を持った。

 Lisp は短いフレーズ(S式)で意味を持つ。しかもインタプリタで、Emacs という開発兼実行環境があるので、書けばその場で評価し試す事ができる。

 最小限のフレーズを書き、評価し、確認し、それを組み合わせていく事でプログラムができあがる。その S 式の組み合わせ方がパズルっぽくて面白い。最初に書いたコードは、とりあえず動く事を目標に、大昔のBASIC風に書いてみたが、コードの見た目が美しくなく、Lisp のありがたみも感じられなかったので、その次からは、なるべく Lisp 風に書いてみた。自分で書いたコードは随分コンパクトになった。後になって自分で書いたコードが読めなくなるのではないかと危惧したが、さほどでもなかった。時間を置いたらどうなるかわからない。

 文法的な制限が少ないので、論理的な破綻さえなければ、実現したいアルゴリズムをダイレクトにコードに反映でき、多様なコードが書ける。

 Lisp には独特のコーディング手法の美学があるらしい。無名関数の多用、ループ構文より再帰。変数よりも高階関数。冗長なコードを嫌い凝縮されたコーディングを良しとする。これにより、コードがどんどん畳み込まれ、コンパクトになっていく。

 頭がついてこないので、もともと一日に書ける分量は限られる上、Lisp は行当たりのロジックの密度が高いので、半日考えて、数行しか書けない事もある。

 毎日、コードに手を入れていると、まるで、盆栽を手入れしているような気分になる。

 

 業務として、Lisp を扱う職場はあまりないし、初心者が入り込む隙間はないだろうが、趣味としていじくりまわすには、とても面白い。

コンピュータ、ソフトなければ、ただのハコ。

 ソフトのないコンピュータはただのハコだが、リソースのないアプリはただのゴミ。ゴミしか入っていないハコはゴミ箱。

 

 ただの箱から、ゴミ箱へ。これは進化と云えるのだろうか?

 

 先入れ先出し、First In First out の略の’FIFO’をもじって、'GIGO'と云うのがある。

 意味は、Gabage In Gabage Out:ゴミを入れたらゴミが出る。

 

 どこまでいっても、ゴミの山。

 

EmacsとOrg-modeのテスト運用

 仮想環境のシリアル接続で手間取ってしまったが、仮想環境への日本語対応版Emacsのインストールは数日前に終わってしまっている。

 Xorgまで入れてしまうと、悩ましくなるが、CUIはシンプルで良い。自分が何をやっているのかを、ある程度は把握できる。

 細かな問題はあるが、とりあえず使うだけなら、問題はない。

 理想的環境構築もいいが、まずは身近なところで、日常的に使うところから始めないと、環境を整えるだけで満足して終わってしまう。

 作業ログや思いつきをいろんなところに書き散らかしていて、ちょっとわけが判らなくなってしまいそうなので、ログや思いつきノートをEmacsのOrg-modeで書く事にした。Org-modeはEmacsをインストールしたら、デフォルトで付いてきた。以前試してみた事があるが、その後も順調に拡張されて、今では凄い事になっているらしい。

 元々はEmacsをストレスなく使いたくて、始めたようなものなので、Emacs上での作業は手段であり目的でもある。CUIでも求めていた環境の八割は満たされてしまうので、あとは暇に任せて、趣味的に足らないものを補って行くつもりで作業を続ける。

シリアル接続の失敗

 再インストールまでして試したかったのは、名前付きパイプによるシリアル接続。前回インストールした時は、どうしても接続できなかった。

 古いバージョンのVirtualBoxを残したまま、現行バージョンをインストールしたのが原因ではないかという疑念を解消するのが目的だ。

 

 まずは、Serial portをつかってtera termで接続する - yorozu に従って作業してみる。VirtualBoxのバージョンは古いが、容易に推測可能なので、読み替えて作業を進める。他にもいくつかシリアル接続の手順を解説しているサイトがあったが、内容はほぼ同じだった。

    1. テスト用に新規の仮想マシンを作成する。OSインストールは想定していないので、全てデフォルトで作成する。
    2. 作成した仮想マシンの設定からシリアルポートを選ぶ。「シリアルポートを有効化」にチェックを入れる。

      f:id:muh:20160923192954p:plain

    3. 「ポートモード」を「切断」から「ホストにパイプ」に変更。「存在するパイプ/ソケットに接続」がチェックされている事を確認して、「パス/アドレス」に名前付きパイプを設定する。ここでは'\\.\pipe\com_1'とする。

      f:id:muh:20160923194309p:plain

    4. 'Named Pipe TCP Proxy Utility' を Named Pipe TCP Proxy Utility からダウンロードする。別ウィンドウで妙なアンケートっぽいのが出てくるが、無視して閉じる。

    5. 'nptp_setup.zip' がダウンロードされるので、これを開いて、'npto.exe' を実行する。
    6. インストールの許可を聞いてくるので、許可すると、'Named Pipe TCP Proxy Utility' がインストールされる。
    7. 'Named Pipe TCP Proxy Utility' を起動する。

      f:id:muh:20160923215356p:plain

    8. 「edit」 →「new」で 'pipe name' と 'port' 番号を入力する。

      f:id:muh:20160923215940p:plain

    9. TeraTermを起動し、localhostのポート8080にtelnetで接続する。

      f:id:muh:20160923220354p:plain

    10.  TeraTermに 'attaching console, wait ,,,' と表示される。

      f:id:muh:20160923220554p:plain

    11.  Named pipe TCP Proxy Utility の表示は以下のとおり

      f:id:muh:20160923220751p:plain

    12.  新規に作った仮想マシンの電源を入れるとインストールメディアを聞いてくるが、指定した後、エラーになる。ホスト側の名前付きパイプを読めていないようだ。

    13. 状況は何も変わらない。ここで一旦、現行のVirtualBoxをアンイストールして旧バージョンの4.2.4をインストールした。
    14. とりあえず、Connected!まではいった。
      現行バージョン(5.16)では、シリアル接続用のドライバーがインストールされていないのかもしれない。但し、4.2.4では、connectするだけで、loginできない。
      仮想スクリーンの方は、Starting sshdで停まる。仮想スクリーンからEnterを入力すると続行するが、sshdは確立されず、TeraTermからはSSHでも接続できない。
    15. 結局、4.2.4では、sshdが確立できない。teratermでのシリアル接続は確認できたが、loginできない。一旦、5.1.6に戻して、sshdを確認してみる。少なくとも、teratermとnamed pipeに問題はないという事が判った。Virtual box側の問題だ。
    16. 5.1.6に戻したところ、sshdは問題なく立ち上がった。sshを取るかシリアルを取るかならsshを取るしかない。動く動かないはoracleが提供している仮想ドライバの関係かと思う。

 VirtualBoxは、普通に使うだけなら、デフォルトでインストールして、仮想マシンを作成して、ゲストOSをインストールすれば、それなりに動いてしまうが、細かいところで、バージョン毎に微妙な差異があるようだ。

 5.1.6には'VirtualBox 5.1.6 Oracle VM VirtualBox Extension Pack'が用意されている。USBやPXE等を使えるようにする為の拡張用のパッケージらしい。(5.0.26用もあるらしい)

 インストール方法は、ダウンロードした'Oracle_VM_VirtualBox_Extension_Pack-5.1.6-110634.vbox-extpack'をダブルクリックするだけ。

 拡張子'.vbox-extpack'がVirtualBoxと関連づけれているので、VirtualBoxが立ち上げり、処理を進めてくれる。

 VirtualBoxのメニューから「環境設定」→「機能拡張」を選び、'Oracle VM  VirtualBox Extension Pack’ が表示されている事を確認する。

f:id:muh:20160924030527p:plain

 ただ、この作業を行っても、シリアル接続の状況は変わらなかった。(USBには影響するかもしれない。)

 リリース毎に扱いが異なる以上、バージョンの異なる情報は参考程度に留めるべきで、マニュアルを頼りにするしかない。

 ネット上には、Oracle VM VirtualBox® にあるが、内容はメニューから表示されるHelpと同様である。また、インストール先のフォルダにもPDFがある。

 英語なので、大変だが、少しずつでも読んで理解するしかない。

 Guest Additionsの事は、まだ良く判っていないが、FreeBSDでは未だ使えないという事は判った。(Guest としてか Hostとしてか、NTとかDOSもあったから、Hostだろう。)

 

 シリアル接続については、もうひとつ古いバージョンのVirtualBoxがあるので、それで試したり、古いバージョンのVirtualBox上でFreeBSDをインストールしてみるというのを試してみたいが、とりあえず仮想環境でシリアル接続しなければならない必然性があまりない。

 他で出来たのに、同様の手順を踏んだのにもかかわらず、自分の環境でできないのが気持ちが悪かっただけだ。

 VirtualBoxのバージョンの問題であるらしいという事が判れば、とりあえず良しとする。

 

 まぁ動いているからいいというくらいの軽い気持ちで行かないと、先に進めない。シリアル接続の検証は、ここで一旦終了。

VitrtualBoxをアンインストールして、再インストール

 VirtualBoxをインストールする場合、以下のサイトから該当するパッケージをダウンロード。Windowsの場合は、'x86/amd64'を選択。全てデフォルトのインストールで問題ない。

Downloads – Oracle VM VirtualBox

 

 今回は、既にインストールしているVirtualBoxを一旦アンインストールして再インストールする事にした。

 理由は、現在のVirtualBoxをインストールした時、新旧バージョンを比較する為に旧バージョンを残したままインストールしたからだ。概ね問題なく動いているのだが、今なら、やり直してもたいした後戻りにはならない。

 

 

CClieanerで不要レジストリを削除。長く使っているので、いろいろ出てきたが、ばっさり削除。(バックアップを取っておけば良かった。)

ここで一応、Windowsを再起動。Chromeは立ち上がった。他のアプリで、立ち上がらないと困ってしまうものはないので、良しとする。

 

インストーラーはダウンロード済みのものを使う。

ダウンロードフォルダを確認すると、2012/01/25に4.1.8、2012/12/01に4.2.4、2014/09/15に5.1.6をダウンロードしている。

 

'VirtualBox-5.1.6-110634-Win.exe'をクリックして、インストールを開始。

1.

f:id:muh:20160923175320p:plain

実行(B)

2.

f:id:muh:20160923175417p:plain

Next>

3.

f:id:muh:20160923175528p:plain

Next>

(ここで前回は新旧を比較しようと、「Browse」をクリックして、インストール先を変更した。今回はデフォルトのままインストールを進める。)

4.

f:id:muh:20160923175914p:plain

Next>

5.

f:id:muh:20160923180019p:plain

Yes

6.

f:id:muh:20160923180112p:plain

Install

しばらく、待たされ、システム変更の許可を求められるので許可する。許可した後にインストールが始まる。

8.

f:id:muh:20160923181506p:plain

Finish

 

インストールが終わると、VitrualBoxが立ち上がる。また、デスクトップには実行ファイルのショートカットが置かれている。

 

以上で、インストールは終わり。

 

 想定外だったのは、アンインストール前に作成した仮想マシンが再インストール再起動後、残っていた事。VIrtualBoxはアンインストールしたが、仮想マシンの削除はしなかった為、残っている事に不思議はなかったが、3.でインストール先をデフォルトに変更したので、前回インストールした仮想マシンは表示されないのではないかと思っていた。

 'C:\Program Files\Oracle\Virtualnox5.1.6'は残っていたが、中は空になっている。→削除。

 仮想マシンはユーザーディレクトリ配下のvirtualboxの配下に生成されていた。(C:\Users\<username>\VirtualBox VMs\)

 システムのインストール場所を変更しても、仮想マシンのhost上のロケーションは変更されない。

 

ハードとソフト

 ソフトウェアにハードウェアが追いつかない時代の方が面白かった。

 

 最初に買ったエプソンのHC20。

www.epson.jp

 プログラマブル電卓の親玉のようなマシンだった。

 CPUは8bitの6800互換、ROM32KB/RAM16KB、外部記憶はマイクロカセットのテープ、ディスプレイはモノクロ液晶で4行しか表示できなかったが、プリンタが付いていて、レシートのようなロール紙に印字できた。

 OSなんてものはなくて、ROMにモニタープログラムとBASICが入っていた。よくあれで、BASICが学べたなと思うが、とりあえずテープにデータを記録するだけのプログラムを書き上げた。

 勿論は日本語は使えないし、テープドライブのR/Wは遅く、たぶん記憶容量も貧弱だったと思うが、個人がキーボード越しに打ち込めるデータなんて、たかが知れており、気にはならなかった。むしろ、自分が書いたプログラムと操作に従って、テープが早送りされたり巻き戻されたり、プリントアウトされたりというのは見ていて面白かった。

 実務にも、少し使ってみたが、残念な事に業務効率化には結びつかなかった。プログラミングは初心者だったし、なにより操作していると、人が集まってきって仕事にならなかった。

 HC20が16βⅡになって、日本語が使えるようになった。テープの代わりにフロッピーディスクが使えるようになり、実用的な用途が見えてきた。オフィスオートメーションなんてコトバも普通に聞かれるようになった。

 知り合いから、外付けのハードディスクを安く譲ってもらった。定価40万が半値の20万。容量は20MB。GBではなくMBだ。フロッピーディスクに漢字フォントを入れて使っていた時代に、20MBとはいえハードディスクの威力は絶大だった。

 ハードウェアの進化を眺めているのは楽しかった。新しいデバイスが導入する事で、今まで出来なかった事が出来るようになる。進化は早かった。

 

 そんな頃に読んだビットかインタフェースかの記事の一説が記憶に残っている。どこかの大学の先生の文章だったと思うが、「ハードはどうでもいい。待っていればそのうちどうにでもなる。しかしソフトはそうはいかない。」というような内容だった。

 その時は、研究者としての立場から経費面も含めての話だと、深く考えなかったが、今になって思えば、そんな矮小な話ではない。デバイスはリプレースで済むが、ソフトは積み重ねだ。

 テープは過去のデバイスだが、テープデバイスのシークェンシャルファイルの考え方はコンソールやプリンターと共通で、その延長線上に現代のネット社会がある。

 ソフトウェアは具体的なデバイスを抽象化し、それを実装し、組み合わせてシステム化し、運用するプロセスだ。実装は具体的なデバイスに依存するが、抽象化されてしまえば、基本的にはテープもインターネットも変わらない。

 システム化のレベルで一対一ならコンソールだし、一対多ならクラサバ、多対多ならインターネットになる。

 考え方の転換で、現実のシステムの在り方が変わる。云ってみれば、ルールを少し変えれば、サッカーがラグビーやアメフトに変わるようなものだ。

 

 ニワトリが先か卵が先かで云えば、ソフトがハードに先行するべきだ。

 

 ソフトウェアの進化はハードウェアの進化に較べて地味だ。一見派手に見える成果も過去の成果の焼き直しである場合が多い。

 ハードウェアの進化に伴う新たなデバイスのドライバの開発とセキュリティ確保に大半の労力を奪われているのかもしれない。バザール型の開発が進む以上、仕方がない事なのかもしれない。

 1990年に開発が始まったGNU Hurdは、まだ正式版がリリースされていない。日本発のTRONは工業用の組み込みOSとしては一定の成果を上げているらしいが、その後も地道に活動は続けているようだが、情報は限られている。

 

  ソフトウェアのトップレベルは、総論的な「考え方」「捉え方」で、そこから段階的に具体化される。現実世界での具体的な動作が目的となるので、ソフトウェアはレトロスペクティブな構造になる。それはアプリでもOSでも変わらない。

 

 で、結局、何が云いたいかといえば、ハードウェアを入手するには、費用もかかるし、場所も取る。抽象化レベルでソフトウェアを弄り回すのであれば、費用も場所もかからない。ハードの入手は、実装レベルでの稼動が必要になった時に考えればよい。

 M.2対応のSSDとか16スレッドのCPUとか魅力的なハードウェアは多々あるが、使うあてがないのに導入しても仕方がない。

 つまり、ハードウェアはソフトウェアに追いつかないくらいの方が、夢があって楽しいという言い訳めいた結論になる。

 

Oracle VirtualBoxでVirtualBSD

 4~5年前、自宅用に買った新しいPCで、Emacsを使う為に、VirtualBSDを試した。

news.mynavi.jp

  VirtualBSDは仮想環境用にセットアップされたディストリビュージョンで、インストールしたら、Xの画面が立ち上がった。ちょっと出来上がり過ぎていて、逆に使いづらかった。ノートPCの仮想環境にGimpやらOfficeは、荷が重い。

 

 Emacsはパッケージされていなかったので、セットアップ後インストールしたのだが、日本語入力環境に手間取っているうちに、面倒になりほったらかしてしまった。最近になって、立ち上げてみたら、動作不良。どこかで、適当な作業をして、そのままにしてしまったらしい。修復しようと思ったが、当時のログがいい加減で、どこから手をつけて良いのか判らない。

 

 調べてみたら、VirtualBoxFreeBSDも新版になっていて、わざわざ昔の環境を復元するよりは、新たにインストールし直した方が良い。初心に立ち返って、まずはEmacsを気分良く使う為に、VirtualBoxFreeBSDを再インストールする事にした。

 

  欲しいのは、WindowsのようなFreeBSDではない。往年のUNIXを彷彿させてくれる環境だ。Windowsに出来る事はWindowsに任せればよい。