2011/03/19


以前、kazuhoさんが書いたpicojsonの紹介をさせて頂いたのですが、あれから何度も使わせて頂いていてkazuhoさんのいる方角には足を向けて寝られないmattnです。
Big Sky :: ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い!

kazuhoさんがやってくれました。ずいぶん前からjsonをC++でパース(SAXじゃなくてDOM)するのに小さいライブラリないかなーと思ってました。個人的にはjson-cというのを使ってたのですが...

http://mattn.kaoriya.net/software/lang/c/20090702153947.htm
なんど見ても綺麗なコードです。
で、先日ちょっと出張があって新幹線に乗る事があり、ちょっとルールを決めて僕にも同じ物が書けるか試してみました。
以下ルール。
  • picojson相当のjsonパーサをC++で書く
  • インターネット等の外部リソースは見てはいけない(picojsonも見ちゃダメ)
  • 見て良いのは/usr/include以下だけ
  • 制限時間は新幹線に乗っていられる間だけ
このルールで新幹線に乗った途端、ノートPCを開いて書き始めました。いろいろ書いては直してを繰り返し、出来上がった物を公開しておきます。おそらく、picojsonと同じ様な動きをします。
但し、後からpicojsonを見て気づいたのですが、"\uXXXX"といった文字列表記に対応出来ていません。まぁもう外部リソースを見てしまったので、これから対応するつもりはありません。
一応、マルチブートのノートPCだったのでWindowsでもコンパイル出来る様にしてあります。
あと、オブジェクトのリテラルで最後がカンマで終わる様なフォーマットも#define宣言でパース出来る様にしました。さらに関数テンプレートが使えないVC6でもビルド出来る様になっています。(使い方が若干異なりますが)

picojsonと同じようにヘッダファイルだけで使えます。ただしkazuhoさん程のC++erでは無いので抜けがあるかもしれませんが...苦笑。

githubに適当にアップしておきました。
mattn/minijson - GitHub

simple C++ json library. (clone of kazuho/picojson)

https://github.com/mattn/minijson
ネタですが、よろしければ話題のネタ程度にどうぞ。
Posted at by



2011/03/08


下記質問にそれぞれ50文字以内を目安に簡単に説明すること。
  1. パッケージ内に定義した関数を外部に公開するにはどうすれば良いか?
  2. 非同期に処理を行う為の命令は?
  3. 関数を抜けた際に処理を実行するにはどうするか?
  4. goroutineの同時実行数を変更するにはどうするか?
  5. コンパイラやリンカが8g/6g/5g、8l/6l/5lという名前になっている理由は?
  6. Goのガベージコレクションの実装は一般的に何と呼ばれている類か?
  7. レシーバがnilの場合にメソッドを呼び出すと何が起きるか?
  8. 可変個引数はどの様に定義するか?
  9. 関数内で定義されるローカル変数のアドレスを戻り値として外部から参照するとどうなるか?
  10. interfaceとstructの違いは何か?
  11. panicを補足して強制終了させない為にはどうするか?

続きを読む...

Posted at by



2011/03/06


public class foo {
    final static String bar = "a" + "b";

    public foo() { }

    public String bar(String baz) {
        return "a" + "b" + baz + "c" + "d";
    }
}
コンパイルしてデコンパイル # javac -version
javac 1.6.0_24
# javac foo.java
# jad foo.class
// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   foo.java


public class foo
{

    public foo()
    {
    }

    public String bar(String s)
    {
        return (new StringBuilder()).append("ab").append(s).append("c").append("d").toString();
    }

    static final String bar = "ab";
}
+ をStringBuilder に置き換えてくれたまでは良かった。a と b は最適化されて一つの ab になったけど c と d はそのままだ。
この最適化が有効なのは、業務のソースなんかでたまに見かける String sql = "SELECT "
           + "  * "
           + " FROM "
           + "  USER_MST"
           + " WHERE "
           + "  BAR = ?";

PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1"baz");
こんなソースの場合だと思うんだけど、テーブル名なんかを変数に持ってて String sql = "SELECT "
    + " * "
    + " FROM "
    + " " + tableName
    + " WHERE "
    + "     BAR = ?";
こんな事しちゃうと、変数以降の最適化が StringBuilder での最適化に止まってしまう。まぁよく見るよね。こういうコード。
String s1 = (new StringBuilder()).append("SELECT *  FROM ").append(s).append(" WHERE ").append(" BAR = ?").toString();
PreparedStatement preparedstatement = connection.prepareStatement(s1);
preparedstatement.setString(1, "baz");
しばらく「最近のJavaはconstなStringを結合して最適化する」っていうのはやめておこうと思った。
Posted at by