2011年8月30日火曜日

Visual Studioで外部ツールでソースを更新した時の確認ダイアログがうざい

[ツール]-[オプション]-[環境]-[ドキュメント]-[環境外でのファイルの変更を検出]-[保存する場合、変更を自動的に読み込む]にチェックを入れる。

2011年8月29日月曜日

全プログラムでフォントをアンチエイリアス

64bit環境にも対応しているgdippを使ってみた。インストールするだけでもお手軽に利用できるが、設定ファイルを少しだけいじる。
  1. UIメニューで使うフォントやメイリオはアンチエイリアスを無効に
  2. embolden (フォントの太さ)を増やす。
<?xml version="1.0" encoding="UTF-8" ?>
<gdipp>
<version>0.9.1</version>

<gdimm>
<process>
<freetype>
<cache_max_faces>8</cache_max_faces>
<cache_max_sizes>16</cache_max_sizes>
<cache_max_bytes>2097152</cache_max_bytes>
<lcd_filter>1</lcd_filter>
</freetype>
</process>

<font name="メイリオ.*">
<renderer>0</renderer>
</font>

<font name="Tahoma">
<renderer>0</renderer>
</font>

<font name="MS UI Gothic">
<renderer>0</renderer>
</font>

<font max_height="72">
<auto_hinting>1</auto_hinting>
<embedded_bitmap>0</embedded_bitmap>
<embolden>10</embolden>
<gamma>
<red>0.9</red>
<green>0.9</green>
<blue>0.9</blue>
</gamma>
<hinting>1</hinting>
<kerning>0</kerning>
<render_mode>
<mono>0</mono>
<gray>1</gray>
<subpixel>1</subpixel>
<pixel_geometry>0</pixel_geometry>
<aliased_text>0</aliased_text>
</render_mode>
<renderer>10</renderer>
<shadow>
<offset_x>1</offset_x>
<offset_y>1</offset_y>
<alpha>0</alpha>
</shadow>
</font>

<font>
<renderer>0</renderer>
</font>
</gdimm>

<demo>
<count>5000</count>
<threads>2</threads>
<random_text>0</random_text>
<font>Arial</font>
<font>Consolas</font>
<font>Segoe UI</font>
<font>Tahoma</font>
<font>Verdana</font>
</demo>

<exclude>
<process>conhost\.exe</process>
<process>dwm\.exe</process>
<process>logonui\.exe</process>
<process>service\.exe</process>
<process>spoolsv\.exe</process>
<process>svchost\.exe</process>
<process>taskhost\.exe</process>
<process>userinit\.exe</process>
<process>werfault\.exe</process>
<process>wininit\.exe</process>
<process>winlogon\.exe</process>
</exclude>
</gdipp>

Google Chromeでフォントをメイリオで強制的に表示

UserStyleSheetを利用してMSゴシック系のフォントをメイリオで表示させる。
Windows Vista以降

%LOCALAPPDATA%\Google\Chrome\User Data\Default\User StyleSheets\Custom.css

WindowsXP

%APPATA%\Google\Chrome\User Data\Default\User StyleSheets\Custom.css
@font-face {
font-family: "MS Pゴシック";
src: local("MeiryoKe_PGothic"), local("メイリオ"), local("MS Pゴシック");
}

@font-face {
font-family: "MS PGothic";
src: local("MeiryoKe_PGothic"), local("メイリオ"), local("MS Pゴシック");
}

@font-face {
font-family: "MS UI Gothic";
src: local("MeiryoKe_UIGothic"), local("Meiryo UI"), local("メイリオ"), local("MS UI Gothic");
}

@font-face {
font-family: "MS ゴシック";
src: local("MeiryoKe_Console"), local("MS ゴシック");
}

@font-face {
font-family: "MS Gothic";
src: local("MeiryoKe_Console"), local("MS ゴシック");
}

@font-face {
font-family: "MS UI Gothic";
src: local("MeiryoKe_UIGothic"), local("Meiryo UI"), local("メイリオ"), local("MS UI Gothic");
}

使っているフリーフォント

