Ruby 初心者スレッド Part 16

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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
■前スレ
Ruby 初心者スレッド Part 15
http://pc11.2ch.net/test/read.cgi/tech/1193298175/

■関連スレ
Rubyについて Part 29
http://pc11.2ch.net/test/read.cgi/tech/1193668038/

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

【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/

【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/
3デフォルトの名無しさん:2007/12/08(土) 22:41:35
= 公式/非公式関連リンク

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

== Ruby使用時の調べもの
Rubyリファレンス
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)

リファレンスのHTMLヘルプ版配布
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利

Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide
http://www.ruby-doc.org/docs/ProgrammingRuby/
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
http://www.namaraii.com/rubytips/
4デフォルトの名無しさん:2007/12/08(土) 22:42:10
== Ruby使用時の探し物
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

RubyForge
http://www.rubyforge.org/
# 共にRubyのアプリやライブラリが検索できる

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

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

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

Ruby hotlinks 五月雨版 … Ruby関連の日記やblog
http://www.rubyist.net/〜kazu/samidare/

Rubyの本一覧
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2

<rubyXML/>
http://www.rubyxml.com/

Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
5デフォルトの名無しさん:2007/12/08(土) 22:43:05
6デフォルトの名無しさん:2007/12/08(土) 22:45:47
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/
7デフォルトの名無しさん:2007/12/08(土) 22:48:23
気が付いたら1000行ってたので、適当に立ててみた
テンプレのリンク先とかあんまり吟味してないけど、こんな感じでいい?
前スレ802のMoonwolf Wikiは使われてないようなので外した
8デフォルトの名無しさん:2007/12/08(土) 22:49:41
Q: Rubyの勉強をはじめようと思うのですけども、
  一からRubyをはじめる初心者向けのRuby入門書は何がお薦めでしょうか?

A: プログラ自体の初心者だったら「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
  他の言語経験があるんだったら「プログラミングRuby 第2版 言語編」
9デフォルトの名無しさん:2007/12/08(土) 22:57:47
初心者でWin XPで使用しています。
コマンドプロンプトに日本語を表示させるとエラーが出るのでchcp 65001したのですが、
今度はエラーは出なくなったのですが文字が表示されません。何が悪いのでしょうか?
フォントはMSゴシックにしています。
10デフォルトの名無しさん:2007/12/08(土) 23:00:23
>>9
質問の仕方
11デフォルトの名無しさん:2007/12/08(土) 23:05:21
さすがにどんなエラーが出たのか
どんなコードを実行したのかがナイトね〜
12デフォルトの名無しさん:2007/12/08(土) 23:36:48
>>1おつ
>>7 オッケーイ(AA略
13デフォルトの名無しさん:2007/12/09(日) 02:48:48
>>1
乙!
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
15デフォルトの名無しさん:2007/12/09(日) 12:11:07
>>9-10
すみません。入門のページに良くある

puts '日本語を表示します'

というのからはじめました。ファイル名はja.rb
これの日本語がSJISだと怒られるので

$KCODE = 'UTF8'
require 'kconv'
puts '日本語を表示します'.tosjis

とすれば日本語表示できました。

日本語表示が出来たので、今度はRSpecを使って日本語表示もやってみました。
その後試行錯誤した結果、どうもRSpecでもそれぞれtosjisを使わないとダメみたいでした。
でも記述量が多くてスマートじゃないので他にも方法がありそうだと思いました。
それでコンソールをchcp 65001してutf-8を書き出す方法を試してみることにしました。
ところが全く文字が書き出されないので困ってしまいました。英語の文字列すら書き出してくれません。
それで>>9を書き込みしました。エラーも全く出ていません。表示のみの問題です。
16デフォルトの名無しさん:2007/12/09(日) 12:50:27
Windowsよーわからんが、$KCODE='s' (uじゃなく)はだめなの?
17デフォルトの名無しさん:2007/12/09(日) 13:02:23
>>15
>>11で指摘されてるのにもかかわらず、どういうエラーに
なったのかを書いてないのは、本気でどうかと思うんだけど。
「これの日本語がSJISだと怒られる」とか不明瞭すぎ。

まあソースコードをShijft_JISで記述した場合は
c:\> ruby -Ks ja.rb
18デフォルトの名無しさん:2007/12/09(日) 15:59:17
rubyで初めて本格的な開発をしようと思うのですが、
おすすめのエディタやIDEがあれば教えてください。
以前はEmacs使ってたのですが、windowsに環境も変わりいっそ新しい環境を使おうと思いました。
コード補完機能が使えるような環境があればうれしいです。
19デフォルトの名無しさん:2007/12/09(日) 16:09:39
>>18
Windows限定でいいならRDE
20デフォルトの名無しさん:2007/12/09(日) 16:33:16
>>19
ありがとうございます。ちょっくら試してきます。
21デフォルトの名無しさん:2007/12/09(日) 16:35:12
SciTE Editorはどうよ
使ったことないけど^^;
22デフォルトの名無しさん:2007/12/09(日) 16:39:36
>>17
だからエラーは出てないの。
23デフォルトの名無しさん:2007/12/09(日) 16:44:39
>>18
Emacs使いならMeadowがいいんじゃないの?emacs-railsとか入れて使うとRDEより便利。
24デフォルトの名無しさん:2007/12/09(日) 16:44:45
>>21
Rails関係したエディタ?なんですかね。
RDEと比較して使いやすい方を選ぼうと思います。
25デフォルトの名無しさん:2007/12/09(日) 16:59:51
>>23
いやー、meadowも考えてたんですが、一から設定書き直すの面倒だなーと思って、
それならいっそ新しい環境でやろうかなと思ったんです。
ですが、RDEより便利なんだったらそっちのほうがいいかもですね。
ちょっとemacs-railsについて調べてきます。
26デフォルトの名無しさん:2007/12/09(日) 17:09:04
>>25
この辺を読んでMeadowに放り込んでみればいいと思う。

emacs-railsのまとめページ
http://www.ark-web.jp/sandbox/wiki/index.php?Ruby%20on%20Rails%2Femacs-rails%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

ECBのページ
http://ecb.sourceforge.net/

Snippetsについての情報
http://rubyist.g.hatena.ne.jp/yamaz/20060902

sql-modeについて
http://www.sixnine.net/roadside/sqlmode.html
27デフォルトの名無しさん:2007/12/09(日) 17:20:33
28デフォルトの名無しさん:2007/12/09(日) 17:38:55
今日、Rubyをはじめてみようと思ってチュートリアルみてがんばったんだけど、1.xと2.xって書き方か何か変わってるの?
エラーがでて実行できなくて、半日費やして、2日前に新しいバージョンになったばっかだと知ったむなしさ orz
29デフォルトの名無しさん:2007/12/09(日) 17:41:46
>>15
Rspecでgettext使えばいいんでないの
30デフォルトの名無しさん:2007/12/09(日) 17:41:59
>>28
どこかで等価演算なんかの値が変わったとは見たけど(すげーマニアックな場所)
実際書いたプログラム見せてみ?
31デフォルトの名無しさん:2007/12/09(日) 17:49:47
そもそも2.xなんてないぞ。
railsと混ざってないか?
3230:2007/12/09(日) 17:51:25
ごめん、1.8->1.9の変更と勘違いしてたわ。
33デフォルトの名無しさん:2007/12/09(日) 19:24:08
"20071111"という文字列を、"2007-11-11"という文字列にしたいと
思ってます。ParseDateを使う方法で書いているのですが、多量に
変換するので、一々ParseDateを呼び出すよりももっと別のやり方は
ないかとおもってます。(特に "#{hogehoge}"みたいに文字列の中で
できれば、、、)
どなたか、助けてください。
34デフォルトの名無しさん:2007/12/09(日) 19:34:56
文字列クラスを拡張してこんな感じとかどうよ
#動作確認はしてない
class String
 def hoge
  return "#{self[0..3]}-#{self[4..5]}-#{self[6..7]}"
 end
end

p "20071111".hoge #=> "2007-11-11"
35デフォルトの名無しさん:2007/12/09(日) 19:36:53
>>33
input="20071111"
output = "#{input[0,4]}-#{input[4,2]}-#{input[6,2]}"
puts output
36デフォルトの名無しさん:2007/12/09(日) 19:37:10
日付として正しいかどうかを考慮しないなら、parsedateするまでもなく、
ただ4文字、2文字、2文字で区切ればいいというわけだ。
37デフォルトの名無しさん:2007/12/09(日) 20:06:57
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さんのやり方も動くことは確認しました。
39デフォルトの名無しさん:2007/12/09(日) 20:18:48
string.cのrb_str_arefの定義を見ると、
添え字がFixnum、Regexp、String、Range以外の場合は数値化して
から使うようだ。
40デフォルトの名無しさん:2007/12/09(日) 21:25:54
オンラインの日本語で記されたピッケル本が読みたいが
置いてくれてたとしてもURI、場所がわかんねえ…
41デフォルトの名無しさん:2007/12/09(日) 22:15:17
a=Object1.new ってした後に
a=Object2.new ってするとどうなりますか?最初のほうは無視されますか?
42デフォルトの名無しさん:2007/12/09(日) 22:49:03
>>41
無視というか、「どの変数からも参照されていない」状態になる
43デフォルトの名無しさん:2007/12/09(日) 23:23:13
>>41
無視される、というかその記述はプログラマ(=>>41)が無視してるというような意味の
記述になるんじゃね?

>>42が言うようにどっからも参照されてないからじきGCされる。
44デフォルトの名無しさん:2007/12/10(月) 01:08:40
rubyが走るポケコンが欲しいなぁ・・・と思った今日この頃
45デフォルトの名無しさん:2007/12/10(月) 01:16:23
>>25-27
xyzzyの方がutf-8nで保存できるから便利だヨン。
Meadowのutf-8ではまらないようにね。
46デフォルトの名無しさん:2007/12/10(月) 01:25:44
>>44
ディスプレイにどの程度の仕様を求める?
さすがに 5x7 で 16 文字だと Ruby は辛いし (笑)
47デフォルトの名無しさん:2007/12/10(月) 01:34:58
俺もW-ZERO/3でrubyを走らせたい。
ちょっとした計算なんかを卓上で出来て便利だと思う。
しかし、金がない・・・orz
48デフォルトの名無しさん:2007/12/10(月) 08:25:02
>>44
最近の製品しらないけどLinuxザウルスにインストールとか
できるんだろうか?
49デフォルトの名無しさん:2007/12/10(月) 09:48:31
>>48
以前 Rails スレで、りなざうで RoR の開発をしてる香具師がいたような。
まありなざうをポケコンと呼べるかはともかくとして。
50デフォルトの名無しさん:2007/12/10(月) 12:34:23
Ruby/Tkって何か廃れてるように見えるんですが、実際の所どうなんでしょうか。
RubyでGUIプログラミングするなら今は何でやるべきですかね。
51デフォルトの名無しさん:2007/12/10(月) 14:02:31
scaffoldで作ったviewから別のテーブルのデータを参照したい時は、
どのように記述すればいいのでしょうか?
52デフォルトの名無しさん:2007/12/10(月) 14:20:50
あるクラスがインスタンス変数として別のクラスをもつことは可能ですか?
53デフォルトの名無しさん:2007/12/10(月) 14:25:22
>>51
Rails版へ。とりあえず2chに聞くのはどうかと思うよ。
54デフォルトの名無しさん:2007/12/10(月) 14:26:55
>>53
すいません どうしても分からないもので。
Rails板で聞いてみます。 
55デフォルトの名無しさん:2007/12/10(月) 14:39:43
>>52

Klass = Class.new
Klass.instance_eval{
 @other_class = String
}
56デフォルトの名無しさん:2007/12/10(月) 15:53:30
gem install cgialt
ERROR: While executing gem ... (OpenURI::HTTPError)
404 Not Found
57デフォルトの名無しさん:2007/12/10(月) 22:24:28
a=b.clone
とした後にaのインスタンス変数をいじって、また
a=b.clone 
ってすると、どうなりますか?
aは最初にa=b.cloneとしたときと同じ状態ですか?それとも、いじった後と同じですか?
58デフォルトの名無しさん:2007/12/10(月) 22:27:00
>>57
其処まで書いてなんで試さないの?
59デフォルトの名無しさん:2007/12/10(月) 22:30:46
同じ状態
60デフォルトの名無しさん:2007/12/10(月) 22:34:25
同じ状態ってのは正しい表現ではないな。
同じものを指している。
61デフォルトの名無しさん:2007/12/10(月) 22:51:23
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]

こんな感じ?
62デフォルトの名無しさん:2007/12/10(月) 23:03:47
代入(=)したりclone(dup)したりするたびに、a.object_idやb.object_idを
プリントしてみると理解の助けになるかもね。

63デフォルトの名無しさん:2007/12/10(月) 23:28:16
Kernel#catch( :hoge ) とかするときに、:hoge がどこで throw されたかを簡単に知る方法ってあるでしょうか?
たとえば、スタックトレースが取れればうれしいです。
64デフォルトの名無しさん:2007/12/10(月) 23:41:49
俺リナザウルスにRuby入れて走らしてたよ
65デフォルトの名無しさん:2007/12/10(月) 23:44:25
throwの第二引数(省略時はnil)がcatch全体の返値として得られるよ。
66デフォルトの名無しさん:2007/12/10(月) 23:53:59
ipod touchでRubyが走るなら即ポチクリするんだけどなぁ
67デフォルトの名無しさん:2007/12/10(月) 23:56:27
ポチクリって何?
68デフォルトの名無しさん:2007/12/10(月) 23:57:36
プチクリっとネットで買うことだべ
69デフォルトの名無しさん:2007/12/11(火) 00:28:17
>>56
直ってるね。
rubyforgeはちょくちょく不調になるんだよなー。
70デフォルトの名無しさん:2007/12/11(火) 01:04:08
rubyを勉強したいと思ってるんですが、
どうやってrubyを使えるようにするのか良く分かりません。
とりあえず、テンプレのほとんどが見れないんですけど、どうすればいいんですか?

OSはXP、rubyのホームページからファイルをダウンロードしたんですが、
それからどうすればいいのか分からない状態です。
71デフォルトの名無しさん:2007/12/11(火) 01:07:48
何処のなんのファイルをダウンしたんだ?
そのファイルを実行はしたのか?
72デフォルトの名無しさん:2007/12/11(火) 01:39:41
>>70
ttp://jp.rubyist.net/magazine/?FirstStepRuby

テンプレ整理したほうがよさそうだね。
73デフォルトの名無しさん:2007/12/11(火) 02:22:31
>>71
ttp://www.ruby-lang.org/ja/
のダウンロードの項目から落としました。


