[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 21:32 / Filesize : 199 KB / Number-of Response : 759
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 31



1 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 17:31:07 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
 なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

411 名前:デフォルトの名無しさん [2009/09/27(日) 22:13:48 ]
ログをまずは見ようぜ。
1.cgiに実行権限がついているかとか1.htmlの読み込み権限とかもチェックしような

412 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:15:53 ]
action=/usr/lib/cgi-bin/1.cgi っておかしいだろ… lighttpd とかにかかわらず
/usr/lib とか公開するとは考えにくいから action=/cgi-bin/1.cgi とかなんじゃないのか
この調子じゃ権限とかもだめそうだな

413 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:31:01 ]
>>396
RubyでCGIの勉強をするなら、lighttpdから始めるのはオススメしない
cgi.rbを使って、WEBrick上 or Apache上で動かしてみるとか
Sinatra使うとかしたほうがいい

414 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:40:09 ]
>>411
chmod 755はしてあります。

>>412
あ、cgi-binでいいんですね。フルパスにしちゃいました。
たしかに公開しないですもんね。

415 名前:デフォルトの名無しさん [2009/09/27(日) 22:52:59 ]
ファイルの所有者も確認しような
lighttpdを起動したユーザがownerだよな?

416 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:55:57 ]
式がnil, false, 0なら偽になるif文てないの?

417 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:06:09 ]
>>415
ファイルオーナーが、「root」ですね
lighttpdは、「www-data」が起動してます

sudo cpでファイルを/usr/lib/cgi-binにコピーすると
所有者が、ルートになってしまいます。

ちょっと、apacheや他のを調べてみます。みなさん、スレ違いに付き合って
くださって申し訳ありがとうございまsyた

418 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:18:45 ]
>>416
!x || x== 0

'' や [] や {} も偽にしたいならActiveSupport入れてblank? と present?
を使え。



419 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:23:03 ]
>>418
それだとnil, false, 0で真になるんだけど。偽がほしいんですが無理なんですか?



420 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:29:26 ]
x && x != 0
どんだけ応用力ないのかな…

421 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:33:29 ]
いかにも落とし穴がありそうだと漏れのアンテナが反応しております

422 名前:418 mailto:sage [2009/09/27(日) 23:35:35 ]
すまん逆転させるのわすれてた。てへ。



423 名前:デフォルトの名無しさん [2009/09/27(日) 23:49:22 ]
>>417
ファイルの権限を777にして実行してみな。
それで実行できれば権限関係の設定がおかしかったってことだ
linuxの基礎を勉強私的な。

424 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 10:48:55 ]
Digest::MD5.digest の値を hexdigest に変換する計算式を教えてください。

convert(Digest::MD5.digest(value)) == Digest::MD5.hexdigest(value)

となるようなconvert()です。
あるいはヒントでもいいのでお願いします。


425 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 10:59:18 ]
そのへんはさすがにマニュアルにも書いてあるだろ
> 与えられた文字列に対するハッシュ値を、ASCIIコードを使って 16進数の列を示す文字列にエンコードして返す。

ということで
irb> p Digest::MD5.digest('12345')
"\202|\313\016\352\212plL4\241h\221\370N{"
irb> p Digest::MD5.hexdigest('12345')
"827ccb0eea8a706c4c34a16891f84e7b"
irb> p Digest::MD5.digest('12345').unpack("H*")[0]
"827ccb0eea8a706c4c34a16891f84e7b"


426 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:12:25 ]
>>425
ありがとうございます。
1バイトずつ16進数に変換するということなので、こう理解しました。

irb> Digest::MD5.hexdigest('foo')
=> "acbd18db4cc2f85cedef654fccc4a4d8"
irb> Digest::MD5.digest('foo')
=> "¥254¥275¥030¥333L¥302¥370¥¥¥355¥357eO¥314¥304¥244¥330"
irb> Digest::MD5.digest('foo').unpack('C*') # 1バイトずつに分解
=> [172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c } # 16進数に変換
=> ["ac", "bd", "18", "db", "4c", "c2", "f8", "5c", "ed", "ef", "65", "4f", "cc", "c4", "a4", "d8"]
irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c }.join == Digest::MD5.hexdigest('foo')
=> true

なるほどー。
どうもでした。


427 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:26:36 ]
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
print $1
}

