2016年12月9日金曜日

DockerでMQ環境を作る

DockerHubのibmcom/mqを使う。ファイルシステムとしてtmpfsは使えないのでこれを参考に/mnt/sda1に置き換える。

brew install docker docker-machine
docker-machine create --driver virtualbox mqdev
eval $(docker-machine env mqdev)
docker run  --env LICENSE=accept  --env MQ_QMGR_NAME=QM1 \
--volume /mnt/sda1:/var/mqm  --publish 1414:1414 ibmcom/mq

2016年4月26日火曜日

Bloggerでシンタックスハイライト(Prism)

このブログはBloggerを使っているがソースコードを読みやすく表示したくて、色々調べた結果、SyntaxHighlighterが割と有名っぽいのだが、Prismというのが見た目もかっこいいし良さそう。

使い方は、テンプレートからHTMLの編集を選んで、2行追加すればOK。
</head>のすぐ上に
<link href='https://cdnjs.cloudflare.com/ajax/libs/prism/1.4.1/themes/prism.min.css' 
rel='stylesheet'/>
</body>のすぐ上に
<script src='https://cdnjs.cloudflare.com/ajax/libs/prism/1.4.1/prism.min.js'/>
と書くだけ。

本文には
<pre><code class="language-css">p { color: red }</code></pre>
のように書けば良い。cssの部分が言語になるのだが、ハイライトしてくれる言語はこちら

2016年3月6日日曜日

ハロウィーン問題

WikipediaのHalloween Problemこのブログの要約。

ハロウィーン問題はデータベースの更新処理をによって更新されたレコードのデータベース上の位置が変更されることによって、同じレコードが何度も更新されてしまう問題を指す。こんな名前なのは、ハロウィーンに発見された歴史的経緯から。

ポイントとなるのは、

  • テーブルやインデックスのスキャン
  • そのスキャンによって読み込まれるレコードを変更すること
  • 変更によってレコードの位置をこれからスキャンされる位置に移動させること
結果として、スキャンによって更新されたレコードがまたスキャンで読み込まれてしまい再度更新されるという結果になってしまう。

具体的にはカーソルを使った照会と更新を行うときに問題が発生しうる。JDBCを使っている場合もそうだが、カーソルを使った更新をするときには、カーソル更新の結果が照会に反映されるか注意が必要である。

この問題を避けるためには、更新が照会に影響を及ぼさないようにすれば良い。

DB2 9.7.2以降を使っている場合は、カーソルを使用する際には、INSENSITIVE指定をすることで、スキャンの開始時点で照会結果が確定されるので、この問題を避けることができる。

2015年11月27日金曜日

StrongLoopを使ってみる(LoopBack)

StrongLoopは、Node.js, Expressに対してProcess Manager, LoopBack, Enterprise Connectors, API Gateway, Arc Console, Monitoring, Profiling, Tracingという機能を加えたもの。今回は中心となるLoopBackを使って、RESTアプリケーションを作ってみる。

StrongLoopのインストール方法はこちら。今回試してみる手順はこちら

1. コマンドを実行するとYeomanを使って雛形が生成される。
$ slc loopback

2. モデルを作る。
$ slc loopback:model

3. モデル名を入力してオンメモリDB(memory)とPersistedModelを選択する。REST公開はY、plural formはそのままEnter, common modelを選択する。

4. プロパティーはstring型のnameと言う名前で定義する。

5. 稼動させる。localhost:3000/explorerにアクセスするとAPI一覧を見ることができる。
$ node .
$ curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" \
      -d '{"name":"foo"}' "http://localhost:3000/api/CoffeeShops"
$ curl -X GET --header "Accept: application/json" "http://localhost:3000/api/CoffeeShops"
対応しているデータソースに接続する方法はこちら。2015/11時点の最新版でslc loopback:datasourceを実行したところ以下が出力された。
  • In-memory db (supported by StrongLoop)
  • Email (supported by StrongLoop)
  • MySQL (supported by StrongLoop)
  • PostgreSQL (supported by StrongLoop)
  • Oracle (supported by StrongLoop)
  • Microsoft SQL (supported by StrongLoop)
  • MongoDB (supported by StrongLoop)
  • SOAP webservices (supported by StrongLoop)
  • REST services (supported by StrongLoop)
  • Neo4j (provided by community)
  • Kafka (provided by community)
  • SAP HANA (provided by community)
  • Couchbase (provided by community)

2015年11月22日日曜日

EclipseLinkを使った実装例

このExampleを動かしてみる。DBをRESTで公開するというもの。
http://wiki.eclipse.org/EclipseLink/Examples/JPARS/Simple
https://wiki.eclipse.org/EclipseLink/Release/2.4.0/JPA-RS

実装については最後の方で説明する。まずはサンプルを動かしてみた記録。

基本的にこのページに書いてある通りに進めていくがせっかくなので最新版を使いたい。GlassFishは最新版のバージョン4系を使いたかったが、JDBCコネクションプールの作成でこのエラーが起きて先に進めないので諦めた。代わりにPayaraというサーバーをはじめて使ってみる。

Payaraのインストール
今回は、4.1.1.154 Full JavaEEをインストールする。$GLASSFISH_HOME/glassfish/modulesのjarの置き換えは不要だった。

