変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

インターネット

[CentOS8]AlmaLinuxへ移行

移行スクリプトがあったので

# curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh
# bash ./almalinux-deploy.sh

ダウンロードするパッケージは1.5Gbytesくらいあるらしい。

しかし、インストール時にエラってしまったので、

epelとremiリポジトリィを無効化し、ついでに最新状態にしておいた。

# dnf config-manager --disable epel epel-modular remi-modular remi-safe
#dnf update

再度、移行スクリプトを実行するとうまくいったようだ。

# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

このまま再起動すると、sshもscpもhttpdも繋がらない・・・と思ったけど、サービスの起動にとても時間がかかっていただけだった。

x-windowとか諸々入っている。xrdpサービスを起動すればリモートデスクトップでも繋がる。

けど、J1900,4GBだから遅いなぁ



[Oracle19c]プラガブル・データベースを・・・

サーバ起動後は

まずは、リスナーを起動

$ lsnrctl start
・・・
STATUS of the LISTENER
------------------------
・・・
Listener Parameter File   /usr/oracle/database/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/******/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=******)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

次にCDBを起動

$ sqplus /NOLOG
SQL> startup;
*******

プラガブル・データベースの状態をチェック

SQL> show pdbs;
    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 ******  			  READ WRITE NO

とりあえず接続先をチェック。※多分 CDB$ROOTのハズ

SQL> show CON_NAME;

プラガブル・データベースを起動してみよう

SQL> alter pluggable database ****** open;
Pluggable database altered.

SQL> show pdbs;
    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 ******  			  READ WRITE NO

CDB作成時に作られたPDBは管理者名が不明で表領域もあるのかどうかも判らなかったので、

dbcaコマンドで別途にPDB(PDB1,PDB2)を追加してみた。

PDBの管理者名はpdbadminとか何となく判るものを作っておく。

表領域の作成にチェックを入れれば作ってくれるので便利。※手順は省略。

ここで、lsnrctl status を何度か叩くと、最後に各PDB名っぽいSERVICE_NAMEの情報が拾えるので

※今回はCDBのサービス名のドメイン名のマシン名の部分がPDB名に差し替えられていた。

そこからサーバのtnsnames.oraにPDB用の設定を手で追加。

※サーバで使わないハズだけど、サーバに元ネタとして置いておかないと新しいクライアントを作る時に悩むハズ。

PDB1 =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ******)(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = pdb1.******)
     )
  )

PDB2 =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = ******)(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = pdb2.******)
     )
  )

本命のクライアントのtnsnames.oraを追記

PDB1 =
(DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP) (HOST = ******)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = pdb1.******)
   )
)

PDB2 =
(DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP) (HOST = ******)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = pdb2.******)
   )
)

どっちもほぼ同じで、HOSTのみ、各環境で判るドメイン名とかIPアドレスとかにしておかないといけない。※IPアドレスにすれば同一になるはず。

dbcaコマンドでは各PDBの管理者にDBA権限が付与されていないので、

$ sqlplus / as sysdba
SQL> alter session set container=${各PDB名}; ※だったかな?
SQL> GRANT DBA TO ${各PDBの管理者名};

で、それぞれのPDBの管理者にDBA権限を付加した後に

それぞれのPDBの管理者でPDBに入り

$ sqlplus ${管理者名}/${パスワード}@${PDB名}
SQL> CREATE TABLE TBL1 か TBL2
 (
 empno VARCHAR2(10) NOT NULL,
 empname VARCHAR2(50),
 gender_f NUMBER(1,0)
 ) 
;  2    3    4    5    6    7  
Table created.

な感じで、PDB1にTBL1、PDB2にTBL2を作成し、

A5から、

CDB:(接続文字列:orcl、 ユーザ:system)、

PDB1:(接続文字列:pdb1、ユーザ: pdbadmin)

PDB2:(接続文字列:pdb1、ユーザ: pdbadmin)

でORACLE(OCL経由)接続を作った。

※ORACLE直接接続は

各赤枠はクライアントのtnsnames.oraの通り

それぞれで、

