プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で
前スレ
Ruby 初心者スレッド Part 59
http://echo.2ch.net/test/read.cgi/tech/1475394638/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
探検
Ruby 初心者スレッド Part 60 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/04/29(土) 02:01:58.34ID:urVXnFrH
651デフォルトの名無しさん
2017/07/08(土) 13:19:15.07ID:lhqNZaXL いつまでその話引っ張るつもりだよ
652デフォルトの名無しさん
2017/07/08(土) 14:06:59.57ID:fcf9I7tU これをRubyで解きなさい
普通のパズルではない「正規表現クロスワード」がBBCラジオに登場 - GIGAZINE
http://gigazine.net/news/20170707-regular-expression-puzzle/
普通のパズルではない「正規表現クロスワード」がBBCラジオに登場 - GIGAZINE
http://gigazine.net/news/20170707-regular-expression-puzzle/
653デフォルトの名無しさん
2017/07/08(土) 15:45:07.53ID:FfZt44/H654デフォルトの名無しさん
2017/07/11(火) 01:41:06.03ID:MbVhLJ6O railsスレから移動してきました。
def index
UNIXSocket.open('/tmp/myapp.sock') do |sock|
sock.write(params.to_query)
rt = sock.readline
render text: rt
end
end
みたいなことがしたいのですが、どうも
rt = sock.readline
のところで処理が止まってしまうように見えています。
renderの部分まで処理を進めるにはどのような書き方をすればよいのでしょうか。
教えて頂けますと嬉しいです。
def index
UNIXSocket.open('/tmp/myapp.sock') do |sock|
sock.write(params.to_query)
rt = sock.readline
render text: rt
end
end
みたいなことがしたいのですが、どうも
rt = sock.readline
のところで処理が止まってしまうように見えています。
renderの部分まで処理を進めるにはどのような書き方をすればよいのでしょうか。
教えて頂けますと嬉しいです。
655デフォルトの名無しさん
2017/07/11(火) 02:00:52.46ID:7uNv3Rqd sock.write(params.to_query)
rt = sock.readline
書き込んで、読み込む?
矛盾してないか?
読み書き両用なのか?
もし両用なら、相手からの返事を待っているのだろう
rt = sock.readline
書き込んで、読み込む?
矛盾してないか?
読み書き両用なのか?
もし両用なら、相手からの返事を待っているのだろう
656デフォルトの名無しさん
2017/07/11(火) 02:19:22.94ID:MbVhLJ6O レスありがとうございます。
やりたいこととしては、socket.writeでソケットにクエリを投げて
通信先で処理を行ってレスポンスが返ってくるので、
それを sock.readline で読み取るという双方向な感じのことです。
通信先のプロセスをkillするとなぜか処理が進んで、rtに正しいデータが格納され、
render まで処理が進むのですが・・アドバイスいただけると幸いです。
やりたいこととしては、socket.writeでソケットにクエリを投げて
通信先で処理を行ってレスポンスが返ってくるので、
それを sock.readline で読み取るという双方向な感じのことです。
通信先のプロセスをkillするとなぜか処理が進んで、rtに正しいデータが格納され、
render まで処理が進むのですが・・アドバイスいただけると幸いです。
657デフォルトの名無しさん
2017/07/11(火) 02:34:39.39ID:3Ue5zlRS >>656
flushしてみるとか?
flushしてみるとか?
658デフォルトの名無しさん
2017/07/11(火) 02:46:23.42ID:MbVhLJ6O レスありがとうございます。
すみません自己解決しました。
def index
s = UNIXSocket.new("/tmp/myapp.sock")
s.send(params.to_query, 20)
render text: s.recv(20)
end
こっちの方の書き方を試してみたところ、うまくいきました。(20は適当な数値)
何がどう違うのかよくわからないですが・・
すみません自己解決しました。
def index
s = UNIXSocket.new("/tmp/myapp.sock")
s.send(params.to_query, 20)
render text: s.recv(20)
end
こっちの方の書き方を試してみたところ、うまくいきました。(20は適当な数値)
何がどう違うのかよくわからないですが・・
659デフォルトの名無しさん
2017/07/11(火) 08:15:25.04ID:qelYWZQu660デフォルトの名無しさん
2017/07/11(火) 08:15:55.92ID:qelYWZQu 657の間違い
661デフォルトの名無しさん
2017/07/11(火) 19:44:38.95ID:3Ue5zlRS >>658
sendで使っている数値の20だけど、第二引数は flags になってる
mingw32(windows)だと (MSG_MAXIOVLEN | MSG_DONTROUTE)
linuxだと (MSG_PROBE | MSG_DONTROUTE)
FreeBSDだと (MSG_TRUNC | MSG_DONTROUTE)
を意味することになり、あなたの意図するところじゃないはず
recvの方は第一引数で最大20バイトの読み込みを意味するけど、
readlineは改行まで読み込むメソッドだから、振る舞い方に違いがある
一つの通信単位が任意長で、改行で終わらせたいなら
s.send(params.to_query, 20) を s.puts(params.to_query); s.flush
s.recv(20) を s.readline じゃだめかな?
もっとも params.to_query に改行が含まれているとうまく行かないけれど
sendで使っている数値の20だけど、第二引数は flags になってる
mingw32(windows)だと (MSG_MAXIOVLEN | MSG_DONTROUTE)
linuxだと (MSG_PROBE | MSG_DONTROUTE)
FreeBSDだと (MSG_TRUNC | MSG_DONTROUTE)
を意味することになり、あなたの意図するところじゃないはず
recvの方は第一引数で最大20バイトの読み込みを意味するけど、
readlineは改行まで読み込むメソッドだから、振る舞い方に違いがある
一つの通信単位が任意長で、改行で終わらせたいなら
s.send(params.to_query, 20) を s.puts(params.to_query); s.flush
s.recv(20) を s.readline じゃだめかな?
もっとも params.to_query に改行が含まれているとうまく行かないけれど
662デフォルトの名無しさん
2017/07/12(水) 06:30:11.01ID:HQm2gXhD バッファリングされているから、flush で出力するのか
663デフォルトの名無しさん
2017/07/12(水) 10:12:13.87ID:z1EDa6/Q664デフォルトの名無しさん
2017/07/13(木) 10:59:11.29ID:0lfkoIF4 エラーの時のスタックトレースがコンソールに大量のログが出るのを減らすことってできませんか?
665デフォルトの名無しさん
2017/07/13(木) 11:41:39.10ID:DhWBmBwc logger使え
666デフォルトの名無しさん
2017/07/13(木) 12:17:59.84ID:FtHnJB7n エラーなんだから仕方なかろうよ
もしプロダクションレベルであんまり内部パスとか詳らかにしたくないというのなら全体をrescueするしかないね
begin
# main_thread()
rescue RuntimeError => e
warn e.message
exit(1)
end
RuntimeErrorじゃないのだったら適当に増やしとけ
もしプロダクションレベルであんまり内部パスとか詳らかにしたくないというのなら全体をrescueするしかないね
begin
# main_thread()
rescue RuntimeError => e
warn e.message
exit(1)
end
RuntimeErrorじゃないのだったら適当に増やしとけ
667デフォルトの名無しさん
2017/07/13(木) 17:38:19.70ID:fH9gUBRZ ruby -W0 で起動して減らなかったらどうしようもない
そういう便利オプションみたいなのはないのですわ
そういう便利オプションみたいなのはないのですわ
668デフォルトの名無しさん
2017/07/14(金) 12:23:44.38ID:M2zlfEHR ○○課
○○課○○室
○○課○○係
○○課○○室○○係
○○課○○ライン
みたいな文字列を入れたときに
[○○課]
[○○課, ○○室]
[○○課, ○○係]
[○○課, ○○室, ○○係]
[○○課, ○○ライン]
みたいに分割してくれる関数を作りたいのですが上手くいきません
いい方法はないでしょうか
○○課○○室
○○課○○係
○○課○○室○○係
○○課○○ライン
みたいな文字列を入れたときに
[○○課]
[○○課, ○○室]
[○○課, ○○係]
[○○課, ○○室, ○○係]
[○○課, ○○ライン]
みたいに分割してくれる関数を作りたいのですが上手くいきません
いい方法はないでしょうか
669デフォルトの名無しさん
2017/07/14(金) 12:53:09.53ID:M2zlfEHR >>668
とても下手くそなやり方だと思いますが一応できました
def my_split(str)
arr = Array.new
str_arr = Array.new
arr.push 0
str.each_char.with_index do |ch, i|
arr.push i+1 if ch == "課".encode("windows-31j")
arr.push i+1 if ch == "室".encode("windows-31j")
arr.push i+1 if ch == "係".encode("windows-31j")
end
arr.each_with_index do |e, i|
str_arr.push str.slice(arr[i-1]..(arr[i]-1)) unless i == 0
end
str_arr
end
とても下手くそなやり方だと思いますが一応できました
def my_split(str)
arr = Array.new
str_arr = Array.new
arr.push 0
str.each_char.with_index do |ch, i|
arr.push i+1 if ch == "課".encode("windows-31j")
arr.push i+1 if ch == "室".encode("windows-31j")
arr.push i+1 if ch == "係".encode("windows-31j")
end
arr.each_with_index do |e, i|
str_arr.push str.slice(arr[i-1]..(arr[i]-1)) unless i == 0
end
str_arr
end
670デフォルトの名無しさん
2017/07/14(金) 14:04:05.91ID:Oez5CIDd >>668
def spj(s)
reg = Regexp.new("[課室係]|ライン")
a1=s.split(reg)
a2=s.scan(reg)
return a1.zip(a2).map{|x| x.join("")}
end
def spj(s)
reg = Regexp.new("[課室係]|ライン")
a1=s.split(reg)
a2=s.scan(reg)
return a1.zip(a2).map{|x| x.join("")}
end
671デフォルトの名無しさん
2017/07/14(金) 14:48:32.40ID:JyiCltLg672デフォルトの名無しさん
2017/07/14(金) 15:50:02.09ID:NNElhd0j そーか頭も含めりゃ確かにscanだけでいいのか。ボケてるな。
674デフォルトの名無しさん
2017/07/14(金) 23:19:58.67ID:nq2jK5zh675デフォルトの名無しさん
2017/07/15(土) 00:52:30.17ID:1BB6lano scanて文字切り出しに便利だよね
676デフォルトの名無しさん
2017/07/15(土) 16:03:05.98ID:5dwax4jd おまえらどう書くかより何を作るかに集中しろや
677デフォルトの名無しさん
2017/07/15(土) 16:06:46.01ID:leA2r81r >>676
エンジニアの三大美徳のひとつ、「傲慢」を否定しちゃいけません
エンジニアの三大美徳のひとつ、「傲慢」を否定しちゃいけません
678デフォルトの名無しさん
2017/07/15(土) 16:46:46.89ID:N0flRzpM 七大美徳も忘れるな
暴食、色欲、強欲、憤怒、怠惰、傲慢、嫉妬
暴食、色欲、強欲、憤怒、怠惰、傲慢、嫉妬
679デフォルトの名無しさん
2017/07/15(土) 19:43:02.39ID:37mK/jgH >>677
あとの二つもおねがい
あとの二つもおねがい
680デフォルトの名無しさん
2017/07/15(土) 21:43:00.98ID:leA2r81r >>679
怠惰、短気
怠惰、短気
681デフォルトの名無しさん
2017/07/15(土) 23:48:56.02ID:oxvwpB// >>676
それはこのスレで語ることではない
それはこのスレで語ることではない
682デフォルトの名無しさん
2017/07/15(土) 23:50:17.93ID:oxvwpB// >>679
遅刻、有休
遅刻、有休
683デフォルトの名無しさん
2017/07/16(日) 00:35:02.61ID:Ki8GsNb9 仮病で有休
684デフォルトの名無しさん
2017/07/16(日) 14:47:36.60ID:m8yy8euc 俺のパソコンは納期前によく壊れる
困ったものだ
困ったものだ
685デフォルトの名無しさん
2017/07/16(日) 18:59:56.18ID:yo5XpH/o 壊れてもバックアップ環境あるから
使いにくくなって効率下がるだけで他は変わらない
使いにくくなって効率下がるだけで他は変わらない
686デフォルトの名無しさん
2017/07/17(月) 11:01:21.40ID:cSztc20o 未だにgemって良く判らない。インタプリタなども含めて一式を配布するような場合は邪魔でしかない印象
687デフォルトの名無しさん
2017/07/17(月) 11:05:59.42ID:5WhJSLEy 外部のライブラリをスッ…とインスコできるやつ、色々作ってる側からすると便利、まああんまり好きじゃないけど
688デフォルトの名無しさん
2017/07/17(月) 11:14:05.33ID:fxU6unKK バージョン変わって依存関係めちゃくちゃなって
何か月とか何年かあとになって
再度同じ環境構成しようとしても
以下略
何か月とか何年かあとになって
再度同じ環境構成しようとしても
以下略
689デフォルトの名無しさん
2017/07/17(月) 11:38:02.62ID:PBO0/BLN690デフォルトの名無しさん
2017/07/17(月) 11:59:55.25ID:V9kDayPy >>686
>インタプリタなども含めて一式を配布するような場合
Rubyでそういうことをしてはいけない
スクリプト言語にとってのインタプリタバイナリはライブラリ選択前に既にインストールされているものなのだ
rubyがインストールされ(てい)ない環境でも実行して欲しいようなものをRubyで作っては「絶対に」いけない
>インタプリタなども含めて一式を配布するような場合
Rubyでそういうことをしてはいけない
スクリプト言語にとってのインタプリタバイナリはライブラリ選択前に既にインストールされているものなのだ
rubyがインストールされ(てい)ない環境でも実行して欲しいようなものをRubyで作っては「絶対に」いけない
691デフォルトの名無しさん
2017/07/17(月) 13:21:14.47ID:Uy8niamL vagrant, chef, SASS とかに、Ruby の実行環境も入れて、配布しているだろ?
692デフォルトの名無しさん
2017/07/17(月) 13:41:49.80ID:CuRtYSJT >>691
VagrantやChefはユーザーによるスクリプティングを可能にするためにRubyを入れてるんであって、
プロダクトをRubyで作っちゃったから仕方なくRubyを入れてるわけではないよ
一方SASSはRubyで作っちゃった例だけど、Rubyが嫌われてnodeへ移行した
VagrantやChefはユーザーによるスクリプティングを可能にするためにRubyを入れてるんであって、
プロダクトをRubyで作っちゃったから仕方なくRubyを入れてるわけではないよ
一方SASSはRubyで作っちゃった例だけど、Rubyが嫌われてnodeへ移行した
693デフォルトの名無しさん
2017/07/17(月) 14:20:06.37ID:H+ZLTTJY > Rubyが嫌われてnodeへ移行した
nodeには移行してない
Cに移行している
nodeには移行してない
Cに移行している
694デフォルトの名無しさん
2017/07/17(月) 16:57:19.47ID:shGqANuA そんな時のためのmrubyにはならないのか
695デフォルトの名無しさん
2017/07/17(月) 17:05:21.70ID:CuRtYSJT 残念ながらmrubyが獲るはずだったポジションはNodeに獲られちゃった
696デフォルトの名無しさん
2017/07/17(月) 18:22:28.87ID:cSztc20o697デフォルトの名無しさん
2017/07/18(火) 00:28:34.69ID:2jGZGtzj わかってると思うけど、Rubyのネガキャンやってるのがこのスレに粘着してる
こういうのは見付け次第叩いてやらないといけない
こういうのは見付け次第叩いてやらないといけない
698デフォルトの名無しさん
2017/07/18(火) 00:50:06.81ID:tovqy0R7 >>691みたいにヘタに突っついて論破されるのも準アンチ行為だから注意な
699デフォルトの名無しさん
2017/07/18(火) 07:19:41.41ID:soRF6X66 いまだにRuby万能説に縋りRuby万能を否定されると発狂する人が住んでるのか
それは10年も前に終わった言説だ
いつまで寝ているんだ目を覚ませ
それは10年も前に終わった言説だ
いつまで寝ているんだ目を覚ませ
700デフォルトの名無しさん
2017/07/18(火) 12:48:36.31ID:6DbTRi2A Ruby が最上流。
他の言語よりも、常に、2, 3年早い
Rails, vagrant, chef, SASS など
DSL では、Ruby, Groovy が優れているから、
最初にこれらの言語で作られてから、Python, JS へ移植される
Kotlin も注目されているけど、型を指定するのが面倒。
まあ、型を省略して、型推論もできるけど
他の言語よりも、常に、2, 3年早い
Rails, vagrant, chef, SASS など
DSL では、Ruby, Groovy が優れているから、
最初にこれらの言語で作られてから、Python, JS へ移植される
Kotlin も注目されているけど、型を指定するのが面倒。
まあ、型を省略して、型推論もできるけど
701デフォルトの名無しさん
2017/07/18(火) 16:13:18.86ID:bC2KM4MS rubyが最上流?
ワロス
そんな優れてるならphpもpythonも喰ってるよ。
しかも、落ち目だし。
ワロス
そんな優れてるならphpもpythonも喰ってるよ。
しかも、落ち目だし。
702デフォルトの名無しさん
2017/07/18(火) 16:18:08.82ID:bC2KM4MS しかも、型省略して型推論とか微妙な言い回ししてるあたり、分かってない臭がすごくてやばい
703デフォルトの名無しさん
2017/07/18(火) 17:14:45.02ID:PS9r5OZ5 >>702
C#のvarみたいなもののことなんじゃないの?
C#のvarみたいなもののことなんじゃないの?
704デフォルトの名無しさん
2017/07/18(火) 18:59:56.81ID:jUpeemmL Kotlinの型推論はただの典型的な型推論ですよ
それこそ「型指定が必要だけど型推論に任せることもできます→まあ便利」で済むレベル
わかってないのは間違いないのだろうけれど
それこそ「型指定が必要だけど型推論に任せることもできます→まあ便利」で済むレベル
わかってないのは間違いないのだろうけれど
705デフォルトの名無しさん
2017/07/19(水) 22:04:21.42ID:nwQCI0l5 たとえばArrayにメソッドfuncAを追加する時は
class Array
def funcA
return ["AAA"]
end
end
みたいに書けば出来ますがこれをCの拡張ライブラリにしたい場合ってどうすれば良いんでしょうか?
Cからメソッドの登録を行う場合は
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(), int argc)
を使用するようですが第一引数をどのように得ればいいのか判りません
class Array
def funcA
return ["AAA"]
end
end
みたいに書けば出来ますがこれをCの拡張ライブラリにしたい場合ってどうすれば良いんでしょうか?
Cからメソッドの登録を行う場合は
void rb_define_method(VALUE klass, const char *name, VALUE(*func)(), int argc)
を使用するようですが第一引数をどのように得ればいいのか判りません
706デフォルトの名無しさん
2017/07/19(水) 22:15:34.36ID:kPQDkgCo rb_define_method(rb_cArray, "funcA", hoge_func_a, 1);
static VALUE hoge_func_a(VALUE self, VALUE arg1) { }
static VALUE hoge_func_a(VALUE self, VALUE arg1) { }
707デフォルトの名無しさん
2017/07/19(水) 22:52:50.29ID:nwQCI0l5 え?"Array"というRubyの名前空間上の文字列?からklassを得る方法って無いの?
実際にメソッドを追加したいのは拡張ライブラリなんだけど、クラスやメソッドの登録は
関数内で行われていてklassが明示的に外部へ公開されているようには見えないのだが・・・
実際にメソッドを追加したいのは拡張ライブラリなんだけど、クラスやメソッドの登録は
関数内で行われていてklassが明示的に外部へ公開されているようには見えないのだが・・・
708デフォルトの名無しさん
2017/07/20(木) 01:14:47.75ID:pXT/1iWX >>707
組み込みクラスやモジュールに関してはグローバル変数として用意されている
ruby/ruby.hを見るべし
https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L1871
ちなみにこういう事もできる
#include <ruby/intern.h>
VALUE cDigestBase = rb_path2class("Digest::Base");
組み込みクラスやモジュールに関してはグローバル変数として用意されている
ruby/ruby.hを見るべし
https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L1871
ちなみにこういう事もできる
#include <ruby/intern.h>
VALUE cDigestBase = rb_path2class("Digest::Base");
709デフォルトの名無しさん
2017/07/20(木) 09:35:50.76ID:s/SNqpfK naoyaのはめ撮り動画アップされたね
710デフォルトの名無しさん
2017/07/20(木) 14:22:33.47ID:+aBWrhxZ 697の見え見えの釣り針にひっかかる粘着なんておらんやろ
って思ってたけど、見事に食い付いてるな
マジスゲー
って思ってたけど、見事に食い付いてるな
マジスゲー
711デフォルトの名無しさん
2017/07/20(木) 22:29:26.18ID:wsBNKQXr712デフォルトの名無しさん
2017/07/22(土) 14:27:06.95ID:GRw82bJl 拡張ライブラリをコンパイルする時に任意の場所にあるヘッダファイルやライブラリファイルを
探索させるようにするにはどのようにすればいいのでしょうか
探索させるようにするにはどのようにすればいいのでしょうか
713デフォルトの名無しさん
2017/07/22(土) 14:50:45.74ID:ZFWxmOeg それRuby全く関係ない
Cのコンパイラだけの問題
Cのコンパイラだけの問題
714デフォルトの名無しさん
2017/07/22(土) 14:59:47.85ID:6KQ6+UpV >>712
extconf.rb 内で have_header や have_library を使う
使い方は ruby に含まれる doc/extension.ja.rdoc を見よ
https://github.com/ruby/ruby/blob/trunk/doc/extension.ja.rdoc#appendix-c-extconfrb%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%9F%E3%81%A1
extconf.rb 内で have_header や have_library を使う
使い方は ruby に含まれる doc/extension.ja.rdoc を見よ
https://github.com/ruby/ruby/blob/trunk/doc/extension.ja.rdoc#appendix-c-extconfrb%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%9F%E3%81%A1
715デフォルトの名無しさん
2017/07/22(土) 15:46:06.83ID:GRw82bJl716デフォルトの名無しさん
2017/07/22(土) 15:56:18.40ID:GRw82bJl あ、自己解決。dir_configを使えば良かったのか
dir_config("myproject")
とか書いて
ruby extconf.rb --with-myproject-include=C:\foo
とかするとそのディレクトリを探索対象に加えてくれるみたいです
dir_config("myproject")
とか書いて
ruby extconf.rb --with-myproject-include=C:\foo
とかするとそのディレクトリを探索対象に加えてくれるみたいです
717デフォルトの名無しさん
2017/07/22(土) 16:07:27.55ID:LM/qA1ao mkmf.rbでdir_config("opt")してくれてるので、--with-opt-includeならはじめから使える
718デフォルトの名無しさん
2017/07/22(土) 20:13:36.13ID:6KQ6+UpV719デフォルトの名無しさん
2017/07/23(日) 03:04:04.86ID:nJm1oPvD IDE には、ライブラリパスの参照という、ボタンがあるはず
720デフォルトの名無しさん
2017/07/23(日) 08:53:05.99ID:1hI9T8Bk ひとまず形にはなった。ALLOC_Nの開放の仕方が判らないのでALLOCA_Nにした
ALLOC〜って初期化してくれないんだな。ゴミが混じってメモリ破壊の
バグがあるのかとしばらく悩んだ。でもCはど素人だしなんかありそう
>>718
コマンドラインの方が容易に変更できるのでdir_configで行こうと思います
ALLOC〜って初期化してくれないんだな。ゴミが混じってメモリ破壊の
バグがあるのかとしばらく悩んだ。でもCはど素人だしなんかありそう
>>718
コマンドラインの方が容易に変更できるのでdir_configで行こうと思います
721デフォルトの名無しさん
2017/07/23(日) 10:43:01.15ID:FBMkfY4k >>720
ruby/ruby.hを大文字のALLOCで文字列検索してみ
RB_ZALLOCとかRB_ZALLOC_Nとかが0で初期化してくれる
あと確保したこれらはxfree(void*)で解放してね
ruby/ruby.hを大文字のALLOCで文字列検索してみ
RB_ZALLOCとかRB_ZALLOC_Nとかが0で初期化してくれる
あと確保したこれらはxfree(void*)で解放してね
722デフォルトの名無しさん
2017/07/23(日) 21:56:04.93ID:1hI9T8Bk >>721
ありがとう。ZALLOC_N&xfreeにしてみました
ALLOCA_Nってruby/ruby.hをみたらallocaを呼んでいるだけじゃないかw
拡張ライブラリ内部における動的なメモリの確保ってどうするのが好ましいんだろうな
スタックに積む方法はメモリのリークはないけどスタックを圧迫する(.今の環境だったら気にするほどでもない?)
allocして後にfreeする方法だと意図せず途中で抜けた時にメモリがリークする
Rubyの文字列を作ってそれを利用すると言う方法を紹介しているblogもあったけど・・・う〜む・・・
ありがとう。ZALLOC_N&xfreeにしてみました
ALLOCA_Nってruby/ruby.hをみたらallocaを呼んでいるだけじゃないかw
拡張ライブラリ内部における動的なメモリの確保ってどうするのが好ましいんだろうな
スタックに積む方法はメモリのリークはないけどスタックを圧迫する(.今の環境だったら気にするほどでもない?)
allocして後にfreeする方法だと意図せず途中で抜けた時にメモリがリークする
Rubyの文字列を作ってそれを利用すると言う方法を紹介しているblogもあったけど・・・う〜む・・・
723デフォルトの名無しさん
2017/07/23(日) 23:04:03.89ID:FBMkfY4k >>722
俺も外部の人間だから本当に適切な方法なんて知らないけど……
VALUE bufvalue;
size_t bufsize = 1024;
void *ptr = RB_ALLOCV(bufvalue, bufsize);
任意の処理を行う
ここで例外が発生しても次のGCで勝手に開放される
bufvalueはrubyの世界へと出さないように気をつける
/* メモリの即時開放(freeされる) */
RB_ALLOCV_END(bufvalue);
VALUE bufstr = rb_str_buf_new(bufsize);
void *ptr = RSTRING_PTR(bufstr);
任意の処理を行う
rubyの世界に出しても問題なし
ただし出したあとで再び使う場合は必ず
rb_str_modify(bufstr); /* freezeされたらaboneするけどな */
ptr = RSTRING_PTR(bufstr);
をやり直す
/* メモリの開放(即時開放されるかは実装任せ) */
rb_str_resize(bufstr, 0);
こんな感じかな
俺も外部の人間だから本当に適切な方法なんて知らないけど……
VALUE bufvalue;
size_t bufsize = 1024;
void *ptr = RB_ALLOCV(bufvalue, bufsize);
任意の処理を行う
ここで例外が発生しても次のGCで勝手に開放される
bufvalueはrubyの世界へと出さないように気をつける
/* メモリの即時開放(freeされる) */
RB_ALLOCV_END(bufvalue);
VALUE bufstr = rb_str_buf_new(bufsize);
void *ptr = RSTRING_PTR(bufstr);
任意の処理を行う
rubyの世界に出しても問題なし
ただし出したあとで再び使う場合は必ず
rb_str_modify(bufstr); /* freezeされたらaboneするけどな */
ptr = RSTRING_PTR(bufstr);
をやり直す
/* メモリの開放(即時開放されるかは実装任せ) */
rb_str_resize(bufstr, 0);
こんな感じかな
724デフォルトの名無しさん
2017/07/24(月) 00:44:09.77ID:7DZLuR6j 今気がついたのだが・・・
自作メソッドの入力値が不適切→rb_raiseを叩く→Segmentation fault
rb_raiseの引数に動的な物は含まれていないし、未解放のメモリがあるわけでもないしどうなっているんだ
例外を発生させる時の作法とかあるのだろうか
しかも2個作ったメソッドの片方だけこの現象が起きる。処理内容に問題があるわけではないけど
これを放置するのはマズイよな
>>723
ありがとう。参考になります
自作メソッドの入力値が不適切→rb_raiseを叩く→Segmentation fault
rb_raiseの引数に動的な物は含まれていないし、未解放のメモリがあるわけでもないしどうなっているんだ
例外を発生させる時の作法とかあるのだろうか
しかも2個作ったメソッドの片方だけこの現象が起きる。処理内容に問題があるわけではないけど
これを放置するのはマズイよな
>>723
ありがとう。参考になります
725デフォルトの名無しさん
2017/07/24(月) 05:46:45.69ID:q6ge4pC6 メモリスタック確認するのが一番じゃね?適当だけど
726デフォルトの名無しさん
2017/07/24(月) 08:11:09.42ID:rFx+DNZY なるほど・・・ってVC++環境でコアダンプってどうやって取れば良いんだろ
ググるとWindows Error Reportがトラップしている時にタスクマネージャからダンプさせる
とか出てくるけどトラップされている訳じゃないのでこの方法は使えないし・・・
それともどこかにダンプが保存されているんだろうか
ググるとWindows Error Reportがトラップしている時にタスクマネージャからダンプさせる
とか出てくるけどトラップされている訳じゃないのでこの方法は使えないし・・・
それともどこかにダンプが保存されているんだろうか
727デフォルトの名無しさん
2017/07/24(月) 12:01:57.41ID:YHai+DFK プロセスにアタッチしてブレイクしたら。
728デフォルトの名無しさん
2017/07/24(月) 19:26:11.30ID:R/9Imr1c 困った時のprintfデバッグ
729デフォルトの名無しさん
2017/07/26(水) 14:44:00.57ID:P+h1MRRW 【Unity】ソートアルゴリズム12種を可視化してみた - Qiita
http://qiita.com/r-ngtm/items/f4fa55c77459f63a5228
http://qiita.com/r-ngtm/items/f4fa55c77459f63a5228
730デフォルトの名無しさん
2017/07/27(木) 10:11:51.47ID:FeDFxsXm ソフトウェアデザインがインターフェースの記事を丸々パクって問題になったことがあったな
731デフォルトの名無しさん
2017/07/29(土) 18:02:23.06ID:Xgmp5DuD VisualC++でビルドすると--disable-debug-envを付けてもデバッグビルドになってしまうように見えるけど気のせいかな・・・
インストールされるサイズが--enable-debug-envと比べてちっとも変わらない
生成したMakefileにデバッグ関係のオプションを削ったCFLAGSとLDFLAGSを書き込んだらインストールサイズが大分小さくなった
インストールされるサイズが--enable-debug-envと比べてちっとも変わらない
生成したMakefileにデバッグ関係のオプションを削ったCFLAGSとLDFLAGSを書き込んだらインストールサイズが大分小さくなった
732724
2017/07/31(月) 01:44:48.62ID:0NH1HYUL ようやく原因がわかった
rb_scan_argsの第3引数が"22"と不適切な値にしていたことが原因だった。適切な"2"にしたら問題なくなった
複数のスレッドが動いているため?か例外を起こす場所が一定になるわけではない模様
rb_pでデバッグしていくと>>724の位置で例外が起きる(rb_raiseの第一引数がぶっ壊れていると
思われる)んだけど、デバッガで追いかけるとrb_scan_args内部で例外が起きる
rb_scan_argsの第3引数が"22"と不適切な値にしていたことが原因だった。適切な"2"にしたら問題なくなった
複数のスレッドが動いているため?か例外を起こす場所が一定になるわけではない模様
rb_pでデバッグしていくと>>724の位置で例外が起きる(rb_raiseの第一引数がぶっ壊れていると
思われる)んだけど、デバッガで追いかけるとrb_scan_args内部で例外が起きる
733デフォルトの名無しさん
2017/07/31(月) 02:05:04.23ID:9Hgupd7z 要約すると
Ruby ⇔ C と行き来するのはえらく面倒だ
ってことだな
これなら、Rubyを使うことそのものが目的じゃないのならだが
初めから Java、C#、C++ などを使ったほうが良かったってこったな
Ruby ⇔ C と行き来するのはえらく面倒だ
ってことだな
これなら、Rubyを使うことそのものが目的じゃないのならだが
初めから Java、C#、C++ などを使ったほうが良かったってこったな
734デフォルトの名無しさん
2017/07/31(月) 07:03:37.88ID:VY/jm5nF というか今時はRPCやメッセージキューを使って完全に分離してしまえばいい
WindowsでRubyの時点でどのみち実用性のないオナニーなんだから好きにすればいいけど
WindowsでRubyの時点でどのみち実用性のないオナニーなんだから好きにすればいいけど
735724
2017/07/31(月) 08:10:27.67ID:S3S/4XWd 引数を間違えると警告もなくメモリをぶっ壊す関数って絶対にこれだけじゃないよね・・・
今回の件で困ったことまとめ
・VC++のコマンドラインからビルドした物をデバッグする例が全然見つからない
VC++のIDEで開発したプロジェクトやgcc&makeで開発した物をgdbでデバッグする例なら沢山出てくるんだけどな
・CLIアプリケーションのためかデバッガから起動させるとgem関係のファイルがないとRubyが例外を吐いて動かない
requireの後に$<.getsを書いてコマンドプロンプトから起動。デバッガからアタッチしてブレークポイントをセット後に
Enterを入れて実行を再開。ただし100%上手くいくわけではない模様。無限ループ?にはまる時もある
エントリーポイントで止めて環境変数やカレントディレクトリを適切に設定した後に再開すれば動くのかな?
やり方が判らないけど
・RubyがSegmentation faultをトラップしてしまうためにメモリダンプを取れない?
signal.cやwin32.cでそれっぽそうなところを書き換えてみたけどトラップを止めさせることは出来なかった
どこを弄ればいいのだろうか・・・
C/C++は不慣れなので変なことを書いていたらスマン
今回の件で困ったことまとめ
・VC++のコマンドラインからビルドした物をデバッグする例が全然見つからない
VC++のIDEで開発したプロジェクトやgcc&makeで開発した物をgdbでデバッグする例なら沢山出てくるんだけどな
・CLIアプリケーションのためかデバッガから起動させるとgem関係のファイルがないとRubyが例外を吐いて動かない
requireの後に$<.getsを書いてコマンドプロンプトから起動。デバッガからアタッチしてブレークポイントをセット後に
Enterを入れて実行を再開。ただし100%上手くいくわけではない模様。無限ループ?にはまる時もある
エントリーポイントで止めて環境変数やカレントディレクトリを適切に設定した後に再開すれば動くのかな?
やり方が判らないけど
・RubyがSegmentation faultをトラップしてしまうためにメモリダンプを取れない?
signal.cやwin32.cでそれっぽそうなところを書き換えてみたけどトラップを止めさせることは出来なかった
どこを弄ればいいのだろうか・・・
C/C++は不慣れなので変なことを書いていたらスマン
736デフォルトの名無しさん
2017/07/31(月) 15:59:11.85ID:2wHF06gt ファイル名以外でファイルを識別するにはどうしたらいいんだ?
ファイル名変更したとしてもファイル名変更前とファイル名変更後のファイルを同じものとしてみたい
ファイルクラスのドキュメント見てみたけとそれらしいのはなかった
ファイル名変更したとしてもファイル名変更前とファイル名変更後のファイルを同じものとしてみたい
ファイルクラスのドキュメント見てみたけとそれらしいのはなかった
737デフォルトの名無しさん
2017/07/31(月) 16:30:54.00ID:PivEBbdv 何を以て同じファイルとみなすかに依る
単に内容だけ比較するなら FileUtils.#cmp を使うと良いよ
https://docs.ruby-lang.org/ja/latest/method/FileUtils/m/cmp.html
単に内容だけ比較するなら FileUtils.#cmp を使うと良いよ
https://docs.ruby-lang.org/ja/latest/method/FileUtils/m/cmp.html
738デフォルトの名無しさん
2017/07/31(月) 23:41:34.38ID:X3kyqB8s739デフォルトの名無しさん
2017/08/01(火) 01:21:43.84ID:eJYTTdCf >>737
こんな便利なメソッドがあったのか
でも変更前のファイルが残ってるやけじゃないからここでは使えないかな…
>>738
https://docs.ruby-lang.org/ja/latest/class/File=3a=3aStat.html
LINUXだからこの辺使ってinodeで判別できそう!ありがとう!
こんな便利なメソッドがあったのか
でも変更前のファイルが残ってるやけじゃないからここでは使えないかな…
>>738
https://docs.ruby-lang.org/ja/latest/class/File=3a=3aStat.html
LINUXだからこの辺使ってinodeで判別できそう!ありがとう!
740デフォルトの名無しさん
2017/08/01(火) 08:33:14.08ID:YiDwID17 >>739
そういう用途なら、ハードリンクに注意。
そういう用途なら、ハードリンクに注意。
741デフォルトの名無しさん
2017/08/01(火) 11:24:21.35ID:QsBohnup inodeは再利用されるからいつかギョッとするときが来ると思う
https://ideone.com/zPXgqb
https://ideone.com/zPXgqb
742デフォルトの名無しさん
2017/08/01(火) 16:59:50.09ID:T1EbqLjy いまどきのファイルシステムなら拡張属性つかえんじゃない?
索引つくれないと面倒だけど中身比較するよかまし
索引つくれないと面倒だけど中身比較するよかまし
743デフォルトの名無しさん
2017/08/01(火) 19:11:35.76ID:ggiqqoER744デフォルトの名無しさん
2017/08/01(火) 19:40:15.57ID:PARHYe6N まあ「inode見ればファイル名変更にも追従できる!」なんてやらなきゃいけない時点でなにかがとてつもなくおかしいわな
gitみたいなかんたんファイル変更検知機能付きアプリケーションを見てみると絶望できるかもしれないね
gitみたいなかんたんファイル変更検知機能付きアプリケーションを見てみると絶望できるかもしれないね
745デフォルトの名無しさん
2017/08/02(水) 13:55:20.56ID:5on7mlkV rubyでcoincheck apiを使ってみたいんだけど、いまドットインストールを見終わって、たのしいRubyを見終わったんだけど、opensllとかuriとかnet/httpとかの使い方はどうやったら分かるようになるのかな
746デフォルトの名無しさん
2017/08/02(水) 20:17:50.89ID:Y8o6EGzu それくらいはマニュアル見ろよ
ということでマニュアルの読み方の勉強が必要
ただ、それらのライブラリはプロトコルをちっとも隠蔽してくれてないのでOpenSSLやURIやHTTPの基礎知識は必須だぞ
普通なら使いたいapi試しながら勉強しろと言うんだが絶妙にトライアルアンドエラーのしにくい分野のapiなのが辛いな
ということでマニュアルの読み方の勉強が必要
ただ、それらのライブラリはプロトコルをちっとも隠蔽してくれてないのでOpenSSLやURIやHTTPの基礎知識は必須だぞ
普通なら使いたいapi試しながら勉強しろと言うんだが絶妙にトライアルアンドエラーのしにくい分野のapiなのが辛いな
747デフォルトの名無しさん
2017/08/03(木) 19:35:54.85ID:Yq3e1WJ9 Ruby並みに生産性が高く、C並みに高速で何でも作れる言語があったら神
748デフォルトの名無しさん
2017/08/03(木) 19:55:35.10ID:eWbe8h/f KotlinあたりにRubyっぽいライブラリがあれば案外簡単に実現できそう
749デフォルトの名無しさん
2017/08/03(木) 19:59:35.69ID:Yq3e1WJ9 Javaがないと動かない時点で全然C並みじゃない
750デフォルトの名無しさん
2017/08/03(木) 21:17:20.06ID:Wy5AX0em >Ruby並みに生産性が高く、C並みに高速で何でも作れる言語
じゃーC++だね
生産性はJavaやC#には負けるかもしれないが
静的型言語だから少なくともRubyより生産性あるしな
じゃーC++だね
生産性はJavaやC#には負けるかもしれないが
静的型言語だから少なくともRubyより生産性あるしな
751デフォルトの名無しさん
2017/08/03(木) 21:59:48.18ID:yhj86Quo■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★4 [BFU★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★5 [Hitzeschleier★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 【速報】テレビ朝日本社から20代〜30代の男性が飛び降り自殺して死亡 東京・六本木 [597533159]
- お前らダウナー系だよな
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ182
- 精液がゼリー状で黄ばんでるせいで女と付き合う勇気ない
- 女はSNSで乳揺らして踊ってりゃラクにカモ集まるから羨ましい
- 【高市速報】中国、最後通牒 [308389511]