この状況で、$1や$2の情報を配列に入れるにはどうすればいいですか?
具体的にはこの後、$1の内容について一つ一つ処理をしていきたいんです。

428 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:39:11 ]
ary = []
Dir.foreach('hoge'){|filename|
filename.match(/(aaa)(bbb)/}
ary << [$1, $2] # もしくは ary << $1 << $2
}
p ary

429 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:47:13 ]
filename.scan(/(aaa)(bbb)/)



430 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:51:17 ]
>>428
「<<」ってこういうところで使うんですね。
勉強になりました。ありがとうございました!


431 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 00:50:52 ]
rubyを使ってgnuplotで簡単にグラフを書きたいんだけど、
何かお勧めありますか?

432 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 08:15:40 ]
h = YAML.load_file(path)
@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id']
@password ||= h[:pass]||h[:password]||h['pass']||h['password']

イライラ

433 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 12:52:20 ]
エディタから編集中のRubyのスクリプトを独立したウィンドウ、ターミナルで起動したい
エラーがあったらエディタがそれを取り込んでタグジャンプしたい
teeやら別のモジュールをrequireするのはなるべく避けたい
もちろんユーザーはputs/getsを制約なく使いたい

といううまいやり方ってないですか?
ようするにエラーが出たらそれだけをログファイルに書き込んでrubyは終了コード1を返したいです
標準エラーをファイルに書き込むようなファイルをこっそり-rするのが現実的なんですかね

434 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 13:06:42 ]
>>433
Emacs使え

435 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 13:10:50 ]
標準の ruby-mode で M-x run-ruby で Emacs 内に irb 開いて
M-x ruby-load-file → Enter すれば irb でファイルが実行されるな

エラー行ジャンプはどうしようか

436 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 14:56:39 ]
>>432
>h = YAML.load_file(path)
>@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id']
>@password ||= h[:pass]||h[:password]||h['pass']||h['password']

YAML使ってるなら、キーは文字列になるだろうから、Symbolは考えなくていいんじゃないかな。
YAMLでわざわざSymbolをキーに使うとは考えにくい。

@username ||= h['user'] || h['username'] || h['id']


437 名前:デフォルトの名無しさん [2009/09/29(火) 19:21:13 ]
1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
バージョンアップしようと計画していますが、どちらがお勧めでしょうか?

TwitterもRubyからScalaへ書き換えたりしていますので...

438 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 19:28:02 ]
問題ないならPHPのままにしておく

439 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 19:33:59 ]
scalaって日本でも実績あるの?



440 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:17:30 ]
1万PVって何かを説明してるように見えて、実際はまったく説明してないよなあ。
開設以来10年で1万PVなのか、毎秒1万PVなのか。

441 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:21:10 ]
>>434-435
特定のエディタの話はしてないんだけど…

442 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:22:53 ]
一応、単位としては1日か1ヶ月かのどっちかだな
1日1万PVならコンテンツによってはまあ普通
1ヶ月1万PVなら内容によっては閉鎖したほうがエコ
どっちにしてもPHPで動いてるならPHPで増強したほうがきっと楽だ

443 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:24:12 ]
>>441
だからEmacs使えって
どうせ使いもしないで脳内で考えてるんだろ

444 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:28:12 ]
エディタの布教は余所でやれ。

445 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:32:33 ]
求めること全部できるんだから仕方あんめえ
エディタとして動作するものではEmacs以外ではgvimかPeggyくらいしか心当たりがない
どう動作するのが効率いいかの研究もEmacsの動作見れば丸分かりだ

446 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:35:49 ]
特定のエディタじゃなくて何を求めてるんだ
どんなエディタでも連携して動く万能スクリプトが欲しいのか

447 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:38:44 ]
>>446
たぶんそうだと思う
エディタ内でシェルを起動するのでなければ
emacsclient みたいなシステムがないと無理だと思うんだけどね

というか、できないからこそ数十年かけて Emacs が M-x compile を進化させてきたのではないんかのう

448 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:43:52 ]
うん、Emacsのとか使ってれば「Rubyは特に関係ない」ということにすぐ気づけたはずなのに
コンパイラ等が異常終了コードをシェルに返してエラー行を標準出力などに表示さえしてくれれば用は済む

449 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:45:04 ]
$stderr.reopen($0 + ".errorlog")




