読者です 読者をやめる 読者になる 読者になる

OCaml

OCatraをLwt使うようにした

OCatraをいろいろ直したり、ベンチマークとってみたり - komamitsu.log で作っていたOCamlのおもちゃ的Webサーバー OCatraをLwtを使うように修正してみた。 1st 2nd 3rd 4th Ave. OCatra (byte) 4238 4424 4299 4285 4311 OCatra (opt) 11806 12384 12381 12…

OPAMでインストールしたパッケージがocamlfindで見つからない件

OPAMいいですね。http://d.hatena.ne.jp/wistery_k/20120909/1347164530 の記事を見て使い始めましたが、道具としてのOCamlが何かの壁を乗り越えそうな感じがしてます。で、使っていて、たまにocamlfind -listの中にopamでインストールしたパッケージが出て…

OCatraをいろいろ直したり、ベンチマークとってみたり

komamitsu/OCatra · GitHub のkeepaliveまわりのバグとかを直したり、モジュール名を変更したりしました。Eventモジュールを使ってすっきり書いた方が良さげだなぁとか思っているのですが、現状そんなにややこしい制御をしていないので、まぁいいかと。あと…

OCatraを短くかけるように修正

SinatraっぽいOCatraを書いてみた - komamitsu.log で作ったOCatraですが、もうちょっとすっきり書けるように修正。 open Ocatra open HttpCommon open HttpCommon.HttpContent let _ = get "/" (fun r -> say (TextPlain "Hello, World (GET)") ()); post "…

SinatraっぽいOCatraを書いてみた

先日、やっつけのWebサーバーを書く際にRubyのSinatraで書いてみたのですが、「簡単に書けて良いな〜」と思ったので、OCamlでもそれっぽいものを適当に作ってみました。komamitsu/OCatra · GitHub現状はこんな感じでかけます: open Ocatra open HttpCommon o…

いまさらのN Queen問題

最近、Scalaのコップ本を読んでいるのですが、例題でN Queen問題が出ていて、結構すっきり書かれていてへぇ〜って思いました。そういえば、N Queen問題は試したことが無かったのと、このところコードをあまり書いていないような気がしたので、気分転換にOCam…

パーセプトロンの練習

最近、機械学習に興味を持ち始めていて、SVMを実装してみようと思ったら、挫折したのでやはり段階を踏むべきであろうということでパーセプトロンから試してみた。komamitsu/ocaml-perceptron · GitHub perceptron.ml let ($) f g = f g let print x = Hashtb…

merge sort

Gistが貼っ付けられるかテスト

functor適用するときtypeに直接record型を定義すると怒られる件

↑のpostで引っかかったので単純な形にして確認してみた。 functor.ml (functorの定義) komamitsu@carrot:~/lab/ocaml$ cat functor.ml module type HogeType = sig type t val string_of_t : t -> string end module Make(Hoge : HogeType) = struct let pri…

A* search algorithm用のモジュールを書いてみた

仕事ではOCamlもA* search algorithmも全く使っていないのですが、自宅で気分転換/リハビリがてら何か書こうとすると、すぐOCamlでA* search algorithmを書いてしまいます。たまにダイクストラ法で何かgraphを探索するやつも書きます。毎回同じようなものを…

初Lwtでecho server

書いた。 https://gist.github.com/1362149これ↓を参考に https://github.com/avsm/ocaml-cohttpserver/blob/master/server/http_tcp_server.ml 適当に書き始めたのだけど、途中で「やばい徹底的にmonadicに書かないと動かないというかコンパイル通らない」…

x86_64環境でのocaml-mysqlが上手く動かなかった件

先日から、AWS EC2上にFree usage tierのインスタンスを作って、CPU使うようなことはそちらで行おうとしています。まぁきっかけは節電なんですが、もともとEC2に興味があったので。それはさておき、動かそうとしているのはMySQLをstorageとしたOCamlのプログ…

りはびり(Ordシグネチャーとファンクターを使って独自のTreeモジュールを作る)

