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