②Examplesをgit clone
git clone git://git.eclipse.org/gitroot/eclipselink/examples.git

③Payaraのデータソース、JDBCリソースの設定
コンソール画面から、Resources > JDBC > JDBC Connection Poolsと進んでいき設定。GlassFishのバグが修正されており、先に進むことができる。$GLASSFISH_HOME/glassfish/domains/<your_domain_folder>/lib/extにはJDBCドライバーjarを配置しておく。その他設定値は以下の通り。driverType=4を忘れないように。DB2環境はこちらを使った。環境構築時の記録はこちら
  • Resource Type=javax.sql.DataSource
  • Datasource Classname=com.ibm.db2.jcc.DB2DataSource
Additional Propertiesは以下の通り
  • serverName=localhost
  • portNumber=50000
  • databaseName=任意(SAMPLEでもOK)
  • serverName=任意
  • password=任意
  • driverType=4

④EclipseでMavenプロジェクトのインポート

⑤Eclipseでサーバーの追加
PayaraはGlassFishとの互換性があるとのことなので、GlassFish4サーバーとして追加する。

⑥student.webのデプロイ
Eclipse上から普通にデプロイする

⑦Google ChromeにPostmanをインストールしてリクエストを送信
http://localhost:8080/student.web/persistence/v1.0/jpars_example_student/metadata
POSTするときはContent-Type=application/jsonを付けること

以上で、サンプルが動くところまでは無事確認できた。この後は実装についてだが、てっきりJAX-RSのアノテーションが出てくるのかと思いきや存在せず、student.webプロジェクトはWeaverBeanというクラス1つだけと大変シンプル。

説明としては、こちらが分かりやすかった。
http://blog.bdoughan.com/2013/04/introducing-eclipselink-jpa-rs.html

ドキュメントをほとんど見つけられなかった。


JPA実装の違い

JPA(Java Persistence API)の実装には複数あるが、どれを使うのが良いのだろうか。
Hibernateは独自機能が多そうなので、ずっと使い続けることができる状況なら良さそうだが、そうでない場合はEclipseLinkを使っておくのが無難っぽい。OpenJPAはあまり開発が活発ではないようで、JPA 2.1に対応できていない(私は2.1の新機能を使うほどJPAを使いこなすことはないと思うけど、開発が活発な方を選んでおきたい)。他には、あまり情報が集められないけどDataNucleusが面白そう。

名前 開発元 仕様 備考
EclipseLink Eclipse
Foundation
JPA 2.1, 2.0 JPA仕様の参照実装
Hibernate RedHat JPA 2.0, 2.1
OpenJPA Apache
Foundation
JPA 2.0
JPA for WebSphere Application Server IBM JPA 2.0, 2.1 JPA 2.1実装はEclipseLinkベース、JPA 2.0実装はOpenJPAベース(WebSphere Liberty Profileの場合)
TopLink Oracle JPA 2.0 JPA 2.1サポートはJavaEE7に含まれるためパッチとして提供


2015年11月21日土曜日

Dockerを使ってMac上にDB2境を準備する

DB2 Express-Cという無償で使えるDB2があるが、残念ながらMacはサポートされていない。
http://www-01.ibm.com/software/data/db2/express-c/download.html

そこでDockerを使って環境を作る。使ったソフトウェアは以下の通り。

  • Docker Machine 0.4.1
  • Docker 1.8.3
  • VirtualBox 5.0.10
インストール手順はいろんなところに書いてあるので割愛。VirtualBoxの仮想マシンを作成が完了した後はこんな感じ。
~ % docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM
default            virtualbox   Stopped
~ % docker-machine start default
Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
~ % eval "$(docker-machine env default)"

ここから先がDB2に関係する部分。使うのはibmcom/db2express-c。手順は以下の通り。docker pullで取得するサイズが大きい(1.7GB)のでしばらく時間がかかる。
~ % docker pull ibmcom/db2express-c
~ % docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ibmcom/db2express-c   latest              2abb3b6fc22c        6 months ago        1.705 GB
~ % docker run -it -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest bash

ここまででDockerコンテナにログインできる。Macからコンテナに50000番ポートで接続するためにはVirtualBox上でのポートフォワーディングも必要。lsofでListenしていることを確認できる。
~ % VBoxManage controlvm default natpf1 "db2_pf,tcp,127.0.0.1,50000,,50000"
~ % lsof -P -i -n | grep 50000

ここまででMacからコンテナに50000番で接続できるようになった。後はDB2側で必要な設定をすればOK。ibmcom/db2express-cに書いてある通りサンプルDBを作ったり、デーモンとして起動したりできる。

サンプルDBの作成
$ su - db2inst1 $ db2start $ db2sampl

デーモンとして起動
docker run -d -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest db2start

テスト用途ならコンテナの再起動でデータが消えても問題ないことが多いと思われるのでここで作業を終わりにするが、永続化が必要な場合は別途設定が必要。

DockerでMQ環境を作る

DockerHubの ibmcom/mq を使う。ファイルシステムとしてtmpfsは使えないので これ を参考に/mnt/sda1に置き換える。 brew install docker docker-machine docker-machine create --drive...