PASE環境でbash,zshを使う場合
IBM i(AS/400)には、PASE環境でコマンド処理をする為の、5250で使えるターミナル(※”call qp2term”で実行)があります。
このターミナルですが、ログインシェルは”shやbsh”(リンク元は”/QOpenSys/QIBM/ProdData/OS400/PASE/bin/ksh”)で、当然キーバインドも5250エミュレータのままで、今時としては実用性がかなり低くいです。
少しでも実用性を高める為に、PASE環境にbash,zshを、Windows環境にPoderosaというターミナルを入れてみたので、メモを残しておきます。
■導入環境
特に難しい設定は、ありませんが、言語環境はUTF-8を選ぶのと、”Terminfo”(/QOpenSys/usr/share/lib/terminfo)を見ると、”aixterm”か”xterm”しかないので、必要に応じて”tic”コマンドでterminfoを作成するか、どちらかを選択する必要がありそうです。
他に、AIXだとコマンドのオプションが、結構違ったりして、Mac,Cygwin,Linuxのエイリアスそのまま使えないものが多いです。特にカラー関係や、コマンド処理表示のオプションは無いので。
■~/.bashrcの一部抜粋
HISTSIZE=10000 HISTFILESIZE=10000 HISTCONTROL=ignoredups export HISTSIZE HISTFILESIZE HISTCONTROL set -o vi export TERM=xterm #export TERM=aixterm export PS1=\\s:\\w\\$\ export LANG=JA_JP export SHELL=/usr/local/bin/bash export TMPDIR=/tmp export TZ='<JST>-9' export LC__FASTMSG=true export LOCPATH=/usr/lib/nls/loc export NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/JA_JA/%N:/usr/lib/nls/msg/JA_JA/%N.cat export JAVA_HOME=/QIBM/ProdData/Java400/jdk15 export GROOVY_HOME=/usr/local/groovy/groovy-1.6.3 export GRAILS_HOME=/usr/local/grails/grails-1.0.5 export ANT_HOME=/usr/local/ant/apache-ant-1.7.1 PATH=/QOpenSys/QIBM/ProdData/SC1/OpenSSH/openssh-3.5p1/bin PATH=/usr/local/Zend/Core/bin:$PATH PATH=$ANT_HOME/bin:$PATH PATH=$GRAILS_HOME/bin:$PATH PATH=$GROOVY_HOME/bin:$PATH PATH=$JAVA_HOME/bin:$PATH PATH=/usr/local/gnu/bin:$PATH PATH=/usr/local/bin:$PATH PATH=/usr/bin:$PATH PATH=.:$PATH PATH=/usr/sbin:$PATH PATH=/QOpenSys/usr/bin/X11:$PATH PATH=/usr/ccs/bin:$PATH PATH=/QOpenSys/usr/bin:$PATH HOME=/home/username alias h='history 32' alias ll='ls -al' alias rm='rm -e' alias mv='mv -i' alias ps='ps -e'
■~/.zshrcの一部抜粋
autoload -U compinit compinit setopt auto_cd setopt auto_pushd setopt correct setopt list_packed setopt nolistbeep PROMPT="zsh:%/%% " PROMPT2="%_%% " SPROMPT="%r is correct? [n,y,a,e]: " HISTFILE=~/.zsh_history HISTSIZE=6000000 SAVEHIST=6000000 setopt hist_ignore_dups # ignore duplication command history list setopt share_history # share command history data bindkey -v ------ 以下 .bashrcと同様 -------
Poderosaは、SSH2接続などをサポートしている高機能ターミナルです。タブ形式で複数のターミナルを開けたり、背景をカスタマイズしたりと、初めて使ったのですが、なかなかいい感じです。
見た目は、こんな感じです。補完が使えるってスバラシイ。viもまともに使えるようになります。
QCCSID5026の弊害
「Zend Core i5 の起動について」という日記を以前書いたのですが、その後、起動出きない原因が分かったので、書いておきます。
レガシーな環境だと、AS/400(IBM i)のシステム値”QCCSID”が、未だに”5026”だったりします。モダンな環境ですと”5035”なのでしょうけど、”遺産”を持ったまま、”5026”を使い続けています。この”5026”は、英小文字が使えないという、百害あって一利なしなのですが、移行の工数とメリットを天秤にかけて、移行するユーザーが少ないのが現状です。社内も”5035”のシステム値にすれば良かったのですが、モダンな事したい時だけ、ジョブを”5035”に変えています。
前置きが長くなったのですが、Zend Core i5を入れますと、ZENDというサブシステムが作られます。このサブシステムが起動する際に、”ZENDCORE/ZCOREJOBDA”というジョブ記述が自動開始ジョブとして指定されます。このジョブ記述は、”ZENDCORE/ZCCSBSA001”プログラムが要求されます。これでZend CoreのApacheやらi5コマンドを立ち上げています。ユーザーは”ZENDADMIN”というユーザになります。この”ZENDADMIN”のユーザープロファイルのCCSIDは、もちろん”*SYSVAL”です。万国共通のプラットフォームで、インストールを考えれば、当たり前です。”*SYSVAL=5026”なので、Apacheのインスタンスを立ち上げる際に、恐らく英小文字を使っているのでしょう。
たぶん「CALL QP2SHELL PARM('/QOpenSys/usr/bin/ksh' *tcat x'00' ,'/usr/local/Zend/apache2/bin/httpd ...' *tcat x'00')」こんな風に。という事で、”ZENDADMIN”のCCSIDを5035にした事でめでたく解決しました。(擬似乱数発生デーモン”prngd”も止まっていたようで、動いていました。)
こういう処で、”5026”の弊害があるんだなーと、いつも思います。Open系のSAVFからのインストールを考えると是非ともQCCSIDは5035が良いですね。
MySQL&IBMDB2iのベンチマーク
以前書いた日記の「IBMDB2i ストレージエンジン」MySQL IBMDB2iストレージエンジンで、PDOとMySQL関数でのベンチマークを、前回と同じ条件でやってみました。
もしIBM i(AS/400)上のDDSから生成した既存の物理ファイルからデータを移行するには、まず先にIBMDB2iで空のテーブルを作成しておく必要があります。( DDSからMySQLのDDL変換ツール作ったら、便利そう。)
この際にファイル名を小文字にするとエラーになります。A,Oはchar or varchar、SはDecimal(p,s)の様にフィールド属性をマップする必要があります。詳しくは「RedBook」に書いて有ったと思います。
空のテーブルが出来たら、CPYFで、既存DBからMySQLへ”*MAP,*DROP”でコピーします。
既存の物理ファイル名で”#、@”とか特殊な文字を使っていると、CCSIDによって、内部コードが左右される様で、正しくSQLを投げる事が出来ませんでした。レガシーファイルは、文字数の制約もあって、記号を使っている事が多かったりします。MySQLでは、特殊記号を名前に含むのを辞めた方が無難だと思います。
- 環境
- テスト内容
- 200万レコードから40万レコードの抽出して読み込み
- データ長157(Unicodeなので前回よりも増えてます)byteの1万レコードを書き込み
- 「2」で書き出した、1万レコードを更新
結論からすると、insert、updateは、実用レベルだけど、大量データのselectは辛いものがあるかもしれません。インデックスなどを使ったチューニングをしているわけではないのですが、そこまで劇的に早くなるとは思えません。ただ限られたデータ量である程度のレスポンスが得られるのならば、MySQLとDB2が連携して使えるという事は若干の魅力です。というか夢があります。
それより実用でイタイのは、テーブル名やフィールド名の制約の方ですね。テーブル名に制限があると、既存のOSSとかは、使えないのですし。フィールドに関しては、制約は無いですが、レガシー側は「カラム名0001」みたいな、別名が付けられてしまうので、DDLみてもフィール名判らないですし、レガシー側からすると、連携とかは関係なくなってしまいます。
下が平均的な結果です。
- PDO & MySQL & IBMDB2i
PDO&IBMDB2i取得件数は、411897件です。
time index | ex time | % | |
Start | 1264584916.89850900 | - | 0.00% |
PDO & IBMDB2i Start select | 1264584916.89852900 | 0.000020 | 0.00% |
PDO & IBMDB2i End select | 1264585047.09795000 | 130.199421 | 94.73% |
PDO & IBMDB2i Start insert | 1264585047.09798300 | 0.000033 | 0.00% |
PDO & IBMDB2i End insert | 1264585052.32224900 | 5.224266 | 3.80% |
PDO & IBMDB2i Start update | 1264585052.32228100 | 0.000032 | 0.00% |
PDO & IBMDB2i End update | 1264585054.33844800 | 2.016167 | 1.47% |
Stop | 1264585054.33848700 | 0.000039 | 0.00% |
total | - | 137.439978 | 100.00% |
- MySQL関数 & IBMDB2i
MySQL関数&IBMDB2i取得件数は、411897件です。
time index | ex time | % | |
Start | 1264588889.75979500 | - | 0.00% |
MySQL Start select | 1264588889.75981500 | 0.000020 | 0.00% |
MySQL End select | 1264589024.20746300 | 134.447648 | 96.03% |
MySQL Start insert | 1264589024.20749700 | 0.000034 | 0.00% |
MySQL End insert | 1264589028.68880000 | 4.481303 | 3.20% |
MySQL Start update | 1264589028.68883000 | 0.000030 | 0.00% |
MySQL End update | 1264589029.76487400 | 1.076044 | 0.77% |
Stop | 1264589029.76491000 | 0.000036 | 0.00% |
total | - | 140.005115 | 100.00% |
PDOとDB2関数のベンチマーク
PDOとDB2関数で、大きな違いは出ないと伺ってはいたのですが、やらないと気が済まないもので、ベンチマークを比較しててみました。
PDOの方で、途中DBに結果が、反映されなくて、気付いたのですが、Write,Update処理にジャーナルが必要そうです。昔MSとかのODBCもそうだった記憶があります。「create schema」と「create table」でやっていれば、問題ないですけど、既存ライブラリとかPFの世界だと、ジャーナル付けるのが面倒だったりします。ジャーナルレシーバーの管理とか...。結局トランザクション処理が必要なケースは、いずれにしても必要なのですが...。
- テスト内容
- 200万レコードから40万レコードの抽出して読み込み
- データ長102byteの1万レコードを書き込み
- 「2」で書き出した、1万レコードを更新
何回か実行した下記が、平均的な結果です。殆ど差が出なかったです。ただ”Update”に関してPDOの方が、少しよく感じられました。ジャーナル処理したファイルだとDB2関数のレスポンスに何かあるのかな?ジャーナルなしでやるとまた違う結果になるかもしれません。状況などによって今回の結果だけが全てではないですし。ただPDOのレスポンスが実用に十分使えるとは感じられました。
- DB2関数の結果
DB2取得件数は、411897件です。
time index | ex time | % | |
Start | 1264402983.38512200 | - | 0.00% |
DB2 Start select | 1264402983.38514400 | 0.000022 | 0.00% |
DB2 End select | 1264402983.64674200 | 0.261598 | 5.44% |
DB2 Start insert | 1264402983.64680500 | 0.000063 | 0.00% |
DB2 End insert | 1264402986.36782600 | 2.721021 | 56.63% |
DB2 Start update | 1264402986.36787800 | 0.000052 | 0.00% |
DB2 End update | 1264402988.18957800 | 1.821700 | 37.92% |
Stop | 1264402988.18962400 | 0.000046 | 0.00% |
total | - | 4.804502 | 100.00% |
- PDOの結果
PDO取得件数は、411897件です。
time index | ex time | % | |
Start | 1264402976.43134000 | - | 0.00% |
PDO Start select | 1264402976.43136200 | 0.000022 | 0.00% |
PDO End select | 1264402976.68849000 | 0.257128 | 6.54% |
PDO Start insert | 1264402976.68853200 | 0.000042 | 0.00% |
PDO End insert | 1264402979.88835500 | 3.199823 | 81.43% |
PDO Start update | 1264402979.88839500 | 0.000040 | 0.00% |
PDO End update | 1264402980.36067500 | 0.472280 | 12.02% |
Stop | 1264402980.36072000 | 0.000045 | 0.00% |
total | - | 3.929380 | 100.00% |
Zend Core i5 の起動について
先日導入した、”Zend Core i5 2.6”が、IBM i(AS/400)のIPL完了後に、Apacheのインスタンスが起動していません。ZENDCORE/ZENDのサブシステムは起動しているんだけど...。
で、調べてみると、こんな情報もあったので”System i5 - ZEND Products - Automatic Start Up ”ありがちなパターンだけど、TCP/IPが通ってない状況で、Apacheインスタンスを起動しようとしてるのが問題かも?と思い、”ZENDCORE/ZCMENU”から、手動でZENDサブシステムを終了して、開始してみると、やっぱりApacheインスタンスは起動されていませんでした。という事は、TCP/IP以前の問題そうです。しかし特にエラーのログとかもなさそうです。
特にZENDサブシステムのこのあたりの起動がしていない...
ZEND ZENDCOREAP ZENDADMIN BCI .6 PGM-httpd SELW ZENDCOREAP ZENDADMIN BCI .0 PGM-httpd DEQW ZENDCOREAP ZENDADMIN BCI .0 PGM-httpd SELW ZENDCOREAP NOBODY BCI .0 PGM-httpd TIMW ZENDCOREAP NOBODY BCI .0 PGM-httpd TIMW
通常インストールをすると、サブシステムQSYSWRKの自動実行ジョブとして登録され、「ZENDCORE/ ZCOREJOBDX 」ジョブの要求データ「STRSBS SBSD(ZENDCORE/ZEND)」が実行されているので、それを”QSTRUP”に変えて、確認してみましたが、もちろん結果は同じでした。前のバージョンの時は、そんな細工した事ないのに、何故だろう?どう考えてもApacheインスタンスを起動させようとしている気配がないです。
ZCMENUには、Apacheインスタンスを起動・終了するメニューが単独(下の4〜6)であります。これを実行すると、もちろん正常に動くようになるのですが、毎回そんな事す訳にはいかないので...。
■ZENDCORE/ZCMENUメニュー
ZCAMENU Zend Core for IBM i5/OS Setup Tool Select one of the following: 1. Start Zend Core Subsystem 2. Stop Zend Core Subsystem 4. Start Apache server instances 5. Stop Apache server instances 6. ReStart Apache server instances 7. Additional Apache options 8. Start i5_COMD service 9. End i5_COMD service 11. Add restart ZC_STR_PRN job to scheduler 12. Work with ZC_STR_PRN scheduled jobs
「CHGJOB LOGCLPGM(*YES)」して、4〜6を実行して、ログを追いかけると、下のCLLEが、動いているので、明日のQSTRUPに入れ込んで、明日確認してみます。
PDOでハマル
新しく”Zend Core i5”を入れ替えたので、PDOを試してみたら、しょーもない事でハマッたのでメモを残します。
IBMのDB2用のドライバは、”pdo_ibm.so”のextesionが、php.iniで有効になっていれば使えます。
でもって、RedBookとか、関数リファレンスに使い方が、あるので、その通りやってみると上手くいかない。
(※一生懸命英語のRedBookを読んだのにー...orz)
関数リファレンスより
■説明
PDO_IBM のデータソース名 (DSN) は、IBM CLI DSN にもとづいています。 PDO_IBM DSN は、主に以下の部分から構成されます。
a) db2cli.ini あるいは odbc.ini を使用したデータソースの設定
b) カタログされたデータベース名、つまり、 DB2 クライアントにおけるデータベースエイリアス
c) 完全な接続文字列。次のような形式になります。 DRIVER={IBM DB2 ODBC DRIVER};DATABASE=database;HOSTNAME=hostname ;PORT=port ;PROTOCOL=TCPIP;UID=username ;PWD=password ; 各パラメータは次の内容を表します。
- database
- データベースの名前。
- hostname
- データベースサーバのホスト名あるいは IP アドレス。
- port
- データベースが要求を待ち受けている TCP/IP ポート。
- username
- データベースに接続する際のユーザ名。
- password
- データベースに接続する際のパスワード。
■使用例
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=testdb;" .
"HOSTNAME=11.22.33.444;PORT=56789;PROTOCOL=TCPIP;", "testuser", "tespass");
と記載してあるので、こんな感じでやってみると
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ライブラリ名;" .
"HOSTNAME=localhost;PORT=56789;PROTOCOL=TCPIP;", "foo", "*****");
string(180) "SQLSTATE=42705, SQLConnect: -950 リレーショナル・データベースDRIVER={IBM DB2 ODがリレーショナル・データベース・ディレクトリーの中にない。"
と来た。RedBookの解説もDriverの部分が”DSN=”になってるぐらいで、結果的には同じでした。
PDO自体が駄目な可能性もあると思い、MySQLを繋いでみると、そっちはOK。
エラーをよく見ると光明が...
でもこのエラーよく見ると「リレーショナル・データベースDRIVER={IBM DB2 OD」の部分は途切れていて、どうも長いDSNの文字列を認識しようという腹はなさそう。明らかにその名前だけで、データベースを認識しようとしている?
もしや...。”*LOCAL”か”システム名”?と思い、やってみると、ドンピシャでした。システム名はDSPNETAで確認出来ます。
なんだか、その間に色々調べて遠回りしちゃいました。トホホ...
じゃあホストのIPや、ポートの情報はどしてるの?という事で、それは”WRKRDBDIRE”で登録しておくのでした。
■WRKRDBDIRE
リレーショナル・データベース・ディレクトリー 項目の処理 位置指定 . . . . . . . . オプションを入力して,実行キーを押してください。 1= 追加 2= 変更 4= 除去 5= 明細の表示 6= 明細の印刷 リモート OPT 項目 ロケーション テキスト システム名 *LOCAL ※OPT = 5で詳細 --------------------------------------------------------------- リレーショナル・データベース項目明細の表示 リレーショナル・データベース . . : システム名 リモート・ロケーション : リモート・ロケーション . . . . : *LOCAL タイプ . . . . . . . . . . . : *IP ポート番号またはサービス名 . . : *DRDA リモート認証方式 : 所望の方式 . . . . . . . . . : *ENCRYPTED 低い認証の許可 . . . . . . . : *ALWLOWER テキスト . . . . . . . . . . . . : リレーショナル・データベース・タ イプ . . . . . . . . . . . . . : *LOCAL
PASEのtarって...
ZendFrameWorkを入れようと、IBM i(AS/400)上で、”〜tar.gz”をungzipして、tarしたら...
「警告うんぬん」言われて、"@LongLink"ファイルが、解凍先に出来ているではありませんか。
どうやら、”PASE標準(AIX標準?)”って、100文字縛りがあるらしい。
というか、GNU tarでの100文字以上のファイルに付けられる”@LongLink”を理解してくれないみたい。
「まいったな。」という事で、今後の事も考えて、”GNU tar”を入れておきました。以前、"gcc"でお世話になったサイトに、AIXバイナリが有りましたので、有り難く使わせて頂きました。
そして、tarコマンドの既存の場所を検索すると、二つ出てきました。
PASE環境のtarシンボリックリンクをGNU tarに置き換えて実行すると、今度は”libintl.so.2がねぇぞ!”と言われました。依存関係に有る「GNU gettext」が、PASEに無いので、これまた先程のありがたい場所から(バイナリあるとホント助かります。本来は別の所のお仕事な...)同じく取得して解凍すれば、その後は無事tarコマンドが動きました。めでたし×2。