Ruby初心者スレッド Part 12

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。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/05/03(木) 13:53:28
# 本スレ
Rubyについて Part 26
http://pc11.2ch.net/test/read.cgi/tech/1173036694/

# 関連スレ
【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創刊 【ルビま!】
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/
3デフォルトの名無しさん:2007/05/03(木) 14:00:10
4デフォルトの名無しさん:2007/05/03(木) 14:00:30
5デフォルトの名無しさん:2007/05/03(木) 14:01:34
= 公式/非公式関連リンク

== 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/
6デフォルトの名無しさん:2007/05/03(木) 14:03:29
== 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/
7デフォルトの名無しさん:2007/05/03(木) 14:04:48
宗教の話はマ板のスレへどうぞ。

【カルト】Ruby開発者Matz【モルモン】
ttp://pc11.2ch.net/test/read.cgi/prog/1148712641/
8デフォルトの名無しさん:2007/05/03(木) 15:01:39
Rubyを使って脱獄するコードを教えてください。
当方初心者(♀)なのでやさしくお願いします。
9デフォルトの名無しさん:2007/05/03(木) 15:36:24
def prison ->(){break} end
10デフォルトの名無しさん:2007/05/03(木) 17:48:45
前スレ>>999
>>991には最後にselfって書いてあるからクラスが返ってる。
他の式を最後に書けば違うものが返るぞ。
11デフォルトの名無しさん:2007/05/03(木) 17:58:36
つまり

class A
 p 'foo'
 p 'bar'
end

で "foo" と "bar" が表示されるという事なんだが、
何だかなあとは思うな。
12デフォルトの名無しさん:2007/05/03(木) 18:05:29
俺は違和感感じないが、慣れただけなのかなぁ。
13デフォルトの名無しさん:2007/05/03(木) 18:20:05
>>10
だからそれで充分だろ。
14デフォルトの名無しさん:2007/05/03(木) 18:29:08
self と書かないと返らないのと
書かなくても返るのとでは大違い
15デフォルトの名無しさん:2007/05/03(木) 18:56:08
で、実際にそこら辺の仕様を活用したコードって実在するの?
16デフォルトの名無しさん:2007/05/03(木) 19:43:32
>>11
すげー不自然
17デフォルトの名無しさん:2007/05/03(木) 19:46:35
>>11
囚人に抜け道教えちゃ遺憾だろ
18デフォルトの名無しさん:2007/05/03(木) 19:54:16
attr_* とかは基本的には同じようなものなんだけどなぁ。
class A
attr_accessor :a
end
19デフォルトの名無しさん:2007/05/03(木) 20:02:19
定数の定義くらいならやるけども。
20デフォルトの名無しさん:2007/05/03(木) 21:23:50
>>14
self と書けば self を返せるのと
他のものを書いても self しか返せないのとでは大違い

とでも答えておけば満足?
21デフォルトの名無しさん:2007/05/03(木) 21:30:23
>>20
それが大違いだから >>999 は意味が分かんない
22デフォルトの名無しさん:2007/05/04(金) 01:48:58
RoRで作って、問題なく動くものが出来たら、それをjavaのコードで吐くってアプリケーションが有れば最強な気がする。
RubytoJavaコンパイラって感じか?
23デフォルトの名無しさん:2007/05/04(金) 01:55:50
>>1
24デフォルトの名無しさん:2007/05/04(金) 09:22:55
>>22
JRuby
25デフォルトの名無しさん:2007/05/04(金) 15:09:01
.to_s.to_iってださくね?
26デフォルトの名無しさん:2007/05/04(金) 15:24:05
>>25
.2s.2i よりマシ
27デフォルトの名無しさん:2007/05/04(金) 15:30:08
直接to_iを定義すりゃええやん
28デフォルトの名無しさん:2007/05/04(金) 16:19:29
>>26
>.2s.2i

なにその言語。
29デフォルトの名無しさん:2007/05/04(金) 16:45:23
>>28
俺も嫌いだし、いまはもう廃れた習慣でせいせいしてるけど、
昔は to を 2 と表記する習慣がこの世界にはあった。
30デフォルトの名無しさん:2007/05/04(金) 16:55:11
昔の俺のPascalのライブラリとか見ると、int2strとか余裕である。
時代を感じさせる
31デフォルトの名無しさん:2007/05/04(金) 16:58:50
変換系のコマンドラインツールには山ほどあるぞ
32デフォルトの名無しさん:2007/05/04(金) 17:00:12
f2c とか。
ごく普通な表記だと思ってるけど。
33デフォルトの名無しさん:2007/05/04(金) 17:52:33
真ん中に2がはさまってるのは山ほどあるけど、2から始まるのは見たことないな
34デフォルトの名無しさん:2007/05/04(金) 18:05:29
後ろにつくplain2というのならあるな。

plain2 -tex とか plain2 -htmlとかオプションを付けて起動して
プレインテキストから指定フォーマットに変換。
35デフォルトの名無しさん:2007/05/04(金) 18:08:23
int_to_strよりはint2strのほうがいいかとも思うけど、
to_iを2iはないだろ
36デフォルトの名無しさん:2007/05/04(金) 18:11:08
識別子が数字で始まるのは無理だよなあ。
37デフォルトの名無しさん:2007/05/04(金) 18:14:27
案外「数字から始まることが許されるなら本当は2iや2sにしたかった」とか言われたりして

2や4はもう習慣的なもんだな
_to_や_for_とどっちがいいかと言われるとちょっとだけ悩む
38デフォルトの名無しさん:2007/05/04(金) 18:22:43
外人とチャットで c u l8er とか、最初は何の文字化けかと思ったな。
39デフォルトの名無しさん:2007/05/04(金) 18:25:14
日本語で

ノシ

とだけ書かれるのも似たようなもんだけどな
40デフォルトの名無しさん:2007/05/04(金) 18:56:22
l8erって初めて見た。理解するのに10秒ぐらいかかったよ。
普通にタイプしたほうが楽そうだ。
41デフォルトの名無しさん:2007/05/04(金) 20:41:48
googleの検索結果を毎日監視するのに、open-uriを
使おうと思います。というか、実際使ってみました。
↓「あ」の検索結果
url = "http://www.google.co.jp/search?num=30&hl=ja&newwindow=1&safe=off&q=%E3%81%82&lr=lang_ja"
open(url) { |f|
 f.each_line { |line|
  print "#{line}\n"
 }
}

