川俣 晶(かわまた あきら)
1964年4月生まれの東京出身。東京農工大化学工学科を卒業後,マイクロソフトでMicrosoft Windows 2.1~3.0の日本語化に従事。現在はピーデー 代表取締役。日本XMLユーザーグループ代表。Microsoft Most Valuable Professional(MVP)。

 この連載で説明していくのは,ウィルコムの携帯端末「W-ZERO3」(OS:Windows Mobile 5.0)で動作する超小型BASICインタプリタ「ワンべぇWM(Windows Mobile)」と,それを開発する過程で遭遇した様々な技術トピックである。ワンべぇWMは,8ビット・パソコン時代のBASICインタプリタに似た構造を持ち,W-ZERO3単体でプログラムの作成,実行,デバッグを可能とする開発環境である。これは8ビット・パソコン時代を経験した人達には,ワクワク興奮した昔を思い出させるものかもしれない(図1)。

図1●ワンべぇWMのサンプル・プログラム。
図1●ワンべぇWMのサンプル・プログラム。
(a)対称位置に点を打つカレイドスコープ

図1●ワンべぇWMのサンプル・プログラム。
図1●ワンべぇWMのサンプル・プログラム。
(b)目の前で迷路ができていく迷路作成

図1●ワンべぇWMのサンプル・プログラム。
図1●ワンべぇWMのサンプル・プログラム。
(c)往年のSTAR TREK風ゲーム「STAR WITCH」
[画像のクリックで拡大表示]

 また,ワンべぇWMはいくつかの理由からC(一部C++)によって開発されているため,この連載はCによるW-ZERO3(またはWindows Mobile)開発テクニックの解説という側面を持つ。これは,Win32 APIを直接呼び出す生APIプログラミングの世界である。

見落とされた中間地帯

 読者が抱くであろう最大の疑問に答えておくことにしよう。それは「なぜ今どき,時代遅れでオブジェクト指向ですらないCなのか」ということである。さらに言えば,そのようなCを使って作り上げるのは,Cに輪をかけて時代遅れのBASICインタプリタに過ぎない。

 より先進的な何かを生み出すのならともかく,まるで時計の針を逆行させるかのように,「より遅れた技術」をわざわざ作り出していることになる。わざわざこのような非効率なことを行う理由を理解できない読者は多いと思う。

 その疑問はもっともだと思う。健全な価値観を持つ「プロフェッショナル」ならば,あえて効率を落とすような選択を取ることはあり得ない。また,健全な価値観を持つ「一般ユーザー」であれば,プログラム開発を依頼する際に,わざわざ効率を落とすような技術を指定することもないだろう。

 それにもかかわらず,あえて効率の悪い方法を指向している理由は何か。その理由を説明するには,プロフェッショナルでも一般ユーザーでもない,中間領域にスポットライトを当てる必要がある。この中間領域を,ここでは「ホビイスト」と呼ぼう。ちなみに,マイクロソフトのWindows Liveチームシニアマネージャ安藤浩二氏は,おそらく同じ層をハイエンド・アマチュアと呼んでいる。呼び方はどうであれ,一般ユーザーよりも豊富な知識を持って深くパソコンにかかわろうとしているにもかかわらず,プロフェッショナルではない──という層は昔から確かに実在する。パソコンの黎明期までさかのぼれば,パソコン・ユーザーは全員ホビイストだと言っても過言ではない時期が存在した。一般ユーザーにはとても使いこなせないほど難しいが,かといってプロがコンピュータとして使うには非力すぎる時代のパソコンのユーザーは,必然的にホビイストにならざるを得ない。

 しかし,いつの間にかホビイストが注目される機会は少なくなってきたように思う。おそらく,圧倒的大多数の勢力に拡大した一般ユーザーを顧客とするプロフェッショナル向けに,技術情報が提供されることが定番化したためだろう。より大きなビジネスを行うことを考えた場合,ホビイストの存在感は希薄なものとならざるを得ない。

 結果として,ホビイストはプロフェッショナルの予備軍であるかのように扱われる場面が増えたように思われる。つまり,プロフェッショナルとは最先端の完璧で優れた技術を習得して使いこなす者たちであり,ホビイストとはその段階を目指す途中にある未熟な存在と見られてしまう,ということである。

 それゆえ,例えばCが大好きなホビイストに向けて,「Cは非効率です。効率アップのためにオブジェクト指向を学びましょう!」といったメッセージが常識的に発せられてしまうわけである。

 だが,あえて言おう。このようなメッセージは完全に誤っている。

 なぜなら,ホビイストはプロフェッショナルを目指す中途段階などではなく,全く別個の独立した立場であるからだ。私なりに「ホビイスト」という言葉を以下のように定義してみよう。

