ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

2012年5月19日土曜日

ruby rb_exc_fatal を試した

サンプルコードを置いておきます。
GitHub:
https://github.com/tomohikoseven/rb_exc_fatal

メインスレッドとサブスレッド2枚動作中、サブスレッドがfatalの例外を投げて、それをメインスレッドが捕捉します。
サブスレッドもrescueしてるけど、捕捉しない。

2012年4月29日日曜日

ruby 拡張ライブラリ rb_thread_create サンプル

rb_thread_create のサンプル書いてみた。

下記コマンド実行で動くはず。

$ ruby extconf.rb
$ make
$ ruby fib.rb

test1.c と fib.c が拡張ライブラリで、fib.rb が拡張ライブラリ利用者。

(fib.rb)
 $LOAD_PATH << "."
 require "test"
 include Test

 Test.thread
(fib.c)
#include <stdio.h>
int fib( int n )
{
    if( n < 0 ) return -1;
    if( n == 0 ) return 1;
    if( n == 1 ) return 1;
    if( n > 1 ) return fib( n-1 ) + fib( n-2 );
}
(test1.c)
#include "ruby.h"

int fib();

int gloval = 0;
VALUE wrap_fib( VALUE self )
{
    int n;
    int count = 0;
    for( count = 0; count < 30; count++ )
    {
        n = gloval;
        printf( "fib(%d):%d\n", n, fib(n) );
        gloval = (n + 1) % 30;
    }
    return Qnil;
}
VALUE wrap_thread( VALUE self )
{
    rb_thread_create( wrap_fib, NULL);
    return Qnil;
}
void Init_test()
{
    VALUE module;
    module = rb_define_module( "Test" );
    rb_define_module_function( module, "thread", wrap_thread, 0 );
}
(extconf.rb)
require 'mkmf'
create_makefile( "test" )

ruby rvm 拡張ライブラリ 公開ヘッダ ruby.h 場所

拡張ライブラリを作っていろいろ作業をしている。
直接公開ヘッダファイルを見たいけど、どこにあるのかと探した結果を下記に示す。

andre@andre-VirtualBox:/usr$ rvm -v

rvm 1.13.0 () by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

andre@andre-VirtualBox:/usr$ sudo find / -name ruby.h
[sudo] password for andre:
/usr/lib/ruby/1.8/i686-linux/ruby.h
/var/cache/ruby-rvm/rubies/ruby-1.9.3-p194/include/ruby-1.9.1/ruby/ruby.h
/var/cache/ruby-rvm/rubies/ruby-1.9.3-p194/include/ruby-1.9.1/ruby.h
/var/cache/ruby-rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/ruby/ruby.h
/var/cache/ruby-rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/ruby.h
/var/cache/ruby-rvm/src/ruby-1.9.3-p194/include/ruby/ruby.h
/var/cache/ruby-rvm/src/ruby-1.9.3-p194/include/ruby.h
/var/cache/ruby-rvm/src/ruby-1.9.3-p125/include/ruby/ruby.h
/var/cache/ruby-rvm/src/ruby-1.9.3-p125/include/ruby.h

ruby1.9 簡単な拡張ライブラリ 作成時 注意

簡単な拡張ライブラリを作成したとき、
カレントディレクトリに拡張ライブラリと
それを利用するテストrubyを作成すると思う。

ruby1.9になると、テストrubyは拡張ライブラリを取り込むことに失敗することがある。
それは、

カレントディレクトリがLOAD_PATHとして設定されていないからだ。
その一つの対処として、テストrubyに下記を追記する。

(テストruby)
$LOAD_PATH << "."

require 'xx"

2012年4月15日日曜日

ruby rvm version 切り替えできない 解決法

rubyの勉強中。

ruby 1.9.xの環境がほしくて、インストールしようとしたら、ruby 1.8.7 の環境と共存できるツール rvm あると知って、インストールした。

インストール参考:

複数のRuby環境を共存させられるRVM(Ruby Version Manager)を使う - アインシュタインの電話番号☎ : http://d.hatena.ne.jp/ruedap/20110112/ruby_version_manager_rvm_install

rvm を使って versionの切り替えをしようとしたらできなかった。

原因は、bashrcに追記する設定でした。

上記サイト:

if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi

修正

if [[ -s /usr/local/rvm/scripts/rvm ]] ; then source /usr/local/rvm/scripts/rvm ; fi

これで、versionの切り替えができるようになった。

andre@andre-VirtualBox:/$ rvm 1.8.7
andre@andre-VirtualBox:/$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-linux]
andre@andre-VirtualBox:/$ rvm 1.9.3 andre@andre-VirtualBox:/$ ruby -v ruby 1.9.3p125 (2012-02-16 revision 34643) [i686-linux]