同じフォントだと飽きてくるのか、たまにフォントを変えるとなんか気分よく作業ができる。
そんな訳で使っているフォントの紹介。

◎ プロポーショナルフォント

MS Pゴシックは見飽きてきたので、メイリオを使うことが多い。ただメイリオはこれまで使われて来たMS Pゴシックと幅に結構差があって、従来のフォント幅を前提に作られたページのデザインやAAが崩れる問題もあるので、字体はメイリオのままフォント幅をMS Pゴシック互換にしたメイリオKEを使っている。

meiryoKe_gen : http://okrchicagob.blog4.fc2.com/blog-entry-169.html#169

◎ 等幅フォント

主にプログラミング用。気分を変えるたエディタとかIDEによりフォントを変えている。

・VLゴシックフォント : http://vlgothic.dicey.org/

M+フォントベース。コマンドプロンプトでも使える。

・OSAKAフォント : http://osaka.is.land.to/

Mac由来。これもコマンドプロンプトで使用可能。

◎ 縦書き対応フォント

普段はメイリオを設定しているけど、気分を変えたい時にいじってみたり。

・あずきフォント・うずらフォント : http://azukifont.com/index.html

手書き系フォントは縦書だと記号が変になるものが多いけど、このフォントは縦書きでもいける。



2011年8月26日金曜日

HTTPリクエスト/レスポンスヘッダの確認方法

WebアプリのデバッグなどでHTTPリクエスト/レスポンスヘッダを確認したい時がある。昔からあるのがローカルプロキシを経由する方法で自分は横取り丸を一番使っていて、SSLの場合はAchillessを使ったりしていた。

他にはブラウザに開発用のアドオンのたぐいを追加する方法もあるが、Google Chromeを使うのであればVanillaで確認できることがわかったのでメモしておく。
URLに「chrome://net-internals/#events」を入力すれば良い。

Filterに「URL_REQUEST」を入力すれば抽出できる。

.NET Framework 4.0でsgen.exeがエラー

Visual Studio C# 2010で対象フレームワークを.NET Framework 4.0にしてプログラムを作成し、sgen.exeを実行したら以下のエラーが発生した。

エラー: 正しくない形式: xxxxxxxx.exe のアセンブリを読み込みしようとしました。
- ファイルまたはアセンブリ 'file:///xxxxxxxx.exe'、またはその依存関係の 1 つが読み込めませんでした。このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。

3.5以下であれば特にエラーもなく実行できる。
調べたところ、バージョン4.0以降は別の場所においてあるsgen.exeを使わなければいけないらしい。

3.5まで:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\sgen.exe
4.0以降:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe

2011年8月25日木曜日

WebClientの初回処理に時間がかかる

C#でWebClientを使うと起動後一回目の処理だけ、異常(10秒以上)に時間がかかる。
内部でプロキシ絡みの処理をやっていてタイムアウトが起っているらしい。

対策にはapp.configのconfigurationタグ以下に↓を追加する。
  <system.net>
<defaultProxy
enabled="false"
useDefaultCredentials="false" >
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>

またはプログラムを↓のようにしても良い。
  WebClient webClient = new WebClient();
webClient.Proxy = null;

副作用としてプロキシが必要な環境では処理ができなくなる。

2011年8月22日月曜日

Gitで過去をやり直す方法

・間違ってコミットしたファイルを過去の履歴も含めてリポジトリから一括削除したい。
git filter-branch -f --index-filter 'git update-index --remove "削除ファイルパス"' HEAD

・名前やメールアドレスを設定せずに作業を始めてしまったので一括して治したい。
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "unknown" ];
then
GIT_AUTHOR_NAME="新しい名前";
GIT_AUTHOR_EMAIL="新しいメールアドレス";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD

関連付けの変更で指定したいプログラムが出てこない

プログラムを置くディレクトリを移動したら関連付けの設定が古くなり、ファイルをダブルクリックしても関連付けされたプログラムで開けなくなったため、関連付けの設定を新しいプログラムの置き場所に更新しようとして困った事が起こった。

