2014年7月4日金曜日

JAXBでXMLとJavaオブジェクトのマッピング

しょーもないところで詰まってしまったメモ。

今回はJAXBでのXMLとJavaオブジェクトのマッピングについて。

JAXB(Java Architecture for XML Binding)とは、
XMLとJavaオブジェクトを相互変換するためのAPI 仕様。
Java SE6 からは標準ライブラリに組み込まれてる。


例えばこんなXMLをマッピングしたい場合。
※ほんとはもっと複雑な構造だったので分けわかんなくなったんだけど…

 
  
   
    
    
   
  
  
   
    
    
   
  
 


でマッピングさせたいJavaオブジェクトはこんな感じで書く。

@XmlRootElement(name = "hoge")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class XmlData {

 @XmlElementWrapper(name = "samples")
 @XmlElement(name = "sample")
 public List samples;

}

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
class Sample {

 @XmlAttribute
 public String id;

 @XmlAttribute
 public String name;

 @XmlElementWrapper(name = "datas")
 @XmlElement(name = "data")
 public List data;

}

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
class Data {

 @XmlAttribute
 public String id;
}
←これ無視して…


詰まってたのは、
<samples>とか<datas>とかの部分。
ここを要素(@XmlElement)だけアノテーションつけてクラス作ってたらエラーになった。

属性とかなくてただ要素がぶらさがってるだけのタグには、
@XmlElementWrapper
のアノテーションをつけて、そこのnameにタグ名を。 そんでぶらさがる要素を@XmlElementで指定。

作るときに参考にしてたXMLにはそうゆうタグがなかったんでミスった。。

ちなみにルートタグ(今回のだと<hoge>)は、@XmlRootElementで指定する。


なんかpreタグでソース埋め込むときに勝手に変換されたりしてクソ

2014年7月2日水曜日

【DJ】2014.07.05(sat) ANISON MATRIX!! at MOGRA

今月のアニソンマトリクスは群馬回ということで、ANISON GUNMATRIXです。


20140705 23:00~
ANISON MATRIX!! -アニソンマトリクス
http://club-mogra.jp/2014/07/05/2022/

OPEN 23:00
Door ¥2,000(1D)

■GUEST DJ
春楓
わかめ
junkMA

■DJ
chefoba (ANISON MATRIX!!/discloud/Lowfer Records/Anilab.)
D-YAMA(MOGRA)
Esupa (ANISON MATRIX!!/Anilab.)
melo(ANISON MATRIX,elemog)
kei。(ANISON MATRIX,elemog)
Hokboy (合法ロリPARTY/ANISON MATRIX!!/VOCALOID-ManiaX)

■VJ
DeLPi(ANISON MATRIX)
すーすけ(ANISON MATRIX)
310

■TIME TABLE
23:00~23:45 Hokboy
23:45~00:30 kei。
00:30~01:15 わかめ
01:15~02:00 chefoba
02:00~02:45 junkMA
02:45~03:30 esupa
03:30~04:15 春楓
04:15~05:00 melo

2014年6月25日水曜日

【DJ】2014.06.27(fri) ANIQUAD at 大宮444quad #ANIQUAD

6/27(金)22:00~ 大宮444quadにてDJします。

ANIQUAD
http://tweetvite.com/event/aniquad


■DATE
2014. 6. 27 (Fri)  22 : 00~5 : 00

■DOOR/ADVANCE
¥2,500/1D
¥2,000/1D (twvt GuestList "Yes")

■PLACE
444quad (Saitama Omiya)

