2018年3月26日

気象庁防災情報XMLの受信と周辺サービスをGCPに移行した話

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

そろそろ何かアウトプットしておかないとNo Activityマンになってしまうと思いつつも色々やることは山積みで筆の捗らない今日この頃、みなさんいかがお過ごしでしょうか。

さて、2015年12月にEVI 地震火山詳報を公開してから約2年と3ヶ月(その前身の桜島詳報から数えると3年7ヶ月)が経過しました。
実は、2017年10月頃のConoHaの障害によりサブスクライバが長時間止まってしまい、気象庁のPuSH配信から外されたため同月よりEVIのサービスが停止しておりました。
この際、本業(ゲヒルンUN_NERVへ作画提供)でも震源・震度地図の作画エンジンを作っているので完全にサービスを畳んでしまおうかとも思ったのですが...
振り返って周りを見てみれば、インタラクティブな震源・震度マップに挑戦している方が意外と少なく、作画方法も本業の仕組みとは全く異なるので 防災情報デザインに関する異なるアプローチの研究 ということで緩く継続してみようと思い立った訳です。

#防災情報デザイン、特に地震に関するものに関しては、様々な方が主にUN_NERVで提供されている地図デザインをパクって何度も何度も車輪の再発明をされていますが、みなさん少しは配色を変えてオリジナリティを出したり、「俺ならこうする!」といった伝え方の工夫を取り込んでみてはいかがでしょうか...? 芸が無さすぎて全くつまらんです。

EVI 地震火山詳報のサービスと後ろ側については、以前書いた記事をご覧ください。

地震とか火山噴火情報を閲覧できるWebサイトを作った (2015年12月)

上記の記事の通り、EVIは後ろ側がかなり複雑に絡み合っており、機能追加や改修をするにも面倒になっていました。
また、受信したXMLや生成したGeoJSON、画像の保管も同じインスタンス内に入っていたため、ある一定期間ごとに古いデータを削除する等のメンテナンスが必要でした。

...そこで、今回EVIを改修するにあたり以下の目標を立てて移行計画を実行することにしました。

1. 出来る限りマネージドなクラウドサービスに載る(俗にいうサーバレス)システムにする
2. 出来る限り最新の設計・構築方法、技術を用いる
3. デザインをなんかイケてる感じにする←重要

ということで、これらを念頭に置きつつ、隙間時間を使って3ヶ月ほどで作ったものがこちらになります。(冒頭のスクリーンショットのサービス)

QUAKE.ONE
https://quake.one/

#火山要素が消えたことには目をつぶってください

Twitterは以前のIDのまま Prioris_EVI を使っています。

Pushbulletも以前のままです。

日本国内で発生した全ての震源・震度情報
earthquake_jp

日本国内で発生した震度3以上の震源・震度情報
earthquake_int3over

さて、ここからは技術的なお話。

EVIからの進化ポイントは以下の通り。

1. 小さな画面を持つデバイスにおいて、操作可能な地図が非常に小さくなる問題を解決
→どの画面サイズのデバイスにおいても全画面で地図を表示し、情報をマップ上に配置する新しいデザインを採用

2. OpenLayersのバージョンアップ
→OL3から最新のOL4へ移行

3. ページを動的から静的生成に変更、SPA(single-page application)化
→地震発生をトリガーにしてレンダリング用のJSONをあらかじめ生成

4. Twitter、Pushbulletにて配信する画像形式の震源・震度地図のデザイン変更
→画像の生成方法もwkhtmltoimageからPuppeteer + Headless Chromeに刷新

また、これに伴ってサブスクライバから後ろも全て刷新しました。
構成図は以下の通り。(横に非常に長いので、拡大してご覧ください)


使用したサービスは以下の通り。

Google Cloud Platform
・App Engine
・Compute Engine
・Cloud Functions
・Cloud Datastore
・Cloud Storage
・Cloud Pub/Sub
・Firebase Hosting

地震が発生して「震源・震度に関する情報」が流れてきた時のパターンを簡単に説明すると...

