2008年12月14日日曜日

Head Firstオブジェクト指向分析設計

「Head Firstオブジェクト指向分析設計」を読みました。一見、かなりくだけた感じの本ですが、見かけほど簡単に読み終える本ではありません。内容は極めてまじめですし、途中にちりばめられた設問に答えるにはそれなりに時間も必要です。
 結論から言うと、良い本であることに間違いはありません。オブジェクト指向分析設計の入門者・中級者であれば必ず得るところがありますので、一読をお勧めします。但し、すべての疑問に答えてくれているわけではないので、難所もいくつかあります。以下にポイントをまとめておきます。
 第1章はギターショップの在庫システムをテーマに小さなクラス設計の問題から入ります。とりあえず実行できるものを設計した後、オブジェクト指向の基本原則を適用し、より保守と再利用が可能な設計に変更します。オブジェクト指向の基本原則ですが、実は、第8章にまとめてでてきます。第1章では原則についてあまり詳しく述べないので、この時点ではあまりピンときませんが、第8章を読んだ後に第1章に戻ると、設問が意図的であることが良くわかります。
 第2章、第3章ですが、ギターショップから離れて犬用ドアシステムについて考えます。システムが実行すべき要件について収集を行います。ユースケースを記述し要件と照らし合わせて漏れがないかをチェックします。第3章では要件が変更されす。オブジェクト指向設計の原則(第8章)に従い、第2章の設計をより良いものへと改善していきます。
 第4章も引き続き犬用ドアシステムについて考えますが、この章の話題の中心はテキスト分析です。非凡な才能や長年の経験に頼ることなく、クラスやメソッドの候補を探す手法としてテキスト分析を取り上げます。
 第5章ですが、再びギターショップの話題へと戻ります。在庫システムを拡張し、バンジョーやドブローなど、その他の楽器を扱えるようにします。楽器を表す抽象クラスとそのサブクラスを構成することで、設計の検討を進めます。しかし、サブクラスは抽象クラスと振る舞いが同じであり、プロパティが増える点だけが異なる、という点に気づき、設計を大胆に見直します。最終的には、サブクラス化をやめ、プロパティを格納するコレクションクラスを用います。本当にこの設計が正しいかどうかについては深く説明はされてませんので注意が必要です(1つ目の難所です)。
 第6章、これまでよりも大きな問題としてゲーム用フレームワークにとりかかります(2つ目の難所です)。複数の要件を束ねる、より漠然とした要件として、フィーチャという言葉が登場します。実際、本の説明でもフィーチャと要件の違いは曖昧だとしています。また、システムの全体像を把握するために、ユースケース図が登場します。そして、第2章でユースケースと要件とを照らし合わせたように、ユースケース図とフィーチャとを照らし合わせ、フィーチャに対応するユースケース図が記述されているかを確認します。こうして全体像を把握するわけですが、このような手法がどれぐらい有効かはなかなか実感できないでしょう。そして、最後に把握した全体像からざっくりとしたモジュール分割を行います。
 第7章ですが、引き続きゲーム用フレームワークを扱います。第6章で分割したモジュールをクラス設計にブレークダウンしていくわけですが、リスクの高い部分からブレークダウンを行っていきます(3つ目の難所です)。
 第8章は設計の原則です。ここでやっとオブジェクト指向設計の原則が要約されます。第8章を読んだ時点で、これまで本の中でどのように原則が適用されてきたか、振り返るのが良いと思います。
 第9章はイテレーションとテストということで、フィーチャ駆動開発とユースケース駆動開発について取り上げています。
 第10章は総まとめとしてオブジェクト指向開発のライフサイクルについて振り返り、仕上げとしてObjectvilleの地下鉄問題に取り組みます。
 以上、ざっとポイントだけ書きました。

ところで、下記のURLには本書を使ったレクチャのシラバスがあるようです。ご参考まで。
http://www.cs.colorado.edu/~kena/classes/6448/f08/lectures/

2008年12月1日月曜日

Puppyインストール、その後

Puppyをインストール後、DHCPに少し不便な部分があったので、手動で設定変更しました。バグがあるのか、ネットワーク接続する場合、毎回「接続」アイコンでDHCP IPアドレス取得を行う必要があります。うーむ。これは面倒。よくよくスクリプトを解析してみると、どうも/etc/rc.d/rc.networkに「接続」アイコンによる設定が反映されていない模様。というわけで/etc/rc.d/rc.networkの最後に

