2008-04-02
■ [tetris] (C)SHIRASEの足きりをぎりぎりで通過するムービー
というのを撮りました。emaさん、土居チャレンジャーの店員さんに感謝感謝。
自分のプレイを客観的に見るのは初めてなのですが、遅いですね(笑)。 トッププレイヤーの方の動画と比べると、 本当に下入れしてんのかと思うくらい。
これからは気合を入れて下入れしたいと思いますが…はたして島根県内にTi の基盤が存在するのか…。orz
■ [biwascheme] BiwaScheme 0.5 (CometとかTupleSpaceとか) を公開しました
どうも今月中は家でネットできなさそうな雰囲気なので、適当ですが現在のtrunkをパッケージングしました。
0.5には、秘蔵のCometによるブラウザ間通信機能のデモが含まれています。 簡単に言うと
- ブラウザAで (alert (ts-read '(1 _ _)) を実行
- ブラウザBで (ts-write '(1 2 3)) を実行
- その瞬間、ブラウザAで「(1 2 3)」が表示される
のようなことが出来ます。
動かしかた
スレッド機能を有効にしたGaucheが必要です。goshで(use gauche.threads)と入力してエラーが出なければOK。
あとは
$ cd tuplespace $ gosh chat_server.scm 8888
でサーバを起動して、http://localhost:8888/tuplespace/chat.html にアクセスするとチャット画面が出る。はずです。 または http://localhost:8888/index.html でREPLが開くのでいろいろ遊んでみてください。
API
- (ts-write データ)
- Schemeのオブジェクトを一つタプル空間に書き込みます。
- (ts-read パターン)
- パターンに当てはまるタプルを探します。無ければ見つかるまで待ちます。パターンにはgaucheのutil.matchの書式がそのまま使えます。
例:
(ts-read '(1 2 _)) ; (1 2 3), (1 2 "foo"), (1 2 (3 4)) などにマッチ (ts-read '(1 (? (lambda (x) (and (number? x) (> x 3)))))) ; (1 4), (1 5), (1 6) などにマッチ
- (ts-take パターン)
- ts-readと同じですが見つかったタプルをタプル空間から取り除きます。
- (ts-readp パターン)
- ts-readと同じですが見つからなかったら待たずに#fを返します。
- (ts-takep パターン)
- ts-takeと同じですが見つからなかったら待たずに#fを返します。
2008-04-07
2008-04-09
■ [scheme] 再帰の美しい使い方
Webアプリなどで予測されにくいユニークなIDを作るとき、 「適当な乱数からIDを作って、万一被っていたら再試行する」という コードを書きますよね。
で、C言語とかだと for(;;){ } とか、do{ }while(); を使うんだけど、 Gauche本に乗っていた方法がこちら。
(define (make-session) (let1 sid (random-integer *max-id*) (cond [(hash-table-get *sessions* sid #f) (make-session)] ; 被ってたら、再試行する [else (let1 sess (make <session> :sid sid) ; さもなくば (hash-table-put! *sessions* sid sess) sess)])))
ここで再帰ですよ。これがLisp脳か!
■ [scheme] SRFIのボツになったやつを眺めるのが面白い
http://srfi.schemers.org/ では、Schemeのライブラリの統一規格である SRFI (サーフィと読むらしい) の仕様が公開されています。
特に有名なのはリストを扱うライブラリsrfi-1 や文字列を扱うライブラリsrfi-13 ですが、 そういう規格として成立したものだけでなく、 ボツになったライブラリも http://srfi.schemers.org/withdrawn-srfis.html で公開されているので、一度眺めてみると面白いんじゃないでしょうか。
タイトルを適当に日本語訳してみたのがこちら。 タイトルだけ見るとすごく面白そうなのもあるんですけどねぇ。
- SRFI 3: リストを集合として扱うライブラリ
- SRFI 12: 例外処理
- SRFI 15: 動的スコープのための文法
- SRFI 20: シンプルなオブジェクトシステム
- SRFI 24: ローカルなレキシカルスコープにおけるdefine-syntax
- SRFI 32: ソートライブラリ
- SRFI 33: 整数のビット演算
- SRFI 50: SchemeとC言語の混合
- SRFI 52: 拡張文字セット
- SRFI 53: computation-rulesで構文を計算する(?)
- SRFI 56: バイナリI/O
- SRFI 65: define-immutable: 変更不可能な値を宣言するための構文
- SRFI 68: 包括的なI/O
- SRFI 73: 正確な無限数
- SRFI 75: R6RS ユニコード
- SRFI 76: R6RS レコード型
- SRFI 77: Preliminary Proposal for R6RS Arithmetic
- SRFI 79: プリミティブなI/O
- SRFI 80: ストリームI/O
- SRFI 81: ポートI/O
- SRFI 82: ストリームポート
- SRFI 83: R6RS ライブラリ構文
- SRFI 84: 世界中で一つしかないID
- SRFI 85: 再帰的に等価性を判定する述語
- SRFI 91: 拡張ポート
- SRFI 92: ALAMBDAとALAMBDA*
- SRFI 93: R6RS syntax-case
「R6RS」と付いているものは、言語使用の議論のために便宜的にSRFIの形を 取っていたもののようです。
■ [event] 技術者の家族同士で交流を深めてみようやん第1回(仮)
via http://ujihisa.nowa.jp/entry/e106ef25fe
[これはあたらしい]
技術者の家族どうしでピクニックだそうです。いいなぁ。
2008-04-10
■ [scheme] 継続フレームワーク
Gauche本に「継続ベースのWebアプリケーションフレームワーク」みたいな章があったのでcall/ccかと思ったら、 予想と全然違うコードでびっくりした。
具体的には、 各リンクごとに リンクがクリックされたときの処理を行うクロージャを設定する感じ。
call/ccでなくても継続は存在する、分かってたはずなのにな。
Gauche本は良い本ですね:-)
2008-04-11
■ [misc] 風邪を引かないために
松江に来てから風邪気味の日が多いので*1、 風邪を引かないためには何をすればいいか調べてみた。
とりあえず
- 掃除機をかけてホコリを取り除く
- パジャマの下に肌着(シャツ)を着て寝る
を実践してみた。今日はちゃんと8時過ぎに起きたので効果があった…かも知れない。
厚着はダメってのは知らなかったなぁ。気をつけないと。
厚着をすると肌の新陳代謝が悪くなり、抵抗力が弱くなります。
[http://www.kingyoen.jp/cold/19.htmlより引用]
*1 いや、3月中からずっとそうだったような気もしてきた
2008-04-15
■ [ruby] シンタックスハイライト依存症
白黒のターミナルでRubyスクリプトを編集していて、
def run(uid, gid, date, message) cmd = "run_foo_bar --uid=#{uid} --gid=#{gid} --date=#{date} --message="#{message}" puts cmd system cmd end run(201, 301, "20080415", "This is a sample message.")
が
$ ruby foo.rb run_foo_bar --uid=201 --gid=301 --date=20080415 --message= ...
のような実行結果になる(messageが表示されない)ので数分考えこんでしまった。
■ [prog] http://github.com/
Gitのホスティングサービスらしい。
GitはWindows(のcygwinでない)バージョンがなくて諦めた覚えがあるなー。Reposhの開発のために一度触ってみたいけど。
■ [hiki] Re: 英語ページと日本語ページをサポートするHiki向けプラグイン
考えてたアイデアを他人に先に実現されると悔しいですね:-)。
僕の考えていた案はこんなでした。
- 日本語ページはプレフィックスなし(例:HogePage)
- 英語ページはHogePage-e
- というか本当はプレフィックスを設定できるといい
- メニューではなく、ページ内(ページタイトルの下あたり?)に「Japanese / English」みたいなリンクを表示する
- 三ヶ国語以上になったら、プルダウンメニューの方がいいよね
■ [web] hbkr : ハバカリ | Amazonの画像で遊ぶ
via:「RESTful Webサービス」。(今年、似たようなアイデアをどっかで見たような…)
4873113539
ttp://ecx.images-amazon.com/images/I/51ojIhXBP3L._PU30_SC._SL200_.jpg
ttp://ecx.images-amazon.com/images/I/51ojIhXBP3L._BL50_SC._SL160_.jpg
■ [ruby] Reactive Ruby : RubyでReactive Programmingしてみた
最近、実用的なコードばかり書いているので、 もっと役に立たないコードを書くべきだと思い、 Reactive Rubyというライブラリを作ってみました。
どんなものか
上のデモを見てもらうのが早いですが、例えば
t = Reac{Time.now}
と書くと、tが変化するたびに「t.sec * 100」も自動的に再計算されて表示されます。
ソースはreacruby.rbです。
Reactive Programmingって何よ
Reactive Programmingの世界では、
t.sec * 100
というコードは、「秒数に100を掛けたものを表示せよ」という命令 ではなく、「ここには秒数に100を掛けたものが表示される」という宣言を 意味します。
実装上は、計算式のツリーを作って、 どこかの値が変化するごとに関連する値を更新してやる、みたいなことに なると思います。
で、Reactive Rubyでは、method_missingを使ってツリーを作ることにしました。 最初の値を作るところのみ
t = Reac{ Time.now }
のように印が必要ですが、あとは「t.month」や「t.sec * 100」など、 tを使った式を普通に書くだけで遅延評価になります。
で、何に使えるの?
何に使えるんでしょうね?
海外には、Reactive Programmingでシューティングゲーム(FPS)を作る というテーマで修論だかD論だかを書いた漢がいた はずですが(笑)、それ以外にReactive Programmingで実用的なアプリを 書いたという話はまだ聞いたことがありません(どなたかご存知だったら 教えてください)。
#春休みにNyaRuRu先輩に見せてもらったMathematicaが、 まんまReactive Programmingな動きをしていたような。 (グラフの描画パラメータをスライダと関連づけておくと、 スライダを動かすだけでグラフがぐりぐり動く)
今後の展望とか
現在のReactive Rubyは毎フレームごとに全ての値を再計算していますが、 実用に際しては
- 変更があったツリーだけ再計算する
- 描画されない値は再計算しない
などの工夫が必要になるでしょう。
あとはCursesだけでなく、GUIやRuby/SDLでの描画も試してみたいところ。
関連研究
なんか検索したら既に実装があったんですが、
vk = [:a, :b, :c, :d]
とかシンボルで書かせるのはちょっと嫌だなぁと思いました。まあ、Arrayは僕の実装でも
vk = Reac([a, b, c, d])
のようにReac印が要るんですが…。
「a = react 10」という書式は「a = Reac(10)」より格好いいですね:-)。
2008-04-17
■ [vim] C-p, C-nで部分的に補完できると嬉しい
例えば
testFooBarInteger testFooBarChar testFooBarString ... testFooBazCall testFooBazFunction testFooBazProcedure ...
のようなたくさんの関数があったとする。
ここで「testFooB <C-p>」とタイプすると、大量の関数がリストアップされてしまうが、できれば
testFooB testFooBar... testFooBaz...
のように2つのどちらかを選べるようにできるといいなあ。
■ [scheme] 「Schemeインタプリタにおける仮想マシンアーキテクチャの最適化」
via http://www.atdot.net/~ko1/diary/200804.html#cc11-1
「誰でもワンクリックで読める」とのことなのでクリックしてみたが、735円とか言われてびっくりした。 PDF版は無料なのね。
2008-04-21
■ [Ruby/SDL] mygameがgemで入ると嬉しい
Debianで
aptitude install libsdl-ruby1.8 gem install mygame
とかでmygameが使えるようになると嬉しいんじゃないだろうか。需要ないかな。
■ [reac] Reactiveな時計を作ってみた
ソース抜粋。(ダウンロード)
# 変化する値を定義 t = Reac{Time.now} # x座標とy座標を定義 deg = (t.sec.to_f - 15) / 60 phase = rad(deg) y = Math.sin(phase) * SIZE/2 + SIZE/2 x = Math.cos(phase) * SIZE + SIZE # ビューを定義 Reac::CursesView.new{ put SIZE/2, SIZE-2, t.strftime("%H:%M") #中央に時分、 put y, x, t.sec.to_s #周囲に秒を表示 }.start(30)
しかしさー、これ、「毎フレームごとに行う計算」を普通に書くのと変わんなくね…? 余分な計算が自動で省かれるところがうまいってことなのかなぁ。*1
*1 reacではまだ省いてないんだけど^^;
■ [hg] Mercurialでリポジトリ作ってみた
reacのMercurialリポジトリを作ってみた。
- サーバ側で mkdir reac; cd reac; hg init
- 適当に hg add README; hg ci とかしてみる
- クライアント側で hg clone ssh://ホスト//home/yhara/どっか/
- まず hg add hoge.rb; hg ci でコミット
- 次に hg push でサーバ側に送信
- これだけではサーバ側に反映されないので(!) サーバ側で hg update
- これでクライアントからサーバにファイルを送信できました。
- 逆に、サーバからクライアントに取ってくるのは hg pull; hg update だそうな
まとめ:
- クライアントでは pullしてupdate、ciしてpush
- サーバではupdate
参考にした。
2008-04-22
2008-04-25
■ [SDL][mac] Ruby/SDLをMacで動かしたいとか
Ruby/SDLのためにX11入れるのは嫌だよねーという話。
今日やったこと:
- SDL 1.2.13をコンパイルして ~/bin/sdl 以下にインストール
- .profile(でいいのか?)で
export SDL_CONFIG=/Users/yhara/bin/sdl/bin/sdl-config export DYLD_LIBRARY_PATH=/Users/yhara/bin/sdl/lib ←.profileに書くのはあぶないかも
- test/以下を make --without-x (だっけ) して./testspriteとか./testglが正しく動くのを確認
- Ruby/SDL 2.0.1をコンパイルした
- sdl-configにパスを通しておく
- ruby extconf.rb
- Makefileを編集:
CFLAGS = -fno-common -g -Os -pipe -fno-common -I/sw/include -I/sw/include/SDL -D_THREAD_SAFE -D DEF_EVENT2 -D HAVE_SMPEG -D HAVE_SDL_MIXER -D HAVE_SDL_IMAGE -D HAVE_SDL_TTF -D DEF_OPENGL
2008-04-28
■ [mac] WitchをCommand-TABに割り当てたいんだが
- Command-TABで別のSpaceに切り替わるのが気に入らない。
- ていうか他のSpaceのアプリまで列挙されるのが気に入らない。
(1) は
の方法で解決。
defaults write com.apple.Dock workspaces-auto-swoosh -bool NO killall Dock
元に戻したいときは、 defaults write com.apple.Dock workspaces-auto-swoosh -bool YES killall Dock
(2) はWitchで解決。
あとは、option-TABではなくcommand-TABでWitchが起動するようになれば文句ないんだけど…。
- PullTabというソフトがあるらしい : http://d.hatena.ne.jp/naoya/20060425/1145943657
- PullTabはApplication Enhancerが必要らしい : http://mac.egoism.jp/nu/item/4224
- Application EnhancerはOS X 10.5では動かないらしい : http://www.unsanity.com/haxies/ape/
- Spaces Spaces Spacesでcommand-TABを抑制できるらしい : http://mac.egoism.jp/nu/item/5655
- でも10.5.2ではうごかねええええ
絶望した。
Before...
□ ikomaru [つられました。]
□ dan5 [やっぱりね。騙されなかった!]
□ cyross [釣られてきました。]