トップページ⇒tech
1001コメント357KB

Ruby 初心者スレッド Part 23

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/11/20(木) 04:30:21
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.7 の使用をお勧めします】
    ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
      1.9 の新機能の一部が利用可能なので初学者にお勧めです。
    ※ただし十分安定しているとは言えないので
      プロダクション環境での利用にはお勧めしません。

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問は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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん2008/11/20(木) 06:26:43
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/

他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
「初めてのRuby」
http://www.amazon.co.jp/dp/4873113679/
「Ruby Way 第2版」
http://www.amazon.co.jp/dp/4798115339/
0003デフォルトの名無しさん2008/11/20(木) 06:32:31
■前スレ
Ruby 初心者スレッド Part 22
http://pc11.2ch.net/test/read.cgi/tech/1221467121/

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

Rubyの宿題教えてください。2限目
http://pc11.2ch.net/test/read.cgi/tech/1200175247/

RubyCocoa 初心者質問【Leopardバンドル記念】
http://pc11.2ch.net/test/read.cgi/mac/1193373811/

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

デザパタ + Python/Ruby/Smalltalk part2
http://pc11.2ch.net/test/read.cgi/tech/1175959706/

魁け! Ruby 1.9.X
http://pc11.2ch.net/test/read.cgi/tech/1201603546/

Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech/1207233348/

【Ruby/SDL他】Rubyでゲーム制作・総合スレッド
http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/

【Ruby】RubyonRailsPart6
http://pc11.2ch.net/test/read.cgi/php/1224838013/
0004デフォルトの名無しさん2008/11/20(木) 06:33:07
【Rails】便利なRubyGemsを共有するスレ【Hpricot】
http://pc11.2ch.net/test/read.cgi/tech/1216829388/
0005デフォルトの名無しさん2008/11/20(木) 06:33:54
■公式/非公式関連リンク
Ruby Home Page
http://www.ruby-lang.org/ja/

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/
0006デフォルトの名無しさん2008/11/20(木) 06:34:30
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

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

GitHub RubyGems
http://gems.github.com/
http://github.com/
# 最近は RubyForge より GitHub が人気

日本Rubyの会 公式Wiki
http://jp.rubyist.net/
# メニューに表示されていない埋もれた情報ページ多数

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