[ファイルを開くプログラムの選択]画面から[参照]ボタンを押して、新しい場所のプログラムを何度選択しても、一覧にそのプログラムが表示されず、設定が治せないのだ。

Webで調べたところ以下のような事象らしい。

プログラムで一度関連付けを行うと、そのプログラムのパス情報がレジストリに保存される。
→ 推奨されるプログラムの一覧の表示ではその情報を元にプログラムの存在を確認しており、移動によって存在しなくなったプログラムは一覧に表示されなくなる。
→ ユーザが新たに移動後のプログラムを選択しても、同じ名前のプログラムの情報がレジストリに既に存在している場合、そちちの情報が優先され、ユーザの選択結果は無視され捨てられる。
→ 結果、一覧には表示されない。

regeditから「HKEY_CLASSES_ROOT\Application\プログラムの実行ファイル名」を消すことで出てくるようになった。

Microsoftさん、いくら何でもこの仕様は腐りすぎじゃあないですか?

DLLの共有セクションを使う場合の注意点

グローバルフックを使用するときなど、複数のプロセスでデータを共有するために、DLLの共有セクションを使う場合がある。
この時、共有する変数は宣言と同時に明示的に初期化しなければ、共有されないので注意すること。

#pragma comment(linker, "/SECTION:.SHAREDMEM,RWS")
#pragma data_seg(".SHAREDMEM")
int shared_ng;                                //NG
int shared_ok = 0;                            //OK
struct shared_struct shared_struct_ng;        //NG
struct shared_struct shared_struct_ok ={0};   //OK
#pragma data_seg()

初期化していないグローバル変数は自動的に0に初期化されることになっているわけだけど、このためにBSSという専用のセクションが用意されていて、スタートアップルーチンでクリア処理が走る。
そのため、初期化をしていない変数はせっかく用意した共有用のデータセグメントではなく、BSSセクションに置かれてしまい共有できないということらしい。

Windows7でグローバルフックが効かなくなる

グローバルフックを使ったアプリを使っていたら、起動直後はちゃんと動くんだけれどそのうち動かなくなるという現象が発生していて、調べてみたらWindows7から少し仕様が変わったらしい。

http://blogs.msdn.com/b/alejacma/archive/2010/10/14/global-hooks-getting-lost-on-windows-7.aspx

フック処理がタイムアウト(300ms)を10回超えちゃうと、グローバルフックが解除されてそのプロセスからは二度と有効化できないと…

はっきり言ってこれは仕様不良。フック処理で重い処理を走らせないように作っても、一定以上の負荷がかかることもあるPCでタイムアウトを起こさないなんてことは無理。スワップアウトしてIO待ちで終わり。実際、if文で整数の値を判定してreturnするだけの処理ですらタイムアウトした。

レジストリの値を変えてタイムアウトを大きくすることで多少低減できるらしいので、アプリ起動時に値を追加しちゃうという手はある。勝手にシステムのレジストリの値を変えるのは良くないという人もいそうだけど、グローバルフックを利用したアプリがまともに使えないバグ持ちのOSを治すパッチを当てているみたいなものなので勘弁して欲しいものだ。
HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeoutを大きくすれば良いんだけど… どのくらいにすれば回避できるんだろうか…

アプリをマルチプロセス構成にして、一定時間ごとに再起動をかけさせるのが正しい対処法なのかもしれないけど、こんな腐れた仕様にあわせてそんな面倒なことしたくない。

(後記:と言いつつマルチプロセス構成にしてしまった。他にもっとエレガントな解決法はないんだろうか。)

2011年8月19日金曜日

マルチモニタ環境でmpc-hcの表示ディスプレイを移動すると再生が一瞬止まる

モニタ間でmpc-hcのウインドウを移動すると、ちょっとの間再生が止まってウインドウがブラックアウトする現象の回避策。

[ツール]-[オプション]-[再生]-[出力]
DIrectShowビデオに「EVR カスタムプレゼンタ」を選んでEVRカスタムプレゼンタの設定で「表示変更時に再初期化」のチェックを外す。

