WorkspaceV

某勉強会に行ったときにふと思い立って作ったプロジェクトを公開しました。

http://ss3.gemstone.com/ss/WorkspaceV.html

PharoのWorkspaceをちょこっと拡張して、使用しているワークスペース変数のボタンを並べたという簡単なものです。

クリックするとインスペクタが開くので、コード中で使ったワークスペース変数に簡単にアクセスできます。

VisualWorksあたりで見た記憶があるのですが、Pharoで演習をやる際にも使えそうだと思って作りました。

MIT Licenseです。

Windows7マシン(32bit版)にAndroidの開発環境を導入する

Android開発環境をWindows7マシンに構築するおおまかなメモ。

参考:http://playet.jugem.jp/?eid=171

Java JDK

http://www.oracle.com/technetwork/java/javase/downloads/index.html

  1. 上記から、Java Platform (JDK) 7u9(jdk-7u9-windows-i586.exe)をダウンロードする。
  2. ダブルクリックで起動し、そのままインストール。

Android SDK

http://developer.android.com/sdk/index.html

  1. 上記から、installer_r20.0.3-windows.exeをダウンロードする。
  2. ダブルクリックで起動する。
  3. インストール先をC:\androidに変更する。

Android SDK Manager

  1. Android SDKのインストール後に自動起動するか、スタート-プログラムから起動させる。
  2. (プロキシサーバの設定)ToolsのOptions…でProxyサーバーとポートを設定する。ポートの入力欄が隠れて見えないが、Tabで移動して入力。Closeで完了し、一度画面を閉じてからスタート-プログラムでSDK Managerを選んで再度起動する。
  3. Packageにはチェックされた推奨のもの以外に、手持ちのAndroid端末のOSバージョンを選んでおく。
  4. Install xx packagesをクリックして、Accept Allを選び、インストールを開始する。

環境変数の設定

  1. 以下をシステムの環境変数PATHに追加する。
  2. c:\android\tools;c:\android\platform-tools

Eclipse

http://www.eclipse.org/downloads/

  1. 上記から、Eclipse Classic 4.2.1(eclipse-SDK-4.2.1-win32.zip)をダウンロードする。
  2. 圧縮ファイルをc:\androidに展開する。

ADTのインストール

  1. Eclipseを起動し、Help-Install New Software…を選ぶ。
  2. Add…ボタンをクリックする。
  3. Name:欄に「ADT Plugin」を入力し、Location欄に「https://dl-ssl.google.com/android/eclipse/」を入力し、OKを押す。
  4. Developer Toolsにチェックを入れてNextを押す。
  5. そのまま続ける。
  6. Eclipseが再起動する。

実機デバッグのためのドライバインストール

(機種によって異なるため省略)

実機を接続する。

サンプルのビルド

  1. Eclipseを起動する。
  2. File-New-Other…を選ぶ。
  3. Androidから、Android Application Projectを選ぶ。
  4. Application Nameに適当なもの(例えばTest1)を入力する。(先頭は必ず大文字とする)
  5. Nextを順に押していって最後はFinishを押す。
  6. 作成したプロジェクトのAndroidManifest.xmlをダブルクリックで開く。
  7. ApplicationタブのDebuggableをtrueに設定して保存する。
  8. Run-Runを選ぶ。
  9. (初回はTargetが不足している旨のダイアログが出るので、Installボタンを押す)
  10. 作業と運が良ければ実機に「Hello World」と表示される。

KinectDollar1

利用者ゼロの気がするけど、あいかわらずKinectをPharoにつなげています。

先日、大島さんが$1 Gesture RecognizerのSqueak実装を公開されたので、さっそくKinectで利用してジェスチャー認識をさせてみました。

最初のKinectOSCはサンプルだけで実用性に乏しかったのですが、ジェスチャー認識できれば応用も見えてくるかな。

