Ruby-FFI 1.0.0 からは Ruby 1.9.2 以降が必要になった。
% sudo gem1.8 install ffi
Password:
ERROR: Error installing ffi:
ffi requires Ruby version >= 1.9.2
そのため、Ruby 1.8 向けの gem をインストールするときはバージョン 0.6.3 を指定する。
% sudo gem1.8 install ffi --version "= 0.6.3"
Password:
Building native extensions. This could take a while...
Successfully installed ffi-0.6.3
1 gem installed
Installing ri documentation for ffi-0.6.3...
Installing RDoc documentation for ffi-0.6.3...
Ruby FFI のメモリ管理についてメモ。FFI::MemoryPointer で確保したメモリを自分で破棄する場合は、autorelease を false にする。
error = FFI::MemoryPointer.new(:pointer)
...
C.LLVMDisposeMessage(error)
error.autorelease=false
そうしないと、FFI::MemoryPointer は GC 時に確保したメモリを破棄しようとする (MemoryPointer.c#L138) ので、たとえば Mac OS X では以下のようなエラーが出る。
ruby(891,0x7fff70874ca0) malloc: *** error for object 0x102e8fb10: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
エラー処理とかでは割と忘れがちかもしれない。
LLVM 2.8 の C API 差分をチェックしてはじめて気づいたけど、2.8 からは Union Type がなくなったみたい。
The LLVM IR 'Union' feature was removed. While this is a desirable feature for LLVM IR to support, the existing implementation was half baked and barely useful. We'd really like anyone interested to resurrect the work and finish it for a future release.
現在の実装は不完全で、また、不足分を実装しメンテする開発者がおらず優先順位も低い、ということが理由のようだ。
It's just a matter of priorities, unfortunately... :(
http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-September/034451.html
Lots of people agree it would be a useful feature, we are lacking a useful implementation :-)
http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-September/034484.html
Google Bookmark を使いはじめた。シンプルながら快適な使い心地で気に入っている。
- とにかく、ブックマーク編集画面が開くまでが速い
- ブックマーク先のページも含めて全文検索が可能
ソーシャル要素は考えず、純粋に「ブックマーク」という行為を突き詰めていくと、上記二点が非常に重要であることが分かると思う。
ちなみに、ブックマークレットにはGoogleブックマークに追加するブックマークレット(メモ欄対応版)で配布されているものを別窓で開くようにして使わせてもらっている。感謝。
実際にはシングルトンではなくて、共有インスタンスを返すメソッドを実装する、ってだけなんだけど。
class A(object):
@staticmethod
def shared():
instance = A()
A.shared = staticmethod(lambda: instance)
return instance
- 共有インスタンスとなるオブジェクトを生成し、レキシカル変数にバインドする
- このオブジェクトを返す無名関数で、元の関数 shared を置き換える
何が嬉しいかというと、共有インスタンスを参照するための変数(今回の場合は instance)を関数外から不可視にできること。変数のスコープが必要以上に広いと不安になります。実行時に遅延インスタンス化されるのが嫌なら、クラス定義の直後に一度呼び出すなりすればいいと思う。
gist:290628 に doctest とか追加したものを置いてあります。