ホビイストとは,いかなる実利性,実用性,効率性とも無関係に,コンピュータそのものを使うことを「面白い」と思う人々を言う

 さらに以下の定義も付け加えておこう。

他ジャンルのホビイストと明確に区別したい場合はPCホビイストと呼ぶ

 例えば,ロボットの分野でもホビイストという言葉が使われているようだが,両者は明確に分けて扱う必要がある。

 ロボットのホビイストもロボット制御のためにコンピュータを使うが,彼/彼女にとってコンピュータは手段に過ぎない。彼/彼女はコンピュータを使うことそのものを「面白い」と思っているわけではない,という意味で,PCホビイストではない(ただし,一人の人間が同時にPCホビイストとロボット・ホビイストである,ということはあり得る)。

 そろそろ単純明快な結論を示そう。

 PCホビイストとは,本人が面白いと思ったことは何でも実行する人々である。それが,いかに非効率であろうと,実用性が無かろうと,不毛であろうと,面白ければそれは彼/彼女にとって「やる価値がある」行為なのだ。そこに合理的な理由などはない。

 これは,登山に喩えれば解りやすいだろう。よく登山を行う理由として「そこに山があるからだ」と説明されることがある。それと同じことだ。登ったからといって実利的なメリットが何もない山に登ることと,作ったからといって何の実利的なメリットもないプログラムを作ることは,本質的に同じと見て良いだろう。

 作った本人が作る過程を楽しめれば,それは「価値あるプログラム」なのである。

ホビイストは革新を生み出す

 話がここで終われば,「PCホビイスト」とは自己満足の人種であり,公共性を持ち得ないことになってしまう。だが,話はまだ半ばなのである。

 行動の歯止めという観点で見たとき,「プロフェッショナル」「一般ユーザー」と「PCホビイスト」には決定的な相違がある。プロフェッショナルと一般ユーザーは,要求された機能を持つプログラムが完成したら,それ以上開発を続行しようとすることは無いだろう。それ以上の開発継続は無意味であり,そこで歯止めがかかる。

 ところが,ホビイストには歯止めがない。十分に完成したプログラムに,さらに磨きをかけることも珍しくはない。目的が実利ではなく面白さにある以上,面白さが持続する限り,過剰な改良が継続される。結果として,しばしばホビイストの作ったプログラムが,プロフェッショナルが作ったプログラムに優越するという事態が発生する。「お金を出して買うより,こっちの無料のソフトのほうがずっといいよ」という状況はしばしばある。その中のある程度の割合は間違いなく,このような理由によって発生した状況であろう。

 また,ホビイストのほうがプロフェッショナルよりも,より深い知識と多くの技術的な経験を持っていることも珍しくない。ホビイストは採算度外視で徹底的に奥深く使い込むからである。その結果として,ホビイストはしばしば技術やパソコンの利用スタイルを革新する原動力となる。

 もちろん,すべてのホビイストが革新を生み出すわけではない。そもそもホビイストの本質は面白がることであって,革新することではない。

 だが,ホビイストの面白がる活動の副産物として生み出される「価値」は,しばしばとても大きな公共性を持つのである。