あとはフルスクリーン状態で動画再生中に別のモニタのウインドウをクリックしてアクティブ化すると何故か勝手ににフルスクリーンが解除されてしまうことがある問題を何とかしたいんだが…

ついでに変更している設定の覚え書き。
[表示]-[オプション]
-> [プレイヤー]
--> 再生するメディアファイルごとに新しいプレイヤーを開く。
--> 「設定を.iniファイルに保存」のチェックを有効化。
-> [再生]
--> Default track preferenceを「jap」に
-> [再生]-[フルスクリーン]
--> フルスクリーンモニターに大きい方のディスプレイを選択
->[プレイヤー]-[キーバインド]
--> 「プレイリストバーの表示」に「Middle Down」を割り当てる。

[表示]-[常に手前に表示]:再生中
[再生]-[再生終了後]:フォルダ内を順次再生

git入門

・gitの基礎知識
gitの特徴はローカルリポジトリを持てることだ。cvsやsubverionだと、リポジトリはサーバで一元管理され、コミット時は毎回サーバとのやり取りが発生する。サーバにアクセス出来ない環境ではコミットは行えないし、レスポンスもどうしても悪くなる。
gitでは従来のリポジトリをリモートリポジトリと呼び、これに加えてローカルリポジトリというものが導入されている。リモートリポジトリをローカルリポジトリにコピー→コミットはローカルリポジトリに対して行う。→一段落したらローカルリポジトリの変更をリモートリポジトリに反映という使い方をする。
リモートリポジトリには慣習として、名前に .git を付加する。また、リポートリポジトリのブランチにはorigin、ローカルリポジトリのブランチにはmasterという名前が付けられる。

直している最中のディレクトリの中身を作業ツリーと呼ぶ。コミットは作業ツリーの中身を直接登録するのではなく、インデックスと呼ぶ記録域に一時的に登録してから行う。最新のコミットはHEADと呼ぶ。

・特定のファイルをコミット対象から外したい。
git config --global core.excludesfile ~/Dropbox/git/.gitignore

.gitignore
*.obj
*.exe
*.o
*.lib
*.suo
*.pdb
*.ncb
*.exp
*.suo
*~
*.bak
AssemblyInfo.cs
Debug/
Release/

・ユーザ名、メールアドレス設定
$ git config --global user.name "nazochu"
$ git config --global user.email "nazochu@example.com"

・リポジトリを作る。 (With Dropbox)
自分のやりたい使い方というのはリモートブランチをDropboxの同期ディレクトリ内に置くというもの。

# リモートリポジトリ準備
cd ~/Dropbox
mkdir git
cd git
mkdir test.git
cd test.git
git --bare init
#ローカルリポジトリの準備
cd 既存の開発ディレクトリ
git init
git add .
git commit -a
# git pushと打つだけでリモートリポジトリの情報が更新されるよう、
# リモートリポジトリがどこにあるかなどの情報を登録しておく。
git remote add origin ~/Dropbox/git/test.git
git push -u origin master

後は、ローカルリポジトリのディレクトリ以下のファイルを更新したら
git add . → git commit -a → git push でOK

addでインデックスに登録、commitでローカルリポジトリにコミット、pushでリモートリポジトリに反映。

・タグを付ける
git tag 0.1.0.0
git tag -l
# タグ情報をoriginへ
git push --tags

・コミットしたけど漏れがあった。
git add .
git commit --amend

・git addを全部取り消したい
git reset HEAD

・編集中のファイル全てを最後にコミットした状態に戻したい。
git chechout .

・リポジトリとaddしたファイルの差分を見る
git diff --cached

・addしたファイルの情報を見る。
git status

・addしたファイルと最新コミットのファイルの差分を見る
git diff

・編集中のファイルと最新コミットのファイルの差分を見る
git diff --cached

・コミットの履歴を見る
git log

・git pushがrejectされる。
正しい対応策
git pull
git push

ただ、自分一人しか使っていないリポジトリでpushした後にcommit --amendしただけで面倒と言う場合は
git push -f

Git on Windows

