プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

避難所データの加工について(避難所検索@伊勢 v1.0 以前)

現在リリース中の避難所検索@伊勢では、避難所データとして伊勢市のオープンデータを利用しています(リンク先は最新のデータになります)。

ただ、残念ながら、このデータは Excel 形式での公開であり、中身も機械的に処理するにはちょっと不便なため、手作業で一部加工しています。

避難所検索@伊勢の次のリリースでは、避難所データの更新機能を追加しようと思っています。それに先立ち、現状の避難所データの扱いについて、メモ書きとしてまとめてみました。

なお、対象となるアプリ及び避難所データは下記になります。

  • 避難所検索@伊勢 v1.0 以前
  • 伊勢市のオープンデータ(災害時指定避難所)ただし、以下のはなしは 2017年3月時点の資料が対象

最新の避難所データのフォーマットについては、アプリの次リリースに併せてまとめたいと思います。

避難所の選定について

昔、アプリの作成を思い立った際に調べた記憶を頼りにまとめていきます。認識が間違っている点などがあれば、ご指摘ください。

伊勢市が公開している避難所の資料はいろいろありますが、避難所の種類について解説してあるページを見ると、伊勢市の場合、5種類の避難所に分けられるそうです。

  • 指定避難所
  • 津波緊急避難所
  • 自治会避難所
  • 福祉避難所
  • 避難生活施設

このうち、

  • 先頭の2つの『指定避難所』と『津波緊急避難所』が、国の基準でいうところの緊急用の『指定緊急避難場所』に該当し、
  • 『避難生活施設』が国の基準でいうところの『指定避難所』に該当

するとのことです(こちらのPDF資料の p.4 を参照)。

で、このアプリではどの避難所を扱えばよいのか考えてみたのですが、本アプリが主に想定する利用シーンとしては、

  • 現在いる場所の近くの避難所を調べること
  • 調べるタイミングは、災害が迫っているようなとき、もしくは、災害にいままさに遭遇しているとき

になるかと思います(実際に起こって欲しくはないものですが)。

そのため、伊勢市の呼び方でいうところの

  • 指定避難所
  • 津波緊急避難所
  • 避難生活施設

を扱うことにしました。本当は指定避難所と津波緊急避難所の2つだけでもよかったんですが、これらについて記載されている元データに、避難生活施設のデータも含まれていたため、わざわざ除外することもないかと思い、参考としてアプリに含めました。

で、自治会避難所と福祉避難所の2種類の避難所を除外しているのは、

  • 自治会避難所:各自治会が運営主体なのでいざ災害となった場合にどのように運営されるのかアプリ利用者にとっては不明と思われること(行ったのに開設されていない、というのを避けたい)
  • 福祉避難所:原則、災害が去ったあとに避難生活を行うためのものであること

と考えたためです。緊急時に確実に避難所が運営されるであろう伊勢市の避難所を対象にしたということです。

なお、下記のPDFに避難所についての検討した結果がまとまっていましたので、ご興味ある方は見られるとよいかと思います。

https://www.city.ise.mie.jp/_res/projects/default_project/_page_/001/001/585/hinanjyositeikijyun.pdf

オープンデータとして公開されている Excel ファイルについて

さて、やっと具体的なデータの話です。

『災害時指定避難所』として公開されている Excel ファイルをダウンロードして開いてみます。早速、ヘッダの部分ですでに、結合セルが使われています(資料としては見やすくていいんでしょうけどねー)。

f:id:junichim:20211105145732p:plain

(なお、2021/11/5 時点の最新版では緯度経度欄がなくなっています)

このシートの E列 、 F列 が伊勢市の呼び方の『指定避難所』『津波緊急避難所』に該当しています。一方、H列が伊勢市の呼び方の『避難生活施設』(国の『指定避難所』)を表しており、I列~L列が国の『指定緊急避難場所』としてどの種類の災害に該当するかを示しています。

ここで問題になるのは、下記のように

f:id:junichim:20211105151434p:plain

(公開データには電話番号も載ってますがブログ用に消しています)

指定避難所や津波緊急避難所に該当している(〇がついている)んですが、『2階以上』の場合に該当している、という意味の注記付きの書き方です。 さらに、36行目にあるように、2階と3階以上で安全度ランクが異なるため、一つのセルに複数の情報が含まれている場合もあります。

これは機械的に処理するには扱いにくいですね。

対応方法

この状態について、今回は以下のように対応して、アプリで扱いやすくしました。

  • 注記部分(『2階以上』などの表記)は『詳細』などの名称の別カラムに分ける
  • 一つの建物に2つ以上の記載がある場合は、安全度の高いほう(より上層の階)のデータのみを採用する
  • 避難所種類に該当するか否かを〇ではなく、 True, False で指定する