Cの価値・BASICの価値

 筆者が,Cで記述されたBASICインタプリタを作った理由は,極論すれば一つしかない。それが自分にとって面白い作業だったから。

 言うまでもなく,筆者の本質はホビイストである。プロフェッショナルではなく,「セミプロの領域に足を踏み入れているホビイスト」である(筆者はプロフェッショナルとして仕事をすることもあるが,この件に関して完全にはホビイストである)。

 だが,面白さの追求の過程で,様々な価値が生み出されたことも,また事実である。そもそも,ワンべぇWMがCで書かれている理由は二つある。一つは,ワンべぇWMの原点となるワンべぇ(WonderWitch用BASICインタプリタ)をCで書いたこと。もう一つは,より低レベルの言語を使うことで消費するリソースを節約するためだ。

 実装された言語がBASICであるという理由も,リソースの節約という目的にある。低レベルで効率は良くないが,開発環境一式を極めてコンパクトに実現できるという点で,古典的なTiny BASICは非常に優れている。

 そのような観点から見れば,あえて「プロならば作らないであろう非効率的なプログラム」を作ることで得られた価値は明らかだろう。開発のやり方は非効率でも,実はリソース節約という点では効率アップされているのである。

 リソースが極めて限定されたW-ZERO3のようなデバイスでは,切実な必要性が薄いプログラムを常に入れておくゆとりは少ない。コンパクトなワンべぇWMは,それを可能とするわけである。

 では,メモリーの片隅にワンべぇWMを常に入れておくと何ができるのだろうか。

 いつでもどこでも,プログラミングが可能になるだろう。思いついたときに,すぐプログラムを作り,その場で実行可能となる。

 例えば,宴会に出かける電車の中で,ふと仲間内でしか通じないネタを題材にしたプログラムを思いついたとしよう。難しいものである必要はない。

 いつも「何歳に見える?」と質問して,「17」と答えないと「本当は17歳なの!」と言い出す仲間がいるとすれば,数字を入力させて17以外ならそのようなメッセージを出力するプログラムを作ることができる。

10 a=input("何歳に見える?")
20 if a <> 17 then print "本当は17歳なの!":goto 10
30 print "うふふ。ありがとう"
40 goto 10

 慣れていれば,10分で作れるだろう(図2)。それで一発ウケを取って,宴会が盛り上がれば「盛り上げツールとして十分な実用性があった」とみなしうる。

図2●リスト1の実行結果。部外者には何が面白いのかわからないが,身内に受ければOK!
図2●リスト1の実行結果。部外者には何が面白いのかわからないが,身内に受ければOK!
[画像のクリックで拡大表示]

 W-ZERO3+ワンべぇWMとは,そのような場面で強力なツールとなる。そして,そのような使い方は,プロ用のツールが見落としがちの使い方と言える。たいていの場合,プロ用のツールは大きく複雑なプログラムの開発を支援することを主目的にしていて,小さなプログラムへの支援にはあまり力を入れていないように見える。

 ちなみに(複雑さに関して余談を書くなら),オブジェクト指向プログラミングとは本来システムの過剰な複雑さに対処するために要請された技術であり,複雑ではないシステムでは必ずしも必要ないものである。電車の中で作ることができる,せいぜい数十行規模のプログラムであれば,問題となるような複雑さは通常発生しない。つまり,オブジェクト指向プログラミングは必須とは言えないのであり,実際に開発していて不便を感じたことはなかった。

