Tickモナドとモナド則

まだHaskellをはじめて間もないころ、「bindの度に何かするモナド」を考えた。例えば、 action = do putStrLn "one." putStrLn "two." putStrLn "three." というコードを実行すると one Hello! two Hello! threeと出力するような。応用すれば、「定期的に yi…

Firefoxで特定のページのオフラインキャッシュとlocalstorageをクリアするアドオン

Firefoxにおいて、HTML5のアプリケーションキャッシュ(オフラインキャッシュ)をクリアするには、メニューの環境設定→詳細→ネットワークを開き、「今すぐ消去」をクリックする。しかしHTML5アプリの開発で毎回この画面を開くのは面倒である。この操作をショー…

Firefox 3.6で HTML5 の オフラインキャッシュをクリアする

(追記:アドオンを作った。) HTML5 には オフラインでwebアプリケーションを動作させるためにファイルをキャッシュする手段が指定されている. cache manifest というファイル に,「どのファイルをキャッシュするか」を記述しておき、htmlタグの manifest …

CPSチェイン

追記:「東京Node学園#1「非同期プログラミングの改善」のエッセンス」というスライドで、似たようなテクニックが使われているのを見た(p.32-)。 そんなにスジは悪くないのかもしれない。 JavaScriptでは非同期的に関数を呼ぶことが多い。例えばimgタグのロ…

OM2010 in Nagoya近し

名古屋でのOCaml meeting 2010が近いけれど、何かと忙しくて内容にcontributeできそうにない…。OCamlJSを使って何かやるつもりだったけど間に合わない…。 などといいつつ、気分転換にJavaScriptをポチポチ書いた。

可変状態モナドと安全な入出力とセッション型 in OCaml

今日は関数型言語の型で副作用(入出力)の制約を表現する、というお話を書きます。 (勢いで書いたので、わかりやすいかどうか不明です。) Safeio in OCaml ガリグ先生による Caml-list への投稿に Safeio というお話があります。 任意個のチャネルへの入出力…

multi-promptな限定継続 in Haskell (失敗編&成功編)

multi-promptな限定継続の方が型がわかりやすい件について。なんだかshift/resetの型付けはむつかしいなーと思っていた。 限定継続のOCaml実装を見てみたくて、Olegさんのdelimccライブラリとその論文を眺めていた。 こちらはmulti-promptな限定継続といい、…

限定継続でmap関数をひっくり返す

前回の例はちょっと意味不明だった。単にshiftをmap関数に渡してみたかったのだけど…もっとわかりやすく、shift/reset を使って map 関数をひっくり返したものを作ってみた。 が、やっぱりモナドなので普通のSchemeの例より読みにくいような気もする。まあし…

限定継続モナドと再帰

この記事の続きはこちら三次会では Olegさんによる限定継続モナド を触っていた。 これまで皆が使っているのを指をくわえて見ていたけど、自分でもやっと使いこなせるようになってきた気がする。うれしくなったのでこの記事を書く。説明では疑似Haskellっぽ…

ProofCafe #3

Coq

第三回ProofCafeが開催されました。CPDTの Inductive Types の前半を読みました。個人的には injective タクティックを使ったことがなかったので次から積極的に使おうと思いました。

ProofCafe #02

Coq

ProofCafe の第二回が名古屋・栄の「どえりゃあ」で開催されました。 前回の記事はこちら 私は今回は出席できず。残念です。 資料とか http://coq.g.hatena.ne.jp/yoshihiro503/20100517/p1 より転載。 資料(HTML): http://adam.chlipala.net/cpdt/html/toc.…

カバレッジテストの自動化

いきなり何を言い出すのかと思われるかもしれないが、最近はCやJavaのソースコードを解析してカバレッジテストを自動化する方法を調べている。 私、この分野に関しては全くの素人なので、何か知っている人はぜひコメント欄や twitter (@keigoi) で教えて欲し…

ProofCafe #01

Coq

名古屋・栄のお洒落レストラン「どえりゃあ」で、第一回 ProofCafe が開催されました。 ProofCafe は、コンピュータプログラムの安全性に関する定理証明に興味を持つ方々の集いです。 記念すべき 第一回目は Coqという定理証明支援系について id:yoshihiro50…

hint から Template Haskell を使って reify

下の記事の続き。 hintは意外に私の欲しい機能がなく、たとえば「あるレコード型のフィールド名をすべて取得」みたいなことができない。Template Haskell の reify 関数なら、任意の識別子について reify が使えるののに… というわけで、 ややアクロバティッ…

hint 使って型推論、 haskell-src-exts を使って Parse

GHC API のラッパー hint を使えばHaskellでも手軽にリフレクションっぽいことができる。例えば動的にHaskellのソースをロードして関数を呼び出す、といったことが数行で書ける。 ところでリフレクション周りで色々やろうとすると、すぐに関数の型を解析した…

無限ストリームで幅優先探索

Coq

