コンテンツ
システムファイルの所有権問題でハマる on Windows Vista
テスト用にVistaのhostsファイル(C:\Windows\System32\drivers\etc\hosts)を書き換えようとしたんだけど、このファイルはシステムファイルなので、当然一般ユーザー権限では書き換えられない。そこで、管理者権限でコマンドプロンプトを実行し、vimで編集したわけなんだが、このときvimは「編集後のファイルを別のファイルに保存→オリジナルのファイルに置き換え」というステップを踏んでくれていたためにファイルのパーミッションが変わってしまうという問題発生。
編集後のファイルは、自分のみ「フルコントロール」、「Everyone」と「None」にファイル属性の読み取りのみ許可、というパーミッションになっていて、そのためシステムがhostsファイルにアクセスできなくなり、hostsに何を書いてもそれが適用されない状況に。結局、問題がパーミッションにあることに気付いたのは10数分後……。
公式には「hostsファイルの編集には管理者権限で起動したメモ帳を使え」と言われているのですが、他のエディタを使うとこういうトラブルになるよ、ということで。しかし、「SYSTEM」のパーミッションがないと本当にシステムもアクセスできないのね>NTFSのパーミッション仕様。
MSys&MinGWをインストール
MinGW でのビルドを前提とされたツールをCygwin上でビルドするのが面倒だったので全力で MSys とMinGWをインストールした。MSysGitも入っているので環境汚れまくり。
SourceForge.JP のミラーからMinGW 5.1.4.exeとMSYS-1.0.11-rc-1.exeをダウンロードしてそれぞれインストール。MSYSは結構下の方(MSYS Base Systemの中)にあるので探す。
それぞれインストール後、「C:\msys\1.0\etc\fstab.sample」を同じディレクトリに「fstab」という名前にコピー、下記のようにMinGWとActivePerlをインストールしているディレクトリに対応付ける。
c:/MinGW /mingw c:/Perl /perl
あとはスタートメニューの「MinGW」-「MSYS」-「MSYS」などからシェルを起動。gccがエラーを日本語で吐いてくれるのだがWindowsのコマンドプロンプトだと化けるのでexport LANG=Cを適宜設定。
GCC 4.4系を使う
GCC 4.4系を使うには別途インストールが必要。「gcc-4.4.0-mingw32-notes.txt」に解説があるが、下記をMinGWのインストールディレクトリで展開すればよい。
- GMP Runtime [REQUIRED]
- gmp-4.2.4-mingw32-dll.tar.gz
- MPFR Runtime [REQUIRED]
- mpfr-2.4.1-mingw32-dll.tar.gz
- POSIX Threads for Win32 Runtime [REQUIRED]
- pthreads-w32-2.8.0-mingw32-dll.tar.gz
- Core (C) [REQUIRED]
- gcc-core-4.4.0-mingw32-bin.tar.gz、gcc-core-4.4.0-mingw32-dll.tar.gz
- C++ [OPTIONAL]
- gcc-c++-4.4.0-mingw32-bin.tar.gz、gcc-c++-4.4.0-mingw32-dll.tar.gz
なお、ドキュメントにはgcc-full-4.4.0-mingw32-bin.tar.lzmaに全部入っていると書いてあるが、GMPとMPFRとPOSIX Threadは入っていなかった……(汗)。
cl.exeの主要コマンドラインオプションメモ
最近、Visual C++をいじっているのでメモ。昔はVisual StudioでGUIでビルド設定してましたが、最近はもうmakeを使う方になれちゃったんだよね……。
| スイッチ | 意味 |
|---|---|
| 最適化 | |
| /O1 | コードを最小化 |
| /O2 | コードを最速化 |
| /Ob{0|1|2} | インライン展開方法を指定 |
| /Od | 最適化を禁止 |
| /Oi | 組み込み関数を使用 |
| /Ox | 最大限の最適化 |
| /GL | プログラム全体の最適化を使用 |
| /arch:{SSE|SSE2} | SSE/SSE2を使用 |
| 作成するコード | |
| /MD | DLL版ランタイムライブラリを使用。/MDdとするとデバッグバージョンを作成 |
| /MT | スタティック版ランタイムライブラリを使用。/MTdとするとデバッグバージョンを作成 |
| /LD | DLLを作成。/LDdとするとデバッグバージョンを作成 |
| /Fe<ファイル名> | 出力するEXEファイル名を指定 |
| /Fo<ファイル名> | objファイルを出力する |
| /Zi | デバッグ情報を生成 |
| そのほか | |
| /D<シンボル> | シンボルを定義(#defineと同等)。値を指定する場合は/D<シンボル>=<値>とする |
| /I<パス> | 追加インクルードディレクトリを指定 |
| /X | 標準インクルードパスを無視 |
| /w | ワーニング出力を無効にする |
| /Wall | すべてのワーニング出力を有効にする |
| /link | リンカにオプションを渡す |
| スイッチ | 意味 |
|---|---|
| /DEBUG | デバッグ情報(PDBファイル)を作成 |
| /DEF:<ファイル名> | モジュール定義ファイルを指定 |
| /DLL | DLLを作成 |
| /EXPORT:entryname[,@ordinal[,NONAME]][,DATA] | エクスポートする関数を指定 |
| /LIBPATH:<パス> | 追加のライブラリパスを指定 |
| /LTCG | リンク時のコード生成を有効化。/GLを指定してコンパイルしたオブジェクトファイルのリンクに必要 |
IE8のテキストエリア内テキストを外部エディタで編集
Internet Explorer 8がかなり軽快なので、最近はFirefoxと併用している。Firefoxの場合、Google Readerを使って大量のタブを開くと結構な確率でブラウザが落ちるのだが、IE8はそれがないので、最近はGoogle ReaderはIE8で見るようにしているのが大きい。
ただ、問題なのがテキスト編集。テキストエリアでそこそこの長さのテキストを入力/編集するのはしんどいので、Firefoxでは「 It’s all text 」という拡張を使っている。これをインストールするとテキストエリアの周辺に「編集」ボタンが表示され、これをクリックするとテキストエディタが起動してそこでテキスト編集ができて非常に便利である。
これに相当するものがIEにもないかと探したところ、 AreaEditor というものがそれに当たるようだ。ということで早速インストールしたところ、IE8でも利用できた。ただ、AreaEditorではテキストをエディタで開いたあと、1回目に保存したものしか反映されず、2回、3回と変更→上書き保存を繰り返した場合は変更内容がブラウザ側に反映されないようだ。自分は1パラグラフを入力したら手癖により勝手にファイルを上書き保存するため、この仕様だととても使いづらい。結局、最後にコピー&ペーストでテキストを流し込んだりしている(汗)。そのほかにもAreaEditorはIt’s all textと比べると劣っているところが多々見られるのが残念。自分で作れということか?