以前の記事に従ってKinectOSCを導入したら(過去に導入してたら最新版に更新する必要あり)、大島さんの$1 Gesture Recognizerを導入します。

MCHttpRepository
location: 'http://ss3.gemstone.com/ss/Dollar1’
user: ''
password: ''

Dollar1MorphをPharoで試すには、initializeのsketchの初期化部分を以下のように変更する必要があるけど、Kinectで動かすなら特に変更は不要です。(でもせっかくだから変更しましょう)

sketch := ImageMorph withForm: samplePicture.

後はKinectDollar1を導入すればOK。

MCHttpRepository
location: 'http://ss3.gemstone.com/ss/KinectDollar1’
user: ''
password: ''

ジェスチャー認識のキモ部分は全て大島さんの実装にかかっており、このモーフの仕事は単に骨格の情報からストロークを切り出すことだけなのですが、アドホックな実装なので以下に気をつける必要があります。

  • ジェスチャーを認識するのは右手のみ。
  • 首よりも前に突き出したときに認識するようになっている。
  • ストロークのはじまりと終わりには、1秒程度静止する必要がある。
  • ストロークの記録が始まる時は骨格の背景のグレーが少し明るくなる。
  • 今のところProtractorには対応してない。

実際の利用はこんな感じです。

  1. まずは身体を認識させる(緑背景で骨格が表示されればOK)
  2. 右手を突き出して1秒ほど静止する。
  3. 背景が明るいグレーになったらジェスチャーを始める。
  4. 終わったら(気持ち、開始時より長めに)1秒ほど静止する。
  5. 画面の上に認識結果が表示される(はず)

慣れないと最初はうまく認識できないかもしれません。私自身はジグザグも星も認識されました。

さて、これを何に使うかな。

OmniBaseの導入

@http://twitter.com/kuritar さんがtwitterでOmniBaseの導入方法をつぶやかれているのですが、見失いそうなので手順をまとめておきます。@http://twitter.com/kuritar さん、いつもありがとうございます!

はじめに

まず利用するPharoは、先頃公開された Pharo 1.4 Summer とする。

http://www.pharo-project.org/home

また、Seasideで使うためにOmniBaseを導入するため、先にSeaSideをインストールしておく。

Seasideの導入

Pharo起動時に表示されるWorkspace内にある、 MetacelloConfigurationBrowser open. をdoitし、ConfigurationBrowserを出す。

次に、ConfigurationsタブにあるSeaside30を右クリックして、Install Configuration(stable)を選ぶ。

しばらくするとロードが始まるので終了まで待つ。

OmniBaseの導入(2012/7/26追記)

UntrustedタブにはOmniBaseも載っている。しかし、@kuritar さんが指摘されているように、そのまま右クリックではインストールできない(どうやらstableバージョンがない)ため、いったんLoad configurationを選んでロードしておき、別にWorkspaceを開いて以下をdo itする。

ConfigurationOfOmniBase load.

こちらもしばらく待てばインストールが完了する。

SystemBrowserでOmniBase-Testsのテストを実行すると、OmniBaseTest>>#testObjectLockingとOmniBaseTest>>#testObjectLocking2で失敗する。

なお、@kuritarさんによると、Windowsでは他のテストも失敗するらしい。この原因は OmniBaseTest>>#dirの中のディレクトリセパレータが”/”となっているからで、以下のように修正すれば良いだろう。

dir
^ FileDirectory default fullName, FileDirectory separatorString, 'OmniBaseTester'

OmniBaseJの導入(2012/7/22修正)

このままだと日本語の処理に問題があるようなので、 @umejava さんのOmniBaseJを導入する。

なお、OmniBaseJでは代入に「:=」でなく「←(実際にはアンダースコア文字)」を用いているため、インストールの前に以下をdo itしてコンパイルできるようにする。

Scanner allowUnderscoreAsAssignment: true.

Monticelloブラウザを起動して、以下のレポジトリを追加する。

