OCamlのUnknow directive

ocamlnetのhttp clientのサンプルを実行しようとしたら

#require "netclient";;
open Http_client.Convenience;;
let get_and_print url =
  let s = http_get url in
  print_string s;
  flush stdout
;;

このrequireでエラー

# #require "netclient";;
Unknown directive `require'.

解決方法

sudo port install caml-findlib

で、.ocamlinitに

#use "topfind"

と書いておく。

モジュールっていうかライブラリ周りの流儀がまだよく分かってない。

macbookのmatplotlibでLookupError

macbookでmatplotlibを使っていたら出たエラー。

LookupError: unknown encoding: X-MAC-JAPANESE

/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/matplotlib/cbook.pyというファイルを書き換えた

def unicode_safe(s):
    if preferredencoding is None: return unicode(s)
    elif preferredencoding == 'X-MAC-JAPANESE': return unicode(s)
    else: return unicode(s, preferredencoding)

ファーマコキネティクス 3章メモ

クリアランスの章

  • 固有クリアランスは血流や蛋白結合性などの影響を受けない本質的なパラメータ
  • 組織クリアランスと固有クリアランスの関係は、流入、流出する薬物濃度と細胞内薬物濃度の関係
  • 全身クリアランスは静注速度を定常状態の血中濃度で除する
  • 糸球体での薬物濾過速度は薬物によらずほぼ一定
  • 血液血漿濃度比

ProductName ファーマコキネティクス―演習による理解
杉山 雄一,山下 伸二,加藤 基浩
南山堂 / ¥ 6,300 ()
在庫あり。

情報アプライアンスと研究業務

僕の場合はdryオンリーってのもあるんだけど、TDD(Title driven development)というか、最初にタスクに名前を付けるとそれ用のWikiのエントリが出来るようになっていて、さらに、よくやる計算だと計算結果とかが自動的にWikiに足されていくようになってる(XML-RPCで)。 で、そのデータはpdfにもWORDのフォーマットでも出力できるので、レポーティングは結構ラクチンだし、自分の仕事の把握も容易だ。

もう少しTasklogとかWorkLogみたいなものもリアルタイムで取っておいて、適当に学習させて、自動的に重要そうなログを切り取ってwikiに貼付けるかタグふるようなソフトウェアがあれば、快適なんだけどなぁと思う。

さらに会議なんかも、リアルタイムで録画しときつつ、ニコニコ動画みたいに重要なタイミングでコメントつけとけば、議事録かかなくていいよねとか。書記の仕事も、おーいまこいついいこと言ったっていうタイミングでタグふればいいだけだし。まぁ、文字が右から左に流れる必要はないけど、コメントタグが時間軸毎に並んでいることは重要だし、できればマインドマップみたいに、コメントの関連性を二次元的な空間で編集できるといいかもしれん。

実際会議なんてUstreamみたいになっていれば、その場に座ってる必要ないし、実験とか計算しながら把握できてよかろう。

ProductName パソコンを隠せ、アナログ発想でいこう!―複雑さに別れを告げ、“情報アプライアンス”へ
ドナルド・A. ノーマン,安村 通晃,岡本 明,伊賀 聡一郎,Donald A. Norman
新曜社 / ¥ 3,465 ()
在庫あり。

ProductName 未来のモノのデザイン
ドナルド・A・ノーマン
新曜社 / ¥ 2,730 ()
在庫あり。

で、そういうことをやる端末としては別にパソコンでなくてよいわけで、もっと持ち運びに便利なiPhoneとかAndroidとか面白そうだなと思ってたのでこの前のワークショップのときに聞いてみたんだけど、入力が手間らしいのね。

うーん、自分でも触ってみないとわからんのう。iPhoneかAndroid携帯ほしいなぁ。

ProductName Google Androidプログラミング入門
江川 崇,竹端 進,山田 暁通,麻野 耕一,山岡 敏夫,藤井 大助,藤田 泰介,佐野 徹郎
アスキー・メディアワークス / ¥ 3,990 ()
在庫あり。

「英語で考えるスピーキング」を読んだ

英語でプレゼンして、自分のダメさ加減に凹んだ。質疑の際に言ってることはわかるんだけど、言葉がさらっと出てこない。

ProductName ドクター・ヴァンスの 英語で考えるスピーキング―すらすら話すための7つの思考法
ウィリアム A. ヴァンス
ダイヤモンド社 / ¥ 1,680 ()
在庫あり。

  • 動詞を覚えろ
  • SEE
    • Seek a shared item
    • Expand your response
    • Encourage more conversationo
  • メッセージをデザインする

ocamlとocamlcとload

例えば、こんな感じでloadして、

#load "unix.cma";;

let file = "/Users/kzfm/OCaml/kaeru.ml"

let () =
  let proc = Unix.open_process_in ("wc -l < " ^ file) in
  let count = input_line proc in
  ignore (Unix.close_process_in proc);
  print_string count;;

実行すると

$ ocaml wc.ml
      28

一方、コンパイルしようとすると

$ ocamlc unix.cma wc.ml
File "wc.ml", line 1, characters 0-1:
Error: Syntax error

エラーがでるが、#loadという行を除くときちんとコンパイルできる。

コンパイルしたい場合は毎度#loadっていう行を削除しないといけないのかな。

IT化という名前の情報の流れの組み替え

そうそう、結局重要なのは業務フローを見直して如何に効率的にまわすかとか組織全体の情報の流れを美しくするかとかで、ITってのはそれを補助するためにあるだけなんだよなとか思う。

システム化再考/mark-wada blog

ITを導入することが、システム化したことになると安易に言ってはいけないように思う。業務システムは、別にITがなくても昔からあったわけで、それは仕事の仕組みだとか流れ、また組織そのものがシステムであると言える。

で、ありがちなのは、上のほうの偉い系のヒトはITを導入するだけで情報の効率化が推進されてハッピーうさちゃんだとか本気で信じてたりする。で、IT化する僕らのほうも、そこらへんの期待は汲んでいるので、システム化する際に、よく考えてフローを見直して業務(ぼくらだと研究業務)がうまく流れてみんなハッピーになれるよう変更するわけだ。

ただ、現場は慣性っつうか惰性でそういうフローの見直しにはすぐに感情的になって反対してくるので、まぁ現場のメリット感を演出するような小技も入れたりしてまぁなんとか形にするんだけどね。

今日のOCaml

文法事項 -OCaml-より

let rec fact = function
      0 -> 1
    | n -> n * fact (n-1);;

これは、

let rec fact' =
  (fun x -> match x with
    0 -> 1
  | n -> n * fact' (n-1));;

さて、Objective Caml入門

同じ名前の関数を宣言することで隠すのが,Objective Camlプログラミングの常套テクニックとして使われる.

とあって、

# let rec fact (n, res) = if n = 1 then res else fact (n - 1, res * n);;
val fact : int * int -> int = <fun>
# let fact n = fact (n, 1);;
val fact : int -> int = <fun>

あーc++のオーバーロードみたいなもんか?と思ったんだけどどうも違うらしい。

# let f (x,y) = x + y;;
val f : int * int -> int = <fun>
# let f x y = x +. y;;
val f : float -> float -> float = <fun>

こんなのは動かない。

OCamlとlambda

後者は構文糖衣?

# let f = fun x -> x * x
val f : int -> int = <fun>
# let g x = x * x;;
val g : int -> int = <fun>

ここまでやれる

# ( * ) 4 4;;

Common Lispだとこうかな

(setq f (lambda (x) (* x x)))
(funcall f 4)

(defun g (x) (* x x))
(g 4)

OCamlで日付操作

週末にもぎったインゲンを茹でて食べたらめちゃうまだった。本には種まきしてから40-50日で収穫と書いてあったので、あれ、そういえば種まきしてから何日経ったかな?と調べたくなった(OCamlで)

種まきしてから40日後の日付を表示する。

#load "unix.cma";;
open Unix

let days = [| "Sun"; "Mon"; "Tue"; "Wed"; "Thu"; "Fri"; "Sat" |]
let months = [| "Jan"; "Feb"; "Mar"; "Apr"; "May"; "Jun";
                "Jul"; "Aug"; "Sep"; "Oct"; "Nov"; "Dec" |]

let format_time time =
  let tm = localtime time in
  Printf.sprintf "%s %s %2d %02d:%02d:%02d %04d"
    days.(tm.tm_wday)
    months.(tm.tm_mon)
    tm.tm_mday
    tm.tm_hour
    tm.tm_min
    tm.tm_sec
    (tm.tm_year + 1900)

let epoch_seconds date =
  Scanf.sscanf date "%04d-%02d-%02d"
    (fun yyyy mm dd ->
      fst (mktime {tm_sec=0; tm_min=0; tm_hour=0;
                        tm_mday=dd; tm_mon=mm-1; tm_year=yyyy-1900;
                        tm_wday=0; tm_yday=0; tm_isdst=false}));;

let date = epoch_seconds "2009-05-23";;
let interval = 40. *. 60. *. 60. *. 24.;;
let then' = date +. interval

let () =
  Printf.printf "harvest date is %s\n" (format_time then');

さてどうかな?

#   harvest date is Thu Jul  2 00:00:00 2009

pleacを参考に書いたのだけど結構長い。もうちょっと奇麗な書き方はあるに違いない。

それにしてもいんげんは今週中に収穫しないと固くなりそうだな。