IO優先度を変更する

優先度と言えば通常はCPUの優先度で、これを低く設定するとそのプロセスはCPUを使いづらくなる。あるメインのタスクがあってそれを重点的にやりたい場合、このタスクの優先度を上げて、これとは別の忙しそうなタスクの優先度を下げる。こうすることによりメインのタスクは他のタスクに邪魔されずにスムーズに作業が進む。

しかしCPUの優先度を下げてもそのプロセスが大量のデータをハードディスクでやり取りしているとうまくいかなくなる。メインタスクがハードディスクにアクセスしようとしてもCPUの優先度はこの場合関係がないので、待たされることになり作業が捗らない。

そこで使うのがIOの優先度なのだが、WindowsにしてもLinuxにしてもドキュメントやAPI整備が整っていない。

Windows

もっともよくドキュメントが整備されているのがSetPriorityClass()で指定できるバックグラウンド設定だ。この設定だけは他の設定と違い、BEGINとENDで開始と終了を指定する。なぜこんなことになっているのかといえばバックグラウンドの設定だけはCPUだけじゃなくIO優先度や他の優先度(メモリ)も変更するからだと思われる。しかし制限もあり、バックグラウンドの場合だけは他のプロセスの設定を変更できない(実際にエラーになる)。

そこでこれを実現したいのだがドキュメントがないのでネットで調べるとntdll.dllで定義されるNtSetInformationProcessを使うことがわかった。

この関数は挙動が不明なところがあって、デバッガでステップオーバーすると失敗するが、普通に実行すると成功したりする。この関数でメモリとIOの優先度を変更できる。

IOの優先度を最低にするには以下のように行う。

0が返ってくれば成功。hProcessをOpenProcess()で取得する場合はフラグにPROCESS_SET_INFORMATIONを指定して開く。

Linux

Linuxの場合はコマンドのioniceがあるので、このソースを見ればいい。しかしこれもドキュメントやヘッダファイルがないようである。

ioniceから持ってきたであろう上のソースをコピペして以下のように呼ぶ。

ioprioは2つの値DATAとCLASSから構成されていてCLASSで優先度を指定する。DATAはスルー。Linuxの場合、優先度をある程度上げるときはroot権限が必要な模様でその失敗の場合-1が返る。

svnでリードオンリーにする

/repodir/repos/conf/svnserve.confでauthz-dbを有効にする

/repodir/repos/conf/passwdにリードオンリーユーザを加える

/repodir/repos/conf/authz-dbでリードオンリーに設定する。セクションのパスはレポジトリのパス

svnサーバを再起動して実験

svnコマンドに–username readonlyをつければreadonlyユーザでのアクセスになる。

コミットしようとすると以下のエラー

wheezyに本物のfirefoxをインストールする

debianではfirefoxはリポジトリにはなく、オリジナルビルドのiceweaselを使っているがこれだとプロファイルマネージャが動かなかったので本家からfirefoxをダウンロードして生インストールする。

最初にiceweaselを削除
# apt-get remove iceweasel

本家からlinux版firefoxをダウンロードする。ここではfirefox-26.0.tar.bz2をダウンロードした。

$ tar xf firefox-26.0.tar.bz2

これはソースではなく実効ファイルがそのまま入ってたからビルドする必要なかった。

/opt/fireにコピーしてシンボリックリンクをはった
# cd /usr/bin
# ln -s /opt/firefox/firefox firefox

設定ファイルを全消去してプロファイルマネージャを起動
$ cd
$ rm -rfv .mozilla/
$ firefox -ProfileManager

firefox profilemanager

flashはadobe本家からlibflashplayer.soをダウンロードして .mozilla/plugins/の中に入れるかシンボリックリンクをはる。

debian wheezyでcdを利用しない

/etc/apt/sources.listを編集してcdromになってるところを消す。

↓最初に#をつけてコメントアウト

文字コード覚書

文字コードの話は正確にやろうとすると大変なので適当に書いてみる。

文字集合:文字を集めたもの

JIS X 0208
Unicode

符号化方式:文字集合に番号をつけたもの

ISO-2022-JP
EUC-JP
Shift_JIS

コードセット

