Excel VBA事始め その4 配列 前編

重ねた箱
©いらすとや.

ExcelのVBAでは当然だけど配列が使える。そしてExcelのワークシートが表であるということは配列とは親和性が高いのでよく使うことになる。
ただし、ワークシートの範囲に配列を入れる、或いはワークシートの範囲を配列にするというのは基本的には2次元配列を使うことになる。
1次元配列は配列をワークシートの範囲に入れる際には利用可能だが逆はダメ、そして1行の範囲には入れることができるが1列の範囲には入れることができないというか、入れようとするとエラーにはならないが意図した動作にはならないので厄介。

配列について 1
(1次元)配列は、数を事前に決めて直線に並べた箱と考える。これは言語関係ないと思う。箱には0番からの番号が振られ、それぞれの箱に何らかの値を入れることができる。大抵の言語では配列の要素は0番からということになっているが、1からということもできるしExcel VBAでは意図せず1番からになることもにあってそれが困る。

配列について 2
配列を宣言するときは、要素の数(箱の数)を宣言する。要素数を宣言する際は、(要素は0から始まるので)指定したい数より1小さい数値にする。(Option Base 1を指定していない場合)
最初の要素を1から指定したいという場合はコードの最初(プロシージャ外)にOption Base 1を指定するか「1 to 指定したい数」のように指定する。なお、Option Baseは0か1しか指定できない。

