2008-09-01から1ヶ月間の記事一覧

HaskellでPerlの<>

30分プログラム、その379。HaskellでPerlの<>(ダイヤモンド演算子)っぽいやつを実現してみる。 Perlの<>は、実にうまくできた演算子で コマンドライン引数が空なら、標準入力 コマンドライン引数が一つなら、それを開いたファイルハンドラ コマンドライン引…

.cmiの読み込み

30分プログラム、その378。.cmiをよ読み込んで、ひらメソッドのテンプレートを生成してみたかったので、試してみた。 id:mmatsuoka:20080515を参考にしたけど、うまく欲しい情報が取れなかった。やっぱりmliをパースしたほうが楽かもしれない。 使い方 こん…

omake with camlp4

pa_ooを使ったソースコードをomakeでビルドしたかったので、いろいろ試してみた。もっと賢い方法がある気がするけど、とりあえず動くよ。 ディレクトリ構造 +-camlp4-omake/ | +-camlp4/ | | | +-OMakefile | | | +-pa_oo.ml | +-main.ml | +-OMakefile | +-…

prototypeパターン

30分プログラム、その377。Rubyでprototypeパターンをやってみる。 そもそもprototypeパターンは、インスタンスをクラス的に扱うテクニックでしかない。でも、Rubyではクラスを値として扱えるから、prototypeパターンなぞ不要だ、ということが言いたかった。…

ライトユーザは意外と甘くない

Windowsのライトユーザの友人にUbuntuを使わせたら割と好評だった。その友だちは、Webは見るけどRSSリーダは使わない、mixiは知ってるけど、Twitterは知らない、みたいなライトユーザ。 Eee PCを買った そんな彼が最近、Eee PCを買った。「WindowsでEee PCは…

OCaml on Scheme

30分プログラム、その376。OCamlが生成したラムダ式をScheme処理系の上で動かしてみる。OCaml処理系には、その中間形式でらうラムダ式をダンプ機能がある。undocumentedと書かれているけど。たとえば、こんなfact.mlを let rec fact n = if n = 0 then 1 els…

case classを使ってtreeを

30分プログラム、その375。Programming in Scala, Third Editionで、とうとうバリアント型ことcase classが登場したのでTreeを作ってみた。 本当は二分木が作りたかったのだけれども、型パラメータTに条件をつける方法が分からなかったので、深さを測る関数…

ocaml-nagoyaグループ

id:Gemmaさんがocaml-nagoyaグループを作ったらしいので、そっちでも日記を書いてます。g:ocaml-nagoya:id:mzp

haXeをビルドしよう

最近、ocaml-nagoyaではhaXeのコードリーディングをやってる。コードを読むには、やっぱりビルドできないと始まらない。というわけで、haXeをビルドしてみよう。まず、install.mlをダウンロードする。 そして、おもむろにコマンドラインを叩く。 $ ocaml ins…

Thriftを使おう(2)

30分プログラム、その374。Thriftを使ってみよう、その2。インストールについては、Thriftを使おう(1) - みずぴー日記を参照。 IDLを書こう fact.thrift service fact{ i32 fact(1: i32 n) } スケルトン生成 $ thrift --gen cpp --gen py fact.thrift Python…

複数ディレクトリにまたがるomake

こんな風にソースコードが複数ディレクトリに分かれている場合のomakeの書き方。 +-project_name/ | +-main.ml | +-OMakefile | +-OMakeroot | +-test/ | +-OMakefile | +-OMakeroot | +-test_main.ml OMakefileの書き方 まず各ディレクトリにOMakefileを用…

Thriftを使おう(1)

30分プログラム、その373。id:GemmaさんがApache Thrift - Homeの話をしていたので、影響されて使ってみる。 でも、インストールに時間がかかって30分たってしまったので、今日はここまで。 Thriftってなに? はてなが使ってるらしいよ 異なる言語の間で関数…

Perlでも普通のリスト操作を

30分プログラム、その372。Perlの話をするたびに、id:Gemmaさんが「Perlのリストはキモい、キモすぎる。ネストするだけでリファレンスを使うなんでありえない。」と言いつづけてる。 なので、Perlでもごく普通の単方向リストを作ってみた。これなら、あたり…

ErlangでProducer-Consumerパターン

30分プログラム、その371。増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編に載っているProducer-ConsumerパターンをErlangでやってみる。 Javaと違ってwait()が無いので、キューが空のときにgetを待たせるのが結構、大変だった。やっぱり…

STMを試してみる

30分プログラム、その370。ビューティフルコード (THEORY/IN/PRACTICE)に載ってたSTMを試してみる。 複数のスレッドで、ひとつのカウンターをインクリメントしつづけるプログラムを書いてみた。 インクリメントしたあとに値を表示しているけれど、なぜか飛び…