1. 気象庁からPubSubHubbubでJMAXML publishing feedを受ける
2. atomを解析してEntryを取り出し、Task Queueに投げ入れ、Entryの内容をDatastoreに書き込む
3. WorkerはXMLを取得、XMLスキーマを適用してJSON形式に変換、XMLとJSONをStorageに保存し、JSONをPub/Subに流す
4. 3種のPub/Subトピックのうち地震に関係するトピックにぶら下がっているCloud Functionsが実行、Datastore内の地域コード対地域重心座標に基づいてGeoJSONを生成してStorageに保存、概要をPub/Sub(topic: quake-one)に流す
5. Pub/Sub(topic: quake-one)にぶら下がっているCloud Functionsが実行、Puppeteer(+Express)が待ち受けているGCEインスタンスに画像生成リクエストを送信
6. Headless Chromeで画像用ページを表示して撮影、Storageに保存
7. 画像生成リクエストが成功すると、当該eventIDの地震の概要と画像のURLをPub/Sub(topic: quake-one-with-image)に流す
8. Pub/Sub(topic: quake-one-with-image)にぶら下がっている各Cloud Functionsが実行、PushbulletやTwitterへ投稿
9. QUAKE.ONE はStorageを参照し、概要の入ったJSONとインタラクティブ地図描画用のGeoJSONを取得、JavaScriptでレンダリング

以前の複雑に絡み合った状態からすれば、随分とメンテナンスしやすいシステムへと変わりました。

AppEngine、Firebase Hostingは自動的にLet's EncryptでSSL証明書を更新してくれるし、しっかりキャッシュ、CDNが効いてくれます。
Storageは、ライフサイクルを設定することで、古いXMLやJSON、画像データを自動的にNear line→Cold lineと安価なストレージに移行、あるいは削除してくれます。
Cloud Functionsは実行時課金で、気象庁XMLをトリガーにして実行する程度の回数では全て無料範囲内に収まります。
唯一、画像を生成するためのPuppeteer + Headless Chromeが入っているGCEインスタンスだけは面倒を見てあげなければなりませんが、これも永続化が必要なデータやステートは持っていないので管理は楽々です。

さらに、副産物としてJMAXML JSON Viewerも出来ました。
こちらはデータ保存期間が浅い&検索が弱いので受信状況の確認程度用です。
商用利用は禁止ですので、お仕事で使いたい方はゲヒルンの気象庁XML Viewerをご契約ください。

というわけで、出来る限り新しめの手法でマネージドな感じのイケてるサービスが出来ました。

めでたし、めでたし。(終)

2017年12月31日

2017年の色々まとめ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
気づいたら2017年最終日...
こまめに文章で残せなかったので、2017年何を作ったのか、何を買ったのか、何をやったのか、Twitterの投稿を拾いつつまとめておくことにします。
(まとめておかないと自分でも何やったのか思い出せなくなっちゃうお年頃)

1月:SECCON TOWERをSECCON決勝戦で展示

昨年末に作ったSECCON TOWERを決勝大会にて展示。
スクリーンに動く様子を映し出してもらったけど、Keyは隠してませんでしたよ?

SECCON TOWER FONTを作ってGitHubで公開してたら、勝手にステッカー化されてて当日会場でビックリした。

1月:グレースモークアクリルとタカチのケースで何か良い感じの箱を作る


その後、この箱は中身を詰められて、とあるシステムとして納品されていきましたとさ。

1月:Mac mini(2011)をバラバラ分解してFusion Drive化

ついでにメモリも16GBにしたのに、今は光出力をアンプに繋いで音楽再生用マシンになっている。勿体無い。

2月:サーマルプリンターでサーバルプリント


ネタお遊び。カラー画像を良い感じに2値化するアルゴリズムとかを色々模索したりした。

5月:iPod miniを勝手にPRODUCT RED化



最終的に128GBのSDカードを入れて、メインのポータブルプレイヤーとして利用中。

4月〜10月:BEEP on USBを設計・製作





菊ちゃん先生りぶら先生とPrioris名義で製作。
最終的な「ver1.0」の形になるまで、10回以上の版更新を重ねている...

