プログラマーのメモ書き

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

避難所検索@伊勢(β版) をリリースしました

はじめに

今年度の頭頃(2017年4月頃)だったかな?伊勢市がオープンデータライブラリを公開しました。

オープンデータが増えてくれると、開発側としてはいろいろとうれしいことが多いので、大いに応援しています(頑張れー!伊勢市さん)。 といっても、誰も使ってる・見てるよ、という反応がないと、市役所の方もきっと残念がるでしょうから、早速オープンデータを使った何かを作ることにしました。

というわけで、作ったものを紹介します。

作ったもの

最初に結論を先に書いときます。

作ったのは、Android用アプリ『避難所検索@伊勢』で、現在地の近くの避難所を検索して表示するアプリです。 災害時でも利用できるように、オフラインでの地図表示を行います。

f:id:junichim:20170707150102p:plain

こんな感じになります。

まだ、β版ですが、気になる方がいれば、 Google Play から試してみてください!

play.google.com

ここまでの経緯

さて、以下ではこれをリリースするまでの経緯について書いておきます。

何をするか?

伊勢市でオープンデータの整備が始まったのを受け、作るものをあれこれ検討しました。まず公開されているオープンデータ(検討したのは2017年4月頃)を見ながら、いろいろと考えてみました。

最初は、伊勢市内の町毎の人口のデータがあったので、人口の移り変わりを一時期はやっていたインフォグラフィック的に見せるのも面白そうだと考えました。 国を挙げて、少子化対策・人口減少と言ってますからね。

伊勢市のオープンデータライブラリのデータには、町名ごとの人口はあるのですが、位置情報がありません。そこで、国土交通省の位置参照情報を見てみました。

位置参照情報ダウンロードサービス

両者を突き合わせると、その町を代表する地点の緯度経度がわかるので、地図上に表示できそうです。

ということで、これでいけそうかなと思い、CartoDB (今は CARTO と呼ぶみたい)を使って、ちょっと取り組んでみました。 最終的に、わかったことは、意外と町ごとの違いが目立たないし、町を地図上の一点で表示させると面白くないし、かといって、町の境界を表す多角形を定義して・・・なんてやり始めたら、仕事の時間が無くなってしまうし、ということでした。

もし、また気が向いたら、アイデア練り直してみよう、ということで、サクッとやめました。

次のネタ

で、次に浮かんだのが、避難所データを利用するアプリです。ほぼ一年前のOSC名古屋2016でも、オープンデータの避難所データを使うアプリの話があったので、悪くない線だと思います(もっとも、自分も参加していたのですが)。 アプリの機能としては、災害時での利用を想定して、インターネットが使えない環境でも、現在位置に最も近い避難所を検索できるアプリ、というものです。

構成

最初は、Google Map + マイマップ機能 で十分代用できるんじゃないかと思ったのですが、調べてみると日本国内だとGoogle Map の地図はオフラインモードで使えないようです。実際、自分のスマホで試した時も使えませんでした。

ということで、OpenStreetMap を利用して地図表示を行うことにしました。

今回作るのは、Android版のみですので、地図表示は、 Mapsforge というライブラリを使います。 また、現在位置から近くの避難所を探す際は、直線距離だとあまり現実味がないので、経路検索をするために、 GraphHopper というライブラリを使います。 まさか、経路検索ライブラリもオープンソースで使えるとは思ってなかったので、ちょっと感激です。

オフライン地図データの更新や避難所データの更新をどうしようかという点も気になったのですが、まずは使ってくれる人がどれだけいるかわからないので、それらの点は後回しにしています。 実際に対応するなら、特定のURLをチェックして、更新版があればダウンロード、という形になるんだろうな、きっと。

ということで、取り急ぎ作成したものが上記のものになります。 あと、このアプリのソースは、GitHub で公開しました。興味がある方はどうぞご覧ください。実装がいけてない点も多々あると思いますが、その点はご勘弁ください。

