WordPress の pingback 不具合

WordPress pingback がどうも機能してないっぽいのはこれのせいか?

…/wp-includes/class-http.php:1279: Warning: CURL option ‘10065’ unknown or unimplemented

オプション 10065 は CURLOPT_CAINFO で、非正規の SSL 証明書を使用するサーバーの発行元 CA を指定する機能のようなのだが、どうも WordPress の pingback サーバーがこれに該当してしまうらしい。

一応 Quercus にバグ報告しておいた。

Quercus で動かす WordPress で見つかった問題点

Quercus を使って Java アプリケーション サーバーで WordPress を稼働させているのは既に書いたとおりですが、WordPress からのメール送信でサブジェクトが割れて本文に入ってしまうという問題がある模様です。コメント モデレーションの通知で発覚しました。

時間が許せば原因を探ってみたいと考えていますが、いつになることでしょうね? (^^)

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 ドライバーは何も知らずにバイト列を素通してしまって文字化けが回避されるという望ましい結果が得られます。

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

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 ごとにビルドが実行される。追加で成果物の保存を設定しておけば、ビルド後のバイナリー ファイルを簡単に取得することができる。

Jenkins をパスワード管理なしで使う方法

Jenkins をインターネットから安全にアクセス可能にするために、パスワード管理なしで使えるようにしたので、その方法を紹介する。

この種のサービスをインターネットからアクセス可能にするには、パスワードを保護するために SSL による暗号通信を用いることが多いと思われる。しかし SSL にはサーバー証明書が必要であり、正規に取得したものでない限りブラウザーにより警告表示が出るのが煩わしさを感じるところでもある。

そこで SSL を使わない方法ということで考えたのが、既存の安全な認証機能を利用するということである。これには OpenID プラグインが役立った。

まあ何のことはない。以前 Google Apps が無料だった頃に申し込んであったドメインを使って SSO を設定しただけである。実際に設定してみたらあっけなく機能してしまった。

UnicodeとJava

Javaのchar型は最初から長さ16ビットでUnicodeということで, 以前ならマルチバイト文字を考えなくても文字処理ができるということで, ほかのchar型が8ビットの言語と違って楽ができると思ってたんだけど, 最近はUnicodeにもサロゲートペアとかあってchar二つで1文字とかあるから結局また面倒な世界に逆戻りしてしまってたりする。

Win32もwchar_t型は16ビットのはずだから, 手間としては同じなんだろうけど, 所詮すべての文字を16ビットで表現するというのが幻想だったというわけで, wchar_tが32ビットのシステムに戻りたいね。

JavaのSSL鍵ペアをOpenSSLで使う方法

Java用に生成したSSL鍵ペア (証明書を含む) をOpenSSLでも使う方法が判明したので、メモしておく。

  1. keytool-importkeystoreコマンドで、新しいPKCS12キーストアに単一エントリをコピーする。
    keytool -importkeystore -srckeystore keystore -destkeystore key.p12 -deststoretype pkcs12 -srcalias alias
  2. openssl pkcs12コマンドでPEM形式で出力する。
    openssl pkcs12 -in key.p12 -out key.pem

リンク: keytool – 鍵と証明書の管理ツール.

訛りのない Java 言語を話す

ここんとこ嘘だと思うんだけどなあ。釣り?

リンク: 訛りのない Java 言語を話す.

C++   では private のスコープをクラスではなくオブジェクトに設定しなければならないため、こうする必要があります。それはすなわち、C++   では、同じクラスのオブジェクトは互いの private メンバー変数を見られないということです。

続きを読む →