追体験しうる面白さ

 要約すれば「私が面白かった話」をこれから語っていくのであるが,実は,ここにもう一つ,ホビイストが自己満足を脱して公共性を獲得する方法がある。自分が面白かったことを語り,それによって感性の近い人たちに「面白い話だ」と思わせることができれば,もはや自己満足ではない。たとえ共感する者が少人数であろうと,それはコミュニケーションに昇華するのである。

 それに加えてもう一つ価値を付け加えたいと思う。それは,追体験を容易に可能とすることである。

 ワンべぇWMは,VGA解像度のWindows Mobile 5.0 for Pocket PC(つまりW-ZERO3)を主な動作環境として想定して開発されている。しかし,これを実行するためにW-ZERO3を買う必要はない。デバイスのエミュレータがあるので,一般のパソコン上で実行してみることが可能なのだ。

 ただし,あくまで開発用という位置付けであるため,以下のソフトウエアが必須となっている。

Visual Studio 2005 Standard, Professional, and Team Suite Editions

 残念ながら,無償のExpress Editionは含まれていない。

 このほかに必要とされるソフトウエアは以下の通りである。これらはダウンロードしてインストールすれば良い。

Windows Mobile 5.0 SDK for Pocket PC

 これに,デバイスのエミュレータ本体が含まれている。英語版ではあるが,後で説明する日本語のエミュレータ・イメージを組み込めば日本語版のOSが起動するので問題はない。

 なお,これを利用できるOSは,Windows Server 2003 Service Pack1およびWindows XPとなっているが,Windows Vistaでも一応動作している。

 デバイス・エミュレータを含むデバイスとの通信には,ActiveSyncというソフトウエアが必要とされる。

Microsoft ActiveSync 4.2

 ただしWindows Vistaには,これに相当する機能が最初から含まれているため,必要ではない。

 最後に,忘れずに日本語版のOSイメージをインストールしておこう。以下に各国語版のOSイメージが用意されている。

Windows Mobile 5.0 PocketPC Localized Emulator Image

 この中から間違えずに,JPNの3文字を含む「Windows Mobile 5.0 Emulator Images for Pocket PC - JPN.msi」を入手し,インストールしよう。

デバイス・エミュレータの起動

 インストールがすべて終了したら,Visual Studio(VS)を開く。まず,デバイス・エミュレータを起動するためのダミーのプロジェクトを作ろう。[ファイル]→[新規作成]→[プロジェクト]とメニューを選び,どれでも良いので「スマート デバイス」の実行ファイルのプロジェクトを選ぶ。ここでは,Visual C++の下の「スマート デバイス」に含まれる「Win32 スマートデバイス プロジェクト」を選んでみよう(図3)。

図3●スマートデバイスのプロジェクトならどれでも良いが,ここでは「Win32 スマートデバイス プロジェクト」を選択した(これはワンべぇWMの作成に使用したテンプレート)。
図3●スマートデバイスのプロジェクトならどれでも良いが,ここでは「Win32 スマートデバイス プロジェクト」を選択した(これはワンべぇWMの作成に使用したテンプレート)。
[画像のクリックで拡大表示]

 しかし,プロジェクトを作成してもまだエミュレータを起動することはできない。はやる心を抑えつつ,最後に一つだけ設定を行おう。

 [プロジェクト]→[プロパティ]とメニューを操作し,プロパティ・ダイアログを出す。そして,構成プロパティの下の「配置」を選ぶ。すると,右側に「配置デバイス」という項目が見えるので,これを“JPN Windows Mobile 5.0 Pocket PC VGA Emulator”に変更してOKボタンをクリックしよう(図4)。これが,比較的W-ZERO3に良く似た条件のエミュレータとなる。

図4●配置デバイスを“JPN Windows Mobile 5.0 Pocket PC VGA Emulator”に変更
図4●配置デバイスを“JPN Windows Mobile 5.0 Pocket PC VGA Emulator”に変更
[画像のクリックで拡大表示]

 なお,ここはまぎらわしい名前が多いので注意しよう。先頭にJPNの3文字がないものは英語版なので日本語フォントが入っていない。つまり,日本語文字が正しく表示できない。VGAの文字が入っていないものは,QVGA解像度なので表示ピクセル数が少ない。Squareの文字が入ったものは,縦横が同じピクセル数でランドスケープとポートレイトの切り替えに意味がないものである。

 さあ,これで準備が終わった。F5キーを押して実行を開始しよう。

 少し待たされる(初回起動時はかなり待たされる)が,真っ白の画面が表示されれば成功である。そのまま,画面左下のOKをクリックして終了させよう(図5)。

