packとunpack

perlやphpにあるpack,unpack関数はシリアライズとデシリアライズを行う関数です。シリアライズとは数値や文字列をバイナリ表現にすることで、デシリアライズはその逆です。シリアライズしたデータはネットワークに送ったり、保存したりしやすくなります。しかしシリアライズには常にいろいろな問題が付きまといます。

文字列をpackする。

文字列をpackするには常に長さを固定して行います。以下の例は長さ10バイトでpackします。

$str = "abcd";
$b = pack("a10", $str);

“a10″のaは文字列を表し、10は長さを指定します。$strが10バイトより短ければ、残りの部分はnullでうめられます。”a10″の代わりに”A10″とすればスペースで埋められます。

文字列をunpackする。

$str = "abcd";
$b = pack("a10", $str);
$str2 = unpack("a10", $b);

上の例のように、packやunpackの最初の引数はどのようにシリアライズやデシリアライズするのかを指定します。しやしややこしいのは、この引数はpackとunpackで対照的でなく、しかもperlとPHPで挙動が違うことです。その上PHPにはまともなマニュアルがないのでここではperlを中心に考えます。上記の例だと$str2にはnullが6ついていて、$strと同じではありません。

そこでこの第一引数である型指定について、文字列に関してまとめると次のようになります。

packの”a10″ : 10バイトとってくる。残りはnullで埋める
packの”A10″ : 10バイトとってくる。残りはスペースで埋める
packの”Z10″ : “a10″と同じ
unpackの”a10″ : 10バイトそのままとってくる。
unpackの”A10″ : 10バイトとってきてnullやスペースで埋まってるものを取り除く
unpackの”Z10″ : 10バイトとってきて最初のnull以降を取り除く

よって以下のようにすればいいはず。
$str = "abcd";
$b = pack("a10", $str);
$str2 = unpack("A10", $b);

しかしこれだと、以下のようにうまくいかなくなる場合もある。
$str = "abcd ";
$b = pack("a10", $str);
$str2 = unpack("A10", $b);

まとめ

aやAやZはあんまり使わない方がいい?

つづく

vmwareでゲストOSの優先度を変える

vmwareのゲストOSの優先度は固定ではなく、ゲストOSの状態に応じて変えることができる。状態にはgrabbedとungrabbedの2種類あり、grabbedはゲストOS内でマウスが動くような状態、ungrabbedはそうじゃない状態のこと。

これは.vmxファイルで指定でき、通常は、あるいは指定が無いときは以下のようになっている。

priority.grabbed = "normal"
priority.ungrabbed = "normal"

これだとどちらの場合もプロセスの優先度は「通常」になる。ここで指定できる値は以下の3種類がある。

“idle” : 優先順位が低い
“normal” : 通常
“high” : 優先順位が高い

2つのゲストOSを同時に動かすとき、どちらの設定もnormalだと、動かすのがきつい場合、以下のように設定しておけば少しは楽になる。

priority.grabbed = "normal"
priority.ungrabbed = "idle"

こうすれば優先度が「通常」になるのは常にどちらか1つになる。

また以下のようにすれば、常に高い優先度で動かすことになる。

priority.grabbed = "high"
priority.ungrabbed = "high"

WEBサーバなどを動かしている場合は、このようにしておけば、ホストOSが忙しくなっても応答が遅くなりにくくなる。

実際に優先度を確認するには、タスクマネージャを起動し、[表示]→[列の選択]から[基本優先度]がチェックされているか確認し、vmware-vmx.exeの基本優先度を確認すればいい。

headとtailコマンドを使って特定の行のみを表示する

headコマンドはデフォルトでファイルや標準入力の最初の10行を表示する。

tailコマンドは最後の10行を表示する。

どちらも-nオプションを使えばこの10を任意の値に変更できる。そこでこの2つのコマンドを使えば、任意の行または任意の連続した範囲の行を出力できる。

あるコマンドの3行目を出力する。

$ command | head -n 3 | tail -n 1

あるコマンドの5~7行目を出力する。

$ command | head -n 7 | tail -n 3

タブにフォーカスしない

Win32のTabControlにフォーカスを設定しない方法。

標準ではタブをクッリクするとフォーカスが設定されて、フォーカスレクトの四角が表示される。

タブコントロールのウインドウスタイルTCS_FOCUSNEVERを指定すればフォーカスが設定されないと思ったのだが、うまくいかなかった。フォーカスレクトが表示されてしまう。

そこで次に考えられるのがオーナードローにする方法だが、これだと全部自分で書かなければならなくなるのでやりたくない。

そこで、フック機能をつかって実現することができた。

SetWindowsHookExでWH_CBTを指定すれば、コールバック関数がHCBT_SETFOCUSで呼ばれる。ここで1を返せば、フォーカスをさせないことができる。

よって具体的な実装方法は以下のようになる。

  1. WM_CREATEの時にSetWindowsHookExでフックを仕掛ける。
  2. コールバック関数で、タブにフォーカスが来たときはそれを無効にする。
  3. WM_DESTROYの時にUnhookWindowsHookExを呼んでフックを解除する。

コードの断片は以下

実行ファイル
プロジェクトファイル(VC6)

phpMyAdminのインストールではまる

phpMyAdminはMySQLをブラウザからいろいろできるツール。便利ですがインストールでいつもはまるのでインストールの方法を書いておきます。

なぜインストールではまることが多いかというと、クッキーが悪さをするからです。以下の手順の前にクッキーを削除してください。

1、phpMyAdminroot/configディレクトリがある場合は削除する。

2、phpMyAdminroot/config.inc.phpをつくり以下のようにする。MySQLServerRootPasswordの部分をMySQLのrootのパスに変える。

ウェブデザイン 10の掟

