週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ああもう。

ところでこの方はどこかでお名前を拝見した覚えがあります。

スポンサーサイト

昨日のつづきとしてC++の名前参照方法の正確なところを調べようと思いました。そもそもこの手のことを書いていたのはExceptional C++だったと思います。今は出張中でその手の本が手元にないので少々困ります。

しかたないので本当のドラフトを探すことにしました。しかしC++ language specificationとしてもC++/CLIなどという違うものが出てきて困惑。結局Wikipedia経由でみつけました。

解読は週末にでも。

食事のときにC++の実装はややこしいでしょうかの話をして、ついでに名前ルックアップが面倒そうという話をしたところ

あれは人が把握しようとすると難しいですが、仕様通りに実装するとプログラムとしてはあまり難しくなく書けるんじゃないんですか?

と言われてしまいました。kinabaさんと殆ど同じ文面で正反対のことを突いてきたのですごく面白かったです。これはもうC++ Hackathonしないと議論が進みませんね。

Haskell Hackathonの関係で、javascriptで単体テストがしたくなりました。調べたところSeleniumがかなりヒットします。しかしちょっとやりたいことと違う気がするのでとりあえずJSUnitから試してみます。

とりあえずjsunit2.2alpha11.zipをdlして適当なところに展開します。これでインストールは終了。多分javaとjavascriptを使えるブラウザがあれば十分です。

テストのテストにテストを書いてみます。とりあえず自明なテストを書いてどう動くか試してみます。

<html>
  <head>
    <title>Test page for trying myTestFunction</title>
    <script language="javascript" src="../jsUnit/app/jsUnitCore.js"></script>
  </head>
  <body>
<script language="javascript"><!--
function f(a, b) {
    if (b == 0) return a;
    else return f(b, a%b);
}
function testWithOne() {
    assertEquals("f(1, 1) == 1", 1, f(1, 1));
    assertEquals("f(_, 1) == 1", 1, f(6, 1));
    assertEquals("f(1, _) == 1", 1, f(1, 7));
}

function testWithMultiple() {
    assertEquals("f(a*b, a) == a", 7, f(119, 7));
    assertEquals("f(a, a*b) == a", 17, f(17, 221));
}

function testWithRandom() {
    assertEquals("f(324, 156) == 12", 12、 f(324, 156));
    assertEquals("f(261, 549) == 9", 9、 f(261, 549));
}

function testWithMinus() {
    assertEquals("f(-10, 55) == 5", 5、 f(-10, 55));
    assertEquals("f(-10, 60) == 10", 10、 f(-10, 60));
}
//--></script>
  </body>
</html>

テストはhtmlファイルで、中にjavascriptで書きます。app/jsUnitCore.jsを読みこんで、それから実行してほしいテスト関数をtest*という名前で定義すれば十分です。

テストの実行はtestRunner.htmlからブラウザ上で行います。こんな(本家のscreenshot)画面が開きます。見たまんま、作ったテストhtmlファイルを指定してRunを押してすと、JSUnitが自動的にtest*という関数を探して全て実行してくれます。テスト結果は下のほうに出ます。テストが失敗するとどこで失敗したかも出ます。ちなみに上のコードは一つ失敗するはずです。

本家のDocumentationが理解できなくて苦労しました。やるべきことは全て書いているのに何故でしょう。あとでexamplesを見つけてやっと使いかたがわかり、サンプルを一つ書いたらあとはDocumentationも理解できるようになりましたが。

追記@Mar. 23, 2008 19:10 PDT:assertEqualsの最後の引数の順序を入れ換え。なってほしい値、実際の式の順番が正解でした。

今問題を読んでいます。まだ解法はわかっていません。解法以前に間違った実装を大量に思いつきます。

  • ランダムな都市からランダムな都市にゆける確率と勘違いして、sample 0を 63/64にしてみる。
  • いちばん通りにくい2都市を通れる確率で十分と思って、sample 2を 1/121にしてみる。

どれもsampleで検出できるのが親切。

ところでsample 3の1.0000000000000002ってふざけてるの。

はじめてのdiv. 1でした。土曜の9:00(PDT)からだったのですが。