参考ページ:http://sourceforge.jp/magazine/09/02/12/0530242/3

・インストール
mysysgitをインストールする。

・日本語対応
lessnkfをbinに放り込む。

C:\Program Files (x86)\Git\etc\inputrc
set output-meta off
set convert-meta off

set output-meta on
set convert-meta on
set kanji-code utf-8

C:\Program Files (x86)\Git\etc\profile
export GIT_PAGER="nkf -s | less"

~/.gitconfig
[core]
editor = 'c:/nazochu/xyzzy-utf8/xyzzy.exe'

エディタはコミット時のコメントの入力に使用し、UTF-8Nで保存しないといけない。保存時にいちいち文字コードを指定していられないので、デフォルトの文字コードをUTF-8にした状態で起動したい。
xyzzy.exe -e "(set-buffer-fileio-encoding *encoding-utf8n*)" で行けるのだが、.gitconfigに括弧を含む値を記載すると思い通りに動いてくれなかったため、xyzzyを別の場所にコピーしてメニューの設定からデフォルトの文字コードを変えてそちらを使うという力技で対処した。

Git Bashでgitと打った後、Tabを押すとハングして反応が帰ってこなくなる現象が発生した。
C:\Program Files (x86)\Git\etc\git-completion.bash が悪さをしていそうだったので、
一時的にファイル名を変えたら、現象は再現しなくなった。
そしてファイル名を元に戻したら、何故か二度と再現しなくなった。

Ruby on Windows

