2012-03-31

qcow2は遅い

raw形式の仮想ディスクをqcow2へコンバートして圧縮した後の話。

スケジュールしたつもりはないんだが、ここんとこ、毎日のように夕方5時半をまわると、仮想環境のXPが極端に遅くなる。

ディスクのアクセスランプがずーっと光りっぱなし。

原因はわかっている。

ウィルススキャンだ。

しかしだ。

raw形式で使っていたときは、「遅くなったな」程度だったが、

qcow2形式にしたとたん、仕事ができないくらいに。いや、ほんと。

再起動しないとスキャンが終わらないから、毎日、夕方に再起動。

まぁ、その時間になったら、帰れってことかも。



訂正:qcow2が遅いんじゃなくて、こんな感じで圧縮したqcow2が遅い。

qemu-img convert -c -f raw -O qcpw2 hoge.raw hoge.qcow2

2012-03-28

KVM環境で仮想ディスクの最適化

KVM上で動かしているWindows XPの仮想ディスクを最適化したときの方法。


1.不要なファイルを削除

とりあえず、キャッシュやログ、アンインストールすることのないWindows Updateのバックアップファイル、ゴミ箱なんかを綺麗に。


2.空き領域をゼロ埋め

MicrosoftさんからSDeleteというツールをダウンロード

このツール、管理者権限でコマンドラインから使う。

パスが通っているフォルダにコピーして、コマンドラインから

SDelete -z C:\

で、Cドライブの空き領域をゼロ埋めしてくれる。早い話、Virtual PC で仮想ディスクを最適化する前に実行した事前圧縮ツールと同じことをしてくれる。ただし、可変サイズディスクの場合、最大容量までゼロで埋め尽くしてしまうので、ホスト側の空き領域に注意。

コマンドの進行状況はパーセントで表示してくれるので、気長に待ってみよう。

ちなみに、ドライブ文字列に「\」まで入力しないと

 Invalid drive letter: C Argument must be formatted like d:

とエラーメッセージが表示される。エラーメッセージも最後がコロンで終わっているが、正しくは「\」で終わらないといけないようだ。



3.シャットダウン

ゲストでゼロ埋めが終わったらシャットダウン。



4.イメージのコンバート

ホストのターミナルで、raw形式からqcow2へコンバート。

qemu-img convert -c -f raw -O qcow2 XP.img XP.qcow2


これで、38GBだった仮想ディスクの容量が13GBまで圧縮されました。


↑こんなことやったから遅くなった。
↓こうしないと。

qemu-img convert -f raw -O qcow2 XP.img XP.qcow2



2012-03-24

fgets()でUTF-16LEのファイルを読む

fgets()でUTF-16LEのファイルを読んだときにハマったお話。



fgets()は、第2引数を省略した場合、

・改行文字 (0x0A) を検出した

又は

・EOFに達した

場合に読み出しを終える。


ここに

123改行
123改行
EOF

というBOM無しファイルがあったとする。


UTF-16BEのバイト配列は

00 31 00 32 00 33 00 0A
00 31 00 32 00 33 00 0A



UTF-16LEのバイト配列は

31 00 32 00 33 00 0A 00
31 00 32 00 33 00 0A 00


となる。


このBOM無しUTF-16LEファイルを次のように読むと、

$fp = fopen("UTF16LE.txt", "r");

$bf = fgets($fp); // (1)

$bf = fgets($fp); // (2)



(1)の結果は
31 00 32 00 33 00 0A

(2)の結果は
00 31 00 32 00 33 00 0A

となる。

(1) は 0x0A を検出した時点で読み出しを止め、変数 $bf へ結果を返している。
(2) は、(人から見た)1行目の「0x0A」の次の 0x00 から読み出しが開始されるため、バイトオーダーが反転した(LE からBEに変わった)ような錯覚に陥る。



そう、ここで錯覚に陥ったのがすべての始まり。



文字化けが発生しないように、マルチバイト文字列関数を使う際は必ず文字エンコードを指定するようにしているが、これは困ったことになった。



2行目以降はUTF-16BEで処理するかとか、いろいろ悩んだけど、結局


$file = file_get_contents("UTF-16LE.txt");

mb_convert_variables("UTF-16BE", "UTF-16LE", $file);



こうやってファイル全体の文字エンコードを、UTF-16BE に変換してから後の処理を行うことにした。