もう一つ、ちょっとややこしいのが、下記のように学校の校舎と運動場がともに避難所になっている場合で、運動場の『津波緊急避難所』欄に『校舎※2階以上』という記述がある場合があります。

f:id:junichim:20211105173113p:plain

これって、普通に考えると、運動場の欄に書かれていても、津波緊急避難所としては校舎を使えということになると思います。なので、この場合は追加した『詳細』欄には何も記載せずに、『津波緊急避難所』としては〇をつけない(Falseを指定する)という形にしました。

これらをまとめると下記のような形になります。

f:id:junichim:20211105152535p:plain

この形式なら、機械的に処理しやすくなりそうです(実際のファイルは Github をご覧ください)。

で、出来上がったものを、 CSV形式 のデータとしてアプリ内で読み取るようにしました。

まとめ

このアプリを最初に検討したのが 2017 年ごろでしたので、いまさらまとめてどうするという感じもありました。 ですが、いざ避難所データを更新しようとしたときに、どこにも考え方をまとめていなかったことに気づいたので、とりあえずここにまとめてみました。

オープンデータとしていろんなデータが公開されることそのものは非常に良いことなのですが、この例のようにコンピュータで利用しようとすると何らかの加工をしなければならない場合だと、なかなかデータの更新に手が回らなくなるため、非常にもったいないな、というのが正直な感想です。

その意味では、オープンデータの次の取り組みとして期待するのは、機械的に処理しやすい形式でデータを公開してくれることですかね(GitHub とかのリポジトリで公開してくれてもいいですよねー)。

あと、余談になりますが、避難所の名称が同じ『指定避難所』なのに、伊勢市の呼び方と国の呼び方で、別の意味になっている件、呼び方を決める時なんとかならなかったもんですかね? 今でも、資料初めて読んだときめっちゃ戸惑ったのを覚えています。公務員の方はともかく、一般人からしたら紛らわしいことこの上ないですので、今後似たようなことが起きないことをお願いしたいもんです、はい。

QNAP NAS の admin 無効後のスナップショットレプリカでトラブル

知り合いの方と Twitter でやり取りしてたら、今更ながら QNAP でマルウェア被害が起こってることに気がつきました。

QlockerランサムウェアについてのQNAPからのお知らせ

怖い怖い。

幸い、自分の NAS はこれには巻き込まれてなかったんですが、この機にセキュリティをちょっとだけ強化したいと思い立ちました。

NASのコントロールパネルにログインするたびに、

  • デフォルトの admin ユーザーを使ってるので無効にして、新しい管理者アカウント使いましょう
  • 2段階認証を有効にしましょう

との警告が出てくるので、これに対応することにしました。

で、これに対応したら、スナップショットレプリカで問題が起きたので、そのあたりに事をメモしておきます。

なお、 試した際の QTS のバージョンなどは下記の通りです。

  • スナップショットレプリカの送信側: QNAP TS-231P, QTS 5.0.0.1808
  • スナップショットレプリカの受信側: QNAP TS-251+, QTS 4.5.4.1800

なお、参考までに、セキュリティ強化のアドバイスがQNAPのブログにありますので、リンク張っときます。

QNAP NASを無防備にインターネットに直接接続してはいけない理由とは | QNAP ブログ

admin の無効化

やりかたは簡単で、公式のドキュメントに従えばすぐに終わります。

  1. 新規に管理者権限を持つユーザーを作成
  2. 新しく作った管理者ユーザーでログイン(以後、新規追加管理者、と呼ぶことにします)
  3. デフォルトの admin を無効にする

とすればできます。 そのうえで、『コントロールパネル』->『アプリケーション』->『Telnet/SSH』で、『アクセス許可の編集』を選択し、

f:id:junichim:20210921113515p:plain

新規追加管理者に対して、SSHを許可しておきます。

ターミナルからもログインしてみて問題ないことを確認しておきます。

2段階認証を有効化

こちらも簡単です。

ログイン後、画面のアカウント名にあるドロップダウンリストをクリックし、メニューから『オプション』を選択します(下記画像は admin でログインしたときのものです)。

f:id:junichim:20210921114031p:plain

『2段階認証』タブを選択し、『使用開始』をクリックします。

f:id:junichim:20210921114208p:plain

QRコードが表示されるので、

f:id:junichim:20210921114338p:plain

スマホでQRコードを読み取ります(認証アプリは Google Authenticator を使ってます)。スマホ側で設定ができたら、『次へ』ボタンを押すと、スマホに表示されるセキュリティコードを入力するように求められるので、入力して問題がなければ設定完了です。

問題発生

さて、ここまでやって問題がないように思えたのですが、一つ重大な問題が起きてました。 2台のQNAPでレプリケーションを行っているのですが、夜中に動いているレプリケーションが失敗していました。

