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

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

タグ:jar

IBM Bluemix から提供されているウェブの統合開発環境である IBM DevOps サービス。ウェブ上に用意されたソースコードエディタを使ってソースコードを編集したり、バージョン管理を行うことができるので、手元のクライアント環境に依存せずにアジャイルなソースコード管理を行うことができます。

ソースコードエディタ単体として見ると、専用のクライアントアプリケーションと比較しての使い勝手ではやはりネイティブアプリケーションの方が使いやすいと感じることもあります。とはいえ、ちょっとしたソースコードの変更を行う必要が生じた際に、わざわざ cf ツールを用意することなくデプロイまで行うことができる環境、というメリットもあります。ケース・バイ・ケースで使い分けることになると思っています。

そんな DevOps サービスを使って Liberty for Java ランタイムとして Bluemix 上に作成したプロジェクトのソースコードを編集しようとすると、その初期ディレクトリ構成が少し特殊で、戸惑うことがあります。例えば Bluemix 環境から Liberty for Java のランタイムを作成し、「Git の追加」をすると DevOps サービスが起動してソースコードのローカルリポジトリがウェブ上に作成されます:
2016022301


作成されたリポジトリにアクセスするには「コードの編集」をクリックします:
2016022302


以下は初期状態のまま何も変更を加えていない状態でのソースコードのディレクトリ構成です:
2016022303


ここに外部ファイル(例えば MySQL コネクターの JAR ファイル)を追加しようとした時にどこに追加すればいいか、すぐに分かりますか?

正解と、そのための手順は以下の通りです。まず src/main/webapp フォルダを右クリックし、ポップアップメニューから「新規」-「フォルダー」を選択します:
2016022309


新規にフォルダが作成されます。フォルダ名の入力が求められたら "WEB-INF" と(半角大文字で)入力します:
2016022301


更に、今作成した WEB-INF フォルダを右クリックして、同様に新規フォルダ "lib" をこの下に作成します。:
2016022303


これで src/main/webapp/WEB-INF/lib フォルダが作成されました。このフォルダの中に JAR ファイルを入れておけば自動的にロードしてくれるようになります:
2016022304


実際に JAR ファイルをアップロードしてみましょう。lib フォルダを右クリックし、ポップアップメニューで今度は「インポート」-「ファイルまたはアーカイブ」を選択します:
2016022305


ファイルのアップロードダイアログが表示されるので、ローカルファイルシステムからアップロードしたい JAR ファイルを選択します(この例では MySQL JDBC Connector の JAR ファイルを選択しています):
2016022306


選択するとアップロードが開始されます。アップロード状況がプログレスバーで確認できます:
2016022307


アップロードが完了すると、プロジェクト内のファイルとして参照できるようになります。これでこのプロジェクト内で MySQL JDBC Connector を使うことができるようになりました:
2016022308


試しに JSP を追加して動作確認してみます。src/main/webapp フォルダを右クリックして「新規作成」-「ファイル」を選んで、MySQL.jsp という名前のファイルを新規に作成します:
2016022311


ファイルはこの画面から中身を編集できるので、以下の様な内容にしました:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<html>
<body>
<%
  Connection conn = null;


  //. DB Access information
  String dbclass = "com.mysql.jdbc.Driver";
  String dbhost = "(MySQLサーバー名)";
  String dbname = "(データベース名)", dbusername = "(ユーザー名)", dbpassword = "(パスワード)";
  int dbport = 3306;
  String dburi = "mysql://" + dbhost + "/" + dbname;

  try{
    Class.forName( dbclass );
    conn = DriverManager.getConnection( "jdbc:" + dburi, dbusername, dbpassword );
  }catch( Exception e ){
    e.printStackTrace();
  }
%>
<h2>conn = <%= conn %></h2>
</body>
</html>


MySQL サーバー名、データベース名、ユーザー名、パスワードを指定してコネクションを貼り、その貼ったコネクション変数を無理やり(文字列化して)表示する、というものです。