スーパーがっかりタイム!

  • 前日にプラグインの準備と問題の練習をしようと思ったものの、結局しない。
  • 当日7:00に起きてlaunch arena。
  • firefoxでlaunch arenaしようとしたらjavaが無いとか文句を言われる。
  • Safariで無事launch arena。
  • プラグインの設定。ありがとうysnたん
  • 試しに過去問を解いて、arenaからcopy and pasteが全く出来ないことを知る。本当にプラグインあってよかったです。爆殺されるところでした。
  • 8:00からだと思ったら9:00からだった:) 朝食ベーグルコースへ。
  • 帰ってからコンテスト開始。
  • 250問題はまず文字を削るのを文字を変えると空目しました。sample input見て解決。
  • 600問題 opened。まず直線を線分と読み間違えて理解不能になって900 ptsへ。すぐ戻って理解したもののアルゴリズムつくるのに苦労。結局メインを作ったものの交点判定とかdouble_eqとかを作っているあいだに時間切れ。失敗だったのは、直線をax + by + c = 0ただしa,b,cは整数で最初の非ゼロ数は正という形にした所だと思います。さっさとdoubleとDouble_EQを導入したほうがおそらく正解。
  • Challenge Phaseで、copy and pasteができないので長いテストデータを入れにくいことを発見。やるきがなくなる。
    • 結局ほとんど誰もchallengeで落ちず、system testも 900 点以外はだいたいpassしたので問題はありませんでしたが。

結論としては、至急ライブラリを作るべきだと思いました。同室のTomekの600とか明らかにライブラリでしたし。 そもそもライブラリを全然用意してなかったので、イプシロン込みの浮動小数比較関数すら用意してないありさま。これでは75分で勝てません。浮動小数比較と幾何とグラフは必須ですね。

ugh. Ctrl-C,Vでコピペ出来たんですか。

document.getElementById("hoge").appendChild(document.createTextNode(mouseX))
って書くとマウスを動かすたびにノードが増えて行くんですけど、これは果たして正しいのだろうか、と。 (中略)
実装していざ突き当たってみるまで全然この辺考えたことなかったや。 Flapjax はこの辺りどうしてるんだろう。

どうしているんでしょう。とりあえずtutorialFlapjax online compilerへのリンクがあったので、そこで試してみました。


<html>
  <head>
    <script type='text/flapjax'>
document.getElementById("hoge").appendChild(document.createTextNode(mouseTop_b(document)) )
    </script>
  </head>
  <body>
    <p>Hello world!</p>
    <p>
      The mouse's coordinates are
      ({! mouseTop_b(document) ||| _ !},
      {! mouseLeft_b(document) ||| _ !}).
    </p>
   <p>The mouse top is <div id="hoge"></div></p>
  </body>
</html>

マウスを動かすたびに数字がどんどん増えました。円周率計算じゃないんだから。

Haskell Hackathonの時につくったやつを少し更新してみました。

サンプルプログラムをボタン一つで選べるようになりました。Macのfirefox 2 とsafariでは動いています。IE4とかNN4だと動かない書きかただったかもしれませんが。

それから、素数計算で4倍くらい速くなりました。やったことはeval除いたり関数呼びだしを減らしたりです。空港でプロファイラ動かしてました。あまり熱心にやっていたので、通行人にネットがつながるのかと勘違いされましたが。

いまだにコードがカオスなので、機能追加には興味はないです。テスト書いたりしたほうがいいはず。特にパーサのあたりがパーサと関係ないことまでしているのでどうにかしたいものです。わびさび方式とかつかえるのでしょうか。

  • パスワード引き継ぎがあるのを知る。
    • さらに、アイテムコンプするとパスワードの効果が変わると知って、手始めに雷龍を何度も惨殺してみる。
      • これむり。
  • ゲーム屋でスペースインベーダーエクストリームを買うときに、うっかりついでに買ってしまう。
  • パスワード写しに苦労。
  • ブシ、斧、メディ、アル、銃で一階を制覇。
  • 中三人が前回のプレイと被っていることに苦悶。あとアルに毒がないとか、前の二人の差別化ができてないとか。
  • メディアルを外し、ソードマンに剣を持たせて、鞭と巫女を導入。
  • 4階

ちなみに最後にやったのは日曜の午前二時ごろです。 寝ぼけつつ4階を探索していたところ、FOEにぶち当ってしまい全滅しかけました。アナコンダが効いていて、ターン130くらい与えて倒しました。なければやばかったです。アナコンダLv 5のようなどう見ても死にスキルにしか見えないものでも、役にたった時点で勝ちです。

ちなみに思うんですが、序盤が辛いなら序盤に役立つスキルを取るべきだと思います。 さらに、探索が辛いなら、ボス撃破のためだけじゃなくて散策向けのパーティもつくっていいはずです。準備無しで火力が出るとか全体にある程度の被害をあたえられるとかそういうスキルを選ぶのもありだと思います。前作の場合は魔除けの鈴で余裕でしたが。

