Author Archives: admin

tarで特定のディレクトリを除外して圧縮する

/home/fff/の下をすべて圧縮したいが、/home/fff/xxxと/home/fff/yyyは除いて実行したい場合は以下のようにする。

$ tar cfvz fff.tar.gz ls -1d /home/fff/* | egrep -v '/home/fff/(xxx|yyy)'

cfvzは順にアーカイブ作成、ファイル、冗長出力、gzipを意味する。cfvjとすればbz2を作成する。

DISPID_NEWWINDOW2でURLが取得できない

このイベントを受けた段階では取得できないです。そこで考えられる対策は以下。

  • DISPID_NEWWINDOW2はあきらめて、DISPID_NEWWINDOW3を使う。しかしこれは比較的新しい仕様なのであんまり使いたくない。
  • DISPID_NEWWINDOW2で開くIEが自アプリなら、開かれたときにbeforenavigateなどでやりたいことをやる。
  • DISPID_NEWWINDOW2で開くIEが自アプリでなくデフォルトの動作だと困る。ステータスバーなどの最後の変更を捕まえる方法もあるが、これも完全ではない。自アプリで開いてからやろうとすると、refererなど必要な情報が足りなくなってうまく開けなくなるかもしれない。
  • それにしてもなぜurlを渡す仕様にしなかったのか不思議だ。

Ubuntuで”firefox is already running”と表示される

firefoxが異常終了したあとに、メッセージが表示されfirefoxが起動しなくなることがある。これを直すには以下のようにする。

$ killall firefox
$ killall firefox-bin

killallは指定されたプロセスをすべて終了させる。上記のどちらかでいいはずだがバージョンによって異なるようなので両方かいてあります。このコマンド後正常に起動できるようになると思います。

Windowsの場合はタスクマネージャからfirefox.exeを終了させればいい。

タスクマネージャでfirefoxを終了させる

Ubuntuのsudoでパスワードを入力しなくてすむようにする

/etc/sudoersを変更する。以下コマンドを実行する。

$ sudo visudo

ここで以下のように変更する。

変更前
%admin ALL=(ALL) ALL

変更後
%admin ALL=(ALL) NOPASSWD:ALL

これはadminグループに属しているユーザが、すべてのユーザとして、すべてのホストでコマンドをパスワードなしで実行できることを示す。デフォルトではインストール時に作成したアカウントはadminグループに属している。

/etc/fstab

/etc/fstabはハードディスクなどのデバイスとディレクトリとのマウント情報を記述するファイル。システム起動時に読み込まれ、このファイルの記述に基づいてマウントされる。よってこのファイルがおかしいとシステムがおかしくなる。

1行が1つのエントリになる。1エントリは6つのフィールドで構成される。各フィールドの詳細は左から順に以下のようになる。

第1フィールド fs_spec

マウントするデバイスやリモートファイルシステムを記述する。ここではハードディスクの場合を考える。

デバイスを直接指定

/dev/sda1のように指定する。

ボリュームラベルを指定(ext2,ext3)

デバイスを直接指定すると、ハードディスクの物理的構成が変わったときに、その変更に追従できなくなる。そこでハードディスクのボリュームラベルを指定すれば、この様な問題を回避できる。以下のように指定する。

LABEL=abc

現在のボリュームラベルはe2labelコマンドで確認できる。

# e2label /dev/sda1

UUIDを指定(ext2,ext3)

UUIDは世界で常に一意になるID。これを指定すれば、ラベルを指定するよりもさらに一意性が高まる。以下のように指定する。

UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

現在のUUIDを調べるには以下のようにおこなう。

# dumpe2fs /dev/hda1|grep -i uuid

UUIDを設定するには、tune2fsコマンドを使う。UUIDはuuidgenコマンドを使って作成できる。

第2フィールド fs_file

マウントするディレクトリを指定する。

第3フィールド fs_vfstype

ファイルシステムのタイプを指定する。通常のハードディスクの場合以下のようなものがある。

  • ext2
  • ext3
  • vfat
  • ntfs-3g

第4フィールド fs_mntops

オプションを指定する。複数指定する場合はコンマで区切る。このオプションには一般オプションと第三フィールドで指定したファイルシステム専用のオプションを記述できる。

一般オプション

  • noauto : mount -aコマンドでマウントしない(ブート時自動でマウントしない)
  • user : 一般ユーザがマウントできる
  • owner : デバイスの所有者がマウントできる

ext2, ext3特別オプション

ext2はスーパーブロックにデフォルトオプションが記述してあり、ここでなにも書かなければそれが使われる。スーパーブロックの情報を見るにはdump2fsを使う。

詳細は省略。

第5フィールド fs_freq

dumpコマンドが使う。通常の場合、バックアップの対照とする場合1にする。

第6フィールド fs_passno

ブート時fsckが実行される必要があった場合参照される。0だとfsckしない。それ以外は1から順番に行われる。通常ルートファイルシステムを1とするようだ。(詳細不明)

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のパスに変える。