A Day in the Life

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

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/

カッケー

記事の一覧 >