Pharoによるプログラミング入門

3年生ゼミのプログラミング入門では、言語環境としてPharoを採用した。今まで個人学習のためにSmalltalk/80系の言語を推奨したことはあったけど、全体で採用したのは始めての試みである。

私がメインで開発に使用している言語ながら、今まで入門として使ったことがなかったのは、率直に言ってプログラミングの経験が全くない初心者に教える自信がなかったから。

その考えが変わったのはいろいろあるのだけれど、大きな理由の一つはちょうど良い題材が見つかったからである。「がまぐ」は土本さんが編集されている中高生向けのオンラインゲーム雑誌であるが、オッサンホイホイの異名通り私もすっかり虜になって、これをネタとしてみたいという思いが強くなった。

 がまぐ:http://sites.google.com/site/gamagreader/

Morphicならば元のJava実装よりも、かなりコンパクトに作れるだろうし、初心者でも十分把握できるレベルになるのではないかと思った。SqueakでなくPharoを選んだ理由は、単に個人的に興味があったのと、パッケージングがシンプルだということ。

授業の組み立てとしては、最初にProfStefで簡単な入門を行った後、「がまぐ 2011/2」のJackPotを例にPharo環境の説明を行い、後半は「ブロック崩し」「ピンポン」「弾幕ゲシュタルト(がまぐより)」から1つを選んでもらい、設計から作り上げるというもの。

前半のJackPotでは、オリジナルソースのPharo版のメソッドを一つ一つ説明しながら、役割や文法について理解してもらい、プレイヤーの高速化や宝物入手時の動作など「がまぐ」と同じストーリーで進めていった。

JackPotでは4種類のオブジェクトが登場する。「自分」「敵」「宝物」「ゲーム本体」である。MVCのようなすっきりとした設計ではなく、オブジェクトとその表現が直感的につながるよう、各々Morphとして実装していった。

後半で学生に実装済みのゲームを見せたところ、圧倒的に「弾幕ゲシュタルト」が人気だったので、設計から取りかかることにした。設計といってもゲームを見ながらオブジェクトを見いだしてCRCカードを作成するというもの。二人一組でゲームを文章化し、その文章をもとにオブジェクトや属性、振る舞いを明確にしていく。それほど厳密な定義ではなく、作成途中で方向性を見失わない程度のものとした。

最初にJackPotからキーボード処理など流用できる部分をコピーさせ、その後一つずつオブジェクトを仕上げていった。1台のPCを二人が交互に使うように、ペアプログラミングもさせてみた。10名の受講者がいたので5組のチームに分けた。

かなり単純化して提示したものの、全くの初心者である学生にとっては、難易度の高い学習体験だったことは間違いない。受講者中の1名は興味を持った4年生だったが「昨年のゼミよりずっと難しい」とコメントしていた。

それでも5組中の1組はほぼ完全に理解し、2組は自力である程度作れるようになった。残りの2組はサポートがあれば何とかできそうといったところ。レベルの差こそあれ、プログラムと動作との関係をきちんと理解した上で、きちんと問題解決しているようだった。当初の見込みよりはかなり高いレベルに達したと思うし、オブジェクト指向プログラミングの基本的な考え方は身に付いたのではないかと思う。

もちろん、教えた範囲はかなり限定している。基本的な考え方としては、オブジェクトとメッセージパッシング中心で行い、クラス階層や継承なども教えていない。キーワードメッセージもできるだけ引数1つになるように誘導していった。題材が単純で、かつ面白いということも良い方向に作用したようである。

8月3日からゼミ合宿が始まる。メインは4年生の卒研発表なのだが、3年生からも2組の発表がある。完全に理解した組と要サポートの組である。この両者の発表を通じて、前期の成果がどの程度なのかわかるだろう。とても楽しみにしている。

MacでGainerMiniを使う(2)

シリアル通信でGainerMiniを使ってみた。

利用したソフトはJerminalである。

http://www.bsddiary.net/jerm/

ターミナルから、jerm -b 38400 /dev/cu.usbmodem1a21(usbmodelの後は環境による)でJerminalを起動する。

Q*?*を入力すると、プロンプト(Q*)に続いてバージョン番号等が得られる。

Q*KONFIGURATION_1*でコンフィグレーション1に切り替えることができる。

詳しいプロトコルは以下を参照した。

http://gainer.svn.sourceforge.net/viewvc/gainer/trunk/gainer/firmware/io-module_protocol.xls?view=log

MacでGainerMiniを使う

来期の科目準備のためにGainerを購入したので、Macで使ってみた。