実際に動かそうとすると MySQL サーバーが必要です。もし自由に使える MySQL サーバーが手元にない場合はこちらのデモ用サーバーをお使いいただく方法もあります:
StrongLoop のデモ用 MySQL サーバー

このソースを追加して(サーバー名、データベース名、ユーザー名、パスワードを変更して)コミット&プッシュ&ビルド&デプロイ後にアクセスすると、このような画面になるはずです。わかりにくいかもしれませんが、コネクション変数(conn)を無理やり文字列化した結果が表示されています。少なくとも MySQL の JDBC Connector は正しく動いている(つまり追加した JAR ファイルが読み込まれている)、ということがわかりますね:
2016022312




 

Couchbase Server のデータに Java のクライアントライブラリ経由でアクセスするための準備と実装内容を紹介します。

まずサーバーをセットアップします。手順はこちらに記載してある方法ですが、Couchbase Server とクライアントプログラムとの間で開けておくべきポートに注意する必要があります。

Couchbase Server の導入時の最後に以下のようなメッセージが表示されます:
couchbase_251_rpm_install


ここで指示されているように、Couchbase Server とクライアントアプリケーションとの間では 4369, 8091, 8092, 11209, 11210, 11211, 11214, 11215, 18091, 18092, そして 21100~21299 番のポートが全て開放されている必要があります。間にファイアウォール環境が入る場合はこの点に注意して、場合によってはフォワーディングの設定を変更しておく必要がある、ということになります。

次にこちらの、Step 1 内の "zipfile" と書かれたリンクから Java 用のクライアントライブラリをダウンロードします。この記事を書いている時点での Couchbase Java Client Library の最新版バージョンは 1.4.4 でした。このバージョンの前提で以下を記載します:
http://www.couchbase.com/communities/jp/java/getting-started

ダウンロードした zip ファイル(Couchbase-Java-Client-1.4.4.zip)を展開し、その中に含まれる以下7つの jar ファイルを取り出して、同一のフォルダに保存しておきます。これで事前準備は完了です。
2014081101


では実際の Java プログラミングで、Couchbase サーバーに1ドキュメントを作成してみます。試しに以下の様なクライアントアプリケーション(HelloWorld.java)を記述します("couchbase.test.com"部分は Couchbase サーバーのホスト名かIPアドレスに書き換えてください):

import java.net.URI;
import java.util.Arrays;
import java.util.List;

import com.couchbase.client.CouchbaseClient;

public class HelloWorld {
  public static void main(String[] args) {
    try{
      List hosts = Arrays.asList( new URI( "http://couchbase.test.com:8091/pools" ) );

      String bucket = "default";
      String password = "";

      CouchbaseClient client = new CouchbaseClient( hosts, bucket, password );
      client.set( "my-first-document", "ハローワールド" ).get();

      System.out.println( client.get( "my-first-document" ) );

      client.shutdown();
    }catch( Exception e ){
      e.printStackTrace();
    }
  }
}


これをコンパイルし、
# javac -cp couchbase-client-1.4.4.jar:spymemcached-2.11.4.jar HelloWorld.java


そして実行します:
# java -cp .:couchbase-client-1.4.4.jar:spymemcached-2.11.4.jar:jettison-1.1.jar:netty.3.5.5.Final.jar:commons-codec-1.5.jar:httpcore-4.3.jar:httpcore-nio-4.3.jar HelloWorld.java

正しく実行されると、Couchbase サーバーの default バケットにアクセスして、"my-first-document" という ID のドキュメントを作成し、そのデータ内容はプレーンテキストの "ハローワールド" になります。そして、このプレーンテキストが表示されます。
2014081102

正しく実行できました。念のため、Couchbase サーバーの管理コンソールからもこのドキュメントが作成されたことを確認してみます。管理コンソールの "Data Buckets" から "default" と書かれたバケットの横にある "Documents" ボタンをクリックすると、default バケット内のドキュメント一覧が表示され、その中に "my-first-document" という ID のものが含まれていることが確認できます:
2014081103
えらくシンプルなサンプルでしたが、一応クライアントライブラリを使った「ハローワールド」の紹介でした。

