2008年12月23日

英語の仕様書・規格書における助動詞の取り扱いについて

英語の仕様書・規格書等のいわゆる規格文書を読んでいて、助動詞の意味をどのように解釈すれば良いか迷うことって度々あります。(shall とか may とか。)

これまで、どう解釈するのが正解だったのかが十分に分かっていなかったのだけれでも、その答えが見つかりました。

答えはJISにありました。JIS Z 8301 「規格票の様式及び作成方法」にその解釈の仕方および意味が記載されていました。JISの規格書自体はJISCのサイトから閲覧のみすることができます。
JIS Z 8301の閲覧ページ

勉強になるな~

2008年12月7日

Firefoxのメニューのフォントサイズを設定する

Firefoxにおいて、表示するWebページのフォントサイズは「編集→設定」から変更することができるが、メニューバー等のフォントサイズはここからでは変更できない。

Gentoo Linux に Firefox 2.0.0.18 をインストールしたところ、画面の解像度(1024 x 768)に対してメニューバーのフォントが大きすぎるので、その設定を変更してみた。

変更方法は以下の通り。
  • $HOME/.mozilla/firefox/*/chrome/以下に、"userChrome.css" というファイルを作成する。
  • 作成した userChome.css に以下を記載する。(同一ディレクトリにuserChome_example.cssというファイルがあるので、それを参考に‥)


@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
* {
font-size: 8pt !important
}

参考ページ
GNOME意外でFirefoxとThuderbirdのフォントサイズを決定する

2008年11月30日

NetBSDからExt2FSのパーティションをマウントする。

NetBSDから、データ用パーティション(こちらで検討したもので、10GBのEXT3FS)をマウントしようとすると、エラーになる。

# mount_ext2fs /dev/wd0j /home
Ext2 fs: unsupport inode size
mount_ext2fs: dev/wd0j on /home: incorrect super block


Linuxマシンから dumpe2fs コマンドでこのパーティションの内容を確認したところ、

Inode size: 256

となっていた。
一方で、NetBSDのカーネルソースコードを確認すると、NetBSDのExt2FSファイルシステムドライバは、inodeサイズを128までしかサポートしていない模様。

そこで、データ用パーティションをフォーマットしなおして(幸い、まだデータをほとんど置いていない)、inodeサイズを変更することにする。
Linuxマシンから、以下のコマンドでパーティションを再フォーマットする。

# mke2fs -j -I 128 /dev/hda6


これで、NetBSDからもマウントできるようになった!

2008年11月23日

NetBSD 4.0.1 のインストール

先日のLinuxのインストールに続いて、今度はNetBSDをインストールする。

NetBSDのサイトから、i386用のインストールCDイメージを取得してきてCD-Rに準備。
このインストーラから起動して、インストールを行う。

基本的にはインストーラに従ってインストールすれば良いが、注意点を以下に記載しておく。
  • HDDのディスクジオメトリの設定 : Linuxのインストール時には、C/H/S = 155061/16/63 として認識されていたが、NetBSDでは、C/H/S = ??/240/63として認識される。このままインストールすると、NetBSDのインストーラがMBRエントリを書き換えてしまうので、ジオメトリをLinuxインストール時と同じに設定すること。
  • MBRを消さない : インストール中に"MBRのエディット" or "ディスク全体を使用する"の選択を聞かれるが、間違ってもディスク全体は使用しないこと。(インストールしたLinuxが上書きされてしまうため)
  • bootcodeは書き込まない。Linuxインストール時にインストールしたGRUBをブートローダとして使用するため、NetBSDインストーラに含まれるブートローダはインストールしないようにする。
続いて、GRUBの設定ファイルにNetBSD用のエントリを追加する。
追加するエントリは以下の通り

#
# NetBSD
#
title NetBSD 4.0.1
root (hd0,4,a)
kernel /netbsd
boot

(hd0,4,a)の意味だが、"hd0"は最初のディスクをあらわしている。"4"パーティション構成で決めた通りパーティション4(0から始まる番号)にNetBSDをインストールしたので、このパーティションが選ばれるようにするため。"a"はNetBSDのdisklabelの『a』をあらわす。
これで、GRUBのメニューからNetBSDが起動できるようになった!

2008年11月22日

Gentoo Linux 2008.0 のインストール

企んでいたOSの再インストールを実施する。
まずはGentoo Linuxのインストール。

インストールするのに参考になるサイトは以下の通り
ハンドブックに従う形で、これと言って問題無くインストール完了!

インストールが完了したら、システムをすべて再ビルドする。(最適化のため)

# emerge --oneshot linux-headers (ヘッダファイルを最新のものにする)
# emerge --oneshot glibc (まず、libcを再ビルドする)
# emerge -e world (システム全体を再ビルドする)
# emerge --depclean (不要なパッケージを削除する)

とりあえず、これで最低限のシステムインストールは完了!

2008年11月21日

ノートPCのOSを入れ替える(パーティションサイズ決定)

先日のエントリで、ノートPCのOS入れ替えを決意。

現在、データのバックアップをせっせとやってます。

パーティションのサイズをおおよそ決めました。
HDDサイズが80GBなので、割り振りとしては以下のような感じかな。
  • P0 : 128MB → ブート用
  • P1 : 2GB → Swap
  • P2 : 15GB → Linuxメイン
  • P4 : 10GB → NetBSDメイン
  • P5 : 10GB → データ(/home)
  • P6 : 約35GB → データ
  • P7 : 約5GB (残り全部) → 遊ぶ用

2008年11月15日

ノートPCのOSを入れ替える(構想検討)

ノートPC(IBM ThinkPad X31)を使っています。
これまで、Gentoo Linux (バージョンは2007.0)を使用していたのだけれども、gcc, binutils, カーネル等の一式の最新版を使ってみたくなりました。また、これまでNetBSDをGentoo上のVMWareで使っていたのだけれども、USB2.0(EHCIホストコントローラ)がエミュレートされなかったりと、チョコチョコ不満があったので、思い切ってPCのOSをすべて入れ替えることにします。

まずは、その方針を検討。
  • とりあえずデュアルブートにして、LinuxとNetBSDをインストールする。
  • Linuxは、Gentoo最新の2008.0にする
  • NetBSDは、最近リリースされた4.0.1にする
  • 各種データ類は、両OSからマウントできるように独立したパーティションを用意する
Xenを使えば両OSを同時に動作させることができるのだけれども、ノートPCということでACPI周り(やCPUの動的周波数変更)等がうまく動作するのかが不安だし、そこまでのニーズは無いので、パスすることにする。(CPUがVTをサポートしていれば完全仮想化にトライしてみたかったところだけど・・・)

まずは、パーティション構成を考えて見ますか・・・
  • Partition0(ExtFS2) : ブートローダ用の領域。ちなみに、ブートローダにはGRUBを使う予定
  • Partition1(SWAP) : Swap領域。1GBのメモリを積んだこのPCに必要なのかは不明・・・
  • Partition2 (ExtFS3) : Linux用のメイン
  • Partition3 : 拡張パーティション
  • Partision4 : (FFS) : NetBSDのメイン
  • Partition5 : (ExtFS3) : データ用 その1
  • Partition6 : (ExtFS3):データ用 その2
  • Partiton7 : (TBD) : 色々遊ぶ用のパーティション
とりあえずこんなところかな?
気になる点としては、
  • 拡張パーティションからのNetBSD起動って大丈夫?
  • そもそも、GRUBとNetBSDの組み合わせって初めて使う・・・
  • NetBSDで無線LANを問題なく使えるか?(802.11 a/b/g)
といったところだろうか?
詳細はこんど詰めることにします。とりあえず、データのバックアップを取らないと・・・

2008年10月11日

firefoxとthunderbirdを連携させる(Linux)

Linuxマシン(Gentoo)を使っているのだけれども、thunderbirdのURLリンクをfirefoxで開きたい。そこで、その設定を行ったのをメモで残しておく。

なお、マシンの構成は以下の通り。
  • ディストリビューション : Gentoo Linux 2008.0
  • ウィンドウマネージャー : fluxbox 1.0 RC3
  • ブラウザ : firefox 2.0.0.5
  • メーラー : thunderbird 2.0.0.5
thunderbirdのプリファレンスを保持するファイルを $HOME/.thunderbird/<プロファイル名>/users.js として作成し、以下のエントリを記載する。(users.jpが既に存在している場合には追記する)

user_pref("network.protocol-handler.app.http", "/home/<ユーザ名>/.thunderbird/openlink.sh");
user_pref("network.protocol-handler.app.https", "/home/<ユーザ名>/.thunderbird/openlink.sh");
user_pref("network.protocol-handler.app.ftp", "/home/<ユーザ名>/.thunderbird/openlink.sh");
user_pref("mail.strictly_mime.parm_folding", 0);


この設定により、メール本文中のhttp, https, ftpのリンクをクリックした際に、openlink.shというシェルスクリプトが実行されるようになる。

続いて、このopenlink.shのシェルスクリプトを作成する。
作成したスクリプトはこんな感じ

#!/bin/sh
export MOZILLA_LIB="/usr/lib/mozilla-firefox"
mozilla_bin="/usr/bin/firefox"
url="$1"
if [ "x$url" = "x" ]; then
url="about:blank"
fi
if $MOZILLA_LIB/mozilla-xremote-client -a firefox openURL\("$url, new-tab"\); then
exit 0
fi
exec $mozilla_bin $url

この設定を行った上で、thunderbirdを再起動すればOK。

今度は、firefoxのMail.toでthunderbirdを開くようにする方法を調べてみようかな‥


<参考リンク>

2008年5月25日

LTSLEEP(9)和訳

NetBSD2.1のマニュアルページ; LTSLEEP(9) を和訳してみる。


LTSLEEP(9) NetBSD Kernel Developer's Manual


NAME
ltsleep, tsleep, wakeup - プロセスコンテキストのsleepとwakeup

SYNOPSIS
#include

int
ltsleep(const void *ident, int priority, const char *wmesg, int timo,
__volatile struct simplelock *slock);

int
tsleep(const void *ident, int priority, const char *wmesg, int timo);

void
wakeup(const void *ident);

DESCRIPTION
これらの関数は、自発的なコンテキストスイッチを実現する。ltsleep()とtsleep()は現在のコンテキストが以下の理由で継続できない場合で使用される。
・カレントプロセスが、ペンディングされたI/Oオペレーションの結果を待つ必要がある
・カレントプロセスが、一時的に使用不可になっている資源(メモリ等)を必要とする
・カレントプロセスが、他のプロセスによりロックされているデータ構造にアクセスしようとしている。
wakeup()関数は、sleep状態になっているプロセスに可能な状態を通知するのに使用される。典型的に、起こされたプロセスは、(コンテキストを再び得た後)、"ブロッキングされた"状態がクリアになっていることを確認するようなリトライ処理を行う。

ltsleep()関数は以下の引数を持つ。
ident カレントプロセスがウェイトを行うリソースを表す"ウェイトチャネル"の識別子。典型的に、プロセスが競う資源に関連したカーネルのデータ構造の仮想アドレスとなる。同じ識別子がwakeup()でプロセスが再開する際に使用される。identはNULLであってはならない。

priority プロセスが起こされる際に使用されランニングプロセスキューにプットされるプロセスの優先度。このメカニズムはカーネルモードで実行されるプロセスの"スループット"を最適化するのに使用される。もしPCATCHがpriorityに指定された場合、プロセスはsleepする前後に渡されたシグナルをチェックする。もしPNORELOCKがpriorityに指定された場合、slockはプロセスがレジュームされた際にロックされない。

wmesg プロセスがsleepしている理由を表すための文字列へのポインタ。カーネルはこの文字列は使用しないが、ps(1)等のユーザレベルのユーティリティにおいて(プロセス構造体のp_wmesgフィールドによって)用いられる。

timo もし非ゼロだった場合、プロセスは最大で timo/hz 秒スリープする。もしこの時間が経過し、wakeup(ident)が実行されず、シグナルも送られなかった(PCATCHがセットされている場合)ときには、tsleep()はEWOULDBLOCKが返る。

tsleep()マクロは、機能的に以下と同等である。
ltsleep(ident, priority, wmesg, timo, NULL)

wakeup()関数は、識別子identで現在スリープしている全てのプロセスにマークする。結局、各プロセスはカーネルコンテキストで実行を再開され、tsleep()から返る。wakeup()はブロックされた状態を変更する可能性を通知するために、プロセスがスリープから戻った場合は再度ブロック条件を評価するべきである。例えば、2つ以上のプロセスが排他アクセスするロック(see lock(9))を待っている場合、そのうちの一つだけが、ロックが開放されたときにロックを取得することが可能である。他の全ては再度sleep状態となって次の機会を待つ必要がある。

返り値
ltsleep()は、wakeup()の結果として0を返す。もしltsleep()がシグナルによって返る時は、返り値はERESTARTになり、そうで無い場合はEINTRとなる。タイムアウトによりltsleep()が返る時は、EWOULDBLOCKが返る。

SEE ALSO
sigaction(2), hz(9), lock(9)

歴史
sleep/wakeupのプロセス同期のメカニズムは非常に古い。これはUnixの非常に初期のバージョンで導入された。tsleep()は、4.4BSDで導入された。ltsleep()はNetBSD1.5で導入された。

2008年4月29日

愛の反対は…

マザーテレサが昔こう言ったそうです。
愛の反対は憎しみではなく、無関心
なんかスゴイな、と感銘を受けました。

2008年2月18日

NetBSD(i386)でsysarchを追加する。

NetBSD-2.1(i386版)で、sysarchを追加してユーザランドプロセスからカーネルを好き勝手に操作できるようにしてみる。sysarchについては、NetBSDのmanページを参照のこと。

まず、sysarchの番号を追加する。番号はカーネルソースコードの arch/i386/include/sysarch.h に定義されている。
例えば以下のように、"I386_TESTSYS"を追加する。
#define I386_TESTSYS

続いて、sysarchの実行コードを作成する。i386のsysarchコードは、カーネルソースコードの arch/i386/i386/sys_machdep.c に記述されている。このファイルの sys_sysarch() 関数内のswitch文がsysarch()の切り分けを行っている箇所なので、その部分に case文(追加したsysarch番号のI386_TESTSYS)を追加する。

以上で、カーネルの設定は完了。カーネルをコンパイルしなおせばOK

ユーザランドプログラムから追加したsysarchを参照できるようにするため、ヘッダファイルを /usr/include 配下に反映させることを忘れないこと!

2008年1月5日

ARMでの関数呼び出し(ABI)調査

C言語から呼び出し可能なアセンブラコードを作成するために、C言語の関数がどのようにコンパイルされるか、ディスアセンブルしてみた。

テスト用に作成したCのソースコードは以下。
u8
add1(u8 a, u8 b)
{
u8 sum = a + b;
return sum;
}

u8
add2(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f, u8 g)
{
u8 sum = a + b + c + d + e + f + g;
return sum;
}

u32
add3(u32 a, u32 b)
{
u32 sum = a + b;
return sum;
}


上記Cのコードをディスアセンブリした結果は以下。
test.o:     ファイル形式 elf32-littlearm

セクション .text の逆アセンブル:

00000000 add1:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4
c: e24dd004 sub sp, sp, #4 ; 0x4
10: e1a03000 mov r3, r0
14: e1a02001 mov r2, r1
18: e54b300d strb r3, [fp, #-13]
1c: e1a03002 mov r3, r2
20: e54b300e strb r3, [fp, #-14]
24: e55b200d ldrb r2, [fp, #-13]
28: e55b300e ldrb r3, [fp, #-14]
2c: e0823003 add r3, r2, r3
30: e54b300f strb r3, [fp, #-15]
34: e55b300f ldrb r3, [fp, #-15]
38: e1a00003 mov r0, r3
3c: e89da808 ldmia sp, {r3, fp, sp, pc}

00000040 add2:
40: e1a0c00d mov ip, sp
44: e92dd830 stmdb sp!, {r4, r5, fp, ip, lr, pc}
48: e24cb004 sub fp, ip, #4 ; 0x4
4c: e24dd008 sub sp, sp, #8 ; 0x8
50: e1a0c003 mov ip, r3
54: e59be004 ldr lr, [fp, #4]
58: e59b4008 ldr r4, [fp, #8]
5c: e59b500c ldr r5, [fp, #12]
60: e1a03000 mov r3, r0
64: e54b3015 strb r3, [fp, #-21]
68: e1a03001 mov r3, r1
6c: e54b3016 strb r3, [fp, #-22]
70: e1a03002 mov r3, r2
74: e54b3017 strb r3, [fp, #-23]
78: e1a0300c mov r3, ip
7c: e54b3018 strb r3, [fp, #-24]
80: e1a0300e mov r3, lr
84: e54b3019 strb r3, [fp, #-25]
88: e1a03004 mov r3, r4
8c: e54b301a strb r3, [fp, #-26]
90: e1a03005 mov r3, r5
94: e54b301b strb r3, [fp, #-27]
98: e55b2015 ldrb r2, [fp, #-21]
9c: e55b3016 ldrb r3, [fp, #-22]
a0: e0823003 add r3, r2, r3
a4: e1a02003 mov r2, r3
a8: e55b3017 ldrb r3, [fp, #-23]
ac: e0823003 add r3, r2, r3
b0: e1a02003 mov r2, r3
b4: e55b3018 ldrb r3, [fp, #-24]
b8: e0823003 add r3, r2, r3
bc: e1a02003 mov r2, r3
c0: e55b3019 ldrb r3, [fp, #-25]
c4: e0823003 add r3, r2, r3
c8: e1a02003 mov r2, r3
cc: e55b301a ldrb r3, [fp, #-26]
d0: e0823003 add r3, r2, r3
d4: e1a02003 mov r2, r3
d8: e55b301b ldrb r3, [fp, #-27]
d8: e55b301b ldrb r3, [fp, #-27]
dc: e0823003 add r3, r2, r3
e0: e54b301c strb r3, [fp, #-28]
e4: e55b301c ldrb r3, [fp, #-28]
e8: e1a00003 mov r0, r3
ec: e24bd014 sub sp, fp, #20 ; 0x14
f0: e89da830 ldmia sp, {r4, r5, fp, sp, pc}

000000f4 add3:
f4: e1a0c00d mov ip, sp
f8: e92dd800 stmdb sp!, {fp, ip, lr, pc}
fc: e24cb004 sub fp, ip, #4 ; 0x4
100: e24dd00c sub sp, sp, #12 ; 0xc
104: e50b0010 str r0, [fp, #-16]
108: e50b1014 str r1, [fp, #-20]
10c: e51b2010 ldr r2, [fp, #-16]
110: e51b3014 ldr r3, [fp, #-20]
114: e0823003 add r3, r2, r3
118: e50b3018 str r3, [fp, #-24]
11c: e51b3018 ldr r3, [fp, #-24]
120: e1a00003 mov r0, r3
124: e24bd00c sub sp, fp, #12 ; 0xc
128: e89da800 ldmia sp, {fp, sp, pc}