MCHttpRepository
location: 'http://squeaksource.blueplane.jp/OmniBaseJ’
user: ''
password: ''

Openでレポジトリブラウザを開いてOmniBaseJをLoadすれば良い。

また、OmniBaseJではscaledIdentityHashというメッセージを使っているが、Pharoには存在しないため identityHash で置き換える必要がある。

World menu->Tools->FinderでSelectorをSourceに変更してscaledIdentityHashを探すと、ODBIdentityDictionary内に6つのメソッド内で使っていることがわかるので、それぞれ identityHash に置き換える。

OmniBaseJ-Coreカテゴリに移ったOmniBaseTestでテストを実行すると、新たに OmniBaseTests>>#testStoreLoadByteArrayKey でファイルが存在しないというエラーが発生するが、create a new fileを選べばテストが通るようになる。

DBAccessorの導入(2012/7/22追記)

OmniBaseを使いやすくするために、 @http://twitter.com/umejava さんがDBAccessorというラッパークラスを作成されているので導入する。特に、「SeasideへGo!(第4回) http://www.ogis-ri.co.jp/otc/hiroba/technical/seaside/seaside4/ 」を使う時には必須である。

Monticelloブラウザを起動して、以下のレポジトリを追加する。

MCHttpRepository
location: 'http://squeaksource.blueplane.jp/DBAccessor’
user: ''
password: ''

Openでレポジトリブラウザを開いてDBAccessorをLoadすれば良い。

KinectOSCの導入

Pharoを使っていて、Kinectを持っていて、それを繋げようなんて考える人がいるとは思わないんだけど、とりあえず作ったので公開してみた。

http://ss3.gemstone.com/ss/KinectOSC.html

この記事ではその導入方法について説明する。

KinectOSCは、Kinectからの情報をOSC(Open Sound Control)プロトコルを通じて得て、それをMorphicで利用できるようにするためのPharoのクラス群である。サンプルとして簡単なモーフも付けているが、いろんなアプリケーションで活用することを目指している。

KinectOSCは、KinectとPharo以外にもいくつかのツールやパッケージを利用して動作するようになっており、その構成は下の通りである。

Kinect – OpenNI – OSCeleton = (OSCプロトコル) = Pharo – OSCClient – KinectOSC

以下、順に導入方法を説明していく。

OpenNI

KinectをPCやMacで利用するためのドライバなどである。これがないとOSCeletonが動作しない。

インストール方法は適当にググってください。

OSCeleton

OpenNIを利用して、Kinectから得た情報をOSC(Open Sound Control)プロトコルでネットワークに送信するツール。

ソースがGithubに公開されている。

https://github.com/Sensebloom/OSCeleton/

WindowsとMacOSX用のバイナリが以下のページからダウンロードできるので対応する方をダウンロードする。

https://github.com/Sensebloom/OSCeleton/downloads

ダウンロードしたら適当なフォルダに展開しておく。

Pharo

Pharo使いであれば特に説明は不要でしょう。KinectOSCは1.3か1.4で動作確認しているのでどちらかを入手。

http://www.pharo-project.org

ダウンロードして展開したら起動する。

OSCClient

OSCClientはOSCeletonが送信したOSCのメッセージをPharoに取り込むためのクラス群。

KinectOSCではOSCの受信のためにOSCClientを使っているため、以下のようにPharoにインストールしておく。

  • Monticello Browserを開き、+RepositoryでHTTPを選び、以下を入力(コピペ)してOKを押す。
MCHttpRepository
location: 'http://www.squeaksource.com/OSCClient’
user: ''
password: ''
  • 右側のペインで上記のリポジトリを選択してOpenを押す。
  • OSC-Richo.23.mczを選んで、Loadを押す。
  • System BrowserでOSC-Testsクラスカテゴリを選択し、右ボタンでRun Testsを選び、テストが成功することを確認する。

KinectOSC

