2012/08/09


某SNSでFizzBuzzが再燃しておりますが、面接時の足きり尺度としてFizzBuzzが使えるかどうかは別として、コードとしてFizzBuzzは有益でもなんでも無いので、FizzBuzzを題材としたコードを晒してみる。 Go言語には、元々Gobと呼ばれるエンコーダが同梱されていて、Goで扱える型をストリーム上に垂れ流しデコードする事が出来る。かつ、RPCも用意されているので小規模なクラサバならば簡単に書けてしまう。
巷のRPCは、エンティティからスタブを作ったり面倒だったりしますが、Go言語ではクライアントとサーバの意識さえ合っていればスタブも必要ない。
まずサーバ package main

import (
    "fmt"
    "net"
    "net/rpc"
)

type FizzBuzz int

func (fb *FizzBuzz) Serve(n int, r *stringerror {
    switch {
    case n % 15 == 0:
        *r = "FizzBuzz"
    case n % 3 == 0:
        *r = "Fizz"
    case n % 5 == 0:
        *r = "Buzz"
    default:
        *r = fmt.Sprintf("%d", n)
    }
    return nil
}

func main(){
    fb := new(FizzBuzz)
    rpc.Register(fb)

    server, _ := net.Listen("tcp"":8001")
    for {
        client, err := server.Accept()
        if err != nil {
            println(err.Error())
            continue
        }
        rpc.ServeConn(client)
    }
}
Register に渡される型のメソッドで、入力引数、戻り値のアドレス の二つを引数に持ち、戻り値に error を持つ物はエクスポートされる。なのでこの場合、n が FizzBuzz の入力、r が戻り値へのアドレスになる。
尚、このRPCは透過性があるので、別に TCP でなくても構わない。

次にクライアント。型がサーバと一致しているのなら、とても簡単に呼び出せる。 package main

import (
    "net/rpc"
)

func main() {
    client, _ := rpc.Dial("tcp""localhost:8001")
    var ret string
    for i := 1; i <= 100; i++ {
        client.Call("FizzBuzz.Serve", i, &ret)
        println(ret)
    }
}
GobというGo言語に特化したエンコーダなので、他の言語でも...という訳には行かないが、ちょっとした物を作る時にはかなり便利である。
尚、Go言語には net/rpc/jsonrpc も含まれていて、こちらを使えばポータビリティのある RPC が書ける様になっている。
Posted at by



2012/08/01


togetterをvimからダラダラと見たいという衝動に駆られ作ってみました。
mattn/togetter-vim - GitHub

interface to togetter for vim

https://github.com/mattn/togetter-vim


:TogetterHot で注目一覧 :TogetterRecent で新着一覧が出ます。画面はこんな感じ
TogetterRecent
一覧でエンター押すと
Togetter
閲覧出来る。なにげに便利。
webapi-vim の最新版が必要。

追記
コメントなどは閲覧出来ない。やるかどうかは不明。
Posted at by



2012/07/27


プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件 - kazuhoのメモ置き場

たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以下のような感じのコードを書いたことがある人は多いと思います。

http://d.hatena.ne.jp/kazuhooku/20120726/1343290960
例えばこんなのどうだろう
#include <string>
#include <list>
#include <iostream>

#define _(...) std::string(#__VA_ARGS__)

int
main() {
  std::list<std::string> list = {
    "foo""bar""baz"
  };

  std::string code = _( <ul class="mylist">\n );
  for (auto i = list.begin(); i != list.end(); ++i) {
    code += _( <li class="mylist-item"> ) + *i + _( </li>\n );
  }
  code += _( </ul> ); 

  std::cout << code << std::endl;
}
出力結果
<ul class="mylist">
<li class="mylist-item">foo</li>
<li class="mylist-item">bar</li>
<li class="mylist-item">baz</li>
</ul>
いや、エスケープとか全く考えてないけどね。

C++実践プログラミング C++実践プログラミング
スティーブ オウアルライン, Oualline,Steve, 康司, 望月, クイープ
オライリージャパン 単行本 / ¥6,000 (2003年09月01日)
 
発送可能時間:

Posted at by