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

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

タグ:jar

Java のアプリ開発をしていて、こんな実行時エラーに遭遇することがあります:
java.lang.UnsatisfiedLinkError: C:\IBM\Notes\nlsxbe.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform


最近は Windows といえば 64bit 版が普通になってきました(よね?)。自分の開発環境も 64bit 版 Windows で、Java 開発環境も(JDK も JRE も Eclipse も)64bit 版を使っています。ここまでは珍しくないと思っています。

しかし開発するアプリケーションによっては外部ライブラリ(JAR ファイル)を指定する必要があり、その JAR ファイルが 32bit のネイティブライブラリを使っていたりするなど、64bit の JDK で 32bit 前提のコードを実行しなければならなくなった場合に上記のようなエラーが発生するのでした。

典型例としては、IBM Notes の Java API を使ったアプリケーション開発が挙げられます。2017/Oct/01 現在、Windows 版の IBM Notes は 32bit 版しか存在していません。Java で IBM Notes の API を実行するには IBM Notes 同梱の Notes.jar 他をインポートして使う必要がありますが、この Notes.jar は 32bit の DLL を参照するため、64bit Java から実行すると上記のエラーが発生します。


エラーの原因が分かったところで、どのように回避すればいいでしょうか? これも解決策としてはシンプルで 32bit Java(JRE) から実行すればよいことになります。32bit JRE をダウンロードして実行してもいいですが、上記のような IBM Notes の JAR を使った場合であれば、IBM Notes が使っている Java をそのまま指定して実行すればよいことになります。

ちとややこしいのが Eclipse のような IDE を使っている場合の指定方法です。まず Java - Installed JREs の中に Standard VM として Notes Java を追加しておく必要があります。Notes Java は(ノーツをインストールしたディレクトリ)/jvm にあるので、このディレクトリを指定して追加します:
2017100101


そして Eclipse の Java プロジェクトの中で JRE System Library として、上記で設定した Notes Java を指定します。これでこのプロジェクト内で作成したアプリを実行する際には Notes Java 内の java.exe が利用されるようになるので、上記のエラーが回避できるようになります:
2017100102



 

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();
  }
    :





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

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

このページのトップヘ