ushidayの日記

主に「IBMi」のメモに・・・

ZendServer WinとDB2Connectで文字化け

ZendServer for Windowsで”IBM i”のDB2に接続し、データ取得すると文字化けする。
具体的なパターンだと、全マイナスと全ダッシュが、それぞれ半角になる。
一瞬Shift-JISのダメ文字かとも思ったけど、実装はUTF-8だし、”表示”は文字化けしなかったから何だろ?

IBM i上のレコード
− ‐ ー 〜 ―

●Zend Server for Winでレコード取得結果
− ‐ ー 〜 —

●Zend Server for IBM iでレコード取得結果
− ‐ ー 〜 ―

最新のDB2 Connect PE使っても結果は同じだった。
db2_bind_paramも”DB2_PARAM_INOUT”が駄目とか解決できていない問題が幾つかある。

  • db2_bind_paramのエラー
Warning: db2_execute(): Statement Execute Failed in ..\ReturnParm.php on line 126
[IBM][CLI Driver] CLI0112E 割り当てにエラーがありました。 SQLSTATE=22005 SQLCODE=-99999

ZendServer8.5 for IBM i(PHP5.6)を入れて・・・

iSUC福岡大会に参加して、モチベーションが上向いているうちに、「よーしZendServer8.5のPHP5.6に更新しよう!」と意気込んでいたら、PHP5.6からCA証明書のチェックが必須となったみたいで、SSL/TLSメール送信でコケてました。

以下の様な事が書いてありました。
「5.6.0 … peer_fingerprint と verify_peer_name が追加されました。 verify_peer のデフォルトが TRUE に変わりました。」
◆参考リンク

ソケット接続実行時エラーログ
exception 'Zend_Mail_Protocol_Exception' with message 'Could not open socket' in .../library/Zend/Mail/Protocol/Abstract.php:277
Stack trace:
#0 .../library/Zend/Mail/Protocol/Smtp.php(167): Zend_Mail_Protocol_Abstract->_connect('ssl://hogehoge.co.jp:xxx')
#1 .../library/Zend/Mail/Transport/Smtp.php(199): Zend_Mail_Protocol_Smtp->connect()
#2 .../library/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Smtp->_sendMail()
#3 .../library/Zend/Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
#4 .../library/org/cscweb/util/mail/myMail.php(324): Zend_Mail->send(Object(Zend_Mail_Transport_Smtp))
#5 .../application/controllers/OrderController.php(408): myMail->send()
#6 .../library/Zend/Controller/Action.php(516): OrderController->mailshippinglistAction()
#7 .../library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('mailshippinglis...')
#8 .../library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#9 .../library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
#10 .../library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
#11 .../public/index.php(110): Zend_Application->run()
#12 {main}

以下のソースをPHP5.6単体で実行したら

<?php

$fp = stream_socket_client("ssl://www.google.co.jp:443/", $errno, $errstr, 30);

if ($fp === false) {
    echo 'NG' ;
    throw new Exception($errstr);
} else {
    fclose($fp);
    echo 'OK' ;
}

こんなエラー

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in .../test.php on line 3
Warning: stream_socket_client(): Failed to enable crypto in .../test.php on line 3
Warning: stream_socket_client(): unable to connect to ssl://www.google.co.jp:443/ (Unknown error) in .../test.php on line 3

そんな訳で「php.ini」に、以下を設定

[OpenSSL]
openssl.cafile = /QOpenSys/QIBM/UserData/SC1/OpenSSL/certs/cacert.crt
;openssl.capath = ""

ZENDSVR6のApacehインスタンスを再起動でOKでした。めでたしめでたし。

System i Access for Windows 6.1がやってくれた!

超超久々の投稿でご無沙汰です。活ける屍ですが、一応生きています。
Windows Server 2012 R2 Essentialsをセットアップしていると、”System i Access for Windows 6.1(旧Client Access)”がやってくれた!
散々サーバーセットアップした後に、ひと通り必要な全てアプリケーションもインストールした。

ふと、再起動後サーバーマネージャーを除くと、Essentialsのサービスがコケまくり。
松田優作ばりに「なんじゃこりゃ〜!」と叫びたくなる。サービス血まみれで赤いし!


アプリケーションも相当数入れてたので、何が悪さしたのかさっぱり?折角セットアップしたけど1日前に逆戻りするしかなかった。
この時点で、『アプリのインストール→再起動→サーバーマネージャーのチェック』の”Do While”をするしかないと思った。そしたら、まさかの1つ目のアプリでサーバーマネージャーが、真っ赤になるじゃない!
そう!その1つ目のアプリが、よもやの”System i Access for Windows 6.1(旧Client Access)”
”Essentials”のサービス”Provider Registry Service”が”Net.Tcp Port Sharing Service”に依存していて、芋づる式にコケている。
”Net.Tcp Port Sharing Service”がコケている理由が、調べたらここに載っていたThanks!→ Net.Tcp Port Sharing Service fails to start
確かにプロセスモニターすると”C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config”が「ACCESS DENY」になっている。

