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

Oxyさんの日記より

最近Haskellでネットワーク使うアプリケーションを書いているのですが、これもFunctional Reactive Programmingで上手く抽象化できたらなぁ。今はSocketを直接叩くしかないという悲惨な状況なので…。
本人には直接言ってしまったんですが、抽象化しにくいのってHaskell的に、というか抽象的なプログラム的にどうなんでしょう。泥臭いことは一回だけ書けばすむ、とはいかないんでしょうか。

これは自分への挑戦でもあります。Haskellで十分に抽象化する。とくにコピペをしない。基本的ではありますが。

スポンサーサイト
この日記を書き始めたころはCurrier bellからのリンクしかなくて、適当に知り合いに公開しているという意識でした。しかしいつの間にかACM/ICPCアンテナに登録されていたり、通りすがりの人にコメントを書かれたりしてびっくりしております。

私はなんか表現がうまくないので、なんか脈絡なく書くことしか出来ません。で、この日記を見てくださる人が増え、ここで適当に書いたことをよそでまとめてくださってさらに関連研究までポイントしていただけるのですごくうれしいです。きゃはー

なんかテンションが夜明けです。
タイトルは正しい四字熟語ではありません。気をつけてください。
不倶戴天を「ふぐさいてん」と読む人ばっかりですごくだまされた記憶があるので、あんまり変なことを書くのには抵抗があります。書きますが。

Haskellにもだんだん飽きてきましたが、なにかひとつ纏まったものを出さないと面白くないのでもう少しがんばります。でも最近は回線交換機Erlangのほうが面白そうな風に見えてきました。
以前Haskellでクロージャを使って作ったオブジェクト指向は、
Types and Programming Languagesにはそのまま載っておりました。
車輪のなんとかといわれそうですが、個人的には方向性が間違ってないということがわかって一安心です。
作業開始します。
なぜなら
もう誰に送ったかわからないくらいいろいろメール送ったので。
任天堂DSを買ったのに、ほとんど触っていません。
脳年齢48歳のGusがお送りいたしました。
以前書きましたHaskellの罠について
>とある関数をコピーして似た関数を作ったら、末尾再帰先が元の関数のまま。
コピペするのがそもそもの間違いです。リファクタリングの時期と思われます。
それとも筋肉トレーニングでしょうか。

いずれにしろ、昨日、筋トレに詳しい友人に講義を受けました。そのおかげで今日はかなり筋肉痛です。


収穫は以下のとおり。

使える機器が増えた。
今までやっていた負荷が非常に軽いことが発覚。負荷が二段階増加するなどなど。
フリーウエイト講習を勧められた。誰かほかにやっている人いませんかね。
Types and Programming Languagesの15章 "Subtyping"の p. 206にて、

S→T1 ∧ S→T2 <: S→(T1∧T2)

とあります。この逆は成り立たないのでしょうか。反例が思いつきません。

T1∧T2=Botのときでしょうか。その際左辺はBotになり右辺はS→Botになる。本当かな。どうも∧についてよく理解していない予感。



追記8/24/2006:本のこの部分ではintersectionについて詳しく触れていないので、逆が成り立つ場合も成り立たない場合もある程度に適当に認識しておけばよいのでしょうかね。
頭が痛いと思ったら心拍数がover 150/secondでした。どうしたものか。
  1. 型がIO (IO ())になっていてdoの中で実行されない。これはコンパイルエラーにならない。困惑。
  2. f a (-b)の括弧を忘れる。さらに虚数で(-100):+3の括弧も忘れる。これはコンパイルエラーで検出できる。
  3. とある関数をコピーして似た関数を作ったら、末尾再帰先が元の関数のまま。
  4. それは別にHaskellに限ったことではない。
  5. 急に遅くなる。これは私のせいじゃない。
  6. Javaののりでソースファイルを分割してしまう。
  7. 似たようなことを何度も日記に書いてしまう。
  8. あぁ、参照透過だからな。
  9. 参照透過じゃあ、仕方ないな。
