ushidayの日記

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

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からMySQLDDL変換ツール作ったら、便利そう。)
この際にファイル名を小文字にするとエラーになります。A,Oはchar or varchar、SはDecimal(p,s)の様にフィールド属性をマップする必要があります。詳しくは「RedBook」に書いて有ったと思います。
空のテーブルが出来たら、CPYFで、既存DBからMySQLへ”*MAP,*DROP”でコピーします。
既存の物理ファイル名で”#、@”とか特殊な文字を使っていると、CCSIDによって、内部コードが左右される様で、正しくSQLを投げる事が出来ませんでした。レガシーファイルは、文字数の制約もあって、記号を使っている事が多かったりします。MySQLでは、特殊記号を名前に含むのを辞めた方が無難だと思います。

  • 環境
    • i5 O/S V5R4M0
    • Zend Core 2.6.1
    • PHP 5.2.6
    • MySQL 5.1.35
  • テスト内容
    1. 200万レコードから40万レコードの抽出して読み込み
    2. データ長157(Unicodeなので前回よりも増えてます)byteの1万レコードを書き込み
    3. 「2」で書き出した、1万レコードを更新

結論からすると、insert、updateは、実用レベルだけど、大量データのselectは辛いものがあるかもしれません。インデックスなどを使ったチューニングをしているわけではないのですが、そこまで劇的に早くなるとは思えません。ただ限られたデータ量である程度のレスポンスが得られるのならば、MySQLDB2が連携して使えるという事は若干の魅力です。というか夢があります。
それより実用でイタイのは、テーブル名やフィールド名の制約の方ですね。テーブル名に制限があると、既存のOSSとかは、使えないのですし。フィールドに関しては、制約は無いですが、レガシー側は「カラム名0001」みたいな、別名が付けられてしまうので、DDLみてもフィール名判らないですし、レガシー側からすると、連携とかは関係なくなってしまいます。
下が平均的な結果です。

PDO&IBMDB2i取得件数は、411897件です。

 time indexex time%
Start1264584916.89850900-0.00%
PDO & IBMDB2i Start select1264584916.898529000.0000200.00%
PDO & IBMDB2i End select1264585047.09795000130.19942194.73%
PDO & IBMDB2i Start insert1264585047.097983000.0000330.00%
PDO & IBMDB2i End insert1264585052.322249005.2242663.80%
PDO & IBMDB2i Start update1264585052.322281000.0000320.00%
PDO & IBMDB2i End update1264585054.338448002.0161671.47%
Stop1264585054.338487000.0000390.00%
total-137.439978100.00%

MySQL関数&IBMDB2i取得件数は、411897件です。

 time indexex time%
Start1264588889.75979500-0.00%
MySQL Start select1264588889.759815000.0000200.00%
MySQL End select1264589024.20746300134.44764896.03%
MySQL Start insert1264589024.207497000.0000340.00%
MySQL End insert1264589028.688800004.4813033.20%
MySQL Start update1264589028.688830000.0000300.00%
MySQL End update1264589029.764874001.0760440.77%
Stop1264589029.764910000.0000360.00%
total-140.005115100.00%

PDOとDB2関数のベンチマーク

PDOとDB2関数で、大きな違いは出ないと伺ってはいたのですが、やらないと気が済まないもので、ベンチマークを比較しててみました。
PDOの方で、途中DBに結果が、反映されなくて、気付いたのですが、Write,Update処理にジャーナルが必要そうです。昔MSとかのODBCもそうだった記憶があります。「create schema」と「create table」でやっていれば、問題ないですけど、既存ライブラリとかPFの世界だと、ジャーナル付けるのが面倒だったりします。ジャーナルレシーバーの管理とか...。結局トランザクション処理が必要なケースは、いずれにしても必要なのですが...。

  • テスト内容
    1. 200万レコードから40万レコードの抽出して読み込み
    2. データ長102byteの1万レコードを書き込み
    3. 「2」で書き出した、1万レコードを更新

何回か実行した下記が、平均的な結果です。殆ど差が出なかったです。ただ”Update”に関してPDOの方が、少しよく感じられました。ジャーナル処理したファイルだとDB2関数のレスポンスに何かあるのかな?ジャーナルなしでやるとまた違う結果になるかもしれません。状況などによって今回の結果だけが全てではないですし。ただPDOのレスポンスが実用に十分使えるとは感じられました。

  • DB2関数の結果

DB2取得件数は、411897件です。

 time indexex time%
Start1264402983.38512200-0.00%
DB2 Start select1264402983.385144000.0000220.00%
DB2 End select1264402983.646742000.2615985.44%
DB2 Start insert1264402983.646805000.0000630.00%
DB2 End insert1264402986.367826002.72102156.63%
DB2 Start update1264402986.367878000.0000520.00%
DB2 End update1264402988.189578001.82170037.92%
Stop1264402988.189624000.0000460.00%
total-4.804502100.00%

  • PDOの結果

PDO取得件数は、411897件です。

 time indexex time%
Start1264402976.43134000-0.00%
PDO Start select1264402976.431362000.0000220.00%
PDO End select1264402976.688490000.2571286.54%
PDO Start insert1264402976.688532000.0000420.00%
PDO End insert1264402979.888355003.19982381.43%
PDO Start update1264402979.888395000.0000400.00%
PDO End update1264402980.360675000.47228012.02%
Stop1264402980.360720000.0000450.00%
total-3.929380100.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に入れ込んで、明日確認してみます。

    • 「5. Stop Apache server instances」= ZENDCORE/ZCCAPCE001(*PGM/CLLE)
    • 「6. ReStart Apache server instances」= ZENDCORE/ZCCAPCR001(*PGM/CLLE)
    • 「4. Start Apache server instances」= ZENDCORE/ZCCAPCS001(*PGM/CLLE)

PDOでハマル

新しく”Zend Core i5”を入れ替えたので、PDOを試してみたら、しょーもない事でハマッたのでメモを残します。
IBMDB2用のドライバは、”pdo_ibm.so”のextesionが、php.iniで有効になっていれば使えます。
でもって、RedBookとか、関数リファレンスに使い方が、あるので、その通りやってみると上手くいかない。
(※一生懸命英語のRedBookを読んだのにー...orz)

関数リファレンスより

■説明
PDO_IBM のデータソース名 (DSN) は、IBM CLI DSN にもとづいています。 PDO_IBM DSN は、主に以下の部分から構成されます。

DSN プレフィックス
DSN プレフィックスibm: です。
DSN
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。