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))]))
   :

こういう形で現れてきます。ああ、ありがたや、ありがたや。