if [ -s /etc/eth0mode ]; then
. /etc/eth0mode
fi

を追加しました。これで起動すれば自動的にDHCP IPアドレス取得が行われネットワーク接続が楽々。

2008年11月30日日曜日

Puppy Linux 4.0に移行

セキュリティや機能向上の面でバージョンアップが頻繁に行われるubuntuの派生、かつ、軽量という点でecoLinuxはそれなりに良かったのですが、どうもubuntuのバージョンアップに追随するのは簡単ではなさそうです。バージョンアップへの追随をあきらめて、軽量にフォーカスすると、ecoLinuxよりもPuppyのほうが軽量そうだということが最近わかってきました。

例によってDynabook 2550S(Celeron 366MHz) メモリ192MBにPuppy Linux 4.0をインストールしてみました。

LiveCDでの起動。唯一の問題は、PCMCIA LANカードの認識でしょうか。これまでコレガのLAPCCTXDを使ってましたが、認識されません。仕方なく、かなり古い3Comの3C589D-COMB0で対応。起動はすんなり、動作は驚くほど軽快。インターネットを調べていると、BuffaloのLPC-PCM-CLXも認識できるようなので、ハードディスクにPuppyをインストールしてから設定することにしました。

設定内容は/etc/pcmcia/configに
card "Buffalo LPC-PCM-CLX Fast Ethernet Card"
manfid 0xffff, 0x1090
bind "axnet_cs"
を追加。

さて、ハードディスクへのインストールですが、メニューからPuppyユニバーサルインストーラを起動します。そこで内蔵IDEへのインストールを指定します。最後にGrubをMBRにインストールし完了。起動後、先ほどのconfigを編集し、Buffaloのカードと交換して再起動。ところがカードが認識されません。ブートのメッセージを見ていると、どうもドライバがロードできていないようです。/lib/modulesの下にaxnet_cs.koがあるか調べてみました。ありません。どのディレクトリを調べてみてもない。

どうすればいいのか良くわからないので、再度、LiveCDでPuppyを起動。そして、axnet_cs.koを検索。発見! どうしてハードディスクインストールの時、コピーしてくれないんだ。Puppyをインストールしたハードディスクをマウントし、対応するディレクトリにコピーし、再び、ハードディスクからPuppyを起動。万事休す。

PCMCIAのLANドライバ以外も、サウンドドライバなど、はやりコピーしてくれないようなので、同じ方法でその後コピーを実行しました。

2008年9月15日月曜日

iTunes8の同期

iTunes7からiTunes8へバージョンアップしたらipod touchと同期できなくなりました。インターネットをいろいろ調べていると、Geniusをオフにすれば良いというアドバイスがありましたが、私の場合は、ウィルススキャンソフトが原因だったようです。

同期中に、ウィルススキャンソフトがリムーバルデバイスであるipod touchをスキャンしに行くと、うまく同期ができないようです。とういうわけで、ウィルススキャンソフトの設定で、リムーバルデバイスをスキャンしないように設定することで対処しました。

2008年6月28日土曜日

Visual C++ 2005 Expressでアセンブラ入門 Part-1

VC++ 2005 Expressの逆アセンブル表示を使ってみる

Visual C++ 2005 ExpressでWin32コンソールアプリケーションHelloWorldを作ります。新規プロジェクト作成で何もしない_tmainが自動生成されます(下記コード)。

// HelloWorld.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
     return 0;
}

とりあえず、「ビルド」メニューから「ソリューションのビルド」を選択してビルドしますが、その前にコンパイルの警告レベルをレベル4に上げておきましょう。

TIPS: 開発中(デバッグ中)は、コンパイルの警告レベルはレベル4にする

