Ruby初心者スレッド Part 13

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2-10あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。

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

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


宗教的な話題は禁止します。
2デフォルトの名無しさん:2007/06/29(金) 20:05:49
本スレ
Rubyについて Part 27
http://pc11.2ch.net/test/read.cgi/tech/1180031347/

Railsスレ
【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/
3デフォルトの名無しさん:2007/06/29(金) 20:06:07
# 本スレ
Rubyについて Part 27
http://pc11.2ch.net/test/read.cgi/tech/1180031347/

# 関連スレ
【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/

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

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

Rubyは難しすぎ
http://pc11.2ch.net/test/read.cgi/tech/1156496224/

【最高言語】 Rubyist Magazine創刊 【ルビま!】 (dat落ち)
http://pc11.2ch.net/test/read.cgi/tech/1094825807/

Python厨とRuby厨が仲直りするスレッド
http://pc11.2ch.net/test/read.cgi/tech/1099804004/

Jython、Groovy、JRuby - どれが一番効率的?
http://pc11.2ch.net/test/read.cgi/tech/1100563765/

ムカツクRubyピッケル本をイラツキながらも読んでみるスレ
http://pc11.2ch.net/test/read.cgi/tech/1160945741

Ruby>>>>>Java
http://pc11.2ch.net/test/read.cgi/tech/1158807229/
4デフォルトの名無しさん:2007/06/29(金) 20:07:14
5デフォルトの名無しさん:2007/06/29(金) 20:08:21
6デフォルトの名無しさん:2007/06/29(金) 20:13:03
= 公式/非公式関連リンク

== 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/
7デフォルトの名無しさん:2007/06/29(金) 20:14:11
== 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/
8デフォルトの名無しさん:2007/06/29(金) 20:15:16
宗教の話はマ板のスレへどうぞ。

【カルト】Ruby開発者Matz【モルモン】
ttp://pc11.2ch.net/test/read.cgi/prog/1148712641/
9デフォルトの名無しさん:2007/06/29(金) 20:35:52
できれば宗教の話だけでなく、「Rubyの話を宗教的に語る」のもやめたほうがいいんだが、
これはRubyユーザーのレベルでは土台無理な話だものな。
Pythonコミュニティに成熟度で少しでも追いつくことを、もうちょっと積極的に目指したほうがいいよね。
10デフォルトの名無しさん:2007/06/29(金) 21:00:03
pythonも宗教じみてるよ。ゼンとか言ってるし。
11デフォルトの名無しさん:2007/06/29(金) 21:02:56
やっぱここは D だな。
12デフォルトの名無しさん:2007/06/29(金) 21:55:10
畏怖とか善とか江流須とか言ってる時点で宗教
13デフォルトの名無しさん:2007/06/29(金) 22:07:40
Programming Ruby - The Pragmatic Programmer's Guide
http://www.ruby-doc.org/docs/ProgrammingRuby/

これの日本語訳もWebで公開してくれればいいのに
14デフォルトの名無しさん:2007/06/30(土) 02:06:53
>>9
こいつ、「オカマじゃないわよ!」レベルだなw
15デフォルトの名無しさん:2007/06/30(土) 03:20:51
↑自分じゃ上手いこと言ったつもりなんだろう。Rubyスレはこういうのが多いのが難点。
16デフォルトの名無しさん:2007/06/30(土) 20:11:11
linuxです

class State
attr_reader :array
def initialize(a)
@array = a
end
end

b = [[1,2,3],[3,2,3],[1,3,4]]
s = State.new(b)
p s.array

これ、initializeで入れる時に3*3行列に限定したいです。
Rubyではすべてはオブジェクトらしいので区別することは不可能でしょうか?
17前スレ972:2007/06/30(土) 20:12:04
前スレ978 Moon Wolf さん、遅くなりまして申し訳ありません。

>iconvで指定するencodingは'EUC-JP'ではなく'EUC-JISX0213'にしないと
>ae1 = Iconv.conv('UTF-8','EUC-JISX0213',"\xa9\xdc")

これをヒントに、数値実体参照にしなくても、そのままeuc-jp→utf8変換できそうです。
本当にどうもありがとうございました。

>>979
>utf8にするんだったら
>わざわざ数値ナンタラにする必要あんの?

nkfとiconvをつかってeuc-jpをutf8に変換しようとしたところ、
æ & a e l i g で表示される発音記号の部分でエラーがでたり、
emacs上でも発音記号があるとutf8でエンコードできなかったので、
utf8で表示することはできても、書きこむことは無理なのかと考えていました。

でも、上のように'EUC-JISX0213'と指定することを教えていただいたので、
助かりました。
18デフォルトの名無しさん:2007/06/30(土) 20:21:06
>16
def initialize(a)
  raise(ArgumentError,'a must be 3*3 matrix') if a.size != 3
  a.each {|r| raise(ArgumentError,'a must be 3*3 matrix') if r.size != 3 }
  @array = a
end
手動で入力値をチェックすれば実行時に3*3行列に限定することは可能
スクリプトの実行開始前の時点でチェックすることは出来ないね
19デフォルトの名無しさん:2007/06/30(土) 20:54:54
やはり仕様で出来ないんですか、せめてaをArray型に限定することは出来ませんか?
20デフォルトの名無しさん:2007/06/30(土) 21:09:23
Ruby!
21デフォルトの名無しさん:2007/07/01(日) 00:24:57
実行時でよければ、initializeの中で、unless arg.is? Array raise TypeError
すればいい。
構文解析時に検出するのは無理。
22デフォルトの名無しさん:2007/07/01(日) 00:26:49
おっと、ArgumentErrorだな。
23デフォルトの名無しさん:2007/07/01(日) 00:29:29
たびたびごめんなさい。is_a? だね……_n.........o

24デフォルトの名無しさん:2007/07/01(日) 06:50:20
「できる」って回答に対して
「やっぱりできないんですか」の時点で>>19は釣りだろ。
25デフォルトの名無しさん:2007/07/01(日) 08:32:51
>>18
>  raise(ArgumentError,'a must be 3*3 matrix')
こんな書き方できるんだ。知らんかった。でもこんな書き方をサポートする理由がわからん。
おれならこう書くかなあ。

def initialize(array)
  _validate(array)
  @array = array
end
def _validate(array)
  msg = 'array must be 3*3 matrix'
  raise ArgumentError.new(msg) unless array.is_a?(Array)
  raise ArgumentError.new(msg) unless array.size == 3
  array.each { |row| raise ArgumentError.new(msg) unless row.size == 3 }
end
26デフォルトの名無しさん:2007/07/01(日) 10:08:58
>>24
言い訳はやめてください。
27デフォルトの名無しさん:2007/07/01(日) 12:01:00
モジュールの中でインスタンス変数を使うのはおかしいですか?

module M
 def hoge=(x)
  @hoge = x
 end

 def hoge
  return @hoge
 end
end

class C
 include M
end
28デフォルトの名無しさん:2007/07/01(日) 16:17:04
別にいいと思うけど。おかしいと思う理由は?
29デフォルトの名無しさん:2007/07/01(日) 19:24:20
例えば
module M
 def add_hoge(x)
  @hoge.push(x)
 end
end

だと@hogeはArrayで初期化されていることが前提となる
30デフォルトの名無しさん:2007/07/01(日) 19:36:57
>>29のような場合は、
def self.extended(obj)
obj.instance_eval do
@hoge = []
end
end

とかも、Mの側で必要になるね。

superの呼び出しが必要なのかとか、includeのほうはどうするんだとか、
忘れた。

31デフォルトの名無しさん:2007/07/01(日) 19:46:41
>>29
Arrayを前提としても困らないと思う
@hogeがpushの定義されていないオブジェクトであれば、Error投げてくれるし
もし自動的なチェックがないと不安なら

module M
 def add_hoge(x)
  validate_hoge
  @hoge.push(x)
 end
end

とすればいいし
32デフォルトの名無しさん:2007/07/01(日) 20:47:52
ttp://jp.rubyist.net/magazine/?0005-FirstProgramming
ここを見ながら、昨日からrubyを触っています。

ここのページ通りやれば、ruby/tkがインストールされており、
すぐに動くような記述ですが、いざやってみると、

tk84.dllがない。
アプリケーションをインストールしなおせば、問題は解決する可能性がある
と、ダイアログが出て、コマンドプロンクトは下記の用になります。

C:\ruby\wk\VN>ruby visualnovel.rb
C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so: 126: 指定されたモジュール
が見つかりません。
- C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError)
from C:/ruby/lib/ruby/1.8/tk.rb:7
from ./guiutil.rb:4:in `require'
from ./guiutil.rb:4
from visualnovel.rb:1:in `require'
from visualnovel.rb:1

当然ですが、
C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.soのファイルは存在します

一度、rubyを消して、再度インストールしましたがダメでした。

どうすればよいのでしょうか・・?

http://www4.ocn.ne.jp/~holmes17/html/rubytk.html
も、試してみましたが動きません。(設定が出来ていないだけかもしれませんが。

33デフォルトの名無しさん:2007/07/01(日) 21:15:13
どうしてTkを使おうとするの?
TkはRubyじゃないのに
34デフォルトの名無しさん:2007/07/01(日) 21:21:40
>>33
意味不明なこというな。
あらゆるライブラリが使えなくなるだろバカ。
35デフォルトの名無しさん:2007/07/01(日) 21:27:46
Rubyの勉強と称しておきながらRubyじゃない部分で詰まるのは確かにアホくさいよな
この場合はTk使わなければ問題ないわけだし
36デフォルトの名無しさん:2007/07/01(日) 21:44:02
>>32
dllファイルはmswin32環境の場合、以下の場所のいずれかに置く必要がある

ruby.exeと同じディレクトリ
C:\windows\system32
C:\windows\system
(マルチブート環境の場合、systemディレクトリの位置が違う可能性あり)

これらのディレクトリを全部調べて、tk84.dllが入っていないかどうかチェック
見つからなければどっかから持ってくる
たぶんActiveTclの8.4をインストールすれば勝手に入るはず
37デフォルトの名無しさん:2007/07/01(日) 22:58:56
>>18
個人的な好みとしては
unless a.size == 3 and a.any? {|r| if r.size == 3}
 raise ArgumentError, 'a must be 3*3 matrix'
end
38デフォルトの名無しさん:2007/07/01(日) 23:00:50
リンク先の記事を読むだけではrubyとtkが別物だってことは分らないし
初心者にはruby/tkがその別物のtkをrubyから触るためのライブラリだってことも分らないだろう
39デフォルトの名無しさん:2007/07/01(日) 23:25:23
>>35
>Rubyの勉強と称しておきながら

ぜんぜん称してないだろ。

アホくさいのは文盲なお前だ。
40デフォルトの名無しさん:2007/07/01(日) 23:49:09
>>36
ActiveTclの8.4をインストール」したら無事に動きました。
サンクス。



どうして、Tkを使うのか?
と言われても、サンプルがTkを使っているから。
サンプルコードをやる場合、極力同じ環境でやらないと、
動かない際、手順が悪いのか、設定が悪いのかわからないし、


知識があれば、どこかをいじるなり、、
他の方法で走らせる事が出来るんだろうけどね。

41デフォルトの名無しさん:2007/07/02(月) 13:19:47
動画ファイル(.wmv .avi等)からキャプチャ画像を作成するような
ライブラリーはないでしょうか?

例えば、秒数指定からやフレーム数指定などから自動で画像ファイルを出力するような。

よろしくお願いします。
42デフォルトの名無しさん:2007/07/02(月) 16:23:10
Rubyの仕事ではないと思う
コマンドラインというかCUIで操作が完結するプログラムはあるはずだから適当に探して使え
43デフォルトの名無しさん:2007/07/02(月) 17:07:31
>>40
> サンプルコードをやる場合、極力同じ環境でやらないと、

わざわざ別のバージョンを入れたからじゃないの?
...個人的にはサンプル通りにrc版入れる気にはならないから同情してあげるよ。
44デフォルトの名無しさん:2007/07/02(月) 21:19:38
>>43
32の下に載ってるURLを見ると分かるが
ActiveTcl8.3を入れろと書いてあるので、この場合はサンプル通りにやるとハマる
45デフォルトの名無しさん:2007/07/02(月) 21:27:40
知らんがなそんなん…個人サイトの記述がヘボいのまで面倒見てられんよ
46デフォルトの名無しさん:2007/07/02(月) 23:20:01
ActiveRubyでDLNAを制御したいんですが、名前が表示されません。
require 'win32ole'
o=WIN32OLE.new('UPnP.UPnPDeviceFinder')
ds=o.FindByType("urn:schemas-upnp-org:service:ContentDirectory:1",0)
ds.each { |d|  print d.ModelName }
下のvbsはちゃんと名前を表示するんですが...
Set o=CreateObject("UPnP.UPnPDeviceFinder")
Set ds=o.FindByType("urn:schemas-upnp-org:service:ContentDirectory:1",0)
For Each d in ds:WScript.Echo d.ModelName:Next
47デフォルトの名無しさん:2007/07/03(火) 12:45:14
ttp://blog.masuidrive.jp/index.php/2007/05/06/network-facade/
上記のブログのサンプルをコピペし、wikipedia.rbという名前で保存しました。

実行すると以下のようなエラーがでてきて困っています。解決策を教えて頂けませんでしょうか?
wikipedia.rb:15: undefined method `elements' for
#<XML::Node:0x103590c> (NoMethodError)

環境
Mac OSX ruby 1.8.5 (2006-08-25) [powerpc-darwin8.9.0]
network-facade (0.4)


windowXPの環境では正常に実行できました。

よろしくお願いします。
48デフォルトの名無しさん:2007/07/03(火) 15:49:59
ブレイクポイントやステップを使ってデバッグしたい時ってどうしてますか?
コマンドラインからでしょうか?

それともそんな方法でデバッグはしない?
EclipseのRDTでしているんだけど、ちょっと重い。。。
49デフォルトの名無しさん:2007/07/04(水) 11:05:32
質問です。

rubyでシステムを作った場合
ユーザーにソースって丸見えっすよね?

昔のMSのASPのようにソースコードの暗号化って可能でしょうか?
50デフォルトの名無しさん:2007/07/04(水) 13:24:45
>>49
webでやれば。
51デフォルトの名無しさん:2007/07/04(水) 19:10:16
>>49
Exerb
52デフォルトの名無しさん:2007/07/05(木) 15:06:56
http://www.61503891.com/notebook/index.php?cmd=read&page=Ruby%2FTips%2Ftkextlib%2Ftcllib%2Ftablelist%20%A5%DE%A5%EB%A5%C1%A5%AB%A5%E9%A5%E0%A5%EA%A5%B9%A5%C8%A5%DC%A5%C3%A5%AF%A5%B9
のサンプルを実行しようとしましたが,エラーになります。

まず,tablelist.rb tabeilst_core.rb tablelist_tile.rbを
/usr/lib/ruby/1.8/tkextlib/tcllibにコピーしました。
(ライブラリの追加ってこれでよいのでしょうか?)
オーナーとグループはコピー時のユーザーでroot wheelではないです。

でエラーは/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package tile (RuntimeError)
です。

因にruby -r tk -e 'p Tk::TK_PATCHLEVEL'の結果は
"8.4.7"
環境は Mac OS 10.4
プリインストール版の ruby 1.8.2です。
/usr/lib/ruby/1.8/tkextlibにはtileおよびtile.rbは存在してます。

rubyはプリインストールをただ使っていただけで,
ライブラリの追加は初めてで,
そもそもライブラリの追加はコピーでいいの?状態です。

以上よろしくお願いします。
53デフォルトの名無しさん:2007/07/05(木) 15:36:18
うちでは平気
54デフォルトの名無しさん:2007/07/05(木) 15:51:58
またまっくか

実行したいサンプルと同じディレクトリに置いておけばとりあえず確実に読まれるんじゃないの
実際に追加ライブラリをどこに置けば妥当なのかはあとで考えれば
55デフォルトの名無しさん:2007/07/05(木) 15:58:33
クラスの勉強で三目並べ製作中です。
http://briefcase.yahoo.co.jp/bc/sunsunlight_heart
クラスを作っていますがおかしいところや改善すべき点などを指摘してもらえると助かります。
56デフォルトの名無しさん:2007/07/05(木) 17:21:42
きったねー字だなあ

はともかく、もし提出ものであるのならRubyの宿題スレがあるからそっち持ってけ
まあ、見てる人は一緒だけどな

遊び方がないぞー
57デフォルトの名無しさん:2007/07/05(木) 19:14:13
rubyをコンパイルするときにできるminirubyとは何でしょうか。何のためにあるのでしょうか。
ls -l をしてみると ruby も miniruby もサイズは同じでした。
58デフォルトの名無しさん:2007/07/05(木) 19:21:46
rubyを作るために使われる制限つきruby。
具体的には拡張ライブラリの作成の際などに使用される。
「制限つき」とは言ったものの、プラットフォームによっては素のrubyと同様に使えることも多い。
59デフォルトの名無しさん:2007/07/05(木) 19:40:01
>>58
さんくすです。
ところでrubyをコンパイルするときに、指定したスクリプトを読み込んだ状態でバイナリを生成することはできますか。
たとえば cgi.rb と erb.rb を読みこんだ状態の ruby バイナリを作成し、CGIのパフォーマンスをあげてみたりとかできないでしょうか。
(mod_rubyやFastCGIは共用環境では使えない場合がほとんど)
60デフォルトの名無しさん:2007/07/05(木) 19:43:20
>>59
出来たとしてもそれこそ共用環境では使えないだろう
61デフォルトの名無しさん:2007/07/05(木) 19:53:27
>>56
宿題ではありません。
どこの世界にrubyでクラスを使ってプログラム組ませることを宿題とする大学があるのですか。
ふつうjavaでしょ
62デフォルトの名無しさん:2007/07/05(木) 19:57:34
>>61
東京都文京区本郷あたりにあるらしいです。
63デフォルトの名無しさん:2007/07/05(木) 19:58:31
>>59
そりゃまあソースレベルでいじればできるが、単純にやってもパフォーマンスはほとんどあがらんしなあ。
64デフォルトの名無しさん:2007/07/05(木) 19:59:12
>>60
建前はそうなのですがコンパイルしてしまえば使えるようなところもありますよ。
まあこれは例なのでその点にはあまりとらわれないでください。
で、もういちど質問しますが、rubyをコンパイルするときに、指定したスクリプトを読み込んだ状態でバイナリを生成することはできるでしょうか。
65デフォルトの名無しさん:2007/07/05(木) 19:59:17
>>61
最近では割とよくあるそうです
66デフォルトの名無しさん:2007/07/05(木) 20:00:07
>>61
俺から見るとJavaやるなんて冗談にしか思えないよ
普通はCだ
67デフォルトの名無しさん:2007/07/05(木) 20:00:45
>>63
>そりゃまあソースレベルでいじればできるが、

もうすこし具体的にお願いできますか。ソースのここを嫁とか。
68デフォルトの名無しさん:2007/07/05(木) 20:56:36
>>61
札幌市北区北10条西8丁目とかにもあるぞ
69デフォルトの名無しさん:2007/07/05(木) 21:01:54
>>67
ruby.cのload_fileあたりとか。
70デフォルトの名無しさん:2007/07/05(木) 21:03:05
>>67
拡張ライブラリ内にリテラルとしてスクリプトを置いてevalするようにした上でその拡張ライブラリをstaticにリンクするとか。
71デフォルトの名無しさん:2007/07/05(木) 21:03:28
Ruby2.0使えばいいんじゃね?
72デフォルトの名無しさん:2007/07/05(木) 21:06:16
>>71
Ruby2.0はどこでダウンロードできますか?
7347:2007/07/05(木) 21:17:47
すいません。
よろしくお願いします。
74デフォルトの名無しさん:2007/07/05(木) 21:43:13
perlにはdump機能があるけどrubyもできんもんかな。

要はライブラリとか読み込んだ状態のプロセスメモリ空間をファイルに
書き出して、それにヘッダつけたりの加工をして、適切な場所にジャンプする
ような実行形式を作るってことなんだろうけど。
75デフォルトの名無しさん:2007/07/05(木) 22:35:41
bRubyでぐぐってみるといいのではないかと。
76デフォルトの名無しさん:2007/07/06(金) 01:36:28
東大は北大はrubyがデフォなのか。
京大はCだぜ、しかしCはクラスがない。
だからおれはrubyを使う、だれがなんといおうとも

Stateクラスの実装について何か改善点ありませんか?
7752:2007/07/06(金) 15:19:00
tablelist.rb
tabeilst_core.rb
tablelist_tile.rb
を作業ディレクトリに置いて,sampleを実行しましたがエラーです。

/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package tile (RuntimeError)
        from /usr/lib/ruby/1.8/tkextlib/tile.rb:16
        from sample.rb:4:in `require'
        from sample.rb:4

tile.rb でTkPackage.require('tile')しているようですが(16行目)
TkPackageというモジュールでエラーになります。
78デフォルトの名無しさん:2007/07/06(金) 15:50:39
スーパークラス内で__FILE__定数を参照するメソッドがあって、
サブクラス内でそのメソッドを呼んだ場合、
__FILE__定数はスーパークラスのファイル名になってしまいます。



#super_class.rb
class SuperClass
 def hoge
  [File.basename(__FILE__, ".*"),'.html'].join
 end
end

#sub_class.rb
class SubClass < SuperClass
 def puts_hoge
  puts hoge()
 end
end

SubClass.new.puts_hoge #=> super_class.html


サブクラスのファイル名を取ってきてほしいのですが、その場合はサブクラス内に
__FILE__を参照するコードを書かないといけないのでしょうか。
なんか美しくないような気がするのですが、他に方法が思い当たらないです。。

何か良い方法があったら教えてください。宜しくお願いします。

79デフォルトの名無しさん:2007/07/06(金) 16:09:34
>>78
自己レス

$0グローバル変数で代用できました。
でもなんか微妙な気も…
80デフォルトの名無しさん:2007/07/06(金) 16:58:10
>>79
> $0グローバル変数で代用できました。
__FILE__とは意味がちがう。

>>78に関しては、他にないと思う。
81デフォルトの名無しさん:2007/07/06(金) 17:00:29
>>77
> TkPackageというモジュールでエラーになります。
Tkが古くてtile拡張とかないんじゃないの。
8252:2007/07/06(金) 17:38:21
>>81
レスありがとうです。
ruby -r tk -e 'p Tk::TK_PATCHLEVEL'は"8.4.7"
/usr/lib/ruby/1.8/tkextlib/tile
/usr/lib/ruby/1.8/tkextlib/tile/tile.rb
はあるのですが,「Tkが古くてtile拡張とかない」というのは、
Rubyの問題ではなく,Tkの問題ということですか?
Tkのバージョンをあげなさい,という教え?
83デフォルトの名無しさん:2007/07/06(金) 17:42:59
マリオテニスで言えば、
pythonがトリッキータイプ、rubyがテクニックタイプ。
そういうことですね
84デフォルトの名無しさん:2007/07/06(金) 20:04:34
>>66
古くはCOBOL、今はJava。
常に流行りに追従するしか能がない。
85デフォルトの名無しさん:2007/07/06(金) 21:09:16
京都はゲーム屋さんがあるからCやってんじゃね?
86デフォルトの名無しさん:2007/07/06(金) 21:40:31
ゲーム屋でいえば東京の方が多いだろふつう
87デフォルトの名無しさん:2007/07/07(土) 01:35:18
そういえば日常やっつけスクリプトばかりでゲームとかあまり作ったことないな、と思って三目並べに挑戦


ぶぴ(鼻血)


…最善手を取り合うのとかは後回しでいいよね
もしかしてそこがキモだから飛ばしたら駄目?
88デフォルトの名無しさん:2007/07/07(土) 01:44:51
>87
だめっつーか、自分で始めた自分のプロジェクトなんだから
自分が納得するよーにするのが一番だと思われ。
「とりあえずゲーム作ってみたいなー」ならCPUの思考ルーチンはてきとーでもいいかもだし
「俺は最強の三目並べを作るんじゃぁぁぁ!!」と燃えてるなら飛ばしちゃだめだろーし。
オブジェクト指向の修行、ということなら、思考ルーチンを差し替えしやすいように作ってみるとか。

何にせよ、take it easy ;)
89デフォルトの名無しさん:2007/07/07(土) 01:56:55
>>87
そのプログラム、どういうオチにするかは分かってるんだろうな?
90デフォルトの名無しさん:2007/07/07(土) 04:46:07
一気に3つ並べられる裏技作ることだろ?
91デフォルトの名無しさん:2007/07/07(土) 05:54:32
俺ならまずirbでプレイ出来るようにするから
GUI化前ならいつでも裏技使い放題だぜ
92デフォルトの名無しさん:2007/07/07(土) 10:29:43
>>87
最善手を先読みで思考せずに
経験から学ばそうとして
ランダムに打って勝てたらごほうび
負けたらおしおきみたいにして作ったら
そのうち最善手打つようになってくれるだろうか
93デフォルトの名無しさん:2007/07/07(土) 10:33:26
全局面のパタン数が十分少ないゲームならな
94デフォルトの名無しさん:2007/07/07(土) 10:42:10
3目ならべの全局面のパターン数って何個かな?
95デフォルトの名無しさん:2007/07/07(土) 10:43:10
3目並べプログラムの落ちってヲーゲームのあれだろ?
96デフォルトの名無しさん:2007/07/07(土) 10:58:02
ザ・デイアフターじゃなかったっけ
97デフォルトの名無しさん:2007/07/07(土) 11:07:40
ウォーゲームだよ
98デフォルトの名無しさん:2007/07/07(土) 12:26:30
Procオブジェクトをファイルに保存することはできますか。
99デフォルトの名無しさん:2007/07/07(土) 12:31:56
できますよ
100デフォルトの名無しさん:2007/07/07(土) 12:39:21
irb> Marshal.dump(lambda{|x| x})
TypeError: no marshal_dump is defined for class Proc
101デフォルトの名無しさん:2007/07/07(土) 13:06:09
ソースコードを文字列のまま保存しといて、後で使うときにeval系を使うしかないでしょ
元のソースコードを剥ぎ取ってProcオブジェクト自体をシリアライズするとなると、クロージャになってたりもするし、論理的に成立しないと思う
102デフォルトの名無しさん:2007/07/07(土) 15:14:22
とりあえずできないということですね。できないことが分かっただけでもよかったです。ありがとうございました。
>>101
できないのは、クロージャが原因ということでしょうか。
ということは、クロージャがある言語ではクロージャをシリアライズしてファイルに保存するのは無理またはできたとしても実に面倒ということ?
103デフォルトの名無しさん:2007/07/07(土) 15:18:44
Net::HTTPクラスを使ってHTTPリクエストを投げてレスポンスをフンフンする
処理を書いているのですが、文字コード判定ってどうやるのが普通なんでしょう?

1. read_bodyの結果をNKF.guessに放り込む
2. response["content-type"]からcharset取得 or HTMLからcharset取得
3. 素敵メソッド or 素敵ライブラリ使用

処理速度に問題がなければ1が手軽、面倒だけど最善なのが2
先人の知恵を拝借するのなら3

3が見つからないorz
104デフォルトの名無しさん:2007/07/07(土) 15:31:58
>>103
2がいいけど、ヘッダが間違ってる場合とかも考えないと駄目かも。
iconvで例外出たらHTMLからcharset取るとか?

3ならchardetというのがある。速度は遅めなのでbody全部じゃなくて先頭の数キロバイトだけ渡すとかしないときついかも。
ttp://d.hatena.ne.jp/Gimite/20070401/1175428674
105デフォルトの名無しさん:2007/07/07(土) 16:53:39
素朴な疑問ですけど
attr_reader :foo って
なんで @foo と書かないのでしょう?
106デフォルトの名無しさん:2007/07/07(土) 17:07:32
x.foo と使うから
107デフォルトの名無しさん:2007/07/07(土) 17:12:08
>>105
attr_readerメソッドへの引数なのでSymbolでないと駄目。
@fooと書いたらアクセサの定義ができない。
108デフォルトの名無しさん:2007/07/07(土) 17:16:08
このスレは勉強になるなあ (・∀・)
10947:2007/07/07(土) 17:56:04
むりやり自己解決しました。

libxml.soがきちんとインストールされてないみたいでエラーが出てたみたいなので

networkfa-facadeのrest.rb内の

begin
raise LoadError if ENV['FORCE_REXML']
require 'xml/libxml'
rescue LoadError
require 'rexml/document'
end

を読み込み順を逆にしてrexmlを読み込ませるようにしたらとりあえず動きました。

libxml-rubyがうまくgem installできないのが気になりますが・・・。
110デフォルトの名無しさん:2007/07/07(土) 18:03:01
attr系はメソッドゆえ、引数が評価(値を求め)されてしまう。
attr_reader @foo と書いたら attr_reader 「@fooの値」という意味になる。
ついでに、@fooはここではクラスのインスタンス変数だな。

class Moge
@foo = "bar"
attr_reader @foo

def initialize
@foo = "nullpo"
@bar = "ga"
end
end

p Moge.new.bar
p Moge.new.foo

実行すると

"ga"
undefined method `foo' for ...

なお、alias は構文なので、シンボルではなくメソッド名そのものを書く。

111デフォルトの名無しさん:2007/07/07(土) 22:36:34
便乗質問

attr_* :variableの定義は

def variable
@variable
end

def variable=(value)
@variable = value
end

の二つのメソッド定義のシンタックスシュガーだと認識してたんだけど、それでいいのかな?
attr_readerは上だけ、writerは下だけ、accessorは両方
112デフォルトの名無しさん:2007/07/08(日) 02:57:48
>111
うん、正解。だから

attr_reader :var
def var=(value)
@var = value
end

なんて風に、セッタだけ独自にしたりもできる。
113デフォルトの名無しさん:2007/07/08(日) 11:15:07
>>111
細かい突っ込みをすると、シンタックスシュガーってわけじゃない。文法じゃなくて
ただのメソッド呼び出し。中でそういうメソッド定義をリフレクションしてる。
114デフォルトの名無しさん:2007/07/08(日) 12:25:33
>>113 的確すぎてワロスw
115デフォルトの名無しさん:2007/07/08(日) 12:58:14
attr*に関するシンタックスシュガーつーと、
hoge.foo = "giko" と書くと hoge.foo=("giko")
の意味になるところかな。
116デフォルトの名無しさん:2007/07/08(日) 15:00:22
行列の積をプログラムしたいのだが上手くいかないんで
おかしいところを指摘してもらえないかな
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [[10,20,30],[40,50,60],[70,80,90]]
c = [[0,0,0],[0,0,0],[0,0,0]]
for( i=0; i<c.length; i++) {
for( k=0; k<c[i].length; k++ ) {
w = 0.0;
for( j=0; j<a[i].length; j++ ) {
w += a[i][j]*b[j][k]
}
c[i][k] = w
}
}
117デフォルトの名無しさん:2007/07/08(日) 15:20:51
Rubyにはそういう形式のfor文はないぜ。
118デフォルトの名無しさん:2007/07/08(日) 15:59:37
attr_accessor の中身って具体的にはどんなコードなんですか?
119デフォルトの名無しさん:2007/07/08(日) 16:10:21
120デフォルトの名無しさん:2007/07/08(日) 16:19:13
>>115
それって attr_*に限らずじゃない?

>>118
超妄想&コンパイル未確認&ieval系書いた事ほとんどない俺だけど
きっとこんな感じ

def attr_reader(name)

instance_eval( expr = <<-EOS
def #{name}
@#{name}
end
EOS
)
end
121デフォルトの名無しさん:2007/07/08(日) 16:31:04
>>118
object.cの中で

static VALUE
rb_mod_attr_accessor(argc, argv, klass)
  int argc;
  VALUE *argv;
  VALUE klass;
{
  int i;

  for (i=0; i<argc; i++) {
    rb_attr(klass, rb_to_id(argv[i]), 1, 1, Qtrue);
  }
  return Qnil;
}
void
Init_Object()
{
  /*略 */
  rb_define_private_method(rb_cModule, "attr_accessor", rb_mod_attr_accessor, -1);
  /*略*/
}

とあって、rb_attrはeval.cにある。
122デフォルトの名無しさん:2007/07/08(日) 16:36:22
void
rb_attr(klass, id, read, write, ex)
  VALUE klass;
  ID id;
  int read, write, ex;
{
  /*略*/
  if (read) {
    rb_add_method(klass, id, NEW_IVAR(attriv), noex);
  }
  if (write) {
    rb_add_method(klass, rb_id_attrset(id), NEW_ATTRSET(attriv), noex);
  }
}

こんなふうになってる。
123デフォルトの名無しさん:2007/07/08(日) 16:59:46
class Module
 def testatt(name)
  module_eval %-
   def #{name.id2name}() @#{name.id2name} end
   def #{name.id2name}=(arg) @#{name.id2name}=arg end
  -
 end
end
class C
 testatt :i
end
124デフォルトの名無しさん:2007/07/08(日) 17:24:13
パスカルの3角形を印字するプログラムを
作りたいのだが以下のプログラムで作るにはどうしたらいいのでしょうか?
教えてください。

print("Enter n: "); n = gets.chomp.to_i
if( n>30 || n<0 ) then
n = 10
end
a = Array.new( n )
a[0] = [1] # 要素が1 の長さ1の配列
# ここでパスカルの3角形を作る
# このとき、a[i]ごとに配列を作る
# そして、印字
for i in (0..a.length-1) do
for j in (0..a[i].length-1) do
print( " ", a[i][j] )
end
print( "\n" )
end
125デフォルトの名無しさん:2007/07/08(日) 18:56:46
そろそろ宿題の季節なのかな?

126デフォルトの名無しさん:2007/07/08(日) 19:57:45
っていうか、宿題は宿題スレに持ってけって
宿題がそもそも無いかあるいは回答できないほど書き込みがアホだからレスが無いだけで見てる人はきちんといるからさ

あと、Rubyでは繰り返し変数の存在に頼った既存型のfor文はほとんど使われない
配列を主体としたイテレータの概念を身に付けるといい
127デフォルトの名無しさん:2007/07/08(日) 20:00:04
http://pc11.2ch.net/test/read.cgi/tech/1106572657/645

引っ越しましたので
お近くにお越しの際は
ぜひお立ち寄りください
128デフォルトの名無しさん:2007/07/08(日) 20:11:38
>>126
そこのfor文はいじっちゃ駄目なんじゃね
a[0] = [1]
a[1] = [1, 1]
a[2] = [1, 2, 1]
a[3] = [1, 3, 3, 1]
a[4] = [1, 4, 6, 4, 1]
こういう配列を生成する部分を自分で(笑)考えて記述しろって問題だと思う
129デフォルトの名無しさん:2007/07/08(日) 20:33:48
隣り合う数字同士を足せばよい
130デフォルトの名無しさん:2007/07/08(日) 22:19:41
これで「パスカルの三角形」自体を理解してないとかだったら笑う
131デフォルトの名無しさん:2007/07/08(日) 23:46:15
MySQLに
title VARCHAR(255)
body TEXT
なものを作成してscaffoldで生成してみたんだけど、body TEXTの中身が改行とかHTMLを無視してそのまま出力される
RDocとかいうのを見つけて試してみたけど、相変わらず改行とか反映されてない、誰か解決策を…(´д`;)
132デフォルトの名無しさん:2007/07/08(日) 23:57:01
>>131
スレ違いも良いところだし端折り過ぎだろw
読む方の身になって文章書いてみろって
133デフォルトの名無しさん:2007/07/09(月) 00:20:53
しまった、ここはRubyスレだったか!

