Ruby初心者スレッドPart8

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


宗教的な話題は禁止します。
2デフォルトの名無しさん:2006/09/28(木) 15:31:54
# 本スレ
Rubyについて Part 24
http://pc8.2ch.net/test/read.cgi/tech/1159315598/

# 関連スレ
【Agile】Ruby on rails相談所 part2【DRY】
http://pc8.2ch.net/test/read.cgi/php/1151254378/

RUBYの宿題教えてください。
http://pc8.2ch.net/test/read.cgi/tech/1106572657/

【最高言語】 Rubyist Magazine創刊 【ルビま!】
http://pc8.2ch.net/test/read.cgi/tech/1094825807/
3デフォルトの名無しさん:2006/09/28(木) 15:33:11
4デフォルトの名無しさん:2006/09/28(木) 15:33:46
= 公式非公式関連リンク

== Rubyを知る
Ruby Home Page
http://www.ruby-lang.org/ja/

== Ruby使用時の調べもの
Rubyリファレンス
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)
リファレンスのHTMLヘルプ版配布
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide
http://www.ruby-doc.org/docs/ProgrammingRuby/
# 好評書籍をWebで公開中、ただし英語
逆引きRuby
http://www.namaraii.com/rubytips/
5デフォルトの名無しさん:2006/09/28(木) 15:34:44
== Ruby使用時の探し物
RAA - Ruby Application Archive
http://raa.ruby-lang.org/
RubyForge
http://www.rubyforge.org/
# 共にRubyのアプリやライブラリが検索できる

== Ruby関連のニュースや読み物
日本Rubyの会 公式Wiki - 日本Rubyの会Wiki
http://jp.rubyist.net/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
# コードレビューが好評

== いろいろRubyサイト
Matzにっき … Ruby作者の日記
http://www.rubyist.net/~matz/

Ruby hotlinks 五月雨版 … Ruby関連の日記やblog
http://www.rubyist.net/~kazu/samidare/
Rubyの本一覧
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2
<rubyXML/>
http://www.rubyxml.com/
Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
6デフォルトの名無しさん:2006/09/28(木) 15:43:15
お前らのモノグサ振りにはびっくりだ。
次スレは>>980が立てること!
7デフォルトの名無しさん:2006/09/28(木) 15:44:02
もうRubyスレは一本にまとめていいんじゃないだろうか。
8デフォルトの名無しさん:2006/09/28(木) 15:57:38
1000でスレ立てするなんて神だな。

>>7
ここ以外は隔離スレなのでだめです。
9デフォルトの名無しさん:2006/09/28(木) 16:09:20
前スレのものです。
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のインストールはできなのでしょうか?
10デフォルトの名無しさん:2006/09/28(木) 16:18:43
universeにあるだろ
11デフォルトの名無しさん:2006/09/28(木) 16:25:54
うちは、universe切っても、irb出てくるけどな。

可能性あるとしたら、
・apt-get updateしてない
・dapper universe を参照してない
 /etc/apt/source.lst の上の方の 〜dapper universeてなってるところのコメントをはずして、
 apt-get update してみ
12デフォルトの名無しさん:2006/09/28(木) 16:41:13
9です。
コメントをはずすとインストールできました。
教えていただいてから調べると、確かにそう書いてあるサイトがありました。
調べ不足から、お手数お掛けしてすいません。
ありがとうございました。
13デフォルトの名無しさん:2006/09/28(木) 17:19:25
質問者じゃないけど、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



1413:2006/09/28(木) 17:35:36
自己解決しました。引数と戻り値の型の設定を間違っていました。
次のコードで一応、動きました。

  Setarg = Win32API.new(DLL, 'mecab_new', 'ip', 'i')
  Analyze = Win32API.new(DLL, 'mecab_sparse_tostr', 'ip', 'p')

これでコマンドラインからアクセスせずに済みそうです。
15デフォルトの名無しさん:2006/09/29(金) 01:59:39
> お前らのモノグサ振りにはびっくりだ。
だがそれがいい。
16デフォルトの名無しさん:2006/09/30(土) 18:10:11
すみません、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
17デフォルトの名無しさん:2006/09/30(土) 18:17:49
圧縮した接続をacceptしなきゃいいだけじゃないの?
18デフォルトの名無しさん:2006/10/01(日) 03:55:47
下のコードで、"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"]
19デフォルトの名無しさん:2006/10/01(日) 04:00:20
削除したらインデックスは変わる
20デフォルトの名無しさん:2006/10/01(日) 04:02:50
>>18
私自身初心者なので模範コードは示せませんが、each_indexで処理すると

array[0] #=> aaaなので削除 結果 array = [ bbb, accc, addd, aeee ]
array[1] #=> acccなので削除 結果 array = [ bbb, addd, aeee ]
array[2] #=> aeeeなので削除 結果 array = [ bbb, aeee ]

という理由ではないでしょうか。
21デフォルトの名無しさん:2006/10/01(日) 04:08:10
そのコードそのものの動作をさせたいなら
array.delete_if{|x| re =~ x}
22デフォルトの名無しさん:2006/10/01(日) 04:47:46
>>19
なるほど、そうですね。orz

>>20
明解な説明ありがとうございます。

>>21
やりたいのはそれでした。
もっと精進します。

みなさんありがとうございました。
23デフォルトの名無しさん:2006/10/02(月) 06:27:30
rubyで、cなんかで言うenumをしたいときはどうすればいいんでしょ。
Javaみたいに、classに定数を追加していくのが、ruby流ですか?
24デフォルトの名無しさん:2006/10/02(月) 07:01:29
Ӓや&H1234などの数値文字参照を該当文字に変換したいのですが、
マルチバイト文字コードを該当文字にする関数がわかりません。
chrのマルチバイト対応のような関数はありますか?
25デフォルトの名無しさん:2006/10/02(月) 07:05:44
文字化けしてしまったので全角にしました。

&#1234や&H1234 などの数値文字参照を該当文字に変換したいのですが、
マルチバイト文字コードを該当文字にする関数がわかりません。
chrのマルチバイト対応のような関数はありますか?
26デフォルトの名無しさん:2006/10/02(月) 07:52:22
Rubyで使えて、日本語の解説が豊富で、無料で使えるPDFライブラリは存在しますか?
27デフォルトの名無しさん:2006/10/02(月) 10:31:59
>>26
Ruby PDFでググって、上位のライブラリが理論上は最も日本語の情報が豊富なライブラリ。

>>24,25
ttp://moriq.tdiary.net/20040903.html
どういう入力からどういう出力が欲しいのかちゃんと書こう。
あと数値文字参照とRubyで扱える文字エンコードが一致しないので文字列化しても正規表現とかの操作はできないと思われ。
バイト列として操作はできると思うけど意味あんのかね。

>>23
単純にはそう。
その気になればModule#const_setとかで色々できると思うけど標準の方法はない。
28デフォルトの名無しさん:2006/10/02(月) 10:39:37
>>24,25
ああごめん。
IconvとかでUTF-8に変換してから操作してや。
29デフォルトの名無しさん:2006/10/02(月) 11:05:38
perlのText::ParseWordsに相当するモジュールはありませんでしょうか?
Text::ParseWordsは、テキストを解析して、トークンの配列を返すモジュールです。

具体的には、スペースで区切られた要素(ダブルクォートで囲まれる場合がある)を処理したいのです。

元の文字列
a b "c d e" f "g"
から
a
b
c d e
f
g
という配列を取り出したい。
30デフォルトの名無しさん:2006/10/02(月) 11:14:59
shellwordsでどうよ
31デフォルトの名無しさん:2006/10/02(月) 11:18:28
>>30
いけました。
ありがとうございます
3226:2006/10/02(月) 18:38:27
>>27
ググっては見たんだけど、ろくなライブラリが無いね。
この辺りは、Javaの方が強力なので、Javaで作ったコマンドをRubyから叩くことにしました。
33デフォルトの名無しさん:2006/10/02(月) 22:04:45
>>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がフリーズする
のはなぜですか?
36デフォルトの名無しさん:2006/10/03(火) 19:21:24
>34
環境は?
gdbm とかは入ってるの?
37デフォルトの名無しさん:2006/10/03(火) 19:42:00
>>33
ありがと。Rhinoをためしてみる。
3834:2006/10/04(水) 08:42:10
環境はLinuxです。GDBMをいれてconfigure,make,make checkかけましたが
結果が変わりません。同じエラーが出てしまいます。DBM,SDBMも入れないとだめ
なのでしょうか?
3934:2006/10/04(水) 08:51:11
Rhinoを入れてみようとしましたがコンパイルエラーでできません。
何か別なのを教えてください。できればCで書かれたJAVA->Ruby変換
ソフトみたいなのがいいです。
40デフォルトの名無しさん:2006/10/04(水) 09:23:46
>>34
「このエラーの意味」どころかどんなエラーが出たかがわかりません。
41デフォルトの名無しさん:2006/10/04(水) 09:24:29
>>35
メモリかマザーボードが氏んでるとか。
42デフォルトの名無しさん:2006/10/04(水) 09:57:47
>>39
Rhinoはコンパイル必要ない。
ttp://www.mozilla-japan.org/rhino/からZIPファイル拾ってきて中に入ってるjs.jarが本体
つか、ドキュメント読めよ。
もしかしてRhinoをRubyインタプリタだと思ってる?
だとしたら違うよ。JavaScriptインタプリタだよ。Javaで導入が簡単なLL環境だから勧めただけ。
せめてRjbなりYajbなり試してからおいで。
Rjb ttp://arton.no-ip.info/collabo/backyard/?RubyJava%A5%D6%A5%EA%A5%C3%A5%C2
YAJB ttp://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/cgi-bin/fw/wiki.cgi?page=YAJB%5Fja

今の感じだと、そもそも全部Javaで書いた方が幸せかもしれんよ。
それなら新しいことを勉強する必要はないんだから。
勉強とか調査が苦手な人はそれをしなくてもいいんだよ。
今まで通りでも結果さえ出ればそれで全く問題ないでしょ。
もし苦手じゃないというなら、ドキュメント読んだり検索したりそれなりに汁。
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と出ますが、同じことでしょうか。
この文がどのような文脈で評価されるのか、よくわかりません。
どなたか、ご教示いただれば幸いです。
44デフォルトの名無しさん:2006/10/04(水) 21:13:12
class定義だってただの文
45デフォルトの名無しさん:2006/10/04(水) 21:46:14
>>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などの静的な言語しかなじみがないもので、ピンと来ませんでした。
実行タイミングや、スコープはどうなるのかな?などなど、
調べて勉強してみます。
ありがとうございました!
47デフォルトの名無しさん:2006/10/05(木) 14:19:58
好きな数だけ単語の入力をしてもらい(1行に1単語、最後はEnterだけの空行)、
アルファベット順に並べ変えて出力するようなプログラム

これの答えってなんになるの?
48デフォルトの名無しさん:2006/10/05(木) 14:53:33
Javaだって基本的には同じじゃねえの。
class Department {
public static final Map sections = new HashMap();
}
このクラス定数はいつ初期化されるのか。
HashMapのインスタンスができんのはいつだろうか。

まあJavaだと実際はクラスが読み込まれた時(=Rubyでいうパース時)じゃなくて最初に参照されたときに定数を初期化するんだろうけど、
でも使おうとしたときにはもう使えるようになってる点は変わらんと思うが。

Java的に言えば、Rubyでクラス宣言直下でのメソッド呼出=static{}中での初期化、だと思えばだいたい合ってると思う。
変数スコープは全然違うけど。
でも、そんなの意識しなきゃならないところかね。
Javaでだってstatic{}中であんまり変なことしないだろ。
同じようにRubyでもクラス宣言直下で色々やらねえ方がいいと思うよ。
定数の宣言、クラス変数の初期化、attr_*でのアクセサの「定義」(実態は「生成」だけど)くらいしか
Javaと同じように普通はやらねえし、やるべきじゃないと思う。
なんで調べるだけ無駄、と思った。
49デフォルトの名無しさん:2006/10/05(木) 14:57:41
>>47
ruby云々の前に、もうちょっと基本から考えたほうがいいぞ。
それに宿題スレは別だ。

「一行に一単語」って文字コードは何?
英数字、漢字ありなのか?
その場合のアルファベット順とはなにか。
昇順・降順どっちとか。

とりあえず文字コード、ソート、rubyでググる事をお勧めする。
50デフォルトの名無しさん:2006/10/05(木) 16:02:56
Foo = "a"
p Foo
p defined? Foo
Foo << "b"
p Foo

#=>"a"
#=>"constant"
#=>"ab"

Foo は定数なので2度代入できないと思うんですが、
上のは2度代入しているわけではないのですか?
いや、Foo の指しているオブジェクトが変更されたということですね?
でも何だかしっくり来ないんですが…
定数なのに値が変わってしまうというのは変じゃないんでしょうか。
51デフォルトの名無しさん:2006/10/05(木) 16:22:50
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
52デフォルトの名無しさん:2006/10/05(木) 18:05:17
>>51
freeze で検索したら関連の情報をいくつか見つけました。
「定数」という用語にこだわらないことにします。
53デフォルトの名無しさん:2006/10/05(木) 18:14:27
>>52
Rubyの「定数」は「参照先が変わらない」ってこと。
Fixnumみたいな不可変のオブジェクトは本当に変わらないが
Stringのような参照先が変わらなくても中身自体が変わるものは変わる。
freezeしたら別だが。
54デフォルトの名無しさん:2006/10/06(金) 08:00:29
Net::HTTPでサーバ上のファイルの最終更新時刻は取得できますか?
リファレンスを探したのですが見つかりませんでした。
ぐぐろうにも良い検索ワードが思い浮かびません…。

サーバ上のファイル更新時刻をしりたい場合は通常どのライブラリを使うのでしょうか?
55デフォルトの名無しさん:2006/10/06(金) 12:57:26
取れるときと取れないときがある
56デフォルトの名無しさん:2006/10/06(金) 13:20:06
HTTPResponseオブジェクトの[]メソッドで普通に取れるでしょ。取れるときは。
res["Last-Modified"] あたりを試せ。
57デフォルトの名無しさん:2006/10/06(金) 13:58:47
それで取れないときに、別の方法で取れるかって質問じゃないのか
58デフォルトの名無しさん:2006/10/06(金) 14:59:43
どう見ても >>54 はNet::HTTPを使った更新時刻取得方法を聞いてるだけだが?
「取れないこともあるけどどうすれば?」とは書いてないよね。
59デフォルトの名無しさん:2006/10/06(金) 17:12:30
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ではどのように表記するのでしょう?
60デフォルトの名無しさん:2006/10/06(金) 17:17:04
>>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
6159:2006/10/06(金) 18:40:02
>>60
出来ました!

最初、

if hash[key1] ==nil then hash[key1]=Hash.new

とか書くしかないかと思ってました
う〜ん、もうちょっとrubyのコードを見慣れないと思いつかないですね。
精進します
62デフォルトの名無しさん:2006/10/06(金) 19:26:45
要素数が固定なら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
63デフォルトの名無しさん:2006/10/06(金) 19:31:17
再帰書いてたら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
64デフォルトの名無しさん:2006/10/06(金) 19:56:12
で、ループに展開してみたが下手くそだな。
#!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
6559:2006/10/06(金) 21:14:24
例が間違っていました
a b c
a B c
のように二番目のキーだけ違うものが存在するので
A=>{b=>c,B=c}
と2つとも別のものとして代入したいのですので
>>62さんの例だと1行目が2行目に上書きされてしまうので
困っちゃいます

今回は要素数固定なので>>60で行けますが
やりたいことはまさに>>63さんの礼そのものでして。
ちょっと考えます〜
66デフォルトの名無しさん:2006/10/06(金) 23:20:56
質問させてください。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
<エラー引用ここまで>
67デフォルトの名無しさん:2006/10/06(金) 23:32:08
site_rubyというのがすごーく気になる。
68デフォルトの名無しさん:2006/10/06(金) 23:32:54
>>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
6954:2006/10/07(土) 03:08:59
>>55-58
ありがとうございます。テストしてるサーバでは取得できました。
取れない場合に他の対処法があるのならそちらも教えて頂けませんか。
70デフォルトの名無しさん:2006/10/07(土) 07:34:46
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
なんて矛盾したデータが考えられるけど
それはシラネ
71デフォルトの名無しさん:2006/10/07(土) 09:42:13
ドットリストなのがだめなんじゃねえかとふと思ったよ。
ケツまでmapにしちまったらいいんじゃねえか?
ケツの後ろはnilにしときゃいいだろう。
72デフォルトの名無しさん:2006/10/07(土) 10:22:03
`dir /s /b`.each{|f| f.chop!
 foo(f)
}

eachdir{|f|
 foo(f)
}
みたいにラップすることって出来ますか?
73デフォルトの名無しさん:2006/10/07(土) 10:57:17
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は、
念のため保存しておいた方がいい。


まあ、同じことをする人はあまりいないと思うが、
気をつけた方がいいと思う。

以上、チラシの裏終わり
75デフォルトの名無しさん:2006/10/07(土) 15:55:17
>>74
こんな馬鹿久しぶりに見た
76デフォルトの名無しさん:2006/10/07(土) 16:41:42
>73
yield するならブロック引数を &b で受け取る必要はないよ。
77デフォルトの名無しさん:2006/10/07(土) 17:08:32
>>76
ああやっぱそうなんだ。
マニュアルにはサンプルが載っているが、でも書いてないけどよしなにするってのがなんか耐えられない感じ。
むしろblock_given?でチェックするのが正しいべき?
78デフォルトの名無しさん:2006/10/07(土) 17:44:38
>77
yield は言語機能としてもともとあった機能。ただ、与えられたブロックをオ
ブジェクトとして扱いたいっていう要求があってブロック引数という機能が実
装されたという経緯がある。

つまり、この2つは「似たような機能を実現するための2つの手段」になってい
るから、両方を同時に使うのが一番ヘンだと個人的には思う。っていうか使え
るとは思ってなかった。
ブロック引数を使わずに yield を使うか、ブロック引数を使うなら call メ
ソッドを使って yield は使わないか、どっちかにするべきじゃないかな。

どちらを使うかは趣味の問題だと思うから、どちらでも良いと思う。
もともとあったのは yield だけだったので、古参の Rubyist は yield の方
を好む気がするけど。
あと、ブロック引数を取ると Proc オブジェクトを生成する。 yield は言語
機能なのでそういうことをしないぶん、じゃっかん軽いらしい。
79デフォルトの名無しさん:2006/10/07(土) 17:46:18
補足。
こういうメソッドでブロックが与えられないときには単にエラーで良いと思う
ので、いちいち block_given? などでチェックする必要はないと思う。
80デフォルトの名無しさん:2006/10/07(土) 22:15:15
Rubyの質問というより、プログラムの仕方の質問かもしれません。

現在の状況
ruby ./hogehoge.rb data.dat
引数として、data.datを読み込んで、hogehoge.rbで処理して、
output.datというファイルが出力されるようになっています。
これに関しては、問題ありません。

毎回毎回、作業ディレクトリーにスクリプトファイルをコピーして、
処理を実行しているのですが、すごくめんどくさく感じています。

最終的にやりたいことは、
「作業ディレクトリーと実行ファイルを置いておくディレクトリーを別々にする。」
というものです。
色々調べてみると、Pathの設定をどうにかすればよいと思い
試行錯誤していますが、うまくいきません。
どなたか、ご教示いただければ幸いです。
81デフォルトの名無しさん:2006/10/07(土) 22:37:00
環境は?
./ とか書いているから Linux ?  distro は? 管理者権限はあるのか、一
般ユーザの権限しか持たないのか? その hogehoge.rb というのはどの程度
汎用なツールなのか? ほかの人も使うのか、自分しか使わないのか?

そういうのはどういうツールなのかにもよるし、個人のセンスにも依存するだろう。
単なるデータ処理ツールであれば、パスを設定したりしないで、しかしいちい
ちコピーなんかしないで相対パスで指定して実行することを個人的には勧める。

また、自分用のスクリプトはあらかじめ決めておいたディレクトリ(~/binとか)
に置いておくことに決めておいて、そこにまとめて置くという手もある(パス
はあらかじめ通しておく)。


パスを設定する方法なら板違いもいいところ。
設定の方法はシェルや環境によって変わる。 OS の使い方をもっと勉強した方
がいい。
82デフォルトの名無しさん:2006/10/07(土) 22:43:57
>>81
うざ
83デフォルトの名無しさん:2006/10/07(土) 22:46:41
>>81
>相対パスで指定して実行することを個人的には勧める
この一行だけでいいよ
84デフォルトの名無しさん:2006/10/07(土) 22:56:29
>>80
hogehoge.rbの一行目に
#!/usr/bin/env ruby
と書いて、/usr/local/binか~/binにコピーして、chmod +x hogehoge.rbとすれば、
$ hogehoge.rb data.dat
というふうに起動できるようになるよ。
8580:2006/10/07(土) 23:06:07
>>81,83,84 さま
質問に答えていただいて、ありがとうございます。
環境はwindows XP Home EditionSP2です。
パスとか良く分かっていないみたいです。
少し、調べてみます。
8680:2006/10/07(土) 23:20:39
Pathを通したフォルダに、hogehoge.rbを置いて実行したら、
うまくいきました。
少し、Pathの意味が分かった気がします。
ありがとうございました。
87デフォルトの名無しさん:2006/10/07(土) 23:26:01
Windowsかよっw
88デフォルトの名無しさん:2006/10/08(日) 00:35:37
ここはエスパーの多いインターネッツですね。
89デフォルトの名無しさん:2006/10/08(日) 02:13:26
ところでWindowsでPATH設定してあるところにスクリプトを置くだけでうまくいくのか。
むしろそんな単純にはうまくいくわけがないはずなのだが。
PATHEXTを設定してくれるインストーラとかあるんだっけ?
90デフォルトの名無しさん:2006/10/08(日) 02:14:21
文字列の中の全角の数字だけを半角の数字に変換するにはどうしたらいいですか
a="123"

a="123"
に変換したいんです!!
91デフォルトの名無しさん:2006/10/08(日) 02:48:08
a.to_i.to_s
92デフォルトの名無しさん:2006/10/08(日) 02:53:33
gsub使って自己解決しました失礼しました。
93デフォルトの名無しさん:2006/10/08(日) 05:09:28
初心者スレのエスパー率は異常なほど高いなw
94デフォルトの名無しさん:2006/10/08(日) 05:58:58
>>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が無難そうです。
96デフォルトの名無しさん:2006/10/08(日) 11:15:59
25,26です。
JavaScriptでの
http://ha1.seikyou.ne.jp/home/akairingosaita/hangul/decodence.htm

Perlでの
http://www.akatsukinishisu.net/itazuragaki/perl/numeric_charref_to_string.html
のようなことをRubyでできないか?
と考えておりました。
JavaScriptではString.fromCharCode関数で256を超える値を与えてUnicode文字が
表示できます。
Unicodeのコードポイントを与えてその対応文字を表示させる関数がほしいです。
http://moriq.tdiary.net/20040903.html掲載のスクリプトをいぢってみましたが
日本語以外の2バイトコードがうまくいきませんでした。
97デフォルトの名無しさん:2006/10/08(日) 12:09:06
どこに表示させるの?
98デフォルトの名無しさん:2006/10/08(日) 12:42:53
Rubyレシピブックの163を試したところ、renameのところで
Permission denied のエラーが出てしまいます。
どうもtempファイルのrenameが出来ないみたいです。
どうすれば回避できるでしょうか?

実行環境:Win XP SP2, ruby 1.8.4 (2006-04-14) [i386-mswin32]
レシピブック正誤表にある2箇所の修正は入れています。
99デフォルトの名無しさん:2006/10/08(日) 13:09:07
名前変更しようとしているファイルが使用中なのでは。
100デフォルトの名無しさん:2006/10/08(日) 14:40:11
>97

