セキュリティ強化の構成
Microsoft Windows Server 2003ではデフォルトでセキュリティ強化の構成が有効になっており、ページを閲覧する際にかなりの制限を受ける。
ここではそれらの内容に付いては触れないが、ともかくこれが有効になっていると、信頼ゾーンに載っていない場所へアクセスする度に
というダイアログが表示されるため、「今後、このメッセージを表示しない」にチェックを入れている人も多いだろう。これで二度と表示されなくなる。普通はそれで問題はない。
かなり希なケースとは思うが、このメッセージを再び表示させたい場合にはどうすれば良いのだろうか。
色々設定項目を見てそれらしい物を変更してみたものの、復活させることは出来なかった。
「項目が無いならやはりレジストリだろう」ということで調べた結果、かなり時間はかかったがようやく見つけた。
レジストリを操作すると、最悪の場合システムが立ち上がらなくなることもあるため、自己責任で行うこと。
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
の中の IEHardenIENoWarn というのがそれにあたる。
このキーが1になっているとあのダイアログは出ず、値が0か、もしくはキー自体が存在しない場合には出るようになっている。
キーを探すのが面倒な人は、
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings] "IEHardenIENoWarn"=dword:00000000
を、適当なファイル名.reg で保存して取り込めばいいだろう。
ところで、この方法を調べようと思ってけっこうぐぐったんだけど、全然出てこなかった。
個人でServer2003を使ってる人があまり多くなさそうな気がするし、そもそもこのダイアログを再表示させたいと思う人がいないからかもしれない。
もっとも、単に検索の仕方が悪かっただけかもしれないが、IEHardenIENoWarnで検索しても、日本語のページは全くヒットしなかったから、書いてる人が居ないのかもしれない。
まあヒットしなかったからと言って、書いた人がゼロとは言い切れないが…。
bmp2csv
ニコニコ動画にExcelで長門有希というのがある。
これは、エクセルのセルに色を付けてドットに見立て、それで絵を表示しようという試みである。
知り合いにこれの仕組みについて聞かれたとき、最初はエクセル画 for BMPというのを使ってるんじゃないかと思ったのだけど、数日後にExcelで長門有希〜作業工程〜というものがアップされ、自作のPerlスクリプトとエクセルマクロを使っていることが分かった。
まず、画像ファイルをエクセルで処理できる形式に変換するのだけど、その方法は以下の通り。
- PhotoFiltreで画像をモザイク状(枠付き)にする
- 不要部分をトリミング
- GIMPで読み込みPPM形式(ASCII)で保存
- PPMファイルを開き、ドット情報以外を削除
- 縦横5ドットずつ飛ばしながら色を抽出しCSV形式で出力(Perl)
最後が分かりづらいが、横方向は(1,1)の色を取り出したら次は(6,1)、その次は(11,1)となり、縦方向は(1,1)の次は(1,6)のとなる。最外周は枠があるため、(0,0)ではなく(1,1)から始まる。
分からないのは、1の手順が何故必要なのかということ。
トリミングして、縮小し、GIMPでPPMに変換し、CSV形式で出力する。それでいいんじゃないのかな。
というわけで、今回はこれらの手順をもう少し簡略化できないかなと思って、bmpファイルをcsvに変換するスクリプトを作ってみた。
結局、それほど手間は変わらないような気もするが、動画に出てきたスクリプトよりは多少汎用性はあると思う。もっとも、bmpファイルをcsvで出力する事が必要な場面ってあまり無いような気もするが…。
実は、bmp2csvというツールは既に存在していて自分でも試してみたのだけど、RGBを16進で表現した数値(FF00FFみたいな)か、RGBそれぞれの色成分毎に別ファイルで10進で表現した数値を出力することしかできなかった。
仕方がないんで自分で作ってみた、というわけ。
bmp2csvの存在を知ったのは、同類の動画Wordで巴有希奈を見て。
ではスクリプト。
use strict; use warnings; use POSIX qw/ceil/; use File::Basename qw/fileparse/; my $input = $ARGV[0] or die "ファイル名が指定されていない"; open(FI,"<$input") or die "ファイルがオープンできない:$!"; binmode(FI); my $buffer; # BITMAPFILEHEADER read(FI,$buffer,18) or die "ファイルが読めない:$!"; die "BMPファイルではない" if $buffer !~ /^BM/i; my($file_size,$offset,$header_size); $file_size = unpack("V",substr($buffer,2,4)); $offset = unpack("V",substr($buffer,10,4)); $header_size = unpack("V",substr($buffer,14,4)); my($size) = (stat FI)[7]; die "ファイルサイズが一致しない" unless $file_size == $size; my $pixel_bytes = $header_size == 12 ? 4 : 8; read(FI,$buffer,$pixel_bytes + 8) or die "ファイルが読めない:$!"; my($x_pixel,$y_pixel,$plane,$color_bits,$compress); my $colors; if($pixel_bytes == 8) { # BITMAPINFOHEADER(Windows) $x_pixel = unpack("V",substr($buffer,0,4)); $y_pixel = unpack("V",substr($buffer,4,4)); } else { # BITMAPCOREHEADER(OS/2) $x_pixel = unpack("v",substr($buffer,0,2)); $y_pixel = unpack("v",substr($buffer,2,2)); } $buffer = substr($buffer,$pixel_bytes); $plane = unpack("v",substr($buffer,0,2)); $color_bits = unpack("v",substr($buffer,2,2)); $colors = 1 << $color_bits; $compress = $pixel_bytes == 8 ? unpack("V",substr($buffer,4,4)) : 0; my @compress = ("無圧縮","RLE8","RLE4","bit_fields","JPEG","PNG",); print <<"EOM"; 横幅: $x_pixel 縦幅: $y_pixel プレーン: $plane 色数: $colors 圧縮方式: $compress[$compress] EOM my @pallet; if($colors <= 256) { # RGBQUAD(Windows) or RGBTRIPLE(OS/2) my $pallet_bytes = $header_size == 12 || $header_size == 64 ? 3 : 4; my $color_code; seek(FI,$header_size + 14,0) or die "シーク不可:$!"; read(FI,$buffer,$pallet_bytes * $colors) or die "パレットが読めない:$!"; for(0..$colors - 1) { $color_code = GetColor($buffer,$pallet_bytes * $_); $pallet[$_] = $color_code; printf("%03d: #%06X ",$_,$color_code); } print "\n"; } die "16ビット(65536色)には未対応" if $color_bits == 16; die "無圧縮BMP以外には未対応" if $compress; my $line_bytes = ($x_pixel * $color_bits) / 8; $line_bytes = (($line_bytes / 4) + 1) * 4 if $line_bytes % 4; my $pos; my $line; my $color; my $code_bits = $color_bits >= 24 ? $color_bits / 8 : ceil($color_bits / 4); my $reverse = 0; if($y_pixel < 0) { $reverse = 1; $y_pixel = abs($y_pixel); } my($file,$dir,$ext) = fileparse($input, qr/\.[^.]*$/); open(FO,">$dir$file.csv") or die "ファイルが作成できない:$!"; seek(FI,$offset,0) or die "シーク失敗:$!" if $reverse; for my $y (0..$y_pixel - 1) { $pos = $offset + $line_bytes * ($y_pixel - ($y + 1)); seek(FI,$pos,0) or die "シーク失敗:$!" unless $reverse; read(FI,$buffer,$line_bytes) or die "ファイルが読めない:$!"; if($color_bits == 1) { $line = unpack("B*",$buffer); } elsif($color_bits <= 8) { $line = unpack("H*",$buffer); } for my $x (0..$x_pixel - 1) { if($color_bits <= 8) { $color = $pallet[hex(substr($line,$x * $code_bits,$code_bits))]; } else { $color = GetColor($buffer,$x * $code_bits); } print FO $color; if($x == $x_pixel - 1) { print FO "\n"; } else { print FO ','; } } } close FO; close FI; exit; sub GetColor { my($line,$pos) = @_; (ord(substr($line,$pos + 2,1)) << 16) + (ord(substr($line,$pos + 1,1)) << 8) + ord(substr($line,$pos,1)); }
使い方は、たとえば上のソースをbmp2csv.plというファイル名で保存してるとして、sample.bmpを変換したければ、
perl bmp2csv.pl sample.bmp
とするだけ。これで結果がsample.csvに出力される。出力ファイルは上書きされるので注意。
別に難しい事をしてるわけじゃないんで、bmpファイルのヘッダが分かれば何をしているかは分かるはず?分からなければ聞いてね。
さて、一言でBMPファイルと言ってもいくつか種類がある。
通常BMPというと、何の圧縮もされてなくて画像の下から上へ向けて格納されている物(ボトムアップ)を想像するが、ランレンクスで圧縮されてるものや、データ部がJPEG、PNGで格納されてるものまで存在する。最後の二つは、わざわざBMPファイルにしなくてもJPEGファイル、PNGファイルで良さそうなもんだが、規格上は存在するんだから仕方がない。
ここで対応しているのは無圧縮のみ。
そして色数にもいくつか種類がある。1、4、8、16、24、32ビットの五種類。
通常、BMPと言えば24ビットだろう。32ビットでは、表現できる色数が24ビットと変わらないのに1ドット毎に1バイト(予約域分)増えるというデメリットしか無いため、まず使われることはないだろうし、16ビット(実際に使っているのは15ビット)もかなりマイナーで、見かけることが無い。
一応プログラム的には1、4、8、24、32に対応してるけど、32ビットのファイルは持ってないのでテストできず。
上にも書いたとおり、通常BMPは下のラインから上のラインへ向けて格納されているが、上のラインから下のラインへ向けて格納されているものあるらしい。これもプログラム的には読めるはずだけど、持ってないんでテストしていない。
さらにBMPにはV1〜V5の5バージョンが存在していて、それぞれヘッダのフォーマットが違う。通常はV3らしい。やっぱりこれもプログラム的には(以下略)。
というわけで、読める”ハズ”なのは、V1〜V5の無圧縮で色数は1、4、8、24、32ビットなBMP、だ。
その中でテスト出来たのは、V3の無圧縮、1、4、8、24ビット、ボトムアップのBMPファイル。
色々制限が厳しそうに見えるかもしれないけど、恐らく一般的に出回っているBMPファイルはみんな読めるんじゃないのかなあ?
そう言えば、リネージュでスクリーンショットを撮ると16ビットBMPで保存されて、フォトショップで読めなくて困ったっていうのを見かけたことがあるんだけど、本当なんだろうか。
16ビットBMPがどういう構造になってるか気になるから、誰か送ってくれないかなあ。
ちなみに、リネ2では普通の24ビットBMPで保存されていた。
余談ではあるけれど、色数についてちょっと補足。
たとえば1ビットのBMPの場合、0と1の二色が使えるわけだけど、それは別に白と黒の二色しか使えないというわけではない。フルカラーの中から、任意の二色が使えるという意味だ。パレットの構造は何ビット色でも変わらないので。
それにしても久々のまともな更新だったなあ…。
参考サイト。
http://www.kk.iij4u.or.jp/~kondo/bmp/
http://ja.wikipedia.org/wiki/Windows_bitmap
http://www.ruche-home.net/program/bmp/struct.php
画像データの読み込み位置計算は、一番上のサイトにあったのをそのまま使用。
■
書きたいことはいくつかあるのに書く気力がない…。いったいどうすれば…。
ディスプレイ
ナナオのカラーユニバーサルデザイン対応ワイドモニターが欲しい!
と書けばプレゼントに応募できるってんで、一応書いてみた。まあ当たるわけはないけど…。
ところで応募方法のところに書いてあるP型、D型の動画を、上の方の文章を見ずに見たら全然意味が分からなくて、一体これは何なんだろう?と思ってしまった。
何かの実験映像程度にしか見えず、とりあえず何もかもがまずそうだなと。
で、上のを読んで、ああ、色弱の人の為の機能を備えたモニターなのかと。
ということは、色が正常に見えていない人があの映像を見るとちゃんとした色に見えてるのかな。
これでちゃんとした風に見えるんだったら、CCDカメラと、この色覚変換機能の付いた小型ディスプレイを搭載したゴーグルみたいなのを作れば、日常のあらゆるものの色がちゃんと見えるようになるんかね。
もう既にあるのかな。あっても高いんだろうね。
なんかゲーム機でそういうのあったよなー。ラブひなでスゥが遊んでたヤツ。名前なんだったっけか…。
一応動画をぺたぺた。
http://youtube.com/watch?v=KUUBqKrMiuY
http://youtube.com/watch?v=cN_3DZJ5rpQ
これ、一つ目見終わって二つ目を見ても、変化に気づけないよ…。
並べて同時に再生だったら、、どうだろう。それでも分かりづらいかも。
タブブラウザで、同時に再生しながらタブを移動しまくるとさすがに分かる。
いずれにしても、やっぱりまずそう。
YouTubeの待機画面が悪霊退散に見えたのは内緒だ。
SATAカード その後
新しく買ったSATAカードに関しては、あれ以降も何の問題もなく動作している。
あれだけエラーまみれだったのに、今ではそれに関するエラーは全くイベントに載らなくなった。
まあそれが普通の事なんだけど…。
でも、もっと重要なことを思い出した。
新しく増設したHDDの調子が悪かったのだ。
小さなファイルの場合は問題ない事が多いのだけど、大きなファイル、200Mを超えてくるとかなりの確率で「化け」が発生してしまう。
最初、ダウンしたファイルが壊れているんだろう、ぐらいにしか考えてなかったんだけど、あまりにも頻度が高すぎる。
しかも、…これはずいぶん後になってから、というか最近試したことだったんだけど、別のドライブにダウンロードしてCRCチェックをしたらOKが出るのに、そのファイルを新しいドライブにコピーしてCRCチェックをしたらエラーといわれる。
これはもうダウンしたファイルが壊れているということはあり得ない。新しいドライブに書き込みをしている段階で壊れてるとしか考えられない。
そういえばちょっと前に、旅行に行ったときのビデオをエンコードしたのだけど、再生すると途中でMediaPlayerClassicが落ちるという現象が発生したのは、そのデータ化けが原因だったんだな…。
というわけで、新しいシリアルATAカードも順調な事だし、そっちの方がチップも新しいんで、ドライブを全部そっちにつなぎ替えてしまおうと。
で、やってみたのだが…。
何故か起動できない。
起動ドライブが一番IDも若くなっているのに、「有効なドライブがみあたんないよ」ってSATA BIOSに言われて、NTLDRにもシステムが見あたらないって言われてしまった。
有効なドライブが見あたらないと言ってくる割には、ちゃんとドライブ自体は認識しているのだが…。
まあ原因はよくわからんが、とりあえず起動ドライブだけはマザーボードのSATAポートに差し、残りの二台は新しいSATAカードに差すことにした。
そりゃちゃんと起動しますよ。
新しいドライブに大きなファイルをコピーしてもCRCエラーが発生することもなくなったし、これでOKだろう。
なぜ新しいSATAカードからだとブートできないのかは謎のままだけど…。
SATAカード
>disk
>error
>disk
>error
>disk
>error
>yes
どうしてこうHDDの容量ってのは、いくらあっても足りなくなるものなのかなあ。
今となっては別に凄くもなんともないけど、300Gだよ300G。そんだけありゃ十分でしょうに…。
でも足りなくなる。
そんなわけでHDDを増設しようとしたのだけれど、マザーボードに付いてるSATAのコネクタは二つ。両方とも既に使われている。
なので、これ以上増やそうと思えばシリアルATAのカードを買わなきゃなんない。当たり前。
そこで買ったのが玄人志向のSATARAID4P-PCIというカード。まあRAIDは組んでないからRAID機能は特に必要なかったんだけど、もしかしたらいずれ使うこともあるかもしれないってこと…だったと思うんだけど、とりあえず付いてるのにしてみた。
本当はSATA2のにしたかったんだけど、使ってるマザーが古くてPCIの規格が合わなさそうだったからやめた。けっこう高いから、刺してみてやっぱ使えんかったから放置、ってするには痛いのでね…。
そんで早速刺してドライバ入れてから電源を落とし、全てをその新しいカードの方に差し替えて起動してみた。
ちゃんと起動してプログラムもちゃんと動いてるんだけど、どうにも重い気がする。
相性が悪いんかなーと思って、仕方なしに起動ドライブと新しく買ったHDDをマザーのSATAに、もう一つのHDDを新しい方につなげる形にした。
そうしてしばらく使っている内に気づいたんだけど、どうも書き込み時に止まっているようだ。
ファイルをコピーしようとしたら、最初は調子よく書き込んでいるものの、数秒もしないうちに突然固まる。そして数十秒程度止まってからまた書き込みが始まる。
それでも調子がいいときは、やたらと時間が掛かるだけでちゃんとファイルのコピーはできるものの、固まったままうんともすんとも言わなくなることの方が多い。
イベントビュアーを開いてみたら、あるわあるわ、もうエラーの嵐。「ページング操作中にデバイス \Device\Harddiskx\DRx 上でエラーが検出されました。」と「デバイス \Device\Scsi\si3114r1 はタイムアウト期間内に応答しませんでした。」がずらっと並んでいた。
このエラーが出てても、一応コピーは出来てるようで、圧縮ファイルで整合性チェックをしてみたら問題は無かった。
とはいえ、このままの状態ではとても使えるとは言えないが、このエラーメッセージで検索してみても解決策は見あたらなかった。
出てきたのは、どれも「HDDの寿命だからバックアップを取って新しいのに取り替えましょう」という内容の物ばかり。
でも、内蔵SATAポートに刺したときはこのエラーは出ないんだからそれとは違う。
とりあえず刺すスロットを変えてみたが、なんとなくエラーの頻度が減ったような気になっただけで、やっぱりダメだった。
というわけで相性問題かな、ってことでしばらく放置していたんだけど…。
ふと玄人志向のBBSを見てみたら、BIOSの書き換え方を質問してる人が居て気づいた。
そうだった。BIOSをアップデートしたら相性問題が解決することもあるんだった。
ダメもとでやってみっか、ってことでSilicon Imageのページに行き、SiI3114のRAID5BIOSとBIOSアップデートユーティリティ、そしてドライバをダウンロードしてBIOSを書き換え、起動してドライバをインストールし、再起動した。
結果、無事解決。
検索していたときに、BIOSのアップデートを行うと、OSの再インストールが必要になるらしい、って書き込みを見つけたからちょっと心配だったけれど、問題無かったようだ。
BIOSを書き換えて起動したときに、新しいデバイスが見つかったとかいうことでドライバのインストールをしたのだけれども、もしかしたらこの事が原因なのかもしれない。
OS標準ではSATAのドライバが入っていない(2000での話)ため、SATAのディスクにアクセスするにはSATAのドライバを別途インストールしなければならないが、起動しただけで自動的にドライバのインストールが始まると言うことは、要するにOSが起動した時点ではドライバが入っていないからSATAのドライブにアクセスできない、のでOSが起動できない。
というわけで結局再インストールが必要となる、ってことなのかな?
今回の場合は、起動ドライブはBIOSをアップデートしたのとは違う方に刺さっていたから関係なかったけど、もしそうでない場合は…かなり面倒だな。起動ディスクから起動してSATAドライバだけ入れる方法ってのは無いんだろうか?
ま、それからはエラーも無しにちゃんと動作してますよ。