「もぐら」を叩くと、Palmが儲かる?

「あの〜」
「はい、何でしょうか?」
「言い難いんですけど、分かり難いんです。」
「は?」
「例えば、My NSBasicの第2回、親切に解説しているようですが、実際は、よくわからないんです。」
「はぁ・・・」
「つまりですね、何をどうすればプログラムができるのか、もう少し具体的に知りたいんですよ。」
「要するに、説明的すぎ、と言う事でしょうか?」
「いえ、そういうつもりでは・・・でも、プログラムってどうやって作るんだろう、って具体的な『作業』として知りたいんです。 例えば、デパ地下の実演販売のように、目の前でプログラムを作る人を気軽に見る機会って少ないですからね。」
「プログラマーと大道芸人と勘違いしていませんか?」
「ほら、細かい所が分からなくても、そう言う人の作業を見ているだけで、感動したり納得したりするじゃないですか。」
「つまり、ここで今から何か作れ、って事でしょうか?」
「ハッキリ言えば、そう言う事ですね。いくら初心者の私でも、あの山田さんに対して同じセリフを言えないじゃないですか・・・あっ!」
「・・・私ならOKって事ですね(涙)」
「い、いえ、そんな、そんなつもりでは、はははは・・・でも、ここにあなたのこんな写真がありますよ。ホレホレ。」
「あ、どこでそんなものを!」
「では、快く引き受けてくれますね?」
「は、はい・・・(涙)」

「では、私は何を作りましょうか?」
「そうですね、ちょうど、空魚屋さんの第3回のコラムで、もぐら叩きが登場しそうだったじゃないですか。」
「Palmの画面を保護する、という理由で叩かなかった人道的なコラムですね。私ならPalm社やHandSpring社と提携して、バシバシ叩きまくるように書き上げますが。」
「なんて悪徳な発言を、ここは公共の場ですよ。」
「あ、そんな冗句ですよ、軽いアメリカンジョーク。」
「アメリカ人のジョークは洒落になりませんよ。」
「あ、いえ、で、モグラ叩きがどうかしましたか?」
「ええ、あのサンプルでは、決まった位置に画像が表示されていたんですが、例えば、タップした場所にイラストが表示されれば、面白いかな、なんて思ったんですよ。」
「言ってみれば、スタンプのようなものですか?タップした場所にポンポンと表示される訳ですから。」
「ええ、そんな感じです。タップしてポン、でいいです。あまり難しくても、わからないでしょうから。」
「『でいいです』ってのが引っかかりますが、やってみましょう。まずは、NS Basicを起動しましょう。」

「あ、試用版の表示が出ませんね。」
「当たり前でしょう!私は正規ユーザーですから。ちなみに、試用版と正規版は同居できませんから、試用版のスクリーンショットを取るのに苦労しました。」
「なるほど、では、正規版でお願いします。いつか、私もユーザーになりますから。多分。」
「はい、では、起動すると、こんなダイアログが表示されます。新しく作りますから、新規のプロジェクトファイルを開きます。これで、準備完了ですね。」
 そう言えば、このコンパイル設定はどうなっていたか、ちょっと確認しますね。」
「何ですか?それは」
「難しいので、簡単に言います。NS Basicで作ったプログラムは、NS Basicの上では動きません。」
「え?」
「NS Basicは、プログラムを書いて、誤りを訂正して、Palm上で実行できるファイル形式に変換するだけです。」
「そうなんですか。てっきり、NS Basicがあればよいかと思っていました。」
「残念ながら、そうではありません。」
「じゃ、作ったプログラムは、毎回、HotSyncして試すんですか?」
「基本的にはそうですが、それでは、作業が大変で、また、危険です。」
「危険?」
「そう、作ったプログラムが正常に動かずに、Palmをリセットする羽目に陥らせる可能性もあるからです。」
「Windowsが落ちるのに比べれば、Palmのリセットは気楽ですよね(笑)」
「まぁ、そうですね。データが飛んじゃわなければいいですけどね(笑)」
「(笑い止まる)あるんですか?そう言う事が」
「ないとは、言えませんが、NS Basicだとランタイムの範囲を越えて大きなエラーにはなりませんから、安心です。だから、毎回実機でテストする人も少なくないです。」
「ちょっと、安心しました。」
「では、設定の確認です。[ツール]の[オプション]に[コンパイル/ダウンロード]というタブがあります。ここを確認します。
 [コンパイル後...]には「POSEへ送る」「デバイスへHotSync」「何も行わない」の3つの選択肢がありますね。ここで、POSEを選べば、パソコン上のエミュレータで試せます。」