いよいよKinectOSCをPharoにインストールする。

  • Monticello Browserの+RepositoryでHTTPを選び、以下を入力してOKを押す。
MCHttpRepository
location: 'http://ss3.gemstone.com/ss/KinectOSC’
user: ''
password: ''
  • 右側のペインで上記のリポジトリを選択してOpenを押す。
  • 左側のペインでKinectOSCを選び、右側のペインで一番上のKinectOSC.mczを選んで、Loadを押す。
  • System BrowserでKinectOSC-Testsクラスカテゴリを選択し、右ボタンでRun Testsを選び、テストが成功することを確認する。
  • とりあえずPharoをSave & Quitする。

テストモーフの実行

KinectOSCでは動作確認用に簡単なモーフを実装している。

以下のようにして動作を確認する。

  1. OSCeletonを実行する。Windowsの場合はOSCeleton.exeをダブルクリックして実行すれば良い。
  2. Initializing…の後、Initialized Kinect, looking for users…が表示されればOK。そうでなければKinectの接続かOpenNIのインストールに問題がある(多分)。
  3. Pharoを起動して、Workspaceに「KOSampleMorph new openInWorld.」という式を入力し、選択後にDo itする。
  4. 赤いモーフが現れるが、これはユーザーが認識されていない状態。Kinectの前に立って認識されれば緑色に変化する。
  5. バルタン星人のポーズを取って骨格が認識されると、モーフに関節が表示され、動きに応じて変化する(はず)。

その他

OSCCeletonは引数に「-a 192.168.254.99」のようにIPアドレスを指定すれば他のPCにデータを送ることもできるので、Kinectに接続するPCとPharoを動作させるPCを分けて使用することができる。結構便利。

Kinectのデータを受信できた

Kinect-OSCeletonの発した骨格データを、Pharoで受け取ってモーフで表示させることに成功した。

詳しくは後で述べる予定だが、気がついたことを先に。

server when: #messageReceived evaluate: [:msg | Transcript cr; show: msg].

上のようにすると、OSCeletonのメッセージは/new_user, /lost_user, /new_skelしか受け取ることができず、肝心のjointメッセージを受け取れない。

後者を受け取るには以下のように、 #bundleReceived を使う必要がある。

server when: #bundleReceived evaluate: [:msg | Transcript cr; show: msg].

PureData

せっかくなので、 @http://twitter.com/goonsh さんが http://goonsh.ddo.jp/fg/2008/06/14/squeak-osc-pd で紹介されているように、PureDataとの通信を試してみる。

PureDataからPharoへの通信

Pharo側の準備をする。
server := OSCServer listenOnPort: 9999.
server when: #messageReceived evaluate: [:msg | Transcript cr; show: msg].
  1. Workspaceを開いて上記をコピー&ペーストし、選択してDo itする。
  2. 通信の確認用にTranscriptを開く。
PureDataをインストールしてPureData側の準備をする。

http://puredata.info/downloads/pd-extended からPd-Extendedをダウンロードしてインストールする。

PureDataを起動する。(コンソールが表示される)

20120619160728

Help から Browser… を選んでヘルプブラウザを出し、oscx/ を選んで右側の一覧から sendOSC-help.pd をダブルクリックする。

20120619160727

PureDataからPharoへの通信をチェックする
  1. sendOSC-help.pdで “connect localhost 9999” と書かれたメッセージをクリックすると、PureDataのコンソール画面に “sendOSC: connected to port localhost:9999 (hSock=21782528) protocol = UDP” のようなメッセージが表示される。
  2. 同様に、 “send /test/bla 1 2 3” と書かれたメッセージをクリックすると、PharoのTranscriptに an OSCMessage(‘/test/bla’ 1 2 3) のように表示されればOKである。
  3. PharoのWorkspaceで、 server terminate. をDo itしてOSCServerを止める。

PharoからPureDataへの通信

PureDataのヘルプブラウザで dumpOSC-help.pd をダブルクリックする。