表示させる場所は
 cmd.exeでの出力結果を考えています。
ruby ToUnicode.rb 数値文字参照を含むファイル
を実行するとcmd.exeでunicode文字が表示される
というのを期待します。
 リダイレクトしてunicodeを扱えるエディタで開けば
結果をファイルとしても扱えると思います。
101デフォルトの名無しさん:2006/10/08(日) 14:42:48
>>100
cmd.exeってSJISしか表示できなかったような気がするんだけど?
10298:2006/10/08(日) 14:43:53
>>99
アドバイスありがとうございます。

require "fileutils"

を頭に入れて、renameの行を下記の2行に変えたら動きました。

temp.flush
FileUtils.copy(temp.path, path)
103デフォルトの名無しさん:2006/10/08(日) 15:06:36
>>78
マニュアル読み直したよ。
lambdaを渡そうとしてno block givenだったのは、可換じゃないからなのね。
合点がいった。
104デフォルトの名無しさん:2006/10/08(日) 15:27:23
>>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
となります。
これはどういったことが考えられますでしょうか?
106デフォルトの名無しさん:2006/10/08(日) 15:29:19
誤:さらに言えばあのコードでは数値文字参照以外はノータッチなのでそこのコードが不定だと結果も不定だよ。
正:さらに言えばあの「ソースコード」では数値文字参照以外はノータッチなのでそこの「文字コード」が不定だと結果も不定だよ。
107105:2006/10/08(日) 15:36:57
環境を書いていませんでした。
OSは、WindowsXP SP2 Home。
OneClickInstallerでインスコしました。

ためしに、bash上で、export LANG="ja_JP.SJIS"してみましたが、英語のままでした。
108デフォルトの名無しさん:2006/10/08(日) 15:41:28
>101
中国語の文字のファイル名をつけたら、一部文字化けしました。
http://www.securehtml.jp/utf-8/sjis/chinese_sjis.html
にある
[ザーサイ].txt
[ニイハオ].txt
[シェシェ].txt
を作ってdirで表示したところ([]内は実際はchinese_sjis.htmlからコピー&ペーストした中国文字)、
[シェシェ]だけだめでした。

エクスプローラ上では表示されましたので、
「数値文字列参照を含むファイル名をunicode表現でrenameする」
ということでどうでしょうか?


109デフォルトの名無しさん:2006/10/08(日) 17:40:54
>>108
ファイル名の話じゃなかったでしょ。
結局何がしたいんだ。
110デフォルトの名無しさん:2006/10/08(日) 21:00:52
>109

ダウンロードしたファイルが漢字や中国語を含んでいる場合
数値参照文字列を含んだファイル名になるので
それをUnicode文字に変換したいです。
これまで
http://ha1.seikyou.ne.jp/home/akairingosaita/hangul/decodence.htm
を使ってきました。
変換前ファイル名をコピーして変換し、それにrenameするのが面倒なので
Rubyスクリプトで一気にできないかと思って聞きました。
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にてインスコできず。。。
113デフォルトの名無しさん:2006/10/09(月) 00:46:18
>>111
> String#tr! を使う場合同じ文字数しか置き換え出来ないんでしょうか?
そりゃ文字単位の置換だからな。

> s.tr!("D", "XX")
むしろ警告かエラーかにすべきじゃないかな。
114デフォルトの名無しさん:2006/10/09(月) 16:05:19
クラスにデータを保存する…というか、
なんだかそういう感じの概念があるというような話を聞いたんですが、
どういうのをどう勉強すると使えるようになるもんでしょうか?
クラス変数とか使うのとは違うのかなとか
115デフォルトの名無しさん:2006/10/09(月) 16:11:47
コンテナの話かなあ
116デフォルトの名無しさん:2006/10/09(月) 19:19:32
Mac使いの人助けてください
UTF-8で書いたスクリプトをMacに持っていって
その時点では普通に動いたんだけど、miで編集したら動かなくなりました
調べてみると、例のチルダの変換のせいでおかしくなってるみたいです
これはどのように対処すればいいんでしょうか?
117デフォルトの名無しさん:2006/10/09(月) 19:25:41
>>110
それでも答えはttp://moriq.tdiary.net/20040903.htmlでしょ
問題を理解してれば解決できるよ。
逆に言えば問題を理解しない限りは解けないし、理解しないと意味がない問題だと思うんだけど?

あと、どうでもいいけど、いわゆる普通の場合は数値文字参照を含んだファイル名は作成されないよね。
118デフォルトの名無しさん:2006/10/09(月) 20:54:56
>>116
carbon emacsで開きなおしてみるとか。
ttp://homepage.mac.com/zenitani/emacs-j.html
11966: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] な環境はそのままです。
ご報告まで。
120デフォルトの名無しさん:2006/10/09(月) 22:38:55
1・文字列Aと文字列Bと文字列Cがこの順で含まれている
2・AとB、BとCの間に文字列は存在してもいいが、A・B・Cのいずれも含んではいけない

というような正規表現はどうやったらいい?
121デフォルトの名無しさん:2006/10/09(月) 22:57:52
/A[^AC]*B[^AB]*C/
122デフォルトの名無しさん:2006/10/09(月) 23:02:06
>>121
すいません
A、B、Cは文字じゃなくて文字列です。そう定義しただけです
123デフォルトの名無しさん:2006/10/09(月) 23:09:41
>>122
だったら最初から具体例で書け。
124デフォルトの名無しさん:2006/10/09(月) 23:44:41
>>123
文字だとしても>>121は間違い
/A[^AC]*?B[^AB]*?C/
125デフォルトの名無しさん:2006/10/09(月) 23:50:04
>>120
AABCCもダメなのか?
126デフォルトの名無しさん:2006/10/10(火) 00:02:03
>>66
とりあえずsite_ruby/optparse.rbは消せ。古すぎだ。
strscanも古いの残ってないか?
127デフォルトの名無しさん:2006/10/10(火) 00:22:09
>>120
とりあえずこんなもんか。

A, B, C = "ab", "ba", "ca"
re = /#{A}((?!#{A}|#{B}|#{C}).)*#{B}((?!#{A}|#{B}|#{C}).)*#{C}/
128デフォルトの名無しさん:2006/10/10(火) 00:31:25
>>127
ありがとさんでした
否定先読みの使い用途がようやくわかりました
129デフォルトの名無しさん:2006/10/10(火) 05:07:39
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 も書けるようにしてほしいんですけど、無理なお願いでしょうか。
130デフォルトの名無しさん:2006/10/10(火) 06:01:03
急いでお布施をするんだ
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 使うなぁ
133デフォルトの名無しさん:2006/10/10(火) 09:48:30
>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 がどう定義されているかによると思うんだが。
134デフォルトの名無しさん:2006/10/10(火) 11:42:22
1.4のマニュアルには既にforはeachですと書いてあるね。
例が配列しかないからArrayにしか適用できないと勘違いする人も多いと思うけど。
135デフォルトの名無しさん:2006/10/10(火) 12:49:41
>>114
適当にオブジェクト指向の本読め
136デフォルトの名無しさん:2006/10/10(火) 12:57:44
またそういう根本学習部分に対して丸投げするから

class Main
#(とりあえず全部書く)
end
Main.new

みたいな練習にもならんスクリプトが蔓延するんだよ
137デフォルトの名無しさん:2006/10/10(火) 14:58:00
>>131 DHH
138デフォルトの名無しさん:2006/10/10(火) 15:24:11
>>131
最近の1.9の警告に負けて一部eachからforにかえてしまったオレは負け組。