「あれ?NS Basic単体では、実行できないんじゃなかったですか?」
「はい、POSEは、Palm OS Emulator という別プログラムなんです。これは、PalmComputingさんが開発者向けに提供しているものなんですよ。」
「じゃ、パソコン上でPalmのアプリが動くんですか?」
「ええ、まぁ。不可解な動きをする事がありますので、とりあえず動作を見て、最終的には実機で確認する必要はありますけどね。」
 ちなみに、最近のNS Basicには、NS Basicユーザーに特化したエミュレーターがバンドルされています。」
「そうなんですか、便利になりましたね。あと、オプションで[デバイスへHotSync]ってのを選択すると、自動的にしてくれるんですか?」
「いえ、残念ながら、次回のHotSync時にインストールされるようにセットされるだけです。」
「なるほど。じゃ、[何も行わない]ってのは?何もしないんですか?意味ないですね。」
「いえいえ『コンパイル後』ですから、コンパイルした後に、何もしないんです。」
「あ、そうか。」
「そう、コンパイルされたファイルは出来ます。通常は、C:\NSBasic\DOWNLOAD、というフォルダにファイルが出来ます。」
「・・・わかりましたが、なんだか飽きてきました。そろそろ作りはじめませんか?」
「なんて態度ですか!そもそも、教わっている立場としての態度は・・・」
「ホレホレ、これこれ」
「ううう・・・では作りはじめるとしましょうか。」
「待ってました〜」

「まず、画像を用意しなければなりませんが、何かありますか?」
「どういう形式の画像ですか?」
「基本的にビットマップ、GIF、JPEGが可能です。」
「意外と使えるんですね。ちょっと感心しました。」
「Ver.1.の時は、モノクロビットマップしか使えませんでしたが、今のバージョンは、そういう点では便利ですね。」
 で、私は絵心がないので、何か描いてもらえませんか?」
「は?描けませんか?」
「残念ながら、絵心に欠けるようでして・・・」
「仕方ないですね、じゃ、これでも」

「うわぁ、これでは大きすぎます。Palmの画面は160x160ピクセルですよ。そんな所に、こんなもの表示させても意味ないじゃないですか。」
「そう言えばそうですね。じゃ、これでどうでしょう。」

「こんどは、思いのほかシンプルですね。」
「ええ、お気に入りのキャラクターです。」
「ちょっとコマーシャルが入っていますが、Ohyoi3のイラストは私も好きですよ。では、これを使わせて頂きましょう。」
 まず、この画像をBitmapsフォルダにコピーします。」
「どうしてですか?」
「ま、どこでも良いんですけど、IDEからビットマップを追加する時に開くダイアログ、デフォルトがここなんで便利なんですよ。」
「ちょっとしたコツですね。」
「まぁ、そんなもんです。ま、ついでですから、さっきの画像を追加します。」
 これを使って、タップしたら画像を表示する仕組みを作りましょう。とりあえず、タップした位置とは無関係に表示しますね。
 フォームのイベントにこんなプログラムを書きます。

Sub Form1003_Event()
  DrawBitmap 1004,50,50
End Sub

 1004ってのは、画像のID番号ですね。空魚屋さんと同じですから、詳細はそちらを見て下さい。
 でも、とりあえず、出来ちゃいました。これで完成です。コンパイルして試してみましょう。」
「え、完成ですか?1行入れただけじゃないですか。」
「試してみましょう。」

「あ、本当だ。タップしたら画像が表示されますね。もう1回・・・あれ、何も起きてないですか?」
「正確には、タップする度に画像が表示されているんですけど、同じ位置に表示されているから、わからないだけですよ。
 ちょっと1つ付け加えてみましょう。

Sub Form1003_Event()
  DrawBitmap 1004,50,50
  Beep
End Sub

 これで、タップしたとき、ビープ音が鳴れば、動作していることがわかるでしょ?動いているかどうか、よくわからない時に使う手です。」
「あ、確かに、タップすると音が鳴りますね。ん?あれれ?ジョグを動かしても、ボタンを押しても音が鳴りますよ。
 ボタンだと、音が鳴ってから予定表が起動しますね。どう言う事ですか?」
「ははは、気付きましたか。実は、何が起きても同じ部分が実行されていたんですよ。」
 実際は、

