今日は猫の日

2020年2月22日 日常
にゃー
にゃー
にゃー

今日は猫の日

2019年2月22日 日常
にゃー
にゃー
にゃー

今日は猫の日

2018年2月22日 日常
にゃー
にゃー
にゃー
にゃーにゃーにゃー
にゃーにゃーにゃー
今年のエイプリルフールネタとして所謂ポエムな文書「逆上がり不能心因主因説」を公開しました。

https://kazamai7610.wordpress.com/2015/04/01/%e9%80%86%e4%b8%8a%e3%81%8c%e3%82%8a%e4%b8%8d%e8%83%bd%e5%bf%83%e5%9b%a0%e4%b8%bb%e5%9b%a0%e8%ab%96/

でも逆上がりができない人、できなかった人ってどれくらいいるのだろうか。

今日は猫の日

2015年2月22日 日常
やぁ。今日が何日か知っているかい?

2010年8月1493日

なんだよ。

9月にならないうちに宿題をすまそうぜっ!


続々正しい今日の日付を返す SQL: http://10395.diarynote.jp/201109012023212517/

正しい今日の日付を返す SQL: http://10395.diarynote.jp/201009010059142568/
ニャーニャーニャー

http://10395.diarynote.jp/?day=20130222

さて、IN-MEMORY OLTP を試してみようと思う。

題材は「MAN+WOMAN=CHILD」
http://miko.org/~naruto/Artifact/MASKSQL.html

題材が「IN-MEMORY OLTP」の性能を測るのに適当かどうかは考えていない。

まずは通常のテーブルで試す。
Access 2003 (JET Database Engine)用の SQL だが、
文字列の結合がないのでそのまま SQL Server で動く。

さて、今度は MEMORY OPTIMIZED TABLE でやってみる。

まず、数のリストを持つテーブル「NumListM」を作成する。


CREATE TABLE NumListM(
num integer NOT NULL PRIMARY KEY NONCLUSTERED
HASH WITH (BUCKET_COUNT=10))
WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA );

数値に順序は関係ないので hash index にする。
今回はデータ数が 10固定なので BUCKET_COUNT として 10 を指定している。
実際には 2^n乗になるので 16 となる。
not null 制約は明示的に入れないとエラーになる。
また、PRIMARY KEY の既定は CLUSTERED だが、
MEMORY OPTIMIZED TABLE は Cluster化index はサポートしていないので
明示的に NONCLUSTERED を指定する。


作成した後は値を入れる

INSERT INTO NumListM(num) VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);


すでに元となる SQL文はあるので不要だが、
例をなぞって文字のリストのテーブルを作成する。

CREATE TABLE dbo.CharListM(
c char(1) COLLATE Latin1_General_100_BIN2 NOT NULL
PRIMARY KEY
NONCLUSTERED
HASH WITH ( BUCKET_COUNT = 10))
WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA );

こっちもデータ数は固定なので BUCKET_COUNT として 10 を指定している。
実際には 2^n乗になるので 16 となる。
DB の照合順序が MEMORY OPTIMIZED TABLE でサポートされていないものの場合は
COLLATE文を用いて明示的に照合順序を指定する必要がある。
nchar型 ではなく、char型なのでコードページ1152 の照合順序である必要があり、
また index を付けるので BIN2 の照合順序である必要がある。
http://msdn.microsoft.com/ja-jp/library/dn133182(v=sql.120).aspx

同じく値を入れる

INSERT INTO CharListM(c) VALUES(’A’),(’C’),(’D’),(’H’),(’I’),(’L’),(’M’),(’N’),(’O’),(’W’);


でも、CharListM は使わず、問題を解くクエリを作成し、実行するw。

