2009-11-01から1ヶ月間の記事一覧

Go と Perl で sha1sum(md5sum) コマンドっぽい機能を実装した場合のソースコード比較

同じ機能を両方で書いてみたらどんな感じになるかなと。 起動されたコマンド名から SHA1 or MD5 を求めるように切り替わる コマンドライン引数があれば引数のファイルについて、なければ標準入力からの入力について SHA1(MD5) hash を求めて表示 こんな仕様…

TCPのテスト用に空いているポートを探す

perl でいうと、Test::TCP::empty_port() が欲しかったのでちょっと書く。 import ( "net"; "fmt"; ) func empty_port() int { for port := 10000; port < 20000; port++ { addr := fmt.Sprintf("localhost:%d", port); l, err := net.Listen("tcp", addr); …

100行ぐらいで分散しないKVSを実装する(Go)

54行で分散KVSを実装する(レプリケーション機能付き)をみて、Go でとりあえず分散もレプリケーションもしないのを書いた。といっても rpc ライブラリは付いてきているので、それを使うだけ。http://golang.org/pkg/rpc/ サーバ側の保存は map[string] stri…

GMP wrapper を使って pidigits を書き直す

Go

このあたり でベンチマークの結果が python に負けてるのもあってがっかり、みたいな話題に対して、id:tokuhirom さんが「チートぎみなのもあるからソースをよく読んで判断せよ」という話。http://d.hatena.ne.jp/tokuhirom/20091124/1259029688探してみたら…

Coro と Go で並列実行数の制御

http://d.hatena.ne.jp/tokuhirom/20090710/1247196134 この Coro の例を Go でやってみます。まず特定数 (ここでは 3) の worker thread を立ち上げておいて、そこにメッセージを送って仕事させるモデル。メッセージのやりとりに Coro::Channel を使います…

Go でテンプレートエンジン (json template)

http://d.hatena.ne.jp/tokuhirom/20091117/1258418742 をみて。 Go に付いてくるテンプレートエンジンは json-template て奴でした。 記法は リファレンス にありますが、テストケース を眺めると雰囲気がつかみやすいかも。こんなコードを書いて package m…

Go をちょっと試すのに便利な wrapper 二題

8g とか 6l とかのコマンドが (分かりにくい|打ちづらい) ということに定評のある Go ですが、パッケージを作るような場合は Makefile をこんな風に書くと make 一発でことが済むので簡単です。via http://blog.yappo.jp/yappo/archives/000697.htmlでもちょ…

Go で http アプリケーションサーバ

デフォルトで付いてくるパッケージで、httpd (アプリケーション) が簡単に作れます。import . "http" とすると、http. の前置なしで http パッケージの関数が使えるので、見た目も結構すっきり。 HandlerFunc(func(c *Conn, req *Request) { が繰り返される…

Go で duck typing

string を返す String() を実装した型のオブジェクト foo があったとして、 fmt.Printf("%s", foo); とすると foo.String() を評価してくれる。これが duck typing ってやつですね。特に何も宣言しないでも、とにかく String() が実装されていれば ok。inter…

Go で goroutine

go で関数の実行を並列化できる(非同期化が正しい?)。結果は channel というものを使って取り扱うのかな。このあたりは Erlang ぽい? あまり意味のない例だけど、sleep を並列にするとこんなかんじ。 [Wed Nov 11 20:29:29 2009] sleep 1 seconds [Wed Nov 1…

Go で fizz buzz

とりいそぎ FizzBuzz ってみる。 The Go Programming Language package main import "fmt" func main() { for i := 1; i <= 100; i++ { switch { case i % 15 == 0 : fmt.Printf("fizz buzz\n"); case i % 3 == 0 : fmt.Printf("fizz\n"); case i % 5 == 0 :…