Author Archives: admin

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

ウェブデザイン 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でエラーが出る。読みきれなかったのでスルー。