調べてみると、レプリカジョブを設定した際に使用していたアカウントが admin だったのですが、レプリカの受信側のNASでも admin を無効にしたため、アカウント認証が失敗したのが原因でした。

ということで、新規にレプリカジョブを設定しました。

レプリカジョブのユーザー名の設定方法

下記の記事をみると、 QTS 4.5.4 以降であれば、スナップショットレプリカのユーザー名を変更できるようです。

In Snapshot Replica, why can’t my NAS connect to the remote NAS? | QNAP

ネット上のディスカッションの記事などを見ると、adminは変更できない、というのもあるのです、 QNAP の記事があるということは仕様変更があったんでしょうね、多分。

ということで、これに従って、ユーザー名を変更してみます。

新規にレプリカジョブを設定

ユーザー名を変更としましたが、実際は(後述する理由により)新規にレプリカジョブを設定しました。

送信側のNASにログインして、『ストレージ&スナップショット』を開いて『スナップショットレプリカ』を選択します。

『レプリケーションジョブの作成』を押して、レプリカジョブを設定していきます。受信側 NAS のアカウント情報として、 admin を無効にしているので、新規追加管理者のユーザー名を指定して、『テスト』を実施すると、

f:id:junichim:20211020154952p:plain

のように、受信側NASの2段階認証を無効にしろ、と出てきます。

それってセキュリティ的にどうなんだろうか?と思いつつも仕方ないので、2段階認証を無効にして、再度『テスト』を実行すると、

f:id:junichim:20211020155552p:plain

のように成功と表示されます。

あとは、ジョブを実行するスケジュールや送信時のオプション(圧縮の有無や暗号化の有無など)を選択して、ジョブを作成します(下記画面の下側のジョブです)。

f:id:junichim:20211020155907p:plain

動作確認のため、『▶』のボタンを押すとすぐにレプリカジョブが実行されます。問題なくジョブが完了すれば、OKです。

不可解な現象

上記のレプリカジョブの設定が成功するまでにいろいろと試しました。その際に不可解な現象が2点ほどあったので、メモっておきます。

現象1

上記の設定方法として、『新規にレプリカジョブを設定』としたのですが、普通に考えれば、既存のレプリカジョブのユーザー名を変更すればいいのでは?となると思います。

実は、最初はこのように既存のジョブに対して、ユーザー名を変更して試したのですが、こんな感じになぜかジョブが失敗する、というのがありました。

f:id:junichim:20211021094836p:plain

いろいろと調べたのですが、結局原因はわからずじまいでしたが、現象としては、

  • 既存のレプリカジョブのユーザー名を変更することは可能
  • 『今すぐ実行』をおこなうと、ジョブは問題なく開始する
  • しかし、ジョブの最後でエラーが発生し、レプリカジョブそのものは失敗と記録される
  • 一方、受信側NASでは、スナップショットが記録されている

というものでした。なお、送信側のレプリカジョブのログを見ると、エラーは

f:id:junichim:20211020160714p:plain

というものでした。

いろいろと試したのですが、結局、既存のレプリカジョブ(今まで動作していたジョブ)を使うとなぜか失敗する理由はわかりませんでした。ひょっとしたら、保存済みのスナップショットの絡みとかがあるのかもしれませんが、そこまで試してないので原因は不明です。

今回の自分の場合は、古いほうのスナップショットレプリカジョブと受信側NASにあるすでに取得済みのスナップショットをそのまま残しておけば、レプリカジョブ自体は新規に作っても問題なかったのでよかったのですが、もしどうしても同じジョブを使わないといけない場合はちょっと苦労しそうですね。

なお、参考までに、スナップショットレプリカでの似たような問題が、下記にも載ってました。

Snapshot Replicas and changing from Default Admin account - QNAP NAS Community Forum

現象2

これはレプリカジョブそのものの不具合というのではありませんが、ちょっと不思議な現象だったので、メモっときます。

レプリカジョブでユーザー名が admin の設定のジョブが残っている状態(adminを指定している古いジョブと新規追加管理者を指定している新しいジョブが2つある状態)で、動作確認のため NAS を2台とも再起動しました。

すると、受信側の NAS にログインすると

f:id:junichim:20211020161021p:plain

こんな感じに、『IP アドレス 192.168.x.x をブロックした』と警告メッセージが出てます。この IP アドレスは送信側のNASのものです。

実際に、『コントロールパネル』->『セキュリティ』->『許可/拒否リスト』を見ると、下記画像のように、接続拒否になっています。

f:id:junichim:20211020172850p:plain

どういうことだろうか?と思い QuLog Center を開いて、システムアクセスログを確認すると、

f:id:junichim:20211020173238p:plain

のように、 admin アカウントおよび新規追加管理者でのログインの失敗が記録されています。

ここで『コントロールパネル』の『セキュリティ』を確認すると、『IPアクセス保護』のタブに