450 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:54:21 ]
>>442
単純にPVって言ったら普通に日単位だろ
何この馬鹿

451 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:38:21 ]
>>437
>1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って
>バージョンアップしようと計画していますが、どちらがお勧めでしょうか?

どういう理由でバージョンアップしようとしているのかがわからないので、答えられる人はいないでしょう。
パフォーマンスが理由ならRoRはイバラの道だし、開発効率が理由ならLiftはイバラの道。
どちらの道を選んでもイバラの道だと思うので、PHPのまま改善することをお勧めします。
あるいはPythonを使ってGoogleAppEngineにするとか。これもイバラだな。


452 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:47:46 ]
railsは慣れてしまえば今までの開発が馬鹿に思えるぐらい楽になる

453 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:49:40 ]
日に1万PV程度なら、サーバ丸1台あればRoRでも余裕だよ。
下手するとキャッシュなしでもいけるくらい。

454 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 00:35:22 ]
そりゃ1日8万秒以上あるんだから言われなくても分かる

455 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 06:13:47 ]
結局ピーク性能が足りるかどうかだよな。

456 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 08:24:47 ]
そして既存のPHP+サーバではおそらく足りてるわけであって、
現時点で言えることは「じゃあPHPでやっとけ」にしかならんという

457 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 10:56:30 ]
でも結局ピーク性能が足りるかどうかだよ。

458 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 11:42:46 ]
おいちょっと待てよ、ピーク性能が足りてるかどうかが問題だろ

459 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 11:46:40 ]
WebProg板に帰れ



460 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:24:24 ]
1ヵ月1万PVwww

461 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:57:50 ]
いや、ここはピーク性能が足りるかどうかが肝だろ。

462 名前:デフォルトの名無しさん [2009/09/30(水) 18:46:43 ]
全角の数字を半角にしようと下記のフィルタつくったんだけど
変換されないで、元の値が戻ってくる。
何が間違ってるか教えてください。
使う文字コードはUTF-8です。

#全角数字を半角数字に変換するフィルタ
def zen_to_han_int(str)
    outstr = str.gsub(/0/,"0")
    outstr.gsub!(/1/,"1")
    outstr.gsub!(/2/,"2")
    outstr.gsub!(/3/,"3")
    outstr.gsub!(/4/,"4")
    outstr.gsub!(/5/,"5")
    outstr.gsub!(/6/,"6")
    outstr.gsub!(/7/,"7")
    outstr.gsub!(/8/,"8")
    outstr.gsub!(/9/,"9")
    return outstr
end


463 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:52:32 ]
>>462
str とスクリプトファイルの文字コードが合ってない
ごく一般的には str とスクリプトの正規表現リテラルの文字コードは同一にする

…あーつまりスクリプトのファイルが UTF-8 じゃないか str が UTF-8 じゃないか
あるいは ruby -Ku のような実行指定をしてないかどれか

464 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:53:19 ]
今はじめて気がついたけどメイリオって数字が全角と半角全く同じに見える。きめぇw

465 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:54:43 ]
def zen_to_han_int(str)
p "yes!" if /0/ =~ str
end

これで 0 を含む文字列渡したときに "yes!" と表示されなければ>>463

466 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:10:23 ]
むしろ、メイリオになってから、半角全角混同さんが気にならなくなりました ^p^

467 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:12:28 ]
やっとWindowsに標準添付された真の意味での表示用のフォントだからな
表示されるぶんには全角半角の区別がある意味は何もないわけで

つまり区別が必要な人は使ったら駄目よ

468 名前:デフォルトの名無しさん [2009/09/30(水) 20:25:22 ]
>>463-465
見直したら、スクリプトがS-JISでかかれてました。
$JCODE = "UTF-8"
ってやってもだめなのね

もうひとつ、お願いします。

#数字に変換できるか
def intrger_string?(str)
    begin
        Integer(str)
        return true
    rescue ArgumentError
        return false
    end
end

Rubyレシピブックのまるぱくりなのですが
3桁の先頭に0を含む文字列を渡すとfalseになる場合があります。
例えば078から099までのあいだとか
これも原因が良くわかりません。
どなたか教えてください。

469 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:30:25 ]
>>468
8進数



470 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:30:28 ]
該当メソッドのマニュアルくらい読め
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#Integer
マニュアル読んだ上でここがわからんとかそういう質問してくれ
どうせマニュアル読んで調べてる時間のほうが長いんだから、マニュアルの見方を勉強したほうが結局は得だ

