Jenkins 解説書

オライリーから出版されている Jenkins の解説書です。Java 以外のネイティブ言語の自動ビルドがどの程度まで自動化できるのか調べたかったので購入したものですが、基本的に Java 中心でそれ以外はシェルでコマンドを書けばどんなことでもできるというぐらいしか書いてなかったので、本来の目的からすれば参考程度でした。Java がメインならこれだけでも十分役に立つと思います。

Quercus を使って WordPress を動かしてみた

Java で書かれた PHP 互換処理系として Quercus というものがあります。PHP で書かれたアプリケーションを Java アプリケーション サーバー上で動作させることができるというものですが、実はこのブログを書いている WordPress も Quercus 上で動かしていたりします。

実のところ WordPress を Quercus で動かすためには、いくつか越えなければいけないハードルがあったわけなので、そのいくつかをここに記しておきます。

文字化け

最初に気が付くのはやはり文字化けでしょう。これにはいくつか理由が挙げられますが主なものは次の二つです。

  • PHP が基本的にマルチバイト文字列であるのに対して Java は UTF-16 を使っている。
  • WordPress が MySQL に特化していることにより JDBC との不整合がある。

最初のものは WEB-INF/php.ini (Quercus の php.ini ファイル) で unicode.semantics = 1 として PHP6 のように Unicode を使うように指定することで回避することができる場合もありますが、PHP6 はキャンセルになった模様ですし、別のところで問題が出る可能性があるのでここでは使いません。代わりに、Java を騙して UTF-8 マルチバイト文字列を ISO-8859-1 だと思わせる方法を取ります。そのために WEB-INF/php.ini ファイルで mbstring.internal_encoding = UTF-8 と指定します。

しかしこれだけでは JDBC ドライバーが勝手に Unicode に変換して MySQL テーブル上で文字化けを誘発しますので、もう一手売っておく必要があります。何をするかというと、MySQL の JDBC クライアントのプロパティで characterEncoding=ISO8859_1 と指定するだけです。

こんなことをすると普通なら逆に文字化けを引き起こしそうなものですが、WordPress の MySQL 特化設計のおかげで、MySQL サーバー側には適切なエンコーディングが設定がされるので、JDBC ドライバーは何も知らずにバイト列を素通してしまって文字化けが回避されるという望ましい結果が得られます。

ほかにも手間取りそうなところはありますが、今回はここまでとします。

C++Builder の不具合分析

コマンドラインから MSBuild で Win64 向けにプロジェクトをビルドすると、いつもプリコンパイル ヘッダーで参照したファイルが更新されたというエラーになる件について調べてみた。

まず Win64 向けの BCC64 は CLang ベースであるのはわかっているので、CLang のプリコンパイル済みヘッダーのフォーマットを調査して、llvm-bcanalyzer というツールで内容のダンプができることを確認した。

次に正常にビルドできる IDE で生成したプリコンパイル済みヘッダーと MSBuild で生成したものを GNU/Linux にコピーして llvm-bcanalyzer で内容を比較した。ファイルが更新されたというエラーが出ることから、そのファイル名を手がかりにタイムスタンプを探したところでビンゴ。MSBuild で生成したものは 1970 年 1 月 1 日 00:00 UTC からの秒数で正しく記録されているのに対し、IDE で生成したものは 1970 年 1 月 1 日 00:00 JST からの秒数になっていることが判明した。BCC64 は後者を期待していて、前者だと数値が大きくなるのでファイル更新と誤認する模様である。これが原因なら米国では (タイムスタンプの大小が逆転するので) 再現しないのも説明できる。

以上のように調査したので修正してほしいなあ。

Debian で LXC コンテナーを作ってみた

やったことを記録しておく。

  1. debootstrap でコンテナー用のファイルシステムを用意する。
  2. chroot でそのファイルシステム内でシェルを起動して、
    1. apt-get install makedev を実行して MAKEDEV が使えるようにする。
    2. MAKEDEV std を実行して基本的なデバイス ファイルを作成する。
    3. /etc/inittab を編集して tty3 以降のログインを無効にする。
  3. /var/lib/lxc/container/config ファイル (内容は後記) を用意する。
  4. ln -s /var/lib/lxc/container/config /etc/lxc/auto/container を実行して自動的にコンテナーが起動するようにする。
  5. lxc start container -d を実行してコンテナーを手動で起動する。

