GaucheとかSECDとか

ウブが4月末に出て、ダウンロード騒ぎが治まったと思うので、サーバー版とやらを入れてみた。 種CDは最初、本家へ取りに行ったんだけど、線路抵抗が高くてさっぱりデータが流れてこないので、 KDDIから落とした。

幾ら光で早くなったって、途中が細かったり、サーバーの出力インピーダンスが高かったりする と光の性能を十分生かし切れないので注意せませう。基本は、中学校で習うオームの法則ですな。 コツは、国内にある大手の電池(サーバー)を使う事です。北陸大学とか、KDDIあたりがお勧め。

仮想箱にいま入れてる。起動すると、Fnキーで、言語を選べたりして、Iでインストール開始。 LVMはよく知らないので、そんなの無しのEXT4にした。

サーバー版って事で、DNSするかとかLAMPするかとか選べるんだけど、おいらはsshdとマニュアル セットだけを選んだ。追加は有るかと、debian風のマネージャが出てきたけど、昔あれで泣かされた 事があるので、その手には乗らなかったよ。

sakae@ubuntu:~$ python
Python 2.7.3 (default, Apr 20 2012, 22:44:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

うむ、新しいやつが入ってるな。3系はまだウブにも認知されていない不幸な子なのね。2系と3系 じゃ毛色が違うからなあ。

sakae@ubuntu:~$ gcc -v
プログラム 'gcc' は以下のパッケージで見つかりました:
 * gcc
 * pentium-builder
次の操作を試してください: sudo apt-get install <選択したパッケージ>
sakae@ubuntu:~$ sudo apt-get install gcc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  binutils cpp cpp-4.6 gcc-4.6 libc-dev-bin libc6-dev libgomp1 libmpc2
  libmpfr4 libquadmath0 linux-libc-dev manpages-dev
提案パッケージ:
  binutils-doc cpp-doc gcc-4.6-locales gcc-multilib make autoconf automake1.9
  libtool flex bison gdb gcc-doc gcc-4.6-multilib libmudflap0-4.6-dev
  gcc-4.6-doc libgcc1-dbg libgomp1-dbg libquadmath0-dbg libmudflap0-dbg
  binutils-gold glibc-doc
以下のパッケージが新たにインストールされます:
  binutils cpp cpp-4.6 gcc gcc-4.6 libc-dev-bin libc6-dev libgomp1 libmpc2
  libmpfr4 libquadmath0 linux-libc-dev manpages-dev
アップグレード: 0 個、新規インストール: 13 個、削除: 0 個、保留: 0 個。
22.8 MB のアーカイブを取得する必要があります。
この操作後に追加で 60.9 MB のディスク容量が消費されます。
続行しますか [Y/n]?

後は、ひたすら使う物だけ入れていけばいいな。 デフォでw3mが入ってるのはCentOSと方向が違うのね。X関係はopenboxを入れてあげた。メニューが 化けたので、IPAフォントを入れた。日本語をロケールを選んでいたんだから、気を利かせて自動 で入れてよねってのは、ちょっと強欲過ぎ?

新しい ArchBang を試す

前回ArchBangを試した時に使ったのはテスト版だった。正式版が出てるので、改めて入れてみた。 今度は、仮想箱に入れてみたんだけど。。。

デフォのメモリー設定(512M)では、暴走しちゃう。メモリー割り当てを1Gにしたら、すんなり 入った。いつの間にか、メモリー一杯頂戴ってのは、GUI版の性だのう。

VMWARE Playerに入れた時のような、時計が合わない問題もなく、起動時から Asia/Tokyo時間に なってたよ。ハードクロックはUTCだけどね。

後嬉しいのは、仮想箱のシームレスモードが使える事。こやつを選ぶと、Windows7上の画面に ArchBangの画面が重なってくれる。Bang側のメニュー画面がそのまま使えるので、有り難い。 気分は、正にArchBangですよ。但し、割り当てたメモリーがしっかりWindows7 側から抜き取られるので、メモリーがふんだんに載っていないとキツイまも。 何せ、Windowsでもswapさせたら負けですから、注意されたし。

これでWindows顔負けな事が出来るようになったので、Linux側は、IPv6を殺しておく事にする。

[sakae@atchbang ~]$ cat /etc/sysctl.d/ipv6.conf
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

但し、ブリッジモードで使うと、Windows7の設定がそのまま継承されちゃうみたいで、IPv6は 生きたままになるみたい。よって、NATで使う分には、Windowsとは全く縁が切れた世界となる。

で困るのがNATの場合は、外からssh接続出来ない事。そんな事もあろうかと仮想箱はちゃんと 考えて設計されてた。箱のネットワーク設定の所で、高度な設定を選び、ポート飛ばしを やるんだ。Hostのポートを4649、ゲスト(ArchLinux側)のポートを22に設定。こうしておいて 外からlocalhost(Windows上から)若しくはWindows機のIPAddress(VMware上のFreeBSD等の場合)を 指定して4649へ接続すると、箱内へは22番に置き換わって接続されるよ。 これで、めでたしめでたし。

ssh -p 4649 Windows機のIPAddress
scp -P 4649 ...                      ; 大文字のPでportを指定する

なお、世の中には、Windows側と積極的に仲良くしましょって言う、 andlinuxなんてのもあるから、お好きにどーぞ。

Gauche on FreeBSD 9.0R

待望のGaucheが新しくなってた。FreeBSD9で動くかやってみると、コンパイル中にGCでエラー ですよ。とてつもないメモリーを要求して失敗してるんだ。

これ、こういう原因なんだ。

[sakae@secd ~/Gauche-0.9.3.2]$ ./configure 
configure: WARNING: "FreeBSD does not yet fully support threads with Boehm GC."

頑張れFreeBSD 負ける sakaeここにあり

そんなこんなで、機能を削って入れたよ。

[sakae@secd ~/Gauche-0.9.3.2]$ ./configure  --enable-threads=none  --with-iconv=/usr/local   --enable-tls=none
[sakae@secd ~/Gauche-0.9.3.2]$ gmake 
[sakae@secd ~/Gauche-0.9.3.2]$ gmake test
    :
gmake[1]: ディレクトリ `/usr/home/sakae/Gauche-0.9.3.2/src' から出ます
Total: 12635 tests, 12635 passed,     0 failed,     0 aborted.
[sakae@secd ~]$ gosh -V
Gauche scheme shell, version 0.9.3.2 [utf-8], i386-unknown-freebsd9.0

世の中、Linuxにシフトしてるなぁ。

Haskell de scheme

『すごいHaskellたのしく学ぼう!』 なんて言うすごい本が出たようです。そしてその本の 発刊記念パーティが行われていたようです。 この本は、 Learn You a Haskell for Great Good!: A Beginner's Guide の翻訳本とか。おいらの場合は既に著名はHaskell本を何冊も持っているから、多分買わないとは 思うけど。。。

それよりも、同じ訳なら、こちらの方が楽しそうだな。 48時間でScheme ですもの。一粒で2度美味しい。(グリコみたい)昔、Haskellをやってた時、たまたまこれの 原本を見つけて、実習したものだ。でも、使わないとHaskellも錆付いちゃうね。 もどきは、gaucheにも一部取り入れられているから、ぼちぼちやってこう。

関数呼び出しをチェインする$マクロを正式にサポートしました。 
モジュールgauche.experimental.appで長らく実験されてたものです。 
このマクロを使うと(f a b (g c d (h i j)))を 
($ f a b $ g c d $ h i j)と書くことができます。
文字数的には 後者の方が長いのですが、特に関数のネストが深くなった時に、 
後者の方がインデントしやすいことが多いです。 

次バージョンでは、きっとポイントフリースタイルが使えるようになるに違いない。 きっと、あの人が強くPUSHするだろうね。

SECDマシン

gaucheへの不満として、ネイティブなコードに落ちないってのがあるようだ。2chとかを 見てると、年に数回出て来る。そんなにネイティブにこだわるなら、chickenでも使えば いいのにと思うぞ。あるいは、同じ括弧族でsbclって言う手もあるよ。

ネイティブって言うと、見るのもいやになる、糞マシン語ですな。そんなの見るなら、 清く正しく、SICPの第5章でも観賞した方がよっぽど為になるぞ。何せレジスタマシンを 設計して、その上で、インタプリタやらコンパイラまで書いてみせてくれてますから!

レジスタマシンと言えば、最近出たmrubyも そうですね。Luaとそっくりで話題になってました。まあ、それは兎も角、話題を拡げ過ぎるのも あれなんで、 もう一度、同章を読み直してみるかな。それとも、、、

Scheme Programming の膨大な資料中の、 micro Scheme コンパイラの作成 編あたりがいいかな。

ここで使われている、SECDマシンって、昔から有るんですね。おいらのUnixマシンのホスト名は、 Scheme/Lispの関数から貰ってくる事にしてて(car,atom,cons,nilとか)、最近では、secdなんて 名前を拝借してます。(tってのは、まだ採用した事無いなぁ)

SECDには、どんなマシン語が有るかと言うのも上記で解説されてて、全体を俯瞰するには 好都合。各命令も解説されてる。

ld はレジスタ E から局所変数の値 v を求めてスタックに積む命令です。

s e (ld (i . j) . c) d => (v . s) e c d
v = (get-lvar e i j)

ld の次の命令はドットペア (i . j) で、局所変数の位置を i と j で表しています。
今回のプログラムでは関数 get-lvar で局所変数の値を求めます。 

これを見ると、forth語の命令表みたいですなあ。=> の左側が、実行前、右側が実行後。 この場合、命令の説明は、2行に渡って行われているけど、この2行の間に、whereが 入っていると思えば、Haskellチックにも読めるな。まあ、基礎の部分の命令ですから、 どこかの糞CPUみたいに、複雑な動作はしないんで、すっきりと読み解ける。

かの、_ko1 さん、(知ってる人は、はあ、あの人ね)は、こういう低レイヤの命令を 自分で定義して、あのLLを実行しちゃう、素晴らしいデザイナーさんだったりします。 あの方、今も新しい命令を考えているのでしょうかね。JITが簡単に実現出来る ような仕掛けとか(マクロとかかな)

命令の定義さえ出来てしまえば、その実装はあっけないぐらいに簡単だ。上記のURLでは、 仮想マシンの作成って事で説明されている。これ、一昔前のrubyのevalの中にも、同じ ようなやつが出てましたね。命令を一つ取り出して、それをcaseで判定して振り分けて いるだけ。止まれのstopが出て来るか、そんな命令知らないよーってなるまで、 ぐるぐる回ってるだね。

で、どんなSchemeを実装してるかと言うと、基本の、car,cdr,cons,eq?,pair?だけ。 Lispなら、pair?ってのが、atom になるだけだな。以上の5手続きと、若干の構文 だけあれば、mapとかfilterまで実装出来るよって、見せてくれてます。

どこから、どこまでも、無色透明で分かり易い。こういうのいいですなあ。 あれ? GC無いじゃんってのは、まあSICPでも、最後の方にちらっと出てくるだけ なんで、今は気にしなくても大丈夫。gauche神が宜しくやってくれますから。

WindowsでもGauche-tk

gaucheが新しくなったおかげで、WindowsでもGauche-tkが動くはず。 早速やってみんべー。

tk.scmを取り出して、C:\Gauche-0.9.3.2\share\gauche-0.9\site\lib の中へ入れて置く。 次は、Tcl/Tkを用意せんとな。Windows用って事で検索すると、アクティブTclあたりを入れる のが上等手段(うん、なかなかぴったりな誤変換だ)らしいんだけど、面倒なんで止めた。

昔、Rを入れた時に付属してたよなー、なんて事を思い出したのだ。調べたらちゃんと入って いた。いいね、何とかgtkみたいに大騒ぎしなくてもいいから。

;; simple button example

(use tk)
(wish-path "C:\\Program Files\\R\\R-2.15.0\\Tcl\\bin\\wish85.exe")
(with-module tk (set! *tk-debug* #t))

(tk-init '())
(tk-button '.b :text "Click me" :command (^[] (print "Yeah!")))
(tk-pack '.b)
(tk-mainloop)

サンプルで付いてた、button.scmに、wish-path(で、tclの場所)と、with-module(で、goshと tclのやり取り表示)を追加した。走らせてみる。

C:\homes\shirok-Gauche-tk\examples>gosh button.scm
> gauche__tk__do button .b -text "Click me" -command "gauche__tk__callback 1 "
< ok
.b
> gauche__tk__do pack .b
< ok

! 1
Yeah!

うん、動いた。これでGUIもバッチリだな。なお、wish-pathの指定は、unix風に、"c:/program files/r/..." のように書いてもいけるはず。

これでWindowsでGUIもバッチリと喜びいさんで、上記スクリプトをダブルクリック。あれ、wish85 コンソールが出てきちゃたよ。困った時の神様頼み。

shiro
#
私のいじった感じでは、wish.exeの起動は出来てて、その後でパイプを通してwishに
Gaucheからコマンドを送ろうとしたところでGaucheが死んでるようです 
(したがってデフォルトのwish窓が残る)。これは相手がwishでなくても、
例えばgosh.exeをgosh-noconsole.exeからrun-processしてパイプで通信しようとした
場合でも起きるので、gosh-noconsole側の問題じゃないかと見当をつけています。

根が深そう。Windowsの闇か。回避策を提示してくれる方が居た。

natsutan
#
当面の回避策としては、

Set shell = WScript.CreateObject("WScript.Shell")
shell.Run "gosh.exe C:\home\tmp\button.scm", 0, false

の2行だけのファイルを作り、 button.vbsのように拡張子vbsで保存します。
後は、このvbsファイルをダブルクリックすればDOS窓無しでGauche-Tkのアプリが
立ち上がります。

嗚呼、ありがたや、ありがたや。

ちなみに、0,falseって言う謎の呪文は、0 がwindowを非表示にする、falseが非同期で プログラムを実行するの意味との事。

すると、1だと白黒でちょっとだけ表示。2だと透けた画面に表示、 3だとカラーで表示とかかな? 嘘言っちゃいけないね

まあ、ともかくこれで、 calc.scm を試せそうだ。 (親切な解説)

とか、書いていたらHEADのChangeLogにこんなのが、、、

        * src/port.c (Scm__SetupPortsForWindows): Protect the origina
          scm_stdout and scm_stderr to be GC-ed, for not having fd 1 and 2
          open causes problems when spawning child processes and communicate
          with them via pipes.  Thanks to @natsutan for tracking the problem.
        * src/main.c (init_console): make sure fd 0, 1, and 2 are redirected
          to NUL in no console mode.

早速試してみるかな。0.9.3.3