9月〜10月:中華チップマウンタを購入、稼働開始




BEEP on USBなどを極小ロット製造するために購入。
ちょっと癖があるけど、色々調節しつつ使用中...
これについても、もう少し知見が貯まったら記事にします。

9月:NanoPi NEOをクラスタ化するためのアクリル作り


NanoPi公式のスタッキング用アクリルキットがゴツいので自作。
CADで図面引いて深センの企業に発注。

9月:iPhone 8を購入

2年ぶりにiPhoneを購入。SuicaをApple Watchから移行して超快適になった。

9〜11月:NanoPi NEOクラスタ稼働開始


何に使うか特に考えてなかったので、とりあえず暗号通貨をマイニングしてみたり。

10月:BEEP on USBを技術書典3で頒布


100個くらい用意していったら完売。
表紙デザインに引き寄せられてくる方も多数いらっしゃって面白かった。

10月:BEEP on USBの書き換え機



忙しすぎて肝心の作者が遊んでなかったので、色々MMLで鳴らして遊んでみた。

11月:テクトロのオシロ画面ハードコピーを直接取り込むデバイスを製作

フロッピーで波形を取り込むのが面倒なので、USBで直接パソコンに接続して取り込めるようにしてみた。
この後、基板も設計して小さい箱に収めてみたけど、それはまた暇なときに記事にします。

11月:THETA Vを購入、秋葉原360度記録開始


Insta360 oneと迷ってThetaを購入。
写真を撮るというよりも空間を切り取るという感覚に近かったので、移りゆく場所のその時々を記録する使い方をすることに。

12月:BitcoinでGoogle Homeを購入


Dialogflowとかでアプリ作ってみたけど、イマイチだった。
妄想では、直近起きた地震の情報とかをスムーズに教えてくれるものができる予定だった。


12月:BEEP on USBを秋葉原の店舗で販売開始


BEEP on USBを家電のケンちゃん 秋葉原ラジオデパート店で販売開始。
実績「値札のついたものを秋葉原のお店で売る」を解除

と、まあこんな感じでしょうか。
振り返ってみれば、2017年は「売り物(ハード)をいっぱい作る」方法や機械を学んだ年でした。

さて、来年は何を作りましょうか。

2017年10月13日

洗面台の水栓に合う後付けレバーを作ってみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

3Dプリンターで、古い洗面台の水栓に取り付けられるハンドルレバーを作ってみたお話。

実家は築25年超。
洗面台やトイレなど色々なところに、今の最新式と比べれば劣る設備がついています。
その最たるものが洗面台(親父曰く)であり、今風のシングルレバーではなく、昔はおしゃれであったであろう2つのハンドルがそこには付いています。
しかし「手を洗う時に水を止めたり出したりしたいけど、握るのは嫌」という親父の意見もなるほど確かに理解できます。

というわけで... 今回は3Dプリンタでぴったり合うハンドルレバーを作ってみることにしました。

まずは、ハンドルの寸法を測ります。
洗面台に付いていたハンドルは、王冠のようなギザギザ8個付いたタイプ。
このギザギザの頂点から頂点まで、ハンドルの中心を通る長さを計測すると48mm。
さらに、ギザギザの間の窪みから対向側の窪みまでの長さを計測すると40mm。
これを元にFusion360で図面を引いていきます。

ハンドルは、下に行くにつれて少し大きくなる形状だったので、余裕を持って50mmの円を描き、さらに内側に同じ中心点を持つ40mmの円を描きます。
この円を8等分する線を引き、等分した線と外側の円が交わる部分を終点にして円弧を描きます。この時の円弧の頂点は内側の円にします。

...これを繰り返してハンドルとほぼ同じ大きさの輪郭を作成。
外側に円を描き、取っ手となる部分を描いて、押し出しツールで7mmの厚さにしたのが以下。


これをSTL形式で出力して、3Dプリンタの付属ソフトでオブジェクトをスライスしてプリント開始。


30分程度で出力完了。


