2006-06-07
swig で拡張ライブラリを作ってみる
ヒゲヲさん(推定ヒゲ職) の見よう見まねで。とりあえずなんか適当な物、つーことですでにあるけど libexif を使ったなんかを作ってみる。
まず移植したいメソッドなんかを持ってる .h を作業用ディレクトリにコピー。exif-data.h をコピってみた。
次に swig 使って変換する .i ファイルの作成。ここでは ExifData.i としてみた。
%module ExifData
%{
#include "exif-data.h"
%}
%include exif-data.h
一番かんたんな書き方で。んで
$ swig -ruby ExifData.i
で ExifData_wrap.c という swig のラッパー(?) の作成。途中
exif-data.h:44: Warning(801): Wrong class name _ExifData
exif-data.h:44: Warning(801): Wrong class name _ExifData
というワーニングがでるけど気にしないでおく。たぶん _ExifData というクラス名やばくね?という警告。できあがった ExifData_wrap.c の下の方に ruby の module や class, module_function の定義が。
SWIGEXPORT void Init_ExifData(void) {
~略~
mExifData = rb_define_module("ExifData");
SWIGEXPORT void Init_ExifData(void) {
~略~
c_ExifData.klass = rb_define_class_under(mExifData, "_ExifData", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p__ExifData, (void *) &c_ExifData);
rb_define_alloc_func(c_ExifData.klass, _wrap__ExifData_allocate);
rb_define_method(c_ExifData.klass, "initialize", _wrap_new__ExifData, -1);
・・・
次に
ruby -rmkmf -e 'create_makefile "ExifData"'
で Makefike のひな形作成。このまんま make ると libif にリンクが張られてないので、もっとうまい方法がありそうだけど、直接 Makefile を書き換える。
LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc
に -lexif を付け足して
LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl -lcrypt -lm -lc -lexif
とする。ヒゲヲさんに教えてもらった。んで ExifData.so ができあがってるので試しに使ってみる。API は EXIF library (libexif) API: libexif/exif-data.h File Reference などの元の API を参考。
require 'ExifData'
include ExifData
exif = exif_data_new_from_file('test.jpg')
exif_data_dump(exif)
わーい、なんか STDOUT にたくさん出力されたよ!超簡単だよ swig !あまりにあっさり動きすぎて拍子抜け。
だけど動かない関数がたくさんあったり STDOUT じゃなくて Array や Hash や String でデータの取得方法がわからないよここら辺はある程度 ExifData.i いじらないとだめな予感。それと今回は無かったけど、コンパイルやリンクのエラーではまったときにはノウハウがないとつらいようなのでそこら辺は誰かに訊く(ぉ)、と。
全然情報収集してない
RSSリダー(c)起業ブログ を読むのは週1,2回になってるし、plagger で巡回して gmail におくってるのを読むのは数日に一回だし。もうだめpP
Vim6とVim7の:a,:i時のautoindentの挙動の違い
http://jarp.does.notwork.org/diary/200606a.html#200606051
でもVim7だとinsert modeと同じ挙動になってしまっているようで
少なくともうちの vim7 じゃそんなこと無いんですけど。設定の違い?
いえで PC つける気が起きない
最近。PCの音がうっさいのが一番の要因で二個目がマシンの環境整えてないからやるきがあんま起こらんというのがあり、三個目はHHKPro が打ちにくいというのなんだろう。
テーマ
配色もガチャピンなのか!今気づいた。ちなみにこれ
http://pico.g.hatena.ne.jp/keyword/fix:d:challenger
c と cpp
せめて swig でバインディングぐらいは作れるぐらいまで覚えたいとか思うんだけどなんかむりなんだよなぁタスケテヒゲ!
つーかそれぐらいの教養はプログラマとして最低限嫉妬くべきジャネーノかとか思うけどいつまでもやる気が起きないダメポ…。
RHG を読もう!と思ったけど
C言語についてはそれなりの知識が必要である。構造体を実行時にmalloc() で割り当ててリストやスタックを作ることができ、関数ポインタを何度かくらいは使ったことがある、という程度を前提とした。
まろっくって何?とか思ったので無理だと思った。
グルーヴ・チューブ / Flipper's Guitar
今日はバナナのお話しです。
るびカ
ストーリーも決めてないよ。どうしょう。
rails2u
なんか mongrel 構成に変えてから全体的に不安定まくってる。。。
rlwrap
やべぇ超便利。しらんかた…。
拡張ライブラリで Hello World!
swig がはいたソース見たらむつかしくなさそうなので書いてみた。(Cレベル ふつリナを半分まで読んだレベル)
まずは Hello.c
#include
VALUE helloworld() {
return rb_str_new2("Hello Horld!");
}
void Init_Hello(void) {
VALUE rb_cHello;
VALUE rb_mWorld;
rb_cHello = rb_define_class("Hello", rb_cObject);
rb_mWorld = rb_define_module_under(rb_cHello, "World");
rb_define_module_function(rb_mWorld, "to_s", helloworld, -1);
}
Makefile 作成して make
ruby -rmkmf -e 'create_makefile "Hello"'
make
実行してみる
ruby -rHello -e 'puts Hello::World'
Hello Horld!
わーい!これでぽっくんも拡張ライブラリ作者になれるお><ノ(てけ
新しいテーマ
http://usotech.g.hatena.ne.jp/secondwife/
カッケー