SELECT
(100 * M.num + 10 * A.num + N.num) AS MAN,
’+’ AS [PLUS],
(10000 * W.num + 1000 * O.num + 100 * M.num + 10 * A.num + N.num) AS WOMAN,
’=’ AS [EQUAL],
(10000 * C.num + 1000 * H.num + 100 * I.num + 10 * L.num + D.num) AS CHILD
FROM
NumListM AS A,
NumListM AS C,
NumListM AS D,
NumListM AS H,
NumListM AS I,
NumListM AS L,
NumListM AS M,
NumListM AS N,
NumListM AS O,
NumListM AS W
WHERE
((100 * M.num + 10 * A.num + N.num)
+ (10000 * W.num + 1000 * O.num + 100 * M.num + 10 * A.num + N.num)
= (10000 * C.num + 1000 * H.num + 100 * I.num + 10 * L.num + D.num))
AND (M.num>=1) AND (W.num >= 1) AND (C.num>=1)
AND (O.num W.num)
AND (M.num W.num)
AND (A.num W.num)
AND (N.num W.num)
AND (C.num W.num)
AND (H.num W.num)
AND (I.num W.num)
AND (L.num W.num)
AND (D.num W.num)
AND (M.num O.num)
AND (A.num O.num)
AND (N.num O.num)
AND (C.num O.num)
AND (H.num O.num)
AND (I.num O.num)
AND (L.num O.num)
AND (D.num O.num)
AND (A.num M.num)
AND (C.num M.num)
AND (H.num M.num)
AND (I.num M.num)
AND (L.num M.num)
AND (D.num M.num)
AND (M.num N.num)
AND (A.num N.num)
AND (C.num N.num)
AND (H.num N.num)
AND (I.num N.num)
AND (L.num N.num)
AND (D.num N.num)
AND (A.num C.num)
AND (A.num H.num)
AND (C.num H.num)
AND (D.num H.num)
AND (A.num I.num)
AND (C.num I.num)
AND (H.num I.num)
AND (D.num I.num)
AND (A.num L.num)
AND (C.num L.num)
AND (H.num L.num)
AND (I.num L.num)
AND (D.num L.num)
AND (A.num D.num)
AND (C.num D.num)


力技のクエリ(テーブル10個を Cross Join) なのでちょっと時間(でも30秒かかっていなかった)がかかるが
Memory Optimized Table 使ったほうが通常のテーブル使う場合より 1.2倍速かった。
(具体的な数値を出したら怒られるよね?)
う~ん、もっと速くなると思っていたのだがなぁ。。。

って上記を最初に試したのは 12/23 だった。

今、ふと思い立ち、
「In-Memory OLTP White Paper」
http://download.microsoft.com/download/5/F/8/5F8D223F-E08B-41CC-8CE5-95B79908A872/SQL_Server_2014_In-Memory_OLTP_TDM_White_Paper.pdf

の「Native Compilation of Tables and Stored Procedures」のところを読んでみた。
(まだこの White Paper 全部読み終わってない)