参考:http://d.hatena.ne.jp/yoshihiro503/20100119#p1証明すげー。 あと、幅優先探索で見つけたパスを無限ストリームで並べているのを見てこれは面白いと思った。枝刈り付きBFSとゴールの発見手続きを独立に書けているのか。なるほど! ストリームを使った…

余帰納的(coinductive)な型のsimpl

Coq

無限ストリームの型はCoInductiveという構文で宣言された余帰納的な型である。 無限ストリームはCoFixpointという余帰納的な関数(?)を作る構文で定義する。Fixpointは最小不動点(Coqなら「いつか必ず止まる」)だがCoFixpointは最大不動点(止まらない、無限?)…

Windows ServerのNTPクライアントを設定

Windows Server 2003 を使っているのですが、 ドメインメンバーだからか コントロールパネルの「日付と時刻」では NTPクライアントのタブがなく、GUIで設定できなくなっていました。 次のコマンドラインで、NTPクライアントを設定しました: w32tm /config /…

fixタクティック

Coq

fixタクティックについて。 ふつう、Coqの証明モードで構造帰納法を回したい場合は inductionタクティックを使いますが、 fix は、帰納法のためのよりプリミティブなタクティックのようです(項の場合分けをやらない). This tactic is a primitive tactic to…

refineタクティックでらくらく依存型プログラミング(?)

Coq

下の記事では, Definition dual_dec : forall (u1:sesstyp) (u2:sesstyp), {dual u1 u2}+{~dual u1 u2}. という関数を,Coqの証明モードで作りました.ところが証明モードで作ったプログラムは極めて複雑でイマイチ効率のほどがよくわかりません (Coqで Pri…

セッション型(一部)の双対の決定可能性を証明

Coq

すごくどうでもいい証明です..Coqを触るのは2年ぶりくらいだろうか… めちゃくちゃ非効率なことをやっていそうなので,皆さんのツッコミをお待ちしています. 前提 セッション型の双対とは,受信の双対が送信,送信の双対が受信という感じで決まっています…

full-sessions-0.6.1

full-sessionsの新バージョン 0.6.1 を HackageDBにアップロード しました。 full-sessions は、Haskellにおけるマルチスレッド/ネットワークプログラミングのライブラリです。 Sessionモナドという新しいモナドを使ってプログラムを書きます。 チャネルの型…

iso-再帰型(???)のfoldとunfold?

TAPLのiso-recursive type の説明でfoldとunfoldというのが出てきたけど、それっぽいことをする。 単に再帰型っぽく展開したりたたんだりできるだけで、実際に再帰型を作っているわけではない。 -- 再帰させたい型 data A x = A x deriving Show data B x = …

type families と fundeps の、単一化に関する微妙な差異

昨日の記事に関連するのだけど、 fundeps と type families で一見 同じように見えるが 微妙に異なる挙動を見つけた。ずいぶん込み入った例だけれど、さしあたりの理解のためにこの記事を書く。 ストーリー 例のごとく、私は full-sessionsにおいて 繰り返し…

(相互)再帰 in full-sessions

忘れた頃に full-sessions の開発をやっている。 これまでセッション型の再帰を扱いづらかったので、もっとイージーに使えるようにした。unwind という関数で、再帰の開始点を表すことにした*1。 例えば、 {-# LANGUAGE NoMonomorphismRestriction #-} impor…

full abstraction

full abstraction ... λ計算とかπ計算とか表示的意味論のお話ではよく出てくる概念なんですが、未だによくわからないなーとつぶやいていたら id:sumii さんに教えていただいた。 もったいないのでここに残しておきます。 full abstraction の私的な説明 計算…

PLDIr 的なものを名古屋でやりたい

東京には PLDIの論文を読む PLDIr という会があるらしい。 ちくしょー楽しそう! http://blog.deadbeaf.org/2009/08/22/pldir/ http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20090930#p01さておき、似たようなことを名古屋でやるとしたら誰か乗り気な人は…

Hibernate annotationsにおける 遅延初期化のキャンセル

Hibernateはパフォーマンス向上のため遅延初期化の機能をもっています。 が、必ず アクセスされるオブジェクトについては遅延初期化は不要です。 .hbm.xml では 該当するクラスやプロパティに lazy="false" と書きます。一方 hibernate-annotationsでは, @Pr…

pthread の フェアネス (と ocamloptのコンテキストスイッチ)

pthread のスケジューリングがイマイチ公平でないように見えたので各環境での振る舞いについてざっと調べた. (あんまりOCamlと関係ない) 動機 前回のコードは 私の環境(MacOSX 10.5.8)では コンテキストスイッチがなかなか起こらず しばらく片方のスレッド…

マルチスレッドなFFIの実装

マルチスレッドでOCamlからCを呼ぶ場合、または CからOCamlにコールバックする場合、 C側からOCaml のデータを触るとき C側からOCaml のコードを呼ぶとき は、その部分を (OCamlを触らないコード) leave_blocking_section(); (OCamlを触るコード) enter_bloc…