トップ «前の日(06-18) 最新 次の日(06-20)» 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-06-19 ちまちまとやり続けるスパロボ日記(かも)

% リアル系主人公機がバージョンアップして…

微妙に格好悪くなりました(笑)。でも攻撃方法なんかは派手。今回スーパー系でもそうだったが、最大出力のときに出るフレアがえらくカッコイイっすね。リアル系だとなんかちょうちょみたいで、一瞬「月光蝶かよ」とか思いましたとさ。リボルビングステーク(一般的にはパイルバンカー?)もどきが両腕に付いててゴッツイですな。リアル系のくせに格闘戦仕様ってどうよ。スーパー系同様、格闘戦用の G タイプと砲撃戦用の S タイプに変形するんだが、さすがにリアル系は射撃武器が多いので、やっとこアクア(副主人公)のガンファイトが意味をなす。前回も最終的にレベル 7 まで上がったのに、射撃武器が一つしかなかったんで、あんまり意味なかったのよね。

% PRIME が 0.8.3 になりまして

どうやら例の『最初に一回死なないと調子が出ない』問題が解決された模様。ついでに軽くなってるっぽいのもポイント高し。ようやくこれでほんとにメインで使っていけそうな気配。


2005-06-19 平和だ(訳注:じじぃは、だらけている)

% [game] みんごる4日記、神の次は人編

