Rubyについて Part 16
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/05/21(土) 18:24:44Ruby Home Page
http://www.ruby-lang.org/ja/
= 前スレ
: Rubyについて Part 15
http://pc8.2ch.net/test/read.cgi/tech/1108159084/
試してみました。それぞれの環境では同じ繰り返しです。
$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
$ ruby -e 'srand( 0 ); 10.times { p rand; }'
0.548813503927325
0.715189366372419
0.602763376071644
0.544883182996897
0.423654799338905
0.645894113066656
0.437587211262693
0.89177300078208
0.963662760501029
0.383441518825778
C:\>ruby -v
ruby 1.8.2 (2004-12-25) [i386-mswin32]
C:\>ruby -e 'srand( 0 ); 10.times { p rand; }'
0.548813502304256
0.592844616388902
0.715189364971593
0.84426574409008
0.602763370377943
0.857945619849488
0.544883177382872
0.847251737257466
0.423654796788469
0.623563696397468
0234218
2005/07/02(土) 03:23:09CからRubyのメソッドを呼び出す関数って見あたらないような…
>** Rubyの初期化・実行
の関数がCからRubyスクリプトを実行する物っぽい?けどこれで出来るのは単なる実行みたいだし…
そもそもCからインタプリタの内部メソッド(関数)を呼び出そうとすること自体無謀?
それとも処理系によってはそういうことも可能なのかな…?
0235218
2005/07/02(土) 03:23:39スマソ
0236デフォルトの名無しさん
2005/07/02(土) 05:45:43> 2.2.3 CからRubyのメソッドを呼び出す
という項目があるわけだが。
0237デフォルトの名無しさん
2005/07/02(土) 09:32:07環境によらず random.c (Mersenne Twister) 使ってるわけだし。
0238デフォルトの名無しさん
2005/07/02(土) 12:05:52それはruby-listっていうメーリングリストだ
ruby-talkだと思い込んでつい見に行っちまったじゃねえか
ありゃ?ということは>232は方法がよろしくない?
同じ1.8.2でも日付が違うから、ってことはありませんよね?
LinuxとWindowsで同じ乱数列を得られるのであれば、ぜひ助言をお願いします。
0240デフォルトの名無しさん
2005/07/02(土) 13:40:46Linuxがよくねーんじゃね?
% ruby -v
ruby 1.8.2 (2004-12-25) [i386-freebsd5]
% ruby -e 'srand(0); 10.times{p rand;}'
0.548813502304256
0.592844616388902
0.715189364971593
0.84426574409008
0.602763370377943
0.857945619849488
0.544883177382872
0.847251737257466
0.423654796788469
0.623563696397468
0241デフォルトの名無しさん
2005/07/02(土) 13:41:20ChangeLog 見たら2005年1月に random.c にいろいろ変更が入ってるので
バグ取りとかあったのかも。
ruby 1.9.0 (2005-06-08) [i386-cygwin]
ruby 1.9.0 (2005-06-24) [i686-linux]
では、どちらも >>232 の前者と同じ出力だった。
0242デフォルトの名無しさん
2005/07/02(土) 13:44:350243デフォルトの名無しさん
2005/07/02(土) 13:46:000244デフォルトの名無しさん
2005/07/02(土) 13:47:36生成するのが修正されて、乱数を2つから生成するようになったんだと思う。
0245デフォルトの名無しさん
2005/07/02(土) 13:50:58genrand_real(void)
{
unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
return(a*67108864.0+b)*(1.0/9007199254740992.0);
}
//1.8.2版random.c
genrand_real()
{
unsigned long y;
if (--left == 0) next_state();
y = *next++;
/* Tempering */
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL;
y ^= (y >> 18);
return (double)y * (1.0/4294967296.0);
/* divided by 2^32 */
}
0246デフォルトの名無しさん
2005/07/02(土) 13:51:47このパッチか
0248デフォルトの名無しさん
2005/07/02(土) 17:57:28おkwwwwwwwwwwwwwww
0249218
2005/07/02(土) 19:24:53方針的にはこんな感じで良いのかな…
・ruby_init→rb_eval_stringでRubyソースを流し込む
・rb_funcall関数を呼んで該当メソッド実行
class内のメソッドを呼ぶ方法は無いみたい…?
呼びたければrb_eval_stringで該当コードを実行するしかないのかな
0250デフォルトの名無しさん
2005/07/02(土) 19:32:010251デフォルトの名無しさん
2005/07/03(日) 15:15:510252218
2005/07/03(日) 17:08:47>・ruby_init→rb_eval_stringでRubyソースを流し込む
>・rb_funcall関数を呼んで該当メソッド実行
で一応Ruby内のトップレベルのメソッドを呼ぶことは成功
引数与えて返り値も取れることを確認
クラス内のメソッドの呼び方が相変わらずわからん。
rb_funcallの第一変数でクラスオブジェクトを指定すれば呼べそうな感じなんだけどこの値の取得のしかたがよくわからん…
README.EXT.ja見てもRubyコード内部のクラスを初期化してオブジェクトを取得する関数はないようだし…
Rubyソースでクラスを初期化してそのオブジェクトを取得するにしてもどうすれば…
これ以上はCで解析するか…
0253デフォルトの名無しさん
2005/07/03(日) 19:39:59>クラス内のメソッド
の意味がよく分からんが rb_class_new_instance とかではなかろうか。
README.EXT.ja を見るのもいいけど、
ext/ 以下の拡張ライブラリのソースも参考になると思う。
0254218
2005/07/03(日) 22:29:50def hoge
〜
end
end
ってなRubyのコードのhogeをCから呼びたいです
Rubyで書けば
c_foo = FOO.new
c_foo.hoge
となる訳だけど…
>rb_class_new_instance
肝心のnewするクラス名の指定のしかたがわからない…
argc:多分*argvのサイズ
*argv:多分クラス初期化の引数
klass:よくわからない。初期化するクラス?返り値のポインタ???
拡張ライブラリのソースも検索してみたけどrb_class_new_instanceに引数になっているのが変数ばかりで
どのクラスをどう初期化しているんだかよくわからなかった
0255デフォルトの名無しさん
2005/07/04(月) 00:29:10VALUE c_foo = rb_class_new_instance(0, 0, foo);
VALUE result = rb_funcall(c_foo, rb_intern("hoge"), 0);
0256デフォルトの名無しさん
2005/07/04(月) 00:30:28> VALUE foo = rb_const_get(rb_cObject, rb_intern("FOO"));
VALUE foo = rb_path2class("FOO");
のが楽かな。
0257218
2005/07/04(月) 17:07:35ありがとう〜
0258デフォルトの名無しさん
2005/07/04(月) 17:33:18defはありえねえ
0259デフォルトの名無しさん
2005/07/04(月) 19:46:320260デフォルトの名無しさん
2005/07/04(月) 21:34:020261218
2005/07/05(火) 01:40:49EXEからならちゃんと動くコードがDLLに入れると不正終了する
rb_eval_stringでRubyソースを流し込んだあと
rb_class_new_instanceとかrb_funcallを呼ぶと駄目な模様
コンパイルはMinGW
Rubyをコンパイルすると出来るlibmsvcrt-ruby18.aで実験しています
0262デフォルトの名無しさん
2005/07/05(火) 06:54:35全部同一人物じゃねえか(笑)
しかし激しく同意。
0263>>261
2005/07/05(火) 09:14:10「DLLから動かす」ってのがどうやったのかと。
0264218
2005/07/05(火) 16:34:38DllMainでruby_init、rb_eval_stringして
エキスポート関数でrb_class_new_instanceとかrb_funcallを呼ぶと駄目っぽい
エキスポート関数内でruby_initから書くと動く
DllMainのruby_initで初期化されたメモリとかが勝手に解放されちゃうっぽい???
でもエキスポート関数呼ばれる度にRuby初期化、スクリプトのロードするのはかなり効率悪いし
Ruby内でのグローバル変数が使い物にならない…orz
どうしたら良いだろう?
あ、一応訂正
>>261
×:libmsvcrt-ruby18.a
○:libmsvcrt-ruby18.dll.a
--disable-shared付けてビルドしたlibmsvcrt-ruby18.aだとリンクは出来るけどなぜか動かないっぽい
0265デフォルトの名無しさん
2005/07/05(火) 17:11:48DllMainの中でどうやって呼んでるか、だね。
DllMainの第2引数の値が何である時に処理させてる?
0266218
2005/07/05(火) 17:51:37DllMainエキスポートしていないだけでした…
そりゃDllMain実行されない罠…il||li ○| ̄|_
スレ汚しスマン
0267デフォルトの名無しさん
2005/07/05(火) 23:17:160268218
2005/07/06(水) 01:16:10msvcrt-ruby18.dll相当の物で良いんだけど…
0269デフォルトの名無しさん
2005/07/06(水) 09:26:05途中で-static.aてのができてるはず。
0270218
2005/07/06(水) 14:56:42libmsvcrt-ruby18.a
libmsvcrt-ruby18-static.a
をリンクした物を実行するとアプリケーションエラーになります…
0271218
2005/07/06(水) 15:01:30何か足らないと思ったけど足すのはlibmsvcrt-ruby18.aじゃなくて-lwsock32なのね…
動くようになりました
0272デフォルトの名無しさん
2005/07/06(水) 18:30:20必要ないかもしれんが、そのプログラムは普通に作った拡張ライブラリは
ロードできないから、そのつもりで。
0274デフォルトの名無しさん
2005/07/07(木) 01:13:26> あ、ホントだ…というか$:が空だ…orz
ruby_init_loadpath()呼んでる?
> ロード可能にする方法もあるんですか?
WindowsではDLLからimportされるシンボルはそのDLL名も含んでいるので、普
通にコンパイルされた拡張ライブラリはlibmsvcrt-ruby18.dllからexportされ
たシンボルにリンクされている。それをスタティックリンクされたexe/DLLか
らロードすると、>>270と同じ状況になる。
だから、考えられる方法はこの辺かな。
(1) スタティックリンクライブラリじゃなくてlibmsvcrt-ruby18.dllを使う
(2) 作るDLLの名前をlibmsvcrt-ruby18.dllにする
(3) (2)と似ているけど、Forwarding DLLを使う
(4) 必要な拡張ライブラリは全部コンパイルし直す
(5) DLLの外部参照をロード時にマッピングし直すコードを実装して、ruby-devに投げる
0275デフォルトの名無しさん
2005/07/07(木) 09:25:44libmsvcrt-ruby18.dll じゃなくて msvcrt-ruby18.dll ね。
しかしあんた詳しいな。
0276デフォルトの名無しさん
2005/07/07(木) 16:08:17class Rectangle
def initialize(x1,y1,x2,y2)
@x1 = x1
@y1 = y1
@x2 = x2
@y2 = y2
end
attr_accessor :x1,:y1,:x2,:y2
end
rect1 = Rectangle.new(10,10,20,20)
p rect1
printf("長方形の対角の座標は(%d %d)と(%d %d)です。\n",rect1.x1,rect1.y1,rect1.x2,rect1.y2")
0277デフォルトの名無しさん
2005/07/07(木) 17:11:32しかもC言語だし。
0278デフォルトの名無しさん
2005/07/07(木) 19:02:470279218
2005/07/07(木) 19:07:15呼んでいませんでした。ソースも探したつもりだったんだけど見落としていたか…il||li ○| ̄|_
やってみます
>WindowsではDLLからimportされるシンボルはそのDLL名も含んでいるので
なるほど、Windowsの仕様って事ですか…
ファイルが増えるのは好きじゃないんだけどやるとすれば無難に(1)かな…
hash.cってstaticなの多いね…
ハッシュの全要素を取り出すのに何か良い方法はあるかな?
rb_hash_keys(Hash#keys)で全キーを取って…と考えたけどstaticみたいだし…orz
static取っちゃって大丈夫かな…?
0280デフォルトの名無しさん
2005/07/07(木) 19:30:55んで、"hash.each{|h,v| cfunc(h,v);}"をevalのではいかんのか
0281218
2005/07/07(木) 20:15:01うぐ…気分的問題だけどRuby側ではRuby標準搭載以外の機能はあまり使いたくないので…
どっちみちスマートじゃないけど全キーリストを定数のキーで一緒に渡すのも手か…
わがまま言ってスマソ
0282デフォルトの名無しさん
2005/07/07(木) 20:49:550283218
2005/07/07(木) 21:38:41Rubyからの戻り値のサイズでメモリを確保する場合は…
Ruby上で数えてその値をもらうかC上でnilが出るまでArrayを読むかしかないのか…
>>282
Cからイテレータを回す?
rb_iterate(rb_each, ?, rb_ary_entry, ?)???
selfは…?スマソ さっぱりわからん…orz
0284デフォルトの名無しさん
2005/07/07(木) 21:52:56ext/**/*.cくらい読めよ
0285デフォルトの名無しさん
2005/07/08(金) 00:08:09RHASH(hash)->num_entries
RARRAY(array)->len
>>282についてはenum.cを嫁。
0286218
2005/07/08(金) 01:14:59なるほど…staticな関数でも中は公開されている関数で組まれていることもあるのか
>>>282についてはenum.cを嫁。
わかったようなわからんような…一部コピペして動かしてみればわかるかな…
どうしても必要になったらやってみる
0287デフォルトの名無しさん
2005/07/12(火) 16:44:56Rubyを組み込んだアプリを配布する場合のライセンスってどうなるんだ?
本家のライセンス読んでもよくわからん
3.a:バイナリの再配布時にはソースコードを入手可能にすればいいように読める。その適用範囲は…?
3.b:「機械可読なソースコード」って何?
5.を読むとRuby本体以外の部分は一切制限を受けないようにも読める
0288デフォルトの名無しさん
2005/07/12(火) 19:44:520289デフォルトの名無しさん
2005/07/12(火) 22:45:273.d その他の配布条件を作者と合意する
の可能性もあるわけで…
0290デフォルトの名無しさん
2005/07/13(水) 01:03:04Matzを訴えなければ大丈夫。
0291デフォルトの名無しさん
2005/07/13(水) 01:48:34えっ?
それってどういう…
0292デフォルトの名無しさん
2005/07/13(水) 02:02:36これか。
[ruby-talk:24727] Re: license terms (Re: Re: kill rdtool?)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/24727
> p.s.
>
> Here's the terms from inside of my heart:
>
> Permission is granted to anyone to use this software for any purpose,
> including commercial applications, and to alter it and redistribute it
> freely, subject to the following restrictions:
>
> 1. DO NOT SUE ME.
> 2. DO NOT EVEN THINK ABOUT SUING ME.
(いい加減な訳)
以下の条件を守れば、どんな目的に使ってもいいし(商用も可)変更・再配布も自由。
1. 訴えないで。
2. 訴えようと考えないで。
0293デフォルトの名無しさん
2005/07/13(水) 13:50:43ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30086
0294デフォルトの名無しさん
2005/07/13(水) 15:20:05なるほど。訴えない限りはよっぽど変なことに使わない限り大丈夫って感じで良いのかな?
0295デフォルトの名無しさん
2005/07/13(水) 15:21:460296デフォルトの名無しさん
2005/07/13(水) 15:34:140297デフォルトの名無しさん
2005/07/13(水) 15:34:45もちろんそんなことはライセンス条項には書いていないけどね。
0298デフォルトの名無しさん
2005/07/13(水) 15:40:180299デフォルトの名無しさん
2005/07/14(木) 13:49:11ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/5420
> Sydney is an experimental fork of ruby 1.8.2 that implements a number
> of new features, such as Native OS threads, Backtrace and Frame
> objects, more event hooks, and many more.
試してないけど、>>199 がお望みの Ruby かもしれませんよ。
0300デフォルトの名無しさん
2005/07/14(木) 13:51:260301デフォルトの名無しさん
2005/07/15(金) 00:00:43func = Win32API.new(〜)
と
func.call(〜)
の間にopenとか挟むと.callが失敗することがあるのね…数時間ハマったよ…il||li ○| ̄|_
0302デフォルトの名無しさん
2005/07/15(金) 08:46:31問題のコード(と Ruby のバージョン)を貼ってはくれまいか。
0303デフォルトの名無しさん
2005/07/15(金) 09:10:26655 名前:仕様書無しさん[sage] 投稿日:2005/07/14(木) 15:15:51
2ch にだけバグレポート書くのやめてほしい。
orz とかいってないでメール出せ。メール。
656 名前:仕様書無しさん[sage] 投稿日:2005/07/14(木) 15:25:54
そしてそれを元にバグフィックスしたら「作者見てるだろ」と言われる罠。
657 名前:仕様書無しさん[sage] 投稿日:2005/07/14(木) 16:21:22
あるなそのジレンマw
0304デフォルトの名無しさん
2005/07/15(金) 09:42:52ワロタ
0305デフォルトの名無しさん
2005/07/15(金) 09:47:21ttp://pc8.2ch.net/test/read.cgi/prog/1116043463/655-657 か。
0306デフォルトの名無しさん
2005/07/15(金) 11:09:040307デフォルトの名無しさん
2005/07/15(金) 11:14:48require 'win32ole'
大文字小文字が揃ってないのが気持ち悪い
0308デフォルトの名無しさん
2005/07/15(金) 15:29:58"/usr/local/include/openssl/md5.h", line 108: syntax error before or at: size_t
"/usr/local/include/openssl/md5.h", line 108: warning: undefined or missing type for: size_t
"/usr/local/include/openssl/md5.h", line 110: syntax error before or at: size_t
"/usr/local/include/openssl/md5.h", line 110: warning: undefined or missing type for: size_t
"/usr/local/include/openssl/md5.h", line 110: warning: undefined or missing type for: unsigned
"md5ossl.c", line 17: warning: argument #1 is incompatible with prototype:
prototype: pointer to char : "/usr/include/iso/stdio_iso.h", line 183
argument : pointer to unsigned char
cc: acomp failed for md5ossl.c
とかでてコンパイルできないんですが、ソースをどのように▼変更すればよかですか?
0309デフォルトの名無しさん
2005/07/15(金) 17:19:260310デフォルトの名無しさん
2005/07/15(金) 17:20:530311デフォルトの名無しさん
2005/07/15(金) 17:36:060312デフォルトの名無しさん
2005/07/15(金) 18:12:28無精ひげ
0313デフォルトの名無しさん
2005/07/15(金) 21:59:120314デフォルトの名無しさん
2005/07/16(土) 00:08:070315デフォルトの名無しさん
2005/07/16(土) 01:45:18コンフィギュア時 --with-tcllib --with-tklib --with-tcl-include --with-X11-include 全部設定して入れなおした。
だめだった。
なんでじゃーあんちゃんなんでじゃー
グギギ…
0316デフォルトの名無しさん
2005/07/16(土) 13:19:35ちゃんと必要なものは全部コンパイルされたのか?
0317デフォルトの名無しさん
2005/07/17(日) 01:30:34エラーの内容もわからんのではっきりしたことはいえんのだけど、
funcが開放されるまではDLLは掴んでいるはず。
0318デフォルトの名無しさん
2005/07/17(日) 03:27:24Rubyソースコード完全解説
ttp://www.amazon.co.jp/exec/obidos/ASIN/4844317210/
ここまで値段が吊り上がるぐらいなんだから、増刷してくれたっていいじゃんか。
0319デフォルトの名無しさん
2005/07/17(日) 05:39:28普通に、俺ンちの近くの本屋では売ってた記憶があるけど。
0320デフォルトの名無しさん
2005/07/17(日) 16:28:15コーパスとかから語彙を拾ってきて、その語彙を含む問題文を生成するシステムなんだけど、rubyでどうやって作ればいいのかなぁ。
プログラム例がないとちょっと手がつかない。。
0321デフォルトの名無しさん
2005/07/17(日) 18:09:50よくわからないけど、ここより自然言語処理スレのほうがいいんじゃないかな。
http://pc8.2ch.net/test/read.cgi/tech/1011988273/l50
0322デフォルトの名無しさん
2005/07/17(日) 23:17:40それって、オンラインで公開されてないか?
0323デフォルトの名無しさん
2005/07/18(月) 00:21:55知らんかった。とりあえず買っといて良かった…。
2回くらい開いたけど、忙しくなってちゃんと読んでないわ。
まぁ、そのうち増刷されるのでは?
0324デフォルトの名無しさん
2005/07/18(月) 00:22:340325デフォルトの名無しさん
2005/07/18(月) 22:08:37解決済みだったらごめん。
そこだけじゃないし、コンパイル通るようにしてもCygwin上ではtest-allが刺さるし、他でもたぶんテスト通らないと思う。
あとリンカがエラー吐く場合はossl_engine.cの該当部分を#ifdef OPENSSL_NO_DYNAMIC_ENGINE
で囲むといけるっぽいけど。
テスト通らないし直し方もわかんないのでメール投げたりしてません。ごめんなさい。
Index: ext/digest/md5/md5ossl.h
===================================================================
RCS file: /src/ruby/ext/digest/md5/md5ossl.h,v
retrieving revision 1.1
diff -r1.1 md5ossl.h
5a6
> #include "defs.h"
Index: ext/digest/rmd160/rmd160ossl.h
===================================================================
RCS file: /src/ruby/ext/digest/rmd160/rmd160ossl.h,v
retrieving revision 1.1
diff -r1.1 rmd160ossl.h
5a6
> #include "defs.h"
Index: ext/digest/sha1/sha1ossl.h
===================================================================
RCS file: /src/ruby/ext/digest/sha1/sha1ossl.h,v
retrieving revision 1.1
diff -r1.1 sha1ossl.h
5a6
> #include "defs.h"
0326デフォルトの名無しさん
2005/07/18(月) 23:08:11いや、ありがとうございます☆
0327デフォルトの名無しさん
2005/07/20(水) 00:47:43ttp://jp.rubyist.net/magazine/?0008
0328デフォルトの名無しさん
2005/07/20(水) 00:56:10こういうの好きだねぇ・・・
0329デフォルトの名無しさん
2005/07/20(水) 01:04:030330デフォルトの名無しさん
2005/07/20(水) 14:01:03あらら、また危い橋渡ってるのか (w
つか、もうちょっと垂れ流さずに日本語選んで書いた方が良いよな。
煽りが入ってる思われてもしょうがない部分が、ちらほらあちこちところどころばらばらわらわらと。
0331デフォルトの名無しさん
2005/07/20(水) 15:01:18■ このスレッドは過去ログ倉庫に格納されています