>>72
ありがとうございます。
見てみます。
74デフォルトの名無しさん:2007/12/11(火) 03:53:03
>>73
Windowsなら>>72に書いてあるActiveScriptRubyがお勧め
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
インストールしてメニューから「ruby console」を実行。
RDEも入れておくと吉
http://homepage2.nifty.com/sakazuki/rde/
75デフォルトの名無しさん:2007/12/11(火) 06:56:23
>>73
自分はワンクリックインストーラをお勧めするなぁ
デフォルトのインストール先が好みじゃないし(Windowsの流儀ではここが適当なんだろうけど
専用コンソールを使うってのも嫌だ

One-Click Ruby Installer for Windows
ttp://rubyinstaller.rubyforge.org/wiki/wiki.pl
76デフォルトの名無しさん:2007/12/11(火) 10:08:37
>>75
専用コンソールってなに?
ruby console ってのはあるけど、これPATHを通してからコマンド
プロンプト呼んでるだけにしかみえないんだけど。
大仰な言い方するから、思わず調べに行ってしまったじゃないか。

これをどうしても使う必要があるわけでもないし、
一体何が不満なのかさっぱりわからん。
77デフォルトの名無しさん:2007/12/11(火) 10:16:59
>>73
俺はmswin32版rubyの手動インストールをお奨めする
http://www.garbagecollect.jp/ruby/mswin32/ja/
78デフォルトの名無しさん:2007/12/11(火) 13:19:57
無理にみんなでバラバラのものを勧めなくてもいいから…

俺はmingw版の手動インス(ry
79デフォルトの名無しさん:2007/12/11(火) 14:22:37
全部入れたらいいさ
80デフォルトの名無しさん:2007/12/11(火) 14:47:07
折角だから、俺はこの赤いアイコンをインストールするぜ。
81デフォルトの名無しさん:2007/12/11(火) 16:04:31
amazonで評判が良いようだったので「達人プログラマーガイド プログラミングRuby」
(兎の表紙のやつ)を買ったんですが、なんか読みにくい。。。
コード例にはまだ説明されてない文法がバンバン出てくるし、
「なんか新しい用語(xxxページからの説明を参照)」とかも多い(xxxページはずっと先のページ)
まだページにして3割ぐらいしか読んでないんだけど、コード例の間違いもちらほら見つけた。。。
失敗したかなぁ、、、RubyWayも一緒に買ったんだけどこっち読み進めたほうがいいかな。。。
82デフォルトの名無しさん:2007/12/11(火) 16:26:01
古い本買っちゃダメ
83デフォルトの名無しさん:2007/12/11(火) 17:53:04
>>81
プログラミングRubyが読みにくいなら
Ruby Wayはもっと理解不能だと思う
84デフォルトの名無しさん:2007/12/11(火) 18:23:05
RubyWayは初心者用じゃないくね?
8581:2007/12/11(火) 18:48:28
>>82
ですよね。。。後から「プログラミングRuby」が後継の本らしい、と知りました。
表紙かなり違うんだもんなぁ。

>>83-84
すみません、いちおうJavaとPerlが分かるのでRubyWayでもいいかなーと。
先にRubyWayを触りだけ読んでたんですが(兎本は後から届いた)、そんなに悪い気は
しなかったです。情熱的。

とにかく兎本は「これは後で説明する」とか、一切説明してない用法をいきなり使って
断りなし、とか、そんなのが多すぎて疲れました。

先にこのスレで質問すればよかったなぁ…
86デフォルトの名無しさん:2007/12/11(火) 19:53:31
ttp://rubyde.sourceforge.net/hiki/ja/japanese_setting.html
{{attach_view('rde_translation.jpg')}}とか表示してくれえ
wikiでもバージョンアップしたんかなあ
87デフォルトの名無しさん:2007/12/11(火) 20:01:34
>>85
確かにRuby Wayの情熱はすごいw
図書館であの本を手に取ったのが、俺のRubyとの出会いだったな
88デフォルトの名無しさん:2007/12/12(水) 03:02:21
質問させてください。
以下のスクリプトを実行しました。
$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
8988: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">, 
なってしまいます。
9088:2007/12/12(水) 03:04:47
どう修正すれば期待する結果がえられるのでしょうか?
ご教授ください。
当方の環境
ruby 1.8.6 (2007-06-07 patchlevel 36) [universal-darwin9.0]
OS mac leopard 10.5.1
91デフォルトの名無しさん:2007/12/12(水) 03:13:04
JavaとかC++使ってた自分がわかりやすいRuby入門サイトありますか?
Javaとの比較なんかがまとめられたページがあるとありがたいんですけど。
92デフォルトの名無しさん:2007/12/12(水) 03:16:57
>>91
「java Ruby」でググレば腐るほど出てくるだろ・・・
93デフォルトの名無しさん:2007/12/12(水) 03:18:48
>>88
initialize() でインスタンス変数に代入してる箇所の行末のカンマを取ってみれ
94デフォルトの名無しさん:2007/12/12(水) 03:21:18
>>92
なかなかまとまったサイトが見つからなかったので、そういうのを集約したサイトがないかと思ったのですが、
もうちょっと根性入れて探してきます。
95デフォルトの名無しさん:2007/12/12(水) 03:28:06
>>94
つーかさ、経験者ならrubymanjp.chmで十分じゃね?
96デフォルトの名無しさん:2007/12/12(水) 03:34:06
>>95
実はかなり前に一度本を読んでまして、しばらくすれば感覚が掴めると思うんですが、
一からマニュアルや本を読むよりJavaとの差異がまとめてあれば一目瞭然かと思い・・・。
とりあえずマニュアルでも流し読みして思い出すことにします。
97デフォルトの名無しさん:2007/12/12(水) 03:41:43
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デフォルトの名無しさん:2007/12/12(水) 15:45:42
Rubyでは正規表現オブジェクトというものがあります
raddr = "^(\d+)\.(\d+)\.(\d+)\.(\d+)$"
regexp = Regrexp.new(raddr)
if regexp =~ "192.168.0.1"
puts "まっち"
end

リファレンス: google ruby regexp(本家が503エラーの時はキャッシュをみてくれ)
http://www.google.com/search?hl=ja&client=opera&rls=ja&hs=GDL&q=ruby+regexp

標準添付ライブラリ紹介 【第 12 回】 正規表現 (1)
http://jp.rubyist.net/magazine/?0019-BundledLibraries
#以下引用
| Regexp.new("\\n")
| Regexp.new('\n')
| Regexp.new('\\n')
| などです。 この 3 つは文字列リテラルの書き方の違いだけで、
| 「Regexp.new」の引数に渡るオブジェクトの内容は同じです。
101デフォルトの名無しさん:2007/12/12(水) 16:16:08
>>100
コード晒すのはいいが、せめてテストしてからにしてくれ。初心者相手ならなおさら。

raddr = "^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$"
regexp = Regexp.new(raddr)
if regexp =~ "192.168.0.1"
puts "まっち"
end
102デフォルトの名無しさん:2007/12/12(水) 16:22:14
>>101
すまんすまん
1行目の文字列はシングルクォートで囲ってちょ

raddr = '^(\d+)\.(\d+)\.(\d+)\.(\d+)$'
p egexp = Regexp.new(raddr)
if regexp =~ "192.168.0.1"
puts "まっち"
end
103デフォルトの名無しさん:2007/12/12(水) 16:29:48
それ、実際に動かしてみた?「まっち」って表示される?
あと正規表現はリテラルで生成するのが普通だし
^ と $ の意味も間違って理解してるように見えるよ
104デフォルトの名無しさん:2007/12/12(水) 16:41:13
>>102
>p egexp = Regexp.new(raddr)
これで表示されるわけねえw
だからちゃんと晒す前にテストしろと

>>103
>^ と $ の意味も間違って理解してるように見えるよ
kwsk
105デフォルトの名無しさん:2007/12/12(水) 17:09:10
>>103
> あと正規表現はリテラルで生成するのが普通だし

元の >>99 の質問は読んだ?
106デフォルトの名無しさん:2007/12/12(水) 18:08:32
99です。
>>101-102
これこそ私が探していたコードです。
正規表現オブジェクトって便利ですね。
>>100-102さんご教授ありがとうございました。
107デフォルトの名無しさん:2007/12/12(水) 18:22:26
>>98も考えてください
108デフォルトの名無しさん:2007/12/12(水) 18:54:54
piyoの中でhogeを呼び出してください
109デフォルトの名無しさん:2007/12/12(水) 19:07:12
AspectR と言いたいところだけど、そもそも何をしたいのか知りたいところ。
110デフォルトの名無しさん:2007/12/12(水) 19:22:06
>>107
109も言ってるが、実際に何がやりたいのかが分からんとなんともいえない
111デフォルトの名無しさん:2007/12/12(水) 19:59:41
>>98
Y.module_eval("
alias piyo_old piyo
def piyo()
hoge()
piyo_old()
end
")
y.piyo()
#"HOGE"
#"PIYO"
とでもするのかな。
要するに元のpiyo()に別名を付けて避けておいて
元のpiyo()とhoge()を呼ぶ新しいpiyo()を作る。
11298:2007/12/12(水) 20:55:34
要はXを継承したクラスのいずれかでpiyoが呼び出されたことを通知したいが
piyoを実装する側はそんなことを気にせずに本来の処理だけを実装すればいいようにしたい
113デフォルトの名無しさん:2007/12/12(水) 21:02:10
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
114デフォルトの名無しさん:2007/12/12(水) 21:03:59
策士策に溺れる・・・

・・・そんなこと無いかな
115デフォルトの名無しさん:2007/12/12(水) 21:04:20
苦しい
116デフォルトの名無しさん:2007/12/12(水) 21:11:44
>>112
聞いた限りでは、本当にそんなテクニックが必要なのかどうか疑問に感じる
素直にpiyoの中でhogeを呼ぶか、superを使った方がいいんじゃない?

そもそも不可能な気もするしな
117デフォルトの名無しさん:2007/12/12(水) 21:21:57
>>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アドレスにマッチするかの判定としては不適。
118デフォルトの名無しさん:2007/12/12(水) 21:29:02
>>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
119デフォルトの名無しさん:2007/12/12(水) 21:54:17
ビジターパターン?
12088:2007/12/12(水) 22:00:48
>>93
希望する動作になりました。
これはカンマをつけると配列として処理されてしまうのですね。
本当にありがとうございます。
12198:2007/12/12(水) 22:01:59
>>118
おお
Rubyっぽいトリックを使わなくても普通にこれでいけそうですね
ありがとうございました
122デフォルトの名無しさん:2007/12/12(水) 22:06:23
そんなんでいいのかw
123デフォルトの名無しさん:2007/12/13(木) 00:15:08
>>118
この挙動が理解できん・・・。
なぜ、X#hogeが呼ばれるのか…?
124デフォルトの名無しさん:2007/12/13(木) 00:16:32
>>123
なぜ、って、どう見てもX#poyoの中で呼んでるじゃん。
125デフォルトの名無しさん:2007/12/13(木) 00:23:32
ごめん、解釈をまちがった。

Y.new しているから Yのインスタンスなのに、なぜY#poyo じゃなくて、X#piyo が呼ばれるのか分からん。
126デフォルトの名無しさん:2007/12/13(木) 00:28:11
ああ、わかった。自分の勘違い。
piyo と poyo のスペルの違いに気がついてなかった。
普通に、hoge, fugaとかfoo, bar, bazにしてくれよ。
127デフォルトの名無しさん:2007/12/13(木) 00:32:40
>>126
ごめん、レスしたあとに気が付いたけど、なんかポヨがずっと頭んなかあったもんだからw
128デフォルトの名無しさん:2007/12/13(木) 00:36:01
名前重要とか、そこらへんの話
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]
130デフォルトの名無しさん:2007/12/13(木) 13:29:29
>>129
一文字とか短い文字列だと NKF の文字コード自動判定がうまく動かないと思うので、
NKF.nkf('-Ws', a) みたいに入力文字列のエンコーディングを明示的に指定します。
131デフォルトの名無しさん:2007/12/13(木) 13:32:07
ソースコードの文字コードは?
ソースコードの文字コードを ruby -K? で指定。
nkf -Ws のように変換元の文字コードを nkf に指定。

を確認してみてください。
132デフォルトの名無しさん:2007/12/13(木) 13:48:58
というか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"]

一連の漢字を生成したいのですが,期待した結果を得られません。
期待しているのは
["ソ","噂","浬","欺","圭","構","十","申",....]
です。
アドバイスください。
134デフォルトの名無しさん:2007/12/13(木) 17:31:45
>>133
pack を使うと良いかも。

#!/usr/local/bin/ruby -Ks
chars = Array.new
start = 0x83
start.upto(0x99){|num|
chars << [num, 0x5c].pack("CC")
}
p chars
135デフォルトの名無しさん:2007/12/13(木) 17:48:11
>>134
ありがとうございました。
(packが実のところよく解ってはいないのですが,
中身は解らなくても,とりあえず結果を得られたので,,,^^)
136デフォルトの名無しさん:2007/12/13(木) 20:17:34
C++で作ったプログラムのテストをRSpecでやるのは
C++で作ったプログラムのテストをC++でやるより楽になるでしょうか。


137デフォルトの名無しさん:2007/12/14(金) 20:10:37
rubyをダウンロードして解凍もしたんですが
autoexec.batのPATHのところで手間取ってます
頼みにしていたHPが見れなくなっているので困っています
なんて書き加えればうまくいくんでしょうか?

rubyは C:\rubyに解凍してあります
138デフォルトの名無しさん:2007/12/14(金) 20:16:15
139デフォルトの名無しさん:2007/12/14(金) 20:28:36
使っているOSがXPではなくて98SEなせいか
この方法では出来ないみたいです
140デフォルトの名無しさん:2007/12/14(金) 21:44:07
>>139
いろいろな意味でOS乗り換えたほうがいい。
141デフォルトの名無しさん:2007/12/14(金) 21:54:40
142デフォルトの名無しさん:2007/12/14(金) 23:22:19
クラス定義(中のメソッド定義)の中で、そのクラス自身のインスタンス生成できますか?
143デフォルトの名無しさん:2007/12/14(金) 23:40:14
self.class.new()
144デフォルトの名無しさん:2007/12/15(土) 10:14:16
>>137
 自己解決しました
145デフォルトの名無しさん:2007/12/15(土) 18:40:34
文字列の最後の1文字を削るにはどうしたらいいですか?
146デフォルトの名無しさん:2007/12/15(土) 18:46:47
>>145

>> x = 'abcde'
=> "abcde"
>> x.chop!
=> "abcd"
>> x[-1,1]=''
=> "abc"
>> x = x[0..-2]
=> "ab"

いろいろあるよ。

147デフォルトの名無しさん:2007/12/15(土) 21:05:38
ありがとうございました.
chopでうまくいきました.
148デフォルトの名無しさん:2007/12/15(土) 21:18:16
>>146
どれも最後の1バイト削ってるだけじゃねーか
149デフォルトの名無しさん:2007/12/15(土) 21:48:34
最後の1バイト削る方法教えてください
こうすればいいよ
どれも最後の1バイト削ってるだけじゃねーか
っていう
150デフォルトの名無しさん:2007/12/15(土) 21:58:25
Pythonとかのリスト内包表記が便利過ぎてRubyでも使いたいのですけど
なんとかならないですか
151デフォルトの名無しさん:2007/12/15(土) 22:05:59
>>150
リスト内包表記ってどんなんだっけ?
152デフォルトの名無しさん:2007/12/15(土) 22:21:23
こんな感じのやつ(イメージです)

evens = [ n in (0..10) if n % 2 ]

=> [0, 2, 4, 6, 8, 10]
153デフォルトの名無しさん:2007/12/15(土) 22:37:43
その程度だとRubyだとこんな感じ?

evens = (1..10).select{|n| (n % 2).zero? }

長さはちょい長いぐらい?
154デフォルトの名無しさん:2007/12/15(土) 22:43:16
>>152
正直無理じゃない?アレは結構python独特のものだから、rubyの側で実装してもらわないと。
155デフォルトの名無しさん:2007/12/15(土) 22:49:43
いや、そういう風にかけば等価なのはわかりますけど、
リスト内包は数学っぽくてわかりやすいのです。

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してそれっぽいことやってる人がいるのを見かけた
のでそれで我慢することにはしますが。
156デフォルトの名無しさん:2007/12/15(土) 23:08:57
generatorでうまくかけないものだろうかねぇ。
evens = Generator.new {|g| n = 0; loop { g.yield(n); n += 2} }
157デフォルトの名無しさん:2007/12/15(土) 23:25:05
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

などと書いてみてから、無限である必要がないことに気づいた。
158デフォルトの名無しさん:2007/12/15(土) 23:26:49
なんか手が勝手にtを付け足していたらしい。
eventsじゃなくてevensな。
159デフォルトの名無しさん:2007/12/16(日) 03:20:32
>>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だとちょっと悩む。
160デフォルトの名無しさん:2007/12/16(日) 10:14:29
1.9で 0.step(1.0/0.0, 2) ってできなかったっけ?
161デフォルトの名無しさん:2007/12/16(日) 12:02:35
正規表現で、マッチしたらfalseを返して欲しいときに
/hoge/ =~ string ? false : true
こんな事してみたんだけどもっと幸せな方法はありますか?
162デフォルトの名無しさん:2007/12/16(日) 12:06:31
not /hoge/ =~ string
163デフォルトの名無しさん:2007/12/16(日) 12:18:43
/hoge/ !~ string
164デフォルトの名無しさん:2007/12/16(日) 12:58:21
ありがとう
リファレンスの正規表現の頁に書いてくれないとワカンネ・・・
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 でチャッチした例外を、上と同じ形式でログファイルに書きたい。
166デフォルトの名無しさん:2007/12/16(日) 19:28:44
これで同じにはなる。

bt = e.backtrace
puts("#{bt[0]}: #{e.message} (#{e.class.to_s})")
1.upto(bt.length - 1) { |i| puts("\tfrom #{bt[i]}") }
167デフォルトの名無しさん:2007/12/16(日) 19:30:48
って、これは 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 - あいうえお かきくけこ さしすせそ

という風に日本語で出力するにはどうしたらいいですか?

170デフォルトの名無しさん:2007/12/16(日) 22:18:07
> 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 を使ってないか
171デフォルトの名無しさん:2007/12/16(日) 22:24:06
いえ.書いたとおりです.

環境は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
172デフォルトの名無しさん:2007/12/16(日) 22:28:04
目的は,配列の文字列をすべてファイルに出力することです.
なるべくループで回したりせずに1行で書きたいと思います.

それができればいいので,他の方法があればよろしくお願いします.
173デフォルトの名無しさん:2007/12/16(日) 22:38:38
>>172
Array#join
そういう用途のときには、Array#to_sはあまり当てにしないほうがいい
174デフォルトの名無しさん:2007/12/16(日) 22:42:52
a.to_s は

あいうえおかきくけこさしすせそ

にならなければならないんだが…
まあとりあえず、配列を書き出す際は適当な区切り文字でjoinさせて文字列にするのが普通

irb> puts "array - #{a.join(',')}"
array - あいうえお,かきくけこ,さしすせそ
175デフォルトの名無しさん:2007/12/16(日) 22:43:00
>>168
README.EXTとREADME.EXT.ja
組みこみ例としてはmod_rubyとかvimとかmfiler2とか。
Pythonほどドキュメントが充実してないけどそう難しくない。
176デフォルトの名無しさん:2007/12/16(日) 22:45:24
Array#to_sは1.9から#inspectじゃなかったかな
少なくともうちのruby 1.9.0 (2007-07-09 patchlevel 0) [i386-mswin32]だとそうだ
177デフォルトの名無しさん:2007/12/16(日) 22:49:14
ていうか初心者スレの人間が1.9なんて使うなよ
あれは1.8を理解した人間が使うものだ
178デフォルトの名無しさん:2007/12/16(日) 22:49:20
また1.9か。初心者は1.8使いましょう。
179デフォルトの名無しさん:2007/12/16(日) 22:53:15
>>173-4
joinでうまくいきました.
ありがとうございました.
180デフォルトの名無しさん:2007/12/16(日) 22:58:19
>>179
今すぐ1.9をアンインストールして1.8.6をインストールしろ
今すぐだ

1.9は速いだあ?
お前が使ってるうちはどんなスクリプト言語より処理は遅いよ
181デフォルトの名無しさん:2007/12/16(日) 22:58:58
なんでけんか腰なのかわからんw
182デフォルトの名無しさん:2007/12/16(日) 23:03:57
テンプレに「初心者は開発版を使うな」って書いておくべきだな
183デフォルトの名無しさん:2007/12/16(日) 23:04:34
すくなくとも初心者のスレで1.9の話題はナシだろ。
184デフォルトの名無しさん:2007/12/16(日) 23:05:35
>ていうか初心者スレの人間が1.9なんて使うなよ 
>あれは1.8を理解した人間が使うものだ 

え.そうなんですか?
何も考えず最新版を入れてました.
1.9は言語仕様の変更とかバグとかが多いんですか?
185デフォルトの名無しさん:2007/12/16(日) 23:06:10
どんな手段をもってでも初心者から1.9を遠ざけたいという強い意思の現れだろう


いやわからんけど


っていうかなんでわざわざ1.9入れるんだろう
安定版という響きが悪いのか? 正式版とでも書けばいいのかな
いやまあ確かにttp://www.ruby-lang.org/ja/downloads/から直接FTPディレクトリに飛ぶと
1.8.6の上に1.9.0があるように見えるんだけどさ
ttp://ftp.ruby-lang.org/pub/ruby/binaries/mswin32/
unstableとかディレクトリ切ったほうが間違いないのかもしれない
186デフォルトの名無しさん:2007/12/16(日) 23:16:14
>>184
どのサイトを見て最新版を入れたんだ?

>>185
でも普通、初心者はわざわざFTPディレクトリに飛ばないと思うんだが
そうでもないんだろうか
187デフォルトの名無しさん:2007/12/16(日) 23:17:53
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はパッチの意味ですか?
189デフォルトの名無しさん:2007/12/17(月) 00:33:24
>>166
さんくす
190デフォルトの名無しさん:2007/12/17(月) 00:46:01
at_exitを使うと、プログラム終了時に行う処理を登録できますが、
そんな感じで、例外が発生したときにそれをキャッチする処理を登録できますか。
begin - rescue - end で全体を囲めばいいんですが、そうでない方法で例外ハンドラを登録する方法があれば教えてください。

やろうとしているのは、requre 'foobar' としたら自動的に例外ハンドラが登録されることです。
191デフォルトの名無しさん:2007/12/17(月) 06:06:24
>>190
raise+rescue なら rescue ブロックの end 以降に処理が続くけど
登録したハンドラの処理が終了した後はどうなる事を期待してる?

require 'foobar' でどうにかするって事が目的なら
例外を発生させてるメソッドを上書きする方がよくね?
192デフォルトの名無しさん:2007/12/17(月) 07:39:04
>>190
requireだけですべての例外を補足できる方法は、おそらくない
明示的にbegin - rescue - endするしかない

>>191
>require 'foobar' でどうにかするって事が目的なら
>例外を発生させてるメソッドを上書きする方がよくね?
どこで例外が起きた場合でも補足できるように、ってことなんだろう
193デフォルトの名無しさん:2007/12/17(月) 12:09:07
>>188
pの数は新しいほど大きいから、新たにダウンロードするなら
一番大きいruby-1.8.6-p111-i386-mswin32.zipでいいよ

初学者向けで1.9.0の扱いを説明してるページは少ないな
194デフォルトの名無しさん:2007/12/17(月) 12:53:29
誰もが、よもや初心者が 1.9.0 に関心を持つとは思っていなかったからではないかな。
でも、こう立て続けに 1.9.0 ではまる初心者が出てきてるのをみると、最近何かあった?
195デフォルトの名無しさん:2007/12/17(月) 13:18:15
私も初心者ですが、1.9でのパフォーマンス向上に、かなり
魅かれてはいます。

ttp://journal.mycom.co.jp/news/2007/12/03/010/index.html
ttp://www.atmarkit.co.jp/news/200709/07/yarv.html
196デフォルトの名無しさん:2007/12/17(月) 13:22:41
初心者なのにパフォーマンスを気にしてるの?
197デフォルトの名無しさん:2007/12/17(月) 13:37:18
パフォーマンス気にするのは良いけど、代償が大きすぎる。
それでハマってもここに質問しにくるのはやめてほしい。自己責任で頼むよ。
198デフォルトの名無しさん:2007/12/17(月) 13:43:32
遅い遅いと言われ続けてきた反動かな?
マスコミに煽られるとナ‥‥
199デフォルトの名無しさん:2007/12/17(月) 14:04:39
>>196
というか、そういう内容の記事によってRubyの露出が増えていて、
それによってRubyという言語に興味を持つ人間が増えているんだろう。
「パフォーマンスに興味を持つ」のと「パフォーマンスを大々的にアピールする記事の連発を通して
Rubyに興味を持つ」のはまるで別物で、増えているのは後者だと思うよ。

ただ、興味のきっかけが「1.9.0はすごいよ!」っていう記事である以上、まぁ普通そのバージョンを
入手しようと思うわけで、そこんとこでこのような流れが生まれるんだろうね。
「ただし初心者にはおすすめできない」みたいな注釈が、速度絶賛系の記事にあればいいんだけど、
Ruby記事なんて大体が宗教冊子みたいなもんだから、そういうことは書いてあるはずもなく。
200デフォルトの名無しさん:2007/12/17(月) 14:14:12
パフォーマンスが悪い言語なんて誰も興味を持たないからだ
201デフォルトの名無しさん:2007/12/17(月) 14:15:18
まぁ初心者じゃない人が1.9を知らないってだけなんだけどな
202デフォルトの名無しさん:2007/12/17(月) 14:16:14
ここに質問しにくるのはいいんじゃないの?
その分ruby-listのノイズが減るじゃん。

「hogehogeがruby-1.9で使えなくて困ってます(><)」
って言われたら
「そうねえそれは困りましたねえ(・∀・)ニヤニヤ」
って言えばいいんだし。
203デフォルトの名無しさん:2007/12/17(月) 14:30:05
本スレはそれでいいけど、初心者スレでその回答はどうかなぁ。
卒業した学校の部活に、下手糞なアドバイスをしに来る痛い先輩みたいでさ。
204デフォルトの名無しさん:2007/12/17(月) 15:48:14
「1.9はサポートできないから初心者は使うな、使い続けたいならここに来るな」

でよろしいかと
1.9の質問受け付けるのは専用スレがあってもいいくらいのめんどくささだぞ
205デフォルトの名無しさん:2007/12/17(月) 16:33:11
正式版はクリスマスにでるんだっけ?
文字コードにあわせて1文字 not 1byteになるととっつきやすいんだけどなぁ
206デフォルトの名無しさん:2007/12/17(月) 16:37:02
->
記法にははやいとこ死んでほしい。Yarvは歓迎するけど、Ruby2 featureには
要らないものが多いよ。おいらはただ、速いC rubyが欲しいだけなんだ。
207デフォルトの名無しさん:2007/12/17(月) 16:40:09
そういう話は本スレでどうぞ
208デフォルトの名無しさん:2007/12/17(月) 19:12:41
HTMLの実体参照を戻すのに
CGI.unescapeHTML(string)よりいいのありませんか?
♥(ちゃんと見えてるか?)
とかも戻せるのが欲しいです。
209デフォルトの名無しさん:2007/12/17(月) 19:13:11
&heartsでなくて&hearts;です。
210デフォルトの名無しさん:2007/12/18(火) 13:44:29
>>208
cgi.rbのunescapeHTML()をコピって、heartsを追加。
かっこわるいけど。
211デフォルトの名無しさん:2007/12/18(火) 14:09:41
>>208
よく考えたら、どの文字コードに変換するのか指定できないといけないね。
'&' や '<' はASCIIだから文字コード気にしなくていいけど、&hearts;はそうもいかないな。
$KCODEみて変換すればいいのかな。
212デフォルトの名無しさん:2007/12/18(火) 14:17:40
>>211
cgi.rb 見るとそうなってる ($KCODE が UTF-8 のときのみ変換) けど、
本当は $KCODE ではなく出力する対象のドキュメントに合わせるべきだよね。
213デフォルトの名無しさん:2007/12/18(火) 18:40:43
"を単なる文字として扱うにはどうすれば良いでしょうか?
214デフォルトの名無しさん:2007/12/18(火) 18:52:36
前スレ492あたりでCGIフレームワークはないかって話があったけど
こんな記事見つけた

「忘れられたRubyのWebフレームワーク」
http://www.infoq.com/jp/news/2007/11/forgotten-ruby-web-frameworks
215デフォルトの名無しさん:2007/12/18(火) 19:10:34
>>213
'"'
"\""
でいいのかな?
216デフォルトの名無しさん:2007/12/18(火) 19:12:33
シングルクォートな文字列にする
'ダブルクオートは"です'

ダブルクオートの中ならバックスラッシュでエスケープする
"ダブルクオートは\"です"

好きなほう使え

>>215
よいかと
他にもなんとかする方法はある気はするがそんなもん覚えなくてよし
217デフォルトの名無しさん:2007/12/18(火) 19:25:03
ありがとうございます
218デフォルトの名無しさん:2007/12/18(火) 22:36:43
引数の参照渡しってできないんだっけ?
219デフォルトの名無しさん:2007/12/18(火) 22:57:16
できない


と思っていただこうッ!

真似はできるけど肝心なとこで動作が違うからRuby式の別物として理解したほうがよい
220デフォルトの名無しさん:2007/12/18(火) 23:55:20
>>219
え、やっぱそうだったか。

ちょうど参照渡ししたいとこがあったんだけど、別の方法を考えるとするかな。
221デフォルトの名無しさん:2007/12/18(火) 23:59:19
具体的にどういう動作を望んでるのか説明するとアドバイスがあるかも

ないかも
222デフォルトの名無しさん:2007/12/19(水) 00:00:00
>>210,211,212
サンキュー。
とりあえずぶち当たったもんを処理する事にします。
223デフォルトの名無しさん:2007/12/19(水) 05:02:11
>>218 >>220
実際はほとんど全部が参照渡しなんだが、代入した時点で参照が外れる。
だから、参照渡しみたいな動作をさせるなら、

・配列として渡し、配列の要素を変更する。
・オブジェクトとして渡し、値を変更するメソッドを呼び出す。
・そもそもRubyの場合、return a,b,c と複数の値を返せるのでそれほど必須ではない。

とまあ、よく使われる方法はこんなとこかな。
俺的には2番目か3番目の方法をオススメ。
224デフォルトの名無しさん:2007/12/19(水) 05:09:22
適当なこと言わないように
225デフォルトの名無しさん:2007/12/19(水) 05:17:24
遠慮せず訂正してもいいんだよ
226デフォルトの名無しさん:2007/12/19(水) 11:04:15
配列などに、「もし何か入っていたら」を記述するとき、
if ! obj.empty? や unless obj.empty? みたいに、
否定的な表現をしなくちゃいけないのが抵抗あるんですが、
何かうまい記述はありますか?
227デフォルトの名無しさん:2007/12/19(水) 11:09:27
obj.exist?
みたいなの作っちゃえば?
228デフォルトの名無しさん:2007/12/19(水) 11:20:37
うーん、そうですね。ただ、 exist? は名前がいまいち・・・(私も思い付きません)
229デフォルトの名無しさん:2007/12/19(水) 11:28:19
contain?とか
230デフォルトの名無しさん:2007/12/19(水) 11:28:19
irb> puts '何か入ってます' if [].any?

irb> puts '何か入ってます' if [nil, nil, false].any?

irb> puts '何か入ってます' if [''].any?
何か入ってます
231デフォルトの名無しさん:2007/12/19(水) 11:55:26
size > 0 でいいじゃん
232デフォルトの名無しさん:2007/12/19(水) 12:06:25
それは [nil].size が 1 であることを許容できるかどうかにかかってるな

つか、「何か入っている」のではなく「空ではない」と考えるようにしたほうがいい
empty が通常の状態
233デフォルトの名無しさん:2007/12/19(水) 12:42:55
文字列から連続する英字を取りたい

str = "Java1.5と日本語は除外 rubyperl,ruby 1.9ああああpythonいいい"
#なんらかの処理
["Java"、"rubyperl"、"ruby"、"python"]
234デフォルトの名無しさん:2007/12/19(水) 12:52:23
str = "Java1.5と日本語は除外 rubyperl,ruby 1.9ああああpythonいいい"
p str.scan(/[a-z]+/i) #=>["Java", "rubyperl", "ruby", "python"]
235デフォルトの名無しさん:2007/12/19(水) 21:36:52
警告に関して質問させてください

文字列をパースして処理を行う、小さなライブラリを作っているのですが
途中でパースできない行を見つけたときに警告を出したいと思っています
このとき、以下のどの方法を取るべきでしょうか?

1. 常に$stderrに警告
2. 冗長モード($VERBOSE)なら$stderrに警告
3. デバッグモード($DEBUG)なら$stderrに警告
4. 冗長モードかデバッグモードなら$stderrに警告

冗長モードとデバッグモードの使い分けが今ひとつ分からず、悩んでいます
236デフォルトの名無しさん:2007/12/19(水) 21:45:20
3
237デフォルトの名無しさん:2007/12/19(水) 21:48:25
警告の内容にもよるかもしれん
適当な自作の例外を発生させたほうが好ましい場合もあると思う
238デフォルトの名無しさん:2007/12/19(水) 22:09:14
>>235
パーサでは常に例外を発生させる、でいいと思う。
それをmainプログラムでキャッチして、常に$stderrに表示。
パースできないデータなら、そうするべき。
警告を使うなら、警告文を表示するけど処理は継続する場合じゃないかな。
例えば古い書き方を使っていて、今のパージョンではまだサポートするけど将来は廃止する予定だから新しい構文を使ってね、という場合にwarn()で警告する。
パースできないというのは致命的だから処理を継続すべきでなく、よって例外を発生するのが自然。
239デフォルトの名無しさん:2007/12/19(水) 22:12:41
>>235
デバッグモードと冗長モードの使い分け:
* ユーザに表示するデータは冗長モードで出力
* 開発者だけに限定するならデバッグモードでのみ出力

冗長モードはユーザのため、デバッグモードは開発者のため、という理解でいいんじゃね?
240デフォルトの名無しさん:2007/12/19(水) 22:36:44
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」が
帰ってきます。

何か使い方を間違っているのでしょうか。
教えてくださいませ。
241デフォルトの名無しさん:2007/12/20(木) 00:46:11
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
242235:2007/12/20(木) 21:08:02
ありがとうございました。
パース失敗が致命的ではなく(エラーは単に読み飛ばすだけ)
エラーの内容を、ユーザーに表示する必要がある処理のため
$VERBOSEで判定することにします。
243デフォルトの名無しさん:2007/12/21(金) 12:34:35
質問です。
windowsでRuby使ってるんですが、コマンドプロンプトで指定したテキストファイルを読み込ませたいです。
f = open("SA.txt")
reviewbody = f.read
reviewbodyは処理対象みたいな
このSAの部分をコマンドラインから入力できるようにしたいんですが、どうすればいいでしょうか?
244デフォルトの名無しさん:2007/12/21(金) 12:53:10
puts 'なにか入力してください'
text=STDIN.gets.chomp
puts "#{text}が入力されました"


なにか入力してください
なにか
なにかが入力されました
245デフォルトの名無しさん:2007/12/21(金) 12:56:49
>>244さま
ファイル名をコマンドプロンプトから指定するという意味です。
246デフォルトの名無しさん:2007/12/21(金) 12:58:03
「ファイル名をコマンドプロンプトから指定する」とはどういう意味?
247デフォルトの名無しさん:2007/12/21(金) 13:03:51
>>245
> cat argv.rb
puts "引数の一つ目は#{ARGV[0]}です"
puts "引数の二つ目は#{ARGV[1]}です"

> ruby ./argv.rb いっこめ ふたつめ
引数の一つ目はいっこめです
引数の二つ目はふたつめです
248デフォルトの名無しさん:2007/12/21(金) 13:16:02
>>245
>>247 のが良いと思うけど、 ARGF を使うという手もある。
249デフォルトの名無しさん:2007/12/21(金) 13:19:33
>>247さま
ちょっとやってみます。
>>246さま
Getsでとってきたら無理だったんですが、要するに
f = open("SA.txt")
reviewbody = f.read

だったらSA.txtをreviewbodyとしてyahooの形態素解析にかけてるんですが、そのSA.txtをgetsみたいにとってこれたらなぁって思ってます。
指定できないといちいちソースにファイル名書き込んだりして変更しなきゃいけないので・・・
それを何とかしたいワケです。
250デフォルトの名無しさん:2007/12/21(金) 14:37:33
これは何度でも言うが、そういうのは試してから書き込め
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

となってしまいます。いろいろググってみたのですが解決方法がわかりません。
どなたかお知恵をお貸ししていただけないでしょうか?
253デフォルトの名無しさん:2007/12/21(金) 18:05:09
>>252
「lipo: can't open input file:」
でぐぐるといいことあるかも
254デフォルトの名無しさん:2007/12/21(金) 18:05:22
gem使ってやれば?
255デフォルトの名無しさん:2007/12/21(金) 18:33:39
>>254
gem使っても、結局は自分の環境でmakeするんじゃないのか?
それを自動的にやるかどうかの違いだけで
256デフォルトの名無しさん:2007/12/21(金) 22:43:06
>>241です。
スレちがいだったでしょうか? Meadowスレとかのほうがいいかな。
この現象は俺だけ?
257デフォルトの名無しさん:2007/12/21(金) 22:58:29
>>251
ARCHFLAGS=-i386
export ARCHFLAGS
してからgemなりmakeなり。

sudo gemだと環境変数を引き継がないので、sudo suとかして。

くわしくは以下にて
http://trac.macosforge.org/projects/ruby/wiki/WhatsNewInLeopard
258デフォルトの名無しさん:2007/12/21(金) 22:59:13
なんかうろ覚えで間違えた。
ARCHFLAGS="-arch i386"
が正しい。
259252: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
260252: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
261252: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
262デフォルトの名無しさん:2007/12/21(金) 23:35:03
よくわかんないんだったらpure rubyのやつ使いなよ
263デフォルトの名無しさん:2007/12/21(金) 23:36:12
ちなみにmacportsで入れたmysqlではうまくいってる。
264デフォルトの名無しさん:2007/12/22(土) 00:23:52
def で返り値を返したい時にはどうしたら良いんですか?
265デフォルトの名無しさん:2007/12/22(土) 00:24:29
return使えreturn
266デフォルトの名無しさん:2007/12/22(土) 00:25:41
最後に評価された式の値が返されます
267デフォルトの名無しさん:2007/12/22(土) 00:34:08
>>264
exitでもしない限りdefは常に返り値を返す
268264:2007/12/22(土) 00:43:52
ありがとうございました。
269デフォルトの名無しさん:2007/12/22(土) 01:05:21
defの引数評価はできますか?
StringだったときとArrayだった時で処理を分けたいんですが.
270デフォルトの名無しさん:2007/12/22(土) 01:17:53
引数のオブジェクトが何オブジェクトに属しているか調べればいい

あるオブジェクトが具体的に何のオブジェクトに属するか調べるメソッドは
マニュアルのObjectオブジェクトのところに載ってたり載ってなかったりすると思う
271デフォルトの名無しさん:2007/12/22(土) 01:34:10
それを引数評価とはいわないけどな。
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文の分け方を教えてください!!!
273デフォルトの名無しさん:2007/12/22(土) 04:48:17
>>272

Dir.glob("**/*.{html,htm}") { |file|

case File::basename file
when /main/
do_main_with file
when /sub/
do_sub_with file
end
}
274デフォルトの名無しさん:2007/12/22(土) 04:57:36
>>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です。
277デフォルトの名無しさん:2007/12/22(土) 07:03:46
>>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です。
うまくいきました。
ありがとうございました。
279デフォルトの名無しさん:2007/12/22(土) 10:01:01
Rubyに限った話しじゃないけど、
実引数名と仮引数名って、別にした方がいいの?
280260:2007/12/22(土) 10:13:19
>>260です。やっぱりサンプルコードが動きません、、、
たとえば下のコードでは、ブラウザに表示されるのは'abc'だけです。
うまくいったと思ったんですけどねぇ。

[略]
print 'abc'
require 'mysql'
print 'def'
[略]
281デフォルトの名無しさん:2007/12/22(土) 10:31:20
abcと出て他には何も出ずに終了?
282270:2007/12/22(土) 10:45:50
>>281
はい、そうなんです。
せめてエラーコードが出れば、そこから推測もできるかもしれないのですが、、、
283デフォルトの名無しさん:2007/12/22(土) 10:49:39
Webブラウザ上にエラーメッセージがほいほい出るわけなかんべ
ローカルで検証コード動かせ
284282: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

でした。問題??
285デフォルトの名無しさん:2007/12/22(土) 11:22:46
file /usr/local/mysql/lib/mysql/libmysqlclient.15.dylib
file /Library/Ruby/Site/1.8/universal-darwin9.0/mysql.bundle
の結果は?

片方がうにばーさるで片方がi386専用と見た。
286284: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

でした。
287デフォルトの名無しさん:2007/12/22(土) 11:49:40
>>284

mysql/ がもう1つ入ったパスになってるのね。
288デフォルトの名無しさん:2007/12/22(土) 21:11:47
>>279
仮引数のスコープは一部の例外(※)を除いて定義されたメソッド内に限定される為、
実引数と仮引数が同名であっても何ら支障は無い(※eval,erb等のbinding)
わざわざ仮引数名調べて違う名前考えるのも面倒だしな
289デフォルトの名無しさん:2007/12/22(土) 21:19:47
ますます払わないぞ>高額所得者の支給停止
290デフォルトの名無しさん:2007/12/22(土) 21:19:58
ごめん、誤爆
291デフォルトの名無しさん:2007/12/22(土) 21:22:07
>>288
サンクス

プログラミングの作法として、どうなんだろうって思った。
そのメソッドの内容からみて、ふさわしい仮引数の名前であれば、
それがたまたま実引数と同じであってもいいよね。
292デフォルトの名無しさん:2007/12/22(土) 22:31:20
html = get_from_web(uri)
data = parse_hoge(html)

def parse_hoge(html)
data = Array.new

return data
end

というようなことはしょっちゅうですが何か
改造可能で公開するモジュールではこれやると若干恥ずかしいだろうけど
293デフォルトの名無しさん:2007/12/22(土) 23:43:51
何か問題あるのか?
294デフォルトの名無しさん:2007/12/23(日) 01:41:40
クラスメソッドの引数の型チェックってできますか?
たとえば、引数がStringとArrayで処理を分けたいのですが。
Arrayも1次元と2次元で処理を分けるなど複雑な事をしたいのですが。

295デフォルトの名無しさん:2007/12/23(日) 01:50:01
引数のオブジェクトが何オブジェクトに属しているか調べればいい

あるオブジェクトが具体的に何のオブジェクトに属するか調べるメソッドは
マニュアルのObjectオブジェクトのところに載ってたり載ってなかったりすると思う
296デフォルトの名無しさん:2007/12/23(日) 02:04:07
むしろ Array の中身をそのクラスメソッドの前で分解できれば
複雑なこと(他人が理解しづらいこと)しなくていいんじゃない?
他人=コーディングした数ヶ月の自分でもある

文字列だけじゃないならどうしようもないけど
297デフォルトの名無しさん:2007/12/23(日) 02:11:55
>>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)に次元なんて無い。配列が入れ子になってるだけ。
298294:2007/12/23(日) 04:58:49
>>295
なるほど。Objectのメソッドですね。
ありがとうございます。

>>296
それも考えて、ループや型変換で今までやってたんですけど、
すっきりスマートに呼び出したいなーという欲望に駆られましてw

>>297
>>294=269 か? 
ちがいますよー。

>メソッドオーバーロードはrubyではできない。こんな感じで自分で処理しなさい 
なるほど。
メソッドの中で分岐させればいいわけですね。
考えてみれば、この方がオーバーロードより単純に処理できますね。
ありがとうございました。

>それとrubyの配列(Array)に次元なんて無い。配列が入れ子になってるだけ。 
そうなんですか。
2次元のデータを扱おうと思ってて、Cと同じ感じでやろうと思ってるんですが、良くないんでしょうか?
概念が違いますか?
299240: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次元配列とは違う
ものだとわかった上で使わないと、罠にはまるだろうね。
300デフォルトの名無しさん:2007/12/23(日) 06:56:02
>>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
301デフォルトの名無しさん:2007/12/23(日) 07:20:36
>>240
ioctl(2) は見た?
何をしたいのかは俺にはわからんが、0 が返るのは正常な動作みたいだよ?
302デフォルトの名無しさん:2007/12/23(日) 07:57:14
ワンライナーで、
while...endループの前に一度だけ実行してほしいものは
どのように書けばいいでしょうか。
303デフォルトの名無しさん:2007/12/23(日) 08:34:55
>>294
どちらかといえば、引数を見て処理を分けるよりも
違う型の引数をとるメソッドには、それぞれ違う名前を与えるべき

つまりStringを受けるメソッドと、1次元Arrayを受けるメソッド
そして2次元Arrayを受けるメソッド、三種類のメソッドを作る方がいいと思う

実際にどんな処理がやりたいのか分からないから、明確な助言はできないが
304デフォルトの名無しさん:2007/12/23(日) 09:48:36
というか本質的に何か間違っているはず
2次元配列(って何?)を1次元配列や文字列と区別せず受け取るメソッドの見当がつかない

もしかしたらメインは2次元配列で、1次元配列や文字列を受け取ったとしても内部的に2次元配列に変換するぜという動作なのかもしれないけど
305デフォルトの名無しさん:2007/12/23(日) 10:54:32
>>300
とぶん、>>297は、横着して、ひとつのコードで、それら両方の手段を示したかったんだと思うw
306デフォルトの名無しさん:2007/12/23(日) 11:58:40
>>302

ruby -ne 'BEGIN { puts "only once" }' -e 'print $_' < input
307デフォルトの名無しさん:2007/12/23(日) 12:34:25
`foo`.split("\n").each{|line|

}
で`foo`の終わりを待たずに順次実行って出来ないの?
308デフォルトの名無しさん:2007/12/23(日) 12:37:07
どの時点の"順次"なんだよ
309デフォルトの名無しさん:2007/12/23(日) 12:51:45
「`foo`の終わり」を定義してもらおうか
310デフォルトの名無しさん:2007/12/23(日) 12:52:09
>>307

open('foo | tail -f') do |file|
file.each_line do |line|
...
end
end

とか。

探すとFile::Tailってのもあるようだが。これはIOじゃなくFile限定なのかな。

311310:2007/12/23(日) 12:53:14
ん、なんか質問の意味を勘違いしたらしいorz

312デフォルトの名無しさん:2007/12/23(日) 14:13:03
>>307
splitをはさんでるからじゃね?
`foo`の結果は文字列なんだから
`foo`.each_line do |line| .. end
でいいと思う。
313デフォルトの名無しさん:2007/12/23(日) 14:14:09
>>312
ごめん、まちがった。
`foo` が文字列を返すから、fooがすべて終了しないと返ってこないわな。
310のようにI/Oつかうしかないと思う。
314デフォルトの名無しさん:2007/12/23(日) 14:57:09
>>313
I/O 使うのはそうだと思うが、 >>310 はダメだろ。
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
なんだか、汎用ライブラリにできそうですが。
型チェックを行うクラスというか。そんな感じの物を。
そうすると、より堅牢な形になりそうですね。
318315:2007/12/23(日) 17:48:21
うまくアップデートできました。

ActiveScriptRuby
http://arton.hp.infoseek.co.jp/indexj.html

はじめ、ActiveScriptRuby をインストーラーから入れたのですが、
rubyのバージョンを確認しても、アップデートされてなくて、
一旦アンインストールして、もう一度、インストールしたら、アップデートされていました。

ただ、bin/gems などの(.batじゃないやつ) 先頭のrubyのパスが正しくないので、
cygwinなどから使えなかったのですが、
コマンドプロンプトから、gem を update したら直りました。

ありがとうございました。
319デフォルトの名無しさん:2007/12/23(日) 18:54:48
>>317
つ NArray
320デフォルトの名無しさん:2007/12/23(日) 20:39:57
>>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相当の何かに変えないといけないんでない?
321デフォルトの名無しさん:2007/12/23(日) 21:12:21
>>319
おお、こんなのあったのね。
と思ったが、クソ重いrubyでやる意味あんのかね・・・
322デフォルトの名無しさん:2007/12/23(日) 21:27:05
>>316
> 自分の好みの形で変数の内容をファイルに書き出したい

俺なら、まず二次元配列用のクラスを作る。

その上で、書き出したいデータの各クラスに
例えば to_myfile とか共通のメソッドを定義。

ファイルに書き出す時は、書き出すところでクラスを判別するのではなく
引数の各オブジェクトに対して to_myfile した結果を使うようにする。
つまり出力形式はオブジェクト側に任せる。
323デフォルトの名無しさん:2007/12/23(日) 21:29:21
追伸。クラス側を弄れないなら
仕方なく判別するけど。
324デフォルトの名無しさん:2007/12/23(日) 21:58:05
>>322
なるほど。
そういう考え方もありますね。
オブジェクトごとに違ったファイルに書く場合なんかは便利そうですね。
325デフォルトの名無しさん:2007/12/23(日) 22:07:40
ファイルが違わなくても、出力する体裁が違うだけでも
メソッドに任せる意味はある。
326320:2007/12/23(日) 22:27:03
間違えた、読めばすぐわかると思うけど一応訂正
× これだと5行目で
○ これだと4行目で
327デフォルトの名無しさん:2007/12/24(月) 06:13:58
WWW::Mechanizeで(GET,POSTではなく)HEADは使える?
328デフォルトの名無しさん:2007/12/24(月) 06:40:29
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)
クラスメソッドがないと言われます.
多次元配列のメソッドを呼び出すにはどう表記したら良いんですか?
330デフォルトの名無しさん:2007/12/24(月) 21:04:10
RubyのArrayの単純なネスト(入れ子)では多次元配列を表現できない
ネストした配列はネストした配列以上のものではない
arr[0][1]はarrの0番目の要素のオブジェクトの[]メソッドに引数として1を渡したものを表現しているに過ぎない