週記より引用。

2006-7-28
oxyさんに呼応して。

INTERCAL, unlambda, brainf.* は現代プログラマーの必修言語です。これらの言語は、プログラミング言語の持つ能力でその言語の優劣を語ることがいかに馬鹿げているかを表す良い題材です。
Javaはオブジェクト指向だから素晴らしいのではありません。
Haskellは遅延評価だから素晴らしいのではありません。
Perlは文字列処理が出来るから素晴らしいのではありません。
いずれも、それが「楽に書ける」から素晴らしいのです。

多くのプログラム言語はチューリング等価なので、あるほげ言語で出来ることはほかのどの言語でも出来ます。差は、それが楽に書けるかどうかです。

プログラム言語はわざとある表現を書きにくくもします。

何でも再帰と言いますが、普通のforやwhileは書けないんですか。再帰で表現できるというのは、gotoでforが表現できると言っているように聞こえます。

Cではgotoは使えますが、あまり使いません。使うとm9します。私が。
ほかの言語では、たとえばschemeの関数定義。本によってはdefineをdefunのように使うことはみっともないと書かれています。

Haskellでは遅延評価のおかげで書きやすいものと書きにくいものが出てきます。書きにくいものは無理して書かないとかdoを使いまくるかすればよいのですが、あえて純粋関数型に書くといろいろと発見できます。本筋と外れてきましたが。

表現を制限することで見えてくる世界もあります。これって何でしょう。設計技法でしょうか。
この日記の個別記事を見るとblog-entry-**.htmlというURLになります。**には番号が入りますが、こいつが連番にならずよく飛びます。

飛んでいるのは記事を書きあぐねているためです。下書きのまま放置していると、番号だけとっておいて表に出ないという挙動になります。
haskellの話とかFRPの話とか関数型C++の話とかGNU MPの話とかいろいろためてあります。

話の多くはまだ掘り下げていません。そのため、「こんなものがあります。面白そうですね。誰か試しませんか」という水準でしか記事がかけないので、これではあまり意味がないかなと思い放置しております。

といっても、日記は別にS/N比を気にして書くものではないし、とりあえず書いて反応を得てもよいのかもしれません。ゲーデルの子孫まではちょっと今のところ手が回りませんが。
どうしてこの日記は、トップで二ページ前の記事を出すのでしょう。前からこうだった気はしないんですが。。。。



追記:このエントリーを書いたら修正されました。下書きを書きすぎたのが原因でしょうか。よくわかりません。
mixiの私のに足跡がついてました。ログインすら久しぶりなのに。なぜでしょうか。

どうもこの日記の更新が通知されるみたいですね。今までこの経路に気づきませんでしたが。
http://user.it.uu.se/~svens/larverna/normal.html

ズームインは怖い
Roguelikeの歴史によると、The Minstrel's Songというゲームが昔あったそうです。

検索すると、RPGとroguelike gameの説明が出てきます。

ろまさが のタイトルはここからついたんでしょうか?
超連射68Kの雑魚の動きを真似したいです。

へろへろと近づいてブレーキかけて弾を吐いて後ろに去ったり
こちらを迂回しつつ弾を吐いたり
カーブを描きながらすれ違ったり

まねのためには観察です。いつもは画面に入るかはいらないかのうちに撃墜してしまいますが、今日は雑魚観察のためにノーショットプレイ。蜂の巣になりました。

変形してレーザーを放つ中型機とかも好きですが、その辺は絵とか面倒そうなのでとりあえず雑魚の軌道です。画面上部で適当に弾を吐いてから去ったり、等速直線運動するだけの雑魚だととても悲しいです。
このテンプレートは非常にきれいで良いんですが、ulタグがまったく飾り付けてくれません。自分でテンプレートを改変しないといけません。

とりあえずolタグに書き換えて対処。

さらに言うとこの辺りのテンプレートとの整合性はプレビューを見てもまったく役に立ちません。やれやれです。

