2012年7月9日月曜日

Oracle TuxedoのATMIサンプルをネットワーク環境で動かす

Oracle Tuxedo ダウンロードからtuxedo111120_32_win_xp_x86_VS2010_client.exeをダウンロードして、クライアントマシンにインストールしておく。サーバー側のインストールと同じくOracleホームを聞かれるので、適当に。OracleホームをC:\oracle\productにすると、C:\oracle\product\tuxedo11gR1_VS2010にインストールされる。

サーバー側の設定を変更する。
  • サーバーのIPアドレスは192.168.30.128
  • サーバーのポート番号は5000を開けておく
  • NETWORKセクションはまだ使わないけどtmloadcfがエラーになるのでとりあえず設定する
[tuxedo@centos atmi]$ vi ubbsimple
#       (c) 2003 BEA Systems, Inc. All Rights Reserved.
#ident  "@(#) samples/atmi/simpapp/ubbsimple    $Revision: 1.7 $"

#Skeleton UBBCONFIG file for the TUXEDO Simple Application.
#Replace the  items with the appropriate values.

*RESOURCES
IPCKEY          123456

#Example:
#IPCKEY         123456

DOMAINID        simpapp
MASTER          simple
MAXACCESSERS    10
MAXSERVERS      50
MAXSERVICES     100
MODEL           MP
LDBAL           N
OPTIONS         LAN

*MACHINES
DEFAULT:
                APPDIR="/home/tuxedo/atmi"
                TUXCONFIG="/home/tuxedo/atmi/tuxconfig"
                TUXDIR="/home/tuxedo/tuxedo11gR1"
                MAXACCESSERS=100
                MAXWSCLIENTS=50
#Example:
#               APPDIR="/home/me/simpapp"
#               TUXCONFIG="/home/me/simpapp/tuxconfig"
#               TUXDIR="/usr/tuxedo"

centos          LMID=simple

#Example:
#beatux         LMID=simple

*GROUPS
GROUP1
                LMID=simple     GRPNO=1 OPENINFO=NONE

*NETWORK
simple          NADDR="//192.168.30.128:5001"
                NLSADDR="//192.168.30.128:5002"

*SERVERS
DEFAULT:
                CLOPT="-A"

simpserv        SRVGRP=GROUP1 SRVID=1
"WSL"           SRVGRP=GROUP1 SRVID=2
                CLOPT="-A -- -n //192.168.30.128:5000"

*SERVICES
TOUPPER

設定ファイルをバイナリ変換しなおして起動する。tlistenを起動してないので警告が出るけど今は無視。
[tuxedo@centos atmi]$ tmloadcf -y ubbsimple
[tuxedo@centos atmi]$ tmboot -y
Booting all admin and server processes in /home/tuxedo/atmi/tuxconfig
INFO: Oracle Tuxedo, Version 11.1.1.2.0, 32-bit, Patch Level (none)
CMDTUX_CAT:1483: WARN: can't contact local tlisten process

Booting admin processes ...

exec DBBL -A :
        on simple -> process id=19752 ... Started.
exec BBL -A :
        on simple -> process id=19755 ... Started.

Booting server processes ...

exec simpserv -A :
        on simple -> process id=19758 ... Started.
exec WSL -A -- -n //192.168.30.128:5000 :
        on simple -> process id=19759 ... Started.
4 processes started.
[tuxedo@centos atmi]$ 
ここからクライアント側(Windows)
環境変数を設定する。
set TUXDIR=C:\oracle\product\tuxedo11gR1_VS2010
set PATH=%PATH%;%TUXDIR%\bin
set LIB=%LIB%;%TUXDIR%\lib
set INCLUDE=%INCLUDE%;%TUXDIR%\include
set WSNADDR=//192.168.30.128:5000
コードを組む。参照設定に%TUXDIR%\bin\libwscdnet.dllを追加しておくこと。(Visual Basic Expressの場合)
Imports Bea.Tuxedo.ATMI

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim sndstr, rcvstr As TypedString
        Dim ac As AppContext = Nothing
        Dim info As New TypedTPINIT()

        info.flags = TypedTPINIT.TPMULTICONTEXTS
        'info.cltname = "vb client"

        Try
            ac = AppContext.tpinit(info)
            sndstr = New TypedString("hello world")
            rcvstr = New TypedString(1000)

            ac.tpcall("TOUPPER", sndstr, rcvstr, 0)

            Console.WriteLine("rcvstr = {0}", rcvstr.GetString(0, 1000))
        Catch ex As ApplicationException
            Console.WriteLine("Got Exception = {0}", ex)
        Finally
            If Not ac Is Nothing Then
                ac.tpterm()
            End If
        End Try
    End Sub