>>136
最後がMain.runとかだったら許せてしまうオレは負け組。
139デフォルトの名無しさん:2006/10/10(火) 17:54:06
適当に書いてもオブジェクト指向の恩恵を得られるのがRubyなんじゃねえの(w

まあ、確かに自己流ではどうにもならんのは確かではあるが…
140デフォルトの名無しさん:2006/10/10(火) 19:39:19
俺は>>136みたいのはmainか何かの特異メソッドにしちゃうかも。
141デフォルトの名無しさん:2006/10/10(火) 23:01:29
>>131
> for var in list doなんて、初めて知った。
> これ使ってる人いる?
> eachしか使わんからなあ

普通 for のほうを使うだろ?eachは遅い。
142デフォルトの名無しさん:2006/10/10(火) 23:10:30
お前の普通なぞどうでもいい
143デフォルトの名無しさん:2006/10/10(火) 23:20:25
どう書こうかなーって思いながら書くと、each 使っちゃうね。
何回も実行される部分だと意識して for に書き直したりするけど。
144デフォルトの名無しさん:2006/10/10(火) 23:29:10
うちはたまにwhilteも使う
145デフォルトの名無しさん:2006/10/10(火) 23:33:54
普通Pythonのほうを使うだろ?Rubyは遅い。
146デフォルトの名無しさん:2006/10/10(火) 23:34:17
Rubyでeachばっかり使ってると偶に他の言語でforが出てくると戸惑うよ。
147デフォルトの名無しさん:2006/10/10(火) 23:37:51
お前だけ
148デフォルトの名無しさん:2006/10/10(火) 23:42:13
激しくどうでもいい
149デフォルトの名無しさん:2006/10/11(水) 02:28:54
Rubyでeachばっかり使ってたら他の言語を使う時にまずforeachの文法を確認するようになったw
150sage:2006/10/11(水) 03:07:49
「検索サイトの入力フォームに文字を入力して送信し
その結果を取得する」
これを行なうにはどんなプログラムを書けばいいのでしょうか?
151デフォルトの名無しさん:2006/10/11(水) 03:38:45
いちいちフォームを読むことにこだわらなければこんな感じ

$ ruby -e 'require "net/http"; Net::HTTP.get_print("www.google.com", "/search?q=2ch+Ruby")'
152150:2006/10/11(水) 06:09:36
>>151
ありがとうございます。
googleの場合はこのやり方でできたのですが、
他のサイト(yahooやgooなど)のフォームに入力する際は
/search?q の部分はどう変えたらいいでしょうか?
153デフォルトの名無しさん:2006/10/11(水) 06:41:53
そんなのブラウザで検索してURLがどういう表示になってるか見れば
一発でわかるじゃん。
154デフォルトの名無しさん:2006/10/11(水) 09:54:23
>>149
俺なんか、Rubyでeachばかり使ってたら、他の言語にforeachがないとクソだと思うようになったw
155デフォルトの名無しさん:2006/10/11(水) 13:28:47

新スレを自動的に見つけて
2getするプログラムはどう書けばよいのでしょうか?

156デフォルトの名無しさん:2006/10/11(水) 13:42:13
157デフォルトの名無しさん:2006/10/11(水) 14:08:45
#!/usr/bin/ruby -Ke

puts '新スレを見つけたら何かキーを押してください...'
while line=$stdin.gets do
puts '2ゲットおおおおぉぉ'
puts
puts '新スレを見つけたら何かキーを押してください...'
end
158デフォルトの名無しさん:2006/10/11(水) 15:26:35
>>157
作るべきではないが
自動的に
という質問のようだよ。
159デフォルトの名無しさん:2006/10/11(水) 16:06:59
こういうバカには何も教えないほうが世のためという気はする
160デフォルトの名無しさん:2006/10/11(水) 17:22:44
2getしてどうするんだろう。
遠まわしに2chカキコの為の方法を聞いてるんだろうか。
161デフォルトの名無しさん:2006/10/11(水) 17:34:51
>>156
Lv9が倒せない。これ見てから間に合うか!?
162デフォルトの名無しさん:2006/10/11(水) 18:05:12
ネットアクセス関係は危険物取り扱いだからなあ
ほいほい教えないのが暗黙のマナーな気もする

勉強した人ならピンポイントで聞いてくるだろうし
163デフォルトの名無しさん:2006/10/11(水) 19:06:19
cookie を送信するにはどうすればよいですか
具体的には ハナモゲラ という文字列を送信したいのですが
164デフォルトの名無しさん:2006/10/11(水) 19:31:04
Esper is nice, so we are nice.
165デフォルトの名無しさん:2006/10/11(水) 19:39:09
>>157みたいなインターフェースのって、絶対綺麗に書く方法があるはずだと思いつつ

puts '入力してください'
loop do
# 処理
puts '入力してください'
end

みたく書くんだよな
なんかいい方法ない?
ループの判定前前に必ず実行できるとか
166デフォルトの名無しさん:2006/10/11(水) 20:09:02
>>165 さん、えーと

loop do
puts プロンプト
line = gets
raise if 終了条件(line) # ループ外で例外捕捉しないのならば exit の方が素直かな
処理(line)
end

というようなかんじではあまり綺麗じゃないですかね。
167デフォルトの名無しさん:2006/10/11(水) 20:28:33
>>163
ピンポイント過ぎwww
うーんとね、Cookieにはなもげらって書けばいいと思うよ。
168デフォルトの名無しさん:2006/10/11(水) 20:36:31
BCC55でRuby1.8.5をmakeしようとしたのですが、以下のエラーが発生し先に進む事ができません
** error 1 ** deleting -prologue-

如何すれば解決するでしょうか?
169デフォルトの名無しさん:2006/10/11(水) 20:50:55
>>165
begin
print 'ぼたんをおしてください'
raise if line=$stdin.gets
rescue
puts "2ゲットオオオォォォ!\n\n"
retry
end

異常でもないのに例外発生なのがいやな感じ
170デフォルトの名無しさん:2006/10/11(水) 20:55:37
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 の仕様変更が影響しているように思えるのですが、これどういう理由で挙動が変わったのでしょうか?


171デフォルトの名無しさん:2006/10/11(水) 21:29:05
>>165
while print('input: ') or ((k=gets)) do
172171:2006/10/11(水) 21:32:23
結局、何度も使う場合は

def input(prompt)
  print prompt
  gets
end

しちゃうんだけどね
173デフォルトの名無しさん:2006/10/11(水) 21:58:13
Readline 使えばいいのに
174デフォルトの名無しさん:2006/10/11(水) 22:07:57
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
それだ。
175デフォルトの名無しさん:2006/10/12(木) 02:04:49
>>168

あれ、Borlandのコンパイラってまだサポートされてたっけか

サポートされなくなったのは1.9だけ?
176デフォルトの名無しさん:2006/10/12(木) 02:13:52
>>175
え、マジで?
どっかにそんな情報ある?
177デフォルトの名無しさん:2006/10/12(木) 18:33:35
>>170
Cygwinだけど再現した。
nkf.exeでも再現するからnkf207のバグなんだろうなあ、と思ってiconvしてみたら何か変だな。
irb(main):011:0> Iconv.iconv('iso-2022-jp', 'utf-8', 'ほげほげ')
=> ["\e$B$[$2$[$2", "\e(B"]

NKFのソース見ても正直よくわからんが。
178177: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
179175:2006/10/13(金) 00:02:14
>>176

すまんちょっと勘違いがはいっていたようだ。
でも、ruby-devでちょっと探してみると

 ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29258
まだbccもサポートするのであれば直しておいたほうがいいのではないかと思い
ます。

# 正直、bccはもういらないという気もしますが。

 ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29259
| # 正直、bccはもういらないという気もしますが。

今は事実上誰も見てない状態のようですね。
今この瞬間に積極的にサポートを切るのはどうかと思いますが、こ
の状態が続くのであれば必然的にフェードアウトしていくことにな
るでしょう。


というやり取りがあるので、今後はどうなるかわからない。
とりあえず1.8.5のpreviewのときにちょっとした問題が出て
それに対処したときの話ね。

1.9はがんがん手が入っているから、今はもうビルドできなくなってるかも。

180デフォルトの名無しさん:2006/10/13(金) 00:13:34
メンテナが不在なら、サポートできるわけないんだから、当然のことだろうね
181デフォルトの名無しさん:2006/10/13(金) 00:29:18
BCCでコンパイルできない場合、WindowsXPでは如何すればよいのでしょうか?
182デフォルトの名無しさん:2006/10/13(金) 00:33:09
使うの止めれば?
183デフォルトの名無しさん:2006/10/13(金) 00:50:34
Borland捨ててMicrosoftに乗り換える
184デフォルトの名無しさん:2006/10/13(金) 00:54:04
gccがあるじゃないか
185デフォルトの名無しさん:2006/10/13(金) 00:55:01
コンパイルを通るようにしてパッチを投げる
ついでにメンテナに立候補する
186170:2006/10/13(金) 02:14:39
>>177,178 さん、相手してくださってどうもありがとうございます。

http://sourceforge.jp/projects/nkf/ で教えてもらったところによると nkf 2.0.8 / ruby 1.8.6 で修正される(well known な)バグだそうです、うーむ知らなかった。
ちなみに↓のどこかが bug fix らしいのですが、私の頭ではどういう修正なのかさっぱりわかりません orz
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/nkf/nkf-2/nkf-utf8/nkf.c?r1=1.109&r2=1.110

自分で対応するには ruby-1.8.5/ext/nkf/nkf-utf8 以下を cvs head で上書きして ruby を再構築すればよいのかな?
187デフォルトの名無しさん:2006/10/13(金) 02:42:12
>>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のスクリプトからスクリプト自体が置かれているディレクトリを取得するにはどうしたらいいでしょうか?
189デフォルトの名無しさん:2006/10/13(金) 04:38:27
.*

$0
190デフォルトの名無しさん:2006/10/13(金) 04:46:12
こんなに憎いのにWindowsでRubyが実行できたりビルドできたりするはずないだろ!?
191デフォルトの名無しさん:2006/10/13(金) 04:52:53
/\{[^\[\]]*\}/

__FILE__

192デフォルトの名無しさん:2006/10/13(金) 04:53:38
/\{[^\{\}]*\}/
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-
と出ます
194デフォルトの名無しさん:2006/10/13(金) 08:00:24
>>188
案外

/\{.+?\}/

で用は済むのかも
195デフォルトの名無しさん:2006/10/13(金) 09:17:14
>>193
>GCCでもBCCと同じ方式でコンパイルできるのですか?

cygwinなら

configure
make

だけでできる。そういう意味では同じ。
mingwだとconfigureに引数が必要だが、大したことはない。
196188:2006/10/13(金) 09:20:11
>>189
こんな簡単なものでイケたんですね。
mで改行もOKみたいですね。

>>191
__FILE__ もあるんですね。

>>194
それでもイケるんですか。
なるほど。

今の所、違いがイマイチ分からないのですが
189さんが教えてくれた方法で解決しましたのでそれを使わせて頂きます。

みなさん、どうもありがとうございました!
197デフォルトの名無しさん:2006/10/13(金) 09:22:27
>>193
そこで dir した結果をくれ
198デフォルトの名無しさん:2006/10/13(金) 09:24:06
>>195
> mingwだとconfigureに引数が必要だが、大したことはない。

CC='gcc -mno-cygwin' だけ。

bccはコンパイラもランタイムもバグだらけだし、makeも(nmakeよりさらに)
奇天烈だしで、切実な理由がないかぎりおすすめしない。

# 新しいTurbo C++はDLするものが多いんでまだ試してない。
199デフォルトの名無しさん:2006/10/13(金) 09:26:27
>>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
201デフォルトの名無しさん:2006/10/13(金) 11:04:07
書いてみたが、よく見たらread.cgiのHTMLを解析してるんだな。

2chのdatファイルの仕様を調べるといい。
それと、ネット上から持ってきたファイルの保存の仕方と、
2chからdatの差分を取得する仕方。
202デフォルトの名無しさん:2006/10/13(金) 11:12:23
それはopen-uri諦めろってことだな(w
203デフォルトの名無しさん:2006/10/13(金) 15:08:54
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でもコンパイル出来ないようなら使ってみようと思います
205デフォルトの名無しさん:2006/10/13(金) 17:44:24
実際のとこ今BCCを使う理由はないな。
Borland大好きならともかく。

あとCygwinに関してもうちょっとググれ。
206デフォルトの名無しさん:2006/10/13(金) 20:22:03
>204
Cygwin慣れてないならmingwインスコするがよろし。
Cygwinを使ってやりたい事が複数あるならCygwinお勧めするが。
207デフォルトの名無しさん:2006/10/14(土) 00:57:24
>>204
わかった。
すまんがソースと別のディレクトリでコンパイルしてくれ。

md build
cd build
..\bcc32\configure

みたいに。
208デフォルトの名無しさん:2006/10/14(土) 01:51:21
>207
setbccぐらい教えてやれよ…
209デフォルトの名無しさん:2006/10/14(土) 06:16:27
>>205
二時間かけてフルセットのCygwinをインストールしてみたりしましたが
何をやってもconfigureもmakeも出来ませんでした・・・
コマンドが存在しないと帰ってくるだけです

>>206
MinGWを入れてみましたが、結局殆ど変わらないどころか
意味不明なレスポンスが帰ってきます

\bcc32>configure
'make' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

makeなんて一度も打ってないのに・・・

>>207
全く何も変わりませんが・・・

210デフォルトの名無しさん:2006/10/14(土) 07:16:15
がんばれ、えすぱー
211デフォルトの名無しさん:2006/10/14(土) 08:14:33
あいつはrubyのバイナリをダウンロードして使えないわけでもあるのだろうか
212デフォルトの名無しさん:2006/10/14(土) 09:18:03
他人が作ったバイナリなんてどんな罠が仕掛けられているか分からんだろ
ソースを落としてきて全てを検討して納得してから自分でビルド
もちろんコンパイラをはじめ全てのビルドツールもソースからチェック
213デフォルトの名無しさん:2006/10/14(土) 10:07:21
それじゃ、Windowsのソースも全部チェックして自前でコンパイルしないとな
214デフォルトの名無しさん:2006/10/14(土) 11:18:05
>>213
それはみんなやってる
215デフォルトの名無しさん:2006/10/14(土) 11:35:23
>>214
windowsのソース下さい。
216デフォルトの名無しさん:2006/10/14(土) 11:40:05
>>215
ごめん。windows使ってないわ
217デフォルトの名無しさん:2006/10/14(土) 11:50:33
>>215
つ Winny
218デフォルトの名無しさん:2006/10/14(土) 12:40:00
ワロス。
フルセットをインストールしてどうしたんだよ。
どういう操作をしたのか漏れなく書いてよ。
実行したコマンドはコピペしなさい。
219デフォルトの名無しさん:2006/10/14(土) 12:46:12
>>217
Winnyのソースも下さい。
220デフォルトの名無しさん:2006/10/14(土) 13:12:49
>>219
52a7c8047a12ec2594b94295f23d158b
221デフォルトの名無しさん:2006/10/14(土) 14:40:42
>>209
> \bcc32>configure

bcc32ディレクトリの下で実行してるのか?
mingwでやるならその上のバッチじゃないconfigureがあるディレクトリでやらないと。

> 'make' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>
> makeなんて一度も打ってないのに・・・

bcc32/configure.batが内部で使ってる。
そこでエラーになるということは必要なものが全然インストールされてないということだ。

> >>207
> 全く何も変わりませんが・・・
どういう風にやった?
222デフォルトの名無しさん:2006/10/14(土) 14:46:08
えすぱーじゃないが努力してみよう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

の手順に従ってやってるか?
223222: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では出ますが・・・

勿論手順に従ってやってます
225デフォルトの名無しさん:2006/10/14(土) 16:44:27
>>224
> BCCでは以下のような感じです
> \bcc32>md build
> \bcc32>cd build
> \bcc32\build>configure

>>207
> md build
> cd build
> ..\bcc32\configure
ちゃんと見比べてみろ。
最後のはパス付きで実行する。
226デフォルトの名無しさん:2006/10/14(土) 17:19:56
>>224

gcc が起動できてls や bashが起動できないという状況がよくわからんけど、
bashが使えなきゃ configure を実行することができないので
それじゃビルドできんぞ(cygwin版でもmingw版でも)。

c:\cygwin\bin とか c:\cygwin\usr\bin とかにちゃんとPATH
通ってるか?

bcc のほうのエラーは見当もつかんなあ。
227デフォルトの名無しさん:2006/10/14(土) 17:32:11
PATH通す必要なんか無いよ
228デフォルトの名無しさん:2006/10/14(土) 17:33:05
正規表現について質問です。
str = "<a><b>2</b>ちゃんねる</a>"
とあって、「2ちゃんねる」
だけを抜き出したい時は、どう書けばいいでしょうか。
また、「<b>2</b>ちゃんねる」を抜き出す方法も知りたいです。
229デフォルトの名無しさん:2006/10/14(土) 17:42:58
cygwinでPATHを通せとか言ってる奴、一体どういう使い方してんだよ?
230228:2006/10/14(土) 17:48:49
>>228
です。ごめんなさい自己解決しました。
231デフォルトの名無しさん:2006/10/14(土) 18:48:16
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使ってるから要らないと思ってたんですが・・・
233デフォルトの名無しさん:2006/10/14(土) 20:05:08
いつまでやってんだよ・・・
cygwinなら
./configure
だ、ボケ。

それから、cygcheck -cとやって、makeがちゃんとインストールされてるかどうかチェックしろ、アホ
234デフォルトの名無しさん:2006/10/14(土) 20:11:54
>>232
cygwin.bat が bash 起動しないとかどんな設定してあるんだよw
235デフォルトの名無しさん:2006/10/14(土) 23:05:26
>>229

bash は通常のシェルとして使わずに cmd.exe からコマンド使ってるだけだが?
cygwin インストールしてもシステムのPATHは書き換えないだろ?

例の彼がデスクトップのショートカットとかから起動しているのか
不明だったから念のため確認とっただけだが。

236231:2006/10/14(土) 23:10:14
出来ました(;_;
結構悩みました
237デフォルトの名無しさん:2006/10/14(土) 23:14:06
>>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++でやらなければならないので、何か解決法がわかる方いましたら宜しくお願いします。
239238: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して、標準入出力のフィルタリングのようなことをしたいので、どうか宜しくお願いします。
240デフォルトの名無しさん:2006/10/15(日) 00:26:24
ランタイムの問題じゃないの?
まさかBCC版のRubyだとか。
241238:2006/10/15(日) 00:30:55
>>240
レスどうもです。
ランタイムの問題、と言いますと、Rubyの側の問題な可能性があるということでしょうか?
いちおうRubyはCygwinのものです。
ActiveScriptRubyも今からインストールして試してみます。
242238:2006/10/15(日) 00:57:20
ASRでも同じ問題がおこりました・・・orz
それで、やっぱりPHPが相手な場合だけ上手くいきます。
何が原因なんでしょう・・・?
243デフォルトの名無しさん:2006/10/15(日) 01:06:26
いっぺんここの
http://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/
MS-WIN32版のRubyでやってみれ。

Cygwin版は移植の問題を回避できるがOSとの整合性の問題がある。
周辺のツール類もWIN32版があるなら乗り換えた方がよさげ。
244デフォルトの名無しさん:2006/10/15(日) 01:07:37
>>242
$?
245238:2006/10/15(日) 01:18:51
>>243
了解しました。
試してみます!

>>244
ハングしたみたいに止まってしまうで、Ctrl+CでInterruptせざるを得ないんですけど、どのタイミングで$?を拾えばよいでしょうか?

ちなみに、もしLinux環境などでは問題なく動くとか、Windows環境で問題が再現した/しなかった、などの情報もありましたら宜しくお願いします。
246デフォルトの名無しさん:2006/10/15(日) 01:19:32
>>239
C++で試してみたら、確かにブロックするな。
ただ、C++側でflushしたらちゃんと動いた。
pipeの挙動ってこんなもんだったっけ???
247238:2006/10/15(日) 01:24:38
>>246
flushしたらできましたか!?
てっきり入力のせいだと思っていたんですけど、出力するときflushできてないのが問題だったのでしょうか?
ちょっと>>243の1.8.5をインストール中なんで、それからflushも明示的に書いて試してみます。
情報どうもです!
248246:2006/10/15(日) 01:27:31
さらにMontavista Linux(玄箱)で試してみたけど、やっぱりブロックして、
flushするとちゃんと動いた。C++側では改行コードも出力してるんだけど・・・。

高水準のpipeは使ったことほとんど(全然?)無いから、この挙動が正しいものかどうかわからん・・・
249238:2006/10/15(日) 01:35:57
今ちょっと試してみたら、flushしたらruby版もc++版も全部完璧に動きました!!
バッファにたまりっぱなしになってたから、popen側でいつまでも受信できなかったのか・・・orz
そういえばphpは暗黙flushがあったような気がしてきました。
解決です。どうもありがとうございました!!m(_ _)m
250デフォルトの名無しさん:2006/10/15(日) 02:00:14
それでいいんだろうか・・・
251デフォルトの名無しさん:2006/10/15(日) 02:40:19
>>246
> pipeの挙動ってこんなもんだったっけ???
普通はそうだ。
252デフォルトの名無しさん:2006/10/15(日) 02:45:24
>>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
ブロックがちょーうぜー
こんなキモチワルイ構文入れてぎゃーぎゃーいうくらいなら
高階関数ひとついれればいいだけじゃん

あーいらいらする
256デフォルトの名無しさん:2006/10/15(日) 04:25:14
injectってただのfoldじゃねーか!とか?
257デフォルトの名無しさん:2006/10/15(日) 04:26:35
そうだよ!
45ぺーじでinjectっていう最高にキモチワルイメソッドがでてきたけど
もう本気でむかつくよ。なにこれ
258デフォルトの名無しさん:2006/10/15(日) 04:35:54
46ページで「いきなり」でてくる *arg ってのがいみわからん、
意味不明な言葉でぐだぐだせつめいされてもイラツクだけ!!!!!!!!

あああああああああああああああああああああうぜーーーーーーーーーーーーーーーーーーーーーー
259デフォルトの名無しさん:2006/10/15(日) 05:02:58
この本(プログラミングRuby第2版)でつかわれている「透過的」ってどういういみ?
260デフォルトの名無しさん:2006/10/15(日) 05:36:42
上着着てるのにブラのレースづかいまで見えること
261デフォルトの名無しさん:2006/10/15(日) 07:52:08
どういうコンテクストでつかうと↑みたいなことになるのか上品なおれにはわからねー

ところで、rubyのクラスで
クラス内でしか使わない、外には見せないインスタンス変数ってどうやって定義するの?

262デフォルトの名無しさん:2006/10/15(日) 08:09:15
>>261
わかりにくい名前を付ける
263デフォルトの名無しさん:2006/10/15(日) 08:13:24
>>254-257
感想は最後まで読んでからまとめて書いてくれ。
とりあえずお前の書き込みが頭悪すぎて不快だ。

264デフォルトの名無しさん:2006/10/15(日) 08:21:03
普通の高階関数の仕組みあればブロックいらないんじゃていうのは結構同意なんだけど
265デフォルトの名無しさん:2006/10/15(日) 08:31:23
高階関数っていうか、ラムダがあればいいっていう話だと思うんだけど、そりゃまあラムダを普通に引数に渡すだけでも、rubyのブロックより柔軟なことができる罠。
でもrubyでは利便性を選んだんでしょ。
大体他の言語でも、引数に2つ以上のラムダを渡すことなんか滅多にないし、常にブロックはメソッドの呼び出しより後ろにつけるって決まってるほうが、自分で書くときも他人のコード読むときも何かと迷うことが少なくなるとは思うよ。
266デフォルトの名無しさん:2006/10/15(日) 09:42:07
途中で愚痴を書かざるを得ないくらい不愉快な本なんだから仕方ないだろwwwwww
267デフォルトの名無しさん:2006/10/15(日) 11:44:23
ブロックで不満なら LISP 使えばいいじゃん。
268デフォルトの名無しさん:2006/10/15(日) 15:41:32
JavaScriptで(ry
269デフォルトの名無しさん:2006/10/15(日) 15:47:20
>> 232
> Fatal: ファイル C0X32.OBJ が開けません
その答えはすでに>>208が書いている。
270デフォルトの名無しさん:2006/10/15(日) 17:48:07
MinGW と MSYS と MSYS-DTK入れると
スタートメニューにMinGW - MSYS - msysが登録されるので
それを実行すればターミナルが開いてbashが実行されます
もちろん、GCCやMSYSの実行ファイルへはパスは通った状態です
そこで、Rubyのソースを展開してあるディレクトリへCDして
./configure
bashとかだと、通常はカレントディレクトリにパスを通さないので明示的に
カレントディレクトリを指定しないと実行してくれません
configureが終了するとMakefileが出来ているので
make
すると、コンパイルできるはずですけどねぇ
271デフォルトの名無しさん:2006/10/15(日) 18:11:08
>>266
とりあえずスレ違いだから、どうしてもやりたいならスレ立ててやってくれ
あとスレ立てても別に告知しなくていいから
272デフォルトの名無しさん:2006/10/15(日) 18:24:35
板内を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の本を読んでいてイラついている人もどうぞ。
276デフォルトの名無しさん:2006/10/15(日) 22:09:04
Rubyを習うには、まず先に複数の他言語習得が必須ていうのは事実だよね?
277デフォルトの名無しさん:2006/10/15(日) 22:12:58
つか、ruby使ってる人対象でしょ?
278デフォルトの名無しさん:2006/10/15(日) 23:36:06
プログラミングPerlみたいな本だよな
279デフォルトの名無しさん:2006/10/16(月) 05:56:22
280デフォルトの名無しさん:2006/10/16(月) 06:55:55
>>279は2ch初心者
281デフォルトの名無しさん:2006/10/16(月) 09:00:39
真に受ける奴がいるとはな。
282デフォルトの名無しさん:2006/10/16(月) 09:24:02
まあともかく隔離されたのは喜ばしいことであり。
つーか雑談したいやつもこっち行けよ。
ttp://pc8.2ch.net/test/read.cgi/tech/1159315598/
ここは主にエスパーが初心者をサポートするスレ。
283デフォルトの名無しさん:2006/10/16(月) 12:50:40
>>279
これがあったのに

Rubyは難しすぎ
http://pc8.2ch.net/test/read.cgi/tech/1156496224/

rubyで検索してからスレ立てなさいよね
284デフォルトの名無しさん:2006/10/16(月) 13:13:27
排除ばかりしてるからMLみたいに廃れる
285デフォルトの名無しさん:2006/10/16(月) 13:26:33
3年前、Rubyって検索すると、10スレぐらい出てきた記憶がある。
286デフォルトの名無しさん:2006/10/16(月) 13:31:19
Ruby vs Delphi とかあほなスレがいっぱいあったからね。
287デフォルトの名無しさん:2006/10/16(月) 13:40:43
タイトルにRubyが含まれるスレがたくさんあればいいというもんでもなく
288デフォルトの名無しさん:2006/10/16(月) 13:41:23
>>284
「排除」する前のMLがどんな状態だったか都合よく忘れてるだろお前
289デフォルトの名無しさん:2006/10/16(月) 14:52:55
今もRubyで検索すると10個くらいスレがあるぞ
290デフォルトの名無しさん:2006/10/16(月) 15:59:21
るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!る
ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ
びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび
ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ
最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最
強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強
!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!
!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!
るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!る
ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ
びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび
ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ
最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最
強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強
!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!
!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!
291デフォルトの名無しさん:2006/10/17(火) 00:56:42
292デフォルトの名無しさん:2006/10/17(火) 00:57:10
一番最初のインストールの確認でlocalhostにアクセスするのがうまくいかねぇ
文法勉強する前に挫折するとは思わなかったぜ
293デフォルトの名無しさん:2006/10/17(火) 00:59:02
「hoge.rb」ファイルに
$ep = "エピソード"

と入力して保存し
別のファイルで

require 'hoge'
file = open("text1.txt","w")
file.write($ep)
file.close

を実行後、text1.txtを開くと
「エピソード」が「エピメ[ド」
になってしまうのはなぜなのでしょうか?
294デフォルトの名無しさん:2006/10/17(火) 01:08:33
>>293
ruby -Ksで実行。
295293:2006/10/17(火) 02:27:43
>>294
ありがとうございます。
296デフォルトの名無しさん:2006/10/17(火) 03:15:56
矢印キーの入力を検知して処理を行いたいのですがどうやればいいのでしょうか。
297デフォルトの名無しさん:2006/10/17(火) 07:39:03
>>291
マルチうざい
298デフォルトの名無しさん:2006/10/17(火) 08:03:15
>>296
curses
299デフォルトの名無しさん:2006/10/17(火) 08:34:05
rubyでunix時刻を取得するにはどうしたらいいの?
300デフォルトの名無しさん:2006/10/17(火) 08:58:49
Time.now.to_i のことかな
301デフォルトの名無しさん:2006/10/17(火) 09:01:27
おお、ちょうど今レファレンスで見つけたところでした。そうでした!
302デフォルトの名無しさん:2006/10/17(火) 10:26:45
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です。
303デフォルトの名無しさん:2006/10/17(火) 13:43:01
>>302
後者は代入されるだろ。
304デフォルトの名無しさん:2006/10/17(火) 15:10:34
あーそういうことか。
y||=(x=i) は動くなら意図(x=i; y||=x)通りだけど、 x=(y||=i) だと代入はされても意図しない動作(y||=i; x=y)
っていうかバグだ。
ごめんなさい。

前者についてはどうでしょうか。
parse.yでvar_lhs tOP_ASGN argとなっているので、argを全部持っていって評価しているならば
確かに俺の思ったように動かないと思うのですが……その先は読めないorz
305デフォルトの名無しさん:2006/10/17(火) 15:40:30
しつもーん
文字列の置換をいちどにたくさん行いたい場合

str.gsub(/OLD1/,'NEW1').gsub(/OLD2/,'NEW2').gsub(/OLD3/,'NEW3').gsub(/OLD4/,'NEW4')

と書いてしまうのですが、明らかにかっちょわるいです
str.hoge( [[/OLD1/,NEW1],[/OLD2/,NEW2],[/OLD3/,NEW3],[/OLD4/,NEW4]] )
のように作りやすく便利な感じの代替方法って標準かなんかでないもんでしょうか
306デフォルトの名無しさん:2006/10/17(火) 15:54:24
{
/ODL1/ => "NEW1",
/ODL2/ => "NEW12,
 うほほーい
}.each_pair do |oldstr,newstr|
str.gsub(oldstr,newstr)
end
307デフォルトの名無しさん:2006/10/17(火) 15:55:44
ああごめん
ハッシュより配列のがいいね
書き換える順番があるかもしれないしね
308デフォルトの名無しさん:2006/10/17(火) 15:56:25
配列で置換したいなら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も使えそう。
309305: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なら普段でも思い出せそうです
310デフォルトの名無しさん:2006/10/17(火) 16:19:10
injectは最初見たとき「こんなややっこしいのいらねー!」と思ってた
311デフォルトの名無しさん:2006/10/17(火) 16:19:52
すんません、便乗ですが gsub を使う場合にはどうなりますか?
arr = [[/OLD1/, 'NEW1'],[/OLD2/, 'NEW2'],[/OLD3/, 'NEW3'],[/OLD4/, 'NEW4']]
arr.each{|old, new| str.gsub!(old, new)}
312デフォルトの名無しさん:2006/10/17(火) 16:30:09
arr.each{|old,new| str=str.gsub(old,new)}
313デフォルトの名無しさん:2006/10/17(火) 16:33:35
>>312
ども、そうでした orz
314デフォルトの名無しさん:2006/10/17(火) 22:56:23
>>304
「後者は」つってんのは「前者だと代入されない」って意味だ。
315デフォルトの名無しさん:2006/10/18(水) 01:52:22

>>260
ステレオグラムだったのか
316デフォルトの名無しさん:2006/10/18(水) 01:58:17
ちょっとしたソフトハウスの者ですが、いままで貯めたCで書いたライブラリを
全部Rubyから呼べるようにした。
これだとアプリケーションの依頼があったときお客さんのところで即実装可能って感じ。驚く顔が目に浮かぶ。
317デフォルトの名無しさん:2006/10/18(水) 04:33:11
そんなクマに俺様がイマーーー!!
318デフォルトの名無しさん:2006/10/18(水) 09:27:18
>>314
事実はわかった。
ありがとう。
仕組みはわかんないけど。

そもそもこれ代入できると何かまずいの?
もしかして1.9では代入されたりして。
319デフォルトの名無しさん:2006/10/19(木) 00:20:45
まずいまずくないじゃなくて、そういう仕様。

代入式は(代入の方向を考えれば当然だと思うが)右結合するので
y ||= x = i は
y ||= (x = i) と解釈され
以下と等価。
unless y
 x = i
 y = i
end

xには常に代入したいなら
x = i; y ||= i
とするしかない。
320デフォルトの名無しさん:2006/10/19(木) 00:45:49
>>319
a ||= b って、
unless a
 a = b   # 代入がされないことがある
end
と等価なの?
おれはてっきり
a = a || b  # 必ず代入が起こる
かと思ってたよ。
結果は同じなんだけどさ。
321デフォルトの名無しさん:2006/10/19(木) 02:23:57
>>319
御教示ありがとうございます。
322デフォルトの名無しさん:2006/10/19(木) 14:55:19
rdoc から manpage (roff) への変換ってどうやるの?
323デフォルトの名無しさん:2006/10/20(金) 03:43:18
324デフォルトの名無しさん:2006/10/20(金) 04:09:18
rubyでプログラムする際の統合開発環境って何がいいですか?
ただのやつで
325デフォルトの名無しさん:2006/10/20(金) 05:16:30
秀丸エディタ
326デフォルトの名無しさん:2006/10/20(金) 09:25:56
>>324
Eclipse+RDT
327デフォルトの名無しさん:2006/10/20(金) 09:31:03
Emacs
328デフォルトの名無しさん:2006/10/20(金) 11:38:17
vim,rde,rubywin,freeride,scite
329デフォルトの名無しさん:2006/10/20(金) 13:29:03
またこの話題か
330デフォルトの名無しさん:2006/10/20(金) 13:32:07
てゆーか、開発環境ネタってオフィシャルサイトにまとまって載ってないの?
もし無いなら載せるべきじゃね?
331デフォルトの名無しさん:2006/10/20(金) 13:53:40
オフィシャルサイトの”Try Ruby!”で、何を入力しても以下のエラーが出るんですけど。。。

An error has occured. Try refreshing this page to reload your session.
332デフォルトの名無しさん:2006/10/20(金) 14:53:30
ふつうに実行出来るけど。
そのエラーメッセージに従ってリロードしてみたらどうなるの?
333デフォルトの名無しさん:2006/10/20(金) 15:25:53
Ruby で alarm 使えるようにならないかなあ。
334デフォルトの名無しさん:2006/10/20(金) 15:47:40
>>332
リロードしてもエラーがでます。
何でだろう?
335デフォルトの名無しさん:2006/10/20(金) 15:51:42
Cookie が制限されてるとか?と、適当なことを言ってみる。
336デフォルトの名無しさん:2006/10/20(金) 16:33:31
>>335
その通りでした。
ありがとうございます。
337デフォルトの名無しさん:2006/10/21(土) 00:13:19
ルビーのソースコードを型検査してくれるプログラムねーのかよ、
かいててマジでむかつくんだけど。
338デフォルトの名無しさん:2006/10/21(土) 00:24:11
一般論として、そりゃ書き方がまずい
他の言語のように書こうとするでない
339デフォルトの名無しさん:2006/10/21(土) 00:25:52
>337
型チェックないとムカつくなら別の言語使ったら?
あえてRubyでやるなら
ハンガリアンと手動型チェック駆使してみるとかw
340デフォルトの名無しさん:2006/10/21(土) 00:30:18
perlみたいに変数の宣言だけでもあれば少しはマシなんだけどね
341デフォルトの名無しさん:2006/10/21(土) 00:34:23
無いのと出来ないのは違うもんな。
型が重要なら Ruby は不向きだな。
342デフォルトの名無しさん:2006/10/21(土) 00:45:20
# 泥沼になるので型の有用性についての議論は禁止
343デフォルトの名無しさん:2006/10/21(土) 01:55:58
>>320
accessorつくってためしてみれ。
344デフォルトの名無しさん:2006/10/21(土) 07:20:29
だからユニットテストできるように作れとあれほ(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
>>337
なんかあったよ。検索してごらん
348デフォルトの名無しさん:2006/10/21(土) 11:21:30
349デフォルトの名無しさん:2006/10/21(土) 23:24:23
Mathモジュールに、cでいうところのpowがないのはなぜですか?
5^1.5とかの数値が欲しいときに、いちいちlogをとったりして変換するのが面倒なのですが。
350デフォルトの名無しさん:2006/10/22(日) 00:40:05
**
351デフォルトの名無しさん:2006/10/22(日) 09:04:45
アッー!
そんな演算子がありましたね。。
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が混在しちゃってるからかな・・・
354デフォルトの名無しさん:2006/10/22(日) 13:50:17
もう役割を終えたんだよ。そっと休ませてあげなさい。
355デフォルトの名無しさん:2006/10/22(日) 20:42:14
matzをか?
356デフォルトの名無しさん:2006/10/22(日) 22:43:38
>>352
env -u RUBYOPT irb
357デフォルトの名無しさん:2006/10/23(月) 14:34:35
>>345
Tk.restart
358デフォルトの名無しさん:2006/10/23(月) 14:45:55
グラフィック作ろうと思ってRuby/tk使ってTk.mainloopで無限ループになってグラフィック作成前にグローバル変数宣言してるのをローカル変数だけにしたいんだけおどうしたらいい
359デフォルトの名無しさん:2006/10/23(月) 15:47:32
BasicのLeft$、Mid$、Right$とかの関数と同じことをRubyでやりたいのだけど、
一発でできないのかなぁ(もちろん、日本語対応)?
jcode.rb とかを require して each_char とかしないとダメ?
どなたか教えてくださーい。
360デフォルトの名無しさん:2006/10/23(月) 17:45:15
バッファ操作する時に使うこんな感じのメソッドって標準でありますか?
def cstr2s(s)
   idx = s.index(0.chr)
   if idx
       s[0..idx-1]
   else
       s
   end
end
361デフォルトの名無しさん:2006/10/23(月) 17:52:24
s.split(/\0/)[0]
362デフォルトの名無しさん:2006/10/23(月) 21:23:18
s[/[^\0]*/nm]
363デフォルトの名無しさん:2006/10/24(火) 06:44:17
>>357 Thank you very much

  ┏┓     ┏┓           ┏━┓ ┏━┓
┏┛┗┓ ∧∧ ┗━┓        ┃  ┃ ┃  ┃
┗┓┏( つ ゚Д゚) ┏┓┃┏━━━┓ ┃  ┃ ┃  ┃
┏┛┗ \ y⊂ ) ┛┃┗━━━┛ ┗━┛ ┗━┛
┗┓┏ /    \┓┃        ┏━┓ ┏━┓
  ┗┛∪ ̄ ̄ ̄\) ┛        ┗━┛ ┗━┛
364デフォルトの名無しさん:2006/10/24(火) 09:11:03
ちょっとしたスクリプトを作ったので何らかのオープンソースライセンスで
配布したいのですが、Rubyに限らずプログラミング全般に関して初心者
ゆえに、まとめ方がよく分かりません。あと、コーディングの作法について
も不安があります。

そこで、既存のプログラムを参考にしたいのですが、何かそれなりの規模
で初心者にも分析・理解しやすい、おススメのRubyアプリケーションまたは
ライブラリはないでしょうか?
365デフォルトの名無しさん:2006/10/24(火) 09:13:36
366デフォルトの名無しさん:2006/10/24(火) 13:51:07
exec や system 使ったて外部コマンド実行した例何処かに載っていませんか?
367デフォルトの名無しさん:2006/10/24(火) 14:10:14
>>366
Rubyの前に日本語をどうにかしようね。
とりあえず、こんなんでいいのか?

% ruby -e 'system("ls")'
. ..
%
368デフォルトの名無しさん:2006/10/24(火) 14:46:13
>>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');
370359:2006/10/24(火) 15:52:03
>>368
ありがとん!!
なるほど、split('') という手があるね。
いろいろ悩んだ末に
"あいうえおかきくけこ" =~ /^.{3}/
とかして $& と $' で left と right を代用しました。
でも、素直に left とか right があると良いのになぁと思いましたです。
371デフォルトの名無しさん:2006/10/24(火) 18:02:57
(VBでない)BASICは少しの間やってたけど、
RubyでLEFT$やRIGHT$を使いたいと思ったことはないなあ。

p "1234567890"[-3,3]
"890"
372デフォルトの名無しさん:2006/10/24(火) 23:22:13
irb(main):001:0> puts $KCODE
SJIS
=> nil
irb(main):002:0> puts "1234567890"[-3,3]
X0
=> nil
373デフォルトの名無しさん:2006/10/24(火) 23:25:57
そりゃバイト単位で切って新しい文字列作るからな
文字単位で切ってるわけじゃないし
374デフォルトの名無しさん:2006/10/24(火) 23:32:10
class String
  def first(n)
    self[/\A.{#{n.to_i}}/]
  end
  def last(n)
    rindex(/.{#{n.to_i}}\z/) && $&
  end
end
375デフォルトの名無しさん:2006/10/24(火) 23:39:32
>>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

こんなのであってますか?
376デフォルトの名無しさん:2006/10/25(水) 01:40:05
> jleft
> jright
> jmid

吐いた
377デフォルトの名無しさん:2006/10/25(水) 02:01:17
マルチバイト拡張を施して mb_left とかにすべきだよな
378デフォルトの名無しさん:2006/10/25(水) 03:25:59
↓のやつがマニュアルどおりの結果になりません。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]
ですが、どのへんに問題があるんでしょうか?
379デフォルトの名無しさん:2006/10/25(水) 05:56:09
RubyCLRに期待棚
380デフォルトの名無しさん:2006/10/25(水) 10:30:18
>>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"

バージョンは?
381デフォルトの名無しさん:2006/10/25(水) 10:56:48
>>371
>>373
そもそも、発端の359は「日本語対応」と言っているのに...
考えてみたら、こんなのに正規表現を使うってのもなぁ

>>380
ていうか、$KCODE があるわけだし String クラスが不完全なだけじゃ?
382デフォルトの名無しさん:2006/10/25(水) 12:45:15
jcodeに誰も言及してないのは何か理由があるのかな?
383デフォルトの名無しさん:2006/10/25(水) 12:58:25
>>382
>>359を嫁
384デフォルトの名無しさん:2006/10/25(水) 14:09:31
>> 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"

です。
385デフォルトの名無しさん:2006/10/25(水) 17:18:07
アンケートなんだけどさ。

Rubyで書くときTestって使ってる?
386デフォルトの名無しさん:2006/10/25(水) 17:57:19
すんません、RubyでTestが必要な規模のコードなんて書いたことありません
387デフォルトの名無しさん:2006/10/25(水) 18:05:13
いちいち途中のデータを大量の p で表示させて確かめるの面倒だなあとか
CGIだとネットの先のサーバからではなくローカルから読んでローカルに吐き出させるの面倒だなあとか
そういうことは思わなくもないけど、Testユニットのうんたらかんたらで軽減するなら喜んで使う
388デフォルトの名無しさん:2006/10/25(水) 18:18:49
>>387
> ネットの先のサーバから
Rubyでスクリプト作ってる奴はそんなのばっかだな

WebサーバからHTML持ってきて加工して表示以外のCGIはないんか
389デフォルトの名無しさん:2006/10/25(水) 19:41:54
おいらがよく作るスクリプト
* 他言語のソースを吐くもの(実装コードとユニットテストコード)
* Excelとかをがーっと編集するもの(複数ブックにまたがる修正とか)
* 簡単なCGI
* 自動保守スクリプト
など
390デフォルトの名無しさん:2006/10/25(水) 19:51:02
>>388
FirefoxのGreasemonkeyもそうだけど、それだけ
「既存のサイトをいじってデータ取り出したい」という欲求需要があるってことなんだろうな
391デフォルトの名無しさん:2006/10/25(水) 23:39:50
open-uriが最高に便利すぎるからな
392デフォルトの名無しさん:2006/10/26(木) 07:20:46
def init(v)
v=2
end

val=1
init(val)
p val

とした実行結果が2になるようにしたいんですがどうしたらいいですか
Cのポインタを使った参照渡しみたいなことができますか
393デフォルトの名無しさん:2006/10/26(木) 08:48:25
def init(v)
v=2
end

val=1
p init(val)
394デフォルトの名無しさん:2006/10/26(木) 09:03:39
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
にする場合はどうしたらいですか
395デフォルトの名無しさん:2006/10/26(木) 10:45:31
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"

のように、メソッドの後ろに '"' がひっついてきてしまいます。

コレなんででしょうか?
396デフォルトの名無しさん:2006/10/26(木) 12:31:37
>>394

def init(v1,v2,v3)
 v1=4;v2=5;v3=6
 return v1, v2, v3
end

val1=1;val2=2;val3=3
val1, val2, val3 = init(val1,val2,val3)
p val1;p val2;p val3

See also:
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%A9%B8%E6%B9%BD%C2%A4#return
http://www.ruby-lang.org/ja/man/?cmd=view;name=%B1%E9%BB%BB%BB%D2%BC%B0#a.c2.bf.bd.c5.c2.e5.c6.fe
397デフォルトの名無しさん:2006/10/26(木) 12:46:40
わお。複数の返り値がもてるとは知りませんでした。
勉強になりました。ありがとうございました。
398デフォルトの名無しさん:2006/10/26(木) 13:46:40
でもダサいね
399デフォルトの名無しさん:2006/10/26(木) 14:49:30
return のとこは配列やハッシュで返すほうがカッコいいと思う


若干だが

ヤマサ醤油とヒゲタ醤油のどっちがカッコいいかとかと同レベル
400デフォルトの名無しさん:2006/10/26(木) 15:34:24
>>395
"".to_st でも再現する。
ActiveSupportは無関係。
401デフォルトの名無しさん:2006/10/26(木) 17:18:50
>>400
おお、ホントだ。再現しますね。
これはそういう (望まれた) 仕様なんでしょうか?それとも単にバグ?
402デフォルトの名無しさん:2006/10/26(木) 17:30:19
起動時にきまって開くwebページを一度に開くスクリプトを書いておりまして、
URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。

ある程度できたのですが、
一行目の最後に改行が来ると決まって例外が発生します。

テキストの扱い方がまずいのかなと思い、
ファイル全体をprintしましたらキレイに出力されました。

どうのような原因がかんがえられるでしょか?
よろしくお願いします。




403デフォルトの名無しさん:2006/10/26(木) 17:53:22
>>402
まずその例外を見せろ。話はそれからだ。
404デフォルトの名無しさん:2006/10/26(木) 17:57:43
リファレンスを引数に取れないってことでしょうか?
405402: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デフォルトの名無しさん:2006/10/26(木) 18:39:43
腹イテェ
407デフォルトの名無しさん:2006/10/26(木) 19:39:28
>406
大丈夫?(´・.・)っ【胃腸薬】
408デフォルトの名無しさん:2006/10/26(木) 19:42:10
>>405
ケチケチせずに出たエラー全部貼れよ。
409デフォルトの名無しさん:2006/10/26(木) 20:00:44
>起動時にきまって開くwebページを一度に開くスクリプトを書いておりまして、
>URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。

と聞いて、

>ちなみにnep/http のPOSTを使用したりしています。

という流れを予想した奴が何人いただろうか。
410デフォルトの名無しさん:2006/10/26(木) 20:51:48
初心者スレだから



予想できなかった

なんつーかあれだ、簡単で確実で動作の間違いない小さいスクリプトから
少しずつ改造して大きくしていくというアプローチがいいと思う
411デフォルトの名無しさん:2006/10/26(木) 21:27:57
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
になるようにしたいんですけど、どうしたらいいですか
412デフォルトの名無しさん:2006/10/26(木) 21:31:04
自己解決しました失礼しました
413デフォルトの名無しさん:2006/10/27(金) 17:24:20
n = gets.to_i
を厳密に整数値だけ受け付けるようにしようとしたら/^(\d+)$/でチェックするしかないの?
414デフォルトの名無しさん:2006/10/27(金) 17:30:48

begin
 n = Integer(gets)
rescue
 puts "数字じゃないよ。"
end
415デフォルトの名無しさん:2006/10/27(金) 18:20:48
>>414
ありがとうございます。
>Integer(gets)
これはじめてみるんですが、文法的にはどういうことなんですか?
キーワードか何かあったら教えてください。
416デフォルトの名無しさん:2006/10/27(金) 18:30:59
Integer はここではメソッド名。 gets はメソッド呼出しのカッコ省略。

0xa とかも受け付けるけどね。
417デフォルトの名無しさん:2006/10/27(金) 18:31:00
「わかった」感じで簡潔に書きすぎるのも初心者スレ的には問題なのかもな
418デフォルトの名無しさん:2006/10/27(金) 18:39:08
>>417
全く同意だがこの場合は単にまだ知らんだけだろう

Integerは組み込み関数

厳密にはRubyには関数は存在しないが、
なにやら便利な感じに使えるようにあらかじめいくつかそれっぽく定義されている
整数とみなせない字面を引数に持つと、to_iのように無理には変換せず例外を返す
419デフォルトの名無しさん:2006/10/28(土) 01:25:36
書き進め方のしつもん。
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の書き方が染み付いてます。
420デフォルトの名無しさん:2006/10/28(土) 01:38:52
よーわからんが、クラスのインスタンスを生成するという行為が真っ当ならその1
(ただしstep1とstep2はstep3の定義の中で呼ぶようにしてstep3だけ明示的に実行)

このクラスのインスタンスを生成する、という行為がいったいどういう意味なのか
頭を悩めてしまうような「ただ適当にまとめただけのクラス」ならその3
(ただしstep3は傍目にも最終結果であることが明白な名前にする)

その2は前時代的なので忘れてよし

こんなんでどう
421デフォルトの名無しさん:2006/10/28(土) 15:03:46
>>419-420
失格
おまえら2人ともプログラミングデザインの本読め
422デフォルトの名無しさん:2006/10/28(土) 22:22:55
いまRubyの勉強中なんですが、Mix-inってObjCとかJavaでいうプロトコルとかインターフェイスみたいなもんですか?
423デフォルトの名無しさん:2006/10/29(日) 08:55:33
>422
Javaは軽く噛った身。

プロトコルは解らんが
JavaのinterfaceとRubyのmoduleは
一見似てるようで全然違う印象。

Javaのinterfaceは
クラスに依らない多態を実現する為に使い
実装は各クラスに任せるんだが

Rubyのmoduleは
複数クラスに共通(とは限らないが)の実装をする為に使い
クラスに依らない多態はRubyの仕様を利用して
「複数のクラスに同名のメソッドを実装」すれば良い。
424423:2006/10/29(日) 08:57:12
gsub('クラスに依らない') { クラス階層に依らない }
425デフォルトの名無しさん:2006/10/29(日) 17:41:51
かなりしょぼい質問なんですけども、
ファイルの行数の取得はどうすればよいのでしょうか?

ttp://www.namaraii.com/rubytips/?%A5%D5%A5%A1%A5%A4%A5%EB%A5%A2%A5%AF%A5%BB%A5%B9#l13

ここに載っていないのですが行数取得関数はあるのでしょうか?
426デフォルトの名無しさん:2006/10/29(日) 20:02:56
Centosでrubyの1.8.1を使ってるのですが、日本語を出力
させようとすると(putsとか)文字化けしてしまいます。

UTF-8で普段使ってるので、スクリプトの冒頭に
#!ruby -Kuを書いてみたり、 ruby -Ku スクリプト名で
指定しても結果は変わりません。どうやればいいのでしょうか?
427デフォルトの名無しさん:2006/10/29(日) 20:23:49
何を出力させようとしてるの?
428デフォルトの名無しさん:2006/10/29(日) 22:09:09
>>427
ruby以外でも、(perlとかも)文字化けしてしまうので、
ruby固有のケースではないみたいです。

システム自体の設定だと思うので、他で質問するか
もうちょっと自分で調べてみることにします。
429デフォルトの名無しさん:2006/10/29(日) 22:09:54
>>425
readlines → size
430デフォルトの名無しさん:2006/10/30(月) 00:49:53
>>429
馬鹿かお前は?
431デフォルトの名無しさん:2006/10/30(月) 01:01:44
512バイトずつ読み込んで改行を検索しカウントして破棄するという動作にすべきだよな!

readlinesでファイルを全て読み込みなおかつ配列に変換して保持するなど
システムに多大なる負担をかける悪魔のごとき所業であり断じて許すわけにはいかん
432デフォルトの名無しさん:2006/10/30(月) 01:10:17
each_line でカウンタをインクリメントすればいいんじゃない?
433デフォルトの名無しさん:2006/10/30(月) 01:16:09
なら wc -l とか grep -c '' とか *nix のコマンドで。
434デフォルトの名無しさん:2006/10/30(月) 03:03:26
>>426
rubyのスクリプト自身は、UTF-8になってる?
435425:2006/10/30(月) 10:13:56
やはりファイルの行数取得関数はないんですね。
レスをしてくれた皆さんありがとうございます。

とりあえず、行数をインクリでカウントして対応しようと思います。

436デフォルトの名無しさん:2006/10/30(月) 19:01:06
>>426
どこに出力して化けてるといってる?
単にUTF-8に対応してない端末エミュレータ使ってるとか。
437デフォルトの名無しさん:2006/10/30(月) 21:38:03
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
どうも。
インターフェイスみたいに形式だけ指定するんじゃなくて、実装を伴うんですね。
439デフォルトの名無しさん:2006/10/31(火) 10:32:45
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]
443デフォルトの名無しさん:2006/11/01(水) 00:40:36
>>442
scriptのつかんでいる入出力はtty(pty)じゃないとだめ、とか?
444442:2006/11/01(水) 07:32:05
expect.rb を使うにあたって "pty" を調べた時に、
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man7/pty.7.html
とあったので、「telnet も script も同じ仲間なのか」と思い、

> PTY.spawn('script

としてみましたが、これは見当違いということでしょうか。
445デフォルトの名無しさん:2006/11/01(水) 12:24:47
>>442
漏れの環境だと、最後に w_f.puts 'exit'; r_f.read を入れてやったら動いた。
446デフォルトの名無しさん:2006/11/01(水) 14:08:22
s += line
というのを文字列sが10MB分くらいになるまで繰り返すんですが
前もってバッファを確保しておいて高速化してくれるものはないですか?
StringBuffer/Builderみたいなの。
447デフォルトの名無しさん:2006/11/01(水) 14:32:56
知らんけど、s += lineより s << line のほうが
448デフォルトの名無しさん:2006/11/01(水) 14:47:16
配列にpushしていって、最後にjoinすれば?
バッファを用意しておくよりは遅いかもしれないけど、計算量的には同等のO(N)になるし、10MBもあるなら文字列の連結を繰り返すO(N**2)よりは断然早くなることは期待できる。
まあバッファを用意できる方法がもしあればそれに越したことはないんだろうけど、もしないなら配列にpushしてjoinも捨てたもんじゃないと思われ。
449デフォルトの名無しさん:2006/11/01(水) 17:07:47
試してみた

# 文字列に直接連結
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+
450デフォルトの名無しさん:2006/11/01(水) 18:52:34
その環境で s << "aaa... だとどれくらいになる?
451デフォルトの名無しさん:2006/11/01(水) 19:52:49
>>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
452デフォルトの名無しさん:2006/11/01(水) 20:09:53
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
のほうが早いのではないかと。
453デフォルトの名無しさん:2006/11/01(水) 20:14:40
>>451
実験ありがとう。配列join早いなあ。
ところで、試してないけど、この例みたいに回す回数が決まってるなら、

a = Array.new(1000000)
for i in 1..1000000
a[i] = "aaa...
end

の方が早かったりしないかな?
454デフォルトの名無しさん:2006/11/01(水) 20:17:36
>単純計算で300倍くらい違ってるんだけど、どこでそんなに時間食ってるのやら…
GC。a+=b ってのは a = a + b の略だから、これをする毎に前の a がごみに
なる。a << b は a を延長して追加するからごみが出ない。Rubyは単純な
mark&sweepだからごみが増えればGCの処理時間も比例して増える。

参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。
ごみになった瞬間に回収されるから、mark&sweepの負荷がない。
455デフォルトの名無しさん:2006/11/01(水) 21:55:07
単純にコピーする量が増えるからじゃないの?
+=の場合は、
a
aa
aaa
aaaa
aaaaa
っていう風に、内部でコピーしなければならない文字列の長さがどんどん長くなっていくから、N回のループで(N*N/2)回(三角形の面積)かかる。
追加していくタイプは、一回一回の操作にかかる時間はどんなにaaaa・・・の長さが長くなっても、一定時間で追加できるから速い。
もちろんGCのほうにも同じだけの負荷は回っていると思うけど。
456デフォルトの名無しさん:2006/11/01(水) 22:31:21
GCの処理量とか考えてコード書いたほうがいいのか
ピンと来ないし面倒だなあ
457デフォルトの名無しさん:2006/11/01(水) 22:38:26
<<, joinが最適化いというのは何かがおかしい。
素直にStringBuilder的な物をサポートすべきだな。
といってもされないだろうからRuby.NETに期待だ。
458デフォルトの名無しさん:2006/11/01(水) 22:48:21
大きいファイルを扱うような時は、こまめにGCを動かさないとひどいことになるよ
459デフォルトの名無しさん:2006/11/01(水) 23:05:43
スプリクトが走ってる環境を知る手段って、
RUBY_PLATFORM 以外に何かありますか?
460442: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は気休めだと思うけど、なんとなくつけてみました。
461デフォルトの名無しさん:2006/11/02(木) 00:04:45
>>457
アホやなぁ。
RubyはJavaと違ってStringがmutableなんだよ。
だからRubyのStringはStringBufferなんだよ。

+=のとき最適化されないのはおかしいとか言ったら張ったおすよ。
Javaではそもそも+=すら出来ないでしょ。
462デフォルトの名無しさん:2006/11/02(木) 00:07:39
>>454
>参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。
遅かったよ。GCがどうとかは的外れだな。
463デフォルトの名無しさん:2006/11/02(木) 00:40:34
参照カウントがメインのPHPでも遅いな。
464デフォルトの名無しさん:2006/11/02(木) 00:50:49
GCがネックかどうか、ってことなら
GC.disableしてからループ回してみたらどうだろう。

俺はGCがネックでもネックでなくても構わんのでやらんけどw
465デフォルトの名無しさん:2006/11/02(木) 01:06:37
>>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
466デフォルトの名無しさん:2006/11/02(木) 01:33:08
>>465
なんでPythonとこんなに違うのか知らんけど、GCのせいならゴミの数が同じ
下のコードで早くなるのはおかしくね?

t1 = Time.now
100.times do
  s = ""
  500.times do
    s += "a"
  end
end
t2 = Time.now
p t2 - t1
467デフォルトの名無しさん:2006/11/02(木) 02:48:29
>>461
アホやなぁ。RubyのStringでどうやってバッファを確保しろっちゅんじゃ。
468デフォルトの名無しさん:2006/11/02(木) 03:03:26
>>467
マジバカなのか?
469デフォルトの名無しさん:2006/11/02(木) 03:22:57
プログラム中でDir.chdirでディレクトリを変更しても、プログラムが終了すると元の
ディレクトリに戻ってしまうのですが、そうならないようにする方法はありますか?
470デフォルトの名無しさん:2006/11/02(木) 03:30:04
スクリプトを起動した元のシェルに移動先ディレクトリのパスを渡して終了後に移動してもらえ
471デフォルトの名無しさん:2006/11/02(木) 03:30:12
他の言語の話ばかりになってしまったが
>>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と同じだと言っている。
472デフォルトの名無しさん:2006/11/02(木) 08:52:31
速度気になるならC使ってライブラリ書く手もある

GC はメモリを自前で管理する手間が少なくなるが
逆にそれを管理するのは面倒なものだよ
473デフォルトの名無しさん:2006/11/02(木) 09:00:45
RubyをやればやるほどPythonが魅力的になってくる
474デフォルトの名無しさん:2006/11/02(木) 09:21:15
>>471
エスパーにもう一つ質問したいんだが、RubyのStringで<<が何らかの形で最適化だか高速化だかがなされるのは、どういう仕組み?
文字列本体の内部表現として、「連続するメモリ領域(Cでいう配列)」を採用しているならば、連結する度に毎回malloc/reallocの類をするのは避けられないのでは?

・Rubyのpushが速いのは、線形リストの連結一回一回は一瞬でできるため。
・StringBuffer等バッファを使うと速いのは、一回一回の連結時にはすでに存在するメモリ領域に入れればいいだけであるため。
・Ruby等の+=然り、Perlのpush然り(?)、が遅いのは、連続するメモリ領域の形になっていて(つまり線形リストの類ではない)、おおよそ連結するたびに、@全体をメモリ確保する処理と、A元のデータをコピーする処理が発生するため。

っていう感じの認識なんだが、そうするとRubyの<<が速い理由がよくわからん。
>>452の言うとおり、RubyのStringはStringBuffer的な機能を果たすのか?
ソース嫁ばわかることかもしれんが、ちょっとした気の迷いで他力本願でいってみる。

気付いたら長文になってた。ゴメソ
475デフォルトの名無しさん:2006/11/02(木) 09:42:12
Ruby の文字列でも、連結するときにはバッファをあらかじめ少し広めに取っているんだがな。
476デフォルトの名無しさん:2006/11/02(木) 09:49:14
連結するときになってから広くとっても意味なくね?
477デフォルトの名無しさん:2006/11/02(木) 10:11:57
>>470
Shell.cd(dir)とやると
shell: current dir: なんとか
と表示されるのですが、直後にp Dir.pwdとすると、カレントディレクトリは
変わっていませんでした。

スクリプトを起動した元のシェルに移動先ディレクトリのパスを渡す・・・というのはどうやる
のでしょうか。
478デフォルトの名無しさん:2006/11/02(木) 10:21:23
StringBuffer の必要性はわからんでもないけど、大抵のケースは String で十分だし、
少なくとも、標準添付されなくてはいけないほどの需要は無いんじゃないかな。
どうしても必要なら自分で拡張ライブラリで実装すれば良いんじゃね?
479デフォルトの名無しさん:2006/11/02(木) 10:49:16
>>477
Rubyスクリプトのhoge.rbに

END {
  puts '/home/user/path/to/move'
}

とかputsで移動先パスを出力させておいて

DIRNAME=`./hoge.rb`
cd $DIRNAME

というシェルスクリプトでRubyスクリプトを起動する、ってことなんじゃねえの
死ぬほど格好悪く泥臭いがほぼ確実に動作するな
480デフォルトの名無しさん:2006/11/02(木) 11:02:15
それはhoge.rbが標準出力に文字を出力するタイプのスクリプトだった場合面倒で死ぬ(w

raiseでエラーメッセージとして標準エラー出力にパスを出したほうがよくね
481デフォルトの名無しさん:2006/11/02(木) 16:15:01
>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言語のメモリ確保でやるのとじゃ全然違う筈。
482デフォルトの名無しさん:2006/11/02(木) 16:46:06
エスケープの仕方教えてください

p "a'b".gsub(/'/,"\\\'")
abb

こうなってほしいのですけど。。
a\'b
483デフォルトの名無しさん:2006/11/02(木) 17:36:32
>>482
エスケープ文字を3つから4つに増やしてごらん (5つでもいいけど)。
理由はRubyリファレンスマニュアルのString#gsub項を見ることだな。
484デフォルトの名無しさん:2006/11/02(木) 17:39:48
"a'b".gsub(/'/){"\\\'"}
485デフォルトの名無しさん:2006/11/02(木) 18:16:15
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倍ずつ。
許容量が減ることはない気がする。
486デフォルトの名無しさん:2006/11/02(木) 18:29:19
>>482
初心者は str.gsub(/.../, "...") 形式を使ったらダメ。ゼッタイ。
str.gsub(/.../) { "..." } だけ使うこと。
487デフォルトの名無しさん:2006/11/02(木) 18:36:23
ほわい?
488デフォルトの名無しさん:2006/11/02(木) 18:44:22
今回みたいにはまるやつがいるからだろ
489デフォルトの名無しさん:2006/11/02(木) 18:51:23
RubyリファレンスマニュアルのString#gsub項を見てパッと理解できるような香具師は既に初心者ではないから。
490デフォルトの名無しさん:2006/11/03(金) 02:46:42
こんばんわ
a = `command`
としたときに、標準出力しかaに入りません。
標準エラーを得るにはどうしたらよいか教えてください。
491デフォルトの名無しさん:2006/11/03(金) 03:27:20
>>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系は知らん。
492490:2006/11/03(金) 03:39:35
師匠どうも。
493デフォルトの名無しさん:2006/11/03(金) 06:18: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]
495デフォルトの名無しさん:2006/11/03(金) 13:24:33
puts 'this is a pen'.split[1..-1]
496デフォルトの名無しさん:2006/11/03(金) 13:35:59
>>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
498デフォルトの名無しさん:2006/11/03(金) 23:31:42
Rubyイラネ
C#を使おう




−−− というわけで、このスレ終了 −−−
499デフォルトの名無しさん:2006/11/03(金) 23:40:54
MS信者乙
500デフォルトの名無しさん:2006/11/03(金) 23:46:52
>>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
501デフォルトの名無しさん:2006/11/04(土) 00:03:12
>>500
おお,ありがとうございます
502デフォルトの名無しさん:2006/11/04(土) 13:21:22
cgi.rb経由で引数を受け取る
        ↓
引数を利用してサイトを巡る
        ↓
巡ったサイトを処理してデータ抽出
        ↓
抽出データを整形してブラウザに表示

というCGIスクリプトを書いてます。
途中の処理が遅くてユーザーにブラウザの中止ボタンなどを押される可能性があるので、
そういう時にはPStoreあたりでサーバにいくつかのデータを途中保存したいと思います。

「ブラウザ側からCGI動作を中止された」ことを検知する方法はありますか?
503デフォルトの名無しさん:2006/11/04(土) 13:55:17
ユーザに中止ボタン押されてもCGI自体は最後まで動くんじゃなかったっけ?

その例ならデータの抽出整形までは完了するはずだからその後適当に保存なり何なりすれ
504デフォルトの名無しさん:2006/11/04(土) 23:50:01
rubyで2進数の計算したいのですが教えてください。
例えば、a=0011;b= 0001;のときc=a+bとするとc=0100となるようにしたいのですが、
0baなどとしてもダメだし、String#%メソッドもうまい使い方がわかりません。
505デフォルトの名無しさん:2006/11/05(日) 00:18:00
0b0100.to_s(2)
"0b0100".to_i(2)
506デフォルトの名無しさん:2006/11/05(日) 14:55:23
クラスをモジュールというものに作り変えようと思いました。
よく考えたらインスタンスを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)
とか怒られます。…なんで?
507デフォルトの名無しさん:2006/11/05(日) 15:09:11
> よく考えたらインスタンスを1回しか作らないので
そんなんいちいち気にするな禿げるぞ
添削に出すのでもない限りクラスで作っとけ
508デフォルトの名無しさん:2006/11/05(日) 15:39:15
def self.data
509デフォルトの名無しさん:2006/11/05(日) 17:51:55
>>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
510デフォルトの名無しさん:2006/11/05(日) 17:55:45
>>506
> よく考えたらインスタンスを1回しか作らないので。
特異メソッドにでもしとけ。

class << (Hoge = Object.new)
def data; return 'hello'; end
def hello; puts data; end
end

Hoge.hello
511デフォルトの名無しさん:2006/11/05(日) 19:02:18
クラスであることの意義とか考えたことないな

class なんとか って書くとまとまりになって
メソッド定義でいちいち def なんとか.hoge と書かないといけなくて面倒だけど
a=なんとか.new と最初に実行するように俺の中で決めておくと
def hoge と書いても動くようになるので書きやすくて便利とかそういう程度の認識しかない
512デフォルトの名無しさん:2006/11/06(月) 08:46:16
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" }
514デフォルトの名無しさん:2006/11/06(月) 22:39:23
>>513
それの前に Content-type:text/html を出力してしまってるに3ガバス
クッキーはヘッダですので最初に送って下さい
515513:2006/11/06(月) 23:15:32
>>514
まさにその通りでした!
これでまた一つ勉強になりました!ありがとうございました。
516デフォルトの名無しさん:2006/11/07(火) 04:14:59
Log4rの使い方がイマイチわかりません。

Log4jみたいにLoggerの継承関係があって、Hoge::PiyoのLoggerの設定をしたら
logger=Log4r::Logger["Hoge::Piyo::Foo::Bar"]でHoge::PiyoのLoggerが取れると思ったのですが・・・
http://log4r.sourceforge.net/rdoc/files/log4r/logger_rb.html

Log4rのよい解説サイトってないですか?
517デフォルトの名無しさん:2006/11/07(火) 07:00:03
>>516
log4rはしらんけど、loggerというライブラリが標準添付されているのでそちらではどうでしょうか。
http://jp.rubyist.net/magazine/?0008-BundledLibraries
http://www.ruby-lang.org/ja/man/?cmd=view;name=Logger
518デフォルトの名無しさん:2006/11/07(火) 11:38:04
windowsXP下でのrailsについての質問です。
サーバーを起動するときに
ruby script\server
のようにいちいちプロンプトに入力せずに
サーバーを立ち上げるよい方法はありますか?
519デフォルトの名無しさん:2006/11/07(火) 12:16:38
せんせいしつもんです。
例外のメッセージと同じような感じで、任意のオブジェクトを持ち出すことはできますか?

def main
 begin
  action1
  action2 # メソッドのすげえ深部でエラーErrorAtAct2が起こる
  action3
 rescue ErrorAtAct2
  # 「action2深部でエラーを起こしたときのハッシュデータを利用して別の処理をしてエラー回復」
 end
end

ということをしたいです。
例外を起こしたメソッドの中でならハッシュデータにアクセスはできるんですが、
できればここのmainメソッドでまとめてエラー回復処理を書きたいです。
例外メッセージにハッシュを出力するとハッシュへの復元がなんだか面倒です。
520デフォルトの名無しさん:2006/11/07(火) 20:07:59
>>519
例外オブジェクトにハッシュを持たせればいいんじゃね。


class ErrorAtAct2 < StandardError
attr_reader :data
def initalize(data)
@data = data
end
end

def action1
h = {:a => 1 raise Error
521デフォルトの名無しさん:2006/11/07(火) 20:09:42
>>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
>>512
↓こっちで聞いた方がよいかも。

【Agile】Ruby on rails相談所 part2【DRY】
http://pc8.2ch.net/test/read.cgi/php/1151254378/

こっちも人いないけど。
523デフォルトの名無しさん:2006/11/07(火) 22:01:18
>>517
標準のLoggerってXMLで設定できないし、>>516で書いたようにLoggerの継承関係とかないですよね?
524デフォルトの名無しさん:2006/11/09(木) 00:08:35
backquoteを使うとシェルのメタ文字をエスケープする必要があって面倒なので、
シェルを介さないsystemでコマンドを実行しているんですけど、
コマンドの実行結果(stdout, err両方)を文字列で取得したいんだけどどうすればいいんですか。
525デフォルトの名無しさん:2006/11/09(木) 00:23:11
526デフォルトの名無しさん:2006/11/09(木) 01:21:27
>>525
環境かいてませんでした。すんません。
mswin32なんでopen3だとfork がNotImplementedErrorになりました。
でもそこからリンクをはってあるpopen4だといけました。
ありがとうございます。
527513:2006/11/09(木) 07:23:20
すみません、またまたわからないんで質問よろしくです。
CGI#out でクッキーを出力するやり方はわかったのですが、
例えばoutのブロックの中では文字列しか出力出来ませんよね?
途中で色々処理したい場合なんかはどうやればよいのでしょうか?

これはもちろんエラーですが、以下の様な感じの場合です。
cgi.out("cookie" => cookie){
(0..4).each{|i|
print i + "\n"
}
}
528デフォルトの名無しさん:2006/11/09(木) 08:33:56
cgi.rbってやっぱわかりにくいよね

cgi=CGI.newとしたとして、具体的に何が作られるんだかさっぱりです
cgi1.paramsとcgi2.paramsの違いあるのかとか
cgi1.outとcgi2.outが同じページになるのかとか
529デフォルトの名無しさん:2006/11/09(木) 09:19:12
>>528
CGIってSingletonだとずっと思っていたが、そうじゃないのね
530デフォルトの名無しさん:2006/11/09(木) 10:50:17
しんぐるとんってなに?(素)

…何度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インスタンスを引数とかで連れて行くしかないな
531513:2006/11/09(木) 12:41:41
自分で解決しました。全然意味が分かってなかった様です…
532513:2006/11/09(木) 13:36:42
やっぱりわかってなかったです…
cgi.headerでやればいいと思ったのですが
これだと食べてくれません…
何方か助言を。
533デフォルトの名無しさん:2006/11/09(木) 13:50:56
ruby初めて三日目の初心者ですが質問があります。
インスタンス変数をkeyに、そのインスタンスのアドレス(ポインタ?)をvalueに持つhashを
作成したいのですが、アドレスをどういう形で得るのかが分かりません
簡単な質問かもしれませんがよろしくお願いします

館今日はWinXPでrubyのヴァージョンは1.8.5です
534デフォルトの名無しさん:2006/11/09(木) 14:24:38
ヴァヴァヴァ♪ヴァージョン♪ヴァージョン♪ヴァージョン♪
535デフォルトの名無しさん:2006/11/09(木) 14:35:21
>>528
同じページって言う意味がよくわからんのだが、CGIって簡単に言えば(主語はCGI)
・リクエストのたびにプロセスが起動され
・標準入力とか環境変数から入力を受け取って
・結果を標準出力に吐き出すだけ
じゃないのか。
試しに、ライブラリを使わずに、環境変数からパラメタ取得して、標準出力に結果を吐いてみればいい。
参考:ttp://www.tohoho-web.com/wwwcgi3.htm

わかりにくいのは別のところだと思うよ。
そもそも仕組みがわかってないと、Webプログラムはわかりづらいし書きづらい。
わかってても、ステートレスだとかHTMLも書かなきゃならんとか約束事が多いとかで
素のCGIは書いてて全然面白くない。皆さんフレームワーク使ってくださいと言いたい。

>>527
Cookieを複数出力したいなら例はマニュアルに書いてある。
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=cgi#class.20CGI.3a.3aCookie
HTMLマニュアルを手元に置いておこう。
536デフォルトの名無しさん:2006/11/09(木) 14:50:55
Cのようなアドレスを得る方法はない
537513: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を一気に書き出すのではなくて
途中にプログラムの処理を挟みたいんです。
根本的に何か勘違いしているかもしれないんですが…
538513:2006/11/09(木) 15:25:52
あ、2回目のcgi.outは
cgi.out({"charset" => "shift_jis"}){…}
こうしてました。
539デフォルトの名無しさん:2006/11/09(木) 16:27:39
質問。
文字列str が、たとえば正規表現の /x/ か /y/ か /z/ に引っかかるなら何かしようと思い

if (str =~ /x/ or /y/ or /z/) then

と書きました。
でも肝心なときに動作が変なので試したら

irb> ("abcde" =~ /x/ or /y/ or /z/)
=> /y/

とか言われました。

なんでここで/y/ですか?
540デフォルトの名無しさん:2006/11/09(木) 16:29:49
>>537
釣りか?
>>514,515
これで了解したんじゃなかったのか?

マニュアルのURLを提示したんだから一通り読みなさい。
すごく分かり易いとは言えないが必要十分な情報が書いてある。
だいたい何を参考に作業してるんだy。
541デフォルトの名無しさん:2006/11/09(木) 16:40:37
>>535
ページってのはあれだ、たぶん
「クライアントからGETとかPOSTとか受け取って解釈してクライアントに出力結果渡す」
という一連の処理が「1ページ」ぶんなんだろう。1画面遷移とゆーか。

だから、cgi2=CGI.newとかが成功してしまうと、
「これって他のメソッドで作ったcgiインスタンスとどこが違うんだ?」と悩みの種に。

CGI#paramsはARGVを整理してくれるだけのメソッド
CGI#outはContent-Type:text/html\n\nを前につけてくれるだけのputs

と割り切ると気楽だと思う。
542533:2006/11/09(木) 16:47:16
>>536
では複数のインスタンスのなかから、
値がインスタンス変数と一致するようなインスタンスを探し出すためには
どのような手段を取ればよいのでしょうか?
543デフォルトの名無しさん:2006/11/09(木) 16:57:50
普通にインスタンス変数を使うのでは駄目かいのう

普通に使うぶんには代入でオブジェクトがコピーされることはない
参照が増えるだけで、メモリ上の実位置は動かない
544デフォルトの名無しさん:2006/11/09(木) 17:01:49
object_idは?
545513:2006/11/09(木) 17:10:53
>>540
いや釣りじゃないです…

出力の途中に処理を挟みたい場合はどうするのかが知りたいんです。
↓こういうのって出来ないですよね?
cgi.out().out("cookie" => cookie){
"test"
}
print 'test2' #ここが出力されないから…
546デフォルトの名無しさん:2006/11/09(木) 17:19:38
>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/ が返される。
547533:2006/11/09(木) 17:43:39
>>543
普通にインスタンス変数を使うとはどういう意味でしょう?

たとえば、親・子の2つのレベルからなる木構造で
各レベルには複数のノードがあり親ノードは複数の子ノードを持つとします
まず親ノードを生成し、次に子ノードを生成します。
この時、子ノードが自分の親を決める為に与えられているのは
親のインスタンス変数の値でこれが一致すると親が一意に決まります
これを判断させるためにインスタンス変数をキーに、アドレスをバリューにしたハッシュを作ろうとしていたのですが、
アドレスが得られないらしいので何か解決策はありませんか?
548デフォルトの名無しさん:2006/11/09(木) 17:46:38
object_id、__id__
549デフォルトの名無しさん:2006/11/09(木) 18:09:03
>>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 を出力したい場合などに使います。
> このメソッドは文字列エンコーディングを変換しません。
550デフォルトの名無しさん:2006/11/09(木) 18:41:18
正規表現に限った話じゃないが

 str == (hoge or hage or huga)

ではなく

 (str == hoge) or (str == hage) or (str == huga)

のように意識して書く癖つけたほうがよくねえか
551デフォルトの名無しさん:2006/11/09(木) 18:46:59
case whenのほうが楽ちゃいまっか
552513:2006/11/09(木) 19:19:02
>>549
レスどうも!
なるほど、よく分かりました!
しかし今ちょっと試してみたんですが
cgi.out("cookie" => cookie){
func
}
みたいに関数は実行出来るみたいですので、これでなんとかなりそうです。
お騒がせしました!
553デフォルトの名無しさん:2006/11/09(木) 19:43:19
ポインタがないなんてRuby糞だな
554513: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>'
555デフォルトの名無しさん:2006/11/09(木) 20:04:21
あんまりわかってないような気もするが。
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

ブロックの効能についてはなるべく自分で調べて欲しいが。
556デフォルトの名無しさん:2006/11/09(木) 21:01:49
>>553
mutable なオブジェクトは全部
ポインタみたいなもんだから
むしろポインタだらけ
557533:2006/11/09(木) 23:56:32
皆さんありがとうございました
object_idとObjectSpace._id2ref()で実現できそうです
558デフォルトの名無しさん:2006/11/10(金) 01:17:35
>>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の基本動作のようなところで抜けている知識が多いと思います。
不正確な書き方も多いと思いますが、どうかご教授ください。
560デフォルトの名無しさん:2006/11/10(金) 04:04:52
環境変数のRUBYOPTで指定
561559:2006/11/10(金) 05:09:10
>>560
わかりました。環境変数でオプション指定してたんですね。
ありがとうございます。


562デフォルトの名無しさん:2006/11/10(金) 07:45:04
>>558
>>557で作ればそりゃ動くだろうけど正直かなりバカっぽいよな
563デフォルトの名無しさん:2006/11/10(金) 08:39:10
>>554
そこにたどり着くまでにえらい遠回りしてるっぽいのだが、
いったいどのドキュメントを読んだせいでそうなったのだろうか。
参考までに教えてほしい。
初心者スレとしては、初心者が迷いなくCGIプログラムを勉強できるように
したいので。
564デフォルトの名無しさん:2006/11/10(金) 09:44:00
ひさしぶりにのぞいてみたら、
>>554とか>>557とかトンデモなコードが多いな、最近。
初心者スレとしてはこれじゃ困るだろ。
565デフォルトの名無しさん:2006/11/10(金) 11:35:26
危機感があるなら明かりつけようぜ。>>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}

たとえばこんな感じか?
566デフォルトの名無しさん:2006/11/10(金) 11:50:18
>>565
CGIはそんな感じだと思う。
HTMLを文字列(か配列)の連結で最後まで作り切っておいて、クッキーを必要なら作って、
HTTPヘッダを必要ならハッシュで作って、CGI#outや自前のprintで一気に表示指示。

1回だけしか使われないデータにハッシュを使うとリソースもったいなくて死ぬとか
逐次出力して捨てれば済む話なのに巨大な変数として保持するなんざ極刑ものだとか
ケチくさいこと言わない限り、初心者的にはふつーに考えるとこのへんに行き着くと思うんだが…
567デフォルトの名無しさん:2006/11/10(金) 12:12:30
>>566
これで出力したいんです。
print <<-HTML
html
HTML
568デフォルトの名無しさん:2006/11/10(金) 12:26:34
>>567
残念なお知らせがある。
CGIは適当にやっても絶対に動かない、ということだ。
HTTPヘッダとHTTP通信の最低限の知識が絶対に要る。
569デフォルトの名無しさん:2006/11/10(金) 12:48:27
>>568
とかじゃダメなんですか?
print "Content-type:text/html\n\n"
print <<-HTML
<html><body>
HTML
色々処理
print <<-HTML
</body></html>
HTML
570デフォルトの名無しさん:2006/11/10(金) 13:00:09
え、いいんじゃねえの?何か問題がある?
>>566にメインストリームではないと断じられたことを気にしてる?

…出力に関わるメソッドが多くなってくると
「HTML内容を変数などで溜めておいて最後にまとめて出力」させるスタンスが
書いてて楽になるんだよ。
スクリプト内のあっちこっちで出力してるとデバッグとかも面倒だ。

面倒でないと思うなら、面倒になるまで続けていてもいいだろ。
もしかしたら面倒に感じないかもしれないし。
571デフォルトの名無しさん:2006/11/10(金) 13:26:55
ERbの話題がなかなか出てこないなぁと思いながらスレを眺めている俺ガイル
572デフォルトの名無しさん:2006/11/10(金) 14:01:50
cgi.rb自体、卜部氏が「誰も使ってないんだなあという認識」をするくらい
半ばobsoleteな代物なので、皆さんフレームワークを使ってください。
RoRをはじめ、色々ありますから。

eRubyでもいいけどbinding渡さなきゃならんとか、じゃあクラス化した方がいいのかとか初心者には悩みが多い稀ガス。
そんで適当なクラス書くくらいならフレームワーク入れろと。
573デフォルトの名無しさん:2006/11/10(金) 14:06:26
cgi.rbでも初心者には既に機能過多な感じなのに
CGI作るのにわざわざWebアプリフレームワークを別途導入しろとな
(まあ、RoRはそう大掛かりなものでもないが)
574513:2006/11/10(金) 15:20:40
質問です。
例えば、下のふたつの場合
どちらがパフォーマンス的に優れてるのでしょうか?

if (0..99999).include?(3)
end

(0..99999).each{|v|
if v == 3
end
}
575デフォルトの名無しさん:2006/11/10(金) 15:30:27
>>513
おかえり。
CGI書くときに参考にしたものを教えてよ。

整数なら以下がたぶん最速だし、Rangeなんぞ使うべきでない。
0 <= 3 && 3 <= 99999
576デフォルトの名無しさん:2006/11/10(金) 15:40:16
$ 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?だな
つーか、この人が参考にしてるサイトなり書籍なりはいったい何なんだろうという疑問が
577513: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
578513:2006/11/10(金) 15:48:36
あ、レス来てましたね…
>>575
やはりinclude?が一番速いみたいですね…

参考にしてるのはやはりリファレンスマニュアルです。
しかしまだ全然Rubyで書いたコード量が少ないんで経験不足です…
こんどちゃんと書籍を買って一から勉強しないとダメですね。
579513:2006/11/10(金) 15:51:59
>>575
そうですよね、整数だとそうなりますよね。
やはりinclude?を使用した方が良さそうですね。
580デフォルトの名無しさん:2006/11/10(金) 16:07:30
Range#include?は<=>で比較してるっぽい
581デフォルトの名無しさん:2006/11/10(金) 16:11:50
というかRangeオブジェクト自体が他と違う不思議存在に思える俺
範囲って何よ、みたいな
582513:2006/11/10(金) 18:43:20
とりあえず練習がてら、シンプルなテキストカウンタ作ったんですが
よかったらダメ出しお願いします…
http://komachi.s101.xrea.com/counter.rb
583デフォルトの名無しさん:2006/11/10(金) 18:47:55
アクセスのリモホ取られるから面倒だしやだ
見て欲しければ

RUBYの宿題教えてください。
http://pc8.2ch.net/test/read.cgi/tech/1106572657/

このスレあたりに移動して
スクリプトだけどっかのあぷろだにでも上げな
584デフォルトの名無しさん:2006/11/11(土) 04:15:27
gem使ってるんですけど、requireしたときに
どのファイルをrequireしたか、
絶対パスで得る方法ってないでしょうか??
585デフォルトの名無しさん:2006/11/11(土) 12:12:14
RUBY


w



perlで良くね?
586デフォルトの名無しさん:2006/11/11(土) 13:03:09
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になります。
なぜでしょうか。
587デフォルトの名無しさん:2006/11/11(土) 13:04:03
以下文法です。
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
588デフォルトの名無しさん:2006/11/11(土) 13:05:00
array  : '[' args ']'

args: arg
    | args ',' arg_item

arg   : NUMBER
    | IDENT
    | RANGE

pow   : POW '(' exp ')'

range  : NUMBER RANGE NUMBER

end
589デフォルトの名無しさん:2006/11/11(土) 13:06:49
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
591デフォルトの名無しさん:2006/11/11(土) 14:34:49
>>590
__FILE__
これでパスも含めたファイル名が取得出来ますよ。
592586:2006/11/11(土) 14:49:38
>>589
あうう。その通りでした。
お恥ずかしい限りです。
ありがとうございました。
593デフォルトの名無しさん:2006/11/11(土) 15:55:06
>>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する。

とすればよいと思うよ。そういうもんだと思ってくれ。
596513: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
597デフォルトの名無しさん:2006/11/12(日) 10:55:17
(0..3).each{|v|
html << %(<font size="#{v}">test</font><br>)
}
598デフォルトの名無しさん:2006/11/12(日) 11:23:18
def name
return 'ruby'
end

puts "Hello, #{name.upcase}!"

#{ } で埋め込めるのは変数だけだという思い込みがある時期は確かにあるな
599デフォルトの名無しさん:2006/11/12(日) 11:32:02
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
600513:2006/11/12(日) 12:01:01
要は、htmlのパラメータを\"\"みたいにエスケープしなくて良いのと
#{}で展開も出来るんで、他のhtmlをそのままコピペで流用出来るのが楽で
ヒアドキュメントを使ってただけなんですけどね。
でもやっぱりコードが見づらいかもしれないですね。

>>597
これはかなり目から鱗でした。
601デフォルトの名無しさん:2006/11/12(日) 21:45:26
RWEFATGTGATATA
GDGTSGSGSGSGSG

のような文字が格納されているファイルで
各文字数をカウントしたいのですがこの場合どうすればよいのでしょうか?

splitで文字列を分割しようと思ったのですが、この場合1文字ずつ分割できないと思い
.unpack(a1)とやったのですがエラーがでてしまいました。
どうすれば負荷をちいさくカウントできるのでしょうか?
602デフォルトの名無しさん:2006/11/12(日) 22:27:48
>>601
これでどうですか?
print 'AABBBCCCC'.scan(/S/).size
あと一文字ずつの分割はこれで出来るみたいですよ。
'AABBBCCCC'.split('').each{|v| print v + "\n" }
603デフォルトの名無しさん:2006/11/12(日) 22:30:37
あ、引数はこうでした。まぁわかるでしょうけど。
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にエラーがでてきたのですが、どう間違っているのでしょうか
606デフォルトの名無しさん:2006/11/12(日) 22:57:51
要件がはっきりしないんだよな

あとエラーは読め
英語だから読めないとかは無し
無理してでも読め
607デフォルトの名無しさん:2006/11/12(日) 23:00:00
>>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
こんなもん英語よむってもんじゃねぇだろ
609デフォルトの名無しさん:2006/11/12(日) 23:13:09
>>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


なんじゃね?
610デフォルトの名無しさん:2006/11/12(日) 23:19:47
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個
611デフォルトの名無しさん:2006/11/12(日) 23:55:02
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 になるんでしょうか?
612デフォルトの名無しさん:2006/11/13(月) 00:08:13
33188を8進数で表記すると100644

puts "#{"%o"%33188}"
100644
613デフォルトの名無しさん:2006/11/13(月) 00:17:32
それだと「先頭の100ってなんだあああああ」という疑問が残ると思うんだが
パーミッションの表示なんていいとこ4桁だろ
614デフォルトの名無しさん:2006/11/13(月) 00:36:50
>>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のやりかたじゃできない気がするのですが・・・
616デフォルトの名無しさん:2006/11/13(月) 10:55:58
エラーは読め
英語だから読めないとかは無し
無理してでも読め

そもそも>>605の考え方でも充分動作するはず


というか、なんつーか、基礎がまだなってねー
とりあえずハッシュの使い方と変数のスコープの勉強しれ
617デフォルトの名無しさん:2006/11/13(月) 10:57:20
>>616
なんとかhash使ってできました。

ただ、何故
gets.chomp!.upcaseは同時にできないのでしょうか?
分割すればできたのですが。
618デフォルトの名無しさん:2006/11/13(月) 11:04:17
>>617
chomp! は改行取らなかったらnil返すから
リファレンス嫁
619デフォルトの名無しさん:2006/11/13(月) 11:05:43
エラーは読め
英語だから読めないとかは無し
無理してでも読め

つか「できない」とか言うな
エラーきちんと書き写せ
エラーはたいてい正確に原因を指摘する
620デフォルトの名無しさん:2006/11/13(月) 11:11:59
エラーのわかりやすい解説一覧とか作ったら需要あるかなあ
621デフォルトの名無しさん:2006/11/13(月) 11:17:40
>>618
なるほど。ありがとうございます。upcaseもnilを返すみたいですね。
これらを使うときは代入しないほうがいいみたいでした。

あと、ARGV[0]でファイルを指定してプログラムを実行する場合なのですが、
ファイルを指定せずプログラムだけを実行すると、デフォルトのエラーが出力されますよね。
この場合、引数を指定しなかった場合のエラーをあらかじめプログラムで記述したエラーを表示するには
なんのメソッドを使えばよいのでしょうか?
622デフォルトの名無しさん:2006/11/13(月) 11:25:21
>>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入門書も詳しくはかいてないような
オライリーとか出してないみたいだし。。
625デフォルトの名無しさん:2006/11/13(月) 11:35:23
>>623
while gets で、コマンドラインで指定したファイルから $_ に1行ずつ読み込まれるよ。
もうちょっと真面目に書くなら、while line = ARGF.gets とかARGF.each_line |line| だが。
626デフォルトの名無しさん:2006/11/13(月) 11:39:29
>>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

みたいな「引数が空ならメッセージ出して終了」な処理を入れること。
引数の有無はスクリプト全体にとって致命的だから
複雑でないスクリプトなら後者で一箇所でまとめて判定したい俺。
627デフォルトの名無しさん:2006/11/13(月) 11:58:15
>>626
勉強になりました。ありがとうございます。
メモっておきました。
628デフォルトの名無しさん:2006/11/13(月) 12:42:05
>>622
ARGVは引数が無いと空配列だから、
ARGV[0]はnil
なんで>>626が言う通りTypeError
629デフォルトの名無しさん:2006/11/13(月) 13:13:20
すみませんが、質問です。

Rubyのスクリプトをコマンドラインで実行した場合、
戻り値0 : 正常終了した場合
戻り値1 : 例外が発生した場合
のようですが、
戻り値2 や戻り値-1を返すにはどうしたらよいのでしょうか?
環境はLinuxです。
630デフォルトの名無しさん:2006/11/13(月) 13:14:31
exit 2
631デフォルトの名無しさん:2006/11/13(月) 13:18:04
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に変更されています。
632デフォルトの名無しさん:2006/11/13(月) 13:23:26
>>631
KISS
633デフォルトの名無しさん:2006/11/13(月) 14:18:21
WinのDLLのテストツールをRubyで書こうとしてるのですが、
Pythonのctypes見たいなのありますか?

もろDLLのテストツールを紹介してくれたらベストですが…Ruby実装のものは無さそう
634デフォルトの名無しさん:2006/11/13(月) 14:30:23
Win32API
635デフォルトの名無しさん:2006/11/13(月) 15:32:05
win32apiで型変換できないですよね?
636デフォルトの名無しさん:2006/11/13(月) 16:08:10
Win32APIも型変換してなくもないような。ctypesはどれくらい対応してたっけ。
ま、とりあえずDLでもチェックしてみるといいよ。
637デフォルトの名無しさん:2006/11/13(月) 16:30:35
>>624
プログラミングRuby 第2版「言語偏」「ライブラリ編」
638デフォルトの名無しさん:2006/11/13(月) 16:42:04
>>637
初版はたいした役に立たなかったんだけど、第二版はいいの?
639デフォルトの名無しさん:2006/11/13(月) 16:58:36
ニート歴3年のIT業界未経験だけど
Rubyをそれなりに究めれば採用されますか?
640デフォルトの名無しさん:2006/11/13(月) 17:07:52
Ruby云々はどうでもいいです
プログラミングの習得に挫折しない保証があるなら採ります

まあ偽装のロクな仕事じゃないけどな
641601: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の文字数は個別にカウントして
それ以外の文字をまとめてカウントできるとおもったのですが、どうも正規表現で指定するとうまくいきません。
というか、正規表現では無理かな。

どのように変更すれば指定した文字以外をまとめてカウントできるのでしょうか?
よろしくおねがいします。
642デフォルトの名無しさん:2006/11/13(月) 17:41:04
>>641
めんどくさがらないでcount["A"], count["Z"], count["G]以外
全部足せばいいんじゃね? とオモタ
643デフォルトの名無しさん:2006/11/13(月) 17:41:35
>>601
そろそろ何のためにそんなけったいなことをしてるのか教えてよ

「それ以外」の合計と「それ」の合計を求めて引けばいいだろう。
方法は好きにやれ。
644601:2006/11/13(月) 17:47:34
>>642
A-Z ひらがなとか漢字あわせるとかなり多いのですが・・・
これはプログラムとしては欠点な気がするのですが。

>>643
なんのためっていうか、ファイルからよく使う文字を集計してるのですよ。
特定の文字をメインに。
645デフォルトの名無しさん:2006/11/13(月) 17:59:05
プログラムに落とし込む思考力の問題だな
646642:2006/11/13(月) 17:59:17
>>644
…イテレータ使えば?
total = 0
count.each_value{|val| total += val }
とか。
それても気にしてるのは実行コスト?
647629:2006/11/13(月) 18:01:50
>>630-631 遅くなりましたが、ありがとうございました。
648デフォルトの名無しさん:2006/11/13(月) 18:05:28
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"
649デフォルトの名無しさん:2006/11/13(月) 18:21:11
jcode要らうかな。日本語あるなら。
650デフォルトの名無しさん:2006/11/13(月) 19:54:23
37/100 みたいにプログラム中で計算したのを表示してみたら0になってしまうのですが
Perlでは普通に%fやったらでたのですが
rubyで小数点いれるにはどうしたらよいのでしょうか?

"37/100".to_fやっても0.0となってしまいます

実際数字のところは、変数ですが
651デフォルトの名無しさん:2006/11/13(月) 19:57:29
>>650
数字を変数にしたらStringになってんじゃね?
652デフォルトの名無しさん:2006/11/13(月) 20:09:34
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 文じゃ
引数を指定しないとプログラムがおかしくなりますが、エラーはでないんですね

この場合の例外処理はどうすればよいのでしょうか?
656デフォルトの名無しさん:2006/11/13(月) 21:13:24
%x.yf
x : 全体桁
y : xのうちの少数桁
657デフォルトの名無しさん:2006/11/13(月) 21:15:16
> 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]

なんだこりゃ?
658デフォルトの名無しさん:2006/11/13(月) 21:17:07
>>655
この場合も何も、例外処理なんて begin rescueしかない。
while gets って、受け取った入力は何処に入れてるんだ?
659デフォルトの名無しさん:2006/11/13(月) 21:23:58
>>658
受け取った入力は、変数にいれてます
begin
while line = gets
.
.
.
rescue
puts ほにゃらら
end

みたいにやっても、引数なしで実行すると
改行された画面みたいにしかならなくてエラー名も何もでないのですが・・
660デフォルトの名無しさん:2006/11/13(月) 21:24:29
>>658
$_
661デフォルトの名無しさん:2006/11/13(月) 21:26:57
>>656-657
ありがとうございます。助かりました。
ついでにもうひとつとねがいしたいのですが、
printf("%3.1f",hensu,"\n")
34.1% みたいにしたいのですが、%はどこにいれればよいのでしょうか?
fのあとにスペースしていれたり、\をつけて文字としてあつかうようにしてみたのですが
無理でした。
662デフォルトの名無しさん:2006/11/13(月) 21:28:17
>>661
マニュアルくらい読め
その調子だとこの先もわからないことがあったら全部人に聞くだろ
663デフォルトの名無しさん:2006/11/13(月) 21:29:32
>>659

if ARGV.empty?
$stderr.puts "Error"
exit 1
end

while ...
664デフォルトの名無しさん:2006/11/13(月) 21:29:57
組み込み関数 gets のマニュアル見るとわかるんだが、
ただの gets は Perl のダイヤモンド演算子のように振舞う。
つまり、引数がないときは標準入力の内容を読む。

引数の有無で例外処理をさせたい場合には使用してはいけない。
665デフォルトの名無しさん:2006/11/13(月) 21:30:49
>>662
一応、rubyリファレンスマニュアルに目をとおしてるのですがよくわからなかったので・・・
何か例文集の本とか買ったほうがいいのかな
666デフォルトの名無しさん:2006/11/13(月) 21:33:04
667デフォルトの名無しさん:2006/11/13(月) 21:34:17
オンラインマニュアルのprintfの項には
> 引数の扱いの詳細については sprintfフォーマット を参照してください。
ときちんと誘導されてると思うんだが
668デフォルトの名無しさん:2006/11/13(月) 21:37:01
>>667
「引数の扱いの詳細」という日本語が、
初心者にとって良くないのかも。
669デフォルトの名無しさん:2006/11/13(月) 21:37:27
>>667
すみません。このx.y のようにするとは思わなかったので・・・
今再度確認したらやはりちょっとわかりにくいですね。

>>663
なぜ exit 1 なのでしょうか?
デフォルトでは0が終了ステータスと書いていましたが、
1というのはエラーで終了したということでしょうか?
670デフォルトの名無しさん:2006/11/13(月) 21:37:51
まあ、あのマニュアルはマニュアル慣れした人向けであることは常々感じてるんだが
ふつーの人はアレ読めないって
671デフォルトの名無しさん:2006/11/13(月) 21:43:30
>>670
というか、肝心なとこに限ってえっらいわかりにくいんだよな
どっか別の場所で知識つけてきて初めて高速に読み飛ばせるハイパーなマニュアル

>>669
終了ステータスの勉強するといい
Rubyどうこうではなく、コマンドの正常終了時は0で、異常終了時は0以外だ(時々守られてないが)
自分ひとりで使うぶんにはまったく気にしなくてもいいが、癖をつけておくと良
672デフォルトの名無しさん:2006/11/13(月) 21:46:28
>>671
ありがとうございました。
デフォルトが0なのは、正常終了したプログラムを別のプログラムに渡すためなのでしょうね。
1つの簡単なプログラムだと別にexitは指定しなくていいっぽいですね。
Cをちょっとかじったときは、EXIT_SUCCESS とか常につけるようにしていましたが。
673661:2006/11/13(月) 21:47:46
すみません、
printf("%3.1f",hensu,"\n") の"%3.1f"の中に文字としての%をつけくわえるのは
可能なのでしょうか?
sprintfマニュアルみてもそれっぽいのがなんかなかったのですが・・・
674デフォルトの名無しさん:2006/11/13(月) 21:49:44
675661: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

というようにわけずにかきたいのですが・・・
678デフォルトの名無しさん:2006/11/13(月) 23:33:07
それ以前に君はこのプログラムがどういう動作をしているのか理解できているのか
自分にとって理解しやすいように書くという気はないんか
679デフォルトの名無しさん:2006/11/14(火) 00:05:38
ブロックつきeachにブロックつきeachがくっついてる時点で俺は解読に自信がない
680デフォルトの名無しさん:2006/11/14(火) 00:32:39
>>679
printのところとったら動きましたよ
ただ改行がなかっただけで正確でした
681デフォルトの名無しさん:2006/11/14(火) 00:56:12
そのprint("\n")は何に対して呼び出してるつもりなんだ。
682デフォルトの名無しさん:2006/11/14(火) 00:58:09
>>681
プッ
初心者はこれだからwwww
その前の

each{|key,value|
print "#{key}:\t"
}

というブロックに決まってるじゃないか
683デフォルトの名無しさん:2006/11/14(火) 01:03:59
>>682
どんな動作になるかよくわからんな(w

というかここの部分でエラーとかは出んのか…?

irb> {'key'=>'value'}.each{|k,v| print k,v}.print "\n"
keyvalueNoMethodError: private method `print' called for {"key"=>"value"}:Hash

…。どうやって動いたんだ…?
684デフォルトの名無しさん:2006/11/14(火) 01:17:04
LinuxのWebサーバ上に載せるスクリプトで Win32APIって使えますか?
クライアント側はWindowsであることを想定してます。

Web上で入力したデータを Excel フォーマットに整形して取得したいのですが、、、
685デフォルトの名無しさん:2006/11/14(火) 02:05:39
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ってなってます。
バージョンに寄らずに一定のライブラリが入ってるみたいですけど、
よく分かりません。
687677: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:


このようなエラーになってしまいます。
どうすれば改行をいれられるのでしょうか?
688デフォルトの名無しさん:2006/11/14(火) 09:22:25
Hashのselfが返ってくるのでそこからprintは呼び出せないのでは…?
分けて書くのが見易いし良いと思うけど。
count.each{|k| print("#{k}:\t")}
printf "\n"
count.each{|v| print("#{v}:\t")}
689デフォルトの名無しさん:2006/11/14(火) 09:31:36
こうだったか。
count.each_key{|k| print("#{k}:\t")}
print("\n")
count.each_value{|v| print("#{v}:\t")}

というより、これに何の意味があるの?
count.each{|k,v| … }.each{|v| … }
690677:2006/11/14(火) 09:41:41
>>689
ありがとうございます。
1行でかきたかったんですね。あと、できるのかというのも含めて。

思ってたのですが、#{k} こういうかっこでかこうのって面倒ですよね
なんか意外なんですが
691デフォルトの名無しさん:2006/11/14(火) 09:47:21
日記は別のところで書け。
692デフォルトの名無しさん:2006/11/14(火) 10:33:26
Rubyの質問かどうか分かりませんが・・・

大量のテキスト処理をするスクリプトにwxRubyでGUIをつけたところ、
終了までに物凄く時間がかかるようになってしまいました。(環境は
Winです)ところが、ウィンドウの上でマウスホイールをクルクルやると、
なぜか、時間がかなり短縮されます。

印刷のときにもこれをやると効くらしいのでWindowsの仕様なの
かもしれませんが、スクリプトの側でコントロールするとかって、
できないものでしょうか?
693デフォルトの名無しさん:2006/11/14(火) 11:18:52
ファイルの中から、何文字目から何文字目までを抽出するにはなんの関数をつかったらよいのでしょうか?
Cではsizeofを使っていたのですが。

何文字目からですか?
10000
何文字目までですか?
430000

みたいに段階をおっていきたいのですが
694692:2006/11/14(火) 11:20:30
「マウスホイールで印刷が早くなる?」
http://d.hatena.ne.jp/softether/20060505
695693:2006/11/14(火) 12:24:34
分かりやいうと

!title
私の数字は3です。
これからもよろしくお願いします。
また後で。

みたいなファイルがあったとして、この中の、!行は無視して
11文字めの「れ」から28文字目の「後」までの文字を抽出したい場合、
どうすればよいのでしょうか?
このように文字数が少ない場合だと、一度に全行を読み込んでも問題ないのでしょうが
行が多い場合だとやはり、全行読むのはやめたほうがよいですよね。
それも考えるとどう処理していけばいいのかがよくわからないです。
696デフォルトの名無しさん:2006/11/14(火) 13:07:27
こんな感じじゃね?

何文字目か記憶する変数をoffsetとして定義する(1で初期化)
それぞれの行をlineとして読み込む
    lineから改行文字を削除
    lineが!で始まっていたら次の行へ
    lineが何文字目から何文字目にあたるかoffsetから計算する
    20文字目から40文字目までなら最初から途中までが範囲内だから出力
    offsetにlineの文字数を足す

まあ、全行読み込めるならそのほうが楽だな。
697デフォルトの名無しさん:2006/11/14(火) 14:17:05
a = <STDIN>
b = <STDIN>

print "#{a}"
print "#{b}"

これじゃ、入力できないのですが何故なのでしょうか
698デフォルトの名無しさん:2006/11/14(火) 14:21:51
>>697
エラーは読め
英語だから読めないとかは無し
無理してでも読め


というかそれ以前の気もするが
どこか解説サイトあるいは入門書籍などを一通り読んで勉強してみることを強く推奨
699デフォルトの名無しさん:2006/11/14(火) 14:24:44
>>698
リファレンスと書籍よんだのですが、
C言語のscanfにあたるものがのってなかったのですが・・・

ARGVじゃちょっと違うし
700デフォルトの名無しさん:2006/11/14(火) 14:28:50
エラー読んでないと言われてる意味をわかってないみたいだな

./test.rb:1: syntax error
a=<STDIN>
  ^
./test.rb:2: syntax error

なぜRubyスクリプトでRubyの文法を無視するんだ?
701デフォルトの名無しさん:2006/11/14(火) 14:44:44
どこにSTDINの文法がかいてありますか?
書籍に書いてないし、リファレンスにもないので困っております
702デフォルトの名無しさん:2006/11/14(火) 14:47:52
<STDIN>

 < > ←これは何よ?
703デフォルトの名無しさん:2006/11/14(火) 14:54:06
ダイヤモンド演算子使いたいなら
periに池
704デフォルトの名無しさん:2006/11/14(火) 15:30:39
>>702
<>をつけないで最初やったら、エラーがでたので
つけてみたのですが、やはり無理でした
705デフォルトの名無しさん:2006/11/14(火) 15:41:15
2chのRubyユーザーコミュニティの真価が問われる瞬間がやってきたと感じる
706デフォルトの名無しさん:2006/11/14(火) 15:44:39
すみません、どうすればよいのでしょうか?
707デフォルトの名無しさん:2006/11/14(火) 15:59:50
1. 以下の文言を一日に3回唱える
 「RubyはPerlではない」

2. "ドットの前"のものがどんな種類のものなのか常に意識する

3. 『たのしいRuby』の第1部から第3部あたりを通して流し読みする

4. 単に「エラーが出ました」とか他人にとって意味不明なことを口にしない

5. $stdin.gets と書く
708デフォルトの名無しさん:2006/11/14(火) 16:09:49
学んだ上での間違いと何も知らない状態の間違いってけっこう見分けつくしな
明らかに後者だ

何も知らない者は自分で何かを作ることができないし
何も知らない者が一文字書く度に聞きなおすのに付き合うほどこのスレは暇じゃない
709デフォルトの名無しさん:2006/11/14(火) 16:18:20
scanf rubyでググったり、マニュアルを検索すると、いとも容易く見つかるscanf.rb
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=scanf;em=scanf
710デフォルトの名無しさん:2006/11/14(火) 16:33:22
>>707
はい心がけます。
しかし、この本、stdin.getsという言葉は1回もでてこなかったのですが・・・
711デフォルトの名無しさん:2006/11/14(火) 16:42:02
>>710
だから何?
標準入力として$stdinは紹介されてるし、それがIOオブジェクトに属することもきちんと書いてある。
IOオブジェクトioから1行読み込むio.getsも解説があるだろ。

それでわからないならプログラミングにそもそも向かないからすっぱり諦めろ。
プログラミングに向かない人は一定数いるし、それは知能が低いことや人間としての欠陥を全く意味しない。
気にせず諦めろ。
712デフォルトの名無しさん:2006/11/14(火) 17:06:08
向いてないけどやりたいってのは止められんよ。
本人じゃないからどう考えてるか知らんが。

PerlにあるならRubyにも同じものがあるもんだっつー思いこみを捨てるとか、資料は読むだけじゃなくて意味を勉強しろとかは言いたい。
まあPerlで幸せなら無理してRubyを使う必要はないとも言えるが。
713デフォルトの名無しさん:2006/11/14(火) 17:22:06
>>712
711じゃないけど、「やりたい気持ちを止められない」ってのも大切な要素だよね。
本当に好きなら、多少頭が悪かろうが、効率悪いコードしか書けまいが
諦めずに続ける事が出来るもんね。

printf("Hello, World!\n");

初めてプログラム書いて、これ実行して何も感じないなら「向いてない」って事かもしれないね。
714デフォルトの名無しさん:2006/11/14(火) 17:41:52
while line = gets
line.chomp!
str = ""
str << line
end

print "#{str}"


これのどこが間違っていますか?
プログラム実行してもエラーが出ません。引数にファイルを指定しています。

あめんぼあかいな
あいうえお
きたちょうせん

みたいな中身ですが、それぞれの文字を結合できないのでうが・・・
715デフォルトの名無しさん:2006/11/14(火) 17:53:53
だから単体のgetsは区別めんどくさいから勉強中は使うなと

>>714
「変数のスコープ」について調べるといい
716デフォルトの名無しさん:2006/11/14(火) 18:09:23
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はスコープを作らないんで、一般的なスコープの問題ではないんだけど、やっぱスコープだ。
717デフォルトの名無しさん:2006/11/14(火) 18:43:29
こういうのも「スコープの問題」って言えるのか・・・
718デフォルトの名無しさん:2006/11/14(火) 18:49:01
スコープ…が上書きされ…スコープが不適切…かなあ
まあ、繰り返しの途中から始まってるのが問題だからスコープ…かなあ

「繰り返しの途中で毎回空文字列がセットされてるのが原因だぴょん」でよくね?という気はする
719デフォルトの名無しさん:2006/11/14(火) 18:56:00
>>718
いや、空文字列が一番の原因じゃないぜ
720デフォルトの名無しさん:2006/11/14(火) 19:10:09
同じスコープ内で起こっているのだから、スコープの問題ではない。
str への空文字列の代入を最初に1回だけ行えばよい。
721デフォルトの名無しさん:2006/11/14(火) 19:11:07
こういうのって合ってるんだからエラーがでないんだよな
初心者には意外な落とし穴なのかね
722デフォルトの名無しさん:2006/11/14(火) 19:26:56
str='' if str == nil
でも用が足りるわけだからね
別に str='' をwhileの「前」に出す必要はない

ブロックとスコープうんたらの問題と同じような解決法で
わかりやすく問題が解消されるのは事実だけど
723デフォルトの名無しさん:2006/11/14(火) 19:37:25
str = STDIN.read.gsub(/\n/m, "")
でどうだ!
724デフォルトの名無しさん:2006/11/14(火) 19:39:09
>>722
str ||= ''

# 流れを読まずに書いてみる
725デフォルトの名無しさん:2006/11/14(火) 19:44:05
>>724
その手の演算子嫌いなんだよね
読み下しにくいっていうか絶対半年後とかに書き間違う
726デフォルトの名無しさん:2006/11/14(火) 19:55:56
>>722 も修飾子じゃなければエラーになるし、
あまり初心者に勧められる方法じゃないと思うが。
727デフォルトの名無しさん:2006/11/14(火) 20:01:24
「ループの後でも使いたい変数はループの前にあらかじめ定義しておこうね!」
という啓蒙活動でよろしか

str = ""

while line = gets
line.chomp!
str << line
end

print "#{str}"
728デフォルトの名無しさん:2006/11/14(火) 20:36:30
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
730デフォルトの名無しさん:2006/11/14(火) 21:06:11
str = s[start..stop]
731デフォルトの名無しさん:2006/11/14(火) 22:41:59
Rubyのブロック構文は,関数ポインタやデリゲートやラムダ式・高階関数を学んでからでないと理解が難しい気がする。
732デフォルトの名無しさん:2006/11/14(火) 23:20:50
array#push と array<<ってどっちが早いですか?
733デフォルトの名無しさん:2006/11/14(火) 23:23:34
>>732
require "benchmark"
734デフォルトの名無しさん:2006/11/14(火) 23:26:15
自力で確かめるのはいいことだ

>>731
ぶっちゃけどれも全く知らないがブロック構文は1週間も使ってれば覚えたぞ
735デフォルトの名無しさん:2006/11/14(火) 23:27:42
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 が
737デフォルトの名無しさん:2006/11/15(水) 00:12:36
>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#<<の方が少し効率が良さそうなもんだ

か?
738デフォルトの名無しさん:2006/11/15(水) 00:23:21
>>729
分かりやすいほうを選ぼう。
速度やメモリ使用量は困ってから考えればいい。
739デフォルトの名無しさん:2006/11/15(水) 08:45:32
Ruby/Tkってどうやって勉強すればよいのでしょうか?
本がでてないと思うのですが
740デフォルトの名無しさん:2006/11/15(水) 08:47:26
あんなもん使うな
GUIが欲しければ他の言語使え
741デフォルトの名無しさん:2006/11/15(水) 08:52:33
一般論として << を使ったほうが早い

文字列連結も
str = str + 'hoge'
よりも
str << 'hoge'
のほうが早いしメモリも使わずに済む

ただ、<< は若干わかりにくいし
一般用途上は誤差レベルなので好きにやっていい
コンマ1秒の差が生死を分けるとかそういうチューニングが必要な人向け
742デフォルトの名無しさん:2006/11/15(水) 09:50:18
文字列(string)をファイルに書き込むにはどうしたらよいのでしょうか?

io = File.open(out, "w")
io.string ?
743デフォルトの名無しさん:2006/11/15(水) 09:53:11
File.open(out, "w"){|io| io.write string}
744デフォルトの名無しさん:2006/11/15(水) 10:01:09
>>742
FileクラスとIOクラスの関係は序盤の山場だ
何も考えずにドットでくっつけるだけで書いてると、ここで必ず手が止まる

ここがきちんと理解できれば他の場面でも応用が利く
(というか、よく知らないクラスでも普通に利用できるようになる)
頑張って踏ん張れ
745デフォルトの名無しさん:2006/11/15(水) 10:11:52
>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とすると入出力のために開いていたもの全てを閉じるという意味なのでしょうか
747デフォルトの名無しさん:2006/11/15(水) 10:26:12
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ってどうなってますか??
749デフォルトの名無しさん:2006/11/15(水) 10:58:47
GCがcloseするけど、

File を open したままにしておくようなコーディングは、C言語レベルでの誤動作
の原因となるため、あまり好ましくありません。きちんと明示的に close すること
が大切です。

だそうである。
750デフォルトの名無しさん:2006/11/15(水) 11:04:47
>>749
やっぱ、なるべく
File.open('file', 'r'){|f| s = f.read }
みたいに書いた方がいいみたいですね。

今まで散々ガベージコレクトがあると思って
File.open('file', 'w').write(s)
とか書きまくってたけど…
まぁこれも一応「重大な問題」は無いんですよね?
751デフォルトの名無しさん:2006/11/15(水) 11:49:01
>>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の際の指定の仕方がおかしいのでしょうか。
753デフォルトの名無しさん:2006/11/15(水) 12:43:47
>>752
つまり、outがファイル名ってこと?
ならp outしてみてくれ。
改行がくっついてるかもしれん。
754デフォルトの名無しさん:2006/11/15(水) 12:55:45
>>752
コードの意図を説明しろ。
実行したコマンドはコピペしろ。中途半端に説明しようとするな。
実行結果はpで出力したものをコピペしろ。中途半端に説明しようとするな。
755' ’:2006/11/15(水) 13:10:02
>>753
outは、stdinで入力したファイル名が格納されるやつです。
p outをしたところ改行がついていました。

out = $stdin.gets.chomp! とした所
?がなしのファイル名になって、正常になりました。
標準入力の度に、文字列扱ってファイル名などに使うときはchomp!としないといけないのでしょうか?
少し面倒な気がするのですが。デフォルトで改行なしのほうがよさげな気がするのですが。
756デフォルトの名無しさん:2006/11/15(水) 13:12:25
>>751
なるほど、そういう内部事情もあるんですか。

処理系の実装とかの問題はよく分からないんですが
Rubyの内部実装の出来ってどんな感じなんでしょうかね??
例えばまだまだ改良の余地、大幅な速度向上とか可能なんでしょうか?
他のスクリプト言語に比べて文法が複雑だし、インタプリタという事もあり
解析→処理の部分でコストが掛かってスピードアップって難しいと思ってたんですが。
バイトコードで処理出来ればかなりアップしますかね?
開発者の人達には頑張ってもらいたいですね。
757デフォルトの名無しさん:2006/11/15(水) 13:18:31
これ以上やる気ならコテハンにしてID付けろ。
ウザイ。
758デフォルトの名無しさん:2006/11/15(水) 13:21:18
> ID付けろ。
無茶ゆーなw
759デフォルトの名無しさん:2006/11/15(水) 13:29:35
>>755
getsで受け取ってファイルオープンする場合は
改行を取らないとエラーになるよ。
fn = gets.chop
File.open(fn, 'w'){|f| f.write(fn) }
print fn
760デフォルトの名無しさん:2006/11/15(水) 13:33:32
というか、マニュアル読めと
小難しい表現になってるところも多いが、難しくない書き方しているところも多い
761デフォルトの名無しさん:2006/11/15(水) 13:51:25
いや、小難しい書き方の部類だと思うぞ。
普段の非コンピュータ感覚との乖離というか。

------------
ねこだいすき
ねこねこだいすき
ごろにゃん
------------

という3行の文章があったとして、これを
str = io.gets
するとだな、
> 一行読み込んで、読み込みに成功した時にはその文字列を返します。
というマニュアルの表現を素直に解釈すると、最初の str は、
「ねこだいすき」
になるはずだと思うだろ。でも実際は
「ねこだいすき\n」
だ。
文章ならまだしも

puts "ファイル名を入力してください"
filename=$stdin.gets

とかいうプログラム書いた場合、
filenameには改行がくっついてるというのは予想の範囲外だと思う。
762デフォルトの名無しさん:2006/11/15(水) 13:52:16
>>759
了解しました。ありがとうございました。

$stdin.gets で
数字以外や、英数字以外など 決まった文字以外の入力じゃないとエラーにしたい場合は
正規表現とifの組み合わせで指定するしかないのでしょうか?
それともクラス指定をするのでしょうか?
763デフォルトの名無しさん:2006/11/15(水) 13:58:21
学校のテストみたいに1通りの100パーセントの正解があると思ってる?
764デフォルトの名無しさん:2006/11/15(水) 14:00:40
>>763
誤りを犯すと粛清されるんだよ(w
765デフォルトの名無しさん:2006/11/15(水) 14:22:21
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 より後のところを消しても一緒でした。
どこが間違っているのでしょうか?

出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら
その時点でエラーを出したいと思っています。
766デフォルトの名無しさん:2006/11/15(水) 14:24:51
> rescue Errno... の resuce より後のところを消しても一緒でした。
言動で同一人物だと知れる稀有な例
なんでプログラミングに際して非論理的に行動するのかさっぱりわからない
767デフォルトの名無しさん:2006/11/15(水) 14:31:28
本みたら、そうしろって書いてたもので・・・
文法にはあってるはずだと思うんですが
768デフォルトの名無しさん:2006/11/15(水) 15:08:04
30行ほど説明のレス書いたがアホらしくなって消した。
わかりもしないものをめちゃくちゃに適用しておいて文句言うな。

何を言って無駄だと判断。とりあえず書名晒せ。
769デフォルトの名無しさん:2006/11/15(水) 15:23:18
rescueのとこがwhileのループ壊してるな
begin〜rescue〜endは、beginとrescueの間で起きた例外ならどこで起きたものでも補足する
落ち着いて範囲を広く取るといい

というか、begin〜rescue〜endは別に特別でもなんでもない存在だから、
普通に文法に沿って書かないと駄目だぞ
770デフォルトの名無しさん:2006/11/15(水) 15:28:47
「例外を起こさない部分がいくら含まれていても構わない」と言うほうが親切だと思った
ぶっちゃけスクリプトの最初から最後までを囲っていても問題ないわけで
771デフォルトの名無しさん:2006/11/15(水) 15:43:35
>>758
あ、ごめんトリップだ。
1年以上存在を忘れていた。

というわけで心当たりがある奴は名前とトリップを付けること。
772デフォルトの名無しさん:2006/11/15(水) 16:01:23
>>769
どうやら、while-end でひとつの処理のようでした。
でも、出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら
その時点でエラーを出したいと思っています。 ってのは例外処理じゃ無理そうですね。
773772:2006/11/15(水) 16:18:06
open(ARGV[0])を使うことでなんとか解決しました。
774デフォルトの名無しさん:2006/11/15(水) 16:51:22
標準入力から入力された文字で、何も入力されなかった場合と空白から始まる場合と空白を含む入力
の場合はエラーを表示したいのですが、空白を含む場合の指定の仕方がわからないのですが
どのようにすればよいのでしょうか?

out = $stdin.gets.chomp!
if /^ / =~ out || out.size == 0
print("エラー")
exit 1
end
775デフォルトの名無しさん:2006/11/15(水) 17:15:18
ここはお前の日記帳じゃない
776デフォルトの名無しさん:2006/11/15(水) 17:15:53
>774
何も入力されない
/^$/

空白で始まる
/^ /

空白を含む
/ /
777デフォルトの名無しさん:2006/11/15(水) 17:29:45
>>775
同じ奴だよな
これからもエラーが出るたびこのスレに書き込むのだろう
778デフォルトの名無しさん:2006/11/15(水) 17:48:23
これじゃ人にプログラム作ってもらってるのと変わらないぞw
丸投げしたいのなら、宿題スレにでも行ったらどうだ?
779デフォルトの名無しさん:2006/11/15(水) 17:55:50
こいつの場合、むしろ丸投げじゃないのが性質が悪い、と思う。
780デフォルトの名無しさん:2006/11/15(水) 19:54:57
>>774
何でもいいからさっさと名前を付けろ。
そうすりゃ俺はお前をあぼーん出来る。
781デフォルトの名無しさん:2006/11/15(水) 21:08:12
>>750
> File.open('file', 'r'){|f| s = f.read }
> みたいに書いた方がいいみたいですね。

それは File.read('file') で問題ない。

> まぁこれも一応「重大な問題」は無いんですよね?

バッファリングについて理解していて、その上で問題はないといい切れる状況
なら重大な問題はない。

>>751
> ジェネリックなGCにするとかいう話も出てるけど。

GenerationalとGenericで辞書引いてみろ。

>>761
> puts "ファイル名を入力してください"
> filename=$stdin.gets

Readline使え。
782751:2006/11/15(水) 21:41:17
素で間違えた。指摘d
783デフォルトの名無しさん:2006/11/15(水) 22:00:56
Rubyってなんのためにあるんですか?
どういう人が使ってるんですか?
784デフォルトの名無しさん:2006/11/15(水) 22:04:23
趣味でプログラミングをする人のため
785デフォルトの名無しさん:2006/11/15(水) 22:09:24
タイトでない業務を自作の気楽なスクリプトでガンガンこなしたいという人のため
786デフォルトの名無しさん:2006/11/15(水) 22:10:14
>>785
覚えて金になるんですか?
787デフォルトの名無しさん:2006/11/15(水) 22:39:07
>>786
なるといえばなる。
ならないといえばならない。
788デフォルトの名無しさん:2006/11/15(水) 22:40:26
>>787
Rubyだけマスターすれば
年収450万はいきますか?
789デフォルトの名無しさん:2006/11/15(水) 22:46:33
途中経過はどうでもよくてアウトプットの中身だけが必要な(個人の)業務に使う
いわゆる書き捨てスクリプトを作るのに使う


途中経過の存在や内容や難易度が重要な仕事には使えない
スクリプトの保守要員が別途必要とか、そういう仕事
790デフォルトの名無しさん:2006/11/15(水) 22:53:52
>>789
では、Rubyを覚えれば他の別のプログラムが覚えやすいとかありますか?
RubyのGUIなんてできてもまったく需要ありませんか?

791デフォルトの名無しさん:2006/11/15(水) 22:56:15
Rubyってホントにツールだよな
使えると事務仕事でもプログラマ仕事でも効率が上がる

まあ、この「使える」は習得と使用許可の両方の意味があるが…
Rubyスクリプトの作成と実行の許されない職場では完全無意味
自宅でいろんなプログラム作って二へ二へするくらいしか使いでがない

>>790
Rubyに見返りを求めるな
プログラミングの仕事が欲しいならJavaでもやれ
792デフォルトの名無しさん:2006/11/15(水) 23:01:22
>>791
PerlのほうがCGIとかできるから
まだ役に立ちそうな気がするんですが
793デフォルトの名無しさん:2006/11/15(水) 23:03:24
板違い
プログラマー板へどうぞ
794デフォルトの名無しさん:2006/11/15(水) 23:08:53
板違いも糞もあったもんじゃねーな
795デフォルトの名無しさん:2006/11/15(水) 23:20:36
気違いだからな
796デフォルトの名無しさん:2006/11/15(水) 23:25:24
>>792
釣りならよそでやってくれ。
797デフォルトの名無しさん:2006/11/15(水) 23:30:21
>>792
HSPでもCGIとか出来るからそっちに行っていいよ。
798デフォルトの名無しさん:2006/11/16(木) 00:18:29
>>796
板違い
799デフォルトの名無しさん:2006/11/16(木) 00:43:23
Rubyは糞でFA
800デフォルトの名無しさん:2006/11/16(木) 00:57:57
結局辿り着くのはPython
801デフォルトの名無しさん:2006/11/16(木) 10:11:32
本スレみたいな流れにワロタ
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']
803802:2006/11/16(木) 13:10:49
ローカル:ver1.8.5
サーバー:ver1.8.4
です。
804デフォルトの名無しさん:2006/11/16(木) 13:12:20
>>791
超同意
よくできたツール
805デフォルトの名無しさん:2006/11/16(木) 13:39:46
よくenbugするからデバッグ要員の教育にはもってこい。一方安定性重視の玄人には
受けない面もあるかもね。
806デフォルトの名無しさん:2006/11/16(木) 13:49:07
>>805
でっかいの無理
適正規模だと嬉しい
just like anus
807デフォルトの名無しさん:2006/11/16(木) 15:50:18
gets で読み込んだ行を
タブでsplitするにはどうしたらよいのでしょうか?
3つから4つ目のカラムをついでにとります。
// の中に何がはいるのでしょうか?

line.split(//)[2..3]
808デフォルトの名無しさん:2006/11/16(木) 15:54:20
\t
809デフォルトの名無しさん:2006/11/16(木) 15:54:54
 ま た gets か

はいいとして、正規表現を基礎だけでいいんで勉強しろ
//の中に何が入るとかそういう理解はするな
810デフォルトの名無しさん:2006/11/16(木) 15:58:50
(σ・Д・)σ gets!!
811デフォルトの名無しさん:2006/11/16(木) 16:01:55
>>807
どれかを選択しなさい。
1.名前かトリップを付けて書き込む
2.宿題スレ(ttp://pc8.2ch.net/test/read.cgi/tech/1106572657/)に行く。
3.Rubyの勉強を諦める。
812デフォルトの名無しさん:2006/11/16(木) 16:14:12
>>811
名前決めました。デフォルトの名無しさん でいきます。
813デフォルトの名無しさん:2006/11/16(木) 16:35:02
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)に、アクセスできるようにしたいのです
814デフォルトの名無しさん:2006/11/16(木) 16:40:41
 ま た gets か
815デフォルトの名無しさん:2006/11/16(木) 16:42:55
エラーも書かないしな
816デフォルトの名無しさん:2006/11/16(木) 16:43:54
>>815
q.rb:6:in `[]=': can't convert String into Integer (TypeError)
from q.rb:6
817デフォルトの名無しさん:2006/11/16(木) 16:47:11
だからおとなしくPerlやC使って作ってろっての
なんでわざわざRubyでやるんだ
818デフォルトの名無しさん:2006/11/16(木) 16:48:47
そこにRubyがあるから
819802:2006/11/16(木) 16:54:21
俺のレスが流れた… 誰か…
820デフォルトの名無しさん:2006/11/16(木) 16:54:39
Perlの時代はもう終わったから。
821デフォルトの名無しさん:2006/11/16(木) 16:59:00
>>817
一連のスクリプトはRubyであることを頑なに拒否したスクリプトだよな
他の言語でやったほうがいいと思う
822デフォルトの名無しさん:2006/11/16(木) 16:59:17
>>802
第二引数ってHashじゃないの?
{"var" => value} とか。

関係ないけど、おれはnet/httpよりWebAgentの方が好き。
823デフォルトの名無しさん:2006/11/16(木) 17:07:43
>>822
手持ちのHTMLヘルプだと「headerはgetと同じです」とか言いながら
直後のサンプルコードでは思いっきりStringだぞ(w

# version 1.2
response = http.post( '/cgi-bin/search.rb', 'query=subject&target=ruby' )
824802:2006/11/16(木) 17:14:34
>>822
いやハッシュじゃないみたいです…
自分のPCでは問題なく処理出来るのですが、サーバーにアップすると値が渡ってません。
これの通りやったんですが…
http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fhttp
825813:2006/11/16(木) 17:56:33
お願いします
826813:2006/11/16(木) 18:17:16
頼みますorz
827デフォルトの名無しさん:2006/11/16(木) 18:43:47
>>824
で、そろそろ気づいた?
828813:2006/11/16(木) 18:45:30
>>827
まだわかりません
829デフォルトの名無しさん:2006/11/16(木) 18:49:41
>>828
お前には聞いてないと思うが。
830デフォルトの名無しさん:2006/11/16(木) 18:51:14
Ruby Home Pageがずっと
「ページを表示できません」なんですが
私だけでしょうか?
831デフォルトの名無しさん:2006/11/16(木) 18:53:48
>>827
これ、やっぱPHPのとこがレン鯖では正確に処理されてて

<? print $_POST['var'] ?>

なら動作するとかそんなよくあるオチだと思うよな
どんなふうに「できてない」のかの正確な情報が無かったから長期放置されてるが、
「"var=value"が渡っていない様です」の判断理由が「xxxx.phpの中身が素で表示されてるから」とかなら
ぶちゃけそんなとこではないかと
832デフォルトの名無しさん:2006/11/16(木) 18:56:00
>>831
Ruby関係ないじゃん…
833813:2006/11/16(木) 18:56:55
配列の行列でもできないのですか
834デフォルトの名無しさん:2006/11/16(木) 19:02:05
>>832
xxxx.phpをRubyスクリプトで書けば原因の切り分けができたんだろうけどな
PHPで書き続けたのがマズかったのかもしれない

いや、これが原因だと限ったもんでもないが(w

>>830
時々503になる
閲覧者が多くてコケてる模様
835813: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
>>834
そうなんですか、レスサンクス
837813: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] みたいにしたいけど
838デフォルトの名無しさん:2006/11/16(木) 20:37:59
>>837
それはRubyではできない。
839802: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']
?>
840デフォルトの名無しさん:2006/11/16(木) 20:49:28
>>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
841802:2006/11/16(木) 21:00:01
もう少し詳しく説明すると

既にサーバー上で問題なく動いているPHPスクリプトがあるんですが
そのスクリプトに839の形式でアクセスした場合も
ローカルでは問題なくPOSTメソッドの値が渡り
Rubyスクリプト自体をサーバーにアップして実行した場合に限りPOSTメソッドの値が渡らないんです…

例えば、ログインのパスワードをPOSTで渡したとしたら
ローカルからだとPOSTで渡したパスワードが正しく認識されログインページが表示されるんですが
サーバー上で実行すると、パスワードが渡っておらず、エラー表示されてしまいます…
Rubyのスクリプトはまったく同じ物を使用しているので、まず間違っている事は考えられません…
なぜでしょうね…
842デフォルトの名無しさん:2006/11/16(木) 21:52:40
>>838 >>840
永遠に付きまとうぞ
自重しろ
843デフォルトの名無しさん:2006/11/16(木) 22:02:02
>>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] みたいに
844デフォルトの名無しさん:2006/11/16(木) 22:12:21
>>843
試してから書けカス。
それと、そんなにperlが好きならperl使ってろ。
845デフォルトの名無しさん:2006/11/16(木) 22:19:33
>>844
いやためしましたよ。
846デフォルトの名無しさん:2006/11/16(木) 22:29:22
>>845
>843の最後の行のまま書いたのなら通るわけがないぞ、ボケ。
ホント、死ねばいいのに。
847デフォルトの名無しさん:2006/11/16(木) 22:38:13
>>845 エラーをちゃんと読もう。
848デフォルトの名無しさん:2006/11/16(木) 22:39:50
>>847
文法エラーだったんですが、この場合どうまとめればいいのか・・・
そもそもまとめられるのかが
849デフォルトの名無しさん:2006/11/16(木) 22:43:45
>>848
undefined local variable or method `str2' for main:Object

http://www.excite.co.jp/world/english/
850デフォルトの名無しさん:2006/11/16(木) 22:54:51
>>846
調べずにいきあたりばったりの想像で書いてるからな
Perl使ってろと言われるのもそのせいだ
851デフォルトの名無しさん:2006/11/16(木) 23:06:17
>>849
申し訳ない。
これは、ここに書き込むとき間違っただけでした。
[str][2] です。はい。
852デフォルトの名無しさん:2006/11/16(木) 23:07:14
>>850
むむ、でもこれだとさすがに書いてない・・・
853デフォルトの名無しさん:2006/11/16(木) 23:10:52
>>852
そうだよな。俺も思った
854デフォルトの名無しさん:2006/11/16(木) 23:15:46
つかいちいちPerlを書くのは何故だろうな

Rubyスクリプト書いてるんじゃないのかと
本読んでるとか調べてるとか嘘だろと
しかもPerlのとこでエラー出たら文句言うしやってられん
855デフォルトの名無しさん:2006/11/16(木) 23:22:26
もしかして、どこかのサイトとかに「Ruby は Perl の上位互換です」
とか書いてあるのか?
856デフォルトの名無しさん:2006/11/16(木) 23:25:49
そもそもこのRubyスレ初心者といいますか質問者もさっきの除けばいねーからな・・・
857802 == 839 == 841:2006/11/16(木) 23:35:58
また俺のレスが… 誰かお願い…
858デフォルトの名無しさん:2006/11/16(木) 23:41:03
いや、インクリメント演算子強行推進派のテロという可能性も
859デフォルトの名無しさん:2006/11/16(木) 23:54:31
スレタイにいれとけよ
Perl>>>Ruby とでも
860デフォルトの名無しさん:2006/11/17(金) 00:13:42
>>843
まじめにお願い。次書き込むときからは、名前欄にあなたの好きな名前を
入れて書き込んで下さい。
俺らだってあなたに答えてあげてるじゃん。
だから俺のお願いも聞いてよ。
ギブアンドテイクってやつだよ。
861843:2006/11/17(金) 00:27:18
>>843
いれてみました。お願いします。
862デフォルトの名無しさん:2006/11/17(金) 00:41:03
>>843
data[str][2], data[str][1] = line.split(/ /)[7..8]
863デフォルトの名無しさん:2006/11/17(金) 09:45:42
>>841
サーバ上でRubyスクリプトを実行って、どうやってるの?
シェルアカウントがあってそれで実行してるってこと?
864デフォルトの名無しさん:2006/11/17(金) 10:09:28
>863
最近はPerlだけでなく
Rubyの使えるサーバも増えて来たよ
865802 == 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
866デフォルトの名無しさん:2006/11/17(金) 10:58:32
>>864
いや、そんなことを聞いてるんじゃなくて、どうやってスクリプトを実行してるのか、
ということ。

>>865
CGIとして実行してるのね。そこが重要なポイントだった。
そのtest.cgi、全体をbegin〜endでくくって、rescueで例外を出力するようにしてみ?
867802 == 839 == 841:2006/11/17(金) 11:27:31
>>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
868デフォルトの名無しさん:2006/11/17(金) 11:37:12
getでやるとどうなんの
869802 == 839 == 841:2006/11/17(金) 11:47:43
ローカル、サーバーでの実行共、まったく問題なく値が渡りました。

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
870デフォルトの名無しさん:2006/11/17(金) 13:23:24
つーかまだ揉めてたのか

GETで試す必要はないと思うぞ。ブラウザURL直打ちでのアクセスはGETだから。
適当なFORMのあるHTMLファイルを作って、POSTでwww.xxx.comのxxxx.phpなりout.cgiなりを踏んでみ。
別サーバ(ローカル)と同一サーバ上(xxx.com)の2箇所からな。

あと、「varの中身だけ返す」とかわかりにくいCGIでデバッグ続けるのはやめたほうがいい。
ただの空白が帰ってきた場合、どこで失敗してんだかよくわからんから。
cgi.out{ "result: #{cgi['var']}" } とか、空であることがはっきり視認できるプログラムにしたほうがいい。
871802 == 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
872デフォルトの名無しさん:2006/11/17(金) 15:22:15
print "Content-type: text/plain\n\n"
print "**#{response.body}**"
でやって
873802 == 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: **
874デフォルトの名無しさん:2006/11/17(金) 16:46:06
ENV['QUERY_STRING'] も空なのかな。
875802 == 839 == 841:2006/11/17(金) 16:54:32
>>874
GETで渡せば "var=value" になりますが
POSTだとローカルでもサーバーでも空ですね。
876802 == 839 == 841:2006/11/17(金) 17:04:06
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でいけるようにと思うのですが
878デフォルトの名無しさん:2006/11/17(金) 19:33:08
またお前か
879デフォルトの名無しさん:2006/11/17(金) 19:43:57
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*
880デフォルトの名無しさん:2006/11/17(金) 20:07:21
>>879
??
881デフォルトの名無しさん:2006/11/17(金) 20:35:35
まったく問題ないが。
h = {'a'=>'Hello World!'}
k = 'a'
print h[k]
882デフォルトの名無しさん:2006/11/17(金) 21:57:51
あたり → >>879
はずれ →>>881
883デフォルトの名無しさん:2006/11/17(金) 22:00:07
だからどんな「本」を読んでるのか晒せって言われてるだろうに
884デフォルトの名無しさん:2006/11/18(土) 00:21:10
array#each がものすごく遅いような気がするんですが、
速度上げる方法ってありますか?
885デフォルトの名無しさん:2006/11/18(土) 00:25:31
普通はそんなに遅くならない
886デフォルトの名無しさん:2006/11/18(土) 00:26:12
>>884
Perl使えPerl
887デフォルトの名無しさん:2006/11/18(土) 00:45:59
>>886
perlはイヤです><
888デフォルトの名無しさん:2006/11/18(土) 00:59:40
FixNumの配列なら、NArrayを使う。
889884:2006/11/18(土) 01:54:43
>>888
ありがとうございます。
早速つかってみます。
890デフォルトの名無しさん:2006/11/18(土) 02:00:03
each は遅いから for を使えって話なかったっけか?
a.each { |i|
 hoge
}
の代わりに
for i in a do
 hoge
end
891デフォルトの名無しさん:2006/11/18(土) 02:01:51
>>890
単にforの方が速いって話はあったが、「for使え」までは言ってなかった気がする。
892デフォルトの名無しさん:2006/11/18(土) 02:12:44
eachの遅さが問題になるってどんなスクリプトだろう
893デフォルトの名無しさん:2006/11/18(土) 02:14:03
>>890
それで解消される「重さ」なんて微々たるもんだと思う
それ以外の構造的なナニカを正したほうが良さげだ

そもそも、「eachが遅い」などというのはよっぽどでないと断言できん
遅いのはたいがいeachの中や配列に問題ありだ
894デフォルトの名無しさん:2006/11/18(土) 02:23:38
Rubyは簡単な処理も遅くてびっくりするよ
895デフォルトの名無しさん:2006/11/18(土) 02:34:55
>>894
遅くて困るなら他の言語使えばいいじゃない。
遅いだけで困らないなら遅くても別にいいじゃない。
896デフォルトの名無しさん:2006/11/18(土) 02:35:38
拡張ライブラリ書いてるよ
897デフォルトの名無しさん:2006/11/18(土) 02:39:05
いや、Rubyが他の言語と比較して平均して遅いってのは構わないんだが、
普通使っててそんな遅くないはずの処理が名指しで遅いと言われるとちと困る
898デフォルトの名無しさん:2006/11/18(土) 02:43:10
最適化したら2割速くなったとか言ってるくらいだし相当無駄があるんじゃねーの?
899884: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が早くなればいいなと思って質問しました。
900デフォルトの名無しさん:2006/11/18(土) 03:00:44
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

こんな表示になるし。
901デフォルトの名無しさん:2006/11/18(土) 03:11:09
こういう時は Profile だな
902デフォルトの名無しさん:2006/11/18(土) 03:17:44
あ、リロード忘れておバカなレスをしちゃった。 OTL
903デフォルトの名無しさん:2006/11/18(土) 06:31:44
>>890
でもfor文はeachを使って実装されてるって聞いたことあるけど。
904デフォルトの名無しさん:2006/11/18(土) 09:58:52
>>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
905デフォルトの名無しさん:2006/11/18(土) 10:19:26
すいません。教えてください。
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がまずいらしいのですがどうしたら良いでしょうか。
906デフォルトの名無しさん:2006/11/18(土) 16:50:49
>>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版だからじゃね?
909デフォルトの名無しさん:2006/11/18(土) 21:19:43
まだないんじゃない? 次のRubyには何がつく予定なんだっけ?
910デフォルトの名無しさん:2006/11/18(土) 22:24:57
>>908
webrickのservlet
ドキュメント無いけどな。
911デフォルトの名無しさん:2006/11/19(日) 00:33:41
質問。Net::HTTPのgetの、
> ブロックとともに呼ばれた時はエンティティボディを少しづつブロックに与えます。
の「少しずつ」ってナンデスカ
912デフォルトの名無しさん:2006/11/19(日) 00:54:26
「少しずつ」なんてどこにも書かれてませんが何か

…仮にもマニュアルなんだから「少しずつ」と正しく書いて欲しいな

で、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 とかして時間の経過見てみたら
913デフォルトの名無しさん:2006/11/19(日) 01:04:00
1024バイトくらい
914デフォルトの名無しさん:2006/11/19(日) 01:16:08
>>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バイト分の処理が終わらないとサーバに続きを取りに行かないみたいだ
相手のサーバにとっては時間が余分にかかってちと迷惑な話かもしれん

でも一気に全部読み込むとこっちのメモリがーみたいな
915デフォルトの名無しさん:2006/11/19(日) 01:23:18
>>908
俺はシンプルかつ応用の利くcgi.rbが一番いいと思うよ
他のフレームワークは、設計に独自色が強く
使い方を理解するまでに苦労することが多々ある
916デフォルトの名無しさん:2006/11/19(日) 08:33:49
>>915
いやcgi.rbも結構クセ強いだろ。
917デフォルトの名無しさん:2006/11/19(日) 12:32:08
RoR → 鍋スープ大袋
cgi.rb → めんつゆ

塩  → net/http他

醤油に相当するものがない
918デフォルトの名無しさん:2006/11/19(日) 12:45:20
>>917 に座布団一枚あげて!
919デフォルトの名無しさん:2006/11/19(日) 15:27:51
require Yamada
920デフォルトの名無しさん:2006/11/19(日) 15:30:47
require zabuton
921デフォルトの名無しさん:2006/11/19(日) 15:44:47
>>919
Yamada.tainted? #=> true
>>920
zabuton.tainted? #=> true
922デフォルトの名無しさん:2006/11/19(日) 18:33:11
>>919-920
NameError: undefined local variable or method `Yamada' for main:Object
NameError: undefined local variable or method `zabuton' for main:Object

923デフォルトの名無しさん:2006/11/19(日) 20:45:22
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
925デフォルトの名無しさん:2006/11/19(日) 22:15:02
>924

data = ""
while gets
chomp!
data << $_
end

でもいいけど。
ただそこまでしてレシーバ書きたくねーもん?
926デフォルトの名無しさん:2006/11/19(日) 22:17:16
>>925
そっちのほうが軽いかと思って

でも、やっぱ data=""
これはいるんですね。
自動で判別してくれてもいい気がするけど・・・

ありがとうございます。
927デフォルトの名無しさん:2006/11/19(日) 22:39:42
>>924
$stdin.readlines.each{|x| x.chomp!}.join
928デフォルトの名無しさん:2006/11/19(日) 23:25:00
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文字目を抽出できるのですが。ハッシュだと
どうすればよいのかわからなくて困っております。
930デフォルトの名無しさん:2006/11/20(月) 00:03:02
>>929
この場合、Hashに格納されているStringの操作なんだから
ArrayもHashも変わらんよ。
931デフォルトの名無しさん:2006/11/20(月) 00:06:02
>>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

これだと思ったのですが、違うか・・・

933デフォルトの名無しさん:2006/11/20(月) 00:19:31
p h["abc"][2].chr
p h["abc"].split(//)[2]
934デフォルトの名無しさん:2006/11/20(月) 00:21:58
>>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"]
935デフォルトの名無しさん:2006/11/20(月) 00:23:26
>>926
お前もいい加減コテ付けてくれ。

「よく理解できるまでは無理して短く書くな」ってカーチャンに教わらなかったか?
936デフォルトの名無しさん:2006/11/20(月) 00:23:40
p h['abc'][-1, 1]
937デフォルトの名無しさん:2006/11/20(月) 00:24:59
しまった被ったか。
ついでに、コピペした後編集したもんだからirbの出力が変な事に。
938デフォルトの名無しさん:2006/11/20(月) 00:25:14
>>932
p 51.chr
"3"

文字列[n]は、nバイト目の文字の文字コード(文字そのものではない)を整数で返す
配列[n]はn番目の要素をそのまま返すが、文字列の場合は挙動がちょっと違う
939デフォルトの名無しさん:2006/11/20(月) 00:25:38
>>933-934
そうですね。.chrがいるのか。どうもすみません。ありがとうございました。
splitの方は、配列の文字列が多くなるとやはり処理に時間がかかりそうだから、chrのがよさげですね。
940デフォルトの名無しさん:2006/11/20(月) 00:28:04
>>926
>でも、やっぱ data=""
>これはいるんですね。

初期化無しでの使用を許してしまうと
スペルミスでバグを作り込んでしまう事が多くなる。
941デフォルトの名無しさん:2006/11/20(月) 00:29:01
>>926
それはスコープの問題。

>>927
そこはinjectがハマルはず。
$stdin.readlines.inject(''){|result, x| result << x.chomp!}
942デフォルトの名無しさん:2006/11/20(月) 00:46:22
inject厨キター


しかしinjectの導入はなかなか英断かもしれない
ここに適用できると思い至るまで時間かかるけどな
943デフォルトの名無しさん:2006/11/20(月) 00:49:01
>>941
injectに副作用な記述のブロックを付けるのは気持ち悪い。
injectがそういうもんだと初心者の誤解を招くからヤメレ。
944デフォルトの名無しさん:2006/11/20(月) 01:04:33
副作用的ってどう言うことだろう?
result << x.chomp! じゃなくて、result + x.chomp! と書けって言うこと?

あと細かいけど、x.chomp! じゃなくて x.chomp じゃないと
たまに nil が返るかもしれないので余りよくない。
945デフォルトの名無しさん:2006/11/20(月) 01:30:58
>>924
result = $stdin.read.split(/\n/).to_s
とか
result = $stdin.read.gsub(/\n/, "")
は?
946デフォルトの名無しさん:2006/11/20(月) 01:47:38
そんなに短くしても意味ないと思うんだが
$<.read.gsub($/){}
947デフォルトの名無しさん:2006/11/20(月) 01:49:58
そのうちread(result)だけで
改行削除までして結合してresultに全て読み込んでくれるんじゃね
948デフォルトの名無しさん:2006/11/20(月) 02:00:06
Ruby/Tkで、横にスクロールバーを付けたテキストウィジェットのテキスト表示部分に
下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、
自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?)
にはどうしたらいいですか教えて下さいお願いします。
949デフォルトの名無しさん:2006/11/20(月) 08:16:01
>>946
ゴルファーはゴルフやってろ
950デフォルトの名無しさん:2006/11/20(月) 11:33:09
Hash使うときは毎回
h = Hash.new
i = Hash.new
box = Hash.new

みたいに宣言が必要なのでしょうか?

いきなり
box["key"] = value
みたいにしてもハッシュにならないのですが、ちょっと面倒ですね。
951デフォルトの名無しさん:2006/11/20(月) 11:38:33
本買ってやるから住所と名前教えろ
952デフォルトの名無しさん:2006/11/20(月) 11:53:10
>>951
たのしいRubyという本をもっております。
953デフォルトの名無しさん:2006/11/20(月) 11:58:50
>>950
Perl使え
954デフォルトの名無しさん:2006/11/20(月) 12:17:10
>>950
Rubyは君の要求を満たさない
他の言語を使うべし
955デフォルトの名無しさん:2006/11/20(月) 12:56:35
>>950
つbox = { "key" => value }
956デフォルトの名無しさん:2006/11/20(月) 13:06:21
しょせんオナニー言語だから
細かいところで気が利かないんだよね
957デフォルトの名無しさん:2006/11/20(月) 13:21:28
Perlでいうと
for($i=0:$i<=100,$i=$i+5){}
をRubyでするにはどうしたらよいのでしょうか?
while文ではなくfor文でしたいのですが
958デフォルトの名無しさん:2006/11/20(月) 14:00:40
この場合、Rubyが細かいところに気がきかないというより、バカにつける薬はない、が正しい。
959デフォルトの名無しさん:2006/11/20(月) 14:13:43
a,b,c = split(/\t/)[1,3,8]

これで何故、3つとれないのでしょうか?
in `[]': wrong number of arguments (3 for 2) (ArgumentError)

こんなエラーがでます。
960デフォルトの名無しさん:2006/11/20(月) 14:24:38
>>957
Rubyでは普通は Range#step を使う
(0..100).step(5) {|i| puts i }

この場合は、Integer#step(limit, step) {|n| ... } も使えるけど。
961デフォルトの名無しさん:2006/11/20(月) 14:29:54
>>960
なるほどありがごうざいます。

その場合は、<= >= が有効なのかな。
> や < だと
100 の場合 100も含まれることになりますよね。
962デフォルトの名無しさん:2006/11/20(月) 14:35:16
Ruby/Tkで、横にスクロールバーを付けたテキストウィジェットのテキスト表示部分に
下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、
自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?)
にはどうしたらいいですか教えて下さいお願いします。
963デフォルトの名無しさん:2006/11/20(月) 14:52:22
>>958
> バカにつける薬はない
こういう言い訳ばっかりして一向に薬を出さない医者、みたいな言語だよねRubyって。
964デフォルトの名無しさん:2006/11/20(月) 15:08:09
Perlではこう書けるのにRubyで同じように書けない、を繰り返す奴には、Perl以外の薬はない。
965959:2006/11/20(月) 15:09:55
お願いしますm(__)m
966デフォルトの名無しさん:2006/11/20(月) 15:16:54
お願いですからマニュアルを読んでください
http://www.ruby-lang.org/ja/man/?cmd=view;name=Array
967959:2006/11/20(月) 15:29:12
>>966
splitがのってないのですが・・・
968デフォルトの名無しさん:2006/11/20(月) 15:32:52
見るのはsplitじゃなくて[]だろ
969デフォルトの名無しさん:2006/11/20(月) 15:36:15
>>964
簡潔さで勝負して欲しくないよね。負けるから。
970959:2006/11/20(月) 15:39:02
selfのとこみるんですよね?
のってなくないですか?
971デフォルトの名無しさん:2006/11/20(月) 15:44:18
のってたらエラーにならねーよ
972959:2006/11/20(月) 15:54:46
a,b,c = split(/\t/).values_at(1,3,8)
できたー
973959:2006/11/20(月) 15:55:55
>>972
それって面倒じゃないですか?
Perlだと[3,4,6] みたいにできるのですが・・・
974デフォルトの名無しさん:2006/11/20(月) 15:56:48
>>964
まったくだ
975デフォルトの名無しさん:2006/11/20(月) 16:03:39
>>969
本当に簡潔さで勝負するとどっちがより簡潔に書けるかは、Code Golfを見ればわかる。
今現在で17のchallangeがあって、1位がRubyなのが10個、1位がPerlなのが6個、1位がPythonなのが1個。
976959:2006/11/20(月) 16:07:03
すみません。何で
[1..6] みたいなはできるのに[1,3,4]とかはできるようにしなかったのでしょうか?
977デフォルトの名無しさん:2006/11/20(月) 16:08:06
Perlは簡潔っつーか、短いんだな

長いのがJava
978959:2006/11/20(月) 16:08:49
class Array; def [](*args) values_at(*args) end end
a,b,c = split(/\t/)[1,3,8]
できたー
979デフォルトの名無しさん:2006/11/20(月) 16:10:57
暗号→sed
短い→Perl
普通→Ruby、Python
長い→Java
長ったらしい→PHP

つーか関数名やメソッド名の話じゃねーのか
980デフォルトの名無しさん:2006/11/20(月) 16:12:00
>>976
Array#[start, length] というのがあるし今さらそういうふうにはできんなぁ。

>>961
Rangeリテラルは、終端を含む場合は、start..end で、含まない場合は start...end になる。
プロポーショナルフォントだと分かりづらいけど、ドットの個数が違う。
981デフォルトの名無しさん:2006/11/20(月) 16:19:20
>>959
Rubyにarray[i,j,k]というような記法はないので

array = [1, 2, 3, 4, 5]
a, b, c = array[0,1,3]

と書くとエラーになる
なぜArgumentErrorなのかは自分で考えてくれ
982961:2006/11/20(月) 16:19:20
>>980
細かい使い分けが必要なんですね。
でもstepだと100から0 に5ずつ下がるのができないのですが
100..0 が使えないのは何故なのでしょうか?使えるようにしたほうが便利な気がするのですが
983976:2006/11/20(月) 16:21:07
>>980
, , と2個ある場合にそう認識するようにすればいいのでは?
984デフォルトの名無しさん:2006/11/20(月) 16:23:28
話し掛けてる奴はなんなんだ
スレ壊したいのか
985デフォルトの名無しさん:2006/11/20(月) 16:24:27
100.step(0, -5) {|n| p n}
986デフォルトの名無しさん:2006/11/20(月) 17:46:15
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が返ってくるとはずなのですが、かえってきません。


987デフォルトの名無しさん:2006/11/20(月) 17:56:16
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"]
988962:2006/11/20(月) 18:58:33
誰か分かる人いませんか?ネットで調べても分かんないす
989デフォルトの名無しさん:2006/11/20(月) 19:32:19
Tkのスレで聞け
990デフォルトの名無しさん:2006/11/21(火) 02:00:59
s = ((s == nil) ? ('') : (s))

「s」がnilの場合は空文字で初期化して
その他の場合は変更ナシとしたいのですが
上のコードより綺麗に書けますか?
991デフォルトの名無しさん:2006/11/21(火) 02:18:38
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
994デフォルトの名無しさん:2006/11/21(火) 03:50:30
>>990
c ||= ゙゙

>>992
s = c || ゙゙
995デフォルトの名無しさん:2006/11/21(火) 04:36:18
>>994
そっかー どうも!
996デフォルトの名無しさん:2006/11/21(火) 07:53:30
right
997デフォルトの名無しさん:2006/11/21(火) 08:43:15
.
998デフォルトの名無しさん:2006/11/21(火) 08:43:46
..
999デフォルトの名無しさん:2006/11/21(火) 08:45:42
   
1000デフォルトの名無しさん:2006/11/21(火) 08:46:06
Ruby初學者スレッド Part 9
http://pc8.2ch.net/test/read.cgi/tech/1164065622/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。