select * from TBL1;
select * from TBL2;

してみたら、

CDBは共に無し

PDB1はTBL1のみ

PDB2はTBL2のみ

と予想通りの結果になった。

改めて、sqlplusでpdb1に接続してみよう

SQL> alter session set container=PDB1;
SQL> show pdbs;

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 4 PDB1 			  READ WRITE NO
※もう自分しかみえなくなっている
※CDBに戻ってPDBをこの状態で、自動起動にする
SQL> alter session set container=CDB$ROOT;
SQL> alter pluggable database all save state;

プラガブル・データベースを終了してみよう

SQL> alter pluggable database ****** close;
Pluggable database altered.

SQL> show pdbs;
    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 ****** 			  MOUNTED

CDBも終了、SQLPLUSも終了する

SQL> shutdown;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit

これで、startupすれば、今まで通りに使えるはず。

※多分

と、ここまで書いたものの・・・

ネットをググると、多種多様な結果がヒットするので、

  • ひたすらSQLPLUSでコマンドを打ち続ける人
  • ツールを使いつつSQLPLUSでコマンドを打ち続ける人
  • ツールのみの人

それぞれで、

各々データベースの構成も違うし、

設定ファイルの更新の有無も変わるし、

手順やコマンドも変わるし、

ここの内容は極一部の人にしか参考にならない様な気がしてきた。

うーむ、恐るべしは・・・・・・。



[Oracle19c]どうやって起動 するん?

まず、SQLPLUSからCONNECTしようとしたら

ORA-12162: TNS:net service name is incorrectly specified

原因は、ORACLE_SIDを環境変数に登録していなかったせいらしい。

~/.bash_profileに追加して

$ source ~/.bash_prodile
$ sqlplus /NOLOG
SQL> connect AS SYSDBA
Enter user-name: sys
Enter password: ****************
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 2432695832 bytes
Fixed Size		    9137688 bytes
Variable Size		  570425344 bytes
Database Buffers	 1845493760 bytes
Redo Buffers		    7639040 bytes
Database mounted.
Database opened.
SQL> 

終わる時は、shutdown、quit。

さて、A5から直接接続できるか試してみたけど

ORA-12514: TNS:listener does not currently know of service requestion in connect description

から先に進めなかったので、

順当にOracleClientをインストし、

ORACLEデータベースをインストしたLINUXにあるtnsnames.oraから下記をコピペして、

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ***)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ****)
    )
  )
HOST = ***はPCからデータベースをインストしたサーバの名前かIPアドレス
SERVICE_NAME=****はそのまま使う。

PCの適当なフォルダにtnsnames.oraファイルを保存し、

保存先フォルダ名はユーザ環境変数「TNS_ADMIN」に保持。※システム環境変数の方がいいはず

ODBCデータソースアドミニストレイーターで、データソースを新規追加する。

ORACLEクライアントを選択して

TNSサービス名にSID(ここではtnsnames.oraでORCLだから)を入れ、「接続テスト」
ユーザー名とパスワードを入れて
で、良かったらしい。

さて、A5では

な感じで「テスト接続」は、

だったので、【OK】して保存。

こんな調子で大丈夫なのか?と自分でもツッコミをいれたくなったけど

管理ツールタグを見れば

なので大丈夫らしい。

あとはPDBにテーブルを作って、アクセスできればOKかな?



[Linux]xrdpインスト

1.CentOS7の場合

epelを追加

# yum -y install epel-release
## yumコマンドに --enablerepo=epel オプションを指定した場合のみ epel が有効になる様に
# vi /etc/yum.repos.d/epel.repo
enable = 1 ⇒ 0 に修正。

パッケージをインスト

# yum -y --enablerepo=epel install xrdp
# yum -y --enablerepo=epel install tigervnc-server
## エラーが起きやすい設定を修正
# vi /etc/xrdp/xrdp.ini
max_bpp=32 ⇒ 24 に修正
# systemctl start xrdp
# systemctl enable xrdp

ファイアウォールの設定変更

# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload

オマケで

yum update