End Class
起動してButton1を押すとコンソールに以下が出力される
rcvstr = HELLO WORLD
おまけ
MAXSERVERS、MAXSERVICESの値が小さいと、サーバー起動時にエラーが出ます。
[tuxedo@centos atmi]$ tmboot -y
Booting all admin and server processes in /home/tuxedo/atmi/tuxconfig
INFO: Oracle Tuxedo, Version 11.1.1.2.0, 32-bit, Patch Level (none)
CMDTUX_CAT:1483: WARN: can't contact local tlisten process

Booting admin processes ...

exec DBBL -A :
        on simple -> process id=20199 ... Started.
exec BBL -A :
        on simple -> process id=20202 ... Started.

Booting server processes ...

exec simpserv -A :
        on simple -> Failed.
exec WSL -A -- -n //192.168.30.128:5000 :
        on simple -> process id=20207 ... Started.
3 processes started.
[tuxedo@centos atmi]$
$APPDIR/ULOG.mmddyyを見るとこんな感じのエラーが出る。
161413.centos!tmboot.20198.3086485184.-2: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit
161413.centos!tmboot.20198.3086485184.-2: CMDTUX_CAT:1578: ERROR: Could not contact NLS on simple
161413.centos!tmboot.20198.3086485184.-2: CMDTUX_CAT:1576: ERROR: No NLS available for remote machine simple
161415.centos!DBBL.20199.3086223040.0: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit
161415.centos!DBBL.20199.3086223040.0: LIBTUX_CAT:262: INFO: Standard main starting
161417.centos!DBBL.20199.3086223040.0: CMDTUX_CAT:4350: INFO: BBL started on simple - Release 11112
161417.centos!BBL.20202.3086956224.0: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit, Patch Level (none)
161417.centos!BBL.20202.3086956224.0: LIBTUX_CAT:262: INFO: Standard main starting
161417.centos!BRIDGE.20205.3086526144.0: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit
161417.centos!BRIDGE.20205.3086526144.0: LIBTUX_CAT:262: INFO: Standard main starting
161417.centos!BRIDGE.20205.3086526144.0: LIBTMIB_CAT:74: ERROR: Failed to advertise dynamic /Admin service _TBR_0
161417.centos!BRIDGE.20205.3086526144.0: CMDTUX_CAT:1788: WARN: Could not advertise administrative service
161418.centos!DBBL.20199.3086223040.0: LIBTUX_CAT:328: ERROR: No space in Bulletin Board for Service Table
161418.centos!simpserv.20206.3086805200.0: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit
161418.centos!simpserv.20206.3086805200.0: LIBTUX_CAT:248: ERROR: System init function failed, Uunixerr = 
161418.centos!tmboot.20198.3086485184.-2: CMDTUX_CAT:825: ERROR: Process simpserv at simple failed with /T tperrno (TPENOENT - no entry found)
161418.centos!WSL.20207.3086792384.0: 07-09-2012: Tuxedo Version 11.1.1.2.0, 32-bit
161418.centos!WSL.20207.3086792384.0: LIBTUX_CAT:262: INFO: Standard main starting

Oracle TuxedoのATMIサンプルをローカル環境で動かす

