通常時のプロセス

何も悪い事してない状態でのプロセスをメモっておく。

Delay class>>handleTimerEvent
the low space watcher
Input events fetching process
the WeakArray finalization process
the UI process
the idle process

rospharoのクリーンインストール

なんだかイメージの調子が悪いので最初からインストールしてみた。きちんと手順を踏まないとならないので、備忘のために記録しておく。

1. XMLRPCのインストール

1-1. まずWorkspaceを開いて以下を入力し、XMLRPCのコンフィグレーションを読み込む。(以下、同様)

(Smalltalk at: #Gofer) new
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfXMLRPC';
load.

1-2. テスト付きクライアントパッケージをインストールする。

ConfigurationOfXMLRPC project latestVersion load: 'Client with Tests'.

1-3. テスト付きサーバーパッケージをインストールする。

ConfigurationOfXMLRPC project latestVersion load: 'Server with Tests'.

インストール中にエラー(Error: nil cannot be found in the list)が発生する。これは、XMLRPCHttpModuleのクラスメソッドinitializeで、Pharo 1.3に存在しないAutoStartを参照しているために起こる。

Debugボタンを押してデバッグウィンドウを出し、一覧からXMLRPCHttpModule class>>initializeをクリック。赤く表示されているAutoStartをClipboardに変更して、Alt-sでAcceptする。

途中でAuthor identificationが出たら自分のフルネームを入力する。スペースやクオーテーション、ハイフンなどは使えないので注意する。AcceptしたらProceedボタンを押して続行する。

1-4. 次に、XMLRPCのパッケージを修正するパッチを適用する。パッチファイル(xmlrpc-bugfix-struct.1.cs)は以前のエントリ d:id:nqthm:20110909 で公開しているので予めダウンロードしておく。

具体的な手順としてはメニューからTools-File Browserでファイルブラウザを開き、パッチファイル(xmlrpc-bugfix-struct.1.cs)を選んで、Fileinを押せばよい。

この時点で、XMLRPC-Client-TestsおよびXMLRPC-Server-Testsのテストが全て合格するはずである。

2. rospharoのインストール

2-1. 続いてrospharoをインストールする。Monticello Browserを開いて、+Repositoryボタンを押し、一覧からHTTPを選ぶ。

Information Requiredの画面で以下をカット&ペーストで入力してOKを押す。

MCHttpRepository
location: 'http://www.squeaksource.com/rospharo'
user: ''
password: ''

2-2. http://www.squeaksource.com/rospharo が選択されている状態でOpenボタンを押し、右側のペインの最上位のパッケージを選んでLoadする。

以上でインストールは完了する(はずである)。

rospharoのユニットテストはRos-Testsにある。またroscoreを起動した状態での通信テストはRos-Examplesにある。使い方の参考になるだろう。

pharo-xmlrpcのバグ

Rosでノード間通信するのに必要なので、Pharo上にXMLRPCを実現するpharo-xmlrpcというパッケージを利用している。

http://code.google.com/p/pharo-xmlrpc/

ベータ公開中のようであるが、テストはオールグリーンということで導入すると痛い目にあう。実際のところ、1.3RCはおろか1.2.1であってもテストの実行に失敗する。

問題は2点あり、ひとつはstructノードの生成に関すること、もう一つはネットワークポートに関することである。

以前このブログで、デコード時の問題を解決するパッチを公開した。このパッチでは、decodeStruct:というstructのデコード時にノードを深くたどりすぎるバグに対処するものだった。

http://d.hatena.ne.jp/nqthm/20110822/p1

実はこのパッチを当てると今まで動いていたテストが失敗するようになる。というのも実はエンコード時に以下のような結果を生成するようになっていたからである。

<struct><struct>....</struct></struct>

要するにstructノードを二重に生成してしまっているのだ。このためにパッチ前のデコード処理とうまく整合するようになっている。

structノードの生成は、encode:内でwrapVal:type:とencodeStruct:内の二カ所で連続して行っている。

本来こういった問題を回避するためのテストコードが必要で、実際そのためのテストコードもXMLRPCEncoderTest>>testEncoderにあるのだが、そもそもencodeStruct:でstructを生成することを前提にチェックしており問題は露見しない。不思議なのは、同じテストの別の箇所は全てencode:を用いてチェックしているのに、この部分だけはencodeStruct:を用いている。

以上のバグについては、XMLRPCDecoder>>decodeStruct:,

XMLRPCEncoder>>encodeStruct:, XMLRPCEncoderTest>>testEncoderを修正すれば良い。

もう一つのバグは、XMLRPCHttpModuleに関するものである。具体的な現象としては、テストを一度実行するとそれ以降、ネットワークポートが既にアサイン済みである旨のメッセージが出て、テストに失敗するというもの。どうもテスト終了時にネットワークポートの解放ができていないようである。

これはXMLRPCHttpModule class>>pauseでservice unassignPortを実行することで回避した。本来、ここに置くべきなのか不明なのだが、とりあえずの対処として行った。

近日公開予定と思われるPharo-1.3では、pharo-xmlrpcのインストール中にエラーが発生する。この理由は、XMLRPCHttpModule class>>initializeがStartUpListへの登録に、1.3では存在しない(らしい)AutoStartクラスへの参照を含んでいるからである。initializeの実行に失敗しただけなので、手動で実行すれば良いだろう。

なお、パッチは以下に置いてある。

http://itolab.com/software/pharo/xmlrpc-bugfix-struct.1.cs

Asus eeePCのブートメニュー

Asus eeePCにもubuntuを入れようと思ったけど、USBブートできなくて困った。

いや、当然できるんだろうけど起動時にホットキーの表示がなくいきなりWindowsが立ち上がるのでブートメニューが出せない。

電源オンですかさずF2を連打し(押しっぱなしは駄目みたい)BIOSメニューを出して、BOOTセクションでBoost BootをDisabledにして保存する。

再起動時にESCを連打するとブートメニューが出た。

慣れてないマシンだとこんなことでも戸惑ってしまう。

Pharo 1.3RCの日本語表示と日本語入力

Windowsでの日本語表示については、以下の手順でOK。

  1. FT2Plugin.dllをCog.exeのあるフォルダにコピー
  2. Pharoを起動
  3. World-System-SettingsでSettings browserを開く
  4. Appearance-Standard fontsでDefaultのフォント変更ボタンを押す
  5. Font fot defaultFontで、右下のUpdateボタンを押す。
  6. 適当なフォントを選んで Apply, OKボタンを押す。
  7. Settings browserでReset all to defaultボタンを押す。
  8. Settings browserを閉じる。
  9. イメージを保存しておく。

入力については一部文字の入力ができない。原因は1.2.1の時と同様。ただし、TextEditor>>dispathOn:は複数のメソッドに分割されたため、以前のパッチを当てるのは不適当である。

TextEditor>>dispatchCommandOn:return:メソッドで以下の部分を変更すれば良い。

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

なお、全ての入力に対して適切に動作するかどうかは未確認であるので変更には注意されたい。

※追記(2011/10/5):上記のTextEditorに対するパッチは問題が生じることが判明した。正しくは、 id:nqthm:20111004:p1 を参照してほしい。

Pharo1.3RC

Pharoの1.3もRelease Candidateになったので、そろそろ出そうな感じである。

日本語の表示と入力を試してみたところ、SnowLeopardについてはFT2Plugin.bundleをコピーすれば問題なさそう。

Windowsについてはまだ試していないが、前回パッチをあてたTextEditor>>dispathOn:の中身が大幅に変わっているようなので、イヤな予感がする。

とりあえず1.3では、このブログに書いてある1.2.1のパッチ当て方では駄目なようなので注意!

ROSでkinectを動かす。

いろいろやったけど、準備として必要なのは以下の通り。(だと思う)

sudo apt-get install ros-diamondback-openni-kinect
sudo chmod -R a+rw /dev/bus/usb/*

kinectカメラを使うには、以下のようにする。

まず端末を立ち上げて、最初の画面でroscoreを起動する。

roscore

新しいタブを開いて、openni_cameraを起動する。

roslaunch openni_camera openni_node.launch

以上でOK。カメラ画像を見るには以下のようなコマンドを使う。

rosrun image_view image_view image:=/camera/rgb/image_color
rosrun image_view image_view image:=/camera/rgb/image_raw
rosrun image_view image_view image:=/camera/depth/image_raw

元情報はこちら。

http://www.ros.org/wiki/openni_kinect

ROSとPharoを結ぶ。

何がやりたいかというとROSをPharoで制御したいということ。ROSはXMLRPCで通信しているようなので、これを試してみた。結果は成功。

url := Url
absoluteFromText: 'http://192.168.254.72:11311/’.
proxy := XMLRPCProxy withUrl: url.
result := proxy
invokeMethod: 'getSystemState'
withArgs: #('/script').

上記のようにしてgetSystemStateを呼び出してみたら、ちゃんと結果が返ってきた。

#(1 'current system state' #(#(#('/rosout_agg' #('/rosout'))) #(#('/rosout' #('/rosout'))) #(#('/rosout/set_logger_level' #('/rosout')) #('/rosout/get_loggers' #('/rosout')))))

細かく制御できるのかこれから試す予定。