Sub Form1003_Event()
  If GetEventType()=NsbPenDown Then
    DrawBitmap 1004,50,50
    Beep
  End If
End Sub

 こんな感じです。」
「こんな感じ、って言われても、なんだか難しくなりましたね、唐突。分かるように少しずつ説明してくれませんか?」
「では、まず、プログラムは、上から下の順に実行される事を覚えておいてください。」
「はぁ、なんとなく理解できます。これで言うと、このサンプルは、Ifナントカ、DrawBitmap、Beep、End If、という順番ですね?」
「ええ、大筋は合っています。プログラムは上から下に順番に実行されますが、条件によっては実行したくない部分もあるはずです。 例えば、さっきのサンプルは、タップ以外は処理したくなかったでしょ?そういう流れを制御する命令が、Ifなんです。イベントモジュールでは、大抵登場する、GetEventType()という関数と組み合わせるんですが、あえて1行目を日本語で言うならば、

    もし、発生したイベントがNsbPenDownだったら、

 と言う事になります。NsbPenDown、って言うのはわかりやすいでしょ?NS Basicでの決め事で、タップした時、という事を表します。」
「他は、NsbPenUp、NsbKeyorButton、NsbJogDial、などがあります。」
「おぼろげながら、それぞれの内容はわかりますね。でも、大文字小文字が混じっていて、扱い難そうですけど・・・」
「あ、NS Basicでは大文字小文字の区別はほとんどの場合ありません。なので、nsbpendown、と書いても同じです。」
「なんだ、ホットしました。そうすると、1行目は・・・」
「イベントが発生したら、PalmOSは、どんな種類のイベントが発生したか、NS Basicユーザーが知り得ない場所にその種類を記憶します。 その場所から、どの種類かを聞き出すのがGetEventType()という関数です。」
「関数、って、y=f(x) のような学校の数学の時間を思い出しますけど・・・なんだか、嫌だなぁ。」
「ま、プログラムで使うところの関数は、何かを与えると、それに応じた何かを返す、という一種のブラックボックスと思ってください。」
 そして、プログラムでは、何も与えなくても、一定の何かを返す関数も多く存在します。GetEventType()もそんな関数の1つです。」
「ああ、カッコは飾りじゃないんですね。」
「ええ、まぁ、そう言う事ですね。」
「Ifと言えば、最後の行にもEnd IfというIfがありますが、これは、関係あるのですか?」
「はい、If 〜 Then … End If は『もし 〜 ならば…を実行しなさい』という文法をもった命令で、実はセットなんです。」
「ははぁ、関数の次は文法ですか。」
「構文とも言いますね(笑)」
「今度は英語の授業?」
「プログラムは、簡単な英語風の命令語で作られているんですが、文法や構文の正確さを厳格に求めてきます。あ、NS Basicがですけどね。
 したがって、英語の授業のように、実は主語が省略されて、などと言うことはありませんので、文法は丸暗記で結構です。」
「いや、この年になると、丸暗記も辛いですが・・・」
「流れを制御するような命令語は、PalmやCLIEの種類に比べればはるかに少ないですし、無理に覚えなくてもいいですよ。 私も、未だに、ハンドブックを見ないとわからない綴りの命令や関数が多いですから。」
「安心しました。じゃ、話を戻しますけど、要するにIfからEnd Ifの間が処理されるわけですね?タップだったら。」
「そうです、難しく言うなら『タップされたという条件で』処理されるんですよ。」
「たった4行ですけど、奥が深いですね。これからが不安ですけど、本当にあなたが言うような日曜大工感覚ですか?」
「ウソです!」
「・・・?ウソ?人をその気にさせておいて〜!!」
「冗談ですよ。本当に日曜大工ですよ。この4行で1つの物事が完結しているでしょ?タップされたら画像を表示して音を鳴らす、って。 こんな部分がいくつもいくつも出て来るので、全体として難しく感じるんですが、実際は、小さい部品の組み合わせですよ。」
「ははぁ、わかったような、上手くごまかされたような。」
「じゃ、次は、こうして見ましょう。

Sub Form1003_Event()
  If GetEventType()=nsbPenDown Then
    Dim X as Integer
    Dim Y as Integer

    GetPen X,Y,NsbPenDown

    DrawBitmap 1004,X,Y
    Beep
  End If
End Sub

 これで、タップした位置に画像が表示されるようになります。」