クライアントライブラリの日本語での使い方についてはこちらを参照ください:
http://docs.couchbase.com/prebuilt/translations/jp/couchbase-sdk-java-1.0-ja/downloading.html






 

「Java で使えるバーコード読み取りライブラリ」を探していました。

開発の関係で「Java から使える」ことが条件でした。また「QRコード」のライブラリは見かけるけど、いわゆる「バーコード」 のは意外と少ない。そしてバーコードを「生成する」のではなく、バーコード画像を「読み取り」たかった、という条件もあります。 加えてライセンスフリーだといいな、と。

これだけの条件で探すとほとんど選択肢はなく、唯一見つけたのが「ZXing(ゼブラクロッシング)」というライブラリでした。 ZXing は単に JavaSE で使えるというだけでなく、Android SDK からも使えます。また QR コードにも対応していたり、読み書き両方に使えたりと汎用性も高そうです。ZXing はソースファイルで提供されているので、そのビルド方法も含めた利用手順を紹介します。なお最新版(3.0)の ZXing をビルドするには JDK 1.7 以上、および Apache Maven が必要です。 

RedHat Enterprise Linux や CentOS であれば以下のコマンドで JDK1.7 をインストールできます:
# yum install java-1.7.0-openjdk-devel

Apache Maven はこんな感じ:
# cd /etc/yum.repos.d
# wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo # yum install apache-maven

JDK 1.7 と Maven が用意できたら ZXing をビルドすることができます。まず ZXing のダウンロードページから最新のソースファイルをダウンロードして、zip ファイルを展開しておきます。

と、言いたかったのですが、4月25日現在の最新版(3.0.2-SNAPSHOT)はビルドの途中でエラーになってしまい、なんかよく分からなかったので、僕はこちらの 2.3.0 というバージョンを使いました。

展開後、いくつかのフォルダが出来上がりますが、通常の Java(SE) 環境で利用するには core と javase のライブラリが必要です。そのためこの2つのフォルダで JAR ライブラリを Maven でビルドします:
# cd core
# mvn -DskipTests -Dgpg.skip=true install
→ ./target/ に JAR ファイルができている # cd ../javase # mvn -DskipTests -Dgpg.skip=true install
 → ./target/ に JAR ファイルができている

ビルドでできあがった core-X.X.X.jar と javase-X.X.X.jar(X.X.X 部分は ZXing のバージョン)が必要なライブラリになります。これらを Java のプロジェクト内で利用できるように(例えば WEB-INF/lib/ 以下に)コピーして、これで準備完了。

実際にバーコードをデコードするサンプルも記載しておきます。これはローカルシステムの c:/tmp/sample.jpg にバーコード画像がある場合の例ですが、こんな感じ: 
  String filename = "c:/tmp/sample.jpg";
    :
  try{
    //. 画像読み込み
    BufferedImage image = ImageIO.read( new File( filename ) );
    LuminanceSource source = new BufferedImageLuminanceSource( image );
    BinaryBitmap bitmap = new BinaryBitmap( new HybridBinarizer( source ) );

    //. デコード
    Reader reader = new MultiFormatReader();
    Result result = reader.decode( bitmap );

    //. バーコードフォーマット
    BarcodeFormat format = result.getBarcodeFormat();

    //. バーコードコンテンツ(読み取り結果)
    String text = result.getText();
      :
  }catch( Exception e ){
    e.printStackTrace();
  }
    :





さて問題の認識精度ですが、 、、まあ仕方ないのかな、って感じです。画像にバーコードだけが写っている状態であればまだしも、周囲に関係ない部分が含まれていたりすると認識してくれないケースが多いです。

とはいえフリーで使えるデコードライブラリは他に選択肢がないので、贅沢は言えませんよね。
 

このページのトップヘ