ファイルのACL見ると明らかにオカシイ…。

バックアップから復元して比べてみると元のACLはこんな感じ。

内容を比較すると、.NETプロバイダ絡みの記述が追加されている。以下比較。

でも、ACL書き換えるって不味くないですか?IBMさん。CA7.1以降は大丈夫なんですよね?
とりあえず、復元したファイルに、.NETプロバイダ絡みの記述を追加して、”Net.Tcp Port Sharing Service”サービスを再起動したら、無事動きましたとさ。あーとんでもないのにハマった。
CAバージョンとWindowsバージョンの組み合わせ、”.NETプロバイダ”をインストールから外せば、起きない現象かもね。でもインストールのデフォルトが”フルインストール”ですが…。

因みに、この後、”System i Access for Windows 6.1”PTFを当てても、サービスは問題なく動いていますのであしからず。

AS/400にJenkinsを入れて

AS/400IBM i)にGitを入れたので、さらなる幸せを手に入れるために、Jenkinsを入れた時の事を忘れないようにメモ。

  • 実行環境
    • AS/400:OS400 V5R4M0
    • Java :/QOpenSys/QIBM/ProdData/JavaVM/jdk60/32bit/bin/java
    • Jenkins:1.464
    • Git:1.7.10

初回起動時にエラー

Jenkins初回起動時に出たエラーが以下。何か「chmod」絡みのライブラリがないっぽいけど、2回目以降は出てない。

export JENKINS_HOME=/usr/local/jenkins
java -jar jenkins.war --httpPort=8089 --ajp13Port=-1
---省略---
2012/05/09 13:32:07 hudson.FilePath _chmodAnt
WARNING: GNU C Library not available: Using Ant's chmod task instead.

プロジェクトの2回目以降のポーリングでエラー

だたビルドするだけならスンナリ動いた。
GitからClone後に初回のビルドではOK。でも2回目以降のポーリングでエラー。

    • エラーも文字化け。EBCDICで吐いてるっぽい。


初めは、JenkinsをCLからQP2SHELLで起動してたんだけど、これだと駄目。QP2TERMもQSHもモチロン駄目、ssh経由だとOK。ssh経由ならQP2TERMでもOK。(Javaの環境がネイティブから走るとダメなのかな?QP2TERMだと$HOME/SystemDefault.propertiesで何か設定しないと駄目かもしれん。)
ダサい解決だけど、ssh -Tオプション使って、スクリプト書いて、それをQP2SHELLで起動すると上手くいった。
それにしても、ジョブが一杯付いていてダサい。

MemoryMonitor警告

前述の対処で、ビルド自体は全然問題ないけど、裏で警告を吐いていて気になった。

May 18, 2012 12:54:21 PM hudson.node_monitors.AbstractNodeMonitorDescriptor$Record run
WARNING: Failed to monitor master for Free Swap Space
Throwable occurred: java.io.IOException: No suitable implementation found: os.name=OS/400 os.arch=PowerPC sun.arch.data.model=32
       at org.jvnet.hudson.MemoryMonitor.obtain(MemoryMonitor.java:86)
       at org.jvnet.hudson.MemoryMonitor.get(MemoryMonitor.java:57)
       at hudson.node_monitors.SwapSpaceMonitor$MonitorTask.call(SwapSpaceMonitor.java:103)
       at hudson.node_monitors.SwapSpaceMonitor$MonitorTask.call(SwapSpaceMonitor.java:99)
       at hudson.remoting.LocalChannel.call(LocalChannel.java:45)
       at hudson.node_monitors.SwapSpaceMonitor$1.monitor(SwapSpaceMonitor.java:83)
       at hudson.node_monitors.SwapSpaceMonitor$1.monitor(SwapSpaceMonitor.java:81)
       at hudson.node_monitors.AbstractNodeMonitorDescriptor$Record.run(AbstractNodeMonitorDescriptor.java:202)

追っていくと、topコマンドでモニターしている?っぽい。PASEにtopコマンドが無いんで、そんな感じ。AIXなら"top"入れられるみたいだけど...。

XMLのパースエラー

こっちはAS/400だからって訳じゃないかもだけど、cpdのxmlパースエラーなのか、dryプラグインで落っこってそう。まだ、全然追ってない。