おまけ(OMake)を試す

30分プログラム、その369。どうやらomakeがすごいらしい(id:camlspotter:20080718:1216345119)。 omake -Pによる継続ビルドとか素敵すぎる。これがあれば、fcwrapとかflymakeとかいらないんじゃね?適当にドキュメントを眺めていたら、オブジェクト指向とか遅…

Rubyでデザインパターン

30分プログラム、その368。Rubyでデザインパターンの一部を書いてみた。 前にRubyで学ぶデザインパターンを見たときに、Rubyでデザインパターンをやるときは、Javaのをそのまま移植する必要はないなぁ、と感じたのでやってみた。 Rubyだとinterfaceやらabstr…

計算機っぽいGUI

30分プログラム、その367。id:mzp:20080902:calcで電卓のロジック部分を作ったので、こんどはGUI部分を作ってみる。 Tkとかは大変そうだったので、JythonでSwingを叩いてみた。 使い方 $ jython calc-gui.py ソースコード # -*- mode:python; coding:utf-8 -…

ハノイの塔

30分プログラム、その366。ハノイの塔を解いてみる。 そういえば、ハノイの塔は解いたことがなかったので、いまさらチャレンジしてみる。 Wikipediaを見たら、引数の順序を入れかえて一つの関数で済ませていたので、混乱してしまった。そこで、引数の順序を…

固定小数点数

30分プログラム、その365。Scalaで固定小数を扱うクラスを作ってみた。 固定小数は、1.44を144、0.01を1のように小数点の位置を固定してしまう表現方法。 使い方 scala> val x = new FixNum(144,100) x: FixNum = 1.44 scala> val y = new FixNum(20,10) y: …

AtomPubではてなに投稿

30分プログラム、その364。AtomPubを使って、はてなダイアリーに投稿してみた。 本当は、はてダラをAtomPubに対応させたかったんだけど、AtomPubは日付単位でなく、記事単位で投稿とかをするので、ちょっと難しいかもしれない。 使い方 ソースコード中のとを…

並列bogosort

30分プログラム、その363。id:mzp:20080825:shuffleの続きとして、bogosortをやってみる。 せっかくErlangなので並列バージョンも作ってみたけど、微妙。計算が終了したあとも余計なプロセスを殺してないので、余計なメッセージが飛んでくる。 使い方 1> Xs …

Scalaのforは値を返す

Scalaのfor式はなんと値を返してくれます。 普通にforを書くと、返ってくるのはUnitなので嬉しくないです。でも、 for(x <- 1 to 3) yield x * 2と書くと、[2,4,6]という配列(に似たイテレータ)が返ってくる。 ちょうすげぇ。 id:Gemmaさんに自慢したら、「m…

簡易HTTP Server

30分プログラム、その362。http://www.haskell.org/ghc/docs/latest/html/libraries/network/Network-Socket.htmlを使って、簡易HTTPサーバを書いてみた。 これだけ、IO aが多いとHaskell使ってる意味がほとんどない気がするけどね。 使い方 *Main> httpServ…

Branfuckインタプリタ

30分プログラム、その361。ネタ言語とし有名なBrainfuckのインタプリタを書いてみた。 ちなみに、サンプルコードはこのへんからもらってきた。 使い方 $ ruby brainfuck.rb HELLOBF.BF Hello World! ソースコード #! /opt/local/bin/ruby -w # -*- mode:ruby…

シェルっぽいやつ

30分プログラム、その360。Unix/Linuxプログラミング理論と実践に影響されて、シェルっぽいやつを作ってみた。 パイプまでは作れなかったけど、バックグラウンドで実行するだけはつけておいた。 使い方 mzp $ gosh sh.scm $ ls /tmp launch-0j30hQ launch-40…

w3mのpre_formちょう便利ー

~/.w3m/pre_formに、あらかじめパスーワードを書いておくと、特定のサイトを開いたときにユーザ名やパスワードを自動で補完してくれる。例えば、以下のように書くと url /www.hatena.ne.jp/login/ text name mzp passwd password hoge submithttp://www.hate…

電卓を作ろう(1)

30分プログラム、その359。PythonでGUIな電卓を作ってみよう。 とりあえず、ロジック部分にチャレンジしてみたけど、結構難しい。誰か状態遷移図書いてないかな。 使い方 $ python calc.py >>1 1 >>+ 1 >>2 2 >>+ 3 >>3 3 >>= 6 ソースコード #! /usr/bin/py…

Scalaでプログレスバー

30分プログラム、その358。 せっかくProgramming in Scalaを買ったので、Scalaでプログラムを書てみた。 特にネタがなかったので、最近どこかでみたテキスト版のプログレスバーを作ってみた。 使い方 $ scala progress.scala 55% [=========================…