Goでイテレータ
goroutineとchannelとrangeつかえば巧い事やってくれました。
package main import ( "log"; "time"; ) func FibIter(n int) chan uint64 { ch := make(chan uint64); go func() { var a, b uint64 = 0, 1; for i := 0; i < n; i++ { ch <- a; a, b = b, a + b; } close(ch); }(); return ch; } func main() { for i := range FibIter(50) { log.Stdout(i); time.Sleep(1e8); } }
Goでサーバー実装のパターン
Go言語がおもしろい。
Goでのサーバー実装の方法が、ある程度パターン化してるので覚えておこう。
ここで言うサーバーはエコーサーバーやmemcachedみたいなやつデス
package main import ( "net"; "fmt"; ) func handler(conn net.Conn) { defer conn.Close(); // 4 buf := make([]byte, 16); l, err := conn.Read(buf); if err == nil { conn.Write(buf[0:l]); } } func main() { sock, err := net.Listen("tcp", "127.0.0.1:1983"); if err != nil { fmt.Printf("error %s", err); return; } // 1 for { // 2 conn, err := sock.Accept(); if err != nil { fmt.Printf("error %s", err); return; } // 3 go handler(conn); } }
1でループし、2でAccept。そして3でコネクションをgoroutineで動かしたhandlerに渡す。
最後にロジックを4に書けば出来上がり。
クライアントも同じようにいけそうだなーたのしいなー
参考
GitHub - dustin/gomemcached: A memcached binary protocol toolkit for go.
GO
GOの仕様が素敵だなぁ。
D言語っぽさを感じたのは僕だけだろうか。
ついき
ちょっと前にはhttpのtestにこけてたけどrelease外してcloneしてみたらtest通った
hg clone https://go.googlecode.com/hg/ $GOROOT
追記の追記
Makeの仕組みが用意されてて嬉しかった。GOFILES並べるだけ。
include $(GOROOT)/src/Make.$(GOARCH) TARG=hello GOFILES=\ hello.go include $(GOROOT)/src/Make.cmd
httpつかってみた
package main import ( "fmt"; "http"; ) func main() { if res, _, err := http.Get("http://www.google.com/"); err == nil { for key, value := range res.Header { fmt.Printf("%s: %s\n", key, value); } } }
うごいた
goroutine使ってみた
package main import ( "fmt"; "time"; ) func generate(ch chan string) { for i := 0; ; i++ { ch <- fmt.Sprintf("hogehogeurl%d", i); } } func download(in, out chan string) { for { prime := <-in; fmt.Printf("download: %s\n", prime); out <- "ok"; time.Sleep(1 * 1e9); } } func main() { in := make(chan string); out := make(chan string); go generate(in); for i := 0; i < 3; i++ { go download(in, out); } for i := 0; i < 20; i++ { <-out; } }
これは楽しい
Snow Leopardやめた
なにかと不便なことが多かったからLeopardに戻した
Sinatra+携帯+絵文字
ブログを放置しすぎなので紹介します。
いい加減飽きてきた感じのするSinatraで携帯サイトを開発するときの絵文字Extensionです。
自サイトで絵文字のみ使いたかったので実装しました。
現在は基本絵文字のみ+あまりテストしてないという適当仕様です。
rack-ketaiを使えればそれで良いって話があります。
http://github.com/gioext/sinatra-emoji
使い方はREADMEを見れば概ね分かるかと思います。念のため、ここにも載せておきます。
注意点は通常のerb,hamlを置き換えて、文字コードを変換しているのでるので、変換が必要ない場合は__erb__,__haml__を使いましょう。
sudo gem install gioext-sinatra-emoji
require 'rubygems' require 'sinatra' require 'sinatra/emoji' get '/' do erb :index end helpers do # use __erb__ def partial(sym) __erb__ sym, :layout => false end end configure do # default set :output_encoding_sjis, true end __END__ @@ layout <html> <head><title>test</title></head> <body> <%= yield %> </body> </html> @@ index <%= emoji(0) %> <%= partial(:parts) %> @@parts <%= emoji(1) %> <br /> はろー
おしまい