「じゃ、早速・・・あ、ホントだ!でも、前のに比べると、全く別物ですね。XとかYとか、これも命令ですか?」
「これらは、変数と言います。」
「また新しい言葉ですね。」
「簡単に言いましょう。GetPenという命令は、タップした位置を調べる機能を持っています。」
「ふむふむ」
「X,Y,NsbPenDownと、GetPenの後ろに3つ並んでいますね。GetPenは、これを実行した時に1番目の変数に横軸の位置を、2番目の変数の縦軸の位置をセットする働きがあります。」
「3番目は?」
「これは、タップをした時か、ペンが離れた時かを指定できるんです。具体的には、NsbPenDownかNsbPenUpですね。」
「NsbPenDownになっていますから、タップした時ですね。」
「そうです、タップした位置を、XやYという箱に入れているんです。」
「箱・・・ですか?」
「そう、箱です。XやYは、私が勝手につけた名前です。別に、

    GetPen kagochan,tsujichan,nsbPenDown

 でも良いんですけど、座標ですから、X、Yにした訳です。箱の名前はBASICの命令や関数以外だったら、大抵なんでも大丈夫ですが、1文字目はアルファベットじゃないとダメです。」
「・・・じゃ、その後の、DrawBitmapで、さっきの 50,50 が X,Y になっていますが、これは、さっきの変数でしたっけ、その Xや Yと同じなんですか?」
「その通りです。このXとYは、先ほどGetPenで値をセットしたXやYと同じです。だからその値が、そのまま反映されているわけですね。
 専門用語では、変数に値を入れるのを『代入』、変数の中身を見ることを『参照』などと言います。」
「じゃ、先頭のDimナントカ、というのは、何ですか?」
「これは、今から、XとYという変数を使いますよ、ってお断りしているんです。専門用語では『宣言』って言います。」
「誰に許可を得ているんですか?」
「NS Basicにですね。今から、こういう変数を使いますよ、って。」
「ははぁ、じゃ、無断では使えないんですね?」
「そうです。NS Basicでは使えません。使う前にNS Basicに箱の準備をさせるんです。」
「後ろの as Integer ってのは何でしょう?」
「これは、箱の種類を表しています。Integerは『整数』って意味です。この変数は整数しか入れませんよ、っていう宣言です。」
「種類というと、他にもあるんですか?整数、以外にも・・・?」
「大きく分けると、文字列と数値の2種類です。その中で数値は、範囲の大小と、整数・実数の区別があります。」
「数値は、組み合わせて4種類あるわけですね。どうやって使い分けるんですか?」
「適当に、自分で使い分ければ良いです。大きな数字を使うのか、小数を扱うか、などですね。」
「メリットはあるんですか?」
「ええ、大きな数字を使う変数は、それだけ余分にメモリーを使います。」
「なるほど。大は小を兼ねる、って言葉がありますけど。」
「ま、タップするのは、画面なので0から159の間の整数ですから、Integerで十分です。必要最小限でいきましょう。」
 あ、Palmの画面は160x160ピクセルで、左上が(0,0)、右下が(159,159)になります。」
「(1,1)から(160,160)じゃないんですね。」
「ええ、そう言うモノですから覚えてください。」
「なんとなく、わかりました。ただ、タップした位置に表示されるのが気に入らないですね。」
「え?目的通りでしょ?」
「いえ、タップした位置に表示される、っていうのは、こういう状態じゃなくて、こんな状態ですよ。」


---こういう状態----


----こんな状態----

「なるほど、ペンの中心ですね。ところで、表示している画像サイズって?」
「えっと、確か、50x50ピクセルです。」
「じゃ、こんな感じになります。

Sub Form1003_Event()
  If GetEventType()=nsbPenDown Then
    Dim X as Integer
    Dim Y as Integer

    GetPen X,Y,NsbPenDown

    DrawBitmap 1004,X-25,Y-25
    Beep
  End If
End Sub

 試してみましょう。」

「これです、これ!タップした位置に表示されました!」
「でしょ、さて、どうしてかと言いますと」
「ふむふむ」
「残念ながら、紙面がつきました〜」
「え〜っ、これから、って言う時に、野球放送のように延長はありませんか?」
「残念ながらスポンサーさんはありませんから、ご好意もありません。あ、この写真は返していただきます。」

サッ!

「あ、っつ、くっ!」
「はい、またお会いしましょう」



copyright(C)2002 Hacker Dude-san all rights reserved.