2013/06/19


Google Chrome を使っていて「新しいタブ」を開き、右下にある「最近閉じたタブ」で閉じてしまったタブを復帰させる事が良くあります。
recent closed tab
Google Chrome Dev Channel を使っているのですが、どうやら Google Chrome をアップデートするとこのツールバー自身が消えてなくなる様なのです。この機能のヘビーユーザだったのでかなり困りました。
いろいろ調べたところ、どうやら以下の設定で直す事が出来る事が分かりました。
  1. chrome://flags/#enable-instant-extended-api を開く
  2. 設定を「規定」から「無効」に変更する。
  3. ブラウザを再起動する。
この3手順で、以前と同じツールバーで「最近閉じたタブ」が表示される様になりました。
Posted at by



2013/05/28


なんびとたりとも俺の前は走らせねぇ
ガチバトルです。
rapidjson - A fast JSON parser/generator for C++ with both SAX/DOM style API - Google Project Hosting

Rapidjson is an attempt to create the fastest JSON parser and generator. Small but complete. Support...

https://code.google.com/p/rapidjson/
fastest をうたうとは度胸があるなーと思いながら、半信半疑で試してみました。
rapidjson も picojson 同様に、ヘッダファイルだけあればコンパイル出来る C++ 向け JSON パーサ(およびシリアライザ)です。
まずは rapidjson を使ったコード。
#include <rapidjson/document.h>
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include <time.h>

int
main(int argc, char* argv[]) {
  clock_t t;
  t = clock();
  for (int n = 0; n < 1000; n++) {
    std::stringstream ss;
    std::ifstream f;
    f.open("foo.json", std::ios::binary);
    ss << f.rdbuf();
    f.close();

    rapidjson::Document doc;  
    if (doc.Parse<0>(ss.str().c_str()).HasParseError()) {
      std::cerr << "parse error" << std::endl;
      return 1;
    }

    rapidjson::Value& entries = doc["entries"];
    int i, l = entries.Size();
    for (i = 0; i < l; i++) {
      std::cerr << entries[rapidjson::SizeType(i)]["title"].GetString() << std::endl;
    }
  }
  std::cout << "score: " << clock() - t << std::endl;
  return 0;
}
そして picojson を使ったコード #include <picojson.h>
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <time.h>

int
main(int argc, char* argv[]) {
  clock_t t;
  t = clock();
  for (int n = 0; n < 1000; n++) {
    std::stringstream ss;
    std::ifstream f;
    f.open("foo.json", std::ios::binary);
    ss << f.rdbuf();
    f.close();

    picojson::value v; ss >> v;
    picojson::array a = v.get<picojson::object>()["entries"].get<picojson::array>();
    int i, l = a.size();
    for (i = 0; i < l; i++) {
      std::cerr << a[i].get<picojson::object>()["title"].to_str() << std::endl;
    }
  }
  std::cout << "score: " << clock() - t << std::endl;
  return 0;
}
picojson については、std::for_each を使っても見たけど結局自前ループで回した方が速い結果になりました。

コンパイルは両者とも g++ -std=c++11 -O2 foo.cxx でやりました。
読み込んでる JSON はこれを使いました。ウチのサイトの JSON 形式のフィードです。やってる内容は
  • ファイルを読み込む
  • パースする
  • entries の一覧を取る
  • 各 title の内容を標準エラーに出力する
これを1000回実行します。標準エラーは捨てながら計測しました。

結果は以下の通り。 rapidjson score: 3559
picojson score: 7961
こうなりました。picojson と比べて rapidjson がほぼ2倍速いという結果になりました。速い理由をソースを見ながら調べてみましたが、rapidjson は STL を使わず、自前で DOM ライクな API を提供しています。また std::string なども使いません。これによってオーバーヘッドを最小限に抑えているのだと思います。
もちろん、picojson の STL フレンドリも僕は好きですし、他の C++ ライブラリと連携する際にも便利です。

Performance - rapidjson - Compares some performance benchmark results of rapidjson 0.1 and other parsers. Also gives some analysis. - A fast JSON parser/generator for C++ with both SAX/DOM style API - Google Project Hosting

Why rapidjson is fast? rapidjson has made use of several techniques to achieve high performance. C++...

https://code.google.com/p/rapidjson/wiki/Performance
それどころか、このスコア表を見ると picojson のスコアは素晴らしいレベルだと分かりました。
唯一難点として rapidjson は確かに速いのですが、パースエラー詳細に取る方法が分かりませんでした。(あるのかもしれません。知ってる人いたら教えて下さい)

という事で、これからも picojson 使って行こうと思います。
Posted at by



2013/05/16


IRC クライアントを使って lingr 上のコミュニケーションを楽しむ場合
ruby であれば lig.rb
psychs/lingr-irc - GitHub
https://github.com/psychs/lingr-irc
perl であれば lingr-ircd
tokuhirom/lingr-ircd - GitHub
https://github.com/tokuhirom/lingr-ircd
がありますが、Go言語にもあるべきだろ!と思ったので書きました。
mattn/go-lingr - GitHub
https://github.com/mattn/go-lingr
まず IRC に関係なく Lingr API を操作するライブラリ。そしてそれを使って IRC サーバと見立てる lingr-ircd を書きました。
lingr-ircd は go-lingr の中に含まれています。

API キーをお持ちの方は下記の様に指定して下さい。
$ lingr-ircd -apikey="XXXXX" これであとはお好きな IRC クライアントから 26667 番ポート(-addr=":26668" の様に変更可能)に接続して lingr をお楽しみ下さい。

ちなみに lingr で Go言語 の部屋が無かったのでさっき作りました。
Go言語 – Lingr
http://lingr.com/room/golang
ゆるふわと、Go言語について語りましょう。
Posted at by