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を大事に育て行こうと思った今日この頃。

db2cli.iniじゃなくて構成アシスタントで出来る

以前書いたこの記事で、トランザクション分離レベルの指定をdb2cli.iniでなんて書いてあったのですが、構成アシスタントの「CLI設定」で簡単に出来たので今更ながら補足です。

  • 構成アシスタントを開く
  • 設定したいインスタンスの横を右クリックで「CLI設定」を選択

  • 設定タブを選択

  • <追加>ボタンをクリック
  • 一覧から「TXNIsolation」パラメータを選択

  • 適宜分離レベルを選択
  • <適用>ボタンをクリック

以上です。簡単ですね。

Zend Server for i5 CE で複数のインスタンスを動かす

随分ご無沙汰のブログですが久々にアップです...。
「Zend Server for i5 CEでphp.iniの設定変えて別インスタンスを起動する事って、出来なくなったのかね?」なんていう、Twitterでのやりとりがありました。「Zend Server(※以下ZS)ではどうよ?」という興味から少し調べてみました。
そもそも、Zend Core(※以下ZC)でさえやった事がなかったのですが、ZC時代は、IHS(IBM HTTP Server)に対してリバースプロキシをしていたのですが、ZSになりIHSに対して直接FasgCGIモジュールとして動作するようになりました。ZC時代はアパッチを含んでいたので、そのデーモンを別途起動するだけなんでしょうと勝手に推測。
ZSは「IHSのインスタンス新たに作って、設定ファイルコピればいいんじゃね?」と思ったので検証しました。試す場合には自己責任でお願いします。
前提としては、ドキュメントルートを共用する場合を想定して、行いました。

動作環境
    • IBMi V5R4M0
    • Zend Server for i5 CE 5.0.2 (PHP 5.3)

IHSインスタンスの作成

IHSのインスタンスを作成するには、IHSの管理画面にアクセスします。管理画面は、STRTCPSVR *HTTP の*ADMINインスタンスが起動されている必要があります。手順は以下の通りです。

■手順のイメージ





インスタンスが出来上がると下の図のようになります。

php.iniの設定

既存のphp.iniをコピーして、新たに作成したインスタンス(この場合はZENDSVR2)用のphp.iniを作成します。

cp -prh /usr/local/zenssvr/etc /usr/local/zendsvr/etc2


HTTPの設定

既存のconfディレクトリをコピーして、httpd.confとfastcgi.conf設定を新たに作成したインスタンス用に変更します。

cp -prh /www/zendsvr/conf /www/zendsvr/conf2

httpd.confのリッスンポートを変更します。デフォルトは10088です。

fastcgi.confの「SetEnv="PHPRC=xxxxx"」で設定されている。php.iniを読み取るリソースディレクトリの設定を変更します。これは先のphp.iniをコピーしたディレクトリになります。この場合は、"/usr/local/zendsvr/etc2"になります。FastCGIについてあまり詳しくないのですが、Apacheの"PHPIniDir"の指定で任意のファイル名を指定できるのとは違い、php.iniのファイル名は決まっている?様です。FastCGIについて...

IHSインスタンスの起動

IHSインスタンスを起動します。これは管理画面でも出来て起動パラメータを指定できるのですが、うまくいきませんでした。自分のログインしたユーザーがCCSID5026だったからかもしれません。後日5035で検証してみます。
※追記 5035だと起動できました。CCSIDには注意しましょう。ちなみに構成やポートの表示は空気読んでくれません。
とりあえず、5250でSTRTCPSVR *HTTP インスタンス名 -f /www/zendsvr/conf2/httpd.confで、IHSインスタンスを起動する事が出来ます。

ジョブの実行状態確認した様子 

動作確認

こんな感じで、別インスタンスで起動しました。ZENDSVRサブシステム(i5コマンドやその他機能)の検証はとれていないので、課題としてその辺りを検証する必要がありますね。

IHSの管理画面について

IHSの管理画面は強制的に、アプリケーションディレクトリconfを見ている様で、ポートや設定は下記の図の様に正しく使えなくなります。そもそも何でconf決め打ちなんだろ?これだと管理画面として使えないので、ドキュメントルート共用したいだけなら、リンク貼ったほうが管理画面はそのまま使えて良いかなとも思うし。ただこの管理画面の設定表示は、includeとかするとエラー扱いになったりで個人的感想としては、「もう一歩なんだけどなぁ」と言った感じです。

PASE環境でのsyslogの設定

以前、PASE環境でsyslogを設定した時の事を、また忘れていたので、備忘録として...。

syslogd用のディレクトリ&ファイルを作成

PASE版syslogdは、”/QOpenSys/usr/sbin/syslogd -> /QOpenSys/QIBM/ProdData/OS400/PASE/sbin/syslogd”こういう状況になってます。syslog用のディレクトリやファイルは、予め用意する必要があり、自前で作成します。

mkdir /var/log
touch /var/log/secure

設定ファイルは、”/QOpenSys/etc/syslog.conf”を作成します。
■syslog.conf

#1日単位でファイルを区切る。ファイルは、最大7つまでで、圧縮してアーカイブする
authpriv.info /var/log/secure rotate time 1d  files 7 compress archive /var/log/archive/secure/

#全てのfacilityのデバッグレベルとメール機能を除いたログを出力。ファイルサイズは1024Kで最大2つまで
*.debug;mail.none /var/log/syslog/syslog.out rotate size 1024k files 2

PASEのsyslog設定、facilityのワイルドカードは出来るが、レベルのワイルドカードは出来ないので少し、Linuxとは違ったり...(これを結構忘れてる)。後は、IPL等でsyslogdを実行すればOKです。