まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

BlueMix でアプリケーションを作ると、データベースなどのサービス環境に接続するための情報を VCAP_SERVICES という変数から取得する必要があります。アプリケーションを Java で開発する場合に、これを具体的にどうやって実現するか、というサンプルを紹介します。


まず、これは Java で開発する場合だけでなく、全ての言語で言えることですが、BlueMix のアプリケーションサーバーにバインドされたサービスの情報は VCAP_SERVICES という環境変数から取得することになります。例えば MySQL サービスとバインドしていると、VCAP_SERVICES 変数には以下のような内容の JSON 文字列が追加されます:
"mysql-5.5": [
      {
         "name": "mysql-scsrh",
         "label": "mysql-5.5",
         "plan": "100",
         "credentials": {
            "name": "(データベース名)",
            "hostname": "XX.XXX.XX.XXX",
            "host": "XX.XXX.XX.XXX",
            "port": 3307,
            "user": "(接続ユーザー名)",
            "username": "(接続ユーザー名)",
            "password": "(接続パスワード)",
            "uri": "mysql://(接続ユーザ名):(接続パスワード)@XX.XXX.XX.XXX:3307/(データベース名)"
         }
      }
   ]
ここから接続に必要な値を取り出して接続することになります。Java 言語で JDBC を使うのであれば、赤字に相当する部分を取り出して、以下の様な処理を実行することでコネクションを取得することができます(別途 MySQL 用の JDBC ドライバを用意しておく必要があります):
try{
  Class.forName( "com.mysql.jdbc.Driver" );
  Connection conn = DriverManager.getConnection( "jdbc:" + "mysql://XX.XXX.XX.XXX:3307/(データベース名)", "(接続ユーザ名)", "(接続パスワード)" );
    :
}catch( Exception e ){
  e.printStackTrace();
}
MySQL に限らず DB2 や MongoDB、Twilio などでも同様です。接続情報が必要かどうかはともかくとして、バインドされたサービスに関する設定情報は VCAP_SERVICES 環境変数の中に JSON 形式で格納されるので、そこから必要な情報を取り出して利用する、という流れになります。


問題は Java で JSON を扱うのが意外と面倒、ということです。JSON は JavaScript 用のオブジェクト形式ですが、Java と JavaScript の親和性がいいとは思えないくらいに扱いが難しいのでした。

とりあえず、サンプルとしてシンプルな JSON ライブラリである JSON simple を使って実装してみます:
jsonsimple

json-simple - A simple java toolkit for JSON
 
これをダウンロードして jar をプロジェクトにインポートした上で、こんな感じのコードを実装することになります:
import org.json.simple.*;
import org.json.simple.parse.*;
import java.sql.*;


:
:
Connection conn = null;
String vcap = System.getenv( "VCAP_SERVICES" );
if( vcap != null ){
//. 環境変数 VCAP_SERVICES をデコード JSONParser parser = new JSONParser(); Object obj = parser.parse( vcap ); JSONObject json = ( JSONObject )obj;
//. mysql5-5 の credentials 以下のみを取り出す
JSONObject credentials = ( JSONObject )( ( JSONObject )( ( JSONArray )json.get( "mysql-5.5" ) ).get( 0 ) ).get( "credentials" );
//. 上記赤字部分の情報を取り出す
String name = ( String )credentials.get( "name" );
String hostname = ( String )credentials.get( "hostname" );
Integer port = ( Integer )credentials.get( "port" );
String username = ( String )credentials.get( "username" );
String password = ( String )credentials.get( "password" );

//. コネクション取得
try{
Class.forName( "com.mysql.jdbc.Driver" );
conn = DriverManager.getConnection( "jdbc:mysql://" + hostname + ":" + port + "/" + name, username, password );
}catch( Exception e ){
e.printStackTrace();
}
}
:

でもまだちと面倒だよなあ・・・ もう少し可読性よく書きたいんだけど、Java だと JSON は本当に厄介です。


 

BlueMix という、ネタ発表に便利な環境を手に入れたので、ちょっとだけ実用的かな、、、と思えるページを作ってみました:
dW モバイル(http://dw.ng.bluemix.net)

名前の通り、IBM developerWorks をモバイルブラウザ向けに最適化したウェブページです(そのままだと商標的にマズいかな、と思ったので、サイト名称は "dW モバイル" にしています)。
写真


日本語設定のブラウザで見ると日本の、それ以外の場合は本家英語サイトの情報を表示します。
コンテンツは常に RSS を参照した結果から表示しているので、リストの最新性などは(RSS がタイムリーに更新されている限り)保たれているつもりです。

これだけだと技術的にはどうということのない、ただの RSS リーダーなのですが、モバイル UI/UX を実現するために dojo ツールキットを使ってみました。アンドロイド端末でアクセスするとアンドロイドチックな UI に、それ以外では iPhone チックな UI にしたつもりです。

Ajax や Lazy Load 実装など、まだまだ改良の余地はあると思っていますが、あると(自分も)便利なのでとりあえず BlueMix 上で公開します。BlueMix が無料で使える間は(苦笑)このまま稼働予定です。



 

4月後半から「日本全国! マンホールの蓋(フタ) コレクションVol.1」というガシャポンが稼働を始めています:
7a03b792

ついにガチャポンに登場!「日本全国!マンホールの蓋(フタ)コレクションVol.1」


この Vol.1 シリーズでは、北は北海道から南は福岡まで、全7種のマンホールダイキャストがガシャポンの景品になっています。

が! 千葉県のデザインが含まれていないせいなのか、私の地元ではこのガシャポンが稼働している所を見たことがありません。稼働報告すらありません。もしかしたら稼働していないのかも・・・

というわけ(?)で、大人な方法で全7種を入手したいそこのあなた! 「ここから買えますよ」という情報です:


 ガシャポンは1回300円なので、7種コンプリートするには最低2100円必要です。
こちらから購入すると 2295 円 +送料+税。コンプリート前提の場合、どちらが安いかはなんとも言えません。

まあ、でも、近所に稼働してないならこれしかないとも言えるわけで、欲しい方どうぞ。


Vol.2 が出る前から「Vol. 1」を名乗るとは、なかなか期待できますね! Vol. 2 も待ってます!!
 

このページのトップヘ