SetRedrawを使ってちらつきを抑え、処理を速くする

MFCとWin32の話です。

TreeViewやListViewに多くのアイテムを追加したり、アイテムを全部削除する場合、結構時間がかかります。どうもこれは一個足したり消したりする毎に描画処理が走ってる様なので、SetRedrawを使ってこの描画を抑えることにより、処理が高速化し、ちらつきも抑えられます。

サンプルプログラム(ツリービューのアイテムを全部削除)

Win32APIの場合はWM_SETREDRAWを使います。

実際にコードを書く場合は、SetRedraw(FALSE)を呼んだあとはSetRedraw(TRUE)が必ず呼ばれるようにしたほうがいいかもしれません。また、処理が終わったら以下のようにウインドウを再描画したほうがいいかもしれません。

diffを色付きで表示するcolordiff

colordiffはdiffを色付きで表示してくれるコマンドラインツール。diffのラッパープログラムでdiffのすべてのオプションを受け取れるためdiffをcolordiffとaliasしても使えるし、例えば以下のようにdiffの出力をパイプしてcolordiffに送ることもできる。

$ svn diff aaa | colordiff

lessを使う場合は-Rオプションを付けなければならない。

$ colordiff aaa bbb | less -R

マニュアルには書いてないがsdiffの結果を渡しても動く。

$ sdiff aaa bbb | colordiff

devconコマンドをつかってドライバファイルを一覧表示

Windowsの話です。

devconコマンドを使えば、現在システムで動いているドライバのファイル一覧を取得できる。ただこのコマンドはドライバを無効にしたりもできるみたいなので、使用には注意が必要かも。ここからダウンロードできる。

以下のコマンドでドライバの一覧が表示できる。

> devcon driverfiles *

taskkillコマンドを使ってIEを一括終了する

IEがたくさん開くと全部閉じるのがめんどくさいので、Windows XPで使えるtaskkillを使って一括で強制終了させる方法。

以下のようなファイルを作成。

taskkill /f /im iexplore.exe

なまえをkillallie.batなどとして保存して、実行すればIEを全部強制終了させることができる。

Windows XPでDNSキャッシュを無効にする

現状のDNSキャッシュを見るにはコマンドプロンプトを実行して、以下のように打ち込む。

> ipconfig /displaydns

DNSキャッシュをクリアするには以下のように打ち込む。

> ipconfig /flushdns

DNSキャッシュ機能をを無効にするには以下のように打ち込む。

> net stop dnscache

有効に戻すには以下のようにする。

> net start dnscache

DNSキャッシュが有効な期限はDNSリソースレコードのTTLとレジストリの設定値に依存する。DNSがポジティブレスポンスを返したときは、TTLとレジストリの設定値の低いほうの値が使われる。このレジストリのキーはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\ParametersにあるMaxCacheTtl(REG_DWORD)でデフォルトで86400秒になっている。

ネガティブレスポンスのときは同じキーのMaxNegativeCacheTtl(REG_DWORD)で設定されデフォルトでは900秒になっている。ネガティブレスポンスをキャッシュしたくない場合はこの値を0にすればいい。

参考:http://support.microsoft.com/kb/318803

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とするようだ。(詳細不明)