これね、既存のシステムから出力されるファイルを取り込んで云々の仕事をしたときの話。

2012-03-18

文字コードのお話

書きかけですが...というか、俺のメモ。


奥が深い...



■文字集合・文字セット (character set)
文字を重複なく集めたもの。


■符号化文字集合 (coded character set、CCS)
ASCII
7bit。
0x5c:バックスラッシュ
0x7e:チルダ

JIS X 0201
ラテン文字用図形文字集合と片仮名用図形文字集合のふたつの文字集合よりなっている。
8bit。
0x5c:円記号
0x7e:オーバーライン
※JIS X 0201-1997 において、文字名称がOVER LINEと規定されているが、図形としてはオーバーラインでなくチルダのような形をとっても良いことが附属書2において記されている。OADG109キーボードでは、オーバーラインが刻印されているが、OADG109Aキーボードでは、チルダが刻印されている。

JIS X 0208:1997
非漢字、第一水準漢字、第二水準漢字

JIS X 0212-1990
補助漢字。この文字集合が単独で使われることはない。JIS X 0208 を拡張する目的で策定された。

JIS X 0213:2000
面区点番号で表される。第一面には、JIS X 0208:1997がすべてと、JIS X 0208:1997の保留領域であった空き領域に、非漢字(659字)、第三水準漢字(1,249字)が収録されている。
第二面には、第四水準漢字(2,436字)が収録されている。

JIS X 0213:2004
JIS X 0213:2000に対して、例示字形の変更、10文字追加が行われた。例示字形の変更に対応したフォントが必要。

JIS X 0221
国際符号化文字集合。UCSのJIS規格。

Unicode
元々は、16bit固定の符号化文字集合。足らなくなったので21bitに拡張。その際、当初の16bit領域を「基本多言語面(BMP)」とした。この領域は、UCS-2で定義される範囲と同一。

ISO/IEC 10646 (UCS; Universal Coded Character Set)
UCS-2
2オクテット(16bit)固定。UnicodeのBMP。

UCS-4
4オクテット(32bit)を基本とする。

Windows-31J(IANA登録名)
Windows Codepage 932
マイクロソフト標準キャラクタセット
見出しの名称は同じものを指す。このキャラクタセットは、次のように構成される。
  • JIS X 0201:1997
  • JIS X 0208:1997
  • NEC特殊文字
  • NEC選定IBM拡張文字
  • IBM拡張文字
※ この符号化文字集合は、0x5Cと0x7eに以下の図形が割り当てられている。
 0x5c:REVERSE SOLIDUS (YEN SIGN)
 0x7e:TILDE



■文字符号化方式 (character encoding scheme、CES)

符号化文字集合の「符号」をバイト列に変換する方式。ある文字集合に含まれる文字を用いて記述した同一の文字(文字列)であっても、符号化方式が異なれば、異なるバイト列となる。また、異なる文字符号化方式の文字列データであっても、基となる文字集合が同じであれば、文字の欠落なく相互変換が可能。

  • US-ASCII
  • ISO-2022-JP
  • Shift_JIS
  • EUC-JP
  • UTF-8
  • UTF-16



■JIS X 0208 を ISO-2022-JP で符号化する方法
区と点をそれぞれ16進に変換し、それぞれに0x20を加算する。
愛:16区6点 → 0x10区0x06点 → 0x3026


■JIS X 0208 を EUC-JP で符号化する方法
区と点をそれぞれ16進に変換し、それぞれに0xA0を加算する。
愛:16区6点 → 0x10区0x06点 → 0xB0A6


■JIS X 0208 を Shift_JIS で符号化する方法
(1) 第1バイト
・1区~62区      (区 - 1) / 2 + 0x81 ※小数点以下切り捨て
・63区~94区   (区 - 1) / 2 + 0xC1 ※小数点以下切り捨て


(2) 第2バイト 区が奇数の場合
・1区~63区       点 + 0x3F
・64区~94区     点 + 0x40


(3) 第2バイト 区が偶数の場合
点 + 0x9E


■WindowsでJIS X 2013:2004 対応後の文字セット
  • WGL4
  • マイクロソフト標準キャラクタ セット
  • JIS X 0212
  • JIS X 0221 非漢字
  • JIS X 0213:2004
  • Unicode 4.0 通貨記号

■Windows Codepage 932
http://msdn.microsoft.com/en-us/goglobal/cc305152