EditメニューでEdit modeを選んだら、再度Edit modeを選ぶ。このとき、PureDataのコンソール画面に ” dumpOSC 9999 … couldn’t create” のようなメッセージが出る場合には、ポート番号=9999でOSCServerが動いている。前述のようにPharoのWorkspaceでOSCServerを止めるか、Edit modeに戻した上でdumpOSCのパラメータを9999以外の値にする。

Pharoのワークスペースで、以下をコピー&ペーストし、Do itする。

msg := OSCMessage for: {'/test'. 200. 300. 400}.
msg sendTo: NetNameResolver localHostAddress port: 9999.

PureDataのコンソール画面に “rcvOSC: /test 200 300 400” が表示されればOKである。

OSCClient

Pharo1.4でOSC(OpenSound Control)を動かしてみた。
まずは、Monticelloブラウザを開いてOSCClientをインストールする。
RepositoryボタンでHTTPを選んで以下をコピー&ペースト後、OKを押す。
MCHttpRepository
location: 'http://www.squeaksource.com/OSCClient'
user: ''
password: ''

右側のペインで ttp://www.squeaksource.com/OSCClient を選び、Openボタンを押す。
20120619154640
OSCClientのRepository画面の右側のペインの先頭(この時点ではOSC-Richo.23.mcz)を選んでLoadボタンを押せば、OSCClientのインストールが完了する。
20120619154849
ブラウザを開いてOSC-KernelとOSC-Testsの2つのクラスカテゴリが追加されていることを確認する。
20120619155002
ついでに、OSC-Testsを選んだ状態でALT-tを押してテストが成功する事も確認しておく。

Morphicレッスン

昨日のScratchDayでPharoのことについて少し話をしました。

予想通りワールドカフェでは誰も参加者がいなかったのですが、そのために用意した配布資料があるので公開しておきます。

ワールドカフェの30分という制限時間でMorphicらしさを伝えるのは大変難しく、出来合いのクラスにちょこちょこっとコードを加えるようなものですが、少しはSmalltalk-80/Pharo/Morphicの雰囲気が伝わるかと思います。

当日配布用のハンドアウトはこちら。ダウンロード方法やフォント設定、パッチファイルの導入方法が書かれています。

http://itolab.com/software/scratch/ScratchDay-Morphic.pdf

(追記)日本語フォントの設定前にパッチを導入すると文字化けになります。ハンドアウトの順序で作業してください。

パッチファイル(mczファイル)はこちら。

WindowsとMacでキーコードが異なるので、それぞれにあったものをダウンロードしてください。

[Windows用]

http://itolab.com/software/scratch/ScratchDay-EiichiroIto.18.mcz

[Mac OS X用]

http://itolab.com/software/scratch/ScratchDay-EiichiroIto.17.mcz

※キーコードは、 Shooting>>#keyDown: と Shooting>>#keyUp: で設定しています。

実戦でチェックしていないので間違い等あると思います。

問い合わせなどは @http://twitter.com/razdan3 までどうぞ。

日本語を含んだコードをFileOutできない

Pharo 1.3にいまさらながらのバグ発見。

日本語が含まれたコードをFileOutしようとすると、「writeLeadingCharRunsOn:が無い!」というノーティファイアが起動してしまう。これは、WriteStream>>nextChunkPut:のバグで、文字列aStringがユニコード文字を含んでいるか判定した後、(実際にはTextオブジェクトである)aStringを文字列に変換せずに当該メッセージを送信するために発生する。

要は、最後の方の

aString writeLeadingCharRunsOn: self.

を

aString asString writeLeadingCharRunsOn: self.

のようにすれば解決する。

ProfStefの日本語化の見直しをしている間に判明した。以前はエラーでてなかったということは1.3で挿入されたのだろうか?

とりあえず、パッチファイルを置いておく。

http://itolab.com/software/pharo/fixFileoutIncludesUnifiedCharacter.1.cs