本日の給油

給油日 オドメーター (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

続 Wikipediaのフォントを変えてみた

数年前に、Wikipediaを読みやすくするためにCSSをいじって調整しました。

marui.hatenablog.com

今日は、英語版と日本語版とでハイフネーションの挙動を変えてみました。具体的には以下のようになっています。:lang(en)を使って英語版では両端揃えでハイフネーション有り、日本語版(というより英語以外)ではデフォルトのまま左揃えでハイフネーション無しになるようにしています。

p:lang(en), dd:lang(en), li:lang(en){
    -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto;
    text-align: justify;
}

Juliaパッケージのインストール・スクリプト

新しい環境にJuliaをインストールするときに、自分が使うパッケージ群をまとめてインストールしたいことがあります。

僕の場合、以前はテキストファイルに

add Atom
add Juno
add IJulia

のように書いたものを準備しておいて、Pkgモードにコピペするようにしていました。パッケージの数が少ないときはそれでいいのですが、パッケージをインストールする順序によって成功・不成功が変わったりする問題に遭遇しました(→Julia 1.3.1にSampledSignalsをインストールした - 丸井綜研)。さらにコピペするのも面倒ですし、インストール作業の再現性なども考慮すると、すべてを自動化できるのが理想的です。

そのため、パッケージ群をインストールするスクリプトを作っておいて、まっさらなJulia上でそれを実行することで「いつもの作業場」が再現できるようにしています。以下、僕が使っているスクリプトです。julia13_install.jlというファイル名で保存してあれば、

julia> include("julia13_install.jl")

と読み込むだけで、パッケージのインストールとプリコンパイルをしてくれます。

続きを読む

2019年に買って良かったもの(アフィ注意!)

2019年にAmazonで買ったものから、買ってよかったなーと思ったものを書き残しておこうかと思います。

(TLDR; ホットクック、Skyrimウクレレベイズモデリングの本、教育心理学の本、でした)

※商品画像込みで簡単にリンクを付ける方法が分からなかったので、以下のリンクは全部Amazonアソシエイトによるアフィリエイト・リンクになってしまっています。アフィリエイトが嫌いな方は踏まないようにご注意ください。

続きを読む

Julia 1.3.1にSampledSignalsをインストールした

先日のアドベントカレンダーへのエントリ中で、「今回のエントリはJulia 1.0.5用に書いています。というのも、Julia 1.2や1.3あたりからLibSndFileなどのインストールがうまくいかない状況になっているからです」と書きましたが、それが解決できたので記録を残しておきます。

marui.hatenablog.com

(TLDR; SampledSignalsの前にUnitfulをインストールしないこと)

続きを読む

パワースペクトル計算の2つの方法 (Julia Advent Calendar 2019)

はじめに

これはJulia Advent Calendar 201920日目の記事です。「音について何か書きます」と宣言したので、普段Juliaを使って音についてどんなことをしているかを紹介します。今年はパワースペクトルの計算を、(1)信号全体をフーリエ変換する方法と、(2)スペクトログラムを時間平均する方法の2とおりでやってみます。

去年はAdvent Calendar参加記事として以下のようなものを書いていましたので、それからあまり進歩していませんが、ご容赦を。

marui.hatenablog.com

今回のエントリはJulia 1.0.5用に書いています。というのも、Julia 1.2や1.3あたりからLibSndFileなどのインストールがうまくいかない状況になっているからです。(原因はSampledSignals.jlにあるようですが、本稿を執筆している12月19日時点で解決されていません →2019-12-31 解決しました

julia> versioninfo()
Julia Version 1.0.5
Commit 3af96bcefc (2019-09-09 19:06 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.6.0)
  CPU: Intel(R) Core(TM) i7-7920HQ CPU @ 3.10GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.0 (ORCJIT, skylake)
続きを読む