1 :
デフォルトの名無しさん :
2007/06/29(金) 20:03:54 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは
>>2-10 あたりを見てください。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す
http://www.ruby-lang.org/ja/man/ ・FAQを読む
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
できれば宗教の話だけでなく、「Rubyの話を宗教的に語る」のもやめたほうがいいんだが、 これはRubyユーザーのレベルでは土台無理な話だものな。 Pythonコミュニティに成熟度で少しでも追いつくことを、もうちょっと積極的に目指したほうがいいよね。
pythonも宗教じみてるよ。ゼンとか言ってるし。
やっぱここは D だな。
畏怖とか善とか江流須とか言ってる時点で宗教
>>9 こいつ、「オカマじゃないわよ!」レベルだなw
↑自分じゃ上手いこと言ったつもりなんだろう。Rubyスレはこういうのが多いのが難点。
16 :
デフォルトの名無しさん :2007/06/30(土) 20:11:11
linuxです class State attr_reader :array def initialize(a) @array = a end end b = [[1,2,3],[3,2,3],[1,3,4]] s = State.new(b) p s.array これ、initializeで入れる時に3*3行列に限定したいです。 Rubyではすべてはオブジェクトらしいので区別することは不可能でしょうか?
前スレ978 Moon Wolf さん、遅くなりまして申し訳ありません。
>iconvで指定するencodingは'EUC-JP'ではなく'EUC-JISX0213'にしないと
>ae1 = Iconv.conv('UTF-8','EUC-JISX0213',"\xa9\xdc")
これをヒントに、数値実体参照にしなくても、そのままeuc-jp→utf8変換できそうです。
本当にどうもありがとうございました。
>>979 >utf8にするんだったら
>わざわざ数値ナンタラにする必要あんの?
nkfとiconvをつかってeuc-jpをutf8に変換しようとしたところ、
æ & a e l i g で表示される発音記号の部分でエラーがでたり、
emacs上でも発音記号があるとutf8でエンコードできなかったので、
utf8で表示することはできても、書きこむことは無理なのかと考えていました。
でも、上のように'EUC-JISX0213'と指定することを教えていただいたので、
助かりました。
>16 def initialize(a) raise(ArgumentError,'a must be 3*3 matrix') if a.size != 3 a.each {|r| raise(ArgumentError,'a must be 3*3 matrix') if r.size != 3 } @array = a end 手動で入力値をチェックすれば実行時に3*3行列に限定することは可能 スクリプトの実行開始前の時点でチェックすることは出来ないね
19 :
デフォルトの名無しさん :2007/06/30(土) 20:54:54
やはり仕様で出来ないんですか、せめてaをArray型に限定することは出来ませんか?
Ruby!
実行時でよければ、initializeの中で、unless arg.is? Array raise TypeError すればいい。 構文解析時に検出するのは無理。
おっと、ArgumentErrorだな。
たびたびごめんなさい。is_a? だね……_n.........o
「できる」って回答に対して
「やっぱりできないんですか」の時点で
>>19 は釣りだろ。
>>18 > raise(ArgumentError,'a must be 3*3 matrix')
こんな書き方できるんだ。知らんかった。でもこんな書き方をサポートする理由がわからん。
おれならこう書くかなあ。
def initialize(array)
_validate(array)
@array = array
end
def _validate(array)
msg = 'array must be 3*3 matrix'
raise ArgumentError.new(msg) unless array.is_a?(Array)
raise ArgumentError.new(msg) unless array.size == 3
array.each { |row| raise ArgumentError.new(msg) unless row.size == 3 }
end
27 :
デフォルトの名無しさん :2007/07/01(日) 12:01:00
モジュールの中でインスタンス変数を使うのはおかしいですか? module M def hoge=(x) @hoge = x end def hoge return @hoge end end class C include M end
別にいいと思うけど。おかしいと思う理由は?
例えば module M def add_hoge(x) @hoge.push(x) end end だと@hogeはArrayで初期化されていることが前提となる
>>29 のような場合は、
def self.extended(obj)
obj.instance_eval do
@hoge = []
end
end
とかも、Mの側で必要になるね。
superの呼び出しが必要なのかとか、includeのほうはどうするんだとか、
忘れた。
>>29 Arrayを前提としても困らないと思う
@hogeがpushの定義されていないオブジェクトであれば、Error投げてくれるし
もし自動的なチェックがないと不安なら
module M
def add_hoge(x)
validate_hoge
@hoge.push(x)
end
end
とすればいいし
ttp://jp.rubyist.net/magazine/?0005-FirstProgramming ここを見ながら、昨日からrubyを触っています。
ここのページ通りやれば、ruby/tkがインストールされており、
すぐに動くような記述ですが、いざやってみると、
tk84.dllがない。
アプリケーションをインストールしなおせば、問題は解決する可能性がある
と、ダイアログが出て、コマンドプロンクトは下記の用になります。
C:\ruby\wk\VN>ruby visualnovel.rb
C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so: 126: 指定されたモジュール
が見つかりません。
- C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.so (LoadError)
from C:/ruby/lib/ruby/1.8/tk.rb:7
from ./guiutil.rb:4:in `require'
from ./guiutil.rb:4
from visualnovel.rb:1:in `require'
from visualnovel.rb:1
当然ですが、
C:/ruby/lib/ruby/1.8/i386-mswin32/tcltklib.soのファイルは存在します
一度、rubyを消して、再度インストールしましたがダメでした。
どうすればよいのでしょうか・・?
http://www4.ocn.ne.jp/~holmes17/html/rubytk.html も、試してみましたが動きません。(設定が出来ていないだけかもしれませんが。
どうしてTkを使おうとするの? TkはRubyじゃないのに
>>33 意味不明なこというな。
あらゆるライブラリが使えなくなるだろバカ。
Rubyの勉強と称しておきながらRubyじゃない部分で詰まるのは確かにアホくさいよな この場合はTk使わなければ問題ないわけだし
>>32 dllファイルはmswin32環境の場合、以下の場所のいずれかに置く必要がある
ruby.exeと同じディレクトリ
C:\windows\system32
C:\windows\system
(マルチブート環境の場合、systemディレクトリの位置が違う可能性あり)
これらのディレクトリを全部調べて、tk84.dllが入っていないかどうかチェック
見つからなければどっかから持ってくる
たぶんActiveTclの8.4をインストールすれば勝手に入るはず
>>18 個人的な好みとしては
unless a.size == 3 and a.any? {|r| if r.size == 3}
raise ArgumentError, 'a must be 3*3 matrix'
end
リンク先の記事を読むだけではrubyとtkが別物だってことは分らないし 初心者にはruby/tkがその別物のtkをrubyから触るためのライブラリだってことも分らないだろう
>>35 >Rubyの勉強と称しておきながら
ぜんぜん称してないだろ。
アホくさいのは文盲なお前だ。
>>36 ActiveTclの8.4をインストール」したら無事に動きました。
サンクス。
どうして、Tkを使うのか?
と言われても、サンプルがTkを使っているから。
サンプルコードをやる場合、極力同じ環境でやらないと、
動かない際、手順が悪いのか、設定が悪いのかわからないし、
知識があれば、どこかをいじるなり、、
他の方法で走らせる事が出来るんだろうけどね。
動画ファイル(.wmv .avi等)からキャプチャ画像を作成するような ライブラリーはないでしょうか? 例えば、秒数指定からやフレーム数指定などから自動で画像ファイルを出力するような。 よろしくお願いします。
Rubyの仕事ではないと思う コマンドラインというかCUIで操作が完結するプログラムはあるはずだから適当に探して使え
>>40 > サンプルコードをやる場合、極力同じ環境でやらないと、
わざわざ別のバージョンを入れたからじゃないの?
...個人的にはサンプル通りにrc版入れる気にはならないから同情してあげるよ。
>>43 32の下に載ってるURLを見ると分かるが
ActiveTcl8.3を入れろと書いてあるので、この場合はサンプル通りにやるとハマる
知らんがなそんなん…個人サイトの記述がヘボいのまで面倒見てられんよ
46 :
デフォルトの名無しさん :2007/07/02(月) 23:20:01
ActiveRubyでDLNAを制御したいんですが、名前が表示されません。 require 'win32ole' o=WIN32OLE.new('UPnP.UPnPDeviceFinder') ds=o.FindByType("urn:schemas-upnp-org:service:ContentDirectory:1",0) ds.each { |d| print d.ModelName } 下のvbsはちゃんと名前を表示するんですが... Set o=CreateObject("UPnP.UPnPDeviceFinder") Set ds=o.FindByType("urn:schemas-upnp-org:service:ContentDirectory:1",0) For Each d in ds:WScript.Echo d.ModelName:Next
ttp://blog.masuidrive.jp/index.php/2007/05/06/network-facade/ 上記のブログのサンプルをコピペし、wikipedia.rbという名前で保存しました。
実行すると以下のようなエラーがでてきて困っています。解決策を教えて頂けませんでしょうか?
wikipedia.rb:15: undefined method `elements' for
#<XML::Node:0x103590c> (NoMethodError)
環境
Mac OSX ruby 1.8.5 (2006-08-25) [powerpc-darwin8.9.0]
network-facade (0.4)
windowXPの環境では正常に実行できました。
よろしくお願いします。
ブレイクポイントやステップを使ってデバッグしたい時ってどうしてますか? コマンドラインからでしょうか? それともそんな方法でデバッグはしない? EclipseのRDTでしているんだけど、ちょっと重い。。。
49 :
デフォルトの名無しさん :2007/07/04(水) 11:05:32
質問です。 rubyでシステムを作った場合 ユーザーにソースって丸見えっすよね? 昔のMSのASPのようにソースコードの暗号化って可能でしょうか?
52 :
デフォルトの名無しさん :2007/07/05(木) 15:06:56
うちでは平気
またまっくか 実行したいサンプルと同じディレクトリに置いておけばとりあえず確実に読まれるんじゃないの 実際に追加ライブラリをどこに置けば妥当なのかはあとで考えれば
55 :
デフォルトの名無しさん :2007/07/05(木) 15:58:33
きったねー字だなあ はともかく、もし提出ものであるのならRubyの宿題スレがあるからそっち持ってけ まあ、見てる人は一緒だけどな 遊び方がないぞー
rubyをコンパイルするときにできるminirubyとは何でしょうか。何のためにあるのでしょうか。 ls -l をしてみると ruby も miniruby もサイズは同じでした。
rubyを作るために使われる制限つきruby。 具体的には拡張ライブラリの作成の際などに使用される。 「制限つき」とは言ったものの、プラットフォームによっては素のrubyと同様に使えることも多い。
>>58 さんくすです。
ところでrubyをコンパイルするときに、指定したスクリプトを読み込んだ状態でバイナリを生成することはできますか。
たとえば cgi.rb と erb.rb を読みこんだ状態の ruby バイナリを作成し、CGIのパフォーマンスをあげてみたりとかできないでしょうか。
(mod_rubyやFastCGIは共用環境では使えない場合がほとんど)
>>59 出来たとしてもそれこそ共用環境では使えないだろう
61 :
デフォルトの名無しさん :2007/07/05(木) 19:53:27
>>56 宿題ではありません。
どこの世界にrubyでクラスを使ってプログラム組ませることを宿題とする大学があるのですか。
ふつうjavaでしょ
>>61 東京都文京区本郷あたりにあるらしいです。
>>59 そりゃまあソースレベルでいじればできるが、単純にやってもパフォーマンスはほとんどあがらんしなあ。
>>60 建前はそうなのですがコンパイルしてしまえば使えるようなところもありますよ。
まあこれは例なのでその点にはあまりとらわれないでください。
で、もういちど質問しますが、rubyをコンパイルするときに、指定したスクリプトを読み込んだ状態でバイナリを生成することはできるでしょうか。
>>61 俺から見るとJavaやるなんて冗談にしか思えないよ
普通はCだ
>>63 >そりゃまあソースレベルでいじればできるが、
もうすこし具体的にお願いできますか。ソースのここを嫁とか。
>>61 札幌市北区北10条西8丁目とかにもあるぞ
>>67 ruby.cのload_fileあたりとか。
>>67 拡張ライブラリ内にリテラルとしてスクリプトを置いてevalするようにした上でその拡張ライブラリをstaticにリンクするとか。
Ruby2.0使えばいいんじゃね?
>>71 Ruby2.0はどこでダウンロードできますか?
73 :
47 :2007/07/05(木) 21:17:47
すいません。 よろしくお願いします。
perlにはdump機能があるけどrubyもできんもんかな。 要はライブラリとか読み込んだ状態のプロセスメモリ空間をファイルに 書き出して、それにヘッダつけたりの加工をして、適切な場所にジャンプする ような実行形式を作るってことなんだろうけど。
bRubyでぐぐってみるといいのではないかと。
76 :
デフォルトの名無しさん :2007/07/06(金) 01:36:28
東大は北大はrubyがデフォなのか。 京大はCだぜ、しかしCはクラスがない。 だからおれはrubyを使う、だれがなんといおうとも Stateクラスの実装について何か改善点ありませんか?
77 :
52 :2007/07/06(金) 15:19:00
tablelist.rb tabeilst_core.rb tablelist_tile.rb を作業ディレクトリに置いて,sampleを実行しましたがエラーです。 /usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package tile (RuntimeError) from /usr/lib/ruby/1.8/tkextlib/tile.rb:16 from sample.rb:4:in `require' from sample.rb:4 tile.rb でTkPackage.require('tile')しているようですが(16行目) TkPackageというモジュールでエラーになります。
スーパークラス内で__FILE__定数を参照するメソッドがあって、 サブクラス内でそのメソッドを呼んだ場合、 __FILE__定数はスーパークラスのファイル名になってしまいます。 例 #super_class.rb class SuperClass def hoge [File.basename(__FILE__, ".*"),'.html'].join end end #sub_class.rb class SubClass < SuperClass def puts_hoge puts hoge() end end SubClass.new.puts_hoge #=> super_class.html サブクラスのファイル名を取ってきてほしいのですが、その場合はサブクラス内に __FILE__を参照するコードを書かないといけないのでしょうか。 なんか美しくないような気がするのですが、他に方法が思い当たらないです。。 何か良い方法があったら教えてください。宜しくお願いします。
>>78 自己レス
$0グローバル変数で代用できました。
でもなんか微妙な気も…
>>79 > $0グローバル変数で代用できました。
__FILE__とは意味がちがう。
>>78 に関しては、他にないと思う。
>>77 > TkPackageというモジュールでエラーになります。
Tkが古くてtile拡張とかないんじゃないの。
82 :
52 :2007/07/06(金) 17:38:21
>>81 レスありがとうです。
ruby -r tk -e 'p Tk::TK_PATCHLEVEL'は"8.4.7"
/usr/lib/ruby/1.8/tkextlib/tile
/usr/lib/ruby/1.8/tkextlib/tile/tile.rb
はあるのですが,「Tkが古くてtile拡張とかない」というのは、
Rubyの問題ではなく,Tkの問題ということですか?
Tkのバージョンをあげなさい,という教え?
83 :
デフォルトの名無しさん :2007/07/06(金) 17:42:59
マリオテニスで言えば、 pythonがトリッキータイプ、rubyがテクニックタイプ。 そういうことですね
>>66 古くはCOBOL、今はJava。
常に流行りに追従するしか能がない。
京都はゲーム屋さんがあるからCやってんじゃね?
ゲーム屋でいえば東京の方が多いだろふつう
そういえば日常やっつけスクリプトばかりでゲームとかあまり作ったことないな、と思って三目並べに挑戦 ぶぴ(鼻血) …最善手を取り合うのとかは後回しでいいよね もしかしてそこがキモだから飛ばしたら駄目?
>87 だめっつーか、自分で始めた自分のプロジェクトなんだから 自分が納得するよーにするのが一番だと思われ。 「とりあえずゲーム作ってみたいなー」ならCPUの思考ルーチンはてきとーでもいいかもだし 「俺は最強の三目並べを作るんじゃぁぁぁ!!」と燃えてるなら飛ばしちゃだめだろーし。 オブジェクト指向の修行、ということなら、思考ルーチンを差し替えしやすいように作ってみるとか。 何にせよ、take it easy ;)
89 :
デフォルトの名無しさん :2007/07/07(土) 01:56:55
>>87 そのプログラム、どういうオチにするかは分かってるんだろうな?
一気に3つ並べられる裏技作ることだろ?
俺ならまずirbでプレイ出来るようにするから GUI化前ならいつでも裏技使い放題だぜ
>>87 最善手を先読みで思考せずに
経験から学ばそうとして
ランダムに打って勝てたらごほうび
負けたらおしおきみたいにして作ったら
そのうち最善手打つようになってくれるだろうか
全局面のパタン数が十分少ないゲームならな
3目ならべの全局面のパターン数って何個かな?
3目並べプログラムの落ちってヲーゲームのあれだろ?
ザ・デイアフターじゃなかったっけ
ウォーゲームだよ
Procオブジェクトをファイルに保存することはできますか。
できますよ
irb> Marshal.dump(lambda{|x| x}) TypeError: no marshal_dump is defined for class Proc
ソースコードを文字列のまま保存しといて、後で使うときにeval系を使うしかないでしょ 元のソースコードを剥ぎ取ってProcオブジェクト自体をシリアライズするとなると、クロージャになってたりもするし、論理的に成立しないと思う
とりあえずできないということですね。できないことが分かっただけでもよかったです。ありがとうございました。
>>101 できないのは、クロージャが原因ということでしょうか。
ということは、クロージャがある言語ではクロージャをシリアライズしてファイルに保存するのは無理またはできたとしても実に面倒ということ?
Net::HTTPクラスを使ってHTTPリクエストを投げてレスポンスをフンフンする 処理を書いているのですが、文字コード判定ってどうやるのが普通なんでしょう? 1. read_bodyの結果をNKF.guessに放り込む 2. response["content-type"]からcharset取得 or HTMLからcharset取得 3. 素敵メソッド or 素敵ライブラリ使用 処理速度に問題がなければ1が手軽、面倒だけど最善なのが2 先人の知恵を拝借するのなら3 3が見つからないorz
素朴な疑問ですけど attr_reader :foo って なんで @foo と書かないのでしょう?
x.foo と使うから
>>105 attr_readerメソッドへの引数なのでSymbolでないと駄目。
@fooと書いたらアクセサの定義ができない。
このスレは勉強になるなあ (・∀・)
109 :
47 :2007/07/07(土) 17:56:04
むりやり自己解決しました。 libxml.soがきちんとインストールされてないみたいでエラーが出てたみたいなので networkfa-facadeのrest.rb内の begin raise LoadError if ENV['FORCE_REXML'] require 'xml/libxml' rescue LoadError require 'rexml/document' end を読み込み順を逆にしてrexmlを読み込ませるようにしたらとりあえず動きました。 libxml-rubyがうまくgem installできないのが気になりますが・・・。
attr系はメソッドゆえ、引数が評価(値を求め)されてしまう。 attr_reader @foo と書いたら attr_reader 「@fooの値」という意味になる。 ついでに、@fooはここではクラスのインスタンス変数だな。 class Moge @foo = "bar" attr_reader @foo def initialize @foo = "nullpo" @bar = "ga" end end p Moge.new.bar p Moge.new.foo 実行すると "ga" undefined method `foo' for ... なお、alias は構文なので、シンボルではなくメソッド名そのものを書く。
便乗質問 attr_* :variableの定義は def variable @variable end def variable=(value) @variable = value end の二つのメソッド定義のシンタックスシュガーだと認識してたんだけど、それでいいのかな? attr_readerは上だけ、writerは下だけ、accessorは両方
>111 うん、正解。だから attr_reader :var def var=(value) @var = value end なんて風に、セッタだけ独自にしたりもできる。
>>111 細かい突っ込みをすると、シンタックスシュガーってわけじゃない。文法じゃなくて
ただのメソッド呼び出し。中でそういうメソッド定義をリフレクションしてる。
attr*に関するシンタックスシュガーつーと、 hoge.foo = "giko" と書くと hoge.foo=("giko") の意味になるところかな。
行列の積をプログラムしたいのだが上手くいかないんで おかしいところを指摘してもらえないかな a = [[1,2,3],[4,5,6],[7,8,9]] b = [[10,20,30],[40,50,60],[70,80,90]] c = [[0,0,0],[0,0,0],[0,0,0]] for( i=0; i<c.length; i++) { for( k=0; k<c[i].length; k++ ) { w = 0.0; for( j=0; j<a[i].length; j++ ) { w += a[i][j]*b[j][k] } c[i][k] = w } }
Rubyにはそういう形式のfor文はないぜ。
attr_accessor の中身って具体的にはどんなコードなんですか?
>>115 それって attr_*に限らずじゃない?
>>118 超妄想&コンパイル未確認&ieval系書いた事ほとんどない俺だけど
きっとこんな感じ
def attr_reader(name)
instance_eval( expr = <<-EOS
def #{name}
@#{name}
end
EOS
)
end
>>118 object.cの中で
static VALUE
rb_mod_attr_accessor(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
{
int i;
for (i=0; i<argc; i++) {
rb_attr(klass, rb_to_id(argv[i]), 1, 1, Qtrue);
}
return Qnil;
}
void
Init_Object()
{
/*略 */
rb_define_private_method(rb_cModule, "attr_accessor", rb_mod_attr_accessor, -1);
/*略*/
}
とあって、rb_attrはeval.cにある。
void rb_attr(klass, id, read, write, ex) VALUE klass; ID id; int read, write, ex; { /*略*/ if (read) { rb_add_method(klass, id, NEW_IVAR(attriv), noex); } if (write) { rb_add_method(klass, rb_id_attrset(id), NEW_ATTRSET(attriv), noex); } } こんなふうになってる。
class Module def testatt(name) module_eval %- def #{name.id2name}() @#{name.id2name} end def #{name.id2name}=(arg) @#{name.id2name}=arg end - end end class C testatt :i end
124 :
デフォルトの名無しさん :2007/07/08(日) 17:24:13
パスカルの3角形を印字するプログラムを 作りたいのだが以下のプログラムで作るにはどうしたらいいのでしょうか? 教えてください。 print("Enter n: "); n = gets.chomp.to_i if( n>30 || n<0 ) then n = 10 end a = Array.new( n ) a[0] = [1] # 要素が1 の長さ1の配列 # ここでパスカルの3角形を作る # このとき、a[i]ごとに配列を作る # そして、印字 for i in (0..a.length-1) do for j in (0..a[i].length-1) do print( " ", a[i][j] ) end print( "\n" ) end
そろそろ宿題の季節なのかな?
っていうか、宿題は宿題スレに持ってけって 宿題がそもそも無いかあるいは回答できないほど書き込みがアホだからレスが無いだけで見てる人はきちんといるからさ あと、Rubyでは繰り返し変数の存在に頼った既存型のfor文はほとんど使われない 配列を主体としたイテレータの概念を身に付けるといい
>>126 そこのfor文はいじっちゃ駄目なんじゃね
a[0] = [1]
a[1] = [1, 1]
a[2] = [1, 2, 1]
a[3] = [1, 3, 3, 1]
a[4] = [1, 4, 6, 4, 1]
こういう配列を生成する部分を自分で(笑)考えて記述しろって問題だと思う
隣り合う数字同士を足せばよい
これで「パスカルの三角形」自体を理解してないとかだったら笑う
MySQLに title VARCHAR(255) body TEXT なものを作成してscaffoldで生成してみたんだけど、body TEXTの中身が改行とかHTMLを無視してそのまま出力される RDocとかいうのを見つけて試してみたけど、相変わらず改行とか反映されてない、誰か解決策を…(´д`;)
>>131 スレ違いも良いところだし端折り過ぎだろw
読む方の身になって文章書いてみろって
しまった、ここはRubyスレだったか! orz素で勘違いしたスマン!
135 :
82 :2007/07/10(火) 12:17:50
>>134 thanks
Tcl/Tk Aqua 8.4.14をインストールし,
Ruby 1.8.6をインストールしました
(ただしMacPorts利用です。port install ruby +mactk)
で、tile がないというエラーはなくなりました。
が、今度はTablelist_tileがないというエラーです。
/opt/local/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package Tablelist_tile (RuntimeError)
Tablelist_tileのそれらしいpackageも見つからないので,
Tcl/Tk Aquaに問題があるのかもしれません(当てずっぽうですが)
この初心者スレッドのレベルを超えてるのでしょうか?
Rubyのメーリングリストに参加して聞いた方がいいかな?
いずれにしても,134さんありがとです。かなり助かりました。
>>135 > この初心者スレッドのレベルを超えてるのでしょうか?
レベルというより、Tcl/Tk Aquaとの組合せで使ってる人間じゃないと答えようがない。
> Rubyのメーリングリストに参加して聞いた方がいいかな?
そのほうが情報は集まりやすいし後から探す人にもプラスだと思う。
某るびまがに載ってたコードをちょっと改造: require 'net/http' Net::HTTP.start('www.honyara.com',80) {|http| res = http.post('/up.html/upload.cgi',"upload=C:\\test.txt") puts res.body } アップローダ側にはファイル名だけの空のファイルが作られてうまくアップロードされない。 そもそもこのコードではファイルアップロードが出来ないのだろうか。 あっちこっち調べているがわからない。教授願う。
139 :
137 :2007/07/11(水) 17:16:55
>>138 己の無知に赤面。
勉強して出直す。ともかくサンクス!
当方プログラミング初心者なのですが、まったくプログラミングの知識が無い人に おすすめのRuby入門書などはありますか?
HTML の日記や掲示板から記事を切り出すのにおすすめなライブラリを教えて下さい。 ずっと tagiter.rb というのを使っていたのですが、最近の流行りが知りたいです。
145 :
デフォルトの名無しさん :2007/07/12(木) 15:15:27
文字列リテラルで、バックスラッシュ記法を無効にする書き方はないでしょうか? 'c:\hoge\moge\hoge' だと、エスケープされてしまいます。
>>140 Javaから学んだ方が早く理解できるYO。
急がば回れで。
>>145 %s!c:\hoge\moge\hoge!
とか?
148 :
デフォルトの名無しさん :2007/07/12(木) 16:27:57
>>147 シンボルリテラルになるので、
%s!c:\hoge\moge\hoge!.to_s
でよいのかな?
>>146 なぜそこでJavaになるんだ
PythonとかC++とかVBとかあるじゃん
個人的にJavaは仕様がでかすぎて入門には厳しいと思う
メソッドチェーンが楽しくて大学の講義課題のプログラムが1行になってしまいました・・・ チェーンをどこで切ったら良いのかわかりません><;
切らんでええやん
152 :
デフォルトの名無しさん :2007/07/12(木) 20:11:58
別プロセスで起動した Ruby アプリ同士で、変数を受け渡ししたいのですが、 どのようにすればよいのでしょうか。 OS は windows XP|Vista です。
score = {"hiroyuki"=>80, "boon"=>50, "yaruo"=>25} というハッシュがあって、valueが最大のkeyを返すメソッドってありますか?
irb> score.max{|a,b| a[1] <=> b[1]} => ["hiroyuki", 80]
a = Array.new (0..5).each do |i| a[i] = {i.to_s => i, (i+1).to_s =>i+1} a += Array.new end こんなんでいいんですかね? 5回まわしてますが、何回まわすかは環境依存なので、最初にArray.new(5)とは できないです。 もうちょっとスマートなやり方があるような気がするのですが。。。
a = [] 5.times {|i| a[i] = {i.to_s => i, (i+1).to_s =>i+1} } p a じゃダメ?
>>155 何をしたいのかよくわからんが
a = Array.new
(0..5).each do |i|
a[i] = {i.to_s => i, (i+1).to_s =>i+1}
end
これで動く
Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから
Array.newにサイズを指定するメリットは通常使用上無い
a= Array.new
a[2] = '3rd'
a[4] = '5th'
p a #=> [nil, nil, '3rd', nil, '5th']
>>156-157 サンクス。
そっか、勝手に伸びてくれるのか〜。
a += Array.new がなんか気持ち悪かったんだよね。
160 :
デフォルトの名無しさん :2007/07/12(木) 22:36:42
> Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから 知らなかった・・・ ドキュメントでどの辺かに、記述ありますか?
161 :
デフォルトの名無しさん :2007/07/12(木) 22:37:35
Arrayに思いっきり書いてありました。 > self[nth]=val > nth 番目の要素を val に設定します。nth が配列の範囲を越える時には > 配列の長さを自動的に拡張し、拡張した領域を nil で初期化します。
162 :
デフォルトの名無しさん :2007/07/12(木) 22:51:04
ファイルパスの拡張子のみを変更する方法は、ありませんでしょうか? /hoge/moge/hage.txt を /hoge/moge/hage.xml みたいに変えたいのですが、 basename 使おうとしたのですが、ファイル名だけしか返ってきません・・・ パスほすい
163 :
デフォルトの名無しさん :2007/07/12(木) 22:53:44
まったくの初心者ですが、XPなのでmingwin32をいれました。 いろいろ種類があるようで、これでいいのか迷うのですが、みなさんはなにを使ってますか?
俺はスク水派かなぁ
WScriptから呼べるからActiveScriptRuby使ってるな。
globってどういう意味なん?
で、globってどういう意味なん?
語源はglobalの略と聞いたことがある。
>>170 勘で適当に答えると「掴む」じゃないかな?
野球のグローブっつーのもあるし。
つか辞書引け。
You stupid glob of glue!
>>162 path = "/hoge/moge/hage.txt"
File.join(File.dirname(path), File.basename(path, ".*")+".xml")
>>154 max_by と思ったら1.9からだったか。
>>174 オバカさんが手掛りを掴んだ!(やったね)
取得したデータの判別をしたいのですけど ruby に perlのFile::MMagic 相等のライブラリってありますか?
彼女のメソッドがすべてプライベートになってしまってアクセスできなくなりました どうしたらいいですか?
>>180 このスレ的には、オープンクラスなので好きにオーバーライドしてアクセスしろ、が答えか。
関数型はOKなはずです
>180 彼女.instance_eval {} 内で実行すればOK 但し instance_eval はデリケートだから扱いに注意しろよ
184 :
178 :2007/07/14(土) 01:31:04
>>179 お礼が遅れました。ありがとうございました。
185 :
デフォルトの名無しさん :2007/07/14(土) 01:31:44
188 :
デフォルトの名無しさん :2007/07/14(土) 01:56:30
rubyでgnutellaとかのp2pアプリ作りたいんですけどなんかライブラリないですか?
ライブラリありきでで作るようなもんじゃねーだろう
rubytellaってすでにあるが
Rubyの添付ライブラリのソースを見ていると たとえばuriライブラリだと common.rbやganeric.rbなどに分けられているんですが それぞれどういう意味で分けてるんですか?
おまえにはまだ早い!
趣味だと思う Rubyあるいは一般プログラミング作法的に何かポリシーが存在してるわけじゃないんじゃないかな
>>192 generic.rbはGeneric URIに対応してると思う。
common.rbは文字通りいろんなURIに共通する部分。
URIに関するRFCでも読んでみたら?
196 :
デフォルトの名無しさん :2007/07/14(土) 17:20:13
mapを最初の一個だけに適用するってことはできませんか? 通常字は、配列全体を返したいのですが、デバッグ時には、最初の一個だけほしいのですが・・・ a = [1, 3, 10, 100] b = a.map{|i| i * 2} p b b = a.map{|i| i * 2; break} p b
計算すらしたくないの? 欲しいというだけなら p b.first じゃ駄目なん?
198 :
デフォルトの名無しさん :2007/07/14(土) 17:42:05
途中で送信してもた orz b = a.map{|i| i * 2; break} p b だと、nilになってしまう・・・
199 :
デフォルトの名無しさん :2007/07/14(土) 17:42:42
>>197 あ、そっか、全部計算してからfirstでもいいか
>>198 a.map{|i| break i*2}
method call と proc call (or yield) で速度の違いってありますか もし違いがないなら proc を使おうと思っているんですが、method にしたほうが速いなら method にしようかなと考えています
202 :
デフォルトの名無しさん :2007/07/14(土) 21:19:35
>>200 お、できた!
と思ったら、配列がかえってこないのは仕様かな?
203 :
デフォルトの名無しさん :2007/07/14(土) 21:23:03
まあ、わかっているなら、Arrayにすりゃいいか・・・ a.map{|i| break [i*2]}
>>201 コード全体の性質や呼び出し回数、Proc生成数、マシン環境など色々な要因で変わる
使用するコードでベンチマーク取れ
参考までに書くと、俺の環境でやった単純なcallベンチマークなら
proc callにはmethod callの2倍ほど時間がかかっている
ただし50万回程度呼び出さないと大きな差は付かない
>>202-203 そもそもトリッキーなやり方を使わずに
a.dup
a[0] = a[0] * 2
とするのが一番いいんじゃないのか?
>>204 さんくすです。
・proc callはmethod callより遅いのは確か
・でも気にするほどのことではない
ということですね。
今回はprocの中身が比較的重い処理であり、呼び出しコストより実行コストの方がずっと大きいと思われるので、
method callにしたところで意味のある差はでないと推測し、取り扱いが楽なprocで行くことにします。
ありがとうございました。
rdocってpdfに出力できないですか?
208 :
デフォルトの名無しさん :2007/07/14(土) 22:49:09
>>205 あ、いや、i*2は例でして、実際は、複数行にわたって、いろいろ処理してました。
誤解をあたえてしまってスマソ。
結局、1個目までじゃなくて、10個目まで、処理とかも必要になったので orz
each_with_indexに置き換えてしまいました。
一部の要素に使うときは、mapでは、無理くさいですね
一部返す場合は、selectとか使うんだろうか
209 :
デフォルトの名無しさん :2007/07/14(土) 23:10:15
rubyで、エロサイトのスクレイパーを作ってるんですが、 拾ってきたページをキャッシュするライブラリってないでしょうか? というか、こういうのって、どうやって探したらよいんだろ? RAAってのを検索して見つけるものなんでしょうか?
210 :
デフォルトの名無しさん :2007/07/14(土) 23:29:02
RSSで、cacheで検索してみましたが、オブジェクトのキャッシュライブラリみたいのばかりで、 ページのキャッシュは見つかりませんでした。 gem search cache --remote もやってみましたが、同じような結果でした。
数行のrubyなのに、ものすごいプログラムありませんか?
>>209 普通にディレクトリ掘って保存してネットのLast-Modifiedとローカルのctimeを同期しとけばいいじゃん
完全なWebブラウザとして振舞わなくてもいいなら尚更
>>209 RAAよりrubyforge探した方がいいかもしれん。
>>210 ページをオブジェクトにしてキャッシュとか出来ないの?
217 :
デフォルトの名無しさん :2007/07/15(日) 01:13:29
>>213 rubyforge探したけどない感じ('A`)
>>212 そうっすね。難しくはないと思う
・URLからHash生成
・Last-Modiedのみの取得
・Last-Modiedとローカルctime比較
・キャッシュがないか、日付が新しければ、Hash名でキャッシュを書き込み
・日付が古ければ、キャッシュから読みこみ
・Optionで、ディレクトリ指定
この辺出来たら、できそう
open-uri風味に出来たら最高なんだけど・・・
>>214 ('A`)
218 :
デフォルトの名無しさん :2007/07/15(日) 01:17:06
>>216 ウホッ!!
まさに、そういう話です。
open-uri対応!?マジ欲しかったものです
試してみます
>>215 いやいや、オブジェクトの永続化でMarshalとかアレやコレ(ry
でもローカルにバイナリで出力されるからブラウザで直接見れな(ry
220 :
デフォルトの名無しさん :2007/07/15(日) 03:31:00
>>216 を last-modified対応に書き換えようとしたのですが、
取得しようとしてたサイトがどうやら動的生成なせいで、
last-modified が、nilで帰ってきて、キャッシュの比較しようがない罠 orz
意味ねえw
更新されないページだけ、キャッシュとるようにします
とりあえず、助言くださったみなさまありがとうございました。
文字列にしてしまってその違いを比較すれば
Dir内のエントリをディレクトリ→通常ファイル の順にソートしてeachループで使いたいんだけど ディレクトリだけ処理、ファイルだけ処理とループを 二回回すの以外になんかいい方法ある? さっき書き捨てスクリプト書いたときには二回回して しまった。。orz
myscript *.txt foo bar とやってARGVの中調べると *.txtが展開されちゃうんですが ARGVが["*.txt", "foo", "bar"] になるようにするにはどうすればいいですか?
>>223 展開してるのはrubyじゃなくて、シェルのほうじゃないの?
cmd.exeなんですがそれはないと思いますが・・・ Ruby側では特に展開していないと言うことでしょうか?
>>223 Windows用のRubyはシェルじゃなくRuby側で展開してるはず。
とりあえず、*.txt を '*.txt' にして展開を抑制するとか。
>
>>222 Dir['*'].partition{|e| FileTest.directory? e}.flatten
とか。
Ruby使ったことがない教授にRubyでプログラム書いて渡したら 「よめねぇよちきしょうがー!」って怒られた(´・ω・`)ショボーン
お前はラテン語で問題出されても文句言わないんだな
DEMONSTRA THEOREMAM ULTIMAM FERMATIANO
自分で書いたRubyのソースコードを >ruby hoge.rb foo bar じゃなくて >hoge foo bar と普通のコマンドのように使うようにするにはどうしたらいいんでしょうか? OSはWindowsXPです
system32にぶち込む
exerbでexe化する
>>232 できました!あがりとうござまいした!
>>233 オブジェクトコードのファイルサイズがでかいのはちょっと遠慮しときます^^;
Explorerの[ツール|フォルダオプション]関連付けで .rbに c:\ruby\bin\ruby.exe "%1" %* を .rbwに c:\ruby\bin\ruby.exe "%1" %* を関連付けて 環境変数pathextに .rb;.rbw を足す。 これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
俺はいつもバッチファイル作ってる。
>>235 > .rbwに
> c:\ruby\bin\ruby.exe "%1" %*
rubyw.exeにしないのか?
> これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
これはperlでやっても何でやっても同じ現象だから、Windows(というかたぶん
ShellExecute())の制限。
>>237 > Windows(というかたぶんShellExecute())の制限。
パイプやリダイレクトを繋ぐのはシェルの役目だから
このへんの事情はUNIXも同じ。
何でこういう情報いつまでたってもまとまんないの?
まとめる人が居ないからさ
>>239 > パイプやリダイレクトを繋ぐのはシェルの役目だから
だからcmd.exeの問題だって。
> このへんの事情はUNIXも同じ。
寡聞にしてそういう環境は聞いたことがない。
>>229 出されることだってあり得る状況なら、文句言うのはおかしい。
244 :
sage :2007/07/16(月) 00:08:43
rubyから茶筅を使う方法を教えてください。
>244 Chasen使ったことはないんだが、ruby chasenでぐぐってみた?
文字列を16進数表現に変換する方法はありますか? 最終的にやりたいことは半角文字列と全角文字列の判別です。
あります
p "a"[0]
"hogahdsfajeo"[i]
250 :
デフォルトの名無しさん :2007/07/16(月) 03:29:58
丁度おれもしらべてた。
>>246 16進法にするだけなら、
a = "%x" % 25
a = "%x" % "25" # 文字列でも可
>>247 ww
25.to_s(16)
str.split(//).each do |c| false if c<0x80 end
pack/unpackをお忘れか。
そうやって一発で例を書けない程度には忘れられてると思うぞ
pack/unpackはPerl臭がするからやだ
西本孝志に 西本孝志に 西本孝志に ごっすんごっすん五寸釘
>256 知らないわ そんな魔法
早稲田卒なことだけが、自慢です〜
>>223 今ごろレスしてみるけど
Windowsでワイルドカードを展開してるのはCランタイムのスタートアップルーチン
VCの事は使ったこと無いのでよく知らないのだけど
そのVCとおなじランタイムのmsvcrt.dllを使ってるMingwで何の指定せずにコンパイルすると
もれなく引数のワイルドカードを展開するようになるので
たぶんVCでも同じだと思う
ワイルドカードの展開をさせずに引数を渡すには「”」や「'」でくくってやるとよい
クォーティングされた引数にはなにもしない
myscript "*.txt" foo bar
でOK
<>|&とかをシェルに解釈させたくない時は「”」でくくる
なので、とにかくシェルやランタイムに触られたくない引数はダブルクォーティングするとよろし
>>259 それ本当?ダブルクォートだと展開されちゃうと思うよ。
俺もwin32/win32.cのrb_w32_cmdvectorの中を見て、 シングルクォートだけが対象になっていると思ったが、 cmd.exe越しにダブルクォートでくくると、なぜかglob展開されなくなってた どうなってんだこれ?
展開されるぞ? > ruby -v ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] > ruby -e "p ARGV" "*.*" ["20060402.rb", "20060402.txt", "20060425.rb", ...(以下略
手元にあるやつで実験したら cygwin版(1.8.6)だと展開されないぽい asr(1.8.5)だと展開された
同じバージョンでmswinとmingwとで違うのかな? cygwinの場合は極力LinuxやUNIXと同じになるよう設計されてるハズだから 勝手に展開制御されるようにコンパイルされても何も不思議はないが
> ruby -ve "p ARGV" "*" ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mingw32] ["AUTOEXEC.BAT", "boot.ini", "bootfont.bin", ..省略.. ] % ruby -ve "p ARGV" "*" ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-freebsd6.1] ["*"] MSVCRT版の挙動を改善するべきだと思う
>>259 >Windowsでワイルドカードを展開してるのはCランタイムのスタートアップルーチン
大嘘。
261が書いてるように、ruby自体がwin32/win32.cの中で処理している。
>>263 cygwinは全然違う。win32/win32.cをそもそも使わない。
>>264 mswinとmingwは同じ。
まさかmingwとcygwinを混同してる奴がいる?
>>267 君がどこまでCランタイムを読みこんでるのかは知らんが、MSVCRTというか
スタートアップルーチンがワイルドカードを展開するのはsetargv.objをリンクした
時だけなんだよ。
それ以外の場合、__getmainargsに渡される引数dowildcardは0で、結果として
ワイルドカードは展開されない。
君が貼ったURLにもそのことは明記されているよ。
さて、ここまで言えばわかると思うが、ruby.exeはsetargv.objをリンクしていない。
というわけで、二重引用符で囲んであろうがなかろうがワイルドカードを展開
してるのはruby自体のwin32/win32.cのrb_w32_cmdvector。
>>268 俺が間違っていた。
MSVCRT版は__getmainargsどうこうではなくて、main関数で受けた引数がなんで
あろうとwin32/win32.cのrb_w32_cmdvectorで上書きしていたのだな。
失礼した。
二重引用符で囲んであるワイルドカードを展開しないなら "C:\Program Files\*.*" はどう書くの?引用符を削ると引数が分かれるし。
だから囲んであっても展開する、という仕様なんじゃない? 単にコマンドライン引数として * を渡したいなら '*' で渡せるようになってるみたいだし。
>>270 二重引用符は全体だけでなく、部分部分を囲むことが出来る
『"C:\Program Files"\*.*』でも『C:\Program" "Files\*.*』でも問題ない
どこに原因があるのかはともかくおせっかいな挙動だな
274 :
デフォルトの名無しさん :2007/07/17(火) 22:19:41
俺は、てっきりシェルか何かが展開してるのかと思っていた
Linux版Rubyはほぼシェル任せなんじゃね? Win版は挙動を近付ける為に細工されてるって話かと
任せるも何も、そうなってないUNIXのシェルって聞いたことない。
Winは未だにワイルドカードの展開はアプリケーション側に任されている だからRubyもその精神に従っている まあWinにとってコマンドラインは後方互換のお荷物でしかないからな と、M$の人は考えてるんじゃないですかね
PowerShellとかいうやつのはどうなってるんだろう。
で、結局どうあるべきなん?
>>265 の例だとLinuxはどうなる?
Linux は FreeBSD と同じ。 (ていうか UNIX はみんな同じ)
(シェルが同じなら)同じ
282 :
259 :2007/07/19(木) 00:54:19
大嘘書いたようで、すんません >win32/win32.cのrb_w32_cmdvectorで上書きしていたのだな。 win版rubyは自分でワイルドカードの展開してたの知らんかった GetCommandLine()で生のコマンドライン引数取ってたのね で結論は(Mingw版ruby1.8.4なんだけど) ruby自身はシングルクォーティングされた引数はワイルドカードの展開をしない ダブルクォーティングだと空白を含めるだけでワイルドカードの展開はされる ruby以外の何にも考えてない普通のMingwのアプリだと(VCも?) ダブルクォーティングされた引数はワイルドカードの展開をしない シングルクォートは単なる文字扱い 手元のActivePerl 5.8.4だとこの動作だった cmd.exeのコマンドラインの「&|<>」は ダブルクォーティングされていれば解釈されない でも%path%とかの展開は止められない ややこしい
それと ruby 1.9.0 (2007-07-02 patchlevel 0) [i386-mingw32] だと コマンドライン引数でもDir.globのようにUNIXのシェル風ワイルドカード展開するようになってた
展開されたリストからワイルドカードを推論するwin32用ライブラリを作ればいいんじゃなかろうか。
そもそもなんで展開しちゃまずいんだよ?
ワイルドカードを適用するのがカレントディレクトリのファイルに対してとは限らないだろ
>>285 自前でワイルドカード展開したいんじゃない?
-r *.txt
みたいに渡されたらサブディレクトリの *.txt も展開したいとか。
UNIX系で ls */*/* は可能なのに DOS系では dir *.*\*.*\*.* なんて出来ないよな
そりゃcmd.exe(command.com)の仕様
>288 あーびっくりした、つかURLがmsdnな点で気付けという話もあるが (W)Setargv.obj の挙動変更の話だったか 一瞬cmd.exeがそんな発狂したような仕様になるのかと思ってガクブルった
>>292 cmd.exeの各コマンドは元々 "" でワイルドカード展開は抑制できないぞ?
294 :
デフォルトの名無しさん :2007/07/20(金) 03:27:00
test::unitのtestrunnerについての質問です。 TKやGTK(2)などをつかったtestrunnerの場合、 テスト対象のコードや、テストコードを修正した場合、 やっぱり、テストコードを再起動しなきゃダメですよね? そのまま立ち上げておいて、修正するたびに「RUN」ボタン を押すだけだと便利だなーと思ったんですが。 くだらない質問でスミマセン
拡張ライブラリをunloadする方法はないしな。 むしろrunnerは別プロセスにして、フロントエンドは結果の表示だけに限定し たほうがいいのかもしれん。
>>287 -r*.txt とか GNU grepみたいに --include=*.txt でいいじゃん。
Rubyの変な挙動を回避する為の苦肉の策としてはいいじゃん。
>>287 ていうか、そこまで全部やってくれるのが **/*.txt なんだが。
define_methodっていう便利なものがあったのを知った。
301 :
デフォルトの名無しさん :2007/07/21(土) 01:45:27
exitしたらいいんじゃないの?
303 :
デフォルトの名無しさん :2007/07/21(土) 01:53:53
そしたら終わってしまうではないですか・・・
C言語なんかを勉強してる奴がよく引っかかるヤツだな。 getcとバッファの関係を理解してるか? while c=$stdin.getc do p c end を実行して、色んな文字列を入力して何が起きるか調べてみろ。
305 :
デフォルトの名無しさん :2007/07/21(土) 09:19:50
なる。 入力した文字の階数+1だけprintが反復しますね。 rをいれたら2回 aaaaを入れたら5回 なんでやろ・・ 目標としては、更新ボタンを押すたびにお気に入りに登録したページの更新を確かめてくれる それだけでかなり幸せになれる。 この問題はどう解決すべきですか?
>>304 はprintじゃなくてpを使ってみろって書いてあるだろ。
307 :
デフォルトの名無しさん :2007/07/21(土) 09:29:47
使ってます。 printっていうのは最初に書いてある while 1 do の次に書いてあるやつです。これが反復するから困っています。
while c = gets case c when /^r/ when /^q/ break end end
309 :
デフォルトの名無しさん :2007/07/21(土) 10:26:23
それおかしくないですか?STDINとか$stdinがない。 それにそれじゃ一番最初にメニューが出ない。
getcは IO ポートから1文字読み込むメソッド。 標準入力ポートは、読み込みを要求されたとき バッファに何も文字列がない場合のみキー入力を促す。 だから1度目の getc ではバッファに文字列がないので 標準入力ポートはユーザにキー入力を要求する。 そこで r[Enter] と入力すると、バッファには "r\n" が溜まる。 getc は標準入力ポートから1文字読み込み、?r が返る。 しかし2度目の getc では既にバッファに文字がある。残りの "\n" だ。 だからキー入力を要求することもなく、getc は ?\n を返す。
312 :
デフォルトの名無しさん :2007/07/21(土) 18:49:11
ということは getcした時に\nがダメなようにする必要がありますね。 .chompでおk?
313 :
デフォルトの名無しさん :2007/07/21(土) 18:52:41
ダメだな・・・どうすりゃいいんだ・・・
進歩のなさがいいかげんうぜえと思ったがよく考えるまでもなくここは初心者スレだった 参考書は何を読んでるのかが気になる
315 :
デフォルトの名無しさん :2007/07/21(土) 19:14:36
オブジェクト指向スプリクト言語 Ruby by Matz, アスキー出版局 でつ。 どうすればこの問題を解決出来るんだ
その本は大事に本棚の奥にしまっとけ プログラム作成に役に立つことは特に書いてない
とりあえず p c してみるというのはやってみたのか?
PC使ってるし
getcはEOFを検知するまで適当なIOオブジェクトから1文字読み込んでいわゆるASCIIコードを返し続ける どこでどう吹き込まれたのか知らないけど「IOポートから1文字だけ読み込んで返す」というメソッドではない IOオブジェクトから5文字流れてきてたならASCIIコードを5個返す c = $stdin.gets[0] がおそらく希望にいちばん添う書き方だと思われ これなら標準入力から行末まで読み込んだうちの1バイト目のASCIIコードがcに入る
320 :
デフォルトの名無しさん :2007/07/21(土) 20:10:42
getsは引数とれるみたいだけどそうやって使うでつか・・・
>>319 神!!!!!!!!!!!!!!!!!!!!!!!!
ktkr
>>316 あとたのしいrubyは読破しています。
オブ(ryは学校の図書館から借りていました。
ずっとおれのターンにして借りつづける予定でつ、良い本だと思いまつが
RubyよりCやった方が良さそうだ
322 :
デフォルトの名無しさん :2007/07/21(土) 20:13:46
あれ?さっき出来たのに出来なくなった。 おかしい
こんなのが京大生なのか?世も末だな
324 :
デフォルトの名無しさん :2007/07/21(土) 20:15:56
あれ $stdin.gets[0]にしたら出来た。つまり [0]って配列のindexのことなのか!!!! [1]だとダメっぽい
325 :
デフォルトの名無しさん :2007/07/21(土) 20:17:52
>>323 いや開発経験ゼロでまともに知識をアウトプット出来ないんです。
だからkyoto-uを見る為の道具を作ろうと思って。
更新されたものをチェックしてくれるようになればすごく楽
将来的にはgtk2を使ってもっといいものを作りたいんだけどNE
$stdin.getsが出てきたらマニュアルのIOのgetsのとこを読んでみるとかくらいはして欲しいもんだ > getc > IO ポートから 1 文字読み込んで、その文字に対応する Fixnum を返します。 ただ、文字列に[0]や[1]がつく場合は初心者にはちょっと調べるの難しい。これはマニュアルが不親切 > self[nth] > nth 番目のバイトを整数(文字コード)で返します
>>325 ちゃんとした知識が得たいならMLとか聞いたほうがよかんべよ
あと、まつもと本はさすがに古いし、あれはPerlとかUnix文化を一通り知ってる人向けに
書かれてるから、ふつうは神棚に飾っておくもの。ちゃんと図書館に返しておけよ。
金があるなら、本屋行って自分用に買ったほうがいいし、金ないならそのへんの大学とかのRuby講義を
さらってみてはどうかな。
ttp://www1.tf.chiba-u.jp/~shin/tutorial/index.rb あと、もうひとつ言っておくけど、rubyはスレッドが変なのでGUIプログラミングに向かない。
GtkでいいものつくりたければPythonでやるのがポピュラー。
RubyでGtkはサンプルが少なくて困るかもしれない。 リファレンスもちょっと。。
329 :
デフォルトの名無しさん :2007/07/21(土) 21:56:33
メーリスは読んでいます。 実はwxrubyはある程度やってました。 しかしlinuxで使えるとか使えないとかで結局gtkをやることにしました。 え、rubyでGUIはダメなんですか? pythonはあの文法が生理的に受け付けません。 一番しっくりくるのは、そして書いてて楽しいのはやっぱりC言語なんですけど、 手続き型なのとコンパイルがうざいのでオブジェクト指向したいし、rubyすることにしました。 今回はちょっと軽い問題にぶち当たったくらいで、基本的な知識は一通りあります。 ただ実際に開発して問題を抱えた経験がないので戸惑っただけです。 実際に開発するといい加減な知識はないも同然ですからね。
Visuaruby
331 :
デフォルトの名無しさん :2007/07/21(土) 22:19:30
linuxでは使えませんよね
>>327 > あと、もうひとつ言っておくけど、rubyはスレッドが変なのでGUIプログラミングに向かない。
どういうとこがGUIプログラミングに向かないような変?
334 :
デフォルトの名無しさん :2007/07/21(土) 23:31:41
今実装してるんだけど レスのクラス スレッドのクラス の2つを作ってんだよね で、質問なんですけど スレッドのクラスにレスを持たせるのではなくて レスのクラスのクラス変数にスレッドの情報を持たせるのがruby的には正しいですか? rubyのクラス変数って何の為にあるのか分からない。 従業員クラスを作ってそいつらに会社の名前をクラス変数として持たせるとかいう話はあるけど 別に会社のクラスを作ってそこに従業員を入れればいいんじゃね、とか思います。 おれの常識ではそういうのがオブジェクト指向だと思ってるんだけど だからクラス変数って何の為にあるのか分からない、メモリの節約? GCあるのに?
>>334 >レスのクラスのクラス変数にスレッドの情報を持たせるのがruby的には正しいですか?
スレが世界に1つしかないならともかく、いくつもスレが立つのに
これはありえんだろ。
336 :
デフォルトの名無しさん :2007/07/21(土) 23:51:45
ですよね。 ちょっとThreadがuninitializeとかいわれてぶっころしたい。 def initialize(url) end ちゃんと定義されてるじゃん、どうしてだ
337 :
デフォルトの名無しさん :2007/07/21(土) 23:56:30
何!!!! もしかしてThreadってクラス名はつけちゃダメだったのか? Threaにしたらとおった、なんたるツンデレ
掲示板のスレッドクラスをThreadと定義してしまうのはよくあるミスだな Threadクラスはすでに組み込みで存在する
組み込みにThreadっていうクラスがある Rubyでは定義済みクラスがあるときにclass そのクラス.... endはエラーではなく、 定義を追加したり再定義したりできる というあたりで不幸がおこったのかな。
340 :
デフォルトの名無しさん :2007/07/22(日) 00:03:04
もしかして上書きされちゃいましたかね、Threadっていうクラス・・・・ だとしたら最悪、入れ直すしかない。 とりあえずbcにうpしますた。 よかったら見てください。
>340 プログラムが動いてる間、そのプログラムの世界の中だけで、ね > 上書き 自分でファイルコピーして上書きでもしなきゃ大丈夫
そういえばRubyってどんなことするプログラムなの?
Perlと似たようなことをPerlとは違う書き方で実現するプログラム言語です Perlが何をする言語かというのはPerlスレでお聞きください
拡張ライブラリ(具体的にはwxruby2-preview0.0.40)使ってて Segmentation faultで落ちるんですが どこで落ちてるのか調べようと思ったら、rubyと拡張ライブラリをそれぞれデバッグビルドして デバッガで追っかける……というのが定石でしょうか。 ちなみにrubyの方は ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] です。 落ちるソースは会社で昼休みに書いたもんなんで今手元にないんですが、 メニューバーとステータスバーとウイジェットいくつか置いたFrameの派生クラスを表示させて そのウインドウを閉じたら落ちましたorz
>>333 Pythonもgiant lock使ってるから、そこで触れられている問題は解決しない。
pthreadだから全部OKなんて短絡すぎ。
へぇ。じゃあ最終的にはperlと本質は変わらないんだ。 じゃあ後はどっちが使いやすいかってことだね。
それは主観によるので意味がないです
matz日記にコメントつけられないんだけど なんで?セキュリティソフトとかが原因?
>>329 え、Linuxでは動かないのか? 初めて聞いたんだけど
>>334 クラス変数の使い方は俺もマジで知りたい、あれ何に使えばいいんだ?
たいていはメソッド定義や定数で事足りると思うんだが
>>337 ちゃんとモジュールで括ったほうがいいよ
クラス変数ってスコーピングのためにあるんじゃないのか。 クラス単位でのグローバル変数だべ。まあ、rubyにはもともとなかったのにあとから入れたからね。 ruby2だと挙動が変わるからあんま使わなくて正解だよ。
351 :
デフォルトの名無しさん :2007/07/22(日) 09:24:57
>>350 ですよね。何の為にいれたのか分からない。
OPP的に考えて必要ないなぁ、ややこしくなるなぁと
Matzは自分の本でグローバル変数は使ってはいけません、わけわからんくなるから
って書いてるんだけど、まぁthere is more ways to do itだっけ?そういうことなのかな
352 :
デフォルトの名無しさん :2007/07/22(日) 09:35:06
おれがプログラムはOPPぽくなってますか?
OOP的っていうか、普通はクラス変数はSingletonに使うもんじゃないのか
定数にしたいけど、あんまり外に見せたくないものを代用したりとか。 正直微妙。
俺もSingletonとして使うことが多い
クラス変数とクラスオブジェクトのインスタンス変数とはどう違うの?
インスタンスがなくても使える
うむ
>>356 サブクラス等との間でも変数が共有される
360 :
356 :2007/07/22(日) 12:57:03
>>357-359 ありがとう。
良く見るとドキュメントのクラス変数のところに書いてあった orz
361 :
デフォルトの名無しさん :2007/07/22(日) 17:40:42
Singletonって何?
未婚の豚
プログラミングでSingletonといえば、ふつうはデザインパターンでいう 「インスタンスを一つ(あるいは有限個)しか作ら(せ)ないクラス」という意味。 Rubyでもこの意味で使うが、加えて「特異メソッド」の「特異」も英語 ではSingletonなので文脈で判断する必要がある。
364 :
デフォルトの名無しさん :2007/07/22(日) 18:23:23
なる。 必要ありませんな。
つうか、require 'singleton'するのが定石じゃないの。 こういうところがrubyかっこいいぜ
初心者スレっぽい
368 :
デフォルトの名無しさん :2007/07/22(日) 23:00:49
いや別に 日経ソフトウェアくらいの立ち位置の雑誌がRubyの特集をするのは毎年のこと 今年はRubyの年になる、というようなのはRuby1.4くらいの頃からずっと聞いてる まあ、結果として認知されるくらいには普及はしたけどな 「PerlとPHPと、あとなんだっけ、Ruby?」くらいにはなったとは思う
>>369 でもその認知度って日本だけってことはない?
>>370 オライリーが rails conf 開くくらいだから十分認知されていると思うけど。
「rails、rails、rails… どいつもこいつも rails! なぜだ!なぜこの俺を認めねえ!?」 とジャギのように駄々をこねるrubyタンが脳裏をよぎった…
ある配列を元にeachで複数のインスタンスを生成したいのですが どのようにすればキレイにかけるでしょうか? やりたいことをそのまま書くとこんな感じです。 宜しくお願いします。 array = "a","b","c" array.each{|a| t = Test.new(a) }
instances=array.map{|a| Test.new(a)}
ここでmap派とcollect派の論争が。
勝った方がPythonと決勝戦な
tに上書きしてない?
返事に迷う書き込みだな そうだ、としか言えんが…
すみませんが、質問です。 URI::HTTPクラスで、ドメイン名に"_"(アンダースコア)を含めると URI::InvalidComponentError が発生します。 どうにかして、これを抑制できないでしょうか?登録したいURLに、ドメイン名 にアンダースコアを含むものがあるのです。
そんなドメインを許した奴を殴れ ドメインには _ は存在できない
[RFC1035]の規定を要約すると、ドメイン名を構成できるのは 「aからz、0〜9、- からなる語(先頭はaからzのみ、末尾は-不可)」 をドット(.)で繋いだもの。 長さ制限は、各語63文字以下、全体で合計255文字以下。
極端な話をすれば、URLにはマルチバイト文字が入る場合もありうるからな 日本語ドメインとかPATH_INFOとか どうしても抑制したいならURI::HTTPを継承して 用途に合った新しいクラスを作るのが一番いいと思う
383 :
379 :2007/07/24(火) 01:23:22
皆さん、ありがとうございます。 "_"がドメイン名に使えないことは聞きかじっておりましたが、そういうサイ トが実際存在してしまっているので、こちらからはどうしようもないのです。 やはり、新クラスしかありませんか。困ったなあ。
>>379-383 Windows の ActiveDirectory なんかでうっかりそういうドメインを造ってしまう馬鹿が最近おおい
画期的なアイディアを思いついたとか言って自慢するタイプなのかゲイシは
なんだ結局URI::HTTPのバグか
バグを他人のせいにするとはrubyって最低だすな
>なんだ結局URI::HTTPのバグか >なんだ結局URI::HTTPのバグか >なんだ結局URI::HTTPのバグか
この問題(これをバグと呼ぶ奴は頭がおかしい)については前から議論があるんだけど、過去スレあたりで回避策が出ていたはず。
>>385 アイディアは褒めてやろう
だからインターネットと混ぜるな(w
クックブックとレシピブックってどっちがおすすめ?
One-Click Ruby InstallerでRubyをインストールしたのですが、 ruby -v すると ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] 、 gem -v すると 0.9.2 となっています。 最新のpatchlevelは36のようですが、 これらにパッチを当てるためにはどうしたらいいのでしょうか?
>>394 そういう細かいのは自前でコンパイルしてインストールするしかないんじゃね
最新のパッチ当てたRubyでなければならない要件があるならソースからコンパイルだ
2年くらい前に作って惰性で使ってた特定サイト用自作ダウンローダーのソースを眺めたら
URLクラスというものがゼロから定義してあった
ダウンローダーのクラス内で特定サイトのHTMLをダウンロードするメソッドでこう使う
def get_htmlfile
Net::HTTP.version_1_2
url=URL.split(@@url)
Net::HTTP.start(url['server'],url['port']){|http|
http.open_timeout=10
http.read_timeout=10
response=http.get(url['path'])
Util.abort(response.code,"
http://#{url[ 'server']}#{url['path']}") unless response.code == "200"
return {'status' => response.code , 'html' =>response.body}
}
end
…なんだこれ
いや、やりたいことはわかるが
396 :
379 :2007/07/25(水) 03:43:51
すみません、遅くなりました。
>>390 > この問題(これをバグと呼ぶ奴は頭がおかしい)については前から議論がある
> んだけど、過去スレあたりで回避策が出ていたはず。
どの過去ログか、心当たりを教えていただけないでしょうか?
自分は●持ちなので、
・Ruby初心者スレ
・Ruby本スレ
・Railsスレ
これら全ての過去ログを "uri::" で検索してみましたが、該当個所は見つか
りませんでした。
>>369 明確な場所は覚えてないんだよ、ごめん。
初心者スレか本スレの過去ログを、"module URI" か "ABS_URI" あたりで検索してみて。
398 :
397 :2007/07/25(水) 12:07:14
あ、ポインタ間違えた。
>>396 でした。ごめん。
ポインタかw アドレスを指し示す…なるほど
String.toutf8 という関数がありますが、 それをKconv以外で実現できるライブラリーはありますでしょうか?
Ruby には関数なんて無(略 require 'kconv' したくないということ? オーバーヘッドが心配? それとも String が"汚染"されるのが用途に合わない?
402 :
400 :2007/07/25(水) 13:42:28
私、昆布が大嫌いなので他にあればと思い質問しました。 ちなみに関数ではなく、メソッドとよぶのでしょうか。。?
iconvもuconvも嫌いなんだろ。無理。
>>402 >ちなみに関数ではなく、メソッドとよぶのでしょうか。。?
関数とメソッドって全然別物だろ
システム変数(組み込み変数?)で 例外が発生した行数が格納されるのって何だっけ?
行数だけというのはない。 $@が、callerが返す["ファイル名:行番号", ...]という配列になってる。
質問です。Dir.globで"本"という字を含むディレクトリだけが 出力することができません。なにか制限があるのでしょうか? require 'fileutils' d = "木" Dir.mkdir(d) FileUtils.touch("#{d}/test.txt") Dir.glob("#{d}/*"){|f| puts f} # 出力される d2 = "本" FileUtils.mv(d,d2) Dir.glob("#{d2}/*"){|f| puts f} # 出力されない
またか p "本" "\226{" というわけでいわゆる駄目文字のバグだ Ruby1.8.6で直ってると思われるが試してない
定期的にサーバのHTMLファイルを取得するスクリプトを作っていまが、下のエラーが生じてしまいます。 このタイムアウト?が生じても動作が続けられるようにするにはどうすればよいでしょうか? /usr/lib/ruby/1.8/timeout.rb:42:in `rbuf_fill': execution expired (Timeout::Error) from /usr/lib/ruby/1.8/net/protocol.rb:196:in `timeout' from /usr/lib/ruby/1.8/timeout.rb:55:in `timeout' from /usr/lib/ruby/1.8/net/protocol.rb:196:in `rbuf_fill' from /usr/lib/ruby/1.8/net/protocol.rb:160:in `readuntil' from /usr/lib/ruby/1.8/net/protocol.rb:171:in `readline' from /usr/lib/ruby/1.8/net/http.rb:1554:in `read_status_line' from /usr/lib/ruby/1.8/net/http.rb:1538:in `read_new' from /usr/lib/ruby/1.8/net/http.rb:833:in `request' ... 13 levels...
begin タイムアウトするかもしれない処理 rescue Timeout::Error retry end でいーんじゃないの?
一般論として、相手の鯖からタイムアウト食らったらおとなしく諦めろ 再接続を粘っても相手の鯖が余計苦しんでタイムアウトの確率が上がるだけだ
>>411 rescue 即 retry は一番危険だって習わなかったのか?
簡略化したサンプルにケチつけんなダァホ
>>415 rescue Timeout::Error
と
retry
の間にどのような処理を書けば妥当なのか考えたらそんな言葉は出てこない
これはどう控えめに考えても「相手のサーバーが受け入れるまで無限ループを作る」意図しかないぞ
417 :
379 :2007/07/26(木) 02:01:04
418 :
379 :2007/07/26(木) 02:05:18
追記です。肝心の対応コードを引用してみます。
----- 以下、「Rubyについて Part 23」より引用 -----
From: [646] 641 <sage>
Date: 2006/09/19(火) 18:18:39
>>644 http://www.forkosh.com/mimetex.html とりあえず↑のページを表示して、Bad URLにならないよう直したのが↓のコード
require 'uri'
module URI
DOMLABEL = "(?:[#{PATTERN::ALNUM}](?:[-_#{PATTERN::ALNUM}]*[#{PATTERN::ALNUM}])?)"
PCHAR = "(?:[#{PATTERN::UNRESERVED}:@&=+$,\\[\\]\\{\\}`]|#{PATTERN::ESCAPED})"
URIC = "(?:[#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}\\^\\{\\}\\\\\\]|#{PATTERN::ESCAPED})"
X_ABS_URI = PATTERN::X_ABS_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
X_REL_URI = PATTERN::X_REL_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
ABS_URI = Regexp.new('^' + X_ABS_URI + '$', Regexp::EXTENDED, 'N')
REL_URI = Regexp.new('^' + X_REL_URI + '$', Regexp::EXTENDED, 'N')
end
DOMLABEL はホスト名の部分。オリジナルに _ を追加
PCHAR はパス名の部分。MSNの画像で Bad URL になるんで []{}` を追加
URIC はクエリーの部分。mimetexで Bad URL になるんで ^{}\ を追加
ほかにエラーになる文字があったら自分で追加してくれ
それと3連続 gsub がカッコ悪いんで、スマートな書き方あったら誰かよろしく
ruby 1.8.6 では、 "a"=~/a(?=b)?/' が、 nil なのに対し、 perl 5.8.8 では 1 になります。 rubyで上記正規表現が"a"にマッチしないのは、 どうしてでしょうか?
同じであるはずの/a(?:(?=b))?/ =~ "a" や /a(?=b?)/ =~ "a" がマッチすることを考えるとバグ だとは思うが、(?=...)に?をつけるってことは意味的 には何もつけないのと同じだからなぁ。 そのうち直すと思うけど、ちょっと優先度は低めなの で、忘れないようにruby-devかruby-listに出しとい てくれるとありがたい。
>>416 タイムアウト時間を長く設定するのが現実的な妥協案かね
>>420 というか、
=~ 演算子?で正規表現の方を左辺に持ってくるのが結構サンプルとして多いですが、
どちらかというとコレがRuby的に推奨の書き方なんでしょうか。
基本的にPerlerですが、正規表現を右辺値に持ってくる方が馴染んでいたもんで、
結構当初から違和感があります。
いやそうじゃなくて
パターンマッチングを行うのは正規表現オブジェクトの仕事という観点から Regexp#=~を使うのがRuby的。 Strint#=~は、逆にも書けるように便宜的に用意されている。 内部的にパターンマッチングを行う実装はRegexpのほうにあり、 Stringの=~は左右辺を入れ替えてそれを呼び出している。
>>424 なるほど。ありがとうです。
ただ、JavaScript なんかでもStringクラスが matchメソッドを持ってたりするのですが、
これも同様の処理をしてるのかな。(Regexオブジェクトとごにょごにょ)
人間の直感に忠実なRubyとしては、やはりこの辺りは結構足を引っ張りそうな
気もします。
昔は String#=~ が無かった気がする。
>結構足を引っ張りそうな kwsk
うーんやっぱり、書くときの意識として 「この文字列」が「この正規表現」にマッチするか? てのがコードの流れとして多いような気もするが、これを 「この正規表現」に「この文字列」がマッチするか? ていう風に最初から考えればそんなに違和感は無いのかも・・・。 Perl脳か。がんばって改めてみよう。でもgsubとかは逆の思考が必要なんです よね。やっぱり。主体は「文字列」。(正規表現はフォーマットとしての「表現」。)
rubyとperlの使用人数が逆転したねえ perlが下がってrubyが追い抜いた
>>429 そういうのはどうでもいい、というか言い出すとあまり面白くないレスが付きそう。
perlならまあまだ大丈夫だが(枯れてるから)、PHPだともう・・・。やめようよ、そういうの。
それは絶対にない Perlの新規利用者増加はPHPもあって鈍ったかもしれないがRubyが抜くことはない
ほら来たじゃない・・・
>>433 お前はこの統計のどこを見て「使用人数が逆転した」と思ったんだ
>>434 お前はそれがわからないから
上のほうにいけないんだ
夏真っ盛りだなw
>>435 を見て、腹を抱えて笑った俺は
きっと夏の暑さに頭をやられているのだろう
PerlのJapanがやたら多いな
>>438 一番perl使ってるのは日本人てこと?
かもしれない ひとのつかっているものをつかいたがる悪い癖だ
>>425 RubyにもString#matchはあるよ。
rubyでPINGを打つことはできないのでしょうか? Cで書くしかないのかな?
system 'ping example.com'
PerlはKENTで持ってるという感じだな
>>442 require 'ping'
p Ping.pingecho('www.2ch.net', timeout=3, service='echo') #=> true
p Ping.pingecho('example.com', timeout=3, service='echo') #=> false
つーか、Regexp#=~なんか使ったことないな /ごにょごにょパターンが長くなった時とか/ =~ str strが先にあった方が可読性高い気がしてしまう
先にstringがあって、それにあわせてあとからregexp作るからなあ
まあ、若干意図的に無理して記述してることは否定しない > Regexp#=~ 正規表現側が処理を知ってるべきだという思想を振りかけられてる一例だな ぶっちゃけこのへんは両辺見て読み下すからどう書かれてても気にはしないけど 「清書」するときに正規表現を先に書き換える程度で、作ってる最中は入り混じってるからあまり気にするな
俺は自作オブジェクトも双方向に記述できるように書くよ。 個人なら Array#format_to やら Object#in? まで作ってしまう。 なんつーか日本語脳かも。理想は目的語→用言の順になる。
普通の代入も逆方向ができたらいいなーと感じたことがある メソッドをあーしてこーして、出てきた結果を変数に入れる、みたいな思考順序になることが多い もちろん普通に、変数の方が先に頭に思い浮かぶことも多々あるけど
頭では「 /Regex/ =~ str なのか!一貫性があるなあ。OOPマンセー!」と思っていても 身体は正直。 str =~ /regex/ と書いてしまう。くやしい・・・・ビクンビクン
字面の一貫性を過度に求める奴はそもそもRubyなんて使わんだろw
おっさん言うなよ。写真なら昔からいろんなところで公開してるじゃないか。
riで英語のマニュアルがでてきますが、これのファイルはどこに格納されているのでしょう?
うちはMacだけど、 OSX標準のやつが/usr/share/ri MacPortsのが/opt/local/share/ri LinuxのFHSだと、アーキテクチャ非依存・共有可能・読み出し専用だから /usr/share/riになるのかな。他はしらん。
>>454 急に老け込んだのかと思ってチェックしちゃったよ。今まで通りじゃん。
ていうか実年齢がおっさんなんだし、「おっさん一歩手前」はむしろ「意外と若いですね」という意味だなw
一時期生やしてたヒゲは剃っちゃったのね
外人からは、髭がない日本人のオサーンは青年に見えるらしいからな。
>>460 「速読してください!」とか「ブログ見てますが無理にネット言葉使うのは痛々しいです」とか言われるのが嫌なんじゃね?
>>454 何かやらしい表情してるな
カメラマンはもう少しましな写真を撮れ
>>462 それPerlのひとでは…
つかあれはいわゆるネット人格だからアレでいーんだよグリーンダヨ
お二人とも、ブロガーというよりは日本発信のLL伝道者としてがんばって欲しい。
467 :
デフォルトの名無しさん :2007/07/28(土) 12:49:45
楽しいrubyで勉強してます。 P128のクラスメソッド表記法について質問なのですが、 クラス.メソッド名 クラス::メソッド名 の二通りの記述の仕方があるそうなのですが、意識して使い分けるとすれば どのように使い分けられるのでしょうか? 例えば、インスタンスメソッドの場合は「.」、クラスメソッドの場合は「::」を 利用する等でしょうか? ちなみに記述は無かったのですが、インスタンスメソッドも「::」が利用できました。
えっと(r
>>467 > どのように使い分けられるのでしょうか?
どっちも等価なので好きなように。
> 例えば、インスタンスメソッドの場合は「.」、クラスメソッドの場合は「::」を
> 利用する等でしょうか?
意味不明。「クラスメソッド表記法について質問」なのになんでインスタンス
メソッドに話が飛ぶ?
> ちなみに記述は無かったのですが、インスタンスメソッドも「::」が利用できました。
そんなわきゃない。勘違いしてるのは100%明らか。
>>469 >どっちも等価なので好きなように。
その人によるという部分を聞いてみたいのです。
ちなみにあなたはどちらを使っていますか?
>意味不明。「クラスメソッド表記法について質問」なのになんでインスタン>
>メソッドに話が飛ぶ?
インスタンスメソッドとクラスメソッドを比較するためです。
>そんなわきゃない。勘違いしてるのは100%明らか。
[localhost]$ cat method.rb
#!/usr/bin/ruby
p 1000.integer?
p 1000::integer?
[localhost]$ ./method.rb
true
true
できました。
471 :
デフォルトの名無しさん :2007/07/28(土) 14:38:43
newオブジェクトが定義されているクラスはObjectクラスであってますか?
472 :
デフォルトの名無しさん :2007/07/28(土) 14:46:25
newメソッドの間違いです…
>>470 > ちなみにあなたはどちらを使っていますか?
MyClass.klassmethod
> インスタンスメソッドとクラスメソッドを比較するためです。
表記法としては、インスタンスメソッドは
MyClass#instancemethod
> >そんなわきゃない。勘違いしてるのは100%明らか。
> p 1000::integer?
すまん。こっちが勘違いしてた。
>>473 いえ、参考になりました。
返答ありがとうございました。
>>467 俺の場合、メソッドには全て「.」を使ってる
「::」を使うのはモジュール・クラス内の定数を参照するときだけだな
他のコードを見るに、たぶん一般的な書き方なんじゃないかと思う
クラスメソッドに「::」を使うと、統一感がないように感じるんだよなー
外人さんのコードではよく見かけるけど
C++あがりの俺は、初めのうちはクラスメソッドは「::」、インスタンスメソッドは「.」を使っていた。 だけど今ではオブジェクトに対するメソッド呼び出しという意味で「.」のみだな。これは どこかの文面を見て納得した考えでもある。結局、使う人の哲学になってくるだろうけど。 それと、実際のRubyでの挙動は次のように変わる Foo.Bar # Barメソッドの呼び出し Foo::Bar # Bar定数の参照 Foo::Bar() # Barメソッドの呼び出し Foo.bar # barメソッドの呼び出し Foo::bar # barメソッドの呼び出し
::はメソッド名が大文字だったら定数と解釈されるから.が無難。
私もクラスメソッドの呼び出しは.を使う。 A::BはAの名前空間にあるB(スコープ) A.BはオブジェクトAにBというメソッドを呼ぶ(メッセージを送る) で一貫している。
481 :
デフォルトの名無しさん :2007/07/28(土) 18:41:59
>>481 どの言語も人によって合う合わないはあると思う。
というか、 ・プログラマを自認するなら、全部読むかどうかはともかく、ライブラリのソースをのぞいて見るくらいするだろ常考(ry ってのと ・だからドキュメントの整備をしなきゃダメとあれほど(ry という話じゃないかこれは。
Ruby初心者スレッド Part 13
485 :
名無しさん@そうだ選挙に行こう :2007/07/29(日) 02:01:10
> SICP 第二版 (1996) §3.5.4 で
> 「変更と遅延評価…を同時に扱う方法を工夫するのは,
> 研究の盛んな領域である」 と記述してから 10 年たって得られた成果が,
> 改訂版 Python と C# にある新世代の yield だと言えるかもしれません。
> Ruby の輩 (ともがら) にとっては,> 今の Ruby の (CLU から数えて
> 30 年来の) yield が必ずしもイテレータを作る
> たった一つの冴えたやりかたではないことを心に留めておくことが大切です。
ttp://www.okisoft.co.jp/esc/llsp/v42.html
>>481 それを言うならPerlの方がひどいだろ
というより、プログラミングって多かれ少なかれそういうもんだろ。
誰も「たった一つの」なんて思ってない。 かなりの場面でそれなりにうまくいくというだけ。
490 :
デフォルトの名無しさん :2007/07/30(月) 19:34:39
OOPではメインクラスを作ってloopで回すのが正解ですか? GUIのやりかたってそうですよね。 CUIのやりかたもそうなのかなって、GUIに移植したときにわかりやすいし。 OOPとっても便利、だけどむずい。今ソフト設計してる。もちろん我流です。
たとえば App というアプリケーションがあったとして app = App.new loop{ app.run } とするのか class App def run loop{ method1 method2 ... } end end App.new.run とするのかどちらが本質的に好ましいかというのは設計と趣味の領域と思われる
オブジェクト指向のプログラミング言語を学んでると「トップレベル記述恐怖症」的なものに罹ることってあるよな 「違う!この操作自体も全部クラスにできる!トップレベルにはnewだけ!よし美しい!」みたいな
グローバル関数やグローバル変数を見ただけで拒否反応を起こす、とかな。 クラスのstaticな変数も同じと言えば同じなのにな。
>>490 普通のCUIなら、起動して実行して終わるってのが普通だから
loopで回す必要はないんじゃないか?
メインクラスの定義は必ずしも必要ではないけど
やっておくとテストや再利用が楽になる(融通が利く)のでオススメ
グローバルな変数や定数使わなくてすむしな
495 :
デフォルトの名無しさん :2007/07/30(月) 20:44:04
例えば A>B だったとします。>は包含の意味です。AがBのインスタンスを多数保有するとします。 この時、Bのインスタンス変数にAからアクセスするのはあまり望ましくありませんか? BのことはBの中で処理した方がいいでしょうか? つまり、Aからいじるのではなく、Bにいじるメソッドを作っておいてAからはあくまでもBのインスタンスがメソッドを使用するという形でしかBのインスタンス変数の内容を変えられないようにするということです。 保守性の問題かと思われますが、なるべく正しいOOPを書きたいです。 OOPとはなんぞやと考えたのですが それはきっと問題を分割して簡単化する事ではないかと思ったのです。 実世界の射影だとも受け取れますが。
>>495 処理の種類と規模と設計と言語次第じゃね?
例えばFlashのActionScript(3未満)でオブジェクトの_x,_yなどにgetter, setterを
用意するのはあまりにもあまりだとは思うし、それで保守性が上がるとも思えん。
>>495 >>496 の言うとおり、あんまり教条的になることもないんじゃないのかな。
AとBを保守する人間が別であるのならきっちり分けておいた方がいい(かもしれない)し、
そうでないならいじっちゃってもかまわないんじゃね? と思うよ。
別の言い方をするならどこまでをひとかたまりのカプセルと見なすか、ってことじゃないかなあ。
>>495 マルチスレッドを考えたときは、インスタンス変数を
きっちりガードできる方が分かりやすかったりする。
ケースバイケースなのはそうなんだが、操作をデータの周りに集めるという
Bにメソッドを作るというのがより原理的だとは思う。
センスのない原理主義者の書いたソースはセンスのない無原理なソースより まだ何とかなる。 ただ、出来ればセンスを磨く方向を目指して欲しいとは思う。 偉そうに言ってるが、自分でも目指したいと思う。
500 :
デフォルトの名無しさん :2007/07/30(月) 22:13:34
rubyは非常に美しい言語だと思います。芸術です。 なので出来るだけ美しいプログラムを書きたいと思っています。 どんなプログラムにも。 いや例えばファイルをとって来て特定のファイルを操作するだけみたいなプログラムならそのまま書きますが、少し大きくなったら完全にOOPを遵守した方が問題が簡単になるのではないでしょうか。 まだプログラム初心者だからかプログラムをなるべく小さな問題に分けて考えないと作れません、これもOOPも利点ではないのでしょうか。 あとアルバイトでプログラマとして働きたいのですが(一石二鳥ですからね) Rubyを使ったバイトってなかなかないですね。大体PHP、MySQL、Javaです。 バイトをするに当たってどのくらいの技術がいりますか?
どこかにプロダクトとして提出する(あるいは正式に多人数で開発する)プログラムでないのなら、 世の中の8割のRubyプログラムには「でっかいサブルーチン」としての動作しかしないクラス(とメソッド)しか無いと思うぞ
「クラスとインスタンスの関係はタイヤキの型とタイヤキの関係です」 「で、このクラスはインスタンスをいくつ作るんですか?」 「一点物ですよ」 クラスにする意味ないよな。正しくはモジュールにすべきだ。 あとRuby単品の仕事の募集というのは見たことがない。 (札幌のハロワで「Ruby使える人でもいいよ」というWebPG募集を1回だけ見かけたが) Rubyだけ使えても飯食う段には意味がないというのが通説。 「Rubyの知識もあるので変態面に堕ちやすいP(ピー)を使ってもスジはバッチリです(笑)」というようなアピールに使う。
503 :
デフォルトの名無しさん :2007/07/30(月) 22:35:10
一点もののクラスはダメなんですか。
なるべくクラスを作ってOOPに遵守しようとする人はやっぱりキチガイですかね。
おれはそっちの方が美しいと思うのですが。
>>501 Rubyは少人数向けのプログラム言語らしいですよ。
JavaからRubyへという本に書いてありましたよ
ピーがPythonでないことだけはわかるが。また荒らしたいのかw
多人数ってのはペアより数が多いことだろ。1、2、たくさん。
複数人で製作するなら保守性考慮してきちんとクラス設計しろってことかと。
あと
>>502 の「モジュールにすべき」はどちらかというとジョークに近い。
newが起動中1回だけしか行われないクラスであってもクラスである意味はある。
とりあえず、Rubyはそれほど美しい言語でもない。
大量のしがらみでがんじがらめに育たざるを得なかったJavaよりは美しい部分が多い
(というかJavaで醜かった部分がRubyでは素直なので実際以上に理想郷のように見える)
が、それにしたってせいぜい3歩くらい先にいるだけだ。
幻想はとっとと捨てて実際的なプログラミングしようぜ。
ただ名前空間を分けるだけなら、Rubyにはモジュールがあるんだからmoduleを つかう、て言うのが実際的でもあるんじゃないかと思う。 やっぱりクラスはクラスとして使うのが、Ruby言語の「仕様」だと思う。 これをお仕着せだと思いたい人は思ったらいいが。
507 :
デフォルトの名無しさん :2007/07/30(月) 22:54:25
今簡単なソフト作ってるけどどのクラスがどんなメソッドやインスタンス変数を持ってたか、分からなくなる。 開発環境はemacs OSはVine Linux 何かいい方法ありませんか?みなさん、メソッドとかは紙に書き出していってる系ですか? それとも何かIDE使ってたりする? RDEがあるのでWinが少しだけ羨ましい。
>>506 いや、名前空間を分けるだけならそれでもいいんだが
たとえばAppクラスなんかだとインスタンスが必要な場面が出てくる
>>507 一つのクラスにいろいろなことをさせてないか?
>>509 クラスがたくさんあってわけわかめになってるのかもしれない
たとえばクラスを10個作ったら俺の短期記憶限界を超える
>>507 >>509 の言うとおり、またクラス・関数設計を(自分ルールでいいから)原則を
持ってやれば、そうそう「ドキュメント」は必要にならない、と思うよ。経験上。
512 :
デフォルトの名無しさん :2007/07/30(月) 23:08:59
513 :
デフォルトの名無しさん :2007/07/30(月) 23:11:30
>>510 どう考えてもメインを除くとクラスはみっつしかないんですけどね・・・
慣れてないからかな、ずっと開発がストップしていましたが、やっと試験があとひとつになったので再開しました。
早く完成させたい。
ここを抜けたらあとは正規表現でスレを解析するだけだと思っています。
あぁ、あとまぁ過去のレス数なんかをファイルに書き込んだり読み込んだりしないといけないけど
これはそれほど手間じゃないかな
>>512 そういうのに答えてくれそうな人はMLの方にいそうな気がする。
>>515 同意
あれだろ、本当は自分で作る気無いだろ
ネットとの接触の仕方の悪いとこがそのまんま出た形だな。
>>512 前回同様、自分で作れてないから文句言われるんだよ。まずは自分で作れ。
プログラム作ってるときなんて動かないなんて日常茶飯事だ。自力で直せ。
どうしてもわからなかったらわからんとこを抽象化して質問しろ。
製作意図ごと丸投げすんな。そんなことされてもこっちは全くわからん。
518 :
デフォルトの名無しさん :2007/07/30(月) 23:27:22
いや前回からかなり改良されてるはずですよ。 進歩はしてるはずです。基本機能はあと少しなんだけど、なぜか詰まった。 @res_arrray = Array.new() としているのに @res_array.clearが nilclassだからそんなもんねーよっていわれる こういう局所的な問題に噛み砕けば教えてもらえますか? MLは読んでるけど質問しにくい空気がある。 英語MLの方がいいかな・・・
>>513 >>509 のほうは見た?
みっつしかないからひとつのクラスでやることがたくさんあって
同時に考えることが必要以上に多くなってるんじゃないのかしらね。
>>514 親切なメンバーからの返事に対して書いた返事の内容によって全員にハブられるよーなタイプだと思う
なんかよくいるタイプの質問君
まーとりあえずあれだ、本当の意味で初心者なのはわかったんで、小さいのから作れよ
きちんと動くのから作らないとわけがわからないし達成感もないしどこで動かなくなったんだか見当もつけにくい
あと何をするプログラムなのかはプログラム内容から推測しかけたが面倒っぽいのでパス
521 :
デフォルトの名無しさん :2007/07/30(月) 23:33:40
なんでだろ、どうみてもArrayクラスなのに。
p で必要な内容(例:サイトの内容)の表示をする → 動いたので正規表現で抜き出してみる → これも動いたのでデータの取得とデータの加工をメソッドに分ける → トップレベルに簡潔なメソッドチェーンが並ぶ → 似たようなメソッドの組み合わせをいくつか作って動かしてみる → メソッドを実行するメソッドを作る → メソッドをクラスにまとめてみる → 動いたらインスタンス変数とかにできるものを考える 今のところこんな感じで作ることが多い たいていなんとかなるって
>>518 とりあえずsageろ
>nilclassだからそんなもんねーよっていわれる
ヒント:initialize処理の順番
あと、質問に直接関係ないところで一つ悪い点がある
クラス定義内(attr_readerの前)で直接インスタンス変数を宣言しようとしてるよな?
そこに書いても宣言にはならない。ちゃんとinitializeで初期化すべき
こんなことで毎回スレに来られても困るので、解決法を書く。 とりあえずは class Thre で何かおかしいことが起こってると推測できるんだよな。 で、@res_array のところ、たぶん46行目で例外吐いてると(エラーは勝手に訳すな端折るな1行全部書け)。 で、エラーメッセージは33行目の記述もあるはず。33行目のload_threadの中の46行目の以下略、みたいな。 だから initialize のとこでたとえばこう書く def initialize(url) p url @url = url p @res_array load_thread() @res_array = Array.new() #arrayとして認識させたい. いらん? end def load_thread()のとこにもこう書く def load_thread() @thread_name = "thre_namae" p @res_array @res_array.clear #初期化 で再度実行すると、urlはurlが表示されて、1回目と2回目の@res_arrayのぶんはnilが表示されるはずだ。 つまり、 initialize の load_thread の前の時点で@res_array は既にnilで、配列になってない。 では何故か。
525 :
デフォルトの名無しさん :2007/07/30(月) 23:51:14
>>522 おれこのプログラムの設計がまず
1)こんなクラス必要だよなぁ
2)こんなインスタンス変数が必要だよなぁ
3)おっとこんなメソッドがないと現実の射影にならないぜ
の順だからわけわからんくなってるのかも。
これってOOPの考え方だよなと思ってるんですけど。OOPって数学みたいにきれい。
書いていて射精しそうなくらい美しい。
>>523 調べます。順番は気にしてなかたなぁ
526 :
デフォルトの名無しさん :2007/07/30(月) 23:54:01
あ、ほんとだ、initializeでもおかしいぞってエラー出てる。 見逃してた、少し考えるか。この高知能の脳で。
>>524 みたいなベタで泥臭い方法ってどっかで教わったりしないのかな。しないか。
学校のテストじゃないんだから頭の中で考えたってデバッグなんてできないのに。
>>525 「現実の射影」とかは考えない。
小説や漫画が現実ではないのと一緒。
2と3の順番は入れ替えて考えた方が良い。
529 :
デフォルトの名無しさん :2007/07/31(火) 00:04:22
ちょっと疑問。 thread_nameだけど、これ最初load_threadにいれてた。 だけど認識出来ないといわれた これはおそらく上のinitializeしないと使えないよの件によるものかと思われる。 まぁ現実的に考えて @thread_nameはinitializeに入れるのがベターだとは思うが、これをload_threadに組み込みたいが initializeにはいれたくない場合、つまりinitializeでは何もしないんだしいれる必要ないじゃんって場合どうすればいい。 もしかして、超もしかしてだけど、class定義はじまってすぐ宣言しているのはクラス内でしか使えないprivateな変数なのか? つまりインスタント変数としても解釈されていない、よってattr_readerは無効ということ? なんでinitializeに突然@thread_nameって書けばインスタント変数として定義されたことになるのかな
だからsageろ、話はそれからだ
531 :
デフォルトの名無しさん :2007/07/31(火) 00:16:38
bc.reload
>>523 のラス
あと、質問に直接関係ないところで一つ悪い点がある
クラス定義内(attr_readerの前)で直接インスタンス変数を宣言しようとしてるよな?
そこに書いても宣言にはならない。ちゃんとinitializeで初期化すべき
が何のことが理解できない。
なぜか、@thread_numberは何もいれていないのでnilになってしまっているが一応宣言はされているし、その後にattr_readerでゲッタ作ってるから
外部で読めている。宣言は出来ていると思う。
とりあえず動かして欲しい。実はおれまじで感動している。
532 :
デフォルトの名無しさん :2007/07/31(火) 00:18:08
あとOOP的に考えてこのプログラムは美しいですか? それが一番の焦点です、おれは科学には美しさを求めます。
そろそろうざいぞ夏厨 思い上がるな 用語は正しく使え。あとマニュアルあるいはリファレンス、解説書は必ず読め。いちいち人に聞こうとするな。 これからぶつかる数百の疑問をすべてこのスレにぶつける気か。 Rubyの前に何を知っていたのか知らないしどれだけ自信があったのかも知らないが(傲慢が透けて見えるぞ)、きちんとRubyを勉強しろ。 で、未定義のインスタンス変数は実際に @array = ナントカ と書かれた行が実行された瞬間にいきなり定義される。 initialize は new されるときに必ず読み込まれるという以上の特別な意味はない。 他の特定の言語のように「変数を定義するメソッド」でもなんでもないし、 「変数をここで定義しないとクラスの中で使えない」ということもない。
Cを学校でやった程度。 まともに取り組んでるのはRubyがはじめて。 どこの用語が間違っていますか?
ちょっとしつもん。ReFe の deb パッケージ公開してる人っていない? sudo setup.rb install しなくても一般ユーザーで使える方法でもいいんだけれど。
横レスだが
>>534 「科学」「美しさ」「求めます」その他、かな?
へ?何のことだかさっぱり。 とりあえずひと段落したので寝ます。
>>535 setup.rb の configure 時に --prefix=$HOME/refe とかつけとけば、一般ユーザでも install できる。
算数しかやってない小学生が「オイラーの公式って美しいよねー」 なんてまじめな顔で嘯いていたってちゃんちゃらおかしいってことだよな。 見ているこっちが恥ずかしくなる類の奴。
>>546 見事に釣られたなw ていうかうぜぇ!!!!(546ではなく)
542 :
540 :2007/07/31(火) 00:54:09
(
>>540 ).gsub!(/546/, '536') したいが
>>546 が釣られるのは止めない。
>>538 > ruby -I ~refe/local/lib/site_ruby/1.8 ~/refe/bin/refe String#index
String#index
--- index(pattern[, pos])
部分文字列の探索を左端から右端に向かって行います。見つかった部分文
おー動いたよ
せんきゅー
うは、OPP外れて全改正された。オワタ require "open-uri" で読み込んだら文字化けやばすぎて泣きそう。 日本語が表示されない・・・
langhelpが全然動かないよう そもそも「el4r のインストール時に el4r-rctool で .emacs を書き換えています」って意味わからんよバーカバーカ(逆切れ) mklanghelpというコマンドはインストールされてるがlanghelpというコマンドがどこにもインストールされてない っつーかこのel4rとかいうのがEmacs起動時に全然動いてない気がする 自動化夢見て変なことせんでいいからユーザーに導入の設定ファイル自力で書かせろよ あーめんどい 寝る
結構おれ的にはいい線いってると思うんだけどなぁ、OOP的に考えて美しいし。 ひとつひとつのクラスがクラスとして意味を持ってる。 車のハンドル、タイヤ、エンジン、アクセルといった具合に アクセルを踏むとエンジンがかかってタイヤが回る、そのタイヤをハンドルで切って曲がる。 OOPはもの作りの精神を持っている。工学部なおれとしてはまさにこれこそUtopia Matzは天才
>>546 RDindexだっけ、Rubyだけならあっちのほうがいいような気がする
投げやりに説明しよう!
件のるびまの記事では、なんとEmacsでlanghelpを使うためのel4rのインストールという段階がすっぽり抜けているのだ!
きっとみんな当たり前のように入ってるから気づかなかったんだね!
記事検証用にアカウントを新規に作ってインストール手順再現なんて面倒だし仕方ないよね!
ttp://jp.rubyist.net/magazine/?0017-langhelp んで、el4rをインストールしたら
el4r-rctool -p
el4r-rctool -i
して.el4rディレクトリを作って.emacsの末尾にel4r用の設定を追加させないと使えないから注意だよ!
あと!
・ 毎回起動時に*Compile-Log*に何やらコンパイルログが表示される
・ 毎回終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
のは俺の環境的には仕様なので誰か一発で助けてくれると嬉しい!
550 :
デフォルトの名無しさん :2007/07/31(火) 06:17:38
↓のself.fooと定義するのとmodule_functionで定義するのって違う? module Hoge def self.foo end def foo end module_function :foo end
おなじー
早朝レスありがとうございます 同じことやるのに複数の書き方があると本当に同じか迷っちゃいますね do endと{ }は同じと思ってたら微妙に違うし
結合度が違うんだよなぁ do-end派の俺は何度かハマった
>>550 module_functionだと、プライベートメソッドとしても定義される
マニュアル見れ
まぁ普通に使うならあんま差は無いけど
おはよ、がんばろっ!
>>552 意見は分かる。
ただブロックの書き方は文法だけど、module_functionは単にそういうメソッドってだけだから、同じに語るのは?ってなる。
>同じに語るのは○○だからおかしい の○○を埋めよ
>>549 > 終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
そういうのになる人もいるん? langhelp面白そうだなと思ってたんだけどちょっと躊躇
自作メソッドの説明をRDあるいは#のコメントで書いておきたいんだけど # ここつまり定義前にメソッドの説明 # あるいは使い方・引数解説 def method_1(arg) : と def method_1(arg) # ここつまりdef直後にメソッドの説明 # あるいは使い方・引数解説 : のどっちに習慣づけるのが無難?
>>559 前者でいいんじゃないか?
RDoc的に。
>>549 > ・ 毎回起動時に*Compile-Log*に何やらコンパイルログが表示される
どんな? 先にbyte-compileしといてもダメ?
> ・ 毎回終了時に/usr/bin/el4r-instanceのプロセスが生きてると警告される
kill-emacs-hookかkill-buffer-hookでプロセスを止めればいいんジャマイカ。
el4r-instanceをみてないんで確実じゃないが、終了すれば一緒に終わりそうな
気もするけど。
562 :
デフォルトの名無しさん :2007/08/01(水) 03:30:32
>>561 el4r-instance のトップレベルの実行フェーズに
finalizer = lambda {
……
exit 0
}
trap(:TERM, &finalizer)
という記述があるので TERM シグナル送れば止まるように見える
でも kill-emacs-hook に頼るって微妙にカッコ悪いな
>>564 > ** reference to free variable ee-anchor-format
lib/el4r/emacsruby/langhelp.rbのdefun_langhelp_menu_modeで
defvar(:ee_anchor_format, "<<%s>>") と定義済みのように見えるがなぁ。
> ** assignment to free variable imenu--index-alist
こっちは同じあたりに el_require :imenu を加えればいいかも。
> *Messages*でloadされてたもののうち /usr/share/emacs/site-lisp/ruby1.8-elisp/inf-ruby.el が
> バイトコンパイルされてなかったからバイトコンパイルしてみたけど変化なし
これは関係ないな。
langhelpはどうも固定のemacs-lispをロードするんじゃなくて、
実行時にruby scriptから初期化するっぽい。
プロセスのほうはel4r.elに
(add-hook 'kill-emacs-hook 'el4r-shutdown)
567 :
デフォルトの名無しさん :2007/08/01(水) 13:50:40
すみません。 某参考書のサンプルコードを実行していて疑問に思ったのですが、 あるメソッドで def swap(other) xtmp = @x ytmp = @y @x = other.x @y = other.y other.x = xtmp other.y = ytmp # self end というのがあります。 ここでselfというのはどのような役割をしているのでしょうか? 上記のようにコメントアウトしても結果に変化はありませんでした。
>>567 メソッドの最後に評価された文の値がメソッドの戻り値になる。
つまりそれは return self と書いてあったのと同じこと。
通常のメソッド定義でreturn抜きの記述を使うのはあまりよい慣習ではないな
初心者卒業したら、rubyでは必要ないのにreturn書くのは少数派だとわかってきますよ
>>566 > ユニコードに続いてyieldでもRubyは孤立?
Ruby typeのyieldは構文を拡張しないと無理だからな。
rubyのreturnはgoto並に気を使うなあ
574 :
567 :2007/08/01(水) 15:53:52
なるほど。 みなさんレスありがとうございました。
>>570 returnは2つの動作というか副作用というかそういうのがあるのがよろしくないな
「メソッドの返り値を明示的に設定するだけ」というニッチな文法があればよかったのに
return書いたらメソッド定義の途中でもいきなり帰っちゃうのが嫌
かと言って
if …
output = hoge
else
output = moge
outout = hage if var_is_true?
end
return output
とかいちいち一時変数使って出口一個にするのに気を遣うのもそれはそれで嫌
>>575 確かVBが戻り値の指定と実際の脱出を分離していたような気がするな。
戻り値の指定は関数と同じ名前の変数に入れとくんじゃなかったっけ
IOについての質問です。 [text.txt] a b c d [fileop.rb] file = open("text.txt") while text = file.gets do !text.chomp! puts text end end file.close while中のtextを配列とみなして puts text[1] のようにすれば b d のように出力されるかなと思ったのですが 32 32 と数値が出力されてしまいました。 test.txtの二列目のみ取得して出力するにはどうすればよいのでしょうか?
配列とみなすとかそういう曖昧な処理はできん 「配列である」か「配列ではない」のどっちかだ ということで配列として処理したいなら配列に変換しれ
つうか、色々と道のりが遠そうな書き方だな。
もし Ruby が最初に学んでるプログラム言語なのなら、今使ってる参考書を投げ捨てろ。
そいつは既存の言語を念頭においてて、完全初心者に対しては独り善がりで膿しか出さねー。
で、とりあえずこれは文法エラーで動かないので投稿時には実際のプログラムをコピペしたほうがよい。
適当に再現するぞ。
file = open("text.txt")
while text = file.gets do
text.chomp!
puts text
end
file.close
で、答は
>>579 だな。
puts text ではなく p text とすると text が何のオブジェクトであるかが視覚的に反映されるので製作時に超便利。
"a b"
と " " で括られて表示されたらそれは文字列で、
["a", "b"]
と [ ] で括られて表示されたらそれは配列。表示する前に text を配列にすればよい。
ありがとうございました。 配列への変換方法を調べてみます。
>>576 Delphiもそう
確か関数の抜けた時点で result って変数に入ってる値が戻り値になる
そんなワケで Ruby でも
最後に return result なコードを何度か書いてる俺
でも一方で return は便利だと思う俺
最近は出口沢山書く方が好きだ
1000行くらい詰まってるファイルを整形処理する時に、 Perlとrubyで同じように組んでPerlでは通ったのですが rubyではワーニングが出ました。 $ ./seikei.pl logfile.log | head -5 0.000000000000000 0.4205064161690913 2.5132741228718340E-002 0.1944036417009673 5.0265482457436681E-002 0.1409928514422889 7.5398223686155035E-002 0.1356904102940938 0.1005309649148734 0.1332408284845677 $ ./seikei.rb logfile.log | head -5 0.000000000000000 0.4205064161690913 2.5132741228718340E-002 0.1944036417009673 5.0265482457436681E-002 0.1409928514422889 7.5398223686155035E-002 0.1356904102940938 0.1005309649148734 0.1332408284845677 ./seikei.rb:11:in `write': Broken pipe (Errno::EPIPE) from ./seikei.rb:11:in `puts' from ./seikei.rb:11 ファイルの行数が50行くらいなら問題なく両方とも実行できました。 これはrubyとperlのメモリの使い方の差か何かでしょうか?
すみません、1000行ではなく10000行です。 あと、headで削らずに10000行すべて書き出した場合は ワーニングはでませんでした。
で、要はあなたの家に直接行って画面見てプログラムに何が書いてあるか調べればいいのね
586 :
デフォルトの名無しさん :2007/08/01(水) 22:08:11
ソースコードはこうなってます。 Perl ----------------------------------- while ($_ = <>){ s/^\s+//g; if(/^[^#]/){ print $_; } } ----------------------------------- Ruby ----------------------------------- while line = file.gets do line.chomp! cutspace = line.sub(/\s+/,'') if /^[^#]/ =~ cutspace then puts cutspace end end file.close -----------------------------------
そのheadは5行貰ったら終了するからbroken pipeが発生するのは あたりまえで、Perlがbroken pipeを無視してるとか?
という事は、rubyのオプションか何かで警告のレベルを 低くすれば出ないってことですかね? とりあえず、標準出力は正常(?)に取れてますから問題はないと思うのですが…
そもそも file.gets の file って何よ
ARGFから読むとうまくいったり?
fileはopenfileで、開くファイルの名前が入ってる変数が代入されてるものです
while line = ARGF.gets do line.chomp! cutspace = line.sub(/\s+/,'') if /^[^#]/ =~ cutspace then puts cutspace end end 0.000000000000000 0.4205064161690913 2.5132741228718340E-002 0.1944036417009673 5.0265482457436681E-002 0.1409928514422889 7.5398223686155035E-002 0.1356904102940938 0.1005309649148734 0.1332408284845677 ./seikei.rb:12:in `write': Broken pipe (Errno::EPIPE) from ./seikei.rb:12:in `puts' from ./seikei.rb:12 やっぱり出ちゃいますね…
こういうローカルではEPIPEはデフォで無視して欲しいんだがなあ
file = ARGF begin while line = file.gets do line.chomp! cutspace = line.sub(/\s+/,'') if /^[^#]/ =~ cutspace then puts cutspace end end file.close rescue Errno::EPIPE false end エラー消すためだけに小手先弄くったって感じがして気分悪いな
まあそりゃそうだろうな rescueの位置があまりよくない気もするが
>>595 Rubyはエラーじゃなくて例外だから大丈夫
イベントやメッセージがガンガン飛んでくると考えれば捕まえるのは全く問題ないむしろ推奨
599 :
デフォルトの名無しさん :2007/08/01(水) 23:57:19
確かに、エラーじゃなくて例外なげてるだけか。
600 :
デフォルトの名無しさん :2007/08/02(木) 01:12:09
ruby初心者だけど。とりあえず、ruby使いたくなるようなソースコードを 100行以内で書いてくれ。
少しはRubyをいじってみた? あなたの直感が何も告げないのならば、他の言語を学ぶべきです
600はRubyをなかなか習得できず楽する方法を探しているヘタレか、釣りかのどちらかだな
メール欄空白だから釣り認定 プログラミングが楽しくなることが多いというのが一応公称のウリではあるが 別に苦行を経てまで習得するような言語でもないよな ピンと来ないなら無理してまでRubyに切り替える必要はない ちなみに苦行と思っても仕方なく習得するのはC
604 :
デフォルトの名無しさん :2007/08/02(木) 02:01:48
ニュー速からきますた
プログラム作成が"誰にでもできる"ようになる時代はおそらく来ない 理解できる人間が優れているとは言わないが、ギターをまともに弾けるとかそういう特別な能力の類であることは確か そういうプログラミング認識能力を持ってない人はいくら勉強してもうまく作れない 俗に言うポインタが理解できない現象と同じ 学習・習得という点でRubyという言語に何か特別な力があるわけじゃない
どっちかと言うと他の色々な言語を触ったことのある人間が 「ほほう、上手いこと良いトコ取りしたじゃないか」 と思う言語だよな Ruby って …でも詳しくやってくと所々綻びが見えて ちょっとがっかりする言語でもある
どちらかと言えばプログラミング初心者よりも経験者が 「おおっ、上手く良いトコ取りしてる」 と思う言語だよな まあ、詳しくやってくと綻びが見えて 「まあそんなもんか」 とちょっとガッカリする言語でもあるんだが
綻びってどんな?
言語仕様よりも、実装・ドキュメント・コミュニティの「綻び」のほうが大きい。
nilの特別扱いとか
612 :
デフォルトの名無しさん :2007/08/02(木) 07:33:57
そうかな? C#とか、Delphiとかやってた身にしてみれば、 うまくまとめたなーって感じに見えるけど・・・ Lisperとか、MLerの意見聞いてみたい
613 :
デフォルトの名無しさん :2007/08/02(木) 07:34:55
て、ここ初心者質問スレじゃねーか。 本スレいこうよ・・・
nilとnon-nilの二元論に落とし込めるべきべきであった …falseが欲しいってのもよくわかるんだけどね
nilとfalseは、意味がまったく異なるのだからあってしかるべき。 falseがいらないって言うならtrueがあるのも不自然なわけで、 そうすると真偽を表現するのに結局は整数の0か1かになっちまうよ。 と、ここまで書いてtrue/falseが存在するのは思想として 人間側をとるのか、電算機側をとるのかということに思い至った。
Rubyにはbooleanという概念がないからnilとnonnilだけでいい 「nilとfalseが偽です」は「空文字列とundefと0が偽です」並にカッコ悪い
falseがnilのエイリアスだったらいいのかな?
>>617 たぶんそっちのほうがすっきりする
(いまさら動かしようがないけどな)
ただ条件分岐の中身は「nilかどうか」で分岐することになるから見た目が多少アレに
「こんなんならLisp使えLisp」という声が今よりも強くなること必至
>>616 よって「booleanを返します」「真偽値を返します」と書いてあるメソッド解説は糞
「偽を返します」としか書かれてない解説も糞(作者によってfalseとnilが半々な印象)
…なんだ結構あるな
誰か書き直そうぜ
どーでもいいですよ
nil: 値は存在しない false: 値は存在する TrueClassとFalseClassのスーパークラスとしてBooleanを用意すればよかったの?
>>619 誰かが書いたあとで、それに対して貴重な時間を割いて上から目線で嫌みったらしく
コメントする準備は、全員整ってるんだけどね。
まぁ、そのあたりがRubyコミュのクオリティ。
そういやBooleanClassが無いよな。 なんでだろ まぁDBでのnull値の扱いよりはましだな。
BooleanClassがない理由は [ruby-list:40863] にある。 説明になってないが。
わかりやすい
>>624 驚きの新事実!!!
と言うか、2年前の話を蒸し返していたわけですな
↓ 何事も無かったかのように質問をどうぞ
蒸し返していたというか誰もが疑問に思うことであることの証
>>594 パイプの先がなくなっても終了しなくなっちゃうだろうが。
629 :
デフォルトの名無しさん :2007/08/03(金) 19:51:43
CSVファイルをパースしようとして以下のようにしたのですがうまくいきません。 配列にならずに、文字列のままで表示されてしまいます。 書き方が間違ってますでしょうか? CSV.parse(filename, 'r') do |line| p like.to_a end
630 :
デフォルトの名無しさん :2007/08/03(金) 20:00:39
629です。 すいません、実際には、 p like.to_a ではなくて、p line.to_a となってます。 どうかよろしくお願いします。
それだと区切り文字が r になってる CSV.parse(filename){} CSV.open(filename, 'r'){}
632 :
デフォルトの名無しさん :2007/08/03(金) 20:11:45
>>631 ありがとうございます。
なるほど、open(filename)じゃなくて、open(filename, 'r')と書けと
メッセージが出ていたのをちゃんとみてなくて、
parse(filename, 'r')としてしまったようです。
ありがとうございました。助かりました。
いやマニュアルきちんと見ろよ …ってマニュアルねーじゃねーか
634 :
デフォルトの名無しさん :2007/08/03(金) 20:20:11
632です。 ある名前の配列が存在するかどうかを調べる方法は あるでしょうか? やりたいことは、配列の名前をダイナミックに生成して、 存在すればなにもせず、存在しなければ配列を新規作成、 という処理です。 質問ばかりですいません。
637 :
デフォルトの名無しさん :2007/08/03(金) 21:46:54
わかりました。マニュアル読みます。 ところで、どの辺読めばいいでしょうか? いちおう手元のRubyレシピブックという本は見たのですが、 わかりませんでした。
クラスやメソッドの問題ではないな 設計の問題だと思う 生成した配列を全部入れておく配列とかハッシュとかそういうのを作ることになるはず もしハッシュで key => [a,b,c] という格納をしたのなら、特定のkeyがあるかどうか探す方法は Hashのhで始まるあたりに書いてあったりなかったりする
>>636 好ましい、かどうかは俺には判断つかんな。
ruby-lang.orgはまあ公式ドメインだが、elbereth-hp.hp.infoseek.co.jpを
2chで素直に開きたいかどうかは人に依るんじゃないか?
(
>>636 のリンク先が怪しい、と言ってるわけではない)
文句なく好ましいのは、
>>635 のリファレンスが普通に機能するか、せめて
ダウンロード版へのURLは動く形で置いておいてくれることだろうが。
Rubyアソシエーションが出来て、この辺りも改善されるのかな?
>>639 中の人が同じなのに、やること、できることが変わるわけない。
>>634 Hashをつかえばいいんじゃないかな。
table = {}
while line = gets()
arr = line.split
key = arr[0]
table[key] = [] unless table[key] # 存在すればなにもせず、存在しなければ配列を新規作成
end
なお
table[key] = [] unless table[key]
は
table[key] ||= []
とも書けるけど難しかったら無視して。
require "fileutils" dir = Dir.open("/home/akira/ruby/") dir.each do |d| d.each do |f| File.rename(f, f.downcase) end end dir.close renameのところでエラーが出ます。 test.rb:6:in `rename': Device or resource busy - . or . (Errno::EBUSY) とのことですが、どういう事か分かりません。 renameの使いかたが良くないのでしょうか?
聞く前に自力でデバッグしようぜ いちいち聞いてたらまた聞かんといかんぜよ 実際にどんなファイルがリネームされてるかputsで逐一表示させるとかさー
>>641 Perlの人?
ハッシュ table に key 名義で nil が登録されてるとそれ誤動作するぞ
{'No3433' => nil} みたいなデータ構造
ハッシュに key が含まれてるかどうかは Hash#has_key?(key) で調べないとだめだよ
きちんと書くクセつけとかないと近い将来これでバグるぞ
>>642 >>643 の言う通り f を表示してみれば…わかるかな、これ
ディレクトリには . と .. が含まれていて単純にeachで枚挙するとそれも引っかかるって話なんだけど
なる。一度pしてやっているので分かります。 .や..を除けばいいんですね。 ところで dir = Dir.open() p dir.readとしても"."しか表示されません。 なぜでしょう。なんとなく分かるような分からないような・・・詳しい説明が欲しいです。
>>645 その前にあなたの実行環境やそのスクリプトが対象にしているディレクトリの情報や
年齢・性別・職歴や趣味・血液型・星座などなどがわかれば誰か説明してくれる
かもしれない。
多分、直接的な詳しい説明はリファレンスの Dir とか Dir#readとかに乗ってると
思う。
>>645 > (Dir#)read
> ディレクトリストリームから次の要素を読み出して返します。最後の要素まで
> 読み出していれば nil を返します。
手元のリファレンスではこうなってる。これで私は納得できるんですが。
なる。
p dir.readを2連発したら解決しますた。
つまりdir.readってio.getsみたいなもんなんですね。
おれてっきりDirクラスてIOのサブクラスだと思ってた。
>>646 ruby 1.8.5 (2006-08-25) [i386-linux]
23 M Student Squat B Gemini
require "fileutils" dir = Dir.open(".") dir.each do |d| d.each do |f| if f!=".." && f!="." File.rename(f, f.upcase) end end end renameするプログラム完成!
>>636 まあ別に503が出てても鯖が飛んでるわけでもないけどね。
アクセスを制限してるだけらしいし
>>644 >ハッシュ table に key 名義で nil が登録されてるとそれ誤動作するぞ
>{'No3433' => nil} みたいなデータ構造
>
>ハッシュに key が含まれてるかどうかは Hash#has_key?(key) で調べないとだめだよ
>きちんと書くクセつけとかないと近い将来これでバグるぞ
逆だろ。{'No3433'=>nil}だったらhash.has_key?(key)はtrueでhas[key]はnilなんだから
hash[key] = [] unless hash.has_key?(key)
だとおまえのいう {'No3433'=>nil} のときに [] が代入されないbugになる。
hash[key] = [] unless has[key]
が正解。
まあ質問者がどっちの仕様を望んでいるのか知らんが。
HTTP のプロクシを作りたいんですが、Webrick をつかうと、 ファイルを全部落とし終わるまで応答がなくなってしまうので、 回線が細いとちょっと悲しいです。 ぶっちゃけ、proxyを介するとyoutubeの動画が待てども待てども 出てこないのをどうにかしたいんですけど、うまい方法はないでしょうか。
うへ、Ruby1.9には配列からランダムに要素を返す Array#choice なんてのがあるのか なんという無駄でおバカ機能
せめてchooseだよな、という話ではないな。
>>652 おお、同士よ。
俺はyoutube.comの時はproxyを通すの諦めたw
RubyとREXMLを用いてXMLをパースし、特定のIDと同階層のノードをDBに保存するプログラムを作成しています。 特定のIDをマッチングさせることはできたのですが、このIDと同階層のノードを保存する方法がわかりません。。 ※check_idsは保存したいIDの配列です。例えば12345がマッチした場合、taro、あいうえおを抽出したいです。 --- def parse__xml(source) doc = REXML::Document.new source doc.elements.each("aaa/bbb/id") do |e| if check_ids.member?(e.text) #ここがわかりません。。。 end end end --- <aaa> <bbb> <id>12345</id> <user>taro</user> <text>あいうえお</text> </bbb> <bbb> <id>67890</id> <user>hanako</user> <text>かきくけこ</text> </bbb> </aaa>
irbってどんな時に使うのがいいですかね?
>>657 どんな時に使えばいいのかではなく、
使いたいと思った時に使うのだ。
君が使いたいと思わなかったら、使う必要はない。
あんまり便利じゃないなぁって思っただけです。 ところでemacsでコーディングしてktermに戻る時はどうすればいいですか? マウスでいちいちクリックしてカーソルを移すのはめんどい。
>>657 このスレでえらそーに講釈垂れるときに使う
最初は使い道さっぱりわからんと思うんでしばらく放置してよし
>>659 4つほど方法を思いついたが環境依存だしRuby関係ないから他の板で聞け
>>656 あんまりいい解法じゃないかもしれないけど、
doc.elements.each("aaa/bbb/id") do |id|
puts id.parent.elements['user'].text
puts id.parent.elements['text'].text
puts id.next_element.text
puts id.next_element.next_element.text
end
doc.elements.each('aaa/bbb[id]') do |bbb|
puts bbb.elements['user'].text
puts bbb.elements['text'].text
end
>>656 def parse__xml(source)
doc = REXML::Document.new source
check_ids = {'12345' => true}
doc.elements.each("aaa/bbb") do |e|
if check_ids.include? e.get_text('id').value
puts e.get_text('user').value
puts e.get_text('text').value
end
end
end
文字コードは適切に処理して下さい。
>>663 ありがとうございます!!
助かりました。
>>664 お二人も応えていただけて感激です!
ありがとうございました!
>>661 調べたら
emacs &
ctrl+z
でシェルに戻ってこれるのですが、emacsに戻るやりかたが分かりません。
jobsというコマンドをすると
[1]+ Running emacs test.rb &
とでてきますが・・・
bg 1としても
bash: bg: bg background job?
といわれます。
えふじい
Ruby関係ないから他の板で聞け
>>668 fg 1としたら端末上でemacsが始まりました。
おれは
emacs &とした時に別枠で起動しますよね。
ここにカーソルを移動させたいんです。
具体的な方法を教えてくれませんか。
>>669 関係あると思います。プログラマはふつうに比べてlinuxユーザが多いし、コーディングの効率をあげるために必要な知識です。
失せろカス
>>670 じゃあもっと関係の深い板なりスレできけばいいんじゃないかな。
きみの考えだとRuby on RailsのことをMac板で聞いてもいいことになるし
プログラムのことを独身男のあつまるとこで聞いてもよいことになる。
無視すればいいのにお前ら優しすぎるぞ・・・。
>>659 の時点でそれを思いついていたなら褒めてあげる
>>670 を見て思いついたならアドバイスとしては最低、というか
>>670 にまで行ったからこそスレとしてコンセンサスが取れるんじゃないの
流れがあった上なら、多少スレ違いでも(個人的には)OKだと思うけど いきなりemacsが分かりませんlinuxの操作が分かりませんとか言われてもな
お願いです。必死なんです、教えてください!
GTK+の質問はここでいいですか?
Ruby/gtkは使ってる人少ない(というかRubyでGUI併用してる人自体が少ない)からあまり期待しないで 込み入ってるなら最初からメーリングリストとかに投げたほうがまだ回答率上がるかも
>>677 せめて使ってるwindow managerの種類を書け
>>680 gnomeです。見たらKtermじゃなくてgnome端末とかいうやつですね。
xfceに移ったらKtermだと思います。どちらでもイケます。
お願いです、教えてください。
いくつか挙げてもらえればすべて試します。
GNOME はウィンドウマネージャではない metacity のつもりなのかな
$ setwm Usage: setwm <option> option: status gnome xfce $ setwm status Current Window Mangager is gnome-session だそうです。
板違い
何だこの痛い奴は・・・
つーか、ふつーMx-shellつかわね?
>>665-666 こらー、なにがしのほうにもお礼入れとけ
しかもあっちのほうが質問時刻先じゃねーか
質問。 ファイルシステムごとに「ファイル名に絶対使えない文字」ってありますよね。 「ファイルシステムを検知して、ファイル名として使えない文字が含まれていたら規定の文字で適当に置換する」 ような便利メソッドってありませんか? ダウンローダーの部分を作ってるんですが、 File.open( File.basename(URI.path), 'w') と書いた時点でちょっと困りました。 たとえば URL に ? が含まれてたりする場合、Windows で実行したら open 時に Errno::EINVAL が出ます。 …パターン全部調べて gsub で事前に置換すればいいんですが、これ困ってる人いるだろうし既存のメソッドでもないかなーと。
timemillisecondで名前書き換えてる漏れは勝ち組
>>690 たとえば、
* Linuxではext2じゃ/以外なんでも使えるけどvfatやntfsではWindows同様な制限があるとか
* ネットワークファイルシステムではローカルシステムとは無関係にリモートでの制限があるとか
* Windowsだと通常は\は使えないけどmultibyteの2byte目以降には使えるとか
いろいろとややこしい事情が絡んでくる。
ダウンローダーなら tr("^A-Za-z0-9-_.", "_") でもしとけ。
wgetのソースとか参考になりそうな気がする 俺は読む気ないけど
Rubyスクリプトに引数を与えると、ARGVに適度に配列として格納されます。 任意のStringに対して、同じような処理をさせることはできません? メソッドの引数をコマンドライン風に指定したいんですが。 そんな変なことするなとか苦労して正規表現書けという指摘はごもっともですが。 def method('-a 'AAA' -b -c --long "1 2 3 4" -e') #=> ['-a', 'AAA', '-b', '-c', '--long', '1 2 3 4', '-e'] こんな感じ。スペースを含んだ "1 2 3 4" のあたりで正規表現書くの眠くなりました。
すみません、ファイルを作らずにメモリだけで、データベースみたいに、インデックスを 複数設定できる手軽な方法って有りますでしょうか? 基本的には、受注・受注明細・商品マスタに正規化された各csvを読み込んで、 一つの正規化されてない受注データ.csvに合成して出力する必要があるのですが、 欲が出て別のことをしたくなると、読み込んだ受注データ等の項目に複数のインデックスを かけたいと思います。 しかしcsv読んでcsv出力するだけの事で中間でデータベースファイルを生成するのも 大げさな感じがするし、かといって毎回ソートや全件検索するのも無駄な感じがします。 なにか簡単な方法は有りませんでしょうか?もしくは食わず嫌いやめてMySQLとか 導入して勉強した方が早道なんでしょうか? rubyはwin32版のVer1.8.5を入れてます。 習熟度は上記csvの為に久しぶりに初心者本を最初から再読してる所です。 よろしくお願いします。
オンメモリに乗り切るならHashでいいじゃん
>>697 sqlite の in memory database とかはどうよ。
URLどころか名前すら出ない256レシピブックカワイソス ウサギ本の原書読めるなら日本の本無理して買わんでもいいだろ
うさぎ本っていうんですか?これ。 256レシピブックちょっと読んだけど結構タメになることが書いてあったようで迷っています。 うさぎ本の内容はすごいですか?
サーバからファイル持ってくる際、301リダイレクトに対応しようとして def main begin wget rescue Net::ProtoRetriableError @uri = URI.parse(@response['Location']) retry end puts @response end def wget @response = Net::HTTP.get_response(@uri) raise Net::ProtoRetriableError if Net::HTTPRedirection === @response end のようなことをしてます。 よく見るとクラス変数がメソッド間の値の運搬役にしかなってなくて悲しいですがとりあえずそれはそれで。 301を検知してretryしたいんですが、上記のように明示的に例外起こさせるのは寂しいです。いい手ありませんか?
705 :
デフォルトの名無しさん :2007/08/07(火) 03:01:15
706 :
デフォルトの名無しさん :2007/08/07(火) 03:02:04
>>704 open-uriがリダイレクト対応してたから、それ見た方が早いかも
>>706 がーん。
せっかくとりあえずnet/httpで動くのできたのに(w
open-uriは前から気になるし頑張って作り変えてみるー。
昔にnet/httpでできた何かができなくてそれで嫌な印象が残ってる。
709 :
697 :2007/08/07(火) 08:05:47
読むだけでプログラムが書けるようになる本ありますか?
Array で 「===」で 比較して引き算させることはできますか? 1.8からは比較に Object#eql? が使われて結果が変わってしまいます。 掲示板のデータとして2chのdatのようなものがあるとして、1レスがハッシュになっててそれがさらに配列になってるとします。 dat = [{'name'=>'名無しさん', 'date'=>'○月×日' 'res'=>'こんにちは'}, {'name'=>'名無しさん', 'date'=>'○月△日' 'res'=>'うっせーバカ'}, ...] で、既存のデータと新着のデータの配列同士の差分をさくっととれたら超便利だと考えました。 新着レス = newdat - olddat しかし、 {'key'=>'value'} === {'key'=>'value'} #=> true {'key'=>'value'}.eql?({'key'=>'value'}) #=> false の違いのせいで、1.8では「いわゆる引き算」ができなくなりました。 olddat.each{|e| newdat.delete(e)} で置き換えても計算量的に問題ないですか?
- や & や % で計算できたからって効率いいとは限んないよね eachで素直にブン回したほうがリソースに優しいということは結構あると思うぞ
>>711 newdat[olddat.size, newdat.size - olddat.size]
ということではない?
いわゆるあぼーんや投稿者削除があった直後の取得で整合性揉めそうだな どれくらい必死…じゃない重要性のあるデータなのかにもよるか
僕らは卒業までの期間が決まってるんです。 趣味でやってる暇な社会人とは使える時間が違うんです
僕らはアニメ視聴やP2Pなんかで使える時間が限られてるんです。 趣味でやってる暇な社会人や学生とは違うんです。
社会人は3日でやれとか言われることもあるぞ 大した内容でもないのに、卒業までなんて 長いこと待ってもらっていいねえ
rubygemをインストールしたら Successfully built RubyGem Name: sources Version: 0.0.1 File: sources-0.0.1.gem hook /usr/local/rubygems-0.9.4/./post-install.rb failed: uninitialized constant Gem::FilePermissionError Try 'ruby setup.rb --help' for detailed usage. こんな風になりました。このエラーはどういうことでしょうか?
と、これはユーザ権限でやったからだと思って管理者になってやったら
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rdoc/rdoc (LoadError)
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from /usr/local/rubygems-0.9.4/./post-install.rb:103:in `install_rdoc'
from /usr/local/rubygems-0.9.4/./post-install.rb:118:in `run_hook'
from setup.rb:1526:in `exec_task_traverse'
from setup.rb:1342:in `exec_install'
from setup.rb:1000:in `exec_install'
from setup.rb:814:in `invoke'
from setup.rb:773:in `invoke'
from setup.rb:1578
こう言われたのでrdocをapt-getしてまたやったら
ttp://homepage.mac.com/kurusaki/iblog/C559147560/E20070722214148/index.html ここにあるような実行結果が得られました。
最後のがよくわかりませんがとりあえず正常っぽいです。自己解決かな・・?
ファイルをバイナリモードで開こうとしたら、BINARY定数が定義されていないようなのですが、何故でしょうか? Gentoo Linux, Ruby 1.8.5 irb(main):001:0> p File::Constants::BINARY NameError: uninitialized constant File::Constants::BINARY
UNIXだからじゃねーの。 バイナリモードとテキストモードの区別があるのはWindowsぐらいだし。
シンボリックリンクを作成する 例えば ln -s ../test.txt のようにrubyで行うにはどのようにすればよいのでしょうか? リネームや削除の方法は解説されていたのですが、シンボリックリンクの 作り方は参考書に載ってませんでした。
File.symlink
つーかもうちょい検索活用しような…
普通にマニュアル見るだけでいいかも
>>721 なるほど、必要ないから定義してないってことですか・・・。
環境によって有ったり無かったりするのを意識しなくてはならないと、プログラム組むのが
面倒だと思うのですが、こうなってる事の利点って有るのでしょうか?
定数は常に定義しておいて、メソッド内で環境に応じて定数の指定を無視するって方法もあると思うのですが。
>>727 Linux:
~$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
~$ ruby -e 'p File::Constants::BINARY'
-e:1: uninitialized constant File::Constants::BINARY (NameError)
Windows:
c:\俺>ruby -v
ruby 1.8.1 (2003-12-25) [i386-mswin32]
C:\俺>ruby -e 'p File::Constants::BINARY'
32768
ユーザーがこの定数を自力で設定することはまずない
いや、uninitialized になるくらいなら 0 で定義しておけば?ってことかと
defined? のようなもので分岐させてるのかな(Linuxはnilになる) このへんの処理はRubyスクリプトで書いてるかどうか怪しいが
731 :
727 :2007/08/07(火) 19:02:22
>>728-730 open()等のメソッド内で実行環境の違いを吸収して欲しいと思ったのだけど、そうなってないのは何か利点があるんでしょうか?
ってことです。
無駄にFile::Constants::BINARYが存在しても別に害は無いと思いますし。
"wb" を使うからなあ
思いっきり自動で吸収してるじゃん ユーザーが動作を切り替えることはないわけだし (動作の違いを念頭に入れなければならないことはあるが) 何が気になるのかわからん
エセWgetな感じのクラス作りました。中身はopen-uriなので、304や404だったらOpenURI::HTTPErrorを発生します。 def main(url) begin data = download_resource_from_server # 中身はopen-uri rescue OpenURI::HTTPError => ex puts "#{ex.message}: 取得不可なので終了します" end puts 'ファイルを保存します...' end Wget.main として単体で使うぶんにはいいんですが、他のクラスから使うときには ・そのクラスにHTTPErrorを知らせて欲しい ・Wgetの時点で「取得不可」と表示して欲しくない です。 def otherapp_main begin file = Wget.main(url) rescue OpenURI::HTTPError => ex puts '404なのでフォロー処理開始します' end puts 'fileで色々やります' end で、「フォロー処理」をさせたいんですが、どうするのが素直ですか?
>>734 download_resource_from_server(url)をもっと短くて呼びやすい
名前の公開メソッドにすればいいだけじゃぁ?
>>734 rescue OpenURI::HTTPError => ex
if __FILE__ == $0 then
# 単体で利用する場合の動作
puts "#{ex.message}: 取得不可なので終了します"
else
# requireされたときの動作
raise ex
end
end
これでなんとかならんかね。
そのWgetをどうやって単体利用してるかにもよるんだろうけど。
File.symlilnkの質問をした者です。 ファイルがすでに存在している場合はsymlinkを行わないという命令を unlessを利用して作りました。リンク先にファイルが存在している場合は 正常に分岐するのすが、誤って存在しないファイルにリンクを張った場合、 条件分岐がなされない事を確認しました。 File.symlink("./tmp/test.log", "test.log") unless File.file?("test.log") ←「test.log」は存在していない % ./test.rb ←空リンクが作成される % ./test.rb ./test.rb:23:in `symlink': File exists - ./tmp/test.log or test.log (Errno::EEXIST) from ./test.rb:23 ←unlessが無視されている 対処法として ・ファイルが存在しない場合はリンクを作成しない ・空リンクでもunlessが正常に動作する方法を考える という2パターンが今のところ考えられるのですが、どちらが初心者が学ぶのに楽ですか?
EEXISTキャッチしたらあかんの?
>>739 例外処理はこれから勉強しようと思っているのですが、
やはり例外処理を利用して対処するべきでしょうか?
file? で存在確認をするのがまずい。 exist?とかsymlink?とかlstatとかstatについて調べるいい機会ではなかろうか。
空リンクを作成しない方法は条件文に && を追記する事で回避できたのですが、 それだと条件が満たされずにリンクが成されてなかったという事が明示的に分からないですね…
>>738 > ./test.rb:23:in `symlink': File exists - ./tmp/test.log or test.log (Errno::EEXIST)
> from ./test.rb:23 ←unlessが無視されている
23行目ってことは、かなり省略されてるんだよな。
その省略された部分はどうなってる?
まあセキュアコーディング話なら、チェックした直後に ファイルがすり替わる話になるが
>>741 File.file?はlstatじゃなくてstatを使ってるはずなんだが。
>>743 text.rb全文です。
#!/usr/bin/ruby
# ARGV[0] = CPUS
#puts "OK" unless File.file?("test.log")
var="appule"
#puts var+"juice"
name="Ruby"
var2 = `echo Hello #{name}`
#p var2
#echo Hello
#if ( File.file?("test.log") == "true" ) then
# puts OK
#end
filename="test.log"
#File.delete(filename) if File.file?("test.log")
File.symlink("./tmp/test.log", filename) unless File.file?("test.log")
>>741 ありがとうございます。
調べてみますm(,,)m
今ふと思ったのですが、ファイルが存在していないという「例外」が
発生しているのだからやはり例外処理で処理するのが順当ではないかなと思いました。
>>741 さんのも含め例外処理の勉強します。
ありがとうございました。
>>697 >すみません、ファイルを作らずにメモリだけで、データベースみたいに、インデックスを
>複数設定できる手軽な方法って有りますでしょうか?
ファイルは必要になるけど、SQLiteやMySQLを導入するのはちょっと面倒、というなら、
テキストファイルベースのデータベースというのはどうでしょう。
MOONGIFT: 凄いテキストデータベース「txtSQL」
http://www.moongift.jp/2007/07/txtsql/ Rubyからつかえるかどうかまったく知らないけど。
本人食わず嫌いって言ってるし、普通にRDBMS使うと やめられなくなると思うけどなあ こういう用途ならSQLiteでいいし、って思ってtxtSQLを見てみたけど これ全部phpで書いてあるじゃん。Cならモジュールにできるけどこれは。
SQLite使うぐらいでちょっと面倒とかいうならプログラミングやめたほうがいい
752 :
デフォルトの名無しさん :2007/08/09(木) 09:37:06
みようみまねでRubyのプログラムを書いてみました。基本的な事が分かってないと思いますが、アドバイスいただけるとうれしいです。
Ruby/Tkを使ってドラッグアンドドロップできるプログラムを3つの方法で実現しようと考えました。
1. TclTkインタプリタを使う。
2. 外部Tclファイルを読み込む。
3. tkextlib/tkdnd を使う。
環境は、WinXP, ruby1.8.5 (ActiveTcl8.4.15, TkDND1.0a2jp
http://www.interq.or.jp/japan/s-imai/tcltk/download/tkdnd10a2jp.zip )です。
1.は、なんとかできました。
===== testdnd.rb =====
require 'tcltklib'
def dndt
ip1 = TclTkIp.new() # インタプリタ生成
ip1._eval('package require tkdnd')
ip1._eval('pack [text .t]')
ip1._eval('dnd bindtarget .t text/uri-list <Drop> {.t insert end "%D\n"}')
TclTkLib.mainloop
end
dnd
GC.start
======================
753 :
752 :2007/08/09(木) 09:37:53
2.は、undefined method `ff' for TkDnd:Class というエラーが出ます。 ===== testdnd.rb ===== require 'tk' class TkDnd < TkText def ff TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'testdnd.tcl') begin tk_call('::tkdnd::dnd') rescue NameError, RuntimeError Tk.load_tclscript(TkDnd::TCL_SCRIPT_PATH) tk_call('::tkdnd::dnd') end end end if __FILE__ == $0 tr1 = TkDnd.new.pack(:expand=>true, :fill=>:both) tr1.ff Tk.mainloop end ===== testdnd.tcl ===== package require tkdnd namespace eval ::tkdnd { proc ::tkdnd::dnd {} { pack [text .t] # Target側 dnd bindtarget .t text/uri-list <Drop> { .t insert end "%D\n" } } ======================
754 :
752 :2007/08/09(木) 09:39:07
755 :
752 :2007/08/09(木) 09:55:39
すみません、752の def dndt は、def dnd のまちがいです。
>>753 > 2.は、undefined method `ff' for TkDnd:Class というエラーが出ます。
それ以前に、
> def ff
> TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'testdnd.tcl')
ここで dynamic constant assignment でsyntax errorになるはずなんだが。
まずは正しいソースをはれ。
757 :
752 :2007/08/09(木) 16:05:48
>756 レスありがとうございます。確かに別のソースを貼り付けてました。失礼しました。 2.は以下のソースになります。testdnd.tcl は、753の通りです。よろしくお願いします。 >756 レスありがとうございます。確かに別のソースを貼り付けてました。失礼しました。2.は以下のソースになります。testdnd.tcl は、753の通りです。よろしくお願いします。 require 'tk' class TkDnd < TkText TCL_SCRIPT_PATH = File.join(File.dirname(__FILE__), 'mydnd.tcl') def ff begin tk_call('::tkdnd::dnd') rescue NameError, RuntimeError Tk.load_tclscript(TkDnd::TCL_SCRIPT_PATH) tk_call('::tkdnd::dnd') end end end if __FILE__ == $0 TkDnd.new.pack(:expand=>true, :fill=>:both) ff Tk.mainloop end
758 :
752 :2007/08/09(木) 16:10:52
エラーメッセージも間違えてました。 mydnd.rb:16: undefined local variable or method `ff' for main:Object (NameError) となります。失礼しました。
インデントがないと読みにくいな。 こうかな? TkDnd.new.pack(:expand=>true, :fill=>:both).ff
760 :
デフォルトの名無しさん :2007/08/09(木) 17:41:00
今現在PHPを勉強しています、平行してRubyを勉強するよりPHPを完璧にしたほうが良いでしょうか?
>>760 そんなもんおまいの職種によりますがな
趣味だったら言語の勉強自体が目的なんて、全く意味ない
762 :
760 :2007/08/09(木) 17:59:16
すいません、現在JAVAでシステム開発のPGをしています。
PHPとかRubyを何に使うつもりなんだこの人?
>>760 両方完璧にしなさい。
そうすりゃ文句はでない。
結局、趣味って事か? Cやったこと無いんじゃどんな感想になるかわからんが、 phpやりかけでrubyやったらphpは使わなくなる気がするな。
仕事で使います、あと4ヶ月くらいはPHPですが冬あたりからRubyも使うかもしれないとのことです。
純粋にRubyで一般の仕事のプロダクトを作る理由って今もまだないよな せいぜいベンチャーや小中規模Web屋さんがRoRを使うくらいか 意思決定までのどっかで誰かの趣味が入ってると思われる
初犯なんじゃね
Rubyは好きで使う言語であって、使えと言われて使うもんじゃない。 というわけでやめとけ。
いや、なんか
>>766 が少しうらやましいかも。
PHPやってからRubyも仕事で(勉強)出来るんなら結構な職場じゃないかと思った。
Linux上でMakefileの中にシェルスクリプトやawk/sed書いちゃうと Windows上でのコンパイル時に互換性で大変困る。 一番無難なのがRubyだと思う。配慮は必要だけど。
>>771 PerlとかPythonでもいいんじゃないかとかいやすみません。
Win32コンソールでもシフトJISの扱いでRubyが無難という感想。 セットアップ不要でアーカイブの解凍だけで動くし。
774 :
デフォルトの名無しさん :2007/08/10(金) 01:54:35
rakeは便利だよyy
Ruby使うとPerlは見るのもいやになるという欠点が、、、いやオレだけか
いや、わりと一般的な感覚と思われ 初心者や中級者くらいのフツーのプログラム書きにとっては、 普通に自習した程度でPerlやPHPの読み書きするよりはRubyやPythonのほうがきれいで好ましいと感じるはず 「いやPerlでも充分書きやすくできるしわかりやすく書けるよ」というひとは残念ながら少数派だろ プロダクト作れるに足るからPerlやPHPはもてはやされてるし、ツール作るのに便利だからRubyやPythonは廃れない
Winじゃどうせawkとsed使おうがPerlPythonRuby使おうが 全部デフォじゃ入ってないんだから Linux上で大体入ってる言語で書いた方がいいだろ Winのことまで考えるなら 色んなサイトに乱立し過ぎてどれ落とせば良いか判らんawkやsedより とりあえずActiveState池と言えば良いPerl辺りじゃね? どうも好きになれない言語だが そうだ、Tclで書こうか
ピッケル本にDir.foreachはnilクラスを返すと書いてあるのですが Stringクラスを返しているような気がします。どういうことでしょう。 あと、File.statですが、これは説明にFileの情報を返すとかいう風に書いてるのに ディレクトリを指定しても問題ないです。 例えば/usr/localなど、例えば File.stat('/usr/local').ftype => "directory" となります。DirはFileを継承してないはずだし、なぜディレクトリの場合もstatすることが可能なのでしょうか?
>>778 >ピッケル本にDir.foreachはnilクラスを返すと書いてあるのですが
>Stringクラスを返しているような気がします。どういうことでしょう。
クラスは返してないだろ、根本的に。
で、nilを返すと書いてあるはずなのだが、実際にnilを返している。
何をどう見てそう考えたんだ?
>あと、File.statですが、これは説明にFileの情報を返すとかいう風に書いてるのに
「ファイルの情報を返す」と「File*クラス*の情報を返す」じゃ全然意味が違うわけだが。
ここでは前者。
で、ディレクトリはファイルの一種なので、当然のようにディレクトリに対してもstatできる。
>>778 Dir.foreach('.') {}.class
=> NilClass
>>778 > Stringクラスを返しているような気がします
返り値と標準出力への出力をごっちゃにしないこと。
C:\Documents and Settings\hoge>irb
irb(main):001:0> Dir.foreach('.'){|e| puts e}
.
..
[snip]
デスクトップ
=> nil
irb(main):002:0> $stdout.write("hello\n")
hello
=> 6
もしくはこれで文字列が返るって言ってたりして Dir.foreach('.'){break '文字列'} #=> '文字列'
puts して確かめている可能性を指摘
そうですよ、pでやったら"lib"とか出ますし Dir.foreach('/usr/local') do |d| p d.class end とするとStringってでますし。
>>784 それのどこがDir.foreachの返してる値なのか説明してもらおうか。
Dir.foreachがブロックに渡しているので。
2点 退屈 もっとがんばれ
なんのこと?
>>784 そのdは返り値じゃない
ブロックパラメータだ
ではDirのインスタントメソッドeachの返り値がdirと書かれていますがどうしてですか? dir = Dir.new('/usr/local') dir.each do |d| p d.class end =>String String...
>>790 irb> ins = Dir.new('/usr/local')
=> #<Dir:0x402ee3e4>
irb> ret = ins.each do |d| p d.class end
String
String
String
String
String
String
String
String
String
String
=> #<Dir:0x402ee3e4>
irb> p ret
#<Dir:0x402ee3e4>
=> nil
irb> p ins === ret
true
=> nil
irb>
Dir クラスのインスタンスメソッド each はマニュアルにある通り self を返す
そして self つまり Dir クラスのインスタンスと全く同一のオブジェクトが返って来ている
何か問題が?
あーそもそもはクラスメソッド foreach の話だったのね irb(main):005:0> Dir.foreach('/usr/local'){|file| p file.class} String String String String String String String String String String => nil irb(main):006:0> ins.each do |d| p d.class end => #<Dir:0x402ee3e4> というわけで foreach の場合は nil 以外のなにものでもない値が返ってきてるんだが何か不満かい 返り値はメソッド作者の意図で return の引数あるいはメソッド内で一番最後に評価された値が返される メソッド利用者が決められるものではない ブロック内で何をしようが、メソッド作者の意図したものが返り値として選ばれる たまーに自分の行ったことが返り値として返ってくることがあるが、それはメソッド作者がそのようにわざわざ作ったからに過ぎない ピッケル本あたりは既に他のプログラミング言語修めてるような人向けの本だからそういうことについての説明はあまりないな
794 :
752 :2007/08/11(土) 01:25:26
>759 ありがとうございます。ただ、 TkDnd.new.pack(:expand=>true, :fill=>:both).ff だと、 c:/ruby185/lib/ruby/1.8/tk.rb:2272:in `__invoke': missing close-brace (RuntimeError) from c:/ruby185/lib/ruby/1.8/tk.rb:2272:in `_invoke' from c:/ruby185/lib/ruby/1.8/tk.rb:1696:in `_ip_invoke_core' from c:/ruby185/lib/ruby/1.8/tk.rb:1730:in `_tk_call_core' from c:/ruby185/lib/ruby/1.8/tk.rb:1754:in `tk_call' from c:/ruby185/lib/ruby/1.8/tk.rb:1925:in `load_tclscript' from mydnd.rb:10:in `ff' from mydnd.rb:17 というエラーが出ます。 よろしくお願いします。
>>759 じゃないけど、閉じカーリーブレース( } )が足り無いとかじゃない?
実行時エラーならevalあたりが怪しいけど。
( ↑これってなんていうんだっけ?
空行
おもいだしたパーレンだ
( パーレン { カーリー [ スクエア < アングル
< って書きたいけどやり方がわからなかったんだな・・・
< できるよF10押すだけ
>>802 日本語で言うところの
丸カッコとか
中カッコとかの
英語風の言い方。
>>800 半角の出し方わからないって
バカなんじゃない?
自分がバカだからって
他人もバカだとおもわないほうがいいよ
お前の名前と住所をちょっと
ここに書いてみな?
実際に出してる人間に「出し方わからないって」とは摩訶不思議。 知的障害なのでは。
ブラ と ケット だと思ってたんだが。
ディラック乙
● <|> プロダクト 人 ● ● . |><| プロジェクション 人 人
ブラとケットは <ψ|と|ψ>だったかな。
世の中みんな波だらけ あなたとわたしのシュレディンガー
私が見ている時だけあなたは存在する。
私を見てくれる人がいないので、自分で鏡見てます。
そしたらヲタがいましたorz
こっちは豚がいます 飛べないただの豚が
真珠よりもルビーだブヒー!!と今日も鳴くのであった
音頭大人気だな
「{」はカーリーっていうのか。 ブレースって読んでた。
英語だとcurly braceだけど、日本語では中カッコかおっぱいカッコだな
おっぱい括弧って・・・乳首しかないやん
な、なんてことを・・・。洗濯板とかそこまで言うかw
選択板はこれだろ →"|"
( 陥没ちk・・・・
jpegを読み込んでサイズを変更してから、 また保存ってことをやりたいんだけど、 サンプルコードとか無いでしょうか? jpegの読み込み&書き出しというところからわからない。。。
>>823 RMagick使えそうじゃない?調べてみては
for i in *jpg; do (サイズ変更処理) done
>825 は何の言語?
shスクリプト互換に見える
ヤフーなどのサイトから株価データを取り込んで データベースに貯めておき、 自分なりのテクニカル理論でデータ分析をして 売買サインを出させる、というような趣味システムを 作りたいと夢見ているのですが、機能的にRubyでできますかね? COBOLしか知らないので不安があります。
君はCOBOLで何を学んだんだ… 当たり前だがRubyだから何かあるわけではない テキスト処理が得意な言語なら前者は問題ないし 数値計算処理が得意な言語なら後者も問題ないだろう
832 :
デフォルトの名無しさん :2007/08/12(日) 01:47:18
2つのArray a, bがあってaの要素のうちbに同じ要素があるものだけを残すにはどうすればいい?
>>831 いや、要はWEBアクセスとデータベース連携が
このシステムのキモなわけですが、これが
私の知る限りPC上のフリーCOBOLではできませんので、
Rubyではできるのかな、と。
>833 Rubyでできるかっつったらできる 多分、楽に出来るとまで言っても嘘ではないと思う
836 :
デフォルトの名無しさん :2007/08/12(日) 02:25:16
>>833 Rubyだと、楽に、早くできる。
が、株なら、脂肪。
Ruby遅いから、全銘柄スクリーニングとかやってみろ、1時間でも終わらんぞ
遅いところはCで書き直せばいい
> 性能はともかく純粋の言語設計の善し悪しで見ると > C#はRubyの足下にも及ばないと思う だからそういうことは自分で言っちゃダメだって。 却って格下に見られる。
JAVAでええんとちがう?
Javaめんどい
Javaってコード汚くなるから嫌い
コード汚くなるのは言語のせいではないだろ
言語のせいにしないと、
>>841 のせいになっちゃうじゃないか
むやみにでかくなることは多い…というか冗長に書くことで保守性高めるのが目的のひとつだからな 汚くなるかどうかは書くのに関わった人次第だ
コードが汚くなるというか別にこんなことまでいちいち書かなくてもいいじゃん、 て感じのお役所書類っぽいところがどうもいや。 でも保守性を考えるとその方がいいのかもなとはちょっと思うけど、 思ったのはちょっとだけなのでよくわからない。
import *; とか書けば綺麗になる
1ステップいくらだからでかくてよいのです
スクリプト外からデータを参照する必要がない場合、 1MB未満のテキスト形式(タブ区切りとか、あるいは元のHTMLやxml、独自パース解析が必要な生テキスト)でファイルに保存するのと比べて pstoreが処理速度や効率上不利になる場面ってそうはないよね? あんま深く考えずにpstoreで配列やハッシュを保存しちゃってOK?
cgi.params['hoge'] で「必須でないhogeがfooに設定されてるとき○○する」をどう書いていいんだかいまだに覚えられない いきなり if cgi.params['hoge']==foo then だけだと確かnilだかなんだかでどっか何かエラー出るんだよな、とか
if t=cgi.params['hoge'] || t==foo then
ごめんオアじゃねえアンドだわ
フィールド名が固定なら(ふつう固定だよな) cgi['hoge'] == 'foo' みたいな書き方の連打でよい パラメータに &hoge=ナントカ と hoge が指定されてなかった場合は空文字列(1.6では空配列)を返すから例外は発生しえない CGI.new した時点で配列が入ってると考えるんだ考えるんだ考えるんだ(エコー) 「ハッシュで返します」とか無邪気な説明になってる cgi.params の誘惑に負けてはいけない あれはどんなフィールド名が来るかわからないときにのみ使用すべし
配列が入ってるんじゃなくハッシュな
cgi.paramsって、配列返さなかった?
cgi.params[HOGE]が返すのが配列って意味だた
cgi.params['hoge'] は全世界的に地雷
CGI.params[key]から返ってくるアレは[]演算子が特異メソッドとして 定義された文字列……
そうなん? p cgi.params['hoge'].class は Array って表示されるけど…
>>858 あれ。
cgi.rbの str.extend(Value) のあたりを見ると文字列の[]を再定義している
よーに見えるんだけど。
なんか見間違いだろうか。
cgi.rbの[]メソッドは、バージョンによって かなり大きく動作が違っているので あまり頼らないほうがいい CGI#paramsかcgi adjusterがオススメ
lib\ruby\1.8\cgi.rb
960: attr("params")
1112: @params = CGI::parse(
895: def CGI::parse(query)
896: params = Hash.new([].freeze)
だから、やっぱし、arrayでいいんでないの。
>>859 の
str.externd(Value)が示すのは、
cgi['a']とやったときの動作でないの?
cgi.rbは早く捨てろ pythonあたりからそれっぽいライブラリ拾ってきて入れよう
過渡期の産物であることは作った本人もわかってるくらいなんで 次の標準が定着するまでcgi.rbに頼らないお手軽CGIスクリプト作りを考えようぜ
EmacsでRubyスクリプト書いてる人はいますか? よく考えたらruby-modeは色をつける機能ぶんしか使ってないことに気づいたんですが、 なにやらスクリプト作成で便利な機能とかもしあったら教えてくれると鼻血が出ます
え? Vine標準のruby-modeであれば、インデントとかもしてくれるよ。 tabおせば正しい位置に入ってくれる。 便利ー。
{for,back}ward-sexpの動作が微妙なんだよな。
将来的にはripper使ったりするようになるのかな。
「サイトにユーザー名とパスワードをPOSTで送ってログインしクッキーを受け取る」 「そのクッキーを送ってサイト内のコンテンツをGETでダウンロードする」 というスクリプトを作りたいです クライアントとしてセッションクッキーの一時保管と利用を簡単に扱う方法はありますか?
>>864 着色とインデントは普通に使ってるはず
なにか便利なメソッド補完機能とか無いのかね、これ
自分で作れば? lisp書ければいけるよね。
補完機能はない。 動的な言語だと、他の言語でもないだろうね。
>>848 処理速度や効率には、大きな差はないと思うが
rubyのバージョンが変わると読めないことがあるという致命的な弱点が
>>862 Pythonって何か便利そうなライブラリあるのか?
その1。 一応 dabbrev があるが、ruby 書きモードに特化して便利な機能ではないね…。 M-/ を押すと、「カーソルのとこにある語に似た語」を、Emacsに読み込んである全バッファから探して挿入する。 たとえば、どっかのバッファに expand_path と書いてあったなら、 ex まで書いてから Alt 押しつつ / を押すと expand_path と展開される。自作のよくわからん超長い名前のメソッドや変数もこれで平気。 ただ、日本語分かち書きの関係で、単語の前には空白とか書く癖はつけておいたほうがいい。 その2。 Emacs に詳しい人は見当ついただろうけど普通の abbrev。 「PStore.new().transaction do」を「dbopen と書いてからC-x 'で展開」させるためには、 dbopen と書いて C-x a i l したあと、ミニバッファに PStore.new().transaction do と書いて Enter する。
>>869 キャッシュしてくれてタブ打つと切り替えてくれるのは使ってる
>>862 最近は webrick/cgi 使ってる。
ls.rb 内で、以下のことをしているとします。 for i in 0..10 system("cd " + i + "; ls") end 1回目のls が終わった頃にCtrl-Cをして、停止してもそのまま10回続けようとする のですが、Ctrl-Cをキャッチして、スクリプト自体を停止させる方法はありませんか?
>>868 こういうようなのが標準であるといいなとかそんな感じ?
#!/usr/bin/ruby -Ke
require 'kconv'
require 'net/http'
Net::HTTP.version_1_2
require 'uri'
@uri = URI.parse('
http://www.tohoho-web.com/cgi/wwwcook.cgi ')
def savecookie(response)
@cookie_jar = response.get_fields('Set-Cookie')
end
def loadcookie
@cookie_jar.map{|e| e.split(/;/)[0]}.join(';')
end
Net::HTTP.start(@uri.host, @uri.port){|http|
# 初回アクセスでカウンタの訪問回数は普通に 1
response = http.get(@uri.path)
savecookie(response)
puts response.body.toeuc
# クッキーがあるのでカウンタが訪問回数 2 になるはず
response = http.get(@uri.path,{'Cookie' => loadcookie})
puts response.body.toeuc
}
ニコニコ動画のアカウント持ってる人に質問です require 'net/http' mail = 'MAIL ADDRESS' password = 'PASSWORD' Net::HTTP.start('www.nicovideo.jp',80){|http| puts http.post('/login',"mail=#{mail}&password=#{password}").body } これでログインってできてますか?
できたよー って言ったら信用すんの?
881 :
デフォルトの名無しさん :2007/08/15(水) 01:34:56
ログインできているかどうかは、どうやって判断すればよいの?
表示されたHTML直接読むんじゃね(w ログインエラーで200以外を返すサイトってあんま見たことないぞ
それはこの処理フェーズの仕事ではないような気がする
putsのとこで本来responseごとどっかに返すloginメソッドのようなもんなのかもしれないし
login
@cookie = login['Set-Cookie']
@html = login.body
こんな感じ
てか、このあとサーバから何をどんだけ持ってくるかにもよるけど、
ログイン後のKeep-aliveが効いてる間に済ませられる程度なら、別にログイン情報のクッキーの取得と保管は必須ではなくね?
>>878 は>878のコードのどこが不安で聞いてるのかはっきりさせたほうがよいかと
ニコ動のログインでPOSTするデータがこれで十分かどうか確かめたいのかな?
885 :
878 :2007/08/15(水) 11:00:16
変数にディレクトリのパスを格納したいです。 最後にスラッシュはつけておくのが普通ですか? @dir1='/usr/local/bin' @dir2='/usr/local/bin/' 前者だとファイルを手作業でくっつけるとき path1="#{dir1}/#{file}" と書いたはいいものの「dir1ってスラッシュついてなかったっけ?」と心配しなければならず、後者だと path2="#{dir2}#{file}" と書いたはいいものの「dir2ってスラッシュついてたっけ?」と心配しなければなりません。 普通は手作業で連結したりしないので堂々とpathname使い倒せ、という頼りがいのある意見もお待ちしてます。 require 'pathname' path = Pathname.new(@dir)+file
付けない。 連結するときにセパレータを入れることでディレクトリを 連結している事を明示できるから。
変数に入ってるのがディレクトリかどうかを報せるのは変数名かオブジェクトの種類の役目だろ
昔の NetBSD だと Dir::mkdir(@dir2) がエラーになったような。 なので漏れは最後のスラッシュは付けない。
"(ABC)"なんかの正規表現の記号が含まれる可能性のある文字列を渡して s.gsub!(/\s*\(ABC\)\s*/, "") したいんですが"(ABC)" -> /\s*\(ABC\)\s*/ の変換ってどうやればいいんですか?
ri か refe で pack/unpack のテンプレート文字列の説明って見れましたっけ? テンプレート文字列の憶えられないニワトリ頭な皆さん、いつもどうしてますか?
>>890 よくわからんが、「正規表現の文字を考慮して正規表現として組み込む」なら普通に #{} で書けばいい
irb> str = '(ABC)'
irb> re = /\s*#{str}\s*/
=> /\s*(ABC)\s*/
irb> p 'CBA ABC CAC ABC'.scan(re)
[["ABC"], ["ABC"]]
もし「正規表現に使われる文字が混じってるけどそれは正規表現として機能はしてほしくない」なら Regexp.quote() して #{} を使う
irb> re = /\s*#{Regexp.quote(str)}\s*/
=> /\s*\(ABC\)\s*/
irb> p 'CBA ABC CAC ABC'.scan(re)
[]
irb> p 'CBA (ABC) CAC ABC'.scan(re)
[" (ABC) "]
>>892 のように Regexp.escape() でも動作は一緒
>>891 俺は常に別窓でマニュアル開いてる
左にマニュアル右にエディタとかそんな感じに配置してる
>>886 File.join(dir1, file) つかえば。
>>894 マニュアルってネットでつか?
それともrdocとか?
>>895 の File.join が require するものもないし簡単だと思う
file のほうにディレクトリ区切りを極力混ぜないように気をつける必要があるけどな
混ぜることを許容したらわけわかめに陥る可能性大
>>896 ローカルに落としたHTML
Winならchm
> これでgeneratorライブラリを使わなくても簡単に外部イテレータが使えて、 > PythonやXtalに一歩近づいた。 な、内部イテレータこそ正義と支持してきた我々の立場は...?
cgi.rb って、 cgi.params と cgi.out を使ってるぶんには エスケープとかサニタイズとか XSS とかなんかあのへんの面倒なことに対しては安心?
「これを通してみてこういう結果だったら安心だね!」という検証データってどっかで公開されてないのかね そういうのが無くてある意味「頭の中で考えてるだけ」だから基本的なXSS脆弱性すら無くならないんじゃないかな こんだけ話が進んだなら実際に出てくるのは複雑で小難しい脆弱性ばっかとか、そういうのになってもいい頃合なのに clacklibみたいなのってないのかな?
メソッド定義の途中で require を記述した場合、 そのメソッドが使われたときにだけファイルが読み込まれるという理解でいいですか? 「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか そういう動作はしませんよね?
>>902 > メソッド定義の途中で require を記述した場合、
> そのメソッドが使われたときにだけファイルが読み込まれるという理解でいいですか?
よい。
> 「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか
> そういう動作はしませんよね?
requireも単なるメソッドだからそういうことはしない。
プリプロセッサのイメージ化
>>904 require == #include ってこと?
かなり外れてるイメージだ。
906 :
876 :2007/08/16(木) 16:42:15
Rubyでの開発では、エディタなり環境なり何が一般的なんでしょうか。
>>907 の質問って頻出してるけど、どっかに回答まとまってないのかな?
別途学習に足るほどの(たとえばJavaやるなら無理してでもEclipse、のような)まともな専用環境がないというのが答なのでは? 手持ちの使い慣れたエディタのRuby補助モードを使ってスクリプトを書いて シェルで延々スクリプトを実行しながらデバッグしましょう、といった程度の代物しかない
ということにしたいのですね? :-)
>>906 単純には無理。
DLとか使って無理矢理どうにかすることはできるけどね。
この挙動を変えようという話もなくもない。
>>905 > 「最初にスクリプトがインタプリタに読まれたとき全文走査されて require と名のついたものはとりあえず全部取得」とか
> そういう動作はしませんよね?
これがプリプロセッサのイメージか、
と言ったのだが、なんでrequire に勘違いすんの?
そりゃあ、かを化に誤変換したのは悪かったよ
>>907 ・copy con/cat
・メモ帳
・TeraPad/EmEditor/サクラエディタ/秀丸等
・RDE
・vi系
・emacsen
・Eclipse
お好きな物をどうぞ。
914 :
876 :2007/08/16(木) 20:45:09
>>911 ありがとうございます。
> DLとか使って無理矢理どうにかすることはできるけどね。
検索してみたところRuby/DLのことでしょうか。
ちょっとキャッチするのは難しそうなので諦める方向で考えてみます。
>>876 >>906 以下のように system から返ってきた時点で、終了ステータスを見れば可能です。
for i in 0..10
system("cd " + i + "; ls")
exit(false) if $?.termsig == Signal.list['INT']
end
そもそも何で停止しないの?
いや、停止はするよ? 10000.times do |i| system("echo #{i}") end というスクリプトを実行して、Ctrl+Cをずっと押してると400くらいで止まる いくつで止まるかは環境にもよるんだろうけど
>>917 わかった。質問を変えます。
そもそも何で一度で停止しないの?
>>918 読んでみたけど system(3) と Ruby の Kernel::system とどう関係するの?
なるほど。 system(3) の挙動に合わせた Perl の挙動に合わせたということすね。
サーセン自己解決しますた。 図に書いたら未定義だった事が分かりますた。 Ruby interpreterは嘘をつきませんねw
>>901 脆弱性検査ソフトの製品では AppScan などがある。
100万くらいするけど。
いい流れだ
>907 913に追加 ・NetBeansの次期バージョン(6か)。インデントが2文字でハードコーディングなのがステキ。 ・有償で未発売ながら、MatzもびっくりのCodeGear製IDE(名称未定? )とか。 NetBeansはβ版なら出てる。
>>138 で紹介されている方法にならってmultipart/form-data形式で
ファイルをアップロードするコード書いたらちゃんとアップロード
できたんだけど、これだと一度ファイルを全部メモリ上に読み込ん
じゃうわけで巨大なファイルだとメモリ不足が心配。
なのでストリーム的な取り扱いをしたいなと思うわけですが、どの
ように実現すればよろしいでしょうか。
net/httpの「ちょっとずつ○○する」はメモリに全部読み込んだ上で数百バイトぶんずつ切り出す、だった気がする 右から受け取って左にPOSTするとかそういう芸は標準ではできないんじゃないかな
な〜るほど。 ということはrubyを使って巨大なファイルをアップロードしたいと きには、cURLのような外部コマンドを使うのが吉ということでしょ うか。もしくはすでにそのような機能を実現したライブラリが存在 するとか。
ruby用のIDEって何がありますか?
RDE
ググレカス
>>934 「ググレカス」で、ググって見ましたが、そんなそれっぽいIDEが見つかりませんでした。
よろしければ、URLを教えてもらえないでしょうか?
クラス同士で共通の変数を持つ方法について 質問です。 マニュアルによると module M @@val=1 class C1;include M;...;end class C2;include M;...;end end というのとクラス継承の場合が挙げられていましたが、 他にクラス同士で共通の変数を持つ方法はないでしょうか? 教えてください。
938 :
876 :2007/08/20(月) 19:50:38
>>915 そうか終了ステータスを見ればいいんですね。
今やってみたらできました。
ありがとうございました。
sqliteを使っているのですが、sql文の書き方は分かっても「.」で始まるsqlite文の記述の仕方が分かりません。 require 'sqlite' def make_table db = SQLite::Database.new("test.db") db.execute("create table tbl_test(hoge int(20)) values ('1'')") db.close end def chk_table db = SQLite::Database.new("test.db") db.execute(".tables") #「.」がおかしいとエラー db.close end make_table chk_table #←ここが動かない 「\」でエスケープしてもダメでした。何か解決方法はあるのでしょうか?
>>937 「クラス同士」というのが、クラスオブジェクト同士という意味なら、その方法ぐらいしかない。クラス定義をモジュール定義に含める必要はないけど。
module M
@@val = 1
end
class C1
include M
end
class C2
include M
end
「クラス同士」というのがインスタンスオブジェクトのことをいっているなら、継承しないと無理。
つか
>>937 の方法じゃなぜだめなのか、本当にしたいのは何なのかが不明なので、これ以上のアドバイスできない。
つーか>937はマルポだな
256倍本の無道編を読んでいるんですが p58にある文字列にマッチする正規表現 /\A"(?:[^"\\]+|\\.)*"/ はどういう意味がよくわかりません。後半部分の |\\.はどういう意味なんでしょうか
>>942 Ruby ソースコードのダブルクォーテーション文字列にマッチする正規表現?
|\\. だと 「または、円記号そのものと任意の一文字」って意味だから
"hoge\n"の \n みたいなのにマッチさせることを想定してるんだと思う。
正規表現って言えば、m オプション(Regexp::MULTILINE)の説明が「正規表現 . が改行にもマッチするようになる」なもんだから <html> <head> <title>たいとる</title> </title> <body><h1>本文</h1></body></html> という文字列があって <head><title>〜</title></head> にマッチさせたいときに re = /<head>.<title>(.+?)<\/title>.<\/head>/m って「改行の位置に . を1個挿入する」ように使うもんだとずーっとずーっと思ってた いや、マルチラインのこういう説明は Ruby に限らないんだけどさ… 上で言うと「title が複数行に跨る場合がある」ときに使うオプションなのね(通常の (.+?) は改行を跨げない) 改行は \r\n と直接 CRLF を指定するか、改行も含んでる \s を使うのが正しいん?
.*?でいいんじゃね?
意味上は \s+ がいいのかな これなら行末のいつできたんだかよくわからん空白も行頭のインデントも吸収できる 手抜きして . を使うと普通の文字もマッチしちゃう irb> /<head>.<title>/m.match('<head>0<title>') => #<MatchData:0x402d0de0>
comment = /\s*(?:<!--.*?-->\s*)*/m %r"<head>#{comment}<title>(.+?)</title>#{comment}</head>"m
書かれてないことまで勝手に組み込む汎用厨が来たぞー 逃げろー
もしかして pstore は何をするにもファイルを最初から最後まで読み込んで ファイルにあったオブジェクトを全部復元してメモリに取り込んだりしてますか? 「pstore.roots は一部分であるルートの集合だけ読み込むからディスクに優しい」とかいうのは気のせいですか? pstoreのファイルが10MBあったら、transactionした時点で10MB読み込まれてオブジェクトがメモリに展開されてますか?
>>950 もうしばらく待ってると HTML パーサが出来上がってくると思われ。
自分はパーサ使ってる。正規表現で間違えるの怖いから・・・
>>946 > いや、マルチラインのこういう説明は Ruby に限らないんだけどさ…
もしかしたら Ruby に限ったりしない?
マルチライン(モード)って普通、改行文字を含む文字列を複数行とみなし、
その各行の行頭行末について ^ と $ がマッチするモードのことだと思う。
(詳説正規表現に書いてあった気がするけどあやふや)
なので Regexp::MULTILINE の説明に複数行モードって書いてあるのはちょっと謎。
>>951 def transaction(read_only=false)
unless read_only
file = File.open(@filename, File::RDWR | File::CREAT)
content = file.read()
else
file = File.open(@filename, File::RDONLY)
content = (File.read(new_file) rescue file.read())
…
@table = load(content)
end
def load(content)
Marshal::load(content)
end
おめでとう
ファイル全部readで読み込んで全部まーしゃるに回してるぞ
rootに何があるか調べるだけでも10MBガッチリ読み込んでバッチリ展開してる
てか、これよく質問されるんだがどっかに解説とか書いてないのか?
「○○がもしあったらデカいpstoreから読み込む」とかいう動作の場合はインデックスだけ別ファイルにしたほうがええな
本データと同一のpstoreファイルに index=[00000,00001,00003, ...] という検索用データを持ってても無駄ってことで
ハッシュみたいなデータだけでいいなら sdbm あたりを使った方が良いかも?
Perl の正規表現 (の s と m オプション) の改行の扱いに比べると、 Ruby のはシンプルで良いような気がする。 Perl のは漏れにはおぼえれねー。
完全に固定の特定のHTMLファイルを相手にする場合は自前の正規表現でも充分なんだけどね。 いや、そのサイトのHTMLを保存してirb起動してファイル読み込んで正規表現テストしまくる手間を考えたら 汎用HTMLパーサにパースさせたほうが楽だろ、とは思わなくもないんだが…HTMLパーサって絶望的に起動遅いんだよ…
>>954 がーん
ありがとう
>>955 ハッシュと配列とTimeオブジェクトが入り混じってる現状、データ構造を作り直すの面倒(w
こんなに大きくなるってわかってたらそういうのの検討もしたんだけど……
HTML パーサってどれが良いんだろ? できればメジャーなのが良いんだけど、 俺は FreeBSD を使ってるので ports でインスコできるのでおすすめってある?
961 :
937 :2007/08/21(火) 21:27:24
>>940 最初はMの部分はモジュールじゃなくてクラスにするつもりでした。
しかし、調べた限りではモジュールしか無いので、そうしました。
$ cat test2.rb
module M
@@a=0;def c;@@a=0;C0.new;end
def ap;puts @@a;end
class C0 ;include M
def c1;C1.new;end;def c2;C2.new;end
end
class C1 ;include M;def m;@@a+=1;end;end
class C2 ;include M;def m;@@a+=2;end;end
module_function :c
end
しかし、そうすると、「a」と「b」を二つ作ると「@@a」へのそれぞれの操作が
影響しあってしまうので、他に方法が無いものか?と思ったんです。
$ irb -r test2.rb
irb(main):001:0> a=M.c
=> #<M::C0:0xb7f49464>
irb(main):002:0> aa=a.c1;aaa=a.c2
=> #<M::C2:0xb7f41854>
irb(main):003:0> b=M.c
=> #<M::C0:0xb7f3eaa0>
irb(main):004:0> bb=b.c1;bbb=b.c2
=> #<M::C2:0xb7f3971c>
irb(main):005:0> aa.m;a.ap;aaa.m;a.ap
1
3
irb(main):006:0> bb.m;b.ap;bbb.m;b.ap
4 # <=1と3が出るようにしたい。
6 #
うまく説明できませんが、やりたいことはこういうことです。
Windows2000 でOne-Click Installer 使ってRuby1.8.6-25 をインストールしました。 irb 上では require 'rubygems' require 'rake' すると true と出るんですが、スクリプトを書いて ruby hoge.rb で実行すると uninitialized constant Rake (NameError) のように怒られます。 C:\ruby以下にインストールしました。RubyGems を使うには何の環境変数をどのように設定すればよろしいんでしょか。
かなり違う気がするが class C0 def initialize(); @a = 0; end def c1(); C1.new( self); end def c2(); C2.new( self); end def pa(); puts @a; end attr_accessor :a end class C1 def initialize(sv); @sv = sv; end def m(); @sv.a += 1; end end class C2 def initialize(sv); @sv = sv; end def m(); @sv.a += 2; end end a = C0.new; a1 = a.c1; a2 = a.c2; a1.m; a.pa; a2.m; a.pa; b = C0.new; b1 = b.c1; b2 = b.c2 b1.m; b.pa; b2.m; b.pa;
>>962 > スクリプトを書いて ruby hoge.rb で実行すると
> uninitialized constant Rake (NameError)
> のように怒られます。
そのスクリプトを出さないのは家訓かなにかか?
965 :
937 :2007/08/22(水) 00:13:28
>>963 どうもです。うーん、それだと共通の変数という
一定の書き方ができるメリットが消えてしまうし…
簡単な例にして、書いてしまったんですが、
実はC1の中でもC2.newを書いてる部分があるのです。
class C0
@@a=0
def ap;puts @@a;end
def c1;C1.new;end
def c2;C2.new;end
end
class C1<C0;def m;@@a+=1;end;end
class C2<C0;def m;@@a+=2;end;end
継承使っても駄目だし。
うーん、インスタンス変数のようなクラス変数っていうのかなぁ。
どうにかできないもんかなぁ。
名前だけ共通にして中身は別に持ちたいってこと? class C0 def self.inherited(subclass) subclass.class_eval("@@a = 0") end def ap p self.class.class_eval("@@a") end end class C1 < C0 def m @@a += 1 end end class C2 < C0 def m @@a += 2 end end c1 = C1.new c2 = C2.new c1.ap;c2.ap c1.m c1.ap;c2.ap c2.m c1.ap;c2.ap
967 :
939 :2007/08/22(水) 03:44:44
>>943 え!マジですか!
うわぁ、今後sqlite3にしてCSVを「.import」コマンドでインポートしようと思っていたのに…
1万行ぐらいあるcsvなので、Mysqlを使わずにexerbして単独ローカルでやるつもりなので、大人しく1行づつ呼んでsplitしてinsertしますorz
(sqliteの書き込み時間が気になりますが)
ありがとうございました。
>>967 公式から落とせるスタンドアロン版の sqlite3(.exe) について調べてみて。
コマンドラインから sqlite3 foo.db ".import table" するなり
Ruby から system("sqlite3 foo.db 'import table'") とかできると思う。
(sqlite3 の第二引数には SQL 文とドットコマンド両方渡せる)
適当書いてるけど、何かしらお手軽な手段はあると思うよ。
970 :
937 :2007/08/22(水) 15:53:02
>>966 やりたいのは
>>961 みたいなことです。
継承できるインスタンス変数、みたいなの。
うまく言えないけど。
というか、インスタンス変数て継承できない。。。ことはないか、
継承したクラスで値を参照できるインスタンス変数、というか。
うーん、混乱してきた…
こんにちは、最近Rubyを始めたんだけどハマったので質問です。 配列展開(?)を使ったcase文を書いたんだけど、実際に展開された時 どの要素にマッチしたかを調べる方法ある? over = [ "b", "c" ] case src when "a" dst = "A" when *over # ここで dst = ?.to_s.upcaseみたいにやりたい # 望む結果は dst = "B"とか dst = "C"とか。 ...略 Rubyリファレンスサイトの組み込み変数のページ見てローカルスコープの 変数をいろいろ試したけどうまくいかなかった。 環境はRuby ruby 1.8.5 (2006-12-04 patchlevel 2)です。
無いんじゃない? src を利用して用が済まない(たとえば今回ならdst=src.upcase)のなら、 when *over の中で over から src と"同じ"ものを再度自力で探すしかないと思う
文字列strから正規表現にマッチする(複数の)文字列を取り出して変数に入れたいときに matched_words = str.scan(/__(1個目)__(2個目)_(3個目)/).flatten とか matched_word = str.scan(/___(何か)__/)[0] とかいちいち配列を作って壊すのはなんかアレな感じがします。 matched_words = Array.new str.scan(/__(1個目)__(2個目)_(3個目)/){ matched_words.push $1,$2,$3 } とか都合4行で書くのもうーんって感じです。 何かいい書き方ないですか?
>>973 "__1__2__3__".match(/__(1)__(2)__(3)/).captures
=> ["1", "2", "3"]
とか?
>>974 さん残念マッチしなかった場合も試して頂きたかった…!
irb> "__1_A_2__3__".match(/__(1)__(2)__(3)/).captures
NoMethodError: undefined method `captures' for nil:NilClass
>>973 いまのところ、「一発」で配列あるいは文字列を得る方法はないと思う。
str.match(/re/).to_a がたぶんいちばん近いが、
返る配列が [$&, $1, $2, $3, ...] なので0番目の要素におそらく誰も望まないデータがこっそり入ってる。
irb> '123'.match(/(1)(2)(3)/).to_a
=> ["123", "1", "2", "3"]
この配列をうまく操作すれば望む配列を得ることはできるだろうけど、それなら scan して flatten したほうがわかりやすいよな。
>>970 は
>>966 を実行してみた?
「継承できるインスタンス変数」というと通常のインスタンス変数と
変わりないように思えるんだけど、通常のインスタンス変数との違いを
列記した方が伝わりやすいんじゃないかなあ。
977 :
963 :2007/08/22(水) 21:01:38
>>965 >どうもです。うーん、それだと共通の変数という
>一定の書き方ができるメリットが消えてしまうし…
インスタンス変数として共通?C0,C1,C2で共通?
後者ならC0にも@sv=selfとするとか、
あるいは変数専用のクラスを作ってそれをC0の@svにいれれば共通になるけど。
>実はC1の中でもC2.newを書いてる部分があるのです。
C1のなかでC2.new(@sv)か@sv.c2()すればいい
C0を作らずにC1,C2しかいない場合もちょっと弄ればいける。
スクリプトは EUC-JP なんだけど、入力される URL は UTF-8 な日本語をエンコードしたものが入ってるんです。 URI.decode(url) してみた感じはなんとなく自動判別でうまく日本語に戻ってるような気もするんですが、 できれば「これは UTF-8 を URL エンコードした文字列なんだよ」と事前に教えて確実に処理させたいです。どうしましょう。
979 :
972 :2007/08/22(水) 22:02:27
>>972 レスサンクス。
> src を利用して用が済まない
まさにその通りでした。orz
when *over
dst = src.to_s.upcase
...
>>975 >
>>974 さん残念マッチしなかった場合も試して頂きたかった…!
> irb> "__1_A_2__3__".match(/__(1)__(2)__(3)/).captures
> NoMethodError: undefined method `captures' for nil:NilClass
1.9なら .? でいけるのかな。
"__1_A_2__3__".match(/__(1)__(2)__(3)/).?captures
>>971 正規表現にするとか。
over = [ "b", "c" ]
over_re = /\A#{Regexp.union(*over)}\z/
case src
when "a"
dst = "A"
when over_re
dst = $&.upcase
end
>>978 URI.decodeは文字エンコーディングの変換はしない。
文字と文字の比較だとは限らない説 というか正規表現でなんとかなるならそれこそsrcのダダ流用でなんとかなるんじゃね
"__1_A_2__3__".match(/__(1)__(2)__(3)/).captures rescue nil
985 :
937 :2007/08/22(水) 23:46:51
>>976 えーと、C0,C1,C2で作られるインスタンスに共通というのかな?
>>966 では共通になってないです。もしくは
>>961 でM1とM2を
作るようなことと同じなので、駄目です。
「インスタンス変数は継承できる」と言っていいのかどうなのか
そもそもわからないので、上手く説明できません。
http://i.loveruby.net/ja/rhg/book/minimum.html >Rubyでは変数(インスタンス変数)は継承するものではない。
http://www.sakalab.org/3zemi06/no5.html >既存のクラスの メソッドやインスタンス変数を「継承」し
>>963 でやってるみたいに共通の値をやりとりしたいんです。
値をやりとりするのもいいけど、共通の変数を作れないかな、と思ったんです。
ウェブサービスにアカウント(C0)
メッセージの一覧(C1)
メッセージの中身(C2)
C0,C1,C2ではクッキーを共通の変数としたい。
C0.new(user1),C0.new(user2)としたときクッキーが同じになったら困る。
(だからModuleにしてクラス変数をクッキーにするのでは無理になる)
というスクリプトなんです。
>>977 うーん、結局そういう風にどこかで渡すしかないですかね。
C++ の private のように同じクラスのインスタンスからのみアクセスできる 属性はどのように定義すればよいでしょうか? protected は継承クラスからアクセスできてしまうみたいですが。
private
>>986 不可能。
send とか instance_eval でなんでもできるから。
>>986 その機能は1.9で追加されるかもしれない。
Perlで↓書く処理、Rubyだとどうなるの? sub count(){ my $max = shift; return { 'incr' => sub { my $count = $max; for(my $i=$count;$i<$count+3;$i++){ print $i, "\n"; $max++; } }, 'getMax' => sub { return $max; } }; } my $count = &count(10); for(my $i=0;$i<5;$i++){ $count->{'incr'}->(); print "max:", $count->{'getMax'}->(), "\n"; } クラスは使わないで、あくまでメソッド?クロージャーとして実装する場合。 Perlより絶対楽だと思うんだが、Ruby初心者なのでさっぱりわからん。。。
>>992 > クラスは使わないで、あくまでメソッド?クロージャーとして実装する場合。
直訳しないで object に特異メソッドを追加するようにしてみた。
クラスは使って・・・あ、特異クラスがいた。。。orz
def count(max)
r = Object.new
(class <<r; self; end).instance_eval do
define_method(:incr) do
(max...max+3).each do |i|
puts i
max += 1
end
end
define_method(:get_max) do
max
end
end
r
end
c = count(10)
5.times do
c.incr
puts "max: #{c.get_max}"
end
>>992 >>994 どうせcountで1つ名前使っちゃうなら
素直にクラスにしちゃった方がスッキリするんだよなぁ。
class Count
def initialize(max)
@max = max
end
def incr
3.times {|i| puts(@max+i) }
@max += 3
end
def get_max
return @max
end
end
cnt = Count.new(10)
5.times do |i|
cnt.incr
puts "max:#{cnt.get_max}"
end
でも「クラス使わないで」って言われると別のアプローチが必要か。
ちょうどこの前おもいついたやりかた def count() c = 0 a = lambda {|e| e.times { p c; c += 1}} b = lambda {c} return {'incr'=> a, 'getMax'=> b} end f = count p f['getMax'][] p f['incr'][3]
998 :
デフォルトの名無しさん :2007/08/24(金) 12:39:53
rubyをまったくの無知からやろうとするなら読んでおく本をどれですか?
1000 :
デフォルトの名無しさん :2007/08/24(金) 12:50:10
ありがとう そして1000げっと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。