Ruby hotlinks 五月雨版(日記や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/

Matzにっき(Ruby作者の日記)
http://www.rubyist.net/~matz/
0007デフォルトの名無しさん2008/11/20(木) 06:38:34
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/

■プレゼンテーション
Ruby会議2008
http://jp.rubyist.net/RubyKaigi2008/
http://www.nicovideo.jp/tag/rubykaigi2008

Ruby会議2007
http://jp.rubyist.net/RubyKaigi2007/
http://www.nicovideo.jp/tag/RubyKaigi2007
00082-72008/11/20(木) 06:40:23
テンプレ変更あり。Ruby入門書にRuby Wayを追加しています
0009デフォルトの名無しさん2008/11/20(木) 08:38:13
luaみたいにCとrubyを連携するにはどうすればいいの?
0010デフォルトの名無しさん2008/11/20(木) 08:52:17
>>9
RubyのソースやCで書かれた拡張ライブラリをさっくり読むとよいかも。
それ自身が、CとRubyの連携のサンプルになってます。
0011デフォルトの名無しさん2008/11/20(木) 09:53:52
逆だろ、Cで書かれたアプリの組み込み言語としてRubyを使う方法なら
ttp://eto.com/d/EmbededRuby.html
ここからリンクされてる先を見れ
0012デフォルトの名無しさん2008/11/20(木) 11:00:07
RubyでXMLをYAMLのように簡単に扱う方法はないのでしょうか?
YAMLは読み込んだらツリーな連想配列になっていて簡単に使えますよね?
そのように、XMLを読み込んだら連想配列になっていて欲しいのですが・・・

もちろん、XMLは単純な構造を想定しています。
0013デフォルトの名無しさん2008/11/20(木) 11:05:44
XmlSimpleってライブラリがあるよ
ttp://xml-simple.rubyforge.org/
0014デフォルトの名無しさん2008/11/20(木) 11:48:47
>>13
おお!ありがとう。検索でもそのライブラリがひっかかりました。
使ってみたいと思います。

---以下チラシのウラ---
Ruby MagazineでYAMLの説明で、
「データを配列とハッシュとスカラーだけで表現する簡易性こそが YAML 」
なんていう名言?がありまして、YAMLはデータ記述(マークアップではなく)に
向いていて感激したのですが、プログラマさん以外には
(HTMLに似ている)XMLの方が馴染み深かったりするのですよ。
それでYAML感覚でXMLを使えたら置き換えできそうと思ったしだい
0015デフォルトの名無しさん2008/11/20(木) 22:10:43
WIN32OLEを使ってエクセルを操作させようと思っているんですが、問題にぶつかったので質問させてください。
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false
などの定義の部分をクラス化し、使いまわそうと思っているんですが、
変数の"excel"や"sheet"辺りの変数について困っています。
というのも定義はクラスに任せ、実際の操作はメインソースでやろうと思っているのですが、
複数のインスタンスを作る際に変数をどうするかで悩んでいます。

何かうまい方法がありましたらご教授お願いします。
0016デフォルトの名無しさん2008/11/20(木) 22:24:17
>>15
定型的な初期化処理をまとめるってことだよね?

def new_excel
 excel = WIN32OLE.new('Excel.Application')
 excel.visible = false
 excel.displayAlerts = false
 return excel
end
ex1 = new_excel
ex2 = new_excel
0017デフォルトの名無しさん2008/11/20(木) 23:30:32
>>15
クラスじゃなくてモジュールだけど
module ExcelApplication
 def self.new
  app = WIN32OLE.new('Excel.Application')
  app.visible = false
  app.displayAlerts = false
  app.extend(self)
  return app
 end
 def hello ; p :hello ; end
end
excel = ExcelApplication.new
excel.hello
workbook = excel.workbooks.open(file)
sheet = workbook.sheets(1)

W32のapiは知らないんで前スレのを参考にした
0018152008/11/21(金) 00:43:35
>>16
ありがとうございます。とても参考になりました。
excel以外にもworkbookとsheetも定義する必要があり、教えていただいた方法のように個別にメソッドを定義しました。
一応WIN32OLEの定義部分のクラス化は出来たのですが、できればメインソースでインスタンスを生成するたびに
何度も(excel,workbook,sheet)を定義するのは避けたいのです。
現在↓
insname = NewExcel.new  #インスタンス生成
excel1 = insname.new_excel
workbook1 = insname.new_workbook
sheet1 = insname.new_sheet

まとめて定義する方法はありません・・・よね?
試しに・・・と思って以下のような物を書いてみましたがダメでした。
def new_excel(excel,workbook,sheet)
excel = WIN32OLE.new('Excel.Application')
excel.visible = false
excel.displayAlerts = false

excel.workbooks.open(file)
workbook = excel.workbooks(1)
sheet = workbook.sheets(1)

return excel,workbook,sheet
 end


>>17
ありがとうございます。モジュールですか。
メモリ節約などに役立ちそうですね。参考にさせていただきます。
0019デフォルトの名無しさん2008/11/21(金) 04:46:10
そりゃダメだ。fileって変数がないぞう。
あと引数に代入しても、それはローカル変数だから意味がないよ。

def new_excel(file)
 excel = WIN32OLE.new('Excel.Application')
 excel.visible = false
 excel.displayAlerts = false
 excel.workbooks.open(file)
 workbook = excel.workbooks(1)
 sheet = workbook.sheets(1)
 return excel, workbook, sheet
end

excel, workbook, sheet = new_excel()
0020152008/11/21(金) 05:19:17
>>19
すみません、fileは上には書かなかったんですがちゃんと渡してます^^;
なるほど、メインソースの方で定義するときにnew_excelの引数として3つ定義するんじゃなく、
左辺に並べて定義するんですね!引数と変数ってのがちゃんと分かってなかったみたいです。
ありがとうございます。
0021デフォルトの名無しさん2008/11/21(金) 14:18:55
Rubyにて、デスクトップで使うツールのインターフェスを作りたいと思っています。
webフレームワークを使おうとするとやっぱり、Railsとかになってしまうんでしょうか?
Railsはちょっと重そうだなーと思っていたのですが・・・

イメージとしてはベイジアンフィルタのPopFileのようなものです。
窓の杜 - POPFile
http://www.forest.impress.co.jp/lib/inet/mail/antispam/popfile.html

参考になるページはありませんでしょうか?
こういうのをやっている人っていないのかな・・・?
0022デフォルトの名無しさん2008/11/21(金) 18:40:27
「重そう」というのが何のことなのかにもよるが、とりあえずRackを薦める
0023デフォルトの名無しさん2008/11/21(金) 19:14:41
なんでRackなんだよ。
>>21
その程度なら、Railsとか使わず、素のCGIでいいと思う。
サーバはWEBrickを使えば、Apacheとかいらないし。
つうか、現状ではクライアントサイドアプリなら、Rails以外を考えたほうがいいんじゃないかな。
0024デフォルトの名無しさん2008/11/21(金) 19:16:18
ごめん、「Rails以外」じゃなくて「Ruby以外」でした。
0025デフォルトの名無しさん2008/11/21(金) 19:41:32
>>23
WEBrick使うのなら、それこそ素のCGIじゃなくてwebrick/cgiとか使えば良いと思うんだが・・・

Rackを薦めたのはミドルウェアが便利なのと、後からWEBrickやFastCGI等への対応が楽だから
逆に、なぜ今あえて素のCGI(cgi.rbだよね?)を薦めるのかが疑問
0026デフォルトの名無しさん2008/11/21(金) 21:47:13
>>20
これ超オススメ。

Ruby による Win32OLE プログラミング
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/ruby-win32ole.html


石井さんありがとう・・・
0027デフォルトの名無しさん2008/11/21(金) 22:05:56
>>25
もとの>>21を読もうよ。
>Rubyにて、デスクトップで使うツールのインターフェスを作りたいと思っています。
...
>イメージとしてはベイジアンフィルタのPopFileのようなものです。

RackとかFastCGIとかまったく関係ないよね?
0028152008/11/21(金) 23:24:16
>>26
お勧め紹介thxです。
ネットサーフィン中に偶然訪問してましたが、読みませんでした。
気合い入れて読んでみようと思います。
ありがとうございます。
0029デフォルトの名無しさん2008/11/22(土) 00:44:54
>26
俺もそこを紹介しようとしてた。

>28
読め。
0030デフォルトの名無しさん2008/11/22(土) 02:24:39
HTMLをopenuri等で取得してhead部分だけを抜き出そうとしました。

#!/usr/bin/ruby
#html => openuriで取れた値。値が入っていることは p html で確認済み
html = "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
/<head>(.+)<\/head>/ =~ html
p $1

::Console::
nil

まったくわかりません。
よろしくお願いします。
0031デフォルトの名無しさん2008/11/22(土) 02:26:29
すいません、訂正です。
× /<head>(.+)<\/head>/ =~ html

以下どちらのパターンも同じ結果です。
○ /<head>(.+)<\/head>/imo =~ html
○ html  =~ /<head>(.+)<\/head>/imo
0032デフォルトの名無しさん2008/11/22(土) 03:11:58
>>30
irbにコピペしたらちゃんと動いたよ?

irb(main):001:0> html = "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
=> "<html><head>AA 2バイト文字とか改行とかいろいろ</head><body></body></html>"
irb(main):002:0> /<head>(.+)<\/head>/ =~ html
=> 6
irb(main):003:0> p $1
"AA 2バイト文字とか改行とかいろいろ"
=> nil
0033デフォルトの名無しさん2008/11/22(土) 06:15:54
>>27
そうか、FastCGIの必要性はあんまり無かったな
じゃあメリットはミドルウェアだけか
0034デフォルトの名無しさん2008/11/22(土) 09:08:58
>>30
ん?>>31で動くパタンを自分で書いているけど、以下じゃ動かない理由を知りたいってこと?

/<head>(.+)<\/head>/ =~ html


答えは正規表現リテラルの m オプション。//imo の m ね。
m をつけるとピリオドが改行にマッチするようになる。
つけないと「AA 2バイト文字とか改行とかいろいろ」の「改行とか」にマッチしない。

http://www.ruby-lang.org/ja/man/html/_A5EAA5C6A5E9A5EB.html#a.c0.b5.b5.ac.c9.bd.b8.bd.a5.ea.a5.c6.a5.e9.a5.eb

Regexp.MULTILINE も参照。
0035302008/11/22(土) 12:51:43
色々試していただいてありがとうございます。

>>32
すいません、何故かnilなんです

>>34
>>30に書いたとき、実際に付けているimoオプションを書き込み付け加えるのを忘れていて、訂正として>>31に追加しました。

>>31のプログラムでもマッチしない状態です。

こんな感じで動かしても、htmlには取得したHTMLがちゃんと表示されていますが、$1はnilになります。
#!/usr/bin/ruby
response = (〜net/httpで取得したやつ〜)
html = response.body  #net/httpのbody部分を取得
p html   #取得したURL先のHTMLファイルが正常に表示される
html  =~ /<head>(.+)<\/head>/imo
header = $1
p header  #-> nil

なんです。改行とか文字コードの違いとかって落ちかなと思っているのですが
不特定多数な文字コードからUTF8に統一する、ってことできますか?
0036デフォルトの名無しさん2008/11/22(土) 13:15:28
>>35
require 'net/http'
html = ""
Net::HTTP.start("www.yahoo.co.jp", 80){|http|
html = http.get("/").body
}
html =~ /<head>(.+)<\/head>/imo
header = $1

やっぱ動くって。
ruby -vと、変な省略をしない最小のコードを提示して。
ちなみにこっちは
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
0037302008/11/22(土) 14:07:35
#ruby -v
#ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

website ={
  "protocol" => "http",
  "hostname" => "e-words.jp",
  "parameter" => "",
  "pathname" => "/w/EZweb.html"
}

require 'net/http'
Net::HTTP.version_1_2
port = 80
resp = ""

Net::HTTP.start(website["hostname"], port) {|http|
resp = http.head(website["pathname"] + website["parameter"])
if resp['content-type'] =~ /text/i
  resp = http.get(website["pathname"] + website["parameter"])
end
}
p resp.body
resp.body =~ /<head>(.+)<\/head>/imo
head = "<html><head>#{$1}</head></html>"
p head #-> "<html><head></head></html>"
0038デフォルトの名無しさん2008/11/22(土) 14:08:16
こんな感じです。
hostname => "www.yahoo.co.jp",
pathname => "/"
では正常に動きます。
0039デフォルトの名無しさん2008/11/22(土) 14:10:57
あれ、そういえば正規表現に引っかからないときは p resp.body が取れてないことに気づきました。
どうも正規表現にとらわれすぎて視野が一直線になってしまっていたようです。
すいません。
0040デフォルトの名無しさん2008/11/25(火) 01:03:09
sortメソッドより、sort_byメソッドを使った方が、効率が良いらしいですが、
じゃあ、sortメソッドは何の為に存在するのでしょうか?
0041デフォルトの名無しさん2008/11/25(火) 01:21:31
数値や文字列などプリミティブなデータをソートする時
0042デフォルトの名無しさん2008/11/25(火) 02:20:09
collection.sort{|x, y| x.foo <=> y.bar }
とか。
0043デフォルトの名無しさん2008/11/25(火) 02:28:07
>42
x.foo==y.foo ? x.bar<=>y.bar : x.foo<=>y.foo
とかも書くね
0044デフォルトの名無しさん2008/11/25(火) 03:19:53
def sort_by
map{|e| [e,yield(e)]}.sort{|a,b|a.last<=>b.last}.map(&:first)
end
0045デフォルトの名無しさん2008/11/25(火) 12:07:52
質問です。
Rubyって1000分の1秒単位でsleepするにはどのように書くのでしょうか?
0046デフォルトの名無しさん2008/11/25(火) 12:29:51
nanosleepってないんだっけ。
じゃあPOSIXな環境ではselectのようなタイムアウトを
ミリ秒などで指定できるシステムコールを使うのが
常套手段かな。
Windowsだとどうするのか知らないけど。
0047デフォルトの名無しさん2008/11/25(火) 12:42:17
sleep(0.001)
とかじゃダメ?
0048デフォルトの名無しさん2008/11/25(火) 17:27:58
質問します。
配列をCSVに書き込む際、配列の要素数がわかっていて例えば3個の場合は
 csv << [ array[0], array[1], array[2] ]
とすれば大丈夫だったのですが、
要素数がその時々で変わる場合はどうすればいいんでしょうか?
0049デフォルトの名無しさん2008/11/25(火) 17:54:49
>>48
難しく考えちゃってるんだろうけど、Arrayクラスで渡せばいいんだから
csv << array
0050デフォルトの名無しさん2008/11/25(火) 18:19:17
>>49
そのまま渡せばいいだけだったんですね
場所指定が必要なものだと思い込んでいました。
ご返答ありがとうございました。
0051デフォルトの名無しさん2008/11/25(火) 22:53:39
>>47
100分の1の指定はできるですね。
1000分の1の指定は出来ないですね。

>>46
無料のレン鯖で動かす時に使うつもりです。
0052デフォルトの名無しさん2008/11/25(火) 23:22:19
>>51
いや、普通に指定できるでしょ?
ただ、期待した長さで帰ってこないだけじゃないの?
1000分の1秒単位で正確にsleepさせたいときはOS選びから始めるしかないよ。
0053デフォルトの名無しさん2008/11/26(水) 00:04:03
マザボ選びからだと思うよぅ
0054デフォルトの名無しさん2008/11/26(水) 00:07:16
Rubyの文法上は可能だが、Rubyがsleepを依頼するOSのライブラリがサポートしてるかどうかまでは保証できない
0055デフォルトの名無しさん2008/11/26(水) 06:53:36
OS選びっつーか、レンサバでは無理だ。
1000分の1秒単位でCPUのタイムスライスもらえるわけないでしょ。
ざらに1秒返ってこない。
0056デフォルトの名無しさん2008/11/26(水) 10:12:58
ぶっちゃけ、ナニをさせるつもりなのかがちょっとだけ気になる
0057デフォルトの名無しさん2008/11/26(水) 16:16:51
Windowsでsetpriorityやgetpriorityが使えない。
NotImplementedErrorで突っ返される。代替案はないの?
0058デフォルトの名無しさん2008/11/26(水) 18:20:05
OpenProcessしてSetPriorityClass・GetPriorityClass
0059デフォルトの名無しさん2008/11/26(水) 19:29:07
>>58
Win32APIの使い方がまったく分からんorz

MSDNを読むとOpenProcessのプロトタイプ宣言がこれだから
HANDLE OpenProcess(
DWORD dwDesiredAccess, // アクセスフラグ
BOOL bInheritHandle, // ハンドルの継承オプション
DWORD dwProcessId // プロセス識別子
);

どう指定しろと
0060デフォルトの名無しさん2008/11/26(水) 19:45:54
ttp://msdn.microsoft.com/ja-jp/library/aa383751(en-us,VS.85).aspx

あとは根性で
0061デフォルトの名無しさん2008/11/26(水) 20:04:12
>>60
定数の値が分からん\(^o^)/
0062デフォルトの名無しさん2008/11/26(水) 20:23:46
>>61
Platform SDKを手に入れてヘッダの中を探すんだ
0063デフォルトの名無しさん2008/11/26(水) 21:36:30
>>61
ぐぐれ
0064デフォルトの名無しさん2008/11/27(木) 10:43:40
windows-prをgemで入れれば、↓こんな感じでいけるかな?
http://gist.github.com/29658
0065デフォルトの名無しさん2008/11/27(木) 13:13:54
CSVってクラスでCSV読み込みが出来るけど
CSVのエンコーディングを明示的に指定したいときは、
一回KConvかまして$KCODEで指定したエンコードに変換後に
CSVクラスへ渡すしかないかな?
0066デフォルトの名無しさん2008/11/27(木) 18:42:36
Rubyを勉強しようと思い(超初心者)
http://www.moongift.jp/2008/11/ruby_on_rails_portable/
からダウンロードした RailsPortable っていうフォルダを
PCのハードディスクに展開すると170MB程度の大きさなのですが
そのフォルダをUSBメモリにコピーすると900MBを超える大きさになります

なぜでしょう?

ちなみにこのアプリでRubyの勉強をすることは可能ですよね?
自宅外(自分専用のPC持ってません)のPCを使って学習出来ればと思いまして
■ このスレッドは過去ログ倉庫に格納されています