1 :
紅寶石 :
2006/11/21(火) 08:33:42
「初心者」で検索できないから板として許可できない
Rubyコミュニティの特徴が遠回しに表れたスレタイ
キ○○イが寄ってきやすい、とかか。
凝る対象がスタート地点から間違えてるところとか
Ruby初信者スレッドになる日も近いな
10 :
デフォルトの名無しさん :2006/11/21(火) 14:44:30
Ruby/NArrayを使いたいのですが、導入方法がわかりません。 ドキュメントには、 Rubyの標準的な拡張ライブラリと同じです。ソースを展開したディレクトリで、 ruby extconf.rb make make site-install (または make install) と実行します。 とあるんですが、windowsXPなのでmakeが使えずインストールできません。
じゃ、nmake。
12 :
デフォルトの名無しさん :2006/11/21(火) 15:41:42
じゃ、諦めろ。
ruby -v も知らせないような奴にいきなりそんなもん教えても無駄無駄
まあ、こればっかりは導入マニュアルが悪いと言えなくもない makeが標準で入ってるという前提でマニュアルを書くべきではない makeの導入の仕方とかいちいち書くのも面倒だけどな
そう言っても、拡張ライブラリ作者が、rubyが動くほとんどの プラットフォームでのそれぞれのコンパイル方法を説明する ってのも無茶だろう。
これはRubyに限った話ではないんだが、総じてマニュアル書くの下手だよな 「インストールに必要なもの」という項目くらいあってもよさそうなもんだんだが、 「とにかくmakeして下さい」といった説明しかなかったりする そりゃmakeでは必要なプログラムやライブラリのチェックはしてくれるが、 make自体がない可能性を考慮してないとか いちいちmakeで躓くまで待たないとわからんとかそういうのはよくないだろ makeのインストール方法の説明なんざ自前でする必要はない とにかく、makeを始めとしてあれとこれが無いと動かない、ということはちゃんと文章化しろ
make すら無い環境なんか使ってるクズがゴチャゴチャ偉そうに文句言ってんじゃねえよ。
うーん、そんなレスで乱せる安いスレだと思われてるのか、ちょっとショックだ
>>18 そう思うなら、お前が全部やればいいじゃない。
おまえ以外は誰もそんなもん必要ないからさ。
はっきり言ってRubyはスゴイです。 間違いなく一生遊べるおもちゃです。はい。
ああっいい!Rubyになりたい!!!
もう一度!もう一度っ!!
makeしろって書いてありゃ、よほどの池沼じゃない限りmakeが必要なことくらいはわかると思うが
>>18 極めて正しい
が、個々のメンテナに求めるクオリティではないな
マニュアル書式を統括すべきだろう
それこそDebianパッケージみたいに
>>18 お前、自分でやってみろよ。ごくたまに居るんだよな、こういう図々しい奴。
>>27 でも、自分の環境だから、作成者本人ならやれるぞ、これ。それほど難しい作業でもない。
それこそ「やってみればわかる」。
つうか、
>>18 を否定すると
>>10 はバカという話がもれなくくっついてきて
「makeすら自分で考えて用立てできん奴は使わんでよし」ということにならんか
流石ハッカー御用達のRubyだな!
まあそのへんは昔からだしな 説明だの事前用意だのの面倒くさがりがRubyを選ぶのだろう ドキュメントやマニュアルの不親切や不備は直りそうにない 今年の6月だか7月にはどうにかなってるはずだったんじゃないん?
英語サイトは親切だよ。
テンプレを読まない
>>31 が言っても説得力ないなあ
>>28 「自分の環境だから」って、自分の環境にmakeがあるからそういうドキュメントになってんじゃないの?
なんか読み違えてる?
make がデフォで入ってない環境も考慮してドキュメント書くなんてダルそうだな。 そういう所では make 以外にも足りない物が色々ありそうだし。 頑張って書いたとしても、「それほど難しい作業でもないから書いて当然だろ」とか 言われちゃうんだろうなorz
ruby-lang.orgにWindowsユーザー向けのチュートリアル用意すれば済む話じゃないの?
で、結局のところ、
>>10 の使ってるrubyは何版なわけ?
つーかWindowsではふつうは用意されてるバイナリを使うんじゃないのか?
と思ったら元の話はRuby自体じゃなく拡張ライブラリか。
>>35 マニュアルなんだし必要なものくらい最低限明記しとけよ、という主張なんだろうし、
いちいち入手方法や導入方法にまで言及する必要はないのでは。
箇条書き程度だろう。
てか、適度に箇条書きしてるマニュアルのほうが多いような気もするが。
なんて言ってると
>>10 の拡張ライブラリにのマニュアルには
REQUIREMENTSとかの項がしっかり書かれてたりするんだよな
元々RubyはいってるMac買えばOK. 頭使えない人はお金を使うべし。
と思ったら元の話はRuby自体じゃなく拡張ライブラリか。
質問させてください。 コマンドラインで使うスクリプトを書いています。 スクリプトにオプションを渡したいのですが、 オプションの処理をおこなうライブラリはあるのでしょうか。
OptionParser
#!/usr/bin/ruby p ARGV ----- ./test.rb -a aaa -b bbb ["-a", "aaa", "-b", "bbb"] これで用が済む場合も少なくない
46 :
43 :2006/11/23(木) 00:41:02
optparse
Rubyスクリプトのメモリ使用量や占有CPU時間を調べる方法はありますか? OSはLinuxです。 「readlinesで一気に配列として読み込むよりeachで各行処理したほうがこんなにメモリに優しいじゃん」 とかいうことを数値として実感して納得したいです
参照カウントじゃないからGCを動かしまくらないと・・・
シェルからコマンドとして実行して全体量を調べてもらって、readlines版とeach版の差分見れば? …いや、どうやればコマンド単体のメモリ使用総量を調べられるのかわかんないけど topを注視し続けるというのも現実的ではないしなあ
ulimitでいろいろメモリ関係に制限をかけて実行させてみるとか。 多くメモリを食う方はより緩い制限で実行できなくなるだろう。 と思ったが、どのオプション使えばいいんだ。
time コマンド使えば良いんじゃないかな。 bash組込みのtimeじゃなくてtcshのtimeとか/usr/bin/timeとか。
54 :
デフォルトの名無しさん :2006/11/23(木) 18:11:46
文字を数字に置き換えて配列にする処理をしているのですが、 効率のいいやりかたを教えてください。 例えば、"a"を2に、"b"を6に、"c"を11に、"d"を15に置き換える場合、 "aabdc"は[2,2,6,15,11]になるような処理です。 今は1文字づつcase〜whenで処理しています。
こういうのはどうだろう。 h = {?a => 2, ?b => 6, ?c => 11, ?d => 15} p "aabdc".unpack("C*").map{|c| h[c]}
ハッシュで表引きするところが肝なのであとはバリエーションでしかないけど、 こんなのも。 (hのキーが?aとかの場合) require 'enumerator' "aabdc".enum_for(:each_byte).map{|c| h[c]} (hのキーが"a"とかの場合。Ruby 1.9だと ?a == "a" だっけ?) "aabdc".split(//).map{|c| h[c]} # //は空の(中に1文字もない)正規表現 # irbから動かしてString.each_charがないと騒いだのは秘密。 # ActiveSupportめ。
57 :
デフォルトの名無しさん :2006/11/23(木) 21:54:31
define_method でブロックを受け取るメソッドを定義したいんですけど、なんとかなりませんか? よろしくおねがいします。
それはこっちのセリフだ
書きかけの自作メール振り分けプログラムにこんなの(以下は断片)があった。 def register_action(sym, &block) __send__(:define_method, sym) do |*options| options = options.shift || {} block.call(options) end register_action(:to_folder) do |options| ... end 引数の受け取り方になんか制限つきそうな気が……
60 :
デフォルトの名無しさん :2006/11/23(木) 22:26:47
61 :
デフォルトの名無しさん :2006/11/23(木) 23:21:30
>>55 ありがとうございました。
時間も半分以下に短縮できました。
62 :
デフォルトの名無しさん :2006/11/24(金) 00:32:00
Mac板にRubyスレないのでここでいいのかな? まったくの初心者なんですけど(;・∀・) ターミナルに ruby ファイル名.rb でリターン押しても ruby: No such file or directory -- ファイル名.rb (LoadError) ってなります ファイルの保存場所とかにルールとかでもあるのですか?
>>62 カレントディレクトリは確認した?
pwd
64 :
デフォルトの名無しさん :2006/11/24(金) 00:50:38
>>63 カレントディレクトリ!?
すいませんほんとに初心者なんで…絶対パスの事かな
仮にデスクトップにそのファイルがあるならばそれを指定しなければダメと言うことですか?
ターミナル自体始めて動かしたもので
65 :
デフォルトの名無しさん :2006/11/24(金) 01:10:44
>>63 ヒントサンクス
おお 自己解決しました Ruby自体の問題ではなくターミナルの問題でした ターミナルちっと勉強するかorz
ファイルの場所をちゃんと指定して大丈夫でした
MacならファイルをFinderからターミナルにドロップすれば絶対パスが出てくる。
>>65 Rubyに限らず,Macを使いこなすにはターミナルの使い方(bash シェルの使い方)に詳しくなっておくと便利だよ。
かくいう自分は,ターミナル上でRubyを楽しんでるマカーです。
ちょっとした日常の繰り返し作業も,AppleScriptやシェルスクリプトではなくRubyスクリプトを書いて処理してます。
スクリプトファイルの冒頭に、 #!/usr/bin/ruby -Ku -Ilib とかくとエラーになる。ただ、 #!/usr/bin/ruby -Ilib -Ku と、順序を変えると大丈夫。コマンドラインだと順序関係なく動くんだけど… 何か制約があるの?それとも前者だとオプション解釈上問題でも生じてる?
~$ ruby "-Ke -Ilib" ruby: invalid option - (-h will show valid options) ←たぶんこのエラーが出たはず ~$ ruby "-Ilib -Ke" ruby: Interrupt ←エラーなし、終了のためにここでEOF ~$ スクリプトの第1行目(俗称shebang)では、複数の引数は解釈が保証されない。 たとえばLinuxでは「空白後をひとまとめにした1個の文字列」として渡される。 #!/usr/bin/env ruby -Ke がうまく動作しないのもこれが理由。 ということで、「Rubyでは-Kオプションを最初以外に書いておくとたまたま動く」が正解。
補足。 Rubyの場合、起動したインタプリタが改めて#!行を自分で解析して 自前である程度は処理してる。 $ cat hoge #!/bin/sh -x echo "$@" $ ruby hoge とかやると、rubyがshをexecする。
perl.pl --------------------- #!/usr/bin/perl die "OOPS! IT'S PERL!" --------------------- ~$ ruby ./perl.pl OOPS! IT'S PERL! at ./perl.pl line 2. なにこの素敵無駄機能
>>69 判りやすい解説thx。-KuIlib としてやったらうまくいった。
-IlibKuだとダメみたい。libじゃなくてlibKuディレクトリを探しにいっちゃうんだろうなぁ。
こんなことドキュメントに書いてあったかな…。
くっつける処理が謎だ。普通にくっつけたら、
先の例、前者のほうが「たまたま」動きそうなもんだが…。
それと、-Cと-Iを同時指定とかしたいときはどうするんだろう…?
>71 __END__(Perlでもスクリプト終端)を 組み合わせると混ぜコード書けるが 素敵過ぎてオススメできないんだぜ
>>72 shebangに書かない。
シェルスクリプトから起動するようにする。
#!/bin/sh
ruby <好きなだけオプション> <Rubyスクリプトファイル>
こんな感じ。
あんまりよろしくないけど。
ってか、そんなにオプション付けたくなるようなことってあるか?
俺の場合は、あって-Kくらいだけどなー。
-lも-CもRubyのスクリプト内でできるしな。厳密には意味が違うかもしれんが。
>>69 はじめてしった
スクリプトの第一行目は、
#!/usr/bin/ruby -Ku -Ilib
と書いても
#!/usr/bin/ruby "-Ku -Ilib"
とひとくくりにされるわけね・・・
引数が一個だと、「一応は」動いているわけだ
>75 違う。そこは実装依存。 Linuxはそうなるというだけで、ほかのUNIXだと適切に解釈してくれるものもある。
間違いなく言えることは、
「shebangでは複数の引数を書くべきではない」
ということ。
どうしても複数の引数を与えたい場合は、
>>74 のように一ひねりすること。
>>76 そうなん?
これって、どのレベルで決定されるものなんでしょ?
OS?shell?ruby?
79 :
デフォルトの名無しさん :2006/11/25(土) 16:19:54
Ruby/Tkをサブルーチン的に使いたいので教えて下さい。概要は後記のように, MAINスクリプトから,SUBスクリプトに値(オブジェクト)を受け渡ししたいのですが, いろいろサンプルを読んでもウィジェット側からサブルーチンを呼び出す方法しか無く, その逆の方法の参考がありません。 Ruby/Tkを子プロセス的というか関数的に使うにはどうしたらよいでしょうか? #!ruby # MAIN require 'sub.rb' include Submodule val = String.new result = sub(val) resultについての処理 ... __END__ #!ruby # SUB moduel Submodule require "tk" def sub(val) v = TkVariable.new(val) TkRadioButton.new { text 'top'; variable v ; value 'top'; anchor 'w' pack('side' => 'top', 'fill' => 'x')} TkRadioButton.new { text 'middle'; variable v ; value 'middle' ; anchor 'w' pack('side' => 'top', 'fill' => 'x')} TkButton.new { text 'Quit' ; command 'exit' ; pack } Tk.mainloop end __END__
>>78 shebang の処理は kernel が行ってるはず
81 :
デフォルトの名無しさん :2006/11/25(土) 17:43:35
開いたファイルに文字を書き込む場合はどうしたらよいのでしょうか? openメソッドをwモードでファイルを作成して どうすればよいのでしょうか?
83 :
デフォルトの名無しさん :2006/11/25(土) 18:10:10
>>81 はい。
.writeメソッドではないですし。
85 :
デフォルトの名無しさん :2006/11/25(土) 18:42:18
>>84 すみません。ありがとうございます。無事解決いたしました。
また、続きの質問なのですがこのようなプログラムで実行すると
出力ファイル名が、outputになります。標準入力から入力した文字にしたかったのですが・・・
output = $stdin.gets.chomp
up = File.open("output","w")
"output" を"#{output}" にして式展開すると入力した文字になりますが
#{} をしなくて入力した文字にすることはどうすればよいのでしょうか?
#{}だと面倒なのですが・・
>>85 "output" のクォートを取ってみな
>78 その三者で言えば OS。 shebang 行の解釈はシステムコールがやる。どっちみち77が正しい。
>>79 そりゃexitしたらそれ以上実行されんわな。
subから何も返してないし。 module Submodule require "tk" def sub(val) v = TkVariable.new(val) root = Tk.root TkRadioButton.new {text 'top'; variable v; value 'top'; anchor 'w' pack('side' => 'top', 'fill' => 'x')} TkRadioButton.new {text 'middle'; variable v; value 'middle'; anchor 'w' pack('side' => 'top', 'fill' => 'x')} TkButton.new {text 'Quit'; command {root.destroy}; pack} Tk.mainloop v.value end end include Submodule result = sub("") p result
どうせRubyスクリプト書いたことないんだろうな、と思う
その気持ちはわからんでもない Rubyスクリプトをある程度書けるようになった人で GUIがどうしても必要になった人が仕方なく止むに止まれぬ理由で使うのがRuby/Tkだよな 少なくとも、Ruby部分で躓くような人はまだ使ってはイカン
92 :
デフォルトの名無しさん :2006/11/26(日) 19:19:29
文字を置換したいのですが 文字列中のAをBに、EをFに、MをNに、OをPに 置換したいのですが どうすればできるのでしょうか? gsubメソッドだと string.gsub(/AEMO/,'BFNP') じゃ、AEMOをBFNPと固まった文字列で置換してしまいます。 一度で各文字を置換指定するにはどうしたらよいのでしょうか?
94 :
デフォルトの名無しさん :2006/11/26(日) 21:48:55
out = "ARAFAFAFAFFFAFATRWTATQWTWQTRQWTQTQTQTQTQWTQWEFTQWETQWTQWTTAFAFAFRATRARTA" start = 1000 moji = "" (0..15).step(3){|i| moji << #{out[i,3]} + "(" + "#{start.to_i - 150 + i}" + ")" + "," p moji } すみません、7行目に文法エラーと出てしまましたが、どう間違って? ARA(850),FAF(853),・・・ みたいに表示したく。 そして、最後の文字列の , は削除したいと思っておりますが、それ以前にエラーがでてしまいます。 どうぞよろしくお願いいたします。
>>94 > moji << #{out[i,3]} + "(" + "#{start.to_i - 150 + i}" + ")" + ","
^^^^^^^^^
ここが違う。
#{} は文字列に変数を埋め込むときに使う。
この場合out[i,3]だけでいい。
↓のようにしても(・∀・)イイ!!。
moji << "#{out[i,3]}(#{start.to_i - 150 + i}),"
>>95 というか、前者の書き方が見にくいからこその#{}だよな。
97 :
デフォルトの名無しさん :2006/11/26(日) 22:03:34
>>95 ありがとうございます!無事できました。
#{}を式展開とだけ覚えていたのですが、文字列中で有効なんですね。勉強になりました。
なんか気持ち悪いな j = start.to_i - 150 + i moji << "#{out[i,3]}(#{j})," 埋め込むのは変数やメソッドだけにしてこう書こうぜ
俺は#{}なんて滅多に使わないな 括弧やクォートの囲みは浅くしたい
100 :
99 :2006/11/26(日) 22:56:11
+ を多用するようなら sprintf してる
質問。 make_the_file unless Filetest.exist?(file) file読み込み処理 と begin file読み込み処理 rescue Errno::ENOENT make_the_file retry end ってどっちが「普通」ですか? 前者は Filetest.exist? が毎回必ずディスクを余分に読みますよね 例外を待ち構えて例外が起こったときに対処したほうが素直ですか?
>>101 後者はretryの取り扱いミスが怖いので前者
確かにディスクアクセスが余分で気持ち悪いけどね
本当は後者がウツクシイんだろうな、と思う
db=PStore.new(file)で存在しないファイルを指定してもdb['hoge']がnilを返すので 泣いたことを思い出した
105 :
デフォルトの名無しさん :2006/11/27(月) 10:03:46
文字列の最後の1文字や2文字を消すにはどのメソッドを使えばよいのでしょうか?
sum_string.slice!(-1, 1)とかslice!(-1, 2)とか
107 :
デフォルトの名無しさん :2006/11/27(月) 10:50:54
>>106 (-1, 2) で試したところ、(-1, 1) と同じ結果がでてきたのですが・・・
>>105 普通、Rubyでは一発ではできない。
Rubyの文字列枚挙操作は、1バイトを単位として動作し、日本語2バイト文字列を「1文字」として解釈しない。
が、1バイトの英数字だけならStringのsliceメソッドが使える。
>>106 はよくある間違い(というかこれ仕様が意地悪)なので注意。
>>107 う。すまんボケてた。
後ろ二文字ならslice!(-2, 2)とか、
めんどくさけりゃstr.slice!(-2, str.length)だな。
というかリファレンスのString#slice!を参照
110 :
デフォルトの名無しさん :2006/11/27(月) 11:48:36
>>108 仕様で最後のslice(-1, 1) でしか無理ってことかな。
>>105 $KCODEをきちんと指定+実行コスト度外視だったら、
arr = str.split(//)
arr.pop
str = arr.join
とか。
112 :
デフォルトの名無しさん :2006/11/27(月) 11:57:28
>>108-109 ありがとうございました。無事できました。
日本語でも一発でできるようなメソッド装備すればいいのに。
>>110 Rubyのstr[-m,n]は「末尾から数えてmバイト目から右→に向かってnバイトを範囲とする」だからね。
直感的には「末尾から数えてmバイト目から左←に向かってnバイト分」だと思うんだが。
>>111 日本語含んだ文字列ではやっぱり正規表現で分割して配列にするしかないのかな。
irb> str="ねこだいすき"
irb> puts str.scan(/(.+?).$/e)
ねこだいす
irb> str2="hoge"
irb> puts str2.scan(/(.+?).$/e)
hog
うーん。
114 :
デフォルトの名無しさん :2006/11/27(月) 13:01:27
文字列を前に追加する場合はどうすればよいのでしょうか? << または + を使って 私は 猫が とても 大好き です という各単語(word)を順次イテレータで追加していくと str = "" str << word で、「私は猫がとても大好きです」という文字列になりますよね。 これを 「です大好きとても猫が私は」のように後ろにあるやつを前にしていきたいのですが・・・
>>114 そのwordを何で保持してるかに拠るだろ。
Arrayならreverseすればいいし。
# self[nth, len]=val str[0,0] = prefix # self[regexp]=val str[/^/] = prefix # sub!(pattern, replace) str.sub!(/^/, prefix)
>>104 db.root?('hoge')を使うしか。
db['hoge']すると例外が発生してほしいってこと?
「トランザクションの対象のファイルを読み込めません」という例外が欲しいんだろう irb> h=Hash.new irb> p h['hoge'] nil これにあわせた動作なんだろうけどな
119 :
デフォルトの名無しさん :2006/11/27(月) 19:35:52
すみません。rubyからshellを使用する場合についてお聞きしたい ことがあります。 環境:ruby 1.8.5 (2006-08-25) [i386-linux] Vine Linux 2.6.16-0vl15 自分は、rubyからshellを呼び出すときShellクラスを使っています。 今やっている事は、あるprogram1で作成したテキストファイルをgnuplot に読み込ませてグラフを自動生成するというものです。 簡単に例を示すと・・・ #Rubyでの処理 ============== ============== ============== #Shellでの処理 sh = Shell.new sh.system("program1") #gnuplot用スクリプトscript1生成 sh.system("gnuplot","script1") #epsファイルを出力する #終了 のようにgnuplotを実行させたいんですが、epsファイルが作成されません でした。しかし、ターミナルから手動でgnuplot script1を実行すると正常 にepsファイルが出力されたので、恐らくsh.system()を呼び出す時のタイミ ングの問題かと思うのですが、詳しい方の意見を頂けたらとありがたいです。 ちなみにscript1を作成した状態でsh.system("gnuplot","script1")だけを実 行させると正常にepsファイルが作成されました。また、sh.system("gnuplot", "script1")の前にsleep()で0.2[sec]ほど待つと正常に出力されるのですが、eps ファイルを作成する数が多いため時間がかかり過ぎてしまいます。最終的にはル ープを使用して複数のepsファイルを作成するので。
120 :
デフォルトの名無しさん :2006/11/27(月) 20:03:02
>>119 system("program1")
system("gnuplot script1")
とか
`program1`
`gnuplot script1`
じゃダメですか?
121 :
デフォルトの名無しさん :2006/11/27(月) 20:41:05
ファイルから読み込む時、そのファイルの最後の行だけ読み込むにはどうすればいいでしょうか。 大きなファイルを扱うのですが、最後の行だけ欲しいのです。 後ろから100バイト読んで、改行コードが無かったらまた100バイト読む。 という感じで出来るかな?と思ったのですが、 「後ろから読み込む」やり方がわからないです。
line = IO.readlines(filename)[-1]
>>122 大きなファイル扱うってかいてるじゃんか。
File#seekで読み込み位置ずらしていくのがベストじゃないの?
>>121 IO#seek(offset, IO::SEEK_END)
あたりが使えそう…だろうか。
まぁ、めんどいことになるのは確かだ。
125 :
121 :2006/11/27(月) 21:26:39
>>125 レシピブックにそういう話が載ってたような気がする
127 :
121 :2006/11/27(月) 23:45:06
>>126 レシピブック、今手持ちに無いので明日見てみようと思います。
それともう一つ問題が。
無限ループしてる訳では無いのですが、巨大なファイルを扱っているので
C:/workshp/test01.rb:142:in `clear': stack level too deep (SystemStackErro
r)
というエラーが出てしまいます。
これについては、
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/29569 これが参考になったのですが、gc.c(rubyのソースですよね?)を変更しないといけないし、
そのあとコンパイルも必要になるので、私が触れるレベルじゃなさそうです・・・。
何か解決策はありますでしょうか。
>>127 普通の手法で書いてる限り巨大なファイルとスタックオーバーフローは全くなんの関係もない。
Rubyがstack level too deepと言うのは、Rubyがバグってないかぎりは関数呼び出しの階層が深すぎる場合だけ。
噛み砕いて言うと、関数から関数を呼び出してその関数から関数を呼び出して、ってのを数千回繰り返すと起きる。
つまり自分が書いてるコードが悪いだけだ。
プログラムをよく眺めて考えろ。頭の中で実行してみろ。マニュアルを読め。
ところどころでpして結果を確かめろ。思い込みでコードを書くな。
あと思い込みで質問するな。
129 :
119 :2006/11/28(火) 01:36:42
>>120 レスありがとうございます。
sh.systemをsystem()もしくは``で置き換えたところ、その症状は改善されました。
ただ、組み込み関数sytem()やバッククオート記法``を使用する場合、Pathはプログ
ラム開始時のカレントディレクトリからの相対パスしか受け付けてくれません。
例えば、
$PWD=top/にいるとき・・・
system("mkdir under/")
system("chdir under/")
system("program1")
system("gnuplot script1")
を行うとtop/under/にではなく、top/にファイル群ができてしまいます。
絶対パスを通せば何とかなりそうですが、後の都合上、相対パスが使いた
い所です。リファレンスなどを当たってみましたが、うまい方法が見付か
りません。カレントディレクトリを変更するのはsystem("chdir under/")
ではダメなのですかねぇ。バッククオートに関しては`cd under/`でエラー
が出てしまい、困っている所です。
度々、質問して申し訳ありません。system()を使った場合、カレントディ
レクトリを変更する方法をご存知の方がいらっしゃいましたら、ご意見を頂
けると助かります。
>>129 system()で呼び出されるシェル環境は呼び出される都度
別のサブプロセスになるんじゃなかったけか。
#だから2番目のsystem()でカレントディレクトリを変更しても
# 3番目以降のsystem()にはその影響が及ばない。
system("mkdir under; cd under; program1; gnuplot script1")
としてみたらどうよ。
いやおれはRubyは知らないんだけどね。
手元の環境では上のようにして動いたぞ。
>>129 system の中身はシェルなんだから chdir じゃなくて cd。
cd 自体の返り値を使うわけじゃないんだからバッククォートじゃダメ。
system("mkdir under; cd under; program1; gnuplot script1")
あ、かぶった。
>>129 どうせプログラムの構造について考えないなら黙ってshでやりゃすぐじゃね?
覚えてて損はないし、生きてるうちは廃れないだろ。
Rubyで1日悩むものもシェルスクリプトで割り切って作ると1時間くらいでできたりするよな Rubyとのインターフェースもファイル作ってパイプとかリダイレクトとかで済んだりする
135 :
127 :2006/11/28(火) 04:59:41
>>128 質問の仕方が悪かったですね。ごめんなさい。
ある研究で、巨大なファイルに10万程度の要素があって、その要素を繋げていくプログラムを作っています。
要素を繋げる為にいくつかの関数を用意してるのですが、関数を1000回程度呼び出した所でstack level too deep
になります。
が、こちらとしては正常な動作なので、もっと要素を繋いで行って欲しい。という訳なんです。
Linuxで動かしてみたら2000回程度呼び出したところでメモリ(2G)から溢れてスワップするようになったので、
仰るとおりプログラムを見直してみようと思います。
Windowsでは、stack level too deepを回避する手段は無さそうですね。
136 :
デフォルトの名無しさん :2006/11/28(火) 06:24:31
呼び出しが再帰になってるんじゃないの? 再帰を非再帰の繰り返しに変更してみな
137 :
119 :2006/11/28(火) 09:43:00
>>130 ,131
レスありがとうございました。教えて頂いた方法で解決しました。
解説をして頂いて、どこが問題なのか理解できました。
fork()は、サブプロセスが立ち上がることは知っていたんですが、
system()がサブプロセスになることを知りませんでした。
>>133 ,134
確かに、最初からshellでやった方が楽だったような気がします。
Rubyで行う処理もあり、shellをRubyから呼び出した方が手っ取
り早いかなぁと最初は思っていたので。
この度は、お手数をお掛けしました。m(_ _)m
mkdir程度なら require 'fileutils'というのもあるがな。
おお、mkdir_p があるのか。
>>135 再度書くがスタックオーバーフローが起こるのは自分の責任。
そもそもスタックがあふれるようなコードを書くべきでないだけの話。
正常な動作というのも勝手な思い込み。
WindowsもLinuxもその他色々もスタックは有限。
書き方が悪ければいずれにせよいつか起こる。
起こるまでの時間が短いか長いかの違いがあるだけ。
winではpython使えってことだな
再帰関数でつないでいってるのかな。
Rubyは8000行ぐらい以上読ませたりすると 行番号がループする って話をどっかで聞いた。RHGだっけ。
[ruby-dev:29569]に、 Windowsなプラットフォームで、実際に使えるスタックを十分使わな いうちにstack level too deepになってしまうという問題が…(略) って話が。
カモン186
>>144 それは本質ではない。
安直にスタック食い潰して死亡するコードはイクナイという話。
50万行程のファイルがるのですが、そのうちの5万行を読み込んで作業する プログラムを作成しています。 流れとしましては、 50万行ファイルオープン ↓ 指定された5万行を配列に格納。 ↓ ファイルクローズ を考えているのですが、配列に5万行を入れて作業するのと 5万行に分割したファイルを読み込むのとではどちらが軽く処理できるのでしょうか? しょうもない質問ですが宜しくお願いします。
>>147 しょうもないと思うなら自分で両方実装してベンチとれや
スタックの残りを意識しないといけないプログラミングを強要するプログラム言語はゴミ とか言ってみる
スタックの残りを意識しなくても書けるプログラミング言語って、たとえばなに?
チューリングマシン?
こういうプログラムを書くとスタックが足りなくなるので注意しましょう というような解説はあってもいいな
>>152 入門書では見たことないな
その辺のフォローはあってもいいよね
チューリングマシンはプログラミング言語ではありません
>150 関数定義もサブルーチンからのリターンもできない言語か ループは大丈夫だとしても、キツいなw gotoまみれになりそうだ 配列で仮想スタック作って自前で管理すれば サブルーチンを扱えるかも知れんが それはそれでどうなんだろうw
スタックレスPythonってあったな。あとレジスタマシンを実装するとか。
brainf**kとかだな。
159 :
デフォルトの名無しさん :2006/11/29(水) 13:27:26
ルートウィジェットを表示せずにTk.getOpenFileできる方法ってありますか? require 'tk' p Tk.getOpenFile だとルートウィジェットが表示されてしまいます。 Tk.messageBox(:icon=>'warning', :type=>'ok', :message=>"Hello") の場合は都合よくルートウィジェットは表示されないのですが, 同じようにできないだろうかと思ってます。
pythonをフィヨンと読んでいた俺 本当はパイソンらしい。
10年以上前に卒論のプログラムPythonで書いたが、 指導教官はぜんぜん言語名をまともに呼んだことがなかった。 「ぺいとん」とか「ぴてぃおん」とか。
どなたか参考になるサイト、TIPSをお教え願います rubyで、画像に文字列を表示したいのですが(サウンドノベルゲームみたいなものの、メッセージが表示される枠のイメージ) また、複数音声のファイル(mp3など)を、ランダムで読み込んで再生といったことをしたいのですが 参考になるようなところお願い致します。。。 vrubyのTIP系はどこをあたればよいのかわからず
>>164 そういうのは、Ruby/SDLとか、Miyakoとか使うんじゃない?
なるほど、そういうものがあったのですね。 プログラムの関係でvrubyだけで実装しようとしております。 vrubyでの実装方法などとかはないでしょうか?
>>166 まあ一度、MIyako使ってみろ。
Windowsでもちゃんと動く。
>>166 SWin::Windowのメソッドをみろ。
使い方は、vr/をdopaintで検索すれば概ねわかるだろ。
音声関係は、VisualuRubyの守備範囲じゃなかろう。
rubygemで gem environment とすると、 $RUBYLIB/rubygems/custom_require.rb:35:in `require': No such file to load -- sources (LoadError) とでてしまいます。 何かヒントでもいいので、ご教授よろしくお願いします。
sources gemはある? ruby/gems/1.8/gems/sources-0.9.0 とか。
171 :
169 :2006/11/29(水) 21:12:16
>170 ないです。
174 :
169 :2006/11/29(水) 22:04:03
すみません。rubygemのintsll errorでした。
>>146 それは本質ではない。
たった1000程度でスタックを食いつぶす実装はイクナイという話。
趣味の言語で何いってんだよ PUSHは男のロマンだぜ
ということ
>>113 > 直感的には「末尾から数えてmバイト目から左←に向かってnバイト分」だと思うんだが。
それは俺の直感には思いっきり反するんだが、どうしてくれる。
179 :
デフォルトの名無しさん :2006/11/30(木) 07:15:21
Rubyで他の関数に配列引数を渡したいときはどうすればいいですか? Cだと int gauss(int A){ hoge } int a(){ int C[10][10],i,j; for(i=0;i<10;i++){ for(j=0;j<10;j++) C[i][j]=1; } gauss(C); } で配列Cの中身はそのまま渡されるんですが・・・
>>179 Cでは関数に配列を渡すというより
単なるアドレスを渡すという事になると思うんだけど。
#include <stdio.h>
int array_size(int *p)
{
return sizeof(p);
}
int main(void)
{
int a[] = {0,1,2};
printf("%d\n", sizeof(a));
printf("%d\n", array_size(a));
return 0;
}
それにそのコードだとコンパイルエラーでしょ?
173ですが
画像に文字を表示させるのは
フレーム型のbitmappanelを下に表示して、文字を出すことでなんとかいけました。
あとは音だけなのですが
ttp://vruby.sourceforge.net/samples.html のマルチメディア再生でいけると踏んでいるのですが
任意のフォルダ以下(sound/○○.mp3)のmp3ファイル(連番)をランダムでENTERを押したときに再生といったことをやろうとしていて
ディレクトリを読み込む段階で倒れてしまいました。。。
ご指導お願い致します。
182 :
デフォルトの名無しさん :2006/11/30(木) 08:52:09
どうやって配列引数渡すのか早く教えろ
>>182 どうして配列が渡せないと思うのか早くコードで示せ
185 :
デフォルトの名無しさん :2006/11/30(木) 09:11:45
配列に対する操作しか乗ってない。 具体的に配列を如何生成するかとか、他の関数に如何渡すのかとか、 添え字はどう参照されるのか基本的なことが何もかかれてない。 これじゃ他言語から新しく覚えたくてもわからん。
186 :
デフォルトの名無しさん :2006/11/30(木) 09:13:12
渡せるコードのサンプルが全然落ちてないから。
187 :
デフォルトの名無しさん :2006/11/30(木) 09:23:36
少なくともCと同じやり方では渡せない。
>>185 def print_array(a)
a.each{|v| print v, ' ' }
end
a = [2,3,4,5,6]
print_array(a)
189 :
デフォルトの名無しさん :2006/11/30(木) 09:57:14
添え字の範囲を間違えていた・・・orz スマソ
>>179 「Cもまったくわかってません。」まで読んだ。
192 :
デフォルトの名無しさん :2006/11/30(木) 13:49:37
勉強のため、rubyでsuffix arrayを作っています。 ---- str = "hogehoge" sarray = Array.new(str.size){ |i| i }.sort_by{ |i| str[i..-1] } sarray.each{ |i| puts str[i..-1] } ---- e ehoge ge gehoge hoge hogehoge oge ogehoge ---- これで動作するんですけど、マルチバイトの場合はもちろん失敗します。 マルチバイト対応で何とかならないですかね?
193 :
デフォルトの名無しさん :2006/11/30(木) 19:14:38
>>192 自己解決しました。
----
str = "ほげhogeほげ"
i = 0
sarray = []
while i < str.size
sarray.push i
if str[i].chr =~ /[\xA1-\xFE]/ then i += 2
else i += 1 end
end
sarray = sarray.sort_by{ |i| str[i..-1] }
sarray.each{ |i| puts str[i..-1] }
----
eほげ
geほげ
hogeほげ
ogeほげ
げ
げhogeほげ
ほげ
ほげhogeほげ
----
単純に2バイト文字の場合インデックスを飛ばせば良いんですね。
str = "ほげhogeほげ" $KCODE = "S" sarray = [] s = str until s.empty? sarray << s s = s.sub(/\A./, '') end sarray.sort! puts *sarray
すみません教えてください。 class A def foo 処理 A end end class B < A def foo super 処理 B end def bar 処理 C end end hoge = B.new で、 hoge.barでBではなくてAのfooメソッドを呼びたいのですが メソッドbarの処理Cは、どのように書けば良いでしょうか。
class A def foo; puts "foo in A"; end end class B<A alias :foo_A :foo private :foo_A def foo; super; puts "foo in B"; end def bar; foo_A; puts "bar in B"; end end irb(main):012:0> B.new.bar foo in A bar in B
def bar a_foo_unbound = self.class.superclass.instance_method(:foo) a_foo = a_foo_unbound.bind(self) a_foo.call end もっと簡単に書けるかしら。
198 :
195 :2006/12/01(金) 10:57:57
>>196 ありがとうございました、できました。
classBでaliasをdef foo〜endの前に記述したのでfoo_Aはオーバーライド前の
classAのfooを示しているという理解でよいでしょうか?
private宣言をする意味が良くわかりません。
199 :
195 :2006/12/01(金) 11:01:29
>>197 ありがとうございます、動きました。
でも、難しすぎてワケわかりません、精進します。
201 :
195 :2006/12/01(金) 11:13:12
aliasの引数はメソッド名が2つ。構文なので区切りの,は入らない。 alias_methodはシンボル2つ。メソッドなので,で引数を区切る必要あり。 なんで二通りあるんだろう。
前者は構文なんだから引数ってのとはちょっとちがう。 二通りある理由は、機能が違うから、としか言いようがないかな。
ifのthenとか省略可能なものって省略した方が処理速度速いんですか?
>198 その通り。 private にしているのは、意図せず foo_A で外から呼ばれないようにしたいなあという意思表示です。深い意味はありません。 ところで、 class C<B def foo_A; puts "foo_A in C"; end end とすると、 irb(main):006:0> C.new.bar foo_A in C bar in B => nil うーん、これはまあ仕方ないが。これ以上頑張るなら>197
207 :
204 :2006/12/02(土) 02:44:54
ロングパスだ
作者著のRubyの本amazonで買った!楽しみだな〜!
210 :
デフォルトの名無しさん :2006/12/02(土) 14:12:30
Rubyの初心者です timesメソッドの中にif文を入れて,もし条件を満たしていれば timesメソッドから抜けたいのですが,どうすればいいのでしょうか。 if文の中でbreakしてもtimesメソッドからは抜けられなかったので質問しました どうかよろしくお願いします
>>210 3.times do |n|
break if n%2 == 1
puts n #=> 0だけ表示される
end
#=> 全体として nil が返る
一体どんなコード書いたんだ?
実はProcess.timesだったとか。
213 :
デフォルトの名無しさん :2006/12/02(土) 19:53:39
csvファイルのレコード数(行数)を簡単に得られるメソッドか方法はありますか? メージ的にはこんな感じ csv = CSV.open('file.csv', 'r') p csv.size ##-> 行数 Arrayにしてから数えるしかないのでしょうか?
>>213 csv を扱うライブラリーに"csv.rb"がある
マニュアルは下記、HPで。( rubyのマニュアルにあるHPはリンク切れ)
http://dev.ctor.org/doc/csv/ 行数だけなら↓のようになるかな
require "csv"
filename = 'hoge.csv'
i = 0
CSV.open(filename, 'r') do |x| i += 1 ;end
p i
それは単にテキストファイルの行数とどう違うの? nlines = open('file.csv').read.delete("^¥n").size 全部読んで、改行以外を抹殺して改行だけになったら文字数を数える。 つーかsystem("wc")するとか…
GNU textutils-2.0.tar.gz の wc.c ---- case '\n': lines++; /* Fall through. */ case '\r': case '\f': if (linepos > linelength) linelength = linepos; linepos = 0; goto word_separator; case '\t': linepos += 8 - (linepos % 8); goto word_separator; case ' ': linepos++; /* Fall through. */ ---- だそうなので、Rubyが自前で\nを数えても wc とやってることは結局いっしょっぽい。 というか、wc だからといって何かすごい小細工があるわけでもない模様。 ファイルを全部メモリに保持するときのメモリの圧迫が気になるなら ファイルを数百バイトずつ読んで捨てつつ改行だけカウントすれば。
地味だね まあ、ファイルの改行をカウントするためだけに ファイル開いて全部舐めてカウントして捨てて閉じるというのは なんとなく無駄というかもったいない感じはしなくもない
>>181 です
>>190 さん、ありがとうございました。
すみません。。。ボタンを押すとフォルダの中のファイル(0000.wav〜0009.wav)をランダムに再生するものを作りたいのですが
Dir.globでの操作が上手くいかず。。。お願いします。
下のはとりあえず、1個ずつ読み込んで再生しようと思ったのですが、最後しか再生されません。
VRMediaViewをmmとして、読み込むファイルをfnとして再生させています
def open_clicked
@mm.mediaclose
dirname = "sound/hoge"
Dir.glob("#{dirname}/*.wav").sort.each do |fn|
@mm.mediaopen(fn) if fn
@mm.play
end
end
これをランダムにしたいのですが、どのようにすればよいのか。。。お願い致します
>>218 ランダムにしたいというのはどういうことなのか考える
次に、ランダムを表現するためのメソッドとかを探してみる
んで、そのメソッドをどう利用すればランダムに「なる」か考えてみる
即っとコード出しちゃう人もいそうだけど
ランダムに選ぶ練習ってしてないのかな? 入門書や解説サイトには必ずある例題だと思うんだけど… 組み込み"関数"の rand を使うと乱数がもらえるぞ
randを使うのは了解しているのですが Dir.globとの組み合わせのところでうまくいかず。。。 それからディレクトリが1個読み込んで再生ではなく、一度に全部読み込んで最後だけ再生となってしまって 色々試行していたのですが、、、助け舟を頂きたく
>>221 君が参考にしてる解説本あるいは解説サイト晒せ(w
p で色々調べるといい。
Ruby では、ドットの「前」にあるオブジェクトがどういう状態になってるか常に意識しれ。
具体的に言うと Dir.glob("#{dirname}/*.wav") がどういう風になってるか p で調べてみ。
調べたら、それをランダムに選ぶにはどうしたらいいか考える。
時間?
時間(笑)
list = Dir.glob("#{dirname}/*.wav") target = list[ (list.size() * rand()).to_i ] p target
ありがとうございますm(_ _)m ソースのとおり変更したら上手くいきました。 ただこれでは自分の身にならないので、どこのサイトで勉強をすればよいのかお教え願えますでしょうか 自分ではこのソースは書けないので。。。 本当にありがとうございました
そこは to_i ではなく truncate と書くべきだと思う つーか rand(list.size) で用済まないか
時間ってw
230 :
226 :2006/12/03(日) 00:08:24
やはり、使い慣れん言語使うと、しくじるな。
>>228 のとおりだ。
truncateってto_iとどう違うの?
>>231 動作は一緒
英単語上のニュアンスの違いしかないんじゃないかな
「整数にする」と「切り捨てる」の違い
"3.14"を3にしたい場合は"3.14".to_i
3.14を3にしたい場合は3.14.truncate
ただ、こういうくだらないとこに拘る奴が中にいるとプロジェクトは混乱する(w
def yomikomi 教えてください。 Ruby/Qteなのですが、 dic = open("/home/zaurus/.anthy/private-dic.src") dictxteuc = dic.read dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC) @dicedit.setText(dictxtu8) #$defaultCodec.toUnicode end とすると、@diceditとしたQmultiLineEditの中の感じがすべて文字化けしています。 なにがわるいんでしょうか?教えてください。 ちなみに/home/zaurus/.anthy/private-dic.srcの中身は、EUC-JPのハズです。
>>226 1.8系だと Dir.glob("#{dirname}/*.wav") はwin環境だとちょっとまずい。
まじでさっさと対応版出して欲しい。
235 :
233 :2006/12/03(日) 00:36:55
すみません。順番がめちゃくちゃだったので、もう一回書き込みしておきます。 教えてください。 Ruby/Qteなのですが、 def yomikomi dic = open("/home/zaurus/.anthy/private-dic.src") dictxteuc = dic.read dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC) @dicedit.setText(dictxtu8) end とすると、@diceditとしたQmultiLineEditの中の感じがすべて文字化けしています。 なにがわるいんでしょうか?教えてください。 ちなみに/home/zaurus/.anthy/private-dic.srcの中身は、EUC-JPのハズです。
>>235 Qte のことは分からんが、どこが悪いか、まずは、各行の後でデバッグ出力出してみろ
(文字化け避けるため、それぞれ別のファイルに出した方がいいな)
まずは「どこ」が悪いのか特定するんだ。
238 :
235 :2006/12/03(日) 01:04:37
それが、エラーは出したようではないのですよ。 出力された物はは確かに思った出力ではないのですけどね。
どこで習うべきなんだろうね、こういうの def errlog(text,name) File.open("/home/zaurus/rubyerror-#{name}.txt",'w'){|f| f.write(text) } end def yomikomi dic = open("/home/zaurus/.anthy/private-dic.src") dictxteuc = dic.read errlog(dictxteuc,'euc') # 確認用出力 dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC) errlog(dictxtu8,'utf8') # 確認用出力 @dicedit.setText(dictxtu8) end こうしてみろってことだろ、要は。 rubyerror-euc.txtがちゃんとEUC-JPかどうか、 rubyerror-utf8.txtがちゃんとUTF8かどうか確かめろってことかね
別にエラーメッセージを出せと言ってるわけじゃない。 dic = open("/home/zaurus/.anthy/private-dic.src") open("1.txt","w").print dic dictxteuc = dic.read open("2.txt","w").print dictxteuc dictxtu8 = dictxteuc.kconv(Kconv::UTF8,Kconv::EUC) open("3.txt","w").print dictxtu8 まぁ、デバッガとか使えば、もっと楽なんだろうがな。
241 :
240 :2006/12/03(日) 01:27:12
くそ、かぶった。はずかし
>>240 は面白い書き方してるな
仮に出力してる感がわかりやすくていい
243 :
235 :2006/12/03(日) 01:36:22
>236, >239 ほんとにありがとうございます。 ちなみに、ファイルは正確に変換されていたようです。 とすれば、最後の方の@dicedit.setText(dictxtu8)と 送られた先のQmultiLineEditのあたりがあやしそうですね。 ちなみに、これが初めてのプログラムなので習うというよりも、 習熟度がきわめて低いのが発想力のなさの一因なのでしょうねorz
>>243 悩め、苦しめ、ジタバタしろ。
それが貴様の血となり肉となる。
orz する必要は全くない。
>>243 QTe のことは分からんが、そのソースで理論上うまくゆく「はず」
ということであれば、環境変数とか設定ファイルとか、
初期化ルーチンあたりで設定するパラメータとかの値が悪いんでないかい?
(そんなもんがあるとしたらの話だが)
>244 ありがと。もう少しがんばってみるよ。 QmultiLineEditクラスは、マルチバイト扱ってくれんのかなぁ。
「QTe 文字化け」でぐぐると何か書いてたりしないかね
>247 それやってみます。m(. .)m
>>237 sjisのbyte目が []{} なんかと被ると誤動作する。
250 :
235 :2006/12/03(日) 02:26:13
解決。 @dicedit.setText(tr(dictxtu8)) ~~~ 翻訳(translate)しなきゃだめだよね。 これ、一回こうなおしたと思ったのに・・・・ みんなありがと。とりあえず寝ます。
しつもーん。 nil.to_s が "" を返すということは積極的に使っていいもんですか? 「キー hoge がハッシュ h に登録されてないか登録されてても値が空("")のとき true」を h['hoge'] == nil or h['hoge'].empty? ではなく h['hoge'].to_s.empty? と書くのは邪悪?
devでnil.to_s = "nil" になるという話が出たり引っ込んだりしてたので やめといたほうがいい。あれは結局引っ込んだのかな。引っ込んだとしても またいつ復活するか分からんしなー。 railsの構成要素である active_support の blank? を使う方がいいかもしれない。 nil, 0, "", [] などに対して真を返す。
げ、0.blank? は偽だった。
すいません。 ミニゲームを作ってHPで公開してみんなに遊んでもらう (javaアプレットのような。)にはどうしたら良いのでしょうか。
勉強すればいいと思う。 「javaアプレットのような」はほぼ不可能。
256 :
254 :2006/12/03(日) 16:53:52
そうなんですか? いっそjavaに乗り換えたほうが楽なのか… ありがとうございます。
257 :
デフォルトの名無しさん :2006/12/04(月) 10:23:11
213の続きです。CSV::to_a.sizeが一番シンプルでスマートのようです。 ところで,to_a,メソッドの振る舞いですが #!/usr/local/bin/ruby require 'csv' outfile = File.open('csvout', 'wb') CSV::Writer.generate(outfile) do |csv| csv << ['c1', nil, '', '"', "\r\n", 'c2'] end outfile.close csv = CSV.open("csvout", "rb") p csv.to_a #1->[["c1", nil, "", "\"", "\r\n", "c2"]] p csv.to_a #2->[] csv.close 上記のように変わってしまいます。これはそんなものなのですか? 「!』がついていないので,変化しないと思っていたのですが,知らないとうっかりしそうです。
そのcsvはFile(IO)のインスタンスなので、to_aはファイルを全部読んで配列にして返す。次の呼び出しではファイル末尾にいるので、空になる。
259 :
デフォルトの名無しさん :2006/12/04(月) 15:27:21
>>251 正確には hash.key?('key') || hash['key'].empty? だけど
このばあいだったらHash#fetch()を使って hash.fetch('key', '').empty?
(ただし hash['key'] == nil ならエラーになるかな)
いちばんいいのは
def nil.empty?; true; end
hash['key'].empty? # nilか空文字列ならtrue
nil.empty? は標準化してほしい。
HTMLコーダーですがイントラネット内で使用する小ツールを作ることになりました。 Rubyを習得して作りたいと思っているのですが、 以下のようなアプリをRuby作ることは難しいでしょうか(向いているでしょうか)? ・作りたいもの HTMLで作られたフォーム部品を選択、もしくは入力して実行ボタンを押すと 入力した内容に沿った形式の帳票を印刷する。(帳票の形式は複数ある) また、印刷履歴を管理し、ブラウザで参照できるようにする。 ・やりたいこと IE6上で動作し、インターフェイスと処理結果はHTMLとCSSで作る。 データ形式はXMLで値の取出しにはXPathを使う。 ・制限 サーバに何かプログラム(例えばApacheなど)をインストールすることは許可されていない。 できればクライアントにも特別何かを導入したくない。(WindowsXP+IE6+ネットワークがあれば実行できるようにしたい) クライアントの環境はWindowsXP+IE6のみ。その他の環境は考慮しなくてOK。 以上になります。
>>260 > サーバに何かプログラム(例えばApacheなど)をインストールすることは許可されていない。
この時点で、ほぼ何も出来ないんだけど。
鯖にはRubyがインストールされていて、CGIとかで動かすことができるの?
鯖スペック詳しく。
> WindowsXP+IE6+ネットワークがあれば実行できるようにしたい
Rubyはどこで動きますか?電子の海で?
HTML+CSSで帳票ってあまり向かないような気がするんだけど大丈夫?
# 日本の帳票は変態仕様が多い
帳票のための入力データはどこから来ますか?
もしXMLなのであれば、XSLTで変換してやればおしまいのような気がするけどどう?
262 :
260 :2006/12/04(月) 21:40:46
>>261 サーバにRubyはインストールされていません。
Exerbというツールでスクリプトをexe形式にすれば
特別実行環境がなくても使えるようなので、
それを使いつつ、インターフェイスなどはIE6上でHTMLとCSSでできたら
効率的かなぁと考えたのですけれどもそんな虫のいいことはできないのでしょうか。
イメージ的には
1.イントラネット上の共有フォルダ上にあるexeを実行。
2.ブラウザが起動してフォームページが表示される。
3.フォームに必要事項を記入して実行。
4.帳票プレビューが表示される。
5.確認して印刷。
CSSならある程度使いこなせるので紙に合わせて作れると思います。
入力データはXMLです。
XPathでデータを取ってきてプログラムからHTMLを書くことを考えていましたが
ページ自体はXSLTで実現させることもできますね。気が付きませんでした。
HTML,CSS,XML,XSLTはそこそこわかるので積極的に利用しつつ
処理の部分でRubyを使っていきたいのですが上記のようなことはできないのでしょうか?
>>260 VBAで印刷や入力補助を小細工したえくせるの帳簿ファイルを
Windowsネットワークの共有フォルダに置いてみんなに共有させる
作れると思います、ではなく実際に作ってみてから言うんだな>CSSで帳簿
net/httpを使ってホームページにアクセスするプログラムを作っているのですが ページによってはCookieが有効でありませんと弾かれてしまう事があります。 これを解決できる良い方法は何かないでしょうか?
クッキーのやりとりがどうやって行われているか調べればよいのでは? etherealでもなんでもいいからパケット覗けばわかるっしょ。
>>262 クライアントにexeを置くだけでは、それは無理。
IEを捨てて、アプリでなんとかするなら可能。
どちらにせよ、Rubyは不向き。
HTMLコーダのチミにも不向き。
JScript or VBScript で HTA あたりを書いとくのが無難でないかい。 まぁ、ActiveScriptingRuby 使えば、Ruby でもできなくはないだろうが、 exerb 使えたっけ?あれ
>>269 仕様を素直に実現するなら、HTAを使うのが正解だと思うんだが、
その場合ActiveScriptEngineとしてのASRをインストールというか
登録する必要がある。
それは問題ないのかねえ?
もし俺がやるなら、2番目のWEBrickでHTTPサーバ立てる、を選ぶな。
楽だし。
>>270 あーそりゃ問題だ。
無理。
実行時に必要なファイルだけインストールしちゃえばいいかも。
272 :
デフォルトの名無しさん :2006/12/05(火) 17:42:22
>* Webrickとかを使ってHTTPサーバとして動作するexeを作る これを詳しく教えてください。
>>272 WEBrickを使ってHTTPサーバとして動作するスクリプトを作る。
そしてそれをExerbでexe化する。
以上。
274 :
デフォルトの名無しさん :2006/12/05(火) 18:08:04
>>273 それはrailsでつくったアプリケーションでもできますか?
>>274 やってる人はいるよ。
Rails製のデスクトップアプリを作った人がいる
276 :
デフォルトの名無しさん :2006/12/05(火) 21:50:21
すまんが教えてくれ棒だす WindowsXPでruby-1.6.8使っててnet/httpsを使いたいんだが Netで探したhttpsサンプル動かそうとすると uninitialized constant Net (NameError) とエラーがでるんだよ。 でNet-1.2.0だかが必要なのかなと(あてずっぽで)思って そいつを探してるんだけど、 これってNet上どこにあってPCのどこにおけばいいの? それともそもそも大間違い? サンプルコードはこれ require 'net/https' Net::HTTP.version_1_2 https = Net::HTTP.new( 'www.foo.var', 443 ) https.use_ssl = true https.ca_file = '/ca-bundle.crt' https.verify_mode = OpenSSL::SSL::VERIFY_PEER https.verify_depth = 5 https.start { |w| response = w.get('/') puts response.body }
opensslとnet/httpsが追加されたのはruby 1.8.0からだな。 どっかに単独配布時代の落ちてればいいんだが、ミツカンネ。 頑張って探すかRubyのバージョン上げてくれい。
280 :
276 :2006/12/05(火) 22:30:38
277,278,279 ありがとう(号泣しそうです にちゃんで久しぶりに親切な人たちを見た!お前ら大好き! 素直に1.8.Xにするずら
281 :
デフォルトの名無しさん :2006/12/06(水) 08:17:37
Ruby始めて1年以上経つんですが、(日曜プログラマです。大学でJavaを軽くやった程度です) 1.ローカル変数、インスタンス変数、(あと、Classクラスのインスタンス変数ですか)、クラス変数のスコープが、 複数ファイルにクラス定義が分割されてたり、 クラスやモジュールがネストされた関係にあったり、 後から特異的に定義されたりすると、何が何かわからなくなってしまいます。 一応、自分なりに、色々動かして、こんな感じじゃないかなぁとは思うようになったんですが 2.このことを、動的言語っていうこととか、宣言文とか、 そういう話も含めて、 こういう原則というか、思想に基づくから、 この変数は、ここまでがスコープなんだよとかいう風に 説明してくれてるような、本とかドキュメントとかないでしょうか。 3.例としては、カプセル化したいから、publicとかprivateとかあって インスタンス変数は、元々privateなんだよ、というような説明があればいいんですが。 こういう理解は、C言語覚えて、ソース読まないといけないんでしょうか。。 それとも、アプローチの仕方が悪いんでしょうか。 読んだ本は以下の感じです。 たのしいRuby(1版)、 Rubyレシピブック Ruby on Rails関連の本
1.2.3.の使い方が意味わからない
咲け〜輪廻のOh〜
>>281 プログラミングRuby第二版言語編
初めてのプログラミング
この二冊は読んでおいて損はないはず
cronからruby/tkスクリプトを動かしてwindowを開かせるには、どうすればいいんでしょう? cronからwindowを開かせるには、例えば xterm -display :0.0 のようにXサーバを指定しなければならないようですが、 その方法が分かりません。
>>287 RubyよりもXの質問になるね。
DISPLAY環境変数exportしておけば?
あと xhostとかで使用許可を出しておかないとたぶん表示させてくれない。
つーかcronからじゃどのDISPLAYに出したらいいか、 そもそもあるのかどうかすらわからんだろう。 ~/.xsessionとか~/.xinitrcあたりで、時間がくるまで眠ってるプロセスでも バックグラウンドで走らすとか。
php5なんて誰も使ってないから
291 :
デフォルトの名無しさん :2006/12/07(木) 18:08:09
292 :
デフォルトの名無しさん :2006/12/08(金) 02:01:33
初心者すぎてすみません。 CSVのファイルを開いて 1,2,3,4 5,,3,6 2,,,3 ↑このように保存されている split使って 1 2 3 4 5 3 6 2 3 のように新しくCSVファイルを作りたいんですけど どうやってやればいいですか? すみません。。。
>>292 まず、p を使ってスクリプト途中のデータの構造や状態を把握。把握したら適当に処理。
宿題っぽいやかん
これでいい? puts File.read('csv').split(/,|\n/)
宿題っぽい質問にはやらしい解法の回答しか返ってきません
297 :
デフォルトの名無しさん :2006/12/08(金) 03:45:11
ちょっとくらい教えてあげればいいのに。 ケチやな。 まぁおれにはできないけど(爆
どうやって新しく "CSV" ファイルを作るんだろう
朝のお祈りを忘れなければできる
>298 結果を新たに作った csv ファイルに書き込むんじゃないのか?
でも csv っていうくらいだから(ry
だよな・・・・
フォルダの最終懇親時間を書き換えようと思って File.utime() を使ったんだけど Permission denied で書き換えられなくてちょっと困ってます。 どうすればいいでしょう。 環境は ruby 1.8.5 (2006-08-25) [i386-mswin32] の win2000 です。
304 :
デフォルトの名無しさん :2006/12/08(金) 23:30:49
クラスメソッドを定義するのに 特異メソッドの定義方法を用いると どうなります? なんか、どこかで見かけた気がするんですが。。
どうなります? とは class << self; endの中に定義するのとの違いは? ってこと?
こういうのを期待しているんじゃないかな。 obj.class.define_method(new_method_name, defined_method)
Rubyではクラスメソッドとは 「Classクラスのインスタンスである何らかのクラス定数」 に対する特異メソッドである。なので、通常の特異メソッドと同様、 def String.new_with_upcase(src) new(src.upcase) end と出来て、 greeting = String.new_with_upcase("hello, world") puts greeting #=> HELLO, WORLD こういう、「書き方」を質問しているのかしらん。
308 :
デフォルトの名無しさん :2006/12/08(金) 23:53:55
309 :
303 :2006/12/08(金) 23:56:51
自己解決しました。 explorerでフォルダ開いてたせいでPermission deniedが出てたようでした。
310 :
デフォルトの名無しさん :2006/12/09(土) 00:01:46
>>304 こんな感じじゃない??
class Example
class << self
def show
puts "SHOW"
end
end
end
Example.show
>>308 forを使った場合、midはforの外も含むスコープに含まれる。
ということは、define_methodに渡しているブロック内のmidもそれになる。
で、for終了時点でmidの中身は:getcなので、せっかく定義した
readもgetsもgetcも、全部getcを呼び出してしまう。
eachを使ってブロックの引数としてmidを使った場合は、
midのスコープはeachのブロック内で閉じる。
だから、define_methodに渡しているブロック内のmidは、
ちゃんとそれぞれ別々の物になる。
言葉で説明するとどうもうまく書けないけど、これで通じるかな?
312 :
デフォルトの名無しさん :2006/12/09(土) 15:10:16
あるページのJAVAスクリプトからデータをサーブレットにPOST?して
検索結果のページを取得したいのですが、rubyではどうすればよいのか
ヒントをお願いします。
************************************************
function postApmtData( actNamS, actMthdS , aptIdS ){
var formC = eval( "document." + frmNamS ) ;
var tempAction = formC.action ;
formC.actNamS.value = actNamS ;
formC.actMthdS.value = actMthdS ;
formC.aptIdS.value = aptIdS ;
formC.action = '
http://xxx.jp/yyy/Servlet/zzz ' ;
formC.submit( ) ;
return false ;
}
************************************************
onClick="JavaScript:postApmtData('ArrNormalSearch'
,'topFromApLst'
,'588');return false;"
313 :
デフォルトの名無しさん :2006/12/09(土) 18:29:52
以下のスクリプトで”不正なアクセスです。”となります… orz require 'net/http' Net::HTTP.version_1_2 File.open( 'result.html', 'w' ) {|f| Net::HTTP.start('xxx.jp', 80) { |http| response = http.post('/yyy/Servlet/zzz', \ "actNamS=ArrNormalSearch&" + \ "actMthdS=topFromApLst&" + \ "aptIdS=588") f.write(response.body) } }
314 :
デフォルトの名無しさん :2006/12/09(土) 19:04:47
getはどうすか
見づらいから ¥ やめれ。その位置ならいらない。
通常の特異メソッド、って何だか変なひびき。
317 :
308 :2006/12/09(土) 21:44:32
>>311 ありがとうございます。
スコープの問題なんですね。
forを使った場合は
readメソッドの定義内では、@input.send(mid,*args)
getsメソッドの定義内では、@input.send(mid,*args)
getcメソッドの定義内では、@input.send(mid,*args)
で、結局 mid は:getc だということでしょうか。
blockを使った場合は
readメソッドの定義内では、@input.send(:read,*args)
getsメソッドの定義内では、@input.send(:getc,*args)
getcメソッドの定義内では、@input.send(:gets,*args)
という風になってるようなんですが、
スコープというより、定義するタイミングの問題でもあるんでしょうか。
ちょっと、理解できなかったですorz
クラスの特異メソッドとインスタンスの特異メソッドはほんとは違うんだけどな。
クラスもClassクラスのインスタンスなんだから、 同じなんじゃないの?
特異クラスの作られ方とかが違う気がするが複雑すぎてわからん
321 :
311 :2006/12/10(日) 05:19:57
>>317 いや、スコープのせいで、forの場合のmidは全部同じ変数、
eachの場合のmidは3回繰り返すそれぞれで別の変数、になってる。
だから、forの場合は最後にmidに代入された:getcがmidの値になるし、
eachの場合はそうでない。
>>318 クラスの特異メソッドは継承されるとかそういう話?
string::index や string::gsub が HTMLコメントの<!-- -->を無視するんですが どうすれば検索できるんでしょうか?
326 :
323 :2006/12/10(日) 18:58:45
スクリプト"index.rb" f = open("index.html","r") d = f.read f.close p d.index("<!--link_file-->") p d.index("<--link_file-->") gets 検索するファイル"index.html" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>Ruby</TITLE></HEAD> <BODY> <CENTER> <TABLE border="1" cellspacing="0" cellpadding="0"> <TBODY> <TR> <TD width="200" colspan="2"><--link_file--></TD> <TD width="590"><!--file_data--></TD> </TR> </TBODY> </TABLE> </CENTER> </BODY> </HTML> 結果 nil 225
327 :
323 :2006/12/10(日) 19:00:25
ああ!まちがいました。これ違いますorz
328 :
323 :2006/12/10(日) 19:02:38
サンプル作って検索したら成功します・・・ 別の問題かも・・・ごめんなさい・・・あぁ
329 :
323 :2006/12/10(日) 19:18:08
原因わかりました 検索する前に置換しちゃってました・・・
おもろいなおまい。
331 :
デフォルトの名無しさん :2006/12/10(日) 23:13:54
string = "ajtalktjalgjalkjclkklfgjaklgajkltatataagagagaga" このような文字列があったとして string[num - 10,10] このようにして配列を抽出するとき、numが10だと10から10個手前の文字10文字を抽出しますが numが1だと-9,10 numが7だと-3,10となり後ろから数えた文字を抽出してしまいます。 そうではなくて、numが7だとすると 7から10個手前の文字といきたいところですが 10文字もないのである分の7文字を抽出するにはどうしたらよいのでしょうか? 普通に、[num - 10 ,10] のようにやるとnumが10より小さいと[-3,10]のようにマイナス指定になってしまいます。 マイナス指定するのではなく、10より小さいとnumから10までの文字を抽出するようにしたいのです。
string[(num - 10).abs, 10] でいいのかな?
あああ、10-numじゃなくてnumそのものなら場合分けするしかないね。 string[ num < 10 ? num : num - 10, 10]とか。
質問です 渡された引数が true か false ならそれをインスタンス変数に保存し それ以外(nilも)なら例外を出す って処理を書きたいのですが def test(b) if b == true || b == false then @b = b else raise TypeError end end って冗長な気がします。 TrueClass と FalseClass を纏めるクラスもなさそうなので クラスでの判別にすると更に冗長になりそうですし。 短い書き方無いでしょうか?
string[[0,num-10].max, [10,num].min]
あるいは string[0...num][/.{0,10}$/] かな。
>335 [true, false].include?(b) くらいかな。 しかしたぶん、そのような処理を書かなきゃならんという考えが 何かの間違いだと思う。
>>338 うむ
いっそ全体を書き直したほうが今後のためにもいいかもしれん
習作的なものや作り始めたばかりなのなら思い直せ
>>331 --- [nth, len]
nth バイト番目から長さ len バイトの部分文字列を返しま
す。nth が負の場合は文字列の末尾から数えます。
nth が範囲外を指す場合は nil を返します。
ということなので、何か根本的な勘違いしてないかい?
irb(main):004:0> 'abcdefghijklmnopqrstuvwxyz'[0,10]
=> "abcdefghij"
irb(main):005:0> 'abcdefghijklmnopqrstuvwxyz'[10,10]
=> "klmnopqrst"
# 文章で説明するよりもテストコードなり何なりで期待する結果を書いた方が
# いいような気がする。
342 :
デフォルトの名無しさん :2006/12/11(月) 00:33:42
if ARGV.empty? $stderr.puts "引数なし" exit 1 end これを設定したのですが、 ruby プログラム 引数1 引数2 でプログラムが正常に動作するプログラムを付くっ単おですが 引数2 を指定せずに実行すると 引数なし と設定したエラーが出ずに 引数2がないため開けないので別のエラーがでます。 if ARGV.empty? どうやらこれでは第1引数だけしか判断しないようなので ARGV[0] ARGV[1] をそれぞれif文で指定したのですが、できませんでした。 一括で、引数のempty? の判定をする方法はないのでしょうか? よろしくお願いします。
>>335 module BoolClass; end
class TrueClass; include BoolClass; end
class FalseClass; include BoolClass; end
def test(b)
@b = b if b.kind_of?(BoolClass) or raise TypeError
end
>>342 まず、一括で引数のempty?ってのはなんか誤解してる気がする。
ARGVってのは配列で、ARGV.empty?ってのはその配列の中に
何かが入っているかどうかを判別しているんだよ。
だから、引数がまったく与えられなかったときにtrueになる。
よくわからんけど、引数の数が丁度2のときに処理をするの?
だったら、
raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2
とかやった方がいいんじゃない?
>>331 len = [num, 10].min
string[0..num-1][-len,len]
>>342 最初に
p ARGV
としたらどうなるか?
あ、345はナシ 引数の数(ARGV.size == 2)で調べるところだね、これは。
345じゃない346 連投スマソ
よくオブジェクトの初期化とかで obj.new(:foo => "hoge", :bar => "hage") とかの先頭にコロンついた変数名をよく見るのだがこれって何? 単なる習慣?
コロンがついているのは変数名ではない。Symbolのリテラル表記だ。 obj.new(:foo => "hoge", :bar => "hage") は obj.new({:foo => "hoge", :bar => "hage"}) と書いたのと同じ意味だ。つまり、obj#newにHashを渡している。 で、なぜSymbolオブジェクトをHashのキーにしているかというと、 ・タイプしやすい。文字列に比べて1文字少なくて済む obj.new("foo" => "hoge", "bar" => "hage") とタイプするよりは楽だということ。 ・Symbolの方がStringよりも生成時に性能的に有利。 Symbolは内部的には整数で表されてるんで。 ということかな。まあ慣習で強制されているものではないので、 SymbolではなくStringをHashのキーに取る実装もあり得るし存在している。
>>350 とんくす。Rubyはタイプするときに楽という理屈でわかりにくい記述があるから困る
>>351 Symbolのリテラルは見慣れないとぎょっとする表記だけど、
慣れたらなかなかいいもんですよ。ここは慣れですw
353 :
335 :2006/12/11(月) 09:49:33
>338-343 うーん。コードが長くなってきて クラスの海をどう渡ろうかなと。 それでちょっとだけ型判定を。 その後true/falseでなく専用のクラスを作り そのインスタンスを2つ作り定数にしました。 いっそこうなったらトコトンやろうかと。 クラスを以てクラスを制すつもりで。 中途半端に組み込みクラスを使うより むしろ判りやすい気がしました。
335で冗長なんて思ってたらなにもできんよ
たかだか1バイトじゃねーか、とは思うが、Lispかじってると なにかとシンボルを使いたくなる。
356 :
デフォルトの名無しさん :2006/12/11(月) 11:56:46
文字列をIOストリームのように扱うことってできないでしょうか? 例えば、ネットワークから読み込んできた文字列 sを、 s.read(2) などのように、先頭から順番に読み込みたいのですが。 今は、 value = s[index] index += 1 などのようにしていて、面倒です。
358 :
デフォルトの名無しさん :2006/12/11(月) 12:11:50
>>357 おお。ちゃんと用意されているのですね。
ありがとうございました。
359 :
デフォルトの名無しさん :2006/12/11(月) 12:35:05
s = File.read('file') #ファイルが空の場合もアリ a, b = s.split(//) print(a, b) a,bにnilが代入された時は「空文字列」を設定したいのですが 何かエレガントな書き方はありますか? とりあえず今は、1つずつ a = a || ''; b = b || '' みたいにやってるのですが、変数の数が増えると大変なので もっと簡潔に書ける方法があると良いのですが。
print "#{a}#{b}"
a, b = s.split(//) + [ '', '' ] でいけるのかな。 あと a = a || '' は a ||= '' とも書ける。
362 :
デフォルトの名無しさん :2006/12/11(月) 13:24:58
>>360 こんな場合にエラーなく処理させたいんです。
今は分割した物を、その都度 a = a || '' みたいにしてるんですが…
s = File.read('file') #空の場合もあれば 'w x|y z' みたいな場合もあり
a, b = s.split('|')
c, d = a.split(' ')
e, f = b.split(' ')
print(a, b, "\n", c, d, "\n", e, f, "\n")
>>361 おおっ、エレガントだ!
ありがとうございました。
(a ? a : "").split(' ')
>>364 そういう方法もありますね。
一つ勉強になりました。
366 :
356 :2006/12/11(月) 13:39:44
StringIOを使っていたのですが、ちょとハマってしまいました。 文字列、といっても中身はバイナリデータなのですが、 6A 0D 0A 00 00 51 のようなデータの場合、 seekや、readなどで、0Dが飛ばされて処理されてしまいます。 たぶん、0D0Aが改行コードと認識されているのですが、 飛ばされないようにするというか、バイナリとして扱うことはできないのでしょうか?
367 :
356 :2006/12/11(月) 13:46:06
binmodeも試しましたが、駄目でした orz もしかしたら、根本的な問題なのですが、 バイナリファイルを扱うのに、StringIO(IOストリーム)は向いていなかったりしますか? 今は、seekとreadなどで、読もうとしています。
うちでは\rも\nも普通に扱えてるけどなぁ。 ファイルから読み込むときに既に\rが落ちてしまってるとか言うことはない?
Windows上で、元ファイルのopenのときにバイナリモードにしてないとか。
ああ、ごめん。ネットワークとかから元データ取ってくるのか。
371 :
デフォルトの名無しさん :2006/12/11(月) 14:04:41
すみません、もう一つだけ。 教えてもらった事を参考に↓みたいにしたのですが エラーなく処理させるには、これがベストでしょうか? s = File.read('file') #空の場合もあれば 'w,x|y,z' みたいな場合もあり a = s.split('|') c, d = (a[0] ? a[0] : '').split(',') + ['', ''] print c, d
372 :
356 :2006/12/11(月) 14:05:53
元データは、open-uriのopenで取ってきたデータなのですが、 ファイルに出力すると、ちゃんと 6A 0D 0A 00 00 51 になっていました。 ですが、StringIO経由だと、 6A 0A 00 00 51 になってしまいます。 うむむ
373 :
371 :2006/12/11(月) 14:10:29
File.read('file') で読み込んだデータは 'a,b|c,d|e,f|g,h|..' みたいにずっと続くので 最初の分割は a = s.split('|') みたいに配列にしないとマズイです。 x, y = a.split('|') みたいにするとマズイ。
374 :
356 :2006/12/11(月) 14:13:47
# ファイルからバイナリモードでopenした場合 io = open(OUT_FILE + ".bin", "rb") # StringIOで、Openした場合 # io = StringIO.open(s, "rb") value = io.read(4) puts sprintf('%x %x %x %x', value[0], value[1], value[2], value[3]) io.close やはり、ファイルからバイナリモードで読み込んだときと、StringIOでOpenしたときと 挙動が違いますね。 これって仕様でしょうか? 一旦ファイルに落として、再度読み込むのを許容するしかないですかね?
>>372 Windowsだと、binmodeで書き出ししない場合
勝手に\nが\r\nに直されてしまうから p sでチェックしてみて。
376 :
356 :2006/12/11(月) 15:25:45
>>375 あ、ファイルに書き出した時点で、\nが\r\nになっているというお話ですか?
か、確認しました!
バイナリモードで書き出したら、\nが\r\nになっているだけでした。
つ、つまり・・・
6A 0A 00 00 51
で、正しいです。StringIOは悪くないです。
俺が悪かったです orz
377 :
356 :2006/12/11(月) 15:26:18
> バイナリモードで書き出したら、\nが\r\nになっているだけでした。 バイナリモードで書き出したら、\nのままでした。
わざわざファイルに書き出さなくても p obj で、objのRubyの内部表現が見られるよ。
379 :
342 :2006/12/11(月) 19:25:04
何かよくわからなくなってきたので整理します。 引数がないままプログラムを実行するとエラーがでますよね 引数が1つしか指定しない場合だと、 if ARGV.empty? で引数が入力されない場合に putsしてエラー文を出力します。 でもこれだと、コマンドラインから入力する引数(ファイル名など)が2つある場合だと この文では、putsのエラー文ではなく、デフォルトのエラーが出てしまいます。 この2つや3つ目の引数をコマンドラインから入力するとなると、 引数が入力されなかった場合や、引数の入力が足りない場合 どのようして、指定のエラー文を出力すればよいのでしょうか?
>>379 引数の数は丁度2個欲しいのか、丁度3個欲しいのか、
最低2個は欲しいが3個目も受け付けるのか、
それ以外なのかはっきりしろ。
それと
>>344 は試してみたのか?
381 :
342 :2006/12/11(月) 19:35:29
>>380 必要な引数は2つです。でも、3つや4つも一度にできるのであれば知りたいです。
引数はいずれもファイル名です。
>>344 についですが、
raise 'usage: ruby プログラム 引数1 引数2' if ARGV.size != 2
引数は入力毎に異なるのでプログラム中に記述できないような気がするのですが・・・
ARGVは配列で、でもって配列のempty? は 配列そのものに要素が「1つでも」あるのか、全くないかを判定するためのもの。 それぞれの要素が存在するかを知るためのものではない。
>>379 optparse使え。
または、 p ARGV しながらプログラム書け。
>>381 わかった。親切にメッセージを出した方がいいと考えたおれがバカだった。
raise if ARGV.size !=2
これでどうだ? 引数の数が丁度2でなかったときは
例外を上げてプログラムを終了する。
def main(argv) raise if argv.size != 2 arg1 = argv[0] arg2 = argv[1] # 処理 end if __FILE__ == $0 main(ARGV) end
unless ARGV.size == 2 だとRubyっぽい。
>>381 >引数は入力毎に異なるのでプログラム中に記述できないような気がするのですが・・・
…新手のギャグ?
つprintf
つ式展開
388 :
342 :2006/12/11(月) 22:58:59
>>384 raise if ARGV.size !=2
$stderr.puts "引数なし"
exit 1
end
文法エラーとでたのですが・・・
そのendは、以上という意味だ。
390 :
342 :2006/12/11(月) 23:18:00
でもそうしないと、exit 1でどのみち終わるのでは??
えーと、どういう答えが欲しいんだ、こいつは。
常識的に考えてわかるだろ
393 :
342 :2006/12/12(火) 00:14:22
どうやったら>
>>388 のendをなくして実行したところ
unhandled exception
とエラーがでています。まだおかしいみたいです
それはそれで正しい。rescueしてないから最終的にエラーとして 報告されてるわけ。
395 :
342 :2006/12/12(火) 00:19:27
なるほどレスキューが必要でしたか。すみません。 empty?でやってたときはrescueがいらなかったので・・・
abort "引数なし" unless ARGV.size == 2
>>350 あと、キーにシンボルを使うとキーと値が視覚的に区別しやすい。
構文強調をサポートしたエディタではなおさら。
398 :
デフォルトの名無しさん :2006/12/12(火) 00:41:47
>>397 それありますねー。
結構でかい。
そういや、Railsで、シンボルと値の組のハッシュを多用しますけど、
シンボル名を間違えまくる。
それでも動いたりするんですが、
これはRubyの宿命ですか?
399 :
デフォルトの名無しさん :2006/12/12(火) 00:46:45
何が言いたいかって言うと、↓Adaの仮引数みたいに、 Put(Item => 1 + 1, Width => 3); したいのでしょうけど、記述ミスが痛いということでせう
>>395 で、beginつけずにrescueだけつけて、
文法エラーがでてしまいました、とか言い出しそうな悪寒
>>398 シンボルはリテラルなのでRubyに限らず間違えても(ry
補完機能つきのエディタ使えよ。
Ruby書くのに最適な補完機能つきエディタってあります? 予約語だけじゃなくて、変数までカバーしてくれるやつ。 今はeclipseのrubyプラグインを使ってるんですが、 補完機能が貧弱なので。
403 :
デフォルトの名無しさん :2006/12/12(火) 19:58:03
Railsいじってたときに、RadRails使ってたけど、やっぱり、補完は貧弱ですよね 厳密な補完じゃなくていいなら、(単語レベルなら) xyzzyのRuby-modeかな。 でもこちらもオマケという程度です。 emacsとかのRuby-modeはどうなんかね?
404 :
デフォルトの名無しさん :2006/12/12(火) 20:01:19
たのしいRubyを読んでいます これの次に読むべき本は何ですか? RubyはWebアプリのための開発言語でしか ないのでしょうか? 何か画期的な使い道はないんですかね? Linuxとかでsedやawkにとって変わるものでしょうか
>398 ある程度決まっているなら 使うシンボルを全部モジュール定数に入れておく。 実際にハッシュにアクセスする時は定数を指定。
406 :
デフォルトの名無しさん :2006/12/12(火) 20:07:04
>>404 Windowsで、sedやawk知らんから、ruby便利に使ってます。
Rakeやら、テキスト処理から、ネットからのデータのダウンロードまでないと、
おれは死ぬ。
sedやawkに取って代わるものではないと思うよ。 sedやawkが他に取って代わられるようなものなら、とっくに取って代わられてるわけで。
>>402 RDEはどうかな。
予約語と変数(というか編集中バッファ内の単語)両方を候補に出す。
メソッドの補完がイマイチだけど。
>>407 真理
まあ、RubyをPerlに代わる標準スクリプト言語として採用しようとした
Linuxディストリビューションが過去存在したが…
410 :
デフォルトの名無しさん :2006/12/12(火) 20:19:25
>>406 ネットからのデータのダウンロードなども
できるのですか もっと勉強してみます
ソケット通信とは違うんですよね?
>>407 RubyはRubyで勉強していけばいいですね
普段はC使ってます。まだ目標が無いのですが、色々な言語を
知りたいと思いRubyにしました。フリーだしオブジェクト志向で良い材料だと
思ってます。
411 :
デフォルトの名無しさん :2006/12/12(火) 20:28:32
バイナリファイルの読み書きを楽にする方法ってないですか? 今は、読み書きに以下のように書いています ioは、openで開いたものです。 def read_word(io) value = io.read(2) return (value[1] << 8) + value[0] end packとか使うんだろうか
412 :
402 :2006/12/12(火) 20:34:04
>>403 xyzzyのruby-mode、使ってました。emacsのruby-modeは
よく知りませんが、最近バージョンが上がったんだっけ。
>>408 RDE、なぜか忘れていました。使ってみます。
海の向こうではTextmateの人気が高いようで。うらやましい。
TextMateの本(PragProgの)を読んでるけど、略語展開と補完だけでは万全ではないな。 いまのところ日本語は普通には打てないしシェアウェアだし。 シンボル補完 一部タイプしてESC、複数候補はESC連打 対象は現在ソースにあるシンボルなので、 s = file.read s.indESC #=> s.index() なんてことはできない。 型が字面からわかりづらい言語で、現在の型にあわせて補完やるのは難しいだろうなー。 略語展開 たとえばeawiTABとタイプすると each_with_index { |e,i| } # eが選択された状態 になる。 おまけながら、その場でCtrl-{すると each_with_index do |e,i| TAB end になったりする。
414 :
402 :2006/12/12(火) 20:54:11
> TextMateの本(PragProgの)を読んでるけど、 へー、そんなのあるんですね。 > いまのところ日本語は普通には打てないしシェアウェアだし。 後者はいいけど、前者は痛いですね。でも、なんかすごい 使いやすそうなのは分かりました。どっちみち、macもってないん ですけど。 今思い出しましたが、RubyCLRの作者の人が、かなり 使いやすそうな環境を自慢してる動画を見たことがある。 あれ何だったっけ。
>>411 読むほうはunpack、書くほうはpackだね。
418 :
デフォルトの名無しさん :2006/12/13(水) 10:29:40
すげーはすげーけどキッチンと食卓つきトイレのようなすごさだなw
Emacsは、ほら、キッチンシンクの権現(権化)ですから。
begin raise if ARGV.size !=2 rescue Errno::TypeError $stderr.puts "引数なし" exit 1 end これやるとまたエラーがでたのですが、いわれたとおりにしたのに・・・ uninitialized constant Errno::TypeError (NameError)
if ARGV.size != 2 STDERR.puts "usage: #{$0} arg1 arg2" exit false end
Errno::TypeErrorが間違ってるな。 引数なしのraiseであがる例外は何? それをrescueしましょう。 意味的には ArgumentError なんだろうか。コマンドライン引数って。
引数なしなら これをしているので指定のエラーがでます begin file = open(ARGV[0], "r") file2 = open(ARGV[1], "r") rescue Errno::ENOENT, Errno::EACCES print("ファイルが存在しないかアクセス権限なし\n") exit 1 end
「コマンドライン引数がない場合」という意味じゃなくて、
raiseに引数がない場合なんだが。
例外やめて
>>422 のように書いてもいいよ。
ruby1.9からfd passingができるっていう話を人づてに 聞いたんだけれどどなたか詳細ご存知ですか? リファレンスマニュアルをググってみたんだけど見つからなくて・・・
>>424 引数が無いならはARGV == [ ]
だもんでARGV[0]や[1]はnil
openはString、Stringにできるモノ以外が来たから
TypeErrorをあげる
>>421 > これやるとまたエラーがでたのですが、いわれたとおりにしたのに・・・
お前、レスをまともに読んでないだろ。
TypeErrorはいいけど、Errno::TypeErrorはナシな。
読む能力がないんだろう
そもそも読む気がないとか。 質問のようにみえるが、実はただの独り言。
432 :
デフォルトの名無しさん :2006/12/14(木) 16:21:29
433 :
デフォルトの名無しさん :2006/12/14(木) 16:28:34
capistrano(旧switchtower)を使うと、ローカルでコマンド一発たたくだけで、 リモートで、 鯖停止メッセージを表示させて、 新バージョンをチェックアウトして、 リンク張り替えたりして、 データベース更新して、 アプリ再起動して、 鯖停止メッセージをしまう なんていう定型タスクを実行できる。
435 :
デフォルトの名無しさん :2006/12/14(木) 18:25:05
ERBを使っているのですが、 <% if hoge %> ほげ〜 <% end %> ってやると、 (改行) ほげ〜 (改行) になってしまうのですが、何とかする方法はないのでしょうか? <% if hoge %>ほげ〜<% end %> とするしかないですか? eRubyの?方は、 % if hoge ほげ〜 % end とすれば、いいのですが・・・
436 :
デフォルトの名無しさん :2006/12/14(木) 18:34:23
>>435 ERBのtrimmodeを"%"に指定したら、
% if hoge
も認識してくれました。
ありがとうございました。
閉じるほうを -%>とする手もある。
るびま17号の標準添付ライブラリ解説を読むといいよ。 アレはわかりやすい。
ruby 1.8.5 (2006-08-25) [i386-mswin32]にアップデートしたのですが、 1.8.4まで正常に動いていたコードの挙動が変わってしまいました。 どうも、-Kuの時の挙動が変わってるようなのですが…。 以下のサンプルは、すべて「サル」とテキストに出力するはずのものですが、 f_utf16.txtは「サ」になってしまいます。 1.8.4にするか、1.8.5でも-Keにすると「サル」になります。 #!/usr/bin/ruby -Ku require 'iconv' utf8_to_utf16 = Iconv.new('UTF-16LE', 'UTF-8') # zenkaku katakana "saru" utf8str = [0xe3,0x82,0xb5,0xe3,0x83,0xab].pack("C*") utf16str= utf8_to_utf16.iconv(utf8str) formated_utf16str = format("%s",utf16str) open("utf8.txt","wb").write(utf8str) open("utf16.txt","wb").write(utf16str) open("f_utf16.txt","wb").write(formated_utf16str)
440 :
439 :2006/12/15(金) 15:58:50
挙動変更に関するアナウンスが出てたりしますでしょうか。
こんにちは。 rubyのhttpライブラリでクッキーの扱いはどうなってるのでしょうか? ページ上のボタンをクリックしてページを開いていくのですが、どうも クッキーを処理できてないみたいで、ブラウザでクッキーを拒否したときと 同じページを取得してしまいます… orz Net::を使って一から書かないとだめなのでしょうか?
>>441 一から、というか、普通にヘッダを処理すればいいと思うよ。
>>439 単にバグ。[ruby-dev:29952] を参照。
ruby_1_8では直ってる。ruby_1_8_5では直ってない。
http.getで取得したbodyを正規表現で処理したいのですが、 どうも漢字をうまく扱うことができません。 #! ruby -Ks や $KCODE = を使い読んでみましたが一致しません。 ほかに行わなければならない処理があるのでしょうか? どうぞ宜しくお願いします。
bodyを文字コード変換してやって bodyと正規表現の文字コードを合わせないとダメなんじゃん?
なるほど。 正規表現文字列に対しても文字コード変換という発想がありませんでした。 試してみます。 ありがとうございました。
447 :
デフォルトの名無しさん :2006/12/16(土) 15:18:35
Javaだとパッケージで名前空間を分ける文化があるけど Rubyのmoduleで名前空間分けるってアリなの? ↓みたいな module Hoge module Piyo module Foo module Bar class SampleClass end end end end end
複数クラスをまとめることはある。 module M class A ... end class B ... end end
module Hoge::Piyo::Foo::Bar class SampleClass end end
451 :
デフォルトの名無しさん :2006/12/16(土) 16:58:37
前に、cygwinとmswin32版rubyを混在していると、 cygwinのターミナルで irb が、 /usr/bin/ruby: no such file to load -- ubygems (LoadError) と吐いて動かないという話をしました。 これの、原因がわかりました。 mswin32版は、One-Click Ruby Installer for Windowsでインストールしていて、 RUBYOPT=-rubygems を設定しているせいでした。 unset RUBYOPT で、cygwinのirbが動いてくれました。 bashだと、.bashrcに、 alias irb='unset RUBYOPT; irb' と書くと便利です。 そのせつは、お騒がせしました。
452 :
デフォルトの名無しさん :2006/12/16(土) 17:43:52
rubyのエディタとして、RDEを使ってみているのですが、 Ctrl+Backspaceとかで、単語削除はできないのでしょうか?
454 :
デフォルトの名無しさん :2006/12/16(土) 18:04:51
だめだ・・・ RDE、保存後にアンドゥーもできないし、実用には遠い・・・
eclipseのrubyプラグいんつーのもあるね。 eclipseの使い方知らないから使ってないけど。
>>454 自分はRDE使ってるけど、使用し続けると、数時間後にリソースエラーとか何とかで固まるのと
保存後にアンドゥーができないのは確かに辛いよね。
HDDにファイルごと履歴残してないんだろうか。
457 :
デフォルトの名無しさん :2006/12/16(土) 18:46:53
自動リファクタリングできるやつない?
458 :
デフォルトの名無しさん :2006/12/16(土) 18:56:42
hoge.map{ |i| result += i }
をもっと短く書きたいのですが、
inject?
>>457 なさそう・・・
459 :
デフォルトの名無しさん :2006/12/16(土) 18:57:23
あ、 hoge.inject{ |i, j| i + j } か。
RDEはツールバーの位置をちゃんと保存してくれれば 使いたいんだけどなー。 そんな漏れはJmEditor。TeraPad以外でシンプルないい エディタないかな?
俺はずっとサクラエディタだが 文字列や正規表現のリテラルに結構困る それが無ければなー PeggyPad は文字間の調節が出来なくて 太字の単語が潰れる…
>>461 自分も、PHPとかPerlとか他のスクリプトは
全部サクラエディタ使ってる。
単語の補完も出来るし、登録しとけば
パラメータヒントとかも出せるからそれなりに便利だし。
初歩的な質問なんですが ファイルのコピーってどうすればいいんでしょうか テキスト系なら↓でコピーできるんですが、画像ファイルは途中で途切れてしまいます def copy(inf,ouf) dat = File.open(inf , "r") {|fr| dat = fr.read } File.open(ouf , "w" ) {|fw| fw.write dat } end
バイナリモードでオープンすればいい。 def copy(inf,ouf) File.open(ouf , "wb") {|fw| fw.write File.open(inf , "rb"){|fr| fr.read } } end でも、File.copy(from, to) 使っても同じようなことができるよね。
ありがとうございました。 バイナリモードで無事成功しました。 今までFile.copy(from, to)がなぜかエラーだったんで自作してたんですが さっきrequire 'ftools'が必要な事に気づきました。
fileutilsつかえyo。
FileUtils.copy_file(from, to)
軽いエディタならnotepad++とかどうかな?
* Rubyは最強の言語(のひとつ)である * Rubyユーザは少数派である * 大衆はRubyを(いろんな理由で)受け入れられない * 現在、Rubyを受け入れられるのは「選ばれた人々」である * つまり、彼らはある意味「選民」である * しかし、選民意識をあまり吹かせると、ますます大衆から受け入れられない * 結果としてますます選民になる(悪循環の予想)
プログラムのひとつもかけないようなやつの戯れ言を聞かされるのはたまったもんじゃないねw
471 :
デフォルトの名無しさん :2006/12/18(月) 12:17:35
>>470 あなたのレスはRubyコミュニティーをみごとに象徴したすばらしいレスです。
換言 プログラムを書いたことのない初心者はお断り。
べーつにー、ただ書いたこともないくせに偉そうなこというやつはお断り。 偉そうなんだよねえ。
どんだけエスパーなんだよ
へ。「偉そう」って評したのがエスパーなの? なんで?
476 :
デフォルトの名無しさん :2006/12/18(月) 12:32:56
キチガイ来た
まぁプログラミングの勉強をもうちょっと頑張ろうよとw
* 現在、Rubyを受け入れられるのは「選ばれた人々」である * つまり、彼らはある意味「選民」である * しかし、選民意識をあまり吹かせると、ますます大衆から受け入れられない * 結果としてますます選民になる(悪循環の予想)
今は開発陣がRuby使ってないのが問題だから
確かに初めてのプログラミングでRubyをやるっていうのは 向いていないような気がする。 むしろRubyには、プログラミングの概念くらいは理解しているな?的な 良くも悪くもUnix思想を受けているんじゃないかな。
換言 Windowsしか使ったことのない初心者はお断り。
perl++
* プログラマは(コンピュータを使う場合は)最強の職業(のひとつ)である * プログラマは少数派である * 大衆はプログラミングを(いろんな理由で)受け入れられない * 現在、プログラミングを受け入れられるのは「選ばれた人々」である * つまり、彼らはある意味「選民」である * しかし、選民意識をあまり吹かせると、ますます大衆から受け入れられない * 結果としてますます選民になる(悪循環の予想) スレ違いゴメス。
本スレ荒れたからこっちに住み着いたのに…。 勘弁してもらえないだろうか
サクラエディタ使いだったが色々使ってみた。 JmEditor は良さ気だな。乗り換えようか。 Notepad++ は色分けの自由度が低いし 何より改行とタブの記号が自己主張しすぎてて嫌だw
>>484 御大自ら次々にネタを投下してる言語なんだから仕方ないだろ。
修行だ、信仰心が問われているんだと思って我慢しろ。
Jm使ってると書いた香具師だけど、俺はNotepad++にしようと 思ってる。ランチャー機能付いてるし、設定も簡単でイイ! 勘違いかもしれないけど、改行マークは最初から色ついてなかった ような。とりあえずタブ記号は、スタイル設定ダイアログのGloba Styles ->Indent guidelinestyleで両方の色をデフォルトの背景色にすれば 消えるよ。 Notepad++教えてくれた人アリガトン。
そんじゃあ、SciTE はどう?
489 :
487 :2006/12/18(月) 17:21:17
Notepad++のタブ記号表示の設定方法は間違いだったスマソ。 改行とタブの表示の有無は表示メニューから切り替えるだけでOK。
490 :
485 :2006/12/18(月) 17:50:57
>487 違う違う。 俺は改行記号とタブ記号は表示されないと嫌なの。 でも、あくまで主役はコードであって欲しいから 目立つ改行・タブの記号は嫌なのさ。 極限まで薄い色にしたら一応見れた。…今度は見辛いが。 …これ設定ムズいな〜。 黒基調の設定がデフォで入ってるPeggyは楽だったんだが。 SciTEは…暇なときに設定やるかw
>>490 > >487
> 違う違う。
> 俺は改行記号とタブ記号は表示されないと嫌なの。
失礼。そうだったのか。
> でも、あくまで主役はコードであって欲しいから
> 目立つ改行・タブの記号は嫌なのさ。
改行は特にすごいね(笑)
> 黒基調の設定がデフォで入ってるPeggyは楽だったんだが。
自分も黒バックが好みなのでその意味ではめんどいかな。
ちなみにJmでいまいち気に入らなかったのは、関連づけなどから
起動したときにタスクバーアイコンがアクティブにならないとこ。
PSPadはどう?
なぜemacsを使わない
初心者スレだから
xyzzyの事も忘れないでください。 ruby-modeも黒基調もあるよ。
496 :
デフォルトの名無しさん :2006/12/18(月) 22:41:04
>>495 xyzzyのruby-mode最低限の機能でよいのだが、
インデントが一定規則で、誤爆する
初心者だからemacsを使わない。それで世の中が渡っていけると思ってるのか!
渡っている人は大勢います。 私はEmacs使っていますけどね。
xyzzyのruby-modeはインデント奇妙だよね
インデントについてごちゃごちゃ言うならPythonへ行けよ。
vivivivivi―――――――!!!!
当り前だろ。何のためにendがあると思ってるんだ?
ruby1.8.0と標準添付のwebrickを使って
ttp://rubyist.g.hatena.ne.jp/muscovyduck/20061114/p1 に書いてあるCGI実行サンプルを動かしてみると、常に「dump error」が出ます。
(ruby最新版を使うとエラーは出ませんでした)
webrick/httpservlet/cgi_runner.rb の Marshal.restore(dump) 周りに
問題があるようなのですが……
これって何故なんでしょうか?
1.8.0ではwebrickを使わないほうが良いのでしょうか?
1.8.0を使わない方がいい、という結論の方をお勧めする。
ばかにしてる!
506 :
デフォルトの名無しさん :2006/12/19(火) 16:57:37
Rubyで オブジェクト(Classクラスのオブジェクトも、クラスのオブジェクトも含めて) が持ってるのは、 インスタンス変数と、インスタンスメソッドだけだと思ってたけど、 次の見て、ローカル変数も保持してるのって、わけわかめになってきた。 class Hoge local = 1 define_method(:foo) do p local += 1 end define_method(:bar) do p local += 1 end local = 10 end hoge = Hoge.new p hoge.foo p hoge.bar (つづく)
507 :
506 :2006/12/19(火) 17:01:04
(つづき)
どうやら、ローカル変数のスコープの問題が関与しているようだけど、
ローカル変数は、静的にスコープが決まるとかいって、U゚Д゚U ハァ?
って感じだったので、
静的ってのを調べたら、静的って言うのは、コンパイル時に決まるらしく、
今まで、コンパイルと実行を区別してなかった、私にとっては、
理解を超越してしまってる。
↓ここが、それに関する説明っぽいけど、
http://www.ruby-lang.org/ja/man/?cmd=view;name=%BC%C2%B9%D4 スコープなんて言葉は一言もでてこないし、
ブロックって言う言葉も、普通の{}のブロックとは違うようだし、
意味不明です。
この理解は、RHGとか読んで、ソースコード読んで理解しなさいということなんでしょうか。
正直、初心者の私には、付いていけません。
eval系メソッドを使うなってことなんでしょうか。。
1.コンパイル=>実行までの流れがわかる、
2.あと、オブジェクトがどういう値を保持していて、どこからアクセス可能か
ということについて、いい本とか、サイトないでしょうか。
教えてください。お願いします
たしかにxyzzyのruby-modeはあんまりいけてないな。なんとかしてほしい。
>>500 xyzzyのruby-modeにおけるインデントがおかしいといってるだけであって、
ruby自体は何も非難していない。
被害妄想乙。
>>509 じゃあスレ違いだ。xyzzyのスレに行ってやれ。
>>506-507 まずクロージャ(closure)について勉強しろ。
理解できるまでは無理してdefine_method使うな。
すみません。説明を放棄して使う奴の実力が足りないんだってことにしておきます。
学習に必要なキーワードを提示してる人間を何故煽る closureについてわからない所があれば、そこでまた質問すればいいんだ そんなにスレを荒らそうとしないでくれ
うぜ
君たちが回答者という立場を満喫するべく質問を欲しそうにしていたから 質問をしてあげたんだ。 君たちは謝辞を述べてから、競い合うように簡潔にして丁寧な解説を 披露しあうべきではないのかね?
簡潔で分かりやすい解説は、その人自身の習熟度の指標でもある。
簡潔でわかりやすい質問は、その人自身の成長性の指標でもある。 うまく質問ができない人は、必要な回答を得られないので、成長性が低くなる。 よい回答が習熟殿の指標足りうるのは、よい質問があってこそ。 テストの問題と一緒だな。
>>517 > うまく質問ができない人は、必要な回答を得られないので、
回答できない言い訳はどうでもいい。
ただ良い回答があればそれでいい。
勉強になります!
エスパーできる人は、そのことについて熟知している証拠である。
ぼくも520さんみたいなエスパーに早くなれるよう 修行とお布施、がんばります!!
>>509 xyzzyなら、ruby-mode.lを直接改造して、*ruby-block-beg-re*とかを改造するといいよ。
;(defvar *ruby-block-beg-re*
; "class¥¥|module¥¥|def¥¥|if¥¥|unless¥¥|case¥¥|while¥¥|until¥¥|for¥¥|begin¥¥|do")
(setq *ruby-block-beg-re*
"¥¥<¥¥(class¥¥|module¥¥|def¥¥|if¥¥|unless¥¥|case¥¥|while¥¥|until¥¥|for¥¥|begin¥¥|do¥¥)¥¥>")
とか。ちょっとはましになる。
523 :
506,507 :2006/12/20(水) 23:12:33
>>512 は私ではありません。
気をわるくしないでください
2chにつながりにくくなって、返事がおそくなりました。m(__)m
お騒がせしてすみませんでした。
みなさん、ありがとうございます。
まずは、クロージャについて勉強しようと思います。
ちょっと、ネットで調べたところ、
自分が知りたい概念と同じような気がします。
524 :
デフォルトの名無しさん :2006/12/21(木) 00:06:43
mswin32だとスレッドが使えないと聞いたのですが Thread.fork { while true puts 'forked thread' end } while true puts 'main thread' end このコードは正しく動いている気がします いつの間にか使えるようになったのでしょうか?
fork違い
forkがないってのと、console I/Oすると他のThreadも止まるってのを、 ごっちゃにしてるんじゃなかろうか。
うん。ユーザースレッドだからmswin32だろうがスレッドは使えるよね。
結局何が使えないんですか?
Matz
いるいるこういうやつ(笑)
(笑)
532 :
デフォルトの名無しさん :2006/12/21(木) 07:29:32
ユーザースレッドってのは、コルーチン?みたいなのかな?
OSのネイティブスレッドではない?
>>529-531 ワロタ。
でも本スレの流れを持ち込むのはやめてくれw
>>532 そう、OSのネイティブスレッドではありません。
インタプリタががんばって処理します。
長所は移植性がとても高いこと。
短所はOSの支援を受けられないので、
たとえばSMPの恩恵を受けられないことです。
リファレンス眺めてて気づいたのですが while hoge..fuga foo end この記法、どういうときに使うのでしょう?
>>534 while foo in hoge..fuga
p foo
end
の間違いじゃ?
それだと無限ループしちゃうyo
ごめん間違えた for foo in hoge..fuga p foo end
ドットに複数の意味をもたせた言語デザインが悪い とか逆切れしてみるのはどうか
>>535 if (a==b)..(c == d)
end
みたいなのもあるんだよ。
ただ、可読性が結構低いのでお勧めは出来ないけど。
while hoge..fugaの形では使ったことはないけど
array.each do |e|
next unless (e == hoge)..(e == fuga)
......
end
みたいな形では極稀に使う。
ばっかみたい。
define_methodとかinstance_evalだとかについて 使い方、使い所などについて懇切丁寧に解説してる 本とかってないですかねえ。
わかる奴には説明する必要がなくて、わからない奴は使う必要がない、 というメソッドだからなあ。 なんかあるかねえ。
使い方はマニュアル見ればいいけど、 使いどころを説明するのは難しいね。 リフレクションあたりから説き起こして 小冊子一冊分くらいの分量は優にあるテーマだと思う。
すみません。お知恵を貸してください。 <状況> 実装がよく分からないクラスObjのインスタンスがあり、Obj#loadで データを読んでくれます。Obj#loadが受け付ける引数はそのデータを 格納したファイルのファイル名のみです。 <やりたいこと> 手持ちの文字列データを突っ込みたいのですが、新たにファイルを 作ったりできません。 <試してみたこと> StringIOを使ってみたりしました(NG)。 よろしくお願いします・・・。
>>543 まずはソース嫁なんだけど。一応こんな感じでメソッド追加したら?
class Obj
def load_str(str)
# 何とかしてObjのインスタンス変数にアクセスする
end
end
あとは、irbなんかでObjのインスタンス変数やらメソッドやらを調べまくればokだと思う。
なんで新たにファイルが作れないんだろう。 Tempfile.new とかでもダメなのかな。
loadで型をチェックしてるのかね。 IO.pipeを使って、書き込み側に手持ち文字列を突っ込んで、 読み出し側をloadの引数にすると出来たりしないだろうか。
型チェックというか、 > Obj#loadが受け付ける引数はそのデータを > 格納したファイルのファイル名のみです。 って書いてるから、Obj#loadの中でFile#openとか呼んでるだけなんジャマイカ? で、File.openの引数にはTempfileとかIO.pipeの読み出し側って渡せる?
548 :
543 :2006/12/22(金) 23:07:37
wxRubyを使ったGUIアプリをExerbで固めようとしているんですが、 GUIの設定部分をXRC(XML)ファイルとして外に出しており、何とか これも含めて1つのexeにしたかったのです。 で、Exerbの方は外部データファイルをStringIOオブジェクトとしてしか 取得できないみたいで、一方、wxRubyはXRCをファイルとしてしか 読みません(たぶん)。 まあXRCだけexeとは別に添付ということでもいいんですけど。 こういうときにTempfile.newというのは慣例的あるいは審美的に アリなんでしょうか?
549 :
543 :2006/12/22(金) 23:14:58
すいません。レスがかぶってしまいました。 実装がよく分からないというのも、wxRuby(2)だからなんです。 拡張モジュールで、しかもSwigで作ってるらしいので、 ソースを見てもちょっと手に負えない可能性大です。 IO.pipeを調べて、一度それでやってみます。
550 :
デフォルトの名無しさん :2006/12/23(土) 00:12:30
>>538 > if (a==b)..(c == d)
これ?ってどういう挙動すんの?
true..false
true..true
とか、って・・・
うげ、頭てんぱってきた
551 :
543 :2006/12/23(土) 00:20:36
IO.pipeの読み出し側を渡すというのは上手くいきませんでした。 Tempfileを作って渡す方は上手くいきました。 もともと存在するファイルのコピーを作るというのにちょっと 違和感があったのですが、ともあれ、ありがとうございました。
552 :
デフォルトの名無しさん :2006/12/23(土) 00:39:29
554 :
546 :2006/12/23(土) 02:22:42
ファイル名しか渡せないってのをファイルしか渡せないと誤読してた。 混乱させて済まぬ。
コアダンプみたいに、ある時点のRubyプログラムの状態を 全部ダンプして復元する方法はありますか?
>>555 変数についてなら、Marshal.dump, Marshal.loadが使えるけど
スクリプト全体だと多分ないんじゃないだろうか。
rubyごとコアダンプすれば(ry
お。Binary 2.0ネタ?
復元したいってあるからプロセスやスレッド単位でマイグレーションしたいんじゃね。 YARVでできないの?
YARVはbytecodeのdump/loadできたと思う。
来年こそend廃止。
何にすんの?
インデント
空行
空行ってなんか仏教用語っぽいよね字が
567 :
デフォルトの名無しさん :2006/12/24(日) 21:10:11
Rubyって何を造るための言語なんだ? 結局はWeb関連だったらツマランわ
おれ個人での用途ではWeb関連で使ったのは20%くらいだな。 バッチ処理やデータ処理で使うことのほうが多い
perl++
いま>569がいいこと言った!
P2Pソフト
572 :
デフォルトの名無しさん :2006/12/25(月) 00:24:37
rakeで質問なんですが、 以下のように、xsltで、xmlを変換するRakefileを書いています。 COPY_DIR = "../html" SRC = FileList["*.xml"] DOCUMENTS_DEST = SRC.ext("html").map{ |item| File.join(COPY_DIR, item) } TEMPLATE_XSL = "template.xsl" desc "rake all" task :all => [:all_documents] task :all_documents => DOCUMENTS_DEST rule '.html' => [lambda { |f| File.basename(f.sub(/\.html$/, ".xml")) }] do |t| sh "xsl #{t.source} #{TEMPLATE_XSL} #{t.name}" end TEMPLATE_XSLが変更された場合に、一番下の、rule(xslを呼び出している所)を 呼びたいのですが、いい方法はないでしょうか? Makefileの場合、 $(COPY_DIR)%.html: %.xml $(TEMPLATE_XSL) $(XSLT) $< $(TEMPLATE_XSL) $@ のように書けばよかったのですが・・・
573 :
572 :2006/12/25(月) 00:31:26
fileタスクの場合は、以下のようにして、複数ファイル関連付けができるのですが ruleの場合はどうやったらいいのかな、と思ったしだいです。 file INDEX_DEST => [INDEX_SRC, TEMPLATE_XSL] do sh "xsl #{INDEX_SRC} #{TEMPLATE_XSL} #{INDEX_DEST}" end
574 :
572 :2006/12/25(月) 00:39:11
575 :
572 :2006/12/25(月) 00:44:50
以下のように、書き換えたことろできました! rule '.html' => [lambda{TEMPLATE_XSL}, lambda{ |f| File.basename(f.sub(/\.html$/, ".xml")) }] do |t| sh "#{XSLT} #{t.sources[1]} #{TEMPLATE_XSL} #{t.name}" end お手数掛けました。
>>567 俺はguiスクリプトをガリガリ書いてる
apolloがあれば大抵のことは出来るしな
というか、逆にrubyに出来ない事ってなんだろう
civilization4のMOD作成
>>579 Civ4はPythonインタプリタ内蔵だったな。
>>576 今後リリースされるバージョンでも確実に動くアプリケーション書いてみろ。
なに急にいきりたって あさっての方向に「指令」出してんだろ、この子
583 :
576 :2006/12/25(月) 15:46:12
>>577 OSって、そもそもアセンブラじゃないと書けないんじゃなかったっけ?
それともC言語やJavaでOS作るのも可能なのだろうか
>>583 誰に教わったのそれ
まあランタイム必須なものには無理だ
>>583 確かJavaで使ったOSがあったよね。
その前にRubyでRubyが書けるようにならないと
evalだけでいいすか?
rubyでruby実装するのは無理。Lispマンセ
ripperはどういう位置づけだっけ?
591 :
デフォルトの名無しさん :2006/12/25(月) 21:52:23
f=File.open("ntl-5.4.tar.gz",'rb') ff=File.open("an.cyp",'w') while(f.eof?!=TRUE) b= f.read(89) b= key*b; srand print "b=",b,"\n" こうやると89バイトの文字列として読んでしまうので掛け算ができません。 89バイト整数としてファイルから読ませるにはどうすればいいのでしょう? よろしくお願いします。
to_i
>>591 力ずくでやるしか知らないが「b = f.read(89)」のあとに
c = 0
b.size.times do |i|
c = (c << 8) | b[i]
end
とすれば、変数 c に望みの整数値が出来上がる。
バイトオーダはビッグエンディアン。
リトルエンディアンの値が欲しけりゃ times の中を下ので書き換えてくれ。
c = (c) | (b[i] << (8 * i))
594 :
デフォルトの名無しさん :2006/12/25(月) 22:52:50
rubyって、そんなに桁数多くても計算できるんすか・・・
メモリが続く限り
ただしfloatは鬼門。
89バイトつーと、 irb> 89 * 8 * Math.log10(2) => 214.333356912755 桁か。
ちょっっぴり長いね
7^7^7 つまり7の(7の(7の階乗)乗)乗 の1の位の数字をrubyで計算してみてください p 7**7**7 でも結果が分かるので やってみて頂いてもいいのですが 時間がかかるのでもう少し早い方法で プログラムしてみてください
階乗? 累乗じゃなくて?
でと、7のn乗の1の位は、 n = 1 -> 7 n = 2 -> 9 n = 3 -> 3 n = 4 -> 1 となるので、以降は7、9、3、1を繰り返す。 ということは、乗数を4で割った余りがわかれば1の位はわかる。 つまり、7の7乗の1の位は3になり、7の(7の7乗)乗の1の位も3。 しまった、プログラム組む前に答えがわかっちゃった。
603 :
デフォルトの名無しさん :2006/12/26(火) 05:48:50
>>593 うまくいきました。ありがとうございます。
逆に復号したいとき、整数から文字列にして表示させるにはどうすれば
いいでしょう?よろしくお願いします。
604 :
デフォルトの名無しさん :2006/12/26(火) 06:03:15
while(f.eof?!=TRUE) b= f.read(15) bb=0 b.size.times do |i| bb=(bb<<8)|b[i] end b= key*bb; print "b=",b,"\n" while(1) if(a=rand(key)) #print a,"\n" break end end while(1) if(d=rand(k2)) break end end c=(b+a)^d; ff.write(c) こんなことやってますが、書き出されたファイルの大きさが計算と違います。 何か間違いがあるのでしょうか?2370バイトのファイルを15バイトづつ 読み込んで256ビットにして書き込みしてます。 11698バイトになってしまいます。どうしてかわかりません。
605 :
デフォルトの名無しさん :2006/12/26(火) 06:34:49
ff.write(c)をバイナリデータとして書き込みたいのですが、 テキストになってしまいます。
607 :
デフォルトの名無しさん :2006/12/26(火) 08:09:37
undefined method array ?
608 :
デフォルトの名無しさん :2006/12/26(火) 08:20:17
pack': can't convert Bignum into String
609 :
デフォルトの名無しさん :2006/12/26(火) 08:24:13
`main': undefined method `pack' for #<Bignum:0x100ef758>
610 :
デフォルトの名無しさん :2006/12/26(火) 08:37:44
ff.write(array.pack(c))でバイナリデータになるんですか? わかりません。
わからないならわかるやりかたでやればいいのに、無理矢理小難しくする理由がわからん。
使い方が分からないなら ri pack して。
WebAgent または Http-Access2を使用して クッキー情報を送信してHTMLボディを取得したいのですが どなたかおおまかなサンプルを見せていただけませんか? googleで検索したのですが、いい資料がなく困っています。
WebAgentみてみたけど、受け取ったことのあるクッキーなら 見つけ出して送ってくれるものの、任意にセットするメソッドは ないみたいですな。 逆に言うと、クッキーDBファイルにこっそり該当URLのクッキーを 書いておくとそれを使ってくれるぽい。
メソッドないので instance_eval で無理矢理。 web_agent.instance_eval do @cookie_manager.parse(str, url) end とやるのかな。 あるいは parse の代わりに WebAgent::Cookie.new していろいろセットして add。
>>605 バイトストリーム = ""
16回繰り返す { |i|
バイトストリーム << ((整数値を i バイト右シフト) と 0xff を論理積)
}
>>611 みんな知ってるのに俺だけ知らないのはくやしいから。
使い方ちゃんと教えろ。
>>617 そんなこと言っていると何も出来なくなる。
自分の手元にあるものだけで どうにかできるように心がけろ。
619 :
デフォルトの名無しさん :2006/12/26(火) 12:42:05
Cだったらバイナリモードで開いたファイルにはバイナリデータが入るんです けどね。何でルビーは違うんでしょうね。 Cはうまくいきました。でも謎の^@が大量に入って、圧縮ファイルを復元しよう 賭したら間違いなくエラーになるので原因を探しています。
^@ って0x00 だが
>>619 せめてRubyもCと同じくらい勉強してから比較してやれよ。
>整数12345ならば文字列"12345"に変換してしまうわけだ。 センセー、rubyはなぜ全角と半角の変換を自動でおこなうのですか?
624 :
デフォルトの名無しさん :2006/12/26(火) 13:27:57
バイナリで書き込む関数は無いのですか? 初学者には例が少ないので。 0x00が変換中に混じっているので除去しないといけないということでしょうか?
packに >”w”、BER圧縮整数:1バイトあたり7ビットを使用して必要最小限のバイト数で「任意サイズの 0以上の整数」を表す数値表現。 ってのがあるので、これ使えば自分で計算する必要はない。 irb(main):001:0> File.open("testfile","wb"){|f|f.write([100**100].pack("w"))} => 95 irb(main):002:0> File.open("testfile","rb"){|f|f.read.unpack("w")} => [100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
>>624 バイナリは何で保持してる?
Stringにバイナリを保持させればwriteはそのまま書いてくれる
628 :
デフォルトの名無しさん :2006/12/26(火) 14:08:49
gz圧縮ファイルのデータが文字列に変換されると困ります。 暗号化関数なので保存される形式はバイナリデータです。
629 :
デフォルトの名無しさん :2006/12/26(火) 14:25:03
>>バイナリデータです。 バイナリデータでなければならないです。
だからバイナリデータは何に入れてるの?Array?
>>628 16バイト長整数ならば
>>616 で16バイト長のバイナリに変換できる。
変換したものはStringクラスのインスタンスだから、あとは
>>627 のとおり。
>>626 の方法ならば一発で出来るが、7ビットにつき1ビット付加されて18バイト長になる。
632 :
デフォルトの名無しさん :2006/12/26(火) 14:36:06
readでは配列になってますが、シフト演算で無理やり整数表現に なおしています。数値演算では普通にBigintになってます。 それが書き込むときに文字列に変換されてしまうのが納得いきません。 数値をバイナリデータとして書き込みたいのです。 配列のデータにまた分解して格納しないといけないのでしょうか?
だからまた分解してArrayにしてpackしろと上の方に書いてるじゃねーか。 wだと7ビットだからダメだけど。
634 :
デフォルトの名無しさん :2006/12/26(火) 14:41:20
>>631 その方法を使っても(3)_10=(11)_2になって文字列で格納されるだけ
じゃないでしょうか?
writeが内部で文字列変換をしている以上バイナリデータを書き込む
のはwriteでは無理なんでしょうか?
635 :
デフォルトの名無しさん :2006/12/26(火) 14:43:47
配列に分解してからパックしてみます。
Rubyの文字列って、現在の実装では君の言うバイナリデータだぞ。 あと、readは配列を返すのではなく、バイナリデータを含む文字列を返す。 つーか、Stringから文字列とバイト列の概念を分離して、 OctetStreamクラスを新設してくれないかなあ。 その上でStringをUnicode化してくれると嬉々累々。
>>636 今さらPythonの後を追えというのか?Matzのプライドはどうなるんだ?
638 :
デフォルトの名無しさん :2006/12/26(火) 16:17:37
ff.write(array.pack("llllllll")) こんなことしたら書けました。w
どうせなら親Windowsな姿勢を真似てもらいたい
だれかVistaでテストしてるのかねぇ。
どうせならWindowsエロゲ組み込み言語シェアNo1とか目指してくれ
言語のほうから目指す必要はないけど、 エロゲ開発者はトライしてみてもいいんじゃねーかな。
rubyもマイクロスレッドをサポートしてくれる?
638で解決したのは634であってるのか?
正直Cのことは一端全部忘れてからRubyの勉強をした方がいいよ。
まるっきり違うから。
>>644 マイクロスレッドでググったら弾幕系がトップだな。
普通のスレッドでもProcでも継続でもなんでも好きに使えばいいと思われ。
>>645 知らないなら黙っていたほうが恥かかないぞ。
>>646 それを自分に適用すると人生が少しは良くなるぞ。
648 :
デフォルトの名無しさん :2006/12/26(火) 18:40:03
ファイルAのカラム1とカラム2(たとえば100行にそれぞれ違ったカラムの値があります) ファイルBに行にあるカラム1とカラム2(たとえば100行にそれぞれ違ったカラムの値があります) ファイルAの1行目のカラム1が、ファイルBのカラム1(全行)中に ファイルAの1行目のカラム2が、ファイルBのカラム2(全行)中にあれば、 ファイルAの1行目の終わりに○という文字を付加します。ないなら空白のままです。 次にファイルAの2行目、3行目と次々にファイルB中にあるか確かめていきます。 このようなプログラムですと まずファイルAの1行目をよみ、次にファイルBの行をつぎつぎと読み込んでいきますよね。 while filea=gets . . while fileb=gets . . end . . end のようなプログラムになると思うのですが、内にあるwhile文のfileb=getsの中で ファイルAのカラムA,B = ファイルBのカラムA,B という条件判定をするのですが、これで一致した場合、内にあるwhile文を抜けたいのですが この場合、どうやってwhile文を抜ければよいのでしょうか?
内側のループ(bのループ)を抜けるなら素直にbreakすればいいんじゃないの? 外側だとひと工夫必要だが。
勝手に遊んでろ
WindowsXP上のEclipse3.2をLangegePackで日本語化して RDT0.8.0(org.rubypeople.rdt-0.8.0.604272100PRD.zip)を導入しましたが、 Rubyスクリプトの動作はするものの、デバッグでブレークポイントで止めても、 変数が何も表示されません。 Rubyのバージョンはmswin版の1.8.2です。 似たような症状に悩んだ人はいませんか? アドバイスをよろしくお願いします。
654 :
648 :2006/12/26(火) 23:21:50
上は省略 up = File.open(output,"w") while aline = file.gets aline.chomp! names, afirst, asecond, = aline.split(/\t/).values_at(0,1,2) # afirstもasecondも数字が入る moji = "" while bline = file2.gets bline.chomp! bfirst, bsecond, = bline.split(/\t/)[0..1] # bfirstもbsecondも数字が入る if afirst = bfirst && asecond = bsecond moji = "○" break end end up.print "#{names}\t#{afirst}\t#{asecond}\t#{moji}\n" end up.close このようにしてプログラムを実行したところ 全ての行にmojiとして○がついています。 if文で一致する行だけ○をつけたつもりなのですが、どこがおかしいのでしょうか? p afirst や p bsecond で確認したところ、ちゃんとsplitで分割されていました。
>>654 if文の中、代入式になっておらんかね? しかも両方。
あと、while bline = file2.gets へ入る前に
file2.pos = 0 を加えたほうが無難そうだな。
657 :
648 :2006/12/26(火) 23:54:50
>>655 posと== にして試してみたところ、今度はチェックの○が全てつかなくなってしまいました。
if afirst == bfirst && asecond == bsecond
これではおかしいのでしょうか??
あ、ごめん、 throw if なんか抜けたい条件 (×) throw :break if なんか抜けたい条件 (○)
cgiでアップロードされた画像ファイルのサイズを変えたいと思い探してみました。 GCのライブラリは見つかりませんでした。 ImageMagickはRMagickというのが見つかりました。 とりあえず、RMagickを使うつもりですが、 他にどういう選択肢がありますか? また、どういう方法が一般的な方法といえますか?
GCじゃなくてGDだが・・・404だな。 それ以外だとたぶんRMagick、次点でRuby-GNOME2のGdk::Pixbufか。 拡張ライブラリは入れたくないけどImageMagickやnetpbmが入っている のなら、コマンドを駆使して画像のサイズ変更は可能。
661 :
659 :2006/12/27(水) 05:43:42
うわまちがった。GDですね。
>>660 次点でGDKですか・・・
このあたりのニーズはないんでしょうかね。
それとも、RMagickで事足りてるのか。
だとしたら、なんで標準ライブラリに含まれないのかなぁ。
RMagickインストールすんのめんどいので、コマンド駆使でがんばることにします。
ありがとうございました。
俺も適当にコマンド呼ぶだけだな、そういう処理だと。
鬼門追加。画像処理。
標準で画像処理できるスクリプト言語って何だろう。 Pythonにはあったよね、たしか。あれ、SGI依存だったかな???
>>664 誰にとっても鬼門というわけではなかろう。
ライブラリをインストールできる権限があれば別に。
Pythonには、SGI(Irix)固有のglモジュール以外に、jpegのモジュールも あるようだが、圧縮/伸張のみだから、画像処理とは言い難いか。
いや、Rubyの鬼門とか言ってるから標準付属品の話をしてるわけだが。
ImageMagickしか選択肢がないってのが問題じゃないの?
RMagickが多機能すぎて困ってるというなら分かるかも。
GDでいいじゃん
ImageMagickってメモリリークしたりクラッシュしたりってのが、 いつまで経ってもおさまらないじゃん。もっとマシなのが欲しい。
>>673 どうせ大半の人はサムネールの作成ぐらいしか使わないから。
>672 だから404なんだぜ?
簡単な拡大縮小くらいならsdl使えるんじゃ?
404、とは書いたがRAAのキャッシュには残ってるな そこまでしてRuby-GDにこだわる理由はと言われると別にないのだが
このプログラムの実行結果が毎回違うのですが、 これって正しいことですか? 毎回同じ結果になることを期待していたのですが… Fedora Core 4/ruby-1.8.5-p12です。 thread_ary = [] n = 0 10000.times do |i| thread_ary << Thread.new(i) { |i2| n += i2 } end thread_ary.each do |th| th.join end p n
>>678 n += i2 の部分を排他ロックしてないからだろ
>>679 Mutexで排他ロックすると、うまくいきました。
Rubyの1行の文はアトミックだと勘違いしていました。
>Rubyの1行の文はアトミックだと勘違いしていました すげえ勘違いのしかた。一体何をどう考えたら1行の文が...
678はむしろ、単純にロックし忘れてたんだろ。 もしアトミックだと勝手に想定して、あえてロックしなかったのなら性格に問題ありそう。
684 :
デフォルトの名無しさん :2006/12/28(木) 19:05:46
>>683 Rubyコミュニティーの気持ち悪さを表現した、素晴らしいレスですね
net/httpを利用してhtmlを読む際に body部にてsrcで呼ばれたjavascriptを実行することは可能でしょうか? もしあればご教授のほど宜しくお願いします。
>>685 誰がJavascriptを解釈するの?
>685 JavaScriptは普通ブラウザが解釈し実行する クライアントサイドのスクリプト。 だから単純にscriptタグを出力すればOK。 …JScriptインタプリタを使って CGIとして実行するなら話は全く別だが。
意味わかってないなら答えないほうがいい
性格の悪いひとたちばかりですね
頭の悪いひとたちにはそう見えるらしいですよ
プログラム書いたら、 Segmentation fault となりました。 これってどういう意味ですか。
>691 Segmentationに関するfaultだよ。字の通り見たまんま。 解消する方法は当の「プログラム」と実行環境が分からんと誰も答えようがないと思われ
>>691 Rubyのバグをたまたまそのプログラムが突いてしまったということ
あるいは外部ライブラリとつなげたものならそれが悪さしてる可能性もある
前者なら報告した方がいい希ガス
>>692-693 レス、ありがとうございます。
windows2000の上で動かしている
VineLinuxの中でOpenGLと
一緒に使っています。
バグをついたのが「たまたま」なら、 ちょっとプログラム変更すれば 動くようになるんじゃない?
そうしてみます。
1.8.5になってからワンライナーが書きづらくなったなぁ。 >ruby -ve "puts '%02X' % 10" ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] -e:1: warning: too many arguments for format string X #=> 本当は 0A と表示されて欲しい % + 数字 がまずいみたいだね。
およ、うちではこうなるが。 % ruby -ve "puts '%02X' % 10" ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-darwin] 0A
>>697 WindowsXP+CMD.EXE+ASR1.8.5.5
だと
0A
ですよ。
VMWare上なんでコピペできんが。
環境はどういう感じ?
700 :
697 :2006/12/29(金) 20:07:30
>>698-699 ごめん。Rubyは悪くなかった。
cmd.exeで実行したら正しい結果が得られた。
nyacus上で実行してたんだけど、nyacusが%xxを展開してたみたいだ。
701 :
687 :2006/12/30(土) 04:35:57
>688 ん、俺何か勘違いしてる? 真面目に何を間違えたのか判らん
急に「なんかわかってるフリ」をしたくなっただけでしょwきにすんな
703 :
デフォルトの名無しさん :2007/01/02(火) 02:05:47
しかし、PHPは言語として(ry
洗練されている?
PHPは言語として最悪だろヴォケ
Perlよりはマシw
Perlは無理やり色々機能追加せず 昔のままシンプルだったらよかったのにね。
Perl も PHP も言語として最悪と分かっていつつも 使わざるを得ない現状が何ともね。
Rubyに乗り換えずにPerl使い続けてる奴って、 ラリーのいう「無精」が悪い方に出たクズとしか言い様がないな。
まあ、Rubyが下手にPascalに近い文法を採用したから、C/C++修得者の受けが悪いという気はする。 C/C++修得者にとっては、PHPの方が受け入れやすいよなやっぱり。
711 :
デフォルトの名無しさん :2007/01/02(火) 10:57:07
Delphi使ってる俺から言わせると、RubyがPascalみたいだなんて、到底思えないが。 C文法しか使えない(というか、こだわってる)奴のたわごとにしか聞こえないよ
すげえたわごと来た
713 :
デフォルトの名無しさん :2007/01/02(火) 11:16:16
まぁ、「〜にしか」見えなかったり聞こえなかったりするときは 「仮説が一つしか浮かばない自分の思考はどこかで猪突猛進してる」と思ったほうがいいかな
PHPはLightweight Lesser Language。 でも実際は言語なんかどうでもよくて 研鑽しないプログラマの存在のほうが 現実には悪な場合が多い。
715 :
デフォルトの名無しさん :2007/01/02(火) 12:11:48
>>714 perlと一緒ジャン
やっぱ、Ruby使ってる人は、勉強する人ばかりだよね
>>715 はいはい、選民思想乙
716 :
710 :2007/01/02(火) 14:21:36
>>711 いや、俺もデスクトップアプリはDelphiもBCBも使うからそう思うんよ。
例外処理の書き方とかさ
>>716 711様がC文法しか使えない奴のたわごとにしか聞こえないって言ってるんだから
お前はC文法しか使えない奴なんだよ。ごまかすなクズ。
Pascalみたいだってのはendがあるからでしょ。 そこからちょっとでも踏み込んで調べてみたら、 そんな印象なんか吹き飛ぶだろうに。
なんでそんなにPascalの影響を否定するのに必死なんだこいつら
C文法しか使えない奴のたわごとにしか聞こえないからだよ。
PHP で何気なく while(($c = fgetc($fp)) != EOF){ hogehoge; } って書いたら無限ループw
Ruby で時々 if(fugafuga){ } って書いて唖然とするときがある
うっかりなら if hogehoge else fugafuga endif これやってしまう
PascalがのブロックがCとRubyどっちに近いかっつーと 断然Cに近いんだがなぁ
Pascalはencに.が付いたり付かなかったり 行末に;が付いたり付かなかったり ソースを一回書いて終わりならいいんだけど 後からのメンテに面倒臭さを感じる コンパイラに人間があわせてる感じがする
個人的にはPascalの書きにくさを解消したのがCだと思ってるけど
そのうち if 〜 begin end else begin end って書くようになったりするw
そいつぁ〜重症だなw
Pascalコンパイラに人間が合わせてる最たる物が、 「1パスでコンパイル」というのを守るための forwardかも。
RubyのendはPascalじゃなくてEiffelの影響なんだけどね
>>719 全然否定していない。ただPascalの影響を言うやつのほとんどが
底の浅い理解をしているということなんだ。君みたいにな。
Pascalの影響はある。だが君が思っているところにではない。
720以降の議論の意味わからないだろ、君には。
>>731 どこにPascalの影響があるの?
おれPascalやってたけど、Rubyにその影響をみたことないなあ
endがあるからpascalみたい。ただそれだけの話
なんでendにしたの?
736 :
デフォルトの名無しさん :2007/01/02(火) 22:05:16
個人的には try catch よりも begin rescue の方が好き
>725 Pascal の ; は俺にとってはCより解りやすい C言語の if の if(式) 文; else 文; なんてかなり違和感だもん 何で一つの文にセミコロン2つあるんだよって感じ
> if(式) 文; else 文; 文が二つ入っとりますが……
ごめん説明不足だ、1つのif文ね。
一行?
いや、Pascal だから
if(式) 文 else 文 end;
までで一文だっていう意味かと。
ただ、結局
>>727 みたいなことになりがちなので
C で改善されてると言えると思うんだけどなぁ。
Delphi厨だが、ifは if 式 then 文; if 式 then 文 else 文; のどちらかで一文だね elseの前にセミコロン入れると前者として扱われ 「else単独の構文はない」ため文法エラー ブロックは begin 文; 文;... end セミコロンは文末 ピリオドはコードの末尾 これに慣れると実際C言語のelseは気持ち悪いな いい加減慣れたが。そもそもスレ違いだが。
>>745 > セミコロンは文末
Pascalではセパレータだから文の間。
だからこそ
> ブロックは begin 文; 文;... end
endの前には入らないわけだ。
すれ違いだけど、 Pascalのコード色々見てると if ... begin (単|複)文; end else begin (単|複)文; end; っていう書き方結構多いような気がする。 みんなコード書いてるうちに ;を付けたり付けなかったりするのが面倒になるんだと思う。
>747 それはC言語でも同じでは
749 :
デフォルトの名無しさん :2007/01/04(木) 01:17:32 BE:38783055-2BP(2)
質問させてください。 Perlでいう、Tie::File 相当のモジュールってRubyにありますでしょうか? 単に配列に変換する程度の機能でしたら、自分でちょろっと 書いた方が早いですが、flockやbufferingまでやってくれるものが 欲しいのです。 まぁSQLite使えという声もあるのですが…(汗
>>749 Tie::Fileというのがどんなものかを説明したほうがいいと思う。
751 :
デフォルトの名無しさん :2007/01/04(木) 06:53:03
753 :
デフォルトの名無しさん :2007/01/04(木) 18:26:11
たとえば、私だと、HSPやPHPに対する「悪意」を読み取られたことがある。
数値かそうじゃないかを判別するメソッドがあったら教えてください integer?のFloatでもtrueを返すような物を探しています
ヒント 1.class.ancestors 1.0.class.ancestors
>756 ヒント ・クラス間の親子関係 ・Object#is_a? / Object#kind_of?
RDoc::usage の出力先を標準エラー出力に変更するには どのような指定をすればよいでしょうか?
* 標準出力を標準エラー出力につけかえる * RDoc::usageを再定義する のどちらかだと思う
761 :
デフォルトの名無しさん :2007/01/08(月) 04:02:09
Rubyというやつに挑戦しようと思い検索したところvs2005stdにそのままインストール出来る ようなので、したのですがRubyProjectを立ち上げて、新しい項目としてtest.rbという名前にし print 123 とだけ打って実行してみたのですが、まったく駄目です。 というか、c/c++を今まで勉強してきたのですが今回rubyの入門サイトをgoogleで検索して 一通りみたのですがさっぱりわからず、mainに当たる部分はどこなんだ? という、たぶんスクリプト言語?ってのをやってる人にとっては「何いってんだ?」という 質問かもしれませんが、できたら何をどうして、どのページを参考にしたら良いのか 教えていただきたいです。 お願いします。
>>761 何がどうダメなのかちゃんと書いたほうがいいんじゃないか。
一体どういう状況なのか全く読めないぞ。それと、そのスクリプト自体は間違ってない。
Visual Studio 2005スレ Part18
http://pc10.2ch.net/test/read.cgi/tech/1167788121/72 72 名前:デフォルトの名無しさん[sage] 投稿日:2007/01/08(月) 04:02:57
Rubyというやつに挑戦しようと思い検索したところvs2005stdにそのままインストール出来る
ようなので、したのですがRubyProjectを立ち上げて、新しい項目としてtest.rbという名前にし
print 123
とだけ打って実行してみたのですが、まったく駄目です。
というか、c/c++を今まで勉強してきたのですが今回rubyの入門サイトをgoogleで検索して
一通りみたのですがさっぱりわからず、mainに当たる部分はどこなんだ?
という、たぶんスクリプト言語?ってのをやってる人にとっては「何いってんだ?」という
質問かもしれませんが、できたら何をどうして、どのページを参考にしたら良いのか
教えていただきたいです。
お願いします。
765 :
デフォルトの名無しさん :2007/01/08(月) 05:02:07
マルチはどうでもいいが、VisualStudio2005用のRubyプラグインがあるんすか?マジ?
検索すればいいと思うよ。
767 :
デフォルトの名無しさん :2007/01/08(月) 06:20:07
Ruby.NET
>>761 Rubyというやつとvs2005stdというやつの間には何の関係もない。
769 :
761 :2007/01/08(月) 09:13:05
いや、でも
http://www.sapphiresteel.com/IMG/pdf/rubyinsteel_userguide.pdf のページにvs2005std以上だと使えてインストールの仕方が書いてあるんですが
まぁ、興味本位で、Rubyに触ってみたく検索したら環境を統合できそうだったので
インストールの仕方見ながらやって、環境は統合され認識もされるけど
コンパイル実行の段階で、エラーに、/Cや-rといったリンカ関係か〜?と思うような
メッセージしかでず、結局、初心者の自分には、何が足りないのかが分からずで
実行できないままで、もうめんどくさいので全部いったん消して、普通にRuby落として
PATH通して、なんかのフリーのエディタ使ってやってみます。
ずっとC/C++ばっかやっててJAVAはやったけど重いし好きじゃないし
C#はインテリセンスがうっとおしいしってな具合でそれら以外の言語をちょっと
さわりたくなったわけで・・・
まぁ、その、あれだ
マルチしてすんませんでした。
>>761 Rubyはインタプリタ言語です コンパイルは不要です
Rubyに限らず、動的な言語にはコンパイラーはありません
ネットでインタプリタ言語を少し調べてみてください
ソース解析して構文木つくるのも、コンパイルと言えばコンパイルだけれども…
772 :
デフォルトの名無しさん :2007/01/08(月) 10:58:02
>>761 が言ってるのは、Railsの開発環境だな
>>769 > C#はインテリセンスがうっとおしいしってな具合でそれら以外の言語をちょっと
いやそれ言語の機能じゃないしw
>ずっとC/C++ばっかやっててJAVAはやったけど重いし好きじゃないし >C#はインテリセンスがうっとおしいしってな具合でそれら以外の言語をちょっと >さわりたくなったわけで・・・ あほが
Javaが遅いと嘆く奴 ≒ Swing使用者 + JavaのI/Oはデフォでバッファリングしないのを知らない奴
さすがRuby使いはキチガイだ
>>769 なぜ、/C や -r がリンカ関係なんて発想が出てくるんだ?
Matzしつけー
Python最高!(by秋山)
殺伐としてきたな
781 :
デフォルトの名無しさん :2007/01/09(火) 16:04:07
教祖様からして「PHPは言語として(ry」とか言ってる厨なんだから、しかたないでしょう。
おおっぴらに、人気のあるものを批判すると変な目で見られるのはしかたないな。 言ってることは別に間違っちゃいないと思うけど。 実際まともな反論もないし、批判の内容は誹謗中傷と大して変わらないw 無駄なのにね。
783 :
デフォルトの名無しさん :2007/01/09(火) 18:52:35
Rubyは言語として(ry
Matzしつけー
785 :
デフォルトの名無しさん :2007/01/10(水) 06:25:15
786 :
デフォルトの名無しさん :2007/01/10(水) 06:26:06
>>781 なんで、phpをあーだ言っただけで、厨なんだ?
厨じゃない俺から言わせれば、phpは言語として(ry
だが・・・
黙ってRubyを崇めろ。 他の言語がクズであることを理解するまで。
とりあえず初學者スレよりは本スレ向きの話題だな 変な流れを断つ為にも質問は受付中
789 :
デフォルトの名無しさん :2007/01/10(水) 09:56:45
質問してきた人を馬鹿にするのがRuby使い
>>789 おまえが馬鹿にして、そしてそういう台詞を言ってるんだろう。
では質問を。 Linuxで、書いたスクリプトに#!行を付けて、PATH通してコマンドみたいに使いたいんですが、なにかrequireしてると実行されません。 直接コマンドラインからrubyに読ませると、スクリプトは問題なく動きます。 requireがあるスクリプトを#!行で実行する手だてはありますでしょうか。
なんか勘違いしてそうだね
実行されてる ruby のバージョンが違うんじゃないの?
とりあえずスレ違いなので初心者スレにでも池
ここ初心者スレちゃうんかと
>>792 #!/usr/bin/ruby
require 'kconv'
STDOUT.print STDIN.read.toeuc
この程度のものなんですが、PATH通してrehashしても
コマンドが見付かりません、と言われます。
(Vine Linux3.2 + tcsh + Ruby1.8.2[i386-Linux])
エラーは全文書け 略すな 訳すな
>798 Rubyあるいは使っている人間のどちらかに重大なバグがある。 どちらにしろ使うの止めたほうがいい。
まさか r-x にしてないとか ./hogehoge じゃなくて hogehoge で実行とか
802 :
デフォルトの名無しさん :2007/01/10(水) 15:15:50
改行コードが cr lf になっているということもある。
>>799 コマンドが見付かりません、で全文です。
(Rubyにではなくシェルが付けて来た文句)
紛らわしくてすみません。
で、結局
>>802 さんの指摘の通りだったようです。
結果スレ違いな質問ですみませんでした。
PHPですらlfで動くのにRubyは(ry
805 :
デフォルトの名無しさん :2007/01/10(水) 19:22:26
#! の行を解釈するのはカーネルです。 そのため /usr/bin/ruby\r を実行しようとしますが、 そのコマンドは存在しないのでエラーになります。 ruby かどうかには関係ありません。
806 :
デフォルトの名無しさん :2007/01/10(水) 19:24:28
Rubyはカルトなので、いかなる批判も許しません!
男らしくてステキ!
Rubyの世界ではカーネルが#!の行を解釈するのか。 シェルじゃないのか。 すごいな。
>808 shebangの解釈はexecve(2)が行う。 これまでシェルが頑張ってるとでも思っていたのか。
いくら荒そうとしてもニワカ君じゃあ間抜けでだめだねw
素直に飛行機から投げ捨てられたコーラ瓶で肉叩いてろ
812 歳が判るような判りにくいネタを・・・ww
>>808 #!/bin/sh
↑こういう行で何か思うところはないかね
>814 808じゃないが、>810を知る前は 単純にシェルがshを起動してるんだと思ってましたorz ハイアホデス
実行はカーネルからだけど どうみても#!の行はshellが解釈してるだろ 本当にありが(r
コマンド叩いたときに、シェルがやってるのは大筋で、 1. 入力を、変数展開とかクォート処理ののちトークンに分割。 2. 環境変数PATHの要素のディレクトリそれぞれについて 一覧を見て、第1トークンに一致する実行ビットの立っているなものを探す。 3. 見つかったらそいつに残りトークンを添えてexec(2)系システムコールを発行してwait。 見つからなければCommand not found. あとはカーネルの仕事。
>>818 パイプとか
リダイレクトとか
ヒストリーとか
他には?
>>819 一所懸命皮肉を言おうとして、全部失敗してるもんな。
でもシェルの存在を知ってたのは偉いぞ。大したものだ。
>820 そりゃほかにも、変数の展開とか、ifなどの制御とかはあるだろうよ。
大筋って書いてあるだろ。
>>808 のシステムでは、今でもtexec(3)ががんばってるんだよ。
ほっといてやれ。
WIN32OLE を使用して、 ブラウザー操作をしています。 JapaScriptポップアップが出現したら消すよう制御したいのですが 可能でしょうか? できればWIN32OLEでの実現法を知りたいです。 宜しくお願いします。
そもそもjavascriptを無効にしておくという選択肢はない? まじめに考えると、 自分でそういうポップアップ「だけ」出るページを作って実験するのがいいと思う。 irbからでも操作できるので実験するのがいいよ。
すげえ的はずれ
「プログラムの追加と削除」 ↓ 「コンポーネントの追加と削除」 ↓ 「スクリプトデバッガ」をアンインストール
830 :
826 :2007/01/12(金) 13:52:49
上記の質問引き続き宜しくお願いします。 ブログを巡回して自作ブログ検索エンジンを作成しているのですが、 やはり net/httpだとJavaScript周りの値が拾えなくて困っています。
832 :
デフォルトの名無しさん :2007/01/12(金) 20:16:21
質問なんですが、Windowsで、メッセージボックスを簡単に出す事はできないでしょうか・・・
>>831 2ch止まるの?
できますよ
835 :
832 :2007/01/12(金) 20:45:19
行けました! WSH使うんですね! require 'win32ole' WIN32OLE.new('WScript.Shell').Popup("hoge", 0, "error")
836 :
832 :2007/01/12(金) 21:05:59
続きです。 unixなど、win32oleが上手く行かない環境の場合に、フラグ立てて、 違う処理をしたい(例えば、標準出力にメッセージを出す)のですが begin require 'hoge' rescue end とかでも普通にエラーが出てしまいます。 コンパイル時にエラー出しているんですかね なんとかする方法はないでしょうか?
rescue LoadError
irbで実験
無指定rescueで捕まえられるのはStandardErrorとそのサブクラス。
841 :
832 :2007/01/12(金) 21:39:07
>>838 それだ(゚∀゚)
is_win32 = begin
require 'win32ol'
true
rescue LoadError
false
end
wineがあるとロードできてしまう罠。
843 :
デフォルトの名無しさん :2007/01/13(土) 00:04:24
PLATFORMみるのじゃダメなのん?
win32oleが動く環境かどうかを見たいだけなんだから、これはこれでいいんじゃね?
スクリプトの途中で irb を起動することってできないでしょうか? たとえば
すいません。途中で書き込んでしまいました。 たとえば、以下のようにしたいと思ってます。 class Foo end foo = Foo.new # ここまで実行して、そのコンテキスト(?) で irb を起動したい。 # require "irb" # IRB.start # ↑だと Foo クラスは見えるのですが、foo が見えません。
>>846 irbの呼び出しはそのとおりでいいけど、fooが見えない、というのは
スコープの問題と言っていいのだろう。
あるファイル中のトップレベルで定義したローカル変数は、同じ
ファイルの関数や、他のファイルから参照できない。
たとえ同じファイルでも、異なるメソッドからはローカル変数って
引数として渡さない限り参照できないだろ?
グローバル変数か、定数にするしかないな。
bindingをどーにかして渡せないもんかな。
vrubyについての質問です。 Edit1 と Edit2 があったとします。 Edit1にフォーカスが当たった状態でタブキーを押すと Edit2にフォーカスが移動するようにしたいのですがどのようにすればよいのでしょうか?
条件式としての範囲式の用法を勉強しているのですが、 i=0 while i<4 print i if (1<=i)..(2<i) i += 1 end を実行すると、12が表示されるのではなく、123が表示されてしまいます。 期待する12という表示はなぜ得られないのでしょうか?
Rubyにおいて条件式、 if x などで偽と判定されるのは、 ・xがfalseだったとき ・xがnilだったとき の場合のみだ。Rangeオブジェクトはそのどちらでもないので、真になる。
ifの中でnilは偽にならないときがあるような・・・
>>852 それは単にnilになってないだけでは
空(empty)であることとnilであることは違う
irb> unless nil then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> unless '' then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless ''[0] then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> arr=Array.new
irb> unless arr then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless arr[0] then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> hash=Hash.new
irb> unless hash then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless hash['hoge'] then puts 'NIL' else puts 'NON-NIL'end
NIL
こんな文法があったのか。全然知らなかった。
ifって結構意外な仕様持ってるよね if /re/ とか書けるっけ?
859 :
デフォルトの名無しさん :2007/01/14(日) 13:55:51
今ためしてみたけど書けないっぽい (それ書いてもどうなるものでもなさそうだけど)
ifだけ微妙に式解釈が異なるってちょっとキモいな・・・。BASICじゃあるまいし。
$_がセットされてれば if /re/ は機能する
862 :
デフォルトの名無しさん :2007/01/14(日) 14:21:33
>>856 これって、if 自身が状態を持っているようですね。ローカル変数のような。
そのため、以下のソースを実行すると、x=3,y=5と表示されることがあります。
x = 1
while x <= 4
y = 5
while y <= 9
b = y == 6
e = y == 8
printf "x=%d,y=%d\n", x, y if b..e
break if x==2 && y==6
y += 1
end
x += 1
end
>850です。
>>856 式2は (i<2) ではなくて (2<i) です。
> ここでわかるように式2が真になるまでが条件だから、
式2が偽になった回でもその一回は結果として真になる、ということですよね。
そこで、 (2<i) の部分を (2<=i) にすれば意図どおりのタイミングで偽になるように
なるかと思って試しましたが、これも123と表示される結果となりました。
そこで856の「一周しているから」という文により気づいたのですが、式2が真となった
回の次回以降は、リファレンスにあるように偽になるのではなく、式1の評価に戻る、
ということですね。
そうなると、式2を(2<=i)と変更した場合に 3 が表示される理由も分かります。
ようやっと条件式としての範囲式の意味が理解できました。
856さん、他のみなさん、ありがとうごさいました。
>>862 その式の状態が、コード単位なのかメソッドの属するオブジェクト単位なのか
スレッド単位なのかメソッド呼び出し単位なのかよく分からんことから
範囲式について調べようと思った、というのがそもそもの動機なのですが、
>856> でもまあ、ふつうはこういう書き方はしない方がいいです。
と言われているとおり、862をみると、「一周する」ということが確かな状況以外では
誰が読んでも意味不明なコードになるだろう、ということは分かりました。
もし純粋にif文単位で状態が保持されるのなら、例外で中断して再開した場合に
その式を評価した場合に状態が引き継がれたりするなどひどい泥沼になるように
思えるので、深入りせずここらで引き上げることにします。
>>863 メソッド呼び出し単位。
状態を持っているのはifではなくて、flip-flop operatorで自動的に作られる
隠しローカル変数。
>>864 864を見て試してみましたが、たしかにメソッド単位のローカル変数のようですね。
Proc.newやloopやtimesなどにブロックを渡してその中で範囲式を使ってみましたが、
ブロック内のローカル変数とは違って、状態は記憶されているようです。
ブロック付きopenをループやretryで複数回実行するときなどは注意が必要そうですね。
866 :
デフォルトの名無しさん :2007/01/15(月) 11:47:08
flip-flip operatorって、awkやってた人くらいしか使わんのかな?
>>866 awk/sed ではそれなりに使ったけど
perlやrubyでは使ったことない。
868 :
デフォルトの名無しさん :2007/01/15(月) 16:45:53
今なら開いたよ。
あ、ほんとだ。 どもでした。
unset var みたいに、ローカル変数を取り消すことってできますか
undef
873 :
デフォルトの名無しさん :2007/01/16(火) 11:01:25
文字列の100から450文字を指定した文字に置き換えるにはどうすればいいのでしょうか? str[100,350] = "g" でやると、一文字しか置換されないのです。かといって"ggggg…"のように長くは間違いがでそうだし 何か簡単にする方法はありませんか?
>"ggggg…"のように長くは間違いがでそうだし Rubyでは同じ文字列のくり返しは乗算で実現できる。 "g"*350とか。
"g" * 351 は?
レス内容被った。スマソ
>>871 nilを代入するのではダメでシンボルテーブルから変数名自体を消したいってこと?
>>872 undefはメソッドしか未定義にできないな。
これも厳密には未定義にするわけじゃなかったり。
878 :
デフォルトの名無しさん :2007/01/16(火) 13:06:30
今度は、100から、350000000までを置き換えたいのですが "g"*350000000とすると、メモリを300MBも消費しました。 なんとかする方法はないですか?
ループでやれば?
メモリを増築すればいいと思うよ。
350000000.times {|i| str[i + 100] = 'g' }
貧乏ならともかく300MBぐらいなら問題とは思えんが。 ループでやったって置換した結果の文字列のほうは結局大きくなるんだから変わらん気がす。 てっきり勉強目的で意味がないことをやってるんだと思ってたんだけど なんか目的があるなら、それを言えばなんか考えてくれる人がいるかもよ。 特に意味はない話ならメモリを300MB使うことなどなんら問題じゃない。
ネタじゃなかったのかwww・・・?
g*35000000を代入する場合は、一時的に右辺のオブジェクトと代入後の strの両方が存在するから1つずつ置き換えていくよりメモリは余計に必要。 だと思ったんだが、もしかしてRubyでは部分文字列は共有されてるのかい?
つうか、本気だとして、こういうのは置換後の長大な文字列の使用用途にもよると思う ファイルに保存するなら置換しながら…というか書き込みながら続ければいいわけだし
str.fill("g",100..350)
>>885 それが一番の問題だと思う。初心者スレだからなおさらだな。
strに350MBもデータをコピーしてる時点でなんか間違ってる
可能性が大きいわけで、fillを使えば済む話じゃないかもしれん。
887 :
デフォルトの名無しさん :2007/01/16(火) 19:32:58
質問したいのですが、ファイルの有無を判断するのにはどうしたらいいんでしょうか? いろいろと調べてみたのですが、わからないのでどなたかわかる方がいらっしゃったらよろしくお願いします。
FileTest
>887 FileTest.exist?(filename) filename が存在する時、真を返します。
891 :
デフォルトの名無しさん :2007/01/17(水) 00:28:12
892 :
878 :2007/01/17(水) 00:28:46
893 :
デフォルトの名無しさん :2007/01/17(水) 00:58:12
インスタンスメソッドをクラス定義の外でする方法は何かありますか? クラスメソッドなら class ClassA ・・・ end def ClassA::method_b ・・・ end のような形で書けるみたいですがインスタンスメソッドの場合がどうも見当たらないんです。
>>893 ClassA.class_eval{
def foo
・・・
end
}
>>891 >プログラミング言語はすべて愛おしい
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
>>886 > str.fill("g",100..350)
String#fillなんてあったっけ?
>>897 fillはArrayだった。886は間違い。
>>894 なんでこれが、クラスではなくインスタンスのメソッドになるのか
ちっとも理解できないのだけれど……。
分かりやすいサイトプリーズ
>>899 わかりやすいサイトは思いつかないが、スコープの問題を除けば、
class ClassA
# X
end
と、
ClassA.class_eval{
# Y
}
とでは、XとYは同じ環境になる。
単にそれだけ。
すまん。インスタンスメソッドと、 特定のインスタンスだけに定義されたメソッドを混同していた。 さいきんruby使う暇なくて忘れてたorz
>>877 >nilを代入するのではダメでシンボルテーブルから変数名自体を消したいってこと?
そうです。ERB用にこんなことをしたいんです。
# HashからBindingをつくる
def create_binding(_hash)
_defstr = _hash.inject('') { |_s, _e| _s << "#{_e[0]} = _hash[#{_e[0].inspect}];" }
eval _defstr
#undef _hash, _defstr # これができないものかと。
binding()
end
b = create_binding(:a=>10, :b=>'foo', :c=>%w[x y z])
>>896 たしか Matz は I hate C++. と逝っていたと思うんだけど、
それでもいとおしいと思ってるんだね。
嫌よ嫌よも好きのうち?
>>903 むしろ一時変数なんか気にすんなって言いたいが。
そもそもevalした時点で安全でなくなっているわけだし。
ハッシュ受け取ってローカル変数なりクラス変数なりに展開するERBの子クラスを作ればいいんじゃないのか。
流れ見ないで書き込むんだけど、evalとかで変数表を表示したときに 一時変数も一緒に出て来てしまうのが気に入らないとか?
>>903 とりあえず現在のところローカル変数を明示的に消すことはできない
のでやりかたを変えるしかない。
>>904 最近は本気で2chのデマを信じ込む奴が結構居るから、
これくらいのアッサリ風味でこられると本気なのか釣りなのか判断つかない。
いるよな、デマだということにして火消しに必死な奴 関係者か?
本人乙
RHGの20.2.2によると、ruby-talkでmatzがそう発言したということらしいが、軽く探しても見当たらなかった。
いつも大事にお使いいただきありがとうございます。 煽りあいは本スレでお願いいたします。
Dir.globってなに?。自分でオープンすれば代替できるからいいんだけど。 irb(main):001:0> Dir.glob("c:/本/*") => [] irb(main):002:0> Dir.open("c:/本") do |dir| irb(main):003:1* dir.each do |f| irb(main):004:2* p f irb(main):005:2> end irb(main):006:1> end "." ".." => #<Dir:0x3a1e55c> Windows2000/VISTAの話で入れたのはActiveScriptRuby "本稼動"だの"本番"だのが共有ディレクトリ内にあるんだな
globはワイルドカードを展開するという意味の動詞。
>>903 空のBindingを作ってから他のローカル変数を追加すればいい。
def empty_binding
binding
end
def create_binding(h)
b = empty_binding
h = h.inject({}) {|hx, (var, val)| hx[var.to_s] = val; hx}
arg = "__a"
arg.succ! while h.key?(arg)
eval((h.keys << "nil").join(" = "), b)
h.each {|var, val| eval("proc {|__a|#{var}=__a}", b).call(val)}
b
end
# テスト
b = create_binding(:a=>10, :b=>'foo', :c=>%w[x y z])
p eval("a", b)
p eval("b", b)
p eval("c", b)
p eval("h rescue $!", b)
p eval("__a rescue $!", b)
完全マッチさせる方法を教えてください。 if /1/ =~ input これだと、inputが11や111でもマッチしてしまいます。 input = 1の時だけマッチさせるにはどうすればよいでしょうか?
/\A1\z/
input == "1"
920 :
917 :2007/01/18(木) 19:26:27
>>918 やってみたところ、1もマッチしなくなりました;
>>919 inputは入力されたものです。説明不足ですいません。
921 :
デフォルトの名無しさん :2007/01/18(木) 19:34:54
/^1$/
if input.chomp == "1"
923 :
917 :2007/01/18(木) 19:43:32
924 :
917 :2007/01/18(木) 19:45:59
>>922 その方法でうまくいきました。
有り難うございました。
いいのかそれで・・・
単に改行を取り忘れたいただけ?
だね。 /¥A1¥z/ =~ input.chomp でもマッチするだろう。
>>914 "本" のシフトJISコードの2バイト目が "{" なので
こいつをワイルドカード文字と誤認識して異常動作している
私も以前にこれに引っかかりました
Dir.open('ほげほげ').to_a
とかに変えた記憶があります
・ディレクトリエントリのみの配列になる
・ドットファイルも含まれる
・ディレクトリの再帰検索は出来ない
・パスデリミタとしてバックスラッシュも使える
という違いがありますが、大抵はこれで事足りるような気がします
シフトJISの呪いはいつまで続くのでしょうか
>>929 違う。純粋にglobingのルーチンの問題。
実は1.9で使われているglobingルーチンでは解決しているが、
なんのかんので1.8にバックポートされていない。
1.8.6で入れてくれ。ってリクエストしてもダメかねえ。
最近テキスト処理なんかの事務作業のためRubyの勉強始めたんですが
リファレンスはHowToな対応できても基礎がわかってなくて不安です
で、高かったり厚くても問題ないので、1冊だけ読むならこれ、っていうお勧めの書籍ってなんでしょうか?
一応amazonとかみると「プログラミングRuby―達人プログラマーガイド」
が評判良さそうなのですが、
>>281 >>286 でもあがってないし少し古いのでどうなんでしょか?
(ちなみに他言語はそこそこ触ってます
他の言語使った経験あるなら webの情報でなんとかなりますよ
あ、あえて薦めるとしたら、 Rubyソースコード完全解説 RubyHackingGuide
934 :
931 :2007/01/19(金) 12:46:59
サンクス >webの情報でなんとか 割とそうですがそういうもんでしょうか Rubyソースコード完全解説は趣旨と違うけど面白そう
>>934 私はwebの情報を見ながらだけど
あなたと同じように
これで大丈夫なんかいな?
基礎分かって無いで使ってるけど?
みたいな心配がありました
ちょっと趣きを変えて
Rubyソースコード完全解説
を読んでみたら
読んだあとはすらすら使えるようになってました
>>930 > 1.8.6で入れてくれ。ってリクエストしてもダメかねえ。
ちと、そのへんの強化策を考えないといかんかねぇ。
有用そうだけど1.9からバックポートされてないのというと、こんなところか。
* multibyte path globing
* large file support
* override by forwarding
>>934 自分はJavaからやった。
Javaは書籍が豊富だから。
回り道のように思えるけど、自分はこっちの方が効率がいいと思っている。
>>936 override by forwarding って何?
939 :
デフォルトの名無しさん :2007/01/19(金) 17:51:41
学校の宿題で配列でHeapを実装しろとかでてきました(>_<)誰か教えてください。
うむ、とりあえず、配列でヒープを実装するんだ。
$stderr.print "\a" while 1 コレでいいだろ?
942 :
デフォルトの名無しさん :2007/01/19(金) 18:27:11
943 :
939 :2007/01/19(金) 19:37:21
いじわるしないで誰か教えてください(>_<)時間ないんです。ちなみに東大生じゃありません。 あとできればヒープソートの作り方も教えてください。
二分ヒープなら、nの位置の親の子は 1始まり→2nと2n+1 0始まり→2n+1と2n+2 に入れればいい。
945 :
939 :2007/01/19(金) 19:50:07
解答ありがとうございます。でもちょっとよくわかりませんね(;^_^A 自分でもうちょい考えたら改めて質問に来ます。
宿題スレいけよ
948 :
939 :2007/01/19(金) 23:10:16
>>938 read()とかwrite()とかを#defineで置き換えてるのを、DLLのforwardingで置
き換えるようにするというのを勝手に「override by forwarding」と書いた。
ChangeLogにはaliasと書いてあったので、
「symbol alias by forwading」ということにしよう。
svnでいうとrevision 9502。
つーか
>>914 は単にディレクトリが空だから
Dir.globが空Array返したってだけじゃないのか?
"*"はdot fileにはマッチしないんだから。
>>936 coding pragma を追加したいところだけど、あれは1.8には持ってこれない
という話だから、それくらいかな?
ところで署名でも集めるの?w >強化策
>>949 お前だけだ。分かってくれたのは・・・。
もう少して危ない人になるところだった。
exerbについての質問です。 レシピファイル作成をスクリプトの実行と同時に自動で行う機能があるとのことですが、 ずっとループし続けるスクリプトの場合には、自動生成できないのでしょうか? もしあれば教えてください。
ループ一回したら終了するの作ってレシピ作ればいいじゃない
なるほど! 実際、requireするのを探すだけですもんね。 ありがとうございました。
957 :
デフォルトの名無しさん :2007/01/20(土) 15:08:27
下のようなスクリプトが終了したとき test という文字列のあと端末の高さぶんの空行が開いた後に プロンプトが表示されます。 この空間ができないようにするにはどうしたらいいんでしょうか? Curses::stdscr.setpos(Curses::stdscr.cury - 1, 0) をはさんでみるなどしてみましたがダメでした。 端末は Cygwin/ck/screen/zsh です。 require "curses" begin Curses::init_screen Curses::stdscr.addstr("test\n") Curses::stdscr.refresh() rescue Curses::close_screen end
>>951 そのとおりだが、globが駄目なのはファイルを作って試してみれば明らか
>>928 が説明してくれている通りで、例えば'も'を含んだパスとか駄目
HTML(string)をDOM的に解釈して扱うライブラリあるかな と思って探したんですが見つけられませんでした そういったライブラリってありますか?
たぶんない。 どうしても DOM を使わなければいけない理由がなければ、 DOM を使わないほうが楽なので。
>>957 $TERMはなんになってる?
screen抜いてみたもダメ?
>>960-961 ありがとうございます
jsを扱ってきたのでDOM処理ができれば今後も楽だなぁと思ったんですが。
単純な文字列処理でも強力なので素直にそっち使っていきます
>>964 面白そうなモノをありがとう
しかしなぜか(←思考停止)モジュール内部でエラー出してだめだったので
人並みにruby出来るようになるまで正規表現で対応します
966 :
デフォルトの名無しさん :2007/01/22(月) 12:42:32
>>966 どっちみち手動でも自動でもテストはしなきゃ話にならんのだから使いたいときに使えばよい。
>>966 少なくともSyntax Errorはコンパイル時にチェックしてるようなので
問題ないと思うんだが
>>950 ああ、それのことか。
それに関しては1.8にバックポートされる可能性はないと思うよ。
列挙型ってあります?
>>966 1.8以降なら、たとえば "lit#{code}eral" は
"lit" << code.to_s << "eral" とおなじ形に解釈される。
普通のrubyコードでチェックされる点はチェックされるし、
チェックされない点はチェックされない。
973 :
966 :2007/01/22(月) 23:13:37
書いた後で、実行時にコンパイル含めいろいろするんだから 変なこと言ったかな?と思ったんですが、 どうやら、自分が言いたかったのは、ruby -c での構文チェックのことでした。 (後だしっぽくて申し訳ない) ・・・と思ったら、 hoge = 1234 puts "hoge = #{hoge_} でつ" だろうが、 hoge = 1234 puts "hoge = " + hoge_ + "でつ" だろうが、ruby -cは通るのか・・・orz 構文チェックってもしかして、ザルですか?(:D)rz
>>973 だって構文としては正しいし。
self.hoge_を期待するというだけ。
実行時エラーと構文エラーの区別が付いてないやつがいるな
rubyの弱点ではあるな
遅延バインディングをサポートしてる言語はみなそうでは
Cでlintが通ったのにバグって動かないとか言ってる馬鹿とおなじ
980 :
デフォルトの名無しさん :2007/01/23(火) 02:58:23
Rubyはカルトなので批判は許しません!
Rubyの批判をした訳ではないだろうに
中学生が夜中にアンチの真似したら ちょっと滑っちゃったという図
983 :
デフォルトの名無しさん :2007/01/23(火) 06:12:28
批判じゃないってことにするあたりが、ますますカルトっぽくて気持ち悪い
批判ではないものを批判だということにするとカルトっぽくないかというと、 まったくそんなことはないわけで。
宗教話は本スレで 質問受付中
YARV になると、拡張ライブラリの書き方は変わるのでしょうか? 今まで作った拡張ライブラリは書き直しする必要がありますか?
すみません、自己解決しました。 README.EXT{,.ja} の内容見たら変更は無いですね。
書き直しの必要な拡張ライブラリも当然ある。 でも、ここでこんなことを聞くレベルなら、まず問題ないだろう。
どうもです。 今までに書いた拡張ライブラリのうちいくつかを試してみましたが、 RSTRING(s)->ptr => RSTRING_PTR(s), RSTRING(s)->len => RSTRING_LEN(s) とか、 基本的なところから引っかかってしまいました。 コンパイルまで辿り着いても、実行してみたら core 吐くし・・・ どうやら README.EXT{,.ja} の内容も更新されていないようですね。 先は長そうです・・・ orz
内部。
>>989 README.EXT{,.ja}にはRSTRING_PTRとRSTRING_LENは書いてあるよ。
coreを吐くのは、それだけじゃ誰が悪いかよくわからんね。
>>990 一概に外部イテレータがよくて内部イテレータがダメ、ということもなくて、
外部イテレータには確かに内部イテレータにできない操作もできるけど、
逆にその分扱いにくい(記述量が増える)という欠点もある。
両方使えるのが理想じゃないかね。
なお、Rubyで外部イテレータを使いたい場合は require "generator"
これ、組み込みにならないかねえ。
>>992 ありゃありゃ、確かに書いてました。すみません。
core の方はまあ自力でなんとかしてみます。
ただ、ウチの環境 (FreeBSD 6.1) だと、拡張ライブラリ関係なく挙動が怪しいので、
拡張ライブラリの前に解決すべき問題が山のようにありそうです・・・
私のコンパイルの仕方がまずいだけなのかもしれませんが (汗)
^C で止めると core 吐いたり。
% ruby -esleep
^Czsh: bus error (core dumped) ruby -esleep
%
995 :
990 :2007/01/23(火) 16:27:51
>逆にその分扱いにくい(記述量が増える)という欠点もある。 これは(言語)実装者にとって扱いにくいという意味ですよね? 先のenbug diaryによるとPythonではコルーチンを使って平易に実装しているとあります。 このほかに何か内部イテレータのメリットってありますか?
996 :
993 :2007/01/23(火) 16:49:52
>>995 いや、993では処理系実装者にとって扱いにくいかどうかなんて考えてない。
その言語の利用者にとって、だよ。
外部イテレータを使うのも、外部イテレータを作るのも、内部イテレータの
それに対して記述量が必然的に多くなる。
Pythonのように外部イテレータを内部イテレータ的に利用するsyntax sugarを
用意すれば、使う方に関しては若干ましにはできるけどね。
というか、990で参照してる日記の先頭のリンクを辿れよ。
>Pythonのように外部イテレータを内部イテレータ的に利用するsyntax sugarを >用意すれば、使う方に関しては若干ましにはできるけどね。 若干ましというより Python のほうがはるかに使いやすくねえか?
Rubyなぞ問題外(^^;
>>997 そうか?
好みの問題もあるから、あんまり強くも言えないが、「はるかに使いやす」いとは思わないな。
せいぜい、これはこれで悪くない、くらい。
Matzが内部イテレータがいいと言ったら内部イテレータがいいんだ! ほかに理由などない!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。