EVERE: Parse Error at line 2 column 33: Document root element "pmd-cpd", must match DOCTYPE root "null".
Throwable occurred: org.xml.sax.SAXParseException: Document root element "pmd-cpd", must match DOCTYPE root "null".
---省略---
Throwable occurred: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
       at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
---省略---
at org.apache.commons.digester3.Digester.parse(Digester.java:1642)
       at org.apache.commons.digester3.Digester.parse(Digester.java:1701)
       at hudson.plugins.dry.parser.cpd.CpdParser.accepts(CpdParser.java:48)
       at hudson.plugins.dry.parser.DuplicationParserRegistry.parse(DuplicationParserRegistry.java:70)

でもカナリHappy

色々あるけど取り敢えず、Git,Jenkinsも使えて、別鯖立てなくて、AS/400で全部できてカナリHappy!XD
やはり、そんじょそこらのオフコンとは、ワケが違うと言う事で、これからもAS/400を大事に育て行こうと思った今日この頃。

Zend Server CE 5.0 for IBM iのdb2_bind_paramで

Zend Server CE 5.0 for IBM i(PHP 5.3 Ver)で、最初からインスコされているIBM_DB2PECLはバージョン”1.8.4”です。このバージョン”1.8.4”のPECLは、既知のバグがあり、関数、クラス内で「db2_prepare → db2_bind_param → db2_execute」をすると、db2_bind_param関数で割り当てる、変数のスコープがどうもおかしいようで、以下のようなエラーになります。

Warning: db2_execute() [function.db2-execute]: Value Not Bound in hoge.php on line XX
Warning: db2_execute() [function.db2-execute]: Binding Error 3 in 

PECLのサポートサイトより

最新のPECLでは、この既知の問題は解決しているようなので、IBM iのZend Server CEに、2011.09.28現在最新の”1.9.2”を導入しました。
いったんは、IBM i上でビルドを試みましたが、「ibm_db2.so」は出来上がるものの、ファイルのバイト数が明らかに小さく、起動時にエクステンションエラーになってしまいました。結果的にはAIX上でビルドしたエクステンションは、正常通り動作しました。「db2_prepare → db2_bind_param → db2_execute」も問題なく使えます。
もし、バイナリが欲しい方がいたら、このブログにコメント下さい。1.9.2の”ibm_db2.so”を提供します。但し、使用は自己責任で。

ビルドの際に、宣言エラーが抜けている様なので、以下の箇所を追加しました。

-- エラー1
../ibm_db2-1.9.2/ibm_db2.c: In function '_php_db2_connect_helper':
../ibm_db2.c:2109: error: 'conn_handle' has no member named 'c_i5_allow_commit'

-- 対応:「ibm_db2.c」に宣言を追加
   114 long c_i5_allow_commit;

-- エラー2
../ibm_db2-1.9.2/ibm_db2.c: In function '_ibm_db_chaining_flag':
../ibm_db2-1.9.2/ibm_db2.c:6761: error: 'SQL_ATTR_CHAINING_BEGIN' undeclared (first use in this function)

-- 対応:「php_ibm_db2.h」に定数を追加
    302 #ifdef PASE /* i5/OS ease of use turn off/on */
    303     #ifndef SQL_ATTR_CHAINING_BEGIN-
    304         #define SQL_ATTR_CHAINING_BEGIN 2464
    305         #define SQL_ATTR_CHAINING_END 2465
    306         #define SQL_IS_POINTER -4
    307     #endif-
    308 #endif /* PASE */

PECL 1.9.2の確認

とりあえず、この情報が役立つか判らないけど、PECLのサポートに上げておいた。
http://pecl.php.net/bugs/bug.php?id=24382

FirePHP(Webug)でハマタ。

DBの設定ファイルを「fwrite関数」を使って書き換える、プログラムを実行するとオカシナ動きをした。
hoge.ini」を以下の様にしたかった

  • 実行前の「hoge.ini」
;現在無効な設定1
;現在無効な設定2
現在有効な設定1
  • 実行後の「hoge.ini」
現在無効な設定1
;現在無効な設定2
;現在有効な設定1


でも、こうなっちゃう

;現在無効な設定1
;現在無効な設定2
;現在有効な設定1

処理は、Zend Frameworkを使っているのだけど、アクションコントローラ(Action Controller)のアクションメソッド(Action Method)で「$_SERVER変数」をダンプすると、2回ログが吐き出されている事が分かった。
しかも、2回目のリクエストのHTTPヘッダーには、'HTTP_X_FIREPHP'とか入っている。
原因はコレだ。Chrome Extensionの「Webug(FirePHP)」。恐らくFirefoxのFirePHPも同じだと思う。
Extensionをオフしたら、すんなりOKだった。
DBの追加、更新処理とか2回走ったら、ヤバイねこれ。怖っ!
使わない時は切っておこ。