f:id:junichim:20211020162730p:plain

とあります。1分間に5回以上 SSH でのログインに失敗があると一時的にブロックするとあります(画面の設定値はNASのデフォルト値です)。どうも、これにひっかかったようです。

どういうことでしょうか?単純に推測すると、 NAS を起動したタイミングでレプリカジョブに設定しているユーザーによりログインが試みられているのではないかと思われます。

この推測の元、いろいろやってみます。

『セキュリティ』画面から、ブロックしていた制限を削除すると、新規追加管理者のほうはログイン成功が記録されるようになりました(起動時の一時的なログイン失敗と考えればよいのかな?)。

一方、QuLog Center を確認すると、 admin アカウントのほうは引き続きログイン試行を行い、接続失敗になっています(ただし、ログを見るとログイン試行は連続で3回ほどだったので、接続拒否の試行回数5回/分に達しないためか、接続拒否には追加されなくなっていました)。

次に、送信元のレプリカジョブのユーザー名を admin から、新規追加管理者に変更したら、 admin でのログイン失敗の記録が収まりました。

なので、この一連の動作は、やはりレプリカジョブの挙動だと推測されます。

なんとなく現象がわかったのでいいんですが、いきなり接続拒否のメッセージが出てきたら焦りますね。

まとめ

結局、スナップショットレプリケーションの関係で、管理者アカウントは下記のように設定しました。

  • レプリケーションの受信側 NAS は、 admin を無効化し、新規ユーザーを作成し、2段階認証は無効にしました
  • レプリケーションの送信側 NAS は、 admin を無効化し、新規ユーザーを作成し、2段階認証を有効にしました

また、スナップショットレプリカについては、

  • admin アカウントを無効にして、レプリカジョブを設定することは可能
  • ただし、うまくいかない場合もあるので、場合によっては試行錯誤も必要かも
  • NAS の再起動時は、ログイン失敗により接続拒否になっていないことを確認したほうがベターかも

というあたりでしょうか? 検証が不十分な面もある情報ですが、一事例として何かのご参考になればと思います。

にしても、QNAP さん自身も一般的な推奨事項として、 admin は無効にしましょうと言ってるので、 admin を無効化するなら、レプリカジョブももうちょい賢く対応してほしいものです。 > QNAP さん

いずれにしても、マルウェアとか、ほんとやめてほしいですね。

Graphviz のインストール

グラフを書きたくなったので、 Graphviz をインストールしました。一連の作業時のメモです。

なお、下記の記事を参考にしています。

テキストデータをグラフ画像に変換するツール「Graphviz」ことはじめ | DevelopersIO

Graphviz のインストール

wsl ならインストールは簡単です。

mor@DESKTOP-DE7IL4F:~/tmp/graphviz$ sudo apt install graphviz

テスト

test.dot というファイルを用意します。

// graphviz test file
// ref
//   https://dev.classmethod.jp/articles/graphviz-beginner/
//
strict graph {
  a -- b
  c -- d
}

png 形式でファイルに出力します。

mor@DESKTOP-DE7IL4F:~/tmp/graphviz$ dot -Tpng test.dot -o test.png

こんな感じでグラフが作れます。

f:id:junichim:20211015115547p:plain

ただ、このままだと日本語は表示できませんでした。

日本語フォントのインストール

というわけで、日本語フォントをインストールします。wsl2 でも Ubuntu と同じようにインストールすればよいようです。

下記の記事などを参考にして、

インストールしてみます。

mor@DESKTOP-DE7IL4F:~/tmp/graphviz$ sudo apt install fonts-ipafont fonts-ipaexfont

IPA フォント IPAex フォントについては、下記などをご参考にしてください。

IPAexフォントおよびIPAフォントについて | 一般社団法人 文字情報技術促進協議会

dot ファイルでのフォントの指定方法は、こちらの記事などを参考にしました。下記の dot ファイルを処理させると、

strict graph {
  node [shape=circle, fontname="IPAexGothic"]
  a [label="あ"]

  a -- "日本語"
}

f:id:junichim:20211015121526p:plain

問題なく表示できました。

ちなみに、 fontname が実際にどのフォントを指しているかを見たければ、 -v を付ければこんな感じに表示されます。

mor@DESKTOP-DE7IL4F:~/tmp/graphviz$ dot -Tpng japanese_valid.dot -o japanese_valid.png -v
dot - graphviz version 2.43.0 (0)
(中略)
fontname: "IPAexGothic" resolved to: (PangoCairoFcFont) "IPAexGothic, Regular" /usr/share/fonts/truetype/fonts-japanese-gothic.ttf
(後略)
mor@DESKTOP-DE7IL4F:~/tmp/graphviz$ 

あとは、dotファイルの書き方を調べていけば、いろいろと書けるようになりそうです。