2008年11月21日金曜日

NTBackupで強引にP2Vマイグレーション@WindowsServer2003[自己責任注意]

物理サーバで動いている WindowsServer2003 でシステムの NTBackupを取りました、でそれを、VirtualServer で動いている WindowsServer2003 上でシステム状態ごとフルリストアしました。
 

さて、これ動かないですよね。でも NTBackup を取るときに物理サーバの設定を工夫すれば動くことがあります。
 
 

注意:この記事どおりにやったからと言って確実にうまくいくとは限りません、自己責任でお願いします

ちょっと参考リンクを。

Windows XP または Windows Server 2003 セットアップ後の HAL オプション
http://support.microsoft.com/kb/309283/ja


 

キモはこのHAL、物理→仮想のマイグレーションってこの辺いじってるらしいのでこれが通れば何とかなる。
 
あまり検証してないので仮説ですが、仮想PCのマザーボードは互換性のためアーキテクチャがとっても古い(VS2005なら440BXくらい)ものをエミュレートしてるらしいんですよね、ってことで新しめハードのHALをそのまま仮想に突っ込んだら動作しない、って事だと思う。
 
 

なので、NTBackup を取得する前に、物理サーバ上で デバイス マネージャのHAL オプションを仮想化後を想定したものに変更する必要がある。リストア先の仮想PCでHALオプションを見てみよう、多分違うはず。
 

ここで物理サーバのHALを仮想にあわせると絶対ダメ、物理側がおじゃんになる。
手順があるのでそれを踏もう。要は互換性重視で一番しょぼいHALを使おうと言うこと。

  1. まず物理サーバでHALオプションを「"標準 PC"、非 ACPI PIC HAL (Hal.dll) 」にする

  2. NTBackupで移行する

  3. ちゃんとOSが立ち上がってくるのでHALオプションを仮想PCでの元々の設定に戻す


 

晴れてPtoV、仮想化完了という運びになります。これはすごく楽、VHDの容量とか元のサーバを気にしないで良いし。
 
 

この強引な手段はマイグレーションとは言わないかもしれない。
最後にも言うけど、やってみるなら自己責任で、業務用のはやめておこうね。

2008年11月20日木曜日

VBScriptからSQLSERVERに接続する(ADO)

WindowsServer の運用管理で、ちょっと SQLServer から情報もってきたい時に VBScript(やWSH) でDBに接続できたら都合がいい。
 
 

ADO(ActiveX Data Object) とかいうやつを使ってちょっとクエリを流そうという時のメモ。
 
 

サンプル:SQLServer上に設定されている、サーバのホスト名を取ってくる


大体が [Master] の [sysservers] に1行あるレコードがローカルサーバ情報。サンプルでは一応複数あった場合の処理をさせてる。
 

下記を拡張子VBSで保存して実行する。
[sourcecode language='vb']
Private cn ,rs

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

'// ADODBでSQLOLEDBに接続、この場合ユーザはログイン中のものを使う
cn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=msdb;Integrated Security=SSPI;"
'// SQLのクエリを書いてレコードセットを取得する
rs.Open "SELECT [SrvName] FROM [Master].[dbo].[sysservers] WHERE [srvid] = '1'", cn


'// レコードセットを1行づつ処理する
Do While Not rs.EOF
Wscript.echo rs("SrvName")
rs.MoveNext
Loop
'// レコードが一行ならこれでもOK
'// Wscript.echo rs("SrvName")

rs.Close
cn.Close

Set cn = Nothing : Set rs = Nothing

Wscript.Quit
[/sourcecode]
 

sysdatabaseからデータベースの一覧とかを持ってくるのも簡単。
SELECT以外の文は結果がどうなるのかは試してないけど、多分単純に結果コードが帰って来るんだと思う。
 

まぁ更新系を使う場合はVBScriptとかじゃないよね、と思う。

2008年11月19日水曜日

任意のフォルダでWindowsエクスプローラ(explorer.exe のオプションの話)

Windowsのエクスプローラはいいファイラだと思う。少なくともデフォルトのファイラとして十分な使い勝手じゃないだろうか。
 

