1 :
デフォルトの名無しさん :
2006/09/28(木) 15:28:59 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
お前らのモノグサ振りにはびっくりだ。
次スレは
>>980 が立てること!
もうRubyスレは一本にまとめていいんじゃないだろうか。
1000でスレ立てするなんて神だな。
>>7 ここ以外は隔離スレなのでだめです。
前スレのものです。 apt-get install `apt-cache search -n ruby1.8 | cut -d ' ' -f 1` irb1.8 rdoc1.8 ri1.8 をしたところ、 E: パッケージ irb1.8 が見つかりません、とでました。 apt-cache search irb としたところ、 ruby1.8 - Interpreter of object-oriented scripting language Ruby 1.8 とだけ表示されます。 irbのインストールはできなのでしょうか?
universeにあるだろ
うちは、universe切っても、irb出てくるけどな。 可能性あるとしたら、 ・apt-get updateしてない ・dapper universe を参照してない /etc/apt/source.lst の上の方の 〜dapper universeてなってるところのコメントをはずして、 apt-get update してみ
9です。 コメントをはずすとインストールできました。 教えていただいてから調べると、確かにそう書いてあるサイトがありました。 調べ不足から、お手数お掛けしてすいません。 ありがとうございました。
質問者じゃないけど、MeCabをwin32APIから使ってみたくて、 前スレ990と「恋する・・・」を見てやってみました。ダメな理由は 何となく分かるけど、具体的にどうすればいいか分かりません。 packとかいうのを使うんでしょうか。どなたか教えてください。 module MeCab DLL = 'libmecab.dll' Setarg = Win32API.new(DLL, 'mecab_new', 'ip', 'i') Analyze = Win32API.new(DLL, 'mecab_sparse_tostr', 'pp', 'p') Mecab_ptr = nil #MeCabのインスタンスのポインタを格納 def setarg(*opt) argc = opt.size + 1 argv = opt.unshift($0).push(nil).pack('p' * opt.size) Mecab_ptr = Setarg.call(argc, argv) #ポインタを取得(したい) end def analyze(text) Analyze.call(Mecab_ptr, text + 0.chr) #(当然?)エラー! end module_function :setarg, :analyze end
14 :
13 :2006/09/28(木) 17:35:36
自己解決しました。引数と戻り値の型の設定を間違っていました。 次のコードで一応、動きました。 Setarg = Win32API.new(DLL, 'mecab_new', 'ip', 'i') Analyze = Win32API.new(DLL, 'mecab_sparse_tostr', 'ip', 'p') これでコマンドラインからアクセスせずに済みそうです。
> お前らのモノグサ振りにはびっくりだ。 だがそれがいい。
すみません、Intel のダウンロードセンターが deflate で圧縮されてるんですけど
Ruby 1.8.4 標準の zlib だとうまく解凍できないようです
以下にサンプルのコードを載せるので、なんとか解凍できる方法を教えてください
require 'net/http'
require 'zlib'
http = Net::HTTP.new('downloadfinder.intel.com', 80)
req = Net::
HTTP::Get.new ('/scripts-df-external/Support_Intel.aspx?lang=jpn')
req['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.2; ja; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7'
req['Accept-Encoding'] = 'gzip,deflate'
res = http.request(req)
res.header.each{|k,v| puts "#{k}: #{v}" if k =~ /content-encoding/i}
begin
res.body = Zlib::Inflate.inflate(res.body)
rescue => e
puts "ERROR: #{e.message}"
end
圧縮した接続をacceptしなきゃいいだけじゃないの?
下のコードで、"addd"が残ってしまいます。 どこがおかしいでしょうか。 array = %w(aaa bbb accc addd aeee) re = /a[abcde]+/ array.each_index{|i| array.delete_at(i) if array[i] =~ re} p array =>["bbb", "addd"]
削除したらインデックスは変わる
>>18 私自身初心者なので模範コードは示せませんが、each_indexで処理すると
array[0] #=> aaaなので削除 結果 array = [ bbb, accc, addd, aeee ]
array[1] #=> acccなので削除 結果 array = [ bbb, addd, aeee ]
array[2] #=> aeeeなので削除 結果 array = [ bbb, aeee ]
という理由ではないでしょうか。
そのコードそのものの動作をさせたいなら array.delete_if{|x| re =~ x}
>>19 なるほど、そうですね。orz
>>20 明解な説明ありがとうございます。
>>21 やりたいのはそれでした。
もっと精進します。
みなさんありがとうございました。
23 :
デフォルトの名無しさん :2006/10/02(月) 06:27:30
rubyで、cなんかで言うenumをしたいときはどうすればいいんでしょ。 Javaみたいに、classに定数を追加していくのが、ruby流ですか?
Ӓや&H1234などの数値文字参照を該当文字に変換したいのですが、 マルチバイト文字コードを該当文字にする関数がわかりません。 chrのマルチバイト対応のような関数はありますか?
文字化けしてしまったので全角にしました。 &#1234や&H1234 などの数値文字参照を該当文字に変換したいのですが、 マルチバイト文字コードを該当文字にする関数がわかりません。 chrのマルチバイト対応のような関数はありますか?
Rubyで使えて、日本語の解説が豊富で、無料で使えるPDFライブラリは存在しますか?
>>26 Ruby PDFでググって、上位のライブラリが理論上は最も日本語の情報が豊富なライブラリ。
>>24 ,25
ttp://moriq.tdiary.net/20040903.html どういう入力からどういう出力が欲しいのかちゃんと書こう。
あと数値文字参照とRubyで扱える文字エンコードが一致しないので文字列化しても正規表現とかの操作はできないと思われ。
バイト列として操作はできると思うけど意味あんのかね。
>>23 単純にはそう。
その気になればModule#const_setとかで色々できると思うけど標準の方法はない。
>>24 ,25
ああごめん。
IconvとかでUTF-8に変換してから操作してや。
perlのText::ParseWordsに相当するモジュールはありませんでしょうか? Text::ParseWordsは、テキストを解析して、トークンの配列を返すモジュールです。 具体的には、スペースで区切られた要素(ダブルクォートで囲まれる場合がある)を処理したいのです。 元の文字列 a b "c d e" f "g" から a b c d e f g という配列を取り出したい。
shellwordsでどうよ
32 :
26 :2006/10/02(月) 18:38:27
>>27 ググっては見たんだけど、ろくなライブラリが無いね。
この辺りは、Javaの方が強力なので、Javaで作ったコマンドをRubyから叩くことにしました。
>>32 初心者向けかどうかは知らんが日本人が書いてるRuby<->Javaのライブラリが2個はある。
Rjbとyajb。前者はJNI、後者はPure Ruby。
外人が書いたやつも入れればもっとあるはず。
あとはiTextなりXSLTなり好きに汁。
まあそもそもRuby自体JRubyでいいのかもね。
こだわらないならRhinoが手頃だと思うけど。
34 :
デフォルトの名無しさん :2006/10/03(火) 18:00:04
Ruby1.8.4で長時間は知らせるとバスエラー起こして停止してしまうので最新版 に変えようとmake checkしたら4つもエラーが出てきてどうすればいいのでしょう? test_delete(TestDBM) test_delete(TestGDBM) test_s_open_error(TestGDBM) test_s_open_error(TestSDBM) このエラーの意味がわかりません。 このままインストールしてもいいのでしょうか?
35 :
デフォルトの名無しさん :2006/10/03(火) 18:09:31
実行中にCtrl-cで強制終了しようとするとXごとLinuxがフリーズする のはなぜですか?
>34 環境は? gdbm とかは入ってるの?
38 :
34 :2006/10/04(水) 08:42:10
環境はLinuxです。GDBMをいれてconfigure,make,make checkかけましたが 結果が変わりません。同じエラーが出てしまいます。DBM,SDBMも入れないとだめ なのでしょうか?
39 :
34 :2006/10/04(水) 08:51:11
Rhinoを入れてみようとしましたがコンパイルエラーでできません。 何か別なのを教えてください。できればCで書かれたJAVA->Ruby変換 ソフトみたいなのがいいです。
>>34 「このエラーの意味」どころかどんなエラーが出たかがわかりません。
43 :
デフォルトの名無しさん :2006/10/04(水) 17:44:18
Rubyをはじめて数日の初心者です。 class Foo attr_reader :field end について、attr_reader は 実は単なるメソッド呼び出しだということですが、 このような書き方のメソッドはどのようなタイミングで、 また、どうやって呼び出されるのでしょうか? irbで class Foo bar = "hello" print bar end を実行してみたら、helloと出ますが、同じことでしょうか。 この文がどのような文脈で評価されるのか、よくわかりません。 どなたか、ご教示いただれば幸いです。
class定義だってただの文
>>43 さん
44 さんの書かれているように
class Foo
bar = "hello"
print bar
end
で代入文や print メソッドの呼出しが実行されるのと「同じ」く attr_reader メソッドが呼び出されているだけという理解でよいのではないでしょうか。ただし attr_reader の副作用として
class Foo
def field
@field
end
end
という(getter)メソッドの定義をおこなったことになると。
46 :
デフォルトの名無しさん :2006/10/05(木) 13:25:13
>44さん、45さん なるほど、よくわかりました。 Javaなどの静的な言語しかなじみがないもので、ピンと来ませんでした。 実行タイミングや、スコープはどうなるのかな?などなど、 調べて勉強してみます。 ありがとうございました!
好きな数だけ単語の入力をしてもらい(1行に1単語、最後はEnterだけの空行)、 アルファベット順に並べ変えて出力するようなプログラム これの答えってなんになるの?
Javaだって基本的には同じじゃねえの。 class Department { public static final Map sections = new HashMap(); } このクラス定数はいつ初期化されるのか。 HashMapのインスタンスができんのはいつだろうか。 まあJavaだと実際はクラスが読み込まれた時(=Rubyでいうパース時)じゃなくて最初に参照されたときに定数を初期化するんだろうけど、 でも使おうとしたときにはもう使えるようになってる点は変わらんと思うが。 Java的に言えば、Rubyでクラス宣言直下でのメソッド呼出=static{}中での初期化、だと思えばだいたい合ってると思う。 変数スコープは全然違うけど。 でも、そんなの意識しなきゃならないところかね。 Javaでだってstatic{}中であんまり変なことしないだろ。 同じようにRubyでもクラス宣言直下で色々やらねえ方がいいと思うよ。 定数の宣言、クラス変数の初期化、attr_*でのアクセサの「定義」(実態は「生成」だけど)くらいしか Javaと同じように普通はやらねえし、やるべきじゃないと思う。 なんで調べるだけ無駄、と思った。
>>47 ruby云々の前に、もうちょっと基本から考えたほうがいいぞ。
それに宿題スレは別だ。
「一行に一単語」って文字コードは何?
英数字、漢字ありなのか?
その場合のアルファベット順とはなにか。
昇順・降順どっちとか。
とりあえず文字コード、ソート、rubyでググる事をお勧めする。
Foo = "a" p Foo p defined? Foo Foo << "b" p Foo #=>"a" #=>"constant" #=>"ab" Foo は定数なので2度代入できないと思うんですが、 上のは2度代入しているわけではないのですか? いや、Foo の指しているオブジェクトが変更されたということですね? でも何だかしっくり来ないんですが… 定数なのに値が変わってしまうというのは変じゃないんでしょうか。
irb(main):001:0> Foo = 'a' => "a" irb(main):002:0> p Foo "a" => nil irb(main):003:0> p defined? Foo "constant" => nil irb(main):004:0> Foo << "b" => "ab" irb(main):005:0> Foo.freeze => "ab" irb(main):006:0> Foo << "c" TypeError: can't modify frozen string from (irb):6:in `<<' from (irb):6
>>51 freeze で検索したら関連の情報をいくつか見つけました。
「定数」という用語にこだわらないことにします。
>>52 Rubyの「定数」は「参照先が変わらない」ってこと。
Fixnumみたいな不可変のオブジェクトは本当に変わらないが
Stringのような参照先が変わらなくても中身自体が変わるものは変わる。
freezeしたら別だが。
Net::HTTPでサーバ上のファイルの最終更新時刻は取得できますか? リファレンスを探したのですが見つかりませんでした。 ぐぐろうにも良い検索ワードが思い浮かびません…。 サーバ上のファイル更新時刻をしりたい場合は通常どのライブラリを使うのでしょうか?
取れるときと取れないときがある
HTTPResponseオブジェクトの[]メソッドで普通に取れるでしょ。取れるときは。 res["Last-Modified"] あたりを試せ。
それで取れないときに、別の方法で取れるかって質問じゃないのか
どう見ても
>>54 はNet::HTTPを使った更新時刻取得方法を聞いてるだけだが?
「取れないこともあるけどどうすれば?」とは書いてないよね。
a b c A b c A B C のファイルを読み込み、hash = {'a'=>{'b'=>'c'},'A'=>{'b'=>'c'},'A'=>{'B'=>'C'}} のようなハッシュのハッシュを作りたいのですが、どのような表記にすればいいのでしょうか perlだと while(<>) split/\s/; $hash{$_1}{$_2}=$_[3]; } のように初期化なしで直接代入できるのですが、rubyでhash[][]と書くと、たぶん後ろの[]がわからないようでエラーになります rubyではどのように表記するのでしょう?
>>59 ハッシュのデフォルト値を指定する。
動作確認してないけど、こうかな。
hash = Hash.new{|h, k| h[k] = Hash.new }
STDIN.each_line do |line|
key1, key2, val, = line.split(/\s/)
hash[key1][key2] = val
end
61 :
59 :2006/10/06(金) 18:40:02
>>60 出来ました!
最初、
if hash[key1] ==nil then hash[key1]=Hash.new
とか書くしかないかと思ってました
う〜ん、もうちょっとrubyのコードを見慣れないと思いつかないですね。
精進します
要素数が固定ならHash作ってから入れればいいだけじゃないの? #!ruby hash = {} DATA.each_line do |line| a = line.split hash[a[0]] = {a[1] => a[2]} end p hash __END__ a b c d e f g h i
再帰書いてたらStringとArrayに相互性が今ひとつないことに気付いたよ。 スタック越えない限りは実行可能なはず。 #!ruby require('pp') def rhash(a) case a.length when 0: when 1: {} when 2: {a[0] => a[1]} else {a[0] => rhash(a[1..-1])} end end hash = {} DATA.each_line do |line| hash.merge!(rhash(line.split)) end pp hash __END__ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E
で、ループに展開してみたが下手くそだな。 #!ruby require('pp') def rhash(a) return {} unless a.size > 2 last = a.shift full = hash = {last => nil} while a.length > 1 nex = a.shift hash[last] = hash = {nex => nil} last = nex end hash[last] = a.shift full end hash = {} DATA.each_line do |line| hash.merge!(rhash(line.split)) end pp hash __END__ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E
65 :
59 :2006/10/06(金) 21:14:24
例が間違っていました
a b c
a B c
のように二番目のキーだけ違うものが存在するので
A=>{b=>c,B=c}
と2つとも別のものとして代入したいのですので
>>62 さんの例だと1行目が2行目に上書きされてしまうので
困っちゃいます
今回は要素数固定なので
>>60 で行けますが
やりたいことはまさに
>>63 さんの礼そのものでして。
ちょっと考えます〜
質問させてください。rd2についてです。 ruby 1.8.5 (2006-08-25) [powerpc-darwin7.9.0] で、~/Desktop上にて、RD2を使い、testrd.rd > testrd.txt とすると、下記のようにエラーになります。 正しくRD2で出力を得るためにはどうしたらいいでしょうか。 <エラー引用ここから> /usr/local/lib/ruby/site_ruby/optparse.rb:1004: warning: character class has `]' without escape /usr/local/lib/ruby/site_ruby/optparse.rb:1004: warning: character class has `[' without escape /usr/local/lib/ruby/site_ruby/optparse.rb:1011: warning: character class has `]' without escape /usr/local/lib/ruby/site_ruby/optparse.rb:1011: warning: character class has `[' without escape lib/rd/rdinlineparser.ry:447:in `next_token': undefined method `terminate' for #<StringScanner_R 0/16 @ "¥244¥263¥244¥354¥244..."> (NoMethodError) from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `_racc_do_parse_c' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `__send__' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `do_parse' from lib/rd/rdinlineparser.ry:372:in `parse' from lib/rd/rdblockparser.ry:38:in `_reduce_12' from /usr/local/bin/rd2:177:in `_racc_do_parse_c' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `catch' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `_racc_do_parse_c' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `__send__' from /usr/local/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `do_parse' from lib/rd/rdblockparser.ry:262:in `parse' from /usr/local/lib/ruby/site_ruby/1.8/rd/tree.rb:50:in `parse' from /usr/local/bin/rd2:216 <エラー引用ここまで>
site_rubyというのがすごーく気になる。
>>65 頑張ってくれ。一応やってみたから、参考までに。
require "stringio"
fp = StringIO.open <<EOF
A b c
B b c
A c b
A c a b
EOF
# ここから
h = Hash.new
fp.each_line do |ln|
h_ = h; b, *a = ln.split
while b_ = a.shift
h_ = h_[b].class == Hash ?
h_[b]: h_[b] = a.empty? ? b_: {}
b = b_
end end
p h
69 :
54 :2006/10/07(土) 03:08:59
>>55-58 ありがとうございます。テストしてるサーバでは取得できました。
取れない場合に他の対処法があるのならそちらも教えて頂けませんか。
hash = { } while line = DATA.gets h = hash while words.size > 2 h = h[words.shift] ||= { } end h[words[0]] = words[1] end 可変長の場合 a b c a b なんて矛盾したデータが考えられるけど それはシラネ
ドットリストなのがだめなんじゃねえかとふと思ったよ。 ケツまでmapにしちまったらいいんじゃねえか? ケツの後ろはnilにしときゃいいだろう。
`dir /s /b`.each{|f| f.chop! foo(f) } を eachdir{|f| foo(f) } みたいにラップすることって出来ますか?
def eachdir(&b) `dir /s /b`.each{|f| yield f.chop} end ということ?
74 :
デフォルトの名無しさん :2006/10/07(土) 15:52:28
RubyOneClickInstallerなんだけど、
http://rubyforge.org/projects/rubyinstaller/ 1.8.4から1.8.5にバージョンアップしようとした。
OneClickInstallerは、Updateの際は、uninstall.exeを呼び出して、
一旦前のバージョンをアンインストールしようとするのだが、
レジストリを見るためか、レジストリに記載がない場合
(RubyをUSB-HDDで持ち歩いているので)、アンインストールできず、
Updateすらもできなかった。
そこで、uninstall.exeを消して、Updateしようとした。
すると、指定したフォルダ以下、全部消しやがった!!!!
今まで、gemsでインストールした、ソフトが全部吹っ飛びやがった。
uninstall.exeが使う、レジストリのHKEY_LOCAL_MACHINE\SOFTWARE\RubyInstallerは、
念のため保存しておいた方がいい。
まあ、同じことをする人はあまりいないと思うが、
気をつけた方がいいと思う。
以上、チラシの裏終わり
>73 yield するならブロック引数を &b で受け取る必要はないよ。
>>76 ああやっぱそうなんだ。
マニュアルにはサンプルが載っているが、でも書いてないけどよしなにするってのがなんか耐えられない感じ。
むしろblock_given?でチェックするのが正しいべき?
>77 yield は言語機能としてもともとあった機能。ただ、与えられたブロックをオ ブジェクトとして扱いたいっていう要求があってブロック引数という機能が実 装されたという経緯がある。 つまり、この2つは「似たような機能を実現するための2つの手段」になってい るから、両方を同時に使うのが一番ヘンだと個人的には思う。っていうか使え るとは思ってなかった。 ブロック引数を使わずに yield を使うか、ブロック引数を使うなら call メ ソッドを使って yield は使わないか、どっちかにするべきじゃないかな。 どちらを使うかは趣味の問題だと思うから、どちらでも良いと思う。 もともとあったのは yield だけだったので、古参の Rubyist は yield の方 を好む気がするけど。 あと、ブロック引数を取ると Proc オブジェクトを生成する。 yield は言語 機能なのでそういうことをしないぶん、じゃっかん軽いらしい。
補足。 こういうメソッドでブロックが与えられないときには単にエラーで良いと思う ので、いちいち block_given? などでチェックする必要はないと思う。
80 :
デフォルトの名無しさん :2006/10/07(土) 22:15:15
Rubyの質問というより、プログラムの仕方の質問かもしれません。 現在の状況 ruby ./hogehoge.rb data.dat 引数として、data.datを読み込んで、hogehoge.rbで処理して、 output.datというファイルが出力されるようになっています。 これに関しては、問題ありません。 毎回毎回、作業ディレクトリーにスクリプトファイルをコピーして、 処理を実行しているのですが、すごくめんどくさく感じています。 最終的にやりたいことは、 「作業ディレクトリーと実行ファイルを置いておくディレクトリーを別々にする。」 というものです。 色々調べてみると、Pathの設定をどうにかすればよいと思い 試行錯誤していますが、うまくいきません。 どなたか、ご教示いただければ幸いです。
環境は? ./ とか書いているから Linux ? distro は? 管理者権限はあるのか、一 般ユーザの権限しか持たないのか? その hogehoge.rb というのはどの程度 汎用なツールなのか? ほかの人も使うのか、自分しか使わないのか? そういうのはどういうツールなのかにもよるし、個人のセンスにも依存するだろう。 単なるデータ処理ツールであれば、パスを設定したりしないで、しかしいちい ちコピーなんかしないで相対パスで指定して実行することを個人的には勧める。 また、自分用のスクリプトはあらかじめ決めておいたディレクトリ(~/binとか) に置いておくことに決めておいて、そこにまとめて置くという手もある(パス はあらかじめ通しておく)。 パスを設定する方法なら板違いもいいところ。 設定の方法はシェルや環境によって変わる。 OS の使い方をもっと勉強した方 がいい。
>>81 >相対パスで指定して実行することを個人的には勧める
この一行だけでいいよ
>>80 hogehoge.rbの一行目に
#!/usr/bin/env ruby
と書いて、/usr/local/binか~/binにコピーして、chmod +x hogehoge.rbとすれば、
$ hogehoge.rb data.dat
というふうに起動できるようになるよ。
85 :
80 :2006/10/07(土) 23:06:07
>>81 ,83,84 さま
質問に答えていただいて、ありがとうございます。
環境はwindows XP Home EditionSP2です。
パスとか良く分かっていないみたいです。
少し、調べてみます。
86 :
80 :2006/10/07(土) 23:20:39
Pathを通したフォルダに、hogehoge.rbを置いて実行したら、 うまくいきました。 少し、Pathの意味が分かった気がします。 ありがとうございました。
Windowsかよっw
ここはエスパーの多いインターネッツですね。
ところでWindowsでPATH設定してあるところにスクリプトを置くだけでうまくいくのか。 むしろそんな単純にはうまくいくわけがないはずなのだが。 PATHEXTを設定してくれるインストーラとかあるんだっけ?
文字列の中の全角の数字だけを半角の数字に変換するにはどうしたらいいですか a="123" を a="123" に変換したいんです!!
a.to_i.to_s
gsub使って自己解決しました失礼しました。
93 :
デフォルトの名無しさん :2006/10/08(日) 05:09:28
初心者スレのエスパー率は異常なほど高いなw
>>23 定数値のかわりにわかりやすい変数名をつかいたいということであれば、
Symbolを使えばいい。
C言語でいう
typedef enum {
TOKEN_IF,
TOKEN_WHILE,
TOKEN_FOR,
} Token;
は、Rubyでは
:TOKEN_IF
:TOKEN_WHILE
:TOKEN_FOR
でオK。
ただし、そのenumに順番な値を割り当てて使いたいというなら、Symbolでは無理。
module Token
IF = 1
WHILE = 2
FOR = 3
end
としてToken.IFやToken.WHILEでアクセスする。
95 :
デフォルトの名無しさん :2006/10/08(日) 06:16:14
>>94 Symbolだと、
定義にならないから、スペルミスってもとおっちゃわない?
moduleが無難そうです。
どこに表示させるの?
Rubyレシピブックの163を試したところ、renameのところで Permission denied のエラーが出てしまいます。 どうもtempファイルのrenameが出来ないみたいです。 どうすれば回避できるでしょうか? 実行環境:Win XP SP2, ruby 1.8.4 (2006-04-14) [i386-mswin32] レシピブック正誤表にある2箇所の修正は入れています。
名前変更しようとしているファイルが使用中なのでは。
>97 表示させる場所は cmd.exeでの出力結果を考えています。 ruby ToUnicode.rb 数値文字参照を含むファイル を実行するとcmd.exeでunicode文字が表示される というのを期待します。 リダイレクトしてunicodeを扱えるエディタで開けば 結果をファイルとしても扱えると思います。
>>100 cmd.exeってSJISしか表示できなかったような気がするんだけど?
102 :
98 :2006/10/08(日) 14:43:53
>>99 アドバイスありがとうございます。
require "fileutils"
を頭に入れて、renameの行を下記の2行に変えたら動きました。
temp.flush
FileUtils.copy(temp.path, path)
>>78 マニュアル読み直したよ。
lambdaを渡そうとしてno block givenだったのは、可換じゃないからなのね。
合点がいった。
>>96 あーごめん、わかった。レベルを勘違いしてたのがわかった。
日本語以外がうまくいかない?そりゃそうだよ。
だって変換先がShift-JISなんだもん。日本語でもうまくいかないときすらあるよ。
コード読んだ?何をするためのコードだと思った?Iconvは調べた?
さらに言えばあのコードでは数値文字参照以外はノータッチなのでそこのコードが不定だと結果も不定だよ。
単純な方法としては、一回全部をUTF-8にしないと正常な結果になりません。(他の方法もあるけど)
では、なぜ一度中身を全部文字コード変換する場合は、UTF-8でないといけないのでしょうか。
105 :
デフォルトの名無しさん :2006/10/08(日) 15:27:49
Ruby on Railsの本(かんたんRuby on Rails)を読んでるのですが、 ちょっとRubyに関して疑問に思ったので、こちらで質問させていただきます。 日付が文字化けするという、問題があるという風に書いてあるのですが、 当方の環境では、文字化けしません。 ruby -e 'p Time.new' と実行すると、本では、 Tue Apr 04 00:48:32 東京(標準時) 2006 となっているのですが、こちらの環境では、 Sun Oct 08 15:27:24 +0900 2006 となります。 これはどういったことが考えられますでしょうか?
誤:さらに言えばあのコードでは数値文字参照以外はノータッチなのでそこのコードが不定だと結果も不定だよ。 正:さらに言えばあの「ソースコード」では数値文字参照以外はノータッチなのでそこの「文字コード」が不定だと結果も不定だよ。
107 :
105 :2006/10/08(日) 15:36:57
環境を書いていませんでした。 OSは、WindowsXP SP2 Home。 OneClickInstallerでインスコしました。 ためしに、bash上で、export LANG="ja_JP.SJIS"してみましたが、英語のままでした。
>101
中国語の文字のファイル名をつけたら、一部文字化けしました。
http://www.securehtml.jp/utf-8/sjis/chinese_sjis.html にある
[ザーサイ].txt
[ニイハオ].txt
[シェシェ].txt
を作ってdirで表示したところ([]内は実際はchinese_sjis.htmlからコピー&ペーストした中国文字)、
[シェシェ]だけだめでした。
エクスプローラ上では表示されましたので、
「数値文字列参照を含むファイル名をunicode表現でrenameする」
ということでどうでしょうか?
>>108 ファイル名の話じゃなかったでしょ。
結局何がしたいんだ。
111 :
デフォルトの名無しさん :2006/10/08(日) 23:20:04
String#tr! を使う場合同じ文字数しか置き換え出来ないんでしょうか? s = "ABCDEFG" s.tr!("D", "XX") print s + "\n" 結果: ABCXEFG
112 :
デフォルトの名無しさん :2006/10/09(月) 00:15:14
rubygemsからrailsインスコする時って、rubyforgeからソース引っ張ってきてんの?rubyforge.orgが昨日から全く繋がらず、当方のOSXにてインスコできず。。。
>>111 > String#tr! を使う場合同じ文字数しか置き換え出来ないんでしょうか?
そりゃ文字単位の置換だからな。
> s.tr!("D", "XX")
むしろ警告かエラーかにすべきじゃないかな。
クラスにデータを保存する…というか、 なんだかそういう感じの概念があるというような話を聞いたんですが、 どういうのをどう勉強すると使えるようになるもんでしょうか? クラス変数とか使うのとは違うのかなとか
コンテナの話かなあ
Mac使いの人助けてください UTF-8で書いたスクリプトをMacに持っていって その時点では普通に動いたんだけど、miで編集したら動かなくなりました 調べてみると、例のチルダの変換のせいでおかしくなってるみたいです これはどのように対処すればいいんでしょうか?
119 :
66 :2006/10/09(月) 21:49:09
>>66 rdtoolを0.6.20じゃなくて、0.6.16でいれなおしてみたら、なぜか成功しました。
当然、ruby 1.8.5 (2006-08-25) [powerpc-darwin7.9.0] な環境はそのままです。
ご報告まで。
1・文字列Aと文字列Bと文字列Cがこの順で含まれている 2・AとB、BとCの間に文字列は存在してもいいが、A・B・Cのいずれも含んではいけない というような正規表現はどうやったらいい?
/A[^AC]*B[^AB]*C/
>>121 すいません
A、B、Cは文字じゃなくて文字列です。そう定義しただけです
>>66 とりあえずsite_ruby/optparse.rbは消せ。古すぎだ。
strscanも古いの残ってないか?
>>120 とりあえずこんなもんか。
A, B, C = "ab", "ba", "ca"
re = /#{A}((?!#{A}|#{B}|#{C}).)*#{B}((?!#{A}|#{B}|#{C}).)*#{C}/
>>127 ありがとさんでした
否定先読みの使い用途がようやくわかりました
for var in list do ... end が list.each do |var| ... end と同じということですが、 なぜ for key, val in hash do ... end は hash.each do |key, val| ... end と同じではないのでしょうか。 for var in list が書けるなら for key, val in hash も書けるようにしてほしいんですけど、無理なお願いでしょうか。
急いでお布施をするんだ
131 :
デフォルトの名無しさん :2006/10/10(火) 06:24:02
for var in list doなんて、初めて知った。 これ使ってる人いる? eachしか使わんからなあ
132 :
デフォルトの名無しさん :2006/10/10(火) 06:55:34
hash.keys.sort.each do |key| ... end 使うなぁ
>129 おれの環境ではできるけど。 irb(main):001:0> h = {'a' => 'b', 'c' => 'd', 'e' => 'f'} => {"a"=>"b", "c"=>"d", "e"=>"f"} irb(main):002:0> for k, v in h do p [k, v] end ["a", "b"] ["c", "d"] ["e", "f"] => {"a"=>"b", "c"=>"d", "e"=>"f"} for は each メソッドを呼ぶだけなので、 each がどう定義されているかによると思うんだが。
1.4のマニュアルには既にforはeachですと書いてあるね。 例が配列しかないからArrayにしか適用できないと勘違いする人も多いと思うけど。
またそういう根本学習部分に対して丸投げするから class Main #(とりあえず全部書く) end Main.new みたいな練習にもならんスクリプトが蔓延するんだよ
>>131 最近の1.9の警告に負けて一部eachからforにかえてしまったオレは負け組。
>>136 最後がMain.runとかだったら許せてしまうオレは負け組。
適当に書いてもオブジェクト指向の恩恵を得られるのがRubyなんじゃねえの(w まあ、確かに自己流ではどうにもならんのは確かではあるが…
俺は
>>136 みたいのはmainか何かの特異メソッドにしちゃうかも。
>>131 > for var in list doなんて、初めて知った。
> これ使ってる人いる?
> eachしか使わんからなあ
普通 for のほうを使うだろ?eachは遅い。
お前の普通なぞどうでもいい
どう書こうかなーって思いながら書くと、each 使っちゃうね。 何回も実行される部分だと意識して for に書き直したりするけど。
うちはたまにwhilteも使う
普通Pythonのほうを使うだろ?Rubyは遅い。
Rubyでeachばっかり使ってると偶に他の言語でforが出てくると戸惑うよ。
お前だけ
激しくどうでもいい
Rubyでeachばっかり使ってたら他の言語を使う時にまずforeachの文法を確認するようになったw
150 :
sage :2006/10/11(水) 03:07:49
「検索サイトの入力フォームに文字を入力して送信し その結果を取得する」 これを行なうにはどんなプログラムを書けばいいのでしょうか?
いちいちフォームを読むことにこだわらなければこんな感じ $ ruby -e 'require "net/http"; Net::HTTP.get_print("www.google.com", "/search?q=2ch+Ruby")'
152 :
150 :2006/10/11(水) 06:09:36
>>151 ありがとうございます。
googleの場合はこのやり方でできたのですが、
他のサイト(yahooやgooなど)のフォームに入力する際は
/search?q の部分はどう変えたらいいでしょうか?
そんなのブラウザで検索してURLがどういう表示になってるか見れば 一発でわかるじゃん。
154 :
デフォルトの名無しさん :2006/10/11(水) 09:54:23
>>149 俺なんか、Rubyでeachばかり使ってたら、他の言語にforeachがないとクソだと思うようになったw
新スレを自動的に見つけて 2getするプログラムはどう書けばよいのでしょうか?
#!/usr/bin/ruby -Ke puts '新スレを見つけたら何かキーを押してください...' while line=$stdin.gets do puts '2ゲットおおおおぉぉ' puts puts '新スレを見つけたら何かキーを押してください...' end
>>157 作るべきではないが
自動的に
という質問のようだよ。
こういうバカには何も教えないほうが世のためという気はする
2getしてどうするんだろう。 遠まわしに2chカキコの為の方法を聞いてるんだろうか。
>>156 Lv9が倒せない。これ見てから間に合うか!?
ネットアクセス関係は危険物取り扱いだからなあ ほいほい教えないのが暗黙のマナーな気もする 勉強した人ならピンポイントで聞いてくるだろうし
cookie を送信するにはどうすればよいですか 具体的には ハナモゲラ という文字列を送信したいのですが
Esper is nice, so we are nice.
>>157 みたいなインターフェースのって、絶対綺麗に書く方法があるはずだと思いつつ
puts '入力してください'
loop do
# 処理
puts '入力してください'
end
みたく書くんだよな
なんかいい方法ない?
ループの判定前前に必ず実行できるとか
>>165 さん、えーと
loop do
puts プロンプト
line = gets
raise if 終了条件(line) # ループ外で例外捕捉しないのならば exit の方が素直かな
処理(line)
end
というようなかんじではあまり綺麗じゃないですかね。
>>163 ピンポイント過ぎwww
うーんとね、Cookieにはなもげらって書けばいいと思うよ。
168 :
デフォルトの名無しさん :2006/10/11(水) 20:36:31
BCC55でRuby1.8.5をmakeしようとしたのですが、以下のエラーが発生し先に進む事ができません ** error 1 ** deleting -prologue- 如何すれば解決するでしょうか?
>>165 begin
print 'ぼたんをおしてください'
raise if line=$stdin.gets
rescue
puts "2ゲットオオオォォォ!\n\n"
retry
end
異常でもないのに例外発生なのがいやな感じ
NKFモジュールの仕様(?)についての質問です。 p NKF.nkf('-M', 'ほげほげ') というプログラムを(EUC-JP, ISO-2022-JP, UTF-8 などの文字コードでファイルに保存して)実行すると ruby 1.8.4 (2005-12-24) [i486-linux] では常に "=?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEI=?=" という文字列が返ってくるのですが ruby 1.8.5 (2006-08-25) [i486-linux] ですと UTF-8 の場合には "=?ISO-2022-JP?B?GyRCJFskMiRbJD" となって尻切れトンボになってしまいます。ソースコードを眺めてみたところ - ruby-1.8.4 添付の NKF モジュールは nkf 2.0.5 ベース - ruby-1.8.5 添付の NKF モジュールは nkf 2.0.7 ベース らしいので、nkf の仕様変更が影響しているように思えるのですが、これどういう理由で挙動が変わったのでしょうか?
>>165 while print('input: ') or ((k=gets)) do
172 :
171 :2006/10/11(水) 21:32:23
結局、何度も使う場合は def input(prompt) print prompt gets end しちゃうんだけどね
Readline 使えばいいのに
while修飾子かuntil修飾子ではだめなのか?
>>式 while 式
>>右辺の式を評価した値が真の間、左辺を繰り返し実行します。
でなきゃeach_input{|input| 何かやる }を定義するとか。
def each_input(prompt, &b)
loop do
print prompt
b.call(gets)
end
end
each_input("in:"){|x| puts x}
>>173 それだ。
>>168 あれ、Borlandのコンパイラってまだサポートされてたっけか
サポートされなくなったのは1.9だけ?
>>175 え、マジで?
どっかにそんな情報ある?
>>170 Cygwinだけど再現した。
nkf.exeでも再現するからnkf207のバグなんだろうなあ、と思ってiconvしてみたら何か変だな。
irb(main):011:0> Iconv.iconv('iso-2022-jp', 'utf-8', 'ほげほげ')
=> ["\e$B$[$2$[$2", "\e(B"]
NKFのソース見ても正直よくわからんが。
178 :
177 :2006/10/12(木) 18:56:00
CygwinのRubyで再現するのは本当だけどirbのは嘘っぽい稀ガス。 nkf.exeの結果も205と207で違うし207の結果は変だと思うけど、RubyのNKFと全く一緒ではないな。 % nkf205/nkf -M /tmp/hogehoge.utf8 =?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEIKCg==?= % nkf207/nkf -MW /tmp/hogehoge.utf8 =?ISO-2022-JP?B?GyRCJFskMiRbJDIbKE
179 :
175 :2006/10/13(金) 00:02:14
メンテナが不在なら、サポートできるわけないんだから、当然のことだろうね
181 :
デフォルトの名無しさん :2006/10/13(金) 00:29:18
BCCでコンパイルできない場合、WindowsXPでは如何すればよいのでしょうか?
使うの止めれば?
Borland捨ててMicrosoftに乗り換える
gccがあるじゃないか
コンパイルを通るようにしてパッチを投げる ついでにメンテナに立候補する
186 :
170 :2006/10/13(金) 02:14:39
>>168 > BCC55でRuby1.8.5をmakeしようとしたのですが、以下のエラーが発生し先に進む事ができません
> ** error 1 ** deleting -prologue-
それはエラーが発生した後のmakeのメッセージ。
その前にはなんと出てる?
つーか俺んとこじゃ問題なくコンパイルできてるんだが。
188 :
デフォルトの名無しさん :2006/10/13(金) 04:33:05
初歩的な質問で申し訳ありませんが、よろしくおねがいします。 1. 正規表現で、すべての文字にマッチさせるにはどう書けばいいですか? 例えば、{}の間にある文字列すべてとかの場合です。s[/\{ここ\}/] 何か簡潔な記述方はありますか? 2. あるRubyスクリプトを別のプログラムから "ruby script.rb" 等と実行した場合 Rubyのスクリプトからスクリプト自体が置かれているディレクトリを取得するにはどうしたらいいでしょうか?
.* $0
こんなに憎いのにWindowsでRubyが実行できたりビルドできたりするはずないだろ!?
/\{[^\[\]]*\}/ __FILE__
/\{[^\{\}]*\}/
193 :
デフォルトの名無しさん :2006/10/13(金) 07:48:50
>>184 GCCでもBCCと同じ方式でコンパイルできるのですか?
>>187 \Ruby\bcc32>configure.bat
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
Creating Makefile
** error 1 ** deleting -prologue-
と出ます
>>188 案外
/\{.+?\}/
で用は済むのかも
>>193 >GCCでもBCCと同じ方式でコンパイルできるのですか?
cygwinなら
configure
make
だけでできる。そういう意味では同じ。
mingwだとconfigureに引数が必要だが、大したことはない。
196 :
188 :2006/10/13(金) 09:20:11
>>189 こんな簡単なものでイケたんですね。
mで改行もOKみたいですね。
>>191 __FILE__ もあるんですね。
>>194 それでもイケるんですか。
なるほど。
今の所、違いがイマイチ分からないのですが
189さんが教えてくれた方法で解決しましたのでそれを使わせて頂きます。
みなさん、どうもありがとうございました!
>>195 > mingwだとconfigureに引数が必要だが、大したことはない。
CC='gcc -mno-cygwin' だけ。
bccはコンパイラもランタイムもバグだらけだし、makeも(nmakeよりさらに)
奇天烈だしで、切実な理由がないかぎりおすすめしない。
# 新しいTurbo C++はDLするものが多いんでまだ試してない。
>>197 あとMakefileがどこまでできてるか。最後の方の数行。
200 :
デフォルトの名無しさん :2006/10/13(金) 10:01:22
2chにカキコした後、自分にレスが付いたかを調べて 表示するスクリプトを練習で作ったんですが、置き換えの部分をもっと短く書けませんか? 正規表現がよく分かってないもので… require 'open-uri' URL = ARGV[0] #url NUM = ARGV[1] #res number s = URI.parse(URL).read f = false s.each_line{|l| if l['>>' + NUM] || l['>' + NUM] l['<dd>'] = '<dd>' + "\n" l.gsub!(/<br>/, "\n") l.gsub!(/<[\w"'_\=\+\-\*\/\:\.\s]+>/, '') l.gsub!(/</, '<') l.gsub!(/>/, '>') print l.chop f = true end } if !f print "まだレスがありません。\n" end
書いてみたが、よく見たらread.cgiのHTMLを解析してるんだな。 2chのdatファイルの仕様を調べるといい。 それと、ネット上から持ってきたファイルの保存の仕方と、 2chからdatの差分を取得する仕方。
それはopen-uri諦めろってことだな(w
MinGW ですが MinGW と Cygwinのサブセットである開発支援環境のMSYSと perl (MSYS用のperlも提供されてます)をインストールすれば 特に何もせずとも ./Configure make でコンパイルできましたよ
204 :
デフォルトの名無しさん :2006/10/13(金) 16:43:10
>>195 cygwinをインストールし試してみましたが
configureやmakeとしてもコマンドが存在しないと返されてしまい、何一つする事が出来ません・・・
唯一cdだけは出来ますが・・・
>>197 以下の通りです
2006/10/11 20:05 <DIR> .
2006/10/11 20:05 <DIR> ..
2005/04/20 07:28 2,399 configure.bat
2006/05/26 08:44 13,365 Makefile.sub
2002/10/03 20:20 539 mkexports.rb
2006/02/23 22:43 4,311 README.bcc32
2006/02/23 22:43 3,189 setup.mak
2006/10/13 07:42 155 Makefile
>>198 プログラミング関係の本にBCCが良いと書いてあったのですが・・・
あれは嘘だったのかorz
>>199 こんな感じです
prefix = /usr
!endif
!ifndef EXTSTATIC
EXTSTATIC =
!endif
>>203 MinGWはCygwinでもコンパイル出来ないようなら使ってみようと思います
実際のとこ今BCCを使う理由はないな。 Borland大好きならともかく。 あとCygwinに関してもうちょっとググれ。
>204 Cygwin慣れてないならmingwインスコするがよろし。 Cygwinを使ってやりたい事が複数あるならCygwinお勧めするが。
>>204 わかった。
すまんがソースと別のディレクトリでコンパイルしてくれ。
md build
cd build
..\bcc32\configure
みたいに。
>207 setbccぐらい教えてやれよ…
209 :
デフォルトの名無しさん :2006/10/14(土) 06:16:27
>>205 二時間かけてフルセットのCygwinをインストールしてみたりしましたが
何をやってもconfigureもmakeも出来ませんでした・・・
コマンドが存在しないと帰ってくるだけです
>>206 MinGWを入れてみましたが、結局殆ど変わらないどころか
意味不明なレスポンスが帰ってきます
\bcc32>configure
'make' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
makeなんて一度も打ってないのに・・・
>>207 全く何も変わりませんが・・・
がんばれ、えすぱー
あいつはrubyのバイナリをダウンロードして使えないわけでもあるのだろうか
他人が作ったバイナリなんてどんな罠が仕掛けられているか分からんだろ ソースを落としてきて全てを検討して納得してから自分でビルド もちろんコンパイラをはじめ全てのビルドツールもソースからチェック
それじゃ、Windowsのソースも全部チェックして自前でコンパイルしないとな
ワロス。 フルセットをインストールしてどうしたんだよ。 どういう操作をしたのか漏れなく書いてよ。 実行したコマンドはコピペしなさい。
>>219 52a7c8047a12ec2594b94295f23d158b
>>209 > \bcc32>configure
bcc32ディレクトリの下で実行してるのか?
mingwでやるならその上のバッチじゃないconfigureがあるディレクトリでやらないと。
> 'make' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>
> makeなんて一度も打ってないのに・・・
bcc32/configure.batが内部で使ってる。
そこでエラーになるということは必要なものが全然インストールされてないということだ。
>
>>207 > 全く何も変わりませんが・・・
どういう風にやった?
えすぱーじゃないが努力してみようw
>>209 その1
cygwin だの mingw とかインストールした後にちゃんとPATH通したか?
たとえばコマンドプロンプトから ls とか gcc -v とかやったときにちゃんと
コマンドが起動する?
それと、bcc用のconfifure.bat を cygwin/mingw 用のMakefileを作るのには
使えないよ。rubyのソースを展開したディレクトリに、configure という
拡張子がないファイルがあるから、これを bash で実行する(cygwin/mingwの
場合な、念のため)。
コマンドプロンプトで bash としてbashを起動して、そこから ./configure
でconfigure が起動できる。cygwin で作りたいなら ./confiugre --enable-shared
mingw なら CC='gcc -mno-cygwin' ./confiugreだ。
インストール先ディレクトリとかを指定したいときならここで一緒に指定する。
その2
bccとかvc用の configure.bat は内部で make(nmake)を呼んでごちゃごちゃ
やっているので、make.exeがきちんと実行できる環境にないと
> 'make' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
というメッセージが出てくる可能性はある。そもそも Ruby インストールガイド - Borland C++ (ソースから)
http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=Borland+C%2B%2B+%28%A5%BD%A1%BC%A5%B9%A4%AB%A4%E9%29 の手順に従ってやってるか?
223 :
222 :2006/10/14(土) 14:46:51
あ、かぶったw
224 :
デフォルトの名無しさん :2006/10/14(土) 15:39:53
>>207 BCCでは以下のような感じです
\bcc32>md build
\bcc32>cd build
\bcc32\build>configure
'configure' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
\bcc32>configure
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
Creating Makefile
** error 1 ** deleting -prologue-
MinGWだと、こうなりました
\Ruby>configure
'configure' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>>222 gcc -vはちゃんと出ます
lsは出ません
bashも出ません
>>その2
BCCではmakeのエラーは出てません
MinGWでは出ますが・・・
勿論手順に従ってやってます
>>224 > BCCでは以下のような感じです
> \bcc32>md build
> \bcc32>cd build
> \bcc32\build>configure
>>207 > md build
> cd build
> ..\bcc32\configure
ちゃんと見比べてみろ。
最後のはパス付きで実行する。
>>224 gcc が起動できてls や bashが起動できないという状況がよくわからんけど、
bashが使えなきゃ configure を実行することができないので
それじゃビルドできんぞ(cygwin版でもmingw版でも)。
c:\cygwin\bin とか c:\cygwin\usr\bin とかにちゃんとPATH
通ってるか?
bcc のほうのエラーは見当もつかんなあ。
PATH通す必要なんか無いよ
228 :
デフォルトの名無しさん :2006/10/14(土) 17:33:05
正規表現について質問です。 str = "<a><b>2</b>ちゃんねる</a>" とあって、「2ちゃんねる」 だけを抜き出したい時は、どう書けばいいでしょうか。 また、「<b>2</b>ちゃんねる」を抜き出す方法も知りたいです。
cygwinでPATHを通せとか言ってる奴、一体どういう使い方してんだよ?
230 :
228 :2006/10/14(土) 17:48:49
mswin32で16進数の値をファイルに書き込みたいのですが どうすればいいのでしょう? バイナリエディタで開いたときにAA BBなどと表示されるようにしたいのですが。
232 :
デフォルトの名無しさん :2006/10/14(土) 19:56:12
>>225 書かれている通りにちゃんとやったら、BCCでconfigure、make共に実行する事ができました
ですが、最後の最後に以下のエラーが出てしまいました・・・
Fatal: ファイル C0X32.OBJ が開けません
** error 2 ** deleting miniruby.exe
これは如何すればよいのでしょうか?
>>226 cygwin mingwの両方でbashは使用不能です
cygwinの方ではlsは使えます
gccは両方とも実行できます
後、cygwinにPATH通す意味ってあるんですか?
cygwin.bat使ってるから要らないと思ってたんですが・・・
いつまでやってんだよ・・・ cygwinなら ./configure だ、ボケ。 それから、cygcheck -cとやって、makeがちゃんとインストールされてるかどうかチェックしろ、アホ
>>232 cygwin.bat が bash 起動しないとかどんな設定してあるんだよw
>>229 bash は通常のシェルとして使わずに cmd.exe からコマンド使ってるだけだが?
cygwin インストールしてもシステムのPATHは書き換えないだろ?
例の彼がデスクトップのショートカットとかから起動しているのか
不明だったから念のため確認とっただけだが。
236 :
231 :2006/10/14(土) 23:10:14
出来ました(;_; 結構悩みました
>>235 > cygwin インストールしてもシステムのPATHは書き換えないだろ?
書き換えてたような…
238 :
デフォルトの名無しさん :2006/10/14(土) 23:37:47
Windows環境での質問です。 rubyでpopen(モードはr+)したいのですが、c/c++のstdioやiostreamで標準入力を受け付けると、後に続く出力が返ってきているのか来ていないのかすら不明で、ruby側のIOのeof?メソッドやgetsメソッドで処理がブロックされて止まってしまいます。 popenで開く対象もrubyで書いた場合にも、似たような現象がおこります。 でもphpで書くと、なぜかスムーズにデータの受け渡しができてしまいます。 最終的にはどうしてもC++でやらなければならないので、何か解決法がわかる方いましたら宜しくお願いします。
239 :
238 :2006/10/14(土) 23:38:44
再現コード ■popen.rb io = IO.popen './test.exe', 'r+' #io = IO.popen 'php test.php', 'r+' #io = IO.popen 'ruby test.rb', 'r+' while gets io.write $_ print io.gets end io.close ■test.rb (標準入力から受け取り、大文字に変えて標準出力へ) while gets print $_.upcase end ■test.php (同じことをしていますが、PHPの場合だけうまくいきます) <?php while (! feof(STDIN)) { echo strtoupper(fgets(STDIN)); } ■test.cpp ちょっと長くなるので省略しますが、cin.getlineやfgetsで受け取り、coutやprintfで返すと問題が再現します。 環境はWinXP、cl/14.00(g++やbccでも同じでした)、ruby/1.8.4、php/5.1.4です。 とにかくC++で作った実行ファイルをrubyからpopenして、標準入出力のフィルタリングのようなことをしたいので、どうか宜しくお願いします。
ランタイムの問題じゃないの? まさかBCC版のRubyだとか。
241 :
238 :2006/10/15(日) 00:30:55
>>240 レスどうもです。
ランタイムの問題、と言いますと、Rubyの側の問題な可能性があるということでしょうか?
いちおうRubyはCygwinのものです。
ActiveScriptRubyも今からインストールして試してみます。
242 :
238 :2006/10/15(日) 00:57:20
ASRでも同じ問題がおこりました・・・orz それで、やっぱりPHPが相手な場合だけ上手くいきます。 何が原因なんでしょう・・・?
245 :
238 :2006/10/15(日) 01:18:51
>>243 了解しました。
試してみます!
>>244 ハングしたみたいに止まってしまうで、Ctrl+CでInterruptせざるを得ないんですけど、どのタイミングで$?を拾えばよいでしょうか?
ちなみに、もしLinux環境などでは問題なく動くとか、Windows環境で問題が再現した/しなかった、などの情報もありましたら宜しくお願いします。
>>239 C++で試してみたら、確かにブロックするな。
ただ、C++側でflushしたらちゃんと動いた。
pipeの挙動ってこんなもんだったっけ???
247 :
238 :2006/10/15(日) 01:24:38
>>246 flushしたらできましたか!?
てっきり入力のせいだと思っていたんですけど、出力するときflushできてないのが問題だったのでしょうか?
ちょっと
>>243 の1.8.5をインストール中なんで、それからflushも明示的に書いて試してみます。
情報どうもです!
248 :
246 :2006/10/15(日) 01:27:31
さらにMontavista Linux(玄箱)で試してみたけど、やっぱりブロックして、 flushするとちゃんと動いた。C++側では改行コードも出力してるんだけど・・・。 高水準のpipeは使ったことほとんど(全然?)無いから、この挙動が正しいものかどうかわからん・・・
249 :
238 :2006/10/15(日) 01:35:57
今ちょっと試してみたら、flushしたらruby版もc++版も全部完璧に動きました!! バッファにたまりっぱなしになってたから、popen側でいつまでも受信できなかったのか・・・orz そういえばphpは暗黙flushがあったような気がしてきました。 解決です。どうもありがとうございました!!m(_ _)m
それでいいんだろうか・・・
>>246 > pipeの挙動ってこんなもんだったっけ???
普通はそうだ。
>>238 Cなら setvbuf()
rubyなら STDOUT.sync = true
あるいは、呼出側でPTY.spawnを使うという手があるが、
WindowsじゃPTYはないんだよな。
253 :
デフォルトの名無しさん :2006/10/15(日) 02:59:29
Rubyのピッケル本がわかりにくすぎる。 ほんといらいらするよ、あのほんよんでると
254 :
デフォルトの名無しさん :2006/10/15(日) 03:02:47
いま第2版(日本語)よんでるけど、もうげんなり、
42ページ 間でやっときたけど、
ここで
for i in 0
[email protected] ってコードが出てくるけど、for なんて構文ここまでで説明されてないぞ!!!!!
それに...ってなんだよ!!! 言語の一部なのか単なる省略なのか いみわからん。
もっとまともにかけないの???????????????
まじむかつく、
255 :
デフォルトの名無しさん :2006/10/15(日) 03:42:55
ブロックがちょーうぜー こんなキモチワルイ構文入れてぎゃーぎゃーいうくらいなら 高階関数ひとついれればいいだけじゃん あーいらいらする
injectってただのfoldじゃねーか!とか?
そうだよ! 45ぺーじでinjectっていう最高にキモチワルイメソッドがでてきたけど もう本気でむかつくよ。なにこれ
46ページで「いきなり」でてくる *arg ってのがいみわからん、 意味不明な言葉でぐだぐだせつめいされてもイラツクだけ!!!!!!!! あああああああああああああああああああああうぜーーーーーーーーーーーーーーーーーーーーーー
259 :
デフォルトの名無しさん :2006/10/15(日) 05:02:58
この本(プログラミングRuby第2版)でつかわれている「透過的」ってどういういみ?
上着着てるのにブラのレースづかいまで見えること
261 :
デフォルトの名無しさん :2006/10/15(日) 07:52:08
どういうコンテクストでつかうと↑みたいなことになるのか上品なおれにはわからねー ところで、rubyのクラスで クラス内でしか使わない、外には見せないインスタンス変数ってどうやって定義するの?
>>254-257 感想は最後まで読んでからまとめて書いてくれ。
とりあえずお前の書き込みが頭悪すぎて不快だ。
264 :
デフォルトの名無しさん :2006/10/15(日) 08:21:03
普通の高階関数の仕組みあればブロックいらないんじゃていうのは結構同意なんだけど
高階関数っていうか、ラムダがあればいいっていう話だと思うんだけど、そりゃまあラムダを普通に引数に渡すだけでも、rubyのブロックより柔軟なことができる罠。 でもrubyでは利便性を選んだんでしょ。 大体他の言語でも、引数に2つ以上のラムダを渡すことなんか滅多にないし、常にブロックはメソッドの呼び出しより後ろにつけるって決まってるほうが、自分で書くときも他人のコード読むときも何かと迷うことが少なくなるとは思うよ。
266 :
デフォルトの名無しさん :2006/10/15(日) 09:42:07
途中で愚痴を書かざるを得ないくらい不愉快な本なんだから仕方ないだろwwwwww
ブロックで不満なら LISP 使えばいいじゃん。
JavaScriptで(ry
>> 232
> Fatal: ファイル C0X32.OBJ が開けません
その答えはすでに
>>208 が書いている。
MinGW と MSYS と MSYS-DTK入れると スタートメニューにMinGW - MSYS - msysが登録されるので それを実行すればターミナルが開いてbashが実行されます もちろん、GCCやMSYSの実行ファイルへはパスは通った状態です そこで、Rubyのソースを展開してあるディレクトリへCDして ./configure bashとかだと、通常はカレントディレクトリにパスを通さないので明示的に カレントディレクトリを指定しないと実行してくれません configureが終了するとMakefileが出来ているので make すると、コンパイルできるはずですけどねぇ
>>266 とりあえずスレ違いだから、どうしてもやりたいならスレ立ててやってくれ
あとスレ立てても別に告知しなくていいから
板内をRubyで検索するといくつかあるな
273 :
デフォルトの名無しさん :2006/10/15(日) 21:30:45
ブロックがいや → LISP という発想の幼稚さにはほとほとあきれるねwwwwwwwwwwwwwwww
274 :
デフォルトの名無しさん :2006/10/15(日) 21:33:01
いまスレ立てられないから誰かかわりに立ててください 「ムカツクRubyピッケル本をイラツキながらも読んでみるスレ」 本当にお願いいたしました。
275 :
デフォルトの名無しさん :2006/10/15(日) 21:37:16
1の内容は↓で本当にお願いしました。 本気でムカツクrubyピッケル本(この愛称も微妙だけどw)を イラツキながらも広い心で読んであげようといういまどき珍しい寛大なスレです。 他のrubyの本を読んでいてイラついている人もどうぞ。
Rubyを習うには、まず先に複数の他言語習得が必須ていうのは事実だよね?
つか、ruby使ってる人対象でしょ?
プログラミングPerlみたいな本だよな
279 :
デフォルトの名無しさん :2006/10/16(月) 05:56:22
真に受ける奴がいるとはな。
排除ばかりしてるからMLみたいに廃れる
3年前、Rubyって検索すると、10スレぐらい出てきた記憶がある。
Ruby vs Delphi とかあほなスレがいっぱいあったからね。
タイトルにRubyが含まれるスレがたくさんあればいいというもんでもなく
>>284 「排除」する前のMLがどんな状態だったか都合よく忘れてるだろお前
今もRubyで検索すると10個くらいスレがあるぞ
290 :
デフォルトの名無しさん :2006/10/16(月) 15:59:21
るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!る ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ 最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最 強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強 !!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強! !るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!! るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!る ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ 最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最 強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強 !!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強! !るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!
291 :
デフォルトの名無しさん :2006/10/17(火) 00:56:42
292 :
デフォルトの名無しさん :2006/10/17(火) 00:57:10
一番最初のインストールの確認でlocalhostにアクセスするのがうまくいかねぇ 文法勉強する前に挫折するとは思わなかったぜ
「hoge.rb」ファイルに $ep = "エピソード" と入力して保存し 別のファイルで require 'hoge' file = open("text1.txt","w") file.write($ep) file.close を実行後、text1.txtを開くと 「エピソード」が「エピメ[ド」 になってしまうのはなぜなのでしょうか?
295 :
293 :2006/10/17(火) 02:27:43
296 :
デフォルトの名無しさん :2006/10/17(火) 03:15:56
矢印キーの入力を検知して処理を行いたいのですがどうやればいいのでしょうか。
299 :
デフォルトの名無しさん :2006/10/17(火) 08:34:05
rubyでunix時刻を取得するにはどうしたらいいの?
Time.now.to_i のことかな
おお、ちょうど今レファレンスで見つけたところでした。そうでした!
code golfで遊んでいたんだけど $a=" bottles of beer on the wall" 99.downto(1){|i| $x=$y||="#{i}#$a" puts $x puts "#$x, "+$x[0..-13]+".", (i==1 ? "Go to the store and buy some more, #$y" : "Take one down and pass it around, #{i-1}#$a")+".\n\n"} で、 99 bottles of beer on the wall 99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 3 bottles of beer on the wall. 99 bottles of beer on the wall 99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 2 bottles of beer on the wall. 99 bottles of beer on the wall 99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 1 bottles of beer on the wall. 99 bottles of beer on the wall 99 bottles of beer on the wall, 99 bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall. になるんだよね。 代入がy||=x=iとか、x=y||=iとかだと、もしかしてxに代入できないのかと思ってちょっと見てるんだけど 自己代入が文脈を無視して常にy||(y = x = i)と展開されるようだと代入されないなあと思うんだけど、どうなんでしょう。 Ruby1.8.5です。
あーそういうことか。 y||=(x=i) は動くなら意図(x=i; y||=x)通りだけど、 x=(y||=i) だと代入はされても意図しない動作(y||=i; x=y) っていうかバグだ。 ごめんなさい。 前者についてはどうでしょうか。 parse.yでvar_lhs tOP_ASGN argとなっているので、argを全部持っていって評価しているならば 確かに俺の思ったように動かないと思うのですが……その先は読めないorz
しつもーん 文字列の置換をいちどにたくさん行いたい場合 str.gsub(/OLD1/,'NEW1').gsub(/OLD2/,'NEW2').gsub(/OLD3/,'NEW3').gsub(/OLD4/,'NEW4') と書いてしまうのですが、明らかにかっちょわるいです str.hoge( [[/OLD1/,NEW1],[/OLD2/,NEW2],[/OLD3/,NEW3],[/OLD4/,NEW4]] ) のように作りやすく便利な感じの代替方法って標準かなんかでないもんでしょうか
{ /ODL1/ => "NEW1", /ODL2/ => "NEW12, うほほーい }.each_pair do |oldstr,newstr| str.gsub(oldstr,newstr) end
ああごめん ハッシュより配列のがいいね 書き換える順番があるかもしれないしね
配列で置換したいならeachなりinjectなりすりゃいんじゃね? [[/can you/, "I can't"], [/\?/, '!!!']].inject("can you say brain washing?"){|i, a| i.gsub(*a)} => "I can't say brain washing!!!" 配列にこだわるならEnumerable#zipも使えそう。
309 :
305 :2006/10/17(火) 16:14:26
>>306 >>308 書き込んだ直後に構造が思いっきりinject向けだと気がつきました
arr = [[/OLD1/,NEW1],[/OLD2/,NEW2],[/OLD3/,NEW3],[/OLD4/,NEW4]]
arr.inject(str){|result,pair| result.gsub(pair[0],pair[1]) }
で充分満たされます…まあ、もうちょい短くなるといいんですが、injectなら普段でも思い出せそうです
injectは最初見たとき「こんなややっこしいのいらねー!」と思ってた
すんません、便乗ですが gsub を使う場合にはどうなりますか? arr = [[/OLD1/, 'NEW1'],[/OLD2/, 'NEW2'],[/OLD3/, 'NEW3'],[/OLD4/, 'NEW4']] arr.each{|old, new| str.gsub!(old, new)}
arr.each{|old,new| str=str.gsub(old,new)}
>>304 「後者は」つってんのは「前者だと代入されない」って意味だ。
315 :
デフォルトの名無しさん :2006/10/18(水) 01:52:22
316 :
デフォルトの名無しさん :2006/10/18(水) 01:58:17
ちょっとしたソフトハウスの者ですが、いままで貯めたCで書いたライブラリを 全部Rubyから呼べるようにした。 これだとアプリケーションの依頼があったときお客さんのところで即実装可能って感じ。驚く顔が目に浮かぶ。
そんなクマに俺様がイマーーー!!
>>314 事実はわかった。
ありがとう。
仕組みはわかんないけど。
そもそもこれ代入できると何かまずいの?
もしかして1.9では代入されたりして。
まずいまずくないじゃなくて、そういう仕様。 代入式は(代入の方向を考えれば当然だと思うが)右結合するので y ||= x = i は y ||= (x = i) と解釈され 以下と等価。 unless y x = i y = i end xには常に代入したいなら x = i; y ||= i とするしかない。
>>319 a ||= b って、
unless a
a = b # 代入がされないことがある
end
と等価なの?
おれはてっきり
a = a || b # 必ず代入が起こる
かと思ってたよ。
結果は同じなんだけどさ。
rdoc から manpage (roff) への変換ってどうやるの?
323 :
デフォルトの名無しさん :2006/10/20(金) 03:43:18
324 :
デフォルトの名無しさん :2006/10/20(金) 04:09:18
rubyでプログラムする際の統合開発環境って何がいいですか? ただのやつで
秀丸エディタ
Emacs
vim,rde,rubywin,freeride,scite
またこの話題か
てゆーか、開発環境ネタってオフィシャルサイトにまとまって載ってないの? もし無いなら載せるべきじゃね?
オフィシャルサイトの”Try Ruby!”で、何を入力しても以下のエラーが出るんですけど。。。 An error has occured. Try refreshing this page to reload your session.
ふつうに実行出来るけど。 そのエラーメッセージに従ってリロードしてみたらどうなるの?
Ruby で alarm 使えるようにならないかなあ。
>>332 リロードしてもエラーがでます。
何でだろう?
Cookie が制限されてるとか?と、適当なことを言ってみる。
>>335 その通りでした。
ありがとうございます。
337 :
デフォルトの名無しさん :2006/10/21(土) 00:13:19
ルビーのソースコードを型検査してくれるプログラムねーのかよ、 かいててマジでむかつくんだけど。
一般論として、そりゃ書き方がまずい 他の言語のように書こうとするでない
>337 型チェックないとムカつくなら別の言語使ったら? あえてRubyでやるなら ハンガリアンと手動型チェック駆使してみるとかw
perlみたいに変数の宣言だけでもあれば少しはマシなんだけどね
無いのと出来ないのは違うもんな。 型が重要なら Ruby は不向きだな。
# 泥沼になるので型の有用性についての議論は禁止
>>320 accessorつくってためしてみれ。
だからユニットテストできるように作れとあれほ(ry
345 :
デフォルトの名無しさん :2006/10/21(土) 08:10:30
irbで TKをつかって最後にTk.mainloopをするプログラム draw_poly.rb、を実行したとします。 そのご、そこでできるウインドウを閉じてまた、draw_poly.rbを実行すると application has been destroyedってでます。 draw_poly.rbを実行して実行を確かめて、ウインドウを閉じて、 draw_poly.rbを修正して draw_poly.rbを実行して実行を確かめて、ウインドウを閉じて、 。。。 を一々irbから抜けずにやるにはどうしたらいいんでしょうか?
346 :
デフォルトの名無しさん :2006/10/21(土) 08:13:13
TkCanvas.new(..)が1回irbを抜けないと上のようにエラーになるんですが 再度初期化みたいなのが必要なんですか?
347 :
デフォルトの名無しさん :2006/10/21(土) 10:39:44
Mathモジュールに、cでいうところのpowがないのはなぜですか? 5^1.5とかの数値が欲しいときに、いちいちlogをとったりして変換するのが面倒なのですが。
**
アッー! そんな演算子がありましたね。。
352 :
デフォルトの名無しさん :2006/10/22(日) 11:01:06
irbが、動かなくなってしまいました。T_T > irb /usr/bin/ruby: no such file to load -- ubygems (LoadError) といわれてしまいます。 他の環境だと動くんですが。 cygwinで、ターミナルはPoderosaです。 DOS窓で、irb.batは動くんですが・・・。
353 :
デフォルトの名無しさん :2006/10/22(日) 11:02:13
> which irb /usr/bin/irb > which ruby /usr/local/win/develop/ruby/bin/ruby cygwinのRubyと、OneClickInstallerのRubyが混在しちゃってるからかな・・・
もう役割を終えたんだよ。そっと休ませてあげなさい。
matzをか?
グラフィック作ろうと思ってRuby/tk使ってTk.mainloopで無限ループになってグラフィック作成前にグローバル変数宣言してるのをローカル変数だけにしたいんだけおどうしたらいい
359 :
デフォルトの名無しさん :2006/10/23(月) 15:47:32
BasicのLeft$、Mid$、Right$とかの関数と同じことをRubyでやりたいのだけど、 一発でできないのかなぁ(もちろん、日本語対応)? jcode.rb とかを require して each_char とかしないとダメ? どなたか教えてくださーい。
バッファ操作する時に使うこんな感じのメソッドって標準でありますか? def cstr2s(s) idx = s.index(0.chr) if idx s[0..idx-1] else s end end
s.split(/\0/)[0]
s[/[^\0]*/nm]
363 :
デフォルトの名無しさん :2006/10/24(火) 06:44:17
>>357 Thank you very much
┏┓ ┏┓ ┏━┓ ┏━┓
┏┛┗┓ ∧∧ ┗━┓ ┃ ┃ ┃ ┃
┗┓┏( つ ゚Д゚) ┏┓┃┏━━━┓ ┃ ┃ ┃ ┃
┏┛┗ \ y⊂ ) ┛┃┗━━━┛ ┗━┛ ┗━┛
┗┓┏ / \┓┃ ┏━┓ ┏━┓
┗┛∪ ̄ ̄ ̄\) ┛ ┗━┛ ┗━┛
ちょっとしたスクリプトを作ったので何らかのオープンソースライセンスで 配布したいのですが、Rubyに限らずプログラミング全般に関して初心者 ゆえに、まとめ方がよく分かりません。あと、コーディングの作法について も不安があります。 そこで、既存のプログラムを参考にしたいのですが、何かそれなりの規模 で初心者にも分析・理解しやすい、おススメのRubyアプリケーションまたは ライブラリはないでしょうか?
366 :
デフォルトの名無しさん :2006/10/24(火) 13:51:07
exec や system 使ったて外部コマンド実行した例何処かに載っていませんか?
>>366 Rubyの前に日本語をどうにかしようね。
とりあえず、こんなんでいいのか?
% ruby -e 'system("ls")'
. ..
%
>>359 indexは0から始まる
# left
p "abcdefg"[0,3]
# mid
p "abcdefg"[3,3]
# right
p "abcdefg".reverse[0,3].reverse
#=> "abc"
#=> "def"
#=> "efg"
$KCODE = "euc"
# left
p "あいうえおかきくけこ".split('')[0,3].join
# mid
p "あいうえおかきくけこ".split('')[3,3].join
# right
p "あいうえおかきくけこ".reverse.split('')[0,3].join.reverse
#=> "あいう"
#=> "えおか"
#=> "くけこ"
369 :
デフォルトの名無しさん :2006/10/24(火) 15:48:12
これと同じ事ってどうやればいいのでしょう? @a = ('0'..'9', 'A'..'Z', 'a'..'z');
370 :
359 :2006/10/24(火) 15:52:03
>>368 ありがとん!!
なるほど、split('') という手があるね。
いろいろ悩んだ末に
"あいうえおかきくけこ" =~ /^.{3}/
とかして $& と $' で left と right を代用しました。
でも、素直に left とか right があると良いのになぁと思いましたです。
(VBでない)BASICは少しの間やってたけど、 RubyでLEFT$やRIGHT$を使いたいと思ったことはないなあ。 p "1234567890"[-3,3] "890"
irb(main):001:0> puts $KCODE SJIS => nil irb(main):002:0> puts "1234567890"[-3,3] X0 => nil
そりゃバイト単位で切って新しい文字列作るからな 文字単位で切ってるわけじゃないし
class String def first(n) self[/\A.{#{n.to_i}}/] end def last(n) rindex(/.{#{n.to_i}}\z/) && $& end end
>>370 sjisだと
class String
def left(len)
self[0,len]
end
def right(len)
self[-len,len]
end
def mid(ind,len)
self[ind,len]
end
def jleft(len)
self[/.{0,#{len}}/s]
end
def jright(len)
self[/.{0,#{len}}\z/s]
end
def jmid(ind,len)
/.{#{ind}}(.{0,#{len}})/s.match(self) ? $1 : nil
end
end
こんなのであってますか?
> jleft > jright > jmid 吐いた
マルチバイト拡張を施して mb_left とかにすべきだよな
↓のやつがマニュアルどおりの結果になりません。padding に何を指定しても、
すべて空白になってしまいます。
http://www.ruby-lang.org/ja/man/?cmd=view;name=String#center p "foo".center(10,"*") # => "***foo****"
p "foo".ljust(10,"*") # => "foo*******"
p "foo".rjust(10,"*") # => "*******foo"
# => " foo "
# => "foo "
# => " foo"
ruby 1.8.2 (2004-11-03) [i386-linux]
ですが、どのへんに問題があるんでしょうか?
RubyCLRに期待棚
>>377 プレフィックスは嫌いなので
str.to_mb(:from => 'UTF-8', :to => 'EUC-JP').leftのほうがまだいい。
内部エンコーディング付きのStringクラスがあってもいいのかもしれん。
>>378 irb(main):007:0> "foo".center(10, "*")
=> "***foo****"
irb(main):008:0> "foo".ljust(10, "*")
=> "foo*******"
irb(main):009:0> "foo".rjust(10, "*")
=> "*******foo"
irb(main):010:0> VERSION
=> "1.8.5"
バージョンは?
>>371 >>373 そもそも、発端の359は「日本語対応」と言っているのに...
考えてみたら、こんなのに正規表現を使うってのもなぁ
>>380 ていうか、$KCODE があるわけだし String クラスが不完全なだけじゃ?
jcodeに誰も言及してないのは何か理由があるのかな?
>> 380 irb(main):001:0> "foo".center(10, "*") " foo " irb(main):002:0> "foo".ljust(10, "*") "foo " irb(main):003:0> "foo".rjust(10, "*") " foo" irb(main):004:0> VERSION "1.8.2" です。
アンケートなんだけどさ。 Rubyで書くときTestって使ってる?
すんません、RubyでTestが必要な規模のコードなんて書いたことありません
いちいち途中のデータを大量の p で表示させて確かめるの面倒だなあとか CGIだとネットの先のサーバからではなくローカルから読んでローカルに吐き出させるの面倒だなあとか そういうことは思わなくもないけど、Testユニットのうんたらかんたらで軽減するなら喜んで使う
>>387 > ネットの先のサーバから
Rubyでスクリプト作ってる奴はそんなのばっかだな
WebサーバからHTML持ってきて加工して表示以外のCGIはないんか
おいらがよく作るスクリプト * 他言語のソースを吐くもの(実装コードとユニットテストコード) * Excelとかをがーっと編集するもの(複数ブックにまたがる修正とか) * 簡単なCGI * 自動保守スクリプト など
>>388 FirefoxのGreasemonkeyもそうだけど、それだけ
「既存のサイトをいじってデータ取り出したい」という欲求需要があるってことなんだろうな
open-uriが最高に便利すぎるからな
def init(v) v=2 end val=1 init(val) p val とした実行結果が2になるようにしたいんですがどうしたらいいですか Cのポインタを使った参照渡しみたいなことができますか
def init(v) v=2 end val=1 p init(val)
def init(v1,v2,v3) v1=4;v2=5;v3=6 end val1=1;val2=2;val3=3 init(val1,val2,val3) p val1;p val2;p val3 この場合の出力結果を 4 5 6 にする場合はどうしたらいですか
irb の問題なのか ActiveSupport の問題なのかよくわからないのですが、 % irb require "irb(main):001:0> require "irb/completion" => true irb(main):002:0> require "active_support" => false irb(main):003:0> "hoge".plu<TAB> ↑の箇所で <TAB> で補完しようとすると、 irb(main):003:0> "hoge".pluralize" のように、メソッドの後ろに '"' がひっついてきてしまいます。 コレなんででしょうか?
わお。複数の返り値がもてるとは知りませんでした。 勉強になりました。ありがとうございました。
でもダサいね
return のとこは配列やハッシュで返すほうがカッコいいと思う 若干だが ヤマサ醤油とヒゲタ醤油のどっちがカッコいいかとかと同レベル
>>395 "".to_st でも再現する。
ActiveSupportは無関係。
>>400 おお、ホントだ。再現しますね。
これはそういう (望まれた) 仕様なんでしょうか?それとも単にバグ?
起動時にきまって開くwebページを一度に開くスクリプトを書いておりまして、 URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。 ある程度できたのですが、 一行目の最後に改行が来ると決まって例外が発生します。 テキストの扱い方がまずいのかなと思い、 ファイル全体をprintしましたらキレイに出力されました。 どうのような原因がかんがえられるでしょか? よろしくお願いします。
>>402 まずその例外を見せろ。話はそれからだ。
リファレンスを引数に取れないってことでしょうか?
405 :
402 :2006/10/26(木) 18:27:55
ちなみにnep/http のPOSTを使用したりしています。 C:/ruby/lib/ruby/1.8/net/http.rb:2019:in `read_status_line': wrong status line: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">" (Net::HTTPBadResponse) from C:/ruby/lib/ruby/1.8/net/http.rb:2006:in `read_new' from C:/ruby/lib/ruby/1.8/net/http.rb:1047:in `request' from C:/ruby/lib/ruby/1.8/net/http.rb:842:in `post' ほんとなんとなくでも良いのでアドバイスお願いします。
腹イテェ
>406 大丈夫?(´・.・)っ【胃腸薬】
>起動時にきまって開くwebページを一度に開くスクリプトを書いておりまして、 >URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。 と聞いて、 >ちなみにnep/http のPOSTを使用したりしています。 という流れを予想した奴が何人いただろうか。
初心者スレだから 予想できなかった なんつーかあれだ、簡単で確実で動作の間違いない小さいスクリプトから 少しずつ改造して大きくしていくというアプローチがいいと思う
def add(v1,v2) v1+=1; v2+=1 end def func(v1,v2) add(v1,v2) end def main v1=1;v2=2 while true func(v1,v2) p v1;p v2 end end main で出力結果が 2 3 3 4 4 5 になるようにしたいんですけど、どうしたらいいですか
自己解決しました失礼しました
n = gets.to_i を厳密に整数値だけ受け付けるようにしようとしたら/^(\d+)$/でチェックするしかないの?
begin n = Integer(gets) rescue puts "数字じゃないよ。" end
>>414 ありがとうございます。
>Integer(gets)
これはじめてみるんですが、文法的にはどういうことなんですか?
キーワードか何かあったら教えてください。
Integer はここではメソッド名。 gets はメソッド呼出しのカッコ省略。 0xa とかも受け付けるけどね。
「わかった」感じで簡潔に書きすぎるのも初心者スレ的には問題なのかもな
>>417 全く同意だがこの場合は単にまだ知らんだけだろう
Integerは組み込み関数
厳密にはRubyには関数は存在しないが、
なにやら便利な感じに使えるようにあらかじめいくつかそれっぽく定義されている
整数とみなせない字面を引数に持つと、to_iのように無理には変換せず例外を返す
書き進め方のしつもん。 step1の結果を利用してstep2をやってその結果を利用しstep3をやると目的が叶うという 大規模でも複雑怪奇でもない程度のプログラムを作ります。 その1 hoge=Hoge.new(init) # Hogeのインスタンス変数にいろいろ格納 hoge.step1 # step1の中でインスタンス変数を読み書きしてます hoge.step2 # step2でもstep1で使ったインスタンス変数を使ってます puts hoge.step3 # 表示 その2 output1=Hoge.step1(init) # step1は引数を取り結果データを返します output2=Hoge.step2(output1) # step2も同様 puts Hoge.step3(output2) # 表示 その3 puts hoge.step3(init) # 最終データだけ表示 # def step3(init) # data=step2( step1(init) ) # # dataを色々する # : どれがいちばん「普通」ですか? インスタンス変数やクラス変数といった便利っぽいものがメソッド間の受け渡しで使えるのに、 見える必要のない中間処理上のデータを引数として渡していくのは変な気もします。 でも、個人的には「食ったものと出したものは全部見せろ」的なその2の書き方が染み付いてます。
よーわからんが、クラスのインスタンスを生成するという行為が真っ当ならその1 (ただしstep1とstep2はstep3の定義の中で呼ぶようにしてstep3だけ明示的に実行) このクラスのインスタンスを生成する、という行為がいったいどういう意味なのか 頭を悩めてしまうような「ただ適当にまとめただけのクラス」ならその3 (ただしstep3は傍目にも最終結果であることが明白な名前にする) その2は前時代的なので忘れてよし こんなんでどう
いまRubyの勉強中なんですが、Mix-inってObjCとかJavaでいうプロトコルとかインターフェイスみたいなもんですか?
>422 Javaは軽く噛った身。 プロトコルは解らんが JavaのinterfaceとRubyのmoduleは 一見似てるようで全然違う印象。 Javaのinterfaceは クラスに依らない多態を実現する為に使い 実装は各クラスに任せるんだが Rubyのmoduleは 複数クラスに共通(とは限らないが)の実装をする為に使い クラスに依らない多態はRubyの仕様を利用して 「複数のクラスに同名のメソッドを実装」すれば良い。
424 :
423 :2006/10/29(日) 08:57:12
gsub('クラスに依らない') { クラス階層に依らない }
Centosでrubyの1.8.1を使ってるのですが、日本語を出力 させようとすると(putsとか)文字化けしてしまいます。 UTF-8で普段使ってるので、スクリプトの冒頭に #!ruby -Kuを書いてみたり、 ruby -Ku スクリプト名で 指定しても結果は変わりません。どうやればいいのでしょうか?
何を出力させようとしてるの?
>>427 ruby以外でも、(perlとかも)文字化けしてしまうので、
ruby固有のケースではないみたいです。
システム自体の設定だと思うので、他で質問するか
もうちょっと自分で調べてみることにします。
512バイトずつ読み込んで改行を検索しカウントして破棄するという動作にすべきだよな! readlinesでファイルを全て読み込みなおかつ配列に変換して保持するなど システムに多大なる負担をかける悪魔のごとき所業であり断じて許すわけにはいかん
each_line でカウンタをインクリメントすればいいんじゃない?
なら wc -l とか grep -c '' とか *nix のコマンドで。
434 :
デフォルトの名無しさん :2006/10/30(月) 03:03:26
>>426 rubyのスクリプト自身は、UTF-8になってる?
435 :
425 :2006/10/30(月) 10:13:56
やはりファイルの行数取得関数はないんですね。 レスをしてくれた皆さんありがとうございます。 とりあえず、行数をインクリでカウントして対応しようと思います。
>>426 どこに出力して化けてるといってる?
単にUTF-8に対応してない端末エミュレータ使ってるとか。
RMagick入れようと思ってrubygems-0.9.0のインストールをしているんだけど 下記みたいなエラーが出てしまってインストールできません <--- lib/rubygems <--- lib As of RubyGems 0.8.0, library stubs are no longer needed. Searching $LOAD_PATH for stubs to optionally delete (may take a while)... ...done. No library stubs found. C:/DT/ruby/lib/ruby/site_ruby/1.8/rubygems/package.rb:237: [BUG] Segmentation fault ruby 1.8.5 (2006-08-25) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. OSはWinXP SP1です。Win2KSP4でも同じようなエラーが出て手元にあったlibeay32.dll、ssleay32.dll差し替えまくっていたら インストールできたんだけどそのときインストールに成功したDLLを使ってもインストールできませんでした 対処法を教えてください
438 :
デフォルトの名無しさん :2006/10/30(月) 22:11:41
>>423 どうも。
インターフェイスみたいに形式だけ指定するんじゃなくて、実装を伴うんですね。
File::join は Array::join みたいに item を to_s して欲しいなあ。
440 :
デフォルトの名無しさん :2006/10/31(火) 15:07:00
下記プログラムで、pingを使っているのですが、 使われていないネットワーク(IP)の時は、結果が得られるまでに時間がかかります そこで、timeoutを入れればいいと思ってるのですが、どこにいれていいのか、わかりません どなたか、わかるかたお願いします require 'icmp' include ICMPModule include Socket::Constants host = ARGV.shift || '127.0.0.12' ai = Socket::getaddrinfo(host, nil, Socket::AF_INET)[0] print "PING #{ai[2]} (#{ai[3]})\n" sock = ICMPSocket.new addr = ai[3].split(".").collect{|i| i.to_i }.pack("cccc") sockaddr = make_sockaddr_in(AF_INET, 0, addr) 次に続く
441 :
デフォルトの名無しさん :2006/10/31(火) 15:09:54
req = ICMP.new req.icmp_type = ICMP_ECHO req.icmp_code = 0 req.icmp_id = $$ & 0xffff rtts = [] nsend = 0 Thread.start do loop do buf = sock.recv(65535) recv_time = Time.now.to_f iph, repl = ICMPModule.split(buf) if repl.icmp_type == ICMP_ECHOREPLY && repl.icmp_id == req.icmp_id send_time = repl.icmp_data.unpack("d")[0] rtt = (recv_time - send_time) * 1000 print "%d bytes from %s: icmp_seq=%d ttl=%d time=%.3f ms\n" % [repl.size, iph.ip_src, repl.icmp_seq, iph.ip_ttl, rtt] rtts.push rtt end end end 1.times { |i| req.icmp_seq = i req.icmp_data = [ Time.now.to_f ].pack("d") req.setup sock.send(req, 0, sockaddr) nsend += 1 sleep 1
442 :
デフォルトの名無しさん :2006/11/01(水) 00:11:53
expect.rb で、telnet ではなく script を使いたくて下記のように書いてみたの ですが、testlog が空(0byte)で作成されるだけで、実行した文字列 'echo "hoge"' や echo の実行結果としての文字列 'hoge' が testlog に記録されていません。 どのようにすれば良いのでしょうか? $ cat test.rb require 'pty' require 'expect' class ScriptTest def start PTY.spawn('script testlog') do |r_f, w_f, pid| w_f.sync = true $expect_verbose = false timeout = 3 r_f.expect('$ ', timeout) do w_f.puts 'echo "hoge"' end end end end a = ScriptTest.new a.start $ ruby test.rb $ ls -l -rw-r--r-- 1 hoge hoge 513 2006-10-31 23:43 test.rb -rw-r--r-- 1 hoge hoge 0 2006-11-01 00:03 testlog $ cat testlog $ ruby -v ruby 1.8.2 (2005-04-11) [i386-linux]
>>442 scriptのつかんでいる入出力はtty(pty)じゃないとだめ、とか?
444 :
442 :2006/11/01(水) 07:32:05
>>442 漏れの環境だと、最後に w_f.puts 'exit'; r_f.read を入れてやったら動いた。
s += line というのを文字列sが10MB分くらいになるまで繰り返すんですが 前もってバッファを確保しておいて高速化してくれるものはないですか? StringBuffer/Builderみたいなの。
知らんけど、s += lineより s << line のほうが
配列にpushしていって、最後にjoinすれば? バッファを用意しておくよりは遅いかもしれないけど、計算量的には同等のO(N)になるし、10MBもあるなら文字列の連結を繰り返すO(N**2)よりは断然早くなることは期待できる。 まあバッファを用意できる方法がもしあればそれに越したことはないんだろうけど、もしないなら配列にpushしてjoinも捨てたもんじゃないと思われ。
試してみた # 文字列に直接連結 s = "" t = Time.now for i in 1..10000 s += "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" end f = File.open("test1.txt", "w") f.write s f.close p Time.now - t # 配列格納後に連結 s = "" t = Time.now a = [] for i in 1..10000 a << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" end s = a.join f = File.open("test2.txt", "w") f.write s f.close p Time.now - t 結果 10.281 0.032 サイズは 1MBに満たないけど、けっこう差が出るな。ruby 1.8.5 (2006-08-25) [i386-mswin32] Athlon64 2800+
その環境で s << "aaa... だとどれくらいになる?
>>450 やってみた。こっちも速かったのでデータ量を100倍(およそ100MB程度)にしてみた
ただし、ファイルの書き込みはなし(100MBだと本来の速度が分かりにくくなるため)
結果は、ほぼ join と同じだけど、統計的にはわずかに配列のほうが速いかな?
微妙すぎるので、CPUの違いで結果が変わるかも知れませんね
1.219 (配列 join)
1.234 (文字列<<連結)
それにしても、+=演算子があんなに遅いのはなんででしょ?
単純計算で300倍くらい違ってるんだけど、どこでそんなに時間食ってるのやら…
# 配列格納後に連結
s = ""
t = Time.now
a = []
for i in 1..1000000
a << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
end
s = a.join
p Time.now - t
#文字列に<<演算子で連結
s = ""
t = Time.now
for i in 1..1000000
s << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
end
p Time.now - t
s+="hogehoge" はRubyのパーサが中で s = s + "hogehoge" と置換していて、Stringのインスタンスを毎回生成するので遅い。 Javaで s+"hogehoge"+"hugahuga" としたときに内部で(俺の記憶では) new StringBuffer(new StringBuffer(s).append("hogehoge")).append("hugahuga") となっていたのと似ている。 まあ何カ所か短い文字列を結合するだけでは違いは出ないと思うが。 あと、実用できないけど、この場合 x = "aaa...." for i ... a << x のほうが早いのではないかと。
>>451 実験ありがとう。配列join早いなあ。
ところで、試してないけど、この例みたいに回す回数が決まってるなら、
a = Array.new(1000000)
for i in 1..1000000
a[i] = "aaa...
end
の方が早かったりしないかな?
>単純計算で300倍くらい違ってるんだけど、どこでそんなに時間食ってるのやら… GC。a+=b ってのは a = a + b の略だから、これをする毎に前の a がごみに なる。a << b は a を延長して追加するからごみが出ない。Rubyは単純な mark&sweepだからごみが増えればGCの処理時間も比例して増える。 参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。 ごみになった瞬間に回収されるから、mark&sweepの負荷がない。
単純にコピーする量が増えるからじゃないの? +=の場合は、 a aa aaa aaaa aaaaa っていう風に、内部でコピーしなければならない文字列の長さがどんどん長くなっていくから、N回のループで(N*N/2)回(三角形の面積)かかる。 追加していくタイプは、一回一回の操作にかかる時間はどんなにaaaa・・・の長さが長くなっても、一定時間で追加できるから速い。 もちろんGCのほうにも同じだけの負荷は回っていると思うけど。
GCの処理量とか考えてコード書いたほうがいいのか ピンと来ないし面倒だなあ
<<, joinが最適化いというのは何かがおかしい。 素直にStringBuilder的な物をサポートすべきだな。 といってもされないだろうからRuby.NETに期待だ。
大きいファイルを扱うような時は、こまめにGCを動かさないとひどいことになるよ
スプリクトが走ってる環境を知る手段って、 RUBY_PLATFORM 以外に何かありますか?
460 :
442 :2006/11/01(水) 23:59:08
ありがとうございます
>>445 次のようにしてtestlogがほぼ期待通りに生成されることを確認しました。
require 'pty'
require 'expect'
class ScriptTest
def start
PTY.spawn('script testlog') do |r_f, w_f, pid|
p [:pid, pid]
w_f.sync = true
$expect_verbose = false
timeout = 3
w_f.puts 'echo "hoge"'
STDOUT.flush
r_f.expect('$ ', timeout) do
w_f.puts 'exit'
end
r_f.read
end
end
end
a = ScriptTest.new
a.start
STDOUT.flushは気休めだと思うけど、なんとなくつけてみました。
>>457 アホやなぁ。
RubyはJavaと違ってStringがmutableなんだよ。
だからRubyのStringはStringBufferなんだよ。
+=のとき最適化されないのはおかしいとか言ったら張ったおすよ。
Javaではそもそも+=すら出来ないでしょ。
>>454 >参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。
遅かったよ。GCがどうとかは的外れだな。
参照カウントがメインのPHPでも遅いな。
GCがネックかどうか、ってことなら GC.disableしてからループ回してみたらどうだろう。 俺はGCがネックでもネックでなくても構わんのでやらんけどw
>>462 そうか?俺のとこではかなり違うけど。
#### python 0.01秒 ####
import time
t1 = time.time()
s = ""
for i in xrange(50000):
s += "a"
t2 = time.time()
print t2 - t1
#### ruby 17.346秒 #####
t1 = Time.now
s = ""
50000.times do
s += "a"
end
t2 = Time.now
p t2 - t1
>>465 なんでPythonとこんなに違うのか知らんけど、GCのせいならゴミの数が同じ
下のコードで早くなるのはおかしくね?
t1 = Time.now
100.times do
s = ""
500.times do
s += "a"
end
end
t2 = Time.now
p t2 - t1
>>461 アホやなぁ。RubyのStringでどうやってバッファを確保しろっちゅんじゃ。
469 :
デフォルトの名無しさん :2006/11/02(木) 03:22:57
プログラム中でDir.chdirでディレクトリを変更しても、プログラムが終了すると元の ディレクトリに戻ってしまうのですが、そうならないようにする方法はありますか?
スクリプトを起動した元のシェルに移動先ディレクトリのパスを渡して終了後に移動してもらえ
他の言語の話ばかりになってしまったが
>>448 参考までに、Perlなら配列のサイズを広げるオーバーヘッドで、pushしてjoinより単純に連結する方が速くなるそうだ。IBMの記事より
>>452 Javaの部分が間違ってる
s+"hogehoge"+"hugahuga"
はコンパイルすると文字列定数はくっついて
new StringBuffer().append(s).append("hogehogehugahuga").toString()
もし"hogehoge"が変数tでも
new StringBuffer().append(s).append(t).append("hugahuga").toString()
で生成するStringBufferは1つ
>>461 >RubyのStringはStringBufferなんだよ
少し違う。たしかに可変長だがStringBufferはバッファが不足したら一気に元の2倍(自信なし)の容量を確保する。newのコストを減らすために。
>Javaではそもそも+=すら出来ないでしょ
できます。コンパイルされてStringBufferの式になおされる。
そして話が噛み合っていない人たちがいるようだが、エスパー的に解釈して
457は、JavaのStringBuilderのように、あらかじめバッファを確保しておく機能が必要だと言っている。コードで示せば
new StringBuilder(131072);
461は、JavaのStringは一度生成したらreallocできない、可変長という意味でStrinBufferと同じだと言っている。
速度気になるならC使ってライブラリ書く手もある GC はメモリを自前で管理する手間が少なくなるが 逆にそれを管理するのは面倒なものだよ
RubyをやればやるほどPythonが魅力的になってくる
>>471 エスパーにもう一つ質問したいんだが、RubyのStringで<<が何らかの形で最適化だか高速化だかがなされるのは、どういう仕組み?
文字列本体の内部表現として、「連続するメモリ領域(Cでいう配列)」を採用しているならば、連結する度に毎回malloc/reallocの類をするのは避けられないのでは?
・Rubyのpushが速いのは、線形リストの連結一回一回は一瞬でできるため。
・StringBuffer等バッファを使うと速いのは、一回一回の連結時にはすでに存在するメモリ領域に入れればいいだけであるため。
・Ruby等の+=然り、Perlのpush然り(?)、が遅いのは、連続するメモリ領域の形になっていて(つまり線形リストの類ではない)、おおよそ連結するたびに、@全体をメモリ確保する処理と、A元のデータをコピーする処理が発生するため。
っていう感じの認識なんだが、そうするとRubyの<<が速い理由がよくわからん。
>>452 の言うとおり、RubyのStringはStringBuffer的な機能を果たすのか?
ソース嫁ばわかることかもしれんが、ちょっとした気の迷いで他力本願でいってみる。
気付いたら長文になってた。ゴメソ
Ruby の文字列でも、連結するときにはバッファをあらかじめ少し広めに取っているんだがな。
連結するときになってから広くとっても意味なくね?
477 :
デフォルトの名無しさん :2006/11/02(木) 10:11:57
>>470 Shell.cd(dir)とやると
shell: current dir: なんとか
と表示されるのですが、直後にp Dir.pwdとすると、カレントディレクトリは
変わっていませんでした。
スクリプトを起動した元のシェルに移動先ディレクトリのパスを渡す・・・というのはどうやる
のでしょうか。
StringBuffer の必要性はわからんでもないけど、大抵のケースは String で十分だし、 少なくとも、標準添付されなくてはいけないほどの需要は無いんじゃないかな。 どうしても必要なら自分で拡張ライブラリで実装すれば良いんじゃね?
>>477 Rubyスクリプトのhoge.rbに
END {
puts '/home/user/path/to/move'
}
とかputsで移動先パスを出力させておいて
DIRNAME=`./hoge.rb`
cd $DIRNAME
というシェルスクリプトでRubyスクリプトを起動する、ってことなんじゃねえの
死ぬほど格好悪く泥臭いがほぼ確実に動作するな
それはhoge.rbが標準出力に文字を出力するタイプのスクリプトだった場合面倒で死ぬ(w raiseでエラーメッセージとして標準エラー出力にパスを出したほうがよくね
>474 << はメソッド呼び出しだが、+= は代入式に展開される。 そうすると、全然 Ruby 側の手順は変わってくるぞ。 s += 'hoge' の場合 ・まず s = s + 'hoge' に展開される ・s のメソッド String#+ が呼び出される ・String#+ は s と 'hoge' した新たな String オブジェクトを作って返す ・新たな文字列が s に代入される ・古い s の処理(RubyのGCって何使ってたか忘れたが、マークを外す処理か、実装によっちゃ即廃棄処理だな) s << 'hoge' の場合 ・s のメソッド String#<< が呼び出される ・String#<< は内部領域を拡張してそこに連結する(C言語のrealloc()なのかな?) 差は歴然だろう。 確かに両方とも新たな領域の確保と古い領域の破棄はするんだが それをRubyのGC管理下でやるのとC言語のメモリ確保でやるのとじゃ全然違う筈。
エスケープの仕方教えてください p "a'b".gsub(/'/,"\\\'") abb こうなってほしいのですけど。。 a\'b
>>482 エスケープ文字を3つから4つに増やしてごらん (5つでもいいけど)。
理由はRubyリファレンスマニュアルのString#gsub項を見ることだな。
"a'b".gsub(/'/){"\\\'"}
Ruby-1.8.5:ruby.h(334) にて構造体定義 struct RString {   struct RBasic basic;   long len;   char *ptr;   union {     long capa; /* たぶんcapacityのこと */     VALUE shared;   } aux; }; 使用しているバイト長とは別に、再確保せずに扱える許容量が定義されている。 許容量を超えるバイト数を扱う際に再確保される。 $ grep -nw capa string.c ...色々略... 717:       capa = (capa + 1) * 2; 782:       capa = (capa + 1) * 2; とあるから、増えるときはおよそ2倍ずつ。 許容量が減ることはない気がする。
>>482 初心者は str.gsub(/.../, "...") 形式を使ったらダメ。ゼッタイ。
str.gsub(/.../) { "..." } だけ使うこと。
ほわい?
今回みたいにはまるやつがいるからだろ
RubyリファレンスマニュアルのString#gsub項を見てパッと理解できるような香具師は既に初心者ではないから。
490 :
デフォルトの名無しさん :2006/11/03(金) 02:46:42
こんばんわ a = `command` としたときに、標準出力しかaに入りません。 標準エラーを得るにはどうしたらよいか教えてください。
>>477 念のために書いておくが、
>>479 みたいなシェルスクリプトを
hoge.sh とか保存してシェルから実行しても意味が無いからな。
それだと Ruby スクリプトの時と同じでサブシェルのカレントが
変わるだけ。
例えば bash なら .bashrc に関数を定義してその関数経由で
Ruby スクリプトを実行すればおk。
foo(){
builtin cd "`hoge.rb`"
}
>>490 a=`command 2>&1`
標準エラーだけ欲しいなら
a=`command 2>&1 1>/dev/null`
csh系は知らん。
492 :
490 :2006/11/03(金) 03:39:35
師匠どうも。
>>490 require "open3"
a = nil
Open3.popen3("command"){|stdin, stdout, stderr|
a = stderr.read
}
なんてのも。
これならシェルには依存しない。プラットフォームには依存するが。
494 :
デフォルトの名無しさん :2006/11/03(金) 13:18:34
$ echo 'this is a pen' | ruby -ne 'a = $_.split ; a.shift ; puts a' is a pen 先頭のフィールドを削除して改行で区切って出力したいのですが 変数 a を使わずに出来ますか? ruby 1.8.5 (2006-08-25) [i486-linux]
puts 'this is a pen'.split[1..-1]
>>495 ありがとうございます
-1 で配列の最後の要素になるんですね
497 :
デフォルトの名無しさん :2006/11/03(金) 23:22:33
table = {"A" => 0.4, "B" => 0.3, "C" => 0.2, "D" => 0.1} というハッシュがあるとき,Aが40%,Bが30%,Cが20%,Dが10%の確率になるように ABCDを取り出したいのですがいい方法を教えてください 以下のような方法でも一応できたけどコストが大きすぎです matched = false while !matched key = table.keys.sort_by{rand}.pop #キーをランダムに取得 if table[key] > rand #比較 #このときのkeyをつかう matched = true ... end end
Rubyイラネ C#を使おう −−− というわけで、このスレ終了 −−−
MS信者乙
>>497 こんな感じでいいんじゃね?randが一様な乱数を返すのが前提だけど。
def get
table = {"A" => 0.4, "B" => 0.3, "C" => 0.2, "D" => 0.1}
ratio = rand
key = nil
table.each do |key, value|
if (ratio -= value) <= 0
break
end
end
key
end
result = Hash.new(0)
1000.times do
result[get] += 1
end
p result
cgi.rb経由で引数を受け取る ↓ 引数を利用してサイトを巡る ↓ 巡ったサイトを処理してデータ抽出 ↓ 抽出データを整形してブラウザに表示 というCGIスクリプトを書いてます。 途中の処理が遅くてユーザーにブラウザの中止ボタンなどを押される可能性があるので、 そういう時にはPStoreあたりでサーバにいくつかのデータを途中保存したいと思います。 「ブラウザ側からCGI動作を中止された」ことを検知する方法はありますか?
ユーザに中止ボタン押されてもCGI自体は最後まで動くんじゃなかったっけ? その例ならデータの抽出整形までは完了するはずだからその後適当に保存なり何なりすれ
504 :
デフォルトの名無しさん :2006/11/04(土) 23:50:01
rubyで2進数の計算したいのですが教えてください。 例えば、a=0011;b= 0001;のときc=a+bとするとc=0100となるようにしたいのですが、 0baなどとしてもダメだし、String#%メソッドもうまい使い方がわかりません。
0b0100.to_s(2) "0b0100".to_i(2)
クラスをモジュールというものに作り変えようと思いました。 よく考えたらインスタンスを1回しか作らないので。 module Hoge def data return 'hello' end def hello puts data end module_function :hello end Hoge::hello でも undefined local variable or method `data' for Hoge:Module (NameError) とか怒られます。…なんで?
> よく考えたらインスタンスを1回しか作らないので そんなんいちいち気にするな禿げるぞ 添削に出すのでもない限りクラスで作っとけ
def self.data
>>506 >undefined local variable or method `data' for Hoge:Module (NameError)
>とか怒られます。…なんで?
Hoge::hello() には、dataというローカル変数もないし、data()というメソッドも定義されていない。
Hoge::hello()はクラスメソッドだけどHoge#data()はインスタンスメソッドだから、前者から後者は見えない。
module_function :data
を追加すればいいのかな。あるいは
module Hoge
module_function
def data; return 'hello'; end
def hello; puts data; end
end
>>506 > よく考えたらインスタンスを1回しか作らないので。
特異メソッドにでもしとけ。
class << (Hoge = Object.new)
def data; return 'hello'; end
def hello; puts data; end
end
Hoge.hello
クラスであることの意義とか考えたことないな class なんとか って書くとまとまりになって メソッド定義でいちいち def なんとか.hoge と書かないといけなくて面倒だけど a=なんとか.new と最初に実行するように俺の中で決めておくと def hoge と書いても動くようになるので書きやすくて便利とかそういう程度の認識しかない
Ruby/Ruby on Rails1日目の初心者なんですが教えて下さい。 入力内容を表示する確認画面を作っているんですが、 hoge_index.rhtml ------------ <%= text_field "account", "name" %> ------------ hoge_controller.rbにて ------------ def confirm @account = @params end --------------- hoge_confirm.rhtmlにて ------------ <%= @account['name'] %> --------------- としてindexよりconfirmへ遷移した場合 indexページにて入力したnameの内容が表示されません。 @inputのみをタグ内部に記述すると@params全てが列挙されます。 参照の仕方を間違っているのか、何か根本的に間違ってるのでしょうか?
513 :
デフォルトの名無しさん :2006/11/06(月) 12:25:45
質問です。 クッキーを書き込む場合以下の様なコードで実現出来るとマニュアルに書いてあったのですが ブラウザのクッキーファイルに全然書き込まれません… どうしてでしょう? cookie = CGI::Cookie::new({'name' => 'name', 'value' => 'TEST', 'expires' => Time.now + 60 * 60 * 24 * 10}) cgi = CGI.new cgi.out("cookie" => cookie){ "string" }
>>513 それの前に Content-type:text/html を出力してしまってるに3ガバス
クッキーはヘッダですので最初に送って下さい
515 :
513 :2006/11/06(月) 23:15:32
>>514 まさにその通りでした!
これでまた一つ勉強になりました!ありがとうございました。
516 :
デフォルトの名無しさん :2006/11/07(火) 04:14:59
518 :
デフォルトの名無しさん :2006/11/07(火) 11:38:04
windowsXP下でのrailsについての質問です。 サーバーを起動するときに ruby script\server のようにいちいちプロンプトに入力せずに サーバーを立ち上げるよい方法はありますか?
せんせいしつもんです。 例外のメッセージと同じような感じで、任意のオブジェクトを持ち出すことはできますか? def main begin action1 action2 # メソッドのすげえ深部でエラーErrorAtAct2が起こる action3 rescue ErrorAtAct2 # 「action2深部でエラーを起こしたときのハッシュデータを利用して別の処理をしてエラー回復」 end end ということをしたいです。 例外を起こしたメソッドの中でならハッシュデータにアクセスはできるんですが、 できればここのmainメソッドでまとめてエラー回復処理を書きたいです。 例外メッセージにハッシュを出力するとハッシュへの復元がなんだか面倒です。
>>519 例外オブジェクトにハッシュを持たせればいいんじゃね。
class ErrorAtAct2 < StandardError
attr_reader :data
def initalize(data)
@data = data
end
end
def action1
h = {:a => 1 raise Error
>>520 ごめん。途中で送って島田。
def action1
h = {:a => 1}
if エラー?
raise ErrorAtAct2.new(h)
end
end
def main
begin
action1
action2 # メソッドのすげえ深部でエラーErrorAtAct2が起こる
action3
rescue ErrorAtAct2 => e
# 「action2深部でエラーを起こしたときのハッシュデータを利用して別の処理をしてエラー回復」
p e.data
end
end
522 :
デフォルトの名無しさん :2006/11/07(火) 20:40:26
523 :
デフォルトの名無しさん :2006/11/07(火) 22:01:18
>>517 標準のLoggerってXMLで設定できないし、
>>516 で書いたようにLoggerの継承関係とかないですよね?
backquoteを使うとシェルのメタ文字をエスケープする必要があって面倒なので、 シェルを介さないsystemでコマンドを実行しているんですけど、 コマンドの実行結果(stdout, err両方)を文字列で取得したいんだけどどうすればいいんですか。
>>525 環境かいてませんでした。すんません。
mswin32なんでopen3だとfork がNotImplementedErrorになりました。
でもそこからリンクをはってあるpopen4だといけました。
ありがとうございます。
527 :
513 :2006/11/09(木) 07:23:20
すみません、またまたわからないんで質問よろしくです。 CGI#out でクッキーを出力するやり方はわかったのですが、 例えばoutのブロックの中では文字列しか出力出来ませんよね? 途中で色々処理したい場合なんかはどうやればよいのでしょうか? これはもちろんエラーですが、以下の様な感じの場合です。 cgi.out("cookie" => cookie){ (0..4).each{|i| print i + "\n" } }
cgi.rbってやっぱわかりにくいよね cgi=CGI.newとしたとして、具体的に何が作られるんだかさっぱりです cgi1.paramsとcgi2.paramsの違いあるのかとか cgi1.outとcgi2.outが同じページになるのかとか
>>528 CGIってSingletonだとずっと思っていたが、そうじゃないのね
しんぐるとんってなに?(素)
…何度newしても最初のインスタンス1個だけが便利な感じで返ってくるような再利用構造?
うん、そうだね、そうあるべきだと便利だけど、cgi.rbは微妙にそのようにはなってないな。
#!/usr/bin/ruby -Ke
require 'cgi'
cgi1=CGI.new
cgi1.out {"cgi1:#{cgi1.params}<br>"}
cgi2=CGI.new
cgi2.out{"cgi2:#{cgi2.params}<br>"}
http://oreserver/test.cgi?hoge cgi1:hoge
Content-Type: text/html Content-Length: 13 cgi2:hoge
cgi.outをCGI.newしたメソッド以外でも使うのなら
作ったcgiインスタンスを引数とかで連れて行くしかないな
531 :
513 :2006/11/09(木) 12:41:41
自分で解決しました。全然意味が分かってなかった様です…
532 :
513 :2006/11/09(木) 13:36:42
やっぱりわかってなかったです… cgi.headerでやればいいと思ったのですが これだと食べてくれません… 何方か助言を。
533 :
デフォルトの名無しさん :2006/11/09(木) 13:50:56
ruby初めて三日目の初心者ですが質問があります。 インスタンス変数をkeyに、そのインスタンスのアドレス(ポインタ?)をvalueに持つhashを 作成したいのですが、アドレスをどういう形で得るのかが分かりません 簡単な質問かもしれませんがよろしくお願いします 館今日はWinXPでrubyのヴァージョンは1.8.5です
ヴァヴァヴァ♪ヴァージョン♪ヴァージョン♪ヴァージョン♪
Cのようなアドレスを得る方法はない
537 :
513 :2006/11/09(木) 15:22:44
>>535 いや、クッキーを複数出力したいんじゃないんです。
それはもう出来てるんです。
自分がわからないのは、cgi.outでクッキーを出力する場合に
cgi.outのブロックでHTMLを書き込む訳ですが
その場合に、以下の様な処理がしたいんです。でもこのコードでは最初のブロックの中だけしか出力されません…
cgi.out("cookie" => cookie){
"<html><body>" #html出力
}
(0..3).each{|i| #通常の処理
print i + '<br>'
}
cgi.out("cookie" => cookie){
"</body></html>" #html出力
}
cgi.out("cookie" => cookie){ #これはもちろんOK
"<html><body>test</body></html>"
}
要するに、htmlを一気に書き出すのではなくて
途中にプログラムの処理を挟みたいんです。
根本的に何か勘違いしているかもしれないんですが…
538 :
513 :2006/11/09(木) 15:25:52
あ、2回目のcgi.outは cgi.out({"charset" => "shift_jis"}){…} こうしてました。
質問。 文字列str が、たとえば正規表現の /x/ か /y/ か /z/ に引っかかるなら何かしようと思い if (str =~ /x/ or /y/ or /z/) then と書きました。 でも肝心なときに動作が変なので試したら irb> ("abcde" =~ /x/ or /y/ or /z/) => /y/ とか言われました。 なんでここで/y/ですか?
>>537 釣りか?
>>514 ,515
これで了解したんじゃなかったのか?
マニュアルのURLを提示したんだから一通り読みなさい。
すごく分かり易いとは言えないが必要十分な情報が書いてある。
だいたい何を参考に作業してるんだy。
>>535 ページってのはあれだ、たぶん
「クライアントからGETとかPOSTとか受け取って解釈してクライアントに出力結果渡す」
という一連の処理が「1ページ」ぶんなんだろう。1画面遷移とゆーか。
だから、cgi2=CGI.newとかが成功してしまうと、
「これって他のメソッドで作ったcgiインスタンスとどこが違うんだ?」と悩みの種に。
CGI#paramsはARGVを整理してくれるだけのメソッド
CGI#outはContent-Type:text/html\n\nを前につけてくれるだけのputs
と割り切ると気楽だと思う。
542 :
533 :2006/11/09(木) 16:47:16
>>536 では複数のインスタンスのなかから、
値がインスタンス変数と一致するようなインスタンスを探し出すためには
どのような手段を取ればよいのでしょうか?
普通にインスタンス変数を使うのでは駄目かいのう 普通に使うぶんには代入でオブジェクトがコピーされることはない 参照が増えるだけで、メモリ上の実位置は動かない
object_idは?
545 :
513 :2006/11/09(木) 17:10:53
>>540 いや釣りじゃないです…
出力の途中に処理を挟みたい場合はどうするのかが知りたいんです。
↓こういうのって出来ないですよね?
cgi.out().out("cookie" => cookie){
"test"
}
print 'test2' #ここが出力されないから…
>539 /[xyz]/ か /(x|y|z)/ か Regexp.union(/x/,/y/,/z/) を使わない理由は? 理由は、その式が ("abcde" =~ /x/) or /y/ or /z/ だから。 ("abcde" =~ /x/) は nil だから、 nil or /y/ or /z/ で、 or は左辺値が 偽(nilかfalse)のとき右辺値を試すから /y/ が返される。
547 :
533 :2006/11/09(木) 17:43:39
>>543 普通にインスタンス変数を使うとはどういう意味でしょう?
たとえば、親・子の2つのレベルからなる木構造で
各レベルには複数のノードがあり親ノードは複数の子ノードを持つとします
まず親ノードを生成し、次に子ノードを生成します。
この時、子ノードが自分の親を決める為に与えられているのは
親のインスタンス変数の値でこれが一致すると親が一意に決まります
これを判断させるためにインスタンス変数をキーに、アドレスをバリューにしたハッシュを作ろうとしていたのですが、
アドレスが得られないらしいので何か解決策はありませんか?
object_id、__id__
>>533 だから、マニュアルを読めと。
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=Object#eql.3f でなきゃオブジェクト指向でググるとか、C読めるならソース読んだ方が分かり易いかも知れん。
>>545 処理してから出力すりゃいいのでは。
何か計算したからと言って、その場ですぐ出力する必要はない。
試したがうごかねえな。うごかねえと言うか、ブラウザ側で通信切られて捨てられてるんじゃねえの。
outの中でcontent-lengthが指定されてるからだと思うが。
まあ何にせよ、out呼ぶたびにheaderが吐かれるんで、outを実行していいのは一回きりだな。
答えはたぶんこれだな。例はマニュアルを見ること。
> header(headers = "text/html")
> HTTP ヘッダを headers に従って生成します。( CGI#out と違い、標準出力には出力しません)
> CGI#out を使わずに自力で HTML を出力したい場合などに使います。
> このメソッドは文字列エンコーディングを変換しません。
正規表現に限った話じゃないが str == (hoge or hage or huga) ではなく (str == hoge) or (str == hage) or (str == huga) のように意識して書く癖つけたほうがよくねえか
case whenのほうが楽ちゃいまっか
552 :
513 :2006/11/09(木) 19:19:02
>>549 レスどうも!
なるほど、よく分かりました!
しかし今ちょっと試してみたんですが
cgi.out("cookie" => cookie){
func
}
みたいに関数は実行出来るみたいですので、これでなんとかなりそうです。
お騒がせしました!
ポインタがないなんてRuby糞だな
554 :
513 :2006/11/09(木) 20:04:05
>>549 これで完璧でした!ありがとうございました!
cookie = CGI::Cookie::new({'name' => 'name', 'value' => 'TEST', 'expires' => Time.now + 60 * 60 * 24})
cgi = CGI.new
print cgi.header("cookie" => cookie)
print '<html><body>test</body></html>'
あんまりわかってないような気もするが。 CGI#outのブロック引数は、最終的に組み上がった文字列(HTMLでもCSVでもPDFでも何でもいい)を返しさえすれば 後は好き勝手やっていいんだよ。 例えば意味はないけどこんなのとか。 x = 5 cgi.out("text/csv") do out = "" x.times{|i| out << "#{i},#{i*10},#{i*100}\n"} out end ブロックの効能についてはなるべく自分で調べて欲しいが。
>>553 mutable なオブジェクトは全部
ポインタみたいなもんだから
むしろポインタだらけ
557 :
533 :2006/11/09(木) 23:56:32
皆さんありがとうございました object_idとObjectSpace._id2ref()で実現できそうです
>>533 そもそもネストしないならこれだけの話。
tree = {}
node = Object.new
leaf = Object.new
tree[node] = leaf
leafを複数持つにしても
tree = Hash.new{|h,k| h[k] = []}
でデフォルトで配列を作るようにすりゃ仕様上は済む話だが。
ObjectSpaceを使うのは構わないが、普通は使わないトリッキーな方法だという認識は必要。
559 :
デフォルトの名無しさん :2006/11/10(金) 03:53:08
質問させてください。 Ruby one click installerでWindowsにRubyをインストールしました。 RubyGemsの使い方は↓以下のようなものだと思っていたのですが、 require 'rubygems' require_gem 'active_support' どうやら、 require 'active_support' で大丈夫なようなんです。 Ruby One Click InstallerでWindowsにインストールすると、 普通のロードパスの中にrequireしたいライブラリのファイル名 が見つからないと、 昔で言う、require_gemを使って探すという風になってるのかなあ、 と思うんですが、 どこかでrequireが再定義されていたりするんでしょうか。 もしあるなら、そのコードって、何処にあるんでしょうか?? 小生、独学でやっているため、使ってる言葉とか、 あと、Rubyの基本動作のようなところで抜けている知識が多いと思います。 不正確な書き方も多いと思いますが、どうかご教授ください。
環境変数のRUBYOPTで指定
561 :
559 :2006/11/10(金) 05:09:10
>>560 わかりました。環境変数でオプション指定してたんですね。
ありがとうございます。
>>554 そこにたどり着くまでにえらい遠回りしてるっぽいのだが、
いったいどのドキュメントを読んだせいでそうなったのだろうか。
参考までに教えてほしい。
初心者スレとしては、初心者が迷いなくCGIプログラムを勉強できるように
したいので。
ひさしぶりにのぞいてみたら、
>>554 とか
>>557 とかトンデモなコードが多いな、最近。
初心者スレとしてはこれじゃ困るだろ。
危機感があるなら明かりつけようぜ。
>>537 と
>>554 を矯正すると
html=String.new
html << '<html><titile>CGIテスト</titile><body>'
(0..3).each{|i|
html << i + '<br>' # 色々処理
}
html << '</body></html>'
cookie = CGI::Cookie::new({
'name' => 'name',
'value' => 'TEST',
'expires' => Time.now + 60 * 60 * 24
})
header={
"cookie" => cookie,
"charset" => "shift_jis"
}
cgi=CGI.new
cgi.out(header){html}
たとえばこんな感じか?
>>565 CGIはそんな感じだと思う。
HTMLを文字列(か配列)の連結で最後まで作り切っておいて、クッキーを必要なら作って、
HTTPヘッダを必要ならハッシュで作って、CGI#outや自前のprintで一気に表示指示。
1回だけしか使われないデータにハッシュを使うとリソースもったいなくて死ぬとか
逐次出力して捨てれば済む話なのに巨大な変数として保持するなんざ極刑ものだとか
ケチくさいこと言わない限り、初心者的にはふつーに考えるとこのへんに行き着くと思うんだが…
>>566 これで出力したいんです。
print <<-HTML
html
HTML
>>567 残念なお知らせがある。
CGIは適当にやっても絶対に動かない、ということだ。
HTTPヘッダとHTTP通信の最低限の知識が絶対に要る。
>>568 とかじゃダメなんですか?
print "Content-type:text/html\n\n"
print <<-HTML
<html><body>
HTML
色々処理
print <<-HTML
</body></html>
HTML
え、いいんじゃねえの?何か問題がある?
>>566 にメインストリームではないと断じられたことを気にしてる?
…出力に関わるメソッドが多くなってくると
「HTML内容を変数などで溜めておいて最後にまとめて出力」させるスタンスが
書いてて楽になるんだよ。
スクリプト内のあっちこっちで出力してるとデバッグとかも面倒だ。
面倒でないと思うなら、面倒になるまで続けていてもいいだろ。
もしかしたら面倒に感じないかもしれないし。
ERbの話題がなかなか出てこないなぁと思いながらスレを眺めている俺ガイル
cgi.rb自体、卜部氏が「誰も使ってないんだなあという認識」をするくらい 半ばobsoleteな代物なので、皆さんフレームワークを使ってください。 RoRをはじめ、色々ありますから。 eRubyでもいいけどbinding渡さなきゃならんとか、じゃあクラス化した方がいいのかとか初心者には悩みが多い稀ガス。 そんで適当なクラス書くくらいならフレームワーク入れろと。
cgi.rbでも初心者には既に機能過多な感じなのに CGI作るのにわざわざWebアプリフレームワークを別途導入しろとな (まあ、RoRはそう大掛かりなものでもないが)
574 :
513 :2006/11/10(金) 15:20:40
質問です。 例えば、下のふたつの場合 どちらがパフォーマンス的に優れてるのでしょうか? if (0..99999).include?(3) end (0..99999).each{|v| if v == 3 end }
>>513 おかえり。
CGI書くときに参考にしたものを教えてよ。
整数なら以下がたぶん最速だし、Rangeなんぞ使うべきでない。
0 <= 3 && 3 <= 99999
$ ruby -r profile ./range.rb
% cumulative self self total
time seconds seconds calls ms/call ms/call name
73.95 35.65 35.65 1 35650.00 48210.00 Range#each
26.05 48.21 12.56 100000 0.13 0.13 Fixnum#==
0.08 48.25 0.04 1 40.00 40.00 Profiler__.start_profile
0.00 48.25 0.00 2 0.00 0.00 Fixnum#<=>
0.00 48.25 0.00 1 0.00 0.00 Range#include?
0.00 48.25 0.00 1 0.00 48210.00 #toplevel
>>575 んで、Rangeを使うのがばーちゃんからの遺言だという場合は明らかにinclude?だな
つーか、この人が参考にしてるサイトなり書籍なりはいったい何なんだろうという疑問が
577 :
513 :2006/11/10(金) 15:41:14
include?はどんなに数デカくしても 一瞬なんですが、どの様になってるんでしょう? a = (0..100000) st = Time.now.to_f a.include?(50000) print Time.now.to_f - st puts st = Time.now.to_f a.each{|v| if v == 50000 then; break; end } print Time.now.to_f - st
578 :
513 :2006/11/10(金) 15:48:36
あ、レス来てましたね…
>>575 やはりinclude?が一番速いみたいですね…
参考にしてるのはやはりリファレンスマニュアルです。
しかしまだ全然Rubyで書いたコード量が少ないんで経験不足です…
こんどちゃんと書籍を買って一から勉強しないとダメですね。
579 :
513 :2006/11/10(金) 15:51:59
>>575 そうですよね、整数だとそうなりますよね。
やはりinclude?を使用した方が良さそうですね。
Range#include?は<=>で比較してるっぽい
というかRangeオブジェクト自体が他と違う不思議存在に思える俺 範囲って何よ、みたいな
582 :
513 :2006/11/10(金) 18:43:20
584 :
デフォルトの名無しさん :2006/11/11(土) 04:15:27
gem使ってるんですけど、requireしたときに どのファイルをrequireしたか、 絶対パスで得る方法ってないでしょうか??
RUBY w perlで良くね? w
Raccでエラーが出て困っています。 入力を a=3 output(a) とするとoutput(a)のaのところで以下のようなエラーが出ます。 parse error on value "a" (IDENT) from /usr/lib/ruby/site_ruby/1.8/racc/parser.rb:99:in `do_parse' 入力を a=3 output(3) とするとacceptになります。 なぜでしょうか。
以下文法です。 rule program: | program stmt EOL | program EOL stmt : assign | output output : OUTPUT '(' exp ')' assign : IDENT '=' exp exp : exp '+' exp | exp '-' exp | exp '*' exp | primary primary : '(' exp ')' | array | pow | range | IDNET | NUMBER
array : '[' args ']' args: arg | args ',' arg_item arg : NUMBER | IDENT | RANGE pow : POW '(' exp ')' range : NUMBER RANGE NUMBER end
primary : '(' exp ')' | array | pow | range | IDNET ← IDENTじゃないの? | NUMBER
590 :
デフォルトの名無しさん :2006/11/11(土) 13:37:37
クラスのソースと同じフォルダ階層にある設定ファイルを読み込みたいのですが、 自分のソースへのパスを得る方法はありますか? └baka/ └aho/ ├config.xml └hoge.rb $ cat hoge.rb class Hoge def initialize load_config('(hoge.rbのパス)/config.xml') end end
>>590 __FILE__
これでパスも含めたファイル名が取得出来ますよ。
592 :
586 :2006/11/11(土) 14:49:38
>>589 あうう。その通りでした。
お恥ずかしい限りです。
ありがとうございました。
>>590 File.dirname(__FILE__)で良いんじゃない?
Win32版ならGetModuleFileName使ってしまいがちだが、ruby.exeのパスがとれるだけです><
595 :
デフォルトの名無しさん :2006/11/11(土) 16:34:56
>>545 皆の親切なレスがわからないのであれば、とりあえず
・CGI.newは1回だけ。CGI.outも1回だけ。
・出力する内容は別のStringとかにためておき、確定してからCGI.outする。
とすればよいと思うよ。そういうもんだと思ってくれ。
596 :
513 :2006/11/12(日) 08:38:22
>>595 確かに(1)みたいに一気に出力した方が綺麗なんですけど
HTMLの場合パラメータに""を付けないといけないんで
文字列の中で#{}で変数を展開させにくいなぁと思って
(2)の様に書いてたんです… 汚いですよねやっぱ。
(1)
html << '<html><body>'
(0..3).each{|v|
html << '<font size="' + v.to_s + '">test</font><br>'
}
html << '</body></html>'
cgi = CGI.new
cgi.out({"charset" => "shift_jis"}){ html }
(2)
print "Content-type:text/html\n\n"
print <<HTML
<html><body>
HTML
(0..3).each{|v|
print <<HTML
<font size="#{v}">test</font><br>
HTML
}
print <<HTML
</html><body>
HTML
(0..3).each{|v| html << %(<font size="#{v}">test</font><br>) }
def name return 'ruby' end puts "Hello, #{name.upcase}!" #{ } で埋め込めるのは変数だけだという思い込みがある時期は確かにあるな
def fonttest html='' (0..3).each{|v| html << "<font size=\"#{v}\">test</font><br>" } return html end cgi=CGI.new cgi.out("charset" => "shift_jis"){<<HTML} <html><body> #{fonttest} </body></html> HTML
600 :
513 :2006/11/12(日) 12:01:01
要は、htmlのパラメータを\"\"みたいにエスケープしなくて良いのと
#{}で展開も出来るんで、他のhtmlをそのままコピペで流用出来るのが楽で
ヒアドキュメントを使ってただけなんですけどね。
でもやっぱりコードが見づらいかもしれないですね。
>>597 これはかなり目から鱗でした。
601 :
デフォルトの名無しさん :2006/11/12(日) 21:45:26
RWEFATGTGATATA GDGTSGSGSGSGSG のような文字が格納されているファイルで 各文字数をカウントしたいのですがこの場合どうすればよいのでしょうか? splitで文字列を分割しようと思ったのですが、この場合1文字ずつ分割できないと思い .unpack(a1)とやったのですがエラーがでてしまいました。 どうすれば負荷をちいさくカウントできるのでしょうか?
>>601 これでどうですか?
print 'AABBBCCCC'.scan(/S/).size
あと一文字ずつの分割はこれで出来るみたいですよ。
'AABBBCCCC'.split('').each{|v| print v + "\n" }
あ、引数はこうでした。まぁわかるでしょうけど。 print 'AABBBCCCC'.scan(/B/).size
604 :
デフォルトの名無しさん :2006/11/12(日) 22:37:05
>>603 その場合は、AかBかCがOKってことですよね
あらかじめ分かってないと無理ってことですよね
605 :
デフォルトの名無しさん :2006/11/12(日) 22:54:42
file = open(filename) while text = file.gets.chomp!.upcase do text.split('').each{|moji| count[moji] += 1 } end print "{#count[A]}{#count[S]}{#count[C]}{#count[F]}" file.close ~ こんな感じでとある文字の個別のカウントができると思ったのですが countにエラーがでてきたのですが、どう間違っているのでしょうか
要件がはっきりしないんだよな あとエラーは読め 英語だから読めないとかは無し 無理してでも読め
>>604 この様にしてはどうでしょう?
a = ['A','B','C']
s = 'AABBBCCC'
a.each{|v| print v + ':' + s.scan(/#{v}/).size.to_s + "\n" }
608 :
デフォルトの名無しさん :2006/11/12(日) 23:00:26
こんなもん英語よむってもんじゃねぇだろ
>>604 file = open(filename)
while text = file.gets.chomp!.upcase do
text.split('').each{|moji|
count[moji] += 1
}.each{print count[moji]}
end
file.close
なんじゃね?
file=File.read(filename)
arr=file.split(//e).sort
arr.each do |e|
puts "#{e}: #{arr.grep(e).size}個"
arr.delete(e)
end
>>601 : 9個 ): 1個 1: 2個 A: 4個 F: 1個 G: 9個 S: 5個 T: 5個 c: 1個 k: 1個 n: 1個 p: 2個 u: 1個 。: 1個
?: 2個 い: 7個 う: 6個 が: 5個 く: 1個 こ: 2個 し: 6個 す: 5 個 た: 4個 っ: 2個 て: 2個 で: 10個
ど: 2個 な: 2個 の: 8個 ま: 2個 ょ: 2個 よ: 3個 れ: 3個 を: 3個 ウ: 2個 カ: 2個 フ: 1個 ル: 1個
ン: 2個 格: 1個 割: 2個 思: 2個 字: 4個 数: 1個 負: 1個 分: 2個 文: 4個
File#chmod について質問があります。 Unix の chmod と同じ形式でパーミッションを 変更したいのですが変換法則が分かりません。 % chmod 644 foo.txt % ls -l foo.txt -rw-r--r-- foo.txt irb % File::Stat.new(foo.txt).mode => 33188 どうすれば 644 が 33188 になるんでしょうか?
33188を8進数で表記すると100644 puts "#{"%o"%33188}" 100644
それだと「先頭の100ってなんだあああああ」という疑問が残ると思うんだが パーミッションの表示なんていいとこ4桁だろ
>>612 なるほど。
そうすると引数の頭に100をくっつけて10進数に変換すればいいんですね。
mode = "644"
p Integer("0100#{mode}"
=> 33188
おお。
>>613 そうか、スティッキービットを立てるときは四桁ですね。
じゃあ、この方がいいのかな。
mode = "0644"
foo = 100000 + mode.to_i
p Integer("0#{foo}")
=> 33188
615 :
デフォルトの名無しさん :2006/11/13(月) 09:59:18
>>610 1行ずつ処理したいのですが、その場合どうすればよいのでしょうか?
grepのやりかたじゃできない気がするのですが・・・
エラーは読め
英語だから読めないとかは無し
無理してでも読め
そもそも
>>605 の考え方でも充分動作するはず
というか、なんつーか、基礎がまだなってねー
とりあえずハッシュの使い方と変数のスコープの勉強しれ
617 :
デフォルトの名無しさん :2006/11/13(月) 10:57:20
>>616 なんとかhash使ってできました。
ただ、何故
gets.chomp!.upcaseは同時にできないのでしょうか?
分割すればできたのですが。
>>617 chomp! は改行取らなかったらnil返すから
リファレンス嫁
エラーは読め 英語だから読めないとかは無し 無理してでも読め つか「できない」とか言うな エラーきちんと書き写せ エラーはたいてい正確に原因を指摘する
エラーのわかりやすい解説一覧とか作ったら需要あるかなあ
621 :
デフォルトの名無しさん :2006/11/13(月) 11:17:40
>>618 なるほど。ありがとうございます。upcaseもnilを返すみたいですね。
これらを使うときは代入しないほうがいいみたいでした。
あと、ARGV[0]でファイルを指定してプログラムを実行する場合なのですが、
ファイルを指定せずプログラムだけを実行すると、デフォルトのエラーが出力されますよね。
この場合、引数を指定しなかった場合のエラーをあらかじめプログラムで記述したエラーを表示するには
なんのメソッドを使えばよいのでしょうか?
>>621 該当する例外(いわゆるエラー)に対処するための「例外処理」を記述する
hoge.rb:
==============
puts File.read(ARGV[0])
==============
を実行結果
./hoge.rb:1: undefined local variable or method `file' for main:Object (NameError)
^^^^^^^^^^
Fileはファイルの引数が無いとNameErrorが出るらしいと記憶しておく
hoge2.rb:
==============
begin
puts file.read(ARGV[0])
rescue NameError
$stderr.puts "エラー:引数にファイル名が必要です"
end
==============
を実行結果
エラー:引数にファイル名が必要です
623 :
デフォルトの名無しさん :2006/11/13(月) 11:31:02
>>622 ありがとうございます。勉強になりました。簡単に指定できるんですね。
もうひとつ合って申し訳ないのですが
Perlで
while(<>) とやれば指定したファイルからファイルを1行ずつ最後まで読み込んでくれたと思うのですが
Rubyでは、これに当たるやつはないのでしょうか?
<>だけで簡単に引数を指定できてると思うのですが、RubyではARGV[0]しかしらないのです。
624 :
デフォルトの名無しさん :2006/11/13(月) 11:31:53
あと、これかっておけって本ありますか? たのしいRubyって本しかもってないのですが、 他のRuby入門書も詳しくはかいてないような オライリーとか出してないみたいだし。。
>>623 while gets で、コマンドラインで指定したファイルから $_ に1行ずつ読み込まれるよ。
もうちょっと真面目に書くなら、while line = ARGF.gets とかARGF.each_line |line| だが。
>>622 そこで出るのはNameErrorじゃないような気がするが…
can't convert nil into String (TypeError)
か
No such file or directory - (Errno::ENOENT)
あたりだと思うぞ
>>622 ARGV[0]を利用するメソッドで起こる例外を
例外処理で補足するのがひとつの方法、
もうひとつはスクリプトの最初のほうで
if ARGV.empty? then
puts 'ERROR: 引数がありません'
exit
end
みたいな「引数が空ならメッセージ出して終了」な処理を入れること。
引数の有無はスクリプト全体にとって致命的だから
複雑でないスクリプトなら後者で一箇所でまとめて判定したい俺。
>>626 勉強になりました。ありがとうございます。
メモっておきました。
>>622 ARGVは引数が無いと空配列だから、
ARGV[0]はnil
なんで
>>626 が言う通りTypeError
すみませんが、質問です。 Rubyのスクリプトをコマンドラインで実行した場合、 戻り値0 : 正常終了した場合 戻り値1 : 例外が発生した場合 のようですが、 戻り値2 や戻り値-1を返すにはどうしたらよいのでしょうか? 環境はLinuxです。
exit 2
exit([status]) Rubyプログラムの実行を終了します。status として整数が与えられた場合、その値を Ruby コマンドの終了ステータスとします。デフォルトの終了ステータスは 0 です。 exit は例外 SystemExit を発生させることによってプログラムの実行を終了させますので、必要に応じて rescue 節で捕捉することができます。 ruby 1.8 feature: statusがtrueの場合、EXIT_SUCCESSを終了ステータスとします。statusがfalseの場合、EXIT_FAILUREを終了ステータスとします。デフォルトの終了ステータスはEXIT_SUCCESSに変更されています。 exit!([status]) 整数 status を終了ステータスとして、Ruby プログラムの実行を終了します。デフォルトの終了ステータスは -1 です。 exit! は exit とは違って、例外処理などは一切行ないません。forkの後、子プロセスを終了させる時などに用いられます。 ruby 1.8 feature: statusがtrueの場合、EXIT_SUCCESSを終了ステータスとします。statusがfalseの場合、EXIT_FAILUREを終了ステータスとします。デフォルトの終了ステータスはEXIT_FAILUREに変更されています。
WinのDLLのテストツールをRubyで書こうとしてるのですが、 Pythonのctypes見たいなのありますか? もろDLLのテストツールを紹介してくれたらベストですが…Ruby実装のものは無さそう
Win32API
win32apiで型変換できないですよね?
Win32APIも型変換してなくもないような。ctypesはどれくらい対応してたっけ。 ま、とりあえずDLでもチェックしてみるといいよ。
>>624 プログラミングRuby 第2版「言語偏」「ライブラリ編」
>>637 初版はたいした役に立たなかったんだけど、第二版はいいの?
639 :
デフォルトの名無しさん :2006/11/13(月) 16:58:36
ニート歴3年のIT業界未経験だけど Rubyをそれなりに究めれば採用されますか?
Ruby云々はどうでもいいです プログラミングの習得に挫折しない保証があるなら採ります まあ偽装のロクな仕事じゃないけどな
641 :
601 :2006/11/13(月) 17:30:10
count = Hash.new(0) while line = gets moji = line.split(//e) moji.each{|a| count[a] += 1 } end print "A:#{count["A"]}\tZ:#{count["Z"]}\tG:#{count["G"]}\tそれ以外:#{count["/^AZG/"]}\n" このようにしたら、AとZとGの文字数は個別にカウントして それ以外の文字をまとめてカウントできるとおもったのですが、どうも正規表現で指定するとうまくいきません。 というか、正規表現では無理かな。 どのように変更すれば指定した文字以外をまとめてカウントできるのでしょうか? よろしくおねがいします。
>>641 めんどくさがらないでcount["A"], count["Z"], count["G]以外
全部足せばいいんじゃね? とオモタ
>>601 そろそろ何のためにそんなけったいなことをしてるのか教えてよ
「それ以外」の合計と「それ」の合計を求めて引けばいいだろう。
方法は好きにやれ。
644 :
601 :2006/11/13(月) 17:47:34
>>642 A-Z ひらがなとか漢字あわせるとかなり多いのですが・・・
これはプログラムとしては欠点な気がするのですが。
>>643 なんのためっていうか、ファイルからよく使う文字を集計してるのですよ。
特定の文字をメインに。
プログラムに落とし込む思考力の問題だな
646 :
642 :2006/11/13(月) 17:59:17
>>644 …イテレータ使えば?
total = 0
count.each_value{|val| total += val }
とか。
それても気にしてるのは実行コスト?
647 :
629 :2006/11/13(月) 18:01:50
count = Hash.new(0) total = 0 while line = gets moji = line.split(//e) moji.each{|a| count[a] += 1 total += 1 } end total -= count["A"] + count["Z"] + count["G"] print "A:#{count["A"]}\tZ:#{count["Z"]}\tG:#{count["G"]}\tそれ以外:#{total}\n"
jcode要らうかな。日本語あるなら。
650 :
デフォルトの名無しさん :2006/11/13(月) 19:54:23
37/100 みたいにプログラム中で計算したのを表示してみたら0になってしまうのですが Perlでは普通に%fやったらでたのですが rubyで小数点いれるにはどうしたらよいのでしょうか? "37/100".to_fやっても0.0となってしまいます 実際数字のところは、変数ですが
>>650 数字を変数にしたらStringになってんじゃね?
p "x/100".to_f
0.0
>>651 まあ、そういうことだろうな
「x/100」という5文字の文字列に対して to_f したらそりゃ 0.0 だ
というか明示的に小数を含んで計算すれば小数表示されるぞ
p 37.0/100
0.37
んで答えはこうか
x=37
p x/100.to_f
0.37
653 :
デフォルトの名無しさん :2006/11/13(月) 20:20:47
>>652 ありがとうございます。無事できました。
でも、変数/変数*100.0でやったら少数表示されませんでした。0.0と表示されて一応少数か。
小数点第何位で区切ろうとしたら、やはりprintfを使わないといけませんよね。
ちょっと面倒ですね。
654 :
デフォルトの名無しさん :2006/11/13(月) 20:59:24
あれ、printf("%3f",hensu) みたいにやっても有効桁指定できない・・・
655 :
デフォルトの名無しさん :2006/11/13(月) 21:11:25
while gets 文じゃ 引数を指定しないとプログラムがおかしくなりますが、エラーはでないんですね この場合の例外処理はどうすればよいのでしょうか?
%x.yf x : 全体桁 y : xのうちの少数桁
> type a.rb puts '%03d' % 12.3456 > a.rb 012 > ruby -e "puts '%03d' % 12.3456" d >ruby -v ruby 1.8.5 (2006-08-25) [i386-mswin32] なんだこりゃ?
>>655 この場合も何も、例外処理なんて begin rescueしかない。
while gets って、受け取った入力は何処に入れてるんだ?
659 :
デフォルトの名無しさん :2006/11/13(月) 21:23:58
>>658 受け取った入力は、変数にいれてます
begin
while line = gets
.
.
.
rescue
puts ほにゃらら
end
みたいにやっても、引数なしで実行すると
改行された画面みたいにしかならなくてエラー名も何もでないのですが・・
661 :
デフォルトの名無しさん :2006/11/13(月) 21:26:57
>>656-657 ありがとうございます。助かりました。
ついでにもうひとつとねがいしたいのですが、
printf("%3.1f",hensu,"\n")
34.1% みたいにしたいのですが、%はどこにいれればよいのでしょうか?
fのあとにスペースしていれたり、\をつけて文字としてあつかうようにしてみたのですが
無理でした。
>>661 マニュアルくらい読め
その調子だとこの先もわからないことがあったら全部人に聞くだろ
>>659 if ARGV.empty?
$stderr.puts "Error"
exit 1
end
while ...
組み込み関数 gets のマニュアル見るとわかるんだが、 ただの gets は Perl のダイヤモンド演算子のように振舞う。 つまり、引数がないときは標準入力の内容を読む。 引数の有無で例外処理をさせたい場合には使用してはいけない。
>>662 一応、rubyリファレンスマニュアルに目をとおしてるのですがよくわからなかったので・・・
何か例文集の本とか買ったほうがいいのかな
オンラインマニュアルのprintfの項には > 引数の扱いの詳細については sprintfフォーマット を参照してください。 ときちんと誘導されてると思うんだが
>>667 「引数の扱いの詳細」という日本語が、
初心者にとって良くないのかも。
>>667 すみません。このx.y のようにするとは思わなかったので・・・
今再度確認したらやはりちょっとわかりにくいですね。
>>663 なぜ exit 1 なのでしょうか?
デフォルトでは0が終了ステータスと書いていましたが、
1というのはエラーで終了したということでしょうか?
まあ、あのマニュアルはマニュアル慣れした人向けであることは常々感じてるんだが ふつーの人はアレ読めないって
>>670 というか、肝心なとこに限ってえっらいわかりにくいんだよな
どっか別の場所で知識つけてきて初めて高速に読み飛ばせるハイパーなマニュアル
>>669 終了ステータスの勉強するといい
Rubyどうこうではなく、コマンドの正常終了時は0で、異常終了時は0以外だ(時々守られてないが)
自分ひとりで使うぶんにはまったく気にしなくてもいいが、癖をつけておくと良
>>671 ありがとうございました。
デフォルトが0なのは、正常終了したプログラムを別のプログラムに渡すためなのでしょうね。
1つの簡単なプログラムだと別にexitは指定しなくていいっぽいですね。
Cをちょっとかじったときは、EXIT_SUCCESS とか常につけるようにしていましたが。
673 :
661 :2006/11/13(月) 21:47:46
すみません、 printf("%3.1f",hensu,"\n") の"%3.1f"の中に文字としての%をつけくわえるのは 可能なのでしょうか? sprintfマニュアルみてもそれっぽいのがなんかなかったのですが・・・
675 :
661 :2006/11/13(月) 21:50:39
>>674 あ、すみません。そういう意味だったんですか・・・
申し訳ありません。
676 :
デフォルトの名無しさん :2006/11/13(月) 22:28:33
RubyとPerlプログラムでファイル中の文字カウントのスピードを比較していたのですが、 結果は、Perlのほうがはやいものでした。 プログラムの作り方によるのかもしれませんが、一般的にPerlのほうがはやいのでしょうか? Rubyでは、hashつくってsplitとしてイテレーターつかってるから遅いのかな
677 :
デフォルトの名無しさん :2006/11/13(月) 23:29:32
count.each{|key,value| print "#{key}:\t" }.print("\n").each{|value| print "#{value}:\t" } key: key: key: key: value: value: value: value: というように表示したいのですが、上記のようなプログラムでは keyを全部出力したあとに改行されませんでした。間に改行をいれるにはどうすればよいのでしょうか? count.each printf "\n" count.each というようにわけずにかきたいのですが・・・
それ以前に君はこのプログラムがどういう動作をしているのか理解できているのか 自分にとって理解しやすいように書くという気はないんか
ブロックつきeachにブロックつきeachがくっついてる時点で俺は解読に自信がない
680 :
デフォルトの名無しさん :2006/11/14(火) 00:32:39
>>679 printのところとったら動きましたよ
ただ改行がなかっただけで正確でした
そのprint("\n")は何に対して呼び出してるつもりなんだ。
>>681 プッ
初心者はこれだからwwww
その前の
each{|key,value|
print "#{key}:\t"
}
というブロックに決まってるじゃないか
>>682 どんな動作になるかよくわからんな(w
というかここの部分でエラーとかは出んのか…?
irb> {'key'=>'value'}.each{|k,v| print k,v}.print "\n"
keyvalueNoMethodError: private method `print' called for {"key"=>"value"}:Hash
…。どうやって動いたんだ…?
LinuxのWebサーバ上に載せるスクリプトで Win32APIって使えますか? クライアント側はWindowsであることを想定してます。 Web上で入力したデータを Excel フォーマットに整形して取得したいのですが、、、
Web上で入力したデータを取得してExcelフォーマットに変換しろ あと、90パーセントくらいまでの要件は、Excelファイルをどうしようとかではなく ・タブ区切りかCSVでRubyが吐き出したものをユーザーにローカルに保存させてユーザーがExcelで読む ことで用が済む
686 :
デフォルトの名無しさん :2006/11/14(火) 08:29:12
site_rubyのsiteって何の略でしょうか?? Windowsで使ってるんですが、 C:\ruby\lib\ruby以下に、site_ruby, 1.8, gemsってなってます。 バージョンに寄らずに一定のライブラリが入ってるみたいですけど、 よく分かりません。
687 :
677 :2006/11/14(火) 08:58:06
private method `print' called for {"key"=>value, "key"=>value, "key"=>value}:Hash (NoMethodError) key: key: key: key: key: key: このようなエラーになってしまいます。 どうすれば改行をいれられるのでしょうか?
Hashのselfが返ってくるのでそこからprintは呼び出せないのでは…? 分けて書くのが見易いし良いと思うけど。 count.each{|k| print("#{k}:\t")} printf "\n" count.each{|v| print("#{v}:\t")}
こうだったか。 count.each_key{|k| print("#{k}:\t")} print("\n") count.each_value{|v| print("#{v}:\t")} というより、これに何の意味があるの? count.each{|k,v| … }.each{|v| … }
690 :
677 :2006/11/14(火) 09:41:41
>>689 ありがとうございます。
1行でかきたかったんですね。あと、できるのかというのも含めて。
思ってたのですが、#{k} こういうかっこでかこうのって面倒ですよね
なんか意外なんですが
日記は別のところで書け。
Rubyの質問かどうか分かりませんが・・・ 大量のテキスト処理をするスクリプトにwxRubyでGUIをつけたところ、 終了までに物凄く時間がかかるようになってしまいました。(環境は Winです)ところが、ウィンドウの上でマウスホイールをクルクルやると、 なぜか、時間がかなり短縮されます。 印刷のときにもこれをやると効くらしいのでWindowsの仕様なの かもしれませんが、スクリプトの側でコントロールするとかって、 できないものでしょうか?
693 :
デフォルトの名無しさん :2006/11/14(火) 11:18:52
ファイルの中から、何文字目から何文字目までを抽出するにはなんの関数をつかったらよいのでしょうか? Cではsizeofを使っていたのですが。 何文字目からですか? 10000 何文字目までですか? 430000 みたいに段階をおっていきたいのですが
694 :
692 :2006/11/14(火) 11:20:30
695 :
693 :2006/11/14(火) 12:24:34
分かりやいうと !title 私の数字は3です。 これからもよろしくお願いします。 また後で。 みたいなファイルがあったとして、この中の、!行は無視して 11文字めの「れ」から28文字目の「後」までの文字を抽出したい場合、 どうすればよいのでしょうか? このように文字数が少ない場合だと、一度に全行を読み込んでも問題ないのでしょうが 行が多い場合だとやはり、全行読むのはやめたほうがよいですよね。 それも考えるとどう処理していけばいいのかがよくわからないです。
こんな感じじゃね? 何文字目か記憶する変数をoffsetとして定義する(1で初期化) それぞれの行をlineとして読み込む lineから改行文字を削除 lineが!で始まっていたら次の行へ lineが何文字目から何文字目にあたるかoffsetから計算する 20文字目から40文字目までなら最初から途中までが範囲内だから出力 offsetにlineの文字数を足す まあ、全行読み込めるならそのほうが楽だな。
a = <STDIN> b = <STDIN> print "#{a}" print "#{b}" これじゃ、入力できないのですが何故なのでしょうか
>>697 エラーは読め
英語だから読めないとかは無し
無理してでも読め
というかそれ以前の気もするが
どこか解説サイトあるいは入門書籍などを一通り読んで勉強してみることを強く推奨
>>698 リファレンスと書籍よんだのですが、 C言語のscanfにあたるものがのってなかったのですが・・・ ARGVじゃちょっと違うし
エラー読んでないと言われてる意味をわかってないみたいだな ./test.rb:1: syntax error a=<STDIN> ^ ./test.rb:2: syntax error なぜRubyスクリプトでRubyの文法を無視するんだ?
701 :
デフォルトの名無しさん :2006/11/14(火) 14:44:44
どこにSTDINの文法がかいてありますか? 書籍に書いてないし、リファレンスにもないので困っております
<STDIN> < > ←これは何よ?
ダイヤモンド演算子使いたいなら periに池
704 :
デフォルトの名無しさん :2006/11/14(火) 15:30:39
>>702 <>をつけないで最初やったら、エラーがでたので
つけてみたのですが、やはり無理でした
2chのRubyユーザーコミュニティの真価が問われる瞬間がやってきたと感じる
706 :
デフォルトの名無しさん :2006/11/14(火) 15:44:39
すみません、どうすればよいのでしょうか?
1. 以下の文言を一日に3回唱える 「RubyはPerlではない」 2. "ドットの前"のものがどんな種類のものなのか常に意識する 3. 『たのしいRuby』の第1部から第3部あたりを通して流し読みする 4. 単に「エラーが出ました」とか他人にとって意味不明なことを口にしない 5. $stdin.gets と書く
学んだ上での間違いと何も知らない状態の間違いってけっこう見分けつくしな 明らかに後者だ 何も知らない者は自分で何かを作ることができないし 何も知らない者が一文字書く度に聞きなおすのに付き合うほどこのスレは暇じゃない
710 :
デフォルトの名無しさん :2006/11/14(火) 16:33:22
>>707 はい心がけます。
しかし、この本、stdin.getsという言葉は1回もでてこなかったのですが・・・
>>710 だから何?
標準入力として$stdinは紹介されてるし、それがIOオブジェクトに属することもきちんと書いてある。
IOオブジェクトioから1行読み込むio.getsも解説があるだろ。
それでわからないならプログラミングにそもそも向かないからすっぱり諦めろ。
プログラミングに向かない人は一定数いるし、それは知能が低いことや人間としての欠陥を全く意味しない。
気にせず諦めろ。
向いてないけどやりたいってのは止められんよ。 本人じゃないからどう考えてるか知らんが。 PerlにあるならRubyにも同じものがあるもんだっつー思いこみを捨てるとか、資料は読むだけじゃなくて意味を勉強しろとかは言いたい。 まあPerlで幸せなら無理してRubyを使う必要はないとも言えるが。
>>712 711じゃないけど、「やりたい気持ちを止められない」ってのも大切な要素だよね。
本当に好きなら、多少頭が悪かろうが、効率悪いコードしか書けまいが
諦めずに続ける事が出来るもんね。
printf("Hello, World!\n");
初めてプログラム書いて、これ実行して何も感じないなら「向いてない」って事かもしれないね。
while line = gets line.chomp! str = "" str << line end print "#{str}" これのどこが間違っていますか? プログラム実行してもエラーが出ません。引数にファイルを指定しています。 あめんぼあかいな あいうえお きたちょうせん みたいな中身ですが、それぞれの文字を結合できないのでうが・・・
だから単体のgetsは区別めんどくさいから勉強中は使うなと
>>714 「変数のスコープ」について調べるといい
while line = gets
p line
line.chomp!
str = ""
str << line
p str
end
print "#{str}"
-------------
"あめんぼあかいな\n" ← p line
"あめんぼあかいな" ← p str
"あいうえお\n" ← p line
"あいうえお" ← ここのstrが期待と違う
"きたちょうせん\n"
"きたちょうせん"
きたちょうせん
--------------
ということで、どうやらstrが毎回空になってる模様、と推測する。
で、原因は
>>714 の言うスコープ。しかも微妙な原因。
whileはスコープを作らないんで、一般的なスコープの問題ではないんだけど、やっぱスコープだ。
こういうのも「スコープの問題」って言えるのか・・・
スコープ…が上書きされ…スコープが不適切…かなあ まあ、繰り返しの途中から始まってるのが問題だからスコープ…かなあ 「繰り返しの途中で毎回空文字列がセットされてるのが原因だぴょん」でよくね?という気はする
同じスコープ内で起こっているのだから、スコープの問題ではない。 str への空文字列の代入を最初に1回だけ行えばよい。
こういうのって合ってるんだからエラーがでないんだよな 初心者には意外な落とし穴なのかね
str='' if str == nil でも用が足りるわけだからね 別に str='' をwhileの「前」に出す必要はない ブロックとスコープうんたらの問題と同じような解決法で わかりやすく問題が解消されるのは事実だけど
str = STDIN.read.gsub(/\n/m, "") でどうだ!
>>722 str ||= ''
# 流れを読まずに書いてみる
>>724 その手の演算子嫌いなんだよね
読み下しにくいっていうか絶対半年後とかに書き間違う
>>722 も修飾子じゃなければエラーになるし、
あまり初心者に勧められる方法じゃないと思うが。
「ループの後でも使いたい変数はループの前にあらかじめ定義しておこうね!」 という啓蒙活動でよろしか str = "" while line = gets line.chomp! str << line end print "#{str}"
Rubyって一番最初に学ぶ言語には向かないですよね… 他の言語がある程度分かってないと、理解し難い部分が沢山ある様な気がするし… 出来れば、JavaとかC++とか覚えた後に使うのがいい様な気がするけど。
729 :
デフォルトの名無しさん :2006/11/14(火) 20:58:49
みなさんありがとうございました。 ようやくできてきたのですが、 X(start)文字目からY(stop)文字目の文字を取り出す方法を2通り考えてみたのですが どちらのほうが負荷が少ないのでしょうか? string = str.split(//e)[start..stop].to_s while start <= stop print "#{str[start-1].chr}" start += 1 end
str = s[start..stop]
Rubyのブロック構文は,関数ポインタやデリゲートやラムダ式・高階関数を学んでからでないと理解が難しい気がする。
array#push と array<<ってどっちが早いですか?
>>732 require "benchmark"
自力で確かめるのはいいことだ
>>731 ぶっちゃけどれも全く知らないがブロック構文は1週間も使ってれば覚えたぞ
rb_define_method(rb_cArray, "<<", rb_ary_push, 1); rb_define_method(rb_cArray, "push", rb_ary_push_m, -1); rb_ary_push_m(int argc, VALUE *argv, VALUE ary) { while (argc--) { rb_ary_push(ary, *argv++); } return ary; }
736 :
デフォルトの名無しさん :2006/11/14(火) 23:30:19
>>735 初心者ですがまったくわかりません。
* と int と VALUE が
>736 これはrubyインタプリタプログラムそのもののソース。言語はC。 で735が何を云いたいのか憶測してみると 1. Array#<<の実装は rb_ary_push()関数 2. Array#pushの実装は rb_ary_push_m()関数 3. rb_ary_push_m()関数は内部でrb_ary_push()関数に仕事(の一部)を任せている ゆえに: Array#<<の方が少し効率が良さそうなもんだ か?
>>729 分かりやすいほうを選ぼう。
速度やメモリ使用量は困ってから考えればいい。
Ruby/Tkってどうやって勉強すればよいのでしょうか? 本がでてないと思うのですが
あんなもん使うな GUIが欲しければ他の言語使え
一般論として << を使ったほうが早い 文字列連結も str = str + 'hoge' よりも str << 'hoge' のほうが早いしメモリも使わずに済む ただ、<< は若干わかりにくいし 一般用途上は誤差レベルなので好きにやっていい コンマ1秒の差が生死を分けるとかそういうチューニングが必要な人向け
742 :
デフォルトの名無しさん :2006/11/15(水) 09:50:18
文字列(string)をファイルに書き込むにはどうしたらよいのでしょうか? io = File.open(out, "w") io.string ?
File.open(out, "w"){|io| io.write string}
>>742 FileクラスとIOクラスの関係は序盤の山場だ
何も考えずにドットでくっつけるだけで書いてると、ここで必ず手が止まる
ここがきちんと理解できれば他の場面でも応用が利く
(というか、よく知らないクラスでも普通に利用できるようになる)
頑張って踏ん張れ
>741 String#+ と String#<< の違いとは別の話。 Array#push は複数の引数を取りうるが、 Array#<< は引数を1つしか取らない。 そこで Array#push は引数すべてについてループを使って Array#<< を呼び出 している。 だから引数が1つのときはループの初期化と終了チェックのぶんだけ遅い、っ ていうくらいの差。 個人的には(青木さんもどこかで書いていたが) << は push なんだか concat なんだか混乱するので push を使うことにしているが。 でも benchmark で調べてみたらけっこう差があるな。 require 'benchmark' include Benchmark puts CAPTION, measure { res = []; 100000.times {res.push('a')} }, measure { res = []; 100000.times { res << 'a' }} user system total real 0.093750 0.000000 0.093750 ( 0.098360) 0.085938 0.000000 0.085938 ( 0.086664)
746 :
デフォルトの名無しさん :2006/11/15(水) 10:17:10
>>743-744 なるほど。ありがとうございます。
しかし、File.open だとFileオブジェクトにopenしろといってるんですよね。
io = といったみたいな形にしないと
closeできないのでは?
IOクラスのサブクラスがFileだから、io=とかを指定しない場合でも、
io.closeで閉じられるということかな
io.writeのほうが{}ないにイテレータで入ってるから、io.writeで閉じられるのは分かりますが。
{}の外(後)にio.closeと書くとioがさしているのがわからないような・・・
それとも、io.closeとすると入出力のために開いていたもの全てを閉じるという意味なのでしょうか
io=File.open(filename) io.write(text) io.close FIle.open{|io| io.write(text) } この2つは同じ動作をする ioの"寿命"も1行目で生まれて3行目で死ぬという点で同じだ というかどっかそのへんに解説書いてないか? ブロックを利用するとcloseを明示的に書く必要がなくて便利ですとか何とか
748 :
デフォルトの名無しさん :2006/11/15(水) 10:50:35
俺も初学者なんだけど、ちょっと認識が間違ってたかも… ガベージコレクションが内部で働いた時、 例えばFileクラスのインスタンスってのは自動的にファイルをクローズしてくれますか? f = File.open('file', 'r') s = f.read やはりここで明示的にcloseしなくてはダメ? あとこの場合はどうなる?? s = File.read('file') closeも一緒にやってくれる? それとも次のread等の呼び出し時にチェックしてclose?? 流石にこれはcloseも一緒なんでしょ? そもそもC++みたいにデストラクタとか無いんで ファイルのcloseってどうなってますか??
GCがcloseするけど、 File を open したままにしておくようなコーディングは、C言語レベルでの誤動作 の原因となるため、あまり好ましくありません。きちんと明示的に close すること が大切です。 だそうである。
>>749 やっぱ、なるべく
File.open('file', 'r'){|f| s = f.read }
みたいに書いた方がいいみたいですね。
今まで散々ガベージコレクトがあると思って
File.open('file', 'w').write(s)
とか書きまくってたけど…
まぁこれも一応「重大な問題」は無いんですよね?
>>750 それはそうだが、Rubyの最大のボトルネックはGCだし、過度に
頼らないほうがいいと思われる。マーク&スイープっていう古い
アルゴリズムだから。
ジェネリックなGCにするとかいう話も出てるけど。
752 :
' ’ :2006/11/15(水) 12:02:25
>>747 すみません、見ていて気づきませんでしたが、いわれるとたしかにそうでした。
ありがとうございます。
File.open(out, "w"){|io|
io.write(string)}
out = $stdin.gets
string="文字列
このようになっているのですが、ファイル名を標準入力からいれて出力すると
inputname?
みたいに、?がファイル名の最後についてしまうのですが何故でしょうか?
一応ファイルの中は見られました。File.openの際の指定の仕方がおかしいのでしょうか。
>>752 つまり、outがファイル名ってこと?
ならp outしてみてくれ。
改行がくっついてるかもしれん。
>>752 コードの意図を説明しろ。
実行したコマンドはコピペしろ。中途半端に説明しようとするな。
実行結果はpで出力したものをコピペしろ。中途半端に説明しようとするな。
755 :
' ’ :2006/11/15(水) 13:10:02
>>753 outは、stdinで入力したファイル名が格納されるやつです。
p outをしたところ改行がついていました。
out = $stdin.gets.chomp! とした所
?がなしのファイル名になって、正常になりました。
標準入力の度に、文字列扱ってファイル名などに使うときはchomp!としないといけないのでしょうか?
少し面倒な気がするのですが。デフォルトで改行なしのほうがよさげな気がするのですが。
>>751 なるほど、そういう内部事情もあるんですか。
処理系の実装とかの問題はよく分からないんですが
Rubyの内部実装の出来ってどんな感じなんでしょうかね??
例えばまだまだ改良の余地、大幅な速度向上とか可能なんでしょうか?
他のスクリプト言語に比べて文法が複雑だし、インタプリタという事もあり
解析→処理の部分でコストが掛かってスピードアップって難しいと思ってたんですが。
バイトコードで処理出来ればかなりアップしますかね?
開発者の人達には頑張ってもらいたいですね。
これ以上やる気ならコテハンにしてID付けろ。 ウザイ。
> ID付けろ。 無茶ゆーなw
>>755 getsで受け取ってファイルオープンする場合は
改行を取らないとエラーになるよ。
fn = gets.chop
File.open(fn, 'w'){|f| f.write(fn) }
print fn
というか、マニュアル読めと 小難しい表現になってるところも多いが、難しくない書き方しているところも多い
いや、小難しい書き方の部類だと思うぞ。 普段の非コンピュータ感覚との乖離というか。 ------------ ねこだいすき ねこねこだいすき ごろにゃん ------------ という3行の文章があったとして、これを str = io.gets するとだな、 > 一行読み込んで、読み込みに成功した時にはその文字列を返します。 というマニュアルの表現を素直に解釈すると、最初の str は、 「ねこだいすき」 になるはずだと思うだろ。でも実際は 「ねこだいすき\n」 だ。 文章ならまだしも puts "ファイル名を入力してください" filename=$stdin.gets とかいうプログラム書いた場合、 filenameには改行がくっついてるというのは予想の範囲外だと思う。
>>759 了解しました。ありがとうございました。
$stdin.gets で
数字以外や、英数字以外など 決まった文字以外の入力じゃないとエラーにしたい場合は
正規表現とifの組み合わせで指定するしかないのでしょうか?
それともクラス指定をするのでしょうか?
学校のテストみたいに1通りの100パーセントの正解があると思ってる?
print("出力ファイル名は?") name = $stdin.gets.chomp str = "" begin while line = ARGF.gets rescue Errno::ENOENT, Errno::EACCES print("ファイルが存在しないか開く権限がありません") exit 1 end str << line end File.open(name, "w"){|file| file.write(str)} 例えばこのような出力ファイル名を指定して、引数で指定したファイルの中の行を 出力ファイルとして新たに作成する場合ですが、 引数で指定したファイルが存在しない場合、エラーを出そうと思い例外処理文を記述したのですが、 test.rb:6: syntax error rescue Errno::ENOENT, Errno::EACCES ^ test.rb:6: syntax error と文法エラーがでてしまいます。rescue Errno... の resuce より後のところを消しても一緒でした。 どこが間違っているのでしょうか? 出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら その時点でエラーを出したいと思っています。
> rescue Errno... の resuce より後のところを消しても一緒でした。 言動で同一人物だと知れる稀有な例 なんでプログラミングに際して非論理的に行動するのかさっぱりわからない
本みたら、そうしろって書いてたもので・・・ 文法にはあってるはずだと思うんですが
30行ほど説明のレス書いたがアホらしくなって消した。 わかりもしないものをめちゃくちゃに適用しておいて文句言うな。 何を言って無駄だと判断。とりあえず書名晒せ。
rescueのとこがwhileのループ壊してるな begin〜rescue〜endは、beginとrescueの間で起きた例外ならどこで起きたものでも補足する 落ち着いて範囲を広く取るといい というか、begin〜rescue〜endは別に特別でもなんでもない存在だから、 普通に文法に沿って書かないと駄目だぞ
「例外を起こさない部分がいくら含まれていても構わない」と言うほうが親切だと思った ぶっちゃけスクリプトの最初から最後までを囲っていても問題ないわけで
>>758 あ、ごめんトリップだ。
1年以上存在を忘れていた。
というわけで心当たりがある奴は名前とトリップを付けること。
772 :
デフォルトの名無しさん :2006/11/15(水) 16:01:23
>>769 どうやら、while-end でひとつの処理のようでした。
でも、出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら
その時点でエラーを出したいと思っています。 ってのは例外処理じゃ無理そうですね。
773 :
772 :2006/11/15(水) 16:18:06
open(ARGV[0])を使うことでなんとか解決しました。
標準入力から入力された文字で、何も入力されなかった場合と空白から始まる場合と空白を含む入力 の場合はエラーを表示したいのですが、空白を含む場合の指定の仕方がわからないのですが どのようにすればよいのでしょうか? out = $stdin.gets.chomp! if /^ / =~ out || out.size == 0 print("エラー") exit 1 end
ここはお前の日記帳じゃない
>774 何も入力されない /^$/ 空白で始まる /^ / 空白を含む / /
>>775 同じ奴だよな
これからもエラーが出るたびこのスレに書き込むのだろう
これじゃ人にプログラム作ってもらってるのと変わらないぞw 丸投げしたいのなら、宿題スレにでも行ったらどうだ?
こいつの場合、むしろ丸投げじゃないのが性質が悪い、と思う。
>>774 何でもいいからさっさと名前を付けろ。
そうすりゃ俺はお前をあぼーん出来る。
>>750 > File.open('file', 'r'){|f| s = f.read }
> みたいに書いた方がいいみたいですね。
それは File.read('file') で問題ない。
> まぁこれも一応「重大な問題」は無いんですよね?
バッファリングについて理解していて、その上で問題はないといい切れる状況
なら重大な問題はない。
>>751 > ジェネリックなGCにするとかいう話も出てるけど。
GenerationalとGenericで辞書引いてみろ。
>>761 > puts "ファイル名を入力してください"
> filename=$stdin.gets
Readline使え。
782 :
751 :2006/11/15(水) 21:41:17
素で間違えた。指摘d
783 :
デフォルトの名無しさん :2006/11/15(水) 22:00:56
Rubyってなんのためにあるんですか? どういう人が使ってるんですか?
趣味でプログラミングをする人のため
タイトでない業務を自作の気楽なスクリプトでガンガンこなしたいという人のため
786 :
デフォルトの名無しさん :2006/11/15(水) 22:10:14
>>786 なるといえばなる。
ならないといえばならない。
788 :
デフォルトの名無しさん :2006/11/15(水) 22:40:26
>>787 Rubyだけマスターすれば
年収450万はいきますか?
途中経過はどうでもよくてアウトプットの中身だけが必要な(個人の)業務に使う いわゆる書き捨てスクリプトを作るのに使う 途中経過の存在や内容や難易度が重要な仕事には使えない スクリプトの保守要員が別途必要とか、そういう仕事
790 :
デフォルトの名無しさん :2006/11/15(水) 22:53:52
>>789 では、Rubyを覚えれば他の別のプログラムが覚えやすいとかありますか?
RubyのGUIなんてできてもまったく需要ありませんか?
Rubyってホントにツールだよな
使えると事務仕事でもプログラマ仕事でも効率が上がる
まあ、この「使える」は習得と使用許可の両方の意味があるが…
Rubyスクリプトの作成と実行の許されない職場では完全無意味
自宅でいろんなプログラム作って二へ二へするくらいしか使いでがない
>>790 Rubyに見返りを求めるな
プログラミングの仕事が欲しいならJavaでもやれ
792 :
デフォルトの名無しさん :2006/11/15(水) 23:01:22
>>791 PerlのほうがCGIとかできるから
まだ役に立ちそうな気がするんですが
板違い プログラマー板へどうぞ
794 :
デフォルトの名無しさん :2006/11/15(水) 23:08:53
板違いも糞もあったもんじゃねーな
気違いだからな
>>792 HSPでもCGIとか出来るからそっちに行っていいよ。
798 :
デフォルトの名無しさん :2006/11/16(木) 00:18:29
Rubyは糞でFA
結局辿り着くのはPython
本スレみたいな流れにワロタ
802 :
デフォルトの名無しさん :2006/11/16(木) 12:29:12
以下の様なコード実行した場合 ローカル環境では問題無く処理されますが 何故かレンタルしてるサーバーで動かすと"var=value"が渡っていない様です… Rubyのバージョンの違いによるものでしょうか? require 'net/http' Net::HTTP.version_1_2 #←これが問題? Net::HTTP.start('www.xxx.com', 80){|http| response = http.post('/xxxx.php',"var=value") print "Content-type: text/html\n\n" print response.body } --- PHPコード --- print $_POST['var']
803 :
802 :2006/11/16(木) 13:10:49
ローカル:ver1.8.5 サーバー:ver1.8.4 です。
よくenbugするからデバッグ要員の教育にはもってこい。一方安定性重視の玄人には 受けない面もあるかもね。
>>805 でっかいの無理
適正規模だと嬉しい
just like anus
807 :
デフォルトの名無しさん :2006/11/16(木) 15:50:18
gets で読み込んだ行を タブでsplitするにはどうしたらよいのでしょうか? 3つから4つ目のカラムをついでにとります。 // の中に何がはいるのでしょうか? line.split(//)[2..3]
\t
ま た gets か はいいとして、正規表現を基礎だけでいいんで勉強しろ //の中に何が入るとかそういう理解はするな
(σ・Д・)σ gets!!
812 :
デフォルトの名無しさん :2006/11/16(木) 16:14:12
>>811 名前決めました。デフォルトの名無しさん でいきます。
num = 0 data = Array.new while line = gets str = sprintf("あ%03s",num) num++ data[str] = line.split(//)[1..2] p data[str][0] p data[str][1] end []がおかしいらしいのですが、どうすれば直るのでしょうか? 配列[文字列001][0] = x 配列[文字列001][1] = y 配列[文字列002][0] = z 配列[文字列002][1] = q こんな風にsplitで分けたやつ(x,y z,q)に、アクセスできるようにしたいのです
ま た gets か
エラーも書かないしな
>>815 q.rb:6:in `[]=': can't convert String into Integer (TypeError)
from q.rb:6
だからおとなしくPerlやC使って作ってろっての なんでわざわざRubyでやるんだ
そこにRubyがあるから
819 :
802 :2006/11/16(木) 16:54:21
俺のレスが流れた… 誰か…
Perlの時代はもう終わったから。
>>817 一連のスクリプトはRubyであることを頑なに拒否したスクリプトだよな
他の言語でやったほうがいいと思う
>>802 第二引数ってHashじゃないの?
{"var" => value} とか。
関係ないけど、おれはnet/httpよりWebAgentの方が好き。
>>822 手持ちのHTMLヘルプだと「headerはgetと同じです」とか言いながら
直後のサンプルコードでは思いっきりStringだぞ(w
# version 1.2
response = http.post( '/cgi-bin/search.rb', 'query=subject&target=ruby' )
824 :
802 :2006/11/16(木) 17:14:34
825 :
813 :2006/11/16(木) 17:56:33
お願いします
826 :
813 :2006/11/16(木) 18:17:16
頼みますorz
828 :
813 :2006/11/16(木) 18:45:30
830 :
デフォルトの名無しさん :2006/11/16(木) 18:51:14
Ruby Home Pageがずっと 「ページを表示できません」なんですが 私だけでしょうか?
>>827 これ、やっぱPHPのとこがレン鯖では正確に処理されてて
<? print $_POST['var'] ?>
なら動作するとかそんなよくあるオチだと思うよな
どんなふうに「できてない」のかの正確な情報が無かったから長期放置されてるが、
「"var=value"が渡っていない様です」の判断理由が「xxxx.phpの中身が素で表示されてるから」とかなら
ぶちゃけそんなとこではないかと
833 :
813 :2006/11/16(木) 18:56:55
配列の行列でもできないのですか
>>832 xxxx.phpをRubyスクリプトで書けば原因の切り分けができたんだろうけどな
PHPで書き続けたのがマズかったのかもしれない
いや、これが原因だと限ったもんでもないが(w
>>830 時々503になる
閲覧者が多くてコケてる模様
835 :
813 :2006/11/16(木) 19:12:28
num = 0 data = Array.new while line = gets str = sprintf("あ%03s",num) num++ data[#{str}] = line.split(/\s/)[1..2] p data[#{str}][0] p data[#{str}][1] end q.rb:9: syntax error エラーが変わりました。最後のend行がおかしいようには思えないのですが・・・ ちなみにこれが標準入力でよんでるファイルです this is a pen desu yo where is watashi ha nani shite runo de suka
836 :
デフォルトの名無しさん :2006/11/16(木) 19:21:55
837 :
813 :2006/11/16(木) 19:44:11
num = 0 str = Array.new while line = gets str = sprintf("あ%03s",num) s = line.split(/\s/)[1..2] p s[0] p s[1] p num num += 1 end こんな感じなのかな。一応できたけど、 本当は、s001[0] s001[1] s002[0] s002[1] みたいにしたいけど
839 :
802 :2006/11/16(木) 20:44:06
>>831 すみません正確に書くと、以下です。
ローカルで実行した場合「value」が表示され
サーバーにアップして実行すると、何も表示されないんです(phpスクリプト自体はエラー無く実行出来る)…
あと別のスクリプトをhttp.postで実行した場合もサーバーではPOSTメソッドの値が渡ってない様です…
とにかくローカルでは上手く行って、サーバー側ではキチンと処理出来ないので困ってます…
require 'net/http'
Net::HTTP.version_1_2 #←これが問題?
Net::HTTP.start('www.xxx.com', 80){|http|
response = http.post('/xxxx.php',"var=value")
print "Content-type: text/html\n\n"
print response.body
}
--- PHPコード ---
<?php
print $_POST['var']
?>
>>837 やりたいのはこういう事?
num = 0
data = Hash.new
while line = gets
str = sprintf("あ%03d",num)
num += 1
data[str] = line.split(' ')[1..2]
p data[str][0]
p data[str][1]
end
841 :
802 :2006/11/16(木) 21:00:01
もう少し詳しく説明すると 既にサーバー上で問題なく動いているPHPスクリプトがあるんですが そのスクリプトに839の形式でアクセスした場合も ローカルでは問題なくPOSTメソッドの値が渡り Rubyスクリプト自体をサーバーにアップして実行した場合に限りPOSTメソッドの値が渡らないんです… 例えば、ログインのパスワードをPOSTで渡したとしたら ローカルからだとPOSTで渡したパスワードが正しく認識されログインページが表示されるんですが サーバー上で実行すると、パスワードが渡っておらず、エラー表示されてしまいます… Rubyのスクリプトはまったく同じ物を使用しているので、まず間違っている事は考えられません… なぜでしょうね…
>>840 ありがとうございました!それでいけました。
Rubyではハッシュを使うんですね。
>>842 とりあえず私はどうすればいいんでしょうか?
一応、本で調べてそれなりに考えて質問しているのですが
data[str][1] = line.split(/ /)[8]
data[str][2] = line.split(/ /)[7]
これをひとつ(1行)にまとめたいのですが、どうすればできるのでしょうか?
ハッシュ使ってると難しいのでしょうか。
perlだだと , で区切ってsplitをまとめればいけるのですが・・・
data[str][1],data[str2] = line.split(/ /)[8..7] みたいに
>>843 試してから書けカス。
それと、そんなにperlが好きならperl使ってろ。
>>845 >843の最後の行のまま書いたのなら通るわけがないぞ、ボケ。
ホント、死ねばいいのに。
>>847 文法エラーだったんですが、この場合どうまとめればいいのか・・・
そもそもまとめられるのかが
>>846 調べずにいきあたりばったりの想像で書いてるからな
Perl使ってろと言われるのもそのせいだ
>>849 申し訳ない。
これは、ここに書き込むとき間違っただけでした。
[str][2] です。はい。
>>850 むむ、でもこれだとさすがに書いてない・・・
つかいちいちPerlを書くのは何故だろうな Rubyスクリプト書いてるんじゃないのかと 本読んでるとか調べてるとか嘘だろと しかもPerlのとこでエラー出たら文句言うしやってられん
もしかして、どこかのサイトとかに「Ruby は Perl の上位互換です」 とか書いてあるのか?
そもそもこのRubyスレ初心者といいますか質問者もさっきの除けばいねーからな・・・
857 :
802 == 839 == 841 :2006/11/16(木) 23:35:58
また俺のレスが… 誰かお願い…
いや、インクリメント演算子強行推進派のテロという可能性も
859 :
デフォルトの名無しさん :2006/11/16(木) 23:54:31
スレタイにいれとけよ Perl>>>Ruby とでも
>>843 まじめにお願い。次書き込むときからは、名前欄にあなたの好きな名前を
入れて書き込んで下さい。
俺らだってあなたに答えてあげてるじゃん。
だから俺のお願いも聞いてよ。
ギブアンドテイクってやつだよ。
861 :
843 :2006/11/17(金) 00:27:18
>>843 data[str][2], data[str][1] = line.split(/ /)[7..8]
>>841 サーバ上でRubyスクリプトを実行って、どうやってるの?
シェルアカウントがあってそれで実行してるってこと?
>863 最近はPerlだけでなく Rubyの使えるサーバも増えて来たよ
865 :
802 == 839 == 841 :2006/11/17(金) 10:38:44
>>863-864 レンタルしてるサーバーの一つはRubyのCGIに対応してるんです。
ですが他にレンタルしてるサーバすべてPerlとPHPのみなので、その一つのサーバーでしかテストも出来ないんで困ってます…
また、PHPで受け取っていたPOSTの部分をRubyで書き直してみましたが、やはり結果は同じものでした…
以下のコードを実行した場合、ローカル環境では「value」が表示され、test.cgiをサーバー上にアップして実行すると何も表示されません…
「out.cgi?var=value」とするとキチンと表示されますので、スクリプトが間違っているという事はないのですが…
そもそもローカルでtest.cgiを実行すると問題ないですし… まったく分からずお手上げ状態で困ってます…
--- test.cgi ---
#!/usr/local/bin/ruby -Ks
require 'net/http'
Net::HTTP.version_1_2
Net::HTTP.start('www.xxx.com', 80){|http|
response = http.post('/out.cgi',"var=value")
print "Content-type: text/html\n\n"
print response.body
}
--- out.cgi ---
#!/usr/local/bin/ruby -Ks
require 'cgi'
cgi = CGI.new
cgi.out("charset"=>"EUC-JP"){ cgi['var'] }
[実行結果]
http://localhost/test.cgi → value
http://localhost/out.cgi?var=value → value
http://www.xxx.com/test.cgi → まっしろ…
http://www.xxx.com/out.cgi?var=value → value
ローカル:Ruby 1.8.5
サーバー:Ruby 1.8.4
>>864 いや、そんなことを聞いてるんじゃなくて、どうやってスクリプトを実行してるのか、
ということ。
>>865 CGIとして実行してるのね。そこが重要なポイントだった。
そのtest.cgi、全体をbegin〜endでくくって、rescueで例外を出力するようにしてみ?
>>866 レスどうも!やってみました。これでいいんでしょうか?
結果は何も表示されませんでした…
begin
Net::HTTP.version_1_2
Net::HTTP.start('www.xxx.com', 80){|http|
response = http.post('/out.cgi',"var=value")
print "Content-type: text/html\n\n"
print response.body
rescue
print "Content-type: text/html\n\n"
print $!
end
getでやるとどうなんの
ローカル、サーバーでの実行共、まったく問題なく値が渡りました。 Net::HTTP.version_1_2 Net::HTTP.start('www.xxx.com', 80){|http| response = http.get('/out.cgi?var=value') print "Content-type: text/html\n\n" print response.body [実行結果] test.cgi → value
つーかまだ揉めてたのか GETで試す必要はないと思うぞ。ブラウザURL直打ちでのアクセスはGETだから。 適当なFORMのあるHTMLファイルを作って、POSTでwww.xxx.comのxxxx.phpなりout.cgiなりを踏んでみ。 別サーバ(ローカル)と同一サーバ上(xxx.com)の2箇所からな。 あと、「varの中身だけ返す」とかわかりにくいCGIでデバッグ続けるのはやめたほうがいい。 ただの空白が帰ってきた場合、どこで失敗してんだかよくわからんから。 cgi.out{ "result: #{cgi['var']}" } とか、空であることがはっきり視認できるプログラムにしたほうがいい。
871 :
802 == 839 == 841 :2006/11/17(金) 14:54:56
>>870 以下の様なformから実行してみましたが、ローカル、サーバーどちらでも正常に値が渡っている様です(php,cgi共に)…
やはり、サーバーからアップしたRubyのCGIからのみ値が渡らないです… 一体何が悪いのか…
違いといえば、OSとApacheのバージョン、それからRubyのバージョンです。これらが何か関係しているのでしょうか?
<form action="out.cgi" method="post">
<input type="text" name="var" value="">
<input type="submit" value="submit">
</from>
[ローカル]
OS: WindowsXP SP2
Apache: 2.0.52
Ruby: 1.8.5
[サーバー]
OS: RedHatLinux 7.3
Apache: 1.3.37
Ruby: 1.8.4
print "Content-type: text/plain\n\n" print "**#{response.body}**" でやって
873 :
802 == 839 == 841 :2006/11/17(金) 15:46:19
>>872 実行してみました。
やはりサーバーの方は値だけ渡ってない様です… なんでだろう??
--- test.cgi ---
#!/usr/local/bin/ruby -Ks
require 'net/http'
Net::HTTP.version_1_2
Net::HTTP.start('www.xxx.com', 80){|http|
response = http.post('/out.cgi',"var=value")
print "Content-type: text/plain\n\n"
print "**#{response.body}**"
}
--- out.cgi ---
#!/usr/local/bin/ruby -Ks
require 'cgi'
cgi = CGI.new
cgi.out("charset"=>"EUC-JP"){ "result: #{cgi['var']}" }
ローカル: **result: value**
サーバー: **result: **
ENV['QUERY_STRING'] も空なのかな。
>>874 GETで渡せば "var=value" になりますが
POSTだとローカルでもサーバーでも空ですね。
PHPからだと問題なく処理されてます… ヽ(`Д´)ノ
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '
http://www.xxx.com/out.cgi ');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'var=value');
ob_start();
curl_exec($ch);
$s = ob_get_contents();
ob_end_clean();
curl_close($ch);
print $s;
?>
[結果]
result: value
877 :
デフォルトの名無しさん :2006/11/17(金) 19:30:46
string ="テスト" array[#{string}] 何でこんな面倒なんですか? array[string] じゃエラーになるんですが 単にstringと間違えてるだけなんでしょうか 宣言があればstringでいけるようにと思うのですが
またお前か
irb(main):001:0> string ="テスト" => "\203e\203X\203g" irb(main):002:0> array[#{string}] irb(main):003:1* irb(main):004:1* irb(main):005:1*
まったく問題ないが。 h = {'a'=>'Hello World!'} k = 'a' print h[k]
だからどんな「本」を読んでるのか晒せって言われてるだろうに
884 :
デフォルトの名無しさん :2006/11/18(土) 00:21:10
array#each がものすごく遅いような気がするんですが、 速度上げる方法ってありますか?
普通はそんなに遅くならない
887 :
デフォルトの名無しさん :2006/11/18(土) 00:45:59
FixNumの配列なら、NArrayを使う。
889 :
884 :2006/11/18(土) 01:54:43
>>888 ありがとうございます。
早速つかってみます。
each は遅いから for を使えって話なかったっけか? a.each { |i| hoge } の代わりに for i in a do hoge end
>>890 単にforの方が速いって話はあったが、「for使え」までは言ってなかった気がする。
eachの遅さが問題になるってどんなスクリプトだろう
>>890 それで解消される「重さ」なんて微々たるもんだと思う
それ以外の構造的なナニカを正したほうが良さげだ
そもそも、「eachが遅い」などというのはよっぽどでないと断言できん
遅いのはたいがいeachの中や配列に問題ありだ
Rubyは簡単な処理も遅くてびっくりするよ
>>894 遅くて困るなら他の言語使えばいいじゃない。
遅いだけで困らないなら遅くても別にいいじゃない。
拡張ライブラリ書いてるよ
いや、Rubyが他の言語と比較して平均して遅いってのは構わないんだが、 普通使っててそんな遅くないはずの処理が名指しで遅いと言われるとちと困る
898 :
デフォルトの名無しさん :2006/11/18(土) 02:43:10
最適化したら2割速くなったとか言ってるくらいだし相当無駄があるんじゃねーの?
899 :
884 :2006/11/18(土) 02:43:44
要素数2000個程度の配列aとbで a.each{ b.each{ hoge } } みたいなことをやってます。 % cumulative self self total time seconds seconds calls ms/call ms/call name 64.66 242.97 242.97 13187 18.42 56.37 Array#each 14.04 295.72 52.75 689386 0.08 0.08 Array#[] 13.59 346.76 51.05 684840 0.07 0.07 Fixnum#- こんなだったのでeachが早くなればいいなと思って質問しました。
eachに時間がかかってるように見えて、 単にブロックで(メソッド呼ばない)重たい処理やってる可能性もアリ。 $ ruby -rprofile -e '[0].each{ while true; end }' (^Cで止め) % cumulative self self total time seconds seconds calls ms/call ms/call name 100.00 7.72 7.72 1 7721.00 7721.00 Array#each こんな表示になるし。
こういう時は Profile だな
あ、リロード忘れておバカなレスをしちゃった。 OTL
>>890 でもfor文はeachを使って実装されてるって聞いたことあるけど。
>>900 そりゃ、CTRL-Cで止めてるからだろ。普通はこうなる。
>ruby -rprofile -e '[0].each{ 10000000.times {} }'
% cumulative self self total
time seconds seconds calls ms/call ms/call name
100.00 4.21 4.21 1 4206.00 4206.00 Integer#times
0.00 4.21 0.00 1 0.00 4206.00 Array#each
0.00 4.21 0.00 1 0.00 4206.00 #toplevel
すいません。教えてください。 exerbでexeを作りたくて以下のようにやりました。 mkexy hoge.rb exerb hoge.exy するとexeができたのですが、実行してみると以下のようにエラーが出ます。 2[main] hoge 2340 C:\cygwin\home\hoge\hoge.exe:*** fatal error - C:\cygwin\home\hoge\hoge.exe: *** Incompatible cygwin .dll -- incompatible preprocess info 0 !=168 cygwinのdllがまずいらしいのですがどうしたら良いでしょうか。
>>904 >>900 には
> 単にブロックで(メソッド呼ばない)重たい処理やってる可能性もアリ。
と書いてあるのに、なんで Integer#times を呼んでるんですか?
907 :
デフォルトの名無しさん :2006/11/18(土) 17:43:26
>>600 なんだ、" " を書きたかったのか。
$Q とか使えばいいじゃん。
irb(main):006:0> aaa = 123 ; %Q(#{aaa}"vvv"bbb)
=> "123\"vvv\"bbb"
908 :
デフォルトの名無しさん :2006/11/18(土) 20:45:57
上の方で、cgi.rbはobsoluteだから、フレームワーク使っとけって話が出ていましたが、
お奨めなものってありますでしょうか?
RoRは大掛かりな上に、多くのレンサバでは動かしにくいですよね
>>905 実行環境のrubyが、cygwin版だからじゃね?
まだないんじゃない? 次のRubyには何がつく予定なんだっけ?
>>908 webrickのservlet
ドキュメント無いけどな。
質問。Net::HTTPのgetの、 > ブロックとともに呼ばれた時はエンティティボディを少しづつブロックに与えます。 の「少しずつ」ってナンデスカ
「少しずつ」なんてどこにも書かれてませんが何か …仮にもマニュアルなんだから「少しずつ」と正しく書いて欲しいな で、http.rb のソースには # Gets entity body. If the block given, yields it to +block+. # The body is provided in fragments, as it is read in from the socket. とか書いてあったのでそのように振舞うのだろう。 気になるならブロックの中で sleep とか p Time.now とかして時間の経過見てみたら
1024バイトくらい
>>913 だな
Net::HTTP.start(server,'80'){|http|
http.get(path){|str|
p Time.now.to_f
p str.size
}
}
1163866453.46546
1024
1163866453.47371
1024
1163866453.48204
1024
:
…でも、1024バイト分の処理が終わらないとサーバに続きを取りに行かないみたいだ
相手のサーバにとっては時間が余分にかかってちと迷惑な話かもしれん
でも一気に全部読み込むとこっちのメモリがーみたいな
>>908 俺はシンプルかつ応用の利くcgi.rbが一番いいと思うよ
他のフレームワークは、設計に独自色が強く
使い方を理解するまでに苦労することが多々ある
RoR → 鍋スープ大袋 cgi.rb → めんつゆ 塩 → net/http他 醤油に相当するものがない
require Yamada
require zabuton
>>919 Yamada.tainted? #=> true
>>920 zabuton.tainted? #=> true
>>919-920 NameError: undefined local variable or method `Yamada' for main:Object
NameError: undefined local variable or method `zabuton' for main:Object
p yamada.nil? #=> true p yamada.empty? #=> true
924 :
デフォルトの名無しさん :2006/11/19(日) 22:02:12
Perlではこう短く書けるやつが while(<>){ chomp; $line .= $_ } Rubyではこれが最小なのでしょうか? seq = "" while line = gets line.chomp! data << seq end
>924 data = "" while gets chomp! data << $_ end でもいいけど。 ただそこまでしてレシーバ書きたくねーもん?
>>925 そっちのほうが軽いかと思って
でも、やっぱ data=""
これはいるんですね。
自動で判別してくれてもいい気がするけど・・・
ありがとうございます。
>>924 $stdin.readlines.each{|x| x.chomp!}.join
eachじゃなくてmapじゃねーの?
929 :
デフォルトの名無しさん :2006/11/19(日) 23:41:36
h = {"abc" => "123", "zxq" => "468"} p h.keys[0][1] p h.values[0][1] p h.to_a[0][1][1] これのvalueの123の3や、468の6を取り出したい時はどうすればよいのでしょうか? これを実行したら 98 50 50 と結果が表示されてしまいました。 配列の場合は、h[1,2] などで1から2文字目を抽出できるのですが。ハッシュだと どうすればよいのかわからなくて困っております。
>>929 この場合、Hashに格納されているStringの操作なんだから
ArrayもHashも変わらんよ。
>>929 > valueの123の3
ハッシュhのキー"abc"の値に格納されてるStringの3文字目
> 468の6
ハッシュhのキー"468"の値に格納されてるStringの2文字目
932 :
デフォルトの名無しさん :2006/11/20(月) 00:12:39
h = {"abc" => "123", "zxq" => "468"} p h["abc"][2] 結果は、51 ハッシュhのabcキーの値が123 # h["abc"] ハッシュhのabcキーの値の3文字目 #h["abc"][2] → 51 これだと思ったのですが、違うか・・・
p h["abc"][2].chr p h["abc"].split(//)[2]
>>932 irbとか使ってインタラクティブに色々やってみると分かりやすいんじゃないかな。
irb(main):001:0> h = {"abc" => "123", "zxq" => "468"}
=> {"abc"=>"123", "zxq"=>"468"}
irb(main):002:0> h["abc"]
"123"
=> nil
irb(main):003:0> h["abc"][2]
51
=> nil
irb(main):004:0> h["abc"][2].chr
"3"
=> nil
irb(main):005:0> [h["zxq"][0].chr, h["zxq"][1].chr, h["zxq"][2].chr]
=> ["4", "6", "8"]
>>926 お前もいい加減コテ付けてくれ。
「よく理解できるまでは無理して短く書くな」ってカーチャンに教わらなかったか?
p h['abc'][-1, 1]
しまった被ったか。 ついでに、コピペした後編集したもんだからirbの出力が変な事に。
>>932 p 51.chr
"3"
文字列[n]は、nバイト目の文字の文字コード(文字そのものではない)を整数で返す
配列[n]はn番目の要素をそのまま返すが、文字列の場合は挙動がちょっと違う
939 :
デフォルトの名無しさん :2006/11/20(月) 00:25:38
>>933-934 そうですね。.chrがいるのか。どうもすみません。ありがとうございました。
splitの方は、配列の文字列が多くなるとやはり処理に時間がかかりそうだから、chrのがよさげですね。
>>926 >でも、やっぱ data=""
>これはいるんですね。
初期化無しでの使用を許してしまうと
スペルミスでバグを作り込んでしまう事が多くなる。
>>926 それはスコープの問題。
>>927 そこはinjectがハマルはず。
$stdin.readlines.inject(''){|result, x| result << x.chomp!}
inject厨キター しかしinjectの導入はなかなか英断かもしれない ここに適用できると思い至るまで時間かかるけどな
>>941 injectに副作用な記述のブロックを付けるのは気持ち悪い。
injectがそういうもんだと初心者の誤解を招くからヤメレ。
副作用的ってどう言うことだろう? result << x.chomp! じゃなくて、result + x.chomp! と書けって言うこと? あと細かいけど、x.chomp! じゃなくて x.chomp じゃないと たまに nil が返るかもしれないので余りよくない。
>>924 result = $stdin.read.split(/\n/).to_s
とか
result = $stdin.read.gsub(/\n/, "")
は?
そんなに短くしても意味ないと思うんだが $<.read.gsub($/){}
そのうちread(result)だけで 改行削除までして結合してresultに全て読み込んでくれるんじゃね
Ruby/Tkで、横にスクロールバーを付けたテキストウィジェットのテキスト表示部分に 下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、 自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?) にはどうしたらいいですか教えて下さいお願いします。
Hash使うときは毎回 h = Hash.new i = Hash.new box = Hash.new みたいに宣言が必要なのでしょうか? いきなり box["key"] = value みたいにしてもハッシュにならないのですが、ちょっと面倒ですね。
本買ってやるから住所と名前教えろ
>>951 たのしいRubyという本をもっております。
>>950 Rubyは君の要求を満たさない
他の言語を使うべし
>>950 つbox = { "key" => value }
しょせんオナニー言語だから 細かいところで気が利かないんだよね
Perlでいうと for($i=0:$i<=100,$i=$i+5){} をRubyでするにはどうしたらよいのでしょうか? while文ではなくfor文でしたいのですが
この場合、Rubyが細かいところに気がきかないというより、バカにつける薬はない、が正しい。
a,b,c = split(/\t/)[1,3,8] これで何故、3つとれないのでしょうか? in `[]': wrong number of arguments (3 for 2) (ArgumentError) こんなエラーがでます。
>>957 Rubyでは普通は Range#step を使う
(0..100).step(5) {|i| puts i }
この場合は、Integer#step(limit, step) {|n| ... } も使えるけど。
>>960 なるほどありがごうざいます。
その場合は、<= >= が有効なのかな。
> や < だと
100 の場合 100も含まれることになりますよね。
Ruby/Tkで、横にスクロールバーを付けたテキストウィジェットのテキスト表示部分に 下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、 自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?) にはどうしたらいいですか教えて下さいお願いします。
>>958 > バカにつける薬はない
こういう言い訳ばっかりして一向に薬を出さない医者、みたいな言語だよねRubyって。
Perlではこう書けるのにRubyで同じように書けない、を繰り返す奴には、Perl以外の薬はない。
965 :
959 :2006/11/20(月) 15:09:55
お願いしますm(__)m
967 :
959 :2006/11/20(月) 15:29:12
見るのはsplitじゃなくて[]だろ
>>964 簡潔さで勝負して欲しくないよね。負けるから。
970 :
959 :2006/11/20(月) 15:39:02
selfのとこみるんですよね? のってなくないですか?
のってたらエラーにならねーよ
972 :
959 :2006/11/20(月) 15:54:46
a,b,c = split(/\t/).values_at(1,3,8) できたー
973 :
959 :2006/11/20(月) 15:55:55
>>972 それって面倒じゃないですか?
Perlだと[3,4,6] みたいにできるのですが・・・
>>969 本当に簡潔さで勝負するとどっちがより簡潔に書けるかは、Code Golfを見ればわかる。
今現在で17のchallangeがあって、1位がRubyなのが10個、1位がPerlなのが6個、1位がPythonなのが1個。
976 :
959 :2006/11/20(月) 16:07:03
すみません。何で [1..6] みたいなはできるのに[1,3,4]とかはできるようにしなかったのでしょうか?
Perlは簡潔っつーか、短いんだな 長いのがJava
978 :
959 :2006/11/20(月) 16:08:49
class Array; def [](*args) values_at(*args) end end a,b,c = split(/\t/)[1,3,8] できたー
暗号→sed 短い→Perl 普通→Ruby、Python 長い→Java 長ったらしい→PHP つーか関数名やメソッド名の話じゃねーのか
>>976 Array#[start, length] というのがあるし今さらそういうふうにはできんなぁ。
>>961 Rangeリテラルは、終端を含む場合は、start..end で、含まない場合は start...end になる。
プロポーショナルフォントだと分かりづらいけど、ドットの個数が違う。
>>959 Rubyにarray[i,j,k]というような記法はないので
array = [1, 2, 3, 4, 5]
a, b, c = array[0,1,3]
と書くとエラーになる
なぜArgumentErrorなのかは自分で考えてくれ
982 :
961 :2006/11/20(月) 16:19:20
>>980 細かい使い分けが必要なんですね。
でもstepだと100から0 に5ずつ下がるのができないのですが
100..0 が使えないのは何故なのでしょうか?使えるようにしたほうが便利な気がするのですが
983 :
976 :2006/11/20(月) 16:21:07
>>980 , , と2個ある場合にそう認識するようにすればいいのでは?
話し掛けてる奴はなんなんだ スレ壊したいのか
100.step(0, -5) {|n| p n}
moji = Hash.new moji = {"List" => "qwrtyuiopl", "word1" => "ABCDEFGHIJ, "word2" => "1234567890} for i in 0..9 words = moji["word1"][i].chr + ncbi["word2"][i].chr p words box = {"#{words}"=>"#{moji["List"][i].chr}"} p box end p box["B2"] 何故これを実行する nilが返ってくるのでしょうか? words には それぞれ words["key"]→value として値が格納されているのではないのでしょうか? p bo["B2"]を指定するとwが返ってくるとはずなのですが、かえってきません。
moji = { "List" => "qwrtyuiopl", "word1" => "ABCDEFGHIJ", "word2" => "1234567890" } box = {} for i in 0..9 words = moji["word1"][i, 1] + moji["word2"][i, 1] p words box[words] = moji["List"][i, 1] p box end p box["B2"]
988 :
962 :2006/11/20(月) 18:58:33
誰か分かる人いませんか?ネットで調べても分かんないす
Tkのスレで聞け
s = ((s == nil) ? ('') : (s)) 「s」がnilの場合は空文字で初期化して その他の場合は変更ナシとしたいのですが 上のコードより綺麗に書けますか?
s = "" if s.nil?
992 :
デフォルトの名無しさん :2006/11/21(火) 02:25:37
>>991 おおっ
ではこの場合のもっと洗練された記述法はありますか?
s = ((c == nil) ? ('') : (c))
993 :
デフォルトの名無しさん :2006/11/21(火) 03:48:15
引数で複数指定したファイル名を、 逐次入力して変換していくものを作りたいのですが、 これだとgetsが動いてくれないようです。どこがおかしいか教えていただけませんか? while arg = ARGV.shift print arg, ":\n" name = gets.chomp. system("mv #{arg} #{name}") end
right
.
..
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。