文字集合の集合、EUC-JPではASCII+JIS X 0208+その他

実際の文字コード:1バイト

US-ASCII:0から127まで使う標準的な半角英数文字と制御コード

128から255までをどう使うかでいくつかの文字コードがある

ISO-8859-1はドイツ語のウムラウトとかアルファベットの上に何らかのマークがつく文字を収録していてヨーロッパでは基本の文字コード、WindowsではWindows-1252ともいわれる。

ISO-8859-5はキリル語(ロシア語)の文字だがあんまり使われずKOI8-Rが使われるらしい。

実際の文字コード:2バイト以上

欧米件は文字数が少ないので1バイトでよかったが、漢字圏では足りないので2バイト以上になる。

Shitf-JIS:最大2バイト

もともと日本語はJIS X 0201でASCIIでつかってなかった領域にカタカナを収めて1バイトで使っていた。

漢字が表示できるようになってからは、この1バイトの使ってない領域を2バイト文字へ移行する制御コードとして使い、2バイトを利用して漢字を表現していた。

Cプログラムなどで問題になるのは2バイト文字の2バイト目が\などになった場合である。例えばパスを¥で区切るプログラムを単純に作っているとこの2バイト目の¥に引っかかっておかしくなってしまう。

EUC-JPやUTF8では2バイト目以降のバイトにこれらのASCIIは入らないのでこのような問題は起こらない。

ソフト業界が国際化してからはWindowsではUTF16を使いLinuxではUTF8を使うことが多い。UTF16は基本的に2バイト固定なので文字操作はしやすいが欧州圏からみるとメモリがもったいない。

Unicodeでは¥とバックスラッシュは区別されているが、JIS X 0201のASCII部分も実は若干変わっていてバックスラッシュのところに¥を割り当てている。文字コード変換などでShift-JISからUnicodeに変換したときもし¥がそのままUnicodeの¥になってしまうと困るので運用上はASCII部分は変換しない慣習になっている。逆にUNICODEの\(U+00A5)からShift-JISに変換した場合はバックスラッシュに変換してしまう。よってさらにこれをUNICODEに変換したら元の文字列と同じにならないことになる。日本語環境では今後もバックスラッシュにお目にかかることはないのだろう。

UTF8で書いていて本当にバックスラッシュを表示したい場合はHTMLなら

と書けばいいようだ。実際書いてみる→\

Windowsでのプログラム

Windowsでは文字コードをコードページという言い方をしているようだ。

MultiByteというのは日本語環境ならShift-JISというように、Unicode以前の2バイト以上文字列のことでWindows98とかのころのOSのデフォルトの文字コードのことだろう。

WideChar、ワイド文字とはUTF16をさす。

第一引数のCodePageは入力文字列のコードページだがCP_ACPを指定すればOSのデフォルト設定が使われ日本語WindowsならShift-JIS(codepage932)になると思われる。もっとも昨今のWindowsはこのデフォルトのコードページを変えられると思われそれは、言語設定の非UNICODEアプリの設定になると思われる。

ロケールとの関係

Cライブラリにはmbstowcsがあり、これで変換できる、LC_CTYPEがマルチバイト文字列をあらわしている。

コンパイラ

最近のコンパイラはUNICODEで保存されていてもOKなのでリテラル文字列を国際化できる。一般にはコードはASCIIのみがよいとされているものと思われるが。

VC2008ではファイルの保存で文字コードを選択できるので以下のようなコードが書ける。

XPでの実行結果

xpi18nmessage

Windows8での実行結果

8int18

コンソールで表示

wprintf()などで上のプログラムの文字列を表示しようとしてもほとんど表示できない。CRTは内部でマルチバイトにしてしまうためだとおもわれる。

以下のように強引に書いてもマルチバイトとして表示してしまう。

もともとコンソールはワイド文字仕様になっていないものと思われる。

Ubuntuのコンソールで実験

gccで上のプログラムを普通にコンパイルしても–input-charset=utf8 –exec-charset=utf8などのオプションをつけても以下のようにちゃんと表示されなかった。catなどではちゃんとutf8ファイルを表示出きるのでできると思うがいまはスルー。