これってブラウザから「あ」で検索した結果とおなじなんだけど、
なんというか、思ったよりあっさりできてしまって焦ってます。
なんなのこれ
42デフォルトの名無しさん:2007/05/04(金) 20:52:12
43デフォルトの名無しさん:2007/05/04(金) 21:04:05
>>41
open-uriは楽ですよね
44デフォルトの名無しさん:2007/05/04(金) 21:17:42
便乗だけど検索ワードに”エロエロ”とか任意の漢字入れるのってどうやるの?
%なんたらって表記に変換する関数ってある?
45デフォルトの名無しさん:2007/05/04(金) 21:30:45
iconvかなんか使った後、gsubかなー?
46デフォルトの名無しさん:2007/05/04(金) 21:32:35
open-uriは「1行ずつ」読まないから嫌いだ(w
ローカルに全部持ってきてから配列にして返してるだけじゃん。
仕方ないんだけど。

>>44
今書こうとしてた
%ナントカという形のURLエンコードされた日本語を直書きしてる>>41の方法は本当はまずい

require 'open-uri'
require 'kconv'
string = "ねこだいすき フリスキー".toutf8
url = URI.escape("http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=#{str}&num=50")

file=open(url).toeuc
print file

こんな形でどうぞ
Googleのie=はインプットのエンコーディングを、oe=はアウトプットのエンコーディングを指定するから、
全部EUC-JPな環境でやるならそのように書き換えるとstringとfileのとこでの変換の手間が減って楽
47デフォルトの名無しさん:2007/05/04(金) 21:35:14
ああやっぱ当然のように間違えた
stringなんて慣れない気取った変数使うもんじゃないな

require 'open-uri'
require 'kconv'
str = "ねこだいすき フリスキー".toutf8
url = URI.escape("http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF\
-8&q=#{str}&num=50")

file=open(url).toeuc
print file
48デフォルトの名無しさん:2007/05/04(金) 21:35:53
>>44

CGI.escape
49デフォルトの名無しさん:2007/05/04(金) 21:36:43
CGIのを使うよりURI.escapeのほうが意味的にいいな。

50デフォルトの名無しさん:2007/05/04(金) 21:46:17
open-uri を require すれば uri はくっついてくるからな
これのためだけに cgi を require するのはわりと無駄と思われ
51デフォルトの名無しさん:2007/05/04(金) 22:14:41
cgi.rbは副作用があるからなぁ。
52デフォルトの名無しさん:2007/05/04(金) 23:25:35
そもそもescape処理が微妙に違うんでないかい?
53デフォルトの名無しさん:2007/05/05(土) 00:38:23
CGI::escapeの正規表現

str.gsub(/[^a-zA-Z0-9_\-.]/n)


URI::escapeの正規表現(長いので色々まとめた)

UNRESERVED = "a-zA-Z\d-_.!~*'()"
RESERVED = ";/?:@&=+$,\\[\\]"
UNSAFE = Regexp.new("[^#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}]",false, 'N').freeze
str.gsub(UNSAFE)
54デフォルトの名無しさん:2007/05/05(土) 00:43:39
っていうか、cgi.rbはuri.rb呼んでるんだと思ってた
独自実装なのね
55デフォルトの名無しさん:2007/05/05(土) 01:30:42
uriより前からあるからね
56デフォルトの名無しさん:2007/05/05(土) 01:36:01
$KCODE = 'u'
require "cgi"
require "Net/Hatena/Diary/keywordlink"

#cgi = CGI.new
#print cgi.header

wrd = <<-"EOF"
はてなダイアリーキーワード自動リンクAPI
■ 本ドキュメントに関する注意事項
本ドキュメントははてなキーワード(はてなダイアリーのキーワード)におけるAPI実装を解説するものです。主にはてなスタッフがその作成と更新を行っています。
EOF

p Net::Hatena::Diary.set_keyword_link(wrd)

上記スクリプトを実行すると意図する結果が返ってくるのですが、
コメント部分を削除し、CGIとして実行すると
Internal Server Errorがでます。

原因と対策を教えてください。

当方の環境。
MacOSX Ruby1.8.5 Apache1.3.33
57デフォルトの名無しさん:2007/05/05(土) 01:51:58
>56
とりあえず手っ取り早い対策として
Apacheのエラーログ見れ&晒せ
58デフォルトの名無しさん:2007/05/05(土) 02:30:33
i 0 u 4 ever
59デフォルトの名無しさん:2007/05/05(土) 17:01:52
http://〜から始まる文字列やmailto:〜で始まる文字列に自動的に
タグ(http://〜なら<a href=""> </a>を)を挟んでくれるようなライブラリってあるんでしょうか?

こういうことってBBSとかで一般的にやってることだと思うんですが、処理に名前付けされてない
(もしくは自分が知らない)ので検索してもどうも見つからないです…。

ご存知の方いたら教えてください。宜しくお願いします。
60デフォルトの名無しさん:2007/05/05(土) 17:06:33
>>59
正規表現+gsub
61デフォルトの名無しさん:2007/05/05(土) 17:14:45
>>59
いわゆる「URLやメールアドレスを確実正確に抜き出す超絶複雑な正規表現」を内蔵したライブラリが標準でないか、という話なら、多分無い
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
62デフォルトの名無しさん:2007/05/05(土) 17:23:26
>>59
URI.extract
URI.regexp
63デフォルトの名無しさん:2007/05/05(土) 17:30:04
>>59
require 'open-uri'
#require 'uri' # 今回必要なのはuri.rbだがopen-uriに含まれてる
require 'kconv'

yahoo = 'http://dailynews.yahoo.co.jp/fc/computer/2channel/'
html = open(yahoo).read.toeuc

URI.extract(html,['http']){|uri|
puts uri
}
6456:2007/05/05(土) 18:11:13
[18:09:51] zushitmacの発言: [Sat May 5 18:01:08 2007] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/rubytest.cgi
/Library/WebServer/CGI-Executables/rubytest.cgi:7:in `require': no such file to load -- Net/Hatena/Diary/keywordlink (LoadError)
from /Library/WebServer/CGI-Executables/rubytest.cgi:7
[Sat May 5 18:02:09 2007] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/rubytest.cgi
[Sat May 5 18:02:09 2007] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/favicon.ico

二回ほど実行してみました。
・ヘッダがおかしいよ
・requireの失敗
という意味だと思いますが、
require部分とメソッド実行部分をコメントアウトして、
適当な文字をprintしてみるとprintされているのでヘッダは大丈夫だと思うのですが、どうすれば解決できるのでしょうか?
6556:2007/05/05(土) 18:13:05
最初の
[18:09:51] zushitmacの発言:
の部分は無視してください。
書き込みのためにWinマシンにSkypeでメッセージを送ってコピペしたゴミです。
66デフォルトの名無しさん:2007/05/05(土) 19:07:20
no such file to load -- Net/Hatena/Diary/keywordlink

指定したファイルが見つからないと言っている。

require しようとしているライブラリが入ってるかどうか、入っているならそれはどこか、ライブラリのサーチパスに含まれるかを調べれ。
67デフォルトの名無しさん:2007/05/05(土) 19:31:45
>>66
同じスクリプトをCGI関連の部分をコメントアウトし、ターミナルで実行した場合はきちんと実行されるので
ライブラリは入っていると思うのですが、Apache側の設定でライブラリのパスを指定する必要があるということでしょうか?
68デフォルトの名無しさん:2007/05/05(土) 20:02:18
レスthxです。

>>62,63
おお、ナイスな感じですね。

irb(main):035:0> pp URI.__send__(:class_variable_get,'@@schemes')
{"LDAP"=>URI::LDAP,
"FTP"=>URI::FTP,
"HTTPS"=>URI::HTTPS,
"MAILTO"=>URI::MailTo,
"HTTP"=>URI::HTTP}

っていう結果だったのでMailtoもいけちゃいそうですね。素晴らしい。

ただ今回はHTMLからURLを抜き出すのではなくて、テキストからURLを抜き出して
そのURLをHTMLのhrefタグで囲うっていうのが目的なのでそこは自分で実装しないといけなさそうですね。
69デフォルトの名無しさん:2007/05/05(土) 20:31:34
>>67
よーわからんがもし load "Net/Hatena/Diary/keywordlink.rb"
でCGIが動作したなら mod_ruby が悪い

>>68
一番小難しいとこがライブラリでできて
一番カスタマイズしたいとこが自力でできるんだから喜べよ(w

ちなみにやってやれんこともないがこの機能は非常に不評

require 'open-uri'
require 'uri'
require 'kconv'
require 'cgi'

yahoo = 'http://dailynews.yahoo.co.jp/fc/computer/2channel/'
html = open(yahoo).read.toeuc

cgi=CGI.new('html4')

URI.extract(html,['http']){|uri|
puts cgi.a(uri){"#{uri}へのリンク"}
puts cgi.a({'href'=>uri,'target'=>'_blank'}){"#{uri}へのリンク(別窓で開きます)"}
}


70MoonWolf ◆MoonWdLnkQ :2007/05/05(土) 22:26:46
>>64
requireは全部小文字で書いてね。
7156:2007/05/05(土) 22:39:56
あれからいろいろやってみました。

たぶんですが、Ruby自体を2つインストールしているような・・・

ターミナル(zsh)で
ruby -e 'puts $LOAD_PATH'
したときは /opt/local/lib/ruby/以下を見に行っているのに
CGIスクリプトのほうで
p system("ruby -e 'puts $LOAD_PATH'")
したときは /usr/lib/ruby/ 以下を見に行っているみたい。

そのせいか、Apacheの環境変数をセットし直したり、もともとライブラリパスが通ってたところにライブラリをコピペしても
Net/Hatena/Diary/keywordlinkはちゃんといけてるのですが
以下のようなエラーをRubyが吐いてしまう事態になりました。

#<NoMethodError: private method `gsub' called for nil:NilClass> /usr/lib/ruby/1.8/cgi.rb:342:in `escape' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `collect' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121
:in `each' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121
:in `collect' /Library/WebServer/CGI-Executables/whatsthisbookproto1.rb:121


ここまでくると、
・ローカルでの作業をあきらめる
・一切合切再インストール
しかないでしょうか?
72デフォルトの名無しさん:2007/05/05(土) 22:45:31
>>70
了解しました。
小文字に修正しました。
73デフォルトの名無しさん:2007/05/05(土) 22:49:26
ああ OSX なんだったか。 /opt/local/lib/ruby は MacPorts だな。 OSX に
は最初から ruby が入っているから、そっちを見ているのだろう。

CGI なんだよな? shebang はどうなっている? ちゃんと
#!/opt/local/bin/ruby
と指定してる?
74デフォルトの名無しさん:2007/05/05(土) 23:22:32
>>73

textmateが自動的に吐いてくれる
#!/usr/bin/env ruby
から
#!/opt/local/bin/ruby
に変更することで無事に動くようになりました。

わざわざapacheの環境変数いじくり回す必要もなく、はじめからこうしておけばよかったorz

あと懺悔しますが、
>>71のエラーは単なるエラーだったのですね。
さっき、shebangのチェックのために新しいCGIを書いていてわかりました。

本当にありがとうございました。

スレ汚してしまいすいませんでした。

75デフォルトの名無しさん:2007/05/06(日) 07:25:03
配列の要素をマージしたい場合って、
array_a + array_b
array_a.concat array_b
のどちらがいいの? 変わらないかな?
これ以外にもなにかお決まりの方法ある?
76デフォルトの名無しさん:2007/05/06(日) 07:34:30
>>75
+ だと新しいオブジェクトが作られる
concatだと作られない

であってる?
77デフォルトの名無しさん:2007/05/06(日) 08:45:37
マカってアフォだな。
78デフォルトの名無しさん:2007/05/06(日) 09:22:09
メールフォーム作ろうと思うんですが、参考になるページを教えていただけませんか?
79デフォルトの名無しさん:2007/05/06(日) 10:01:35
>>75-76
object_id というメソッドがある
同一のオブジェクトであれば同一の数字が割り振られてるはずだから、気になれば使え

で、マニュアル
> self + other
> self と other の内容を繋げた新しい配列を返します。
| 例:
| a = [1, 2]
| b = [8, 9]
| p a + b #=> [1, 2, 8, 9]
| p a #=> [1, 2] (変化なし)
| p b #=> [8, 9] (こちらも変化なし)
> concat(other)
> 配列 other を self の末尾に(破壊的に)連結します。 self を返します。
| 例:
| array = [1, 2]
| a = [3, 4]
| array.concat a
| p array # => [1, 2, 3, 4]
| p a # => [3, 4] # こちらは変わらない

で、実際上は
「array_a の内容だけを変えたい」なら concat しろ
array_a = array_a + array_b は array_a の中身の数値の結果だけは同じだが無駄で冗長でわかりにくい
(どっかこれ以前に array_a を参照してるオブジェクトがあった場合 array_b はそれには足されてないので注意)
「ふたつの配列を合わせた新しいオブジェクト」が欲しいなら + で足せ
array_c = array_a.concat array_b は(array_a と array_b を捨てるとして)結果は同じだがこう書かれると混乱する
p array_a.push(array_b).flatten とかやるのも何か意図を感じて引っかかるからやめとけ
80デフォルトの名無しさん:2007/05/06(日) 10:56:25
Dir.globってなんで、Dirをnewしないで使えますか?
クラスメソッドって奴?
81デフォルトの名無しさん:2007/05/06(日) 10:57:40
日本語でどうぞ
82デフォルトの名無しさん:2007/05/06(日) 11:07:14
>>80
おーむねそういう理解で桶かと
マニュアルにもクラスメソッドのとこに書いてあるし
83デフォルトの名無しさん:2007/05/06(日) 11:20:57
ホントだ、クラスメソッドのところに書いてありますね。

Rubyリファレンスマニュアル - Dir
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Dir
84デフォルトの名無しさん:2007/05/06(日) 11:30:31
RubyのマニュアルのURLは
http://www.ruby-lang.org/ja/man/dir/
で表示できるべきだと思ってみたりする
85デフォルトの名無しさん:2007/05/06(日) 11:39:55
オブジェクトを、boolに変換したいのですが、
to_b ってのはないんですよね?
一発メソッドで変換!ってのはできないですか?
86デフォルトの名無しさん:2007/05/06(日) 11:41:04
オブジェクトをboolに変換するアルゴリズムを
まずは自然言語で記述してみてくれ。
87デフォルトの名無しさん:2007/05/06(日) 11:41:10
!!(x)
88デフォルトの名無しさん:2007/05/06(日) 11:47:52
>>85
true & n
89デフォルトの名無しさん:2007/05/06(日) 11:58:48
>>85
条件 ? falseでもnilでもない時返す値 : falseかnilのとき返す値
90デフォルトの名無しさん:2007/05/06(日) 12:00:23
def Object.to_b; true & self end
"hello".to_b
NoMethodError: undefined method `to_b' for "hello":String


あれ、上手くいかないや
91デフォルトの名無しさん:2007/05/06(日) 12:01:34
>>87
ああ、こんなのあるんですね。

でも、
!!("hello")
だと、
warning: string literal in condition
ってでますね
92デフォルトの名無しさん:2007/05/06(日) 12:02:17
Ruby で false と nil が違うってなんでなん?
93デフォルトの名無しさん:2007/05/06(日) 12:03:00
>>91
これって、リテラルのときだから、ふつうは、気にしなくていいですね。
ありがとうございました。

でも、>>90がエラーるのはなんでだ
94デフォルトの名無しさん:2007/05/06(日) 12:07:07
>>88 は冗談だとでも思われてるんだろうか・・・。
TrueClass のリファレンスを見て欲しいよ。
95デフォルトの名無しさん:2007/05/06(日) 12:12:04
つか「オブジェクトを真か偽のどちらかに変換したい」という要求自体が変
96デフォルトの名無しさん:2007/05/06(日) 12:12:13
いやだから、>>90
97デフォルトの名無しさん:2007/05/06(日) 12:13:22
>>95
変換したいわけではなく、ifにつっこんで、どうなるのかを得たいだけなのです
98デフォルトの名無しさん:2007/05/06(日) 12:19:04
>>90 は静的メソッドにしてるからおかしいんだろ。

class Object; def to_b; true & self; end; end
p "hello".to_b

こうだ。
99デフォルトの名無しさん:2007/05/06(日) 12:20:06
>>95
オブジェクトが nil か false の時は偽、それ以外のときは真なんだぜ。
100デフォルトの名無しさん:2007/05/06(日) 12:25:42
スクリプト内で標準エラー出力の出力先をすげ替えるのってどうやりますか?

def mystderr(s)
end

が最終的に呼ばれるようにしてごにょごにょしたいんですが。
101デフォルトの名無しさん:2007/05/06(日) 12:26:22
この手の人は真はどうでもよくて

irb> [false] ? 'T' : 'F'
=> "T"
irb> > '' ? 'T' : 'F'
=> "T"

これを偽にしたいとかいう要求だと予想
102デフォルトの名無しさん:2007/05/06(日) 12:27:58
>>100
$stderrを書き変えれ

ただ、こういう事したスクリプトは公開せず自分のとこで使うだけにしとけ
103デフォルトの名無しさん:2007/05/06(日) 12:29:37
>>100
マニュアルの $stderr の部分を参照
104デフォルトの名無しさん:2007/05/06(日) 12:30:02
>>98-99
やっとわかた。サンクスでした
105デフォルトの名無しさん:2007/05/06(日) 12:32:01
if(0) は真なのに注意な。
106デフォルトの名無しさん:2007/05/06(日) 12:35:23
irb> > p if(0)
=> nil

うそつきいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
107デフォルトの名無しさん:2007/05/06(日) 12:37:52
p "hoge" if(0)

hoge
108デフォルトの名無しさん:2007/05/06(日) 12:41:57
>>106
それは単に p の返り値じゃねーか…

でもなんでここで次行待ちしないで切れちゃうんだろう?
irb は p や puts を見かけたら行末で特別な処理してる?
109デフォルトの名無しさん:2007/05/06(日) 13:14:02
括弧を付けたからifというメソッドだと誤認したんだろうけど、
このくらいまず予約語として認識してもいいような気がする。

110デフォルトの名無しさん:2007/05/06(日) 13:30:03
>>108-109
後置ifだから…
111デフォルトの名無しさん:2007/05/06(日) 13:42:07
privateなクラス定数/クラスメソッドはどのように書けばよいですか?
112デフォルトの名無しさん:2007/05/06(日) 13:57:12
大人しくconcatします。ども。
113デフォルトの名無しさん:2007/05/06(日) 13:57:35
privateってどんな動作を期待?
114111:2007/05/06(日) 14:07:25
>>113
定義されたクラスとそのサブクラスからだけ参照できるのが望みです。
115デフォルトの名無しさん:2007/05/06(日) 14:30:18
class Foo
 class << self
  def foo; puts "foo"; end
  private :foo
 end
end
定数は無理っぽいかなあ
116デフォルトの名無しさん:2007/05/06(日) 14:53:47
すごく低レベルですみません

puts 'あなたの好きな数字を入力してね'
number = gets.chomp
puts 'あなたの選んだ数字に1を足すと' + number.to_i + 1

をするとtypeeroorがでてしまいますなぜでしょうk?
117デフォルトの名無しさん:2007/05/06(日) 15:02:58
>>116
puts 'あなたの選んだ数字に1を足すと' , number.to_i + 1

これでどう?
118デフォルトの名無しさん:2007/05/06(日) 15:08:00
>>116
一番楽なのは
puts 'あなたの選んだ数字に1を足すと' + number.to_i.to_s + 1.to_s
もしくは
puts ['あなたの選んだ数字に1を足すと' ,number.to_i ,1].join
かな

String + Int はIntがデフォルトでStringには型変換してくれないからエラー
俺もまだ初心者だから内部動作まで詳しく知ってるわけじゃないけど

あとちゃんとエラー内容も貼れ & 読め
119デフォルトの名無しさん:2007/05/06(日) 15:09:37
>116
文字列は数値に対しての + の操作が定義されていないないから。to_sなどを
使って明示的に文字列化してやらないと + できない。

>117
それだと改行が入るのでは?


たぶんお手軽なのは、
puts "あなたの選んだ数字に1を足すと#{number.to_i+1}"
あたりじゃないかな。
120デフォルトの名無しさん:2007/05/06(日) 15:16:25
puts 'あなたの好きな数字を入力してね'
number = gets.chomp.to_i
result = number + 1
puts "あなたの選んだ数字に1を足すと#{result}"

これが一番真っ当
エラーが出る理由はみんなのレスのとおり「文字列 + 整数」ができないことによる
121111:2007/05/06(日) 15:16:28
>>115
ありがとうございます。 定数はメソッドで代用できるのでこれだけでも十分です。

……と思っていたのですが、これはインスタンスメソッドから呼べないですよね。
考えてみれば当然の事なんですが……、つまり要件定義が間違っていたと orz

自分の要求を自分でちゃんと理解できていなかったようです。
求めていたのは、正確にはクラス変数(@@変数)の定数版でした。
申し訳ありませんが、この場合についても、再度ご教示お願いします。
122デフォルトの名無しさん:2007/05/06(日) 15:37:39
>>121
要求に合うかな…
privateなクラスメソッドは、文字通りprivate_class_methodを使う。
123111:2007/05/06(日) 15:53:19
あれ? クラス変数が定数になったのと、自/サブクラスからしか呼べない
クラス定数とは、ほとんど同じものになるのかな。
そうすると答えは >>115 の通り無理?

>>122
ありがとうございます。調べてみます。
今からちょっと出かけるので、お返事は遅くなります。
124デフォルトの名無しさん:2007/05/06(日) 16:52:25
カルト洗脳言語
125デフォルトの名無しさん:2007/05/06(日) 17:02:41
カルト洗脳と言えばORACLE厨だな
あいつらひどすぎ
126デフォルトの名無しさん:2007/05/06(日) 17:41:26
神託という名前からしてヤバい
127デフォルトの名無しさん:2007/05/06(日) 17:50:01
Delphiを馬鹿にするなよ?
128デフォルトの名無しさん:2007/05/06(日) 18:13:06
そうだそうだ、あんまり馬鹿にしてると邪鬼眼使いのDelphiユーザに殺されちまうぞ。
129デフォルトの名無しさん:2007/05/06(日) 19:04:42
定数を返す関数を作れば
一応動作的には private な定数を作る事は出来る。
130デフォルトの名無しさん:2007/05/06(日) 19:14:27
>>115
class << self って、どういうこと?
131デフォルトの名無しさん:2007/05/06(日) 19:21:53
class Foo
private
 def foo
 end

 def bar
 end
end

としても foo と bar は private になるけど、
private :foo とか使ってる人は何か理由はあってそうしてるの?
132デフォルトの名無しさん:2007/05/06(日) 19:40:52
>>130
クラスメソッドをまとめて定義するときに使う

>>131
後で見るときにスクロールとかしないで一行で分かるからじゃないかな
133デフォルトの名無しさん:2007/05/06(日) 19:44:29
rubyっておらおらできないの?
134デフォルトの名無しさん:2007/05/06(日) 19:50:51
Rubyを使って素敵な彼女を取得するコードを教えてください(><
135デフォルトの名無しさん:2007/05/06(日) 19:52:42
現在のコード位置がprivateか否かを気にしなくて済むので private :foo を使う。
136デフォルトの名無しさん:2007/05/06(日) 19:57:53
クラスメソッドの定義の書き方をどうしようか、という話に似てるな
137デフォルトの名無しさん:2007/05/06(日) 20:19:28
全部に public/protected/private を付ければいいって話でもないのだろうか。
138デフォルトの名無しさん:2007/05/06(日) 21:21:57
>>134
それは難しいですね。
前科者のレッテルなら、大抵のコードで取得できるんですが。
139デフォルトの名無しさん:2007/05/06(日) 21:40:11
>>134
銀座の宝石店にでも連れて行け
一緒に行ってくれるとは限らないがw
140デフォルトの名無しさん:2007/05/07(月) 09:45:47
Dir.globで、専用ディレクトリから年月日の数字のファイル名を配列として得てた。
毎日ファイルは増えるんだが、「最新の日時のファイル名」を得るために
lastfile=Dir.glob("hogedir/200?????.dat")[-1,1]
とかやってた。

…ソートされたような順で取り出されてるとは限らないんだな。
これまでは数字の大きいのが配列の最後になってたんだが、
5月4日からなぜか5月4日のファイル(20070504.dat)がいつも最後に来るようになった。

変なとこに依存するコード書くのやめよう…。
141デフォルトの名無しさん:2007/05/07(月) 11:01:07
>>140
それじゃ「最新の日時のファイル名」じゃなくてそれだけを含む配列だろう。

> …ソートされたような順で取り出されてるとは限らないんだな。
ファイルシステム依存。
毎回違う順序でもなんら問題ないけど、セクタ内ではソートされてるけどセクタはソートされてないとかかね。
142デフォルトの名無しさん:2007/05/07(月) 12:44:20
Marshalの信頼性、耐障害性ってどんなもんですか?
掲示板の過去ログファイルに使えないかと検討しているんですが・・・
xmlをパースして、追加データをマージして、整合性をとって・・・は結構大変そうなのでMarshalが使えればと・・・
143デフォルトの名無しさん:2007/05/07(月) 12:50:23
>>134
extend Ko1
144デフォルトの名無しさん:2007/05/07(月) 12:56:35
>>142
正直言って、信頼性や耐障害性はそうとう低い。
Web掲示板のログみたいなものだったら、もっと別の手段を検討することをお勧めする。
145デフォルトの名無しさん:2007/05/07(月) 13:06:01
「元データ」を別に確保した上で「便利にアクセス可能な加工済みデータ」を保持するのに使うのが最上
元データからガリゴリやると3秒だがPStoreからにょろっと読み込むと0.5秒だとかそういうの

壊れる可能性や壊れたときの悲惨さは改行区切りのテキストファイルより悲惨
書き込み順番キーつきでコンマ区切りに保存して表示前に書き込み順にソートとか
そういう方法のほうが処理時間もCPU時間も使うが遥かにマシ
146デフォルトの名無しさん:2007/05/07(月) 16:49:32
>>120
話は若干ずれるんだけど、
sprintfとかprintfはRubyだとあまり使わないですか?

printf "あなたの選んだ数字に1を足すと%s",result

とか
これくらい単純だと確かにputsに式展開でいいかもとは思うんだけど、長くなったり
出力じゃなくて文字列を整形したい場合とかも多いからよくsprintf使うんだけれど、
遅かったりするのかなぁ、と思いまして


147デフォルトの名無しさん:2007/05/07(月) 16:55:55
整形する場合は普通に使うが。
148デフォルトの名無しさん:2007/05/07(月) 17:00:56
「Rubyたのしー」と言ってる人は "〜" と '〜' を平気で使い分けるので
sprintf でないとできない、あるいは遠回り大回りであるのなら別にフツーに使うと思われ

ただ表示するだけでは printf はまず使わないな
sprintf は % で代用する人が多いように見える
149デフォルトの名無しさん:2007/05/07(月) 18:35:50
ActiveRecordでサブクエリーすることってできないの?
150デフォルトの名無しさん:2007/05/07(月) 20:16:32
>>149
スレち



今んとこfind_by_sqlで直接書くしかないね
151デフォルトの名無しさん:2007/05/07(月) 20:56:48
>>142
xmlや独自形式以外にも、yamlやjsonといった手もある
152デフォルトの名無しさん:2007/05/07(月) 21:28:25
>>142
YAMLを使ってみてはどうだろう。
require 'yaml'
data = { 'key': 'data' } # 任意のデータ
puts data.to_yaml
日本語がバイナリとして認識されるという問題があるが、そもそもmarshalを使うつもりだったんだし問題ないだろう。
153デフォルトの名無しさん:2007/05/07(月) 22:50:28
rake 0.7.3 を WinXPで試しているのですが、
出力先ディレクトリを指定したくて、以下のようなスクリプトを書いてみたのですが、
rake aborted!
となってしまいます。
出力先を変更しないで(ちょうどmap!のところ)をコメントアウトすれば、動作してくれます。
このようなケースではどうするのがセオリーでしょうか?

OUTPUT_DIR = "output/"
SRCS = FileList["**/*.src"]
DSTS = SRCS.ext('dst')

DSTS.map! do |e| #
OUTPUT_DIR + e #
end #

task "default" => DSTS

rule '.dst' => '.src' do |t|
sh "SRC2DST.exe #{t.source} -o#{OUTPUT_DIR}"
end
154デフォルトの名無しさん:2007/05/07(月) 23:26:32
ruleでlamdaるのがセオリーじゃなかったけ・・・
155デフォルトの名無しさん:2007/05/07(月) 23:31:13
いや、違うな・・・
正規表現で、ruleでOUTPUT_DIR含めて指定すればよかったと思う。
で、lambdaで、srcをbasenameして指定する
156デフォルトの名無しさん:2007/05/07(月) 23:34:33
んー。手元のRakefileみたら、別にOUTPUT_DIR含めなくてもいいようになってたな・・・
わかんねーな・・・
157デフォルトの名無しさん:2007/05/07(月) 23:36:18
ああ、わかった。

OUTPUT_DIRとSRCSが対応してないからだ。
やはり、rule の srcをlambdaで、SRCSに関連付ける必要があるはず
158デフォルトの名無しさん:2007/05/07(月) 23:55:49
>>154-157
ありがとうございます。

lambda使ったことない厨房なんで、lambdaの使い方から調べる必要があるようです。
rule '.dst' => lambda{SRCS} do |t|
とやっただけだとやっぱりだめでした。

とりあえず、終電逃しそうなので帰宅後にlambda調べます。
159デフォルトの名無しさん:2007/05/08(火) 00:39:57
いや、SRCSだと全体じゃないかw

'.dst'と、どこの.srcかを関連付けないといけないとダメなはず
160デフォルトの名無しさん:2007/05/08(火) 00:41:50
あと、rake参考になるページ

Rake
http://www2s.biglobe.ne.jp/~idesaku/sss/tech/rake/index.html
161デフォルトの名無しさん:2007/05/08(火) 01:07:56
>>148
print("Hello, World!\n")
って書いたら
puts 'Hello, World!'
って書き直すのがRuby信者
162デフォルトの名無しさん:2007/05/08(火) 01:34:34
>>161
へー
163デフォルトの名無しさん:2007/05/08(火) 02:09:01
Javaで使えるYAMLクラスはありますか?
164デフォルトの名無しさん:2007/05/08(火) 02:20:07
あるかないかという問いなら「ある」が答え。
165デフォルトの名無しさん:2007/05/08(火) 02:22:28
ttp://journal.mycom.co.jp/articles/2006/11/24/json/004.html

スレ違いだから続きはあっちで
166デフォルトの名無しさん:2007/05/08(火) 02:23:49
167デフォルトの名無しさん:2007/05/08(火) 11:11:54
to_yamlが日本語がユニコードエスケープされる件については
RailsのPlug-inでyaml_wamlってのが解決してくれるよ
ttp://d.hatena.ne.jp/zariganitosh/20070117/1169007400

ソース読めば分かると思うけど、すべてのクラスのto_yamlメソッドを置き換えるもんだから
Railsからはずしても使えると思われ


168デフォルトの名無しさん:2007/05/08(火) 16:06:29
俺は puts format() をよく使う。
inspect も format で返すかな。

俺にはどうも "#{式}" は読みづらい。
単純に変数を埋め込むぐらいならいいが
式を書くなら俺は format("%s",式) するよ。
169デフォルトの名無しさん:2007/05/08(火) 16:21:14
まあ、表示結果は一緒だし好きなの使えって話なんだが禁句だな

>>168
「フォーマット文字列」が必要ない場合、普通に使うと %s だらけになるのがイヤ。超イヤ。
だいたい %s って何よ。「文字列です」以上の意味ないじゃん。お前の中身は何なのよ。
ケツの式の一覧を一対一で対応させていちいち数えて探せってか。首振って首つるわアホ。
その点 #{〜} 埋め込みならフクザツな式は直前で変数に入れれば解決。
しかも変数名ごと読めば読み下しやすい。完璧。超完璧。
170デフォルトの名無しさん:2007/05/08(火) 16:37:41
対応とか考えなくていいから、# の方が安全になるわな。
171デフォルトの名無しさん:2007/05/08(火) 17:14:56
Ruby以前に printf にどれだけ慣れてしまってるかどうかがかなり分かれ目かと思う
172デフォルトの名無しさん:2007/05/08(火) 17:19:32
#{ } 内が長くなるような場合は、事前に計算しとけばいいな。
173168:2007/05/08(火) 17:34:36
>169
引数多くなるような format なら、素直に文字列同士繋ぐよw

>171
俺はDelphi厨時代 + で繋ぐことしかしてなかった。
'文字列' + IntToStr(式) + '文字列' って感じね。
C言語とかやったこと無いから printf 書式は Ruby が初だよ。

"#{ }" が馴染めないのは…なんでだろ?
自分でもよく分からんが、ゴチャゴチャした感じを受けるんだよ…
174デフォルトの名無しさん:2007/05/08(火) 17:37:49
#{ } でまずいのは、国際化だな。
175134:2007/05/08(火) 17:43:14
>>139
ありがとうございます! でもダメでした
mvしようとしたら、permission deniedってエラーが出るんです・・・

>>143
これもエラーでした。Ko1が見つからないそうです
176デフォルトの名無しさん:2007/05/08(火) 20:49:51
>>174
うん、こくさいか
177デフォルトの名無しさん:2007/05/08(火) 20:53:58
>>173
IntToStr って、# よりゴチャゴチャしてるだろ・・・
178デフォルトの名無しさん:2007/05/08(火) 21:42:36
俺はエディタが色変えてくれるおかげか、#{ }はそんなにゴチャゴチャ
してるようには感じないが、色の変化がなければちょっとキツイかも
179デフォルトの名無しさん:2007/05/08(火) 21:45:26

       FOX★公認!!!

俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
http://wwwww.2ch.net/test/read.cgi/news4vip/1178602852/

1. ポーランド  139,797,680
2. チリ     137,040,439
3. ★日本    86,475,213★
4. イスラエル  80,930,530
5. スロベニア  57,137,042
6. フィンランド  40,857,499

石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である

・戦場
http://www.clickclickclick.com/default.asp
・まとめサイト
http://www33.atwiki.jp/clickvip/
180デフォルトの名無しさん:2007/05/08(火) 21:56:52
コピペ君って馬鹿だな、まで読んだ。
181デフォルトの名無しさん:2007/05/08(火) 23:12:54
ruby のif文って使いにくくないですか?
if ひとつにつき end を付けなきゃいけないから深く掘り過ぎるとend一つか二つ忘れる・・・
182デフォルトの名無しさん:2007/05/08(火) 23:28:55
Perl の if 文って使いにくくないですか?
if ひとつにつき } を付けなきゃいけないから深く掘り過ぎると } 一つか二つ忘れる・・・


そんくらいで使いにくいってあり得ないだろ。
というか、if 書いた時にはとりあえず対の end を書いてから、中身を書くもんだ。
183デフォルトの名無しさん:2007/05/08(火) 23:39:26
まあ、改行で区切る仕様でもよかったとは思う

endはエディタの支援機能で書く

endと書いてTabキーを押すとinvalid nestとか文句言われる
184デフォルトの名無しさん:2007/05/08(火) 23:42:06
そしてインデントで区別する仕様に(ry
185デフォルトの名無しさん:2007/05/09(水) 00:49:42
いまだに
if(){
}
って書いて実行時にあれ?って思うことが良くある
186デフォルトの名無しさん:2007/05/09(水) 01:05:18
稀に when と case を間違えるのは俺だけでいい
しかし

return << <<EOF
<html>
<title>やほー</title>
<h1>#{title}</h1>
</html>
EOF

とか

html <<EOB
<table>
<tr><td>テーブルだよ</td><tr>
</table>
EOB

とか書いてエラーに悩んでしまう人は俺以外にも居ると信じていいですか
187デフォルトの名無しさん:2007/05/09(水) 01:12:40
>186
いないとは言わないが敢えて言わせてくれ
このうっかりさん ( ゚∀゚)σ)∀`)
188デフォルトの名無しさん:2007/05/09(水) 01:20:18
<<-EOF
って書くようにしてるけど
189デフォルトの名無しさん:2007/05/09(水) 01:24:15
>>171
Ruby以前に10年Cプログラマをやってたおれがやってきましたよ。
Rubyでprintfとかほとんど使ったことありませんよ。だって#{}の方が便利だもの。
190デフォルトの名無しさん:2007/05/09(水) 01:24:19
なんでむりなんだろ
191デフォルトの名無しさん:2007/05/09(水) 01:24:32
>>169
ruby-gettextを入れると % が拡張されていろいろ便利になるよ。
標準にしてもいい気がするくらい。
192デフォルトの名無しさん:2007/05/09(水) 01:59:03
#とか{}や()って入力めんどくさくない?
printf("%d",a )とかのほうが楽で慣れてる。
193デフォルトの名無しさん:2007/05/09(水) 02:00:15
別に
194デフォルトの名無しさん:2007/05/09(水) 02:01:09
>>192
人によりけり
195デフォルトの名無しさん:2007/05/09(水) 02:03:11
>>192
> 慣れてる
自分で答言ってるじゃん
196デフォルトの名無しさん:2007/05/09(水) 02:49:22
>>192
ダブルクオートの中にカーソルがあるときに、
Ctrl+"を押すとエディタが#{}と出して括弧の中にカーソルを置いてくれるようにしている。
なので全然面倒じゃない。
197デフォルトの名無しさん:2007/05/09(水) 10:21:12
>>196
そのマクロ俺にも下さい!
198デフォルトの名無しさん:2007/05/09(水) 11:55:19
キーマクロとか
199デフォルトの名無しさん:2007/05/09(水) 12:20:33
"マクロ"じゃなかったりして
200デフォルトの名無しさん:2007/05/09(水) 12:34:35
とゆーか近似的には

 ・ 「Ctrl+Shift+2」(あるいは単にCtrl+2)のキー動作を常用から外す
 ・ C-S-2に「#{}の3文字を挿入しカーソル1個戻す」機能を振り分ける

ということをするだけで用が足りそうだが

#{}が有効な文字列の判別とか定義面倒そうだし、有効かどうかでC-S-2の動作が違うのは混乱しそうだ
201デフォルトの名無しさん:2007/05/09(水) 12:55:43
3ならわかるがなぜ2なんだ。
202デフォルトの名無しさん:2007/05/09(水) 13:36:43
>>201
どういう配列のキーボード使ってる?
203デフォルトの名無しさん:2007/05/09(水) 13:51:31
どっちもどっちだな

  " (ダブルクオーテーション)
相当の入力で挿入を開始するのも
  # (ナンバーサイン、いわゆる半角シャープ)
相当の入力で挿入を開始するのも
どっちもそれなりに道理にかなってる気がする
204デフォルトの名無しさん:2007/05/09(水) 14:23:59
bikeshedな議論は盛り上がるなあ
205デフォルトの名無しさん:2007/05/09(水) 14:32:41
閑話休題

俺は^2には括弧閉じ機能を割り当ててるな。
{foo("bar #{a■
 ↓
{foo("bar #{a■}")}

こんな感じ。

ところでRubyのbegin〜endってめちゃくちゃウザいよな。
エディタの支援があるならPython方式のほうがはるかに
優れているというのは一目瞭然だな。
206デフォルトの名無しさん:2007/05/09(水) 14:33:06
平和を愛して何が悪い(w
207デフォルトの名無しさん:2007/05/09(水) 14:49:13
P
y
t
h
o
n方式


左に戻ってこいよ


うまい言語仕様ってなかなかないもんだな
208デフォルトの名無しさん:2007/05/09(水) 15:30:03
begin〜endが嫌ってのはたまに言われるな
俺には理解できないが
209デフォルトの名無しさん:2007/05/09(水) 15:57:29
漏れも始めは嫌だったけど、慣れたなあ。
むしろ今はPythonみたいに閉まりがないのは嫌。
210デフォルトの名無しさん:2007/05/09(水) 18:01:35
Pascal/Delphiのbegin-endの羅列よりは全然マシだろ
あれはC言語の { } をそのまま begin end に置き換えたみたいな
(当然正確には違うんだが)書き方するからなぁ
211デフォルトの名無しさん:2007/05/09(水) 18:02:56
隔離スレでやれ
212デフォルトの名無しさん:2007/05/09(水) 19:52:40
moduleのクラス(?)メソッドを追加するときって必ず
def self.hogehoge
ってやらないといけないんですかね?

class << self
みたいな文法があればいいなぁ、と…
213MoonWolf ◆MoonWdLnkQ :2007/05/09(水) 19:52:51
Pythonのインデント方式は何個のネストを終了したかが分からなくなるから嫌い。
214212:2007/05/09(水) 19:54:30
すいません、moduleでもclass << selfいけました…o....rz
215デフォルトの名無しさん:2007/05/09(水) 19:56:49
記号の方が区切りが目に入りやすいんだよな。
だから end は俺も嫌い。
216デフォルトの名無しさん:2007/05/09(水) 20:13:57
そんな表示フォント依存の話を言語仕様に持ち込まれても困る
217デフォルトの名無しさん:2007/05/09(水) 20:28:23
フォントの問題じゃないだろー。
英文って似たような文字の羅列でどこも目立たないけど、
記号があると目立つだろ。
218デフォルトの名無しさん:2007/05/09(水) 20:51:13
おまいら
perlでも使っとけ
219デフォルトの名無しさん:2007/05/09(水) 20:52:48
あれは記号大杉
220デフォルトの名無しさん:2007/05/09(水) 20:57:09
lllllll|!1111|1111lll!l|1l1l1!l1|1


まあどうでもいいが
とりあえず{;]!|):}[(の見分けにくさは異常

いっそ |==> から始まって <==| で終わるとかして欲しい
221デフォルトの名無しさん:2007/05/09(水) 21:03:09
俺は ! の後には 1 つ空白入れるようにしてる。
222デフォルトの名無しさん:2007/05/09(水) 21:06:19
ふつーのブロックは begin - end でいいから、
せめて def と class と rescue のブロックの終わりは別な語にして欲しかった

end # each
end # if
return array
end # each
end # rescue
end # def
end # class

### ↑ class Hoge
### ------------------------
### ↓ HogeをUnyaするクラスUnya

とかコメント書いてて泣きたくなる
いやこのへんは俺が未熟なんだけど
223デフォルトの名無しさん:2007/05/09(水) 21:17:30
emacsとか使って、ちゃんとインデントしてれば問題ない
と思うけどなあ。
224デフォルトの名無しさん:2007/05/09(水) 22:04:35
どうでもいい話は、
学が無い奴等でも参加できるから
議論が活発になるってのは本当だよな。

「記号があると目立つだろ」、とか「人による」としか言えんことを
水掛け論的に言ってどうなるというのだろう。
225デフォルトの名無しさん:2007/05/09(水) 22:08:55
>>224
もしかして意味を見出せてないの??
226デフォルトの名無しさん:2007/05/09(水) 22:19:15

こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。
227デフォルトの名無しさん:2007/05/09(水) 22:28:38
学(がく)がある人(ひと)がどうしてruby初心者(るびーしょしんしゃ)スッドレにいるのか
俺(おれ)には理解(りかい)できない
228デフォルトの名無しさん:2007/05/09(水) 22:33:27
>>224
デザイン論を根底から否定する暴言ですな。
229デフォルトの名無しさん:2007/05/09(水) 22:37:37
>>224は学が有ったとしても空気が読めないvb厨にそっくり
230デフォルトの名無しさん:2007/05/09(水) 22:42:52
「学が無い奴等」というより
「まともな知能が欠如した奴等」の方が的確だな。
231デフォルトの名無しさん:2007/05/09(水) 22:44:23

こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。
232デフォルトの名無しさん:2007/05/09(水) 22:50:24
233デフォルトの名無しさん:2007/05/09(水) 23:01:53
どうでもいい話でしか参加できないからしょうがない。
234デフォルトの名無しさん:2007/05/09(水) 23:02:29
>>224から有益な議論を引き出せない奴らは屑
235デフォルトの名無しさん:2007/05/09(水) 23:57:27
ここは議論するスレというより
初心者の質問とそれに対する回答
もしくは質問を肴にした雑談
のスレでなかったのか
236デフォルトの名無しさん:2007/05/10(木) 00:00:53
超肴中
237デフォルトの名無しさん:2007/05/10(木) 00:06:38
hash[keyword] << word
ってなにやってるの?
<<て何よ?
238デフォルトの名無しさん:2007/05/10(木) 00:18:43
>237初心者らっさい
hashに配列が登録されててそれにpushしてるんだと思うぞ
239デフォルトの名無しさん:2007/05/10(木) 00:19:50
>>197
はいよー

(defun ruby-string-expand-expression ()
"Rubyの文字列中にカーソルがあれば#{}を挿入する。リージョンがあればそこを#{}で括る"
(interactive)
(let ((parens (if (eq 'font-lock-string-face (get-char-property (point) 'face))
'("#{" "}")
'("¥"" "¥""))))
(if mark-active
(progn
(if (> (point) (mark))
(exchange-point-and-mark))
(insert (car parens))
(exchange-point-and-mark)
(insert (cadr parens)))
(progn (insert (concat (car parens) (cadr parens)))
(backward-char)))))
240デフォルトの名無しさん:2007/05/10(木) 00:20:46
21世紀にもなってema糞はないだろう
241デフォルトの名無しさん:2007/05/10(木) 00:22:39
いやあるよ。便利だもん
242デフォルトの名無しさん:2007/05/10(木) 00:22:39
21世紀はVimだよな!Vim7さいこおおおおおおおお
243デフォルトの名無しさん:2007/05/10(木) 00:26:03
お、7 出たのか?
244デフォルトの名無しさん:2007/05/10(木) 00:28:00
>>237
そんなあなたに irb
irb上で試せばいろいろわかるぞ

irb> h=Hash.new
irb> h['hoge'] << 'test'
NoMethodError: undefined method `<<' for nil:NilClass
from (irb):2
irb> h['hoge'] = 'nya'
=> "nya"
irb> h['hoge'] << 'test'
=> "nyatest"
irb> p h['hoge']
"nyatest"

ということで「ハッシュhashのkeywordの値に適当に<<して更新してる」模様
245デフォルトの名無しさん:2007/05/10(木) 00:36:01
<<だけでハッシュの中身が追加更新されるのはなんかキモいな
いやとても便利だが

>>243
Vim7はちょうど1年前に出てる
ただいま醸成中
なんかね、どんどんデカくなってな
246デフォルトの名無しさん:2007/05/10(木) 00:44:31
Vimって前に使おうと思ったことあるけど、マクロで任意の位置の文字列を取得する方法がわからなくて挫折した記憶がある。
247デフォルトの名無しさん:2007/05/10(木) 00:48:19
間違って入力したらいちいちEsc押してコマンドモードに戻してxとか押さなきゃいけないのが面倒でメイン化挫折してる(全く使わないわけではない)
最近のは挿入モードでもBackSpaceとか平気で効くけどな
248デフォルトの名無しさん:2007/05/10(木) 00:49:28
vi と vim は別物だぜ。
vi はイマイチ。vim 最高。
249デフォルトの名無しさん:2007/05/10(木) 01:59:38
両方試して自分はemacsが好きなんだけど、
最近はvim派が多いのかな?
250デフォルトの名無しさん:2007/05/10(木) 07:03:08
先生! xyzzyはemacs派に含まれますか?
251デフォルトの名無しさん:2007/05/10(木) 12:19:12
レンタルサーバでRubyスクリプトのCGIを動かしてます

メモリ内に大きなデータを保持してる時間をなるべく減らしたいなと思い

def メイン
html = ネットにあるでかいHTML
data = htmlをparseしたハッシュ
html = ''

htmlを参照しないごっつい処理
htmlを参照しない手間のかかる処理
htmlを参照しないめんどくさい処理

return 何か #終了
end

などと「途中で大きなデータの参照先を明示的に空」にしてるんですが

・ データ保持時間短縮という点で一応意味はある
・ 気休めにもならないし読みにくいからやめとけ
・ 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん

など意見お願いします
252デフォルトの名無しさん:2007/05/10(木) 13:21:27
>251
htmlの処理とhtmlを参照しない処理の
メソッドを分ければ、気にする必要なくなると思うが
253デフォルトの名無しさん:2007/05/10(木) 13:27:46
メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな
そりゃ空文字列指定すれば回収までの数瞬の間は軽くなれるとは思うが
254デフォルトの名無しさん:2007/05/10(木) 13:34:36
>メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな
そうだっけ?
255デフォルトの名無しさん:2007/05/10(木) 13:43:29
>254
否。

$n = 1343

def foo
  s = "." * $n
end

def print
  ObjectSpace.each_object{|o|
    if o.is_a?(String) && o.length == $n
      puts "found"
      return
    end
  }
  puts "not found"
end

print # not found
foo
print # found
256デフォルトの名無しさん:2007/05/10(木) 13:45:37
「回収対象になる」が正確かも
実際に収集車が回収しにくるのは回収日
257デフォルトの名無しさん:2007/05/10(木) 13:54:54
空白文字列代入するのもゴミ袋を交換して
ゴミ出して回収待ちってとこだよな
258デフォルトの名無しさん:2007/05/10(木) 13:59:16
ゴミの袋の数は変わってないけど、
ゴミの大きさはコンパクトになって部屋なりご近所なりを圧迫することがなくなってるはず
という主張なんじゃね、最初の話は
259デフォルトの名無しさん:2007/05/10(木) 14:07:40

def make_str
puts "making now..."
return 'hoge'
end

str=make_str

p str
p str

strはmake_strを「指してる」以上、make_strはstrが使われるたびに毎回動くべきで
この場合"making now..."は2回表示されるべきだと感じます
たすけて
260デフォルトの名無しさん:2007/05/10(木) 14:16:23
>>259
勝手に「べき」とか思わないように。

str=make_str は、「make_strメソッドを呼び出してその返却値をstrに代入する」という意味なので、その後何回strを参照しようがmake_strはもう呼ばれない。
261デフォルトの名無しさん:2007/05/10(木) 14:47:15
>>259
1回しか動かないのは、"1回目"の = で str が指すオブジェクトが確定してる(make_str で return されるもの)から
と考えるのはどう。

確かに「参照の矢印のようなもんである」という考えだけで字面を遡ると make_str を再度呼ぶようにも見えなくはない。
str は make_str で、その make_str は上に書いたヤツだから。
262デフォルトの名無しさん:2007/05/10(木) 14:47:17
>>251
> 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん
が正解だと思う
それならわざわざ空白文字代入する必要もないしな
263デフォルトの名無しさん:2007/05/10(木) 14:58:13
>>262
メモリ占有を考えるなら「空データで上書きする」意味はあるようにも思うけど…どうだろ

まあどっちにしても上書きはパラノイアっぽいな
小さいメソッド内のローカル変数で完結させてGCの回収対象にしておく、というのがふつーの対処法なのかも
264212:2007/05/10(木) 17:36:46
>>259
str=make_str

str=make_str()
は等価だと思うんだが
265デフォルトの名無しさん:2007/05/10(木) 17:38:25
あら、残ってた…o...rz
266MoonWolf ◆MoonWdLnkQ :2007/05/10(木) 18:21:42
空データなら''よりもnilのほうが軽くない?
267デフォルトの名無しさん:2007/05/10(木) 18:39:29
有為な差はないと思うけど、nilのほうが「変数をクリアしました」という感じがでるので好き。
できればRubyにも undef みたいなのがあるといいんだけど。
268デフォルトの名無しさん:2007/05/10(木) 20:28:06
p がオブジェクトの中身を参照する命令だとすると
p str で strの中身 hogeが表示される、と。

もし str = make_str で strが関数オブジェクトとして扱われると
仮定すると(なんかjavascriptみたい)、p str で表示されるのは
make_strという関数オブジェクトの中身が表示されるはず…。

それをさらに飛躍(蛇足?)させて
p str で関数を呼び出せるのはとてもイレギュラーな命令のように感じます。

ruby だと p は、基本的にオブジェクトの中身を参照する命令と
考えればおkみたいなかんじですか?とか聞いてみたり。
269デフォルトの名無しさん:2007/05/10(木) 20:32:40
なんか日本語が変だなっと orz
270デフォルトの名無しさん:2007/05/10(木) 21:19:24
str = make_str を「strというキーワードでmake_strを"起動"した値を返す」と読めばいい

もし右辺が変数なら変数内容を"起動"するわけ
なんかめんどくさくなってきたからどうでもいいや


要は参照先が"定まった値を持たない"メソッドであるのが引っかかるんだろ
strが参照されるたびに「参照先のメソッドの返り値はhogeです」と動作すると思えると
271デフォルトの名無しさん:2007/05/10(木) 21:45:34
CGI.escapeをするとhttp://のスラッシュの部分までエンコードされてしまって
IEが勝手にhttp://を付け足してhttp://http%3A%2F%2F ...と言う風になってしまいます。

一般的にURLエンコードする場合って言うのはどういう場面なんでしょうか?
はてなブックマークとかも日本語をエスケープしてるくらいでURLエンコードしてないように見えるのですが。。。
根本的なところが分かってないので使い場所を間違っている気がしてきました…。
今のところはhtmlescapeと同じように手当たり次第にやってます
272デフォルトの名無しさん:2007/05/10(木) 21:50:32
URL全体をエスケープするんじゃなくて、cgiに渡すパラメータだけエスケープするんだよ。
273デフォルトの名無しさん:2007/05/10(木) 22:26:55
>>270
str=make_str() # 関数呼び出し making...表示 返り値hoge格納
p str # オブジェクト表示、hoge表示
p str # オブジェクト表示、hoge表示

すみません。もの凄く初歩的なことを難しく考えすぎてた
だけみたいでした。ありがとうございました!
274デフォルトの名無しさん:2007/05/10(木) 22:39:39
>>271
CGI.escapeは引数をすべてエンコードする(用途が違う)
いわゆる日本語入りURLを簡単に作りたいのならURI.escape使え

irb> str='オブジェクト指向'
irb> URI.escape("http://d.hatena.ne.jp/keyword/#{str}")
=> "http://d.hatena.ne.jp/keyword/%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE"
irb> CGI.escape("http://d.hatena.ne.jp/keyword/#{str}")
=> "http%3A%2F%2Fd.hatena.ne.jp%2Fkeyword%2F%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE"

strの文字コードによってエスケープ後の表記が違うから気つけろな(上記は日本語EUC)
275237:2007/05/11(金) 00:00:52
>>238
>>244
レスありがとうございますにゃん
おかげで助かりました
動作は自分でもソース書いて確認しました

が、これいったいドキュメントのどこ読んで勉強すりゃいいんでしょ?
演算子の項目みてもそれらしい説明無いし
276デフォルトの名無しさん:2007/05/11(金) 00:15:44
一つ質問があるのですが、
rubyで他の言語のsubstringみたいなのはありますか?
277デフォルトの名無しさん:2007/05/11(金) 00:29:25
「他の言語のsubstring」ってのが具体的にどういう動作を期待してるのか
今一分からんが
例えばJavaScriptのString#substring()については
String#[s...e]
が近いかな

//JavaScript
"abcde".substring(1,3) == "bc"

# Ruby
"abcde"[1...3] == "bc"
278デフォルトの名無しさん:2007/05/11(金) 00:30:14
str[first, len]
str[first..last]
str[first...next]
str.slice(上に同じ)
str.slice!(上に同じ)
279デフォルトの名無しさん:2007/05/11(金) 00:30:34
>>275
「標準ライブラリ」内の「組み込みクラス」の項を参照
数値・文字列・配列・ハッシュなどの基本的な振る舞いは、ここを見ればだいたい分かる

>>276
とりあえずStringのメソッドを片っ端から探し回ると吉
280237:2007/05/11(金) 00:53:24
>>279
ありがとサンクスベロマッチェですにゃん
Kernelもっと理解しとかなきゃダメだな
281デフォルトの名無しさん:2007/05/11(金) 01:21:42
今日はスレッドの勉強をしようと思う
282デフォルトの名無しさん:2007/05/11(金) 10:05:07
そうか
283デフォルトの名無しさん:2007/05/11(金) 10:07:25
すれでどうした
284デフォルトの名無しさん:2007/05/11(金) 10:10:24
>>282
モルモンです
285デフォルトの名無しさん:2007/05/11(金) 14:35:08
だれが上手いこと言えといった
286デフォルトの名無しさん:2007/05/11(金) 14:42:27
puts '文字列を入力してください'
x = gets.chomp
puts '入力された文字列は「' + x + '」です'


文字列を入力してください、と表示させてからコンソール入力をさせたいのですが、
その前にコンソール入力になってしまいます。
これはどのように解決したらよいのでしょうか?
287デフォルトの名無しさん:2007/05/11(金) 14:52:28
>>286
$stdout.flush を gets の前の行に。
288286:2007/05/11(金) 15:03:00
>>287
解決しました
ありがとうございます
289デフォルトの名無しさん:2007/05/12(土) 19:15:48
「プログラミングRuby」のうさぎ本のほう持ってるんだけど、
改訂版(2分冊のほう)になってどれぐらい良くなったの?
290デフォルトの名無しさん:2007/05/13(日) 08:40:07
>>186
これって、何が悪いの?


291デフォルトの名無しさん:2007/05/13(日) 08:48:50
>>290
最初のやつ:returnは制御構造なので<<演算子を適用できない。

次のやつ: htmlは多分変数でメソッドではない。このとき、
     この式は変数htmlに
          html "baka"
     と書くのと(文字列の中身を覗いて)等価だ。
292デフォルトの名無しさん:2007/05/13(日) 09:50:36
ヒアドキュメント「<<EOF」が「次行からEOFまでを返す式」のように機能するということを失念した誤りだな
っていうか << と同じ記号使ってなおかつ間に空白があるかないかで動作が違うなんて極悪だ
293デフォルトの名無しさん:2007/05/13(日) 11:08:27
つまり、
 html << <<EOB
か、
 html = <<EOB
ならおkっつーことですね。
294デフォルトの名無しさん:2007/05/13(日) 19:36:40
  open(file) do |f|
    while s = f.gets.chomp
      
    end
  end

だとエラーが出ます。
 in `test': private method `chomp' called for nil:NilClass (NoMethodError)

以下の一行だとうまくいくのに何ででしょう?

 puts f.gets.chomp

ところで、

 f.gets.class

するとStringなのになぜ?
295デフォルトの名無しさん:2007/05/13(日) 19:37:47
>>294
に関連してなのですが、

Rubyで、ファイルを読み込んで一行ずつ処理する定石って他にはありませんか?

逆引きRubyには、>>294のchompなしのが書いてありました。
296デフォルトの名無しさん:2007/05/13(日) 19:38:23
ファイルを最後まで読み切った以降は、f.getsがnil返すからだろ。
297デフォルトの名無しさん:2007/05/13(日) 19:39:33
IO.foreachでもつかってろ
298デフォルトの名無しさん:2007/05/13(日) 19:45:25
>>295
IO#each_lineかな
299デフォルトの名無しさん:2007/05/13(日) 20:36:23
ARGV.each
だっけ?で大概間にあうな
300デフォルトの名無しさん:2007/05/13(日) 21:11:13
>>296
あ、そっかー!ワカタ

>>297
IO.foreachは短くてよいですね。

IO.foreach("log.txt") do |s|
  puts s
end

>>298
IOオブジェクトを取得していた場合は、IO#each_line=IO#each使うということで・・・

open("log.txt") do |file|
  file.each do |s|
    puts s
  end
end

>>299
301デフォルトの名無しさん:2007/05/13(日) 21:12:06
間に合うも何も動作違うんだから
無目的にコピペして動かんとか文句垂れずに用途に合わせて利用して終了検知しろよ
302MoonWolf ◆MoonWdLnkQ :2007/05/13(日) 21:19:42
>>295
IO#eachとかwhile text=io.getsかな。

>>299
ARGF.each

自動的にchompしてくれる奴が欲しいなぁ。
303デフォルトの名無しさん:2007/05/13(日) 21:42:28
ARGF.each do |line|
line.chomp!
end
でどうよ
304デフォルトの名無しさん:2007/05/13(日) 22:05:35
リファレンスの Hash.new {|hash, key| ...} のサンプルの
「# ブロックを使うとうまく行く」は h = Hash.new {"foo"} ではだめ?
いきなりあんなことされても意味が全然わかりません.
305デフォルトの名無しさん:2007/05/13(日) 22:50:42
>>303
それがやだ、という話だと思った。そんな我が儘言われてもとは思うけどw
306デフォルトの名無しさん:2007/05/13(日) 23:01:50
>>304
えーと、どこから説明していいものか。ちょっと複雑になるけど説明してみる。

まずその例は値を与えていないハッシュのキーに初期値を与えたいってことだよね。
んで初期値を整数にしたいときはh = Hash.new(0)でできる。このとき、
h[1]=0とか代入しなくてもh[1]は0になる。ここまではいいね?

では初期値として"baka"(文字列)を与えてみたらどうなるか。

 h2 = Hash.new("baka")
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "bakashine" ??? "baka"ではないの?

ということになる。それぞれの初期値は同じインスタンスを指しているためにこういったことが起こる。
これは直感に反する動きなのでそれを解決するためにブロックを渡せるようにした。

 h2 = Hash.new{|h, k| h[k] = "baka"} # その都度新しいStringオブジェクトを生成して代入
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "baka"

というわけ。ややこしいけど。

307MoonWolf ◆MoonWdLnkQ :2007/05/13(日) 23:20:06
ハッシュへの代入は必須じゃないからね。
ブロックの評価した値が戻り値になる。
たまに複数行のブロック書いて、それを忘れてはまる。
308デフォルトの名無しさん:2007/05/13(日) 23:20:54
ここ読んでて仕事思い出したわ
逝ってくる
309304:2007/05/13(日) 23:43:38
>>306
その機能を実現するだけならば, 単に h2 = Hash.new {"baka"} で可能ですよね.
ブロック引数 key, hash を持ち出すならば, 本質的に引数を必要とするような,
もう少し複雑な例を別にリファレンスに提示すべきと思ったのです.
310デフォルトの名無しさん:2007/05/13(日) 23:46:02
>>309
可能ではないです。コード列の最初の例はかなり直感に反すると思いますがいかがですか?
h[1]に破壊的メソッドを適用したら、なぜかh[2]も変わってしまうんですよ。

# いや、べつに「なぜか」はわかっているんだけども
311デフォルトの名無しさん:2007/05/13(日) 23:47:47
>>309
あ、ごめんなさい。言っている意味を取り違えていました。
たしかに固定の文字列だけを与えるのであればそれでもいいでしょうが、
せっかくブロックを取るのであればもっと汎用な形の方がいいんじゃないすかね。
この場合ハッシュとキーが渡ってくればなんかいろいろできそうじゃないっすか。
312デフォルトの名無しさん:2007/05/14(月) 00:05:48
こんな感じとか?

nickname = Hash.new{|h, k| h[k] = k}
nickname['浜崎伝助'] = 'ハマちゃん'
nickname['鈴木一之助'] = 'スーさん'
p nickname['浜崎伝助']
p nickname['佐々木和男']
313デフォルトの名無しさん:2007/05/14(月) 00:41:20
>305
こんなんでどう。
class IO
def each_line2()
self.each_line {|line| yeild(line.chomp) }
end
end
314デフォルトの名無しさん:2007/05/14(月) 00:43:50
h = Hash.new{"baka"}
p h[0].object_id
p h[0].object_id
p h[0].object_id

h = Hash.new{|x, k| x[k] = "baka"}
p h[0].object_id
p h[0].object_id
p h[0].object_id
315304:2007/05/14(月) 01:02:57
>>314 俺は1つ目の動作で無問題と思っていたけれど,
ハッシュのあるべき姿は2つ目の動作ということ? なら仕方ない.
>>312 は思い出にしまっておきます. お返しにこれ.
files = Hash.new {|h,path| h[path] = File.open(path, 'w') }
316デフォルトの名無しさん:2007/05/14(月) 13:28:33
>302-303 >305 >313
io.read.split($/).each {|line| ... }
というのはどうだろう。でかいファイルにはあまり使いたくないが。
317デフォルトの名無しさん:2007/05/14(月) 21:24:26
>>316
つ 富豪的プログラミング
318デフォルトの名無しさん:2007/05/14(月) 22:06:13
>>316
io.readlines.each {|line| ... } に短縮できるよ
319デフォルトの名無しさん:2007/05/14(月) 22:50:06
>>318
chompが抜けてる。
320デフォルトの名無しさん:2007/05/14(月) 23:12:18
そのへんはブロックのなかでなんとかするんだろ
321318:2007/05/14(月) 23:15:50
>>319-320
すまん、IO#readlinesが改行ごと返すの忘れてたんだ
322デフォルトの名無しさん:2007/05/15(火) 11:56:52
関数内でincludeしているソースを見かけたのですが、これって何をしてるんですかね?
ただ単に遅延評価(?)でその関数が呼ばれたときにMix-inされる
っていうだけなのか、Mix-inされている期間がその関数内だけなのか

そもそもなんか気持ち悪いですね。。
323デフォルトの名無しさん:2007/05/15(火) 12:01:41
>>322
関数外の名前空間を汚さずに、そのincludeされたmoduleのメソッドを使えるじゃん
324デフォルトの名無しさん:2007/05/15(火) 12:33:55
関数って何で(略

めったに使用されないメソッドでしか使わないものを
そのメソッド内でrequireやincludeすることはある
普段の起動時に読まないぶん普段の動作が若干速くなったと思い込んでるが効果のほどはよくわからん
325デフォルトの名無しさん:2007/05/15(火) 12:34:41
>>323
includeはメソッドローカルじゃねえ
326デフォルトの名無しさん:2007/05/15(火) 14:10:32
VS.Net 2005 でビルドした ruby 1.8.6 を C++ のプログラムに組み込もうと思ってる
んですが、うまくいきません。
どーも Socketを使おうとするとdllとかのビルド環境違いでこういう問題(?)が起こる
ようですが、手元の ruby は手元の VS.Net 2005 でビルドしたもので、原因がわから
ず……。Net::HTTP などが使えません。

ruby 1.8.6 は VS2005 のコマンドプロンプトから configure.bat, nmake, nmake install
でビルドし、C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を
全部 exe ファイルがあるディレクトリに突っ込んであります。

// TEST.cpp :

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")

int main (int argc, char **argv)
{
   ruby_init ();
   ruby_init_loadpath();
   rb_eval_string("require 'net/http'");
   rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
   return 0;
}
327デフォルトの名無しさん:2007/05/15(火) 14:11:15
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\de
bug>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/de
bug/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents/V
isual Studio 2005/Projects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `initializ
e': getaddrinfo: non-recoverable failure in name resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `open'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/timeout.rb:48:in `timeout'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/timeout.rb:76:in `timeout'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:553:in `do_start'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:542:in `start'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:374:in `get_response'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from (eval):0
328デフォルトの名無しさん:2007/05/15(火) 14:33:26
ruby-win32って2005でコンパイルできるようになったのか・・・
俺が試した時は、できなくて、諦めたんだが
329デフォルトの名無しさん:2007/05/15(火) 14:34:18
>>326
さすがに、DLLだけしかおいてないってことはないよね?
330デフォルトの名無しさん:2007/05/15(火) 14:50:38
>>328
1.8.6 で(?)入ったそうです。1.8.5 はビルドできませんでした。

C:\Program Files\ruby\bin>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32_80]

>>329
え? DLLとlib/以下しか置いていませんが……。
何か他に必要なんでしょうか?

あ、あと関係ないかもしれませんが、プロジェクトのプロパティで
C/C++全般の「追加のインクルードディレクトリ」に ruby のソースがある場所:
"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6\win32";"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6"

リンカ全般の「追加のライブラリディレクトリ」にインストールしたrubyの場所:
"C:\Program Files\ruby\lib\ruby\1.8\i386-mswin32_80";"C:\Program Files\ruby\lib"

を指定しています。
331デフォルトの名無しさん:2007/05/15(火) 15:08:59
>>326
普通にそのrubyで
require "net/http"
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'
というスクリプトを実行したらちゃんと動きますか?

それから、関係あるかどうかわかんないけど、そのTEST.exeのrelease版を作って試したらどうなりますか?
332デフォルトの名無しさん:2007/05/15(火) 16:43:53
libは入っているか・・・

前に、結局使わなかったんだけど、VC2003でコンパイルしたときに、
/MTとか/ML指定している(つまり、MSVCRTのDLLなしにすると)と、挙動不審になった
その時も、net関連が動かなかったような
333デフォルトの名無しさん:2007/05/15(火) 17:19:24
>>332
今はそれやるとconfigure.batでエラーになると思う。
334326:2007/05/15(火) 19:53:35
>>331

ruby 単体では、

C:\Program Files\ruby\bin>type test.rb
require 'net/http'
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'

C:\Program Files\ruby\bin>ruby test.rb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Oops! The page you were looking for could not be found.</title>
    <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
    <style type="text/css">
# snip

のように、普通に動いています。

後、releaseにしてプロジェクトのプロパティを同じにしてビルドしてみたところ、
ruby が SEGV してしまいました。
335326:2007/05/15(火) 19:57:00

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents
/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `initi
alize': getaddrinfo: non-recoverable failure in name resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `open'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/timeout.rb:48:in `timeout'
<snip>
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from (eval):0
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]


This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>

ruby のビルドの仕方がおかしいのでしょうか。>>326で言ったとおり、
特に変わったことはしていないのですが……。
336デフォルトの名無しさん:2007/05/16(水) 00:33:33
>>334
> 普通にそのrubyで
337326:2007/05/16(水) 01:04:55
>>336
こういうことでしょうか?

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")


int main (int argc, char **argv)
{
    ruby_init ();
ruby_init_loadpath();
rb_eval_string("require 'test'");
/*
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
*/
    return 0;
}
338326:2007/05/16(水) 01:06:43
<snip>
2007/05/16  01:00            40,960 TEST.exe
2007/05/16  01:00           315,220 TEST.ilk
2007/05/16  01:00           429,056 TEST.pdb
2007/05/15  08:38    <DIR>          lib
2007/05/14  22:06           663,552 msvcr80-ruby18.dll
2007/05/15  19:38                76 test.rb
<snip>

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>type t
est.rb
require 'net/http'
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>TEST.e
xe
(eval): C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/debu
g/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: non-recoverable failure in na
me resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST
/debug/lib/ruby/1.8/net/http.rb:560:in `open'
<snip>
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST
/debug/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from ./test.rb:2
        from (eval):0:in `require'
        from (eval):0
339デフォルトの名無しさん:2007/05/16(水) 01:14:14
つかエラーメッセージ見る限り
C版では名前解決できてないんだよなこれ
www.ruby-lang.orgをIPアドレスにしたらどーなるんだろう
340デフォルトの名無しさん:2007/05/16(水) 01:30:51
>>326
「そのruby」ってのはmsvcr80-ruby18.dll作ったときに一緒にできてるはずの
ruby.exeで、ってことだ。
341デフォルトの名無しさん:2007/05/16(水) 01:38:07
RubyでDLLは作成出来ますか?
342デフォルトの名無しさん:2007/05/16(水) 09:49:33
RubyはDLLにコンパイルされてるよ。
343デフォルトの名無しさん:2007/05/16(水) 13:18:55
出来ない
344326:2007/05/16(水) 14:34:33
>>340
>>339
221.186.184.68にして試してみましたが、rubyでのエラーメッセージが表示されるよりも前にデバッガに落ちてしまうようです。
release版だとこんな感じです。

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\release>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]

>>326で書いたとおり、msvcr80-ruby18.dllはProgram Files\ruby\bin\からぱくってきているのです……。

345デフォルトの名無しさん:2007/05/16(水) 17:28:15
> C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を
> 全部 exe ファイルがあるディレクトリに突っ込んであります。

見落としていた。
つまり、公式配布のwin32版のDLLってこと?
346326:2007/05/16(水) 19:25:41
>>345
公式配布(というか、配布されているものはほとんど)vc6でビルドされていますが、
それだと組み込みを行った時に"MSC version unmatch"とVS.NETに怒られるので、
VS.NET 2005 で独自にビルドしたものを使っています。それがProgram Files\ruby
に入っており、そこからコピーしたものを組み込もうとしています。
347デフォルトの名無しさん:2007/05/16(水) 19:41:00
そんだけバラバラで動くほうが奇跡だな
348デフォルトの名無しさん:2007/05/16(水) 20:30:43
win32版は、ruby_init以外に
NtInitializeを呼ぶ必要がある。
349326:2007/05/16(水) 21:45:23
>>348
すばらしい!ありがとうございます!

TEST.cpp を

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")


int main (int argc, char **argv)
{
    ruby_init ();
ruby_init_loadpath();
NtInitialize(&argc, &argv);
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
    return 0;
}

のようにしたところ、問題なく取得できました。
重ねて、ありがとうございました。
350デフォルトの名無しさん:2007/05/16(水) 22:06:07
>>349
> ruby_init ();
> ruby_init_loadpath();
> NtInitialize(&argc, &argv);

順序逆だろ。
351デフォルトの名無しさん:2007/05/16(水) 22:09:30
>>349
おお!動いてよかったね
352326:2007/05/16(水) 22:15:06
>>350
orz。不勉強で申し訳ない。適当に入れたら動いてしまったので思わず興奮して
書き込んでしまいました。重ねて、ありがとうございました。

>>351
ありがとー。
353デフォルトの名無しさん:2007/05/17(木) 01:42:01
えとぉ…毎度初心者ですまないんだが、クラスメソッドってありますやん?
オブジェクトを生成せずにメソッドだけ強制的に実行するわけですよね?(誤解してるかもしれないけども)
んで、それってさ、つまり初期化されて無いって事は、そのクラスメソッドがいくら長くなろうとも、似たルーティンがあろうとも、そのクラス無いの別メソッドを呼び出しできないって事なのん?
こんな感じに書いたんですが…
class Hoge

def a
return 1
end

def Hoge.hoge()
num = a
return num
end

end

obj = Hoge.hoge
354デフォルトの名無しさん:2007/05/17(木) 05:04:12
class Hoge
  class << self
    def a
      return 1
    end

    def hoge()
      num = a
      return num
    end
  end
end

obj = Hoge.hoge
355デフォルトの名無しさん:2007/05/17(木) 06:07:24
>>353
初期化されてないも何も、クラスメソッドはそのクラスオブジェクトの特異メソッドであって、
インスタンスのメソッドじゃないよ。

つってもわからんか…。

Hoge.hoge()

の例で行くと、Hogeがクラスオブジェクト(Classクラスのインスタンス)なんですよ。
Hogeがオブジェクトなんです。Hogeはどのクラスに属しているかというと、
p Hoge.class #=> Class
ということになります。リファレンスマニュアルを開くとわかると思うけど、
Classというクラスが存在しています。で、HogeはそのClassクラスのインスタンスというわけです。
で、hogeは何かというと、オブジェクトHogeの特異メソッドというわけです。
Hogeというオブジェクトのメソッドだから Hoge.hoge() と呼ぶわけです。
実際にhoge()の中でp self.classと1行加えると「Class」と出力されるでしょう。

ここでメソッドaは何かというと、クラスHogeの(インスタンス)メソッドです。
なのでメソッドaを呼ぶにはHogeオブジェクトが必要になります。
ここで、メソッドaの中で p self.classと1行加えて、
たとえばHoge.new.aとやると「Hoge」と出るはずです。

というわけで、インスタンスメソッドとクラスメソッドは全く異なるクラスに属しているということになります。
なので呼べません。
356デフォルトの名無しさん:2007/05/17(木) 09:15:48
この場合はむしろ
「なぜ普段メソッド内でaという関数なカタチでメソッドを呼べるのか」
ってとこから理解深めたほうが
357デフォルトの名無しさん:2007/05/17(木) 11:07:07
ああ!!なるほd・・・・・あぁ?
すまん、354のソースもお手数ですが解説いただけないか。。。
358デフォルトの名無しさん:2007/05/17(木) 11:32:57
Rubyは << にいろいろな意味負わせすぎで困る
359デフォルトの名無しさん:2007/05/17(木) 12:00:44
Javaだとnewでインスタンスを作らせたくないクラスはコンストラクタを
privateにする事でできるのですが、Rubyでinitializeメソッドを
private指定にしてもnewできてしまいました。

newからインスタンスを作る事を禁止するスタンダードな方法ってありますか?
360デフォルトの名無しさん:2007/05/17(木) 12:54:15
>>358
C++のインスパイアです。
361デフォルトの名無しさん:2007/05/17(木) 13:01:21
>>359
newをprivateにする

class Hoge
  class << self
    private :new
  end
end
362デフォルトの名無しさん:2007/05/17(木) 13:02:17
というか、インスタンスを作らせたくなくないならクラスにしなきゃいいと思うけど。
363デフォルトの名無しさん:2007/05/17(木) 13:02:54
>>359

class Hello
  def initialize
    puts "OK"
  end
end

Hello.new    #=> OK

class << Hello
  private :new
end

Hello.new   #=> NoMethodError: private method `new' called for Hello:Class
364デフォルトの名無しさん:2007/05/17(木) 13:18:46
しかし、>>363の続きに

class << Hello
 public :new
end

と書けてしまうから、privateにする甲斐もあまりないな。
365デフォルトの名無しさん:2007/05/17(木) 13:20:21
>>357
>>354のメソッド定義は、こう書いたのとほぼ同じ

class Hoge
def Hoge.a
return 1
end

def Hoge.hoge()
num = a
return num
end
end

obj = Hoge.hoge

つまりaとhogeは、両方ともクラスメソッド

>>359
ClassじゃなくてModule使うんじゃダメなの?
366デフォルトの名無しさん:2007/05/17(木) 15:32:16
「インスタンスを作らせたくない」って異常だよな
自動でインスタンス作る機構でも入れてんだろか
367デフォルトの名無しさん:2007/05/17(木) 15:37:46
別に異常ってことはないだろ。
てかJava知らん奴が無駄に突っかかるなと。
368デフォルトの名無しさん:2007/05/17(木) 16:07:32
GoF4のデザインパターンまわりにインスタンスを作らせたくない
ケースはごろごろありそうだけど。
369デフォルトの名無しさん:2007/05/17(木) 16:47:00
要するにJavaの言語仕様上の要求から出て来るだけで、Rubyだとほとんど意味
をなさないパターンだな。

一応singleton.rbというのもあるけど。
370デフォルトの名無しさん:2007/05/17(木) 16:50:04
どちらにせよ359の目的が分からんとなんとも言えん
371デフォルトの名無しさん:2007/05/17(木) 19:30:47
Windows環境で スクリプト中に ディレクトリ名などを含めたいとき
ディレクトリ区切り記号が バックスラッシュなので
たとえば
path = "c:\\tmp\\"
のように \\ふたつ重ねで 書く必要がある
あるいは
path = "c:/tmp/"
のように バックスラッシュの代わりに スラッシュに置き換える必要がある.
…でも
私の場合, こういったパス名は ほとんどの場合, Explolerから コピペしてくるので
長いパス名だと \ を 間違えないように \\ とか / に置き換えるのが面倒だし
第一, 見た目にも \だらけで やさしくない.
C# みたいに @"c:\tmp" って書けるような 文字列リテラル書式って
ないんでしょうか?
372デフォルトの名無しさん:2007/05/17(木) 19:31:00
作らせないってどういう時に使うんですか?

シングルトンとか?
あとは、Factoryを介してほしいときとかかな?
373デフォルトの名無しさん:2007/05/17(木) 19:32:31
>>371
%q(c:\hoge\mage)
ではダメですかね?
374matz:2007/05/17(木) 19:33:47
Windowsのような糞OSのための特殊仕様なんてありませんし

   あ り え ま せ ん 

375デフォルトの名無しさん:2007/05/17(木) 19:40:25
>>373
ちょっとやってみると…
%q(c:\tmp\)
では エラーでした.
%q は すべてのバックスラッシュ記法を無効にするというわけでは
ないみたいですね
376デフォルトの名無しさん:2007/05/17(木) 20:29:07
>>375
%q(c:¥tmp)
なら問題ないかと
377デフォルトの名無しさん:2007/05/17(木) 21:24:32
>>376
そうですね.
調べてみると…

シングルクォート or %q 記法では ほとんどのバックスラッシュは そのまま書けるけど
文字列の最後だけは エスケープの必要があるようです.

ちなみに…私がpath名の最後に \ をつけたいのは
見てすぐ ディレクトリ名だと思う …ってのと
後で ファイル名を くっつける時に楽だから…という理由で, わりとよくつけるのでした.
まぁ これくらは 慣れでなんとかやっていけそうです.

以上, ありがとうございました>コメントくれた人々
378デフォルトの名無しさん:2007/05/17(木) 21:43:08
>文字列の最後だけは エスケープの必要があるようです.
じゃなくて、「'」とか「)」とかの文字列閉じるやつを
バックスラッシュがエスケープするからだと思われ
unterminated string meets end of fileって叱られたし
379デフォルトの名無しさん:2007/05/19(土) 01:22:40
["a", "b", "a", "c"] から ["a", "b", "c"]を得たいのですけども、
Array#uniq じゃダメですよね。
どうするのが手軽で良いでしょうか。
380MoonWolf ◆MoonWdLnkQ :2007/05/19(土) 01:41:33
["a", "b", "a", "c"].uniq.sortでいいんじゃない?
381デフォルトの名無しさん:2007/05/19(土) 01:43:16
uniqでよい

ただ、おそらくは例が悪くて

irb> arr = ["c", "b", "a", "a"]
=> ["c", "b", "a", "a"]
irb> arr.uniq
=> ["c", "b", "a"]

これを一発で ["a", "b", "c"] にしたいという話だと推測
適当に sort するしかないな

ref = ['北海道', '青森', '秋田', '岩手'] # 順番を記述した配列
arr = ['青森', '岩手', '北海道', '北海道', '秋田'] # 整頓したい配列
puts arr.uniq.sort_by{|a| ref.index(a)}

北海道
青森
秋田
岩手
382デフォルトの名無しさん:2007/05/19(土) 01:58:04
今ふっと思ったんだけど、puts [1,2,3,4]って
1234

であるべきじゃね?
1
2
3
4

になってる現状っておかしくね?
なんで配列の場合だけ配列を生かして印字するん?
ハッシュは前者のように印字するのに。
383MoonWolf ◆MoonWdLnkQ :2007/05/19(土) 02:05:30
>>382
to_sの結果と違うから、ちょっと困るね。
ハッシュをputsした場合、キーの順序が不定になってうまく動かない気が。。。
384デフォルトの名無しさん:2007/05/19(土) 02:09:55
>>382
だいぶ前に開発版で一瞬だけ前者のようになったことがあり
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/15043
速攻で元に戻った

配列の場合だけ特別にやってるみたい
ごく初期の便利機能っぽい雰囲気が残ってる
「join("\n")しなくてもputs単体でもイケます」みたいな

.join("\n") の11文字タイプするのすら面倒な書き捨てスクリプトでない限り
よい子はこれに頼らないほうがよいかと…
385デフォルトの名無しさん:2007/05/19(土) 02:36:38
.join("\n") より *"\n" を選ぶオレはgolf脳。
もちろん \n は生の改行文字に置き換えます。
386デフォルトの名無しさん:2007/05/19(土) 02:40:08
puts(*ary)
387デフォルトの名無しさん:2007/05/19(土) 02:57:17
>>385
そんなん初めて知った
388デフォルトの名無しさん:2007/05/19(土) 08:41:54
>>385
できた。すげえ
389デフォルトの名無しさん:2007/05/19(土) 08:57:18
>>386
なるへそ
となると、putsの便利機能とやらは、もはやほとんど不必要なわけか
390デフォルトの名無しさん:2007/05/19(土) 09:24:47
puts(nil) の特別扱いも要らないよなぁ
391MoonWolf ◆MoonWdLnkQ :2007/05/19(土) 10:54:10
"\n"よりも$/のほうが短くね?
392デフォルトの名無しさん:2007/05/19(土) 11:02:19
一行目しか読めねぇのかよこのデブが!
393デフォルトの名無しさん:2007/05/19(土) 11:04:06
配列のタプルへの変換は常識
394デフォルトの名無しさん:2007/05/19(土) 11:34:38
タプタプするとか言うな殺すぞデブ!
395デフォルトの名無しさん:2007/05/19(土) 11:35:56
んでタプルって何?
396デフォルトの名無しさん:2007/05/19(土) 11:43:45
マニュアルの Rinda::Tuple には…書いてないな
397MoonWolf ◆MoonWdLnkQ :2007/05/19(土) 12:00:14
>>392
>>391のこと?
\nを生の改行コードにしても3バイトだよね。
$/なら2バイトだよ。
改行コードが\r\nでもうまく動くから$/のほうがいいな。
398デフォルトの名無しさん:2007/05/19(土) 13:00:18
>\nを生の改行コードにしても3バイトだよね。
>$/なら2バイトだよ

\n も $/ どちらも2バイトなような気がする…
生の改行コード、がわからない orz
399デフォルトの名無しさん:2007/05/19(土) 16:10:59
"改行
"
で3バイトってことかな。
400デフォルトの名無しさん:2007/05/19(土) 16:11:43
その伝だと、"¥n"は " ¥ n " で4バイトだね。
401デフォルトの名無しさん:2007/05/19(土) 16:17:01
引用符なしで直接 \n って書いたら、"\n"のことだと見なしてくれたら便利だな
402デフォルトの名無しさん:2007/05/19(土) 16:22:50
お前は puts の話でいったい何を得たんだ(w
403デフォルトの名無しさん:2007/05/19(土) 16:29:35
最後に改行が付いてる文字列を puts したら
改行 1 個しか出力されない仕様はどうかと思うんだ。
404デフォルトの名無しさん:2007/05/19(土) 16:32:29
>>403
puts は「適当に改行を補って表示する」メソッドです(chomp が適当に改行取るのと似たような感じ)
常に改行を補いたい場合は print str + "\n" と明示的に書いてください

というのはどうだろう
405デフォルトの名無しさん:2007/05/19(土) 16:35:48
ファイルにputsしたら駄目だよな
putsは入力と出力が必ずしも一致しない

putsは再現度の重要度の低い画面表示向け
406デフォルトの名無しさん:2007/05/19(土) 16:51:04
Ruby2.0ではputs a, b, cで改行無しにくっつけて表示してもらいたい
407デフォルトの名無しさん:2007/05/19(土) 16:59:45
>>406
print使え
408デフォルトの名無しさん:2007/05/19(土) 18:38:18
>>403

実際にやってみたけど普通に改行2つでるよ?
何か勘違いしてるのかなぁ。

str = "hoge\n"
puts str

----
409デフォルトの名無しさん:2007/05/19(土) 18:40:27
410デフォルトの名無しさん:2007/05/19(土) 18:52:53
試験の要件を満たすプログラムを作成できるようになるための勉強ってやっぱ必要だよな

print "---------------------\n"
str = "改行なし"
puts str
print "---------------------\n"
str = "改行あり\n"
puts str
print "---------------------\n"
411デフォルトの名無しさん:2007/05/19(土) 20:15:47
>>403
げ、本当だw

> ruby -e 'puts "str"'
str
> ruby -e 'puts "str\n"'
str
>
412デフォルトの名無しさん:2007/05/19(土) 20:28:43
これも「どんな文末でも必ず改行つきで表示する」ならそれはそれでいいんだけどな

$ ruby -e 'puts "str"' | cat -n
1 str
$ ruby -e 'puts "str\n"' | cat -n
1 str
$ ruby -e 'puts "str\n\n"' | cat -n
1 str
2
$ ruby -e 'puts "str\n\n\n"' | cat -n
1 str
2
3

機械的に1回chompしてるだけじゃねーか(w
413デフォルトの名無しさん:2007/05/19(土) 20:57:30 BE:199851124-2BP(0)
rubyで配列に対して同じものが何回出たか一言で数える方法ってありますか?
uniq -c みたいな
414デフォルトの名無しさん:2007/05/19(土) 21:11:04
a=[1,1,2,2,3]; a.size - a.uniq.size

こんな感じ?
415デフォルトの名無しさん:2007/05/19(土) 21:22:37
arr=[1,2,2,3,3,3,4,4,4,4]

arr.uniq.each do |e|
same_elements = arr.find_all{|e2| e == e2}
puts "#{e}は#{same_elements.size}回"
end

-------------

1は1回
2は2回
3は3回
4は4回

こんなん?
416デフォルトの名無しさん:2007/05/19(土) 22:08:39
a.inject(Hash.new(0)) { |hash, e| hash[e] += 1; h}

なんかでじゃぶを感じる。
417デフォルトの名無しさん:2007/05/19(土) 22:09:30
× h
○ hash
418デフォルトの名無しさん:2007/05/19(土) 22:15:03
h=Hash.new(0);a.each{|e|h[e]+=1};p h
419デフォルトの名無しさん:2007/05/19(土) 22:19:36
みんな騙されるな!
>>418は3行分だぞ!
420デフォルトの名無しさん:2007/05/19(土) 22:32:34
てか>>416のinjectをバラしてeachにしたのが>>418のような気も…

ハッシュ作って登録しながらカウントというのはよくある手法だな
>>415みたいに素直に毎回サーチすると、対象の配列がデカいときに困ったことになる
…はずだ
421デフォルトの名無しさん:2007/05/19(土) 22:44:05
>>415と同じようなfind_allの方法しか思いつかなかった俺は修行不足のようだ
422413:2007/05/19(土) 22:53:19 BE:674495093-2BP(0)
ありがとうございます
cat foo.txt | sort |uniq -c みたいな感じです。

a.uniqがあるので何か一言で書く方法があるのかなと思いましたが
プログラム組まないと駄目ですよね。
423デフォルトの名無しさん:2007/05/21(月) 10:06:59
scrapiを使おうとしました。
gem install scrapiでインストールして、

#!ruby -Ks
SRC_URL = "http://d.hatena.ne.jp/"

require 'rubygems'
require 'scrapi'
require 'open-uri'
require 'pp'

links = Scraper.define do
 process "a[href]", "urls[]"=>"@href"
 result :urls
end.scrape(URI.parse(SRC_URL)).sort.uniq

pp links

以上のソースを実行したところ、

---------------------------
ruby.exe - 正しくないイメージ
---------------------------
アプリケーションまたは DLL (Rubyを入れたディレクトリ)ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so は
正しい Windows イメージではありません。これをインストール ディスクのファイルと照合してください。
---------------------------
OK
---------------------------

というダイアログが出てしまいます。
実行結果は、きちんとでているようです。
424423:2007/05/21(月) 10:09:45
RUBYOPT = -rubygems
は、環境変数で指定してあります。

このダイアログがいちいち出てしまうのですが、出ないようにすることはできないでしょうか?

なお、cygwinのbash上から実行した場合は、何故かダイアログがでません・・・。
425423:2007/05/21(月) 10:16:20
自己解決っぽいです。

検索してみると、どうも、libtidy.soがlinux用らしくて、

3 日坊主日記 - scrapi - ScrAPI toolkit for Ruby
http://moriq.tdiary.net/20061011.html

によると、win32用のdllが先に読まれないようなので、

ruby\lib\ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so

libtidy.so.0あたりにリネームしてやると、
libtidy.dllが読まれて、ダイアログが出なくなりました。
426デフォルトの名無しさん:2007/05/21(月) 16:07:18
腐ったgemだな。 > scrapi
本来入ってるはずでないlibtidyまで適当にぶちこんでるのか。


427デフォルトの名無しさん:2007/05/21(月) 16:15:58
そうなのか?
Cygwinでエラーにならないのはなんで?
428デフォルトの名無しさん:2007/05/22(火) 14:53:22
cygwin用のtidyが入ってんじゃない?
429デフォルトの名無しさん:2007/05/22(火) 22:43:06
すみません。
正規表現Regexpでヒットした複数行をtxtファイルに書き込んで保存したいのですが、
良い方法ありませんか?

$stdout = File.open("xxxx.txt", "w")
というのでやってみたところ、
最初の一行と途中のやつが文字化けで現れるだけなんですが。。。

FAQにあったらごめんなさい。
430デフォルトの名無しさん:2007/05/22(火) 22:57:22
>>429
a1. 正規表現で複数行マッチさせ変数に保存
a2. 複数行マッチした結果の変数の内容を画面に表示させ確認する

b1. 複数行の文章を手入力し変数に入れておく
b2. 複数行の文章を適当なファイルに保存、エディタなどで確認する

上記aとbを組み合わせ、
「正規表現で複数行マッチしたものを変数に入れその変数をファイルに書き出す」
ということをする
まずは一つ一つ成功させて積み重ねれ
431デフォルトの名無しさん:2007/05/22(火) 23:03:21
ありがとうございます
入門書読みながら格闘してきます
432デフォルトの名無しさん:2007/05/23(水) 21:50:58
あるmoduleのメソッドを別のモジュールでも使いたいと思い

module A
 def hoge puts "hoge"; end
end

module B
 include A
end

としたのですが、includeはクラスにのみ作用するようで、B.hogeとしても
NoMethodErrorとなってしまいました。

この辺りはRubyのメタプログラミングを理解する上でとても重要だと思うのですが、
どうもその辺りが理解がまったくできていないようです。

知る限りではmodule_evalなどがあるのですが、それも上手く行きませんでした。。
この場合はどのように処理すればよいのでしょうか?

 
433デフォルトの名無しさん:2007/05/23(水) 22:02:56
includeはたぶん普通に行えています。
B.hogeのようなカタチで使用するには、Bの定義内で
module_function :hogeする必要があります。
434デフォルトの名無しさん:2007/05/23(水) 23:23:10
そもそもそれじゃ A.hoge 自体できないだろうが。
435デフォルトの名無しさん:2007/05/24(木) 01:51:17
>432
そもそも、そのコードじゃA.hogeも呼べなくね?
まぁB.hogeしたいなら、単にextendすればいいんじゃね。
436デフォルトの名無しさん:2007/05/24(木) 02:32:34
>>432
メタプログラミングを理解する前にやっとくべきことがいろいろとありそうだな…。
437デフォルトの名無しさん:2007/05/24(木) 08:09:29
module A
def hoge; puts "hoge"; end
end

module B
extend A
end

B.hoge
438デフォルトの名無しさん:2007/05/24(木) 11:02:00
>>434-436
Aの方にclass << selfを入れ忘れ... orz
hogeメソッドはAのクラスメソッドのつもりでした。

>>437
ありがとうございます。できました!
Bの特異クラス?に対してincludeするって事なんでしょうか。
継承って言うより注入って感じだなぁ。。。

>>433
ありがとうございます。
includeだとインスタンスメソッドになってるから
module_functionでクラスメソッドに変えるって事なんでしょうか。
今回は>>437で行きたいと思います。
439デフォルトの名無しさん:2007/05/24(木) 21:56:58
CGIでCookieを使おうと思ってマニュアルを頑張って読む。

ttp://www.ruby-lang.org/ja/man/?cmd=view;name=cgi
> require "cgi"
> cgi = CGI.new
> for name, cookie in cgi.cookies
> cookie.expires = Time.now + 30
> end
> cgi.out("cookie" => cgi.cookies){"string"}

…。わかりにくいです先生。
440デフォルトの名無しさん:2007/05/24(木) 23:29:17
require 'cgi'
cgi = CGI.new
now = Time.now

mycookie = cgi.cookies['accesslog'] # クライアントから受け取ったクッキー
unless mycookie.empty?
mycookie.value.push(now.to_s) # 既存のクッキーがあるなら時刻を追加
else
# クッキーが空の場合新規作成
mycookie = CGI::Cookie::new({ 'name' => 'accesslog',
'value' => [now.to_s], # 必ず文字列入り配列
'domain' => cgi.server_name,
'path' => cgi.script_name })
end
mycookie.expires = now + 60
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


わかりやすいサンプルって難しいな
441デフォルトの名無しさん:2007/05/25(金) 03:08:39
Cookieの分かりにくさはRubyのせいじゃないからなぁ
442デフォルトの名無しさん:2007/05/25(金) 03:38:13
1. ブラウザが'accesslog'という名?のクッキーを要求して来てます
2. 机にクッキー置いてあった => 時刻も付けとく
  机の上にクッキーなかったり => 新しく袋から出して、時刻も付けとく
3. 賞味期限を60日に設定 expire
4. とっとと、どうぞ召し上がっちゃってください

1. のとこの'accesslog' の辺りが よくわからないぽ …orz

'accesslog'いうのはキャッシュに保存されてるファイル名か
なにかなのかな?
443デフォルトの名無しさん:2007/05/25(金) 11:26:02
Moduleのインスタンスは、作成した時点ではnameが""で
定数に代入するとその定数名がnameに設定されますが
これと同じことを自作クラスのインスタンスでも実現出来るでしょうか?
444デフォルトの名無しさん:2007/05/25(金) 18:15:40
>>442
これはコメントがよくない


# クライアントから送りつけられた全クッキーの中からaccesslog名義のデータを取り出す
mycookie = cgi.cookies['accesslog']

   :
   :
   :

# 変更したクッキーをクライアントに返し、HTMLでaccesslogの値を<br>で区切って表示する
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


これならわかりやすい…かも
サーバー側は送ってもらうクッキーの名前を選べない
クライアントからはdomainとpathが一致するものを全て一気に送ってくる
(だから、変なのを濫造すると接続時に100項目くらいどばっと送られてくる羽目に)
445デフォルトの名無しさん:2007/05/25(金) 19:56:04
RUNIT はどうして RUnit じゃないんでしょう?
RUNIT::TestCase とか書いてると、ちょっと気持ち悪いです。
446デフォルトの名無しさん:2007/05/25(金) 20:48:26
test/unitのほうを使うべし。
rubyunit(runitはAPI互換性のために残っているだけで、実装の
大半はtest/unitを使ってる。

だったと思うぞ。
447デフォルトの名無しさん:2007/05/25(金) 20:49:51
実装って、RUNITの実装のことね。

あと、るりま
http://doc.loveruby.net/refm/api/view/library/rubyunit
448デフォルトの名無しさん:2007/05/26(土) 00:30:58
最近だとRSpecも面白いかもん
449デフォルトの名無しさん:2007/05/26(土) 02:37:04
rubyzipを使って、c:\hoge以下の「サブフォルダを含む拡張子が付いたもの」
をアーカイブ圧縮しようとしています。

require 'zip/zip'

Dir.chdir(c:\\hoge)
inner_files = Dir.glob("**/*.*")
Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf|
inner_files.each do |i|
zf.add(NKF::nkf("-s",i), i)
end
}

上記のコードだと、「c:\hoge\foo\test.html」や「c:\hoge\foo\test2.gif」など同じ
ディレクトリがある場合は圧縮されるのですが、ディレクトリ構成が違うものが
含むとエラーになったり、同じフォルダ内でもtest.swfなど、swfがあるとエラー
になり、原因も分からずで困っています。
解決策はありますでしょうか?
450デフォルトの名無しさん:2007/05/26(土) 03:56:32
日本語でおk

> 「サブフォルダを含む拡張子が付いたもの」
フォルダ名に拡張子が付いてる、って話?

あとエラーの内容もkwsk

> Dir.chdir(c:\\hoge)
ここで parse error になると思うけど、実際に動かしてるコードと合ってる?
451449:2007/05/26(土) 05:31:30
>>450
すいません、詳しく書きますと、vrubyにてドロップされたフォルダを、そのフォルダ構成ごとzip圧縮したいということです。
以下、その部分のロジックのコードです。
def self_dropfiles(files)
d_file = files.to_s #ドロップされたフォルダパス
Dir.chdir(d_file) #ドロップされたフォルダをカレントディレクトリにする
inner_files = Dir.glob("**/*.*") #カレントディレクトリ内の拡張子が付くファイルを配列にする
Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf|
inner_files.each do |i|
zf.add(NKF::nkf("-s",i), i)
end
}
end

RDEにて下記のエラーが出る。
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
※但し、階層が1つだけで「html」や「txt」などのtxt系ファイルだけの場合は圧縮が成功します。

hoge →これはOK
├hoge.txt
└hoge.html

hoge →これは×
├hoge.txt
└hoge.swf

hoge →これは×
├hoge.txt
├hoge.html
└sub_dir(フォルダ)
 └hoge.txt
452デフォルトの名無しさん:2007/05/26(土) 13:53:04
Dir.glob("**/*.*")
453デフォルトの名無しさん:2007/05/26(土) 20:07:24
最近Rubyを勉強しはじめたものなのですが質問があります。

calcを用いて計算を行うという練習を行っているのですが

def calc(test)
calc(test[1]) + calc(test[2])

として、calc([:plus,5,10])を実行した際に15が出力されるのは把握しております。
ここで calc([:plus,5,10,30])という風に数を増やしていった場合

calc(test[1]) + calc(test[2])の場所をどのように変更すれば一番効率よく計算が行われるでしょうか?
whileを用いて繰り返そうと思っているのですがどうにも上手くいきません。
よろしくお願い致します。
454デフォルトの名無しさん:2007/05/26(土) 20:18:18
>>453
メソッドの設計にまず問題があると思うが
とりあえずそれは置いておいて

その場合なら
result = 0
test.shift
test.each do |operand|
 result += operand
end
return result
が常道だと思われる
455デフォルトの名無しさん:2007/05/26(土) 20:32:26
>>454
ありがとうございます。
最近初めたばかりなので>>454の意味を把握しきれていません;;

def calc(test)
if test.respond_to? :to_int
test
else
p calc(test[1]) + calc(test[2])
end
end

calc([:plus,5,10,30]){
}

こういった形の構成なのですが、4行目に

p calc(test[1]) + calc(test[2])にwhileを足し

while test[y] != EOF
calc( x + test[y])
y += 1
end

p x
のようには出来ないのでしょうか??
質問ばかりで申し訳ございません。
456デフォルトの名無しさん:2007/05/26(土) 20:51:55
この質問者ならコレで答えにたどり着くだろう。

つ test.size
457デフォルトの名無しさん:2007/05/26(土) 21:03:46
>>456
ありがとうございます。
while test[y] <= test.size
でやってみます。
458デフォルトの名無しさん:2007/05/26(土) 21:12:01
>>456
ナイスエスパー

>>457
その練習(課題?)が終わったら、もっと簡潔に書けないかどうか
チャレンジしてみると吉
459デフォルトの名無しさん:2007/05/26(土) 21:21:33
できました!
until使ってやってみました。
ご教授下さった皆様方ありがとうございました。

>>458
各メソッド等について把握しておりませんので
頑張って勉強してみたいと思います。
ありがとうございました。
460デフォルトの名無しさん:2007/05/26(土) 22:29:29
test[y]じゃなくてyと比較しなくていいのか?
461デフォルトの名無しさん:2007/05/27(日) 03:13:02
result=0;test[1..-1].each{|item| result += item}とか
test[1..-1].inject(0) {|result, item| result + item }とか
462デフォルトの名無しさん:2007/05/27(日) 04:25:57
いるよな無理に1行で書くアホ
463デフォルトの名無しさん:2007/05/27(日) 10:04:03
inject便利
464デフォルトの名無しさん:2007/05/27(日) 11:04:57
コマンドラインで実行するときあるからなー
465デフォルトの名無しさん:2007/05/27(日) 11:13:06
文区切りの ; が入ってると「無理してんなー」という気はする
466デフォルトの名無しさん:2007/05/27(日) 16:32:45
以下のコードを Apache の CGI として実行するとエラーに…なぜでしょう?
alias :puts_ :puts
def puts s
 puts_ s
end
Windows 環境でも日本語が化けないよう、
条件付きで puts の中身を替えたりしようと思っていたのですが、
その過程で↑に気付きました。
puts を変えたいのはローカルでコンソールから実行している時なので
知らなくてもいいっていえば、そうなんですが気になってしまって。
467デフォルトの名無しさん:2007/05/27(日) 16:36:21
>>446, 447
遅レスすみません。
「Rubyを256倍使うための本 極道編」を読んでたので、
情報が古かったんですね。test/unit 勉強してみます。
468デフォルトの名無しさん:2007/05/27(日) 16:43:37
次の質問が見えるようだ

>>466
「エラーになる」禁止
どんなエラーかきちんと書く

十中八九 malformed header from script. Bad header だろうけどな
CGIというかHTTPの勉強しろ
CGIではHTTPヘッダ群を最初に出力しないとWebサーバがエラー出すぞ
469デフォルトの名無しさん:2007/05/27(日) 17:00:52
CGIのエラーは基本的にコンソールから直接実行した結果とapacheのエラーログが必須
470466:2007/05/27(日) 19:58:00
曖昧な表現をしてしまい失礼しました。
問題は Apache を再起動したら発生しなくなりました。
471デフォルトの名無しさん:2007/05/28(月) 00:56:27
>>451
>>468言うとおりエラーの内容を書けよ。

と言いつつ、やってみた

zip.rb:1087: [BUG] Segmentation fault

これってrubyの配列系バグじゃね?
ご愁傷様
472デフォルトの名無しさん:2007/05/28(月) 01:09:45
alias と method_alias はどう使い分ければいいか分からん。。。
大抵は method_alias 使っとけ、でおけ?
473デフォルトの名無しさん:2007/05/28(月) 02:15:49
>>471
配列の時点でいまさらそんな変なバグがあってたまるか(w
inner_files の中身を表示してみれば見当つくかも
どうせ Dir.glob で変なの渡してるんだろう
474デフォルトの名無しさん:2007/05/28(月) 06:52:05
このスレ見てると死にたくなるよ
475デフォルトの名無しさん:2007/05/28(月) 10:43:17
>473
>配列の時点でいまさらそんな変なバグがあってたまるか(w
いやいや、コミットするたびにバグるのがRuby流。
476デフォルトの名無しさん:2007/05/28(月) 11:20:22
とりあえずバージョンも書かないエラー報告は放置。
477デフォルトの名無しさん:2007/05/28(月) 14:01:01
BUGと出るのはRubyのバグなので報告よろ、
とmatzが言ってた記憶があるお。
478デフォルトの名無しさん:2007/05/28(月) 14:03:17
レスのアンカーのやりかたを教えて
479デフォルトの名無しさん:2007/05/28(月) 15:41:27
インナークラスで外側のクラスのインスタンスメソッドを呼ぶ方法はありますか?

class A
def foo; puts "foo"; end
class B
def bar
???.foo #<- Aのインスタンスのfooを呼びたい
end
end
end

イニシャライザでAのインスタンスを渡すなり、
BのインスタンスにAのインスタンスを明示的に教えないと無理?
480デフォルトの名無しさん:2007/05/28(月) 15:47:17
> イニシャライザでAのインスタンスを渡すなり、
> BのインスタンスにAのインスタンスを明示的に教えないと無理?
A::BのインスタンスとAのインスタンスにはなんの関係もないから、
そうしないと無理。
481479:2007/05/28(月) 15:51:32
>>480
ありがとうございました。
482デフォルトの名無しさん:2007/05/28(月) 19:45:13
Babel... it's not the God's anger, but human beings' foolness, even in programming languages.
483デフォルトの名無しさん:2007/05/29(火) 00:40:38
そしてプログラミング印欧祖語を再構築する漢達のドラマが始まる
484デフォルトの名無しさん:2007/05/29(火) 03:17:46
すみません、rubyが全然わからないんですが、linuxでのmmapのインストール過程でよくわからないエラーが出たので質問させていただきます。

extconf.rbを実行してMakefileが出来たようなんですが、makeを実行しようとすると以下のエラーが出ます。

mmap.c:In function ‘mm_sub_bang_int’:
mmap.c:1116: error: too few arguments to function ‘rb_reg_regsub’
mmap.c:In function ‘mm_gsub_bang_int’:
mmap.c:1214: error: too few arguments to function ‘rb_reg_regsub’
make: *** [mmap.o] エラー 1

これはを怒られているのでしょうか?教えていただきたいです。
485デフォルトの名無しさん:2007/05/29(火) 05:08:36
Linux板逝けば?
486デフォルトの名無しさん:2007/05/29(火) 09:45:09
>484
ruby-mmap の話? Rubyのバージョンは?

1.9系では rb_reg_regsub への引数の与え方が変わったようなので(鬼車の影響?)、
その場合はそのようなエラーになる。
487デフォルトの名無しさん:2007/05/29(火) 10:54:18
しかし1.9を使ってる奴がこんなところで質問するはずもない
488デフォルトの名無しさん:2007/05/29(火) 11:47:12
わからんぞ。人気のUbuntuなんかじゃruby1.9が一発で入るし。
489デフォルトの名無しさん:2007/05/29(火) 16:52:43
>485
すみません。僕もlinux板かプログラミング板かのどちらかで悩んだんですが、どちらかというとプログラミング寄りの問題だと思ったので。。

>486
>487
>488

488さんのおっしゃっている通り、ディストリビューションはUbuntu7.04です。
ruby-mmapはlinux上で英辞郎を利用するための「rdic」というソフトをインストールする過程で必要だっただけで、rubyに関しては全くのド素人です。

Ubuntuでは、デフォルトでruby1.8が入っていたのですが、ruby-mmapのインストールをする過程のextconf.rbの時点でmkmf.rbが見つからないと言われたので自分なりに色々と調べてみました。

その結果、mkmf.rbはruby1.9-devの中に含まれていると知ったため、ruby1.8をアンインストールしてruby1.9とruby1.9-devをインストールすることでMakefileまではできたと言う感じです。

その後のmakeで>484のようなエラーが出て悩んでいました。>486さんのおっしゃっている通りなら、やはりruby1.8で解決していく方法を調べるしかないのでしょうか?
490デフォルトの名無しさん:2007/05/29(火) 16:54:51
mkmfなんて大昔からあるだろう
491デフォルトの名無しさん:2007/05/29(火) 17:06:09
Ubuntuは全然知らんが、たぶんruby-1.8-devつーのがあって、それにmkmf.rbが含まれてるんジャマイカ?

ruby 1.9は開発中で実験しまくりなので、ruby自体の開発に興味があるのでなければ触る必要はない。
492デフォルトの名無しさん:2007/05/29(火) 19:39:34
>490
>491

ruby-1.8-devを探し直してみたら普通に見つかりました!!

自分もruby1.9を入れる前にruby1.8-devがあるかどうか確認して見つからなかったはずだったんですが、自分の打ったコマンドの履歴を見直してみたら見事に打ち間違いをしていました。。ものすごい初歩的なミスでしたスミマセン。

ruby1.8とruby1.8-devをインストールして改めてruby-mmapとrdicのインストールに挑戦してみたら拍子抜けするほどすんなり成功しました。嬉しいです♪

こんな初心者にアドバイスをしてくださった皆様、本当にありがとうございました!!
493デフォルトの名無しさん:2007/05/29(火) 19:46:45
procの挙動がマニュアルと違うのですが。
"ruby 1.7 feature" というのは1.8には含まれないのですか?
http://www.ruby-lang.org/ja/man/?cmd=view;name=Proc#yield

$ ruby -e 'pr = Proc.new{|a,b,c| p [a,b,c]}; pr.call 1'
[1, nil, nil]
$ ruby -e 'pr = Proc.new{|a,b,c| p [a,b,c]}; pr.yield 1'
-e:1: undefined method `yield' for #<Proc:0x0806e5e8@-e:1> (NoMethodError)
$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
494デフォルトの名無しさん:2007/05/29(火) 21:10:16
以前は世話になりもうした。ほんと助かった。
ところで、クラスメソッドがそのクラスそのものをオブジェクトとした場合の特異メソッドというのでだいたい理解したのだが、
ふと気になって考えて見ると、

class Hoge
  def Hoge.hoge()
  end
end

でも、

class Hoge
end

def Hoge.hoge()
end

でも問題ない気がする。
実際試したところ動いちゃうが、これはRubyの柔軟性の一つという捕らえ方でいいのか、
それとも、後者は非標準の書き方であるという捕らえ方のほうがマトモなのかが少し気になる。

ついでに、このクラスメソッド、一部のルーティンを切り出して、クラスメソッド内から関数として呼び出したい場合
(かつmainで定義するのはさすがによろしくないと思うので)、同様にクラスメソッドでの実装になると思われるのだが、
これをプライベートにしたい場合は、ふつーに>>361みたいな方法でいいのかすら。
495デフォルトの名無しさん:2007/05/29(火) 21:45:16
前スレでもたしか出たけど
private_class_method
496デフォルトの名無しさん:2007/05/29(火) 23:54:12
Ruby/PythonならぬRuby/Perlみたいなライブラリがあったら教えて下さい
PerlのライブラリをRubyから使いたいです…
497デフォルトの名無しさん:2007/05/30(水) 00:22:00
適当にコードを書いて遊んでいるところなのですが、挙動がよく分かりません。
以下のコードで何が起きているのか、誰か教えてください。

メソッドb(k)はkをkeyとしてHashの値を返しますが、みつからないときは
デフォルト値として C#a の結果を返す、という処理のつもりです。
498497:2007/05/30(水) 00:23:47
irb(main):001:0> class C0
irb(main):002:1> def a(*args) p "C0#a", args end
irb(main):003:1> end
=> nil
irb(main):004:0> class C1 < C0
irb(main):005:1> def a() @h = Hash.new { super } end
irb(main):006:1> def b(k) @h[k] end
irb(main):007:1> end
=> nil
irb(main):008:0> class C2 < C0
irb(main):009:1> h = nil
irb(main):010:1> define_method(:a) { h = Hash.new { super } }
irb(main):011:1> define_method(:b) { |k| h[k] }
irb(main):012:1> end
=> #<Proc:0x08117d28@(irb):11>
irb(main):013:0> c2 = C2.new
=> #<C2:0x81156e0>
irb(main):014:0> c2.a
=> {}
irb(main):015:0> c2.b 10
"C0#a"
[{}, 8032]
=> nil
irb(main):016:0> c1 = C1.new
=> #<C1:0x810f81c>
irb(main):017:0> c1.a
=> {}
irb(main):018:0> c1.b 10
(irb):5: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-freebsd6]
IOT trap
499デフォルトの名無しさん:2007/05/30(水) 00:33:30
>>496
http://www.yoshidam.net/Ruby_ja.html
保守されてないけど
500497:2007/05/30(水) 00:47:10
irb(main):004:0> class C1 < C0
irb(main):005:1> def a(x,y) @h = Hash.new { super } end
こうすると
irb(main):017:0> c1.a 2, 4
=> {}
irb(main):018:0> c1.b 10
"C0#a"
[2, 4]
=> nil
こうなるので、superを呼ぶときの引数の問題なのか。

しかしこちらは
irb(main):008:0> class C2 < C0
irb(main):010:1> define_method(:a) { |x,y| h = Hash.new { super } }
...

irb(main):014:0> c2.a 2, 4
=> {}
irb(main):015:0> c2.b 10
NoMethodError: undefined method `[]' for nil:NilClass
from (irb):11:in `b'
from (irb):15
from :0
こうなってしまう。
superに引数を明示すれば問題なく動くのだけど、
何でこうなってしまうのだろう。 やはりバグかな?
501デフォルトの名無しさん:2007/05/30(水) 01:41:56

% ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]

>bt
#11 0x2819aa24 in sigaction () from /lib/libpthread.so.2
#12 0x280aacfa in rb_call0 (klass=135605680, recv=135353200, id=16065,
oid=16065, argc=2, argv=0x8, body=0x8152f40, flags=0) at eval.c:5953
#13 0x280ab89a in rb_call (klass=135605680, recv=135353200, mid=16065, argc=2,
argv=0x8, scope=3, self=6) at eval.c:6062
#14 0x280abcee in rb_call_super (argc=2, argv=0x8) at eval.c:6230
#15 0x280a51ff in rb_eval (self=135353200, n=0x8133370) at eval.c:3509
#16 0x280a888b in rb_yield_0 (val=135313220, self=135353200, klass=0, flags=0,
avalue=2) at eval.c:4991

argv=0x8ってことで、ぬるぽだな〜。
502494:2007/05/30(水) 03:15:21
あかん…なぜ上手くうごかないんだ・・・

class Hoge
 def Hoge.bar
  print "test"
 end
 private_class_method :bar

 def Hoge.foo
  Hoge.bar
  return
 end

end


obj = Hoge.foo
503494:2007/05/30(水) 03:17:46
うあ、書きかけで送信しちまった・・・
連投すまそ…

んと、つまり、Hoge.fooのサブルーチンを、Hoge.barに書き出したくて、
かつ、外部に公開するレシーバーは、fooのみにしたいんだが・・・
504449:2007/05/30(水) 03:23:18
先日は自分の環境も書かずに失礼しました。
Microsoft Windows XP [Version 5.1.2600]
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] にて下記のコードでエラーが出ます。

def self_dropfiles(files)
 d_file = files.to_s #ドロップされたフォルダパス
 Dir.chdir(d_file) #ドロップされたフォルダをカレントディレクトリにする
 inner_files = Dir.glob("**/*") #カレントディレクトリ内のディレクトリ及びファイルを配列にする
 zip_name = d_file + ".zip"
 Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) {|zf|
   inner_files.each do |i|
   zf.add(NKF::nkf("-s",i), i)
   end
 }
end

C:/ruby/lib/ruby/1.8/zip/zip.rb:1087: [BUG] Segmentation fault
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

>>452
どこか変ですか?(因みにDir.glob("**/*")でも同じエラーでした。)
>>471-477
色々すいません、inner_filesにはドロップしたフォルダの中が相対パスで配列で帰ってきてました。
全く動かないというわけではなく、>>449のように場合によっては成功するのですが…
尚、1階層のみでも拡張子がxhtmlになるとダメでしたので、txt系ファイルならOKではありませんでした。
505デフォルトの名無しさん:2007/05/30(水) 03:28:46
Index: eval.c
===================================================================
--- eval.c(revision 12402)
+++ eval.c(working copy)
@@ -3505,4 +3505,8 @@ rb_eval(self, n)
     argv = RARRAY(RBASIC(ruby_scope)->klass)->ptr;
 }
+else if (!ruby_scope->local_vars) {
+    argc = 0;
+    argv = 0;
+}
 else {
     argv = ruby_scope->local_vars + 2;
506デフォルトの名無しさん:2007/05/30(水) 03:30:06
>>504
> ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] にて下記のコードでエラーが出ます。
1.8.6でも再現する?
507497:2007/05/30(水) 10:21:21
>>501,505
この書き込みは自分の件についてですか?
スコープとローカル変数あたりを弄っているので多分そうだと思うけど。
修正してコンパイルする技量はないので、本家に取り込まれるのを待ちます。
ありがとうございました。

>>502
プライベートメソッドはレシーバを省略した形でしか呼べない。
def Hoge.foo
bar
end
これでどうかな。
508デフォルトの名無しさん:2007/05/30(水) 15:16:02
>>507
> スコープとローカル変数あたりを弄っているので多分そうだと思うけど。
> 修正してコンパイルする技量はないので、本家に取り込まれるのを待ちます。

今朝コミットされてるので、1.8.7や1.8.6,1.8.5の次期パッチリリースでは直っ
てるはず。

* eval.c (rb_eval): get rid of SEGV at ZSUPER in a block
&bsp; [ruby-dev:30836]

> ありがとうございました。

報告乙。
509デフォルトの名無しさん:2007/05/31(木) 07:26:42
初心者スレで聞くべきかどうか迷ったのですが

Rubyist MagazineのHotlinks、以下の記事↓
ttp://jp.rubyist.net/magazine/?0017-Hotlinks#l15
で「tDiaryのプラグイン設計はよくない」という発言があります。

ソースコードやドキュメントを読んで考えているのですが
どういう点で悪いのかがよく分かりません。
ささだ氏・あおき氏の個人的な見解と考えたほうがいいのでしょうか?
それとも客観的に見て、問題の多い設計なのでしょうか?
(私もプラグイン設計を考えているので気になりました)
510494:2007/05/31(木) 10:09:47
お、できた、本当にありがとう。
でもなぜこんな仕様に?
511デフォルトの名無しさん:2007/05/31(木) 18:07:02
>>509
「読み込んでeval()」は明らかにどう考えてもイクナイ。
ファイル構造だけ分離可能でも、名前空間すら分離できてないのは
「えせ」プラグインです(断言)。
512Pyスレ763:2007/05/31(木) 18:32:39
それは考え方次第。evalつかう連中は、ぶつかれば直せばいいとう考え方。
ぶつかる可能性はゼロではないが、極めて低いから、それよりは便利さをとるという態度。
そして、そんな態度でもうまくいくやつはうまくいく。うまくいかないやつはeval使わなくてもうまくいかない。
513デフォルトの名無しさん:2007/05/31(木) 18:35:35
>>510
何故って言うかRubyにおけるprivateは
「レシーバを書いたら呼べない」であって
Javaなんかのprivateとは全然違う意味
514デフォルトの名無しさん:2007/05/31(木) 19:24:51
>>511
Perlと同じ
515449:2007/06/01(金) 01:04:54
>>506
1.8.6にしたら無事できました。

ただ、exerbでexeにすると以前と同じ条件下でVC++のエラーが出てしまいました。
(makeファイルを作る際のテストではエラー出ず。)
exerbでは使えないライブラリがあるので、rubyzipライブラリがひっかかってるのかもしれません。

上記と元の質問の内容は無関係と思いますし、本来のrubyファイルでは問題なく動作しました。
本当にありがとうございました。
516デフォルトの名無しさん:2007/06/02(土) 03:45:26
class C; end
C.instance_eval { def a() end }
C.instance_eval { define_method(:b) {} }
C.class_eval { def c() end }
C.class_eval { define_method(:d) {} }

p C.singleton_methods
# ["a"]
p C.public_instance_methods false
# ["b", "c", "d"]

メソッドbがクラスCの特異メソッドにならないのは何故ですか?
517516:2007/06/02(土) 03:54:49
追記
$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-freebsd6]
518デフォルトの名無しさん:2007/06/02(土) 14:08:36
>>516
define_methodはinstance methodを定義するメソッドだから。
519デフォルトの名無しさん:2007/06/02(土) 14:37:01
ClassもClassのインスタンスじゃねーの?
520デフォルトの名無しさん:2007/06/02(土) 20:26:41

いいえ

Class は Klass のインスタンスです
521デフォルトの名無しさん:2007/06/02(土) 20:42:32
>>520
Klassなんかねーけど…
522デフォルトの名無しさん:2007/06/02(土) 21:54:25
初心者スレのレベル的に微妙な遣り取りだな
523デフォルトの名無しさん:2007/06/02(土) 22:04:36
524デフォルトの名無しさん:2007/06/02(土) 22:27:21
>>520
そのKlassというのは>>523のklassと同じものですか?
とりあえずその記述に従ってklassとはあるコンテキストにおける
メソッドの定義先であるとして話を進めますが、

>>518
するとdefine_methodはレシーバの、つまりそのコンテキストでの
selfのインスタンスメソッドを定義するメソッドということでしょうか。
対してdefはklassのインスタンスメソッドを定義すると。

C.class_eval では self = klass = C
C.instance_eval では self = C, klass = Cの特異クラス

なのでself = klass の場合にメソッドの定義先が同じになるだけ
という解釈でよいですか?

>>522
あー、"Rubyについて"スレに移動した方がいいですかね?
525デフォルトの名無しさん:2007/06/02(土) 22:46:04
>524
移動しなくていいと思うよ
向うは技術的な話題最近ないし
こっちの方がレベル高いw
526デフォルトの名無しさん:2007/06/02(土) 23:03:38
これは何をやっているのでしょうか?
http://www.ruby-lang.org/ja/man/?cmd=view;name=Class
klass = Class.new(super)
klass.module_eval {|m| ... }
klass
527デフォルトの名無しさん:2007/06/02(土) 23:25:26
>>525
リアル低レベルな人は発言の切れが違いますね。
528デフォルトの名無しさん:2007/06/02(土) 23:40:22
>>526
# klass = Class.new(super)
変数klassに superを親クラスとする無名クラスを代入

# klass.module_eval { |m| .... }
klass.class_eval { |m| .... } こちらでも同じ
無名クラスのコンテキストで何かする mは無名クラス

# klass
無名クラス自体(クラスのオブジェクト)を返す

以上を書き換えるとこんなふうになる

proc { |super|
 class 無名クラス < super
  do_something
 end
return 無名クラス
}.call(super)

こんなかんじ?
実際試してないので間違ってたら御免
529デフォルトの名無しさん:2007/06/02(土) 23:47:44
あう、do_sometingと書いてある部分ところは、
Class.new に与えられたブロックが呼び出される部分です。
左記の例に沿うなら、その直前に一行
m = 無名クラス
としたほうがわかりやすいかな。

# 校正したつもりでもミスばっかり……
# 酒が入るとこれだから、といいわけしてみる。
530デフォルトの名無しさん:2007/06/02(土) 23:50:28
そしてまた誤字やらなにやらが複数 orz
しばらく寝てよう....
531デフォルトの名無しさん:2007/06/03(日) 02:37:09
Object#inspect の返す文字列内の
16進の数値って何ですか?
Object#__id__ かなと思って試したのですが

obj = Object.new
puts obj.inspect #=> #<Object:0x2ab087c>
puts '%#x' % obj.__id__ #=> 0x155843e

となって、どうやら違うようです。
ruby は 1.8.5 です。
532デフォルトの名無しさん:2007/06/03(日) 04:16:15
0x155843e*2 == 0x2ab087c
533デフォルトの名無しさん:2007/06/03(日) 07:56:00
>532
2倍されていたのですね。ありがとうございます。
でも、何故こんな仕様に…?
534デフォルトの名無しさん:2007/06/03(日) 10:10:15
IDとかSYMBOLとかFixnumとかプリミティブ型とかがよくわかりません
535デフォルトの名無しさん:2007/06/03(日) 11:17:47
>>534
もっと具体的に質問してください
・どういう意味でIDやプリミティブ型と言っているのか
・どこまで分かっていてどこから分からないのか
・そもそもなぜそんな事を聞くのか
536デフォルトの名無しさん:2007/06/03(日) 12:34:54
>>533
README.EXT.jaを見るとわかると思う。
537デフォルトの名無しさん:2007/06/03(日) 13:07:04
533じゃないけど、とりあえず途中まで読んでみた
Fixnumの数値はCレベルでは、元の値を1ビット左シフトして開いたビットを立て、その他のオブジェクトだったらアドレス値を左シフトのみして開いたビットは立てない仕様になっているのはわかった
で、inspectはそのままアドレスを2倍しっぱなしの値が返り、__id__のほうはちゃんとアドレスの値に戻したものが返ってきているということ?
でも、Fixnumのオブジェクトだと、なぜか__id__で2倍して1足した値が出てくるね
それだったらFixnum以外のオブジェクトの__id__も2倍しっぱなしでいいような気がするけど・・・
538デフォルトの名無しさん:2007/06/03(日) 13:15:39
Fixnumの1足した値ってのは、Fixnumかそれ以外かを判別するbitなのでは?
539537:2007/06/03(日) 13:30:26
いちおうその判別の意図は理解してるつもりなんだけど、なんか__id__の返す値に違和感あるなぁと思って
__id__はユニークな値にしたいのかしたくないのかが、何か釈然としないような気がする

アドレスを表す値は奇数(LSBが立ってる値)にはなりえないってことも、微妙に考慮してるってことなのかな?
でもそれだったら2倍しっぱなしの値でも問題ないし、inspectと同じものが返ったほうがユーザ的には安心な気もする
540デフォルトの名無しさん:2007/06/03(日) 13:31:40
Fixnumの__id__はアドレスじゃないし
541デフォルトの名無しさん:2007/06/03(日) 13:34:13
そりゃ見りゃわかりますがなw
542デフォルトの名無しさん:2007/06/03(日) 14:00:06
>>537
まずはちゃんと最後まで読んでみ。

inspectのほうがアドレスの値がそのまま出ている。
VALUEをFixnumとしてみた場合が逆に1/2になるので、
object_idのほうが変換されている。
もしinspectに出てくるのと同じ値にしようとすると、
環境にもよるがBignumが必要になってしまって無駄。
543デフォルトの名無しさん:2007/06/03(日) 14:47:04
Fixnumもそれ以外も2倍しっぱなしでいいなら
そもそもどっちも2倍にする必要すらないw
544537:2007/06/03(日) 15:31:43
あ、なるほど
読み違えてましたorz
ポインタのLSBが立っていないことを仮定するってのも書いてあるね
納得です
545デフォルトの名無しさん:2007/06/03(日) 15:37:07
なんでMSBじゃなくてLSBにしたんだろう
知ってるひといる?
546デフォルトの名無しさん:2007/06/03(日) 15:48:55
>>545
もちろん現代のほとんどのプロセッサが奇数アドレスからワードアクセスすることを
禁止しているかあるいは少なくとも非推奨であるから。
なので有効なポインタの値は偶数しかあり得ず、奇数のポインタ値はあり得ないから。

まあよくあるハックではあるけど、ちょっと汚いかなとは思う。
547デフォルトの名無しさん:2007/06/03(日) 18:09:07
>>546にあわせて
LSBなら右算術シフト1発で済む。
MSBで符号を正しく扱うためには、左に一度シフトしてから右にシフトするか
条件分岐する必要がある。
548デフォルトの名無しさん:2007/06/03(日) 19:03:48
プログラムがまったく未経験からRubyを始めたいと思ってるんですが、
何か良い参考書などあれば教えてください。
549デフォルトの名無しさん:2007/06/03(日) 19:28:18
>548
檻の中から乙
550デフォルトの名無しさん:2007/06/03(日) 20:01:40
「たのしいRuby」か「プログラミング言語Ruby」
551デフォルトの名無しさん:2007/06/03(日) 20:03:44
まったく未経験からrubyできるもんかな?
俺の場合javaやる前にrubyはできなかったな
552デフォルトの名無しさん:2007/06/03(日) 20:12:04
Cやって、今rubyの勉強を始めた
構文とかはすぐ覚えられそう
Cとは比較にならないほど簡単に書けて衝撃的だわ
553MoonWolf ◆MoonWdLnkQ :2007/06/03(日) 20:13:17
なんで本スレよりこっちのほうが議論のレベルが高いんだろうw
554デフォルトの名無しさん:2007/06/03(日) 20:20:51
>>548
あなたはラッキーだ。Rubyだとこういうプログラミング初心者用の
専用書籍がある。何も考えずにこれを買いなさい。後悔はしない。

http://www.oreilly.co.jp/books/4873112923/
555デフォルトの名無しさん:2007/06/03(日) 20:25:02
case 〜 when 〜 else 〜 endとか
if elsif elsif else endとかのネスティング段数が
多くなるとおかしくなる。

cygwinで使っているのだがね…。
556デフォルトの名無しさん:2007/06/03(日) 20:26:22
PerlかJavaの初級修めてからRubyというのがいろいろな意味で無難だと思う
どうしてもRubyだけ最初に学びたいという場合は…どうしよう
557デフォルトの名無しさん:2007/06/03(日) 20:33:05
558デフォルトの名無しさん:2007/06/03(日) 20:39:44
>>549
モニタにシミができてしまったので、損害賠償請求します。
559デフォルトの名無しさん:2007/06/03(日) 20:41:42
>>556
Javaはまだわからんでもないけど、Perlは入門にはあんまりよくないんじゃないかなあ。
あのコンテキストの考え方って癖がありすぎて初心者は混乱するだけだと思うんだけど。
560デフォルトの名無しさん:2007/06/03(日) 20:43:57
>>554 >>557
こんなんあったのか。初めて見た
読んでみた人いる?

>>556
PerlやJavaを知らなくてもなんとかなると思う
自習用としては、Rubyは意外と初学向き

俺の場合はBASICしか知らなかったけど何とかなった
561MoonWolf ◆MoonWdLnkQ :2007/06/03(日) 21:20:39
>>560
店頭で立ち読みしたことがあります。
プログラミング初学者におすすめの非常に良い本だと思いました。
562デフォルトの名無しさん:2007/06/03(日) 22:20:05
他の言語から始めると→Rubyをやったときに、オブジェクト指向の徹底ぶりに感動する
Rubyから始めると→他の言語やったときに、イライラ
563デフォルトの名無しさん:2007/06/03(日) 22:23:03
>>555
もうちょい具体的に。
564デフォルトの名無しさん:2007/06/03(日) 22:27:54
>>555
インデント間違ってないか?
if の終わりには end が必要だぞw
565デフォルトの名無しさん:2007/06/03(日) 22:31:47
独自なインデント規則で書いてたり then を省いたりすると
意図しない意味の構造になってたりはするとは思う
566デフォルトの名無しさん:2007/06/03(日) 22:39:30
構文木を出力する機能ってなかったっけ
567デフォルトの名無しさん:2007/06/04(月) 07:56:12
>542
Bignumが要らないほうに揃えたらいいんじゃ?
568デフォルトの名無しさん:2007/06/04(月) 11:50:26
>>567
object_idにってこと?
inspectとobject_idは別物だから、別に揃えなければならない必然性はないしなぁ。
個人的には、デバッガで見るときにそのまま対応させられる現状のほうがありがたい。
569デフォルトの名無しさん:2007/06/04(月) 12:25:44
「錢」っていう漢字をKconvでEUCからUTF-8にしようとしたんですが
ちゃんと変換されずにゴミみたいのになってしまいました。
「銭」だと大丈夫です。Kconvで使えない文字があるんでしょうか?

require 'kconv'
print '錢'.toutf8, "¥n"
print '銭'.toutf8, "¥n"
570デフォルトの名無しさん:2007/06/04(月) 12:39:00
>>569
使えるけど。
どういう環境でどういう出力?
571デフォルトの名無しさん:2007/06/04(月) 12:56:06
上のコードをeucで保存して
UTF-8に設定したMacのTerminal.appで実行しました。
これでどっちの文字も表示されると思うんですが、、
下の「銭」は表示されるけど上のはなんかゴミみたいな
□にゴミがついたみたいな文字になってしまいました。
Terminal.appが悪い・・?
572デフォルトの名無しさん:2007/06/04(月) 12:57:18
ちゃんと-Keつけて実行してる?
573デフォルトの名無しさん:2007/06/04(月) 12:59:43
odでも通してゴミのコード観てみたら
574デフォルトの名無しさん:2007/06/04(月) 13:05:09
わが Mac ではちゃんと表示されるけど。

【OS】 Mac OS X 10.4.9 (i386)
575デフォルトの名無しさん:2007/06/04(月) 13:12:45
どうもです。-Keつけてませんでした・・が、つけても結果同じでした。
od -Hで見てみたら、「銭」はe98aad、「錢」はeebea2 になってました。

その二文字をそのままUTF-8のテキストファイルに保存して
od -Hで見ると、それぞれ e98aad と e98ca2 なので
eebea2というのがおかしい?
576デフォルトの名無しさん:2007/06/04(月) 13:14:43
>>574
どうもです。。うちの環境の何かが壊れてるっぽいですね。。
Mac OS X 10.4.9 PPC
ruby 1.8.6 (2007-03-13 patchlevel 0) [powerpc-darwin8.9.0]
RubyはMacportsで入れたものです。
577デフォルトの名無しさん:2007/06/04(月) 13:18:51
データがおかしいということは、
その Ruby のせいなのかな。
578デフォルトの名無しさん:2007/06/04(月) 13:19:48
ちゃんと表示されるうちの Ruby のバージョン。
デフォでインスコされてたやつのまま放置。

ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
579576:2007/06/04(月) 13:25:20
お!システム標準のruby(1.8.2)でやってみたらちゃんと出ました!
うちのMacportsの1.8.6が壊れてるのかもしれないので
とりあえず再インストールしてみます。多謝!
580MoonWolf ◆MoonWdLnkQ :2007/06/04(月) 14:14:00
>>569
Debianのruby 1.8.6+PuTTYで試したらゴミ文字になったよ。
KconvだとNKFで文字コードを自動判定してUTF-8に変換するから
短い文字だと化けることがあるみたい。
昔HTMLの文字化けで使われた'美乳'を'賤'に追加したらちゃんと変換された。
581デフォルトの名無しさん:2007/06/04(月) 14:37:35
>>580
なるほどです。kconvのtoutf8等は文字コード自動判定してるんですね
(指定してないんだから当たり前か・・)。
旧バージョンでいけるのは、判定アルゴリズムが変わったのかな?
どっちにしてもこの場合は入力コードが分かってるんだから
明示的に指定しろってことですね。。
582デフォルトの名無しさん:2007/06/04(月) 14:45:41
錢はEUCでEFA2だけど、これをunicodeとみなしてそのままUTF-8に持ってくと
eebea2になるね
583デフォルトの名無しさん:2007/06/04(月) 15:46:14
元のエンコーディングがわかってるならiconvで変換した方が確実じゃないの。
iconv自体の変換テーブルが信用できない場合もなくはないが。
584デフォルトの名無しさん:2007/06/04(月) 16:25:56
え、変換元エンコードを指定してても化けるという話ではないの?
指定してなくて推測させて化けることがあるのは当たり前じゃん
585デフォルトの名無しさん:2007/06/04(月) 16:29:01
どっちのスレも文字コードの話ししててワロタ
586デフォルトの名無しさん:2007/06/04(月) 16:56:48
WindowsXP + irb + Poderosa3 で、
>>569のコードのUTF8大丈夫だったよ。
587デフォルトの名無しさん:2007/06/04(月) 22:49:01
メソッドの引数に()を付けるのと付けないのってどう違うのよ?
588デフォルトの名無しさん:2007/06/04(月) 23:01:50
どうも違わんよ
589デフォルトの名無しさん:2007/06/04(月) 23:10:13
ありがとう。
じゃあ好みでいいわけね。
590デフォルトの名無しさん:2007/06/04(月) 23:35:43
すみません
質問させてください

書籍「プログラミングRuby第二版言語編」のP68に
メソッドの本体には通常Rubyの式を書きます。ただし、メソッドの内に非singletonクラスまたはモジュールを定義することはできません。
とあるのですが、この非singletonクラスとはデザパタのsingletonとは別物でしょうか?
ためしにsingletonクラスをメソッドの中に書いて見たのですが、エラーになります。
Rubyではsingletonとは何か特別な意味があるのでしょうか?

よろしくお願いいたします。
591デフォルトの名無しさん:2007/06/04(月) 23:40:42
特異クラスのことじゃないかな
592デフォルトの名無しさん:2007/06/05(火) 00:45:59
>>590
別物。

「特異」という意味では同じだけど、
デザパタ: 「一つしか無い」事を意図的に保証
Rubyのクラス: 「固有」だから自ずと他のものではありえない
ってことで。

Rubyの「非singletonクラス」っつーのは、まあ「普通のクラス」と
思っといて間違いない。singletonクラス自体が何かとか、どういう時に
使うとかは本にあると思う。

そういえば、singletonクラスが>>591の通り特異クラスと言うのは
やっぱデザパタとの混同を避けるためなんだろうね。
一部コミュニティでは「eigenclass」なんて呼び方も定着しつつある。
593デフォルトの名無しさん:2007/06/05(火) 01:02:36
>>592
>一部コミュニティでは「eigenclass」なんて呼び方も定着しつつある。
えーいいじゃん singleton class で。
594デフォルトの名無しさん:2007/06/05(火) 01:09:19
10.0/3*3

やると、答えが、10.0になるのはなんででしょう?
他の言語だと、9.9999・・・になると思うのですが

前にどこかのwebページで見たのですが、忘れてしまいました。
595デフォルトの名無しさん:2007/06/05(火) 01:13:11
あれ?

#include <stdio.h>

main(void)
{
float d = 10.0/3*3;
printf("%f", d);
}

でも、10.0になるな。
俺の勘違いか。
596デフォルトの名無しさん:2007/06/05(火) 01:14:14
変数にしたほうが良くない?
最適化してくれそう
597デフォルトの名無しさん:2007/06/05(火) 01:29:57
>>595
それコンパイル時の最適化で /3*3 削られない?
598デフォルトの名無しさん:2007/06/05(火) 01:31:59
だから変数にしてレジスタに入るようにしろと
その前にスレ違い
599デフォルトの名無しさん:2007/06/05(火) 01:45:45
rubyと他の言語との比較の話なんですが、スレ違いですか?
600デフォルトの名無しさん:2007/06/05(火) 01:47:16
#include <stdio.h>

float d()
{
return 10.0;
}
float e()
{
return 3.0;
}
float f()
{
return 3.0;
}
main(void)
{
printf("%f", d() / e() * f());
}

でも、10.0になった。

rubyの/3*3も最適化?かと思って、

a = 10.0; b = 3.0; c = 3.0; a/b*c

にしたのだが、やはり、10.0だ
601デフォルトの名無しさん:2007/06/05(火) 01:49:23
irb(main):022:0> d=a/b; puts d; e = d * c; puts e
3.33333333333333
10.0

むむむむ・・・
602デフォルトの名無しさん:2007/06/05(火) 02:22:46
ループして0.1を1000回くらい足してみろ
603デフォルトの名無しさん:2007/06/05(火) 02:43:34
>>589
明示的にカッコがつくとパース時に最初からメソッドだと思って検索してくれるような気がする
(本当にそういう優先動作になってるかどうかは知らない)

Rubyやる前は var = method_hoge() のように空の引数を書くことが当たり前でわかりやすいと思ってたんだけど、
Rubyやるようになってからは「メソッドであること」はメソッド名に負わせるようにして空の引数は省略するようになった
604デフォルトの名無しさん:2007/06/05(火) 05:39:28
すいません、
ARGVで渡された文字の配列を適宜つないで文字列して最後にsystem()に
渡すプログラムを作ったのですが、
たまにARGVの文字列で空白やクォートを含むものがあり(これら以外にもあるかも)、
その結果system()内でshのエラーになるようです。
こういう場合system()にどのようにコマンドの文字列を渡せばいいでしょうか。
605デフォルトの名無しさん:2007/06/05(火) 09:00:20
>>569
仕様だよ、元の文字コードわかるんなら明示的に指定しろヴォケ
・・・ってレスしようとして念のため確認したらバグでした(
606デフォルトの名無しさん:2007/06/05(火) 09:13:05
>>604
system(*ARGV)
607デフォルトの名無しさん:2007/06/05(火) 09:22:03
>>603
カッコがついてもそうだけど、引数があるだけでもメソッドと認識する。
ローカル変数に引数はつかないからな。
608デフォルトの名無しさん:2007/06/05(火) 10:44:04
>>602
irb(main):024:0> i=0;1..1000.times{i+=0.1};i
=> 99.9999999999986

なるほど・・・
もしやと思って、

irb(main):032:0> 0.3333333333333333 * 3
=> 1.0

orz

そういうことですか。
二進数計算の誤差ってやつ?
609デフォルトの名無しさん:2007/06/05(火) 13:57:25
すみませんまた文字コードの質問です。
-Kオプションは「文字列やアクセスするファイルの内容」の
コードを指定するってマニュアルに書いてますが、
ソース中に書かれた文字列と、操作するファイルの文字コードは
違う場合もあると思うんですがその場合はどっちを指定すべきでしょう?
同じでないとうまいこと動かない場合があるということでしょうか?
610デフォルトの名無しさん:2007/06/05(火) 14:00:02
えーと、、、元ソースと、require したソースで文字コードが違うの?
611デフォルトの名無しさん:2007/06/05(火) 14:15:33
じゃなくて、スクリプトのコードと、
そのスクリプトで操作するファイルのコードが違う場合です。

んとたとえば、いろんなサイトのHTMLを処理するとすると
EUCだったりSJISだったりいろいろだと思うんですけど
それを同じUTF-8で書いたスクリプトで扱おうとする場合などです。
612デフォルトの名無しさん:2007/06/05(火) 14:21:33
別に読み込むファイルなら文字コードなんてどうにでもなるでしょ
613デフォルトの名無しさん:2007/06/05(火) 14:31:00
>>609
スクリプトのコードを指定すべき
614デフォルトの名無しさん:2007/06/05(火) 15:09:47
ruby -K で指定する文字コードは「そのスクリプト自体」の文字コード
文字列内部操作の文字コードは自分で1種類に決めておいて読み込み時に変換するのが望ましい
読み込むファイルの文字コードはtoeucやtoutf8などで「決めておいた文字コード」へ変換

そういう癖をつけておかないと動かないありがち例:
================
nekosearch.rb(いわゆる文字コードはいわゆるutf8)

/usr/bin/ruby -Ku

file = File.read('euc.txt') # toutf8の変換忘れた

if /ねこ/ =~ file then # スクリプト自体がutf8なので無指定の /ねこ/ はutf8の「ねこ」にのみマッチ
puts 'ねこがいたよ!'
end

===============
euc.txtの中身

ねこだいすき
ねこだいすき
ねっこだいすっき

================
実行結果

~$ ruby ./nekosearch.rb
~$
615MoonWolf ◆MoonWdLnkQ :2007/06/05(火) 15:53:16
-Kで指定する必要があるのは文字列リテラルとか正規表現のデフォルトの文字コードを
指定する必要がある場合だけでしょ。
読み書きするファイルの文字コードは$KCODEとは無関係と思ったほうがいい。
複数文字コード読み書きするならruby-Kuにして内部処理は全部UTF-8に統一するのがいいかな。
616デフォルトの名無しさん:2007/06/05(火) 16:05:39
なるほどマニュアルに「アクセスするファイルの・・」っていう
記述があったのでよくわからなくなってたんですが
つまりは読んだあとパーズ(?)したりするときに
正規表現などを使うと指定した文字コードが仮定されるので
読んだものをその文字コードにあらかじめ変換しまえばよいと。
全部処理はUTF-8にしてruby -Kuでやってみます。ありがとうございます。
617デフォルトの名無しさん:2007/06/05(火) 18:45:24
Rubyのリファレンスが一つのプレインテキストになってるようなのありませんか?
618デフォルトの名無しさん:2007/06/05(火) 19:05:15
elsifのように制御構造をチェインする文法がunlessの場合はないのは
なんでなのでしょうか?
ちょっと不自然な感じがしました。
(でもelseunlessとかだと違和感ありまくりなのですが)
619デフォルトの名無しさん:2007/06/05(火) 19:09:13
unless 自体濫用しない方がいいと思うし、そんなもんじゃない?
620デフォルトの名無しさん:2007/06/05(火) 19:20:53
elsif自体、Perlに入ってたからしかたなく入れたという感じがする
621デフォルトの名無しさん:2007/06/05(火) 19:25:33
チェインは大概caseでいいしなぁ
notでそんなにチェインする必要ってあるかな?
622デフォルトの名無しさん:2007/06/05(火) 19:39:12
>>618
俺はunlessもelsifもすごく便利だと思ってるけど
かといってunlessチェインは必要とは思わないなー
何でかって考えると

1.elsifと比べて、あまり使いたい機会がない
2.elsif notで代用できる
3.適当な単語が思い浮かばない

そして重要な理由として
4.頭がunlessチェインについていかない
623デフォルトの名無しさん:2007/06/05(火) 20:09:00
else if を elsif とか elif とかいろんな言語でいろんな縮め方してるけど
「 ef 」 まで踏み込んだ言語ってあるのかな
if と同じ2字で列を揃えられるから綺麗だと思うんだけど
624デフォルトの名無しさん:2007/06/05(火) 20:10:33
if(hoge)
ef(hage)
ef(hige)
else
end
625デフォルトの名無しさん:2007/06/05(火) 20:37:47
if
ef
fi
626デフォルトの名無しさん:2007/06/05(火) 21:25:21
(1..100).each do |i| printf(["%5d", " Fizz", " Buzz", "FizzBuzz\n"][[3, 0, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 0, 0][i % 15]], i) end
627デフォルトの名無しさん:2007/06/05(火) 21:35:56
もうおなか一杯
628デフォルトの名無しさん:2007/06/05(火) 21:53:58
if foo > bar ->
  foobar
[] foo < bar ->
  barfoo
[] else ->
  foobarbaz
fi

……いかん SR なんぞ忘れた……
629デフォルトの名無しさん:2007/06/05(火) 22:21:46
派生クラスと基底クラスではインスタンス変数を共有するわけですが、
これって、知らずインスタンス変数の名前が重なったときに、
悲しいことになる気がしています。

Ruby では派生自体、あまりしないものなんでしょうか?
630512:2007/06/05(火) 23:21:01
それは考え方次第。派生つかう連中は、ぶつかれば直せばいいとう考え方。
ぶつかる可能性はゼロではないが、極めて低いから、それよりは便利さをとるという態度。
そして、そんな態度でもうまくいくやつはうまくいく。うまくいかないやつは派生使わなくてもうまくいかない。
631デフォルトの名無しさん:2007/06/05(火) 23:51:04
あと、派生クラス、基底クラスってのはC++系の言葉だから、
Rubyではスーパークラス、サブクラスと呼ぼうぜ。
632デフォルトの名無しさん:2007/06/05(火) 23:51:49
順序が逆になってしまった。
スーパークラスがC++でいう基底クラスのほう。
633604:2007/06/06(水) 00:19:07
>>606
>system(*ARGV)

どうもありがとうございます。ちなみにこれは
1. ruby の system() はコマンドの引数をばらした形でも受け付けてくれる
(で、空白等は内部でよしなに処理してくれる)
2. 配列を複数の引数として渡したいときは先頭に*を付ける
という理解で良いでしょうか?

ちなみに 1. がもしなかったら(Cのsystem()みたいに)どうやるんでしょう。
蛇足ではありますが。
634デフォルトの名無しさん:2007/06/06(水) 00:43:18
>>630
べつに便利さをとってこんな仕様になったわけでもなかろうに。
635デフォルトの名無しさん:2007/06/06(水) 00:51:36
>629
2.0ではその辺をちゃんとしようとかいった議論があったようななかったような。


Ruby では派生をあまりしない、というのもその通りだと思う。 is_a 関係に
あるというだけで派生したりはしない。青木さんのるびま記事にも、そんなこ
とが書いてあったね。
636デフォルトの名無しさん:2007/06/06(水) 00:55:45
>>512
特に「ぶつからない様に」とかしているわけじゃないんですね。
問題が出たらユニットテストで発見できるものの、
もし「あ〜ここがまずかったのか!」というのを何度も体験したら
ウンザリしちゃうかも。
それとも「名前がかぶる」っていう時点で何かよくない兆候なのかなぁ。
637デフォルトの名無しさん:2007/06/06(水) 01:02:49
>>635
おお、そうなんですか。うんうん是非ちゃんと(?)してほしい。
やはり Ruby では派生をあまりしないのですね。
るびま記事は読んでないので、明日にでも見てみます。どもです。
638デフォルトの名無しさん:2007/06/06(水) 01:03:26
深く考えてないけど、確かに、継承した(is-aである)のなら、
名前がかぶるインスタンス変数ってのはなかなか出てこない
ような気がするな。親のをアクセサメソッド経由で使えそうなものだ。
639デフォルトの名無しさん:2007/06/06(水) 01:14:09
$cat printa.rb
puts "a=#{a}"

$ruby -e "a=4" printa.rb
a=4

みたいな事はできませんか?
640デフォルトの名無しさん:2007/06/06(水) 01:20:16
e=4; load "printa.rb"
641デフォルトの名無しさん:2007/06/06(水) 01:35:00
>>638
ですよね…って思いつつも @output とか @result とかは
すぐぶつかる気がしてきました。命名が悪い?
かといって究極的に名前の衝突を怖がると、
再利用目的のモジュールやクラスに
インスタンス変数が持てなくなるし…。
何かスッキリできるアイデアは無いもんですかねぇ。
642デフォルトの名無しさん:2007/06/06(水) 01:51:12
>>608
単にprintfとかの仕様
643デフォルトの名無しさん:2007/06/06(水) 02:36:17
単に表示上だけの話というわけでもない

a = b = 1.0
b /= 3; b *= 3
p a, b, a==b

1.0
1.0
true
644デフォルトの名無しさん:2007/06/06(水) 03:56:39
>>636
名前がかぶるだけだったら問題ない
それを容易に発見出来ないのが問題
645デフォルトの名無しさん:2007/06/06(水) 06:20:50
>>641
命名も悪いけど
その名前のインスタンス変数が沢山必要になる設計って
どんな設計なんだろうと心配してしまう
646デフォルトの名無しさん:2007/06/06(水) 07:30:28
590です
>>591>>592>>593
遅くなりましたが、レスありがとうございます

しかしながら、特異クラスとやらが良くわかりません。
どうやったら特異クラスをかけるのでしょうか?
そして、それをメソッド内で定義できるのでしょうか?
よろしくお願いいたします。
647604:2007/06/06(水) 07:43:53
>>606
すみません、別の問題が発生しました。
実は system(string) を呼ぶときに > でリダイレクトを期待していた呼び出しが
ありました。system(*array)だと sh 経由じゃなくなるみたいでよくないようです。
リダイレクトを簡単に済ませたかったんですが。

マニュアルをぱっと見たところでは system() のようにバラでコマンド引数を与えられる
のは exec() ですか。もしかして fork open dup exec 系のプログラムを書かないと
いけないんですかねえ。
648デフォルトの名無しさん:2007/06/06(水) 08:50:14
Rubyのソース中の数値にマッチするのって
0x[0-9A-Za-z]|[+-]?\d+(\.\d+)?
でいいですか?
649デフォルトの名無しさん:2007/06/06(水) 09:52:34
([+-]\s*)?(0[xX][0-9a-fA-F]+|0[bB][01]+|0[0-7]+|\d+(\.\d+)?(e[+-]\d+)?)
こんなところじゃないかな。
650デフォルトの名無しさん:2007/06/06(水) 11:59:26
>>630
お前それ好きだなw
651デフォルトの名無しさん:2007/06/06(水) 14:25:30
>>647
クォートしていいメタキャラクタとしていけないものと、
ちゃんと区別できるようなデータになってるのか?
一辺、例を示してみ。
652デフォルトの名無しさん:2007/06/06(水) 15:11:12
>>639
-sオプションがつかえる

$ cat hoge.rb
puts $data
$ ruby -s hoge.rb -data=10
10

でもスクリプト名が必要だから、-eだとつかえないかも
653デフォルトの名無しさん:2007/06/06(水) 15:52:02
特定の文字が入っていると、実行時にエラーが出てしまいます。
何故なのでしょう?
xyzzyで、utf-8n(crlf)で保存しています。
-Kで、utf8を指定しています。

エラー: unterminated string meets end of file

----------------
#!ruby -Ku
puts "ん"
----------------

654653:2007/06/06(水) 15:54:25
環境は、WindowsXPのRuby-win32です。

あれ?と思ったら、
コマンドプロンプトや、bash上から実行したら、きちんと実行できますね

どうも、xyzzyのruby-modeの C-C, C-X で、だけ起きるようです。
なんでだろ・・・。
655653:2007/06/06(水) 15:57:06
ruby-modeのC-C, C-Xは、どうも、SJISに変換して実行している?ようで、
utf-8なのに、xyzzy内のコンソールの出力もSJISになってました。

おとなしく、sjisにすることにします。
656デフォルトの名無しさん:2007/06/06(水) 17:17:41
>>652
> でもスクリプト名が必要だから、-eだとつかえないかも
$ ruby -s -e 'p $data' -- -data=10
"10"
657デフォルトの名無しさん:2007/06/06(水) 17:21:27
>>655
*default-process-encoding* をいじってみれば?
658604:2007/06/06(水) 20:22:27
>>647
>クォートしていいメタキャラクタとしていけないものと、
>ちゃんと区別できるようなデータになってるのか?

とりあえずメタキャラクタはシェルのリダイレクト > の箇所だけです。
将来的にはもう少し複雑なもの(例えば >パス名 2>&1 みたいな)も使いたくなるかも
しれませんが。
それ以外の箇所ではメタキャラクタとして解釈してほしくないです。例えばパス名に*が
入っていたとしても普通の文字として扱いたいです。

>一辺、例を示してみ。

system() に食わせたいのは、普通に
コマンドパス名 オプション パス名 > 別のパス名
みたいな感じのものです。system(string) を使っていたときは「パス名」か「別のパス名」
にスペースやシングルクォート(いずれも ASCII にあるやつです)があったときエラーに
なってたと思います。system(*array) では > がエラーになってたと思います。
659デフォルトの名無しさん:2007/06/06(水) 21:14:56
>>647
> 実は system(string) を呼ぶときに > でリダイレクトを期待していた呼び出しが
> ありました。system(*array)だと sh 経由じゃなくなるみたいでよくないようです。
> リダイレクトを簡単に済ませたかったんですが。
スレッドセーフじゃないけど、こんな感じで $stdout とかを reopen すればいいよ。

require "tempfile"

def capture
tmp = Tempfile.new("hoge")
stdout = $stdout.dup
stderr = $stderr.dup
begin
$stdout.reopen(tmp)
$stderr.reopen(tmp)
yield
ensure
$stdout.reopen(stdout)
$stderr.reopen(stderr)
end
begin
tmp.flush
tmp.rewind
tmp.read
ensure
tmp.close(true)
end
end

p capture{ system("ls", "-la") }
660デフォルトの名無しさん:2007/06/06(水) 22:39:58
>>644
> それを容易に発見出来ないのが問題
そうなのです。なので、できれば名前がかぶったら分かる方法または
かぶっても別物になる仕組みはないかと思ってます。

>>645
> その名前のインスタンス変数が沢山必要になる設計って
> どんな設計なんだろうと心配してしまう
すごく安易な名前だとは思っているのですが、
名前が簡単でもクラスの役割と合わせるとその名前が
簡潔だったりすることってありません?
661デフォルトの名無しさん:2007/06/06(水) 23:19:31
@output なんて名前今まで一度も使ったことねーな…
662デフォルトの名無しさん:2007/06/06(水) 23:30:10
>>660
いまいち使い方がイメージできないんだが・・・
@outputや@resultって、どういう風に使うんだ?
なんかのデザインパターンで必要になるのかな
663デフォルトの名無しさん:2007/06/06(水) 23:50:15
@resultはまだわからんでもないが(でもおれも使わんが)、
変数名に動詞の@outputはないだろ、常識的に考えて・・・
664デフォルトの名無しさん:2007/06/06(水) 23:54:16
そうか? 俺はローカル変数なら使うよ
というかoutputは名詞でもあるぞ
665デフォルトの名無しさん:2007/06/07(木) 00:08:22
疲れてて思いつかない時には出力をよってたかって溜めておく一時変数にoutputを使うことはあるなー
666デフォルトの名無しさん:2007/06/07(木) 00:26:59
IOオブジェクトによく使う<input、output
667デフォルトの名無しさん:2007/06/07(木) 00:27:41
俺も一時変数にoutputやresultは使う
だがインスタンス変数に@outputや@resultは使ったことないな
どんなクラスを作ろうとしてるんだろう?
668デフォルトの名無しさん:2007/06/07(木) 00:29:05
>>666
でもそれ継承して同じような名前で別目的で使いたい場合って何だろう?
669デフォルトの名無しさん:2007/06/07(木) 00:35:48
>>662〜667
正に >>666 さんの言われるように IO オブジェクトをしまうときに
@output とかはあるかな、と思ってます。Logger モジュール作るとか。
※そもそも Logger モジュールなんて作るか?という点は
Ruby だとどうするのがロギングのセオリーなのかとかまだ知らないので
スルーしてください。

>>668
↑で書いた Logger モジュールで言うと、
継承、というよりモジュールとして作っておいて
モジュールを利用するクラス側で include したものの、
クラス側も IO オブジェクトを持ってて、
インスタンス変数名が同じだった…とかを心配してます。
670デフォルトの名無しさん:2007/06/07(木) 00:54:33
まあ、C++やJavaならprotectedやめてprivateにしろって話だよな。Rubyには
privateないの?
671デフォルトの名無しさん:2007/06/07(木) 00:55:10
すいません、教えて頂けないでしょうか
初心者なので全く見当違いなモノを書いてるような気もするんですが・・・
#AAA#(a11 a12 a13)
#BBB#(b1)
#CCC#(c1)
#AAA#(a21 a22 a23)
#BBB#(b2)
#CCC#(c2)



↑上の文から#AAA#と#CCC#の()内を抽出し、
a11c1
a12c1
a13c1
a21c2
a22c2
a23c2



と表示したいのです。
672604:2007/06/07(木) 00:55:30
>>659
>スレッドセーフじゃないけど、こんな感じで $stdout とかを reopen すればいいよ。

ありがとうございます。うまくいきました。
Tempfile というクラスは便利そうですね。なお、自分の場合リダイレクトしたファイルを
残したいので、Tempfile でなく普通にファイルを open しようかと思いますが...
ちなみに yield というのを知らなかったんですが、面白いですね。
673671:2007/06/07(木) 00:58:20
↓取り敢えず書いてみたヤツです
#!/usr/bin/ruby
a=[]
c=[]
while line=gets
if /#AAA#\((.*)\s(.*)\s(.*)\)/ =~ line
a.push $1,$2,$3
end
if /#CCC#\((.*)\)/ =~ line
c.push $1
end
end
n=0
while a!=a.last
puts a[n]+c[n]
puts a[n+1]+c[n]
puts a[n+2]+c[n]
n=n+1
end

特に2個目のwhile辺りが
674デフォルトの名無しさん:2007/06/07(木) 01:05:38
色々変だけど表示できてるならいいじゃん
675デフォルトの名無しさん:2007/06/07(木) 01:12:58
>>674
いや、表示できないんです
n=n+1の所で・・・
で、ループしないのでwhile a!=a.lastも合っているかどうか
676675:2007/06/07(木) 01:13:46
スイマセン、ageてしまいました
677デフォルトの名無しさん:2007/06/07(木) 01:19:47
arr = Array.new
re = /#AAA#\((.+?) (.+?) (.+?)\)..+?#CCC#\((.+?)\)/m
ARGF.read.scan(re){
arr.push([[$1,$2,$3],$4])
}

arr.each do |a|
puts "#{a[0][0]}#{a[1]}"
puts "#{a[0][1]}#{a[1]}"
puts "#{a[0][2]}#{a[1]}"
end


たぶん動く
めんどくさいので「#AAA#から#CCC#まで」をひと塊として配列にぶち込んだ
データは一気に読み込んでるので、100メガ単位とかで実行マシンのメモリに対してあまりに大きいと危険
678675:2007/06/07(木) 01:22:45
>>677
有難うございます、本当に助かりました
679デフォルトの名無しさん:2007/06/07(木) 05:27:23
> ※そもそも Logger モジュールなんて作るか?という点は
> Ruby だとどうするのがロギングのセオリーなのかとかまだ知らないので

知りたいので、スルーしないでください
680デフォルトの名無しさん:2007/06/07(木) 06:11:34
p $:
681デフォルトの名無しさん:2007/06/07(木) 06:34:25
>>670
「privateなインスタンス変数」を作る機能はRubyにはない

>>679
Rubyのセオリーとか特にない気もするが
あえて言うならrequire 'logger'
682デフォルトの名無しさん:2007/06/07(木) 15:57:27
rhtmlとjavascriptの連携についての質問です。
js内の変数をruby側の変数に代入したいのですがどのようにすればよいのでしょうか?

やりたいことをそのまま書くと、

function pop(jsStr){
<% rbStr = jsStr %>
alert(<%= rbStr %>);
}

rbとjs間で変数を代入し合える方法がありましたら、ご教授の程宜しくお願いします。
683デフォルトの名無しさん:2007/06/07(木) 16:18:41
rhtmlのrubyが評価されて出力されてから、Javascriptが評価されるから、
ruby→javascriptは、できても、逆は、
無理なんじゃない?
684デフォルトの名無しさん:2007/06/07(木) 16:19:34
>>682
Rubyがサーバ側で実行され、出力された後で、JSはブラウザ側で実行されるっていうイメージはできてんのか?
その上で、JSからさらにサーバ側にアクセスし返すにはAjaxを使う。
つーかWebProg板のRoRスレ行けば?
685682:2007/06/07(木) 16:54:10
ということは、ajaxで処理して返すrbを別に用意しなくてはならないのですね。
なんとなく流れはわかりました。ありがとうございます。
<%= %>タグ内をjavascriptコードに置き換えたりするのもおもしろそうですね。
失礼しました。
686デフォルトの名無しさん:2007/06/07(木) 17:00:23
Rubyist Magazine - Ruby Library Report 【第 4 回】 Win32Utils
http://jp.rubyist.net/magazine/?0005-RLR

ここを見て、クリップボードを利用しようと思ったのですが、

require 'win32/clipboard'
puts Win32::Clipboard.data

中身の表示はできましたが、

require 'win32/clipboard'
Win32::Clipboard.data = "hoge moge poo"

で、設定ができません。

エラーメッセージは、
undefined method `data=' for Win32::Clipboard:Class (NoMethodError)
でした。実装されていないでしょうか?

687デフォルトの名無しさん:2007/06/07(木) 17:22:12
>>686
されてない。が、set_dataならあった。
格納するデータがテキスト限定じゃなくなったのの
影響っぽいな。
詳しくはソース見れ。
688デフォルトの名無しさん:2007/06/07(木) 17:30:35
>>687
Win32::Clipboard.set_data("hoge moge poo")

でいけました。サンクスです。
689デフォルトの名無しさん:2007/06/07(木) 17:33:38
例外を細くして、メッセージダイアログを出したいのですが、
詰まっています。ご助言くだされ。

require 'win32ole'

def show(msg, title)
 wsh = WIN32OLE.new('WScript.Shell')
 wsh.Popup(msg, 0, title, 0 + 64 + 0x40000)
end

begin
 raise "exception"
rescue => e
 show(e, "error")
end

とすると、

in `method_missing': undefined method `value' for #<RuntimeError: exception> (NoMethodError)
 from (ファイル名):5:in `show'
 from (ファイル名):11

と出てしまいます。

show("Hello", "error")

などちゃんとダイアログが出るのですが・・・
690デフォルトの名無しさん:2007/06/07(木) 17:42:31
eは例外クラスだからじゃないか?
e.message渡せば?
691MoonWolf ◆MoonWdLnkQ :2007/06/07(木) 17:52:39
set_dataじゃない?
692デフォルトの名無しさん:2007/06/07(木) 18:19:35
>>690
そっか、俺、アホだwww

begin
 raise "exception"
rescue => e
 show(e.to_s, "error")
end

でいけた。
e.message
でもいけますた!

俺何年Rubyやっとんだ・・・
693デフォルトの名無しさん:2007/06/07(木) 22:27:53
Arrayクラスの範囲指定のメソッドと同じIFのメソッドを
作りたいのですが、
def [](start..last)
とやってもだめなようです。
どうしたらいいもんでしょうか
694デフォルトの名無しさん:2007/06/07(木) 22:36:54
>>693
1..10 とかは Range クラスのインスタンスなんで普通に引数に取ればいいよ。
def [](range)
# range.begin と range.end を使ってお好きにどうぞ
end
695デフォルトの名無しさん:2007/06/07(木) 22:52:16
>694
引数は1つなんですね
ありがとうございます
696デフォルトの名無しさん:2007/06/08(金) 16:36:13
arrayを逆順にeachしたいのですが、

 [1,2,3,4,].reverse.each{|i| puts i}

みたいに、reverse使うのって、って、効率わるいですかね?
配列がでかいと、遅いとか・・・
697デフォルトの名無しさん:2007/06/08(金) 16:39:50
[1,2,3,4,].reverse_each{|i| puts i}
698デフォルトの名無しさん:2007/06/08(金) 16:57:42
>>696
あんまり速度を気にするほどの部分でもない
699デフォルトの名無しさん:2007/06/08(金) 16:59:59
Rubyって見栄えのいい高級な書き方すると
後で高確率でチューニングするハメになるんだよな・・・
700デフォルトの名無しさん:2007/06/08(金) 17:09:56
それはその人の見通しが悪いだけであって言語のせいではない

そういう人はきっとPerlで書いてもJavaで書いてもC…はもともと見通し悪いか
701デフォルトの名無しさん:2007/06/08(金) 17:39:45
irb> arr = ['1st','2nd','3rd']
=> ["1st", "2nd", "3rd"]
irb> arr.object_id === arr.reverse.object_id
=> false
irb> arr[0].object_id === arr.reverse[-1].object_id
=> true

ということで、並びだけが変わっただけで要素の指してるものは一緒の模様
要素数がバカみたいに多いのでない限り負荷とか気にせずreverseしてよし
702デフォルトの名無しさん:2007/06/08(金) 18:00:12
>>697
reverse_eachってあったのね orz
703デフォルトの名無しさん:2007/06/08(金) 18:15:07
Cからすでに存在するRubyのブロックを付けてRubyのメソッドを呼ぶにはrb_iterate、
またはtrunkにあるrb_block_callを使うしか方法はありませんか?

Rubyで書いた例:
  def method(argblk, &block)
    method_deep(&argblk)
    method_deep(&block)
  end

Cで次のように記述したい:
  VALUE func(VALUE self, VALUE argblk)
  {
    <ブロック付きメソッドを呼ぶAPI>(self, argblk, rb_intern("method_deep"), 0, 0);
    <ブロック付きメソッドを呼ぶAPI>(self, rb_block_proc(), rb_intern("method_deep"), 0, 0);
  }

rb_yieldの方がrb_funcall(... "call" ...)よりも実行コストが遥かに低く、rb_iterateや
rb_block_callは毎回新しいProcインスタンスを生成するので、再帰処理を
行うとき実行コストが馬鹿になりません。

どなたかおいしいAPIや、うまい方法があればご教授ください。
704703:2007/06/08(金) 20:44:08
trunk-12273上でRubyコードのみを試したら、Ruby-1.8.6上での
RubyとCの混成コードよりも圧倒的に成績が良かったです
>>703は忘れて見なかったことにしてください orz
705デフォルトの名無しさん:2007/06/08(金) 21:41:45
文字列として
"(a)\[(b)[(c)[(d)\](e)](f)"
みたいなのがあったとき、これを正規表現とみなした場合に
(a),(b),...が文字クラス内にあるかないかを簡単に判断
する方法ってないかなあ。
706デフォルトの名無しさん:2007/06/09(土) 03:06:47
日本語でおk
707デフォルトの名無しさん:2007/06/09(土) 07:03:26
え、問題わからないの?

問題はよくわかるんだけど、答はわからないよ。
708デフォルトの名無しさん:2007/06/09(土) 08:38:20
日本語でOK
709デフォルトの名無しさん:2007/06/09(土) 08:59:01
ようするにこういうことかな。
/(\A|[^\\])\[(.*?[^\\])\]/ =~ '(a)\[(b)[(c)[(d)\](e)](f)' # => 7
$2 # => "(c)[(d)\\](e)"

710MoonWolf ◆MoonWdLnkQ :2007/06/09(土) 15:30:01
>>705
(a)→文字クラスの外
(b)→文字クラスの外
(c)→文字クラスの中
(d)→文字クラスの中
(e)→文字クラスの中
(f)→文字クラスの外

欲しいのはこういうこと?
711デフォルトの名無しさん:2007/06/09(土) 16:23:47
>>707
それは、お前が質問者だからだろ…。
712705 != 707:2007/06/09(土) 16:56:39
>>710
そういう事です。最初からそこまで書くべきでした。すみません。

>>709
tnx. ちょっとそのパターンでいろいろ試してみます。
というか、まず理解しようとしてみます。
713デフォルトの名無しさん:2007/06/09(土) 19:55:02
714MoonWolf ◆MoonWdLnkQ :2007/06/09(土) 21:20:26
>>712
文字クラスだと[A-Z]のような範囲指定とか[^0-9]みたいな否定もあるから
真面目に解析しようとすると大変じゃない?
715デフォルトの名無しさん:2007/06/10(日) 00:37:07
動的にインスタンス変数名を作りたいんですが
どうしたらいいでしょうか。

def create(name)
@#{name}
end

こんなのではだめなので、おねがいします。
716デフォルトの名無しさん:2007/06/10(日) 00:52:39
instance_variable_set(name, value)

nameは @ で始まる名前にすること。
717デフォルトの名無しさん:2007/06/10(日) 01:07:03
>716
できました
ありがとうございます。
718デフォルトの名無しさん:2007/06/10(日) 01:53:43
>>714
だと思います。
一文字づつ状態遷移で処理してくのが面倒だけど一番なのかなあ。
regex.cを見るとゾッとするけども。。。
719MoonWolf ◆MoonWdLnkQ :2007/06/10(日) 12:11:32
>>718
strscanあたりを使って正規表現パーサー(スキャナ?)みたいなのをつくることになりますね。
マッチングの処理は不要みたいなのでregex.cのようなことにはならないと思う。
720デフォルトの名無しさん:2007/06/10(日) 16:19:47
http://www.ruby-doc.org/core/classes/Module.html#M001677
を参考に
動的にインスタンス変数とアクセッサを作ろうとしているのですが、
def create_method(name)
var = "@#{name}"
instance_variable_set(var, 0)

self.class.send(:define_method, name) do |val|
if val
instance_variable_set(var, val)
else
instance_variable_get(var)
end
end
end

こんな風にすると目的は果せたのですが
warning: multiple values for a block parameter (0 for 1)
というwarningが出て困っています。
邪道すぎたでしょうか?
正当なやりかたを教えてください
721デフォルトの名無しさん:2007/06/10(日) 17:11:15
>720
作成されたメソッドに渡すべき引数が val と1つなのに、何も渡さないからエラーになるのだろう。

def create_method(name)
var = "@{name}"
instance_variable_set(var, 0)

self.class.send(:define_method, name) do |*vals|
if vals.empty?
instance_variable_get(var)
else
instance_variable_set(var, val)
end
end
end

この方式の方が有利な点はもうひとつあって、720の方式では作成したインスタンス変数に nil を代入できないが、これならできる。
722デフォルトの名無しさん:2007/06/10(日) 17:20:18
>721
できました。
ありがとうございます。
rubyのメソッドはよく可変引数を意識させられる
ので慣れがいりますね
723デフォルトの名無しさん:2007/06/10(日) 17:35:09
引数に*が書いてあるものはいまだに動作がわからん
724デフォルトの名無しさん:2007/06/10(日) 17:39:32
ただの配列だし
725デフォルトの名無しさん:2007/06/10(日) 17:51:24
分かれば簡単
配列なだけだからCのなんかよりよっぽどいい
726デフォルトの名無しさん:2007/06/10(日) 17:56:54
* は配列からタプルへの変換演算子。
関数の引数はタプルで実装されている。
727デフォルトの名無しさん:2007/06/10(日) 17:58:12
def foo(*args)
p args, args.class
end

foo(1,2,3)

def bar(args)
p args, args.class
end

bar([4,5,6])

結果
[1, 2, 3]
Array
[4, 5, 6]
Array
728デフォルトの名無しさん:2007/06/10(日) 18:05:33
foo(1,2,3) → 1, 2, 3 という 3 項目のタプルを foo に渡す
def foo(*args); ...; end → 渡されてきたタプルを配列に変換して args という変数で受ける
729デフォルトの名無しさん:2007/06/10(日) 21:19:44
JAVAと見比べてて分からないことがあるんだが、
JAVAって、複数のクラスを違うファイルに書いておいて、
相互に呼び出して連携させることができるだろ?
Rubyはそういうことできるの?
それとも、1つのファイルに長々と全部書かなきゃいけないの?
730デフォルトの名無しさん:2007/06/10(日) 21:41:20
>>729
importのこと?

require "ファイル名"

で普通に読み込めるよ
昔はともかく、今のスクリプト言語で出来ない言語は少ないと思われ
731デフォルトの名無しさん:2007/06/10(日) 21:47:10
>>729
Rubyではrequireが用意されている。
Javaは1クラス1ファイルの関係にあったけど、
Rubyは複数クラス1ファイルも可能だし、逆に1クラス複数ファイルも出来る。
732デフォルトの名無しさん:2007/06/10(日) 22:43:56
>>730-731
そういうことだったのか。
サンクス、よく分かったぜ。
733デフォルトの名無しさん:2007/06/10(日) 22:51:15
RDEというRubyの開発環境を使っていて、
test = <<EOM
これは山手線です
そうです"埼京線"です。
EOM
p test
と入れて実行すると、
"\202\261\202\352\202\315\216R\216\350\220\374\202\305\202\267\n\202\273\202\244\202\305\202\267\"\215\351\213\236\220\374\"\202\305\202\267\201B\n"
とコンソール画面に出力されてしまうんですが、
\nを改行のまま、日本語は日本語のまま出力できませんか?
734デフォルトの名無しさん:2007/06/10(日) 22:53:09
puts
735デフォルトの名無しさん:2007/06/10(日) 22:55:39
>>734さん
ありがとうございます!解決しました
736デフォルトの名無しさん:2007/06/10(日) 22:57:37
…。
737デフォルトの名無しさん:2007/06/10(日) 22:59:14
むしろ p をどういう表示メソッドだと学んだのかが気になるな
738デフォルトの名無しさん:2007/06/10(日) 23:21:45
predicate
739デフォルトの名無しさん:2007/06/11(月) 02:08:37
>>731
Javaのクラス名とファイル名が一致していないといけないっつーのもなんだかな
740デフォルトの名無しさん:2007/06/11(月) 02:23:44
最近rubyのよさが分ってきた
動的なことするのに慣れるとやばいね
関数型言語の利点を取りこんでるのかな
Javaとか使う気しなくなる
741デフォルトの名無しさん:2007/06/11(月) 09:50:32
動的なこと云々は関数型とは別に関係ないと思う。
742デフォルトの名無しさん:2007/06/11(月) 12:09:29
Ruby が関数型言語的な要素を持っていないとは言わないが、
このこととは関係ないな。
743デフォルトの名無しさん:2007/06/11(月) 12:13:15
1行ごとに別なこと書いてるのかも
744デフォルトの名無しさん:2007/06/11(月) 12:15:04
あーそう読むとわかるなw
745デフォルトの名無しさん:2007/06/11(月) 21:49:07
>>740はノストラダムスの4行詩だろ?
五島勉の本で見たことあるよ。
746デフォルトの名無しさん:2007/06/11(月) 22:29:15

 的
  型
   か
747デフォルトの名無しさん:2007/06/11(月) 23:53:35
最近
動的
関数型言語の
Java
748デフォルトの名無しさん:2007/06/12(火) 10:18:03
ShiftJISの文字列
"Rubyはウンコ"
にマッチするような正規表現
/(Ruby|Java|Perl|PHP)はウンコ/
をEUCのソースの中で使うにはどうしたらいいですか?
749デフォルトの名無しさん:2007/06/12(火) 13:50:54
>>748
/(Ruby|Java|Perl|PHP)はウンコ/s
750デフォルトの名無しさん:2007/06/12(火) 13:57:26
>>748,749
「はウンコ」をsjisで書くことを忘れずに。

しかし、たぶんそれじゃいろいろ問題があるだろうから、require "kconv"してあるとして、
Regexp.new("(Ruby|Java|Perl|PHP)はウンコ".tosjis, 0, "s")
とかでどうかな。
751デフォルトの名無しさん:2007/06/12(火) 22:31:56
webrickを使って、自作のCGIスクリプトを
スタンドアロンで動かすためのサーバを作ろうとしているのですが
探し回っても、情報がほとんど見当たりません・・・

Rubyリファレンスには詳しい情報がありませんし
Magazineの記事はプロキシ作りがメイン
Googleで検索しても、「使ってみた」的なblog記事しか見つからず
英語を覚悟して公式ページに行っても文書はない

諦めてwebrickのソースと格闘するしかないのでしょうか
752デフォルトの名無しさん:2007/06/12(火) 22:37:48
>751
Railsからパクったら?
753デフォルトの名無しさん:2007/06/12(火) 22:39:03
>>751
どこまで分かってて、どのあたりではまってるの?
とりあえず CGIInterpreter でググって見れば分かると思う。
754デフォルトの名無しさん:2007/06/12(火) 22:40:19
WEBrick::HTTPServerのドキュメントだけでつくれる内容のような。
755デフォルトの名無しさん:2007/06/13(水) 00:38:26
>>752
今までRailsに触ったことがないので、正直腰が引けていますが
お手本になりそうなら週末あたりにトライしてみます

>>753
色々なページを参考にさせていただいて

server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')

こうやって普通に動くところまでは行けたんですが

server.mount('/', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')

こうすると、PATH_INFOの値が正しく代入されなかったり
CSSや画像(相対URL参照)を呼べなかったりします
引数をいろいろ書き換えてみても、今ひとつ挙動が理解できず・・・
756デフォルトの名無しさん:2007/06/13(水) 07:08:45
>>749-750
ありがとうございまし
757デフォルトの名無しさん:2007/06/13(水) 10:15:45
758デフォルトの名無しさん:2007/06/13(水) 22:40:21
> server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
> こうやって普通に動くところまでは行けたんですが
> server.mount('/', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
このあとに
server.mount('/styles', WEBrick::HTTPServlet::FileHandler, 'css があるローカルのディレクトリ')
server.mount('/hoge.css', WEBrick::HTTPServlet::FileHandler, 'css のパス')
とかってやってる?
/ に blog.rb をマウントしただけなら / 配下はすべて blog.rb でハンドルする必要が
あると思うんだけど。

> こうすると、PATH_INFOの値が正しく代入されなかったり
今適当にためしたら PATH_INFO も取れたよ。
PATH_INFOが取れない最低限の再現コードをさらしたほうが早いかも
759デフォルトの名無しさん:2007/06/13(水) 23:12:00
perlの
substr($str, $idx) =~ s/(foo.*bar)/\U\1/
みたいなのは、どうするのがrubyっぽいのでしょうか。
760デフォルトの名無しさん:2007/06/13(水) 23:17:50
>759
perl知らないから
761755:2007/06/13(水) 23:49:36
>>758
助言を参考に、もう一度試してみました
正常に実行できる状態のコードはこんな感じです

require 'webrick'
server = WEBrick::HTTPServer.new({
 :DocumentRoot => Dir.pwd,
 :BindAddress => '127.0.0.1',
 :CGIInterpreter => 'x:/ruby/bin/ruby.exe',
})

server.mount('/blog.rb', WEBrick::HTTPServlet::CGIHandler, 'blog.rb')
['INT', 'TERM'].each {|signal|
 Signal.trap(signal){ server.shutdown }
}
server.start
762755:2007/06/14(木) 00:02:15
mountの引数を色々変えて実行してみました

1. server.mount('/blog.rb', HTTPServlet::CGIHandler, 'blog.rb')
→問題なく動く

2. server.mount('/', HTTPServlet::CGIHandler, 'blog.rb')
→相対パスで指定した画像やCSSを読み込めない
 (しかしリクエストは行われていて、ちゃんと200 OKが返っている)
 http://localhost/blog.rb にアクセスすると、PATH_INFOが '/blog.rb' になってしまう

3. server.mount('./', HTTPServlet::CGIHandler, 'blog.rb')
→スクリプトが実行できない
763755:2007/06/14(木) 00:06:53
考察
・mountの第一引数は、リファレンスには「ディレクトリを表すパス」と書かれているが
 実際にはファイルパスを指定しないと適切に動かない?
・第一引数は、サーバーのDocumentRootをルートとした絶対パスの必要がある?
764デフォルトの名無しさん:2007/06/14(木) 00:27:39
>>759


str = '_____foohogebar_____'
str[/(foo.*bar)/] = $1.upcase
puts str
=>
_____FOOHOGEHOGEBAR_____

こういうこと?

765デフォルトの名無しさん:2007/06/14(木) 00:28:22
おっとHOGE一個余計だた。
766デフォルトの名無しさん:2007/06/14(木) 02:39:11
>>764
多分違う。
置換の対象は、$strの$idx以降の部分文字列だから。
perlのsubstrは代入可能な l-valueを持っている。
767デフォルトの名無しさん:2007/06/14(木) 03:27:17
> str[/(foo.*bar)/]
こんなことできたんだ。。。
768デフォルトの名無しさん:2007/06/14(木) 08:15:40
しかも「最初にマッチした文字列が入る」なんて
普通に使うぶんには全く遠回りな動作しかしないのが狙いすぎてて反吐が全部出ちゃう(w
769デフォルトの名無しさん:2007/06/14(木) 09:48:40
条件分岐が100個くらいあるとき配列とハッシュとwhen〜caseのどれがいいのかな
770デフォルトの名無しさん:2007/06/14(木) 11:50:17
設計が悪い。
771デフォルトの名無しさん:2007/06/14(木) 12:11:20
クラス100個つくって多態するのとどっちが頭悪いでしょうか
772デフォルトの名無しさん:2007/06/14(木) 12:22:11
>>759
str = 'foobar_____foohogebar_____'
idx = 8
str[idx..-1] = str[idx..-1].sub(/(foo.*bar)/){$1.upcase}
puts str

=>
foobar_____FOOHOGEBAR_____

rubyっぽいかどうかは知らないが
773デフォルトの名無しさん:2007/06/14(木) 12:59:21
>>769
それだけじゃよく分からん
774デフォルトの名無しさん:2007/06/14(木) 13:30:07
>>769
そんなの保守できんのか。

何をもって分岐すんの?
775デフォルトの名無しさん:2007/06/14(木) 13:42:20
>>774
質問に質問を返すなよ、間抜け。
776デフォルトの名無しさん:2007/06/14(木) 14:55:37
質問に不備があるから問い直してるんじゃないの?
777デフォルトの名無しさん:2007/06/14(木) 14:56:52
ハッシュが使えるなら普通にハッシュだろ。
778デフォルトの名無しさん:2007/06/14(木) 15:02:56
そうだな、この場合ハッシュだな
779デフォルトの名無しさん:2007/06/14(木) 17:56:10
matzのとこのnaclがruby ralisisの開発者急募してるみたいだぞ。
matzに興味ある奴は、naclでぐぐってみ。
780デフォルトの名無しさん:2007/06/14(木) 17:57:08
そんな条件分岐なんかしないほうがいいよ
781デフォルトの名無しさん:2007/06/14(木) 18:16:50
(100..200)[0,5,10,0] => (100, 105, 110, 100)
みたな事できね
782MoonWolf ◆MoonWdLnkQ :2007/06/14(木) 18:22:37
>>781
仕様が全然わかんない。
110の次は本当は115で200まで5きざみでデータが欲しいのと違うの?
Rangeに定義するような仕様ではないな。
783MoonWolf ◆MoonWdLnkQ :2007/06/14(木) 18:24:58
あー、[100+0,100+5,100+10,100+0]ということか。
Range#endいらなくね?
784デフォルトの名無しさん:2007/06/14(木) 18:25:44
またperl厨か
785デフォルトの名無しさん:2007/06/14(木) 18:47:53
class Array
def select_by_index(*list)
ret = []
list.each{|i|
ret.push self[i]
}
ret
end
end

(100..200).to_a.select_by_index(0,5,10,0)

へぼですまぬ
786デフォルトの名無しさん:2007/06/14(木) 18:51:01
Rubyの文法に沿ってないから意図がぜんぜんわからんな
日本語で言ってもらえたほうがなんぼかマシだ
787デフォルトの名無しさん:2007/06/14(木) 21:59:16
>>785
それは [].values_at ではないか?
788デフォルトの名無しさん:2007/06/15(金) 11:16:04
正規表現にて、全角スペースの扱いで困っています。
次のような文字列があった場合にURL部を抜き出すにはどのようにすれよいのでしょうか?
現在は、[^\S| ] のようにしています。
どうぞ宜しくお願いいたします。(_ は 全角スペース,URLは毎度変化)

"http://google.co.jp/abc__"

789デフォルトの名無しさん:2007/06/15(金) 11:49:16
require 'uri'

str = <<EOB
グーグルのURLは以下のとおり(末尾に全角空白)
http://www.google.com/  
Rubyを検索したURLは次のようになる
http://www.google.com/search?num=50&hl=ja&q=Ruby&lr=lang_jaとかこんな感じ
日本語入りだとhttp://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=%E6%84%9B
メールはこちらまで→mailto:[email protected]
EOB

p URI.extract(str,'http')

##-----------

実行結果

["http://www.google.com/", "http://www.google.com/search?num=50&hl=ja&q=Ruby&lr=lang_ja", "http://www.google.com/search?num=50&hl=ja&lr=lang_ja&q=%E6%84%9B"]
790デフォルトの名無しさん:2007/06/15(金) 14:21:08
URIクラスは凄まじく便利なのに
微妙に知れ渡ってない気がする・・・
791デフォルトの名無しさん:2007/06/15(金) 14:35:58
class Base
def foo
@name = "foo"
bar
end
end

class Sub < Base
def initialize(name)
super()
@name = name
end
private
def bar
puts @name
end
end

sub = Sub.new("mona")
sub.foo

基底クラスから子のメソッドや変数にアクセス出来るのね・・・
792788:2007/06/15(金) 14:43:54
>>789
うわーーー!あまりの求めていた結果に感動です!
複数の例を盛り込んでいただいたことにも感動です!
URIは今まで、hostやらpathだけでしか使用していませんでしたがそんなすごいことができるんですね。。
ありがとうございました!
793デフォルトの名無しさん:2007/06/15(金) 15:38:54
>>791
その例だとJavaでも出来る。
ただしJavaの場合は
基底クラスに抽象メソッドを宣言しておく必要があるし
protectedと書く必要があるが。
(RubyのprivateとJavaのprivateでは意味が違うため)

というか、その例は作成してるインスタンスが派生クラスのインスタンスだから
「基底クラスからアクセス」とはあまり言わない希ガス。
794デフォルトの名無しさん:2007/06/15(金) 17:34:24
Rubyスクリプトのprivateは4割が完全な誤りで4割が別な書き方で消える
protectedに至っては9割5分までが間違いだ
795デフォルトの名無しさん:2007/06/15(金) 18:54:13
ただし、ソースはソニー
796デフォルトの名無しさん:2007/06/15(金) 21:25:14
Ruby...
http://elbereth-hp.hp.infoseek.co.jp/ruby.html

オフライン時や、Ruby公式がつながりにくい時(よくある・・・)用に、
RubyのHTML Helpを探しているのですが、
上記サイトでは、新しいものが、1.9.0用?しかないのですが、
これって、大丈夫なのでしょうか?

Rubyのオンラインヘルプのものと同じと考えてよいのですか?

>>794
誰か、その辺、ブログでもまとめてくれないですかね・・・
797デフォルトの名無しさん:2007/06/15(金) 21:33:54
>>796

> version 1.6 〜 1.9 対応リファレンス
> version 1.6 〜 1.9
> 1.6 〜 1.9

ということなのでしょうか
798デフォルトの名無しさん:2007/06/15(金) 23:47:22
>>794
kwsk
799デフォルトの名無しさん:2007/06/16(土) 04:45:17
>>788
解決したんでもういないかもしれんが、ブラケットの中にあるパイプ '|' は
何のためにあるんだ?
or の意味で使ってるのならいらんぞそれ。
800デフォルトの名無しさん:2007/06/16(土) 07:52:45
メールフォームcgiを作っているんですが、

require "cgi"  と読み込んで、

cgi['name']   と取得することはできるのですが、

to_name = cgi['name']  と変数に代入しようとするとエラーになってしまいます。

どうしてこうなるのか、どうすればいいのか、どうか教えてください。
801デフォルトの名無しさん:2007/06/16(土) 07:56:44
>>800
どんなエラーか書かないとわからない
cgi = CGi.new はしてるんだよね
802デフォルトの名無しさん:2007/06/16(土) 07:58:36
>>800
cgi = CGI.new

より先に書いていただけでした。
どうもすいません・・・。
803デフォルトの名無しさん:2007/06/16(土) 09:53:32
またすいません。メールCGIで、

sendmail.sendto( "[email protected]" )

と書く部分なんですが、

address = [email protected]
sendmail.sendto( "address" )

と書くと、作動しません。

address = "[email protected]"
sendmail.sendto(address)

ならOKなんですが、メアドは外部ファイルからの取り込みなので、これはできません。

sendmail.sendto( "address" ) のaddressを、
文字列ではなく、変数として認識させる方法を教えてください。
804デフォルトの名無しさん:2007/06/16(土) 09:59:17
外部ファイルからの取り込みだとできないってのがわからん
まあよくわからんが、eval使えば?
805デフォルトの名無しさん:2007/06/16(土) 10:23:23
「作動しません」とか「動きません」とか禁止
806デフォルトの名無しさん:2007/06/16(土) 10:25:14
ファイルが、
[email protected]
[email protected]
[email protected]

となっていて、
address = file.getsとやると、
どうしても、address = [email protected]となってしまうからです。

evalでもダメっぽいです。
エヴァルは""を解除するみたいですが、
僕がやりたいのは、""を付け加えることです。
807デフォルトの名無しさん:2007/06/16(土) 10:32:00
spam屋だな
変数内容確認の方法も知らずに永遠にさ迷っとれ
808デフォルトの名無しさん:2007/06/16(土) 10:32:50
ものすごく大きな勘違いをしてるようだが、、プログラムはRubyが初めて?
説明すんの面倒だな・・・
とにかくいろいろ試してみ、単純な形で解決すると思うよ
809デフォルトの名無しさん:2007/06/16(土) 10:34:13
>>806
つ p address
810デフォルトの名無しさん:2007/06/16(土) 10:37:37
yahooのメアドに一日100件送りつけて来るのはこいつか
811デフォルトの名無しさん:2007/06/16(土) 10:46:22
なんだ、スパマーだったのか
812デフォルトの名無しさん:2007/06/16(土) 11:05:59
ってもしかしてクオートの中に変数入れられる変なスクリプト言語からきてる勘違いか・・・
813デフォルトの名無しさん:2007/06/16(土) 11:09:11
色々根は深い
口頭で説明するのは割に合わん
814デフォルトの名無しさん:2007/06/16(土) 11:44:25
> ってもしかしてクオートの中に変数入れられる変なスクリプト言語からきてる勘違いか・・・
$foo = 'bar'
print "#$foo"
815デフォルトの名無しさん:2007/06/16(土) 12:03:49
"#{foo}" は変だと思わんが、"$foo"は変だろ
816デフォルトの名無しさん:2007/06/16(土) 12:23:53
>>814はわかってない
817デフォルトの名無しさん:2007/06/16(土) 13:33:20
リストに関数を適応するにはrubyではどうやってやればいいのですか?
mapcarにあたるものです。
818デフォルトの名無しさん:2007/06/16(土) 13:37:47
会社でrailsの案件をやることになった。俺以外rubyはつかえない。
んで、参考書を会社で買うことになったわけだが俺はネットで勉強したからどの本がいいのかわからん。
参考書も無駄に種類がでてやがって立ち読みするのも疲れた。
初心者〜上級者(になってもらわんと困る)におすすめな参考書を2,3冊教えてください。
819デフォルトの名無しさん:2007/06/16(土) 13:44:23
>>817
リスト.map{|v| 関数(v) }

でリストの各要素に関数を適用した結果が返るかと

mapの代わりに map! を使うと
結果を返す代わりに直接、元リストの内容を変更する
820デフォルトの名無しさん:2007/06/16(土) 14:00:14
>>819
ありがとうございます。なるほど、mapがあったのですね。
lispのmapcarやpythonのmapのように関数を渡すのとはちょっと違ってますね。
821デフォルトの名無しさん:2007/06/16(土) 14:09:08
>818
とりあえず
Ruby on Rails入門―優しいRailsの育て方
が上級でもリファレンスになっていいらしい
が、中級以上向けな気がする
手取り足取りな入門本は、俺も欲しい
822デフォルトの名無しさん:2007/06/16(土) 14:20:16
>>821
thx。リファレンスになるってのは結構でかいですね。

とりあえずrails本+入門書を何セットか買おうと思ってます。
823デフォルトの名無しさん:2007/06/16(土) 14:29:29
優しい本は変なAA使ってて気持ち悪いのがいやだなあ。
ああいうのがあるからRubyが変な目で観られる。やめてほしいよ。
824デフォルトの名無しさん:2007/06/16(土) 14:35:15
最初の19ページまでだよ
つか2chに出入りしといて言うなよw
825デフォルトの名無しさん:2007/06/16(土) 14:48:12
でかけたついでに立ち読み再会してきま
826デフォルトの名無しさん:2007/06/16(土) 15:45:59
網羅的なのはAWDwR。
入門ぽいのは「はじめよう〜」
最初から上級向けがマイッハ〜
「ライドオン〜」も入門パート少なめであとあと使える印象が。


827デフォルトの名無しさん:2007/06/16(土) 18:30:38
>>823
ワロス
828デフォルトの名無しさん:2007/06/16(土) 18:36:36
win32版の irb.bat がすごく使いにくいのですが、なんとかならいなでしょうか?
左右移動や、上下での履歴が効きません。

仕方なく、cygwin入れて、cygwin版rubyを入れて irb を使っているのですが、
そうすると、メインで使っているwin32版を更新すると
(例えば、バージョンアップしたり、gem入れたりすると)
cygwin版も更新しないといけなくなります。

これは仕方がないことなのでしょうか?
829デフォルトの名無しさん:2007/06/16(土) 18:39:38
>左右移動や、上下での履歴が効きません。
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
でおもいっきりできてるが。
830デフォルトの名無しさん:2007/06/16(土) 18:52:47
>>829
マジスカッ!
ところで、どこのバイナリでしょうか?

うちのは、OneClickInstallerで入れたのですが

って、

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

古かたので、新しいのいれてきまつ

831デフォルトの名無しさん:2007/06/16(土) 19:13:38
げ、One Click Installer って上書きインストールできないのか・・・
mswin32版で上書きでいいのかな・・・
832デフォルトの名無しさん:2007/06/16(土) 19:24:57
>>829
アプデトしましたが、駄目でした orz

irb(main):003:0> dir%%%''''%%%%%'

みたいに、変な文字が入力されます。
WindowsXP SP2 のコマンドプロンプトです。

ruby -v は、

ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]

です。
833デフォルトの名無しさん:2007/06/16(土) 19:25:31
ほほう
>ruby -v
ruby 1.8.1 (2003-12-25) [i386-mswin32]

古ッ!
834デフォルトの名無しさん:2007/06/16(土) 21:42:09
>>824
3xページにもあるよ。あと全般的に口調もキモい。
こういうクセのある書き方はそれだけで読者が逃げること
なんで気づかないかなあ・・・・
835デフォルトの名無しさん:2007/06/16(土) 21:49:20
>834
まあ、くノ一が主人公であんな技やこんな技を
継承しないだけでもよしとしようや
836デフォルトの名無しさん:2007/06/16(土) 21:59:00
>832
思いつきだがコマンドプロンプトから
> ruby -rreadline -e0
ってしたらどうなる?
837デフォルトの名無しさん:2007/06/16(土) 22:04:45
>>836

>ruby -rreadline -e0

>

なーんも表示されません
838デフォルトの名無しさん:2007/06/17(日) 00:35:03
>837
何も出なくておk
つか、それでエラーが出るんじゃないかなと思ってたが外したかorz

もしかしてだがWindowsの環境変数(cygwin環境外)で
cygwinのディレクトリ配下にPATH通してない?
839デフォルトの名無しさん:2007/06/17(日) 06:30:48
>>834
宗教関係の本ってそんな感じのが多い。
840デフォルトの名無しさん:2007/06/17(日) 10:05:34
>>838
あ、通してます。
コマンドプロンプトでも、cygwinを使えるように、

c:\cygwin\bin

みたいに通してます。
これが原因だったりするんでしょうか?
841デフォルトの名無しさん:2007/06/17(日) 13:22:01
ご質問です
wikiを作っているのですが,cgi上ではファイル書き込みができません.
ローカルでは動くのですが.
何か特別な操作が必要なのでしょうか?
お願いします.

OS:Redhat
ruby -v:1.8.5
842デフォルトの名無しさん:2007/06/17(日) 13:24:36
>>841
ディレクトリに書き込み権限は与えていますか?
apacheがsuExecで動いていいない場合は、
オーナー以外のその他に人にも実行権限を与える必要があるかもです。
707とか
843デフォルトの名無しさん:2007/06/17(日) 13:33:46
>>842
ありがとうございます
書き込み実行直前に権限を与えて,
終わったら権限を奪うというのがよさそうですが
可能でしょうか?
844デフォルトの名無しさん:2007/06/17(日) 13:41:31
>>843
書き込み権限を与える権限があるなら苦労しないと思う・・・
845デフォルトの名無しさん:2007/06/17(日) 13:46:42
>>844
あ,そうですね・・・
権限がなかったんだ(汗
ということは前もって与えておくしかないのか・・・
846デフォルトの名無しさん:2007/06/17(日) 13:52:24
セキュリティ上どうのという場合は、書き込み用のディレクトリを作ってそこだけ、書き込み許可するのがよいです。
847デフォルトの名無しさん:2007/06/17(日) 13:53:15
>>846 は、 あ、あらかじめ、作っておいて、あらかじめ書き込み権限を与えておくという意味です。
848デフォルトの名無しさん:2007/06/17(日) 13:57:43
>>846-847
なるほど,ちょっと試しにやってみます
ありがとございました〜!
849デフォルトの名無しさん:2007/06/17(日) 15:07:53
Greenbear Laboratory - Ruby/SDLスターターキット
http://mono.kmc.gr.jp/~yhara/w/?RubySDLStarterKit

Ruby/SDLスターターキットってどういう構造になっているのでしょうか?
RubyのDLLがないような・・・・
850デフォルトの名無しさん:2007/06/17(日) 16:11:22
>>849
Exerbを使って、dllごとgame.exeに固められている

あと、きちんとsageて欲しい
851デフォルトの名無しさん:2007/06/17(日) 17:14:11
>>850
おいおい。game.exeが、60KBしかないぞ・・・・
最低でも、RubyのDLLは500Kはあったと思う。

exerb40.dllに入っているが、これはどういう技術なんだ絽

852850:2007/06/17(日) 17:37:22
ごめんよ、思いっきりウソ教えるところだった
exerbではランタイム別にできるの忘れてた
853デフォルトの名無しさん:2007/06/17(日) 22:08:03
>840
ちとOS入れ直してからcygwin入れてなくて、しかも使ってるRubyはASR版という状況で
検証ができんでスマンのだがorz
とりあえずいっぺん、cygwin関係PATHから外してirb起動して味噌
Ruby-mswin32のreadline.soがcygwinのreadline.dllを読みに行ってる悪寒
854デフォルトの名無しさん:2007/06/17(日) 22:16:45
そんな欠陥OSは捨ててLinuxをいれれば全て解決
855デフォルトの名無しさん:2007/06/17(日) 23:13:03
すみません、質問させてください。
あるインスタンスから、そのインスタンスのクラスを取り出すのはどうすれば良いんでしょうか?
インスタンスからクラスメソッドを実行したいのですが。
856デフォルトの名無しさん:2007/06/17(日) 23:24:26
object.class
857デフォルトの名無しさん:2007/06/17(日) 23:25:16
>>855
object.class.クラスメソッド
858855:2007/06/17(日) 23:46:27
>>856,857
できました〜
すばやい返事ありがとうございます!!
859デフォルトの名無しさん:2007/06/18(月) 02:43:39
質問です。
バイナリファイルに数値を書き込むにはどうすればよいでしょうか?
例えば以下のようにファイルを作っても文字として書かれてしまいます。

num = 1
file = File.open("test.bin", "wb")
file.write(num)
file.close
860デフォルトの名無しさん:2007/06/18(月) 02:54:07
num.to_s
861デフォルトの名無しさん:2007/06/18(月) 07:39:49
file.write([num].pack("i"))
862デフォルトの名無しさん:2007/06/18(月) 15:09:04
この前のyahooスパマーではないのですが、net/pop net/smtpについての質問です。
Gmailアカウントを使用し、ローカルから送信するために、
Net::POP3.auth_only()を呼んでから、Net::SMTP.start(){sendmail()}を
実行しているのですがうまくいきません。
エラーメッセージは"execution expired (Timeout::Error)"です。
他になにか処理を追加しなければならないのでしょうか?
863デフォルトの名無しさん:2007/06/18(月) 15:40:53
Gmailって外からメールの送信できたっけ?
864デフォルトの名無しさん:2007/06/18(月) 16:07:54
gmailってMUAで読みたいだけなのにその時点で既に設定めんどくさいんだよな

普通の対応メーラーで読み書きできるのならそのプロトコルとポートをエミュレートすればいいんじゃね
SSLとか要るんだっけ?
865デフォルトの名無しさん:2007/06/18(月) 16:44:02
普通のPOPが使えるはず。
確か、Gmail側でウェブから設定するのが必要だよ。
866デフォルトの名無しさん:2007/06/18(月) 22:47:35
require 'open-uri'
open("http://www.ruby-lang.org/ja/", :proxy => nil) {|f|
f.each_line {|line| p line}
}

上のプログラムを実行すると下のようなエラーが出ます。
ネットで調べたらProxyが怪しいのですが、Proxyのない環境で実行しています。
他に原因が分からないのでどなたか教えてください。

C:/ruby/lib/ruby/1.8/net/http.rb:560:in `initialize': Bad file descriptor - connect(2) (Errno::EBADF)
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `open'
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `connect'
from C:/ruby/lib/ruby/1.8/timeout.rb:48:in `timeout'
from C:/ruby/lib/ruby/1.8/timeout.rb:76:in `timeout'
from C:/ruby/lib/ruby/1.8/net/http.rb:560:in `connect'
from C:/ruby/lib/ruby/1.8/net/http.rb:553:in `do_start'
from C:/ruby/lib/ruby/1.8/net/http.rb:542:in `start'
from C:/ruby/lib/ruby/1.8/open-uri.rb:242:in `open_http'
from C:/ruby/lib/ruby/1.8/open-uri.rb:626:in `buffer_open'
from C:/ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `catch'
from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
from C:/ruby/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
from C:/ruby/lib/ruby/1.8/open-uri.rb:528:in `open'
from C:/ruby/lib/ruby/1.8/open-uri.rb:30:in `open'
from D:/My Documents/NetBeansProjects/test/lib/main.rb:2
867デフォルトの名無しさん:2007/06/18(月) 22:59:14
ホントにproxy無い?
telnet www.ruby-lang.org 80
って打って接続できる?
868デフォルトの名無しさん:2007/06/19(火) 00:24:26
接続中と出た後止まります。
ということはproxyがあるということでしょうか?
FireFoxのプロキシ設定では「インターネットに直接接続する」を選んでいます。
また、http_proxy, no_proxy環境変数は設定していません。
参考になるかどうか分かりませんが、診断くんで調べてみた結果を書いておきます。

ntoska6桁の数字.oska.nt.ftth.ppp.infoweb.ne.jp
判定:(未判定)
漏れ判定:(未判定)
総合評価:?(A 以上 or 生 IP。下記参照)

疑惑 〜20%:proxy の可能性もわずかにあります。
869デフォルトの名無しさん:2007/06/19(火) 00:30:37
ローカルでファイヤーウオールが邪魔してたりしない?
870デフォルトの名無しさん:2007/06/19(火) 09:35:13
ウイルスセキュリティのファイアウォールを無効にしたら無事つながりました。
ありがとうございました。
できればファイアウォールを有効にしたまま使いたいので、プログラムからの接続を許可したいのですが、ruby.exeを許可にしてもだめでした。どのプログラムからの接続を許可にすればいいのでしょうか?
ファイアウォールの履歴を見ると以下のようになっています。
ユーザー:SYSTEM 方向:送信 アクセス:拒否 説明:ルール不明 プロトコル:TCP(6) 送信元ポート:1047 リモートポート:80
8711/2:2007/06/19(火) 13:46:06
rdicという辞書引きプログラムを、某所にあった方法で サーバー化したのですが、
クライアントプログラムで失敗しています。

telnetでは、rdicが動作しています。
下のプログラムでも、単語をtelnetに渡して、rdicが動いているようなのですが、

rdic-client:10:in `gets': Interrupt ← n=s.gets.to_iの行
from ./rdic-client:10

rdicの仕様で、xtermの一文字目がクルクル回転するのですが、
それが邪魔をしているのかもしれません。

どのようにしたら、telnetから結果をとりだせるでしょうか。
アドバイス、よろしくおねがいします。
8722/2:2007/06/19(火) 13:57:17
>>871つづき
(このプログラムはGPLと明言されていなかったので、
著作権についてなにか支障があったら削除します)

(telnetでポートをオープンして、ファイルハンドラsとする、ARGV[0]が検索する単語)

s.puts(ARGV[0])
n=s.gets.to_i
for i in 0...n
s.gets
$_.chomp!
puts $_
end
STDOUT.flush
s.close
873デフォルトの名無しさん:2007/06/19(火) 15:07:12
pukiwikiの#contentsみたいに
.htm解析して<h1>〜<h6>の見出しのリンク作成するフィルタってないですか?
874デフォルトの名無しさん:2007/06/19(火) 15:19:45
>>853
「これが原因なんでしょうか?」っていう前に試せ馬鹿!っていう気がします。ごめんなさい。

試してきます。

cygwinのパスの前に、rubyのパスとおしてるけど、cygwinのパスの方を読みに行っちゃうものなんですかねえ・・・
875デフォルトの名無しさん:2007/06/19(火) 15:28:16
>>853
結局、ダメぽでした orz
cygwinのほかに、perlとか、pythonとかのPATHもはずしてみたのですが、
だめぽ・・・

うちと職場二つの環境で発生するので何か法則があるはずなのですが・・・
876デフォルトの名無しさん:2007/06/19(火) 15:28:25
パスを通すって環境変数PATHのこと?
$LOAD_PATH のほうかな
877デフォルトの名無しさん:2007/06/19(火) 17:34:42
セッション管理してるサイトから情報を得ようとしてるのですが、
w3mでヘッダ情報を見たときに
Set-Cookie: FOO=a,iueo; domain=example.com; path=/
Set-Cookie: BAR={kakikukeko}; domain=example.com; path=/
Set-Cookie: BAZ=sasisuseso; domain=example.com; path=/
と複数送られているときに
net/httpのレスポンスをres['set-cookie']とすると
["FOO=a,iueo", "domain=example.com", "path=/, BAR={kakikukeko}",
"domain=example.com", "path=/, BAZ=sasisuseso",
"domain=example.com", "path=/"]
と、適切に分離されてないようです。','でsplitするのは、FOOの中にも
','が含まれるので使えません。
どのようにするのがいいでしょうか。
878デフォルトの名無しさん:2007/06/19(火) 18:10:51
>>873
#contents専用のライブラリはたぶんない
HTMLを解析するライブラリを使ってスクリプト書いた方が早いよ
Hpricotかhtmlsplitあたりが便利
879877:2007/06/19(火) 19:29:11
get_fields('Set-Cookie')使えばよかったんですね。すつれいしました。
880デフォルトの名無しさん:2007/06/19(火) 21:50:58
犯罪者御用達言語
881デフォルトの名無しさん:2007/06/20(水) 11:01:51
>>820
亀だが、&付けて手続きオブジェクト(正確にはto_procを実装したオブジェクト)を渡すことによって
Pythonと同じようなこともできる

a = [5, 10, 15, 20, 25, 30]
p a.map(&lambda {|x| x + 1 }) => [6, 11, 16, 21, 26, 31]

Pythonのmap関数のように関数func(x)を渡して各要素をxとして処理することは標準ではできないが
ActiveSupportを入れれば Symbol#to_proc を使って

require 'active_support'

a = [5, 10, 15, 20, 25, 30]
p a.map(&:succ) => [6, 11, 16, 21, 26, 31]

とできる
882デフォルトの名無しさん:2007/06/20(水) 11:27:49
>>881
> p a.map(&:succ) => [6, 11, 16, 21, 26, 31]

1.9だと標準。
883デフォルトの名無しさん:2007/06/20(水) 13:59:32
なんだかんだいって、Rubyでもいろんなやりかたが増えつつあるな。 といってもPerlのそれほどではないが。
884デフォルトの名無しさん:2007/06/20(水) 17:44:27
弾ちゃんがクックブックにご不満の模様
ttp://blog.livedoor.jp/dankogai/archives/50856105.html
885デフォルトの名無しさん:2007/06/21(木) 00:59:50
アクセッサを作りたいのですが、

class Sample
attr_accessor :val

def initialize(str)
@val = str
end
end


s = Sample.new(2)
s.val(1)
puts "val is #{s.val}"


`val': wrong number of arguments (1 for 0) (ArgumentError)

writeができないようです。
attr_accessorの使いかたは間違ってないと思うんですが
何がいけないんでしょ?
886デフォルトの名無しさん:2007/06/21(木) 01:02:16
attr_accessorが定義するのは
Sample#valとSample#val=です。
887デフォルトの名無しさん:2007/06/21(木) 01:05:39
>886
俺の理解がいかんかったってことですね。
val=が解らないので炒ってきます。
888デフォルトの名無しさん:2007/06/21(木) 01:24:12
s.val = 1
889デフォルトの名無しさん:2007/06/21(木) 01:57:21
>>885
Perlだと、そんな感じのアクセサを定義することがあるな。
引数なしだと値を返して与えると変更みたいな。

けどRubyのアクセサは普通
def val()
def val=(v)
の2つ。当然 attr_accessor もコレに準じてる。

その例だと write が失敗してるのではなく
s.val(1) が失敗してる。

引数なしの val に引数与えてるから
「引数の数がおかしい」というエラー。
890デフォルトの名無しさん:2007/06/21(木) 02:07:58
>888,889
やっと解りました。
Java歴の影響か、val=はインスタンス変数を
直接変更するようなちょっと違和感がありまして
使ったことなかった
891デフォルトの名無しさん:2007/06/21(木) 04:15:23
>>890
Rubyではインスタンス変数を直接変更することは出来ない。
必ずメソッドを経由してアクセスしなければならない。
attr_accessor はそのメソッドを楽に書く方法ってだけ。
892デフォルトの名無しさん:2007/06/22(金) 01:33:55
俺もruby初心者だけど役に立ったぜ!
893デフォルトの名無しさん:2007/06/22(金) 02:26:13
>891
val=をメソッドと言われてもちょっと見た目が
894デフォルトの名無しさん:2007/06/22(金) 03:28:40
まあねえ。普段はメソッドのようには使わないしねえ。
凝った利用する段になっていきなり「こいつは実はメソッドなんでこう書いてください」とか言われてもって感じはする。


-------------
Ruby では arr[1] = 'B' とかいう代入表記自体が既にシンタックスシュガーで、実際は

irb> arr = ['a', 'b', 'c']
=> ["a", "b", "c"]
irb> arr.[]=(1,'B')
=> "B"
irb> arr
=> ["a", "B", "c"]

こういうことをしてるわけで、arr.[]=(1,'B') と書けば、obj.method(param) の形に見えんでもない。
これは hoge.hoo=10 なんかのときも同様。
実際は hoge.hoo=( 10 ) で、hoge で示されるオブジェクトの hoo= メソッドに引数 10 を渡してる。

初心者スレなのでツッコミ希望
895デフォルトの名無しさん:2007/06/22(金) 08:04:31
>>894
GJ
896デフォルトの名無しさん:2007/06/22(金) 10:10:08
カッコを省略できる、っていうのがRuby文法の肝なんだね。
897デフォルトの名無しさん:2007/06/22(金) 10:45:27
ときとして、ピリオドも省略できる…のもね。

a=3; p a.*(4)

アクセッサのセマンティックスの話も含めて、こういうRubyの変態性は
初学者にはどういうタイミングで学んでもらえばいいのだろう。
898デフォルトの名無しさん:2007/06/22(金) 10:51:20
やっぱ、クラス書き出すときじゃね
899デフォルトの名無しさん:2007/06/22(金) 10:55:27
「標準」よりもカッコやドットを省略してトクした経験はないんだが
900デフォルトの名無しさん:2007/06/22(金) 11:02:12
括弧の省略し過ぎには注意が要るけどな。
Perl ではよく↓みたいな書き方をするが

print sprintf "%f\n", rand;

このPerlコードをそのまま ruby 1.8.5 に読ませると
test01:1: warning: parenthesize argument(s) for future version
てな感じで警告される。
この場合、最初の print と、引数の無い rand くらいは省略できるが
sprintf の括弧は省略すべきじゃない。
901デフォルトの名無しさん:2007/06/22(金) 11:48:03
>>894
> 実際は hoge.hoo=( 10 ) で、hoge で示されるオブジェクトの hoo= メソッドに引数 10 を渡してる。

それは10が括弧に入ってるだけで、文法的には hoge.hoo = (10) とまったく等価なんで、
例としては不適切だろう。

hoge = class Hoge; def hoo=(x) self end; new end
p hoge.hoo=( 10 )
p hoge.send(:hoo=, 10)
902デフォルトの名無しさん:2007/06/22(金) 21:32:23
privateであるinitialize()をサブクラスのsuperで呼べるのは何故なんだぜ?
903デフォルトの名無しさん:2007/06/23(土) 01:03:13
Rubyのprivateは、同じインスタンスからしか呼べないという意味だから。
904デフォルトの名無しさん:2007/06/23(土) 01:16:24
privateはもう名前変えたほうがいいよな
905デフォルトの名無しさん:2007/06/23(土) 01:25:38
>>897
何言ってるんだお前。
別に、a * 4 はピリオドを省略してるわけじゃねーよ。

ピリオドを省略してる記法だとするなら、
a + b * 10
が説明できないだろうが?
906デフォルトの名無しさん:2007/06/23(土) 01:55:08
a + b * 10 → a.+(b.*(10))
b * 10 + a → b.*(10).+(a)
907デフォルトの名無しさん:2007/06/23(土) 08:02:35
>>906
右結合と左結合を混合しちゃった時点でダメと気付けよ…
908デフォルトの名無しさん:2007/06/23(土) 08:08:02
C++も a.operator*(4) と書けるけど、これを
「C++はときとして、ピリオドとoperatorと括弧も省略できる…のもね。」
とか言ったらアホだよね。
909デフォルトの名無しさん:2007/06/23(土) 09:26:12
C++ならどんな変態記法も思いのまま。
910デフォルトの名無しさん:2007/06/23(土) 09:27:30
>>905 kwsk

それでは、a * 4 はどうなってるの?
911デフォルトの名無しさん:2007/06/23(土) 09:52:25
if文もピリオドが省略されてるとか言いだすんだろうか
912デフォルトの名無しさん:2007/06/23(土) 10:00:39
>>910
a * 4はピリオドを省略した書き方なわけじゃないってことになってるの。
913デフォルトの名無しさん:2007/06/23(土) 10:08:56
Windows上で簡単にRubyからシリアルポートを使いたいのですが
何か良い方法があったら教えてください
914デフォルトの名無しさん:2007/06/23(土) 10:33:24
>>912
ほとんどの演算子は特別な形式のメソッド呼び出しです
915デフォルトの名無しさん:2007/06/23(土) 11:01:26
>>913
open("com$", "rb+")
916デフォルトの名無しさん:2007/06/23(土) 11:05:28
>>914
それはそうだよ?

でも、a * 4はピリオドを省略してるわけじゃない。分かる?
917デフォルトの名無しさん:2007/06/23(土) 11:09:17
918デフォルトの名無しさん:2007/06/23(土) 11:35:53
ピリオドの省略どうこうは、あんまり拘るところでもないと思うんだ
メソッド呼び出しのシンタックスシュガーだってことが分かってれば十分だろ
919デフォルトの名無しさん:2007/06/23(土) 13:13:19
>>916
たしかに。

def (obj = Object.new).+; end

しても obj +() とは呼べないもんね。obj.+() じゃないと。
つまり、2 + 3 と 2.+(3) は別物。
920デフォルトの名無しさん:2007/06/23(土) 20:25:09
a * b + c

a .* b .+ c
で実行結果違うしな
921デフォルトの名無しさん:2007/06/24(日) 05:50:11
関数の実行に優先順位があるんです!と言いたそうな勢い
922デフォルトの名無しさん:2007/06/24(日) 11:24:31
rubyで、あるクラスからメソッドを取り除くようなことはできますか。
class Foo
 def f(); end;
end
とあったときに、f()を無効化するようなことがしたいです。
923デフォルトの名無しさん:2007/06/24(日) 11:39:18
>>922
class Foo
undef f
end
924デフォルトの名無しさん:2007/06/24(日) 15:58:19
TCPserverとTCPSocketを使って
サーバー&クライアントのプログラムserver.rb, client.rbを作りました。
サーバーのserver.rbをバックグラウンドで常駐させていないと、
client.rbで、当然Connection refused になります。

しかし、なんとかサーバープログラムを常駐させなくてもよい、
rubyプログラミングの方法はないでしょうか。

xinetdで、たとえばport番号55555にserver.rbを設定したのですが、
それでは、client.rbからserver.rbを使えませんでした。

よろしくお願いいたします。
925デフォルトの名無しさん:2007/06/24(日) 16:07:40
>>923
ありがとうございます。undefなんてあるのですね。知りませんでした。
リファレンスマニュアルを読むと
http://www.ruby-lang.org/ja/man/?cmd=view;name=%A5%AF%A5%E9%A5%B9%A1%BF%A5%E1%A5%BD%A5%C3%A5%C9%A4%CE%C4%EA%B5%C1#undef

> undef のより正確な動作は、メソッド名とメソッド定義との 関係を取り除き、
> そのメソッド名を特殊な定義と関連づけます。この状態の メソッドの呼び出しは
> 例えスーパークラスに同名のメソッドがあっても例外 NameError を発生させます。
> (一方、メソッド Module#remove_method は、関係を取 り除くだけです。
> この違いは重要です)。

と書いてあるのですが、この重要な違いとやらがさっぱり分かりません。
どなたかわかりやすく解説していただけませんか。
926デフォルトの名無しさん:2007/06/24(日) 16:19:24
>>924
xinetdのログでも嫁。
927924:2007/06/24(日) 17:00:36
>>926
xinetdのログは↓です。
07/6/24@16:48:50: START: rubyserver pid=4529 from=127.0.0.1

 inetdから起動されたプログラムは標準入出力がソケットにつながっていて、
標準入出力を相手にしてやりとりするだけでネットワーク通信が行えます。
Rubyで言うなら、STDINから入力して、STDOUTに出力すればよいのです。

ということなので、server.rbでTCPserverをつかわずにただのプログラムにし、
client.rbで、server.rbのポートをたたき、
STDOUTでserver.rbの出力を受け取ればいいのでしょうか?
928デフォルトの名無しさん:2007/06/24(日) 19:04:31
>>925
undef_method のリファレンスに remove_method との違いが書いてあるよ
http://www.ruby-lang.org/ja/man/?cmd=view;name=Module#undef_method
929デフォルトの名無しさん:2007/06/24(日) 19:13:02
clientは変える必要ない。
clientとserverの間にTCPserverがはさまって、
ソケットの入出力をserver.rbのSTDIN, STDOUTに変換してるだけだから。
930924:2007/06/24(日) 20:01:37
>>929
おっしゃる通りで、
はじめは、そのようにTCPserverをつかったサーバープログラムを組んでいたのですが、
サーバープログラムを常に立ちあげておくのも勿体無いので、
スーパーデーモンのxinetdを利用することにしました。
xinetd経由でたたくプログラムをprog.rb内で、
a=[]
a<<ごにょごにょ
print(a.size)
a.each do |l|
print(l)
end
client.rbで、
s = TCPSocket.open('localhost','rubyserver')
n=s.gets.to_i
for i in 0...n
s.gets
$_.chomp!
puts $_
end
これだと、配列aの一番最後の1要素しか出力せず、そこにひっかかっています。
どこかお気づきになるところはないでしょうか。
931デフォルトの名無しさん:2007/06/24(日) 20:06:53
> print(a.size)
> n=s.gets.to_i

サーバとクライアントでプロトコル認識にずれがあるようだが
932924:2007/06/24(日) 20:55:48
>>931
xinetdをつかうとソケットと標準入出力をつないでくれるとあったので、
そうしたのですが、まちがっていますか?
一応、client.rb 内で p n をすると nの値は正しく渡せています。

自分が質問の意図を理解していない可能性が高いので、その点もご指摘ください。
933デフォルトの名無しさん:2007/06/24(日) 21:50:31
http://www.allinoneserver.net/index.html
ここのサーバーを借りて、
http://rubycgi.org/cgi_explanation/index.htm
ここにしたがって、CGIをやろうと思ったのだけど、
2章1節 print文を使おうの時点で躓きました。
Hello Worldが表示されません。

public_html/配下に設定したのですが、だめでした。
で、だめだったので、フォルダを作って、そこでパーミッションを775にして、
もう一度実行してみましたが、だめでした。

何がだめなのでしょうか・・・。
934MoonWolf ◆MoonWdLnkQ :2007/06/24(日) 21:59:05
>>924
printだと改行コードが送られないので次の行と結合してしまう。
client.rbでgetsしているのだからprog.rbからはputsする必要がある
ということなんでない?
935924:2007/06/24(日) 22:06:31
>>934
ご丁寧にありがとうございます。

prog.rbのprintをputsに変えたところ、
client.rbで配列aのすべての要素を標準出力にだせました。

改行コードのことを知らなかったので、勉強になりました。
936MoonWolf ◆MoonWdLnkQ :2007/06/24(日) 22:22:39
rubyがどこにインストールされているかは調べた?
/usr/bin/rubyだったり/usr/local/bin/rubyだったりで違ってるのかもよ。
パーミッションは755にするって書いてあるから合わせておいたほうがいいね。
cgi-binフォルダがあるならそこに配置しないと駄目ということもありえるね。

急がば回れで、一旦rubyから離れてPerlでHello Worldが動くか確かめてから
Rubyで動かすように書き換えたほうが確実じゃないかな?
937933:2007/06/24(日) 22:32:52
>>936
ありがとうございます。
サポートしないとあるので、問い合わせはしていないのですが、
RubyはFAQにてインストール済みとあるので、
/usr/bin/rubyと/usr/local/bin/rubyは試しました。
パーミッションも、775と755を試しました。

ファイル名をtest211.cgiにしたり、test211.rbにしたりしましたが、
前者は真っ白な画面で、ソースを表示すると、<BODY><PRE></PRE></BODY></HTML>な状態で、
後者は#!/usr/local/bin/ruby print "Content-type: text/html\n\n" print "Hello World" と1行で。

Perlとかわからないのですが、Perlを先に試してみるべきでしょうか。
938933:2007/06/24(日) 22:40:32
>>936
すみません!出来ました!

>/usr/bin/rubyと/usr/local/bin/rubyは試しました。
といっていましたが、前者は/usr/local/rubyでやっていました。
/usr/bin/rubyで試してみたら、出来るようになりました。

本当に初歩的なミスで、しかも間違った報告をしてすみませんでした。
本当にありがとうございます。
939925:2007/06/24(日) 22:45:26
>>928
そっちにありましたか。ありがとうございます。
ちなみに undef は構文で、undef_method はメソッドという理解であってますか。
940429:2007/06/25(月) 06:27:24
>>430
思いついて、$stdout = File.open("xxxx.txt", "w")のwをa+にしたら解決しました(´・ω・`)
941デフォルトの名無しさん:2007/06/25(月) 10:15:01
毎回閉じていたのかw
942デフォルトの名無しさん:2007/06/25(月) 11:46:02
改行が複数含まれた文字列に対して、
「3行目から10行目まで取得」、「最終行から50行文取得」
というような関数を作ろうとしています。

まず、str.each_lineのブロックの中でインクリで行数を取得してから
その後再びブロックで回し、if 指定した行数ならreturn文字列に結合
というような流れで作るつもりなのです。
もっとスマート方法をどなかたお願いします。
943MoonWolf ◆MoonWdLnkQ :2007/06/25(月) 11:59:14
split(/\r?\n/,-1)でArrayにしてからアクセスしたほうがいいんじゃない?
944デフォルトの名無しさん:2007/06/25(月) 19:17:17
String#to_aの方がいいんじゃね?
945デフォルトの名無しさん:2007/06/25(月) 19:25:25
head,tailをpopen。
946デフォルトの名無しさん:2007/06/25(月) 20:16:20
readlines もおわすれなく
947デフォルトの名無しさん:2007/06/25(月) 20:25:36
データ全部読んでからおもむろに分割、という手順を取るものばっかなので
巨大ファイルを連続起動の場合はコストに注意
948デフォルトの名無しさん:2007/06/25(月) 21:47:53
each_lineでカウントしつつ、ファイルポインタの位置をメモっておいて
シーク&必要サイズを読むとか。

富豪的にやるほうが普通な気がする
949デフォルトの名無しさん:2007/06/25(月) 21:54:13
そんなとこにRuby使っておいてそこに文句言うなアホ、で片付けられる例の分野だな
950デフォルトの名無しさん:2007/06/25(月) 21:55:20
そしてユーザーはハイパフォーマンスなPHPへ以降と
951デフォルトの名無しさん:2007/06/25(月) 22:14:17
Rubyで5〜20までの間だったら、みたいな条件文はどのように書くとエレガントでしょうか?

Cとかであれば
x >=5 && x <= 20
だと思うんですが、Rubyぽくない気がします

(5..20).include? x
だとなんか重そうです

皆さんはどうやってますか?
952デフォルトの名無しさん:2007/06/25(月) 22:38:14
俺は (5..20).include? x を使うなぁ。
ついでながら、比較で書くなら 5 <= x && x <= 20 と書く。
953デフォルトの名無しさん:2007/06/25(月) 22:51:43
>>951
「なんか重そう」で簡潔な書き方を控えるのは良くないよ
たいてい気にするほどの差はつかない

俺の場合は
case x
when 5..20
end
で基本的に統一してる
includeは語の順番が好きじゃないし、条件が増えると厄介
954デフォルトの名無しさん:2007/06/25(月) 22:52:05
あとは between? とか。
955デフォルトの名無しさん:2007/06/25(月) 22:53:21
if x in 5..20
って書けるようにして
956デフォルトの名無しさん:2007/06/25(月) 23:03:26
>>955
Object#in?を定義すれば解決するぜ
標準で欲しいとは思うが
957デフォルトの名無しさん:2007/06/25(月) 23:17:21
Range の include? はまさに境界値との不等号の計算しかしていない。
つまり (5..20).include? x は x >= 5 && x <= 20 と同じ意味。

下手に Ruby レベルの処理に戻ってこないぶん、 include? の方が速かったりするかもしれないよ(検証してないけど)
958デフォルトの名無しさん:2007/06/26(火) 02:51:03
str = File.read_lines(5..20)
ができればいいのにね
959デフォルトの名無しさん:2007/06/26(火) 13:16:12
デフォルトのrequireのパスってどこに記述してあるんですか?
追加したいんです。
960デフォルトの名無しさん:2007/06/26(火) 13:29:56
>>959
$LOAD_PATHのことかな?
961デフォルトの名無しさん:2007/06/26(火) 13:45:03
>>960
多分そのことだと思います。
962デフォルトの名無しさん:2007/06/26(火) 14:33:18
デフォルトの$LOAD_PATHを追加するなら環境変数RUBYLIB を設定する
963デフォルトの名無しさん:2007/06/26(火) 17:47:41
>>962
レスが遅れましたが、うまくいきました。ありがとうございました。
964951:2007/06/26(火) 18:05:38
色々なご回答ありがとうございました

Object#in?が一番Rubyっぽいですね
Range#include?だと本来操作するべきオブジェクトが逆?というかCっぽいというか。。

速度的にも問題ないようですし、些事で標準から外れるのもアレなのでRange#include?でいきたいと思います
965デフォルトの名無しさん:2007/06/27(水) 00:16:00
Base64エンコード/デコードを試してみているのですが、

ttp://ddo-jp.ddo.jp/download.php?no=6420
(DL pass "rb")

これだとテストに使ったJPEGは復号されずに壊れたものが出来上がります。
変換はpack/unpackに突っ込むだけなのでIO周りでわかっていないことが
あるのかと思っていますが…。

どこがまずいでしょうか。指摘していただけると幸いです。
966デフォルトの名無しさん:2007/06/27(水) 01:05:09
見ないで言うがbinmode
967デフォルトの名無しさん:2007/06/27(水) 01:16:58
>>966
$stdin、$stdoutはbinmodeしました…って言おうとして、
ARGFに触ってないことに気づきました orz

で、ARGF.binmodeする一行を付け加えたら
よくわからんエラーが出ました…

base64.rb:33:in `syswrite': Not enough space (Errno::ENOMEM)
from base64.rb:33
968デフォルトの名無しさん:2007/06/27(水) 01:38:35
>>965
素直にARGVの内容を見て、open(path, 'rb')するべき
ARGFの動作はよく分からんが、バイナリだと途中で内容が切れてしまうので
バイナリファイルを読むのに使うべきではない

あと、質問の内容とは関係ないけど
・syswriteを使うのはなぜ?
・mode_tblは不要なのではないか(proc_tblだけで十分では)
・ハッシュのキーがSymbolなのはなぜ?
という点が気にかかる
969デフォルトの名無しさん:2007/06/27(水) 01:50:00
>>968
syswriteは試行錯誤の名残です。
つまりIO#printに責任転嫁してみたりしてたんです。

HashのキーがSymbolなのって珍しいんですか?
わりとそんな例を見かけるもんで…
あとせこい高速化を期待して

modes_tblはif文を簡単に書きたかったっていう不精です
あとは、caseでencode, decode, none全部捕まえるよりも
Hashのリテラルのほうがパッと見でどういうモードがあるか
判りやすいかな、とかいう目算と、これまたせこい高速化を期待してです。
970デフォルトの名無しさん:2007/06/27(水) 09:44:58
>>968
ARGVをeachで回して、ひとつずつ開けても

base64.rb:33:in `write': Not enough space (Errno::ENOMEM)
from base64.rb:33
from base64.rb:32
from base64.rb:31

と、$stdoutにprintするところで叱られました。出力を止めて変換だけを
するとふつうに動くので、出力が原因っぽいのですが…

RubyのErrnoはCのerrno.hのラップだと思っていたのですが、出力で
メモリが足りなくなる状況がよくわからず、解決策が浮かばないです。

どなたか知恵を貸してください… orz
971デフォルトの名無しさん:2007/06/27(水) 10:25:38
>>970
自己解決しました。StringIOに突っ込んで
少ないバイトずつ取ってきてはprintしたら上手くいきました。
レスしてくれた方、ありがとうございます。
972デフォルトの名無しさん:2007/06/27(水) 19:34:47
euc-jpな標準出力をだすプログラムを変更して、
jisx0213な文字を数値実体参照にして、utf-8で出力したいのですが、
ヒントになるようなモジュールを教えてください。
iconvだけでは足りませんよね?

はじめ、perlで作ろうかと考え、perl質問スレで尋ねたのですが、
元々のプログラムがrubyだったので、不案内ながら、
そのrubyプログラム自体を改造しようと思いました。
マルチレスになるのでしたら、控えます。

よろしくお願いします。
973MoonWolf ◆MoonWdLnkQ :2007/06/27(水) 21:42:41
JIS X 0213な文字というのは2面のこと?
str.gsub(/\x8f[\xa1-\xfe][\xa1-\xfe]/n) {|x| ... } とかで最初に置換しちゃうとか。

UTF-8で出力するのに数値実体参照にする意味あるんですか?
XML全般だとしたら要素名は数値実体参照に置換できないとか制限あった気が。
974デフォルトの名無しさん:2007/06/27(水) 23:26:11
>>969
細かい突っ込みになるけど

>キーがSymbol
そのスクリプトの場合だと、わざわざinternするの面倒くさくないか?

>modes_tbl
proc_tbl.keysで代用した方がいいと思う

>>970
俺の方でも試してみたけど、2MB超のJpeg食わせてもENOMEMは出なかった
PCのメモリの差だろうか?
975デフォルトの名無しさん:2007/06/27(水) 23:58:23
>わざわざintern
まぁ二箇所ですし…。Stringより軽い…とか言いながら
実際は染み付いた性癖に近いような。

>>modes_tbl
>proc_tbl.keysで代用した方がいいと思う
思いつかなかった…
そうですね、確かにその通りです orz

RAMは512MBっす。
45KBのBMPでも落ちました。ショボ。
976デフォルトの名無しさん:2007/06/28(木) 00:12:34
メモリ破損じゃねーの?
リアルに。
977972:2007/06/28(木) 01:10:25
具体的には、æ & a e l i g ; のような発音記号です。
utf-8での数値実体参照は & # 2 3 0 ; や & # x E 6 ; になります。
euc-jp では \xa9\xdc です。

数値実体参照以外に、utf-8でæを表示する術を知らないので、
やむを得ずというところです。
エディタはutf-8なemacsなのですが、
発音記号をだそうとするとjisx0213のフォントをもってきてしまうのです。
じぶんでもよくわからないので、説明になっていなくてすみません。

教えていただいた
>str.gsub(/\x8f[\xa1-\xfe][\xa1-\xfe]/n) {|x| ... }
を参考に、がんばってみます。
\x8f が、JIS X 0212ということなのですね。
978MoonWolf ◆MoonWdLnkQ :2007/06/28(木) 02:34:12
>>977
ae1 = Iconv.conv('UTF-8','EUC-JISX0213',"\xa9\xdc")
ae2 = [0xe6].pack('U')
ae3 = '&#xe6;'
ae4 = '&aelig;'

このUTF-8なæをIE7,Firefoxで表示させてみたら、全部同じように表示されました。
Firefoxからxyzzyにコピペするとæと表示されます。
IE7からだと"a"=="\x61"に化けてしまいますが^^;

iconvで指定するencodingは'EUC-JP'ではなく'EUC-JISX0213'にしないと
Iconv::IllegalSequenceが発生しました。

> \x8f が、JIS X 0212ということなのですね。
単にJIS X 0213の2面という印ですので、1面に追加された文字については個別で
判定しないと駄目ですね。
http://x0213.org/codetable/ にある対応表が参考になるのかな?
[2000]とか[2004]と書いてある文字は注意が必要みたいですね。
979デフォルトの名無しさん:2007/06/28(木) 04:14:56
utf8にするんだったら
わざわざ数値ナンタラにする必要あんの?
とはいえ、どっかでそんなライブラリ?を見たな
980デフォルトの名無しさん:2007/06/28(木) 05:20:00
Rubyってvariantっぽい型ないの?
いちいち(...).to_iばら撒くのマンドクセ
981デフォルトの名無しさん:2007/06/28(木) 07:56:25
ume
982デフォルトの名無しさん:2007/06/28(木) 15:50:34
array0 = array1.map_with_index{ |x,i| x*i }
みたいなことって綺麗にできますか?
983デフォルトの名無しさん:2007/06/28(木) 19:06:37
>>982
arr1 = [10, 9, 8, 7, 6, 5]
arr0 = []
arr1.each_with_index{|val, index| arr0 << val * index }

すぐに思い付くのはこれくらいかなぁ。
984デフォルトの名無しさん:2007/06/28(木) 19:12:40
array0 = (0...array1.size).map{|i| array1[i] * i}
array0 = array1.enum_for(:each_with_index).map{|v,i| v * i}
985デフォルトの名無しさん:2007/06/28(木) 20:09:23
>>982
(0..array0.size-1).zip(array0).map{ |i,x| i*x }
986デフォルトの名無しさん:2007/06/28(木) 20:14:45
mapってのは(順番のない)集合から集合への写像のことだから
with_indexってのが最初から無理があるよね
987デフォルトの名無しさん:2007/06/28(木) 20:59:05
>>982
array0 = array1.each_index{ |i| i * array1[i] }
988デフォルトの名無しさん:2007/06/29(金) 07:52:47
system("gnuplot xxx.gp")
ってするとなんか実行出来ない。Cなら実行出来るのに
989デフォルトの名無しさん:2007/06/29(金) 10:14:32
そうですか
990デフォルトの名無しさん:2007/06/29(金) 10:40:48
>>983, 984, 985
ありがと。984さん勉強になりました。enum_forを使います!
991デフォルトの名無しさん:2007/06/29(金) 10:42:56
早くThread.newするんだ
992デフォルトの名無しさん:2007/06/29(金) 12:26:40
つーか今のこのスレって初心者スレというより、質問スレって感じじゃない?
993デフォルトの名無しさん:2007/06/29(金) 14:25:10
994デフォルトの名無しさん:2007/06/29(金) 16:54:59
throw :さじ
995デフォルトの名無しさん:2007/06/29(金) 19:36:12
>>994
さじ投げてんじゃねえよ
996デフォルトの名無しさん:2007/06/29(金) 19:44:02
自演乙
997デフォルトの名無しさん:2007/06/29(金) 20:16:02
998デフォルトの名無しさん:2007/06/29(金) 20:59:22
rubiestはコードゴルフに熱中しすぎて開発効率が悪いの法則
999デフォルトの名無しさん:2007/06/29(金) 21:49:44
うめ〜
1000デフォルトの名無しさん:2007/06/29(金) 21:55:52
1000ということで
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。