それはさておき、そのエクスプローラ(explorer.exe)を狙ったフォルダで開けると助かる。役に立つ局面としてはたまに面倒を見るサーバでの作業や、お客さんのサーバで作業用フォルダを作っている場合など。
普通のショートカットと違って、ぱっと2ペインでフォルダツリーが展開されるのは小気味がよい。
 
 

やってみる。単純に引数を渡すだけではダメ、/e と カンマで


まず純正のエクスプローラへのショートカットをデスクトップにコピーしてこよう。見当たらなければ「アクセサリ」 に入ってると思う。
[caption id="attachment_1059" align="alignnone" width="273" caption="画像:エクスプローラのプロパティ(デフォルト)"]画像:エクスプローラのプロパティ(デフォルト)[/caption]
 

ではリンク先の所を書き換える%SystemRoot%\explorer.exe↓↓↓↓↓"D:\WORK"で開きたい場合はこうする。スラッシュe でカンマで区切ってパス
%SystemRoot%\explorer.exe /e,"D:\Work"
 
これで指定したパスが展開された状態でエクスプローラが起動する。
 
 

ツリーのルートも変更する


exeplorer.exe のコマンドラインオプションとして他に、/rootオプションを使うと、ツリーのルートが変更できる。
%SystemRoot%\explorer.exe /e,/root,"D:\Work"
変なところいじらなくてすむので、用途によっては /root オプションは使えるだろう。
 

要はこんな感じになる、左がスッキリ。
[caption id="attachment_1060" align="alignnone" width="500" caption="画像:ツリーのルートを選択したエクスプローラ"]画像:ツリーのルートを選択したエクスプローラ[/caption]
 
 

作業用フォルダを作るなら、ショートカットはエクスプローラで開くように作っておこう。
 
 
 

その他、explorer.exe のコマンドラインオプションについてはマイクロソフトのKBで。

Windows XP の Explorer.exe コマンドライン オプション
http://support.microsoft.com/kb/314853/ja

2008年11月16日日曜日

Google Docs のプレゼンテーション機能

Google Docs にプレゼンテーションあるなんて知らなかった。
ドキュメント、スプレッドシート(MSOfficeのWord・Excelに相当)しかないと思っていたが、Googleプレゼンテーションを使った方の記事を見てちょっと試してみた。
→第3回PHP懇親会に行ってきた:nekoya氏
 
 

では使ってみた感想と、サンプルの公開をしますよー。
 
 

十分な基本入力機能、テキスト&画像と図形の挿入


使ってみたがここらの機能はとっても PowerPoint、これならだいたい直感的に使える。
 
テキストはフォントや色はもちろん、箇条書きやインデントの自動化に対応しており十分な表現ができる。
画像、図形は挿入&サイズ変更ができる、画像は HTTP URL での指定も可だ。図形の中に文字を書くのに 「図形+テキストボックス」 と組み合わせる必要がある事が気になったくらい。
 
画像いじり(透明色指定とか)ができないが、それはローカルでやろう。
 
 

表示関連の機能はシンプル


表示関連の機能は画像、テキストの遅延表示(クリックで表示、表示順の設定が可能)に対応、ほかは特に無いっぽい。
アニメーション多様するプレゼンはうっとおしい事が多いのでこれでいいと思うが、少々さびしい。
 
 


テンプレ、マスタはちと弱いか(日本語版の問題か?)


欲張るなという気もするが、レイアウトのマスタをデザインする機能が背景設定くらいしかない。
※英語版はテンプレの編集ができる模様、これで心配ないかも。
 
 

インポート、エクスポートがスゴい


*.ppt (Powerpoint2003以前のファイル形式)のインポートができるみたい。今度仕事に無関係なPPT作って試してみよう。手元のはWEBに上げるにはシャレにならんのばっかり。
 

エクスポート(ダウンロードして保存)対応形式は、pdf, ppt, txt となっていた。結構すごいのではないか。
pptは実際にGoogleプレゼンテーションで作ったオブジェクトごとに編集ができるようになってて、スライドマスタもきちんと使える。これはインポートも期待できるだろう。
 
 

サンプルを作ってみた


