Pharo 1.1.1 (Windows)での日本語入力(その3)

SqueakではInputInterpreterやLanguageEnvironmentが間に入って言語やホスト環境の差異を吸収しているのね。って既に知ってたわけだけど。

Pharoはそのあたりがメソッドの中に直に書かれていて、しかもParagraphEditor>>dispatchOnKeyEvent:with:でごにょごにょ気持ち悪いこととやっていて、これも問題だ。

特に、charとkeyCharの両者が文字を保持しており、charはRAWイベントの文字を使うくせに、keyCharはscanCodeから再度文字を生成しているのが問題。

Squeak4.2のTextEditor>>dispatchOnCharacter:with:を参考にしながら、charとkeyCharを同じ文字と見なして、keyValueをその文字コードにするというコードを加えたら問題なく入力できた。

(ParagraphEditor>>dispatchOnKeyEvent:with:へのコード追加部分)

char := keyEvent keyCharacter.
+  keyChar := char.
+ keyValue := char charCode.

しばらくこのまま使ってみて、問題があったらまた考え直そう。

(追記)

Pharo 1.2.1の情報はこちら。

id:nqthm:20110403

Pharo 1.1.1 (Windows)での日本語入力(その2)

Pharoでの日本語入力で入力されない文字があるのは、VMからわたされるキーイベント情報(と、多分その処理方法)に問題があるからのようだ。

具体的に言うと、漢字やひらがなが入力された時のイベント情報内のscanCodeが、Ctrl-H等の制御コードと同じものになっており、間違ってそちらが処理されてしまうため、正しく文字入力されない。この現象はPharo 1.0から引き続いている、というよりPharoの開発チームはこんな現象にあわないだろうから、関心も持っていないんだろう。きっと。

その点、Mac(SnowLeopard)では日本語入力時のscanCodeは必ず0になるようなので問題にならない。

手っ取り早く解決するなら、charCodeが256以上の時はscanCodeを0にしちゃうということだろうけど、この辺はSqueakの方法を見ながら解決していこう。

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

よく考えてみたらゼミ生のほとんどはWindowsを利用しているはずなので、Windows上でも表示・入力のテストをしてみた。

すると、http://17get.blogspot.com/2010/11/pharo.html で言及されているように、特定の文字入力ができない。

具体的には「使」とか「!」とか「栄」とか。

上記の文字列をコピーしておいてpasteすると問題なく表示されるので、入力の段階で問題があるようだ。

授業開始まで時間が限られてきたのにまた宿題が増えてしまった。

Pharo 1.1.1 (SnowLeopard)での日本語表示

SnowLeopard上でのPharoの日本語化に手こずったので、その記録。

ちなみに、Pharo 1.1では、World menu-System-SettingsでSettings browserを開き、AppearanceでStandard fontからフォント指定する。フォント一覧に、システムにインストールされたフォントが表示されるのでそこから適当に日本語フォントを選べば表示できる。

Pharo 1.1.1では同様の方法を試してもBitmap DejaVuとAccunyフォントしか表示されない。これはFT2Pluginが組み込まれないことによる。

Pharo 1.1.1の「パッケージの中身を表示」し、Contents/Resourcesフォルダを確認すると、Pharo1.1にはある「FT2Plugin.bundle」がないことがわかる。そこで、Pharo1.1のFT2Plugin.bundle(実際はフォルダ)をPharo1.1.1の同じ場所にコピーすれば、Pharo1.1.1でも日本語表示できるようになる。

