1 :
デフォルトの名無しさん :
2012/05/09(水) 05:04:47.69
・ いつものエディタとターミナルという普段着でお越し下さい ・ エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ ・ いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない Q. XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか? A. 好きにしろ
※RubyやRuby使いに対する不満や愚痴などは本スレやバトロワスレなどをご利用下さい
6 :
uy :2012/05/09(水) 11:06:06.87
Cで作ったDLLライブラリで double型を返す関数や、double型の引数を取る関数を Rubyから呼び出すにはどうすればいいんでしょうか?>< INTしか受け取れません p Win32API.new("Lib.dll", "_RadToDeg", "i", "i").call 30
Ruby/DLを使えばいいんでは。
8 :
uy :2012/05/09(水) 11:54:38.08
ありがとうございます 読めました
クラスでインスタンスした時のものなんだが #<Hoge:0x0000000c9c12e0> 0x0000000c9c12e0ってアドレスの値ですか?
10 :
デフォルトの名無しさん :2012/05/09(水) 22:24:20.75
Object#to_s のデフォルトは sprintf("#<%s:%p>", cname, (void*)obj) みたいな感じなので、ポインタ値。 大抵のポインタの実装はアドレス丸出しなのでアドレスと思ってよいでしょう。
数値を'hoge'に変換(例:2=>'hoge')するんだけど、ただし<>内に含まれている数値は 対象外にする。 変換対象の文字列は13<aa12><444>1なかんじで 正規表現でhogehoge<aa12>hogeにしたい。 そのような正規表現はどう作ればいいのですか? うまくいかない
すいません上の例は 13<aa12><444>1 の文字列を hogehoge<aa12><444>hoge に変換です。 宜しくお願いします。
'13<aa12><444>1'.gsub(/<.*?>|(\d)/){$1 ? 'hoge' : $&} => "hogehoge<aa12><444>hoge" <>のネストが無いならこうかな?
14 :
デフォルトの名無しさん :2012/05/10(木) 13:30:15.01
File::statで質問です。 File::stat#modeでファイルモードが返ってきますが, 6桁の数字のうち上位3桁の意味が分かりません。 「040755」となっている場合,多分下3桁はいわゆるrwxのことだと思うのですが, 040についてどうやって調べればいいのか。 おこたえいただけるとうれしいです。
>>14 man stat(2)
って言ったらわかる?
16 :
14 :2012/05/10(木) 14:02:03.49
>>15 ありがとうございました。わかりました。
6桁ではなく7桁でしたね。040はディレクトリということがわかるようになりました。
17 :
デフォルトの名無しさん :2012/05/12(土) 03:05:20.98
Googleで「ぬるぽ」と検索するスクリプトを書いてみたのですがうまくいきません
ここからどうすればいいのでしょうか?
# encoding: utf-8
require "net/http"
require "uri"
require 'nkf'
uri = URI.parse('
http://www.google.co.jp/ ')
res = Net::HTTP.post_form(uri, 'q' => 'ぬるぽ')
puts NKF.nkf("-sm0W8x", res.body)
メッセージがわかりにくいとはよく言われるが、Rubyはそこまで意地悪ではない
こちらから聞きさえすれば、いちおうのヒントは教えてくれる
p res #=> #<Net::HTTPMethodNotAllowed 405 Method Not Allowed readbody=true>
ということで、
http://www.google.co.jp/ は POST を受け付けていない(というかURL間違ってる)。/search に対して GET 送れ
あと、net/http は uri ライブラリを既に呼んでいるので require 'uri' は不要
Ruby1.9.x 専用なら NKF もたぶんいらない
# encoding: utf-8
require "net/http"
uri = URI.parse(URI.encode('
http://www.google.co.jp/search?q=ぬるぽ&ie=utf-8&oe=shift_jis '))
res = Net::HTTP.get(uri)
res.force_encoding('CP932')
puts res.scan(/<title>(.+?)<\/title>/).flatten[0]
Hash で書くだけで適当に GET 用の URL エンコード(www-form-urlencodedではない)してくれる方法は誰か偉い人が教えてくれるはず
20 :
17 :2012/05/12(土) 11:52:25.48
ありがとうございました。 「ぬるぽ」だとinvalid multibyte charが出たので「nullpo」にしてみたら nullpo - Google 検索 と出てきました
# encoding: utf-8 は、このファイル「が」 UTF-8 で書かれているという意味の指示記述 UTF-8 「を」読み込むとか UTF-8 「で」表示するという意味ではない このファイル「が」 UTF-8 で書かれていないのなら、UTF-8 以外を指定するべきだな Windwos のようだから、 CP932 が妥当なのか
Windows-31Jディスってんの?
24 :
uy :2012/05/12(土) 12:58:12.30
マジレスするとわざわざrequire "net/http" でやりたいとかじゃなければ Mechanizeでやったほうが999999999倍マシ
将来iconvを使う羽目になったときに、CP932という名前ならほぼ確実にどこででも使えるけどWindows-31Jは使えないことがある さらにWindows-31Jは若干名前の筋が悪くて、Encoding::CP932 はそのまま書けるんだけど Encoding::Windows-31J は定数としてそのままアクセスできない irb> Encoding::CP932 => #<Encoding:Windows-31J> irb> Encoding::Windows-31J SyntaxError: (irb):2: syntax error, unexpected tCONSTANT, expecting $end irb> Encoding::Windows31J NameError: uninitialized constant Encoding::Windows31J irb> Encoding::Windows_31J => #<Encoding:Windows-31J> だから少なくとも初心者スレでは一貫してCP932という言葉を使う 本来のShift_JISとCP932とWindows-31Jの差異については、歴史的経緯を紐解かなければならなくなったら自分で調べるだろう
ttp://takobouzu.la.coocan.jp/index.php/2012/01/競馬時計分析のアプローチ (3)/
この解説のスクリプトを起動したいのですが
下部のソースコードを起動しても
:2: syntax error, unexpected '<'
<p> </p>
^
:3: unknown regexp option - p
:4: syntax error, unexpected '<'
<p> log.info("調教時計抽出開始")</p>
:5: unknown regexp option - p
:6: syntax error, unexpected '<'
<p>outfile1 = open(outdirectory + "\\" + "調教時計.txt", "w")</p>
^
:7: syntax error, unexpected $undefined, expecting $end
...[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/ =~ |hafi|ename then ...
と出てうまく起動しません
エラー文を調べたところ構文エラーらしいのですが
どう直せばよいのでしょうか?
つまりRubyの知識ゼロの状態ってことか なんかlzhのデータファイルが別途必要なんだけどそれはあるのね lzhコマンドも必要だけどインストールしてあるのね HTMLの<p>タグを取り除いてRubyスクリプトとして適切に改行を揃えればいいんだけど、たぶんそれを自力でできるほどの知識がないのよね レスとして貼るには長いな
28 :
デフォルトの名無しさん :2012/05/12(土) 18:31:20.03
とりあえず <p> </p> を全部消せ。話はそれからだ。
>>27 大学でCなんかはかじったレベルなんですが
Rubyは触った事無いです・・・これを機に少し勉強しようかなとも思ってます。
lzhはデータファイルはinフォルダに格納してあります。
解凍にLHAが必要ということでLHA32をダウンロードしています。
コマンドプロンプトで実行したところ解説ページと同バージョンでした。
>>28 ありがとうございます。
とりあえずTerapadで<p>タグを消して改行して揃えてみます。
>>28 やってみるとわかるけど、それだけでは動かない
コメント避けて改行つけないといけない
<p>タグを消して改行したところ エラーは消えました。 今度は3行目でsyntax error, unexpected tIDENTIFIER, expecting $endと出ました。 改行コードがダメらしいんですね。 難しいです
# -*- coding: cp932 -*- require 'logger' log = Logger.new(STDOUT) log.level = Logger::DEBUG log.info("調教時計抽出開始") indirectory = "C:\\調教時計分析\\in" workdirectory = "C:\\調教時計分析\\work" outdirectory = "C:\\調教時計分析\\out" outfile1 = open(outdirectory + "\\" + "調教時計.txt", "w") Dir::foreach(indirectory) {|lhafilename| next if lhafilename == "." or lhafilename == ".." if /^kd3_hb[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/ =~ lhafilename then #KOLデータパックファイルをLHA解凍 cmd = "lha32 x -nc " + indirectory + "\\" + lhafilename + " " + workdirectory + "\\" system(cmd) open(workdirectory + "\\" + "kol_den2.kd3") {|file| while line = file.gets record = line.force_encoding('ASCII-8BIT') #レースID組み立て case record[0,2] when "00" then raceid = record[12,8] + "08" + record[6,6] + record[23,2] #京都 when "01" then raceid = record[12,8] + "09" + record[6,6] + record[23,2] #阪神 when "02" then raceid = record[12,8] + "07" + record[6,6] + record[23,2] #中京 when "03" then raceid = record[12,8] + "10" + record[6,6] + record[23,2] #小倉 when "04" then raceid = record[12,8] + "05" + record[6,6] + record[23,2] #東京 when "05" then raceid = record[12,8] + "06" + record[6,6] + record[23,2] #中山 when "06" then raceid = record[12,8] + "03" + record[6,6] + record[23,2] #福島 when "07" then raceid = record[12,8] + "04" + record[6,6] + record[23,2] #新潟 when "08" then raceid = record[12,8] + "01" + record[6,6] + record[23,2] #札幌 when "09" then raceid = record[12,8] + "02" + record[6,6] + record[23,2] #函館 end
#追切調教情報格納位置の確定 tp = 256 if record[490,1] == "1" then tp = 490 else if record[373,1] == "1" then tp = 373 else if record[256,1] == "1" then tp = 256 end end end #追切調教情報の取得 baba = record[tp + 25, 2] #馬場 basho = record[tp + 17, 6] #場所 course = record[tp + 23, 2] #コース ashiiro = record[tp + 70, 6] #脚色 time_5f = record[tp + 45, 6] #5F #調教時計レコードの組み立て outrec1 = " " + basho #場所 outrec1 = outrec1 + " " + course #コース outrec1 = outrec1 + " " + ashiiro #脚色 outrec1 = outrec1 + " " + baba #馬場 outrec1 = outrec1 + " " + time_5f #5F #調教時計レコードをファイル出力 outfile1.puts(raceid + "," + outrec1) end } end }
#終了処理
outfile1.close
log.info("調教時計抽出終了")
# この上の空行まで
>>32-34 のスクリプト部分をてきとうにエディタにコピペ
>>32-34 ありがとうございます!
早速実行しましたが
:16: in `initialize' : No such file or directory - C:\調教時計分析\work\kol_den2.kd3 (Errno::ENOENT)
と出ました。自分なりに色々しらべてみようと思います。
調べたら inフォルダにあるlzhファイルを解凍 解答したファイルをworkフォルダに格納 これが出来てないんですね・・・ この場合どこを見ればいいんでしょうか?
全部がみっちり結合してるからテストできないんだな こんなスクリプト作ったらいかんよ system(cmd) を p cmd; system(cmd) に書き換えて、文字列 cmd が lha32 のコマンドラインとして妥当かどうか確かめるのが妥当かなあ
>>37 同じエラー文が返って来ました。
コマンドラインとして妥当ではないということなのでしょうか?
関数的メソッド p は引数のオブジェクトを適当に表示する p cmd で変数 cmd の内容が標準出力に表示されたはずだ system() は引数の文字列をそのままシェルに渡す シェルに渡されるはずだった cmd はコマンドラインとして妥当なものだったか? ディレクトリ指定などは誤ってないか? ということを聞きたかったのだと思われる
lzhファイルが置けてないとか?これ実行して出力貼ってみ # -*- coding: cp932 -*- require 'pathname' indirectory = "C:\\調教時計分析\\in" workdirectory = "C:\\調教時計分析\\work" outdirectory = "C:\\調教時計分析\\out" abort "エラー [#{indirectory}]がない" unless Pathname(indirectory).directory? abort "エラー [#{workdirectory}]がない" unless Pathname(workdirectory).directory? abort "エラー [#{outdirectory}]がない" unless Pathname(outdirectory).directory? lzhfound = false Dir.foreach(indirectory) do |file| if file =~ /.*\.lzh$/ lzhfound = true if file =~ /^kd3_hb[0-9][0-9][0-1][0-9][0-3][0-9]\.lzh$/ p "lha32 x -nc " + indirectory + "\\" + file + " " + workdirectory + "\\" else puts "エラー [#{file}] は名前がおかしいかも" end end end puts "エラー lzhファイルが[#{indirectory}]に入ってない " unless lzhfound puts `lha32` rescue abort "エラー lha32がちゃんとインストールされてない"
>>39 "lha32 x -nc C:\\調教時計分析\\in\\kd3_hb110105.lzh C:\\調教時計分析\\work\\"
というコマンドラインが出力されました。
解凍する対象のlzhファイルと
解凍後のフォルダの格納位置を指定していると思うのですが
このフォルダ指定は合ってます。
ということはうまく解凍されていないということなんでしょうか・・・?
>>40 エラー lha32がちゃんとインストールされてない
と出ました。インストールミスのようですね・・・もういっかい確認してきます
解説ページに コマンドプロンプトから「LHA32」を実行してバージョンが2.67.00であることを確認する。 という一文があって 実際にLHA32を入力するとLHA32 version 2.67.00 for test と出ます。 もしかしてこれだけではインストールされていないんでしょうか?
コマンドプロンプトからだけパスが通ってることってあるのかな? OS再起動したら直るかもしれない 手元のマシンにはlha32インストールできないから俺はこれ以上ワカンネ
実際にはパス通ってないんだろ lha32.exe のあるディレクトリで lha32 と入力すればそりゃ動く インストール後はコマンドプロンプト流用せずに一旦全部閉じろ
>>44 再起動してみました上手くいきませんでした・・・
>>45 すいませんやり方を詳しくお願い出来ますか?
lha32って普通に落としてEXEクリックでインスコされなかったっけ?
48 :
uy :2012/05/13(日) 04:16:39.17
Lhaz使わない奴なんていんの
CENTOSのruby 1.9.3p194で、gem install rvm をやると /usr/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>': It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby. ERROR: Could not find a valid gem 'rvm ' (>= 0) in any repository ERROR: Possible alternatives: rvm, rVM ってなる。 yaml-0.1.4はインストールしてるんだけど・・ なんで?
Rubyが糞だから 答えは簡単
>>49 libyaml-devel 相当が必要
CentOS 標準では提供されてないので、epel を有効にしないといけない
openssl-devel と zlib-devel と readline-devel と gdbm-devel あたりも入れとけ
>>47 lha32はいろいろバージョンがあるからなあ
自動でパス設定しないものもあるかもしれん
どのディレクトリでもlha32が使えるのなら、Rubyからでもlha32は使えるはず
最悪な場合はlha32.exeを直接ダブルクリックしてるのかもしれんし
>>46 です。
環境変数でpathをちゃんと指定しなかったのがどうやら原因だったみたいです。
設定後は無事スクリプトが起動しました。
お手数をかけて申し訳ありませんでした。
スクリプトを見て頂いたり原因を探ってくれた方々本当にありがとうございました!
54 :
uy :2012/05/14(月) 06:48:13.19
ハッシュに複数ハッシュを追加したいんですけど storeだと1個ずつしか追加できません 何かいい方法あればおしえてください (ちなみにaのハッシュをbで上書きしたいです) a={ x:2 , y:8 } b={ x:3 , y:4 , z:6}
uy君ほどの人がupdateやmergeを知らないってどういう事なの
56 :
uy :2012/05/14(月) 08:01:20.33
>>55 すみません
ボケていました
marge使った事ありました
知らないわけではなかったです
ありがとうございました
57 :
uy :2012/05/14(月) 08:19:07.28
mergeな
uyは変態だからしょうがない
>>51 最新のlibyamlを自前コンパイルしてしまうというパターンも多いみたいね
お前ら初心者スレなのに高度すぎ。
nokogiriとかanemoneとか便利だけど、 これってRubyの開発者が用意したプラグインみたいなもんなの?
第三者が勝手に作って公開しているライブラリ 個々にやると使うのめんどくさいのでgemという系統立てたシステムに乗っけるのが主流 "信用できない"のなら使うべきではない、特にバイナリ
なるほど、公式じゃないのに簡単に取り込めるとは便利ですな。 WordPressのプラグインみたいにネットにアクセスしてダウンロードする機能があったら、 ソフト自体も軽くなって更に便利だろうに。バージョンアップも対応できるし。
何を言ってるの?
66 :
デフォルトの名無しさん :2012/05/15(火) 11:02:22.19
Array#indexメソッドで * などの正規表現を使うことはできないようなのですが、 配列から正規表現を使って一致する要素を抽出したい時は each などを使って1つずつチェックしていく方法が普通なのでしょうか?
なんか毎回書いてる気がするが、とりあえずArrayとHashとStringとEnumerableのメソッドは1行の動作説明だけでも読んでおくといい 「そういえばどっかにそんな処理のできるメソッドがあった気がする」とわかるだけでかなり違う というわけで Array#grep か Array#find_all あたりを使え
>>67 Array#grepなんて便利なのがあったのですね。
ありがとうございます。
rubyをフルパス指定した時と、ただrubyとした時で動作が違うって事ある? 同じコンソール(同一ユーザ、同一環境)で、ruby -vと/usr/bin/ruby -vだと ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]で同じ結果。 Hello worldのtest.rbを動かすと、「ruby test.rb」では正常にHello world出力。 フルパスで「/usr/bin/ruby test.rb」だとLoadErrorになるけど、 何回かやるとメッセージを変化させながら最後は正常に動く。 /usr/bin/ruby: No such file or directory -- Dg (LoadError) /usr/bin/ruby: No such file or directory -- -ggdb (LoadError) /usr/bin (LoadError)ch file or directory -- DW 一回動くとまたLoadErrorになって何回かやるとメッセージが少しづつ変化しながら最後は動くの繰り返し。 フルパスでなく、「ruby test.rb」なら何の問題もない(ように見える) こんな事ってあるの?
Rubyのマジックコメントについて質問なんですが open("file.rb","w"){|f| f.print "test".toutf8 } こんな感じにファイルを保存した時って、文字コードはUTF-8Nになっていますが ここで保存したfile.rbをそのまま実行しようとすると invalid multibyte char (US-ASCII) などとでてしまいます なので後からエディタで開いて文字コードをUTF-8NからUTF-8にすると、動きます それか、または書かれてる文字コードはUTF-8N だとしても、以下のようなマジックコメントを入れるだけでも動くんですけどこれでも平気ですか? # -*- encoding: UTF-8 -*- あとRubyは結局、UTF-8NじゃなくてUTF-8でソースコードを書くんですよね? .toutf8メソッドがUTF-8Nに変換してしまうのは何故ですか?
ある 平気
少し自分で調べなおしてみました
>>70 で言ってたのは逆でした、RubyはUTF-8Nで書くんですね
Rubyの
# -*- encoding: UTF-8 -*-
は、暗黙的にutf-8nをさしていて、
UTF-8Nで保存したソースファイルでマルチバイト文字を使う為には
絶対に # -*- encoding: UTF-8 -*- を入れないとエラーになるって事でいいのでしょうか?
ここでまた1個疑問が出てきてしまったんですけど、
UTF-8で保存した時に、マジックコメントなしでもマルチバイト文字が使えちゃうのは、
何か意味があるんでしょうか?
UTF-8Nという表現自体が不適切だ UTF-8にはもともとBOMは存在しない UTF-8とBOMつきUTF-8という列挙が妥当 BOMつきUTF-8をUTF-8と呼ぶのは意思疎通上たいへん危険
了解です それじゃBOMつきのUTF-8は気にしない事にします
dgってなんだろうと思ったらグラフィックのGDのライブラリか なんかの関係で直接rubyを呼ぶとGEMPATHかなにかの環境変数がセットされないんだろう
Haskellと比較用にRubyでlength関数作ろうとしたら配列はeachメソッドで各要素にアクセスできるが、文字列はeachは行単位で、文字単位にはeach_charを使わないといけないのが分かったんだが、それだと配列と文字列で別々にlength関数作らんといかんの? ダックタイピング出来るのがLLの利点じゃなかったのかと言いたい (しかも、1.9からは文字列のeachも廃止になるのでeachの構文糖衣であるfor文が文字列で使えない) 以下のコードは配列だと正しい結果を返すが、文字列だと1.8系だと正しくない結果を返し、1.9系だとエラーになる(eachメソッドが無いぞゴラァ!と怒られる) def mylength (str) sum = 0 for i in str sum += 1 end return sum end Ruby詳しくないとは言え、この動作がおかしいのだけは理解できる
>>76 ・Rubyは基本的にforを使わない
・Rubyにおいて文字列と配列には全く関連性がない
・そもそもRubyの文字列は文字の集合ではない
なので、ダックタイプとかの問題ではなくて文字列を文字の集合と扱うか否かの問題
>>76 Haskellでマルチバイト文字列のlengthやってみて
mylength([0, 1, 2]) #=> 3 mylength('あいう'.chars) #=> 3 mylength('あいう'.bytes) #=> 6 mylength('あいう'.lines) #=> 1 文字列・バイト列・行の集合等複数の見方が有るからちゃんと指定しましょうってことよね
UTF8のバイト数じゃないんだ
集合は順序がないぞ
そうだった でも行列とか言うと別の物に聞こえるからなあw 行の列?これもあんまり言わない気がする
>>74 Ruby1.9はBOM付きUTF-8に対応していて、マジックコメントを付けたのと同じ効果がある
BOM付きUTF-8はトラブルの元なのであまりお勧めはしないけど
84 :
デフォルトの名無しさん :2012/05/15(火) 18:24:50.32
gem install hogehoge の、インストール先ディレクトリを指定することはできますか。 できれば環境変数で export GEM_HOME=... とか指定できるとうれしい。
nokogiriすごすぎワロタw なにこの超絶機能。 …ところでみんなRubyで何やってんの?w
初歩過ぎて申し訳ないんですが、 <table> <tbody> <tr> <td class="hoge">いらない</td> <td>ここが欲しい01</td> </tr> <tr> <td class="hoge">いらない</td> <td>ここが欲しい02</td> </tr> <tr> <td class="hoge">いらない</td> <td>ここが欲しい03</td> </tr> </tbody> </table> こんな感じで並んでるものを、 text = doc.xpath("//descendant::table[@class='hoge']//td[2]").first.text print (text) このように書くと「ここが欲しい01」が取れるのはいいんですが、 「ここが欲しい02」が欲しい時はどうすればいいですか? lastだと最後になっちゃうし、secondなんてのはないし・・・? よろしくお願いします
あ、クラスの付け方間違えたorz <table class="hoge"> <tbody> <tr> <td>いらない</td> <td>ここが欲しい01</td> </tr> <tr> <td>いらない</td> <td>ここが欲しい02</td> </tr> <tr> <td>いらない</td> <td>ここが欲しい03</td> </tr> </tbody> </table> この場合です。すいません
>>85 趣味で構文解析器(GLR)を作ってたらハッシュ値のバグ(仕様?)でハマった
異なるオブジェクトのハッシュ値が同じ値になる…
p [-610054458, 111138, 1, 7].hash #=> -976846141
p [-610054458, 111138, 3, 3].hash #=> -976846141
ハッシュ値が偶然ぶつかるほど大量のオブジェクトを扱ったつもりはないのに…
>>88 バグだとしても、扱うときには基本的に衝突する可能性を考慮しなきゃいけないのがハッシュなんだから
ハマったのはある意味幸いじゃね?
RPGツクールのスクリプトで以下のコードについて質問があるのですが #-------------------------------------------------------------------------- # ● セーブ内容の作成 #-------------------------------------------------------------------------- def self.make_save_contents contents = {} contents[:system] = $game_system -----略-------------- contents[:map] = $game_map contents[:player] = $game_player contents end 「end」の上の「contents」はどういった意味があるのでしょうか? 初歩的な質問ですみません。 よろしければ御教授下さい。
>>87 doc.xpath("//tr/td[2]")
>>90 そのメソッドを呼びだした側に値(contents)を返してる
Rubyでは関数の最後の式(の値)を呼びだした側に返す
>>90 Rubyのメソッドは、とにかく最後の処理の値がメソッドの戻り値として利用される
最後の行に唐突に変数が1個だけ書いてあったとしたら、それは他の言語で言うところの return var だ
Ruby では「さいごの return」は通常書かない(もちろん、処理構造から途中で抜ける場合は書く)
てことで、「特異メソッドmake_save_contentsの戻り値はcontents」という意味
>>87 ごめんぼけた。doc.xpath("//tr/td[2]")[1].text
>>91 ご回答ありがとうございます。
C言語のreturnなのですね。
凄く省略されててビックリです。
>>93 ありがとうございます。できました。
ググっても初歩すぎるのか方法がわからずに困ってました。
ありがとうございました!
>>92 丁寧な説明ありがとうございます。
凄く難しい言語ですね。
Cのポインタより難しいです。
[2, 8, 3].hash #=> 41 [2, 8, 1, 1].hash #=> 41 これは配列をキーとしたハッシュは使うなということだろうか
使ってもいいけどfreezeはしておくべきよ
質問させてください。 hoge huga piko peta 改行 という、半角スペースが1つの場合も2つの場合もある文字列を カンマ区切りにする方法は無いでしょうか? 「hoge,huga,piko,peta」 最終のイメージはこんな感じです。
>>99 a="hoge huga piko peta ¥n"
a.sub(/ +¥n/, "¥n").gsub(/ +/, ',') #=> "hoge,huga,piko,peta¥n"
で桶?
>>100 教えていただいたコードから、私が当初やっていたことが完全に誤りで無いことがわかりました。
それでもさっぱりできないので、元のエンコードを変えてみたら、
スペース1つと2つではなく、スペースとノーブレークスペースが混在していました。
無事[\u00A0]を使って変換できました。
ヒントがなければ、書き方の問題だと思って、ずっと解けないままでした。
ありがとうございました
ちょっと日本語がおかしいですねorz ヒントのお陰で、コードの書き方が問題だったのではなく、 元の文字列がおかしかった(把握できていなかった)ということがわかりました。 ありがとうございます。 が、正しいですねw
>>99 "hoge huga piko peta 改行".split
105 :
uy :2012/05/16(水) 15:47:46.77
>>99 puts "
hoge huga piko peta
".split*","
だrぉ
しっかし、簡単に記述できるのはうれしいが、 ネットに情報が少ないな。 公式の解説は何考えて作ったんだか分からんくらい、わかりにくいし。 あれって、読んで分かる人いるの?w 最低でもサンプルくらいほしいわ
検索の仕方が悪いんじゃないか 試しにどこで詰まったか書いてみれ
いやごめん、詰まってないんだ。 しっかりと希望通りに動いてるw でもサンプルが少ないから、海外のサイトをGoogle翻訳の世話になりながら頑張ってるw
109 :
69 :2012/05/17(木) 08:50:30.59
>>75 ありがとう
#!/usr/bin/env rubyでコンソールからは安定的に動くみたい
今度は、cgiで試してるけど、2回に1回ぐらいエラーになるw
ruby: No such file or directory -- CONFIG["STATIC"] = "" (LoadError)
環境変数を出すスクリプトをコピペして、うまく表示された時のRUBY関係の変数
PATH /sbin:/usr/sbin:/bin:/usr/bin
RUBYLIB /usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1
LD_LIBRARY_PATH .:/usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1
1.9からカレントがなんちゃらかんちゃらだそうだから、試しにcgiの中で、
ENV['LD_LIBRARY_PATH']=".:/usr/lib:/usr/lib/ruby:/usr/lib/ruby/site_ruby/1.9.1"をやってる。
コンソールからenvをやると、
GEM_HOME,MY_RUBY_HOME,GEM_PATH,RUBY_VERSIONも出てくるけど関係あるのかな?
RUBYLIBはcgi表示と同じ。
同じ事例か、原因か、直し方、教えて
sample_array = [["a,b,c"]] こんな配列があって sample_array.each do |var| new_var = #varに対していろんな処理 print new_var end こうすると1つずつ書きだしてくれるのはいいんだけど、 書きだすんじゃなくて「new_var」を新しい配列にする方法ってどうするんですか?? 整形した値を持つ変数をループの外で使いたいんです。
なんか毎回書いてる気がするが、とりあえずArrayとHashとStringとEnumerableのメソッドは1行の動作説明だけでも読んでおくといい 「そういえばどっかにそんな処理のできるメソッドがあった気がする」とわかるだけでかなり違う というわけで Array#map あたりを使え p [1,2,3].map{|x| x*2} #=> [2, 4, 6] ネストした配列になってる場合は一発でできずに若干面倒な場合があり、 ローカル変数で結果用の配列とかを用意たほうが簡便なことが多々あるがこれは仕方ないんで飲んでくれ result = [] arr.each do |a| a.each do |x| result << xの内容をめっちゃ複雑に処理した結果 end end p result 「○○した新しい配列を返す」というメソッドで適当なの探してみ
Windowsでredmineが使いたいのでgemのバンドルでrails2.xがインストールされてます 最新のrailsを単品で入れて動かしたいのですが rubyではアプリというのはgemから入れないと動かせないような仕組みでしょうか? gemでrailsを複数いれたりしたらおかしくなりますよね? どうにかrailsの最新版をためすほうほうはありませんか?
なるほどーこんな風に書くんですね。 「ArrayとHashとStringとEnumerableのメソッドは1行の動作説明」 一応ざっと目を通したんですが、ちゃんと覚えるまで見返しますw
>>115 pikを使ってみます
あと分からないことがあったらそちらで聞いて見ます
>>114 Enumerableは便利メソッドの宝庫なんで慣れても良く見に行くよ
118 :
うy :2012/05/17(木) 13:55:55.29
yu=[ [1,2,3] , [33,44,55] , ] .inject [] do | u , y | u << y.map do | uy | uy*10 end end p yu
Shift_JISで保存して puts "予定" を実行してもエラーも文字化けも起きません RubyはShift_JISの5C問題に対応しているからでしょうか?
サイトの画像と、テキストの情報を抜き出して 整形してから保存するってのを作ったんだけど、 コマンドプロントで動かしてるけど、意外に時間かかるね。 他に早く処理できる実行方法とかあるの?
>>119 環境変数に RUBYOPT=-Ks とか書いてあるんじゃない?
無効にすれば普通に化けたりするはず
122 :
uy :2012/05/17(木) 18:48:55.54
>>120 あらかじめ保存してある画像とテキストを読み込んで処理しても遅かったならまたおいで
以下のようなネットのサンプルソースに def[](id)という書き方があったのですが どのような使い方をするのでしょうか? def [](id) @list[id] = aaaa.new(id) if @list[id].nil? return @list[id] end
この質問時々来るNE! c = C.new c[arg] というようにHashのキーやArrayの添字のようにアクセスさせたい場合、特別に class C def [](arg) ... end end というようにメソッドを定義する
また以下のソースについてですが、return []は何を返すのでしょうか?
Class B
def keys
return [] if AAA[@id].nil?
if AAA[@id].is_a?(Hash)
return AAA[@id].keys.sort
end
return []
end
end
>>125 ご回答ありがとうございます。
検索にも引っかからないので助かりました。
128 :
uy :2012/05/17(木) 22:28:20.29
p nil == [] p [] == Array.new p [].empty? p [].class p "".class p nil.class p nil.class.class.class.class.class.class.class.class.class.class.class.class
130 :
120 :2012/05/17(木) 22:38:19.05
>>123 ローカル環境で試したらさっくさく動きましたw
しかしRubyはすごいね。こんな簡単で多様性を持った言語って他にないな。
って何個かしか言語しらんけどw
あとこの掲示板のサポート体制が神w
>>127 ありがとうございます。
空の配列を返す意味がよく分からないですが
0でもいいような気もします。
>>130 表記が簡単ですが、検索に引っかかりにくいので
Webでの学習は難しいかな。
>>131 場合によって数値を返したり配列を返したりと変わると面倒だろ?
もちろん場合によって返す型が変わるメソッドも書けるのはRubyの利点でもあるが
どの場合でも配列を返す、と統一されてるほうが基本的には利用し易いと思うよ経験上
>>122 全然upするようなものじゃないですw
でも、「こう来たらこう」「さらにこの時はこう」「残念、そのイレギュラーも想定済みだ」
みたいな感じで意図した通りに動くプログラムを眺めるのって快感だw
>>131 別になにを返してもいいよ
そのメソッドの戻り値をどうやって使うかという設計にのみ依存する
中身の入った配列か空の配列を返す、という構造の場合、アテにしてる動作の根拠はこれだ
arr1 = [1,2]
arr1.each{|x| puts "#{x}です"}
arr2 = []
arr2.each{|x| puts "#{x}です"}
「1です」「2です」の次に何が表示されるか
…もちろん、なにもしないし、例外も起きない
[] は Array クラスのオブジェクトだから each メソッドを使ってもエラーにならず、
なおかつ each メソッドは self が空の配列の場合ブロック内部の処理を単に飛ばして self を返す
しかも Array クラスの大部分のメソッドは each メソッドを使って書かれているので
arr2.map{|x| x*10} はエラーではなく [] を返すし、 arr2.find{|x| x.odd?} もエラーではなく nil を返す
もちろん件のメソッドが0を返しても構わない(Rubyでは非該当のシグナルはnilのほうがいいとは思うが)
ただし、その場合は b.keys.each{...} と書いて順調に動いてた部分が、ある日突然 NoMethodError で止まる
スクリプト書いた人は首を傾げ、B クラスのマニュアルを見て、ソースを読んで、
「もし該当がなければ0を返す」というトンデモ記述を目の当たりにして呪詛を吐きつつ、
return_keys = b.keys
if return_keys.zero?
# なにもしない
else
return_keys.each{...}
end
というめんどくさい記述に書き換える
あるメソッドの内部処理が「ダメだった」場合に空のオブジェクトを返すかnilを返すか自作例外を発生させるかの定まった回答はない そのメソッドやクラスがどういう場面で使用されるか、をよく考えた上で自分で決めるしかない B#keysが[]を返すのは、空のHashに対するHash#keysが[]を返すことからの類推と、 そのB#[]の作者が[]メソッドに照会の機能を持たせてるからだと思う メソッドの戻り値の内容はこっちで吟味するからとりあえず配列を返しといて下さい、という
すみませんpikを使うと複数のRuby+gemの環境を構築できるようですが Rubyは1つだけインストールしてgemだけ複数の環境を用意する方法ってございませんか? HDDの容量の都合でRubyを環境ごとにインストールするのが厳しいです
GEM_HOMEで切り替えるとか、アプリ毎に環境を分けるのであれば bundle使えば良さそうな気がする
間違えたbundlerだった。。。
rubyと添付ライブラリ本体ではなく、gem(とRails)を複数インストールすること自体がHDDを圧迫してるんじゃないか説が…
あ、pikってrubyのソース玉も保持するんだっけ?
環境変数 GEM_HOME を環境ごとに設定してインストールし、環境変数 GEM_PATH を欲しい環境ごとに設定して利用すれば理屈上はいける
WebサーバでRailsを起動するのに環境変数を任意に設定する方法があるのかどうかまでは知らない
>>137 の言うようにbundlerでもなんとかなったと聞いた記憶があるけどWindowsで動作するのかとかはよく知らない
ググって見たところ僕にもなんとかできそうなのでGEM_HOMEかbundlerで試してみたいと思います ありがとうございます
>>137 さん
>>138 さん
>>139 さん
>>140 さん
レスを読んでたらちょっと気になることがあるので質問させてください
RubyInstallerのzip版をC:\Ruby193に手動で入れてるんですが
環境変数のpathにC:\Ruby193を入れてからdevkitをインストールしました
GEM_HOMEというのは今まで入れないで使ってきたのですが登録しないとダメでしょうか?
何もまだファイルにかかれていない状態のRubyファイルを実行した時に 何らかの処理をさせる事ってできませんか?
>>141 デフォルトでgemのインストール先とかは設定されているからダメじゃないよ。
(インストール先を変更する必要があれば設定する)
現在のgem環境は、
gem environment(gem e でもOK)
で確認できるから見るといいよ。
>>141 日本語文献が少ないんだよな
GEM_HOME と GEM_PATH は gem のデフォルト動作を変更するのに使う
なにも設定しなかった場合、gem ライブラリは実行に使った ruby.exe から見て ../../lib/ruby/gems (つまり{RUBYDIR}/lib/ruby/gems)にインストールされる
これを変更したい場合は GEM_HOME を設定することで変更することができる
GEM_HOME 以外にも指定方法があったはずで、確か GEM_HOME は使わないでというのがあった記憶がうっすらあるが、
GEM_HOME 派は根強い
>>142 それは「してはいけない」
使い方が間違っている
なんのためにそれやりたいのか言ってみ
>>147 Rubyでゲームを作っていて
main.rb というファイルに
require "./game/player"
require "./game/naiyou/enemy"
...
など、いろいろrequireしているのですが、
player.rb のほうをRDEで編集している時に、
RDEからプログラムを実行するには
main.rbのほうにタブを移動してF5を押さないと出来なくて、
それが面倒なので現在
player.rbなどには
行頭に
http://codepad.org/kTKwNjFk こういう記述をしています
(main.rbをディレクトリから探してrequireする)
これをなくせないかなぁと思いました
テスト書けテスト
なんでRuby初心者がRDEなんて修羅の道を… 一般論としては、やっぱテスト書けってことになるのかね スクリプトファイルを慎重に直接実行して目を皿のようにして様子を見るのではなく、 「このクラスのこのメソッドはこの値を渡すとこんな値を返すはず、正解と比較してエラーなら止まる」 ということを羅列した特別なRubyスクリプトのほうを実行する 全てのチェックが正しければなにも起こらないので編集を継続すればいい autotestみたいなのってWindowsでも動いたっけ?
(´;ω;`)ウッ…ありがとうございました
どんなゲームかにもよると思う(どんな段階なのかも) ウィンドウあげてキャラチップ動かしてる段階だと、その部分のテストは大変 自動で実行をして欲しいってことだけなんだし、テストファイルで直接ウィンドウ立ち上げて目視してもらえばいいだけか
ゲームシーンがあって、シーンごとにファイルが違う感じです Rubyでゲーム開発が無理してることは承知しているのでこのまま頑張る事にします
>>148 main.rbをショートカット付きでマクロとして登録しとくのが楽。つかなんでこの文脈でテスト書けなんて出てくるんだ
Windows + Ruby1.9.3にpassenger+apacheでRubyでwebサイト(Hello Worldを表示するところから)を作りたいと思います
apache2.4をインストール済みです。
http://redmine.jp/tech_note/apache-passenger/を見ながら作業しています 。
コマンドプロンプトを立ち上げてgem install passengerでpassengerをインストールしました。
passenger-install-apache2-moduleと入力を打つ
----------------------------------------------------------------------------
Welcome to the Phusion Passenger Apache 2 module installer, v3.0.12.
This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.
Here's what you can expect from the installation process:
The Apache 2 module will be installed for you.
You'll learn how to configure Apache.
You'll learn how to deploy a Ruby on Rails application.
Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.
Press Enter to continue, or Ctrl-C to abort.
--------------------------------------------------------------------------------
と表示されたので、Enterを押したら
http://codepad.org/X1f0UwNj (長いのでURLに記入)が表示されてしまい設定できません
検索してもほとんどLinuxでインストールする方法しか見つからず解決方法がわかりません
どなたかアドバイスお願いします
PassengerはWindowsをサポートする気がなかったと思ったが。
そうだったんですが・・・ Passengerをアンインストールしました あとMongrelも試してみたんですが起動できずこれもアンインストールしました webrickで頑張ります
つうかRuby使うならWindows使うのを止めるべき。 無駄な労力が必要になる。
激しく同意 RubyはWindows上で使うもんじゃない
だって秀丸が無いと厳しいですし・・・
秀丸の何が良いのか未だに分からん
windows で jruby 使ってみたけど意外に良かったよ rails も動かせたし
163 :
デフォルトの名無しさん :2012/05/19(土) 09:39:14.51
jrubyってまだ1.9.2しか対応してないのか…
まあかなり無茶やってruby処理系やってるんで、ひとつひとつ対応していかないと
むしろ1.9.2まで対応してることが凄いくらいだよw
そら理屈上は動作するけどそんなことやる奴おらへんやろ、をなぜか実現してるプロジェクトだからな
>>160 編集作業をするOSとプログラムを実行するOSが同一でなければならない理屈はない
stack level too deep (SystemStackError) 大規模な再帰呼び出しができないとかrubyって言語として大丈夫なの? これじゃ木構造とか扱い辛い スタック使って書き直すのはやりたくない
それ構造が循環しちゃってるだけだから…
してない 構造の大きさを徐々に大きくしてテストしたから これは確か
よほど深い木構造を操作してるとか?
>>169 無限再帰でなくても落ちるよ
# recur.rb
def get_last_elem(ary)
# 空の配列を渡すと死にます
return ary[0] if ary.size == 1
ary.shift
get_last_elem(ary)
end
p get_last_elem((1..10000).to_a)
% ruby recur.rb
recur.rb:2: stack level too deep (SystemStackError)
落ちるパターンにぶつかることが稀にあるね $ ruby -e 'def mes(i) print i;mes(i+1) end;mes 0' 01234567891011121314151617181920212223 ... 1787188719872087218722872387248725872687278728872987308731-e:1: stack level too deep (SystemStackError)
ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] i386-mingw32 1.9.3 (2012-04-20) #<SystemStackError: stack level too deep> recursive size: 8734
なんかLLバトルスレ向きのレスなんだけど ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] だと def mes(i) puts i mes i+1 end mes 0 が、8731まで表示して stack level too deep (SystemStackError) で落ちた Python 2.7.1だと def mes(i): print(i) mes(i+1) mes(0) 998まで表示してRuntimeError: maximum recursion depth exceeded で落ちた Perl 5.12.1だと sub mes{ my $i = shift; print $i,"\n"; mes($i+1); }; mes(0); 3722238まで表示してOut of memory!で止まった どんどんとメモリを消費していって最終的に1.2Gほど使ってた
Lua 5.1.3だと function mes(i) print(i) mes(i+1) end mes(0) 16378まで表示してstack overflowで落ちた Gauche 0.9.2だと Schemeはあいかわらずよくわからんので、Webをみながらてきとうに書いてみるのですが (define (mes i) (print i) (mes (+ i 1))) (mes 0) 止まる気配がなかった 末尾最適化が利いているのでしょう
おまけで ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] で RubyVM::InstructionSequence.compile_option = {tailcall_optimization: true, trace_instruction: false} eval <<'EOS' def mes(i) puts i;mes(i+1) end mes 0 EOS 止まる気配がない たぶん末尾最適化が利いて無限ループしてるはず デフォルトで末尾再帰最適化が有効になってないのは何がまずいのだろう?
181 :
デフォルトの名無しさん :2012/05/19(土) 16:42:16.40
理論上はすべての再帰は末尾再帰に変換できるんだっけ?
そりゃプログラムを丸ごとCPSに変換すりゃ、全部末尾ジャンプになるけど、 「ifとgotoさえあればなんでも書ける」ってのと同じで、意味のない言明だよ。
183 :
uy :2012/05/19(土) 17:30:34.59
理論上は~って話をしたらプログラムの世界では全てが可能だろね 今のPCスペックと人間スペックでかけるかどうかが問題
>>180 こんなことが出来たのか
勉強になるなぁ。
ありがとう!
185 :
デフォルトの名無しさん :2012/05/19(土) 18:22:00.98
schemeは全部末尾再帰に変換することを仕様で義務づけてなかった?
要求としては、末尾コンテキストにある呼び出しなら、それを繰り返しても、 スタックが溢れたりしないこと。
>>185 それは末尾再帰最適化が仕様に含まれているので
末尾再帰がループと同等に扱えるって話じゃ
(Pythonは使ってないもので)
再帰の回数に制限がかかってたのを思い出した
Python 2.7.1にて
import sys
sys.setrecursionlimit(100000)
def mes(i):
print(i)
mes(i+1)
mes(0)
9663まで表示してMemoryError: stack overflow で落ちた
負けた……
188 :
デフォルトの名無しさん :2012/05/19(土) 18:33:44.33
末尾再帰の最適化(ループへ変換とか)は要求されているが 再帰を末尾再帰に変換する義務はない、ということか。
そもそも任意の再帰を末尾再帰に変換するのは 勝手に環境フレーム相当のものをヒープに用意したりしない限りは 無理じゃないのと思うんだが
190 :
デフォルトの名無しさん :2012/05/20(日) 09:07:27.53
OSがアプリケーションごとに使っていいスタックサイズ変更とか出来るようになればいいだけ 動的に生成された再帰コードを末尾再帰に変換しようぜとか今の人間の技術じゃない
もしLinuxでRuby 1.8の人いたらulimit -s <stacksize>してから 上のスクリプト試すとどうなるかやってみて (うちのLinux/Ruby1.9では効果なし)
>>190 まずは Proper Tail Recursion and Space Efficiency を読め。
話はそれからだ。
>>191 うちでも1.9.3では効果なかった。
でも1.8.7では、
スタックサイズ 8192 で 4101
スタックサイズ 16384 で 8794
スタックサイズ 32768 で 18152
と効果が見られた。
ありがと。やっぱり1.8では効果あるのね
TKでプログラムを実行したときにウィンドウを出さずコンテキストメニューを表示させるサンプルが載ってるサイトはありませんか? どれも右クリックでメニューを出すものは見つかるのですが自動的にメニューを表示させるサンプルが見つかりませんでした
>>195 元のTkでそのようにする方法を調べて、それをRuby/Tk上で書く
passenger, mongrel, unicorn, webrick以外でwindowsで動かせる奴ってありませんか?
198 :
デフォルトの名無しさん :2012/05/20(日) 14:44:06.84
thin
python
やっぱりここの先輩方は何かプログラムを書くときにプロジェクト管理を使ったりテストをしたりするものですか?
RubyInstallerでWindowsに1.9.3を入れたんですが コマンドプロンプトから ruby -v ってやるとパスが通っているのかバージョンがちゃんと表示されます ただし、batファイルに ruby -v と書いて実行すると >'ruby' は、内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ってエラーになります これはなぜですか?
>>201 そのコマンドプロンプトは偽物だ
ruby consoleはあらかじめパスを通したコマンドプロンプトのウィンドウを出す
普通のバッチファイルでruby.exeを使いたいなら、そのruby.exeを実行したい人の環境変数でパス通せ
つまりどういうことですか? システムにrubyのbinフォルダを登録しなくちゃいけないってことでしょうか?
>>203 だいたいそんなところ
詳しくは「パスを通す」でググれ
Vista以降でシステム環境変数でなくユーザ環境変数に登録したいなら
コントロールパネル開いて右上の検索ボックスに「環境変数」と入力
そのruby.exeを実行したい人の環境変数でパス通せ これしか言いようが無い わからんかったらお前向いてない
RubyInstallerではexeとzipがありますが exeでインストールすると勝手に環境変数も入れてくれると思ってたんですが exeでインストールするメリットってzipと比較してないと考えていいんでしょうか
普通に入れたらパス通らなかったっけ? 環境が変なんじゃね
>>200 ふつうRedmine RSpec Jenkinsな感じ。
ぐぐったらexeだとインスコ時にAdd Ruby executables to your PATHみたいに聞かれるらしいね
>>195 メニューだけ表示してなんかして終了するの?
require 'tk'
menu1 = Tk::Menu.new tearoff:false do
add :command, {label:'Ok',command:->{puts 'menu Ok';exit}}
end
Tk::Wm.withdraw Tk.root
Tk.after 100,->{menu1.popup TkWinfo.pointerx(Tk.root), TkWinfo.pointery(Tk.root);exit}
Tk.mainloop
こんなのだろうか?
正しいのかわからんけど
文系なので、解らないのですが、なぜ、Rubyは、JavaやC言語で、記述されていて Rubyそのもので、記述されていないのでしょうか?
213 :
uy :2012/05/21(月) 10:23:16.94
実行速度は アセンブラ>C言語>JAVA>>>>Ruby 開発効率は Ruby>>JAVA>>>>C言語>>>>>>>>>>>>>アセンブラ です。 なるべく実行速度の速い言語で、言語処理系をつくりたいんです あと、Rubyは動的言語っていうものなのでRubyそのもので記述しようとするなら eval "" で終わり
>>212 ありがとうございます。
インタプリタ言語では、プログラミング言語は、記述
214ミスりましたすみません。 つづき、記述ができても、処理系に向いていないということで、将来、処理速度 が向上したら、できる可能性もあるのでしょうか。
>>215 Cプログラムで動作しているOSと遣り取りする部分のプログラムをCで書かない理由ってなに?
学んでて、文系としては、全部Rubyなら、いいのにと面倒くさがりました。 その後、宗教論争などを見て、反省もしましたが、疑問はつきませんでした。
>>216 ですから、
インラインアセンブラの話が、C言語では、この話に近いと思われます。
正直、わかりません。言い訳になりますが、説明をあまり見かけないのです。
>>218 もしRubyインタプリタをRubyでコーディングするとしたら
そのRubyコードを実行するRubyインタプリタは何で書くの?Rubyで書きたい?
マシン語で記述されてるレベルのRubyのハードやOSがあれば、いいのでしょうか
>>219 理想からすると、
Rubyの方が、コードを読みやすいはずです。
文系では、他の分野で、読まなければならない本が、やたら多いので、
入り方が、重要なのです。
coffeescriptなんかもあるよ。
文系なら読点くらいまともにしたらどうだろう。息上がってんのか?
>>221 私も文系です。釣りならお帰りください
そうでないならブートストラップ問題でぐぐって熟読したうえで他で聞いてください
それかPythonにはPythonで実装されたPyPyって処理系があるのでそっちに行ってくれてもいいです
挑発をしたわけでなくて、理解度の問題でした。 つまり、アセンブラを学ぶのと、Rubyを学ぶのでは、どの道、C言語拡張まで 想定してRubyを学び、開発者を目指すなら、アセンブラ回帰が必須になり、 技術の修得スピードと翻訳、文献の量の問題が、大きいですね。 開発スピードの矛盾を発見したわけです。これは、おかしい。
>>224 Pythonびいきではないし、アンチではないですよ。
Rubyは早く書けることを主体にした言語なのに if~endの「end」を入力するのが苦痛です 何故endを書かないといけない仕様なんですか if~eでいいじゃないですか
WindowsでまともにRubyを動かせるWebサーバがありません クロスプラットフォームで動く動的言語なのにこれは致命的です
つまり、ダダこねてるのでなくて、 実際問題、おそらくは、Rubyから入門するというケースが、外されてしまうのは 損失ですね。将来的には、Ruby ですべて、こなせるという目的は、ないと思われ てしまう。
春休みって随分長いんだな
脅かすつもりもなかったし、過去の論争の苛立ちからするとギリギリの ラインの質問ですまなかった。 掲載しろとは言わないが、Rubyの入門書に期待したい。 RHGを読むときの理解度にも関わるので、ちょっと聞いてみたんだ。 すまない。
反論できない話になるとすぐ春休みとかに逃げるよね
初心者からすると、 Ruby開発者は、開発時間の比率からするとRubyでなくて、 C言語、JAVA言語をやってるんですね。 これを、言わせない説明方法を、教えてください。
Rubinius とか Mirah とかを覗いてみると楽しいかもね 初心者向けではないかもしれないけど
>>234 がてんがいったので、
しばし、勉強して、後日きます。
>>233 >Ruby開発者は、開発時間の比率からするとRubyでなくて、
>C言語、JAVA言語をやってるんですね。
これ自体は別に不思議なことでも、悪いことでもない
CRuby開発陣はCプログラマばっかりだと言われることがあるのと同様
JVMを書いている開発者だって恐らくC系言語を使っているだろう
もちろん、言語処理系上のライブラリ開発者であれば
Pure Rubyで記述している場合もあるだろう
>>236 重ねて感謝、ありがとうございました。助かります。
読み込んだwebページのテキストをメモ帳に出力するのってできますか?
取得した内容をテキストファイルにに書き出すのか 取得した内容をメモ帳に貼り付けるのかどっちだい? 両方できるが
やっぱり国産言語だからPythonよりRubyを選んでこれから勉強しようと思ってます。 Rubyをやる場合に基礎が身につく入門書ってありませんか? 10日で覚える系のは論外です
require "open-uri"
open("
http://www.defense.gov/ "){|f| $s = f.read}
open("test.html", "w"){|f| f.write($s)}
`start notepad.exe test.html`
246 :
238 :2012/05/21(月) 17:38:00.86
これで出力できました
ここから<p>とか<div>をとる方法を模索中です
require 'rubygems'
require 'mechanize'
require 'kconv'
require 'open-uri'
agent = Mechanize.new
agent.get('
http://www.ruby-lang.org/ja/documentation/ ')
p = agent.page.at('p')
`start notepad.exe p`
rubyでos作ると思って速攻で挫折したの思い出した。 シェルスクリプトなんてルビーで置き換えられるじゃないと思って¥、シェルの代わりにルビーを指定したらログイン不能になったわw 過去のトラウマ。 あうあうあー。 ウィンドウズでサーバ自体とんでもなく手間が掛かる。 教祖様と同様にatt unixがいいね。デビアンは使いにくいけど。
>>211 >文系なので、解らないのですが、なぜ、Rubyは、JavaやC言語で、記述されていて
>Rubyそのもので、記述されていないのでしょうか?
いい質問です。独力でそこに気づいたのなら、文系とはいえかなりのセンスの持ち主です。
すでに234が書いてますが、Rubiniusという処理系が、まさにRubyそのもので記述されたRuby処理系です。
本家RubyはCで書かれた処理系、JRubyはJavaで書かれた処理系、RubiniusはRubyで書かれた処理系、といえます。
とはいえRubiniusが100%Rubyで書かれているかというと、そういうわけではなく、RubyのサブセットをC++とLLVMで作り、
そのサブセットでフル仕様のRubyを記述しています。つまり2段構え。
このような仕組みだと遅いように思うでしょうが、RubiniusはJITを搭載しているので、最初の読み込みこそ遅いものの、そのあとは本家Rubyよりも速いです。
このような仕組みはSmalltalkが確立した方法で、昔から有名です。PythonだとPyPyという処理系が同じ仕組みです。
なお初心者相手だと
>>213 や
>>219 みたいなゴミが湧き出ますが気にしないでください。ごめんねあんなやつらを相手にさせて。
その辺を考えるとosを作れるcは偉大だな。 まだjavaもrubyもpyもsmalltalkもosを作り出せてない。
Cの偉大さはけっして揺るぐものではないので、 たまにはAPLマシン、LISPマシン、Smalltalkマシン、Prologマシンのことも 思い出してあげてください。
初心者すぎて昨日からスマソ
以下を実行した時に取得できるテキストをメモ帳に書きだすのはどうすれば良いでしょうか?
コマンドプロンプトに表示させる必要はないのでputはなくて良いのですが…
require 'rubygems'
require 'mechanize'
require 'kconv'
agent = Mechanize.new
agent.get('
http://www.ruby-lang.org/ja/documentation/ ')
agent.page.search('p').each do |p|
puts p.inner_text.tosjis
puts '---'
end
>>252 まとめてやろうとすんな
一気にやろうとせずに段階踏んで別々にやって、その成果を最後に組み合わせろ
「自作の” ”で囲った文字列を画面に表示する」
「自作の” ”で囲った文字列を変数に代入し、変数の内容を文字列として画面に表示する」
「ファイルにアクセスしてその内容文字列を画面に表示する」
「変数の内容を画面に表示するかわりにファイルにアクセスしてそこに書き込む」
「実際にやりたいメソッドの戻り値を変数に代入し、ファイルにアクセスしてそこに書き込む」
前の4つができていないと、最後のひとつはできない
>>252 がスクリプト実行するたびにRuby公式のサーバにアクセスしまくってるんだと思うと目頭が熱くなるな
`start notepad #{!!open((!require("open-uri")).to_s,"wb").print(open("
http://google.co.jp/ ").read)}`
require 'rubygems'
require 'mechanize'
require 'kconv'
agent = Mechanize.new
agent.get('
http://www.ruby-lang.org/ja/documentation/ ')
a = ""
agent.page.search('p').each do |p|
a << p.inner_text.tosjis
a << '---'
end
file = "file_testest123456789.txt"
open(file,"wb") do |f|
f.print a
end
system"start notepad #{file}"
require 'rubygems'
require 'mechanize'
require 'kconv'
require 'win32ole'
# gem install win32-clipboard'
require 'win32/clipboard'
agent = Mechanize.new
agent.get('
http://www.ruby-lang.org/ja/documentation/ ')
a = ""
agent.page.search('p').each do |p|
a << p.inner_text.tosjis
a << '---'
end
Win32::Clipboard.set_data a
wsh = WIN32OLE.new('Wscript.Shell')
wsh.run("notepad")
sleep 0.4
wsh.SendKeys"^v"
centos4.6に、ruby1.9.3-p194をインストールしたいのですが、 makeで、「rdoc」エラーで失敗して進めません。 調べたら、yumのレポジトリに、「dev.centos.org/centos/4/CentOS-Testing.repo」を 追加とあったのですが、今現在ファイルが存在しません。 centos4系でrdocとインストールするにはどうすればいいのでしょうか?
コマンドプロンプト以外を使ってみたく、 RDEを使ったところ、ものすごく使いづらいんですが、 他にrubyの実行ができるソフトってないんでしょうか?
>>257 トン!
notepadだと改行うまくいかないみたいなのでwordpadで開くようにしてみますた
あとはpとかdivで囲まれたところではなく欲しいところを書きだすように書き換えに挑戦
これは明日やります…
でも全世界のruby使いの学習の為に公式サイトは存在してる所は有るので。 perlやpyやphpのサイトとかで練習しないだけでも。
>>255 こう? get メソッドが動作することがわかったら実行行をコメントにして、
あらかじめ保存しておいた arakajime.html を読み込む動作にしばらく切り替えておく
require 'open-uri'
require 'kconv'
require 'rubygems'
require 'nokogiri'
def winsave_as(path, data)
open(path,'wb'){|f| f.print data.to_s.tosjis.gsub(/\n$/){"\r\n"}}
end
def get(url)
URI.parse(url).read
end
def search(html)
Nokogiri::HTML.parse(html).search('p').map{|e| e.text}
end
def notepad(path)
system "start notepad #{path}"
end
url = "
http://www.ruby-lang.org/ja/documentation/ "
path = 'tekitou54.txt'
# html = get(url)
html = File.open('arakajime.html',rb'){|f| f.read}
data = search(html).join("\n---\n")
winsave_as(path, data)
notepad(path)
>>263 そんな感じっすな
実際問題としても、ネットアクセスとかデータベースアクセスとかはいちばん遅いはずなので、
スクリプト作成中にこの部分をローカルファイルの読み込みにしておくことの意義は大きい
マシンスペックにもよるけど、実行した直後に終わるはずだ
>>251 これしか選択しないですか?
gemでインストールできるものってないですかね?
なぜwindowsに拘ってるの? もしくはなぜRubyに拘ってるの?
というか既存のはどこがダメなのか言ってもらわないとどうにも
やっぱり今流行のRedmineでプロジェクト管理したいですしRuby on Railsとかも勉強したいです Windowsしか使ったことないのとPCが1台しかなくて、仮想マシン入れて動かせるほど良いスペックでもないです ennouはWindowsによくあるインストーラ形式っていうのが引っかかるのでキツイです
270 :
デフォルトの名無しさん :2012/05/23(水) 20:52:40.93
わけがわからないよ。
VPS使ったら幸せになれるかもよ?
Apacheでmod_rubyだのFastCGIだの使って普通にRuby動作させるのじゃ何が不満なんだ
HTMLで<div>に囲まれた文字列を取得するのってinner_textですが <div id=Main>から<div>までなど場所を指定して取得するのってどう書けばよいでしょうか またこういうのってどうやってググれば良いでしょうか 『たのしいRuby第3版』買ったけど内容がやりたいことに追いついてない気がします
馬鹿が自己満足のために一足飛びにモノだけ教えたせいで被害が拡大してるな 君は怒っていいと思うよ 一発で出てこないということは、とりあえず正規表現を学ぶことをおすすめする あんまり深入りすると抜け出せないので、 . + * ? () あたりの記号の使い方と意味だけわかれば充分 複雑な正規表現はとりあえずパスして、そのぶん ruby の if とか String#scan とか String#gsub とか String#split とかの機能を駆使する 正規表現で対処し切れなくなってからはじめて、HTML のパースライブラリの使用を検討するのが正当
>>274 ありがとうございます
基礎中の基礎みたいですねw
RubyがおすすめだからRubyでやれと言われた身ですが
自分には急に応用から学べと言われているようなものだったみたいです
かなり混乱してますが頑張ります
すいませんirbなんですがなんでこうなりますか? irb(main):001:0> print("hello\n") hello => nil 昔々使ったときは => nil とかって付かなかった ような気がするんですが…。 ファイルに同じステートメントを書き込んで実行すると hello と表示されます。 どういうことなのでしょうか? 宜しくお願いします。 環境 CentOS6.2 インストールしたパッケージ compat-readline5-5.2-17.1.el6.x86_64 ruby-libs-1.8.7.352-7.el6_2.x86_64 ruby-1.8.7.352-7.el6_2.x86_64 ruby-irb-1.8.7.352-7.el6_2.x86_64
説明めんどくさいんで、irbrcで検索しろ irbがどういう表示をするのかは、ホームディレクトリとかの .irbrc とかで制御される どっかのバージョンが変わったかなにかirb関係のgemが入ったかだと思われる $ irb --prompt classic irb(main):001:0> puts "hello" hello nil irb(main):002:0> $ cat ~/.irbrc require 'irb/ext/save-history' IRB.conf[:SAVE_HISTORY] = 1000 IRB.conf[:PROMPT_MODE] = :CLASSIC あと、Ruby では print "~\n" を使用することはまず無く、 puts "~" を使用する それと、puts と p と print は引数のカッコをつけない
278 :
デフォルトの名無しさん :2012/05/23(水) 23:07:29.13
p { 1 => 10, 2 => 20 } とかやって構文エラーに目が点になった思い出。 いまは理由分かるけど。
>>277 >irbがどういう表示をするのかは、ホームディレクトリとかの .irbrc とかで制御される
これが答えですね、ありがとうございます。
知りませんでした。
$ ls -a | grep irb
$
ないみたいですね。理由がわかって安心しました。
今は酔いが回ってきたので具体的な対処は後日します。
ありがとうございました。
>>278 irb(main):001:0> p ({ 1 => 10, 2 => 20 })
{1=>10, 2=>20}
=> nil
こうですかわかりません><
1.8.6の頃は:CLASSICの挙動だったはず => がデフォルトになったのは1.8.7だったかな
頭が痛い
最近なんとなく見てたけど、wordpadって単語が出てきて目をこすりまくった
283 :
デフォルトの名無しさん :2012/05/24(木) 09:14:15.18
p { } だとハッシュのinspectじゃなくてブロック付きメソッド呼び出しが 期待されちゃうのね。
>>282 いわゆるページャとして使ってるんだろうな、と思う
複数行や長い行のある文字列をコマンドプロンプト上で標準出力に表示しても確認しづらいということは否定はできん
うまいコンソールがないからね msys版のminttyでbash使うのいいんだけどirbが動かねえ
Rubyやるならこれは入れとけって定番のgemはありますか?
>>286 あなたがrubyでやりたいことに必要なgem
ruby全体が超強力に強化されて超便利!!というようなgemはあんまし見ないな 配布しようにも相手が持ってないと意味ないわけで なにしたいのかで聞けば、おすすめ定番くらいは誰か教えてくれるかもよ
該当部分の推定されるメソッドや引数のマニュアル内容をポップアップかミニバッファ表示してくれる機能の提供ってないの arr = [] arr.push( ←ここでArray#pushのマニュアルが(半自動で)引ける
>>289 昔、riとEmacsでそういう連携があったことがあった気がした
カーソル部分の単語をメソッド名とみなして全検索して候補引っぱるんだったかな
Array#push([ obj1 [, obj2 ...]]) obj1 , obj2 ... を順番に配列の末尾に追加します
と1行表示してくれるだけでもありがたいんだけど
$ ri Array#push Array#push (from ruby core) ------------------------------------------------------------------------------ ary.push(obj, ... ) -> ary ------------------------------------------------------------------------------ Append---Pushes the given object(s) on to the end of this array. This expression returns the array itself, so several appends may be chained together. a = [ "a", "b", "c" ] a.push("d", "e", "f") #=> ["a", "b", "c", "d", "e", "f"] 英語かよ
GETで送られてきたクエリ(○○の部分)を取得して、それをファイルを読み込むときのパスに利用します
http://localhost/index.rb? ○○
このときそのまま利用するのはセキュリティ上危険だと思うのですが
どのような対策を行えばよいでしょうか?
>>292 どうにもなんない
対象となるファイルシステムとシェルをすべて網羅して、危険となるアスキーまたはマルチバイトの文字列の並びをなんらかの安全な文字列に変換する
ライブラリがあると楽なんだけど、聞いたことないな
「読み込む」のなら、対象となるディレクトリのファイル一覧を持っておいて、クエリと完全一致するかどうかを調べて、 合致するならファイル一覧のほうの文字列を使ってFile.openすればいいんじゃないかな 書き込みファイル名をクエリから生成するのはめんどくさい
単純なアスキー文字シェル展開攻撃が「使えない」とわかった場合、攻撃者は必ずUnicode関連を試すと思われるので、 実のところはちょっと置換したくらいじゃちっとも安全じゃないんだよね
例えばgemで入れられる定番のwiki構文木ってありませんか?
297 :
デフォルトの名無しさん :2012/05/24(木) 17:38:04.79
C言語も冪乗をpower(,)なんて複雑にしないで、Rubyみたいに記号でシンプルに表記できれば良かったのに。
298 :
297 :2012/05/24(木) 17:53:01.50
powerでなくpowでした。訂正します。
C言語は、コンパイラがインラインで生成するコードに対応するものは直接、式で書けるが 関数呼び出ししなきゃならんものは関数として提供する、というのが基本だから、それはない。
300 :
デフォルトの名無しさん :2012/05/24(木) 19:59:32.36
乗算の算術演算子とか記号*だけじゃないですか。指数もその気になれば**とかに出来たんじゃないですか。
シンタックスの話じゃない、というのが
>>299 を読んでも理解できないわけ?
>>289 自分で作っちゃいなよ
おれもそんな感じのエディタをおっちらおっちら作ってる(いつ完成するのやら…)
303 :
デフォルトの名無しさん :2012/05/25(金) 00:11:35.56
Tkが動きません。 Ruby 1.9.2 Ubuntu11.10(VirtualBox)でやっています。 #!/usr/bin/ruby require "tk" root = TkRoot.new do title "Ruby/Tk Test" end Tk.mainloop と書いて実行すると、 <internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- tk (LoadError) from <internal:lib/rubygems/custom_require>:29:in `require' from hellotk1.rb:2:in `<main>' と怒られます。 Tkは sudo apt-get install libtcltk-ruby でインストールしました。 ググってみると、tk-winとやったら動いたと書いてあるサイトがあったので、 gem install tk-win を試しましたが、 ERROR: Could not find a valid gem 'tk-win' (>= 0), here is why: Found tk-win (0.2.2), but was for platform x86-mingw32 と、インストールできませんでした。 何が足りないのか、どうやって調べればいいのかわかりません。 お知恵を拝借いただけないでしょうか?
>>303 > Ruby 1.9.2
libtcltk-ruby1.9
305 :
uy :2012/05/25(金) 00:36:20.34
テキストからTab
307 :
デフォルトの名無しさん :2012/05/25(金) 02:46:01.68
>301 理解できません。シンタックスって何ですか?
308 :
uy :2012/05/25(金) 02:52:35.36
ソースコードの見た目。 古い言語に文句いったって今更だから もうC言語の事は忘れよ
libtcltk-ruby というパッケージはなくなる予定だと聞いた libtcltk-ruby1.8 と libtcltk-ruby1.9 に分化 これならわかりやすい
Windows + Apacheにmrubyを組み込んでWEBサイトが作りたいんですが Windows用のmrubyモジュールって存在しませんか?
>mrubyを組み込んでWEBサイトが作りたい は?
え?
すくなくとも今のところmruby使う必然性はないな
>>315 死屍累々の中からこそ、キラリと光るプロダクトは生まれる
なんかもしかしたら今後いいことあるかもしんないしさあ
ただ、初心者が使うようなもんでないのは間違いない
テックプレビューみたいなもんだ
どちらかっちゃ本スレ向けだよね CとRubyとWebサーバを使い倒した人が余興でいじる
mod_mrubyというのはapacheにPHPをモジュールで動かすことと同じことをするためのものではないって事でしょうか?
>>320 どうして説明を読まずに使おうとするの?
組み込みですよね?
小型電子機器や制御機械への組み込み用途
Apacheへの組み込み用途
>>324 その解釈はないわー
できなくもないし、ずっと未来の将来ではひょっとしたらなんかあるかもしれないけど、現状は1ミリもないわー
>>320 通常、mod_rubyやFastCGIを使う
Windowsで動作しないとか知らん
326 :
デフォルトの名無しさん :2012/05/25(金) 23:57:12.22
>>304 >>309 動きました!!
1.8と1.9でモジュールが分かれていたんですね。
ありがとうございました!!
初心者ほどウィンドウズで動かそうとしてるのに、答える側はウィンドウズシランってワロス。 まあ教祖がデビアン使いでウィンドウズ知らんて逝ってるくらいだから仕方ないか。
初心者といってもRuby・PC・Windowsの初心者と色々いるだろう。 初期の想定とは違った層が手をだすほど浸透しているということかねえ。
あらゆるものが簡単で単純で平易に動作するなんていうことは、(残念なことに)現実的にはありえない もしあらゆるものが簡単で単純で平易に動作すると言われたのなら、(残念なことに)君は騙されていて、それを言った人が非難されるべき
>初心者ほどウィンドウズで動かそうとしてるのに いや 初心者はMacだろ常考
そういう「初心者」はHSPでも使ってればいいの。 そして一生Windows以外のものに手を出さない人生を送ればいいの。 そのほうが幸せだろうから。
332 :
uy :2012/05/26(土) 11:16:47.74
一般ユーザーからしてみればLinuxつかう利点とかない サーバーはLinuxで立てろって思うけど
Linuxも発展してきた現状でMac使う理由あるの?
>>333 いやさすがにその理屈は弱過ぎる
そんなんでレスの応酬欲しいのならLinux板の煽りスレへどうぞ
理由聞いてるのに何故
>>334 は煽ってくるんだろう
何か困ることでもあるのかな
>Linuxも発展してきた現状で そんなものはない ピクセルの色数が上がっただけで、デスクトップの出来としては20世紀のWindowsにも劣る
「俺様の評価では」としか読めない
スレチどす
>>333 > Macが発展してきた現状でオワコンWindows使う意味なんてあるの?wwww
あんまりない。
>>333 MacとLinuxじゃGUIの方向性が全く違うよ
>>341 動画は全く意味がない
実際に1年なら1年、自分のマウスとキーボードでデスクトップ環境を使ってみてから言え
Linuxデスクトップを使ってわかることは 「金と人と時間と議論を集中して費したUX/UIが(相対的に)最高」 という、よく考えたら当たり前のことだったな LinuxデスクトップはGnome/KDE以降十数年の歳月をかけて(勝手に)Windowsに戦いを挑んで、すばらしい結果を遺してくれた マトモなユーザーインターフェースやユーザーエクスペリエンスは、タダではできない(あと、プログラマは本質的にランチャーしか使わない) そして板違い
macって自作ツール公開してる人いませんよね
いるよ
昔のMacはシェアウェア地獄でのう 開発環境がバカ高かったってのもあるんだが
Macって15インチノートでも15万からじゃないと買えないし だったら安いノート買ってLinux入れて余った金をほかの事に使ったほうが勉強になると思うんだよね
>>347 そう言うってことはMacとLinuxデスクトップ機両方持ってて実際使ってみてから言ってるんだよね
いいかげんスレチ長いdos
>>348 Mac使って15年Linuxもファイルサーバとして2台使ってますが
持ってるかどうかは重要じゃないかと
いまだにLinuxサーバとLinuxデスクトップの違いがわからない人がいるのか…
まあ、rubyとmrubyの違いがわからないような人のいるスレですので rubyって書いてあればみんな一緒と
353 :
デフォルトの名無しさん :2012/05/26(土) 15:37:09.38
linuxデスクトップなんてつかっていみあるの?
355 :
デフォルトの名無しさん :2012/05/26(土) 17:26:54.38
>>354 鼻息あらいなw
単に純粋にきいただけなのにw
ただ、rubyなんて使って意味あるの?
よりは合致するかもね
うざい
本当マカーはキモチワルイな
test.rbで標準入力した文字列をtest2.rbで受け取る方法はございませんか? # test.rb while line = STDIN.gets STDOUT.puts line end # test2.rb
>>358 できないと答えるのがスレ的にいいような気がする
Rubyのスクリプトファイルをそういう手続的なとこで分割するのはキモチワルイ
「標準出力から文字列を受け取ってどうにかするクラス」と「加工した文字列でどうにかするクラス」に分けて、
それらを総合的に操作するクラスまたは一連の手続き的なスクリプトファイルをさらに作るのが順当
# main.rb、総合スクリプト
require './getstr.rb'
require './upcase.rb'
str = GetStr.new.get
result = Upcase.new(str).upcase
puts result
-------
# getstr.rb、標準入力から文字列を得て返す
class GetStr
def get
STDIN.readlines.join("\n")
end
end
-------
# upcase.rb、文字列を受け取って全部大文字にして返す
class Upcase
def initialize(s)
@s = s
end
def upcase
@s.upcase
end
end
>>358 io = IO.popen('ruby test2.rb','w')
while line = $stdin.gets
io.write line
end
362 :
uy :2012/05/26(土) 23:40:21.26
---test.rb--- a="" while line = STDIN.gets a << line end a ---test2.rb--- a = eval(open("test.rb").read) p a
そもそも何の為にそんなことするのか疑問なんだけど
ディスプレイを2つ分けてまして それぞれコマンドプロンプトを立ち上げてて 片方のディスプレイには標準入力用のtest.rbを もう片方のディスプレイにはtest2.rbで入力した文字列を受け取る標準出力用のtest2.rb どちらもwhileでループさせといてtest.rbで入力が合ったらtest2.rbで受け取れりたいです (ソケットでやればいい話なんですが)
ソケットでやるのがいいかもしれませんが標準入出力でできないでしょうか
ファイル名に時刻を含んだ一時ファイルにデータ書き込みまくって 読んだら消しまくればいい
unix系ならmkfifoで名前付きパイプを作れば簡単に出来る mkfifo /tmp/my_fifo ruby test.rb > /tmp/my_fifo ruby test2.rb < /tmp/my_fifo
>>367 がそのまんまの機能かと思う
ていうか、test1.rbとtest2.rbってファイル分ける必要なくね
同一の入力から異なる出力をするプログラムなのか、それとも 同一の結果を二つの画面に表示したいだけなのか コマンドプロンプトは結果の表示に利用しているだけなのか test2.rbはtest.rbからだけでなく、端末からの入力も受け付けるのか
ウィンドウズなら memory mapped file とやらを使うのか
RubyInstallerの7-ZIP ARCHIVESのRuby 1.9.3-p194を入れました あとdevkitもいれます。 将来バージョンアップする場合、入れたものを上書きしても大丈夫でしょうか? それとも一度消してから入れたほうがいいでしょうか?
基本的には全消ししてgemを入れ直し devkitはRuby本体の動作に関係ないのでどうでもいい (独立ではなく横着してRubyディレクトリの下にdevkitをインストールしてしまうとこのときめんどくさい) パッチレベル(pの数字)が増えただけなら新しいRubyにgemディレクトリをコピペしても「たぶん」大丈夫 各々のgemがどういう動作をしているかまではわからないので、保証はできない
入門サイトみながらdevkit入れてたのでどこに入れてるか分かりません 一回OSを再インストールしてまた入れなおします ありがとうございます
つrbenv
Windowsの人にrbenv勧めてもなあ
system 'mysql -u root -p' とするとMySQLに接続するためのパスワード入力を求められますが ここにスクリプトで入力する方法を教えてください system 'mysql -u root --password=xxxxx'とすればログインできるのですが 標準入力をスクリプトで自動的に入力できる方法を学びたいです
378 :
デフォルトの名無しさん :2012/05/27(日) 16:03:17.10
mysqlのクライアントコマンドってパスワードどこから読むんだっけ? ttyから直接なのか、標準入力からなのか。 前者なら PTY.spawn で、後者なら IO.pipe かな?
echo してシェルのパイプでえいやーというのではダメなんだろうなきっと system 'echo "*password*" | mysql -u root -p'
expectはどうだろう
381 :
デフォルトの名無しさん :2012/05/27(日) 17:24:09.25
とあるサイトに投稿するときに一定のフォーマット処理が必要なんですけど、 Chromeで開いてるHTMLのとあるフォームに書いてある文字列全体に対して処理するってのは可能なんですか? やはり一旦適当なtxtファイルに保存して変換処理させるのが無難ですか?
Chrome にそういう 「外部プログラムからのフォーム取得変更操作を受け付け、勝手にChromeに送信させることを許可するプラグイン」 があらかじめインストールされていれば可能 具体的には Watir 当たり前だけどおっそろしく脆弱な状態になるので、使用には注意 ふつうは、 ・ HTML で完結する処理なら Ruby で HTML を取得してフォーム送信する ・ JavaScript や Flash が必要だけど送信データを調べてたいしたことない場合は Ruby で HTML を取得して自力で組み上げて Ruby で送信する ・ JavaScript や Flash が必要だけど送信データを調べてある程度までなら Ruby で HTML を取得して根性で送信文字列を組み上げて Ruby で送信する という手順を踏む どーーーーしても普通の Web ブラウザを Ruby から乗っ取って操作しなければならないという場面はそう多くはない
383 :
381 :2012/05/27(日) 18:00:25.37
詳しくありがとうございます。 私の説明がものすごく不味かったようですが、 やりたいことは、要はただのテキスト処理で、 「Chrome上で、フォームAに文字列を書いて、Rubyスクリプト実行したら、 フォームBやフォームCに自動的に文字列が埋まる。」 ということなんです。 最終的なボタンを押して送信するのは、ユーザーに任せたいんです。 ただ、それをChromeの上で(もしくは他のブラウザ)でやることは可能なのかなー・・・と。 Watirというのを少しググってみたんですけど、ブラウザを自動操縦できるらしいで、 これなら可能ですね。 ためしてみます。
>>383 > Chrome上で、フォームAに文字列を書いて、スクリプト実行したら、
> フォームBやフォームCに自動的に文字列が埋まる。」
JavaScriptでやれ
それは正しくクライアントサイドJavaScriptの仕事だ
そのブラウザで表示しているアプリが自前なら
>>384 の言う通りJavaScriptでやるのが普通
Chrome dev って Ruby の実行環境を用意中じゃなかったっけか
387 :
デフォルトの名無しさん :2012/05/27(日) 18:30:06.85
>>386 最近、Chromeのnacl上で動かすためのパッチがrubyに取り込まれた。
拡張子から該当するmedia/typeを取得するライブラリとかありますか? {".jpg" => "image/jpeg", ....} と全部自分で書くのはしんどいので…。
mimeで検索すれば何か出てきそうだけど
Windowsはプレーンテキストで一覧がないんだよね irb> require 'mimemagic' irb> MimeMagic.by_extension('.jpg') => image/jpeg irb> MimeMagic.by_extension('.jpeg') => image/jpeg > p MimeMagic::EXTENSIONS {"123"=>"application/vnd.lotus-1-2-3", "3ds"=>"image/x-3ds", "3g2"=>"video/3gpp2", "3ga"=>"video/3gpp", "3gp"=>"video/3gpp", "3gp2"=>"video/3gpp2", ... }
>>392 「初心者スレの質問レスをコピペして回ってなおかつマルチだと罵る」というよくわからん行動パターンがあるので
ここより先のタイムスタンプがあるんじゃない限り特に気にしない
きのせいだった 565 デフォルトの名無しさん [sage] 2012/05/27(日) 12:03:31.80 ID: Be: Content-typeヘッダから拡張子を判断するにはどのライブラリ使えばいいんですか?
395 :
デフォルトの名無しさん :2012/05/28(月) 19:47:10.07
rails が使ってる mime-types gem が無難じゃないかね。 require 'mime/types' >> MIME::Types.of('.pdf') => [application/pdf] 返ってきているのは MIME::Type インスタンスの配列。
396 :
389 :2012/05/28(月) 23:26:07.33
みなさん回答ありがとうございます。
"mime-types gem" で検索したら出てきた
http://rubygems.org/gems/mime-types を使うことにしました。
>>395 さんのとは若干動作が変わってるようですが、違うものでしょうか…?
if MIME::Types.of('.pdf').length >= 1
p MIME::Types.of('.pdf')[0].content_type
end
で期待通りの動作ができました。
397 :
389 :2012/05/28(月) 23:31:56.72
あと、これは直接Rubyの問題ではないと思うのですが、 質問するに適切な場所が見つからなかったので教えてください。 mime type が決まっていないファイルに mime type をつけるときの規定はあるのでしょうか? "none" などを勝手につけるものなのでしょうか? 探してみましたが、情報がみつかりませんでした。
binary/octet-stream
399 :
389 :2012/05/29(火) 07:55:58.79
ターミナルにコマンドを(実行せず)文字列として書きこみたい場合はどうすればよいでしょうか? たとえば、 $ grep -r "" * ←これをrubyプログラムから書いて、ユーザが""内など適宜編集して実行(Enter押下)する とか、 $ irb ←rubyプログラムからirbを起動し、 irb(main:001) > .methods.sort ←これをrubyプログラムから書いてユーザが書き足して実行 良い方法はありませんか?
<td class="cell">
<dt class="main">
<a href="
http://www.nullpo.com ">
ぬるぽ</a>
</dt>
<dd class="inline">NullReferenceException</dd>
<dd class="inline">NullPointerException</dd>
</td>
というHTMLからHpricotで<a></a>の中の要素、hrefのリンク先、2つの<dd></dd>の中身を吸い出したいです。
対象サイトは、<td class="cell">~</td>が規則的に数十個並んでます。
doc = Hpricot(html)
(doc/"td.cell").each do |変数|
end
までは分かるのですが、ここから先が進みません。
変数の中に、<td class="cell"></td>の内容が全て含まれるはずなのですが、
そこからどうやって、個々の要素を指定して絞り込めばいいのでしょうか?
>>401 XPathでぐぐれ
NokogiriやHpricotが受け付ける「検索文字列」はオリジナルではなく、別途独立して定義されたものだ
あと、現状、Hpricotを使うメリットはない
>>400 たぶん、それを使わされる人はぜんぜん喜ばないと思うの
他の方法を考えたほうがいい
なお、一番簡単に実現できるのは、ヒストリに無理矢理追加しておいて、上キーなどで呼び出してもらうこと
404 :
uy :2012/05/29(火) 20:40:04.87
rubyとは関係ないけど 略語展開をどこでも使えるようにキーロガー作って 「AA0」までタイプして特定キーおしたら AA0を消して、AAリストからその場所にAA貼り付けるとか 文字列貼り付けるってツールは作った事あったな 微妙すぎるから捨てた
405 :
デフォルトの名無しさん :2012/05/29(火) 20:52:44.74
>>402 CSSセレクタでは
>>401 に書かれてることはできないのですか?
Xpathより簡単みたいだからこっちにしたのですが
Hpricotの方が日本語のサイト多いのでとりあえずこっちにしました
>>405 NokogiriはCSSセレクタ使えるよ。Hpricotはどうだったかわからない
require 'nokogiri'
src = "<html>...</html"
doc = Nokogiri::HTML.parse(src)
td_cell = doc.at_css("td.cell")
a = td_cell.at_css("dt.main > a")
p a.text, a["href"]
p td_cell.css("dd.inline").map{|e| e.text }
>>400 上で挙がってるptyやexpect使うとどうにかなる、かも
408 :
uy :2012/05/29(火) 21:18:17.51
window.set_decorated(false)
>>407 ありがとうございます
Hpricotもcssセレクタは使えるんですが、ただNokogiriとはだいぶ違うようです
>>403 ヒストリの方法はすでにやってみたんですが、もっと良い方法がないだろうかと・・・
ちなみに、
>>400 に書いた単純な内容だけをしたいわけではないです
プログラム側でコマンドを完成させて実行する方向で考えてみます
411 :
デフォルトの名無しさん :2012/05/29(火) 22:54:00.82
登録日:2012/05/20社員番号:NTDF-452 という文字列をputsにて 登録日:2012/05/20 社員番号:NTDF-452 という風に出力させたいのですが、どうすればいいでしょうか?
教えてください。 Perlの @a = <>; と同様の処理をRubyで、文字の少なさにこだわって書く場合 どのようなコードになりますか?
a = readlines
414 :
デフォルトの名無しさん :2012/05/29(火) 23:35:32.64
a=$<.lines より短くはならない気がする。 $< は行単位のEnumerableなので、直後に何かメソッドを 呼ぶならlines不要。 $<.each { ... }
ゴルファー的には、 a=*$<
416 :
デフォルトの名無しさん :2012/05/29(火) 23:36:10.17
あー *
417 :
デフォルトの名無しさん :2012/05/29(火) 23:37:06.72
ゴルフ入門的にはるびまのかつての連載とか。
418 :
414 :2012/05/29(火) 23:38:59.66
Array化せずに置いていいなら a=$< だけでもいいのか。
419 :
デフォルトの名無しさん :2012/05/29(火) 23:40:52.78
対応するPerlコードが @a に代入するという点で、 読み込んで行分割まで済んでいるべき。
420 :
uy :2012/05/29(火) 23:42:29.71
>411 "登録日:2012/05/20社員番号:NTDF-452" =~ /(.*?\d{4}\/\d{1,2}\/\d{1,2})(.*)/ puts $1 puts $2
まあ長さは置いといて行儀がいいのは、 lines = STDIN.readlines とかだよな。字面だけで何やってるかわかるし。
>>411 puts "登録日:2012/05/20社員番号:NTDF-452".split(/(?=登録日|社員番号)/)
>>420 動かないみたいです・・・
>>422 ありがとうございました
中身はあまり理解できませんでしたが、自家製のlengthを使ったsliceよりも綺麗でした
>>413-415 ご回答、ありがとうございました。
参考にします。
>>421 おっしゃるとおりです。
ただ、ワンライナで標準入力から読み取る簡便な記述を知りたかったので、
>>412 の質問をした次第です。
>>421 動作が変わっちゃうよ
Perlの<>に対応するのはRubyだとARGF
インクジェットの使い方教えてください
429 :
デフォルトの名無しさん :2012/05/30(水) 18:38:54.84
RubyってC言語やVB6みたいに、クラス定義なしで、スクリプトの中に def dosomething (a) end みたいに宣言して関数として呼び出すこともできるんですか? オブジェクト指向型言語であれば、一応はクラスを定義してその中にdefを設けて、 そのインスタンスにメソッドを実行させるのが妥当かなと思ったんですが・・・ どっちで書くべきか迷っています
否定はできんな 再利用するんでなければ、なんかてきとーに手続き的に書いちゃっていいよ クラスなくてもなんとかなるって
433 :
デフォルトの名無しさん :2012/05/30(水) 23:42:42.87
配列でループ回したいんですが、最初の要素は省き、二番目の要素から最後までを実行させる方法はありますか? ループの直前で最初の要素を削って、ループ抜けたあと最初に戻すとかは思いつきましたが・・・
array[1 .. -1].each とでもすればいんじゃなかろうか
>434 やってみます 有難う御座いました
>>429 実は「トップレベルに書いた関数」もRubyでは「とある場所に属するメソッド」として扱われてるんだけどね
437 :
uy :2012/05/31(木) 03:23:41.88
[1,2,3,4,5].inject { | _damiy, m | p m }
>>438 やはり胡散臭い人の方がろくろはしっくりくるな
>>439 「あなたが利用しているのは実はオブジェクトで、使ってるのはメソッドなんですよ!」とか言われてもな
Rubyのクラスは(とりあえずは)「いちれんの処理をまとめて自由な順番で開始させるカタマリ」という使いかたでいいよね 「クラスとは~オブジェクトとは~タイヤキの~インスタンスが~ジュークボックスの~」とか考える必要なし
443 :
uy :2012/05/31(木) 16:38:34.93
class B def to_s "(´・ω・`)" end end p n こういう挙動を最近知ったんだけど、 こういう細かいrubyの挙動ってどこにも書かれてなくねって思う
444 :
uy :2012/05/31(木) 16:46:04.09
class << self def a p 1 end end a def a p 2 end a これってなんなの??
>>442 ジュークボックスで説明されても日本人にはよくわかりません
というのはたぶん悩んだんだろうなあと勝手に思ってる
あちらさんでもそれほどわかりやすいとされたわけでもないような
Rubyでは、トップレベルで定義したメソッドはObjectのインスタンスメソッドでprivateになるから。
a) 外部のテキストファイルから一行ずつ読み取り、 b) 配列に1回につき最大に5個まで格納して、 c) その配列を関数に渡して処理していき d) ファイルの終わりまでa)を繰り返す というアルゴリズムを書きたいのです。 a)とc)とd)は問題なく書けるのですが、b)はどうやれば綺麗にいくのか分かりません。 IO.foreach("a.txt") do |s| #処理 end この#処理のところに入れるわけですが、until i = 5みたいなループをもう1つ入れるべきですか?
450 :
uy :2012/05/31(木) 19:03:08.12
def func s p s end IO.foreach("a.txt").each_slice(5) do |s| func s end
Rubyのルーチンはすべてメソッドだから、関数じゃなくて安心してメソッドと呼んでくれ > 配列に1回につき最大に5個まで格納 がようわからんのだが、要は、各行に数字が順に書いてあるファイルだとして ["1","2","3","4","5"] ["6","7","8","9","10"] ["11","12","13"] という3つの配列にしたいということでいっすか File.foreach('a.txt').each_slice(5).each do |a| p a end
452 :
449 :2012/05/31(木) 19:33:52.55
>>450-451 こんなに早く解答もらえて本当に助かりました。
要件が不明瞭だったようですいませんが、
その通りで、13行あるとしたら、5行、5行、3行に分裂するってことです
本当にありがとうございました
そんな試験あったんだ。
だから、勉強すれば誰でも合格できるんだってば 勉強したのに合格させないことが目的の試験じゃない
そだな、よく勉強できましたぱちぱちぱち、という以上のお話ではなく、ニュース性には乏しい なんらかの意図を感じる
いちばん頑張ったのは、こんな受かるかどうかわからない、受かってもどうなるものでもないようなものに1万5千円も出した親御さんだと思うの
uze-
で勉強しないのがお前らと
>>456 いやこれ山陰中国地方のローカルニュースですので
Rubyと名がついていればとりあえずオッケーな地場産業トピックみたいなもんだろ
深い意味はない
まぁ資格持ってないよりはマシだよね
いちばん頑張ったのは採点して表彰状を書いた中の人
463 :
デフォルトの名無しさん :2012/06/01(金) 20:59:26.29
メモ 最低限の線画を描く ベース色をバケツツールで塗る 明暗で簡易影 陰影で濃い影 パーツは後から別レイヤーで張り付ける レイヤーを結合せずにクリッピングして陰影で影つけ その後は発光と陰影しまくる でもペイントソフトごとに陰影、明暗、発光はパラメータ違うので頼りすぎはまずい 肌色だけは素で色をおいて影、光をつけるのが無難な気がする 服、髪は多少色変わってもばれない 肌色だけはばれるうさ
.. (. . ) ,―ヽ__(__、― ,/ ノ ヽ ~\ / ノ IPA ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ おまえら小学生が受かる試験落ちたりしてないよなw i、 \ ./ / \ ーー ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
466 :
デフォルトの名無しさん :2012/06/01(金) 23:14:12.82
Rubyの「配列 - 配列」って内部的にはどういう処理をしてるんですか? array_a = ["ぬ", "る", "ぽ"] array_b = ["ぽ", "ぬ", "る"] dif = array_a - array_b とやったら、dif = empty になるんですが、 「HTMLをパースして特定の部分を抜き出した配列」 「ローカルのファイルを一行ずつ読み込んだ配列」 が全く同じテキストを要素に持っている場合に「-」を用いても、emptyにならないんですが。。。。
p array_a p array_b で中身同じか確認してみろ 文字コードや末尾の改行コードとかが一致してないんじゃねーの
>>467 すいません
かなり長いし社外秘も多少あるので簡略化したものを作らないといけませんが
解決したので、その必要はなくなりました
>>468 その通りでした・・・pで見たら 片方にだけ要素のあとに\nが入ってました
テキスト比較ソフトも使ったのに。。。ぐぬぬ
というわけでありがとうございました
471 :
デフォルトの名無しさん :2012/06/02(土) 16:53:18.73
僕は正義の実行機械… 風紀委員会の断頭台… なにも考えないしなにも感じない… なにも喜ばないしなにも怖がらない… 切りさいて引き裂いて一件落着大団円……!!
472 :
デフォルトの名無しさん :2012/06/03(日) 13:02:35.26
小学生が受かるような試験やってる言語やってて楽しい?
unicorn上でRackアプリケーションを
つくっているのですが、
Reck::Responseのbodyの中に
htmlソースを入れて外部css読み込みを指定したのですが
スタイルが反映されません。
cssファイルも明示的にrackアプリケーション上に読み込んだり、
content-type指定せねばならないでしょうか
<参考にしているサイト>
http://www.kaeruspoon.net/articles/845
>>472 中学生がコミッタになれるしね。
老害ばかりの言語と違って、実力があれば若くても活躍できるのだよ。
>>472 言語が目的じゃないなら、難しいのは却って邪魔だと思うよ
>>473 # config.ru
use Rack::Static, :urls => ["/css"], :root => "/home/alice/public_html/css"
app = lambda {|env| ... }
run app
みたいにするとRack::Static(の呼ぶRack::FIle#serving)の中で
PATH_INFOの拡張子に沿ってMIMEを解決してくれるみたい
477 :
473 :2012/06/03(日) 18:58:08.98
>476 早速、助かりました!ちゃんとできました。 なんかRackとかNginxのDSLに慣れません。 俺サイト構築まで道は長いっす。。
あれ意味ないから使わないほうがいいと思うよ
なんかいろいろ抜けてた、DSL使う意味ないという話 Rubyスクリプトのように書けばよろし
サーバハンドラやポートをベタ書きしなくて済むし useしたほうが楽だと思うけどなあ
「あんましRubyではない」を受け入れてまで得たいものかね
>>481 例えばどこらへんがRubyっぽくない?
DSLっていってもせいぜいRakefile程度だと思うんだけど
川崎重工と東芝、台湾で新幹線48両を受注
川崎重工業と東芝は24日、台湾高速鉄道から、東海道・山陽新幹線で運行されている「700系新幹線」をベースとした
高速鉄道車両を共同受注したと発表した。受注したのは4編成48両で、受注総額は非公表だが190億円程度とみられる。
川重と東芝は、2000年12月に台湾で、三菱重工業や三菱商事など国内7社連合で
360両の新幹線とシステムを3320億円で受注しており、納入実績が評価されたという。
台湾高速鉄道は、海外の高速鉄道としては初めて新幹線を採用し、07年1月に営業運転を開始。
15年には台北~南港駅を結ぶ5.7キロの路線延長を予定しており、今回、受注した車両を導入する計画としている。
http://sankei.jp.msn.com/economy/news/120524/biz12052417470033-n1.htm
配列は無限の大きさを持っているの? a = [] これで配列ができるんだけど大きさを指定しないとまずくないの?
Rubyの配列は実は配列じゃないので大丈夫です。
Javaだと配列は固定長だから使いにくくてコレクション使うようになってるから 逆に配列の存在意義ってなんなのって話になってるよね まあコレクションだとキャストとかジェネリックスとかうざいんだけど
本質的には配列のサイズの宣言なんていらない 全部コンピュータにやらせればいい もちろん、その代償として動作速度もメモリ効率も悪くなるが まあ、つまり、そういうわけで、RubyはCよりも遅い
いわゆるベクターとか言ってるデータ構造。 余談だがJavaの配列は、他にプリミティブを入れられるコンテナーがない、 とかで使い道がないわけでもない。
テレビで節電が叫ばれているが、そもそも昼間のテレビほど無駄なものはない。無駄だけではなく、
人をバカにする。公害である。これだけ言われても電波を止めないというのであれば、
私たちのライフスタイルを変えて観なければよろしい。
高校野球もだ。NHKの中継を一切観ない。いや、中継をしているのならば受信料を拒否する。
「みなさまのNHK」が節電に反する国賊行為をしているのである。当然のことだろう。
球児たちのためにも大会はやればいい。ただし、早朝試合とナイターにする。熱中症についてあれほど
報じながら炎天下で球児に試合をさせる朝日新聞の神経が私にはわからない。
馬鹿どもに声高に抗議するのにはもう疲れたし効果がないこともわかった。だから私たちはゆるやかに
生き方を変えて、奴らを不要なものにしてしまおう。この柔らかな革命がうまくいけば、
たとえば不当な税金に対しても、日本人は立ち上がるすべを覚えるかもしれない。電力不足と、
節電などを嘘つきどもが押しつけてくるこの夏は、日本人にとってあるいは歴史的な好機になるかもしれないのだ。
静かに、したたかに、この夏を楽しもうではないか。こうすれば節電できる式の記事や番組も
無視することだ。おまえらがそういうことをやめるのが、いちばんの節電だ、ともうわかったのだから。
http://www.news-postseven.com/archives/20120604_113264.html
>>484 動的配列。ただし管理はRuby側で勝手にやる。
なんで事前に文字列や配列の大きさを宣言しなければならないかがわかってれば宣言しない理由もわかるかと思うんだが、 最近はそっちの言語でもあんまり理屈を教えないんだろうか
他のプログラミング言語では書くおまじないがないのはなぜですか、くらいの質問だろ たぶんあんまし深い意味はない
スラドでやれ
顧客満足度や製品クリティなど様々な市場調査をしていることで知られるJ.D.パワー。そのドイツに
おける自動車関連の調査結果「J.D.パワーレポート2012」が発表されたことを現地メディア『Auto Bild』が報じています。
自動車の個別評価というと、いわゆる試乗インプレッションのようなものを思い浮かべがちですが、
ご存知のようにこの調査ではそうしたクルマの魅力のほかに、メンテナンスコスト、品質と信頼性、
サービスという視点からも評価をしているということです。それぞれはポイント化され合計によって
評価されますが、それぞれのファクターにおける比率は、魅力:28%、メンテナンス25%、品質24%、
サービス23%となっているとのこと。
さて、79台のクルマが評価されている「J.D.パワーレポート2012」ですが、そのほかにメーカーごとの
ランキングというのも発表されています。世界を代表する自動車王国のひとつであるドイツ、そのメーカー
ランキングはやはりドイツ系ブランドが上位独占! かと思いきや、そうでもないのです。
以下にメーカーランキングを紹介します(同点・同順位があるのでご注意ください)。
1位:メルセデス・ベンツ
2位:トヨタ
3位:三菱
4位:マツダ
5位:BMW
5位:フォルクスワーゲン
7位:シュコダ
8位:アウディ
8位:ボルボ
10位:フォード
トップのメルセデスは予想通りという人も多いでしょうが、2~4位を日本ブランドが独占。日本での
シェアや評価からすると、かなり意外といえるのではないでしょうか。
ちなみに車種別ランキングのベスト3を見ると、トップはメルセデス・ベンツAクラス、
2位にはマツダ6(日本名:アテンザ)が入り、3位がメルセデス・ベンツEクラスとなっています。
http://clicccar.com/wp-content/uploads/8569e5df3468798104dce4a91a25417d1-300x200.jpg http://clicccar.com/2012/06/04/161430
Windows7のruby1.9.3&mechanize2.3でログイン出来ないサイトがあるのですが解決策を教えて下さい pastebin.com/QbnBCzdb(規制中のためソースを貼りました)
>>495 試してないけど、ボタンのidも指定しないとダメなんじゃないの?
>>495 わかった
サイト作った人のほうでボット避けがしてあって、それに引っかかってる…としか言えん
もう解決してるかもしれないけど、せっかくなので、やり方を教える
普通、なにか「よくわからんけど、これで動作するはずなのに何故かサーバに弾かれる」ということが起こった場合、
「ふつーのWebブラウザの正常時の送信ヘッダと送信データ、受信ヘッダ」と「Mechanizeのログのヘッダとボディ」を比較する
(サイトのHTMLを精査しても理屈上はわかるんだけど、ぶっちゃけ判明までがかなり面倒)
firefoxならLive HTTP HeadersやHttpFoxで取得することができるんで、これを起動しながらログインした記録と、
agent.log=Logger.new($stdout) とかした Mechanize での結果をじーっと見比べる
リクエストヘッダをじーっと見る
変わらないように思える
リクエストボディをじーっと見る(HttpFoxだと簡単)
Mechanizeは改行が\nのままログに流れるので、適当に変数に入れてputsして、じーっと見る
おそらくは、forefoxだと送られてて、Mechanizeだと送られてないなにか、JavaScript由来のvalueやクッキー処理の差異でなにか
……アレ?
ということで、キーワードをもとにHTML内を検索すると、これは明らかにJavaScriptを利用したボット避け処置だということがわかる
JavaScriptで動的にフォームにデータを入力してる(しかもページ読み込み時)
MechanizeをはじめとするJavaScript非対応スクレイピングライブラリはこういうのにオートで対処できない
フォームにJavaScriptがやってるのと同じ値を自力で入力してからclick_buttonだ
498 :
495 :2012/06/05(火) 02:29:43.52
そういうのはやってから経緯を書け
585 名前:番組の途中ですがアフィサイトへの転載は禁止です[] 投稿日:2012/06/04(月) 00:15:13.02 ID:sChzMgIz0
騙されるな!在日の自作自演だ!
>
http://www.youtube.com/watch?v=z1eLBCgEhy8 吉本抗議
【この老人は朝鮮総連の幹部だった】
・名前が 李 田所(イ・ジョンス)81歳
・24歳の頃に来日、以降強姦など犯罪を繰り返し何度も有罪判決を受ける
・相手に因縁をつけ数人がかりで暴行を加える、10年前には2人がかりで男性に性的暴行を働いたことも
・特に気に入らない相手には自宅に呼び出し監禁、拷問を加えることも珍しくない
・これまで1億1451.4万円もの生活保護不正受給を斡旋したという噂も
・大学時代の先輩(男)にベッタリの同性愛者、下北沢を二人で歩いていたところを目撃した人も多い
640 名前:番組の途中ですがアフィサイトへの転載は禁止です[] 投稿日:2012/06/04(月) 00:21:38.79 ID:qe1EcwfO0 [5/5]
>>585 もう動画作った奴がなんか動画作るのに慣れてるし
明らかにこいつがグルで待ち構えてなければ撮れない映像じゃんw
こいつ明らかにデモに嫌がらせする目的でカメラ持って待ち構えてるのに
仕込みのジジイが来なかったらカメラ回す意味ないんだからw
偶然通りかかってカメラを回したとか嘘丸出しw
これでますます吉本のイメージが地の底まで落ちたわw
http://engawa.2ch.net/test/read.cgi/poverty/1338729931/
501 :
495 :2012/06/05(火) 05:32:01.87
>>497 ログイン出来ました!ありがとうございます。
pastebin.com/R0CtsucE
>>499 すんませんした!
「とり急ぎお礼まで」みたいなのはビジネス慣習だからなあ 1日ぶん"遅れ"たからって他の人に契約取られたりなんてしないわけだし、 実際にやってからその結果を報告されたほうが何万倍もありがたいわな もしかしたら最近はケータイショートメールの「見たら即レス」の慣習が母体になってるのかもしれんが
503 :
デフォルトの名無しさん :2012/06/05(火) 22:34:13.02
net/smtpを用いてメールを送信しようとしてるんですが、これを送ると、<<-EndOfMail ~ EndOfMailがそのまま本文に出てしまい ヘッダに出てこないんですが・・・・原因はなぜなんでしょうか? def send_message mail_content = " <<-EndOfMail, From: Ruby <from@example.com> To: iPhone <to@example.net> Subject: Update Date: #{Time.now} Message-Id: <unique.message.id.string@yourhost.example.com> Test EndOfMail " smtp = Net::SMTP.new(@server, @port) smtp.start(@localhost, @user_id, @password, @auth_type) { |smtp| smtp.send_message(mail_content, "************@gmail.com", "**************@i.softbank.jp") } end
mail_contentの下の " とEndOfMailの下の " がいらない Ruby ヒアドキュメント で調べて
>>504 ありがとうございました
今はよく分からなかったので、<<で代入する方法に切替えました
rubyinstaller から 1.9.3 p194 をインストールしたのですが Ruby193\lib\libmsvcrt-ruby191-static.aというように バージョン1.9.1っぽいファイル名が存在します。 これは昔のバージョンから変更されていないということでしょうか? Ruby 1.9.3 からライセンスが変更されたので BSDライセンスとして扱っても大丈夫かどうかが知りたいです。
1.9.2と1.9.3は1.9.1とバイナリ互換性がある(ようにかなり意識して必死こいて作ったり訂正したりした)ので、 1.9.1名義のサブディレクトリにインストールされ、1.9.1名義のバージョンファイル名がつく ABI互換であるという印なのだが、まあこれがまた初心者には意味不明な上に部外者にも意味不明(添付ファイル名だけが継続なので) いちおうマニュアルやらリリースノートやらには記述があるんだが、トラップではあるかと思う 単にバイナリが互換であるというだけなので、1.9.3のライセンスはBSDライセンスで(も)よい
>>507 ありがとうございます。
助かりました。
requireメソッドはクラスの何処に書くべきですか? それを使うメソッドのブロックの中に書くべきですか?
>>510 そのスクリプトでどんなライブラリを利用しているかを明示する為にもファイルの先頭に記述すべき
普段は絶対使わなくて、require すると1秒くらいガリガリ言うようなライブラリがある場合、それを使うエラー対処メソッドの中で require させて、ファイル先頭に # require 'something/heavy' # at Hoge#foo とか書くことはある あらゆるライブラリが一瞬で読み込めてファイル負荷もなにもない環境だけなのなら問題にならないが、残念ながらそれは理想的に過ぎる まあ、とにかく、外部ライブラリの require の情報はスクリプトファイルの先頭にまとめて書いておいて欲しい 習慣的に、みんなここを見てそのスクリプトでなに読み込むか判断するから あと、「自分のライブラリをファイル分けしていて、なおかつクラスの定義の関係上サブファイルはあとにしないとどうしてもまずい」というような場合は require 'rubygems' require 'something/hoge' class MyClass ... end require 'my/file1' require 'my/file2' とか後ろに回すことはあるが、要件としてはかなりレアで、普通は require 'my/file1' require 'my/file2' class MyClass ... end と書く require の大雑把な動作としては「そこにそれを物理的に挿入」なんで、 MyyClass のメイン定義の前に MyClass::File1 の定義が読み込まれるのが気持ち悪いと言う人がときどき出るんだけど、あんまり気にしないで欲しい
>>513 詳しくありがとうございました
参考になりました
515 :
uy :2012/06/09(土) 03:08:16.48
質問です a = [1,2,3,4,5] a[1,2] = ["a","b"] p a # => [1, "a", "b", 4, 5] このような挿入を行いたい時に、a[1,2] の 2をなくす事って出来ませんか? 以下のような方法を思いつきましたが、見た目やばいのです a = [1,2,3,4,5] a[1,(b=["c","d"]).size] = b p a
>>513 後ろに回すのは海外で時々見る(書く人によるらしい)
なんか宗派でもあるんだろうか
なんでもかんでも引数カッコ省略するようなもんだろ 戻り値メソッドチェーンするときだけカッコつけてて、指指して笑えるほどカッコ悪い
1.9.2p320 :004 > %Q["Hello"] => "\"Hello\"" 1.9.2p320 :005 > %q["Hello"] => "\"Hello\"" すいません。%Qと%qの違いがよくわからないです。 どう違うのか例をあげて教えてください、宜しくお願いします。
そういうのはマニュアルくらい読め
…なんだけど、これそもそもどう調べればいいのかわからないよな
この手の「そのまんま書いて文字列や正規表現オブジェクトになるもの」はリテラルと呼ぶ
マニュアルとかガイドとかを最初のページから順を追ってきちんと読む素直な人だけが得をする情報だったりする
ttp://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#percent > %!STRING! : ダブルクォート文字列
> %Q!STRING! : 同上
> %q!STRING! : シングルクォート文字列
ということで、%Q は "string" と同じで、 %q は 'string' と同じ
シングルクォートとダブルクォートの違いがわからない場合は、これは重要なので自力で勉強してくれ
自力で勉強といいつつURLの飛び先に載ってる優しさに惚れた
>>519 ありがとうございます。
わからないことに関して説明不足でした。
以下コマンドラインで実行したものです。
1.9.2p320 :004 > %Q["Hello"]
=> "\"Hello\""
1.9.2p320 :005 > %q["Hello"]
=> "\"Hello\""
上記 の%q["Hello"]は"\"Hello\""となっています。僕もカキコする前そのマニュアルみたんですが
そのマニュアルの説明なら
1.9.2p320 :005 > %q["Hello"]
=> '\"Hello\"`となるような気がします。そこら辺が分かりません。
分かる ようなら宜しくお願いします。
>>521 あそこに出るのはその場合、文字列をinspectしたものだと思うが
そこにシングルクォートで始まりバッククォートに終わるなんて表現は出ないよ
>>521 > '\"Hello\"`となるような気がします。
なんねーよ(素
「入力」した方法によらず、p や irb での inspect 表示や変数・メソッドとしての戻り値はひとつに定まっていると考えるのはどっすか
文字列はすべて、入力やら内部変数参照やらに依らず、すべてを解決した "string" の形式で返る
%記法は入力…というか文字列作成の手法のひとつであって、できた文字列には作成手段の情報は一切残らない
"string" も
"str" + 'ing' も
s = "ri"; "st#{s}ng" も
%q["string"] も
String.new('string') も
[115, 116, 114, 105, 110, 103].map{|i| i.chr}.join も
すべて "string" として返る
Rubyは、VBやScalaみたいに引数いれずメソッドを用いる場合は()を省略できますけど これってつけたほうがいいんでしょうか? 省略すると、インスタンス変数とメソッドの区別がつかなくなると思うんです ただ、そもそも hoge.インスタンス変数 とやっていても結局はメソッドを呼び出してるんだと言われたらそれまでですが・・・
>>524 > インスタンス変数とメソッドの区別がつかなくなると思うんです
ローカル変数使用とインスタンスメソッド呼び出しの区別がつかない、だとして回答
def foo
(なんか10行くらい省略)
some_exec(hoge) # ← hogeって何? 省略部分で定義されてたローカル変数? def hoge や attr_reader :hoge とかで定義されてるメソッド?
end
別に区別つけなくてもいいです(そんな変数名忘れるくらい長いメソッド作るんじゃねえ、という意味も込めて)
Ruby パーサがインスタンスメソッドだと思ってくれない場合にのみ、メソッドのほうを hoge() とか書きます
他の言語の流儀が忘れられないような初心者の人が稀にいちいち hoge() とか書いてますが、普通の人は書かないので真似しなくていいです
普段の順番的には、メソッド定義内部で同名のローカル変数を探してからおもむろにファイル内検索するんで、
まあ、その、若干めんどくさいことには変わりないとは言えないでもなくもない
ただ、Ruby では「引数なしレシーバなしインスタンスメソッド」をめちゃくちゃ大量に使うので、
それにいちいち () つけてるほうがたぶん総量としてめんどいんじゃなかろうかという判断をみんなしてるんじゃないかな
>>524 俺は最後の理由で「レシーバ.メソッド」形式に付ける意味は薄いと思う
精々、用法が「メソッド的か」「フィールド的か」という雰囲気付けくらいか
ただ「ローカル変数」と「レシーバの省略されたメソッド(関数を含む)呼び出し」
の区別をする意味で付けることも無くはないかな
527 :
デフォルトの名無しさん :2012/06/09(土) 15:26:42.12
# -*- encoding: UTF-8 -*- class Hoge def test_method @log = "" end attr_accessor:log end begin h = Hoge.new h.log += "正常終了" rescue => e h.log += e end p h.log このスクリプトで「+=」に対して、undefined method `+' for nil:NilClass (NoMethodError)と出てくるのはなじぇですか?
>>527 @log が初期化されていないから。
initializeメソッド(new時に呼ばれる)を定義し、その中できちんと @log を初期化すればおk。
test_methodが呼ばれてないので@logが定義されていないのれす
例外クラスを指定しない rescue は使ってはいけない
文法ミスだろうが構造ミスだろうがケアレスミスだろうが特定のデータのときだけ出るレアな例外だろうが全部握り潰してしまう
>>528-529 初期化も定義もされてる(だからアクセスできるし、nilが返る)
>>527 @log に nil が入ってるから
log メソッドの戻り値を使うより前に、+ メソッドを持つオブジェクトを入れとけばいい
# -*- encoding: UTF-8 -*-
class Hoge
attr_accessor :log
end
begin
h = Hoge.new
h.log = ""
h.log += "正常終了"
rescue StandardError => e
h.log += e.to_s
end
p h.log
>>531 例外クラスを指定しない場合はStandardErrorを指定したのと一緒では
あとattr_accessor :xしたからといって実際にインスタンス変数@xが定義されているとは限らないだろう
Hoge.new.instance_variablesするとわかる
533 :
デフォルトの名無しさん :2012/06/09(土) 16:06:31.72
>>528 >>529 ありがとうございます!!
今回のサンプルコードは指摘通りにメソッドを呼び出してなかったんですが、
このようにメソッドの中でインスタンス変数を初期化するようにしていると、例外が発生した時にそのメソッドが呼ばれないまま
rescueの中でそのインスタンス変数を参照してしまう可能性があるので、
やや行数が増えてもinitializeの中で初期化しておくのが利口なんですかね・・・?
インスタンス変数のスコープの性質的にもその方が綺麗と言えるかもしれませんし
>>533 初期値がnilであるべきならば初期化しなくても実害はないと思うけど
その場合でも俺なら明示的にnilで初期化しておくか、initialize内でtest_methodを呼んで初期化するかな
あとは attr_accessor を使わずに attr_reader にして読み取りのみにし、追記は別メソッドでやるという方法もある
それなら、その別メソッドの最初に @log の中身を確認して無ければ初期化してから処理、とできるでしょ
使わないんならinitializeにインスタンス変数書くんじゃねえ、という考え方もいちおうある def log @log ||= "" end チェッカーに文句言われるからinitializeに全部書く、という消極的な考え方もあるが
>>524 前スレだかでも同じことを言った気がするが
区別をつける必然性がないんだからつかなくても何も問題ない
hoge.fooのfooがインスタンス変数だろうがメソッドだろうがそれに意味はなく、意味があるのは戻り値だから
>結局はメソッドを呼び出してるんだと言われたらそれまでですが
それは確かにそうだがそれとこれとは別の軸の問題
そこに書かれた「hoge」が変数かメソッドか「区別がつかなくなる」と困るのは誰か、と考えればわかると思う
537 :
デフォルトの名無しさん :2012/06/09(土) 20:38:08.66
http://doc.ruby-lang.org/ja/1.9.2/class/Array.html Array#dupの挙動がリファレンスを見てもよくわかりません
ary = ['string']
p ary #=> ["string"]
copy = ary.dup
p copy #=> ["string"]
ary[0][0...3] = ""
p ary #=> ["ing"]
p copy #=> ["ing"]
上記のコードを見て、copyという変数はaryという配列オブジェクトの参照をコピーしたもの(shallow copy)だから
"str"の部分を切り取る処理をした後ではaryもcopyも同じ値を出力するのかと思っていました
ary[0] = "test"
p ary #=> ["test"]
p copy #=> ["ing"]
このように改変しても値はaryとcopyで同じだと思っていたのですが、別になってしまいます
なぜこのようになるのでしょうか?
>>537 irb> a = ["str"]
irb> p a[0].object_id
80168600
irb> p a.dup[0].object_id
80168600
irb> p Marshal.load(Marshal.dump(a))[0].object_id
80240260
このへんから、オブジェクトIDを見ないとわけわかんなくなる
Marshal.dump したものを Marshal.load するのはいわゆる深いコピー(deep copy)の常套手段
おまけ
irb> s = "abc"
irb> p s.object_id
80310090
irb> s[0] = "b"
irb> p s.object_id
80310090
irb> p s
"bbc"
539 :
デフォルトの名無しさん :2012/06/09(土) 21:23:40.21
>>537 ary[0][0...3] = ""もary[0] = "test"同じようにary[0]を変更しているように見えるが実際は全然違う。
前者はary[0]が指している"string"というStringオブジェクト自体を変更する処理だけど
後者はaryというArrayオブジェクトを変更して、ary[0]が指し示す先を変える処理。
最も決定的に違うのはこの点。
なので、ary[0][0...3] = ""ってのは
copy[0] → "string" ← ary[0]
だった所を、"string"を変更して
copy[0] → "ing" ← ary[0]
とする処理である一方、ary[0] = "test"ってのはaryの方を変更するから
copy[0] → "ing" ary[0] → "test"
という風になる。
>>537 また、30%の人か。
Rubyは、多次元の配列はサポートしていない。
配列の要素に、配列を許容するので、多次元の配列を記述することができる。
なので、dupはこの場合役に立たない。
aを別の(独立した)メモリーアドレスbに複製するなら
(この言い方も、なんだか誤解されそう? と、言うか、わかりやすいけど、正確でない?)
b = Marshal.load(Marshal.dump(a))
とか、すると良いようだ。たぶん。
も少し、わかりやすい名前にするとか、わかりやすいところに書いとく、
とかの配慮はないみたい。
それは多次元の配列ではないし、 マーシャルを使ってオブジェクトのディープコピーを行うのを、配列の配列を 中身まで全部コピーする方法としてマニュアルで紹介するのは、 ・他の種類のオブジェクトでも一般に使える方法であること ・配列の配列をディープコピーする方法としては、書くのは簡単だが、 やることとして大げさ過ぎること といった問題がある。
543 :
あ :2012/06/10(日) 00:29:26.33
foo = Array.new puts "#{foo}" だと配列が空でも[]と出てきてしまうのですが、空白だけ出す方法はないのでしょうか?
>>543 #{}の中はコードが書けるんだから、条件ごと書けば良いよ。
puts "#{foo.empty? ? "" : foo}"
545 :
あ :2012/06/10(日) 02:30:44.76
ありがとうございます
546 :
uy :2012/06/10(日) 08:51:27.43
質問です transposeに破壊的メソッドが存在しないのは何ででしょうか
547 :
デフォルトの名無しさん :2012/06/10(日) 19:56:18.69
Errno::ECONNRESET をrescueで拾い、ensureでログに吐きたいんですが エラーの名前を拾うにはどうすればいいのでしょうか? begin raise Errno::ECONNRESET rescue => ex ensure p "#{ex}" p ex.to_s end だと"An existing connection was forcibly closed by the remote host."というエラーメッセージだけ表示されてしまうんですが
549 :
デフォルトの名無しさん :2012/06/10(日) 20:21:21.13
>548 ありがとうございます
>それは多次元の配列ではないし、 dupで思うようにならないてっことは、 1次元の配列の要素が文字列ってことね。 そこらへん、取扱いは同じなの。 そこを、ちゃんと書くと長くなる。 ので、少し端折っただけなのに ユースケースとしては、 パズルなんかを解くときに、総当たりしてるときに、袋に当たると、 いくらか、戻らねばならんので、あるときの状態を再現せねばならん時とか。 で、このあたりを書くと、作者さんの嫌いな「再帰的な呼び出し」 をせねばならないことが多い。
551 :
uy :2012/06/11(月) 06:30:58.63
質問です [[1],[2]].map(&:push,4) とかで引数を渡せないのはなんでなんでしょうか
dryに書きたいなら [[1], [2]].each.with_object(4).map(&:push)
553 :
uy :2012/06/11(月) 09:58:33.54
質問です 1.8系では ?a とすると97と表示されていたのですが 1.9系になってからは p ?a # => "a" こうなってるんですけど、これって正しい動作なんですか? だとすれば、?a って構文は何のためのものになったんですか? だとすれば、アスキーコード見たいときってどうすればいいんでしょうか "a".bytes do |m| p m end???
554 :
uy :2012/06/11(月) 10:00:58.87
>>552 そんな方法あったんですね
べんきょうになります
557 :
uy :2012/06/11(月) 11:46:26.30
>>555 そうなんですかっ
ありがとうございます
>>515 a.insert(1,*["a","b"])
560 :
uy :2012/06/12(火) 03:28:39.54
>>559 # =>[1, "a", "b", 2, 3, 4, 5]
>>553 プログラミング初心者の私が
答えるのはあれですが、
?aは
"a"[0]と同じように振る舞いますね。
オライリーの
初めてのRubyに書いてあります。
アスキーコードは
String#bytes.to_aのはず
562 :
uy :2012/06/13(水) 04:55:04.43
あ、ありがとうございますー! 本当に助かりました ご教示ありがとうございます String#bytes.to_aという発想もらい自分なりに考えてみたのですが String#bytes.firstでそのまま受け取れることが確認できましたっ! プログラム板でこういったやり取りをするのが僕自身の唯一のリアルです うれしいなー(」・ω・)」うー!(/・ω・)/にゃー! みんな答えてくれればいいものをなかなか答えてくれなくて寂しい思いを今までしてまいりました。・゚゚・(≧д≦)・゚゚・。 すぐ答えがかえってくるようなbbsができたらいいのに、あ、でもム板にもこのような心を持った方はまだご健在でいらしたのですね 少し感動してしまいました(o^∇^o)ノ まだ外も暗い時間だというのに世界が明るくなりました凄くいいぃぃ 長梅雨の曇り空なのに外が晴れているような気分で特にいいぃぃ このような良質ゆんゆん電波降り注がれて最高にいいぃぃれっつ\(・ω・)/にゃー! またrubyを使っていて困った事があったら><。。このスレで質問させていただきますのでそのときは教えてくださいねっヾ(≧▽≦)ノ それでは失礼いたしますデハデハヾ(_ _*)
$:.unshift(File.dirname(__FILE__)) の $.はなにをあらわしてるんですか? 調べてもよくわかりませんでした
564 :
uy :2012/06/13(水) 06:11:22.77
>>563 Rubyが勝手にセットするグローバル変数だよ
ユーザーからは作れない名前だからちょっとばかし特殊だが
$: はロードパスのディレクトリ配列を返す
若干わかりにくいので、どちらかというと、別名の$LOAD_PATHのほうが人気
http://doc.ruby-lang.org/ja/1.9.3/class/Kernel.html Unix系シェルの実行パス列挙の区切り文字は : だから連想しやすいよね、という、歴史的経緯を鑑みた連想しにくい理屈がつけられている
Rubyは、これの順番でrequireするファイルを探す
unshiftだから配列の先頭に追加で、つまりは「このファイルのあるディレクトリを$LOAD_PATHの先頭に追加」だ
直後の require 'hoge' でまず最初に「自分のディレクトリにあるhoge.rb」を確実に探して欲しいときのイディオムだな
: そのものは Perl 由来だっけか パスの列挙区切りで云々というのをPerlの本で見かけた記憶がある
Perlってきもいのに そのきもさを継承したRubyって
568 :
デフォルトの名無しさん :2012/06/13(水) 19:58:14.05
$プラス1文字記号の変数はほぼシェルかPerlからの引き継ぎ。 Perl自体がシェルから引き継いだ $$ なんてのもある。
569 :
524 :2012/06/13(水) 20:52:32.34
abc002.jpg 11-dfg.jpg このような、なんの法則もない画像が1万点フォルダにあって、 それぞれの頭文字3文字だけとったフォルダを作って、分類することはできますか? 「abc」フォルダに「abc002.jpg」。 「11-」フォルダに「11-dfg.jpg」。 こんな感じで分けたいんですが可能でしょうか?
できるかどうかだけで言えばできる でも、チェックとディレクトリ作成とファイル移動はぜんぶ自力で書かないといけないな
>> s = "abc123456" >> if s =~ /(.{3})(.*)/ then puts $1, $2; end abc 123456 とかやれば分離できる
可能です
「本当に」なんの法則性もない英数字なのなら、先頭3文字で分類してもたいしてまとまらないんじゃないかな…
意味は無くてもいいんです。 ひとつのフォルダにあまりにファイルが多いと、 システムが不安定になるんで、 適当にばらけたフォルダに数千ファイルくらいに、 別れてくれれば良いだけなんす。
>>571 >>573 ありがとうございます
>>572 さっぱりなので、ちょっと勉強させてもらいますw
>>574 実は画像が数100万ファイルありまして。。
一覧を表示するのも難儀な状態なので、
1フォルダ当たりの画像数を減らしたいというのが発端なんです。
577 :
576 :2012/06/13(水) 23:06:32.63
漏れも同じこと既にしてるわ
579 :
576 :2012/06/13(水) 23:08:01.70
>>578 !!
よかったら
参考にコードを教えてもらうってことはできませんか?
Python のだけど それでもいい?
581 :
576 :2012/06/13(水) 23:09:43.54
>>580 もちろん、実現出来れば、なんでもかまいませんw
お願いします。
テストしてないからバックアップとってからやってほしいのだけど filenames = Dir.glob("*.{jpg,gif,png,jpeg,bmp}") filenames.map{|e| e[0..2] }.uniq.each{|e| Dir.mkdir(e) } filenames.each{|e| File.rename(e, File.join(e[0..2], e)) }
一応移動先のフォルダに同じ名前のファイルがあって そのまま上書きするとコンフリクトする場合は ファイルの日時やサイズやどちらも同じなら中身も比較して 全く同一なら削除したり移動せずにスキップしたりする機能も付けてる
36*36=1296 36*36*36=46656 フォルダ5万個って便利か? いや、別にいいけどさ
エロ画像なんて面倒になってハッシュ値にリネームして頭2桁/2桁で分類してある 属性フォルダ分けとかやってる奴ら頭おかしい
587 :
576 :2012/06/13(水) 23:13:41.79
>>583 ありがとうございます。
まさか希望の動作をするコードを教えていただけるとは思いませんでした。
・・・しかし、随分コンパクトな記述で可能なんですね。
私もwebクローラーとかをrubyで作ってますが、
無駄に長くて恥ずかしい限りです。
教えていただいたコードで試してみます。
ありがとうございました!!
588 :
576 :2012/06/13(水) 23:15:08.19
>>585 そんなことおっしゃらず、ぜひw
勉強させてください。
スレ違いになると怒られちゃうので 続きは Python スレでやろう
つうかそれくらいシェルスクリプトでやれ シェルスクリプトも書けない奴が他の言語に手を出すな
そういうときはシェルスクリプトで書いてみせたうえで煽らなきゃ
592 :
576 :2012/06/13(水) 23:22:55.44
>>589 Pythonスレ、すんごいたくさんあるんですねw
どちらにいけばいいですか?
>>590 シェルスクリプトのサンプルも見せていただけるなんて!
ありがとうございます。
593 :
576 :2012/06/13(水) 23:27:15.28
>>582 テストしてみたら、完璧に動作しました!
動作も早く、完璧です。
自力でやったら何日もかかるところ(何十日?)頂いたコードで助かりました。
>>591 ls *.jpg | group { $_.Name.SubString(0,3) } | % { md $_.Name; move $_.group -dest $_.Name }
Powerシェルスクリプト…たまげたなあ
596 :
576 :2012/06/13(水) 23:44:24.27
>>594 おみそれしやした。
私にはどうやって実行していいかもわかりませんw
煽ってすいませんw
599 :
デフォルトの名無しさん :2012/06/14(木) 20:30:49.00
yieldってどういうときに使いますか? 他の言語で言う、フラグ(boolean)を渡してif文でフラグがtrueのときに処理する、みたいなのを やや綺麗に書けるのかなぐらいの認識なんですが
rubyでは全てがオブジェクト ブロックで囲まれた部分もオブジェクト。 rubyではブロックも引数として関数に渡せる。 受け取った関数が受け取ったブロックを実行させたい時に命令するのが yield
def fib_up_to(max) i1,i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end fib_up_to(1000) {|f| print f, " "}
韓国の国宝1号に指定されている崇礼門の復元にあたり、日本製の接着剤を使用していることに対して、問題視する声が上がっている。
文化財庁は「品質のよい日本製の接着剤の使用は仕方ないこと」と説明した。韓国メディアが伝えた。
崇礼門は李氏朝鮮時代の1398年に都の南城門として建てられ、1962年に国宝第1号に指定された。
通称南大門の一帯はソウルの観光名所でもある。08年2月に放火によって木造楼閣の大部分を焼失し、10年2月から復元工事が行われている。
現在、復元工事は瓦を葺く作業と丹青(たんせい)を施す作業を残しており、12月に完成する見通し。
韓国の伝統的な技法による復元を強調しているが、丹青作業で使用する顔料と接着剤は日本から輸入品であることが明らかになった。
これに関して、一部から伝統的な方法による復元作業に外国製を使用することを問題視する声が上がった。
文化財庁は「品質のよい材料を使用するために避けられない選択だった」と説明した。専門家からも「日本製の接着剤は優れている。
国内製ではなく残念だが、国宝で実験はできない」との見方を示した。
韓国の伝統的な接着剤の製造技術は1980年代にすでになくなっており、09年に某大学の教授が再現して作ったが接着力が弱く、
崇礼門の復元には使用できなかったという。(編集担当:金志秀)
サーチナ 【社会ニュース】 2012/06/14(木) 13:46
http://news.searchina.ne.jp/disp.cgi?y=2012&d=0614&f=national_0614_052.shtml
>yieldってどういうときに使いますか? 自前でイテレータ実装したくなった時に使えばよろし 練習がてらにls('-1'){|f| puts f}とか作ってみたら
ブロックつきメソッドを作りたいときに使う、動作はわかるが原理がよくわかんないやつ、でいいと思う どうしても必要なときにしか使ってはいけないから、今はそんな程度でよい
>>599 メソッドeachを定義してイテレータを実装する時に使う
class Foo
include Enumerable
def each
for x in @ary
yield x
end
end
# 以下略
自分の場合、これ以外の用途でyieldを使う事は無いなあ
607 :
デフォルトの名無しさん :2012/06/14(木) 22:32:14.04
DSLやり始めるとyieldとかinstance_evalとか使いまくり
610 :
uy :2012/06/15(金) 05:39:26.46
最近2ch見てて思うけど やたら個人ブログのURLはって「ほらソース」みたいなレスをみるんだけど 無名PGの個人ブログなんてソースにならねーだろ 個人ブログに書かれたものなんてWikipedia以下だと認識してる 自演乙って事かい?
根本的に理解できていない初心者です。いろいろ調べてみたのですが分からなかったので質問します。 mac port経由でrubyをインストールして port installed port installed | grep ruby で見てみると ruby @1.8.7-p358_0+thread_hooks (active) ruby19 @1.9.3-p194_2+doc+nosuffix (active) となります。 ruby -vをみると ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-darwin11] が表示されます。。 sudo port -f activate rubyをうつまえは1.9.3となっていたんですが。。 前のverがアクティブになったのが原因なのでしょうか? 戻す方法がわかりません。宜しくお願い致します。
韓国の国内総生産(GDP)を考慮した個人負債規模が財政危機に陥っているスペイン並みに深刻な水準となった。
個人負債の増加速度は経済協力開発機構(OECD)加盟国で3位と平均を大きく上回った。
大韓商工会議所が14日に発表した「個人負債現況と政策課題」報告書によると、
2010年の韓国のGDPに対する個人負債の比率は81%でOECD平均の73%より高かった。
これは財政危機を陥っているスペインの85%に迫る水準だ。ギリシャの61%より20ポイント高い数値だ。
個人負債増加幅も急速に拡大していうる。2006年以後鈍化した個人負債増加率は2010年に前年比2.4ポイント上昇の9.8%を記録した。
【今日の感想】この記事を読んで・・・
面白い (40件)
悲しい (2件)
すっきり (1件)
腹立つ (0件)
役に立つ (6件)
http://japanese.joins.com/article/707/153707.html?servcode=300§code=300
>>610 Wikipediaは誰でも編集出来るが故に、内容の質も上から下まで様々
個人ブログは良くも悪くも、その個人の質である程度一定してる
その違いだよ
>>613-614 板全体であぼーんされていて誰からもレスがもらえないからってとうとう自演を始めた…
616 :
デフォルトの名無しさん :2012/06/15(金) 09:08:05.62
>>611 MacPortsのrubyを普通にインストールすると、
コマンド名は ruby (1.8)と ruby19 (1.9) になるから、
1.9のほうを+nosuffix付きで入れたのでない限り。
両方アクティブにしても共存できるはず。
これ以上はrubyとは本質的には関係ないので 新・mac板 で。
617 :
デフォルトの名無しさん :2012/06/15(金) 09:08:39.61
あ、+nosuffix付けたのか。なら適宜 deactivate して。
>>616-617 スレ違いだったんですね、すいません。
適宜deactivateしてみたのですが、うまくいきません。。
新・mac板いってきます。有難う御座いました。
ゲーム作れるgemご存知なかたいらっしゃいますか?スレチでしたらごめんなさい。
ゲームというものを、なんていうかこう、魔法のように作れるライブラリというのはない ゲーム作成が(実質)専門となってるような言語やシステムを使うといい WindowsならHSPとか
ゲーム製作技術
http://toro.2ch.net/gamedev/ ほい
個人的には、Rubyという言語自身と並行して学ぶ理由はないと感じる
Rubyでたいていのものを作れて、Cでもゲーム作れるくらいのAPIに熟達したような人が
「あえてRuby経由でゲーム作ってみた」というのに挑戦するためのライブラリならいくつかあるんだが、
これに自力検索等で到達できなかった、または見てもそういうものだってわかんなかったってことは、
Rubyとゲームに使えるWindows APIの両方の知識が足りてないってことなんで、Rubyでゲームを作ることは「できない」でいいかと思う
Rubyでゲーム作る本ならあったな
623 :
uy :2012/06/15(金) 20:04:11.21
グぐればでてくるしな ズブの初心者には無理だけど、ある程度rubyわかっててC++でゲーム作れるくらいの奴ならゲームの種類によっては 選択肢にあがってもおかしくないのに、やってる奴少なすぎてもったいない
ゲームのレスありがとうございます。 頂いた情報基にさがしてみます。
626 :
デフォルトの名無しさん :2012/06/15(金) 20:58:18.20
RPGツクールならRubyでゲーム作ったことになるんじゃね?
テキストデータをRubyを使ってExcelに入力していきたいです セルを指定して順番に入力していき全データを書き終えたら終了、というような サンプルプログラムってありませんか? バージョンは1.8.7ですがググると古いものがヒットします
ruby excelで検索すると普通に出てくるのは気のせいか
>>619 gemじゃないやつを含んでもいいのであれば
Ruby/SDLとかStarRubyとかDXRubyとか
(もしかしたら最近は他にも新しいライブラリがあるかも)
上の方では懐疑的なレスもあったが
俺は普通にゲームは作れると思う
HSPと比べてRubyでゲームが作りにくいかと言われると、別にそんなこともない
ただ、最近のRPGツクールではRubyが組み込みで入ってるから
RPGツクールに頼らず自前でやるべきかどうかは一度考えた方がいい
そこそこの速度が必要だとか、RPGツクールでは作りにくい特殊なシステムだとか
もしくはできるだけお金をかけずにゲームを作りたいとかなら
上記ライブラリを試してみるのがよいと思う
HSPとRubyってどっちが速いんだろう? もしもHSPの言語部分を丸ごとRubyに取り替えたとして 速度的に成り立つんだろうか?
def str2hash(str) hash = {} ary = str.split(/\s+/) ary.size.times do hash[ary.shift] = ary.shift end hash end print str2hash("blue 白 white shiro\nred aka") やさしいRubyで勉強中です。上のプログラムかいて実行すると、 {"blue"=>"白", "white"=>"shiro", "red"=>"aka", nil=>nil} と、最後にnil => nil が入ってしまいます。なぜでしょうか?
>>634 6と出ました。。。ああ。
((ary.size)/2).times do
にしたらうまく行きました。ださいコードですが。答え見たらこんなでしたが。なるほどね。。。
while key = array.shift
value = array.shift
hash[key] = value
end
やさしいRubyっていうかたのしいRubyはArray#shiftとかの難しい概念を使わせるから嫌い
今のRubyでスタックやキューを初心者に教える意味はあるのか?
スタックやキューと言えない配列に対してArray#popやArray#shiftをさせる意味はあるのか?
>>635 ということで、それ悪問だから忘れていいよ
def str2hash(str)
arr = str.split
Hash[*arr]
end
まあ、*による変数展開をいきなり教えるのもどうよって感じではあるんだが、すくなくともArray#shiftよりは使うはず
変数になってない場合は動作しないので注意、たとえば Hash[*"key value".split] はうまく動かない
637 :
uy :2012/06/16(土) 06:00:45.28
def str2hash(str) hash = {} p ary = str.split ary.each_slice(2) do | a , b | hash[ a ] = b end hash end p str2hash("blue 白 white shiro\nred aka") p Hash[ *("blue 白 white shiro\nred aka").split ]
uyのほうが筋が良い件について
>>636 いや普通にshiftは多用するだろ
他の人のコード見てたらよく見かけることもあるし
「スタックやキューの概念が難しいから」で避けてよいものではない
たのしいRubyではいちおうスタックとキューの解説はあったはず キューじゃないものから「先頭を削って返す」ためだけにshift使うんじゃねえという指摘はアリっちゃアリだとは思うが でもそうするとArray#pushが普段使えなくなって不便だとちょっと思う str = "blue 白 white shiro\nred aka" h = {} str.split.each_slice(2) do |a| h[a.first] = a.last end p h
ループ1周につき2回削ってるとナニコレって思う
Hash[*str.split(/\s+/)] #単語が奇数個だとエラーになる Hash[str.split(/\s+/).each_slice(2).to_a] #奇数でも大丈夫、最後の足りないvalueはnilになる Hash[] の引数は配列の配列でも大丈夫 Hash#to_aしたときに出来るやつ
643 :
633 :2012/06/16(土) 12:49:29.25
いろいろあるんですねー。勉強になります。ども 仰るとおり、たのしいRubyでした。まつもとさんのRuby本で挫折したのでこっち呼んでます。
644 :
デフォルトの名無しさん :2012/06/16(土) 13:56:49.06
スレ違いかも知れませんが、質問させて戴きたくお願いします。 RubyInstaller(1.9.3-p194および1.9.2-p260)とEmacs23.4(gnupack)だとデバッグができません。 例えばEmacs上でステップ実行や終了が出来ません。 M-x rubydbでデバッガは立ち上がるのですが、 (rdb:1) s [enter] とか (rdb:1) q [enter] してもステップ実行できないし、終了もできない状態です。 (rdb:1) s [enter] s [enter] s [enter] ... どうもデバッガにコマンドが渡っていないようなのです。 現状、misc/*.elはすべてsite-lispに入れ、init.elに設定を追加済み。 またActiveScriptRuby(1.9.3-p125)を使えば、M-x rubydbにてステップ実行も 終了も出来る状態にはなっています。 RubyInstallerのRubyにてM-x rubydbを使う場合は、どこかに追加の設定が 必要なのでしょうか? 恐れ入りますがご教授戴きたくお願い致します。
645 :
デフォルトの名無しさん :2012/06/16(土) 13:58:41.76
646 :
645 :2012/06/16(土) 14:51:29.67
自己解決しました テーマでした
>>644 ほぼFAQであり、なおかつその指摘も英語で書かれるであろうと思われるので読まれないであろうと思われ、
さらに原因と対処に気付くかどうかもWindows初心者であるがゆえにいつまでもないと思われるので
結局はいつまで経っても直らないであろうと思われる
インストール時に英語読まなかっただろ
「Add Ruby executables to your PATH」という項目があって、チェックボックスが外れてたはずだ
Rubyのスタートメニューからプロンプトを起動するという使い方以外をするときは、ここにチェックを入れる
もちろん、インストール時にやらなくてもあとからすることもできるが、PATH環境変数の概念がない場合はそれ自体思いつかないという罠が
「Rubyディレクトリの中のbinディレクトリを、環境変数PATHに追加する」という行為を行なう必要がある
使ってるWindowsでどうやるかまでは知らないのでぐぐってくれ
英語読めないとRubyは使えませんを体現したような案件っすな
>>562 どこを立て読みとおもった私は擦れてますね。
超遅レスですがどーいたしまして。
>>648 日本でだけ使用されてるなら、そりゃ全部日本語なんだろうけどね
英語圏でも使用されてるから、そりゃそれは英語なんだろうな
英語で書かれたものが日本語になるような機能は残念ながらついてない
652 :
644 :2012/06/16(土) 21:23:49.74
>>647 おそらく私の説明が悪かったものと思います。申し訳ありません。
imgur.com/FTyvD
Rubyへのパスは通しており、コマンドプロンプトからのデバッグは可能です。
また、ActiveScriptRubyを使った場合はEmacsからのデバッグはできるのですが、
RubyInstaller版を使った場合は、Emacs経由でのデバッグはできない(例えばs
コマンドが無視される)という状態になっています。
RubyInstallerの場合、RubyInstaller専用の設定をinit.elに入れないとダメなのか、
何らかのgemをいれないとダメなのか、そのあたりの見当が付かずお尋ねした次第です。
不勉強で申し訳ありません。
653 :
644 :2012/06/16(土) 21:32:44.79
画像が上手くアップロードできていなかったようなので貼り直します。 i.imgur.com/sHYoF.jpg
ActiveScriptRubyとRubyInstallerのフルパスは? .exeまで書いてね
655 :
644 :2012/06/16(土) 21:49:25.27
RubyInstaller: C:\Apps\Ruby\ruby-1.9.3-p194-i386-mingw32\bin\ruby.exe ActiveScriptRuby: C:\Apps\Ruby\ruby-1.9.3-p125-asr\bin\ruby.exe あと、ActiveScriptRubyを使用すると、このような感じになります。 i.imgur.com/jmwhp.jpg
*gud-test.rb*からC-h k RETするとどうなる?
657 :
644 :2012/06/16(土) 23:58:06.73
こうなりました。 i.imgur.com/wyAIm.jpg ……Aptanaなりvim-rubyでも使った方がいいのかと疑い始めている次第。 Emacsを覚えようかと、Emacs + Rubyの構成に手を出したのがまずかったのかも知れません。
658 :
デフォルトの名無しさん :2012/06/17(日) 00:30:24.63
Rubyのために新しくエディタ覚えるより、 普段使ってるものでやったほうがよいよ。
659 :
644 :2012/06/17(日) 00:33:41.58
>>658 そうですな。書く以前の段階でハマって意地になってるかもしれませんわ。
普段はサクラかAptana、Debian使ってるときはVimですんで、そっちでやることにします。
テキストデータをエクセルに書き出す方法を教えて下さい テキスト(文字列)を適当な文字aに格納して、それを file = "test.csv" open(file,"wb") do |f| f.print a ってやってみるとことまではできました このあと「これはこのセルに書き込みたい」という条件を付け足したいのですが、 正規表現を使いまくる感じでしょうか?
>>660 .exl形式のファイルに出力したいのか.cvsでもいいのか
既存ファイル等をExcelで開いてその上でセルの内容を上書きしたいのか
等々、もうちっとやりたい事を詳しく書けば知ってる人が教えてくれるだろう
>テキストデータをエクセルに書き出す方法を教えて下さい
は、順序が逆でしょ。
カンマ、スペース、タブ区切りなどの、テキストファイルを読み込む方法をEXCELは、標準で持ってますよ。
それが出来ないのなら、そこらのPC教室に行って来い、で良いと思う。
真面目にレスすると
>>661 みたいになるの?
MSは基本、非公開だし、バージョン変わると、自分のとこも継承できないのに。
663 :
662 :2012/06/19(火) 22:26:20.00
あ、 カンマ区切りにして、 hoge.csv にすると、ファイラー(エクス なんとか)でクリックすると、EXCELでopenしてくれるかもね。
664 :
662 :2012/06/19(火) 22:40:42.74
>663 のように、openできても、フォントとか字の大きさなんかは再現できない。 もともと、テキストファイルには、そのような情報が無いから。
665 :
662 :2012/06/19(火) 23:04:02.81
>>このあと「これはこのセルに書き込みたい」 か、 ごめんね。 セルの位置は、改行とレコードの区切りでなんとかしてもらわねばならんと、思う。 参照して、合計を出すとか、テキストファイルではできないから。 Rubyでできないとかではなく、テキストファイルはそんなもの。
>>660 exlap.rbとか使うと良いんじゃないでしょうか?
臨時串で書き込んでるのでurl貼れないのですが、exlap.rbで検索するとすぐ見つかります。
>>660 まず、理解レベルの確認。
*.csvを「エクセルファイル」と勘違いする初学者も居るけど、
*.csvはエクセル専用ではなくて、「カンマ区切りのテキストファイル」だと理解してるよね?
次に、以下のどれをやりたいかによって方法が違う。
1.*.xlsを新規作成or追加書き込みor書き換える。
2.*.csvを新規作成or追加書き込みor書き換える。
*.csvファイルをExcelに手動でインポートすると、指定セルにデータが配置される。
3.Excelを起動後または起動済みExcelのセルに自動的に書き込んでいく。
なんだこの丁寧さw
669 :
661 :2012/06/20(水) 08:40:36.76
なんか書いてておかしいような気がしてたんだ .exlじゃなくて.xlsね
p = 1 p /hoge/ これはおもろい いろんなスクリプトの先頭にp = 1と書き込んでやろうw
ローカル変数がない言語の信者か。哀れだな
えっ? p = 1 p(/hoge/)
puts = 1 puts puts
>>671 パーサ書いたこともないんだと思う
っていうかスコープ…
>>672 そんなことしなくても、メソッドだと思える書かれ方をされている場合はメソッドのように動作する
$ ruby -e "p=1; str='hello'; p str"
"hello"
むしろこれはRubyの正規表現リテラルの問題
クラスが再オープンできてメソッドを再定義できる言語で
>>670 をやる意味がわからないな
釣られるふりして初心者スレで暇つぶしするのはやめましょう
p = 1 p "hoge" # "hgoe"を出力。これが大丈夫なのに p /hoge/ # SyntaxErrorになる。なんで? この挙動が目を引いたってことなんだろう pの先に正規表現リテラルが来ても代入ではなくメソッドコールだと区別できそうなものだけど
代入…?というか除算と間違えてるんだよね?これ p /hoge/iなんかだとSyntaxErrorじゃなくてNameErrorになるし
ごめん変なこと書いた。指摘ありがとう > p = 1.0; hoge = 2.0; i = 3.0 => 3.0 > p /hoge/i => 0.16666666666666666 ふおお
バカウヨはν速+と嫌儲から出てくるなヴォケ
YOUたち!RubyでinjectしちゃいなYO!
http://melborne.github.com/2012/06/18/i-am-inject-lover-too/ p "inject"
class List < Array
def inject(m, &blk)
p "m1:#{m}:#{first}"
return m if empty?
(drop 1).inject( yield(m, first), &blk)
p "m2:#{m}:#{first}"
end
end
List[1,2,3,4,5].inject(0) { |m, x| m + x }
# =>"inject"
# =>"m1:0:1"
# =>"m1:1:2"
# =>"m1:3:3"
# =>"m1:6:4"
# =>"m1:10:5"
# =>"m1:15:"
# =>"m2:10:5"
# =>"m2:6:4"
# =>"m2:3:3"
# =>"m2:1:2"
# =>"m2:0:1"
再帰ってinjectで更にinjectを呼んでって感じかと思ったら
mが空になったら return m if empty? ここで帰って行っているのね。
よくこんなの考えついたなぁ。
ごく一般的な再帰だと思うんだが 何か特別な発想が入ってる?
rubyって何回までの再帰なら動作保証されるとかそういう仕様あるの?
685 :
デフォルトの名無しさん :2012/06/22(金) 00:06:12.64
Mac含め、UNIX系OSならulimit次第。 Windowsでもにたようなプロセスごとのスタック量の上限はあると思う。
1.8系と1.9系で比べてみるとわかるけど 再帰できる回数が10分の1くらいになってる しかもなにやら1.9のほうは再帰できる回数が メモリ配置の関係なのか、8000~15000回あたりを彷徨って不規則という
>>682 inject
# =>"m1:15:"
↑ここで配列が空になっているから呼ばれたところに戻るんだけども。
関数の動作は続いているんだねぇ。
呼ばれた関数に戻るって考えればわかるけど
終了条件をきちんと理解してなかったな。
List配列>inject1>inject2>inject3>inject4>inject5>nil>戻る ×
List配列>inject1>inject2>inject3>inject4>inject5>nil>inject5>inject4>inject3>inject2>inject1>戻る ○
自分は上だと勘違いしてた。
mに答えが入っているはずなのにm2をみるとmがどんどん減っていく、
どこに答えを確保してるんだ?
ご連絡 平成24年6月21日
チケット購入者 各 位
1 「K-POP IN 豊岡・神鍋高原」のイベント中止について
株式会社アンフィニジャパンでは、「K-POP IN 豊岡・神鍋高原」と題するライブイベントを、平成24年6月30日及び同年7月1日に開催することとなっておりました。
しかしながら、関係各所との行き違い等から、当初予定していたチケット販売計画は大幅な変更を余儀なくされ、チケット販売が低調に推移しました。
その結果、上記イベントを開催するために必要な各プロダクション、各業者への支払資金をねん出することができなくなり、上記イベントについては、中止させて頂くこととなりました。
チケットをご購入された皆様には、深くお詫び申し上げます。
2 ご購入いただいたチケット代金について
イベントの中止に伴い、本来であれば、当然にチケット代金をご返金すべきこととなります。
しかしながら、株式会社アンフィニジャパンにおいては、現在、見るべき資産がほとんどない状態です。
皆様にご購入いただきましたチケット代金についても、ほぼ全てを韓国プロダクションへの前金の支払及び開催準備費用に費消しており、株式会社アンフィニジャパンにおいてご返金することができなくなっております。
現状、株式会社アンフィニジャパンでは、大幅な債務超過状態にあり、自己破産の申し立てを行わざるを得ない状態です。
チケットをご購入されました皆様には、大変なご迷惑をお掛けすることとなり、深くお詫び申し上げます。
http://www.infinijapan.jp/ http://ticket.pia.jp/pia/event.do?eventCd=1223924 K-POP IN 豊岡・神鍋高原
KARA、超新星、Rainbow、パク・ヒョンビン…K-POPの人気アーティト達が、
兵庫県豊岡市にある、神鍋高原に大集合!激レア・イベントをお見逃しなく!
【中止?】K-pop in 豊岡・神鍋高原【契約不履行】
http://uni.2ch.net/test/read.cgi/4sama/1340285151/
689 :
uy :2012/06/22(金) 14:23:46.56
「してるんだ?」 → 「 してるんですか? 」 何この初心者 自分でかいてみりゃいいのに class List < Array def inject m , &b inject b[m , shift], &b ; rescue ; m end end
5.times {|i=3; a| a = 4 p [i, a] } 5.times {|i=3, a| a = 4 p [i, a] } ブロック変数とブロックローカル変数の違いがよくわからない。
5.times {|i=3; a| a = 4 p [i, a] } で p が何を表示するか、脳内処理して間違いなく自信を持って書き出せる人はまずいないと思う つまり、悪いコードだん 最初の i はたぶん Integer#times にもともとあるブロック変数に普通に消費されて つまりたぶんブロックパラメータ内の初期値はたぶん無視されて 0 から始まるはずだけど でも実際に試してみないとたぶんなんとも言えない、みたいな 2つ目の a は「ブロックの外に a があったとしてもそれをブロックの中で使わないでね」といった程度の意図 a = 9 1.times{|i| a=2; p [i,a]} p a #=> 2 a = 9 1.times{|i; a| a=2; p [i,a]} p a #=> 9 本来は ; で区切るべきだけど「余計なブロックパラメータ」として記述してもなんかふつーに動く
692 :
uy :2012/06/23(土) 05:52:22.05
5.times {|i=->{p 9}.call;a| p [i, a] } 5.times {|i=->{p 9}.call,a| p [i, a] } キリッ
前方の仮引数にデフォルト値を設定できるのが 直感的じゃない気がする def foo(a=:a, b=:b, c) p [a,b,c] end foo(1) foo(1,2) foo(1,2,3) 後方だと普通 def bar(a, b=:b, c=:c) p [a,b,c] end bar(1) bar(1,2) bar(1,2,3)
>>693 だからRuby1.8ではできなかったし1.9でも導入揉めたんだよ
(おそらくはメソッド定義のとこだけ見て)できないのは不自然だとか言った人が「慎重に使えば大丈夫」とか言ってだな
p (/a/../a/) # => /a/../a/ p (/a/../z/) # => bad value for range (ArgumentError) 正規表現の範囲オブジェクトって作れるの?作れないの?
698 :
デフォルトの名無しさん :2012/06/25(月) 20:22:51.68
ソース上は、開始値と終了値が<=>で比較できなければアウトという 判定になってるな。 /a/ <=> /a/ は 0(等しい) が /a/ <=> /z/ は 比較できず、nilが返るのでそこでエラー
それ本気で言ってる? リファレンスのclass Range読んだの?
701 :
デフォルトの名無しさん :2012/06/25(月) 23:01:53.21
>>699 id_cmp = rb_intern("<=>") の意味分かる?
Range も関係ないような foo(a, b) と foo(a..b) を勘違いしてる?
なるほど <=> で大小を較できるものはRangeオブジェクトに出来るのか class Bar def <=>(other) 0 end end p(Bar.new .. Bar.new) # #<Bar:0xf6b748>..#<Bar:0xf6b730> class Foo;end p(Foo.new .. Foo.new) # bad value for range (ArgumentError) /a/ <=> /a/ だと 0 が返ってくるのでRangeオブジェクトになりえるけど /a/ <=> /z/ だとnilがかえってきて、比較不能なのでエラーになると しかし、なぜRegexp に<=>メソッドがあるのだろうか?
704 :
644 :2012/06/27(水) 02:09:52.44
先日「Emacsから M-x rubydbを実行してもステップ実行できない」と申し上げたものですが、 自己解決しました。 Devkitが使用する「rb-readline」が悪さをしていたためです。 git clone git://github.com/oneclick/rubyinstaller.git でDevkitを作るためのスクリプトを落とし、rb-readline関連のレシピや タスクを削除してrubyをビルドしたところ、Emacsからのステップ実行に成功しました。 以上、ご報告まで。
def hanoi(n,i,j,k) if n==0 else hanoi(n-1,i,j,k) p "number#{}:#{i}>#{j}" hanoi(n-1,i,j,k) end end p "hanoi1" hanoi(3,"x","y","z") これはハノイの塔のアルゴリズムですが 回数を出力する方法がわかりません。 number#{}のところに動かした回数を表示するにはどうしたら良いでしょうか?
global は禁止でしょうか
def hanoi(n,x,y,z)
if n==0
else
hanoi(n-1,x,z,y)
p "number#{}:#{x}>#{y}"
hanoi(n-1,z,y,x)
end
end
p "hanoi1"
hanoi(3,"x","y","z")
ハノイの再帰部分xyzが間違ってたので修正。
>>706 できればglobalを使わないで実現できる方法があればそちらを。
class Hanoi(object): def __init__(self, height): self.bars = [range(height, 0, -1), [], []] self.step = 0 def __repr__(self): return 'step -> %d\nBAR1: %s\nBAR2: %s\nBAR3: %s' % ( self.step, self.bars[0], self.bars[1], self.bars[2]) def move(self, n, src, dst, work): ''' move n discs from src to dst using work ''' if n == 1: # move sigle disc directly self.bars[dst].append(self.bars[src].pop()) self.step += 1 print self else: # move above (n - 1) discs to work, and move n th disc to dst self.move(n - 1, src, work, dst) self.move(1, src, dst, work) self.move(n - 1, work, dst, src) if __name__ == '__main__': import sys try: height = int(sys.argv[1]) except (IndexError, TypeError, ValueError), e: height = 3 hanoi = Hanoi(height) print hanoi hanoi.move(height, 0, 1, 2)
いま、自分用のスクリプト処理プログラムを作成しています。 テキストファイルを読み込んで、#{...}部分を展開しながら表示したいのですが、 その方法がわからず、質問にきました。 <test.txt> print "test" #{print "test"} <Rubyプログラム> File::open( 'test.txt', 'r' ) { |f| f.each() { |line| p line } } <結果> "print \"test\"\n" "\#{print \"test\"}\n" f.eacH() { |line|.. のlineはシングルクォート文字列扱いなんだろうと思うのですが (セキュリティを考慮すればそれが正しい動作だと思いますが) これをダブルクォート文字列扱いにする方法はありませんでしょうか? %(str2)では変数名が表示されるだけだし、eval(str2)はエラーになるしで・・・ 正規表現などでピックアップして展開するしかないですかね?
すみませんstr2はlineの間違いです。エラーというのも嘘でした。 × %(str2)では変数名が表示されるだけだし、eval(str2)はエラーになるしで・・・ ○ %(line)では変数名が表示されるだけだし、eval(line)だとnilになるしで・・・ いくつかテスト書きながら投稿したので混ざってしまいました。
引数と返り値で今までに移動した回数受け渡したり、かなぁ def hanoi(n,x,y,z,cnt=0) if n==0 else cnt = hanoi(n-1,x,z,y,cnt) cnt += 1 puts "number#{cnt}:#{x}>#{y}" cnt = hanoi(n-1,z,y,x,cnt) end cnt end
>>709 ただevalしちゃダメなのは何故か分かるよね?
rubyコード中に#{print "test"}って書いてもエラーになるから当然だけど。
だから""で囲んでevalしなきゃダメ。つまりeval('"' + line.chomp + '"')みたいな
…とかやると今度は逆に1行目が"print "test""になってエラーになるから困るけど
rubyには%記法っちゅー便利なものがあって
%Q{a"b}とか%Q|a"b|とかが"a\"b"と同じ意味になってくれるからこれを使って
p eval("%Q\n#{ line.chomp }\n") # 区切り文字として改行文字を利用
713 :
709 :2012/06/27(水) 16:42:26.81
>>712 おおお
なるほど・・・!
シングルクォート文字列を含むダブルクォート文字列を生成してevalで評価すればいい
けどダブルクォートで挟むと重複した時エラーになるのでひと工夫ふた工夫、ということですね?
パズルみたいだ・・・ありがとうございました!
テキストにRubyコード埋めこみたいのならerbなんかが使えるよ 調べてみるといいかも $ cat test.erb Time.now <%= Time.now %> $ erb test.erb Time.now 2012-06-27 16:44:05 +0900
715 :
709 :2012/06/27(水) 17:12:50.60
ERBは知りませんでした。HTML埋め込み時のPHPみたいな感じですね。 これもチェックしてみます。ありがとうございます。 組み込み(?)だけでも結構スクリプト向けの機能があるんですね。
最近勉強を始めたものです。 rubyを実行するときに、 ruby test.rb だとうまく実行されるんですが、 直接$ test.rbをで実行しようとすると values: command not found puts: command not found などのエラーが出てきます。 パスは通してるし、ファイル内の#!/usr/bin/rubyの記述も間違ってないようなんですが、どうしてもエラーが出てきます。 どうすればうまく$ test.rbで実行できますでしょうか。
>ファイル内の#!/usr/bin/rubyの記述も間違ってないようなんですが 間違ってます 以上
$ cat a.rb # -*- coding: utf-8 -*- #!/usr/bin/ruby puts "hello!" $ ruby ./a.rb hello! $ ./a.rb ./a.rb: line 3: puts: command not found よっしゃ完全再現 どうせ「おまじない」とか言われてたんだろ おまじないなどというものは初心者プログラミングの世界にはない(慎重な表現) shebangはシェルが解釈するもので、書くときはかならずファイルの1行目に書く Rubyなど向けのファイルエンコーディングは2行目に書いてあってもきちんと解釈されるので、これは2行目に書いてよい #!/usr/bin/ruby # -*- coding: utf-8 -*- puts "hello!"
719 :
716 :2012/06/27(水) 22:31:04.98
>>717 ,718
ファイルを削除して記述しなおしたら実行できました。
shebangについては、「おまじない」としてでなくどういうものかを読んでいたのですが必ず1行目に書くのは知りませんでした。
細かなところもあやふやなまま進めないようにしたいと思います。
早いレスと指摘ありがとうございます。
>「おまじない」としてでなくどういうものかを読んでいたのですが必ず1行目に書くのは知りませんでした それ動作の理屈知らんってことでふつうにおまじないや
Ruby歴2ヶ月の俺にそのおまじないの意味を教えてくれ vimから!ruby %かirb、Rails,apache+passenger環境でしか動かしたことないんだ
前から気になってたんだけど #coding:utf-8 で動くのになんで # -*- coding: utf-8 -*- は -*- とかはいってんの? オシャレのつもりなの?
723 :
デフォルトの名無しさん :2012/06/28(木) 00:43:48.75
>>722 Emacsがコメント内のモード指定とかを認識する時に -*- -*- を使う、はず。
>>721 UnixやLinux系のシェルにテキストファイルを実行させようとする場合
その一行目の内容が #! で始まる文字列ならば
#!に続く文字列を、それを開く実行ファイルのフルパスとみなす
Windowsだと関係ないけどな、あれは関連付けでやるから
>>722 -*- -*- は Emacs 用(で、Emacs の ruby-mode で保存すると自動挿入)
「絶対誰も他の用途で使用してなくて目立って意味がありげな文字列」を選んだ結果こんなのになってる
マジックコメントの実際的な元ネタ(というか、まとめ)の PEP0263 にも載ってる由緒正しい書式
ttp://www.python.org/dev/peps/pep-0263/ Emacs はこの行を「実行」するので他にもいろいろ書ける
# -*- mode: ruby; coding: utf-8 -*-
print "HELLO"
↑の2行だけ(shebangなし)を「a.txt」で保存して Emacs で開いてモードラインを見てみよう、ruby の部分を perl にしてみたりすると perl-mode になるぞ
あんまり変なこと書くとエラーになって手処理を聞かれるので注意
使い物にならんのに薦めるな
みなさんはRubyをどのようなことに活用されてますか?自動化or効率化させてる作業とかあれば教えてください。
728 :
727 :2012/06/28(木) 21:20:02.48
自分はポイントサイトの自動巡回に利用しています。
729 :
デフォルトの名無しさん :2012/06/28(木) 21:27:36.77
エロ画像?を結合するのに使っています。
DxRubyでゲームみたいなものを作って1人遊びしてます
732 :
727 :2012/06/29(金) 00:00:22.22
>>729 いいすね。自分もやってみます。
>>730 結合するといっぺんに観られて良いってことですか?
>>731 面白そうですね。挑戦してみます。
Excelに出力した文字を「折り返して全体を表示」の設定にしたいのですがどう書けばよいでしょうか? 例えば列の幅を設定するときは ss.Columns("A").ColumnWidth = 20 ですがこのような感じで書けますか?
>>733 Excelは触らなくなって久しいから適当な事ぬかすと
マクロを記録してVBAのソースを見たらいいんじゃねえかな
あーググったら .WrapText = True とか出てきた
>>734 WrapTextでうまくいかないと思ってたら自分が書き方間違えてましたw
736 :
729 :2012/06/29(金) 21:21:07.53
>>732 ……冗談で言ったんだが済まんかった orz
watirとかでWebアプリの自動テストしたり、雑事の自動化とかに使っている。
737 :
732 :2012/06/29(金) 22:59:42.96
ふぅ。。。
>>736 えっ?
watir丁度勉強し始めたところでした。mechanizeではうまくいかないのをwatir利用しようと思ってます。
738 :
デフォルトの名無しさん :2012/06/30(土) 03:15:41.88
配列aに要素がいくらか入っているとき、 a = [59,11,90,25,81,9,4,95,2,44,19] これを n個ずつサブグループ化する、Rubyらしい方法はありますか? もし n = 3 なら b = [[59,11,90],[25,81,9],[4,95,2],[44,19]] Cでやるような、forのインデックスで地道に切っていく方法は考えたのですが… for i in [0 .. (a.size/n) ] b << a[n*i .. n*(i+1)] end
>>738 a.each_slice(3).to_a
#=> [[59, 11, 90], [25, 81, 9], [4, 95, 2], [44, 19]]
というかプログラム板では質問だからってスレを上げる必要はないよ あれは非sageだとIDがあって専用ブラウザを使ってない人が多くて なおかつ板の住人なら誰でも答えられる(板の"新着"にさえなればいい)質問が多い雑談板の流儀 IDがなくて専用ブラウザ率が特大でスレごとに話題が特化されているム板ではほとんど意味がない
741 :
uy :2012/06/30(土) 12:42:06.92
>>737 watirって凄いなこれ
今まで直接IECOM触ってたわ
ウゼェ
どうみても普通の親切心なのに嫌われる
>>741 が可哀想だ
名前欄を消し忘れてるだけでダメだろ。
745 :
uy :2012/06/30(土) 21:50:13.31
俺も気をつけなきゃw
746 :
デフォルトの名無しさん :2012/07/01(日) 01:25:00.36
途中投稿失礼、クラッシックな、[0-9A-Za-z_]へマッチする\wを使いたいのです。 perl時代のRegexpルールを沢山抱えておりまして…
>>746 wはwordの略で、単語にマッチするメタ文字です。
> 多バイト文字に対応した正規表現では、日本語のいわゆる全角文字にもマッ チします。
「あいうえお」は全角文字ですよね。
>>749 なるほど、旧ドキュメントのこっちの記述が正しいのですね。ありがとうございます
> 多バイト文字に対応した正規表現では、日本語のいわゆる全角文字(ひらがな・カタカナ・漢字・全角記号)にもマッチします。
752 :
デフォルトの名無しさん :2012/07/01(日) 11:09:10.80
俺が報告したことのあるるりまのチケットはすぐ対応されたから、 古くなればなるほど放置されたままになる可能性は高いな。 チケットをageするには何かレス付ければいいの?
というより、1.9では多バイト文字対応と 国際化対応したのは有名な話だから、 正規表現が全角に引っかかりそうなくらい わかっとけよキリッ、ってことじゃないんですか。 でも¥wがまともに使えないのは半分バグすね。
あら、、バグチケットみたら1.8のときから? 失礼。あらら。。
まぁ、余計な事でハマりたくくなければ /n フラグを忘れるな、という バッドノウハウになるんでしょうけど
非ASCIIやマルチキャラクタ環境における正規表現がどう動作する「べき」かっていうのはぶっちゃけ誰も触りたくない領域 Latin-Xでどう動作させるかの時点でひたすらめんどくさい
あっちのヨーロッパ言語圏の人って自国語の検知とかどうやってるんだろうね 「単語」でアクセントつき文字の並びがヒットしたりすんの?
% ruby -e 'p "Läther".encoding' #<Encoding:UTF-8> % ruby -e "p 'Läther'.scan(/\w+/)" ["L", "ther"] % ruby -e "p 'Läther'.scan(/[[:word:]]+/)" ["Läther"] なんでこうなるんだろう。\wと[[:word:]]は同じでよさそうなものだけど
760 :
デフォルトの名無しさん :2012/07/01(日) 17:50:35.84
どうもです。記録はこのあたり?
ChangeLog:
> Sun Aug 16 00:30:33 2009 NARUSE, Yui <naruse@ruby-lang.org>
> ...
> * regparse.c: \d, \s and \w are now non Unicode class.
> [ruby-dev:39026]
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39026 > \d が一般化された意義は理解しますが、[0-9] と同等でなくなった事は、いい
> 事ばかりでもないように感じます。以前と同じ意味を表現したいが為にほとん
> どすべての \d を [0-9] に置き換えるのは大変です。可読性、保守性の面でも
> 望ましくないと思います。
>>758 まあヨーロッパ系の言語はスペース区切りの単語配列みたいなもんだからなw
日本語とはちょっと苦労度は違うだろうね
char[] str = "hoge"; //OK char[] str; str = "hoge"; //NG ひとつの記号に複数の意味を与えないでください
なにを言っているの?
char *str = "hoge"; //OK char *str; str = "hoge"; //OK!!
初期化と代入ですね
配列のポインタのことを言ってるのか
ただの誤爆だろ
ruby-1.9.3-p0 :007 > a = ?1 => "1" ruby-1.9.3-p0 :008 > a = ?11 SyntaxError: (irb):8: syntax error, unexpected '?' a = ?11 この構文はなんですか? 1文字の数字を文字列化する? 詳しいページがあればお願いします。
>>770 昔は文字コード返してたような
そのままになっちゃってんじゃね
'1'ってことか 誰得なんだこれ
774 :
デフォルトの名無しさん :2012/07/03(火) 21:15:20.68
1.8だとゴルファーが ?d で100が手に入るので愛用してたけど、 1.9だと取りあえず1.8の記法がエラーにならない程度の意味しか ない気がする。
775 :
デフォルトの名無しさん :2012/07/04(水) 20:47:05.43
エクセルシートからデータを読み取ってCSVに転記するというツールをRubyで作ろうとしています。 ちなみに前はVBAで作ってましたが、Rubyの方が柔軟性がありそうなのでRubyにしました。 イメージとしては、住所録とか顧客リストといったシートからデータを読み込んでいく感じです。 ここで、シートAとシートA'、シートB、シートCがあって、シートAとA'での違いは とある列の並びが違うだけであり、他の部分は全て共通です。 つまり、 var1 = app.Cells(i, 1).Value //シートAとA'共通 var2 = app.Cells(i, 2).Value // シートA var2 = app.Cells(i, 3).Value // シートA' var3 = app.Cells(i, 4).Value //シートAとA'共通 といった感じで、特定の値だけ読み取る列がずれているだけです。 で、これをどんな風に書くのがベストなのかと迷っています。 この部分をブロックに入れて ({var2 = app.Cells(i, *).Value})、yieldで実行させるべきか、 それとも def var2read() var2 = app.Cells(i, *).Value end みたいにこの部分だけをメソッドにして、オーバーライドさせるべきか。 それとも、普通にif文とかcase文で作るべきか・・・・。 今回はシートAとシートA'だけでなく、転記処理がぜんぜん違うシートB, Cとあるので、 その辺りも踏まえて、何か上手い方法はないかと悩んでいます。
>>775 継承を使った差分記述ではいかが?
class SheetA # シートAとA'との共通
attr_reader :var1, :var3
def initialize
@var1 = app.Cells(i, 1).Value
@var3 = app.Cells(i, 4).Value
end
end
class SheetA1 < SheetA # シートA固有
attr_reader :var2
def initialize
super
@var2 = app.Cells(i, 2).Value
end
end
class SheetA2 < SheetA # シートA'固有
attr_reader :var2
def initialize
super
@var2 = app.Cells(i, 3).Value
end
end
もしシートA/A'/B/Cで共通処理があれば抽象クラスSheetを設けて、
そのサブクラスとしてSheetA/SheetB/SheetCを定義する
ていうかExcelにはVBAという立派な操作・記述言語があるんだから素直にそっち使え RubyでExcel操作するくらいしか用途が思いつかないならRubyなんてやめちまえ
# s : 開始行番号 # e : 終了行番号 # cols : データを取り出す列 def make_table(sheet,s,e,*cols) table = [] (s..e).each do |row| table << (line = []) cols.each do |col| line << sheet.Cells(row,col).Value end end table end
779 :
776 :2012/07/04(水) 22:04:50.03
メソッドinitializeの定義を自己訂正する(3ヶ所とも同じ)
X: def initialize
O: def initialize(app)
>>777 >ていうかExcelにはVBAという立派な操作・記述言語があるんだから素直にそっち使え
せいぜい数十stepくらいならVBAでもいいけど、それを超えた規模のコードになると
Rubyプログラミングに慣れた人ならVBAはまどろっこしくなると思うよ
極論を言えば、WindowsにはWSHがあるんだからRubyは一切必要無し...になる訳で
>RubyでExcel操作するくらいしか用途が思いつかないならRubyなんてやめちまえ
Windows上でのRubyプログラミング入門として(=最初の一歩として)、
OLEによるExcel操作はとても良い題材だと思うよ
自分の抱える日常的な作業を自動化/効率化するのに活用するのが、Rubyの主用途だから
>>776 >>779 ありがとうございました。
是非とも参考にして取り入れてみたいと思います。
>>778 ありがとうございました。
それも是非参考にします。
>>777 以前はVBAでやっていたのですが、クラス継承などがなく、全体的にRubyのほうが機能が多かったんです。
また個人的にもRubyには別件で触れたのですが、言語仕様がすごく気に入りましたので
可能であれば他のプロジェクトで使いたいと思いました。
>>775 いくつものコードを記述するよりは、シート毎にそれぞれの値の参照先を定義した表を作って、
それに基づいてデータを引っ張ってくるコードを一つだけ書く方がいいと思うけどな
シート名 値1列名 値2列名 値3列名 ...
SheetA A B D
SheetA' A C D
SheetB C V AN
SheetC AA AB AZ
こうしとけば列名(列番号)を弄るだけでプログラムがわからない人でもメンテできるよね
開始・終了位置の定義(検出)とかCSV書き出しとか、下手にコード書くよりExcelの関数や
機能を使った方が簡単だったり速かったりもするのだけど、Ruby関係ないのでこの辺で
>>782 ありがとうございます。
VBAで書く場合はそれも検討したいと思いますが、ただその場合、
コードは1つだけで済みますか?
Rubyは関係ないので、もちろんご回答は気が向いたときでお願いします。
VBAでも一つのコードで十分対応できる、というより言語は割とどうでも良くて、 多機能のでかいアプリ(ライブラリ)をどんだけ使いこなせるかという話なので それでもRubyを使う意義があるとすれば、正規表現や入り組んだデータ構造 を気楽に扱いたいとか、外部とデータをやりとりするといった場合じゃないかな
RubyやらPerlやらでExcel操作するのを書くと、コマンドプロンプトから簡単に実行できるところが楽。 VBSで書けば出来るじゃん。って?まぁまぁそれは…
>>775 使う範囲のすべての列をCSV中間ファイルに出してから、
Rubyプログラムで必要な項目を読むんではダメ?
俺もUsedRange.Valueで根こそぎ取り込んでから処理してる セル1個ずつアクセスしてたら遅すぎてやってられなかったわ 列のずれはお好みの方法で
>>786 ありがとうございます
中間CSVというのは、シートもしくは外部ブックを作るという意味ですか?
>>787 ありがとうございます。
メモリ内に全て読み込んでから処理するという意味でしょうか?
あえてRubyでやる意味は薄い・・・かもしれませんが、
Rubyでも遜色なくできるのであれば、今後のためにもRubyでもやりたいです。
Rackのセッションクッキーについて教えてください。
セキュリティ上、ワンタイムのページトークンを発行し、
input hiddenのトークン値や
セッションクッキーをブラウザから送信させ、
サーバではあらかじめ記録した
["セッションID" => "ページトークン"]
でこちらが発行したページかどうかを照合したいです。
rackのセッションクッキーの実装について
http://takumakei.blogspot.jp/2009/06/sinatrasession.html こちらのソースコードは読めます。
でも私そもそものところがわかっていません。
rack、もしくはサーバからのセッションIDの取り出し方です。
rackでは、sesshon[:hoge] = "aiueo"
とハッシュの出し入れをすればクッキーがセットされるようですが、
そのセッションの値を取り出せないと
["セッションID" => "ページトークン"]が実現できない気がしまして。
それとも、"aiueo"があるかnilかどうかで判別できる仕組みが成立するのでしょうか
長いですがよろしくおねがいします
>>790 session[:hoge] = "aiueo"で設定、session[:hoge]で取得できるみたい
use Rack::Session::Cookie, :key => 'rack.session', :path => '/', :secret => 'changeme'
app = proc do |env|
session = env["rack.session"]
if env["REQUEST_PATH"] == "/get" #
http://localhost:3000/get session[:hoge] = "aiueo"
[200, {"Content-Type" => "text/plain"}, "session[:hoge] = 'aiueo'"]
else
[200, {"Content-Type" => "text/plain"}, "session[:hoge] = #{session[:hoge]}"]
end
end
run app
131 名前:uy ◆pdu1UZmweE [sage] 投稿日:2012/07/05(木) 19:43:52.94 お前らは何かに熱中してるか? おそらく何も熱中してないだろう 俺は女子小学生のパンチラにハマっている お前らも熱中するものを持つと人生が豊かになるぞ
サザエさんとか昔のドラえもんがおすすめかな
>>792 レスありがとうございます
それだとaiueoしか、
出てこないですよね。
値がaiueoとはいっている、
つまりnilではないことで
ログイン状態を確認するだけなら
いいとおもいますが、session id
そのものにはアクセスできませんよね。
最初の要望実現するには、
Rack::RequestとかRack::Abstract::ID
継承してごにょごにょするしか
なさそうですね…。うう
Mechanize#get対象に、metaタグのrefresh先URLの途中に改行があり、follow_meta_refreshしても正しいURLに移動できません。このようなケースで対処法があれば教えてください。
改行取り除いてからparse
URIとしては改行含まれないよね
HTMLの属性値として書かれてるときはブラウザ側で除去されるべきだっただろうか
>>796 結論から言うとMechanizeのバグだ
すくなくとも、何らかの改行(をパーセントエンコードしたもの)が含まれるURL文字列がMeta#hrefで取得できないといけない
今は改行のとこでぶっちんと切られてる(MetaRefresh::CONTENT_REGEXPが悪い)
いろいろ考えたんだけど、どれも修正箇所が山のよーにあって眩暈がした
どのページに移動metaがあるのかわかっているなら、follow_meta_refreshをオフにした上で、metaのあるページの
agent.page.meta_refresh[0].node['content'].scan(/URL=(.+)/mi).flatten[0]
が移動先URLなので、これから誤動作しない程度に空白と改行を除去してgetに渡して自力移動するのがいちばん簡単だと思う
799 :
796 :2012/07/07(土) 15:27:38.13
>>798 ありがとうございます!教えていただいた自力移動でばっちしでした。
>>795 自前でセッションIDを"aiueo"のとこにセットするわけじゃないのか。ごめん
Rackが使ってるセッションIDはenv["rack.session.options"][:id]で取れるみたいだけど
ユーザがこれを使うのが適切かどうかは正直わからない
801 :
デフォルトの名無しさん :2012/07/08(日) 01:34:14.97
PHPのmysql_fetch_arrayに相当する関数は、 rubyに存在しますか?
Rubyってラベル付きbreakできへんの?
>>802 breakに引数的なものを渡しても戻り値として扱っちゃうからなあ
catch~throw文か例外処理が似てるといえば似てる
俺はraiseは例外処理専門にして throwはラベル付きbreakや大域脱出gotoの代替に使うことが多いな
Dir.globが SJISの{や[が含まれる文字に誤反応するバグはなくなったと思ってたら (たぶんWindows限定の)コマンドラインのワイルドカード展開にバグが残ってた >ruby.exe ファイル名を引数に取る自作スクリプト.rb *ダンボール戦機*ts とやったらファイル名のワイルドカードが展開されなかった 「ボ」 0x83 0x7B({) 「ー」 0x81 0x5B([) >ruby.exe ファイル名を引数に取る自作スクリプト.rb *ダン*ル戦機*ts で動かしたけど >ruby.exe -e "p Dir.glob('*ダンボール戦機*ts')" だと、ちゃんと展開されますよ 試したバージョン ruby 1.9.3p194 (2012-04-20 revision 35410) [i386-mingw32] ruby 2.0.0dev (2012-05-22 trunk 35758) [i386-mingw32]
ところで ワイルドカードの正式な仕様ってあるんですか {} はどこに書いても機能するけど []はディレクトリ名部分では機能しないみたいで ドライブを分けてるのを一括で列挙しようとして Dir.glob('[EFGHI]:/mov/ts/*.ts') だとダメで Dir.glob('{E,F,G,H,I}:/mov/ts/*.ts') だと動きました どうも[]はファイル名部分じゃないと効かないような感じなんですが そもそも本来のUNIXのシェルではどういう展開ルールなんでしょうか Rubyとシェルのそれが違っててもいいのですが できれば、ちゃんと仕様を明文化しておいて欲しいですねぇ
そもそも[]はワイルドカードではない
>>808 まあ、それはそうなんですけどね
調べてみたら
{} はブレース展開
[] ? * はパス名展開
って言うんでしょうか
ワイルドカード と呼べるのは ? と * だけなのかな
Windowsしか使ってないので
{} や [] の展開はRuby内でしか使ったことないです
>>809 WindowsXPなんで
c:/windows/winnt.bmp c:/windows/winnt256.bmp
というファイルがあるのですが
>ruby -e "puts ARGV" c:/windows/winnt{256,}.bmp
c:/windows/winnt256.bmp
c:/windows/winnt.bmp
>ruby -e "puts ARGV" c:/windows/[wxyz]innt{256,}.bmp
c:/windows/winnt256.bmp
c:/windows/winnt.bmp
と、コマンドライン引数のパスがDir.globのように展開されます
ただのmsvcrt.dllのワイルドカード展開ではありません
で、[]なんですが
>ruby -e "p Dir['c:/{w,x,y}indows/winnt*.bmp']"
["c:/windows/winnt.bmp", "c:/windows/winnt256.bmp"]
は通りますが
>ruby -e "p Dir['c:/[wxy]indows/winnt*.bmp']"
[]
はマッチしません
[~]はファイル名部分じゃないと使えないような感じです
そこんとこ、どうなってるのかなと
812 :
790 :2012/07/08(日) 17:34:36.34
>>800 レスありがとうございます。一応自己解決しました。
Rackミドルウェアのうち、
Rack::Session::Poolのみ、generate_sidなるものが
パブリックメソッドでありました
http://rack.rubyforge.org/doc/Rack/Session/Pool.html 継承してみてなんとかSession IDを表示できました。
なんちゃってrubyDSLって嫌い;;
# hoge.rb
require 'rack/session/pool'
class Hoge
def call(env)
req = Rack::Request.new(env)
Rack::Response.new.finish do |res|
res.write "Hello, Rack"
res.write env[:test] if env[:test]
end
end
end
class Hage < Rack::Session::Pool
def initialize(app)
super
end
def call(env)
env[:test] = generate_sid
super
end
end
# config.ru
require './hoge.rb'
use Hage
run Hoge.new
macrubyもこっちのスレでいいんでしょうか? scriptingbridgeをバリバリつかってる人いますか?
>ruby -ve "p Dir['c:/[wxy]indows/winnt*.bmp']" ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32] ["c:/WINDOWS/winnt.bmp", "c:/WINDOWS/winnt256.bmp"] 1.8.7では ディレクトリ部分でも[~]が展開されるようです やはり 1.9.3の挙動はバグのようですね 1.8.7ではコマンドラインをDir.globのようには展開せず (たぶん)Cラインタイムがワイルドカードを展開するだけですが
「露骨に数字が下がるんです」ついにフジテレビの“K-POP離れ”が始まった!?
いよいよ日本での韓流ブーム終焉の日が近づいている。親韓流、親K―POPの急先鋒とみられているフジテレビ内部からも「まったく視聴率が取れない……」と弱気な声が漏れており、撤収のムードが漂い始めているという。
昨年、高岡蒼佑がTwitterで行ったフジテレビの韓流ゴリ押し批判をキッカケに、韓流・K-POPに嫌悪感を示す層が、インターネット上を中心に形成された。
その流れは根強く、先月には兵庫県でKARAや超新星らが出演するイベントが、チケットの売り上げ不振を理由に中止に追い込まれたほど。
それでもテレビでは「K-POPブーム」と称して相変わらずプッシュしていたが、もはや不人気は隠せない段階に入った。
ついには、フジテレビ内からもK-POPの不人気ぶりを嘆く声が漏れている。
「今K-POPアイドルを番組に出すと、露骨に数字(視聴率)が下がるようになってしまいました。
まだKARAや少女時代などの下がり幅はマシな部類ですが、あまり名前の知られていないグループだと、本当にひどい。
さすがにスタッフは頭を抱えていますよ。これまでのように、K-POPや韓流ブームと騒いでいられなくなる日は近いでしょう」(フジテレビ関係者)
この関係者が話すように、露骨なK-POP推し自粛は番組編成にも表れている。
例えば、7月9日に2時間特番として放送予定の『夏が来た!!HEY!HEY!HEY!お台場“生”の歌祭り』。
昨年ならば有名無名問わず、複数のK-POPグループがブッキングされるというケースが多かったが、今回韓国アーティストで出演を事前告知されているのは東方神起だけ。
8月8日の『FNSうたの夏まつり』にも、今のところK-POPアーティストの名前はない。
民放キー局関係者は「すでに『ミュージックステーション』を持つテレビ朝日も、K-POPと距離を置くことを決めたといいます。
必要以上にK-POPアーティストを出さないということですよ。数字が取れない上に、ネットであらぬ批判を受けてしまいますから、仕方ないですね」と耳打ちする。
今年も日本でのヒットを目指して多くの韓流アイドルがやって来ているが、現実はあまりにも厳しいと言わざるを得ないだろう。
http://www.cyzo.com/2012/07/post_10950.html http://engawa.2ch.net/test/read.cgi/poverty/1341880283/
ゲームのマップの配置変更をするために 配列とfor文と添え字を使って書いてるんですが、 大きい数字からfor文を回すにはどういう方法があるでしょうか? 今は for i in 0..5 j = 5 - i # jを使って処理 end としてるんですが、もっときれいな書き方はありますか?
131 名前:uy ◆pdu1UZmweE [sage] 投稿日:2012/07/05(木) 19:43:52.94 お前らは何かに熱中してるか? おそらく何も熱中してないだろう 俺は女子小学生のパンチラにハマっている お前らも熱中するものを持つと人生が豊かになるぞ
Rubyでforは使うな
というか、forを使って説明しているところなんていまどきないはずなんだが、そんなものどこで覚えたのやら arr = ["A", "B", "C", "D", "E", "F", "G", "H"] # 配列を逆順で枚挙、ゲームの「盤目」では全体をeachで回すのはあんまり使う場面がないかも arr.reverse_each do |e| puts e end # こればっかりは仕方ないので添字を増減 (3..6).reverse_each do |i| puts arr[i] end 6.downto(3) do |i| puts arr[i] end # 直書きでぐりぐり [6,5,4,3].each do |i| puts arr[i] end
>>819 6.downto(3)
という表現があるんですね。
ありがとうございます、これを使うことします。
6.downto(3) とかオブジェクト指向の観点から考えると気持ち悪い
まあ、だから流行らないんだとは思うが、順番つきの列挙済みオブジェクトを端的に作る方法がないんだよな 今回の場合Rangeリテラルをto_aしてreverseするしかないというのは、整数にupto/downtoと終端とブロックを渡すのと同レベルでモヤモヤする
ruby 使ってる時点で負け
ていうか、ほとんどのアルゴリズムは reverse_eachとか必要なくて別の場所であれこれやって、eachでいけるようにさせるだろ 逆にすると可読性が下がる 物凄くおかしなもの書いているならdownto使ってもいいけど 普通のソースコードでdowntoが必要になってるなら どこかで何かが逆になってるからdowntoが必要になってんだよ
気安いんだよ雑魚が
普通に9..1とか出来ねーの?つかえねーなruby
出来るようにする意味が無いからな
部分配列処理ならsliceも array = [ 1,2,3,4,5 ] array.slice(1,3).reverse.each() { |a| p a } だが元のコードのほうが速そうだ ↓sliceの時点でエラーにしてほしい × array.slice(4,-3).each() { |a| p a } # Nilになってeachの時点でエラー × array.slice(3..1).each() { |a| p a } # 空配列になって処理なし、エラーも出ない
>>827 リテラルで書けたら楽だとは思うが、すくなくともそれはRangeの役目ではない
とか言ってるうちにupto/downto/stepが単独でEnumerator返すようになった
irb> p 0.step(10,2).map{|x| x*3}
[0, 6, 12, 18, 24, 30]
each_with_indexのカウンタを0以外から開始する事ってできませんか? [3,4,5,6].each_with_index do |a,b| p b end で、1~4を出力するようなことがしたいです
添え字が 0 以外から始まる言語は好きじゃない
>>831 irb> [3,4,5,6].each.with_index(1){|x,i| puts "#{i}個目は#{x}"}
1個目は3
2個目は4
3個目は5
4個目は6
しまった i じゃなくて n にでもするべきだった まあいいか
デスクトップがオレオレ仕様になってて他人がろくに触れないような環境にしてる奴が作ったんだろう的融通の効かなさ、ダサさがrubyからプンプンする
>>834 引数に渡すことができたんですね
ありがとうございます
>>837 違う
これはEnumerable#with_indexという別物だ
each_with_index自体にはこんな機能はない
なんだRubyの欠陥か
each_with_indexとeach.with_indexとかどこのあほうがこんな紛らわしい設計したんだよ
>>840 Ruby使ってない方はスレへのご参加を御遠慮ください
自演乙
別に紛らわしくないだろ each.with_indexはeachオブジェクトのwith_indexメソッド each_with_indexはeachオブジェクトのメソッドではなくeach_with_indexというメソッド オブジェクト志向理解してこい
x オブジェクト志向理解してこい o 眼科逝って来い
eachオブジェクト
>>833 コンピュータ界ではC言語の呪いが如何に強力だったのかが分かるなぁ
xpathとかで添字が1からでフォカヌポる
>>847 0から始まってる方が数学的に都合が良いことって多くね?
妹「配列の1番目の要素にアクセスしたいのに0を指定しきゃいけない言語って…」
俺も妹をPerokuしたい
数字が1から始まるのって、いちいち頭の中で+1しなければならないから気持ち悪い Excelの桁とか列とか
for文が「初期化、比較式、増分」の形式なら0オリジンが好き for文が「変数名、初期値、最終値(、増分)」の形式なら1オリジンが好き
0始まりの奴を1始まりとして使う時は、サイズに注意するくらいで済むことが多いけど、 逆はどうしても面倒じゃね?
>>852 +1とするんじゃなくて、要素数=最終添字と考えるのが1オリジンだと思う
もし妹が
>>850 みたいな事を言ったら
一番目じゃねえゼロ番目だバカヤロウ!
と言って殴るわ妹なんて居ないけど
857 :
デフォルトの名無しさん :2012/07/15(日) 23:40:58.77
macでRuby始めたいです これ使ったらオススメとか、このやり方から覚えた方がいい! などあれば教えて下さい!
特にありません。
859 :
デフォルトの名無しさん :2012/07/16(月) 00:38:19.49
>>857 とりあえず初心者は
.methods.sort でメソッド表示して、すべてのメソッドの動作を覚えるべき
>>857 irbかなとりあえず
履歴・メモリー機能付き関数電卓としてどうぞ
863 :
デフォルトの名無しさん :2012/07/16(月) 13:02:47.37
>>860 分からなくても、とりあえず見てみます
>>861 リファレンスマニュアルにあったのでirbをとりあえずやってみますね
ありがと
>>862 ネットで探して一番良さそうだったcot editorです
皆さんありがとう
やりたいことが特にないならRubyなんて覚える必要ないです Rubyのことなんてすっぱり忘れて、必要になったらまたそのときいらっしゃい
865 :
デフォルトの名無しさん :2012/07/16(月) 13:38:58.17
uyはどうして馬鹿なのですか?
QZにかまうからです
QZはどうしてばかのですか?
uyにかまうからです
870 :
デフォルトの名無しさん :2012/07/16(月) 18:25:39.90
変数aがnilでない時のみ、変数xに代入したい これは x = a if a と書くしかないですかね?もっとスマートな書き方は無いでしょうか。 ちなみに、 x = a || x これはaがnilでも代入操作自体は行われてしまうので駄目です。
QZとuyはお互いにかまう馬鹿ということおk?
>>870 知らん。
ってかいうか、変数にnilが入るようなプログラムを書く人は嫌いです。
>>870 どーせ自分で答えドヤ顔で用意してんだからとっとと言えば?
874 :
790 :2012/07/16(月) 21:15:17.22
>>857 macports (mac osxのパッケージインスコ&&バージョン管理システム)
rvm(rubyのパッケージインスコ&&バージョン管理システム)
これを入れて、Ruby ver.1.9.3で
勉強はじめたほうがいいです。
ruby1.8だと記法が違いすぎます。
テキストエディタのこだわりがないなら、
GNU Emacs for MACOSX
http://emacsformacosx.com/ つかえばいいとおもいます。
Ruby用のシンタックスハイライト設定無しで
使えますので、便利です。
おっと、名前はいったままだった
rbenvの方がモダーンかと思ってたけど、実際どうなんすかね? rvmつこたことないけども
877 :
デフォルトの名無しさん :2012/07/16(月) 22:48:39.83
>>874 ありがとうございます。
色々つまづいてますが、頑張って覚えます!
878 :
uy :2012/07/17(火) 00:03:35.44
class Object
def sine n
replace n if n
end
end
n = "aaa"
x = nil
n.sine x
p n
x = "bbb"
n.sine x
p n
# =
>>870 しね
ねえねえ、Ruby1.8.xがopenSSL1.0でインストールできない(ossl_ssl.oが作れない)のって直った? まだ?
$ openssl version
OpenSSL 1.0.1 14 Mar 2012
$ LANG=C rbenv install 1.8.6-p420
Downloading
http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p420.tar.gz... Installing ruby-1.8.6-p420...
BUILD FAILED
だめぽいすな
ossl_ssl.c:103:1: error: 'SSLv2_method' undeclared here (not in a function)
ossl_ssl.c:104:1: error: 'SSLv2_server_method' undeclared here (not in a function)
ossl_ssl.c:105:1: error: 'SSLv2_client_method' undeclared here (not in a function)
ossl_ssl.c:444:19: error: 'STACK' undeclared (first use in this function)
ossl_ssl.c:444:25: error: expected expression before ')' token
ossl_ssl.c:444:24: error: invalid operands to binary * (have 'struct <anonymous> *' and 'struct <anonymous> *')
ossl_ssl.c:447:47: error: expected expression before ')' token
ossl_ssl.c:447:46: error: invalid operands to binary * (have 'struct <anonymous> *' and 'struct <anonymous> *')
ossl_ssl.c:447:47: error: too few arguments to function 'sk_value'
make[1]: *** [ossl_ssl.o] Error 1
make: *** [all] Error 1
881 :
デフォルトの名無しさん :2012/07/17(火) 09:37:13.71
そこで1.8.6かよw 1.8.7は最後のリリース出たんだっけ?
882 :
デフォルトの名無しさん :2012/07/18(水) 13:57:58.80
RailsインストールしてPCに入ってるのも確認したんだけれど、 それ以降コマンドプロンプトでバージョンの確認すらできなくなった…… 泣きそうだれか助けて
883 :
デフォルトの名無しさん :2012/07/18(水) 13:58:51.67
RailsインストールしてPCに入ってるのも確認したんだけれど、 それ以降コマンドプロンプトでバージョンの確認すらできなくなった…… 泣きそうだれか助けて
久しぶり過ぎて連投したごめん……
許します
単に環境変数の問題なんじゃない
些細なことも答えてくれてありがとうございます>< FORTRANのコンパイラを入れたときに環境変数の設定が変わったのが原因だったみたいです
シェルスクリプトとRubyスクリプトの使い分けが良く解りません><;
Rubyのチュートリアルを探しているんだけど紹介してもらえますか? バージョンは1.9.3です。
どうせアフィカスがマッチポンプ自演するだけだから答えない
893 :
uy :2012/07/19(木) 14:36:43.37
公式サイトに初心者向けのページを用意してはどうだろう
>>890 あれは結構有名
サイト名と言語や技術だけ変えて同じとこが30個くらいサイト運営してるんだよね
コピペだらけで質も悪いので、根本からどうにかしたいところではある
896 :
889 :2012/07/19(木) 21:41:04.74
質が悪いと言っても素人の知ったかブログよりはマシじゃね?
>>896 ほとんどの人がレス自体を表示してないから、どんなに間違っていても誰にも見えず誰も訂正しない
なにが書いてあったのかはわからないが、そもそも誰も内容を吟味しないから、その話を聞くのはやめたほうがよい
>>897 だから素人の知ったかブログなんだよ!
ネットから無秩序にコピペして集めてきただけだもの!
>>899 うーん、何所のことが分からない。
できれば名指ししてくれると有りがたい。
それかそこにたどり着く方法でも良いです。
Rubyとかの言語名やAjaxとかの技術名プラス「入門」「初心者」あたりで検索しまくると共通点が見つかるという話は以前聞いた 今もそうなってるのかどうかはわからん
あれは cppdrive.jp webword.jp rubylife.jp pythonweb.jp phpbook.jp perlplus.jp officepro.jp adminweb.jp ajaxtower.jp がぜんぶ同じとこだという話だったはず まあ、それ以上でもそれ以下でもない
"ネットから無秩序にコピペして集めてきただけ"には見えないけどな… ま、コピペで著作権を侵害してるなら話は別ですが。
>>902 アフィサイトモデルとして成功してんだか割に合わないんだかすっごい微妙なとこだな
サイト名と言語や技術だけ変えて同じとこが30個くらいサイト運営してるんだよね コピペだらけで質も悪いので、根本からどうにかしたいところではある
906 :
uy :2012/07/21(土) 03:12:31.97
rubyって趣味とかそういうの以外だと Rails使ったWebサービス作り以外ではどんな場所で使われているんですか?
Rails用プラグイン開発
>>908 Rails以外のWebプログラミング
自分用のコマンドラインアプリや、日常の作業を便利にするためのスクリプト
ゲーム制作(RPGツクール用のスクリプト用含む)
GUIアプリ(稀)
>>910 円弧書く前に中心点をmove_toするだけでした
すみません
ド素人の質問です 「その1 あいうえお その2 12345 その3 abc…そのn ○○○」 のように書いてあるテキストを綺麗にまとめるプログラムを書きたいです 理想の出力結果は その1 あいうえお その2 12345 その3 abc : そのn ○○○ のようにすることなのですが「その●」の部分で詰まってます ・表示させる文字そのものに1ずつ足していく方法 ・数字がいくつまであるか分からないけれど全部終わったらオシマイ 以上のところを教えて下さい
なにその宿題丸投げ そんなんだとマイナーで授業に一切出てない書き方での回答が来るぞ 正規表現と、Stringクラスのsplitメソッドとscanメソッドの使い方を勉強すればなんとかなるかも 分割キーにしたい正規表現で大元の長い文字列を切って配列にすればいい
>>915 ありがとうございます
自分の利便のためにexcelに書き込むプログラムを書きはじめたのですがまあ自分への宿題ですw
セルへの書き込みなどは勉強したのですが肝心のテキストの部分でハテナです
タグに囲まれている部分だけを抜き出す,とかなら分かるのですが…
Excelにはテキストファイルを自動で分割してセルに入れる機能がある それ使え
すみません
>>915 には簡潔に書いたのですが元のテキストの「その1」と「その2」の間は
単語ではなく長い文章だったり箇条書きだったりカンマ使ってたりめちゃくちゃなのですorz
「そのn」を表示→「そのn」と「そのn+1」の間を表示(正規表現?)→「そのn+1」を表示
を繰り返すのって可能ですか?
そして「そのn+1」が存在しなくなったら終了にしたいんです
とりあえず出し惜しみしないで、実際にその文章を見せてくれ。改行とかも含めて。 そんな後出し後出しで質問されて付き合うほど暇じゃないでしょ皆
920 :
uy :2012/07/22(日) 21:09:20.39
" その1 あいうえお その2 12345 その3 abc その55 ssss ".split(/その\d{0,999}(.*?)/m).each do | a | p a end ででででっていう
921 :
uy :2012/07/22(日) 21:18:27.79
b="
その1
あいうえお
その2
12345
その3
abc
その55
ssss
s
fs
s
".each_line.inject([""]) do | s , a |
if a =~ /その\d/
s << ""
next s
end
s.last << a
s
end
p b
>>920 でっていう
その1 その2へ進む その2 その3へ進む その3 その1に戻る その4 おわり
923 :
uy :2012/07/22(日) 21:31:52.83
>>922 で?って思った
b="
その1
その2へ進む
その2
その3へ進む
その3
その1に戻る
その4
おわり
".each_line.inject([""]) do | s , a |
if a =~ /その#{s.size}$/
s << ""
next s
end
s.last << a
s
end
p b
924 :
uy :2012/07/22(日) 21:47:04.32
n = 1 "その1 その2へ進む その2 その3へ進む その3 その1に戻る その4 おわり ".each_line.chunk do | a | if a =~ /その#{n}$/ n += 1 next :key end :value end .map do | k , v | v end.each_slice(2) do | a , b | puts "---" puts a p b end # -終了-
コミュ障なの?
926 :
デフォルトの名無しさん :2012/07/23(月) 18:16:39.65
超初心者で申し訳ない。 これ ↓ コンパイルできないんだけど、なんで? def sing(word = "la", num) for i in 1..num do print word end puts "~" end sing("hu", 10) 初歩の初歩で脱落しそうだ
927 :
デフォルトの名無しさん :2012/07/23(月) 18:27:55.28
>>926 ruby 1.8だね。
デフォルト引数値は後から順にしか指定できない。
sing(num, word="la") という定義ならOK
1.9だともっと柔軟に指定できるようになってる。
wordを省略するときは sing( , 10) って書きたいな
930 :
uy :2012/07/23(月) 20:37:26.41
で?って思った a , b = sing , 10
>>926 なんでもいいけどRubyでforは使うな
それを君に教えたのはどこのどいつだ
使いたいもんを使えばいいんだよ
動けばなんでもいい、は学習段階では致命的な誤り その言語で現在一般的な書き方を最初に憶えることは非常に重要 def sing(word = 'la', n=10) n.times do print word end puts '~' end sing('hu', 10)
934 :
uy :2012/07/23(月) 22:21:16.40
こういう奴って 俺の「初心者あやmれ」 と同レベルの書き込み
jrubyはお門違い? 今jruby1.7のpreviewを使ってみたんだが、なんか遅いね。 これ本当に早くなってんの? 一発目は大抵遅いから同じコマンド2回打ったけど、やっぱ遅い。 javaも1.7.05使ってるんだけど…centos6 gem -vとかやっても4秒かかる。
936 :
デフォルトの名無しさん :2012/07/23(月) 23:56:28.68
Javaプログラムは時間動かし続けないとJITの効かせどころが わからないから、速くなっていかないんでわ?
>>936 そういうものなんですかね?
とりあえず、もう少し使い続けてみます。
java -version 早い
jruby -v 遅い。情報が表示された後に1秒くらい終わらない。
gem -v 遅い。表示に4秒かかる。
それはjrubyの使い方が間違っている jrubyは起動させっぱなしで使う
Javaアプリケーション全般に言えることだな Eclipseが遅いとかいうのももうアホかと…
通常のコマンドラインとかから起動させてスクリプト読み込んで実行して終了するようなプログラムをJRubyでやってはいけない、遅いから コンピュータの電源入れてOSが立ち上がってアプリケーションロゴがくるくる回ってウィンドウが出切って使える状態になるとこまでを含めて計測して 「遅い!」 とか文句言われてもけっこう困る しかもちょこっと操作しただけですぐウィンドウ閉じてコンピュータの終了を指示して電源が落ちるまでも時間に含めてる そんなん、遅いの当たり前じゃないか その、実際にちょこっと操作したときのレスポンスの具合を見てよ
遅い!
客が何を望んでいるか見抜けるようになりましょう
朝鮮猿っていつまで経っても、結局日本の後追い猿真似しか出来ない寄生虫民族なんだよね
属国の歴史しか無くて、ずっと独自文化がゼロなのはなぜなのか本当に良く判るわw
< #`Д´> <うぎゃああああ!!フランス人までネトウヨの嫌韓厨だったニダーーー!!!ネトウヨ!ネトウヨ!ネトウヨ!!
■フランスメディア「KPOPに独自性は感じられない」「日本や米国の模倣」「商業主義」「つまらない」
パリで韓流コンサート「日本文化から韓国を知った」
2011/06/14(火) 09:45
一方、コンサートが終了した現在、当日の模様について報道しているフランスのメディアは
比較的少ない。この状況下、コンサートの模様を報じているのは、フランスのニュースサイト「Rue89」だ。
中でも目立つのが、K-POPは特に独自性が感じられないという意見だ。これまでフランスでファン層を
増やしてきたJ-POP、ひいては米国のポップスを踏襲しており、商業主義的な音作りだという意見や、
演奏がコンピューター管理されているためか野性味に欠けるといった意見が寄せられている。
http://news.searchina.ne.jp/disp.cgi?y=2011&d=0614&f=national_0614_016.shtml
jrubyだとbundlerまわりでイライラする
945 :
デフォルトの名無しさん :2012/07/24(火) 18:20:26.30
>>930 おっと 926 です。
みんなの貴重な意見がめっちゃありがたい。
なるほど。forは使わんようにするぞ。
MRIだとWindowsまわりでイライラする
File と Pathname って名前が悪いと思いませんか? Pathname は組み込みにしてしまって File と改名し、 File の方は FileIO あたりに改名した方が良いかと思いますがいかがでしょうか? mruby とか知らんけど。
君がFile.openしか使ってないのはよくわかった
>>947 君がJavaかぶれということがよく分かった
全部書き直したわけじゃないだろう。普通に考えて。
あるサービスを別の言語に分けて複数の別アプリとしてデプロイして稼働させるのが なぜ普通なんだ?
分けたんでなく、置き換えたい部分だけ置き換えたらそうなるでそ
Railsではよくあること というかRailsでなくても、 例えばMySQLも別アプリだけど普通だろ? SQL文投げてあっあっあっってしてるだろ? そういうこと
例えがヘタ
リファレンスマニュアルの「リテラル」に、 > 式展開中の式は、ダブルクォートなども含めて Ruby の式をそのまま書くことが > できます。コメントも許されます。 > > p "#{ "string" # comment }" # => "string" と書かれているんですが、実際に実行すると、 irb(main):001:0> p "#{ "string" # comment }" # => "string" SyntaxError: compile error (irb):1: syntax error, unexpected $end, expecting '}' from (irb):1 と SyntaxError になってしまいます。 irb のバグかとも思ったんですが、スクリプトファイル書いて実行してもエラーでした。 ドキュメントの方が間違いでしょうか?
>>957 あ、それはマニュアルが古いな
「式展開の中でも外でも同一のルールが適用されます」が正解
# は行末までがコメントだから、式展開内で現われても「とにかく行末まで」が無視される
だから
p "#{ "string" # comment
}"
は(「# comment\n」が無視されて) "string" という文字列を表示する
p "**#{<<EOS}**"
string
EOS
は「次の行からEOSまで」を表示する
Railsで自社サービス開発してる会社に転職したが糞コードばかりで1日で憂鬱になった。 javascriptをviewに直書きしてたり、 画像をDBに保存してたり、 DBの設計が糞過ぎて1つのテーブルに100個近いカラムがあったり CSSがカオスでasset pipeline機能すら使ってなかったり どうしようもなく糞ゴミカス低学歴PGしかいないゴミ会社に転職してしまった
まぁどれも致命的ではないな。 見た瞬間、 ____ / \ 。 。 。 / _ w _\_________ 。 。 。 / _____| | ヘ____ヘ_|____ ___ /⌒| ((_____.| | Σ ________(○)__(○) バキッ!! / |. ι (___人__) | | '' , ' ' , | 。 | l\ | .| | | | 。 ヽ -一ー_~、⌒) |r┬-| | |. | 。 。 。 ヽ ____,ノ `ー'´ 。 。 。 となるレベルを体験した俺から言わせればな。
962 :
uy :2012/07/28(土) 19:30:08.08
実際社畜コードで効率化しすぎても 「じゃあこんなに社員PGいらないな」ってなるだけ まじめに社畜コードかいてるのなんて新人だけ 古参は首をきられないようにもっと別の場所で戦ってるんだよ その冗長したソースコードにも意味がある
クズコード書いて他人のアカウントでコミットする鬼畜が居ないだけマシだろW
繰り返しの書き方を教えて下さい テキストファイルの中を検索して(←ここまではわかる) あるテキストに一致する部分があれば実行、一致するものがなければスキップして次へ という部分で手こずってます while文だと思うのですが、正規表現をどう組み込んで良いのかよくわかりません お願いします
まだやってるのか
>>964 > テキストファイルの中を検索して(←ここまではわかる)
思ってるのはたぶん使い方違います
> while文だと思うのですが
それもたぶん違います
「実行」などという、どこで仕込まれたんだか知らないけど奇妙な概念を捨ててください
テキストファイルに対してやりたいことを
最後まで
書きなさい
そうすればたぶん誰かが教えてくれます
open('unko.txt').read.scan(/hae/) とかすれば取れるだろ
とりあえず、whileは違うとだけいっておく 一行ずつ読むなら each_line いまどこまで書けてるのかソース貼るといいかも
>>967 while line = gets
puts line
end
初心者が初心者に教える、いいねぇいいねぇ
>>968 それは標準入力から1行ずつ読み込んで行単位で処理するとき「のみ」のかなり限定された書き方だ
通常は使わないし、それが書いてあったら何らかの特殊な用途のスクリプトだと警戒する
>>969 普通に使いまくりだし、警戒って何を警戒するのよw
あ、もしかしてパイプとかフィルタとか普段使わない人?
だとしたら有り得るかも。
乳首いじるみたいにマウスばっかりカチカチしてるんでしょ。
えっちな香具師め。
ワロタw
おらプログラムは黙って標準入力から呼んで標準出力に書けって教わっただよ
いいんだよ、いいんだよ 一番不幸なのは間違いを教えてもらえないこと 漏れはまちがってたら教えてあげるし 俺が間違ってたら誰かがおしえてくれる そのかわりボランティアだ だから対価として煽り、すかっとさせてもらうゼ!
乳首の悪口はやめろ...!
「行単位」の意味が読めないと辛いな
夏だなぁ・・・
>>975 >>964 が詰まってる理由もそこだろうなあとは思うんだが
2012年現在、行指向でテキストファイルを「すこしずつ」読むメリットは薄い
標準入力から全文をreadしてメモリに読み込んだほうが学習上も便利だろう
つ バファリン
どうせ複数行を跨いでマッチできないとかカウントできないとかそんなんだろ
>>968 みたいなの使ってるならそれは捨てろ
そろそろ質問者でてこいよ
HTMLとXMLが広まって以降、行指向スクリプトはすっごく書きにくくなって、使いどころが減った メモリばっか食いやがって
DOS時代じゃあるまいし、いまどき
>>968 みたいにCPU時間を犠牲にしてまで省メモリするのはちょっと
よっぽどなサーバ用途ならまだしも
ふつうの人はぜんぶ一気にメモリに読み込んでscanなりreadlinesなりeach_lineなりが妥当
top -bを全部読みしてハマったのはいい思い出
そうはいってもwhile gets とかやってるサンプルは未だに見かける
読み込むテキストが巨大でメモリに全部乗らないとかなら 話は変わってくるけど、ただそのオーダーのテキストをさばくのは Rubyでは厳しいケースも多いだろう
Rubyベストプラクティスによると そういう場合はIO.foreachを使ってループ処理することで パフォーマンスと扱いやすさの両方を確保できる。らしい
>>984 言いたくはないけどPerlとの関係でいろいろある
しかもwhileのgetsだとRubyのルールや文法をほとんど使わない
たとえば
text = File.open('foo.txt', 'rb'){|f| f.read}
に詰め込まれている「"新しく"覚えなければならない特別なルール・記法」は山ほどある
(ARGFからreadしてもいいんだけど、まあ、それでもそんな変わらない)
これが
while line = gets
...
end
と
cat foo.txt | ruby a.rb
の組合せになると激減する
ひょっとするとRubyを一度も使ったことがなくても他言語の知識で使えるかもしれない
そんなわけで、Rubyを本当は使いたくない人のサンプルとか、Rubyを本当はよく知らない人のサンプルとかにはよく出る
あと新スレ
ARGFならまだしもファイル名指定は芋すぎる
例示のそんなところに拘ってどうする openに渡すfilepathを一旦変数にしたらガードのために数十行くらい条件判定分岐処理がつけられて、 それがないのはカスだとも言えるが、そういうとこは別に本質ではあるまい
仙人レベルになるとあえて while line = gets ... end を使ったりするんだよ。
while gets だって覚えることは多いんだがなあ
993 :
964 :2012/07/29(日) 16:13:36.45
質問しといて夏バテで死んでましたすみません やりたいことはWEBサイトからテキストを取ってくることです ruby1.8でメカナイズ使ってます FacebookやTwitterによくある「もっと読む」みたいなテキストをクリックしていきたいのです 文字列を検索してクリックする、というところはできてます ただ、「もっと読む」をどんどんクリックしていって全部を表示し終えると、 最終的に「もっと読む」って表示されなくなるじゃないですか そこまで行ったら、次の処理(テキスト全体から必要な部分を取ってくること)に移りたいのです CとMATLABをちょっといじったことのある初心者です。おねがいします。
>>993 そもそもテキストファイルって書いてる時点で間違っていたことに気づきました
ほんとすみませんです。
>文字列を検索してクリックする、というところはできてます これが意味不明。実装できてるところまでのソースを晒してみ。 一般的には非同期のページングと同じ考え方で実装するけど 何か全然違う方法でやってるみたいだからソース見ないと意味分からない。
agent = Mechanize.new
page = agent.get('
http://aaa.com/ ')
agent.page.link_with(:text => 'もっと読む'.toutf8).click
こんなかんじです
で、これを「もっと読む」が出てくる限り繰り返したいのです。
998 :
uy :2012/07/29(日) 22:48:12.85
ume
test
,,.. -──-- 、.,_ ,. '"::::::::::::::::::::::::::::::::::::`ヽ. ,.':::::::::::::::::;::::::::::::::::::::::::::::::::::ヽ. /__二ニ=-ハ::::::i:::__i_::::::、::::::::::::', /:::/::::::ハ::::::! !::::ハ::__!_::::::::';:::::::::::i i::::i:::::/!:,!ニ、! L:! ',.‐;.、ヽ!::::i:::::::::::| |::::!:::ハ i' i'`! ト r! ' !__」::::::i:::| └-iヽ::! ゞ' , `''´,,, |::::!::::::::|:::| はたらきたくないでござる .|::::7" r─、 .レi::::::::::|:::| レ'iゝ、 ヽ.__」 ,イ:::|::::::i::::|::::| !::::!::i:>ー-r i;:-!::::|::::::|::::|::::| |::::|::::::rイ´!__/ |::::ト.、::|::::|::::| |::::|>'´}><{.、 |::::|/ヽ:::|::::| !ヘ|ヽ、/_」L_ゝ `ヽレ' ';:|:::::| !/ !/ oio i ';::::::| / r/'⌒i !. ヽ::::! / ,-rイ、___,ノ._ ハ \! !/ | l ,ィ'l |o _,.!', `'r、 |. | l'´::::l |<{_____,.イ'" ヽ::', //、! ゝ、ヽヽ-'ハ_____,,.ハ__,.イヽ;\ //っ ) !::7'ー´:::!:::::::::::::!::::::::::::::::ヽ;:`Y´「T´ |:/:::::/:::::!::::::::::::::!::::::::::::::::::::ヽ;:!::::!::|
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。