Herokuそろそろくるんじゃない?

ひさしぶりに書いてます。
最近はGoogle App EngineiPhone/Androidアプリにうつつを抜かしていて、Ruby関連情報を全くキャッチアップできていませんでした。
が、そろそろHerokuが天下をとるんじゃないかと感じたため調査を始めました。

調べていくうちに知らないワードがたくさんでてきてビックリ。
ひとまず気になるもの


もろもろ調べつつTwitterBOTでも書いてみてリハビリしてみよう

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;
    }
}

これは楽しい

めも

いろいろ書きたいことあるけど書けてないなー
いつか書くためのメモ

・C,C++ネタ
 最近はCかC++をメインで使ってるので

・画像処理ネタ
 高速に綺麗なサムネイルをつくるCライブラリを書いた

Python+GAEネタ
 Webサービス作りは今後GAEでやる予定

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 />
はろー


おしまい