ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2014年8月19日

桜島が噴火したYoの裏側

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

作ってから1週間くらい経ってますが、プログラムの紹介というか詳解というか...
実は初めてのJava Servlet(&Tomcat)だったんですが、Eclipseからwar書き出して置くだけでdeploy完了というのは素晴らしい。
#小5の頃にPerlでCGI書いて動いた時くらいの感動

で、実際の仕組みは...
  1. 気象庁からPuSH(PubSubHubbub)で来るfeedを受け取る
  2. entryをSAX(Simple API for XML)で解析する
  3. 桜島に関する情報(噴火 or 爆発第1報)の場合はYoを送信
という感じ。

気象庁が公開している気象庁防災情報XMLフォーマットについては、下記を参照。
http://xml.kishou.go.jp/open_trial/

PubSubHubbubは以下。
https://code.google.com/p/pubsubhubbub/

ここ↑にはJavaで書かれたSubscriber Clientsの紹介もあるのですが、こちらはServletじゃないです。
特にServletに対するこだわりは無いけど、最近Scalaとかに興味あるのでWebサービスを書く為のJavaを学んでおこうかと...

セキュリティ上の都合で全てのコードを公開できる訳ではないのですが、PuSHの購読&受信とfeedの解析部分は以下の様な感じ。
#例のごとく酷いコードなので参考までに...

上がSAXハンドラ、下がPuSHサブスクライバです。
#Gistってファイル単位でバラしてコード貼り付けできないのね... (今更

実際には、このSAXハンドラのpublic void characters内で「現  象:噴火」「第1報 現  象:爆発」がcontent要素内に含まれる場合に分岐させてYoを送るメソッドを呼んでます。
それと、これも上記コードには含まれてませんが、受け取ったfeedに記載された全てのxmlは取得&保存しています。
#つまり、天気予報とか天気概要とか注意報警報なども"現在は"使ってないけど、保存はしてるっていうこと。

先日のYoアップデートの際にURLの添付が可能になったのですが、これに伴って噴火の詳細情報をYoにくっつけて送るアップデートをしようかなぁっと。
現在フロントエンドを書いてる途中で、これの仕組みは、保存されたxmlをパースして表示するだけですね。はい。

これに並行して、WebSocketでpushを... なんてのも準備中。
PuSHはネット上からアクセス可能なサーバでしか受けられないので、これを転送したいなぁっと。
これができると、噴火したら火口が赤LEDで光る桜島オブジェなんてものも作れちゃう訳です。

そういえば2週間弱くらい大学行って研究してない気がするけど... アッ(

2014年8月11日

桜島が噴火したYoを作った

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

鹿児島県の桜島が噴火(爆発)したときに「Yo」で通知してくれる仕組みを作ってみた。

QuitSquare » 桜島が噴火したYo
http://www.quitsq.com/sakurajima_yo/

使い方 
  1. Yoを起動します。
  2. 「SAKURAJIMA」にYoを送信します。
  3. 終わりです。
以降、桜島が噴火する度にYoが送信されます。
解除したい場合はSAKURAJIMAをブロックしてください。


実際にはこんな感じでYoが来る。
2014年 8月11日 15時01分 (今年199回目)の爆発時の通知なのですが、時刻を見れば分かるとおり15分遅れてます。
これは自分の書いたプログラムとかYo APIの遅延じゃなくて、気象庁が電文を公開するまでの時間なので、こちら側で何とかできる訳ではありません。
だいたい10〜15分程度は遅れるようなので、噴火「速報」的な使い方は全く保証できません。
が、実際噴火してから降灰するまでには時間があるので、降灰注意には使えるかも。

後ろの仕組みは簡単。
気象庁発表の電文をパース、桜島が噴火もしくは爆発した第1報を元にYo APIを叩くというもの。
Javaで書いてるのですが、ちゃっちゃと書いたせいで汚いのでキレイキレイしてから公開します。

他にも桜島の噴火情報を利用したサービスを考え中なので、そのうち作るかも...
その時は気象庁防災情報XMLについても書く予定。