ソリューションのビルドができたら、「デバッグ」メニューから「ステップイン」を選択し実行を開始します。_tmainの最初で実行が止まります。 ソースコード上で右クリックメニューから「逆アセンブルを表示」を選択します。すると、こんな表示になると思います(下記コード)。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
00411380 push ebp ; (1)
00411381 mov ebp,esp ; (2)
00411383 sub esp,0C0h ; (3)
00411389 push ebx ; (4)
0041138A push esi ; (5)
0041138B push edi ; (6)
0041138C lea edi,[ebp-0C0h] ; (7)
00411392 mov ecx,30h ; (8)
00411397 mov eax,0CCCCCCCCh ; (9)
0041139C rep stos dword ptr es:[edi] ; (10)
return 0;
0041139E xor eax,eax              ; (11)
}
004113A0 pop edi ; (12)
004113A1 pop esi
004113A2 pop ebx
004113A3 mov esp,ebp ; (13)
004113A5 pop ebp
004113A6 ret

詳細を説明する前に、スタックについて簡単に説明しておきます。スタックというのは、整理が苦手な人の机のようなもので、書類が平積みになっています。一番下をスタックのボトムと言い、一番上をスタックのトップといいます。新しい書類は、スタックのトップに積まれていきます。古い書類にアクセスするには、上の書類から順番にどかす必要があります。

ebpというのはスタックベースポインタと呼ばれるレジスタで、現在のスタックのボトム(スタックフレームと呼ぶ)がメモリ上のどこにあるかを指しています。コンピュータではスタックに積まれるのは書類ではなく値ですが。スタックに値を積むには、push命令を使います。(1) push ebpではebpレジスタの内容をスタックに積んでいます。

espというのはスタックポインタと呼ばれるレジスタで、現在のスタックのトップがメモリ上のどこにあるかを指しています。(2)の時点では、スタックのトップは、先ほどebpレジスタの内容保存した場所を指しています。1つだけ注意があります。机の上では、書類が積まれるたびに高さが増えていきます。ところが、espレジスタの値は、スタックに値が積まれるたびに小さくなります。ちょうど、天井から床方向へ書類を積んでいるような感じです。

(2)では、mov命令でespレジスタの内容をebpレジスタにコピーしています。新しいスタックフレームを定義したという意味です。

次に(3)では、espの値から0xC0(10進数で192)を引き、スタックのトップの位置を下位アドレス方向に変更します。これで192バイトの空き地ができます。

(4), (5), (6)ではebx, esi, ediという3つのレジスタの内容を順番にスタックに保存して行きます。(7)leaでediレジスタの値をebp-0C0h番地に設定します。空き地の先頭を指しています(下位アドレス側)。

(10) rep stos dword ptr es:[edi] というのは、edi(空き地の先頭)からecxで指定された回数だけ、eaxの値で埋める、という意味です。ecxには0x30(10進数で48)、eaxはDWORDで0xCCCCCCCCという値が入っています。ちょうど、上位アドレス方向に向かって、192バイト分の空き地を0xCCで埋められることになります。

(11) xor eax, eaxはちょっとトリッキーですが、eaxレジスタの値を0にしているだけです。これはreturn値に相当します。

(12)以降のpop命令はスタックに積んでいた値をレジスタに戻しています。また、(13)mov esp,ebpではスタックポインタをスタックベースポインタに戻しています。

ここまでの考察

まだ何もしてないアプリケーションなのに、アセンブラレベルではやけにコード量が多いと思いませんでしたか? そうなんです、 _tmainは関数なので、ここで実行されているのはまぎれもなく関数呼び出しなのです。そして関数呼び出しでは、いくつかのレジスタの値をスタックに積んだり、スタックからレジスタに値を戻したりとコード量が増えるのです。ただし、これはコードの最適化が行われないデバッグビルドの話であって、デフォルトでコードの最適化が行われるリリースビルドではこうはいきません。

ところで、192バイトの空き地は何なのでしょうか?わざわざ0xCCで埋めたりして。続きは次回。

2008年3月8日土曜日

Sony mylo COM-2

