Ruby 初心者スレッド ..
709:デフォルトの名無しさん
08/02/08 21:56:53
>>706
少数のオブジェクトにまとめろよw
それができないようなクラス構成なのかもしれないけど
>>707
渡すのが面倒なのは確か
でもテストのことを考えると、引数で明示的に「どの値を使うか」を指定できる方が便利だよ
710:デフォルトの名無しさん
08/02/08 21:58:21
STR = 'before'
STR.replace('after')
puts STR
これはSTRが指すオブジェクトが変更されないから警告出ないよね
このへんまで説明してる初心者向け解説はあまり見ないけど
711:デフォルトの名無しさん
08/02/08 22:01:28
>>708 >>710
そう書かれるとなんか自然に見えてきたぞ…
>>709
DBの接続とかMechanizeのオブジェクトとかを渡したいので「どの値」とかは特に関係ない件
むしろRuby慣れてないから引数でオブジェクト渡すと参照渡しになってるのかどうかさえ知らん
712:デフォルトの名無しさん
08/02/08 22:15:07
>>711
自分で注意深くコードを書いて試すといい
ちなみにいわゆる参照渡しだ
class Test
def initialize(str,h)
@str = str; @h = h
end
def modify
@str.replace('MODIFIED')
@h['MODIFIED'] = 'MODIFIED'
end
end
str = 'default'
h = {'key'=>'value'}
Test.new(str,h).modify
p str
p h
# ================================
$ ruby ./test.rb
"MODIFIED"
{"MODIFIED"=>"MODIFIED", "key"=>"value"}
713:デフォルトの名無しさん
08/02/08 22:22:01
>>712
昔はこれを意識したコードを書いてたんだけど
最近はもうこういうとこに気を遣って手品みたいなことするのめんどくさくなって
class Test
def initialize(str,h)
@str = str.dup; @h = h.dup
end
def modify
@str.replace('MODIFIED')
@h['MODIFIED']='MODIFIED'
end
def result
return @str,@h
end
end
str = 'default'
h = {'key'=>'value'}
test = Test.new(str,h)
test.modify
(str,h) = test.result
puts str
p h
こんなコード書いてる
たいていこれで済むし
714:デフォルトの名無しさん
08/02/08 22:25:42
「参照の値渡し」ね
715:デフォルトの名無しさん
08/02/08 22:37:35
そこが「いわゆる」に含めた意味だろうな。
716:デフォルトの名無しさん
08/02/08 22:39:50
Gaucheのwww.cgi.testみたいなやつない?
とりあえずRubyにCGIパラメータ渡したいんだけど。
ブラウザでちまちまやるの面倒くさくて。。。
717:デフォルトの名無しさん
08/02/08 22:49:23
~$ cat cgi.rb
require 'cgi'
cgi = CGI.new
p cgi.params
~$ ruby cgi.rb 'title=ruby&creator=matz'
{"creator"=>["matz"], "title"=>["ruby"]}
718:655
08/02/08 22:51:13
あれ? スルーされてる…。
何か質問の仕方、もしくは場所がまずかったですか?
719:デフォルトの名無しさん
08/02/08 22:56:01
Amritaというものを使ってる人がスレにおらんのだろう
720:デフォルトの名無しさん
08/02/08 22:57:44
>>691
それ言っちゃうと、Array#shiftとかも不統一だよね。
721:デフォルトの名無しさん
08/02/08 23:02:17
shift,unshift,push,popあたりはperlから受け継いでるからな。
!がついてないからといって破壊的じゃないとは限らない。
722:デフォルトの名無しさん
08/02/08 23:21:24
emacs+ruby-mode.elで書いていて質問があります。
ヒアドキュメントを記述して、頭の方でruby-indent-exp(再インデント)を実行しても、
終端行以降に記載した部分がインデントされません。
もし対処法ありましたら、教えて下さい。
(もしくはそういう書き方をしないのでしょうか)
--
def hoge()
print <<-EOT
こんばんは。
EOT # <= ここ以下インデントされない
end
def foo()
print <<-EOT
こんにちは。
EOT
end
--
emacs->22.1
ruby-mode-> r15297
723:デフォルトの名無しさん
08/02/08 23:34:26
>>718
ごめん普通に見逃してた
Amrita.aを使うなら
:table1=> Amrita::a(:value => "test"){[:name => "Ruby"]}
でOK
今やるなら、それよりもamrita-alteredの属性値展開を使う方がいいと思う
724:デフォルトの名無しさん
08/02/08 23:42:35
>>716
ふつうに
QUERY_STRING='a=1&b=2' ruby mycgi.rb
とすればよくね?
POSTなら
ruby mycgi.rb < request.txt
まあWindowsならどうやるのか知らないけど。
725:デフォルトの名無しさん
08/02/08 23:45:45
ruby-modeのインデントは微妙に信頼性が低くて困る
def hoge
=begin
なんとか
=end
end
を
def hoge
=begin
なんとか
=end
end
にして潰してくれたときには参った
最新版では直ってるのかね
>>722
終端文字列の直後の行を正しいインデント量に手動で直してから再インデント
726:デフォルトの名無しさん
08/02/09 00:15:46
>>717 >>724
ありがとうごぜえますだ。
727:722
08/02/09 00:53:14
>>725
↓こんな感じでグダグダです
def hoge
=begin
なんとか
=end
end
>終端文字列の直後の行を正しいインデント量に手動で直してから再インデント
うまくいかないですorz
emacs 21.4でも同じ
728:デフォルトの名無しさん
08/02/09 03:25:48
windows XP proでVisualuRuby上(ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32])で
Susie::Plugin library for Rubyを使いたいのですが、ソースからコンパイルするしかないのでしょうか?
URLリンク(www.yoshidam.net) をDLし解凍したものを ruby\lib\ruby\1.8\susie 下に
置いてもrequire "susie"ができないので…
他にsusieを使う方法ってあるのでしょうか?(COM経由とかではなく)
729:デフォルトの名無しさん
08/02/09 10:08:51
全く使ったことないが、require 'susie' という書き方で探されるのは ruby\lib\ruby\1.8\susie.rb だと思うぞ
730:デフォルトの名無しさん
08/02/09 10:10:36
susie/susie
731:デフォルトの名無しさん
08/02/09 10:21:37
exec() や system() メソッドで、
コマンド実行後に独自の入力プロンプト(入力待ち)状態になるコマンド(ftp, sqlplus 等)を実行したあとに、
さらに、そこへ入力を続けるようなことはどうすれば出来るでしょうか。
以前、どこかのサイトでその方法を見かけて、使ったことがあったのですが、
そのコードが手元に残っていなく、サイトを探してもみあたらなかったため、
質問させて頂きました。
よろしくお願いいたします。
732:デフォルトの名無しさん
08/02/09 11:00:53
>>731
標準で付いてるexpect.rbが使えるケースかも?
733:デフォルトの名無しさん
08/02/09 18:16:41
POPFileというベイジアンフィルターソフトの設定画面が、ローカルにたてたhttp鯖に接続して行う形になっています。
スパムを誤認したメールがたまりまくって手動では無理なため、一括で、教育しなおしたいのですが、
httpのPOSTを簡単に扱えるライブラリはないでしょうか?
hpricot的にお手軽にPOSTしたいのですが・・・
734:デフォルトの名無しさん
08/02/09 18:25:44
net/http のどのへんがダメなのか教えてくれると代替案があるかも
735:デフォルトの名無しさん
08/02/09 18:29:23
自己解決した!
WWW::Mechanize というのを発見しました。
お騒がせしました。ありがとうございました。
> net/http
んーなんていうか、httpを意識しないといけない、低レイヤーっぽい感じがします。
hpricot使ったら他に移れないくらい便利だったので、
似たような高レベルなラッパーがないかな、と。
736:デフォルトの名無しさん
08/02/09 18:32:55
require 'rubygems' しなければならないのがどうにもなあ
いや、贅沢なこと言ってる自覚はあるが
>>735
WWW::Mechanizeが利用できる環境なのならそれ使うといいぞ
737:735
08/02/09 19:00:00
環境変数RUBYOPT を -rubygems にしておくとgem関連は楽っすよ
738:デフォルトの名無しさん
08/02/09 19:50:45
>>737は問題を理解してないと思った
739:735
08/02/09 21:18:13
あ、ええと、レンサバとかRubyGemsをインスコできない環境とかの話かな?
それなら失礼しますた
740:デフォルトの名無しさん
08/02/09 21:48:52
本家のヘルプ以外のライブラリなどのドキュメントを見ようと、
コマンドラインのドキュメントヘルプを試したのですが、いまいちどれがどうなのかわかりません。
ri:標準。英語ドキュメント。サンプルソースなどもしっかり
refe:gem install refeで入る。日本語ドキュメント。全然少ない。メソッド名の部分一致検索ができる。
rdoc:標準。エラーでて動かず
riは、詳細が載っていてわかりやすいのですが、
検索しずらい・・・
refeみたいに、部分一致だったらいいのに
741:デフォルトの名無しさん
08/02/09 22:18:25
gemしかないならともかく、tar玉あるんだから
$HOMEでもどこでもすきなようにインストールすればいいじゃん。
742:デフォルトの名無しさん
08/02/09 22:38:10
>>740
> rdoc:標準。エラーでて動かず
rdocはriのデータを作るコマンド。
743:デフォルトの名無しさん
08/02/09 22:51:39
>>724
なにそのめちゃくちゃ端折った説明
現状は「英語でいいならri、日本語がいいならReFe」という住み分けになっとる
ReFeの内容がヘナチョコなのは日本語マニュアルがヘナチョコだからだな
むしろ俺はRDocとかRDとかのマニュアル用書式がわからん
何のときに == で書くのかとかさっぱりだ
744:デフォルトの名無しさん
08/02/09 22:57:07
あれだ、もうちょっとMatzがユーザ愛を持って、マニュアルに全身全霊を
傾ければ、Rubyはもっと愛されると思う。願望だけど。
「そんなの面白くない」とか「Matzは開発を優先すべきで、他の人が
やったほうがいい」という反論は重々承知だが。
745:デフォルトの名無しさん
08/02/09 23:00:05
優秀な言語開発者が優秀な初心者向けマニュアルを記述できるとは限らないのは
例の分厚くて黄色くて背が硬い本で痛いほどわかっただろうに
746:デフォルトの名無しさん
08/02/09 23:02:37
>>745
いやでもな、とてつもなく優れたオープンソース開発者が、とてつもなく
優秀なドキュメントを提供する人間である例が目の前にあるとさ。
すごい!と思ってしまうのよね。Vimの開発者のことだけど。
747:デフォルトの名無しさん
08/02/09 23:03:35
日本語マニュアルがイマイチなのの原因は何なのよ
今のRubyユーザー数ならWikiシステムあたりを使って一斉に取り掛かれば
1年くらいで今の倍くらいのボリュームにならんかね
748:デフォルトの名無しさん
08/02/09 23:05:30
>>747
RDだかRDocだかで記述しないと取り込めないからRDだかRDocだかで書いてね、というのがかなり壁
PukiWiki互換で書いていいよと言われたら一気に進みそうな気がする
749:デフォルトの名無しさん
08/02/09 23:09:04
まぁMatzはEmacs信者で、Bramのことなんかよく知らないだろうけど。
750:デフォルトの名無しさん
08/02/09 23:24:35
マニュアル内容の改定に関しては計画はあるんだし参加しようよ
URLリンク(doc.loveruby.net)
751:デフォルトの名無しさん
08/02/10 02:39:04
例のデイトレ男に一億くらい恵んでもらってフルタイムのドキュメント書きを雇えばいいんだよ
752:デフォルトの名無しさん
08/02/10 02:57:58
なんで、ここで B・N・Fこと小手っちゃんがww
753:デフォルトの名無しさん
08/02/10 04:51:26
いやもうmatzは開発しなくて良いよ。
MLのやり取り見てると、正直もう1.8+αで良いと思うし。
754:デフォルトの名無しさん
08/02/10 05:15:38
>>741-743
ありがとう
マニュアル用のコマンドとして使えるのは ri と refe なのね。
gemsに fxri っつーri GUIフロントエンドがあったから入れたら、まだ使いものにならなかった orz
・起動が遅い
・riのエントリーの読み込みに20分近くかかる(全部よんでると20000エントリくらいになる)
・全部読みこまないと、検索できないw
・検索中に、カラムをクリックすると落ちたwwww
・読み込んだ データ をキャッシュしないので、次回起動時もまた20分かか(ry
読み込んだ後は、リアルタイムに部分一致検索できるし、
irbが立ち上がっててすぐ試せるので、すごく理想的!
いいのにもったいない!!
そして今気づいたのですが、rubyのdocディレクトリに Programming Ruby のHTMLヘルプがついているんですね。
英語だけど、サンプルコードはあるし、入門にはよいですね。
755:デフォルトの名無しさん
08/02/10 11:15:30
ドキュメントは文句だけいって手を動かさない人が多いから進まない
756:デフォルトの名無しさん
08/02/10 11:33:43
>>755
>>750読め
757:デフォルトの名無しさん
08/02/10 11:40:12
オフィシャルにする気マンマンなとこが敷居高いのは仕方あんめえ
変なのが混じりにくいわけでむしろそれ自体は頼もしいとも思うぞ
この調子だといつ完成するのかわからんのが難だが
758:デフォルトの名無しさん
08/02/10 11:53:10
19株売れよwwww
759:デフォルトの名無しさん
08/02/10 19:08:04
>>743
自作のクラスのマニュアルとか作れたらRRSEで楽だろうなと思うんだけどね
メソッドにカーソルが当たったらEmacs下部のミニバッファに1行マニュアル表示
760:デフォルトの名無しさん
08/02/10 19:36:18
特に意味のないサンプルコードなんだけど、
require "Kconv"
puts "隕".toutf8.tosjis
とかするとなんも表示されなかったりするんだけどなんでだ?
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]に標準添付のヤツ
761:デフォルトの名無しさん
08/02/10 20:23:41
>>760
puts "隕".toutf8
の時点で空文字列が返っているのなら
kconv が文字コードの判定に失敗してる。
762:デフォルトの名無しさん
08/02/10 20:32:17
require "Kconv"
require 'nkf'
p "隕".toutf8
p "隕".kconv(Kconv::UTF8,Kconv::SJIS)
p NKF.nkf('-Sw',"隕")
# 結果
"\356\242\246" # 誤り
"\351\232\225" # 正しい
"\351\232\225" # 正しい
763:デフォルトの名無しさん
08/02/10 22:44:27
漢字一文字なんて、どうやってエンコーディングを判別するというのだ(w
764:デフォルトの名無しさん
08/02/10 23:40:14
Rubyの正規表現で前方不一致(否定後読み?)を指定するにはどう書けばよいでしょうか?
秀丸やEmEditorにおける(?<!pattern)です。
具体的にしたいことは、"B"の前に"A"が来ないときだけ
"A"の前に"_"を加えるという処理を行いたいのです。
CB #=> C_B
AB #=> AB
765:デフォルトの名無しさん
08/02/10 23:54:13
1.8:
string.gsub(/(\A|[^A])B/, '\1_B')
1.9:
string.gsub(/(?<!A)B/, '_B')
766:764
08/02/10 23:54:36
訂正
× "A"の前に"_"を
○ "B"の前に"_"を
767:デフォルトの名無しさん
08/02/11 00:03:08
>>763
勘
あるいは
運
768:764
08/02/11 00:03:10
>>765
すみません。間違いに気づいて訂正を書いている間にレスをいただいたようです。
ありがとうございました。
1.9では実装されているのですね。
769:デフォルトの名無しさん
08/02/11 05:02:35
>>762
把握した
>>763
いや、"隕"が入ってるときにおかしくなるなぁつー話だったさサンプル悪かったごめん
770:デフォルトの名無しさん
08/02/11 07:15:07
シフトJISの半角カタカナ偶数個かEUCか、は同じバイト列だったりするから、
エンコーディングは可能な限り明示的にすべきと思うけどね。
771:デフォルトの名無しさん
08/02/11 09:27:46
toutf8とかtoeucとかtosjisみたいなのは、本当は「selfを○○に変換する」という動作じゃないんだよな
「selfのエンコーディングが△△だと推測した上で○○に変換する」という動作をしてる
だから、△△であろうという部分の推測がコケると変な文字列になる
元の文字列のエンコーディングは指定しておくべき
10文字くらい余分に書かないといけないが、そのほうが動作も確実に速い
772:デフォルトの名無しさん
08/02/11 11:54:23
>>759
検索できるマニュアルって自分で追加して作れるの?
773:デフォルトの名無しさん
08/02/11 12:12:22
無理なんじゃない?
いや、やってやれなくはなさそうだけど
774:デフォルトの名無しさん
08/02/11 21:27:24
>>771
テキストエディタでも、全角文字少ないと誤認するのと一緒だよなあ
775:655
08/02/11 22:46:06
>>719
Amrita使ってる人って少ないのかな(´・ω・`)
>>723
なるほど、そう書くんですね!
…ということは tr の属性値を項目ごとに変えるのはできないわけですよね、、
amrita-altered を試してみることにします
776:デフォルトの名無しさん
08/02/12 00:47:19
常にUTF8として ENV['PATH_INFO']を受け取りたいのですが
うまい方法はないでしょうか?
下のコードで大体はうまくいくのですが
例にあげてるように短めのカタカナは判別、変換に失敗してしまいます
$KCODE="UTF8"
require "cgi"
require 'nkf'
class String
def to_utf8
NKF::UTF8 != NKF::guess(self) ? NKF::nkf("-w", self) : self
end
end
print "Content-type:text/html;charset=utf-8\n\n"
print ENV['PATH_INFO'].to_utf8
#アテレコ NG
#アテレコテ OK
#アテレコア NG
#アレコテ OK
#テレアコ NG
777:デフォルトの名無しさん
08/02/12 00:52:23
% time python -c 'range(0,10000000).sort'
0.769u 1.022s 0:01.79 99.4% 0+0k 0+0io 0pf+0w
% time ruby -e '(0...10000000).sort'
3.170u 0.259s 0:03.42 100.0% 0+0k 0+0io 0pf+0w
778:デフォルトの名無しさん
08/02/12 01:13:47
>>776
「UTF8以外で送ってきたら頃す」とCGIを使うページのトップに朱書きする
779:デフォルトの名無しさん
08/02/12 01:31:27
>>777
そのコード違うぞ
ボトルネックはこれだ
$ time ruby -e '(0...1000000).to_a'
real 0m2.535s
user 0m2.040s
sys 0m0.490s
Range#to_aは内部的には以下と似たようなことをしてて、
数値が大きくなるとこれが非常に遅い
arr = Array.new
range.each do |i|
arr.push(i)
end
return arr
780:デフォルトの名無しさん
08/02/12 01:44:25
>>778が最善策
「9 27 45 81」は3の倍数でしょうか9の倍数でしょうか? という問いに近い
これは「6」や「3」や「321」が含まれない限り同定できない
781:776
08/02/12 02:01:17
>>778>>780
無理なもんなんですか…。
wikiとかで似たような処理をしてるかと思ってたんですが
基本的に違う処理なんですね。
>>778の方法だと法律上ややこちらが不利な気がするので
guessで判断できないときは別の処理にまわすことにします
782:デフォルトの名無しさん
08/02/12 02:08:50
>>781
Webブラウザ経由の場合はUserAgentを見るという手も…
UTF-8なページからPOSTさせるとか
783:デフォルトの名無しさん
08/02/12 02:16:44
Ruby/SDLでWindows向けゲーム作ろうと思うんですが
Windows標準フォントを引っ張るのってどうやればいいでしょう?
例えばTTFフォント指定で"MS ゴシック"と指定すると、
どのコンピュータでも一意にMSゴシックを引っ張るという事です
784:デフォルトの名無しさん
08/02/12 02:27:26
ダミーで既知な文字列をhideen-inputなフィールドに埋め込んでおいて、
そいつがどういうバイナリになってるかを調べる手があったはず。
785:デフォルトの名無しさん
08/02/12 02:37:26
>>784
おーちょっと感動した
覚えとこ
>>783
全く使ったこともなければ実行環境もないが
> font = SDL::TTF.open('sample.tff', 24)
という表記方法から考えて、どうしかして%WINDIR%\Fonts\msgothic.ttcにアクセスすればいいんじゃね
とここまで書いてTTCじゃダメだろと思った
TTCはTTFのカタマリだけど、TTFしか読めませんというやつはTTCは普通読めない
Ruby/SDLには「いくつか埋め込み用フォントがあるようだけど、それでは用足りない?
786:デフォルトの名無しさん
08/02/12 04:26:23
Miyakoが、MSゴシックとかメイリオに対応してた
Miyakoのソースでも見たらどうかな?
787:デフォルトの名無しさん
08/02/12 08:37:53
>>783
URLリンク(www.kmc.gr.jp)
ちなみにTTCは、Ruby/SDLのリファレンスでは読めることになっているが
俺の手元で試した限りでは成功しなかった
Miyakoではどうやってるんだろう……
788:デフォルトの名無しさん
08/02/12 16:28:42
コード生成機能を持たないフレームワークプリーズ
789:デフォルトの名無しさん
08/02/12 17:51:40
Webサーバ上の巨大ファイルをダウンロードしたいんですが、
ダウンロード状況を「30%」など表示するにはどうしたらいいですか?
TCPSocket#readで数バイトずつチマチマ取得するしかないでしょうか?
790:デフォルトの名無しさん
08/02/12 18:00:13
数バイト単位はアホすぎます
791:デフォルトの名無しさん
08/02/12 18:04:00
#readの引数に合わせただけです
792:デフォルトの名無しさん
08/02/12 18:05:13
>>789
URLリンク(0xcc.net)
あとはopen-uriでopenするときに
:content_length_proc で 最初のサイズ設定
:progress_proc で進捗伝達
をさせるようにすればいい
793:デフォルトの名無しさん
08/02/12 18:17:14
require 'open-uri'
uri = URI.parse('URLリンク(gems.rubyforge.org)')
total = 0
count = (0..100).to_a
open(uri,
:content_length_proc => lambda {|n| total = n; puts "#{n}バイトいきます"},
:progress_proc => lambda {|n|
pc = (n.to_f/total*100).to_i
if pc == count.first then
puts "#{pc}%終了"
count.shift
end
}).read
# =====================================
$ ruby ./progress.rb
16047764バイトいきます
0%終了
1%終了
2%終了
3%終了
794:デフォルトの名無しさん
08/02/12 18:48:25
メソッドの引数にハッシュを取りたいです。
とり得るキーが多めにあった場合とか、うまく処理する方法ってありますか?
キーは1個の場合も4個の場合もあり、複数のキーが互いに必須なこともあります。
795:デフォルトの名無しさん
08/02/12 18:53:08
>>792-793
なるほどこりゃ便利ですね
open-uriのライブラリを掘り下げてみましたら
なるほどキモになってる部分は Net::HTTPResponse#read_body {|str| .... } ですね
ありがとうございました
796:デフォルトの名無しさん
08/02/12 18:55:43
うまく処理する方法とは?
まず、まずい処理がどんなものか説明してもらおうか。
797:デフォルトの名無しさん
08/02/12 19:00:04
>>794
素直にやるとこうだと思うぞ
def hoge(h)
case h
when h.has_key?(:param1) ...
when h.has_key?(:param2) && h.has_key?(:param3) ...
else raise "引数が不正です"
end
end
:param1と:param2は背反でないと処理上困るのになぜか同時に指定されてる、
とかいうエラーへの対処は無視しろめんどくさくなるから
「同時に指定したら死刑」とかいう立て札でも立てとけ
798:デフォルトの名無しさん
08/02/12 19:01:42
>>794
質問の意味が良く分からないが・・・
>キーは1個の場合も4個の場合もあり、
case hash.size
when 0
when 1
・・・
>複数のキーが互いに必須なこともあります。
if hash.key?(foo) && hash.key?(bar)
こんな感じじゃないか?
799:デフォルトの名無しさん
08/02/12 21:35:04
>>792-793
open-uriってお手軽なだけかと思ったら、意外に融通利いてびっくりだ
800:デフォルトの名無しさん
08/02/12 22:13:34
もう見てないかもしれないが
>>310>>316
今北なので、亀レスで申し訳ない
nowrite(true)、verbose(true) メソッドを使えばそれ以降
:noop=>true、:verbose=>true がデフォルトで設定される…はずなのだが
Rakeのバグでshとruby以外のメソッドに適用されない
つづく
801:800
08/02/12 22:15:10
修正するには rake.rb に以下のパッチを当てればおk
Index: rake.rb
===================================================================
--- rake.rb (revision 639)
+++ rake.rb (working copy)
@@ -871,8 +871,8 @@
module FileUtils
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
- OPT_TABLE['sh'] = %w(noop verbose)
- OPT_TABLE['ruby'] = %w(noop verbose)
+ OPT_TABLE['sh'] = [:noop, :verbose]
+ OPT_TABLE['ruby'] = [:noop, :verbose]
# Run the system command +cmd+. If multiple arguments are given the command
# is not run with the shell (same semantics as Kernel::exec and
@@ -970,10 +970,10 @@
FileUtils::OPT_TABLE.each do |name, opts|
default_options = []
- if opts.include?('verbose')
+ if opts.include?(:verbose)
default_options << ':verbose => RakeFileUtils.verbose_flag'
end
- if opts.include?('noop')
+ if opts.include?(:noop)
default_options << ':noop => RakeFileUtils.nowrite_flag'
end
802:デフォルトの名無しさん
08/02/12 22:28:06
既出でしたらすみません。トップレベルのインスタンス変数、selfについて質
問です。
クラス・モジュール定義内ではインスタンスメソッドの外に定義したインスタ
ンス変数はクラスオブジェクト(Klass)のインスタンス変数になり、インスタン
スメソッドとはselfが異なるのでアクセスできません。
class Klass
@a = 1 <--
def foo \
@a <-----+-- 別物(selfが異なる)
end
end
Klass.new.foo => nil
しかし、トップレベルで定義したインスタンス変数はトップレベルで定義した
メソッドからselfが同一なのでアクセスすることができます。
@a = 1 <--
def foo \
@a <-----+-- 同一(selfが一緒)
end
foo => 1
なぜトップレベルではメソッド定義内のselfとメソッド定義の外のselfが同一
になるのでしょうか。
rubyインタプリタが起動時に
Object.new.instance_eval { *ここがトップレベル* }
のようにしてトップレベルを作っていると解釈すればよいのでしょうか。
803:デフォルトの名無しさん
08/02/12 22:39:00
$ cat top.rb
p self
def hoge
p self
end
hoge
p self.class
$ ruby top.rb
main
main
Object
804:デフォルトの名無しさん
08/02/12 23:07:32
>>803さん、ありがとうございます。
トップレベルのselfはObjectのインスタンスで評価するとmainというものが返っ
てくるというのは理解できるのですが、トップレベルがどのようにして作られ
てselfが設定されているのかがわかりません。
あと、なぜトップレベルのselfはmainという表記で#<Object:0x294dc>みたいな
表記にならないのでしょうか。
そういう言語仕様なのでしょうか...
805:デフォルトの名無しさん
08/02/12 23:24:52
>>804
トップレベルをオブジェクト指向として悩むのはあまりよくないぞ
URLリンク(blade.nagaokaut.ac.jp)
まあ、Module#privateされたでっかいObjectクラスの中身だと考えられなくもないけど
806:デフォルトの名無しさん
08/02/12 23:39:52
"main"と返るのはそう定義されてるから。(object.c)
RubyのCソースは一部の例外を別にすれば見やすいから追いかけてみるとよい。
807:804
08/02/12 23:58:30
>>805さん、>>806さんありがとうごぜいます。
>>805さん
bladeのスレッド読んでみました。確かにEiffelやJavaよりもいきなり制御を書
けてしまうrubyのほうがありがたい気がします。
そういえば質問する前にbladeでnamazu検索してみたのですが、結果のリストが
表示されませんでした。壊れているんでしょうか?
>>806さん
そうですね。rb_internあたりで萎えてしまうのですが。頑張って読んでみます。
808:デフォルトの名無しさん
08/02/13 00:01:03
あ、それ俺も気づいた。bladeの検索は死んでる。
今じゃgoogle site:使ってるなあ
809:804
08/02/13 00:24:48
そうかgoogle site:を使えばよかったのかー。頭悪いな > オレ
>>806さん、ソース読んでみました。
main_to_s
rb_define_singleton_method(ruby_top_self, "to_s", main_to_s, 0);
拍子抜けしました。Init_Objectあたりをもっと深く読んでみようと思います。
ありがとうございました。
810:783
08/02/13 02:49:21
レスくれた方有難うございました。
確かにttcは読み込めなかったので
Miyako入れる方向で探っていく事にします
それにしてもruby/SDLの文字表示がこんなに弱いとは…
811:デフォルトの名無しさん
08/02/13 04:33:24
>>779
釣られてるよ。
>>777のpythonのコードは、sortに()が付いてないから実際にはソートしてない。
812:デフォルトの名無しさん
08/02/13 07:53:37
$ irb
irb(main):001:0> l=[100,101,102,103,104,105,106,107,108,109]
=> [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
irb(main):002:0> l.each_with_index do |item,idx|
irb(main):003:1* puts "hit #{item}"
irb(main):004:1> l.delete_at idx if 0==item%2
irb(main):005:1> end
hit 100
hit 102
hit 104
hit 106
hit 108
=> [101, 103, 105, 107, 109]
irb(main):006:0>
意図したとおり奇数だけ残せたのですがhitの表示がなぜ偶数だけになっているか分かりません
delete_atするより前でputs "hit #{item}"してるので全要素がputsされると思ったのですが。。。
813:デフォルトの名無しさん
08/02/13 08:07:34
消す度にずれてるから
p l
とか
puts "hit #{item} at #{idx}"
にして見れば分かる
delete_ifを使えばいいよ
814:812
08/02/13 08:28:52
理解できました ありがとうございます
delete_if使ってみます
815:デフォルトの名無しさん
08/02/13 09:05:53
>>811
python -c 'range(0,10000000).sort'
real 0.0859320 user 0.0468750 sys 0.0312500
python -c 'range(0,10000000).sort()'
real 0.0771435 user 0.0312500 sys 0.0468750
>>779
ruby -e '(0...10000000).sort'
real 2.1707595 user 1.6875000 sys 0.1406250
ruby -e '(0...1000000).to_a
real 0.3525165 user 0.2500000 sys0.0937500
816:デフォルトの名無しさん
08/02/13 09:10:38
桁が違うとか紛らわしい
ruby -e '(0...10000000).to_a
real 1.6034130 user 1.4531250 sys 0.1406250
817:デフォルトの名無しさん
08/02/13 10:14:36
10000000 を 10_000_000 とか 1000_0000 とか書けることは意外と知られてないし使われてないな
irb> p 10_000_000
10000000
818:デフォルトの名無しさん
08/02/13 10:41:43
>>810
でもMiyakoでは特に変なことしてないみたいだぞ?
api/font.rb を「TTF」で検索してみ
819:デフォルトの名無しさん
08/02/13 14:09:52
Pythonのマージソートは部分整列を利用してほげほげとかクックブックに書いてあったから
range(0,10000000).sort() のソートにほとんど時間がかからないはず。
(参考:URLリンク(svn.python.org))
Rubyはどうなのよ
820:デフォルトの名無しさん
08/02/13 15:29:39
マージソートなのか。
rubyはクイックソートだから、整列済みのものには不利だな。
821:デフォルトの名無しさん
08/02/13 15:34:42
>>820
それもあるけど、1.9だとシステム提供のqsortでなく割と高速なqsort実装を使っているので、その例だとPythonとほぼ互角の速度になる。
822:デフォルトの名無しさん
08/02/13 18:19:53
"ID;本文"という形式のcsvファイルを読み込み、
本文だけを文節単位でわかち書き(半角スペースを挿入する)して
返すスクリプトを書きたいと思っています。
そのため、RubyからCaboChaにテキストを渡して処理しようと
CaboCha0.53をインストールしたのですが、
肝心のCaboChaの呼び出し方がさっぱりわかりません。
CaboCha公式サイト(URLリンク(chasen.org))
には「詳しくは, ruby/README…をご覧ください.」と書いてあるのですが
そのruby/READMEがCaboChaインストールフォルダ内に見つからず…
どなたか、インストール方法とRubyからの呼び出し方を
教えていただけますでしょうか。
●実行環境
WindowsXP SP2
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
※One-Click Installer - Windows 1.8.6-26 Final Release 使用
CaboCha 0.53(Binary package for MS-Windows)
823:デフォルトの名無しさん
08/02/13 19:18:25
>>822
CaboCha というのは全く使ったことがないけど、
そのページから落せるソース cabocha-0.53.tar.gz には
ruby/README は入ってたよ。
中を読むとさらに test.rb を読めとあって、test.rb 内には
コメントとかまったく書いてないんだけど、まあその辺は C ライブラリの
方を見て予想しろってことなんじゃないかと。
あ、Windows での tar.gz の伸長には適当になんかフリーソフトを探してくれ。
824:デフォルトの名無しさん
08/02/13 20:44:51
Cgi = CGI.new
ip = ENV['REMOTE_ADDR']
host = ''
begin
host = Socket.gethostbyname(ip)[0]
rescue
host = ip
end
Cgi.out{host}
これでちゃんとリモホ名に変換出来る鯖と
出来ない鯖があるんですが、鯖の問題なんですよね?
825:デフォルトの名無しさん
08/02/13 20:52:30
rescueでエラー殺しておいてそういう質問するな
SocketError: host not found
が出るという話ならRubyのバージョンが悪いとかなんとかいうことになってた気がする
エラー時にコマンドラインから外部コマンド使うとなんとかなるかも
826:デフォルトの名無しさん
08/02/13 21:08:44
>>825
すみません…
助言ありがとうございました!
827:デフォルトの名無しさん
08/02/13 21:31:37
require 'cgi'
require 'socket'
cgi = CGI.new
begin
cgi.out{Socket.gethostbyname(ENV['REMOTE_ADDR'])[0]}
rescue
cgi.out{CGI.escapeHTML($!.inspect)}
end
う〜ん、こうやっても特に例外は出てない様です…
変換出来ない鯖のRubyのversionは1.8.5でした…
828:783
08/02/14 02:31:38
ruby/SDLの日本語表示の質問した者ですが
IPAフォントというフリーのttfを見付けたので
Miyakoを入れずとも日本語表示は出来ました
ただ、新たな問題としてボールドとイタリックの書体設定が出てきました
見る限りSDLやMiyakoにそういう機能は無いようですし…
そもそもこういう書体設定はどういう理屈でやってるんでしょうか
829:デフォルトの名無しさん
08/02/14 02:35:27
>>827
とりあえず何かのファイルにENV全体を書き出してみたら?
CLIENT_IPとかX_FORWARDED_FORとかVIAとかなら取れるかもしれない。
830:828
08/02/14 02:41:52
>>828
自己解決しました
思いっきりスタイルの設定部分見落としてたわ…
失礼しました
831:デフォルトの名無しさん
08/02/14 07:29:33
正規表現でこういうのは無理?
p "X(1)((2)Y)Z".gsub(/\([0-90-9]+\)/g, '')
やりたいこと
・(1)(2)を両方取り除く
わからんこと
・gオプションって無い?
・全角0-9の指定は無理?
※cygwin版ruby
832:デフォルトの名無しさん
08/02/14 07:30:27
↑全角がまじっちゃったけど、( )は全て半角
833:デフォルトの名無しさん
08/02/14 07:36:47
jcodeかなんかrequreする必要があったような無かったような・・・
gオプションってマッチを1回で止めない、ってperlのおぷそんだったけ?
それならデフォルトでそうなんじゃなかったっけか。
834:デフォルトの名無しさん
08/02/14 07:37:15
sub
gsub
835:デフォルトの名無しさん
08/02/14 07:47:34
さんくす
>>833
jcodeじゃgsubないっぽい
[0123456789]て書かないと駄目くさい
>>834
そうだった、gは必要ないな
836:デフォルトの名無しさん
08/02/14 10:51:43
>>831
jcodeをrequireして、
str.tr("0-9", "0-9").gsub(...)
ただ他の関係ない全角数字も巻き込まれる :-)
837:デフォルトの名無しさん
08/02/14 11:00:58
>823
ありがとう。
結局、rubyバインディングをインストールするには
Win用のCaboChaバイナリのほかに
UNIX用のCaboChaとSWIGを落としてきて自分でmakefileしないと
いけないようですね。
838:デフォルトの名無しさん
08/02/14 11:20:26
全くカボチャやらメカブやらチャセンやら・・・
ズイキはないのっ!?
839:デフォルトの名無しさん
08/02/14 11:40:53
>>831
半角開きカッコ・半角または全角数字・半角閉じカッコ
の並びを消去したいなら、正規表現はそれで問題ないぞ
(たしかにgオプションは存在しないのでつけたら駄目だが)
もし動作しないというなら、それは単に文字コード指定の問題だろう
対象文字列がShift_JISやらCP932やらならsを、日本語EUCならeつけろ
irb> p "X(1)((2)Y)Z(3)45".gsub(/\([0-90-9]+\)/e, '')
"X(Y)Z45"
840:デフォルトの名無しさん
08/02/14 14:16:13
>>839
確認してみたら通ったよ。
何が悪かったかといえば、コマンドラインで-Kオプションつけずに
ネイティブでないエンコード使ってたからぽい
だからコンパイル時にエラーになってた。
841:デフォルトの名無しさん
08/02/14 15:26:24
Rubinius で、Ruby にインクリメント演算子モドキを実装 - sumim’s smalltalking-tos
URLリンク(d.hatena.ne.jp)
…バイトコードを探して加算するという力技
842:デフォルトの名無しさん
08/02/14 16:26:06
コンテキストがべたべたに見えてるのか、
Rubyはなぜかそれをやらなかったんだよね、
フレームのオブジェクト化。
843:デフォルトの名無しさん
08/02/14 16:26:39
rubyは、か。
844:デフォルトの名無しさん
08/02/14 16:54:11
>>843
matzは、か?
845:デフォルトの名無しさん
08/02/14 16:59:21
>>842
しないほうがいいんじゃね?>>841なんてどうかんがえても力業だし
846:デフォルトの名無しさん
08/02/14 17:07:43
この手のイントロスペクションが可能だと、デバッガを強化できるんだがな。
847:デフォルトの名無しさん
08/02/14 17:15:38
ドコに力点を置くかだよね
特に悪影響がないのなら導入すればいいわけで
848:デフォルトの名無しさん
08/02/14 18:33:31
ruby/SDLの日本語表示の質問してた者です
何度も何度も済みません…
ttfのフォントで半角英数文字列を出力すると
全角幅で出てしまうんですが、何か調整する機能は無いのでしょうか?
一応ゴリ押しすれば、
文字列を各文字に分割して文字幅取りつつ各個表示
という風に行けそうではありますが…
849:デフォルトの名無しさん
08/02/14 19:45:01
>>848
何を言ってるのかよく分からないのですが、とりあえず
URLリンク(mono.kmc.gr.jp)
にある作品で、該当しそうなことをやってるものの
ソースを読んでみたらどうでしょうか。
高橋メソッドとか文字表示に特化してそうだし、
ソースをちょっと見てみた限りTTF使ってるみたいだし、
実行してみてないので想像ですが、半角/全角が
区別されずに表示されるという事もないんじゃないかなあと思います。
850:デフォルトの名無しさん
08/02/14 20:27:32
>>848
俺の環境ではそういった現象は起こっていない(半角は半角幅で出力される)
もう少しkwsk
851:デフォルトの名無しさん
08/02/14 20:35:06
フォントによってはそうなるよ
ruby/sdlではなくfreetypeの仕様っぽい
プロポーショナルなフォント使えば大丈夫だったと思う
852:848
08/02/14 20:49:34
ソース出した方が早そうですね
フォントはIPAゴシックです
SDL.init(SDL::INIT_EVERYTHING)
screen = SDL.set_video_mode(SCREEN_W, SCREEN_H, 16, SDL::SWSURFACE)
SDL::TTF.init
font = SDL::TTF.open("IPAFont/ipag.ttf", 24)
font.style = SDL::TTF::STYLE_ITALIC
font.draw_blended_utf8(screen, "abc", 0, 32, 255, 255, 255)
これで全角幅で出ます(Pゴシックも同じ)
「abc」でなく「a b c」という感じ
853:848
08/02/15 03:47:05
レスどうもです
色々試しましたがどうもフォント依存の問題みたいですね
Arialだと普通に間合いが詰まってましたし
…しかし日本語フォントで
サイズ一定以下にすると表示がバグるとか不具合もあるようで
これ本当にゲーム作れるのか…?
854:デフォルトの名無しさん
08/02/15 04:07:32
>>835
ここで愚痴るより作者にメールを送れYO!
反応のある確率はここより低いかもしれんが、
もしあった場合より的確な答が返ってくるだろうし
パッチも当たるかもしれないじゃん。
855:デフォルトの名無しさん
08/02/15 04:33:18
追試してみたけどそもそも文字が出ないw
なにがわるいんだろ?
856:デフォルトの名無しさん
08/02/15 15:31:04
かなり亀だが
>>797
case h
when h.has_key?(:param1) ...
これって期待通りの動作しなくね?
857:デフォルトの名無しさん
08/02/15 16:07:58
h === h.has_key?(:param1) って何が起こるの?
858:デフォルトの名無しさん
08/02/15 16:10:42
あ、逆か。
h.has_key?(:param1) === h って何が起こるの?
859:デフォルトの名無しさん
08/02/15 16:43:47
そのまんまだよ
h が === 的に true と同一なら true、同一でないなら false が返る
Hash は TrueClass に属してないから常に false だね
860:デフォルトの名無しさん
08/02/15 16:46:09
変な書き方だった
Hash は TrueClass にも FalseClass にも属してないから結果は常に false だね
に変更
861:デフォルトの名無しさん
08/02/15 19:22:31
休刊になったLinux Magazine全部入りDVDを入手
Matz御大による、初等Ruby講座(と探訪Ruby)の
存在を知り拝読(中)
しっかし、なんつーわかりやすさなんでしょう
なんでもないと思ってたとこでも
目からうろこが、ぽろぽろぽろぽろ…
開発者自身の手でここまでやさしく書かれた
ドキュメントがあったなんて!と
ちょっと感動しました
過ぎるほど今更ですみません
862:デフォルトの名無しさん
08/02/15 20:21:59
>>858
逆じゃないよ。(when式)===(case結果)で合ってる。
863:デフォルトの名無しさん
08/02/15 21:33:48
>>862
だから>>858はそう書いてるんじゃないか?
864:デフォルトの名無しさん
08/02/15 21:49:36
case h
じゃなくて
case
なんだろうね。
865:デフォルトの名無しさん
08/02/15 22:13:01
gem install したときに 所有者 root でインストールしようとするのを止めさせることはできますか?
$ gem install --no-ri --no-rdoc hpricot
make
cc -I. -I. -I/usr/local/lib/ruby/1.8/i386-freebsd6 -I. -fPIC -O2 -fno-strict-aliasing -pipe -fPIC -c hpricot_scan.c
cc -shared -Wl,-soname,hpricot_scan.so -L'/usr/local/lib' -Wl,-R'/usr/local/lib' -o hpricot_scan.so hpricot_scan.o \
-Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -L. -lruby18 -lc -lcrypt -lm -pthread -lc
make install
/usr/bin/install -c -o root -g wheel -m 0755 hpricot_scan.so /home/俺/rubygems/gems/hpricot-0.6/lib/i686-linux
install: /home/俺/rubygems/gems/hpricot-0.6/lib/i686-linux/hpricot_scan.so: chown/chgrp: Operation not permitted
*** Error code 71
866:デフォルトの名無しさん
08/02/16 00:35:29
原因が絞られたので再質問します
Ruby1.8.5にて、ユーザー権限でgem install hpricotしようと思いました。
しかし、root権限でインストールしようとしてしまってうまくいきません。
/usr/bin/install -c -o root -g wheel -m 0755 hpricot_scan.so
レンタルサーバ(さくら)なので rbconfig の CONFIG の INSTALLキーに
/usr/bin/install -c -o root -g wheel という文字列が入ってしまってるからのようです。
これを変更した上でgem install を実行させることはできますか?
867:866
08/02/16 01:25:16
あーできたー。っていうかこれ罠っぽい…
さくらインターネットでrubygemsのインストールでコケる場合の対処
/usr/local/lib/ruby/1.8/i386-freebsd6/rbconfig.rb を見ると
> CONFIG["INSTALL"] = ENV['RB_USER_INSTALL'] ? '/usr/bin/install -c' : '/usr/bin/install -c -o root -g wheel'
とかいう記述がある
よって
setenv RB_USER_INSTALL true
とかコマンドラインで入力してから rubugemsをインストールすればいい
(試してないけどたぶんrubygemsのインストール時1回のみでおk)
あーもう寝る
868:デフォルトの名無しさん
08/02/16 02:52:50
>>861
宗教じみてるので釣りかと思った
869:デフォルトの名無しさん
08/02/16 02:58:43
>>861
そんなに分かりやすいのか・・・買う価値ありかね?
870:デフォルトの名無しさん
08/02/16 03:48:49
初めて知ったが、そもそもLinux Magazineぜんぶ入りが買いじゃね?
>>866-867
さくらの共有?Railsまともにうごきます?
871:デフォルトの名無しさん
08/02/16 04:21:29
でももう2年前の話だしなぁ・・・休刊。
まだVineが人気の時代じゃね?
872:デフォルトの名無しさん
08/02/16 10:07:47
>>870
FastCGI入ってないけどそれでもよければ
873:デフォルトの名無しさん
08/02/16 10:16:34
Webサービスとして使うのは問題外ってことだな
自分用かバックグラウンド動作用か
874:デフォルトの名無しさん
08/02/16 11:15:37
% time python -c 'range(0,10000000).sort'
0.769u 1.022s 0:01.79 99.4% 0+0k 0+0io 0pf+0w
% time ruby -e '(0...10000000).sort'
3.170u 0.259s 0:03.42 100.0% 0+0k 0+0io 0pf+0w
875:デフォルトの名無しさん
08/02/16 11:58:20
>>872
まともに使えない上に、同じ鯖の人に迷惑になりそうな(´・ω・`)
876:デフォルトの名無しさん
08/02/16 12:02:23
どっかのページで、CGI版でも高速動作させるって方法があったけど、
結局、プロセスをしばらく立ちあげといてって方法なので、レンサバだと無理そうだった・・・
CGIでRailsをまともに動かす - 古橋貞之の日記
URLリンク(d.hatena.ne.jp)
877:デフォルトの名無しさん
08/02/16 13:00:28
以前からずううううっと気になってたんだけどさ
file = open('test.txt','r').read
とか
file = File.open('test.txt','r').read
ってしたときって、test.txtを開いたときに使ったIOオブジェクトってcloseされてる?
readの中で実はブロックとか使っててcloseしてるとか
878:デフォルトの名無しさん
08/02/16 13:06:30
>>877
close はしてないので File.read("test.txt") を使ったほうがいい。
バイナリモードの指定ができないくそインターフェイスだけど。
879:デフォルトの名無しさん
08/02/16 13:18:18
あるいは、長くなってもいいなら content = open(...) {|io| io.read }
880:デフォルトの名無しさん
08/02/16 13:26:21
File.open(path).read は「動くけどあまり好ましくない書き方」のひとつだな
881:デフォルトの名無しさん
08/02/16 13:47:03
参照カウンタの方がスクリプト言語にはあうね
882:デフォルトの名無しさん
08/02/16 13:52:34
やっぱり、そんなには知られていなかったんですね>Matzの連載
私も知らずに手に入れたんですけど
初等講座が190ページ、探訪が96ページ
雑誌連載ならではの密度(基本2段組でビッシリ)ですので
これ目当てで買っても損はないかと思います。
ただ、PDFの2段組は読みづらいです。
私はスレタイどおりの初心者なので
正直、中盤以降はナナメ読みになりましたが
ハッシュと正規表現の置換のところで
そう書いてくれればわかる!という開発者ならではの
曇りのない記述に出会えたので
これだけで個人的には得した気分です。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5382日前に更新/271 KB
担当:undef