参考元はこちら

http://www.gainer-mini.jp/

http://gainer.cc/

ダウンロード

以下のサイトからProcessing本体をダウンロード。現時点では、processing-1.5-macosx.zipが得られる。

http://processing.org/

以下のサイトから、ソフトウェア・ライブラリ(Processing)をダウンロード。現時点ではProce55ingLib_forGAINERmini_v001.zipが得られる。

http://www.gainer-mini.jp/?page_id=7

インストール

Processing本体を展開してできたProcessingアプリケーションをアプリケーションフォルダにコピーする。ここで、一度Processingアプリケーションを起動し、終了する。

ソフトウェアライブラリを展開し、そのフォルダ内容を書類フォルダ内のProcessingフォルダにコピーする。

接続

GainerとMacとをUSBケーブル(A-mini-B)で接続する。すぐにダイアログウィンドウが現れ、ネットワーク設定が必要な旨のメッセージが表示されるので、ネットワーク設定のボタンをクリックする。

Gainer上で赤色のONランプが点灯する。

Macの設定

ネットワークのダイアログでは、そのまま右下の「適用」ボタンをクリックする。Gainerの欄は「構成されていません」のままで良い。ダイアログを閉じる。

起動

Processingアプリケーションを起動する。

サンプル

File-Sketchbook-examples-Gainermini-buttonを選ぶ。Runを選ぶとスケッチがコンパイルされ実行される。青い画面が表示され、Gainer下部のスイッチを押すと赤く変化する。

注意点

たまにGainerへの接続が失敗することがある。

GainerMiniでは内部プルダウン抵抗がないため、外部でデジタル入力する場合にはプルダウン抵抗が必要。(プルダウン抵抗をつけないとOn/Offがゆっくり変化するように見える)

MacでArduino Unoを使う(1)

来期の科目準備のためにArduino Unoを購入したので、Macで使ってみた。

元ネタは以下から。

http://arduino.cc/en/Guide/MacOSX

ダウンロード

以下のサイトよりMac OS X版をダウンロードする。現時点では、arduino-0022.dmgが得られる。

http://arduino.cc/en/Main/Software

インストール

dmgファイルを開き、ArduinoアプリケーションをApplicationsにコピーする。

Unoを利用する場合には、FTDIUSBSerialDriverは不要なので何もしない。

接続

UnoとMacとをUSBケーブル(A-B)で接続する。すぐにダイアログウィンドウが現れ、ネットワーク設定が必要な旨のメッセージが表示されるので、ネットワーク設定のボタンをクリックする。

Uno上で緑色のONランプが点灯する。購入した状態でもオレンジ色のLランプが点滅している。

Macの設定

ネットワークのダイアログでは、そのまま右下の「適用」ボタンをクリックする。Arduino Unoの欄は「構成されていません」のままで良い。ダイアログを閉じる。

起動

Arduinoアプリケーションを起動する。

Arduinoアプリケーションの設定

メニューからTools-Boardを開き、Arduino Unoを選ぶ。

同様に、Tools-Serial Portを開き、/dev/tty.usbmodem3a21(下4桁は異なる可能性あり)を選ぶ。

サンプル1

File-Examples-1.Basics-BareMinimumを選ぶ。これは何もしないスケッチ(プログラム)である。

File-Upload to I/O Boardを選ぶと、スケッチが転送されUno上で実行される。オレンジ色のLランプが消え、緑色のONランプだけが点灯する。

サンプル2

File-Examples-1.Basics-Blinkを選ぶ。

File-Upload to I/O Boardを選ぶと、スケッチが転送されUno上で実行される。オレンジ色のLランプが点滅する。

Pharo 1.2.1 (Windows)での日本語入力

どうやら次期バージョンも間近のようだけど、手に入れたイメージでは、やはり日本語入力できなかった。

入力関係の処理がParagraphEditorからTextEditorに移ったせいで、1.1.1での対処も役には立たない。

とりあえず以下のように修正すれば日本語入力可能となる。

(TextEditor>>dispatchOn:へのコード修正箇所だけ)

- asciiValue := aKeyboardEvent keyValue.
+ char := aKeyboardEvent keyCharacter.
+ asciiValue := char charCode.

(メソッド後半にcharへの代入があるので、それも削除する。残しておいても問題ない。)

Pharo MLへ参加してないのでどうなっているのかさっぱりだが、イメージが出るたびに混乱させられそうな予感。

一応、1.2.1へのパッチをファイルとして公開しておく。もちろん無保証。

http://itolab.com/software/squeak/TextEditor-dispatchOn.st