Author Archives: admin

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ファイルを表示出きるのでできると思うがいまはスルー。

VC2010でC++11を試してみる-右辺値参照

C++がすごく進化しているみたいなので少し調べてみた。

・右辺値参照 T&&

まず右辺値とは代入できない式のこと。

この例では、下2つが右辺値に代入しているのでエラーになる。
いままでのC++の参照には左辺値右辺値の区別がなかった。右辺値の定義をもう少し進めると&や*でアドレスが取得できない式であることがわかる。そしてC++の参照には右辺値を設定することはできない。

以下のコードを考える。

data1=data2では本当にコピーしないといけないが、data1=func()のときはポインタだけコピーすればいい。
そこで右辺値参照を使って以下のように書いてみた。

data1=func()のときは右辺値参照が引数となったoperator=()が呼ばれる。

data1 = data2のときも右辺値参照で呼びたいときにはmove()を使う

XPでVC6がインストールできない。Acmeが見つかりませんと表示される

コマンドプロンプトで以下を実行。アンチウイルスは切っておく

SSS.STFはSETUPフォルダにあるやつに合わせる
フルパスで書く。
E:\はsetup.exeがあるフォルダに合わせる
YYY-YYYYYYYはライセンスキーに合わせる

VS6SP6のインストール

VirtualBoxのホストオンリーネットから外部に接続する

企業などのLANでは内部のPCからそとへの80へのアクセスができなくて、プロキシなどを立てていることがあるので、それを再現したようなVMをつくる。

VirtualBoxのネットワーク設定でHost-only Adapterを選択する。
b76640bd-c82b-48bf-9dbf-63516a875844
ホストオンリーだとNATと違いパケットは外に出れない。このIPはVirtualBoxインストール時にできたネットワーク配下にある。ホストは”VirtualBox Host-Only Network”という仮想カードがつくられており、このカードとこのホストオンリーネットはつながっている。

ホストのアドレスは192.168.56.1になっているので、ここにプロキシを立てて仮想VMで参照する。

VirtualBoxはデフォルトでDHCPが動いているがこれも自分で立てるので無効にしておく。
c9ba117d-2885-4329-8cd3-65fd1f30ccfb

ホスト側でサーバを立てる。ここでは多機能で簡単なBlackJumboDogをつかう。
起動したらオプションプロキシブラウザを選択して有効にする。待ち受けアドレスは192.168.56.1にしておく、ACLで全部許可する。
fce7bddd-0919-4702-a4c4-50c8c0846594

同様にDHCPも立てる。
b59791ee-9d1a-42df-9f7e-931e350f4e18

VMを起動する。
IPアドレスがDHCPによって設定されるかを確認する。BJDにログが出る。

この段階では普通にブラウジングできないはず。
プロキシを192.168.56.1:8080に設定する。
cbcad556-af66-4720-9271-e6d457fb24c5

これでできた。

virtualboxでハードディスクを拡大する

12Gに拡大したいときは以下のようにコマンドラインから実行する

単位はMBで指定する。12288=12 * 1024