憂鬱な午後のひととき

6月21日_

static変数のスレッド安全性

C++11から(あるいはgccはもう少し前からだったような)static変数の初期化が安全に行えるようになってるけどJavaScriptでは今のところ不要. __cxa_guard_acquireと__cxa_guard_releaseが要求されるのでむしろ邪魔.

-fno-threadsafe-staticsをつけてそのコードを生成しないようにする.

6月20日_

Re: wasmで返り値の型が異なるとエラー

wasm-ldの--check-signaturesオプション,

extern "C" void* mymemset(void *p, int v, size_t n)
{
    char *s = (char*)p;
    for (size_t i = 0; i < n; i++) {
        s[i] = (char)v;
    }
    return p;
}

みたいな関数の実体と呼び出す関数が違うとリンク時に

wasm-ld-6.0: error: function signature mismatch: mymemset
>>> defined as (I32, I32, I32) -> I32 in add.o
>>> defined as (I32, I32) -> I32 in sub.o

と怒られる. 他にもsignatureが違うと言われる関数がちらほら. うーん, ポインタが入ると型がずれてしまうのかなあ. --check-signaturesを消すとちゃんと動く. wasm-ldのバグ? wasm-ld-7だと直ってるのだろうか.

直ってた.

あと上記のような関数はmemsetだと認識して勝手にmemsetを呼び出すような最適化がかかり, 実行時にmemsetがないと怒られる.

Import #1 module="env" function="memset" error: function import requires a callable

最初, どこにも無いのになぜだと思った. これは-fno-builtinをつけると解消する.

6月19日_

wasmで返り値の型が異なるとエラー

wasm用のコードを開発していたらWebAssembly.instantiate()が「elements on the stack for fallthru」とか「drop found empty stack」のエラーが出るようになった.

最初はどこかstackサイズが空になったのかと思ったのだけどそうでも無いみたい. よく分からんなあと思っていたら理由を教えてもらった.

関数の形は返り値の型も含めて同じでないといけないらしい. memset()相当の関数を作っていたのだが返り値をさぼってvoidにしていた. ヘッダでvoid *を返すようになってると上記のエラーになるそうな.

wasm-ldに--check-signaturesをつけるとリンク時にチェックしてくれる.

// a.c
int set(int *p, int x)
{
    *p = x;
    return x;
}
// b.c
void set(int *p, int x);
void f(int x, int y)
{
    set(&x, y);
}

それぞれをclang -target wasm32-wasmでoファイルを作ってリンクすると

wasm-ld-6.0: error: function signature mismatch: set
>>> defined as (I32, I32) -> void in a.o
>>> defined as (I32, I32) -> I32 in b.o

プロトタイプ宣言と実装の戻り値が異なるなんて通常は滅多にないけど, 上記のように標準関数の大体関数を手抜き実装したときに遭遇してしまった.

6月18日_

Re: L2準同型暗号の解説

準同型暗号の最前線3(理論編)
も書いてみた.

6月17日_

L2準同型暗号の解説

久しぶりにQiitaで書いてみた.
準同型暗号の最前線1(入門編)
準同型暗号の最前線2(原理編)
タイトルは若干煽り気味? でもまあ先週の発表ネタだから許して.

6月16日_

『松ノ内家の居候』(瀧羽麻子)

淡々としていて盛り上がりは無いが面白かった. なんとなく中島京子っぽいテイスト.

6月14日_

Japanist 10

「~」の入力が漢字変換モードで「~」を入力しても入らないのがとても不便. Japanist 2003のときと同じく[記号入力]の設定で「 ̄→~」にチェックをいれてるのだけどなあ.

仕方がないから「~」を「~」で漢字登録した.

6月13日_

clang for wasm

だいぶ安定してきてるらしいのでぼちぼち試してみる.

emccとの違い.

clangでwasm用オプションは-target wasm32-wasm. そして__wasm__が定義される.
emccでは__asmjs__が定義されている.