続きを読む →

今日の C++Builder 日記

bitbucket-api-demo プロジェクトのために TListView とLiveBinding の使い方を研究。VCL のリストビューとはかなり違ったので効果的な使い方を検討する。また Pascal で新しいインターフェースを追加するなど。

IDE の異常終了の原因を調査した結果 Mercurial コマンド サーバーの挙動変化により 例外処理による自動変数のデストラクションに関わるコンパイラーの問題が発覚。とりあえず 自動変数のデストラクターに依存しない方向で対応策を考えてみる。

RAD Studio のパッケージ プロジェクトを Jenkins でビルドしてみた

RAD Studio のパッケージ プロジェクトを Jenkins を使ってバージョン別にバッチ ビルドするようにしてみたので記載する。

Jenkins スレーブ ノードの設定

RAD Studio を使ってビルドを実行するために、まず RAD Studio をインストールした PC を Jenkins のスレーブ ノードとして設定する。パッケージ プロジェクトを RAD Studio のバージョンごとにビルドを実行するために、ここで RAD Studio の各バージョンを識別するラベルを列挙しておく。

jenkins-slave-1

今回はビルド実行時に手動でスレーブを起動するので、起動方法を JNLP 経由とし、また可用性も必要時だけオンラインにする設定とする。(注: Windows のサービスとして登録しておけば常時オンラインにすることもできるのだが、RAD Studio のライセンス上「指名ユーザー」だけが使用しなければならないことになっているので、手動で起動することにした。)

さらに Jenkins プロジェクトでスレーブ ノードの環境を設定するために、環境変数 BDS と BDSCOMMONDIR のバージョンごとの値を設定しておく。(注: BDSINCLUDE は BDS の値から設定可能なので省略した。)

jenkins-slave-2

Jenkins マルチ構成プロジェクトの設定

パッケージ プロジェクトを RAD Studio のバージョンごとにビルドを実行するために、Jenkins でマルチ構成プロジェクトを設定する。マトリックスの設定でスレーブを軸に追加して、ビルドしたいラベルを選択しておく。

jenkins-job-1

さらに RAD Studio のバージョンごとに設定を切り替えるために、EnvInject プラグインを利用して必要な環境変数を設定する。

jenkins-job-2

ビルド実行には MSBuild プラグインを利用して、プロジェクト ファイルからビルドするように設定する。

jenkins-job-3

ビルドの実行

必要な設定が完了すれば、スレーブ エージェントを JNLP 経由で起動してマルチ構成プロジェクトのビルド実行を選択すれば、RAD Studio ごとにビルドが実行される。追加で成果物の保存を設定しておけば、ビルド後のバイナリー ファイルを簡単に取得することができる。

C++Builder で TCustomOrientationSensor を使ってみる

ここ最近、筆者は C++Builder XE5 を使って iOS アプリケーションを作成しているところですが、TCustomOrientationSensor を使ってみたところ、プロパティ HeadingX/Y/Z で磁気センサーの計測値を取得できるようだということがわかりました。

まずフォームに FMX.Sensors.TOrientationSensor を配置した上で、イベント OnSensorChoosing に対して TCustomOrientationSensor のプロパティ SensorTypeTOrientationSensorType::Compass3D であるセンサーを選択して、プロパティ Sensor を参照します。(参考までに筆者の iPhone 5s では 2 つの TCustomOrientationSensor オブジェクトが検出され、SensorType が Compass3D でないほうは Inclinometer3D でした。)

残念ながら FMX から磁気センサーのキャリブレーションを要求する機能がないようで、あまり実用にはなりそうにありませんが、条件付きながら磁場を計測する一つの手段にはなりそうです。

> Bitbucket リポジトリー コミット

[注記: 『外来語 (カタカナ) 表記ガイドライン』に倣って、repository の日本語表記を「リポジトリー」に変更しました。]