(元ネタは、 http://forum.world.st/Fixed-Width-Font-for-COG-td3348188.html のHenrik Sperre Johansenのコメントより)

Squeak4.2でのkeyDown:(続き)

keyDown:でkeyValueが0になる件。時間もないのでクイックハックで解決。

MacUnicodeInputInterpreter >> nextCharFrom: sensor firstEvt: evtBuf
| keyValue mark |
keyValue := evtBuf at: 6.
+   keyValue = 0 ifTrue: [keyValue := evtBuf third].
mark := self japaneseSpecialMark: keyValue.
(以下省略)

適当すぎる。

(2011.3.23追記)

梅澤さんがSqueak4.2用のパッチを作って下さっており、それを適用すればこの問題も解決する。

Squeak4.2でのkeyDown:

Squeakが4.2になって、All-in-Oneパッケージが公開された。

早速使ってみようと遊んでいたところどうもおかしな挙動がある。

具体的にはkeyDown:メッセージで、引数イベントのkeyValueが0になるというもの。(MacOSX 10.6.6上で発生)

BorderedMorph subclass: #TestKey
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Test-Key'!
!TestKey methodsFor: 'event handling' stamp: 'e-itoh 2/18/2011 13:00'!
handlesKeyboard: anEvent
^ true! !
!TestKey methodsFor: 'event handling' stamp: 'e-itoh 2/18/2011 13:04'!
keyDown: anEvent
Transcript show: anEvent keyValue asString , ','! !

上記のようなTestKeyクラスを作ってTestKey new openInWorldをやると、Squeak 4.1までであればTrascript上にkeyValueの値が表示される。

同じクラスをSqueak4.2で動かすと0しか表示されない。VMをSqueak4.1で使っているSqueak 4.2.4beta1Uに変えても変化がないのでイメージの問題のようだ。

これが動かないとゲームが作れないぞ。困った。

OpenALのインストール(Windows)

主に以下のサイトを参考にした。

http://ameblo.jp/yoshi-no-blog/entry-10038122952.html

一部異なる部分について述べる。

(使用したVC++は、Visual C++ 2010 Express)

まず、インストール先をデフォルトのC:\Program FilesからC:\OpenALに変更した。(後で削除を楽にするため)

ダウンロードしたファイルは、

OpenAL11CoreSDK.zip

および

freealut-1.1.0-bin.zip

前者はzipを解凍するとインストーラプログラムが現れるので、こちらを起動してインストールすると、OpenAL 1.1 SDKフォルダに展開される。後者はそのままc:\OpenALに展開。

alut.dllはC:\Windows\System32フォルダにコピーし、alut.libはOpenAL 1.1 SDK\libs\Win32にコピーする。

なお、alut.hはincludeフォルダ内のALフォルダにあるので、ALフォルダごと、OpenAL 1.1 SDK\includeフォルダにコピーする。

VC++でリンカオプションにopenal32.libとalut.libを追加ライブラリとして設定するのだが、

#pragma comment(lib, "OpenAL32.lib")
#pragma comment(lib, "alut.lib")

と直接ソースに書いた方がてっとり早いのでそうした。

その他、ライブラリパスを設定するため、プロジェクトのプロパティのリンカーで、追加のライブラリディレクトリに「C:\OpenAL\OpenAL 1.1 SDK\lib\Win32」を設定した。

以上の設定でOpenAL関係のサンプルプログラムが動くようになった。

KinectをWindowsXPマシンに接続する。

主に以下のサイトを参考にした。

http://www.cyber.t.u-tokyo.ac.jp/~take/kinect/openni-windows-kinect.html

一部異なる部分について述べる。

まず、インストール先をデフォルトのC:\Program FilesからC:\Kinectに変更した。(後で削除を楽にするため)

また、Visual Studioは2005しか入っていなかったため、Visual C++ 2010 Expressをインストールした。ついでに、Microsoft Platform SDK(Windows® Server 2003 SP1 Platform SDKというやつ)をインストールした。

後は、先ほどのサイトの

1. OpenNIをインストール

2. Kinectのドライバをインストール

3. NITEをインストール

までは同じ作業を行った。

4. 設定ファイルの書き変え

については、なぜかlicenses.xmlの中身が既に修正後の内容になっていた(ので変更していない)。

5. サンプルの実行

については、あらかじめOpenNI/Samplesの内容をバックアップしておいてから、VC++ 2010 Expressで開いてみた。

2010のプロジェクトファイルを開いても、プロジェクトファイルの変換が必要といわれ、いくつかの警告が示された。

この警告は出力ディレクトリとリンカの出力ファイルの内容が異なるというもので、具体的には、出力ディレクトリが$(Configuration)を指し、リンカの方が../Bin/$(Configuration)/$(ProjectName).exeを生成するようになっている。

このままでは.exeをビルドしてくれないので設定変更する必要がある。

また、mfcのヘッダーファイルが見つからないというエラーでリソースのコンパイルにも失敗するので、これも設定変更する。

変更方法としては、ソリューションエクスプローラーでプロジェクトのプロパティを開き、構成プロパティのリンカーの出力ファイルを「$(Configuration)/$(ProjectName).exe」に変更する。

同様にリソースの追加のインクルードディレクトリの最後に、「;C:\Program Files\Microsoft Platform SDK\Include\mfc」を追加する。

以上でビルドは成功しコマンドがDebugフォルダに生成されるが、デバッグ実行しようとするとglut32.dllが見つからないというエラーが出るので、OpenNI/samples/binの中のglut32.dllをDebugフォルダにコピーする。

とりあえず以上の方法でNIViewerやNIUserTrackerをビルド&実行することができた。

冬休みの宿題

この冬休みにやりたいことを書く。時間的に難しいから、きっと最後の方で慌てるんだろうけど。

1.KinectとPCをつなぐ。

2.できれば1.をSqueakで扱えるようにする。

3.MicroSqueakで遊ぶ。

4.Defart5をAIBOに対応させる。

MicroSqueak 0.2

MicroSqueakのドキュメントを勝手に訳してみたり。

MicroSqueakとは?

MicroSqueakは、少なめのCPUパワーと100~200キロバイトのRAMを持つような組み込み用プロセッサ向けに設計されたSqueakです。

このようなCPUの例としてAtmel AT91R40008がありますが、これは66 MHzのARMプロセッサで、チップ上に256キロバイトのRAMを搭載しています。MicroSqueakのmicroは、マイクロプロセッサ上で動作するよう設計されたことに由来しています。(実際のところ、通常のSqueakに対して1桁小さいだけですが、”DeciSqueak”というのは”MicroSqueak”ほどかっこ良く聞こえません。)

(続く)