2.CentOS8の場合

epelを追加

# dnf -y install epel-release
## dnfコマンドに --enablerepo=epel オプションを指定した場合のみ epel が有効になる様に
# vi /etc/yum.repos.d/epel.repo
enable = 1 ⇒ 0 に修正。

パッケージをインスト

# dnf -y --enablerepo=epel install xrdp
# dnf -y --enablerepo=epel install tigervnc-server
## エラーが起きやすい設定を修正
# vi /etc/xrdp/xrdp.ini
max_bpp=32 ⇒ 24 に修正
# systemctl start xrdp
# systemctl enable xrdp

ファイアウォールの設定変更

# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload

オマケで

# dnf update


[ActiveX]ブラウザでActiveXを使いたい

EdgeのIEモードもいつまであるのか判らないので・・・

C#のEXEでRESTサービスサーバを作り、ブラウサからデータベースにSQLでアクセスできる様な仕組みをポチポチと作ってみる。勿論、ポート開放なんてしない。

しかし思っていた以上に面倒なことが判明した。

public static object? CreateObject(string progId)
{
Type? t = Type.GetTypeFromProgID(progId);
return t == null ? null : Activator.CreateInstance(t);
}
object? activeXObject = CreateObject("ADODB.Connection");

それっぽいオブジェクトは出来るが、activeXObject変数のクラス名が”System.__ComObject”で、希望するメソッドやプロパティの情報は取得できず、ウォッチビューで中身を見ると[動的ビュー]の中にそれっぽいプロパティが見えるがアクセスする方法は判らなかった。

但し、その変数をそのActiveXObjectのクラスに置き換えると、Accessファイルも開けてしまうのでとりあえず、キャストしてコードを書けば良いらしい。

object? activeXObject
ADODB.Connection? cn = activeXObject;
cn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:C:\\Users\・・・\Database1.accd\"");

