本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2020-02-22 10890.0 2.67 141.95 51.20 2.77
2020-03-16 11037.1 3.46 138.73 42.51 3.26
2020-03-20 11217.6 2.83 133.92 63.78 2.10
2020-03-21 11407.0 3.11 142.12 60.90 2.33
2020-03-22 11612.2 3.50 138.57 58.63 2.36

3月の三連休に、千葉県一周ツーリングに行ってきました。松戸あたりから出発し、できるだけ海沿いを走って岬や灯台を巡る旅です。富津岬〜館山城〜洲崎灯台〜野島埼灯台太東灯台犬吠埼灯台香取神宮東峰神社関宿城。千葉県の最南端(野島埼灯台)・最東端(犬吠埼灯台)・最北西端(関宿城)を制覇しました。

1日200 kmくらいで3日間で600 km。燃費が良いので交通費は1300円のみ。オドメーターのゾロ目には蘇我駅あたりで遭遇。 f:id:amarui:20200327130508j:plain

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2017-09-15 10004.7 3.09 123.96 53.03 2.34
2017-10-04 10152.2 2.08 125.96 70.91 1.78
2017-10-18 10314.9 3.42 125.73 47.57 2.64
2018-05-05 10499.5 3.18 137.74 58.05 2.37
2019-06-08 10607.9 2.40 148.75 45.17 3.29
2019-07-13 10753.3 3.20 137.81 45.44 3.03
2020-02-22 10890.0 2.67 141.95 51.20 2.77
2020-03-16 11037.1 3.46 138.73 42.51 3.26

オドメーターの次のゾロ目タイミングが近づいてきた。11111、12345のあとはとうぶん無いかなー。

JuliaからRCallを使ってANOVA君を呼び出す

ANOVA君は、井関龍太氏が開発している、Rで動作する分散分析プログラムです。様々な実験計画に対応できるようになっており、分散分析に加えて多重比較や単純主効果の検定もやってくれます。lm()とかaov()なども使ってはいますが、ANOVA君は一回の関数呼び出しですべてを面倒見てくれるのでとても重宝します。

riseki.php.xdomain.jp

数年前に僕がPythonに移行できなかった理由の一つに「まともな分散分析ツールがない」ということがありました。1要因や簡単な2要因のものくらいなら見つかるのですが、3要因以上だったり2要因でも混合計画のものは見つからず、かといって自分で作るのも車輪の再発明をしているかんじでイヤだったのです。Juliaに移行するにあたっても同じ理由でRを捨てられずにいます。

しかし、JuliaはPythonともRとも親和性が高く、それらで書かれたプログラムも簡単に呼び出すことができます。今日は、JuliaでRを呼び出してANOVA君を使う例を紹介します。

続きを読む

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2017-09-15 10004.7 3.09 123.96 53.03 2.34
2017-10-04 10152.2 2.08 125.96 70.91 1.78
2017-10-18 10314.9 3.42 125.73 47.57 2.64
2018-05-05 10499.5 3.18 137.74 58.05 2.37
2019-06-08 10607.9 2.40 148.75 45.17 3.29
2019-07-13 10753.3 3.20 137.81 45.44 3.03
2020-02-22 10890.0 2.67 141.95 51.20 2.77

本当に久しぶりに給油。2018年は185 km、2019年は250 kmていどしか走っていない……。

Land of Lisp第7章

Land of Lispを読んでいます。日本語版も英語版も英語電子版も持っているのに、読み終わる前に投げ出して、また最初から読み始めるということを何度も繰り返しています。以下、日本語版と英語Kindle版へのアフィリンクです。

本書で使用しているCommon Lisp処理系はCLISPなのですが、ネットで見かけるLisperたちは「開発段階ではコンパイルの速いClozure Lisp、デプロイはSBCL」と言っていることが多いので、僕もSBCLを使って読み進めています。

第7章でdot->pngという関数が登場するのですが、その中(p.115の7行目)に

(ext:shell (concatenate 'string "dot -Tpng -O " fname))

という部分があります。ここで使われているext:shellCLISP独自の命令なので、SBCLで動かすには書き換えないといけません。

さいわい少し調べただけで、SBCLでシェルからプログラムを実行するにはsb-ext:run-programを使えばよいと分かりました(SBCLマニュアルより7.7.3 Running external programs)。sb-ext:run-programは実行するプログラム名とそのプログラムへの引数リストの2つを指定して呼び出します。プログラム名はフルパスで書く必要があるようです(シェルからサーチパスを取ってくるなどすればよいのかもしれませんが……)。

最初は

(sb-ext:run-program "/usr/local/bin/dot" '("-Tpng" "-O" fname))

でいけると勘違いしていたのですが、これだとfnameに入っているファイル名が展開されないので、

(sb-ext:run-program "/usr/local/bin/dot" `("-Tpng" "-O" ,fname)))

とquasi-quoting(準クォート)してやることで解決しました。

結果として、SBCLで動くdot->pngは以下のようになりました。

(defun dot->png (fname thunk)
  (with-open-file (*standard-output*
                   fname
                   :direction :output
                   :if-exists :supersede)
    (funcall thunk))
  (sb-ext:run-program "/usr/local/bin/dot" `("-Tpng" "-O" ,fname)))

-Tpng-Tpdfとかにすると、さらにきれいなグラフが得られます。


……と、作業し終えたところで下のようなページを見つけました。同じくsb-ext:run-programを使っていますがdotを直接起動するのではなくshを通して起動するようになっていて、僕のコードよりも環境非依存に近いかと思います。

lambdacadabra.blogspot.com