/etc/sudoersを変更する。以下コマンドを実行する。
$ sudo visudo
ここで以下のように変更する。
変更前
%admin ALL=(ALL) ALL
変更後
%admin ALL=(ALL) NOPASSWD:ALL
これはadminグループに属しているユーザが、すべてのユーザとして、すべてのホストでコマンドをパスワードなしで実行できることを示す。デフォルトではインストール時に作成したアカウントはadminグループに属している。
/etc/sudoersを変更する。以下コマンドを実行する。
$ sudo visudo
ここで以下のように変更する。
変更前
%admin ALL=(ALL) ALL
変更後
%admin ALL=(ALL) NOPASSWD:ALL
これはadminグループに属しているユーザが、すべてのユーザとして、すべてのホストでコマンドをパスワードなしで実行できることを示す。デフォルトではインストール時に作成したアカウントはadminグループに属している。
/etc/fstabはハードディスクなどのデバイスとディレクトリとのマウント情報を記述するファイル。システム起動時に読み込まれ、このファイルの記述に基づいてマウントされる。よってこのファイルがおかしいとシステムがおかしくなる。
1行が1つのエントリになる。1エントリは6つのフィールドで構成される。各フィールドの詳細は左から順に以下のようになる。
マウントするデバイスやリモートファイルシステムを記述する。ここではハードディスクの場合を考える。
/dev/sda1
のように指定する。
デバイスを直接指定すると、ハードディスクの物理的構成が変わったときに、その変更に追従できなくなる。そこでハードディスクのボリュームラベルを指定すれば、この様な問題を回避できる。以下のように指定する。
LABEL=abc
現在のボリュームラベルはe2labelコマンドで確認できる。
# e2label /dev/sda1
UUIDは世界で常に一意になるID。これを指定すれば、ラベルを指定するよりもさらに一意性が高まる。以下のように指定する。
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
現在のUUIDを調べるには以下のようにおこなう。
# dumpe2fs /dev/hda1|grep -i uuid
UUIDを設定するには、tune2fsコマンドを使う。UUIDはuuidgenコマンドを使って作成できる。
マウントするディレクトリを指定する。
ファイルシステムのタイプを指定する。通常のハードディスクの場合以下のようなものがある。
オプションを指定する。複数指定する場合はコンマで区切る。このオプションには一般オプションと第三フィールドで指定したファイルシステム専用のオプションを記述できる。
ext2はスーパーブロックにデフォルトオプションが記述してあり、ここでなにも書かなければそれが使われる。スーパーブロックの情報を見るにはdump2fsを使う。
詳細は省略。
dumpコマンドが使う。通常の場合、バックアップの対照とする場合1にする。
ブート時fsckが実行される必要があった場合参照される。0だとfsckしない。それ以外は1から順番に行われる。通常ルートファイルシステムを1とするようだ。(詳細不明)
perlやphpにあるpack,unpack関数はシリアライズとデシリアライズを行う関数です。シリアライズとは数値や文字列をバイナリ表現にすることで、デシリアライズはその逆です。シリアライズしたデータはネットワークに送ったり、保存したりしやすくなります。しかしシリアライズには常にいろいろな問題が付きまといます。
文字列を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の優先度は固定ではなく、ゲスト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コマンドはデフォルトでファイルや標準入力の最初の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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int CNofocustabDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; gHook = SetWindowsHookEx(WH_CBT, cbtHook, NULL, GetCurrentThreadId()); return 0; } void CNofocustabDlg::OnDestroy() { CDialog::OnDestroy(); UnhookWindowsHookEx(gHook); } LRESULT CALLBACK cbtHook(int nCode, WPARAM wParam, LPARAM lParam) { if ( nCode < 0 ) return CallNextHookEx(gHook, nCode, wParam, lParam); switch( nCode ) { case HCBT_SETFOCUS: { return ghTab != NULL && ghTab==(HWND)wParam; } break; } return CallNextHookEx(gHook, nCode, wParam, lParam); } |
phpMyAdminはMySQLをブラウザからいろいろできるツール。便利ですがインストールでいつもはまるのでインストールの方法を書いておきます。
なぜインストールではまることが多いかというと、クッキーが悪さをするからです。以下の手順の前にクッキーを削除してください。
1、phpMyAdminroot/configディレクトリがある場合は削除する。
2、phpMyAdminroot/config.inc.phpをつくり以下のようにする。MySQLServerRootPasswordの部分をMySQLのrootのパスに変える。
1 2 3 4 5 6 |
<?php $i = 0; $i++; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = 'MySQLServerRootPassword'; ?> |
businessweek.comにウェブデザイン10の掟と題する記事が載っています。ウェブデザインの偉い人たちが人気のあるサイトを基準にして選んだものだそうです。
またBestサイトとWorstサイトをスライド形式で紹介しています。Worstサイトからいくつか抜粋してみます。
AT&T
散らかっててナビゲートしずらいそうです。
Smibs
名前がよくないそうです。
Pier1.com
家具を売っているところなんですが、お店らしくないそうです。
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はgoogleが作った、構造化データのシリアライズ方式。以下の特徴がある。
使い方
最初に.protoファイルを作る。このファイルにデータ構造を定義する。例えば以下のようになる(googleより引用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } |
これをコンパイラ(protoc)を使ってコンパイルする。コンパイルの生成物はC++やJavaのクラスとなる。C++の場合出来上がったファイルをコンパイルするにはprotocol bufferのヘッダファイルやライブラリが必要になる。
protocol bufferで提供さているファイル一式にはVisual C++の.slnファイルが含まれているので、これをVC+ 2005 Express Editionなどで開けばライブラリをビルドできる。
コードのビルド時、libprotobuf.libを読み込ませる必要があり、実行時にはlibprotobuf.dllが必要になる。
サンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include "person.pb.h" int main() { Person person; person.set_name("opoona"); person.set_id(100); int size = person.ByteSize(); unsigned char* data = new unsigned char[size]; if(!person.SerializeToArray(data, size)) return -1; Person person2; if ( !person2.ParseFromArray(data, size) ) return -1; std::cout << person2.name() << std::endl; std::cout << person2.id() << std::endl; delete data; return 0; } |
上記ソースを実行するとPersonのdtorでエラーが出る。読みきれなかったのでスルー。