やっと、みんごる神に昇段。一体あと何回『みんごる神』レベルでラウンドすれば神認定されるんだと愚痴ってた時点で、あと一回取れば昇段っていう段階だったという。 このところ星集めを重視してたから、みんごる神レベルでラウンドできてなかったのよね。 難易度が低いコースだと、みんごる神レベルに認定されるにはひどいスコアが要求されるから、段位を上げるなら難しいコースでやった方が効率が良い。 いくら難易度1のコースだって、-19 なんて取れねえよ(苦笑

ちなみに結局『何回』みんごる神レベルを出せば良いのかだが…よくわからない。 少なくともみんごる天使に上がってからの回数は、7回か8回くらいだったような気がする。 でも、それ以前にも何度も出してるはずなんで、実際に必要な回数はわからんなあ。 それでも10回くらいは必要な気配。

ともあれこれで完璧か…と思ったんだが、どうやら星を全部集めるとさらに段位が上がるらしいんで、やっぱ星を全部集めるまでは、やめられそうにないのであった。

% [game] みんごる4日記、あと星は5個編

もうちょいだ、うむ。 それはそれとして、わし、フェアウェイでドライバーを打てる基準を勘違いしてたなあ。 いつの間に記憶が捏造されたんだ?(爆

インパクトの能力値がもう少しで A になるくらいの B からが、ドライバーが打てる基準だと思い込んでたが、実際には『もう少しで B になるくらいの C』が正解。まるまる1つずれてる...orz

と言うことは、『フェアウェイでドライバーが打てる』っていう条件だけを考えれば、インパクトは C+ で良いってことになる……が、まあ、全体的なインパクトのし易さを考えると、やっぱりインパクト能力は B 以上は欲しいところ。

てなことを踏まえて再度条件を定義してみると、コントロールが B 以上(なるべく A の方が良い)、インパクトが B 以上(こっちは A はあきらめても良い)、飛距離は最低 230y 程度、弱点は無し、って感じか。 弱点に関しては、『バンカー苦手』は論外だが、『ラフ苦手』とか『アプローチ苦手』は許容範囲。 『曲げ苦手』はリカバリーショットに難が出るんで、ちとつらい。

そんな感じで探していくと、あらたに持ちキャラ候補としてファルコンが浮上。 コントロール B、インパクト B で飛距離が 248y となかなかの性能(クラブ&ボールの両方がビギナー装備で)。 アプローチが苦手だが、これはあまり気にならない。 どうせスーパーアプローチモード(15y レンジ)が使えないだけだし、それが必要になることってそんなに無い(あっても 30y レンジで打てば良いだけだ)。 ただコントロールが B とは言っても、ほとんど C に近い B なんで微妙と言えば微妙。

ファルコンと同程度の能力なら、シャークも行けるか。 飛距離が 10y ほど短いが、代わりにスピンが B (ファルコンは C)でバンカーが得意。

ちなみに女性陣はこれまで使ってきたキャラ(アヤ、ナナコ、ニーナ)を除けばほぼ全滅。 バンカー苦手なのが多すぎるし、そうじゃないのは他の条件が満たせない。

実はインフィニティクラブ特級とインフィニティボールを装備させると、犬が結構ステキな能力値(コントロール B、インパクト B、スピン A、バンカー&ラフ得意)になるんだが……犬はちょっと。 猫なら使うけどな(笑


2006-06-19

% [OCaml] 多相型のメソッドを定義する方法

定期的(?)に OCaml のオブジェクトがマイブームになるのである。 今も、他の場所でちらほら話題が出てるせいで、ちょっとブーム。 てことで知識の整理をして (テディベアに話しかけて) みる。

例えばこんなクラスを作ろうとする。 (ほとんどマニュアルのとおりの例で恐縮だが)

# class int_list (l : int list) = object
    method isEmpty = (l = [])
    method fold f accu = List.fold_left f accu l
  end;;

だがこれは…

Some type variables are unbound in this type:
  class int_list :
    int list ->
    object
      method fold : ('a -> int -> 'a) -> 'a -> 'a
      method isEmpty : bool
    end
The method fold has type ('a -> int -> 'a) -> 'a -> 'a where 'a is unbound

という風に怒られる。 とは言え…

# class ['a] int_list (l : int list) = object   
    method isEmpty = (l = [])                   
    method fold f (accu : 'a) = List.fold_left f accu l
  end;;                                                
class ['a] int_list :
  int list ->
  object
    method fold : ('a -> int -> 'a) -> 'a -> 'a
    method isEmpty : bool
  end

あせってこんなの書いちゃうとハマる。

# let o = new int_list [0;1;2;3];;
val o : '_a int_list = <obj>

# o#fold;;
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>

# o#fold (+) 0;;
- : int = 6

# o#fold (fun a b -> a ^ (string_of_int b)) "0";;
This expression has type int but is here used with type string

# o#fold;;
- : (int -> int -> int) -> int -> int = <fun>

ね、fold メソッドが単相になっちゃって全然使いものにならない。 ちゃんと fold が多相になるようにするにはこう書く。

# class int_list (l : int list) = object
    method isEmpty = (l = [])
    method fold : 'a. ('a -> int -> 'a) -> 'a -> 'a =
      fun f accu -> List.fold_left f accu l
  end;;
class int_list :
  int list ->
  object
    method fold : ('a -> int -> 'a) -> 'a -> 'a
    method isEmpty : bool
  end

これだと…

# let o = new int_list [0;1;2;3];;
val o : int_list = <obj>
# o#fold;;
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>
# o#fold (+) 0;;
- : int = 6
# o#fold (fun a b -> a ^ (string_of_int b)) "0";;
- : string = "00123"
# o#fold;;
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>

めでたし。 o#fold の型が単相に見えるのがハテナ? って感じだけど(苦笑

さて、そうすると今度は多相型のクラスにも多相型のメソッドを定義してみたくなる。 ってことで、こんな風に書いてみよう。

# class ['elm] poly_list (l : 'elm list) = object
    method isEmpty = (l = [])
    method fold : 'a. ('a -> 'elm -> 'a) -> 'a -> 'a =
      fun f accu -> List.fold_left f accu l
  end;;
class ['a] poly_list :
  'a list ->
  object method fold : ('b -> 'a -> 'b) -> 'b -> 'b method isEmpty : bool end
# o#fold;;
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>

# o#fold (+) 0;;
- : int = 6

# o#fold;;
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>

# o#fold (fun a b -> a ^ (string_of_int b)) "0";;
- : string = "00123"

# o#fold;;                                       
- : ('_a -> int -> '_a) -> '_a -> '_a = <fun>

おおー偉い。 実はこんなことができるなんて知ったのは最近なので、すでにこういうメソッドはオブジェクトの外に出すスタイルが身についちゃっててあんま嬉しくないんだけどね(苦笑)。 つーか、気合入れて書くならまだしも、適当に書くときにはこんないちいち型指定をちまちま書かなきゃならないのはかったるい。 まあ、憶えておいて損は無いと思うけど、頻繁に使うものでも無いような気はする。 オブジェクト指向が大好きで、何でもオブジェクトを基本にしないと気が済まないような人にはお勧め。

% [OCaml] サブタイピング

も一つオブジェクトネタ。 個人的にはメソッドの型による多相がお気に入りだから、あんまり気にしたことないんだけど、継承関係を使ったサブタイピングも存在する。

# class hoge = object
    method p = "hoge"
  end;;
class hoge : object method p : string end

# class fuga = object
    inherit hoge
    method p = "fuga"
    method q = "aguf"
  end;;
class fuga : object method p : string method q : string end

ここで、fuga は hoge のサブクラス (サブタイプ) である。 そして、こんな関数を書いたとする。

# let f (o : hoge) = o#p;;
val f : hoge -> string = <fun>

これはもちろん↓のように使う。

# let ho = new hoge;;
val ho : hoge = <obj>
# f ho;;
- : string = "hoge"

で、他のオブジェクト指向言語に慣れた人は、同じようにこうするだろう。

# let fu = new fuga;;
val fu : fuga = <obj>
# f fu;;
This expression has type fuga but is here used with type hoge
Only the first object type has a method q

な、なんだって〜!!

実は継承関係を持っていても、暗黙のアップキャストはされないのであった。 上の例で行くと、関数 f を少しいじってやるとこの問題は解決できる。

# let f' o = (o :> hoge)#p;;
val f' : #hoge -> string = <fun>

(o :> hoge) というのは『o を hoge として扱う』ことを示している。 型の表示の #hoge は『o は hoge のサブタイプである (ので hoge として扱える)』という意味。

# let f' (o :> hoge) = o#p;;
Syntax error: ')' expected, the highlighted '(' might be unmatched

こういう風には書けないので注意。 他の書き方としては、

# let f' (o : #hoge) = o#p;;
val f' : #hoge -> string = <fun>

とか、

# let f' o = (o : #hoge)#p;;
val f' : #hoge -> string = <fun>

とか。 ともあれ、これで…

# f' ho;;
- : string = "hoge"

# f' fu;;
- : string = "fuga"

こうなる。

関数 f の型が…

# let f'' o = o#p;;
val f'' : < p : 'a; .. > -> 'a = <fun>

こういうのでは型の制限が甘くてあかん…ってシチュエーションでは必要になる知識だと思う。 わしはそこまで必要なものって書いたことないけど(苦笑


2007-06-19

% [Python][Mac] MacPorts の python25 が腐ってる件

しばらく前から MacPorts で入れている python 2.5 が変で、ipython が動かないという問題に悩まされていたんだけど、いつまで経っても直らないんで、あきらめて Python は野良ビルドして入れることにした。

どうも lib-dynload/_hashlib.so とか、_sha* とか、その辺りを作るのに失敗してるみたいで、こいつらは openssl 絡みみたいなんだけど、なぜ失敗するかまで追求するのはめんどくさいので放置。 つーか、readline.so とかも作られてなくて、なんだかわけわからん。 きっと Portfile が腐ってるに違いない。

で、結局野良ビルドすることにしたわけだけど、単に ./configure && make だと readline.so ができないので (configure では見付かるんだけど、/usr にあるやつは機能が足りないらしくて、コンパイル時に失敗してるみたい)、openssl 関係が不安だけどこんな感じ↓でやってみた。

CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib ./configure && make

結果、readline.so がうまくできたのはもちろん、_hashlib.so 辺りも普通にできあがってて、じゃあ何で MacPorts では失敗してんだよと。どんだけ?

ともあれ、ここ数日久しぶりに Python をいじってたにもかかわらず、ipython が使えなくて不便な思いをしていたのが解決されてめでたしめでたし。 ……しかし、もう Python ネタは無いので、またしばらく使う必要が無いという (空回り人生)。

% [Python] 暇なのでここのお題を借りて書いてみる

とりあえず Python 慣れしてなくても、すぐ書けそうなお題4をば。 添削ページに投稿したりはしないけど、添削を拒むものではないので、したい方はどうぞよろしく。

% cat practice4.py
def flatten(lst):
    def f(acc,x):
        acc.extend(flatten(x) if isinstance(x,list) else [x])
        return acc
    return reduce(f, lst, [])

def display(lst):
    for i in flatten(lst):
        print i

def check(lst):
    return not [x for x in flatten(lst) if not isinstance(x, (int,long))]

def test():
    l1 = [1, [2, 3, 4], 5, [[[6], [7, 8], 9], 10]]
    l2 = [1, [2, '3', 4], 5, [[[6], [7, 8], 9], 10]]
    print 'test display()'
    display(l1)
    print 'test check()'
    print check(l1)
    print check(l2)
if __name__ == '__main__':
    test()
% python practice4.py
test display()
1
2
3
4
5
6
7
8
9
10
test check()
True
False

それにしても、List.for_all みたいな関数は無いんだろうか。 あと、int と long が共通の親を持ってないとか、微妙にやりづらい。

% [Python] お題6:名簿の並び替え

すでに、飽きてきている気がするが(苦笑

ちなみにお題5:行列の回転は、問題のページ開いた瞬間に、あまりに簡潔すぎる回答が目に入ってしまって、それ以外の方法を考えるのがバカバカしくなったのでスルーした。

% cat practice6.py
from __future__ import with_statement

def transform(name):
    last,first = name.split()
    return '%s.%s\n' % (last[0],first)

def make_list(orig):
    return map(transform, orig)

def make_sorted_list(orig):
    tmp = make_list(orig)
    tmp.sort()
    return tmp

def transform_file(src_name,dst_name):
    with open(src_name) as ifp:
        with open(dst_name,'w') as ofp:
            ofp.writelines(make_list(ifp.readlines()))

def transform_file_incrementally(src_name,dst_name):
    with open(src_name) as ifp:
        with open(dst_name,'w') as ofp:
            for line in ifp:
                ofp.write(transform(line))

def transform_sorted_file(src_name,dst_name):
    with open(src_name) as ifp:
        with open(dst_name,'w') as ofp:
            ofp.writelines(make_sorted_list(ifp.readlines()))

def test():
    src = 'test/src.txt'
    dst1 = 'test/dst1.txt'
    dst2 = 'test/dst2.txt'
    dst3 = 'test/dst3.txt'
    transform_file(src,dst1)
    transform_file_incrementally(src,dst2)
    transform_sorted_file(src,dst3)
if __name__ == '__main__':
    test()

test/src.txt の中身は、とりあえずお題のページに挙がってた三行だけだけど、別に一万行くらいなら普通に動くんじゃねえ? つーか、単に変換するだけのやつはともかく、ソートするのは一旦全部メモリに抱え込まないと無理だよね。

しかし、一旦 with 構文の便利さを体験しちゃうと、もう普通になんて書いてらんないな。

ファイル IO は、言語によって出力時に改行を補ったり補わなかったり憶えるのが大変。 Python の場合は、write も writelines も改行は付加しないようだ。

% [Python] お題7:整数とビット列の相互変換

他の問題含めて全体的に言えることだけど、仕様の定義があいまいすぎる。 整数はまだしも、ビット列ってどんなのよ。 '0b111111' こういうの? [1,1,1,1,1,1] こういうの? 63 だってビット列だって言やあビット列でしょ。

……とか考えた辺りで、かったるくなったんで、簡単にフォーマット文字列と eval でごまかそう……と思ったんだけど、フォーマット文字列に 2 進数用の型指定子が無い...orz Ruby 万歳。 しかたないので、各ビットを要素としたリストを作ることにする。

% cat practice7.py
def integer_to_bits(num):
    max_column = 0
    while True:
        if 1 << max_column > num:
            break
        max_column += 1
    return [1 if num & 1 << i else 0
            for i in reversed(range(max_column))]

def bits_to_integer(bits):
    return reduce(lambda acc,(i,col): acc + (i << col),
                  zip(reversed(bits),range(len(bits))), 0)

def test():
    itob = [integer_to_bits(x) for x in [1,33,654,7843]]
    print itob
    btoi = [bits_to_integer(x) for x in itob]
    print btoi
if __name__ == '__main__':
    test()

負数には対応しておりません。 つーか、ビット数に上限が無い言語じゃあ、負数は完全に別の処理しなきゃならんからめんどい。

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

% TrackBack [http://jijixi.azito.com/cgi-bin/diary/index.rb?date=200706..]

% TrackBack [http://jijixi.azito.com/cgi-bin/diary/index.rb?date=200706..]


2008-06-19

% [雑談] 自分はボケてしまったのだろうか?と思わざるを得なかったできごと

本屋とコンビニに寄って帰ってきたら、なぜか海皇紀の最新刊が二冊あった。 すでに買ってあったものを再度買ってしまった、ってことならよくあるが、一度の外出で同じ本を二冊買ってきたのは初めてだ。 実はわしって影抜きを流行らせるために送り込まれた自動人形で、そろそろ耐用年数が切れてるんじゃないのかな。

まあ、冷静に流れを思い返してみると、だいたいこんな感じ↓

  • 本屋で海皇紀の最新刊を見つける
    • 本屋はちょっと寄ってみただけで特に何か買う予定があったわけではない
    • どうせ後でコンビニ寄るし、買うのはそのときでいいかな、と思う (*1)
      • でもまあせっかくだから、と思い直しここで買う (*2)
  • 本来の用事を済ませる
  • コンビニに寄る
    • 適当に目についたものをぽいぽいカゴに放り込む
    • ここでおそらく *2 は忘れたまま *1 のことだけ思い出す
      • 深く考えずになんとなく海皇紀をカゴへ
  • 同じ本二冊ゲット、やったね

…… なんというかぼんやりしすぎ。

% [雑談] RD 潜脳調査室

地味におもしろいのでずっと見てる。 攻殻機動隊のような世界観でありつつ、もっと「普通の人」にフォーカスを当てたフツーの人間ドラマをやってるのが何とも言えない良い感じ。

もし「電脳化」という技術が実現されたとして、そのとき人間のメンタリティに何か変化があるだろうか?という疑問に対する一つの回答のような気がするね。 攻殻ではわりと「新たなメンタリティを獲得する」という方向性で描かれてる感じだけど、こっちは逆に「結局何も変わらない」と言ってる感じがする。

まあ、攻殻の世界でも電脳化に (ある意味過剰に) 適応した人物達が描かれてるってだけで、その他の「普通の人」は普通なのかもしれないけどね。


トップ «前の日(06-18) 最新 次の日(06-20)» 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com