■IANA CHARACTER SETS
http://www.iana.org/assignments/character-sets


■Shift-JIS と Unicode 間の変換問題
http://support.microsoft.com/default.aspx?scid=kb;ja;JP170559
片方向変換しかできない文字の一覧が載っている。

■変換表
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit932.txt

2012-03-10

客先環境でハマル

納品したPGが動かない。
どこでエラーが出ているか分からなかったので、急遽、



ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL | E_STRICT);


をPGの先頭に追記。


そしたら、

mb_regex_encoding('UTF-8');


でこけてる。しかも...


Fatal error: Call to undefined function: mb_regex_encoding() in /var/www/html/xxxx/xxxx.php on line xxx


まじかよ...

というわけで、phpinfo();で確認することはもちろん、以下の確認PGで環境を確認しましょう。


<?
//  date.timezone の確認。"Asia/Tokyo"と表示さればOK
echo date_default_timezone_get();

//  定義済み関数の一覧
echo '<pre>';
print_r(get_defined_functions());
echo '</pre>';

//  サポートしている文字エンコード
echo '<pre>';
print_r(mb_list_encodings());
echo '</pre>';




ついでにmysqlでtimezoneがどうなっているかを確認。


mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2012-03-10 15:09:01 |
+---------------------+
1 row in set (0.00 sec)



日本の日付と時刻が出れば、何も設定しなくていい。


2012-03-08

たかがHUB、されどHUB

ただのHUBの入れ替えだと思って油断した。

繋がらない。

アライドのRS715TXからGS916XLへの入れ替えで失敗した。

RS715TXの1番~12番までは、10MのMDI-Xポート。
Full / Half の切り替えはディップスイッチ。

ただのHUB入れ替えだと思って、もともと何番のポートにどのケーブルが差さっていたか
控えるのを怠った。

おかげで、結線を元に戻せなくなってしまった。

やられた。

始業前に客先直出。7時には家出ないと...


ということで、MDI / MDI-X について。


通常、PCのNICはMDIポート、HUBはMDI-Xポート。
同じ種類のポート同士はクロスケーブルで、異なる種類のポート同士はストレートケーブルで接続する。
HUBとPCをストレートケーブルで接続するのは、異なる種類のポートのため。
HUBのカスケードポート(To HUBって書いてあるポート)はMDI。だから、HUB同士を接続するときは、HUB-AのMDI-XポートからストレートケーブルでHUB-BのMDIポート(カスケードポート)へ接続する。


カスケードとスタックは別物なので注意。
スタックは、HUBのポートを増やすような接続。複数台のHUBをスタックしても、まとめて1台としてカウントされるので、所謂「バカHUB」のみで構成されたネットワークの場合に、通信途中で経由できるHUBの台数制限(10BASE-T:4台、100BASE-TX:2台)を受けない。

スイッチングHUBの場合は、この制限を受けない。理論上、無制限。
ここで理論上としたのは、あまりにも経由すると、タイムアウトが発生してしまうため。


2012-03-07

過去プロジェクトの壮大なバグ

過去プロジェクトを使うとろくなことがない。

今日のバグ報告。

■不適切なHTMLエンティティ化
DBから取得した値を表示するときに、HTMLエンティティ化している。これはOKなんだけど、DB登録するときにも、値をHTMLエンティティ化していた。ん?何したいん?
&amp;amp;amp;...のオンパレード。こんなデータ、使えるわけねぇ。

■urldecode($_GET['hoge'])
あのぉ...$_GET['hoge']に入った時点で、デコードされてるんですが...意味ないんですけどぉ...

■自力でエスケープ
SQLインジェクション対策?で、自力で¥やシングルクォート、ダブルクォートをエスケープしていた。
これがまた不完全なエスケープでね。\\'でSQL文こけるよ。テストしてねぇだろ。
postgresqlもmysqlもPHPに関数あるんだからさ、そっち使おうよ。

■like検索で全件検索
WHERE句のLIKE組み立てるところで、%と_がエスケープされてない。
LIKE '%%%'じゃ全件検索だろが。

■パラメタ改竄し放題
せめて、下限と上限値のチェックぐらいしようよ。

■二重登録
ブラウザの [ 戻る ] で戻ったときのこと考えてないよ。
[ F5 ] アタックされても知らないぞ。