と、機能を試しながらサンプルのプレゼンテーションをひとつ作ってみた、ワンタッチでWEB公開が可能なのはとても便利ですね。
公開用の直接リンクと、WEB埋め込みの形式がえらべます。下記リンクから参照してみてください。
 
 
プレゼンの内容については作業中に子が来たので一緒に作った為、 超お子様向け になってます、ご了承ください。(※予定ではGoogleプレゼンテーションの使い方を紹介だったんだが。。)
 

まずはWEB共有公開版
http://docs.google.com/Present?docid=ddz7r3m9_1d47nd3gf&skipauth=true
 

こちらはWEB埋め込み版、遅延表示など一部対応していない機能があるようですね。

 
 

あったらいいな


コネクタ、図形へのテキスト埋め込み、マスタ編集、スプレッドシート埋め込み
とできれば(自分の用途の範囲では)もう何も要らないな。一応全部画像貼り付けで対応可能だけど。
 
 
 

全体を通して、とってもアリだね「Googleプレゼンテーション」と思った。

2008年11月14日金曜日

EXCELのマクロ(VBA)を触ってみた、ランダム陣取りシミュレータ?

ちょっと待ち行列を計算する用事があったので、今まで操作録以外全然触らなかったExcelのマクロの書き方を勉強してみた。
 
 

しかし、なぜか予定と違って観察系の陣取りシミュレータができた。。
    仕様はこんな感じ
  • セルに1-100までの数字を並べる

  • ランダムに1つチョイス、これまたランダムな場所に上書きコピーする

  • 繰り返す。そのうち1つの数字が天下を統一する。


 

待ち行列の計算しようとおもったんですよ、本当ですよ?
 

ということで、数字のセットとランダムコピーのマクロ(VBA)を載せておこう。
 
 


準備用マクロ(VBA):1-100までの数字をセット、ついでにカウンタを0にリセットする


1行に5列ずつで、20行目まで数字を置いていく。

[sourcecode language='vb']Sub reset()
s = 1
For j = 1 To 20
For i = 1 To 5
' セルに数字を書き込む
Cells(j, i) = s
s = s + 1
Next i
Next j

' カウンタリセット、F5がカウンタ
Range("F5") = 0
End Sub[/sourcecode]
 

これで準備はOK、リトライも簡単。
 
 

シミュレータ実行用マクロ(VBA):ランダムに数字を選んで1回コピーの繰り返し


ところどころ乱暴だけど、ランダムコピーの処理。
rnd()の周りはなんかきれいなやり方があるんだろうなぁ。

[sourcecode language='vb']Sub Shuffle()
Randomize
s = Range("F5")

For i = 1 To 500
rndset:
m = Round((Rnd * 40 / 2 + 1), 0)
j = Round((Rnd * 10 / 2 + 1), 0)
k = Round((Rnd * 10 / 2 + 1), 0)
l = Round((Rnd * 40 / 2 + 1), 0)
' 6とか21とか、はみ出し系の結果が出るのでやり直しさせる
If j = 6 Or k = 6 Or m = 21 Or l = 21 Then
GoTo rndset
Else
' 参考用に座標を出力しておく
Range("F1") = j
Range("F2") = k
Range("F3") = m
Range("F4") = l
' これはカウンタ
Range("F5") = s + i
' ランダムに選んだマスの数字を任意の場所に上書きコピーする
Cells(m, j).Copy Destination:=Cells(l, k)
End If
Next i

End Sub[/sourcecode]
 
 


実行してみる、グラフつけると面白い


視覚的なことを考慮してグラフとか色々つけている、リアルタイムで勢力図が見れて面白い。
これもマクロでセットアップしたら良いんだろうけどそれはまた今度かな。
 

統一させるまで見届ける場合は While でまわせばOK、大体 4000-8000 位の施行で終わるがたまに1万超えるし。
 

スタート時点の図、すべての勢力は1つで均等
[caption id="attachment_1051" align="alignnone" width="300" caption="画像:陣取り合戦スタート"]画像:陣取り合戦スタート[/caption]
 
 

ランダムコピー500回実行したところ。93が最大勢力(26ヶ)
[caption id="attachment_1052" align="alignnone" width="300" caption="画像:500ターン"]画像:500ターン[/caption]
左下のところはグラフ用、COUNTIF文 と IF文 で0個になったら勝手に消えるようにしてグラフを見やすいようにしている。
 
 