以上を踏まえると、value[i]は配列[]の0番目の要素つまりnilだ
331デフォルトの名無しさん:2007/12/24(月) 21:17:28
先生!踏まえてません! この 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もつかえるんだから。
334デフォルトの名無しさん:2007/12/24(月) 21:27:13
value=[],[] #=> [[],[]]
つまり、空の配列2つを要素に持つ配列
value[0] : []
value[1] : []
value[2] : nil

> カラのオブジェクトにpushを指定しているのでエラーが出てると言うことですかね?
空のオブジェクトというものでは無く、
エラーメッセージの通りnilがpushを持っていないということ
335デフォルトの名無しさん:2007/12/24(月) 21:31:01
難しく考える必要なし
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で回しても良いような気もしてきましたが...
337デフォルトの名無しさん:2007/12/24(月) 21:39:44
まず「クラスメソッド」という用語の使い方を間違っている
君が使っているのは普通のメソッド(=インスタンスメソッド)だけだ

で、>>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"]]
338デフォルトの名無しさん:2007/12/24(月) 21:44:56
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が読み難いのですか?
340デフォルトの名無しさん:2007/12/24(月) 21:52:44
「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

こんな感じの構造の配列がほしいのですが...
それとも,クラスをつくったほうがいいのかな...
343デフォルトの名無しさん:2007/12/24(月) 22:11:42
言いにくいんだが、多次元配列の用語の使い方も根本的に間違ってないか?
もしかしてただの行列なのでは?
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 
みたいなこともやろうと思ってるんですが.
346デフォルトの名無しさん:2007/12/24(月) 22:28:02
もうなんかいろいろ駄目だな
エスパーが現れて、ズバリなコード書いてもあなたには理解できんと思うよ
347デフォルトの名無しさん:2007/12/24(月) 22:29:41
まず何がやりたいのかを、もっと具体的に書いてくれ
「変数の内容がどんな風に変わるのか」ではなく
「何をしてくれるプログラムを書きたいのか」を
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
349デフォルトの名無しさん:2007/12/24(月) 22:42:01
arr1=["a","b","c","d"]
value=Array.new
arr1.each_with_index{|s,i|
value[i] ||= Array.new
value[i][0] = s
}
p value
350デフォルトの名無しさん:2007/12/24(月) 22:44:40
普通にHash使えば良いんでないの?
351デフォルトの名無しさん:2007/12/24(月) 22:45:37
>>346
ええ.まぁ,なんか手に余るなぁと考え始めてますww

同様のプログラムをhspで組んで使ってるんですが,
文字コードの問題や文字の代入制限(32kbyte)や正規表現の有無で
こっちに乗り換える事にしました.
日曜プログラマなので,詳しい語の使い間違いとかはご容赦ください.
352デフォルトの名無しさん:2007/12/24(月) 22:52:35
>>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を用意したり,
膨大なコストが掛かるので私レベルでは無理ですが)そういうのも有りかと.
354デフォルトの名無しさん:2007/12/24(月) 23:10:29
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
355デフォルトの名無しさん:2007/12/24(月) 23:10:38
関連する語に重複が無いなら関連する語をキー、語句を値にしてハッシュに登録
重複する時は、どちらを選択するか決定する方法を先に考えておかないと何作っても無駄
356デフォルトの名無しさん:2007/12/24(月) 23:23:19
リファレンスマニュアル(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 

どうもありがとうございました.
358デフォルトの名無しさん:2007/12/24(月) 23:33:02
>>356
末端まで行ったらvは消去されちゃうじゃん。
359デフォルトの名無しさん:2007/12/24(月) 23:33:54
>>348 >>357
配列を使うよりは、>>350 >>355で言われてるように

RELATION_TABLE = {}
RELATION_TABLE['a'] = ['A', 'B', 'C', 'D', 'E', 'F']

というように、ハッシュで関連性を定義しておいて
あとはこのハッシュを使って処理するのがベストだろうと思う
多次元配列を使うと、どうしてもコードが複雑になりがち

クラス定義を使えばさらにすっきりする

>>356
ブロックが実行されるたびに、スコープは初期化「されている」
360デフォルトの名無しさん:2007/12/25(火) 00:02:41
>>359
ハッシュですか.
呼び出す時にはどう扱えばよいものか...
勉強してみます.
361デフォルトの名無しさん:2007/12/25(火) 00:23:46
なるほど、毎回初期化されるのですね
了解です
362デフォルトの名無しさん:2007/12/25(火) 04:04:24
>>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じゃなくて
364デフォルトの名無しさん:2007/12/25(火) 10:19:44
Hoge.piyo や Hoge::piyo は普通にクラスメソッド呼び出し形式だからありえんだろ。
365デフォルトの名無しさん:2007/12/25(火) 11:11:02
Hoge.piyo ではクラスメソッドの呼び出しになってしまう。
確か何か他の言語でインスタンスメソッドを表すのに # 使ってるんじゃないっけか
366デフォルトの名無しさん:2007/12/25(火) 19:29:10
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を動かすことはできてます
どうすればいいでしょうか
367デフォルトの名無しさん:2007/12/25(火) 19:51:04
GNU readlineがないんでしょ
ttp://homepage.mac.com/matsuan_tamachan/software/ReadLine.html
みれ。あとはAppleにですね、OSX
368デフォルトの名無しさん:2007/12/25(火) 19:51:44
をGPL互換ライセンスにしてGNU readlineを添付できるように苦情を言うとか。
369デフォルトの名無しさん:2007/12/25(火) 22:59:17
libeditというreadline互換BSDLライブラリもあって、
Mac OS X 10.5(Leopard)のRubyはそれ使ってる。
370デフォルトの名無しさん:2007/12/25(火) 23:13:36
質問です。
ある任意の定数0<a<1について、
0をaの確率で出して、
1, 2, 3をそれぞれ(1-a)/3
の確率で出すメソッドはどうやって作ればいいでしょうか?
371デフォルトの名無しさん:2007/12/25(火) 23:25:01
randって関数が引数を与えなかったとき、0以上、1未満の乱数をかえすけど。
372デフォルトの名無しさん:2007/12/25(火) 23:28:10
>>371
知らなかった。
さんくる
373デフォルトの名無しさん:2007/12/25(火) 23:31:29
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 コマンドを実行してくれるようなサーバを作りたいんですが、どうしたらよいですか?
374デフォルトの名無しさん:2007/12/26(水) 01:06:51
>>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ちゃんねる

という感じの事がしたいんですが.
376デフォルトの名無しさん:2007/12/26(水) 04:03:19
むりぽ。
一意のキーに対して、オブジェクトが割り当てられるのがハッシュではないんかな?

ハッシュ風に正規表現で、マッチしたのなら、そういうクラスを作るか、
値を返したいのなら、そう組むべきではないかな?

そう組む場合
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
みたいな
377デフォルトの名無しさん:2007/12/26(水) 05:18:36
こんなんでもいいんでは?

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 のキーになってる正規表現の表す範囲は重複しないと仮定。
378デフォルトの名無しさん:2007/12/26(水) 06:21:44
SQLite(3)ライブラリの質問。

データーベースのクローズって必須じゃないんでしょうか?
理屈としては,トランザクション処理だけ適切にやれば,
明示的クローズなしてもスクリプト終了時にはクローズして
くれそうなんだけども,

SQLite3::Databese.newには,ブロックは渡せないようだし,
本来ならbegin-ensure-endでクローズを保証しなきゃないないよう
な気がするけど,サンプルコードみても,そんなことしてないようだし。
379デフォルトの名無しさん:2007/12/26(水) 07:53:24
>>378

1. 普通いらない。常識通り。

2. WEBrick の HTTPServlet だったりなんかするとプロセスが終了しないからどこかで閉じないと死ねる。

まあ、ふつう。
380378:2007/12/26(水) 08:09:59
>>379
ありがたい,すっきり解決。
381デフォルトの名無しさん:2007/12/26(水) 14:44:51
【スレを読んでる初心者の皆さんへ】

Ruby1.90 がなにやら大々的にリリースされましたが、開発不安定版である 1.9系列はこのスレでは扱いません
Ruby0.9 は 1.8 を熟知した人だけが違いを認識した上で自己責任でお使いください
現在の最新安定版は 1.86です

1.90 の安定性が上がるのは 1年くらい先といわれていますので頼りにしないでね
382デフォルトの名無しさん:2007/12/26(水) 15:01:35
>>381
おちつけw
383デフォルトの名無しさん:2007/12/26(水) 15:04:55
数字はテンキー入力か

プログラムやってる人は高速タイピングできない人が少なくないとはいえ、
たかが3桁程度の数字をホームポジション付近から手を離してテンキー入力だなんて却って面倒じゃね?
384デフォルトの名無しさん:2007/12/26(水) 15:10:40
ノートだからテンキーが付いてない俺涙目ww
385デフォルトの名無しさん:2007/12/26(水) 19:04:39
あるメソッドがどのクラスで定義されているかを調べる方法はありますか。
例えば obj.class.ancestors が [Child, Parent, Object, Kernel] のとき、obj.to_s がどのクラスで定義されているのかを知りたい、
またはto_sを定義しているクラスを全て知りたいということです。
singleton methodはとりあえず考えなくて結構です。
386デフォルトの名無しさん:2007/12/26(水) 19:29:03
>>385
Module に良さげなメソッドが有るから自分で探しなさい
387デフォルトの名無しさん:2007/12/26(水) 21:08:48
>>386
そんな便利なメソッドはないだろ?
388デフォルトの名無しさん:2007/12/26(水) 21:46:42
>>387
どれくらい便利なら満足なんだ?
389デフォルトの名無しさん:2007/12/26(水) 22:01:43
音声認識
390デフォルトの名無しさん:2007/12/26(水) 22:03:37
vista へようこそ
391デフォルトの名無しさん:2007/12/26(水) 22:19:49
>>376
>むりぽ。 
>一意のキーに対して、オブジェクトが割り当てられるのがハッシュではないんかな? 

そうですか。


>>377
なるほど。イテレーターで総当たりするのですね。
ありがとうございます。
392385:2007/12/26(水) 22:46:12
>>386
>Module に良さげなメソッドが有るから自分で探しなさい
ないと思います。
例えばinstance_methodsは継承したメソッドも含まれるため、求めるものではありません。
Child.instance_methods - Parent.instance_methods だと、親クラスのメソッドを子クラスで上書きしている場合にそれが含まれないため、やはり求めるものではありません。
393デフォルトの名無しさん:2007/12/26(水) 22:46:22
C++のnamespaceに当たるものを探しています。
moduleというのがそれっぽいのですが、微妙に違う気もします。
moduleをnamespace代わりに使ってしまってOKですか?
394デフォルトの名無しさん:2007/12/26(水) 22:50:22
Ruby はそういったのが必要になる複雑なプログラムを書く事は想定していないと思う。
その分、文法を簡単にしてる感じ。
395デフォルトの名無しさん:2007/12/26(水) 22:54:32
>>393
Python使えばいいだろ
396デフォルトの名無しさん:2007/12/26(水) 22:59:44
は、Module使ってください。
397デフォルトの名無しさん:2007/12/26(水) 23:00:35
い、が抜けた。ナゼ。
398デフォルトの名無しさん:2007/12/26(水) 23:19:38
>>392
> to_sを定義しているクラスを全て知りたい
p obj.class.ancestors.select{|klass| klass.instance_methods(false).include?("to_s") }
399デフォルトの名無しさん:2007/12/26(水) 23:24:01
>>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)

