2015/08/20


golang 1.5 がリリースされました。

Go 1.5 is released - The Go Blog

Go 1.5 is released 19 August 2015 Today the Go project is proud to release Go 1.5, the sixth major s...

https://blog.golang.org/go1.5

内容かなり盛りだくさんです。その中でも目を引くのが internal パッケージです。

golang ではパッケージ内のシンボルを外部から参照可能にする為に名称の先頭を大文字にする必要があります。しかしながら、そうしてしまうと無関係のパッケージからも参照可能になってしまう問題がありました。

ライブラリパッケージを作っていて内部の共通関数を切り出したい、しかしながらライブラリ以外の物からは使わせたくない、そういう場合に internal を使います。

mattn/go15internal · GitHub
https://github.com/mattn/go15internal

このライブラリパッケージは、foo および bar からそれぞれ internal/hello にある Hello を呼び出していますが、これを外部から呼び出そうとすると以下の様にエラーとして扱ってくれます。

c:\dev\go\src\github.com\mattn\go15internal_main>go build -x
WORK=C:\Users\mattn\AppData\Local\Temp\go-build408769714
package github.com/mattn/go15internal_main
        imports github.com/mattn/go15internal/internal/hello: use of internal package not allowed

どんどん使っていきましょう。

Posted at by



2015/08/15


埋め込み向けで、C言語から呼べて API が小さい JavaScript エンジン v7 を見つけました。

cesanta/v7 · GitHub
https://github.com/cesanta/v7/

特徴としては

  • クロスプラットフォーム: Arduino から MS Windows まで、どこでも動く。
  • 小さい: コンパイルされたコアはわずか 40KB から 200KB。
  • シンプルで直観的な C/C++ API: 簡単に C/C++ の関数を JavaScript 環境へエクスポート出来る。
  • 標準: V7 は JavaScript 5.1 を実装し、Standard ECMA tests をパスする事を目指している。
  • パフォーマンス: V7 は非 JIT エンジンの中で最速を目指している。
  • 創造的に利用可能: V7 は、ハードウェア(SPI、UARTなど)、ファイル、暗号化、ネットワークといった補助ライブラリのAPIを提供する。
  • ソースコードは ISO C と ISO C++ に準拠している。
  • 非常に簡単な統合: プロジェクトに取り込むには単に v7.h と v7.c の2つのファイルをコピーするだけ。

v8duktape も良いのですが、v8 はどっしり構えないと書き出せないし、duktape も API がスタックマシン形式という誰得だったりするので、純粋にC言語から使えてしかも define だけでネットワークや暗号まで使えるなら、こりゃ使わない理由はない。試しにサンプルを書いてみた。

#include <v7.h>
#include <stdio.h>
#include <string.h>

static v7_val_t
js_neocomplete(struct v7 *v7, v7_val_t this_obj, v7_val_t args) {
  char buf[100], *p;
  p = v7_to_json(v7, this_obj, buf, sizeof(buf));
  puts(p);
  return v7_create_undefined();
}

int
main() {
  v7_val_t result;
  struct v7* v7 = v7_create();
  v7_val_t obj = v7_create_object(v7);
  v7_val_t arr = v7_create_array(v7);
#define V7_STR(v7, v) v7_create_string(v7, v, strlen(v), 1)
  v7_array_push(v7, arr, V7_STR(v7, "きさま!"));
  v7_array_push(v7, arr, V7_STR(v7, "まさか!"));
  v7_array_push(v7, arr, V7_STR(v7, "そのまさかだ!"));
  v7_array_push(v7, arr, V7_STR(v7, "フハハハハハ!"));
#undef V7_STR
  v7_set(v7, obj, "Shougo"60, arr);
  v7_set_method(v7, obj, "neocomplete", &js_neocomplete);
  v7_set(v7, v7_get_global_object(v7), "Shougo"60, obj);

  v7_exec(v7, &result, "Shougo.neocomplete()");
  v7_destroy(v7);
}

実行すると

{"Shougo":["きさま!","まさか!","そのまさかだ!","フハハハハハ!"]}

という文字が出力されます。

見てもらえると分かる通り、かなり直観的な操作で JavaScript のオブジェクトや配列や JSON 操作や、C言語関数の呼び出しが行えるようになっています。ただしライセンスは GPL v2 なので利用の際には注意が必要です。

Posted at by



2015/07/31


Java - String.format("%d", i)で数字が出てくると思ってたら死んだ話 - Qiita
http://qiita.com/tnj/items/022b906ac5435a429369

数字がロケール文字になったり、toLowerCase() や toUpperCase() の結果がロケール文字になったりするだけじゃないんだぜ。

import java.util.Locale;

public class Foo {
    public static void main(String[] args) {
        Locale.setDefault(new Locale("pt""BR"));
        String csv = String.format("%s,%f""hello"1.23);
        System.out.println(csv);
    }
}

とあるヨーロッパ南米のロケールではこの結果がこうなる。

hello,1,230000
( ゚д゚) 

(つд⊂)ゴシゴシ 
  
(;゚д゚) 
hello,1,230000
(つд⊂)ゴシゴシ 
  _, ._ 
(;゚ Д゚) …?! 
hello,1,230000   _, ._ 
(つд⊂)ゴシゴシゴシゴシゴシゴシゴシゴシ 

(  д ) 
      
(; Д ) ! 


(; Д )カオカオカオカオ 
 U_, ._U 
  ゚  ゚ 
  _, ._ 
(つд⊂)ゴシゴシゴシゴシゴシゴシゴシゴシ 

  _, ._ 
(;゚ Д゚) 

結論 ポルトガル語怖い。

参考資料

幾らかのヨーロッパロケールで小数点が機能しない · Issue #172 · vim-jp/issues · GitHub
https://github.com/vim-jp/issues/issues/172
Posted at by