トップ 最新 追記

Route 477



2008-04-01

[misc] そろそろ松江の某社について一言いっておくか

4月1日付けで株式会社ネットワーク応用通信研究所に入社しました。

今年度もよろしくお願い致します。

本日のツッコミ(全10件) [ツッコミを入れる]

Before...

ikomaru [つられました。]

dan5 [やっぱりね。騙されなかった!]

cyross [釣られてきました。]


2008-04-02

[tetris] (C)SHIRASEの足きりをぎりぎりで通過するムービー

というのを撮りました。emaさん、土居チャレンジャーの店員さんに感謝感謝。

自分のプレイを客観的に見るのは初めてなのですが、遅いですね(笑)。 トッププレイヤーの方の動画と比べると、 本当に下入れしてんのかと思うくらい。

これからは気合を入れて下入れしたいと思いますが…はたして島根県内にTi の基盤が存在するのか…。orz

[biwascheme] BiwaScheme 0.5 (CometとかTupleSpaceとか) を公開しました

どうも今月中は家でネットできなさそうな雰囲気なので、適当ですが現在のtrunkをパッケージングしました。

0.5には、秘蔵のCometによるブラウザ間通信機能のデモが含まれています。 簡単に言うと

  1. ブラウザAで (alert (ts-read '(1 _ _)) を実行
  2. ブラウザBで (ts-write '(1 2 3)) を実行
  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を返します。

[junk] クラブモンブラン松江店

漫画が充実していてなかなか良いです。BGMはスーパーみたいだけど。

もやしもん読み中。

4063521060


2008-04-07

[linux] UNetbootinがあれば、CDやUSBが使えなくてもwindows/linuxのデュアルブートにできる

古いWindowsマシンをデュアルブートにしようと思ったのだが、

  • CD-ROMドライブが死んでいてCD-Rが読めない
  • USB経由でのブートもできない

という困った状態に。

が、検索したらこんなものを見つけた。

exeファイルをダウンロードしてWindows上で起動すると、Debian/Ubuntu/Fedoraなどいろんなディストリビューションを選んで インストールすることができる。

[linux] Ubuntuつかってみた

良くできてるなぁ。

「CtrlをCaps Lockでも打てるようにする」が簡単に設定できて嬉しかった。

libc6-devが入ってなくてコンパイルが通らんとかはあったが。


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

[これはあたらしい]

技術者の家族どうしでピクニックだそうです。いいなぁ。

本日のツッコミ(全2件) [ツッコミを入れる]

takkanm [>ここで再帰ですよ。これがLisp脳か! 同じことをCで書いて、サクッとスタックをとばした俺がやってきましたよ]

yhara [そうか、末尾再帰が最適化されるかを考えれば、「Lisp脳」ではなく「Scheme脳」と言うのが正確ですね。]


2008-04-10

[scheme] 継続フレームワーク

Gauche本に「継続ベースのWebアプリケーションフレームワーク」みたいな章があったのでcall/ccかと思ったら、 予想と全然違うコードでびっくりした。

具体的には、 各リンクごとに リンクがクリックされたときの処理を行うクロージャを設定する感じ。

call/ccでなくても継続は存在する、分かってたはずなのにな。

Gauche本は良い本ですね:-)

[rspec] instinct

via オレンジニュース。RSpecのJava版らしい。

    void mustBeEmpty() {
        expect.that(stack.isEmpty()).isEqualTo(true);
    }

RSpecもRubyでしかできないアイデアじゃなくて、Javaでもやろうと思えば近いものができるんですね。

本日のツッコミ(全2件) [ツッコミを入れる]

takano32 [kahuaかな?]

yhara [Kahuaではなく、継続フレームワークから自分で自作するという章です。 KahuaはKahuaでまた別の章があります..]


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

51ojIhXBP3L._PU30_SC._SL200_.jpg ttp://ecx.images-amazon.com/images/I/51ojIhXBP3L._PU30_SC._SL200_.jpg

51ojIhXBP3L._BL50_SC._SL160_.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って何よ

[google]

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)」より格好いいですね:-)。

本日のツッコミ(全2件) [ツッコミを入れる]

hoge1e3 [http://portal.acm.org/citation.cfm?id=584931.584934&coll=A..]

yhara [なんと、そんな応用があったなんて! 「あるツリーの一部が連動して更新される」という繋がりなんですね。]


2008-04-16

[gadget] 今日機種変したんだが

microSDちっちぇええええ


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

参考にした。

本日のツッコミ(全2件) [ツッコミを入れる]

dan5 [初心者向けだからgemを使う層とはターゲットが異なるのかなあと思います。 初心者じゃない人にはsvnに最新安定版があ..]

yhara [そうか、svnという手が…。]


2008-04-22

[linux] UbuntuでアプリをEmacsキーバインドにする方法

gconf-editorでgtk_key_themeを「Emacs」に変更する。

Gnome++++

根っからのEmacs使いではない僕にとっては、今のところFirefox+Firemacsより快適。


2008-04-24

[mac] えーMacBook?? オモーイ(笑)

あんな重いノート買っていいのは(体力の衰えてない)大学生までだよねー。

画像の説明

画像はイメージです

本日のツッコミ(全2件) [ツッコミを入れる]

hakobe [はるばる大阪まで持ってくるなんて社会人一年生くらいまでだよねー(笑)]

yhara [ねー。あと一年遅かったら危ないところでしたね。]


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
  • みたいな (参考)
    • 実際には、SDL_TTFとかまだ入れてないので-Dを外したりした。
    • 実行はrubyではなくrsdl
    • わーいrsdl testsprite.rbうごいたよー
  • なんとかしてsgeも動かんもんかね
  • あれ、ていうかいつの間に/usr/X11とか出来てるの←いまここ
本日のツッコミ(全3件) [ツッコミを入れる]

mak [がんばってsgeまで動かしてみました。後、SDL_TTFとかはMacPortsを使ってインストールした方が楽だと思い..]

mak [wiki更新しました。oggの再生方法も掲載してます。]

yhara [mak偉すぎる。参考にさせてもらいます。]


2008-04-28

[mac] WitchをCommand-TABに割り当てたいんだが

  1. Command-TABで別のSpaceに切り替わるのが気に入らない。
  2. ていうか他の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が起動するようになれば文句ないんだけど…。

絶望した。

本日のツッコミ(全3件) [ツッコミを入れる]

ujihisa [KeyRemap4MacBookでCmd+TabにOption+Tabを割り当てればOK。 ※cppのソースをいじ..]

Takayama Fumihiko [KeyRemap4MacBook の 4.99.6 の Remap Tab Key > Command+Tab to..]

yhara [ありがとうございます!試してみます。]