businessweek.comにウェブデザイン10の掟と題する記事が載っています。ウェブデザインの偉い人たちが人気のあるサイトを基準にして選んだものだそうです。

  1. FLASHを乱用しない
  2. メインのコンテントを隠さない
  3. ページを散らかさない
  4. ページをキラキラさせない
  5. Web2.0のサイト名を無意味に長くしたり、無意味に母音を省いたりしない
  6. 生テキストを崇拝する
  7. ユーザが夢中になれるサイトをつくる
  8. サイトはソーシャルであるべき
  9. 成功した技術を受け入れる
  10. 内容を充実させる

またBestサイトとWorstサイトをスライド形式で紹介しています。Worstサイトからいくつか抜粋してみます。

AT&T
散らかっててナビゲートしずらいそうです。

Smibs
名前がよくないそうです。

Pier1.com
家具を売っているところなんですが、お店らしくないそうです。

X Window Systemで他のディスプレイを使う

X Window Systemの特徴の一つは、アプリケーションの実行とその表示がクライアントサーバモデルになっていることだ。アプリケーションをあるマシンで実行し、その表示を別のマシンで行うことができる。通常は1台のマシンで実行、表示しているが、このときも内部的にはクライアントサーバモデルで動いている。このためWindowsなどと比べると表示がもっさりしてしまう原因にもなっていると思われる。Windowsでは表示命令は即座にカーネルレベルに入って表示されるため速い。

X Window Systemにおいては、アプリケーションを実行するマシンをXクライアントといい、それを表示するマシン、すなわちディスプレイがつながっているマシンをXサーバという。

ここではXサーバにFreeBSD7を使って実験してみた。というのもLinuxの多くのディストリビューションではXが-nolisten tcpオプションで起動されているため、ローカル意外のXサーバとして動かないらしいからだ。XクライアントにはUbuntuを使った。ネットワーク構成は以下のようになっている。

FreeBSD7=192.168.0.120
Ubuntu=192.168.0.228

まずFreeBSD7側でUbuntuからのアクセスを許可する。xhostを使って行う。

[freebsd7]$ xhost +192.168.0.228

つぎにUbuntu側で環境変数DISPLAYを指定して、アプリケーションを実行する。

[Ubuntu]$ DISPLAY=192.168.0.120:0 xeyes

成功すれば、freebsd7にxeyesが表示される。このときxeyesはUbuntuで実行されており、freebsd7にはxeyesが存在しなくても関係ない。またUbuntuではXが起動していなくてもいい。よってUbuntuのXがぶっ壊れて起動しなくなったときこの方法が役に立つかもしれない。

しかし実際にはこの様な機能はほとんど使用されておらず、通常はVNCなどを使うことが多い。アプリケーションなどもこのような使い方を想定してない場合も多いようで、firefoxなどは既にローカルで起動している場合、–no-remoteなどを付けてもうまくいかなかった。またサウンドはXクライアントから出力される。

freebsd7を元に戻す。

[freebsd7]$ xhost -192.168.0.228

▽関連記事
xorg.conf覚書

protocol buffer 覚書

protocol bufferはgoogleが作った、構造化データのシリアライズ方式。以下の特徴がある。

  • XMLより簡単で早い
  • 生バイトでやるとポービリティ問題になるが、それが大丈夫
  • IDLみたいだがIDLより簡単

使い方

最初に.protoファイルを作る。このファイルにデータ構造を定義する。例えば以下のようになる(googleより引用)

これをコンパイラ(protoc)を使ってコンパイルする。コンパイルの生成物はC++やJavaのクラスとなる。C++の場合出来上がったファイルをコンパイルするにはprotocol bufferのヘッダファイルやライブラリが必要になる。

protocol bufferで提供さているファイル一式にはVisual C++の.slnファイルが含まれているので、これをVC+ 2005 Express Editionなどで開けばライブラリをビルドできる。

コードのビルド時、libprotobuf.libを読み込ませる必要があり、実行時にはlibprotobuf.dllが必要になる。

サンプルプログラム

上記ソースを実行するとPersonのdtorでエラーが出る。読みきれなかったのでスルー。

Visual C++ 2005でデータブレークポイントを使う

データブレークポイントとはある変数の値が変更されたりしたときにブレークするブレークポイントです。以下のソースにおいて19行目のf3()の呼び出し後、iの値が変わったときブレークしたいとします。

まず普通にステップ実行して19行目まで来ます。ここでiのアドレスを知る必要があります。メニューからデバッグウインドウ逆アセンブルを開きアセンブラでステップ実行すると以下のようになります。


このときeaxレジスタに入るのがiのアドレスです。メニューからデバッグブレークポイントの作成新しいデータブレークポイントを選択し、この値を以下のようにデータブレークポイントで設定します。


(この例では実際にアドレスを調べる必要はなく、上のダイアログでは&iと打ち込めばよかったみたいです)

OKをクリックして、実行を再開すれば、以下のようにiの値が変化した直後にメッセージボックスが表示されブレークします。

Nautilusで常にフォルダを表示する

FedoraやCentOSのNautilus(ファイルマネージャ)は起動したときにフォルダビューを表示してくれない。コマンドラインで以下のように起動すればフォルダビューを表示できるが、それをパネルやデスクトップから起動した場合でも、デフォルトで表示させる方法。

コマンドラインでフォルダビューをつけて起動させる。

$ nautilus –browser

デフォルトでフォルダビューをつけて表示させる

デフォルトで表示させるためにはgconfの設定を変えればいい。gconfとはWindowsでいうところのレジストリみたいなもの(参考)。gconfの設定を変えるにはgconf-editorを使うのが簡単。

gconf-editorを起動して、以下のように/apps/nautilus/preferences/always_use_browserをチェックすればフォルダビューつきで起動するようになる。