1 :
デフォルトの名無しさん :
2007/12/08(土) 22:36:20 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは
>>2-10 あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2 :
デフォルトの名無しさん :2007/12/08(土) 22:40:03
3 :
デフォルトの名無しさん :2007/12/08(土) 22:41:35
4 :
デフォルトの名無しさん :2007/12/08(土) 22:42:10
5 :
デフォルトの名無しさん :2007/12/08(土) 22:43:05
6 :
デフォルトの名無しさん :2007/12/08(土) 22:45:47
気が付いたら1000行ってたので、適当に立ててみた テンプレのリンク先とかあんまり吟味してないけど、こんな感じでいい? 前スレ802のMoonwolf Wikiは使われてないようなので外した
8 :
デフォルトの名無しさん :2007/12/08(土) 22:49:41
Q: Rubyの勉強をはじめようと思うのですけども、 一からRubyをはじめる初心者向けのRuby入門書は何がお薦めでしょうか? A: プログラ自体の初心者だったら「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」 他の言語経験があるんだったら「プログラミングRuby 第2版 言語編」
初心者でWin XPで使用しています。 コマンドプロンプトに日本語を表示させるとエラーが出るのでchcp 65001したのですが、 今度はエラーは出なくなったのですが文字が表示されません。何が悪いのでしょうか? フォントはMSゴシックにしています。
10 :
デフォルトの名無しさん :2007/12/08(土) 23:00:23
11 :
デフォルトの名無しさん :2007/12/08(土) 23:05:21
さすがにどんなエラーが出たのか どんなコードを実行したのかがナイトね〜
14 :
デフォルトの名無しさん :2007/12/09(日) 03:26:42
>>前スレ989 ありがとうございます。 24行と25行を以下のように書き換えて、次のif文をこう変えたら良いのでしょうか? res_and_or = msql.query("select name,price from test_table where price #{zyoken} '#{Mysql::quote f_price}' and name='#{Mysql::quote f_name}'") if res_and_or.num_rows == 0 serched_out = "見つかりませんでした" else gokei = res_and_or.num_rows serched_out = "#{gokei}件見つかりました" end
>>9-10 すみません。入門のページに良くある
puts '日本語を表示します'
というのからはじめました。ファイル名はja.rb
これの日本語がSJISだと怒られるので
$KCODE = 'UTF8'
require 'kconv'
puts '日本語を表示します'.tosjis
とすれば日本語表示できました。
日本語表示が出来たので、今度はRSpecを使って日本語表示もやってみました。
その後試行錯誤した結果、どうもRSpecでもそれぞれtosjisを使わないとダメみたいでした。
でも記述量が多くてスマートじゃないので他にも方法がありそうだと思いました。
それでコンソールをchcp 65001してutf-8を書き出す方法を試してみることにしました。
ところが全く文字が書き出されないので困ってしまいました。英語の文字列すら書き出してくれません。
それで
>>9 を書き込みしました。エラーも全く出ていません。表示のみの問題です。
Windowsよーわからんが、$KCODE='s' (uじゃなく)はだめなの?
>>15 >>11 で指摘されてるのにもかかわらず、どういうエラーに
なったのかを書いてないのは、本気でどうかと思うんだけど。
「これの日本語がSJISだと怒られる」とか不明瞭すぎ。
まあソースコードをShijft_JISで記述した場合は
c:\> ruby -Ks ja.rb
rubyで初めて本格的な開発をしようと思うのですが、 おすすめのエディタやIDEがあれば教えてください。 以前はEmacs使ってたのですが、windowsに環境も変わりいっそ新しい環境を使おうと思いました。 コード補完機能が使えるような環境があればうれしいです。
>>19 ありがとうございます。ちょっくら試してきます。
SciTE Editorはどうよ 使ったことないけど^^;
>>18 Emacs使いならMeadowがいいんじゃないの?emacs-railsとか入れて使うとRDEより便利。
>>21 Rails関係したエディタ?なんですかね。
RDEと比較して使いやすい方を選ぼうと思います。
>>23 いやー、meadowも考えてたんですが、一から設定書き直すの面倒だなーと思って、
それならいっそ新しい環境でやろうかなと思ったんです。
ですが、RDEより便利なんだったらそっちのほうがいいかもですね。
ちょっとemacs-railsについて調べてきます。
28 :
デフォルトの名無しさん :2007/12/09(日) 17:38:55
今日、Rubyをはじめてみようと思ってチュートリアルみてがんばったんだけど、1.xと2.xって書き方か何か変わってるの? エラーがでて実行できなくて、半日費やして、2日前に新しいバージョンになったばっかだと知ったむなしさ orz
>>15 Rspecでgettext使えばいいんでないの
>>28 どこかで等価演算なんかの値が変わったとは見たけど(すげーマニアックな場所)
実際書いたプログラム見せてみ?
そもそも2.xなんてないぞ。 railsと混ざってないか?
32 :
30 :2007/12/09(日) 17:51:25
ごめん、1.8->1.9の変更と勘違いしてたわ。
33 :
デフォルトの名無しさん :2007/12/09(日) 19:24:08
"20071111"という文字列を、"2007-11-11"という文字列にしたいと 思ってます。ParseDateを使う方法で書いているのですが、多量に 変換するので、一々ParseDateを呼び出すよりももっと別のやり方は ないかとおもってます。(特に "#{hogehoge}"みたいに文字列の中で できれば、、、) どなたか、助けてください。
文字列クラスを拡張してこんな感じとかどうよ #動作確認はしてない class String def hoge return "#{self[0..3]}-#{self[4..5]}-#{self[6..7]}" end end p "20071111".hoge #=> "2007-11-11"
>>33 input="20071111"
output = "#{input[0,4]}-#{input[4,2]}-#{input[6,2]}"
puts output
日付として正しいかどうかを考慮しないなら、parsedateするまでもなく、 ただ4文字、2文字、2文字で区切ればいいというわけだ。
String#[] にシンボルを渡してもエラーにならないのは仕様ですか? irb(main):001:0> s="abcdefg" "abcdefg" irb(main):002:0> s[:abc] nil Hash を期待するとこに間違ってStringを渡してしまったけど、一見普通に動いているように 見えて少しはまりました。 なんか使い道があるんですかこれ?
38 :
デフォルトの名無しさん :2007/12/09(日) 20:14:16
>>34 >>35 >>36 ありがとうございました。
勉強になりました。一応35さんのやり方でやってみました。
34さんのやり方も動くことは確認しました。
string.cのrb_str_arefの定義を見ると、 添え字がFixnum、Regexp、String、Range以外の場合は数値化して から使うようだ。
オンラインの日本語で記されたピッケル本が読みたいが 置いてくれてたとしてもURI、場所がわかんねえ…
a=Object1.new ってした後に a=Object2.new ってするとどうなりますか?最初のほうは無視されますか?
>>41 無視というか、「どの変数からも参照されていない」状態になる
>>41 無視される、というかその記述はプログラマ(=
>>41 )が無視してるというような意味の
記述になるんじゃね?
>>42 が言うようにどっからも参照されてないからじきGCされる。
rubyが走るポケコンが欲しいなぁ・・・と思った今日この頃
>>25-27 xyzzyの方がutf-8nで保存できるから便利だヨン。
Meadowのutf-8ではまらないようにね。
>>44 ディスプレイにどの程度の仕様を求める?
さすがに 5x7 で 16 文字だと Ruby は辛いし (笑)
俺もW-ZERO/3でrubyを走らせたい。 ちょっとした計算なんかを卓上で出来て便利だと思う。 しかし、金がない・・・orz
>>44 最近の製品しらないけどLinuxザウルスにインストールとか
できるんだろうか?
>>48 以前 Rails スレで、りなざうで RoR の開発をしてる香具師がいたような。
まありなざうをポケコンと呼べるかはともかくとして。
Ruby/Tkって何か廃れてるように見えるんですが、実際の所どうなんでしょうか。 RubyでGUIプログラミングするなら今は何でやるべきですかね。
scaffoldで作ったviewから別のテーブルのデータを参照したい時は、 どのように記述すればいいのでしょうか?
52 :
デフォルトの名無しさん :2007/12/10(月) 14:20:50
あるクラスがインスタンス変数として別のクラスをもつことは可能ですか?
>>51 Rails版へ。とりあえず2chに聞くのはどうかと思うよ。
>>53 すいません どうしても分からないもので。
Rails板で聞いてみます。
>>52 Klass = Class.new
Klass.instance_eval{
@other_class = String
}
gem install cgialt ERROR: While executing gem ... (OpenURI::HTTPError) 404 Not Found
a=b.clone とした後にaのインスタンス変数をいじって、また a=b.clone ってすると、どうなりますか? aは最初にa=b.cloneとしたときと同じ状態ですか?それとも、いじった後と同じですか?
59 :
デフォルトの名無しさん :2007/12/10(月) 22:30:46
同じ状態
60 :
デフォルトの名無しさん :2007/12/10(月) 22:34:25
同じ状態ってのは正しい表現ではないな。 同じものを指している。
b = Hoge.new # Hogeクラスのインスタンス1を生成し、インスタンス変数bで参照できるようにする b───>[インスタンス1]←生成 a = b.clone # インスタンス1のクローン1を生成し、インスタンス変数aで参照できるようにする a───>[インスタンス1のクローン1]←生成 b───>[インスタンス1] a.foo #インスタンス変数aが参照するインスタンスのメソッドfooを実行する a───>[インスタンス1のクローン1].foo b───>[オブジェクト1] a = b.clone # インスタンス変数bが参照するインスタンスのクローン2を生成して、インスタンス変数aで参照できるようにする a───>[オブジェクト1のクローン2]←生成 [オブジェクト1のクローン1のfooメソッド実行]←誰からも参照されなくなったのでガベージコレクトされる b───>[オブジェクト1] こんな感じ?
代入(=)したりclone(dup)したりするたびに、a.object_idやb.object_idを プリントしてみると理解の助けになるかもね。
Kernel#catch( :hoge ) とかするときに、:hoge がどこで throw されたかを簡単に知る方法ってあるでしょうか? たとえば、スタックトレースが取れればうれしいです。
64 :
デフォルトの名無しさん :2007/12/10(月) 23:41:49
俺リナザウルスにRuby入れて走らしてたよ
throwの第二引数(省略時はnil)がcatch全体の返値として得られるよ。
ipod touchでRubyが走るなら即ポチクリするんだけどなぁ
67 :
デフォルトの名無しさん :2007/12/10(月) 23:56:27
ポチクリって何?
プチクリっとネットで買うことだべ
>>56 直ってるね。
rubyforgeはちょくちょく不調になるんだよなー。
70 :
デフォルトの名無しさん :2007/12/11(火) 01:04:08
rubyを勉強したいと思ってるんですが、 どうやってrubyを使えるようにするのか良く分かりません。 とりあえず、テンプレのほとんどが見れないんですけど、どうすればいいんですか? OSはXP、rubyのホームページからファイルをダウンロードしたんですが、 それからどうすればいいのか分からない状態です。
71 :
デフォルトの名無しさん :2007/12/11(火) 01:07:48
何処のなんのファイルをダウンしたんだ? そのファイルを実行はしたのか?
73 :
デフォルトの名無しさん :2007/12/11(火) 02:22:31
74 :
デフォルトの名無しさん :2007/12/11(火) 03:53:03
>>75 専用コンソールってなに?
ruby console ってのはあるけど、これPATHを通してからコマンド
プロンプト呼んでるだけにしかみえないんだけど。
大仰な言い方するから、思わず調べに行ってしまったじゃないか。
これをどうしても使う必要があるわけでもないし、
一体何が不満なのかさっぱりわからん。
無理にみんなでバラバラのものを勧めなくてもいいから… 俺はmingw版の手動インス(ry
全部入れたらいいさ
折角だから、俺はこの赤いアイコンをインストールするぜ。
amazonで評判が良いようだったので「達人プログラマーガイド プログラミングRuby」 (兎の表紙のやつ)を買ったんですが、なんか読みにくい。。。 コード例にはまだ説明されてない文法がバンバン出てくるし、 「なんか新しい用語(xxxページからの説明を参照)」とかも多い(xxxページはずっと先のページ) まだページにして3割ぐらいしか読んでないんだけど、コード例の間違いもちらほら見つけた。。。 失敗したかなぁ、、、RubyWayも一緒に買ったんだけどこっち読み進めたほうがいいかな。。。
古い本買っちゃダメ
>>81 プログラミングRubyが読みにくいなら
Ruby Wayはもっと理解不能だと思う
RubyWayは初心者用じゃないくね?
85 :
81 :2007/12/11(火) 18:48:28
>>82 ですよね。。。後から「プログラミングRuby」が後継の本らしい、と知りました。
表紙かなり違うんだもんなぁ。
>>83-84 すみません、いちおうJavaとPerlが分かるのでRubyWayでもいいかなーと。
先にRubyWayを触りだけ読んでたんですが(兎本は後から届いた)、そんなに悪い気は
しなかったです。情熱的。
とにかく兎本は「これは後で説明する」とか、一切説明してない用法をいきなり使って
断りなし、とか、そんなのが多すぎて疲れました。
先にこのスレで質問すればよかったなぁ…
>>85 確かにRuby Wayの情熱はすごいw
図書館であの本を手に取ったのが、俺のRubyとの出会いだったな
質問させてください。 以下のスクリプトを実行しました。 $KCODE = 'u' require 'pp' class ScrapedItem def initialize(e) @name = e[0], @age = e[1], @hight = e[2], @weight = e[3], @blood = e[4] end attr_reader :name, :age, :hight, :weight, :blood end class Scraper def initialize(array) @a = array end def scrape() row = [] @a.each { |g| row << ScrapedItem.new(g) } return row end end ary = [] ary << ['papa', '50', '175', '65', 'O'] ary << ['mama', '48', '158', '50', 'A'] hoge = Scraper.new(ary).scrape() pp hoge
89 :
88 :2007/12/12(水) 03:03:12
僕の期待する”hoge”の出力は #<ScrapedItem:0x7ce98 @age="50", @blood="O", @hight="175", @name="papa”, @weight="65">, #<ScrapedItem:0x7cdd0 @age="48", @blood="A", @hight="158", @name="mama", @weight="50">, なのですが実際は #<ScrapedItem:0x7ce98 @age="50", @blood="O", @hight="175", @name=["papa", "50", "175", "65", "O"], @weight="65">, #<ScrapedItem:0x7cdd0 @age="48", @blood="A", @hight="158", @name=["mama", "48", "158", "50", "A"], @weight="50">, なってしまいます。
90 :
88 :2007/12/12(水) 03:04:47
どう修正すれば期待する結果がえられるのでしょうか? ご教授ください。 当方の環境 ruby 1.8.6 (2007-06-07 patchlevel 36) [universal-darwin9.0] OS mac leopard 10.5.1
JavaとかC++使ってた自分がわかりやすいRuby入門サイトありますか? Javaとの比較なんかがまとめられたページがあるとありがたいんですけど。
>>91 「java Ruby」でググレば腐るほど出てくるだろ・・・
>>88 initialize() でインスタンス変数に代入してる箇所の行末のカンマを取ってみれ
>>92 なかなかまとまったサイトが見つからなかったので、そういうのを集約したサイトがないかと思ったのですが、
もうちょっと根性入れて探してきます。
>>94 つーかさ、経験者ならrubymanjp.chmで十分じゃね?
>>95 実はかなり前に一度本を読んでまして、しばらくすれば感覚が掴めると思うんですが、
一からマニュアルや本を読むよりJavaとの差異がまとめてあれば一目瞭然かと思い・・・。
とりあえずマニュアルでも流し読みして思い出すことにします。
98 :
デフォルトの名無しさん :2007/12/12(水) 12:48:11
Xの子クラスYが定義しているメソッドpiyoを呼び出すと(piyoの中でhogeを呼び出さなくても) 自動でX#hogeが実行されるような方法はありますか? class X def hoge ・・・・ end end class Y < X def piyo ・・・・ end end
99 :
デフォルトの名無しさん :2007/12/12(水) 14:50:18
テキストファイルや変数に正規表現を書いて それに基づいて評価させる場合、どんな式を書いたら良いのですか?
>>100 コード晒すのはいいが、せめてテストしてからにしてくれ。初心者相手ならなおさら。
raddr = "^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$"
regexp = Regexp.new(raddr)
if regexp =~ "192.168.0.1"
puts "まっち"
end
>>101 すまんすまん
1行目の文字列はシングルクォートで囲ってちょ
raddr = '^(\d+)\.(\d+)\.(\d+)\.(\d+)$'
p egexp = Regexp.new(raddr)
if regexp =~ "192.168.0.1"
puts "まっち"
end
それ、実際に動かしてみた?「まっち」って表示される? あと正規表現はリテラルで生成するのが普通だし ^ と $ の意味も間違って理解してるように見えるよ
>>102 >p egexp = Regexp.new(raddr)
これで表示されるわけねえw
だからちゃんと晒す前にテストしろと
>>103 >^ と $ の意味も間違って理解してるように見えるよ
kwsk
>>103 > あと正規表現はリテラルで生成するのが普通だし
元の
>>99 の質問は読んだ?
106 :
デフォルトの名無しさん :2007/12/12(水) 18:08:32
107 :
デフォルトの名無しさん :2007/12/12(水) 18:22:26
piyoの中でhogeを呼び出してください
AspectR と言いたいところだけど、そもそも何をしたいのか知りたいところ。
>>107 109も言ってるが、実際に何がやりたいのかが分からんとなんともいえない
>>98 Y.module_eval("
alias piyo_old piyo
def piyo()
hoge()
piyo_old()
end
")
y.piyo()
#"HOGE"
#"PIYO"
とでもするのかな。
要するに元のpiyo()に別名を付けて避けておいて
元のpiyo()とhoge()を呼ぶ新しいpiyo()を作る。
112 :
98 :2007/12/12(水) 20:55:34
要はXを継承したクラスのいずれかでpiyoが呼び出されたことを通知したいが piyoを実装する側はそんなことを気にせずに本来の処理だけを実装すればいいようにしたい
class X def hoge p :hoge end end class Y < X def piyo p :piyo end end module PiyoHoge def piyo(*args) super(*args) hoge end end Y.new.extend(PiyoHoge).piyo
策士策に溺れる・・・ ・・・そんなこと無いかな
苦しい
>>112 聞いた限りでは、本当にそんなテクニックが必要なのかどうか疑問に感じる
素直にpiyoの中でhogeを呼ぶか、superを使った方がいいんじゃない?
そもそも不可能な気もするしな
>>104 ^ 行の先頭
$ 行の末尾
¥A 文字列の先頭
¥z 文字列の末尾
x = <<EOF
GOMI
192.16.0.1
GOMI
EOF
puts '^ .. $ => ' + $1 if x =~ /^(¥d+¥.¥d+¥.¥d+¥.¥d+)$/
puts '¥¥A .. ¥¥z => ' + $1 if x =~ /¥A(¥d+¥.¥d+¥.¥d+¥.¥d+)¥z/
xからIPアドレスを抽出するためなら^ .. $ はアリだが、
x全体がIPアドレスにマッチするかの判定としては不適。
>>98 コレじゃ駄目?
class X
def hoge
p :hoge
end
def poyo
hoge;piyo
end
def piyo;end
end
class Y < X
def piyo
p :piyo
end
end
Y.new.poyo
ビジターパターン?
120 :
88 :2007/12/12(水) 22:00:48
>>93 希望する動作になりました。
これはカンマをつけると配列として処理されてしまうのですね。
本当にありがとうございます。
121 :
98 :2007/12/12(水) 22:01:59
>>118 おお
Rubyっぽいトリックを使わなくても普通にこれでいけそうですね
ありがとうございました
そんなんでいいのかw
>>118 この挙動が理解できん・・・。
なぜ、X#hogeが呼ばれるのか…?
>>123 なぜ、って、どう見てもX#poyoの中で呼んでるじゃん。
ごめん、解釈をまちがった。 Y.new しているから Yのインスタンスなのに、なぜY#poyo じゃなくて、X#piyo が呼ばれるのか分からん。
ああ、わかった。自分の勘違い。 piyo と poyo のスペルの違いに気がついてなかった。 普通に、hoge, fugaとかfoo, bar, bazにしてくれよ。
>>126 ごめん、レスしたあとに気が付いたけど、なんかポヨがずっと頭んなかあったもんだからw
名前重要とか、そこらへんの話
129 :
デフォルトの名無しさん :2007/12/13(木) 13:24:16
「蟲」という字はnkfライブラリだと正しく変換できないのですか? iconvはうまくいくようです。 ruby側に問題があるの? それともnkf側に問題があるの? require 'iconv' require 'nkf' a = "蟲" NKF.nkf('-s', a) #=> "" NKF.nkf('-s', a).size #=> 0 Iconv.conv('SJIS', 'UTF-8', a) => "?" Iconv.conv('SJIS', 'UTF-8', u1).size => 2 UTF-8環境です。 ruby 1.8.6 (2007-03-13 patchlevel 0) [powerpc-darwin8.9.0]
>>129 一文字とか短い文字列だと NKF の文字コード自動判定がうまく動かないと思うので、
NKF.nkf('-Ws', a) みたいに入力文字列のエンコーディングを明示的に指定します。
ソースコードの文字コードは? ソースコードの文字コードを ruby -K? で指定。 nkf -Ws のように変換元の文字コードを nkf に指定。 を確認してみてください。
というかNKF使うならオプションは変換前と変換後の2文字が基本だよね 引数1個のNKFを$KCODEとkconvの合わせ技や2引数のiconvと比較するのは酷だ
133 :
デフォルトの名無しさん :2007/12/13(木) 17:23:46
65.chr #=> "A"のように、漢字についてもできないでしょうか? 漢字についてはputs "\x82\xa0" #=> あ しか知らなくて chars = Array.new start = 0x83 start.upto(0x99){|num| chars << "\\x#{num.to_s(16)}\\x5c" } p chars #=>["\\x83\\x5c", "\\x84\\x5c", "\\x85\\x5c", "\\x86\\x5c", "\\x87\\x5c", "\\x88\\x5c", "\\x89\\x5c", "\\x8a\\x5c", "\\x8b\\x5c", "\\x8c\\x5c", "\\x8d\\x5c", "\\x8e\\x5c", "\\x8f\\x5c", "\\x90\\x5c", "\\x91\\x5c", "\\x92\\x5c", "\\x93\\x5c", "\\x94\\x5c", "\\x95\\x5c", "\\x96\\x5c", "\\x97\\x5c", "\\x98\\x5c", "\\x99\\x5c"] 一連の漢字を生成したいのですが,期待した結果を得られません。 期待しているのは ["ソ","噂","浬","欺","圭","構","十","申",....] です。 アドバイスください。
>>133 pack を使うと良いかも。
#!/usr/local/bin/ruby -Ks
chars = Array.new
start = 0x83
start.upto(0x99){|num|
chars << [num, 0x5c].pack("CC")
}
p chars
>>134 ありがとうございました。
(packが実のところよく解ってはいないのですが,
中身は解らなくても,とりあえず結果を得られたので,,,^^)
C++で作ったプログラムのテストをRSpecでやるのは C++で作ったプログラムのテストをC++でやるより楽になるでしょうか。
rubyをダウンロードして解凍もしたんですが autoexec.batのPATHのところで手間取ってます 頼みにしていたHPが見れなくなっているので困っています なんて書き加えればうまくいくんでしょうか? rubyは C:\rubyに解凍してあります
使っているOSがXPではなくて98SEなせいか この方法では出来ないみたいです
>>139 いろいろな意味でOS乗り換えたほうがいい。
クラス定義(中のメソッド定義)の中で、そのクラス自身のインスタンス生成できますか?
self.class.new()
144 :
デフォルトの名無しさん :2007/12/15(土) 10:14:16
145 :
デフォルトの名無しさん :2007/12/15(土) 18:40:34
文字列の最後の1文字を削るにはどうしたらいいですか?
>>145 >> x = 'abcde'
=> "abcde"
>> x.chop!
=> "abcd"
>> x[-1,1]=''
=> "abc"
>> x = x[0..-2]
=> "ab"
いろいろあるよ。
147 :
デフォルトの名無しさん :2007/12/15(土) 21:05:38
ありがとうございました. chopでうまくいきました.
>>146 どれも最後の1バイト削ってるだけじゃねーか
最後の1バイト削る方法教えてください こうすればいいよ どれも最後の1バイト削ってるだけじゃねーか っていう
Pythonとかのリスト内包表記が便利過ぎてRubyでも使いたいのですけど なんとかならないですか
こんな感じのやつ(イメージです) evens = [ n in (0..10) if n % 2 ] => [0, 2, 4, 6, 8, 10]
その程度だとRubyだとこんな感じ? evens = (1..10).select{|n| (n % 2).zero? } 長さはちょい長いぐらい?
>>152 正直無理じゃない?アレは結構python独特のものだから、rubyの側で実装してもらわないと。
いや、そういう風にかけば等価なのはわかりますけど、
リスト内包は数学っぽくてわかりやすいのです。
S^1 = { x \in R, y \in R | x^2 + y^2 = 1 }
みたいな書き方するじゃないですか。
あと、
[ [ i + j for (i in range(0, 10))] for (j in range(0, 10)]
と書くと直感的に二次元配列が出来て便利〜みたいな。
>>154 そうですか〜
ググって、文字列をevalしてそれっぽいことやってる人がいるのを見かけた
のでそれで我慢することにはしますが。
generatorでうまくかけないものだろうかねぇ。 evens = Generator.new {|g| n = 0; loop { g.yield(n); n += 2} }
require 'generator' class NumberSequence def initialize(first=0, &block) @pred = block @gen = Generator.new do |g| value = first loop do g.yield(value) if @pred.call(value) value += 1 end end end def next @gen.next end end events = NumberSequence.new {|n| n % 2 == 0 } 10.times do puts events.next end などと書いてみてから、無限である必要がないことに気づいた。
なんか手が勝手にtを付け足していたらしい。 eventsじゃなくてevensな。
>>155 Ruby に訳すと
(0...10).map{|j| (0...10).map{|i| i + j } }
とか、
Array.new(10){|i| Array.new(10){|j| i + j } }
とかになるな。
RubyのイテレータはPythonのmapやfilter等に比べて
もっとマクロなものだから、Pythonで内包書くところは
Rubyだとイテレータのが合うと思う。
逆にPythonでmapやfilterとか、イテレータオブジェクト使うところは
Rubyだとちょっと悩む。
1.9で 0.step(1.0/0.0, 2) ってできなかったっけ?
正規表現で、マッチしたらfalseを返して欲しいときに /hoge/ =~ string ? false : true こんな事してみたんだけどもっと幸せな方法はありますか?
not /hoge/ =~ string
/hoge/ !~ string
ありがとう リファレンスの正規表現の頁に書いてくれないとワカンネ・・・
165 :
デフォルトの名無しさん :2007/12/16(日) 19:16:44
Errorがraiseされたときに、 RuntimeError: **ERROR from (irb):2:in `g' from (irb):1:in `f' from (irb):3 from :0 と表示されるけど、例外をこの形式の文字列に変換してくれる関数ってありますか。 begin .. except .. end でチャッチした例外を、上と同じ形式でログファイルに書きたい。
これで同じにはなる。 bt = e.backtrace puts("#{bt[0]}: #{e.message} (#{e.class.to_s})") 1.upto(bt.length - 1) { |i| puts("\tfrom #{bt[i]}") }
って、これは Matz Ruby のメッセージだから、 irb だとまた変わってくるのか。
168 :
デフォルトの名無しさん :2007/12/16(日) 20:09:12
rubyにおけるPy_Initializeはありますか? rubyインタープリンタを自作EXEに組み込みたいです Py_Initializeはpythonのドキュメントで詳細な説明がなされていて組み込み用途で用いてもよいことが感じ取れる(!?)のですが ruby_initはググってもRubyソースコード完全解説のページが先頭にでたりして自作EXEの中で呼んでいいのか分かりません
169 :
デフォルトの名無しさん :2007/12/16(日) 22:12:39
a = ["あいうえお","かきくけこ","さしすせそ"] といったようなArrayの内容をファイルに書き出すために File.open("temp.txt","w") do |file| file.puts "array - " + a.to_s end と書くと array - ["\202\240\202\242\202\244\202\246\202\250", "\202\251\202\253\202\255\202\257\202\261", "\202\263\202\265\202\267\202\271\202\273"] といったようなUTF-8の表記で出力されてしまいます. array - あいうえお かきくけこ さしすせそ という風に日本語で出力するにはどうしたらいいですか?
> array - ["\202\240\202\242\202\244\202\246\202\250", "\202\251\202\253\202\255\202\257\202\261", "\202\263\202\265\202\267\202\271\202\273"] それはありえない inspectされるはずがない puts の代わりに p を使ってないか
いえ.書いたとおりです. 環境はWindowsXP バージョンはruby 1.9.0 (2007-07-09 patchlevel 0) [i386-mswin32] 開発にRDE使用 です. 【サンプルコード】 a = ["あいうえお","かきくけこ","さしすせそ"] File.open("temp.txt","w") do |file| file.puts "array - " + a.to_s end
目的は,配列の文字列をすべてファイルに出力することです. なるべくループで回したりせずに1行で書きたいと思います. それができればいいので,他の方法があればよろしくお願いします.
>>172 Array#join
そういう用途のときには、Array#to_sはあまり当てにしないほうがいい
a.to_s は あいうえおかきくけこさしすせそ にならなければならないんだが… まあとりあえず、配列を書き出す際は適当な区切り文字でjoinさせて文字列にするのが普通 irb> puts "array - #{a.join(',')}" array - あいうえお,かきくけこ,さしすせそ
>>168 README.EXTとREADME.EXT.ja
組みこみ例としてはmod_rubyとかvimとかmfiler2とか。
Pythonほどドキュメントが充実してないけどそう難しくない。
Array#to_sは1.9から#inspectじゃなかったかな 少なくともうちのruby 1.9.0 (2007-07-09 patchlevel 0) [i386-mswin32]だとそうだ
ていうか初心者スレの人間が1.9なんて使うなよ あれは1.8を理解した人間が使うものだ
また1.9か。初心者は1.8使いましょう。
179 :
デフォルトの名無しさん :2007/12/16(日) 22:53:15
>>173-4 joinでうまくいきました.
ありがとうございました.
>>179 今すぐ1.9をアンインストールして1.8.6をインストールしろ
今すぐだ
1.9は速いだあ?
お前が使ってるうちはどんなスクリプト言語より処理は遅いよ
なんでけんか腰なのかわからんw
テンプレに「初心者は開発版を使うな」って書いておくべきだな
すくなくとも初心者のスレで1.9の話題はナシだろ。
184 :
デフォルトの名無しさん :2007/12/16(日) 23:05:35
>ていうか初心者スレの人間が1.9なんて使うなよ >あれは1.8を理解した人間が使うものだ え.そうなんですか? 何も考えず最新版を入れてました. 1.9は言語仕様の変更とかバグとかが多いんですか?
>>184 どのサイトを見て最新版を入れたんだ?
>>185 でも普通、初心者はわざわざFTPディレクトリに飛ばないと思うんだが
そうでもないんだろうか
1.9は開発版でしたか. 良く覚えてませんが,ftpから適当に数字の大きい最新版を落とした様な気がします. どうも失礼しました.
188 :
デフォルトの名無しさん :2007/12/16(日) 23:24:20
ところで, ruby-1.8.6-p111-i386-mswin32.zip で良いんでしょうか? ruby-1.8.6-i386-mswin32.zip ruby-1.8.6-p36-i386-mswin32.zip と3つあるみたいなんですが. pはパッチの意味ですか?
at_exitを使うと、プログラム終了時に行う処理を登録できますが、 そんな感じで、例外が発生したときにそれをキャッチする処理を登録できますか。 begin - rescue - end で全体を囲めばいいんですが、そうでない方法で例外ハンドラを登録する方法があれば教えてください。 やろうとしているのは、requre 'foobar' としたら自動的に例外ハンドラが登録されることです。
>>190 raise+rescue なら rescue ブロックの end 以降に処理が続くけど
登録したハンドラの処理が終了した後はどうなる事を期待してる?
require 'foobar' でどうにかするって事が目的なら
例外を発生させてるメソッドを上書きする方がよくね?
>>190 requireだけですべての例外を補足できる方法は、おそらくない
明示的にbegin - rescue - endするしかない
>>191 >require 'foobar' でどうにかするって事が目的なら
>例外を発生させてるメソッドを上書きする方がよくね?
どこで例外が起きた場合でも補足できるように、ってことなんだろう
>>188 pの数は新しいほど大きいから、新たにダウンロードするなら
一番大きいruby-1.8.6-p111-i386-mswin32.zipでいいよ
初学者向けで1.9.0の扱いを説明してるページは少ないな
誰もが、よもや初心者が 1.9.0 に関心を持つとは思っていなかったからではないかな。 でも、こう立て続けに 1.9.0 ではまる初心者が出てきてるのをみると、最近何かあった?
196 :
デフォルトの名無しさん :2007/12/17(月) 13:22:41
初心者なのにパフォーマンスを気にしてるの?
パフォーマンス気にするのは良いけど、代償が大きすぎる。 それでハマってもここに質問しにくるのはやめてほしい。自己責任で頼むよ。
遅い遅いと言われ続けてきた反動かな? マスコミに煽られるとナ‥‥
>>196 というか、そういう内容の記事によってRubyの露出が増えていて、
それによってRubyという言語に興味を持つ人間が増えているんだろう。
「パフォーマンスに興味を持つ」のと「パフォーマンスを大々的にアピールする記事の連発を通して
Rubyに興味を持つ」のはまるで別物で、増えているのは後者だと思うよ。
ただ、興味のきっかけが「1.9.0はすごいよ!」っていう記事である以上、まぁ普通そのバージョンを
入手しようと思うわけで、そこんとこでこのような流れが生まれるんだろうね。
「ただし初心者にはおすすめできない」みたいな注釈が、速度絶賛系の記事にあればいいんだけど、
Ruby記事なんて大体が宗教冊子みたいなもんだから、そういうことは書いてあるはずもなく。
パフォーマンスが悪い言語なんて誰も興味を持たないからだ
まぁ初心者じゃない人が1.9を知らないってだけなんだけどな
ここに質問しにくるのはいいんじゃないの? その分ruby-listのノイズが減るじゃん。 「hogehogeがruby-1.9で使えなくて困ってます(><)」 って言われたら 「そうねえそれは困りましたねえ(・∀・)ニヤニヤ」 って言えばいいんだし。
本スレはそれでいいけど、初心者スレでその回答はどうかなぁ。 卒業した学校の部活に、下手糞なアドバイスをしに来る痛い先輩みたいでさ。
「1.9はサポートできないから初心者は使うな、使い続けたいならここに来るな」 でよろしいかと 1.9の質問受け付けるのは専用スレがあってもいいくらいのめんどくささだぞ
正式版はクリスマスにでるんだっけ? 文字コードにあわせて1文字 not 1byteになるととっつきやすいんだけどなぁ
-> 記法にははやいとこ死んでほしい。Yarvは歓迎するけど、Ruby2 featureには 要らないものが多いよ。おいらはただ、速いC rubyが欲しいだけなんだ。
207 :
デフォルトの名無しさん :2007/12/17(月) 16:40:09
そういう話は本スレでどうぞ
HTMLの実体参照を戻すのに CGI.unescapeHTML(string)よりいいのありませんか? ♥(ちゃんと見えてるか?) とかも戻せるのが欲しいです。
&heartsでなくて♥です。
>>208 cgi.rbのunescapeHTML()をコピって、heartsを追加。
かっこわるいけど。
>>208 よく考えたら、どの文字コードに変換するのか指定できないといけないね。
'&' や '<' はASCIIだから文字コード気にしなくていいけど、♥はそうもいかないな。
$KCODEみて変換すればいいのかな。
>>211 cgi.rb 見るとそうなってる ($KCODE が UTF-8 のときのみ変換) けど、
本当は $KCODE ではなく出力する対象のドキュメントに合わせるべきだよね。
"を単なる文字として扱うにはどうすれば良いでしょうか?
シングルクォートな文字列にする
'ダブルクオートは"です'
ダブルクオートの中ならバックスラッシュでエスケープする
"ダブルクオートは\"です"
好きなほう使え
>>215 よいかと
他にもなんとかする方法はある気はするがそんなもん覚えなくてよし
ありがとうございます
引数の参照渡しってできないんだっけ?
できない と思っていただこうッ! 真似はできるけど肝心なとこで動作が違うからRuby式の別物として理解したほうがよい
>>219 え、やっぱそうだったか。
ちょうど参照渡ししたいとこがあったんだけど、別の方法を考えるとするかな。
具体的にどういう動作を望んでるのか説明するとアドバイスがあるかも ないかも
>>210 ,211,212
サンキュー。
とりあえずぶち当たったもんを処理する事にします。
>>218 >>220 実際はほとんど全部が参照渡しなんだが、代入した時点で参照が外れる。
だから、参照渡しみたいな動作をさせるなら、
・配列として渡し、配列の要素を変更する。
・オブジェクトとして渡し、値を変更するメソッドを呼び出す。
・そもそもRubyの場合、return a,b,c と複数の値を返せるのでそれほど必須ではない。
とまあ、よく使われる方法はこんなとこかな。
俺的には2番目か3番目の方法をオススメ。
適当なこと言わないように
遠慮せず訂正してもいいんだよ
配列などに、「もし何か入っていたら」を記述するとき、 if ! obj.empty? や unless obj.empty? みたいに、 否定的な表現をしなくちゃいけないのが抵抗あるんですが、 何かうまい記述はありますか?
obj.exist? みたいなの作っちゃえば?
うーん、そうですね。ただ、 exist? は名前がいまいち・・・(私も思い付きません)
contain?とか
irb> puts '何か入ってます' if [].any? irb> puts '何か入ってます' if [nil, nil, false].any? irb> puts '何か入ってます' if [''].any? 何か入ってます
size > 0 でいいじゃん
それは [nil].size が 1 であることを許容できるかどうかにかかってるな つか、「何か入っている」のではなく「空ではない」と考えるようにしたほうがいい empty が通常の状態
233 :
デフォルトの名無しさん :2007/12/19(水) 12:42:55
文字列から連続する英字を取りたい str = "Java1.5と日本語は除外 rubyperl,ruby 1.9ああああpythonいいい" #なんらかの処理 ["Java"、"rubyperl"、"ruby"、"python"]
str = "Java1.5と日本語は除外 rubyperl,ruby 1.9ああああpythonいいい" p str.scan(/[a-z]+/i) #=>["Java", "rubyperl", "ruby", "python"]
警告に関して質問させてください 文字列をパースして処理を行う、小さなライブラリを作っているのですが 途中でパースできない行を見つけたときに警告を出したいと思っています このとき、以下のどの方法を取るべきでしょうか? 1. 常に$stderrに警告 2. 冗長モード($VERBOSE)なら$stderrに警告 3. デバッグモード($DEBUG)なら$stderrに警告 4. 冗長モードかデバッグモードなら$stderrに警告 冗長モードとデバッグモードの使い分けが今ひとつ分からず、悩んでいます
3
警告の内容にもよるかもしれん 適当な自作の例外を発生させたほうが好ましい場合もあると思う
>>235 パーサでは常に例外を発生させる、でいいと思う。
それをmainプログラムでキャッチして、常に$stderrに表示。
パースできないデータなら、そうするべき。
警告を使うなら、警告文を表示するけど処理は継続する場合じゃないかな。
例えば古い書き方を使っていて、今のパージョンではまだサポートするけど将来は廃止する予定だから新しい構文を使ってね、という場合にwarn()で警告する。
パースできないというのは致命的だから処理を継続すべきでなく、よって例外を発生するのが自然。
>>235 デバッグモードと冗長モードの使い分け:
* ユーザに表示するデータは冗長モードで出力
* 開発者だけに限定するならデバッグモードでのみ出力
冗長モードはユーザのため、デバッグモードは開発者のため、という理解でいいんじゃね?
IO::ioctlの使い方がよくわかりません。 Debian Linux 2.6.18-4, ruby 1.8.5 (2006-08-25) な環境で #!/usr/bin/env ruby require "socket" SIOCGIFINDEX = 0x8933 s = UDPSocket.open() puts s.ioctl(SIOCGIFINDEX, "lo") というスクリプトを実行すると、「0」が帰ってきます。 lo以外の(eth0などの)インターフェイス名を指定しても、全て「0」が 帰ってきます。 何か使い方を間違っているのでしょうか。 教えてくださいませ。
WindowsのEmacsでinf-ruby使うと、入力がエコーバック されるのですが、そういうものなのでしょうか? 抑止する方法ってありますか? --- irb(main):001:0>1+1(return) 1+1 2 irb(main):002:0> --- コマンドプロンプトからirbを起動した場合は、 エコーバックされません。 UbuntuのEmacs上ではエコーバックされないで 値だけが表示されました。 Ruby 1.8.6 Emacs 22.1 Meadow 3 WinXP SP2
242 :
235 :2007/12/20(木) 21:08:02
ありがとうございました。 パース失敗が致命的ではなく(エラーは単に読み飛ばすだけ) エラーの内容を、ユーザーに表示する必要がある処理のため $VERBOSEで判定することにします。
質問です。 windowsでRuby使ってるんですが、コマンドプロンプトで指定したテキストファイルを読み込ませたいです。 f = open("SA.txt") reviewbody = f.read reviewbodyは処理対象みたいな このSAの部分をコマンドラインから入力できるようにしたいんですが、どうすればいいでしょうか?
puts 'なにか入力してください' text=STDIN.gets.chomp puts "#{text}が入力されました" なにか入力してください なにか なにかが入力されました
>>244 さま
ファイル名をコマンドプロンプトから指定するという意味です。
246 :
デフォルトの名無しさん :2007/12/21(金) 12:58:03
「ファイル名をコマンドプロンプトから指定する」とはどういう意味?
>>245 > cat argv.rb
puts "引数の一つ目は#{ARGV[0]}です"
puts "引数の二つ目は#{ARGV[1]}です"
> ruby ./argv.rb いっこめ ふたつめ
引数の一つ目はいっこめです
引数の二つ目はふたつめです
>>247 さま
ちょっとやってみます。
>>246 さま
Getsでとってきたら無理だったんですが、要するに
f = open("SA.txt")
reviewbody = f.read
だったらSA.txtをreviewbodyとしてyahooの形態素解析にかけてるんですが、そのSA.txtをgetsみたいにとってこれたらなぁって思ってます。
指定できないといちいちソースにファイル名書き込んだりして変更しなきゃいけないので・・・
それを何とかしたいワケです。
これは何度でも言うが、そういうのは試してから書き込め
251 :
デフォルトの名無しさん :2007/12/21(金) 14:41:05
Mac OS X 10.5 Leopard (ruby 1.86 (OSに標準添付) )に mysql-ruby 2.7.4 をインストールしたいのですがうまくいきません。 ちなみにMySQLは、5.0.45 (Mac OS X 10.4 (x86) package format )です。 ruby extconf.rb --with-mysql-include=/usr/local/mysql/include/ --with-mysql-lib=/usr/local/mysql/lib/ --with-mysql-config checking for mysql_ssl_set()... no checking for mysql.h... yes creating Makefile ここまではうまくいってる??みたいですが、次のMakeで
252 :
デフォルトの名無しさん :2007/12/21(金) 14:41:40
make gcc -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -DHAVE_MYSQL_H -I/usr/local/mysql/include -Os -arch i386 -fno-common -fno-common -arch ppc -arch i386 -Os -pipe -fno-common -c mysql.c cc -arch ppc -arch i386 -pipe -bundle -o mysql.bundle mysql.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch ppc -arch i386 -lruby -L/usr/local/mysql/lib -lmysqlclient -lz -lm -lpthread -ldl -lm ld: warning in /usr/local/mysql/lib/libmysqlclient.dylib, file is not of required architecture Undefined symbols for architecture ppc: 〜〜〜〜〜〜〜〜〜〜〜〜〜((中略))〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 d: symbol(s) not found for architecture ppc collect2: ld returned 1 exit status lipo: can't open input file: /var/folders/Zl/ZloNZj5oH0WIO5VZfrwj2k+++TI/-Tmp-//ccQ3tHRa.out (No such file or directory) make: *** [mysql.bundle] Error 1 となってしまいます。いろいろググってみたのですが解決方法がわかりません。 どなたかお知恵をお貸ししていただけないでしょうか?
>>252 「lipo: can't open input file:」
でぐぐるといいことあるかも
gem使ってやれば?
>>254 gem使っても、結局は自分の環境でmakeするんじゃないのか?
それを自動的にやるかどうかの違いだけで
>>241 です。
スレちがいだったでしょうか? Meadowスレとかのほうがいいかな。
この現象は俺だけ?
なんかうろ覚えで間違えた。 ARCHFLAGS="-arch i386" が正しい。
259 :
252 :2007/12/21(金) 23:13:45
Makefileの中の"-arch ppc"という部分を消してみたら無事、通ったみたい??です。 みなさんありがとうございました。 しかしまだサンプルスクリプトは動かず、、、とりあえず一歩前進ということで。 make cc -arch i386 -pipe -bundle -o mysql.bundle mysql.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch i386 -lruby -L/usr/local/mysql/lib -lmysqlclient -lz -lm -lpthread -ldl -lm sudo make install Password: /usr/bin/install -c -m 0755 mysql.bundle /Library/Ruby/Site/1.8/universal-darwin9.0
260 :
252 :2007/12/21(金) 23:32:01
>>258 様
すいません、見落としていました。
258様のいうとおりにやってみたら、前よりさらによくなったようです。
ARCHFLAGS="-arch i386" ruby extconf.rb --with-mysql-include=/usr/local/mysql/include/ --with-mysql-lib=/usr/local/mysql/lib/ --with-mysql-config
checking for mysql_ssl_set()... yes
checking for mysql.h... yes
creating Makefile
261 :
252 :2007/12/21(金) 23:32:52
make gcc -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/ 1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -DHAVE_MYSQL_SSL_SET -DHAVE_MYSQL_H -I/usr/local/mysql/include -Os -arch i386 -fno-common -fno-common -arch i386 -Os -pipe -fno-common -c mysql.c cc -arch i386 -pipe -bundle -o mysql.bundle mysql.o -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch i386 -lruby -L/usr/local/mysql/lib -lmysqlclient -lz -lm -lpthread -ldl -lm sudo make install Password: /usr/bin/install -c -m 0755 mysql.bundle /Library/Ruby/Site/1.8/universal-darwin9.0
よくわかんないんだったらpure rubyのやつ使いなよ
ちなみにmacportsで入れたmysqlではうまくいってる。
264 :
デフォルトの名無しさん :2007/12/22(土) 00:23:52
def で返り値を返したい時にはどうしたら良いんですか?
return使えreturn
266 :
デフォルトの名無しさん :2007/12/22(土) 00:25:41
最後に評価された式の値が返されます
>>264 exitでもしない限りdefは常に返り値を返す
268 :
264 :2007/12/22(土) 00:43:52
ありがとうございました。
269 :
デフォルトの名無しさん :2007/12/22(土) 01:05:21
defの引数評価はできますか? StringだったときとArrayだった時で処理を分けたいんですが.
引数のオブジェクトが何オブジェクトに属しているか調べればいい あるオブジェクトが具体的に何のオブジェクトに属するか調べるメソッドは マニュアルのObjectオブジェクトのところに載ってたり載ってなかったりすると思う
それを引数評価とはいわないけどな。
272 :
デフォルトの名無しさん :2007/12/22(土) 04:10:38
今Rubyでプログラムを作成しているのですが質問があります. files = Dir.glob("**/*.{html,htm}") で,サブディレクトリ内全てにあるHTMLファイルを取得するじゃないですか. その後に,取得したHTMLファイルのファイル名によって処理を分けたいのですが, ファイル名の違いを分ける正規表現の書き方,および処理の書き方が分かりません. どなたか教えてください! 下が具体例です.. files = Dir.glob("**/*.{html,htm}") によって取得したファイルは,"main1.html","main2.html","sub1.html","sub2.html" の4つとする. "main1"と"main2"で同じ処理,"sub1"と"sub2"で同じ処理を行うように分けたい. ちょっと分かりにくいかもしれませんが,, つまり"main〜"ファイルと"sub〜"ファイルで処理を分けたいんです!! 各処理内容は要らないんで,ファイル名による識別とif文の分け方を教えてください!!!
>>272 Dir.glob("**/*.{html,htm}") { |file|
case File::basename file
when /main/
do_main_with file
when /sub/
do_sub_with file
end
}
>>272 p "test01.html".scan(/[^\d]*/)[0]
こんなの(xx01xx01.xxx)は無い前提なんだよな?
275 :
デフォルトの名無しさん :2007/12/22(土) 06:45:41
obj=Regexp.new("ー") と宣言すると rb80.tmp:1:in `initialize': invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern: /\201[/ (RegexpError) と言われるのですが、このエラーを回避するにはどうしたらいいですか? 「ー」の文字が良くないみたいなんですが。
276 :
デフォルトの名無しさん :2007/12/22(土) 06:46:56
ちなみに、処理系はsjisです。
>>275 処理系は SJIS だとよく意味が分からないので
スクリプトファイルは SJIS とかかな
Ruby インタプリタにスクリプトの文字コードが伝わっていないのが原因
Ruby インタプリタに文字コードを教えてやればいい
スクリプトファイルが hoge.rb として
1.実行時に指定
ruby -Ks hoge,.rb
2.インタプリタの起動オプションを書く
スクリプトファイルの先頭に
#!ruby -Ks
と書いて
/hoge.rb
3.
$KCODE="SJIS"
を
obj=Regexp.new("ー")
より前に書く
278 :
デフォルトの名無しさん :2007/12/22(土) 07:27:36
>>277 はい。スクリプトファイルがSJISです。
うまくいきました。
ありがとうございました。
Rubyに限った話しじゃないけど、 実引数名と仮引数名って、別にした方がいいの?
280 :
260 :2007/12/22(土) 10:13:19
>>260 です。やっぱりサンプルコードが動きません、、、
たとえば下のコードでは、ブラウザに表示されるのは'abc'だけです。
うまくいったと思ったんですけどねぇ。
[略]
print 'abc'
require 'mysql'
print 'def'
[略]
abcと出て他には何も出ずに終了?
282 :
270 :2007/12/22(土) 10:45:50
>>281 様
はい、そうなんです。
せめてエラーコードが出れば、そこから推測もできるかもしれないのですが、、、
Webブラウザ上にエラーメッセージがほいほい出るわけなかんべ ローカルで検証コード動かせ
284 :
282 :2007/12/22(土) 10:58:41
>>283 様
やってみましたっ!!
uby my.cgi
Content-Type: text/html
/Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle: dlopen(/Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle, 9): Library not loaded: /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib (LoadError)
Referenced from: /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle
Reason: image not found - /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle from my.cgi:4
libmysqlclient.15.dylibは調べてみたら、/usr/local/mysql/lib/ にありました。
どうやってパスを修正すればよいのでしょう??
mysql.bundleはちゃんと /Library/Ruby/Site/1.8/universal-darwin9.0/ にありました。
ファイル属性を調べてみたら、
ls -l
-rwxr-xr-x 1 root admin 86264 12 21 23:27 mysql.bundle
でした。問題??
file /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib file /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle の結果は? 片方がうにばーさるで片方がi386専用と見た。
286 :
284 :2007/12/22(土) 11:34:31
>>285 様
えーと、自力でごにょごにょやっておりましたら、
cd /usr/local/mysql/lib/
mkdir mysql
cd mysql/
sudo cp ../libmysqlclient.15.dylib libmysqlclient.15.dylib
で、ついに通りました!!!みなさまのおかげです!!!
どうもありがとうございました!!!!!!!
ちなみに
file /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib
/usr/local/mysql/lib/mysql/libmysqlclient.15.dylib: Mach-O dynamically linked shared library i386
file /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle
/Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle: Mach-O bundle i386
でした。
>>284 mysql/ がもう1つ入ったパスになってるのね。
>>279 仮引数のスコープは一部の例外(※)を除いて定義されたメソッド内に限定される為、
実引数と仮引数が同名であっても何ら支障は無い(※eval,erb等のbinding)
わざわざ仮引数名調べて違う名前考えるのも面倒だしな
ますます払わないぞ>高額所得者の支給停止
ごめん、誤爆
>>288 サンクス
プログラミングの作法として、どうなんだろうって思った。
そのメソッドの内容からみて、ふさわしい仮引数の名前であれば、
それがたまたま実引数と同じであってもいいよね。
html = get_from_web(uri) data = parse_hoge(html) def parse_hoge(html) data = Array.new … return data end というようなことはしょっちゅうですが何か 改造可能で公開するモジュールではこれやると若干恥ずかしいだろうけど
何か問題あるのか?
294 :
デフォルトの名無しさん :2007/12/23(日) 01:41:40
クラスメソッドの引数の型チェックってできますか? たとえば、引数がStringとArrayで処理を分けたいのですが。 Arrayも1次元と2次元で処理を分けるなど複雑な事をしたいのですが。
引数のオブジェクトが何オブジェクトに属しているか調べればいい あるオブジェクトが具体的に何のオブジェクトに属するか調べるメソッドは マニュアルのObjectオブジェクトのところに載ってたり載ってなかったりすると思う
むしろ Array の中身をそのクラスメソッドの前で分解できれば 複雑なこと(他人が理解しづらいこと)しなくていいんじゃない? 他人=コーディングした数ヶ月の自分でもある 文字列だけじゃないならどうしようもないけど
>>294 =269 か?
メソッドオーバーロードはrubyではできない。こんな感じで自分で処理しなさい
def meth(arg)
if arg.kind_of?(String)
puts '文字列'
else
case arg
when Array then puts '配列'
else puts 'その他'
end
end
end
それとrubyの配列(Array)に次元なんて無い。配列が入れ子になってるだけ。
298 :
294 :2007/12/23(日) 04:58:49
>>295 なるほど。Objectのメソッドですね。
ありがとうございます。
>>296 それも考えて、ループや型変換で今までやってたんですけど、
すっきりスマートに呼び出したいなーという欲望に駆られましてw
>>297 >
>>294 =269 か?
ちがいますよー。
>メソッドオーバーロードはrubyではできない。こんな感じで自分で処理しなさい
なるほど。
メソッドの中で分岐させればいいわけですね。
考えてみれば、この方がオーバーロードより単純に処理できますね。
ありがとうございました。
>それとrubyの配列(Array)に次元なんて無い。配列が入れ子になってるだけ。
そうなんですか。
2次元のデータを扱おうと思ってて、Cと同じ感じでやろうと思ってるんですが、良くないんでしょうか?
概念が違いますか?
299 :
240 :2007/12/23(日) 05:54:50
誰かおせーてorz
>>298 概念は全然違う。
2次元配列風に使う分には問題ないと思うが、違いを分かって使わないと細かいことを
し始めたとき引っかかるかも。
例えば(Cでいう)1次元配列と2次元配列とで処理を分けたいのなら、Arrayの要素が
全てArrayであり、そのArray内のArrayの要素数が全て同じであることをあらゆる
配列アクセス時にチェックしないといけない。
arr[5][10]のように使いたい場合、「君の仕様上」間違ってarr[5][11]に代入しても
Rubyではエラーにならないので、真面目に2次元配列として使いたいならばArrayを
継承してそういうチェックを代入時や参照時にするようなメソッドを足す必要がある。
このチェックだけ足せばいいってわけでもないけど、とにかくCの2次元配列とは違う
ものだとわかった上で使わないと、罠にはまるだろうね。
>>297 このコードはないわ。
>def meth(arg)
> case arg
> when String ; puts '文字列'
> when Array ; puts '配列'
> else ; puts 'その他'
> end
>end
または
>def meth(arg)
> if arg.kind_of?(String)
> puts '文字列'
> elsif arg.kind_of?(Array)
> puts '配列'
> else
> puts 'その他'
> end
>end
>>240 ioctl(2) は見た?
何をしたいのかは俺にはわからんが、0 が返るのは正常な動作みたいだよ?
ワンライナーで、 while...endループの前に一度だけ実行してほしいものは どのように書けばいいでしょうか。
>>294 どちらかといえば、引数を見て処理を分けるよりも
違う型の引数をとるメソッドには、それぞれ違う名前を与えるべき
つまりStringを受けるメソッドと、1次元Arrayを受けるメソッド
そして2次元Arrayを受けるメソッド、三種類のメソッドを作る方がいいと思う
実際にどんな処理がやりたいのか分からないから、明確な助言はできないが
というか本質的に何か間違っているはず 2次元配列(って何?)を1次元配列や文字列と区別せず受け取るメソッドの見当がつかない もしかしたらメインは2次元配列で、1次元配列や文字列を受け取ったとしても内部的に2次元配列に変換するぜという動作なのかもしれないけど
>>300 とぶん、
>>297 は、横着して、ひとつのコードで、それら両方の手段を示したかったんだと思うw
>>302 ruby -ne 'BEGIN { puts "only once" }' -e 'print $_' < input
`foo`.split("\n").each{|line| } で`foo`の終わりを待たずに順次実行って出来ないの?
どの時点の"順次"なんだよ
「`foo`の終わり」を定義してもらおうか
>>307 open('foo | tail -f') do |file|
file.each_line do |line|
...
end
end
とか。
探すとFile::Tailってのもあるようだが。これはIOじゃなくFile限定なのかな。
311 :
310 :2007/12/23(日) 12:53:14
ん、なんか質問の意味を勘違いしたらしいorz
>>307 splitをはさんでるからじゃね?
`foo`の結果は文字列なんだから
`foo`.each_line do |line| .. end
でいいと思う。
>>312 ごめん、まちがった。
`foo` が文字列を返すから、fooがすべて終了しないと返ってこないわな。
310のようにI/Oつかうしかないと思う。
315 :
デフォルトの名無しさん :2007/12/23(日) 15:57:06
RubyInstallerWiki: RubyInstaller
http://rubyinstaller.rubyforge.org/wiki/wiki.pl?RubyInstaller 以前、OneClickInstaller で入れたのですが、
同じく OneClickInstaller (1.8.6-26 final)で、アップデートしようとしたら、
一旦、gemとかライブラリなど、丸ごとディレクトリを消して、インストールしやがりました。
いや、インストーラーが、消しますかって言ってたし、
ディレクトリのバックアップは取ってあるからよいのですけど。
※ちなみに、要望で、OneClickUpdater が希望されてますけど、スルーされてる orz
この場合どうやって、アップデートするのがよいでしょうか?
・ActiveScriptRuby で上書き(できれば)
・mswin32 で上書きコピー
というか、バイナリ的には、変わらないのかな?
316 :
デフォルトの名無しさん :2007/12/23(日) 16:25:42
>>304 >どちらかといえば、引数を見て処理を分けるよりも
>違う型の引数をとるメソッドには、それぞれ違う名前を与えるべき
ええ。まぁ。
自分の好みの形で変数の内容をファイルに書き出したいだけなので。
取り出すときに一つの命令で出せるとコードがすっきりすると思うので。
joinとかで整形しても良いんですが、何か一つの命令でまとめて、
内部で勝手に判断して書き出してくれると、
本編のループが減ってがすごくすっきりしますから。
317 :
デフォルトの名無しさん :2007/12/23(日) 16:32:40
>>299 なるほど。
Cの様に範囲の決まった連続したメモリ構造というより、
リンクやTREE構造という事ですか。
だから、間違った位置に代入するとかそういうヒューマンエラーを
コンパイラがチェックしてくれないので気を付けないといけない訳ですね。
もしかすると、新たにクラスを作って配列みたいに使える機能とかを
組み込んでも良いですねw
なんだか、汎用ライブラリにできそうですが。
型チェックを行うクラスというか。そんな感じの物を。
そうすると、より堅牢な形になりそうですね。
318 :
315 :2007/12/23(日) 17:48:21
うまくアップデートできました。
ActiveScriptRuby
http://arton.hp.infoseek.co.jp/indexj.html はじめ、ActiveScriptRuby をインストーラーから入れたのですが、
rubyのバージョンを確認しても、アップデートされてなくて、
一旦アンインストールして、もう一度、インストールしたら、アップデートされていました。
ただ、bin/gems などの(.batじゃないやつ) 先頭のrubyのパスが正しくないので、
cygwinなどから使えなかったのですが、
コマンドプロンプトから、gem を update したら直りました。
ありがとうございました。
>>299 ioctl なんて使った事無いよ
Cで同じ事やってるの見付けたんだけど
1: struct ifreq ifr;
2: memset(&ifr, 0, sizeof(ifr));
3: strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
4: ioctl(pd, SIOCGIFINDEX, &ifr);
5: index = ifr.ifr_ifindex;
これだと5行目で情報を返してもらうための構造体をioctlに渡してる。
240で渡してる"lo"をstruct ifreq相当の何かに変えないといけないんでない?
>>319 おお、こんなのあったのね。
と思ったが、クソ重いrubyでやる意味あんのかね・・・
>>316 > 自分の好みの形で変数の内容をファイルに書き出したい
俺なら、まず二次元配列用のクラスを作る。
その上で、書き出したいデータの各クラスに
例えば to_myfile とか共通のメソッドを定義。
ファイルに書き出す時は、書き出すところでクラスを判別するのではなく
引数の各オブジェクトに対して to_myfile した結果を使うようにする。
つまり出力形式はオブジェクト側に任せる。
追伸。クラス側を弄れないなら 仕方なく判別するけど。
324 :
デフォルトの名無しさん :2007/12/23(日) 21:58:05
>>322 なるほど。
そういう考え方もありますね。
オブジェクトごとに違ったファイルに書く場合なんかは便利そうですね。
ファイルが違わなくても、出力する体裁が違うだけでも メソッドに任せる意味はある。
326 :
320 :2007/12/23(日) 22:27:03
間違えた、読めばすぐわかると思うけど一応訂正 × これだと5行目で ○ これだと4行目で
327 :
デフォルトの名無しさん :2007/12/24(月) 06:13:58
WWW::Mechanizeで(GET,POSTではなく)HEADは使える?
329 :
デフォルトの名無しさん :2007/12/24(月) 20:51:14
Array型オブジェクトの多次元配列からpushなどを呼び出したいのですが, arr1=["a","b","c","d"] value=[],[] i=0 arr1.each {|s| value[i].push s i+=1 } p value.join("\n") とすると, value[i].push s で undefined method `push' for nil:NilClass (NoMethodError) クラスメソッドがないと言われます. 多次元配列のメソッドを呼び出すにはどう表記したら良いんですか?
RubyのArrayの単純なネスト(入れ子)では多次元配列を表現できない ネストした配列はネストした配列以上のものではない arr[0][1]はarrの0番目の要素のオブジェクトの[]メソッドに引数として1を渡したものを表現しているに過ぎない 以上を踏まえると、value[i]は配列[]の0番目の要素つまりnilだ
先生!踏まえてません! この value は [[], []] で 0番目は [] です! というかこれはそれ以前のアレで、arr1 の "c" に対応するべき value[2] が nil だからじゃね 「まず value[i] が [] でないなら each から即抜ける」という処理を入れるのが順当かと
332 :
デフォルトの名無しさん :2007/12/24(月) 21:18:15
うーん.解ったようなよく解らないような感じです. 3行目が少し高度で理解を超えています. つまり,配列とは,クラスメソッドの中でインスタンス化される新たな クラスという事なんでしょうか? つまり,カラのオブジェクトにpushを指定しているのでエラーが出てると言うことですかね?
333 :
デフォルトの名無しさん :2007/12/24(月) 21:27:08
>>327 Net::HTTP#headでいいんじゃない?
MechanizeをrequireしたらNet::HTTPもつかえるんだから。
value=[],[] #=> [[],[]] つまり、空の配列2つを要素に持つ配列 value[0] : [] value[1] : [] value[2] : nil > カラのオブジェクトにpushを指定しているのでエラーが出てると言うことですかね? 空のオブジェクトというものでは無く、 エラーメッセージの通りnilがpushを持っていないということ
難しく考える必要なし each の中で value を表示させてみる (inspectはオブジェクトを「pで表示する時の文字列」にするメソッド) arr1=["a","b","c","d"] value=[],[] i=0 arr1.each {|s| puts "sは#{s}で、value[#{i}]は#{value[i].inspect}です" value[i].push s i+=1 } 結果 sはaで、value[0]は[]です sはbで、value[1]は[]です sはcで、value[2]はnilです ./value.rb:6: undefined method `push' for nil:NilClass (NoMethodError) from ./value.rb:4:in `each' from ./value.rb:4
336 :
デフォルトの名無しさん :2007/12/24(月) 21:33:20
あ.よく見たら上のソースですとやりたいことが良くわかりませんね. やりたいことは,2次元の配列の2次元目にArrayオブジェクトを入れたいのです. 図ですと value.0.0 ->a value.0.1 ->b value.0.2 ->c value.0.3 ->d こんなイメージです. 入れるオブジェクトの量は可変なのでpushなどで押し込めれば簡単ではないか と考えているのですが,やはりiを使って挿入すべきでしょうか? 考えてみたら,変数のサイズは気にしなくて良いし,iで回しても良いような気もしてきましたが...
まず「クラスメソッド」という用語の使い方を間違っている
君が使っているのは普通のメソッド(=インスタンスメソッド)だけだ
で、
>>336 で言ってる「2次元の配列の2次元目にArrayオブジェクトを入れたい」ってのは
何がしたいのか良く分からないが(Array入れてないし)
たぶんこうなんだろうという予想の元にコードを書くと
CHARS = ['a', 'b', 'c', 'd']
values = [ ]
CHARS.each_with_index do |c, index|
values[index] = [c]
end
p values #=> [["a"], ["b"], ["c"], ["d"]]
arr1 = ["a","b","c","d"] value = [[], []] arr1.each {|s| value[0].push s } p value #=> [["a", "b", "c", "d"], []]
339 :
デフォルトの名無しさん :2007/12/24(月) 21:48:49
>>1 のLinkは何故、Titleが読み難いのですか?
「value=[][]」て書いたらエラーになったんで
「value=[],[]」にしたように見えるんだけどな
どんな結果が欲しいのか
>>336 だと良くわからん
>>337-338 の最後の行みたいなの書いてくれ
341 :
デフォルトの名無しさん :2007/12/24(月) 22:08:06
こんな感じのコードなんですが... arr1=["a","b","c","d"] arr2=["A","B","C","D"] value=[],[],[] i1=0 i2=0 arr1.each {|s1| value[i1][i2].push s1 arr2.each {|s2| value[][i2].push s2 i2+=1 } i1+=1 } p value.join(" , ")
342 :
デフォルトの名無しさん :2007/12/24(月) 22:09:05
よく考えてみたら,2次元では足りませんでした. なので3次元に拡張します. value.0.0.0 ->a value.0.1.0 ->A value.0.1.1 ->B value.0.1.2 ->C value.0.1.3 ->D value.1.0.0 ->b value.1.1.0 ->A value.1.1.1 ->B value.1.1.2 ->C value.1.1.3 ->D value.2.0.0 ->c value.2.1.0 ->A value.2.1.1 ->B value.2.1.2 ->C value.2.1.3 ->D こんな感じの構造の配列がほしいのですが... それとも,クラスをつくったほうがいいのかな...
言いにくいんだが、多次元配列の用語の使い方も根本的に間違ってないか? もしかしてただの行列なのでは?
344 :
デフォルトの名無しさん :2007/12/24(月) 22:13:02
arr2の内容は便宜的に単純化してます. arr2はループごとに内容が変わります. 意味的には,arr1の要素にarr2の内容が関連する という様な構造を表現したいのですが. 配列はそのためのもので,配列でなければならないという 訳ではありません.
345 :
デフォルトの名無しさん :2007/12/24(月) 22:22:21
実際の処理では value.0.0.0 ->a value.0.1.0 ->A value.0.1.1 ->B value.0.1.2 ->C value.0.1.3 ->nil value.1.0.0 ->b value.1.1.0 ->A value.1.1.1 ->B value.1.1.2 ->nil value.1.1.3 ->nil value.2.0.0 ->def value.2.1.0 ->X value.2.1.1 ->aaa value.2.1.2 ->BDTAR value.2.1.3 ->nil こんな感じなんですが. 設計がまちがってますかね? クラス化した方がいろいろとわかりやすいかもとか思い始めてますが, 配列の方が工数が少ないと思うので,配列で済ませちゃおうとか 考えているのですが. そして, if value.2.1.1=~ /aa/ then みたいなこともやろうと思ってるんですが.
もうなんかいろいろ駄目だな エスパーが現れて、ズバリなコード書いてもあなたには理解できんと思うよ
まず何がやりたいのかを、もっと具体的に書いてくれ 「変数の内容がどんな風に変わるのか」ではなく 「何をしてくれるプログラムを書きたいのか」を
348 :
デフォルトの名無しさん :2007/12/24(月) 22:40:46
はい. 1. ある語句があって,その語句と関連する語を纏めた形の 構造を持つ変数,またはオブジェクトが欲しいのです. たとえば aに関連する物は[A,B,C,D,E,F]の6つである とか. 2. そして,この様な条件はすべて違っていて,数千程度あります. 3. そして,ある文字列中に[A,B,C,D,E,F]のいずれかが 含まれている場合, a であると見なす. と言う風に使いたい. と言った感じです. 人工知能(無能)風な判定を目指してるんですがw
arr1=["a","b","c","d"] value=Array.new arr1.each_with_index{|s,i| value[i] ||= Array.new value[i][0] = s } p value
普通にHash使えば良いんでないの?
351 :
デフォルトの名無しさん :2007/12/24(月) 22:45:37
>>346 ええ.まぁ,なんか手に余るなぁと考え始めてますww
同様のプログラムをhspで組んで使ってるんですが,
文字コードの問題や文字の代入制限(32kbyte)や正規表現の有無で
こっちに乗り換える事にしました.
日曜プログラマなので,詳しい語の使い間違いとかはご容赦ください.
>>348 a => [A,B,C]
b => [A,D,E]
c => [A,F,G]
の時、 文字列 'A' は、a-c のどれになるんだ?全てに一致する?
それとも、関連する語は重複しないのか?
353 :
デフォルトの名無しさん :2007/12/24(月) 22:59:06
>>352 私のプログラムではAが重複しにくい分野なのでほとんど問題になりません.
なる場合でも,複数にマッチする場合は処理を分けるとかしようと思ってるんですが.
重みを計算してより近い物を判定するとか(これは判定用のdbを用意したり,
膨大なコストが掛かるので私レベルでは無理ですが)そういうのも有りかと.
input =<<EOL a : A,B,C,D,E b : F,G,H,I EOL index = Hash.new input.each{|line| key,values = line.chomp.split(':') key = key.strip values.split(',').each{|item| index[item.strip] = key } } if "TARGET" =~ /(#{index.keys.join('|')})/ puts index[$1] end if "GET" =~ /(#{index.keys.join('|')})/ puts index[$1] end
関連する語に重複が無いなら関連する語をキー、語句を値にしてハッシュに登録 重複する時は、どちらを選択するか決定する方法を先に考えておかないと何作っても無駄
リファレンスマニュアル(RWiki)の - 変数と定数 - の項目 2.times { p defined?(v) # (A) v = 1 # ここ(宣言開始)から p v # ここ(ブロックの終り)までが v のスコープ } の結果でdefined?(v) の結果が両方nilになるのがわからないです ブロックが実行されるたびにスコープが初期化(という言い回しでいいの?)わけじゃないよね
357 :
デフォルトの名無しさん :2007/12/24(月) 23:27:42
みなさんの助言で試行錯誤した結果, 以下でできました\(^o^)/ arr1=["a","b","c","d"] arr2=["A","B","C","D"] arr3=["E","F","G"] value=Array.new arr1.each_with_index{|s,i1| value[i1] ||= Array.new value[i1][0] ||= Array.new value[i1][0][0] = s if (i1 % 2) == 0 then arr2.each_with_index{|s,i2| value[i1][1] ||= Array.new value[i1][1][i2] = arr2[i2] } else arr3.each_with_index{|s,i2| value[i1][1] ||= Array.new value[i1][1][i2] = arr2[i2] } end } p value どうもありがとうございました.
>>356 末端まで行ったらvは消去されちゃうじゃん。
>>348 >>357 配列を使うよりは、
>>350 >>355 で言われてるように
RELATION_TABLE = {}
RELATION_TABLE['a'] = ['A', 'B', 'C', 'D', 'E', 'F']
というように、ハッシュで関連性を定義しておいて
あとはこのハッシュを使って処理するのがベストだろうと思う
多次元配列を使うと、どうしてもコードが複雑になりがち
クラス定義を使えばさらにすっきりする
>>356 ブロックが実行されるたびに、スコープは初期化「されている」
360 :
デフォルトの名無しさん :2007/12/25(火) 00:02:41
>>359 ハッシュですか.
呼び出す時にはどう扱えばよいものか...
勉強してみます.
なるほど、毎回初期化されるのですね 了解です
>>357 たぶんだけど、やりたいことはこれでできるような気がする
arr1 = ["a","b","c","d"]
arr2 = ["A","B","C","D"]
arr3 = ["E","F","G"]
value = []
arr1.each {|s|
arr = i % 2 == 0 ? arr2 : arr3
value << [[s], arr.dup]
}
363 :
デフォルトの名無しさん :2007/12/25(火) 10:02:44
なんでriの検索は インスタンスメソッド→Hoge#piyo クラスメソッド→Hoge.foo なん? Hoge.piyo, Hoge::piyoじゃなくて
Hoge.piyo や Hoge::piyo は普通にクラスメソッド呼び出し形式だからありえんだろ。
Hoge.piyo ではクラスメソッドの呼び出しになってしまう。 確か何か他の言語でインスタンスメソッドを表すのに # 使ってるんじゃないっけか
carbon emacsのruby-modeでrun-rubyを使おうとすると Process ruby trace/BPT trap dyld: NSLinkModule() error dyld: Symbol not found: _rl_filename_completion_function Referenced from: /usr/lib/ruby/1.8/i686-darwin8.10.1/readline.bundle Expected in: flat namespace Process ruby trace/BPT trap とでて使えません terminalでirbを動かすことはできてます どうすればいいでしょうか
をGPL互換ライセンスにしてGNU readlineを添付できるように苦情を言うとか。
libeditというreadline互換BSDLライブラリもあって、 Mac OS X 10.5(Leopard)のRubyはそれ使ってる。
質問です。 ある任意の定数0<a<1について、 0をaの確率で出して、 1, 2, 3をそれぞれ(1-a)/3 の確率で出すメソッドはどうやって作ればいいでしょうか?
randって関数が引数を与えなかったとき、0以上、1未満の乱数をかえすけど。
druby で次のような構成で動かそうと思っています。 以下は疑似コードです。 # druby サーバ (root 権限で動作) class DrubyServer def sudo yield end end # クライアント (一般ユーザ権限で動作) DRb.start_service server = DRbObject.new_with_uri( "druby://foobar:1234" ) server.sudo do system( "id -u" ) end ここで、クライアントの実行結果は 0 (root) になってほしいんですが、一般ユーザの id (1000) が帰ってきます。 root コマンドを実行してくれるようなサーバを作りたいんですが、どうしたらよいですか?
>>373 ブロックの評価はローカルで行われるらしい。これじゃダメか?
# サーバ
class DrubyServer
def sudo(cmd) ; `#{cmd}` ; end
end
# クライアント側実行部分
server.sudo('id -u')
375 :
デフォルトの名無しさん :2007/12/26(水) 01:34:38
ハッシュで正規表現を使えますか? たとえば value = { /(www\d?|pc\d?)\.2ch\.net/ => "2ちゃんねる"} p value['www.2ch.net'] #2ちゃんねる という感じの事がしたいんですが.
むりぽ。 一意のキーに対して、オブジェクトが割り当てられるのがハッシュではないんかな? ハッシュ風に正規表現で、マッチしたのなら、そういうクラスを作るか、 値を返したいのなら、そう組むべきではないかな? そう組む場合 urls = [] urls << {:reg => /(www\d?|pc\d?)\.2ch\.net/, :value => "2ちゃんねる"} urls << ・・・ みたいにして、 あとは、 def match_url(url) urls.each do |item| return item[:name] if item[:reg] =~ url end nil end みたいな
こんなんでもいいんでは? class Hoge def initialize(hash) @table = hash end def [](str) @table.each_pair{|reg, val| return val if reg =~ str } return nil end end foo = Hoge.new({/f.*/ => "Foo", /fo.*/ => "ふ〜", /b.*/ => "Bar"}) p foo["a"] p foo["b"] p foo["f"] p foo["fooooo"] # /f.*/, /fo.*/ でマッチ 複数の hash のキーになってる正規表現の表す範囲は重複しないと仮定。
SQLite(3)ライブラリの質問。 データーベースのクローズって必須じゃないんでしょうか? 理屈としては,トランザクション処理だけ適切にやれば, 明示的クローズなしてもスクリプト終了時にはクローズして くれそうなんだけども, SQLite3::Databese.newには,ブロックは渡せないようだし, 本来ならbegin-ensure-endでクローズを保証しなきゃないないよう な気がするけど,サンプルコードみても,そんなことしてないようだし。
>>378 1. 普通いらない。常識通り。
2. WEBrick の HTTPServlet だったりなんかするとプロセスが終了しないからどこかで閉じないと死ねる。
まあ、ふつう。
380 :
378 :2007/12/26(水) 08:09:59
【スレを読んでる初心者の皆さんへ】 Ruby1.90 がなにやら大々的にリリースされましたが、開発不安定版である 1.9系列はこのスレでは扱いません Ruby0.9 は 1.8 を熟知した人だけが違いを認識した上で自己責任でお使いください 現在の最新安定版は 1.86です 1.90 の安定性が上がるのは 1年くらい先といわれていますので頼りにしないでね
数字はテンキー入力か プログラムやってる人は高速タイピングできない人が少なくないとはいえ、 たかが3桁程度の数字をホームポジション付近から手を離してテンキー入力だなんて却って面倒じゃね?
ノートだからテンキーが付いてない俺涙目ww
あるメソッドがどのクラスで定義されているかを調べる方法はありますか。 例えば obj.class.ancestors が [Child, Parent, Object, Kernel] のとき、obj.to_s がどのクラスで定義されているのかを知りたい、 またはto_sを定義しているクラスを全て知りたいということです。 singleton methodはとりあえず考えなくて結構です。
>>385 Module に良さげなメソッドが有るから自分で探しなさい
音声認識
vista へようこそ
391 :
デフォルトの名無しさん :2007/12/26(水) 22:19:49
>>376 >むりぽ。
>一意のキーに対して、オブジェクトが割り当てられるのがハッシュではないんかな?
そうですか。
>>377 なるほど。イテレーターで総当たりするのですね。
ありがとうございます。
392 :
385 :2007/12/26(水) 22:46:12
>>386 >Module に良さげなメソッドが有るから自分で探しなさい
ないと思います。
例えばinstance_methodsは継承したメソッドも含まれるため、求めるものではありません。
Child.instance_methods - Parent.instance_methods だと、親クラスのメソッドを子クラスで上書きしている場合にそれが含まれないため、やはり求めるものではありません。
C++のnamespaceに当たるものを探しています。 moduleというのがそれっぽいのですが、微妙に違う気もします。 moduleをnamespace代わりに使ってしまってOKですか?
Ruby はそういったのが必要になる複雑なプログラムを書く事は想定していないと思う。 その分、文法を簡単にしてる感じ。
は、Module使ってください。
い、が抜けた。ナゼ。
>>392 > to_sを定義しているクラスを全て知りたい
p obj.class.ancestors.select{|klass| klass.instance_methods(false).include?("to_s") }
>>392 > obj.class.ancestors が [Child, Parent, Object, Kernel] のとき、obj.to_s がどのクラスで定義されているのかを知りたい、
class Object
def my_meth(meth_name)
self.class.ancestors.each{|clas|
puts "class #{clas}"
p clas.method_defined?(meth_name)
}
end
end
foo = []
foo.my_meth(:to_s)
よく探そう。
400 :
385 :2007/12/26(水) 23:27:41
>>398 ,399
ありがとうございます。探し方が足りませんでした。
401 :
393 :2007/12/27(木) 00:09:38
>>399 class Parent; def to_s; end end
class Child < Parent; end
obj = Child.new
obj.my_meth(:to_s)
=> [Child, Parent, Object, Kernel]
になるんだが?
403 :
399 :2007/12/27(木) 01:35:29
>>402 ありゃ、ほんとだ。
(Enumerable module で) false が出てるから調べられてるんだろうと勘違いしてしまった。
お前がよく調べろよって話だね。
すみません。
>>377 Hashのキーに正規表現(つか、regexp)OKだったのか。
というか、任意のオブジェクトぶちこんでもOk?
勉強不足だな、俺・・・
TCPの通信で、接続が切れているかどうか調べるにはどうしたらいいですか? 相手がソケットをcloseした状態では、こちらのwrite_nonblock('')が成功します。 相手のプロセスが終了して初めてwrite_nonblockで例外があがるようです。 受信側はread_nonblockで判別できるようですが、データを受信してしまいます。 できればよけいなデータの送受信無しで判別したいのですが。 1当方環境はこの通りです。 ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd7] windowsでもちょっと試してみましたが、ほぼ同じ挙動のようですね。
すみません。。ruby(on rails)で開発したAPをapache2でfast_cgiで動作させようとしたところ以下のメッセージが出て 嵌っています。 OS: XP home ruby:1.8.6 rails:1.2.5 apach:2.0.61 ■aoache error.log [Thu Dec 27 01:37:32 2007] [error] [client 127.0.0.1] (OS 109)パイプは終了しました。 : FastCGI: comm with server "E:/rails/HelloWorld/public/dispatch.fcgi" aborted: GetOverlappedResult() failed [Thu Dec 27 01:37:32 2007] [error] [client 127.0.0.1] FastCGI: incomplete headers (0 bytes) received from server "E:/rails/HelloWorld/public/dispatch.fcgi" [Thu Dec 27 01:37:32 2007] [warn] FastCGI: (dynamic) server "E:/rails/HelloWorld/public/dispatch.fcgi" (pid 2356) terminated with exit with status '0' ■production.log E:/rails/HelloWorld/public/dispatch.fcgi:24 undefined method `downcase' for nil:NilClass C:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/request.rb:22:in `method' C:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/routing.rb:1366:in `extract_request_environment' ・ C:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.5/lib/fcgi_handler.rb:25:in `process!' ためしにapacheのホスト設定をそのままに、.htaccess内の定義を変更してCGIで動作させたところ 問題なく動作するのですが、fast_cgiにしようとすると上記エラーが発生してアプリケーションエラーが出てしまいます。 どなたか解決錯誤存知の方いらっしゃいますでしょうか?
407 :
405 :2007/12/27(木) 02:47:06
あれ、ちょっと挙動がよく分からなくなってきた。 相手がcloseした後に1byteでも送信し(これは常に成功する?)、 再度書き込みしようとしたときに例外があがる、なのかな。 先のプロセス終了云々の発言は忘れてください。 ともかく、送受信無しで接続が持続しているか確認したい、ということです。
>>408 なるほど、これは大変参考になりますね。
socketについてまだよく分かっていないので、
じっくり読んでみます。
ありがとうございました。
>>406 >C:/ruby/lib/ruby/gems/1.8/gems/actionpack-1.13.5/lib/action_controller/request.rb:22:in `method'
request.rbの22行目をみればわかるけど、
22: @env['REQUEST_METHOD'].downcase.to_sym
という部分がエラーになってる。
つまり環境変数REQUEST_METHODがセットされてないから@env['REQUEST_METHOD']がnilになり、それに .downcase しようとしてエラーになっている。
CGIではこの環境変数が設定されて、FastCGIでは設定されないんだろう。
22行目の直前で $stderr.puts @env.inspect とでもすれば確かめられる。
解決策はしらん。
(@env['REQUEST_METHOD'] || 'get').downcase.to_sym
にしたら動くと思うけど、正しい解決策という保証はない。
しかしなんでFastCGI?
leopardでmacを使い始めたのですが、RDEのような開発環境はないでしょうか? xcodeをいじれば出来るのかしら…。
環境抜きでもRDE<<<<NetBeansだな、βしか触ってないけど・・・
414 :
411 :2007/12/27(木) 15:04:00
をを、知らなかったです。感謝します。
引数の型はどういうタイミングで変換するべきですか? 何か目安でもあれば教えてください。 def kuroji?(income, outgo) income.to_f > outgo.to_f #ここですべき? end if /income: (\d+), outgo: (\d+)/ =~ str p kuroji?($1.to_f, $2.to_f) #ここですべき? end
俺は関数/メソッド側で変換するかな。
to_fならメソッド内部で変換するよね to_sだと他のとこからも使うメソッドかどうかとかちょっと考える to_aとかは論外
自分は呼び出し元。 正規表現で切り出すまででなく、適切に変換する のも文字列の解析に含まれると思うので。
上の例でいくと、引数は数値がやり取りされるべきなんじゃない? Fixnum等々を考慮してメソッド内でto_fするってのなら分かるけど
420 :
デフォルトの名無しさん :2007/12/28(金) 07:54:57
配列,すべて代入,要素ごと代入,予想外,問題 あるメソッドの定義のなかで配列と代入を組み合わせると予想外のことが起きます.定義が問題ではなくて,配列と代入の組合せが問題のようです.たとえば a=[1,2,4] b=a p b b[1]=a[0] p b p a b[0]=a[1] p b p a を実行すると, [1, 2, 4] [1, 1, 4] [1, 2, 4] [2, 1, 4] [1, 2, 4] になると予想しました.b=a はずっと効いているわけではないはずだから.しかし実際は以下のように出ました. [1, 2, 4] [1, 1, 4] [1, 1, 4] [1, 1, 4] [1, 1, 4] a と b が同じものになってしまっているわけです.これはどういう理屈でしょうか.予想したものを出す分かりやすい方法も挙げてもらえると助かります. ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
a=[1,2,4] p a.object_id b=a p b.object_id b[1]=a[0] p a.object_id,b.object_id b[0]=a[1] p a.object_id,b.object_id 538408680 538408680 538408680 538408680 538408680 538408680 同じかどうかはobject_idで調べること > b=a はずっと効いているわけではない じゃあ「どこで」「どういう理屈で」切れるん?
423 :
デフォルトの名無しさん :2007/12/28(金) 08:28:12
>>421 Thanks! .dup というのを知りませんでした.それを調べれば理由が分かるかなと思います.
回避法としては b=a を以下に変更することを考えていたのですが,教えてくださったやり方が素直ですね.
b=Array.new(3)
b.each do |k|
# b[k]=a[k] if not (k=0 or k=1)
end
424 :
デフォルトの名無しさん :2007/12/28(金) 08:44:02
>>422 >同じかどうかはobject_idで調べること
なるほど,代わりに b=a.dup とすれば指すものが変わりますね.
>> b=a はずっと効いているわけではない
>じゃあ「どこで」「どういう理屈で」切れるん?
以下からの誤った類推でした.
x=1
p x.object_id
y=x
p y.object_id
y=3
p x.object_id, y.object_id
最後の id がほかと異なります.
>424 変数 = 何か は、変数そのものが指し示す先を指定する。 配列[添字] = 何か は、配列に対して []= というメソッドを呼ぶ。 呼ばれた配列は自分の持ってる(添字)番目の要素が (何か)を指すように書き換える。
rubyでグリニッジ(?)時間を取得するにはどうすればよいですか? 119844442みたいなのです。
2chのスレのdatキーに使われてるようなものなら Time オブジェクトを to_i すればいい irb> p Time.now.to_i 1198828133 UNIX Time とか epoch time とか呼ぶ マニュアルでは「起算時からの経過秒数」という正確過ぎて目に留まらない表現になってるな
ダウンロード版のマニュアル見にくくなったね ローカルで見れるHTMLとか欲しかったな
430 :
426 :2007/12/28(金) 17:46:40
>>427 >>428 ありがとうございます!
例文のあるところにしか目がいってなかったようです。
とにかく感謝です。
>>429 見られる、な。
とりあえずchmを解凍しろ
そういえばchmはアーカイブだったな うおー各ページへのリンクが全部 / から始まる絶対URLだ
ごめん、htmlが欲しいって話か
つ CHM Decoder
438 :
デフォルトの名無しさん :2007/12/29(土) 08:42:53
googleで全角スラッシュ「/」を検索すると、URLにq=%EF%BC%8Fとかってなってる str = "/" str.?? => "%EF%BC%8F" どの変換メソッド使えばいいんじゃろ?
#require 'uri' URI.escape(str) もちろん元のエンコーディングで結果は変わる。 %EF%BC%8F だと、もとの全角スラッシュはUTF-8だな。
440 :
デフォルトの名無しさん :2007/12/29(土) 09:40:33
ハイパーありがとうございます。 さっそくやったら、 %81%5E が出てきました。 元のエンコーディングっつうのはどうすれば・・?
それはShift_JISかな。 require 'nkf' str = '/' str_u8 = NKF::nkf('-Sw', str) # Shift_JISから(S)、UTF-8へ(w) のように変換する必要があると桃割れ。
442 :
デフォルトの名無しさん :2007/12/29(土) 12:08:33
ウルトラありがとうございます 段階を踏むことでできました require 'uri' require 'nkf' str = '/' str_u8 = NKF::nkf('-Sw', str) # Shift_JIS → UTF-8 URI.escape(str_u8) => %EF%BC%8F
ページの一覧性という点では旧版のオンラインマニュアル(現行のWeb版)が最強だと思う いちいちモジュール→クラスやクラス→メソッドをリンクにして喜んでるのはオタクっぽいと思った
そのへんは目的の項目をどう検索してたどり着くかによるんだよなあ 長いページから検索して見つけるってのも方法としてアリなんだよね どっちのパターンへも切り替えられると便利なんだけどさ
>>443 どうなってればいいわけ?
そういや、chmの文字列検索って美妙につかえねえw
勝手に、文字分割して検索するwwww
「LOAD_PATH」と入れたら、loadとpathばっかり検索結果に出てきやがる
"LOAD_PATH"
>>446 キタ━━━━━━(゚∀゚)━━━━━━ !!
サンクソ!!
そういうのどこかに載ってますか?
まあ、googleとかで、+つけたり、""だと、全文一致というのは、あったから気付くべきだけど
" " はとりあえず試すだろ。
ここって”Ruby”初心者のスレじゃねーの?w
rubyのヘルプを検索するための話なら、まぁ「初心者スレ」的にいんじゃね?
451 :
デフォルトの名無しさん :2007/12/29(土) 20:59:28
あるウェブサービスにログインして,htmlを解析してデータを取り出すボットを作っています. 少ないデータを取り出すときには問題なく動くのですが,長時間動かした場合に コンソールに"強制終了"と出て、止まってしまいます. 何かの例外処理にかかっているのだとは思うのですが, エラーメッセージが”強制終了”としか出ないのでてづまってしまっています. 原因に心当たりあるかたがいましたら,教えてください.よろしくお願いします. 環境 ruby:ver.1.8 OS:CentOS hpricot: ver.0.60 使用しているライブラリは以下の通りです. require 'rubygems' require 'mechanize' require 'hpricot' require 'kconv' require 'open-uri'
riってみんな使わないの? あれとRWikiのリファレンスで間に合ってるんだけど。
>>452 何故「みんな使わない」と思ったのかが知りたい。
>>451 at_exit {
$stderr.puts "#{$!.backtrace[0]}: #{$!.message} (#{$!.class})"
}
とすると、終了時のエラーが表示されるかもしれないけど拡張ライブラリのバグならでないかも。
hpricotかmechanizeのバグだろうね。
Rubyってexe化できるって聞いたんですけど webアプリをそのままの機能でローカル利用できるってことですか?
456 :
デフォルトの名無しさん :2007/12/30(日) 00:29:41
違います
.rbファイルをソースとしてコンパイルするみたいな感じですか?
Windows版Rubyをわざわざインストールしてなくても 誰でもそのRubyスクリプトをWindowsで実行できるようにできます
Rubyが埋め込まれたHtmlもですか?
いいえ
はい exeは標準出力にだらだら吐き出すだけだろうから、その出力をWebブラウザに渡すことができればHTMLも見れるよ それはRubyの仕事じゃないけどな
じゃあどの程度のプログラムがかけますか?
あなたには無理です
そうですか他をあたります Qtでも見に行こう
>>451 メモリ食いすぎて自滅したかOSに殺されてるんじゃないの?
466 :
デフォルトの名無しさん :2007/12/30(日) 01:07:13
if a=0 { }else{ } という文法だと間違ってると怒られるんですが、 {}を使ってelseを使うことはできないんですか?
そもそもそんな文法はない if はブロックを取らない 勝手に変な書き方すんな
>>466 制御構文はプログラミング言語の基本中の基本
いくら初心者スレとはいえ、これくらいは自分で何とかしてくれないか
470 :
デフォルトの名無しさん :2007/12/30(日) 03:50:10
class Hoge def initialize @h = Hash.new alist = [[1,["a"]], [2,["b"]], [3,["c"]]] alist.each {|k,v| h[k] = v } end def foo h.each {|k,v| p k,v } end end foo = Hoge.new foo.foo これを実行すると 6:in `initialize': undefined local variable or method `h' for #<Hoge:0x2940078 @h={}> (NameError) というエラーが出るんですがどう直したら良いんでしょうか。 スコープの問題なのでしょうか、alist.eachの中でhが呼べない様ですが 回避方法が解りません。
471 :
デフォルトの名無しさん :2007/12/30(日) 03:56:00
@h
むしろ h は何のつもりだったのか知りたい @h と h は別モンだってのはたいていの解説にも書いてあると思うんだが
473 :
デフォルトの名無しさん :2007/12/30(日) 04:04:30
あはは。 @付けないといけないんですね。 どうもありがとうございました。
スクリプト内でOSのコマンドを実行するきれいな方法を教えてください
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=shell#a.a5.b3.a5.de.a5.f3.a5.c9.bc.c2.b9.d4 ↑を参考に、
require 'shell'
sh = Shell.new
sh.system("ls")
と、やってみましたが、irbでは問題なく実行できたものの、ファイルに保存して
実行すると、
shell: warn: Process finishing...
wait for Job[/usr/bin/ls:#28045] to finish pipe importing.
You can use Shell#transact or Shell#check_point for more safe execution.
shell: notice: Process finishing...
wait for Job[/usr/bin/ls:#28045] to finish.
You can use Shell#transact or Shell#check_point for more safe execution.
と言われました。
マニュアルのtransactの項目を見ましたが理解できませんでした。
ruby 1.8.6
475 :
474 :2007/12/30(日) 12:15:48
自己解決しました。 すいません、マニュアルを穴があくほど読んだら理解できました。
476 :
デフォルトの名無しさん :2007/12/30(日) 21:57:26
階層構造やファイルを含んだディレクトリを移動させるにはどうしたらいいですか?
ふつうにrequire 'fileutils' (&include FileUtils)して対象ディレクトリを mvすれば中身ごと移動します。 WindowsだとUNIX系みたく簡単に移動できないのかもしれんが。
ファイルシステムまたがってても大丈夫なん?
479 :
デフォルトの名無しさん :2007/12/30(日) 22:55:08
Dirでリスト作ってイテレーターで回してコピーした方がいいですか?
481 :
デフォルトの名無しさん :2007/12/30(日) 23:11:37
>>477 おお.こんな便利なモジュールがあったんですね.
ありがとうございます.
>>474 解決したら、解決策を書いていくのがせめてもの礼儀というもの
483 :
451 :2007/12/31(月) 16:13:39
レスありがとうございます
>>454 今,at_exit{}を入れて確かめてみています.
hpricotやmechanizeのバグだとしたら,初心者の私にはお手上げですね…
>>465 メモリは4G積んでいますし,メモリを余り食わないように改良してもダメだったので
大丈夫だとは思うのですが。。。。
OSに殺されている可能性については,考えていませんでした.
対処するとしたら,一度に動かすのではなく,分割して動かすのが良いんでしょうか?
プログラム初心者なくせにrubyをやりたいと思ってるアホですが、 phpみたいな事ってrubyで出来るのですか?
>>483 linux には OOM killer なる仕組みがあって、メモリが足りなくなると
プロセスが勝手に殺されるそうな。「強制終了」なるメッセージは
コンソール(bash?)がそれを受けて出力してるんではないかと思う。
まずは実行中に top コマンドとかでメモリ使用量を確認してみたら?
# 調べた結果、メモリが関係なかったらごめんなさい
>>484 >phpみたいな事ってrubyで出来るのですか?
php みたいに「お手軽」にできるかどうかは、持ってる基礎知識によって違うので
一概に「できる/できない」とは言えない。
php な人が
「Ruby はインストールしてからブラウザに "Hallo, world" を表示するのが大変。
php なら簡単にできるのに!」
というのはときどき聞く。
Ruby は Web に特化した言語じゃないから、下準備は多少手間がかかると思った方が良い。
そこを乗り越えたらできる事は、まあ変わらんのじゃないかな(好みの問題はあるだろうが)。
↑ミスしちゃったw
>>485 >>487 >>488 ありがとー
今rubyインストールしてみた
色々インストール…Hello World表示させてみたけども、phpは手軽だねー
rubyってサーバーにrubyがインストールされていたら使えるのかな?
よくわかんないが、面白そうw
何からやろうかねぇ・・・・・・・・
つづき
・Railsと異なるデザインで作られたMVCフレームワーク Ramaze
home [Ramaze]
http://ramaze.net/ ・Railsに最も近い?しかし、Railsより軽量なフレームワーク Merb
Merb | Looking for a better framework?
http://merbivore.com/ ・Railsのように縛られたくない!!な人のためのフレームワーク Nitro。
MVCじゃないのも作られる。
Nitro and Og
http://www.nitroproject.org/ ただし、どれもphpほど軽量じゃない。レンサバで動かそうとするとつらい。
てか、Rubyが重いw
あと、ベータレベルのものばかりなので、Rails以外は、要注意。
うぉ 親切に・・・。 まじでありがと!!! Railsやってみるよ まず、rubyの基本覚えなきゃw まだ何もしてねぇ…。 Rubyって重いのか…。 んー… phpのがいいのかねぇ… でもphp人気すぎなような気がして…。 phpでは送信者部分に文字化けが出るけども、メール送信できる程度のプログラムは出来る・・・。 一応確認画面とかは作れたりする
>>494 ブラウザに"Hello, world!"だったら
eRuby(HTMLなどのテキストファイルにRubyコードをうめこむ)
がいいんじゃないかな?
たとえば
<html><body>Hello, world</body></html>
あれ?
Matrixクラスの使い方についての質問です。 環境:ruby 1.8.6 Matrix.[rows] rowsを要素とする行列を生成する。ただし、引数rowsはネストした配列(=配列の配列)である。 例 Matrix[[11, 12], [21, 22]] RubyリファレンスマニュアルのMatrixクラスのインスタンス生成部分に上記のような説明文が ありますが、引数rowsは配列の配列とあるのですが例えばa=[[11,12],[21,22]]のような配列から 行列を生成するにはどうすればいいのでしょうか。aをそのまま[]内に使用した場合以下のような 実行結果になりました。 irb(main):001:0> require 'matrix' => true irb(main):002:0> a = [[1,2],[1,2]] => [[1, 2], [1, 2]] irb(main):003:0> b = [[1,1],[1,1]] => [[1, 1], [1, 1]] irb(main):004:0> m = Matrix[a] => Matrix[[[1, 2], [1, 2]]] irb(main):005:0> n = Matrix[b] => Matrix[[[1, 1], [1, 1]]] irb(main):006:0> m * n ExceptionForMatrix::ErrDimensionMismatch: Matrix dimension mismatch from C:/Program Files/ruby-1.8/lib/ruby/1.8/matrix.rb:467:in `*' from (irb):6 from :0
そのリファレンスのすぐ下に書いてあるけど、こういうこと? Matrix.rows(rows, copy = true) rowsを要素とする行列を生成する。ただし、引数rowsはネストした配列(=配列の配列)である。 (略 irb(main):031:0> m = Matrix.rows(a) => Matrix[[1, 2], [1, 2]] irb(main):032:0> n = Matrix.rows(b) => Matrix[[1, 1], [1, 1]] irb(main):033:0> m*n => Matrix[[3, 3], [3, 3]]
>>497 解決しました、ありがとうございます。
リファレンスよく読まずに質問してすみませんでした。
499 :
デフォルトの名無しさん :2008/01/01(火) 20:21:22
ほんとに初心者っぽい質問で申し訳ないんですけど findメソッドを使ってレコードを取りだそうとすると いつも「#」とだけ表示されてしまいます。 なぜでしょうか? 誰か分かるひと教えてください。 使っているデータベースはSQLite3です。
>499 再現コードうp
そのfindってActiveRecord? バージョンは? バージョン2.0以前のARは、 そのまんま印字しても #<Hoge:0x111111> とかだから、 HTMLに出力すると#だけになる。
502 :
499 :2008/01/01(火) 22:08:15
>500 ごめんなさい。コードないと分かりませんよね。 >501 はい。ActiveRecord使ってます! 、、、でもバージョン確認ってどうすればいいんでしょうか。 ほんと無知でごめんなさい。 コードは\app\controllers\main_controller.rbに 「class MainController < ApplicationController def index end def show @users = User.find([1]) end end で \app\views\show.rhtmlに <html><head><title>title</title></head> <body><h1><%= @users %></hi></body> </html> です。 usersっていうのはSQLite3に作成したテーブル名です。idが合った場合は、すべて#がでて idが存在しないと、エラーが表示されるので、おそらくデータベースにあるデータを読み込んではいるけれど それを記述する段階で何か問題が起こっているのだと思います。 コード公開するのも恥ずかしいような初学者なので申し訳ないです。。。
@usersの前に h って書いてみなよ。 ARのバージョン確認のしかたは gem list で見られるだろ
見るだけなら、HTMLを書かずとも、 ruby script¥console として、 >> User.find... を実行してみればいい。 HTMLで確認したければ、 <%= debug(@users) %> とすれば、見かけはともかく確認できる。 あと、h1要素にするのはやめとこうぜ。
505 :
499 :2008/01/01(火) 22:29:22
>503 ありがとうございます! gem listで確認したところActiveRecordはver2.0.2を使っています。 けれどHTMLでは#としか出力されません。 あとh@usersと記述してみたんですが、これまた上手く行きません。。。 >504 ありがとうございます! script\consoleでは確認できました! HTMLで<%= debug(@users) %>と記述し出力してみたところ 一応レコードは取り出されたんですが余計な文字がいろいろ。。。 レコードだけをHTMLで表示させるにはどうしたらいいんでしょう。 質問づくしでごめんなさい。 あとRailsの質問なのに答えていただいて本当申し訳ないです。
あ、スマソ、2.0系でも #<Hoge id: 1, ....> のようになるだけなので、やっぱり#の後ろは(HTMLのタグと誤認されるため) 表示されないね。 綺麗にレイアウトした表示が欲しいなら <ul> <% @users.each do |user| -%> <li><%= h user.name %></li> ←nameじゃないなら変えて。 <% end -%> </ul> などとループ組んで(or 部分テンプレート)HTMLとしてそれなりに整形しないと。
507 :
499 :2008/01/01(火) 22:56:32
>506 おーーーできました!ありがとうございます! ただ表示させるだけじゃなくて、もっと難しいことに応用する段階になったら 問題でてくるかも知れないですが、とりあえずこれでやってみます! スマソなんてとんでもないです。ありがとうございました
HTMLわからんでwebアプリケーション作ろうとかマジ勘弁してくれ 開発環境やフレームワークは基礎知識を補助しない
509 :
499 :2008/01/01(火) 23:28:00
>508 ごめんなさい。。。 基礎から学びます。
Webアプリは前提知識が多すぎて今からやる人は つらいだろうな。不特定多数が使うものだからセキュリティも 気をつけないといかんし。 この場合、Viewがホワイトリストになっとけばよかったわけだが いつなるんだっけ。
511 :
451 :2008/01/02(水) 00:18:37
>>483 topで確認したら予想以上にメモリを食っていました.
単体では,問題無いようですが,他のプログラムが走ったときに確かにメモリ不足になりそうな感じでした.
#使っているPCが共有マシンなので,他の方も違う計算をさせる可能性があります
一回のキャッシュを少なくして,マシンを占有させてもらって動かしてみたところ今のところ問題なく動いています.
データ収集のの3/4を無事終えたので残りもそのままいけそうです.
ありがとうございました.
512 :
デフォルトの名無しさん :2008/01/02(水) 02:00:43
文字列の中の(や+などをすべてリテラル( 『\(』や『\+』など )にするメソッドとかありますか? 正規表現で処理する場合に、その中に含まれるある文字列を 単純な文字列のマッチとして扱いたいのですが、 含まれている文字に偶にメタ文字が含まれている場合があるので、 素直に Regexp.new(a+b+c) とできないので。 a="abc(^" b="DEF+?G)H" #ランダムで変わる c=")defgh d=Regexp.new(a+b+c) の様な感じで、bの中のメタ文字を\でリテラルにしたいのです。
Regexp.escape
>>511 じゃないんすけど、こういう、カーネル??のエラーでおとされた場合、
エラーログってはかれるんすかね?
dmesgとかで見られるんかな?
515 :
デフォルトの名無しさん :2008/01/02(水) 02:24:53
ありがとうございます.
>>512 細かい話かも知れんが「リテラル」の意味履き違えてないか?
いや、文脈から言いたいことは充分伝わる文章だから
質問自体には文句はないんだが…
517 :
デフォルトの名無しさん :2008/01/02(水) 03:09:03
File.readでUTF-16LEのテキストファイルを読むと、 『級』という漢字のある所で行が飛んだり、読み込みをストップしたり, 動作がおかしくなるんですが、こんな症状が出ている人居ますか
518 :
デフォルトの名無しさん :2008/01/02(水) 03:15:42
>>516 英語のリテラルの意味に一語一語のとか文字通りという
意味があるので、便宜的にリテラルという語を使ってしまいました。
ソースに書かれた語などの意味とは違うかもしれません。
こういう場合はなんと言えば良いんでしょうか?
>>518 自分でも言ってる通りメタ文字でいいと思う。
正確に言いたかったら正規表現の、とか但し書きつければ
521 :
デフォルトの名無しさん :2008/01/02(水) 04:08:38
>>519 文字コードを設定してファイルを開くにはどうしたらいいんでしょうか?
>>519 それRuby1.9の話じゃない?
>>517 行が飛ぶといわれてもなんのことかわからない
まず具体的なコードを見せて
(や+が正規表現で特殊な意味を持つ文字という意味なら Regexp.quote(文字列)
524 :
523 :2008/01/02(水) 09:16:50
ごめんなぜか全部DLされてなかった。
525 :
デフォルトの名無しさん :2008/01/02(水) 17:30:04
>>522 【test.rb】
File.open('c:\test.txt') {|file|
p file.read
}
【test.txt(UTF16L)】
1
2
3
4級
5
6
7
8
9
10
このコードを実行すると、4行目までしかtest.txtが読み込まれません。
回避するにはどうしたらいいのでしょうか。
>>525 522 じゃないが。
リファレンスを見ると、Ruby は euc, sjis, utf-8 でしか日本語を扱えなそうに見えるんだが。
参照
Ruby の起動 コマンドラインオプション -Kc の項
FAQ 日本語の取り扱い
>>525 test.txt のファイルサイズと読み込んだデータのサイズを比較してみろ。
puts 'filesize : %d'%File.stat('test.txt').size
File.open('test.txt') do |f|
data = f.read
puts 'datasize : %d'%data.length
end
528 :
デフォルトの名無しさん :2008/01/02(水) 18:47:49
うーん。サイズが違ってますね。 filesize : 66 datasize : 22 EOFコードでも含まれてるんでしょうか。 外部ツールを通してUTF-8あたりにコンバートしないとダメですかね?
Rubyのバージョンは? ruby -v
4 \0 032 } \n \0
531 :
デフォルトの名無しさん :2008/01/02(水) 19:53:09
>ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] です。
File.open('c:\test.txt', "rb")じゃないのか
533 :
デフォルトの名無しさん :2008/01/02(水) 20:27:08
なるほど。バイナリモードなら開けますね。 ただし、改行がおかしくなりますが・・・
RubyのFile.open のテキストモードは、UTF-16対応してないのでは? ファイルが小さいなら、NKFなり、kconvなりで、一旦、utf-8なり、eucなりに変換するとか
535 :
デフォルトの名無しさん :2008/01/02(水) 21:31:39
$KCODE="SJIS" require 'kconv.rb' file='c:\test.txt' puts 'filesize : %d'%File.stat(file).size File.open(file,"rb") do |f| data = f.read.tosjis puts 'datasize : %d'%data.length puts data end 一応、このコードできちんと読めるようにはなったんですが、 改行がおかしくなるバグはまだあります。 d1 = String.new data.each{|l| d1 << l.sub("\r\n","\n") } puts d1 を組み込むとなんとかなりました。 少々ゴテゴテしてますが、この方法で良いのでしょうか?
今までCSVの処理をExcel VBAでやってたので 正月休みを利用してRubyに移植するべぇと張り切っているのですが 正直、処理速度の遅さにびっくりしてます 掛け算2桁万回して、結果をカンマ区切りのテキストに書き出すだけで VBAと同程度の時間(5秒程度)待たされます ちと、期待しすぎてたか・・・
兄さん、とりあえずコード晒せや
defFnRule = "([0-9][0-9])__(.*)" ldir = os.listdir( os.getcwd() ) for fn in ldir: chk = re.match( defFnRule, fn ) if chk != None : matchList = re.findall( defFnRule, fn ) newName = matchList[0] + "_" + matchList[1] print "New:>> [%s]" % newName
2桁万回して
VBAとRuby・・・選択眼に脱帽
数十スレ前に初心者の1.9使用は厳禁とか言われてたけど、1.9使ってNERVだかラルクだかを使ってみたら?
>>540 とりあえず落としてみたが main.rb が読めない。圧縮失敗?
それとも main.rb は Ruby インタプリタの脆弱性を狙ったトロイか何かなんだろうか。
>>540 integerが期待されている場所で、値がnilになっているためにエラーとなっている。
例えば
arr = [10, 20, 30]
i = nil
print arr[i] #=> TypeError: no implicit conversion from nil to integer
エラーには行番号も表示されるはずだから、その行を見ればよい
>544 main.rbは、その名に反して、tar.gzみたいな。 main.rb(.tar.gz)を展開しても、main.rb~とかもろもろ出てくるけど、 肝心のmain.rbは出てこないけど。
>>544 >>545 すいません、main.rbはバグりました。
途中で書き直したので、使われていない変数が入っていたようです。
解決しました。
今、なぜこのような事が起こるのか分からないのですが、
a = [[-4, 5], [3, 2]]
a.sort do |a,b|
b[0] <=> a[0]
end
=> a = [-4, 5]
となりました。
今やらないといけないのは、ネストされた配列で、一番目の要素で降順(大きい順)
に並び替える事です。
どうすればいいのでしょうか?
さきほどのプログラムの再うpです。 どうもmoveのところにおかしいところがあるらしく、 このロボットはまともに動いてくれません。
>>535 何でUTF16なの?自分の環境にあった漢字コード使った方が楽だよ
>>548 a.sort! do |a, b|
b[0] <=> a[0]
end
=> [[3, 2], [-4, 5]]
a
=> [[3, 2], [-4, 5]]
出来てるけど
あ、破壊メソッドを使わないといけないのかな?
えーと、ruby1.8のスコープの罠がひとつ、 あとはsortが非破壊メソッドであることがひとつ。 aa = [[-4, 5], [3, 2]] aa.sort! do |a,b| b[0] <=> a[0] end
あれ・・出来ない・・・ a.sort! do |e1, e2| にしたら出来ました。どうやら同じ名前を使ってはいけないのかな・・・
a = [[-4, 5], [3, 2]] a.sort do |a, b| b[0] <=> a[0] end p a a = [[-4, 5], [3, 2]] a.sort! do |a, b| b[0] <=> a[0] end p a a = [[-4, 5], [3, 2]] a.sort do |e1, e2| e2[0] <=> e1[0] end p a a = [[-4, 5], [3, 2]] a.sort! do |e1, e2| e2[0] <=> e1[0] end p a 最後のしかうまく行きません。
> にしたら出来ました。どうやら同じ名前を使ってはいけないのかな・・・ YES。ブロック内で、外にあるのと同じ変数名つかうと、そっちを上書きしてしまう でよいよね?
>>557 それぞれの違いを理解しましょう。
・a.sortでは、aの値は変わりません。a.sort!を使うと、aが変わります。
・ブロック内(sort do end)では、ブロック外の同名の変数が置き換わります。
まあ、その、ブロック引数のスコープは、1.9では直ってるけどね。 1.9は1.9で大いに問題があるわけで。このスコープだけバックポートされて こないかなー、無理だろなー
>>542 だって、お手軽なんだもの・・・自分でも悲しいっすよそりゃ
結論:Cで書け
つーか、ホントにスクリプト部分がボトルネックなの?
速度無視でa=a.sort.reverseでいいじゃない
565 :
デフォルトの名無しさん :2008/01/03(木) 02:42:46
>>551 まぁ、そうなんですけど、他のソフトとの連携なのでどうしてもUTF16が必要なんですよ。
読み書きだけできればいいので。内部表現ではSJISにしてますし。
$KCODE="SJIS"
require 'kconv.rb'
class File
def File.open_text(path)
File.open(path,"rb") { |f|
dat = f.read.tosjis
datSjis = String.new
dat.each{|l|
datSjis << l.sub("\r\n","\n")
}
return datSjis
}
end
end
file='c:\test.txt'
puts File.open_text(file)
改良して汎用の読み込みクラスにしてみました。
とりあえず、これでいけそうなので、これでやってみます。
どうもありがとうございました。
566 :
デフォルトの名無しさん :2008/01/03(木) 04:08:58
ファイルの書き込みで詰まってしまいました。 $KCODE="SJIS" require 'kconv.rb' path='c:\test.txt' arr=["あいうえお","かきくけこ"] data = arr.to_s.toutf16 data[0] << 0xfffe #BOM追加 File.open(path,"wb") { |f| f.write(data) } の様にしたのですが、上手くUTF16で書き込まれません。 どうしたらいいのでしょうか?
567 :
536 :2008/01/03(木) 04:59:32
やったー!うっごいたぁー! 移植ということでLogicで困るところはなかったものの、 仕事で使うプログラムだったので安心しました 実は実質的にRuby初挑戦だったんですけど、 (正規表現関係で日本語コネるのにちょっと使ったことはあったんですが) 頭の中でのClassの設計に半日 あとは特に書きよどむことなく、すらーっと進みました とにかく動いてくれるんで、心地よかったですね まだまだブラッシュアップの余地ありありですけど 速度面でもトータルではさすがにExcel VBAよりは早かったです うん、久々に心地よい(半)徹夜だったな
>>567 結局どういう対策をとって早くなったんだよ
質問しておいて勝手に納得されても困る
>>561 お手軽ならpythonも選択肢に入れてみれば?
RubyとPythonってどっちがいいの?
>>570 ん? どっちでもいいよ。
(´-`).oO(初心者スレだからって、こんな質問ないよなぁ...)
Rubyは内包表記がないから糞
どっちにしても信者とアンチがうざいからプログラマをやめるのが一番気楽
JRubyとMatz' Rubyってどっちがいいの?
>>568 対策はしてないです
大量の掛け算は処理のごく一部なんです
処理全体ではRubyの勝ちだったってだけです
計算は特に遅かったりなんてするのでしょうか?
動作テスト・負荷テストにも無事耐えてくれました
ExcelVBAで2分程度かかってた処理が30秒ほどで終わるようになりました
実のところ処理速度がどうのって言うわけではなく
会社がOSをVistaにするとかで、Officeも最新Verになりそうで
動作検証とか面倒だし、なによりちゃんと動いてるので
これから5年でも10年でも使って楽したい一連の処理ってこともあり
移植を経験しておきたかったのです
初心者というより、低スキルな者ですが
とにかく動くものが作れたので楽しかったです
end end end と書いた自分がいて end #if end #def end #class ってしとけば、わかりやすいじゃないか! と素で大喜び、いやオレって天才!状態だった 信じてほしい、本当に自分で発見したんだ ・・・オレは何に負けたんだろう
ちなみに、一番最初は end #これは、クラス設定最後の「end」 とまで書いたんだ これを end #class と略した自分に 神が降りた!とまで思ったんだ・・・
>>577 デスマ脳ではよくあること。
コメント書かなければタイプする量が半分!つまり二倍速くプログラムが書ける!とか思っちゃうのも必ずデスマ初心者が通る道。
>>574 Matz' というか、CRuby な。
JVMの上で動かしたい積極的な何かがあるのでなければ、
とりあえずCRubyでいいと思われ。
漏れはifでend書くのをよく忘れるな
doをよく忘れる。
thenって書いてる人いるの?
ノ ただしifかunlessのときだけ。case〜whenではthenを書かない
僕は必ずthenを書いている...とか書いたら特定されたりしてw
俺も if elsif unless when どれも then 書く。
BASICの頃から、if then文としてセットだなぁ
if でうっかり { } 使って エラー見て気付く orz
>>587 ブロックを { } で書くから、さすがにそれはないな。
でも、人のソースを見ると、ワンライナー以外ほとんどが
do end でブロックを書いててちょっと不安。なんか、合理的な理由があるの?
結合強度が違うというのは分かるんだが…
俺的には統一感の問題かな。 殆どのブロック的要素が end で終わるのに ブロック付き呼出だけブレースってのに違和感がある。 ワンライナっつーか、呼び出した結果 戻り値を使いたい場合はブレース使うけど。
ワンライナーでも do; end; 使ってる
条件がめちゃくちゃ短くて、then節が長くて改行が必要なときは thenをつけると綺麗な気がするな。多様性最高。
>>514 カーネルのエラーではないので dmesg などには出ないね。
UNIX 系 OS ならプログラムが死ぬときに core ファイル (ruby.core など) が
できる (パーミッションや設定によってはできない) ので、
それを GDB などのデバッガにかけてデバッグする。
thenはぜんぜんつけないなぁ。
吹雪の到来
変数の命名とかに規則はありますか?
変数名に淫語使うの禁止。
繰り返し変数i, jの代わりにtinko, mankoを使っている人はいますか?
func(i) を func(num) と書き直すシャイな漏れ
すいません。教えてください。 Stringにモジュール名が入っていて、そのモジュールにアクセスしたいのですがどうしたらいいですか。 module Foo def f print "foo\n" end ned module Bar def f print "bar\n" end end module_name="Foo" str_to_module(module_name)::f module_name="Bar" str_to_module(module_name)::f みたいな感じにしたいです。
すいません。自己解決しました。 eval(module_name)::f それにしてもevalみたいな便利メソッドがあるとはRuby恐るべし。
evalは万能すぎるので、Object.const_get(module_name)も検討されたし。
>>575 つまり、Ruby遅いとか、VBA並みだと言っていたのは、測らず言っていただけなのな
とりこしぐろうだったわけだな
>>588-590 一行で収まるときは、{}で、複数行の時は、do endにしてる
evalのない言語のほうが恐ろしい
俺の使ってる大抵の言語にはevalはないなあ。 しかし、evalぐらいで驚愕している600が一番恐ろしい。
>>595 階級や何年何組のクラスをclassという変数に格納できないのは意外と辛い
startという変数は存在できるのにendという変数が存在できないのも意外とイラつく
あー規則ね
ローワーキャメルケースかアンダースコア区切りかっていうのはどっちかに主流が収束する気配はないので勝手に殴り合いでもして決めろ
arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺
@dataというインスタンス変数をひとつ作るごとに鞭打ち100回
runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑
607 :
デフォルトの名無しさん :2008/01/05(土) 18:16:09
質問です。 File.openとFile.newの違いはなんでしょうか? それとも違いなんてなくて、ただのエイリアスですか? 知ってる方いたら教えてください。
openはブロック付きにすると動作が変わるよ。
>>607 疑問点はまずオンラインマニュアル読んでみれ
わけわからん書き方してる場合も多々あるが、疑問が解決することも多々ある
> File.new(path[, mode [, perm]])
> File.open(path[, mode [, perm]])
> File.open(path[, mode [, perm]]) {|file| ... }
> pathで指定されるファイルをオープンし、ファイルオブジェクトを返します。
>
> open() はブロックを指定することができます。
# openは予想通りに動作する
File.open('hoge.txt'){|f| puts f.read}
# newは警告が出てブロックの中身が無視される
File.new('hoge.txt'){|f| puts f.read}
warning: File::new() does not take block; use File::open() instead
611 :
607 :2008/01/05(土) 18:46:56
>610
http://www.ruby-lang.org/ja/man/?cmd=view;name=File 一応オンラインマニュアル読んだんだが
並べて書いてあるから、ただのエイリアスなのか
それとも動作違うから別名にしてあるのか、正直わからんかったスマソ
スレッドセーフなファイルの排他制御しようとおもって
調べてたんだがどうやればいい?
flock(operation)のFile::LOCK_EX じゃスレッドセーフにならんみたいなんだが
File.openでEXCL使ったらスレッドセーフになるかな?
612 :
607 :2008/01/05(土) 19:19:40
>>611 自己レスですが
rubyの排他制御ってプロセス間の排他制御がなされるだけなので
スレッド関係は自分でなんとかしたほうがよさそうでした。
613 :
デフォルトの名無しさん :2008/01/05(土) 20:18:06
a = [1,2,3] # という配列が与えられたとき # "We get a = [1,2,3], as expected." # という文字列を得る,簡単な方法を教えてくださいな. # 以下は "We get a = 123, as expected." となるからダメ. puts "We get a = " + a.to_s + ", as expected." puts "We get a = #{a}, as expected." # 以下は [1,2,3] のあとに改行が入るからダメ.文を切ってるのも減点. print "We get a = " p a print "as expected"
つ inspect
615 :
デフォルトの名無しさん :2008/01/05(土) 20:32:25
# Thanks! なるほど最初の2つは inspect というやつで行けますね. puts "We get a = " + a.inspect + ", as expected." puts "We get a = #{a.inspect}, as expected." # 三番目に近い形はうまく行きませんでした.
RPGつクールで触ったんですが、このルビィーという言語スクリプトは、ものすごく見づらいし紛らわしいですね C++言語をメインにする私には耐えられないものがありましたが、みなさんよくやっておられて感心いたしました
>>605 1. arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺
2. @dataというインスタンス変数をひとつ作るごとに鞭打ち100回
3. runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑
何で? どれ一つ理由が分からん。
605じゃないが 2. 継承先で困る 3. 外からアクセスされないオブジェクトって… とかかな。
横から推測だが 1. については、「ラベルにはその内容をこそ書け」ってことじゃあるまいか 例えば ノートの表紙にいちいち「〜〜〜のノート」と書いてあったり PCに貼る管理シールに「〜〜デスクトップPC」と書いてあったり バインダーのラベルに「〜〜バインダー」と書いてあったら いい加減アフォかと思わんか? ってことじゃなかろーかと
1は引数は例外にしてほしいな…
> 1. arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺
ちゃんと、名前つけろってことかと。
型じゃなくて、その変数の意味をかけと。
arrayとかつけてて、そこにコメントなんか書いてたら、
>>605 にぶっとばされると思う
> 2
上と同様。dataって、iとかjとかkとかつけるのと変わらん
> 3. runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑
なんでもオブジェクトにすんなってことだろう、たぶん
属性も操作もないのに、関数でいいじゃんていう
俺は、言っている意味はわかるよ
623 :
618 :2008/01/06(日) 00:01:00
>620 なるほど。 自分も >621 みたいにメソッドの仮引数はこう書くことが多いんだが def foo(str, pattern) str =~ pattern end 「ラベルにはその内容をこそ書け」という観点なら 問題ないよね? >619 ああ、それなら分かる。 自分の場合は rdoc を見るだけで使っているインスタンス変数が 分かるように必ず attr_reader とかで宣言してる。
>>622 >属性も操作もないのに、関数でいいじゃんていう
その主張はカプセル化(隠蔽)の概念を無視している
str =~ /ほげほげ/ は本当にstrという3文字の変数名ならやっぱ殴られると思われ =~ の左辺(右辺でも可)がStringなのは当たり前だろと ナニの文字列からどんな正規表現で文字列を抜き出すのかわかるような変数名にしろと 何のために変数名に大文字小文字数字アンダースコア全部使えるようになってんのかと まあどれだけ重要なスクリプトなのかにもよるけどな 1日くらいで完成してメンテも1年先に見直すかどうかわからん程度のスクリプトにそんなん求めても疲れるだけだし でも初心者スレだから最初から悪い癖は抜いといたほうがいいのかもとも思う str1,str2,str3という変数名しかつけられなくなったプログラマはいないわけではないし
>>624 いや、その場合、カプセル化の必要ないよね?
Hoge.new.run は 「ていうかインスタンス作る必要なくね?モジュールでいいじゃん?」 というツッコミが入る定番ネタだな
htmlとhtmを巧みに使い分けてる俺最強
urlは文字列でuriはURIのインスタンスに使い分けることに今日決めた
>>612 つMutex
> rubyの排他制御ってプロセス間の排他制御がなされるだけなので
そりゃファイル関係のロックは普通プロセス単位だからな。
>>627 ライブラリとしてもメインスクリプトとしても使えるようにしたいときに
if $0 == __FILE__ の中で使ったりというのは、ときどきやる。
そしてifの中身がHoge.new.run
634 :
624 :2008/01/06(日) 12:44:46
>>626 クラスにしないとプライベートメソッドが使えないじゃないか!
と思っていたがそれは勘違いだった
関数ですむところをわざわざクラスにする利点は
一度作ったHogeインスタンスを使いまわせることだな
テストのときに便利
やたらいろんな種類のCSVファイルのフォーマット変換しなきゃなんなり、 継承使って、元フォーマットと目的のフォーマットを返すメソッド用意すれば、 勝手に変換できるようなベースクラスを作り、 変換ごとにクラス作って、 どのファイルをどのクラスで処理するかを配列につっこんで、 ループ回してファイルをクラスに渡して処理させたんだ。 そのループの中身が Hoge.new.run みたいなもんなんだが、これも駄目か?
要するにケースバイケース
>>635 なるほど、クラスの機能を使って、拡張したため、そうせざるを得ないというわけか。
まあ、おれなら、みっともないから、関数のラッパー書くがな
Rakeの実装見て感心したから 大きいアプリケーションはあんな感じするようになった。
Rakeはわりと参考になると思う 初心者脱却できそうかなあというときに読んでみるといい
そうか、おれもRake読んでみるよ そういや、前に、Railsのソース読んでて、頭ひっくり返っておもしろかった覚えが
といいつつ、聞いてみるんだが、どの辺注意してみるべきかな? DSLってことじゃないよね?
>>635 その説明だけではよく分からんが
あんまりクラスにする必要はないんじゃないかと思う
>>641 アプリケーションオブジェクトをキャッシュしてるあたりとか。
あれ多分、マルチスレッドで使われたときにオブジェクトいくつも作らないためだと思うんだけど
自信はない。
あと、自分はアプリ表すクラス作って
Hoge::Application.new(config).run
とかはわりと賛成。
アプリって、たいがい状態と自己同一性を持ってて、外からの呼びかけに反応する
もののような気がするし。
>>637 ,642
入力CSVファイルが25種類、出力CSVファイルが5種類ぐらい
それぞれフィールド入れ替え+文字列変換など。
ヘッダ行があったり無かったり。たまに1個のファイルが複数の出力ファイル。
開いてフォーマット調べて変換方法を切り替えるというのもある。
という感じ。
Rakeみたいな感じで書けるようにする方がいいかなぁ。
645 :
デフォルトの名無しさん :2008/01/07(月) 00:55:59
zipアーカイブなどを扱うクラスってありますか?
はい。
ほのぼのrake
648 :
デフォルトの名無しさん :2008/01/07(月) 09:17:09
囚人が使うRubyは、やっぱ知っておかないと犯罪に巻き込まれちゃう品。 今まで存在は知ってたけど無用と思ってたけどやらないと。 ああなんで無駄な知識を詰め込まないといけないのか。
Rubyを知っておくと、刑務所でヒーローになれたり早く出所できるかもしれない。
書き方の話題といえば、Hashのキーはシンボルで書くように癖つけたほうがいいのか 素直に文字列で普通にすればいいのかの論争は今のところどっちが優勢? str_hash={'name'=>'だれそれ', 'age'=>18, 'sex'=>'週に3回'} sym_hash={:name =>'だれそれ', :age =>18, :sex =>'週に3回'} puts sym_hash['sex'.intern] 週に3回 Hashに大量にアクセスする場合は毎回String#internしてるのが面倒だなと思うんだけど
ぶっちゃけどっちでもいいと思う。でも、玄人っぽくするためには シンボルでいいんじゃね。 1.9からは { name: 'だれそれ', age: 18, sex: :male } なんて書き方も出来るようになるわけだしさ。Object#methodsもシンボルを 返すように変更された。
文字列のほうが素直で普通なの?
素人質問ですが、シンボルもどこかでシンボル文字列のマッチしてたりしませんかね? ベンチマーク結果で明らかにシンボルのほうが速いのなら、それはそれで構わないのですが…
list1 = [ {'name'=> 'だれそれ', 'age' => 18}, {'name'=> 'なにがし', 'age' => 21} ] list1.each do |h| p h.keys.map{|e| e.object_id} end list2 = [ {:name => 'だれそれ', :age => 18}, {:name => 'なにがし', :age => 21} ] list2.each do |h| p h.keys.map{|e| e.object_id} end # 実行結果 [538368178, 538368118] [538368038, 538367978] [2629902, 880910] [2629902, 880910] HashのキーにやたらSymbol使いたがる大きな理由はこれだろ Symbolならオブジェクトはひとつだけで済む 仮に配列にHashが1まんこ入ってたとしたら それだけで1まんこのStringが作られてしまうのが気持ち悪いのだろう
Symbolは昔は単なる整数だったんだよな
今でも内部的にはそうなのかな。 俺はシンボルってのは識別子に近いモノだと思ってる。 だから、フィールド名や名前付き引数(もどきのハッシュ引数)の名前として Rubyの中で完結した用途で使うのは良いと思うが Rubyの外とやりとりするようなモノには使わない。 例えば、h = { :name => 'だれそれ', :age => 18, :sex => 'female' } というハッシュの キーをそのままto_sしてDBのフィールド名やXMLに転用するのは俺的にはNG。
みんなhash[:sex]のジョークを華麗にスルーしてるのにわろたw
Hashの要素にアクセスするのにいちいち文字列をinternしてたら
文字列からSymbol探してくる方が時間かかるだろ
そういう場合は素直に文字列をキーにするべき
シンボルは速いなんてのを盲目的に信じると逆に遅くなるぞ
素直に書けるように書け
俺も
>>657 みたいに内部で完結する場合にだけシンボルを使うな
ハッシュのキーが1万個あったら1万個のStringオブジェクトが生成され、 しかもそれは本質的には別個のオブジェクトである意味は全く無い → そうだ Symbol、しよう。 というのは思いとしては痛いほどよくわかるんだけどね
lisper感覚としてはシンボルのほうが落ち着く。 最初から文字列なモノ(人名=>その人のレコード、とか)ならもちろん話は別。
Symbolを使うべきと理解できてる場合はそれでいいと思うけど Symbol速いと言われてるから何でもSymbolというのは良くない Symbolをキーにするハッシュがある場合は 実はStructでいいんじゃないかと考えてみるのもいいかもね
hashについての質問なんですが、 abc={"a"=>1,"b"=>2,"c"=>3,"d"=>2,"e"=>1,"f"=>2,"g"=>3,"h"=>2} のように、abcを定義した時に、この中身の数値(ここでは1,2,3)によって、その数値を持つアルファベットを列挙させることはできますか? たとえば、2のやつを表示させたかったら、 b d f h のように。教えてください。お願いします。
こんなもんかね。 abc.keys.select {|key| abc[key] == 2} => ["b", "d", "f", "h"] 長い別解 abc.select {|key,value| value == 2}.map {|assoc| assoc.first } => ["b", "d", "f", "h"]
とうあ。 irb> abc = {"a"=>1,"b"=>2,"c"=>3,"d"=>2,"e"=>1,"f"=>2,"g"=>3,"h"=>2} irb> p abc.dup.reject{|k,v| v != 2}.keys ["b", "d", "f", "h"]
666 :
デフォルトの名無しさん :2008/01/09(水) 00:01:37
日本語の文字列の配列を各文字列の末尾でソートしたく こんなコードを書きました。が、要素が多くなると遅いです。 jarray = [”おいお", "おいあ", "いあお"] jarray.sort! do |a, b| a.split(//).reverse <=> b.split(//).reverse end #jarray => ["おいあ", "いあお", "おいお"] もっと良い書き方があったら教えてください。 文字コードはUTF-8です。
667 :
663 :2008/01/09(水) 00:02:58
ありがとうございます!
意味上は
「abcから値が2ではない要素を除いたハッシュを生成しそのキーを列挙」
と読める
>>665 が真っ当と思われる
だがabcを複製しないとどうにもならんのが難点か
キーの配列作ってabcでの値が2になるものを抜き出す
>>664 の上が処理上は妥当っぽい気も
>>666 jarray.replace(jarray.sort_by{|a| a.split(//).reverse})
670 :
デフォルトの名無しさん :2008/01/09(水) 00:19:04
>>666 サンクスです。助かります。
sort!よりreplaceとsort_byの組み合わせの方が速いんですね。
あ、replaceは今回関係ないよ sort_by!が無かったから1行で書くために使っただけ ソートアルゴリズム以前に日本語文字列をsplitしてreverseする回数が多すぎるんだと思う
>>666 実際に試さずに言うんだが、先にsplit→reverseを済ませておいてから
sortした方が早くなると思われる
(split→reverseの回数が減るため)
jarray = ["おいお", "おいあ", "いあお"]
jarray.map!{|x| x.split(//).reverse.join}
jarray.sort!
>>673 まあ、もしかしたら些細な問題かもしれんのだが
irb> arr = ['かきくけこ','あいうえお','さしすせそ']
irb> arr.map!{|x| x.split(//e).reverse.join}
irb> arr.sort!
irb> puts arr
おえういあ
こけくきか
そせすしさ
これからどうすればいい?
そんなん、sort!したあとにsplit→reverseすればいいじゃん アレ?
>>673 sort_byのブロック内の実行回数は要素数と同じだよ
1000個の配列をsort_byした場合は1000回
$ ruby -r profile -e 'Array.new(1000){rand(1000)}.sort_by{|a| a.to_s}'
% cumulative self self total
time seconds seconds calls ms/call ms/call name
47.72 1.88 1.88 1 1880.00 3500.00 Enumerable.sort_by
29.19 3.03 1.15 9280 0.12 0.12 String#<=>
8.12 3.35 0.32 1 320.00 470.00 Array#each
7.11 3.63 0.28 1 280.00 440.00 Array#initialize
4.06 3.79 0.16 1000 0.16 0.16 Kernel.rand
3.81 3.94 0.15 1000 0.15 0.15 Fixnum#to_s
0.00 3.97 0.00 1 0.00 3940.00 #toplevel
0.00 3.97 0.00 1 0.00 0.00 Integer#to_int
0.00 3.97 0.00 1 0.00 440.00 Class#new
こういうのはsortだけで済むように作ったほうが速いな
$ ruby -r profile -e 'Array.new(1000){rand(1000).to_s}.sort'
% cumulative self self total
time seconds seconds calls ms/call ms/call name
59.76 0.49 0.49 1 490.00 810.00 Array#initialize
20.73 0.66 0.17 1000 0.17 0.17 Kernel.rand
18.29 0.81 0.15 1000 0.15 0.15 Fixnum#to_s
1.22 0.86 0.01 1 10.00 10.00 Array#sort
0.00 0.86 0.00 1 0.00 0.00 Integer#to_int
0.00 0.86 0.00 1 0.00 820.00 #toplevel
0.00 0.86 0.00 1 0.00 810.00 Class#new
前から思ってたんだけどさ、たとえばさ、名前と年齢と住所ってデータが大人数ぶん空項目なしで存在するとしてさ [{'name'=>'山田太郎', 'age'=> 23, 'home'=>'駅前1丁目'}, {'name'=>'田山次郎', 'age'=> 31, 'home'=>'駅前2丁目'}, {'name'=>'山川三郎太', 'age'=> 1024, 'home'=>'駅前3丁目'}, ... ] と {'name' => ['山田太郎','田山次郎','山川三郎太', ...], 'age' => [23, 31, 1024, ...] 'home' => ['駅前1丁目','駅前2丁目','駅前3丁目', ...] } ってどっちがまとも?
678 :
666 :2008/01/09(水) 11:22:26
皆さんありがとうございました。とりあえず jarray.replace(jarray.sort_by{|a| a.split(//).reverse}) が妥当なところなのでしょうか。 もう一つ質問です。 テキストファイルから特定の行(x行目)だけを取り出す必要があり、 次のようなメソッドを書きました。 def xthline(x, file) index = 0 file.each do |line| return line if index == x index += 1 end nil end 当然ですが、巨大なファイルの最後の方の行を取り出す のにえらく時間がかかります。ベターな方法はあるでしょうか? (拡張モジュール作成?)
>>677 まともの定義が分からんが、あとの方の例だと、
マークシート形式の試験にトラウマがある俺にはちょっと不安。
>>678 def linefetch(text, line)
return text.split[line-1]
end
もし、テキストファイルの内容が不変で行数を取り出す行為が何十回もあるのなら、
俺はtext.split(//e)の結果をインスタンス変数とかに保持しておく。
メモリをやたら食うけど、たぶんそのぶん速い。
特定の行をそこだけうまく抜き出す、という芸はRubyは苦手。
テキストファイルをとりあえず全部メモリに読み込むのが普通と思われ。
数バイトずつ読み込んでうんたらかんたらはやってやれないことはないとは思うんだが。
681 :
680 :2008/01/09(水) 11:40:13
あ。 誤 : text.split(//e)の結果 正 : text.splitの結果
>>677 後者は人間にとって非常に不安を引き起こすデータ形式だな…
いや、コンピュータがやるんだから
・ 前者の各要素のハッシュに含まれるペアの数は全て同一
・ 後者のハッシュの値の配列の要素数は全て同一
は同じことのはずなんだが、後者はなぜかとっても不安だな
idを作って数字をキーにして
{ 1 => {'name'=>'山田太郎', 'age'=> 23, 'home'=>'駅前1丁目'},
2 => {'name'=>'田山次郎', 'age'=> 31, 'home'=>'駅前2丁目'},
3 => {'name'=>'山川三郎太', 'age'=> 1024, 'home'=>'駅前3丁目'},
...
}
という格納法も見るね
うっかり氏名でキーを作って同姓同名で破綻したりするのもいい思い出だと思う(そうか?)
>>678 Ruby だけで収める事にこだわらないのであれば sed がお勧め。
def xthline(x, file)
return %x( sed -n #{x}p "#{file}" )
end
これだけだと改行コード付だったり
x 行目が無い場合は nil じゃなくて空文字列が返るので
採用する場合はもうちょっと工夫が必要。
>>677 イテレータ回すことを考えると前者が有利
>>678 jarray.map!{|e| [e, e.split(//).reverse.join]}
jarray.replace(arr.sort_by{|a| a[1]}.map{|e| e[0]})
こっちのほうが速いかも
メモリ使用量は増えてる予感
変数名間違えた jarray.map!{|e| [e, e.split(//).reverse.join]} jarray.replace(jarray.sort_by{|a| a[1]}.map{|e| e[0]}) なんでもいいけどjarrayってのは即刻やめたほうがいいと思うぞ
地雷みたいでrubyがストールしそうだもんな
Rubyのマルチセットって組み込みのライブラリにあったっけ? 標準添付のライブラリのほうだっけ?
そんなんあったっけ?
確かに join した方が速いよね。 jarray.replace(jarray.sort_by{|a| a.split(//).reverse.join})
joinしたほうが速いというか、joinすることを失念してると言ったほうが正確かね 配列の比較より文字列の比較のほうがおおむね速い 何かポリシーがあって配列のままにしてるってわけではなさそうだ
693 :
678 :2008/01/09(水) 17:26:45
>>680 , 683
不特定数のファイルを順次処理するので、データを配列化して保持
するのは無理っぽいです。やっぱり遅いのは仕方ないですかね。
行までのバイト数なんかを事前に取得できないかぎりは。
>686, 691, 692
では
jarray.replace(jarray.sort_by{|a| a.split(//).reverse.join})
で行きます。joinするというのは思いつきませんでした。
あえて処理を加えることで速くなるという発想がなかったので。
勉強になります。
694 :
デフォルトの名無しさん :2008/01/09(水) 17:54:54
質問です! この問題を解いてもらいたく書き込みました. (問)「ディレクトリ内に以下のサブディレクトリがあります. "a" "b" "c" "d" "e" 各サブディレクトリにはHTMLファイルが入っています. "a.html" "b.html" "c.html" "d.html" "e.html" 各サブディレクトリに含まれるHTMLファイルの<p class="textvalue">に該当する情報だけをテキストファイルに書き込みなさい. なお,htmlファイル毎にテキストファイルを作成しなさい.」 この問題に対して,サブディレクトリ毎にテキストファイルを作成する点がわかりません! つまり,サブディレクトリごとに同じ処理を行えば良いのですがそこがわからなくて困ってます. 今の段階では,すべてのファイルの<p class="textvalue">に該当する情報を1つのテキストファイルに書き込むことは出来ました.. 以下が現段階でのプログラムです↓ require 'hpricot' $KCODE = 'SJIS' require 'jcode' require 'open-uri' require 'kconv' files = Dir.glob("**/*.{html,htm}") files.each { |file| p file html = open(file).read.tosjis document = Hpricot.parse(html) names = (document/'p.textvalue').map{|e|e.to_plain_text.strip} puts names foo = File.open("foo.txt",'a') foo.puts names foo.close end } つまり,サブディレクトリが変わる度に処理を繰り返すやり方を教えてください!!お願いします!!
>>694 File.dirname(file) であとはごにょごにょ。
てか、最悪でもfileから正規表現で切り出すこともできると思うんだけど それくらいできて欲しいなとちょっと思った
>>694 リファレンスマニュアルのDirのところ全部読め
698 :
デフォルトの名無しさん :2008/01/09(水) 19:03:26
>>695 やっぱりDir.globの点が間違っているんですかね?
>>697 読んだんですけどディレクトリ毎に処理を行う点は載ってなかったような...
オレの力不足です,申し訳..
てか宿題は宿題スレでやれ めんどくさいから
>>694 require 'hpricot'
require 'kconv'
savedir = Dir.pwd # テキストファイルを保存するディレクトリ
Dir.glob('*/').each do |dir|
Dir.chdir(dir){
infile = Dir.glob("*.html")[0]
outfile = "#{savedir}/#{File.basename(infile,'.html')}.txt"
html = File.open(infile,'r').read.tosjis
document = Hpricot.parse(html)
names = (document/'p.textvalue').map{|e|e.to_plain_text.strip}
File.open(outfile,'w'){|f| f.puts names}
}
end
Ruby1.8かそれ以上でないと動作しないので注意
Dir.glob('*/').each do |dir| Dir.chdir(dir){ } end のあたりが微妙に無理してるな(w 「ディレクトリごとに何かする」ということを優先
702 :
デフォルトの名無しさん :2008/01/09(水) 23:02:36
>>700 ありがとうございます!
これで成功しました!!
あと,もう一つ質問があります!
694
で述べた問題で,各ディレクトリの中にhtmlファイルが,"index.html"と"shop.html"と,2つ入っていたとします.
そのとき,"index.html"では,<p class="textvalue">の情報を取り,
"shop.html"では,<p class="textShopinfo">という情報を取りたいと思っています.
このとき,indexとshopというファイル名で処理を場合分けする場合,
>>700 さんが記述してくれたプログラムにどのように拡張すれば良いのでしょうか??
お願いします!!
うむ っていうかスクリプトを全く読んでなさそうだ どこがどうなってどう動いてるかとか興味なさげ
705 :
デフォルトの名無しさん :2008/01/10(木) 02:05:13
WWW::Mechanizeで、イントラネットのWINDOWS認証を行うことは
できるのでしょうか?会社のWEBの処理を自動化したいのですが。
agent = WWW::Mechanize.new
agent.auth('user', 'pass')
page = agent.get('
http://intranet/ ')
だと、.htaccessの認証のは通るのですが、WINDOWS認証は通らないです。
ここ調べろとか教えていただけると非常にありがたいです。
IEでやる
709 :
デフォルトの名無しさん :2008/01/10(木) 09:58:42
質問です。 Kconv.guess(text) で文字コード判定をしたいのですが、textが数十MBあるような場合、 全部を渡さずに、一部を切り出して渡した方が良いでしょうか? もしそうなら、最低どれくらいを渡せば確実ですか?
一部しか渡さないならそれをすり抜けるテキストが必ず存在するから 最低どれくらいなんてものはないだろ。 オンメモリが無駄に思えるなら一行ずつ読み出してguessしていって ASCII以外の値が返ったら停止すりゃいいんじゃないの。
まあ確かに「その文字コードにしか存在えしない文字の繋がりが出るまで」としか言えんな(w Kconv.guessって全文nkfに渡してるん?
712 :
709 :2008/01/10(木) 11:09:22
>>710 ,
>>711 そうですよね。
ASCII以外で停止の方向でやってみます。
ありがとうございました。
どんな文字が何字あるかにもよるんだろうけど、1行では誤判定しそうな気が 日本語文字は200文字くらいは必要ではないかと 10行くらいどばっとぶち込むのが吉
714 :
デフォルトの名無しさん :2008/01/10(木) 14:47:17
すいません! 改行コード変換の方法を教えてください! CR+LF => LF
CR消せば?(素)
716 :
715 :2008/01/10(木) 15:17:12
>716 そのCRとやらを消すにはどうしたらよいのでしょう? line.gsub!("\r\n", "\n) とやりましたが効果がありません・・・。
莫大な数の改行を処理し続けるのでなければNKFに頼るのが一番無難だという結論に達した require 'nkf' lf_text = NKF.nkf('-d',crlf_text)
-d で良かったっけ? 放っておくとJISになるような
719 :
714 :2008/01/10(木) 15:41:20
>>717 >>718 Shift JIS なら -ds でいけました。ありがとうございました。
前もって改行コードを取得できたらいいのですが、
何やらむずかしそうですね。
>>716 ruby 1.8が前提なら
a = "hoge\r\n"
b = "fuga\n"
c = "moe\r"
p a.chomp+"\n" # => "hoge\n"
p b.chomp+"\n" # => "fuga\n"
p c.chomp+"\n"" # => "moe\n"
でも,なんで716がうごかないんだろ
721 :
716 :2008/01/10(木) 15:58:50
>> 720 ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]で、 File#getsを使って行を取得しています(改行コードも入るときいたので)。 Windowsだからダメなんでしょうか・・・。
binmodeにしないまま読み込めば\r\nが\nに変換されて読み込まれる binmodeにしないまま書き込めば\nが\r\nに変換されて書き込まれる
723 :
716 :2008/01/10(木) 16:39:40
>> 722 それだ!解決しました。 大変お世話になりました。
line.gsub!("\x0D\x0A", "\x0A")
MD5Digestを利用して 「既存の大量の画像入りディレクトリの中身と重複したエロい画像を手に入れても削除」 っていう便利スクリプト作ろうと思った。 md5が重複する可能性を危惧して「ファイルの先頭2キロバイトくらいもデータベースに保持しておいて比較」とかしようと思う。 一瞬「えー200個くらい画像を入手するたびにファイルの先頭ガリガリ読み込むのかよ」と思ってげんなりしたけど、 よく考えるまでもなくmd5ハッシュを作る時点でファイル全文読んでるよね。気にしないほうがいいか。
サイズが一致したときだけ確認すれば
rubyのみで生ソケットとかは無理? IPHeaderいじたいんだけども。
エロ画像収集ごときで MD5 の重複を気にするってのがありえない。 MD5 と SHA1 の二本立てでおけ。
500GBのHDD買って光回線でshareつけっぱにしておくと そもそも管理しようという気力がなくなる。 チンゴがボトルネックになってしまうんだよな。
標準出力をコマンドラインから送るにはどうしたらいい出しょうか? $ruby hoge.rb 1 このように 1 を引数として送ってみましたが「そんなファイルはないよ」というエラーがでました。
>>728 Cとかで作るのとほぼ同じ。
マニュアルにもあるけど、パラメータが定数で指定できない場合は即値で指定すれば何でもできる。はず...
>>728 Socketでは不足?
>>731 お前のシステムは日本語で喋るのか?
はいいとしてとりあえずはARGVの使い方調べれ。
スクリプトの引数を空白で区切って配列にしたものが入ってる。
>>728 Socketで引数にSOCK_RAWが指定できるみたい
>>731 まずは標準入出力など超重要概念を学ぶのが先
たのしいUNIXでも嫁
C:\>1 '1' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 こいつ! 日本語で喋るぞ!
たのしいUNIX(笑) いやユーザーレベルで適当な入門書少ないけどな
>>733 英語です。
そんなこと書いてあるっぽいってことで、、、下手な役ですみません
ARGV検索してみます!
ありがとうです!
>>729 > MD5 と SHA1 の二本立てでおけ。
SHA2か256にしない理由は?
何個くらいファイルがあったらMD5が衝突する確率が50%になるんだっけ。
いや、1000個に1個誤認するとかいうレベルでもかなりヤな感じだと思うんだが
>>740 > いや、1000個に1個誤認するとかいうレベルでもかなりヤな感じだと思うんだが
そんなレベルなら今頃衝突しまくってる気がする
まぁ持ってるファイルが1億以下なら、衝突を気にするほうがおかしいってレベルじゃね?
50%になるまで大量のファイル放置したくないよな 10万回に1個ぶつかるくらいになったあたりで警告出して欲しい(w SHA256はなんか長いから遅いんだろうなと思ったら メガ未満のファイルを大量に処理するぶんには体感上MD5とほとんど変わらんな なんで流行らないんだ? irb>p Digest::SHA256::hexdigest(File.read('img.jpg')) "4c8cfdb15d48ad839d67c3c485c7905092880cb18feb8ef170c09540adcfa29c"
そもそも「重複ファイルのカジュアルな検出プログラム」にはファイルサイズとmd5で充分だからじゃね 検出間違ったら建物が爆発するとかミサイルが飛ぶとかそういうのでない限りmd5で問題ないもの 画像に至っては「両方の画像を表示して同一画像であることをユーザーに確認させる」とかいうのもあるし 今からハッシュ関数利用してプログラム作るならmd5は捨ててSHA256以上を最初から使っとけって言ってたのは誰だったか
度々すみません ディレクトリ内のファイルを1ファイルずつ変数に入れるループ文を書きたいのですがどうすればいいでしょうか? 分からないところは1ファイルずつ取り出すところです # 以下ではoにすべてのファイルが入ってしまう o = `dir` o.each { |x| puts x } # 上に同じ ∞ループ、、、(;ω;) while( o = `dir` ) put o end
`dir /b`.each_line{|f| f.chop! puts f }
自己レス、、
dir = Dir.open('.')
while file = dir.read
print file,"\n"
end
これで、できました!
>>746 さん
れすありがとうございます
それも試してみます!
>>747 さん
今日はじめたのですがとりあえず動かすのが楽しくて、、
落ち着いたらリファレンス読みます!
あとPHPは投げ捨てます(^^)
セキュリティ関係の用途でだろ>衝突を気にする
他言語貶めるような奴にRubu使って欲しくないね 後々面倒だから
n bitのハッシュの場合は、sqrt(2**(n+1) log(2)) 個のファイルがあれば 50%の確率で衝突がおこるっぽい。 MD5は128bitだよね? なら、2171京個のファイルがあれば50%の確率で衝突するはず?
だから50%じゃ駄目なんだって普通に考えろよ 40%ならセーフなのか? 違うだろ? 10%だってお話にならんだろ? リンゴが10個あったら1個ミカンと間違われて捨てられるんだぜ? 1万円を千円札10枚に両替したら1万円札が混じってるんだぜ? どんなドジっこだオラ
このへんの概念めんどくさいよね とりあえずみかんの例は 「このシステムを使って2000京個のりんごを識別すると50パーセントの確率で1個だけみかんが混じってる」 と解釈するべき 50パーセントという数字だけ持ち出すとネタにしかならんぞ
>>750 さん
すみません、、(;ω;)
僕はまともに使えるのPHPだけなので貶める意図はないです
少しPHPに飽きていたところだったのでrubyが面白くて
計算したMD5ハッシュを他のプログラムでも使うとかいうことがないのなら素直にSHA256使っとけ 間違って1つしかなかった激エロ画像を削除してしまうんじゃないかとビクビクすることなく枕高くして眠れるよ
画像の重複チェックツールなんてすでに腐るほどあるがな
>>752 1学級が40人の時、同じ誕生日な生徒がいる確率は約九割です。
しかし九割の生徒が同じ誕生日というわけではありません。
FAQなんですけど、実例があればどういうのでしょうか。 3.2 ブロック付きメソッドにブロックを渡すにはどうすればいいですか ブロック付きメソッドにブロックを渡すには、メソッドの後ろにブロックを置く方法の他に、 手続きオブジェクト(を指す変数、定数)の前に&をつけて引数として渡す方法があります。
FileUtils.cmpは とりあえずファイルサイズが違っていたらfalse 両者のファイルを開いてバッファごとに比較し違っていた時点でfalse という処理 比較先の画像ファイル自体にいちいちアクセスしたくないならdigestを長くしておくのがよいかと
kana2romってゆーライブラリ
ttp://www.math.kobe-u.ac.jp/~kodama/tips-ruby-kana-rom.html を使っているのですが、困っています。
このライブラリはWindows上でRubyで実行してもちゃんと”あいう”を”aiu”って変換してくれるのですが、
ruby on railsを用いてサーバ上で処理として組み込むと(サーバ上のrubyに書き込むと)”あいう”を変換させようとすると”あいう”と出力されます。
kana2rom.rb本体はrailsに合わせてutf-8に変換しました。
で、
require "kana2rom"
Kana2Rom::kana2rom(str)
しました。
伝わりますでしょうか?助けてください。よろしくお願いします。
>>762 パッと見た感じ、入力が EUC-JP と期待しているコードになってるね。
str.split(//e) とか。
kana2rom.rb 自体はそのままで、
入力する文字列を一旦 EUC-JP に変換してから処理するようにする。
それがイヤなら横着せずに *真面目に* UTF-8 に対応するように修正しる。
764 :
763 :2008/01/11(金) 18:49:09
>>762 ていうか、それどっかで見たことあるなと思ったら、
以前 Ruby 本スレで出てきたやつだね。
そっちのスレにいろいろ対処法が書いてあったからそっち見れ。
>>762 野良モジュールの面倒まで見てられないが、たぶん、正規表現がeuc対応のままだからだと思う
//e とかを全部 //u に置き換えたら動作しそうな気もする
あとサーバ上でならKAKASIとかあんじゃん
$ echo "あいうえお" | kakasi -Ha -Ka -Ja -Ea -ka
aiueo
$ echo "我輩は猫である" | kakasi -Ha -Ka -Ja -Ea -ka
wagahaihanekodearu
$ echo "我輩は猫である" | kakasi -w | kakasi -Ha -Ka -Ja -Ea -ka
wagahai ha neko dearu
KAKASIとかが無くてもRuby単体でせめてひらがなくらいはなんとかできたら便利じゃね、 というコンセプトであるように見える
>>758 p = proc {|x| puts x*10 }
[1,2,3].each(&p)
>>752 こういう数字のマジックにコロっと騙されちゃう奴って結構いるもんなんだよね。
>>743 MD5 はセキュリティ上問題がある(意図的に衝突させられる)から
SHA256 を使うべきという話らしいけどね。
>>758 実はMethodなんかも渡せるのでたまに使う
[1,2,3].each(&method(:p))
あとメソッド定義した時に&で受けて&で渡すとか
def foo(&block)
[1,2,3].each &block
end
>>771 それらを実例としてFAQに追加しておいてもらえませんか?
思いつかない人には無用の機能だと思う
>>772 マニュアルのメソッド呼び出しのところ読めば詳しく書いてあるよ
でも無ければ無いでなんとかなる機能だしFAQに載せる程かな?
それでも気になるなら自分で追加するといい
詳しく読めばわかるからサンプルいらないって・・・w
FAQなのに良い回答になってないからだろ。 あのFAQ集は日本語の文章に変なところが多くて読み辛い。
sha256ってライブラリはどれ使えばいいの?
>>777 require 'digest/sha2' で256も512も使える。
779 :
デフォルトの名無しさん :2008/01/12(土) 11:23:22
Numericクラスの数値をテキストに変換する場合に, 1を01や001などと任意の数の0を左側に付けて 変換するようなメソッドは有りますか?
String#%
もしくはString#sprintf
782 :
デフォルトの名無しさん :2008/01/12(土) 11:50:56
ありがとうございました.
783 :
デフォルトの名無しさん :2008/01/12(土) 13:34:29
>>774 いやー、俺おもうけどさ。
FAQもそうだけど、マニュアルにサンプルコードがあるのってすごく助かるよ
ちょっと載ってるだけで、イメージがつかめる
いやこれは、仕事でMSDN見てて思うんだけど(Microsoftのオンラインヘルプ)、
Javaのリファレンスとか、本当にリファレンスしか載ってないもんな。
いつも、.chmのRubyリファレンス見て不満におもってたけど、
ri使ったら、サンプルコードちゃんと載ってるんだよね。
リファレンスの方にも載せることってできないのかな?
> いやこれは、仕事でMSDN見てて思うんだけど(Microsoftのオンラインヘルプ)、 > Javaのリファレンスとか、本当にリファレンスしか載ってないもんな。 MSのヘルプは、サンプルや、使い方がよく載っていて、 Javaなんかは、ぜんぜん載ってないっていいたかったのです。 わかりにくかったスマソ
作ってる人違うとかじゃないかなあ マニュアル整備しようぜという話は定期的に出るけど必ず頓挫するね 何がそんなに壁なの? 飽きちゃうの? あと2chに書き込んだコードはオープンソース云々と相性悪くて取り込めないので注意
>>784 Java のリファレンスは JavaDoc で auto generation
それにサンプル載せるということは
>>784 JavaはMSと違ってsourceそのものがある
>>788 そくわらんが、そのsourceには、使い方が書いてあるの?
>>785 じゃああなたがマニュアル整備してください。
マニュアル書ける人は現状で満足してて、 マニュアル欲しい人は書くのに十分な知識を持っていない。
そんなんだから日本はダメなんだ。
なぜか一番上に@deltaを定義して @deltaに書き換えたら出来てしまった・・・なんでやねん・・・
>>785 マニュアル整備しようぜという話からるりまができたんじゃね?
あと最近のRubyリファレンスはサーバーエラーが出まくってて
とてもまともに編集できたものじゃない
インスタンス変数にする必要はなくて、ブロックに入る前に delta = nil とでもしとけばブロックの中でもそのdeltaを見るようになる。
オフィシャルって何で動作してるの? Ruby だとしたらあの 500 エラーはちょっと悲しい
なるほど 情報どうもです
InstikiかBitChannelにしないかな・・・
サーバーエラーが出るのはRWikiのせいなのか?
単にサーバーマシンの性能が足りないだけだと思うんだけど
>>793 変数deltaがブロックの中で定義されたために
そのブロック中でのみ有効な変数(ブロックローカル変数)になっている
対策は
>>796 の助言通り、ブロックの外でdeltaを定義(代入)しておくこと
あとソースコードの中で無闇にマジックナンバー使うのはやめれ
リソースが足りないのは、 ソフトがリソースを食う。 ハードのリソースが足りない。 の両方を意味するから、あのメールだけではどちらともいえないが、 簡単に解決する方法は、たぶんハード増強のほうだろうな。
ifはブロックじゃないんですね・・・ ifの外に書いてもダメでした。 あと delta = nilはダメっぽいですよ。Fixnumに直せないって。 単純に deltaって定義したらいけました。 ローカル変数の方がその外の変数より優先されるんじゃないですか? どうしてlineno==4のところではローカル変数のdeltaとして認識されないで、グローバルなdeltaとして認識されるんっでyそう+
ごめんなさい、nilでもいけました。 あと、deltaと書くだけではダメで delta = 0なりnilと書かないとダメみたいです;; ローカル変数とか良く分からない;;;
マジックナンバーというのは、4とか43とかの 意味ありげだが値からは意味が分からない数。 4のほうは、Deltaの行の判定のようだが、 見たところDeltaという見出しがある行は1つしかないから、 行番号まで判定する必要がそもそもない。 43のほうは、その43とはどういう意味の43なのか分からない。
delta と単独で書くと、deltaというメソッドの呼び出しと見なされる。 # delta() と書くのと同じってこと。 変数だと教えるために何かを代入する必要がある。 あと、ブロックを作ってるのはifじゃなくてscanの後ろの do 〜 end。
えっと、43というのは43行目からの値しか意味がないとかいう このファイルの仕様で(オシロがそう掃き出すらしい) if lineno==4 としたのは、そこで判別した方が速いと思ったからです。 いちいち正規で判別させると遅いので、 行数でまず捌いた方がいいかと。 これはマジックナンバーですか?
書き捨てでおk
>>808 マジックナンバーです
>>809 OK、まずRubyのリファレンスマニュアルを熟読だ
もしくはGoogleで適当な初心者向け解説サイトを探せ
もちろん書き捨てですけど、 暇があったらあのオシロ用に完璧なコードも書きたいと思っています。 ゆとりな後輩たちに何か残してやりたくて。
>>811 本は読んだつもりなんですけど。
たのしいRubyとかピッケル本とか
ローカル変数とかはクラス作ってやるとあんまり関係なくなりますよね。
ローカル変数とかで引っかかった事がないので驚いているだけかと。
ここで教えてもらえば済む事です。
レファレンス・FAQには皆さん不満があるんですね。 個人でブログやってrubyテクを披露している人いますが、その人たちが FAQやマニュアルを編集してくれればいいでしょうな。ruby公式FAQと マニュアル・レファレンスをウィキみたくユーザー参加型にすればよいと思います。 javaと比べてみても、rubyは文章編集とユーザー参加がまだ閉鎖的ですし、 昔のパソコン通信(メーリングとかネットニュース)を思い返しますw Web 2.0 ところでピッケル本(英語・日本語)の評判はどうでしょうか。 rubyの教科書となりえてますか?
>ここで教えてもらえば済む事です。 自分でやれ
TMPDIR='./tmp' Dir.mkdir(TMPDIR) unless FileTest.directory?(TMPDIR) Dir.glob("*.csv").each{|csv| infile = File.readlines(csv) io_out = File.open(TMPDIR + '\\' + csv.downcase, "w") delta = infile[3].scan(/\ADelta\(second\),(.+?)\Z/).to_s.to_f time = 0.0 infile[2].scan(/Time\/div,\s?(\d+?)(ms|s)\/div/){ (measure, t) = $2, $1 if measure == 'ms' then time = t.to_f*10**(-3) else time = t.to_f end } io_out.print "#t, ch1, ch2\n" infile.each_with_index do |line, n| next if n < 43 (ch1, ch2) = line.scan(/^(.*?),(.*?)$/).flatten io_out.print((n.to_i-1)*delta, ", ", ch1, ", ", ch2, "\n") end }
正規表現が後ろに行くに従ってコピペで手抜きになっていくな(w
rubyは未だにモルモンしてるしユーザー・コミュニティー作るとか文章書ける奴もいないし永遠と無理な相談だな。 所詮はperlとどっこいw
>>817 それじゃ完璧じゃないの・・・
おれのとやってる事が全く同じなの・・・
あと、ファイルを読み込んで、そのままグラフに掃き出せたら
あのゆとりどもも少しは楽になるかなと思っている。
>>816 そこをどうにか。
自分もある意味ゆとりなので
>>820 お前は何を求めてここに来てるんだ
単に完璧なコードに書き直してほしいだけなのか
それともこの課題(?)を通してRubyの学習がしたいのか、どっちなんだ
>>822 後者です。だからローカル変数について、上のコードで説明を求めています。
require 'fileutils' FileUtils.mkdir_p 'tmp' Dir.foreach(".") do |filename| next unless filename =~ /^\d+?.csv$/i in_lines = IO.readlines(filename) delta = nil in_lines[4].scan(/^Delta\(second\),(.*?)\r\n$/) do |matched| delta = matched[0].to_f end in_lines = in_lines[43..-1] #42行目までを捨てる base = File.basename(filename.downcase, ".csv") open("tmp/#{base}.csv", "w") do |out_file| out_file.puts "#t, ch1, ch2" in_lines.size.times do |i| in_lines[i].scan(/^(.*?),(.*?)\r\n$/) do |matched| ch1 = matched[0].to_f ch2 = matched[1].to_f out_file.puts "#{i*delta}, #{ch1}, #{ch2}" end end end end
- 行末の表現は '$' のみで良い。'\r\n' を記述すべきでない。 - ファイル名の連結には File.join を使用する事。
828 :
デフォルトの名無しさん :2008/01/12(土) 20:57:24
CASEの使い方でとまどっています. 以下のコードを実行しても論理的に間違っているようで, 思った通りに条件分岐されません. $KCODE="SJIS" dat=["Alpha","ひらがな","漢字","カタカナ"] dat.each{ |str| p str case str when /\w.*/ p "英数" when /^[あ-ん].*/ p "ひらがな" when /^[ア-ン].*/ p "カタカナ" when /^[亜-].*/ p "漢字" end } また, when /^[あ-ん].*/ の記述が良くないらしく, 9: invalid regular expression: /^[\202\240-\202\361].*/ と言われます. どう修正したら良いんでしょうか?
>>827 「読めないコード」にすべきではないと感じる
学習レベルに合わせたスクリプトのほうがよいかと
$KCODE="SJIS" dat=["Alpha","ひらがな","漢字","カタカナ"] dat.each{ |str| p str case str when /^[あ-ん]+/s p "ひらがな" when /^[ア-ン]+/s p "カタカナ" when /^[亜-煕]+/s p "漢字" else p 'それ以外の何か' end }
>>830 アルファベットを無視するな(w
$KCODE = 'SJIS'
dat = ['Alpha', 'ひらがな', '漢字', 'カタカナ', '0123', 'ねこ大好き']
dat.each{ |str|
p str
case str
when /^[A-z]+$/s
p 'アルファベットのみ'
when /^[0-9]+$/s
p '数字のみ'
when /^[あ-ん]+$/s
p 'ひらがなのみ'
when /^[ア-ン]+$/s
p 'カタカナのみ'
when /^[亜-煕]+$/s
p '漢字のみ'
else
p '混合か全角英数字か記号'
end
}
>>827 どうして?特に前者。
だってそうしないと\rや\nも出てくる。
833 :
デフォルトの名無しさん :2008/01/12(土) 21:31:59
>>830-831 なるほど.漢字コードを明示すればいいのですね.
ありがとうございました.
>>833 いや重要なのはそこじゃない
というか漢字コードは明示しなくても、$KCODEに合わせてちゃんとマッチしてくれるはず
間違ってたのは正規表現の中身だ
835 :
827 :2008/01/12(土) 21:47:36
>>832 行末 '$' は改行 '\r\n' の前に位置するから上の場合は記述する必要が無い。
'\n' でも '\r' でも同じ。むしろ記述すると別環境で不具合に種になりうる。
>>835 もしこのプログラムで$の前に\rや\nがあるとすると、
この正規表現で取得出来るのは嘘になるのですが。
\nや\rが$より後ろにあるというのはさすがにないでしょう。
このケースでは問題ないけど、^と¥A、$と¥zの区別は理解しておくこと。
> [/$\r\n/, /\r$\n/, /\r\n$/].map{ |re| re === "foo\r\nbar" } => [false, true, false]
839 :
824 :2008/01/12(土) 22:15:09
>826 その通り。同じ事を書いた。 >823 はRubyを学習したいと言った。 同じ事を書いてるのにどうして違うコードになるか。 そして同じだけど違うコードを読み比べることで 「ここは読みやすくなった」「これはちょっとおかしい」など 存分に学習に生かして欲しいと願う所存。
840 :
デフォルトの名無しさん :2008/01/12(土) 22:16:57
お願いします。 RDEを使用しているのですが、ファイルopen出来なくて困ってます。 保存場所が間違えているのかと思い、RDEのリファレンスを見ました、同じことを質問している人がいましたが 「readfile.txtの保存場所はどこに?」という質問に対して返答がありませんでしたので、解る方教えて下さい。 何か根本的に間違えている所がありましたら、お手数ですがそこも指摘をお願い致します。
やばい涙目。 何やってるのかさっぱり分からない。
emacsでおk
ID表示がないと、どれが誰の発言なのかわかりにくくて困る
>>840 日本語でおk
netbeandsでおk
[いつもの場所] に保存されているとみんな思ってるから答えないんだよ
846 :
デフォルトの名無しさん :2008/01/12(土) 22:40:41
いつもの場所?
逆引きRubyがしぼんぬしてる
848 :
827 :2008/01/12(土) 23:06:05
>>836 >>835 は間違ってるね。ごめんなさい。でも
>>827 の方は訂正しないよ。
言いたい事は、不必要に環境に依存するコードを書くな、て事。
readlinesで読んだ文字列から 環境に依存せずに改行コードだけ 取り除く方法を教えてください
IO.readlinesを使うなっていう話なのでは?
UNIX環境だけを使えば万事解決
>>849 String#chomp
String#chomp!
Ruby1.8以降ならchompすれば問題ないな CRLFだろうがLFだろうがCRだけだろうが適当に取ってくれる
文字列項目中に改行が入ってるCSVなんかでも大丈夫ですか?
>>840 p Dir.pwd
で言われる場所からの相対パス
あるいは絶対パス
でreadfile.txtとやらの場所をopenに教える
859 :
デフォルトの名無しさん :2008/01/12(土) 23:41:52
rubyごときで威張っている人のがいるスレはここでしょうか?
威張っているように見えるんだろう
はい。ごめんなさい。
冬休みっていつまでだよ・・・
冬休みはどうかわからんが土日月と3連休なのは間違いないな
Web 2.0 はperlが頂いた!
867 :
デフォルトの名無しさん :2008/01/13(日) 01:16:05
>>857 できました!
親切な返答、ありがとうございます。
しかしまぁ、初心者スレだから当たり前なのかも知れんが凄まじいな・・・
いろんな板でクソスレ読むけど、ここが一番眩暈がするわ
java初心者すれはもっとスゴイ。
>>856 Rubyのオンラインのリファレンスマニュアルってめちゃくちゃ読みにくいし
時々落ちてて参照出来ないしページまるごと無くなってたりするし・・・
873 :
デフォルトの名無しさん :2008/01/13(日) 08:24:34
874 :
デフォルトの名無しさん :2008/01/13(日) 08:31:37
情報源は公式サイトしかないのかよ
公式以外の情報は参考にしかならん
公式サイトが糞ってるって話なんじゃないのか?
公式サイトのリファレンスマニュアルを一括ダウンロードしたものは なんで「メソッド一覧:」が無いんだぜ? Web版はあるのに・・・
シンボルになってないからだろ :メソッド一覧 にしてみ
>>877 htmlそのものは存在するが、リンクされていない(ページ下部のメニューが消えているため)
ディレクトリ内にある、やたらでかい「methodlist.html」がそれ
存在してたのか。 ずっとgrepしてたぞ。
881 :
878 :2008/01/13(日) 10:51:25
せっかく小粋なジョークで場を和ませたのに礼も無しかおまえら
882 :
デフォルトの名無しさん :2008/01/13(日) 13:29:01
>>840 他の人も書いてるけど,netbeansやemacs (winならMeadow)を使うのも一つの選択肢だな
RDEはRubyに特化しているんでいいっちゃいいんだけど
やっぱ,上の2つに比べて圧倒的にWebに蓄積された情報が少ないし
使っている人も少ないからレスポンスも悪いと思う.
Meadow + mswinRuby (one-click Rubyとか)だと
ソースアーカイブで配布されている.elそのままだと
rubydbで絶対パス指定ができないので,例えば,rubydb3x.elだと次のように書き換えること
30行目
(while (string-match "\032\032\\(\\([a-zA-Z]:\\)?[^:\n]*\\):\\([0-9]*\\):.*\n"
36から39行目
(cons (substring gud-rubydb-marker-acc (match-beginning 1) (match-end 1))
(string-to-number (substring gud-rubydb-marker-acc
(match-beginning 3)
(match-end 3))))
要するに,emacs側はファイル名と行番号の区切りを":"としているのが
Windowsの絶対パスだとドライブ文字の後の":"にマッチしてしまうので
ドライブ文字とファイル名を括ってグルーピング指定してやる
RDEはLinux/OSXで動かないからクソ
>>883 派外道。
おれはUbuntuでEmacs
RDEが使えたら使いたいが、無いからキレてる。
RDEは、USBメモリで設定ごと持ち運べないのがなぁ…… なぜわざわざレジストリを使うんだ そんな俺は今でもJmEditor使ってます
886 :
762 :2008/01/13(日) 15:53:54
>>763 ,765さん
返事が遅くなって申し訳ありません。全部//uに変えてみました。
そしたらきれいに変換を行ってくれました。
本当に助かりました。どうもありがとうございます;
よく考えたらRubyあんま関係なさそうなんだけど質問。 from と to というディレクトリがあって、from には a.txt が入ってます。 で、toディレクトリの中にa.txtというシンボリックリンクを作りたくて FileUtils.symlink('from/a.txt','to/a.txt') とやったところ、 $ ls -l to/ (中略) a.txt -> from/a.txt という正直なシンボリックリンクができていました。 あまり絶対パスで指定したくないですがなんとかなりませんか。
あーそれはやめとけ ディレクトリ跨ったシンボリックリンクは第1引数を絶対パスで指定するべし シンボリックリンクの仕様だと思って諦めれ
>>887 FileUtils.symlink('../from/a.txt','to/a.txt')
でいいんじゃね?
RMagickでフォルダ内の画像を一括変換するスクリプト作ったんだが、 こまめにGC.start呼ばないと、メモリ不足で落ちる。 そんなもんですかね。
落ちるのはバグなんじゃね? メモリが不足したら自動でガベコレしてくれないと意味ないじゃん
一般的には8割くらいの確率でスクリプトの書き方のほうに原因があるはず 「GCがヘタレだから落ちるんだよねー」ということは本当はかなり稀 極悪スクリプトの変態綱渡りをGCに無理やりフォローさせてる場合が少なくない 何らかのリソース使いっぱなしのスクリプト書いてないか
つーかまずはPCのメモリとスワップ領域とスクリプトのメモリ使用量調べろと
スクリプトのメモリ使用量って調べるの意外と難しいぞ 俺はtopコマンドをじーっと見るとかそういう退廃的な手段しか知らん
GCが管理できるのはRubyのオブジェクトだから、管理できない リソース使いまくるとRuby側では解放メソッドを確実に呼ぶ くらいしか手が打てないな。(IO#closeとか)
簡単に書くとこういうスクリプトな訳だけど、
each_file() do |f|
jpg = Image.read(f)[0]
jpg.resize!(1000.0/jpg.rows) if jpg.rows > 1100
jpg.write(f)
jpg = nil
GC.start
end
jpg = nil; GC.start が無いとしばらく走らせてるとこける。
RMagickは今日インストールしたんだけど、入れるまでに結構てこずったし
敷居の高さを感じずにはいられない……。
>>895 英文が長いのであとで読みます。でも有難う。
ImageMagickをシェルから呼んだほうが使い勝手いいよね
GC呼び出し → RMagickのfreeフック起動 → グラフィック用メモリ解放 って仕組みらしいが、RMagickで確保したオブジェクトはruby側で使用サイズと認識されないため RMagickで大量にメモリ使用されても、rubyは気づかずにGC呼びださないってことらしい プログラムが落ちるまでGC呼び出さないなんてアホすぎる
アホでごめーんね
RubyCocoaのコードが汚すぎてフイタ ぜんぜんラップされてねーじゃん
メモリの確保に失敗したときにGC呼んでるんじゃないの?
>>894 あるあるw
俺の場合はWindowsだから、タスクマネージャ開いて
ruby.exeのメモリ使用量をじーっと観察したりしてる
タスクマネージャのメモリ量は tail 出来るんだが
905 :
デフォルトの名無しさん :2008/01/13(日) 22:18:00
ruby内部で使われるxmalloc(ruby_xmalloc)は失敗したらGCが発生するけど、 RMagickの内部では単なるmallocを使ってるから失敗したら素直に落ちるってことかな?
普通にrubyのGCバグだろ。多量のファイル読み込みなんていつもある処理だし、ユーザーに負担をかけるようなインタプリタは不親切だよな。 ユーザーがtopを監視する必要があるとか泣けるw
いや大量のファイルを実際に処理してるのはRubyじゃないから
imagemagickの中か
>>905 RMagickでメモリ確保に失敗したらGC呼べばいいだろ
で、結局戦犯は誰なんよ
>>910 ふらっとでふらっと向きじゃない話をしてる奴等
Rubyへのポートの仕方が悪いんじゃないの?
rhtmlを色分けしてくれるエディタある?
プラットフォームは?
秀丸
vimはHTML部とERb部をそれぞれの文法で色づけてくれた。 あとTextMate。
918 :
913 :2008/01/14(月) 02:37:36
>>914 GentooをXfceで使ってるから、gtkで色分けしてくれるエディタないですかねぇ?
NetBeans使ってる人少ないンかね・・・
/変数文字列/ の形でpremature end of regular expressionを発生させる可能性のある、 文字列中の記号ってどれくらいありますか?
>>921 くだらないこと考えずに素直にマッチング文字列と正規表現の文字コード揃えろ
>>920 使い捨てコードしか書かないからいちいちプロジェクト作るのが億劫なんだよな・・・
>>906 なんでバカがこんなにえらそうなんだ?
ImageMagickのエラーはRubyと関係ないだろ
なんでこれがRuby GCのバグやねん
Ruby公式のマニュアルが未だに馬鹿だからだろう
>>919 いいね、これ。
今はgedit単体で開発してるけど、試してみようかな
927 :
デフォルトの名無しさん :2008/01/14(月) 18:38:31
arr = [1,3,2] arr.sort! のように各種メソッドを読んでarrを操作したときその変更をコールバック的に知る方法はないですか?
928 :
デフォルトの名無しさん :2008/01/14(月) 18:38:50
UTF16でテキストファイルを書き込むにはどうしたら良いでしょうか?
>>928 リファレンスマニュアル - 添付ライブラリ - 文字コード
>>927 汎用的にはDelegatorを使うんだろうけど。
class MethodLogger
def initialize(obj)
@obj = obj
end
def method_missing(method, *args, &block)
$stderr.puts "calling #{method}"
@obj.__send__(method, *args, &block)
$stderr.puts "returned from #{method}"
end
end
arr = [3, 2, 1]
arr = MethodLogger.new(arr)
arr.sort!
931 :
デフォルトの名無しさん :2008/01/14(月) 19:30:10
>>929 File.open(path,"w") { |f|
f.write(str.toutf16)
}
したんですけど化けちゃうんですよ.orz
よく調べたらbomが無いようで....
>>931 nkf コマンドのマニュアル(リファレンスマニュアルでは無い)を探しなさい
require 'nkf'
u16lnb = NKF.nkf('-S -w16L0',str) # SJIS->UTF16(LittleEndian/BOM無し)
933 :
デフォルトの名無しさん :2008/01/14(月) 20:24:33
マルチバイト文字を含む文字列の,n文字目からn文字目の文字列を 抜き出す場合,どんな方法でやりますか? String[n..n] と同等の処理です. String[n..n]だとバイト指定なのでマルチバイト文字だと位置がずれてしまいますので.
irb> s = 'まるちばいとABCです' irb> print s.split(//e)[5] と irb> print s.split(//e)[6] A irb> print s.split(//e)[5..6] とA irb> print s.split(//e)[5..7] とAB irb> print s.split(//e)[5..8] とABC irb> print s.split(//e)[5..9] とABCで
rubyとは結局その程度の言語なんです。でも国産なんでスw
>>897 >>899 Ruby関係なく、リソース開放などの処理するときはGCに依存しちゃダメだろwww
明示的に書かないと・・・
C#とかJavaとかでもそうだぜ?
C#で言えば、Disposeみたいなの
937 :
デフォルトの名無しさん :2008/01/14(月) 22:05:45
>>934 なるほど.splitを利用すればいいのですね.
ありがとうございました.
938 :
デフォルトの名無しさん :2008/01/14(月) 22:22:20
>>936 もはや何から突っ込んでいいのかわからない。
942 :
941 :2008/01/15(火) 09:34:22
・・・と流れで書いてしまったが、よくよく読むと
>>936 が正しかった。
Managed DirectXなんかのVGAメモリと一緒ってことだな。
駄レスすまそ。
944 :
デフォルトの名無しさん :2008/01/15(火) 11:24:25
RMagickがGC起動すればいいと思うんだけどなあ
確認だけど、Fileとかはデコンストラクタは明示的に呼ばなくても大丈夫だよね?
寿命によるかと 直後にスクリプトが終了すれば何も問題はない
openにブロック渡して、そん中で全部やればいいんじゃないんだっけ?
それするのめんどくさいって話なのでは
デコンストラクタってそもそも何、というか。 File (というかIO)のクローズは呼ぶべき。 リファレンスカウント方式ってわけでもないし。
950 :
デフォルトの名無しさん :2008/01/15(火) 14:07:29
なんでリファレンスカウント方式じゃなかったら呼ぶべきなの?
str = yyy があったとして、これをputとかで表示させたいのですが、 yyy (2秒) yyy (1.5秒) yyy (2秒) ・(1秒)・(1秒)・(1秒) ぴか〜ん!! って表示させたいです。()内の秒数はだいたいの感覚です。 こんなことするにはどうすれば良いですか?
ぴか〜ん!!ってなんだよw
sleep で間隔を開けて puts で表示すれば。 puts の出力はバッファリングされてしまうと思うので、 puts str; $stdout.flush とかやって flush する。
>>950 > なんでリファレンスカウント方式じゃなかったら呼ぶべきなの?
というか、逆かな。
リファレンスカウントなら、確実に参照が無くなった時点で回収されるはずだから、
確実に参照が無くなるように書いておけばおkではないかと思ったのだけど、変?
すみません、gem についての質問です。 gemで、あるパッケージAをインストールして、その際に依存関係のある別パッ ケージBもインストールされたとします。 その後、Bのバージョンを上げた場合、Aは依存関係が保証されなくなって使え なくなるのでしょうか?それともバージョンが上がっても、gemは依存関係が解 決されているものとみなすのでしょうか?
956 :
デフォルトの名無しさん :2008/01/15(火) 16:25:13
a = [ 1.0, 3.0, 4.2, 2.5 ] という Arrayに対して、 b = [ 0, 2, 3, 1 ] というsortした時の順位(index)をArrayにしてGETしたいのですが、 どのようにするのが簡潔で高速でしょうか?
aに全く重複要素がないと仮定して
irb> a
[1.0, 3.0, 4.2, 2.5]
irb> a.map{|e| a.sort.index(e)}
[0, 2, 3, 1]
>>955 多くの場合使えるが、Aで
「Bのバージョンはx.x.xかそれ以前限定でよろしこ」
と設定されてれば使えない。
つまりA次第。
>>936 Disposeと明示的な呼び出しは関係ないだろwww
あ、
>>957 はmapの中でaの要素の個数と同じだけaをsortするから、
a.sortを最初に変数に入れておいたほうがいいと思う
a = [ 1.0, 3.0, 4.2, 2.5 ]
sorted = a.sort
p a.map{|e| sorted.index(e)}
index使うよりもHashに順位を取っておいて a = [ 1.0, 3.0, 4.2, 2.5 ] h = {} a.sort.each_with_index{|e, i| h[e] = i} p h.values_at(*a) のほうが速かった
961 :
デフォルトの名無しさん :2008/01/15(火) 17:22:40
Thread.new(17)
$ time ruby with_index.rb real 0m8.506s user 0m8.450s sys 0m0.020s $ time ruby with_hash.rb real 0m0.199s user 0m0.160s sys 0m0.040s あー問題外問題外 indexで探すのに時間がかかってるんだな っていうかもしかしてindexはこういう用途に向かんのか?
俺はファイル読み込みは ロックしたい時や、馬鹿でかいファイル以外は IO.readlines で済ます 書き込みもある程度openブロックの中が小さくなるように書く
>>962 線形探索してるだろうから、要素数が大きくなってきたらダメなんじゃないかな。
965 :
デフォルトの名無しさん :2008/01/15(火) 21:01:32
>>954 なるほど
じゃあマーク&スイープだったらGCに任せておいたらいけないんだろうか
リファレンスカウント方式だと、参照が輪になっている(のでカウント!=0) 孤立しているオブジェクト群がそのまま残り続けるとかいう欠点が指摘され ることが多いけど、最近は改善されてるの?
>>966 Pythonはマーク&スイープを併用している模様
968 :
955 :2008/01/15(火) 22:29:15
>>957 > 多くの場合使えるが、Aで
> 「Bのバージョンはx.x.xかそれ以前限定でよろしこ」
> と設定されてれば使えない。
> つまりA次第。
すみません、大変遅くなりました。ありがとうございます。
私の場合、AはRailsであり、Bはいろいろあるのですが、どのように設定されて
いるか、どこを見ればわかるでしょうか?
なるほど、併用か。
>>968 $ gem dependency rails
Gem rails-2.0.2
rake (>= 0.7.2)
activesupport (= 2.0.2)
activerecord (= 2.0.2)
actionpack (= 2.0.2)
actionmailer (= 2.0.2)
activeresource (= 2.0.2)
970 :
955 :2008/01/15(火) 23:09:12
>>969 > actionmailer (= 2.0.2)
例えば actionmailer は2.0.2に固定で、もしバージョンアップしたら依存関係
が損なわれて、Railsが使えなくなる、という理解でよろしいでしょうか?
もしそうなら、かなり縛りはきついなあ。
Railsのパッケージは一式同時にリリースされるので、 バージョンがずれることは心配しなくていい。 また、依存関係は実際にrequireしようとした時点で問題になるので、 メール扱わないならconfig/environment.rbで config.frameworks -= [ :action_mailer ] としておけばよいだろう。
972 :
955 :2008/01/15(火) 23:41:08
>>971 それが、ちょっと都合がありまして、actionmailerだけ、バージョンを上げら
れないかと思っていたのです。
Railsからはメールを使わないことにして、
> config.frameworks -= [ :action_mailer ]
を実行しようと思います。
>>All
要領の悪い質問に、親切にお答えいただき、皆さん大変ありがとうございまし
た。
バージョン間の差がアプリの動作に影響しない箇所のものであれば、 rake rails:freeze:gemsでvendor/rails以下にrails一式コピーして、 コピーされたモノのうちactionmailerだけ別バージョンに差し替え。 バージョンチェックで引っかかったらチェックをうまいこと修正。 という手でもいけそうだな。
974 :
デフォルトの名無しさん :2008/01/16(水) 05:10:56
ERBで <img src="<%= hogehoge %>"> って書くのが気持ち悪いんだけど こういう書き方って普通なの?
どういう書き方ならいいの?
<img src="#{hogehoge}">
>>974 たぶん普通
俺は気持ち悪かったからAmritaやTenjin使ってる
979 :
デフォルトの名無しさん :2008/01/16(水) 09:35:10
>>957 >>959 >>960 ありがとうございました!!Hash使います。
indexだと値がかぶったときもつねに小さいほうの数字を返して統一性があるのですが、
Hashだと同じ値があったときに順位が不定なので、その時小さいほうを返す方ように
頑張ろうと思います。
がんばんなくても h = {} a.sort.each_with_index{|e, i| h[e] = i if !h[e]} ~~~~~~
>>979 >>980 そういう問題なの?
a = [1.0, 2.0, 3.0, 2.0]
h = {}
a.sort.each_with_index{|e, i| h[e] = i if !h[e]}
h.values_at(*a) # => [0, 1, 3, 1]
~ ~
順位つけるならそれでよくね?
じゃあ同値同位が何位ならいいんだ? という話だな。 1st| 1.0 2nd| 2.0 2.0 3rd| 3.0 と並べるか 1st| 1.0 2nd| 2.0 3rd| 2.0 4th| 3.0 と並べるか 1st| 1.0 2nd| 2.0 2.0 4th| 3.0 と並べるかはケースバイケースだと思う
984 :
981 :2008/01/16(水) 12:23:53
ふむ。んじゃあ題意が ambiguous だったのが悪かったってことで。
985 :
974 :2008/01/16(水) 12:53:00
>>977 Tenjinってのは初めて知りました
日本語の情報があまりないようですが結構使われているんでしょうか?
コレに関しては人柱は避けたいので枯れたものを採用したいんですが
気持ち悪いのを避けたいのか、枯れたものを使いたいのか、それが問題だ
987 :
974 :2008/01/16(水) 12:57:19
Tenjinのマニュアルを見た感じだと
>>974 に書いたような気持ち悪さはない
質問です。2つの文字のコマンドラインで入力された2つの文字列のレーベンシュタイン距離(編集距離)を求めたいです。 ただし、kakasiとtakasaは通常なら距離が2になるのですが、3にしたいです。 要するに母音に対して変換が行われたときのみ距離を2倍にしたいです。 できれば〜倍かはコマンドラインから指定できるとなお良いです。 扱う文字はaiuなどではなく、kakisuなど子音を含むものとします。nnやnya等も考えません。 つまり配列にいれるなら奇数のとこに必ず母音が入るというものです。 通常の距離を求めるコードは以下にソースはっておくので、どなたか改造、アドバイスお願いします。
class String def levenstein(other, ins=1, del=1, sub=1) # ins,del,subは重みつきコスト return nil if self.nil? return nil if other.nil? dm = [] # 距離行列 # 最初の行の値を初期化する dm[0] = (0..self.length).collect { |i| i * ins } fill = [0] * (self.length - 1)
お、おわりかよっ
うめ
なんか貼れない・・・もっかい
993 :
988 :2008/01/16(水) 17:33:21
続きです。 #重要な比較 dm[i][j] = [ dm[i-1][j-1] + (self[j-1] == other[i-1] ? 0 : sub), dm[i][j-1] + ins, dm[i-1][j] + del].min end end #行列の最後の値が文字列間のレーベンシュタイン距離となる dm[other.length][self.length] end u1 = gets u2 = gets yyy = u1.levenstein(u2) puts yyy #yyyが距離になります。 end よろしくお願いします。
うめ
うめ
1000なら1.9.1今月リリース
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。