函数プログラミングの集い 2011 in Tokyo に参加してきました

チュートリアル:「函数プログラミング」は、これから関数プログラミングをやっていく上で参考になり、よかったです。 OCaml の話がやっぱりわくわくする。 函数プログラミングの集い 2011 in Tokyo - [PARTAKE] 関連 tweet のまとめ Togetter でまとめてくれている方がいたので、こちらで復習をすることに。 函数プログラミングの集い 2011 in Tokyo #fpm2011 - Togetter 函数プログラミングの集い 2011 in Tokyo その2 fpm2011 - Togetter 函数プログラミングの集い 2011 in Tokyo その3 fpm2011 - Togetter

Read More

C から Ruby を呼び出す

C から Ruby を呼び、Hello World を出力するプログラムを書いてみた。 必ず必要なのは、初期化処理と終了処理。あとは、Ruby を呼び出す処理。Java を呼び出すより簡単。 バージョン ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] ソースコード #include "ruby.h" int main(int argc, char *argv[]) { ruby_init(); ruby_init_loadpath(); rb_eval_string("puts 'Hello World'"); return ruby_cleanup(0); } Makefile ruby.h や関連のヘッダーファイルへのパスを通してあげるのと、ライブラリのリンクを設定してあげること。恐らく Ruby をコンパイルした環境によって違うと思う。 RUBY_HOME = /home/foo/opt/ruby-1.9.2 CC = gcc SOURCES = sample.c OBJS = $(SOURCES:.c=.o) CFLAGS = -I$(RUBY_HOME)/include/ruby-1.9.1 \ -I$(RUBY_HOME)/include/ruby-1.9.1/i686-linux LDFLAGS = LIBS = -lpthread -lm -ldl -lrt -lcrypt -L$(RUBY_HOME)/lib -lruby-static TARGET = main $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) .

Read More

C で HBase にアクセスする - JNI サンプル

これまでのまとめとして、C で Hbase にアクセスするプログラムを作成してみた。C と Java のそれぞれに Makefile を用意しているので、make を実行すれば、クラスファイルと実行ファイルは作成される。 実行ファイルの引数に CLASSPATH を指定すれば動くはず。例えばこんな感じで。CLASSPATH に指定するパスが多くて嫌になる。 $ LD_LIBRARY_PATH=/opt/java/jdk1.6.0_22/jre/lib/i386/client ./main -Djava.class.path=./java:/home/foo/opt/hbase-0.90.3/hbase-0.90.3.jar:/home/foo/opt/hbase-0.90.3/lib/hadoop-core-0.20-append-r1056497.jar:/home/foo/opt/hbase-0.90.3/lib/commons-logging-1.1.1.jar:/home/foo/opt/hbase-0.90.3/lib/log4j-1.2.16.jar:/home/foo/opt/hbase-0.90.3/lib/zookeeper-3.3.2.jar ソースコード http://qtakamitsu-snippet.googlecode.com/svn/trunk/lang/c/jni/hbase/ http://qtakamitsu-snippet.googlecode.com/svn/trunk/lang/java/hbase/MyHTable/ テストデータ create 'app1', 'log1', 'log2' put 'app1','row1', 'log1:date', '2011/06/11 10:00:00' put 'app1','row1', 'log1:host', 'example1.com' put 'app1','row1', 'log1:path', '/doc' put 'app1','row1', 'log1:user', '' put 'app1','row2', 'log1:date', '2011/06/11 11:00:00' put 'app1','row2', 'log1:host', 'example2.com' put 'app1','row2', 'log1:path', '/cgi-bin/printenv.cgi' put 'app1','row2', 'log1:user', 'user01' put 'app1','row3', 'log1:date', '2011/06/11 12:00:00' put 'app1','row3', 'log1:host', 'example3.

Read More

インスタンスメソッドを扱う - JNI サンプル

インスタンスを生成して、値を設定したり、取得したりしてみた。 やっぱり C から扱うといろいろと面倒な手続きが増えるなー。 Java public class Person { private int age; private String name; public void SetAge(int age) { this.age = age; } public int GetAge() { return this.age; } public void SetName(String name) { this.name = name; } public String GetName() { return this.name; } public static void main (String[] args) { Person p = new Person(); p.SetAge(22); p.SetName("hoge"); System.out.println("Persopn: " + p.GetName() + "(" + p.GetAge() + ")"); } } C #include <stdio.

Read More

シグネチャを調べる

JNI を扱うとき、メソッドのシグネチャを指定しなければならないが、簡単にコマンドで調べられることがわかった。これで、一括で抜き出したい時などに楽ができそう。 $ javap -s Person Compiled from "Person.java" public class Person extends java.lang.Object{ public Person(); Signature: ()V public void SetAge(int); Signature: (I)V public int GetAge(); Signature: ()I public void SetName(java.lang.String); Signature: (Ljava/lang/String;)V public java.lang.String GetName(); Signature: ()Ljava/lang/String; public static void main(java.lang.String[]); Signature: ([Ljava/lang/String;)V }

Read More