github.com

ライセンスは Apache License 2.0 です。

あ、あと、技術的なことなどはおいおい(気が向いたら)ブログなり、Webサイトなりに書いてきたいと思います。

今後

オープンデータに限ったことではないのですが、この手の無料版アプリの難しいところは、作って公開するまでは開発者のモチベーションさえあればなんとかなるのですが、その後の維持管理が難しいところです。 実際、オフライン地図データをどうやって定期的に更新させるのか、メンテナンスはどうするか、など色々と気にはなってきています。 (自分を振り返ってみても、過去に作ったもので、その後放置になってるものもあるんですよね、実際)

そういうわけで、当面は(まだモチベーションが続きそうなんで)メンテナンスすると思いますが、先々のことはまたその時に考えたいと思います。

OpenStreetMap で地図を編集してみよう!

はじめに

先日のOSC名古屋2017 にて、 OpenStreetMap のセッションを聞いてきました。 で、このセッション中に、地図が自由に編集できますよ、という話がありました。 自由にというとちょっと語弊がありますね。OpenStreetMap は

OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクトです。誰でも自由に参加して、誰でも自由に編集でき、誰でも自由に利用する事が出来ます。

OpenStreetMap 日本語サイト より引用

というもので、自分が知っている地域の情報が地図に反映されていない場合は、それを反映することができますよ、といったほうがいいかと思います。

ということで、 OpenStreetMap の地図を編集した話をメモしておきたいと思います。

ちなみに、OpenStreetMap なんて知らねーぜ、という方も多いかと思いますが、実は、Facebookの場所の地図表示はこの OpenStreetMap を使っています(地図のどこか下のほうかな?にクレジットがあります)。なので、知らず知らずのうちに使っていることも多いかもですよ。

アカウントの取得

地図を編集するなら、まずアカウントを取得する必要があります。 OpenStreetMapのページを開いて、『地図を編集』を押します。 アカウントを持っていなければ、『今すぐ登録』で登録します。 登録には、有効なメールアドレスとパスワード、表示名を入力します。

登録すると確認メールが来るので、問題なければメール中のリンクをクリックすればOKです。

チュートリアル

ログインすると、下記の様な画面が表示されます。

f:id:junichim:20170612165642p:plain

初めてなので、チュートリアルをやってみました。 チュートリアルでは、場所(ポイント)の指定方法、ライン(道路など)の指定方法、エリア(建物など)の指定方法、を教えてくれます。 いずれも、直感的な操作なので、すぐにわかる事かと思います。

ま、チュートリアルの詳細は紹介するよりも、実際にやってみてもらうほうがよくわかると思いますので、割愛します。

ただ、残念ながら、ポイントの説明までは日本語なのですが、エリアとラインの説明が英語でした。そんなに難しくないので、ポイントをやってみれば、エリアとラインのチュートリアルもなんなくこなせるかと思います。

地図を編集

さて、実際に地図を編集してみましょう。 OpenStreetMapにログインした状態だと、画面上部の『編集』ボタンをクリックすることでそのまま編集ができます。

f:id:junichim:20170612171150p:plain

編集画面では、上空からの画像(衛星写真?航空写真?)の上に、登録済みの地物(先ほどのポイント、ライン、エリア)が重ねて表示されています。

伊勢近辺の方ならわかりますが、上記の画像でも ダイムスタジアム伊勢(以前は、倉田山公園野球場)や最古の厄除観音で知られる松尾観音寺といった、超メジャーな場所ですらまだ登録されていません。 最初に登録すれば、登録者としての名前が一生(どころかOpeNStreetMapがある限りずっと)残るので、これは登録しない手はありません。

ということで、私が登録してしまいます。 登録すると、こんな感じです。

f:id:junichim:20170612173100p:plain

上空からの写真だと、伊勢市の消防本部・防災センターが建設中のようで、敷地がよくわからかったので、ポイントとして登録しています。 この状態だと、まだ正式に登録されていません。画面上部の『保存』ボタンを押すと、