さらに私は、初回プレイで、他の人が使わなかったようなスキルとかを使って他の人が通らないような修羅場を通るのが好きです。けっきょくマゾという落ち。

昨日はうっかり世界樹2をやって6 hourくらいつかいました。
今日は世界樹2を封印したらうっかり空の境界を1/3くらい読んで 3 hourつかいました。

空の境界はあと5時間つかえば終了しそうなので、封印しなくてもいいと思います。しかし 世界樹2はちょっと時間をつかいすぎるのでしばらくやめておきます。

でも別にすることないですね。ならいいか。

Rubyist Magazineのqwikwebの記事でわびさび方式を読んでみましたが、これS式ですよね。XML木をS式でつかうのならわかります。

ちょっとまってください。S式はlispのリストなので、S式で木を表すということはつまりリストで木を表している。私はS式で木を扱うのはわかると言い、一方でリストで木をつくるのには慣れていないと言いました。明かに私の言っていることはおかしいです。たぶんS式で木を扱うのもよくわかってないですね。

http://shinh.skr.jp/m/?date=20080312#p01

わびさび表現という単語はしらなかったです。あんまりそういうアクロバティックなコードに慣れていません。リストでも辞書でもあるarrayとかも知りません。またひとつ弱点を。

ちなみにHaskellなら、私は次の定義を書いてパターンマッチで分岐するコードを書きます。

data TreeList a = Item a | Items [TreeList a]

リストの関わるプログラムを書いていると、私はよくpush_back系の操作とconcat系の操作を間違えます。 前者はリストとその要素を扱い、後者はリスト二つを扱います。ややこしいところは何もありません。ただよくtypoをします。list1 + [a]ってやるべきところをlist1 + aとやったりします。あとは、文字列を一行にひとつ順番に出そうと思ったところ、文字列中の文字が一行に一文字ずつ出力されたりしたときもあります。これはどうやって出したかは忘れましたが、pythonで書いたと思います。

これはduck typingの弱点じゃないのかと思いました。以下、リストのリストを[[a]]で、ただのリストを[a]で、aはリスト以外の何かを指します。duck typingの場合、[[a]]を渡すべきところに[a]を渡しても、外側のリストに関する操作しかしない限りにおいてエラーは発生しません。また、aを渡すべきところに[a]を渡しても、なんでも受けとれるリストなら受けとってしてしまいます。エラーは発生しなくても意図すべき記述にはなっていないので、こういうエラーは他の部分を書いているときにみつかったりします。

一方静的型のある言語では大丈夫です。リストの中身の型がすべて一致していることが要請される場合なら、aを要素とするリストに[a]を入れることは出来ません。エラーの検出はコンパイル時、実行前に完全に終わっています。コンパイルが通ればこのようなエラーが残っている可能性はありません。

変換方法は簡単でした。 Download::Spiralさんのscriptから、'utf-8'を'shift_jis'に、UTF_16_ENCODINGをUTF_8_ENCODINGに、ついでにID3_V2_3をV2_4にしただけでした。超余裕。

変換の結果、ジャンルが文字化けしているところがあります。ジャンルなんて入れた覚えが無いのですが。場当り的にtag.setGenre()で変換しようとするとエラーになります。ジャンルは自由に入力できないからでしょうか。放置しました。

一箇所変換をミスしました。しかしエラーがどこで起きたか、今までいくつ処理できていたか不明。明かにスクリプトのミスです。二分探索で調べたところ、8割方変換がおわっていたのでitunesに投げて失敗したのだけ再変換しました。

ちなみに変換に失敗してたのはSimon & Garfunkel。そもそも日本語ではありませんでした。曲名にシングルクオートがあるのがひっかかったのでしょうか?

私の持っているmp3は、曲名をSuperTagEditor改造版でいれていました。このmp3をmacに移植すると、文字が完全に化けます。アルバム名が読めないとitunesでNHK英会話を正しく選ぶことすらできなくて非常に困ります。

文字コードの問題と予想しつつ直しかたを検索検索。以下の記事を参照して、pythonのeyeD3 moduleを導入しました。

以下作業記録が続きます。

  1. eyeD3 本家からeyeD3-0.6.15.tar.gzをDL.
    • macportsからeyeD3を探したものの、本家よりすこしバージョンが古かったので使いませんでした。ちなみにこちらはpy-eyed3 0.6.14
  2. configure, make, make install
  3. 上記のスクリプトを改造して、今のタグの状況を確認。
    • eyeD3モジュールをどう呼べばよいかわからなかったので上の文献が大活躍。
    • eyeD3はタグの文字列を勝手にunicodeと仮定するので要注意。[chr(ord(x)) for x in buf]なんて知りませんでした。
    • frameもわからなかったので上記のように出力して理解。あとソースを読んで理解。