実際にハンドルに取り付けてみると...


いい感じ!

2Dで描いて押し出しで3D化するという超手抜きで飾り気のないデザインですが、Simple is BESTということで。

2017年10月4日

Nano Pi NEOをコンパクトにスタックしてみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

秋月電子通商やaitendoでも販売開始されたNano Pi NEO/NEO2を複数個買って、キレイにまとめてみた話です。

どうでもいい話ですが、大きいこと片付けてからブログ書こうとすると永遠に書けなさそうな気がしてきたので、小さい細々したもので外に出せそうな話は書いていくことにしました。
#続くか分からないけど...

Nano Pi NEO/NEO2は、Allwinner H3/H5が搭載された、非常にコンパクトなシングルボードコンピュータです。
Raspberry Piと違ってHDMIや4つのUSBポートは搭載されていませんが、GPIOピンヘッダからUSBが2本出てたり、NEO2ではGigabit Ethernetを搭載していたりと、ヘッドレスでサーバ的に使ったり、何かに組み込んだりするには安くてコンパクトで使い勝手が良いボードです。

とある目的でNEOにUSBドングルタイプの装置を繋げてみたところ、うまいこと認識してくれたので複数個買って束ねて使うと便利かも...というわけでキレイにまとめる方法を探し始めました。

Nano Pi NEOの製造販売元であるFriendly Elecからは"4-layer Dual Stack Acrylic Case for Cluster DIY"という2個x4段重ねできるアクリル製の公式の製品がありますが、これがなかなかゴツい。

4-layer Dual Stack Acrylic Case for Cluster DIY (Friendly Elecより)

また、ヒートシンクの下に(穴がいくつか空いているものの)アクリル面が来るため、少し放熱の面では効率悪そう...

ということで、もっとスリムで熱も逃げやすそうなものを作ってみることに。
今回は、以下の条件で設計してみました。

・Nano Pi NEOの四隅の穴は35.4mm間隔
・Nano Pi NEO自体のサイズは40mm四方
・50x100mmに収まるようにする(コストを抑えるため)
・配線をするときにケーブルなどを結束バンドで留められるようする
・Nano Pi NEOを3mmのネジで固定できるようにする(2.5mm, 2.6mmネジは高いため)

NEOを2個横に並べると80mm、間に5mmの余白、左右両端に7.5mmずつ余白を設けて合計100mmとします。
短辺の長さは、NEOの幅(40mm)に合わせることでスッキリかつケーブルと干渉しないように。
ヒートシンクをアクリル板側に向けて固定しても放熱性能を出来る限り落とさないように、ネジ固定とアクリル板の強度を保つための最低限の余白を残して繰り抜き。
また、結束バンド固定穴としてNano Pi NEOの前後にくる面と各層の左右、計6個の長方形の穴を空ける。
さらに、アクリル板自体も上下段に連結できるようにするため、ボードをアクリル板に固定するためのネジとアクリル板を連結するためのシャフトが干渉し合わないように...


こんな感じにしてみました。
今までに何度かアクリル板のレーザーカット用図面を引くのに使っているDraftSightを今回も使用しました。

これに、埃除けのために最上段に付ける天板も同じ寸法で四隅の穴だけ空ける形で作ります。


この2つを念のため少し古いバージョンのdwg形式で書き出して、それぞれzip圧縮して発注。
発注先はElecrowで、アクリル板の色は透明(Transparent)、サイズは10cm Max * 10cm Maxの厚みは2.5mmにしました。
重さで送料が変わるので、送料が変わらないところまで枚数を増やしていったら合計で25段分くらいに...

製造と配送を含めて1週間くらいで届いたので、組み立てていきます。


NEOをアクリル板に固定するのは直径3mm 長さ20mmのなべ小ネジ、長さ5mmのナット(FB3-5)、長さ3mmのナット(FB3-3)。
各段を繋ぐシャフトは、長さ30mmの六角オネジ・メネジ(MB3-30)、最下段の足は長さ7mmの六角オネジ・メネジ(MB3-7)。


あとは、これを必要数に応じて積み重ねていって...


