CiSE
こんな田舎に住んでしても、結構いろいろな勧誘が来る。この間は、何とか互助会から来たぞ。 葬式の未来予約ですな。人間確実に死ぬから、その争奪戦はすさまじいものがあるな。
母が亡くなった時は、事前にその筋に入っていたとかで、葬式がスムーズに進んだ。先の事、 縁起が悪いわいと避けていないで、検討しとくかな。これもそれも将来への投資だもんなあ。
法事が有った。参列者の中に現役の消防士がいた。消防士と言うと、9.11テロの時の消防士の 手記を読んだ事があるけど、命がけ体力勝負の世界みたいに思ってた。
くだんの消防士は若干太りぎみ、若いのに中性脂肪が高いとか注意されてるとか。彼の先輩は 高血圧症らしい。体力を維持するということで、一番若い隊員に合わせた食事が提供されてるとか。 団結が命らしいので、同じ釜の飯を(残さず)食べるものだから、必然的にカロリー過多に なるらしい。
で、高血圧の人は、ごぼう茶が血圧低下に効果的って事で、毎日飲んでいるらしい。 ごぼうをささがけ切りし、2-3日天日で乾燥。それをプライパンで炒って作るらしい。おいらも 試してみようかな。
3月は連続で乾燥注意報が発令され、山火事が相次いで大変だったとか。消防車が入れない ような所だと、ふもとからホースを永遠とつないで行くらしい。 一本のホースは直径6センチ、20メートル。それを50本とか連結する事もあるらしい。乾燥したホース だと、4キログラム。何本もかついで山を登るって、真さに体力勝負の世界だな。水が入ったホース だと、70キログラムにもなるとか。
小さい火災だと、ホースを連結するより、水が入ったポンプをかついで現場に行く事も多いとか。 タンクは20キログラムの水が入るらしいぞ。恐ろしい体力の世界だこと。
ホースは超高圧の水を巻くわけだから、作用反作用の法則に負けないようにしないと、ホースが踊り出す らしい。尤も、この圧力を利用して、火災の為に強度が低下している屋根とか壁を壊す事も あるそうだ。江戸時代の火消しは、延焼を防ぐため、取り壊しも消火のうちって事らしかった ので、それが現代消火にも受け継がれているのかな。
居合わせた坊さんとも話しをしたぞ。本堂にコウモリが住み着いているとか。コウモリは蚊を さかんに食べてくれる(500匹/日も食べるらしい)ので、ありがたいんだけど、糞を撒き散らすのには はなはだ困ってたとか。絶滅種のレッドブックにも載ってるそうなんで、無闇に追い払うのも 憚られる。
そこで、住職は、本堂の掃除にルンパを導入したそうな。堂が広いので1台では足りず、4台で 並列ガーベッジコレクションさせているそうな。なかなかハイテクだ事。
冒頭の勧誘話、キリスト系も多いな、そしてキャンバスでは、こんなのも。 勧誘注意
python 2to3
Manjaroなんて言う新しい器を作ったので、ちょいと新しい事をしたい。以前Little smalltalkの 説明書を見てた時、pythonのあの人が出てた。最近はPython2からPython3への布教活動で忙しいらしい。
Manjaroにもpython2って名前のやつとただのpythonって名前(python3)のやつが入っている。いわゆるダブル・スタンダード状態。 親分が幾ら笛を吹いたって、下っ端(のモジュールとかアプリ)が尽いてこないとダメだからなあ。
おいらもpythonで書いた唯一のアプリを3対応にして協力してあげようと昔から狙ってたんだけど、 使ってるモジュールが対応してないんで諦めてたんだ。でも、最近対応したみたい。
[sakae@manjaro ~]$ cd /var/lib/pacman/local/ [sakae@manjaro local]$ ls -d python-* python-3.3.0-3/ python-matplotlib-1.2.0-8/ python-cairo-1.10.0-2/ python-numpy-1.7.0-2/ python-dateutil-2.1-6/ python-pyparsing-2.0.0-1/ python-dbus-1.1.1-2/ python-pytz-2012j-1/ python-dbus-common-1.1.1-2/ python-scipy-0.11.0-4/ python-distribute-0.6.34-1/ python-sip-4.14.4-1/ python-gobject-3.4.2-1/ python-six-1.2.0-2/
肝は、python-scipyとpython-matplotlibかな。やっとですよ。 早速、(無謀にも)実行してみよう。ああ、実行じゃなくてもぐら叩きゲームね。まずエラーの 洗礼を受けたのは、こういうやつ。
[sakae@manjaro py]$ python blood.py File "blood.py", line 24 print 'Saved {0} datas!!'.format(len(dat)) ^ SyntaxError: invalid syntax
printは文から式に変わるという大変貌を遂げているんだよ。地道に括弧でくくってあげたら、 エラーは出なくなった。でも、実行するとすぐに終了しちゃう。なんで? 天下のIBMさんもPython3には注目 してんのね。
自前のrepl内で、いわゆるreadに、
al = raw_input(mm + '> ').strip()
を使ってた。けど、Python3では、ただのinputにしなきゃいけないみたい。これをクリアしたら、 プロンプトは出てくるようになった。早速グラフ表示コマンドを入力してみる。すると、今度は、 何も表示せずにプロンプトに戻ってしまう。ここからは、debuggerでも使って、追いかけていく鹿。
[sakae@manjaro py]$ python -m pdb blood.py > /home/sakae/py/blood.py(5)<module>() -> yy = '13' # for logging file name and csv date padding 20yy (Pdb) b main Breakpoint 1 at /home/sakae/py/blood.py:187 (Pdb) c > /home/sakae/py/blood.py(189)main() -> cmds = {
地道に追って行ったら、Haskのキーをsortしてる所で失敗してる事が判明。先人の調査によれば、 Hashの戻り値がオブジェクトに変更になってしまった為、直接のsortは出来ないとか。 一度listに変換してからsortすればいいよらしい。こんな具合に修正した。
- a = dat.keys() + a = list(dat.keys()) a.sort()
これで、無事に動くようになったとさ。rubyで1.9から2.0になった時の痛みはみなさん無いのかな? おいらの所のFreeBSDでは、rubyで書かれたportupgradeってコマンドが扱っている、巨大Hashを 操作する時、アボートしちゃうなあ。そのうちに修正されるかな。
おっといつの間にか日本のPythonサイトもリニューアルされてたぞ。
後で知った事なんだけど、2to3を使ってコードをPython 3に移植する なんていう変換器があるのね。ご丁寧な事に、python2にもpython3にも付属してる。みんな、 早くPython3へ行ってくれって切なる思いが込められているな。なんたって、バージョン違いの やつをメンテするの、人類の知恵の無駄使いですから。。。
で、実力の程はと思って試してみると、ものの1秒で変換終了。私が苦労して辿った所が 余す所なく修正されてましたよ。便利だから使ってみれ。
factor on Linux
以前ちょいとやった、OpenBSD上のfactor、苦労しなくてもLinuxのバイナリーが 提供されてる。で、安心して取りに行ってみると、 なんの事はない、ウブでしか動かないよーって書いてある。しかも石は高級な 機能がサポートされていないとだめみたい。アスロンなんて顔洗って出直してこいって 風。幸いおいらの石は天下のインテル様だ。
ウブにそのまま入れるのも癪に障るので、gitで取ってきたやつにしよう。手順書を 斜め読みして、ビルド用のツールが用意されてる事を知った。
sakae@ubuntu:~/factor$ build-support/factor.sh usage: build-support/factor.sh command [optional-target] install - git clone, compile, bootstrap deps-linux - install required packages for Factor on Linux using apt-get deps-macosx - install git on MacOSX using port self-update - git pull, make local boot image, bootstrap quick-update - git pull, refresh-all, save update - git pull, download a boot image, recompile, bootstrap bootstrap - bootstrap with an existing boot image net-bootstrap - download a boot image, bootstrap make-target - find and print the os-arch-cpu string report - print the build variables
ウブはウブでも、まずはコンパイル出来る環境を作れとな。それからネットブート するんだぞって風に解釈したよ。
sakae@ubuntu:~/factor$ build-support/factor.sh deps-linux sakae@ubuntu:~/factor$ build-support/factor.sh net-bootstrap
その通りにしたら、無問題で動いちゃったよ。さすがウブなユーザー向け、身内には やさしいのね。(これ、褒め言葉ですんで、誤解無き様)
気をよくしたおいらは、ArchLinuxにもfacotorを入れてあげたいなと思った訳だ。だってウブで しか動かないなんてつまんないでしょ。Linux用のdepは動かないので、ソースを見てアタリをつける。
install_deps_linux() { sudo apt-get --yes install libc6-dev libpango1.0-dev libx11-dev xorg-dev lib gtk2.0-dev gtk2-engines-pixbuf libgtkglext1-dev wget git git-doc rlwrap gcc make check_ret sudo }
大体入っていそうなので、コンパイルしたよ。無事にfactorとイメージが出来上がったけどXの上では 動かんかった。lddで取り込んでるライブラリーを確認したら、火狐もびっくりの75個も使ってた。 対するArchの方は、たったの9個だけだった。X関係が大幅に欠落してる。ウブのそれと比べて 必要そうなライブラリーを入れてあげた。って、言っても、ライブラリー名からパッケージ名は 分からんので、pkgfileなんていう検索用パッケージを使ってあげたよ。こやつ、検索用データは pkgfile -uであらかじめ取り込んでおかないといけないけど。
[sakae@arch ~]$ pkgfile -s libgdkglext-x11-1.0.so.0 extra/gtkglext [sakae@arch ~]$ pkgfile -s libpangox-1.0.so.0 extra/pangox-compat
こんな風にして、いろいろとX関係を入れていったら、X上でも動くようになったよ。やれやれ。
[sakae@manjaro ~]$ sudo pkgfile -u :: Updating 5 repos... warning: download failed: http://spiralinear.org/manjaro/repo/basis/i686/basis.files [HTTP 404]error: failed to update repo: basis warning: download failed: http://spiralinear.org/manjaro/repo/addon/i686/addon.files [HTTP 404]error: failed to update repo: addon warning: download failed: http://spiralinear.org/manjaro/repo/extra/i686/extra.files [HTTP 404]error: failed to update repo: extra warning: download failed: http://spiralinear.org/manjaro/repo/community/i686/community.files [HTTP 404]error: failed to update repo: community warning: download failed: http://spiralinear.org/manjaro/repo/platform/i686/platform.files [HTTP 404]error: failed to update repo: platform
分家のmanjaroの方は、残念ながら気配りが足りず、pkgfile用の元ねたが提供されてなかった。 これ、今後のために通報しといた方が良いんだろうか?
CiSE
以前、gaucheのエンジンをCから使うって記事を又引きした。今度は、SchemeのS式を C言語に翻訳する記事が出てたので、又引きしてみる。
CiSE(C In S-Expression)と言うそうな。一部、マニュアルにも書かれていないのを 平気で使っているので、そこん所は暗黙の了承があるものとします。
変換器はモジュールになっているんで、そのドライバーを定義します。(あっ、偉そうに 書いているけど、引用です)
[sakae@secd ~/t]$ cat toC.scm (use gauche.cgen) (use gauche.cgen.cise) (use gauche.parseopt) (define (main args) (let-args (cdr args) ((infile "i=s" #f) (outfile "o=s" #f)) (unless (and infile outfile) (display #`"usage: gosh ,(car args) -i 'input-file' -o 'output-file'\n") (exit -1)) (call-with-input-file infile (^ (in) (call-with-output-file outfile (^ (out) (cise-translate in out)))))))
こちらは、有名なFizzBuzzのgauche方言です。
[sakae@secd ~/t]$ cat FizzBuzz.scm (.include <stdio.h>) (define-cfn main (argc::int argv::char**) ::int (dotimes (i 30) (case (% (+ i 1) 15) ((0) (printf "FizzBuzz\n")) ((3 6 9 12) (printf "Fizz\n")) ((5 10) (printf "Buzz\n")) (else (printf "%d\n" (+ i 1))))) (return 0))
これを下記のように利用します。
[sakae@secd ~/t]$ gosh toC.scm -i FizzBuzz.scm -o test.c [sakae@secd ~/t]$ gcc test.c [sakae@secd ~/t]$ ./a.out 1 2 Fizz 4 : 29 FizzBuzz
とまあ、普通はこれで万歳なんだけど、うたぐり深いおいらは どんな風にCのソースへ変換されたから、test.cを眺めてみましたよ。そしたら、#line何がし ってのが大量に含まれていた。これdebug用なんですかね。ちょっと観賞に耐えないので、 えいやって整形してみた。(注: #include文が削られています)
[sakae@secd ~/t]$ fgrep -v '#' test.c | indent int main(int argc, char **argv) {{ { int i = 0; int cise__702 = 30; for (; (i) < (cise__702); (i)++) { switch (((i) + (1)) % (15)) { case 0:{ printf("FizzBuzz\n"); break; } case 3: case 6: case 9: case 12:{ printf("Fizz\n"); break; } case 5: case 10:{ printf("Buzz\n"); break; } default:{ printf("%d\n", (i) + (1)); break; } } } } return (0); } }
上記のドライバーを含めてshellファイルに隠してしまえば、いきなりSchemeファイル から、アプリが出来上がるぞ。名前は、goshcってのが良いかな。
cgen.ciseの中身
上記で出てきた、toC.scmの心臓部、cge.ciseは何処にある? ソースを見たいぞ。 見ておくと3文の得以上の価値があるに違いない。
えっと、ソースの在り処はFreeBSDの場合、
[sakae@secd /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/cgen]$ ls cise.scm precomp.scm tmodule.scm unit.scm literal.scm stub.scm type.scm
これのcise.scmがユーザーとお付き合いするためのフロントエンドになるのかな。 それ以外は、githubに集う人達のものでしょう。早速見ていきます。
;; If true, include #line directive in the output. (define cise-emit-source-line (make-parameter #t))
ふむ、これdebug用の何処を翻訳したかってのを出す/出さないのスイッチだな。デフォでは、 出すようになってるとな。
;; ;; cise-translate inp outp &key enviroment ;; ;; External interface to translate entire CiSE file into C. ;; CiSE expressions are read from INP and the resulting C code ;; is written to OUTP. ;; ;; If CISE-TRANSLATE encounters a form (.static-decls), ;; it expands the rest of CiSE forms into a temporary string, ;; then emits the forward declarations of static functions ;; into outp, followed by the accumulated C code. With this ;; you don't need to write forward declarations in CiSE source. (define (cise-translate inp outp :key (environment (make-module #f)) (context (cise-context-copy (cise-context)))) :
こちらが、ご本尊様におわします。そしてその功徳は、
;;============================================================= ;; Built-in macros ;; ;;------------------------------------------------------------ ;; C function definition ;; (define-cise-macro (define-cfn form env) (define (argchk args) (match (canonicalize-vardecl args) [() '()] [((var ':: type) . rest) `((,var . ,type) ,@(argchk rest))] [(var . rest) `((,var . ScmObj) ,@(argchk rest))])) :
こういう形で現れてきます。ああ、ありがたや、ありがたや。