orz素で勘違いしたスマン!
134デフォルトの名無しさん:2007/07/09(月) 15:35:04
>>82
> ruby -r tk -e 'p Tk::TK_PATCHLEVEL'は"8.4.7"

http://cappuccino.jp/keisuken/logbook/20060128.html#c01
: > 最近はL&Fを切り替えられる(Tk8.5以上)
: 自分でインストールすれば,Tile 拡張は Tk8.4 でも使えますよ.
だそうだ。

> Rubyの問題ではなく,Tkの問題ということですか?
> Tkのバージョンをあげなさい,という教え?
あるいは自分でインストールしろ、ということになるな。
13582:2007/07/10(火) 12:17:50
>>134
thanks
Tcl/Tk Aqua 8.4.14をインストールし,
Ruby 1.8.6をインストールしました
(ただしMacPorts利用です。port install ruby +mactk)
で、tile がないというエラーはなくなりました。
が、今度はTablelist_tileがないというエラーです。

/opt/local/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package Tablelist_tile (RuntimeError)

Tablelist_tileのそれらしいpackageも見つからないので,
Tcl/Tk Aquaに問題があるのかもしれません(当てずっぽうですが)

この初心者スレッドのレベルを超えてるのでしょうか?
Rubyのメーリングリストに参加して聞いた方がいいかな?

いずれにしても,134さんありがとです。かなり助かりました。
136デフォルトの名無しさん:2007/07/10(火) 13:51:59
>>135
> この初心者スレッドのレベルを超えてるのでしょうか?

レベルというより、Tcl/Tk Aquaとの組合せで使ってる人間じゃないと答えようがない。

> Rubyのメーリングリストに参加して聞いた方がいいかな?

そのほうが情報は集まりやすいし後から探す人にもプラスだと思う。
137デフォルトの名無しさん:2007/07/11(水) 16:36:08
某るびまがに載ってたコードをちょっと改造:
require 'net/http'

Net::HTTP.start('​www.honyara.com',80)​ {|http|
res = http.post('/up.html/upload.cgi',"upload=C:\\test.txt")
puts res.body
}
アップローダ側にはファイル名だけの空のファイルが作られてうまくアップロードされない。
そもそもこのコードではファイルアップロードが出来ないのだろうか。
あっちこっち調べているがわからない。教授願う。
138デフォルトの名無しさん:2007/07/11(水) 17:06:02
>>137
そもそもSyntaxErrorじゃないかと思うんだが、それは見なかったことにしよう。

ファイルをアップロードするにはCGI仕様でファイルアップロードをどう扱うか知っている必要があるんだが、たぶん何にも知らないんだよな、こう質問するということは。
ファイルアップロードではmultipart/form-data形式でちゃんとデータをフォーマットしないといけない。
Rubyと関係ないので細かく説明しないが、たまたまRubyで書かれた例がruby-devにあったので参考にするといい。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/28470
139137:2007/07/11(水) 17:16:55
>>138
己の無知に赤面。
勉強して出直す。ともかくサンクス!
140デフォルトの名無しさん:2007/07/12(木) 11:01:09
当方プログラミング初心者なのですが、まったくプログラミングの知識が無い人に
おすすめのRuby入門書などはありますか?
141デフォルトの名無しさん:2007/07/12(木) 12:16:28
たのしいRuby 第2版
http://www.amazon.co.jp/o/ASIN/4797336617/
いまだにこれのみ

ただし、プログラミングを知らないが○○は知ってる、の○○に依存
フォルダの概念を理解しない人にRubyプログラミングを教えるのは難しい
142デフォルトの名無しさん:2007/07/12(木) 12:54:07
HTML の日記や掲示板から記事を切り出すのにおすすめなライブラリを教えて下さい。
ずっと tagiter.rb というのを使っていたのですが、最近の流行りが知りたいです。
143デフォルトの名無しさん:2007/07/12(木) 13:45:43
144デフォルトの名無しさん:2007/07/12(木) 14:15:38
>>142
Hpricotかな
145デフォルトの名無しさん:2007/07/12(木) 15:15:27
文字列リテラルで、バックスラッシュ記法を無効にする書き方はないでしょうか?
'c:\hoge\moge\hoge'
だと、エスケープされてしまいます。
146デフォルトの名無しさん:2007/07/12(木) 15:16:23
>>140
Javaから学んだ方が早く理解できるYO。
急がば回れで。
147デフォルトの名無しさん:2007/07/12(木) 15:25:53
>>145
%s!c:\hoge\moge\hoge!
とか?
148デフォルトの名無しさん:2007/07/12(木) 16:27:57
>>147
シンボルリテラルになるので、
%s!c:\hoge\moge\hoge!.to_s
でよいのかな?
149デフォルトの名無しさん:2007/07/12(木) 18:50:52
>>146
なぜそこでJavaになるんだ
PythonとかC++とかVBとかあるじゃん

個人的にJavaは仕様がでかすぎて入門には厳しいと思う
150デフォルトの名無しさん:2007/07/12(木) 19:14:08
メソッドチェーンが楽しくて大学の講義課題のプログラムが1行になってしまいました・・・
チェーンをどこで切ったら良いのかわかりません><;
151デフォルトの名無しさん:2007/07/12(木) 19:49:38
切らんでええやん
152デフォルトの名無しさん:2007/07/12(木) 20:11:58
別プロセスで起動した Ruby アプリ同士で、変数を受け渡ししたいのですが、
どのようにすればよいのでしょうか。

OS は windows XP|Vista です。
153デフォルトの名無しさん:2007/07/12(木) 20:37:24
score = {"hiroyuki"=>80, "boon"=>50, "yaruo"=>25}
というハッシュがあって、valueが最大のkeyを返すメソッドってありますか?
154デフォルトの名無しさん:2007/07/12(木) 20:45:49
irb> score.max{|a,b| a[1] <=> b[1]}
=> ["hiroyuki", 80]
155デフォルトの名無しさん:2007/07/12(木) 21:27:59
a = Array.new

(0..5).each do |i|
a[i] = {i.to_s => i, (i+1).to_s =>i+1}
a += Array.new
end

こんなんでいいんですかね?
5回まわしてますが、何回まわすかは環境依存なので、最初にArray.new(5)とは
できないです。

もうちょっとスマートなやり方があるような気がするのですが。。。
156デフォルトの名無しさん:2007/07/12(木) 21:49:00
a = []
5.times {|i| a[i] = {i.to_s => i, (i+1).to_s =>i+1} }
p a

じゃダメ?
157デフォルトの名無しさん:2007/07/12(木) 21:49:13
>>155
何をしたいのかよくわからんが

a = Array.new

(0..5).each do |i|
a[i] = {i.to_s => i, (i+1).to_s =>i+1}
end

これで動く
Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから
Array.newにサイズを指定するメリットは通常使用上無い

a= Array.new
a[2] = '3rd'
a[4] = '5th'
p a #=> [nil, nil, '3rd', nil, '5th']
158デフォルトの名無しさん:2007/07/12(木) 21:54:56
>>156-157
サンクス。
そっか、勝手に伸びてくれるのか〜。
a += Array.new がなんか気持ち悪かったんだよね。
159デフォルトの名無しさん:2007/07/12(木) 22:10:54
>>152
Rinda が楽だよ
160デフォルトの名無しさん:2007/07/12(木) 22:36:42
> Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから
知らなかった・・・
ドキュメントでどの辺かに、記述ありますか?
161デフォルトの名無しさん:2007/07/12(木) 22:37:35
Arrayに思いっきり書いてありました。

> self[nth]=val
> nth 番目の要素を val に設定します。nth が配列の範囲を越える時には
> 配列の長さを自動的に拡張し、拡張した領域を nil で初期化します。
162デフォルトの名無しさん:2007/07/12(木) 22:51:04
ファイルパスの拡張子のみを変更する方法は、ありませんでしょうか?

/hoge/moge/hage.txt

/hoge/moge/hage.xml
みたいに変えたいのですが、

basename 使おうとしたのですが、ファイル名だけしか返ってきません・・・
パスほすい
163デフォルトの名無しさん:2007/07/12(木) 22:53:44
>>162
こちらのページに例がありました。

ファイルの拡張子を変更する (山本隆の開発日誌)
http://www.gesource.jp/weblog/archives/2005/07/post_1.html

change_ext("sample.txt", ".html") #=> sample.html

# ファイル名(filename)の拡張子をextに変更する
def change_ext(filename, ext)
return filename.gsub(/\.\w+$/, ext)
end
164デフォルトの名無しさん:2007/07/12(木) 23:19:43
>>162
そこでrioですよ。


ario = rio('dirA/dirB/afile.rb')
ario.extname = '.txt' # rio('dirC/bfile.txt')
http://rio.rubyforge.org/classes/RIO/IF/Path.html#M000196
165デフォルトの名無しさん:2007/07/13(金) 06:19:34
まったくの初心者ですが、XPなのでmingwin32をいれました。
いろいろ種類があるようで、これでいいのか迷うのですが、みなさんはなにを使ってますか?
166デフォルトの名無しさん:2007/07/13(金) 06:57:22
俺はスク水派かなぁ
167デフォルトの名無しさん:2007/07/13(金) 07:27:31
WScriptから呼べるからActiveScriptRuby使ってるな。
168デフォルトの名無しさん:2007/07/13(金) 08:12:09
globってどういう意味なん?
169デフォルトの名無しさん:2007/07/13(金) 08:23:39
170デフォルトの名無しさん:2007/07/13(金) 08:27:54
で、globってどういう意味なん?
171デフォルトの名無しさん:2007/07/13(金) 08:34:35
語源はglobalの略と聞いたことがある。

172デフォルトの名無しさん:2007/07/13(金) 09:32:10
>>170
勘で適当に答えると「掴む」じゃないかな?
野球のグローブっつーのもあるし。

つか辞書引け。
173デフォルトの名無しさん:2007/07/13(金) 09:34:10
わからない単語はまず Jargon を引け、と教わりませんでしたか?
ttp://www.catb.org/~esr/jargon/html/G/glob.html
174デフォルトの名無しさん:2007/07/13(金) 09:39:55
You stupid glob of glue!
175デフォルトの名無しさん:2007/07/13(金) 11:39:02
>>162
path = "/hoge/moge/hage.txt"
File.join(File.dirname(path), File.basename(path, ".*")+".xml")
176デフォルトの名無しさん:2007/07/13(金) 11:42:08
>>154
max_by と思ったら1.9からだったか。
177デフォルトの名無しさん:2007/07/13(金) 12:25:35
>>174
オバカさんが手掛りを掴んだ!(やったね)
178デフォルトの名無しさん:2007/07/13(金) 19:16:08
取得したデータの判別をしたいのですけど
ruby に perlのFile::MMagic 相等のライブラリってありますか?
179デフォルトの名無しさん:2007/07/13(金) 20:01:07
180デフォルトの名無しさん:2007/07/13(金) 20:28:09
彼女のメソッドがすべてプライベートになってしまってアクセスできなくなりました
どうしたらいいですか?
181デフォルトの名無しさん:2007/07/13(金) 20:37:16
>>180
このスレ的には、オープンクラスなので好きにオーバーライドしてアクセスしろ、が答えか。
182デフォルトの名無しさん:2007/07/13(金) 21:00:04
関数型はOKなはずです
183デフォルトの名無しさん:2007/07/14(土) 01:23:21
>180
彼女.instance_eval {} 内で実行すればOK
但し instance_eval はデリケートだから扱いに注意しろよ
184178:2007/07/14(土) 01:31:04
>>179
お礼が遅れました。ありがとうございました。
185デフォルトの名無しさん:2007/07/14(土) 01:31:44
>>180
スレ違い

彼女がオープンソース化されそうです
http://pc11.2ch.net/test/read.cgi/unix/1000484092/

彼女をmountできません
http://pc11.2ch.net/test/read.cgi/unix/1059971117/

彼女にポートスキャンの形跡が!!!
http://pc11.2ch.net/test/read.cgi/unix/1014614044/

彼女をCVSで管理したい
http://pc11.2ch.net/test/read.cgi/unix/999837578/

彼女にloginできません
http://pc11.2ch.net/test/read.cgi/unix/1007136614/
186デフォルトの名無しさん:2007/07/14(土) 01:36:15
>185
ここを忘れてるぞ。

彼女にINSERT権限がありません
http://pc11.2ch.net/test/read.cgi/db/1057289721/
187デフォルトの名無しさん:2007/07/14(土) 01:48:33
188デフォルトの名無しさん:2007/07/14(土) 01:56:30
rubyでgnutellaとかのp2pアプリ作りたいんですけどなんかライブラリないですか?
189デフォルトの名無しさん:2007/07/14(土) 02:02:36
ライブラリありきでで作るようなもんじゃねーだろう
190デフォルトの名無しさん:2007/07/14(土) 03:47:53
rubytellaってすでにあるが
191デフォルトの名無しさん:2007/07/14(土) 07:50:15
>>185-187
くだらねぇw
192デフォルトの名無しさん:2007/07/14(土) 08:39:54
Rubyの添付ライブラリのソースを見ていると
たとえばuriライブラリだと
common.rbやganeric.rbなどに分けられているんですが
それぞれどういう意味で分けてるんですか?
193デフォルトの名無しさん:2007/07/14(土) 09:02:56
おまえにはまだ早い!
194デフォルトの名無しさん:2007/07/14(土) 09:51:48
趣味だと思う
Rubyあるいは一般プログラミング作法的に何かポリシーが存在してるわけじゃないんじゃないかな
195デフォルトの名無しさん:2007/07/14(土) 11:08:07
>>192
generic.rbはGeneric URIに対応してると思う。
common.rbは文字通りいろんなURIに共通する部分。
URIに関するRFCでも読んでみたら?
196デフォルトの名無しさん:2007/07/14(土) 17:20:13
mapを最初の一個だけに適用するってことはできませんか?
通常字は、配列全体を返したいのですが、デバッグ時には、最初の一個だけほしいのですが・・・

a = [1, 3, 10, 100]
b = a.map{|i| i * 2}
p b

b = a.map{|i| i * 2; break}
p b
197デフォルトの名無しさん:2007/07/14(土) 17:21:47
計算すらしたくないの?

欲しいというだけなら
p b.first
じゃ駄目なん?
198デフォルトの名無しさん:2007/07/14(土) 17:42:05
途中で送信してもた orz


b = a.map{|i| i * 2; break}
p b

だと、nilになってしまう・・・
199デフォルトの名無しさん:2007/07/14(土) 17:42:42
>>197
あ、そっか、全部計算してからfirstでもいいか
200デフォルトの名無しさん:2007/07/14(土) 19:59:15
>>198
a.map{|i| break i*2}
201デフォルトの名無しさん:2007/07/14(土) 20:09:07
method call と proc call (or yield) で速度の違いってありますか
もし違いがないなら proc を使おうと思っているんですが、method にしたほうが速いなら method にしようかなと考えています
202デフォルトの名無しさん:2007/07/14(土) 21:19:35
>>200
お、できた!
と思ったら、配列がかえってこないのは仕様かな?
203デフォルトの名無しさん:2007/07/14(土) 21:23:03
まあ、わかっているなら、Arrayにすりゃいいか・・・
a.map{|i| break [i*2]}
204デフォルトの名無しさん:2007/07/14(土) 21:24:23
>>201
コード全体の性質や呼び出し回数、Proc生成数、マシン環境など色々な要因で変わる
使用するコードでベンチマーク取れ

参考までに書くと、俺の環境でやった単純なcallベンチマークなら
proc callにはmethod callの2倍ほど時間がかかっている
ただし50万回程度呼び出さないと大きな差は付かない
205デフォルトの名無しさん:2007/07/14(土) 21:27:00
>>202-203
そもそもトリッキーなやり方を使わずに

a.dup
a[0] = a[0] * 2

とするのが一番いいんじゃないのか?
206デフォルトの名無しさん:2007/07/14(土) 22:12:59
>>204
さんくすです。
・proc callはmethod callより遅いのは確か
・でも気にするほどのことではない
ということですね。
今回はprocの中身が比較的重い処理であり、呼び出しコストより実行コストの方がずっと大きいと思われるので、
method callにしたところで意味のある差はでないと推測し、取り扱いが楽なprocで行くことにします。
ありがとうございました。
207デフォルトの名無しさん:2007/07/14(土) 22:29:45
rdocってpdfに出力できないですか?
208デフォルトの名無しさん:2007/07/14(土) 22:49:09
>>205
あ、いや、i*2は例でして、実際は、複数行にわたって、いろいろ処理してました。
誤解をあたえてしまってスマソ。

結局、1個目までじゃなくて、10個目まで、処理とかも必要になったので orz
each_with_indexに置き換えてしまいました。

一部の要素に使うときは、mapでは、無理くさいですね
一部返す場合は、selectとか使うんだろうか
209デフォルトの名無しさん:2007/07/14(土) 23:10:15
rubyで、エロサイトのスクレイパーを作ってるんですが、
拾ってきたページをキャッシュするライブラリってないでしょうか?

というか、こういうのって、どうやって探したらよいんだろ?
RAAってのを検索して見つけるものなんでしょうか?
210デフォルトの名無しさん:2007/07/14(土) 23:29:02
RSSで、cacheで検索してみましたが、オブジェクトのキャッシュライブラリみたいのばかりで、
ページのキャッシュは見つかりませんでした。

gem search cache --remote
もやってみましたが、同じような結果でした。