久しぶりにOCamlでも書いてみようかと思ったら、全然書けなくなっていたのでリハビリをすることに。お題は @osiire さんの http://d.hatena.ne.jp/osiire/20101101 のレベル3。といってもこれまでの経験上、最初の「Ordシグネチャーとファンクターを使って独…

オセロゲームを作ってみた

http://bitbucket.org/komamitsu/misc/src/tip/ocaml-reversi/作ってみようかと思ったのは、ふと「ちゃんとゲーム木を実装したことが無いなぁ、特にαβカット周りは全然やったことない」と思ったからなのです。できれば、min-maxの部分を切り分けておいてオセ…

deep copy

OCamlで # let orig = Array.init 8 (fun _ -> Array.create 8 "x");; val orig : string array array = [|[|"x"; "x"; "x"; "x"; "x"; "x"; "x"; "x"|]; [|"x"; "x"; "x"; "x"; "x"; "x"; "x"; "x"|]; [|"x"; "x"; "x"; "x"; "x"; "x"; "x"; "x"|]; [|"x"; …

言語作成とか

このところocamlyacc/ocamllexで簡単なインタープリターを作ろうとしていたのだけど、どうも萌えてこないので、適当な所でやめておいた。これは確固たる目的(xxxのために新しい言語が必要とか)が無いから萌えてこないのかなぁ、と思ったけれどアルゴリズム…

B-Tree

B-Treeアルゴリズムを試してみました。http://github.com/komamitsu/ocaml-b_treeB-Treeというのは多分木のアルゴリズムで、木の高さを低く保つことができてキーのバランスが良いので、結構DBのインデックスにそれ系統のやつが使われていてDisk I/O減らせて…

隠れパターンマッチとアロケートのコスト

http://rwmj.wordpress.com/2009/08/06/ocaml-internals-part-3-the-minor-heap/ を見ていて興味深かったコードがあったのでコピペして試してみた。 #load "unix.cma" let f1 (a, b) = (a, b) let f2 (x : ('a * 'b)) = x let f3 x = x let rec loop n f arg…

A beginners guide to OCaml internals

http://rwmj.wordpress.com/2009/08/04/ocaml-internals/ (http://d.hatena.ne.jp/camlspotter/20090805/1249476309 経由)実装について基本的なところを知りたかったので助かるなぁ。Article was good but fish face at the top scared the shit out of me!…

bench! bench! bench!

Skew Binary Random-Access Lists - komamitsu.logのベンチマークをとりたいなぁ、と思っていたところ、OCamlにBenchmarkというそのものズバリなライブラリがあったので試してみました。# ちなみに件のコードは MIT License に. aptでのインストールは以下 $…

Skew Binary Random-Access Lists

Linuxの環境整備に熱中していて、すっかり忘れていたけれど、http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf の 6.4.1章について。 これは何かというと、Skew Binary Numbers - komamitsu.logとBinary Random-Access List - komamitsu.logを合わせたランダ…

Suffix-Arrayの逆襲

http://d.hatena.ne.jp/komamitsu/20090503/1241369214 で List使って書いたら遅かった Array.append使ってSuffix-Arrayを構築したら全然処理が終わらなかった としょうもない感じだったので、改善してみました(http://github.com/komamitsu/ocaml-suffixar…

Binary Random-Access List

引き続き、http://www.cs.cmu.edu/~rwh/theses/okasaki.pdfを眺めていますが、今回はBinary Random-Access Listについてメモ。 これは完全二分木と二進数を合体させたリストみたい。 このリストは二進数のように0か1を持っていて、1の場合はその中に完全二分…

Skew Binary Numbers

先日、osiireさんにSkew Binary Random-Access Listsというのを紹介して頂いたので、http://www.cs.cmu.edu/~rwh/theses/okasaki.pdfを眺めていた。 これはSkew Binary Numbersというのに基づいているらしいので、まずそっちを見てみることに。いずれも初耳…

ListとArrayの性能

http://d.hatena.ne.jp/mzp/20090511/suffixを見て気がついたのだけど、先日ちょっと書いてみたSuffix Arrayの練習 - komamitsu.logがArrayじゃなかったことに絶望した。で、適当にArrayに置き換えてみたら、いつまでたっても処理が終わらなくなったので、簡…

