軽バン

実際に所有したいわけではないけど、以前からキャンピングカーには興味があるので、こんなショーにも行ったりすることがある。とくに軽キャンパーは、狭小空間でどのように快適に過ごせるようにするのかという工夫が面白いなぁと思っている。

jrva-event.com

キャンピングカーまで行かなくてもいいから車中泊くらいできる軽自動車はと、なんとなく調べてみた現行の商用軽バン。字下げになっているのはOEM製品なので、オリジナルは5車種。

商用車なので小型貨物自動車登録(4ナンバー)になって自動車税が安くなる一方、最初から2年ごとの車検になる。

軽トラも面白いけど、運転席から荷室に直接アクセスできるバンのほうが便利な時が多そう。荷室においたものの汚れや臭いが気になる場合はデッキバンセパレート2シーターという設定もあるし、軽トラの特装ベース車をもとに自作していくという手もあるみたい。上記車種のなかでは4WDターボ設定があって、助手席側センターピラーがないため、積載の自由度が高いN-VANが面白そうではある。マニュアル・トランスミッション設定があれば最高だったけど、しょうがない。

東京23区内は駐車場代が高いので(うちの近所の公社駐車場は2.5~3万円/月くらい)、自動車を所有したいという意欲はそがれるよね。その金額なら軽バンが2泊3日借りられちゃうから、キャンプ用途にはレンタルで十分。

線形代数計算ライブラリLLAをWindowsで動かす

Common Lisp用の線形代数計算ライブラリとしてLLA (Lisp Linear Algebra)というものがあります。

github.com

これはBLASLAPACKをCommon Lispから利用できるようにするラッパーです。高速な行列計算とかが手軽にできるようになります。MacやLinuxでは問題なかったのですが、Windowsにインストールするときに少しだけつまづいたので、以下にメモしておきました。

BLASやLAPACKのバイナリをダウンロードしてインストールすればいいかと思いきや、使えそうなWindowsバイナリが見つからず、ではソースからインストールしようと思ってもうまくいかなかったり、いろいろ問題が発生しました。結局、OpenBLASのWindows用バイナリがあったので、それを利用させてもらいました。

ところがZIPアーカイブの中のlibディレクトリを見ても.dllファイルが見当たりません。.dll.aという拡張子のものはありましたが、Windows用バイナリではなさそうです。.dllファイルはbinディレクトリの中に見つかりました(なぜライブラリファイルがbinの中に……Windowsだとそういうものなのかな?)。OpenBLAS-0.3.27-x64のlibopenblas.dllをC:\Windows\System32の中に放り込んで、インストール完了です。(LispからPortAudioでデバイス情報を得る - 丸井綜研でも書きましたが、システム領域にバイナリをインストールするのは自己責任で!) ローカルディレクトリ(ql:quickload :llaを実行するディレクトリ)に置いてあっても読み込みがされるので、こちらのほうが安全かと思います。

次にSBCLとQuicklispでLLAをインストールすればいいのですが、作業メモリが足りなくなるので、sbcl --dynamic-space-size 4096とメモリ空間を増やしてあげます。SLIMEのREPLからだと起動途中で落ちてしまうことがあるので、ターミナル上で起動したSBCLで(ql:quickload :lla)とするとうまくいきました。

以前に自分で作ったプログラムでやってみた連立方程式の解も以下のように簡単に計算できました。出力はdouble型なのね。