これらすべて、ほぼすべてのPGで実装されていた。


これ、わけわかってないときに下に作らせて、ノーチェックでリリースしただろ。


短納期・低価格で使いまわすの止めようよ。
質の悪い過去資産しかないんだからさ。
しかも、作った奴は辞めてるし、そのとき仕切ってた奴は我関せずで...



おかげで今日もこんな時間。

さて、今から米研いで寝るか...

Windows 8 Consumer Preview に VMware Tools 入れてみた

VMware Player のバージョンなんかについては、こっち参照で。


「入るだろ」

って甘い考えだった。

入れたらインストールが途中で止まったよ。

結局、俺の場合、OS入れ直した。


「入ったよ」

って方、教えてね。

2012-03-06

Windows 8 Consumer Preview を使ってみた (2)

解像度を変えてみた。


1366 x 768 はこんな感じ。いい感じでメニューが並んでる。

とりあえず、設定確認。

画面右隅へマウスを移動し、現れたメニューの一番上にある虫眼鏡をクリック。
次いで [ Esc ] キーを押して右側のメニューを決して、画面を右へスクロールして現れる [ コントロールパネル ] をクリック...って、何か面倒。
コントロールパネルを表示するショートカットキーはないのか。

とりあえず、コントロールパネル。


7と大差ない。



Windows Updateしてみた。


Windows Defender 入れて5つ。

おいおい、この前、プレビュー版公開されたばかりだろ。
対応が早いと褒めておくべきか、いや、もうちょっと更新頻度少なくなるように努力するとかないのか。

2012-03-04

Windows 8 Consumer Preview を使ってみた (1)

使ってみた。

まずは、起動直後。



ん? どうやってログインするんだ?

と思って、マウスで下から上へ画面をドラッグすると...


きたよ、ログイン画面。

パスワード入れて→クリックすると


これがスタートメニュー。
見慣れたデスクトップじゃない。

見慣れたデスクトップを表示したければ、「デスクトップ」ってところをクリック


おお~、見慣れたデスクトップ。

でも、スタートボタンがない。

アプリはどうやって起動する?

で、Windowsキーを押してみた。


あ、戻った。

マウスを画面の右隅へ持っていくと


画面の右側から、何やら現れる。

で一番上の虫眼鏡をクリックしてみると


お?これがスタートメニューか。

[ Esc ] キー押して右側のメニューを閉じ、画面下のスクロールバーで右へ行くと


これもまた見慣れたアクセサリやシステムツール関係が現れた。



感想:
はぁ~、またサポートが面倒くさくなった。お客さん、操作わからないよね、これだけUI変わると。
Windows 7でさえ、まだ触ったことないお客さんいっぱいいるよ。

これ出るの秋だろ。

お客さん、Windows XP から Vista も 7 もすっ飛ばして、いきなりこれは...無理だろな。

2012-03-03

Windows 8 Consumer Preview をVMware Player に入れてみた (2)

VMware Player のバージョンは、4.0.2。


ホストのマシンスペックはこんな感じ
・DELL Inspiron 1526
・CPU:AMD Turion 64 X2
・MEM:4GB
・OS:Ubuntu 10.04


ゲストに割り当てたのは、
・CPU:1
・MEM:2GB


Windows 7を選んで、後はいつも通りって感じでインストールできた。


インストールするときに、もっと何か特別なことあるかなと思ったけど、

何もなかった。

あっけなくインストール終了。


ここ見つけた方達は、これでいいよね。

2012-03-02

Windows 8 Consumer Preview をVMware Player に入れてみた (1)

出たよ。 Consumer Preview版。
見たよ。ネットのニュースで。
何よ。おんさんはもうついていけない。
何さ。あのインターフェイス。



ということで、只今、64bit版のISOイメージをダウンロード中。

そう言えば、Windows 7 で32bit版OSは最後じゃなかったっけ?

MSさんのサイトに、32bit版もあったな。




ダウンロードはこちら

Windows 8 Consumer Preview ISOイメージ
http://windows.microsoft.com/ja-JP/windows-8/iso

.htaccessで403を404で返す

久しぶりにリライトルールを書いたよ。 ドキュメントルートに.htaccessを置く場合の記述↓ # 403.html は実体がなくてよい。この設定をすることで、あっても使われなくなる。 ErrorDocument 403 /403.html # 独自の404ページをドキュメ...