よく探そう。
400385:2007/12/26(水) 23:27:41
>>398,399
ありがとうございます。探し方が足りませんでした。

401393:2007/12/27(木) 00:09:38
>>396-397
ありがとうございます。
module使います。
402デフォルトの名無しさん:2007/12/27(木) 01:13:00
>>399

class Parent; def to_s; end end
class Child < Parent; end
obj = Child.new
obj.my_meth(:to_s)
=> [Child, Parent, Object, Kernel]

になるんだが?
403399:2007/12/27(木) 01:35:29
>>402
ありゃ、ほんとだ。
(Enumerable module で) false が出てるから調べられてるんだろうと勘違いしてしまった。
お前がよく調べろよって話だね。

すみません。
404デフォルトの名無しさん:2007/12/27(木) 02:15:51
>>377
Hashのキーに正規表現(つか、regexp)OKだったのか。
というか、任意のオブジェクトぶちこんでもOk?
勉強不足だな、俺・・・
405デフォルトの名無しさん:2007/12/27(木) 02:27:14
TCPの通信で、接続が切れているかどうか調べるにはどうしたらいいですか?

相手がソケットをcloseした状態では、こちらのwrite_nonblock('')が成功します。
相手のプロセスが終了して初めてwrite_nonblockで例外があがるようです。
受信側はread_nonblockで判別できるようですが、データを受信してしまいます。
できればよけいなデータの送受信無しで判別したいのですが。

1当方環境はこの通りです。
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd7]
windowsでもちょっと試してみましたが、ほぼ同じ挙動のようですね。
406デフォルトの名無しさん:2007/12/27(木) 02:32:52
すみません。。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にしようとすると上記エラーが発生してアプリケーションエラーが出てしまいます。
どなたか解決錯誤存知の方いらっしゃいますでしょうか?
407405:2007/12/27(木) 02:47:06
あれ、ちょっと挙動がよく分からなくなってきた。
相手がcloseした後に1byteでも送信し(これは常に成功する?)、
再度書き込みしようとしたときに例外があがる、なのかな。

先のプロセス終了云々の発言は忘れてください。
ともかく、送受信無しで接続が持続しているか確認したい、ということです。
408デフォルトの名無しさん:2007/12/27(木) 03:48:12
409デフォルトの名無しさん:2007/12/27(木) 03:58:00
>>408
なるほど、これは大変参考になりますね。
socketについてまだよく分かっていないので、
じっくり読んでみます。
ありがとうございました。
410デフォルトの名無しさん:2007/12/27(木) 05:34:44
>>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?
411デフォルトの名無しさん:2007/12/27(木) 12:30:02
leopardでmacを使い始めたのですが、RDEのような開発環境はないでしょうか?

xcodeをいじれば出来るのかしら…。
412デフォルトの名無しさん:2007/12/27(木) 13:46:41
>>411
NetBeans
413デフォルトの名無しさん:2007/12/27(木) 14:16:25
環境抜きでもRDE<<<<NetBeansだな、βしか触ってないけど・・・
414411:2007/12/27(木) 15:04:00
をを、知らなかったです。感謝します。
415デフォルトの名無しさん:2007/12/27(木) 22:19:05
引数の型はどういうタイミングで変換するべきですか?
何か目安でもあれば教えてください。

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
416デフォルトの名無しさん:2007/12/27(木) 23:31:48
俺は関数/メソッド側で変換するかな。
417デフォルトの名無しさん:2007/12/27(木) 23:45:32
to_fならメソッド内部で変換するよね
to_sだと他のとこからも使うメソッドかどうかとかちょっと考える
to_aとかは論外
418デフォルトの名無しさん:2007/12/28(金) 03:14:14
自分は呼び出し元。
正規表現で切り出すまででなく、適切に変換する
のも文字列の解析に含まれると思うので。
419デフォルトの名無しさん:2007/12/28(金) 04:46:18
上の例でいくと、引数は数値がやり取りされるべきなんじゃない?
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]
421デフォルトの名無しさん:2007/12/28(金) 08:11:01
>>420
b=a.dup
422デフォルトの名無しさん:2007/12/28(金) 08:24:25
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 がほかと異なります.
425デフォルトの名無しさん:2007/12/28(金) 14:30:54
>424
変数 = 何か

は、変数そのものが指し示す先を指定する。

配列[添字] = 何か

は、配列に対して []= というメソッドを呼ぶ。
呼ばれた配列は自分の持ってる(添字)番目の要素が
(何か)を指すように書き換える。
426デフォルトの名無しさん:2007/12/28(金) 16:32:02
rubyでグリニッジ(?)時間を取得するにはどうすればよいですか?
119844442みたいなのです。
427デフォルトの名無しさん:2007/12/28(金) 16:50:51
2chのスレのdatキーに使われてるようなものなら Time オブジェクトを to_i すればいい

irb> p Time.now.to_i
1198828133

UNIX Time とか epoch time とか呼ぶ
マニュアルでは「起算時からの経過秒数」という正確過ぎて目に留まらない表現になってるな
428デフォルトの名無しさん:2007/12/28(金) 16:50:53
429デフォルトの名無しさん:2007/12/28(金) 17:27:35
ダウンロード版のマニュアル見にくくなったね
ローカルで見れるHTMLとか欲しかったな
430426:2007/12/28(金) 17:46:40
>>427
>>428

ありがとうございます!
例文のあるところにしか目がいってなかったようです。
とにかく感謝です。
431デフォルトの名無しさん:2007/12/28(金) 18:34:10
>>429
見られる、な。
とりあえずchmを解凍しろ
432デフォルトの名無しさん:2007/12/28(金) 19:25:00
そういえばchmはアーカイブだったな

うおー各ページへのリンクが全部 / から始まる絶対URLだ
433デフォルトの名無しさん:2007/12/28(金) 21:47:48
>>432
そこでrubyですよ
434デフォルトの名無しさん:2007/12/29(土) 02:14:12
俺は、ここにある、.chm使ってる。
見やすい。というか、小奇麗。
http://rails2u.com/

これの、1.8.6版がほしい
435デフォルトの名無しさん:2007/12/29(土) 02:34:52
ごめん、htmlが欲しいって話か
436デフォルトの名無しさん:2007/12/29(土) 08:07:22
つ CHM Decoder
437デフォルトの名無しさん:2007/12/29(土) 08:23:11
438デフォルトの名無しさん:2007/12/29(土) 08:42:53
googleで全角スラッシュ「/」を検索すると、URLにq=%EF%BC%8Fとかってなってる

str = "/"
str.?? => "%EF%BC%8F"

どの変換メソッド使えばいいんじゃろ?
439デフォルトの名無しさん:2007/12/29(土) 08:58:30
#require 'uri'
URI.escape(str)

もちろん元のエンコーディングで結果は変わる。
%EF%BC%8F だと、もとの全角スラッシュはUTF-8だな。
440デフォルトの名無しさん:2007/12/29(土) 09:40:33
ハイパーありがとうございます。
さっそくやったら、
%81%5E
が出てきました。
元のエンコーディングっつうのはどうすれば・・?
441デフォルトの名無しさん:2007/12/29(土) 10:29:57
それは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
443デフォルトの名無しさん:2007/12/29(土) 12:47:21
ページの一覧性という点では旧版のオンラインマニュアル(現行のWeb版)が最強だと思う
いちいちモジュール→クラスやクラス→メソッドをリンクにして喜んでるのはオタクっぽいと思った
444デフォルトの名無しさん:2007/12/29(土) 12:55:30
そのへんは目的の項目をどう検索してたどり着くかによるんだよなあ
長いページから検索して見つけるってのも方法としてアリなんだよね
どっちのパターンへも切り替えられると便利なんだけどさ
445デフォルトの名無しさん:2007/12/29(土) 14:08:07
>>443
どうなってればいいわけ?

そういや、chmの文字列検索って美妙につかえねえw
勝手に、文字分割して検索するwwww

「LOAD_PATH」と入れたら、loadとpathばっかり検索結果に出てきやがる
446デフォルトの名無しさん:2007/12/29(土) 14:17:10
"LOAD_PATH"
447デフォルトの名無しさん:2007/12/29(土) 16:18:34
>>446
キタ━━━━━━(゚∀゚)━━━━━━ !!
サンクソ!!
そういうのどこかに載ってますか?
まあ、googleとかで、+つけたり、""だと、全文一致というのは、あったから気付くべきだけど
448デフォルトの名無しさん:2007/12/29(土) 16:21:44
" " はとりあえず試すだろ。
449デフォルトの名無しさん:2007/12/29(土) 17:42:18
ここって”Ruby”初心者のスレじゃねーの?w
450デフォルトの名無しさん:2007/12/29(土) 18:42:01
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'
452デフォルトの名無しさん:2007/12/29(土) 21:52:38
riってみんな使わないの?
あれとRWikiのリファレンスで間に合ってるんだけど。
453デフォルトの名無しさん:2007/12/29(土) 21:57:39
>>452
何故「みんな使わない」と思ったのかが知りたい。
454デフォルトの名無しさん:2007/12/30(日) 00:24:29
>>451
at_exit {
 $stderr.puts "#{$!.backtrace[0]}: #{$!.message} (#{$!.class})"
}
とすると、終了時のエラーが表示されるかもしれないけど拡張ライブラリのバグならでないかも。
hpricotかmechanizeのバグだろうね。
455デフォルトの名無しさん:2007/12/30(日) 00:25:53
Rubyってexe化できるって聞いたんですけど
webアプリをそのままの機能でローカル利用できるってことですか?
456デフォルトの名無しさん:2007/12/30(日) 00:29:41
違います
457デフォルトの名無しさん:2007/12/30(日) 00:31:55
.rbファイルをソースとしてコンパイルするみたいな感じですか?
458デフォルトの名無しさん:2007/12/30(日) 00:33:19
Windows版Rubyをわざわざインストールしてなくても
誰でもそのRubyスクリプトをWindowsで実行できるようにできます
459デフォルトの名無しさん:2007/12/30(日) 00:34:46
Rubyが埋め込まれたHtmlもですか?
460デフォルトの名無しさん:2007/12/30(日) 00:38:55
いいえ
461デフォルトの名無しさん:2007/12/30(日) 00:39:12
はい

exeは標準出力にだらだら吐き出すだけだろうから、その出力をWebブラウザに渡すことができればHTMLも見れるよ
それはRubyの仕事じゃないけどな
462デフォルトの名無しさん:2007/12/30(日) 00:41:17
じゃあどの程度のプログラムがかけますか?
463デフォルトの名無しさん:2007/12/30(日) 00:42:06
あなたには無理です
464デフォルトの名無しさん:2007/12/30(日) 00:43:30
そうですか他をあたります Qtでも見に行こう
465デフォルトの名無しさん:2007/12/30(日) 01:01:15
>>451
メモリ食いすぎて自滅したかOSに殺されてるんじゃないの?
466デフォルトの名無しさん:2007/12/30(日) 01:07:13
if a=0 {
}else{
}
という文法だと間違ってると怒られるんですが、
{}を使ってelseを使うことはできないんですか?
467デフォルトの名無しさん:2007/12/30(日) 01:17:36
そもそもそんな文法はない
if はブロックを取らない
勝手に変な書き方すんな
468デフォルトの名無しさん:2007/12/30(日) 01:39:40
>>466
制御構文はプログラミング言語の基本中の基本
いくら初心者スレとはいえ、これくらいは自分で何とかしてくれないか
469デフォルトの名無しさん:2007/12/30(日) 02:46:06
>>466
お兄さん、全然書き方ちゃうよ

Rubyリファレンスマニュアル - 制御構造
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%A9%B8%E6%B9%BD%C2%A4

オブジェクト指向言語Ruby - チュートリアル: Rubyの基礎
http://www2.ruby-lang.org/ja/20020312.html

これみて、勉強しる
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
472デフォルトの名無しさん:2007/12/30(日) 04:00:38
むしろ h は何のつもりだったのか知りたい

@h と h は別モンだってのはたいていの解説にも書いてあると思うんだが
473デフォルトの名無しさん:2007/12/30(日) 04:04:30
あはは。
@付けないといけないんですね。
どうもありがとうございました。
474デフォルトの名無しさん:2007/12/30(日) 10:32:44
スクリプト内で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
475474:2007/12/30(日) 12:15:48
自己解決しました。
すいません、マニュアルを穴があくほど読んだら理解できました。
476デフォルトの名無しさん:2007/12/30(日) 21:57:26
階層構造やファイルを含んだディレクトリを移動させるにはどうしたらいいですか?
477デフォルトの名無しさん:2007/12/30(日) 22:24:52
ふつうにrequire 'fileutils' (&include FileUtils)して対象ディレクトリを
mvすれば中身ごと移動します。
WindowsだとUNIX系みたく簡単に移動できないのかもしれんが。

478デフォルトの名無しさん:2007/12/30(日) 22:29:24
ファイルシステムまたがってても大丈夫なん?
479デフォルトの名無しさん:2007/12/30(日) 22:55:08
Dirでリスト作ってイテレーターで回してコピーした方がいいですか?
480デフォルトの名無しさん:2007/12/30(日) 22:57:12
>>478
大丈夫
まずは試してみようよ
481デフォルトの名無しさん:2007/12/30(日) 23:11:37
>>477
おお.こんな便利なモジュールがあったんですね.
ありがとうございます.
482デフォルトの名無しさん:2007/12/31(月) 04:58:56
>>474
解決したら、解決策を書いていくのがせめてもの礼儀というもの
483451:2007/12/31(月) 16:13:39
レスありがとうございます

>>454
今,at_exit{}を入れて確かめてみています.
hpricotやmechanizeのバグだとしたら,初心者の私にはお手上げですね…

>>465
メモリは4G積んでいますし,メモリを余り食わないように改良してもダメだったので
大丈夫だとは思うのですが。。。。
OSに殺されている可能性については,考えていませんでした.
対処するとしたら,一度に動かすのではなく,分割して動かすのが良いんでしょうか?
484デフォルトの名無しさん:2007/12/31(月) 20:26:37
プログラム初心者なくせにrubyをやりたいと思ってるアホですが、
phpみたいな事ってrubyで出来るのですか?
485デフォルトの名無しさん:2007/12/31(月) 21:10:01
>>484 できます。
486デフォルトの名無しさん:2007/12/31(月) 21:25:07
>>483
linux には OOM killer なる仕組みがあって、メモリが足りなくなると
プロセスが勝手に殺されるそうな。「強制終了」なるメッセージは
コンソール(bash?)がそれを受けて出力してるんではないかと思う。
まずは実行中に top コマンドとかでメモリ使用量を確認してみたら?
# 調べた結果、メモリが関係なかったらごめんなさい
487デフォルトの名無しさん:2007/12/31(月) 21:36:20
>>484
無理です
488デフォルトの名無しさん:2007/12/31(月) 21:45:25
>>484
>phpみたいな事ってrubyで出来るのですか?
php みたいに「お手軽」にできるかどうかは、持ってる基礎知識によって違うので
一概に「できる/できない」とは言えない。
php な人が
「Ruby はインストールしてからブラウザに "Hallo, world" を表示するのが大変。
 php なら簡単にできるのに!」
というのはときどき聞く。
Ruby は Web に特化した言語じゃないから、下準備は多少手間がかかると思った方が良い。
そこを乗り越えたらできる事は、まあ変わらんのじゃないかな(好みの問題はあるだろうが)。
489デフォルトの名無しさん:2007/12/31(月) 22:11:22
490デフォルトの名無しさん:2007/12/31(月) 22:14:46
↑ミスしちゃったw
>>485
>>487
>>488

ありがとー
今rubyインストールしてみた
色々インストール…Hello World表示させてみたけども、phpは手軽だねー
rubyってサーバーにrubyがインストールされていたら使えるのかな?

よくわかんないが、面白そうw

何からやろうかねぇ・・・・・・・・
491デフォルトの名無しさん:2007/12/31(月) 22:27:41
>>490
PC売る
492デフォルトの名無しさん:2007/12/31(月) 23:57:47
>>488
phpみたいなことするなら、フレームワーク使うと楽。

・まずRuby on Rails。最も人気で、Rubyの代表的なフレームワーク。
日本語の本もある。2chに専用スレあり。
Ruby on Rails
http://www.rubyonrails.org/

・why氏作成のRails似のフレームワーク。
しかし、コアのソースは4kbしかない(コメント除く)
フレームワークの勉強用にもお勧め。
つっても、ActiveRecordとかテンプレートエンジンは、つかってるけどな。

Camping, the Documentation ≫ File: README
http://camping.rubyforge.org/files/README.html

・巨大なフレームワークいらねえ!とりあえず、phpみたいに、
ブラウザにすぐ表示したいんじゃー!!って人は、
Sinatraおすすめ。

Classy web-development dressed in a DSL
http://www.xnot.org/sinatra/
493デフォルトの名無しさん:2008/01/01(火) 00:00:50
つづき

・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以外は、要注意。
494デフォルトの名無しさん:2008/01/01(火) 00:14:21
うぉ 親切に・・・。
まじでありがと!!!

Railsやってみるよ

まず、rubyの基本覚えなきゃw まだ何もしてねぇ…。

Rubyって重いのか…。
んー… phpのがいいのかねぇ…
でもphp人気すぎなような気がして…。

phpでは送信者部分に文字化けが出るけども、メール送信できる程度のプログラムは出来る・・・。
一応確認画面とかは作れたりする
495デフォルトの名無しさん:2008/01/01(火) 03:09:26
>>494
ブラウザに"Hello, world!"だったら
eRuby(HTMLなどのテキストファイルにRubyコードをうめこむ)
がいいんじゃないかな?

たとえば
<html><body>Hello, world</body></html>


あれ?
496デフォルトの名無しさん:2008/01/01(火) 17:32:46
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

497デフォルトの名無しさん:2008/01/01(火) 18:18:13
そのリファレンスのすぐ下に書いてあるけど、こういうこと?

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]]
498デフォルトの名無しさん:2008/01/01(火) 18:26:28
>>497
解決しました、ありがとうございます。
リファレンスよく読まずに質問してすみませんでした。
499デフォルトの名無しさん:2008/01/01(火) 20:21:22
ほんとに初心者っぽい質問で申し訳ないんですけど

findメソッドを使ってレコードを取りだそうとすると
いつも「#」とだけ表示されてしまいます。

なぜでしょうか?
誰か分かるひと教えてください。

使っているデータベースはSQLite3です。
500デフォルトの名無しさん:2008/01/01(火) 20:28:41
>499
再現コードうp
501デフォルトの名無しさん:2008/01/01(火) 20:34:13
そのfindってActiveRecord? バージョンは?

バージョン2.0以前のARは、
そのまんま印字しても #<Hoge:0x111111> とかだから、
HTMLに出力すると#だけになる。
502499: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が存在しないと、エラーが表示されるので、おそらくデータベースにあるデータを読み込んではいるけれど
それを記述する段階で何か問題が起こっているのだと思います。
コード公開するのも恥ずかしいような初学者なので申し訳ないです。。。
503デフォルトの名無しさん:2008/01/01(火) 22:16:41
@usersの前に h って書いてみなよ。

ARのバージョン確認のしかたは
gem list
で見られるだろ
504デフォルトの名無しさん:2008/01/01(火) 22:17:18
見るだけなら、HTMLを書かずとも、
ruby script¥console として、
>> User.find...
を実行してみればいい。

HTMLで確認したければ、
<%= debug(@users) %>
とすれば、見かけはともかく確認できる。

あと、h1要素にするのはやめとこうぜ。

505499:2008/01/01(火) 22:29:22
>503
ありがとうございます!
gem listで確認したところActiveRecordはver2.0.2を使っています。
けれどHTMLでは#としか出力されません。
あとh@usersと記述してみたんですが、これまた上手く行きません。。。

>504
ありがとうございます!
script\consoleでは確認できました!
HTMLで<%= debug(@users) %>と記述し出力してみたところ
一応レコードは取り出されたんですが余計な文字がいろいろ。。。

レコードだけをHTMLで表示させるにはどうしたらいいんでしょう。



質問づくしでごめんなさい。
あとRailsの質問なのに答えていただいて本当申し訳ないです。
506デフォルトの名無しさん:2008/01/01(火) 22:43:16
あ、スマソ、2.0系でも
#<Hoge id: 1, ....>
のようになるだけなので、やっぱり#の後ろは(HTMLのタグと誤認されるため)
表示されないね。

綺麗にレイアウトした表示が欲しいなら

<ul>
<% @users.each do |user| -%>
<li><%= h user.name %></li> ←nameじゃないなら変えて。
<% end -%>
</ul>

などとループ組んで(or 部分テンプレート)HTMLとしてそれなりに整形しないと。
507499:2008/01/01(火) 22:56:32
>506
おーーーできました!ありがとうございます!
ただ表示させるだけじゃなくて、もっと難しいことに応用する段階になったら
問題でてくるかも知れないですが、とりあえずこれでやってみます!

