Ruby初心者スレッドPart8
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/09/28(木) 15:28:59関連スレや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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
0002デフォルトの名無しさん
2006/09/28(木) 15:31:54Rubyについて 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/
0003デフォルトの名無しさん
2006/09/28(木) 15:33:11Ruby初心者スレッドPart7
http://pc8.2ch.net/test/read.cgi/tech/1154077799/
http://makimo.to/2ch/pc8_tech/1154/1154077799.html
Ruby初心者スレッドPart6
http://pc8.2ch.net/test/read.cgi/tech/1147918197/
http://makimo.to/2ch/pc8_tech/1147/1147918197.html
Ruby初心者スレッドPart5
http://pc8.2ch.net/test/read.cgi/tech/1143403165/
http://makimo.to/2ch/pc8_tech/1143/1143403165.html
Ruby初心者スレッドPart4
http://pc8.2ch.net/test/read.cgi/tech/1137927749/
http://makimo.to/2ch/pc8_tech/1137/1137927749.html
Ruby初心者質問スレPart3
http://pc8.2ch.net/test/read.cgi/tech/1125587131/
http://makimo.to/2ch/pc8_tech/1125/1125587131.html
Ruby初心者質問スレPart2
http://pc8.2ch.net/test/read.cgi/tech/1107799347/
http://makimo.to/2ch/pc8_tech/1107/1107799347.html
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/
0004デフォルトの名無しさん
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/
0005デフォルトの名無しさん
2006/09/28(木) 15:34:44RAA - 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/
0006デフォルトの名無しさん
2006/09/28(木) 15:43:15次スレは>>980が立てること!
0007デフォルトの名無しさん
2006/09/28(木) 15:44:020008デフォルトの名無しさん
2006/09/28(木) 15:57:38>>7
ここ以外は隔離スレなのでだめです。
0009デフォルトの名無しさん
2006/09/28(木) 16:09:20apt-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のインストールはできなのでしょうか?
0010デフォルトの名無しさん
2006/09/28(木) 16:18:430011デフォルトの名無しさん
2006/09/28(木) 16:25:54可能性あるとしたら、
・apt-get updateしてない
・dapper universe を参照してない
/etc/apt/source.lst の上の方の 〜dapper universeてなってるところのコメントをはずして、
apt-get update してみ
0012デフォルトの名無しさん
2006/09/28(木) 16:41:13コメントをはずすとインストールできました。
教えていただいてから調べると、確かにそう書いてあるサイトがありました。
調べ不足から、お手数お掛けしてすいません。
ありがとうございました。
0013デフォルトの名無しさん
2006/09/28(木) 17:19:25前スレ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
001413
2006/09/28(木) 17:35:36次のコードで一応、動きました。
Setarg = Win32API.new(DLL, 'mecab_new', 'ip', 'i')
Analyze = Win32API.new(DLL, 'mecab_sparse_tostr', 'ip', 'p')
これでコマンドラインからアクセスせずに済みそうです。
0015デフォルトの名無しさん
2006/09/29(金) 01:59:39だがそれがいい。
0016デフォルトの名無しさん
2006/09/30(土) 18:10:11Ruby 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
0017デフォルトの名無しさん
2006/09/30(土) 18:17:490018デフォルトの名無しさん
2006/10/01(日) 03:55:47どこがおかしいでしょうか。
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"]
0019デフォルトの名無しさん
2006/10/01(日) 04:00:200020デフォルトの名無しさん
2006/10/01(日) 04:02:50私自身初心者なので模範コードは示せませんが、each_indexで処理すると
array[0] #=> aaaなので削除 結果 array = [ bbb, accc, addd, aeee ]
array[1] #=> acccなので削除 結果 array = [ bbb, addd, aeee ]
array[2] #=> aeeeなので削除 結果 array = [ bbb, aeee ]
という理由ではないでしょうか。
0021デフォルトの名無しさん
2006/10/01(日) 04:08:10array.delete_if{|x| re =~ x}
0022デフォルトの名無しさん
2006/10/01(日) 04:47:46なるほど、そうですね。orz
>>20
明解な説明ありがとうございます。
>>21
やりたいのはそれでした。
もっと精進します。
みなさんありがとうございました。
0023デフォルトの名無しさん
2006/10/02(月) 06:27:30Javaみたいに、classに定数を追加していくのが、ruby流ですか?
0024デフォルトの名無しさん
2006/10/02(月) 07:01:29マルチバイト文字コードを該当文字にする関数がわかりません。
chrのマルチバイト対応のような関数はありますか?
0025デフォルトの名無しさん
2006/10/02(月) 07:05:44&#1234や&H1234 などの数値文字参照を該当文字に変換したいのですが、
マルチバイト文字コードを該当文字にする関数がわかりません。
chrのマルチバイト対応のような関数はありますか?
0026デフォルトの名無しさん
2006/10/02(月) 07:52:220027デフォルトの名無しさん
2006/10/02(月) 10:31:59Ruby PDFでググって、上位のライブラリが理論上は最も日本語の情報が豊富なライブラリ。
>>24,25
ttp://moriq.tdiary.net/20040903.html
どういう入力からどういう出力が欲しいのかちゃんと書こう。
あと数値文字参照とRubyで扱える文字エンコードが一致しないので文字列化しても正規表現とかの操作はできないと思われ。
バイト列として操作はできると思うけど意味あんのかね。
>>23
単純にはそう。
その気になればModule#const_setとかで色々できると思うけど標準の方法はない。
0028デフォルトの名無しさん
2006/10/02(月) 10:39:37ああごめん。
IconvとかでUTF-8に変換してから操作してや。
0029デフォルトの名無しさん
2006/10/02(月) 11:05:38Text::ParseWordsは、テキストを解析して、トークンの配列を返すモジュールです。
具体的には、スペースで区切られた要素(ダブルクォートで囲まれる場合がある)を処理したいのです。
元の文字列
a b "c d e" f "g"
から
a
b
c d e
f
g
という配列を取り出したい。
0030デフォルトの名無しさん
2006/10/02(月) 11:14:590031デフォルトの名無しさん
2006/10/02(月) 11:18:28いけました。
ありがとうございます
003226
2006/10/02(月) 18:38:27ググっては見たんだけど、ろくなライブラリが無いね。
この辺りは、Javaの方が強力なので、Javaで作ったコマンドをRubyから叩くことにしました。
0033デフォルトの名無しさん
2006/10/02(月) 22:04:45初心者向けかどうかは知らんが日本人が書いてるRuby<->Javaのライブラリが2個はある。
Rjbとyajb。前者はJNI、後者はPure Ruby。
外人が書いたやつも入れればもっとあるはず。
あとはiTextなりXSLTなり好きに汁。
まあそもそもRuby自体JRubyでいいのかもね。
こだわらないならRhinoが手頃だと思うけど。
0034デフォルトの名無しさん
2006/10/03(火) 18:00:04に変えようとmake checkしたら4つもエラーが出てきてどうすればいいのでしょう?
test_delete(TestDBM)
test_delete(TestGDBM)
test_s_open_error(TestGDBM)
test_s_open_error(TestSDBM)
このエラーの意味がわかりません。
このままインストールしてもいいのでしょうか?
0035デフォルトの名無しさん
2006/10/03(火) 18:09:31のはなぜですか?
0036デフォルトの名無しさん
2006/10/03(火) 19:21:24環境は?
gdbm とかは入ってるの?
0037デフォルトの名無しさん
2006/10/03(火) 19:42:00ありがと。Rhinoをためしてみる。
003834
2006/10/04(水) 08:42:10結果が変わりません。同じエラーが出てしまいます。DBM,SDBMも入れないとだめ
なのでしょうか?
003934
2006/10/04(水) 08:51:11何か別なのを教えてください。できればCで書かれたJAVA->Ruby変換
ソフトみたいなのがいいです。
0040デフォルトの名無しさん
2006/10/04(水) 09:23:46「このエラーの意味」どころかどんなエラーが出たかがわかりません。
0041デフォルトの名無しさん
2006/10/04(水) 09:24:29メモリかマザーボードが氏んでるとか。
0042デフォルトの名無しさん
2006/10/04(水) 09:57:47Rhinoはコンパイル必要ない。
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で書いた方が幸せかもしれんよ。
それなら新しいことを勉強する必要はないんだから。
勉強とか調査が苦手な人はそれをしなくてもいいんだよ。
今まで通りでも結果さえ出ればそれで全く問題ないでしょ。
もし苦手じゃないというなら、ドキュメント読んだり検索したりそれなりに汁。
0043デフォルトの名無しさん
2006/10/04(水) 17:44:18class Foo
attr_reader :field
end
について、attr_reader は
実は単なるメソッド呼び出しだということですが、
このような書き方のメソッドはどのようなタイミングで、
また、どうやって呼び出されるのでしょうか?
irbで
class Foo
bar = "hello"
print bar
end
を実行してみたら、helloと出ますが、同じことでしょうか。
この文がどのような文脈で評価されるのか、よくわかりません。
どなたか、ご教示いただれば幸いです。
0044デフォルトの名無しさん
2006/10/04(水) 21:13:120045デフォルトの名無しさん
2006/10/04(水) 21:46:1444 さんの書かれているように
class Foo
bar = "hello"
print bar
end
で代入文や print メソッドの呼出しが実行されるのと「同じ」く attr_reader メソッドが呼び出されているだけという理解でよいのではないでしょうか。ただし attr_reader の副作用として
class Foo
def field
@field
end
end
という(getter)メソッドの定義をおこなったことになると。
0046デフォルトの名無しさん
2006/10/05(木) 13:25:13なるほど、よくわかりました。
Javaなどの静的な言語しかなじみがないもので、ピンと来ませんでした。
実行タイミングや、スコープはどうなるのかな?などなど、
調べて勉強してみます。
ありがとうございました!
0047デフォルトの名無しさん
2006/10/05(木) 14:19:58アルファベット順に並べ変えて出力するようなプログラム
これの答えってなんになるの?
0048デフォルトの名無しさん
2006/10/05(木) 14:53:33class Department {
public static final Map sections = new HashMap();
}
このクラス定数はいつ初期化されるのか。
HashMapのインスタンスができんのはいつだろうか。
まあJavaだと実際はクラスが読み込まれた時(=Rubyでいうパース時)じゃなくて最初に参照されたときに定数を初期化するんだろうけど、
でも使おうとしたときにはもう使えるようになってる点は変わらんと思うが。
Java的に言えば、Rubyでクラス宣言直下でのメソッド呼出=static{}中での初期化、だと思えばだいたい合ってると思う。
変数スコープは全然違うけど。
でも、そんなの意識しなきゃならないところかね。
Javaでだってstatic{}中であんまり変なことしないだろ。
同じようにRubyでもクラス宣言直下で色々やらねえ方がいいと思うよ。
定数の宣言、クラス変数の初期化、attr_*でのアクセサの「定義」(実態は「生成」だけど)くらいしか
Javaと同じように普通はやらねえし、やるべきじゃないと思う。
なんで調べるだけ無駄、と思った。
0049デフォルトの名無しさん
2006/10/05(木) 14:57:41ruby云々の前に、もうちょっと基本から考えたほうがいいぞ。
それに宿題スレは別だ。
「一行に一単語」って文字コードは何?
英数字、漢字ありなのか?
その場合のアルファベット順とはなにか。
昇順・降順どっちとか。
とりあえず文字コード、ソート、rubyでググる事をお勧めする。
0050デフォルトの名無しさん
2006/10/05(木) 16:02:56p Foo
p defined? Foo
Foo << "b"
p Foo
#=>"a"
#=>"constant"
#=>"ab"
Foo は定数なので2度代入できないと思うんですが、
上のは2度代入しているわけではないのですか?
いや、Foo の指しているオブジェクトが変更されたということですね?
でも何だかしっくり来ないんですが…
定数なのに値が変わってしまうというのは変じゃないんでしょうか。
0051デフォルトの名無しさん
2006/10/05(木) 16:22:50=> "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
0052デフォルトの名無しさん
2006/10/05(木) 18:05:17freeze で検索したら関連の情報をいくつか見つけました。
「定数」という用語にこだわらないことにします。
0053デフォルトの名無しさん
2006/10/05(木) 18:14:27Rubyの「定数」は「参照先が変わらない」ってこと。
Fixnumみたいな不可変のオブジェクトは本当に変わらないが
Stringのような参照先が変わらなくても中身自体が変わるものは変わる。
freezeしたら別だが。
0054デフォルトの名無しさん
2006/10/06(金) 08:00:29リファレンスを探したのですが見つかりませんでした。
ぐぐろうにも良い検索ワードが思い浮かびません…。
サーバ上のファイル更新時刻をしりたい場合は通常どのライブラリを使うのでしょうか?
0055デフォルトの名無しさん
2006/10/06(金) 12:57:260056デフォルトの名無しさん
2006/10/06(金) 13:20:06res["Last-Modified"] あたりを試せ。
0057デフォルトの名無しさん
2006/10/06(金) 13:58:470058デフォルトの名無しさん
2006/10/06(金) 14:59:43「取れないこともあるけどどうすれば?」とは書いてないよね。
0059デフォルトの名無しさん
2006/10/06(金) 17:12:30A 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ではどのように表記するのでしょう?
0060デフォルトの名無しさん
2006/10/06(金) 17:17:04ハッシュのデフォルト値を指定する。
動作確認してないけど、こうかな。
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
006159
2006/10/06(金) 18:40:02出来ました!
最初、
if hash[key1] ==nil then hash[key1]=Hash.new
とか書くしかないかと思ってました
う〜ん、もうちょっとrubyのコードを見慣れないと思いつかないですね。
精進します
0062デフォルトの名無しさん
2006/10/06(金) 19:26:45#!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
0063デフォルトの名無しさん
2006/10/06(金) 19:31:17スタック越えない限りは実行可能なはず。
#!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
0064デフォルトの名無しさん
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
006559
2006/10/06(金) 21:14:24a b c
a B c
のように二番目のキーだけ違うものが存在するので
A=>{b=>c,B=c}
と2つとも別のものとして代入したいのですので
>>62さんの例だと1行目が2行目に上書きされてしまうので
困っちゃいます
今回は要素数固定なので>>60で行けますが
やりたいことはまさに>>63さんの礼そのものでして。
ちょっと考えます〜
0066デフォルトの名無しさん
2006/10/06(金) 23:20:56ruby 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
<エラー引用ここまで>
0067デフォルトの名無しさん
2006/10/06(金) 23:32:080068デフォルトの名無しさん
2006/10/06(金) 23:32:54頑張ってくれ。一応やってみたから、参考までに。
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
006954
2006/10/07(土) 03:08:59ありがとうございます。テストしてるサーバでは取得できました。
取れない場合に他の対処法があるのならそちらも教えて頂けませんか。
0070デフォルトの名無しさん
2006/10/07(土) 07:34:46while 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
なんて矛盾したデータが考えられるけど
それはシラネ
0071デフォルトの名無しさん
2006/10/07(土) 09:42:13ケツまでmapにしちまったらいいんじゃねえか?
ケツの後ろはnilにしときゃいいだろう。
0072デフォルトの名無しさん
2006/10/07(土) 10:22:03foo(f)
}
を
eachdir{|f|
foo(f)
}
みたいにラップすることって出来ますか?
0073デフォルトの名無しさん
2006/10/07(土) 10:57:17`dir /s /b`.each{|f| yield f.chop}
end
ということ?
0074デフォルトの名無しさん
2006/10/07(土) 15:52:28http://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は、
念のため保存しておいた方がいい。
まあ、同じことをする人はあまりいないと思うが、
気をつけた方がいいと思う。
以上、チラシの裏終わり
0075デフォルトの名無しさん
2006/10/07(土) 15:55:17こんな馬鹿久しぶりに見た
0076デフォルトの名無しさん
2006/10/07(土) 16:41:42yield するならブロック引数を &b で受け取る必要はないよ。
0077デフォルトの名無しさん
2006/10/07(土) 17:08:32ああやっぱそうなんだ。
マニュアルにはサンプルが載っているが、でも書いてないけどよしなにするってのがなんか耐えられない感じ。
むしろblock_given?でチェックするのが正しいべき?
0078デフォルトの名無しさん
2006/10/07(土) 17:44:38yield は言語機能としてもともとあった機能。ただ、与えられたブロックをオ
ブジェクトとして扱いたいっていう要求があってブロック引数という機能が実
装されたという経緯がある。
つまり、この2つは「似たような機能を実現するための2つの手段」になってい
るから、両方を同時に使うのが一番ヘンだと個人的には思う。っていうか使え
るとは思ってなかった。
ブロック引数を使わずに yield を使うか、ブロック引数を使うなら call メ
ソッドを使って yield は使わないか、どっちかにするべきじゃないかな。
どちらを使うかは趣味の問題だと思うから、どちらでも良いと思う。
もともとあったのは yield だけだったので、古参の Rubyist は yield の方
を好む気がするけど。
あと、ブロック引数を取ると Proc オブジェクトを生成する。 yield は言語
機能なのでそういうことをしないぶん、じゃっかん軽いらしい。
0079デフォルトの名無しさん
2006/10/07(土) 17:46:18こういうメソッドでブロックが与えられないときには単にエラーで良いと思う
ので、いちいち block_given? などでチェックする必要はないと思う。
0080デフォルトの名無しさん
2006/10/07(土) 22:15:15現在の状況
ruby ./hogehoge.rb data.dat
引数として、data.datを読み込んで、hogehoge.rbで処理して、
output.datというファイルが出力されるようになっています。
これに関しては、問題ありません。
毎回毎回、作業ディレクトリーにスクリプトファイルをコピーして、
処理を実行しているのですが、すごくめんどくさく感じています。
最終的にやりたいことは、
「作業ディレクトリーと実行ファイルを置いておくディレクトリーを別々にする。」
というものです。
色々調べてみると、Pathの設定をどうにかすればよいと思い
試行錯誤していますが、うまくいきません。
どなたか、ご教示いただければ幸いです。
0081デフォルトの名無しさん
2006/10/07(土) 22:37:00./ とか書いているから Linux ? distro は? 管理者権限はあるのか、一
般ユーザの権限しか持たないのか? その hogehoge.rb というのはどの程度
汎用なツールなのか? ほかの人も使うのか、自分しか使わないのか?
そういうのはどういうツールなのかにもよるし、個人のセンスにも依存するだろう。
単なるデータ処理ツールであれば、パスを設定したりしないで、しかしいちい
ちコピーなんかしないで相対パスで指定して実行することを個人的には勧める。
また、自分用のスクリプトはあらかじめ決めておいたディレクトリ(~/binとか)
に置いておくことに決めておいて、そこにまとめて置くという手もある(パス
はあらかじめ通しておく)。
パスを設定する方法なら板違いもいいところ。
設定の方法はシェルや環境によって変わる。 OS の使い方をもっと勉強した方
がいい。
0082デフォルトの名無しさん
2006/10/07(土) 22:43:57うざ
0083デフォルトの名無しさん
2006/10/07(土) 22:46:41>相対パスで指定して実行することを個人的には勧める
この一行だけでいいよ
0084デフォルトの名無しさん
2006/10/07(土) 22:56:29hogehoge.rbの一行目に
#!/usr/bin/env ruby
と書いて、/usr/local/binか~/binにコピーして、chmod +x hogehoge.rbとすれば、
$ hogehoge.rb data.dat
というふうに起動できるようになるよ。
008580
2006/10/07(土) 23:06:07質問に答えていただいて、ありがとうございます。
環境はwindows XP Home EditionSP2です。
パスとか良く分かっていないみたいです。
少し、調べてみます。
008680
2006/10/07(土) 23:20:39うまくいきました。
少し、Pathの意味が分かった気がします。
ありがとうございました。
0087デフォルトの名無しさん
2006/10/07(土) 23:26:010088デフォルトの名無しさん
2006/10/08(日) 00:35:370089デフォルトの名無しさん
2006/10/08(日) 02:13:26むしろそんな単純にはうまくいくわけがないはずなのだが。
PATHEXTを設定してくれるインストーラとかあるんだっけ?
0090デフォルトの名無しさん
2006/10/08(日) 02:14:21a="123"
を
a="123"
に変換したいんです!!
0091デフォルトの名無しさん
2006/10/08(日) 02:48:080092デフォルトの名無しさん
2006/10/08(日) 02:53:330093デフォルトの名無しさん
2006/10/08(日) 05:09:280094デフォルトの名無しさん
2006/10/08(日) 05:58:58定数値のかわりにわかりやすい変数名をつかいたいということであれば、
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でアクセスする。
0095デフォルトの名無しさん
2006/10/08(日) 06:16:14Symbolだと、
定義にならないから、スペルミスってもとおっちゃわない?
moduleが無難そうです。
0096デフォルトの名無しさん
2006/10/08(日) 11:15:59JavaScriptでの
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バイトコードがうまくいきませんでした。
0097デフォルトの名無しさん
2006/10/08(日) 12:09:060098デフォルトの名無しさん
2006/10/08(日) 12:42:53Permission denied のエラーが出てしまいます。
どうもtempファイルのrenameが出来ないみたいです。
どうすれば回避できるでしょうか?
実行環境:Win XP SP2, ruby 1.8.4 (2006-04-14) [i386-mswin32]
レシピブック正誤表にある2箇所の修正は入れています。
0099デフォルトの名無しさん
2006/10/08(日) 13:09:070100デフォルトの名無しさん
2006/10/08(日) 14:40:11表示させる場所は
cmd.exeでの出力結果を考えています。
ruby ToUnicode.rb 数値文字参照を含むファイル
を実行するとcmd.exeでunicode文字が表示される
というのを期待します。
リダイレクトしてunicodeを扱えるエディタで開けば
結果をファイルとしても扱えると思います。
0101デフォルトの名無しさん
2006/10/08(日) 14:42:48cmd.exeってSJISしか表示できなかったような気がするんだけど?
010298
2006/10/08(日) 14:43:53アドバイスありがとうございます。
require "fileutils"
を頭に入れて、renameの行を下記の2行に変えたら動きました。
temp.flush
FileUtils.copy(temp.path, path)
0103デフォルトの名無しさん
2006/10/08(日) 15:06:36マニュアル読み直したよ。
lambdaを渡そうとしてno block givenだったのは、可換じゃないからなのね。
合点がいった。
0104デフォルトの名無しさん
2006/10/08(日) 15:27:23あーごめん、わかった。レベルを勘違いしてたのがわかった。
日本語以外がうまくいかない?そりゃそうだよ。
だって変換先がShift-JISなんだもん。日本語でもうまくいかないときすらあるよ。
コード読んだ?何をするためのコードだと思った?Iconvは調べた?
さらに言えばあのコードでは数値文字参照以外はノータッチなのでそこのコードが不定だと結果も不定だよ。
単純な方法としては、一回全部をUTF-8にしないと正常な結果になりません。(他の方法もあるけど)
では、なぜ一度中身を全部文字コード変換する場合は、UTF-8でないといけないのでしょうか。
0105デフォルトの名無しさん
2006/10/08(日) 15:27:49ちょっとRubyに関して疑問に思ったので、こちらで質問させていただきます。
日付が文字化けするという、問題があるという風に書いてあるのですが、
当方の環境では、文字化けしません。
ruby -e 'p Time.new'
と実行すると、本では、
Tue Apr 04 00:48:32 東京(標準時) 2006
となっているのですが、こちらの環境では、
Sun Oct 08 15:27:24 +0900 2006
となります。
これはどういったことが考えられますでしょうか?
0106デフォルトの名無しさん
2006/10/08(日) 15:29:19正:さらに言えばあの「ソースコード」では数値文字参照以外はノータッチなのでそこの「文字コード」が不定だと結果も不定だよ。
0107105
2006/10/08(日) 15:36:57OSは、WindowsXP SP2 Home。
OneClickInstallerでインスコしました。
ためしに、bash上で、export LANG="ja_JP.SJIS"してみましたが、英語のままでした。
0108デフォルトの名無しさん
2006/10/08(日) 15:41:28中国語の文字のファイル名をつけたら、一部文字化けしました。
http://www.securehtml.jp/utf-8/sjis/chinese_sjis.html
にある
[ザーサイ].txt
[ニイハオ].txt
[シェシェ].txt
を作ってdirで表示したところ([]内は実際はchinese_sjis.htmlからコピー&ペーストした中国文字)、
[シェシェ]だけだめでした。
エクスプローラ上では表示されましたので、
「数値文字列参照を含むファイル名をunicode表現でrenameする」
ということでどうでしょうか?
0109デフォルトの名無しさん
2006/10/08(日) 17:40:54ファイル名の話じゃなかったでしょ。
結局何がしたいんだ。
0110デフォルトの名無しさん
2006/10/08(日) 21:00:52ダウンロードしたファイルが漢字や中国語を含んでいる場合
数値参照文字列を含んだファイル名になるので
それをUnicode文字に変換したいです。
これまで
http://ha1.seikyou.ne.jp/home/akairingosaita/hangul/decodence.htm
を使ってきました。
変換前ファイル名をコピーして変換し、それにrenameするのが面倒なので
Rubyスクリプトで一気にできないかと思って聞きました。
0111デフォルトの名無しさん
2006/10/08(日) 23:20:04s = "ABCDEFG"
s.tr!("D", "XX")
print s + "\n"
結果: ABCXEFG
0112デフォルトの名無しさん
2006/10/09(月) 00:15:140113デフォルトの名無しさん
2006/10/09(月) 00:46:18> String#tr! を使う場合同じ文字数しか置き換え出来ないんでしょうか?
そりゃ文字単位の置換だからな。
> s.tr!("D", "XX")
むしろ警告かエラーかにすべきじゃないかな。
0114デフォルトの名無しさん
2006/10/09(月) 16:05:19なんだかそういう感じの概念があるというような話を聞いたんですが、
どういうのをどう勉強すると使えるようになるもんでしょうか?
クラス変数とか使うのとは違うのかなとか
0115デフォルトの名無しさん
2006/10/09(月) 16:11:470116デフォルトの名無しさん
2006/10/09(月) 19:19:32UTF-8で書いたスクリプトをMacに持っていって
その時点では普通に動いたんだけど、miで編集したら動かなくなりました
調べてみると、例のチルダの変換のせいでおかしくなってるみたいです
これはどのように対処すればいいんでしょうか?
0117デフォルトの名無しさん
2006/10/09(月) 19:25:41それでも答えはttp://moriq.tdiary.net/20040903.htmlでしょ。
問題を理解してれば解決できるよ。
逆に言えば問題を理解しない限りは解けないし、理解しないと意味がない問題だと思うんだけど?
あと、どうでもいいけど、いわゆる普通の場合は数値文字参照を含んだファイル名は作成されないよね。
0118デフォルトの名無しさん
2006/10/09(月) 20:54:56carbon emacsで開きなおしてみるとか。
ttp://homepage.mac.com/zenitani/emacs-j.html
011966
2006/10/09(月) 21:49:09rdtoolを0.6.20じゃなくて、0.6.16でいれなおしてみたら、なぜか成功しました。
当然、ruby 1.8.5 (2006-08-25) [powerpc-darwin7.9.0] な環境はそのままです。
ご報告まで。
0120デフォルトの名無しさん
2006/10/09(月) 22:38:552・AとB、BとCの間に文字列は存在してもいいが、A・B・Cのいずれも含んではいけない
というような正規表現はどうやったらいい?
0121デフォルトの名無しさん
2006/10/09(月) 22:57:520122デフォルトの名無しさん
2006/10/09(月) 23:02:06すいません
A、B、Cは文字じゃなくて文字列です。そう定義しただけです
0123デフォルトの名無しさん
2006/10/09(月) 23:09:41だったら最初から具体例で書け。
0124デフォルトの名無しさん
2006/10/09(月) 23:44:41文字だとしても>>121は間違い
/A[^AC]*?B[^AB]*?C/
0125デフォルトの名無しさん
2006/10/09(月) 23:50:04AABCCもダメなのか?
0126デフォルトの名無しさん
2006/10/10(火) 00:02:03とりあえずsite_ruby/optparse.rbは消せ。古すぎだ。
strscanも古いの残ってないか?
0127デフォルトの名無しさん
2006/10/10(火) 00:22:09とりあえずこんなもんか。
A, B, C = "ab", "ba", "ca"
re = /#{A}((?!#{A}|#{B}|#{C}).)*#{B}((?!#{A}|#{B}|#{C}).)*#{C}/
0128デフォルトの名無しさん
2006/10/10(火) 00:31:25ありがとさんでした
否定先読みの使い用途がようやくわかりました
0129デフォルトの名無しさん
2006/10/10(火) 05:07:39なぜ for key, val in hash do ... end は hash.each do |key, val| ... end と同じではないのでしょうか。
for var in list が書けるなら for key, val in hash も書けるようにしてほしいんですけど、無理なお願いでしょうか。
0130デフォルトの名無しさん
2006/10/10(火) 06:01:030131デフォルトの名無しさん
2006/10/10(火) 06:24:02これ使ってる人いる?
eachしか使わんからなあ
0132デフォルトの名無しさん
2006/10/10(火) 06:55:340133デフォルトの名無しさん
2006/10/10(火) 09:48:30おれの環境ではできるけど。
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 がどう定義されているかによると思うんだが。
0134デフォルトの名無しさん
2006/10/10(火) 11:42:22例が配列しかないからArrayにしか適用できないと勘違いする人も多いと思うけど。
0135デフォルトの名無しさん
2006/10/10(火) 12:49:41適当にオブジェクト指向の本読め
0136デフォルトの名無しさん
2006/10/10(火) 12:57:44class Main
#(とりあえず全部書く)
end
Main.new
みたいな練習にもならんスクリプトが蔓延するんだよ
0137デフォルトの名無しさん
2006/10/10(火) 14:58:000138デフォルトの名無しさん
2006/10/10(火) 15:24:11最近の1.9の警告に負けて一部eachからforにかえてしまったオレは負け組。
>>136
最後がMain.runとかだったら許せてしまうオレは負け組。
0139デフォルトの名無しさん
2006/10/10(火) 17:54:06まあ、確かに自己流ではどうにもならんのは確かではあるが…
0140デフォルトの名無しさん
2006/10/10(火) 19:39:190141デフォルトの名無しさん
2006/10/10(火) 23:01:29> for var in list doなんて、初めて知った。
> これ使ってる人いる?
> eachしか使わんからなあ
普通 for のほうを使うだろ?eachは遅い。
0142デフォルトの名無しさん
2006/10/10(火) 23:10:300143デフォルトの名無しさん
2006/10/10(火) 23:20:25何回も実行される部分だと意識して for に書き直したりするけど。
0144デフォルトの名無しさん
2006/10/10(火) 23:29:100145デフォルトの名無しさん
2006/10/10(火) 23:33:540146デフォルトの名無しさん
2006/10/10(火) 23:34:170147デフォルトの名無しさん
2006/10/10(火) 23:37:510148デフォルトの名無しさん
2006/10/10(火) 23:42:130149デフォルトの名無しさん
2006/10/11(水) 02:28:540150sage
2006/10/11(水) 03:07:49その結果を取得する」
これを行なうにはどんなプログラムを書けばいいのでしょうか?
0151デフォルトの名無しさん
2006/10/11(水) 03:38:45$ ruby -e 'require "net/http"; Net::HTTP.get_print("www.google.com", "/search?q=2ch+Ruby")'
0152150
2006/10/11(水) 06:09:36ありがとうございます。
googleの場合はこのやり方でできたのですが、
他のサイト(yahooやgooなど)のフォームに入力する際は
/search?q の部分はどう変えたらいいでしょうか?
0153デフォルトの名無しさん
2006/10/11(水) 06:41:53一発でわかるじゃん。
0154デフォルトの名無しさん
2006/10/11(水) 09:54:23俺なんか、Rubyでeachばかり使ってたら、他の言語にforeachがないとクソだと思うようになったw
0155デフォルトの名無しさん
2006/10/11(水) 13:28:47新スレを自動的に見つけて
2getするプログラムはどう書けばよいのでしょうか?
0156デフォルトの名無しさん
2006/10/11(水) 13:42:13ttp://www.new-akiba.com/archives/2006/10/post_4082.html
0157デフォルトの名無しさん
2006/10/11(水) 14:08:45puts '新スレを見つけたら何かキーを押してください...'
while line=$stdin.gets do
puts '2ゲットおおおおぉぉ'
puts
puts '新スレを見つけたら何かキーを押してください...'
end
0158デフォルトの名無しさん
2006/10/11(水) 15:26:35作るべきではないが
自動的に
という質問のようだよ。
0159デフォルトの名無しさん
2006/10/11(水) 16:06:590160デフォルトの名無しさん
2006/10/11(水) 17:22:44遠まわしに2chカキコの為の方法を聞いてるんだろうか。
0161デフォルトの名無しさん
2006/10/11(水) 17:34:51Lv9が倒せない。これ見てから間に合うか!?
0162デフォルトの名無しさん
2006/10/11(水) 18:05:12ほいほい教えないのが暗黙のマナーな気もする
勉強した人ならピンポイントで聞いてくるだろうし
0163デフォルトの名無しさん
2006/10/11(水) 19:06:19具体的には ハナモゲラ という文字列を送信したいのですが
0164デフォルトの名無しさん
2006/10/11(水) 19:31:040165デフォルトの名無しさん
2006/10/11(水) 19:39:09puts '入力してください'
loop do
# 処理
puts '入力してください'
end
みたく書くんだよな
なんかいい方法ない?
ループの判定前前に必ず実行できるとか
0166デフォルトの名無しさん
2006/10/11(水) 20:09:02loop do
puts プロンプト
line = gets
raise if 終了条件(line) # ループ外で例外捕捉しないのならば exit の方が素直かな
処理(line)
end
というようなかんじではあまり綺麗じゃないですかね。
0167デフォルトの名無しさん
2006/10/11(水) 20:28:33ピンポイント過ぎwww
うーんとね、Cookieにはなもげらって書けばいいと思うよ。
0168デフォルトの名無しさん
2006/10/11(水) 20:36:31** error 1 ** deleting -prologue-
如何すれば解決するでしょうか?
0169デフォルトの名無しさん
2006/10/11(水) 20:50:55begin
print 'ぼたんをおしてください'
raise if line=$stdin.gets
rescue
puts "2ゲットオオオォォォ!\n\n"
retry
end
異常でもないのに例外発生なのがいやな感じ
0170デフォルトの名無しさん
2006/10/11(水) 20:55:37p 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 の仕様変更が影響しているように思えるのですが、これどういう理由で挙動が変わったのでしょうか?
0171デフォルトの名無しさん
2006/10/11(水) 21:29:05while print('input: ') or ((k=gets)) do
0172171
2006/10/11(水) 21:32:23def input(prompt)
print prompt
gets
end
しちゃうんだけどね
0173デフォルトの名無しさん
2006/10/11(水) 21:58:130174デフォルトの名無しさん
2006/10/11(水) 22:07:57>>式 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
それだ。
0175デフォルトの名無しさん
2006/10/12(木) 02:04:49あれ、Borlandのコンパイラってまだサポートされてたっけか
サポートされなくなったのは1.9だけ?
0176デフォルトの名無しさん
2006/10/12(木) 02:13:52え、マジで?
どっかにそんな情報ある?
0177デフォルトの名無しさん
2006/10/12(木) 18:33:35Cygwinだけど再現した。
nkf.exeでも再現するからnkf207のバグなんだろうなあ、と思ってiconvしてみたら何か変だな。
irb(main):011:0> Iconv.iconv('iso-2022-jp', 'utf-8', 'ほげほげ')
=> ["\e$B$[$2$[$2", "\e(B"]
NKFのソース見ても正直よくわからんが。
0178177
2006/10/12(木) 18:56:00nkf.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
0179175
2006/10/13(金) 00:02:14すまんちょっと勘違いがはいっていたようだ。
でも、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はがんがん手が入っているから、今はもうビルドできなくなってるかも。
0180デフォルトの名無しさん
2006/10/13(金) 00:13:340181デフォルトの名無しさん
2006/10/13(金) 00:29:180182デフォルトの名無しさん
2006/10/13(金) 00:33:090183デフォルトの名無しさん
2006/10/13(金) 00:50:340184デフォルトの名無しさん
2006/10/13(金) 00:54:040185デフォルトの名無しさん
2006/10/13(金) 00:55:01ついでにメンテナに立候補する
0186170
2006/10/13(金) 02:14:39http://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 を再構築すればよいのかな?
0187デフォルトの名無しさん
2006/10/13(金) 02:42:12> BCC55でRuby1.8.5をmakeしようとしたのですが、以下のエラーが発生し先に進む事ができません
> ** error 1 ** deleting -prologue-
それはエラーが発生した後のmakeのメッセージ。
その前にはなんと出てる?
つーか俺んとこじゃ問題なくコンパイルできてるんだが。
0188デフォルトの名無しさん
2006/10/13(金) 04:33:051.
正規表現で、すべての文字にマッチさせるにはどう書けばいいですか?
例えば、{}の間にある文字列すべてとかの場合です。s[/\{ここ\}/]
何か簡潔な記述方はありますか?
2.
あるRubyスクリプトを別のプログラムから "ruby script.rb" 等と実行した場合
Rubyのスクリプトからスクリプト自体が置かれているディレクトリを取得するにはどうしたらいいでしょうか?
0189デフォルトの名無しさん
2006/10/13(金) 04:38:27$0
0190デフォルトの名無しさん
2006/10/13(金) 04:46:120191デフォルトの名無しさん
2006/10/13(金) 04:52:53__FILE__
0192デフォルトの名無しさん
2006/10/13(金) 04:53:380193デフォルトの名無しさん
2006/10/13(金) 07:48:50GCCでも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-
と出ます
0194デフォルトの名無しさん
2006/10/13(金) 08:00:24案外
/\{.+?\}/
で用は済むのかも
0195デフォルトの名無しさん
2006/10/13(金) 09:17:14>GCCでもBCCと同じ方式でコンパイルできるのですか?
cygwinなら
configure
make
だけでできる。そういう意味では同じ。
mingwだとconfigureに引数が必要だが、大したことはない。
0196188
2006/10/13(金) 09:20:11こんな簡単なものでイケたんですね。
mで改行もOKみたいですね。
>>191
__FILE__ もあるんですね。
>>194
それでもイケるんですか。
なるほど。
今の所、違いがイマイチ分からないのですが
189さんが教えてくれた方法で解決しましたのでそれを使わせて頂きます。
みなさん、どうもありがとうございました!
0197デフォルトの名無しさん
2006/10/13(金) 09:22:27そこで dir した結果をくれ
0198デフォルトの名無しさん
2006/10/13(金) 09:24:06> mingwだとconfigureに引数が必要だが、大したことはない。
CC='gcc -mno-cygwin' だけ。
bccはコンパイラもランタイムもバグだらけだし、makeも(nmakeよりさらに)
奇天烈だしで、切実な理由がないかぎりおすすめしない。
# 新しいTurbo C++はDLするものが多いんでまだ試してない。
0199デフォルトの名無しさん
2006/10/13(金) 09:26:27あとMakefileがどこまでできてるか。最後の方の数行。
0200デフォルトの名無しさん
2006/10/13(金) 10:01:22表示するスクリプトを練習で作ったんですが、置き換えの部分をもっと短く書けませんか?
正規表現がよく分かってないもので…
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
0201デフォルトの名無しさん
2006/10/13(金) 11:04:072chのdatファイルの仕様を調べるといい。
それと、ネット上から持ってきたファイルの保存の仕方と、
2chからdatの差分を取得する仕方。
0202デフォルトの名無しさん
2006/10/13(金) 11:12:230203デフォルトの名無しさん
2006/10/13(金) 15:08:54MinGW と Cygwinのサブセットである開発支援環境のMSYSと
perl (MSYS用のperlも提供されてます)をインストールすれば
特に何もせずとも
./Configure
make
でコンパイルできましたよ
0204デフォルトの名無しさん
2006/10/13(金) 16:43:10cygwinをインストールし試してみましたが
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でもコンパイル出来ないようなら使ってみようと思います
0205デフォルトの名無しさん
2006/10/13(金) 17:44:24Borland大好きならともかく。
あとCygwinに関してもうちょっとググれ。
0206デフォルトの名無しさん
2006/10/13(金) 20:22:03Cygwin慣れてないならmingwインスコするがよろし。
Cygwinを使ってやりたい事が複数あるならCygwinお勧めするが。
0207デフォルトの名無しさん
2006/10/14(土) 00:57:24わかった。
すまんがソースと別のディレクトリでコンパイルしてくれ。
md build
cd build
..\bcc32\configure
みたいに。
0208デフォルトの名無しさん
2006/10/14(土) 01:51:21setbccぐらい教えてやれよ…
0209デフォルトの名無しさん
2006/10/14(土) 06:16:27二時間かけてフルセットのCygwinをインストールしてみたりしましたが
何をやってもconfigureもmakeも出来ませんでした・・・
コマンドが存在しないと帰ってくるだけです
>>206
MinGWを入れてみましたが、結局殆ど変わらないどころか
意味不明なレスポンスが帰ってきます
\bcc32>configure
'make' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
makeなんて一度も打ってないのに・・・
>>207
全く何も変わりませんが・・・
0210デフォルトの名無しさん
2006/10/14(土) 07:16:150211デフォルトの名無しさん
2006/10/14(土) 08:14:330212デフォルトの名無しさん
2006/10/14(土) 09:18:03ソースを落としてきて全てを検討して納得してから自分でビルド
もちろんコンパイラをはじめ全てのビルドツールもソースからチェック
0213デフォルトの名無しさん
2006/10/14(土) 10:07:210214デフォルトの名無しさん
2006/10/14(土) 11:18:05それはみんなやってる
0215デフォルトの名無しさん
2006/10/14(土) 11:35:23windowsのソース下さい。
0216デフォルトの名無しさん
2006/10/14(土) 11:40:05ごめん。windows使ってないわ
0217デフォルトの名無しさん
2006/10/14(土) 11:50:33つ Winny
0218デフォルトの名無しさん
2006/10/14(土) 12:40:00フルセットをインストールしてどうしたんだよ。
どういう操作をしたのか漏れなく書いてよ。
実行したコマンドはコピペしなさい。
0219デフォルトの名無しさん
2006/10/14(土) 12:46:12Winnyのソースも下さい。
0220デフォルトの名無しさん
2006/10/14(土) 13:12:4952a7c8047a12ec2594b94295f23d158b
0221デフォルトの名無しさん
2006/10/14(土) 14:40:42> \bcc32>configure
bcc32ディレクトリの下で実行してるのか?
mingwでやるならその上のバッチじゃないconfigureがあるディレクトリでやらないと。
> 'make' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
>
> makeなんて一度も打ってないのに・・・
bcc32/configure.batが内部で使ってる。
そこでエラーになるということは必要なものが全然インストールされてないということだ。
> >>207
> 全く何も変わりませんが・・・
どういう風にやった?
0222デフォルトの名無しさん
2006/10/14(土) 14:46:08>>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
の手順に従ってやってるか?
0223222
2006/10/14(土) 14:46:510224デフォルトの名無しさん
2006/10/14(土) 15:39:53BCCでは以下のような感じです
\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では出ますが・・・
勿論手順に従ってやってます
0225デフォルトの名無しさん
2006/10/14(土) 16:44:27> BCCでは以下のような感じです
> \bcc32>md build
> \bcc32>cd build
> \bcc32\build>configure
>>207
> md build
> cd build
> ..\bcc32\configure
ちゃんと見比べてみろ。
最後のはパス付きで実行する。
0226デフォルトの名無しさん
2006/10/14(土) 17:19:56gcc が起動できてls や bashが起動できないという状況がよくわからんけど、
bashが使えなきゃ configure を実行することができないので
それじゃビルドできんぞ(cygwin版でもmingw版でも)。
c:\cygwin\bin とか c:\cygwin\usr\bin とかにちゃんとPATH
通ってるか?
bcc のほうのエラーは見当もつかんなあ。
0227デフォルトの名無しさん
2006/10/14(土) 17:32:110228デフォルトの名無しさん
2006/10/14(土) 17:33:05str = "<a><b>2</b>ちゃんねる</a>"
とあって、「2ちゃんねる」
だけを抜き出したい時は、どう書けばいいでしょうか。
また、「<b>2</b>ちゃんねる」を抜き出す方法も知りたいです。
0229デフォルトの名無しさん
2006/10/14(土) 17:42:580231デフォルトの名無しさん
2006/10/14(土) 18:48:16どうすればいいのでしょう?
バイナリエディタで開いたときにAA BBなどと表示されるようにしたいのですが。
0232デフォルトの名無しさん
2006/10/14(土) 19:56:12書かれている通りにちゃんとやったら、BCCでconfigure、make共に実行する事ができました
ですが、最後の最後に以下のエラーが出てしまいました・・・
Fatal: ファイル C0X32.OBJ が開けません
** error 2 ** deleting miniruby.exe
これは如何すればよいのでしょうか?
>>226
cygwin mingwの両方でbashは使用不能です
cygwinの方ではlsは使えます
gccは両方とも実行できます
後、cygwinにPATH通す意味ってあるんですか?
cygwin.bat使ってるから要らないと思ってたんですが・・・
0233デフォルトの名無しさん
2006/10/14(土) 20:05:08cygwinなら
./configure
だ、ボケ。
それから、cygcheck -cとやって、makeがちゃんとインストールされてるかどうかチェックしろ、アホ
0234デフォルトの名無しさん
2006/10/14(土) 20:11:54cygwin.bat が bash 起動しないとかどんな設定してあるんだよw
0235デフォルトの名無しさん
2006/10/14(土) 23:05:26bash は通常のシェルとして使わずに cmd.exe からコマンド使ってるだけだが?
cygwin インストールしてもシステムのPATHは書き換えないだろ?
例の彼がデスクトップのショートカットとかから起動しているのか
不明だったから念のため確認とっただけだが。
0236231
2006/10/14(土) 23:10:14結構悩みました
0237デフォルトの名無しさん
2006/10/14(土) 23:14:06> cygwin インストールしてもシステムのPATHは書き換えないだろ?
書き換えてたような…
0238デフォルトの名無しさん
2006/10/14(土) 23:37:47rubyでpopen(モードはr+)したいのですが、c/c++のstdioやiostreamで標準入力を受け付けると、後に続く出力が返ってきているのか来ていないのかすら不明で、ruby側のIOのeof?メソッドやgetsメソッドで処理がブロックされて止まってしまいます。
popenで開く対象もrubyで書いた場合にも、似たような現象がおこります。
でもphpで書くと、なぜかスムーズにデータの受け渡しができてしまいます。
最終的にはどうしてもC++でやらなければならないので、何か解決法がわかる方いましたら宜しくお願いします。
0239238
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して、標準入出力のフィルタリングのようなことをしたいので、どうか宜しくお願いします。
0240デフォルトの名無しさん
2006/10/15(日) 00:26:24まさかBCC版のRubyだとか。
0241238
2006/10/15(日) 00:30:55レスどうもです。
ランタイムの問題、と言いますと、Rubyの側の問題な可能性があるということでしょうか?
いちおうRubyはCygwinのものです。
ActiveScriptRubyも今からインストールして試してみます。
0242238
2006/10/15(日) 00:57:20それで、やっぱりPHPが相手な場合だけ上手くいきます。
何が原因なんでしょう・・・?
0243デフォルトの名無しさん
2006/10/15(日) 01:06:26http://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/
MS-WIN32版のRubyでやってみれ。
Cygwin版は移植の問題を回避できるがOSとの整合性の問題がある。
周辺のツール類もWIN32版があるなら乗り換えた方がよさげ。
0244デフォルトの名無しさん
2006/10/15(日) 01:07:37$?
0245238
2006/10/15(日) 01:18:51了解しました。
試してみます!
>>244
ハングしたみたいに止まってしまうで、Ctrl+CでInterruptせざるを得ないんですけど、どのタイミングで$?を拾えばよいでしょうか?
ちなみに、もしLinux環境などでは問題なく動くとか、Windows環境で問題が再現した/しなかった、などの情報もありましたら宜しくお願いします。
0246デフォルトの名無しさん
2006/10/15(日) 01:19:32C++で試してみたら、確かにブロックするな。
ただ、C++側でflushしたらちゃんと動いた。
pipeの挙動ってこんなもんだったっけ???
0247238
2006/10/15(日) 01:24:38flushしたらできましたか!?
てっきり入力のせいだと思っていたんですけど、出力するときflushできてないのが問題だったのでしょうか?
ちょっと>>243の1.8.5をインストール中なんで、それからflushも明示的に書いて試してみます。
情報どうもです!
0248246
2006/10/15(日) 01:27:31flushするとちゃんと動いた。C++側では改行コードも出力してるんだけど・・・。
高水準のpipeは使ったことほとんど(全然?)無いから、この挙動が正しいものかどうかわからん・・・
0249238
2006/10/15(日) 01:35:57バッファにたまりっぱなしになってたから、popen側でいつまでも受信できなかったのか・・・orz
そういえばphpは暗黙flushがあったような気がしてきました。
解決です。どうもありがとうございました!!m(_ _)m
0250デフォルトの名無しさん
2006/10/15(日) 02:00:140251デフォルトの名無しさん
2006/10/15(日) 02:40:19> pipeの挙動ってこんなもんだったっけ???
普通はそうだ。
0252デフォルトの名無しさん
2006/10/15(日) 02:45:24Cなら setvbuf()
rubyなら STDOUT.sync = true
あるいは、呼出側でPTY.spawnを使うという手があるが、
WindowsじゃPTYはないんだよな。
0253デフォルトの名無しさん
2006/10/15(日) 02:59:29ほんといらいらするよ、あのほんよんでると
0254デフォルトの名無しさん
2006/10/15(日) 03:02:4742ページ 間でやっときたけど、
ここで
for i in 0 [email protected]
ってコードが出てくるけど、for なんて構文ここまでで説明されてないぞ!!!!!
それに...ってなんだよ!!! 言語の一部なのか単なる省略なのか いみわからん。
もっとまともにかけないの???????????????
まじむかつく、
0255デフォルトの名無しさん
2006/10/15(日) 03:42:55こんなキモチワルイ構文入れてぎゃーぎゃーいうくらいなら
高階関数ひとついれればいいだけじゃん
あーいらいらする
0256デフォルトの名無しさん
2006/10/15(日) 04:25:140257デフォルトの名無しさん
2006/10/15(日) 04:26:3545ぺーじでinjectっていう最高にキモチワルイメソッドがでてきたけど
もう本気でむかつくよ。なにこれ
0258デフォルトの名無しさん
2006/10/15(日) 04:35:54意味不明な言葉でぐだぐだせつめいされてもイラツクだけ!!!!!!!!
あああああああああああああああああああああうぜーーーーーーーーーーーーーーーーーーーーーー
0259デフォルトの名無しさん
2006/10/15(日) 05:02:580260デフォルトの名無しさん
2006/10/15(日) 05:36:420261デフォルトの名無しさん
2006/10/15(日) 07:52:08ところで、rubyのクラスで
クラス内でしか使わない、外には見せないインスタンス変数ってどうやって定義するの?
0262デフォルトの名無しさん
2006/10/15(日) 08:09:15わかりにくい名前を付ける
0263デフォルトの名無しさん
2006/10/15(日) 08:13:24感想は最後まで読んでからまとめて書いてくれ。
とりあえずお前の書き込みが頭悪すぎて不快だ。
0264デフォルトの名無しさん
2006/10/15(日) 08:21:030265デフォルトの名無しさん
2006/10/15(日) 08:31:23でもrubyでは利便性を選んだんでしょ。
大体他の言語でも、引数に2つ以上のラムダを渡すことなんか滅多にないし、常にブロックはメソッドの呼び出しより後ろにつけるって決まってるほうが、自分で書くときも他人のコード読むときも何かと迷うことが少なくなるとは思うよ。
0266デフォルトの名無しさん
2006/10/15(日) 09:42:070267デフォルトの名無しさん
2006/10/15(日) 11:44:230268デフォルトの名無しさん
2006/10/15(日) 15:41:320269デフォルトの名無しさん
2006/10/15(日) 15:47:20> Fatal: ファイル C0X32.OBJ が開けません
その答えはすでに>>208が書いている。
0270デフォルトの名無しさん
2006/10/15(日) 17:48:07スタートメニューにMinGW - MSYS - msysが登録されるので
それを実行すればターミナルが開いてbashが実行されます
もちろん、GCCやMSYSの実行ファイルへはパスは通った状態です
そこで、Rubyのソースを展開してあるディレクトリへCDして
./configure
bashとかだと、通常はカレントディレクトリにパスを通さないので明示的に
カレントディレクトリを指定しないと実行してくれません
configureが終了するとMakefileが出来ているので
make
すると、コンパイルできるはずですけどねぇ
0271デフォルトの名無しさん
2006/10/15(日) 18:11:08とりあえずスレ違いだから、どうしてもやりたいならスレ立ててやってくれ
あとスレ立てても別に告知しなくていいから
0272デフォルトの名無しさん
2006/10/15(日) 18:24:350273デフォルトの名無しさん
2006/10/15(日) 21:30:45という発想の幼稚さにはほとほとあきれるねwwwwwwwwwwwwwwww
0274デフォルトの名無しさん
2006/10/15(日) 21:33:01「ムカツクRubyピッケル本をイラツキながらも読んでみるスレ」
本当にお願いいたしました。
0275デフォルトの名無しさん
2006/10/15(日) 21:37:16本気でムカツクrubyピッケル本(この愛称も微妙だけどw)を
イラツキながらも広い心で読んであげようといういまどき珍しい寛大なスレです。
他のrubyの本を読んでいてイラついている人もどうぞ。
0276デフォルトの名無しさん
2006/10/15(日) 22:09:040277デフォルトの名無しさん
2006/10/15(日) 22:12:580278デフォルトの名無しさん
2006/10/15(日) 23:36:060279デフォルトの名無しさん
2006/10/16(月) 05:56:22http://pc8.2ch.net/test/read.cgi/tech/1160945741/
0280デフォルトの名無しさん
2006/10/16(月) 06:55:550281デフォルトの名無しさん
2006/10/16(月) 09:00:390282デフォルトの名無しさん
2006/10/16(月) 09:24:02つーか雑談したいやつもこっち行けよ。
ttp://pc8.2ch.net/test/read.cgi/tech/1159315598/
ここは主にエスパーが初心者をサポートするスレ。
0283デフォルトの名無しさん
2006/10/16(月) 12:50:40これがあったのに
Rubyは難しすぎ
http://pc8.2ch.net/test/read.cgi/tech/1156496224/
rubyで検索してからスレ立てなさいよね
0284デフォルトの名無しさん
2006/10/16(月) 13:13:270285デフォルトの名無しさん
2006/10/16(月) 13:26:330286デフォルトの名無しさん
2006/10/16(月) 13:31:190287デフォルトの名無しさん
2006/10/16(月) 13:40:430288デフォルトの名無しさん
2006/10/16(月) 13:41:23「排除」する前のMLがどんな状態だったか都合よく忘れてるだろお前
0289デフォルトの名無しさん
2006/10/16(月) 14:52:550290デフォルトの名無しさん
2006/10/16(月) 15:59:21ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ
びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび
ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ
最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最
強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強
!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!
!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!
るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!る
ぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅ
びぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅび
ぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ
最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最
強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強
!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!
!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!るぅびぃ最強!!
0291デフォルトの名無しさん
2006/10/17(火) 00:56:42http://d.hatena.ne.jp/sumii/20060928/1159394568
http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/sumii/20060928/1159394568
0292デフォルトの名無しさん
2006/10/17(火) 00:57:10文法勉強する前に挫折するとは思わなかったぜ
0293デフォルトの名無しさん
2006/10/17(火) 00:59:02$ep = "エピソード"
と入力して保存し
別のファイルで
require 'hoge'
file = open("text1.txt","w")
file.write($ep)
file.close
を実行後、text1.txtを開くと
「エピソード」が「エピメ[ド」
になってしまうのはなぜなのでしょうか?
0294デフォルトの名無しさん
2006/10/17(火) 01:08:33ruby -Ksで実行。
0296デフォルトの名無しさん
2006/10/17(火) 03:15:560297デフォルトの名無しさん
2006/10/17(火) 07:39:03マルチうざい
0298デフォルトの名無しさん
2006/10/17(火) 08:03:15curses
0299デフォルトの名無しさん
2006/10/17(火) 08:34:050300デフォルトの名無しさん
2006/10/17(火) 08:58:490301デフォルトの名無しさん
2006/10/17(火) 09:01:270302デフォルトの名無しさん
2006/10/17(火) 10:26:45$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です。
0303デフォルトの名無しさん
2006/10/17(火) 13:43:01後者は代入されるだろ。
0304デフォルトの名無しさん
2006/10/17(火) 15:10:34y||=(x=i) は動くなら意図(x=i; y||=x)通りだけど、 x=(y||=i) だと代入はされても意図しない動作(y||=i; x=y)
っていうかバグだ。
ごめんなさい。
前者についてはどうでしょうか。
parse.yでvar_lhs tOP_ASGN argとなっているので、argを全部持っていって評価しているならば
確かに俺の思ったように動かないと思うのですが……その先は読めないorz
0305デフォルトの名無しさん
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]] )
のように作りやすく便利な感じの代替方法って標準かなんかでないもんでしょうか
0306デフォルトの名無しさん
2006/10/17(火) 15:54:24/ODL1/ => "NEW1",
/ODL2/ => "NEW12,
うほほーい
}.each_pair do |oldstr,newstr|
str.gsub(oldstr,newstr)
end
0307デフォルトの名無しさん
2006/10/17(火) 15:55:44ハッシュより配列のがいいね
書き換える順番があるかもしれないしね
0308デフォルトの名無しさん
2006/10/17(火) 15:56:25[[/can you/, "I can't"], [/\?/, '!!!']].inject("can you say brain washing?"){|i, a| i.gsub(*a)} => "I can't say brain washing!!!"
配列にこだわるならEnumerable#zipも使えそう。
0309305
2006/10/17(火) 16:14:26書き込んだ直後に構造が思いっきりinject向けだと気がつきました
arr = [[/OLD1/,NEW1],[/OLD2/,NEW2],[/OLD3/,NEW3],[/OLD4/,NEW4]]
arr.inject(str){|result,pair| result.gsub(pair[0],pair[1]) }
で充分満たされます…まあ、もうちょい短くなるといいんですが、injectなら普段でも思い出せそうです
0310デフォルトの名無しさん
2006/10/17(火) 16:19:100311デフォルトの名無しさん
2006/10/17(火) 16:19:52arr = [[/OLD1/, 'NEW1'],[/OLD2/, 'NEW2'],[/OLD3/, 'NEW3'],[/OLD4/, 'NEW4']]
arr.each{|old, new| str.gsub!(old, new)}
0312デフォルトの名無しさん
2006/10/17(火) 16:30:090313デフォルトの名無しさん
2006/10/17(火) 16:33:35ども、そうでした orz
0314デフォルトの名無しさん
2006/10/17(火) 22:56:23「後者は」つってんのは「前者だと代入されない」って意味だ。
0315デフォルトの名無しさん
2006/10/18(水) 01:52:22>>260
ステレオグラムだったのか
0316デフォルトの名無しさん
2006/10/18(水) 01:58:17全部Rubyから呼べるようにした。
これだとアプリケーションの依頼があったときお客さんのところで即実装可能って感じ。驚く顔が目に浮かぶ。
0317デフォルトの名無しさん
2006/10/18(水) 04:33:110318デフォルトの名無しさん
2006/10/18(水) 09:27:18事実はわかった。
ありがとう。
仕組みはわかんないけど。
そもそもこれ代入できると何かまずいの?
もしかして1.9では代入されたりして。
0319デフォルトの名無しさん
2006/10/19(木) 00:20:45代入式は(代入の方向を考えれば当然だと思うが)右結合するので
y ||= x = i は
y ||= (x = i) と解釈され
以下と等価。
unless y
x = i
y = i
end
xには常に代入したいなら
x = i; y ||= i
とするしかない。
0320デフォルトの名無しさん
2006/10/19(木) 00:45:49a ||= b って、
unless a
a = b # 代入がされないことがある
end
と等価なの?
おれはてっきり
a = a || b # 必ず代入が起こる
かと思ってたよ。
結果は同じなんだけどさ。
0321デフォルトの名無しさん
2006/10/19(木) 02:23:57御教示ありがとうございます。
0322デフォルトの名無しさん
2006/10/19(木) 14:55:190323デフォルトの名無しさん
2006/10/20(金) 03:43:18http://d.hatena.ne.jp/sumii/20060928/1159394568
http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/sumii/20060928/1159394568
0324デフォルトの名無しさん
2006/10/20(金) 04:09:18ただのやつで
0325デフォルトの名無しさん
2006/10/20(金) 05:16:300326デフォルトの名無しさん
2006/10/20(金) 09:25:56Eclipse+RDT
0327デフォルトの名無しさん
2006/10/20(金) 09:31:030328デフォルトの名無しさん
2006/10/20(金) 11:38:170329デフォルトの名無しさん
2006/10/20(金) 13:29:030330デフォルトの名無しさん
2006/10/20(金) 13:32:07もし無いなら載せるべきじゃね?
0331デフォルトの名無しさん
2006/10/20(金) 13:53:40An error has occured. Try refreshing this page to reload your session.
0332デフォルトの名無しさん
2006/10/20(金) 14:53:30そのエラーメッセージに従ってリロードしてみたらどうなるの?
0333デフォルトの名無しさん
2006/10/20(金) 15:25:530334デフォルトの名無しさん
2006/10/20(金) 15:47:40リロードしてもエラーがでます。
何でだろう?
0335デフォルトの名無しさん
2006/10/20(金) 15:51:420336デフォルトの名無しさん
2006/10/20(金) 16:33:31その通りでした。
ありがとうございます。
0337デフォルトの名無しさん
2006/10/21(土) 00:13:19かいててマジでむかつくんだけど。
0338デフォルトの名無しさん
2006/10/21(土) 00:24:11他の言語のように書こうとするでない
0339デフォルトの名無しさん
2006/10/21(土) 00:25:52型チェックないとムカつくなら別の言語使ったら?
あえてRubyでやるなら
ハンガリアンと手動型チェック駆使してみるとかw
0340デフォルトの名無しさん
2006/10/21(土) 00:30:180341デフォルトの名無しさん
2006/10/21(土) 00:34:23型が重要なら Ruby は不向きだな。
0342デフォルトの名無しさん
2006/10/21(土) 00:45:200343デフォルトの名無しさん
2006/10/21(土) 01:55:58accessorつくってためしてみれ。
0344デフォルトの名無しさん
2006/10/21(土) 07:20:290345デフォルトの名無しさん
2006/10/21(土) 08:10:30TKをつかって最後にTk.mainloopをするプログラム draw_poly.rb、を実行したとします。
そのご、そこでできるウインドウを閉じてまた、draw_poly.rbを実行すると
application has been destroyedってでます。
draw_poly.rbを実行して実行を確かめて、ウインドウを閉じて、
draw_poly.rbを修正して
draw_poly.rbを実行して実行を確かめて、ウインドウを閉じて、
。。。
を一々irbから抜けずにやるにはどうしたらいいんでしょうか?
0346デフォルトの名無しさん
2006/10/21(土) 08:13:13再度初期化みたいなのが必要なんですか?
0347デフォルトの名無しさん
2006/10/21(土) 10:39:44なんかあったよ。検索してごらん
0348デフォルトの名無しさん
2006/10/21(土) 11:21:300349デフォルトの名無しさん
2006/10/21(土) 23:24:235^1.5とかの数値が欲しいときに、いちいちlogをとったりして変換するのが面倒なのですが。
0350デフォルトの名無しさん
2006/10/22(日) 00:40:050351デフォルトの名無しさん
2006/10/22(日) 09:04:45そんな演算子がありましたね。。
0352デフォルトの名無しさん
2006/10/22(日) 11:01:06> irb
/usr/bin/ruby: no such file to load -- ubygems (LoadError)
といわれてしまいます。
他の環境だと動くんですが。
cygwinで、ターミナルはPoderosaです。
DOS窓で、irb.batは動くんですが・・・。
0353デフォルトの名無しさん
2006/10/22(日) 11:02:13> which irb
/usr/bin/irb
> which ruby
/usr/local/win/develop/ruby/bin/ruby
cygwinのRubyと、OneClickInstallerのRubyが混在しちゃってるからかな・・・
0354デフォルトの名無しさん
2006/10/22(日) 13:50:170355デフォルトの名無しさん
2006/10/22(日) 20:42:140356デフォルトの名無しさん
2006/10/22(日) 22:43:38env -u RUBYOPT irb
0357デフォルトの名無しさん
2006/10/23(月) 14:34:35Tk.restart
0358デフォルトの名無しさん
2006/10/23(月) 14:45:550359デフォルトの名無しさん
2006/10/23(月) 15:47:32一発でできないのかなぁ(もちろん、日本語対応)?
jcode.rb とかを require して each_char とかしないとダメ?
どなたか教えてくださーい。
0360デフォルトの名無しさん
2006/10/23(月) 17:45:15def cstr2s(s)
idx = s.index(0.chr)
if idx
s[0..idx-1]
else
s
end
end
0361デフォルトの名無しさん
2006/10/23(月) 17:52:240362デフォルトの名無しさん
2006/10/23(月) 21:23:180363デフォルトの名無しさん
2006/10/24(火) 06:44:17┏┓ ┏┓ ┏━┓ ┏━┓
┏┛┗┓ ∧∧ ┗━┓ ┃ ┃ ┃ ┃
┗┓┏( つ ゚Д゚) ┏┓┃┏━━━┓ ┃ ┃ ┃ ┃
┏┛┗ \ y⊂ ) ┛┃┗━━━┛ ┗━┛ ┗━┛
┗┓┏ / \┓┃ ┏━┓ ┏━┓
┗┛∪ ̄ ̄ ̄\) ┛ ┗━┛ ┗━┛
0364デフォルトの名無しさん
2006/10/24(火) 09:11:03配布したいのですが、Rubyに限らずプログラミング全般に関して初心者
ゆえに、まとめ方がよく分かりません。あと、コーディングの作法について
も不安があります。
そこで、既存のプログラムを参考にしたいのですが、何かそれなりの規模
で初心者にも分析・理解しやすい、おススメのRubyアプリケーションまたは
ライブラリはないでしょうか?
0365デフォルトの名無しさん
2006/10/24(火) 09:13:360366デフォルトの名無しさん
2006/10/24(火) 13:51:070367デフォルトの名無しさん
2006/10/24(火) 14:10:14Rubyの前に日本語をどうにかしようね。
とりあえず、こんなんでいいのか?
% ruby -e 'system("ls")'
. ..
%
0368デフォルトの名無しさん
2006/10/24(火) 14:46:13# 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
#=> "あいう"
#=> "えおか"
#=> "くけこ"
0369デフォルトの名無しさん
2006/10/24(火) 15:48:12@a = ('0'..'9', 'A'..'Z', 'a'..'z');
0370359
2006/10/24(火) 15:52:03ありがとん!!
なるほど、split('') という手があるね。
いろいろ悩んだ末に
"あいうえおかきくけこ" =~ /^.{3}/
とかして $& と $' で left と right を代用しました。
でも、素直に left とか right があると良いのになぁと思いましたです。
0371デフォルトの名無しさん
2006/10/24(火) 18:02:57RubyでLEFT$やRIGHT$を使いたいと思ったことはないなあ。
p "1234567890"[-3,3]
"890"
0372デフォルトの名無しさん
2006/10/24(火) 23:22:13SJIS
=> nil
irb(main):002:0> puts "1234567890"[-3,3]
X0
=> nil
0373デフォルトの名無しさん
2006/10/24(火) 23:25:57文字単位で切ってるわけじゃないし
0374デフォルトの名無しさん
2006/10/24(火) 23:32:10def first(n)
self[/\A.{#{n.to_i}}/]
end
def last(n)
rindex(/.{#{n.to_i}}\z/) && $&
end
end
0375デフォルトの名無しさん
2006/10/24(火) 23:39:32sjisだと
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
こんなのであってますか?
0376デフォルトの名無しさん
2006/10/25(水) 01:40:05> jright
> jmid
吐いた
0377デフォルトの名無しさん
2006/10/25(水) 02:01:170378デフォルトの名無しさん
2006/10/25(水) 03:25:59すべて空白になってしまいます。
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]
ですが、どのへんに問題があるんでしょうか?
0379デフォルトの名無しさん
2006/10/25(水) 05:56:090380デフォルトの名無しさん
2006/10/25(水) 10:30:18プレフィックスは嫌いなので
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"
バージョンは?
0381デフォルトの名無しさん
2006/10/25(水) 10:56:48>>373
そもそも、発端の359は「日本語対応」と言っているのに...
考えてみたら、こんなのに正規表現を使うってのもなぁ
>>380
ていうか、$KCODE があるわけだし String クラスが不完全なだけじゃ?
0382デフォルトの名無しさん
2006/10/25(水) 12:45:150383デフォルトの名無しさん
2006/10/25(水) 12:58:25>>359を嫁
0384デフォルトの名無しさん
2006/10/25(水) 14:09:31irb(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"
です。
0385デフォルトの名無しさん
2006/10/25(水) 17:18:07Rubyで書くときTestって使ってる?
0386デフォルトの名無しさん
2006/10/25(水) 17:57:190387デフォルトの名無しさん
2006/10/25(水) 18:05:13CGIだとネットの先のサーバからではなくローカルから読んでローカルに吐き出させるの面倒だなあとか
そういうことは思わなくもないけど、Testユニットのうんたらかんたらで軽減するなら喜んで使う
0388デフォルトの名無しさん
2006/10/25(水) 18:18:49> ネットの先のサーバから
Rubyでスクリプト作ってる奴はそんなのばっかだな
WebサーバからHTML持ってきて加工して表示以外のCGIはないんか
0389デフォルトの名無しさん
2006/10/25(水) 19:41:54* 他言語のソースを吐くもの(実装コードとユニットテストコード)
* Excelとかをがーっと編集するもの(複数ブックにまたがる修正とか)
* 簡単なCGI
* 自動保守スクリプト
など
0390デフォルトの名無しさん
2006/10/25(水) 19:51:02FirefoxのGreasemonkeyもそうだけど、それだけ
「既存のサイトをいじってデータ取り出したい」という欲求需要があるってことなんだろうな
0391デフォルトの名無しさん
2006/10/25(水) 23:39:500392デフォルトの名無しさん
2006/10/26(木) 07:20:46v=2
end
val=1
init(val)
p val
とした実行結果が2になるようにしたいんですがどうしたらいいですか
Cのポインタを使った参照渡しみたいなことができますか
0393デフォルトの名無しさん
2006/10/26(木) 08:48:25v=2
end
val=1
p init(val)
0394デフォルトの名無しさん
2006/10/26(木) 09:03:39v1=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
にする場合はどうしたらいですか
0395デフォルトの名無しさん
2006/10/26(木) 10:45:31% 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"
のように、メソッドの後ろに '"' がひっついてきてしまいます。
コレなんででしょうか?
0396デフォルトの名無しさん
2006/10/26(木) 12:31:37def 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
0397デフォルトの名無しさん
2006/10/26(木) 12:46:40勉強になりました。ありがとうございました。
0398デフォルトの名無しさん
2006/10/26(木) 13:46:400399デフォルトの名無しさん
2006/10/26(木) 14:49:30若干だが
ヤマサ醤油とヒゲタ醤油のどっちがカッコいいかとかと同レベル
0400デフォルトの名無しさん
2006/10/26(木) 15:34:24"".to_st でも再現する。
ActiveSupportは無関係。
0401デフォルトの名無しさん
2006/10/26(木) 17:18:50おお、ホントだ。再現しますね。
これはそういう (望まれた) 仕様なんでしょうか?それとも単にバグ?
0402デフォルトの名無しさん
2006/10/26(木) 17:30:19URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。
ある程度できたのですが、
一行目の最後に改行が来ると決まって例外が発生します。
テキストの扱い方がまずいのかなと思い、
ファイル全体をprintしましたらキレイに出力されました。
どうのような原因がかんがえられるでしょか?
よろしくお願いします。
0403デフォルトの名無しさん
2006/10/26(木) 17:53:22まずその例外を見せろ。話はそれからだ。
0404デフォルトの名無しさん
2006/10/26(木) 17:57:430405402
2006/10/26(木) 18:27:55C:/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'
ほんとなんとなくでも良いのでアドバイスお願いします。
0406デフォルトの名無しさん
2006/10/26(木) 18:39:430407デフォルトの名無しさん
2006/10/26(木) 19:39:28大丈夫?(´・.・)っ【胃腸薬】
0408デフォルトの名無しさん
2006/10/26(木) 19:42:10ケチケチせずに出たエラー全部貼れよ。
0409デフォルトの名無しさん
2006/10/26(木) 20:00:44>URLリストをテキストファイル(秀丸・shift-jis)に書き出しています。
と聞いて、
>ちなみにnep/http のPOSTを使用したりしています。
という流れを予想した奴が何人いただろうか。
0410デフォルトの名無しさん
2006/10/26(木) 20:51:48予想できなかった
なんつーかあれだ、簡単で確実で動作の間違いない小さいスクリプトから
少しずつ改造して大きくしていくというアプローチがいいと思う
0411デフォルトの名無しさん
2006/10/26(木) 21:27:57v1+=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
になるようにしたいんですけど、どうしたらいいですか
0412デフォルトの名無しさん
2006/10/26(木) 21:31:040413デフォルトの名無しさん
2006/10/27(金) 17:24:20を厳密に整数値だけ受け付けるようにしようとしたら/^(\d+)$/でチェックするしかないの?
0414デフォルトの名無しさん
2006/10/27(金) 17:30:48begin
n = Integer(gets)
rescue
puts "数字じゃないよ。"
end
0415デフォルトの名無しさん
2006/10/27(金) 18:20:48ありがとうございます。
>Integer(gets)
これはじめてみるんですが、文法的にはどういうことなんですか?
キーワードか何かあったら教えてください。
0416デフォルトの名無しさん
2006/10/27(金) 18:30:590xa とかも受け付けるけどね。
0417デフォルトの名無しさん
2006/10/27(金) 18:31:000418デフォルトの名無しさん
2006/10/27(金) 18:39:08全く同意だがこの場合は単にまだ知らんだけだろう
Integerは組み込み関数
厳密にはRubyには関数は存在しないが、
なにやら便利な感じに使えるようにあらかじめいくつかそれっぽく定義されている
整数とみなせない字面を引数に持つと、to_iのように無理には変換せず例外を返す
0419デフォルトの名無しさん
2006/10/28(土) 01:25:36step1の結果を利用して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の書き方が染み付いてます。
0420デフォルトの名無しさん
2006/10/28(土) 01:38:52(ただしstep1とstep2はstep3の定義の中で呼ぶようにしてstep3だけ明示的に実行)
このクラスのインスタンスを生成する、という行為がいったいどういう意味なのか
頭を悩めてしまうような「ただ適当にまとめただけのクラス」ならその3
(ただしstep3は傍目にも最終結果であることが明白な名前にする)
その2は前時代的なので忘れてよし
こんなんでどう
0421デフォルトの名無しさん
2006/10/28(土) 15:03:46失格
おまえら2人ともプログラミングデザインの本読め
0422デフォルトの名無しさん
2006/10/28(土) 22:22:550423デフォルトの名無しさん
2006/10/29(日) 08:55:33Javaは軽く噛った身。
プロトコルは解らんが
JavaのinterfaceとRubyのmoduleは
一見似てるようで全然違う印象。
Javaのinterfaceは
クラスに依らない多態を実現する為に使い
実装は各クラスに任せるんだが
Rubyのmoduleは
複数クラスに共通(とは限らないが)の実装をする為に使い
クラスに依らない多態はRubyの仕様を利用して
「複数のクラスに同名のメソッドを実装」すれば良い。
0424423
2006/10/29(日) 08:57:120425デフォルトの名無しさん
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
ここに載っていないのですが行数取得関数はあるのでしょうか?
0426デフォルトの名無しさん
2006/10/29(日) 20:02:56させようとすると(putsとか)文字化けしてしまいます。
UTF-8で普段使ってるので、スクリプトの冒頭に
#!ruby -Kuを書いてみたり、 ruby -Ku スクリプト名で
指定しても結果は変わりません。どうやればいいのでしょうか?
0427デフォルトの名無しさん
2006/10/29(日) 20:23:490428デフォルトの名無しさん
2006/10/29(日) 22:09:09ruby以外でも、(perlとかも)文字化けしてしまうので、
ruby固有のケースではないみたいです。
システム自体の設定だと思うので、他で質問するか
もうちょっと自分で調べてみることにします。
0429デフォルトの名無しさん
2006/10/29(日) 22:09:54readlines → size
0430デフォルトの名無しさん
2006/10/30(月) 00:49:53馬鹿かお前は?
0431デフォルトの名無しさん
2006/10/30(月) 01:01:44readlinesでファイルを全て読み込みなおかつ配列に変換して保持するなど
システムに多大なる負担をかける悪魔のごとき所業であり断じて許すわけにはいかん
0432デフォルトの名無しさん
2006/10/30(月) 01:10:170433デフォルトの名無しさん
2006/10/30(月) 01:16:090434デフォルトの名無しさん
2006/10/30(月) 03:03:26rubyのスクリプト自身は、UTF-8になってる?
0435425
2006/10/30(月) 10:13:56レスをしてくれた皆さんありがとうございます。
とりあえず、行数をインクリでカウントして対応しようと思います。
0436デフォルトの名無しさん
2006/10/30(月) 19:01:06どこに出力して化けてるといってる?
単にUTF-8に対応してない端末エミュレータ使ってるとか。
0437デフォルトの名無しさん
2006/10/30(月) 21:38:03下記みたいなエラーが出てしまってインストールできません
<--- 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を使ってもインストールできませんでした
対処法を教えてください
0438デフォルトの名無しさん
2006/10/30(月) 22:11:41どうも。
インターフェイスみたいに形式だけ指定するんじゃなくて、実装を伴うんですね。
0439デフォルトの名無しさん
2006/10/31(火) 10:32:450440デフォルトの名無しさん
2006/10/31(火) 15:07:00そこで、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)
次に続く
0441デフォルトの名無しさん
2006/10/31(火) 15:09:54req.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
0442デフォルトの名無しさん
2006/11/01(水) 00:11:53ですが、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]
0443デフォルトの名無しさん
2006/11/01(水) 00:40:36scriptのつかんでいる入出力はtty(pty)じゃないとだめ、とか?
0444442
2006/11/01(水) 07:32:05ttp://www.linux.or.jp/JM/html/LDP_man-pages/man7/pty.7.html
とあったので、「telnet も script も同じ仲間なのか」と思い、
> PTY.spawn('script
としてみましたが、これは見当違いということでしょうか。
0445デフォルトの名無しさん
2006/11/01(水) 12:24:47漏れの環境だと、最後に w_f.puts 'exit'; r_f.read を入れてやったら動いた。
0446デフォルトの名無しさん
2006/11/01(水) 14:08:22というのを文字列sが10MB分くらいになるまで繰り返すんですが
前もってバッファを確保しておいて高速化してくれるものはないですか?
StringBuffer/Builderみたいなの。
0447デフォルトの名無しさん
2006/11/01(水) 14:32:560448デフォルトの名無しさん
2006/11/01(水) 14:47:16バッファを用意しておくよりは遅いかもしれないけど、計算量的には同等のO(N)になるし、10MBもあるなら文字列の連結を繰り返すO(N**2)よりは断然早くなることは期待できる。
まあバッファを用意できる方法がもしあればそれに越したことはないんだろうけど、もしないなら配列にpushしてjoinも捨てたもんじゃないと思われ。
0449デフォルトの名無しさん
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+
0450デフォルトの名無しさん
2006/11/01(水) 18:52:340451デフォルトの名無しさん
2006/11/01(水) 19:52:49やってみた。こっちも速かったのでデータ量を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
0452デフォルトの名無しさん
2006/11/01(水) 20:09:53はRubyのパーサが中で
s = s + "hogehoge"
と置換していて、Stringのインスタンスを毎回生成するので遅い。
Javaで
s+"hogehoge"+"hugahuga"
としたときに内部で(俺の記憶では)
new StringBuffer(new StringBuffer(s).append("hogehoge")).append("hugahuga")
となっていたのと似ている。
まあ何カ所か短い文字列を結合するだけでは違いは出ないと思うが。
あと、実用できないけど、この場合
x = "aaa...."
for i ...
a << x
のほうが早いのではないかと。
0453デフォルトの名無しさん
2006/11/01(水) 20:14:40実験ありがとう。配列join早いなあ。
ところで、試してないけど、この例みたいに回す回数が決まってるなら、
a = Array.new(1000000)
for i in 1..1000000
a[i] = "aaa...
end
の方が早かったりしないかな?
0454デフォルトの名無しさん
2006/11/01(水) 20:17:36GC。a+=b ってのは a = a + b の略だから、これをする毎に前の a がごみに
なる。a << b は a を延長して追加するからごみが出ない。Rubyは単純な
mark&sweepだからごみが増えればGCの処理時間も比例して増える。
参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。
ごみになった瞬間に回収されるから、mark&sweepの負荷がない。
0455デフォルトの名無しさん
2006/11/01(水) 21:55:07+=の場合は、
a
aa
aaa
aaaa
aaaaa
っていう風に、内部でコピーしなければならない文字列の長さがどんどん長くなっていくから、N回のループで(N*N/2)回(三角形の面積)かかる。
追加していくタイプは、一回一回の操作にかかる時間はどんなにaaaa・・・の長さが長くなっても、一定時間で追加できるから速い。
もちろんGCのほうにも同じだけの負荷は回っていると思うけど。
0456デフォルトの名無しさん
2006/11/01(水) 22:31:21ピンと来ないし面倒だなあ
0457デフォルトの名無しさん
2006/11/01(水) 22:38:26素直にStringBuilder的な物をサポートすべきだな。
といってもされないだろうからRuby.NETに期待だ。
0458デフォルトの名無しさん
2006/11/01(水) 22:48:210459デフォルトの名無しさん
2006/11/01(水) 23:05:43RUBY_PLATFORM 以外に何かありますか?
0460442
2006/11/01(水) 23:59:08次のようにして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は気休めだと思うけど、なんとなくつけてみました。
0461デフォルトの名無しさん
2006/11/02(木) 00:04:45アホやなぁ。
RubyはJavaと違ってStringがmutableなんだよ。
だからRubyのStringはStringBufferなんだよ。
+=のとき最適化されないのはおかしいとか言ったら張ったおすよ。
Javaではそもそも+=すら出来ないでしょ。
0462デフォルトの名無しさん
2006/11/02(木) 00:07:39>参照カウントベースのGCを持つPythonで試してみ、a+=bでもめっちゃ速いから。
遅かったよ。GCがどうとかは的外れだな。
0463デフォルトの名無しさん
2006/11/02(木) 00:40:340464デフォルトの名無しさん
2006/11/02(木) 00:50:49GC.disableしてからループ回してみたらどうだろう。
俺はGCがネックでもネックでなくても構わんのでやらんけどw
0465デフォルトの名無しさん
2006/11/02(木) 01:06:37そうか?俺のとこではかなり違うけど。
#### 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
0466デフォルトの名無しさん
2006/11/02(木) 01:33:08なんでPythonとこんなに違うのか知らんけど、GCのせいならゴミの数が同じ
下のコードで早くなるのはおかしくね?
t1 = Time.now
100.times do
s = ""
500.times do
s += "a"
end
end
t2 = Time.now
p t2 - t1
0467デフォルトの名無しさん
2006/11/02(木) 02:48:29アホやなぁ。RubyのStringでどうやってバッファを確保しろっちゅんじゃ。
0468デフォルトの名無しさん
2006/11/02(木) 03:03:26マジバカなのか?
0469デフォルトの名無しさん
2006/11/02(木) 03:22:57ディレクトリに戻ってしまうのですが、そうならないようにする方法はありますか?
0470デフォルトの名無しさん
2006/11/02(木) 03:30:040471デフォルトの名無しさん
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と同じだと言っている。
0472デフォルトの名無しさん
2006/11/02(木) 08:52:31GC はメモリを自前で管理する手間が少なくなるが
逆にそれを管理するのは面倒なものだよ
0473デフォルトの名無しさん
2006/11/02(木) 09:00:450474デフォルトの名無しさん
2006/11/02(木) 09:21:15エスパーにもう一つ質問したいんだが、RubyのStringで<<が何らかの形で最適化だか高速化だかがなされるのは、どういう仕組み?
文字列本体の内部表現として、「連続するメモリ領域(Cでいう配列)」を採用しているならば、連結する度に毎回malloc/reallocの類をするのは避けられないのでは?
・Rubyのpushが速いのは、線形リストの連結一回一回は一瞬でできるため。
・StringBuffer等バッファを使うと速いのは、一回一回の連結時にはすでに存在するメモリ領域に入れればいいだけであるため。
・Ruby等の+=然り、Perlのpush然り(?)、が遅いのは、連続するメモリ領域の形になっていて(つまり線形リストの類ではない)、おおよそ連結するたびに、�@全体をメモリ確保する処理と、�A元のデータをコピーする処理が発生するため。
っていう感じの認識なんだが、そうするとRubyの<<が速い理由がよくわからん。
>>452の言うとおり、RubyのStringはStringBuffer的な機能を果たすのか?
ソース嫁ばわかることかもしれんが、ちょっとした気の迷いで他力本願でいってみる。
気付いたら長文になってた。ゴメソ
0475デフォルトの名無しさん
2006/11/02(木) 09:42:120476デフォルトの名無しさん
2006/11/02(木) 09:49:140477デフォルトの名無しさん
2006/11/02(木) 10:11:57Shell.cd(dir)とやると
shell: current dir: なんとか
と表示されるのですが、直後にp Dir.pwdとすると、カレントディレクトリは
変わっていませんでした。
スクリプトを起動した元のシェルに移動先ディレクトリのパスを渡す・・・というのはどうやる
のでしょうか。
0478デフォルトの名無しさん
2006/11/02(木) 10:21:23少なくとも、標準添付されなくてはいけないほどの需要は無いんじゃないかな。
どうしても必要なら自分で拡張ライブラリで実装すれば良いんじゃね?
0479デフォルトの名無しさん
2006/11/02(木) 10:49:16Rubyスクリプトのhoge.rbに
END {
puts '/home/user/path/to/move'
}
とかputsで移動先パスを出力させておいて
DIRNAME=`./hoge.rb`
cd $DIRNAME
というシェルスクリプトでRubyスクリプトを起動する、ってことなんじゃねえの
死ぬほど格好悪く泥臭いがほぼ確実に動作するな
0480デフォルトの名無しさん
2006/11/02(木) 11:02:15raiseでエラーメッセージとして標準エラー出力にパスを出したほうがよくね
0481デフォルトの名無しさん
2006/11/02(木) 16:15:01<< はメソッド呼び出しだが、+= は代入式に展開される。
そうすると、全然 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言語のメモリ確保でやるのとじゃ全然違う筈。
0482デフォルトの名無しさん
2006/11/02(木) 16:46:06p "a'b".gsub(/'/,"\\\'")
abb
こうなってほしいのですけど。。
a\'b
0483デフォルトの名無しさん
2006/11/02(木) 17:36:32エスケープ文字を3つから4つに増やしてごらん (5つでもいいけど)。
理由はRubyリファレンスマニュアルのString#gsub項を見ることだな。
0484デフォルトの名無しさん
2006/11/02(木) 17:39:480485デフォルトの名無しさん
2006/11/02(木) 18:16:15struct 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倍ずつ。
許容量が減ることはない気がする。
0486デフォルトの名無しさん
2006/11/02(木) 18:29:19初心者は str.gsub(/.../, "...") 形式を使ったらダメ。ゼッタイ。
str.gsub(/.../) { "..." } だけ使うこと。
0487デフォルトの名無しさん
2006/11/02(木) 18:36:230488デフォルトの名無しさん
2006/11/02(木) 18:44:220489デフォルトの名無しさん
2006/11/02(木) 18:51:230490デフォルトの名無しさん
2006/11/03(金) 02:46:42a = `command`
としたときに、標準出力しかaに入りません。
標準エラーを得るにはどうしたらよいか教えてください。
0491デフォルトの名無しさん
2006/11/03(金) 03:27:20念のために書いておくが、>>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系は知らん。
0492490
2006/11/03(金) 03:39:350493デフォルトの名無しさん
2006/11/03(金) 06:18:35require "open3"
a = nil
Open3.popen3("command"){|stdin, stdout, stderr|
a = stderr.read
}
なんてのも。
これならシェルには依存しない。プラットフォームには依存するが。
0494デフォルトの名無しさん
2006/11/03(金) 13:18:34is
a
pen
先頭のフィールドを削除して改行で区切って出力したいのですが
変数 a を使わずに出来ますか?
ruby 1.8.5 (2006-08-25) [i486-linux]
0495デフォルトの名無しさん
2006/11/03(金) 13:24:330496デフォルトの名無しさん
2006/11/03(金) 13:35:59ありがとうございます
-1 で配列の最後の要素になるんですね
0497デフォルトの名無しさん
2006/11/03(金) 23:22:33というハッシュがあるとき,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
0498デフォルトの名無しさん
2006/11/03(金) 23:31:42C#を使おう
−−− というわけで、このスレ終了 −−−
0499デフォルトの名無しさん
2006/11/03(金) 23:40:540500デフォルトの名無しさん
2006/11/03(金) 23:46:52こんな感じでいいんじゃね?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
0501デフォルトの名無しさん
2006/11/04(土) 00:03:12おお,ありがとうございます
0502デフォルトの名無しさん
2006/11/04(土) 13:21:22↓
引数を利用してサイトを巡る
↓
巡ったサイトを処理してデータ抽出
↓
抽出データを整形してブラウザに表示
というCGIスクリプトを書いてます。
途中の処理が遅くてユーザーにブラウザの中止ボタンなどを押される可能性があるので、
そういう時にはPStoreあたりでサーバにいくつかのデータを途中保存したいと思います。
「ブラウザ側からCGI動作を中止された」ことを検知する方法はありますか?
0503デフォルトの名無しさん
2006/11/04(土) 13:55:17その例ならデータの抽出整形までは完了するはずだからその後適当に保存なり何なりすれ
0504デフォルトの名無しさん
2006/11/04(土) 23:50:01例えば、a=0011;b= 0001;のときc=a+bとするとc=0100となるようにしたいのですが、
0baなどとしてもダメだし、String#%メソッドもうまい使い方がわかりません。
0505デフォルトの名無しさん
2006/11/05(日) 00:18:00"0b0100".to_i(2)
0506デフォルトの名無しさん
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)
とか怒られます。…なんで?
0507デフォルトの名無しさん
2006/11/05(日) 15:09:11そんなんいちいち気にするな禿げるぞ
添削に出すのでもない限りクラスで作っとけ
0508デフォルトの名無しさん
2006/11/05(日) 15:39:150509デフォルトの名無しさん
2006/11/05(日) 17:51:55>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
0510デフォルトの名無しさん
2006/11/05(日) 17:55:45> よく考えたらインスタンスを1回しか作らないので。
特異メソッドにでもしとけ。
class << (Hoge = Object.new)
def data; return 'hello'; end
def hello; puts data; end
end
Hoge.hello
0511デフォルトの名無しさん
2006/11/05(日) 19:02:18class なんとか って書くとまとまりになって
メソッド定義でいちいち def なんとか.hoge と書かないといけなくて面倒だけど
a=なんとか.new と最初に実行するように俺の中で決めておくと
def hoge と書いても動くようになるので書きやすくて便利とかそういう程度の認識しかない
0512デフォルトの名無しさん
2006/11/06(月) 08:46:16入力内容を表示する確認画面を作っているんですが、
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全てが列挙されます。
参照の仕方を間違っているのか、何か根本的に間違ってるのでしょうか?
0513デフォルトの名無しさん
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" }
0514デフォルトの名無しさん
2006/11/06(月) 22:39:23それの前に Content-type:text/html を出力してしまってるに3ガバス
クッキーはヘッダですので最初に送って下さい
0516デフォルトの名無しさん
2006/11/07(火) 04:14:59Log4jみたいに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のよい解説サイトってないですか?
0517デフォルトの名無しさん
2006/11/07(火) 07:00:03log4rはしらんけど、loggerというライブラリが標準添付されているのでそちらではどうでしょうか。
http://jp.rubyist.net/magazine/?0008-BundledLibraries
http://www.ruby-lang.org/ja/man/?cmd=view;name=Logger
0518デフォルトの名無しさん
2006/11/07(火) 11:38:04サーバーを起動するときに
ruby script\server
のようにいちいちプロンプトに入力せずに
サーバーを立ち上げるよい方法はありますか?
0519デフォルトの名無しさん
2006/11/07(火) 12:16:38例外のメッセージと同じような感じで、任意のオブジェクトを持ち出すことはできますか?
def main
begin
action1
action2 # メソッドのすげえ深部でエラーErrorAtAct2が起こる
action3
rescue ErrorAtAct2
# 「action2深部でエラーを起こしたときのハッシュデータを利用して別の処理をしてエラー回復」
end
end
ということをしたいです。
例外を起こしたメソッドの中でならハッシュデータにアクセスはできるんですが、
できればここのmainメソッドでまとめてエラー回復処理を書きたいです。
例外メッセージにハッシュを出力するとハッシュへの復元がなんだか面倒です。
0520デフォルトの名無しさん
2006/11/07(火) 20:07:59例外オブジェクトにハッシュを持たせればいいんじゃね。
class ErrorAtAct2 < StandardError
attr_reader :data
def initalize(data)
@data = data
end
end
def action1
h = {:a => 1 raise Error
0521デフォルトの名無しさん
2006/11/07(火) 20:09:42ごめん。途中で送って島田。
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
0522デフォルトの名無しさん
2006/11/07(火) 20:40:26↓こっちで聞いた方がよいかも。
【Agile】Ruby on rails相談所 part2【DRY】
http://pc8.2ch.net/test/read.cgi/php/1151254378/
こっちも人いないけど。
0524デフォルトの名無しさん
2006/11/09(木) 00:08:35シェルを介さないsystemでコマンドを実行しているんですけど、
コマンドの実行結果(stdout, err両方)を文字列で取得したいんだけどどうすればいいんですか。
0525デフォルトの名無しさん
2006/11/09(木) 00:23:11open3かな?
http://www.ruby-lang.org/ja/man/?cmd=view;name=open3
0526デフォルトの名無しさん
2006/11/09(木) 01:21:27環境かいてませんでした。すんません。
mswin32なんでopen3だとfork がNotImplementedErrorになりました。
でもそこからリンクをはってあるpopen4だといけました。
ありがとうございます。
0527513
2006/11/09(木) 07:23:20CGI#out でクッキーを出力するやり方はわかったのですが、
例えばoutのブロックの中では文字列しか出力出来ませんよね?
途中で色々処理したい場合なんかはどうやればよいのでしょうか?
これはもちろんエラーですが、以下の様な感じの場合です。
cgi.out("cookie" => cookie){
(0..4).each{|i|
print i + "\n"
}
}
0528デフォルトの名無しさん
2006/11/09(木) 08:33:56cgi=CGI.newとしたとして、具体的に何が作られるんだかさっぱりです
cgi1.paramsとcgi2.paramsの違いあるのかとか
cgi1.outとcgi2.outが同じページになるのかとか
0529デフォルトの名無しさん
2006/11/09(木) 09:19:12CGIってSingletonだとずっと思っていたが、そうじゃないのね
0530デフォルトの名無しさん
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インスタンスを引数とかで連れて行くしかないな
0531513
2006/11/09(木) 12:41:410532513
2006/11/09(木) 13:36:42cgi.headerでやればいいと思ったのですが
これだと食べてくれません…
何方か助言を。
0533デフォルトの名無しさん
2006/11/09(木) 13:50:56インスタンス変数をkeyに、そのインスタンスのアドレス(ポインタ?)をvalueに持つhashを
作成したいのですが、アドレスをどういう形で得るのかが分かりません
簡単な質問かもしれませんがよろしくお願いします
館今日はWinXPでrubyのヴァージョンは1.8.5です
0534デフォルトの名無しさん
2006/11/09(木) 14:24:380535デフォルトの名無しさん
2006/11/09(木) 14:35:21同じページって言う意味がよくわからんのだが、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マニュアルを手元に置いておこう。
0536デフォルトの名無しさん
2006/11/09(木) 14:50:550537513
2006/11/09(木) 15:22:44いや、クッキーを複数出力したいんじゃないんです。
それはもう出来てるんです。
自分がわからないのは、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を一気に書き出すのではなくて
途中にプログラムの処理を挟みたいんです。
根本的に何か勘違いしているかもしれないんですが…
0538513
2006/11/09(木) 15:25:52cgi.out({"charset" => "shift_jis"}){…}
こうしてました。
0539デフォルトの名無しさん
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/ですか?
0540デフォルトの名無しさん
2006/11/09(木) 16:29:49釣りか?
>>514,515
これで了解したんじゃなかったのか?
マニュアルのURLを提示したんだから一通り読みなさい。
すごく分かり易いとは言えないが必要十分な情報が書いてある。
だいたい何を参考に作業してるんだy。
0541デフォルトの名無しさん
2006/11/09(木) 16:40:37ページってのはあれだ、たぶん
「クライアントからGETとかPOSTとか受け取って解釈してクライアントに出力結果渡す」
という一連の処理が「1ページ」ぶんなんだろう。1画面遷移とゆーか。
だから、cgi2=CGI.newとかが成功してしまうと、
「これって他のメソッドで作ったcgiインスタンスとどこが違うんだ?」と悩みの種に。
CGI#paramsはARGVを整理してくれるだけのメソッド
CGI#outはContent-Type:text/html\n\nを前につけてくれるだけのputs
と割り切ると気楽だと思う。
0542533
2006/11/09(木) 16:47:16では複数のインスタンスのなかから、
値がインスタンス変数と一致するようなインスタンスを探し出すためには
どのような手段を取ればよいのでしょうか?
0543デフォルトの名無しさん
2006/11/09(木) 16:57:50普通に使うぶんには代入でオブジェクトがコピーされることはない
参照が増えるだけで、メモリ上の実位置は動かない
0544デフォルトの名無しさん
2006/11/09(木) 17:01:490545513
2006/11/09(木) 17:10:53いや釣りじゃないです…
出力の途中に処理を挟みたい場合はどうするのかが知りたいんです。
↓こういうのって出来ないですよね?
cgi.out().out("cookie" => cookie){
"test"
}
print 'test2' #ここが出力されないから…
0546デフォルトの名無しさん
2006/11/09(木) 17:19:38/[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/ が返される。
0547533
2006/11/09(木) 17:43:39普通にインスタンス変数を使うとはどういう意味でしょう?
たとえば、親・子の2つのレベルからなる木構造で
各レベルには複数のノードがあり親ノードは複数の子ノードを持つとします
まず親ノードを生成し、次に子ノードを生成します。
この時、子ノードが自分の親を決める為に与えられているのは
親のインスタンス変数の値でこれが一致すると親が一意に決まります
これを判断させるためにインスタンス変数をキーに、アドレスをバリューにしたハッシュを作ろうとしていたのですが、
アドレスが得られないらしいので何か解決策はありませんか?
0548デフォルトの名無しさん
2006/11/09(木) 17:46:380549デフォルトの名無しさん
2006/11/09(木) 18:09:03だから、マニュアルを読めと。
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 を出力したい場合などに使います。
> このメソッドは文字列エンコーディングを変換しません。
0550デフォルトの名無しさん
2006/11/09(木) 18:41:18str == (hoge or hage or huga)
ではなく
(str == hoge) or (str == hage) or (str == huga)
のように意識して書く癖つけたほうがよくねえか
0551デフォルトの名無しさん
2006/11/09(木) 18:46:590552513
2006/11/09(木) 19:19:02レスどうも!
なるほど、よく分かりました!
しかし今ちょっと試してみたんですが
cgi.out("cookie" => cookie){
func
}
みたいに関数は実行出来るみたいですので、これでなんとかなりそうです。
お騒がせしました!
0553デフォルトの名無しさん
2006/11/09(木) 19:43:190554513
2006/11/09(木) 20:04:05これで完璧でした!ありがとうございました!
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>'
0555デフォルトの名無しさん
2006/11/09(木) 20:04:21CGI#outのブロック引数は、最終的に組み上がった文字列(HTMLでもCSVでもPDFでも何でもいい)を返しさえすれば
後は好き勝手やっていいんだよ。
例えば意味はないけどこんなのとか。
x = 5
cgi.out("text/csv") do
out = ""
x.times{|i| out << "#{i},#{i*10},#{i*100}\n"}
out
end
ブロックの効能についてはなるべく自分で調べて欲しいが。
0556デフォルトの名無しさん
2006/11/09(木) 21:01:49mutable なオブジェクトは全部
ポインタみたいなもんだから
むしろポインタだらけ
0557533
2006/11/09(木) 23:56:32object_idとObjectSpace._id2ref()で実現できそうです
0558デフォルトの名無しさん
2006/11/10(金) 01:17:35そもそもネストしないならこれだけの話。
tree = {}
node = Object.new
leaf = Object.new
tree[node] = leaf
leafを複数持つにしても
tree = Hash.new{|h,k| h[k] = []}
でデフォルトで配列を作るようにすりゃ仕様上は済む話だが。
ObjectSpaceを使うのは構わないが、普通は使わないトリッキーな方法だという認識は必要。
0559デフォルトの名無しさん
2006/11/10(金) 03:53:08Ruby 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の基本動作のようなところで抜けている知識が多いと思います。
不正確な書き方も多いと思いますが、どうかご教授ください。
0560デフォルトの名無しさん
2006/11/10(金) 04:04:520561559
2006/11/10(金) 05:09:10わかりました。環境変数でオプション指定してたんですね。
ありがとうございます。
0562デフォルトの名無しさん
2006/11/10(金) 07:45:04>>557で作ればそりゃ動くだろうけど正直かなりバカっぽいよな
0563デフォルトの名無しさん
2006/11/10(金) 08:39:10そこにたどり着くまでにえらい遠回りしてるっぽいのだが、
いったいどのドキュメントを読んだせいでそうなったのだろうか。
参考までに教えてほしい。
初心者スレとしては、初心者が迷いなくCGIプログラムを勉強できるように
したいので。
0564デフォルトの名無しさん
2006/11/10(金) 09:44:00>>554とか>>557とかトンデモなコードが多いな、最近。
初心者スレとしてはこれじゃ困るだろ。
0565デフォルトの名無しさん
2006/11/10(金) 11:35:26html=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}
たとえばこんな感じか?
0566デフォルトの名無しさん
2006/11/10(金) 11:50:18CGIはそんな感じだと思う。
HTMLを文字列(か配列)の連結で最後まで作り切っておいて、クッキーを必要なら作って、
HTTPヘッダを必要ならハッシュで作って、CGI#outや自前のprintで一気に表示指示。
1回だけしか使われないデータにハッシュを使うとリソースもったいなくて死ぬとか
逐次出力して捨てれば済む話なのに巨大な変数として保持するなんざ極刑ものだとか
ケチくさいこと言わない限り、初心者的にはふつーに考えるとこのへんに行き着くと思うんだが…
0567デフォルトの名無しさん
2006/11/10(金) 12:12:30これで出力したいんです。
print <<-HTML
html
HTML
0568デフォルトの名無しさん
2006/11/10(金) 12:26:34残念なお知らせがある。
CGIは適当にやっても絶対に動かない、ということだ。
HTTPヘッダとHTTP通信の最低限の知識が絶対に要る。
0569デフォルトの名無しさん
2006/11/10(金) 12:48:27とかじゃダメなんですか?
print "Content-type:text/html\n\n"
print <<-HTML
<html><body>
HTML
色々処理
print <<-HTML
</body></html>
HTML
0570デフォルトの名無しさん
2006/11/10(金) 13:00:09>>566にメインストリームではないと断じられたことを気にしてる?
…出力に関わるメソッドが多くなってくると
「HTML内容を変数などで溜めておいて最後にまとめて出力」させるスタンスが
書いてて楽になるんだよ。
スクリプト内のあっちこっちで出力してるとデバッグとかも面倒だ。
面倒でないと思うなら、面倒になるまで続けていてもいいだろ。
もしかしたら面倒に感じないかもしれないし。
0571デフォルトの名無しさん
2006/11/10(金) 13:26:550572デフォルトの名無しさん
2006/11/10(金) 14:01:50半ばobsoleteな代物なので、皆さんフレームワークを使ってください。
RoRをはじめ、色々ありますから。
eRubyでもいいけどbinding渡さなきゃならんとか、じゃあクラス化した方がいいのかとか初心者には悩みが多い稀ガス。
そんで適当なクラス書くくらいならフレームワーク入れろと。
0573デフォルトの名無しさん
2006/11/10(金) 14:06:26CGI作るのにわざわざWebアプリフレームワークを別途導入しろとな
(まあ、RoRはそう大掛かりなものでもないが)
0574513
2006/11/10(金) 15:20:40例えば、下のふたつの場合
どちらがパフォーマンス的に優れてるのでしょうか?
if (0..99999).include?(3)
end
(0..99999).each{|v|
if v == 3
end
}
0575デフォルトの名無しさん
2006/11/10(金) 15:30:27おかえり。
CGI書くときに参考にしたものを教えてよ。
整数なら以下がたぶん最速だし、Rangeなんぞ使うべきでない。
0 <= 3 && 3 <= 99999
0576デフォルトの名無しさん
2006/11/10(金) 15:40:16% 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?だな
つーか、この人が参考にしてるサイトなり書籍なりはいったい何なんだろうという疑問が
0577513
2006/11/10(金) 15:41:14一瞬なんですが、どの様になってるんでしょう?
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
0578513
2006/11/10(金) 15:48:36>>575
やはりinclude?が一番速いみたいですね…
参考にしてるのはやはりリファレンスマニュアルです。
しかしまだ全然Rubyで書いたコード量が少ないんで経験不足です…
こんどちゃんと書籍を買って一から勉強しないとダメですね。
0580デフォルトの名無しさん
2006/11/10(金) 16:07:300581デフォルトの名無しさん
2006/11/10(金) 16:11:50範囲って何よ、みたいな
0582513
2006/11/10(金) 18:43:20よかったらダメ出しお願いします…
http://komachi.s101.xrea.com/counter.rb
0583デフォルトの名無しさん
2006/11/10(金) 18:47:55見て欲しければ
RUBYの宿題教えてください。
http://pc8.2ch.net/test/read.cgi/tech/1106572657/
このスレあたりに移動して
スクリプトだけどっかのあぷろだにでも上げな
0584デフォルトの名無しさん
2006/11/11(土) 04:15:27どのファイルをrequireしたか、
絶対パスで得る方法ってないでしょうか??
0585デフォルトの名無しさん
2006/11/11(土) 12:12:14w
perlで良くね?
w
0586デフォルトの名無しさん
2006/11/11(土) 13:03:09入力を
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になります。
なぜでしょうか。
0587デフォルトの名無しさん
2006/11/11(土) 13:04:03rule
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
0588デフォルトの名無しさん
2006/11/11(土) 13:05:00args: arg
| args ',' arg_item
arg : NUMBER
| IDENT
| RANGE
pow : POW '(' exp ')'
range : NUMBER RANGE NUMBER
end
0589デフォルトの名無しさん
2006/11/11(土) 13:06:49| array
| pow
| range
| IDNET ← IDENTじゃないの?
| NUMBER
0590デフォルトの名無しさん
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
0591デフォルトの名無しさん
2006/11/11(土) 14:34:49__FILE__
これでパスも含めたファイル名が取得出来ますよ。
0593デフォルトの名無しさん
2006/11/11(土) 15:55:06File.dirname(__FILE__)で良いんじゃない?
0594・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/11/11(土) 16:14:140595デフォルトの名無しさん
2006/11/11(土) 16:34:56皆の親切なレスがわからないのであれば、とりあえず
・CGI.newは1回だけ。CGI.outも1回だけ。
・出力する内容は別のStringとかにためておき、確定してからCGI.outする。
とすればよいと思うよ。そういうもんだと思ってくれ。
0596513
2006/11/12(日) 08:38:22確かに(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
0597デフォルトの名無しさん
2006/11/12(日) 10:55:17html << %(<font size="#{v}">test</font><br>)
}
0598デフォルトの名無しさん
2006/11/12(日) 11:23:18return 'ruby'
end
puts "Hello, #{name.upcase}!"
#{ } で埋め込めるのは変数だけだという思い込みがある時期は確かにあるな
0599デフォルトの名無しさん
2006/11/12(日) 11:32:02html=''
(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
0600513
2006/11/12(日) 12:01:01#{}で展開も出来るんで、他のhtmlをそのままコピペで流用出来るのが楽で
ヒアドキュメントを使ってただけなんですけどね。
でもやっぱりコードが見づらいかもしれないですね。
>>597
これはかなり目から鱗でした。
0601デフォルトの名無しさん
2006/11/12(日) 21:45:26GDGTSGSGSGSGSG
のような文字が格納されているファイルで
各文字数をカウントしたいのですがこの場合どうすればよいのでしょうか?
splitで文字列を分割しようと思ったのですが、この場合1文字ずつ分割できないと思い
.unpack(a1)とやったのですがエラーがでてしまいました。
どうすれば負荷をちいさくカウントできるのでしょうか?
0602デフォルトの名無しさん
2006/11/12(日) 22:27:48これでどうですか?
print 'AABBBCCCC'.scan(/S/).size
あと一文字ずつの分割はこれで出来るみたいですよ。
'AABBBCCCC'.split('').each{|v| print v + "\n" }
0603デフォルトの名無しさん
2006/11/12(日) 22:30:37print 'AABBBCCCC'.scan(/B/).size
0604デフォルトの名無しさん
2006/11/12(日) 22:37:05その場合は、AかBかCがOKってことですよね
あらかじめ分かってないと無理ってことですよね
0605デフォルトの名無しさん
2006/11/12(日) 22:54:42while 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にエラーがでてきたのですが、どう間違っているのでしょうか
0606デフォルトの名無しさん
2006/11/12(日) 22:57:51あとエラーは読め
英語だから読めないとかは無し
無理してでも読め
0607デフォルトの名無しさん
2006/11/12(日) 23:00:00この様にしてはどうでしょう?
a = ['A','B','C']
s = 'AABBBCCC'
a.each{|v| print v + ':' + s.scan(/#{v}/).size.to_s + "\n" }
0608デフォルトの名無しさん
2006/11/12(日) 23:00:260609デフォルトの名無しさん
2006/11/12(日) 23:13:09file = open(filename)
while text = file.gets.chomp!.upcase do
text.split('').each{|moji|
count[moji] += 1
}.each{print count[moji]}
end
file.close
なんじゃね?
0610デフォルトの名無しさん
2006/11/12(日) 23:19:47arr=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個
0611デフォルトの名無しさん
2006/11/12(日) 23:55:02Unix の chmod と同じ形式でパーミッションを
変更したいのですが変換法則が分かりません。
% chmod 644 foo.txt
% ls -l foo.txt
-rw-r--r-- foo.txt
irb % File::Stat.new(foo.txt).mode
=> 33188
どうすれば 644 が 33188 になるんでしょうか?
0612デフォルトの名無しさん
2006/11/13(月) 00:08:13puts "#{"%o"%33188}"
100644
0613デフォルトの名無しさん
2006/11/13(月) 00:17:32パーミッションの表示なんていいとこ4桁だろ
0614デフォルトの名無しさん
2006/11/13(月) 00:36:50なるほど。
そうすると引数の頭に100をくっつけて10進数に変換すればいいんですね。
mode = "644"
p Integer("0100#{mode}"
=> 33188
おお。
>>613
そうか、スティッキービットを立てるときは四桁ですね。
じゃあ、この方がいいのかな。
mode = "0644"
foo = 100000 + mode.to_i
p Integer("0#{foo}")
=> 33188
0615デフォルトの名無しさん
2006/11/13(月) 09:59:181行ずつ処理したいのですが、その場合どうすればよいのでしょうか?
grepのやりかたじゃできない気がするのですが・・・
0616デフォルトの名無しさん
2006/11/13(月) 10:55:58英語だから読めないとかは無し
無理してでも読め
そもそも>>605の考え方でも充分動作するはず
というか、なんつーか、基礎がまだなってねー
とりあえずハッシュの使い方と変数のスコープの勉強しれ
0617デフォルトの名無しさん
2006/11/13(月) 10:57:20なんとかhash使ってできました。
ただ、何故
gets.chomp!.upcaseは同時にできないのでしょうか?
分割すればできたのですが。
0618デフォルトの名無しさん
2006/11/13(月) 11:04:17chomp! は改行取らなかったらnil返すから
リファレンス嫁
0619デフォルトの名無しさん
2006/11/13(月) 11:05:43英語だから読めないとかは無し
無理してでも読め
つか「できない」とか言うな
エラーきちんと書き写せ
エラーはたいてい正確に原因を指摘する
0620デフォルトの名無しさん
2006/11/13(月) 11:11:590621デフォルトの名無しさん
2006/11/13(月) 11:17:40なるほど。ありがとうございます。upcaseもnilを返すみたいですね。
これらを使うときは代入しないほうがいいみたいでした。
あと、ARGV[0]でファイルを指定してプログラムを実行する場合なのですが、
ファイルを指定せずプログラムだけを実行すると、デフォルトのエラーが出力されますよね。
この場合、引数を指定しなかった場合のエラーをあらかじめプログラムで記述したエラーを表示するには
なんのメソッドを使えばよいのでしょうか?
0622デフォルトの名無しさん
2006/11/13(月) 11:25:21該当する例外(いわゆるエラー)に対処するための「例外処理」を記述する
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
==============
を実行結果
エラー:引数にファイル名が必要です
0623デフォルトの名無しさん
2006/11/13(月) 11:31:02ありがとうございます。勉強になりました。簡単に指定できるんですね。
もうひとつ合って申し訳ないのですが
Perlで
while(<>) とやれば指定したファイルからファイルを1行ずつ最後まで読み込んでくれたと思うのですが
Rubyでは、これに当たるやつはないのでしょうか?
<>だけで簡単に引数を指定できてると思うのですが、RubyではARGV[0]しかしらないのです。
0624デフォルトの名無しさん
2006/11/13(月) 11:31:53たのしいRubyって本しかもってないのですが、
他のRuby入門書も詳しくはかいてないような
オライリーとか出してないみたいだし。。
0625デフォルトの名無しさん
2006/11/13(月) 11:35:23while gets で、コマンドラインで指定したファイルから $_ に1行ずつ読み込まれるよ。
もうちょっと真面目に書くなら、while line = ARGF.gets とかARGF.each_line |line| だが。
0626デフォルトの名無しさん
2006/11/13(月) 11:39:29そこで出るのは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
みたいな「引数が空ならメッセージ出して終了」な処理を入れること。
引数の有無はスクリプト全体にとって致命的だから
複雑でないスクリプトなら後者で一箇所でまとめて判定したい俺。
0627デフォルトの名無しさん
2006/11/13(月) 11:58:15勉強になりました。ありがとうございます。
メモっておきました。
0628デフォルトの名無しさん
2006/11/13(月) 12:42:05ARGVは引数が無いと空配列だから、
ARGV[0]はnil
なんで>>626が言う通りTypeError
0629デフォルトの名無しさん
2006/11/13(月) 13:13:20Rubyのスクリプトをコマンドラインで実行した場合、
戻り値0 : 正常終了した場合
戻り値1 : 例外が発生した場合
のようですが、
戻り値2 や戻り値-1を返すにはどうしたらよいのでしょうか?
環境はLinuxです。
0630デフォルトの名無しさん
2006/11/13(月) 13:14:310631デフォルトの名無しさん
2006/11/13(月) 13:18:04Rubyプログラムの実行を終了します。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に変更されています。
0632デフォルトの名無しさん
2006/11/13(月) 13:23:26KISS
0633デフォルトの名無しさん
2006/11/13(月) 14:18:21Pythonのctypes見たいなのありますか?
もろDLLのテストツールを紹介してくれたらベストですが…Ruby実装のものは無さそう
0634デフォルトの名無しさん
2006/11/13(月) 14:30:230635デフォルトの名無しさん
2006/11/13(月) 15:32:050636デフォルトの名無しさん
2006/11/13(月) 16:08:10ま、とりあえずDLでもチェックしてみるといいよ。
0637デフォルトの名無しさん
2006/11/13(月) 16:30:35プログラミングRuby 第2版「言語偏」「ライブラリ編」
0638デフォルトの名無しさん
2006/11/13(月) 16:42:04初版はたいした役に立たなかったんだけど、第二版はいいの?
0639デフォルトの名無しさん
2006/11/13(月) 16:58:36Rubyをそれなりに究めれば採用されますか?
0640デフォルトの名無しさん
2006/11/13(月) 17:07:52プログラミングの習得に挫折しない保証があるなら採ります
まあ偽装のロクな仕事じゃないけどな
0641601
2006/11/13(月) 17:30:10while 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の文字数は個別にカウントして
それ以外の文字をまとめてカウントできるとおもったのですが、どうも正規表現で指定するとうまくいきません。
というか、正規表現では無理かな。
どのように変更すれば指定した文字以外をまとめてカウントできるのでしょうか?
よろしくおねがいします。
0642デフォルトの名無しさん
2006/11/13(月) 17:41:04めんどくさがらないでcount["A"], count["Z"], count["G]以外
全部足せばいいんじゃね? とオモタ
0643デフォルトの名無しさん
2006/11/13(月) 17:41:35そろそろ何のためにそんなけったいなことをしてるのか教えてよ
「それ以外」の合計と「それ」の合計を求めて引けばいいだろう。
方法は好きにやれ。
0644601
2006/11/13(月) 17:47:34A-Z ひらがなとか漢字あわせるとかなり多いのですが・・・
これはプログラムとしては欠点な気がするのですが。
>>643
なんのためっていうか、ファイルからよく使う文字を集計してるのですよ。
特定の文字をメインに。
0645デフォルトの名無しさん
2006/11/13(月) 17:59:050646642
2006/11/13(月) 17:59:17…イテレータ使えば?
total = 0
count.each_value{|val| total += val }
とか。
それても気にしてるのは実行コスト?
0648デフォルトの名無しさん
2006/11/13(月) 18:05:28total = 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"
0649デフォルトの名無しさん
2006/11/13(月) 18:21:110650デフォルトの名無しさん
2006/11/13(月) 19:54:23Perlでは普通に%fやったらでたのですが
rubyで小数点いれるにはどうしたらよいのでしょうか?
"37/100".to_fやっても0.0となってしまいます
実際数字のところは、変数ですが
0651デフォルトの名無しさん
2006/11/13(月) 19:57:29数字を変数にしたらStringになってんじゃね?
0652デフォルトの名無しさん
2006/11/13(月) 20:09:340.0
>>651
まあ、そういうことだろうな
「x/100」という5文字の文字列に対して to_f したらそりゃ 0.0 だ
というか明示的に小数を含んで計算すれば小数表示されるぞ
p 37.0/100
0.37
んで答えはこうか
x=37
p x/100.to_f
0.37
0653デフォルトの名無しさん
2006/11/13(月) 20:20:47ありがとうございます。無事できました。
でも、変数/変数*100.0でやったら少数表示されませんでした。0.0と表示されて一応少数か。
小数点第何位で区切ろうとしたら、やはりprintfを使わないといけませんよね。
ちょっと面倒ですね。
0654デフォルトの名無しさん
2006/11/13(月) 20:59:24みたいにやっても有効桁指定できない・・・
0655デフォルトの名無しさん
2006/11/13(月) 21:11:25引数を指定しないとプログラムがおかしくなりますが、エラーはでないんですね
この場合の例外処理はどうすればよいのでしょうか?
0656デフォルトの名無しさん
2006/11/13(月) 21:13:24x : 全体桁
y : xのうちの少数桁
0657デフォルトの名無しさん
2006/11/13(月) 21:15:16puts '%03d' % 12.3456
> a.rb
012
> ruby -e "puts '%03d' % 12.3456"
d
>ruby -v
ruby 1.8.5 (2006-08-25) [i386-mswin32]
なんだこりゃ?
0658デフォルトの名無しさん
2006/11/13(月) 21:17:07この場合も何も、例外処理なんて begin rescueしかない。
while gets って、受け取った入力は何処に入れてるんだ?
0659デフォルトの名無しさん
2006/11/13(月) 21:23:58受け取った入力は、変数にいれてます
begin
while line = gets
.
.
.
rescue
puts ほにゃらら
end
みたいにやっても、引数なしで実行すると
改行された画面みたいにしかならなくてエラー名も何もでないのですが・・
0660デフォルトの名無しさん
2006/11/13(月) 21:24:29$_
0661デフォルトの名無しさん
2006/11/13(月) 21:26:57ありがとうございます。助かりました。
ついでにもうひとつとねがいしたいのですが、
printf("%3.1f",hensu,"\n")
34.1% みたいにしたいのですが、%はどこにいれればよいのでしょうか?
fのあとにスペースしていれたり、\をつけて文字としてあつかうようにしてみたのですが
無理でした。
0662デフォルトの名無しさん
2006/11/13(月) 21:28:17マニュアルくらい読め
その調子だとこの先もわからないことがあったら全部人に聞くだろ
0663デフォルトの名無しさん
2006/11/13(月) 21:29:32if ARGV.empty?
$stderr.puts "Error"
exit 1
end
while ...
0664デフォルトの名無しさん
2006/11/13(月) 21:29:57ただの gets は Perl のダイヤモンド演算子のように振舞う。
つまり、引数がないときは標準入力の内容を読む。
引数の有無で例外処理をさせたい場合には使用してはいけない。
0665デフォルトの名無しさん
2006/11/13(月) 21:30:49一応、rubyリファレンスマニュアルに目をとおしてるのですがよくわからなかったので・・・
何か例文集の本とか買ったほうがいいのかな
0666デフォルトの名無しさん
2006/11/13(月) 21:33:04http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=sprintf%A5%D5%A5%A9%A1%BC%A5%DE%A5%C3%A5%C8
0667デフォルトの名無しさん
2006/11/13(月) 21:34:17> 引数の扱いの詳細については sprintfフォーマット を参照してください。
ときちんと誘導されてると思うんだが
0668デフォルトの名無しさん
2006/11/13(月) 21:37:01「引数の扱いの詳細」という日本語が、
初心者にとって良くないのかも。
0669デフォルトの名無しさん
2006/11/13(月) 21:37:27すみません。このx.y のようにするとは思わなかったので・・・
今再度確認したらやはりちょっとわかりにくいですね。
>>663
なぜ exit 1 なのでしょうか?
デフォルトでは0が終了ステータスと書いていましたが、
1というのはエラーで終了したということでしょうか?
0670デフォルトの名無しさん
2006/11/13(月) 21:37:51ふつーの人はアレ読めないって
0671デフォルトの名無しさん
2006/11/13(月) 21:43:30というか、肝心なとこに限ってえっらいわかりにくいんだよな
どっか別の場所で知識つけてきて初めて高速に読み飛ばせるハイパーなマニュアル
>>669
終了ステータスの勉強するといい
Rubyどうこうではなく、コマンドの正常終了時は0で、異常終了時は0以外だ(時々守られてないが)
自分ひとりで使うぶんにはまったく気にしなくてもいいが、癖をつけておくと良
0672デフォルトの名無しさん
2006/11/13(月) 21:46:28ありがとうございました。
デフォルトが0なのは、正常終了したプログラムを別のプログラムに渡すためなのでしょうね。
1つの簡単なプログラムだと別にexitは指定しなくていいっぽいですね。
Cをちょっとかじったときは、EXIT_SUCCESS とか常につけるようにしていましたが。
0673661
2006/11/13(月) 21:47:46printf("%3.1f",hensu,"\n") の"%3.1f"の中に文字としての%をつけくわえるのは
可能なのでしょうか?
sprintfマニュアルみてもそれっぽいのがなんかなかったのですが・・・
0674デフォルトの名無しさん
2006/11/13(月) 21:49:44`%' 自身を出力するには `%%' とします。
0676デフォルトの名無しさん
2006/11/13(月) 22:28:33結果は、Perlのほうがはやいものでした。
プログラムの作り方によるのかもしれませんが、一般的にPerlのほうがはやいのでしょうか?
Rubyでは、hashつくってsplitとしてイテレーターつかってるから遅いのかな
0677デフォルトの名無しさん
2006/11/13(月) 23:29:32print "#{key}:\t"
}.print("\n").each{|value|
print "#{value}:\t"
}
key: key: key: key:
value: value: value: value:
というように表示したいのですが、上記のようなプログラムでは
keyを全部出力したあとに改行されませんでした。間に改行をいれるにはどうすればよいのでしょうか?
count.each
printf "\n"
count.each
というようにわけずにかきたいのですが・・・
0678デフォルトの名無しさん
2006/11/13(月) 23:33:07自分にとって理解しやすいように書くという気はないんか
0679デフォルトの名無しさん
2006/11/14(火) 00:05:380680デフォルトの名無しさん
2006/11/14(火) 00:32:39printのところとったら動きましたよ
ただ改行がなかっただけで正確でした
0681デフォルトの名無しさん
2006/11/14(火) 00:56:120682デフォルトの名無しさん
2006/11/14(火) 00:58:09プッ
初心者はこれだからwwww
その前の
each{|key,value|
print "#{key}:\t"
}
というブロックに決まってるじゃないか
0683デフォルトの名無しさん
2006/11/14(火) 01:03:59どんな動作になるかよくわからんな(w
というかここの部分でエラーとかは出んのか…?
irb> {'key'=>'value'}.each{|k,v| print k,v}.print "\n"
keyvalueNoMethodError: private method `print' called for {"key"=>"value"}:Hash
…。どうやって動いたんだ…?
0684デフォルトの名無しさん
2006/11/14(火) 01:17:04クライアント側はWindowsであることを想定してます。
Web上で入力したデータを Excel フォーマットに整形して取得したいのですが、、、
0685デフォルトの名無しさん
2006/11/14(火) 02:05:39あと、90パーセントくらいまでの要件は、Excelファイルをどうしようとかではなく
・タブ区切りかCSVでRubyが吐き出したものをユーザーにローカルに保存させてユーザーがExcelで読む
ことで用が済む
0686デフォルトの名無しさん
2006/11/14(火) 08:29:12Windowsで使ってるんですが、
C:\ruby\lib\ruby以下に、site_ruby, 1.8, gemsってなってます。
バージョンに寄らずに一定のライブラリが入ってるみたいですけど、
よく分かりません。
0687677
2006/11/14(火) 08:58:06key: key: key: key: key: key:
このようなエラーになってしまいます。
どうすれば改行をいれられるのでしょうか?
0688デフォルトの名無しさん
2006/11/14(火) 09:22:25分けて書くのが見易いし良いと思うけど。
count.each{|k| print("#{k}:\t")}
printf "\n"
count.each{|v| print("#{v}:\t")}
0689デフォルトの名無しさん
2006/11/14(火) 09:31:36count.each_key{|k| print("#{k}:\t")}
print("\n")
count.each_value{|v| print("#{v}:\t")}
というより、これに何の意味があるの?
count.each{|k,v| … }.each{|v| … }
0690677
2006/11/14(火) 09:41:41ありがとうございます。
1行でかきたかったんですね。あと、できるのかというのも含めて。
思ってたのですが、#{k} こういうかっこでかこうのって面倒ですよね
なんか意外なんですが
0691デフォルトの名無しさん
2006/11/14(火) 09:47:210692デフォルトの名無しさん
2006/11/14(火) 10:33:26大量のテキスト処理をするスクリプトにwxRubyでGUIをつけたところ、
終了までに物凄く時間がかかるようになってしまいました。(環境は
Winです)ところが、ウィンドウの上でマウスホイールをクルクルやると、
なぜか、時間がかなり短縮されます。
印刷のときにもこれをやると効くらしいのでWindowsの仕様なの
かもしれませんが、スクリプトの側でコントロールするとかって、
できないものでしょうか?
0693デフォルトの名無しさん
2006/11/14(火) 11:18:52Cではsizeofを使っていたのですが。
何文字目からですか?
10000
何文字目までですか?
430000
みたいに段階をおっていきたいのですが
0694692
2006/11/14(火) 11:20:30http://d.hatena.ne.jp/softether/20060505
0695693
2006/11/14(火) 12:24:34!title
私の数字は3です。
これからもよろしくお願いします。
また後で。
みたいなファイルがあったとして、この中の、!行は無視して
11文字めの「れ」から28文字目の「後」までの文字を抽出したい場合、
どうすればよいのでしょうか?
このように文字数が少ない場合だと、一度に全行を読み込んでも問題ないのでしょうが
行が多い場合だとやはり、全行読むのはやめたほうがよいですよね。
それも考えるとどう処理していけばいいのかがよくわからないです。
0696デフォルトの名無しさん
2006/11/14(火) 13:07:27何文字目か記憶する変数をoffsetとして定義する(1で初期化)
それぞれの行をlineとして読み込む
lineから改行文字を削除
lineが!で始まっていたら次の行へ
lineが何文字目から何文字目にあたるかoffsetから計算する
20文字目から40文字目までなら最初から途中までが範囲内だから出力
offsetにlineの文字数を足す
まあ、全行読み込めるならそのほうが楽だな。
0697デフォルトの名無しさん
2006/11/14(火) 14:17:05b = <STDIN>
print "#{a}"
print "#{b}"
これじゃ、入力できないのですが何故なのでしょうか
0698デフォルトの名無しさん
2006/11/14(火) 14:21:51エラーは読め
英語だから読めないとかは無し
無理してでも読め
というかそれ以前の気もするが
どこか解説サイトあるいは入門書籍などを一通り読んで勉強してみることを強く推奨
0699デフォルトの名無しさん
2006/11/14(火) 14:24:44リファレンスと書籍よんだのですが、
C言語のscanfにあたるものがのってなかったのですが・・・
ARGVじゃちょっと違うし
0700デフォルトの名無しさん
2006/11/14(火) 14:28:50./test.rb:1: syntax error
a=<STDIN>
^
./test.rb:2: syntax error
なぜRubyスクリプトでRubyの文法を無視するんだ?
0701デフォルトの名無しさん
2006/11/14(火) 14:44:44書籍に書いてないし、リファレンスにもないので困っております
0702デフォルトの名無しさん
2006/11/14(火) 14:47:52< > ←これは何よ?
0703デフォルトの名無しさん
2006/11/14(火) 14:54:06periに池
0704デフォルトの名無しさん
2006/11/14(火) 15:30:39<>をつけないで最初やったら、エラーがでたので
つけてみたのですが、やはり無理でした
0705デフォルトの名無しさん
2006/11/14(火) 15:41:150706デフォルトの名無しさん
2006/11/14(火) 15:44:390707デフォルトの名無しさん
2006/11/14(火) 15:59:50「RubyはPerlではない」
2. "ドットの前"のものがどんな種類のものなのか常に意識する
3. 『たのしいRuby』の第1部から第3部あたりを通して流し読みする
4. 単に「エラーが出ました」とか他人にとって意味不明なことを口にしない
5. $stdin.gets と書く
0708デフォルトの名無しさん
2006/11/14(火) 16:09:49明らかに後者だ
何も知らない者は自分で何かを作ることができないし
何も知らない者が一文字書く度に聞きなおすのに付き合うほどこのスレは暇じゃない
0709デフォルトの名無しさん
2006/11/14(火) 16:18:20ttp://www.ruby-lang.org/ja/man/?cmd=view;name=scanf;em=scanf
0710デフォルトの名無しさん
2006/11/14(火) 16:33:22はい心がけます。
しかし、この本、stdin.getsという言葉は1回もでてこなかったのですが・・・
0711デフォルトの名無しさん
2006/11/14(火) 16:42:02だから何?
標準入力として$stdinは紹介されてるし、それがIOオブジェクトに属することもきちんと書いてある。
IOオブジェクトioから1行読み込むio.getsも解説があるだろ。
それでわからないならプログラミングにそもそも向かないからすっぱり諦めろ。
プログラミングに向かない人は一定数いるし、それは知能が低いことや人間としての欠陥を全く意味しない。
気にせず諦めろ。
0712デフォルトの名無しさん
2006/11/14(火) 17:06:08本人じゃないからどう考えてるか知らんが。
PerlにあるならRubyにも同じものがあるもんだっつー思いこみを捨てるとか、資料は読むだけじゃなくて意味を勉強しろとかは言いたい。
まあPerlで幸せなら無理してRubyを使う必要はないとも言えるが。
0713デフォルトの名無しさん
2006/11/14(火) 17:22:06711じゃないけど、「やりたい気持ちを止められない」ってのも大切な要素だよね。
本当に好きなら、多少頭が悪かろうが、効率悪いコードしか書けまいが
諦めずに続ける事が出来るもんね。
printf("Hello, World!\n");
初めてプログラム書いて、これ実行して何も感じないなら「向いてない」って事かもしれないね。
0714デフォルトの名無しさん
2006/11/14(火) 17:41:52line.chomp!
str = ""
str << line
end
print "#{str}"
これのどこが間違っていますか?
プログラム実行してもエラーが出ません。引数にファイルを指定しています。
あめんぼあかいな
あいうえお
きたちょうせん
みたいな中身ですが、それぞれの文字を結合できないのでうが・・・
0715デフォルトの名無しさん
2006/11/14(火) 17:53:53>>714
「変数のスコープ」について調べるといい
0716デフォルトの名無しさん
2006/11/14(火) 18:09:23p line
line.chomp!
str = ""
str << line
p str
end
print "#{str}"
-------------
"あめんぼあかいな\n" ← p line
"あめんぼあかいな" ← p str
"あいうえお\n" ← p line
"あいうえお" ← ここのstrが期待と違う
"きたちょうせん\n"
"きたちょうせん"
きたちょうせん
--------------
ということで、どうやらstrが毎回空になってる模様、と推測する。
で、原因は>>714の言うスコープ。しかも微妙な原因。
whileはスコープを作らないんで、一般的なスコープの問題ではないんだけど、やっぱスコープだ。
0717デフォルトの名無しさん
2006/11/14(火) 18:43:290718デフォルトの名無しさん
2006/11/14(火) 18:49:01まあ、繰り返しの途中から始まってるのが問題だからスコープ…かなあ
「繰り返しの途中で毎回空文字列がセットされてるのが原因だぴょん」でよくね?という気はする
0719デフォルトの名無しさん
2006/11/14(火) 18:56:00いや、空文字列が一番の原因じゃないぜ
0720デフォルトの名無しさん
2006/11/14(火) 19:10:09str への空文字列の代入を最初に1回だけ行えばよい。
0721デフォルトの名無しさん
2006/11/14(火) 19:11:07初心者には意外な落とし穴なのかね
0722デフォルトの名無しさん
2006/11/14(火) 19:26:56でも用が足りるわけだからね
別に str='' をwhileの「前」に出す必要はない
ブロックとスコープうんたらの問題と同じような解決法で
わかりやすく問題が解消されるのは事実だけど
0723デフォルトの名無しさん
2006/11/14(火) 19:37:25でどうだ!
0724デフォルトの名無しさん
2006/11/14(火) 19:39:09str ||= ''
# 流れを読まずに書いてみる
0725デフォルトの名無しさん
2006/11/14(火) 19:44:05その手の演算子嫌いなんだよね
読み下しにくいっていうか絶対半年後とかに書き間違う
0726デフォルトの名無しさん
2006/11/14(火) 19:55:56あまり初心者に勧められる方法じゃないと思うが。
0727デフォルトの名無しさん
2006/11/14(火) 20:01:24という啓蒙活動でよろしか
str = ""
while line = gets
line.chomp!
str << line
end
print "#{str}"
0728デフォルトの名無しさん
2006/11/14(火) 20:36:30他の言語がある程度分かってないと、理解し難い部分が沢山ある様な気がするし…
出来れば、JavaとかC++とか覚えた後に使うのがいい様な気がするけど。
0729デフォルトの名無しさん
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
0730デフォルトの名無しさん
2006/11/14(火) 21:06:110731デフォルトの名無しさん
2006/11/14(火) 22:41:590732デフォルトの名無しさん
2006/11/14(火) 23:20:500733デフォルトの名無しさん
2006/11/14(火) 23:23:34require "benchmark"
0734デフォルトの名無しさん
2006/11/14(火) 23:26:15>>731
ぶっちゃけどれも全く知らないがブロック構文は1週間も使ってれば覚えたぞ
0735デフォルトの名無しさん
2006/11/14(火) 23:27:42rb_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;
}
0736デフォルトの名無しさん
2006/11/14(火) 23:30:19初心者ですがまったくわかりません。
* と int と VALUE が
0737デフォルトの名無しさん
2006/11/15(水) 00:12:36これはrubyインタプリタプログラムそのもののソース。言語はC。
で735が何を云いたいのか憶測してみると
1. Array#<<の実装は rb_ary_push()関数
2. Array#pushの実装は rb_ary_push_m()関数
3. rb_ary_push_m()関数は内部でrb_ary_push()関数に仕事(の一部)を任せている
ゆえに: Array#<<の方が少し効率が良さそうなもんだ
か?
0738デフォルトの名無しさん
2006/11/15(水) 00:23:21分かりやすいほうを選ぼう。
速度やメモリ使用量は困ってから考えればいい。
0739デフォルトの名無しさん
2006/11/15(水) 08:45:32本がでてないと思うのですが
0740デフォルトの名無しさん
2006/11/15(水) 08:47:26GUIが欲しければ他の言語使え
0741デフォルトの名無しさん
2006/11/15(水) 08:52:33文字列連結も
str = str + 'hoge'
よりも
str << 'hoge'
のほうが早いしメモリも使わずに済む
ただ、<< は若干わかりにくいし
一般用途上は誤差レベルなので好きにやっていい
コンマ1秒の差が生死を分けるとかそういうチューニングが必要な人向け
0742デフォルトの名無しさん
2006/11/15(水) 09:50:18io = File.open(out, "w")
io.string ?
0743デフォルトの名無しさん
2006/11/15(水) 09:53:110744デフォルトの名無しさん
2006/11/15(水) 10:01:09FileクラスとIOクラスの関係は序盤の山場だ
何も考えずにドットでくっつけるだけで書いてると、ここで必ず手が止まる
ここがきちんと理解できれば他の場面でも応用が利く
(というか、よく知らないクラスでも普通に利用できるようになる)
頑張って踏ん張れ
0745デフォルトの名無しさん
2006/11/15(水) 10:11:52String#+ と 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)
0746デフォルトの名無しさん
2006/11/15(水) 10:17:10なるほど。ありがとうございます。
しかし、File.open だとFileオブジェクトにopenしろといってるんですよね。
io = といったみたいな形にしないと
closeできないのでは?
IOクラスのサブクラスがFileだから、io=とかを指定しない場合でも、
io.closeで閉じられるということかな
io.writeのほうが{}ないにイテレータで入ってるから、io.writeで閉じられるのは分かりますが。
{}の外(後)にio.closeと書くとioがさしているのがわからないような・・・
それとも、io.closeとすると入出力のために開いていたもの全てを閉じるという意味なのでしょうか
0747デフォルトの名無しさん
2006/11/15(水) 10:26:12io.write(text)
io.close
FIle.open{|io|
io.write(text)
}
この2つは同じ動作をする
ioの"寿命"も1行目で生まれて3行目で死ぬという点で同じだ
というかどっかそのへんに解説書いてないか?
ブロックを利用するとcloseを明示的に書く必要がなくて便利ですとか何とか
0748デフォルトの名無しさん
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ってどうなってますか??
0749デフォルトの名無しさん
2006/11/15(水) 10:58:47File を open したままにしておくようなコーディングは、C言語レベルでの誤動作
の原因となるため、あまり好ましくありません。きちんと明示的に close すること
が大切です。
だそうである。
0750デフォルトの名無しさん
2006/11/15(水) 11:04:47やっぱ、なるべく
File.open('file', 'r'){|f| s = f.read }
みたいに書いた方がいいみたいですね。
今まで散々ガベージコレクトがあると思って
File.open('file', 'w').write(s)
とか書きまくってたけど…
まぁこれも一応「重大な問題」は無いんですよね?
0751デフォルトの名無しさん
2006/11/15(水) 11:49:01それはそうだが、Rubyの最大のボトルネックはGCだし、過度に
頼らないほうがいいと思われる。マーク&スイープっていう古い
アルゴリズムだから。
ジェネリックなGCにするとかいう話も出てるけど。
0752' ’
2006/11/15(水) 12:02:25すみません、見ていて気づきませんでしたが、いわれるとたしかにそうでした。
ありがとうございます。
File.open(out, "w"){|io|
io.write(string)}
out = $stdin.gets
string="文字列
このようになっているのですが、ファイル名を標準入力からいれて出力すると
inputname?
みたいに、?がファイル名の最後についてしまうのですが何故でしょうか?
一応ファイルの中は見られました。File.openの際の指定の仕方がおかしいのでしょうか。
0753デフォルトの名無しさん
2006/11/15(水) 12:43:47つまり、outがファイル名ってこと?
ならp outしてみてくれ。
改行がくっついてるかもしれん。
0754デフォルトの名無しさん
2006/11/15(水) 12:55:45コードの意図を説明しろ。
実行したコマンドはコピペしろ。中途半端に説明しようとするな。
実行結果はpで出力したものをコピペしろ。中途半端に説明しようとするな。
0755' ’
2006/11/15(水) 13:10:02outは、stdinで入力したファイル名が格納されるやつです。
p outをしたところ改行がついていました。
out = $stdin.gets.chomp! とした所
?がなしのファイル名になって、正常になりました。
標準入力の度に、文字列扱ってファイル名などに使うときはchomp!としないといけないのでしょうか?
少し面倒な気がするのですが。デフォルトで改行なしのほうがよさげな気がするのですが。
0756デフォルトの名無しさん
2006/11/15(水) 13:12:25なるほど、そういう内部事情もあるんですか。
処理系の実装とかの問題はよく分からないんですが
Rubyの内部実装の出来ってどんな感じなんでしょうかね??
例えばまだまだ改良の余地、大幅な速度向上とか可能なんでしょうか?
他のスクリプト言語に比べて文法が複雑だし、インタプリタという事もあり
解析→処理の部分でコストが掛かってスピードアップって難しいと思ってたんですが。
バイトコードで処理出来ればかなりアップしますかね?
開発者の人達には頑張ってもらいたいですね。
0757デフォルトの名無しさん
2006/11/15(水) 13:18:31ウザイ。
0758デフォルトの名無しさん
2006/11/15(水) 13:21:18無茶ゆーなw
0759デフォルトの名無しさん
2006/11/15(水) 13:29:35getsで受け取ってファイルオープンする場合は
改行を取らないとエラーになるよ。
fn = gets.chop
File.open(fn, 'w'){|f| f.write(fn) }
print fn
0760デフォルトの名無しさん
2006/11/15(水) 13:33:32小難しい表現になってるところも多いが、難しくない書き方しているところも多い
0761デフォルトの名無しさん
2006/11/15(水) 13:51:25普段の非コンピュータ感覚との乖離というか。
------------
ねこだいすき
ねこねこだいすき
ごろにゃん
------------
という3行の文章があったとして、これを
str = io.gets
するとだな、
> 一行読み込んで、読み込みに成功した時にはその文字列を返します。
というマニュアルの表現を素直に解釈すると、最初の str は、
「ねこだいすき」
になるはずだと思うだろ。でも実際は
「ねこだいすき\n」
だ。
文章ならまだしも
puts "ファイル名を入力してください"
filename=$stdin.gets
とかいうプログラム書いた場合、
filenameには改行がくっついてるというのは予想の範囲外だと思う。
0762デフォルトの名無しさん
2006/11/15(水) 13:52:16了解しました。ありがとうございました。
$stdin.gets で
数字以外や、英数字以外など 決まった文字以外の入力じゃないとエラーにしたい場合は
正規表現とifの組み合わせで指定するしかないのでしょうか?
それともクラス指定をするのでしょうか?
0763デフォルトの名無しさん
2006/11/15(水) 13:58:210764デフォルトの名無しさん
2006/11/15(水) 14:00:40誤りを犯すと粛清されるんだよ(w
0765デフォルトの名無しさん
2006/11/15(水) 14:22:21name = $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 より後のところを消しても一緒でした。
どこが間違っているのでしょうか?
出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら
その時点でエラーを出したいと思っています。
0766デフォルトの名無しさん
2006/11/15(水) 14:24:51言動で同一人物だと知れる稀有な例
なんでプログラミングに際して非論理的に行動するのかさっぱりわからない
0767デフォルトの名無しさん
2006/11/15(水) 14:31:28文法にはあってるはずだと思うんですが
0768デフォルトの名無しさん
2006/11/15(水) 15:08:04わかりもしないものをめちゃくちゃに適用しておいて文句言うな。
何を言って無駄だと判断。とりあえず書名晒せ。
0769デフォルトの名無しさん
2006/11/15(水) 15:23:18begin〜rescue〜endは、beginとrescueの間で起きた例外ならどこで起きたものでも補足する
落ち着いて範囲を広く取るといい
というか、begin〜rescue〜endは別に特別でもなんでもない存在だから、
普通に文法に沿って書かないと駄目だぞ
0770デフォルトの名無しさん
2006/11/15(水) 15:28:47ぶっちゃけスクリプトの最初から最後までを囲っていても問題ないわけで
0771デフォルトの名無しさん
2006/11/15(水) 15:43:35あ、ごめんトリップだ。
1年以上存在を忘れていた。
というわけで心当たりがある奴は名前とトリップを付けること。
0772デフォルトの名無しさん
2006/11/15(水) 16:01:23どうやら、while-end でひとつの処理のようでした。
でも、出力ファイル名を入力する前に、引数で指定したファイルが存在しなかったら
その時点でエラーを出したいと思っています。 ってのは例外処理じゃ無理そうですね。
0773772
2006/11/15(水) 16:18:060774デフォルトの名無しさん
2006/11/15(水) 16:51:22の場合はエラーを表示したいのですが、空白を含む場合の指定の仕方がわからないのですが
どのようにすればよいのでしょうか?
out = $stdin.gets.chomp!
if /^ / =~ out || out.size == 0
print("エラー")
exit 1
end
0775デフォルトの名無しさん
2006/11/15(水) 17:15:180776デフォルトの名無しさん
2006/11/15(水) 17:15:53何も入力されない
/^$/
空白で始まる
/^ /
空白を含む
/ /
0777デフォルトの名無しさん
2006/11/15(水) 17:29:45同じ奴だよな
これからもエラーが出るたびこのスレに書き込むのだろう
0778デフォルトの名無しさん
2006/11/15(水) 17:48:23丸投げしたいのなら、宿題スレにでも行ったらどうだ?
0779デフォルトの名無しさん
2006/11/15(水) 17:55:500780デフォルトの名無しさん
2006/11/15(水) 19:54:57何でもいいからさっさと名前を付けろ。
そうすりゃ俺はお前をあぼーん出来る。
0781デフォルトの名無しさん
2006/11/15(水) 21:08:12> File.open('file', 'r'){|f| s = f.read }
> みたいに書いた方がいいみたいですね。
それは File.read('file') で問題ない。
> まぁこれも一応「重大な問題」は無いんですよね?
バッファリングについて理解していて、その上で問題はないといい切れる状況
なら重大な問題はない。
>>751
> ジェネリックなGCにするとかいう話も出てるけど。
GenerationalとGenericで辞書引いてみろ。
>>761
> puts "ファイル名を入力してください"
> filename=$stdin.gets
Readline使え。
0782751
2006/11/15(水) 21:41:170783デフォルトの名無しさん
2006/11/15(水) 22:00:56どういう人が使ってるんですか?
0784デフォルトの名無しさん
2006/11/15(水) 22:04:230785デフォルトの名無しさん
2006/11/15(水) 22:09:240786デフォルトの名無しさん
2006/11/15(水) 22:10:14覚えて金になるんですか?
0787デフォルトの名無しさん
2006/11/15(水) 22:39:07なるといえばなる。
ならないといえばならない。
0788デフォルトの名無しさん
2006/11/15(水) 22:40:26Rubyだけマスターすれば
年収450万はいきますか?
0789デフォルトの名無しさん
2006/11/15(水) 22:46:33いわゆる書き捨てスクリプトを作るのに使う
途中経過の存在や内容や難易度が重要な仕事には使えない
スクリプトの保守要員が別途必要とか、そういう仕事
0790デフォルトの名無しさん
2006/11/15(水) 22:53:52では、Rubyを覚えれば他の別のプログラムが覚えやすいとかありますか?
RubyのGUIなんてできてもまったく需要ありませんか?
0791デフォルトの名無しさん
2006/11/15(水) 22:56:15使えると事務仕事でもプログラマ仕事でも効率が上がる
まあ、この「使える」は習得と使用許可の両方の意味があるが…
Rubyスクリプトの作成と実行の許されない職場では完全無意味
自宅でいろんなプログラム作って二へ二へするくらいしか使いでがない
>>790
Rubyに見返りを求めるな
プログラミングの仕事が欲しいならJavaでもやれ
0792デフォルトの名無しさん
2006/11/15(水) 23:01:22PerlのほうがCGIとかできるから
まだ役に立ちそうな気がするんですが
0793デフォルトの名無しさん
2006/11/15(水) 23:03:24プログラマー板へどうぞ
0794デフォルトの名無しさん
2006/11/15(水) 23:08:530795デフォルトの名無しさん
2006/11/15(水) 23:20:360796デフォルトの名無しさん
2006/11/15(水) 23:25:24釣りならよそでやってくれ。
0797デフォルトの名無しさん
2006/11/15(水) 23:30:21HSPでもCGIとか出来るからそっちに行っていいよ。
0798デフォルトの名無しさん
2006/11/16(木) 00:18:29板違い
0799デフォルトの名無しさん
2006/11/16(木) 00:43:230800デフォルトの名無しさん
2006/11/16(木) 00:57:570801デフォルトの名無しさん
2006/11/16(木) 10:11:320802デフォルトの名無しさん
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']
0803802
2006/11/16(木) 13:10:49サーバー:ver1.8.4
です。
0804デフォルトの名無しさん
2006/11/16(木) 13:12:20超同意
よくできたツール
0805デフォルトの名無しさん
2006/11/16(木) 13:39:46受けない面もあるかもね。
0806デフォルトの名無しさん
2006/11/16(木) 13:49:07でっかいの無理
適正規模だと嬉しい
just like anus
0807デフォルトの名無しさん
2006/11/16(木) 15:50:18タブでsplitするにはどうしたらよいのでしょうか?
3つから4つ目のカラムをついでにとります。
// の中に何がはいるのでしょうか?
line.split(//)[2..3]
0808デフォルトの名無しさん
2006/11/16(木) 15:54:200809デフォルトの名無しさん
2006/11/16(木) 15:54:54はいいとして、正規表現を基礎だけでいいんで勉強しろ
//の中に何が入るとかそういう理解はするな
0810デフォルトの名無しさん
2006/11/16(木) 15:58:500811デフォルトの名無しさん
2006/11/16(木) 16:01:55どれかを選択しなさい。
1.名前かトリップを付けて書き込む
2.宿題スレ(ttp://pc8.2ch.net/test/read.cgi/tech/1106572657/)に行く。
3.Rubyの勉強を諦める。
0812デフォルトの名無しさん
2006/11/16(木) 16:14:12名前決めました。デフォルトの名無しさん でいきます。
0813デフォルトの名無しさん
2006/11/16(木) 16:35:02data = 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)に、アクセスできるようにしたいのです
0814デフォルトの名無しさん
2006/11/16(木) 16:40:410815デフォルトの名無しさん
2006/11/16(木) 16:42:550816デフォルトの名無しさん
2006/11/16(木) 16:43:54q.rb:6:in `[]=': can't convert String into Integer (TypeError)
from q.rb:6
0817デフォルトの名無しさん
2006/11/16(木) 16:47:11なんでわざわざRubyでやるんだ
0818デフォルトの名無しさん
2006/11/16(木) 16:48:470819802
2006/11/16(木) 16:54:210820デフォルトの名無しさん
2006/11/16(木) 16:54:390821デフォルトの名無しさん
2006/11/16(木) 16:59:00一連のスクリプトはRubyであることを頑なに拒否したスクリプトだよな
他の言語でやったほうがいいと思う
0822デフォルトの名無しさん
2006/11/16(木) 16:59:17第二引数ってHashじゃないの?
{"var" => value} とか。
関係ないけど、おれはnet/httpよりWebAgentの方が好き。
0823デフォルトの名無しさん
2006/11/16(木) 17:07:43手持ちのHTMLヘルプだと「headerはgetと同じです」とか言いながら
直後のサンプルコードでは思いっきりStringだぞ(w
# version 1.2
response = http.post( '/cgi-bin/search.rb', 'query=subject&target=ruby' )
0824802
2006/11/16(木) 17:14:34いやハッシュじゃないみたいです…
自分のPCでは問題なく処理出来るのですが、サーバーにアップすると値が渡ってません。
これの通りやったんですが…
http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fhttp
0825813
2006/11/16(木) 17:56:330826813
2006/11/16(木) 18:17:160827デフォルトの名無しさん
2006/11/16(木) 18:43:47で、そろそろ気づいた?
0828813
2006/11/16(木) 18:45:30まだわかりません
0829デフォルトの名無しさん
2006/11/16(木) 18:49:41お前には聞いてないと思うが。
0830デフォルトの名無しさん
2006/11/16(木) 18:51:14「ページを表示できません」なんですが
私だけでしょうか?
0831デフォルトの名無しさん
2006/11/16(木) 18:53:48これ、やっぱPHPのとこがレン鯖では正確に処理されてて
<? print $_POST['var'] ?>
なら動作するとかそんなよくあるオチだと思うよな
どんなふうに「できてない」のかの正確な情報が無かったから長期放置されてるが、
「"var=value"が渡っていない様です」の判断理由が「xxxx.phpの中身が素で表示されてるから」とかなら
ぶちゃけそんなとこではないかと
0832デフォルトの名無しさん
2006/11/16(木) 18:56:00Ruby関係ないじゃん…
0833813
2006/11/16(木) 18:56:550834デフォルトの名無しさん
2006/11/16(木) 19:02:05xxxx.phpをRubyスクリプトで書けば原因の切り分けができたんだろうけどな
PHPで書き続けたのがマズかったのかもしれない
いや、これが原因だと限ったもんでもないが(w
>>830
時々503になる
閲覧者が多くてコケてる模様
0835813
2006/11/16(木) 19:12:28data = 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
0836デフォルトの名無しさん
2006/11/16(木) 19:21:55そうなんですか、レスサンクス
0837813
2006/11/16(木) 19:44:11str = 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] みたいにしたいけど
0838デフォルトの名無しさん
2006/11/16(木) 20:37:59それはRubyではできない。
0839802
2006/11/16(木) 20:44:06すみません正確に書くと、以下です。
ローカルで実行した場合「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']
?>
0840デフォルトの名無しさん
2006/11/16(木) 20:49:28やりたいのはこういう事?
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
0841802
2006/11/16(木) 21:00:01既にサーバー上で問題なく動いているPHPスクリプトがあるんですが
そのスクリプトに839の形式でアクセスした場合も
ローカルでは問題なくPOSTメソッドの値が渡り
Rubyスクリプト自体をサーバーにアップして実行した場合に限りPOSTメソッドの値が渡らないんです…
例えば、ログインのパスワードをPOSTで渡したとしたら
ローカルからだとPOSTで渡したパスワードが正しく認識されログインページが表示されるんですが
サーバー上で実行すると、パスワードが渡っておらず、エラー表示されてしまいます…
Rubyのスクリプトはまったく同じ物を使用しているので、まず間違っている事は考えられません…
なぜでしょうね…
0842デフォルトの名無しさん
2006/11/16(木) 21:52:40永遠に付きまとうぞ
自重しろ
0843デフォルトの名無しさん
2006/11/16(木) 22:02:02ありがとうございました!それでいけました。
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] みたいに
0844デフォルトの名無しさん
2006/11/16(木) 22:12:21試してから書けカス。
それと、そんなにperlが好きならperl使ってろ。
0845デフォルトの名無しさん
2006/11/16(木) 22:19:33いやためしましたよ。
0846デフォルトの名無しさん
2006/11/16(木) 22:29:22>843の最後の行のまま書いたのなら通るわけがないぞ、ボケ。
ホント、死ねばいいのに。
0847デフォルトの名無しさん
2006/11/16(木) 22:38:130848デフォルトの名無しさん
2006/11/16(木) 22:39:50文法エラーだったんですが、この場合どうまとめればいいのか・・・
そもそもまとめられるのかが
0849デフォルトの名無しさん
2006/11/16(木) 22:43:45undefined local variable or method `str2' for main:Object
http://www.excite.co.jp/world/english/
0850デフォルトの名無しさん
2006/11/16(木) 22:54:51調べずにいきあたりばったりの想像で書いてるからな
Perl使ってろと言われるのもそのせいだ
0851デフォルトの名無しさん
2006/11/16(木) 23:06:17申し訳ない。
これは、ここに書き込むとき間違っただけでした。
[str][2] です。はい。
0852デフォルトの名無しさん
2006/11/16(木) 23:07:14むむ、でもこれだとさすがに書いてない・・・
0853デフォルトの名無しさん
2006/11/16(木) 23:10:52そうだよな。俺も思った
0854デフォルトの名無しさん
2006/11/16(木) 23:15:46Rubyスクリプト書いてるんじゃないのかと
本読んでるとか調べてるとか嘘だろと
しかもPerlのとこでエラー出たら文句言うしやってられん
0855デフォルトの名無しさん
2006/11/16(木) 23:22:26とか書いてあるのか?
0856デフォルトの名無しさん
2006/11/16(木) 23:25:490857802 == 839 == 841
2006/11/16(木) 23:35:580858デフォルトの名無しさん
2006/11/16(木) 23:41:030859デフォルトの名無しさん
2006/11/16(木) 23:54:31Perl>>>Ruby とでも
0860デフォルトの名無しさん
2006/11/17(金) 00:13:42まじめにお願い。次書き込むときからは、名前欄にあなたの好きな名前を
入れて書き込んで下さい。
俺らだってあなたに答えてあげてるじゃん。
だから俺のお願いも聞いてよ。
ギブアンドテイクってやつだよ。
0862デフォルトの名無しさん
2006/11/17(金) 00:41:03data[str][2], data[str][1] = line.split(/ /)[7..8]
0863デフォルトの名無しさん
2006/11/17(金) 09:45:42サーバ上でRubyスクリプトを実行って、どうやってるの?
シェルアカウントがあってそれで実行してるってこと?
0864デフォルトの名無しさん
2006/11/17(金) 10:09:28最近はPerlだけでなく
Rubyの使えるサーバも増えて来たよ
0865802 == 839 == 841
2006/11/17(金) 10:38:44レンタルしてるサーバーの一つは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
0866デフォルトの名無しさん
2006/11/17(金) 10:58:32いや、そんなことを聞いてるんじゃなくて、どうやってスクリプトを実行してるのか、
ということ。
>>865
CGIとして実行してるのね。そこが重要なポイントだった。
そのtest.cgi、全体をbegin〜endでくくって、rescueで例外を出力するようにしてみ?
0867802 == 839 == 841
2006/11/17(金) 11:27:31レスどうも!やってみました。これでいいんでしょうか?
結果は何も表示されませんでした…
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
0868デフォルトの名無しさん
2006/11/17(金) 11:37:120869802 == 839 == 841
2006/11/17(金) 11:47:43Net::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
0870デフォルトの名無しさん
2006/11/17(金) 13:23:24GETで試す必要はないと思うぞ。ブラウザURL直打ちでのアクセスはGETだから。
適当なFORMのあるHTMLファイルを作って、POSTでwww.xxx.comのxxxx.phpなりout.cgiなりを踏んでみ。
別サーバ(ローカル)と同一サーバ上(xxx.com)の2箇所からな。
あと、「varの中身だけ返す」とかわかりにくいCGIでデバッグ続けるのはやめたほうがいい。
ただの空白が帰ってきた場合、どこで失敗してんだかよくわからんから。
cgi.out{ "result: #{cgi['var']}" } とか、空であることがはっきり視認できるプログラムにしたほうがいい。
0871802 == 839 == 841
2006/11/17(金) 14:54:56以下の様な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
0872デフォルトの名無しさん
2006/11/17(金) 15:22:15print "**#{response.body}**"
でやって
0873802 == 839 == 841
2006/11/17(金) 15:46:19実行してみました。
やはりサーバーの方は値だけ渡ってない様です… なんでだろう??
--- 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: **
0874デフォルトの名無しさん
2006/11/17(金) 16:46:060875802 == 839 == 841
2006/11/17(金) 16:54:32GETで渡せば "var=value" になりますが
POSTだとローカルでもサーバーでも空ですね。
0876802 == 839 == 841
2006/11/17(金) 17:04:06<?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
0877デフォルトの名無しさん
2006/11/17(金) 19:30:46array[#{string}]
何でこんな面倒なんですか?
array[string] じゃエラーになるんですが
単にstringと間違えてるだけなんでしょうか
宣言があればstringでいけるようにと思うのですが
0878デフォルトの名無しさん
2006/11/17(金) 19:33:080879デフォルトの名無しさん
2006/11/17(金) 19:43:57=> "\203e\203X\203g"
irb(main):002:0> array[#{string}]
irb(main):003:1*
irb(main):004:1*
irb(main):005:1*
0880デフォルトの名無しさん
2006/11/17(金) 20:07:21??
0881デフォルトの名無しさん
2006/11/17(金) 20:35:35h = {'a'=>'Hello World!'}
k = 'a'
print h[k]
0882デフォルトの名無しさん
2006/11/17(金) 21:57:51はずれ →>>881
0883デフォルトの名無しさん
2006/11/17(金) 22:00:070884デフォルトの名無しさん
2006/11/18(土) 00:21:10速度上げる方法ってありますか?
0885デフォルトの名無しさん
2006/11/18(土) 00:25:310886デフォルトの名無しさん
2006/11/18(土) 00:26:12Perl使えPerl
0887デフォルトの名無しさん
2006/11/18(土) 00:45:59perlはイヤです><
0888デフォルトの名無しさん
2006/11/18(土) 00:59:400889884
2006/11/18(土) 01:54:43ありがとうございます。
早速つかってみます。
0890デフォルトの名無しさん
2006/11/18(土) 02:00:03a.each { |i|
hoge
}
の代わりに
for i in a do
hoge
end
0891デフォルトの名無しさん
2006/11/18(土) 02:01:51単にforの方が速いって話はあったが、「for使え」までは言ってなかった気がする。
0892デフォルトの名無しさん
2006/11/18(土) 02:12:440893デフォルトの名無しさん
2006/11/18(土) 02:14:03それで解消される「重さ」なんて微々たるもんだと思う
それ以外の構造的なナニカを正したほうが良さげだ
そもそも、「eachが遅い」などというのはよっぽどでないと断言できん
遅いのはたいがいeachの中や配列に問題ありだ
0894デフォルトの名無しさん
2006/11/18(土) 02:23:380895デフォルトの名無しさん
2006/11/18(土) 02:34:55遅くて困るなら他の言語使えばいいじゃない。
遅いだけで困らないなら遅くても別にいいじゃない。
0896デフォルトの名無しさん
2006/11/18(土) 02:35:380897デフォルトの名無しさん
2006/11/18(土) 02:39:05普通使っててそんな遅くないはずの処理が名指しで遅いと言われるとちと困る
0898デフォルトの名無しさん
2006/11/18(土) 02:43:100899884
2006/11/18(土) 02:43:44a.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が早くなればいいなと思って質問しました。
0900デフォルトの名無しさん
2006/11/18(土) 03:00:44単にブロックで(メソッド呼ばない)重たい処理やってる可能性もアリ。
$ 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
こんな表示になるし。
0901デフォルトの名無しさん
2006/11/18(土) 03:11:090902デフォルトの名無しさん
2006/11/18(土) 03:17:440903デフォルトの名無しさん
2006/11/18(土) 06:31:44でもfor文はeachを使って実装されてるって聞いたことあるけど。
0904デフォルトの名無しさん
2006/11/18(土) 09:58:52そりゃ、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
0905デフォルトの名無しさん
2006/11/18(土) 10:19:26exerbで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がまずいらしいのですがどうしたら良いでしょうか。
0906デフォルトの名無しさん
2006/11/18(土) 16:50:49>>900 には
> 単にブロックで(メソッド呼ばない)重たい処理やってる可能性もアリ。
と書いてあるのに、なんで Integer#times を呼んでるんですか?
0907デフォルトの名無しさん
2006/11/18(土) 17:43:26なんだ、" " を書きたかったのか。
$Q とか使えばいいじゃん。
irb(main):006:0> aaa = 123 ; %Q(#{aaa}"vvv"bbb)
=> "123\"vvv\"bbb"
0908デフォルトの名無しさん
2006/11/18(土) 20:45:57お奨めなものってありますでしょうか?
RoRは大掛かりな上に、多くのレンサバでは動かしにくいですよね
>>905
実行環境のrubyが、cygwin版だからじゃね?
0909デフォルトの名無しさん
2006/11/18(土) 21:19:430910デフォルトの名無しさん
2006/11/18(土) 22:24:57webrickのservlet
ドキュメント無いけどな。
0911デフォルトの名無しさん
2006/11/19(日) 00:33:41> ブロックとともに呼ばれた時はエンティティボディを少しづつブロックに与えます。
の「少しずつ」ってナンデスカ
0912デフォルトの名無しさん
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 とかして時間の経過見てみたら
0913デフォルトの名無しさん
2006/11/19(日) 01:04:000914デフォルトの名無しさん
2006/11/19(日) 01:16:08だな
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バイト分の処理が終わらないとサーバに続きを取りに行かないみたいだ
相手のサーバにとっては時間が余分にかかってちと迷惑な話かもしれん
でも一気に全部読み込むとこっちのメモリがーみたいな
0915デフォルトの名無しさん
2006/11/19(日) 01:23:18俺はシンプルかつ応用の利くcgi.rbが一番いいと思うよ
他のフレームワークは、設計に独自色が強く
使い方を理解するまでに苦労することが多々ある
0916デフォルトの名無しさん
2006/11/19(日) 08:33:49いやcgi.rbも結構クセ強いだろ。
0917デフォルトの名無しさん
2006/11/19(日) 12:32:08cgi.rb → めんつゆ
塩 → net/http他
醤油に相当するものがない
0918デフォルトの名無しさん
2006/11/19(日) 12:45:200919デフォルトの名無しさん
2006/11/19(日) 15:27:510920デフォルトの名無しさん
2006/11/19(日) 15:30:470921デフォルトの名無しさん
2006/11/19(日) 15:44:47Yamada.tainted? #=> true
>>920
zabuton.tainted? #=> true
0922デフォルトの名無しさん
2006/11/19(日) 18:33:11NameError: undefined local variable or method `Yamada' for main:Object
NameError: undefined local variable or method `zabuton' for main:Object
0923デフォルトの名無しさん
2006/11/19(日) 20:45:22p yamada.empty? #=> true
0924デフォルトの名無しさん
2006/11/19(日) 22:02:12while(<>){
chomp;
$line .= $_
}
Rubyではこれが最小なのでしょうか?
seq = ""
while line = gets
line.chomp!
data << seq
end
0925デフォルトの名無しさん
2006/11/19(日) 22:15:02data = ""
while gets
chomp!
data << $_
end
でもいいけど。
ただそこまでしてレシーバ書きたくねーもん?
0926デフォルトの名無しさん
2006/11/19(日) 22:17:16そっちのほうが軽いかと思って
でも、やっぱ data=""
これはいるんですね。
自動で判別してくれてもいい気がするけど・・・
ありがとうございます。
0927デフォルトの名無しさん
2006/11/19(日) 22:39:42$stdin.readlines.each{|x| x.chomp!}.join
0928デフォルトの名無しさん
2006/11/19(日) 23:25:000929デフォルトの名無しさん
2006/11/19(日) 23:41:36p 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文字目を抽出できるのですが。ハッシュだと
どうすればよいのかわからなくて困っております。
0930デフォルトの名無しさん
2006/11/20(月) 00:03:02この場合、Hashに格納されているStringの操作なんだから
ArrayもHashも変わらんよ。
0931デフォルトの名無しさん
2006/11/20(月) 00:06:02> valueの123の3
ハッシュhのキー"abc"の値に格納されてるStringの3文字目
> 468の6
ハッシュhのキー"468"の値に格納されてるStringの2文字目
0932デフォルトの名無しさん
2006/11/20(月) 00:12:39p h["abc"][2]
結果は、51
ハッシュhのabcキーの値が123 # h["abc"]
ハッシュhのabcキーの値の3文字目 #h["abc"][2] → 51
これだと思ったのですが、違うか・・・
0933デフォルトの名無しさん
2006/11/20(月) 00:19:31p h["abc"].split(//)[2]
0934デフォルトの名無しさん
2006/11/20(月) 00:21:58irbとか使ってインタラクティブに色々やってみると分かりやすいんじゃないかな。
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"]
0935デフォルトの名無しさん
2006/11/20(月) 00:23:26お前もいい加減コテ付けてくれ。
「よく理解できるまでは無理して短く書くな」ってカーチャンに教わらなかったか?
0936デフォルトの名無しさん
2006/11/20(月) 00:23:400937デフォルトの名無しさん
2006/11/20(月) 00:24:59ついでに、コピペした後編集したもんだからirbの出力が変な事に。
0938デフォルトの名無しさん
2006/11/20(月) 00:25:14p 51.chr
"3"
文字列[n]は、nバイト目の文字の文字コード(文字そのものではない)を整数で返す
配列[n]はn番目の要素をそのまま返すが、文字列の場合は挙動がちょっと違う
0939デフォルトの名無しさん
2006/11/20(月) 00:25:38そうですね。.chrがいるのか。どうもすみません。ありがとうございました。
splitの方は、配列の文字列が多くなるとやはり処理に時間がかかりそうだから、chrのがよさげですね。
0940デフォルトの名無しさん
2006/11/20(月) 00:28:04>でも、やっぱ data=""
>これはいるんですね。
初期化無しでの使用を許してしまうと
スペルミスでバグを作り込んでしまう事が多くなる。
0941デフォルトの名無しさん
2006/11/20(月) 00:29:01それはスコープの問題。
>>927
そこはinjectがハマルはず。
$stdin.readlines.inject(''){|result, x| result << x.chomp!}
0942デフォルトの名無しさん
2006/11/20(月) 00:46:22しかしinjectの導入はなかなか英断かもしれない
ここに適用できると思い至るまで時間かかるけどな
0943デフォルトの名無しさん
2006/11/20(月) 00:49:01injectに副作用な記述のブロックを付けるのは気持ち悪い。
injectがそういうもんだと初心者の誤解を招くからヤメレ。
0944デフォルトの名無しさん
2006/11/20(月) 01:04:33result << x.chomp! じゃなくて、result + x.chomp! と書けって言うこと?
あと細かいけど、x.chomp! じゃなくて x.chomp じゃないと
たまに nil が返るかもしれないので余りよくない。
0945デフォルトの名無しさん
2006/11/20(月) 01:30:58result = $stdin.read.split(/\n/).to_s
とか
result = $stdin.read.gsub(/\n/, "")
は?
0946デフォルトの名無しさん
2006/11/20(月) 01:47:38$<.read.gsub($/){}
0947デフォルトの名無しさん
2006/11/20(月) 01:49:58改行削除までして結合してresultに全て読み込んでくれるんじゃね
0948デフォルトの名無しさん
2006/11/20(月) 02:00:06下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、
自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?)
にはどうしたらいいですか教えて下さいお願いします。
0949デフォルトの名無しさん
2006/11/20(月) 08:16:01ゴルファーはゴルフやってろ
0950デフォルトの名無しさん
2006/11/20(月) 11:33:09h = Hash.new
i = Hash.new
box = Hash.new
みたいに宣言が必要なのでしょうか?
いきなり
box["key"] = value
みたいにしてもハッシュにならないのですが、ちょっと面倒ですね。
0951デフォルトの名無しさん
2006/11/20(月) 11:38:330952デフォルトの名無しさん
2006/11/20(月) 11:53:10たのしいRubyという本をもっております。
0953デフォルトの名無しさん
2006/11/20(月) 11:58:50Perl使え
0954デフォルトの名無しさん
2006/11/20(月) 12:17:10Rubyは君の要求を満たさない
他の言語を使うべし
0955デフォルトの名無しさん
2006/11/20(月) 12:56:35つbox = { "key" => value }
0956デフォルトの名無しさん
2006/11/20(月) 13:06:21細かいところで気が利かないんだよね
0957デフォルトの名無しさん
2006/11/20(月) 13:21:28for($i=0:$i<=100,$i=$i+5){}
をRubyでするにはどうしたらよいのでしょうか?
while文ではなくfor文でしたいのですが
0958デフォルトの名無しさん
2006/11/20(月) 14:00:400959デフォルトの名無しさん
2006/11/20(月) 14:13:43これで何故、3つとれないのでしょうか?
in `[]': wrong number of arguments (3 for 2) (ArgumentError)
こんなエラーがでます。
0960デフォルトの名無しさん
2006/11/20(月) 14:24:38Rubyでは普通は Range#step を使う
(0..100).step(5) {|i| puts i }
この場合は、Integer#step(limit, step) {|n| ... } も使えるけど。
0961デフォルトの名無しさん
2006/11/20(月) 14:29:54なるほどありがごうざいます。
その場合は、<= >= が有効なのかな。
> や < だと
100 の場合 100も含まれることになりますよね。
0962デフォルトの名無しさん
2006/11/20(月) 14:35:16下端までテキストを表示したあと、さらにもう一行テキストを追加したときに、
自動で下端の追加された部分を表示するようにする(上端が一行隠れて全体が一行上に上がる?)
にはどうしたらいいですか教えて下さいお願いします。
0963デフォルトの名無しさん
2006/11/20(月) 14:52:22> バカにつける薬はない
こういう言い訳ばっかりして一向に薬を出さない医者、みたいな言語だよねRubyって。
0964デフォルトの名無しさん
2006/11/20(月) 15:08:090965959
2006/11/20(月) 15:09:550966デフォルトの名無しさん
2006/11/20(月) 15:16:54http://www.ruby-lang.org/ja/man/?cmd=view;name=Array
0968デフォルトの名無しさん
2006/11/20(月) 15:32:520969デフォルトの名無しさん
2006/11/20(月) 15:36:15簡潔さで勝負して欲しくないよね。負けるから。
0970959
2006/11/20(月) 15:39:02のってなくないですか?
0971デフォルトの名無しさん
2006/11/20(月) 15:44:180972959
2006/11/20(月) 15:54:46できたー
0974デフォルトの名無しさん
2006/11/20(月) 15:56:48まったくだ
0975デフォルトの名無しさん
2006/11/20(月) 16:03:39本当に簡潔さで勝負するとどっちがより簡潔に書けるかは、Code Golfを見ればわかる。
今現在で17のchallangeがあって、1位がRubyなのが10個、1位がPerlなのが6個、1位がPythonなのが1個。
0976959
2006/11/20(月) 16:07:03[1..6] みたいなはできるのに[1,3,4]とかはできるようにしなかったのでしょうか?
0977デフォルトの名無しさん
2006/11/20(月) 16:08:06長いのがJava
0978959
2006/11/20(月) 16:08:49a,b,c = split(/\t/)[1,3,8]
できたー
0979デフォルトの名無しさん
2006/11/20(月) 16:10:57短い→Perl
普通→Ruby、Python
長い→Java
長ったらしい→PHP
つーか関数名やメソッド名の話じゃねーのか
0980デフォルトの名無しさん
2006/11/20(月) 16:12:00Array#[start, length] というのがあるし今さらそういうふうにはできんなぁ。
>>961
Rangeリテラルは、終端を含む場合は、start..end で、含まない場合は start...end になる。
プロポーショナルフォントだと分かりづらいけど、ドットの個数が違う。
0981デフォルトの名無しさん
2006/11/20(月) 16:19:20Rubyにarray[i,j,k]というような記法はないので
array = [1, 2, 3, 4, 5]
a, b, c = array[0,1,3]
と書くとエラーになる
なぜArgumentErrorなのかは自分で考えてくれ
0982961
2006/11/20(月) 16:19:20細かい使い分けが必要なんですね。
でもstepだと100から0 に5ずつ下がるのができないのですが
100..0 が使えないのは何故なのでしょうか?使えるようにしたほうが便利な気がするのですが
0984デフォルトの名無しさん
2006/11/20(月) 16:23:28スレ壊したいのか
0985デフォルトの名無しさん
2006/11/20(月) 16:24:270986デフォルトの名無しさん
2006/11/20(月) 17:46:15moji = {"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が返ってくるとはずなのですが、かえってきません。
0987デフォルトの名無しさん
2006/11/20(月) 17:56:16"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"]
0988962
2006/11/20(月) 18:58:330989デフォルトの名無しさん
2006/11/20(月) 19:32:190990デフォルトの名無しさん
2006/11/21(火) 02:00:59「s」がnilの場合は空文字で初期化して
その他の場合は変更ナシとしたいのですが
上のコードより綺麗に書けますか?
0991デフォルトの名無しさん
2006/11/21(火) 02:18:380992デフォルトの名無しさん
2006/11/21(火) 02:25:37おおっ
ではこの場合のもっと洗練された記述法はありますか?
s = ((c == nil) ? ('') : (c))
0993デフォルトの名無しさん
2006/11/21(火) 03:48:15逐次入力して変換していくものを作りたいのですが、
これだとgetsが動いてくれないようです。どこがおかしいか教えていただけませんか?
while arg = ARGV.shift
print arg, ":\n"
name = gets.chomp.
system("mv #{arg} #{name}")
end
0994デフォルトの名無しさん
2006/11/21(火) 03:50:30c ||= ゙゙
>>992
s = c || ゙゙
0995デフォルトの名無しさん
2006/11/21(火) 04:36:18そっかー どうも!
0996デフォルトの名無しさん
2006/11/21(火) 07:53:300997デフォルトの名無しさん
2006/11/21(火) 08:43:150998デフォルトの名無しさん
2006/11/21(火) 08:43:460999デフォルトの名無しさん
2006/11/21(火) 08:45:421000デフォルトの名無しさん
2006/11/21(火) 08:46:06http://pc8.2ch.net/test/read.cgi/tech/1164065622/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。