統一までほったらかしてみる、2300くらい。
とても三国時代だ、NINTENDO64(仮名) vs PC-98(仮名) vs .. JR-100(仮名)? といった所か。
[caption id="attachment_1053" align="alignnone" width="300" caption="画像:2300ターンくらい、三国時代"]画像:2300ターンくらい、三国時代[/caption]
 
 

完全に天下統一 ※Whileに変更したので500回のサンプルとは違う回
[caption id="attachment_1054" align="alignnone" width="300" caption="画像:天下統一!"]画像:天下統一![/caption]
 

見事9102ターン目で PC-98(仮名) が天下統一を果たした、Cバス万歳と言うことなんだろうか。
 
 
 

えーかげん と言うか 今更というか、Excelマクロ も活用したほうがいいなと思った。

2008年11月13日木曜日

ニンテンドーDS(無印)のWi-Fi接続をバッファローの Wi-Fi Gamers(WCA-G)で (がんばって)セキュアにやる

ニンテンドーDS(無印)では無線の通信暗号化方式が WEP しか使えない。
自宅に無線LANこそ導入はしているが、そこは当然 WPA(AES)を使ってる、WEPも選択できるが…ITPro:利用率7割のWEPは「1分」で破られる こんな現状なのではっきり言って使いたくない、使えない。
 
 

しかし実際に ニンテンドーDS を使う子はそんな事情なんて知ったこっちゃない、Wi-Fi やりたいと頼まれちゃあなんとかする方法を模索するしかない。なんでWiiはブリッジにならないんだよ!(言いがかり)
 

ちなみに新しい ニンテンドーDSi はWPA にきっちり対応している、それ買えって?
だって 古いDS壊れてないし DSi高いし WEBブラウザなんて余計な機能がついてる(注:もちろん制限できるんだけど…いまいち不安)しで却下、そんなにコスト掛けたくない。
 
 

で、既存の環境に影響がでないように安手のAPを追加として、これ使うことにした。

 
 

「BUFFALO Wi-Fi Gamers 無線LANアクセスポイント WCA-G」に電源スイッチを組み合わせた。


結論から言うと「電源OFFにしてWEPの脆弱性から身を守る」という運用を課すことで親子間のSLA合意した。
↓構成はこうだ。
[caption id="attachment_1045" align="alignnone" width="300" caption="写真:WCA-Gと電源スイッチ"]写真:WCA-Gと電源スイッチ[/caption]
 

子には「DSでWi-FiしたくなったらスイッチON、終わったら切ってくれ」とした。ACアダプタにくっついている電源スイッチだ、LED付き でお子様にも分かりやすくしている。
うちの環境では常時起動のマシンはない為、これで十分。 「Wi-Fi Gamers(WCA-G)」 の起動には15-20秒ほどかかるが特に気にするほどではない、ポケモンのWi-Fiセンターに突撃している間に準備は完了している。
 
 


予想以上にコンパクトサイズだった





[caption id="attachment_1046" align="alignnone" width="225" caption="写真:AirStatonとWCA-Gのサイズ比較"]写真:AirStatonとWCA-Gのサイズ比較[/caption][caption id="attachment_1047" align="alignnone" width="225" caption="写真:WCA-G持ってみた"]写真:WCA-G持ってみた[/caption]

 

すごい小さい。
 
 

初期設置は楽なもんだった、液晶小窓もよい感じだ


ニンテンドーDS は AOSS に対応している、で、 この 「Wi-Fi Gamers(WCA-G)」 もAOSSで設定するようになっている。
説明書の設定方法には「AOSSでつなぐのでこのボタン(上についてるデカいボタン)押せ」程度のことしか書いてない。
まあそれで済むからいいや。
 
液晶小窓、ステータスが表示できる。 「起動中」 → 「起動完了」 ってちゃんとわかるので今回の運用方法にかなりマッチ。
画面下のカーソルキーで少し操作できる、環境確認やチャンネル変更が可。ファームのアップデートなんかもできるようだが、発売以来新しいのは一つもないようなので確認できず。
 
 


説明書にはなぜか載ってないWEB設定画面に注意、使いではあるが…


さてこの「Wi-Fi Gamers(WCA-G)」 説明書に載ってないWEB設定管理画面がある。
 