配列について 3
2次元配列では箱が面方向に並ぶと考える。2次元配列の要素をExcelのワークシートのセルに例えると「(行,列)」のようになる。要素は0からは始まるので2次元配列の最初の要素は(0,0)になり、要素数を指定して宣言する際は「(指定したい行数 -1, 指定したい列数 -1)」のように指定する。
最初の要素を1から指定したいという場合はコードの最初(プロシージャ外)にOption Base 1を指定するか「(1 to 指定したい行数, 1 to 指定したい列数」のように指定する。

VBA4 配列 1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub test1()

    With ThisWorkbook.Sheets(1)

        '列 (これはNG)
        .Range("B2:B6").Value = Array("B2", "B3", "B4", "B5", "B6")

        '行
        .Range("D2:H2").Value = Array("D2", "E2", "F2", "G2", "H2")

    End With

End Sub



Sub test2()

    '二次元配列を作る
    Dim arrTest(4, 0) As String

    arrTest(0, 0) = "B11"
    arrTest(1, 0) = "B12"
    arrTest(2, 0) = "B13"
    arrTest(3, 0) = "B14"
    arrTest(4, 0) = "B15"

    '列 (これはOK)
     ThisWorkbook.Sheets(1).Range("B11:B15").Value = arrTest

End Sub

VBA4 配列 2
test1()を実行すると、オレンジと緑の枠に値が入る。これは要素5個の1次元配列を使った場合。
test2()を実行すると、青の枠に値が入る。これは1列5行の要素の2次元配列を使った場合。

上の例のように2次元配列をワークシートに入れる際には普通に宣言した配列(0番から始まる要素)を普通に使えるが、ワークシートから2次元配列に入れる場合は配列の宣言で(上の例の Dim arrTest(4, 0) のような)普通に0からの要素数を定義するのではなくarrTest(1 to 5, 1 to 1)のように要素が1から始まる指定を行う方が意図しない不具合は起きにくい。Excelの場合は何故か配列の要素の開始番号が0だったり1だったりワケわからんことになるので注意した方が良さそうです。



dump1090-fa 7.1とpiaware 7.1のビルド・インストール・更新

新規
©いらすとや.

dump1090-faとpiawareのバージョン7.1がリリースされました。7.0はラズパイ向けOSイメージファイルとしては2021年末頃にリリースされたかもしれませんが(未確認)、dump1090-faとpiawareは正式としてはアヤフヤで事実上スキップされたようです。ほぼ7.0と同じものが7.1として2022年1月12日前後にリリースされました。
dump1090-faとpiaware(piaware_builder)の7系はDebian 8.0 jessieのサポートが終了し、代わりにDebian 11.0 bullseyeがサポートされます。

dump1090-fa (6.0,6.1から7.0,7.1)の変更点

  • dump1090: Allow env vars (not only command line overrdies) to set CPU_FEATURES_{ARCH,UNAME}
  • dump1090: Treat ARCH=arm64 like ARCH=aarch64
  • dump1090: Try to respect CFLAGS/CPPFLAGS as far as possible; move required extra flags into a separate var
  • dump1090: Adaptive gain - more aggressively re-probe for higher gain after a decrease in gain due to increased noise floor
  • dump1090: Cleanup AVR parsing
  • SkyAware: Update aircraft db to 20211210
  • SkyAware: Cleanup unused Openlayers files

piaware (6.0,6.1から7.0,7.1)の変更点 (ほぼ無し?)

# how many seconds with no messages received from the ADS-B receiver before
# we will attempt to restart dump1090

dump1090-fa 7.1のビルドとインストール

dump1090-faを更新する場合は先に、/etc/default/dump1909-fa (設定ファイル)と /lib/systemd/system/dump1090-fa.service (systemd用サービス起動/停止用ファイル)の2つのファイルのバックアップを取る。(重要)

$ sudo systemctl stop dump1090-fa      #dump1090-faサービスを停止
$ sudo systemctl disable dump1090-fa   #dump1090-faサービスを無効化
$ sudo dpkg -r dump1090-fa             #dump1090-faパッケージを削除

dump1090-faを停めて無効化してパッケージを削除する。パッケージを作らずにインストールした場合は3行目はできない。この辺りのやり方はそれぞれだとは思う。

dump1090-faをビルドするために必要になりそうなパッケージをインストールする。dump1090-faの4.0から6.1までのビルドが成功した環境なら追加パッケージは不要。

$ sudo apt install git lighttpd debhelper librtlsdr-dev pkg-config dh-systemd libncurses5-dev libbladerf-dev libusb-dev devscripts
$ cd ~
$ git clone https://github.com/flightaware/dump1090 dump1090-fa
$ cd dump1090-fa

$ dpkg-buildpackage -b --no-sign
またはRTL-SDR系レシーバ専用なら⬇
$ dpkg-buildpackage -b --no-sign --build-profiles=custom,rtlsdr

基本的には上でdebian用のパッケージが出来る。(dump1090-faを参照)

$ cd ~
$ sudo dpkg -i dump1090-fa_7.1_arm64.deb

debian用パッケージを作ってインストールすればdump1090-faのサービス起動用ファイルは/usr/lib/systemd/system/dump1090-faファイルがインストールされる。そのままでほぼ問題ないが、jsonファイルの出力先が普通のファイルシステムというのが大変気に入らない。PCサーバのようにHDDが書き込み先であれば気にしないがSBCのストレージのmicroSDカードのようなひ弱なメディアを上書きしまくると寿命が短くなる。そこで、RAMディスクである/tmp下にjsonファイルを出力するように変更する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# dump1090-fa service for systemd

[Unit]
Description=dump1090 ADS-B receiver (FlightAware customization)
Documentation=https://flightaware.com/adsb/piaware/
Wants=network.target
After=network.target

[Service]
User=dump1090
RuntimeDirectory=dump1090-fa
RuntimeDirectoryMode=0755
ExecStartPre=/bin/bash -c '/bin/mkdir -p /tmp/dump1090-fa 2> /dev/null'
ExecStartPre=/bin/chmod 777 /tmp/dump1090-fa
ExecStart=/usr/share/dump1090-fa/start-dump1090-fa --write-json /tmp/dump1090-fa
SyslogIdentifier=dump1090-fa
Type=simple
Restart=on-failure
RestartSec=30
RestartPreventExitStatus=64
Nice=-5

[Install]
WantedBy=default.target

13,14行目は、jsonファイルの書き出し先の作成(2行挿入)
15行目の最後の方の黄色字部分がjsonファイルの書き出し先の変更箇所。

また、上のjsonファイルの出力先ほ変更した場合は合わせてlighttpdの設定ファイルを修正する。
/etc/lighttpd/conf-available/89-dump1090-fa.conf (修正)
/etc/lighttpd/conf-available/89-skyaware.conf (修正)
変更内容: /run/dump1090-fa/ → /tmp/dump1090-fa/
これを忘れるとウェブの地図上に航空機が表示されなくなる。
lighttpdの設定を変更したらlighttpdサービスを再起動する。

$ sudo systemctl restart lighttpd   lighttpdサービスの再起動
この辺りはdump1090 Prometheus ExporterでADS-B受信状況を監視するの中段に黃文字で書いてるので参照いただければ。

piaware 7.1のビルドとインストール

$ sudo apt install devscripts tcl8.6-dev python3-dev python3-venv dh-systemd libz-dev      ← README.mdで必要とされているもの
$ sudo apt install libboost-system-dev libboost-program-options-dev libboost-regex-dev libboost-filesystem-dev     ←おそらく他に足りないもの

インストールするパッケージが依存する他のパッケージもそれなりにインストールされる。

piaware 6.1までのビルドが成功していた環境であってもpiaware 7.1のビルドでは追加で必要なパッケージが1つある。

$ sudo apt install patchelf

piaware 4.0以降では、tcl-tlsの専用版が必要。piaware 4.0から6.1までのバージョンが動いている環境であればtcl-tlsはインストール済みの筈なのでビルドとインストールは不要。新規インストールであれば以下のようにtcl-tlsをビルドしてインストールする。 OSのパッケージにインストール可能なtcl-tlsがあったとしても、それは入れないよう注意
このtcl-tlsも扱いやすいようにパッケージとしてビルドしてインストールする。

$ sudo apt install tcl-dev chrpath
$ cd ~/      #ホームディレクトリで
$ git clone https://github.com/flightaware/tcltls-rebuild.git
$ cd tcltls-rebuild
$ ./prepare-build.sh buster     #Armbian, Debianのバージョンがbusterの場合
$ cd package-buster             #Armbian, Debianのバージョンがbusterの場合
$ sudo dpkg-buildpackage -b --no-sign
$ cd ../
$ sudo dpkg -i tcl-tls_1.7.16-1+fa1_arm64.deb

tcl-tlsは、piawareのビルドにはおそらく不要でインストール時に必要なものだがpiawareビルド前に作ってインストールしておく方が安心ではある。

すでにpiawareを稼働している場合(更新する場合)はディレクトリのバックアップとその下の3行を実行。
/var/cache/piawareディレクトリを念の為にバックアップする。(どこかの安全なディレクトリにコピーするだけで良いと思う)

$ sudo systemctl stop piaware      #piawareサービスを停止
$ sudo systemctl disable piaware   #piawareサービスを無効化
$ sudo dpkg -r piaware             #piawareパッケージを削除

piawareを停めて無効化してパッケージを削除する。パッケージを作らずにインストールした場合は3行目はできない。この辺りのやり方はそれぞれだとは思う。

ここからpiawareのビルドとインストール。

$ cd ~/      (ここではホームディレクトリでビルドするということで)
$ git clone https://github.com/flightaware/piaware_builder.git
$ cd piaware_builder
$ ./sensible-build.sh buster   ←Debian Buster系の場合
$ cd ~/piaware_builder/package-buster  ←Debian Buster系の場合
$ dpkg-buildpackage -b --no-sign
正常にビルドできたらインストール
$ cd ..
$ sudo dpkg -i piaware_7.1~bpo10+1_arm64.deb

piawareの起動

$ sudo systemctl enable piaware  #piawareの有効化
$ sudo systemctl start piaware   #piawareの起動

piawareの設定は/etc/piaware.conf設定ファイルで行うことになっているが、新規でも更新でも基本的にはこのファイルは触る必要がない。(ADS-B周りの設定は設定ファイルには無い)
更新の場合は特に何もしなくてOKなので更新後のpiawareが動いている状態で、https://ja.flightaware.com/にアクセス(要ログイン)して「マイADS-B」のページを開く。自身のフィーダー情報が表示されるので「サイト情報」のフィーダータイプを確認する。今回ならdebian用パッケージとしてビルドしたpiaware 7.1なので「PiAware (Debian Package Add-on) 7.1」のような表示になれば更新作業完了といえる。

piawareの運用が初めてという場合は、dump1090-fa + piawareを起動させた状態で、ブラウザでhttps://ja.flightaware.com/にアクセスして会員登録する。
会員としてログインした状態でhttps://ja.flightaware.com/adsb/piaware/claimを開く。このときにpiawareの動いているPCやSBCとブラウザのPC等が同じNATのネットワークだと話はカンタン。そうでない場合はどうなるのか不明。
FlightAware.comにフィーダーとして参加することについては過去記事の「FlightAwareにフィードする」の後半を参照してください。

dump1090-fa + piawareの4.0以降を運用してきた人にとっては7.1への更新は比較的カンタン。4.0までで運用していた人はtcl-tls(専用版)のインストールが必須。dump1090-faは6.0で設定ファイルのフォーマットが大きく変更になっているのでなるべく早めに新しいフォーマットの設定に移行しておくのが良さそう。

dump1090-faとpiawareのビルドとインストールはこれまで幾つか記事にしたけど情報がバラケてわかりにくくなってたので今回は纏めたつもり。

ADS-B受信用に新しいLNAを購入した

静電気
©いらすとや.

新しいLNAを買ってみた
2021年末に動かなくなったADS-B受信セットのSBCとRTL-SDRチューナー。結局、壊れたのはSBC用の電源のACアダプタということが判明したのでこの写真に写っているものは壊れていなかった。
2020年はアンテナ直下にUSBのRTL-SDRチューナー(画像の緑のやつ)がありSBC(タッパー内)からは離れていたが、2020年末に壊れた後、2021年はSBCの近くでSBCと同じ大型ヒートシンクにひっつけて稼働していた。

SBCのACアダプタの他、アンテナ直下に取り付けていたLNAが壊れていた。こちらはLNAの電源も。壊れた原因は判明していないが2020年末と2021年末に受信セットが壊れたのが共に雪の日ということからアンテナの静電気が原因だと思っている。今年(2022年)から来年の冬に3度目の破損にならないよう静電気対策は何か考えないとダメかも。

AliExpress商品画像
1,746円 1,187円

(2022年01月22日 7:00時点の参考価格)

新しいLNAを買ってみた 1
新しく購入したLNA。手前にあるmicroSDカードは大きさ比較用。
LNAの基板とSMA端子を引っ付けてるハンダは結構ひどい。「がとらぼ」の中の人と同じくらい下手なイモハンダ。まぁハンダが下手でも正常に動けばO.K.
AliExpressの商品説明画像に写っていた猫の手のマークは無いが部品の配置は商品説明画像と同じだった。 このLNAはBias-Tタイプなので接続する同軸ケーブルから電源を取る。同軸ケーブルのレシーバーの側にBias-Tの給電用デバイス(安価)を別途つなぐ。給電はDC5V。

新しいLNAを買ってみた 2
裏面はコンデンサ1個だけ。

新しいLNAを買ってみた 2
2020年に掲載した画像の再掲。
左に写っているLNAは一昨年2020年末にみごとにぶっ壊れた。(ついでにサビてた。結露?)
2020年末にADS-B受信セットが壊れたときに唯一壊れなかったのが画像の右下にあるバンドパスフィルター。このBPFは2021年も正常に使えてしかも2021年末の受信セット破損時にも生き残っている。BPFってそういう高電圧に強い造りなのかしら?そして画像には写っていない反対面にネジがあってアースできるっぽい。
しかし、迂闊にアースするとアンテナが避雷針ならぬ誘雷針になるという恐ろしいワナ。どうしたら安全にアースできるかしら。

AliExpress商品画像
2,997円 2,757円

(2021年08月26日 7:00時点の参考価格)

上のリンクは2020年に購入したBPFと同じ製品のようですが販売店は異なります。また2020年購入時は1800円程度でしたが2022年1月現在は2000円から4000円程度になっているようです。なんで値上がりしてるのか不明だけど4000円出せるならrtl-sdr.comでオススメのRTL-SDR Blog ADS-B Triple Filtered LNA (Bias Tee Powered)を買う方が良いかも。(BPF+LNAのやつ)

ところで、これまでLNAを使い続けてきて今回も新しいLNAを購入したが、良いアンテナを建ててアンテナからレシーバまでの同軸ケーブルが十分に短く適切なケーブルを使っていればLNAは有っても無くてもADS-Bの受信状態はあまり大きくは変わらないような。アンテナからレシーバまでのケーブルが長いなら要ると思う。