linkerはwasm-ldを使う. -no-entry --strip-all --allow-undefinedをつけると最小限のバイナリになる.

Cの関数をexportするには

__attribute__((used)) // emcc
__attribute__((visibility("default"))) // clang

emscripten.hのEM_ASMマクロは使えない. 代わりにwasmのinstance化のところでCから呼んでほしい関数を渡す.

// add.cpp
#define API __attribute__((used))
extern "C" uint32_t addJS(uint32_t x, uint32_t y); // JS関数
extern "C" API uint32_t callJS(uint32_t x)
{
    return addJS(x, 999);
}
// run.js
const mod = {}

fetch('add.wasm')
  .then(response => response.arrayBuffer())
  .then(mod => {
    const imports = {
      env : {
        addJS : (x, y) => { return x + y }
      }
    }
    return WebAssembly.instantiate(mod, imports)
  })
  .then(ret => mod.exports = ret.instance.exports)

mod.exports.callJS(1000)

WebAssembly.instantiateの第2引数に渡すオブジェクトは envの中にCから呼んでほしい関数を書く. 最初のオーバーロードの例のサンプルでは動かなくて試行錯誤した.

6月12日_

ボランティア

IPA未踏関係で知り合いに頼まれて少し打ち合わせに参加することになった. それは面白そうだし楽しみ.

のだが, その後IPA事務局からのメールで未踏OBはボランティアとして協力してもらうことに決まってるので了承くださいとあった.

もともと対価を受け取るつもりは全然無かったのだけどIPAがそう言ってるのはおかしくないかい.

仮にも経済発展のために起業や事業化も目指してる・支援しているという機構が, 自身が認定した「優れた人材」をボランティアとして使うことに決まってるというのは意味が分からない. OBがコンサルを生業としていたらどうするのだろう. ここは「日当10万円出します(金額適当)」とか「御社の規程に合わせて」とかいうべきじゃないのかな.

6月11日_

Oculus Go

社内で@shuyoさんが布教活動してるので借りて家で試してみた. すごいのだけど, どうも体に合わないようですぐ頭が痛くなる.

立体眼鏡とか立体視とか昔から苦手だったからなあ.

6月10日_

疲れたまりすぎ

うーむ, どこかできちんと休まないといかんな.

6月9日_

疲れすぎ

体が全然動かない. 参った.

6月8日_

ASIA CCSの発表資料

終わってホテルでタクシーを頼んだら高級なのが手配された. 何事も無く順調に帰宅できてよかった.

6月7日_

ASIA CCS参加

一人で海外の会場に行くのは初めてなのでとても緊張した. 最初タクシーでcentral park hotelを頼んだらcentral parkに止まって焦ったがhotelと言ったらそちらに移動してくれた.

ホテルはお風呂やトイレがガラス張りで落ち着かない.

6月6日_

emccの-Ozオプション

emccのオプションで-O3と併用して使うと勘違いしていた. ベンチマークが遅くなってるなあと思ったらこれのせいだった.

-O3のみにするとバイナリサイズが2~3倍大きくなるが1.6倍速くなった.

6月5日_

母関数と漸化式

漸化式を母関数を使って解く方法をおさらい. 久しぶりに紙をたくさん消費した.

6月3日_

wasmでベンチマーク

なんか以前よりいくつかの演算が遅くなってるような気がするのだが, なんか悪さしたかな.

調べたらうっかりGLVメソッドが無効になっていた. そのあたりの速度が戻った. でもまだペアリングが遅いような.

6月2日_

Re: ゼロ知識証明

思っていたのと実際に細かく計算するのとではやはり違う. でも大筋はうまく行きそう(なのかな).

6月1日_

ゼロ知識証明

ちょっとしたアイデアが使えるか手で計算してみる. 既にある結果なのかな. とりあえず自分でできるところまでやってから調べる.


御意見は光成滋生<herumi@nifty.com>までお願いします