211デフォルトの名無しさん:2007/07/14(土) 23:48:41
数行のrubyなのに、ものすごいプログラムありませんか?
212デフォルトの名無しさん:2007/07/14(土) 23:53:37
>>209
普通にディレクトリ掘って保存してネットのLast-Modifiedとローカルのctimeを同期しとけばいいじゃん
完全なWebブラウザとして振舞わなくてもいいなら尚更
213デフォルトの名無しさん:2007/07/14(土) 23:59:24
>>209
RAAよりrubyforge探した方がいいかもしれん。
214デフォルトの名無しさん:2007/07/15(日) 00:22:11
>>210
ページをオブジェクトにしてキャッシュとか出来ないの?
215デフォルトの名無しさん:2007/07/15(日) 00:25:26
>>214
怖いこと言うな
216デフォルトの名無しさん:2007/07/15(日) 01:04:43
217デフォルトの名無しさん:2007/07/15(日) 01:13:29
>>213
rubyforge探したけどない感じ('A`)

>>212
そうっすね。難しくはないと思う

・URLからHash生成
・Last-Modiedのみの取得
・Last-Modiedとローカルctime比較
・キャッシュがないか、日付が新しければ、Hash名でキャッシュを書き込み
・日付が古ければ、キャッシュから読みこみ
・Optionで、ディレクトリ指定
この辺出来たら、できそう

open-uri風味に出来たら最高なんだけど・・・

>>214
('A`)
218デフォルトの名無しさん:2007/07/15(日) 01:17:06
>>216
ウホッ!!
まさに、そういう話です。
open-uri対応!?マジ欲しかったものです
試してみます
219デフォルトの名無しさん:2007/07/15(日) 02:43:52
>>215
いやいや、オブジェクトの永続化でMarshalとかアレやコレ(ry
でもローカルにバイナリで出力されるからブラウザで直接見れな(ry
220デフォルトの名無しさん:2007/07/15(日) 03:31:00
>>216 を last-modified対応に書き換えようとしたのですが、
取得しようとしてたサイトがどうやら動的生成なせいで、
last-modified が、nilで帰ってきて、キャッシュの比較しようがない罠 orz

意味ねえw
更新されないページだけ、キャッシュとるようにします

とりあえず、助言くださったみなさまありがとうございました。

221デフォルトの名無しさん:2007/07/15(日) 03:38:20
文字列にしてしまってその違いを比較すれば
222デフォルトの名無しさん:2007/07/15(日) 04:30:40
Dir内のエントリをディレクトリ→通常ファイル
の順にソートしてeachループで使いたいんだけど

ディレクトリだけ処理、ファイルだけ処理とループを
二回回すの以外になんかいい方法ある?

さっき書き捨てスクリプト書いたときには二回回して
しまった。。orz
223デフォルトの名無しさん:2007/07/15(日) 05:45:45
myscript *.txt foo bar
とやってARGVの中調べると
*.txtが展開されちゃうんですが
ARGVが["*.txt", "foo", "bar"]
になるようにするにはどうすればいいですか?
224デフォルトの名無しさん:2007/07/15(日) 05:58:20
>>223
展開してるのはrubyじゃなくて、シェルのほうじゃないの?
225デフォルトの名無しさん:2007/07/15(日) 06:43:00
cmd.exeなんですがそれはないと思いますが・・・
Ruby側では特に展開していないと言うことでしょうか?
226デフォルトの名無しさん:2007/07/15(日) 07:09:40
>>223
Windows用のRubyはシェルじゃなくRuby側で展開してるはず。
とりあえず、*.txt を '*.txt' にして展開を抑制するとか。
227デフォルトの名無しさん:2007/07/15(日) 11:36:40
>>>222

Dir['*'].partition{|e| FileTest.directory? e}.flatten
とか。
228デフォルトの名無しさん:2007/07/15(日) 11:54:24
Ruby使ったことがない教授にRubyでプログラム書いて渡したら
「よめねぇよちきしょうがー!」って怒られた(´・ω・`)ショボーン
229デフォルトの名無しさん:2007/07/15(日) 12:12:27
お前はラテン語で問題出されても文句言わないんだな
230デフォルトの名無しさん:2007/07/15(日) 12:44:30
DEMONSTRA THEOREMAM ULTIMAM FERMATIANO
231デフォルトの名無しさん:2007/07/15(日) 12:47:45
自分で書いたRubyのソースコードを
>ruby hoge.rb foo bar
じゃなくて
>hoge foo bar
と普通のコマンドのように使うようにするにはどうしたらいいんでしょうか?
OSはWindowsXPです
232デフォルトの名無しさん:2007/07/15(日) 12:50:27
system32にぶち込む
233デフォルトの名無しさん:2007/07/15(日) 12:52:13
exerbでexe化する
234デフォルトの名無しさん:2007/07/15(日) 12:56:14
>>232
できました!あがりとうござまいした!
>>233
オブジェクトコードのファイルサイズがでかいのはちょっと遠慮しときます^^;
235デフォルトの名無しさん:2007/07/15(日) 12:57:24
Explorerの[ツール|フォルダオプション]関連付けで
.rbに
c:\ruby\bin\ruby.exe "%1" %*

.rbwに
c:\ruby\bin\ruby.exe "%1" %*
を関連付けて
環境変数pathextに
.rb;.rbw
を足す。
これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
236デフォルトの名無しさん:2007/07/15(日) 13:15:05
俺はいつもバッチファイル作ってる。
237デフォルトの名無しさん:2007/07/15(日) 13:43:25
>>235
> .rbwに
> c:\ruby\bin\ruby.exe "%1" %*
rubyw.exeにしないのか?

> これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
これはperlでやっても何でやっても同じ現象だから、Windows(というかたぶん
ShellExecute())の制限。
238デフォルトの名無しさん:2007/07/15(日) 13:55:46
自分では試したこと無いけど、

ttp://www.notwork.org/rubyrecipebook/errata.html
> Windows 環境について、「関連付けを使って起動するとリダイレクトや
> パイプが使えなくなります」とありますが、 Windows 2000 SP4 または
> Windows XP SP1 以降においてはレジストリを編集することで解決できます

ttp://support.microsoft.com/default.aspx?scid=kb;en-us;321788
239デフォルトの名無しさん:2007/07/15(日) 13:59:51
>>237
> Windows(というかたぶんShellExecute())の制限。
パイプやリダイレクトを繋ぐのはシェルの役目だから
このへんの事情はUNIXも同じ。
240デフォルトの名無しさん:2007/07/15(日) 15:52:16
何でこういう情報いつまでたってもまとまんないの?
241デフォルトの名無しさん:2007/07/15(日) 15:59:37
まとめる人が居ないからさ
242デフォルトの名無しさん:2007/07/15(日) 17:27:11
>>239
> パイプやリダイレクトを繋ぐのはシェルの役目だから
だからcmd.exeの問題だって。

> このへんの事情はUNIXも同じ。
寡聞にしてそういう環境は聞いたことがない。
243デフォルトの名無しさん:2007/07/15(日) 21:09:08
>>229
出されることだってあり得る状況なら、文句言うのはおかしい。
244sage:2007/07/16(月) 00:08:43
rubyから茶筅を使う方法を教えてください。
245デフォルトの名無しさん:2007/07/16(月) 00:12:30
>244
Chasen使ったことはないんだが、ruby chasenでぐぐってみた?
246デフォルトの名無しさん:2007/07/16(月) 00:58:47
文字列を16進数表現に変換する方法はありますか?

最終的にやりたいことは半角文字列と全角文字列の判別です。
247デフォルトの名無しさん:2007/07/16(月) 01:49:50
あります
248デフォルトの名無しさん:2007/07/16(月) 02:07:46
p "a"[0]
249デフォルトの名無しさん:2007/07/16(月) 02:10:54
"hogahdsfajeo"[i]
250デフォルトの名無しさん:2007/07/16(月) 03:29:58
丁度おれもしらべてた。

>>246
16進法にするだけなら、
a = "%x" % 25
a = "%x" % "25" # 文字列でも可


>>247
ww
251デフォルトの名無しさん:2007/07/16(月) 04:02:05
25.to_s(16)
252デフォルトの名無しさん:2007/07/16(月) 07:02:40
str.split(//).each do |c| false if c<0x80 end
253デフォルトの名無しさん:2007/07/16(月) 09:46:57
pack/unpackをお忘れか。
254デフォルトの名無しさん:2007/07/16(月) 09:55:55
そうやって一発で例を書けない程度には忘れられてると思うぞ
255デフォルトの名無しさん:2007/07/16(月) 10:28:25
pack/unpackはPerl臭がするからやだ
西本孝志に
西本孝志に
西本孝志に

ごっすんごっすん五寸釘
257デフォルトの名無しさん:2007/07/17(火) 01:47:35
>256
知らないわ そんな魔法
258デフォルトの名無しさん:2007/07/17(火) 02:53:39
早稲田卒なことだけが、自慢です〜
259デフォルトの名無しさん:2007/07/17(火) 09:13:43
>>223
今ごろレスしてみるけど
Windowsでワイルドカードを展開してるのはCランタイムのスタートアップルーチン
VCの事は使ったこと無いのでよく知らないのだけど
そのVCとおなじランタイムのmsvcrt.dllを使ってるMingwで何の指定せずにコンパイルすると
もれなく引数のワイルドカードを展開するようになるので
たぶんVCでも同じだと思う

ワイルドカードの展開をさせずに引数を渡すには「”」や「'」でくくってやるとよい
クォーティングされた引数にはなにもしない
myscript "*.txt" foo bar
でOK

<>|&とかをシェルに解釈させたくない時は「”」でくくる
なので、とにかくシェルやランタイムに触られたくない引数はダブルクォーティングするとよろし
260デフォルトの名無しさん:2007/07/17(火) 09:40:03
>>259
それ本当?ダブルクォートだと展開されちゃうと思うよ。
261デフォルトの名無しさん:2007/07/17(火) 10:26:04
俺もwin32/win32.cのrb_w32_cmdvectorの中を見て、
シングルクォートだけが対象になっていると思ったが、
cmd.exe越しにダブルクォートでくくると、なぜかglob展開されなくなってた

どうなってんだこれ?
262デフォルトの名無しさん:2007/07/17(火) 13:05:48
展開されるぞ?

> ruby -v
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]

> ruby -e "p ARGV" "*.*"
["20060402.rb", "20060402.txt", "20060425.rb", ...(以下略
263デフォルトの名無しさん:2007/07/17(火) 13:17:48
手元にあるやつで実験したら
cygwin版(1.8.6)だと展開されないぽい
asr(1.8.5)だと展開された
264デフォルトの名無しさん:2007/07/17(火) 15:21:57
同じバージョンでmswinとmingwとで違うのかな?
cygwinの場合は極力LinuxやUNIXと同じになるよう設計されてるハズだから
勝手に展開制御されるようにコンパイルされても何も不思議はないが
265デフォルトの名無しさん:2007/07/17(火) 16:36:30
> ruby -ve "p ARGV" "*"
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mingw32]
["AUTOEXEC.BAT", "boot.ini", "bootfont.bin", ..省略.. ]

% ruby -ve "p ARGV" "*"
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-freebsd6.1]
["*"]

MSVCRT版の挙動を改善するべきだと思う
266デフォルトの名無しさん:2007/07/17(火) 16:54:13
>>259
>Windowsでワイルドカードを展開してるのはCランタイムのスタートアップルーチン
大嘘。
261が書いてるように、ruby自体がwin32/win32.cの中で処理している。

>>263
cygwinは全然違う。win32/win32.cをそもそも使わない。

>>264
mswinとmingwは同じ。

まさかmingwとcygwinを混同してる奴がいる?
267デフォルトの名無しさん:2007/07/17(火) 17:38:13
>>266
| > Windowsでワイルドカードを展開してるのはCランタイムのスタートアップルーチン
| 大嘘。
大嘘と言うほどではない。
渡された素のワイルドカードはMSVCRTの__getmainargs関数を用いて
スタートアップルーチンが展開しているし、二重引用符で囲まれたワイルドカードは
Rubyが展開して(しまって)いる。

VCの方は知らないが、MinGWのワイルドカード展開については以下が参考になる
ttp://www.lyra.org/pipermail/scite-interest/2002-March/000436.html
268デフォルトの名無しさん:2007/07/17(火) 18:05:55
>>267
君がどこまでCランタイムを読みこんでるのかは知らんが、MSVCRTというか
スタートアップルーチンがワイルドカードを展開するのはsetargv.objをリンクした
時だけなんだよ。
それ以外の場合、__getmainargsに渡される引数dowildcardは0で、結果として
ワイルドカードは展開されない。
君が貼ったURLにもそのことは明記されているよ。

さて、ここまで言えばわかると思うが、ruby.exeはsetargv.objをリンクしていない。
というわけで、二重引用符で囲んであろうがなかろうがワイルドカードを展開
してるのはruby自体のwin32/win32.cのrb_w32_cmdvector。
269デフォルトの名無しさん:2007/07/17(火) 18:59:56
>>268
俺が間違っていた。
MSVCRT版は__getmainargsどうこうではなくて、main関数で受けた引数がなんで
あろうとwin32/win32.cのrb_w32_cmdvectorで上書きしていたのだな。
失礼した。
270デフォルトの名無しさん:2007/07/17(火) 19:15:29
二重引用符で囲んであるワイルドカードを展開しないなら
"C:\Program Files\*.*"
はどう書くの?引用符を削ると引数が分かれるし。
271デフォルトの名無しさん:2007/07/17(火) 19:40:07
だから囲んであっても展開する、という仕様なんじゃない?
単にコマンドライン引数として * を渡したいなら '*' で渡せるようになってるみたいだし。
272デフォルトの名無しさん:2007/07/17(火) 20:12:07
>>270
二重引用符は全体だけでなく、部分部分を囲むことが出来る
『"C:\Program Files"\*.*』でも『C:\Program" "Files\*.*』でも問題ない
273デフォルトの名無しさん:2007/07/17(火) 21:11:52
どこに原因があるのかはともかくおせっかいな挙動だな
274デフォルトの名無しさん:2007/07/17(火) 22:19:41
俺は、てっきりシェルか何かが展開してるのかと思っていた
275デフォルトの名無しさん:2007/07/17(火) 23:10:19
Linux版Rubyはほぼシェル任せなんじゃね?
Win版は挙動を近付ける為に細工されてるって話かと
276デフォルトの名無しさん:2007/07/18(水) 00:01:35
任せるも何も、そうなってないUNIXのシェルって聞いたことない。
277デフォルトの名無しさん:2007/07/18(水) 00:07:26
Winは未だにワイルドカードの展開はアプリケーション側に任されている
だからRubyもその精神に従っている

まあWinにとってコマンドラインは後方互換のお荷物でしかないからな
と、M$の人は考えてるんじゃないですかね
278デフォルトの名無しさん:2007/07/18(水) 00:13:52
PowerShellとかいうやつのはどうなってるんだろう。
279デフォルトの名無しさん:2007/07/18(水) 09:52:32
で、結局どうあるべきなん?
>>265の例だとLinuxはどうなる?
280デフォルトの名無しさん:2007/07/18(水) 12:06:48
Linux は FreeBSD と同じ。 (ていうか UNIX はみんな同じ)
281デフォルトの名無しさん:2007/07/18(水) 21:30:25
(シェルが同じなら)同じ
282259:2007/07/19(木) 00:54:19
大嘘書いたようで、すんません

>win32/win32.cのrb_w32_cmdvectorで上書きしていたのだな。
win版rubyは自分でワイルドカードの展開してたの知らんかった
GetCommandLine()で生のコマンドライン引数取ってたのね

で結論は(Mingw版ruby1.8.4なんだけど)
ruby自身はシングルクォーティングされた引数はワイルドカードの展開をしない
ダブルクォーティングだと空白を含めるだけでワイルドカードの展開はされる

ruby以外の何にも考えてない普通のMingwのアプリだと(VCも?)
ダブルクォーティングされた引数はワイルドカードの展開をしない
シングルクォートは単なる文字扱い
手元のActivePerl 5.8.4だとこの動作だった

cmd.exeのコマンドラインの「&|<>」は
ダブルクォーティングされていれば解釈されない
でも%path%とかの展開は止められない

ややこしい
283デフォルトの名無しさん:2007/07/19(木) 00:59:18
それと ruby 1.9.0 (2007-07-02 patchlevel 0) [i386-mingw32] だと
コマンドライン引数でもDir.globのようにUNIXのシェル風ワイルドカード展開するようになってた
284デフォルトの名無しさん:2007/07/19(木) 05:59:35
展開されたリストからワイルドカードを推論するwin32用ライブラリを作ればいいんじゃなかろうか。
285デフォルトの名無しさん:2007/07/19(木) 10:14:32
そもそもなんで展開しちゃまずいんだよ?
286デフォルトの名無しさん:2007/07/19(木) 10:15:34
ワイルドカードを適用するのがカレントディレクトリのファイルに対してとは限らないだろ
287デフォルトの名無しさん:2007/07/19(木) 10:20:48
>>285
自前でワイルドカード展開したいんじゃない?

-r *.txt

みたいに渡されたらサブディレクトリの *.txt も展開したいとか。
288デフォルトの名無しさん:2007/07/19(木) 10:35:35
>>282
この辺も関係あるのかな。

互換性に影響する変更点 (CRT)
http://msdn2.microsoft.com/ja-jp/library/ms235497(vs.80).aspx
> 従来は、二重引用符で囲むことによってワイルドカード文字の
> 展開を抑制できましたが、今後、この方法で抑制することはできません。
289デフォルトの名無しさん:2007/07/19(木) 10:39:01
UNIX系で

ls */*/*

は可能なのに

DOS系では

dir *.*\*.*\*.*

なんて出来ないよな
290デフォルトの名無しさん:2007/07/19(木) 15:09:30
そりゃcmd.exe(command.com)の仕様
291デフォルトの名無しさん:2007/07/20(金) 01:10:05
>>289
cygwin入れろよ
292デフォルトの名無しさん:2007/07/20(金) 01:52:42
>288
あーびっくりした、つかURLがmsdnな点で気付けという話もあるが
(W)Setargv.obj の挙動変更の話だったか
一瞬cmd.exeがそんな発狂したような仕様になるのかと思ってガクブルった
293デフォルトの名無しさん:2007/07/20(金) 02:09:50
>>292
cmd.exeの各コマンドは元々 "" でワイルドカード展開は抑制できないぞ?
294デフォルトの名無しさん:2007/07/20(金) 03:27:00
test::unitのtestrunnerについての質問です。
TKやGTK(2)などをつかったtestrunnerの場合、
テスト対象のコードや、テストコードを修正した場合、
やっぱり、テストコードを再起動しなきゃダメですよね?

そのまま立ち上げておいて、修正するたびに「RUN」ボタン
を押すだけだと便利だなーと思ったんですが。

くだらない質問でスミマセン
295デフォルトの名無しさん:2007/07/20(金) 12:46:57
>>294
そこまで面倒はみてくれないな。
296デフォルトの名無しさん:2007/07/20(金) 14:51:54
拡張ライブラリをunloadする方法はないしな。
むしろrunnerは別プロセスにして、フロントエンドは結果の表示だけに限定し
たほうがいいのかもしれん。
297デフォルトの名無しさん:2007/07/20(金) 14:53:20
>>287
-r*.txt とか GNU grepみたいに --include=*.txt でいいじゃん。
298デフォルトの名無しさん:2007/07/20(金) 15:38:28
Rubyの変な挙動を回避する為の苦肉の策としてはいいじゃん。
299デフォルトの名無しさん:2007/07/20(金) 18:18:06
>>287
ていうか、そこまで全部やってくれるのが **/*.txt なんだが。
300デフォルトの名無しさん:2007/07/20(金) 20:08:06
define_methodっていう便利なものがあったのを知った。
301デフォルトの名無しさん:2007/07/21(土) 01:45:27
簡易CUIビューアを作っています。
しかしいきなり詰まりました
http://briefcase.yahoo.co.jp/bc/sunsunlight_heart/
ここのkyoto-uビューアってとこです。
なんで、rを押した時にメニューのprintが2回発動するのでしょうか?

涙目です。
302デフォルトの名無しさん:2007/07/21(土) 01:53:08
exitしたらいいんじゃないの?
303デフォルトの名無しさん:2007/07/21(土) 01:53:53
そしたら終わってしまうではないですか・・・
304デフォルトの名無しさん:2007/07/21(土) 02:03:17
C言語なんかを勉強してる奴がよく引っかかるヤツだな。
getcとバッファの関係を理解してるか?

while c=$stdin.getc do
    p c
end

を実行して、色んな文字列を入力して何が起きるか調べてみろ。
305デフォルトの名無しさん:2007/07/21(土) 09:19:50
なる。

入力した文字の階数+1だけprintが反復しますね。
rをいれたら2回
aaaaを入れたら5回
なんでやろ・・

目標としては、更新ボタンを押すたびにお気に入りに登録したページの更新を確かめてくれる
それだけでかなり幸せになれる。

この問題はどう解決すべきですか?
306デフォルトの名無しさん:2007/07/21(土) 09:26:45
>>304はprintじゃなくてpを使ってみろって書いてあるだろ。
307デフォルトの名無しさん:2007/07/21(土) 09:29:47
使ってます。
printっていうのは最初に書いてある
while 1 do
の次に書いてあるやつです。これが反復するから困っています。
308デフォルトの名無しさん:2007/07/21(土) 10:18:48
while c = gets
  case c
  when /^r/
  when /^q/
    break
  end
end
309デフォルトの名無しさん:2007/07/21(土) 10:26:23
それおかしくないですか?STDINとか$stdinがない。
それにそれじゃ一番最初にメニューが出ない。
310デフォルトの名無しさん:2007/07/21(土) 10:31:13
>>309
> それおかしくないですか?STDINとか$stdinがない。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4#gets

> それにそれじゃ一番最初にメニューが出ない。
またダウンロードすんのがめんどくさかったから省略しただけ。
自分で補間しろ。
311デフォルトの名無しさん:2007/07/21(土) 12:32:32
getcは IO ポートから1文字読み込むメソッド。

標準入力ポートは、読み込みを要求されたとき
バッファに何も文字列がない場合のみキー入力を促す。

だから1度目の getc ではバッファに文字列がないので
標準入力ポートはユーザにキー入力を要求する。

そこで r[Enter] と入力すると、バッファには "r\n" が溜まる。

getc は標準入力ポートから1文字読み込み、?r が返る。

しかし2度目の getc では既にバッファに文字がある。残りの "\n" だ。
だからキー入力を要求することもなく、getc は ?\n を返す。
312デフォルトの名無しさん:2007/07/21(土) 18:49:11
ということは
getcした時に\nがダメなようにする必要がありますね。
.chompでおk?
313デフォルトの名無しさん:2007/07/21(土) 18:52:41
ダメだな・・・どうすりゃいいんだ・・・
314デフォルトの名無しさん:2007/07/21(土) 19:05:24
進歩のなさがいいかげんうぜえと思ったがよく考えるまでもなくここは初心者スレだった
参考書は何を読んでるのかが気になる
315デフォルトの名無しさん:2007/07/21(土) 19:14:36
オブジェクト指向スプリクト言語
Ruby
by Matz, アスキー出版局
でつ。

どうすればこの問題を解決出来るんだ
316デフォルトの名無しさん:2007/07/21(土) 19:19:17
その本は大事に本棚の奥にしまっとけ
プログラム作成に役に立つことは特に書いてない
317デフォルトの名無しさん:2007/07/21(土) 19:27:32
とりあえず p c してみるというのはやってみたのか?
318デフォルトの名無しさん:2007/07/21(土) 19:32:18
PC使ってるし
319デフォルトの名無しさん:2007/07/21(土) 19:37:48
getcはEOFを検知するまで適当なIOオブジェクトから1文字読み込んでいわゆるASCIIコードを返し続ける
どこでどう吹き込まれたのか知らないけど「IOポートから1文字だけ読み込んで返す」というメソッドではない
IOオブジェクトから5文字流れてきてたならASCIIコードを5個返す

c = $stdin.gets[0]

がおそらく希望にいちばん添う書き方だと思われ
これなら標準入力から行末まで読み込んだうちの1バイト目のASCIIコードがcに入る
320デフォルトの名無しさん:2007/07/21(土) 20:10:42
getsは引数とれるみたいだけどそうやって使うでつか・・・

>>319
神!!!!!!!!!!!!!!!!!!!!!!!!
ktkr

>>316
あとたのしいrubyは読破しています。
オブ(ryは学校の図書館から借りていました。
ずっとおれのターンにして借りつづける予定でつ、良い本だと思いまつが
321デフォルトの名無しさん:2007/07/21(土) 20:13:14
RubyよりCやった方が良さそうだ
322デフォルトの名無しさん:2007/07/21(土) 20:13:46
あれ?さっき出来たのに出来なくなった。
おかしい
323デフォルトの名無しさん:2007/07/21(土) 20:15:36
こんなのが京大生なのか?世も末だな
324デフォルトの名無しさん:2007/07/21(土) 20:15:56
あれ
$stdin.gets[0]にしたら出来た。つまり
[0]って配列のindexのことなのか!!!!
[1]だとダメっぽい
325デフォルトの名無しさん:2007/07/21(土) 20:17:52
>>323
いや開発経験ゼロでまともに知識をアウトプット出来ないんです。
だからkyoto-uを見る為の道具を作ろうと思って。
更新されたものをチェックしてくれるようになればすごく楽
将来的にはgtk2を使ってもっといいものを作りたいんだけどNE
326デフォルトの名無しさん:2007/07/21(土) 20:20:39
$stdin.getsが出てきたらマニュアルのIOのgetsのとこを読んでみるとかくらいはして欲しいもんだ
> getc
> IO ポートから 1 文字読み込んで、その文字に対応する Fixnum を返します。

ただ、文字列に[0]や[1]がつく場合は初心者にはちょっと調べるの難しい。これはマニュアルが不親切
> self[nth]
> nth 番目のバイトを整数(文字コード)で返します
327デフォルトの名無しさん:2007/07/21(土) 20:49:12
>>325
ちゃんとした知識が得たいならMLとか聞いたほうがよかんべよ
あと、まつもと本はさすがに古いし、あれはPerlとかUnix文化を一通り知ってる人向けに
書かれてるから、ふつうは神棚に飾っておくもの。ちゃんと図書館に返しておけよ。

金があるなら、本屋行って自分用に買ったほうがいいし、金ないならそのへんの大学とかのRuby講義を
さらってみてはどうかな。
ttp://www1.tf.chiba-u.jp/~shin/tutorial/index.rb

あと、もうひとつ言っておくけど、rubyはスレッドが変なのでGUIプログラミングに向かない。
GtkでいいものつくりたければPythonでやるのがポピュラー。
328デフォルトの名無しさん:2007/07/21(土) 20:55:47
RubyでGtkはサンプルが少なくて困るかもしれない。
リファレンスもちょっと。。
329デフォルトの名無しさん:2007/07/21(土) 21:56:33
メーリスは読んでいます。
実はwxrubyはある程度やってました。
しかしlinuxで使えるとか使えないとかで結局gtkをやることにしました。
え、rubyでGUIはダメなんですか?
pythonはあの文法が生理的に受け付けません。
一番しっくりくるのは、そして書いてて楽しいのはやっぱりC言語なんですけど、
手続き型なのとコンパイルがうざいのでオブジェクト指向したいし、rubyすることにしました。

今回はちょっと軽い問題にぶち当たったくらいで、基本的な知識は一通りあります。
ただ実際に開発して問題を抱えた経験がないので戸惑っただけです。
実際に開発するといい加減な知識はないも同然ですからね。
330デフォルトの名無しさん:2007/07/21(土) 22:06:57
Visuaruby
331デフォルトの名無しさん:2007/07/21(土) 22:19:30
linuxでは使えませんよね
332デフォルトの名無しさん:2007/07/21(土) 22:24:32
>>327
> あと、もうひとつ言っておくけど、rubyはスレッドが変なのでGUIプログラミングに向かない。
どういうとこがGUIプログラミングに向かないような変?
333デフォルトの名無しさん:2007/07/21(土) 23:01:35
>>332
ほれ。「Rubyのスレッドはゴミである、あるいはなぜRuby/Gtk2は使えないのか」
ttp://ciaranm.org/show_post/110
334デフォルトの名無しさん:2007/07/21(土) 23:31:41
今実装してるんだけど
レスのクラス
スレッドのクラス
の2つを作ってんだよね
で、質問なんですけど
スレッドのクラスにレスを持たせるのではなくて
レスのクラスのクラス変数にスレッドの情報を持たせるのがruby的には正しいですか?
rubyのクラス変数って何の為にあるのか分からない。
従業員クラスを作ってそいつらに会社の名前をクラス変数として持たせるとかいう話はあるけど
別に会社のクラスを作ってそこに従業員を入れればいいんじゃね、とか思います。
おれの常識ではそういうのがオブジェクト指向だと思ってるんだけど
だからクラス変数って何の為にあるのか分からない、メモリの節約?
GCあるのに?
335デフォルトの名無しさん:2007/07/21(土) 23:49:28
>>334
>レスのクラスのクラス変数にスレッドの情報を持たせるのがruby的には正しいですか?

スレが世界に1つしかないならともかく、いくつもスレが立つのに
これはありえんだろ。
336デフォルトの名無しさん:2007/07/21(土) 23:51:45
ですよね。
ちょっとThreadがuninitializeとかいわれてぶっころしたい。
def initialize(url)
end
ちゃんと定義されてるじゃん、どうしてだ
337デフォルトの名無しさん:2007/07/21(土) 23:56:30
何!!!!
もしかしてThreadってクラス名はつけちゃダメだったのか?
Threaにしたらとおった、なんたるツンデレ
338デフォルトの名無しさん:2007/07/21(土) 23:58:04
掲示板のスレッドクラスをThreadと定義してしまうのはよくあるミスだな

Threadクラスはすでに組み込みで存在する
339デフォルトの名無しさん:2007/07/21(土) 23:58:08
組み込みにThreadっていうクラスがある
Rubyでは定義済みクラスがあるときにclass そのクラス.... endはエラーではなく、
定義を追加したり再定義したりできる

というあたりで不幸がおこったのかな。
340デフォルトの名無しさん:2007/07/22(日) 00:03:04
もしかして上書きされちゃいましたかね、Threadっていうクラス・・・・
だとしたら最悪、入れ直すしかない。

とりあえずbcにうpしますた。
よかったら見てください。
341デフォルトの名無しさん:2007/07/22(日) 00:14:01
>340
プログラムが動いてる間、そのプログラムの世界の中だけで、ね > 上書き
自分でファイルコピーして上書きでもしなきゃ大丈夫
342デフォルトの名無しさん:2007/07/22(日) 01:00:05
そういえばRubyってどんなことするプログラムなの?
343デフォルトの名無しさん:2007/07/22(日) 01:17:54
Perlと似たようなことをPerlとは違う書き方で実現するプログラム言語です
Perlが何をする言語かというのはPerlスレでお聞きください
344デフォルトの名無しさん:2007/07/22(日) 01:34:43
拡張ライブラリ(具体的にはwxruby2-preview0.0.40)使ってて
Segmentation faultで落ちるんですが
どこで落ちてるのか調べようと思ったら、rubyと拡張ライブラリをそれぞれデバッグビルドして
デバッガで追っかける……というのが定石でしょうか。
ちなみにrubyの方は
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
です。
落ちるソースは会社で昼休みに書いたもんなんで今手元にないんですが、
メニューバーとステータスバーとウイジェットいくつか置いたFrameの派生クラスを表示させて
そのウインドウを閉じたら落ちましたorz
345デフォルトの名無しさん:2007/07/22(日) 01:50:24
>>333
Pythonもgiant lock使ってるから、そこで触れられている問題は解決しない。
pthreadだから全部OKなんて短絡すぎ。
346デフォルトの名無しさん:2007/07/22(日) 02:01:18
へぇ。じゃあ最終的にはperlと本質は変わらないんだ。
じゃあ後はどっちが使いやすいかってことだね。
347デフォルトの名無しさん:2007/07/22(日) 02:14:24
それは主観によるので意味がないです
348デフォルトの名無しさん:2007/07/22(日) 04:23:18
matz日記にコメントつけられないんだけど
なんで?セキュリティソフトとかが原因?
349デフォルトの名無しさん:2007/07/22(日) 05:33:13
>>329
え、Linuxでは動かないのか? 初めて聞いたんだけど

>>334
クラス変数の使い方は俺もマジで知りたい、あれ何に使えばいいんだ?
たいていはメソッド定義や定数で事足りると思うんだが

>>337
ちゃんとモジュールで括ったほうがいいよ
350デフォルトの名無しさん:2007/07/22(日) 09:20:08
クラス変数ってスコーピングのためにあるんじゃないのか。
クラス単位でのグローバル変数だべ。まあ、rubyにはもともとなかったのにあとから入れたからね。
ruby2だと挙動が変わるからあんま使わなくて正解だよ。
351デフォルトの名無しさん:2007/07/22(日) 09:24:57
>>350
ですよね。何の為にいれたのか分からない。
OPP的に考えて必要ないなぁ、ややこしくなるなぁと
Matzは自分の本でグローバル変数は使ってはいけません、わけわからんくなるから
って書いてるんだけど、まぁthere is more ways to do itだっけ?そういうことなのかな
352デフォルトの名無しさん:2007/07/22(日) 09:35:06
おれがプログラムはOPPぽくなってますか?
353デフォルトの名無しさん:2007/07/22(日) 10:09:33
OOP的っていうか、普通はクラス変数はSingletonに使うもんじゃないのか
354デフォルトの名無しさん:2007/07/22(日) 11:28:38
定数にしたいけど、あんまり外に見せたくないものを代用したりとか。
正直微妙。
355デフォルトの名無しさん:2007/07/22(日) 11:44:15
俺もSingletonとして使うことが多い
356デフォルトの名無しさん:2007/07/22(日) 12:02:46
クラス変数とクラスオブジェクトのインスタンス変数とはどう違うの?
357デフォルトの名無しさん:2007/07/22(日) 12:12:24
インスタンスがなくても使える
358デフォルトの名無しさん:2007/07/22(日) 12:16:29
うむ
359デフォルトの名無しさん:2007/07/22(日) 12:24:29
>>356
サブクラス等との間でも変数が共有される
360356:2007/07/22(日) 12:57:03
>>357-359
ありがとう。
良く見るとドキュメントのクラス変数のところに書いてあった orz
361デフォルトの名無しさん:2007/07/22(日) 17:40:42
Singletonって何?
362デフォルトの名無しさん:2007/07/22(日) 17:42:56
未婚の豚
363デフォルトの名無しさん:2007/07/22(日) 18:09:21
プログラミングでSingletonといえば、ふつうはデザインパターンでいう
「インスタンスを一つ(あるいは有限個)しか作ら(せ)ないクラス」という意味。

Rubyでもこの意味で使うが、加えて「特異メソッド」の「特異」も英語
ではSingletonなので文脈で判断する必要がある。
364デフォルトの名無しさん:2007/07/22(日) 18:23:23
なる。
必要ありませんな。
365デフォルトの名無しさん:2007/07/22(日) 18:30:22
つうか、require 'singleton'するのが定石じゃないの。
こういうところがrubyかっこいいぜ
366デフォルトの名無しさん:2007/07/22(日) 18:52:22
初心者スレっぽい
367デフォルトの名無しさん:2007/07/22(日) 19:54:31
>>362
長年の謎が解消しました
368デフォルトの名無しさん:2007/07/22(日) 23:00:49
なんか今週の日経ソフトウェアがRuby特集やってますね。
もしかしてRubyってキテルのかな?
http://www.jienq.com/vote/htm/1185110565.html
369デフォルトの名無しさん:2007/07/22(日) 23:13:27
いや別に
日経ソフトウェアくらいの立ち位置の雑誌がRubyの特集をするのは毎年のこと
今年はRubyの年になる、というようなのはRuby1.4くらいの頃からずっと聞いてる

まあ、結果として認知されるくらいには普及はしたけどな
「PerlとPHPと、あとなんだっけ、Ruby?」くらいにはなったとは思う
370デフォルトの名無しさん:2007/07/22(日) 23:56:23
>>369
でもその認知度って日本だけってことはない?
371デフォルトの名無しさん:2007/07/23(月) 00:42:49
>>370
オライリーが rails conf 開くくらいだから十分認知されていると思うけど。
372デフォルトの名無しさん:2007/07/23(月) 01:03:17
「rails、rails、rails…
 どいつもこいつも rails!
 なぜだ!なぜこの俺を認めねえ!?」

とジャギのように駄々をこねるrubyタンが脳裏をよぎった…
373デフォルトの名無しさん:2007/07/23(月) 11:27:56
ある配列を元にeachで複数のインスタンスを生成したいのですが
どのようにすればキレイにかけるでしょうか?
やりたいことをそのまま書くとこんな感じです。
宜しくお願いします。

array = "a","b","c"

array.each{|a|
  t = Test.new(a)
}


374デフォルトの名無しさん:2007/07/23(月) 11:34:01
instances=array.map{|a| Test.new(a)}
375デフォルトの名無しさん:2007/07/23(月) 21:14:02
ここでmap派とcollect派の論争が。
376デフォルトの名無しさん:2007/07/23(月) 22:17:46
勝った方がPythonと決勝戦な
377デフォルトの名無しさん:2007/07/23(月) 22:23:43
tに上書きしてない?
378デフォルトの名無しさん:2007/07/23(月) 22:30:49
返事に迷う書き込みだな
そうだ、としか言えんが…
379デフォルトの名無しさん:2007/07/23(月) 23:29:05
すみませんが、質問です。
URI::HTTPクラスで、ドメイン名に"_"(アンダースコア)を含めると
URI::InvalidComponentError が発生します。
どうにかして、これを抑制できないでしょうか?登録したいURLに、ドメイン名
にアンダースコアを含むものがあるのです。
380デフォルトの名無しさん:2007/07/24(火) 00:04:25
そんなドメインを許した奴を殴れ
ドメインには _ は存在できない
381デフォルトの名無しさん:2007/07/24(火) 00:13:05
[RFC1035]の規定を要約すると、ドメイン名を構成できるのは
「aからz、0〜9、- からなる語(先頭はaからzのみ、末尾は-不可)」
をドット(.)で繋いだもの。
長さ制限は、各語63文字以下、全体で合計255文字以下。

382デフォルトの名無しさん:2007/07/24(火) 00:24:13
極端な話をすれば、URLにはマルチバイト文字が入る場合もありうるからな
日本語ドメインとかPATH_INFOとか

どうしても抑制したいならURI::HTTPを継承して
用途に合った新しいクラスを作るのが一番いいと思う
383379:2007/07/24(火) 01:23:22
皆さん、ありがとうございます。
"_"がドメイン名に使えないことは聞きかじっておりましたが、そういうサイ
トが実際存在してしまっているので、こちらからはどうしようもないのです。
やはり、新クラスしかありませんか。困ったなあ。
384デフォルトの名無しさん:2007/07/24(火) 07:10:24
>>379-383
Windows の ActiveDirectory なんかでうっかりそういうドメインを造ってしまう馬鹿が最近おおい

385デフォルトの名無しさん:2007/07/24(火) 07:42:52
馬鹿ってゆーな
ttp://www.microsoft.com/japan/technet/prodtechnol/windows2000serv/techinfo/howitworks/communications/nameadrmgmt/bind.mspx
> 先に示したように、Active Directory のレコードには、アンダースコアが含まれています。
> マイクロソフトは、Active Directory のデータと既存の DNS データが競合する可能性を低減させるため、
> ドメイン名のレコード部分にアンダースコアを使用することを選択しました。
きちんと考えられてる、競合とか
386デフォルトの名無しさん:2007/07/24(火) 08:28:21
画期的なアイディアを思いついたとか言って自慢するタイプなのかゲイシは
387デフォルトの名無しさん:2007/07/24(火) 08:55:25
なんだ結局URI::HTTPのバグか
388デフォルトの名無しさん:2007/07/24(火) 09:10:20
バグを他人のせいにするとはrubyって最低だすな
389デフォルトの名無しさん:2007/07/24(火) 09:38:25
>なんだ結局URI::HTTPのバグか
>なんだ結局URI::HTTPのバグか
>なんだ結局URI::HTTPのバグか
390デフォルトの名無しさん:2007/07/24(火) 09:43:14
この問題(これをバグと呼ぶ奴は頭がおかしい)については前から議論があるんだけど、過去スレあたりで回避策が出ていたはず。
391デフォルトの名無しさん:2007/07/24(火) 11:16:21
>>385
アイディアは褒めてやろう
だからインターネットと混ぜるな(w
392デフォルトの名無しさん:2007/07/24(火) 17:15:56
クックブックとレシピブックってどっちがおすすめ?
393デフォルトの名無しさん:2007/07/24(火) 17:37:02
恐ろしいことに日本では優先度はどっちもどっち

まずはたのしいRuby第2版を買って
ttp://www.amazon.co.jp/dp/4797336617/
興味持ったらレシピブック第2版を買う
ttp://www.amazon.co.jp/dp/4797340045/
レシピブックのサンプルコードなんて素で書けますが何か(我流で解けます、では駄目)という人や
レシピブックの内容をだいたい把握できたような人はオライリーのクックブックを買う
ttp://www.amazon.co.jp/dp/4873113245/
オンラインマニュアルを使い倒してるような人はレシピブック飛ばしてオライリー買ってもいいかも
クックブックはオライリーであることが良くも悪くも質と敷居上げてて初学者崩れにはサンプルの使いでが薄い

この3冊あれば書籍面では不自由しないだろ
RoRを活用したいってんならRailsについての本が不足だが

オライリーのクックブックは5月に第2刷が出てるが誤植とかは直ってるのかな
394デフォルトの名無しさん:2007/07/24(火) 21:07:55
One-Click Ruby InstallerでRubyをインストールしたのですが、

ruby -v すると
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] 、
gem -v すると
0.9.2

となっています。
最新のpatchlevelは36のようですが、
これらにパッチを当てるためにはどうしたらいいのでしょうか?
395デフォルトの名無しさん:2007/07/24(火) 23:04:50
>>394
そういう細かいのは自前でコンパイルしてインストールするしかないんじゃね
最新のパッチ当てたRubyでなければならない要件があるならソースからコンパイルだ


2年くらい前に作って惰性で使ってた特定サイト用自作ダウンローダーのソースを眺めたら
URLクラスというものがゼロから定義してあった
ダウンローダーのクラス内で特定サイトのHTMLをダウンロードするメソッドでこう使う

def get_htmlfile
Net::HTTP.version_1_2
url=URL.split(@@url)

Net::HTTP.start(url['server'],url['port']){|http|
http.open_timeout=10
http.read_timeout=10
response=http.get(url['path'])
Util.abort(response.code,"http://#{url['server']}#{url['path']}") unless response.code == "200"
return {'status' => response.code , 'html' =>response.body}
}
end

…なんだこれ
いや、やりたいことはわかるが
396379:2007/07/25(水) 03:43:51
すみません、遅くなりました。

>>390
> この問題(これをバグと呼ぶ奴は頭がおかしい)については前から議論がある
> んだけど、過去スレあたりで回避策が出ていたはず。

どの過去ログか、心当たりを教えていただけないでしょうか?

自分は●持ちなので、
・Ruby初心者スレ
・Ruby本スレ
・Railsスレ

これら全ての過去ログを "uri::" で検索してみましたが、該当個所は見つか
りませんでした。
397デフォルトの名無しさん:2007/07/25(水) 12:06:33
>>369
明確な場所は覚えてないんだよ、ごめん。
初心者スレか本スレの過去ログを、"module URI" か "ABS_URI" あたりで検索してみて。
398397:2007/07/25(水) 12:07:14
あ、ポインタ間違えた。
>>396 でした。ごめん。
399デフォルトの名無しさん:2007/07/25(水) 12:13:46
ポインタかw
アドレスを指し示す…なるほど
400デフォルトの名無しさん:2007/07/25(水) 13:30:26
String.toutf8 という関数がありますが、
それをKconv以外で実現できるライブラリーはありますでしょうか?
401デフォルトの名無しさん:2007/07/25(水) 13:36:18
Ruby には関数なんて無(略

require 'kconv' したくないということ?
オーバーヘッドが心配? それとも String が"汚染"されるのが用途に合わない?
402400:2007/07/25(水) 13:42:28
私、昆布が大嫌いなので他にあればと思い質問しました。

ちなみに関数ではなく、メソッドとよぶのでしょうか。。?
403デフォルトの名無しさん:2007/07/25(水) 13:58:09
iconvもuconvも嫌いなんだろ。無理。
404デフォルトの名無しさん:2007/07/25(水) 14:16:35
>>402
>ちなみに関数ではなく、メソッドとよぶのでしょうか。。?
関数とメソッドって全然別物だろ
405デフォルトの名無しさん:2007/07/25(水) 14:24:14
システム変数(組み込み変数?)で
例外が発生した行数が格納されるのって何だっけ?
406デフォルトの名無しさん:2007/07/25(水) 14:33:27
行数だけというのはない。
$@が、callerが返す["ファイル名:行番号", ...]という配列になってる。
407デフォルトの名無しさん:2007/07/25(水) 14:39:33
>>406
サンクス!
408デフォルトの名無しさん:2007/07/25(水) 19:43:58
質問です。Dir.globで"本"という字を含むディレクトリだけが
出力することができません。なにか制限があるのでしょうか?

require 'fileutils'

d = "木"
Dir.mkdir(d)
FileUtils.touch("#{d}/test.txt")

Dir.glob("#{d}/*"){|f| puts f} # 出力される

d2 = "本"
FileUtils.mv(d,d2)

Dir.glob("#{d2}/*"){|f| puts f} # 出力されない
409デフォルトの名無しさん:2007/07/25(水) 20:30:10
またか

p "本"
"\226{"

というわけでいわゆる駄目文字のバグだ

Ruby1.8.6で直ってると思われるが試してない
410デフォルトの名無しさん:2007/07/25(水) 22:36:27
定期的にサーバのHTMLファイルを取得するスクリプトを作っていまが、下のエラーが生じてしまいます。
このタイムアウト?が生じても動作が続けられるようにするにはどうすればよいでしょうか?

/usr/lib/ruby/1.8/timeout.rb:42:in `rbuf_fill': execution expired
(Timeout::Error)
from /usr/lib/ruby/1.8/net/protocol.rb:196:in `timeout'
from /usr/lib/ruby/1.8/timeout.rb:55:in `timeout'
from /usr/lib/ruby/1.8/net/protocol.rb:196:in `rbuf_fill'
from /usr/lib/ruby/1.8/net/protocol.rb:160:in `readuntil'
from /usr/lib/ruby/1.8/net/protocol.rb:171:in `readline'
from /usr/lib/ruby/1.8/net/http.rb:1554:in `read_status_line'
from /usr/lib/ruby/1.8/net/http.rb:1538:in `read_new'
from /usr/lib/ruby/1.8/net/http.rb:833:in `request'
... 13 levels...
411デフォルトの名無しさん:2007/07/25(水) 22:38:43
begin
タイムアウトするかもしれない処理
rescue Timeout::Error
retry
end
でいーんじゃないの?
412デフォルトの名無しさん:2007/07/25(水) 23:02:45
一般論として、相手の鯖からタイムアウト食らったらおとなしく諦めろ
再接続を粘っても相手の鯖が余計苦しんでタイムアウトの確率が上がるだけだ
413デフォルトの名無しさん:2007/07/25(水) 23:31:32
>>411
ありがとうございました.
414デフォルトの名無しさん:2007/07/26(木) 00:16:23
>>411
rescue 即 retry は一番危険だって習わなかったのか?
415デフォルトの名無しさん:2007/07/26(木) 00:17:29
簡略化したサンプルにケチつけんなダァホ
416デフォルトの名無しさん:2007/07/26(木) 00:25:27
>>415
rescue Timeout::Error

retry
の間にどのような処理を書けば妥当なのか考えたらそんな言葉は出てこない

これはどう控えめに考えても「相手のサーバーが受け入れるまで無限ループを作る」意図しかないぞ
417379:2007/07/26(木) 02:01:04
418379:2007/07/26(木) 02:05:18
追記です。肝心の対応コードを引用してみます。

----- 以下、「Rubyについて Part 23」より引用 -----

From: [646] 641 <sage>
Date: 2006/09/19(火) 18:18:39

>>644
http://www.forkosh.com/mimetex.html
とりあえず↑のページを表示して、Bad URLにならないよう直したのが↓のコード

require 'uri'
module URI
DOMLABEL = "(?:[#{PATTERN::ALNUM}](?:[-_#{PATTERN::ALNUM}]*[#{PATTERN::ALNUM}])?)"
PCHAR = "(?:[#{PATTERN::UNRESERVED}:@&=+$,\\[\\]\\{\\}`]|#{PATTERN::ESCAPED})"
URIC = "(?:[#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}\\^\\{\\}\\\\\\]|#{PATTERN::ESCAPED})"
X_ABS_URI = PATTERN::X_ABS_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
X_REL_URI = PATTERN::X_REL_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
ABS_URI = Regexp.new('^' + X_ABS_URI + '$', Regexp::EXTENDED, 'N')
REL_URI = Regexp.new('^' + X_REL_URI + '$', Regexp::EXTENDED, 'N')
end

DOMLABEL はホスト名の部分。オリジナルに _ を追加
PCHAR はパス名の部分。MSNの画像で Bad URL になるんで []{}` を追加
URIC はクエリーの部分。mimetexで Bad URL になるんで ^{}\ を追加

ほかにエラーになる文字があったら自分で追加してくれ
それと3連続 gsub がカッコ悪いんで、スマートな書き方あったら誰かよろしく
419デフォルトの名無しさん:2007/07/26(木) 10:08:34
ruby 1.8.6 では、 "a"=~/a(?=b)?/' が、 nil なのに対し、
perl 5.8.8 では 1 になります。

rubyで上記正規表現が"a"にマッチしないのは、
どうしてでしょうか?
420デフォルトの名無しさん:2007/07/26(木) 10:31:33
同じであるはずの/a(?:(?=b))?/ =~ "a" や
/a(?=b?)/ =~ "a" がマッチすることを考えるとバグ
だとは思うが、(?=...)に?をつけるってことは意味的
には何もつけないのと同じだからなぁ。

そのうち直すと思うけど、ちょっと優先度は低めなの
で、忘れないようにruby-devかruby-listに出しとい
てくれるとありがたい。
421デフォルトの名無しさん:2007/07/26(木) 10:34:21
>>416
タイムアウト時間を長く設定するのが現実的な妥協案かね
422デフォルトの名無しさん:2007/07/26(木) 22:44:43
>>420
というか、
=~ 演算子?で正規表現の方を左辺に持ってくるのが結構サンプルとして多いですが、
どちらかというとコレがRuby的に推奨の書き方なんでしょうか。
基本的にPerlerですが、正規表現を右辺値に持ってくる方が馴染んでいたもんで、
結構当初から違和感があります。
423デフォルトの名無しさん:2007/07/26(木) 22:48:36
いやそうじゃなくて
424デフォルトの名無しさん:2007/07/26(木) 22:52:49
パターンマッチングを行うのは正規表現オブジェクトの仕事という観点から
Regexp#=~を使うのがRuby的。

Strint#=~は、逆にも書けるように便宜的に用意されている。
内部的にパターンマッチングを行う実装はRegexpのほうにあり、
Stringの=~は左右辺を入れ替えてそれを呼び出している。
425デフォルトの名無しさん:2007/07/26(木) 22:56:49
>>424
なるほど。ありがとうです。
ただ、JavaScript なんかでもStringクラスが matchメソッドを持ってたりするのですが、
これも同様の処理をしてるのかな。(Regexオブジェクトとごにょごにょ)
人間の直感に忠実なRubyとしては、やはりこの辺りは結構足を引っ張りそうな
気もします。
426デフォルトの名無しさん:2007/07/26(木) 22:59:07
昔は String#=~ が無かった気がする。
427デフォルトの名無しさん:2007/07/26(木) 23:11:31
>結構足を引っ張りそうな

kwsk
428デフォルトの名無しさん:2007/07/26(木) 23:12:55
うーんやっぱり、書くときの意識として
「この文字列」が「この正規表現」にマッチするか?
てのがコードの流れとして多いような気もするが、これを
「この正規表現」に「この文字列」がマッチするか?
ていう風に最初から考えればそんなに違和感は無いのかも・・・。

Perl脳か。がんばって改めてみよう。でもgsubとかは逆の思考が必要なんです
よね。やっぱり。主体は「文字列」。(正規表現はフォーマットとしての「表現」。)
429デフォルトの名無しさん:2007/07/26(木) 23:39:21
rubyとperlの使用人数が逆転したねえ
perlが下がってrubyが追い抜いた
430デフォルトの名無しさん:2007/07/26(木) 23:42:09
>>429
そういうのはどうでもいい、というか言い出すとあまり面白くないレスが付きそう。
perlならまあまだ大丈夫だが(枯れてるから)、PHPだともう・・・。やめようよ、そういうの。
431デフォルトの名無しさん:2007/07/26(木) 23:43:06
それは絶対にない

Perlの新規利用者増加はPHPもあって鈍ったかもしれないがRubyが抜くことはない
432デフォルトの名無しさん:2007/07/26(木) 23:45:07
ほら来たじゃない・・・
433デフォルトの名無しさん:2007/07/26(木) 23:45:59
http://www.google.com/trends?q=perl%2Cruby
だって統計データ-で出てるんだもん
434デフォルトの名無しさん:2007/07/26(木) 23:51:57
>>433
お前はこの統計のどこを見て「使用人数が逆転した」と思ったんだ
435デフォルトの名無しさん:2007/07/26(木) 23:54:10
>>434
お前はそれがわからないから
上のほうにいけないんだ
436デフォルトの名無しさん:2007/07/26(木) 23:55:36
夏真っ盛りだなw
437デフォルトの名無しさん:2007/07/27(金) 00:41:39
>>435を見て、腹を抱えて笑った俺は
きっと夏の暑さに頭をやられているのだろう
438デフォルトの名無しさん:2007/07/27(金) 01:32:41
PerlのJapanがやたら多いな
439デフォルトの名無しさん:2007/07/27(金) 01:38:43
>>438
一番perl使ってるのは日本人てこと?
440デフォルトの名無しさん:2007/07/27(金) 01:42:03
かもしれない
ひとのつかっているものをつかいたがる悪い癖だ
441デフォルトの名無しさん:2007/07/27(金) 05:49:19
>>425
RubyにもString#matchはあるよ。
442デフォルトの名無しさん:2007/07/27(金) 07:15:57
rubyでPINGを打つことはできないのでしょうか?
Cで書くしかないのかな?
443デフォルトの名無しさん:2007/07/27(金) 07:34:08
system 'ping example.com'
444デフォルトの名無しさん:2007/07/27(金) 08:13:16
PerlはKENTで持ってるという感じだな
445デフォルトの名無しさん:2007/07/27(金) 08:40:55
>>442
require 'ping'
p Ping.pingecho('www.2ch.net', timeout=3, service='echo') #=> true
p Ping.pingecho('example.com', timeout=3, service='echo') #=> false
446デフォルトの名無しさん:2007/07/27(金) 09:44:11
つーか、Regexp#=~なんか使ったことないな
/ごにょごにょパターンが長くなった時とか/ =~ str
strが先にあった方が可読性高い気がしてしまう
447デフォルトの名無しさん:2007/07/27(金) 10:30:04
先にstringがあって、それにあわせてあとからregexp作るからなあ
448デフォルトの名無しさん:2007/07/27(金) 10:46:42
まあ、若干意図的に無理して記述してることは否定しない > Regexp#=~
正規表現側が処理を知ってるべきだという思想を振りかけられてる一例だな

ぶっちゃけこのへんは両辺見て読み下すからどう書かれてても気にはしないけど
「清書」するときに正規表現を先に書き換える程度で、作ってる最中は入り混じってるからあまり気にするな
449デフォルトの名無しさん:2007/07/27(金) 12:17:53
俺は自作オブジェクトも双方向に記述できるように書くよ。
個人なら Array#format_to やら Object#in? まで作ってしまう。
なんつーか日本語脳かも。理想は目的語→用言の順になる。
450デフォルトの名無しさん:2007/07/27(金) 12:33:14
普通の代入も逆方向ができたらいいなーと感じたことがある
メソッドをあーしてこーして、出てきた結果を変数に入れる、みたいな思考順序になることが多い
もちろん普通に、変数の方が先に頭に思い浮かぶことも多々あるけど
451デフォルトの名無しさん:2007/07/27(金) 15:27:20
頭では「 /Regex/ =~ str なのか!一貫性があるなあ。OOPマンセー!」と思っていても

身体は正直。 str =~ /regex/ と書いてしまう。くやしい・・・・ビクンビクン
452デフォルトの名無しさん:2007/07/27(金) 16:15:28
>>451 お、俺がいる(´;ω;`)
453デフォルトの名無しさん:2007/07/27(金) 18:59:26
字面の一貫性を過度に求める奴はそもそもRubyなんて使わんだろw
454デフォルトの名無しさん:2007/07/27(金) 19:50:11
Rubyの普及促進を図る「Rubyアソシエーション」発足,まつもとゆきひろ氏が理事長に:ITpro
ttp://itpro.nikkeibp.co.jp/article/NEWS/20070727/278452/
まつもとゆきひろの顔写真あり。
もっとスマートな人だと思ってたらただのおっさん一歩手前の人だった。

Rubyグッズとしてはクラスやメソッドを書いた下敷きかマウスパッドを希望
というか前オライリーで出してた薄っぺらいRubyマニュアルの新しいやつが欲しい
455デフォルトの名無しさん:2007/07/27(金) 20:21:10
おっさん言うなよ。写真なら昔からいろんなところで公開してるじゃないか。
456デフォルトの名無しさん:2007/07/27(金) 20:42:36
riで英語のマニュアルがでてきますが、これのファイルはどこに格納されているのでしょう?
457デフォルトの名無しさん:2007/07/27(金) 21:59:18
うちはMacだけど、
OSX標準のやつが/usr/share/ri
MacPortsのが/opt/local/share/ri

LinuxのFHSだと、アーキテクチャ非依存・共有可能・読み出し専用だから
/usr/share/riになるのかな。他はしらん。
458デフォルトの名無しさん:2007/07/27(金) 22:43:20
>>457
thank you
459デフォルトの名無しさん:2007/07/27(金) 22:58:11
>>454
急に老け込んだのかと思ってチェックしちゃったよ。今まで通りじゃん。
ていうか実年齢がおっさんなんだし、「おっさん一歩手前」はむしろ「意外と若いですね」という意味だなw
460デフォルトの名無しさん:2007/07/27(金) 23:14:20
一時期生やしてたヒゲは剃っちゃったのね
461デフォルトの名無しさん:2007/07/27(金) 23:33:43
外人からは、髭がない日本人のオサーンは青年に見えるらしいからな。
462デフォルトの名無しさん:2007/07/28(土) 01:43:02
>>460
「速読してください!」とか「ブログ見てますが無理にネット言葉使うのは痛々しいです」とか言われるのが嫌なんじゃね?
463デフォルトの名無しさん:2007/07/28(土) 05:31:49
464デフォルトの名無しさん:2007/07/28(土) 09:53:50
>>454
何かやらしい表情してるな
カメラマンはもう少しましな写真を撮れ
465デフォルトの名無しさん:2007/07/28(土) 10:53:04
>>462
それPerlのひとでは…
つかあれはいわゆるネット人格だからアレでいーんだよグリーンダヨ
466デフォルトの名無しさん:2007/07/28(土) 11:59:16
お二人とも、ブロガーというよりは日本発信のLL伝道者としてがんばって欲しい。
467デフォルトの名無しさん:2007/07/28(土) 12:49:45
楽しいrubyで勉強してます。
P128のクラスメソッド表記法について質問なのですが、

クラス.メソッド名
クラス::メソッド名

の二通りの記述の仕方があるそうなのですが、意識して使い分けるとすれば
どのように使い分けられるのでしょうか?

例えば、インスタンスメソッドの場合は「.」、クラスメソッドの場合は「::」を
利用する等でしょうか?

ちなみに記述は無かったのですが、インスタンスメソッドも「::」が利用できました。
468デフォルトの名無しさん:2007/07/28(土) 13:00:25
えっと(r
469デフォルトの名無しさん:2007/07/28(土) 13:57:41
>>467
> どのように使い分けられるのでしょうか?
どっちも等価なので好きなように。

> 例えば、インスタンスメソッドの場合は「.」、クラスメソッドの場合は「::」を
> 利用する等でしょうか?
意味不明。「クラスメソッド表記法について質問」なのになんでインスタンス
メソッドに話が飛ぶ?

> ちなみに記述は無かったのですが、インスタンスメソッドも「::」が利用できました。
そんなわきゃない。勘違いしてるのは100%明らか。
470デフォルトの名無しさん:2007/07/28(土) 14:34:58
>>469
>どっちも等価なので好きなように。
その人によるという部分を聞いてみたいのです。
ちなみにあなたはどちらを使っていますか?

>意味不明。「クラスメソッド表記法について質問」なのになんでインスタン>
>メソッドに話が飛ぶ?
インスタンスメソッドとクラスメソッドを比較するためです。

>そんなわきゃない。勘違いしてるのは100%明らか。
[localhost]$ cat method.rb
#!/usr/bin/ruby

p 1000.integer?
p 1000::integer?

[localhost]$ ./method.rb
true
true

できました。
471デフォルトの名無しさん:2007/07/28(土) 14:38:43
newオブジェクトが定義されているクラスはObjectクラスであってますか?
472デフォルトの名無しさん:2007/07/28(土) 14:46:25
newメソッドの間違いです…
473デフォルトの名無しさん:2007/07/28(土) 15:38:22
>>470
> ちなみにあなたはどちらを使っていますか?
MyClass.klassmethod

> インスタンスメソッドとクラスメソッドを比較するためです。
表記法としては、インスタンスメソッドは
MyClass#instancemethod

> >そんなわきゃない。勘違いしてるのは100%明らか。
> p 1000::integer?
すまん。こっちが勘違いしてた。
474デフォルトの名無しさん:2007/07/28(土) 15:39:29
>>472
Class#new
475デフォルトの名無しさん:2007/07/28(土) 15:43:20
>>473
いえ、参考になりました。
返答ありがとうございました。
476デフォルトの名無しさん:2007/07/28(土) 15:45:57
>>474
どもです。調べてみます。
477デフォルトの名無しさん:2007/07/28(土) 16:00:54
>>467
俺の場合、メソッドには全て「.」を使ってる
「::」を使うのはモジュール・クラス内の定数を参照するときだけだな
他のコードを見るに、たぶん一般的な書き方なんじゃないかと思う

クラスメソッドに「::」を使うと、統一感がないように感じるんだよなー
外人さんのコードではよく見かけるけど
478デフォルトの名無しさん:2007/07/28(土) 16:25:56
C++あがりの俺は、初めのうちはクラスメソッドは「::」、インスタンスメソッドは「.」を使っていた。
だけど今ではオブジェクトに対するメソッド呼び出しという意味で「.」のみだな。これは
どこかの文面を見て納得した考えでもある。結局、使う人の哲学になってくるだろうけど。

それと、実際のRubyでの挙動は次のように変わる

Foo.Bar # Barメソッドの呼び出し
Foo::Bar # Bar定数の参照
Foo::Bar() # Barメソッドの呼び出し
Foo.bar # barメソッドの呼び出し
Foo::bar # barメソッドの呼び出し
479デフォルトの名無しさん:2007/07/28(土) 17:12:35
::はメソッド名が大文字だったら定数と解釈されるから.が無難。
480デフォルトの名無しさん:2007/07/28(土) 18:23:05
私もクラスメソッドの呼び出しは.を使う。

A::BはAの名前空間にあるB(スコープ)
A.BはオブジェクトAにBというメソッドを呼ぶ(メッセージを送る)

で一貫している。


481デフォルトの名無しさん:2007/07/28(土) 18:41:59
> 他の言語では空気のように意識せずにできることが,
> Ruby では,資料の隅々まで見渡し,先人のスクリプトを調査し,
> 試行を繰り返してようやく習得できる高等技術であるかのようです…。

ttp://www.okisoft.co.jp/esc/llsp/v4.html
482名無しさん@そうだ選挙に行こう:2007/07/29(日) 00:42:34
>>481
どの言語も人によって合う合わないはあると思う。
483名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:42:14
というか、
・プログラマを自認するなら、全部読むかどうかはともかく、ライブラリのソースをのぞいて見るくらいするだろ常考(ry
ってのと
・だからドキュメントの整備をしなきゃダメとあれほど(ry
という話じゃないかこれは。
484名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:44:27
Ruby初心者スレッド Part 13
485名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:01:10
> SICP 第二版 (1996) §3.5.4 で
> 「変更と遅延評価…を同時に扱う方法を工夫するのは,
> 研究の盛んな領域である」 と記述してから 10 年たって得られた成果が,
> 改訂版 Python と C# にある新世代の yield だと言えるかもしれません。
> Ruby の輩 (ともがら) にとっては,> 今の Ruby の (CLU から数えて
> 30 年来の) yield が必ずしもイテレータを作る
> たった一つの冴えたやりかたではないことを心に留めておくことが大切です。

ttp://www.okisoft.co.jp/esc/llsp/v42.html
486名無しさん@そうだ選挙に行こう:2007/07/29(日) 04:51:26
>>481
それを言うならPerlの方がひどいだろ
487名無しさん@そうだ選挙に行こう:2007/07/29(日) 13:56:31
というより、プログラミングって多かれ少なかれそういうもんだろ。
488名無しさん@そうだ選挙に行こう:2007/07/29(日) 18:21:00
誰も「たった一つの」なんて思ってない。
かなりの場面でそれなりにうまくいくというだけ。
489名無しさん@そうだ選挙に行こう:2007/07/29(日) 18:47:08
490デフォルトの名無しさん:2007/07/30(月) 19:34:39
OOPではメインクラスを作ってloopで回すのが正解ですか?
GUIのやりかたってそうですよね。
CUIのやりかたもそうなのかなって、GUIに移植したときにわかりやすいし。
OOPとっても便利、だけどむずい。今ソフト設計してる。もちろん我流です。
491デフォルトの名無しさん:2007/07/30(月) 20:15:53
たとえば App というアプリケーションがあったとして

app = App.new
loop{
app.run
}

とするのか

class App
def run
loop{
method1
method2
...
}
end
end

App.new.run

とするのかどちらが本質的に好ましいかというのは設計と趣味の領域と思われる
492デフォルトの名無しさん:2007/07/30(月) 20:26:28
オブジェクト指向のプログラミング言語を学んでると「トップレベル記述恐怖症」的なものに罹ることってあるよな
「違う!この操作自体も全部クラスにできる!トップレベルにはnewだけ!よし美しい!」みたいな
493デフォルトの名無しさん:2007/07/30(月) 20:34:12
グローバル関数やグローバル変数を見ただけで拒否反応を起こす、とかな。
クラスのstaticな変数も同じと言えば同じなのにな。
494デフォルトの名無しさん:2007/07/30(月) 20:34:35
>>490
普通のCUIなら、起動して実行して終わるってのが普通だから
loopで回す必要はないんじゃないか?

メインクラスの定義は必ずしも必要ではないけど
やっておくとテストや再利用が楽になる(融通が利く)のでオススメ
グローバルな変数や定数使わなくてすむしな
495デフォルトの名無しさん:2007/07/30(月) 20:44:04
例えば
A>B
だったとします。>は包含の意味です。AがBのインスタンスを多数保有するとします。
この時、Bのインスタンス変数にAからアクセスするのはあまり望ましくありませんか?
BのことはBの中で処理した方がいいでしょうか?
つまり、Aからいじるのではなく、Bにいじるメソッドを作っておいてAからはあくまでもBのインスタンスがメソッドを使用するという形でしかBのインスタンス変数の内容を変えられないようにするということです。
保守性の問題かと思われますが、なるべく正しいOOPを書きたいです。

OOPとはなんぞやと考えたのですが
それはきっと問題を分割して簡単化する事ではないかと思ったのです。
実世界の射影だとも受け取れますが。
496デフォルトの名無しさん:2007/07/30(月) 20:51:33
>>495
処理の種類と規模と設計と言語次第じゃね?
例えばFlashのActionScript(3未満)でオブジェクトの_x,_yなどにgetter, setterを
用意するのはあまりにもあまりだとは思うし、それで保守性が上がるとも思えん。
497デフォルトの名無しさん:2007/07/30(月) 21:45:44
>>495
>>496の言うとおり、あんまり教条的になることもないんじゃないのかな。
AとBを保守する人間が別であるのならきっちり分けておいた方がいい(かもしれない)し、
そうでないならいじっちゃってもかまわないんじゃね? と思うよ。

別の言い方をするならどこまでをひとかたまりのカプセルと見なすか、ってことじゃないかなあ。
498デフォルトの名無しさん:2007/07/30(月) 21:53:08
>>495
マルチスレッドを考えたときは、インスタンス変数を
きっちりガードできる方が分かりやすかったりする。

ケースバイケースなのはそうなんだが、操作をデータの周りに集めるという
Bにメソッドを作るというのがより原理的だとは思う。
499デフォルトの名無しさん:2007/07/30(月) 21:57:44
センスのない原理主義者の書いたソースはセンスのない無原理なソースより
まだ何とかなる。
ただ、出来ればセンスを磨く方向を目指して欲しいとは思う。
偉そうに言ってるが、自分でも目指したいと思う。
500デフォルトの名無しさん:2007/07/30(月) 22:13:34
rubyは非常に美しい言語だと思います。芸術です。
なので出来るだけ美しいプログラムを書きたいと思っています。
どんなプログラムにも。
いや例えばファイルをとって来て特定のファイルを操作するだけみたいなプログラムならそのまま書きますが、少し大きくなったら完全にOOPを遵守した方が問題が簡単になるのではないでしょうか。
まだプログラム初心者だからかプログラムをなるべく小さな問題に分けて考えないと作れません、これもOOPも利点ではないのでしょうか。
あとアルバイトでプログラマとして働きたいのですが(一石二鳥ですからね)
Rubyを使ったバイトってなかなかないですね。大体PHP、MySQL、Javaです。
バイトをするに当たってどのくらいの技術がいりますか?
501デフォルトの名無しさん:2007/07/30(月) 22:21:47
どこかにプロダクトとして提出する(あるいは正式に多人数で開発する)プログラムでないのなら、
世の中の8割のRubyプログラムには「でっかいサブルーチン」としての動作しかしないクラス(とメソッド)しか無いと思うぞ
502デフォルトの名無しさん:2007/07/30(月) 22:29:48
「クラスとインスタンスの関係はタイヤキの型とタイヤキの関係です」
「で、このクラスはインスタンスをいくつ作るんですか?」
「一点物ですよ」

クラスにする意味ないよな。正しくはモジュールにすべきだ。


あとRuby単品の仕事の募集というのは見たことがない。
(札幌のハロワで「Ruby使える人でもいいよ」というWebPG募集を1回だけ見かけたが)
Rubyだけ使えても飯食う段には意味がないというのが通説。
「Rubyの知識もあるので変態面に堕ちやすいP(ピー)を使ってもスジはバッチリです(笑)」というようなアピールに使う。
503デフォルトの名無しさん:2007/07/30(月) 22:35:10
一点もののクラスはダメなんですか。
なるべくクラスを作ってOOPに遵守しようとする人はやっぱりキチガイですかね。
おれはそっちの方が美しいと思うのですが。
>>501
Rubyは少人数向けのプログラム言語らしいですよ。
JavaからRubyへという本に書いてありましたよ
504デフォルトの名無しさん:2007/07/30(月) 22:38:50
ピーがPythonでないことだけはわかるが。また荒らしたいのかw
505デフォルトの名無しさん:2007/07/30(月) 22:45:57
多人数ってのはペアより数が多いことだろ。1、2、たくさん。
複数人で製作するなら保守性考慮してきちんとクラス設計しろってことかと。
あと>>502の「モジュールにすべき」はどちらかというとジョークに近い。
newが起動中1回だけしか行われないクラスであってもクラスである意味はある。

とりあえず、Rubyはそれほど美しい言語でもない。
大量のしがらみでがんじがらめに育たざるを得なかったJavaよりは美しい部分が多い
(というかJavaで醜かった部分がRubyでは素直なので実際以上に理想郷のように見える)
が、それにしたってせいぜい3歩くらい先にいるだけだ。

幻想はとっとと捨てて実際的なプログラミングしようぜ。
506デフォルトの名無しさん:2007/07/30(月) 22:53:40
ただ名前空間を分けるだけなら、Rubyにはモジュールがあるんだからmoduleを
つかう、て言うのが実際的でもあるんじゃないかと思う。
やっぱりクラスはクラスとして使うのが、Ruby言語の「仕様」だと思う。

これをお仕着せだと思いたい人は思ったらいいが。
507デフォルトの名無しさん:2007/07/30(月) 22:54:25
今簡単なソフト作ってるけどどのクラスがどんなメソッドやインスタンス変数を持ってたか、分からなくなる。
開発環境はemacs
OSはVine Linux
何かいい方法ありませんか?みなさん、メソッドとかは紙に書き出していってる系ですか?
それとも何かIDE使ってたりする?
RDEがあるのでWinが少しだけ羨ましい。
508デフォルトの名無しさん:2007/07/30(月) 22:57:46
>>506
いや、名前空間を分けるだけならそれでもいいんだが
たとえばAppクラスなんかだとインスタンスが必要な場面が出てくる
509デフォルトの名無しさん:2007/07/30(月) 22:57:56
>>507
一つのクラスにいろいろなことをさせてないか?
510デフォルトの名無しさん:2007/07/30(月) 23:00:15
>>509
クラスがたくさんあってわけわかめになってるのかもしれない
たとえばクラスを10個作ったら俺の短期記憶限界を超える
511デフォルトの名無しさん:2007/07/30(月) 23:06:05
>>507
>>509の言うとおり、またクラス・関数設計を(自分ルールでいいから)原則を
持ってやれば、そうそう「ドキュメント」は必要にならない、と思うよ。経験上。
512デフォルトの名無しさん:2007/07/30(月) 23:08:59
http://briefcase.yahoo.co.jp/bc/sunsunlight_heart/

kviewer.rbです。
テストのしかたとかも自己流です。debugで詰まりました
Array.newとしているのにNilClassとかいわれます、なぜでしょう。
どこがおかしいのか
また、これ必要ないよというコードがありましたが勉強の為に指摘してもらえるとうれしいです
513デフォルトの名無しさん:2007/07/30(月) 23:11:30
>>510
どう考えてもメインを除くとクラスはみっつしかないんですけどね・・・
慣れてないからかな、ずっと開発がストップしていましたが、やっと試験があとひとつになったので再開しました。
早く完成させたい。
ここを抜けたらあとは正規表現でスレを解析するだけだと思っています。
あぁ、あとまぁ過去のレス数なんかをファイルに書き込んだり読み込んだりしないといけないけど
これはそれほど手間じゃないかな
514デフォルトの名無しさん:2007/07/30(月) 23:15:34
>>512
そういうのに答えてくれそうな人はMLの方にいそうな気がする。
515デフォルトの名無しさん:2007/07/30(月) 23:16:14
>>512
いいかげんそのURL秋田
516デフォルトの名無しさん:2007/07/30(月) 23:19:12
>>515
同意

あれだろ、本当は自分で作る気無いだろ
517デフォルトの名無しさん:2007/07/30(月) 23:23:00
ネットとの接触の仕方の悪いとこがそのまんま出た形だな。

>>512
前回同様、自分で作れてないから文句言われるんだよ。まずは自分で作れ。
プログラム作ってるときなんて動かないなんて日常茶飯事だ。自力で直せ。

どうしてもわからなかったらわからんとこを抽象化して質問しろ。
製作意図ごと丸投げすんな。そんなことされてもこっちは全くわからん。
518デフォルトの名無しさん:2007/07/30(月) 23:27:22
いや前回からかなり改良されてるはずですよ。
進歩はしてるはずです。基本機能はあと少しなんだけど、なぜか詰まった。
@res_arrray = Array.new()
としているのに
@res_array.clearが
nilclassだからそんなもんねーよっていわれる
こういう局所的な問題に噛み砕けば教えてもらえますか?
MLは読んでるけど質問しにくい空気がある。
英語MLの方がいいかな・・・
519デフォルトの名無しさん:2007/07/30(月) 23:27:50
>>513
>>509のほうは見た?
みっつしかないからひとつのクラスでやることがたくさんあって
同時に考えることが必要以上に多くなってるんじゃないのかしらね。
520デフォルトの名無しさん:2007/07/30(月) 23:29:06
>>514
親切なメンバーからの返事に対して書いた返事の内容によって全員にハブられるよーなタイプだと思う
なんかよくいるタイプの質問君


まーとりあえずあれだ、本当の意味で初心者なのはわかったんで、小さいのから作れよ
きちんと動くのから作らないとわけがわからないし達成感もないしどこで動かなくなったんだか見当もつけにくい
あと何をするプログラムなのかはプログラム内容から推測しかけたが面倒っぽいのでパス
521デフォルトの名無しさん:2007/07/30(月) 23:33:40
なんでだろ、どうみてもArrayクラスなのに。
522デフォルトの名無しさん:2007/07/30(月) 23:35:24
p で必要な内容(例:サイトの内容)の表示をする → 動いたので正規表現で抜き出してみる
→ これも動いたのでデータの取得とデータの加工をメソッドに分ける → トップレベルに簡潔なメソッドチェーンが並ぶ
→ 似たようなメソッドの組み合わせをいくつか作って動かしてみる → メソッドを実行するメソッドを作る
→ メソッドをクラスにまとめてみる → 動いたらインスタンス変数とかにできるものを考える

今のところこんな感じで作ることが多い
たいていなんとかなるって
523デフォルトの名無しさん:2007/07/30(月) 23:41:39
>>518
とりあえずsageろ

>nilclassだからそんなもんねーよっていわれる
ヒント:initialize処理の順番

あと、質問に直接関係ないところで一つ悪い点がある
クラス定義内(attr_readerの前)で直接インスタンス変数を宣言しようとしてるよな?
そこに書いても宣言にはならない。ちゃんとinitializeで初期化すべき
524デフォルトの名無しさん:2007/07/30(月) 23:46:47
こんなことで毎回スレに来られても困るので、解決法を書く。

とりあえずは class Thre で何かおかしいことが起こってると推測できるんだよな。
で、@res_array のところ、たぶん46行目で例外吐いてると(エラーは勝手に訳すな端折るな1行全部書け)。
で、エラーメッセージは33行目の記述もあるはず。33行目のload_threadの中の46行目の以下略、みたいな。

だから initialize のとこでたとえばこう書く

def initialize(url)
p url
@url = url
p @res_array
load_thread()
@res_array = Array.new() #arrayとして認識させたい. いらん?
end

def load_thread()のとこにもこう書く

def load_thread()
@thread_name = "thre_namae"
p @res_array
@res_array.clear #初期化

で再度実行すると、urlはurlが表示されて、1回目と2回目の@res_arrayのぶんはnilが表示されるはずだ。
つまり、 initialize の load_thread の前の時点で@res_array は既にnilで、配列になってない。

では何故か。
525デフォルトの名無しさん:2007/07/30(月) 23:51:14
>>522
おれこのプログラムの設計がまず
1)こんなクラス必要だよなぁ
2)こんなインスタンス変数が必要だよなぁ
3)おっとこんなメソッドがないと現実の射影にならないぜ

の順だからわけわからんくなってるのかも。
これってOOPの考え方だよなと思ってるんですけど。OOPって数学みたいにきれい。
書いていて射精しそうなくらい美しい。

>>523
調べます。順番は気にしてなかたなぁ
526デフォルトの名無しさん:2007/07/30(月) 23:54:01
あ、ほんとだ、initializeでもおかしいぞってエラー出てる。
見逃してた、少し考えるか。この高知能の脳で。
527デフォルトの名無しさん:2007/07/30(月) 23:57:39
>>524みたいなベタで泥臭い方法ってどっかで教わったりしないのかな。しないか。
学校のテストじゃないんだから頭の中で考えたってデバッグなんてできないのに。
528デフォルトの名無しさん:2007/07/30(月) 23:58:41
>>525
「現実の射影」とかは考えない。
小説や漫画が現実ではないのと一緒。
2と3の順番は入れ替えて考えた方が良い。
529デフォルトの名無しさん:2007/07/31(火) 00:04:22
ちょっと疑問。
thread_nameだけど、これ最初load_threadにいれてた。
だけど認識出来ないといわれた
これはおそらく上のinitializeしないと使えないよの件によるものかと思われる。
まぁ現実的に考えて
@thread_nameはinitializeに入れるのがベターだとは思うが、これをload_threadに組み込みたいが
initializeにはいれたくない場合、つまりinitializeでは何もしないんだしいれる必要ないじゃんって場合どうすればいい。

もしかして、超もしかしてだけど、class定義はじまってすぐ宣言しているのはクラス内でしか使えないprivateな変数なのか?
つまりインスタント変数としても解釈されていない、よってattr_readerは無効ということ?
なんでinitializeに突然@thread_nameって書けばインスタント変数として定義されたことになるのかな
530デフォルトの名無しさん:2007/07/31(火) 00:16:11
だからsageろ、話はそれからだ
531デフォルトの名無しさん:2007/07/31(火) 00:16:38
bc.reload

>>523のラス
あと、質問に直接関係ないところで一つ悪い点がある
クラス定義内(attr_readerの前)で直接インスタンス変数を宣言しようとしてるよな?
そこに書いても宣言にはならない。ちゃんとinitializeで初期化すべき

が何のことが理解できない。
なぜか、@thread_numberは何もいれていないのでnilになってしまっているが一応宣言はされているし、その後にattr_readerでゲッタ作ってるから
外部で読めている。宣言は出来ていると思う。

とりあえず動かして欲しい。実はおれまじで感動している。
532デフォルトの名無しさん:2007/07/31(火) 00:18:08
あとOOP的に考えてこのプログラムは美しいですか?
それが一番の焦点です、おれは科学には美しさを求めます。
533デフォルトの名無しさん:2007/07/31(火) 00:21:44
そろそろうざいぞ夏厨
思い上がるな

用語は正しく使え。あとマニュアルあるいはリファレンス、解説書は必ず読め。いちいち人に聞こうとするな。
これからぶつかる数百の疑問をすべてこのスレにぶつける気か。
Rubyの前に何を知っていたのか知らないしどれだけ自信があったのかも知らないが(傲慢が透けて見えるぞ)、きちんとRubyを勉強しろ。


で、未定義のインスタンス変数は実際に @array = ナントカ と書かれた行が実行された瞬間にいきなり定義される。
initialize は new されるときに必ず読み込まれるという以上の特別な意味はない。
他の特定の言語のように「変数を定義するメソッド」でもなんでもないし、
「変数をここで定義しないとクラスの中で使えない」ということもない。
534デフォルトの名無しさん:2007/07/31(火) 00:25:23
Cを学校でやった程度。
まともに取り組んでるのはRubyがはじめて。
どこの用語が間違っていますか?
535デフォルトの名無しさん:2007/07/31(火) 00:36:26
ちょっとしつもん。ReFe の deb パッケージ公開してる人っていない?
sudo setup.rb install しなくても一般ユーザーで使える方法でもいいんだけれど。
536デフォルトの名無しさん:2007/07/31(火) 00:37:39
横レスだが >>534 「科学」「美しさ」「求めます」その他、かな?
537デフォルトの名無しさん:2007/07/31(火) 00:38:23
へ?何のことだかさっぱり。
とりあえずひと段落したので寝ます。
538デフォルトの名無しさん:2007/07/31(火) 00:40:52
>>535
setup.rb の configure 時に --prefix=$HOME/refe とかつけとけば、一般ユーザでも install できる。
539デフォルトの名無しさん:2007/07/31(火) 00:41:27
算数しかやってない小学生が「オイラーの公式って美しいよねー」
なんてまじめな顔で嘯いていたってちゃんちゃらおかしいってことだよな。
見ているこっちが恥ずかしくなる類の奴。
540デフォルトの名無しさん:2007/07/31(火) 00:42:23
>>546
見事に釣られたなw ていうかうぜぇ!!!!(546ではなく)
541デフォルトの名無しさん:2007/07/31(火) 00:46:21
>>546の見事な釣られっぷりに期待
542540:2007/07/31(火) 00:54:09
(>>540).gsub!(/546/, '536') したいが >>546が釣られるのは止めない。
543デフォルトの名無しさん:2007/07/31(火) 00:57:39
>>538
> ruby -I ~refe/local/lib/site_ruby/1.8 ~/refe/bin/refe String#index
String#index
--- index(pattern[, pos])

部分文字列の探索を左端から右端に向かって行います。見つかった部分文


おー動いたよ
せんきゅー
544デフォルトの名無しさん:2007/07/31(火) 01:25:27
>>512があんまりにもアレなので発作的に手を入れちったけど
途中で力尽きた。

http://kissho1.xii.jp/7/src/7jyou5014.txt.html
PASS:rb

けっこー眺めたけど、未だに何がしたいのか全貌はつかめていない。
545デフォルトの名無しさん:2007/07/31(火) 01:45:06
うは、OPP外れて全改正された。オワタ

require "open-uri"
で読み込んだら文字化けやばすぎて泣きそう。
日本語が表示されない・・・
546デフォルトの名無しさん:2007/07/31(火) 01:45:56
langhelpが全然動かないよう
そもそも「el4r のインストール時に el4r-rctool で .emacs を書き換えています」って意味わからんよバーカバーカ(逆切れ)

mklanghelpというコマンドはインストールされてるがlanghelpというコマンドがどこにもインストールされてない
っつーかこのel4rとかいうのがEmacs起動時に全然動いてない気がする
自動化夢見て変なことせんでいいからユーザーに導入の設定ファイル自力で書かせろよ

あーめんどい
寝る
547デフォルトの名無しさん:2007/07/31(火) 01:48:00
結構おれ的にはいい線いってると思うんだけどなぁ、OOP的に考えて美しいし。
ひとつひとつのクラスがクラスとして意味を持ってる。
車のハンドル、タイヤ、エンジン、アクセルといった具合に
アクセルを踏むとエンジンがかかってタイヤが回る、そのタイヤをハンドルで切って曲がる。
OOPはもの作りの精神を持っている。工学部なおれとしてはまさにこれこそUtopia
Matzは天才
548デフォルトの名無しさん:2007/07/31(火) 01:59:32
>>546
RDindexだっけ、Rubyだけならあっちのほうがいいような気がする
549デフォルトの名無しさん:2007/07/31(火) 02:27:50
投げやりに説明しよう!
件のるびまの記事では、なんとEmacsでlanghelpを使うためのel4rのインストールという段階がすっぽり抜けているのだ!
きっとみんな当たり前のように入ってるから気づかなかったんだね!
記事検証用にアカウントを新規に作ってインストール手順再現なんて面倒だし仕方ないよね!
ttp://jp.rubyist.net/magazine/?0017-langhelp

んで、el4rをインストールしたら
el4r-rctool -p
el4r-rctool -i
して.el4rディレクトリを作って.emacsの末尾にel4r用の設定を追加させないと使えないから注意だよ!

あと!
 ・ 毎回起動時に*Compile-Log*に何やらコンパイルログが表示される
 ・ 毎回終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
のは俺の環境的には仕様なので誰か一発で助けてくれると嬉しい!
550デフォルトの名無しさん:2007/07/31(火) 06:17:38
↓のself.fooと定義するのとmodule_functionで定義するのって違う?
module Hoge
 def self.foo
 end

 def foo
 end
 module_function :foo
end
551デフォルトの名無しさん:2007/07/31(火) 06:21:11
おなじー
552デフォルトの名無しさん:2007/07/31(火) 06:34:09
早朝レスありがとうございます

同じことやるのに複数の書き方があると本当に同じか迷っちゃいますね
do endと{ }は同じと思ってたら微妙に違うし
553デフォルトの名無しさん:2007/07/31(火) 07:14:07
結合度が違うんだよなぁ
do-end派の俺は何度かハマった
554デフォルトの名無しさん:2007/07/31(火) 08:02:12
>>550
module_functionだと、プライベートメソッドとしても定義される
マニュアル見れ

まぁ普通に使うならあんま差は無いけど
555デフォルトの名無しさん:2007/07/31(火) 09:20:43
おはよ、がんばろっ!
556デフォルトの名無しさん:2007/07/31(火) 10:10:34
>>552
意見は分かる。
ただブロックの書き方は文法だけど、module_functionは単にそういうメソッドってだけだから、同じに語るのは?ってなる。
557デフォルトの名無しさん:2007/07/31(火) 13:00:47
>同じに語るのは○○だからおかしい
の○○を埋めよ
558デフォルトの名無しさん:2007/07/31(火) 13:03:21
>>549
> 終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
そういうのになる人もいるん? langhelp面白そうだなと思ってたんだけどちょっと躊躇
559デフォルトの名無しさん:2007/07/31(火) 13:32:37
自作メソッドの説明をRDあるいは#のコメントで書いておきたいんだけど

# ここつまり定義前にメソッドの説明
# あるいは使い方・引数解説
def method_1(arg)
  :





def method_1(arg)
# ここつまりdef直後にメソッドの説明
# あるいは使い方・引数解説
  :

のどっちに習慣づけるのが無難?
560デフォルトの名無しさん:2007/07/31(火) 15:25:09
>>559
前者でいいんじゃないか?
RDoc的に。
561デフォルトの名無しさん:2007/08/01(水) 02:43:33
>>549
>  ・ 毎回起動時に*Compile-Log*に何やらコンパイルログが表示される
どんな? 先にbyte-compileしといてもダメ?

>  ・ 毎回終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
kill-emacs-hookかkill-buffer-hookでプロセスを止めればいいんジャマイカ。
el4r-instanceをみてないんで確実じゃないが、終了すれば一緒に終わりそうな
気もするけど。
562デフォルトの名無しさん:2007/08/01(水) 03:30:32
>>454
チートシートのマウスパッドほしいかも

Ruby Cheatsheet v.1
http://ruby.cenophobie.com/rubycheat.php

こっちにもRubyのチートシート一杯

Cheat Sheet Round-Up: Ajax, CSS, LaTeX, Ruby…
http://www.smashingmagazine.com/2006/10/30/cheat-sheet-round-up-ajax-css-latex-ruby/
563デフォルトの名無しさん:2007/08/01(水) 10:21:36
>>561
el4r-instance のトップレベルの実行フェーズに

finalizer = lambda {
……
exit 0
}
trap(:TERM, &finalizer)

という記述があるので TERM シグナル送れば止まるように見える
でも kill-emacs-hook に頼るって微妙にカッコ悪いな
564デフォルトの名無しさん:2007/08/01(水) 11:48:42
>>651
ログは
** reference to free variable ee-anchor-format
** assignment to free variable imenu--index-alist
だそうな
*Messages*でloadされてたもののうち /usr/share/emacs/site-lisp/ruby1.8-elisp/inf-ruby.el が
バイトコンパイルされてなかったからバイトコンパイルしてみたけど変化なし

あーそうそうこんな感じ
ttp://www.wizard-limit.net/mt/pc/archives/2007_02_06.html
565デフォルトの名無しさん:2007/08/01(水) 13:19:23
>>564
> ** reference to free variable ee-anchor-format
lib/el4r/emacsruby/langhelp.rbのdefun_langhelp_menu_modeで
defvar(:ee_anchor_format, "<<%s>>") と定義済みのように見えるがなぁ。

> ** assignment to free variable imenu--index-alist
こっちは同じあたりに el_require :imenu を加えればいいかも。

> *Messages*でloadされてたもののうち /usr/share/emacs/site-lisp/ruby1.8-elisp/inf-ruby.el が
> バイトコンパイルされてなかったからバイトコンパイルしてみたけど変化なし
これは関係ないな。
langhelpはどうも固定のemacs-lispをロードするんじゃなくて、
実行時にruby scriptから初期化するっぽい。

プロセスのほうはel4r.elに
(add-hook 'kill-emacs-hook 'el4r-shutdown)
566デフォルトの名無しさん:2007/08/01(水) 13:29:33
このぶんでいくと、近い将来Javaもジェネレータを正式サポート
ということになるかもしれないな。
ttp://d.hatena.ne.jp/bellbind/20070801
ユニコードに続いてyieldでもRubyは孤立?
567デフォルトの名無しさん:2007/08/01(水) 13:50:40
すみません。
某参考書のサンプルコードを実行していて疑問に思ったのですが、
あるメソッドで
def swap(other)
xtmp = @x
ytmp = @y
@x = other.x
@y = other.y
other.x = xtmp
other.y = ytmp
# self
end

というのがあります。
ここでselfというのはどのような役割をしているのでしょうか?
上記のようにコメントアウトしても結果に変化はありませんでした。
568デフォルトの名無しさん:2007/08/01(水) 14:02:02
>>567
メソッドの最後に評価された文の値がメソッドの戻り値になる。
つまりそれは return self と書いてあったのと同じこと。
569デフォルトの名無しさん:2007/08/01(水) 14:02:30
>>567
swapメソッドの戻り値がself
570デフォルトの名無しさん:2007/08/01(水) 14:51:13
通常のメソッド定義でreturn抜きの記述を使うのはあまりよい慣習ではないな
571デフォルトの名無しさん:2007/08/01(水) 15:28:36
初心者卒業したら、rubyでは必要ないのにreturn書くのは少数派だとわかってきますよ
572デフォルトの名無しさん:2007/08/01(水) 15:39:33
>>566
> ユニコードに続いてyieldでもRubyは孤立?
Ruby typeのyieldは構文を拡張しないと無理だからな。
573デフォルトの名無しさん:2007/08/01(水) 15:42:08
rubyのreturnはgoto並に気を使うなあ
574567:2007/08/01(水) 15:53:52
なるほど。
みなさんレスありがとうございました。
575デフォルトの名無しさん:2007/08/01(水) 15:59:06
>>570
returnは2つの動作というか副作用というかそういうのがあるのがよろしくないな
「メソッドの返り値を明示的に設定するだけ」というニッチな文法があればよかったのに

return書いたらメソッド定義の途中でもいきなり帰っちゃうのが嫌
かと言って

if …
output = hoge
else
output = moge
outout = hage if var_is_true?
end

return output

とかいちいち一時変数使って出口一個にするのに気を遣うのもそれはそれで嫌
576デフォルトの名無しさん:2007/08/01(水) 19:07:25
>>575
確かVBが戻り値の指定と実際の脱出を分離していたような気がするな。
577デフォルトの名無しさん:2007/08/01(水) 19:11:13
戻り値の指定は関数と同じ名前の変数に入れとくんじゃなかったっけ
578デフォルトの名無しさん:2007/08/01(水) 20:00:37
IOについての質問です。

[text.txt]
a b
c d

[fileop.rb]
file = open("text.txt")
while text = file.gets do
!text.chomp!
puts text
end
end
file.close

while中のtextを配列とみなして
puts text[1]
のようにすれば
b
d
のように出力されるかなと思ったのですが
32
32
と数値が出力されてしまいました。

test.txtの二列目のみ取得して出力するにはどうすればよいのでしょうか?
579デフォルトの名無しさん:2007/08/01(水) 20:04:41
配列とみなすとかそういう曖昧な処理はできん
「配列である」か「配列ではない」のどっちかだ

ということで配列として処理したいなら配列に変換しれ
580デフォルトの名無しさん:2007/08/01(水) 20:16:01
つうか、色々と道のりが遠そうな書き方だな。
もし Ruby が最初に学んでるプログラム言語なのなら、今使ってる参考書を投げ捨てろ。
そいつは既存の言語を念頭においてて、完全初心者に対しては独り善がりで膿しか出さねー。

で、とりあえずこれは文法エラーで動かないので投稿時には実際のプログラムをコピペしたほうがよい。
適当に再現するぞ。

file = open("text.txt")
while text = file.gets do
text.chomp!
puts text
end
file.close

で、答は>>579だな。
puts text ではなく p text とすると text が何のオブジェクトであるかが視覚的に反映されるので製作時に超便利。

"a b"
と " " で括られて表示されたらそれは文字列で、
["a", "b"]
と [ ] で括られて表示されたらそれは配列。表示する前に text を配列にすればよい。
581デフォルトの名無しさん:2007/08/01(水) 20:21:11
ありがとうございました。
配列への変換方法を調べてみます。
582デフォルトの名無しさん:2007/08/01(水) 20:26:32
>>576
Delphiもそう
確か関数の抜けた時点で result って変数に入ってる値が戻り値になる
そんなワケで Ruby でも
最後に return result なコードを何度か書いてる俺

でも一方で return は便利だと思う俺
最近は出口沢山書く方が好きだ
583デフォルトの名無しさん:2007/08/01(水) 21:14:01
1000行くらい詰まってるファイルを整形処理する時に、
Perlとrubyで同じように組んでPerlでは通ったのですが
rubyではワーニングが出ました。

$ ./seikei.pl logfile.log | head -5
0.000000000000000 0.4205064161690913
2.5132741228718340E-002 0.1944036417009673
5.0265482457436681E-002 0.1409928514422889
7.5398223686155035E-002 0.1356904102940938
0.1005309649148734 0.1332408284845677

$ ./seikei.rb logfile.log | head -5
0.000000000000000 0.4205064161690913
2.5132741228718340E-002 0.1944036417009673
5.0265482457436681E-002 0.1409928514422889
7.5398223686155035E-002 0.1356904102940938
0.1005309649148734 0.1332408284845677
./seikei.rb:11:in `write': Broken pipe (Errno::EPIPE)
from ./seikei.rb:11:in `puts'
from ./seikei.rb:11

ファイルの行数が50行くらいなら問題なく両方とも実行できました。
これはrubyとperlのメモリの使い方の差か何かでしょうか?
584デフォルトの名無しさん:2007/08/01(水) 21:16:37
すみません、1000行ではなく10000行です。
あと、headで削らずに10000行すべて書き出した場合は
ワーニングはでませんでした。
585デフォルトの名無しさん:2007/08/01(水) 21:53:19
で、要はあなたの家に直接行って画面見てプログラムに何が書いてあるか調べればいいのね
586デフォルトの名無しさん:2007/08/01(水) 22:08:11
>>583
うちの環境ではエラーは出ていません :D
って書けばいいんだろうか >>585
587デフォルトの名無しさん:2007/08/01(水) 22:12:23
ソースコードはこうなってます。

Perl
-----------------------------------
while ($_ = <>){
s/^\s+//g;
if(/^[^#]/){
print $_;
}
}
-----------------------------------

Ruby
-----------------------------------
while line = file.gets do
line.chomp!
cutspace = line.sub(/\s+/,'')
if /^[^#]/ =~ cutspace then
puts cutspace
end
end
file.close
-----------------------------------
588デフォルトの名無しさん:2007/08/01(水) 22:25:34
そのheadは5行貰ったら終了するからbroken pipeが発生するのは
あたりまえで、Perlがbroken pipeを無視してるとか?
589デフォルトの名無しさん:2007/08/01(水) 22:34:26
という事は、rubyのオプションか何かで警告のレベルを
低くすれば出ないってことですかね?
とりあえず、標準出力は正常(?)に取れてますから問題はないと思うのですが…
590デフォルトの名無しさん:2007/08/01(水) 22:39:45
そもそも file.gets の file って何よ
591デフォルトの名無しさん:2007/08/01(水) 22:42:21
ARGFから読むとうまくいったり?
592デフォルトの名無しさん:2007/08/01(水) 22:47:35
fileはopenfileで、開くファイルの名前が入ってる変数が代入されてるものです
593デフォルトの名無しさん:2007/08/01(水) 22:51:27
while line = ARGF.gets do
line.chomp!
cutspace = line.sub(/\s+/,'')
if /^[^#]/ =~ cutspace then
puts cutspace
end
end

0.000000000000000 0.4205064161690913
2.5132741228718340E-002 0.1944036417009673
5.0265482457436681E-002 0.1409928514422889
7.5398223686155035E-002 0.1356904102940938
0.1005309649148734 0.1332408284845677
./seikei.rb:12:in `write': Broken pipe (Errno::EPIPE)
from ./seikei.rb:12:in `puts'
from ./seikei.rb:12

やっぱり出ちゃいますね…
594デフォルトの名無しさん:2007/08/01(水) 22:57:38
こういうローカルではEPIPEはデフォで無視して欲しいんだがなあ
595デフォルトの名無しさん:2007/08/01(水) 23:02:01
file = ARGF
begin
while line = file.gets do
line.chomp!
cutspace = line.sub(/\s+/,'')
if /^[^#]/ =~ cutspace then
puts cutspace
end
end
file.close
rescue Errno::EPIPE
false
end

エラー消すためだけに小手先弄くったって感じがして気分悪いな
596デフォルトの名無しさん:2007/08/01(水) 23:07:34
>>595さんのでエラーでなくなりました。
597デフォルトの名無しさん:2007/08/01(水) 23:19:13
まあそりゃそうだろうな

rescueの位置があまりよくない気もするが
598デフォルトの名無しさん:2007/08/01(水) 23:32:54
>>595
Rubyはエラーじゃなくて例外だから大丈夫
イベントやメッセージがガンガン飛んでくると考えれば捕まえるのは全く問題ないむしろ推奨
599デフォルトの名無しさん:2007/08/01(水) 23:57:19
確かに、エラーじゃなくて例外なげてるだけか。
600デフォルトの名無しさん:2007/08/02(木) 01:12:09
ruby初心者だけど。とりあえず、ruby使いたくなるようなソースコードを
100行以内で書いてくれ。
601デフォルトの名無しさん:2007/08/02(木) 01:23:22
少しはRubyをいじってみた?
あなたの直感が何も告げないのならば、他の言語を学ぶべきです
602デフォルトの名無しさん:2007/08/02(木) 01:33:49
600はRubyをなかなか習得できず楽する方法を探しているヘタレか、釣りかのどちらかだな
603デフォルトの名無しさん:2007/08/02(木) 01:55:28
メール欄空白だから釣り認定

プログラミングが楽しくなることが多いというのが一応公称のウリではあるが
別に苦行を経てまで習得するような言語でもないよな
ピンと来ないなら無理してまでRubyに切り替える必要はない

ちなみに苦行と思っても仕方なく習得するのはC
604デフォルトの名無しさん:2007/08/02(木) 02:01:48

Java使わんで、日本生まれプログラミング言語「Ruby」使えや!
http://news23.2ch.net/test/read.cgi/news/1185985169/
605デフォルトの名無しさん:2007/08/02(木) 02:03:59
ニュー速からきますた
606デフォルトの名無しさん:2007/08/02(木) 02:16:25
プログラム作成が"誰にでもできる"ようになる時代はおそらく来ない

理解できる人間が優れているとは言わないが、ギターをまともに弾けるとかそういう特別な能力の類であることは確か
そういうプログラミング認識能力を持ってない人はいくら勉強してもうまく作れない

俗に言うポインタが理解できない現象と同じ
学習・習得という点でRubyという言語に何か特別な力があるわけじゃない
607デフォルトの名無しさん:2007/08/02(木) 03:31:09
どっちかと言うと他の色々な言語を触ったことのある人間が
「ほほう、上手いこと良いトコ取りしたじゃないか」
と思う言語だよな Ruby って

…でも詳しくやってくと所々綻びが見えて
ちょっとがっかりする言語でもある
608デフォルトの名無しさん:2007/08/02(木) 03:33:25
どちらかと言えばプログラミング初心者よりも経験者が
「おおっ、上手く良いトコ取りしてる」
と思う言語だよな

まあ、詳しくやってくと綻びが見えて
「まあそんなもんか」
とちょっとガッカリする言語でもあるんだが
609デフォルトの名無しさん:2007/08/02(木) 04:04:41
綻びってどんな?
610デフォルトの名無しさん:2007/08/02(木) 06:10:38
言語仕様よりも、実装・ドキュメント・コミュニティの「綻び」のほうが大きい。
611デフォルトの名無しさん:2007/08/02(木) 07:18:38
nilの特別扱いとか
612デフォルトの名無しさん:2007/08/02(木) 07:33:57
そうかな?
C#とか、Delphiとかやってた身にしてみれば、
うまくまとめたなーって感じに見えるけど・・・

Lisperとか、MLerの意見聞いてみたい
613デフォルトの名無しさん:2007/08/02(木) 07:34:55
て、ここ初心者質問スレじゃねーか。
本スレいこうよ・・・
614デフォルトの名無しさん:2007/08/02(木) 08:24:09
nilとnon-nilの二元論に落とし込めるべきべきであった

…falseが欲しいってのもよくわかるんだけどね
615デフォルトの名無しさん:2007/08/02(木) 11:50:39
nilとfalseは、意味がまったく異なるのだからあってしかるべき。
falseがいらないって言うならtrueがあるのも不自然なわけで、
そうすると真偽を表現するのに結局は整数の0か1かになっちまうよ。

と、ここまで書いてtrue/falseが存在するのは思想として
人間側をとるのか、電算機側をとるのかということに思い至った。
616デフォルトの名無しさん:2007/08/02(木) 12:31:43
Rubyにはbooleanという概念がないからnilとnonnilだけでいい
「nilとfalseが偽です」は「空文字列とundefと0が偽です」並にカッコ悪い
617デフォルトの名無しさん:2007/08/02(木) 12:42:17
falseがnilのエイリアスだったらいいのかな?
618デフォルトの名無しさん:2007/08/02(木) 12:46:20
>>617
たぶんそっちのほうがすっきりする
(いまさら動かしようがないけどな)

ただ条件分岐の中身は「nilかどうか」で分岐することになるから見た目が多少アレに
「こんなんならLisp使えLisp」という声が今よりも強くなること必至
619デフォルトの名無しさん:2007/08/02(木) 12:55:34
>>616
よって「booleanを返します」「真偽値を返します」と書いてあるメソッド解説は糞
「偽を返します」としか書かれてない解説も糞(作者によってfalseとnilが半々な印象)

…なんだ結構あるな
誰か書き直そうぜ
620デフォルトの名無しさん:2007/08/02(木) 13:00:20
どーでもいいですよ
621デフォルトの名無しさん:2007/08/02(木) 13:32:42
nil: 値は存在しない
false: 値は存在する

TrueClassとFalseClassのスーパークラスとしてBooleanを用意すればよかったの?
622デフォルトの名無しさん:2007/08/02(木) 13:51:25
>>619
誰かが書いたあとで、それに対して貴重な時間を割いて上から目線で嫌みったらしく
コメントする準備は、全員整ってるんだけどね。
まぁ、そのあたりがRubyコミュのクオリティ。
623デフォルトの名無しさん:2007/08/02(木) 14:07:33
そういやBooleanClassが無いよな。
なんでだろ

まぁDBでのnull値の扱いよりはましだな。
624デフォルトの名無しさん:2007/08/02(木) 15:22:14
BooleanClassがない理由は [ruby-list:40863] にある。
説明になってないが。
625デフォルトの名無しさん:2007/08/02(木) 15:26:21
わかりやすい
626デフォルトの名無しさん:2007/08/02(木) 17:13:55
>>624
驚きの新事実!!!
と言うか、2年前の話を蒸し返していたわけですな

↓ 何事も無かったかのように質問をどうぞ
627デフォルトの名無しさん:2007/08/02(木) 17:44:50
蒸し返していたというか誰もが疑問に思うことであることの証
628デフォルトの名無しさん:2007/08/02(木) 22:45:25
>>594
パイプの先がなくなっても終了しなくなっちゃうだろうが。
629デフォルトの名無しさん:2007/08/03(金) 19:51:43
CSVファイルをパースしようとして以下のようにしたのですがうまくいきません。
配列にならずに、文字列のままで表示されてしまいます。
書き方が間違ってますでしょうか?

CSV.parse(filename, 'r') do |line|
p like.to_a
end
630デフォルトの名無しさん:2007/08/03(金) 20:00:39
629です。
すいません、実際には、
p like.to_a ではなくて、p line.to_a 
となってます。
どうかよろしくお願いします。
631デフォルトの名無しさん:2007/08/03(金) 20:06:16
それだと区切り文字が r になってる

CSV.parse(filename){}
CSV.open(filename, 'r'){}
632デフォルトの名無しさん:2007/08/03(金) 20:11:45
>>631
ありがとうございます。
なるほど、open(filename)じゃなくて、open(filename, 'r')と書けと
メッセージが出ていたのをちゃんとみてなくて、
parse(filename, 'r')としてしまったようです。
ありがとうございました。助かりました。
633デフォルトの名無しさん:2007/08/03(金) 20:15:33
いやマニュアルきちんと見ろよ

…ってマニュアルねーじゃねーか
634デフォルトの名無しさん:2007/08/03(金) 20:20:11
632です。
ある名前の配列が存在するかどうかを調べる方法は
あるでしょうか?

やりたいことは、配列の名前をダイナミックに生成して、
存在すればなにもせず、存在しなければ配列を新規作成、
という処理です。

質問ばかりですいません。
635デフォルトの名無しさん:2007/08/03(金) 20:50:15
つリファレンス http://www.ruby-lang.org/ja/man/

上記は結構つながりにくいというかよくエラーにされてしまうので、ダウンロードして
しまうか、リファレンス付きの参考書を買った方がいいかも。
636デフォルトの名無しさん:2007/08/03(金) 21:31:19
>>635
いいこと教えてあげる。
リンクを開いてマニュアルページがあったら、普通の人はそれを使う。
君みたいな紹介の仕方をする人が多いから、ダラダラ使う人が減らずに人大杉で鯖が飛ぶんだよ。

というわけで、
ローカルで使えるHTMLヘルプ版ダウンロード
ttp://elbereth-hp.hp.infoseek.co.jp/ruby.html

ここをいきなり貼るのが好ましい。
637デフォルトの名無しさん:2007/08/03(金) 21:46:54
わかりました。マニュアル読みます。
ところで、どの辺読めばいいでしょうか?
いちおう手元のRubyレシピブックという本は見たのですが、
わかりませんでした。
638デフォルトの名無しさん:2007/08/03(金) 21:51:15
クラスやメソッドの問題ではないな
設計の問題だと思う
生成した配列を全部入れておく配列とかハッシュとかそういうのを作ることになるはず

もしハッシュで key => [a,b,c] という格納をしたのなら、特定のkeyがあるかどうか探す方法は
Hashのhで始まるあたりに書いてあったりなかったりする
639デフォルトの名無しさん:2007/08/03(金) 21:51:37
>>636
好ましい、かどうかは俺には判断つかんな。
ruby-lang.orgはまあ公式ドメインだが、elbereth-hp.hp.infoseek.co.jpを
2chで素直に開きたいかどうかは人に依るんじゃないか?
>>636のリンク先が怪しい、と言ってるわけではない)

文句なく好ましいのは、>>635のリファレンスが普通に機能するか、せめて
ダウンロード版へのURLは動く形で置いておいてくれることだろうが。
Rubyアソシエーションが出来て、この辺りも改善されるのかな?
640デフォルトの名無しさん:2007/08/03(金) 21:57:23
>>639
中の人が同じなのに、やること、できることが変わるわけない。
641デフォルトの名無しさん:2007/08/03(金) 22:27:29
>>634
Hashをつかえばいいんじゃないかな。

table = {}
while line = gets()
 arr = line.split
 key = arr[0]
 table[key] = [] unless table[key] # 存在すればなにもせず、存在しなければ配列を新規作成
end

なお
 table[key] = [] unless table[key]

 table[key] ||= []
とも書けるけど難しかったら無視して。
642デフォルトの名無しさん:2007/08/03(金) 22:53:43
require "fileutils"
dir = Dir.open("/home/akira/ruby/")

dir.each do |d|
d.each do |f|
File.rename(f, f.downcase)
end
end

dir.close

renameのところでエラーが出ます。
test.rb:6:in `rename': Device or resource busy - . or . (Errno::EBUSY)
とのことですが、どういう事か分かりません。
renameの使いかたが良くないのでしょうか?
643デフォルトの名無しさん:2007/08/03(金) 22:58:07
聞く前に自力でデバッグしようぜ
いちいち聞いてたらまた聞かんといかんぜよ
実際にどんなファイルがリネームされてるかputsで逐一表示させるとかさー
644デフォルトの名無しさん:2007/08/03(金) 23:09:51
>>641
Perlの人?

ハッシュ table に key 名義で nil が登録されてるとそれ誤動作するぞ
{'No3433' => nil} みたいなデータ構造

ハッシュに key が含まれてるかどうかは Hash#has_key?(key) で調べないとだめだよ
きちんと書くクセつけとかないと近い将来これでバグるぞ

>>642
>>643の言う通り f を表示してみれば…わかるかな、これ
ディレクトリには . と .. が含まれていて単純にeachで枚挙するとそれも引っかかるって話なんだけど
645デフォルトの名無しさん:2007/08/03(金) 23:25:46
なる。一度pしてやっているので分かります。
.や..を除けばいいんですね。

ところで
dir = Dir.open()
p dir.readとしても"."しか表示されません。
なぜでしょう。なんとなく分かるような分からないような・・・詳しい説明が欲しいです。
646デフォルトの名無しさん:2007/08/03(金) 23:31:15
>>645
その前にあなたの実行環境やそのスクリプトが対象にしているディレクトリの情報や
年齢・性別・職歴や趣味・血液型・星座などなどがわかれば誰か説明してくれる
かもしれない。
多分、直接的な詳しい説明はリファレンスの Dir とか Dir#readとかに乗ってると
思う。
647デフォルトの名無しさん:2007/08/03(金) 23:33:56
>>645
> (Dir#)read
> ディレクトリストリームから次の要素を読み出して返します。最後の要素まで
> 読み出していれば nil を返します。

手元のリファレンスではこうなってる。これで私は納得できるんですが。
648デフォルトの名無しさん:2007/08/03(金) 23:51:46
なる。
p dir.readを2連発したら解決しますた。
つまりdir.readってio.getsみたいなもんなんですね。
おれてっきりDirクラスてIOのサブクラスだと思ってた。

>>646
ruby 1.8.5 (2006-08-25) [i386-linux]
23 M Student Squat B Gemini
649デフォルトの名無しさん:2007/08/04(土) 00:00:00
require "fileutils"

dir = Dir.open(".")

dir.each do |d|
d.each do |f|
if f!=".." && f!="."
File.rename(f, f.upcase)
end
end
end

renameするプログラム完成!
650デフォルトの名無しさん:2007/08/04(土) 06:02:07
>>636
まあ別に503が出てても鯖が飛んでるわけでもないけどね。
アクセスを制限してるだけらしいし
651デフォルトの名無しさん:2007/08/04(土) 06:18:40
>>644
>ハッシュ table に key 名義で nil が登録されてるとそれ誤動作するぞ
>{'No3433' => nil} みたいなデータ構造
>
>ハッシュに key が含まれてるかどうかは Hash#has_key?(key) で調べないとだめだよ
>きちんと書くクセつけとかないと近い将来これでバグるぞ

逆だろ。{'No3433'=>nil}だったらhash.has_key?(key)はtrueでhas[key]はnilなんだから
hash[key] = [] unless hash.has_key?(key)
だとおまえのいう {'No3433'=>nil} のときに [] が代入されないbugになる。
hash[key] = [] unless has[key]
が正解。
まあ質問者がどっちの仕様を望んでいるのか知らんが。
652デフォルトの名無しさん:2007/08/04(土) 07:48:08
HTTP のプロクシを作りたいんですが、Webrick をつかうと、
ファイルを全部落とし終わるまで応答がなくなってしまうので、
回線が細いとちょっと悲しいです。

ぶっちゃけ、proxyを介するとyoutubeの動画が待てども待てども
出てこないのをどうにかしたいんですけど、うまい方法はないでしょうか。
653デフォルトの名無しさん:2007/08/04(土) 11:38:56
うへ、Ruby1.9には配列からランダムに要素を返す Array#choice なんてのがあるのか
なんという無駄でおバカ機能
654デフォルトの名無しさん:2007/08/04(土) 12:32:43
せめてchooseだよな、という話ではないな。
655デフォルトの名無しさん:2007/08/04(土) 13:30:14
>>652
おお、同士よ。
俺はyoutube.comの時はproxyを通すの諦めたw
656デフォルトの名無しさん:2007/08/04(土) 18:19:50
RubyとREXMLを用いてXMLをパースし、特定のIDと同階層のノードをDBに保存するプログラムを作成しています。
特定のIDをマッチングさせることはできたのですが、このIDと同階層のノードを保存する方法がわかりません。。
※check_idsは保存したいIDの配列です。例えば12345がマッチした場合、taro、あいうえおを抽出したいです。
---
def parse__xml(source)
doc = REXML::Document.new source
doc.elements.each("aaa/bbb/id") do |e|
if check_ids.member?(e.text)
#ここがわかりません。。。
end
end
end
---
<aaa>
<bbb>
<id>12345</id>
<user>taro</user>
<text>あいうえお</text>
</bbb>
<bbb>
<id>67890</id>
<user>hanako</user>
<text>かきくけこ</text>
</bbb>
</aaa>
657デフォルトの名無しさん:2007/08/04(土) 18:33:39
irbってどんな時に使うのがいいですかね?
658デフォルトの名無しさん:2007/08/04(土) 18:47:29
>>657
どんな時に使えばいいのかではなく、
使いたいと思った時に使うのだ。
君が使いたいと思わなかったら、使う必要はない。
659デフォルトの名無しさん:2007/08/04(土) 18:55:57
あんまり便利じゃないなぁって思っただけです。

ところでemacsでコーディングしてktermに戻る時はどうすればいいですか?
マウスでいちいちクリックしてカーソルを移すのはめんどい。
660デフォルトの名無しさん:2007/08/04(土) 18:56:17
>>657
このスレでえらそーに講釈垂れるときに使う

最初は使い道さっぱりわからんと思うんでしばらく放置してよし
661デフォルトの名無しさん:2007/08/04(土) 18:57:50
>>659
4つほど方法を思いついたが環境依存だしRuby関係ないから他の板で聞け
662デフォルトの名無しさん:2007/08/04(土) 19:03:58
>>661
教えてください。お願いします。
663デフォルトの名無しさん:2007/08/04(土) 19:16:36
>>656
あんまりいい解法じゃないかもしれないけど、

doc.elements.each("aaa/bbb/id") do |id|
  puts id.parent.elements['user'].text
  puts id.parent.elements['text'].text
  puts id.next_element.text
  puts id.next_element.next_element.text
end
doc.elements.each('aaa/bbb[id]') do |bbb|
  puts bbb.elements['user'].text
  puts bbb.elements['text'].text
end
664デフォルトの名無しさん:2007/08/04(土) 19:34:42
>>656
def parse__xml(source)
 doc = REXML::Document.new source
 check_ids = {'12345' => true}
 doc.elements.each("aaa/bbb") do |e|
  if check_ids.include? e.get_text('id').value
   puts e.get_text('user').value
   puts e.get_text('text').value
  end
 end
end

文字コードは適切に処理して下さい。
665デフォルトの名無しさん:2007/08/04(土) 19:59:29
>>663

ありがとうございます!!
助かりました。
666デフォルトの名無しさん:2007/08/04(土) 20:06:55
>>664

お二人も応えていただけて感激です!
ありがとうございました!
667デフォルトの名無しさん:2007/08/04(土) 20:08:57
>>661
調べたら
emacs &
ctrl+z
でシェルに戻ってこれるのですが、emacsに戻るやりかたが分かりません。
jobsというコマンドをすると
[1]+ Running emacs test.rb &
とでてきますが・・・
bg 1としても
bash: bg: bg background job?
といわれます。
668デフォルトの名無しさん:2007/08/04(土) 20:10:29
えふじい
669デフォルトの名無しさん:2007/08/04(土) 20:10:47
Ruby関係ないから他の板で聞け
670デフォルトの名無しさん:2007/08/04(土) 20:21:25
>>668
fg 1としたら端末上でemacsが始まりました。
おれは
emacs &とした時に別枠で起動しますよね。
ここにカーソルを移動させたいんです。
具体的な方法を教えてくれませんか。

>>669
関係あると思います。プログラマはふつうに比べてlinuxユーザが多いし、コーディングの効率をあげるために必要な知識です。
671デフォルトの名無しさん:2007/08/04(土) 22:02:38
失せろカス
672デフォルトの名無しさん:2007/08/04(土) 22:09:56
>>670
じゃあもっと関係の深い板なりスレできけばいいんじゃないかな。
きみの考えだとRuby on RailsのことをMac板で聞いてもいいことになるし
プログラムのことを独身男のあつまるとこで聞いてもよいことになる。
673デフォルトの名無しさん:2007/08/04(土) 22:24:19
無視すればいいのにお前ら優しすぎるぞ・・・。
674デフォルトの名無しさん:2007/08/04(土) 22:36:46
>>659の時点でそれを思いついていたなら褒めてあげる
>>670を見て思いついたならアドバイスとしては最低、というか
>>670にまで行ったからこそスレとしてコンセンサスが取れるんじゃないの
675デフォルトの名無しさん:2007/08/04(土) 22:44:03
流れがあった上なら、多少スレ違いでも(個人的には)OKだと思うけど
いきなりemacsが分かりませんlinuxの操作が分かりませんとか言われてもな
676デフォルトの名無しさん:2007/08/04(土) 22:51:29
>>674
まーな
これでなお話続けようと思う奴はおらんだろ(>>673はある意味杞憂)
677デフォルトの名無しさん:2007/08/04(土) 23:52:18
お願いです。必死なんです、教えてください!
678デフォルトの名無しさん:2007/08/04(土) 23:59:09
GTK+の質問はここでいいですか?
679デフォルトの名無しさん:2007/08/05(日) 00:03:45
Ruby/gtkは使ってる人少ない(というかRubyでGUI併用してる人自体が少ない)からあまり期待しないで
込み入ってるなら最初からメーリングリストとかに投げたほうがまだ回答率上がるかも
680デフォルトの名無しさん:2007/08/05(日) 01:27:41
>>677
せめて使ってるwindow managerの種類を書け
681デフォルトの名無しさん:2007/08/05(日) 10:24:57
682デフォルトの名無しさん:2007/08/05(日) 12:44:09
>>680
gnomeです。見たらKtermじゃなくてgnome端末とかいうやつですね。
xfceに移ったらKtermだと思います。どちらでもイケます。
お願いです、教えてください。
いくつか挙げてもらえればすべて試します。
683デフォルトの名無しさん:2007/08/05(日) 13:50:08
GNOME はウィンドウマネージャではない
metacity のつもりなのかな
684デフォルトの名無しさん:2007/08/05(日) 13:59:39
$ setwm
Usage:
setwm <option>
option:
status
gnome
xfce

$ setwm status
Current Window Mangager is gnome-session

だそうです。
685デフォルトの名無しさん:2007/08/05(日) 14:07:13
板違い
686デフォルトの名無しさん:2007/08/05(日) 14:07:28
何だこの痛い奴は・・・
687デフォルトの名無しさん:2007/08/05(日) 15:03:59
「自殺」、半数が偏見
http://www.sankei.co.jp/seikatsu/kenko/070804/knk070804000.htm

「自殺は突然」など自殺者の心理、半数が誤解
http://www.yomiuri.co.jp/politics/news/20070804it11.htm
688デフォルトの名無しさん:2007/08/06(月) 06:54:21
つーか、ふつーMx-shellつかわね?
689デフォルトの名無しさん:2007/08/06(月) 10:19:57
>>665-666
こらー、なにがしのほうにもお礼入れとけ
しかもあっちのほうが質問時刻先じゃねーか
690デフォルトの名無しさん:2007/08/06(月) 11:14:37
質問。

ファイルシステムごとに「ファイル名に絶対使えない文字」ってありますよね。

「ファイルシステムを検知して、ファイル名として使えない文字が含まれていたら規定の文字で適当に置換する」
ような便利メソッドってありませんか?

ダウンローダーの部分を作ってるんですが、 File.open( File.basename(URI.path), 'w') と書いた時点でちょっと困りました。
たとえば URL に ? が含まれてたりする場合、Windows で実行したら open 時に Errno::EINVAL が出ます。
…パターン全部調べて gsub で事前に置換すればいいんですが、これ困ってる人いるだろうし既存のメソッドでもないかなーと。
691デフォルトの名無しさん:2007/08/06(月) 12:17:27
timemillisecondで名前書き換えてる漏れは勝ち組
692デフォルトの名無しさん:2007/08/06(月) 14:01:03
>>690
たとえば、
* Linuxではext2じゃ/以外なんでも使えるけどvfatやntfsではWindows同様な制限があるとか
* ネットワークファイルシステムではローカルシステムとは無関係にリモートでの制限があるとか
* Windowsだと通常は\は使えないけどmultibyteの2byte目以降には使えるとか
いろいろとややこしい事情が絡んでくる。

ダウンローダーなら tr("^A-Za-z0-9-_.", "_") でもしとけ。
693デフォルトの名無しさん:2007/08/06(月) 14:15:03
wgetのソースとか参考になりそうな気がする
俺は読む気ないけど
694デフォルトの名無しさん:2007/08/06(月) 20:04:40
Rubyスクリプトに引数を与えると、ARGVに適度に配列として格納されます。

任意のStringに対して、同じような処理をさせることはできません?
メソッドの引数をコマンドライン風に指定したいんですが。
そんな変なことするなとか苦労して正規表現書けという指摘はごもっともですが。

def method('-a 'AAA' -b -c --long "1 2 3 4" -e')
#=> ['-a', 'AAA', '-b', '-c', '--long', '1 2 3 4', '-e']

こんな感じ。スペースを含んだ "1 2 3 4" のあたりで正規表現書くの眠くなりました。
695デフォルトの名無しさん:2007/08/06(月) 20:46:50
>>694
http://www.ruby-lang.org/ja/man/?cmd=view;name=shellwords

$ irb -rshellwords
>> Shellwords.shellwords('-a "AAA" -b -c --long "1 2 3 4" -e')
=> ["-a", "AAA", "-b", "-c", "--long", "1 2 3 4", "-e"]
696デフォルトの名無しさん:2007/08/06(月) 21:01:50
>>695
キャーすごい愛してる
697デフォルトの名無しさん:2007/08/06(月) 23:45:47
すみません、ファイルを作らずにメモリだけで、データベースみたいに、インデックスを
複数設定できる手軽な方法って有りますでしょうか?

基本的には、受注・受注明細・商品マスタに正規化された各csvを読み込んで、
一つの正規化されてない受注データ.csvに合成して出力する必要があるのですが、
欲が出て別のことをしたくなると、読み込んだ受注データ等の項目に複数のインデックスを
かけたいと思います。

しかしcsv読んでcsv出力するだけの事で中間でデータベースファイルを生成するのも
大げさな感じがするし、かといって毎回ソートや全件検索するのも無駄な感じがします。
なにか簡単な方法は有りませんでしょうか?もしくは食わず嫌いやめてMySQLとか
導入して勉強した方が早道なんでしょうか?

rubyはwin32版のVer1.8.5を入れてます。
習熟度は上記csvの為に久しぶりに初心者本を最初から再読してる所です。
よろしくお願いします。
698デフォルトの名無しさん:2007/08/06(月) 23:54:09
>>697
テンポラリファイルとかは駄目なの?
699デフォルトの名無しさん:2007/08/07(火) 00:17:52
オンメモリに乗り切るならHashでいいじゃん
700デフォルトの名無しさん:2007/08/07(火) 00:18:04
>>697
sqlite の in memory database とかはどうよ。
701デフォルトの名無しさん:2007/08/07(火) 00:20:55
http://www.amazon.co.jp/Programming-Ruby-Pragmatic-Programmers-Guide/dp/0201710897
この本ってどうですか?
一応、"たのしいRuby"をベースに勉強しています。
それと
http://www.oreilly.co.jp/books/9784873113241/
と、"たのしいRuby"と対の青い逆引き本ってどうですか?


あとデスクトップリファレンスって絶版でなってるけど売ってる店知りませんか?
京都で。
702デフォルトの名無しさん:2007/08/07(火) 00:31:43
URLどころか名前すら出ない256レシピブックカワイソス

ウサギ本の原書読めるなら日本の本無理して買わんでもいいだろ
703デフォルトの名無しさん:2007/08/07(火) 01:01:22
うさぎ本っていうんですか?これ。
256レシピブックちょっと読んだけど結構タメになることが書いてあったようで迷っています。
うさぎ本の内容はすごいですか?
704デフォルトの名無しさん:2007/08/07(火) 01:43:02
サーバからファイル持ってくる際、301リダイレクトに対応しようとして

def main
begin
wget
rescue Net::ProtoRetriableError
@uri = URI.parse(@response['Location'])
retry
end
puts @response
end

def wget
@response = Net::HTTP.get_response(@uri)
raise Net::ProtoRetriableError if Net::HTTPRedirection === @response
end

のようなことをしてます。
よく見るとクラス変数がメソッド間の値の運搬役にしかなってなくて悲しいですがとりあえずそれはそれで。
301を検知してretryしたいんですが、上記のように明示的に例外起こさせるのは寂しいです。いい手ありませんか?
705デフォルトの名無しさん:2007/08/07(火) 03:01:15
>>695
こんなのはじめしたっぜ
706デフォルトの名無しさん:2007/08/07(火) 03:02:04
>>704
open-uriがリダイレクト対応してたから、それ見た方が早いかも
707デフォルトの名無しさん:2007/08/07(火) 03:52:38
>>706
がーん。
せっかくとりあえずnet/httpで動くのできたのに(w

open-uriは前から気になるし頑張って作り変えてみるー。
昔にnet/httpでできた何かができなくてそれで嫌な印象が残ってる。
708デフォルトの名無しさん:2007/08/07(火) 05:15:10
>>703
第1版の方でいいなら、Webにあるから見てみたら?
http://www.ruby-doc.org/docs/ProgrammingRuby/
709697:2007/08/07(火) 08:05:47
>>698-700
お返事ありがとうございました。
ひととおりあたってみます。
710デフォルトの名無しさん:2007/08/07(火) 12:08:45
読むだけでプログラムが書けるようになる本ありますか?
711デフォルトの名無しさん:2007/08/07(火) 12:49:09
Array で 「===」で 比較して引き算させることはできますか?
1.8からは比較に Object#eql? が使われて結果が変わってしまいます。

掲示板のデータとして2chのdatのようなものがあるとして、1レスがハッシュになっててそれがさらに配列になってるとします。
dat = [{'name'=>'名無しさん', 'date'=>'○月×日' 'res'=>'こんにちは'}, {'name'=>'名無しさん', 'date'=>'○月△日' 'res'=>'うっせーバカ'}, ...]

で、既存のデータと新着のデータの配列同士の差分をさくっととれたら超便利だと考えました。
新着レス = newdat - olddat
しかし、
 {'key'=>'value'} === {'key'=>'value'} #=> true
 {'key'=>'value'}.eql?({'key'=>'value'}) #=> false
の違いのせいで、1.8では「いわゆる引き算」ができなくなりました。

olddat.each{|e| newdat.delete(e)} で置き換えても計算量的に問題ないですか?
712デフォルトの名無しさん:2007/08/07(火) 13:11:06
- や & や % で計算できたからって効率いいとは限んないよね
eachで素直にブン回したほうがリソースに優しいということは結構あると思うぞ
713デフォルトの名無しさん:2007/08/07(火) 13:16:11
>>711
newdat[olddat.size, newdat.size - olddat.size]
ということではない?
714デフォルトの名無しさん:2007/08/07(火) 13:32:34
いわゆるあぼーんや投稿者削除があった直後の取得で整合性揉めそうだな
どれくらい必死…じゃない重要性のあるデータなのかにもよるか
715デフォルトの名無しさん:2007/08/07(火) 13:52:58
僕らは卒業までの期間が決まってるんです。
趣味でやってる暇な社会人とは使える時間が違うんです
716デフォルトの名無しさん:2007/08/07(火) 14:03:05
僕らはアニメ視聴やP2Pなんかで使える時間が限られてるんです。
趣味でやってる暇な社会人や学生とは違うんです。
717デフォルトの名無しさん:2007/08/07(火) 15:58:58
社会人は3日でやれとか言われることもあるぞ
大した内容でもないのに、卒業までなんて
長いこと待ってもらっていいねえ
718デフォルトの名無しさん:2007/08/07(火) 16:49:32
rubygemをインストールしたら

Successfully built RubyGem
Name: sources
Version: 0.0.1
File: sources-0.0.1.gem
hook /usr/local/rubygems-0.9.4/./post-install.rb failed:
uninitialized constant Gem::FilePermissionError
Try 'ruby setup.rb --help' for detailed usage.

こんな風になりました。このエラーはどういうことでしょうか?
719デフォルトの名無しさん:2007/08/07(火) 17:07:25
と、これはユーザ権限でやったからだと思って管理者になってやったら
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rdoc/rdoc (LoadError)
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from /usr/local/rubygems-0.9.4/./post-install.rb:103:in `install_rdoc'
from /usr/local/rubygems-0.9.4/./post-install.rb:118:in `run_hook'
from setup.rb:1526:in `exec_task_traverse'
from setup.rb:1342:in `exec_install'
from setup.rb:1000:in `exec_install'
from setup.rb:814:in `invoke'
from setup.rb:773:in `invoke'
from setup.rb:1578

こう言われたのでrdocをapt-getしてまたやったら
ttp://homepage.mac.com/kurusaki/iblog/C559147560/E20070722214148/index.html
ここにあるような実行結果が得られました。
最後のがよくわかりませんがとりあえず正常っぽいです。自己解決かな・・?
720デフォルトの名無しさん:2007/08/07(火) 17:25:24
ファイルをバイナリモードで開こうとしたら、BINARY定数が定義されていないようなのですが、何故でしょうか?
Gentoo Linux, Ruby 1.8.5

irb(main):001:0> p File::Constants::BINARY
NameError: uninitialized constant File::Constants::BINARY
721デフォルトの名無しさん:2007/08/07(火) 17:29:53
UNIXだからじゃねーの。
バイナリモードとテキストモードの区別があるのはWindowsぐらいだし。
722デフォルトの名無しさん:2007/08/07(火) 17:49:59
シンボリックリンクを作成する
例えば
ln -s ../test.txt

のようにrubyで行うにはどのようにすればよいのでしょうか?
リネームや削除の方法は解説されていたのですが、シンボリックリンクの
作り方は参考書に載ってませんでした。
723デフォルトの名無しさん:2007/08/07(火) 17:52:58
File.symlink
724デフォルトの名無しさん:2007/08/07(火) 17:54:32
つーかもうちょい検索活用しような…
725デフォルトの名無しさん:2007/08/07(火) 17:55:06
普通にマニュアル見るだけでいいかも
726デフォルトの名無しさん:2007/08/07(火) 17:55:09
>>723
ありがとうございましたm(,,)m
727デフォルトの名無しさん:2007/08/07(火) 17:56:01
>>721
なるほど、必要ないから定義してないってことですか・・・。
環境によって有ったり無かったりするのを意識しなくてはならないと、プログラム組むのが
面倒だと思うのですが、こうなってる事の利点って有るのでしょうか?
定数は常に定義しておいて、メソッド内で環境に応じて定数の指定を無視するって方法もあると思うのですが。
728デフォルトの名無しさん:2007/08/07(火) 18:25:13
>>727
Linux:
~$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
~$ ruby -e 'p File::Constants::BINARY'
-e:1: uninitialized constant File::Constants::BINARY (NameError)

Windows:
c:\俺>ruby -v
ruby 1.8.1 (2003-12-25) [i386-mswin32]
C:\俺>ruby -e 'p File::Constants::BINARY'
32768

ユーザーがこの定数を自力で設定することはまずない
729デフォルトの名無しさん:2007/08/07(火) 18:31:12
いや、uninitialized になるくらいなら 0 で定義しておけば?ってことかと
730デフォルトの名無しさん:2007/08/07(火) 18:43:26
defined? のようなもので分岐させてるのかな(Linuxはnilになる)
このへんの処理はRubyスクリプトで書いてるかどうか怪しいが
731727:2007/08/07(火) 19:02:22
>>728-730
open()等のメソッド内で実行環境の違いを吸収して欲しいと思ったのだけど、そうなってないのは何か利点があるんでしょうか?
ってことです。
無駄にFile::Constants::BINARYが存在しても別に害は無いと思いますし。
732デフォルトの名無しさん:2007/08/07(火) 19:11:28
"wb" を使うからなあ
733デフォルトの名無しさん:2007/08/07(火) 19:12:21
思いっきり自動で吸収してるじゃん
ユーザーが動作を切り替えることはないわけだし
(動作の違いを念頭に入れなければならないことはあるが)
何が気になるのかわからん
734デフォルトの名無しさん:2007/08/07(火) 19:14:47
エセWgetな感じのクラス作りました。中身はopen-uriなので、304や404だったらOpenURI::HTTPErrorを発生します。

def main(url)
begin
data = download_resource_from_server # 中身はopen-uri
rescue OpenURI::HTTPError => ex
puts "#{ex.message}: 取得不可なので終了します"
end
puts 'ファイルを保存します...'
end

Wget.main として単体で使うぶんにはいいんですが、他のクラスから使うときには
・そのクラスにHTTPErrorを知らせて欲しい
・Wgetの時点で「取得不可」と表示して欲しくない
です。

def otherapp_main
begin
file = Wget.main(url)
rescue OpenURI::HTTPError => ex
puts '404なのでフォロー処理開始します'
end
puts 'fileで色々やります'
end

で、「フォロー処理」をさせたいんですが、どうするのが素直ですか?
735デフォルトの名無しさん:2007/08/07(火) 20:58:52
>>734
download_resource_from_server(url)をもっと短くて呼びやすい
名前の公開メソッドにすればいいだけじゃぁ?
736デフォルトの名無しさん:2007/08/07(火) 21:14:32
>>734
rescue OpenURI::HTTPError => ex
if __FILE__ == $0 then
# 単体で利用する場合の動作
puts "#{ex.message}: 取得不可なので終了します"
else
# requireされたときの動作
raise ex
end
end

これでなんとかならんかね。
そのWgetをどうやって単体利用してるかにもよるんだろうけど。
737デフォルトの名無しさん:2007/08/07(火) 21:37:30
>>719
最後のって「◆ブラウザからhttp://localhost:3000にアクセスしてみる。」ってとこか?
738デフォルトの名無しさん:2007/08/07(火) 23:52:36
File.symlilnkの質問をした者です。

ファイルがすでに存在している場合はsymlinkを行わないという命令を
unlessを利用して作りました。リンク先にファイルが存在している場合は
正常に分岐するのすが、誤って存在しないファイルにリンクを張った場合、
条件分岐がなされない事を確認しました。

File.symlink("./tmp/test.log", "test.log") unless File.file?("test.log") ←「test.log」は存在していない

% ./test.rb  ←空リンクが作成される
% ./test.rb
./test.rb:23:in `symlink': File exists - ./tmp/test.log or test.log (Errno::EEXIST)
from ./test.rb:23  ←unlessが無視されている

対処法として
・ファイルが存在しない場合はリンクを作成しない
・空リンクでもunlessが正常に動作する方法を考える

という2パターンが今のところ考えられるのですが、どちらが初心者が学ぶのに楽ですか?
739デフォルトの名無しさん:2007/08/08(水) 00:02:59
EEXISTキャッチしたらあかんの?
740デフォルトの名無しさん:2007/08/08(水) 00:08:01
>>739
例外処理はこれから勉強しようと思っているのですが、
やはり例外処理を利用して対処するべきでしょうか?
741デフォルトの名無しさん:2007/08/08(水) 00:08:44
file? で存在確認をするのがまずい。
exist?とかsymlink?とかlstatとかstatについて調べるいい機会ではなかろうか。

742デフォルトの名無しさん:2007/08/08(水) 00:10:04
空リンクを作成しない方法は条件文に && を追記する事で回避できたのですが、
それだと条件が満たされずにリンクが成されてなかったという事が明示的に分からないですね…
743デフォルトの名無しさん:2007/08/08(水) 00:10:06
>>738
> ./test.rb:23:in `symlink': File exists - ./tmp/test.log or test.log (Errno::EEXIST)
> from ./test.rb:23  ←unlessが無視されている
23行目ってことは、かなり省略されてるんだよな。
その省略された部分はどうなってる?
744デフォルトの名無しさん:2007/08/08(水) 00:10:50
まあセキュアコーディング話なら、チェックした直後に
ファイルがすり替わる話になるが
745デフォルトの名無しさん:2007/08/08(水) 00:11:31
>>741
File.file?はlstatじゃなくてstatを使ってるはずなんだが。
746デフォルトの名無しさん:2007/08/08(水) 00:15:05
>>743
text.rb全文です。

#!/usr/bin/ruby
# ARGV[0] = CPUS

#puts "OK" unless File.file?("test.log")

var="appule"
#puts var+"juice"

name="Ruby"
var2 = `echo Hello #{name}`
#p var2

#echo Hello

#if ( File.file?("test.log") == "true" ) then
# puts OK
#end


filename="test.log"

#File.delete(filename) if File.file?("test.log")
File.symlink("./tmp/test.log", filename) unless File.file?("test.log")
747デフォルトの名無しさん:2007/08/08(水) 00:21:20
>>741
ありがとうございます。
調べてみますm(,,)m
748デフォルトの名無しさん:2007/08/08(水) 00:31:47
今ふと思ったのですが、ファイルが存在していないという「例外」が
発生しているのだからやはり例外処理で処理するのが順当ではないかなと思いました。
>>741さんのも含め例外処理の勉強します。
ありがとうございました。
749デフォルトの名無しさん:2007/08/08(水) 16:52:22
>>697
>すみません、ファイルを作らずにメモリだけで、データベースみたいに、インデックスを
>複数設定できる手軽な方法って有りますでしょうか?

ファイルは必要になるけど、SQLiteやMySQLを導入するのはちょっと面倒、というなら、
テキストファイルベースのデータベースというのはどうでしょう。

MOONGIFT: 凄いテキストデータベース「txtSQL」
http://www.moongift.jp/2007/07/txtsql/

Rubyからつかえるかどうかまったく知らないけど。
750デフォルトの名無しさん:2007/08/08(水) 17:16:51
本人食わず嫌いって言ってるし、普通にRDBMS使うと
やめられなくなると思うけどなあ

こういう用途ならSQLiteでいいし、って思ってtxtSQLを見てみたけど
これ全部phpで書いてあるじゃん。Cならモジュールにできるけどこれは。
751デフォルトの名無しさん:2007/08/08(水) 20:17:54
SQLite使うぐらいでちょっと面倒とかいうならプログラミングやめたほうがいい
752デフォルトの名無しさん:2007/08/09(木) 09:37:06
みようみまねでRubyのプログラムを書いてみました。基本的な事が分かってないと思いますが、アドバイスいただけるとうれしいです。

Ruby/Tkを使ってドラッグアンドドロップできるプログラムを3つの方法で実現しようと考えました。
1. TclTkインタプリタを使う。
2. 外部Tclファイルを読み込む。
3. tkextlib/tkdnd を使う。
環境は、WinXP, ruby1.8.5 (ActiveTcl8.4.15, TkDND1.0a2jp http://www.interq.or.jp/japan/s-imai/tcltk/download/tkdnd10a2jp.zip)です。

1.は、なんとかできました。
===== testdnd.rb =====
require 'tcltklib'
def dndt
ip1 = TclTkIp.new() # インタプリタ生成
ip1._eval('package require tkdnd')
ip1._eval('pack [text .t]')
ip1._eval('dnd bindtarget .t text/uri-list <Drop> {.t insert end "%D\n"}')
TclTkLib.mainloop
end
dnd
GC.start
======================
753752:2007/08/09(木) 09:37:53

2.は、undefined method `ff' for TkDnd:Class というエラーが出ます。
===== testdnd.rb =====
require 'tk'
class TkDnd < TkText
def ff
TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'testdnd.tcl')
begin
tk_call('::tkdnd::dnd')
rescue NameError, RuntimeError
Tk.load_tclscript(TkDnd::TCL_SCRIPT_PATH)
tk_call('::tkdnd::dnd')
end
end
end
if __FILE__ == $0
tr1 = TkDnd.new.pack(:expand=>true, :fill=>:both)
tr1.ff
Tk.mainloop
end
===== testdnd.tcl =====
package require tkdnd
namespace eval ::tkdnd {
proc ::tkdnd::dnd {} {
pack [text .t]
# Target側
dnd bindtarget .t text/uri-list <Drop> {
.t insert end "%D\n"
}
}
======================
754752:2007/08/09(木) 09:39:07
3.に至っては、http://www.ruby-doc.org/stdlib/libdoc/tk/rdoc/classes/Tk/TkDND/DND.html にあるメソッドの使い方が分かりません。
===== testdnd.rb =====
require "tk"
require "tkextlib/tkdnd"

class Dnd
include Tk::TkDND::DND
p Tk::TkDND::DND.version
end
a = Dnd.new
a.dnd_clearsource
Tk.mainloop
======================
よろしくお願いします。
755752:2007/08/09(木) 09:55:39
すみません、752の def dndt は、def dnd のまちがいです。
756デフォルトの名無しさん:2007/08/09(木) 13:02:26
>>753
> 2.は、undefined method `ff' for TkDnd:Class というエラーが出ます。
それ以前に、
> def ff
> TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'testdnd.tcl')
ここで dynamic constant assignment でsyntax errorになるはずなんだが。
まずは正しいソースをはれ。
757752:2007/08/09(木) 16:05:48
>756 レスありがとうございます。確かに別のソースを貼り付けてました。失礼しました。
2.は以下のソースになります。testdnd.tcl は、753の通りです。よろしくお願いします。

>756 レスありがとうございます。確かに別のソースを貼り付けてました。失礼しました。2.は以下のソースになります。testdnd.tcl は、753の通りです。よろしくお願いします。

require 'tk'

class TkDnd < TkText
TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'mydnd.tcl')
def ff
begin
tk_call('::tkdnd::dnd')
rescue NameError, RuntimeError
Tk.load_tclscript(TkDnd::TCL_SCRIPT_PATH)
tk_call('::tkdnd::dnd')
end
end
end
if __FILE__ == $0
TkDnd.new.pack(:expand=>true, :fill=>:both)
ff
Tk.mainloop
end
758752:2007/08/09(木) 16:10:52
エラーメッセージも間違えてました。
mydnd.rb:16: undefined local variable or method `ff' for main:Object (NameError)
となります。失礼しました。
759デフォルトの名無しさん:2007/08/09(木) 16:52:46
インデントがないと読みにくいな。

こうかな?
TkDnd.new.pack(:expand=>true, :fill=>:both).ff
760デフォルトの名無しさん:2007/08/09(木) 17:41:00
今現在PHPを勉強しています、平行してRubyを勉強するよりPHPを完璧にしたほうが良いでしょうか?
761デフォルトの名無しさん:2007/08/09(木) 17:49:18
>>760
そんなもんおまいの職種によりますがな
趣味だったら言語の勉強自体が目的なんて、全く意味ない
762760:2007/08/09(木) 17:59:16
すいません、現在JAVAでシステム開発のPGをしています。
763デフォルトの名無しさん:2007/08/09(木) 18:03:25
PHPとかRubyを何に使うつもりなんだこの人?
764デフォルトの名無しさん:2007/08/09(木) 18:36:50
>>760
両方完璧にしなさい。
そうすりゃ文句はでない。
765デフォルトの名無しさん:2007/08/09(木) 18:37:55
結局、趣味って事か?
Cやったこと無いんじゃどんな感想になるかわからんが、
phpやりかけでrubyやったらphpは使わなくなる気がするな。
766デフォルトの名無しさん:2007/08/09(木) 19:18:20
仕事で使います、あと4ヶ月くらいはPHPですが冬あたりからRubyも使うかもしれないとのことです。
767デフォルトの名無しさん:2007/08/09(木) 20:01:45
純粋にRubyで一般の仕事のプロダクトを作る理由って今もまだないよな
せいぜいベンチャーや小中規模Web屋さんがRoRを使うくらいか

意思決定までのどっかで誰かの趣味が入ってると思われる
768デフォルトの名無しさん:2007/08/09(木) 20:16:02
初犯なんじゃね
769デフォルトの名無しさん:2007/08/09(木) 23:29:02
Rubyは好きで使う言語であって、使えと言われて使うもんじゃない。
というわけでやめとけ。
770デフォルトの名無しさん:2007/08/09(木) 23:31:05
いや、なんか>>766が少しうらやましいかも。
PHPやってからRubyも仕事で(勉強)出来るんなら結構な職場じゃないかと思った。
771デフォルトの名無しさん:2007/08/10(金) 00:41:29
Linux上でMakefileの中にシェルスクリプトやawk/sed書いちゃうと
Windows上でのコンパイル時に互換性で大変困る。

一番無難なのがRubyだと思う。配慮は必要だけど。
772デフォルトの名無しさん:2007/08/10(金) 01:06:21
>>771
PerlとかPythonでもいいんじゃないかとかいやすみません。
773デフォルトの名無しさん:2007/08/10(金) 01:36:04
Win32コンソールでもシフトJISの扱いでRubyが無難という感想。
セットアップ不要でアーカイブの解凍だけで動くし。
774デフォルトの名無しさん:2007/08/10(金) 01:54:35
rakeは便利だよyy
775デフォルトの名無しさん:2007/08/10(金) 09:34:26
Ruby使うとPerlは見るのもいやになるという欠点が、、、いやオレだけか
776デフォルトの名無しさん:2007/08/10(金) 10:04:40
いや、わりと一般的な感覚と思われ

初心者や中級者くらいのフツーのプログラム書きにとっては、
普通に自習した程度でPerlやPHPの読み書きするよりはRubyやPythonのほうがきれいで好ましいと感じるはず

「いやPerlでも充分書きやすくできるしわかりやすく書けるよ」というひとは残念ながら少数派だろ
プロダクト作れるに足るからPerlやPHPはもてはやされてるし、ツール作るのに便利だからRubyやPythonは廃れない
777デフォルトの名無しさん:2007/08/10(金) 11:24:58
Winじゃどうせawkとsed使おうがPerlPythonRuby使おうが
全部デフォじゃ入ってないんだから
Linux上で大体入ってる言語で書いた方がいいだろ
Winのことまで考えるなら
色んなサイトに乱立し過ぎてどれ落とせば良いか判らんawkやsedより
とりあえずActiveState池と言えば良いPerl辺りじゃね?
どうも好きになれない言語だが



そうだ、Tclで書こうか
778デフォルトの名無しさん:2007/08/10(金) 18:35:13
ピッケル本にDir.foreachはnilクラスを返すと書いてあるのですが
Stringクラスを返しているような気がします。どういうことでしょう。

あと、File.statですが、これは説明にFileの情報を返すとかいう風に書いてるのに
ディレクトリを指定しても問題ないです。
例えば/usr/localなど、例えば
File.stat('/usr/local').ftype => "directory"
となります。DirはFileを継承してないはずだし、なぜディレクトリの場合もstatすることが可能なのでしょうか?
779デフォルトの名無しさん:2007/08/10(金) 19:52:50
>>778
>ピッケル本にDir.foreachはnilクラスを返すと書いてあるのですが
>Stringクラスを返しているような気がします。どういうことでしょう。

クラスは返してないだろ、根本的に。
で、nilを返すと書いてあるはずなのだが、実際にnilを返している。
何をどう見てそう考えたんだ?

>あと、File.statですが、これは説明にFileの情報を返すとかいう風に書いてるのに

「ファイルの情報を返す」と「File*クラス*の情報を返す」じゃ全然意味が違うわけだが。
ここでは前者。
で、ディレクトリはファイルの一種なので、当然のようにディレクトリに対してもstatできる。
780デフォルトの名無しさん:2007/08/10(金) 20:31:52
>>778
Dir.foreach('.') {}.class
=> NilClass
781デフォルトの名無しさん:2007/08/10(金) 20:49:47
>>778
> Stringクラスを返しているような気がします
返り値と標準出力への出力をごっちゃにしないこと。

C:\Documents and Settings\hoge>irb
irb(main):001:0> Dir.foreach('.'){|e| puts e}
.
..
[snip]
デスクトップ
=> nil

irb(main):002:0> $stdout.write("hello\n")
hello
=> 6
782デフォルトの名無しさん:2007/08/10(金) 20:53:45
もしくはこれで文字列が返るって言ってたりして
Dir.foreach('.'){break '文字列'} #=> '文字列'
783デフォルトの名無しさん:2007/08/10(金) 21:35:21
puts して確かめている可能性を指摘
784デフォルトの名無しさん:2007/08/10(金) 21:47:15
そうですよ、pでやったら"lib"とか出ますし
Dir.foreach('/usr/local') do |d|
p d.class
end
とするとStringってでますし。
785デフォルトの名無しさん:2007/08/10(金) 22:02:38
>>784
それのどこがDir.foreachの返してる値なのか説明してもらおうか。
786デフォルトの名無しさん:2007/08/10(金) 22:39:04
Dir.foreachがブロックに渡しているので。
787デフォルトの名無しさん:2007/08/10(金) 22:40:20
2点
退屈

もっとがんばれ
788デフォルトの名無しさん:2007/08/10(金) 22:44:27
なんのこと?
789デフォルトの名無しさん:2007/08/10(金) 22:52:24
>>784
そのdは返り値じゃない
ブロックパラメータだ
790デフォルトの名無しさん:2007/08/10(金) 23:06:52
ではDirのインスタントメソッドeachの返り値がdirと書かれていますがどうしてですか?
dir = Dir.new('/usr/local')
dir.each do |d|
p d.class
end
=>String String...
791デフォルトの名無しさん:2007/08/11(土) 00:24:02
Ruby作者 「本物の「Rubyバブル」が来ていることを実感する。」
http://news23.2ch.net/test/read.cgi/news/1186758557/

Ruby初心者スレッド Part 13
http://pc11.2ch.net/test/read.cgi/tech/1183115034/

Rubyについて Part 27
http://pc11.2ch.net/test/read.cgi/tech/1180031347/

Ruby終了のお知らせ。
http://pc11.2ch.net/test/read.cgi/php/1181668153/
792デフォルトの名無しさん:2007/08/11(土) 00:26:16
>>790
irb> ins = Dir.new('/usr/local')
=> #<Dir:0x402ee3e4>
irb> ret = ins.each do |d| p d.class end
String
String
String
String
String
String
String
String
String
String
=> #<Dir:0x402ee3e4>
irb> p ret
#<Dir:0x402ee3e4>
=> nil
irb> p ins === ret
true
=> nil
irb>

Dir クラスのインスタンスメソッド each はマニュアルにある通り self を返す
そして self つまり Dir クラスのインスタンスと全く同一のオブジェクトが返って来ている
何か問題が?
793デフォルトの名無しさん:2007/08/11(土) 00:39:45
あーそもそもはクラスメソッド foreach の話だったのね

irb(main):005:0> Dir.foreach('/usr/local'){|file| p file.class}
String
String
String
String
String
String
String
String
String
String
=> nil
irb(main):006:0> ins.each do |d| p d.class end
=> #<Dir:0x402ee3e4>

というわけで foreach の場合は nil 以外のなにものでもない値が返ってきてるんだが何か不満かい
返り値はメソッド作者の意図で return の引数あるいはメソッド内で一番最後に評価された値が返される
メソッド利用者が決められるものではない
ブロック内で何をしようが、メソッド作者の意図したものが返り値として選ばれる
たまーに自分の行ったことが返り値として返ってくることがあるが、それはメソッド作者がそのようにわざわざ作ったからに過ぎない

ピッケル本あたりは既に他のプログラミング言語修めてるような人向けの本だからそういうことについての説明はあまりないな
794752:2007/08/11(土) 01:25:26
>759
ありがとうございます。ただ、
TkDnd.new.pack(:expand=>true, :fill=>:both).ff
だと、
c:/ruby185/lib/ruby/1.8/tk.rb:2272:in `__invoke': missing close-brace (RuntimeError)
from c:/ruby185/lib/ruby/1.8/tk.rb:2272:in `_invoke'
from c:/ruby185/lib/ruby/1.8/tk.rb:1696:in `_ip_invoke_core'
from c:/ruby185/lib/ruby/1.8/tk.rb:1730:in `_tk_call_core'
from c:/ruby185/lib/ruby/1.8/tk.rb:1754:in `tk_call'
from c:/ruby185/lib/ruby/1.8/tk.rb:1925:in `load_tclscript'
from mydnd.rb:10:in `ff'
from mydnd.rb:17
というエラーが出ます。
よろしくお願いします。
795デフォルトの名無しさん:2007/08/11(土) 01:37:19
>>759 じゃないけど、閉じカーリーブレース( } )が足り無いとかじゃない?
実行時エラーならevalあたりが怪しいけど。
796デフォルトの名無しさん:2007/08/11(土) 02:59:38
(

↑これってなんていうんだっけ?
797デフォルトの名無しさん:2007/08/11(土) 03:08:12
空行
798デフォルトの名無しさん:2007/08/11(土) 03:19:06
おもいだしたパーレンだ
799自分用メモ:2007/08/11(土) 03:20:16
( パーレン
{ カーリー
[ スクエア
< アングル
800デフォルトの名無しさん:2007/08/11(土) 03:21:22
<
って書きたいけどやり方がわからなかったんだな・・・
801自分用メモ:2007/08/11(土) 03:38:24
<
できるよF10押すだけ
802デフォルトの名無しさん:2007/08/11(土) 03:43:40
>>798-799
何の用語?
803自分用メモ:2007/08/11(土) 04:05:22
>>802
日本語で言うところの
丸カッコとか
中カッコとかの
英語風の言い方。
804自分用メモ:2007/08/11(土) 04:06:34
>>800
半角の出し方わからないって
バカなんじゃない?

自分がバカだからって
他人もバカだとおもわないほうがいいよ

お前の名前と住所をちょっと
ここに書いてみな?
805デフォルトの名無しさん:2007/08/11(土) 06:35:16
実際に出してる人間に「出し方わからないって」とは摩訶不思議。
知的障害なのでは。
806デフォルトの名無しさん:2007/08/11(土) 10:24:19
ブラ と ケット だと思ってたんだが。
807デフォルトの名無しさん:2007/08/11(土) 10:53:42
ディラック乙
808デフォルトの名無しさん:2007/08/11(土) 11:08:21

<|> プロダクト


● ●
. |><| プロジェクション
人 人
809デフォルトの名無しさん:2007/08/11(土) 11:09:18
ブラとケットは <ψ|と|ψ>だったかな。

810デフォルトの名無しさん:2007/08/11(土) 11:09:57
世の中みんな波だらけ
あなたとわたしのシュレディンガー
811デフォルトの名無しさん:2007/08/11(土) 11:32:44
私が見ている時だけあなたは存在する。
812デフォルトの名無しさん:2007/08/11(土) 12:00:03
私を見てくれる人がいないので、自分で鏡見てます。
813デフォルトの名無しさん:2007/08/11(土) 12:07:41
そしたらヲタがいましたorz
814デフォルトの名無しさん:2007/08/11(土) 12:34:07
こっちは豚がいます
飛べないただの豚が
815デフォルトの名無しさん:2007/08/11(土) 16:18:06
真珠よりもルビーだブヒー!!と今日も鳴くのであった
816デフォルトの名無しさん:2007/08/11(土) 16:38:35
音頭大人気だな
817デフォルトの名無しさん:2007/08/11(土) 20:20:52
「{」はカーリーっていうのか。
ブレースって読んでた。
818デフォルトの名無しさん:2007/08/11(土) 20:25:35
英語だとcurly braceだけど、日本語では中カッコかおっぱいカッコだな
819デフォルトの名無しさん:2007/08/11(土) 22:02:53
おっぱい括弧って・・・乳首しかないやん
820デフォルトの名無しさん:2007/08/11(土) 22:06:20
な、なんてことを・・・。洗濯板とかそこまで言うかw
821デフォルトの名無しさん:2007/08/11(土) 22:25:45
選択板はこれだろ →"|"
822デフォルトの名無しさん:2007/08/11(土) 22:28:52
(
陥没ちk・・・・
823デフォルトの名無しさん:2007/08/12(日) 00:01:33
jpegを読み込んでサイズを変更してから、
また保存ってことをやりたいんだけど、
サンプルコードとか無いでしょうか?

jpegの読み込み&書き出しというところからわからない。。。
824デフォルトの名無しさん:2007/08/12(日) 00:19:12
>>823
RMagick使えそうじゃない?調べてみては
825デフォルトの名無しさん:2007/08/12(日) 00:20:56
for i in *jpg; do
(サイズ変更処理)
done
826デフォルトの名無しさん:2007/08/12(日) 00:25:58
>>823
一般的には ImageMagick の仕事(magicではないので綴りに注意)
ttp://mechanics.civil.tohoku.ac.jp/soft/node43.html

Ruby では>>824の言う通り RMagick でいじることが多い
system() で直接シェル叩いてもいいけどな
827デフォルトの名無しさん:2007/08/12(日) 00:57:17
>825 は何の言語?
828デフォルトの名無しさん:2007/08/12(日) 01:13:22
shスクリプト互換に見える
829デフォルトの名無しさん:2007/08/12(日) 01:26:27
830デフォルトの名無しさん:2007/08/12(日) 01:27:08
ヤフーなどのサイトから株価データを取り込んで
データベースに貯めておき、
自分なりのテクニカル理論でデータ分析をして
売買サインを出させる、というような趣味システムを
作りたいと夢見ているのですが、機能的にRubyでできますかね?
COBOLしか知らないので不安があります。
831デフォルトの名無しさん:2007/08/12(日) 01:44:32
君はCOBOLで何を学んだんだ…

当たり前だがRubyだから何かあるわけではない
テキスト処理が得意な言語なら前者は問題ないし
数値計算処理が得意な言語なら後者も問題ないだろう
832デフォルトの名無しさん:2007/08/12(日) 01:47:18
2つのArray a, bがあってaの要素のうちbに同じ要素があるものだけを残すにはどうすればいい?
833デフォルトの名無しさん:2007/08/12(日) 01:51:05
>>831
いや、要はWEBアクセスとデータベース連携が
このシステムのキモなわけですが、これが
私の知る限りPC上のフリーCOBOLではできませんので、
Rubyではできるのかな、と。
834デフォルトの名無しさん:2007/08/12(日) 01:54:09
>>832

a & b かね?
835デフォルトの名無しさん:2007/08/12(日) 02:08:14
>833
Rubyでできるかっつったらできる
多分、楽に出来るとまで言っても嘘ではないと思う
836デフォルトの名無しさん:2007/08/12(日) 02:25:16
>>833
Rubyだと、楽に、早くできる。

が、株なら、脂肪。
Ruby遅いから、全銘柄スクリーニングとかやってみろ、1時間でも終わらんぞ
837デフォルトの名無しさん:2007/08/12(日) 02:42:18
遅いところはCで書き直せばいい
838デフォルトの名無しさん:2007/08/12(日) 11:20:03
> 性能はともかく純粋の言語設計の善し悪しで見ると
> C#はRubyの足下にも及ばないと思う

だからそういうことは自分で言っちゃダメだって。
却って格下に見られる。
839デフォルトの名無しさん:2007/08/12(日) 12:16:10
JAVAでええんとちがう?
840デフォルトの名無しさん:2007/08/12(日) 15:03:22
Javaめんどい
841デフォルトの名無しさん:2007/08/12(日) 16:55:33
Javaってコード汚くなるから嫌い
842デフォルトの名無しさん:2007/08/12(日) 17:03:20
コード汚くなるのは言語のせいではないだろ
843デフォルトの名無しさん:2007/08/12(日) 17:09:34
言語のせいにしないと、>>841のせいになっちゃうじゃないか
844デフォルトの名無しさん:2007/08/12(日) 17:13:19
むやみにでかくなることは多い…というか冗長に書くことで保守性高めるのが目的のひとつだからな

汚くなるかどうかは書くのに関わった人次第だ
845デフォルトの名無しさん:2007/08/13(月) 01:21:55
コードが汚くなるというか別にこんなことまでいちいち書かなくてもいいじゃん、
て感じのお役所書類っぽいところがどうもいや。

でも保守性を考えるとその方がいいのかもなとはちょっと思うけど、
思ったのはちょっとだけなのでよくわからない。
846デフォルトの名無しさん:2007/08/13(月) 02:10:05
import *;

とか書けば綺麗になる
847デフォルトの名無しさん:2007/08/13(月) 07:52:30
1ステップいくらだからでかくてよいのです
848デフォルトの名無しさん:2007/08/13(月) 10:39:29
スクリプト外からデータを参照する必要がない場合、
1MB未満のテキスト形式(タブ区切りとか、あるいは元のHTMLやxml、独自パース解析が必要な生テキスト)でファイルに保存するのと比べて
pstoreが処理速度や効率上不利になる場面ってそうはないよね?
あんま深く考えずにpstoreで配列やハッシュを保存しちゃってOK?
849デフォルトの名無しさん:2007/08/13(月) 19:02:54
cgi.params['hoge'] で「必須でないhogeがfooに設定されてるとき○○する」をどう書いていいんだかいまだに覚えられない
いきなり if cgi.params['hoge']==foo then だけだと確かnilだかなんだかでどっか何かエラー出るんだよな、とか
850デフォルトの名無しさん:2007/08/13(月) 20:52:16
if t=cgi.params['hoge'] || t==foo then
851デフォルトの名無しさん:2007/08/13(月) 20:54:01
ごめんオアじゃねえアンドだわ
852デフォルトの名無しさん:2007/08/13(月) 21:45:48
フィールド名が固定なら(ふつう固定だよな) cgi['hoge'] == 'foo' みたいな書き方の連打でよい
パラメータに &hoge=ナントカ と hoge が指定されてなかった場合は空文字列(1.6では空配列)を返すから例外は発生しえない
CGI.new した時点で配列が入ってると考えるんだ考えるんだ考えるんだ(エコー)

「ハッシュで返します」とか無邪気な説明になってる cgi.params の誘惑に負けてはいけない
あれはどんなフィールド名が来るかわからないときにのみ使用すべし
853デフォルトの名無しさん:2007/08/13(月) 21:46:22
配列が入ってるんじゃなくハッシュな
854デフォルトの名無しさん:2007/08/13(月) 21:46:33
cgi.paramsって、配列返さなかった?
855デフォルトの名無しさん:2007/08/13(月) 21:47:44
cgi.params[HOGE]が返すのが配列って意味だた
856デフォルトの名無しさん:2007/08/13(月) 21:57:38
cgi.params['hoge'] は全世界的に地雷
857デフォルトの名無しさん:2007/08/13(月) 22:35:23
CGI.params[key]から返ってくるアレは[]演算子が特異メソッドとして
定義された文字列……
858デフォルトの名無しさん:2007/08/13(月) 22:48:49
そうなん?
p cgi.params['hoge'].class

Array
って表示されるけど…
859デフォルトの名無しさん:2007/08/13(月) 22:56:10
>>858
あれ。

cgi.rbの str.extend(Value) のあたりを見ると文字列の[]を再定義している
よーに見えるんだけど。

なんか見間違いだろうか。
860デフォルトの名無しさん:2007/08/13(月) 23:38:29
cgi.rbの[]メソッドは、バージョンによって
かなり大きく動作が違っているので
あまり頼らないほうがいい
CGI#paramsかcgi adjusterがオススメ
861デフォルトの名無しさん:2007/08/13(月) 23:41:48
lib\ruby\1.8\cgi.rb
960: attr("params")
1112: @params = CGI::parse(
895: def CGI::parse(query)
896: params = Hash.new([].freeze)
だから、やっぱし、arrayでいいんでないの。

>>859
str.externd(Value)が示すのは、
cgi['a']とやったときの動作でないの?
862デフォルトの名無しさん:2007/08/14(火) 07:09:57
cgi.rbは早く捨てろ
pythonあたりからそれっぽいライブラリ拾ってきて入れよう
863デフォルトの名無しさん:2007/08/14(火) 09:58:56
過渡期の産物であることは作った本人もわかってるくらいなんで
次の標準が定着するまでcgi.rbに頼らないお手軽CGIスクリプト作りを考えようぜ
864デフォルトの名無しさん:2007/08/14(火) 11:17:55
EmacsでRubyスクリプト書いてる人はいますか?

よく考えたらruby-modeは色をつける機能ぶんしか使ってないことに気づいたんですが、
なにやらスクリプト作成で便利な機能とかもしあったら教えてくれると鼻血が出ます
865デフォルトの名無しさん:2007/08/14(火) 11:21:02
え?
Vine標準のruby-modeであれば、インデントとかもしてくれるよ。
tabおせば正しい位置に入ってくれる。
便利ー。
866デフォルトの名無しさん:2007/08/14(火) 15:37:16
{for,back}ward-sexpの動作が微妙なんだよな。
867デフォルトの名無しさん:2007/08/14(火) 16:21:18
将来的にはripper使ったりするようになるのかな。
868デフォルトの名無しさん:2007/08/14(火) 16:23:27
「サイトにユーザー名とパスワードをPOSTで送ってログインしクッキーを受け取る」
「そのクッキーを送ってサイト内のコンテンツをGETでダウンロードする」

というスクリプトを作りたいです
クライアントとしてセッションクッキーの一時保管と利用を簡単に扱う方法はありますか?
869デフォルトの名無しさん:2007/08/14(火) 19:43:20
>>864
着色とインデントは普通に使ってるはず
なにか便利なメソッド補完機能とか無いのかね、これ
870デフォルトの名無しさん:2007/08/14(火) 20:15:24
自分で作れば?
lisp書ければいけるよね。
871デフォルトの名無しさん:2007/08/14(火) 20:41:00
補完機能はない。
動的な言語だと、他の言語でもないだろうね。
872デフォルトの名無しさん:2007/08/14(火) 21:02:51
>>848
処理速度や効率には、大きな差はないと思うが
rubyのバージョンが変わると読めないことがあるという致命的な弱点が

>>862
Pythonって何か便利そうなライブラリあるのか?
873デフォルトの名無しさん:2007/08/14(火) 21:18:16
その1。
一応 dabbrev があるが、ruby 書きモードに特化して便利な機能ではないね…。
M-/ を押すと、「カーソルのとこにある語に似た語」を、Emacsに読み込んである全バッファから探して挿入する。

たとえば、どっかのバッファに expand_path と書いてあったなら、 ex まで書いてから Alt 押しつつ / を押すと

expand_path

と展開される。自作のよくわからん超長い名前のメソッドや変数もこれで平気。
ただ、日本語分かち書きの関係で、単語の前には空白とか書く癖はつけておいたほうがいい。

その2。
Emacs に詳しい人は見当ついただろうけど普通の abbrev。
「PStore.new().transaction do」を「dbopen と書いてからC-x 'で展開」させるためには、
dbopen と書いて C-x a i l したあと、ミニバッファに PStore.new().transaction do と書いて Enter する。
874デフォルトの名無しさん:2007/08/14(火) 22:02:46
>>869
キャッシュしてくれてタブ打つと切り替えてくれるのは使ってる
875デフォルトの名無しさん:2007/08/14(火) 22:23:20
>>862
最近は webrick/cgi 使ってる。
876デフォルトの名無しさん:2007/08/14(火) 22:50:27
ls.rb 内で、以下のことをしているとします。

for i in 0..10
system("cd " + i + "; ls")
end

1回目のls が終わった頃にCtrl-Cをして、停止してもそのまま10回続けようとする
のですが、Ctrl-Cをキャッチして、スクリプト自体を停止させる方法はありませんか?
877デフォルトの名無しさん:2007/08/14(火) 22:52:42
>>868
こういうようなのが標準であるといいなとかそんな感じ?

#!/usr/bin/ruby -Ke
require 'kconv'
require 'net/http'
Net::HTTP.version_1_2
require 'uri'

@uri = URI.parse('http://www.tohoho-web.com/cgi/wwwcook.cgi')

def savecookie(response)
@cookie_jar = response.get_fields('Set-Cookie')
end
def loadcookie
@cookie_jar.map{|e| e.split(/;/)[0]}.join(';')
end

Net::HTTP.start(@uri.host, @uri.port){|http|
# 初回アクセスでカウンタの訪問回数は普通に 1
response = http.get(@uri.path)
savecookie(response)
puts response.body.toeuc
# クッキーがあるのでカウンタが訪問回数 2 になるはず
response = http.get(@uri.path,{'Cookie' => loadcookie})
puts response.body.toeuc
}

878デフォルトの名無しさん:2007/08/15(水) 00:39:23
ニコニコ動画のアカウント持ってる人に質問です

require 'net/http'
mail = 'MAIL ADDRESS'
password = 'PASSWORD'

Net::HTTP.start('www.nicovideo.jp',80){|http|
puts http.post('/login',"mail=#{mail}&password=#{password}").body
}

これでログインってできてますか?
879デフォルトの名無しさん:2007/08/15(水) 00:43:31
できたよー
って言ったら信用すんの?
880デフォルトの名無しさん:2007/08/15(水) 00:57:40
それは>>878が決めることだろうな
881デフォルトの名無しさん:2007/08/15(水) 01:34:56
ログインできているかどうかは、どうやって判断すればよいの?
882デフォルトの名無しさん:2007/08/15(水) 05:35:34
表示されたHTML直接読むんじゃね(w
ログインエラーで200以外を返すサイトってあんま見たことないぞ
883デフォルトの名無しさん:2007/08/15(水) 08:07:40
>>878=>>881
Cookiesもちゃんと処理してやれよ
884デフォルトの名無しさん:2007/08/15(水) 10:23:46
それはこの処理フェーズの仕事ではないような気がする
putsのとこで本来responseごとどっかに返すloginメソッドのようなもんなのかもしれないし

login
@cookie = login['Set-Cookie']
@html = login.body

こんな感じ

てか、このあとサーバから何をどんだけ持ってくるかにもよるけど、
ログイン後のKeep-aliveが効いてる間に済ませられる程度なら、別にログイン情報のクッキーの取得と保管は必須ではなくね?

>>878は>878のコードのどこが不安で聞いてるのかはっきりさせたほうがよいかと
ニコ動のログインでPOSTするデータがこれで十分かどうか確かめたいのかな?
885878:2007/08/15(水) 11:00:16
>>884
> ニコ動のログインでPOSTするデータがこれで十分かどうか確かめたい
そうですそうです

PerlのLWPでもmailとpasswordをPOSTしてるだけだし
ttp://blog.livedoor.jp/dankogai/archives/50885358.html
RubyGemsのMechanizeでもmailとpasswordをsubmitしてるだけに見えます
ttp://d.hatena.ne.jp/nkoz/20070609/1181372641

>>878のnet/httpでもmailとpasswordをPOSTしてるだけの気になってるんだけど
もしかしてこれnet/httpで書いてるのは何か他のと違って間違ってるのかなー、と…

$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
886デフォルトの名無しさん:2007/08/15(水) 12:32:49
変数にディレクトリのパスを格納したいです。
最後にスラッシュはつけておくのが普通ですか?

@dir1='/usr/local/bin'
@dir2='/usr/local/bin/'

前者だとファイルを手作業でくっつけるとき
path1="#{dir1}/#{file}"
と書いたはいいものの「dir1ってスラッシュついてなかったっけ?」と心配しなければならず、後者だと
path2="#{dir2}#{file}"
と書いたはいいものの「dir2ってスラッシュついてたっけ?」と心配しなければなりません。

普通は手作業で連結したりしないので堂々とpathname使い倒せ、という頼りがいのある意見もお待ちしてます。

require 'pathname'
path = Pathname.new(@dir)+file
887デフォルトの名無しさん:2007/08/15(水) 12:56:53
付けない。
連結するときにセパレータを入れることでディレクトリを
連結している事を明示できるから。
888デフォルトの名無しさん:2007/08/15(水) 13:06:43
変数に入ってるのがディレクトリかどうかを報せるのは変数名かオブジェクトの種類の役目だろ
889デフォルトの名無しさん:2007/08/15(水) 15:05:25
昔の NetBSD だと Dir::mkdir(@dir2) がエラーになったような。
なので漏れは最後のスラッシュは付けない。
890デフォルトの名無しさん:2007/08/15(水) 15:05:38
"(ABC)"なんかの正規表現の記号が含まれる可能性のある文字列を渡して
s.gsub!(/\s*\(ABC\)\s*/, "")
したいんですが"(ABC)" -> /\s*\(ABC\)\s*/
の変換ってどうやればいいんですか?
891デフォルトの名無しさん:2007/08/15(水) 15:07:23
ri か refe で pack/unpack のテンプレート文字列の説明って見れましたっけ?
テンプレート文字列の憶えられないニワトリ頭な皆さん、いつもどうしてますか?
892デフォルトの名無しさん:2007/08/15(水) 15:27:43
>>890
Regexp.escape
893デフォルトの名無しさん:2007/08/15(水) 15:29:51
>>890
よくわからんが、「正規表現の文字を考慮して正規表現として組み込む」なら普通に #{} で書けばいい
irb> str = '(ABC)'
irb> re = /\s*#{str}\s*/
=> /\s*(ABC)\s*/
irb> p 'CBA ABC CAC ABC'.scan(re)
[["ABC"], ["ABC"]]

もし「正規表現に使われる文字が混じってるけどそれは正規表現として機能はしてほしくない」なら Regexp.quote() して #{} を使う
irb> re = /\s*#{Regexp.quote(str)}\s*/
=> /\s*\(ABC\)\s*/
irb> p 'CBA ABC CAC ABC'.scan(re)
[]
irb> p 'CBA (ABC) CAC ABC'.scan(re)
[" (ABC) "]

>>892のように Regexp.escape() でも動作は一緒
894デフォルトの名無しさん:2007/08/15(水) 20:32:31
>>891
俺は常に別窓でマニュアル開いてる
左にマニュアル右にエディタとかそんな感じに配置してる
895デフォルトの名無しさん:2007/08/15(水) 22:14:39
>>886
File.join(dir1, file) つかえば。
896デフォルトの名無しさん:2007/08/15(水) 23:45:36
>>894
マニュアルってネットでつか?
それともrdocとか?
897デフォルトの名無しさん:2007/08/15(水) 23:52:38
>>895の File.join が require するものもないし簡単だと思う

file のほうにディレクトリ区切りを極力混ぜないように気をつける必要があるけどな
混ぜることを許容したらわけわかめに陥る可能性大
898デフォルトの名無しさん:2007/08/16(木) 01:04:36
>>896
ローカルに落としたHTML
Winならchm
899デフォルトの名無しさん:2007/08/16(木) 11:50:40
> これでgeneratorライブラリを使わなくても簡単に外部イテレータが使えて、
> PythonやXtalに一歩近づいた。

な、内部イテレータこそ正義と支持してきた我々の立場は...?
900デフォルトの名無しさん:2007/08/16(木) 13:33:11
cgi.rb って、 cgi.params と cgi.out を使ってるぶんには
エスケープとかサニタイズとか XSS とかなんかあのへんの面倒なことに対しては安心?
901デフォルトの名無しさん:2007/08/16(木) 14:46:24
「これを通してみてこういう結果だったら安心だね!」という検証データってどっかで公開されてないのかね
そういうのが無くてある意味「頭の中で考えてるだけ」だから基本的なXSS脆弱性すら無くならないんじゃないかな

こんだけ話が進んだなら実際に出てくるのは複雑で小難しい脆弱性ばっかとか、そういうのになってもいい頃合なのに
clacklibみたいなのってないのかな?
902デフォルトの名無しさん:2007/08/16(木) 15:46:34
メソッド定義の途中で require を記述した場合、
そのメソッドが使われたときにだけファイルが読み込まれるという理解でいいですか?

「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか
そういう動作はしませんよね?
903デフォルトの名無しさん:2007/08/16(木) 15:59:34
>>902
> メソッド定義の途中で require を記述した場合、
> そのメソッドが使われたときにだけファイルが読み込まれるという理解でいいですか?
よい。

> 「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか
> そういう動作はしませんよね?
requireも単なるメソッドだからそういうことはしない。
904デフォルトの名無しさん:2007/08/16(木) 16:01:19
プリプロセッサのイメージ化
905デフォルトの名無しさん:2007/08/16(木) 16:06:35
>>904
require == #include ってこと?
かなり外れてるイメージだ。
906876:2007/08/16(木) 16:42:15
>>876
って不可能でしょうか?
907デフォルトの名無しさん:2007/08/16(木) 16:43:09
Rubyでの開発では、エディタなり環境なり何が一般的なんでしょうか。
908デフォルトの名無しさん:2007/08/16(木) 17:13:27
>>907 の質問って頻出してるけど、どっかに回答まとまってないのかな?
909デフォルトの名無しさん:2007/08/16(木) 17:25:20
別途学習に足るほどの(たとえばJavaやるなら無理してでもEclipse、のような)まともな専用環境がないというのが答なのでは?

手持ちの使い慣れたエディタのRuby補助モードを使ってスクリプトを書いて
シェルで延々スクリプトを実行しながらデバッグしましょう、といった程度の代物しかない
910デフォルトの名無しさん:2007/08/16(木) 17:58:43
ということにしたいのですね? :-)
911デフォルトの名無しさん:2007/08/16(木) 18:07:07
>>906
単純には無理。
DLとか使って無理矢理どうにかすることはできるけどね。
この挙動を変えようという話もなくもない。
912デフォルトの名無しさん:2007/08/16(木) 18:17:32
>>905
> 「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか
> そういう動作はしませんよね?

これがプリプロセッサのイメージか、
と言ったのだが、なんでrequire に勘違いすんの?
そりゃあ、かを化に誤変換したのは悪かったよ
913デフォルトの名無しさん:2007/08/16(木) 18:20:07
>>907
・copy con/cat
・メモ帳
・TeraPad/EmEditor/サクラエディタ/秀丸等
・RDE
・vi系
・emacsen
・Eclipse

お好きな物をどうぞ。
914876:2007/08/16(木) 20:45:09
>>911
ありがとうございます。

> DLとか使って無理矢理どうにかすることはできるけどね。
検索してみたところRuby/DLのことでしょうか。
ちょっとキャッチするのは難しそうなので諦める方向で考えてみます。
915デフォルトの名無しさん:2007/08/16(木) 22:36:34
>>876
>>906

以下のように system から返ってきた時点で、終了ステータスを見れば可能です。

for i in 0..10
 system("cd " + i + "; ls")
 exit(false) if $?.termsig == Signal.list['INT']
end
916デフォルトの名無しさん:2007/08/16(木) 22:41:04
そもそも何で停止しないの?
917デフォルトの名無しさん:2007/08/16(木) 22:56:47
いや、停止はするよ?

10000.times do |i|
system("echo #{i}")
end

というスクリプトを実行して、Ctrl+Cをずっと押してると400くらいで止まる
いくつで止まるかは環境にもよるんだろうけど
918デフォルトの名無しさん:2007/08/16(木) 23:08:40
919デフォルトの名無しさん:2007/08/17(金) 00:40:58
>>891
refe man.pack
920デフォルトの名無しさん:2007/08/17(金) 01:09:47
>>917
わかった。質問を変えます。
そもそも何で一度で停止しないの?

>>918
読んでみたけど system(3) と Ruby の Kernel::system とどう関係するの?
921デフォルトの名無しさん:2007/08/17(金) 01:31:41
922デフォルトの名無しさん:2007/08/17(金) 03:08:04
なるほど。 system(3) の挙動に合わせた Perl の挙動に合わせたということすね。
923スミたん ◆.CzKQna1OU :2007/08/17(金) 21:52:42
http://briefcase.yahoo.co.jp/bc/sunsunlight_heart
みなさんおなじみ京大生Rubyist見習いのものです。名前はスミたんです。
マインスイーパを作ろうとしているのですが、board.rbのL22でエラーが出ます。
配列になってないために[]というメソッドが使えないという事だと思いますが
前の方できちんと配列化してるはずなので不可解です。
どなたかエラーの原因を追及してもらえませんか?
924スミたん ◆5qSAvJsZh6 :2007/08/17(金) 22:07:39
サーセン自己解決しますた。
図に書いたら未定義だった事が分かりますた。
Ruby interpreterは嘘をつきませんねw
925デフォルトの名無しさん:2007/08/17(金) 22:34:42
>>901
脆弱性検査ソフトの製品では AppScan などがある。
100万くらいするけど。
926デフォルトの名無しさん:2007/08/17(金) 22:54:05
いい流れだ
927デフォルトの名無しさん:2007/08/18(土) 02:51:24
>907
913に追加
・NetBeansの次期バージョン(6か)。インデントが2文字でハードコーディングなのがステキ。
・有償で未発売ながら、MatzもびっくりのCodeGear製IDE(名称未定? )とか。

NetBeansはβ版なら出てる。
928デフォルトの名無しさん:2007/08/18(土) 15:23:05
>>138で紹介されている方法にならってmultipart/form-data形式で
ファイルをアップロードするコード書いたらちゃんとアップロード
できたんだけど、これだと一度ファイルを全部メモリ上に読み込ん
じゃうわけで巨大なファイルだとメモリ不足が心配。

なのでストリーム的な取り扱いをしたいなと思うわけですが、どの
ように実現すればよろしいでしょうか。
929デフォルトの名無しさん:2007/08/18(土) 17:05:02
net/httpの「ちょっとずつ○○する」はメモリに全部読み込んだ上で数百バイトぶんずつ切り出す、だった気がする
右から受け取って左にPOSTするとかそういう芸は標準ではできないんじゃないかな
930デフォルトの名無しさん:2007/08/19(日) 11:45:10
な〜るほど。

ということはrubyを使って巨大なファイルをアップロードしたいと
きには、cURLのような外部コマンドを使うのが吉ということでしょ
うか。もしくはすでにそのような機能を実現したライブラリが存在
するとか。
931デフォルトの名無しさん:2007/08/19(日) 12:37:30
ttp://raa.ruby-lang.org/list.rhtml?name=http-access2
> Features;
> methods like GET/HEAD/POST via HTTP/1.1.
> …
> streaming POST

全く試してないができそうなことは書いてあるな
もしうまく行ったなら教えてくれると初心者の人が喜ぶ
932デフォルトの名無しさん:2007/08/19(日) 19:09:24
ruby用のIDEって何がありますか?
933デフォルトの名無しさん:2007/08/19(日) 20:07:35
RDE
934デフォルトの名無しさん:2007/08/19(日) 20:12:04
ググレカス
935デフォルトの名無しさん:2007/08/19(日) 21:16:06
>>934
「ググレカス」で、ググって見ましたが、そんなそれっぽいIDEが見つかりませんでした。
よろしければ、URLを教えてもらえないでしょうか?
936デフォルトの名無しさん:2007/08/19(日) 21:24:15
937デフォルトの名無しさん:2007/08/20(月) 19:37:43
クラス同士で共通の変数を持つ方法について
質問です。

マニュアルによると
module M
@@val=1
class C1;include M;...;end
class C2;include M;...;end
end
というのとクラス継承の場合が挙げられていましたが、
他にクラス同士で共通の変数を持つ方法はないでしょうか?
教えてください。
938876:2007/08/20(月) 19:50:38
>>915
そうか終了ステータスを見ればいいんですね。
今やってみたらできました。
ありがとうございました。
939デフォルトの名無しさん:2007/08/21(火) 04:03:40
sqliteを使っているのですが、sql文の書き方は分かっても「.」で始まるsqlite文の記述の仕方が分かりません。
require 'sqlite'

def make_table
db = SQLite::Database.new("test.db")
db.execute("create table tbl_test(hoge int(20)) values ('1'')")
db.close
end
def chk_table
db = SQLite::Database.new("test.db")
db.execute(".tables") #「.」がおかしいとエラー
db.close
end
make_table
chk_table #←ここが動かない

「\」でエスケープしてもダメでした。何か解決方法はあるのでしょうか?
940デフォルトの名無しさん:2007/08/21(火) 04:43:27
>>937
「クラス同士」というのが、クラスオブジェクト同士という意味なら、その方法ぐらいしかない。クラス定義をモジュール定義に含める必要はないけど。
module M
 @@val = 1
end
class C1
 include M
end
class C2
 include M
end
「クラス同士」というのがインスタンスオブジェクトのことをいっているなら、継承しないと無理。
つか>>937の方法じゃなぜだめなのか、本当にしたいのは何なのかが不明なので、これ以上のアドバイスできない。
941デフォルトの名無しさん:2007/08/21(火) 07:24:06
つーか>937はマルポだな
942デフォルトの名無しさん:2007/08/21(火) 08:36:18
256倍本の無道編を読んでいるんですが
p58にある文字列にマッチする正規表現
/\A"(?:[^"\\]+|\\.)*"/
はどういう意味がよくわかりません。後半部分の
|\\.はどういう意味なんでしょうか
943デフォルトの名無しさん:2007/08/21(火) 08:44:02
>>939
もともとSQL文しか渡せないのではないかと。
RubyのSQLiteバインディングがどうなってるかはともかく、一般的には
ttp://sqlite.org/faq.html#q7
944デフォルトの名無しさん:2007/08/21(火) 10:10:17
>>942
Ruby ソースコードのダブルクォーテーション文字列にマッチする正規表現?
|\\. だと 「または、円記号そのものと任意の一文字」って意味だから
"hoge\n"の \n みたいなのにマッチさせることを想定してるんだと思う。
945デフォルトの名無しさん:2007/08/21(火) 10:25:46
>>944
わかりました。ありがとうございます
946デフォルトの名無しさん:2007/08/21(火) 10:27:26
正規表現って言えば、m オプション(Regexp::MULTILINE)の説明が「正規表現 . が改行にもマッチするようになる」なもんだから

<html>
<head>
<title>たいとる</title>
</title>
<body><h1>本文</h1></body></html>

という文字列があって <head><title>〜</title></head> にマッチさせたいときに

re = /<head>.<title>(.+?)<\/title>.<\/head>/m

って「改行の位置に . を1個挿入する」ように使うもんだとずーっとずーっと思ってた
いや、マルチラインのこういう説明は Ruby に限らないんだけどさ…

上で言うと「title が複数行に跨る場合がある」ときに使うオプションなのね(通常の (.+?) は改行を跨げない)

改行は \r\n と直接 CRLF を指定するか、改行も含んでる \s を使うのが正しいん?
947デフォルトの名無しさん:2007/08/21(火) 11:11:34
.*?でいいんじゃね?
948デフォルトの名無しさん:2007/08/21(火) 11:37:00
意味上は \s+ がいいのかな
これなら行末のいつできたんだかよくわからん空白も行頭のインデントも吸収できる
手抜きして . を使うと普通の文字もマッチしちゃう

irb> /<head>.<title>/m.match('<head>0<title>')
=> #<MatchData:0x402d0de0>
949デフォルトの名無しさん:2007/08/21(火) 12:04:32
comment = /\s*(?:<!--.*?-->\s*)*/m
%r"<head>#{comment}<title>(.+?)</title>#{comment}</head>"m
950デフォルトの名無しさん:2007/08/21(火) 12:10:57
書かれてないことまで勝手に組み込む汎用厨が来たぞー
逃げろー
951デフォルトの名無しさん:2007/08/21(火) 12:24:53
もしかして pstore は何をするにもファイルを最初から最後まで読み込んで
ファイルにあったオブジェクトを全部復元してメモリに取り込んだりしてますか?

「pstore.roots は一部分であるルートの集合だけ読み込むからディスクに優しい」とかいうのは気のせいですか?
pstoreのファイルが10MBあったら、transactionした時点で10MB読み込まれてオブジェクトがメモリに展開されてますか?
952デフォルトの名無しさん:2007/08/21(火) 12:36:22
>>950
もうしばらく待ってると HTML パーサが出来上がってくると思われ。
953デフォルトの名無しさん:2007/08/21(火) 12:37:06
自分はパーサ使ってる。正規表現で間違えるの怖いから・・・

>>946
> いや、マルチラインのこういう説明は Ruby に限らないんだけどさ…
もしかしたら Ruby に限ったりしない?
マルチライン(モード)って普通、改行文字を含む文字列を複数行とみなし、
その各行の行頭行末について ^ と $ がマッチするモードのことだと思う。
(詳説正規表現に書いてあった気がするけどあやふや)
なので Regexp::MULTILINE の説明に複数行モードって書いてあるのはちょっと謎。
954デフォルトの名無しさん:2007/08/21(火) 12:39:32
>>951
def transaction(read_only=false)
unless read_only
file = File.open(@filename, File::RDWR | File::CREAT)
content = file.read()
else
file = File.open(@filename, File::RDONLY)
content = (File.read(new_file) rescue file.read())

@table = load(content)

end

def load(content)
Marshal::load(content)
end

おめでとう
ファイル全部readで読み込んで全部まーしゃるに回してるぞ
rootに何があるか調べるだけでも10MBガッチリ読み込んでバッチリ展開してる
てか、これよく質問されるんだがどっかに解説とか書いてないのか?

「○○がもしあったらデカいpstoreから読み込む」とかいう動作の場合はインデックスだけ別ファイルにしたほうがええな
本データと同一のpstoreファイルに index=[00000,00001,00003, ...] という検索用データを持ってても無駄ってことで
955デフォルトの名無しさん:2007/08/21(火) 12:41:48
ハッシュみたいなデータだけでいいなら sdbm あたりを使った方が良いかも?
956デフォルトの名無しさん:2007/08/21(火) 12:43:08
Perl の正規表現 (の s と m オプション) の改行の扱いに比べると、
Ruby のはシンプルで良いような気がする。
Perl のは漏れにはおぼえれねー。
957デフォルトの名無しさん:2007/08/21(火) 12:44:58
完全に固定の特定のHTMLファイルを相手にする場合は自前の正規表現でも充分なんだけどね。

いや、そのサイトのHTMLを保存してirb起動してファイル読み込んで正規表現テストしまくる手間を考えたら
汎用HTMLパーサにパースさせたほうが楽だろ、とは思わなくもないんだが…HTMLパーサって絶望的に起動遅いんだよ…
958デフォルトの名無しさん:2007/08/21(火) 12:49:18
>>954
がーん
ありがとう

>>955
ハッシュと配列とTimeオブジェクトが入り混じってる現状、データ構造を作り直すの面倒(w
こんなに大きくなるってわかってたらそういうのの検討もしたんだけど……
959デフォルトの名無しさん:2007/08/21(火) 12:57:44
HTML パーサってどれが良いんだろ?
できればメジャーなのが良いんだけど、
俺は FreeBSD を使ってるので ports でインスコできるのでおすすめってある?
960デフォルトの名無しさん:2007/08/21(火) 13:01:45
>>959
つ Regexp
961937:2007/08/21(火) 21:27:24
>>940
最初はMの部分はモジュールじゃなくてクラスにするつもりでした。
しかし、調べた限りではモジュールしか無いので、そうしました。
$ cat test2.rb
module M
@@a=0;def c;@@a=0;C0.new;end
def ap;puts @@a;end
class C0 ;include M
def c1;C1.new;end;def c2;C2.new;end
end
class C1 ;include M;def m;@@a+=1;end;end
class C2 ;include M;def m;@@a+=2;end;end
module_function :c
end
しかし、そうすると、「a」と「b」を二つ作ると「@@a」へのそれぞれの操作が
影響しあってしまうので、他に方法が無いものか?と思ったんです。
$ irb -r test2.rb
irb(main):001:0> a=M.c
=> #<M::C0:0xb7f49464>
irb(main):002:0> aa=a.c1;aaa=a.c2
=> #<M::C2:0xb7f41854>
irb(main):003:0> b=M.c
=> #<M::C0:0xb7f3eaa0>
irb(main):004:0> bb=b.c1;bbb=b.c2
=> #<M::C2:0xb7f3971c>
irb(main):005:0> aa.m;a.ap;aaa.m;a.ap
1
3
irb(main):006:0> bb.m;b.ap;bbb.m;b.ap
4 # <=1と3が出るようにしたい。
6 #
うまく説明できませんが、やりたいことはこういうことです。
962デフォルトの名無しさん:2007/08/21(火) 22:06:58
Windows2000 でOne-Click Installer 使ってRuby1.8.6-25 をインストールしました。
irb 上では
require 'rubygems'
require 'rake'
すると
true
と出るんですが、スクリプトを書いて ruby hoge.rb で実行すると
uninitialized constant Rake (NameError)
のように怒られます。
C:\ruby以下にインストールしました。RubyGems を使うには何の環境変数をどのように設定すればよろしいんでしょか。
963デフォルトの名無しさん:2007/08/21(火) 22:45:00
かなり違う気がするが

class C0
def initialize(); @a = 0; end
def c1(); C1.new( self); end
def c2(); C2.new( self); end
def pa(); puts @a; end
attr_accessor :a
end
class C1
def initialize(sv); @sv = sv; end
def m(); @sv.a += 1; end
end
class C2
def initialize(sv); @sv = sv; end
def m(); @sv.a += 2; end
end

a = C0.new; a1 = a.c1; a2 = a.c2;
a1.m; a.pa; a2.m; a.pa;
b = C0.new; b1 = b.c1; b2 = b.c2
b1.m; b.pa; b2.m; b.pa;
964デフォルトの名無しさん:2007/08/21(火) 23:43:55
>>962
> スクリプトを書いて ruby hoge.rb で実行すると
> uninitialized constant Rake (NameError)
> のように怒られます。
そのスクリプトを出さないのは家訓かなにかか?
965937:2007/08/22(水) 00:13:28
>>963
どうもです。うーん、それだと共通の変数という
一定の書き方ができるメリットが消えてしまうし…
簡単な例にして、書いてしまったんですが、
実はC1の中でもC2.newを書いてる部分があるのです。

class C0
@@a=0
def ap;puts @@a;end
def c1;C1.new;end
def c2;C2.new;end
end
class C1<C0;def m;@@a+=1;end;end
class C2<C0;def m;@@a+=2;end;end
継承使っても駄目だし。
うーん、インスタンス変数のようなクラス変数っていうのかなぁ。
どうにかできないもんかなぁ。
966デフォルトの名無しさん:2007/08/22(水) 01:05:51
名前だけ共通にして中身は別に持ちたいってこと?

class C0
 def self.inherited(subclass)
  subclass.class_eval("@@a = 0")
 end

 def ap
  p self.class.class_eval("@@a")
 end
end

class C1 < C0
 def m
  @@a += 1
 end
end

class C2 < C0
 def m
  @@a += 2
 end
end

c1 = C1.new
c2 = C2.new
c1.ap;c2.ap
c1.m
c1.ap;c2.ap
c2.m
c1.ap;c2.ap
967939:2007/08/22(水) 03:44:44
>>943
え!マジですか!
うわぁ、今後sqlite3にしてCSVを「.import」コマンドでインポートしようと思っていたのに…

1万行ぐらいあるcsvなので、Mysqlを使わずにexerbして単独ローカルでやるつもりなので、大人しく1行づつ呼んでsplitしてinsertしますorz
(sqliteの書き込み時間が気になりますが)

ありがとうございました。
968デフォルトの名無しさん:2007/08/22(水) 06:59:46
>>967
公式から落とせるスタンドアロン版の sqlite3(.exe) について調べてみて。
コマンドラインから sqlite3 foo.db ".import table" するなり
Ruby から system("sqlite3 foo.db 'import table'") とかできると思う。
(sqlite3 の第二引数には SQL 文とドットコマンド両方渡せる)
適当書いてるけど、何かしらお手軽な手段はあると思うよ。
969デフォルトの名無しさん:2007/08/22(水) 15:07:07
>>959
つ Racc
970937:2007/08/22(水) 15:53:02
>>966
やりたいのは>>961みたいなことです。
継承できるインスタンス変数、みたいなの。
うまく言えないけど。
というか、インスタンス変数て継承できない。。。ことはないか、
継承したクラスで値を参照できるインスタンス変数、というか。
うーん、混乱してきた…
971デフォルトの名無しさん:2007/08/22(水) 17:01:27
こんにちは、最近Rubyを始めたんだけどハマったので質問です。
配列展開(?)を使ったcase文を書いたんだけど、実際に展開された時
どの要素にマッチしたかを調べる方法ある?

over = [ "b", "c" ]
case src
when "a"
dst = "A"
when *over
# ここで dst = ?.to_s.upcaseみたいにやりたい
# 望む結果は dst = "B"とか dst = "C"とか。
...略

Rubyリファレンスサイトの組み込み変数のページ見てローカルスコープの
変数をいろいろ試したけどうまくいかなかった。
環境はRuby ruby 1.8.5 (2006-12-04 patchlevel 2)です。
972デフォルトの名無しさん:2007/08/22(水) 17:20:18
無いんじゃない?

src を利用して用が済まない(たとえば今回ならdst=src.upcase)のなら、
when *over の中で over から src と"同じ"ものを再度自力で探すしかないと思う
973デフォルトの名無しさん:2007/08/22(水) 18:24:12
文字列strから正規表現にマッチする(複数の)文字列を取り出して変数に入れたいときに

matched_words = str.scan(/__(1個目)__(2個目)_(3個目)/).flatten

とか

matched_word = str.scan(/___(何か)__/)[0]

とかいちいち配列を作って壊すのはなんかアレな感じがします。

matched_words = Array.new
str.scan(/__(1個目)__(2個目)_(3個目)/){
matched_words.push $1,$2,$3
}

とか都合4行で書くのもうーんって感じです。
何かいい書き方ないですか?
974デフォルトの名無しさん:2007/08/22(水) 18:55:50
>>973
"__1__2__3__".match(/__(1)__(2)__(3)/).captures
=> ["1", "2", "3"]
とか?
975デフォルトの名無しさん:2007/08/22(水) 19:35:52
>>974さん残念マッチしなかった場合も試して頂きたかった…!
irb> "__1_A_2__3__".match(/__(1)__(2)__(3)/).captures
NoMethodError: undefined method `captures' for nil:NilClass

>>973
いまのところ、「一発」で配列あるいは文字列を得る方法はないと思う。
str.match(/re/).to_a がたぶんいちばん近いが、
返る配列が [$&, $1, $2, $3, ...] なので0番目の要素におそらく誰も望まないデータがこっそり入ってる。

irb> '123'.match(/(1)(2)(3)/).to_a
=> ["123", "1", "2", "3"]

この配列をうまく操作すれば望む配列を得ることはできるだろうけど、それなら scan して flatten したほうがわかりやすいよな。
976デフォルトの名無しさん:2007/08/22(水) 19:36:23
>>970>>966を実行してみた?
「継承できるインスタンス変数」というと通常のインスタンス変数と
変わりないように思えるんだけど、通常のインスタンス変数との違いを
列記した方が伝わりやすいんじゃないかなあ。
977963:2007/08/22(水) 21:01:38
>>965
>どうもです。うーん、それだと共通の変数という
>一定の書き方ができるメリットが消えてしまうし…

インスタンス変数として共通?C0,C1,C2で共通?
後者ならC0にも@sv=selfとするとか、
あるいは変数専用のクラスを作ってそれをC0の@svにいれれば共通になるけど。


>実はC1の中でもC2.newを書いてる部分があるのです。

C1のなかでC2.new(@sv)か@sv.c2()すればいい
C0を作らずにC1,C2しかいない場合もちょっと弄ればいける。
978デフォルトの名無しさん:2007/08/22(水) 21:18:25
スクリプトは EUC-JP なんだけど、入力される URL は UTF-8 な日本語をエンコードしたものが入ってるんです。

URI.decode(url) してみた感じはなんとなく自動判別でうまく日本語に戻ってるような気もするんですが、
できれば「これは UTF-8 を URL エンコードした文字列なんだよ」と事前に教えて確実に処理させたいです。どうしましょう。
979972:2007/08/22(水) 22:02:27
>>972
レスサンクス。

> src を利用して用が済まない
まさにその通りでした。orz

when *over
dst = src.to_s.upcase
...
980デフォルトの名無しさん:2007/08/22(水) 23:23:25
>>975
> >>974さん残念マッチしなかった場合も試して頂きたかった…!
> irb> "__1_A_2__3__".match(/__(1)__(2)__(3)/).captures
> NoMethodError: undefined method `captures' for nil:NilClass
1.9なら .? でいけるのかな。

"__1_A_2__3__".match(/__(1)__(2)__(3)/).?captures
981デフォルトの名無しさん:2007/08/22(水) 23:29:48
>>971
正規表現にするとか。

over = [ "b", "c" ]
over_re = /\A#{Regexp.union(*over)}\z/
case src
when "a"
dst = "A"
when over_re
dst = $&.upcase
end
982デフォルトの名無しさん:2007/08/22(水) 23:32:15
>>978
URI.decodeは文字エンコーディングの変換はしない。
983デフォルトの名無しさん:2007/08/22(水) 23:32:30
文字と文字の比較だとは限らない説

というか正規表現でなんとかなるならそれこそsrcのダダ流用でなんとかなるんじゃね
984デフォルトの名無しさん:2007/08/22(水) 23:32:51
"__1_A_2__3__".match(/__(1)__(2)__(3)/).captures rescue nil
985937:2007/08/22(水) 23:46:51
>>976
えーと、C0,C1,C2で作られるインスタンスに共通というのかな?
>>966では共通になってないです。もしくは>>961でM1とM2を
作るようなことと同じなので、駄目です。
「インスタンス変数は継承できる」と言っていいのかどうなのか
そもそもわからないので、上手く説明できません。

http://i.loveruby.net/ja/rhg/book/minimum.html
>Rubyでは変数(インスタンス変数)は継承するものではない。
http://www.sakalab.org/3zemi06/no5.html
>既存のクラスの メソッドやインスタンス変数を「継承」し

>>963でやってるみたいに共通の値をやりとりしたいんです。
値をやりとりするのもいいけど、共通の変数を作れないかな、と思ったんです。

ウェブサービスにアカウント(C0)
メッセージの一覧(C1)
メッセージの中身(C2)
C0,C1,C2ではクッキーを共通の変数としたい。
C0.new(user1),C0.new(user2)としたときクッキーが同じになったら困る。
(だからModuleにしてクラス変数をクッキーにするのでは無理になる)
というスクリプトなんです。

>>977
うーん、結局そういう風にどこかで渡すしかないですかね。
986デフォルトの名無しさん:2007/08/23(木) 20:27:47
C++ の private のように同じクラスのインスタンスからのみアクセスできる
属性はどのように定義すればよいでしょうか?
protected は継承クラスからアクセスできてしまうみたいですが。
987デフォルトの名無しさん:2007/08/23(木) 21:23:54
private
988デフォルトの名無しさん:2007/08/23(木) 22:21:16
>>986
不可能。
send とか instance_eval でなんでもできるから。
989デフォルトの名無しさん:2007/08/24(金) 00:38:18

990デフォルトの名無しさん:2007/08/24(金) 00:38:57
>>986
名前無で作る
991デフォルトの名無しさん:2007/08/24(金) 01:02:22
>>986
その機能は1.9で追加されるかもしれない。
992デフォルトの名無しさん:2007/08/24(金) 02:19:19
Perlで↓書く処理、Rubyだとどうなるの?

sub count(){
    my $max = shift;
    return {
        'incr' => sub {
            my $count = $max;
            for(my $i=$count;$i<$count+3;$i++){
                print $i, "\n";
                $max++;
            }
        },
        'getMax' => sub {
            return $max;
        }
    };
}

my $count = &count(10);
for(my $i=0;$i<5;$i++){
    $count->{'incr'}->();
    print "max:", $count->{'getMax'}->(), "\n";
}

クラスは使わないで、あくまでメソッド?クロージャーとして実装する場合。
Perlより絶対楽だと思うんだが、Ruby初心者なのでさっぱりわからん。。。
993デフォルトの名無しさん:2007/08/24(金) 02:56:04

994デフォルトの名無しさん:2007/08/24(金) 03:21:53
>>992
> クラスは使わないで、あくまでメソッド?クロージャーとして実装する場合。

直訳しないで object に特異メソッドを追加するようにしてみた。
クラスは使って・・・あ、特異クラスがいた。。。orz


def count(max)
r = Object.new
(class <<r; self; end).instance_eval do
define_method(:incr) do
(max...max+3).each do |i|
puts i
max += 1
end
end
define_method(:get_max) do
max
end
end
r
end

c = count(10)
5.times do
c.incr
puts "max: #{c.get_max}"
end
995デフォルトの名無しさん:2007/08/24(金) 05:32:58

996デフォルトの名無しさん:2007/08/24(金) 05:35:33
>>992 >>994
どうせcountで1つ名前使っちゃうなら
素直にクラスにしちゃった方がスッキリするんだよなぁ。

class Count
    def initialize(max)
        @max = max
    end
    def incr
        3.times {|i| puts(@max+i) }
        @max += 3
    end
    def get_max
        return @max
    end
end

cnt = Count.new(10)
5.times do |i|
    cnt.incr
    puts "max:#{cnt.get_max}"
end

でも「クラス使わないで」って言われると別のアプローチが必要か。
997デフォルトの名無しさん:2007/08/24(金) 07:44:48
ちょうどこの前おもいついたやりかた

def count()
c = 0
a = lambda {|e| e.times { p c; c += 1}}
b = lambda {c}
return {'incr'=> a, 'getMax'=> b}
end

f = count
p f['getMax'][]
p f['incr'][3]

998デフォルトの名無しさん:2007/08/24(金) 12:39:53
rubyをまったくの無知からやろうとするなら読んでおく本をどれですか?
999デフォルトの名無しさん:2007/08/24(金) 12:46:33
1000デフォルトの名無しさん:2007/08/24(金) 12:50:10
ありがとう
そして1000げっと
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。