しんどい
いろいろやることが重なってしんどすぎる. やばい. リソース管理しないといかん.
しんどい
いろいろやることが重なってしんどすぎる. やばい. リソース管理しないといかん.
中目黒が激混みだった. 花見らしい. もうそんな時期か.
blockchain.tokyo#18のLT発表
自作ライブラリの宣伝をした.
まとめてみるとバラエティに飛んでいて面白かった. 今年はどういう人たちが来るかな. 懇親会は応募したそうな人が少なかったのが残念. もっと宣伝しないとなあ.
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のポインタを受ける関数に直接渡せるようになる.
iPhone XR
会社支給のiPhoneがXRになった. でかくて持ち運びに不便だし今までの7でいいんだけどなあ.
今日はメタメタな内容(template meta programming)だった.
首
肩凝り, 首凝り?, いよいよひどくて全然回らない. 困ったな.
筑波は遠かった.
面白かった. 10倍大きな重力望遠鏡を作ると1000倍たくさんイベントを見られるようになるそうな. 中性子星同士の衝突も見つかってるそうな.