プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
o2
7 :
デフォルトの名無しさん :2006/07/28(金) 18:37:03
rakeについてお聞きします。 rake cleanにデフォルトの削除ファイルを設定したいのですが、 デフォルトでは、*.bakなどが追加されています。 *.bakが削除されないようにしたいのですが、どうしたらよいでしょうか? CLEAN = Rake::FileList["**/.hoge"] では、*.bakがふくまれないのですが、 警告がでてしまいます。
どういった警告でしょうか。
>>前スレ994 mswin32版1.8.4で、getsをsleep 0.1 while trueに変えるだけで、 CPU時間を浪費せずに正しく動作するわけだが。 お前さんはいったい何を使ってるのかね? というか、そもそも、Thread.list.each{|t| t.join}もCPU時間を 浪費しないわけだが・・・
10 :
7 :2006/07/28(金) 19:18:48
警告は、 hogehoge/rakefile:6: warning: already initialized constant CLEAN です。 ようするに、CLEAN定数で初期化ずみだからだと思うのですが・・・ CLEAN.new("**/.hoge") とすればいいのかと思ったのですが、 undefined method `new' for []:Rake::FileList といわれてしまいます・・・
>>10 よく知らないけど、CLEANってトップレベルで定義されてるの?
であれば、
class Object
remove_const(:CLEAN)
end
CLEAN = Rake::FileList["**/.hoge"]
で、警告も出ないと思う。
しかし、Rake::FileListには特定の要素を削除するメソッドがあったりしないか?
14 :
7 :2006/07/28(金) 20:14:54
>>13 そうです。警告出るんですが一応動く。警告
exclude試しました。で上手くいきますね。
サンクスです。
すいません・・・どうも。Ruby凄く興味あったもので、 こんなにメリットが多そうな言語がなんで馬鹿にされてるのかなと思って。 でもRubyが出来ても就職にはそんなにメリットないというご指摘もあったので もう少しPerlやPHPを頑張ってみようと思います。
就職に対してはプログラミング言語の勉強なんてメリットなんもないよな 教科書のサンプルなぞれる程度の「実力」なんざ最初から無いほうがありがたい とかいう話はプログラマ板で腐るほど出てるので覗いてみるといい
いや、PerlやPHPができますとか言われても「ふ〜ん、それで?」なんだけど。
何を言う
>>15 が就職までにいくつもの有用モジュールを作り上げる有名学生プログラマとして
その言語界で名を馳せるようになるかもしれないじゃないか
それくらいになれば趣味でLL使ってプログラミングしてますとか抜かしても一目置くぞ
てかそういう細かい話は板違いなんだってば
そうなんですか、 みなさん作りたい物があって、 それにRubyが適しているから使っている感じなんですかね。 私も作りたい物があってプログラミングを勉強してるんですが、 やっぱりある程度、色々な言語が出来たほうが、 応用効くかなって、そんな事考える暇あったら、 どんどん実際に作ってみたほうがいいのかな。
いいからうせろ
>>21 幼児じゃないんだからイヤイヤしても意味ないぞ
別に作りたいものがあってRuby始めたわけじゃないけどな。 便利だから使ってるだけだ。
>みなさん作りたい物があって、 >それにRubyが適しているから使っている感じ 当たり前だ セカンドショットもラフもグリーンも全部ドライバー使うような猿と一緒にするな
わいはサルや!プログラマー猿や!!って 誰かがその振りを受けないと若年層には理解出来まい。
ひょっとしてドライバーって VB や Lisp のことを 暗喩しているのでしょうか?
つっこみアリでも理解されていないようです
CGIをCで書く香具師は(いない訳じゃないが)おらんし シューティングゲームをRubyで書く香具師もおらんだろうな
read.cgi は C みたいだけどな
STGをRubyで書く人間もいないわけではない まぁ、エフェクトバリバリのゲームとかは現状無理っぽいけど
2ちゃんねるのCGIの一部が有志によってCで書かれてるのは単純に速度と使用頻度と負荷の問題 教科書的にはPerlなんかのCGIをCで書き換えることはあまりワリに合わないわけなんだけど 2ちゃんねるの場合はCで注意深く作って速度を上げる手間対効果すら重要だったわけ まあその割にはひろゆきがへんなのちょこちょこいれてるわけだが(w
>>15 どんなにinputしても誰からも認めてもらえない。
(資格や学歴も含めて)outputしたものが全て。
いかに効率よくoutputするかを第一に考えて
必要なものだけinputするようにしろ。
就職負け組のニートが過去の反省を踏まえて言うんだから
間違いない。俺と同じ轍を踏むな。
天国へ至る道は地獄へ至る道を熟知することである−マキャベリ
気付いたときには手遅れ 厳しいけど漏れもがんがる
35 :
デフォルトの名無しさん :2006/07/29(土) 20:49:06
一概にワリに合わないということは無い。 GNU cgiccやboostを活用すればコード量的にはむしろ減るわけだが。 あとはミドルウェアやライブラリの都合だろう。 PerlではOLEDBテンプレートは無理だし。
boostを使おうがC++で書いてる時点でコード量はヘラねーよアホ。
>>33 「inputしすぎたのが原因でoutputが出来なかったので就職出来ませんでした」ってこと?
アホ?
>>38 お前がアホ。
37の意訳が違うというなら
「必要なものだけinputするようにしろ。」という一文が意味不明
どっちかというと、多くの人はinputしなさすぎでoutput出来ない 必要なものだけinputしろ? こんな抽象的な文言、アドバイスにもならん。 それが必要なものかどうかをどう判断する?inputしないと大抵無理だろうが。 よって33がアホ
もういいなら黙ってればいいのに。
俺も
>>33 には同意しないが、
>>33 が言ってるのは、
「世間ではoutputされたものが全てとみなし、どれだけinputしたかは
評価しないので、何をoutputするのかを考えてinputしろ」
ってことだろ。
なにを一生懸命反論してるのやら。
言い換えると「世間様では結果出してなんぼ」だな 批判される思考形態ではあるが一面の真実ではある
就職で有利になりたければ、プログラミングなんか勉強しないで TOEIC730点以上とかを目指したほうがいいよ。
ぶっちゃけそれもどうかと思うが ともあれ「Rubyを勉強してます」程度のことが就職活動で有利になることはない 面接の話のネタにはできるかもしれんがそれは別にRubyでなくてもいいな
いやいや、国内組み新卒TOEIC730点はかなりのインパクトだぞ。
えいご漬けで PR したらネ申
かつて英語できるけどPC全然使えない馬鹿な新人がいたな
英語はオプションとして大きく評価はされるけど、基本は本業だからね。 英語自体を本業にしたいなら、TOEICは900点超えないとダメだろう。 というかTOEIC程度の易しい英語テストで評価できるんだろうか。 よく知らんけど。
めんどくさいし結論も出ないんだからからマ板でやれって
>>51 がいいこと言った!
まったくもっってまんこくさい
53 :
デフォルトの名無しさん :2006/07/30(日) 14:08:54
Exerbというのを知って、rubyインタプリタとスクリプト(および周辺ライブラリ)を 統合してしまうアイデアに感心したのですが、 いっそのこと、ruby(と周辺ライブラリが)丸ごと一つのexeになってるインタプリタってありませんか? 要は、インストールも解凍もパスの設定もなんにも要らずに ただフォルダにexeとスクリプトさえあれば動いてしまうような、そんなのが欲しいんですけど…
そこまで隠して何がしたいんよ
56 :
53 :2006/07/30(日) 15:01:23
>>54 別に隠したいわけじゃないんですけどね
>>55 Exerbでもなんとかやりくりすれば似たようなことできそうなのは分かりますけど
既にだれかが作ってないかなぁと思って聞いてみました
そもそも >要は、インストールも解凍もパスの設定もなんにも要らずに >ただフォルダにexeとスクリプトさえあれば動いてしまうような、そんなのが欲しいんですけど… をするために Exerb があるんだよ exe only スクリプトさえ不要
58 :
53 :2006/07/30(日) 15:21:55
うむー、Exerb で exe にしちゃうとスクリプトの修正が難しくなるわけで ちょこっと動作を変えたいときとかexe単体だとどうにもならないんですよ(やりようはありますが…) 今のところ、元々のスクリプトで何かファイルを読み込んで expr する仕様にしておいて exe化した後でも、外部のファイルを修正してメソッド上書きで凌げるようにはしています そんなわけで統合型インタプリタのexe一本とスクリプト一本(とnotepad)さえあれば イケるような環境があると嬉しいなぁと思ったわけです なければないで、なんとかやりくりするんですけどね
一発でexe化するスクリプト書いて毎回exe生成するとか
60 :
59 :2006/07/30(日) 15:40:49
ごめん読み直したら解答になってなかった
>>58 > うむー、Exerb で exe にしちゃうとスクリプトの修正が難しくなるわけで
> ちょこっと動作を変えたいときとかexe単体だとどうにもならないんですよ(やりようはありますが…)
exerbでバイナリファイル化するにしたって、
あとで置き換えたいファイルをexerbのレシピファイルから
外してしまえばいいんでない?
レシピファイルに記載されたファイルしかrequireできない、
ってことはないよね、多分。
62 :
53 :2006/07/30(日) 20:01:58
>>61 ついさっき試してみましたができました
これなら main.rb を require するだけのスケルトンを作って
main.rb レシピから外すだけで、ほとんど外部に追い出すことができそうです
あとは、いろいろな用途に使えるように、付属ライブラリを列挙したレシピを作れば
目的のものなりそうです。既にそういうレシピが転がってると嬉しいんですけど…
いまそれができないかソースの書き換え中です
具体的にはIniParamクラスのinitializeメソッドをexeから外出しして
ユーザーが(rubyの知識が必要にはなるけど)カスタマズできるようにしたいです
それと後々の可能性を考えて、多言語対応が必要になる部分も外出しできるように修正中です
63 :
53 :2006/07/30(日) 20:06:45
あらら、、スゲーミスしちゃった。後半の4行は推敲中の文章を消すのを忘れて送信しちゃいました 文章繋がらなくなっちゃってスミマセン
頭悪いなコイシ
悪かったなイトシ
無茶苦茶でござりまするがな〜
拡張ライブラリなら--with-static-linked-extで 全部スタティックにリンクされるがな。
コンパイラを持っていないWindows版Rubyユーザって結構いそう。
ASRにExerbが含まれるようになったから、そういうユーザが今後増えるかも。
そういう人達には
>>67 の方法は辛そう。
69 :
53 :2006/07/30(日) 22:17:49
>>67 レスありがとうございます。ソレいいですねぇ、どなたか配布されてませんかね?
Windowsのアクセス権の都合上、cygwin版は使い勝手が悪くて
mswin32版を使わせていただいてるのですが、VisualStudioがないんでコンパイルできないんですよ
いま C:\ruby\lib\ruby\1.8 の rb と so をすべて Exerb のレシピに追加して
require File.basename(ExerbRuntime.filename).gsub(/exe/,'rb')
として実行時のファイル名と同じ .rb を実行する exe 作ったとこなんですが
upxで圧縮しても1.4MBとかなりデカイんですよね、フロッピーに入るので御の字なんですけど
>>68 あはは、まさしくその通りなのです。誰か作ってくり〜
ASRは外部DLLも含んでるから、
>>67 だけじゃ完全に単一ファイルにはできんな。
exerb使うのが一番確実と思われ。
ttp://moonrock.jp:23000/ > Ruby初心者スレッドPart7を読んで、全添付ライブラリを
> 一つにまとめた実行ファイルの為のレシピを作るスクリプトを書きました。
# permalink が長すぎてコピペしにくい……
>>69 VisualStudioがないならMinGWをつかえばいいじゃない
というか何でもかんでも他人の労力に頼るな
cygwin上でで CC='gcc -mno-cygwin' としてコンパイルするのがたぶん楽
a = ["", "8473", "8701", "4765", "3749", "8735", "8882", "4284", "2799"] こういう配列から8473を消そうと思い p a.delete("8473") とすると "8473" と表示されてしまいます。使い方を間違えてるんでしょうか?
はい
目的に対しての delete の使い方そのものは間違ってないな
きちんと実行されているかどうかを確かめるためにpでデバッグ表示してるんだろ とかいう動作を期待して使ってる風でもない気もしなくもなく delete は要素の削除が成功したらdeleteした要素を返す a.delete("8473") を p で表示させるように書いてるんだから "8473" と表示されるのは正しい動作 つーか、その後 a がどうなってるかくらい確かめようぜ
79 :
7 :2006/07/31(月) 17:36:45
ども、deleteの使い方を今日は覚えました でもこの動作は直感的じゃないような気がする
>>80 ふむ。
じゃあ80が思うところの直感的動作を書いてみてよ。
>>81 deleteで指定した要素が除去された配列が表示される
>>82 ふむ。
じゃあその場合deleteされたのか1個もされなかったのかはどうやって判定するの?
>>83 deleteがオプションでもう1個引数取れるようにして
その引数名の配列に削除された要素を入れるってのはどうよ
そんなんだったら単純にbooleanで返してくれる方がまだ良いだろ。
popもshiftも取り除いた要素を返すから、それと同じと思えばいいんじゃね?
たぶん、80の人は、 非破壊的メソッド delete と、 破壊的メソッド delete! があれば 納得すると思うけど、どうか。
非破壊的なら find_all なり reject なりを使えばいいじゃない
>>87 じゃあ
push!
pop!
insert!
shift!
unshift!
も実装しないとな
あと
clear!
replece!
も必要だな
>>89 別にその程度なら実装しちまえって気もするけどな
>>89 実際、insert と insert! はたまに欲くなる。
作れば?っていうのはその通りなんだけど、
今さらinsertの挙動が変わると、それはそれで困る。
なんか、よいメソッド名ないかなーと考え始めた段階で
どうでも良くなるのです。
>89 その世界では、!なしの pop とか unshift とかは何を返すの?
self が返って、メソッドを繋げたいのではなかろうか
俺はこうしてる class Array def deleted(arg) self.delete(arg) return self end end
先生、受動態メソッドでselfが返るのには強烈な違和感を感じます
うーむ、MinGWでrubyのコンパイルやってみたんだが罠ありまくり(以下チラシの裏)
前提として
>>53 で書いたように、スクリプトも含めた添付ライブラリ全てを内蔵したいので
Exerbで統合する方向性です
安定版の1.8.4は、Cygwin+MinGWではtimezoneが重複してるとか
様々なコンパイルエラーがでまくったので放棄しました
ここで1.8.5系に逃げて、Cygwin+MinGWやMinGW+MSYSでコンパイルは問題なく
rubyの動作も問題ないんだけど、Exerbで統合したバイナリが
Win32 APIのエントリポイントが無いとかで実行できませんでした。
調べてみると、Exerbのコアは1.8.4がベースのようで、io.cにrb_io_set_nonblock関数がないので
実行できないんじゃないかと思いました。しかしながら、コアのソースはVisualStudio用になってるみたいで
改造は断念
しかたないので1.8.4に戻して、MSYS-1.0.10とMinGW-3.1.0-1の組み合わせでやってみたら
ようやく上手くいきました。Exerbで統合後、WindowsXPインストール直後のマシン(Vmware)で
きちんと動作しました。やれやれだぜ。
その他にもメイン環境がXP 64版だったため、MSYSが動かなかったりとか罠がありすぎました
ちなみに、--with-static-linked-extはExerbバイナリ実行時にnkf.soの呼び出しに失敗するのでダメでした
--disable-sharedは、Exerbバイナリ作成時にエントリポイントが見つからないのでダメでした
ここまで来て、わざわざmingw32版でExerb統合する意味ないじゃんと思いましたけど
統合後にUPXで圧縮したら 1.13 MBになったので、mswin32版より小さくなったのが唯一の救いです
関係ないけど、ググって調べてる過程で山田オルタナティブ(Winnyで配布されるウイルス)が
Exerbで作られてるらしく、Exerbバイナリがウイルス駆除ソフトで誤検知されるという記事を読みました
http://www.itmedia.co.jp/enterprise/articles/0604/04/news003_2.html 今後、Exerbバイナリを配布する上で問題になりそうなんですが、誤検知するウイルス駆除ソフトって
どれなんでしょうね?手元のSymantec AntivirusとAVGでは誤検知されないようですが…
[ruby-list:41698] Exerbコアからのトロイの木馬検出について
>>96 > ちなみに、--with-static-linked-extはExerbバイナリ実行時にnkf.soの呼び出しに失敗するのでダメでした
kwsk
勝手に推測すると、Exerbが使うRubyをすげかえる場合は、 coreを入れ替えてExerbを作り直す必要があるのではないか?
>>99 Exerbコアにnkf.soが取り込まれてないからだと思います。
*.soを取り込んでいないExerbeコアと、
--with-static-linked-ext で*.soが欠けている状態の添付ライブラリを
統合する形になるので、出来上がったバイナリで*.so呼び出しに失敗するんじゃないかと…
iconv.dllとか、*.soがダイレクトに外部dll呼び出してるようなやつは
一つのexeに統合するのは難しいでしょうね。
添付ライブラリまとめられるだけでも、まxまぁ御の字かと…
だからnkf.soを取り込んであるExerbコアを作ろうってことでMinGW入れたんじゃなかったんだっけ? recipe.ja.htmlを見るとDLLも取り込めるようなことを書いてある気がするけど、まだ試してない。
MinGWでExerbコア作るのはもうこりゃ全然ダメ、というのがわかった。 VC買った方がよさそうだネ。
1.8系ならexerbでnkf普通に使えると思うが
104は今までの話の流れをちゃんと読んでから出直せ。
vc6って今でも買えるん?
無理じゃない?
Exerbのソース眺めてみたら、Win32APIのLoadLibraryやGetProcAddressといった エントリポイントはフックしてるみたい。なのでdll組み込みも可能っぽい。やったことないけどさ… 具体的にはKernel32.dllのプロシージャテーブルにあるファンクションへのポインタを 自前の関数へのポインタに書き換えてフックする。で、LoadLibraryが呼ばれたら 該当のファイルがExerbコンテナにあるか探して、あったらテンポラリファイルに書き出して LoadLibraryしてるみたい。ちなみに*.soファイルも一度テンポラリに書き出してからLoadLibraryしてる このへん、LGPL的な解釈としてはどう扱われるのか個人的に興味あったりするけど あれって日本語参考訳でも難解すぎてワケ分からん。誰か上手く解説してくれませんかね? ExerbのMinGW化は、ざっと眺めた感じではやってできないことは無いと思うけど、 個人的にメリットが無いのでやりたくない作業。GNU的にはMinGWでできたほうがカッコいいと思うけど… それとテンポラリに書き出すのはあまり美しくないから、思想的な問題か? で、mingw32版でサイズが減った件は、単に添付ライブラリが少ないからでした mswin32版にはtkとかopensslといった、rubyのソースには無いライブラリがついてるんですね
109 :
デフォルトの名無しさん :2006/08/01(火) 20:02:42
xml-rpcを使ってブログに投稿するスクリプトを作ってるんですけど、
FC2ブログとDTIブログは上手く投稿できたのですが、
Seesaaブログとココログは上手く投稿できません。
Seesaaとココログに投稿するにはどうしたらいいですか?
投稿できるFC2&DTIと投稿できないSeesaa&ココログの違いは
FC2&DTIが文字コードがeuc-jp
Seesaaはshift-jisでココログがutf-8
それとFC2&DTIはブログIDが0で投稿するのに対し
Seesaa&ココログはブログIDを指定しなければならないことです。
ブログIDは入れたのですが、文字コードを変換して送るのはどうしたらいいのかわかりません。
ここを見て色々試しました。
http://blogpet.18g.net/pukiwiki.php?Blog%C2%D0%B1%FE%BE%F5%B6%B7 エラーメッセージ
C:/Program Files/ruby-1.8/lib/ruby/1.8/xmlrpc/parser.rb:152:in `fault': wrong fault-structure:
{"faultCode"=>"Client", "faultString"=>"Application failed during request deserialization:
\nnot well-formed (invalid token) at line 1, column 320,
byte 320 at /usr/local/perl-5.8/lib/site_perl/5.8.5/i686-linux-thread-multi/XML/Parser.pm line 187\n"}
(RuntimeError)
実行環境
Windows XP SP2
ActiveScriptRuby
ruby 1.8.4 (2005-12-24) [i386-mswin32]
ソース
require "xmlrpc/client"
content={"title" => "記事のタイトル", "description" => "本文の内容"}
server = XMLRPC::Client.new2("
http://blog.seesaa.jp/rpc/ ")
r = server.call('metaWeblog.newPost','blog の ID','blog のユーザ名(アカウント)','blog への login 用パスワード',content,true)
>>109 なんでrubyなの?コメントスパム用のスクリプトと違う?
nkfやiconvがdllなしで動かないのは、それらがスタティックリンクできるようにインストールされてないから
だろうね。
だから、nkfやiconvをスタティックでビルドしてインストールし、そのあとrubyをコンパイルすればいいはず。
zlibとかgdbmとかはそれでdllのいらないsoを作ったことがある。
で、1.8.4を使うなら、
ttp://ftp.ruby-lang.org/pub/ruby/binaries/mingw/1.8/ にあるmingw32のrubyなら、zlib,curses,readline以外はスタティックリンクになってるみたいだから、
ここからnkf.soやiconv.soを持ってくるだけで動くと思うよ。
>>108 >mswin32版にはtkとかopensslといった、rubyのソースには無いライブラリがついてるんですね
ext/tkやext/opensslを見たことがないのか?
なんで
>>96 が一からRuby作り直してるのか漏れには分からん
add_extension_library nkf.so ./exerb_ext/nkf.so
>>112 ここは初心者スレッドです。
誰もがあなたと同等の知識を持っているとは思わないこと。
いや俺自身も良く分かってなかったんスよ --with-static-linked-extにすれば何かいいことあるのかと思ってやったら 別に大したことなかったわけで、単に*.soが消えただけだし Exerbのコアのことも全然理解してなかったし、トラブルに遭遇して調べてみたら Rubyのインタプリタが丸ごと(正確にはmsvcrt-ruby18.dllの部分が)コアってことが分かったくらいだからね まぁ、前からCygwinの開発環境も整えたいとは思ってたんで、いい勉強になったと思うことにするよ ここ初心者スレなんだから、あまり上から見ないでくれよ。最初から全部理解して使ってるわけじゃないからさ
おまいさんが質問してからでも ここで何度も指摘されたことだが? ひとの話聞かないからそうなる
>>114 もう全員初心者ってことで良いよ。おしまい。
>>115 もとから上も下も無いんだけどね。
>--with-static-linked-extにすれば何かいいことあるのかと思ってやったら
>別に大したことなかったわけで、単に*.soが消えただけだし
どんな夢のような機能を頭に描いていたのだろう。
>>116 たとえばどのレスでしょ?初心者って言葉を免罪符にするつもりは無いけど
なにかしら誤解してしまったのかも知れませんね。こちらの理解力が足りなかったら謝ります
>>117 最初から言ってるように、俺は全部丸ごと一つに纏めたインタプリタが欲しかったんで
*.rbのライブラリまで含めたexeができるのかと思ってました
Exerbでできるんだから、ruby自体に元々そういう機能が備わってるのかな、と思った訳です
>>117 その発言態度を「上から」と言わずしてなんと言おうか。
あーあ、心無い馬鹿一人の為に
>>199 の疑問はもう2chでは解決しなくなっちゃったね
>--with-static-linked-ext にすると良くないことの方が多いと思う。 Exerbの場合、必要なsoだけ列挙して結合出来るから exeを小さく出来るメリットもあるはずなのに、 それをわざわざ潰すような使い方してるのは何故でしょうか。 Exerbに関してぐだぐだ文句言う前にマニュアルくらい読んだらどうですか?
ああ、soの意味を分かってないのか、納得した。
>ここまで来て、わざわざmingw32版でExerb統合する意味ないじゃんと思いましたけど >統合後にUPXで圧縮したら 1.13 MBになったので、mswin32版より小さくなったのが唯一の救いです サイズ気にしてるのにどうして・・・
>>119 >こちらの理解力が足りなかったら謝ります
理解力が足りなかったというより
自分が常に正しいと思い込んでるから
ひとの話が耳(目)に入らなかっただけでは?
なんつーか、いちいち質問者にケチつけるのやめろよ。 答えたくないならスルーで。
>>126 こんなところで日ごろのうさを晴らさないで下さい。
煽りはスルーで。
>>126 君の発言、全部「?」で終わってるよね。
131 :
109 :2006/08/01(火) 23:40:54
>>110 スパムになんて使いません。
xml-rpcで調べたらRubyの判りやすいサンプルが出てきたので
俺は質問してる奴の質問方法に問題があると思った。 知識自慢はいいから、聞きたいことだけズバッと書け。
>>122 >>124 うーん、最初のほうで書いてるんだけど、途中から割り込んで
切り取った部分だけ読んで反応してませんかね?
特定のスクリプトを走らせるだけなら機能絞り込めますけど
rubyに添付されてるライブラリを含めたインタプリタ(一つのexe)が欲しかったんです
なるべく汎用なものが欲しかったんですよ
いま使ってるのは、全部の添付ライブラリをExerbで統合したもので
require "main.rb"するだけのexeでして、肝心のmain.rbは統合してないので
ふつうのテキストエディタで修正可能な状態になってます
要は、Exerb統合バイナリ(添付ライブラリ同梱)と、main.rb(notepadで修正可能なスクリプト)
という組み合わせでして、main.rbはいくらでも自分のやりたいスクリプトに置き換えできるんですよ
だから全統合型のインタプリタが欲しかったんです。
この説明で分かって頂けないようなら、水掛け論にしかならないので、
以降は、この論点に関しては議論するのを避けることにします
それと、Exerbに対して文句言ってるように受け取られましたら、
言い方が悪かったかもれません。すみません。そのような意図は全くありません
このスレが名前に反して、初心者に優しくなくなってきている件
初心者っぽくない人が初心者のフリして頓珍漢なことを聞く釣りスレ
そして本スレは漫才化
140 :
109 :2006/08/02(水) 13:59:43
自己解決しました。 kconvを使ってタイトルと本文をutf-8にエンコードしたらいけました。
Rubyコンパイルするのに、VC買う必要はないよ。 VC++Toolkit+アルファでコンパイルできる Expressではできなかった
先週たのしいruby買ってお勉強中だが… 来週第2版出るんだ… ノーチェックだった…orz
第2版は店頭に並ぶまでが遠足です
PythonのenumerateみたいなことRubyではできませんか?
うおおおおおおおおおおおおおおおおおおおおお Ruby関連本出過ぎぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃぃ
railsどれがいいんだろ
個人的にはatron本
>>146 こゆこと?
for i,e in enumerate(["a","b","c"]):
print i,e
なら、
["a","b","c"].each_with_index {|e,i| p i,e}
正直、待ちすぎてプログラミングするの飽きた。
>>111 nkf.soは外部のDLLには依存しない。
static-linked-extなら$"に全部入っているから、
>>108 のようにテンポラリに
書き出したりする必要はないと思うんだが。
http-access2で2chに書き込むスクリプトを作っています
2chのbbs.cgiにPOSTするときには、
POST
http://pc8.2ch.net:80/test/bbs.cgi HTTP/1.0
というふうに、host名を含んだ絶対パスを指定しなければならないのですが、
http-access2は
POST /test/bbs.cgi HTTP/1.1
と言うふうに、ホスト名を省略してしまうようです。(横取り丸というproxyソフトで確認)
結果、2chのサーバーからは404が返され、POSTは失敗します。
似たような問題にあった人がいたら解決方法を教えてもらえませんか。
スクリプトで2chに書き込まないでくれよ
>>156 毎日ある会社の株価を取得して貼っているんですが、
定型作業なのに面倒なので、自動化したいんです
なんぼでも悪い応用verができそうなことを 親切丁寧に解説する奴がいると思う?
ただでさえ、最近2ちゃんは不安定だからな。
ruby と http-access2 のバージョンくらい書くべきだと思う
>host名を含んだ絶対パスを指定しなければならない こんな仕様あったっけ?
httpの仕様にあってないし、それはないかと。 プロキシを通してでアクセスするときのリクエストに見えるね。 きっと横取り丸を通すことで、そういうリクエストになったのだろう。 とりあえずいまのあなたには無理だからやめときなさい。
>>161 ruby 1.8.4 on cygwin
http-acceess2 2.0.6
です
>>162 2ch側からはこういうのが返ってきます
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /test/bbs.cgi was not found on this server.</p>
</body></html>
>>163 proxyを介さず、直接接続しても↑の結果になります
リクエスト情報の比較を貼ります
cookieのホスト名のところは控えさせてください
2chブラウザからの書き込み
POST
http://anime.2ch.net:80/test/bbs.cgi HTTP/1.0
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 99
Host: anime.2ch.net
Accept: text/html, */*
Referer:
http://anime.2ch.net/iga/ User-Agent: Monazilla/1.00 (JaneStyle/2.40)
submit=%8F%91%82%AB%8D%9E%82%DE&FROM=&mail=sage&MESSAGE=test&bbs=iga&key=1153958428&time=1154600574
rubyスクリプトからの書き込み
POST /test/bbs.cgi HTTP/1.1
User-Agent: Monazilla/1.00 (JaneStyle/2.10)
Referer:
http://anime.2ch.net/iga/ Content-Type: application/x-www-form-urlencoded
Accept: text/html,*/*
Host: anime.2ch.net
Connection: close
Date: Thu Aug 03 19:27:55 GMT+9:00 2006
Content-Length: 99
Host: anime.2ch.net
MESSAGE=test&time=1154505452&submit=%8F%91%82%AB%8D%9E%82%DE&FROM=&mail=sage&bbs=iga&key=1153958428
すみません 解決してしまいました。 よく見ると rubyスクリプトの方には Host: anime.2ch.net が2つありますね。 1つにするようにソースをいじったら書き込み成功しました ごめんなさい
String#/ が無いのは何故ですか? class String def /(pattern) self.split(pattern) end end ["foo", "bar", "baz"] * "," # => "foo,bar,baz" "foo,bar,baz" / "," # => ["foo", "bar", "baz"]
split のマニュアル見るとわかるかも
見たけどわかんないや。
オモロいかも。 pattern が正規表現リテラルだったら読みづらそうだがw "foo bar baz".split(/ /) → "foo bar baz" / / /
>>145 のたのしいRuby第2版が店頭に並んでた
この言い方からわかると思うが手に取っただけで買わなかった(w
CUIのプログラムで矢印キーで メニューを選択できるようにしたいのですが, 簡単にできるライブラリはあるでしょうか? 参考になるサイトなど教えていただけるとありがたいです.
>>172 高度な機能はないがruby付属のcurses
>>173 やっぱり自分でウィンドウ作ってメニュー書いてってしないとダメですかorz
よくありそうなので楽できないかなあと思ったのですが…
>>174 RAAは見た?
TUIの項目にそれらしいのがいくつかあるけど。
176 :
デフォルトの名無しさん :2006/08/06(日) 07:11:58
3項演算子で、?と:を縦に並べるのをperlでよくやってたんですが、 rubyだと無理ですか?
p 1 == 3 ? \ 7 \ : \ 8
だせぇwwww なんだ、そりゃwwwww
夏だしARIAについて語ろうぜ
アリャまぁ。
rubyって奇跡でできてるんだよねー
恥ずかしいセリフ禁止っ
今日もRubyの素敵を探して
なんなんですかっ、言語オタクですかっ、言語オタク気取りなんですかっ!
>>175 rubytui と ncurses-ruby を見てみましたが
まだ私のスキルでは難しそうでした.
サンプルとかあるとうれしいんですが
1版読み書けなのに 無駄に2版買ったぜ 2版でるなら1版買う前にいえよ糞め さて1版どうすんべか
ちょうだい
たのしいRubyって糞本だよな。 断片的な情報しか紹介してねえ。 初心者がこれ見て何か組めるかってったら組めないよ。 それに全然楽しくないしな。
>>188 あなたにはレシピブックをお薦めします
さておき、たのしいRubyが糞本だという意見に反論したいが
実際に読んだ初心者(or元・初心者)の感想がないと何とも言えないな
190 :
175 :2006/08/06(日) 23:37:36
>>185 すまん。それらしいものがあるという事を知ってただけで
使った事はなかったんだ。試しにその2つとrdialogを見てみたが、
どれも望みのものとは違うようだ。
外部コマンドを使って良いのならdialogとかiselectとか
shmenuとかを呼ぶのが楽かも。
>>177 バックスラッシュを使わないと無理なんですね・・・
あきらめて普通の制御構造にします・・・
>191 ケータイからでスマンが、実は()で括ると出来たりしない?
>>192 無理。
そもそも何がやりたいのか分からんし。
if 〜
then 〜
else 〜
end
じゃ駄目なんだろうか。
Ruby/SDL で mixer の初期化に失敗するのですが、どなたか解決法ご存じでしたらご教授よろしくお願いします。 ディストリは CentOS 4.3 $ uname -srvmpio Linux 2.6.9-34.0.2.EL #1 Fri Jul 7 19:24:57 CDT 2006 i686 i686 i386 GNU/Linux $ruby -v ruby 1.8.4 (2005-12-24) [i686-linux] SDL_mixer-1.2.7 はソースからコンパイルしてインストールしました。 導入しようとしたのは Ruby/SDL 1.1.0 および 1.0.0 で、 sampleディレクトリ下の playwav.rb を実行すると /usr/local/lib/ruby/site_ruby/1.8/sdl.rb:220:in `open_imp': Couldn't open audio: Couldn't create mixer lock (SDL::Error) from /usr/local/lib/ruby/site_ruby/1.8/sdl.rb:220:in `open' from playwave.rb:7 というエラーが出ます。 該当行(playwave.rb:7)は、「SDL::Mixer.open」です。
すいません。スレ違いかもしれませんね。SDLスレに行ってみます。
>189 おれはたのしい Ruby で Ruby を勉強したよ。 「何か組めるか」って、小さなスクリプトの用途にはすぐ使えるようになって いるし、基本的な使い方の解説はきちんとしていてわかりやすくて良いと思う。 あの本は Ruby の楽しさのある面を伝えているのもあるが、著者自身の面白さ が滲み出ているのがいい本だと思う。 まあその辺の感じかたは人それぞれだろうけど。
ネットにアクセスできるかどうかはどうやって判定すればいいんでしょうか? 状況によってローカルのファイルを使うか、ネット経由でデータを取得するか分岐させたいのですが
ネット経由でファイル取得して失敗したらローカルのファイル使えばいいじゃない
いいんじゃないの?
erbなんですが、 do_erbみたいな関数を作って、erbを呼び出そうとしたのですが、 呼び出し元のローカル変数をerb内に渡せません。 なんとかする方法はないでしょうか。 def do_erb(in_file, out_file) open(in_file) do |f| tmplate = ERB.new(f.read) open(out_file, "w") do |dest| dest.write(tmplate.result) end end end def make_erb do text = "Hello, World" do_erb "hoge.txt.erb", "hoge.txt" end ---- hoge.txt.erb <%= text %>
ちなみに今は、textをグローバル変数にして、しのいでいます。 $textで
ちなみに今は、textをグローバル変数にして、しのいでいます。 $textで
do_erbを展開すればいいんじゃない?と思われるのですが、 いろいろなところから、do_erbを使いたいので・・・
>>201 これだとどう?
def do_erb(in_file, out_file, bind)
open(in_file) do |f|
tmplate = ERB.new(f.read)
open(out_file, "w") do |dest|
dest.write(tmplate.result(bind))
end
end
end
def make_erb
text = "Hello, World"
do_erb "hoge.txt.erb", "hoge.txt", binding
end
パトラッシュ?
>>201 ローカル変数の情報を渡すには、Bindingオブジェクトを使う必要がある。
>>205 のように、binding()で現在のローカル変数情報をもつBindingオブジェクトを作成し、
それをerb.result()に渡してやる。
それが省略されたときは、デフォルトでTOPLEVEL_BINDINGという定数に入っているBindingオブジェクトが使われている。
n種類のキャラクタを1回ずつ使ってn文字の文字列を作るとします。 この条件で作ることができる文字列をすべて列挙するにはどうすればよいか? 例えば、A,B,C,Dの4つのキャラクタを使う場合、 ABCD BACD BCAD BCDA CABD : みたいな結果がほしいです。 具体的なコードでなくてもいいので、とっかかりになるヒントをください。
238 名前: 1.0011(ピンボール) ◆rzOmotimAo 2006/01/04(水) 02:46:04 ID:???
>>234 「部品を何個使いますか?」
って聞かれて、
「17個」
とか数値を入力する。そんで、17個分の入力ボックスが用意されて
【A:預金準備率】
【B:窓口指導】
【C:徴税】
、、、
とか、ぽちぽち入力していく。そんで
「入力終了」
ボタンを押すと、
「配置パターン1:A→B→C」
「配置パターン2:B→A→C」
「配置パターン3:C→A→B」
、、、、、
「配置パターン289:○○」
まで、ずらずらーーっと表示される。
そんで、オレ様はそのリストをながめて、
一番いいのを選べばいいだけ。すごいでしょ?
>>210 ヒント:再帰
def func x,buf=""
if x == ""
p buf
else
(0 ... x.size).each do |i|
func x[0...i]+x[i+1...x.size], buf+x[i].chr
end
end
end
func "HEL7X"
17文字とか入れると壊れると思う・・w
そのリストがどれだけの長さになるかぐらい考えないのかなこの人w
def func x,buf=""     if x == ""         p buf     else         (0 ... x.size).each do |i|             func x[0...i]+x[i+1...x.size], buf+x[i].chr         end     end end func "CHOI_TEISEI"
218 :
210 :2006/08/10(木) 09:10:52
あぅ。寝てる間に答えが出てる。 ありがとうございます。>215
Python でいうところの if s in ('y', 'Y'): を Ruby 的にはどう書きますか?
if ['y','Y'].include?(s) じゃださいかな?
>>219 Pythonにはそんな記法があるのか!
これはぜひRubyでも欲しいな
オブジェクト指向的じゃないな
オブジェクト指向的には
>>220 のような形にならざるを得ないのかも
そうするとあまりカッコよくない…
case s when 'y','Y' end じゃだめ?
rubyのソースをexeにすることってできますか?
ちょっと言い方まずったかな? rubyのソースをコンパイルしてexeを生成することはできますか?
if s =~ /y/i とか?
>>222-223 でもRubyにも
for i in [1,2,3]
p i
end
という記法があるので、
if s in ('y', 'Y')
があってもいいと思う。
class Object def in(*args) args.include?(self) end end if s.in('y','Y') then みたいなのはどうだろ
演算子として実装するなら、include?の糖衣構文とすべきかな s in array は array.include?(s) と等価、という風に。これならHashに対しても使えるし
enumerable.include?(s) かな
include?がもうすこし短くなればいいんじゃない?
member?
"犯人".は、この中にいますか? "鈴木", "田中", "山田", "犯人" # => true
3人は無実か。
文字列としての"犯人"なら"犯人"以外の3人は無実だけど 意味的に"犯人"がいるかどうかなら共犯者がいる可能性もあるでしょ
>>238 236のメソッドを意味的に考えてみなよ
集団に対して判断基準を渡すと該当が返ってくるというのが動作としてよいと思う
犯人は田中が怪しいな。 つまりは、=== で比較すればいいってことかな。
>>240 if not members.find_all { |e| e === member }.empty? ってやれってこと?面倒じゃね?
容疑者 = ["鈴木", "田中", "山田", "佐藤"].sort{|a,b| 事件.容疑関連性(a) <=> 事件.容疑関連性(b) } puts "犯人は#{容疑者.first}だ!" # 一番疑わしい者が自動的に犯人になる冤罪メソッド
1.9 だと max_by, min_by でスッキリ書けそう。 puts "犯人は %s だ!" % 関係者.max_by { |e| 事件.容疑関連性(e) }
245 :
田中 :2006/08/11(金) 18:33:31
俺、やってないって。まじ。
>>243 それじゃ事件関連性が小さいやつが犯人になる気ガス
cookieの処理ってどうやってますか?
248 :
田中 :2006/08/11(金) 20:45:42
>>247 クライアントサイドかサーバサイドかによるな。
クライアントです
うわマジレス返ってきたよ 本気で答もらう気なんだ これで
>249 Webブラウザに任す。 自力でHTTPクライアント作ってるのなら黙ってRFCを理解しろ。
net/httpならset-cookieとget-cookieを自前で処理するのかな。 前やったことあるけど、うまくいった気がする。 WebAgentなら自動でやってくれた気がする。
どんなことしたいかくらい教えて欲しいよな
みなさんの考えるRubyの良さってなんですか? 僕は今のところコーディング量がCに比べて少なくてすむのが気に入ってます。
美しい魔闘家
Ruby 1.9マダァー?
美しく待とうか
>>229 もしかして、
>for i in [1,2,3]
>という記法があるので、
逆に
>if s in ('y', 'Y')
が実現出来ない、という関係になっていたりして。
なんでだ?寝ながら書きこんでるのか?
「逆に」を使うのは未成年だという報告が届いております。
逆に、に罪は無い
>>224 caseだとcaseの後ろに定数を置いて、whenの方に変数を置く
ことになるけど、それだとニュアンスが逆になるような・・・
まあ、それでも出来てしまうけど・・・
>>249 クライアント側でやるってことは、もうrubyの出番はない。スレ違い。(板も違う
>>263 クライアントがWebブラウザであるとはだれもいっていない。
Rubyでクライアントプログラム書くはなしじゃないか。
初心者スレは楽しいなあ
いろいろ案がでてるけど、やっぱり if s in ['Y' , 'y'] が実装されるといいなあ。
べつに include? でいいよ
forのように超便利なら入れてくれるかもしれん んで、これ超便利?
みみょ ていうか俺はforもRange#eachで書いてしまうんだが これはおかしな書き方かな? スコープがみみょに違うのは知ってるんだが 大体なんとかなっちゃうからなー
俺はfor i in 1..10みたいな書き方をほとんどの場合するんだけど、何でだっけ?忘れた。
D言語のopApply&foreachみたいなことをやりたいのですが、 どうしたらいいでしょうか。
for あんまり使わない。
ほとんど each と times 使ってる。
>>271 for の方が range#each よりも速いとかいう話が前あったけど、それじゃないかな。
でも、0オリジンなら Integer#times の方が速そう。
274 :
273 :2006/08/12(土) 12:52:51
eachとtimesとforで実際に計ってみたら、for が一番速かった。 変数のスコープの違いが速度に反映されてるっぽいね。
マジでMLに投げてみるか
yield使えば。
forなんて一回も使ったことない
ふぉうふぉうそれはそれは
>>278 そこにはopArrayという言葉はないようだが。
>>279 も書いてるとおり、inの後の式の結果のオブジェクトにはeachが定義さ
れている必要があり、そこからyieldされる値でループする。
class MyCollection
def each
yeild 2
yeild 3
yeild 5
yeild 7
yeild 11
end
end
すいません、mkexr.rbというコードが見つからなくて困ってます。 あと、.exrと.exyはどっちが新しい形式でどっちを使った方がよいですか?
285 :
283 :2006/08/13(日) 10:25:36
しまった、s/yeild/yield/g
286 :
283 :2006/08/13(日) 10:26:37
>>284 たしか、新しくyamlに移行したのが.exyじゃなかったか?
>>283 opArrayじゃなくてopApplyです。
yield使ってみます。
ありがとうございます。
すいません、これと同じ結果を得るコードを書きたいのですが、sscanf()に相当する関数はあるのでしょうか? #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ char text[]="f75632"; int i,n,data[strlen(text)]; for ( i=0; i<strlen(text); i++ ){ sscanf( text+i, "%02x", &n ); data[i] = n; printf("%d ",n); } return 0; } 実行結果 247 117 86 99 50 2
>>290 その変態コードの機能に相当するものは無い。
text = "f75632" 0.upto(text.length-2){|i| puts text[i..i+1].to_i(16)}
>>292 すげぇ。
これがモノグサ野郎御用達言語
Rubyの真の威力なのか…
Cがいかに文字列処理に弱い言語か
よくわかるな。
require 'scanf' text = "f75632" data = Array.new(text.size) text.size.times do |i| n ,= text[i..-1].scanf("%02x") data[i] = n printf("%d ", n) end exit(0)
>>266 >いろいろ案がでてるけど、やっぱり
>if s in ['Y' , 'y']
>が実装されるといいなあ。
>>269 > forのように超便利なら入れてくれるかもしれん
> んで、これ超便利?
字数が少なくて済むのが一つ。
ArrayでもHashでも、たぶんRangeでも、一つの構文で対応出来るのがひとつ。(まあどれもinclude?だけど)
あと、便利さの問題とはちょっと違うけど
Rubyでは、
if /\d\d/ =~ s then
と書くのが本来的だが、他言語の一般的な慣習に近づけるなどの理由により、
if s =~ /\d\d/ then
という書き方もみとめられている(メソッドが用意されている)と聞いている。
これと似たような理由になると思う。
俺は、比較するときはいつも、「if」 「変数」 「比較演算子」 「比較条件」の順で書く。
(他言語の一般的な慣習)
でも、if s in ['Y' , 'y'] のようなことをやりたいときだけ、
if ['Y' , 'y'].include?(s) then
のように、「比較条件」 「比較演算子(的なメソッド)」 「変数」で書くことになる。
この切り替えが毎回微妙にストレスなのだが、このストレスの部分が、
if s in ['Y' , 'y'] then
と、短い記述に置き換わったら、とてもいい感じになる。
確かに微妙なストレスってあるよな。 結構大事だよな。書き心地。
298 :
276 :2006/08/13(日) 21:52:01
>>295 よし、投げてみる。提案をまとめると
「includeメソッドの糖衣構文としてのin演算子の追加」ってことでいいんだよな?
必要な理由を要領よくまとめてくれた296に感謝
あと、ここのスレで出た案だってことは書いてもいい?
馬鹿! このスレのことが世に知れたらどうするんだよ!
なんでif s == 'y' || s == 'Y'って書かないんだろう?
301 :
296 :2006/08/13(日) 22:00:40
>>298 >あと、ここのスレで出た案だってことは書いてもいい?
良いのではないかと。ML投げよろしくです。
302 :
296 :2006/08/13(日) 22:03:36
>>300 >なんでif s == 'y' || s == 'Y'って書かないんだろう?
それは、 if s in ['y', 'Y' , 'n' , 'N' , 'q' , 'Q' , ""] のときにめんどうだから。
>>あと、ここのスレで出た案だってことは書いてもいい?
>馬鹿! このスレのことが世に知れたらどうするんだよ!
なんか、スレのこと知られたくない人がいるらしいので、内緒ということで。
>>298
例は2つではなく3つで示せ、の原則から外れてるからわかりにくいんだろうな if s in ['a', 'b', 'c', 'd'] とかのほうが混乱起きないかもしれん
なんでif s.match(/^[yYnNqQ]$/って書かないんだろう?
どうしてもPythonに近づけたい人がいるようです。
>>304 君は ['y', 'Y' , 'n' , 'N' , 'q' , 'Q' , ""].include?(s) をそう理解してるのか
>>304 う、遅かったか。
じゃあ、 if i in [1.5 ,4 ,7.2 , 9 ,12.3,45,78.1] のときに以下略
なんでいちいちArrayにしてから比較したいのか意味不明だな。 多くの要素を持つArrayの中に文字列があるかどうかを調べたいなら、 Arrayがレシーバーになるのが自然だし。
まぁまぁ。 提案するのは自由だ。
え、これって「集団の中に目的のものがあればtrue」とかそういうのじゃないの 配列から文字列を探すとかそういう限定された動作じゃなくて
なんだか変なのが沸いた
私も変数は先に、比較対象は後に書きたい派だから inかどうかはともかく、そういう書き方は欲しいかも。 無理矢理Object#in定義しても出来るだろうけどさぁ。
313 :
276 :2006/08/14(月) 09:13:55
スレを読み返していて、
>>259 で気がついたんだが
普通にin演算子を追加するとfor-in構文と被ってしまうな、どうしよう
1. if-in、unless-inに限定する
2. for-inだけ特例として扱う(forとセットで使われた場合のみ従来の機能)
>>313 inではなくて、 in? にするとか。
if s in? [1,2,3] then
どんどん気持ち悪くなっていく
Perlで1...1000000とかやるとメモリ取るとかいう話があった気がするけど Rubyはどうなの?
>>313 え?
>>229 でもいってるように、for i inがあるからこそ、if s inがあってもいいんじゃないかということでは?
>314 末尾?ならもうメソッドで良いよ if s.in?([1,2,3])
>>318 それなら順番変えて、if [1,2,3].in?(s)でもいいんじゃね?
アレ?
そもそもfor i inもRuby的じゃないんだから、if s inでいいよ。 さっさと提案してくれ。
>320 ちょwそれまんまinclude?だしw
>>317 >
>>313 >え?
>
>>229 でもいってるように、for i inがあるからこそ、if s inがあってもいいんじゃないかということでは?
>>229 で言っているのは考え方の問題。
>>313 が困っているのは技術的な実現方法。 すでにfor 〜 in があるから、 if 〜 in を
糖衣(等意?)構文として実現しようとするとかぶってしまい不都合だからどうしよう、って悩んでる。
・・・・ていう話かな?
>>318 >末尾?ならもうメソッドで良いよ
>if s.in?([1,2,3])
if s in array が技術的にナニなら、メソッドで妥協もいいかなと思う。
if s.in? [1,2,3] なら、
・短い記述 (in ほどではないが、まあいいかな)
・include?メソッドをもつものをカバー
・比較対象、演算子?、比較条件の順序で書ける。
は満たしている。
>>323 > メソッドで妥協もいいかな
すんなよ
メソッドでいいなら自力で定義しろ
他人巻き込むな
>>324 もちろん、言語として初めからあったほうがいい演算子またはメソッドとしての提案という意味。
本当にあった方がいいのか無くてもいいのかは、MLで提案されれば適切に議論されるでしょ。
別にfor inあっても大丈夫でしょ JavaScriptもfor inとは別にin演算子がある 意味は違うが
rubyはソースがendだらけになるのは困るね。 どうして{}を使わせてくれなかったのだろう。
>>313 やっぱりいくらか制限が必要だな。
p 1 in [1,2]
p 1 in (1..2)
とは書けるが、
p 1 in 1..2
とは書けないバージョン。
Index: parse.y
===================================================================
RCS file: /cvs/ruby/src/ruby/parse.y,v
retrieving revision 1.451
diff -p -U 2 -r1.451 parse.y
--- parse.y8 Aug 2006 03:28:58 -00001.451
+++ parse.y14 Aug 2006 05:39:36 -0000
@@ -2104,4 +2104,12 @@ arg: lhs '=' arg
%*/
}
+| primary_value keyword_in primary_value
+ {
+ /*%%%*/
+$$ = NEW_CALL($3, rb_intern("include?"), NEW_LIST($1));
+ /*%
+$$ = dispatch2(inop, $1, $3);
+ %*/
+ }
| primary
{
{ } だらけになるからだろ
331 :
328 :2006/08/14(月) 15:01:58
タブは無理か。 1 in 1..2 p((1 in 1..2)) は書けるが、 p(1 in 1..2) とは書けないバージョン。 どっちがいいかな? Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.451 diff -p -U 2 -r1.451 parse.y --- parse.y8 Aug 2006 03:28:58 -00001.451 +++ parse.y14 Aug 2006 05:49:40 -0000 @@ -1058,4 +1058,12 @@ expr: command_call %*/ } +| arg_value keyword_in arg_value + { + /*%%%*/ +$$ = NEW_CALL($3, rb_intern("include?"), NEW_LIST($1)); + /*% +$$ = dispatch2(inop, $1, $3); + %*/ + } | arg ;
あんま初心者スレで煮詰めるような案件でもないな 「Pyの A in B をRubyでも使いたい」って素直にMLに投げてからのほうがいいと思う
puts "x is a member of a, b or c" if true in x in a, x in b, x in c
335 :
276 :2006/08/14(月) 17:31:11
技術的な問題について書かないならruby-listでいいんじゃね?
>>335 素直にとても良く書けてると思う。導入に議論の余地はあれど、提案としてはOKではないかな。
>>336 漏れもそう思う。実装する段になったら ruby-dev に行けばいい。
>>35 >私はこうした書き方に、少なからずストレスを感じます。
と書いているのに、
>かなり書き心地が良くなるのではないでしょうか。
はおかしい。人事みたいだ。
自分がそうなれば幸福だから、というスタンスで書いたほうがいいと思うよ。
妥協もいらんわな 無理ならメソッドでもいい、みたいな
1192作ろう鎌倉幕府
非常に些細なことだけど、 > まつもとゆきひろ様、ぜひ導入をご一考ください。 Rubyの実装ってMatzが決定権持ってるの? 作者といえども、他の開発メンバと同等のレベルにしか思ってなかった。
開発メンバーも明らかにここを読んでるけどな
つべこべ言わずに、さっさとMLに投げろ
実は276は開発メンバーの一人なんだけど、 いきなり提案しても無駄だから、2chでバックを固めてから提案する、 という戦略なのかも、と妄想してみる
>>342 > Rubyの実装ってMatzが決定権持ってるの?
そりゃもちろん。
少なくともcoreの新機能なんかは彼が「うん」といわなきゃ入らない。
どういう返答が返ってくるか予想しようぜ
「2ちゃんねら必死だな」
いっそのことruby-coreに投げろ。
文字列中の[ ]の中の文字を引数にしてその結果を置き換えるにはどうのようにすれば良いでしょうか? 例えば def func(i) i * i end def replace(str) ??? end str = "abc[1]def[2]ghi[3]xyz" puts replace(str) #=> "abc1def4ghi9xyz" のようなことを行いたいです。 文字列中の[ ]の数は不定で、存在しない場合もあります。 また、[ ]内の文字には文字"["と文字"]"は使用さません。
>353 def func(i) i * i end def replace(str) str.gsub(/\[(\d)\]/) {|s| func($1.to_i) } end str = "abc[1]def[2]ghi[3]xyz" puts replace(str)
>>354 全角スペースとは質が悪い。
コピペで動かなかったorz
356 :
354 :2006/08/15(火) 08:42:17
あ。|s| は使ってないから無しでも良いか。
357 :
354 :2006/08/15(火) 08:45:14
>355 ごめんごめん。
358 :
353 :2006/08/15(火) 10:06:59
>>354 ありがとうございました。
gsubでもブロック?が使えるんですね知りませんでした。
半角スペースは表示上消えるから全角スペースを使うのはお約束なのでは。
とりあえずは、全角スペースを警告しない
>>355 の環境が悪い
>>360 コンソール上のirbで全角の警告がでるようにする設定を教えてくれ。
だからそういう環境が悪いと。とくにirbの外側、態度なども含めて。
curses で getstr や getch で入力待ちになってるとき Ctrl-C を押してもすぐには終了されずに Enter を押して入力を確定させたあとで終了します。 Ctrl-C ですぐに終了するようにできませんか?
全角スペースを使うのは厨。
365 :
276 :2006/08/16(水) 00:54:38
遅くなったが、少し修正してruby-listに投下した [ruby-list:42693] あとは返答をお楽しみにってことで
attr_accessorのクラス変数版はありますか。 def self.foo @@foo end def self.foo=(val) @@foo = val end がもっと簡単にかけてほしい。
rubyのクラス変数ってなんか変じゃね? 継承したとき。
クラス変数なんか使うな氏ね ってことなんじゃないの
>>370 何を期待していて実際の動作とどう違って変だと感じるのか、
書いてくれんとrubyが変なのか
>>370 の頭が変なのか判断しかねる。
ちなみに1.9ではクラス変数は継承されなくなった。
uniqよりuniq!のほうが実行速度が速いということはありますか
in? とか is_in? とかメソッド名にセンスがないよな。 inは動詞だと意味変わるし、is_in? なんて妙な英語使う奴の気がしれん。 せいぜい is_included? だろ。 (←釣りのつもり。念のため。)
この意味で最初に IN を使いはじめた言語は何なんだろうね? SQL ?
英語だと思う
>>372 >>370 じゃないけど、漏れの場合は、
「継承しつつ、オーバーライドもできる (サブクラスで代入したらそちらが優先)」
ような動作になって欲しい。
確か Smalltalk のクラス変数はそういう感じじゃなかったっけ。
でも、
> ちなみに1.9ではクラス変数は継承されなくなった。
みたいに仕様がコロコロ変わるようだと、
>>371 が正解かも知れないなあ。
つーか、1.9の仕様はまだ確定じゃないでしょ? いいたいことがあるならMLで発言すれば考え直してくれるかもよ?
>>377 ラテン語の方が古い気がする。
というのは、置いといて、Objectクラスにメソッドを追加しないと使えないんだったら
使う気にならない。in演算子がRuby自体に含まれていることが重要だと思う。
メソッドじゃなくて、Rubyのシンタックス/制御構造レベルで糖衣してほしいってのが 願いなのに、どうしてああいう的外れな回答ばかり帰ってくるんだろう。 ま、rubikichiはそういうキャラだから仕方ないとして。
382 :
276 :2006/08/16(水) 14:47:50
まあ matz も「このリリース間際のクソ忙しい時期に in 演算子なんかにかかずらってられるか!」って気分かね?
>>381 今までだって「こうやればいい」的な解決がほとんどだったでしょ
>>276 スレッドが繋がるMUA使えよ
ML初心者かよ
>>385 omoti は黙ってろよ。
wl だと繋がって見えるが。
>>386 はぁ?誰がomotiやねん。
In-Reply-ToとかReferencesをつけるMUA使え、アホ
Omoti並みのやつは黙ってろよ。
多分どこかのWebメールでも使ってるんでしょう。 はっきり言って、スレッドつなげない奴は「議論する気あんの?」と思われてもしかたないぞ。
「スレッド」が2ちゃんねる用語だと思っている馬鹿が一人いるみたいだな
wl だと繋がってて気が付かなかったが、In-Reply-To 等は ML では礼儀だろ。 あと(笑)もどうかと。
漢ならwを連発しないと…
メーリングリストという古式ゆかしいコミュニケーション媒体においては 走召糸色木亥火暴 などと口走るほうが好ましいと思われます
ガキが多いな
夏だし
>>395 そうだそうだ夏に謝れ
来年から来てくれなくなったらどうするんだ
涼しくていいな。
>>205 いけました!半分は、できないものだと思っていました。
ありがとうございました。
400 :
デフォルトの名無しさん :2006/08/16(水) 20:20:25
>>369 class Module
def attr_class_accessor(*vs)
vs.each{| cv |
module_eval(<<-EOS)
class << self
def #{cv}; @@#{cv}; end
def #{cv}=(v); @@#{cv} = v; end
end
EOS
}
end
end
とか
走召糸色木亥火暴 あたりはむしろ相当オッサンだと思うが。
走召糸色木亥火暴光軍日月ネ申女臣
405 :
276 :2006/08/16(水) 22:55:11
>>400 それが標準メソッドになったりしないでしょうか。
そうでないとRDocでサポートされないので、ドキュメント生成時にこまるんですよ。
つまり attr_class_accessor :foo とかしても、RDocが解釈してくれるわけじゃないので、
ドキュメントに現れないです。
逆に言えば、RDocさえ対応してくれれば標準メソッドじゃなくてもいいんですけど。
RDocに手を入れればいいんじゃあるまいか
RDocの--accessorオプションじゃ駄目?
public なインスタンス変数をいくつか用意して、その一部については 変数への代入時に特別な処理をしたい、ということを考えています。 各インスタンス変数 @var に対して var, var=(x) を定義する代りに 以下のようなかんじで attr_accessor を使って楽しても問題ないでしょうか? この場合ですと特別な処理をしたい @foo に対して、foo=(x) を再定義している (ことになると理解しています)のが気になるのですが… class S attr_accessor :foo, :bar def foo=(x) @foo = x.tr('a-z','A-Z') end end s = S.new s.foo = 'foo' s.bar = 'bar' puts [s.foo, s.bar] -> FOO, bar 手元の ruby 1.8 では期待通りの実行結果になるのですが、 上から順にメソッド定義が実行されることを仮定してよいのかしら。
412 :
410 :2006/08/18(金) 22:22:12
- attr_accessor は構文ではなくメソッド - 定義(というか ruby プログラム)は上から順番に実行されることが保証されている ということですか。 勉強になりました 、どうもありがとうございます >411 さん
値段安くなったね。需要が出てきたってこと?
>>410 > この場合ですと特別な処理をしたい @foo に対して、foo=(x) を再定義している
> (ことになると理解しています)のが気になるのですが…
-wで警告が出るのを気にしないなら問題ない。
attr_accesorでアクセサをreadonlyにすることは出来ますか?お目害しますm(_ _)m
417 :
デフォルトの名無しさん :2006/08/19(土) 12:23:30
attr_readerを使う
ありがとうございます。
>>414 4部を分離、加筆ということで2冊に分けたような気がする。
併せて買うと高くなっている。
420 :
410 :2006/08/19(土) 12:42:09
> 415 さん、ありがとうございます。 -wで警告が出るのを気にしないなら問題ない。 あ、警告が出るのはよくないですね… attr_reader を使えばいいのかな。 class S attr_reader :foo attr_accessor :bar def foo=(x) @foo = x.tr('a-z','A-Z') end end s = S.new s.foo = 'foo' s.bar = 'bar' puts [s.foo, s.bar] -> FOO, bar 手元の環境(ruby 1.8)ではこれで期待通りの動作になりました。
>>414 ライブラリ編の方は高いままか。
でも、これなら言語編だけでも買う気が起きるな。
さすがに、2冊同時の値段は厳しかったから。
プログラミングRuby(゚听)イラネ 誰か欲しい人いる? 2000円くらいで売る
Amazonなら法外な値段で売れるよ。
Ruby本で1万越えとかあるけど、あれ売れてるの?>アマゾンの中古
話が有名になるくらいだから昔から売れてないんじゃね
あれは出品者が本屋か何かだからなあ キープした本を倍くらいの高値で出品してるんだ 評価履歴見る限りではものによっては売れてるみたいだけど、 初心者向け書籍でふっかけても売れるもんかねえ
rakeについて質問させてください file 'hoge.o' => ['hoge.c', 'Rakefile'] do p "hoge.o hoge.c Rakefile" end とかくと、hoge.cとRakefileが更新されたときにタスクが実行されます。 これを file でなく、rule で行いたいのですが、いい方法はないでしょうか。 rule '.c' => ['.o', 'Rakefile'] do p "#{t.name} #{t.source} Rakefile" end と書いてもうまくいきません
makefileだと %.o: %.c Makefile なんとかかんとか で、できるんですが・・・
429 :
デフォルトの名無しさん :2006/08/20(日) 17:37:15
430 :
427 :2006/08/20(日) 19:18:13
rakeのソース見てました。 def make_sources(task_name, extensions) このあたりを見るに、ソースに対応した拡張子しか対応してなさそうです。 しかし、procを渡すと、その返却値のファイルで見てくれるので、 無理やり、 file 'hoge.o' => ['hoge.c', lambda{'Rakefile'}] do p "hoge.o hoge.c Rakefile" end とやるとうまくいきました。 普通のファイルも扱えるように、 要望だそうかな・・・って、どこに出せばいいんだろ。
431 :
427 :2006/08/20(日) 19:19:03
fileじゃなかった・・・ rule '.c' => ['.o', lambda{'Rakefile'}] do p "#{t.name} #{t.source} Rakefile" end です。すみません。
Index: lib/rake.rb =================================================================== --- lib/rake.rb (リビジョン 568) +++ lib/rake.rb (作業コピー) @@ -1552,12 +1552,11 @@ # Attempt to create a rule given the list of prerequisites. def attempt_rule(task_name, extensions, block, level) - sources = make_sources(task_name, extensions) - prereqs = sources.collect { |source| + prereqs = make_sources(task_name, extensions) { |source| if File.exist?(source) || Rake::Task.task_defined?(source) source - elsif parent = enhance_with_matching_rule(sources.first, level+1) + elsif parent = enhance_with_matching_rule(source, level+1) parent.name else - return nil + nil end } @@ -1573,7 +1572,8 @@ case ext when String - task_name.sub(/\.[^.]*$/, ext) + yield ext.sub(/\A(?=\.)/) {task_name.sub(/\.[^.]*$/, '')} or + yield ext or ext when Proc - ext.call(task_name) + yield ext.call(task_name) else fail "Don't know how to handle rule dependent: #{ext.inspect}"
434 :
427 :2006/08/20(日) 23:41:05
>>432 .cと.o逆でした。書き込むときに間違えました orz
手元では、あってます。
435 :
デフォルトの名無しさん :2006/08/21(月) 08:25:25
Log4R::Logger.rootでとれるloggerに出力したログはどこに吐かれますか?
CとかJavaとかの経験は普通にあるのですが、 Rubyは初めてです。 この度Ruby on Railsの学習を始めたのですが、 Rubyの仕様なのかRailsのしくみなのかよく分からずに覚えていってます。 それでRubyの基礎というか本質的な部分を勉強したいと思っています(入門ではなく)。 なんか良い書籍はありませんでしょうか?
なんだかんだ言って入門読んでからのほうがいいと思うんだけどなあ いや、例のでかい本の内容がわからないからなんとも言えないけど プログラミング慣れしてる人なら入門補助的に機能する本かもしれないし
ヘルプでいいと思うけどなぁ
440 :
436 :2006/08/24(木) 00:13:09
>>440 バージョン 1.4 ベースだからかなり古いと思われ。
ミスったと思うよ。 Ruby on Rails の本が何冊か出てるから そっち買った方がいいと思う。 その本は Ruby を使うこと以外のこと (言語のつくりとか)の解説も多く、 入門的に使うにはあまり向いてないよ。
>>440 速攻でキャンセルしろ
スレ的にはもはや漬物石にしか使えない本だ
RoRはRoR本に任せるべし
Rubyを知りたい場合はたのしいRuby第2版か
>>413 買え
444 :
436 :2006/08/24(木) 00:37:11
まじすかー!
amazonで注文したんだけど速攻でキャンセルしようと思ったらできなかった。
返品できるみたいなんでやってみる。ごめんよamazon
>>443 RoR本は1冊もってます。RoRの作者が書いたやつ。
達人プログラマも惹かれましたが、作者の書いた本にも惹かれ
>>440 を選択してしまいました。
>>413 にしようかな。Ruby第2版ってなんですか?
>>413 とは違うの?
445 :
444 :2006/08/24(木) 00:38:09
すいません。
> Ruby第2版ってなんですか?
>>413 とは違うの?
ですが、たのしいRuby第2版ですね。たのしいを見逃してました。
定数のaliasって定義できないんでしょうか? 継承を用いないで、あるクラスの別名を定義したいのですが。。。
447 :
446 :2006/08/24(木) 02:14:33
すみません。普通に新しい定数名に旧定数を代入すればよかったんですね。寝惚けてました。
配列aとbがあります。 aから、bの要素でないものを抜き出す一番スマートな方法を教えてください その際、計算量がどれくらいになるかも教えて欲しいです。 例) a = [1,2,3,4,5] b = [2,5] のとき、 [1,3,4]が欲しい
計算量は知らんけど a - b とか。
引き算させるのが素直だと思うなあ grepとかと比べてどうかとかそういう話だと思うけど
>>449 ソースを見たところ、bをHashにしてa.eachで突き合わせてるようす。
時間はhashメソッドの実装にもよるかもと思って試したらよくわからない結果になった。
@CoreDuo T2600, ruby-1.8.5-preview5 on Cygwin 1.5.21-2
user system total real
Fixnum 0.234000 0.016000 0.250000 ( 0.238000)
Float 873.125000 0.156000 873.281000 (888.061000)
String 0.704000 0.000000 0.704000 ( 0.703000)
LongString 0.516000 0.000000 0.516000 ( 0.494000)
Object 0.531000 0.000000 0.531000 ( 0.536000)
require 'benchmark'
class Hoge
def hogehoge;end
@value = rand
end
def mklary(dir, size)
Dir[File.join(dir,'*.*')].sort{rand(2)<=>1}[0, size].map{|fn| IO.read(fn)}
end
Benchmark.bm(0) do |job|
j = "job.report(t) {a - b}"; al = 1000000; bl = 500000
t="Fixnum"; a = (1..al).to_a; b = (1..bl).to_a; eval(j)
t="Float"; a = (1..al).map{rand}; b = (1..bl).map{rand}; eval(j)
t="String"; a = (1..al).map{|i| i.to_s}; b = (1..bl).map{|i| i.to_s}; eval(j)
t="LongString"; a = mklary('/usr/bin',500); b = mklary('/usr/bin',250); eval(j)
t="Object"; a = (1..al).map{Hoge.new}; b = (1..bl).map{Hoge.new}; eval(j)
end
>>451 「何を」計測・比較しようとしてるのかを詳しく
>>452 同じ要素数でオブジェクトが違う状態で実行に掛かる時間を比較しているつもり。
File読み込んだときは要素数が違うけど。
っていうか時間って書いてあるね。
計算量ってベンチマークとは違うと思うけどな.ソースを見たとこまでは良いが。
>>454 そもそも、計算量はこうです、と言って出したデータじゃないから文句言われてもな。
ベンチマークはHashがhashメソッドの値を使うって書いてあったので
オブジェクト毎に違いがあるか試すためにやってみたんだけどFloatが遅すぎるのが不思議。
>>453 計算量ってオーダーのことを聞いてると思うので、
オブジェクトの違いによる差よりも、同じ種類のオブジェクトで、
配列要素の増加に対して処理時間がどう増加するかを提示するのが良いと思われ。
>>456 だから計算量のデータじゃないって言ってんじゃんかよ。うぜーよ。
そんなくだらんデータで
>>449 にレスすんなよ、とみんな言ってるんだと思う。
確かに、キーが Float の場合、 Hash へのデータ追加とか検索が異様に遅いみたいね。 何だろこれ?
>>456 オーダーってO(N)とかいう話?
a - bするとして、処理の項目毎には
1. bをHash化=>(Hash)B(たぶんO(N))
2. aの順次アクセス=>要素oを取得(O(N))
3. B中からoを検索(O(1)*a.size回)
4. 3で見つからなかったオブジェクトを返値のArrayに挿入(たぶんO(N))
1.8.5-prevew5のソースだと、やってる項目はこんな感じ。
これは試すまでもないし、
>>451 に書いた話で想像できるだろ。
全部あわせて計算量を示せるとは思えんが。
>>458 ごめんちゃい。
あとはこっちでやれよ。
ttp://pc8.2ch.net/test/read.cgi/tech/1106572657/
>462 「ruby-devメーリングリスト過去ログの29352番嫁」 という意味だとオモ ちなみにruby-devでぐぐればMLの過去ログ見つかる
>>463 じゃなくてそれ読んだけどどう関係があるの?
465 :
デフォルトの名無しさん :2006/08/25(金) 01:01:50
>>461 よくhashが衝突するので、それを回避するために、計算しているから、遅くなってる、
でよい?
>>465 ちょっと誤解される表現かも。
「衝突を回避するための計算」のために遅いんではなく、
衝突してしまってるのでhashとしての効果が出ない状態。
「回避するための計算」が十分に回避できてないといってもいいけど。
計算量計算量って唱えてた香具師の出した計算量マダー? それとも宿題終わってもう見てないのか?
FloatのHashってこれだな。 d = RFLOAT(num)->value; if (d == 0) d = fabs(d); c = (char*)&d; for (hash=0, i=0; i<sizeof(double);i++) { hash += c[i] * 971; } if (hash < 0) hash = -hash; return INT2FIX(hash); つまり、Floatの各バイトを足し合わせて、971倍しているだけだな。 そりゃあ衝突もするわ。
971っつー素数はどっから来てるんだろ?ん 971 = 2^(8+1) + 2^(8+0) + 2^(1) + 2^(0) って分解できるけど何か便利なのかな。
適当
そこで素数を使うと、適当に値がばらける。 また、その素数についても、下位ビットが全部消えちゃうことがないように ある程度下位ビットが生き残るような値が望ましい。 だいたいそんなところ。
hash = hash * 971 + c[i]; とかの間違いだよな。
473 :
469 :2006/08/25(金) 16:28:04
>>472 ばらけすぎ。
それ7回繰り返したらいくらになると思う?
>>474 ばらけたほうがいいんじゃないの?
桁が増えると乗算命令のコストが増える(実際どうか知らんけど)とか言う関係かな。
>>473 > ビットが反転するだけで、同じことでは?
よくわかんない。
なんか勘違いしてる?
p [0,1,2,3,4,5,6,7,8,9][0..-2] #=> [0, 1, 2, 3, 4, 5, 6, 7, 8] となるので (0..-2).each{|i| p i} としてみたけど何にも表示されません。これは,なにが起こってるんですか?
勘違いが起こってるとしか (0..-2)じゃ配列じゃなくてRangeオブジェクトだし降順だとeach動かないぞ
478 :
476 :2006/08/25(金) 20:40:58
なるほど,降順だとeachが動かないわけですね [0..-2]というのは配列にRangeオブジェクトを渡してるんですよね? 昨日から勉強し始めたのでまだよくわかってません 精進します
class Foo include Comparable attr_reader :str def initialize(str) @str = str end def <=>(other) @str <=> other.str end end hash ={ Foo.new("abc") => "a"} array = [ Foo.new("abc") ] b = Foo.new("abc") p hash.include?(b) #=> false p array.include?(b) #=> true hashの場合もtrueにする良い方法はないでしょうか?
hash.has_key() / hash.keys.include?() 使えば?
class Foo def hash @str.hash end def eql?(other) @str == other.str end end みたいな
482 :
479 :2006/08/25(金) 21:49:42
ありがとうございました
>>480 hash.keys.include?でできました
>>481 こちらでもできました
でも意味が理解できません、勉強します。
483 :
479 :2006/08/25(金) 21:56:09
マニュアルのObject#eql? をみたら理解できました hashのkeyの等しさの判断は、これを使用するのですね勉強になりました。
484 :
デフォルトの名無しさん :2006/08/27(日) 06:12:31
標準で、簡単にオブジェクトのメソッドをProcオブジェクト化する関数は定義されていませんか? class A def a(n) puts ["(^0^) ", "(T_T)", "(´_`;)"].at(n % 3) end end def delegate(obj, f) proc { |*args| obj.__send__ f, *args } end a = A.new (1..2006).each &(delegate a, :a) こんな感じのことがやりたいのですが・・・。
(1..2006).each &a.method(:a)
おお、それこそ、まさに願った通りのものです。 本当にありがとうございました!
487 :
デフォルトの名無しさん :2006/08/29(火) 21:30:44
Log4R::Logger.rootでとれるloggerに出力したログはどこに吐かれますか?
プログラミングRubyの第二版は うさぎ本ではなくピッケル本というのが正しいのですか?
「ピカチュウ本」というのが正しいのかどうかはよくわからない。
>>488 The Pickax Book ツルハシ本
492 :
490 :2006/08/31(木) 11:10:31
>>491 ふむ。裏表紙には
Welcome to the PickAxe (named for the tool on the cover).
と書いてあった。Aも大文字。
493 :
デフォルトの名無しさん :2006/08/31(木) 22:18:37
二進表示をprintf,sprintfを使わず、正の整数を入力して その二進表示を出力するプログラムを作成しよ。 ただし整数から二進表示文字列を作るメソッドi2bを 作成してそれを呼び出すように書くこと。 出来る人誰かいませんか?できるだけ簡単なプログラムでお願いします。 Ruby初心者なのでわからなくて困ってます。
この期に及んでマルチとは恐れ入った
どうせ宿題スレにブン投げる気だったんだし手間省けていいじゃん
プログラムというよりは数学の問題に近いね
497 :
デフォルトの名無しさん :2006/08/31(木) 22:28:11
マルチってなんですか?
耳に変な機械をつけた小便小娘型ロボット
変換テーブル作ればいいよ。高速だから
IKEAに変換テーブルあったよ
>>493 しょうがないなぁ、今回だけだぞ。
def i2b(i)
i.to_s.unpack("b*)
end
くれぐれも他の奴は俺みたいに親切にならないように。
こんな簡単な問題なんだから、間違いを指摘してあげるのもナシで。
" がひとつぬけてた... orz def i2b(i) i.to_s.unpack("b*") end
503 :
デフォルトの名無しさん :2006/08/31(木) 23:37:06
504 :
デフォルトの名無しさん :2006/08/31(木) 23:38:43
i.to_s.unpack("b*") 使わず二進表記を出す方法は?
+
"%b"%i
507 :
デフォルトの名無しさん :2006/08/31(木) 23:44:16
ほ〜
perl でいう use encoding 'shiftjis'; みたいなものはありますか。 ソースコード・標準入出力はShift-JISで、内部演算はUTF-8みたいな感じで。
un*x の file コマンドのように拡張子によらず mimetype を判別することは可能でしょうか? 成り済ましファイルの判定に使いたいと考えています。 ご存知の方おられましたら、教えてください。 環境は Linux+ruby 1.8.5 及び WindowsXP+ruby-mswin32 1.8.5 です。 よろしくお願いいたします。 hoge% file -bi foo.bmp image/bmp hoge% mv foo.bmp foo.jpg hoge% file -bi foo.jpg image/bmp hoge%
unix の file コマンドは、ファイルの冒頭部分の数バイトを読んで判定して いる。で、その判定ルールそのものは magic という設定ファイル(をコンパイ ルしたもの)を利用している。 なので、 magic を file コマンドから流用し、それを使って自分で同じよう に処理をすれば可能といえば可能だろう。ただまあ、そこまでするくらいなら file コマンドを直に呼び出した方が楽だと思うが。 あと、 mimetype が欲しいのであれば、 file に -m オプションで magic.mime を指定するという手もあるよ。 % file test.png test.png: PNG image data, 640 x 480, 8-bit colormap, non-interlaced % file -m /usr/share/file/magic.mime test.png test.png: image/png
>515>516 ありがとうございます! 残念ながら >515 のものは magic.lib を用いるので 素のwindows ではだめなようです。 windowsでは magic がないので、そもそもmagic.lib のロジックから 作らないとだめみたいですね。cygwinやSFUで動くかも… ともあれ参考になりました。ありがとうございました。
>>513 ソースをUTF-8で書いて、$KCODE = "UTF8" にすれば一応、文字処理はクリアできそう
ですね。
携帯サイトのCGIなので、標準出力はShift-JISにしたいのですが、kconv を使って、
UTF-8 → Shift-JIS に変換して出力するものでしょうか?
それとももっと違う方法を取るものなのでしょうか?
>>518 基本的にはそういうこと。
初期化の順番を考えると#!行で-Kuを指定した方が良い。
フレームワークとかテンプレートエンジンでコード変換を吸収してくれるならそれを使うといいと思うけど寡聞にして知らない。
>>509 encoding.pm は非推奨
encoding.pm は非推奨
encoding.pm は非推奨
522 :
デフォルトの名無しさん :2006/09/01(金) 23:58:48
Ruby+AjaxなWEBシステムはリッチクライアントと呼べますか?
523 :
デフォルトの名無しさん :2006/09/02(土) 00:06:34
Delphi+VCLで作ったWindowsアプリはリッチクライアントと呼べますか? って聞いているもんじゃね? つくりによるとしか
初心者は1.8。インストーラ付きの物を。 Windows で Ruby を使うなら ActiveScriptRuby など。
WinならRubyInstallerや↑のASR LinuxならRPM/debなど。 ソースからのビルドは慣れた人や インストーラの存在しない環境向け。 あと勘違いしてるようだが言語の場合 必ずしも最新版が良い訳ではない。 基本的に安定版と呼ばれるものを使うべし。
…と思ったらgonzuiが1.9要求するのか。 んー……ちと帰宅したら試してみる。
528 :
524 :2006/09/02(土) 11:56:40
自己レス。
>>524 のやり方でダウンロードしたものが1.9のようです。
version.h見たら1.9.0と書いてありました。
お騒がせして申し訳ない。
529 :
デフォルトの名無しさん :2006/09/02(土) 20:00:45
Rakefile書いてて思ったんですが、 ↓ruleと(の間にスペースが入っている rule (/#{DEST_DIR}/ => lambda{|f| File.basename f }) do |t| p t.name end って書くと、 warning: don't put space before argument parentheses って、言われるのですが、これって何でですノン? スペースなくすと、大丈夫です。 文法上、あいまいさが出るんですか?
関数の定義の前で関数を使うことは可能ですか? a = func1() def func1 return 1 end みたいな使い方をしたい。 理由は、関数定義がファイルの先頭にあると、読みにくいからです
>>529 Rubyが関数呼び出しの際カッコを省略できるのは知ってる?
foo (a + b + c) * x
どうなるかぱっと見わかりづらくね?
>>530 無理。
関数定義と実行ファイルを別にすりゃいいだけじゃないか。
末尾が実行開始位置だと読みにくいくらい既に長くなってるってことでしょ?
CGIプログラミングで、フォームの値をあらかじめ入れ終わってからプログラム本体を実行させたいのですが 「フォームの値が入っているものとしてローカルで実験」の項がWeb上の最新マニュアルから消えているんですが これが出来るほかの方法知りませんか?
>>533 回答ありがとうございます
…でも、ごめんなさい現在ruby1.8.4(Winバイナリ)を使っているのですが、該当のサンプルコードを丸々コピペでも
「do not use CGI_PARAMS and CGI_COOKIES」と表示されて。
恐らく、現在のバージョンでは消されてしまったのではないかと思うのです、わかりませんが…。
535 :
デフォルトの名無しさん :2006/09/03(日) 00:19:00
ワンライナーで、ファイルの中身を読み込みたいとき open("hoge.txt").read ってやっちゃてよいものなんでしょうか。 close呼ばれる?
536 :
デフォルトの名無しさん :2006/09/03(日) 00:25:29
>>535 普通は {} を使ってブロック内で処理させるな。(ただし、普通=俺の普通)
>>535 プロセスが終わるときには閉じるでしょう。それで大丈夫なら大丈夫じゃないか。
でも、IO.readで代用できるんだったらそっちのほうが安全で楽かと。
>>530 def main
a = func1()
end
def func1
return 1
end
main
みたいな方法はどう?
>>529 >文法上、あいまいさが出るんですか?
その通り。関数のカッコの前にスペースを入れられるようにすると、
>>531 のように、
(foo(a+b+c)) * x
foo((a+b+c) * x)
の2通りに解釈できてしまう。
541 :
デフォルトの名無しさん :2006/09/03(日) 13:59:16
>>540 ああ、そうっかー。カッコなしでも関数呼べますもんね
542 :
デフォルトの名無しさん :2006/09/04(月) 00:34:13
ruby便利ですね。 rubyのshellってないんですかね。
るびきちプロダクトは使わない主義
546 :
デフォルトの名無しさん :2006/09/04(月) 01:35:31
これだけメソッドが揃ってるのに [1,2,3].sum -> 6 が無いのは不思議だと思うんですが
>>547 そんなアドホックなメソッドいらん。inject使うか自分で定義すれ。
>>547-548 俺は定義してるな
既存クラスへのメソッド追加は結構やる
大きいコードではやりたくないがな
そういう、標準で定義される必要はないけど、 結構使うだろ? というようなメソッドを いろいろ教えて欲しいなと思うのです。 まあ、「そんなの使わねぇよ、バカ」とか言われそうなので 敷居高そうですけど。
[1,2,3,4,5,7,8,9,10,13,14,15,19].to_ranges
=>[1..5,7..10,13..15,19]
とか使ってます。たまにだけど(こういうこと?
>>550 )
>>551 そういうの。
というか、ほんとはその中身が知りたい。
どうやんの、それ。
あと、Enumerable#max も割とアドホックな気がする。
>>553 class Time
alias :strftime_org :strftime
def strftime(format)
format.gsub!(/%u/, self.usec.to_s)
strftime_org(format)
end
end
puts Time.now.strftime("%a %b %d %H:%M:%S:%u %Z %Y")
#=> Mon Sep 04 20:43:58:858000 東京 (標準時) 2006
いらない?あっそ
>>552 無かったはず。
たしか、インストールされたファイルのリストがどっかに出力されてるから
それを元にしてインストールされたファイルを全て削除すればおしまい。
Array#each_permutation や Array#suffle は20回以上書いた気がする。 こういうのって自分用のライブラリに纏めて使ってる人はいるかな。
557 :
552 :2006/09/04(月) 20:53:28
>>555 了解です。ありがとうございました。ちょっと落胆。
>>556 shuffleは使うよねー
こういうのはActiveSupportでまとめてくれるとうれC
数値にカンマ付けするのもしょっちゅう使うけど、 今は標準でサポートされたんだっけ?
>>559 プ板って初めて見た。
ム板、マ板ならよく見るけど。
>>554 俺の場合、
Time#to_sで、月が英語表記なのがいやで(=読めない)
"%Y/%m/%d %H:%M:%S"を
俺用to_sとして使ってます。
(実際はメソッド名変えてます。)
ええ、ばかですよ。
あと、
>>554 氏のやつで
引数formatを破壊的メソッドgsub!で書き換えちゃうのって
まずくない?
(意図的だったらスミマセン)
こういう時、俺の場合、dupで複製してから、
複製に対してごにょごにょするんだけども、
そういうのって一般的なのでしょうか?
>>559 最終的にcookbookみたいなレベルのになるのでもいいから見てみたい
>>558 Array#shuffleとArray#shuffle!は先週1.9に追加された。
565 :
デフォルトの名無しさん :2006/09/04(月) 22:18:04
566 :
デフォルトの名無しさん :2006/09/04(月) 22:25:41
568 :
デフォルトの名無しさん :2006/09/04(月) 22:55:57
ちょっと、質問。 Rubyって関数内関数って使える?
使えない。
570 :
デフォルトの名無しさん :2006/09/04(月) 23:17:03
あれ?irbだと使えるな・・・変な挙動だが。
メソッドの中に def 宣言を置くのは、文法的には valid だよ。 そのメソッドを一回呼び出すと、内部で宣言したメソッドが当該クラスに追加 される、という挙動になる。ので、外からも呼べるようになるので、メソッド 内メソッドではないというだけ。 ああいうのが欲しくなったときは、仕方ないので lambda とかを使っている。
572 :
552 :2006/09/04(月) 23:31:25
すみません、先ほどのものですが、相談させていただきたいことがございます。
1.9Betaがインストールされてしまった環境を、1.8に戻すにはどうしたら良い
でしょうか?
・OSはRedHat EL4
・CPUはXeon64
・もともとRedHat公式の1.8がインストールされていた
・ある人が無断で1.9Betaをソースからビルドしてインストールしてしまった
ftp://ftp.ruby-lang.org/pub/ruby/snapshot.tar.gz ・インストールログは取っていなかったので、どこに何が入ったかわからない
・find で検索すると、/usr/local/lib/ruby の下に、1.8 と 1.9のディレク
トリが存在する
・1.9Betaのインタプリタは/usr/local/bin/ruby、1.8のインタプリタは/usr/bin/ruby
考えたのですが、1.9Betaのインタプリタだけ削除(またはリネーム)すれば、
再び1.8が呼ばれるようにはならないでしょうか?
恥ずかしい相談で恐縮ですが、どうかアドバイスをお願いします。
573 :
デフォルトの名無しさん :2006/09/04(月) 23:41:09
>>571 サンクス
ほんとだ。関数内関数にはならないけど、宣言はできるのか
def hoge
def moge
puts " moge"
end
puts " hoge"
moge
end
def moge
puts " new moge"
end
puts "hoge:"
hoge
puts "moge:"
moge
puts "hoge.moge:"
hoge.moge
574 :
デフォルトの名無しさん :2006/09/04(月) 23:41:54
hoge: hoge moge moge: moge hoge.moge: hoge moge moge ん?mogeが再定義できていないのは?
すいませんが、教えてください。 yieldの使い方がリファレンスを読んでも理解できません。 Procは分かるのですが、どう違う物なんでしょうか。 なにか分かりやすいページとかあったら教えてください。
1.9Betaなんてものはないが。 > ・find で検索すると、/usr/local/lib/ruby の下に、1.8 と 1.9のディレク > トリが存在する ということは1.8もソースからインストールしていたということだな。 とくになにも指定していなければ上書きされてしまったはずなので、 そこにあった1.8は復活できないが、以下のものを消せばいいはず。 * /usr/local/bin/{ruby,erb,irb,rdoc,ri,testrb} * /usr/local/lib/libruby.so.1.9* * /usr/local/lib/1.9 * /usr/local/lib/site_ruby/1.9 * /usr/local/man/man1/ruby.1 * /usr/local/share/ri/1.9 (install-doc までやってれば) make DESTDIR=/tmp/ruby_install install でインストール先を指定できるので、なにがインストールされるか 確認してみればいい。
578 :
572 :2006/09/04(月) 23:57:04
>>576 ありがとうございます。明日、試してみます。
今度から 1.9 は ./configure --program-suffix=19 でインスコしような。
580 :
573 :2006/09/05(火) 00:12:42
>>573 についかして、
puts "etc:"
puts " self.hoge " + self.methods.include?("hoge").to_s
puts " self.moge " + self.methods.include?("moge").to_s
puts " Object.hoge " + Object.methods.include?("hoge").to_s
puts " Object.moge " + Object.methods.include?("moge").to_s
ってやったんですが、結果は、
etc:
self.hoge false
self.moge true
Object.hoge false
Object.moge true
なんじゃこりゃ><
これってどういう挙動ですノン?
def hoge は、どこに登録されているんだろ?
def hoge 内の def moge は、Objectに登録されているんですけど、よいのですか?
methodsの代わりにprivate_methodsでどう?
def hoge
def moge; end
end
def moge; end
pvt = Object.private_instance_methods
pub = Object.public_instance_methods
p pvt.include?('hoge')# => true
p pvt.include?('moge')# => true
p pub.include?('hoge')# => false
p pub.include?('moge')# => false
hoge
pvt = Object.private_instance_methods
pub = Object.public_instance_methods
p pvt.include?('hoge')# => true
p pvt.include?('moge')# => false
p pub.include?('hoge')# => false
p pub.include?('moge')# => true
最初の時点では両方とも private だが
メソッド内で再定義された時点から public になってるな。
ちなみに勘違いしてるかも知れないが
>>573 のコード内の
hoge.moge
は hoge の戻り値が nil なので nil.moge を呼んでるぞ。
そりゃ Object の public メソッドに moge があるんだから nil.moge も呼べる罠。
583 :
559 :2006/09/05(火) 02:25:23
>>565 でも、スレ違いっぽい気もする。
本スレいくか?それとも新スレ立てるか?
584 :
559 :2006/09/05(火) 02:32:02
>>573 "new moge" は全然newじゃない。
puts "moge:"
moge
puts "hoge:"
hoge
puts "moge:"
moge
の結果
moge:
new moge
hoge:
hoge
moge
moge:
moge
>>583 標準登載するまでもないかもしれないが、
良く使うメソッドコード集ってすげぇ欲しいわw
できれば、ライセンスフリーで使えることを謳っておいてくれると嬉しい。
2ch はライセンス的にダメなので wiki が良いな。
環境:ruby 1.8.4 (2005-12-24) [i386-mswin32]
WEBrick使ってるんですけど、特定のホストで例外が起きます。
調べてみると、ホスト名の認識がまずいようで、
URI::parse('
http://shacho_soft.at.infoseek.co.jp/diablo_calc/calc.html ')
上記のホストで、ホスト名にアンダースコアが含まれてるために host ではなくて registry が設定されてしまい
InvalidURIErro例外が発生します。WEBrick的には HTTPStatus::BadRequest です。
uri/common.rb の↓の部分でアンダースコアが含まれてないから、上手くいかないんだと思うんですけど
DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?"
こういうのって、きっちりRFCにしたがってるんだと思いますが
どうにかして上手く回避する方法はないでしょうか?
たぶん、アンダースコアを含めれば上手くいくんでしょうけど、
この手の問題って、過去に問題になってる気がするので、賢い方法があったら教えてください
587 :
572 :2006/09/05(火) 12:22:00
すみません、Ruby1.9の削除について質問した者です。本日、社の者に問い合
わせたところ、1.8はソースではなくRedHat提供のRPM(バイナリ)パッケージ
からインストールしたということでした。
>>576 氏の
>1.8もソースからインストールしていたということだな。
という言葉と矛盾してしまい、少々当惑しております。もしかしたら、他の方
法で1.8をインストールしようとした人がいたのかも知れません。
ということで、追加で質問させていただきたいのですが、
RedHat提供のRPM(バイナリ)パッケージでRuby1.8を再インストールしようと
思っているのですが、
>>576 で教えていただいた手順の実行後、RPMのインストー
ルをすればよいのでしょうか?
何度もすみませんが、よろしくお願いします。
>>586 俺もいつも困ってるんだが、なんかうまい方法ないかねえ。
>>586 漏れは、アンダースコアを含んだパターンも解釈するように URL::parse を修正して使ってる。
>>592 あ、ごめん癖でh抜いちゃったけど要はURLエスケープした文字列含んでるとって事。
>>594 URL エスケープしててもいけるよん。試してみた?
話を理解してない奴が一人いるっぽいのはおいといて、 URI::parseの制限をゆるくするオプションかなんかは欲しい。 WEBrickでproxy作ったりするとかなり迷惑する。
どこをどの程度緩くするかって利用のケースによって変わってきそうなので、 オプションで指定といっても難しそうな気はするね。 uri = URI::Parser::new(:host=>host_pattern, :path=>path_pattern, :fragment=>fragment_pattern).parse(url) みたいにカスタマイズできると良いのかなあ?
すみませんが質問です。 日時をあらわす文字列と、そのフォーマットを表す文字列を指定して、 Timeオブジェクトを生成するにはどうしたら良いでしょうか? Rubyは1.8.1です。
599 :
デフォルトの名無しさん :2006/09/05(火) 16:36:20
Timeオブジェクトを生成する話と、それをフォーマットして出力する話と混同してない? Time#strftimeを参照のこと。
Array#shuffleを自分で実装するとした場合、これよりシンプルなのある? def shuffle(ary) ary.map{|x| [rand,x]}.sort.map{|x| x[1]} end
601 :
598 :2006/09/05(火) 16:49:09
>>599 すみませんが、混同しているわけではありません。
やりたいことは、Time#strftime の逆です。
文字列から、Timeオブジェクトを作りたいのです。
>>598 こんなのとか? Time::strptime は 1.9 からなのかな?
require "date"
Time::local(*DateTime::_strptime("2006-09-05 16:49:50", "%Y-%m-%d %H:%M:%S").values_at(:year, :mday, :mon, :hour, :min, :sec))
603 :
599 :2006/09/05(火) 17:04:33
>>601 ふんじゃ、require 'time'だな。 添付ライブラリの。
604 :
598 :2006/09/05(火) 17:08:28
>>602 大変ありがとうございます。うまく行きました!
>>603 Time::strptime は1.9からのようです。
乗り遅れたけど、正規表現でもいいなら。 Date必要なし。 Time.local(*"2006-09-05 17:00:00".match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/).captures)
>>600 MLか日記で読んだやつ。
ary.sort_by{0.5<=>rand}
shuffle!するにはreplaceしてくれ。
短くしたいなら
ary.sort{rand(3)-1} #0..2を返すので-1で-1..1
とかだけどsort_byより遅いかも。
ttp://phinloda.jugem.cc/?eid=487 の問題は、イテレータで書くと綺麗に書けそうな予感がしますが
(a)どなたかお手本をみせてもらえませんか
また、(b)本能でざっと書いた以下を、もっとrubyの特長
を生かした感じで書くならどのような書き方がありますか。添削所望
ary=gets.chop.gsub(/[() ]/,"").split(',')
while (n=ary.shift.to_i)<=ary.length
if n==0 then print "[]\n";next end
puts ary[0..n-1].inspect
if n==ary.length then break end
ary=ary[n..ary.length]
end
>>606 それならarr.sort_by{rand}でもいける
下の方法は偏るよ
>>607 やってみた。
ルビーらしいかどうかはわからんけど。
ary = [1, 5, 3, 55, -45, 6, 2, 8, 7, 0, 1, 2, 3, 1]
while !(ary.empty? || ary.size <= ary.first)
p ary.slice!(0, ary.shift)
end
お詫びに速度を測ってみた@ruby-1.8.5。 irb(main):299:0> Benchmark::bmbm do |bm| irb(main):300:1* bm.report("plain"){10.times{(1..10000).sort_by{rand}}} irb(main):301:1> bm.report("ufo"){10.times{(1..10000).sort_by{0.5<=>rand}}} irb(main):302:1> end Rehearsal ----------------------------------------- plain 0.375000 0.000000 0.375000 ( 0.375000) ufo 0.093000 0.000000 0.093000 ( 0.119000) -------------------------------- total: 0.468000sec user system total real plain 0.282000 0.000000 0.282000 ( 0.288000) ufo 0.125000 0.000000 0.125000 ( 0.115000) 整数値作ってからのほうが早いがもっと僅差だと思っていた。勉強になった。
613 :
600 :2006/09/05(火) 20:37:04
すごく勉強になりました。ありがとうございました。
sort_by{0.5<=>rand} は偏らない? Float#<=> は 0, 1, -1 しか返さなくない?
>>587 > RedHat提供のRPM(バイナリ)パッケージでRuby1.8を再インストールしようと
> 思っているのですが、
>>576 で教えていただいた手順の実行後、RPMのインストー
> ルをすればよいのでしょうか?
再インストールしなくても、prefixがわかれてるようだからRPMのほうはその
まま残ってるだろ。
/usr/local/binが/usr/binよりもPATHの先にセットされてるんで
/usr/local/bin/rubyが使われてるだけだと思う。1.9を消すだけで十分なはず。
PATHの順序を変えてためしてみればいい。
やっぱりArray#shuffleは実装された方がいいような、教材としては実装されないほうがいいような。
俺のshuffle class Array def shuffle r=[] while i=slice!(rand(size)) do r.push i end return r end def shuffle! replace shuffle end end
あw 御免これじゃshuffleが元データ破壊しちまうw 書き直すわw
621 :
619 :2006/09/06(水) 00:24:12
書き直し。shuffle!を基本に。 class Array def shuffle! r=[] while i=slice!(rand(size)) do r.push i end replace r end def shuffle dup.shuffle! end end
どうしても言いたいので言ってしまおう おーさまのみみはろばのみみー(メル欄)
ID無し板って王ロバするにはちょうど良いよね
arr.sort_by{rand} はきれいだな。 bangなメソッドも似たような感じでかけないかな。
俺はiPodかな。持ってるのがshuffle 無駄な電池消費しないのは良いが流し聴く以外には向かない
>>550 こういうのがあるけど。
http://facets.rubyforge.org/ Ruby Facetsは単一の大きなライブラリであり、コアとなる拡張メソッドと、標準ライブラリを含んでいます。
Array#shuffleだけでなく、String#shuffleやHash#shuffleもある。
ソース付きで見られるから勉強にも良い。
JavaのString#substring(int index)に相当するのは、Rubyでは何になりますか。 やりたいのは、n番目の文字以降の部分文字列をスマートに取得することです。 Rubyには String#[index,length] と String#slice(index,length)がありますが、lengthを省略すると、部分文字列ではなくて文字コードが返されてしまうので、JavaのString#substring()とはちょっと違うようです。 String#slice(index)が文字コードではなくて部分文字列を返してくれるといちばんいいんですけど。 今は s = "abcdefg" i = 3 s[i, s.length - i] としているんですけど、なんかかっこわるいので、「n番目以降の部分文字列」をとってくるスマートな方法をお願いします。
s = "abcdefg" puts s[3..s.size] #=> "defg" でダメ?
s = "0123456" puts s[3..-1] #=> "3456" もあり。
すみません、Rubyにはコンソール環境のヘルプはないのでしょうか? Pythonのhelp()はとても便利なのですが、あんな感じのものが、irbから対話 的に呼び出せたり、といったものはないのでしょうか?
ary.sort_by{0.5<=>rand} いまひとつこれのしくみがよくわからない。 2つの要素を比較するときの比較結果がランダムになるんだよね。 ソートが終了することは保証されるの?
>>632 どうでもいいけど、それ sort_by の使い方を勘違いしてるでしょ。
>>608 が正しい。
635 :
631 :2006/09/06(水) 20:44:11
スクリプトの2重起動を防ぐ方法はありますか?
すみません、教えてください。 RDEを使って勉強を始めましたが、複数行をコメントアウトしたり復帰したりする方法がわかりません。 RDEマニュアルを見てみましたが、特にふれられてないような気がします。メニューをみても(複数行のインデントはありましたが)コメントに関するコマンドはなかった気がします。 どなたか教えていただけませんでしょうか。 お願いいたします。
>>636 ・他の同プロセスが動いてないことを確認してから起動させる。
・特定のポートを開くとか、なにかをロックしてから起動させる。
・起動したらまずそのスクリプト自身を削除するようにする。
みたいなのはダメで、厳密には外部からの制御が必須。
なるほど windowsみたいに言語でサポートされてる訳ではないんですね
>>636 DBのロックやファイルのロックを使う。
具体的にはこんな感じ。(ファイルロックの例)
open('test.lck') do |f|
raise('二重起動です') unless f.flock(File::LOCK_EX | File::LOCK_NB)
while (print('input ^Z to exit> ') or gets) do end
f.flock File::LOCK_UN
end
>>640 その例の応用だとファイルのロックを外さずに終了しちゃう場合も出てきそうだな。
>>639 プロセスの監視を使う方法もあるが
スクリプト言語の場合
二重起動してるのはインタプリタ本体。
それらが同じスクリプトを実行してるのかどうかまでは
OSからは判らん話だろ。
だからスクリプト側でやるしかない。
>>641 rubyインタプリタが終了したらロックは外れる。
気持ち悪いならもっと作り込めば良いが。
>>645 それは特殊な場合だろ。
基本的にはロックがちゃんとはずれるように作るんだよ。
正常系のテストをちゃんとしとけ。
その上で、ロックファイルのタイムスタンプを見て、時間が掛かりすぎてると思うならロックファイル消してやりなおすなりすりゃいいだろ。
やり直していいかどうかは、何をどういう仕様でやるか次第だが。
>>641 でしたら、もっと良い例をお願いしても構いませんでしょうか?
650 :
641 :2006/09/07(木) 14:19:07
>>648 自分だったらRinda使ってtuple space上にLockを実現します。
Debian 上で $ /usr/bin/ruby /usr/bin/gem_server と gem_server を立ち上げて、Webブラウザでアクセスをしていると *** glibc detected *** corrupted double-linked list: 0x4028f8b8 *** Aborted というメッセージを吐いて死んでくれる現象が頻発しています。 /uar/bin/ruby -d で立ち上げると (eval):11: [BUG] Segmentation fault Aborted とお亡くなりになります。環境は Debian GNU/Linux etch / i386 libc6 2.3.6-15 ruby1.8 1.8.4-5 libgems-ruby 0.9.0-2 です。試しに ruby 1.8.5 を tar ball から直接 make して /usr/local/bin/ に導入し(rubygems は deb パッケージから導入したものを流用ということで) $ /usr/local/bin/ruby -I/usr/lib/ruby/1.8 /usr/bin/gem_server と gem_server を動かしてみると、落ちることはありません。ruby 1.8.4 から 1.8.5 の間で このあたりのバグフィックスがなされているのでしょうか、あるいは私の環境が変なだけ?
cygwinでRubyを使ってるんですが、コンソールを出さないでバックグラウンドでスクリプトを 動かすことは可能ですか? cronはなしでお願いします
>>652 rubyscript2exe で --rubyscript2exe-rubyw を指定して実行ファイルを作るとプロンプトでなくなる。
ログ取りたい場合は以下参照
When using --rubyscript2exe-rubyw, the application runs without a console.
This is nice for an application with a GUI. But, although you're a good programmer,
sometimes the applications simply dies. If there's no console, there's no back-trace
as well. I usually add one of the following lines to the top of my application, even
before the require statements:
$stdout = $stderr = File.new("/path/to/temp/application.log", "w")
or
$stdout = $stderr = File.new("/path/to/temp/application.#{Process.pid}.log", "w")
あとはwshでrun経由でスクリプト起動してプロンプト非表示にするオプション指定するとか
俺はこんな感じでやってる
参考になります
>>647 >>640 はflockだからcloseしたら解除される。
プロセスが終了すればfdはcloseされる。
>>652 俺には質問の意味がわからない・・・
「コンソールを出す」起動方法ってどんなの?
関連付けしてダブルクリックとかじゃね?
つか、
>>656 は元から端末が出してるだろ。
いちいちscriptを変換するより、素直にrubyw.exeを使えばいいんじゃあるまいか。
cygwin版てrubywあるの? あるならrubywに関連付けれ
cygwin使いながらコンソール嫌ってどういうことよ
すみませんが、質問です。 Rubyのソースに、関数やクラスの説明のコメントを付けたいのですが、 JavaDocのような標準的な形式はないのでしょうか? 参考になるようなコードやWebページをご紹介いただければ、いっそう助かります。
RDocでぐぐる。
665 :
663 :2006/09/08(金) 13:05:50
RDEというエディタと、ruby 1.8.4 (2005-12-24) [i386-mswin32] を使用しています。 デバッグで、ブレイクポイントまで実行してからステップを実行すると、また最初からやり直します。 どのようにすれば正常に動くようになるのでしょうか?
667 :
デフォルトの名無しさん :2006/09/08(金) 21:17:58
$debugger_restart = false
ASR使ってます。 ruby.exeにファイル名を渡した時 自動でワイルドカードが展開されますが これを止める方法はありますか?
>669 ワイルドカードを含む引数を' (シングルクオート)でくくる。 ……って話ではない?
672 :
デフォルトの名無しさん :2006/09/09(土) 12:36:02
rubyでjarみたいが概念ないの?
日本語でおねがいします
674 :
デフォルトの名無しさん :2006/09/09(土) 15:31:21
ありません ソースを全部コピーしてください
675 :
669 :2006/09/09(土) 15:41:09
>670-671 う〜ん、やっぱりそれしか無いですか… バッチファイルを作ってデフォルトで括られるようにするかな お答えありがとうございました
FileTest.exist?("#{dir}#{num}*") こういうのがやりたいのですが、これワイルドカードに対応してないようなのです 別の方法があるでしょうか?
678 :
デフォルトの名無しさん :2006/09/09(土) 18:09:54
exerbの仕組みをRuby組み込みで使えないかねえ。 具体的には、ソフトにRuby組み込むときって、dllと、ライブラリのソースがいるじゃないですか? ライブラリのソースがバババと入っているのはなんとかならんのかなー、と思った次第。 まとめられたらなあ。
>>677 Dir.glob("#{dir}#{num}*")
681 :
デフォルトの名無しさん :2006/09/09(土) 22:24:29
リファレンスを一通り読んでも解決しなかったので、ここで質問させて頂きます。 インスタンス変数はサブクラスと共有されている様ですが、 これを制限する方法は存在しますか? ほぼブラックボックス化したクラスを継承したとき、 いずれかのクラスに共有やクラス外からの変更を意図しないインスタンス変数があった場合、 サブクラス内で使われるインスタンス変数名と親クラスのそれとが被ってしまうことは非常に大きな問題に思えるのですが、 まさか解決法が無いなんてことは…ないですよね?
AjaxとかRailsとか最近よく見るけど一体何なんですか?
>682 とりあえずAjaxは板違いなのでWeb製作かWebプログラミング辺りへGo Railsも専用のスレはWebプログラミング板にある。>2 参照
オブジェクト指向を分かってない香具師が混ざってる
ありがとうございます。 いろんなこと勉強してみます。
687 :
デフォルトの名無しさん :2006/09/09(土) 23:13:41
CGIモジュールを使ってマルチパートのフォームデータを送信しようろしています。 <form action="hoge.rb" method="post" enctype="multipart/form-data"> <input type="hidden" name="id" value="id" /> <p><input type="file" name="file" size="20" /></p> <p><input type="submit" name="return" value="アップロード" /></p> </form> cgi = CGI.new としたとき, cgi['file'] は参照できるのですが, cgi['id'].read の値がなぜか空になっています。 どうすればこの値をきちんと取得できるでしょうか?
cgi['id'].first.read あと、読めるのは一回だけだから、 最初に読むときに別の変数に代入しようね
>>688 ありがとうございました。
解決しました。
>>681 俺も初心者なんで眉に唾つけてね。可視性の制御対象は、メソッドと定数だけ
で、インスタンス変数は含まれないみたい。
君の心配はわかるけど、そもそもブラックボックスをホワイトボックス再利用
しようとすることが間違いなんで、実用上問題になるとは思えない。
>>681 で困った事は俺は無いが、興味ある話題ではあるな
要は親クラスと子クラスの同名のインスタンス変数を別として扱いたいと。
う〜ん……逆にアクセサメソッド用意しちゃったら?
アクセサ付いてる変数名は使わないでしょ多分。
んでアクセサメソッドのコメントに「みだりに使うな」とか。
>>690 氏
>>691 氏
非常に参考になりした。ご返答ありがとう御座いました。
アクセサを作った心理作戦ですか・・・なかなか面白そうです。今後の参考にさせて頂きます。
>>692 PickAxeを見てたら、mixinでよく似た問題が取り上げられていました(cf. pp. 122-123)。
曰く「固有の名前を付けよ」だそうです。モジュール名を接頭辞につけるなど。
その他、ハッシュ定数を使う手もあるみたいです。
>>690 >君の心配はわかるけど、そもそもブラックボックスをホワイトボックス再利用
>しようとすることが間違いなんで、実用上問題になるとは思えない。
違う。ブラックボックスにしたいのに、親クラスで使っているのと同じ名前のインスタンス変数をサブクラスで偶然定義してしまった場合、それが親クラスにも影響を与えてしまうことが問題。
つまり、ブラックボックスにしたいのに、それができないことが問題。ホワイトボックスうんぬんは関係ない。
これは多人数でプログラムを開発するうえでは、けっこう致命的。
あまり発生しない問題ではあるが、発生した場合に発見するのが難しい。なぜなら単体テストはどれも通ってて、結合テストになってはじめて発生するから。
残念ながらRubyでは解決方法は特になく、別名をつけるしかない。
Javaならprivateにすればいいし、Pythonなら__varとかすると自動的にクラス名をつけて_MyClass_varとかしてくれるんだけどね。
というわけで、プライベートな変数の名前衝突がどうしても気になるなら、RubyよりPython使ったほうがいいかも。
>695 困るのはその通りだね。 ただちょっと言うと、 Ruby では継承そのものを利用する局面がそれほど多く ないと感じる。 Java とかと違って、継承しないと利用できない局面がそもそ もなく、同名のメソッドさえ用意しておけば問題ないから。 だからそれほど問題視されていないんじゃないかなと思う。 実際、 Ruby のプログラムで継承を使ったことはおれはほとんどない。まあそ んな大規模なプログラムを Ruby でやった経験もないけれど……。 mixin の場合はちょっとまずいのかな。
>698 えー、どうやったら与えないの? ちょっとコード例見せて(はぁと
>>689 Smalltalkの記事探してたら、偶然見つけた。
http://d.hatena.ne.jp/sumim/20060221/p1 コード:
class Parent
def set(val)
@val = val end
def show
puts "Parent:"+ @val end end
class Child < Parent
def set_(val)
@val = val end
def show_
puts "Child:"+ @val end end
obj = Child.new
obj.set "for Parent."
obj.set_ "for Child."
obj.show
obj.show_
obj.set "for Parent."
obj.show_
実行結果:
Parent:for Child.
Child:for Child.
Child:for Parent.
701 :
デフォルトの名無しさん :2006/09/10(日) 14:47:52
>>680 exerbの作者、面白いもん作ってんなー。
さすが、未踏ユースゲッターだ。
いじってみるか
nodedumpとどこが違うんだ?
>700 それ、思いっきり影響与えてるじゃんw
影響与える例では?
707 :
700 :2006/09/10(日) 15:21:16
すまんすまん、俺は698ぢゃないよ。これは影響を与える例。
じゃあやっぱり>698が出てこない事には始まらんな
まあ、private変数がないんだから、Pythonの__varと同じく命名法でしのぐか、ハッシュ 定数でしのぐしかないわな。
Pythonの__varはクラス名が連結されるから状況は大分違う罠。 ハッシュ使えばほぼ解決できるな。醜くなりそうだけど。
711 :
デフォルトの名無しさん :2006/09/10(日) 16:15:50
>>700 ちょwwww
手元でも確かめた、マジこれまずいでしょ。
何がまずいかっていうと、他の言語の感覚で使うと非常に困るんだな。
Rubyは、継承ってあまりしないのかもしれないけど・・・。
>>709 ハッシュ定数ってどゆこと?
perlみたいに、全部Hashに突っ込むの?
712 :
709 :2006/09/10(日) 17:38:59
>>710 Rubyでも @_class_var みたいに(手で)連結すればいいやん。
>>711 ハッシュ定数は想像の通り。ところでそんなにマズイか?Mixin以外に困る事態が想像しにくいのだけど。
マズイのは、完全に親クラスの変数名を把握しておく必要があることだな。 下手に安易な変数名をつけられないよ。 まさか、ドキュメントに変数名が全部網羅してあるとは、限らない。 ソース読まないと安全に使えないということになる。 他の言語だと気にしないですむだけに、怖いな・・・
結局変態的な名前を使うことで落ち着く
ハンガリア〜ン ハンガリア〜ン
ruby 1.8.4 (2005-12-24) [i386-mswin32] すみませんrubyマニュアル当たってもなかなかヒットしないので教えてください Windows環境でputsしたりするときに、改行コードをLFにしたいのですが どのようにすればいいのでしょうか?
それはputsの仕事じゃない と思う
そもそもプロトタイプがなくてソースを上から順番に 書いて行かないといけないというのもかなり違和感あります。
>>716 puts "改行で終わる文字列オブジェクトが引数になった場合puts自身は改行しません\f"
p Dir.glob(" M 字 開 脚 /*") とすると必ずnilが返ってくるのですがバグですか? mswin32です
ディレクトリ名の最後に空白があると駄目なようでした
Dir.globってここぞという時に限って動作微妙だよな
それよりそのフォルダ名の方が気になるワケだが
>>721 Windowsじゃそういうファイル名は付けられないから。
わお > 指定されたパスの最初にある空白文字は除去されます。 > 指定されたパスの最後にある空白文字は除去されます。 > コロンの後ろにあり、パス区切り文字の前にある空白文字は除去されます。 > ディレクトリ名あるいはファイル名の最後にある空白文字は除去されます。
Dir.mkdir("表")
>>725 ディレクトリ名ってWindowsじゃフォルダって言うんじゃないのか代
Windowsではディレクトリもフォルダとして扱うというだけのことであって、 別にフォルダをディレクトリのように扱えるということではない マイ コンピュータ や コントロールパネル を移動したりすることはできないという意味なのだろう
>>730 >マイ コンピュータ や コントロールパネル を移動したりすることはできない
出来ますが何か?
ruby-mode で指定領域を一気にインデントする方法ってある?
>>733 region を指定した上で indent-region では何か不足?
>>732 あれはレジストリ内の参照用パスの再設定じゃね?
ディレクトリの移動とは別物だと思う
概念的存在のフォルダの移動はできない、でよいかと
>>667 どうもです。
ソースコードにその一文を追加してもダメでした。
どこかに設定欄があるのでしょうか?
>>734 いいえ。
ruby-mode.el を見ても、そんなの無かったので気が付きませんでした。
そういったものの一覧を知るにはどうしたら良いですか?
>>734 いろいろあるが、まず基本はこれだろ。
M-x info -> Emacs
Turbo Emacs
>>738 >ボーランドにとっての最大の資産は,忠誠心の高いユーザーからなるコミュニティであろう。
>彼らが「このツールいいよ」とネット上でクチコミで広めてくれたり,積極的にカスタム
>・コンポーネント(ソフトウエア部品)を作ってくれたりするようになれば,それなりに勝機はある。
いまは逆の展開になってるよな・・・
>>741 ワロタ
確かに逆だww
(公証は)Turboは外部コンポーネント使えないしなw
ネイティブでも.netでも何でもいいから 本当の意味でのコンパイラがでてくれれば買っちゃうよ
print "abcdefghijklmn" print "\ropq" とすると opqdefghijklmn となってしまうのですが opqだけ表示するために表示行を一度クリアするには どうすればいいんでしょ?
>>744 UNIX/Linuxなら
print `tput el` # 行末まで削除
print `tput el1` # 行頭まで削除
>>745 winなんで駄目ですねぇ
規格を定めた人もその辺まで考えといてくれよと
>>744 やっぱり
print "\ropq" + ' ' * ("abcdefghijklmn".length - "opq".length)
じゃないか?
それなら\b使った方が。
最近のwinではANSIエスケープシーケンスも解釈しないんだっけ?
print "abcdefghijklmn" print "\r " print "\ropq"
system 'cls'
>>749 XP以降では標準でANSIエスケープシーケンス無視するね
解釈するように設定変更はできるけど
>>752 Win2000でも無視する。NT4でもそうだったような。
> 解釈するように設定変更はできるけど
できるの?
できる
どうやって?
あのー、ansi.sysを組み込んでのエスケープシーケンスの利用って、 16bitアプリケーションの場合しか有効にならないんですけど、 そのことを考慮していらっしゃいますか?
$ ruby -e 'print "\x1b[35ma\x1b[36mb\x1b[31mc"' cygwinで実行したらOKだった
C:\nullpo> ruby -e 'print "\x1b[35ma\x1b[36mb\x1b[31mc"' cmd.exeで実行してもOKだった
C:\>ruby -e 'print "ガッ!!"'
>>759
command.com上なら動いたみたいだが cmd.exe上は動かないみたい さてどうしたものか
素直にwin32console使えばいいべさ
>>744 print "\x1b[s"
print "abcdefghijklmn"
print "\x1b[2K"
print "\x1b[u"
print "opq"
iconvとkconvで puts Iconv.conv('utf8', 'sjis', '\\\\/') # 促促/ puts '\\\\/'.tosjis.toutf8 # \\/ と結果が違うのですが、Iconvの方なんかおかしくないですか? ruby 1.8.4 (2005-12-24) [i686-linux] です。
>>765 iconvも\\/になったけど。
libiconvのバージョンは?
[ruby-list:42796] Re: in演算子の提案 きたね。 個人的にはイラネと思うが、まぁ直感的な記法だから邪魔にはならないかな。
文字列中の半角と全角を分割する方法ってないでしょうか? 文字コードは変換可能なので気にしません。 str = 'abcあいうdefえお かき<?>くけこ' array = hoge(str) p array #=> ['abc, 'あいう', 'def', 'えお', ' ', 'かき', '<?>', 'けこ']
こんな感じ?「半角」の範囲は適当。 str.scan(/[\x21-\x7e\s]+|[^\x21-\x7e\s]+/).to_a
著作権の関係で実際のコードをここに貼れないんだけど、 (1) NKF.nkf などを使って ISO-20200-JP に変換する (2) String#scan で ESC を検索して分割 (3) それぞれの部分文字列を再度 NKF.nkf で適当に変換 という処理なら昔やったことがある。
ベタだが一応貼っとく。 #!ruby -Ks def hoge(str) ret = [] flag = nil str.scan(/./).each do |chr| if flag != (chr.size == 1) flag = (chr.size == 1) ret << "" end ret[-1] += chr end ret end p hoge("abcあいうdefえお かき<?>くけこ")
772 :
765 :2006/09/13(水) 15:13:34
>>766 どもです。
$iconv -version
iconv (GNU libc) 2.4
でした。2.3.5のdebianやMacOSX10.4でも
>>765 と同様の結果です。
うーん、何がおかしいんだろう
うちでもなるねえ。 Shift_JIS の代わりに CP932 にしてみるとどう?
ああ、うちの iconv (GNU libc) 2.3.6 でも発生した。 バックスラッシュで iconv が狂うみたいだな。 Ruby の問題ではない。 SJIS のかわりに CP932 を指定すれば化けないよ。たぶん。
775 :
765 :2006/09/13(水) 16:11:08
おお。CP932でひとまず解決しました。ありがとうございました。
>>767 if x in [1,2,3] って is を補いたくなるね
[1,2,3].has? 4 というのがあれば読み下せるんだけど、[ruby-list:24603]で切り捨てられてるか
777 :
768 :2006/09/13(水) 18:30:07
>>769-771 ありがとうございました、いろいろ方法があるんですねー
769さんの方法がシンプルで良さそうなんですけど
使う文字コードによってマズイことがあるのかな?
>777 むろん。 shift-jis や 7bit jis では問題が起こる可能性がある。 ふだんから euc-jp や utf-8 を使ってるなら問題ナシ。
779 :
769 :2006/09/13(水) 19:02:43
>>777 >>778 の言う通りで、 7bit jis (ISO-2022-JP) だとダメだね。
Shift_JIS なら -Ks か $KCODE = "s" する (あまりおすすめできない) か、
/.../s みたいに Shift_JIS と見做すオプションを付ければ問題ないと思う。
class Foo def bar(str) str =~ /(hoge|huga|hage)/ ... end みたいな感じで正規表現を使う場合、インスタンスが生成されるたび、 あるいはメソッドが呼ばれるたびに正規表現のインスタンスが作成されるのでしょうか? /(hoge|huga|hage)/が静的な場合、定数を定義した方がよかったりしますか?
新サイト、両脇の紺色の無駄な空間は大き過ぎるだろ。 空間効率悪過ぎ。
783 :
デフォルトの名無しさん :2006/09/14(木) 02:21:09
>>780 生成されちゃいますね〜。
ご名答ですw
>>780 静的なRegexpはparse時にインスタンスが作られる。
>>783 はネタのつもりなのかただの勘違いか。
785 :
デフォルトの名無しさん :2006/09/14(木) 07:09:26
勉強するならCとRubyとSchemeだな RubyやめてJavaでもいいが
Rubyやめて、Javaはない。 全然、性格が違うではないか
787 :
780 :2006/09/14(木) 12:54:09
CとPerlに触れてみてから、そのときの経験を元にして
足りないものを満たしてくれたり自分のやりたいことのできる言語を探したほうがいいと思う
最初にRubyというのは、最初にPHPと同じくらい悲惨だ(悲惨のベクトルは真逆だが)
っていうか脈絡なさ杉
>>784 そうなんだ
変数が入ってる場合はるびま添削の第1回みたく括り出したほうがいい?
o オプションを使う香具師はいないか。
>>788 悲惨というのはどういう意味?
他の言語がかったるくて使えなくなるみたいなこと?
すみません、質問させてください。 Rubyでbz2圧縮のファイルを扱えるモジュールはないでしょうか? 「Rubyアプリケーションプログラミング」という本に、bz2拡張ライブラリ の作り方が載っているようなんですが、それを参考に自作する以外に 何か方法があればうれしいのですが。
>>792 実はWindowsでRubyのスクリプトからbz2で圧縮されたファイルを展開
する、ということをしたいのですが、ご教示いただいたライブラリでは、
無理みたいです(たぶん)。
現在はbz2のwin32バイナリをコマンドラインから呼び出す形にしています。
ただ、他の人がスクリプトを使うとき、いちいちbz2を落としてきてもらう
必要があるので、もっとスマートな方法があるといいんですが。
Ruby/Tkでテキストウィジェットの背景に指定した画像ファイルを表示させるにはどうしたらいいですか?
796 :
デフォルトの名無しさん :2006/09/15(金) 02:03:48
みなさんエディタは何使ってますか? 自分はRDE(Ruby Development Environment)を使ってるんですけど。 もっといいやつありますかね?
emacs vim xyzzy
>>797 補完機能ありますか?
RDEはメンバメソッドの一覧とか表示してくれて便利なんですけど。
799 :
デフォルトの名無しさん :2006/09/15(金) 04:05:15
>>796 俺はemacs一本。
winだったらmedowっていうemacsがあるよ
xyzzyのruby-mode使ってるが、機能がないに等しいw
>>793 win32バイナリも一緒に配布するってのじゃだめなのかな。
それより、「ファイルを展開したい」とあるけど、もし *.tar.bz2 なファイルのことをいってるのなら、
bzライブラリは圧縮ファイルを解凍するだけで、tarの展開は別のライブラリを使わないとできないよ。
rubyforgeにmini-tarというライブラリがあるからそれをつかうといい。
>>799 maedow => Meadow
emacs => Emacsen
p "abc".to_a.pack('m') #=> "YWJj\n" p "a\012c".to_a.pack('m') #=> "YQo=\n" p "\012bc".to_a.pack('m') #=> "Cg==\n" $/ = nil p "abc".to_a.pack('m') #=> "YWJj\n" p "a\012c".to_a.pack('m') #=> "YQpj\n" p "\012bc".to_a.pack('m') #=> "CmJj\n" デフォルトだと0x0aの後が正常にpackされないのは仕様なのですか? ruby 1.8.5 (2006-08-25) [i386-mswin32]です。
そこでto_aを使うのが間違ってる。 String#to_a は $/ で分割する。 p ["a\012c"].pack("m")' #=> "YQpj\n"
805 :
803 :2006/09/15(金) 10:08:45
ありがとうございました。 バイナリデータの途中の処理だったので思いもつきませんでした。 p "a\012b".to_a #=> ["a\n", "b"]
vimに決まってるだろ馬鹿か。 大抵Emacsが良いとかいってるやつはvimを使ったことがないんだ
ed いや、なんでもない。
しかし、エディタネタは定期的に出てくるよな。 ってレスも定期的に出てくるよな。
大体Emacsなんて起動させるのにemacsと5文字も入力しないといかん。 vimなんてviの2文字で起動する、しかもvとiは打ちやすい位置に配置されてる。 この時点でvimの完全勝利だが起動時間もvimのが速い。 Emacsなんて起動が遅すぎて待ってる間にプログラミングしようという気力が萎えちゃうね。 vim is the best editor. all other editors are sucks.
Emacsって常駐させているもんなんじゃないの?
aliasやTab補完……いやなんでもない まじれすなんてするものか
s=<<EOS hoge moge mage EOS という文字列があったとき、 先頭と末端に文字を追加したいのですが、 puts s.gsub(/(.+?)\n/, "++" + $1 + "++\n") では、 moge moge moge となりうまくいきません。 どこが間違っているのでしょうか?
>>812 その文章からはどう追加したいのかわからんのだが。
結果としてどういう文字列が欲しいか書け。
エスパーすると puts s.gsub(/(.+?)\n/, "++\\1++\n") または puts s.gsub(/(.+?)\n/) { "++" + $1 + "++\n" } でいいと思う、というかリファレンスよめ
>>809 vi の 2文字で nvi が起動してしまう私は FreeBSD ですかそうですか。
>>795 こういうインタフェイスを使うには、とりあえずbzip2をソースからコンパイル
しないといけないんだろうと思い、VisualC++のトライアル版をインストール
してみました。が、windows.hがないとか言われて上手くいきませんでした。
なんかRuby云々よりも私自身のスキルの問題のようです・・・。
>>801 あ、なるほど。バイナリ自体を含めてしまったらいいんですね。
思い至りませんでした。
あと対象のファイルは単なる.bz2なのですが、mini-tarのこと教えていただき
ありがとうございました。覚えておこうと思います。
818 :
791 :2006/09/15(金) 17:10:23
>>817 こういうものがあったとは知りませんでした!
近々試してみたいと思います。
取り急ぎお礼まで。
Emacsは最初に起動してその中でファイル操作をするべきだろう まさかとは思うがいちいち $ emacs hogehoge.rb という起動の仕方をさせているわけでもあるまい とか言う俺はviやlessで新たにファイルを読み込むキーバインドを覚えらんね
んな Emacs の起動の仕方なんてどうでもいいだろ。 Ruby スレでは。
821 :
812 :2006/09/15(金) 18:09:43
++hoge++
++moge++
++mage++
にしたかったのでした。
>>813 >>814 うぉぅ、デキターーーー。
エスパーサンクス!!
リファレンス読みます。すまん。
emacsの利点はカスタマイズ性。 あれはviには真似出来んよ。
ruby入門者だけど、さっそくruby-modeやrrseいじったりして肝心のrubyが(ry
Emacsはキーを二つ使うコマンドが多すぎ。 その点viはシンプルで素晴らしい。viの完全勝利。
viは便利かも知らんが、覚えるまでが大変そう。
>824 そう思ったら自分好みに変えるのがemacs
2ストロークのキーの最初の1つめは、よく使われてるのは数個しかないだろ。 Ruby 1.9.1 マダァー?
EDLIN ...
さー、恒例のお互い決着などつける気が全く無い世紀のぐだぐだ討論 "Vi vs Emacs" がまたはじまったぁぁぁーーー!! 今回は一体何レス無駄に消費するのかっ! するなら本スレでやってくれっ!
832 :
デフォルトの名無しさん :2006/09/16(土) 04:13:36
Rubyのコンパイラっていつごろできそうなの?
833 :
デフォルトの名無しさん :2006/09/16(土) 04:14:36
いや、全然。 少なくともvi vs Emacsの話よりかはこのスレに合ってる。
むかしr2cってなかったっけ?
Emacsからviに乗り換えた途端に 宝くじに当たるわ女にモテるわ仕事も順調になるわで幸せになれました。 みんなもEmacsからviに乗り換えて幸福になりましょう^^
乗り換えた途端に不幸になったら 責任とって……くれますか?
もちろんとるよ。
open-uriはリクエストメソッドをPOSTでファイルを読み込むにはどうすればいいのでしょうか。 また、Net::HTTPで、レスポンスボディをIOで読みたいのですが、それをするにはどうすればいいのでしょうか。
任意長の文字列が数百個からなる集合があったとして ある文字列がその集合に含まれるかを高速に確認する方法はどのようにすれば良いでしょうか ・Arrayにいれて、Array#include? ・Hashにいれて、Hash#include? ・Hashのkeyで判断、if hash(str) …… ・その他
訂正 × ・Hashのkeyで判断、if hash(str) …… ○ ・Hashのvalueで判断、if hash[str] …… なお、グループ内の文字列は同じものの複数存在することはありません。
843 :
デフォルトの名無しさん :2006/09/17(日) 13:42:36
こんにちは。 コマンドラインのツールを作ろうとしていますが、 コマンドライン引数を便利に扱うライブラリは ないでしょうか?
>>841 数百個程度ならArray#include?で十分だと思われ。
846 :
デフォルトの名無しさん :2006/09/17(日) 14:13:12
>>841 Hash が使えるなら Hash で。O(1) だし。
>>841 Set が使えるなら Set で。O(1) だし。
>>846 まじでー
ハッシュってなんというか処理重いイメージあるんだけど探し物には便利?
何度も使い回すんならHashでもいいかな。 使い捨てならArrayの方が良さそう。
正規表現で探したりするならArray キー一発でそのものだけを見付けたいならHash データがものすごく多いならRDBMS使用
852 :
デフォルトの名無しさん :2006/09/17(日) 14:55:47
Array#joinして=~するのは遅い?
>>853 物によるだろうね。大抵は遅くなりそうだけど。
知りたいなら、計って見ればいいじゃない。
855 :
841 :2006/09/17(日) 15:11:08
ありがとうございました。 正規表現は使用しないのでHash使用が良さそうですね。 いま思ったのですが、Hashっていうのはハッシュソートのハッシュのことなのでしょうか?
856 :
デフォルトの名無しさん :2006/09/17(日) 15:23:28
>>855 ハッシュのアルゴリズムを使った配列のこと
perlの連想配列って言ったらわかる?
857 :
デフォルトの名無しさん :2006/09/17(日) 16:03:05
858 :
デフォルトの名無しさん :2006/09/17(日) 16:15:16
シンボルが実質的に廃止されそうな流れになってるとは知らなんだ。 やだなー。
ruby-1.8.5 に portupgrade しようとおもってやってみてるんですけど、 ログをみると、 ruby lib version (1.8.4) doesn't match executable version (1.8.5) (RuntimeError) といわれてとまってしまいます。 だれかおしえてください。
>>860 環境kwsk書かないヤツに教えることは何もない。
rubyの小数点の精度ってどれくらいですか? Σ1/n^12 の話を計算したいんですが、n = 100程度までの値を正確に出したいのです。 小さな少数を扱うクラスがあれば教えて欲しいです。
BigDecimal
ごめんなさい。 FreeBSD 6.0-RELEASE-p7 です。 現在の ruby のバージョンは 1.8.4 です。
有理数の範囲内なら、Rationalもあるよ。
>>860 1.8.5のrubyが古い1.8.4のrbconfig.rbをロードしてるメッセージだな。
FreeBSD使ってないので、どこの何がまずいのかはわからん。
867 :
デフォルトの名無しさん :2006/09/17(日) 23:16:22
funcの中で「a」を書き換えたいのですけど、どうやるのでしょうか? Stringの場合はreplaceで出来たのですが。 初歩的な質問してすみません。 def func(d, s) end a = 0 func(a, 10) p a
>>867 基本的に無理。
Fixnumはimmutable
どうしてもやりたければ配列使うとかしないとダメ。
>>868 なんとそうですか。
こういうプログラムは設計自体がRubyの仕様に合ってないのでしょうね。
見直した方が良さそうです。ありがとうございました。
Rubyは、参照渡しができないんだっけか?
>870 FortranとかVBとかC++にあるような「参照渡し」はない。
rubyでlameを呼び出してmp3のエンコードしているんだけど system()でプロセスの優先度指定できない? 裏で作業させているとちょっと重くて・・・。 ruby 1.8.5 (2006-08-25) [i386-mswin32] なんだけど、厳しいかな。
lame コマンドなら --priority オプションつかえばいいっしょ
875 :
デフォルトの名無しさん :2006/09/18(月) 08:43:35
クラス名の文字列からクラスまたはインスタンスを得るにはどうしたらよいですか?
877 :
デフォルトの名無しさん :2006/09/18(月) 10:15:56
878 :
デフォルトの名無しさん :2006/09/18(月) 10:24:19
ありがとうございます
eval の第2引数に、stringじゃなくてprocを指定できませんかね。 bindobj = binding() eval '...', bindobj だと毎回文字列をパースして効率が悪いので、あらかじめprocオブジェクトに しておいてそれをevalできればいいかなと思ったのですが、どうしたらいいで しょうか。 (関数に出来ないのは、bindingオブジェクトをつかうから。) instance_eval だとprocオブジェクトを渡せるみたいなんですが、そうすると 今度はbindingオブジェクトを渡せなくて困ってます。
>860 portupgrade の途中でそうなるの? おれの環境ではそういうことは起こらなかったが。 なんにせよ、 portupgrade を使わず、ふつうに ports でビルドすれば問題ないだろう。 あと、このスレより FreeBSD 関連のところで聞いた方が実りがあると思うよ。
>>875 str = eval("String").new
p str.class
かな。素人だから知らないけど、そーゆーのはとにかくevalっとく。
変数の場合は、instance_variable_get みたいのがあるけど。
>>872 Win32 API を叩く話になるんじゃないかな、そーゆーのって。
882 :
881 :2006/09/18(月) 11:59:30
俺、読み込んでから、どんだけ放っておいたんだよ orz
>>879 > eval の第2引数に、stringじゃなくてprocを指定できませんかね。
できない。
> (関数に出来ないのは、bindingオブジェクトをつかうから。)
bindingをかえるということは、一回目はローカル変数と解釈されたものが
二回目はメソッド呼び出しと解釈されるかもしれないということだ。
手元の perl のプログラムで、集計にハッシュを使って $x->[$a][$b] += 1 なんてかんじのコードがあるのですが、これを ruby で書き直そうと思っています。 x = Hash.new{|h,k| = Hash.new(0)} ... x[a][b] += 1 ... というように書けば希望通りの動作をしてくれるのですが、この場合 x を Marshal で書き出そうとすると TypeError: can't dump hash with default proc とエラーになってしまいます。マニュアルに明記してある仕様なのでしようがないのかとも思うのですが、なにか(Marshal.dump できるオブジェクトにするための)逃げ道はないでしょうか? Hash.new でブロック指定しないでおいて x[a][b] の値変更時に、x[a] や x[b] の値が nil かどうか事前チェックする、とか例外 NoMethodError を捕捉するとかいう、苦し紛れの方法しか私の頭では思いつかないので…。
>>885 自前でそういう働きをするクラスを作ればよい。
class MyHash
def initialize
@hash = Hash.new
end
def []=(k,v)
@hash[k] = v
end
def [](k)
@hash.key?(k) ? @hash[k] : Hash.new(0)
end
end
p Marshal.dump(MyHash.new) #=> "\004\bo:\vMyHash\006:\n@hash{\000"
887 :
886 :2006/09/19(火) 20:08:27
あ、全角スペース使ってるから、コピペする際は半角スペースなどに置換してね。
Kernelで定義されている関数はなぜprivate? publicだったら、関数をオーバーライドしてしまったときでも Kernel.puts とかで呼び出せるのに。
__send__
"hoge".putsなんてできたら明らかに気持ち悪いと思う
>>872 startコマンド経由で実行させるというのはどうでしょうか
start /b /idel lame ”WAVEファイル名” "MP3ファイル名"
みたいに
>>885 x.default = nil
Marshal.dump(x)
893 :
888 :2006/09/20(水) 19:02:45
>>889 __send__ でできるのはしってるんだけど、それを聞いているんじゃなくて、なぜprivateなのかを聞いているんですけど。
>>890 説明が足りなかった。インスタンスメソッドとしてはprivateでもいいんだけど、モジュールメソッドとしてはpublicでもいいんじゃないか、ということ。
それなら "hoge".puts はできないけど Kernel.puts はできるよね。それが自然に思える。
>>893 何を問題にしているのかわからない。
Kernelのプライベートメソッドってあまりないし、
Kernel.putsはpublicだし、
何か問題あった?
勘違いしてたらごめん。まじでわかんない。
Cで言うところのファイルスコープのメソッドがKernelのプライベートメソッド。
>>893 トップレベルはデフォルトでmodule_functionにしろってか。
>>895 だうと。他のファイルも影響を受ける。
require "lib"
A.new.foo # 3
def puts(s)
raise "abort"
end
A.new.foo # abort
------------ lib.rb -----------------------
class A
def foo
puts 3
end
end
898 :
885 :2006/09/21(木) 02:37:41
>>886 ,887
そうか自分でクラス定義すればよいわけですね。
class MyHash
def initialize
@hash = Hash.new
end
def []=(k,v)
@hash[k] = v
end
def [](k)
@hash.key?(k) ? @hash[k] : (@hash[k] = Hash.new(0)) # ← だけちょっと修正
end
end
で希望通りの動作になりました、どうもありがとうございます。
ちなみに、実質的に同じことだとは思うのですが、次のようなコードでも問題ないでしょうか?
class MyHash < Hash
def [](k)
self.key?(k) ? self[k] : (self[k] = Hash.new(0))
end
end
# インデントに全角スペースを使っています
ポスト安倍は?,2006/09/21,麻生太郎,谷垣禎一,福田康夫,小沢一郎,石原慎太郎,小泉純一郎,その他 こういうデータを data = str.split(',') し p data.size とすると 10が帰ってきて難儀しています。 エンコードのせいでしょうか?
いいえ、違います
その他を考慮してるんだよな>1個増える
試してみたが、9がかえってくるぞ
903 :
899 :2006/09/21(木) 18:19:26
手元のスクリプトではdate.sizeになってました 3時間くらい悩みました
ピーすりゃいいのよ、ピー
きたねーな
any? や find? や map に渡されたブロックの評価順序ってどうなっているのでしょうか。 たとえば a = [0,1,2] x = nil puts(x) if a.any?{|e| (x = e) < 3} # => 0 が仕様として保証されるのか、ということです。マニュアル読むとけっきょく該当クラスにおける each メソッドの定義しだい、ということのようですが…。
>>894 Kernel.putsはpublicじゃないだろ。
Rubyでのpublic/privateはJavaやC++と違うんだけど、それはわかってるよね?
>>907 putsはKernelのモジュール関数として定義されてるからpublicでしょ
Kernel#putsはprivate
> more test.rb module MyModule def p Kernel.puts end end MyModule.p > ruby -v ruby 1.8.4 (2005-12-24) [i386-mswin32] > ruby test.rb test.rb:6: private method `p' called for MyModule:Module (NoMethodError)
> more test2.rb class MyClass include Kernel def p self.puts end end MyClass.new.p > ruby test2.rb test2.rb:4:in `p': private method `puts' called for #<MyClass:0x2ab71b0> (NoMethodError)
911 :
909 :2006/09/22(金) 08:30:49
この辺の挙動がよく解らないのですがどうなってるのですか?
>>906 > puts(x) if a.any?{|e| (x = e) < 3} # => 0
あたりまえだが、ifの条件式が先に評価される。
ブロックも(呼ばれれば)いっしょに評価される。
もちろん、ブロックが呼ばれるかどうかはeachの定義次第。
ああ、yieldされる順序のはなしか? それはもちろん、何をどういう順序でyieldするかeach次第。 というか、eachの役目はそれを定義すること。
914 :
906 :2006/09/22(金) 11:21:59
>>911 ,912
> ああ、yieldされる順序のはなしか?
そうです、用語がわからなかったので妙な書き方になっていてすいません。
> それはもちろん、何をどういう順序でyieldするかeach次第。
> というか、eachの役目はそれを定義すること。
なるほど、Klass#any? や Klass#find や Klass#map の yield する順序は Klass#each の定義しだいと。
うーむ、Array#each の「仕様」はどこで決まっているのかなあ(実装 == 仕様 ?)…ユーザ側でメソッド再定義できるからそのあたり気にするべきでない(each の定義に依存するコードは書かない)というのが正しい姿勢?
915 :
906/914 :2006/09/22(金) 11:23:51
わあ、すいません
>>912 ,913 さん
の間違いです、インデックスが1つずれてしまった。
Arrayのeachって、[a, b, c, ...]の順番どおりなんじゃないの? Hashは順不同だけど
Arrayはreverse_eachなんてのもあるくらいだし、先頭からと決まってる。 あとはIOなんかも先頭からだ。
というか、Arrayって単なる集合ではなく配列だしな 勝手に順番かわったりしたら困る
だけど、any? が順序付けされてることを保証すると考えるのもなあ。
せっかく順序なんかを捨象して抽象化したところに副作用を持ち込んだ上に
直感に反する目的に使うのはださい。
>>906 を普通に書くと
puts(x) if x = a.find{|e| e<3}
じゃないの。
>>919 > せっかく順序なんかを捨象して抽象化したところに副作用を持ち込んだ上に直感に反する目的に使うのはださい。
う、たしかにそうですね、頭が悪いなあ > 自分
でも find (系?)のメソッドについては順序保証が欲しいような…たとえば
x = 'aaaaaaaaaaaa'
puts [/a/, /aa/, /aaa/].reverse.find{|r| r.match(x)}
で /aaa/ が返ると思ってよいか、とか。
- Array#each は配列の先頭から順番に各要素を yield へ渡す
- Enumerable#find の引数として渡されたブロックが Klass#each 内での yield の呼出し順に処理される
ことは保証済みと考えてよいのかしら、というあたりがモヤモヤっとしているのです。
>>921 キャッシュって言葉が指すものがいろいろあって何の話かわからん
>>921 えと、ファイルにキャッシュする感じですね。
例えば、「なんでもRSS」みたいに、既存のページを他のものに変換するようなサービスを考えてください。
リクエストに応じて、毎回ページを変換していると、処理時間を食うので、
ファイルかなんかに、キャッシュしてくれるというイメージです。
時間切れ管理なんかもあるとよい感じです。
926 :
919 :2006/09/23(土) 07:59:06
>>920 find系は(順序がつくコンテナでは)順序保証があると思っていいと思うのよ。
919の後半はそういう意味。
なので、
>>920 で懸念されている点についてはOKだと考えていいと思う。
一方、any? とか include? とか、そういうのはコンテナ全般に対して
意味が定義される操作で、かつ述語なので副作用は本来考えて筈。
そういうのに順序を期待するのは変な感じがする。
いや、eachを使うというのがEnumerableの仕様だから、 eachが保証するかぎりは保証されると思っていいよ。
eachを無視するクラスもあるから微妙な希ガス。 class Array def each yield 0 end end [1,2,3].each{|i| puts i} # 0 p [1,2,3].collect{|i| i} # [1,2,3]
何が言いたいんだろう。
でもorとかandを分岐に使う奴だっているんだから any?とかに副作用期待したっていいんじゃね? まあfindで間に合うんだったら俺だってfind使うけど
>>929 eachを再定義してもcollectはそれを無視するということだろう
933 :
デフォルトの名無しさん :2006/09/23(土) 14:57:05
ActiveScriptRuby 1.8.5.1の環境で配列を[]のまま使おうとすると落ちるんですが、他の環境ではどうですか? 1.8.4のときは大丈夫だったような気がするんですが c:\ruby>ruby -e"puts [2006, 9, 23] " #=> [BUG] cross-thread violation on rb_gc() ruby 1.8.5 (2006-08-25) [i386-mswin32]
ActiveScriptRuby 1.8.5.1 で問題なす
>>934 やってみたがうちのASR1.8.5では普通に出力されるな。
>>927 それはEnumerableをmixinするクラスを書く人に向けた仕様だろ。
mixinした結果得られるany?だとかのメソッドのユーザにとっては、それが
Enumerableの実装そのままだなんてのは関知すべきでない実装上の事情。
適宜コンテナの内部仕様に即した再定義がなされているかもしれない。
例えば、priority queueではinclude?なんかは値によっては前からでなく
後ろから探し始めるよう再定義されてもおかしくない。
>>937 > 関知すべきでない実装上の事情
そうなのかな?
あるクラスのユーザは少なくともそのクラスが Enumerable を mixin しているかどうかは
関知しているべきじゃないの?
べきじゃない
>>939 じゃあどうするべきと思うの?
ユーザはそのクラスが何を mixin しているか知っているべきでないとすると、
そのクラスのメソッドそれぞれがどういう仕様かを
Enumerable の仕様とは別に全てのメソッドについて個別に知っておくべき?
>>937 では、「だからユーザはどうすべきなのか」が読み取れないんだけど。
だからユーザはカプセルの中身が気になるなら中を見てそれに応じて実装、 気にならないor気にしたくないなら自分で実装すべきってだけなんでは?
>>940 気の利いたマニュアルなら、どういう順番で戻るのか、あるいは順不同なのかが書かれてるはず。
Rubyのマニュアルが今どうなってるのかは知らんけど。
>>943 差分プログラミングが何だかわかってないだろ?
>>937 何を寝言いってるんだか。
Enumerable#any?の仕様を知るのにEnumerableのドキュメントなんて読むべき
じゃないってのか?
> 適宜コンテナの内部仕様に即した再定義がなされているかもしれない。
eachに従うってのがEnumerableの仕様。
> 例えば、priority queueではinclude?なんかは値によっては前からでなく
> 後ろから探し始めるよう再定義されてもおかしくない。
そのpriority queueがそういう仕様なら、そいつが明記しておくべきことで、
Enumerableとはまったく関係ない都合だな。
なんでお前の脳内ライブラリの都合までEnumerableが全責任を負わなきゃならんのだ。
>>945 差分プログラミングするのに何でカプセルの中まで見なきゃならんのだ?
> Enumerable#any?の仕様を知るのにEnumerableのドキュメントなんて読むべき > じゃないってのか? Rubyの場合にはドキュメントを見るより、はじめからソースを読んだ方が早くて 正確なことの方が多いな。で、足りなければドキュメントを読む。
これだからRubyは…
これだからRubyは下手なドキュメントよりコード書く方が早くてわかりやすいと言われるんだよな
これだからRubyistは…
これだからRubyistは素晴しいコードを書くなんて言われるんだよな
実際、他の言語より読むのはラクだ。 ソフトの内容の割に行数が少ないと感じる。
ものすごくポジティブな切り返しだな。
>>953 >実際、他の言語より読むのはラクだ。
>ソフトの内容の割に行数が少ないと感じる。
はたして、読みやすさと、ソフトの割りに行数が少ないことは共存するのだろうか?
するでしょ
ソフトってなんじゃらほいという話にはなるが、 Rubyスクリプトは高等な(w動作をさせられる場合でも 読み下しやすい短さで書けることが多いとは感じる
pythonで定積分。 def integrate (f, a, b, n): def subinte (f, a, b, n): if a < b : return f(a) + subinte (f, (a + n), b, n) else: return 0.0 return n * subinte(f, a, b, n) integrate((lambda x: x*x), 0.0, 1.0, 0.01) rubyで書くとどうなるの? つうか、rubyで、関数を引数にするにはどうするの?
いくら短くても inject 使われてたらあほな俺にはそれ以降読めん。
>>958 pythonのコードでインデントが消えるのって致命的だなあ。
それはともかく、こんな感じかと。
コピペするなら全角スペースは適当に置換してね。
def integrate (a, b, n, &block)
def subinte (a, b, n, &block)
if a < b
return block.call(a) + subinte((a + n), b, n, &block)
else
return 0.0
end
end
return n * subinte(a, b, n, &block)
end
p integrate(0.0, 1.0, 0.01){|x| x*x}
961 :
958 :2006/09/24(日) 11:36:08
p integrate(0.0, 1.0, 0.01){|x| x*x} の二番目の引数を増やしていくと SEGVする件について。
3.72まで大丈夫だった
>935-936 あいや、再現条件が間違ってました。 cmd.exeのカレントディレクトリがc:\windows\system32だと、ワンライナーでこけてしまいます。 こちらの環境依存でしょうか? c:\windows\system32>ruby -e"puts [22]" #=> [BUG] cross-thread violation on rb_gc() c:\windows\system32>ruby -e"puts 2/2" #=> 1 c:\windows\system32>ruby -e"puts 2**2" #=> [BUG] cross-thread violation on rb_gc()
折れは1.38で落ちた。mswin32。(Pythonは9.0でもOKだった)
>>932 Enumerable を include しておきながら collect は Array でオーバーライドしてるとすると、
それは Array#collect のドキュメントに明記しておかないとまずくね?
話が見えない。
つまりこういうことさ。 Rubyだってソフトウェアなんだから、I/Fをドキュメントに書き、カプセル化された内部実装は参照する必要をなくすべき、って奴と、オプソなんだからソース嫁、って奴の意見が割れてるのさ。
>>969 そんなことまで言ってないよ。
継承してるなら継承元のドキュメントだけあれば良いけど、
継承していながらオーバーライドしてるメソッドがあるなら、
サブクラスのドキュメントにはそう明記すべき。
ハナっからドキュメントがなければないで「ソース嫁」でもいいけどね。
ドキュメントがありながら、それがミスリードするようなものであるならそれはまずい。
ソースが仕様だと、仕様とバグの区別がつかなくなる希ガス
第二引数をいくら増やしてもSEGVしなかった。 あと、Rubyには関数内関数なんてのはないから 内側のdefは外に出すべき。
>>965 system32ディレクトリの中に、違うバージョンの
msvcrt-ruby18.dllとかがはいってるんじゃない?
>>967 ---------------------------------------------------------- Array#collect
array.collect {|item| block } -> an_array
array.map {|item| block } -> an_array
------------------------------------------------------------------------
Invokes _block_ once for each element of _self_. Creates a new
array containing the values returned by the block. See also
+Enumerable#collect+.
a = [ "a", "b", "c", "d" ]
a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
a #=> ["a", "b", "c", "d"]
>>974 refe やリファレンスマニュアルには載ってないよ。
エポック(1970/01/01)からの経過秒数が既知の場合に 日付と時刻を出力するにはどうすればよいですか? input : 10 (数字) output : 1970/01/01 00:00:10 (文字列)
リファレンスマニュアルのTimeクラスについてよく読め。
978 :
976 :2006/09/24(日) 21:08:44
>>976 自己解決
Time.at()で可能。ただし指定する秒数があまり大きいとNGを返す。
:in `at': bignum too big to convert into `long' (RangeError)
Windowsで、数MBから数百MBのテキストを変換するスクリプトを 作ったのでWxRubyで簡単なGUIを作りました、が、 実行するとCPUの使用率が100%になって、ウィンドウが応答不能に なります。一応、処理が完了すれば復帰します。 少々処理速度を犠牲にしても、きれいにGUIから実行できるよう にしたいのですが、もしあればノウハウをご教示いただけませんでしょうか。 GUIとは別のThreadで処理させるなどしてみたのですが、そうしたら 今度は待てど暮らせど変換が終わらなくなってしまいました・・・。
>>979 うーん。普通に、他の言語で作っても、そうなると思うけど(GUIが固まる)
別スレッドにしないと。Threadが上手く行かないのは、技術力の問題では?
foreach = flip mapM_ というのに気づいて腹が立った
982 :
981 :2006/09/24(日) 22:16:36
誤爆
>>980 技術力、全くもってその通りだと思います・・・。
で、申し訳ないんですが、もうちょっとだけ質問。
ものすごく基本的なことかもしれませんが、スレッドには
優先順位はつけられるけど、リソース配分みたいなことは
できないんですよね?
あと、馬力のいる処理をさせるときCPU使用率が100%に
ならないようにするいい方法はあるでしょうか。とりあえず
sleepをはさんだりしているんですが、それってありですか?
>>983 Windowsしかしらんが、優先順位はつけられなかったとおも。
適時sleepして、CPUに処理返すのは有効手段かと。
> 優先順位はつけられなかったとおも。 優先順位しかつけられなかったとおも。
http-access2で、http-clinentオブジェクトが勝手にクッキーを処理するのを やめさせたいんですが
>>985 やっぱりそうですか。
とりあえずsleepで微調整していこうと思います。
ありがとうございました。
Windows、ActiveScript-RubyにMeCabのバインディングを入れているには、 どのようにインストールすれば良いのでしょうか。
>>988 前にいっぺんCygwin版でやったけど、結構めんどくさいんだよねー
今はあきらめてChaSenをWin32APIで呼び出して使ってる
(『恋するプログラム―Rubyで作る人口無能』を参考にした)
MeCabも同じような方法で呼び出せるかも知れんけど
俺も初心者なので、あんまり詳しいところはよくわからない
# ruby -v ruby 1.8.5 (2006-08-25) [i386-freebsd5] なのに、<%= RUBY_VERSION %>が 1.8.4 なのはがい出? 気持ち悪いんだけどどこ直せばいいんでしょうか?
>>992 ごめんなさい
/usr/bin/env ruby -e "p RUBY_VERSION"
してみたら 1.8.5 だったので、調べてみたところ tdiary のキャッシュのせいでした
<%= RUBY_VERSION %>って eval されないのね。お騒がせしてすみませんでした
>>990 レスありがとうございます。茶筅ためしてみます。
995 :
デフォルトの名無しさん :2006/09/28(木) 14:42:47
apt-get install `apt-cache search -n ruby1.8 | cut -d ' ' -f 1` irb1.8 rdoc1.8 ri1.8 をしたところ、 E: パッケージ irb1.8 が見つかりません、となるのですが、どうしたらインストールできますか? ubuntuです。
>>995 お、俺もubuntu使い。奇遇だね。
apt-cache search irb
で、ちゃんと見つけてくれてる?
997 :
sage :2006/09/28(木) 14:51:12
ruby1.8 - Interpreter of object-oriented scripting language Ruby 1.8 と表示されました。
>>997 それだけ?ズラズラいくつか表示された中に
irb1.8 - Interactive Ruby (for Ruby 1.8)
って、無い?
もしくは、 irb - Interactive Ruby (irb) でもいいや。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。