完成。今回はとりあえず手元にあった4個をスタックしてみました。

残り20数段分あるので、40個くらいのNEOをスタックできそうです。
そんなにあっても使いきれないので、欲しい方がいれば頒布します。

データはGitHubに置いてますので、自分でカットしたり発注できる人は以下よりどうぞ。
https://github.com/9SQ/Nano-Pi-NEO-Stack

2017年5月12日

iPod miniを勝手に(PRODUCT)REDっぽくしてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

最近はスマホで音楽が聴けるので 携帯音楽プレーヤーを別に持つ人といえばハイレゾ趣味の人くらいになりつつある気がしますが、今回は12年前のiPod miniをリニューアルする話です。

まずは、ジャンクで購入した時のiPod miniがこちら。


起動しない問題がありましたが、これは内蔵Microdriveが故障しているのが原因だったので予備のMicrodriveに交換したら問題なく動作。
それよりも気になるのは、このクリックホイールに保護フィルムを貼ったまま日光に晒されたことが原因と思われるパンダ日焼け。
カラーアルマイトの色は紫外線で退色してしまいますが、プラの保護フィルムが貼ってあったところは元々の色に近い状態で残っています。

外装自体には傷一つないので、この日焼けだけが何とも残念... ということでiPod miniを再カラーアルマイト処理に出してみることに。


まずはアルミ外装から、ロジックボードやMicrodrive、バッテリー、クリックホイールなどの中身を取り出していきます。


クリックホイールと液晶部のアクリル窓も取り外し、アルミ外装側に接着剤や両面テープが残らないように掃除していきます。
アクリル窓を外すときは、窓の周囲をドライヤーで温めながら押し込むと簡単に外せます。


全部バラバラにして並べると、こんな感じに。
この完全にアルミだけになった外装を、アルマイトの再処理をしてくれる会社に送ります。
元々のカラーアルマイト処理をしていたのはYKKらしい...ですが今回は、ポスト投函して1週間程度でカラーアルマイト処理して返送してくれる株式会社コーケンの「光研アルパック10」を利用してみることに。
アルパックは秋葉原のヨドバシカメラにて3780円(税込)で購入。
10点、250gまでのパーツを入れることができるので、もう一つピンク色のiPod miniの外装を入れて合計2点でやってもらうことに。

今回依頼した会社は、普段は自動車やバイク、自転車の部品をアルマイト処理したり、ラジコンなどのホビーパーツをアルマイト処理するのがメインっぽい会社ですが、果たしてうまく行くだろうか...などと心配しつつパックに詰めてポストに投函したのが4月29日。

間にゴールデンウィークで休業が入っていたので、処理されて返って来たのが5月11日でした。


返って来た外装をシルバーのiPod miniと並べて撮影。
再度カラーアルマイト処理するときは、一旦元の色を抜いてから新しい色を入れるそうなので、ピンクが抜けているときはシルバーのような色になっていたはず...?
本来、iPodの刻印はアルマイト処理された上から行なっているので、再処理すると消えてしまうのは知っていましたが、なかなか良い具合に跡が残っています。


これを、CF変換に入れた128GBのSDカード、新しいバッテリーと共に組み上げていきます。
手順は分解と逆なので省略...


DockケーブルでMacと接続してiTunesで初期化すると、無事128GBのiPod miniとして認識。


12年前のiPodが最新のiTunesで問題なく認識、ファームウェアの復元、音楽の同期ができるのは地味にすごい。
Apple Lossless(ALAC)も同期、再生が可能なのでまだまだ長く使えそうです。


最後にiPod mini 2世代(ブルー、シルバー)、iPod Video(5.5世代)との比較写真を。
iPod 5.5世代は128GBのmSATA SSDに換装して、コンデンサも交換済みだけど... バッテリー持ちが少し悪いのとTriple.fi10で無音時にノイズが気になる問題があるので、これからはiPod miniがメインになりそう。

Recent Photos from Atelier (Flickr)

作業場で撮影した写真をアップロードしています。記事にする前の試作なども公開中です。