--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/07/29

インタフェースの定義だけ

どうも最近、インタフェースの定義だけやって、「あとは実装ゴリゴリやるだけかー」って状態で手が止まってしまう傾向がある。あれか。夏バテのせいか。

2008/07/28

タスク

やらなければいけない事が多すぎる。こういう時は大概やる気が出てくるもんなんだけど、今回はイマイチやる気が出ない。

なんて言ってる場合じゃないのは分かってんだけど、やる気が(ry

2008/07/28

ニコニコ

こりゃすげぇ。

2008/07/17

Google Bookmarks

存在すら知らなかったけど、話題になってたこの記事で知って、tombloo と合わせて使い始めてみた。

かなり速くていい感じ。検索は申し分ないし、個人用途には最適かもしれない。del.icio.us から乗り換えるかね。

2008/07/10

Double Dispatch っぽいもの

javaの "郷" を知らないおいらは悩める子羊ちゃん - 関数ポインタがない事に対抗する

リフレクションを使うことがポリシー的にどうかはさておき、あげられている問題についてはリフレクションを使うまでもないと思う。

以下のように、Food のサブクラスで FoodGiver への呼び出しメソッドを指定してやればいいんじゃないかなぁ。Double Dispatch ではないけど、それに近いもの。

public class Sample {

    public static void main(String[] args) {
        Food df = new Dogfood();
        Food cf = new Catfood();
        FoodGiver g = new FoodGiver();

        System.out.println(invokeGive(g, df));
        System.out.println(invokeGive(g, cf));
    }

    static void optimizeFood(Food f) {
        class Jam extends Food { }
        f.mix(new Jam());
    }

    static int invokeGive(FoodGiver g, Food f) {
        optimizeFood(f);
        return f.giveTo(g);
    }
}

class Food {
    public void mix(Food f) { }
    public int giveTo(FoodGiver g) { return -1; }
}
class Dogfood extends Food {
    @Override public int giveTo(FoodGiver g) {
        return g.toDog(this);
    }
}
class Catfood extends Food {
    @Override public int giveTo(FoodGiver g) {
        return g.toCat(this);
    }
}

class FoodGiver {
    int toDog(Food f) { return 1; }
    int toCat(Food f) { return 2; }
}

個人的に、リフレクションは最後の手段だと思ってる。便利だけど、遅すぎる。

2008/07/10

分散リポジトリとリポジトリの階層化

第5回 分散による「多段連携」 ~ 大規模開発への応用

随分前にどこかで、「分散リポジトリは大規模向きだ」ってのを見た。これを見たときには意味がわからなかったが、先月くらいにリンク先と似たようなことを思いついた。で、「なるほど、こういうことができるなら大規模向きだな」と納得した。

というのも、今参加しているプロジェクトがまさにこういう感じなのだ。違うのは、各社が個別に subversion リポジトリを持ち、会社間での更新のやりとりはメールで行われているということ。メールをうける担当者は自社のリポジトリに手でマージすることになる。

で、git とか使ってリポジトリを階層的に構成すれば、もっとうまい運用できるよなぁと。むしろこれが本当の使い方なのか?とか自問したけど。

2008/07/10

文化の違い

「落書き女子大生の謝罪に感銘。落書き跡に銘板で学校名を残したい」 フィレンツェの大聖堂が申し出

文化というか、根本的に考えかたが違うよなぁ。皮肉にしか思えないってのも、考えかたの相違なのかな。素直に受け止めていいものか、躊躇してしまう。

2008/07/06

ボウズ

今度髪切るときはボウズにしようかなぁ。ただまぁ会社的に NG みたいなこともありそうだから、その辺は確認して。

髪がうざくてしょうがない。部屋にも落ちるし。ボウズはその辺一切気を使わなくていいんだよなぁ。

2008/07/05

二日酔い

久しぶりに二日酔い。頭痛い。酒が混ざるとだめだってことに確信を持ちつつある。

ひとまず寝るとする。

2008/07/04

zipper

xmonad とかにも使われてる、破壊的代入を行わずに更新、削除、追加などの操作が可能なデータ構造。

仕組みは単純。現在の位置、現在の位置より左側にある要素のリスト、現在の位置より右側にある要素のリストを管理する。更新する場合には、現在の位置と置き換える。削除する場合には左側と右側をくっつけ、右側の先頭を現在の位置とする。追加する場合には、現在の位置を左側の末尾に追加し、現在の位置を追加された要素に置き換える。言葉だとなんか難しく見えてしまうな。

現在の位置を移動するには、それ用の関数を用いる。

肝心なのは、現在の位置より左側にある要素のリストを、逆順に保持する点。こうすることで、後戻りが楽になる。

本当はリストじゃなくてツリーのものが正式らしい(元の論文ではツリーを紹介してあった)んだけど、zipper の肝としてはリストでも十分だと思う。ツリーの場合は左右に加えて上下にも移動できるようになる。

以下は haskell での実装。

type Zipper a = ([a],[a])

makeZipper :: [a] -> Zipper a
makeZipper xs = ([],xs)

prev :: Zipper a -> Zipper a
prev (l:ls,rs) = (ls,l:rs)
prev ([],_) = error "not found."

next :: Zipper a -> Zipper a
next (ls,r:rs) = (r:ls, rs)
next (_,[]) = error "not found."

get :: Zipper a -> a
get (_,e:_) = e
get (_,[]) = error "not found."

set :: a -> Zipper a -> Zipper a
set e (ls,_:rs) = (ls,e:rs)
set e (_,[]) = error "not found."

insert :: a -> Zipper a -> Zipper a
insert e (ls,rs) = (ls,e:rs)

remove :: Zipper a -> Zipper a
remove (ls,_:rs) = (ls,rs)
remove (_,[]) = error "not found."

2008/07/04

ネット上での殺人予告で逮捕

秋葉原の事件以来多すぎるのでは。まぁ事件直後の頃ならともかく、逮捕者続出した後にもまだまだ続いてる辺りに疑問を覚える。逮捕志願者なんだろうか。

2008/07/04

にでら

最近もっぱら調子がよい。今日は RED ZONE(A) クリア

昨日 9 段に挑戦したらラストの曲まで到達した。が、流石にちと難しすぎるわな。

2008/07/04

炎上

なんとかっていう女優が理不尽なボランティアを募ったとかで炎上したニュース。気に食わない気持ちは分かるけど、ほっとけばいいじゃんと思うんだけどなぁ。詳しい事情があるとか、そういうのは全然知らないけども。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。