471 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:18:02 ]
>>468
$JCODEってなんやねん

472 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:21:37 ]
>>468
0x1234 とかも渡してみろ。

473 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:47:46 ]
>>468
正規表現じゃだめなん?

del integer_string?(str)
 return str =~ /¥A¥d+¥z/
end

474 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:25:26 ]
>>469-470
お恥ずかしいです
下記のように書き直しました

def intrger_string?(str)
    if str.gsub(/\d/,"").size == 0 then
        return true
    else
        return false
    end
end

>>471
$KCODEの間違えです(´Д⊂

475 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:32:57 ]
>>473
それだと2/8/16進表記に対応してないから>>468とは別物になるぞ

476 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:56:18 ]
>>474

メソッド本体だが、ifの条件式が
成立したら(=false, nil以外を返ったら)true
成立しなかったら(=falseかnilが返ったら)false
を返すだけなので、その条件判定式だけでruby的には十分。

ところで str == '' のときはtrue/falseどっちになって欲しいのだろう?


477 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 08:49:38 ]
>>475
十進だけにしたいんだろ
/\A\d+\z/ =~ str が最善だと思う

478 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 11:28:02 ]
hoge= メソッドと hoge メソッドって、どっちが先に定義されてると自然?
reader があってから wiriter があるとわかりやすいよね?

479 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 14:25:42 ]
attr_reader :hoge
def hoge=(value)

でやるのが俺の定番
でも両方書くなら書きやすさ的にライタ側から書くかなあ



480 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:38:52 ]
ここの真ん中辺のコードなんですが
ttp://www.aoky.net/articles/why_poignant_guide_to_ruby/chapter-4.html

wordlist.rb
code_words = {
'スターモンキー' => '新帝国の神経質な閣僚のフィルとピート',
'カタパルト' => 'chuckyゴーゴー', '火炎瓶' => '暖房つきのリビング',
'ナイジェリア' => "Ny and Jerry'sドライクリーニング(ドーナッツ付き)",
'とどめをさす' => 'コンセントをさす'
}

require 'wordlist'

# 邪悪なアイデアを取ってコードワードと入れ替える
print "新しいアイデアを入力してください: "
idea = gets
code_words.each do |real, code|
idea.gsub!( real, code )
end

メソッドdoのブロック引数で、real, codeの二つが出てきます。
これはなんですか?意味がわからないです。。。

コピペで、rbファイルを2つ作って、下のコードをruby hoge.rbとして実行しても
想定通り動きませんし・・・

481 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:53:16 ]
>>480
こゆこと
これなんぞと思ったら出力して中身を見れ

code_words.each do |key, value|
puts "#{key} -> #{value}"
end

ナイジェリア -> Ny and Jerry'sドライクリーニング(ドーナッツ付き)
カタパルト -> chuckyゴーゴー
スターモンキー -> 新帝国の神経質な閣僚のフィルとピート
火炎瓶 -> 暖房つきのリビング
とどめをさす -> コンセントをさす

482 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:54:10 ]
だからそういう文法というか基本クラスのメソッドの使い方っぽいのは
マニュアルを一応眺めてから「ここの部分がさっぱりわからんおまえら親切に教えろ」とか言ってくれ
親切かどうかはともかくおおむね解説なりツッコミなりが入るからさ
ttp://www.ruby-lang.org/ja/man/html/Hash.html#each
> key と value を引数としてブロックを評価します。 self を返します。
{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}

# => [:a, 1]
   [:b, 2]



483 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:54:20 ]
doはメソッドではない。ではdoでなければメソッドは何でしょう?

484 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:59:00 ]
>>482
それはマニュアルを読むだけの力があるのに
手抜きして読まない人向けのお言葉

485 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:00:29 ]
>>483
do はブロック開始の(予約)文字列
メソッドに引数を渡すときの ( と ) それそのものがメソッドではないのとおおむね同じ理屈
文字列だからたまたま読めるだけで、別に <<<<<< >>>>>> でもよかった

486 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:06:57 ]
>>481
eachメソッドがハッシュに対して使われたときは、その引数は
|key,value|という形になるわけですね。

>>482
申し訳ないです。