スマソなんてとんでもないです。ありがとうございました
508デフォルトの名無しさん:2008/01/01(火) 23:18:11
HTMLわからんでwebアプリケーション作ろうとかマジ勘弁してくれ
開発環境やフレームワークは基礎知識を補助しない
509499:2008/01/01(火) 23:28:00
>508
ごめんなさい。。。
基礎から学びます。
510デフォルトの名無しさん:2008/01/02(水) 00:05:11
Webアプリは前提知識が多すぎて今からやる人は
つらいだろうな。不特定多数が使うものだからセキュリティも
気をつけないといかんし。

この場合、Viewがホワイトリストになっとけばよかったわけだが
いつなるんだっけ。
511451: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の中のメタ文字を\でリテラルにしたいのです。
513デフォルトの名無しさん:2008/01/02(水) 02:09:37
Regexp.escape
514デフォルトの名無しさん:2008/01/02(水) 02:21:58
>>511 じゃないんすけど、こういう、カーネル??のエラーでおとされた場合、
エラーログってはかれるんすかね?
dmesgとかで見られるんかな?
515デフォルトの名無しさん:2008/01/02(水) 02:24:53
ありがとうございます.
516デフォルトの名無しさん:2008/01/02(水) 02:47:31
>>512
細かい話かも知れんが「リテラル」の意味履き違えてないか?
いや、文脈から言いたいことは充分伝わる文章だから
質問自体には文句はないんだが…
517デフォルトの名無しさん:2008/01/02(水) 03:09:03
File.readでUTF-16LEのテキストファイルを読むと、
『級』という漢字のある所で行が飛んだり、読み込みをストップしたり,
動作がおかしくなるんですが、こんな症状が出ている人居ますか
518デフォルトの名無しさん:2008/01/02(水) 03:15:42
>>516
英語のリテラルの意味に一語一語のとか文字通りという
意味があるので、便宜的にリテラルという語を使ってしまいました。
ソースに書かれた語などの意味とは違うかもしれません。
こういう場合はなんと言えば良いんでしょうか?
519デフォルトの名無しさん:2008/01/02(水) 03:22:23
>>517
文字コード指定してファイル開いてる?
520デフォルトの名無しさん:2008/01/02(水) 03:40:55
>>518
自分でも言ってる通りメタ文字でいいと思う。
正確に言いたかったら正規表現の、とか但し書きつければ
521デフォルトの名無しさん:2008/01/02(水) 04:08:38
>>519
文字コードを設定してファイルを開くにはどうしたらいいんでしょうか?

522デフォルトの名無しさん:2008/01/02(水) 07:27:29
>>519
それRuby1.9の話じゃない?

>>517
行が飛ぶといわれてもなんのことかわからない
まず具体的なコードを見せて
523デフォルトの名無しさん:2008/01/02(水) 09:15:50
(や+が正規表現で特殊な意味を持つ文字という意味なら
Regexp.quote(文字列)
524523: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が読み込まれません。
回避するにはどうしたらいいのでしょうか。
526デフォルトの名無しさん:2008/01/02(水) 17:59:49
>>525
522 じゃないが。
リファレンスを見ると、Ruby は euc, sjis, utf-8 でしか日本語を扱えなそうに見えるんだが。
参照
Ruby の起動 コマンドラインオプション -Kc の項
FAQ 日本語の取り扱い
527デフォルトの名無しさん:2008/01/02(水) 18:02:09
>>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あたりにコンバートしないとダメですかね?
529デフォルトの名無しさん:2008/01/02(水) 18:53:34
Rubyのバージョンは? ruby -v
530デフォルトの名無しさん:2008/01/02(水) 19:03:47
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]

です。
532デフォルトの名無しさん:2008/01/02(水) 19:54:31
File.open('c:\test.txt', "rb")じゃないのか
533デフォルトの名無しさん:2008/01/02(水) 20:27:08
なるほど。バイナリモードなら開けますね。
ただし、改行がおかしくなりますが・・・
534デフォルトの名無しさん:2008/01/02(水) 20:57:19
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

を組み込むとなんとかなりました。
少々ゴテゴテしてますが、この方法で良いのでしょうか?
536デフォルトの名無しさん:2008/01/02(水) 21:36:32
今までCSVの処理をExcel VBAでやってたので
正月休みを利用してRubyに移植するべぇと張り切っているのですが
正直、処理速度の遅さにびっくりしてます

掛け算2桁万回して、結果をカンマ区切りのテキストに書き出すだけで
VBAと同程度の時間(5秒程度)待たされます
ちと、期待しすぎてたか・・・
537デフォルトの名無しさん:2008/01/02(水) 21:45:06
兄さん、とりあえずコード晒せや
538デフォルトの名無しさん:2008/01/02(水) 22:02:42
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
539デフォルトの名無しさん:2008/01/02(水) 22:05:05
2桁万回して
540デフォルトの名無しさん:2008/01/02(水) 22:53:29
no implicit conversion from nil to integer (TypeError)

というエラーが出ます。
どんなことを疑ってみればいいですか?
うpします。
http://www.uploda.org/uporg1185358.zip.html

ruby main.rb
で動かしてエラーが出ます。
541デフォルトの名無しさん:2008/01/02(水) 22:56:58
>>536
いや、そもそもRubyは遅いって…

こんなんもあったけど
ttp://devlog.moonwolf.com/20070920.html
542デフォルトの名無しさん:2008/01/02(水) 23:07:46
VBAとRuby・・・選択眼に脱帽
543デフォルトの名無しさん:2008/01/02(水) 23:07:55
数十スレ前に初心者の1.9使用は厳禁とか言われてたけど、1.9使ってNERVだかラルクだかを使ってみたら?
544デフォルトの名無しさん:2008/01/02(水) 23:16:11
>>540
とりあえず落としてみたが main.rb が読めない。圧縮失敗?
それとも main.rb は Ruby インタプリタの脆弱性を狙ったトロイか何かなんだろうか。
545デフォルトの名無しさん:2008/01/02(水) 23:24:25
>>540
integerが期待されている場所で、値がnilになっているためにエラーとなっている。
例えば
arr = [10, 20, 30]
i = nil
print arr[i]  #=> TypeError: no implicit conversion from nil to integer
エラーには行番号も表示されるはずだから、その行を見ればよい
546デフォルトの名無しさん:2008/01/02(水) 23:26:06
「二年間Railsで開発したあとPHPに戻った七つの理由」
1. Ruby/Railsでできて、PHPでできない事……(考え中)……ないね。
2. 会社のみんなはPHPに慣れている:統合のコストを過小評価しないこと!
3. ほしくないものは要らない
4. PHPは小さくて速いよ
5. PHPは私の好みに合っている
6. SQL大好き
7. プログラミング言語はガールフレンドみたいなもの: 新しいほうが良い、なぜなら*貴方*が良くなっているから

http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html
547デフォルトの名無しさん:2008/01/02(水) 23:39:36
>544
main.rbは、その名に反して、tar.gzみたいな。
main.rb(.tar.gz)を展開しても、main.rb~とかもろもろ出てくるけど、
肝心のmain.rbは出てこないけど。
548デフォルトの名無しさん:2008/01/02(水) 23:40:32
>>544>>545
すいません、main.rbはバグりました。
途中で書き直したので、使われていない変数が入っていたようです。
解決しました。

今、なぜこのような事が起こるのか分からないのですが、

a = [[-4, 5], [3, 2]]
a.sort do |a,b|
b[0] <=> a[0]
end

=> a = [-4, 5]

となりました。
今やらないといけないのは、ネストされた配列で、一番目の要素で降順(大きい順)
に並び替える事です。
どうすればいいのでしょうか?
549デフォルトの名無しさん:2008/01/02(水) 23:43:30
さきほどのプログラムの再うpです。
どうもmoveのところにおかしいところがあるらしく、
このロボットはまともに動いてくれません。
550デフォルトの名無しさん:2008/01/02(水) 23:44:55
ごめんなさい、おっちょこちょいで;;

http://www.uploda.org/uporg1185434.zip.html
551デフォルトの名無しさん:2008/01/02(水) 23:46:06
>>535
何でUTF16なの?自分の環境にあった漢字コード使った方が楽だよ
552デフォルトの名無しさん:2008/01/02(水) 23:47:42
>>548
a.sort! do |a, b|
b[0] <=> a[0]
end
=> [[3, 2], [-4, 5]]
a
=> [[3, 2], [-4, 5]]
出来てるけど
553デフォルトの名無しさん:2008/01/02(水) 23:49:01
あ、破壊メソッドを使わないといけないのかな?
554デフォルトの名無しさん:2008/01/02(水) 23:50:49
えーと、ruby1.8のスコープの罠がひとつ、
あとはsortが非破壊メソッドであることがひとつ。
aa = [[-4, 5], [3, 2]]
aa.sort! do |a,b|
b[0] <=> a[0]
end
555デフォルトの名無しさん:2008/01/02(水) 23:51:18
あれ・・出来ない・・・

a.sort! do |e1, e2|
にしたら出来ました。どうやら同じ名前を使ってはいけないのかな・・・
556デフォルトの名無しさん:2008/01/02(水) 23:53:48
http://www.uploda.org/uporg1185457.zip.html

これ実行してもらえます?
どっちでも
[-4, 5]になる・・・
557デフォルトの名無しさん:2008/01/02(水) 23:55:50
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

最後のしかうまく行きません。
558デフォルトの名無しさん:2008/01/02(水) 23:56:33
> にしたら出来ました。どうやら同じ名前を使ってはいけないのかな・・・

YES。ブロック内で、外にあるのと同じ変数名つかうと、そっちを上書きしてしまう

でよいよね?
559デフォルトの名無しさん:2008/01/02(水) 23:58:30
>>557
それぞれの違いを理解しましょう。

・a.sortでは、aの値は変わりません。a.sort!を使うと、aが変わります。
・ブロック内(sort do end)では、ブロック外の同名の変数が置き換わります。
560デフォルトの名無しさん:2008/01/03(木) 00:31:08
まあ、その、ブロック引数のスコープは、1.9では直ってるけどね。
1.9は1.9で大いに問題があるわけで。このスコープだけバックポートされて
こないかなー、無理だろなー
561デフォルトの名無しさん:2008/01/03(木) 00:31:10
>>542
だって、お手軽なんだもの・・・自分でも悲しいっすよそりゃ
562デフォルトの名無しさん:2008/01/03(木) 00:31:49
結論:Cで書け
563デフォルトの名無しさん:2008/01/03(木) 01:00:39
つーか、ホントにスクリプト部分がボトルネックなの?
564デフォルトの名無しさん:2008/01/03(木) 01:16:34
速度無視で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で書き込まれません。
どうしたらいいのでしょうか?
567536:2008/01/03(木) 04:59:32
やったー!うっごいたぁー!
移植ということでLogicで困るところはなかったものの、
仕事で使うプログラムだったので安心しました

実は実質的にRuby初挑戦だったんですけど、
(正規表現関係で日本語コネるのにちょっと使ったことはあったんですが)
頭の中でのClassの設計に半日
あとは特に書きよどむことなく、すらーっと進みました
とにかく動いてくれるんで、心地よかったですね

まだまだブラッシュアップの余地ありありですけど
速度面でもトータルではさすがにExcel VBAよりは早かったです

うん、久々に心地よい(半)徹夜だったな
568デフォルトの名無しさん:2008/01/03(木) 05:25:38
>>567
結局どういう対策をとって早くなったんだよ
質問しておいて勝手に納得されても困る
569デフォルトの名無しさん:2008/01/03(木) 10:56:58
>>561
お手軽ならpythonも選択肢に入れてみれば?
570デフォルトの名無しさん:2008/01/03(木) 12:51:11
RubyとPythonってどっちがいいの?
571デフォルトの名無しさん:2008/01/03(木) 13:02:44
>>570
ん? どっちでもいいよ。