図5●実行して真っ白の画面が表示されれば成功。そのまま画面左下のOKをクリックする
図5●実行して真っ白の画面が表示されれば成功。そのまま画面左下のOKをクリックする

 この状態で,デバイス・エミュレータは完全にVSから解放され,使い放題の状態になる(図6)。ここからが本番だ。

図6●デバイス・エミュレータがVSから解放されて使い放題の状態になる。ここからが本番だ!
図6●デバイス・エミュレータがVSから解放されて使い放題の状態になる。ここからが本番だ!

 とりあえず,ワンべぇWMのインストールCABファイルを以下のURLより入手しよう(同じページからZIPファイルを入手するとワンべぇWMのソースコードも入っている。いきなりそちらに挑戦したい人はそれでも良い)。
http://www.piedey.co.jp/softs/wonbeWM001.html

 入手したCABファイルを,デバイス・エミュレータから操作可能にしよう。デバイス・エミュレータのウィンドウのメニューを操作する。[ファイル]→[構成]と選び,「共有フォルダ」のフィールドに,CABファイルをダウンロードしたディレクトリ名を書き込み,OKをクリックする(図7)。

図7●CABファイルのあるディレクトリを共有フォルダに設定
図7●CABファイルのあるディレクトリを共有フォルダに設定
[画像のクリックで拡大表示]

 これで,仮想的なスマートデバイスとして,そのディレクトリが認識されたことになる。仮想デバイスの画面左上のWindowsのマークをクリックし,ファイル・エクスプローラを選ぼう。これを使って,「マイデバイス」の下の「Storage Card」の下を見ると,CABファイルが見えるはずである。これをクリックすると,ワンべぇWMがインストールされる。

 途中でデバイスとStorage Cardのどちらにインストールするかを選択する画面になる(図8)。ここはデバイスを推奨しておく。一部ファイルは,いずれにしてもデバイス側の「マイドキュメント」の下に入るからだ。

図8●ワンべぇWMのインストール先を選択する画面。「デバイス」を推奨
図8●ワンべぇWMのインストール先を選択する画面。「デバイス」を推奨

 インストールが完了したら,いよいよワンべぇWMを使用できる。仮想デバイスの画面左上のWindowsのマークをクリックすると,「wonbeWM」の名前が見つかるはずだ(図9)。見つからない場合はこのメニューの中の「プログラム」を選ぶ。

図9●インストールが完了すれば,メニューに「wonbeWM」が登録される。見つからない場合は「プログラム」を選ぶ
図9●インストールが完了すれば,メニューに「wonbeWM」が登録される。見つからない場合は「プログラム」を選ぶ

永遠の17歳を作ろう

 では,wonbeWMをクリックし,さっそくワンべぇWMを開こう(図10)。ワンべぇWMの基本操作は1行入力してEnterキーを押すことにある。このとき,先頭に行番号と呼ぶ番号を入れるとプログラムの編集機能が動作し,入れないと命令を直接実行する。

図10●ワンべぇWM,利用OK!な状態
図10●ワンべぇWM,利用OK!な状態

 例えば,以下は直接実行の例である。

図11●直接実行モードはすぐに結果が出る
図11●直接実行モードはすぐに結果が出る

図12●編集モードでは,すぐに結果は出ない。runステートメントで実行する
図12●編集モードでは,すぐに結果は出ない。runステートメントで実行する

図13●listステートメントは,メモリー上のプログラムを見たいときに使う
図13●listステートメントは,メモリー上のプログラムを見たいときに使う