インストール後の作業の手順通りです。
まずはtuxedo11gR1/tux.envの内容を実行して環境変数を設定する。
[tuxedo@centos ~]$ TUXDIR=/home/tuxedo/tuxedo11gR1; export TUXDIR
[tuxedo@centos ~]$ JAVA_HOME=$TUXDIR/jre; export JAVA_HOME
[tuxedo@centos ~]$ JVMLIBS=$JAVA_HOME/lib/i386/server:$JAVA_HOME/jre/bin
[tuxedo@centos ~]$ PATH=$TUXDIR/bin:$JAVA_HOME/bin:$PATH; export PATH
[tuxedo@centos ~]$ COBCPY=:$TUXDIR/cobinclude; export COBCPY
[tuxedo@centos ~]$ COBOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI -C OSEXT=cbl"; export COBOPT
[tuxedo@centos ~]$ SHLIB_PATH=$TUXDIR/lib:$JVMLIBS:$SHLIB_PATH; export SHLIB_PATH
[tuxedo@centos ~]$ LIBPATH=$TUXDIR/lib:$JVMLIBS:$LIBPATH; export LIBPATH
[tuxedo@centos ~]$ LD_LIBRARY_PATH=$TUXDIR/lib:$JVMLIBS:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
[tuxedo@centos ~]$ WEBJAVADIR=$TUXDIR/udataobj/webgui/java; export WEBJAVADIR
サンプルアプリをコピーしてアプリ用の環境変数を設定する。
[tuxedo@centos ~]$ mkdir atmi
[tuxedo@centos ~]$ cd atmi
[tuxedo@centos atmi]$ cp $TUXDIR/samples/atmi/simpapp/* .
[tuxedo@centos atmi]$ APPDIR=/home/tuxedo/atmi
[tuxedo@centos atmi]$ TUXCONFIG=$APPDIR/tuxconfig
[tuxedo@centos atmi]$ export APPDIR TUXCONFIG
サーバーアプリとクライアントアプリを作成する。警告が出るけどスルーします。たぶんstdlibのインクルードがなさげ。
[tuxedo@centos atmi]$ buildclient -o simpcl -f simpcl.c 
simpcl.c: In function ‘main’:
simpcl.c:34: 警告: incompatible implicit declaration of built-in function ‘exit’
simpcl.c:40: 警告: incompatible implicit declaration of built-in function ‘exit’
simpcl.c:43: 警告: incompatible implicit declaration of built-in function ‘strlen’
simpcl.c:50: 警告: incompatible implicit declaration of built-in function ‘exit’
simpcl.c:57: 警告: incompatible implicit declaration of built-in function ‘exit’
simpcl.c:60: 警告: incompatible implicit declaration of built-in function ‘strcpy’
simpcl.c:71: 警告: incompatible implicit declaration of built-in function ‘exit’
[tuxedo@centos atmi]$ buildserver -o simpserv -f simpserv.c -s TOUPPER
$APPDIR/ubbsimpleを編集する。マシン名のところ(centosの部分)は'uname -n'の実行結果を設定すること。
[tuxedo@centos atmi]$ vi ubbsimple 
#       (c) 2003 BEA Systems, Inc. All Rights Reserved.
#ident  "@(#) samples/atmi/simpapp/ubbsimple    $Revision: 1.7 $"

#Skeleton UBBCONFIG file for the TUXEDO Simple Application.
#Replace the  items with the appropriate values.

*RESOURCES
IPCKEY          123456

#Example:
#IPCKEY         123456

DOMAINID        simpapp
MASTER          simple
MAXACCESSERS    10
MAXSERVERS      5
MAXSERVICES     10
MODEL           SHM
LDBAL           N

*MACHINES
DEFAULT:
                APPDIR="/home/tuxedo/atmi"
                TUXCONFIG="/home/tuxedo/atmi/tuxconfig"
                TUXDIR="/home/tuxedo/tuxedo11gR1"
#Example:
#               APPDIR="/home/me/simpapp"
#               TUXCONFIG="/home/me/simpapp/tuxconfig"
#               TUXDIR="/usr/tuxedo"

centos          LMID=simple

#Example:
#beatux         LMID=simple

*GROUPS
GROUP1
        LMID=simple     GRPNO=1 OPENINFO=NONE

*SERVERS
DEFAULT:
                CLOPT="-A"

simpserv        SRVGRP=GROUP1 SRVID=1

*SERVICES
TOUPPER

設定ファイルをバイナリ変換してサーバーを起動する。
[tuxedo@centos atmi]$ tmloadcf -y ubbsimple 
[tuxedo@centos atmi]$ tmboot -y
Booting all admin and server processes in /home/tuxedo/atmi/tuxconfig
INFO: Oracle Tuxedo, Version 11.1.1.2.0, 32-bit, Patch Level (none)

Booting admin processes ...

exec BBL -A :
        process id=13381 ... Started.

Booting server processes ...

exec simpserv -A :
        process id=13384 ... Started.
2 processes started.
クライアントアプリを起動して動作確認する。
[tuxedo@centos atmi]$ ./simpcl "hello world"
Returned string is: HELLO WORLD
[tuxedo@centos atmi]$ 
サーバーを停止する。
[tuxedo@centos atmi]$ tmshutdown -y
Shutting down all admin and server processes in /home/tuxedo/atmi/tuxconfig

Shutting down server processes ...

        Server Id = 1 Group Id = GROUP1 Machine = simple:       shutdown succeeded

Shutting down admin processes ...

        Server Id = 0 Group Id = simple Machine = simple:       shutdown succeeded
2 processes stopped.
[tuxedo@centos atmi]$ 

2012年7月6日金曜日

Oracle Tuxedoをアンインストール

[rossy@centos tuxedo]$ cd tuxedo11gR1/uninstaller/
[rossy@centos uninstaller]$ ./Uninstall_Tuxedo_11.1.1.2.0
Preparing CONSOLE Mode Installation...

===============================================================================
Tuxedo 11.1.1.2.0                 (created with InstallAnywhere by Macrovision)
-------------------------------------------------------------------------------




===============================================================================
Tuxedo 11.1.1.2.0のアンインストール
--------------------------

アンインストールしようとしています...



Tuxedo 11.1.1.2.0



ここでは、InstallAnywhereによってインストールされた機能が削除されます。インストール後に作成されたファイルおよびフォルダは削除されません。

続行するには  キーを押します。: 



===============================================================================
アンインストールのオプション
--------------

ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS  TO ACCEPT THE DEFAULT:

  ->1- すべての機能とコンポーネントをすべて削除します。
    2- InstallAnywhereによってインストールされた特定の機能を選択してください。

次のいずれかのオプションを選択してください: 1



===============================================================================
アンインストール中...
------------


...*
*
*************************
*************************
*************************
************************
...*
*
*************************
*************************
*************************
************************
...*
*
*************************
*************************
*************************
************************
...*
*
*************************
*************************
*************************
*************************



===============================================================================
アンインストールの完了
-----------

すべての項目が正常にアンインストールされました。

[rossy@centos uninstaller]$

CentOS 5.xにOracle Tuxedoをインストール

Oracle Tuxedo ダウンロードからtuxedo111120_32_Linux_01_x86.binをダウンロードする。で、UNIXシステム上でのOracle Tuxedoのコンソール・モード・インストールを見ればインストールできる。

[rossy@centos ~]$ su
パスワード:
[root@centos rossy]$ sh tuxedo111120_32_Linux_01_x86.bin -i console
Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...

Launching installer...

Preparing CONSOLE Mode Installation...

===============================================================================
Choose Locale...
----------------

    1- English
  ->2- 日本語

CHOOSE LOCALE BY NUMBER: 2
===============================================================================
Tuxedo 11.1.1.2.0                 (created with InstallAnywhere by Macrovision)
-------------------------------------------------------------------------------




===============================================================================
概要
--

InstallAnywhereの指示に従うとTuxedo 11.1.1.2.0をインストールできます。



このインストールを続行する前に、すべてのプログラムを終了することを強くお薦めします。

次の画面に進むには、"next'と入力します。前の画面の内容を変更する場合は、"back"と入力します。

"quit"と入力すると、このインストールをいつでも取り消せます。



WARNING: "終了"すると、Tuxedo 11.1.1.2.0のインストールが不完全になります。この場合Tuxedo 
11.1.1.2.0を再インストールする必要があります。詳細は、Tuxedo 11.1.1.2.0のインストール・ガイドで「Oracle 
Tuxedoシステムのインストール前の作業」を参照してください。





続行するには  キーを押します。: 



===============================================================================
インストール・セットの選択
-------------

このインストーラでインストールするインストール セットを選択してください。

  ->1- 完全インストール
    2- サーバーのインストール
    3- 完全クライアント・インストール
    4- Joltクライアントのインストール
    5- ATMIクライアントのインストール
    6- CORBAクライアントのインストール

    7- カスタマイズ...

インストール セットの番号を入力するか、デフォルトを使用する場合は  キーを押してください。
      : 2



===============================================================================
Oracleホームの選択
------------


    1- 新しいOracleホームを作成します

数字を入力してください: 1
新しいOracleホーム・ディレクトリを指定してください: /home/tuxedo



===============================================================================
製品ディレクトリの選択
-----------


    1- 現在の選択を変更します(/home/tuxedo/tuxedo11gR1)
    2- 現在の選択を使用します(/home/tuxedo/tuxedo11gR1)

数字を入力してください: 2
サンプルのインストール (Y/N): Y



===============================================================================
インストール前の概要
----------

続行する前に次の内容を確認してください:

製品名:
    Tuxedo 11.1.1.2.0

インストール フォルダ:
    /home/tuxedo/tuxedo11gR1

リンク フォルダ:
    /root

ディスク容量情報 (インストール先): 
    必要なディスク容量:  209,943,511 バイト
    使用可能なディスク容量: 69,824,200,704 バイト

続行するには  キーを押します。: 


===============================================================================
インストールの準備
---------

InstallAnywhereはシステムの次の場所にTuxedo 11.1.1.2.0をインストールする準備が整いました:



   /home/tuxedo/tuxedo11gR1

インストールするには  キーを押してください。: 



===============================================================================
インストール中...
----------

 [==================|==================|==================|==================]
 [------------------|------------------|------------------|------------------]



===============================================================================
tlistenサービスの構成
--------------

パスワード:          
パスワードの確認:          
パスワードが受理されました。お待ちください...



===============================================================================
SSLインストールの選択。
-------------

SSLをサポートをインストールしますか。

  ->1- はい
    2- いいえ

選択する項目の番号を入力するか、デフォルトを使用する場合は <ENTER> キーを押してください。: 2




===============================================================================
インストール完了
--------

おめでとうございます。Tuxedo 11.1.1.2.0は次の場所に正常にインストールされました:



   /home/tuxedo/tuxedo11gR1

 キーを押すと、インストーラが終了します。: 
あとユーザを追加しておく
[root@centos ~]# groupadd tuxedo
[root@centos ~]# useradd -g tuxedo -m tuxedo
[root@centos ~]# chown -R tuxedo:tuxedo /home/tuxedo

途中でOracleホームの場所を聞かれるが、今回はOracleデータベースは入れてないので適当に/home/tuxedoにした。これでもサンプルは動作するので問題なさそう。

ここからが問題で、そっからの文書がとにかく読みにくい。

とにかくどこに何が書いてあるか分からないので自分用リンク。

2012年7月4日水曜日

VB.NETで非アクティブなウィンドウをスムーズに移動できた

VB.NETで非アクティブなウィンドウをスムーズに移動したいのコードを下記に変更した。これなら再フォーカスの問題は発生しない。
Public Class Form1

    :

    Private Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure

    Private Const WM_MOVING As Integer = &H216

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_MOVING
                Dim rect As RECT = Marshal.PtrToStructure(m.LParam, GetType(RECT))
                SetWindowPos(Me.Handle, HWND_TOPMOST, rect.Left, rect.Top, 0, 0, _
                             SWP_SHOWWINDOW Or SWP_NOSIZE)
            Case Else
        End Select
        MyBase.WndProc(m)
    End Sub


2012年7月3日火曜日

VB.NETで非アクティブなウィンドウをスムーズに移動したい

VB.NETで非アクティブで常に手前に表示したいで作ったウィンドウを非アクティブな状態で移動すると、移動が終わってからしか描画されないっぽい。アクティブじゃないから?とりあえず移動時だけアクティブにしてあげてみる。
Public Class Form1

    :

    Declare Function GetForegroundWindow Lib "user32" () As IntPtr
    Declare Function SetForegroundWindow Lib "user32" (hWnd As IntPtr) As Boolean

    Private Const WM_NCLBUTTONDOWN As Integer = &HA1
    Private Const WM_NCLBUTTONUP As Integer = &HA0

    Private m_hForegroundWnd As IntPtr = IntPtr.Zero

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_NCLBUTTONDOWN
                If m_hForegroundWnd = IntPtr.Zero Then
                    m_hForegroundWnd = GetForegroundWindow
                    SetForegroundWindow(Me.Handle)
                End If
            Case WM_NCLBUTTONUP
                If m_hForegroundWnd <> IntPtr.Zero Then
                    SetForegroundWindow(m_hForegroundWnd)
                    m_hForegroundWnd = IntPtr.Zero
                End If
        End Select
        MyBase.WndProc(m)
    End Sub


けどこれだと、前面にいたウィンドウが再フォーカスされることになるからどうかなぁ。例えばIE9のURL部分は一度フォーカス外して再フォーカスすると全選択になるし。