f:id:junichim:20170612173620p:plain

のように、登録時の情報入力画面が表示されますので、適切なコメントを記入してから、『アップロード』を押します。 問題がなければ、データがアップロードされます。アップロード完了後、わりとすぐに反映されます(審査とかないので)。

f:id:junichim:20170612173959p:plain

これ、編集しだすと、『あ、ここの神社がない。よし、登録してしまえ。』とか『ここの川岸の形が違ってる。よし、なおしてやれ。』とか、簡単に編集できるので、結構くせになりそうです。

最後に

今回地図を編集してみようかな、と思い立ったきっかけは、OSM名古屋2017で聞いたのもあるのですが、たまたま自分の実家近辺を見たときに、近所の目印となるようなものが全くなかったためです。まあ、田舎だから仕方ないのですが、せっかくその場所に関する情報をもっていて、OpenStreetMapというものも知っているので、登録しない手はない、と思い立った次第です。

あと、普段は、OpenStreetMap を使ってばかりですが、一度昔々に地図作成ってどうなんだろうか?と思って、OpenStreetMap系の話を聞いたときは、(その時の話の主旨をよくわかってなかったのもあるかもしれませんが)GPSロガーが必要だったような印象を受けて、これは敷居高いな、と思った印象がありました。

でも、今回試して上空からの写真を元に、気軽に地図を編集できるので、これはやらない手はない、という印象でした。 登録したものが間違っていたらどうしよう、とかは気にせず、間違っていたら誰かが直してくれるはずなので、気にせずいきましょう。

少しでも、興味があれば、ぜひ試してみることをお勧めします。

ちなみに、上記の地図編集は、iDというエディタをブラウザ上で使った場合の地図編集となるようです。OpenStreetMapの地図編集は、これも上記の方法一通りというのではなく、JOSMという上級者向け(?)のツールなどもあるようです(こっちはまだ試せてません)。

地図編集するほどではない方に

あと、今回初めて知ったのですが、 OpenStreetMap の画面から、修正要望のようなメモを残す機能があります。

f:id:junichim:20170612174843p:plain

画面右端の列の吹き出しようなアイコンをクリックすると、

f:id:junichim:20170612232851p:plain

のようなメモ編集蘭が表示されます。

これは、自分で修正するほどではないけど、『こうしてほしい』、とか、『ここ間違ってるよ』いったような要望を伝えることができる機能のようです。 便利なのが、アカウントがなくてもメモを残すことができます。もちろん、アカウントでのログインがあれば、その人に紐づいたメモになります。

気になることがあるけど、地図を編集するほどではない、とか、アカウント作るのなんかいやだ、という場合、こういう機能を利用するのもありかと思います。

AWS CLI 複数の認証情報の設定について

以前、EC2のインスタンスを t1.micro から t2.nano へ移行する作業について書きました。

blog.mori-soft.com

この中で、S3 へバックアップを行うという設定を行っていたのですが、月一動作だったので、改めて動作確認をしてみると、どうもうまく動いていません。 こんな感じのエラーです。

2017-06-01 03:05:01 JST: aws s3 cp バックアップファイル名 s3://バケット名/
upload failed: バックアップファイル名 to s3://バケット名/ファイル名 An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

アクセス拒否のようです。

aws cli はいろんな方法で認証情報を指定できるので、これが間違っているのだろうと予想されます。 いろいろと調べてみると、 aws configure list で現在の認証情報の設定状況を確認できることがわかりました。

dev.classmethod.jp

早速、試してみると

bitnami@ip-172-30-0-73:~/.aws$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region                <not set>             None    None
bitnami@ip-172-30-0-73:~/.aws$ 

あれ?なんかおかしいぞ。

実は、aws cli を使う際、EC2 用のユーザーと S3 用のユーザーを分けていました。 で、上記のアクセスキーなどは、EC2ユーザーのものです。 おまけに、 region も設定されていない。