(´-`).oO(初心者スレだからって、こんな質問ないよなぁ...)
572デフォルトの名無しさん:2008/01/03(木) 13:02:43
Rubyは内包表記がないから糞
573デフォルトの名無しさん:2008/01/03(木) 13:16:21
どっちにしても信者とアンチがうざいからプログラマをやめるのが一番気楽
574デフォルトの名無しさん:2008/01/03(木) 13:18:24
JRubyとMatz' Rubyってどっちがいいの?
575デフォルトの名無しさん:2008/01/03(木) 15:46:31
>>568
対策はしてないです
大量の掛け算は処理のごく一部なんです
処理全体ではRubyの勝ちだったってだけです
計算は特に遅かったりなんてするのでしょうか?

動作テスト・負荷テストにも無事耐えてくれました
ExcelVBAで2分程度かかってた処理が30秒ほどで終わるようになりました

実のところ処理速度がどうのって言うわけではなく
会社がOSをVistaにするとかで、Officeも最新Verになりそうで
動作検証とか面倒だし、なによりちゃんと動いてるので
これから5年でも10年でも使って楽したい一連の処理ってこともあり
移植を経験しておきたかったのです

初心者というより、低スキルな者ですが
とにかく動くものが作れたので楽しかったです
576デフォルトの名無しさん:2008/01/03(木) 18:43:23
end
end
end
と書いた自分がいて
end #if
end #def
end #class
ってしとけば、わかりやすいじゃないか!
と素で大喜び、いやオレって天才!状態だった
信じてほしい、本当に自分で発見したんだ

・・・オレは何に負けたんだろう
577デフォルトの名無しさん:2008/01/03(木) 18:52:19
ちなみに、一番最初は
end #これは、クラス設定最後の「end」
とまで書いたんだ

これを
end #class
と略した自分に
神が降りた!とまで思ったんだ・・・
578デフォルトの名無しさん:2008/01/03(木) 18:57:27
>>577
デスマ脳ではよくあること。
コメント書かなければタイプする量が半分!つまり二倍速くプログラムが書ける!とか思っちゃうのも必ずデスマ初心者が通る道。
579デフォルトの名無しさん:2008/01/03(木) 19:24:53
>>574
Matz' というか、CRuby な。
JVMの上で動かしたい積極的な何かがあるのでなければ、
とりあえずCRubyでいいと思われ。
580デフォルトの名無しさん:2008/01/03(木) 21:49:56
漏れはifでend書くのをよく忘れるな
581デフォルトの名無しさん:2008/01/03(木) 21:56:39
doをよく忘れる。
582デフォルトの名無しさん:2008/01/04(金) 00:23:51
thenって書いてる人いるの?
583デフォルトの名無しさん:2008/01/04(金) 00:27:18


ただしifかunlessのときだけ。case〜whenではthenを書かない
584デフォルトの名無しさん:2008/01/04(金) 00:28:20
僕は必ずthenを書いている...とか書いたら特定されたりしてw
585デフォルトの名無しさん:2008/01/04(金) 01:05:18
俺も if elsif unless when どれも then 書く。
586デフォルトの名無しさん:2008/01/04(金) 01:34:18
BASICの頃から、if then文としてセットだなぁ
587デフォルトの名無しさん:2008/01/04(金) 05:06:13
if でうっかり { } 使って
エラー見て気付く orz
588デフォルトの名無しさん:2008/01/04(金) 06:15:19
>>587
ブロックを { } で書くから、さすがにそれはないな。
でも、人のソースを見ると、ワンライナー以外ほとんどが
do end でブロックを書いててちょっと不安。なんか、合理的な理由があるの?
結合強度が違うというのは分かるんだが…
589デフォルトの名無しさん:2008/01/04(金) 07:04:29
俺的には統一感の問題かな。
殆どのブロック的要素が end で終わるのに
ブロック付き呼出だけブレースってのに違和感がある。

ワンライナっつーか、呼び出した結果
戻り値を使いたい場合はブレース使うけど。
590デフォルトの名無しさん:2008/01/04(金) 08:21:56
ワンライナーでも do; end; 使ってる
591デフォルトの名無しさん:2008/01/04(金) 11:04:13
条件がめちゃくちゃ短くて、then節が長くて改行が必要なときは
thenをつけると綺麗な気がするな。多様性最高。
592デフォルトの名無しさん:2008/01/04(金) 11:18:08
>>514
カーネルのエラーではないので dmesg などには出ないね。
UNIX 系 OS ならプログラムが死ぬときに core ファイル (ruby.core など) が
できる (パーミッションや設定によってはできない) ので、
それを GDB などのデバッガにかけてデバッグする。
593デフォルトの名無しさん:2008/01/04(金) 22:17:52
thenはぜんぜんつけないなぁ。
594デフォルトの名無しさん:2008/01/04(金) 22:19:12
吹雪の到来
595デフォルトの名無しさん:2008/01/04(金) 22:28:32
変数の命名とかに規則はありますか?
596デフォルトの名無しさん:2008/01/04(金) 23:33:48
変数名に淫語使うの禁止。
597デフォルトの名無しさん:2008/01/04(金) 23:53:49
繰り返し変数i, jの代わりにtinko, mankoを使っている人はいますか?
598デフォルトの名無しさん:2008/01/05(土) 00:13:03
func(i) を func(num) と書き直すシャイな漏れ
599デフォルトの名無しさん:2008/01/05(土) 00:21:28
すいません。教えてください。
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

みたいな感じにしたいです。
600デフォルトの名無しさん:2008/01/05(土) 00:47:49
すいません。自己解決しました。

eval(module_name)::f

それにしてもevalみたいな便利メソッドがあるとはRuby恐るべし。
601デフォルトの名無しさん:2008/01/05(土) 01:25:33
evalは万能すぎるので、Object.const_get(module_name)も検討されたし。
602デフォルトの名無しさん:2008/01/05(土) 17:14:12
>>575
つまり、Ruby遅いとか、VBA並みだと言っていたのは、測らず言っていただけなのな
とりこしぐろうだったわけだな

>>588-590
一行で収まるときは、{}で、複数行の時は、do endにしてる
603デフォルトの名無しさん:2008/01/05(土) 17:19:13
evalのない言語のほうが恐ろしい
604デフォルトの名無しさん:2008/01/05(土) 18:02:22
俺の使ってる大抵の言語にはevalはないなあ。
しかし、evalぐらいで驚愕している600が一番恐ろしい。
605デフォルトの名無しさん:2008/01/05(土) 18:05:52
>>595
階級や何年何組のクラスをclassという変数に格納できないのは意外と辛い
startという変数は存在できるのにendという変数が存在できないのも意外とイラつく

あー規則ね
ローワーキャメルケースかアンダースコア区切りかっていうのはどっちかに主流が収束する気配はないので勝手に殴り合いでもして決めろ
arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺
@dataというインスタンス変数をひとつ作るごとに鞭打ち100回
runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑
606デフォルトの名無しさん:2008/01/05(土) 18:10:49
1000回くらい死んでそうだが

>>604
いちばん最初にevalの機構を知ったときは感動した
elispだったかな
余談だけどGoogleは「elisp」で「Emacs Lisp」を、「clisp」で「Common Lisp」を表記揺れ検索してくれる模様
ttp://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=eval+elisp&num=50
607デフォルトの名無しさん:2008/01/05(土) 18:16:09
質問です。
File.openとFile.newの違いはなんでしょうか?
それとも違いなんてなくて、ただのエイリアスですか?
知ってる方いたら教えてください。
608デフォルトの名無しさん:2008/01/05(土) 18:19:35
>>605
runの便利さは認めるべき
609デフォルトの名無しさん:2008/01/05(土) 18:23:16
openはブロック付きにすると動作が変わるよ。
610デフォルトの名無しさん:2008/01/05(土) 18:24:07
>>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
611607: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使ったらスレッドセーフになるかな?



612607: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"

614デフォルトの名無しさん:2008/01/05(土) 20:22:31
つ 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."

# 三番目に近い形はうまく行きませんでした.
616デフォルトの名無しさん:2008/01/05(土) 21:36:58
RPGつクールで触ったんですが、このルビィーという言語スクリプトは、ものすごく見づらいし紛らわしいですね
C++言語をメインにする私には耐えられないものがありましたが、みなさんよくやっておられて感心いたしました
617デフォルトの名無しさん:2008/01/05(土) 21:47:45
どぞー
Rubyについて(アンチ専用) Part001
http://pc11.2ch.net/test/read.cgi/tech/1190559748/
618デフォルトの名無しさん:2008/01/05(土) 23:00:17
>>605
1. arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺
2. @dataというインスタンス変数をひとつ作るごとに鞭打ち100回
3. runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑

何で? どれ一つ理由が分からん。
619デフォルトの名無しさん:2008/01/05(土) 23:38:43
605じゃないが
2. 継承先で困る
3. 外からアクセスされないオブジェクトって…

とかかな。
620デフォルトの名無しさん:2008/01/05(土) 23:43:38
横から推測だが
1. については、「ラベルにはその内容をこそ書け」ってことじゃあるまいか
例えば
ノートの表紙にいちいち「〜〜〜のノート」と書いてあったり
PCに貼る管理シールに「〜〜デスクトップPC」と書いてあったり
バインダーのラベルに「〜〜バインダー」と書いてあったら
いい加減アフォかと思わんか? ってことじゃなかろーかと
621デフォルトの名無しさん:2008/01/05(土) 23:45:49
1は引数は例外にしてほしいな…
622デフォルトの名無しさん:2008/01/05(土) 23:58:12
> 1. arrayとかhashとかstrとかのデータクラスを示す言葉が変数名に入ってたら即射殺

ちゃんと、名前つけろってことかと。
型じゃなくて、その変数の意味をかけと。
arrayとかつけてて、そこにコメントなんか書いてたら、>>605にぶっとばされると思う

> 2

上と同様。dataって、iとかjとかkとかつけるのと変わらん

> 3. runというメソッドを作ってHoge.new.runの1行だけで実行してたら絞首刑

なんでもオブジェクトにすんなってことだろう、たぶん
属性も操作もないのに、関数でいいじゃんていう


俺は、言っている意味はわかるよ
623618:2008/01/06(日) 00:01:00
>620
なるほど。
自分も >621 みたいにメソッドの仮引数はこう書くことが多いんだが

def foo(str, pattern)
 str =~ pattern
end

「ラベルにはその内容をこそ書け」という観点なら
問題ないよね?

>619
ああ、それなら分かる。
自分の場合は rdoc を見るだけで使っているインスタンス変数が
分かるように必ず attr_reader とかで宣言してる。
624デフォルトの名無しさん:2008/01/06(日) 00:39:58
>>622
>属性も操作もないのに、関数でいいじゃんていう
その主張はカプセル化(隠蔽)の概念を無視している
625デフォルトの名無しさん:2008/01/06(日) 00:44:56
str =~ /ほげほげ/

は本当にstrという3文字の変数名ならやっぱ殴られると思われ
=~ の左辺(右辺でも可)がStringなのは当たり前だろと
ナニの文字列からどんな正規表現で文字列を抜き出すのかわかるような変数名にしろと
何のために変数名に大文字小文字数字アンダースコア全部使えるようになってんのかと

まあどれだけ重要なスクリプトなのかにもよるけどな
1日くらいで完成してメンテも1年先に見直すかどうかわからん程度のスクリプトにそんなん求めても疲れるだけだし

でも初心者スレだから最初から悪い癖は抜いといたほうがいいのかもとも思う
str1,str2,str3という変数名しかつけられなくなったプログラマはいないわけではないし
626デフォルトの名無しさん:2008/01/06(日) 00:47:37
>>624
いや、その場合、カプセル化の必要ないよね?
627デフォルトの名無しさん:2008/01/06(日) 00:48:41
Hoge.new.run は
「ていうかインスタンス作る必要なくね?モジュールでいいじゃん?」
というツッコミが入る定番ネタだな
628デフォルトの名無しさん:2008/01/06(日) 00:48:54
629デフォルトの名無しさん:2008/01/06(日) 00:57:54
htmlとhtmを巧みに使い分けてる俺最強
630デフォルトの名無しさん:2008/01/06(日) 02:26:54
urlは文字列でuriはURIのインスタンスに使い分けることに今日決めた
631デフォルトの名無しさん:2008/01/06(日) 11:31:34
>>612
つMutex

> rubyの排他制御ってプロセス間の排他制御がなされるだけなので

そりゃファイル関係のロックは普通プロセス単位だからな。
632デフォルトの名無しさん:2008/01/06(日) 11:41:14
>>627
ライブラリとしてもメインスクリプトとしても使えるようにしたいときに
if $0 == __FILE__ の中で使ったりというのは、ときどきやる。
633デフォルトの名無しさん:2008/01/06(日) 12:21:06
そしてifの中身がHoge.new.run
634624:2008/01/06(日) 12:44:46
>>626
クラスにしないとプライベートメソッドが使えないじゃないか!
と思っていたがそれは勘違いだった

関数ですむところをわざわざクラスにする利点は
一度作ったHogeインスタンスを使いまわせることだな
テストのときに便利
635デフォルトの名無しさん:2008/01/06(日) 14:56:12
やたらいろんな種類のCSVファイルのフォーマット変換しなきゃなんなり、
継承使って、元フォーマットと目的のフォーマットを返すメソッド用意すれば、
勝手に変換できるようなベースクラスを作り、
変換ごとにクラス作って、
どのファイルをどのクラスで処理するかを配列につっこんで、
ループ回してファイルをクラスに渡して処理させたんだ。

そのループの中身が
Hoge.new.run
みたいなもんなんだが、これも駄目か?

636デフォルトの名無しさん:2008/01/06(日) 14:58:32
要するにケースバイケース
637デフォルトの名無しさん:2008/01/06(日) 20:04:48
>>635
なるほど、クラスの機能を使って、拡張したため、そうせざるを得ないというわけか。
まあ、おれなら、みっともないから、関数のラッパー書くがな
638デフォルトの名無しさん:2008/01/06(日) 20:22:02
Rakeの実装見て感心したから
大きいアプリケーションはあんな感じするようになった。
639デフォルトの名無しさん:2008/01/06(日) 20:32:51
Rakeはわりと参考になると思う
初心者脱却できそうかなあというときに読んでみるといい
640デフォルトの名無しさん:2008/01/06(日) 20:40:47
そうか、おれもRake読んでみるよ
そういや、前に、Railsのソース読んでて、頭ひっくり返っておもしろかった覚えが
641デフォルトの名無しさん:2008/01/06(日) 20:41:47
といいつつ、聞いてみるんだが、どの辺注意してみるべきかな?
DSLってことじゃないよね?
642デフォルトの名無しさん:2008/01/06(日) 20:50:51
>>635
その説明だけではよく分からんが
あんまりクラスにする必要はないんじゃないかと思う
643デフォルトの名無しさん:2008/01/06(日) 23:17:39
>>641
アプリケーションオブジェクトをキャッシュしてるあたりとか。
あれ多分、マルチスレッドで使われたときにオブジェクトいくつも作らないためだと思うんだけど
自信はない。

あと、自分はアプリ表すクラス作って
Hoge::Application.new(config).run
とかはわりと賛成。
アプリって、たいがい状態と自己同一性を持ってて、外からの呼びかけに反応する
もののような気がするし。

644デフォルトの名無しさん:2008/01/07(月) 00:01:13
>>637,642
入力CSVファイルが25種類、出力CSVファイルが5種類ぐらい
それぞれフィールド入れ替え+文字列変換など。
ヘッダ行があったり無かったり。たまに1個のファイルが複数の出力ファイル。
開いてフォーマット調べて変換方法を切り替えるというのもある。
という感じ。

Rakeみたいな感じで書けるようにする方がいいかなぁ。
645デフォルトの名無しさん:2008/01/07(月) 00:55:59
zipアーカイブなどを扱うクラスってありますか?
646デフォルトの名無しさん:2008/01/07(月) 01:55:29
はい。
647デフォルトの名無しさん:2008/01/07(月) 02:40:11
ほのぼのrake
648デフォルトの名無しさん:2008/01/07(月) 09:17:09
囚人が使うRubyは、やっぱ知っておかないと犯罪に巻き込まれちゃう品。
今まで存在は知ってたけど無用と思ってたけどやらないと。

ああなんで無駄な知識を詰め込まないといけないのか。
649デフォルトの名無しさん:2008/01/07(月) 09:18:05
Rubyを知っておくと、刑務所でヒーローになれたり早く出所できるかもしれない。
650デフォルトの名無しさん:2008/01/07(月) 09:24:04
>>649
やくざに就職できちゃうな。
 
651デフォルトの名無しさん:2008/01/08(火) 14:20:16
書き方の話題といえば、Hashのキーはシンボルで書くように癖つけたほうがいいのか
素直に文字列で普通にすればいいのかの論争は今のところどっちが優勢?

str_hash={'name'=>'だれそれ', 'age'=>18, 'sex'=>'週に3回'}
sym_hash={:name =>'だれそれ', :age =>18, :sex =>'週に3回'}

puts sym_hash['sex'.intern]
週に3回

Hashに大量にアクセスする場合は毎回String#internしてるのが面倒だなと思うんだけど
652デフォルトの名無しさん:2008/01/08(火) 14:27:53
ぶっちゃけどっちでもいいと思う。でも、玄人っぽくするためには
シンボルでいいんじゃね。
1.9からは
{ name: 'だれそれ', age: 18, sex: :male }
なんて書き方も出来るようになるわけだしさ。Object#methodsもシンボルを
返すように変更された。
653デフォルトの名無しさん:2008/01/08(火) 14:28:52
文字列のほうが素直で普通なの?
654デフォルトの名無しさん:2008/01/08(火) 15:07:14
素人質問ですが、シンボルもどこかでシンボル文字列のマッチしてたりしませんかね?
ベンチマーク結果で明らかにシンボルのほうが速いのなら、それはそれで構わないのですが…
655デフォルトの名無しさん:2008/01/08(火) 15:35:24
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が作られてしまうのが気持ち悪いのだろう
656デフォルトの名無しさん:2008/01/08(火) 16:12:25
Symbolは昔は単なる整数だったんだよな
657デフォルトの名無しさん:2008/01/08(火) 16:43:36
今でも内部的にはそうなのかな。

俺はシンボルってのは識別子に近いモノだと思ってる。
だから、フィールド名や名前付き引数(もどきのハッシュ引数)の名前として
Rubyの中で完結した用途で使うのは良いと思うが
Rubyの外とやりとりするようなモノには使わない。

例えば、h = { :name => 'だれそれ', :age => 18, :sex => 'female' } というハッシュの
キーをそのままto_sしてDBのフィールド名やXMLに転用するのは俺的にはNG。
658デフォルトの名無しさん:2008/01/08(火) 17:02:49
みんなhash[:sex]のジョークを華麗にスルーしてるのにわろたw
659デフォルトの名無しさん:2008/01/08(火) 20:56:51
Hashの要素にアクセスするのにいちいち文字列をinternしてたら
文字列からSymbol探してくる方が時間かかるだろ
そういう場合は素直に文字列をキーにするべき

シンボルは速いなんてのを盲目的に信じると逆に遅くなるぞ
素直に書けるように書け
俺も>>657みたいに内部で完結する場合にだけシンボルを使うな
660デフォルトの名無しさん:2008/01/08(火) 21:38:10
ハッシュのキーが1万個あったら1万個のStringオブジェクトが生成され、
しかもそれは本質的には別個のオブジェクトである意味は全く無い
→ そうだ Symbol、しよう。

というのは思いとしては痛いほどよくわかるんだけどね
661デフォルトの名無しさん:2008/01/08(火) 22:22:23
lisper感覚としてはシンボルのほうが落ち着く。

最初から文字列なモノ(人名=>その人のレコード、とか)ならもちろん話は別。
662デフォルトの名無しさん:2008/01/08(火) 22:58:31
Symbolを使うべきと理解できてる場合はそれでいいと思うけど
Symbol速いと言われてるから何でもSymbolというのは良くない
Symbolをキーにするハッシュがある場合は
実はStructでいいんじゃないかと考えてみるのもいいかもね
663デフォルトの名無しさん:2008/01/08(火) 23:27:18
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

のように。教えてください。お願いします。
664デフォルトの名無しさん:2008/01/08(火) 23:35:18
こんなもんかね。
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"]
665デフォルトの名無しさん:2008/01/08(火) 23:45:41
とうあ。

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です。
667663:2008/01/09(水) 00:02:58
ありがとうございます!
668デフォルトの名無しさん:2008/01/09(水) 00:04:05
意味上は
「abcから値が2ではない要素を除いたハッシュを生成しそのキーを列挙」
と読める>>665が真っ当と思われる

だがabcを複製しないとどうにもならんのが難点か
キーの配列作ってabcでの値が2になるものを抜き出す>>664の上が処理上は妥当っぽい気も
669デフォルトの名無しさん:2008/01/09(水) 00:10:26
>>666
jarray.replace(jarray.sort_by{|a| a.split(//).reverse})
670デフォルトの名無しさん:2008/01/09(水) 00:19:04
>>666

サンクスです。助かります。
sort!よりreplaceとsort_byの組み合わせの方が速いんですね。
671デフォルトの名無しさん:2008/01/09(水) 00:32:32
・replaceは内容の書き換えで新しくオブジェクトを作らない
・sort_byはシュウォーツ変換というアリゴリズムでメモリを代償に早いソート
だったと思う、確か。
特にsort_byは比較だけでなくブロックを呼ぶ回数も少ない…はず。
splitしてreverseとか結構重そうだからそれも響いてくるのかも。

ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/?ST=oss
ここの第5回その3とか、第13回の2ページ目とかの受け売り。
672デフォルトの名無しさん:2008/01/09(水) 00:44:21
あ、replaceは今回関係ないよ
sort_by!が無かったから1行で書くために使っただけ

ソートアルゴリズム以前に日本語文字列をsplitしてreverseする回数が多すぎるんだと思う
673デフォルトの名無しさん:2008/01/09(水) 00:54:11
>>666
実際に試さずに言うんだが、先にsplit→reverseを済ませておいてから
sortした方が早くなると思われる
(split→reverseの回数が減るため)

jarray = ["おいお", "おいあ", "いあお"]
jarray.map!{|x| x.split(//).reverse.join}
jarray.sort!
674デフォルトの名無しさん:2008/01/09(水) 08:23:49
>>673
まあ、もしかしたら些細な問題かもしれんのだが

irb> arr = ['かきくけこ','あいうえお','さしすせそ']
irb> arr.map!{|x| x.split(//e).reverse.join}
irb> arr.sort!
irb> puts arr
おえういあ
こけくきか
そせすしさ

これからどうすればいい?
675デフォルトの名無しさん:2008/01/09(水) 08:38:58
そんなん、sort!したあとにsplit→reverseすればいいじゃん





アレ?
676デフォルトの名無しさん:2008/01/09(水) 08:42:37
>>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
677デフォルトの名無しさん:2008/01/09(水) 11:19:23
前から思ってたんだけどさ、たとえばさ、名前と年齢と住所ってデータが大人数ぶん空項目なしで存在するとしてさ

[{'name'=>'山田太郎', 'age'=> 23, 'home'=>'駅前1丁目'},
{'name'=>'田山次郎', 'age'=> 31, 'home'=>'駅前2丁目'},
{'name'=>'山川三郎太', 'age'=> 1024, 'home'=>'駅前3丁目'},
...
]



{'name' => ['山田太郎','田山次郎','山川三郎太', ...],
'age' => [23, 31, 1024, ...]
'home' => ['駅前1丁目','駅前2丁目','駅前3丁目', ...]
}

ってどっちがまとも?
678666: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

当然ですが、巨大なファイルの最後の方の行を取り出す
のにえらく時間がかかります。ベターな方法はあるでしょうか?
(拡張モジュール作成?)
679デフォルトの名無しさん:2008/01/09(水) 11:33:08
>>677
まともの定義が分からんが、あとの方の例だと、
マークシート形式の試験にトラウマがある俺にはちょっと不安。
680デフォルトの名無しさん:2008/01/09(水) 11:39:21
>>678
def linefetch(text, line)
return text.split[line-1]
end

もし、テキストファイルの内容が不変で行数を取り出す行為が何十回もあるのなら、
俺はtext.split(//e)の結果をインスタンス変数とかに保持しておく。
メモリをやたら食うけど、たぶんそのぶん速い。

特定の行をそこだけうまく抜き出す、という芸はRubyは苦手。
テキストファイルをとりあえず全部メモリに読み込むのが普通と思われ。
数バイトずつ読み込んでうんたらかんたらはやってやれないことはないとは思うんだが。
681680:2008/01/09(水) 11:40:13
あ。
誤 : text.split(//e)の結果
正 : text.splitの結果
682デフォルトの名無しさん:2008/01/09(水) 11:48:10
>>677
後者は人間にとって非常に不安を引き起こすデータ形式だな…
いや、コンピュータがやるんだから

・ 前者の各要素のハッシュに含まれるペアの数は全て同一
・ 後者のハッシュの値の配列の要素数は全て同一

は同じことのはずなんだが、後者はなぜかとっても不安だな

idを作って数字をキーにして

{ 1 => {'name'=>'山田太郎', 'age'=> 23, 'home'=>'駅前1丁目'},
2 => {'name'=>'田山次郎', 'age'=> 31, 'home'=>'駅前2丁目'},
3 => {'name'=>'山川三郎太', 'age'=> 1024, 'home'=>'駅前3丁目'},
...
}

という格納法も見るね
うっかり氏名でキーを作って同姓同名で破綻したりするのもいい思い出だと思う(そうか?)
683デフォルトの名無しさん:2008/01/09(水) 12:29:28
>>678
Ruby だけで収める事にこだわらないのであれば sed がお勧め。

def xthline(x, file)
 return %x( sed -n #{x}p "#{file}" )
end

これだけだと改行コード付だったり
x 行目が無い場合は nil じゃなくて空文字列が返るので
採用する場合はもうちょっと工夫が必要。
684デフォルトの名無しさん:2008/01/09(水) 12:31:58
>>677
イテレータ回すことを考えると前者が有利
685デフォルトの名無しさん:2008/01/09(水) 12:48:55
>>678
jarray.map!{|e| [e, e.split(//).reverse.join]}
jarray.replace(arr.sort_by{|a| a[1]}.map{|e| e[0]})

こっちのほうが速いかも
メモリ使用量は増えてる予感
686デフォルトの名無しさん:2008/01/09(水) 12:50:28
変数名間違えた

jarray.map!{|e| [e, e.split(//).reverse.join]}
jarray.replace(jarray.sort_by{|a| a[1]}.map{|e| e[0]})

なんでもいいけどjarrayってのは即刻やめたほうがいいと思うぞ
687デフォルトの名無しさん:2008/01/09(水) 12:59:26
地雷みたいでrubyがストールしそうだもんな
688デフォルトの名無しさん:2008/01/09(水) 13:21:03
Rubyのマルチセットって組み込みのライブラリにあったっけ?
標準添付のライブラリのほうだっけ?
689デフォルトの名無しさん:2008/01/09(水) 13:38:19
そんなんあったっけ?
690デフォルトの名無しさん:2008/01/09(水) 14:25:48
RubyForge を "Bag" で検索したらこんなの出てきたけど、こういうの?

RubyForge: Ruby Collections: Project Info
ttp://rubyforge.org/projects/collections/
691デフォルトの名無しさん:2008/01/09(水) 14:50:02
確かに join した方が速いよね。
jarray.replace(jarray.sort_by{|a| a.split(//).reverse.join})
692デフォルトの名無しさん:2008/01/09(水) 14:57:37
joinしたほうが速いというか、joinすることを失念してると言ったほうが正確かね
配列の比較より文字列の比較のほうがおおむね速い
何かポリシーがあって配列のままにしてるってわけではなさそうだ
693678: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
}

つまり,サブディレクトリが変わる度に処理を繰り返すやり方を教えてください!!お願いします!!
695デフォルトの名無しさん:2008/01/09(水) 18:12:22
>>694
File.dirname(file) であとはごにょごにょ。
696デフォルトの名無しさん:2008/01/09(水) 18:21:00
てか、最悪でもfileから正規表現で切り出すこともできると思うんだけど
それくらいできて欲しいなとちょっと思った
697デフォルトの名無しさん:2008/01/09(水) 18:48:04
>>694
リファレンスマニュアルのDirのところ全部読め
698デフォルトの名無しさん:2008/01/09(水) 19:03:26
>>695
やっぱりDir.globの点が間違っているんですかね?

>>697
読んだんですけどディレクトリ毎に処理を行う点は載ってなかったような...
オレの力不足です,申し訳..
699デフォルトの名無しさん:2008/01/09(水) 19:18:38
てか宿題は宿題スレでやれ
めんどくさいから
700デフォルトの名無しさん:2008/01/09(水) 19:54:25
>>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かそれ以上でないと動作しないので注意
701デフォルトの名無しさん:2008/01/09(水) 22:13:14
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さんが記述してくれたプログラムにどのように拡張すれば良いのでしょうか??
お願いします!!
703デフォルトの名無しさん:2008/01/09(水) 23:09:16
>>702
なるほど、>>694で自分で処理を考えて書いた部分はゼロだな
704デフォルトの名無しさん:2008/01/09(水) 23:15:56
うむ

っていうかスクリプトを全く読んでなさそうだ
どこがどうなってどう動いてるかとか興味なさげ
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認証は通らないです。
ここ調べろとか教えていただけると非常にありがたいです。
706デフォルトの名無しさん:2008/01/10(木) 02:31:00
IEでやる
707デフォルトの名無しさん:2008/01/10(木) 02:32:26
>>705
user_agent
708デフォルトの名無しさん:2008/01/10(木) 04:09:04
>>702
宿題なら、次からはこっちの方がいいぞ

RUBYの宿題教えてください。
http://pc11.2ch.net/test/read.cgi/tech/1106572657/
709デフォルトの名無しさん:2008/01/10(木) 09:58:42
質問です。

Kconv.guess(text)

で文字コード判定をしたいのですが、textが数十MBあるような場合、
全部を渡さずに、一部を切り出して渡した方が良いでしょうか?
もしそうなら、最低どれくらいを渡せば確実ですか?
710デフォルトの名無しさん:2008/01/10(木) 10:16:19
一部しか渡さないならそれをすり抜けるテキストが必ず存在するから
最低どれくらいなんてものはないだろ。

オンメモリが無駄に思えるなら一行ずつ読み出してguessしていって
ASCII以外の値が返ったら停止すりゃいいんじゃないの。
711デフォルトの名無しさん:2008/01/10(木) 10:21:43
まあ確かに「その文字コードにしか存在えしない文字の繋がりが出るまで」としか言えんな(w
Kconv.guessって全文nkfに渡してるん?
712709:2008/01/10(木) 11:09:22
>>710, >>711
そうですよね。
ASCII以外で停止の方向でやってみます。
ありがとうございました。
713デフォルトの名無しさん:2008/01/10(木) 11:22:03
どんな文字が何字あるかにもよるんだろうけど、1行では誤判定しそうな気が
日本語文字は200文字くらいは必要ではないかと
10行くらいどばっとぶち込むのが吉
714デフォルトの名無しさん:2008/01/10(木) 14:47:17
すいません!
改行コード変換の方法を教えてください!
CR+LF => LF
715デフォルトの名無しさん:2008/01/10(木) 15:00:51
CR消せば?(素)
716715:2008/01/10(木) 15:17:12
>716
そのCRとやらを消すにはどうしたらよいのでしょう?
line.gsub!("\r\n", "\n)
とやりましたが効果がありません・・・。
717デフォルトの名無しさん:2008/01/10(木) 15:18:04
莫大な数の改行を処理し続けるのでなければNKFに頼るのが一番無難だという結論に達した

require 'nkf'
lf_text = NKF.nkf('-d',crlf_text)
718デフォルトの名無しさん:2008/01/10(木) 15:33:03
-d で良かったっけ?
放っておくとJISになるような
719714:2008/01/10(木) 15:41:20
>>717 >>718
Shift JIS なら -ds でいけました。ありがとうございました。
前もって改行コードを取得できたらいいのですが、
何やらむずかしそうですね。
720デフォルトの名無しさん:2008/01/10(木) 15:49:16
>>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がうごかないんだろ

721716:2008/01/10(木) 15:58:50
>> 720
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]で、
File#getsを使って行を取得しています(改行コードも入るときいたので)。
Windowsだからダメなんでしょうか・・・。
722デフォルトの名無しさん:2008/01/10(木) 16:14:17
binmodeにしないまま読み込めば\r\nが\nに変換されて読み込まれる
binmodeにしないまま書き込めば\nが\r\nに変換されて書き込まれる
723716:2008/01/10(木) 16:39:40
>> 722
それだ!解決しました。
大変お世話になりました。
724デフォルトの名無しさん:2008/01/10(木) 23:03:55
line.gsub!("\x0D\x0A", "\x0A")
725デフォルトの名無しさん:2008/01/11(金) 09:48:33
>>724
話聞いてなかったろ?
726デフォルトの名無しさん:2008/01/11(金) 14:03:22
MD5Digestを利用して
「既存の大量の画像入りディレクトリの中身と重複したエロい画像を手に入れても削除」
っていう便利スクリプト作ろうと思った。
md5が重複する可能性を危惧して「ファイルの先頭2キロバイトくらいもデータベースに保持しておいて比較」とかしようと思う。
一瞬「えー200個くらい画像を入手するたびにファイルの先頭ガリガリ読み込むのかよ」と思ってげんなりしたけど、
よく考えるまでもなくmd5ハッシュを作る時点でファイル全文読んでるよね。気にしないほうがいいか。
727デフォルトの名無しさん:2008/01/11(金) 14:26:54
サイズが一致したときだけ確認すれば
728デフォルトの名無しさん:2008/01/11(金) 14:33:44
rubyのみで生ソケットとかは無理?
IPHeaderいじたいんだけども。
729デフォルトの名無しさん:2008/01/11(金) 14:56:22
エロ画像収集ごときで MD5 の重複を気にするってのがありえない。


MD5 と SHA1 の二本立てでおけ。
730デフォルトの名無しさん:2008/01/11(金) 14:57:53
500GBのHDD買って光回線でshareつけっぱにしておくと
そもそも管理しようという気力がなくなる。
チンゴがボトルネックになってしまうんだよな。
731今日からRUBY:2008/01/11(金) 15:09:58
標準出力をコマンドラインから送るにはどうしたらいい出しょうか?

$ruby hoge.rb 1
このように 1 を引数として送ってみましたが「そんなファイルはないよ」というエラーがでました。
732デフォルトの名無しさん:2008/01/11(金) 15:14:57
>>728
Cとかで作るのとほぼ同じ。
マニュアルにもあるけど、パラメータが定数で指定できない場合は即値で指定すれば何でもできる。はず...
733デフォルトの名無しさん:2008/01/11(金) 15:15:10
>>728
Socketでは不足?

>>731
お前のシステムは日本語で喋るのか?

はいいとしてとりあえずはARGVの使い方調べれ。
スクリプトの引数を空白で区切って配列にしたものが入ってる。
734デフォルトの名無しさん:2008/01/11(金) 15:17:36
>>728
Socketで引数にSOCK_RAWが指定できるみたい

>>731
まずは標準入出力など超重要概念を学ぶのが先
たのしいUNIXでも嫁
735デフォルトの名無しさん:2008/01/11(金) 15:18:10
C:\>1
'1' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。


こいつ! 日本語で喋るぞ!
736デフォルトの名無しさん:2008/01/11(金) 15:24:40
たのしいUNIX(笑)

いやユーザーレベルで適当な入門書少ないけどな
737今日からRUBY:2008/01/11(金) 15:49:27
>>733
英語です。
そんなこと書いてあるっぽいってことで、、、下手な役ですみません

ARGV検索してみます!
ありがとうです!
738デフォルトの名無しさん:2008/01/11(金) 15:53:19
>>729
> MD5 と SHA1 の二本立てでおけ。

SHA2か256にしない理由は?
739デフォルトの名無しさん:2008/01/11(金) 16:24:55
何個くらいファイルがあったらMD5が衝突する確率が50%になるんだっけ。
740デフォルトの名無しさん:2008/01/11(金) 16:33:13
いや、1000個に1個誤認するとかいうレベルでもかなりヤな感じだと思うんだが
741デフォルトの名無しさん:2008/01/11(金) 16:38:47
>>740
> いや、1000個に1個誤認するとかいうレベルでもかなりヤな感じだと思うんだが

そんなレベルなら今頃衝突しまくってる気がする
742デフォルトの名無しさん:2008/01/11(金) 16:44:39
まぁ持ってるファイルが1億以下なら、衝突を気にするほうがおかしいってレベルじゃね?
743デフォルトの名無しさん:2008/01/11(金) 16:45:00
50%になるまで大量のファイル放置したくないよな
10万回に1個ぶつかるくらいになったあたりで警告出して欲しい(w

SHA256はなんか長いから遅いんだろうなと思ったら
メガ未満のファイルを大量に処理するぶんには体感上MD5とほとんど変わらんな
なんで流行らないんだ?
irb>p Digest::SHA256::hexdigest(File.read('img.jpg'))
"4c8cfdb15d48ad839d67c3c485c7905092880cb18feb8ef170c09540adcfa29c"
744デフォルトの名無しさん:2008/01/11(金) 17:02:41
そもそも「重複ファイルのカジュアルな検出プログラム」にはファイルサイズとmd5で充分だからじゃね
検出間違ったら建物が爆発するとかミサイルが飛ぶとかそういうのでない限りmd5で問題ないもの
画像に至っては「両方の画像を表示して同一画像であることをユーザーに確認させる」とかいうのもあるし

今からハッシュ関数利用してプログラム作るならmd5は捨ててSHA256以上を最初から使っとけって言ってたのは誰だったか
745今日からRUBY:2008/01/11(金) 17:18:51
度々すみません

ディレクトリ内のファイルを1ファイルずつ変数に入れるループ文を書きたいのですがどうすればいいでしょうか?
分からないところは1ファイルずつ取り出すところです

# 以下ではoにすべてのファイルが入ってしまう
o = `dir`
o.each {
|x|
puts x
}
# 上に同じ ∞ループ、、、(;ω;)
while( o = `dir` )
put o
end
746デフォルトの名無しさん:2008/01/11(金) 17:22:11
`dir /b`.each_line{|f| f.chop!
  puts f
}
747デフォルトの名無しさん:2008/01/11(金) 17:27:37
>>745
>>3 のリファレンスマニュアルのFileとDirのところ全部読め
748今日からRUBY:2008/01/11(金) 17:31:12
自己レス、、
dir = Dir.open('.')
while file = dir.read
 print file,"\n"
end

これで、できました!

>>746さん
れすありがとうございます
それも試してみます!

>>747さん
今日はじめたのですがとりあえず動かすのが楽しくて、、
落ち着いたらリファレンス読みます!

あとPHPは投げ捨てます(^^)
749デフォルトの名無しさん:2008/01/11(金) 17:37:26
セキュリティ関係の用途でだろ>衝突を気にする
750デフォルトの名無しさん:2008/01/11(金) 17:42:50
他言語貶めるような奴にRubu使って欲しくないね
後々面倒だから
751デフォルトの名無しさん:2008/01/11(金) 17:44:05
n bitのハッシュの場合は、sqrt(2**(n+1) log(2)) 個のファイルがあれば
50%の確率で衝突がおこるっぽい。

MD5は128bitだよね?
なら、2171京個のファイルがあれば50%の確率で衝突するはず?
752デフォルトの名無しさん:2008/01/11(金) 17:50:50
だから50%じゃ駄目なんだって普通に考えろよ
40%ならセーフなのか? 違うだろ?
10%だってお話にならんだろ?
リンゴが10個あったら1個ミカンと間違われて捨てられるんだぜ?
1万円を千円札10枚に両替したら1万円札が混じってるんだぜ? どんなドジっこだオラ
753デフォルトの名無しさん:2008/01/11(金) 17:53:53
このへんの概念めんどくさいよね

とりあえずみかんの例は
「このシステムを使って2000京個のりんごを識別すると50パーセントの確率で1個だけみかんが混じってる」
と解釈するべき
50パーセントという数字だけ持ち出すとネタにしかならんぞ
754今日からRuby:2008/01/11(金) 17:55:53
>>750さん
すみません、、(;ω;)
僕はまともに使えるのPHPだけなので貶める意図はないです

少しPHPに飽きていたところだったのでrubyが面白くて
755デフォルトの名無しさん:2008/01/11(金) 17:59:52
計算したMD5ハッシュを他のプログラムでも使うとかいうことがないのなら素直にSHA256使っとけ
間違って1つしかなかった激エロ画像を削除してしまうんじゃないかとビクビクすることなく枕高くして眠れるよ
756デフォルトの名無しさん:2008/01/11(金) 18:01:46
画像の重複チェックツールなんてすでに腐るほどあるがな
757デフォルトの名無しさん:2008/01/11(金) 18:03:27
>>752
1学級が40人の時、同じ誕生日な生徒がいる確率は約九割です。
しかし九割の生徒が同じ誕生日というわけではありません。
758デフォルトの名無しさん:2008/01/11(金) 18:03:56
FAQなんですけど、実例があればどういうのでしょうか。


3.2 ブロック付きメソッドにブロックを渡すにはどうすればいいですか

ブロック付きメソッドにブロックを渡すには、メソッドの後ろにブロックを置く方法の他に、
手続きオブジェクト(を指す変数、定数)の前に&をつけて引数として渡す方法があります。
759デフォルトの名無しさん:2008/01/11(金) 18:23:17
FileUtils.cmpは

とりあえずファイルサイズが違っていたらfalse
両者のファイルを開いてバッファごとに比較し違っていた時点でfalse

という処理
比較先の画像ファイル自体にいちいちアクセスしたくないならdigestを長くしておくのがよいかと
760デフォルトの名無しさん:2008/01/11(金) 18:24:24
>>750
perlを貶めるなということか?
761デフォルトの名無しさん:2008/01/11(金) 18:29:01
>>752
その例はまるで違ってるぞ。
762デフォルトの名無しさん:2008/01/11(金) 18:39:29
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)
しました。
伝わりますでしょうか?助けてください。よろしくお願いします。
763デフォルトの名無しさん:2008/01/11(金) 18:46:03
>>762
パッと見た感じ、入力が EUC-JP と期待しているコードになってるね。
str.split(//e) とか。

kana2rom.rb 自体はそのままで、
入力する文字列を一旦 EUC-JP に変換してから処理するようにする。

それがイヤなら横着せずに *真面目に* UTF-8 に対応するように修正しる。
764763:2008/01/11(金) 18:49:09
>>762
ていうか、それどっかで見たことあるなと思ったら、
以前 Ruby 本スレで出てきたやつだね。
そっちのスレにいろいろ対処法が書いてあったからそっち見れ。
765デフォルトの名無しさん:2008/01/11(金) 18:51:21
>>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
766デフォルトの名無しさん:2008/01/11(金) 18:57:18
KAKASIとかが無くてもRuby単体でせめてひらがなくらいはなんとかできたら便利じゃね、
というコンセプトであるように見える
767デフォルトの名無しさん:2008/01/11(金) 19:14:41
>>758
p = proc {|x| puts x*10 }
[1,2,3].each(&p)
768デフォルトの名無しさん:2008/01/11(金) 19:32:41
>>767
なるほど
769デフォルトの名無しさん:2008/01/11(金) 19:39:20
>>752
こういう数字のマジックにコロっと騙されちゃう奴って結構いるもんなんだよね。
770デフォルトの名無しさん:2008/01/11(金) 19:44:23
>>743
MD5 はセキュリティ上問題がある(意図的に衝突させられる)から
SHA256 を使うべきという話らしいけどね。
771デフォルトの名無しさん:2008/01/11(金) 20:23:53
>>758
実はMethodなんかも渡せるのでたまに使う
[1,2,3].each(&method(:p))

あとメソッド定義した時に&で受けて&で渡すとか
def foo(&block)
   [1,2,3].each &block
end
772デフォルトの名無しさん:2008/01/11(金) 20:49:00
>>771
それらを実例としてFAQに追加しておいてもらえませんか?
773デフォルトの名無しさん:2008/01/11(金) 20:50:20
思いつかない人には無用の機能だと思う
774デフォルトの名無しさん:2008/01/11(金) 21:08:59
>>772
マニュアルのメソッド呼び出しのところ読めば詳しく書いてあるよ
でも無ければ無いでなんとかなる機能だしFAQに載せる程かな?
それでも気になるなら自分で追加するといい
775デフォルトの名無しさん:2008/01/11(金) 21:15:34
詳しく読めばわかるからサンプルいらないって・・・w
776デフォルトの名無しさん:2008/01/11(金) 22:09:08
FAQなのに良い回答になってないからだろ。
あのFAQ集は日本語の文章に変なところが多くて読み辛い。
777デフォルトの名無しさん:2008/01/12(土) 00:19:14
sha256ってライブラリはどれ使えばいいの?
778デフォルトの名無しさん:2008/01/12(土) 00:31:42
>>777
require 'digest/sha2' で256も512も使える。

779デフォルトの名無しさん:2008/01/12(土) 11:23:22
Numericクラスの数値をテキストに変換する場合に,
1を01や001などと任意の数の0を左側に付けて
変換するようなメソッドは有りますか?
780デフォルトの名無しさん:2008/01/12(土) 11:32:44
String#%
781デフォルトの名無しさん:2008/01/12(土) 11:38:58
もしくはString#sprintf
782デフォルトの名無しさん:2008/01/12(土) 11:50:56
ありがとうございました.
783デフォルトの名無しさん:2008/01/12(土) 13:34:29
>>774
いやー、俺おもうけどさ。
FAQもそうだけど、マニュアルにサンプルコードがあるのってすごく助かるよ
ちょっと載ってるだけで、イメージがつかめる

いやこれは、仕事でMSDN見てて思うんだけど(Microsoftのオンラインヘルプ)、
Javaのリファレンスとか、本当にリファレンスしか載ってないもんな。

いつも、.chmのRubyリファレンス見て不満におもってたけど、
ri使ったら、サンプルコードちゃんと載ってるんだよね。
リファレンスの方にも載せることってできないのかな?
784デフォルトの名無しさん:2008/01/12(土) 13:35:33
> いやこれは、仕事でMSDN見てて思うんだけど(Microsoftのオンラインヘルプ)、
> Javaのリファレンスとか、本当にリファレンスしか載ってないもんな。

MSのヘルプは、サンプルや、使い方がよく載っていて、
Javaなんかは、ぜんぜん載ってないっていいたかったのです。

わかりにくかったスマソ
785デフォルトの名無しさん:2008/01/12(土) 13:47:44
作ってる人違うとかじゃないかなあ

マニュアル整備しようぜという話は定期的に出るけど必ず頓挫するね
何がそんなに壁なの? 飽きちゃうの?

あと2chに書き込んだコードはオープンソース云々と相性悪くて取り込めないので注意
786デフォルトの名無しさん:2008/01/12(土) 14:25:31
>>784
わかってるって
787デフォルトの名無しさん:2008/01/12(土) 14:28:38
>>784
Java のリファレンスは JavaDoc で auto generation

それにサンプル載せるということは
788デフォルトの名無しさん:2008/01/12(土) 14:31:24
>>784
JavaはMSと違ってsourceそのものがある
789デフォルトの名無しさん:2008/01/12(土) 17:04:48
>>788
そくわらんが、そのsourceには、使い方が書いてあるの?
790デフォルトの名無しさん:2008/01/12(土) 17:39:23
>>785
じゃああなたがマニュアル整備してください。
791デフォルトの名無しさん:2008/01/12(土) 18:08:53
マニュアル書ける人は現状で満足してて、
マニュアル欲しい人は書くのに十分な知識を持っていない。
792デフォルトの名無しさん:2008/01/12(土) 18:09:38
そんなんだから日本はダメなんだ。
793デフォルトの名無しさん:2008/01/12(土) 18:14:56
local variableがどうとかエラーが出て良く分からなくなったので、質問します。
今、やりたいのは
http://www.uploda.org/uporg1199589.csv.html
このようなファイルの処理で
これに時間をつける為に
http://www.uploda.org/uporg1199594.txt.html
このファイルを作ったのですが(rbがうp出来なかったのでtxtにしてあります)、
deltaがlocal variableだと言って処理してくれません。

if(file_io.lineno == 4)
で取得したdeltaを下にも使いたいのですが、どうすればいいでしょうか?
794デフォルトの名無しさん:2008/01/12(土) 18:19:23
なぜか一番上に@deltaを定義して
@deltaに書き換えたら出来てしまった・・・なんでやねん・・・
795デフォルトの名無しさん:2008/01/12(土) 18:23:44
>>785
マニュアル整備しようぜという話からるりまができたんじゃね?

あと最近のRubyリファレンスはサーバーエラーが出まくってて
とてもまともに編集できたものじゃない
796デフォルトの名無しさん:2008/01/12(土) 18:25:19
インスタンス変数にする必要はなくて、ブロックに入る前に
delta = nil
とでもしとけばブロックの中でもそのdeltaを見るようになる。
797デフォルトの名無しさん:2008/01/12(土) 18:26:18
オフィシャルって何で動作してるの?
Ruby だとしたらあの 500 エラーはちょっと悲しい
798デフォルトの名無しさん:2008/01/12(土) 18:31:32
公式ページはRadiant CMS、リファレンスはRWiki

503エラーが出るのは、
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43743
799デフォルトの名無しさん:2008/01/12(土) 18:33:13
なるほど
情報どうもです
800デフォルトの名無しさん:2008/01/12(土) 18:35:01
InstikiかBitChannelにしないかな・・・
801デフォルトの名無しさん:2008/01/12(土) 18:37:15
サーバーエラーが出るのはRWikiのせいなのか?
単にサーバーマシンの性能が足りないだけだと思うんだけど

>>793
変数deltaがブロックの中で定義されたために
そのブロック中でのみ有効な変数(ブロックローカル変数)になっている
対策は>>796の助言通り、ブロックの外でdeltaを定義(代入)しておくこと

あとソースコードの中で無闇にマジックナンバー使うのはやめれ
802デフォルトの名無しさん:2008/01/12(土) 18:44:21
>>801
マジックナンバーってなんですか?
803デフォルトの名無しさん:2008/01/12(土) 18:45:59
リソースが足りないのは、
ソフトがリソースを食う。
ハードのリソースが足りない。
の両方を意味するから、あのメールだけではどちらともいえないが、
簡単に解決する方法は、たぶんハード増強のほうだろうな。

804デフォルトの名無しさん:2008/01/12(土) 18:48:04
ifはブロックじゃないんですね・・・
ifの外に書いてもダメでした。
あと
delta = nilはダメっぽいですよ。Fixnumに直せないって。
単純に
deltaって定義したらいけました。

ローカル変数の方がその外の変数より優先されるんじゃないですか?
どうしてlineno==4のところではローカル変数のdeltaとして認識されないで、グローバルなdeltaとして認識されるんっでyそう+
805デフォルトの名無しさん:2008/01/12(土) 18:49:58
ごめんなさい、nilでもいけました。
あと、deltaと書くだけではダメで
delta = 0なりnilと書かないとダメみたいです;;
ローカル変数とか良く分からない;;;
806デフォルトの名無しさん:2008/01/12(土) 18:52:21
マジックナンバーというのは、4とか43とかの
意味ありげだが値からは意味が分からない数。

4のほうは、Deltaの行の判定のようだが、
見たところDeltaという見出しがある行は1つしかないから、
行番号まで判定する必要がそもそもない。

43のほうは、その43とはどういう意味の43なのか分からない。
807デフォルトの名無しさん:2008/01/12(土) 18:55:02
delta
と単独で書くと、deltaというメソッドの呼び出しと見なされる。
# delta() と書くのと同じってこと。
変数だと教えるために何かを代入する必要がある。

あと、ブロックを作ってるのはifじゃなくてscanの後ろの do 〜 end。
808デフォルトの名無しさん:2008/01/12(土) 18:56:17
えっと、43というのは43行目からの値しか意味がないとかいう
このファイルの仕様で(オシロがそう掃き出すらしい)
if lineno==4
としたのは、そこで判別した方が速いと思ったからです。
いちいち正規で判別させると遅いので、
行数でまず捌いた方がいいかと。

これはマジックナンバーですか?
809デフォルトの名無しさん:2008/01/12(土) 19:01:11
>>807
ブロックがscan do ~ end
の部分であれば、
なぜこれだとダメなんですか?
どこまで外のdeltaを定義すればいいですか?
コメントアウトされている、ちょうどその上のdelta = nilというのを発動させるとうまくいきますが。

http://www.uploda.net/cgi/uploader4/index.php?file_id=0000025022.udn
810デフォルトの名無しさん:2008/01/12(土) 19:01:49
書き捨てでおk
811デフォルトの名無しさん:2008/01/12(土) 19:07:36
>>808
マジックナンバーです

>>809
OK、まずRubyのリファレンスマニュアルを熟読だ
もしくはGoogleで適当な初心者向け解説サイトを探せ
812デフォルトの名無しさん:2008/01/12(土) 19:07:52
もちろん書き捨てですけど、
暇があったらあのオシロ用に完璧なコードも書きたいと思っています。
ゆとりな後輩たちに何か残してやりたくて。
813デフォルトの名無しさん:2008/01/12(土) 19:09:11
>>811
本は読んだつもりなんですけど。
たのしいRubyとかピッケル本とか
ローカル変数とかはクラス作ってやるとあんまり関係なくなりますよね。
ローカル変数とかで引っかかった事がないので驚いているだけかと。
ここで教えてもらえば済む事です。
814デフォルトの名無しさん:2008/01/12(土) 19:12:40
>>812
とても かっこいい
815デフォルトの名無しさん:2008/01/12(土) 19:19:17
レファレンス・FAQには皆さん不満があるんですね。

個人でブログやってrubyテクを披露している人いますが、その人たちが
FAQやマニュアルを編集してくれればいいでしょうな。ruby公式FAQと
マニュアル・レファレンスをウィキみたくユーザー参加型にすればよいと思います。

javaと比べてみても、rubyは文章編集とユーザー参加がまだ閉鎖的ですし、
昔のパソコン通信(メーリングとかネットニュース)を思い返しますw
Web 2.0

ところでピッケル本(英語・日本語)の評判はどうでしょうか。
rubyの教科書となりえてますか?
816デフォルトの名無しさん:2008/01/12(土) 19:19:29
>ここで教えてもらえば済む事です。
自分でやれ
817デフォルトの名無しさん:2008/01/12(土) 19:33:25
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
}
818デフォルトの名無しさん:2008/01/12(土) 19:44:14
正規表現が後ろに行くに従ってコピペで手抜きになっていくな(w
819デフォルトの名無しさん:2008/01/12(土) 19:45:17
rubyは未だにモルモンしてるしユーザー・コミュニティー作るとか文章書ける奴もいないし永遠と無理な相談だな。
所詮はperlとどっこいw
820デフォルトの名無しさん:2008/01/12(土) 19:59:20
>>817
それじゃ完璧じゃないの・・・
おれのとやってる事が全く同じなの・・・
あと、ファイルを読み込んで、そのままグラフに掃き出せたら
あのゆとりどもも少しは楽になるかなと思っている。

>>816
そこをどうにか。
自分もある意味ゆとりなので
821デフォルトの名無しさん:2008/01/12(土) 20:04:28
>>802
ググれ
822デフォルトの名無しさん:2008/01/12(土) 20:08:22
>>820
お前は何を求めてここに来てるんだ

単に完璧なコードに書き直してほしいだけなのか
それともこの課題(?)を通してRubyの学習がしたいのか、どっちなんだ
823デフォルトの名無しさん:2008/01/12(土) 20:11:10
>>822
後者です。だからローカル変数について、上のコードで説明を求めています。
824デフォルトの名無しさん:2008/01/12(土) 20:18:48
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
825デフォルトの名無しさん:2008/01/12(土) 20:19:32
>>822
人とのふれあい
826デフォルトの名無しさん:2008/01/12(土) 20:23:07
>>824
やってる事はまったく同じです。
827デフォルトの名無しさん:2008/01/12(土) 20:53:28
- 行末の表現は '$' のみで良い。'\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].*/
と言われます.
どう修正したら良いんでしょうか?

829デフォルトの名無しさん:2008/01/12(土) 21:03:57
>>827
「読めないコード」にすべきではないと感じる
学習レベルに合わせたスクリプトのほうがよいかと
830デフォルトの名無しさん:2008/01/12(土) 21:08:10
$KCODE="SJIS"
dat=["Alpha","ひらがな","漢字","カタカナ"]

dat.each{ |str|
p str
case str
when /^[あ-ん]+/s
p "ひらがな"
when /^[ア-ン]+/s
p "カタカナ"
when /^[亜-煕]+/s
p "漢字"
else
p 'それ以外の何か'
end
}
831デフォルトの名無しさん:2008/01/12(土) 21:21:18
>>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
}
832デフォルトの名無しさん:2008/01/12(土) 21:25:29
>>827
どうして?特に前者。
だってそうしないと\rや\nも出てくる。
833デフォルトの名無しさん:2008/01/12(土) 21:31:59
>>830-831
なるほど.漢字コードを明示すればいいのですね.
ありがとうございました.
834デフォルトの名無しさん:2008/01/12(土) 21:43:05
>>833
いや重要なのはそこじゃない
というか漢字コードは明示しなくても、$KCODEに合わせてちゃんとマッチしてくれるはず

間違ってたのは正規表現の中身だ

835827:2008/01/12(土) 21:47:36
>>832
行末 '$' は改行 '\r\n' の前に位置するから上の場合は記述する必要が無い。
'\n' でも '\r' でも同じ。むしろ記述すると別環境で不具合に種になりうる。
836デフォルトの名無しさん:2008/01/12(土) 22:03:40
>>835
もしこのプログラムで$の前に\rや\nがあるとすると、
この正規表現で取得出来るのは嘘になるのですが。
\nや\rが$より後ろにあるというのはさすがにないでしょう。
837デフォルトの名無しさん:2008/01/12(土) 22:09:46
このケースでは問題ないけど、^と¥A、$と¥zの区別は理解しておくこと。
838デフォルトの名無しさん:2008/01/12(土) 22:11:49
> [/$\r\n/, /\r$\n/, /\r\n$/].map{ |re| re === "foo\r\nbar" }
=> [false, true, false]
839824:2008/01/12(土) 22:15:09
>826
その通り。同じ事を書いた。
>823 はRubyを学習したいと言った。
同じ事を書いてるのにどうして違うコードになるか。
そして同じだけど違うコードを読み比べることで
「ここは読みやすくなった」「これはちょっとおかしい」など
存分に学習に生かして欲しいと願う所存。
840デフォルトの名無しさん:2008/01/12(土) 22:16:57
お願いします。
RDEを使用しているのですが、ファイルopen出来なくて困ってます。
保存場所が間違えているのかと思い、RDEのリファレンスを見ました、同じことを質問している人がいましたが
「readfile.txtの保存場所はどこに?」という質問に対して返答がありませんでしたので、解る方教えて下さい。
何か根本的に間違えている所がありましたら、お手数ですがそこも指摘をお願い致します。
841デフォルトの名無しさん:2008/01/12(土) 22:17:53
やばい涙目。
何やってるのかさっぱり分からない。
842デフォルトの名無しさん:2008/01/12(土) 22:18:24
emacsでおk
843デフォルトの名無しさん:2008/01/12(土) 22:24:38
ID表示がないと、どれが誰の発言なのかわかりにくくて困る

>>840
日本語でおk
844デフォルトの名無しさん:2008/01/12(土) 22:25:45
netbeandsでおk
845デフォルトの名無しさん:2008/01/12(土) 22:26:28

[いつもの場所]

に保存されているとみんな思ってるから答えないんだよ

846デフォルトの名無しさん:2008/01/12(土) 22:40:41
いつもの場所?
847デフォルトの名無しさん:2008/01/12(土) 22:47:47
逆引きRubyがしぼんぬしてる
848827:2008/01/12(土) 23:06:05
>>836
>>835 は間違ってるね。ごめんなさい。でも >>827 の方は訂正しないよ。
言いたい事は、不必要に環境に依存するコードを書くな、て事。
849デフォルトの名無しさん:2008/01/12(土) 23:08:31
readlinesで読んだ文字列から
環境に依存せずに改行コードだけ
取り除く方法を教えてください
850デフォルトの名無しさん:2008/01/12(土) 23:10:30
IO.readlinesを使うなっていう話なのでは?
851デフォルトの名無しさん:2008/01/12(土) 23:13:52
UNIX環境だけを使えば万事解決
852デフォルトの名無しさん:2008/01/12(土) 23:14:23
>>849
String#chomp
String#chomp!
853デフォルトの名無しさん:2008/01/12(土) 23:14:38
>>849
\rと\nを""に置換すれば?
854デフォルトの名無しさん:2008/01/12(土) 23:16:43
Ruby1.8以降ならchompすれば問題ないな
CRLFだろうがLFだろうがCRだけだろうが適当に取ってくれる
855デフォルトの名無しさん:2008/01/12(土) 23:18:56
文字列項目中に改行が入ってるCSVなんかでも大丈夫ですか?
856デフォルトの名無しさん:2008/01/12(土) 23:20:49
>>855
マニュアル読もうとは思わないのか?
857デフォルトの名無しさん:2008/01/12(土) 23:30:06
>>840
p Dir.pwd
で言われる場所からの相対パス
あるいは絶対パス
でreadfile.txtとやらの場所をopenに教える
858デフォルトの名無しさん:2008/01/12(土) 23:35:22
>>856
はい
859デフォルトの名無しさん:2008/01/12(土) 23:41:52
rubyごときで威張っている人のがいるスレはここでしょうか?
860デフォルトの名無しさん:2008/01/12(土) 23:44:13
威張っているように見えるんだろう
861デフォルトの名無しさん:2008/01/12(土) 23:44:37
>>859
自分が出来ないからって涙目になるなよ
862デフォルトの名無しさん:2008/01/13(日) 00:09:51
はい。ごめんなさい。
863デフォルトの名無しさん:2008/01/13(日) 00:25:47
冬休みっていつまでだよ・・・
864デフォルトの名無しさん:2008/01/13(日) 00:28:32
冬休みはどうかわからんが土日月と3連休なのは間違いないな
865デフォルトの名無しさん:2008/01/13(日) 00:55:32
Web 2.0 はperlが頂いた!
866デフォルトの名無しさん:2008/01/13(日) 00:56:36
>>865
どうぞ持っていってください
867デフォルトの名無しさん:2008/01/13(日) 01:16:05
>>857
できました!
親切な返答、ありがとうございます。
868デフォルトの名無しさん:2008/01/13(日) 01:51:28
しかしまぁ、初心者スレだから当たり前なのかも知れんが凄まじいな・・・
869デフォルトの名無しさん:2008/01/13(日) 02:22:09
いろんな板でクソスレ読むけど、ここが一番眩暈がするわ
870デフォルトの名無しさん:2008/01/13(日) 02:26:14
java初心者すれはもっとスゴイ。
871デフォルトの名無しさん:2008/01/13(日) 07:44:38
>>856
Rubyのオンラインのリファレンスマニュアルってめちゃくちゃ読みにくいし
時々落ちてて参照出来ないしページまるごと無くなってたりするし・・・
872デフォルトの名無しさん:2008/01/13(日) 08:20:51
>>871
chm版オススメ
873デフォルトの名無しさん:2008/01/13(日) 08:24:34
>>871
つgoogleキャッシュ
874デフォルトの名無しさん:2008/01/13(日) 08:31:37
情報源は公式サイトしかないのかよ
875デフォルトの名無しさん:2008/01/13(日) 08:44:35
公式以外の情報は参考にしかならん
876デフォルトの名無しさん:2008/01/13(日) 09:06:12
公式サイトが糞ってるって話なんじゃないのか?
877デフォルトの名無しさん:2008/01/13(日) 09:22:21
公式サイトのリファレンスマニュアルを一括ダウンロードしたものは
なんで「メソッド一覧:」が無いんだぜ?
Web版はあるのに・・・
878デフォルトの名無しさん:2008/01/13(日) 09:41:36
シンボルになってないからだろ
:メソッド一覧 にしてみ
879デフォルトの名無しさん:2008/01/13(日) 09:48:02
>>877
htmlそのものは存在するが、リンクされていない(ページ下部のメニューが消えているため)
ディレクトリ内にある、やたらでかい「methodlist.html」がそれ
880デフォルトの名無しさん:2008/01/13(日) 10:42:23
存在してたのか。
ずっとgrepしてたぞ。
881878: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の絶対パスだとドライブ文字の後の":"にマッチしてしまうので
ドライブ文字とファイル名を括ってグルーピング指定してやる
883デフォルトの名無しさん:2008/01/13(日) 13:59:21
RDEはLinux/OSXで動かないからクソ
884デフォルトの名無しさん:2008/01/13(日) 15:25:57
>>883
派外道。
おれはUbuntuでEmacs
RDEが使えたら使いたいが、無いからキレてる。
885デフォルトの名無しさん:2008/01/13(日) 15:30:25
RDEは、USBメモリで設定ごと持ち運べないのがなぁ……
なぜわざわざレジストリを使うんだ

そんな俺は今でもJmEditor使ってます
886762:2008/01/13(日) 15:53:54
>>763,765さん
返事が遅くなって申し訳ありません。全部//uに変えてみました。
そしたらきれいに変換を行ってくれました。
本当に助かりました。どうもありがとうございます;
887デフォルトの名無しさん:2008/01/13(日) 16:12:30
よく考えたら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

という正直なシンボリックリンクができていました。
あまり絶対パスで指定したくないですがなんとかなりませんか。
888デフォルトの名無しさん:2008/01/13(日) 16:17:39
あーそれはやめとけ
ディレクトリ跨ったシンボリックリンクは第1引数を絶対パスで指定するべし
シンボリックリンクの仕様だと思って諦めれ
889デフォルトの名無しさん:2008/01/13(日) 17:17:41
>>887
FileUtils.symlink('../from/a.txt','to/a.txt')
でいいんじゃね?
890デフォルトの名無しさん:2008/01/13(日) 20:52:32
RMagickでフォルダ内の画像を一括変換するスクリプト作ったんだが、
こまめにGC.start呼ばないと、メモリ不足で落ちる。
そんなもんですかね。
891デフォルトの名無しさん:2008/01/13(日) 20:59:29
落ちるのはバグなんじゃね?
メモリが不足したら自動でガベコレしてくれないと意味ないじゃん
892デフォルトの名無しさん:2008/01/13(日) 21:10:55
一般的には8割くらいの確率でスクリプトの書き方のほうに原因があるはず
「GCがヘタレだから落ちるんだよねー」ということは本当はかなり稀
極悪スクリプトの変態綱渡りをGCに無理やりフォローさせてる場合が少なくない

何らかのリソース使いっぱなしのスクリプト書いてないか
893デフォルトの名無しさん:2008/01/13(日) 21:12:39
つーかまずはPCのメモリとスワップ領域とスクリプトのメモリ使用量調べろと
894デフォルトの名無しさん:2008/01/13(日) 21:14:32
スクリプトのメモリ使用量って調べるの意外と難しいぞ
俺はtopコマンドをじーっと見るとかそういう退廃的な手段しか知らん
895デフォルトの名無しさん:2008/01/13(日) 21:15:47
>>890
RubyのGC/RMagickの仕様みたいだよ
ttp://rubyforge.org/forum/forum.php?thread_id=1374&forum_id=1618

GCってそんなものなのかー、ってのがわかって興味深いね
896デフォルトの名無しさん:2008/01/13(日) 21:16:19
GCが管理できるのはRubyのオブジェクトだから、管理できない
リソース使いまくるとRuby側では解放メソッドを確実に呼ぶ
くらいしか手が打てないな。(IO#closeとか)

897デフォルトの名無しさん:2008/01/13(日) 21:24:05
簡単に書くとこういうスクリプトな訳だけど、

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
英文が長いのであとで読みます。でも有難う。
898デフォルトの名無しさん:2008/01/13(日) 21:27:15
ImageMagickをシェルから呼んだほうが使い勝手いいよね
899デフォルトの名無しさん:2008/01/13(日) 21:37:22
GC呼び出し → RMagickのfreeフック起動 → グラフィック用メモリ解放

って仕組みらしいが、RMagickで確保したオブジェクトはruby側で使用サイズと認識されないため
RMagickで大量にメモリ使用されても、rubyは気づかずにGC呼びださないってことらしい

プログラムが落ちるまでGC呼び出さないなんてアホすぎる
900デフォルトの名無しさん:2008/01/13(日) 21:43:35
アホでごめーんね
901デフォルトの名無しさん:2008/01/13(日) 21:44:40
RubyCocoaのコードが汚すぎてフイタ
ぜんぜんラップされてねーじゃん
902デフォルトの名無しさん:2008/01/13(日) 21:45:00
メモリの確保に失敗したときにGC呼んでるんじゃないの?
903デフォルトの名無しさん:2008/01/13(日) 21:56:42
>>894
あるあるw
俺の場合はWindowsだから、タスクマネージャ開いて
ruby.exeのメモリ使用量をじーっと観察したりしてる
904デフォルトの名無しさん:2008/01/13(日) 22:04:50
タスクマネージャのメモリ量は
tail
出来るんだが
905デフォルトの名無しさん:2008/01/13(日) 22:18:00
ruby内部で使われるxmalloc(ruby_xmalloc)は失敗したらGCが発生するけど、
RMagickの内部では単なるmallocを使ってるから失敗したら素直に落ちるってことかな?
906デフォルトの名無しさん:2008/01/13(日) 22:34:03
普通にrubyのGCバグだろ。多量のファイル読み込みなんていつもある処理だし、ユーザーに負担をかけるようなインタプリタは不親切だよな。
ユーザーがtopを監視する必要があるとか泣けるw
907デフォルトの名無しさん:2008/01/13(日) 22:37:54
いや大量のファイルを実際に処理してるのはRubyじゃないから
908デフォルトの名無しさん:2008/01/13(日) 23:13:49
imagemagickの中か
909デフォルトの名無しさん:2008/01/13(日) 23:50:55
>>905
RMagickでメモリ確保に失敗したらGC呼べばいいだろ
910デフォルトの名無しさん:2008/01/13(日) 23:53:10
で、結局戦犯は誰なんよ
911デフォルトの名無しさん:2008/01/13(日) 23:54:34
>>910
ふらっとでふらっと向きじゃない話をしてる奴等
912デフォルトの名無しさん:2008/01/13(日) 23:57:26
Rubyへのポートの仕方が悪いんじゃないの?
913デフォルトの名無しさん:2008/01/13(日) 23:58:11
rhtmlを色分けしてくれるエディタある?
914デフォルトの名無しさん:2008/01/14(月) 00:18:39
プラットフォームは?
915デフォルトの名無しさん:2008/01/14(月) 01:31:39
>>897
ひぇー、これ知らなかったよ・・・
もう手を離れちゃったサイトどうしようw
今作ってる奴はちゃんとしよう(- -)

とりあえず

http://techno.hippy.jp/rorwiki/?How+to+debug+memory+consumption+problems+or+memory+leaks

に書いてあるように

fDisabled = GC.enable
GC.start
GC.disable if fDisabled

って記述を入れてやるのがいいのかな
916デフォルトの名無しさん:2008/01/14(月) 01:31:50
秀丸
917デフォルトの名無しさん:2008/01/14(月) 01:52:18
vimはHTML部とERb部をそれぞれの文法で色づけてくれた。
あとTextMate。
918913:2008/01/14(月) 02:37:36
>>914
GentooをXfceで使ってるから、gtkで色分けしてくれるエディタないですかねぇ?
919デフォルトの名無しさん:2008/01/14(月) 02:56:03
試してないけど、ぐぐったらgedit(てことはgtk+だよな、GNOMEのライブラリも
要りそうだが)でやる設定らしきものが。
http://grigio.org/textmate_gedit_few_steps
920デフォルトの名無しさん:2008/01/14(月) 03:12:08
NetBeans使ってる人少ないンかね・・・
921デフォルトの名無しさん:2008/01/14(月) 03:24:26
/変数文字列/ の形でpremature end of regular expressionを発生させる可能性のある、
文字列中の記号ってどれくらいありますか?
922デフォルトの名無しさん:2008/01/14(月) 06:59:46
>>921
くだらないこと考えずに素直にマッチング文字列と正規表現の文字コード揃えろ
923デフォルトの名無しさん:2008/01/14(月) 08:46:49
>>920
使い捨てコードしか書かないからいちいちプロジェクト作るのが億劫なんだよな・・・
924デフォルトの名無しさん:2008/01/14(月) 08:57:40
>>906
なんでバカがこんなにえらそうなんだ?
ImageMagickのエラーはRubyと関係ないだろ
なんでこれがRuby GCのバグやねん
925デフォルトの名無しさん:2008/01/14(月) 10:10:25
Ruby公式のマニュアルが未だに馬鹿だからだろう
926デフォルトの名無しさん:2008/01/14(月) 11:05:19
>>919
いいね、これ。
今はgedit単体で開発してるけど、試してみようかな
927デフォルトの名無しさん:2008/01/14(月) 18:38:31
arr = [1,3,2]
arr.sort!

のように各種メソッドを読んでarrを操作したときその変更をコールバック的に知る方法はないですか?
928デフォルトの名無しさん:2008/01/14(月) 18:38:50
UTF16でテキストファイルを書き込むにはどうしたら良いでしょうか?
929デフォルトの名無しさん:2008/01/14(月) 18:59:30
>>928
リファレンスマニュアル - 添付ライブラリ - 文字コード
930デフォルトの名無しさん:2008/01/14(月) 19:05:14
>>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が無いようで....

932デフォルトの名無しさん:2008/01/14(月) 20:17:39
>>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]だとバイト指定なのでマルチバイト文字だと位置がずれてしまいますので.
934デフォルトの名無しさん:2008/01/14(月) 20:36:11
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で
935デフォルトの名無しさん:2008/01/14(月) 21:56:40
rubyとは結局その程度の言語なんです。でも国産なんでスw
936デフォルトの名無しさん:2008/01/14(月) 22:04:59
>>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
>>932
ありがとうございました.
939デフォルトの名無しさん:2008/01/14(月) 22:56:48
>>936
アホすぎるwww
940デフォルトの名無しさん:2008/01/14(月) 23:44:27
>>936
ほんとアホだなw
941デフォルトの名無しさん:2008/01/15(火) 09:32:33
>>936
もはや何から突っ込んでいいのかわからない。
942941:2008/01/15(火) 09:34:22
・・・と流れで書いてしまったが、よくよく読むと>>936が正しかった。
Managed DirectXなんかのVGAメモリと一緒ってことだな。
駄レスすまそ。
943デフォルトの名無しさん:2008/01/15(火) 11:18:36
>>939がアホすぐる件は?
944デフォルトの名無しさん:2008/01/15(火) 11:24:25
RMagickがGC起動すればいいと思うんだけどなあ
945デフォルトの名無しさん:2008/01/15(火) 12:42:37
確認だけど、Fileとかはデコンストラクタは明示的に呼ばなくても大丈夫だよね?
946デフォルトの名無しさん:2008/01/15(火) 13:06:07
寿命によるかと
直後にスクリプトが終了すれば何も問題はない
947デフォルトの名無しさん:2008/01/15(火) 13:12:36
openにブロック渡して、そん中で全部やればいいんじゃないんだっけ?
948デフォルトの名無しさん:2008/01/15(火) 13:16:26
それするのめんどくさいって話なのでは
949デフォルトの名無しさん:2008/01/15(火) 13:54:05
デコンストラクタってそもそも何、というか。

File (というかIO)のクローズは呼ぶべき。
リファレンスカウント方式ってわけでもないし。
950デフォルトの名無しさん:2008/01/15(火) 14:07:29
なんでリファレンスカウント方式じゃなかったら呼ぶべきなの?
951デフォルトの名無しさん:2008/01/15(火) 14:54:42
str = yyy
があったとして、これをputとかで表示させたいのですが、
yyy
(2秒)
yyy
(1.5秒)
yyy
(2秒)
・(1秒)・(1秒)・(1秒)
ぴか〜ん!!

って表示させたいです。()内の秒数はだいたいの感覚です。
こんなことするにはどうすれば良いですか?
952デフォルトの名無しさん:2008/01/15(火) 15:00:12
ぴか〜ん!!ってなんだよw
953デフォルトの名無しさん:2008/01/15(火) 15:04:21
sleep で間隔を開けて puts で表示すれば。
puts の出力はバッファリングされてしまうと思うので、
puts str; $stdout.flush とかやって flush する。
954デフォルトの名無しさん:2008/01/15(火) 15:47:20
>>950
> なんでリファレンスカウント方式じゃなかったら呼ぶべきなの?

というか、逆かな。
リファレンスカウントなら、確実に参照が無くなった時点で回収されるはずだから、
確実に参照が無くなるように書いておけばおkではないかと思ったのだけど、変?
955デフォルトの名無しさん:2008/01/15(火) 16:07:25
すみません、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したいのですが、
どのようにするのが簡潔で高速でしょうか?
957デフォルトの名無しさん:2008/01/15(火) 16:58:06
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次第。
958デフォルトの名無しさん:2008/01/15(火) 17:02:24
>>936
Disposeと明示的な呼び出しは関係ないだろwww
959デフォルトの名無しさん:2008/01/15(火) 17:03:59
あ、>>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)}
960デフォルトの名無しさん:2008/01/15(火) 17:14:03
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)
962デフォルトの名無しさん:2008/01/15(火) 17:31:40
$ 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はこういう用途に向かんのか?
963デフォルトの名無しさん:2008/01/15(火) 17:35:22
俺はファイル読み込みは
ロックしたい時や、馬鹿でかいファイル以外は
IO.readlines で済ます
書き込みもある程度openブロックの中が小さくなるように書く
964デフォルトの名無しさん:2008/01/15(火) 17:49:22
>>962
線形探索してるだろうから、要素数が大きくなってきたらダメなんじゃないかな。
965デフォルトの名無しさん:2008/01/15(火) 21:01:32
>>954
なるほど
じゃあマーク&スイープだったらGCに任せておいたらいけないんだろうか
966デフォルトの名無しさん:2008/01/15(火) 21:57:37
リファレンスカウント方式だと、参照が輪になっている(のでカウント!=0)
孤立しているオブジェクト群がそのまま残り続けるとかいう欠点が指摘され
ることが多いけど、最近は改善されてるの?
967デフォルトの名無しさん:2008/01/15(火) 22:07:36
>>966 Pythonはマーク&スイープを併用している模様
968955:2008/01/15(火) 22:29:15
>>957
> 多くの場合使えるが、Aで
> 「Bのバージョンはx.x.xかそれ以前限定でよろしこ」
> と設定されてれば使えない。
> つまりA次第。

すみません、大変遅くなりました。ありがとうございます。

私の場合、AはRailsであり、Bはいろいろあるのですが、どのように設定されて
いるか、どこを見ればわかるでしょうか?
969デフォルトの名無しさん:2008/01/15(火) 22:31:35
なるほど、併用か。

>>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)
970955:2008/01/15(火) 23:09:12
>>969
> actionmailer (= 2.0.2)

例えば actionmailer は2.0.2に固定で、もしバージョンアップしたら依存関係
が損なわれて、Railsが使えなくなる、という理解でよろしいでしょうか?

もしそうなら、かなり縛りはきついなあ。
971デフォルトの名無しさん:2008/01/15(火) 23:20:24
Railsのパッケージは一式同時にリリースされるので、
バージョンがずれることは心配しなくていい。

また、依存関係は実際にrequireしようとした時点で問題になるので、
メール扱わないならconfig/environment.rbで
config.frameworks -= [ :action_mailer ]
としておけばよいだろう。



972955:2008/01/15(火) 23:41:08
>>971
それが、ちょっと都合がありまして、actionmailerだけ、バージョンを上げら
れないかと思っていたのです。

Railsからはメールを使わないことにして、
> config.frameworks -= [ :action_mailer ]
を実行しようと思います。

>>All
要領の悪い質問に、親切にお答えいただき、皆さん大変ありがとうございまし
た。
973デフォルトの名無しさん:2008/01/15(火) 23:55:03
バージョン間の差がアプリの動作に影響しない箇所のものであれば、
rake rails:freeze:gemsでvendor/rails以下にrails一式コピーして、
コピーされたモノのうちactionmailerだけ別バージョンに差し替え。
バージョンチェックで引っかかったらチェックをうまいこと修正。

という手でもいけそうだな。
974デフォルトの名無しさん:2008/01/16(水) 05:10:56
ERBで
<img src="<%= hogehoge %>">
って書くのが気持ち悪いんだけど
こういう書き方って普通なの?
975デフォルトの名無しさん:2008/01/16(水) 05:31:47
どういう書き方ならいいの?
976デフォルトの名無しさん:2008/01/16(水) 06:32:36
<img src="#{hogehoge}">
977デフォルトの名無しさん:2008/01/16(水) 06:48:31
>>974
たぶん普通
俺は気持ち悪かったからAmritaやTenjin使ってる
978デフォルトの名無しさん:2008/01/16(水) 07:05:41
>>977
作者乙
979デフォルトの名無しさん:2008/01/16(水) 09:35:10
>>957
>>959
>>960
ありがとうございました!!Hash使います。
indexだと値がかぶったときもつねに小さいほうの数字を返して統一性があるのですが、
Hashだと同じ値があったときに順位が不定なので、その時小さいほうを返す方ように
頑張ろうと思います。
980デフォルトの名無しさん:2008/01/16(水) 10:58:30
がんばんなくても
h = {}
a.sort.each_with_index{|e, i| h[e] = i if !h[e]}
                     ~~~~~~
981デフォルトの名無しさん:2008/01/16(水) 11:35:17
>>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]
~ ~
982デフォルトの名無しさん:2008/01/16(水) 11:39:44
順位つけるならそれでよくね?
983デフォルトの名無しさん:2008/01/16(水) 11:50:26
じゃあ同値同位が何位ならいいんだ? という話だな。

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

と並べるかはケースバイケースだと思う
984981:2008/01/16(水) 12:23:53
ふむ。んじゃあ題意が ambiguous だったのが悪かったってことで。
985974:2008/01/16(水) 12:53:00
>>977
Tenjinってのは初めて知りました
日本語の情報があまりないようですが結構使われているんでしょうか?
コレに関しては人柱は避けたいので枯れたものを採用したいんですが
986デフォルトの名無しさん:2008/01/16(水) 12:55:30
気持ち悪いのを避けたいのか、枯れたものを使いたいのか、それが問題だ
987974:2008/01/16(水) 12:57:19
Tenjinのマニュアルを見た感じだと>>974に書いたような気持ち悪さはない
988デフォルトの名無しさん:2008/01/16(水) 15:05:44
質問です。2つの文字のコマンドラインで入力された2つの文字列のレーベンシュタイン距離(編集距離)を求めたいです。
ただし、kakasiとtakasaは通常なら距離が2になるのですが、3にしたいです。
要するに母音に対して変換が行われたときのみ距離を2倍にしたいです。
できれば〜倍かはコマンドラインから指定できるとなお良いです。
扱う文字はaiuなどではなく、kakisuなど子音を含むものとします。nnやnya等も考えません。
つまり配列にいれるなら奇数のとこに必ず母音が入るというものです。
通常の距離を求めるコードは以下にソースはっておくので、どなたか改造、アドバイスお願いします。
989デフォルトの名無しさん:2008/01/16(水) 15:07:31
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)
990デフォルトの名無しさん:2008/01/16(水) 15:31:25
お、おわりかよっ
991デフォルトの名無しさん:2008/01/16(水) 16:11:08
うめ
992デフォルトの名無しさん:2008/01/16(水) 16:15:35
なんか貼れない・・・もっかい
993988: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
よろしくお願いします。
994デフォルトの名無しさん:2008/01/16(水) 18:06:30
次スレ立てた
http://pc11.2ch.net/test/read.cgi/tech/1200472887/

>>985
Tenjinは比較的新しいライブラリなので、枯れてる方がいいならamrita-alteredで
995デフォルトの名無しさん:2008/01/16(水) 18:57:14
>>994
996デフォルトの名無しさん:2008/01/16(水) 20:04:09
うめ
997デフォルトの名無しさん:2008/01/16(水) 20:23:59
うめ
998デフォルトの名無しさん:2008/01/16(水) 20:24:28
1000なら1.9.1今月リリース
999デフォルトの名無しさん:2008/01/16(水) 20:24:45
次スレ
Ruby 初心者スレッド Part 17
http://pc11.2ch.net/test/read.cgi/tech/1200472887/
1000デフォルトの名無しさん:2008/01/16(水) 20:25:29
次スレ
Ruby 初心者スレッド Part 17
http://pc11.2ch.net/test/read.cgi/tech/1200472887/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。