Suffix Arrayの練習

前から少し気になっていたhttp://ja.wikipedia.org/wiki/Suffix_Arrayを試してみた。 gitの練習がてらgithubに => http://github.com/komamitsu/ocaml-suffixarray。 これと、Str.search_forwardでちょっと性能を比べてみたのだけど、Str.search_forwardの方…

ライフゲームモジュール

練習のため、http://d.hatena.ne.jp/komamitsu/20090326/1238081086をモジュールにしてみた。lifegame.mli type cell = N | C type world val create_world : cell array array -> world val make_next_world : world -> world val disp_world : world -> (c…

ライフゲーム

前々から気になっていたので、それらしいのを書いてみた。描画は手抜きでprintf。 (* ocamlfind c -package unix -linkpkg -o lifegame lifegame.ml *) open Printf let orig_world = [| [|0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0|]; [|0;0;1;0;0;0;0;0;0;…

資金管理(ピラミッド法)

カミさんとシステムトレードの話をしていて、資金管理がいかに大切かを話していたのだけど、そもそも本当に効果があるのか自分でも自信がなかったので、簡単に試してみた。以前、聞きかじった手法は 賭け金の初期値は五枚 勝ったら一枚減らす 負けたら一枚増…

香川大学さんと合同勉強会

一昨日、昨日は、香川大学の先生達がうちの会社に来訪され、合同の勉強会が開かれていました。かねてから親交があり毎年一回程度開催されているそうです。 T先生はデータマイニングのお話。 わたしは以前、趣味で日経平均先物のトレーディングルール検出シス…

Caml Programming Guideline

OCaml/guideline - U-Wiki+を発見したのでつらつらと眺めていた。こうしてみると、ダメな書き方をしているなぁ自分、と凹む。特にRubyとOCamlを交互に書いていると、どうもOCamlでも短く書きたいと焦ってしまい可読性の低いコードになってしまうなぁ。無理に…

読んでおくべきソースコードは?

手が空いたら、勉強のためにOCamlのコードを読みたいなぁとも思っているのだけど、「まずはこのコードを読め!」的なものはあるのかなぁ。教科書的な。これを読まずしてOCamlのコードを書くべからず!みたいなもの。オブジェクトは使ってなくても良いのだけ…

再度、とりあえずマルチなechoサーバを試みたら再度玉砕

昨日に引き続き…じゃあ全コネクション分のチャネルを管理すれば良いのでは?とおもい思いっきり手抜き(スレッド間の排他無し)ながらも下記のコードで試してみました。chsリストにチャネルを放り込んでます。 open Unix open Event let rec loop f = f (); …

とりあえずマルチなechoサーバ成功っぽい

なんとかそれらしい動きをするようになりました、が…どうもすっきりしないコードになってしまった…概要はこんなかんじ。 接続受付用のchannel(A)と、クライアントと通信している子スレッド群からの報告を受け取るchannel(B)を用意。 その他、すべての子スレ…

とりあえずマルチなechoサーバを試みたら玉砕

Eventモジュールの練習として並列的なアプリを作ってみようと思ったのだけど、ネタが出てこなかったので、複数のコネクションを受け付けておいて、一つのコネクションから受信したやつを全てのコネクションに送信するチャットっぽいechoサーバを書いてみよう…

module Eventがわからない…

Railsでカミさん用に作ったiKnowモドキも仕様変更の嵐が収まってきて、OSの入れ替えなんかも終わったので、久しぶりにOCamlをいじってみようと思ったのですが、Std Libを見てたらEventというmoduleがあることに気がついた。ちらっと説明(和訳)を見てみると… …

久々にどう書く

こないだまでの勢いを借りて、久しぶりにどう書くってみた。 どう書く?org 「Thread.yieldだと切り替わらなかった」っていうのはちょっと語弊があって、「うまく混ざらなかった」ということを書きたかったはずです。

○×

久しぶりにOCamlを使ってみたら、全く手が動かなかったのでリハビリをしてみました。題材は○×(マルバツ)。これまで、ゲームのアルゴリズムらしきものを書いたことが無いので定番のやり方がが分からないのですが、とりあえず全ルートの木を作って勝ち負けの数…

Programmer's guide, part 3 読了

Ocsigenまで、サンプルを作ったりしながら読了。以前、ogasawaraさんからコメントを頂いた通り、かなり癖のある奴でした…Railsが「ふつうのWebアプリだけど色々フレームワークに押し込んでコード書く量を激減」っていう感じなのに対して、Ocsigenは「Webアプ…

Ocsipersistの簡単な使い方

examples/tutoeliom.mlから抜粋してMutex絡みの処理を除いたやつ。 $ cat count3.ml open Lwt open XHTML.M open Eliom_services open Eliom_parameters open Eliom_sessions open Eliom_predefmod.Xhtml let mystore = Ocsipersist.open_store "db_count3" …

OcsipersistとLwtモジュール

Ocsigen辺りを眺めていて、Sqlite3とかで永続化ができることに気がついた。で、ちゃんと読んでみたら、LwtというCooperative(Non-preemptiveと同意?)threadな、いわいるFiberみたいなライブラリと密接に絡みまくっているのであった。な、なぜLwtと連携し…

手順メモ

デフォルトの設定(/usr/local/godi/etc/ocsigen.conf)では実行userやTCPポート番号辺りを適当に弄ったら動いたので、今度は自分で準備してみる。 まずはサンプルアプリを用意(examples/tutoeliom.mlのcountを抜き出しただけ)。 open Lwt open XHTML.M op…

IPv4で待ち受けできた

Ocsigenの「Details about settings」を見たら思いっきり解決法が出ていた。 <ocsigen> <port>*:8880</port> <user>mitsu</user> <group>wheel</group> </ocsigen>という風にportを指定すると、IPv4で待ち受けできた。Firefoxでのアクセスも確認できた。ま、まぁ、IPv6について基礎知識を知ることが出来たり、勘違いしてい…

お試しメモ

手順をメモ。 まず、FreeBSDのPorts Collectionに入っているOcsigenはIgnoreになっているので、GODIからいれることにするが、GODI自体入っていない(何故!?)ので、tar ballを落としてきてGODI入れる。 godi_consoleからapp-ocsigenをbuildさせる。 godi-sqlit…

Ocsigen入れたった

ラムダ計算が理解できなくたっていいじゃない!と開き直ってportinstallした。でも、今日は入れるだけにしておく。S.A.C. 2ndを見るので。 追記:と思ったらがーん。今日は寝ておけということか。 ** Port marked as IGNORE: www/ocsigen:

のっかりフィボナッチベンチ

恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみる - Smalltalkのtは小文字ですを見て、お手軽なのでなじみの言語で試してみることに。スペックがしょぼしょぼなので軽めで。 Ruby def fib(n) n < 2 ? n : fib(n - 1) + f…

Y Combinator

仕事でRailsにどっぷり漬かりそう(それはそれで楽しいけど)なので、彼方に行き過ぎないよう、いままで見て見ぬ振りをしてきたY Combinator(不動点コンビネータともいうの?)を見てみることにする。以下、どう書く?org から引用 # let rec y f x = f (y f) x…

棒倒し法で迷路作成

ちょっと前のプロジェクトで、メンバー全員で設計をゴリゴリやっている時期があったのですが、一日30分位はコードを書かせたいと思い、どう書く?orgの課題をメンバーに解かせていたことがありました。そのとき、どう書く?orgという課題があり、担当のメン…

A*探索アルゴリズム

最近、A*という単語を目にすることがあったので、ちょっとWikipediaで調べてみたところ、その正体は経路探索のアルゴリズムでした。経路探索なんてチャレンジしたことも無いので、これも何かの縁と思い、頑張って書いてみることにしました。googleってみたの…

恐る恐るGenlexを触ってみる

どうもOCamlを弄くっていると、やれocamllexだのocamlyaccだの、しまいにはcamlp4だの恐ろしげなものの存在が見え隠れしてくる。もういい大人だし怖がってばかりはいられないので、初心者にも優しそうなGenlexを触って見ることにした。The core languageの1.…