憂鬱な午後のひととき

3月29日_

しんどい

いろいろやることが重なってしんどすぎる. やばい. リソース管理しないといかん.

3月28日_

nakameguro_feature.cpp vol.18

中目黒が激混みだった. 花見らしい. もうそんな時期か.

3月26日_

blockchain.tokyo#18のLT発表

自作ライブラリの宣伝をした.

3月22日_

第8期サイボウズ・ラボユース成果発表会

まとめてみるとバラエティに飛んでいて面白かった. 今年はどういう人たちが来るかな. 懇親会は応募したそうな人が少なかったのが残念. もっと宣伝しないとなあ.

3月20日_

PythonからCコードを呼ぶ

複数のOSで動かすといつものごとく微妙な差異に悩んだのでいくつかメモ.

共有ライブラリの拡張子が異なるのでそれぞれに応じて名前を用意する.

name = platform.system()
if name == 'Linux':
    libName = 'libmclshe256.so'
elif name == 'Darwin':
    libName = 'libmclshe256.dylib'
elif name == 'Windows':
    libName = 'mclshe256.dll'
else:
    raise RuntimeError("not support yet", name)
lib = cdll.LoadLibrary(libName)

MacではPython2でなくPython3でないと共有ライブラリを読めなかった. DYLD_LIBRARY_PATHを指定したけど駄目だった. 理由は調べていない.

Cの配列は_fields_を使い, byref()を使って参照する. pointer()でも動くけど遅いのでbyref()の方がよいらしい.

Buffer = c_ubyte * 1536
class CipherTextG1(Structure):
  _fields_ = [("v", c_ulonglong * G1_CIPHER_SIZE)]
  def serialize(self):
    buf = Buffer()
    ret = lib.sheCipherTextG1Serialize(byref(buf), len(buf), byref(self.v))

ポインタを返す関数はrestypeにc_void_pを指定する. たとえばCのvoid *createX();な関数をPythonからlib.createX()で呼ぶと返り値のポインタはintの型(32bitに切り捨てられる).
64bit OSであっても環境によってはポインタが下位32bitに収まっているときは動くが, そうでないともちろんエラー.
初期化時に

lib.createX.restype = c_void_p

というようにしなければならない. しかしrestypeを指定したのだからlib.createX()の返り値の型はc_void_pなんだろうと思ったけどintだった(値は64bitにはなっている). c_void_pにキャストしないといけない.

self.p = c_void_p(lib.createX())

こうするとself.pはCのポインタを受ける関数に直接渡せるようになる.

3月18日_

iPhone XR

会社支給のiPhoneがXRになった. でかくて持ち運びに不便だし今までの7でいいんだけどなあ.

3月15日_

mcl-wasm

有限体Fpクラスに値をmod pで設定する関数の実装に手間取った. C++では動くのにwasm版がどこかで間違ってる.

結局はバッファ扱いの差異のせいだった.

3月14日_

C++17勉強会

今日はメタメタな内容(template meta programming)だった.

3月13日_

肩凝り, 首凝り?, いよいよひどくて全然回らない. 困ったな.

3月4日_

日本応用数理学会2019JANTセッション

筑波は遠かった.

3月1日_

重力波天体からのガンマ線バースト

面白かった. 10倍大きな重力望遠鏡を作ると1000倍たくさんイベントを見られるようになるそうな. 中性子星同士の衝突も見つかってるそうな.


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