以下のスクリプトを作ってmp3ファイルにかけて、入っているタグの仕様を理解しました。id3tagはver 2.3とver 2.2のものが混じっていて、日本語文字は全てsjisでした。次回はこれを実際にitunesに読める形式に直します。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import eyeD3
import string, sys

def fix2Raw(buf):
    return ''.join([chr(ord(x)) for x in buf])


def printFourAttribute(prefix, tag):
    """ print artist,  album, title for the tag
    """
    s = '\t'.join(prefix + [
            fix2Raw(tag.getArtist()),
            fix2Raw(tag.getAlbum()),
            fix2Raw(tag.getTitle()),
            str(tag.getTrackNum()),
            ]) + '\n'
    sys.stdout.write(s)


def printAllFrame(tag):
    """ Print all the frame in a tag.
    BTW, what is a frame?"""
    for frame in tag.frames:
        print frame, fix2Raw(getattr(frame,'text', ''))


def main():
    for mem in sys.argv[1:]:
        tag = eyeD3.Tag()
        if tag.link(mem) == 0:
            sys.stderr.write("WARN: %s doesn't include ID3 tag.\n" % mem)
            continue
        pretag = [mem, tag.getVersionStr()]
        printFourAttribute(pretag, tag)
        printAllFrame(tag)


if __name__ == '__main__':
    main()

どこかで見たような動画の群れがyoutubeに。

ちなに北米版発売は3/9つまり今日です。

ついスネークの無線の方は見てしまいました。日本語版見たのに。

またカリフォルニアの中にいます。

飛行機の中でhgusのソースを眺めていたら、データ型をあつかっている部分があまりに酷いので驚いてしまいました。当日、ラムダを実装し終ってから突貫工事でつけたのでさもありなんといったところですが。まず判定がザルです。正直なにも判定していないので、想定された型とちがう型をもつ引数をいれてもいいです。それから引数の数はチェックしている場所としていない場所があります。これにひっかかるプログラムはどこで異常停止するのでしょうか。

ところでこの場合、型宣言の意味はあるのでしょうか。静的型がない場合にはデータ型は(list 'symbol data1 data2...)ぐらいの意味しかもたないような気がしています。


I'm in Mountain View, CA again.

During the flight, I was checking the source file of 'hgus', the Haskell interpreter. I got really surprised at the part which handles data declaration. It checks nothing. It doesn't check the type of the parameters at all, it seldom checks the number of the parameters.

I suspect that the data declaration declares nothing in this case. Without static type checking, user generated data is just a list which starts with a symbol followed by arguments.

A 120 0 (B hoge)  ===  ('A 120 0 ('B hoge ))

haskell hackathonでは、javascriptはcore javascript guideを参考にしていました。勢いとC++の知識だけで書いたので非常に怪しいですが、何とか動いています。Javascriptはえらいですね。

今はAjax in Actionとかを眺めながらJavascriptをもう少し勉強しています。一度書くとこの辺の本が非常に読めるようになった気がします。あるいは自分のプログラムをもっとちゃんとしたくなります。とりあえず今直さないといけないのは次のあたりだと思います。

  • 解説が酷い。
  • サンプルプログラムを複数提供。selectboxかradio butonを選ぶと自動的にtextareaを埋める感じで。
    • これをやると、ユーザーが書いたプログラムを誤動作で消してしまう可能性がある。適切な動作かどうか考え中。
  • 評価の高速化。
    • 四則演算をevalで評価しているのを直す。
    • 末尾再帰をループにしてみる。

目標は遅延評価と無限リストで、サンプルにあるように素数の無限リストを計算させることを目指して書きました。型推論、インデント、IOは無視。目標がきれいにkinabaさんとかぶってます。結局終了から35分過ぎたところで完成。比較演算を定義してないのでたらいまわし関数はかけません。

言語はjavascriptで、文法をkmyaccに任せました。人が集まるので公開しやすい言語を選びました。もともとactionscriptにしようと思っていましたが身の危険を感じて日和り、javaを試したところ飽きたのでjavascriptです。今までjavascriptは1行ずつしか書いていないので、今日だけで普段の数百倍ものjavascriptを書いたことになります。感想は次の二行に尽きます。

  • firebugは便利すぎる。
  • それでも型がない言語で言語処理を書くのは無謀。

そして、この会を開催してくださったyukobaさんとサイボウズラボの皆さんに感謝です。

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