日記の内容が重いという話も。もっと軽いことを書いて見ましょうか。

たとえば:

シルバードラゴン初ゲット 1/5。 しかしそもそも恋の迷路が非常に苦手でExtraクリアしていませんが。 そもそもまじめにHardをクリアしようと思うのなら、4-6面をちゃんと練習した上で詰め紅魔郷するほうが良いと思います。しかしそこまでこんを詰めるわけでもなく、序盤でミスっても気にしないというスタンスでやっています。今回なんか2面で3機も落としましたし。
のような。

あるいはDungeon Crawlの話なんかはしたいと思っています。 過去いろいろやったので、ゲーム紹介から始まって話すネタなんかはいろいろあります。

  1. そもそも10周くらいしている。
  2. スコアボードにない組み合わせを挑戦してしまう
  3. バグ報告前に該当箇所のソースを読んでしまう
  4. そのせいで日本語化サイトにタキオン変調の極性が反転しているバグ報告をしてしまった
  5. さらにその後のバグ報告で、おそらくソース読んでるからご存知かと思いますがといわれた。
  6. なぜか英語版のバグ報告もする
  7. 匿名の攻略掲示板で書き込むと中の人がばれる。
  8. 攻略wikiに記事をたくさん書いた(「ソースファイルを読もう」じゃないよ)
こんなかんじで。ただひとつ問題は、記事を書くとまたやりたくなってしまうことでしょうか。中毒性が高いので危険です。

この日記が非常に重かったので、ちょっとテンプレートを変えてみました。
どうでしょうか。
なーんにもわからないので文字通りテンプレートを持ってきただけですが。

追記:上のように書いてからすぐまた変えてしまいました。ふふふ。
週記 2006/6/27 より
やっちまった
なんかグラフの形が変だなーと思って解析プログラムを眺めていたら。 

let xi = int_of_float (x /. !step) in
        Objective Caml version 3.09.2
# int_of_float 0.1;;
- : int = 0
# int_of_float (-0.1);;
- : int = 0                
典型的なミスに引っかかっていたorz 

floor,ceilを使うように慣れておけばこんな罠にかかることはありません。しかしOcamlだとこれらの関数はfloat->floatなので、intがほしいときはその後ちゃんとint_of_floatしないといけません。

調べた範囲では、floor,ceilがfloat値を返すのはOcaml,C,Javaなどで、Haskellは整数を返してくれます。Haskellのほうが合理的な気がします。前者の言語では、float値を返したほうがいい理由があるんでしょうか。

ありました。かなり決定的な理由が。以下 http://jp.php.net/ceil より引用。

value の次に大きい整数値を返します。 ceil() の返り値は float 型と なります。これは、float 値の範囲は通常 int よりも広いためです。

なるほど。これではintを返せません。Haskellは多倍長整数が扱えるので大丈夫ですが。

オペラがアップデートされたみたいなので更新してみました。

以前のエントリの 続きです。

フレームレートが変動してもプログラムの速度が変わらないように見せるには どうすればよいんでしょう。 たとえば画面更新のたびに弾丸を一定の距離だけ動かすとすると、 フレームレートが変動すると弾丸の速さが変化して見えてしまいます。 これを防ぐには、直前の更新から経過した時間を考慮して、 弾丸の移動距離を変えればよさそうです。

以前のプログラムはこんな感じでした。

update :: Game.Environment -> Game.Object -> Game.Object
update env b@Bullet{coord=oldc,velocity=oldv} = b{coord=oldc+oldv}
coordがBulletの位置、velocityが速度です。更新するたびに位置を速度分動かします。

これを次のように変えます。

update :: Game.Environment -> Game.Object -> DTime -> Game.Object
update env b@Bullet{coord=oldc,velocity=oldv} dt = b{coord=oldc+oldv*dt}
経過時間dtを与えて、移動量を速度と経過時間の積にします。

重力加速度がある場合には、さらにちゃんと書きます。式は省略。

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