あたりまえだけど、ストアドプロシージャにしないと Native Compile されないよね~(^^;
と、いうわけでストアドプロシージャ化。


create procedure dbo.SoloveMask
with native_compilation, schemabinding, execute as owner
AS
BEGIN ATOMIC
with (transaction isolation level=snapshot, language=N’us_english’)
SELECT
(100 * M.num + 10 * A.num + N.num) AS MAN,
’+’ AS [PLUS],
(10000 * W.num + 1000 * O.num + 100 * M.num + 10 * A.num + N.num) AS WOMAN,
’=’ AS [EQUAL],
(10000 * C.num + 1000 * H.num + 100 * I.num + 10 * L.num + D.num) AS CHILD
FROM
dbo.NumListM AS A,
dbo.NumListM AS C,
dbo.NumListM AS D,
dbo.NumListM AS H,
dbo.NumListM AS I,
dbo.NumListM AS L,
dbo.NumListM AS M,
dbo.NumListM AS N,
dbo.NumListM AS O,
dbo.NumListM AS W
WHERE
((100 * M.num + 10 * A.num + N.num)
+ (10000 * W.num + 1000 * O.num + 100 * M.num + 10 * A.num + N.num)
= (10000 * C.num + 1000 * H.num + 100 * I.num + 10 * L.num + D.num))
AND (M.num>=1) AND (W.num >= 1) AND (C.num>=1)
AND (O.num W.num)
AND (M.num W.num)
AND (A.num W.num)
AND (N.num W.num)
AND (C.num W.num)
AND (H.num W.num)
AND (I.num W.num)
AND (L.num W.num)
AND (D.num W.num)
AND (M.num O.num)
AND (A.num O.num)
AND (N.num O.num)
AND (C.num O.num)
AND (H.num O.num)
AND (I.num O.num)
AND (L.num O.num)
AND (D.num O.num)
AND (A.num M.num)
AND (C.num M.num)
AND (H.num M.num)
AND (I.num M.num)
AND (L.num M.num)
AND (D.num M.num)
AND (M.num N.num)
AND (A.num N.num)
AND (C.num N.num)
AND (H.num N.num)
AND (I.num N.num)
AND (L.num N.num)
AND (D.num N.num)
AND (A.num C.num)
AND (A.num H.num)
AND (C.num H.num)
AND (D.num H.num)
AND (A.num I.num)
AND (C.num I.num)
AND (H.num I.num)
AND (D.num I.num)
AND (A.num L.num)
AND (C.num L.num)
AND (H.num L.num)
AND (I.num L.num)
AND (D.num L.num)
AND (A.num D.num)
AND (C.num D.num);
END;

schema binding するのに、Table の Schema名を明示しろと怒られたりした。
で、実行。

exec SoloveMask;


・・・(●_●)。
AdHoc で実行したときの 7倍、通常テーブルで実行したときの8倍くらいの速さ。

さすが Native Compile 機能。
これはおもしろかった。

---
2014年1月18日追記
ここから複写すると不等号が全角に成ったりするのでサンプルコードは下記から取得してください。
http://kazamai7610.wordpress.com/2014/01/03/%e3%80%8csql-server-2014-ctp2-%e3%82%92%e8%a9%a6%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b-3%e3%82%b9%e3%83%88%e3%82%a2%e3%83%89%e3%83%97%e3%83%ad%e3%82%b7%e3%83%bc%e3%82%b8%e3%83%a3%e3%81%ae-native-compi/
とりあえず、Windows Server 2012 の Hyper-V で Windows Server 2012 の Virtual Machine を作成した。
CPUは 1つ (増やし忘れた)、メモリは 4GBで。

そこに SQL Server 2014 CTP2 日本語版の ISOイメージからインストール。

特に引っかかることも無く終了。(設定をどうしたか忘れた)

そして SSMS 2014 CTP2 を立ち上げ、接続し、DBを作成する。

目的は In-Memory OLTP機能を試すことなので
「Memory Optimized Table」(メモリ最適化テーブル)対応の DBを作成する。

SSMS のオブジェクトエクスプローラーで「データベース」を右クリックして
「新しいデータベース」を選択する。

こうかなと思う設定をし、スクリプト出力して
「In-Memory OLTP White Paper」
http://download.microsoft.com/download/5/F/8/5F8D223F-E08B-41CC-8CE5-95B79908A872/SQL_Server_2014_In-Memory_OLTP_TDM_White_Paper.pdf

に書かれている SQL と比較したりしながら試行錯誤した結果、
「Memory Optimized Table」に対応させるには次のようにすることが分かった。
1. 通常のDBを作成するのと同様に設定する。
(後に文字列の「照合順序」の設定に注意しなければならないことが判明する。)
2. [ページの選択]で「ファイルグループ」を選択する。
[メモリ最適化データ]のラベルが付いた Grid があるので
そこに[ファイルグループの追加(I)]で
Memory Optimized Table用のファイルグループを追加する。
3. [ページの選択]で「全般」を選択する。
[追加(A)]でデータベースファイルを追加し、
「ファイルの種類」を「FILESTREAMデータ」にして
「ファイルグループ」でメモリ最適化データのファイルグループを選択する。
その他の項目は適正に設定する。

ここで、「Memory Optimized Table」では文字列の照合順序には次のような制限があることに注意する必要がある。
(1) (var)char型の照合順序はコードページ 1252 の照合順序を用いる必要がある。
nvarchar,nchar型はこの制限はない。
(2) (n)(var)char型の列に index を設定する場合は BIN2 照合順序にする必要がある。
http://msdn.microsoft.com/ja-jp/library/dn133182(v=sql.120).aspx

DB既定の照合順序を上記の条件を満たすもの以外にした場合は
「Memory Optimized Table」作成時に照合順序を COLLATE句で指定する必要が出てくる。


さて、DB を作ったので次は実際に動かしてみる。

もともと、SQL Server 2012 R2 になるはずだったのが
SQL Server 2014 になるようになった。
現在はまだ CTP2 (Community Technology Preview 2)である。

で、新機能で興味深いのが In-Memory OLTP「HEKATON」である。

それを試しに触ってみたいと思った。

まず、SQL Server 2014 CTP2 の稼働環境を構築するにあたり、
稼働環境の要件を調べる。

「SQL Server 2014 CTP2」
http://www.microsoft.com/ja-jp/sqlserver/2014/default.aspx
のページから
「SQL Server 2014 データシート」
http://download.microsoft.com/download/9/8/0/980B9E8B-0147-4730-9AD1-964D06A7095A/SQL_Server_2014_Datasheet.pdf
をダウンロードし、その中の
「SQL Server 2014 をインストールするためのハードウェアおよびソフトウェア要件」のリンクを押す!・・・と SQL Server とは関係がないページに飛ばされます。(罠その1)

きっと SQL Server 2014 の稼働環境は MS のトップシークレットに違いない!!(大嘘)

あきらめて、英語の情報をさぐる。
「SQL Server 2014 CTP2」のページの「ja-jp」を「en-us」に変えてみる!
・・・がページが見つからないとのこと。

あきらめてググる。「SQL Server 2014 en-us」で。
すると「SQL Server 2014 CTP2」の英語のページにたどり着く。
http://www.microsoft.com/en-us/sqlserver/sql-server-2014.aspx

「SQL Server 2014 Datasheet」
http://download.microsoft.com/download/D/7/D/D7D64E12-C8E5-4A8C-A104-C945C188FA99/SQL_Server_2014_Datasheet.pdf
をダウンロードし、
「Hardware and Software Requirements for Installing SQL Server 2014」
のリンンくを押す!
・・・と今度は「Hardware and Software Requirements for Installing SQL Server 2012」
http://msdn.microsoft.com/en-us/library/ms143506.aspx
のページに飛ばされる。(罠その2)

やはり、 SQL Server 2014 の稼働環境は MS のトップシークレットに違いない!!(大嘘)

twitter で「SQL Server 2014 の稼働環境は MS のトップシークレット」と呟いたところ、
しばやんさん(http://shiba-yan.hatenablog.jp/about) に
「SQL Server 2014 のインストールに必要なハードウェアおよびソフトウェア」
http://msdn.microsoft.com/ja-jp/library/ms143506(v=sql.120).aspx
のページを教えてもらった。
つまり、MSDN Library で URL の「.aspx」の前に「(v=sql.120)」を入れると SQL Server 2014用の情報が表示されるのである。

先の「罠その2」でも URL の「.aspx」の前に「(v=sql.120)」を入れると
「Hardware and Software Requirements for Installing SQL Server 2014」
http://msdn.microsoft.com/en-us/library/ms143506(v=sql.120).aspx
にたどり着く。

こうして我々は MS のトップシークレットにたどり着いたのであった。(違)

内結合(内部結合 / INNER JOIN )のとき、WHERE条件に書く代わりにときどき ON句に条件を書くことがある。
これはまぁ問題無いはずで意図通りに動作する。

しかしながら、外結合(外部結合 / OUTER JOIN )の場合はどうなるか。
いまいち自信がなかったので試してみた。

試したのは SQL Server 2014 CTP2 で。

まず、テスト用のテーブル作成

CREATE TABLE T1 (F1 int);
CREATE TABLE T2 (G1 int,G2 int);


で、値を突っ込む。


INSERT INTO T1 VALUES(1),(2),(3),(4);
INSERT INTO T2 VALUES(1,1),(1,2),(2,1),(3,2),(5,3);


とりあえず、中身。


SELECT * FROM T1;

F1
-----------
1
2
3
4

SELECT * FROM T2;

G1 G2
----------- -----------
1 1
1 2
2 1
3 2
5 3


まず、ふつーに INNER JOIN と OUTER JOIN


SELECT F1,G1,G2
FROM T1 INNER JOIN T2 ON T1.F1 = T2.G1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 2 1
3 3 2

SELECT F1,G1,G2
FROM T1 LEFT OUTER JOIN T2 ON T1.F1 = T2.G1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 2 1
3 3 2
4 NULL NULL

SELECT F1,G1,G2
FROM T1 RIGHT OUTER JOIN T2 ON T1.F1 = T2.G1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 2 1
3 3 2
NULL 5 3

SELECT F1,G1,G2
FROM T1 FULL OUTER JOIN T2 ON T1.F1 = T2.G1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 2 1
3 3 2
4 NULL NULL
NULL 5 3


さて、まず、LEFT OUTER JOIN で右だけの条件を追加する。

SELECT F1,G1,G2
FROM T1 LEFT OUTER JOIN T2 ON T1.F1 = T2.G1 AND T2.G1 = 1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 NULL NULL
3 NULL NULL
4 NULL NULL


こんどは 左だけの条件を追加する。

SELECT F1,G1,G2
FROM T1 LEFT OUTER JOIN T2 ON T1.F1 = T2.G1 AND T1.F1 = 1;

F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
2 NULL NULL
3 NULL NULL
4 NULL NULL


今度は右外結合で結びつけている列とは関係ない列の条件で。

SELECT F1,G1,G2
FROM T1 RIGHT OUTER JOIN T2 ON T1.F1 = T2.G1 AND T2.G2 = 2;

F1 G1 G2
----------- ----------- -----------
NULL 1 1
1 1 2
NULL 2 1
3 3 2
NULL 5 3

なぜこうなるのか?
「外部結合の使用」
http://technet.microsoft.com/ja-jp/library/ms187518.aspx
の説明では

「左外部結合の場合、参照される左側のテーブルからすべての行が取得されます」

とある。
その上で左外結合を説明すると

左のテーブルの各レコードに対し、
右のテーブルの各レコードと突き合わせて
ON句の条件が成立するものを結び付け、該当するものが無い場合には NULL にする

となる。

全外結合(完全外部結合) の場合で同様に考えると

SELECT F1,G1,G2
FROM T1 FULL OUTER JOIN T2 ON 1=0;



F1 G1 G2
----------- ----------- -----------
1 NULL NULL
2 NULL NULL
3 NULL NULL
4 NULL NULL
NULL 1 1
NULL 1 2
NULL 2 1
NULL 3 2
NULL 5 3

となり、

SELECT F1,G1,G2
FROM T1 FULL OUTER JOIN T2 ON 1=1;



F1 G1 G2
----------- ----------- -----------
1 1 1
1 1 2
1 2 1
1 3 2
1 5 3
2 1 1
2 1 2
2 2 1
2 3 2
2 5 3
3 1 1
3 1 2
3 2 1
3 3 2
3 5 3
4 1 1
4 1 2
4 2 1
4 3 2
4 5 3

のように CROSS JOIN と同様になる。

きちんと解ってしまえば迷うことが無いですね。

なお、実装が違うと動作が異なる可能性を否定できないのでご注意を。

今日は猫の日

2013年2月22日 日常
今携わっている仕事は JAVA の仕事で既存の稼働中のシステムのサーバをベースにして新システム用のシステム用のサーバを開発するというものである。
まぁ基本的にそのまま持ってくるだけなのだが。
JAVA 6 + Tomcat 6 である。開発環境は Eclipse 3.5。

しかしこの仕事の前に JAVA を触ったことはほとんど無い。
それこそ 15年以上前にちょっと弄ってみたくらいである。
いやまぁこの仕事断ったら社内失業状態になるところだったんでやる以外の選択肢はなかったが。

まぁそれでもフレームワークをビルド出来るようになってソースを持って来れるようになればなんとかやれるようにはなった。


さて、今週は元のシステムに追加された機能をベースにした新機能の追加した。
なんやかんやで結構手を入れているので単純作業だけど時間は食った。

実装を終えてテスト用サーバで動かしてみた。
動かしている途中、ログを見ると「スレッド停止警告」と出ていた。あらら。
元のプログラムは直接スレッドを監視していなかったので起動したスレッドのオブジェクトを参照できるように拡張し、thread.getState() 出力するようにした。すると「Thread.State.BLOCKED」だった。
これは Deadlock が発生したな。
でもどこで起こっているのだろう。

で、再現させようと Eclipse でデバッグ実行。・・・・発生しない。

一晩放置で動かしたがデッドロックは発生しなかった。
テスト用のデータをソケットを介して流してくるテスト用サーバーからデータが流れてこないのが原因かと思い、ソケット受信するスレッドの代わりにダミーデータを送出するスレッドに置き換えたがやっぱり発生しない。

 途方にくれてログに対して「BLOCKED」で grep をかけてみた。
・・・引っかかっているスレッド、今回追加した部分とは関係ないやつやん。あわわ。
 無関係だと思って設定で起動しないようにしたスレッドを動かすようにしたら見事にログに BLOCKED と出てくるようになった。

 BLOCK している状態で Eclipse の「デバッグ」ビューでそのスレッドを一時停止すると実行可能になったら次に実行する行を示して呼び出し階層が表示される。引っかかっているスレッドをすべて一時停止し、呼び出し階層をみて調べてみた。・・・・う~ん、なんで Deadlock になっているのかがわからん。Synchronized 付けたメソッドで互いに呼び出しあっているメソッドなんてないし。(そもそもこの時点で大きな勘違いをしている)。

 いろいろ見て調べたが、最終的には「eclipse java debug deadlock」でググったときに出てくる
Stackoverflow の「 How to Debug a deadlock in Java using Eclipse」(http://stackoverflow.com/questions/2081766/how-to-debug-a-deadlock-in-java-using-eclipse)

を見て、

「Jconsole」なるものがある

ことを知り、

「Jconsole Eclipse」でググって「Eclipseのtomcatプラグインから、jconsoleを利用する」(http://javastring.blog55.fc2.com/blog-entry-29.html) にたどり着いて

「JDK に Jconsole という JAVA アプリが含まれている」

ことを知った。

 「Eclipseのtomcatプラグインから、jconsoleを利用する」にある JAVA の起動パラメータを設定をして サーバーをデバッグ起動し、そして Jconsole を実行してみた・・・ら、ローカルでデバッグする場合は特に追加の JAVA起動パラメータを設定しなくても Jconsole が JVM に接続できることが分かったのでいったん終了し、追加した JVM起動パラメータを削除してもとに戻してサーバーをデバッグ起動し、Jconsole を起動して接続してみた。・・・おぉ、なんやグラフが表示される。

Jconsole でスレッドタブに移動する。「デッドロックを検出する」というボタンがある。押してみるとデッドロックしているスレッドの呼び出し階層とともに、ロックしている"もの"がロックした場所とともに表示された。
 
 ロックしているものは「クラス名@16進数の数字」で表示されている。
で、まず、クラス名レベルで互いにロックしていることを確認し、数字も一致していることを確認した。・・・が、呼び出している synchronized メソッドは全然異なる。なんでだ?

 そのとき閃いた。
「もしかして、JAVA のメソッドに付けた synchronized キーワードってそのメソッドが呼び出されたらそのメソッドを持つオブジェクトをロックしているのか?」


はい、JAVA触って3か月目ですが、いまだきちんと学習していません。素人です。
 調べたら 確かに JAVA で synchronized キーワードをメソッドにつけたらそのオブジェクトをロックするという意味だった。あとから考えたら、そしてよくあるロックの機構を考えたらそれが妥当であるし。

 この前々日くらいに「いやぁ、こんなに synchronized 付けまくってたら同時実行性能が下がってしまいますよ。これ書いた人って分かって synchronized 付けているんですかね~」って軽口を叩いていたが、見事にブーメランの法則、「synchronized を分かっていないのはおれだぁ~。」である。(同時実行性能低下の問題があるのは確かなのですが)

 オブジェクトがロックされていると分かれば問題となる個所もすぐにわかり、対応して無事 Deadlock が発生しなくなった。

 やはり、慣れない言語に手をだすときは一通り言語の仕様を知るようにしましょう。思い込みは危険です。あうあうあう。


会社で開発に使っているタワー機は Windows Server で Hyper-V を動かし、実際の開発環境はその VM上に用意している。
仮想VM の中に開発環境用のドメインコントローラー(DC)を用意して基本的に開発環境はそのドメインを使っている。
が、ホスト機のドメインはホスト機内部ドメインともまた会社のドメインとも別にしたかったので USB-Ethernet Adapter を利用して 古い32bitノートパソコンに Windows Server 2008 を入れて DC としていた。
仮想スイッチは
• ホスト内部
• 会社のネットワークにつなげたもの
• USB-Ethernet Adapter につなげたもの
の3つ。
ホスト機のドメインで、ホスト機内部のドメインを「信頼できるドメイン」とし、ホスト機をいじるときもホスト機内部のドメインのアカウントでログインしていた。

当初はホスト機は Windows Server 2008R2 だったが、Windows Server 2012 にアップグレードした。
そのころからか、ホスト機へのログインに時間がかかるようになった。リモートデスクトップで接続しようとしても「ローカルセッションマネージャの準備をしています」としばらく出てそのまま切断されてしまうとか。
耐えられなくなったのでホスト機のドメインのDC を仮想環境内に作ることにした。多分そうすれば改善するだろうと。
折角なので Windows Server 2012 を使うことにした。

VM を作成し、USB-Ethernet Adapter に接続したネットワークに接続した。

で、Active Directory をインストールし、設定を行う。
しかし、どうしてもエラーが出る。

ADPrep 実行の失敗 --> System.ComponentModel.Win32Exception (0x80004005): システムに接続されたデバイスが機能していません。


調べたが特に情報はみつからない。
Windows Update で最新にしても同じエラー。
一旦ドメインに参加させてからやっても同じ。

Windows Server 2012 の ISOイメージの Supportディレクトリに入っているADPREPを利用してあらかじめスキーマのアップグレードをしようとしてみたが、その ADPREP は64bit にしか対応しておらず、動かなかった。

GUI のウィザードで生成されたコマンドを PowerShell でもやってみたが同じエラー。

途中が USB-Ethernet Adapter というのが原因かと思い、横で ping を飛ばし続けて観察する。
するとフォレストのアップグレードと出ているときに一時 ping が通らなくなることがわかった。

ドメインコントローラの通信は低速な回線でも使えるはずなので VM のネットワークの最大帯域幅を 5Mbps に制限してみた。

すると、ping でたまに届かないことはあったものの、今度は無事DCを構築することができた。

ホスト機へのログインは早くなったような気がするがもうしばらく様子は見る。

Oracle Database 10.2.0.4.0 を Windows Server 2008 の VM 2台にインストールした。
1台は DB の作成まで行い、もう一台はインストールのみで DB まではインストールせず。
目的は Data Guard を試すこと。

テスト用ネットワークと社内LAN との両方につなげていたせいが Enterprise Manager のセットアップに失敗して起動せず苦労したがなんとか修復した。
(
http://faizsulaiman.com/unable-to-determine-local-host-from-url-repository_url/

を参考にして復旧した。
コマンドラインを管理者モードで起動していなかったとか
環境変数としてOracle_Home が設定されていなかったから失敗したとか。
Oracle に含まれる証明書が古いせいで enterprise manager が設定後に起動せず、

emctl unsecure dbconsole

として起動するようになったとか。
)

しかしながら、SQL PLUS から接続できないという現象に苦戦した。
正確には、ローカルから接続できるが、ローカル及びもう一台から TNSサービス名を指定すると接続できないという現象である。

Oracle Net Manager でいろいろいじったり、
Database の Service Name を確認したり(※1 この時点でいじった記憶はないが、いじったとしか思えない事象が出てくる)、
したが改善せず。

で、TNSNAMES ではなく、EZCONNECT でつなげてみる・・・とあっさりつながった。(でもこれ自体がおかしいということがわかり、※1 でいじったとしか思えない)

どうしても理由がわからず、別の機械に Oracle 11.2 の Instant Client を Install して接続してみたら EZCONNECT でも TNSNAMES でもつながった。
tnsnames.ora は同じにしたのに。

この問題、2週間くらい解決せず。

で、昨日もいじっていて、試しに instant client では使っていない sqlnet.ora をリネームしてみた。
・・・そしたらあっさり接続できた。

sqlnet.ora の中身を一行づつコメントアウトして試したら

NAMES.DEFAULT_DOMAIN

が原因だと判明した。

これが設定されている場合、SQL PLUS で TNSサービス名を指定した時にその TNSサービス名が「.」を付けていなかったら
NAMES.DEFAULT_DOMAIN の設定文字列を付けるというものである。

つまり、tnsnames.ora でのTNSサービス名に予め NAMES.DEFAULT_DOMAIN を付与している必要があるのである。(あるいは、 NAMES.DEFAULT_DOMAIN を設定しないか.)
(
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19209-01/sqlnet.htm
)

さて、これで問題解決・・・では終わらなかった。

SERVICE_NAME をいろいろいじっていて

「.」を含むサービス名にしたときは接続できるが、「.」を含まない場合は接続できない。

という現象に出くわした。

調べてみたが、「.」を付けない名前にしたときは DB_DOMAIN の設定値が付加されるとのこと。
LSNRCTL で Services を見ても DOMAIN名が付与されている。
なのに EZCONNECT でDB_DOMAIN が付いたサービス名を指定しても接続できない。

半日なやんでふと気が付いた。

DB_DOMAIN の設定しているドメイン名で綴り間違いをしていた。

間違った綴りで EZCONNECT で接続もできた。

で、 DB_DOMAIN と Global_NAME を変更した。
(
http://docs.oracle.com/cd/B19306_01/server.102/b14231/ds_admin.htm
)

これでいいか・・・と思ったがふと気になって Enterprise Manager を見てみたら DB に接続できていない。
Enterprise Manager の再設定をしなおした。
(
(環境変数 ORACLE_SID は設定済だとして)
管理者モードのコマンドラインから
環境変数 ORALCE_HOMENAME の設定して
emca -deconfig dbconsole db
emca -config dbconsole db
(※設定後の起動に失敗する)
emctl unsecure dbconsole
emctl start dbconsole
)


これでやっと準備ができた。

今日は猫の日

2012年2月22日 日常
ニャーニャーニャー
再度調達!!
と、いうわけで秋葉原に行き、再度
・秋月電子:DCプラグ変換プラグ(2.1mm[メス]⇒2.5mm[オス]変換)
[DC-9223]
http://akizukidenshi.com/catalog/g/gC-00179/
・マルツー:【MA-122SL】L型変換プラグ 2.5φプラグ用
http://www.marutsu.co.jp/shohin_40978/

を買ってきました。

---
2.1mm->2.5mm の変換アダプタ無くした><
http://10395.diarynote.jp/201201310654212993/

LB-L201BR のための ACアダプター調達
http://10395.diarynote.jp/201108312154063708/
ACアダプター を先日の VSUG のために

会社 -> 会場 -> 家-> 会社

と持ち歩いた。そしたら先に付けていた 2.1mm->2.5mm の変換アダプタが無くなっていた><
一緒にその先に着けていた I字->L字変換アダプタも。

あうあうあう。

また秋葉原に買いに行かないと。
---
LB-L201BR のための ACアダプター調達
http://10395.diarynote.jp/201108312154063708/

再度調達!!
http://10395.diarynote.jp/201202041840265290/

1 2 3 4 5 6 7 >