*  (lla:solve #2A((1 2 0) (3 4 4) (5 6 3)) #(3 7 8))
#(-1.4000000000000008d0 2.2000000000000006d0 0.6000000000000001d0)

いままで作ってきたオレオレ統計ライブラリもLLAの上で動くようにしようかな……。

メモ化でフィボナッチ数列計算を高速に

メモ化(メモワイズ)というのは、計算結果をキャッシュしておいて次の計算の時に再利用するという仕組みです。Julia用のメモ化のためのパッケージ (Memoise.jl) が開発されていますが、簡単な実装でフィボナッチ数列の計算がどのくらい速くなるのか試してみました。

まずはナイーブなフィボナッチ数列の計算プログラムです。

function fib(n)
  if n <= 2
    return 1
  else
    return fib(n-2) + fib(n-1)
  end
end

これを実行すると、以下のようになりました。@timeを付けると実行にかかった時間を計測してくれます。Apple M1 Maxでの実行です。

@time fib(1)
  0.000000 seconds
1

@time fib(2)
  0.000001 seconds
1

@time fib(5)
  0.000004 seconds
5

@time fib(10)
  0.000001 seconds
55

@time fib(20)
  0.000027 seconds
6765

@time fib(50)
 47.893291 seconds
12586269025

次にメモ化を実装してみます。フィボナッチ数列の入力をkey、出力の値をvalueとして、ハッシュテーブルに登録すれば良さそうです。memoise_fibという辞書(ハッシュテーブル)を作り、n番目のフィボナッチ数列が登録されていればその値を返し、登録されていなければ計算して辞書に登録する、というアルゴリズムです。

前術のフィボナッチ数列のアルゴリズムが遅いのは、fib(n) = fib(n-1) + fib(n-2) において、fib(n-1) には fib(n-2) の計算が含まれているにもかかわらず fib(n-2) を再計算しているところにあります。メモ化してあれば再計算が必要なくなります。

memoise_fib = Dict{BigInt, BigInt}();

function fib(n)
  v = get(memoise_fib, n, nothing)
  if isnothing(v)
    if n <= 2
      memoise_fib[n] = 1
      return 1
    else
      v = fib(n-2) + fib(n-1)
      memoise_fib[n] = v
      return v
    end
  else
    return v
  end
end

実行結果は以下のようになりました。高速です。

@time fib(1)
  0.076642 seconds (110.55 k allocations: 6.992 MiB, 99.88% compilation time)
1

@time fib(2)
  0.000007 seconds (4 allocations: 80 bytes)
1

@time fib(5)
  0.014464 seconds (9.62 k allocations: 662.883 KiB, 99.26% compilation time)
5

@time fib(10)
  0.000010 seconds (20 allocations: 440 bytes)
55

@time fib(20)
  0.000017 seconds (43 allocations: 2.109 KiB)
6765

@time fib(50)
  0.000018 seconds (123 allocations: 7.406 KiB)
12586269025

最初の方法だと現実的な時間では計算できない1000番目のフィボナッチ数も、以下のようにあっという間に計算できます。いつもJuliaはすごいのですが、こればかりはメモ化の威力です。

@time fib(1000)
  0.000274 seconds (5.27 k allocations: 228.781 KiB)
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

本日の給油(スーパーカブ110プロ/JA07)

15000 km

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2023-02-06 13848.1 3.26 157.06 45.61 3.44
2023-03-02 13973.9 2.60 156.92 48.38 3.24
2023-04-01 14095.9 2.99 156.86 40.80 3.84
2023-07-13 14218.0 2.73 163.00 44.73 3.64
2023-09-25 14380.5 3.60 176.94 45.14 3.92
2023-11-25 14529.5 2.93 162.12 50.85 3.19
2024-02-07 14644.2 2.80 165.00 40.96 4.03
2024-03-04 14775.6 2.93 164.85 44.85 3.68
2024-05-02 14914.0 2.82 165.96 49.08 3.38
2024-06-02 14998.1 2.01 165.17 41.89 3.94

2012年8月の購入から12年経って、ようやく15000 kmです。年間1000 kmちょいしか乗っていない計算ですね。郵政カブは6〜7万キロくらいで交換になるという話なので、このペースだとあと50年は乗れそうです。

なお、今回が101回目の給油なので、1給油あたり150 kmは走っている感じですね。今日のようにタンク半分で給油することもあるので、満タンで走れる距離は150〜200 kmくらいと考えておくとよさそうです。

騒音曝露レベルと許容曝露時間の関係

Apple Watchをつけていると、ときどき「90 dBを超えています」というような警告が表示されることがあります。これはWHO(世界保健機関)が以下で推奨している騒音(そうおん)曝露(ばくろ)レベルを超えそうになるときに警告してくれる機能で、音に関係する仕事をしている自分にとっては欠かせないものになっています。

www.who.int

WHO Global Standard for Safe Listening Venues and Eventsという文書にまとめられた推奨はつぎのとおりです(文書のAnnex 2参照)。「1年間に受けるレジャー騒音の平均が70 dB (LAeq, 24時間)を超えると健康への悪影響があるので、1週間あたりの騒音曝露レベルは1.6 Pa² h(騒音レベルであらわすと80 dB (A)なら1週間で40時間)までにしなさい」となっています。

iOSの「ヘルスケア」アプリには以下のような表がありました。

騒音レベル 7日間あたりの時間
75 dB 127時間
80 dB 40時間
90 dB 4時間
100 dB 24分
110 dB 2分
120 dB 14秒

さて先日、スーパー耐久24時間レースに泊まり込みで観戦しに行ったのですが、レースカーが通り過ぎるときにはコース脇では80~90 dBくらいの騒音レベルでした。さすがに90 dBになる車両もあるものの、他の車両はピークでも85~87 dBくらいです(水素で走る車はだいぶ静かでした)。レースカーが通らない静かなときもあるので平均するともう少し低いはずですが、85 dBが24時間続くというかなり大きな見積もりをして、コース脇に24時間いて安全なのか考えてみます。

上記の表には85 dBがありませんが、10 dBの増加で時間が1/10になることが読み取れます。80 dBのとき40時間(=2400分)という定数があるので、A特性騒音レベルを𝐿 (dB)、許容最大曝露時間を𝑇ₘ (分)とすると、𝑇ₘ = 10(𝐿 - 80)÷10 ÷ 2400 と計算することができます。以下のようにプログラムにしてみました。

(defun noise-exposure-time (level)
  "Calculates allowed noise exposure time (in minutes per week) from
   noise level (dB, A-filtered) by WHO recommendation."
  (/ 2400 (expt 10 (/ (- level 80) 10))))

ここから計算すると、85 dBの場合は1週間あたり約12時間まで。アウトです。ただ、WHO文書には100円均一で入手できるような耳栓であっても、平均すると広帯域にわたって10 dB以上の減衰があるとの記述もあります(文書のBox 5参照)。85 dBが75 dB以下になりますので、これなら24時間耐久レースでも耳へのダメージもそんなに心配しなくて良さそうです。僕は100均耳栓とAirPods Pro 2のノイズキャンセルを併用してしのぎました。AirPods Proは騒音を消しつつ話し声は通してくれるのでとても便利ですよ(amzn.to/3VkR4be)。

というわけで、大きな音のする場所では耳栓をしましょう!(耳栓なしの子供を多く見かけたので心配になりました)

本日の給油(CRF1100Lアフリカツイン/2BL-SD10)

6666 km

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2023-02-04 3987 16.75 157 15.52 10.12
2023-04-20 4165 10.37 157 17.16 9.15
2023-04-30 4563 18.22 160 21.84 7.32
2023-06-17 4982 16.41 159 25.53 6.23
2023-09-02 5296 19.46 178 16.14 11.03
2023-10-01 5700 18.89 180 21.39 8.42
2024-01-28 6003 18.62 165 16.27 10.14
2024-03-22 6292 14.10 165 20.50 8.05
2024-04-14 6598 16.40 165 18.66 8.84
2024-05-05 6798 10.83 166 18.47 8.99

キャンプシーズンが到来しています。5月に富士山近くまでキャンプツーリングの予定なのですが、駐車場からキャンプサイトまでかなり距離がある場所なので、このところ使っていたサイドパニアの代わりにコロコロ付きのトロリーバッグに荷物をまとめなければなりません。最低限の荷物を選ぶ作業もキャンプの楽しさです。

本日の給油(スーパーカブ110プロ/JA07)

www.youtube.com

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2022-11-05 13699.4 3.21 157.01 47.57 3.30
2023-02-06 13848.1 3.26 157.06 45.61 3.44
2023-03-02 13973.9 2.60 156.92 48.38 3.24
2023-04-01 14095.9 2.99 156.86 40.80 3.84
2023-07-13 14218.0 2.73 163.00 44.73 3.64
2023-09-25 14380.5 3.60 176.94 45.14 3.92
2023-11-25 14529.5 2.93 162.12 50.85 3.19
2024-02-07 14644.2 2.80 165.00 40.96 4.03
2024-03-04 14775.6 2.93 164.85 44.85 3.68
2024-05-02 14914.0 2.82 165.96 49.08 3.38

2ヶ月ぶりの給油ですが、少しだけ燃費が良かったような。近所ばかり乗ってるんですけどね……。