>1乙
例の比較サイトにリンク張れや
CGIなので恐縮なのですが、以下のCGIを実行するとrubyが固まります。 具体的には、CGIと同じフォルダに65KBぐらいの大きさの a.dat を用意し、 以下のCGIを実行して現れるボタンを押すと固まります。 #!/usr/bin/ruby print "Content-Type: text/html\n\n" if !ENV['CONTENT_TYPE'].nil? File.open('./a.dat') do |f| while str = f.gets; print str; end end else print "<form method=post><input type=text name=a><input type=submit></form>" end 環境はOS Windows、Ruby 1.8.1mswin32、Apacheで発生しました。 ちなみにLinuxだとうまくできてしまいました。 どうにかしてちょ(´・ω・`)
>>9 a.datって中に改行ある?
なんとなく、
File.open('./a.dat', 'rb') do |f|
while str = f.read(1024); print str; end
end
とすればいいような気がするが、試してないし根拠もない。
Tabの幅が8文字分じゃないときってどんなとき? そんな設定をするやつの気が知れんのだが。 なぜそんな設定をするやつのことを考慮しなきゃいけないのか。
13 :
デフォルトの名無しさん :04/03/23 12:18
blade止まってるの?
>>13 ヲレもそれおもった。
MLはとらずに、いつもblade見ている人間なので。
>>10 改行あります。
a.datは2ちゃんのdatファイルを想定してます。
今試しているdatでは167行目を超えると反応なしに。
改行ばっかりのファイルを作成してみたら8000行くらいで反応なしになりました。
(ファイルサイズは56KBくらい)
>>10 のコードも試してみましたが駄目でした。
Linux上でテストしようかなぁ(´・ω・`)
なんとなく、print するたびに STDOUT.flush すればいいような気がするが、試して(ry
IO.foreach じゃダメなの?
19 :
デフォルトの名無しさん :04/03/23 18:34
def hoge(buf) sjis = Regexp::compile("[\x82\x9f-\x82\xaa]", nil, 's') buf.each do |str| if ($sjis == 1) # 無駄なループを減らす break end case str when sjis $sjis = 1 end end buf.each do |str| if ($sjis == 1) なんとか end かんとか end end 今こんな感じに、処理すべきテキストがSJIS の場合$sjis に1 が 代入されるようにしているのですが、ものすごく非効率的な感じがします もう少しきれいに書けないでしょうか?
ああ、tabのインデントが消えてしまった..
こんなんとか。 # グローバル変数やめれ。 require "nkf" def hoge(buf) sjis = (NKF::guess == NKF::SJIS) buf.each do |str| なんとか if sjis かんとか end end
23 :
デフォルトの名無しさん :04/03/23 20:18
def hoge(buf) sjis = Regexp... jis = Regexp... buf.each do |str| if ($ja == 1) # 無駄なループを減らす break end case str when sjis, jis $ja = 1 end end buf.each do |str| if ($ja == 1) str = NKF::nkf('-e', str) end なんとか end 19は簡略化して書いたんですが、本当はこんな感じのことがやりたかったんです。 nkfがもの凄く重いので事前に日本語だとわかってるときだけ動いて欲しい。 上の日本語判定のところがどうにも無駄なような気がして
NKF::guess は NKF と言いながらも nkf の機能は一切使ってないので、 そんな重くないかも知れないし重いかも知れない。 しかし nkf ってそんな重いかね?
そろそろ女の子の落書き希望
>>17-18 返信ありがとうございます。
flush と each を試してみましたが、やはりファイルが大きいと固まります。
ただ、テスト環境でWindows使ってるだけで、最終的にはLinux上で使うので、
50KBぐらいの小さいファイルでテストすれば動作するようなのでそれでやります。
>>23 $ja = 1のところですぐにbreakしないのはなぜ?
guessが重いってどういう場合なんだろ。 ほかの部分がほとんど何にもしてないような場合なんじゃないかな。
しょーがねーなー
>>25 の期待にこたえてオネエ口調でスレを展開しますわよ!
nkfってCで書かれたやつだろ。あっ、ですわよね。
Rubyで判定コード書くより相当早いんじゃねーの?あっ
>>27 buf.each do |str|
case str
when なんとか
$ja = 1
break #ここでbreakしてもcase~whenを抜けるだけだと思ってたから
end
かんとか
end
あれからしばらくしてbreakですぐ抜けるよう書き直しました
で、なんでグローバル変数なんだ
>>31 undefined local variable or method `ja' for #<Probability:0x402881d0> (NameError)
こういうエラーが出るから
宣言なり初期する方が普通な気も? つか、グローバル使うくらいならインスタンス使う方が普通な気も?
34.each do { |line| sub("初期する", "初期化する言語の") }
>>35 それやっても34は変わらないぞ。
34.sub!(/初期化する/, '\1言語の')
だから\1を使うなと(ry
sub の第2引数使うの禁止
There's more than one way to do it. ですよ。
というか、 line.sub だろ。
tabでインデントしないってことは、 じゃあtabって一体何のためにあるんだ
tab移動するためだな
>>44 tab コードの話と tab キーの話がごちゃまぜになってない?
8tabにして空白の多いテキストの簡易圧縮に使ったり、 エクセルでタブ区切りでcsvに吐かせたり、 まあいろいろある。
REXML の Encodings に "UNILE" ってのがあるんだけど、これ一体何者?
UNIcode Little Endian 略して UNILE ですかね?
>>49 いや、だから、「tab キー」の話をここでするのは混乱するからやめたほうが。
じゃ、0x09 はエディタ等で補完に使う。
>>38 34.sub!(/(初期化する)/) do $1+'言語の'; end
ブロックと$1をつかう。かな?
>>37 じゃないからわからn
3インデント推進委員会の結成を今ここに発表致します。
なんでもいからMatzに宣言させとけ。 そうすれば黙っておとなしく従うよ。 もともとインデントサイズ・キャラクタコードなんて何の必然性もないんだからな。
RGSS は似てるだけの別実装かと思ってたら Ruby ベースか。 ネイティブスレッドと相性が悪い問題とかどう解決したのか知りたいね。
3インデント推進委員会の結城を、に一瞬見えた。
rubyってややこしいんだな perlにするか。
>57 へぇー $& って知らなかった。 $1 よりもわかりにくくない? 俺は可読性をとくに高めたいときは Regexp.last_match[0] とか Regexp[0] って 冗長にタイプするときもあるよ。 でも余計なリテラル増えるし。
>>59 sed/awk/Perlで常識<$&
# 更にPerlだと遅いから使うなというのも常識
## Rubyでは $&, $', $` は遅くない
>>52 なぜブロック引数を使わないのかと
個人的には、ブロック付き sub, gsub(あと scan)は
ブロックに MatchData を渡して欲しいかも。
MatchData が来ても便利だけど、 あえて言うけど「一般的な」用途向けには、 String が来たほうが便利というかタイプ数が少なくなると思う。 MatchData だとリテラル増えるし、別に Regexp.last_match でアクセスできるし。 そのへんのバランスはよく考えられてると思う。角度とか。
>>62 何の「角度」?
まあ、ruby は「統一性」優先よりも「使用感」優先だもんな。
64 :
デフォルトの名無しさん :04/03/29 05:32
if str =~ /regexp/ then ... end では返り値0の時困るんですが どう書けばいいですか? できればperlから離れ過ぎない書き方がいいです
65 :
デフォルトの名無しさん :04/03/29 08:41
>>60 > # 更にPerlだと遅いから使うなというのも常識
> ## Rubyでは $&, $', $` は遅くない
$ time perl -e 'for(1..1000000){/(\d+)/;$s+=$1}print "$s\n"'
500000500000
1.79user 0.00system 0:01.79elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
$ time perl -e 'for(1..1000000){/\d+/;$s+=$&}print "$s\n"'
500000500000
1.68user 0.00system 0:01.68elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
「Perlだと$&が遅いという常識」はデマだと分かりました
RubyもPerlのバッドノウハウ大量に受け継いでるんだよな。 ていうかRuby自身が新規のバッドノウハウ撒き散らしててウザ杉。
>>59 =62?
> MatchData だとリテラル増えるし
何の話だ? コードに書いた以上のリテラルができることはないぞ。
おそらく「リテラル」の意味するモノが違うんだと思われ
MatchData#[] とかで使うリテラル増えるだろ。 String#gsub に渡すブロックの引数が String になる場合と比べてね。
ひょっとしてMatchData#[]の引数のことをいってるのか?
>73 そうそう
KDevelopってRubyサポートしてるらしいけどどの程度のことをしてくれるの?
クラス定義ではないところでインスタンスメソッドを使うことはできますか? やりたいことは、ERB::Util#escape_html()ってのがあるんだけど、これをCGIスクリプトで使いたいの。 でも暮らすメソッドじゃないから、CGI.escapeHTMLのようには使えない。 importeかextendでなんとかなるのかと思ったけどできないし。
インスタンスメソッドをインスタンスを作らずに使うことはできない。 インスタンスに対して作用するか、インスタンスの情報が必要かだか らこそインスタンスメソッドにするわけだ。もしインスタンスが必要 でないなら、クラスメソッドにしてそれを使うか、module_function にしたほうがいい。 ところで、標準のerb.rbにはERB::Utilなんてないようなんだが。
escape_html じゃなくて、html_escape な。 とりあえず自分で module_function したら? module ERB::Util module_function :html_escape end p ERB::Util.html_escape("&") #=> "&"
>>76 % ruby -rerb -e 'include ERB::Util; p html_escape("<p>")'
"<p>"
% ruby -v
ruby 1.8.1 (2003-12-25) [i686-linux]
という話ではなく?
すまそ。出力は、 "&lt;p&gt;"
>>80 あれーなんでできるの?おれはぜんぜん出来なかったのに・・・
と思ったら
>>79 メソッド名を間違えてただけでした。真できます。
>>82 本題は解決したようですが。
これって明らかにクラスメソッドであるべきだと思わない? >all
もしそう思ったら、ぜひメンテナ(咳さん)に報告してあげてよ
>>79 こういう細かい改良の報告を積み重ねる事こそ、バザールモデルの
力の源だと思うのだけれど。
# やけに高尚になってスマソ
>>83 クラスメソッドにしてしまうとクラス名つけないと使えなくなるのでそれはそれで不便だろう。
どちらの形でも使えるようにモジュール関数にすべきだという意見なら賛成だな。
自分で
>>76 のようにすれば今のままでもいいといえばいいが、はじめからそうなってた方が
なにかと便利だろうし。
89 :
デフォルトの名無しさん :04/03/30 23:45
class FooTest < Test::Unit::TestCase def test_1 end def test_2 end end とあって、test_2 だけ実行したいときはどうすればいい? コマンドライン引数でやれるとのことでしたが: $ ruby footest.rb test_2 cygwin rubyではできませんでした 他でも多分、できないと思うんですけども
>>89 ruby -r footest -e 'footest = FooTest.new; footest.test_2'
つーかなぜRWiki?Hikiでいいじゃん。あとBitChannel。
そんなのあったのか、HikiもBitChannelもいいねー Rubyを使っていることを全面に押し出してもらいたい。
個人的にはBitChannelに期待
コミュニティとかなんとかしろとか言ってる奴は、いろいろと勘違いしてるんじゃなかろうか。
>>95 短く書きすぎ。
「どう」なんとかしろとか言っている奴が、「何を」いろいろと勘違いしている
のかを言わないと。
コミュニティとかなんとかしろとか言って(〜中略〜)ろと勘違いしてるんじゃなかろうか。
98 :
RPI ◆3x0ES2jpL2 :04/04/01 00:37
RPIC のお知らせ。 Ruby Professional Institute は、Ruby の専門家それぞれのレベルを測るために、 各国共通の基準となる認定制度 RPIC の創設を計画中です。 # RPIC は「アルピック」と発音します。 Ruby の専門家の雇用主や契約先といった団体組織や専門家自身のニーズを満たす 技術者資格を目指しています。 資格は、Level 1 (初級)、Level 2 (中級)、Level 3 (上級) の3つに 分かれる予定です。 Level 1 の試験内容は、逐次、このスレで発表があります。
>>95 さらに短く書くと。
「クレクレ君うざい」
Rubyってまだやってたんだね。いや、煽りじゃなくて。 どんなところで使われてるの?
>>100 Javaの代わりに決まってるだろ?
煽りはドトネトすれいってやれよ。
>>98 なんじゃこりゃー
Rubyもなんか認定試験がつくようになったんだね
>>98 知らなかった、Rubyの資格ができるとは。
やっぱりスクリプト言語が社会的に認知されるようになって来た、ということかな?
参考になりました。サンクス。
コピペ失礼。 まつもとひろゆき氏は4月1日、自身が開発するオブジェクト指向スクリプト言語の次世代実装、通称Liteのβバージョンを発表した。 LiteのLはLispを意味し、LiteはすべてEmacs Lispによって書かれている。このため移植性は非常に高い。 この他のLiteの優れた特徴としては ・動作の重量感 ・「;;」によるコメントアウトの実現 ・新標準ライブラリ「psychiatrist」 ・Kernel#car・Kernel#cdrなどを実装 ・処理系自身がGCの恩恵を受けるため、segmentation faultとは無縁 ・「)」を文の終端とし不要な「(」を無視することによって、カッコまみれのLisp風新文法を実現 ・いちいちEmacsを立ち上げる必要があり、思考が寸断され同氏の掲げる「苦しいプログラミング」を体感できる ・新正規表現処理エンジン「Onigoroshi」により、Emacs Lisp由来のバックスラッシュを多用した分かり辛い表記に対応 などが挙げられる。 ダウンロード開始時期は未定。
質問です。 load と require の違いって何ですか? load も require もロード&実行するみたいなんですが。
>>105 前スレでもあったな。その質問。
requireは同じものを1度しか読まない。
loadは呼ばれたら必ず読む。
で、合ってる?
>106-108 ありがとうございます。 FAQだったようですみません。 マニュアルは読んだのですが、「load が必ず読む」ということが 明記されていなかったので、両者の違いがみいだせず 混乱したしだいでございます。 以後、FAQ を気をつけて読むように致します。
>>109 誰かが書き直してくれたよ(君かもしれんが)。
今年は上出来なRubyジョークはあったのかな。
113 :
デフォルトの名無しさん :04/04/02 05:49
>>113 なにぃー。確かに
>>98 がgoogleに引っかからない…。騙された orz
マジで騙されたのかよ?
正直なところ
>>104 はつまらなかった。
116 :
スクリプト未経験者 :04/04/02 18:49
Rubyって将来性あるの?
もっと必死こいてRubyで金儲けするやつがいればいいのに。
>>119 何を必死こくの?
RZope とか、RCSV とか、RSubversion とか?
256倍シリーズとかボッタクリにしてもひどすぎると思うけどな。
アフォか。 Zend社のようなことを言ってんだよ。
なんだ妄想か。
Zendは金儲けになってるのか?
256倍シリーズ… あれはあれで役に立った
暇潰しの読み物としてな
RaccとRubyUnitは普通に役に立ったけどな。 網道は後半がビミョー。場外乱闘は買って損した。
256倍を読んでRuby/Tk覚えて、さあ実戦投入だと思ったら リファレンスが尻切れトンボだった罠。 DBIのやつ買おうと思って立ち読みしたら、 半分以上違う話で、さすがに金を出そうとは思えんかった。
>>128 > DBIのやつ
買っとけよ!話のネタになるだろ!
>>115 まあ、好意的に書くと、
「Emacs由来のバックスラッシュ多用正規表現」というのにはそれなりに同情。
Rubyでいい本ってなんかないの? 前 UnixUserで連載してたやまだあきらってひとは、 なかなかいい記事書いてたから彼の本買ってみたいんだけど
SWS/SDSって無くなっちゃった?
>>132 あとはリファレンスに「プログラミングRuby」かね。
これくらいあれば十分かな。
138 :
デフォルトの名無しさん :04/04/04 16:54
Ruby/Tkが働かなくて困っています
環境:Windows98 + Ruby1.8.0(mswin32版)
このアプリケーションの実行に必要なライブラリファイルの1つが見つかりません
-D:/DEVELOP/Ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError)
と怒られてしまいます。ですが
D:\DEVELOP\RUBY\lib\ruby\1.8\i386-win32\tcltklib.so
は所定の場所に見つけることができました。
Tcl/Tkを D:\Develop\Tcl以下に導入したので
RUBY_TCL_DLL=D:\Develop\Tcl\bin\tcl84.dll
RUBY_TK_DLL=D:\Develop\Tcl\bin\tk84.dll
で環境変数を与えています。
Tcl/Tkのデモスクリプトが実行できたのを確認しました。
ためしに同じスクリプトをmingw版で実行するときちんと通ります。
cygwin版はmswin32版と同じでLoadDrrorが出てしまいました。
インストールしたファイルは
ftp://ftp.ruby-lang.org/pub/ruby/binaries/ から落としたバイナリ版です。
これはmingw版を使えってことなのでしょうか。
何かよきアドバイスをお願いします
D:/DEVELOP/Ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError) D:\DEVELOP\RUBY\lib\ruby\1.8\i386-win32\tcltklib.so よーく比べてみよう
すいません、タイプまちがえました。 D:/DEVELOP/RUBY/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError) D:\DEVELOP\RUBY\lib\ruby\1.8\i386-mswin32\tcltklib.so
>>138 よくわからんが、D:\Develop\Tcl\binにPATHを通してみては?
D:\Develop\Tcl\binにPATHを通してみましたが やっぱりLoadErrorと言われました。 win32版はあきらめて 動いてくれているmingw版を使うことにします。
>>141 WebObjectsを参考にしているだけあって、生産性の向上はかなり微妙だが
何も使わないほうがよいと漏れは思うよ
アナルバクバクおじさん = るびきち
musya たんと食い歩きオフ会のようなものは開催しないのでつか? 花見もいいのだけど。
「duck type」ってどういう意味?
musya たんって誰だ? ちょんまげが乱れた落ち武者を想像してしまったぞ。
>>150 knuタンだ。FreeBSD界ではportupgradeの作者として高名かな。
152 :
デフォルトの名無しさん :04/04/07 09:57
>>150 本人の表記に従うなら"musha"のはず。
>>9 です。今さらですが現象報告です。
ruby が固まると書きましたが、同じようなコードをperlで書いても固まったので、
ruby ではなくapacheとか環境が問題っぽいことがわかりました。
お騒がせしました。
>>152 ┌-┴-┐ l l
├──┤ | _ l -┼─
├──┘  ̄| ̄ ヽ | _ | ─-
| l / | │  ̄ ヽ |
⊥-ーヽ、_ | ヽl _ノ | ヽ__ o
File.basename ってOSによって動作違うんですか? Windows: File.basename('d:\kirai\demo\suki') #=>sukiが得られる Linux: File.basename('d:\kirai\demo\suki') #=> d:\kirai\demo\sukiが得られる できれば動作を一緒にしてもらいたかった…。
どっちにあわせろと?
>>160 OS によって同じ動作にしたければ、普通はこうすると思うけど。
File::basename('d:/kirai/demo/suki')
つーか、touch d:\kirai\demo\suki で d:kiraidemosuk 作れるし ls d:\kirai\demo\suki で引っかかるし
>>161 どっちかというとこっち。
File.basename('d:\kirai\demo\suki') #=>sukiが得られる
>>162 ありがとうございます。やっぱりその方法ですか。trでもしときます。
>>163 それはいいんですが、File.basenameではベース名が取得できてほしいんです。
今作ってるものはCGIなんですが、その中で \ 区切りパス文字列をブラウザが送ってくるもので…。
いちいちtrするのも・・・。
Linuxでは\はパス区切り文字じゃないんだからしょうがねーじゃん。無茶言うな。
>>164 > その中で \ 区切りパス文字列をブラウザが送ってくるもので…。
そのへん詳しく教えれ。
正直、2ch向けのレスは書いてて疲れますね。「wait(2) くらい知っとけよ!」って思ってしまう。
書けるやつが書きたいときに書けばいい。 自分がいなくてもスレは回る、地球は回る…('・ω・`)ショボーン
ばーかばーかばーか
>>165 正直スマンカッタ
>>166 CGIなんで微妙にスレ違いですが、multipart/form-data のfilenameの部分です。
↓の filename="D:\data\ruby\a.rb" の部分です。
-----------------------------7d45c21102aa
Content-Disposition: form-data; name="uploadfile1"; filename="D:\data\ruby\a.rb"
Content-Type: application/octet-stream
print File.basename("
http://www.2ch.net/2ch.htm "), "\n"
print File.dirname("
http://www.2ch.net/2ch.htm "), "\n"
-----------------------------7d45c21102aa--
>>167 うーん、unix系でも同じような動きがいいんだが。正直スマンカッタ
>>170 正直スマンカッタ
>>171 File.basename とは別に CGI::XXX.basename みたいなのを作って、
そっちはプラットフォームにかかわらず DOSISH 対応、ってのがいいやり方なのかなあ。
うpろだ作るなら避けて通れない問題っぽいけど、普通はどうしてるんだろうか。
ちらっと調べたら、
File.basename(params['foo'][0].original_filename.gsub(/\\/, '/'))
みたいなことしてるのを発見したけど。
テキストファイルかバイナリファイルか判別する方法ある? perl の -T -B みたいな機能。
>>173 ないと思う。
……っていうか、perl にはそんな演算子があることを始めて知った。
「テキストファイル」と「バイナリファイル」の定義を知りたいものだ。
>>172 の言うとおり、CGIクラスが持つべきだろうね。
>>174 ファイルの先頭の数百バイトを見て判断してるらしい。
ちなみに日本語入りファイルはバイナリファイル。
Rubyのmd5生成ってバグ持ち? オフィシャルのサンプル使ってもmd5、md5sumとかで生成した値と一致しないんだけど?
「オフィシャルのサンプル」って具体的にはどれ?
>>171 > うーん、unix系でも同じような動きがいいんだが。
UNIX だと '\' もファイル名に使えるからあまりよろしくないんじゃないかと。
'/' なら UNIX でも DOSISH でもファイル名に使えないので、
'/' に path 区切りを揃えてから File::basename に食わせるという方が良いと思う。
>178 D:\WINNT\system32>ruby -rmd5 -e "p Digest::MD5.hexdigest( ARGF.read() ) " NTOSKRNL.EXE "ab349b95d62bf9770a17959c00a8b022" D:\WINNT\system32>ruby -rmd5 -e "ARGF.binmode;p Digest::MD5.hexdigest( ARGF.read() ) " NTOSKRNL.EXE "dccb693e32ca945462bf4f12185a1e82" D:\WINNT\system32>\\tpi\d$\cygnus\bin\md5sum.exe NTOSKRNL.EXE dccb693e32ca945462bf4f12185a1e82 *NTOSKRNL.EXE というオチ?
>>181 もろにそれが原因でした…_| ̄|○
ありがとうございました
>>180 おお。納得。そういえば \ ってつかえますもんね。
path 区切り揃える方向でつくります。
そう考えると確かに
>>172 のようなものを用意して、
それを使うようにする方がいいですね。
そうかそれで、
>>165 は無茶いうなと言っていたわけですか。正直スマンカッタ_| ̄|○
真性だな。
flockのように共有ロックと排他ロックの両方ができる Mutex風のクラスはありませんか?
>>175 ありがと。使ってみた。
ただ、wavやmpgがテキストとみなされることが多かったんで
仕方なく拡張子で判別するコードも加えることにしたよ。
>>173 印字できないバイトが入ってたらバイナリファイル、ってくらいでいいなら自分で作れるだろ。
つーかrubyでやることかよ
print "hoge\n"と書いたときに表示される改行を、あらかじめ便利な感じで 全部CR+LFにそろえることはできますか? $KCODE="s"としておくと全部表示がShift_JISになるような。 Rubyスクリプトと生成データをLinuxとWindowsで使いまわすもので…
>>193 回答になってないけど、ふつー print "hoge\n" でなくて puts "hoge" 。
195 :
デフォルトの名無しさん :04/04/11 04:30
>>194 WindowsでputsするとCR+LFになるの?
>>195 やってみほ。Windowsが周りに無いの?
なんかInteger/Integerの話題、mathnとかquoとかの存在が無視されてない?
Integer/Integer=Rationalって、ブロックじゃ駄目なんかねぇ。 precision do 《Rationalになる演算》 end みたいな。面倒か。
>>195 Windwos版Ruby(mingw32、mswin32、bccwin32、djgpp)では出力される改行は全てCR+LF。
UNIXのようなもの版Rubyでは出力される改行は全てLF。
Cygwin版Rubyでは出力される改行は全てLF。
Rubyに限らず3番目でハマる人が時々います。
cygwin向けにコンパイルされたプログラムをcygwin外でも使おうとする人ね。
>>193 つーことで多分できません。生成されたデータファイルの改行を適宜再加工してください。
結局selector namespaceを入れましょうっていう話になるのかな
>>200 Cygwin って、text mode で mount してる時も LF になるんだっけ?
>>202 うーん、mount -tで明示的にマウントされた場合は
改行がファイルに書き込まれた時にCR+LFに変換されるっぽい。
マウントポイントごとに設定しわけることはできるけど…めんどいね。
Cygwin環境用にコンパイルされたプログラムをCygwinシステム外の
普通のWindowsプログラムとしてこっそり使うときはどういう処理になるんだろう。
よくわかめ。
いい加減意地を張るのをやめてPythonに統一しようよ。 リソースの分散はあまりにももったいない。 Pythonに対する明確なアドバンテージを示せないなら今すぐ開発をやめるべきだと思うがいかがかな?
文字列の長さを得るメソッドが str.len になったら考えてもいいよ
>>204 Pythonに対する明確なアドバンテ−ジは、わしが使ってること。
>>204 統一厨が宗教戦争を仕掛けるスレはここでつか?
ずいぶん釣られてるなぁ。
\ ∩─ー、 ==== \/ ● 、_ `ヽ ====== / \( ● ● |つ | X_入__ノ ミ こんな餌で俺がクマーーーーー!! 、 (_/ ノ /⌒l /\___ノ゙_/ / ===== 〈 __ノ ==== \ \_ \ \___) \ ====== (´⌒ \ ___ \__ (´⌒;;(´⌒;; \___)___)(´;;⌒ (´⌒;; (´⌒; (´⌒;;
いずれParrotが完成すれば、Perl,Python.Rubyのそれぞれの資産をそれぞれの言語で使えるようになるだろうから、 今更別の言語に移る価値はないだろ。
本当に完成するのかな(ワラ
現実問題としてC#とVB Scriptでプログラミング領域の98.774%はカバーできるから Rubyはいらないんだけどな。
>>212 うちの会社は UNIX 上のサーバサイドアプリしか作らないので
.NET に縁がありません。
まー世の中には「ハック価値」という物がある訳で。 でなきゃIntercalなんて生まれてない。
>193 $/ を使うのはどうですか。
>>148 自分は147ではないけれど、
リンク先を読んでも、言わんとするところがよく分からなかったっす。
よかったらもうちょい解説お願いします。
# 「もしそれがアヒルのように歩き、アヒルのように鳴くなら、それはアヒルに違いない。」??
英語が読めるならまずググるくらいのことはしたら?
>>217 自分は
>>147 ですけれど、
「もしそれが String と同じメソッドを持ち、String のようにふるまうなら、
それは String の duck type に違いない」
と読みました。
彼はいまだにテストを書いていないのかな? テストを書かずにリファクタリングってどうやってるんだろうか?
Dir.globの人の事じゃない?
>>222 ああ、そっちの人か。
誰か勝手に CVS にテストを突っ込んどいたら。
224 :
RPI ◆3x0ES2jpL2 :04/04/13 18:29
RPIC のお知らせ。 Ruby Professional Institute は、Ruby の専門家それぞれのレベルを測るために、 各国共通の基準となる認定制度 RPIC を創設しました。 # RPIC は「アルピック」と発音します。 Ruby の専門家の雇用主や契約先といった団体組織や専門家自身のニーズを満たす 技術者資格を目指しています。 資格は、Level 1 (初級)、Level 2 (中級)、Level 3 (上級) の3つに 分かれています。 Level 1 101 試験 Ruby 基本文法 102 試験 標準ライブラリ Level 2 201 試験 オブジェクト設計 202 試験 ライブラリ Level 3 作成中。 試験は、ピアソンVUE、アール・プロメトリックで受けられます。
>>224 学生の漏れには、15000 円は高すぎる。
学割とかないのか?
>>226 学割あるよ。
Level 1 取った。
認定カードがピンクだぞ。
なんでピンクなんだ?
Level 1 ピンク Level 2 橙色 Level 3 赤
101 試験落ちた。 引っ掛け問題多すぎ。 15000円がパー。 RPIC 対策本は、翔泳社の赤本しかないのでつか?
101 試験の範囲 1. 組み込み型 2. 式 3. メソッド 4. 正規表現 5. クラス、モジュール 6. 基本入出力 7. 例外 8. スレッド、プロセス 9. デバッガ
Ruby暦2年だが、
>>224 これとろうかな。
まだ学生なんで、就職時使おうと思っています。
>>229 マジでか?
101 は Ruby を普通に使っていたら絶対受かるぞ。
漏れも 101 落ちた。 もうだめぽ。
>>231 アホか。
国家資格にしろ。
学生なら情報処理技術者試験の方を受けた方がはるかに良い。
プログラミング言語の試験だったら
Sun Certified Programmer for the JAVA
にしておけ。
Ruby に将来なんてない。
一応旧通産天下り団体主催だよ。
Rubyをメイン言語としたWEBアプリ開発会社を作りたいんだけど、 貯金が数万しかありません。どうしたらいいんでしょうか。
>>236 確か1円でも起業できるんじゃなかったっけ?
>>234 うちの会社では、Ruby でプロトタイプを作る。
最後に Java で作る。
移植しやすいように Ruby で Java スタイル。
attr_reader/writer ではなく、セッターゲッターを使う。
ヘビ式でなく、ラクダ式の命名規則に従う。
>>239 _ で繋げる命名法じゃない?
bar_obj.foo_method() みたいな。
レベル1受かりました。 101 は 620 点、102 は 640 点でした。 普通に Ruby を使っていて、翔泳社の対策本をやれば受かります。 102 の Complex クラスとか、普段使わないので 対策本は必要です。
だまれ業者。
☆チン マチクタヒ゛レタ〜 マチクタヒ゛レタ〜 ☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < レベル2合格記まだ? \_/⊂ ⊂_) \________ / ̄ ̄ ̄ ̄ ̄ ̄/| | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 三ヶ日みかん |/
こいつ AA に慣れていないのがバレバレ。 でも面白い。 めげずに、もっとふざけてみ。
こんなオリジナリチィーもなにもないAAの使い方のどこがおもろいのやら。
スレの流れが不自然過ぎる…。 いかにも2ちゃん初心者が宣伝しにきたって感じがします。 まぁどうでもいいけど。
249 :
デフォルトの名無しさん :04/04/14 09:02
趣味レベルでウェブを運営してるのですが、その場合、Rubyを勉強する利点はありますか? それとも無難にPerlにしておく方がいいですか?
あなたがPerlをすでに習得しているとして。 (利点) ・あなたのプログラム感が広がる ・あなたのプログラミング技術が広がる ・あなたの選択肢がひとつ増える(このときにはRubyを使おう) ・あなたの宣伝文句がひとつ増える(Rubyも使えます) ・Perlに比べるとライブラリが少ないので、自作する機会が増える ・rubyを使える人とのコミュニケーションの機会が増える (欠点) ・新しい言語を覚えるための時間的、経済的コスト ・Perlに比べるとライブラリが少ないので、自作する機会が増える ・「まだPerlを使ってるの?」と言ってもらえる機会が減る ・Perlで悪戦苦闘する機会が減る くらいかな。
>>250 分かり易い回答ありがとうございます。
時間があればやってみてもいいって感じで受け止めました。
252 :
デフォルトの名無しさん :04/04/14 11:55
利点 変数に$をつけなくて良い 文末に;をつけなくて良い良い 欠点 他の言語で書いたときに付け忘れるようになる
>>253 サンクス。
プログラムを書くのが楽しいっていう触れ込みですよね。
余分な文字を書かなくてもいいっていうのもその一環なんでしょうね。
>>249 いまさら Perl なんてやる必要ないと思うけど。
せめてPHPにしたら?
>>255 そうなんですか?
でもCGIを考えるとPerlが主流ですよね?
>>256 もうCGIそのものが主流じゃないと思われ。
それに、あなたは自分の趣味としてウェブを運営しているのではなかったのですか?
趣味ならば、世の中の多勢に従う必要はありません。
まあ、ruby も十分多勢になりつつありますが。
漏れなら、どれか一個でとりあえずはじめてみる。 そのうちある程度スキルが上がったころになれば、 嫌でもその言語のダメなところや各言語毎の利点欠点がわかってくるので、 そうなったら一番自分にしっくりきそうな言語に乗り換える。 そのときには、それまでに書き貯めたコードは無駄になるかもしれないが、 それまでに身に付けた知識は無駄にならない。
>>257 CGIはもうすたれてるのですか?
何故、Perlにしようと思ったかというと、Perlは過去の遺産が多いからです。
だから、自分の作ろうと思うCGIに似たCGIを容易に探せますよね。
後は自分用にカスタマイズすればいい訳ですから。
>>258 自分的にはrubyをしてみたいのですが、すぐに恩恵を受けられる実益(遺産が多いということ)を
考えると、Perlかなと思ったわけです。
PHPも結構、流行ってるみたいなので(あるサイトにはPHPの出現でPerlを学ぶ利点がなくなった
と書いてあった)結構、悩みます。
以後249は放置の方向で。
>>259 いやあ、もうそこまで考えてるなら、あとは自分で決めるだけっしょ。
決めることは、自分で出来るよね?
>>261 レスどうもです。
最初はPerlをやろうと思います。
その後、情勢を見極めて次の言語を決めたいと思います。
どうもありがとうございました。
263 :
デフォルトの名無しさん :04/04/14 15:18
ruby1.6で、 ・成功するまで3回試行する ・3回試行してダメならあきらめる の時、 result = nil RETRY = 3 i = 0 begin while ( i < RETRY && ! result ) i += 1 puts "Try: " + i.to_s result = do_something() rescue retry end puts "end." と、ruby-lang.orgのrubyリファレンスマニュアルにある"while 修飾子"に 従って書いたつもりなんですが、rescueの行とputs "end."の行でparse error で叱られます。 自分にはなぜparse errorになるのかがわからないのです。 どうすればうまく行くのでしょうか?
while修飾子になってねーし。
自己解決。 begin while ( i < RETRY && ! result ) i += 1 puts "Try: " + i.to_s result = do_something() end rescue ... なのね。 まだ文法が壊滅的だ...
>>65 古い話でスマンが
> 「Perlだと$&が遅いという常識」はデマだと分かりました
$1を使っても遅い。
>>263 「成功する」ってのはdo_smoethingがnil/false以外を返すってことなのか?
retryを使ってるあたりは例外が発生しなけりゃ、とも取れるんだが。
>>265 だと、例外のときは試行せずに終るだろうし。
「成功」の定義と例外の扱いをどう考えてるのがよくわからん。
>>266 ていうか、「$&を使うと他のマッチが巻き添えで遅くなる」なので65のベンチじゃわからんよ。
プログラムのある部分に出現した$&が「どのマッチの$&なのか?」を静的に決定するのが
カナーリ難しいので、プログラム中に$&が出てきたら全てのマッチについてとりあえず$&を
毎回保存しとくモードにしといて参照されたときに最新のを返すって実装にしちゃったから。
パターンマッチが1つしかなければ$&を使うのもカッコでくくって$1で取り出すのも同程度。
>>268 こゆことかな?
% time perl -e '$&;for(1..1000000){//}'
perl -e '$&;for(1..1000000){//}' 1.11s user 0.00s system 99% cpu 1.110 total
% time perl -e '$1;for(1..1000000){//}'
perl -e '$1;for(1..1000000){//}' 0.76s user 0.02s system 100% cpu 0.768 total
デマじゃなさそう。
ライブラリのファイル名を、 "foo-bar.rb" か "foo_bar.rb" のどちらにするかの基準ってありますか?
>>270 "foo/bar.rb"
e.g. net/ftp.rb digest/mdg.so
>>271 そういう意味ではなくて、ファイル名が 2語以上で構成されている場合のはなしです。
標準添付のライブラリを見てみたら、結構いい加減ですね。
irb/input-method.rb
rdoc/generators/html_generator.rb
soap/netHttpClient.rb
好きにしる、ってことでしょうか。
>>272 クラス名を downcase しただけが基本。getoptlong とか prettyprint のように。
274 :
デフォルトの名無しさん :04/04/14 19:16
$?って、真偽値じゃなくて数値でしたっけ? msg = `command -opt args` result = $? でresultにtrue/falseが格納されてることを期待しちゃダメ?
>>274 $?はProcess::Statusオブジェクト。
最新リファレンスマニュアルのオフライン版ってないですか? 最新がなければ、例えば ruby 1.8.0 版のリファレンスマニュアルとか。
いろいろ試してて気づいた。これってまずいんじゃないの? x = 1 x.taint x.tainted? # => false
>>278 1.taint.tainted? # => false
1.0.taint.tainted? # => true
(10**100).taint.tainted? # => true
Fixnum だけか。まあ、「Fixnum は汚染さないという仕様だ」と主張されれば、
納得できるけど。
# その場合は Fixnum#taint は undef して欲しいが。
それよりも
"1".taint.to_f.tainted? # => false
の方が気持ち悪い。
ちなみに ruby 1.8.1 (2003-12-25) [i386-cygwin]。
以降で変更されてるのならスマソ
C++ から Ruby 使うにはどしたらいいの? C++ から スクリプトとデータを char の配列で渡して、結果を自作の Tree クラスで返してもらいたいんですが、 その辺について解説したホームページとかあったら教えてもらえないでしょうか? ちなみに C++ Builder 使ってるんですけど、Visual C++ でも全然問題ないです。
>>279 いろいろ突っ込みたいところはあるけど、とりあえず一箇所だけ。
> Fixnum は汚染さないという仕様だ
揚げ足を取りたいわけじゃないんだけど、脳内補完がうまくいきませんでした。
どういう意味っすか? もう一度書き直してもらえるとありがたい。
>>281 え〜っと C++ / C の違いについて知りたいわけではなくて、
C から Ruby(の変数) にどうアクセスしたらいいか知りたいです。
どっかにそういうドキュメントがあったような気がしてるんですが、
思い出せないので;;
284 :
デフォルトの名無しさん :04/04/16 00:24
>>283 README.EXT.jaの事でしょうか。
>>282 スマソ。「汚染さない」→「汚染されない」
現在のRubyの仕様は
・任意のオブジェクトは Object#taint で汚染することができる。
だと、オレは理解している。
でも実際に試してみると、Fixnum, Symbol, {Nil,True,False}Class は
:foo.taint.tainted? # => false
などとなる。
これは上に書いた仕様と違うのでマズイ。これの解決策は二つある。
(a) Fixnumなども、ちゃんと汚染できるようにする
(b) 「Fixnumなど、一部のオブジェクトは汚染できない」という仕様に変更する
普通に考えると(a)なんだけど、このケースでは(b)を選択しても、特に問題は
起きないような気がする。それだったらエラい人の好きな方に決めてもらって
いいよ……というのが
>>279 の前半で書きたかった事。
でも再考してみると、Bignum と Fixnum の関係だとか、よく分かんなく
なってきたので、その主張は保留。
後半の話は、オレが Ruby の汚染モデル(というか、汚染状態の伝搬モデル)を
勘違いしてそうな気もする。「foo.tainted? == true の時、foo を元にして
作ったオブジェクトは全て自動的に汚染される」という理解は合ってる?
リファレンス「セキュリティモデル」
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%A5%BB%A5%AD%A5%E5%A5%EA%A5%C6%A5%A3%A5%E2%A5%C7%A5%EB
>>286 immutable なオブジェクトは汚染され得ない、ってことじゃないの?
>>289 ごめん。「immutable なオブジェクト」ってのがよく分かってない。
Fixnum は immutable だけど、Bignum は immutable でない?
実装上の理由(VALUE にポインタじゃなくて即値が入ってる)から
taint のフラグが保持できないんだろうな、と想像はつくけど、
実装と immutable とは別の話だと思う。
>>284 >>287 >>288 「え〜、それって拡張ライブラリ作る時に読むやつちゃうん?」と思いましたが、
よく読むと、アプリケーションから ruby の機能を使うのも同じインターフェースなんですね^^;
1.8.x だとコンパイルエラーになっちゃってだめだったんですけど、
1.6.8 だとちゃんと動きました。
これでやりたいことが実現できそう。これから研究してみるっす。
ありがとう!
あ、HTML Help 版も 1.8.1 対応ですね。失礼。 そちらを使わせていただくことにしました。
Fixnum(とかSymbolとかtrueとかfalseとかnil)で汚染が伝播しないことが困るのってどういう時? たしかに現在の実装は美的完全性を損ねているが、実用上は問題ないのと違うか
>>286 どうもです。
> 「foo.tainted? == true の時、foo を元にして作ったオブジェクトは全て自動的に汚染される」
自分もそういう理解でいます。
>>294 自分も最初はそう思っていました。
しかし例えば正の数を仮定しているところで負の数を指定されると困るとか、考えようと思えばいくらでも考えられると思うんです。
抽象的なのを承知で書くとすれば、「オブジェクトの意味を決定するのはスクリプト次第」ではないでしょうか。
だとすれば、どんなオブジェクトでも汚染が伝播しないとおかしいと思います。
>>295 294が「実用上は問題ない」と言ってるのにそれに対する反論として「抽象的なのを
承知で書」いても弱いんじゃないかな?
おそらく294も「どんなオブジェクトでも汚染が伝播しないとおかしい」とは思っている
のだろうが、理想と実装のトレードオフを考えた結果、現状の実装で実用上は問題
ないだろう、と述べているのだろうし。
>>294 で挙げられてるオブジェクトはsingleton/multitonなので、一ヶ所で
汚染されたからって他のまったく関係ないところまで影響されちゃうのはまず
いんよ。
このモデル自体が問題だというかも知れないけれど、しかし、1+1の2と5-3の2、
あっちのtrueとこっちのtrueを区別したいかといわれると、俺なら区別したく
ない。
結局286がリンクをだしてた「セキュリティモデル」にそのあたりのことが 全く触れられてないので読む方は混乱するわけで。 最初の「オブジェクトの汚染」のところに一言注釈なりありゃいいだけの ことのような気がする。
class X def initialize(a,b,c) end end p X.method(:new).arity p X.method(:initialize).arity p X.new(1,2,3).class.method(:new).arity p X.new(1,2,3).class.method(:initialize).arity //////////////////////////////////////////////// -1 -1 -1 -1 コンストラクタの引数の数を数えるにはどうすればよいですか
X.instance_method(:initialize).arity X.new(1,2,3).method(:initialize).arity その initialize はクラスX のインスタンスメソッド。 クラスX はクラスクラスのインスタンス。 new は クラスクラスのインスタンスメソッド。
つーかそろそろFixnumを無くすべきなんじゃないかと。 Fixnumが即値である限り絶対に汚染に対応できないわけで。 汚染されているべき危険な値でも素通りでシステムコールに渡せるってのは正直どうかと。 Symbolやnilといったオブジェクトはともかく、頻繁に使うであろうFixnumはヤバイよ。 この辺matzはどう思ってるんだろう?「仕様です」だけ?
>>301 つーよりも、外部からどうやって Fixnum を取り入れて、そんな危険なことをしたがるのかが分からん。
実際にやって見せてよ。
>>301 ・「Symbol や nil がオッケーだけど、Fixnum が特にヤバい」という
シチュエーションがよく分からない。
・Fixnum などが汚染できないことに関して、公式なコメントは出てないと思う。
(調べ足りないだけかもしれないので情報キボンヌ)
・即値でも、汚染用に1ビット割り当てれば対応できそう。
バイナリ互換はなくなるが(・∀・)キニシナイ!!
「汚染された1」と「汚染されてない1」という2つの singleton オブジェクトが
存在するイメージ。
つーかただのバグ
>>298 に同意。
Fixnum を汚染したりされたりするときに warning 出ればよいんじゃないのかな。
$SAFE によっては SecurityError になるのもよいかと。
全ての値について汚染が伝播するならば、$SAFE=1で危険な操作が 汚染エラーにならなければ、少なくとも危険な値をuntaintせずに渡して はいないということが保証される。untaint操作の場所は特定しやすいし きれいに書けば妥当なチェックをしてからuntaintしていることを確認する こともたやすい。即値をはさむとそれが言えなくなるので、同じことを 保証するにはプログラムを追いかけるしかなくなるだろう。 もっともエラーがでたら出た場所にその都度.untaintを足していく 香具師には全く関係ないことだがな(笑)
cgi = CGI.new value = cgi["value"].to_i とか、普通にしてそうだが。 ああ、だがFixnumが特にヤバイ、ってことはないか。to_symとかやるしな。 1bit割り当てるってのは思いつかなかったな。これは漏れの考えが浅かった。
VALUEをキャストしてそのままポインタとして使えるってところがrubyの速度とか拡張ライブラリの作りやすさとかに非常に影響を与えてると思うのだが。 1bit割り当てるってことは毎回ビットシフトしなきゃいけないってことだろ?
ビットシフトなんてのは動的型を採用している時点で必ず 何回も発生するので今更その回数を気にしてもあまり意味がない。 まあ減るにこしたことないが、せこいチューンと同じ。 それよりは実行コード断片化によるキャッシュミスヒット・ ページフォルトの方が深刻なんでね。
いや、VALUEに1bit割り当てるという話は即値(Fixnum, Symbol, nil...)のみの話。 ビットシフトはFixnum, Symbolは値を得る為に既にしている。 問題があるとすれば、Fixnumが30bitになってBignumに変化しやすくなるくらいなもんだろう。
そういえばbignumは汚染されるので、数字がでかいときだけ汚染により 操作が禁止されてうまく動かないバグを仕込みそうだな。fixnumが 汚染されないという仕様なら他の数も汚染されない方がいいような 気がする。
>>253 >他の言語で書いたときに付け忘れるようになる
俺もそれある。最近、CやJavaで ; のつけ忘れが多い。
C言語しか知らなかったときはこのミスはほとんどしなかったのに
operator () がホスィ… o = Object.new def o.()(s) puts s end o("OK") #-> OK
>>312 慣れの問題かと。漏れも以前はそうだったけど、最近は無くなった。
むしろ、コードをパッと見たとき、 ; や変数名の $ の有無で、
今どの言語を見てるかのスイッチが切り替わるようになってきた。
>>313 def o(s); puts s; end とどう違うの?
>>315 その「我慢」をしたくない、って意味でね
operator() があれば
・[]のもつ意味を単純化できる。つまりプログラムを読みやすくする。
・ProcやMethodの呼び出しを自然に出来る。
self.o を呼ぼうとして o#() になる悪寒。
racc 使ってる人いますか? racc で作られたパーサってエラーが発生すると、エラーの原因となった文字列を 表示してくれますが、その文字列のある行番号は表示してくれません。 スキャナいじったり、文法ファイルを修正してみましたがなかなか思う結果が得られません。 だれか解決策知りませんか?
319 :
デフォルトの名無しさん :04/04/18 00:22
self.age
>>318 パーサには行番号の情報がないので出せない。
自分でパーサの on_error メソッドをオーバーライド
して出すしかないね。現在読み込み中の行番号は
だいたいトークンかスキャナのどっちかから得られるはず。
>>320 速攻レス、感謝。
自前で処理する方法を、もうちょっと検討してみます。
昔それやったなぁ。 StringScanner 使ってたから pos しかわからんもんでさ、 on_error でもう一度スキャナ回して pos までの改行数えたよ。
% ruby -v ruby 1.8.1 (2003-12-25) [i386-cygwin] % ruby -e '"0" > 0' -e:1:in `>': comparison of String with 0 failed (ArgumentError) from -e:1 % ruby -e '0 > "0"' -e:1:in `>': comparison of Fixnum with String failed (ArgumentError) from -e:1 メッセージを統一しる!ヽ(`Д´)ノ
>323 ん? 統一したら、まずいんじゃない?
まずいかな?
>326 まずいっしょ。
Float だとどっちも Float って出る。 Fixnum にそろえるとどこがまずいかな?
>>323 「統一」って、前者を「String with Fixnum」にしる、ってことか?
それならなんとなく納得。
前者で Fixnum じゃなくて 0 って出るのがイヤって話なのでは。 % ruby -e '"0" > 1000000000' -e:1:in `>': comparison of String with 1000000000 failed (ArgumentError) from -e:1 % ruby -e '"0" > 10000000000' -e:1:in `>': comparison of String with Bignum failed (ArgumentError) from -e:1
なるほろ
あーまぎらわしくてスマソ。0 を Fixnum にしるってことね。 もういっちょ。 % cat ~/hoge.rb def foo(args) args.min end foo(["0", 0]) % ruby ~/hoge.rb /home/ore/hoge.rb:4:in `min': comparison of Fixnum with String failed (ArgumentError) from /home/ore/hoge.rb:2:in `each' from /home/ore/hoge.rb:2:in `min' from /home/ore/hoge.rb:2:in `foo' from /home/ore/hoge.rb:4 4行目に min なんてないよヽ(`Д´)ノ
matzさんの家って、PC が何台もごろごろしているものなの? それともハードには余り興味が無くて、言語にしか興味がないとか、、、
>333 あなたの、他人に対する興味の持ち方に 興味がある。
>>333 実際のところは知らんけど、MLなどでのやり取りを見てる範囲では、
ご自身の環境(ノートPCにdebianだったか)以外についてのrubyの動作の検証とかは、
(自分で環境を用意してするのは)かなり億劫のようなので、PCがゴロゴロというのは創造できないです。
まあ、会社とかでいろんな環境に触れる機会はあると思うのですが。
「言語にしか興味ない」というのは当たってると思います。
まったく他人の私が思うには。
337 :
デフォルトの名無しさん :04/04/18 23:12
>>337 ぐおぉ…すげえなそれ。ATOKが欲しくなってきたよ。
すごいとは思うが、便利な使い方が思いつかない。 誰か教えてくれ。
クリップボードの内容をワンライナーや作り置きのスクリプトで ざっくり加工できるっぽいところが便利そう。 たとえばエディタとしては貧弱なブラウザのフォーム内で、 置換処理ができるようになるわけだし。 ランチャーとしても十分便利そうだけどね。 HTTPで天気予報を引っ張ってくるスクリプトを書いておいて、 「てんき」でその場に出力されるってのとか。 メモしたい内容をクリップボードに放り込んでから「めも」で、 メモツールに記録されるとか。
なんかrubyって車輪の再発明つか、 既存のもののrubyへの置き換えが多いような気がするのは気のせい? 資産が少ないので作らなならんというのは分かるけど。 穿った見方をすると、rubyの美しいコードになんでも 書き換えようとする言語ヲタのナルチシズムに見える気もする。
ライブラリの充実が必要だけど、 移植で済むなら一から設計することもないってことかと。
>>341 「何が出来るのか」の確認と、
「何が出来ないのか(何が必要か)」の
洗い出しになってイイんじゃないかな。
たぶん、341 は覚えたばかりの「車輪の再発明」って言葉を 使ってみたかっただけなのではないかと。
Microsoft Visual C++ Toolkit 2003 でrubyをコンパイルしたいのだけど どうすりゃいいんかい。 lib と dumpbinがないみたい?でも、win64/にはある???よーわからん。
まあ、いろんな人が言語を使うので。 「perlじゃコレがあるのに、なぜrubyでは無いのか」という人も多いし。 あとそれと、同じようなものが必要になったときには、 既にあるものの仕様を参考にすることが多いので、 そういう意味では再発明とも言えるかな。
>>347 Core SDK とdebug SDKは入れたんですけど lib.exe と dumpbin.exe
は入ってきませんでした。
ほかの SDK もいるのかなぁーと。
Internet Development SDK
IIS SDK
MDAC SDK
Windows Installer SDK
WMI SDK
Tablet PC SDK
・・・関係ないよなぁぁぁ。
ところで、なんで「車輪の再発明」という言葉になったんだろう?
人類最古の発明の一つってことじゃないかな 電球の再発明じゃ新しすぎる感じ
電話の再発明
xmlparser-0.6.8 は make 通らないなあ (FreeBSD & BSD/OS) 。
あ、GCC 3 とかだとこれでも make 通るのかな。 GET_PARSER(recv, parser); VALUE content = makeContentArray(parser, model); を VALUE content; GET_PARSER(recv, parser); content = makeContentArray(parser, model); にしたら通った。
>>345 lib.exe/dumpbin.exe は .NET Framework SDK に入っている。(ランタイムじゃないぞ)
それから,byacc と sed が必要なので
ttp://gnuwin32.sourceforge.net/ からGET。
bisonを使いたければ同じく GET して YACC=bison -y を Makefile に追加。
ま、再発明でも便利なら万事OK。 多様性は保険だ。
port や(新規性の乏しい)派生はそもそも"発明"ですらないよ。
rubyというかアルゴリズム全般の話な気もしますけど質問させてください。 ポーカーで任意の枚数を捨てて、出来得る役を全部表示するのを考えてます。 トランプ1枚は1から52の通し番号で識別してます。 def koukan(ary,rej) if ary.size >= 5 puts ary.join(',') return end for i in 1..52 next if (ary + rej).include?(i) ary.push i koukan(ary,rej) ary.pop end end myAry = [1,2,3] # 残すカード myRej = [4,5] # 捨てるカード koukan(myAry,myRej) これで、一応動くんですけど、[1,2,3,6,7]と[1,2,3,7,6]みたいな 同種別配置を排除することができないかなと考えましたが、分かりません。 何かいい方法ないでしょうか。
>>358 Array じゃなくて Set (順番や重複の無い集合を扱うクラス) を使ってみるとか。
for i in 1..52 を for i in ary.last..52 にするのは?
レスありがとうございます。
>>359 Setクラスは初耳ですが、リファレンス見たところ、
この場合はこっちの方が速そうですね。
できた役をぶちこんでいけば勝手に重複は削除されると。で、
irb(main):016:0> set1 = Set.new [1,2]
=> #<Set: {1, 2}>
irb(main):017:0> set2 = Set.new [2,1]
=> #<Set: {1, 2}>
irb(main):018:0> sset1 = Set.new [set1,set2]
=> #<Set: {#<Set: {1, 2}>, #<Set: {1, 2}>}>
あれ?重複してるはずなのに削除されない?
なんか使い方間違ってますかね?
>>360 うーん、それだと、[1,2,3,5]で[6]捨てる場合とかで
4が無視されてしまうような…
あぁ、sset1 みたいな使い方もしたいのか。 すると、 Set#eql? と Set#hash を再定義してやらないとダメかも。 ちょっと漏れにはすぐには思い付かない。
>>353 gcc3.3はC99デフォルトだからな。
まぁ、バグだろう。作者にレポートするよろし。
>>361 考えてみた。イマイチだなぁ・・・
class CardSet < Set
def eql?(oth); self == oth; end
def hash; self.size; end
end
set1 = CardSet::new([1, 2])
set2 = CardSet::new([2, 1])
set3 = CardSet::new([2, 3])
sset1 = Set::new
sset1 << set1
sset1 << set2
sset1 << set3
p sset1
議論を巻き戻して悪いが、結局taintの件はどうなったのだろう。
ここ見てくれてた人のおかげで、現在のリファレンスは
>>298 氏の言うとおり
> * 実装の都合上、Fixnum・Symbol・true・false・nil は汚染されない。
> なお Bignum・Float は汚染されることは注意が必要。
と追加されているが(青木さんありがとう)、BignumとFloatを汚染する意味があるのか・ないのか、自分ははっきりと読み取れなかった。
もし「本来は汚染させるべき」ということなら、大量のOBJ_INFECT()忘れが発覚するわけだが。
>>365 続きは ML でやった方が良いのでは?
367 :
デフォルトの名無しさん :04/04/20 22:13
>>363 ほんとだ、知らなかった。
ていうか-std=c89とかしても通る。なんじゃこりゃ…
368 :
デフォルトの名無しさん :04/04/20 23:28
WindowsでRuby/DBI+SQLite使いたいのですが、 どっかにバイナリあるでしょうか?
__END__ 以下のデータってバイナリで読み取れないの? DATA.binmode data = DATA.read こうしたけど駄目でした。助けてドラエもん
>>369 DATA.binmode
DATA.seek(0, 0)
data = DATA.read
でどうよ?
msvcrt版だと、改行コードはstdioでバッファリングされた時点ですでに変換
されてたと思った。seekすりゃ一度バッファを捨てるはず。
マルチスレッドなスクリプトを書いているのですが「〜押したらスクリプトを終了」 みたいな処理をしたいのですがどうしたらいいでしょうか? $<、ARGF、から取得しようとするとそこでスクリプトが止まっちゃうので…
>>370 C:\>ruby -v
ruby 1.8.0 (2003-08-04) [i386-mswin32]
>>371 おおおお!さすがドラエもん。できました。
ただ、DATA.seek(0, 0) とすると__END__の前の部分(スクリプト部分)まで出てきてしまいました。
DATA.seek(DATA.tell, IO::SEEK_SET ) # ←の一行加えたら__END__以降のデータが取得できました。
DATA.binmode
data = DATA.read
ありがとうございました。
プログラム書いている時に、ちゃんと動くようになるまでは、 とりあえず最初の5行くら動かしながらテストするってのを よくやるので、 while gets break if $.>=5 ### # なんかの処理 print end なんてコードを書いて動くようになったら ### の行を削除 ってのをよくやります。 これと同じことを。 イテレータでやる場合、 c=0 vec = readlines vec.each do |i| break if (c+=1)>=5 # なんか処理 end と書くしかないでしょうか?いちいち変数cを宣言するのが めんどうなんですけど、なんかいいほうほうあったら 教えてちょんまげ。
>>374 each_with_index使ったらどう?
勉強不足でした。 正直スマンかった。
車輪の再発明するならせめて、既存のものよりマシなものでなければいけないわけで、 rubyはマシどころかものすごく使いやすいのでいいのではないかなと。
「車輪の再発明をするな」=「既存の良いものを積極的にパクれ」 という意味では、Ruby はそれを地で行って (そして成功して) いると思うのだが。
>>364 遅レスですいません。ありがとうございます。
$ ruby cardset.rb
#<Set: {#<CardSet: {1, 2}>, #<CardSet: {1, 2}>, #<CardSet: {2, 3}>}>
うーん、重複削除されませんね。
sset1をCardSetクラスにしてみてました
#<CardSet: {#<CardSet: {1, 2}>, #<CardSet: {1, 2}>, #<CardSet: {2, 3}>}>
やっぱり削除されません。
ちょっとクラス定義について勉強してみます。
あと、Cのアルゴリズム事典でビット演算使った、
テクニカルで爆速な組み合わせ生成が載ってたので
こいつをrubyで試してみようと思います。
>379で書いたビット演算のが意外にrubyで簡単に書き直せました。 枚数が31枚を超えるとfixnumからbignumの変換の関係でバグるみたいですが とりあえず、26枚で実行。rubyで書いても結構爆速で感動しました。 $ time ruby koukan_array.rb > /dev/null ←358のヤツ real 3m12.084s $ time ruby koukan_bit.rb > /dev/null ←ビット演算 real 0m6.705s
N = 26; K = 5 def first(n); (1 << n) - 1; end def nextset(x) smallest = x & -x; ripple = x + smallest new_smallest = ripple & -ripple ones = ((new_smallest / smallest) >> 1) - 1 ripple | ones end def printset(s) for i in 1..N printf(" %d", i) if ((s & 1) != 0) s >>= 1 end print "\n" end i = 1; x = first(K) while((x & ~first(N)) == 0) printf("%4d:", i); printset(x) x = nextset(x); i += 1 end
fixnumとbignumの変換が一定の条件でなされてないのか N>30で変な所で止まったり、5枚以上選択して止まらなくなったり。 fixnumを使わないでbignumのみ使うような 整数クラスって定義できないんでしょうか?
bigdecimalは多倍長の浮動小数点数なんで、 | & ^ << >> ~ みたいなビット演算をサポートしてませんでした。
>>375 ヽ(`Д´)ノウワァァァン
そんなのあったのかYO!!
mswin32版の1.8.1と1.6.8だと >381 を N=52 にしても、 正常に動いているみたいです。 どうやらcygwin版固有のバグみたいですた。
ruby 1.8.1 (2003-12-25) [i386-cygwin] で Nを大きくして
>>381 を動かしたら
確かにアヤシい動きするな。空行の有無で出力が違ったりするし……。
>>387 ですよね。再現条件が特定できんのですよ。
mswin32版の1.6.8も1.8.1も、 nCk (n=52,k=5) = 2598960 通りを吐き出して無事終了。 これで逝くとします。
>>387 > 空行の有無で出力が違ったりするし……。
そういうのはおおむねGC関連のバグ。
最新版だとどう?
391 :
デフォルトの名無しさん :04/04/24 01:37
いつになったらRubyの主要ライブラリからLGPL物がなくなりますか?
1.9じゃもうないはず。
>>392 まじっすか!!
regexやgcは置き換えできたのか
この辺がクリアされていれば組み込みが楽になりそうで嬉しい限り
>>393 regexはとっくの昔にOnigurumaになってる。
GCのどこにLGPLなコードがあるんだか、自分は知らないんだけれど。
LGPL ならべつに商用利用でもなんでもいいんじゃなかったっけ? 組み込みの障害になんかなるの?
>>395 単語が欠けすぎてて何言ってんだか分からない。
プロプライエタリなコードがLGPLなコードにダイナミックリンクをするのは、OK。
LGPLなコードをプロプライエタリなコードと混ぜて使うのは、(プロプライエタリ的には)NG。
プロプライエタリって何?
>>396 用語がいい加減で何言ってんだかわかんない。
「混ぜて」ってスタティックリンクのことを言いたいんだろうか・・・・
>>398 コードを混ぜるというのは、同一のソフトウェアの中に出身ライセンスの異なるコードを入れるということ。
同一のファイル内であろうが、異なるファイル同士をスタティックリンクさせようが、変わらない。
これくらいの日本語も読めないのか?
gc.cはたしかスクラッチだと思ったぞ。 まぁ組み込みのためには、まだまだ技術的な課題も残ってるんだが。
Rubyで、ネストしたループから脱出するにはどうしたらいいですか?
catch(:hoge) { loop { while true throw :hoge, some, value end } }
catch & throw
catch & release
catcher in the rye
407 :
デフォルトの名無しさん :04/04/26 03:34
age
____| ̄ ̄|____ ________ | |\ / |\ |____ ____|:::::| / , ─── /\| \::::::::::::::::| |:::::::::::::::::::::::\| / <:::::/ / /:::::/ ┏┓ ┏━━┓ | ̄ ̄ ̄  ̄ ̄ ̄|\ ̄ ./ \._/ /:::::/ ┏┓ ┏┛┗┓┃┏┓┃ |_________|:::::| < /\ /:::::/ ┃┃ ┗┓┏┛┃┗┛┃┏| ○ ○ |:::::|━━ \/:::::/ > / ̄ ̄ ̄ ̄ ̄ ̄|\.━┓┃┃ ┏┛┗┓┃┏┓┃┃| \──/ |:::::|  ̄  ̄/ / ___ |:::::| ┃┃┃ ┗┓┏┛┗┛┃┃┗| \/ |:::::|━| ̄ ̄ ̄ ̄ / /::::, '━| |:::::|━┛┗┛ ┃┃ ┃┃ |____ ____ |:::::| |_____/ <:::::/ / |:::::| ┏┓ ┗┛ ┗┛ \ \:::::::::::::/ /\l \:::| \ . / /\.| ┗┛ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||______/\ /:::::/ |_______________|\::::::::::::::::::::\/ \ ./:::::/ \:::::::::::| |\:::::::::::::\| ̄ ̄ ̄ ̄ / /:::::/  ̄ ̄| ┌────┐ |:::::| ̄ ̄ ̄ / /:::::/ | └────┘ |:::::| | ̄ ̄ ̄ ̄ ̄ /:::::/ |_________|:::::| |______/:::::/ \:::::::::::::::::::::::::::::::::::::::::\| \::::::::::::::::::::::::::::\/
何がやねん
412 :
デフォルトの名無しさん :04/04/26 15:09
Ruby/DBIについて質問です。 以下のプログラムで、プログラム実行中はtestdbが有効なのですが、 プログラムが終了するとtestdbのファイルサイズは0になってしまい、 その後読み込めません。何が原因でしょうか? また、 データを入れるのに ary=Array.new ary[0]=123,"abc" ary[1]=456,"def" while data = ary.shift #gonyogonyo end を使って一括して入れる方法はあるでしょうか?
require "dbi" def create_table(dbi) dbi.do(<<EOF) CREATE TABLE R ( r1 INT, r2 CHAR) EOF end def test(dbi) dbi.do(<<EOF, 123, "abc") INSERT INTO R VALUES (?, ?) EOF dbi.do(<<EOF, 456, "def") INSERT INTO R VALUES (?, ?) EOF end dbi = DBI.connect("dbi:SQLite:testdb", "test", "test") create_table(dbi) test(dbi) row = dbi.select_all(<<EOF) SELECT * FROM R EOF print row
>>412 commit してないからかな。
DBI:SQLite はアヤシイので、SQLite/Ruby を使うのがオススメです。
DBIダメポ? なんだか悲しいオススメ
>>415 はい、私も悲しいんですけど、
UNIX 板の Ruby スレの 325 で報告したような感じなのです。
>>416 普段はdbh['AutoCommit'] = trueにしておいて、transaction開始時に
falseにする、とかして逃げられないのかなーと思った。かなり姑息
だし試してもいませんが。
情報どうもです。 もう少し、DBI:SQLite試して見ます。 #ようやく環境整えたのに...
SQLite/Ruby使ってdbd_sqlite書き直せばいいのかな。
[ruby-list:39589] ってなんなんだろう?煽ってるのかなあ?
>>419 どうでしょうね。件の記事 ([ruby-talk:75057]) を読んだ感じだと、
そもそも DBI がクソだから直すのはしんどいよ、ってことのようなのですが。
# 誤読していたらすいません。
422 :
デフォルトの名無しさん :04/04/26 21:00
Ruby/DBIで正規表現は使えますか? 使えるとしたら、サンプルはあるでしょうか。
423 :
デフォルトの名無しさん :04/04/26 21:04
424 :
デフォルトの名無しさん :04/04/26 21:22
>423 >423
425 :
デフォルトの名無しさん :04/04/26 21:24
>>422 どういう意味?具体的に何がやりたいの?
427 :
デフォルトの名無しさん :04/04/26 21:37
>425 >423
>>426 SQLにはLIKE式があるようですが、
Rubyの正規表現をLIKE式の代わりに使えないかなー、と。
ぽかーん
>>428 結局 DBMS に渡すときに SQL になるんだが。
>>428 折角「SQL」で検索オペレーションが抽象化されてるんだから、
あんまり姑息なこと考えずに SQL でがんがれ。
432 :
デフォルトの名無しさん :04/04/27 02:00
CでARGVにあたるのって、gets()しかないのですか?
ARGFも便利なんでヨロシク
こんなことできないの? module M v = 0 def get() v end module_function :get end M::get NameError: undefined local variable or method `x' for M:Module
module M v = 0 define_method(:get) {v} module_function :get end p M.get
単に親切だって話でないの?
あのやりとりで癒される香具師はどこかがおかしい。 というか、あの引用でSubjectに関係ない質問を付け加えてるんだから 煽りだろう。 元のメールも相当の煽りだが。
Net::HTTP の get クラスメソッドで、サイトのデフォルトのページを取得したい場合、
どうすればいいでしょうか?
たとえば、
http://www.yahoo.co.jp/ にアクセスしたいとき、
Net::HTTP.get('www.yahoo.co.jp',[???])
[???]の部分に何を入れればいいんでしょうか?
よろしくお願いします。
"/"
>>403 遅れましたが、どうもありがとうございます。
raise - rescue とはべつに、throw - catch なんてのもあるんですね。
勉強になりました。
両者の違いはこれから調べてみます。
>>443 ・・・それは、気がつかなかったよ;-)
str="昔(2000年前)、あるところ(北海道)でうんこした。\nおわり\n" str.gsub!(/\(.+?\)/) {$&.tr!('\w', ' ')} print str で 昔、あるところでうんこした。 おわり となってしまうんですが、 昔( )、あるところ( )でうんこした。 おわり としたいのですが、どうすればいいのですか。 ruby 1.8.1 (2003-12-25) [i386-mswin32]
str="昔(2000年前)、あるところ(北海道)でうんこした。\nおわり\n" str.gsub!(/\(.+?\)/) {$&.tr!('\w', ' ')} print str で 昔、あるところでうんこした。 おわり となってしまうんですが、 昔( )、あるところ( )でうんこした。 おわり としたいのですが、どうすればいいのですか。 ruby 1.8.1 (2003-12-25) [i386-mswin32]
こんなんどうよ? p "昔(2000年前)、あるところ(北海道)でうんこした。\nおわり\n".gsub(/\((.*?)\)/m){|m| s = '(' m.length.times{s << ' '} s << ')' }
* tr! じゃなくて tr * ていうか tr で \w は使えない やり方はいろいろありそうだけど、とりあえずオレなら str.gsub!(/\(.+?\)/) { "(#{' '*($&.size-2)})" } かな。他の人のコードもみてみたい。
>449 あなたのコード方がよっぽどスマートだ・・。
目的に沿った動きになりました。感激です。
>>447 のstrがalphabetだと動くんで、アホーな頭が混乱してしまいます。
汚ない文章だと思考回路が働きにくい事に気付いた。
良かれと思ってやった事が裏目に出る事があります。 便所の落書き2chに相応しいなぁーと思ったのですが。 便所の水で顔洗って出直してきます。
454 :
デフォルトの名無しさん :04/04/30 08:07
>>449 size-2 ってのが気持ち悪いので、俺なら+?をくくって$1かな。
>>428 素直にSQLの正規表現マッチを使うべし
456 :
デフォルトの名無しさん :04/05/01 01:21
win32oleでエクセルの操作をしていんですが、 すでに開かれてるエクセルのブックにアクセスするには、どうすればいいでしょうか? つまり エクセルファイルとして存在してるブックを開いて、編集っていうののやり方はわかったのですが、 編集中のエクセルファイルを、rubyから操作する方法がわかりません。 どうすればいいでしょうか?
>rubyから VBS での書き方を調べれば自ずとわかるはず。
458 :
デフォルトの名無しさん :04/05/01 23:05
perlで @arr=(); while(<>){ push(@arr,$_);} print $#arr+1, ": end\n"; rubyで arr=[] while gets arr << $_ end puts "#{arr.size} : end" 10万行位のテキストデータを食わせると圧倒的に Perl君の方が速いんですが、改善できるですかねえ。
改善も何も parrot になれば同じだろ
ParrotってIOStreamやArray等基本データは各言語共通なんかな。 だとしたら全く同じコードが生成されるかもしれないが。
readlines使うだろ
>>458 うちでやったら、大差ない(rubyの方が微妙に速かった)けど環境キボンヌ
$ wc data
100000 100000 10588890 data
$ time ruby hoge.rb data
100000 : end
real: 0.69s(user: 0.51s, system: 0.18s)
$ ruby -v
ruby 1.8.1 (2003-12-25) [i386-cygwin]
$ time perl hoge.pl data
100000: end
real: 0.77s(user: 0.54s, system: 0.18s)
$ perl -v | grep "This is perl"
This is perl, v5.8.2 built for cygwin-thread-multi-64int
463 :
デフォルトの名無しさん :04/05/02 01:21
>>461 のいってることはもっともだな
それからmacがわるいのかも。
データサイズを増やして露骨にわかるようにした以下を動かした。
perl -e'foreach $i (0..1000000){ printf("%07d\n", $i); }' > data ;\
uname ;\
perl -v | head -2; time perl -e '$a=(); while(<>){push(@arr,$_); }' < data ;\
ruby -v; time ruby -e 'arr=[]; while gets; arr << $_; end;' < data ;\
echo "readlines" ; time ruby -e 'arr=readlines' < data
その結果orz
Darwin
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level
4.840u 0.730s 0:06.41 86.8% 0+0k 0+0io 0pf+0w
ruby 1.8.1 (2004-04-16) [powerpc-darwin]
22.590u 2.290s 0:47.20 52.7% 0+0k 0+0io 0pf+0w
readlines
13.100u 2.060s 0:30.78 49.2% 0+0k 0+0io 0pf+0w
464 :
デフォルトの名無しさん :04/05/02 06:37
Array#pushって、配列の最後まで毎回リンクたどるんかな。
つうかRubyのArrayはCレベルでも配列。リンクリストじゃないよ。
467 :
デフォルトの名無しさん :04/05/02 18:48
くすこ
配列だってリンクリストだ。 次要素へのアドレスが算出可能だから省略されているだけの話。
>>468 > 配列だってリンクリストだ。
勉強いちからやり直してね。
>>468 アドレスが決まった後のアクセスが同じってこと?
リンクではないようだが。
471 :
デフォルトの名無しさん :04/05/02 23:13
>>469 はて、rubyはぜろオリジンだったはずだが。
Array は C レベルでも配列なので、追加のときに毎度 realloc してるという 話を RHG で読んだ気がする。ある程度は先読みして確保してるかもしれない けど。だからそんな風に毎度毎度 Array に追加するコードは書かない方がい い。 Perl の実装がどうなのか知らないんだけど、そのあたりの差なんじゃないか と思われ。行数カウントなら IO#lineno を使うとかでしょうね。
とりあえず手元にあったRuby1.6.1のソース見たけど、 Arrayのサイズが不足している場合、 現在のサイズ/2 か、 ARY_DEFAULT_SIZE(16) のうち大きい分だけ 増やすようになってるよ。毎度reallocしているというのは嘘。
rubyはループそのものが遅かったりするかもな。
じゃあ駄目駄目じゃん
ちょっと Ruby/Gtk2 について質問をさせてください。 ruby-1.8.1, ruby-gtk2-0.9.1 の環境で GUI の勉強をしています。 API References と rbbr-0.6.0 を参考にして 文字列検索のために下のように TextIter#forward_search を使おうとしました。 text_buf.start_iter.forward_search("Hello", Gtk::TextIter::SEARCH_TEXT_ONLY) このとき `forward_search': GtkTextSearchFlags is not a GEnum (TypeError) というエラーが出てしまうのですが、これはどこに問題があるのでしょうか?
479 :
デフォルトの名無しさん :04/05/04 00:55
2ch にこそ モデレート が欲しい
481 :
デフォルトの名無しさん :04/05/04 01:50
(1)あいうえお。 かきくけこ。 (2)さしすせそ。 たちつてと。 ↓ (1)あいうえお。かきくけこ。 (2)さしすせそ。たちつてと。 という風に整形するプログラムなんですが filename = ARGV[0] file = open(filemname) while text = file.gets.do if /^(/ =~ text elsif /\s/ =~ text text.chomp! end これじゃどう考えてもダメだよね・・・ 手元の本は初心者向きじゃないからわかんねえ。
>>481 filename = ARGV[0]
file = open(filename)
txt = file.readlines
txt = txt.join("")
txt.gsub!( "\n","")
txt.gsub!( "(","\n")
puts txt
listitems = ARGF.read.sub(/.*?(?=^\()/m, '').split(/(?=^\()/) puts listitems.map {|item| item.map {|line| line.strip }.join('') }.join("\n")
stripで十分だった listitems = ARGF.read.strip.split(/(?=^\()/) puts listitems.map {|item| item.map {|line| line.strip }.join('') }.join("\n")
Apollo でユーザー定義のメッセージを受け取るにはどうすれば よいのでしょうか?タスクトレイを扱いたい(Win32API ごり押し^^;) と思ってみたものの、メッセージループがどこにあるのやら。 TForm なら WndProc をオーバーライドするらしいのだけども、 Phi.Form にそれっぽいのはないし。
>>481 手抜きだけど、
ARGF.read.gsub(/\n(?!\n)/m,'').display
じゃだめ?
488 :
デフォルトの名無しさん :04/05/06 06:46
>488 インスタンス変数にしたら、COM インターフェイスのラッパクラスとして 効果的に働かないと思います。 アクセッサとして定義しない理由は、メソッドとプロパティを区別したい という意図かと思います。
この文字化けはどうやれば解決できるでしょうか? $KCODE = 's' puts "予約" => 蘭? puts "予定" => 嵐? ruby 1.8.1 (2003-12-25) [i386-cygwin]
-Ks
ありがとうございました。
>478 試してみたけどエラーは出なかった。 エラーの出る例全体希望。 # エラーにならなかった例: require 'gtk2' text_buf = Gtk::TextBuffer.new p text_buf.start_iter.forward_search("Hello", Gtk::TextIter::SEARCH_TEXT_ONLY) text_buf.text = "Hello" p text_buf.start_iter.forward_search("Hello", Gtk::TextIter::SEARCH_TEXT_ONLY)
494 :
デフォルトの名無しさん :04/05/07 06:35
x = ARGV[0].to_i y = ARGV[1].to_i z = x + y p z これのフローチャートなんですが、 コマンドラインから数値を入力 ↓ 数値を変数に代入 ↓ 画面に出力 という書き方でいいのですか?
>494 どこまで細かく書くかによるのだろうけど。 第1引数を整数に変換したものを変数 x で指し示す ↓ 第2引数を整数に変換したものを変数 y で指し示す ↓ x と y の和を変数 z で指し示す ↓ z を出力する こんな感じ?
「フローチャート」という言葉に脊髄反射しただけと見た。 自分はフローチャートは絶対書かないが、前任者が残しておいてくれると 助かることもある(フローチャートがなければ理解できない、スパゲティ ソースコード書かれた場合の話だけど) フローチャート書いてるヒマがあったら、わかりやすいコード書くほうに 時間かけろと言いたい。
他人に見せるためのフローチャートなんて最近は書かないよなぁ。
思考の手助けのために自分用としてなら、まれに書くことはあるけど。
で、個人的には「他人に見せるためのフローチャート」は
プログラムソースの読解の手助けになれば十分だと思ってるから、
>>494 程度の書き方で十分だと思われ。
入力ってところに違和感は感じるけどね。コマンドラインはそのプログラム
ではないから、入力するってよりはプログラム自身が引っ張り出してくる
イメージがある。
>>495 みたくね。
それと、足し算は省略しちゃダメ。
それはこのプログラムの本質であり目的でしょう?
冗長な部分は省く。大切なところはきちんと残す。
文章を要約するみたいなもんさ。
プログラム全く初めての人にいきなりプログラミング言語教えて みたいなシチュエーションだとたとえばwhile構文とはなにかを 示すのに流れ図あったほうが教えやすそうってのはもはや 考えが古いのかな。iteratorとかあるしなぁ...
501 :
デフォルトの名無しさん :04/05/07 15:52
class OuterHoge def initialize(str); @msg = str; end def sayHello; puts "hello, #{str}"; end def createInner; InnerHoge.new; end class InnerHoge def method OuterHogeの sayHelloを呼ぶ end end end obj1 = OuterHoge.new("obj1").createInner() obj2 = OuterHoge.new("obj2").createInner() というコードで以下のようにしたいのですが、 obj1.method #==> hello, obj1 obj2.method #==> hello, obj2 こんなクラスがあるときjavaだとstaticでない内部クラスなら OuterHoge.this.sayHello で自分が関連付けられている外側のクラスのインスタンスメソッドにアクセスできますよね? rubyだとどうするんですか? InnerHogeをnewするときにselfを明示的に渡してやらないと駄目?
>>493 レスありがとうございます。
そのコードを試してみたのですが、手元ではエラーになってしまいます。
こちらの環境の問題でしょうか?
>>501 ruby では、ネストの外側のクラスは名前空間くらいの意味しかないよ。
javaは全く詳しくないんでカンが働かないんだけど、
javaでそんな感じのコードを書いて実現したい事ってのは、
Ruby では(ネストしたクラスじゃなくて)もっと別のやり方で実現するのが
普通なんじゃないかな。
「自分が関連付けられている外側のクラスのインスタンスメソッドにアクセス」じゃなくて
「自分が生成されたコンテキストで評価(実行)」でよければ↓みたいにやる手はあるけど。
class OuterHoge
def initialize(str); @msg = str; end
def sayHello; puts "hello, #{@msg}"; end # <== @msg だよね
def createInner; InnerHoge.new{}; end # <== block付けた
class InnerHoge
def initialize(&block); @binding = block.binding; end # <== 追加
def method
eval("sayHello", @binding) # <== blockが生成されたコンテキストで評価
end
end
end
OuterHoge.new("obj1").createInner().method #==> hello, obj1
OuterHoge.new("obj2").createInner().method #==> hello, obj2
>>501 OuterHoge.this ってなに?
>>505 Javaで、内部クラスのインスタンスから外部クラスのインスタンスを参照する書き方
クラス名指定して、インスタンスをどうやって区別すんの? それとも obj1.OuterHoge.this ってこと?
RAA の XML-RPC の I/F って無くなっちゃった?
>>507 全然違う。わからんのなら自分で調べろよ、低脳。
じゃあいいや。
「クラスの中のクラス」という構文は似てるけど、Java と Ruby では
全然別物って結論みたいだよ
>>501
>InnerHogeをnewするときにselfを明示的に渡してやらないと駄目? それが正解。OuterHogeとInnerHogeでは、両者のクラスは外・内の関係があるけど 両者のインスタンスはまったく関係がない。
>両者のクラスは外・内の関係があるけど Class としてじゃなくて、Class の親クラスである Module として、だね。
Ruby の内部クラスは、 Java の static 内部クラスと同じ?
浅墓
深墓
深揺籃
一人でスレッド伸ばしてることに疑問を感じないのかなあ。>ruby-dev
ruby -0777 -n -e 'p $_' foo とやったら foo の中身が表示されるのを期待したのですが、 なぜか空文字列が無限に出続けて終了しません。 間違ってますでしょうか?
>>519 $/ = nil な状態だと、終端に来ても gets などが nil を返してくれないみたい。
なんとなく実装ミスっぽい気がする。
ruby 1.8.1 (2003-12-25) [i386-mswin32]
とりあえずこんな感じで。一つしかファイルを与えられないのが難点だけれど。
ruby -0777 -e "p gets" foo
class A @a="abc" def initialize @b="def" end def p_a p @a end end irb>a=A.new irb>a.p_a nil "abc"って結果を期待していたんですが、代入されてないのはなぜ? irb>A.instance_variables ["@a"] irb>a.instance_variables ["@b"] @aと@bは同じインスタンス変数なのに扱いが違うのはなぜ なんでしょう?上のプログラムの場合、@aは何に属する インスタンス変数なんでしょう?
>>521 Class クラスに属する、A という名前がつけられたインスタンスの変数。
だから A クラスに属する a という名前がつけられたインスタンスからは
直接は参照できない。
>>521 class A
@a = "abc"
def self.a; @a; end
def p_a; p self.class.a; end
end
Matz日記のコメント欄の議論ウゼェ
と Matz さんが申しております。
>>522 >>523 すばやいレスありがd。
なんとなくわかってきたよ。もうちょいいじくりまわしてみます。
文字列で、ある正規表現にマッチする部分から別の正規表現にマッチする部分まで削除したい場合ってどうすればいい? イメージ的には str.gsub(regexp1..regexp2, '') なんだけど。 str.gsub(/#{regexp1.source}(?:.*)#{regexp2.source}/, '') かしら。 もっとスマートな方法ない?
str1=regexp1.match(str).pre_match str2=regexp2.match(str).post_match str=str1+str2
>>528 それだと sub はできても gsub は無理なような。
regexp1 より前に regexp2 があった場合にダメです
str='012345vwxyz012345vwxyz012345vwxyz0' from=/123/ to=/xyz/ mm=nil i=-1 arr=[] str.gsub!( from ){ |mm| i+=1; arr[i]=mm; "\x00from#{i}\x00"; } str.gsub!( to ){ |mm| i+=1; arr[i]=mm; "\x00to#{i}\x00"; } # from - to, \x00 は間にないと見なす。 str.gsub!(/\x00from\d+\x00[^\x00]*\x00to\d+\x00/, '') # from - to , ペアになっていないものを戻す。 str.gsub!(/\x00(?:from|to)(\d+)\x00/){ arr[$1.to_i] } puts str # 0000 になる。 # str='0xyz012345vwxyz012345vwxyz012345vwxyz0' ならば # 0xyz0000 になる。 # 例は簡単すぎるが。
あっ、そっか。 1from2from3to4 は 1234 にしていいのね。
>>532 1from2from3to4 はどうする。
1from2to3to4 はどうする。
1from2from3to4to5 はどうする。
from にマッチする文字列集合と
to にマッチする文字列集合の関係も気になります。
たとえば、完全同一の from==to はどうします。
設問が一般的すぎ。個別具体的でないと。
str.gsub(/#{regexp1.source}(?:.*)#{regexp2.source}/, '')
str.gsub(/#{regexp1.source}(?:.*?)#{regexp2.source}/, '')
で終了。
XML-RPC なんか捨てて SOAP を使えということですかそうですか。
Windows2000上でRuby/Tkを使いたいなぁと思っている者です。 Tcl/TkはActiveTclを三日前にダウンロードしてインストールしました。 で、以下のスクリプトを実行したのですが。。。 ========================================= require 'tk' x = TkVariable.new('適当な文字列を入れてください') TkEntry.new(nil, 'textvariable'=>x).pack TkButton.new(nil, 'text'=>'値を表示', 'command'=>proc{p x.value}).pack Tk.mainloop ======================================== Entryを書き換えずにそのまま「値を表示」ボタンを押すと、以下のような出力になり、日本語が出力されません。 ======================================== "\223K\223\226\202\310\225\266\216\232\227\361\202\360\223\374\202\352\202\304\202\255\202\276\202\263\202\242" ======================================== 何か設定ができてないためだろうと推察しているのですが、どうすればきちんと日本語が出力できるようになるでしょうか? ちなみに、普通のRubyスクリプトではきちんと日本語がDOSプロンプトに出力されます。
>>537 自己レスです。
「proc中のpをputsにする」という解決方法を教えて頂き、これでうまくいきました。
>>538 p (ていうか String#inspect) は、
$KCODE か -K オプションで出力する文字列の文字コードをセットしないと、
日本語の文字列はバイナリとみなして出力しちゃうね。
>>502 text_buf.start_iter.forward_search("foo", "bar")
のように意図的に違うものを渡しても
TypeError: not a Gtk::TextIter::SearchFlags
にしかならないからruby-gtk2のインストールがなんか変なのかも。
541 :
デフォルトの名無しさん :04/05/13 15:22
質問です。 要素が 1000 個ぐらいの Array があって、それぞれの要素は ['apple', 'orange', 'mango'] とか ['kiwi', 'banana', 'apple'] みたいな単語からなる Array だとします。 1000 個の要素のうち、以下のようにすくなくとも一度だぶっている要素、を抽出したいんですが、 1000 個の全体全で & をとっていく方法以外に、なにかうまい方法はあるでしょうか? ['apple', 'orange', 'mango'] ['kiwi', 'banana', 'apple'] ['kiwi', 'melon'] -> ['apple', 'kiwi']
>>541 配列をなめつつ単語をキーにしたハッシュで出現回数を数えて
最後に出現回数>=2なものを抜きだすといったあたりじゃないですかね。
543 :
デフォルトの名無しさん :04/05/13 17:26
>>542 ワオーそれでできました大変ありがとう!
考えてみた。 dict, result = {}, {} [ ['apple', 'orange', 'mango'], ['kiwi', 'banana', 'apple'], ['kiwi', 'melon'], ].each { |set| set.each { |word| if dict[word] result[word] = true else dict[word] = true end } } p result.keys # -> ['apple', 'kiwi']
これはどう? ary=[ ['apple', 'orange', 'mango'], ['kiwi', 'banana', 'apple'], ['kiwi', 'melon'], ] ary0=ary.flatten ary1=ary0.uniq ary1.each{|x| ary0.delete_at(ary0.index(x)) } p ary0.uniq # => ["apple", "kiwi"]
(ary.flatten - ary.flatten.uniq).uniq …と、つい書きたくなるけど、これはダメ。
一つの要素に二つ以上入ってる場合があるからってこと?
>>547 あぁ、それだと漏れの
>>544 もダメか。
元の各要素は Array じゃなくて Hash か Set にするか uniq しとくべきだな。
self - other 集合の差演算。self から other の要素を取り除いた内容の新しい配列を返します。重複する要素は取り除かれます。 この「重複する要素は取り除かれます]は直観的でないよね。
>>549 たぶんみんなそう思ったらしく
ruby 1.8 feature: 重複した要素は保持されます。
だって。しかしこの文、オレは読んだだけじゃどういう意味なのか
さっぱりわからなかった。
ruby 1.8 featureの変更点一覧には例があるけどね。
p([1, 2, 1, 3, 1, 4, 1, 5] - [2, 3, 4, 5])
=> ruby 1.6.8 (2002-12-24) [i586-linux]
[1]
=> ruby 1.8.0 (2003-02-16) [i586-linux]
[1, 1, 1, 1]
[2, 2, 2] - [2, 2] は [2] だろうよと思わなくもなくなくない。
result = Hash.new(0) [ ['apple', 'orange', 'mango'], ['kiwi', 'banana', 'apple'], ['kiwi', 'melon'], ].each {|set| set.uniq.each {|word| result[word] += 1} } result.reject! {|key, cnt| cnt == 1} p result.keys # -> ['apple', 'kiwi']
俺も考えてみた。 なにも浮かばなくて涙が出た。
>>551 [1, 2, 1, 2] - [1] #=> [2, 2]
確かに中途半端な感じだね……。
array.c の 1.108 -> 1.109 で以前の仕様から変更されてるみたいだけど、
2003-02-03 前後の ChangeLog や ruby-{dev,list,talk} を見ても、現在の仕様に
なった経緯について触れてないっぽい。
Array#- を使ったことなかったけど、↓こんな動作するんだと思ってた。
class Array
def -(other)
occur = Hash.new(0)
other.each{|elm| occur[elm] += 1}
result = []
self.each do |elm|
if occur[elm] == 0
new_ary << elm
else
occur[elm] -= 1
end
end
result
end
end
556 :
デフォルトの名無しさん :04/05/17 17:16
Ruby からシェルスクリプトのように、コマンド群を実行したいのですが、
たんに system とかから実行するのではなく、以下のようなことがしたいと思っています。
* 実際にはコマンドを実行しないモード(dry run)みたいのがある。
* シェルスクリプト中の各コマンドについて、エラーハンドリングができる。
* そのほかシェルスクリプトから呼び出される各コマンド・プロセスの仮想化
いろいろぐぐってみたんですが、warlus プロジェクトの OBAQ というライブラリがそれっぽいことをやってくれそうです。
http://walrus-ruby.hp.infoseek.co.jp/pfm/func.html とりあえず、ここにある pfm をインストールしようとしたんですが、以下のエラーで失敗します。
/usr/lib/ruby/1.6/pfm/pfmsupp.rb:15: uninitialized constant Resource at LocalResourceBase (NameError)
from /usr/lib/ruby/1.6/pfm/pfmmodel.rb:3:in `require'
from /usr/lib/ruby/1.6/pfm/pfmmodel.rb:3
from /usr/lib/ruby/1.6/pfm/pfmjob.rb:3:in `require'
from /usr/lib/ruby/1.6/pfm/pfmjob.rb:3
from /usr/bin/pfm:5:in `require'
from /usr/bin/pfm:5
メーリングリスト等は止まっているみたいなので、作者の中島@ブレーンさんに直メールでうかがったところ、
このプロジェクトは開発途中で終了とのことでした。。。
(中島さん、もしこのスレッド見てたら、お返事ありがとうございました)
OBAQ を今も使用してる方はいらっしゃいますか?
もしくは、上記のような目的をみたすライブラリってなにかあるでしょうか?
>>556 > Ruby からシェルスクリプトのように、コマンド群を実行したいのですが、
> たんに system とかから実行するのではなく、以下のようなことがしたいと思っています。
外部のコマンドを実行するには、fork&execとかsystemとか1.9ならspawnとか
IO.popenとか``とか使うしかないんだが。
> * 実際にはコマンドを実行しないモード(dry run)みたいのがある。
単なるフラグの処理だろ。
> * シェルスクリプト中の各コマンドについて、エラーハンドリングができる。
例外処理? それとも$?.exitstatusについて?
> * そのほかシェルスクリプトから呼び出される各コマンド・プロセスの仮想化
意味が分からない。
こわーい
559 :
デフォルトの名無しさん :04/05/19 13:18
こわいこわい
なるほどと思って読んでたんだがここでワラタ。 |Ruby ユーザにとって新しい言語の習得の必要がない
562 :
デフォルトの名無しさん :04/05/20 12:30
PHP普及の原因は、イスラエル・Zend社のマーケティングの成功にある。
@Perlでは別インストールで多くの人が知らないデーターベース利用を標準で使用できるようにし、「データーベースが簡単に取り扱える」というイメージを特に強く植えつけた。
Aウェブサイト作成への特化。例えば、セッション管理がそうだ。
Bソースの隠蔽による著作権保護を可能にした。
データーベースを使いたいが、使い方がわからない。そこに、PHPなら使えるという情報が先に入る。これで、PHPに入った人もかなり多いはず。
PHPの言語仕様はZendに大きく左右される。
二年ほど前、PHPが出始めた頃には、変数のスコープがPerlとまったく同じ仕様だった。
もともと、Perlのソースコードを改編して作成されたPHP。
↓PHPの歴史
http://php.planetmirror.com/manual/ja/history.php PHPには、Perlコードの退行による高速化の意図が言語のいたるところに見える。
マイクロソフトは、オブジェクト指向への対応というのが大義にVB6.0からVB.NETに言語仕様を大幅に変えた。
今後も大きく言語仕様が変わることはないのか?
オープンソースとは言っても、Zend社の
http://www.zend.com/management.php の数人のスタップによって大きく左右される。
再帰的定義とされる「PHP:Hypertext Preprocessor」という名前にも理由がある。これは、要するに、正確には、「Perl Hypertext Preprocessor」としたいところだが、GNUの「GNU is Not UNIX」という再帰的な定義をもじったものだ。
要するに、「GPLのフリーソフトのライセンスには違反していませんよ!」と一つには主張し、また、一つには、「PHP is Not Perl」とでも言って、Zendの社としての姿勢を、先人の「Perl開発者たち」から擁護する意図があったのだろう。
Nではなく、Hなのが、そのための味噌だ!Perl開発者たちは、当然、面白くないはずだ。
PHP信奉者は、六芒星(hexagram)マークのユダヤ教にでも、入信せよ!
リファレンスマニュアルに open-uri って無い?
>>565 節穴でした。しょうもない質問してしまってスマソ。
567 :
デフォルトの名無しさん :04/05/21 15:27
いろいろ調べましたが無理でした。 大変お忙しい中お手数ですが、 Ruby/Tkをmswin32かmingwで動かす方法を丁寧に教えて頂けないでしょうか。
簡単に動きました。ありがとうございます。
>>556 warlus 開発終了なの?お疲れ様でした。
…自作アプリ、warlus使わなくてよかった。
…… amrita の行く先は大丈夫かな。
Rubyで文字列を記述する場合、シングルクォートとダブルクォートの2種類があるのはなぜでしょう? ダブルクォートだけでは困るケースがあるのでしょうか?
シェルスクリプトからの伝統でしょ。 また実際、""で書いた方が楽な場面もあれば、''で書いた方が楽な場面もある。 a = 1 p "#{a}" # => "1" p '#{a}' # => "#{a}" とか。
>>571 \ が混じるとめんどい。特に Win のファイルパスを貼り付けた時。
あいぼーん
Ruby1.6.7 + rss-0.0.8 で RSS1.0 の dc_date が拾えない。もう1.8系しかだめなのかな。
577 :
デフォルトの名無しさん :04/05/24 21:49
rdoc の国際化がどうなってるか、追っかけている方はいますか? 納品せにゃならんプログラムの各に英語/日本語のコメントをつけるとき、 私は↓のように併記してますが、なにかうまいやりかたあるでしょうか? # # Returns current rcs timestamp. # # 現在の RCS タイムスタンプを返す # def rcs_date ... end
>>577 Rubyで仕事。
イイナー、イイナー。
俺なんかPerlしかまわってこないぞ。 まあいいんだけど。
rdocの多言語対応はまだなんも決まっちゃいないはず。 javadocな人はどうやってんだろ。
仕事でヘタにrubyで書いちゃうと 会社辞める時の引継ぎが大変 普通使わねって。
mod_rubyについて教えてください 何故エラーが出てるのかわかりません [Tue May 25 20:15:31 2004] [error] mod_ruby: error in ruby \n/usr/local/apache2/htdocs/ruby/test/TestMain.rb:2: in `load': ./TestTool.rb:12: dynamic constant assignment (SyntaxError) \n\t\tAAA1=CGI.escape(szEucKey)\n\t\t ^ \n\tfrom /usr/local/apache2/htdocs/ruby/test/TestMain.rb:2 \n\tfrom /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `load' \n\tfrom /usr/local/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler'\n とapacheのerror_logに出力されてしまいます
SyntaxErrorって書いてあるじゃん 馬鹿?
ソースです TestMain.rb ------------ require "cgi" load "./TestTool.rb" szEucKey="&&" AAA1=CGI.escape(szEucKey) print "1:",AAA1,"\n" TestTool.testMethod() --------
TestTool.rb ------------- require "cgi" require "uri" require "kconv" class TestTool def TestTool.testMethod() cgi=CGI.new keyword=cgi["keyword"] szEucKey=Kconv.toeuc(keyword) p szEucKey AAA1=CGI.escape(szEucKey) print "2:",AAA1,"\n" end end -------------
>>583 TestMainの
AAA1=CGI.escape(szEucKey)は
うまくいくのですが
TestTool.rb だとエラーになってしまいます
全然わからなくて、困ってます。
in `load': ./TestTool.rb:12: dynamic constant assignment (SyntaxError) って書いてあるじゃん
>582-586 dynamic constant assignment - 動的な定数への代入 定数への代入はメソッドの外でなくてはならない。 定数のじゃなくて変数を使うこと。
あ・・・ すみません 気づきました 「AAA1」が駄目だったのですね 小文字にしたら旨くいきました ありがとうございました、とても感謝しています。
rubyわかりにくいよね>素人 やめちゃえ
例えば、今回素人が全然わからなくて困っていた、 「小文字にしなかったのが原因」 という結論は、*nixでshとか使ってるやつなら直感的にわかる様な事だろうか。 そうだとしても、shも妙な仕様を抱えている言語の1つでもあるし、 ここは考察すべきところであると思う。 rubyがめざす言語ポリシーとして正しい道を歩んでいるのかどうか。
第一に、 *nix とか sh とかで把握できるようなものではないだろう(環境変 数が大文字というネタくらいか。でもこれって慣例だよね)。 たとえばメンバ変数が @ から開始される、とかいった決まりとほとんど同じ だと思うし、大文字と小文字というのは区別としてはわかりやすいと思うなぁ。 ruby-mode ならかなり目立つ色になってくれるし。定数と覚えなくても「大文 字はクラス名という慣習である」という程度の理解でも、回避する役には立つ。 現実問題としては、これをやめた場合に Class や Object といった定数をど う保護するか、というのが問題となる気はする。 そういうわけで、けっこう妥当な方針だと思うけど。
ん〜 そんなの Ruby のちゅーとりあるナナメ読みすれば わかることじゃん。 自分でコーディングして、自分で調べるのが面白い、 それがプログラミングの楽しさと私は考えてます。 初学者でも、マニュアル読むくらいの丁寧さというか 学ぶ積極性というか周到さというか、そういうのは必ず持っているハズ。 そういった謙虚さが足りないと、学ぶスピードが落ちるし、 自分にとって大きなマイナスになる。 トライアル&エラーだけでコーディングを学ぼうとする人は 面倒臭がりすぎというか、頭のネジとか肛門とか、どこかゆるんでると思う。
プリーズ ティーチ ミーーーー 小数点4位以下を丸める方法はどうするのが一番簡単ですか?
(f * 1000).to_i / 1000.0
puts(Float(sprintf("%.4f", 0.123456)))
>>595 「丸める」の意味次第で、
>>596 の to_i の部分を
ceil, floor, round のどれかに置き換える必要があるかもしれない。
(f * 1000).round / Float(1000) で、いくことにします。ありがとうございました。
Float に四捨五入メソッドとかあったほうがよくないかな
>>601 四捨五入にもいろいろ種類があるんだぞ。
602じゃないので想像で。 負数で .5ちょうどの場合に、正の無限大側に切り上げる(-1.5 -> -1.0)のか、 絶対値で考える(-1.5 -> -2.0)のか、とかかな。 あと、一つ上の桁の数字が奇数か偶数かで、.5の扱い(切り上げ・切り捨て)を 変えるような方式もあった気がするけど、これは「四捨五入」じゃないかも。
そのへんの仕様を決めるのに一悶着、メソッド名決めるのにもう一悶着。
んなもん全部パラメータで指定すればいい。 メソッド名はaliasばら撒いて解決。
>>606 そういう数値演算とかの話って、知らなくていいひとは全然知らない気がする。
>>608 なるほど、そんなもんかな。
で、「1.0/2 != 1/2」の話へ繋がっていくとか。
そこでグローバル変数eの導入ですよ。
切り上げと切り捨てだけなら揉めずにすむか?
なんで四捨五入がないんだゴルアってもめる。
じゃあround()とiso_round()か。 それともsort()みたいに、round()にブロックを渡すとか。そりゃやり過ぎ。
「Stringの連結が * であるべきだ」なんて言ってるやつがいるの? わけ分からん。
616 :
デフォルトの名無しさん :04/05/26 23:22
Ruby1.6.4上でCGIを作っているのですが、File::unlink の際に奇妙な事が 起こり、困っています。 --- p Dir::entries(hoge + '/') Dir::entries(hoge + '/').each {|filename| path = hoge + '/' + filename next if FileTest::directory?(path.untaint) p Dir::entries(hoge+ '/') File::unlink(path) } p Dir::entries(hoge + '/') Dir::rmdir(hoge) --- これを実行すると --- (下の行のようなファイル名の配列がずらずら消えてゆく) [".", "..", "body", "style", "lock"] [".", "..", "style", "lock"] [".", "..", "lock"] [".", "..", ".nfs0c3e6b4700000d9a"] ←これ ./lib/Database.rb:50:in `rmdir': Directory not empty - "./database/bc9189406be84ec297464a514221406d" (Errno::ENOTEMPTY) なぜ、突然 .nfs0c3e6b4700000d9a のようなファイルが作成されるのが 不思議です。 そして、そのファイルのおかげでディレクトリを削除できな いのですが。 理由をご存知の方、いらっしゃいませんか?
>>617 ありがとうございます。 ようやく納得できました。
まさか作業ディレクトリがNFS上だとは知りませんでした…。
.nfs* が File::unlink の後に残っているということは、クローズ処理なるものが
完了していないという事ですよね。 仮にそうだとすると、プログラムが終了
するまで、そのファイルは消えない事になりますよね。
そうすると、ディレクトリを削除するには、別のプロセスを立ち上げて消すしか
方法はないものでしょうか。 意外とNFSって曲者ですね。
標準のCGIライブラリって使わないほうがいいんですか?
自己レス。 何か勘違いしてるかも。 出直してきます。
>>592 まあ確かに素人が↓のエラーを見たときに、
in `load': ./TestTool.rb:12: dynamic constant assignment (SyntaxError)
大文字が定数になるから。なんてわかるわけないよなぁ。
正直、定数は const 修飾子みたいなのがほしかった。
大文字小文字で区別するのはちょっとなぁ。
>>622 そお? どーせ、ハンガリアンうんたらで大文字で記述されたりするんだから
それを言語仕様に組み込むのってのは、いいアイディアじゃね?
大文字小文字関係なしにクラスだの変数たの定数だのがでてきたら、それだけで
コードを追う手間が増える。 部分を見ただけで、一発でそれが何かわかるってのは
すごく重要だと思うんだけどなー。
まつもと氏の「初心者はいつまでも初心者に甘んじるべきではない」ってのに一票。
初心者は大文字小文字の区別がつかないバカが多いからなあ。
>なんてわかるわけないよなぁ 調べてないんでしょ?わかるわけがないよ。 手持ちの知識と勘だけでいつでもどうにかなるなんて大間違い。 「なんで定数になってるの?」という疑問から、ふつうは言語仕様を調べる。 ていうかコーディングする前に、言語仕様ぐらいざっとでも目は通す。 素人に優しく玄人にも便利、っていうならかまわんけど。 でも素人とか初心者(≠初級者)なんぞのために、とっつきやすくも 不便な仕様に変えるようなら、きっと自分はrubyを見限る。 …優しい独裁者はそんな決断をしないと、信じてるけどね。
>>616 ああぁ、そのスクリプト、ホームディレクトリで実行しちまったよ・・・
なんかスッキリしたみたいだよ。鬱死・・・
627 :
デフォルトの名無しさん :04/05/27 03:29
rubyのCGIが動かせて無料で広告無しのホームページ作れるとこってない?
自宅鯖
用途は限られるがRubyForgeとか。RubyForgeって無料だよな?
>>615 "kyonkyon" は "kyon"*2 ではなくて "kyon"**2 じゃねえの?って話みたい。
>>624 DOS/Windowsのファイル名の仕様で慣れてるってのがあるかもね < 初心者
そういや、VBって区別するのかな?
"kyon"=="k"*"y"*"o"*"n"=="k"*"n"*"o"*"y"=="knoy"
行列とかやったこと無い? 加算で交換法則が成り立たないことはないはずだけど、 乗算では成り立たないケースがあるんだよ。 その習慣に倣えば、文字列結合は乗算となる。 言い分はいちおう理解はできるんだけど、そもそも文字列で 数学やってるのが間違いなんだよなぁ。
634 :
デフォルトの名無しさん :04/05/27 13:37
pdumpfsの質問です。 LAN上のPC1から、PC2へバックアップを取ろうとすると、 >pdumpfs.exe C:\temp \\PC2\backup pdumpfs:444:in `main': undefined method `fprintf' for #<IO:0x8ce980> (NoMethodError) from pdumpfs:462 なるエラーが出るのですが、LAN経由でのバックアップはできないのでしょうか。 PC1 XP NTFS PC2 2000 NTFS
>>634 ruby 的な解法じゃないけど、ネットワークドライブを割り当てたらどう?
>>634 エラー嫁。
>pdumpfs:444:in `main': undefined method `fprintf' for #<IO:0x8ce980> (NoMethodError)
fprintf なんてメソッドあるのか?
ネットワークには関係なさそうだけどな。
>>636 ちなみにそこのまわりは
if windows?
fstype = get_filesystem_type(dest)
if fstype !~ /ntfs/i
STDERR.fprintf("pdumpfs: only NTFS is supported but %s is %s.",
dest, fstype)
exit 1
end
end
てな感じだった。fprintfは単にprintfの間違いだと思うけど結局NTFSじゃ
ないってエラーはいて終わるだけだね。とりあえずprintfに直して走らせ
ればそこが何になってるか調べることができると思う。windowsはよくわか
らんけど、LANで共有した奴はNTFSにはならないのかな?
ネットワークドライブ割り当てでうまくいきました。 ありがとうございました。
文字列中の^Hにマッチする正規表現って何ですか? あと文字列中の _____^H^H^H^HTEXT みたいなのは何を意味しているんでしょうか?
/\x08+/ もしくは /(?:\^H)+/ ホンモノのデータを見ないとどっちかはわからん。 とりあえず「コントロールコード」について調べてみ。 >_____^H^H^H^HTEXT HTML で表現するとこんな感じ。 <del>_____</del>TEXT
/\b/
643 :
デフォルトの名無しさん :04/05/28 06:54
>>637 ネットワークドライブに割り当てられたドライブは SMBFS になると思うぞ。
その先がNTFSだろうとFAT32だろうと、リモートホスト側で変換するはず。
NFSでも相手のファイルシステムいかんに依らず、NFSとして扱えるだろ?
以上、想像でした。
>>641 違う。HTMLで表現するなら <u>TEXT</u> だろ。
roffベースの man か何かのエスケープシーケンスだな。
645 :
デフォルトの名無しさん :04/05/28 10:06
パスワードに使えて、どの環境でも同じ結果を出す 暗号のライブラリってありますか?
crypt
>>646 環境によって違うからダメでしょ。md5 とかにした方がマシ。
捨てっちまえ > bcc
1.8 で、 class Foo; end class Foo::Bar; end こう書けるようになったのは嬉しいのだが、 class Foo; class Bar; end; end class Foo::Baz < Bar; end これがエラーになるのはちょっと悲しい。
>>643 unix 系の場合はそうかもね。
ちなみにエクスプローラのプロパティを見ると、ネットワークドライブ
の場合はしっかり NTFS と認識してる。元が FAT32 の場合はシラネ。
>>649 class Foo::Bar; end は
class Foo; class Bar; end end の省略記法では*ない*からな。
>>649 class Foo::Bar; end は
class Foo; class Bar; end end の省略記法では*ない*からな。
というかスコープの話じゃない? Foo::Baz の定義は main で行われているのだから、当然 ::Bar を探しに 行くわけだ。Foo::Bar と指示してやらないと。
スコープの話じゃない? Foo::Baz の定義は main で行われているのだから、それだと当然 ::Bar を探しに行くわけだ。Foo::Bar と指示してやらないと。
スマソ。pc5 重すぎ&反映遅すぎ。orz
ふかわりょうスレですか?というのはともかくとして。 だとすると、 class Foo::Bar; end と書けてもあまり嬉しいことないなあ。 class Foo; class Bar; end; end のままでいった方が良さげだなあ。
>>649 class Foo::Bar; end は
class Foo; class Bar; end end の省略記法では*ない*からな。
>>649 class Foo::Bar; end は
class Foo; class Bar; end end の省略記法では*ない*からな。
>>649 class Foo::Bar; end は
class Foo; class Bar; end end の省略記法では*ない*からな。
>>656 ライブラリの再定義をするときとかに便利だよ。
特に名前空間が深い時ね。
module Foo; class Bar; end; end
class Foo::Bar; def baz; end; end
あと class Foo::Bar は、クラス Foo そのものには影響を
与えないことが明瞭になる。
class Foo; end
class Foo; class Bar; end; def baz; p 'Foo#baz'; end; end
663 :
デフォルトの名無しさん :04/05/29 02:56
>662 その調子で1000までたのむよ
664 :
デフォルトの名無しさん :04/05/29 03:07
www.ruby-lang.orgメンテ中。 CVS周りのアップデート中か?
>>663 も二重書き込みだったらおもしろかった。
本当にクラックされてたとは
669 :
デフォルトの名無しさん :04/05/29 17:36
670 :
デフォルトの名無しさん :04/05/29 19:10
やっぱりオープンソースって怖くて使えないね。
671 :
デフォルトの名無しさん :04/05/29 19:11
ラビーて無料?なら教えれ
このまま消える言語に一票。
678 :
デフォルトの名無しさん :04/05/31 00:00
これでオプソプロジェクト全滅してくれると非常にうれしいよね!>ALL これからはクローズド・ソース!
>>626 いまさらだが、あまりの感動に泣いた。( ´Д⊂ヽ
よーし、パパも質問のふりして、さりげに危険なコード貼っちゃうぞ!
兄さん。 あれからというもの、コツコツあちこちから設定ファイルの断片をかき集めて、 最近ようやく普通の暮らしになれてきたところです。 バックアップは重要、そんな平凡であたりまえな言葉の、 本当のありがたみが身にしみてきている、 そんな今日この頃です。
683 :
デフォルトの名無しさん :04/05/31 07:18
s.split(/(,)/).each{|ss| if ss =~ /,/ print ss else print "\"" + ss + "\"" } これはカンマで区切られた文字を""で囲むコードなんですが、 二度も/,/でチェックしていて無駄な感じです。 ssがsplitの引数にマッチしたのか、マッチしていないのかは どこかに保存されていないのでしょうか?
684 :
デフォルトの名無しさん :04/05/31 07:26
orgも下半身のふくよかなorzに見えないことはない
>>683 splitの正規表現にカッコを使わないのはどうよ
print s.split(/,/).map{|ss| '"' + ss + '"'}.join(',')
あるいはgsub使うとか
print '"' + s.gsub(/,/,'","') + '"'
URI って file は解釈してくれないでしょうか? ruby -ropen-uri -e "puts URI::parse('file:///tmp/hoge').read" みたいな。
あんまruby本体に機能詰め込むと起動が遅くなると思うんですが。 その辺どういう見解ですか?>開発者ども
こんな見解でどうですか。 $ time ruby16 -ep real 0m0.047s user 0m0.030s sys 0m0.010s $ time ruby18 -ep real 0m0.030s user 0m0.020s sys 0m0.010s
そういえば、ruby で Robocode みたいなことをやりたいんですが
ruby 本体を埋め込みして、不特定多数のデベロッパが作った
ruby スクリプトをネットワークでやりとりするんです。
セキュリティ上、埋め込みした ruby からは File などを
はずしておきたいんですが、そういう ruby のソースコードの腑分けを
解説してくれてるサイトってないですかねぇ。
ttp://i.loveruby.net/ja/rhg/index.html ↑こちらとかは、とても参考にさせていただいてます。
できれば Thread ははずしたくないんですが、これは残しておいて
大丈夫ですかね?
>691 なるほど、目からウロコです! それでいけそうですね。 とりあえずセキュリティはセーフレベルにゆだねる形で 作っていって、なにか不具合があったら、また検討したいと思います。 ありがとうございました。 (こういうスレで聞いてみるもんだなぁ・・) ついでに質問で恐縮なのですが 私は embedded ruby はまるきり初心者なのですが、 みなさんはどういう風に勉強されましたか? トライアル&エラーでしたか?
>693 なんと、もうあったのですね…。 まぁ勉強にはなりますので助かります。 参照させていただきます。
設定ファイルをRubyで書いてもらってそれを読み込みたいんだけど、 本体スクリプトとのデータの受け渡しはどうやるのがいい? わざわざ設定用のAPIを作るほどでもなくて、いくつかの変数に 代入してもらう程度なんだけど。
load とか require とか YAML とか Marshal とか PStore とか・・・
697 :
デフォルトの名無しさん :04/06/01 18:35
>>695 >Rubyで書いてもらってそれを読み込み
この時点で、
* load
* 読み込んで eval する
のどっちかじゃないかな。
require はムダに再読込を防止されちゃうから使わない方がよさげ。
たとえば tDiary は load してる。
>>696 Marshal(PStore) は手書きできないし、互換性も保証されない
んじゃなかったっけ?
>>698 tDiary は load じゃなくて eval してる。
$ ident tdiary.rb ; grep -n \"tdiary.conf\" tdiary.rb
tdiary.rb:
$Revision: 1.190 $
471: eval( File::open( "tdiary.conf" ){|f| f.read }.untaint, binding, "(tdiary.conf)", 1 )
うーん、なにかいいライブラリがあるわけじゃないのね。 サンクス
>>701 バージョン上がって機能が増えると遅くなるんじゃないか、
という話とは違うのん?
704 :
デフォルトの名無しさん :04/06/02 11:40
おしえてください。 以下のような、現在の時刻を表す文字列を生成したいのですが、 (用途は Debian の debian/changelog ファイルなどの生成) 、 'Wed, 2 Jun 2004 10:48:57 +900' こういう形式の文字列って Time クラスだけで作ることできるでしょうか? 自分がやってみたのは、 t = Time.new t.strftime("%a, %d %b %Y %X %Z") => 'Wed, 02 Jun 2004 10:48:57 JST' となり、自分が求めているフォーマットと比べると、 日付 2 -> 02 タイムゾーン +900 -> JST となってしまい、いまいちでした。。。
time.rbのTime#rfc2822を参考に数行書き替えるとできるんじゃないかな。
% ruby -e 't=Time.new; p t.strftime("%a, %e %b %Y %X %z")' "Wed, 2 Jun 2004 13:35:14 +0900"
>>706 %z が使えるかどうかは環境依存と思われ。
リファレンスだけでも復活させてよヽ(`Д´)ノ
710 :
デフォルトの名無しさん :04/06/03 01:28
すいません、プログラムを実行すると標準出力に出力があるんだけど それがどこのコードによるものかがわからない場合 どうしたらいいんでしょう?
ラビーって何?ひまわりと同じ言語?
Ruby Ru by 普通Ruを’ラ’とは読まんよなあ・・ 狙ったボケだったりしたら萎えるなあ・・ 寒いよなあ・・
なんでそんなのが釣りになりうると思えたんだろう。
ユダヤ教の司祭だろ?
>>710 とりあえず、きれいな方法でなくても良いなら。
set_trace_func(
Proc.new {|event, file, line, id, binding, classname|
if event == 'c-return' and id = :puts
puts ['trace:', file, line, classname].join("\t")
end
}
)
>>710 grep で関連コードを絨毯爆撃か、デバッガで追うのがふつうかな。
ruby ならではということで
>>717 と同様に STDOUT.print を
書き換えることも考えたけど、出力のメソッドが print とも puts
とも限らないのが悩みどころなんだよね。
たぶん print か write あたりが比較的低レベルだと思うんだけど、
調べる気力が今はない :-)
どーでもいいけど、デーモンだからって、モジュールの使い回しをする
関係で出力してしまうことがあると思うんだけどな。
出力しないように作り直すのもめんどくさいし。
個人的には、IO 派生のログ出力クラスを作ってそこに繋いどく。
>>718 そんな糞モジュール(ry と言いたいところだけど、そういうのは意外と多いのかね?
そんなの漏れなら全部 /dev/null 行きにしちゃうんだけど、
でも、Ruby 本体の例外終了時のエラー出力だけはどうしようもない、
というかどうにかして欲しいんだけど、どうにか拾わないとメチャメチャ困るので、
STDOUT, STDIN, STDERR は /dev/null 行きにしつつも、
$stderr はどっかのファイルかログ出力用クラスに繋ぐ、くらいはやるかな。
>>717 ,718
ありがとうございます。解決しました。
メソッドの名前をdataにしていたのが原因でした。
名前を変えたら直りました。
けど、dataって特別なメソッドでしたっけ?
721 :
デフォルトの名無しさん :04/06/04 08:43
>>712 俺は北米系の英語しかわからんが、 u は、日本語だと「う」じゃなくて「あ」に近いね。
南の方いくと「う」に近い感じになってくるかもしれん。 特にスペイン語系の奴らは。
まあ、どうでもいいね。
長い u のどこが「あ」に近いと言えるのか理解に苦しむ
雲丹が兄になっちゃうのはイヤだなぁ
>>722 長いって何?
よくわからんが、一応、ありふれた単語で例をあげておく
Urgent -> あーじぇんと(×うーじぇんと)
Upload -> あっぷろーど(×うっぷろーど)
Cut -> かっと(×くっと)
Curry ->かりー(×くりー)
Tully's -> たりーず(△とぅりーず)
Starbucks -> すたーばっくす(×すたーぶっくす)
Fuck -> ふぁっく(×ふっく)
Suck -> さっく(×すっく)
さ、カタカナ英語の時間はおしまい。 オフトピsage
rúːbi
>>720 > けど、dataって特別なメソッドでしたっけ?
違う。
そのコードやSTDOUTに出てたっていう出力でも見ないことには何もいえん。
727 :
デフォルトの名無しさん :04/06/05 03:39
で、この言語はルビーなのかね?ラビーなのかね?
ルービ
730 :
デフォルトの名無しさん :04/06/05 18:01
already initialized constant が出てくるんだけど、原因がさっぱりわからない このwarningで例外投げるようにしてほしいのだけど、どうすればよいですか
731 :
デフォルトの名無しさん :04/06/05 18:05
Walk は ワルク と読みます Netscape は ネッツカーペ と読みます Builder は ブイルデー と読みます
ではRubyは ルァゥヴィ- と読みましょう
>>730 変数名のはじめに大文字つかってるっぽいな
変数名のはじめが大文字の場合は定数扱いになるから。
だからょお、constとか作ろうze
>>730 たしか ruby-list に要望があがってたはず。
とりあえず
>>717 を if event == "line" then に書き換えて、
代入を全て追いかけるとかは?
やたら冗長だけど、目星をつける役には立つんじゃないかな。
メソッドを引数の数でオーバーロードって出来ないの?
def a(x, y=1) x-y end puts a(10) # => 9 puts a(10, 2) # => 8
定数の再代入禁止が採用されないのは組み込みで困るとかいう話じゃなかったかな。
だからインタープリタのインスタンスを複数持てるようにしてくれ、と。
evalじゃまずいの?
インタプリタのインスタンスがあったとして、制御とIOはどんなAPIになるの?
スマソ、記憶の片隅にあったのはクラス再定義(Class オブジェクト再代入)
の話だった。[ruby-list:39567]
>>737 デフォルトはともかく、strict なモードがあってもよいと思われ。
>>741 グローバルなモード(?)ならやっぱり組み込みで困るような。
うぉ、素で間違えた。いつまで経ってもどっちがどっちだか覚えられんので す……スマソ。 メソッドを引数の数でオーバーライドって、こんな感じ? class A def a(x, y); x + y; end end class B < A def a(x); x ** 2; end end B.new.a(10) # => 100 B.new.a(10, 1) # => 11 これはできないと思うけど。
自分が意図していたのはこんなのでした。 class C def initialize(str) # 文字列から生成 end def initialize(a, b, c, d) # パラメータを与えて生成 end end デフォルト引数を駆使するか、メソッド名を変えるしかない? def C.parse(str) # ... new(a, b, c, d) end
影舞結構よさげな感じ。 ただIISだとぽろぽろCGIエラーや警告が出る。 ところで運用中にフィールド削ったらいけないの? 担当者削ってレス書き込んだらassignedが無いとか怒られた。
>>746 こんな感じとか?
漏れはメソッド名変えた方がおすすめするけど。
def initialize(*arg)
if arg.size == 1
# 文字列から生成
else
# パラメータを与えて生成
end
end
>>742 $DEBUG みたいなものをイメージしてたけど、
$SAFE のようにスレッドローカルなら問題ないのでは?
>>746 def initialize(a, b=nil)
if b == nil
init_a(a)
else
init_b(a,b)
end
end
protected
def init_a(a)
:
こんな感じの方法もあるけど、nil を渡せない欠点あり。
でも一般的に、メソッド変える方がわかりやすいコードになるんじゃないかな。
そーいや modruby.net もヤラれてたんだね。
あっちもこっちもで前田さん大変だ。
http://modruby.net/ja/announce.txt
>>748 フィールド削除でエラーは、影舞の BTS:154 だな。
Win32 での動作は BTS:190 あたり。
CVS の release-0_8-branch を取得するのがベストかも。
Win32 まわりの修正もコミット済みっぽいし。
つーかそろそろバグ修正をまとめてリリースして欲しいんだが。
752 :
デフォルトの名無しさん :04/06/06 15:53
>>733 大丈夫、キミはズルムケだ。
>>724 は
>>712 の Ru に対して言ったんだろ?
きっと、
>>729 はアメリカの国防長官の名前を「ルムズフェルド」とか発音してるはずだ。
酒場に行っても「ルム・コーク」。 さすが真性。
rubyでコンソールアプリを作ってるんですが 方向キーを押した瞬間、なんらかの動作をする みたいなことはできるのでしょうか? Enterだけなら if STDIN.gets == "\n" do_something end とかでできそうですが… 他のキーだとやり方が思いつかないです。
>>754 お、これは便利そうですね。解決しそうです。
やっぱりRubyはおもしろい
ありがとうございました。
>>756 おいおい、そこまで引っ張るネタかよ!?
cygwin版でputsしたときの改行コードを"\r\n", "\n"に切り替えるにはどうすればいいですか?
>>758 改行コードが入ってるグローバル変数なかったっけ?
いま、ドキュメントが見れんからわからんが・・・。
いつ、公式サイトは復活するんだ?
>>768 さんよ、必死なのはわかったが、どこで掛け違えてるのか、俺はすぐにわかったよ。
Ru は、一般的にどう読めるかって話だろ? 別にラビーが正しいなんて、誰も言ってないが。
>>758 putsは再定義しないと無理ぽ。printなら$\ = "\r\n"
>>768 お前がクラッカーだったって聞いたけどどうやったの?
>>774 おおお!!!そんな技があったとは目から鱗です。勉強になります。
ありがとうございました。
…な〜んてね♥
>>768 まぁこういうので期待に応えたレスなんて見たとき無いしな
よく頑張ったよお前は
________∩_∩ / ノ ヽ ( ノ⊂ ̄))) ̄⊃ /|ヽ (_ノ ._ ̄ 0'ヽ 0' / |ノ .) (_) ヽ i ( むしゃむしゃしていた。 ∋ノ | /――、__ ./(∩∩) 草なら何でもよかった。 / /| ヽ__ノ | / ./ 今はモー反芻している。 | ( | ( ’’’ | ( / |__ヽ.L_ヽ Lヽ_ヽ ''" ""''"" "'''''" ""''"" ''" ""''"" ''" ""''"" ''" ""''"" "'''.
rubyとは余り関係ないんだが、rbファイルをFFFTPでlinuxにASCII転送 してやると、なぜか改行コードが変換されない・・・。なぜ・・
>>771 「オプション」→「転送1」の「転送モード」と「アスキーモードのファイル名」の
設定を確認しる。
おそらく激しくスレ違いなので、それでダメなら、以後はソフトウェア板あたりへ。
オーバーライドとオーバーロードの区別が付かない人がいます
strongtyping を使えば、引数の型や数に基づいたオーバーロードができるよ
>>773 と得意気な顔したオーバー30がいます。
Don't trust ( )
OpenHtmlHelp.vbs ' HTMLヘルプを開き、単語を検索する dim searchword 'if WScript.Arguments.Count = 1 then 'searchword = WScript.Arguments(1) 'end if searchword = "sleep" set ws = WScript.CreateObject("WScript.Shell") ws.Run "C:\Ruby\docs\rubymanjp.chm", 1, False WScript.Sleep 100 ws.SendKeys "%n" WScript.Sleep 100 ws.SendKeys searchword WScript.Sleep 100 ws.SendKeys "{ENTER}"
778 :
デフォルトの名無しさん :04/06/09 09:29
プログラミング言語は何種類も知ってるけど、 スクリプト言語は詳しく無い(UNIXのBシェルとDOSのバッチファイル位)ので、 PerlとRubyはどっちが強いか分かりません。 今からはじめるならどっち?
文法の汚さが気にならなければ(あるいはC++のような汚物を積極的に好むなら)、 あるいは仕事で使うならPerlにしとけ。
C++のような汚物とか、使いやすいDelphiは好きです。 画面をちょこちょこ作れて、 クラスをふつーに記述できるスクリプト言語が欲しいなー、と思いまして。 Rubyのホームページみたら、なんか今止まってますね。
仕事に使うにしても、今からPerlっておすすめできないなあ。 Perl5の末期に来た今始めても、腐った知識をたくさん詰め込んだころには他の言語(あるいはPerl6)が主流になってそう。
今、仕事で使うというのならPerlだろうけどね。 でも、 * delphi知っててwinのGUIもやりたい * クラスをふつうに記述したい ならRubyでしょ。 VCLのラッパがあるし、Perl5のクラスはひどすぎるし。
>VCLのラッパがあるし これってどのくらい実用的なの? apolloだっけ。
RubyでGUIをちょこちょこっと書けるんなら自分のツール開発として即Ruby導入。 VCLのラッパは使わないかも。 昔はVBとDLLの組み合わせで開発したことあるけど、今はクラスの時代でしょ。 MACのアプリをRubyから操作出来たりしたら、仕事でも使いまつ。
どっちが Pでどっちが R? どちらなりと。
787 :
デフォルトの名無しさん :04/06/09 16:36
Rubyのホームページずっとこのままだったりして まぁ、それでもいいと思うけどね。管理、大変そうだし
788 :
デフォルトの名無しさん :04/06/09 17:30
正規表現が苦手な者です。 レシピブックに出てきた例なんですが、 レシピ 57 で、 /(.*?)\t/n って正規表現が出てくるんですけど、これって/(.*)\t/n と どう違うんでしょうか? なにか具体的な違い(マッチする String)などがあればおしえてください。
>>788 "FOO\tBAR\tBAZ" とかでマッチしてみそ。
普通はできるかぎり長い文字列にマッチしようとするんだけど、
? を付けるとマッチする最短の文字列のところでマッチをやめちゃう。
>>788 マッチするしないという意味ではどちらもマッチする文字列は同じ。
ただし、.*?は最短マッチ,.*は最長マッチなので、文字列のどの部分
にマッチするかは異なることがある。
% ruby -e 'a="a\tb\tc"; a.match(/(.*?)\t/n); p $1'
"a"
% ruby -e 'a="a\tb\tc"; a.match(/(.*)\t/n); p $1'
"a\tb"
>>789 , 790 さん
なるほど。。。
ご説明と具体例ありがとうございます。
とってもよくわかりました!ありがとう!
> ? を付けるとマッチする最短の文字列のところでマッチをやめちゃう。 最短だと".*"は必ず空列にマッチするから、 そうすると、/(.*?)ABC/は/ABC/と等しくなって意味なしのような。 最短マッチって仕様的な矛盾感じるなぁ。
最短マッチと便宜上呼ぶ人もいるがもちろん最短ではないぞ。 通常の貪欲マッチに対応した非貪欲マッチなだけだ。
>>792 「マッチを *やめちゃう*」ってのがミソで、マッチを *始める* のは同じとこからなのね。
空文字列は長さを持たないから"最短"にはならない、という解釈じゃダメ? 長さ 0 に対して「長い短い」を比較するのに違和感がある。 「大きい小さい」なら数学的な感じだから、「最小マッチ」なら 0 を 含んでもしっくりくるんだけど。
>>795 perl本で見た「最左最短」という説明がオレ的にはいちばん
わかりやすかった。
>>795 まるで駄目。
/(.*?)ABC/ を "123ABC" にマッチさせた場合、ヒットするのは
0("ABC")でも1("3ABC")でも2("23ABC")でもない。
おまいの思考は数学的じゃない、というか論理的じゃないよ。(・д・)
798 :
デフォルトの名無しさん :04/06/10 17:17
メソッドローカルなスタティック変数ってどうやって作るんでしょう?
>>798 まず、なぜstatic変数にしたいか、そこからだ。
800 :
デフォルトの名無しさん :04/06/11 06:36
>>799 例えばメソッドが呼ばれた回数を記録したり、
メソッド内で複雑な計算をする場合にキャッシュしたり。
インスタンス変数でもできるけれど、そのメソッド内でしか使わない場合
メソッドローカルなスタティック変数が欲しい。
シングルトンクラスを作って そのクラスのシングルトンメソッドからクラス変数を使うとか。
そもそもデータがメソッドに属しているっていう状況がOOP的に異常なんだよ。 だいたい呼ばれた回数を記録したって外から観測できなきゃ意味ないのと違うか?
>>802 オレも同じようなレスを書こうとしたけど、
>>800 にある「メソッド内キャッシュ」みたいなのは、
メソッドに属するデータなんじゃないかと思えてきた。
OO的には、メソッドオブジェクトのインスタンス変数、って感じか。
--[思い付いたけどダメな例]--
def func_with_cache(x)
name = caller(0)[0].match(/`(.*)'/)[1] #メソッド名取得
m = method(name) #メソッドオブジェクト取得
m.instance_variable_set(:@cache,{}) unless m.instance_variable_get(:@cache)
cache = m.instance_variable_get(:@cache)
unless cache[x]
cache[x] = func(x)
end
cache[x]
end
--[ダメな理由]--
def foo() end
foo1 = method(:foo)
foo2 = method(:foo)
p foo1 == foo2 #=> true
foo1.instance_variable_set(:@var,1)
p foo1 == foo2 #=> true
p foo1.instance_variable_get(:@var) #=> 1
p foo2.instance_variable_get(:@var) #=> nil <= 1 を期待してた
というか、メソッドオブジェクトの位置付けがよーわからん。
少し前に-talkでも出てたけど、Kernel#methodは毎回新しいオブ ジェクトを返す。これを同一のオブジェクトにするには、すべての Methodオブジェクトを覚えておかなきゃならない。
>>800 コンテキストを離れたキャッシュなんてナンセンス。
インスタンスから独立なら、クラス変数でも使え。
全てのMethodオブジェクトを覚えておく、というのはそんなに無理な前提なのかなあ。
そこでメソッドオブジェクトをキャッシュしておいて返すメソッドの実装ですよ。
マイナー OS 使ってるんで [ruby-dev:23681] を試したいんだが、 CVS でソース取ってこれねー。 nightly snapshot みたいなのってどっかにありましたっけ?
>>806 もちろん不可能じゃないが、単に必要とは思われてないだけだろう。
>>807 class Method
orig = instance_method(:method)
cache = {}
fin = cache.method(:delete).to_proc
define_method(:method) do |*args|
m = orig.bind(self).call(*args)
cache.fetch(id = m.object_id) do
ObjectSpace.define_finalizer(m, fin)
cache.store(id, m)
end
end
end
こんなのはどうかな。メソッド内だけでローカルではないけれども すぐ外のブロックだけでスコープが終わるので、クラス変数みたいに どっかからこっそりいじられる心配からは解放されるんじゃないかと。 class A end catch (:foo) { sum = 0 A.__send__(:define_method, :f) { |x| sum += x; sum } A.__send__(:public, :f) } a = A.new p a.f(10) p a.f(10) catchは無引数のブロックを1回だけ実行する関数として使ってる だけです。
オレは 1.times {} を使う。
def get_fib() hash = Hash.new{|h,k| k < 0 ? k: h[k] = h[k-2] + h[k-1] } hash[0],hash[1] = 1,1 return hash end f = get_fib p f[10]
>>811 1.times {}の方が1回だけやるぞって感じがするので、
次からはそうしよう。
>>810 こんなことできるんですね。
でも、びっくりしたというか、どこか心地が悪いかも。
ブロックが閉じた時点で、ライフラインが切れたように思えるからかな。
816 :
デフォルトの名無しさん :04/06/12 21:34
RubyでHTTPSで接続するコード書いたんだけど、SSLのセッション全然保存されない・・・ どうしたらセッション保持できるの?
差し支えなければ書いたコードを見せて
818 :
デフォルトの名無しさん :04/06/12 22:17
Net::HTTP.version_1_1 http = Net::HTTP.new( ADDRESS , 443) http.use_ssl = true http.get2(PATH1) { |resp| puts resp.body } http.get2(PATH2) { |resp| puts resp.body }
>>818 http.use_ssl = true
http.start {
http.get2(....) {....}
http.get2(....) {....}
}
とする
820 :
デフォルトの名無しさん :04/06/13 02:25
>>819 2つ目のget2で
/usr/lib/ruby/1.8/net/protocol.rb:199:in `sysread': SSL_read:: (OpenSSL::SSL::SSLError)
っていうエラーが出る・・・
差し支えなければRubyとOpenSSLのバージョンやOSなんかの環境を教えて
822 :
デフォルトの名無しさん :04/06/13 10:27
Ruby: 1.8.1-7 OpenSSL: 0.9.7d-3 OS: Debian sid
ここはド素人な質問もしていいスレ?
Rubyのbreakは値が持てるから、構文なんか使わなくてもループ式の値を見ればbreakで抜けたかは判断可能。 % ruby -e' (2..10).each do |n| print n.to_s, (2..n).inject(" is in prime¥n") {|r,x| if n != x and n % x == 0 then break " == #{x} * #{n/x}¥n" else r end } end ' 2 is in prime 3 is in prime 4 == 2 * 2 5 is in prime 6 == 2 * 3 7 is in prime 8 == 2 * 4 9 == 3 * 3 10 == 2 * 5
>>827 サンクス。
いまいち明示的じゃないのが気になるけどね…
829 :
デフォルトの名無しさん :04/06/14 13:21
"aa'aa'aa" を "aa\'aa\'aa" に置換したのですが、 良い方法がみつかりません。 gsub(/\'/,\\\')を試して みましたが、エラーが出てしまいます。
>>829 String#gsub(pattern, replace) は使っちゃダメ。絶対。
String#gsub(pattern) {|matched| .... } の方を使いましょう。
puts "aa'aa'aa".gsub(/\'/) { "\\'" }
>String#gsub(pattern, replace) は使っちゃダメ。絶対。 どうして? そこらへんどっかにまとまってたりするの?
gsub(/'/, "\\'") じゃなくて? といっても、何故か漏れのところでも不思議な置換のされ方をする。\\' って何かあったっけ? そういうわけで、 "aa'aa'aa".gsub(/'/) { |s| "\\'" } # => "aa\\'aa\\'aa" だった。
833 :
デフォルトの名無しさん :04/06/14 13:29
>>831 初心者は絶対 '\' でハマるから。
もちろん、理解できてて使う分には構わないんだけど、
「どうして?」とか言ってる香具師は理解できてないはず。
リファレンスマニュアルだと「Ruby の落し穴」の「\の影響」のところとか。
XML のパースライブラリっていくつかありますけれども、 XML を出力するのに何か定番というかおすすめツールやライブラリはありますか?
>>836 だって ruby-list で同じようなやりとりを何度見たことか。
つーか、漏れもこの落し穴にハマるんだよね・・・
文字列受け取るようにする仕様が悪い
\ を正規表現置換文字列のメタ文字にしたのが失敗なんでは。 「#」とか「$」にすればよかったのにね。
その仕様はperlからパクってきたものなので今更変えられません。
>>835 クラスに to_xml というメソッドでも作って適当に生成。
>>840 perlよりはむしろelispでしょ。
とりあえず、subst/gsubst みたいな新しいメソッドを作って
sub/gsub から徐々に移行すれば何も傷は残らない気がする。
する価値があるかはしらん。
843 :
デフォルトの名無しさん :04/06/15 08:56
gsub(pattern, replace) と gsub(pattern){replace} の挙動が逆だったら よかった気がする。
>>841 いや、その to_xml の中で使うのに便利なライブラリはありますか、
という質問なわけのですが・・・
皆さん手でゴリゴリ XML を書いてるんでしょうかね?
846 :
デフォルトの名無しさん :04/06/15 14:45
>>845 今は
gsub(pattern, replace) #=> replace の '\\' はメタ文字
gsub(pattern){replace} #=> replace の '\\' は普通の文字
なんだけど、
gsub(pattern, replace) #=> replace の '\\' は普通の文字
gsub(pattern){replace} #=> replace の '\\' はメタ文字
のほうが嵌りにくそう。
847 :
デフォルトの名無しさん :04/06/15 14:59
>>846 s.gsub!(/foo(.+)boo/) { $1.strip.downcase } があるから逆にできなかった。
ごめん、忘れて。
「俺」に都合が悪いという事ね。
gsub('hoge', 'fuga') なんてのは第2引数を使うな。 こういうのはいちいちブロックで書いてたらめんどくさい
web 復活おめ&乙
TOPページってblogなの?
blogにも使えるツールで作ってあることは事実だが、だからといって必ずしもblogであるとは限らない。
853 :
デフォルトの名無しさん :04/06/16 00:50
Rubyってインストールしないで使えないですか? フラッシュメモリにRubyのバイナリをいれて、 Rubyがインストールされてないパソコンで使うとか。。 dllとかsoとか、よくわからないけど、関係してる気がするんですが その辺の知識がなくて、よくわかりません。 教えてください。
>>853 使える状態にすることをインストールといいます。
この後葬式かよ
>>853 --enable-shared なしで作れ
ということではありませんか?
858 :
デフォルトの名無しさん :04/06/16 09:17
enumってないんですか? Enum1=1 Enum2=2 ... と根性でやるしかないですかね
>>859 とりあえずは状態を表すフラグとしてcase/whenで使いたいです。
単に1,2,3,...を書くのが面倒だというのなら module Enum def define_enum(*symbols) n = 1 symbols.each {|s| const_set(s, n); n+=1} end end class C extend Enum define_enum(:Enum1, :Enum2) end 2つぐらいじゃよっぽどこっちの方が面倒だが(笑)
>>861 直接enumをサポートしてないということすよね。了解です。
追加モジュールなしの標準で
enum(
:Enum1,
:Enum2
)
とでも書けたら使いたいけど字面がRubyっぽくないか・・・
ありがとうございます。
>>862 自分で正解にカスってる。
状態を表わす定数が欲しかったら、単にシンボルを使えばいい。
@state = :OPEN
case @state
when :OPEN
...
when :CLOSE
...
when :UNKNOWN
...
end
タイプミスで未定義のシンボルを使ってしまうというリスクはあるけど
ENUM_ARY=[NAME=0,ITEM=1,BODY=2,TAIL=3,TERM=5]
utf8へ変換できるRubyスクリプトってないですか? uconvだと自分でコンパイルしないといけないですよね?
nkf
>>866 それを言うなら、unkf でしょ?
環境依存になっても良いなら、iconv。
レシピブックに詳しく載ってたよん。
>>865 Pure Ruby で utf8 へ変換するのは聞いたことないな。
uconv も unkf も iconv も lv も自分でコンパイルしなきゃダメだし、
観念して自分で uconv コンパイルしる。
ああそうか、1.8.1 以降なら iconv が標準添付だから、
環境によっては最初から使える、ということを
>>867 は言ってたのか。
>>853 システム次第。
例えばLinuxなら、LD_LIBRARY_PATHとRUBYLIBを指定すればできるはず。
*BSDだとRPATHが固定されるので無理かも知れない。
Windowsなら最初から位置独立になってるのでそのまま使えるはず。
もちろんPATHを追加するのは前提。
iconvでできました。ありがとうございました。
てゆーか時代はutf8デフォだろ
従来の文字コードとのマッピングを何とかして欲しい。
# デバッグ中は↓のヒアドキュメントを標準入力とみなしたいんですがそんなことは可能ですか? <<STDIN aaa bbb ccc STDIN while gets ...
input = $debug ? <<STDIN : STDIN aaa bbb ccc STDIN while input.gets ...
と思ったら String に gets はなかった。 require 'stringio' input = $debug ? StringIO.new(<<STDIN) : STDIN かな。あるいは input.each { |line| ... } か。
$stdio = StringIO.new(<<EOS) if $debug aaa bbb ccc EOM while gets じゃあだめだっけ?
すまん、終端間違えた。
cygwin/MinGWでSDLを使った拡張ライブラリを作ろうとしているのですが extconf; make すると undefined reference to `_rb_w32_fclose` となってしまいます。これはRubyの方のものだと思うのですが 何をリンクすればいいんでしょうか?
>>880 ruby 1.8.1 (2003-12-25) [i386-cygwin]
で試したけど駄目でした。普通に標準入力からになってしまいます。
>>883 $stdio は $stdin の間違い。
$stdin = $-d ? DATA : STDIN p $_ while gets __END__ foo bar baz
Unicode->SJIS変換をするために変数の内容をnkfの標準入力に渡してその結果を受け取るにはどうしたらいいですか?
質問があります. ruby は全ての変数がオブジェクト(インスタンス)で、 変数の代入は参照渡しなので 「メソッドに変数(インスタンス)の参照を渡して, メソッドの中でそのインスタンスの内容を変えてもらう」が できると思います. 実際できますね. とろこが, 以下の code で, 変数の内容が変わってくれないのはなぜでしょうか? Java とかと違い Integer もオブジェクトで, 参照渡しなのでできると期待していました. しかし, 以下のメソッド inc で, 引数にもらったインスタンスの内容を変えることができませんが, なぜでしょうか? #-------- def inc i # Integer 型のインスタンスの参照をもらう i += 1 # もらったインスタンスの中身を変えてしまう end j = 7 print j, "\n" # これは 当然 7 と表示される. inc j print j, "\n" # これは 8 と表示されて欲しいが, 7 と表示される. #--------
これは, C言語で言うところの以下のコードと同じ振る舞いを期待しています. /*--------*/ void inc(int *i){ (*i)++; } void main(){ int j =7; printf("%d\n", j); /* 7 と表示される */ inc(&j); printf("%d\n", j); /* 8 と表示される */ } /*--------*/ 上記 Ruby の inc メソッドの中の挙動ですが, メソッド開始時は, i と j は同じインスタンスを参照しているのだと思いますが, i += 1 を行うと, 内容が ``8''である新しい Integer 型 Object が作成され, i は その新しいオブジェクトへを参照するようになるだけで, 元々のオブジェクト(j が参照しているオブジェクト)に変更が加わっていないように見えますが, それは正しい認識でしょうか? (私は, i が "+= 1" のメッセージの レシーバになると期待していました) def inc i i += 1 print i # 8と表示される end では 8 と表示されます. また, 上記の C 言語と同じ挙動を ruby で実装するにはどうしたら良いでしょうか?
補足ですが, 一応 こんな感じにラッパーで囲ったら インクリメントできまた. つまり, Integer 型のインスタンスに "+= 1" の様なメッセージを受けさせて そのインスタンスの内容が変わってもらうことは無理なのでしょうか? #-------- class IntWrapper def initialize n @i = n end def get return @i end def set n @i = n end end def w_inc i i.get i.set(i.get+1) end j = 7 w_j = IntWrapper.new j print w_j.get, "\n" # 7 と表示される w_inc w_j print w_j.get, "\n" # 8 と表示される #--------
i += 1 ってどういう意味かわかってる? i = i + 1 って意味でしかないんだよ。 i + 1 という新しいオブジェクトを代入によって i で指し示すようにしただけ。 += というメソッドを起動したんではない。
Ruby は 1.8.1 を使用しています. ruby 1.8.1 (2003-12-25) [i686-linux]
>>891 >つまり, Integer 型のインスタンスに "+= 1" の様なメッセージを受けさせて
>そのインスタンスの内容が変わってもらうことは無理なのでしょうか?
(1)よく勘違いされるんだけど、変数それ自身はオブジェクトではない。
(2)整数オブジェクトはその値それ自身によってアイデンティティを定義されているわけ。つまり、7と8は別のオブジェクト。
ようするに
(3)内容が違うのに同じオブジェクトであるような整数は存在し得ない。
(4)変数の指すオブジェクトを弄ることは=以外では不可、なぜなら変数はオブジェクトじゃないから。
結論として
(5)Rubyに++はない。(*i)++みたいなことはできない。理由は上記(1)から(4)。
> (2)整数オブジェクトはその値それ自身によってアイデンティティを定義されているわけ。 Fixnum はそうだけど、 Bignum は違うよね? このへんの事情ってどこかにまとめて説明してないかな? このスレでも頻出問題だし、ここ読め、みたいなのが欲しいところ。
>>891 >つまり, Integer 型のインスタンスに "+= 1" の様なメッセージを受けさせて
>そのインスタンスの内容が変わってもらうことは無理なのでしょうか?
(1)よく勘違いされるんだけど、変数それ自身はオブジェクトではない。
(2)整数オブジェクトはその値それ自身によってアイデンティティを定義されているわけ。つまり、7と8は別のオブジェクト。
ようするに
(3)内容が違うのに同じオブジェクトであるような整数は存在し得ない。
(4)変数の指すオブジェクトを弄ることは=以外では不可、なぜなら変数はオブジェクトじゃないから。
結論として
(5)Rubyに++はない。(*i)++みたいなことはできない。理由は上記(1)から(4)。
お返事ありがとうございましたm(_ _)m
まず, 多分(1)に勘違いは無いと思います.
ここが本質の様なので, ここに勘違いがあったら話が通じなくなってしまうので
もし, 勘違いがあったらご指摘頂けると幸いです.
私の理解は,
インスタンス:メモリ上にあり実際にデータを保持している.
変数:インスタンスへの参照情報だけ. Cの様な即値は存在しない.
という感じです.
「変数が参照するインスタンス」と書いたのはその様な意味を出したつもりでした. 次に, (2)もかなり本質的なことのようですね. このようなことは知りませんでした. 値が変わったら絶対に「別のインスタンスになる」のですね. となると,「メソッドに Integer 型のインスタンスへの参照を渡して, メソッド側でそのインスタンスの値を変えてもらう」は不可能っぽいですね... (4)ですが, ご指摘を受けて自分のひどい勘違いに気がつきました. "+=" はてっきり メソッドであり, Integer クラスライブラリの実装で処理しているのかと思っていました. 今 調べたところ, "+=" は 演算子( x = x + y の省略形)で, 言語仕様だったのですね_| ̄|○ (2),(3)より, = 演算子("変数の指すオブジェクトをいじる")では 絶対に不可能ですね. 理解致しました. ありがとうございましたm(_ _)m "Integer 型も即値でない"ので何かしら方法があると期待していたのですが, となると, 私の希望は Java のように ラッパークラスを作成する様な方法でしか解決できないのでしょうか?
まぁ、結論から言えばラッパ書くのが一番簡単だわな。 [Ruby-list:126]によると「++を使うためだけに言語仕様としてラッパを(暗黙に)生成するのはコストが大きすぎて、やめた」みたいなことが書いてある。
>>889 -inc j
+j = inc j
じゃだめっすか? カコワルイ?
Rubyの多言語と比較した際の具体的なメリットを教えてください
905 :
デフォルトの名無しさん :04/06/20 21:37
Rubyのいろんなテクノロジって草の根的に、何の後ろ盾も無い個人が物凄い貢献してたりするよね。 例えば関将俊氏のプロフィールは分からないけど、大きな企業が支援してくれないと惜しすぎる気がする。 趣味だからとか、これがオープンソースだからとか、それはそうなのかもしれないが、 これが正しい状況なのかはかなり謎。理想的なテクノロジが受け入れられるかは、 わからない。今から数年たったときにようやく理解されそうな気は漏れはしてるが、 クソなテクノロジ選んでソフト作る香具師がどんどん増えてる今の状況どうにかしなきゃ いかん。
>>905 糞なテクノロジとは具体的に何?
某MSILとか?
>>906 いやぁ、それもそうだが、例えばPHPとかね
あるいは、サーバサイドJavaとか
PHPの仕様しらねーや PERLのパチモンという印象しかなくて仕様すら知らないw
微妙に重複表現だな 1行目に何かいたか忘れるとは、俺も老いた・・・
結局のところ、何か組織力とか、後ろ盾が無いといいテクノロジもスルーされて終るってことを 証明しているんだよな。テクノロジを選択する立場にある人が結局いかに下請けに出すかってこと しか考えてないところに問題がある気がする。誰もが使えそうで事例がなんとなくでもあるものを選択する。 クソなプログラマ大量に使ってモノ作るより、少数でも経験豊かでソフトウェア設計に理解がある 人たちを使ったほうが安いってことに気づかないといけない。プログラマも少数精鋭で働ける場所を しっかり選ばないといけない。
>>911 > プログラマも少数精鋭で働ける場所をしっかり選ばないといけない。
選べない上に自己修練する暇も与えられない可能性ありw
まぁ労使問題はそれはいいとしてだ やっぱ、キソ技術作る人には後ろ盾が要ると思うんよ KDE と Gnome の違いを見ても思うが、資金援助。これ重要 Ruby Foundation とか設立できないか しっかりしたプログラミング言語が発展することで得する企業は探せば沢山あると思う
FTPサイトが激重でドキュメントすら落とせない・・・
>>913 企業相手に延々とロビー活動する人が何人か必要になるが
そういう人材はなかなかいない。
>>915 いないのかな
そういうの大好きな人たくさんいると思ってた
.NETってRubyが乗りうるプラットフォームでは最大の規模のライブラリを備えてるんだから 早く乗せて欲しいな。ライブラリが同じなら言語仕様の優位性が際立つと思うんだけど。 正直UNIX信者(作者含めて)置いてきぼりにしてWindows上で栄えて欲しいよ。
栄えるってどういう状態だよ。
みなさまありがとうございます.
>>892 >>903 すみません. 見落としていました.
失礼をお詫びいたしますm(_ _)m
ご指摘の通りです. 意味分かっていませんでした(
>>898 参照)..
新しいオブジェクトが生成されて, その新しい方を指すようになるんですね.
ここに, 大きな勘違いが一個がありました.
今更ですが, 重要なご指摘ありがとうございます
i.plus(1) とかで,「i が指しているインスタンスの中身が変わる」メソッドでもあればまた違ったと思いますが,
>>895 の (2), (3) の理由により, 不可能っぽいですね.
>>900 了解です. では ラッパを書く手法で行きたいと思います.
>>901 すみません.
"-inc" という表現も,
"+j =" という表現も 知らない表現方法です.
今から ちょっと試してみます.
>>918 rubyって、”スクリプト”ってイメージが強すぎて、windows上で栄えてるところが
想像できないなー。
>>921 WSHが流行ってない時点でねw
しかもその存在自体ActivePerl入れたずっと後だったし(遅っ
>>901 すみません. 手元で実行してみましたが,
"syntax error"
になってしまいました. 何か基本的な知識が足りてないのかな?orz
これは,
#--------
def inc i
return1
end
j = 3
print j, "\n"
j += inc j
print j, "\n"
#--------
という 感じで「戻り値」を使用するという感じに理解してよろしいのでしょうか?
私が使用している局面が「これが戻り値になるのは, 意味的に変」なのもありましたが,
変更を加えたいインスタンスが2個以上あるとダメなので採用しませんでした.
(もちろんメソッドが配列を返してきて, 受け取り側で全部処理すれば問題ないわけですが)
>>920 inc j の部分を、j = inc j にしてはどうすか? という意味でした。
行頭の + とか - とかは diff -u の形式のつもりだったニダ。
>>889 ほかの人も書いてるけどIntegerはimmutableだから
状態を変更するメソッドはありえない。
mutableなオブジェクト、たとえばArrayを使えば
似たようなことは出来なくもない。
def inc(x) x[0] += 1 end
x = [3]
p x #=> [3]
inc(x)
p x #=> [4]
>>925 すみません. しつこく i.plus() とか話題を振ってしまいましたが(笑)
immutable なので状態を変更できないのは 理解致しました.
ありがとうございます.
あぁ, 確かにラッパーを作るにしても Array でやるのがお手軽ですね.
(Array の中に入れるのも一種のラッパーと考えて)
これは 良いアドバイスをいただきました.
感謝ですm(_ _)m
++を+=のようにシンタックスシュガーとして実装する手もあったんじゃないだろうか。 ていうか、これだけシンタックスシュガーてんこもりの言語なのに、 ++だけ気に入らないのか。
928 :
デフォルトの名無しさん :04/06/22 00:05
>>924 すみません. またしても見落としていました. お返事をいただいていたのですね.
了解です. 私の理解で良かったのですね.
diff だったのか. 気がつきませんでした(^^;
>>928 >10に「1増えろ」というメッセージを送っても意味無いんですよね.
なるほど. 分かりやすいです.
++が無いことよりも,
>>897 の
>(2)整数オブジェクトはその値それ自身によってアイデンティティを定義されているわけ。つまり、7と8は別のオブジェクト。
が, ことの本質っぽいですね.
モデル的にどう説明してるのか抜きで実装の観点からみると、 結局fixnumは効率のために即値になっていて、変数には オブジェクトへのポインタではなくて、値+これはfixnumだという 印が入ってるだけなのよね。
932 :
デフォルトの名無しさん :04/06/22 12:59
だな。整数型はオブジェクトでなくて即値という側面もある。
Windows上もクソも、RubyはOS非依存じゃん
RDってそろそろ標準添付にしてもいいんじゃないの amstd/rbparamsとかいうしょうもないパッケージに依存しない形にしてさ
>>933 .NETのクラスをそのまま利用したいってことだろ。
今あるクラスだけではなく将来新しいクラスが提供されても自動的に使えるようにしたいと。
ポータビリティの面からすると、Pure Rubyでやれるところに意味があると思うんだけどねぇ 一体.NETの何にそんなに惹かれるのか わからん
>>936 なんで適用したものを配布しないのだろうか
RDToolをWindowsで使いたいってときに、この面倒くささはたまらんね。 バイナリも誰も、難しすぎて作れないのかどうなのか。win32版配布してないし。 Rubyの標準ドキュメント形式といわれているくせにこのていたらくぶりはなんだろうか。
誰も面倒見ないってことはRDは形式としては良くないってことに気づいちゃったのかな 漏れは悪くないと思うんだけど
まぁ、あの((の連発とか、そんなに見やすいとはいえんな 分かった RDは捨てる
現状、 Ruby のライブラリとか書いた場合に、 ドキュメントはどんな形式で書いておくのがおすすめですか? 海外のライブラリとかだと、 Web 上にあがってるドキュメントは、 Smalltalk のクラスブラウザみたいなフレームのページになってることが多いですが、 あれも元ファイルは何か特殊な共通フォーマットで書かれてるんでしょうか?
>>943 ありがとうございます。これはいいっすね。
ドキュメント作成なんて、商用のちゃんとした プロジェクトじゃないとほとんどやらないしね。 そういう市場を狙っていないRubyには本来不要なものかも知れないけど、 やっぱりマニアのおもちゃとしてははずせない仕様だね。 コメントとドキュメント関連の文法・仕様はそろそろ全言語統一して欲しい。
> 全言語統一して欲しい 非現実的 無茶いうなよ
>>939 RDtoolのバイナリってどんなもんだ?
一応UMLが統一ドキュメントなのでは?
>>947 バイナリというのは間違いだった
raccはコンパイルいるけど、これは配布されてる。
しかし、rdtoolにmake要るってところで、どうも
最近のLinuxディストリには入ってないのも多いんじゃないかしら
>>946 コメント開始記号とコメント内で使うドキュメント用の
タグなり記号なりを統一すればいいだけじゃね?
それで無理が出るのってネタで作られた言語くらいだろ。
共通のツールで処理できるようになればjavadocやらRDやら再発明しなくていいし。
RDって使ったこと無いんだけど、もしかしてPerlでも使えたりするのか。
>>950 本気で言ってるとすればあなたはとてもおめでたい方ですね。
夢を見るのもほどほどにな。
パラダイムとパラダイスは紙一重。 重要さが世間に認められれば成らんとも限らんよ。
RPGツクールのHP見てきた。 Rubyっぽいマクロでかなり細かく制御できるっぽい。 やべぇちょっと欲しくなってきたよ。
956 :
デフォルトの名無しさん :04/06/23 05:46
>>945 >コメントとドキュメント関連の文法・仕様はそろそろ全言語統一して欲しい。
.NETならXMLDocで統一されている上にNDoc通せばいろんなフォーマットに出力できるのにね。
相変わらずオプソプロジェクトって多様性と非効率性を混同してるよね。
958 :
デフォルトの名無しさん :04/06/23 07:57
while True if "foo" =~ /bar/ ... という行は毎回正規表現をコンパイル?してるんですか? それとも最初に一度だけですか? 前者だとしたらオブジェクトを明示的に生成して使いまわしたほうが速くなるんですか。
% time ruby -e '1000000.times do if "hoge" =~ /foo/ then end end' ruby -e '1000000.times do if "hoge" =~ /foo/ then end end' 0.89s user 0.05s system 104% cpu 0.898 total % time ruby -e 'r = /foo/; 1000000.times do if "hoge" =~ r then end end' ruby -e 'r = /foo/; 1000000.times do if "hoge" =~ r then end end' 1.06s user 0.08s system 102% cpu 1.105 total
正規表現が固定なら1度しかコンパイルしないし、下手に変数に入れる よりそのまま書いたほうが速いってことになるのかな。
わざわざありがとうございます。 rubyでは最適化してくれるんですね。 コンパイラな言語で正規表現オブジェクトを毎回作ろうか あらかじめ作って変数に代入しようか悩んでいたところで ふと疑問に思ったので聞いてみました。 パターン文字列をキーにハッシュにオブジェクトをぶら下げておこうかな・・・
>905の話を読んでだが、、、、 ドキュメントの整備と、あと他の人が作ったライブラリなどの取り扱いを考え て欲しいな、と思う。例えばRAAとか。 perlではppmがあるけど、phpにも似たものがあってこれは便利。rubyにも同じ ような仕組みがあったら良いなと思う。pythonのライブラリやschemeならば SRFIとか。 簡単なインストールというだけではなくて豊富なライブラリがある事で安心感 すら憶える。スクリプト言語らしい環境が整う。 オープンソースなのだから誰が資金的な援助を考える前に、そうした草の根 で作ったライブラリをもっと活用する"仕組み"が必要ではないだろうか。 >907 の意見は私は反対。phpは糞とは思わない。phpの概念はある意味stdioを介すcgiとは 異なるし特殊だから始めはこの習慣を理解するのには困難だろうけれど、 Webアプリケーションの立場からすると非常に面白いと思う。それとデータベース との連携がとてもよい。これは宣伝(marketing?)の効果かもしれないけれど。 よくLAMP(Linux,Apache,MySQL,Php)と聞く。 php5になってからはコードはJava風にも書けるようになった。完全なオブジェクト指向になった のでphp5では大規模なシステム開発例が出てくるかもしれない。 eRubyがphpのコンセプトに近いですね。
>>964 PHPがクソなのは埋め込み言語な点ではなく安易な言語仕様。
参照渡しの不完全な実装方法とか
関数名が大文字小文字区別しないとか
ファーストクラスの関数オブジェクトがないとか
配列とハッシュが混ざってるとか
行き当たりばったりで同じよーなのがいくつもある配列関連の関数群とか
可変引数関数の実装方法とか…
>>966 は PHP 仕事で相当苦労してる香具師と見た。
漏れもなんだよう、 Ruby で仕事してえよう・・・
PHP って Ruby と正反対だよなぁ。 言語が悪くても環境はよさそう。インストールも楽そうだし。 ところであまり PHP 使わないからよく知らないんだけど、 Ruby + mod_ruby + eRuby + Ruby/DBI でPHP と機能的に同等に なれるもの?
969 :
デフォルトの名無しさん :04/06/23 19:42
for ループで1から120までの整数を出力する。二重ループは使わない。 24の倍数を出力した直後に改行を入れる。 それぞれの数値は4桁(あるいは空白+3桁)の幅で出力される。 for i in ???? ??? end このプログラムを教えていただけないでしょうか。。本当にわからなくて・・
971 :
デフォルトの名無しさん :04/06/23 20:23
すいません・・どうしてもわからないんです・・。
1.for ループで1から120までの整数を出力する。二重ループは使わない。 2.24の倍数を出力した直後に改行を入れる。 3.それぞれの数値は4桁(あるいは空白+3桁)の幅で出力される。 1.だけのプログラム, 1.2.だけのプログラム。1.2.3.を満たしたプログラム と順番に拡張しながら作っていけばいいよ。で、どこが分からないんだ?
973 :
デフォルトの名無しさん :04/06/23 20:33
>>968 drubyで簡単にアプリケーションサーバ立てられるところがよいと思う
クラスタリングも自由自在
ウェブ層の分離ができているとテストしやすいしメンテナンスしやすい
Javaよりはるかにによいと思うよ
さすがにインタプリタがJITコンパイラよりいいって事はないよ
>>974 それは「いい」の基準によると思うけど。
処理速度しか頭に無くない?
>969 Rubyだと 「1から120までループ」のような処理に for 文はあんまり使われないような
マジで?
実は全然わからないのです・・ for i in 1 . . 120 @はでいいのでしょうか?? どの記号を入れればいいのかも全然わかりません・・
いいかどうか聞く前に自分で試してみろよ、と。
学校でruby教えるの?
rubyを学んでるのですが、先生の作ったテキストなので、何が何だかさっぱり。 ABの意味が全然わからないので、試しようもなくて・・
今まで貰ったテキストがあれば出来るでしょ ここは宿題スレじゃないから煽られないうちに移動した方がいい
それくらい教えてあげればいいだろ。 お前みたいなへそ曲がりがRubyコミュニティの評判を貶めていることに気づけよ。
>>983 そういいながら教えないお前はちんこでも曲がってるの?
>>969 for i in 1..120
printf "%4d%s", i , i%24==0 ? "\n" : ""
end
こんなんでいいのかな。
全然面白くも楽しくもないな。
授業中寝てた分をここで補講してやる必要はないな
>>985 ありがとうございます。
クラスメートに質問スレでは983のように煽ると答えが出てきやすいと
教わったのですがうまくいきました。
>>987 こっちの方がお勧めだ。
for i in [false]
a = Array.new(5) {|i| Array.new(24){|j| i*24 + j + 1 } }
s = a.map{|i| i.map{|j| '%4d' % j }.join('') }.join("¥n")
print s
end
皆さんありがとうございました。。私が本物の969です。 私のせいでご迷惑かけてすいませんでした。。
D言語の組み込みスクリプトとしてサポートされたら面白いだろうな 他のスクリプト言語が既にポーティングされてるらしいけど、愛称はこっちのが良さそう
疑問が2つあるのだが、 1. どっかの学校では Ruby で授業があるのだろうか。 2. その学校では Ruby でわざわざ for を使わせてるのだろうか。 1.だけだと羨ましいが、2.も込みならそんなでもないな。
ここ最近forなんて使ってないな・・・
おれforのが好きだなイテレータって字面が醜い
言語依存で教える方がきもいだろ
言語依存のない言語の関発キボンヌ
~$ruby -e '(1 .. 120).each { |v| print sprintf("%03d ", v); puts if v % 24 == 0 }'
for をありがたく使ってるうちはまだ子供 inject を使いこなすようになればズルムケ
レスだけみると教育には向かない言語だなとわかる WSHとか使ったほうが良かったんじゃねーのかなw
inject が好きだが、2つのブロック引数の どっちがどっちだかなかなか覚えられないのがつらい
ム板で丸付き数字使うな。 しかし、こんなしょーもないレスでこのスレも終了か。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。