print 3-2

 printは引数の値を出力するステートメントで,「3-2」は整数の引き算を行う式である。これを実行すると,即座に1という結果が表示される(図11)。一方,

10 print 3-2

のように行番号として10という数字を付けて入力してみると,Enterキーを押しても結果は出ない。

 これは,この1行がプログラムとしてメモリーに記憶されたことを意味する。このあと,「run」(プログラムを実行する命令)と入力してEnterキーを押す(以降は+Enterと表記)と,記憶されたプログラムが実行され,結果が表示される。メモリー上に記憶されたプログラムは,run+Enterを入力すれば,何回でも同じ結果を出してくれる(図12)。

 メモリーに記憶されているプログラムを見るには,listステートメントを使う。list+Enterと入力すれば,メモリー上にあるプログラムがリストされる(図13)。

 ちなみに,行番号を変えれば何行でもプログラムを書き込める。実行すると,行番号の順番に実行される。同じ行番号で新しい行を入力すれば行の差し替え(上書き)となり,行番号だけ入力してEnterキーを押すと行の削除となる。とてもシンプルな編集機能なので,すぐに理解できると思う(効率は悪くても単純ですぐ理解できるのがワンべぇWMの長所といえる)。

 もう一つ,スクリーン・エディタの機能についても説明しておこう。矢印キーを使って,すでに入力した行にカーソルを移動させ,内容を書き換えてから(あるいは書き換えずに)Enterキーを押すと,その行をもう一度動作させることができる。例えば,同じステートメントを何回も実行したい場合や,入力したプログラムの行を訂正する場合に便利な機能である。

 listコマンドで表示した行を書き換えることも可能だ。これは絶対に便利なので,覚えておくと良いだろう。

 プログラムの入力と実行方法をマスターしたら,いよいよ「永遠の17歳」プログラムを作ろう!

 new+Enterというキーを押すと,メモリー上のプログラムはクリアされる。あとは,リスト1に書かれた4行を順番に入力していくだけである(行番号の入っていない行は単なる説明文なので,入力する必要はない)。

' "何歳に見える?"と出力して数値入力を待つ。結果を変数aに入れる
10 a=input("何歳に見える?")
' 変数aの値が17ではないなら,"本当は17歳なの!"を出力して10行目から実行継続
20 if a <> 17 then print "本当は17歳なの!":goto 10
' "うふふ。ありがとう"を出力
30 print "うふふ。ありがとう"
' 10行目から実行継続
40 goto 10
リスト1●「何歳に見える?」と質問して,17歳と答えないと訂正されるプログラム

 入力を終えたら,listステートメントで入力ミスがないかを確認しよう(図14)。このあと,画面右下のMENUをクリックし,[File]→[Save As]と選んで「永遠の17歳」プログラムをファイルに保存しておこう。

図14●プログラムを入力し終えたら,listステートメントで確認
図14●プログラムを入力し終えたら,listステートメントで確認

 あとはrun+Enterキーで実行するだけである。え,実行しても面白くない?

 それは当然だ。これはあなたが知らない誰かにとって面白いプログラムなのだから。だから,あなたの身内にしか通用しないネタを使って,同じような短い一発ネタプログラムを書くのである。それはきっと面白い体験になるだろう!

次回予告

 ワンべぇWMを使うのも面白のだが,ワンべぇWMのソースを見ることも面白い。次回からは,この連載の主テーマとして,ワンべぇWMのソースを見ながら,Windows MobileでWin32 APIプログラミングを行う際の様々な特徴,興味深い点,凶悪な罠,そしてそれを通して得られる楽しいことや有益な価値について見ていくことにしよう。

 次回のテーマは特に「生APIプログラミングの魅力」である。APIプログラミングは,一部に熱心な愛好者を持つ。それをWindows Mobileで実践することの価値と難しさとは果たして何だろうか?