これがとってもいただけないことに、
「root / 空パスワード」 で設定画面に入れる。
んですね、初期設定では。
 
[caption id="attachment_1048" align="alignnone" width="500" caption="画像:WEB設定画面トップ"]画像:WEB設定画面トップ[/caption]
小窓でIPアドレス確認できる仕様にしといて、これはないだろ。
 

もし「Wi-Fi Gamers(WCA-G)」 を使う場合は、
WEB管理画面のパスワードを必ず設定してください
[管理設定] → [パスワード] で変更できます。
 

AOSS なので「無線ANY許可」、DS なので「WEP」 となかなか強力なカードがそろっている中、Root空パスはアカンやろうに。
 
 

パスワードさえ設定してしまえば、WEB設定画面はそれなりに使いでがある。クライアントモニタや許可済み機器の状況も把握できる。
[caption id="attachment_1049" align="alignnone" width="500" caption="画像:WEB管理画面の一部"]画像:WEB管理画面の一部[/caption]
 

まあ自宅ではこの構成に落ち着いたが、普通にWPA(AES)なども対応しているので安手の追加APとしても十分に使える。手軽に無線AP追加したかったらいい商品なのかもしれない、小さいし。
 

くれぐれもWEBのパスワードは忘れないように、液晶でIPわかっちゃうからね。
 
 

2008年11月10日月曜日

MySQLでバイナリログから更新系のクエリをトレースする

メモエントリ。
 
MySQLのバイナリログをSQLのトレース目的で使ったのでメモ。
 

MySQLのバイナリログ取得設定


MySQLのバイナリログをとっておけば色々出来る、その辺は公式やら書籍が詳しいので割愛。
 

取りあえず設定。
my.cnfを編集、[mysqld] のセクションに取りあえず3行入れよう、ディレクトリはmysqlユーザが読み書きできるところならどこでもいい、この例では yum でのデフォルトのdataディレクトリだ。
[mysqld]
・・・
log-bin=/var/lib/mysql/binary
expire_logs_days = 14
max_binlog_size=200M


"log-bin"だけでも良いけど、放っておくとどこまでもログが残る、1ファイル200MB制限・14日間保存と
ファイル容量を制限するのは、ログ抽出の際に不便だから。
 
 
これで MySQL を再起動すれば、"/var/lib/mysql/binary.index","/var/lib/mysql/binary.000001" ファイルが作成されている。
(※起動に失敗したらmy.cnfで指定しているエラーログを見ると大体分かる。)
 
バイナリログはこっち、 "/var/lib/mysql/binary.000001" ローテーションするごとに数字が増える。
 
 

バイナリログから更新系ログを抽出


バイナリログの設定が終わったので本題。
 

バイナリログには、データベースの基本機能、 CRUD のうちReadを除くCUDが記録されている。
これを mysqlbinlog コマンドでテキストデータ(=実行時のSQLクエリ)に戻せるのでやってみよう。
 

テスト用DBの作成と削除


とりあえずDBを作って消した。
#mysqladmin create test001 -p
#mysqladmin drop test001 -p

mysqladmin とかいう妙なコマンドを使ったが、実際どういうSQL文が実行されたのかこれではよく分からない。
が、実行結果がバイナリログに記録されているので安心。
 

変換したバイナリログを眺める


mysqlbinlog コマンドにバイナリログファイルを渡してみる、
# mysqlbinlog binary.000001

 

上記実行後、出力の一部が下記。
#081110 12:33:26 server id 1 end_log_pos 104655065 Query thread_id=1071 exec_time=0 error_code=0
SET TIMESTAMP=1226288006/*!*/;
SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=0/*!*/;
create database `test001`/*!*/;
# at 104655065
#081110 12:39:45 server id 1 end_log_pos 104655154 Query thread_id=1076 exec_time=0 error_code=0
SET TIMESTAMP=1226288385/*!*/;
drop database `test001`/*!*/;

 

ばっちり記録されている。
本来はフルバックアップからの差分とかでの利用が想定されているみたいだけど、WEBアプリ制作時のデバッグとか、わけのわからんアプリが何かしているので調査とか、そういう局面でも役に立つ。