Ruby 初心者スレッド Part 49
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/05/09(水) 05:04:47.69質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ
前スレ
Ruby 初心者スレッド Part 48
http://toro.2ch.net/test/read.cgi/tech/1328648447/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
0175デフォルトの名無しさん
2012/05/19(土) 10:57:12.96http://d.hatena.ne.jp/bellbind/20070611/1181561807
を見つけたので、自分とこで確認してみたら
x86_64-linux 1.9.3 (2011-10-30)
#<SystemStackError: stack level too deep>
recursive size: 8734
となった。
0176デフォルトの名無しさん
2012/05/19(土) 13:17:43.42では、9356段までだった
ttp://ideone.com/6ntPo
0177デフォルトの名無しさん
2012/05/19(土) 13:59:39.60i386-mingw32 1.9.3 (2012-04-20)
#<SystemStackError: stack level too deep>
recursive size: 8734
0178デフォルトの名無しさん
2012/05/19(土) 15:01:50.17ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] だと
def mes(i)
puts i
mes i+1
end
mes 0
が、8731まで表示して stack level too deep (SystemStackError) で落ちた
Python 2.7.1だと
def mes(i):
print(i)
mes(i+1)
mes(0)
998まで表示してRuntimeError: maximum recursion depth exceeded で落ちた
Perl 5.12.1だと
sub mes{
my $i = shift;
print $i,"\n";
mes($i+1);
};
mes(0);
3722238まで表示してOut of memory!で止まった
どんどんとメモリを消費していって最終的に1.2Gほど使ってた
0179デフォルトの名無しさん
2012/05/19(土) 15:04:04.80function mes(i)
print(i)
mes(i+1)
end
mes(0)
16378まで表示してstack overflowで落ちた
Gauche 0.9.2だと
Schemeはあいかわらずよくわからんので、Webをみながらてきとうに書いてみるのですが
(define (mes i)
(print i)
(mes (+ i 1)))
(mes 0)
止まる気配がなかった
末尾最適化が利いているのでしょう
0180デフォルトの名無しさん
2012/05/19(土) 15:07:18.10ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] で
RubyVM::InstructionSequence.compile_option = {tailcall_optimization: true, trace_instruction: false}
eval <<'EOS'
def mes(i) puts i;mes(i+1) end
mes 0
EOS
止まる気配がない
たぶん末尾最適化が利いて無限ループしてるはず
デフォルトで末尾再帰最適化が有効になってないのは何がまずいのだろう?
0181デフォルトの名無しさん
2012/05/19(土) 16:42:16.400182デフォルトの名無しさん
2012/05/19(土) 17:21:35.07「ifとgotoさえあればなんでも書ける」ってのと同じで、意味のない言明だよ。
0183uy
2012/05/19(土) 17:30:34.59今のPCスペックと人間スペックでかけるかどうかが問題
0184デフォルトの名無しさん
2012/05/19(土) 17:39:27.23こんなことが出来たのか
勉強になるなぁ。
ありがとう!
0185デフォルトの名無しさん
2012/05/19(土) 18:22:00.980186デフォルトの名無しさん
2012/05/19(土) 18:30:54.54スタックが溢れたりしないこと。
0187デフォルトの名無しさん
2012/05/19(土) 18:33:11.01それは末尾再帰最適化が仕様に含まれているので
末尾再帰がループと同等に扱えるって話じゃ
(Pythonは使ってないもので)
再帰の回数に制限がかかってたのを思い出した
Python 2.7.1にて
import sys
sys.setrecursionlimit(100000)
def mes(i):
print(i)
mes(i+1)
mes(0)
9663まで表示してMemoryError: stack overflow で落ちた
負けた……
0188デフォルトの名無しさん
2012/05/19(土) 18:33:44.33再帰を末尾再帰に変換する義務はない、ということか。
0189デフォルトの名無しさん
2012/05/20(日) 00:44:44.64勝手に環境フレーム相当のものをヒープに用意したりしない限りは
無理じゃないのと思うんだが
0190デフォルトの名無しさん
2012/05/20(日) 09:07:27.53動的に生成された再帰コードを末尾再帰に変換しようぜとか今の人間の技術じゃない
0191デフォルトの名無しさん
2012/05/20(日) 09:41:23.21上のスクリプト試すとどうなるかやってみて
(うちのLinux/Ruby1.9では効果なし)
0192デフォルトの名無しさん
2012/05/20(日) 09:48:12.89話はそれからだ。
0193デフォルトの名無しさん
2012/05/20(日) 09:54:39.24うちでも1.9.3では効果なかった。
でも1.8.7では、
スタックサイズ 8192 で 4101
スタックサイズ 16384 で 8794
スタックサイズ 32768 で 18152
と効果が見られた。
0194デフォルトの名無しさん
2012/05/20(日) 10:06:02.950195デフォルトの名無しさん
2012/05/20(日) 10:24:25.61どれも右クリックでメニューを出すものは見つかるのですが自動的にメニューを表示させるサンプルが見つかりませんでした
0196デフォルトの名無しさん
2012/05/20(日) 12:57:00.58元のTkでそのようにする方法を調べて、それをRuby/Tk上で書く
0197デフォルトの名無しさん
2012/05/20(日) 14:05:27.200198デフォルトの名無しさん
2012/05/20(日) 14:44:06.840199デフォルトの名無しさん
2012/05/20(日) 18:14:01.720200デフォルトの名無しさん
2012/05/20(日) 20:13:13.870201デフォルトの名無しさん
2012/05/20(日) 22:52:03.08コマンドプロンプトから
ruby -v
ってやるとパスが通っているのかバージョンがちゃんと表示されます
ただし、batファイルに
ruby -v
と書いて実行すると
>'ruby' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってエラーになります
これはなぜですか?
0202デフォルトの名無しさん
2012/05/20(日) 22:58:17.17そのコマンドプロンプトは偽物だ
ruby consoleはあらかじめパスを通したコマンドプロンプトのウィンドウを出す
普通のバッチファイルでruby.exeを使いたいなら、そのruby.exeを実行したい人の環境変数でパス通せ
0203デフォルトの名無しさん
2012/05/20(日) 23:01:47.25システムにrubyのbinフォルダを登録しなくちゃいけないってことでしょうか?
0204デフォルトの名無しさん
2012/05/20(日) 23:19:27.62だいたいそんなところ
詳しくは「パスを通す」でググれ
Vista以降でシステム環境変数でなくユーザ環境変数に登録したいなら
コントロールパネル開いて右上の検索ボックスに「環境変数」と入力
0205デフォルトの名無しさん
2012/05/20(日) 23:20:02.98これしか言いようが無い
わからんかったらお前向いてない
0206デフォルトの名無しさん
2012/05/20(日) 23:22:00.01exeでインストールすると勝手に環境変数も入れてくれると思ってたんですが
exeでインストールするメリットってzipと比較してないと考えていいんでしょうか
0207デフォルトの名無しさん
2012/05/20(日) 23:29:29.00環境が変なんじゃね
0208デフォルトの名無しさん
2012/05/20(日) 23:39:39.35ふつうRedmine RSpec Jenkinsな感じ。
0209デフォルトの名無しさん
2012/05/20(日) 23:40:54.390210デフォルトの名無しさん
2012/05/21(月) 00:26:44.53メニューだけ表示してなんかして終了するの?
require 'tk'
menu1 = Tk::Menu.new tearoff:false do
add :command, {label:'Ok',command:->{puts 'menu Ok';exit}}
end
Tk::Wm.withdraw Tk.root
Tk.after 100,->{menu1.popup TkWinfo.pointerx(Tk.root), TkWinfo.pointery(Tk.root);exit}
Tk.mainloop
こんなのだろうか?
正しいのかわからんけど
0211デフォルトの名無しさん
2012/05/21(月) 10:00:41.76Rubyそのもので、記述されていないのでしょうか?
0212デフォルトの名無しさん
2012/05/21(月) 10:16:10.82コンパイラじゃないから
0213uy
2012/05/21(月) 10:23:16.94開発効率は Ruby>>JAVA>>>>C言語>>>>>>>>>>>>>アセンブラ
です。
なるべく実行速度の速い言語で、言語処理系をつくりたいんです
あと、Rubyは動的言語っていうものなのでRubyそのもので記述しようとするなら
eval ""
で終わり
0214デフォルトの名無しさん
2012/05/21(月) 10:35:09.80ありがとうございます。
インタプリタ言語では、プログラミング言語は、記述
0215デフォルトの名無しさん
2012/05/21(月) 10:38:26.77つづき、記述ができても、処理系に向いていないということで、将来、処理速度
が向上したら、できる可能性もあるのでしょうか。
0216デフォルトの名無しさん
2012/05/21(月) 10:44:34.70Cプログラムで動作しているOSと遣り取りする部分のプログラムをCで書かない理由ってなに?
0217デフォルトの名無しさん
2012/05/21(月) 10:47:01.95その後、宗教論争などを見て、反省もしましたが、疑問はつきませんでした。
0218デフォルトの名無しさん
2012/05/21(月) 10:49:40.45ですから、
インラインアセンブラの話が、C言語では、この話に近いと思われます。
正直、わかりません。言い訳になりますが、説明をあまり見かけないのです。
0219デフォルトの名無しさん
2012/05/21(月) 11:12:11.61もしRubyインタプリタをRubyでコーディングするとしたら
そのRubyコードを実行するRubyインタプリタは何で書くの?Rubyで書きたい?
0220デフォルトの名無しさん
2012/05/21(月) 11:28:12.750221デフォルトの名無しさん
2012/05/21(月) 11:30:44.42理想からすると、
Rubyの方が、コードを読みやすいはずです。
文系では、他の分野で、読まなければならない本が、やたら多いので、
入り方が、重要なのです。
0222デフォルトの名無しさん
2012/05/21(月) 11:31:32.960223デフォルトの名無しさん
2012/05/21(月) 11:33:21.470224デフォルトの名無しさん
2012/05/21(月) 11:37:28.69私も文系です。釣りならお帰りください
そうでないならブートストラップ問題でぐぐって熟読したうえで他で聞いてください
それかPythonにはPythonで実装されたPyPyって処理系があるのでそっちに行ってくれてもいいです
0225デフォルトの名無しさん
2012/05/21(月) 11:38:57.26つまり、アセンブラを学ぶのと、Rubyを学ぶのでは、どの道、C言語拡張まで
想定してRubyを学び、開発者を目指すなら、アセンブラ回帰が必須になり、
技術の修得スピードと翻訳、文献の量の問題が、大きいですね。
開発スピードの矛盾を発見したわけです。これは、おかしい。
0226デフォルトの名無しさん
2012/05/21(月) 11:40:31.87Pythonびいきではないし、アンチではないですよ。
0227デフォルトの名無しさん
2012/05/21(月) 11:42:06.13if〜endの「end」を入力するのが苦痛です
何故endを書かないといけない仕様なんですか
if〜eでいいじゃないですか
0228デフォルトの名無しさん
2012/05/21(月) 11:43:02.24クロスプラットフォームで動く動的言語なのにこれは致命的です
0229デフォルトの名無しさん
2012/05/21(月) 11:53:12.58実際問題、おそらくは、Rubyから入門するというケースが、外されてしまうのは
損失ですね。将来的には、Ruby ですべて、こなせるという目的は、ないと思われ
てしまう。
0230デフォルトの名無しさん
2012/05/21(月) 12:10:13.150231デフォルトの名無しさん
2012/05/21(月) 12:13:12.15ラインの質問ですまなかった。
掲載しろとは言わないが、Rubyの入門書に期待したい。
RHGを読むときの理解度にも関わるので、ちょっと聞いてみたんだ。
すまない。
0232デフォルトの名無しさん
2012/05/21(月) 12:17:07.520233デフォルトの名無しさん
2012/05/21(月) 12:31:35.79Ruby開発者は、開発時間の比率からするとRubyでなくて、
C言語、JAVA言語をやってるんですね。
これを、言わせない説明方法を、教えてください。
0234デフォルトの名無しさん
2012/05/21(月) 12:34:14.99初心者向けではないかもしれないけど
0235デフォルトの名無しさん
2012/05/21(月) 12:44:26.74がてんがいったので、
しばし、勉強して、後日きます。
0236デフォルトの名無しさん
2012/05/21(月) 12:47:00.30>Ruby開発者は、開発時間の比率からするとRubyでなくて、
>C言語、JAVA言語をやってるんですね。
これ自体は別に不思議なことでも、悪いことでもない
CRuby開発陣はCプログラマばっかりだと言われることがあるのと同様
JVMを書いている開発者だって恐らくC系言語を使っているだろう
もちろん、言語処理系上のライブラリ開発者であれば
Pure Rubyで記述している場合もあるだろう
0237デフォルトの名無しさん
2012/05/21(月) 12:49:44.84重ねて感謝、ありがとうございました。助かります。
0238デフォルトの名無しさん
2012/05/21(月) 14:52:40.660239デフォルトの名無しさん
2012/05/21(月) 15:03:02.70取得した内容をメモ帳に貼り付けるのかどっちだい?
両方できるが
0240デフォルトの名無しさん
2012/05/21(月) 15:04:17.89Rubyをやる場合に基礎が身につく入門書ってありませんか?
10日で覚える系のは論外です
0241デフォルトの名無しさん
2012/05/21(月) 15:04:30.20前者です!
0242デフォルトの名無しさん
2012/05/21(月) 15:06:29.97open("http://www.defense.gov/"){|f| $s = f.read}
open("test.html", "w"){|f| f.write($s)}
`start notepad.exe test.html`
0243デフォルトの名無しさん
2012/05/21(月) 15:11:05.710244デフォルトの名無しさん
2012/05/21(月) 16:12:10.790245デフォルトの名無しさん
2012/05/21(月) 17:15:56.52うまくいきません\(^o^)/
ttp://www.ruby-lang.org/ja/documentation/
にアクセスしてメモ帳に
ここでは、マニュアルなどのドキュメントを紹介します。…
を出力したいのです
1.8.7です
0246238
2012/05/21(月) 17:38:00.86ここから<p>とか<div>をとる方法を模索中です
require 'rubygems'
require 'mechanize'
require 'kconv'
require 'open-uri'
agent = Mechanize.new
agent.get('http://www.ruby-lang.org/ja/documentation/')
p = agent.page.at('p')
`start notepad.exe p`
0247デフォルトの名無しさん
2012/05/22(火) 06:24:09.67シェルスクリプトなんてルビーで置き換えられるじゃないと思って¥、シェルの代わりにルビーを指定したらログイン不能になったわw
過去のトラウマ。
あうあうあー。
ウィンドウズでサーバ自体とんでもなく手間が掛かる。
教祖様と同様にatt unixがいいね。デビアンは使いにくいけど。
0248デフォルトの名無しさん
2012/05/22(火) 07:10:52.57>文系なので、解らないのですが、なぜ、Rubyは、JavaやC言語で、記述されていて
>Rubyそのもので、記述されていないのでしょうか?
いい質問です。独力でそこに気づいたのなら、文系とはいえかなりのセンスの持ち主です。
すでに234が書いてますが、Rubiniusという処理系が、まさにRubyそのもので記述されたRuby処理系です。
本家RubyはCで書かれた処理系、JRubyはJavaで書かれた処理系、RubiniusはRubyで書かれた処理系、といえます。
とはいえRubiniusが100%Rubyで書かれているかというと、そういうわけではなく、RubyのサブセットをC++とLLVMで作り、
そのサブセットでフル仕様のRubyを記述しています。つまり2段構え。
このような仕組みだと遅いように思うでしょうが、RubiniusはJITを搭載しているので、最初の読み込みこそ遅いものの、そのあとは本家Rubyよりも速いです。
このような仕組みはSmalltalkが確立した方法で、昔から有名です。PythonだとPyPyという処理系が同じ仕組みです。
なお初心者相手だと>>213や>>219みたいなゴミが湧き出ますが気にしないでください。ごめんねあんなやつらを相手にさせて。
0249デフォルトの名無しさん
2012/05/22(火) 08:23:49.17まだjavaもrubyもpyもsmalltalkもosを作り出せてない。
0250デフォルトの名無しさん
2012/05/22(火) 09:00:17.00たまにはAPLマシン、LISPマシン、Smalltalkマシン、Prologマシンのことも
思い出してあげてください。
0251デフォルトの名無しさん
2012/05/22(火) 09:13:05.99https://github.com/arton/ennou
0252デフォルトの名無しさん
2012/05/22(火) 13:00:29.09以下を実行した時に取得できるテキストをメモ帳に書きだすのはどうすれば良いでしょうか?
コマンドプロンプトに表示させる必要はないのでputはなくて良いのですが…
require 'rubygems'
require 'mechanize'
require 'kconv'
agent = Mechanize.new
agent.get('http://www.ruby-lang.org/ja/documentation/')
agent.page.search('p').each do |p|
puts p.inner_text.tosjis
puts '---'
end
0253デフォルトの名無しさん
2012/05/22(火) 13:06:57.13これ見て勉強します
0254デフォルトの名無しさん
2012/05/22(火) 14:00:13.09まとめてやろうとすんな
一気にやろうとせずに段階踏んで別々にやって、その成果を最後に組み合わせろ
「自作の” ”で囲った文字列を画面に表示する」
「自作の” ”で囲った文字列を変数に代入し、変数の内容を文字列として画面に表示する」
「ファイルにアクセスしてその内容文字列を画面に表示する」
「変数の内容を画面に表示するかわりにファイルにアクセスしてそこに書き込む」
「実際にやりたいメソッドの戻り値を変数に代入し、ファイルにアクセスしてそこに書き込む」
前の4つができていないと、最後のひとつはできない
0255デフォルトの名無しさん
2012/05/22(火) 14:19:32.280256デフォルトの名無しさん
2012/05/22(火) 14:24:06.140257デフォルトの名無しさん
2012/05/22(火) 14:29:40.49require 'rubygems'
require 'mechanize'
require 'kconv'
agent = Mechanize.new
agent.get('http://www.ruby-lang.org/ja/documentation/')
a = ""
agent.page.search('p').each do |p|
a << p.inner_text.tosjis
a << '---'
end
file = "file_testest123456789.txt"
open(file,"wb") do |f|
f.print a
end
system"start notepad #{file}"
0258デフォルトの名無しさん
2012/05/22(火) 14:34:33.58require 'rubygems'
require 'mechanize'
require 'kconv'
require 'win32ole'
# gem install win32-clipboard'
require 'win32/clipboard'
agent = Mechanize.new
agent.get('http://www.ruby-lang.org/ja/documentation/')
a = ""
agent.page.search('p').each do |p|
a << p.inner_text.tosjis
a << '---'
end
Win32::Clipboard.set_data a
wsh = WIN32OLE.new('Wscript.Shell')
wsh.run("notepad")
sleep 0.4
wsh.SendKeys"^v"
0259デフォルトの名無しさん
2012/05/22(火) 17:48:03.78makeで、「rdoc」エラーで失敗して進めません。
調べたら、yumのレポジトリに、「dev.centos.org/centos/4/CentOS-Testing.repo」を
追加とあったのですが、今現在ファイルが存在しません。
centos4系でrdocとインストールするにはどうすればいいのでしょうか?
0260デフォルトの名無しさん
2012/05/22(火) 20:37:57.03RDEを使ったところ、ものすごく使いづらいんですが、
他にrubyの実行ができるソフトってないんでしょうか?
0261デフォルトの名無しさん
2012/05/22(火) 21:04:05.10トン!
notepadだと改行うまくいかないみたいなのでwordpadで開くようにしてみますた
あとはpとかdivで囲まれたところではなく欲しいところを書きだすように書き換えに挑戦
これは明日やります…
0262デフォルトの名無しさん
2012/05/23(水) 04:00:53.18perlやpyやphpのサイトとかで練習しないだけでも。
0263デフォルトの名無しさん
2012/05/23(水) 09:05:50.76こう? get メソッドが動作することがわかったら実行行をコメントにして、
あらかじめ保存しておいた arakajime.html を読み込む動作にしばらく切り替えておく
require 'open-uri'
require 'kconv'
require 'rubygems'
require 'nokogiri'
def winsave_as(path, data)
open(path,'wb'){|f| f.print data.to_s.tosjis.gsub(/\n$/){"\r\n"}}
end
def get(url)
URI.parse(url).read
end
def search(html)
Nokogiri::HTML.parse(html).search('p').map{|e| e.text}
end
def notepad(path)
system "start notepad #{path}"
end
url = "http://www.ruby-lang.org/ja/documentation/"
path = 'tekitou54.txt'
# html = get(url)
html = File.open('arakajime.html',rb'){|f| f.read}
data = search(html).join("\n---\n")
winsave_as(path, data)
notepad(path)
0264デフォルトの名無しさん
2012/05/23(水) 09:25:25.00そんな感じっすな
実際問題としても、ネットアクセスとかデータベースアクセスとかはいちばん遅いはずなので、
スクリプト作成中にこの部分をローカルファイルの読み込みにしておくことの意義は大きい
マシンスペックにもよるけど、実行した直後に終わるはずだ
0265デフォルトの名無しさん
2012/05/23(水) 10:14:15.89そろそろできた?
0266デフォルトの名無しさん
2012/05/23(水) 10:26:58.31これしか選択しないですか?
gemでインストールできるものってないですかね?
0267デフォルトの名無しさん
2012/05/23(水) 19:18:47.13もしくはなぜRubyに拘ってるの?
0268デフォルトの名無しさん
2012/05/23(水) 19:32:03.220269デフォルトの名無しさん
2012/05/23(水) 20:49:17.57Windowsしか使ったことないのとPCが1台しかなくて、仮想マシン入れて動かせるほど良いスペックでもないです
ennouはWindowsによくあるインストーラ形式っていうのが引っかかるのでキツイです
0270デフォルトの名無しさん
2012/05/23(水) 20:52:40.930271デフォルトの名無しさん
2012/05/23(水) 20:58:05.380272デフォルトの名無しさん
2012/05/23(水) 21:06:06.960273デフォルトの名無しさん
2012/05/23(水) 22:07:29.33<div id=Main>から<div>までなど場所を指定して取得するのってどう書けばよいでしょうか
またこういうのってどうやってググれば良いでしょうか
『たのしいRuby第3版』買ったけど内容がやりたいことに追いついてない気がします
0274デフォルトの名無しさん
2012/05/23(水) 22:14:01.38君は怒っていいと思うよ
一発で出てこないということは、とりあえず正規表現を学ぶことをおすすめする
あんまり深入りすると抜け出せないので、 . + * ? () あたりの記号の使い方と意味だけわかれば充分
複雑な正規表現はとりあえずパスして、そのぶん ruby の if とか String#scan とか String#gsub とか String#split とかの機能を駆使する
正規表現で対処し切れなくなってからはじめて、HTML のパースライブラリの使用を検討するのが正当
■ このスレッドは過去ログ倉庫に格納されています