テキストのプログラム言語を自動的に判別するlinguist(https://github.com/github/linguist)というライブラリがあることを知って使いたくなったけれど、Rubyで書かれているらしい。試すためにWindows上で環境を作ろうとしたらちょっとハマったのでメモ。
Rubyの実行環境は簡単に作れたんだが、linguistがbundler(ruby版aptやportsみたいなものらしい)を使っていたり、拡張ライブラリを使っているせいでコンパイルが必要だったりして面倒だった。
bundlerは裏で色々やってくれるのはありがたいんだけど、内部で何をしているのかが直観的に分かり難かった。
任せきりにしてもエラーが発生しないならブラックボックスとして使えるので良いんだろうけどまだその域には達していなさそう。Linuxで使うならもっとスムーズに行くのかもしれないけど。

rubyをダウンロードして解凍。(以下、C:\nazochu\rubyに置いたとして記載)
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html

PATHを変えるのは嫌だったので以下のbatファイルを作成してrubyを使う時はこれからコマンドプロンプトを開くようにする。
set path=%path%;C:\nazochu\ruby\bin
%comspec% /k

lignuistのHPにあるとおりにやってみる。
git clone https://github.com/github/linguist.git
cd linguist/
gem install bundler
bundle install
bundle exec linguist bin/linguist

エラーが色々出てくるので順番に解決していく。

・DLLが見つかりませんのポップアップ

以下から落としてきてbinに放り込む。

zlib, readline : http://jarp.does.notwork.org/win32/
openssl : http://www.limber.jp/2005/04/05/316
iconv : http://sourceforge.net/projects/gettext/files/libiconv-win32/

・nmakeが見つかりません。

必要な環境変数が設定されていないせい。Visual Studio 2008コンソールからbundle installを実行する。

・MSC version unmatch: _MSC_VER: 1200 is expected.

C:\nazochu\ruby\include\ruby-1.9.1\i386-mswin32\ruby\ruby.hを修正する。
#if _MSC_VER != 1200

#if _MSC_VER < 1200

・'VALUE' : この型は演算子として使用できません、みたいなエラー

VC++はC99に対応していないのでブロックの最初以外で変数が宣言されるとエラーになる。
escape_utils.cの拡張子を.cから.cppにリネームしてC++としてコンパイルすることで回避。

・rb_define_methodとかで型エラー

1つ前の対策の副作用。C++になったことで関数ポインタの型が合わなくなったのでキャストを追加。
rb_define_method(mEscapeUtils, "escape_html", rb_escape_html, -1);

#define RB_FUNC(f) reinterpret_cast(f)

rb_define_method(mEscapeUtils, "escape_html", RB_FUNC(rb_escape_html), -1);

・hexCharsのところでエラー
const unsigned char hexChars[16] = "0123456789ABCDEF";

const unsigned char hexChars[17] = "0123456789ABCDEF";

・修正したソースファイルを使わせるにはどうするの?

bundlerで自動ダウンロードされるソースを修正したのだが、bunder installを使うと修正前のファイルで上書きされてしまうため困った。しょうがないのでエラーとなるgemだけ、bunderを使わずにインストールすることにする。
cd C:\nazochu\ruby\lib\ruby\gems\1.9.1\gems\escape_utils-0.2.3\ext\escape_utils
nmake
cd C:\nazochu\ruby\lib\ruby\gems\1.9.1\gems\escape_utils-0.2.3
gem build escape_utils.gemspec
gem install --local escape_utils-0.2.3.gem
ここまでやってbundle installに成功。

・MSVCR90.dllが見つからない。
bundle exec linguist bin/linguistと実行したら怒られた。
ランタイムを入れても良いけど必要ないようにコンパイルオプションを変更してmakeをやり直し。

C:\nazochu\ruby\lib\ruby\1.9.1\i386-mswin32\rbconfig.rb
CONFIG["CFLAGS"] = "-MD -Zi -W2 -O2b2xg- -G6 -Zm600"
CONFIG["CXXFLAGS"] = "-MD -Zi -W2 -O2b2xg- -G6 -Zm600"

CONFIG["CFLAGS"] = "-MT -Zi -W2 -O2b2xg- -G6 -Zm600"
CONFIG["CXXFLAGS"] = "-MT -Zi -W2 -O2b2xg- -G6 -Zm600"

・異常に遅い。

そこそこ新しいPCなのに4秒以上かかる。本処理の前の起動処理で時間がかかっているみたいだ。
bunder経由での起動をやめたらかなり早くなった。

lib以下のファイルをruby -e "puts $LOAD_PATH"で出力されるディレクトリのどこかに置くようにして、
rubyコマンドで直接起動。

2011年8月15日月曜日

BloggerでCSSを設定する方法

Bloggerとかだと投稿欄はWebの表示のコピペを属性付きで受け入れられるので、コードとかを枠付きので記入したいときWebから適当にコピペすればできちゃうんだけど、それだと後で背景色とか枠線のフォーマットとかを変えたくなった時に困るのでCSSで指定する方法を調べてみた。

(1) [デザイン]-[テンプレートデザイナー]-[アドバンス]-[CSSを追加]

#code{
  border: solid 1px #000000; padding: 10px;background-color:#f0ffff;
}

(2) 投稿時、[HTMLの編集]を選んで以下のような感じで記入
<div id="code">
test
</div>

【結果】
test

2011年8月12日金曜日

VirtualBoxでエロゲの薦め

自分は最近エロゲをやるときはPCに直接インストールするのではなく、VirtualBoxという仮想環境上にインストールしてやるようにしている。なぜそんなことをしているのか? スタートメニューやプログラムの削除画面を他人に見られても大丈夫なようにという理由がないとは言わないが、もっと嬉しいご利益があるからだ。

ゲームをやる時はやっぱりフルスクリーンモードでやりたい訳だけど、そうすると困るのが同時にゲーム以外のウインドウをちょっと操作したいという時に切り替えが面倒ということだ。デュアルディスプレイ環境ならいくらか軽減できるけど、ゲームによっては起動すると別のディスプレイに移動できなくなってしまう。ちょっと飽きたんでゲームを一時中断してネットでも見ようかという時も、ゲームを落とさないと片方のディスプレイだけで使いづらい。
かといってウインドウモードでやる場合にも、最近のHD対応の1920x1080のディスプレイで、昔の640x480のゲームをやると、ウインドウが小さすぎてやってられない。

このどちらもVirtualBoxを使うと解決できてしまうのだ。VirtualBoxにはスケールモードという機能があって、仮想環境のデスクトップを好きな大きさに拡大・縮小することができる。つまり、仮想環境内でフルスクリーンでゲームを起動し、スケールモードを使ってウインドウの大きさを変えれば好きな大きさのウインドウでゲームをすることが可能になる。