Sonyからmylo COM-2という製品が発売されました。パソコンでも、携帯電話でも、PDAでもない、インターネット携帯端末と呼べるものです。
 パソコンとの違いは、小さく持ち運びが便利、機能も限定されており操作が簡単、そして起動が速いといったところでしょう。もちろん、小型のノートパソコンを使えば、同じようなことができるのでしょうけど、一般的には小型のノートパソコンになればなるほど価格も高めです。
 携帯電話との違いは、PCサイトブラウザ、通信は無線LAN、両手で入力できるキーボードといったところです。最近の携帯電話はPCサイトを見れるブラウザを搭載してますが、画面サイズが小さすぎるのと、パケット代が気になって事実上は使えません。一方、myloでは無線LANを使って通信するので、インターネット接続できる場所がブロードバンドルータとして無線LANを導入している家や公衆の無線LANサービスが提供されている場所に限定されるわけですが、家で使う分にはパケット代を気にする必要はありません。
 価格.comでは(仕方なく?)myloはパソコンのサブカテゴリであるPDAに入ってますが、Web側(ネットのあちら側)のサービスを利用する端末である、と考えると、従来のPDAとはコンセプトが異なると考えています。
 myloと比較される製品にiPod touchがあります。iPod touchの良い点はいろいろとあるでしょうけど、私にとってはブラウザの応答性が良い点です。使用頻度にしてもブラウザが大半を占めますし、応答性は重要です。逆に悪い点は、株価アプリケーションが日本株対応していない、パソコン(iTunes)が必要である、カット&ペーストできない、があります。特に、株価アプリケーションについては、日本の消費者をバカしていると感じます。ポッドキャストについては、jailbreakを使わない限り、パソコン(iTunes)が必要になります。私にはパソコンの必要性を理解できません。
 というわけで、日本メーカ発のインターネット携帯端末として、myloに期待したいですね。

2008年3月2日日曜日

Ecolinux-ez 1.7.3をインストールする

 Vine Linux, Puppy Linx, Ecolinux, Xubuntu, Kubuntuなど軽量デスクトップLinuxと呼ばれるディストリビューションがいくつかあるようです。私は比較的古いノートパソコン(DynaBook 2550S, Celeron 366MHz, SDRAM 192MB)にVineをインストールして長らく使ってました。メモリ量も少ないことから、ウィンドウマネージャをxfceに変更し、通常使うブラウザは operaという設定です。
 Vineを選択した理由は、増設前の64MBでもインストールが問題なくできた。手持ちのLANカードでインターネットアクセスできた。そこそこ快適に動いた。ただ、それだけの理由です。当たり前の話ですが、そもそも、軽量かどうか以前に、普通にインストールできて動くということが重要です。openSUSE、Fedoraなんかのインストールも試しましたが、メモリ量がネックでインストールさえままならないものもいくつかありました。
 安定性という点では、UbuntuもデスクトップLinuxとして最近注目されてますが、私のパソコンには重すぎるのではないかとしばらく敬遠してました。しかし、Ubuntuの開発パワーは非常に魅力的です。バグフィックスやセキュリティ問題のフィックスの速さという点でも開発パワーのあるディストリビューションをできれば使いたいものです。
 そんななか、Ubuntuの軽量化版派生があることを知りました。私のような素人には、最初からなるべく至れりつくせりの環境でないとつらいです。最初に、Kubuntu日本語ローカライズ版のインストールを試みましたが、エラー発生でインストールできず。そこで、xfceを採用しているEcolinux-ez 1.7.3のインストールを試みました。
 基本的にはすんなりインストールできたわけですが、2つほど注意点があります。
  1. インストール時に画面サイズを1024x768にしても正しく認識されず、インストール後にxorg.confのDefaultDepthを16に変更してはじめて1024x768に変更できます。インストール中は画面が小さく少し苦労します。
  2. BIOSが古いので、ACPIを有効にするには、起動時にacpi=forceを指定するとのメッセージがでますが、指定した途端に使い物にならないぐらい動作が遅くなります。
いずれもEcolinux-ezの問題というよりは、Ubuntuに固有の問題と理解しています。イーサネットについては、あいかわらずCG-LAPCCTXDを使いましたが、特に問題になる点はありませでした。
 あとは、FireFox3の正式版のリリースが待ち遠しいですね。これが出れば、operaを使わずともも、もう少しきびきび動くようになるのではないかと。

2008年2月9日土曜日

Vine Linux 4.2で自動ログインの設定を行う

「デスクトップ」→「システム管理」→「ログイン画面」で自動ログインがなぜか設定できない。
仕方ないので/etc/X11/gdm/custom.confの[daemon]セクションに

[daemon]
AutomaticLoginEnable=true
AutomaticLogin=自動ログインしたいユーザ名

