Chez Scheme
たまたま見ていたGeekなページで、IPv6の普及が一番進んでるのはベルギーとかと解説 されてた。元ネタはgoogleで、公表値は50%とか。2人に一人が、先進的な利用をしてる わけだな。
かめとうさぎを生んだ国として、恥ずかしくないか? > そーむのおばちゃん&あべちゃん。
そして、同blogの著者の方が 「ポートとソケットがわかればインターネットがわかる」を書きました なんて、宣伝されてた。どんな本?
オイラーも最近IPv6やったばかりですからね。目次をざっと見て行くと、
getaddrinfo, ping6, dig, wireshark なんて言うのが出て来てた。オイラーも期せずして 同じものを取り上げているな。tcpdumpはオイラーは使ったけど、現代風読者向けにと言う魂胆で、 無視されてる。そして、オイラーも著者も無視したものに、nslookupがある。
NICに振ったipaddressを調べるコマンドは出てきていなけど、何を紹介してるのだろう? プチ興味が有るな。手に取って確かめてみたいぞ。
ああ、興味と言えば、getaddrinfoって、ライブラリィーなんですな。どこら辺にあるか、 ちょいとgdbで当たってみました。(nc -l ::1 1234)
こういう時、OpenBSDは非常に便利。ライブラリィーの中へ平気で入って行けますから。
(gdb) bt #0 *_libc_getaddrinfo (hostname=0x7f7ffffdebca "::1", servname=0x7f7ffffdebce \ "1234", hints=0x7f7ffffda650, res=0x7f7ffffda618) at /usr/src/lib/libc/asr/geta\ ddrinfo.c:30 #1 0x0000123ec3405b79 in local_listen (host=0x7f7ffffdebca "::1", port=0x7f7ff\ ffdebce "1234", hints=...) at netcat.c:935 #2 0x0000123ec3404926 in main (argc=2, argv=0x7f7ffffdea58) at netcat.c:508
で、入って行って、いきなり迷子になりました。細かい土地勘が無いとだめですな。
crunchgenが自動生成したCソース
前回の積み残しと言うか、見るのを忘れていたやつ。
mainから呼ばれるのがこれ
crunched_main(int argc, char **argv, char **envp) { if (argc <= 1) crunched_usage(); return crunched_main2(argv[1], argc-1, argv+1, envp); }
そして、こちらが動き出す。渡ってくる引数は一つずらしてあるのが味噌。
static int crunched_main2(char *progname, int argc, char **argv, char **envp) { struct stub *ep; if (progname == NULL || *progname == '\0') crunched_usage(); for (ep = entry_points; ep->name != NULL; ep++) if (!strcmp(progname, ep->name)) break; if (ep->name) return ep->f(argc, argv, envp); fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, progname); crunched_usage(); }
テーブルを検索して見つからない時に、元になったファイルを表示するって、面白い 仕掛けだ。
busybox
ついでなので、リナ方面で流行っているというbusyboxもちょいと調べておく。
組み込みLinuxの十徳ナイフ。多数のコマンドを集めたBusyBoxの概要と使い方
やっぱりスイス アーミー ナイフって言ってるね。オイラーも昔ドイツに駐在してた時、 本物のスイス アーミー ナイフを土産に買ってきて、山行に携帯した事があるけど、 便利だったよ。ワインのコルク抜きが付いていたり、爪切りが有ったり、爪楊枝が 付いていたりした。爪楊枝って日本独特のものと思っていたけど、そうでもないのね。
そして、こちらは衝撃的な記事。 Windowsで仮想やCygwinなしでUnixコマンドを使う
これ、パイプやリダイレクトを使えるのだろうか? shellがサポートしてるかと、更に下層に あるOSのシステムコールがどうなっているかだな。下層のOSと言えば、この場合はWindows。 リダイレクトはあるはずだけど、パイプに偽物だったような(隠れた所で、ファイル経由 してた)。今は改善されてるのかな。
ああ、こういう事をやりだすと、セッションリーダーがなんたらこうたらと始まって、収拾が つかなくなる可能性大。ただ、パイプを使って、フィルターが簡単に組めればいいんで、 難しい事は、うっちゃっていいぞ。
今号の日経Linuxで特集してる、『荒業をWinで使う Windows版Linux超活用』が、霞んで しまうぐらいの衝撃が有ると思うんだけど、メディアの都合で、上記のようなものは、紹介 されないのね。(笑)
Chez Scheme
更にネットをうろうろしてたら、面白いものを見つけた。
Chez Scheme is Now Open Source
速い事で定評がある Chez Schemeがオープンソースになりました。しかもそのスポンサーが シスコってのが意味深。
シスコと言えば、サンフランシスコの略、、、、じゃなくて、当地で創業したIT機器メーカー。 地元に敬意をはらって、地名の一部を社名にした。ついでに、会社のロゴも、ゴールデンブリッジを図案化した。このメーカーのルーターを使わないと、今やインターネットは成り立たない ぐらい影響力を持つ会社。
そんな会社にも弱点が有った。シスコのルーター上で動くスクリプト類を何語で書くか、頭を 悩ましていたのさ。日本で有名なYAMAHAのルーターは、Luaを採用して成功を収めている。
日本に右へ倣えでは、沽券に関わる。そんな時、Chez Schemeの作者であるdybvig教授が やってた会社を手放す事にした。クリントンおばさん宜しく、老後は孫の面倒でもみて 楽しく過ごすわよみたいに、考えたんだろうね。そこに目を付けたシスコが、そんじゃ 後は引き受けましょ。
でも、シスコにscheme屋は居ない。だったら、オープンソースにして、世界のハッカーの 力を借りようってね。と、オイラーは想像したよ。
何はともあれ、教授が会社をやってた頃は、petiteって言うインタープリター版は無料。 この有償版は、インタープリターに加えて、コンパイラーが使える。
素直に記事を読めば、このコンパイラー版がOSSになったって事。本当かどうか、Debianで やってみる。
だって、Chez Scheme Version 8.4の頃は、FreeBSDや OpenBSDもサポートしてたんだけど、OSSになった Chez Scheme Version 9.4 Release Notes では、BSD系が抜け落ちてしまっているんだもん。その代わり、ARM版が入っているのは、時代の 流れ。
tar玉を取ってきて、configすると、curlが無いって文句を言われた。多分実行中にネットから お取り寄せでもするんだろうね。で、curlを入れてやり直すと、別のconfigエラーが発生。
ちょいと、どんな事をやってるか、trace。なんせ、schemeはtraceが大好きですから。
sakae@debian:~/ChezScheme-9.4$ sh -x configure : + [ a6le = -o ! -f boot/a6le/scheme.boot ] + [ -d .git ] + [ ! -f nanopass/nanopass.ss ] + rmdir nanopass rmdir: `nanopass' を削除できません: そのようなファイルやディレクトリはありません + exit 1
消すdirが有りませんって、矛盾してないか。そんな事で文句を言って来るとは、大学の先生の 深遠な配慮だろうか?
だったら、ダミーを置いて、騙しちゃえ。
sakae@debian:~/ChezScheme-9.4$ mkdir nanopass sakae@debian:~/ChezScheme-9.4$ ./configure % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 140 0 140 0 0 156 0 --:--:-- --:--:-- --:--:-- 156 100 3726k 0 3726k 0 0 404k 0 --:--:-- 0:00:09 --:--:-- 569k % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 119 0 119 0 0 139 0 --:--:-- --:--:-- --:--:-- 139 100 590k 100 590k 0 0 185k 0 0:00:03 0:00:03 --:--:-- 406k % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 119 0 119 0 0 134 0 --:--:-- --:--:-- --:--:-- 134 100 206k 0 206k 0 0 83304 0 --:--:-- 0:00:02 --:--:-- 170k
何をdownloadしたか報告もしないで、ステータスだけ表示するcurlは、何処かの某OSに 似てるな。wgetの方がunixらしいと思うぞ。
そんな事で、configも無事に済んで、コンパイルを始めたら、 Xlib.h が無いと言ってエラーストップ。多分、 libx11-dev ぐらいを入れてやればいいだろうって思って入れたら、先に進んだ。
この件、コミュニティーサイトで、噛みついている人がいたね。
まあ、schemeなんて、emacsから使うものだから、GUIなんて不要ってのには激同意。 で、このスレッドの最後に、御大将がお出ましして、収めていたぞ。
sakae@debian:~$ petite Petite Chez Scheme Version 9.4 Copyright 1984-2016 Cisco Systems, Inc. >
おお、バナーがシスコになってる。
sakae@debian:~/ChezScheme-9.4/examples$ scheme Chez Scheme Version 9.4 Copyright 1984-2016 Cisco Systems, Inc. -------------------------------------------------------------------------------- compile compile-profile compile-compressed compile-program compile-file compile-program-handler compile-file-message compile-script compile-imported-libraries compile-to-file compile-interpret-simple compile-to-port compile-library compile-whole-library compile-library-handler compile-whole-program compile-port -------------------------------------------------------------------------------- > (compile-file "fib.ss") compiling fib.ss with output to fib.so
上記、compileTAB して、補完が利いてるのを確認に図。そして、コンパイラーもちゃんと 動いた。後は、コンパイルして、シングルバイナリーをどうやって作るかだな。
そんなの、 Chez Scheme Version 9 User's Guideの何処かに書いてあるだろう。探してみれ。
(make-boot-file "app.boot" '("scheme" "petite") "app.so")
Section 2.8.あたりにある、こんなのかな?
情報感度の高い#:g1さんは、とっくに察知されて、試しておられた。やはり専門家は違う。
#:g1: Chez Scheme がオープンソース化されたので試してみる
まずは、インタープリター版
sakae@debian:~$ petite Petite Chez Scheme Version 9.4 Copyright 1984-2016 Cisco Systems, Inc. > (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) > (time (fib 40)) (time (fib 40)) no collections 8.450009382s elapsed cpu time 8.456771010s elapsed real time 0 bytes allocated 102334155
今度はコンパイラー版。JITを進化させて、即ネイティブコードに落としているとな。
sakae@debian:~$ scheme Chez Scheme Version 9.4 Copyright 1984-2016 Cisco Systems, Inc. > (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) > (time (fib 40)) (time (fib 40)) no collections 1.130246366s elapsed cpu time 1.131452468s elapsed real time 0 bytes allocated 102334155
これは良い。でも、速すぎると、コードを工夫しないで良しとしちゃうから、最後の 手段にするのが良かろう。おまけで、Fedora 24でもやってみた。
(time (fib 40)) no collections 1.097802243s elapsed cpu time 1.108102106s elapsed real time 0 bytes allocated
DebianはVBOXに入れてて、FedoraはVMWAREに入っているんだけど、仮想マシンの出来具合の 差かなあ。参考値として、DebianのC語で、-O3の結果。
sakae@debian:/tmp$ time ./a.out 102334155 real 0m0.382s user 0m0.380s sys 0m0.000s
Debianに初回に入れたのはスレッド無し。#:g1 さんに倣って、スレッド版にしたんだけど、 コンパイルの最後が
(if `cmp -s ../boot/ta6le/equates.h ../boot/ta6le/equates.h.bak`;\ then mv -f ../boot/ta6le/equates.h.bak ../boot/ta6le/equates.h;\ else rm -f ../boot/ta6le/equates.h.bak; fi) bootfile comparison succeeded make restoreboot mv -f ../boot/ta6le/sbb ../boot/ta6le/petite.boot mv -f ../boot/ta6le/scb ../boot/ta6le/scheme.boot make resetbootlinks touch bootstrap
そして、このあたりがインストールの工程。
(cd c ; make) gcc -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre -c -DX86_64 -I../boot/ta6le -I../zlib io.c gcc -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre -c -DX86_64 -I../boot/ta6le -I../zlib new-io.c gcc -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre -c -DX86_64 -I../boot/ta6le -I../zlib scheme.c ld -melf_x86_64 -r -X -o ../boot/ta6le/kernel.o statics.o segment.o alloc.o syol.o intern.o gcwrapper.o gc-ocd.o gc-oce.o number.o schsig.o io.o new-io.o prt.o fasl.o stats.o foreign.o prim.o prim5.o flushcache.o schlib.o thread.o expitor.o scheme.o i3le.o ../zlib/libz.a gcc -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre -rdynamic -o ../bin/ta6le/scheme ../boot/ta6le/kernel.o ../boot/ta6le/main.olm -ldl -lncurses -lpthread -lrt (cd s ; make bootstrap) make[2]: 'bootstrap' is up to date. make -f Mf-install ./installsh -o "" -g "" -m 555 bin/ta6le/scheme /usr/bin/scheme
さあ、残骸漁りをしてみよう。掘り出し物が見つかるかも。
来年のトレンドはどうなる? そんなのカレンダーを見ておけ
clojureなカレンダーもあるけど、あいつは土台がアレなんで、無視の方向です。
とか言ってたら、
Lisp系自作言語のx86_64コンパイラを作り始めたときの話
こんなのを発見。面白そう。ワクワク。
ISPな方は、シスコがschemeに舵を切ったので、先行手配しておくのが吉。
sakae@debian:/tmp$ cat b.ss (import (rnrs)) (display "What's up?\n")
sakae@debian:/tmp$ echo '(compile-program "b.ss")' | scheme -q compiling b.ss with output to b.so () sakae@debian:/tmp$ scheme --program b.so What's up?
こんな風にして、やたらカッコの多いスクリプトをコンパイルしgzipで圧縮されたファイルが 作られます。これはもう異次元な世界。
実行は、親が居ないと出来ないという難点はあります。なに、来年からは、iosをアップデート すれば、紛れ込んできますからご心配なく。
所で、シスコのルーターのファーム部分は専用の石を使ってるだろうけど、汎用のCPUって 何? ひょっとしてPowerPCな石かな。突然、辺鄙な石がサポートされるようになったんで、 疑っているのさ。
パケットの交通整理用シスコのルーターの趣味れーたーって、何処かに転がっていないかな。 確か、昔見たことがあるように思うんだけど。