■ACT
[SPECIAL GUEST DJ's]
DJ WILDPARTY
DJ 濱

[GUEST DJ's]
KoC_kun
HokBoy
Fuka
お父ちゃん。

[ANIQUAD DJ's]
Plaque Control
DJ ざんねん

[Guest VJ]
Routes



アニソン中心のオールジャンルです。
今回2度目の出演ですが、前回は初大宮ということで客層も雰囲気もとても新鮮だった記憶があります。

古越やお父ちゃんなど合ロリメンバーもいるので楽しみ。
状況みてremixも原曲もアニソンじゃないのも色々かけてこうと思います。

個人的には今とてもハンターハンター初期アニメの曲をかけたい。

お近くの方は是非!

2014年6月24日火曜日

気象庁のオープンデータを取得する(購読確認)

気象庁のオープンデータについて調査してこいといわれ
簡単に取得するまでの流れとJavaでのSubscriber構築についてメモする

Javaのサンプルソース全然ないんだよね…


■気象庁のサイト
気象庁防災情報XMLフォーマット 情報提供ページ


■手順
  1. 上記サイトにある申請フォームを使って登録申請
  2. 気象庁からAlert Hub経由で”購読確認”がGETリクエストで送られてくる
  3. 予め構築したSubscriverでリクエストを返す
  4. 登録終了後、同Subscriverに随時更新フィード(xml)がPOSTリクエストで送られてくる
  5. 更新フィードから欲しい情報を取得する
大まかにいうとこんな感じ。
PubSubHubbubっていう、フィードをリアルタイムで配信(プッシュ)するプロトコルを使っているシステム。

なんにせよSubscriver(購読側)を構築してサーバにあげてリクエストを受けられる状態にしておかないといけないわけなんだけど、”購読確認”と”更新フィード受信”っていう全然違う機能を同じURLで受け付けなきゃいけないのがちょっと厄介。


■実装
まずGETとPOSTの受け口を作る。そんで購読確認を返せるようにするんだけど、更新フィード受信後の処理はおいときます。

rubyなら
http://www.mk-mode.com/octopress/2013/11/20/rails-implement-pubsubhubbub-subscriber/

PHPなら
http://washitake.com/blog/archives/117

この辺りのサンプルが分かり易い。

しかしJavaはシンプルなやつがなくて。一応サンプルあるんだけど古いし分かりづらい。。
てことで作ってみたやつ↓

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Subscriber")
public class Subscriber extends HttpServlet {

 enum MessageStatus {
  ERROR,
  OK
 };

 public Subscriber() {
  super();
 }

 /**
  * 購読確認
  * GETリクエストを取得し、ステータスコード200とhub.challengeを返す
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String hubmode = null, hubchallenge = null;
  MessageStatus stsMessage = MessageStatus.ERROR;

  if (request != null) {
   if (request.getParameter("hub.mode") != null) {
    hubmode = request.getParameter("hub.mode");
   }
   if (request.getParameter("hub.challenge") != null) {
    hubchallenge = request.getParameter("hub.challenge");
   }

   if (hubmode != null && hubchallenge != null) {
    if (hubmode.equals("subscribe") || hubmode.equals("unsubscribe")) {
     stsMessage = MessageStatus.OK;
    }
   }
  }

  // ヘッダーのContent-Typeをtext/plainに設定
  response.setHeader("Content-Type", "text/plain");

  switch (stsMessage) {
  case OK:
   // OKの場合ステータスコード200と、hubchallengeの値をそのまま返す
   response.setStatus(HttpServletResponse.SC_OK);
   ServletOutputStream sos = response.getOutputStream();
   sos.print(hubchallenge);
   sos.close();
   break;
  default:
   response.sendError(HttpServletResponse.SC_NOT_FOUND, "404 not found");
   break;
  }

 }

 /**
  * 更新フィード受信
  * POSTリクエストで更新フィードからデータを取得する
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  // 取得xml毎の処理
 }

}

要するに肝は
GET リクエスト時、HEADER の Content-Type に text/plain を設定し、GET リクエスト受信時に取得した「チャレンジコード(hub.challenge の値)」をそのまま、ステータスコード 200 とともに返却しないといけない。(チャレンジコードの末尾に改行があってはならない)
ってところです。

ちなみにGETリクエストのパラメータは以下。verify_token は今回無視。
hub.mode … subscribe(購読登録) か unsubscribe(登録解除)
hub.topic … フィードの URL
hub.challenge … Hub 側指定の認証用のランダムな文字列
hub.verify_token … 購読者側指定の認証用のランダムな文字列(但し、Hub 登録時に指定した場合のみ)
hub.lease_seconds … Hub 再登録までの時間(但し、Hub 登録時に指定した場合のみ。上記の例では使用していない)
■テスト
とりあえず購読確認のテストをしてみる。
購読確認が問題なくできれば、あとはどんどん更新フィードを送ってくれる。

テストはGoogle がテスト用に公開している Hub を利用する。
https://pubsubhubbub.appspot.com/

ここのSubscribeページでフォームの内容を入れてDo it!ボタン押す
Callback URL:用意した Subscriber の URL を入力する。
Topic URL:フィード発行側の URL を入力する。
Verify Type:は、デフォルトのまま。
Mode:Subscribeを選択する。
Verify Token:認証用文字列を入力する。(利用したい場合のみ)
HMAC secret:デフォルト(空白)のまま。
Lease seconds:デフォルト(空白)のまま。(指定すれば、購読意思確認(Hub から GET リクエストが届く)間隔を変更できる。デフォルトは「5日」)
Topic URLは、適当にブログなんかで更新フィード作ってatom.xmlのURLを貼るのが楽。

次に、同ページの【Subscriber Diagnostics】のほうにURLを入力してGet infoボタンを押す

すると購読確認の結果が表示される。
statusverifiedならOK

あとは任意にPOSTのほうの実装をやればよいと

2014年6月18日水曜日

【制作】H.K.WORKS - UNIKE-5th Anniv. DJset

だいぶ経ってしまいましたが、、
UNIKE - 5th Anniversary - にて、 H.K.WORKS (HokBoy & KoC_kun) での再現DJmixを公開しました。




~ S e t L i s t ~

01. Fugenn & The White Elephants - mukougawa Remix
02. Annabel - スモルワールドロップ (ujaku Remix)
03. 北白川たまこ(洲崎綾) - ねぐせ (vvotaronidone garage)
04. 安藤裕子 - ニラカイナリィリヒ (fazerock 2013 remix)
05. Miii - The Automatic Scatter Machine
06. Terror Danjah - Upton Lane
07. Kettel - Afwezig
08. 秦基博 - rain (remix) by itsu
09. eufonius - メグメル (C∆ЯT∆LET Remix)
10. imoutoid - PART1 (Love of Digital Remix)
11. rei harakami - Own Cake
12. sHimaU - LxCxDxT (Shako-Pani Remix)
13. FaltyDL - Danger
14. Reliq - rushhour
15. ふんわりちゃん - M/M
16. Alizzz × Ray - lull ~そして僕らは~ (TANUKI Mashup)
17. Ray - ebb and flow (Nagi no Asukara Lull U Tonite Mashup) by Oblongar
18. ROCKY CHACK - Perfect World(H.K.WORKS Remix)
19. Lone - Lizard King
20. Wisp - Teddy Oggie
21. kaihatz - ptpia
22. Geskia! - Headroom Mindphone
23. Erast - Geogianintokyo
24. JM - Act Ⅰ - Kefka Palazzo
25. HImuro - Future in the Past
26. The Wedding Mistakes - Dramatic Behavior


”26.The Wedding Mistakes - Dramatic Behavior” は現場ではかけれませんでしたが、今回のmixでは最後に入ってます。この曲もそうですが、みーきゅんの関わってる曲はエモくてIDM寄りなものも多くてとても好きです。

僕の好きな感じと古越の好きな感じがごっちゃに、エモさだけでなんとかした感じ…
和洋折衷、温故知新です。

個人的に気に入ってるのは、
19. Lone - Lizard King
20. Wisp - Teddy Oggie
21. kaihatz - ptpia
22. Geskia! - Headroom Mindphone
23. Erast - Geogianintokyo
この辺。
LoneのLizard Kingはこの前Bleepから出た10周年コンピ収録の曲。箱鳴りやばくてかけてて最高に気持ちよかった。



そんなもんで次 H.K.WORKS の活動はあるかどうか分かりませんけど、
よかったらMIX聴いてみて下さい。

2014年6月13日金曜日

【お知らせ】合法ロリパーティー今年はやりません

合法ロリパーティー今年はやりません!!!!!

Stringのequalsメソッド

Stringのequalsメソッド、初め何も考えてないときはこんな感じで書いてた
String str = testDto.getName();

if (str.equals("test")) {
 //処理
}
これだとstrがnullだった場合エラーになるので、if文の前にnullチェックしないといけない。

でもこうすればチェックする必要がない↓
String str = testDto.getName();

if ("test".equals(str)) {
 //処理
}
もしstrがnullだとしてもエラーにならずfalseで返ってくる。

他人のソース見てて、定数先に書くこと多いなーと思ってたらちゃんと理由があったのね…
こうゆう常識的だけど知らねーってことけっこうあると思うので、 規約とか作法の本ちゃんと読む。。