ということで、認証情報の設定方法を見直しました。

間違っていた点

恥ずかしならが、調べた結果、いろいろと間違っていました。まず現在設定していた方法は、

  • EC2 用のユーザーは aws configure コマンドで設定する
    • .aws/config と .aws/credentials に内容が書かれている
  • S3 用のユーザーは .aws/config.s3 ファイルにすべての内容を記述する
  • S3 用のユーザーを使う場合は、 環境変数で AWS_DEFAULT_CONFIG=.aws/config.s3 を指定する

というものでした。

で、まず大きく間違っていたのが、下記の説明にある、

docs.aws.amazon.com

この部分、

Storing Credentials in Config
The AWS CLI will also read credentials from the config file. If you want to keep all of your profile settings in a single file, you can. If there are ever credentials in both locations for a profile (say you used aws configure to update the profile's keys), the keys in the credentials file will take precedence.

(頑張って意訳)

Config ファイルへの認証情報の保存について
AWS CLI は config ファイルから認証情報を読むこともできます。プロファイル設定のすべてを1ファイルに保存することも可能です。もし、プロファイルの情報が複数個所にある場合は、credentialsファイルのキーが優先されます。

です。

この前半部分を読んで、configファイルに認証情報全部を書けると思い込んでしまいました。でも、上記の意訳からもわかるように、書けることはかけるんですが、(同じプロファイル)に対する認証情報が複数ある場合、credentialsファイルのものが優先的に使われるそうです。 やられました。

更なる間違い

上記の問題が大きいので、些細なことですが、さらに、ついでに間違っていたのが、config.s3 ファイルの書き方です。 config.s3 ファイルを、

bitnami@ip-172-30-0-73:~/.aws$ cat config.s3
[s3]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットアクセスキー
region = ap-northeast-1
bitnami@ip-172-30-0-73:~/.aws$ 

と書いており、いつつけたか覚えのない s3 というプロファイル名がついていました。 これは、プロファイル名になるはずなので、切り替えたければ、 --profile s3 のようにコマンド実行時にプロファイル名も指定する必要がありました。

仮にここを [default] に修正すると、

bitnami@ip-172-30-0-73:~/.aws$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region           ap-northeast-1      config-file    /home/bitnami/.aws/config.s3
bitnami@ip-172-30-0-73:~/.aws$ 

のように、regionは正しく認識されました(もっとも、上記の二重に認証情報がある場合の問題が残っているので、これでも使えませんがね)。

最終的な設定内容

で、結局、認証情報を使い分けるために、プロファイルを追加することとしました。ここで、プロファイル名は s3user としています。 設定後のファイルはこんな感じになります。

~/.aws/credentials

[default]
aws_access_key_id = EC2アクセス用のアクセスキー
aws_secret_access_key = EC2アクセス用のシークレットアクセスキー

[s3user]
aws_access_key_id = S3アクセス用のアクセスキー
aws_secret_access_key = S3アクセス用のシークレットアクセスキー

~/.aws/config

[default]
region = ap-northeast-1

[profile s3user]
region = ap-northeast-1

--profile s3user をつけてコマンドを実行すると、S3 用ユーザーの認証情報が使われています。

bitnami@ip-172-30-0-73:~/.aws$ aws configure list --profile s3user
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                   s3user           manual    --profile
access_key     ****************BBBB shared-credentials-file    
secret_key     ****************bbbb shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
bitnami@ip-172-30-0-73:~/.aws$ 

念のために、 --profile なしを試すと、ちゃんと EC2 用ユーザーの認証情報が使われます。

bitnami@ip-172-30-0-73:~/.aws$ aws configure list                                                                                                                     
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
bitnami@ip-172-30-0-73:~/.aws$ 

この認証情報を使うようにバックアップスクリプトを修正したら、問題なく動作しました。 めでたし、めでたし。