>>483
481の結果からすると、each(すべての要素にたいして)do以下を行えという
ことだと思いますが、メソッドでないならdoはなんだろう。

487 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:14:30 ]
>>481
実行してみました。
undefined local variable or method `code_words' for main:Object (NameError)
というエラーが出ました。code_wordsが定義されていない?

488 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:20:19 ]
初心者が最初にwhyの感動的rubyガイドで勉強するのは
不適切だったりしますか?

489 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:44:46 ]
>>488
こっちのが無難
www1.tf.chiba-u.jp/~shin/tutorial/index.rb



490 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:56:55 ]
>>486
だから、doは予約語だってば。
ifがメソッドでないのと同じ。

491 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:12:37 ]
> >>483
> 481の結果からすると、each(すべての要素にたいして)do以下を行えという
> ことだと思いますが、メソッドでないならdoはなんだろう。

そのeachはなんですか?
すべての要素にたいして、というおまじないか何かですか?

プログラミング言語はそういうふわふわとしたものではないです。

492 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:21:35 ]
おまいら、ここは初心者スレだ。
初心者っつーのはとんでもない思い込みや勘違いをしていることも多いんだから
あたたかい目でみてください。

>>486
>メソッドでないならdoはなんだろう。

すでに指摘があるように、doは構文を表す予約語のひとつです。
while i < 10 do
 print i
end
では、whileやdoやendが予約語です。なおこの場合ならdoは省略可能。

[1, 2, 3].each do |x| puts x end
なら、each や puts はメソッド名、do と end は構文を表す予約語。

493 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:39:54 ]
do が何だかわかりませんレベルの人には来て欲しくないな
質問するなら最低限、言語の基礎は身に付けておいて欲しい
これくらいは自力で学習、調査しておくのが質問する側のマナーだろう

494 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:42:28 ]
そもそも、動作としては arr.each(ブロック) なんだよ
オブジェクト arr の インスタンスメソッド each に引数でブロックを与えている
ただ、便利なブロックがこのままだとたいそう使いにくいので

[1,2,3].each(do |e| p e endのブロック、ただし実行できるならこのブロックを要素ごとに実行すること)

といちいちテクニカルにする代わりに

[1,2,3].each do |e|
p e
end

と平易に書くように Ruby を作ったのだ
このへんの動作が気になるなら

my_block = lambda do |e|
p e
end
[1,2,3].each(&my_block)

とでも書いてみるといい

495 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:58:26 ]
>>493
思考過程の筋が見えるなら特に問題はないと思われ
まあ、つまりは「勝手に省略せず詳しく書け」ということでしかないわけだが
若干のエスパー能力が要るから万人には勧められない

496 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 19:29:15 ]
理解としては>>486でまったく問題ないのになんでこんなことになってるんだ

497 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 20:58:03 ]
申し訳ありません。whyのrubyガイドが
最初の方は、とてもわかりやすかったのです。

読み進めていると、コードが出てきて、ruby ファイル.rbと実行しても
エラーが出たりするようになり、僕はアホなのだろうかと思って質問しました。

初心者向けとして適当でないようなので、もうすこし文法を押さえながら
読んでみようと思います。ありがとうございました。

498 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:29:17 ]
>>493
>do が何だかわかりませんレベルの人には来て欲しくないな

おまえは>>1を声に出して10回よめ。
この程度が我慢できないやつはこのスレくるな。

499 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:41:55 ]
でも>>493程度が我慢できない人は2chに来るべきじゃないよね。



500 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:45:19 ]
せめてネタ系のスレで頑張ってもらえるとありがたいんだけど
そうもいかないんだろうね

501 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:48:12 ]
rubyに限らず初心者スレッドは全てを受け入れる糞溜だと思ってる

502 名前:デフォルトの名無しさん [2009/10/02(金) 05:22:34 ]
日本語の文字抽出でうまい方法が分からず困っています。

抽出元のサンプルは下記の通り
11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69
上記サンプルのうち、「この、文字列を抽出したいんdesu.」の部分を抽出したいんです。
抽出対象:日本語、句読点、日本語文字列に付随する半角英数字、半角記号("テスト."等。空白類を挟んだら不要対象とする)
不要対象:半角英数字、半角記号、空白、"○"、"×"等

現在のコードは下記の通り

while line=gets
if /\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*/ =~ line
if $1 != " "
print "日本語抽出:", $1, $2, $3,$4,$5,$6,"\n"
end
end
end

実行結果↓
日本語抽出:○ × ::この&カ字列を抽盾オたいん

(続きます)

503 名前:デフォルトの名無しさん [2009/10/02(金) 05:25:20 ]
(続き)

if文の条件が大変なことになっているのは
if /(\W+)/ =~ line
としてしまうと最初の"○ ×"のみ抽出して終わってしまうためです。
プログラムとして力技で美しくないのは分かっています。
また、日本語が文字化けしてしまっています・・・文字コードの問題だろうとソース先頭に#!ruby -Ksを足してみましたが、
空白類の扱いが変わった?のと記号以外の文字類が表示されなくなりました。

抽出部分を綺麗にするにはイテレータで回せば良いかなと思っています。
→一文字ずつチェックしようと思いましたが、String#each_byteが全半角を問題なく捌けるのか問題が・・・

問題をまとめると
1:文字列の中から上記抽出対象のみ抽出したいが、力技で汎用性がないので改善したい
2:文字化けしてしまうが原因、対策が分からない
となります。

OSはWindows XP SP3でRubyのバージョンは1.8.6です。

長文乱文で分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いします。

504 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 05:32:32 ]
まあrubyはメゾットの様なものが多いのも事実だけどな。
そこらの統一性の無さは、原理追求派よりも教祖信仰派のほうが多いってだけじゃないかと。
メゾットだからこうって寄りも、教祖がこう使う様に教えたから深く考えずに同じ様に使うのほうが、良いruby信者に成れる気がする。

505 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 05:36:40 ]
irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split[6]
この、文字列を抽出したいんdesu.

空白で区切られた7フィールド目という意味ならこれでいいのでは
フィールド内に半角空白が混じっても構わないという条件だととたんに面倒になるが

506 名前:503 [2009/10/02(金) 06:02:35 ]
>>505
レスありがとうございます。
すみません、確かにサンプルに限定すればそれで解決ですね。

ただ、やりたいのは日本語部分(日本語文字列に付随する記号類、英数字は抽出対象とする)の抽出なのです。
質問の書き方が悪かったのですが、おっしゃる通り、日本語列の中の空白、記号、英数字、
もしくは日本語列の先頭・末尾の半角英数字、記号類は抽出したいんです。
(日本語列と結合していない日本語以外(英数字、記号、空白類)は除外)

507 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 06:13:51 ]
結合ってなんだ?

508 名前:503 mailto:sage [2009/10/02(金) 06:21:11 ]
>>507
付随と同義です。ややこしくてすみません。
文字列の結ご・・・連結ですね。すみません。

509 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 06:46:02 ]
>>507
おそらく、セパレータとフィールドという概念がないんだと思う
だから、元データを作った人の意図を読むことができないし、説明もできてないから俺らもどうにもできん

たとえば、俺らは>>502を見たときに
「番号、マルバツ、マルバツ、英数字、時分秒、英数字、日本語入り文字列、年月日、時分秒、数字」
という空白で区切られた固定の何らかの意味を持った10項目(または年月日+時分秒の9項目)と読むが、
>>503にとってはおそらくそうではないのだろう
ひょっとしたら例示のために出しためちゃくちゃな文字の集まりなのかもしれない

空白の数には全く意味がなく、
形態素解析のように「空白で区切られた、日本語文字を含む文字の連なり」が欲しいのなら
split.find_all{|e| <eがShift_JISの日本語文字を含むということ> }
とすればよい
Shift_JIS (というかたぶん CP932)の日本語文字を含む条件を表す正確な正規表現はどっかから拾え

irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69"
irb> puts s.split.find_all{|e| /[\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]/n =~ e}.delete_if{|e| /\A[○|×|△]\Z/s =~ e}
この、文字列を抽出したいんdesu.




510 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 10:01:18 ]
>>503
>>509のようにsplitで配列にしてからfind_allでもいいし
文字列に繰り返し正規表現をしたいのならscanてのもある
Array,String,Hash,Enumerableあたりのメソッドは軽くリファレンスに目を通しておくといいよ
へぇこんなのあるんだっていう程度でも使う時に思い出せる

511 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 10:02:44 ]
-Ksを指定するとShift_jis全角文字も\wでマッチするようになる






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<199KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef