脳汁でコードを書く

1 月 11

higeponさんの呼びかけで, 次のshibuya.lispにむけてschemeのコードバトンをやろうということになりました.

参考

higeponさん->yadokarielectriさん->garaemonとバトンがまわってきたので, 少しいじってみました.

修論がやばいのですが, higeponさん曰く「修論よりも大事なものがある」らしいのでやってみる.

僕のコードはここから見れます.

yadokarielectriさんはgauche用に書いてましたが, 良い機会なのでmoshに触れることを個人的な目的に.

moshのbuildはsnow leopardでやりかたがよくからんかった(GMPまわり)ので, linux(ubuntu 9.10)でやりました.

moshはここからおとせます.

ubuntuではgmp3とか入れれば, 普通に./configure, make, make installができますね.

で, 変更箇所はsrfi 37を使って, オプションを渡せるようにしてみました.

srfi 37は自由度が高いですが, まぁ使いにくいので, ちょっとだけ使いやすくしてあげる(自由度は下がるけど).

(define-syntax with-parsed-options
  (syntax-rules ()
    ((_ (params ...) options arg bodies ...)
     (receive (params ...)
       (parse-args arg options)
       bodies ...))))

みたいなマクロを作ってあげる. lispらしい抽象化ですね. こういう構文は大好きです.でも方向性はCommon Lispっぽいかも. schemeだとcall-with-xxxとしそうだなぁ.

optionsはconfiguration listでこんなかんじ.

(define *arg-options*
  '(((#\d "debug")                      ;match string or character
     #f                                 ;default value
     #f)                                ;take value or not
    ((#\v "verbose")
     #f
     #f)
    ((#\f "dict-file")
     "words.txt"
     #t)
    ((#\h "help")
      #f
      #f)))

まぁ詳しいとこはコードを見てください.

使いかたは

% mosh scheme_baton.scm -h
% mosh scheme_baton.scm -f=words.txt

みたいな感じに変更されてます.

schemeはGaucheをさわってたことがあるけど, 結構Gaucheの独自拡張を便利に使ってたので, R6RS内で書くのは結構勝手がちがうなー, という感想.

もっとなおした方が良いところもあると思いますが, まぁこれくらいで勘弁ください.

しかし, メインループを再帰で書くのはちょっと抵抗があるなぁw

せっかくなのでcall/ccは残しました

次はyshigeruさんにわたします!

11 月 5

これは夢のはなしです.

以下のようにすると, jailbreak済のiPhone OS 3.1.2とXCode 3.2.1でアプリのがやりとりできる, という夢をみました.

検証環境
OS: Snow Leopard
XCode: 3.2.1
iPhone: 3.1.2

まず, キーチェーンアクセスで証明書を作成

証明書アシスタンス > 証明書を作成.
名前はiPhone Developer
コード署名で作成する
デフォルトを無効化するのを忘れずに.
iPhone Developerの証明書をダブルクリックして,
信頼 > この証明書を使用するとき
で常に信頼する

Info.plistの編集

次に
/Developer/Platforms/iPhoneOS.platform/Info.plist.を編集
46, 79行目のXCiPhoneOSCodeSignContextをXCCodeSignContextに置換.

サンプルコードの確保

<http://developer.apple.com/iphone/library/samplecode/HelloWorld_iPhone/index.html

ここからHelloWorldをDL
適当に展開して, .xcodeprojをダブルクリック.
プロジェクトを設定する.
左上のHelloWorldを選択してCommand-i, ビルドタブを選択.
アーキテクチャ > ベースSDKをiPhoneデバイス3.1.2にする.
そうすると勝手にarmが選択される
とりあえずreleaseもdebugもそのようにする.
これでビルドすると, キーチェーンのnotificationがでるので常に許可を選択.
ビルドできた!

iPhone側の設定

CydiaのManage > Sources > Edit > Addから
iPhone OS 2.x系列なら
Cydiaのレポジトリに以下のURLを追加
http://www.iphone.org.hk/apt/
CydiaからMobileInstalttion Patchをインストール
iPhone OS 3.x系列なら
以下を追加
http://cydia.hackulo.us/
AppSync for OS 3.1をイストール
参考: http://www.iphonedownloadblog.com/2009/09/17/mobileinstallation-iphone-3-1/

macにiPhoneを接続して転送

macにiPhoneを接続

XCodeのウィンドウ > オーガナイザ

DevicesからiPhone選んで, Use for Developmentをクリック

XCodeでビルドして実行を行うと, GDB上での起動は失敗するけど, 転送できる.

10 月 18

githubにてコードを追加しました

https://github.com/garaemon

仕様変更, というかこれからガシガシ変更していきます.

導入方法や動作環境はまた今度.

ドキュメンテーションもそのうち作ります.

あと, ちょっと攻殻機動隊っぽいデモをつくりました. REPLとの連携もみれます.

komainu sample

追記

動作環境について.

SBCLでかつマルチスレッドがつかえる環境でしか動きません.

というわけでlinuxでしかうごきません.

macはsnow leopardではOpenGLのdylibのffiがうまくいきません.

環境構築はclbuildを使うと楽.
以下は動作確認してないので注意

my-projectsに以下を追加

lisp-unit get_git git://repo.or.cz/lisp-unit.git
cl-interpol get_ediware
 
chimi get_git git://github.com/garaemon/chimi.git
nurarihyon get_git git://github.com/garaemon/nurarihyon.git
nurikabe get_git git://github.com/garaemon/nurikabe.git
komainu get_git git://github.com/garaemon/komainu.git
yasha get_git git://github.com/garaemon/yasha.git
tengu get_git git://github.com/garaemon/tengu.git
clyax get_git git://github.com/garaemon/clyax.git

さらにdependencyに以下を追加

cl-interpol cl-unicode
chimi iterate cl-interpol log5 cl-ppcre alexandria cffi
nurarihyon chimi
nurikabe chimi cl-vectors iterate cffi clyax nurarihyon alexandria
komainu chimi nurarihyon nurikabe iterate
yasha chimi usocket
tengu chimi iterate
clyax cffi chimi

10 月 9

透明なobjectをサポート.

transparent object

transparent object

これに必要なコードは以下

(require :komainu)
(use-package :komainu)
(use-package :nurarihyon)
(use-package :nurikabe)
(defvar *viewer* (make-komainu-viewer :loggingp nil))
(defvar *a* (make-cube 100.0 100.0 100.0 :color :red))
(defvar *b* (make-cube 200.0 200.0 200.0 :color :green))
(transparent *b* 0.5)
(objects *viewer* (list *A* *B* *world-coords*))

10 月 9
テクスチャに対応.こんな感じ.


textured cube

textured cube

(require :komainu)
(use-package :komainu)
(use-package :nurarihyon)
(use-package :nurikabe)
 
(defvar *viewer* (make-komainu-viewer :loggingp t))
(defvar *a* (make-cube 100.0 100.0 100.0 :color :red))
(defvar *im* (make-image :width 300 :height 300 :background :green))
(draw-string *im* "Hoge" 150 150
             :font-size 0.03
             :color :black)
(paste-texture (car (faces-of *a*)) *im*
               (list (float-vector 0 1)
                     (float-vector 0 0)
                     (float-vector 1 0)
                     (float-vector 1 1)))
(objects *viewer* (list *a*))

このために, clxのGLX, OpenGLのバインディングを捨てて, すべてcffiでバインディングを1から作り直すことにした.

ちなみに, 2Dの描画はcl-vectorsをつかってベクター描画.

10 月 4

snow leopardでsbclのbuildにてこずったのでメモ

まずいまのstable版ではmakeが通らない.
以下のようなエラーが出る.

//entering make-target-1.sh
//building runtime system and symbol table file
rm -f *.[do] sbcl sbcl.nm sbcl.h core *.tmp
echo '#include "genesis/config.h"' >sbcl.h
echo '#include "genesis/constants.h"' >>sbcl.h
gcc -g -Wall -O2 -fdollars-in-identifiers -mmacosx-version-min=10.4 -I. -no-cpp-precomp  -c -o alloc.o alloc.c
In file included from alloc.c:21:
runtime.h: In function 'CONS':
runtime.h:151: warning: cast to pointer from integer of different size
runtime.h: In function 'SYMBOL':
runtime.h:157: warning: cast to pointer from integer of different size
runtime.h: In function 'FDEFN':
runtime.h:163: warning: cast to pointer from integer of different size
/var/folders/3K/3K4LXRIJHoq8UNahYP7P4U+++TI/-Tmp-//cck88adh.s:81:Incorrect register `%rbx' used with `l' suffix
/var/folders/3K/3K4LXRIJHoq8UNahYP7P4U+++TI/-Tmp-//cck88adh.s:578:Incorrect register `%rdx' used with `l' suffix
make: *** [alloc.o] Error 1

x86, x86_64にするとか1.0.30のバイナリをつかうとかいろいろ試してみたけど, 最終的にcvsの先端だとバグがfixされている模様

$ cvs -d :pserver:anonymous@sbcl.cvs.sourceforge.net:/cvsroot/sbcl co sbcl

そしたら, multi threadつかいたいのでsbcl/customize-target-features.lispというファイルを作る

(lambda (features)
      (flet ((enable (x)
               (pushnew x features))
             (disable (x)
               (setf features (remove x features))))
        ;; Threading support, available only on x86/x86-64 Linux, x86 Solaris
        ;; and x86 Mac OS X (experimental).
        (enable :sb-thread)))

次にsbcl/sbclcomprというのを作る

SBCL_HOME=/usr/local/lib/sbcl /usr/local/bin/sbcl $*

そんでもって

$ sh make.sh "sbclcompr"
$ sudo sh install.sh

なんかrun-tests.shが大量のエラーをはいてるけど, みなかったことにしよう…

追記:

sh run-tests.shの結果

Finished running tests.
Status:
 Expected failure:    float.pure.lisp / (SCALE-FLOAT-OVERFLOW BUG-372)
 Expected failure:    float.pure.lisp / (ADDITION-OVERFLOW BUG-372)
 Expected failure:    threads.pure.lisp / WITHOUT-INTERRUPTS+CONDITION-WAIT
 Expected failure:    callback.impure.lisp / UNDERFLOW-DETECTION
 Invalid exit status: clos-add-remove-method.impure.lisp
 Invalid exit status: clos-cache.impure.lisp
 Invalid exit status: clos-interrupts.impure.lisp
 Invalid exit status: compare-and-swap.impure.lisp
 Invalid exit status: debug.impure.lisp
 Expected failure:    external-format.impure.lisp / (CHARACTER-DECODE-LARGE
                                                     FORCE-END-OF-FILE)
 Invalid exit status: gc.impure.lisp
 Invalid exit status: hash.impure.lisp
 Expected failure:    packages.impure.lisp / USE-PACKAGE-CONFLICT-SET
 Expected failure:    packages.impure.lisp / IMPORT-SINGLE-CONFLICT
 Invalid exit status: profile.impure.lisp
 Invalid exit status: threads.impure.lisp
 Invalid exit status: timer.impure.lisp
 Invalid exit status: core.test.sh
test failed, expected 104 return code, got 1
10 月 2

色とcylinderを追加してみた

こんなかんじ

komainu-viewer2

komainu-viewer2

 (require :komainu)
(use-package :komainu)
(use-package :nurarihyon)
(defvar *viewer* (make-komainu-viewer))
(defvar *a* (make-cube 100.0 100.0 100.0 :color :red))
(defvar *b* (make-cube 100.0 100.0 100.0 :color :green))
(translate (coords-of *a*) (float-vector 0 100 0))
(translate (coords-of *b*) (float-vector 0 -100 0))
(objects *viewer* (list *a* *b* *world-coords*
                        (make-cylinder 100 100)))
10 月 1

最近というかこの一瞬間くらいで猛烈に実装しているのですが, 幾何ライブラリとそのビューワーをせっせと作ってます.

これくらいのコードで

(require :komainu)
 
(defvar *viewer* (komainu:make-komainu-viewer))
 
(komainu:objects *viewer* (komainu:make-cube 100 100 100))

こんなかんじの表示が出ます.

komainu viewer

komainu viewer

ちなみにkomainuっていうパッケージが幾何ライブラリ.

依存するライブラリとしてはchimi(ユーティリティライブラリ), nurarihyon(数学ライブラリ), nurikabe(GUIライブラリ)があります.

もうちょっとできて, いろいろと落ち着いたら公開します.

描画系はclxを叩いてglxでGLの関数を呼んでいます. clxのバグがいくつか発見されたので, どうしようかなーと悩み中

描画系のモットーはインタプリタからの対話性を重視

9 月 6

CL::log5

icon9 月 6th, 2009

CLのloggerであるlog5についてまとめてみた.

これがloggerとしては標準なのかな?

http://garaemon.net/dokuwiki/doku.php?id=programming:lisp:commonlisp:log5

8 月 1

たまにはロボット研究者らしい記事でも書こう.

というわけでros

これはWillow Garageっていうアメリカの会社が開発してる.

WGはOpenCVとかもメインでサポートしてる.

rosはopencvとかいろいろつかったロボット用のソフトウェア.OpenRTMを想像すれば大体OK.

# 開発者によれば色々違う!と言いたいところだろうが, 使う側としてはどっちも似たような感じ

OpenRTMと違っているのはすでにアプリケーションが充実. 2dnavっていう経路計画ソフトとかはだいぶ凄い.

というわけで本題のインストール 基本的にはここにしたがっていけばOK

確認環境はubuntu 8.04 on VMWare

sudo aptitude install libcppunit-dev #これが必要だったけど, すでにdebugされてるかも
wget http://ros.sf.net/rosconfig -O ~/rosconfig
chmod 755 ~/rosconfig
~/rosconfig bootstrap -s http://ros.sf.net/config/stable.rosconfig ~/ros move_base_stage

これでしばしまつ.
boostとかmakeしはじめるのでだいぶ時間かかる

で、環境変数とか設定するために以下をおこなう

~/rosconfig setup ~/ros > ~/.bashrc.ros
echo "source ~/.bashrc.ros" >> ~/.bashrc

要注目コマンドがいくつか定義されてることに注意.

roscdとかrosapt-getとかrosmakeとか

特にrosapt-getとrosmakeは超重要.

データ可視化ソフトであるrviz位まではmakeしておく良い.

rosapt-get rviz
rosmake rviz

こんな感じでパッケージをmakeするまえにrosapt-getして, それからrosmakeする.

rvizはOgreとかmakeしはじめるのでこれまた結構時間がかかる.

WGでは信じられないペースでcommitされてるので, 1日で結構変わってたりすることにも注意.

動かし方とかはまた次回

Archives

2010 年 2 月
« 1 月    
1234567
891011121314
15161718192021
22232425262728

Other

Syndication