ただ、この状態でウインドウをディスプレイの大きさ目一杯まで拡大し、フルスクリーンのようにゲームをしようしても、ウインドウに枠線があったり、タイトルバーがあるせいで、微妙にフルスクリーンと同じようにはならない。でも↓のツールを使うことでタイトルバーや枠線を消してフルスクリーンと同じ状態でゲームをすることができる。
https://sites.google.com/site/nazochu/Home/tools/autoscale

この似非フルスクリーンだがマルチディスプレイ環境で別のディスプレイへの移動を妨げられることもないし、ゲーム以外のウインドウを重ねて表示することもできるし、通常のフルスクリーン状態に比べてとても使い勝手が良い。仮想環境を使わなくても初めからこういう動作をしてくれれば良いのに。

最後にデメリットがないわけではないので書いておく。まず、仮想環境では起動しないゲームがたまにあることだ。タイプは2つあって、新しすぎてDirect3DのにVirtualBoxが対応しきれていないタイプと、古すぎてDirect2Dのバグが残ったままになっているタイプだ。手元のソフトで数えてみると、10%行かないくらいだった。

VirtualBoxはDirect3Dにも対応したんだけれど、最近だし、まだまだ穴はあるみたい。これはそのうち解決されていくと期待している。一方古いゲームでできない奴は対応の優先度が低そうなので、ちょっと不安。

あと、普通のゲームならともかく3Dを駆使しているやつだとPCのパフォーマンスに問題が出るかもしれない。(自分のやった範囲では問題にはならなかったが)

最後にWindowsのライセンスが余計に必要になる。意外と高い。

2011年8月10日水曜日

VirtualBoxでディスクイメージファイルを再構築する。

(1) ディスクの空き領域をゼロクリアする
Microsoftの配布しているツール(sdelete)が使える。

http://technet.microsoft.com/ja-jp/sysinternals/bb897443(en-us).aspx

sdelete -c 対象ドライブ

(2) 再構築
REM uuidを調べて
 vboxmanage list hdds

REM 再構築実行
 vboxmanage modifyhd [UUID] compact

Windows Updateを使わずにセキュリティパッチを一括入手

久しぶりにプログラムを作った。Windows2000以降なら動くようにはしたいなと思い、動作確認用に仮想環境にWindows2000をセットアップして知ったけれど、Windows2000用のWindows Updateってもう終了していたのね。プログラムの動作確認用でネットに接続するわけではないので、パッチがあたってなくても致命的ではない気がするけどなんか気持ちが悪い。

とはいえ、さすがに手作業で1つずつパッチをインストールする気にもなれず、いい方法がないか探してみたら↓を見つけた。

Windows Updates Downloader
http://www.windowsupdatesdownloader.com/

セキュリティパッチを一括ダウンロードしてくれるソフトで簡単にパッチが一括ダウンロードできた。

後はインストーラを全部実行すれば良い。
これも手作業でやるのはバッチファイルでもつくろうと思ったけど、ネットを探したらスクリプトが簡単に見つかった。

http://w-lab.sblo.jp/article/1308604.html

そんなわけで思ったより簡単にアップデートが完了。

インテリセンスのファイル格納場所の変更

Visual Studio C++ 2010で作ったプロジェクトをWebで配布しようとして、圧縮ファイルにするとやけにサイズが大きいことに気が付く。
これはインテリセンスという入力補完などをやってくれる機能があり、この機能がキャッシュファイルなどの一時ファイル的なもの(.sdf、.ipchなど)を作るのだが、その出力先がプロジェクトディレクトリ内であるせいだ。これをプロジェクトディレクトリ内から別の場所にする設定をメモ。

(1) メニューから[ツール]→[オプション]
(2) [テキスト エディター]→[C/C++]→[詳細]にある、[常にフォールバック位置を使用]をTrueに設定し、[フォールバック位置]に適当なディレクトリを選ぶ。