を直接記述しました。その後、ウィンドウマネージャをxfceに変更しましたが、設定は有効なようです。

2008年1月27日日曜日

Vine Linux 4.2 DNSの名前解決がうまくいかない

Vine Linux 4.2をノートパソコンで動かして、無線LAN経由でインターネット接続しています。これまで、ネームサーバとして無線LANアクセスポイント (Aterm WR7850S)のアドレス192.168.0.1をresolve.confに設定していましたが、名前解決がうまくいく場合と、いかない場合とがあり、原因不明でした。接続している某社のブロードバンド回線ですが、ネームサーバのアドレスが良くわかりません。しかし、良く考えてみると、無線LANア クセスポイントがネームサーバのアドレスを知っているはずですね。というわけで、無線LANアクセスポイントの情報を見てみると、ネームサーバのグローバ ルIPアドレスがやはりありました。これをノートパソコンのresolve.confに書いて問題解決。

2008年1月23日水曜日

Vine4.xでCG-LAPCCTXDを使う

1.はじめに

コレガのPCMCIA LANカード(CG-LAPCCTXD)はVine Linux3.xでは使えたようですが、Vine Linux4.0/4.1/4.2では使えません。Vine Linux4.0/4.1/4.2で使うためにはドライバ(カーネルモジュール)の修正が必要なようです。

2.Linux最新カーネルをダウンロードし修正を確認する

私がダウンロードした時点では、最新カーネルのバージョンは2.6.20でした。カーネルソースツリーの

drivers/net/pcmcia/pcnet_cs.c

を確認すると、1620行あたりに

PCMCIA_DEVICE_PROD_ID12("corega K.K.", "(CG-LAPCCTXD)", 0x5261440f, 0x73ec0d88),

という部分があり、最新カーネルではCG-LAPCCTXDに対応している様子がうかがえます。一方、Vine Linux4.0/4.1がベースとしているカーネル2.6.16ではこのような部分はありません。

もう1つ、これはCG-LAPCCTXDをスロットに挿入すると気づきますが、カーネル2.6.16はCG-LAPCCTXDを無線LANカードとして 誤って認識するようです。このためかカーネル2.6.20では

drivers/net/wireless/hostap/hostap_cs.c

の836行目は

/* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), conflict with pcnet_cs */

という修正が入っています。

3.Vine Linux4.0/4.1/4.2のカーネルをダウンロードしドライバ(モジュール)を再構築する

必要なことは、Vine Linux4.xのカーネルのダウンロードを行い

  • drivers/net/pcmcia/pcnet_cs.c
  • drivers/net/wireless/hostap/hostap_cs.c
に対して上記のような修正を施し(単にソースファイルを新しいものに置き換える、という方法ではビルドエラーになるようです)、ドライバを再構築すること です。Vineで用いているカーネルのダウンロードと再構築方法については、オンラインマニュアルのここに 詳しい説明があります。基本的には、12.2.2節の「ソースツリーから作成する」に従って行いますが、今回は、カーネル全体の再構築は不要ですので、 makeの部分では

make modules

としておきます。あとはできあがった

  • pcnet_cs.ko
  • hostap_cs.ko
を/lib/modules/2.6.16-0vl68/kernel以下の対応するディレクトリに置くだけですが、上書きする前に、オリジナルの pcnet_cs.koファイルとhostap_cs.koファイルのバックアップコピーを念のためとっておきましょう。

4./etc/pcmcia/configファイルにエントリを追加する

最後に/etc/pcmcia/configファイルにCG-LAPCCTXDのエントリを追加し、パソコンを再起動します。追加するエントリは以下のも のです。

card "corega CG-LAPCCTXD Ethernet"
version "corega K.K.", "(CG-LAPCCTXD)", "(HardwareFirmwareVer.)", "(nothing)"
manfid 0xc00f, 0x0000
bind "pcnet_cs"

cardの行にある"名前"についてはわかりやすいものを適当につけています。versionの行とmanfidの行にある内容については

# /sbin/pccardctl ident

で得られる内容を書いています。


以上で、私が実施した方法を書きましたが、設定や環境によってはこの方法で必ずしもうまくいくとは限りません。あくまで自己責任で行ってください。