事前にメソッドの名前さえ判っているなら、動的にメソッドを呼ぶ方法が使える。(カモ

参照:https://dobon.net/vb/dotnet/programing/typeinvokemember.html

string progId="ADODB.Connection";
activeXObject = ActiveX.CreateObject(progId);
// TEST
if (activeXObject != null)
{
    Type t = activeXObject.GetType();
    t.InvokeMember("Open",
        BindingFlags.InvokeMethod,
        null,
        activeXObject,
        new object[] { "Provider=Microsoft.ACE.OLEDB・・・\Database1.accdb\"" });
}
実行すると例外発生
Exception ex:
{"Exception has been thrown by the target of an invocation."}

ん?クラス名がダメなのかな?正しいTypeを取得する方法は予想の斜め上にあった

参照:https://docs.microsoft.com/ja-jp/dotnet/api/system.type.gettype?view=net-6.0#system-type-gettype(system-string)

string progId="ADODB.Connection";
activeXObject = ActiveX.CreateObject(progId);
// TEST
if (activeXObject != null)
{
    Type t = Type.GetType(progId);
    t.InvokeMember("Open",
        BindingFlags.InvokeMethod,
        null,
        activeXObject,
        new object[] { "Provider=Microsoft.ACE.OLEDB・・・\Database1.accdb\"" });
}

これで、メソッドを呼び出すことができたので、キャストだらけのコードも改良の余地がありそうだ。

何でも(メソッド)勘でも(プロパティ)非同期通信で処理すると重そうので、newの後に一式プロパティを送信し、メソッドの実行後に置き換わりそうなプロパティを戻り値を[activeXObject]と[returnValue]に纏めて送信することにする。メソッドを実行するオブジェクトは、ハッシュ管理し、ブラウザからはハッシュを指定して実行する様にした。

※というか

IEの場合、
var table_name = schema.Fields("TABLE_NAME").Value

IE以外の場合、※(…)を[…]に書き換えるしかない様だ。
var table_name = schema.Fields["TABLE_NAME"].Value

な呼び出しをする場合が多い、ここにawait 入れると解読不能になるとしか思えなかった。(ので

※ハッシュ値は諸事象から $”{クラス名}_{ハッシュ値:x}” にした。

javascriptのnewはasyncが指定できないので、newの直後にJavaScript側でプロパティやメソッドの入り口を用意しておく。メソッド実行時にまだハッシュを受信していない場合は、ハッシュ受信時にonobjectIDを処理し、再度メソッド実行を送信するようにする。

※ブラウザ側で不要になったと判断したActiveXObjectオブジェクトは、ActiveXObject.term()を呼び出して、DELETEメソッドでオブジェクトの消去をするように。(できたらいいなぁ

if (this.objectID == null) {
    this.onobjectID = async function () {
        let rc = await this[methodName].apply(this, args);
        resolve(rc);
        return;
     }
} else {
     let path = `ActiveXObject/${this.objectID}/${collectionName}/${methodName}`;
     return new Promise(async (resolve, reject) => {
     let json = await ActiveXObject.staticSendMessage('PUT', this.domain, this.port, path, args);
obj.objectID = json["objectID"];
if (typeof (obj.onobjectID) !== 'undefined')
{
    obj.onobjectID();
}

JavaScript側でActiveXオブジェクトのインスタンスを配列で管理すると使用済みでも残ってしまうので、

インスタンスの管理はC#側のみで行う。

非同期通信の処理待ちをするため await を差し込まないといけないのは面倒だが仕方が無い。

await指定で呼び出す関数の方はasync指定して最後にresolveを渡す様にする。

何気に途中でreturn ; してるケースも同様。

※resolve(true)で処理が途切れるかと思い、手抜きしたら、ダブルresolve(true)してしまい動作が変になったので、直後にreturn を入れておく。

async function xxxxxx () {
・・・・・最後に
Promise.resolve(true);
return;
}

C#側から返す値はJSON形式にしたけど、javascript側からオブジェクトを渡すパラメータはtoStringで済ませているのでちゃんとしないとまずいなぁ。(そのうち何とかしよう

とか、簡単にしようとするとハマるパターンだ。

ちゃんと同期が取れていると

所感)

ブラウザとVisualStudioの両方でブレークポイントを指定して順に動かしていくと、ブラウザとVisualStudioが交互にポップアップして切り替わるのが面白かった。一度お試しあれ。



[Oracle19c]Linux版

AlmaLinux9やOracleLinux9のように新しいOSでは

アレが無い、コレが無いと、dnfがお得意の関連パッケージの自動インストール機能がうまく機能していない。

しかし、古いCentOS7なら、あまり面倒なことをせずに19Cのインストーラの初期画面まで進んだ。

※但し

  • 前提条件のチェックを全てクリアするために、
  • CPU4個、メモリ16GB、スワップ領域16GBに増量。
    • パッケージのアップデート時にX-Windowの画面が固まり操作不能になるので、CPU+3個
    • インスト時にスワップ領域不足の警告が出るのでスワップ領域を増量。
      • 8GBではstartup時にシェアメモリ不足(ORA-27104)が発生。更に増量(16GB)
    • インスト時にシェアメモリ不足の警告が出るのでメモリ増量してカーネルパラメータを再計算
  • リスナー作成直後に再起動するとリスナが起動してないので
    • /etc/hostsにノード名が無かったので追記し、lsnrctl startする。
  • アドバンスモードではOracle Enterprise Manager のポートに何を指定してもダメだったので、チェックを外した。

参考1:CentOS7 Stream Oracle Database 19c : インストール では日本語でインストーラが動いた。

CentOS8は OSのサポートが2021年12月末で終了し、https://ftp.riken.jp/Linux/centos/8.5.2111/isos/x86_64/ のリンクも無くなったので、

CentOS8 Streamを使う事になる。

CentOS Stream 8 へ https://ftp.riken.jp/Linux/centos/8-stream/isos/x86_64/

参考2-1:Oracle Dtabase 19c(CentOS8) は、最終的には「なぜかうまくいかない」。

※参考2-1は、メモリ8GBで試行している。

以下、変更点

1.カーネルパラメータの設定方法

元々は固定値で設定していたが、割り当てたメモリ量から計算する様に修正。

# MEMTOTAL=$(free -b | sed -n '2p' | awk '{print $2}')
# SHMMAX=$(expr $MEMTOTAL / 2)
# SHMMNI=4096
# PAGESIZE=$(getconf PAGE_SIZE)
# cat > /etc/sysctl.d/50-oracle.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmax = $SHMMAX
kernel.shmall = $(expr \( $SHMMAX / $PAGESIZE \) \* \( $SHMMNI / 16 \))
kernel.shmmni = $SHMMNI
kernel.sem = 250 32000 100 128
kernel.panic_on_oops = 1
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF

2.インストールするパッケージの追加

インストーラを起動するとエラーが出たので、それっぽいパッケージを追加。

# dnf -y install libnsl

ダウンロードしたrpmをインストールする手順が抜けていたので追加

# dnf localinstall  *.rpm       ※個別にrpmファイルをしてして実行したけど、多分これでいいはず

差し替えるJDKのパスを

# cp -r /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-11.el8.x86_64/jre /u01/app/oracle/product/19.3.0/dbhome_1/jdk/jre

hostsに自分のマシン名が無いので

127.0.0.1   ******.******.****** localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         ******.******.****** localhost localhost.localdomain localhost6 localhost6.localdomain6

ここまでやっても、

「インストール」ボタンを押して7%まで進んだあたりで

「ファイル%filename%が見つかりません」

と出るエラーが出る、「継続」押下で続けるが・・・

100%まで進んるのになぁ
OpenJDKに差し替えて動いたけど、どこかで互換性が無くて失敗したっぽい。
DBCAの構成で失敗してるので、日本語対応のJREに差し替えたせいかもしれない。

※メモリ16GBでの動作は未確認。

参考2ー2:CentOS8 Stream Oracle Database 19c : インストール のページはインスト直前まで。

login: oracle
Password:xxxxxxx

$ vi ~/.bash_profile
# 最終行に追記
umask 022
export ORACLE_BASE=/u01/app/oracle

# インストール用 Dir 作成
$ mkdir database

LANG=Cを付けてインストーラを起動すると真っ白になる。とりあえず、保留。

参考2ー3:CentOS8 Oracle Database 19c : インストール すると日本語文字化けするので

cd database
$ unzip LINUX.X64_193000_db_home.zip
$ export CV_ASSUME_DISTID=RHEL8.2
$ export LANG=C
$ ./runInstaller

CentOS8系では、インストーラのJREの日本語フォントとX-Windowの日本語フォントがうまくマッピングされず日本語モードでは文字化けするが、英語モードでのインストールなら問題無し。

しかし、メモリ8GBで得たシェアメモリの容量ではstartupでシェアメモリの容量不足となり16GBに増量し、カーネルパラメータを再計算したところ、startupに成功した。

CentOS8 stream でメモリ8GBでも使えるカーネルパラメータの計算方法があればいいんだけど。

そんな訳で、CentOS8系は微妙。

参照2-3に参照2-1のJRE差し替えを混ぜるといいのかもしれない。

Hyper-Vの起動画面よりもXRDPでWindowsのリモートデスクトップ越しにインストーラを起動した方がマウスカーソルもオーバーラップするしコピペもできインストールもスムーズ。

・・・

と書いたものの、実際やってみると手順通りにヌルっとインストールできず、ドコかでアハってしまう。

rootでシェル起動してもいい?ってメッセージをちょっと放置したら画面が固まるけど、それはOSアップデートが後追いでやってきたせいな気もする。

yumやdnfのアップデートでおきる僅かな修正で何かがうまくいっていないんだろう。

インストーラのチューニングが攻めすぎなんだろうね。

Linux「9」なんて無理そうだから、ここで調査を終了。

とりあえず、CentOS7がアンパイだ。



[CentOS]どうしよう

開発もサポートも切れるので乗り換えないといけない。

とりあえず、AlmaLinux 9.x に乗り換える予定。

GUIをインストするには

# dnf grouplist

でグループパッケージを探してみるが、GNOME Desktopは無かったので

# dnf groupinstall "SERVER with GUI"

で我慢する。

XRDPをインストしようとしたらパッケージが無いとか散々。

ぐぐってみるとちゃんとAlmaLinux9でのインストページがあった。

epelリポジトリィを追加するのを忘れていたせいか。

無事、リモートデスクトップに繋がったものの、コレジャナイ感が漂う。



[ActiveX]JavascriptのActiveXの代案 ※検討中

Windows11でIEが消えていたので、IE用のJavaScriptでActiveXを使ってブラウザでMDBの中身を見るツールが使えない。

そこで、C#でローカルWEB(+REST)サーバEXEを作り、ActiveXをEXEで処理してブラウザは非同期通信でリモートでコントロールさせてみたい。

IE用のindex.htmlとJSファイルはEXEのwwwrootフォルダに入れておき

C#のMainから8000ポートを開き、GETコマンドリクエストがあれば、exeファイルのトコのwwwrootフォルダのファイルを返す様にしておく。

参考文献:簡易Webサーバを実装するには?[2.0のみ、C#、VB]

using System;
using System.IO;
using System.Net;

namespace LocalWebServer
{
class WebFileServer
{
  static void Main()
  {
    string root = @"wwwroot\"; // ドキュメント・ルートは好きな場所でOK
    string prefix = "http://localhost:8000/"; // URLはしっかり書かないとエラる
    // ブラウザでindex.htmlを開く。ココからjsファイルもGETされるハズ
    System.Diagnostics.Process.Start(prefix + "index.html");
  //
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(prefix); // プレフィックスの登録
    listener.Start();
    while (true) {
      HttpListenerContext context = listener.GetContext();
      HttpListenerRequest req = context.Request;
      HttpListenerResponse res = context.Response;
      Console.WriteLine(req.RawUrl);
      // リクエストされたURLからファイルのパスを求める
      string path = root + req.RawUrl.Replace("/", "\\");
      // ファイルがあれば出力
      if (File.Exists(path)) {
        byte[] content = File.ReadAllBytes(path);
        res.OutputStream.Write(content, 0, content.Length);
      } else {
         // TODO エラー処理 404 あるいはREST処理をしないといけないかもしれない
      }
      res.Close();
    }
  }
}
}

とRESTのWEBサービスっぽく

HTMLファイルは、

<script src="./ActiveX.js">
・・・
<script src="./${他のjsファイル}">

と付け加え、JavaScript上のActiveX(“xxxxx”)の実装を差替える。

ActiveX(objectID) => {
  let promise = new Promise( (resolve, reject) => {
    let domain = "localhost";
    let port = 8000;
    let xhr = new XMLHttpRequest();
    xhr.open('GET', `http://${domain}:${port}/ActiveX/`, true);
    xhr.responseType = 'json';
    xhr.send(null);
    xhr.onload = function(e) {
      if (xhr.readyState == 4) {
        if (xhr.status == 200 ) {
          resolve(JSON.parse(xhr.response));
        }
      }
    };
  });
  return promise;
};

ActiveXの予備元やそのメソッドの呼び出しは全てawaitを追記

async function  xxxx(...)
{
  let obj = await ActiveX("xxxxx");
}

プロパティ呼び出しはC#側でデータを展開しておいた方が良さそう

しかし、メソッドもプロパティもいっぱいあるので

class  ADODB_xxxxxx
    constractor()
    {
        this.className = "ADODB.xxxxxx";
        dummy_properties();
        dummy_methods();
    }
    dummy_properties()
    {
      let properties = ['BOF','EOF',....,'fields'];
      properties.foreach( (p) => {
          this[p] = new Function (`
            set ${p}(v) {
               alert('set ${p} no support.');
            }
            get ${p}() {
               alert('get ${p} no support.');
            }
          `);
      });
    }
    dummy_methods()
    {
      let methods = ['BOF','EOF',....,'fields'];
      methods.foreach( (m) => {
          this[m] = new Function (`
               alert('set ${m} no support.');            
          `);
      });
    }

で、TODO風に作っておいて、後で実装を考えた方が良さそう。

あるいは、各ActiveX用のクラスJSファイルは、ワーカースレッドよろしく

var adodbWorkers = [];
・・・
adodbWorkers["ADODB.xxxxxx"] = new Worker('ADODB.xxxxxx.js');

とやって

adodbWorkers["ADODB.xxxxxx"].postMessage(${メソッド名},${パラメータ1},...,${パラメータn});

onmessage = function(e) {
 switch(e)
 {
   case "BOF":
    どうしよう
     break;
    ・・・
 }
}

adodbWorkers["ADODB.xxxxxx"].onmessage = function(e) {
  何とかかんとか  
 resolve(e,data)とか
}

して、がら空きの実装で使うとこだけ実装する方式で済ませるのがいいかもしれない。



[Oracle12c]コンテナ・データベース

最近のOracleのデータベースのインスタンスを作成する時に「コンテナ・データベース(CDB)として作成する」ができる様だ。

今までのデータベース(区別するためにプラガブル・データベース(PDB)と名前が付いている)を複数個格納できるコンテナなデータベースらしい。

各データベース(CDB,PDB)の接続方法は

  • 新たなコンテナ・データベース(CDB)はローカル接続のみ。
  • 今までのデータベース(PDB)はリモート接続のみに変わる。

ということで、一般ユーザ(アプリを含む)からは、何も変わらない気がするけどね。

ただ、安易にCDBを作成するとPDBの接頭語を指定してpdb1,pdb2,pdb3とか名前が自動的に割り振られてしまうようなので、リモート接続のインスタンス(あるいはサービス名?)は変更しないといけなさそう。

そんな訳で、コンテナDBの管理者に

  • CDBにローカル接続
  • CDBで共通ユーザを作って、ログ収集用とか最適化用とかIMPORT/EXPORT用とかロールを割当る。
    • 共通ユーザ名は「C##またはc##」の接頭語が必要らしい。
  • ALTER SESSION SET CONTAINER = ${PDBの名前}; でPDBを指定して、
  • 各PDBの管理者や一般ユーザのアカウントの登録とロールを設定する。

をしてもらえば、後は概ね今まで通りで良いんじゃないのかな?

各PDBのテーブル登録は各PDBの管理者がリモートできるから便利になるかもかも

後、データベース・サーバの移行は・・・

移行元サーバのデータベースがCDBなら、

  1. 移行先サーバで空のCDBを作成
  2. SQL Developerの接続先に移行先・元サーバを追加
  3. SQL Developerで移行元サーバの移行したいPDBで
    1. 「状態の変更」
    2. 「プラガブル・データベースの切断」
  4. 移行したいPDBをフォルダ毎、移行先サーバへコピー(これが難物)
  5. SQL Developerで移行先サーバで
  6. CDBで「プラガブル・データベースのプラグイン」
    1. アンプラグした時に生成したXMLファイルをPDB名を指定

となるらしい。

EXPORT/IMPORTの方が手順が短いけど、IMPORTで難解なエラーに悩むかもしれない事を考えると、楽そうではある。

最もDBが巨大なファイル(100GBとか)になっていたら、rsyncするか、DB移行アプリでも作って一週間も動かし続けるとかかもしれないけどね。

参考文献1:ユージ&ギョータの実践データベース講座

参考文献2:rsync専用の秘密鍵を使ってサーバ間でrsyncする



[三国英雄の夜明け]これからどうなるんだろう?

魂玉を7品質にレベルアップするため、全戦力は1600万台に下がってます。

上位キャラ強化 < 下位キャラ弱体化

そんな中、ランク表でナンバー1のキャラが休止に入ったらしい。

ボクより下の方に下がっていたから、探し出すのが大変だった。

どうやら、装備一式や副将を外してる様だ。

とりあえず、ゲームのマップ上は大混戦になっている。

そして今、一番気になるのは!

演武大会で誰にオッズすればいいんだ?

ps.

悩んでいるうちに投票時刻はとっくに過ぎていました。(メデタシメデタシ




top