1 :
uy :
2011/05/21(土) 19:21:37.98 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
前スレ Part 42
http://hibari.2ch.net/test/read.cgi/tech/1303353905/1 ★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
>>前スレ992 >require_relativeって嫌われてるの? 1.9.1以前で動かないから嫌われてるだろうと推測
>>1 乙。ところで推奨はまだ1.8.7でいくのか?
Part42
>>956 ,957
957さんのコードだと、やはりダブルコロンで読み込まれない
場合もあるようで、うまくいきませんでした。
なので、956さんを参考にバイナリモードで読み込んで
957さんの変換をすることで回避することができました。
なんか色々勉強になりました。
>>1 >わけわかな質問にもエスパー発揮で。
日本語でおk
>>1 乙、と言いたいところだが立てるときくらいコテ外しなよ。
別にスレ建てようぜ ここを使う理由もない
黙ってNGに突っ込んどけや そんなどうでもいい理由で重複とかRubyアンチが増えるだけ
重複で別スレ立てたいなら勝手に立ててろ いちいち別スレ立てようとかこっちはうぜえんだよ
rubyに PHPでいうprint_rやvar_dumpに相当するメソッドってありますか?
またか 当たり前だがそっくりそのまま相当するものはない オブジェクトについて情報を出力したければ p そのとき出力されるものを文字列として得たいなら inspect 少なくともクラス設計者が変なinspectを作っていない限りはpで中身もクラスもわかる。 リテラルがあるものはクラス表示してくれないが、スクリプト上のリテラルと同じ形式なので、 標準的なクラスは全部わかるようになっている。
13 :
11 :2011/05/22(日) 11:27:29.93
知らないなら書きこまないでください あなたよく説明ばかり長くて的はずれなことばっかり言うと陰口たたかれませんか? 引き続き募集します
var_dumpとprint_rの区分けはないが p でおk
print_r var_dump NGワードっと
なにこの流れ
前スレでその質問した本人ですけど11とは別人ですよ 立ったスレが気に食わなくて荒らしてるんだと思うのでスルーが一番かと
webだとRuby on railsがよく上げられるけどもっと良いフレームワークだってあるんだよ このフレームワークはPHPでいうとCakePHPという知名度が高いっていう位置付けがあるから使っている人が居るけど 探すとRubyでももっと良いMVCフレームワークあるんだよ
だから何なんだよ
あるなら書けばいんじゃね
>>20 活動時間帯は他のスレ見れば一発なので、今回は逆だと思うなあ
どっちかっていうと、せっかくスレを立てたのにみんなが自分を褒めてくれないということで暴れているように見える これを言ってしまったあとだと模倣犯が出るので参考にならんが
それはなんだか切ないな ただコテつけて非技術的な内容で馴れ合いしたいのなら ム板以外でやってほしいもんだ
今の2chで名前欄に何か書く人は本物騙り含めてもれなく基地外さんなので(これは確定事項)、
そういう人の思考形態を推測することはもれなく基地外さんへの道まっしぐらなので、
正直どう思ってるかなんてのは恐ろしいこと以外のなにものでもないわけで
>>26 正直、マ板があるじゃんとは、思わなくもない
受け入れられない場所で暴れ続けるその心中をお察しすることは、残念ながらできないんだけど
すいません、自分11ですが
>>13 は書いてないです
>>12 さんありがとうございました
>>27 アクの強い文体もコテつけるのと大差ないんじゃw
技術的なレスなら個人的には別に問題ないかなと
1.upto(3){|x| puts x } という式の戻り値が1なのはなぜですか? 最後の式が戻り値らしいので3が返ってくると思いました。
>>30 整数1のインスタンスメソッド(で、selfが返ると定義されてる)なので、selfである整数1が返ります
ブロックの見かけならなんでもかんでも最後に評価された値が返ると決まってるわけではない
これは Integer#upto というメソッドで、それの定義による
>>30 ついでに補足しておくと、それで最後のブロックの最後の評価値が戻るとすると、
戻り値は nil になるはずだよ。 puts の戻り値は引数に何与えてもnil
なるほど!納得です。ありがとうございます。 一応、 ri Integer.upto で調べたら ----------------------------------------------------------- Integer#upto int.upto(limit) {|i| block } => int ------------------------------------------------------------------------ Iterates _block_, passing in integer values from _int_ up to and including _limit_. 5.upto(10) { |i| print i, " " } _produces:_ 5 6 7 8 9 10 と出て、selfが返されることまでは書かれていませんでした。 が、オンラインマニュアルには upto(max) {|n| ... } self から max まで 1 ずつ増やしながら繰り返します。 self > max であれば何もしません。 self を返します。 downto, step, times も参照。 と、しっかりselfが返されることが書いてありました。
>>33 > int.upto(limit) {|i| block } => int
レシーバと返り値が一緒だからint ... => intと表記している
もし別の整数を返すのであれば例えばceilのように
num.ceil -> integerと表記する
あ、ri 使ってる人いるんだ gem インストールでも --no-ri --no-rdoc がデフォになりつつあるのに
ri はうまく使えば強力なツールになり得たのに(既に過去形)
37 :
デフォルトの名無しさん :2011/05/22(日) 19:03:14.65
ある大規模電子回路の動作内容をお客さんに説明しなくてはなりません。 頑張ってパワーポイントで資料作成していましたが、パワーポイントの アニメーションではインタラクティブでないため、いまいちわかりずらく なってしまいます。Rubyは初心者レベルながらなんとか使えますので、 Rubyで作った回路のクラスをどうにかして図解できないでしょうか?
だからなぜRubyにGUIをもとめるんだよ 静的に図にするだけなら画像なりHTMLなりで吐けばいいだろうけど クリックすると動いて〜とかは難しい道のりだ
>>37 パワーポイントより遥かに大変
Rubyはライブラリやドキュメントが貧弱すぎてGUI向いてない
40 :
デフォルトの名無しさん :2011/05/22(日) 19:28:30.06
素早い回答有難うございます。 やはりRubyにGUIを求めるのは無理ですか。。SystemCとかのシステム記述言語 を使うべきかも知れないですね。dxrubyはかなりいいところまで行ってるんですが、 画面デザイン(回路のブロック図)を直接描くのが大変そうで二の足を踏んでしまうんです。
41 :
デフォルトの名無しさん :2011/05/22(日) 20:07:15.62
Ruby昨日から初めました RDE(rubyの開発エディタ)があることがわかり日本語など設定しました。 日本語があるスクリプトを実行すると 出力画面にinvalid multibyte char (US-ASCII)が出てしまいます。 コマンドプロンプトでRuby -Ks スクリプト名だとうまくいくのですが、 RDEだと-Ksが設定できなくてエラーが起きてしまうようです なにか良い方法ありませんか>?
>>41 使ってるrubyのバージョンとエディタ(?)の名前+バージョンは?
>>41 RDEはRuby上級者向けなので手を出してはいけない
ruby1.9.2 180と秀丸8.10です
>>41 ,44
ruby 1.9.2はRuby初心者にはお薦めできない(
>>1 を参照)
少なくとも
invalid multibyte char (US-ASCII)
の意味を理解できない人向けのバージョンではない
今すぐアンインストールしてruby 1.8.7を入れ直すんだ
>>41 >>44 そもそも-Kオプション自体が1.9系列で使うものじゃない。1.8系列との互換性のために残されてるだけ。
1.9系列ではソースファイルのエンコーディングは
# coding: 文字コード
というマジックコメントというものをファイルの先頭に書いて指定する。
いわゆるShift-JISで書いてるなら、スクリプトの最初に
# coding: CP932
と書いておけばいい。
>>45 対応できると言うか、マルチバイト文字をソースに含めるならマジックコメントは必須
-Kオプションはあくまで互換性のためにおいてあるだけ
UTF-8しか使わないんですけどそれでもRuby1.9.2はダメなんですか?
>>50 別に1.9.2がだめってことはぜんぜんないよ。
ただWeb上で集めた情報が1.8仕様だったとしてもめげずに自分で1.9用に書き直す能力が要るだけ。
むしろいろんな文字コードを併用するときには1.9系列の方がいい。
エンコーディングの変換も楽だし、ソースファイルごとにエンコーディング指定できるし。
52 :
41です :2011/05/23(月) 00:17:59.67
>>42 rubyバージョン1.9.2 RDEバージョン1.1.1.1です
>>43 上級者向けなんですか。。けどいちいちcmdで実行しないところが僕が
使いたい理由なんです。
Ruby1.8.7にすれば-Ks指定しなくてもSHJISで日本語出力できますか?
53 :
uy :2011/05/23(月) 00:26:10.78
RDEが上級者向け? WHAT?
>>52 できる
Ruby1.9は、慣れても現時点、マルチバイト文字に悩まされ続ける処理系だから
1.9では日本語使えないと思ったほうが良い けど良く考えてみて欲しい、 日本語を表示することが、そんなに重要かね?
54 :
uy :2011/05/23(月) 00:32:03.85
個人的にオススメなのは 日本語表示したいときは1.8でかき、それ以外は1.9で書くという事、 1.8と、1.9だといくつか致命的に仕様が違うから 1.8構文で遺産を築いちゃうと 1.9へ移行するときにソース捨てる事になりかねないし、1.9は1.8よりも部分的には1〜10倍くらい速い 1.9は使ってるうちに、時期にこんなとこで聞かずともマルチバイト文字についてはわかってくるよ Ksの意味も ググレks
>>52 1.9.2でShift-JISの文字列を使いたければスクリプトの先頭に
# coding: CP932
と入れるだけでいいよ。
56 :
41です :2011/05/23(月) 00:43:07.20
解決しました Ruby1.8.7のパスをRDEに指定して実行で日本語化できました。 しかし、rubyのバージョンが2つあるのですが、cmdで実行する際は 1.9.2のほうが適用されて日本語表示エラーが起きてしまうようです。 cmdで1.8.2を適用する際のコマンドなどありますか?
そんなにどうしてもマジックコメントを使いたくないのか それとも頭がおかしいのか
日本語使いたいならむしろ1.9だろ 文字数の取り扱いがバイト単位とかめんどくさくてやってられん
>>56 cmdで1.9.2を使わないなら環境変数Pathの先頭にRuby1.8.7のruby.exeがあるフォルダを追加してやればいい
でもそこまでしなくても、なんども言われてるようにマジックコメントさえつければ1.9.2でも普通に日本語使える
>>56 環境変数PATHから1.9.2のexeの入ってるフォルダを外すか
1.8.2のフォルダを先に持ってくる
または.rb拡張子の関連付けを1.8.2に設定
cmd.exeからの実行形態にあわせてどちらかか両方を
61 :
uy :2011/05/23(月) 12:46:54.54
>>58 え・・・・? 困るよ君 初心者スレッドでも、そういうのは
puts "あいうえおaiueo".split(//s)
>>56 あるけど教えねーよ( 長いから )
俺は、Ruby1.8は、
Rubyのexeの名前のruby187.exeにして使ってる
Rubyの1.9はそのままruby.exeで使ってる
>ruby187 [filename] → 1.8
>ruby [filename] → 1.9
s = "a b 5235349023c" r = Regexp.new(/a.*?b(.+?)c/) puts s.scan(r) 改行やホワイトスペースを無視してscanする方法ってございませんか?
空白文字群が「あってもなくても動作する」ので、その正規表現で実質無視してると思うけど 結果がどうなって欲しいのん? irb> p "a b\n\n\n5235349023c".scan(/a.+?b(.+?)c/m)[0].map{|m| m.gsub(/\s/){''}} ["5235349023"] こう?
64 :
uy :2011/05/23(月) 13:57:44.61
s = "a b 5235349023c" puts s.split splitなめんなよこら
説明不足ですみません
bとcに挟まれた部分(数字とは限りません)が取りたいのですが
s = "a b 5235349023c"
r = Regexp.new(/a.*?b(.+?)c/)
puts s.scan(r)
だと取れますが、
s = "a b
5235349023c"
r = Regexp.new(/a.*?b(.+?)c/)
puts s.scan(r)
みたいに文字列に改行が入っているときは
>>63 先生のパターンmを利用してうまく取ることができました。
■test.txt /a.*?b(.+?)c/m ■コード require 'csv' CSV.foreach('./test.txt') do |row| s = "a b 5235349023c" r = Regexp.new(row) puts s.scan(r) end テキストファイルに1行だけパターンが記入されてます テキストファイルを読み取って、そのパターンを使いたいのですがこれだとエラーで取得できませんでした 9行目をr = Regexp.new(/a.*?b(.+?)c/m)とすると取得できました パターンを外部ファイルに置く方法はございませんか?
正規表現のmオプションを使う 「.」 が改行にもマッチするようになる s = "a b\n\n5235349023c" r = Regexp.new(/a.*?b(.+?)c/m) p s.scan(r) # => [["\n\n5235349023"]]
m はくっついてこないんだよね str = File.open('regexp.txt', 'rb'){|f| f.read} re = Regexp.new(str, Regexp::MULTILINE) CSV.foreach('test.csv') do |row| puts row.scan(re) end でどう
r = Regexp.new(row,Regexp::MULTILINE) または r = /#{row}/m
あ、regexp.txt の中身忘れてた おまけに改行処理とかやってねえ 要は Regexp.new("なんとか", Regexp::MULTILINE) と /なんとか/m は同じ 前者をリテラルで書いたものが後者 Regexp.quote についても調べるといい regexp.txt: a.+?b(.+?)c str = File.open('regexp.txt', 'rb'){|f| f.read}.chomp re = Regexp.new(str, Regexp::MULTILINE) CSV.foreach('test.csv') do |row| puts row.scan(re) end
勉強になりました
>>66 p Regexp.new("/a.*?b(.+?)c/m") #=> /\/a.*?(.+?)c\/m/
"/a.*?b(.+?)c/m"という文字列を Regexp.new でコンパイルしても
/a.*?b(.+?)c/m
というリテラルと同じ結果にはならないんだ。
それをやりたければ、 Regexp.new じゃなくてevalというメソッドを使って
eval("/a.*?b(.+?)c/m")とするか、そうでなければテキストファイルには
a.*?b(.+?)c
とだけ書き込んで
Regexp.new(row, Regexp::MULTILINE)とかすればいい。
それから、1行だけならcsv使う必要ないよね?
r = File.open('./text.txt') {|f| f.read.chomp }
でいいんじゃないの?
r = じゃなくて row = だた
rubyって何でこんなに濃いの?phpとかすぐ荒れるのに
77 :
uy :2011/05/23(月) 14:40:42.42
### test.rb def func /a.*?b(.+?)c/m end ### code require File.dirname(__FILE__)+"/test" s = "a b 5235349023c" puts s.scan func 結局、コードにしないなら、何を取り繕っても最終的にevalでしょ
単純に人気の差じゃね? 人が集まれば変なのが集まる。
79 :
デフォルトの名無しさん :2011/05/23(月) 15:20:18.41
これからRubyはじめてみようと思うんだけど みんな開発環境なにつかってんの? 動作軽いのあったら教えて
>>79 すこしかしこいエディタとすこしかしこいてすとスイーツ()とたーみなるえみゅれーた
もしあなたのかんがえるRubyがRuby on RailsのことならRailsスレにいくといろいろてとりあしとり
日本語で
>>80 autotestと何か通知アプリケーションがあればエディタでも最低限の快適性は確保できるよね
エディタだとそこまで自前で頑張らなければならない(しかも頑張っても最低限な)のでめんどくせえという話でもあるんだが
オールインワン統合環境からは見捨てられてる状態だからどうにもならんな
Win Ruby1.9.2です ファイルの文字コードはUTF-8で保存しました
15行目の print line + "\n"でエラーになってしまいます
ttp://d.hatena.ne.jp/dambiyori/20081227/1230393234を見ながらニコ生でコメントを取得したいのですがエラーで困ってます ファイルの文字コードをShift_JISにして1〜2行目を削除するとエラーはなくなるのですが、コメント部分が文字化けして見えません
どなたかアドバイスお願いします
C:/test.rb:15:in `write': "\xE3" to UTF-8 in conversion from AS
CII-8BIT to UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
require 'socket'
msgsvr = "省略" #メッセージサーバのホスト名
port = 省略 #メッセージサーバのポート番号
thread = 省略 #スレッド番号
s = TCPSocket.open(msgsvr,port)
req = "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0"
s.print req
s.each("\0") do |line|
print line + "\n"
end
86 :
uy :2011/05/23(月) 16:33:33.17
ヒャッハー悲惨な文字コードスレだぜ
>>83 ソケットで読み込んだ文字列がUTF-8ではなくてASCII-8BIT扱いになってるのが問題みたいだから、
line.force_encoding('UTF-8') + "\n"
でいいと思う
Ruby1.8.7なら表示の寸前まで何も考えずにUTF-8固定にできるな
ところで、このスクリプトだとどちらにせよコメントに非Windows-31J文字列が出て来た時点で変換エラーでアウトだから、 cmdでニコニコ動画のコメントを見るのはやめた方がいいみたいだよ。
http://rurema.clear-code.com/1.9.2/method/String/i/encode.htmlを見ながらこのように修正してみましたが # -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
require 'socket'
msgsvr = "msg101.live.nicovideo.jp"
port = 2812
thread = 1092549465
s = TCPSocket.open(msgsvr,port)
req = "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0"
s.print req
s.each("\0") do |line|
line = line.force_encoding('UTF-8')
line = line.encode!(::Encoding::Windows_31J, :undef => :replace)
print line + "\r\n"
end
>>88 が簡単そうに言うのでやってみた
あまり簡単じゃなかったので責任取れ
require 'socket'
require 'kconv'
msgsvr = 'omsg102.live.nicovideo.jp'
port = "2810"
thread = "1092287512"
TCPSocket.open(msgsvr,port) do |s|
s.write("<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0")
s.each("\0") do |line|
puts NKF.nkf('-Wsx --fb-html', line).scan(/>(.+?)</)[0]
end
end
>>91 コメントなんて一部が消えても問題ないだろうしふつうにtosjisでよくね
>>90 force_encodingもencode!も破壊的だから
line =
とかしなくていいと思う
あと、Windowsでも普通に扱う分には改行は\nだけでおk
\nで書いとけば出力時に勝手に\r\nに変換される
>>92 ですよねー
require 'socket'
require 'kconv'
msgsvr, port, thread = 'omsg102.live.nicovideo.jp', '2810', '1092287512'
TCPSocket.open(msgsvr,port) do |s|
s.write("<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0")
s.each("\0"){|line| puts line.tosjis.scan(/>(.+?)</)[0]}
end
どっちもどっちだな。 返ってくる文字列がUTF-8だって知らなきゃいけない分ほんのわずかに1.9が手間かな? 1.9.2 ↓ require 'socket' msgsvr, port, thread = 'omsg102.live.nicovideo.jp', '2810', '1092287512' TCPSocket.open(msgsvr,port) do |s| s.write("<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0") s.each("\0"){|line| puts line.encode('CP932', 'UTF-8', :undef=>:replace).scan(/>(.+?)</)[0]} end
HTTPSのwebページにPOSTをしたいのですが
アドレスに
https://を含めることができないみたいで方法がわかりません http = Net::HTTP.new('localhost')
response = http.post('/~test/test.php', 'ei=UTF-8&p=test')
p response.body
>>96 require 'net/https' してから
Net::HTTPS をお使いください
すいません、こんな感じで出来ました
uri = URI.parse("
https://localhost/~test/test.php ")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::
HTTP::Get.new (uri.request_uri)
response = http.request(request)
p response.body
ミス
uri = URI.parse("
https://localhost/~test/test.php?a=123 ")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::
HTTP::Post.new (uri.request_uri)
request.set_form_data({:a=>"1bcd"})
response = http.request(request)
p response.body
100 :
デフォルトの名無しさん :2011/05/23(月) 18:38:56.36
VERIFY_NONEすんなや。
x = 540 if x > 540 こういう書き方がすごくムズムズする 何かメリットあるんだろうけど 書き方統一して可読性高めてホスィ
if で区切って読むようにするんだすぐ慣れる 個人的には or や and をカッコなしで使う人は死滅して欲しい 自己再代入は、これはもう仕方ない 整数オブジェクト540に x という名前ラベルをぺたっと貼るという行為でしかないわけだし
x = 540 if x > 540 のなにが問題なのかよくわかりません。 ifやunlessの後置修飾嫌いな人?
GETでデータを送信したいのですが
webページにはアクセスできるのですが、どうもデータが送信されません
test.phpはGETデータを返すファイルなので、response.bodyにはabcdが入っているようになってます
アドバイスお願いします
uri = URI.parse("
http://localhost/~test/test.php?a=abcd ")
request = Net::
HTTP::Get.new (uri.path)
response = Net::HTTP.start(uri.host, uri.port) {|http|
http.request(request)
}
p response.body
106 :
uy :2011/05/23(月) 20:12:02.62
101とは違う話だろうけど、個人的な意見をいうと ifにも戻り値が欲しい x = 540 if x > 540 を x = if x > 540 まぁ、これじゃダメだけど、 540を2回書かなきゃいけないってのは言語の甘さ 実装するなら x = ifrhs x > 540 でrhsが帰るようにするとか x = if(x > 540).rhs こうか ans , rhs , lhs = if x > 540 こんな感じのを希望
107 :
uy :2011/05/23(月) 20:17:43.04
あと x ||= 5 これは x が nilだったら 5を代入って意味だけど x = || y これで y が trueだったら代入、 nilだったら代入しないって構文が欲しい これないせいで x = y if y とかやっちゃってる 演算子のオーバーライドは基本的にやりたくない
>>106-107 色んな書き方を取り入れてるRubyならではの悩みではあると思うけど
そこまでいくとちょっと演算子が爆発的に増えそうな悪寒
111 :
uy :2011/05/23(月) 21:36:42.79
>>108 演算子が増えるのは困るな
今の所、lambdaにハッシュを渡して、関数を返す関数を実行したときに変数に入れた値を
返された関数を実行するときに中の変数を書き換えたい時にx = y if y みたいな事やってるだけだから
普段のコーディングで困ってるほどでもない
最近更新したら更新しましたって出るのにレスが増えない現象が多発してる
>>61 いちいち正規表現つかって配列に分割してとかめんどくさいに決まってんだろ
114 :
uy :2011/05/23(月) 21:56:50.23
ねぇ
このスレの住民も、Ruby1.8はマルチバイト扱いにくいって思っているの?
>>113 何つくってんの?
bbsみたいの作るにしても
splir(//s)すんのは、プログラム中、普通は一箇所ですし、
116 :
uy :2011/05/23(月) 22:07:55.13
なんだろ、もし多用するならこういうの作るっていう発想がないんだろか、 class String def uyueach self.split(//s).each do | m | yield m end end end "うゆうゆuyu".uyueach do |m| puts m end
長い文字列をたくさん文字数チェックするようなスクリプトだと split(//s)とかやったら無駄なオブジェクト増えまくりでいやーん
そういう用途のためにString#charsとか#bytes、#linesがあるんだが。 Enumeratorが返ってきて、つまりArray生成しないから効率も悪くない。
119 :
uy :2011/05/23(月) 22:25:26.62
そんなのCでかけよ しらんわ
a.rbからb.rbを読み込んでb.rbのクラス内のメソッドをa.rbから利用したいのですが マニュアルのどのページを読むと良いのでしょうか?
>>120 まず、クラスの中で定義されていない、
ふつーにトップレベルで定義されているメソッドを別ファイルから利用することはできない
思いっきりテクニカルにすれば不可能ではないが、Rubyの制限だと思ってくれていい
素直にクラスかモジュールに属するように作るか、
関数的メソッドを提供したい場合は Kernel のインスタンスメソッドにしてくれ
で、
・ require の引数は .rb を普通は書かない(require 'b.rb' よりは require 'b')
・ require の引数はとりあえずカレントディレクトリに対する相対パスでも動く
・ require FIle.join(File.dirname(__FILE__), 'b.rb') とか書くとまず間違いない
・ 既存の(標準)ライブラリファイルと同じ名前のファイルは作ってはいけない(Ruby1.8限定)
ということで require
>>121 コードは1ミリも試してないが、クッキーの概念がないな
HTTP Cookie におけるセッションに関する勉強がたぶん必要
>>118 charsってブロック変数指定しなかったら中身使いもしない無駄な文字列オブジェクトを
大量生成しないステキ仕様だったりするの?
127 :
uy :2011/05/24(火) 00:20:56.17
string.c 5904行 static VALUE rb_str_each_char(VALUE str) chars気になってchars調べたんだけど、別のことが気になった long n; が、どうみても未初期化で for (i = 0; i < len; i += n) { やってんだけど、C言語で未初期化のローカルlong変数は初期値「1」であるなんて仕様あんの? ぼくC言語しらないからしらないんだけど
128 :
uy :2011/05/24(火) 00:23:40.93
あー、for文の中が先に実行されるから問題ないや バグじゃなかったです
>>125 Rubyの文字列のメモリ消費はぶっちゃけ鬼門なんだよね
最初から最後まで、全員が慎重に設計されたライブラリを慎重に使用して自作メソッドを慎重に設計しない限り、
使用メモリ量は加速度的に増大する
>>129 JavaやPythonなんかと比べてもメモリ消費が激しいの?
ruby1.9ではdup.force_encodingとか書いてあるから目立つだけで、1.8でもメソッドの最初に str = Iconv.conv(to, from, arg)とか書くのは普通だったような むしろdupだとメモリ上の位置は動かないから省資源なんじゃないの? よくわからん
>むしろdupだとメモリ上の位置は動かないから省資源なんじゃないの?
ワシもそう思う博士
ということで、実際にやったほうが実感できそうなので実験
用意するもの、使用メモリ表示するマッスィーン(topとか)、使用メモリ表示に引っかかる程度に大きなファイル
irb で str = File.read(path);nil して arr = [] して str.dup.object_id や arr << str.dup; nil 連打
…メモリ変動なし
1.9.2 の irb にて、str = File.read(path);nil して arr = [] して str.dup.object_id や arr << str.dup; nil 連打
…メモリ表示は特に動かんな、っていうか1.8.7より微妙に動作速くないか気のせいか
dup.force_encoding('ASCII-8BIT') と dup.force_encoding('Shift_JIS') と dup.force_encoding('EUC-JP') を連打
まだ動かない
str.dup.force_encoding('Shift_JIS').valid_encoding?
まだ
str.dup.force_encoding('EUC-JP').valid_encoding?
まだまだ
結論
>>129 Ruby本体の提供するライブラリ的にはFUD
へちょい第三者ライブラリがあるのを否定はしないが
133 :
デフォルトの名無しさん :2011/05/24(火) 10:46:07.29
第二の言語としてRuby勉強しているのですが習得するまでどのくらいかかりそうですか?習得の定義は基本的な事が出来るか出来ないかです
Rubyの基本ってどのへんだろう? クラスとモジュール作って特異メソッドの概念掴んで、日常用途では継承はカスでMix-Inが有効と覚えて、 目的に応じた gem をソースコード見ながら使えるようになるくらいのレベルでいい? 既存言語を知っているなら、寄り道なしで20時間以下くらいな気がする
最初の方で「Rubyではクラスすらオブジェクトでメソッドはインスタンスメソッドのみでselfが違うだけ」 というようなことをきちっと学ぶとその後の学習曲線が綺麗だと思いたい クラスとモジュールとインスタンスメソッドとクラスメソッドとモジュールのメソッドを別個に覚えてしまうと無駄で大変
rubygemsを1.8.3にアップデートしてもいいですか?
たすけてください gem install machanize gem update --system gem update machanize ってしたらmachanizeを利用したスクリプトを起動すると↓みたいなのが出ます これはどのように対処したらよいのでしょうか? NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01. Gem::Specification#default_executable= called from C:/Ruby192/lib/ruby/ gems/1.9.1/specifications/nokogiri-1.4.4.1-x86-mingw32.gemspec:11. NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01. Gem::Specification#default_executable= called from C:/Ruby192/lib/ruby/ gems/1.9.1/specifications/rubygems-update-1.8.3.gemspec:11. 1.8.3
いいのかわかんないんですけどこうやったら出なくなりました C:\Ruby192\lib\ruby\gems\1.9.1\specifications\rubygems-update-1.8.3.gemspec をエディタで開いて11行目のs.default_executable = %q{update_rubygems}をコメントアウト
gem pristine --all で再構築するのが正解
あ、インストールオプションが必要な場合は gem pristine nokogiri -- --with-xml2-include=なんとか とか書いてね
141 :
デフォルトの名無しさん :2011/05/24(火) 13:21:30.81
それrubygems-updateのチェンジログに載ってるんだぜ。
# -*- encoding: utf-8 -*- $stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8) require 'socket' addr = "msg○○○.live.nicovideo.jp" port = "" thread = "" s = TCPSocket.open(addr,port) req = "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0" s.print req s.each("\0") do |line| line.force_encoding('UTF-8') line.encode!(::Encoding::Windows_31J, :undef => :replace) regex = Regexp.new(/<chat.+?date="([0-9]+?)".+?>(.+?)<\/chat>/) line = line.scan(regex)[0] p "time:#{line[0]} msg:#{line[1]}" end このコードではlineには["値1", "値2"]っていう風に入っているのにline[0]、line[1]とやるとエラーになってしまいます 何故なんでしょうか? 別ファイルにて a = ["a", "b"] p a[0] p a[1] と最小コードで試したらちゃんと表示できたのですが原因がわかりません
>>142 scanの使い方が間違っている。
p "abcabc".scan(/(c).+(b)/) #=> ["cab"]
と思ったら全然違った
>>142 エラーメッセージをコピペして書いてください。
それから
>このコードではlineには["値1", "値2"]っていう風に入っている
と言いますが、もしそうなら
line[0], line[1]がエラーになることはありえないので、
p "time:#{line[0]} msg:#{line[1]}" をコメントアウトして代わりに
p line
してみてlineに実際何が入っているか確認してください。
>>142 > このコードではlineには["値1", "値2"]っていう風に入っているのに
入ってないよ
ソケット通信で文字列受け取るところが若干特殊だが、メインは普通の文字列処理に過ぎないので、読み下す
「"\0" で区切られた文字列ごとに、文字エンコーディング名義をUTF-8にし、文字エンコーディングをWindows-31Jに変換し、
<chat...> にマッチする正規表現の結果を line という変数にして、その0要素目と1要素目を表示」
うん、で、「"\0" で区切られた文字列」って具体的にはどんな文字列?
s.each("\0"){|line| p line} で表示してみると、こんなふうになってる(これはニコ生の仕様を読んでもいい)
"<thread resultcode=\"0\" thread=\"1092600265\" last_res=\"11081\" ticket=\"0xd24ab40\" ... \x00"
"<chat thread=\"1092600265\" vpos=\"1797100\" date=\"1306212871\" mail=\"184\" user_id ... \x00"
...
つまり、<chat...> に絶対マッチしない文字列が来ることがある
マッチしないんだから、 String#scan の戻り値は空の配列 [] で、 それの0要素目は nil だ
nil[0] と nil[1] を p で表示しようとしてエラーになっている
> undefined method `[]' for nil:NilClass (NoMethodError)
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8, :undef => :replace)
require 'socket'
addr, port, thread = 'omsg103.live.nicovideo.jp', '2809', '1092600265'
regex = Regexp.new(/<chat.+?date="([0-9]+?)".+?>(.+?)<\/chat>/)
TCPSocket.open(addr,port) do |s|
s.write "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0"
s.each("\0").each do |line|
line.force_encoding(::Encoding::UTF_8)
line.scan(regex){|match| puts "time:#{match[0]} msg:#{match[1]}"}
end
end
>>146 簡単に解決するには
line = line.scan(regex)[0]
の下に
next unless line
each多かった ・ socket を open したら必ず close 「しなければならない」。close し忘れしないよう、普通はブロックを使う ・ リテラル /re/ で書ける限り、Regexp.new は使わない ・ $stdout.set_encoding... は「標準出力表示のときにこれでString#encodeする」のとほぼ同じ。処理被ってるので他のは消したよ ・ String#scan はブロックが使える。マッチした配列か、マッチした要素が渡る。今回の match は配列 # -*- encoding: utf-8 -*- $stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8, :undef => :replace) require 'socket' addr, port, thread = 'omsg103.live.nicovideo.jp', '2809', '1092600265' regex = /<chat.+?date="([0-9]+?)".+?>(.+?)<\/chat>/ TCPSocket.open(addr,port) do |s| s.write "<thread thread=\"#{thread}\" res_from=\"-200\" version=\"20061206\" \>\0" s.each("\0") do |line| line.force_encoding(::Encoding::UTF_8) line.scan(regex){|match| puts "time:#{match[0]} msg:#{match[1]}"} end end
どうでもいいけど、 ソースファイルにマルチバイト文字ないから # -*- encoding: utf-8 -*- とかいらないし、 line.force_encoding('UTF-8') line.encode!(::Encoding::Windows_31J, :undef => :replace) するなら $stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8) とかいらないし、 line.force_encoding('UTF-8') line.encode!(::Encoding::Windows_31J, :undef => :replace) するぐらいなら line.encode!('Windows-31J', 'UTF-8', :undef => :replace) で十分だし、 Regexp.new(/<chat.+?date="([0-9]+?)".+?>(.+?)<\/chat>/) は /<chat.+?date="([0-9]+?)".+?>(.+?)<\/chat>/ と同じ意味で冗長だし
>>147 それだと多分ただのおまじないになってしまうと思ったのでやらなかった
nil が返るというのは、Ruby スクリプトのデバッグにおいては大変大きなシグナル
これを怖がってもらうと、ちょっと困る
>>148 >$stdout.set_encoding... は「標準出力表示のときにこれでString#encodeする」のとほぼ同じ。
str.encode(to, from)は
str.dup.force_encoding(from).encode(to,from)
と同じだけど、
$stdout.set_encoding(to, from)の場合、
str.encode(from).encode(to, from)と同じ処理になるから挙動が全く違うような……。
そもそものアレとして、$stdout.set_encoding はわりと小手先テクニックの部類だよね 世の中ではあんまり使われてないと思うので、できれば他の方法覚えたほうがいいんじゃないかな…
>ソースファイルにマルチバイト文字ないから
># -*- encoding: utf-8 -*-
>とかいらないし、
"プレーンテキスト"にはエンコーディング不要とか信じ込んでる
>>149 はメリケン
以下の条件を満たす関数を作ろうと思っています。 ・引数に文字列を取る ・引数がURLとして正しければtrue、間違えて入ればfalseを返す URLとして正しいかどうかを判定できるライブラリって、rubyにありませんでしょうか。 正規表現で判定するしかないのでしょうか。
>>154 require 'uri' して URI.regexp('http') にマッチするかどうかを試せばいい
HTTP URI でなくてもいいなら単に URI.regexp
URI.parse したほうがいいと思うけど…
>>154 どこまで細かくやりたいか次第だけど
最悪Addressable使えば何とかなるかな
>"プレーンテキスト"にはエンコーディング不要とか信じ込んでる
>>149 はイケメン
に見えた
疲れてるのだろうか
URIの正規表現表示なんて RFC2396 できっちり定義されてるから自分で考える必要は全くないしな。
%r|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|
>>155 の言うとおりライブラリに教えてもらうのが手っ取り早い。
秀丸でRuby書いてます 初心者は秀丸でもいいですか?
・ 着色されている ・ 自動インデントしてくれる ・ 普段の操作感で操作できる の3つが揃っていればなんでもいいです 「Rubyの学習のために〇〇を導入しました〇〇の勉強と並行して進めてます」みたいなことでなければOK 特殊環境はRubyに書き慣れてからおもむろに移行しても充分間に合うから
>>159 初心者は、というか別にいつまでも秀丸でも全然構わんよ。
Rubyスクリプトを書くには使いやすテキストエディタがあればそれで十分。
なにか画期的なIDEがあるわけでもなし。
Radrailsは大した機能もないのに禿重いし、RDEは重くはないが問題多いし。
p "\a"でビープが再生できないのは何故ですか? printとputsではできたのに
>>162 実際に何が出力されてるのかというと
% ruby -e 'p "\a"' | hexdump -C
00000000 22 5c 61 22 0a |"\a".|
% ruby -e 'print "\a"' | hexdump -C
00000000 07 |.|
もしよくわからなかったら16進数とASCIIコードを調べて
s = "あいうえ" ptn = "/い/" r = Regexp.new(ptn) p s.match(r) はヒットしないのに s = "あいうえ" p s.match(/い/) はヒットする理由を教えてください
ptn = "/い/"; r = Regexp.new(ptn) で出来上がる正規表現が 最初にスラッシュ、次に い、最後にスラッシュ、にマッチする正規表現だから Regexp.newに渡す場合は /.../ は不要
p r と p /.い/ の結果を比べてみなさい
Regexp.new とか Regexp.compile に "/pattern/"渡しちゃう人多いねー。 "pattern" 渡さなきゃいけないのに。
>>167 多いというかこのスレに限っては多分同じ人
r = eval(ptn) としましょう、とかネタで答える奴はいないか
正規表現リテラルの // もパターンの一部だと思ってるんじゃね?
171 :
デフォルトの名無しさん :2011/05/24(火) 19:51:23.95
ウソだと思って笑いながら "/ を検索したら、結構ある。
Ruby1.9.2-p180を、VS2010のnmakeでコンパイルしようとしたら、 こんなエラーが出るのでてビルド失敗するんですがどうして? フォルダ\ruby-1.9.2-p180\win32>nmake Microsoft(R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. -I./.. ./../tool/compile_prelude.rb ./../prelude.rb miniprelude.c '-I.' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 NMAKE : fatal error U1077: '-I.' : リターン コード '0x1' Stop.
174 :
173 :2011/05/24(火) 23:07:15.73
自分も最近ハマったくちなのでもう少しだけ補足しておくと gnu関連のツールをインストーラでなくzipから直接展開して使う場合、 C:\gnu みたいなフォルダを作って、そこに bison.exe や sed.exe だけを展開してもダメで、 C:\gnu\bin C:\gnu\share の2つのフォルダを作って、binに bison.exe や sed.exe、その他 dll を入れ、 share 配下には各 zip に含まれる share 配下をそのままコピーしたうえで、 C:\gnu\bin に path 通して使うとよい このあたりの情報がうまく見つからなくて2時間ほど無駄にした
175 :
172 :2011/05/24(火) 23:28:31.16
>>173-174 WindowsでRubyを自分でビルドするのって大変みたいですね
その情報をもとに頑張ってみます
ありがとうございました
rubyの初心者向け勉強会をどなたか都内で開いてください
つ言い出しっぺの法則
初心者の僕が開いても講義はp "hello world"ぐらいしか出来ないのですいません。。。
そして参加者から「p はデバッグ向けだろ。ちね」とか言われるんですね わかります
181 :
デフォルトの名無しさん :2011/05/25(水) 00:15:37.78
curlで該当個所にあるインストーラシェルスクリプトをゲットしてきて bashでそれを実行している。
人に勉強会開いてもらう暇あったらコードのひとつでも書くか読むか汁
>>180 wget URL -O /tmp/rvminstall
bash /tmp/rvminstall
rm /tmp/rvminstall
を、一時ファイルを介さない形で標準出入力を駆使して実行
コピペ1発実行できるよう1行にまとめてしまったので呪文になってる
使用シェルがbashでない場合は動作しないかもしれないが、rvm自体bash必須なのでどうということはない
冗長なくせに低速な言語w ライブラリの豊富さスピード可読性習得コストすべてにおいてpythonに劣る糞言語w
pythonで書いたスクリプトが起動が遅いからRubyに着たんですけどPythonのほうが早いのですか?
>>185 超一般論としては、完成したスクリプトの実行時間はPythonのほうが速い
Pythonでやって遅くて、その遅い理由が不可避であったのなら(アルゴリズムとかデータ処理量とか)、
Rubyで同じことをやってもやっぱり遅いというか、より遅い可能性が大
起動が遅いってのはなんとなく俺も感じる。Python3だからかな
Python は名前とかわいくない蛇のアイコンがダメ
ぼくもPython3です print "a"だけのコードでも起動が遅いのでRubyに来たのですよ
アホな話題だな。 リアルでこんな話されたらミミクソほじほじしてフッって吹きかけるわ。
PHPとPythonの単語を聞くと発狂する人がいるから気をつけてw
RubyスレにPythonとPHPの宣伝しに来る人がそもそも発狂してると思う
xmlの整形がしたいんですがおすすめのライブラリってありませんか?
>>191 そんな人は見たことがない
あなたが演じないとそもそも存在しないのでは
>>193 整形とはそもそもなんぞやという…
Nokogiri::XMLでできなければ、できない要件を添えて報告すると誰かが対案出すかも
サーバから送られてくるCookieを保存したいのですが curlのCOOKIEJARみたいな事をするにはRubyで参考になるサイトございませんか?
Mechanize で agent.cookie_jar を save して load すればだいたい用は済む気がする Mechanize が大仰だというならなんか httpclient かなんかふつうの使うとか 汎用的なクッキーライブラリはあったかなあ
Cookie を URL と関連付ける専用のライブラリというのは見たことがない
あったらあったで便利な気がするけど
>>195 まあレスポンスヘッダ読んで保存して読み込んでリクエストヘッダにセットするだけの簡単なお仕事です
Cookie のしくみを知らないのなら絶対に書けないので、
勉強していただくか Net::HTTP 単体を諦めて
>>196 のクローラ使うかどっちか
ここの住民ってRubyしかできない人が多い? PythonやPerlやPHPもできる人っている?
>>198 Rubyしかできないってのは珍しいと思う
C/C++なんかはRubyと補完関係にあるし連携も比較的いいから
どちらも使えるって人は多いっぽい
Perlからの移行組も一定数いるはず
Python/PHPはちょっと分からんが、まあいないとは思えない
他人が作ったRubyライブラリを使おうと思うとCの読み書きはどうしても必要になってくるので、 必要に迫られてある程度(偏って)できるようになったりする Ruby+Perl と Ruby+Python は普通にいるだろ Ruby しか使えない人間なんて Ruby にとってもゴミでしかない 他の言語にも目を向けて視線は高く持ちましょう
お前らがそういう 「Rubyで書きにくいからこれは他の言語で書いちゃえ」 ってやってばっかりいるからRubyの書きにくい分野が進展しないのだw いや、頑張るところはよく考えて配分されるべきだしそれでいいんけどさ
202 :
デフォルトの名無しさん :2011/05/25(水) 15:01:46.39
C, Lisp, Perl, Python, PHP, Smalltalk, shあたりの話は普通に通じる人が多い印象。 あとその人の志向によってはHaskellやJavascriptも。
>>198 その中ならPerlは昔それなりに使ってたから書ける(読める自信はあんまりない)
CとDは読み書きできる。
DHHがPHPerだったよな
ループ中にキーボードが何押されたか取得する場合って何のライブラリを使うのでしょうか? 秀丸マクロで言うとiskeydownのような事をやりたいのです
まさかrubyを自分のスキルのメインにしてる奴なんてほとんどいないだろ。
メインはなに?
Mechaizeを使わないでRuby標準のライブラリのNET::HTTPだけでクッキー取得するのは難しい作業になりますか?
>>208 httpとかCookieの仕組みというか仕様を知ってるなら簡単
知らないならそれをお勉強してください
俺httpとCookie知ってるんだぜwwwwwwwwwwwwwwwwwwwwwwwww
そのへんの知識があれば書けるというものでもないと思うが
文字列を1オクテットずつ16進表記で配列にいれる場合、Perlなら my @hex_strings = unpack("(H2)*", "ABC"); # => ("41", "42", "43") とするのですが、Rubyの場合はどのようにすればいいのでしょうか?
>>211 サーバから受け取ったものを持続的接続のために同じサーバへ返すだけなら結構なんとかなる
>>212 "ABC".each_char.map{|x| x.unpack('H*')}.flatten
214 :
uy :2011/05/25(水) 16:18:50.98
>>205 require 'Win32API'
# require 'dl/win32'
class Win32API
def Win32API.GetKeyState( int )
func = Win32API.new('user32', 'GetKeyState', %w(i), 'i')
func.call( int ) & 0x80
end
end
loop do
sleep 0.01
break if 0 != Win32API.GetKeyState( 0x1B ) # ESCAPE
end
p :end
>>205 Windowsでいいんだよね?
特定のキーが押されているかどうか取得するなら
require 'Win32API'
api = Win32API.new('user32.dll', 'GetKeyState', 'i', 'i')
loop do
"'Enter' is down" if api.call(0x0d) < 0
end
0x0dのところは仮想キーコードでぐぐってくれ。
押されてるときはapi.callの戻り値が負になる。
>>209 簡単ではないがまあ、ハマるポイントも想定しやすいし
ここに聞きに来る前提なら何とかなる公算は高いかも
s = [1,2,3] s.each do |line| puts line end で配列を一つずつ出力できましたが たまにeach("文字列")みたいにs.each("文字列") do |line|な感じのコードを見るのですが これはどういう場合に使うのですか?
219 :
デフォルトの名無しさん :2011/05/25(水) 17:03:41.90
>>213 1.9だとマルチバイト文字が1文字として返るので、 each_byte で。
bytes もいいよ。
# coding: utf-8
'ABC'.bytes.map{|x| '%02x' % x}
=> ["41", "42", "43"]
'あいう'.bytes.map{|x| '%02x' % x}
# => ["e3", "81", "82", "e3", "81", "84", "e3", "81", "86"]
# オクテットとバイトは違うというツッコミは勘弁な。
220 :
デフォルトの名無しさん :2011/05/25(水) 17:07:18.95
>>218 1.8までのString#eachは行単位の処理を行う。
そのとき、行区切り文字を $/ (通常は改行文字を意味する)以外にしたいときに指定する。
1.9 だと s.lines("文字列").each になるのかしらね。
>たまに っていうか、このスレくらいでしか見ないと思う(今年見たのはここが初めて) だらだら無限に流れてくる、非改行区切りの文字列なんてそうそうあるもんではない
日記はブログで
>>221 ファイルとして確保可能なら最後まで1回で read してしまうからなあ
ああそうだよこんなことするから消費メモリ多くなるんだよ Ruby
>>221 COBOLの呪いがかかった固定長文字列とかはあるけど、
普通、別の何かで取り込むだろうしな。
以下のスクリプトを実行したとき、 test(2)とtest(3)では、結果のエンコーディングが違うのですが、何故このような結果になるのでしょうか #encoding: Windows-31J # test(1) s1 = "".encode("utf-8"); s2 = "".encode("utf-8"); p (s1+s2).encoding s1 += s2; p s1.encoding # test(2) s1 = "".encode("utf-8"); s2 = "".encode("Windows-31J"); p (s1+s2).encoding s1 += s2; p s1.encoding # test(3) s1 = "".encode("utf-8"); s2 = "あいうえお"; p (s1+s2).encoding s1 += s2; p s1.encoding 1.9.2p136の実行結果 ------------ #<Encoding:UTF-8> #<Encoding:UTF-8> #<Encoding:UTF-8> #<Encoding:UTF-8> #<Encoding:Windows-31J> #<Encoding:Windows-31J>
>>225 えーと、異なるエンコーディングの文字列を「連結」するように指示された場合、
「ベースとなる」ほうの文字エンコーディングが「連結しようとする」文字エンコーディングと互換な場合、
結果のエンコーディングは「連結しようとする」文字エンコーディングに揃えられる
A+B のとき、Aが変換なしでBの文字エンコーディングとみなすことができる場合、結果の文字エンコーディングはBと同じになる
"abc" + "UTF-8な文字列" は、 "abc" の文字エンコーディングに関わらず UTF-8
"abc" + "Windows-31Jな文字列" は、 "abc" の文字エンコーディングに関わらず Windows-31J
"UTF-8な文字列" + "WIndows-31Jな文字列" は、変換なしでは連結できないのでエラー
>>225 空文字列とそうでない文字列の連結では空じゃない文字列のエンコードが優先される。
どちらも空か、どちらも中身がある場合はレシーバ(左の項)のエンコードが優先される。
(どちらも中身があって、互換性のない部分(非ASCII文字)があると例外発生)
たぶんできるだけエンコーディングの変換をせずに文字列としての妥当性を保つための仕様。
#encoding: Windows-31J
# test(4)
s1 = "".encode("utf-8");
s2 = "aiueo";
p (s1+s2).encoding #=>#<Encoding:Windows-31J>
# test(5)
s1 = "aiueo".encode("utf-8");
s2 = "";
p (s1+s2).encoding #=>#<Encoding:UTF-8>
# test(6)
s1 = "aiueo".encode("utf-8");
s2 = "aiueo";
p (s1+s2).encoding #=>#<Encoding:UTF-8>
String<< なら変わらないので、文字列連結の時はちょっと気をつけるといい irb> s = "" irb> p s.encoding #<Encoding:UTF-8> irb> s = s + 'abc'.encode('Windows-1252') irb> p s.encoding #<Encoding:Windows-1252> irb> s = "" irb> p s.encoding #<Encoding:UTF-8> irb> s << 'abc'.encode('Windows-1252') irb> p s.encoding #<Encoding:UTF-8> str = str + 何か という文字列の再代入記述はオブジェクト的にカッコ悪いということであんまり支持がなかったんだけど、 1.9 で不支持の意図が明確になった 1.8 使ってる人は気をつけよう
>>225-227 # test(7)
s1 = "aiueo".encode("utf-8");
s2 = "あいうえお";
p (s1+s2).encoding #=>#<Encoding:Windows-31J>
# test(8)
s1 = "あいうえお".encode("utf-8");
s2 = "aiueo";
p (s1+s2).encoding
ということで
>>226 と
>>227 どちらもルールとして不十分
・空文字列とそうでない文字列の連結では空でない文字列のエンコードが優先される。
・どちらも空か、どちらも中身があり、相互に互換性がある場合はレシーバ(左の項)のエンコードが優先される。
・どちらか一方に互換性のない文字列がある場合は互換性のない方が優先される
・AとB相互に互換性のない文字列があるとエラー
rubyから利用できるライブラリで強度のある暗号復号化が出来るライブラリは何を使えばよいか?
231 :
デフォルトの名無しさん :2011/05/25(水) 20:58:48.04
ということはOpenSSLで使えるAESなどより強度のあるものを求めているわけだな? Camelliaは評判どうなんだろうね。OpenSSL 1.0では組み込まれたようだけど。
>>228 str = str + 何か
は捨てるオブジェクトが増えるのも問題。
回数の多い繰り返し処理ではやってはいけない。
オブジェクトを出来るだけ捨てないようにすることの大切さは以下
require 'benchmark'
CHAR = '*'
N = 100000
Benchmark.bm(4) do |x|
str = ''
x.report('+ : '){ N.times{ str += '*' } }
str = ''
x.report('<<: '){ N.times{ str << CHAR } }
end
user system total real
+ : 3.578000 2.234000 5.812000 ( 5.921875)
<<: 0.031000 0.000000 0.031000 ( 0.031250)
233 :
225 :2011/05/25(水) 21:12:55.15
>>226-229 ,232
ありがとうございます
いろいろ勉強になりました
基本は、複数のエンコードが混在する可能性があるなら、右辺値を明示的にエンコンードしてから
結合する必要がある、ということですね。
言われてみれば、まったく当たり前のことですが、試した結果が右辺値が優先される場合がある、
というのにとらわれて、思考停止してました。
でも、詳しいルールが分かったので聞いてみて良かったです
>>についても勉強になりました。
今からRubyの勉強をしようと思うのですが みなさんどんなテキストエディタを使っていますか?
Ruby自身が暗号化機構提供してるわけじゃないので、 目的に合致する暗号化技術を見つけてからそれのRubyバインディングを探す、という手順になるかと思う
>>234 Windowsではxyzzy
LinuxではEmacs
>>234 使い慣れたえでぃたー
前にもあったが、Rubyのために新規アプリ導入とかマジキチ
…まあ、エディタなんて使ったことないですワードでいいですかみたいな人もいそうだけれど
239 :
uy :2011/05/25(水) 21:51:19.00
Ruby in Steelつかおうぜ Ironrubyはともかくエディタ性能はそこそこ VisualStudioの癖に軽いよ 唯一の欠点は実行後に、フォーカスが出力ウィンドウに取られること、調べたけど設定どうしようもなかった
>>234 Notepad++をおぬぬめぬめぬぬめぬめしとく。
この質問何回目だ
HTTPとCOOKIEはwikipediaに書いてあることだけじゃダメですか?
>>242 英語版のWikipediaにcookieの実装がまるまる書いてあるから
それ読めばいんじゃね
>>242 日本語のHTTP Cookieの項目読んでもレスポンスやリクエストのCookie周りの読み方わかんないよね。
RFCか、英語がどうしても嫌ならその日本語訳でも読んでみたら?
クッキーを受信するためにヘッダーで送れってことですか?
HTTP Cookie を理解するには HTTP と URI の理解がどーしても必要 いろいろ積み上げた上の方にある糞みたいな技術なので、一足飛びに読んでもまったく使えない 送ってしまったクッキーが正しいかどうかはこちらからは全くわからないのも面倒
>>245 レスポンスのヘッダに書かれてるSet-Cookieを読んで解析して、
リクエストのヘッダにCookieを書き出すの
def login(username, password)
uri = URI.parse("
https://secure.nicovideo.jp/secure/login?site=nicolive_antenna ")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::
HTTP::Post.new (uri.request_uri)
request.set_form_data({:mail=>username, :password=>password})
response = http.request(request)
p response.get_fields('Set-Cookie')
#regex = Regexp.new(/<ticket>(.+?)<\/ticket>/)
#return response.body.scan(regex)[0][0]
end
としてみましたけどクッキーが取れないのです
>>248 たぶん君だけ間違ってる
CGIの話じゃない
クライアントがサーバからCookieを受け取って送り返す話
いや、まあ、全く関係ないタイミングで
>>242 がCGIの話を始めた可能性は確かにあるんだがw
Pythonなら簡単に出来るよからPython覚えてみ
>>249 何かうまくいかないときに response 全体を読んで確かめないのはおばあちゃんの遺言かなにかですか
ニコ動はログインに何回か失敗するとロックされるよね レスポンスヘッダだけ見てたんじゃわからんわな、そりゃ
いろいろ言いたいことはあるんだが、とりあえず相手先のサーバのAPIの規則は守れ 送るデータは mail=メールアドレス&password=パスワード だ
usernameのところはメールアドレスでpasswordのところはパスワードが入ってます responseをやっても200コードが帰ってきてるのを確認できててbodyに文字列がはいってるのですがcookieが帰ってきませんでした
なにその大雑把にひどいオチ まあ、マニュアルはとりあえず読んどけというお話でした 次の方どうぞ
なにかうまく行かないところはあちこち小単位でpとかなんとかそういうので出力してみてバグの場所を特定するとか、 エラー吐いたときはエラーメッセージ読んでみて、意味が分かればそれに合わせて修正とか、 意味がわからなかった/解決法がわからないときだけは仕方ないからエラーメッセージちゃんとつけて質問するとか、 最近はうるさく言われることは減ったけど、これ守るだけでスキルもつきやすくなるし、 問題の解決もずっとずっと早いよね。
>>256 今回(も)、ステータスコードとログイン失敗には関連性はない
(本来はあるべきなんだが、システム作った人の考え方依存)
ニコニコ動画ではログイン失敗でも HTTP status として "200" を返すので、その情報には1ミリも価値がないw
送信データの結果として何が起こってるかは、メッセージボディを直接読まなければならない
まあ、たぶん、200 以外でエラーを返すとエラーメッセージ読めない人がいるという経験則なんだろうと思う
最近くだらない(しかもRubyと関係ない)質問が多いなぁと思ったけど、 これは良いことなのか。 プログラミング初心者がRubyを使っているということなのか。 Rubyユーザーの新規開拓や〜
RubyではWindows用アプリケーション(ウィンドウ出る普通のやつ)は作れませんよー ああいうのつくりたい人はC#とかやったほうが速攻で作れるようになりますよー 一応定期的に釘差しておく
最初からWindowsでRubyやってる人がいるっぽいけど、頑張るなあと思う WindowsのRubyなんて、LinuxあたりでRuby使ってた人が代替で使うもんだとばかり思ってた
Win32APIが普通に叩けるからWindows用アプリケーションは作れないということもないが苦行だな。
逆立ちしながら徒競走に出るのは、その人は何か考えるところがあって頑張ったかもしれないが、でも徒競走としてはビリだ 逆立ちしながら徒競走選手権があれば褒められたかもしれないが、早く終われよ次の人待ってるんだからよ、と思われてる可能性が大
Windows用のGUIアプリケーションをRubyで作ると言うことと Windows用のアプリケーションやツールをRubyで作ると言うことは 微妙にニュアンスが違う 前者はやや苦行かもしれないが 今となっては、後者が苦行と言うことはないだろう 普通に便利だよ、Windows上でRuby
GUIはTitaniumDesktopでおおむねイケるよね
どうでもいいんだけど、 encoding: utf-8 と書くのはできればやめて欲しい coding: utf-8 と書いて欲しい
coding:utf8と書けるようにしなかったのは世紀の大失策
p response.bodyの結果はこのようにチケットが帰ってきてるので正常に認証はおこなえてました
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<nicovideo_user_response status=\
live_antenna_数字</ticket>\n</nicovideo_user_response>"
PHP5.3ですがcurlでやるとログインAPIその1用の所でクッキーが取れているのでRubyでも文字列だけでなくクッキーが帰って来るはずなんですが勘違いしてますでしょうか?
function login($param) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "
https://secure.nicovideo.jp/secure/login?site=niconico ");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, "./saveCookie.txt);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_exec($ch);
curl_close($ch);
}
login(array('mail'=>'メールアドレス', 'password'=>'パスワード');
クッキーの内容(認証用チケットの数字が当てはまる箇所はありませんでした)
# Netscape HTTP Cookie File
#
http://curl.haxx.se/rfc/cookie_spec.html # This file was generated by libcurl! Edit at your own risk.
secure.nicovideo.jp FALSE /secure/ FALSE 数字 user_session deleted
secure.nicovideo.jp FALSE / FALSE 数字 user_session deleted
.nicovideo.jp TRUE / FALSE 数字 user_session user_session_数字_数字
ニコニコ動画は URL の ? のあとに何が書いてあるかでログイン後にどうするかを振り分けてる site=niconico と site=nicolive_antenna が返すものは別 Ruby 関係ないシリーズ絶好調だが、外界と無関係に Ruby を使うことはできないのであんま気にしなくていいと思う
クエリにsite=nicolive_antennaってどこから出てきたんだ
site=niconico と site=nicolive_antennaでもどっち使ってもログインよ
>>268 意味的にはencoding=符号化の方法、coding=プログラムを書くこと
だと思ってたから、encodingのほうが合ってるような気がするんだが
>>263 コマンドプロンプトのサポートツールとしては結構役に立つよ
標準コマンドにテキストツールが不足気味だからね
>>273 >>249 この人はクッキーを返さない API の動作を不審に思って、クッキーを返す API を curl から実行してレスしている
そりゃ API 違うから動作も違うじゃん? としか言えない
LinuxでRuby使うのとWinで使うのは何が違うの?
>>277 niconicoもnicolive_antennaも同じだけど?
# -*- coding: utf-8 -*- # encoding: utf-8 # coding: utf-8 のどれかを推奨 -*- をつけると Emacs さんが自分向けだと思ってコマンド解釈開始するので、その場合は conding でないと困る # -*- encoding: utf-8 -*- はファイル開くときに Emacs さんが毎回文句言うのであまりよくない ああ、vim くんはなんかこうオリジナリティ(苦笑)のある書き方があったはず
GUIなんかwxRubyで簡単に作れる時代になってるのに、遅れたやつばっかりだな
>>281 Ruby「を」選択する理由にはならない
RubyからGUIを操作できることは、RubyでGUIアプリケーションを作ることを初心者に勧めるのに足ることとイコールじゃない
まあ、ねえ Rubyに慣れた人がウィンドウが欲しいなと思ったとして、Tkしか持ってねえ状態にならずに済んでるということは素晴らしい でも、「ぷろぐらむってわーどみたいなやつ」な人の制作ご希望に添えるものじゃないよな 別物別物
てか、Tkの時代から「GUIは簡単に作れた」のよ 単に、Tkから抜け出せなかっただけで ま、GUIの話はGUIスレでどうぞ
rss取得するときってopen-uriつかえばいいの?
>>285 まあだいたいなんとかなる
なんとかならなかった時はその時別個対応で
irb> require 'open-uri'
irb> puts open("
http://b.hatena.ne.jp/entrylist?sort=hot&mode=rss ").read.scan(/title>(.+?)<\/title>/)
はてなブックマーク - 新着エントリー
HTML5、W3C で Last Call (最終草案) へ | WWW WATCH
一人で仕事をする上で学んだ5つの事*ホームページを作る人のネタ帳
セールスフォース・ドットコム、東京データセンターを11月に稼働開始。利用料金は変わらず − Publickey
…
287 :
275 :2011/05/26(木) 12:33:32.54
>>286 みたいにWindowsで動かないサンプル書く人って恥ずかしくないの?
redmineがruby1.9でも動くように要望出したいんだけどどこで言えばいいか至急教えてください
beginとrescue javaでいうtryとcatchってことですか?
ニコ生のログインは難しいので今回は諦めて他に簡単なものから作れるように勉強してみたいと思います
>>289 実は、開発版先っちょのtrunkは1.9で全く動かないというわけではない
…いや、めんどくさいし動かないでいいや
GUIなんてオブジェクト指向のプログラミングの学習にも最適なのに、キチガイみたいに嫌ってるやついるね Ruby界では継承をアホみたいに嫌ってるやつもいるし、せっかくのオブジェクト指向スクリプト言語が台無し
int i; for (i=2;i<5;i++) printf("%d", i) これをRubyで書き直すとどうなるの?
>>292 その通り
try{ 〜 }catch(クラス名 変数名){ 〜 }finally{ 〜 } がそれぞれ
begin 〜 rescue クラス名 => 変数名 〜 ensure 〜 end に対応するよ
>>298 (2...5).each{|i| printf("%d", i) }
なんでrubyだけforの挙動が他の言語と違うんだよ まじrubyきめえ
>>278 Rubyは公式ではWindows版の保守を全くしておらず、基本的にUnix系OS向けとなってる
出回ってるWindows版Rubyは、有志で多少の手直しをしてコンパイルしたもの
Windows環境限定のことには弱く、逆にUnix系限定のことには比較的強い傾向がある
詳細には俺も把握してないんで調べて欲しい
>>300 ありがとうございます
(2...5)と(2..5)で挙動が違うのかきのせいでごわすか?
>Windows環境限定のことには弱く なんでそんなこと思っちゃったのか気になるな
>>301 for文の書き方や挙動はいくつかの流派(みたいなもの)に分かれます
例えば同じALGOL系言語ですらC系とPascalなどでは全然違うものです
Rubyだけ違う、なんてワケではないですよ
whileが一番やで
>>303 (2..5)というピリオド2つの形式は終端を含み
(2...5)というピリオド3つの形式は終端を含みません
>>304 ん〜…ちと語弊はあるか
でも強くはないだろ?
俺がRubyを知った頃はprintなんてなかったのに いつからprintが出来るようになったのか分かる人いますか?
>>286 rssってライブラリが便利そうだったのでこれで書いてみました(ぇ
require 'rss'
rss = nil
rss_source = '
http://weather.livedoor.com/forecast/rss/11/60.xml '
begin
rss = RSS::Parser.parse(rss_source)
rescue RSS::InvalidRSSError
rss = RSS::Parser.parse(rss_source, false)
end
質問なんですがitem要素の数を数えるにはどうしたらいいのですか?
>>308 少なくとも俺がRubyを知った1.4では既に出来るようになってたと思うからそれより昔だと思うが…
311 :
デフォルトの名無しさん :2011/05/26(木) 13:59:56.40
rss.items.class => Array
312 :
デフォルトの名無しさん :2011/05/26(木) 14:11:02.07
IDEとしてEclipseがいいと聞いたんですが、導入で行き詰ってます。 どこか、分かりやすく解説してるサイトなどありますでしょうか。
んーopen-uriでrssを文字列として取得してxmlでカウントしたほうが早いかな・・・
Rubyは日本では流行ってるって言うけどググってもあんまり参考になるサイトがないのな おまけに日本では流行ってないと言われるPythonのほうが参考になるサイトが多いという
>>298 2.upto(4){|i| print i}
見かけ上、なにがなんでも「5未満」でなければならず、printf の書式が必要な場合は
>>300
>>314 >Rubyは日本では流行ってるって言うけど
別にそれほど「流行ってない」です
またあなたメディアの言うこと鵜呑みにして騙されちゃいましたね
>>302 大雑把には間違ってない(大雑把すぎるが)
UNIX系OS上では意図したとおりに動くけど、Windows上では意図したとおり動くとは限らない
その原因は様々だけど、同じように動かすのには多大な努力が必要な事実は変わらない
>>311 これをどうやって使うと要素を数えられるのですか?
ほんとは繰り返し数が不要で、単に3回繰り返せばいいだけなら 3.times{ puts "やっほー" } でも… 他の言語の for 文/式 は、指定回数繰り返すという動作のみ必要であるということがけっこうある そう言う場合、Ruby では整数クラスのメソッドを用いて、回数繰り返しのみを行う 整数クラスにそんなメソッドがくっついているのはキモいという指摘は時々見るし実際のところそう思う
>>320 C#で
3.Times(_=> Console.WriteLine("やっほー"));
とかやったりする俺が通りますよ。
ああ、open-uri が抜けてた
require 'rubygems'
require 'nokogiri'
require 'open-uri'
uri = URI.parse('
http://weather.livedoor.com/forecast/rss/11/60.xml ')
doc = Nokogiri::XML.parse(uri.read)
p doc.search('item').size
doc.search('item').each{|i| puts i.at('description').inner_text}
>>323 やっぱり文字列としてrssを取得してそれをrexmlでパースしないと無理でしたか
rssライブラリは便利だなあと思ってwhileでitemの数分回して表示させたかったのですがその方法に乗り換えたいと思います
326 :
uy :2011/05/26(木) 15:47:15.26
b = [] b.push 3 b.each do | m | # b.push 2 # mugen loop end a = Hash.new a.store:ss,3 a.each do | m | a.store:tt,6 # `store': can't add a new key into hash during iteration (RuntimeError) end これハッシュはエラーでてるけど配列だとエラーでないんだけどいいの? なんなの?
WindowsでやるならPerl,PHP,Pythonなにがいいの?
328 :
デフォルトの名無しさん :2011/05/26(木) 15:52:09.93
>>324 だから、rss.itemsが配列なんだからそのまま rss.items.size でいいだろうが。
>>320 言語によっては、if文すらあたかもブール型のメソッドかのように書くものもあるんだぜ
>>330 戻り値が真偽値依存なんだからそれほど問題なかんべ
整数オブジェクトのインスタンスメソッドにループ処理メソッドが入ってるというのは若干奇妙と言えなくもないが
まあ今更どうしようもないし別にいいけどさ
アスキー互換であることがわかっている文字列の最初の1文字を 普通に文字として取り出す方法ってどう書けばわかりやすいですか? 対応はRuby1.8.7以降で構いません
333 :
デフォルトの名無しさん :2011/05/26(木) 19:19:39.48
アスキー互換? アスキーオンリーじゃないのね…
>>332 String#[]
ruby -e "p 'aiueo'[0] "
"a"
335 :
デフォルトの名無しさん :2011/05/26(木) 19:21:25.19
>>334 Rubyでは "あ" (UTF-8) みたいなのも「アスキー互換」なのだが、
1.8 で "あ"[0] は1バイト目が出てきてしまう。
336 :
デフォルトの名無しさん :2011/05/26(木) 19:23:56.18
1.8だと、$KCODEを適切に指定した上で str.split[0] だろうか。
>>328 p rss.channel.item.lengthって書いてました
p rss.channel.items.sizeって書いたら取れました
でも天気は7日分+広告1個で合計8にならないといけないのに9になりました
あとrssにはitemsという要素がないんのですが酔うその数を数えるときは複数形にするというのがRubyなのでしょうね
338 :
デフォルトの名無しさん :2011/05/26(木) 19:25:24.22
str.chars.first のほうが無駄な配列を作らずに済むかな。
アスキー互換って微妙な表現だなオイ ascii_compatible? が true だとかそういうのですかね っていうか普通にアスキーの範囲ってことでいい?
340 :
デフォルトの名無しさん :2011/05/26(木) 19:58:39.94
>>337 rss.channelで返ってくるオブジェクトに要素の配列か何かを返すitemsというメソッドが用意されてるだけ。
ライブラリ作成者がそういう名前をつけただけ。
「要素の数を数えるときは複数形にする」なんてルールはRubyにはない。
多言語から来たぼくちんのために誰かまとめてください for ($i=0; $i<10; $i++) { print $i; } while ($i < 10) { print $i; } switch ($n) { case 1: print 1; break; case 2: print 2: break; default: print 0; } try〜catch
C#でいうとhtp://dobon.net/みたいなのがRubyでもあると助かるんだけどそういうのない?
こんなかんじの htt://dobon.net/vb/dotnet/form/index.html
>>343 改行があってもいい場合、print は puts で書くことが多いのでとりあえず puts で書く
で
[9要素ある配列].each{|x| puts x} # 最も一般的、数値をインクリメントして配列を単純ループ処理することはまずない
[9要素ある配列].each_with_index{|x, i| puts "#{i}要素目は#{x}です"} # i は 0 から 9 まで
0.upto(9){|i| puts i} # 0から9まで
(0...10).each{|i| puts i} # 0から10の一歩手前まで
9.times{|x| puts x} # 9回
好きなの選べ
case x
when 1
puts "1!"
when 2
puts "2!"
else
puts "0!"
end
begin
some_process
rescue SomeError => ex
# 例外オブジェクト ex でなにかする
end
>>343 while i < 0
print i
end
case n
when 1
print 1
when 2
print 2
else
print 0
end
# Cのswitch文と違ってbreakしなかったらn=1のとき1と2が両方出力されるとかはない
for文はそのまま相当するものはないので、イテレータや制御構文調べてやりたいことに応じて使い分け。単純繰り返しなら
10.times{|i| print i }
とか
for i in 0...10
print i
end
とか
(0...10).each {|i| print i}
とか
try - catch - finallyは
begin - rescue(例外キャッチ) - else(例外が発生しなかった場合) - ensure(どちらでも必ず実行) - end
elseやensureは省略可。その他rescue修飾詞なんてのもある
自分で例外上げるときはraise
Integer#upto や Range#each はこういう説明のときくらいにしか使わないよね たいてい Array#each とかで、たまに Integer#time 使う程度
>>349 うん、だから
>>343 みたいな例を出されると実はちょっとだけ困る
配列操作するとか、もう少し実際的な例だと違いが出せてほんとは嬉しい
何気なくfor文紹介したけど自分で使ったことはない
Integer#stepは紹介しておいてもよかったかもしれないと思った
IntegerっていうかNumericか
355 :
デフォルトの名無しさん :2011/05/26(木) 22:31:05.66
forはリファレンス見ないと間違いなく書ける自身がないな。 そんな存在なのに予約語を2つも使うなんてけしからん。
10から54までの乱数を表示したい そういうときはマニュアルのどのページをみたらよいですか?
while は gets 専用 for は何やってるのか正直さっぱりわからないし、この数年書いた記憶がない
1.9.3から Random.rand (10..54)が使えるらしいよ!
こうですか?なんか気持ち悪いです>< def FOR(prelude, cond, epilogue) eval prelude while eval(cond) yield eval epilogue end end FOR("$i=0", "$i<10", "$i+=1") { print $i }
>>356 10+rand(45)
乱数とかで適当に調べればいいんじゃないかな
2.0からはforなくして欲しい クラスメソッドを::で呼べる機能も外して高速化して欲しい
362 :
デフォルトの名無しさん :2011/05/26(木) 22:39:04.74
>>356 乱数ならrand(n)で 0からn-1の乱数なので、
rand(45) + 10
で10から54
def orerand(n, m)
if n < m
rand(m-n+1) + n
else
rand (n-m+ 1) + m
end
end
とかやればn以上m以下(またはm以上n以下)の乱数吐くよ
マニュアルでいうと組み込み関数とか、1.9ならRandomクラスも見てみるといい。
363 :
デフォルトの名無しさん :2011/05/26(木) 22:39:42.62
>>356 100000.times.map {rand(54-10+1) + 10}.minmax
=> [10, 54]
まぁ、どの言語でもそんなに基本的なことは変わらぬ。
364 :
デフォルトの名無しさん :2011/05/26(木) 22:40:11.11
365 :
デフォルトの名無しさん :2011/05/26(木) 22:40:34.18
>>359 epilogueならprologueにしないと。
ruby-1.9.2> p (10..54).to_a.sample
29
イエスアイガッチュ
>>360 がおそらくいちばん無難
rand(44) では44が永遠に出ないことに注意
>>358 1.9.2でも先にrandom = Random.newとかしとけば
random.rand(10..54)できるよね
369 :
uy :2011/05/26(木) 23:55:02.91
lm = lambda do | a | n = a.to_a.shuffle i = 0 lambda do n[ i=((i+1)%n.size) ] end end n = lm.call 10..54 puts n.call puts n.call puts n.call
おまえらいくつですか?Rubyやるぐらいだからかなり歳いってますよね
84ちゃい
Rubyやってる人って結構若いイメージがあるんだが…
マジレスでたのむ!俺がこれからRubyを触るべきかの参考にしたいので
このスレの連中はリアルタイムで玉音放送を聞いてる奴ばかりですよ
俺もルビーはじめたいが、忙しくて時間がとれない・・・ ルビーちょっと本をみてみたけど、楽しそうだ・・・
376 :
uy :2011/05/27(金) 00:34:39.29
[22,33,44,55].each_with_index.inject(0) do | a, (b , c) | p a, b, c end majiyabai ruby majiyabai koresugoiyone
>>372 かなり幅広い
RoR開発時のDHHは20代半ば
今のティム・ブレイは55歳
378 :
デフォルトの名無しさん :2011/05/27(金) 00:44:41.55
toRubyの池澤さんはわりと高齢のはず。 中二コミッタもいるね。
うちの猫がコミッタになりたいと…
それはちょっとこみったな
流れをsplit()してごめんなさい、例えば SUITS = [:SPADE, :HEART, :CLUB, :DIAMOND] という配列があるとして。これを元に foundation = { :SPADE => [], :HEART => [], :CLUB => [], :DIAMOND => [], } というハッシュを作りたいのですが、何か簡潔な方法はないでしょうか もろちん各配列はそれぞれ別々のobject_idを持ってて欲しいです。 今のところ、2行に分けて foundation = {} SUITS.each{|s| foundation[s] = [] } という感じちゃってます。 無理して1文に詰め込むより、こっちのが見やすいんかなと。
あ、ちなみに foundation は組札のことです。
384 :
デフォルトの名無しさん :2011/05/27(金) 01:38:23.76
最近RoR始めた新参者ですが Rails3とmongodbの組み合わせはいいね まだ良くわからんのでまたお邪魔します
>>381 こんなのはダメかな?ダメだよね…
fundation = SUITS.inject({}) { |h, s| h.tap { |x| x[s] = [] } }
>>318 ハッシュの中身なんて必要なときに作れば良い。
foundation[:SPADE] ||= []
>>386 それなら Hash.new { |h, k| h[k] = [] } でいいような…
foundation = Hash[SUITS.zip([[]]*SUITS.size)]
389 :
uy :2011/05/27(金) 04:18:18.55
SUITS = [:SPADE, :HEART, :CLUB, :DIAMOND] p Hash[SUITS.map do|m|[m,[]]end] p(SUITS.inject({})do|a,m|a[m]=[];a end)
390 :
uy :2011/05/27(金) 04:30:17.40
SUITS=[":SPADE",":HEART",":CLUB",":DIAMOND",""] p eval(%!{#{(SUITS*"=>[],")}}!)
結論としては、まあ2行が最善ということで
畳み込みを使うやり方(
>>385 )はまあまあ応用が効いて
簡潔だが、とりたてて可読性が良いというほどではないなあ
関数型言語屋には読みやすいのかも分からん
tapが必要ない
>>389 のinjectがベストかすら
おめーら無理すんな。 あと病院いったほうがいいぞ。 頭のな。
>>391 うむ
一般論として、inject で 1行にまとめてもあまりいいことはない
あれは変数定義をまとめて表記してるだけ(という振り回された使い方が多い)
inject や any? で処理をまとめると、わかりにくくてあとあと問題になったりする
ついこの前まで書き込み速度が30以下だったのに今では70までにアップした
プログラミングって書かないとうまくならないんだな 一年前のソース見たらスパゲティソースで吹いた 気付かないうちに上達してましt
自衛隊OB特別出演
402 :
394 :2011/05/27(金) 12:39:24.55
自演でも自衛隊OB特別出演でもないよ hash = [:s, :h, :d, :c].each_with_object({}) {|k, h| h[k] = [] }
each_with_objectとかはじめて見たわ
いろいろ考えてるみたいだが結局
>>381 のままが一番シンプルでいい
ここの先生方の力を集結して逆引きサンプル集をwikiにまとめていっていただけませんか?
空白のページが目立つのでちょっと厳しいです
ここで教えてもらった知識をまとめてHPに書いてもいいですか?
2chに書き込まれたコードは権利関連めんどくさいからやめとけ
411 :
381 :2011/05/27(金) 16:01:32.05
無理して読みにくくなるより、このままのが良さそうですね 相談に乗ってくれてありがとうございました
412 :
uy :2011/05/27(金) 16:06:33.76
来年2.0出るんだよね 今から1.8やる意味ってないよねあんま
>>413 >来年2.0出るんだよね
たぶん出ないし、出たとしても数年は使いものにならないと思う
1.8.7 自体に問題はないよ
1.9.2 との差分もそれほど多いわけじゃないし、
1.9.2 だからといって劇的に便利になって記法が特殊になって 1.8.7 の知識が通用しなくなるとかそういうわけじゃない
ただ、Rails をやろうとしているのなら1.8.7 しか選択肢がない
415 :
uy :2011/05/27(金) 16:19:58.70
>>413 マジで?
凄い楽しみだから情報元がみたい
そういう話題こそ本スレに持って行こうぜ
417 :
uy :2011/05/27(金) 16:22:20.23
1.8系では許される構文が、1.9だとエラーになる箇所あるから、 1.8をメインでやるにしても、両方触った上でやったほうがいいよ そうしないと非互換コードをかいてしまう
今この板で2番目に更新速度が速いのはここだぜ あの宿敵C言語スレに俺たちは勝ったんだ
>>418 あんなものまだ表示してるの
なんの意味もないのに…
>>419 レスの内容はどうでもいいという人がよく気にする
どうでもいいというか、理解できないという人も、これしか話すことがなかったりする
a = nil a = a + "a" a = a + "b" これってaの頭にはnilが入ったままになりますか?
2.0はPerl6のように互換性無視の大改編をお願いします
424 :
uy :2011/05/27(金) 17:20:56.30
a = nil a = a ? (a+"a") : "a" a = a ? (a+"b") : "b" p a a = "" a += "c" a += "d" p a a = "" a << "e" a << "f" p a a= "" a ="#{a}g" a ="#{a}h" p a
>>421 それがシェルから可能なら、同じことを system(' ') で書けばいい
ということで、Ruby 関係なく system("chrome.exeへのパス" "URL")
もし chrome が標準のWeb ブラウザになっているなら、 system("start #{URL}") でも動作するかもしれない
どっちもコマンドプロンプトのお話
>>422 …それくらいは自分で試そうよ
nil + "a" をやろうとして、nil には + メソッドがないから NoMethodError になる
nil かもしれないオブジェクトに + を行なうこと自体があまりよくないし、
文字列に流用されて + メソッドを使われるかもしれない変数名を nil に使うのもあまりよくない
nil は undef みたいな印ではなく、確固としたひとつのオブジェクトだからなあ 使用オブジェクトがわかってて、そのオブジェクトのメソッドが呼ばれることがわかっているなら、 そのオブジェクトの初期値を指定しておけばいい 文字列なら ''、数値なら 0
変数名が例示用の 1文字だからアレだけど、実際は str = str + "a" とかになるからな そりゃ str の最初の値は nil ではなく "" だ
>>425 system("chrome.exeへのパス", "URL")
ダウンロードについてご教示おねがいします
url = '
http://www.google.co.jp/images/nav_logo72.png '
filename = File.basename(url)
open(filename, 'wb') do |file|
file.puts Net::HTTP.get_response(URI.parse(url)).body
end
これを実行するとgoogleのロゴをダウンロードする所まで書きました
スクリプトを実行した箇所に画像が保存されてしまいます
スクリプトの実行フォルダに関わらず、常に指定したフォルダC:\image\に保存する方法をご教示おねがいします
なんか基本的なこと書いてある本とか買ったり借りたりしてまとめて勉強したほうが速攻でやりたいことに進めると思う 一度もプログラム言語に触れたことがない場合、クラスやメソッドの解説を読むだけではまず歯がたたない
>>429 そりゃあopenにただファイル名渡せばカレントディレクトリに吐くよ。
パス指定したいなら、
open("C:\\image\\#{filename}", 'wb') do |file|
とかすりゃいいんじゃないかしら
Windows用Rubyのパス区切りって\でいいんだっけ
>>431 open は rubyfilepath を受けとるので、OS に関わらず / だけでよい
"C:/image/#{filename}"
そういや文字列の式展開って普通のブロックと同じなのかな。スコープは外と同じっぽいけど。 p "#{a = 1; b = 2; c = a + b; c} #{d = 1 e = 2 d + e}" #=>"3 3" p a #=> 1
ブロックまったく関係ない 埋め込み開始文字と埋め込み終了文字がたまたまブロックと同じなだけ まあ紛らわしいとは思う
>>429 バイナリや設定の外部ファイルをputsするのはダメ
printとかにしないと末尾に改行がくっつくぞ
ブラウザで保存した画像とファイルサイズ比べてみ
Rubyでputsしたもののほうが1バイトほど大きいはず
436 :
uy :2011/05/27(金) 20:41:09.97
そういやputsでも書き込めたね "wb"でオープンしたときはputsなくしちゃっていいんじゃないの バイナリをputsで書き込まなきゃいけない状況なんてなくね
万が一putsで書き込んだ場合はどうやって画像から改行を消せばいいの?
>>437 ぶっちゃけ画像の場合は末尾改行は無視されることが多いので放置でもよい
もう一度Rubyで読み込んでchompして再度書き込むのが妥当
String#chompは「改行っぽい文字」が文字列末尾にあった場合にのみそれを取り除く
Rubyでおすすめの本を教えてください
>>439 他のプログラミング言語を何か一通り習得してそれなりのものが書けるのか
それともプログラミング自体はじめてでプログラミングの入門にRubyをやるのか
javascriptの経験があります
>>441 経験があると言われてもどれくらいかわかんないと困る。
まあ無難にたのしいRuby 第3版とRubyレシピブック第3版あたり読んどくといいんじゃないかな。
それからリファレンスマニュアルをひととおり読んでみるといい。
Rubyはタイムゾーンに設定した地域の時刻で、サマータイムを自動的に計算して表示してくれるものでしょうか?
444 :
デフォルトの名無しさん :2011/05/27(金) 22:23:18.27
標準のTimeは動いている環境の地方時とGMTを扱える。
445 :
デフォルトの名無しさん :2011/05/27(金) 22:25:15.63
タイムゾーン間の変換や世界各地の夏時間を同時に扱いたい場合はtzinfo gemなのかな。
447 :
デフォルトの名無しさん :2011/05/27(金) 22:43:41.36
できない。 わりと更新あるしな。
448 :
デフォルトの名無しさん :2011/05/27(金) 22:50:44.08
標準のDateTimeクラス(require 'date')はnew_offsetを指定して、 異なるTime Zoneの日時を作ることが出来るが、指定できるのは 24を分母とするRational。
海外のサマータイムのある地域の時刻を表示する場合 GMTから時間をずらして、そこから夏時間を計算して時刻を調節して出力する って方法しかないですね
450 :
デフォルトの名無しさん :2011/05/27(金) 23:06:28.65
ワールドワイドに使うものは、内部的にはGMTで持っておいて、 表示時にオフセットかませることになるでしょうなー。
Ruby1.9.2です 文字列の中に@という記号1文字が含まれるかチェックする場合って以下のでいいですか? それともmatchやscanを使ったほうがいいですか? if /@/ =~ str p "含まれてます" else p "含まれてません" end
>>451 それでいいよ
それだとマッチ位置とかさっぱりわからないが、必要ないことも多いし
ありがとうございます 含まれてるかどうかだけチェックしたい場合はこれのほうがmatchやscanよりも速度は速いですか?
あ、でも1文字含まれてるだけ調べる場合に正規表現を使うって言うのが何かもったいない気もしてます
あー、そういうことは昔気にした覚えがある 1回マッチしたらそのまま成功として諦めるので、 マッチするものを文字列末尾まで探して配列にするscanやmatchよりはリクツ的には速い
速さはよく分からないけど、String#include?ってのもあるよ 「文字列の中に@という記号1文字が含まれるか」をそのまま書くとこうなると思う if str.include?("@")
>>454 埋め込みのないふつうの正規表現はじゅうぶん速いし正規表現で書いたほうが潰しが効くので、素直に正規表現にしとけ
一応、String#include? というのがあるにはあって、これは正規表現よりも速いことはあるんだが
全部十分に速いけど、あまりに予想と結果が違った。 何回試しても似たような結果。 require 'benchmark' s1 = 'nantoka@kantoka' s2 = 'nantokakantoka' n = 100000 c = '@' r = /@/ Benchmark.bm(10) do |x| x.report('include?:'){ n.times{s1.include?(c); s2.include?(c)} } x.report('s.match :'){ n.times{s1.match(r); s2.match(r)} } x.report('r.match :'){ n.times{r.match(s1); r.match(s2)} } x.report('=~ :'){ n.times{r =~ s1; r =~ s2} } end user system total real include?: 0.062000 0.000000 0.062000 ( 0.062500) s.match : 0.422000 0.016000 0.438000 ( 0.437500) r.match : 0.375000 0.000000 0.375000 ( 0.375000) =~ : 0.297000 0.000000 0.297000 ( 0.312500)
>>458 それは不誠実だ
充分に長い文字列において
・ 最初のほうにある
・ 真ん中へんにある
・ 最後のほうにある
・ 存在しない
のパターンを試すべき
>>451 すいませんif 〜thenのthenって書かなくても大丈夫なんですか?
僕が勉強してるサイトではthenが書いてあります
>>459 どれも正規表現にとって不利な条件じゃないですかやだー!
>>460 then を書かない場合は改行を書かなければならない
then を書いた場合は改行は不要
puts if /@/ =~ str then "あったよ" else "ないよ" end
then を書かない人は半々くらい
個人的には書いたほうがいいと思う
wxrubyはUbuntu10.10ではインストール微妙なのね 素直にTkで書くか…
>>459 細かいなあ。
user system total real
include|beg: 0.015000 0.000000 0.015000 ( 0.015625)
r.match|beg: 0.172000 0.000000 0.172000 ( 0.171875)
s.match|beg: 0.188000 0.000000 0.188000 ( 0.187500)
r =~ s |beg: 0.031000 0.000000 0.031000 ( 0.031250)
s =~ r |beg: 0.047000 0.000000 0.047000 ( 0.046875)
include|mid: 3.609000 0.000000 3.609000 ( 3.640625)
r.match|mid: 12.625000 0.000000 12.625000 ( 12.781250)
s.match|mid: 12.640000 0.000000 12.640000 ( 12.828125)
r =~ s |mid: 12.454000 0.000000 12.454000 ( 12.687500)
s =~ r |mid: 12.484000 0.000000 12.484000 ( 12.703125)
include|end: 7.141000 0.000000 7.141000 ( 7.218750)
r.match|end: 25.109000 0.000000 25.109000 ( 25.437500)
s.match|end: 25.141000 0.000000 25.141000 ( 25.578125)
r =~ s |end: 24.968000 0.000000 24.968000 ( 25.296875)
s =~ r |end: 24.860000 0.000000 24.860000 ( 25.281250)
include|not: 7.093000 0.000000 7.093000 ( 7.203125)
r.match|not: 24.875000 0.000000 24.875000 ( 25.296875)
s.match|not: 24.985000 0.000000 24.985000 ( 25.328125)
r =~ s |not: 24.937000 0.000000 24.937000 ( 25.375000)
s =~ r |not: 24.985000 0.000000 24.985000 ( 25.359375)
>>459 require 'benchmark'
s = []
s[0] = 'nantokakantoka' + '@' + 'nantokakantoka'*9999
s[1] = 'nantokakantoka' * 5000 + '@' + 'nantokakantoka'* 5000
s[2] = 'nantokakantoka' * 9999 + '@' + 'nantokakantoka'
s[3] = 'nantokakantoka' * 10000 + 'a'
t = %w(beg mid end not)
n = 50000
c = '@'
r = /@/
Benchmark.bm(18) do |x|
s.each_with_index do |s, idx|
x.report("include|#{t[idx]}:"){n.times{ s.include?(c)} }
x.report("r.match|#{t[idx]}:"){n.times{ r.match(s) }}
x.report("s.match|#{t[idx]}:"){n.times{ s.match(r) }}
x.report("r =~ s |#{t[idx]}:"){n.times{ r =~ s }}
x.report("s =~ r |#{t[idx]}:"){n.times{ s =~ r }}
end
end
>>465 なんつうかわかりやすいそのまんまの結果だな
バイナリレベルでの存在チェックしかできないString#include?の爆速っぷりが目につく
数メガあるバイナリからチャンクタグみたいなの探す場合なんかには バカにならない時間差だね
初心者の前でそういうこと言うのやめようよ String#index とか駆使するようなめんどくさい子になっちゃうよ
470 :
uy :2011/05/28(土) 02:48:04.10
このスレの住民はどんだけベンチマーク好きなんだよ
データが超巨大とか回数が多いとかでどうしても速度が気になるときはindexやinclude?ってのが正しい使い方かな?
差はせいぜい数倍程度しかないから、 正規表現で耐えがたいほど遅いケースだと、データ構造やアルゴリズムを一工夫するか、 別の言語を使うとかも視野に入れる必要があるんじゃないかなあ
473 :
uy :2011/05/28(土) 04:44:56.11
Rubyで速度の話されると、普通にCと連携しやすい言語なんだから速度気になる部位はC使えよwwwwwwwwwwwwwwwwwwと思うwwwww 知識として、俺はかなり調べるたちだけど重箱の隅だと思ってるよ LinuxだったらRubyinlineあるし、Windowsでも適当にCコンパイラと繋げて以下略
uy君いつもよりwが多いよ Cで拡張ライブラリ書けるからいいじゃんって考えは甘え
時間のかかる処理が数倍早くなるんならそっち使うけどなあ 正規表現を指定なんてオーバーキルだし だいいちString#include?とindexはもとからCで書いてあるので Cで書き直しても早くはならないだろう
Perlはindexより正規表現のほうが速い場合が多いんだよね。 Perlのindexの実装が気になる。
本質的にはただの文字列探索のはずなので String#include?が速いというよりは、正規表現エンジンに問題があるんじゃないか?
>>477 /aaa/ という正規表現が、文字列に対し一般にどういうサーチ動作をするか250字以内で簡潔に述べよ(配点60)
>>478 正規表現に対してBoyer-Moore法を適用する最適化があったはず
もちろん素のDFAよりも高速
indexで済むならindex使ってください、その最適化はプログラマにお任せします、みたいな感じだと思う や、/aaa/ =~ str と書いたら自動で str.index('aaa') が適用されるというのは素敵ではあるんだが
>>465 この結果を見るとincludeを使うのが一番早いって事ですか?
include? や index で済むような極めて単純なサーチ範囲内であるなら、それらのほうが高速
483 :
デフォルトの名無しさん :2011/05/28(土) 11:07:50.71
まぁ速度の最適化は後でやれ、な。
一週間後もinclude?が残ってる確率というのは意外と低い たいてい他の処理や正規表現に組み込まれて姿を消してるので、 どうせなら最初から正規表現前提で他のところに気を遣ったほうがいいと思う include?の速度でなければどうにもならないというなら、たぶん、Rubyで作るのが間違ってる
Rubyで日本語マニュアルがそろってるお勧めのGUIってありませんか?
IDEのことか? > GUI
>>485 残念ながらない
どれもオリジナルを英語で参照する根性が必須
>>485 JRubyじゃだめかい?Swingの解説なら日本語のもいっぱいあるし
最近 n == 1 ? 1 : n * (n-1) みたいなのを (n == 1) ? 1 : n * (n-1) と書くようになった。なんとなくこっちの方が読みやすい気がする。
490 :
uy :2011/05/28(土) 14:50:10.62
def ifelsereturn a, b, c a ? b : c end ifelsereturn( (n == 1) , (1) , (n * (n-1) ) ) module Kernel def ifelse a,b self ? a : b end end n = 0 p (n == 1).ifelse( (1) , (n * (n-1) ) )
[ [1,2,3], [4,5], [6,7,8,9], [10] ] こういう入れ子の配列から、 [ [1,4,6,10],[1,4,7,10],[1,4,8,10],[1,4,9,10], [1,5,6,10],[1,5,7,10],[1,5,8,10],[1,5,9,10], [2,4,6,10],[2,4,7,10],[2,4,8,10],[2,4,9,10], [2,5,6,10],[2,5,7,10],[2,5,8,10],[2,5,9,10], [3,4,6,10],[3,4,7,10],[3,4,8,10],[3,4,9,10], [3,5,6,10],[3,5,7,10],[3,5,8,10],[3,5,9,10] ] みたいな形で、内部の各配列からひとつずつ取り出して組み合わせるすべてのパターンを取り出すのに、 簡潔な記述方法はありますか? 大本になる配列の要素数は今回は4ですが、実際は不定です。 全てのパターンが取り出せれば、最終的に出てくる配列の中身の順番はどうでも構いません。
>>491 その行為を一発で表現する数学的な言葉があるなら、もしかしたら誰かが用意してるかも
493 :
デフォルトの名無しさん :2011/05/28(土) 15:03:49.32
[... ].inject(&:product).map(&:flatten) あってるかな?
494 :
デフォルトの名無しさん :2011/05/28(土) 15:04:20.58
直積 ね。
今のところ、こういうメソッドを作って強引に実装しています。 def combi(arys) result = [[]] arys.collect{|ary| ary.collect{|i| [e]} }.each{|addary| result = add(result, addary)} result end def add(baseary, addary) result = [] addary.each do |addvalue| baseary.each do |ary| result << ary + addvalue end end result end
組み合わせ(combination)かと思った p [[1,2,3], [4,5], [6,7,8,9], [10]].flatten.combination(4).to_a => [[1, 2, 3, 4], [1, 2, 3, 5], ...]
数学関連は頑張った人がいたんだっけか
productを教えてもらったのはいいけれども、 実際に動かす環境が1.8.5なので結局自分で実装して使うことになりますた。 とほほ。
Ruby1.9で動作するGUIって早いですか?
>>489 俺はむしろ
(n==1 ? 1 : n*(n-1))
だな
502 :
デフォルトの名無しさん :2011/05/28(土) 19:20:27.74
GUIで一番遅いのは「人間」
>>502 マシンが十分速ければそうだろうが
現状まだまだだわな。
Rubyの場合GC問題があるから複雑なGUIは避けたいところ。
大して凝らない、Webレベルで実現できるようなGUIなら
TitaniumDesktopで十分だし。
rubyinstallerでインストールしたのにfxrubyが入ってない これでインストールしたらfxrubyは最初から入っているって説明してるサイトに騙された
インターネットは真実だけでもないし。 本屋に逝って紙の世界に戻ったら。
>>504 いまさらFOXなんかでプログラミングする羽目にならずに済んでよかったじゃないか
とか言ってみる
今は gem install fxruby による別途インストールが必要
が、うまく動作しないかもしれない
教祖と同じデビアンにするのが確実。
GUI作るなら何がいいの?やっぱC#か
C#は使うなって教祖がいってた
RubyでMIDIを鳴らすことって難しいですか?
midiファイルを再生するのではなくmidiメッセージを送信して音を鳴らすという事です
>>508 WindowsでやるならWindowsを作ってる人が作ったものが確実
即コケしておらず、普及に全力で、言語センスが妥当な上、実際に使いよい
複数の言語を学ぶと死ぬとかそういう不思議な人じゃない限り問題ないっしょ
>>510 サウンドドライバに直接アクセスする根性があるか、OSがなにかAPIを提供しているか、
コマンドラインの再生プログラムがあるなら可能
Rubyは言語としてそれに関与はしないし、演奏するような第三者ライブラリも存在しない
midiファイルそのものの編集はできるっぽいんだけど
よくあるチャンク式のバイナリだからフォーマット調べれば編集ぐらいはできるよね。 mmlコンパイラなんかも書けると思う。
それいいですね でも僕の環境だとサンプルのmelody.rbを実行しても音が鳴らなくて文字列が出力されるだけでした ライブラリを使わないとなるとAPIを叩かないといけなくなりますよね、やっぱり midiは難しいなあ
なんでrubyは公式でwindows向けを出さないの?
windows買うお金がないから
リソースが足りない
>>516 他のOS向けもバイナリは置いて無いから、Windowsだけに限った話ではないわけだが
520 :
uy :2011/05/29(日) 02:13:56.25
WindowsならMCI触ればすぐ演奏出来るだろJK 10分でCでdllかいて5分でRubyにリンクできる WinAPIすら触った事ないんだな・・・・・・・・・・・・・・・・・・・・・・・ それかゲーム系のライブラリに頼れよ wav、midiはたいていどれも演奏できる
そういうときにしれっと15分で書いたソースを持ってくればイケメンなのに
522 :
uy :2011/05/29(日) 02:35:56.94
uyさんはコテハンな上に一見偉そうな発言を繰り返してるから 第一印象は良くなかったんだが 最近、実は良い人なんじゃないかと思えてきた
単に頭が弱い 普通の発言するときくらいコテ外しゃいいのに
スレはコテが散見される方がおもしろいよ
そりゃスレによるw
midiファイルを再生する事とMIDIメッセージを送信して直接鳴らすのはイコールじゃないのに何言ってんだ
>>527 何書いてあるかわからないけど、それを実感したなら今後はレスごと表示させないことをお勧め
質問する人へ:
そんなわけで、何か間違っていてもそのレスが誰にも読まれず誰にも訂正されないので、
あれは常に間違い続けています(そして、誤りに気づく術すら、構造的に持ちあわせていません)
決して参考にしないでください
>>528 MCIでMIDIコントロールできないって事
ruby1.9.2で、 97.chr => "a" と、文字コード→文字にするメソッドは知っているのですが、逆に文字→文字コードとするメソッドを教えて下さい。
irb1.9> p "a".ord 97
わかりました。ありがとうございます。
"a".getbyte(0) はだめか
ordって何の略かわからんぬ
>>534 ordinal
序数
正確に表現した結果わかりにくくなってる好例
まあ、Rubyが決めた使いかたじゃないから仕方ないんだけど
>>515 自分の環境に合わせて書き代えれば動作しそうな気もする
538 :
uy :2011/05/29(日) 16:50:52.86
訂正するやつはソースコードで語れよ… 中学生でもできるレスはいらねえ……… midi慣らすなんてMIDIファイルの中身しってりゃファイル読めた時点で物理的に可能なんだけどな…… 携帯じゃぐぐれないが、midiならすなんて5分で調べてdllかいて2分でリンクできる…………… WinAPIすら しらないんだな………
a.txt (10byte)があります Rubyでa.txtの内容を読み込みます 次の日、a.txtに文字列を追加します a.txtは13byteに増えました(+3byte) Rubyでこの3byte分だけ取得する方法ってございませんか? 13byte読みに行くのではなく、転送量を減らしたいので3byteだけ取得したいのです
IO#seek か IO#sysseek
>>538 さっきのソースコードうpには感心したので
ぜひもう一度質問に合ったサンプルを上げてほしい
MIDIメッセージを送信するってやつね
>転送量
というのが若干気になるが、基本は
>>540 読み込み開始位置を11バイト目にセットして、そこからreadとかで3バイトだけ読めばいい
ふつーのファイルシステムの上での場合だけどな
もしHTTPとかを経由しているとサーバが差分取得を許可してるかどうかがポイントになって面倒に
>>543 close関数追加
// close
int _export uy_midi_close( void ){
midiOutReset(hMidiOut);
midiOutClose(hMidiOut);
}
>>543 >>541 は別に煽ってるわけじゃなく素直に感心したんだと思うよ
コード示せば言い訳きかないから
>>543 答えてくれてありがとう
参考にさせてもらうよ
Ruby1.9.2です 時刻の比較がしたいのですがアドバイスお願いいたします ifのところでエラーになりました t = Time.parse("2011/05/29 21:05:30").class n = Time.now if n >= t then puts "時間です" else puts "まだ大丈夫です" end
548 :
デフォルトの名無しさん :2011/05/29(日) 21:07:04.45
>>547 t = Time.parse("2011/05/29 21:05:30").class
ってしちゃうと、tにはTimeというクラスが設定されちゃう
t = Time.parse("2011/05/29 21:05:30")
にすればうまくいくと思うよ
ロケール依存にならない?
日時文字列にタイムゾーンが明記されてないから、システムのタイムゾーン依存になるかも t = Time.parse("2011/05/29 21:05:30 +0900") ならいいのかな?
>>533 String に getbyte setbyte メソッドなんてあったのか
知らなかった
るりまにも載ってねぇ
#coding:cp932
a='あ'
p a.ord # => 33440
p a.codepoints.first # => 33440
p a.getbyte(0) # => 130
p a.bytes.first # => 130
なんでエラー吐いたときにエラーメッセージを書かないんだろ 最近多いね
>>553 の指摘は意外と根深い
「解決のヒント」とかいう名目で表示するようにすればいいのかもしれない
VisualRubyって開発停止してますか?
557 :
デフォルトの名無しさん :2011/05/30(月) 12:45:13.30
VisualuRubyのこと?
a〜zのアルファベットで1桁から4桁まで全て出力する方法って簡単にできませんか? PHPで書くと <?php for ($i="a"; $i<="zzz"; $i++) echo $i."\n";?> でa〜zzzzまで全て書き出せるのですがRubyだと実装難しいですか?
559 :
デフォルトの名無しさん :2011/05/30(月) 13:09:56.49
puts ('a'..'zzzz').to_a puts(('a'..'zzzz').to_a) 括弧の取り扱いの問題があるので、ptus の直後に空白を入れるか、 誤解されないようにもう1つ括弧をつけること。
560 :
デフォルトの名無しさん :2011/05/30(月) 13:26:21.28
('a'..'zzzz').each {|s| puts s} のほうがメモリに優しいか。
Rubyだと綺麗に書けるんですね 勉強になりました
562 :
デフォルトの名無しさん :2011/05/30(月) 14:09:05.59
'あ'..'んん' はそれっぽかったけど、 'α'..'ωω' でやったら途中によく分からない文字が。 文字入力ツールで見たら一応ギリシャ文字ではあるらしいけど。
じゃあおれもクズだぜ!
みんな屑だからrubyなんて嵌り込んじゃう訳でw
566 :
うゆ :2011/05/30(月) 20:22:31.06
一応文字ツールでみたらギリシャ文字ではあるらしいけど(キリッ) プログラマさんてすごいですね!! ギリシャ文字よめるんですか!!!(キリッ)wwwwwwwwwwwwwwwwwwww
だいたい一文字一音対応の表音文字をちょっと調べて読めないのは相当アレだと思う。 意味はわからなくても文字自体はすぐ読める。
568 :
デフォルトの名無しさん :2011/05/30(月) 22:45:46.97
>>566 読めなくても、ツールの同じグループの中にあることはわかるんだよ。
569 :
デフォルトの名無しさん :2011/05/30(月) 22:47:41.06
ガーン、よく見たら、「ギリシャ文字およびコプト文字」で1グループだったぜ。 コプト文字ってエジプトだっけか。
570 :
uy :2011/05/30(月) 22:59:08.68
>>569 ップゲラッチョwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ねえねえ今どんな気持ち?wwwwwwwwwwww
uy程度のコテハンに揚げ足取られちゃってどんな気持ち?wwwwねえねええwwwwwwwwwwwwww
>>569 コプト語(4世紀以降〜17世紀ぐらいのエジプト語)を記述するために
ギリシア文字にいくつか文字をつけくわえたのがコプト文字
572 :
デフォルトの名無しさん :2011/05/31(火) 01:33:56.79
揚げ足…取れてるか?
日本人ってホント1バイト文字の認識能力無いのがよくわかるスレ。 英数26+記号しか無いと思ってるよねw
574 :
uy :2011/05/31(火) 04:39:08.31
575 :
uy :2011/05/31(火) 04:41:09.55
可愛い女の子だけ大歓迎です
キモイんだよ鼻デカブサイクwww
>>573 αがいつから1バイト文字になったのですか
まさかキャラクタセットの理解なしにそんな話を…いやまさか
焼肉屋にあったらありそうだな<コプト
579 :
うゆ :2011/05/31(火) 05:23:37.97
うゆにかまう奴もいい加減にしろ 隔離スレでやれ
英数記号以外を「1バイト文字」として認識するのは危険ですな。 近頃はやりのUTF-8でも1バイトなのASCIIだけだし、マルチバイトだと思っておいた方が安全。
ギリシャ文字はたまたまISO-8859-7なら1バイトだけど、それはISO-8859-7だけでのお話 「日本語は2バイトだ」と同レベルの、現在となってはかなり恥ずかしい間違い
Windows Rubyで特定の処理を10ミリ秒ごとに鳴らしたい場合、正確に10ミリごとに動作させられますか?
>>582 Win32APIのSleep関数でも使ってみたらどうだろう。
スリープの精度はOS依存だから難しい問題だね。
日本語が一バイトの時代ってあったっけ? 元から二バイトだろ。その為に漢字ロム積んでまともな速度になる様にしてたんだし。 リアルタイムosでもないかぎり正確さは保証はされないと思うよ。
どれぐらいの正確さを要求するかによる。 あと極端な話スラッシングが起きてるような状態でも正確な動作が継続されることを望む?
半角カタカナが日本語ではないという説は初めて聞いた
まだ半角仮名使ってる馬鹿が居るのか。 jis規格満たしてないから使えないぞwww
>>584 半角カナは昔1バイトで扱われてたし、
日本語が2バイトってのは「2バイトで表現できる」ってだけで、UTF-8だと日本語の文字は3バイト使うね。
>日本人ってホント1バイト文字の認識能力無いのがよくわかるスレ。 >英数26+記号しか無いと思ってるよねw >日本語が一バイトの時代ってあったっけ? >まだ半角仮名使ってる馬鹿が居るのか。 >jis規格満たしてないから使えないぞwww なんだただのキチガイか
負荷が全然かからない処理なので3〜5ミリで処理は終われるようになってます たとえスラッシングが前の処理が終わらなくても10ミリ間隔で実行できればかまいません スラッシングがおきたときは手動で終了させます Windows7 64bitだとスリープの精度がよくなってたししますかね
タイマー設定の精度向上はMediaplayerが入ったあたりで追加されたんだったかな
11ミリ秒や9ミリ秒になったら死ぬ、みたいな場合はWindowsに降りて操作したほうがいいと思う
基本的には ループ始点 時間計測しながら処理 (繰り返したい間隔 - 処理にかかった時間)だけ停止 ループ終点 正確に10ms刻みで動作させるってのがどの言語使っても大抵はめんどくさくなるような処理だし。 大げさでもいいならいっそRuby/SDLのfpstimer使えばいいんじゃないかしら。
595 :
デフォルトの名無しさん :2011/05/31(火) 18:36:29.90
>>595 すっかり終わった話題であるはずの
>>590 の書き方が気になるという人はたぶんこの世に一人だけだと思う
何か図星だったみたいねwww
「自分の発言で相手が図星を突かれた」と思い込む人よくいるよねー。
>>590 は自分だけど
>>596 は別人でありまする。
rspecでいい? shoulda がいいかな?
>>599 RSpecでいいならRSpecで
Shouldaはassert_equalタイプが(教育的コストなどの点で)好ましいという場合に使う
ライブラリを公開したとして、開発者が集まりやすいのはtest/unitかShouldaなんじゃないかね
Dateクラスを継承してMonthクラスを作り、+演算子をn日後でなくnヵ月後(>>と同じ動作)にしたいのですが class Month < Date def +(n) self >> n end end としたところ、Dateクラスの>>メソッド内で+を呼んでおり循環してしまいます。 どうすれば+(n)でnヵ月後を返すようにできるでしょうか?
602 :
uy :2011/05/31(火) 23:02:54.34
わからないから そーす全部うp
>>601 継承せずにインスタンス変数で持たせて
同様のメソッドを持たせるとか
枝葉から根っこに向かって継承させるとは斬新
言語つかプログラムになれるまで継承とか、演算子オーバーロード・ライド使っちゃあかんよ これらはプログラミング極めた後に、更なる効率的な管理を考えるときに使う機構 なくても作れる 1万行とかいうソースさえも扱ったこともない & 想像すら 出来ない子が、サンプルみながら練習しようと無意味
1万行ってどんなことをするときに書くのですか?
そもそもDate#<<は動作がキモすぎる
はともかく
>>681 ・ Month クラス自体、存在意義がまったくないので、Month#+ を使うのを諦めて Date#<< を使う
・ てきとうな alias を作成してお茶を濁す
irb> class Date
irb> alias :proceed :>>
irb> end
irb> puts Date.today.proceed(1)
2011-07-01
・ インスタンス変数に入れておいて、なんか適当な操作メソッド作る
class C
def initialize
@today = Date.today
end
def mon_plus(n=1)
@today >> n
end
end
rubyで一万行も書くなら、cやjavaでちゃんと作れと思うなw 小刀でログハウス作ってる様な無茶を感じる。
Rubyで一万行ってなにやってるんだろう……。
Rubyを使うこと自体が目的なんじゃね?
なんかあるかなと思ったが $ cat `find mail-2.2.19/lib/ | grep "rb$"` | grep -vE "#|^ *$" | wc --lines 15347 ふむ
find -name foo -exec bar | baz ... とかでよくね? と思ったがそっちの方がわかる人間が多いか。
find のオプションは進化の悪い例 とってもアリガチなんだけど、悪い例だ
>>615 そのページの文字コードはEUC-JPだね。
コマンドプロンプトに表示したいならどうせtosjis使うから気にしないでいい。
require 'kconv'
しておいて
puts Kconv.tosjis(doc.body)
そのdocにはヘッダが含まれるからhtmlの部分だけ取り出したければdoc.bodyしないといけない。
でもそのアクセスの仕方だとクエリが含まれないから株価データは返ってこないね。
uri.pathの代わりにuri.request_uriを使うといいよ。
余計なお世話かもしれないけど、その様子だと取ってきたHTML出力するだけで解析とかできなそうだし、
ちゃんとした本でひととおり勉強してから実際のプログラムの作成に入った方がいいんじゃないかなあ。
それより調子扱いて取得しまくってるうちに鯖の管理者にdenyされて同様に情報取得してるお仲間さんもろとも困ることになりそうだw あと業務妨害でも訴えられたりするみたいね。ほどほどに。 まあ複数情報元からの取得が基本だけど。
エンディアンを判定しようとして以下のコードを書きましたが LE,BEどちらを読ませても、"BE"に落ちてしまいます。 何が悪いか分かりますか? ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32_100] f = File.open(filename) f.binmode lines = f.read bom = lines[0..1] if bom == "\xFF\xFE" p "LE" else p "BE" end どうやら、packなるものを勉強しないといけなさそう だけど、リファレンスみてもピンとこない・・・
>>616 ありがとうございます。しっかり表示されました
楽しいruby読んで勉強中なんですが、
ちょっと、実際に試したくなってやってました
解析等は22章にあるようです
今17章なので続きは読んでから進めてみたいと思います
>>618 f.closeしろ
というのはおいといて
UTF-16BE
UTF-16LE
UTF-16
の三種類あるのはわかってる?
ダウンロードできるHTML版のマニュアルってないんですか?
>620 BOM付のBE,LEについて、p bomすると以下が出力されます。 結果の説明が足りてませんでした。 "\xFE\xFF" "\xFF\xFE" >621 文字が長くてカキコはじかれたことがあるので、コードはエッセンスだけにしています。 closeしても期待通り動いていません。(コード等が足りないなら教えてください。) 種類理解しているつもりですが、今回の趣旨ではないと考えています。 BOM付のUTF16を判別したいと考えています。 知りたいのは、判定処理が正しく動かない理由になります。 ちなみに、1.8.6で試したら動きました。さらに??です。
>>623 >新しいのはHTMLはないから
>旧版の最新内容のHTMLにして固めたものはないと思う
そうですか、では諦めます
>欲しければ巡回ソフトで
すこしリンク見ただけですが、メソッドがひとつのHTMLになってるので、
サーバへのアクセス回数は数千回になるはずですよね
そういう手段を初心者スレで安易に他人に勧めるものではないと思います
>>625 Ruby1.9.x の String[0..1] は「先頭2バイト」ではなく
「与えられた文字エンコーディングで考えるところの先頭2文字」
>>626 >メソッドがひとつのHTMLになってる
そんなことはない
(めんどくせぇ…!)
>>626 だーいぶ前にもマニュアルはサーバから全部持って来いというレスがあったんだが、
たぶん言ってるのは同じ人で、たぶん実際には試してない
>>628 手元に1.9.2のchmが分解されたものがあるよ
$ find .chmsee/bookshelf/01bc1c1fc37aeaf2a9d23bbd7d0a7499/method | grep html$ | wc -l
11107
ということでめでたく1万ファイルオーバーだと推測
まあ、回答で動かないコード書くような人もいるとこなので… なんのためのirbなのかと…
zipしておいといたほうがいいレベルだな。 巡回して取ってこいとは言えないレベルだわw
>>634 それ新マニュアルでしょ?
旧マニュアルの話だよ?
>>636 既に旧マニュアルに価値はない
「読みやすいが内容古い」と「読みにくいが内容新しい」で天秤して、「内容古い」が負けた状態
>>627 bomに入るのは、UTFで与えられた先頭2文字、
ということでよいでしょうか?
p bom.size # => 2
となりました。
"\xFE\xFF"と記載すると、UTFとはことなるBOM表現だったり
するのでしょうか。
言われていることがよく理解できませんでした。すみません。。
>>640 ファイル数三万とか何事かと思う
旧版みたいにクラスでまとめてくれよ……。
>>618 str = File.open(filename, 'rb'){|f| f.read}
if str.start_with?("\xFF\xFE")
p "LE"
else
p "BE"
end
1.8.6 では動作しない
マニュアルといえば、riとかまったく動作しないんだけど、使うのになにか初期設定とかいるのかな $ ri String Nothing known about String rvmでインストールしたら動かないの?
ruby -html -ichimai とかw
>>642 in `start_with?': incompatible character encodings: ASCII-8BIT and Windows-31J (Encoding::CompatibilityError)
1.9.2です。こんな関数あるんですね。知りませんでした。
>>639 >>618 >if bom == "\xFF\xFE"
の"\xFF\xFE"がまずい
Windows日本語版だとスクリプトエンコーディングが
デフォルトでWindows-31Jになってて
ASCII-8BITの文字列とWindows-31Jの文字列を比べてるので
7bit外の文字の比較が常に偽になっている
#coding:Windows-31J
bom = [0xFF,0xFE].pack('C2')
p bom
p bom.encoding
p "\xFF\xFE"
p "\xFF\xFE".encoding
p bom == "\xFF\xFE"
p bom == "\xFF\xFE".force_encoding('ASCII-8BIT')
新リファレンスのchm版は、内容が新しいのはいいんだけど、若干読みづらいと思う 旧リファレンス時代にあった有志配布のchm版みたいなのがほしい
>>640 システムリソースに対してファイルが多過ぎるとルックアップが激烈に遅いということが理解できなかったのですよ
rubygemsと本質は一緒
あの一見妥当なディレクトリ構成は、もう少し要素が少ないかもう少しマシンスペックが高いかするときにのみうまく動く
なにか検索したいと思った場合、全文検索なんて必要ないんだから、もうちょっとやりようはあったんじゃないかと もし全文検索が必要だというのなら、それは単にその項の外部参照リンクかコードサンプルのどちらかが足りないのよ Foo#bar について検索した結果に必要なものは、 Foo#bar そのものの説明と、それに関する他のメソッドのリンクと、Foo#bar を使ったコードサンプルの3つ 他のメソッドやクラス概観の解説やコードサンプルで Foo#bar または bar が書かれている部分が必要になることはない、はずだ
>>650 ASCIIコードを扱うクラスやメソッドが知りたいので検索しましたが
「ASCIIコードというクラスやメソッド名は存在しませんでした」とか言われましたどうすればいいですか
riが売れなかったのは、クラスやメソッド(の一部)をあらかじめ知っていて指定しないといけなかったからだと思うの
静的HTMLが提供されてれば検索の要求が出るのは普通だし、うまい案がないというのも確かなのだと思う
>>648 chmはただで作れるから、chmを分解してhtml化してから作り直すとかして自分で作ったら?
メソッドごとのhtmlのせいでファイル数が某大なのがあれならパッケージ版が何やってるか調べて、
クラス毎にまとめたhtmlだけ用意してchm作るとかさ。
って、初心者スレで要求することではないな。
静的HTMLは動的生成のコストがつれーわーマジつれーわーだから欲しいんだよね 自前で静的HTML生成させたらメモリ不足で吹っ飛ぶ、搭載メモリ500MB未満の環境のことも考慮して頂けると嬉しいです
>>643 そもそものデータ自体が生成されないみたいね
rvmではriは使用できない模様
オブジェクトは必要なくなったらすぐ捨てて定期的にGC.startすればいいんじゃないかしら。 HTML一枚生成するだけでメモリがいっぱいになるわけじゃあるまいし。 (HTML一枚生成するだけで飛ぶようならそんな環境でブラウザ開きながらRuby走らせようとするな) 時間はかかるけどメモリ足りないんだから仕方ないよねー。
>>655 RubygemsやBundlerみたく、必要なデータかき集める時点でメモリオーバーかもしれないぞ
スクリプトの全部が全部、メモリ利用を気にして逐次実行を行なってるわけじゃないし
超でっかいデータ.each do{...} は、どこでどうGCを噛ませても超でっかいデータぶんのメモリ増大は防げない
余談だけど、配布のダイナミックなんちゃらは単体で静的HTML生成ができる
bitclust/tools/bc-tohtmlpackage.rb だかなんだったかを実行
書き出すディレクトリの指定が必須だったはずなのでソースかヘルプ見れ
めんどくさいなあ CPU1個やメモリ2GB未満の場合はRuby使用禁止とかにできない?
>>656 超でっかいデータ.eachが発生するって、それは全ファイルを一旦メモリに読むような、
メモリ不足環境としてはあってはならないバカなことをしてるからじゃあ……。
>>657 今のcrubyはCPU1個しか使ってなかったはずなので、それは薮蛇のような
>>658 たとえば、今話題に出てるbc-tohtmlpackage.rbはそれを制御できない
初心者が 窮乏環境で Rubyを使うな でおk 上級者なら設計やアルゴリズムを工夫してメモリを節約しながらLL使うこともできるけど、 LLはほっとけば湯水のごとくメモリを消費するから、 そんなちょっとのことでメモリがいっぱいになって飛ぶような環境ではまともなスクリプトは書けまい。
>>659 いやいや、窮乏環境でメモリアンフレンドリーかもしれない人様のスクリプト使う時点でなにかおかしいと気づけよ。
httpclientかなんかで簡単にformの値を取得する方法ってありますか? とりあえずhtml取得して正規表現をかけるくらいしか思いつきません
変換スクリプトひとつでメモリ300MB以上使ってるのも正直どうかと思うが
いやデータ量依存なんだけど
>>662 Mechanize
>>663 メモリ10GBが当たり前の時代にたかが300MBで文句言うとかありえん
Ruby1.9ってUTF-32のNKF.guessやめちゃった? NKF.guess "うまいつゆ".encode('UTF-32BE', 'UTF-8') => #<Encoding:US-ASCII> マニュアルにも返す候補として書いてないような
UTF-32とか使わないからどうでもいい
推奨環境が示されるべきだという話はときどき聞く CPUが3GHz相当、メモリは2GB、HDDの空きは…いや、これはどうもいいか
10GBが当たり前のじだいじゃねえよwwwwwwwwwwwwww
>メモリは2GB 情弱貧乏人は帰れ いやマジで
メモリは2GBぐらいの人が多いんじゃないかな。
メモリとSSDを誤解してる説をおしてみる まあどちらにしても、Rubyのための物理メモリの空きは1GBから2GBくらいは欲しい rubyと各種gemが全部ロードされ、生成データが全部乗ってなお余る状態が必須 だいぶ前にBundlerが重いというレスがあったが、たぶんそのマシンはもうRuby実行に向いてないんだ
>rubyと各種gemが全部ロードされ いやさすがにそれが無理なマシンは現役になってないだろ… ライブラリやスクリプトが取り扱い確定のデータの大きさのほうが問題なのだと思う まあ、今回で言えば「静的HTMLの生成には空きメモリが500MBくらい必要です」 というDOS時代っぽいコメントがついてれば問題なかったのではないかと
っていうか情強(っていうの?)ほどこまいマシン多く持ってて、 256MBとか512MBとか、メインマシンでも1GBとか2GBとか、多くて4GBだったりするよね。 ハイエンドのモンスターマシン持ってるのは情弱と情強の中間ぐらいの人
てゆーか、消費メモリの測定ってRubyではできないんだよね これはプロファイラで表示されるべきだと常々思ってるんだけど、どうにかならないかしら
そこはわざと実装してないかと。 結局インタプリタはメモリ喰いと言う時点でrubyを避けるべきだもの。 cやアセンブラなら少ないメモリでもサック策に行き着くw
>>674 消費量の監視は環境依存になっちゃうから組み込みみたいなのではダメなんじゃないかな
677 :
デフォルトの名無しさん :2011/06/02(木) 13:04:28.11
jrubyならJMX使えば可能なのかな?
>>677 JMXでもjheapででもなんとでもなるだろうね。
さらにWeblogicのJRockitVM使ってるならMissionControl使ってスレッドもヒープも追えるし
リークしてるオブジェクトの参照を辿ったりできるしで。
rubyという実行ファイルが消費(というか、確保)してるメモリの量はOSに調べてもらえばわかるんだけど、 どっちかっていうとオブジェクトのメモリサイズみたいなのが大雑把にでもわかると嬉しい なんとかなんないもんすかね
最初に上限宣言しとくと越えようとするとエラーにしてくれるのでもいいね。
もうPHP使えよ
GC.start
PHPのHTMLマニュアルはたしかに見やすいな あれと同じレイアウトにしてほしいですわん
RubyがインストールされていないPCで動作させたいのですが コードをexeにする方法ありませんか?
685 :
デフォルトの名無しさん :2011/06/02(木) 23:12:14.08
exerb とか、他にもあった気がする
ありがとうございます exerbなどを利用してexeにして実行した場合、速度は落ちたりしますか?
落ちる Rubyのexe化はすべて 「ruby.exeとライブラリをzipでまとめて配布しておき、exe実行畤にzipを展開してruby.exeに渡す」という概念に沿ってる zip展開に相当するものが毎回あるぶん、どう足掻いてもオリジナルより遅い
>>687 横槍なんだけど、起動に時間がかかるだけ?
それとも実行自体の速度も落ちる?
>>688 読み込みパスとかがあるし、ruby.exeだけではほぼなにもできないのでそういうのは無理
ファイル配置をめちゃくちゃ精密に行なえば可能だが、それを行なってくれるのがexe化
exe化は手間の削減のためにのみ行なう
実行速度がどうしても必要でRuby実行環境がインストール不可能なのなら、Ruby以外ではりきってどうぞ
>>689 気にしたこともないけど、まあ、リクツ上はそれほど変わんないんじゃね?
exeの中からライブラリ用のファイルを探すオーバーヘッドだけが致命的
…いや、今Rubyスレ界隈でホットな話題であるマシンスペックにも依るけど、
別にそんなに遅いってわけじゃないんで試すだけ試してみてもいいかと
バイトコードみたいなのをexeにする、とかだとよかったんだけど、まあ、ないものねだり
時代がwebに移ってるしCとかC++を今から覚える気力がない
プログラミング楽しみたいのなら、Cはある程度読めたほうがいいぞ いやわりとマジで 自分で作れなくてもいいし、「Cであることは間違いないのだが何書いてあるかさっぱりわからん」とかいうレベルでもOK
>>691 あるいはjrubyでJava経由でネイティブコンパイルとかw
「Cであることは間違いないのだがこれ以上は何書いてあるかさっぱりわからん」 だった Cプログラムソースであることが判別可能なだけでは流石にどうにもならんw
猫でも分かるCでwindows apiで勉強終了
>>687 exerbは一時ファイル展開せずに
exeファイル内蔵のスクリプトを読みに行ってるはずじゃないか?
たまにはIronRubyのことも思い出してあげてください
>>652 あー俺もそれやってる
目次付き、1クラス1メソッドの自作chm
実際に作ってみると1クラス1メソッドも便利なんだけど、目次があるのがそれ以上に便利
なぜ今の新リファレンスchmにはちゃんとした目次がないんだろう
↓な風にライブラリを使う直前でrequireを書いてたら、 〜 require 'nkf' NKF.hogehoge 〜 「ファイルの上に書いとかないとだめだろ」って言われました。 意味が解かりません…。どういう意味ですか?
「ファイルの上に書いとかないとだめだろ」って意味だろ てか再現取れないからバージョンとソースを省略せずに書けよ
いや単純に
#!/usr/bin/env ruby
... えんえんとコードが続いたそのあとに
def foo
require 'nkf'
NKF.hogehoge
みたいなコードを書いて叱られたということだろう
>>700 requireはファイルの先頭に固めて書いてねってこと
nkf.NKF.hogehoge みたいな書き方はできませんか? requireめんどいです。
また叱られるだけだよ
いくつかの試行錯誤を経て、ユーザーが最初に読み込むファイルのはじめのほうに まとめて人力でrequireを書いとくのがいちばんマシという結論に至ってる まー、面倒かそうでないかで言えば、まあ、めんどいw 最初の1回だけなんだけどね
irb併用でなんとかしてたり
707 :
福盛俊明 :2011/06/03(金) 09:10:40.93
#!ruby -Ku とか書いてる(1.8の場合) もちろんこのままでは実行できないが、ぶっちゃけスクリプトの中身読まずに いきなり実行権限つけて ./hello.rb とかするほうが一方的に絶対的に悪・即・斬 お使いの環境に合わせて書き替えてご利用ください っていうか ruby hello.rb でいいじゃん問題起きないよ普通
envってなに?
>>709 1.9前提のコードには #!/opt/local/bin/ruby1.9 とか書いてるよ俺は
>>710 スクリプト言語全体に言えることだが、インタプリタのパスは環境によって違う
んでenvというコマンドは、その環境で設定されたパスを前提に引数に書かれたコマンドを実行する
…のだが、そもそもenv自体のパスが微妙に違う環境があったり
rubyのほうのコマンド引数の解釈に問題が出たりするから
素直にテキトーなパス書いて各自で書き換えるほうが実は面倒が少なかったりもする、という話
そのための-xオプションがrubyにあるので、 先頭行は/bin/shにするという技を使ってる。
>>713 Emacs は1行目を読んで、そのファイルが何のファイルかを決定しています
#!/bin/sh と書いてあったなら、sh-mode で編集を開始してしまいます
配布する際は 2行目に # -*- ruby -*- と書いておいてくださいね
そんな個々のエディタの為に配慮してたら切りがないなw java helloと比べると./hello.rbは楽でいいけどねえ。 xemacsのsumoみたいにrequire-sumoとか、require '*'でとりあえず全部読めって出来ても最近のスペックなら問題無い気もする。 javaでもimport java.*で楽する傾向だしw
>>709 実行する前にソース読め主義が高じるとgemだのaptだのすら使えなくなるわけで。
利便性の拡大のために一部に決めを作ろうってのは
よくある話だし仕方ないだろうさ。
さすがにEmacsでどうとかまでは配慮する気にならない
>>717 fileコマンドでPOSIX shell script text executableだと判断されるのはあまりいいことではない
いや、まあ、起動されるもの的には間違ってはいないんだが…
>>716 envの問題は
「これで利便性があがったと思ってるのは書いた本人だけで、全体的には利便性も可搬性も下がってる」
「ぶっちゃけ配布後にインストーラや人力で書き変えたほうが早い」
ということだと思う
ruby -Ku とかが動作しそうで実は動作しないってのはよろしくないわ
「env使えねー」というのは共通認識だと思ってたので、いまだに固執する人がいるのは驚き
>> 10.times.inject(['A']){|r,i|r << r.last.succ} => ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"] これより良い書き方有るかいな?
723 :
デフォルトの名無しさん :2011/06/03(金) 15:16:39.56
>>721 は「'A'とそのあとの10個」だけど、
>>722 は「'A'から'K'」で微妙に意味合いが違うかも。
アルファベットなら並びが分かってるから大差ないけど。
'A'
10回succした結果(リテラルではない)との配列が欲しいんだよね それでいいんじゃないかな
envとか環境変数に依存するのもどうかなと思うけどね。 作る側の手抜きにすぎない。
手抜きではない もともと過剰に手厚くユーザーサービスするようにはシステムができてないんだから無理無茶するなさせるな、が正確 たとえばrubygemsだと「Rubyスクリプトを実行するシェルスクリプト(またはバッチファイル)」を作成してくれる ユーザーに親切にしたいならこういうビッグウェイィィブに乗るべきだろう
>>719 ああ、先のレスは「ぶっちゃけ〜」以降のくだりへのレスな。
envがNGという話に異論はないよ。
まあ、インストーラで自動設定としてその場合の決めを作るとか、
ruby起動時に与えるオプションを起動後にも設定できるようにして
コマンド起動時には
ruby xxx.rb arg1 arg2
とかで済むようにするとかかなあ。
今だとソースの文字コードが起動時にしか設定出来ないんだっけか。
シェルが頑張ることであって、スクリプト作者がどうこうすることじゃないよね このファイルはrubyに-Kuオプションつきで渡してください、ということを指示できないとしたら、 そりゃ単にシェルの実行システムが悪いんだよ たとえばWindowsではこの問題は発生しない エクスプローラが問答無用で、スクリプト実行以前にrbファイルに関連付けが設定されていたruby.exeに渡すからだ まー、現状どうしようもないですというのが答えではある
>>729 Linuxのファイルマネージャでも似たようなことはできるよ
その場合はshebangがシェルによって解釈されることはない
rubyだけが読む
ターミナルからでも ruby -Ku foo.rb とかすればいいだけだし、
実行ビット立ててコマンドとして実行するというかなり限定された状況でのみの問題な気がする
'A'..∞ が簡単に書ければ
('A'..∞).take(10) とかできるだろうけど
def infinite_loop(n=0)
return enum_for(__method__,n) unless block_given?
loop do
yield n
n = n.succ
end
end
p infinite_loop('A').take(10) # => ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
むむむ
>>721 に比べて一個少ないな
初期値+10個 と 全部で10個の違いか
「一発実行」用のシェルスクリプトやバッチファイルを含めて配布してる人は時々見る たぶん、このへんの問題に翻弄された経験のある人なんだろう Rubyスクリプトファイルひとつだけで対処できるような話じゃないって実感があるんだろう てことで、次の方どうぞ
>>731 succに引数が設定できれば一発なんだよ
irb> class String; alias succ_orig succ; def succ(i=1); x = self; i.times{ x = x.succ_orig}; x; end; end
irb> p "A".succ
"B"
irb> p "A".succ(2)
"C"
irb> p "A".succ(10)
"K"
irb> p ('A'..'A'.succ(10)).to_a
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]
>>733 設定できればというか、succ メソッドは任意なので、したければ御自由にって感じではある
引数なしの succ さえ妥当に動作すれば文句は出ないだろう
今度 succ を定義する機会があったら引数取れるようにしてみようかな
でも ('A'..('A'[0]+10).chr) とか succ の内容見越して書いたほうが早かったり
shellなら単にalias ruby !/usr/bin/ruby -kuしとけばいいだけだな。 httpのContent-Type: text/html;charset=utf-8指定ぐらい乱暴だけど。
>>735 自分で作ったスクリプトを自分の環境で実行するときの話じゃないんよ
自分で作ったスクリプトを他人の環境で実行させるときのお話
Rubyでカラーダイアログを表示するサンプルコードを掲載されてるサイトってありませんか?
日本語環境でしか動作しない.appを配布しておいて今更w
Rubyはけっこうゴルファーに使われてると聞いたが どうやら本当らしいな
module A class B < ::C という記述を見たことがあるんですが、このスーパークラスCはどこにいるんでしょうか?
>>741 左辺なしの :: はトップレベルを明示する書き方なので
恐らくトップレベルで定義されてる
743 :
741 :2011/06/04(土) 22:06:20.14
eclipse3.42でruby1.87を使っているのですが、 プログラムを書き実行をするとき、ファイルごとに一つづつ、実行の構成から ファイルを選択しないとコンソールに表示されません。 JAVAをつかっていたときはF11キーを押すだけで選択して開いてるファイルを簡単に実行できたきがするのですが、 rubyの場合はどこの設定をいじれば、開いて選択されているファイルを簡単に実行できるでしょうか? よろしくお願いします。
スレ違いでした、すいません。
みんながエクリプスは使ってないだろう。
スクリプト言語はIDE使ったことないから分かりません
ネットを巡回していると、下記のようなサンプルを載せてくれてる方がいました。 ですが、3つ目がfalseになる理由がわかりません。 1つ目も3つ目もStringだと思うのですが、何故結果が違うのでしょうか。 irb(main):009:0> String.respond_to?(:class_eval) true irb(main):011:0> Enumerable.respond_to?(:module_eval) true irb(main):012:0> 'xxx'.respond_to?(:class_eval) false
>>749 1つめは「Stringクラス」というクラスそのものに対してclass_evalというメソッドを持っているかとたずねている。
対して、'xxx'はStringクラスそのものではなくて、Stringクラスのインスタンス。
クラスではなくて単なる一介のオブジェクトにすぎない。
クラスじゃない単なるのオブジェクトなので当然class_evalなんていうメソッドは持っていない。
RubyはみなさんどんなIDEつかっていますか?
秀丸(試用)
Geany
Rubyはどうやって勉強していますか?
>>750 emacs。
でも、それなりのボリュームがあるソースを読んでるとき、
自分がどのModuleやClassの定義を読んでるかわからなくなるときがあるんですよね。
1ファイル1クラスならいいんですが...
>>751 NetBeans
>>754 最初のとっかかりは書籍
あとはリファレンスとWeb上の記事などで独学
2年やったjava挫折して、楽しいRubyという本を買ってきて勉強してますが javaより手応えを感じています。
別に誰が何やろうがお前に関係ないだろ
760 :
757 :2011/06/06(月) 06:02:33.75
>>758 頭の悪い自分のだめさにいやになっていますが、言い訳はできないので、
できることをやるのみです。Rubyでは絶対挫折したくない。
どちらもクラスとオブジェクトの概念が理解できずに終わるかもな。 c言語のポインタとかアセンブラとか回り道してでもしっかり理解を深めたほうが確実かもね。
C言語のポインタが理解しづらいのは、は概念が難しいんじゃなくて、書き方が紛らわしいせい。
>>760 Rubyと比べるとJavaの方が「本質的でない難しさ」が多いので
挫折したことはあんまり気にしない方が良いし
Javaで挫折してRubyなら何とかなるというのは、特に変なことでもない
Rubyを習得できるなら、プログラムの資質にはそんなに問題ないと思う
>>761 Cのポインタ(正確には、ポインタのポインタの演算)を理解できるかどうかと、
オブジェクト指向の個々の実装を理解できるかどうかには直接の関連はない
761って別にポインタの理解とオブジェクト指向の理解を関係あるとは書いてないだろ。 どういう読解力だよ(笑)
>>761 >>764 のやりとりを見て「どういう読解力だよ」とか言っちゃう奴がどういう読解力だよ、と思いました。
767 :
デフォルトの名無しさん :2011/06/06(月) 12:06:43.63
配列のうしろに要素をn個追加する処理は、どう書くのがスマートですか。 今は n.times { arr << nil } としてるんですが、これだと「n回追加する」処理になっているので、 「n個追加する」処理が書けるのならそちらを使いたいと思っています。
>>767 ary.concat(Array.new(n, obj))
とか
ary.push(obj, obj, obj)
とか
ary.fill(obj, ary.size, n)
とか
まあnilだったらary[ary.size + n - 1] = nilとかやるだけで全部nil入るけど
ポインタなんて実際のcpuでは多用されてる動作じゃん。 土台の知識も無いのに上位概念だけ勉強しても雲の上状態で理解が進まないと思うけどな。 流れる雲の様にふわふわした人生送って来たpgが多いの?
>>769 お使いのPCに搭載されているCPUの知識はございますか?
はいはい、CPUを自分で作ってどういう仕組みになってるか知らないとアセンブラも使えないね。
こういうときにCPU命令ばかり話題になって半導体メモリの動作についてが蔑ろにされているのはIntelの陰謀だと思ってる 同じくらい重要なはずなのに
>>770 配列や文字列の+=いくない。
ary.push(*[nil]*5)
>土台の知識も無いのに上位概念だけ勉強しても雲の上状態で理解が進まないと思うけどな。 CPUの半導体の仕組みまで知らなくてもプログラムできるのと一緒。 土台の知識が必要なケースはまれ
Rubyやってる時点でCPUの話なんてどうでもいいよ Cとかアセンブラやってるわけでもないし
C言語あたりからすでにCPUの仕組みはどうでもいい。 Rubyならポインタの話もどうでもいい。
ていうか >ポインタなんて実際のcpuでは多用されてる動作じゃん。 という時点でどうにもならない あんな抽象化されたものを見てCPU動作語られてもマジ困る
プログラムを勉強するときはマシン語からってことで。
C:\wwwをドキュメントルートにしてHTTPサーバを立ち上げたいのですが コマンドプロンプトが固まってしまう動きません require 'webrick' srv = WEBrick::HTTPServer.new({ :DocumentRoot => 'C:/www', :BindAddress => '127.0.0.1', :Port => 9876}) srv.start コードは間違ってますか?
782 :
デフォルトの名無しさん :2011/06/06(月) 14:35:03.20
そのコードだとコマンドプロンプトはそのまま。ブラウザからのアクセスは出来るでしょ? バックグラウンドで動いて欲しいならデーモン化したりWindowsサービス化したり する必要があるんだろうけどWindowsの場合のことはよくわからんのでパス。
>>780 コマンドプロンプトが固まってしまうってどういう状態で?
[2011-06-06 14:37:56] INFO WEBrick ...
[2011-06-06 14:37:56] INFO ruby ...
[2011-06-06 14:37:56] INFO WEBrick::HTTPServer#start: ...
こういう感じの状態で固まるなら正常だよ。ブラウザから
http://127.0.1:9876/filename.ext みたいにしてアクセスしてみそ。
C:/www/filename.ext
にアクセスできるから。
ブラウザでアクセスしたら動きました 午前中動かなかったのでOSを再インストールしたんですが無駄のようでしたね
>>779 いっそVHDL/VerilogでCPUを合成してみるのがいいんでね?w
普通にフリップフロップと組み合わせ回路を理解してから合成言語に手を出すべき
もう許してあげて〜
789 :
787 :2011/06/06(月) 18:09:31.39
Linuxからだけど、「〜」は文字化けしちゃうんだっけ? ごめんね
Windowsでは~が普通
これのつもりで
>>787 のように〜を書き込むと不自然に映る
いわゆる波線としてはWAVE DASH 〜 のほうが正しいんだけどね FULLWIDTH TILDE 〜 を変形ダッシュの用法で使用してたことが本来おかしい
別にWindowsでも文字化けしないからどうでもいい
あれ、両方とも全角チルダになってる 〜 まあいいや 使ってる日本語入力ソフトでどっちが出るのかはチェックしてたほうがいいよ 次の方どうぞ
>>792 残念ながら、これはそういうレベルの問題ではない
Rubyでの文字エンコーディング変換エラーの50%くらいはこれが原因
それはまたエディタとかの問題だ
は?
797 :
デフォルトの名無しさん :2011/06/06(月) 19:20:39.62
〜 こっちはWindowsでも問題ないはず。 〜 こっちはWindowsだと表示が変かも。
5割もいかない
1度もない
>>797 それはどちらも"~"
問題になるのは"〜"
マカってホント情報弱者だな。
>>803 まあ、学校はきちんと行っておけという話だな
ここの人の最終学歴は大卒の人多いですか? 自分は高卒です。
806 :
デフォルトの名無しさん :2011/06/06(月) 20:56:23.31
これで両方同じになってたら、投稿時にバチスカが変換してるな… 〜 FULLWIDTH_TILDE のハズ 〜 WAVE_DASH のハズ
807 :
デフォルトの名無しさん :2011/06/06(月) 21:00:53.10
両方2ちゃんから返ってくるのはWindows-31Jの 0x8160 (FULLWIDTH TILDE)か。
おまえらって、ほんとバカ
なぜ文字コードはまともに統一できないのか。 統一しようとしているUTF-8ですらウンコという…。 少なくともUTF-8の次に統一する文字コード決めといてくれ。
>>810 UTF-8でいちおうの統一の方向性は打ち出されてはいるよ
UTF-8規格自体が引き起こす問題というのもあるんだけど、
実際は世界各地で実装した人が間違えた、または勝手に解釈した結果の実装バグが多い
表だってはいわないけど、アルファベット圏のOSS開発者とかではなんで俺たちが漢字コードとか めんどくせえことに付き合わなきゃなんねえんだよ、と不満に思っている人はいるよね。 MLとかでたまにでてくるけど。
813 :
デフォルトの名無しさん :2011/06/07(火) 09:09:06.47
>>812 C++のBoost.Localeでも英語メッセージが存在する前提での
メッセージカタログが標準になっちゃって悲惨なことになったらしいしなあ
RubyでHTMLの整形で有名なライブラリって何ですか? また、Rubyに限らずHTML整形ライブラリでメジャーなものってありますか?
815 :
デフォルトの名無しさん :2011/06/07(火) 11:55:36.65
「整形」の趣旨によるけどTidyとかそういう話なのかな
本家が出してるtidyが一番いいみたいですね ありがとうございます
実際、asciiでも困ってないだろう。 utf8に文句出すくらいならちゃんと英語の議論に参加してこいよって言われると思う。 国際会議ってそういうものだし。出席しない香具師は欠席裁判されて不利に成るだけ。 tppも先行合意している国同士でどんどん合意事項決まってるから、あとから参加予定の日本はそれに合意して参加するか参加しないかの行動しかない。 あとから蒸し返して日本の為に合意内容の変更なんて行動はまず認められない。
819 :
デフォルトの名無しさん :2011/06/07(火) 14:39:30.95
>>818 勝手に決められたものもあるという理解は必要
>>817 cygwinはRubyをインストールするためのものじゃない
cygwinの深い知識がないなら使うのやめとけ
822 :
デフォルトの名無しさん :2011/06/07(火) 14:48:07.48
まあ、日本だけでなくアラブ圏とかインドとか中国とか韓国とかの 「ASCIIのみじゃ困る人達」が今後多数派になっていくので、その点はあまり心配しなくていいよね。 あとunicodeは割と簡単に申請したり議論に参加したり出来るというか、 文字集合に旧カナ追加する提案したのは個人だし、 絵文字追加の議論での問題点をとりまとめて収拾したのは さらに別の個人だったりするし。
>>817 1.8.7のpachlevelが古いやつならsetup.exeで入れられる
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
rvmを使って1.9.2p180を入れることもできるけどあまり勧めない
そういやせっかくまとまりかけてたタイミングで韓国が俺のところの漢字もいれろ、とか言い出して 大混乱じゃなかったけ? ユニコードって。 自分の名前も漢字で書けない奴ばっかりのクセに。
それ以前に韓国独自の漢字(韓字?)ってあるの?
>>820 最初のUnicodeは思いっきり勝手に決まったからな
世の中そんなもんだ
俺らが日本語以外のマルチバイトをわざわざ公募して考慮しないのと同じ
827 :
デフォルトの名無しさん :2011/06/07(火) 15:35:57.45
>>824 それ、Han unificationの件をねじ曲げて覚えてないか?
旧カナの例のように、利用頻度が少なくても
必要性の説明がちゃんと出来るなら入るよ。
そもそも日本独自の漢字自体、輸入元の支那様にしてみれば漢字じゃねえよ!ってご立腹かもなw 初期の頃は日本国内ではユニコードに注目もしてなかったというより、jis/sjis/eucjで恒例の内輪主権争いしてたくらいだし。 そこはメールをjisに統一したワイドの人たちも海外の動向に食い込めてなかった。
世界中の文字を16bitの領域にマッピングしようぜ そんなアホな規格に賛同するわけないじゃん もちろん間もなく破綻して汚い拡張仕様を策定 ついでに古ハングル5000文字だっけ? を追加してハングルは別領域に移動、 以前のバージョンとの互換性? なにそれ美味しいの? 素性が悪すぎるんだよ とはいっても、現在じゃしっかり標準に それはさておき、正規表現で文字コードを指定する“s”などのオプションは 1.9以降でほとんど意味がなくなった気がする 文字列がエンコード情報を持ち、厳密に区別する仕様だと2chのログのように Windows-31J(CP932)と各社携帯絵文字が混在する超いいかげんなテキストの 処理で困る
俺も初めてUnicodeを知ったときはこれほど普及するとは思わなかったわ Javaが出てきたときもそうだったな
>>828 >そもそも日本独自の漢字自体、輸入元の支那様にしてみれば漢字じゃねえよ!ってご立腹かもなw
つーても輸入元は輸入元で、簡略化させまくってどうなのよって状態だけどな
その言葉が言えるのは未だに繁体字使ってる台湾とか、中国の一部だけだと思う
Javaは最初確かに最初おもちゃみたいだったな。ブラウザ上でちょっとアプレット動かして おしまいみたいな。 まだそのころの偏見というか、イメージが残っちゃってる。
834 :
615 :2011/06/08(水) 01:11:57.71
835 :
615 :2011/06/08(水) 01:13:34.10
ほとんど本のサンプル通りにやってみたんですが どうも文字コードの扱いがおかしいようです・・・ docからtd部分だけ取り出して表示するってやってるつもりなんですが 文字コードのところでエラーが出てるみたいです 色んなサイトめぐって調べてみたんですがちょっと分からなくて すいませんがお願いします
前にEUC-JPだって言われてるじゃん
837 :
615 :2011/06/08(水) 03:57:35.22
>>836 それも試したつもりだったんですが、今もっかいやってみたら出来てしまった
なぜだ・・・
ほんと申し訳ありません・・・。ありがとうございます
>>834 ひとつ
# coding:utf-8
だ
もうひとつ
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
はバグの元なのでスクリプト完成前に使用してはいけない
ホラ害とか他に何もなかった頃ならともかく今更参考にすんなw
そういうときは代わりにここをみろぐらい書くもんだ。
>>838 >バグの元なのでスクリプト完成前に使用してはいけない
望まれた新機能のハズなのに皮肉なもんじゃのう
まあ、機能的であることと初心者向けであることは同一じゃないか
入門者は敢えて機能を絞り込んだほうが理解しやすい。 何でも出来る機能充実だと、どうすればいいのか分からなく成るのが入門者。
標準的な名前のライブラリを作ってしまいそうな場合、どう逃げるのがいいのでしょうか? 例えばですが、2ちゃんねるのスレッドを取り扱うthread.rbを書いた場合、 $:の検索順位的には全く別物の標準ライブラリであるthread.rbを読み込んでしまいます。
>>843 Ch2::Thread とモジュールネストして ch2/thread.rb とディレクトリ掘って ch2.rb には require 'ch2/thread' と書く
これなら require 'ch2' でうまく動く
トップレベルのモジュールを作るのは必須に近い
それすら被ることも、まあ。gem間ではあるんだが
>>843 名前の頭か終わりに何かつけるとか、クラスをネストさせて下位フォルダに置くとか。
846 :
843 :2011/06/08(水) 11:44:33.77
>>844-845 requireで階層構造を書けると知りませんでした。
ありがとうございます。
847 :
615 :2011/06/08(水) 21:02:40.15
>>838 ありがとございます。大変参考になりました
また、つまったら質問に来たいと思うのでお願いします
848 :
615 :2011/06/09(木) 00:59:14.73
とりあえずデータ部分だけを取り出して、 2次元配列に格納するところまですすめました この配列データをcsv形式か何かで保存したいのですが どういった感じですればよいのでしょうか? require 'csv'してやるっぽいのですがよく分からなくて・・・
849 :
615 :2011/06/09(木) 01:07:58.29
とりあえず作ったものです。あんまりおかしい所があればご指摘お願いします # coding UTF-8 require 'rubygems' require 'open-uri' require 'nokogiri' require 'kconv' # データ格納用の2次元配列の初期化 height = 50 width = 6 stockdata = Array.new( height, nil ) # 各要素は、とりあえずnilで初期化. stockdata.length.times{ |y| # 要素の数だけ.. stockdata[y] = Array.new( width, 0 ) # 各要素について、new. }
850 :
615 :2011/06/09(木) 01:09:10.27
# ループ内の数え上げ変数
roop_count=0
i=0
j=0
doc = Nokogiri::HTML(open(
"
http://table.yahoo.co.jp/t?c=2011&a=2&b=28&f=2011&d=6&e=1&g=d&s=1554&y=0&z=8471&x=sb "),nil,"EUC-JP")
doc.css("small").each do |small|
doc_text=small.text
if /分割による/=~doc_text #株価データ部分が終わればループを終わる
break
end
unless /\d+/=~doc_text #文頭からの数値以外の部分は読まない
next
end
#株価データを二次元配列stockdata[i][j]に格納
#行データiはループカウントの商jはるーぷカウントの余りにあたる
i=roop_count.div(7)
j=roop_count.modulo(7)
stockdata[i][j]=doc_text
puts "stockdata[#{i}][#{j}]=#{stockdata[i][j]},roop_count=#{roop_count}".tosjis
roop_count+=1
end
あと、あんまりこうやってコードずらっと書かない方がいいですよね・・・
どうしたらいいんでしょう・・・
852 :
デフォルトの名無しさん :2011/06/09(木) 01:19:46.71
というか、コードを貼る必要なんかない Stringオブジェクトを中間形式としてライブラリ間で遣り取りできるということがわかっていれば済むはず AというライブラリからBというライブラリへデータを受け渡ししたい場合、 Bが受け付けるオブジェクトをAに書き出させるか、 Aが書き出せるオブジェクトからBが受け付けるオブジェクトに自力で変換すればいい 受け渡しに使われるオブジェクトはたいていStringかStringのHashかStringのArrayだ コード書いてる最中になんの気なしにputsして値確かめたりするが、 puts可能ということはそれは文字列(にto_sすれば変換可能)ということで重要な示唆だったりする 「さっきまでputsしてた文字列を他のライブラリに渡して作業続行」みたいな考え方をよくする それと、そのスクリプト書くのに参考にした解説はRuby的に役に立たないので今すぐ燃やして捨てろ
>アメブロの画像を一括ダウンロードする ruby スクリプト 絶対教えてやんねー手作業でダウンロードしろやバーカバーカと過去の職業倫理が囁いておる が、まあ、あのアメブロが損するだけなら別にいいか Rubyスクリプトなので、Ruby実行環境のインストールが必要 mechanizeというgemライブラリが必要なので、そのインストールも必要 正規表現の関係上UTF-8でないと動作しないので、スクリプトはUTF-8で保存しておく ていうかこのスクリプト、自動で止める方法がないんだけど そのサイトに存在する全ページを取得するまで止まらない 1週間後に新しい画像を取得しようとしても、また全ページをページあたり3秒かけて取得する 他のプログラム使ったほうがよくないすかこれ
>>855 今、Ruby192をインストールしました。(C:\Documents and Settings\user
rubygems-update-1.8.5.gemをダウンロードしました。(C:\Documents and Settings\user\Ruby192
ameblo_downloader.rbをダウンロードしました。(C:\Documents and Settings\user\Ruby192
コマンド開いたらC:\Documents and Settings\user>_ と出ます。
mechanizeのインストールコマンド教えてください。
たのしいRubyは色々言われているが、「Rubyとしての書き方」を最初から行なっているので価値がある
Rubyの配列は自動で増えるもので初期化なんて必要ないし(どこの方言?)、
配列自身に枚挙させるものでループカウンタなんて使ったりしない(ていうかループカウンタって何?)
>>849 # coding:UTF-8
require 'open-uri'
require 'kconv'
require 'rubygems'
require 'nokogiri'
#html = open('kabuka.html','rb'){|f| f.read} # ネットにアクセスしないで済むテスト用
html = open("
http://table.yahoo.co.jp/t?c=2011&a=2&b=28&f=2011&d=6&e=1&g=d&s=1554&y=0&z=8471&x=sb ").read
data = []
doc = Nokogiri::HTML(html.toutf8)
# <table cellpadding="5">なテーブルの2番目(1要素目[1])から<tr>を探し、0要素目を飛ばした配列[1..-1]をeach
doc.search('table[cellpadding="5"]')[1].search('tr')[1..-1].each do |tr|
# <tr>の中にある<td>を探して、テキストだけにしてカンマを削除したものを配列にしてdataに追加
data << tr.search('td').map{|td| td.inner_text.gsub(/,/){''}}
end
# タブ区切りのようなもので保存
File.open('kabuka.tsv','wb'){|f| data.each{|line| f.puts line.join("\t")} }
# 読み込みテスト
require 'pp'
pp File.open('kabuka.tsv','rb').readlines.map{|line| line.chomp.split("\t")}
てかCSVは読み込みや編集はともかく、 配列の配列を出力するだけならいちいちライブラリ使わないで File.open('name.csv','w'){|f| f.write(arys.collect{|ary| ary.join(',')}.join("\n")} とワンライナー書く方がはやそう。
RDocを使ってソースにコメントを残そうと思っています。 ですが、文章をHTML化するときにどのようにすれば修飾できるかの情報はあるのですが、 「引数はこのように記載する」「戻り値はこのように記載する」といったガイドラインが見当たりません。 皆さんどのようにされてますでしょうか?
>>860 あのねえ、それは数年来の検討課題なの
Rdoc以外だと、YARDというのがあって、以前はへぼかったんだけど最近はそれなりに見やすい
# Encodes a set of key/value pairs according to the rules for the
# <code>application/x-www-form-urlencoded</code> MIME type.
#
# @param [#to_hash, #to_ary] form_values
# The form values to encode.
#
# @param [TrueClass, FalseClass] sort
# Sort the key/value pairs prior to encoding.
# Defaults to <code>false</code>.
#
# @return [String]
# The encoded value.
def self.form_encode(form_values, sort=false)
...
みたいに、
「@param [引数クラス] 引数名 以下字下げで引数説明」
「@return [戻り値クラス] 以下字下げで戻り値説明」
と書くと、こんな感じのマニュアルになる
ttp://addressable.rubyforge.org/api/Addressable/URI.html#form_encode-class_method
>>849 配列の配列を作って初期化したいならブロック使って
stockdata = Array.new(height){ Array.new(width, 0) }
とすれば一発で2次元で初期化できるお。
ソースツリーの lib/*.rb を見るのがいいと思うんだけど、 これを見るといい、というのはちょっとわかんない。
あ、#to_ary は #to_ary が動作すればなんでもいいってことね read 可能なオブジェクトならなんでもいい場合は #read と書く TrueClass と FalseClass はあんまりにも面倒でマニュアルも読みにくいので、細かいこと気にせず Boolean と書いてもいい - (Boolean) hoge_exists? hoge があるかどうか返す のように表示されてちょっとわかりやすげ あんまりにもJavaっぽいという指摘は時々見るのだが、 読み書きがめんどくさ過ぎない引数解説マニュアルって結局あんな感じになるんじゃないのという観測が多勢 なお、多言語化は全く考慮されていない 日本語と英語を併記できてきちんと稼動するマニュアルシステムをRubyで見たことはまだ無い
865 :
860 :2011/06/09(木) 11:30:37.13
>>861 YARDいいですね。知りませんでしたが、使わせてもらおうと思います。
>>863 なるほど。
ありがとうございます。
866 :
615 :2011/06/09(木) 14:22:56.29
>>852 858 859 862
ありがとうございます。フルボッコで泣いたw
しかしこんなにシンプルなコードになるんですねぇ
これからがんばって勉強していきます
このへんは「あなた」が考えたわけじゃないだろうし、あんまり気にするな Rubyの教えられ方が悪かっただけだ
868 :
デフォルトの名無しさん :2011/06/09(木) 15:11:49.69
matz 最高や 625 名前:デフォルトの名無しさん [sage]: 2011/06/09(木) 14:46:00.97 yukihiro_matz: 長女はありふれた名前に不満みたいだけど、苗字は先祖 が決めたものだし、あんまり独創的な名前もねえ。結婚を機会に苗字を 変えるか、通名を使うか。私のひらがな表記もありふれた名前への対抗だしね。 ^^^^^^^^^^^^^ 626 名前:デフォルトの名無しさん [sage]: 2011/06/09(木) 14:49:27.14 ぽろっと言っちゃったー 日本人には通名を使うなんて事思いつきません。 通名、通名、痛名か 通名なんて言葉使ったことねーよ どうやったら通名なんて使えるんです?
すいません自己解決できました
すいませんやっぱり解決しませんでした basedir = Pathname.new('C:/aaa/bb/file.txt') abspath = Pathname.new('C:/aaa/zzz/test.txt') relpath = abspath.relative_path_from(basedir) puts relpath ってやると../が1個多くくっついてしまいます 間違っている箇所をご指摘お願いします
dirというからにはディレクトリ名を指定しないと
ああああああファイル名の部分は認識してくれないのですね ファイル名を抜かして実行するようにしてみます ありがとうございます
>>868 ひょっとして通名が(特定の立場の人が使う変名という意味でなしに)
一般的な語彙だってことも知らないような子が来ちゃった?
>>874 625の書き込みの中で通名を一般的な語彙で使っているの?
あなたの言う一般的な意味を教えて下さい。
あ、こっちでなら勝てると思った?
明らかに一般的な意味で使っているよね。 「世間で通用(させようと)?している名前」 外国人(在日に限らず。どこの国でも)がよく使うってだけで、 別に外国人に限ったものではないよ。
>>878 娘が普通すぎる名前が嫌だと言ってるから
>>878 「そんなに名前が不満なら長いこと通名使って改名すればいい」
ってことだろ。
名前が不満で通名使い続けて通名の方がずっととおりがよくなったところで
改名ってのは例があるし。
鈴木とか山田によくあるネタだ 俺も子供の頃に思ったよ、今日から長宗我部にしようって
Ruby/Tk は標準添付やめて gem にした方が、 メンテナさんも気が楽なんじゃないかという気がするんだけど、どうかな。 Ruby 本体と Tcl/Tk とで、どっちのバージョンに強く依存するか、 前者ならば標準添付が良いけど、後者なら gem の方が良いかなと思う。
長宗我部は「長」の部分があんまりカッコよくない 超☆宗我部とかならよかった
長宗我部 これって読めねーよな ちょうがぶ とかしらねーよ
長宗我部は日本歴史ゲームくらいでしか目にしない
ああ、あと、四国の中学校の歴史の授業
>>882 昔どうしようかという話が出た頃はrubygemsという選択肢がなかったのよね
今なら、もしかしたらgemにしようという話になるかも
>>881 読めない名前よりも、普通の名前のが全然良いのに…
教科書に出てくる名前だから読めるだろう
889 :
デフォルトの名無しさん :2011/06/09(木) 22:26:56.12
日本人なら読める。
whenで「0未満」を示すにはどうするのが良いですか?
マイナス無限大...0 のRangeオブジェクトとか?
-Float::INFINITY...0
case に式を書かずに、when に評価式全体を書くかな case when x == 0 when x < 0 when x > 0 end それ以前に無理に case 〜 when 使わずに if 〜 elsif で書いちゃうことも多いが
whenは対象が有限かどうかで書き方が違うと思ってくれ
「負の数」みたいなおーざっぱなのは要素無限だから、case x when ... の形式では「書けない」
>>893 のように case を空にして、when を変数入りにするのがいちばん妥当
この書き方は elsif とあんまり変わらないので、正直あんまり嬉しくない
(0..5).member?(1.214) は true でしょうか、みたいなのってちょっと悩む 範囲オブジェクトはなんか離散的な整数っぽいオブジェクトなイメージがどうにも抜けない
-Float::INFINITY...0 がx < 0 相当っての見て思ったが x > 0 相当の方は始点を含まない範囲だからRangeで書けないよな
>>897 普通に
case x <=> 0
when -1 then
when 0 then
when 1 then
end
では?
<=>の返す正負値を-1、1に仮定するのはあんまり良い作法だとは思わんなあ
>>897 1.9系ならwhen proc{}で、それ以前でもwhenに書く値に特異メソッドとして===追加すれば書けんこともないが、正直冗長だなw
Ruby1.9以上で [-3,0,3].each do |x| print "#{x}:" case x when ->x{x<0}; puts "negative" when 0; puts "zero" when ->x{x>0}; puts "greater than 0" end end
>>897 「書けない」で正しいよ
範囲が定まらないタイプは基本的に記述できない
たとえば、2012年1月1日以降、とか
書けるからといって、それをやっていいかどうかはかなり別
初心者スレにありがちだが
まあ、
>>893 以外に選択肢がないのは確かではあるんだが
>>901 -Float::INFINITY...0
でイテレーションすることはできないが、
このRangeに含まれるかどうかの確認なら問題ない。
caseに変数を書かずにwhenに直接条件式を書くとか、
if elsif...で書く方が妥当ではあるが、
普通に書けるものを手法として妥当でないからって
「書けない」と言ってはいけない。
Rubyを今月始めた人も、使って4年経った人も、これに関してはたぶん同じようなコードを書くとは思う じゃあそれでいいじゃんね、という感じ def (UnderZero = Object.new).===(x) x < 0 end [1, 0, -1].each {|x| puts case x when UnderZero then "-" else "+" end }
>>903 書けないと「書けない」にはわりと溝があるんじゃないかと
カッコ重要
>>905 それは
書かない
とか
書くべきでない
とでも言うべきものだよ。
そんなオリジナルルールで「」を使われても。
(文字通り)「書けない」みたいに字義通りだってことを強調する意味で括弧でくくることもあるから、
(書けないわけではないが)「書かない」みたいな表現をした方がいいんじゃないかな。
>>906 みたいな奴って何言っても引き下がらんし。
初心者向けなら断言したほうがいいと思うなあ 思わせぶりにさせてニヤニヤするのはオタクの悪い癖だ
>>908 やろうと思えばできるけどね(知りたい?)、みたいな情報って初心者にとって(中級者以上にとっても)いらないっていうか凄い邪魔
どうせ使わないんだし、ないことにしたほうがいい
>>893-894 で納得しない回答人はいろいろ省みたほうがいいと思う
不可能でないことを不可能と断言することに抵抗が無い人は好きにすれば?
>>908 >>909 実際にもう
>>892 が書かれちゃってるわけだから、「書けない」なんて変な表現しないで
「
>>892 みたいに書けないこともないけどまわりくどいしわかりにくいから
>>893 」
みたいに事実をありのままに書けばいいだけ。
既に
>>892 が書かれてんのに
「やろうと思えばできるけどね(知りたい?)」って状況じゃないでしょ。
「書けない」なんていわれても初心者は
「
>>892 でできるみたいじゃん書けないってどゆこと?」となるのがオチ。
>>908 彼らは自分たちの知識ひけらかし大会を邪魔されると今のように激しく突っかかってきます
質問者のことなんてどうでもいいと思ってるので、放置が原則
「Rubyしかできない人」にとっては聖域みたいなもんだしな、ここ…
そうやって初心者が初心者に教えるスレ、になってゆくわけだなw
・when節にRangeオブジェクトを渡して「この範囲に含まれるとき」という指定ができる ・Float::INFINITYによって∞の概念が使える ってのは質問者にとって有益な情報だけどな
どっから荒れたんだこれ、と思って読み返したら「書けない」からか 初心者が読んだら強調のカッコと勘違いしても仕方ないな
目の前で食べてる人がいるのに「このリンゴは食べられません」とか言われても誰も納得しねーよ。 「食べてんじゃん!!!!」って突っ込み食らうわ。 「見てのとおり食べられないこともないんだけど、不味いんだよねー」ってーのがまともな人間の回答。
918 :
890 :2011/06/10(金) 11:41:50.50
変な流れを変えたくて質問したのに別の変な流れにしてしまってすみませんorz おおまかな下限が分かっているのでRangeで書くことにします
>>918 case
when x >= 0 && x < 1
when x >= 1 && x < 10
...
と
case x
when 0...1
when 1...10
...
とじゃ前者の方が1.8で約1.2倍くらい、1.9で数倍速いから
そんなに頻繁に繰り返さないなら見やすいRange
何度も何度も判定するようなら速い >= && < と使い分けるといいと思う
>>916 どちらかってと、無限大のRangeが原因だと思う
これ、いわゆるハックだろ
こんな書き方してる人見たことないし、誰かが書いてたら第二のcgi.rbを生ませないよう注意するレベル
まー ・ Rangeは始点と終点のデータしかもたない ・ Range#=== は Range#include? で、始点 < x かつ x < 終点 なら true という処理をするということを踏まえた上での、なんぞトリッキーな書き方であることは認める to_a してどうなるかさっぱりわからんのだがどうなるんだろう
>>920 Float::INFINITYが入ったのが1.9.2からだからあまり見かけないんだろう
>>920 >>894 の2行目が電波すぎるだけ。
>要素無限だから、case x when ... の形式では「書けない」
実数のRangeはstepするためだけのもので
cover?とか===してはいけないと言ってるようなものだよ、これ。
>・ Range#=== は Range#include? で、始点 < x かつ x < 終点 なら true
じゃあなんでそれを自力で書いた
>>919 は速いん?
>>921 INFINITY関係なく、
RangeにFloat使った時点でeachできないからto_aもできない
926 :
デフォルトの名無しさん :2011/06/10(金) 12:54:04.94
>>911 >実際にもう
>>892 が書かれちゃってるわけだから、「書けない」なんて変な表現しないで
>「
>>892 みたいに書けないこともないけどまわりくどいしわかりにくいから
>>893 」
>みたいに事実をありのままに書けばいいだけ。
ほんとその通り。これが理解できないやつはたいていコミュ障。
なるほど、オタクで、コミュ障で、Rubyしかできなくて、マカーがいる集まり、と… なんか最低だなこのスレ
さらにどうでもいいことに -Float::INFINITY...0 はstepもまともな結果にならないから===するしか使い道がない。 ===に使うのはバカバカしいが===にしか使えない誰得オブジェクト
横入り失礼。 Class#methodの「#」とか、 こういう書き方の説明って、 どこかにまとまってる? ググろうにも記号じゃまともに検索できないし、 記法って言うのかなんて言うのか呼び方が分からんから、 調べるに調べられん
>>931 ありがとう
というか白状すると、
インスタンス変数についてClass#methodみたいに書く時の記法が知りたかったんだ
この説明には入ってないんだけど、
.でいいの?
よかったら教えてください
>>932 それはない
オブジェクトの中のインスタンス変数を利用する機会がかなり稀であることが一因なんだと思う
def hoge
@hoge
end
の場合は「(オブジェクトselfの)インスタンス変数@hogeを返します」としか書かない
ものすごーく稀に、「Hogeクラスのオブジェクトのインスタンス変数@val」を Hoge@val と書くことはあるんだが、
変な記述であることは否めないし、あんまりコンセンサスが得られてる気もしないな
インスタンス変数って基本的にクラスを使う人が 意識しなくていいもののはずだからなあ。
936 :
uy :2011/06/10(金) 16:18:15.23
イテレーション回ってる最中にハッシュへの追加はエラー出るんだけど、回避方法があった a=Hash.new a[:aa] =44 a[:bb] =324454 a[:cc] =3355 a[:dd] =32455 a.each do | m | a = a.merge(:ee => 88666) end p a a.each do | m | a[:ssstt] = 1111 # []=': can't add a new key into hash during iteration (RuntimeError) end いいの? これ? どうせならもう []=': can't add a new key into hash during iteration (RuntimeError)ださないほうがいいんじゃないの?なんなの? []=': can't add a new key into hash during iteration (RuntimeError) って一体なにがしたかったの? ???????????
それはおかしくないぞ 最初のaには何も追加してないし
>>936 merge!しないと別オブジェクトを作っちゃいますよ
1.9.2ではちゃんとエラーではじかれます
1.9.2未満だとmerge!が動いちゃいますが、対応漏れだったのでしょう
新規のキーをmerge!していくと無限ループしてしまいますから
rubygems 1.8.x バグだらけやぞなんとかしろ
941 :
デフォルトの名無しさん :2011/06/10(金) 17:54:16.36
>>939 a.mergeで生成されて新たにaにバインドされるオブジェクトと
a.eachで回ってるオブジェクトは別ものだし、
eachはループ一回ごとにaの参照を辿り直したりしないって話なのかな
もしかしてレス番飛んでるよアピール?
そういうことかw 分かりづらすぎて「お前らこそ何言ってんだ」って感じだった
3回読んでやっと分かったw 結構NG登録してんだな
NG登録というキーワードが出てくるまで気づかなかった。だめぽ
ああ、あいつか
949 :
615 :2011/06/11(土) 23:04:36.25
require 'csv' CSV.open('meigaralist.csv', 'r') do |row| puts row end 銘柄リストの中身 1301 極洋 東1 1332 日本水産 東1 ・ ・ ・ コードと同じディレクトリに入れてあります csv→stringにして表示させたいだけなのですが、 ちょっとよく分からなくて・・・ すいませんがお願いします
質問でもなく何をお願いしてるのか
951 :
615 :2011/06/11(土) 23:59:22.94
すいません。これだけだとイミフですね このmeigaralist.csv にあるデータを読み込んで(中身は上述)stringの形で データを表示させたいのですが思惑通りにならず #<CSV:0x128f7f0>とだけ表示されます どこがおかしいか等指摘していただければと思います よろしくお願いします
CSV.foreach('meigaralist.csv') do |row| puts row end で配列として取得できる
CSVの一部APIはRuby1.9と1.8で非互換みたいだね 1.9のopenはブロックにrowでなくcsvを渡す
954 :
615 :2011/06/12(日) 00:15:59.25
>>952 953
ありがとうございます
foreachをそのままやると
C:/Ruby192/lib/ruby/1.9.1/csv.rb:1892:in `block (2 levels) in shift'
: Unquoted fields do not allow \r or \n (line 2). (CSV::MalformedCSVError)
でエラーはきました。改行文字とか入ってるとダメよ?ってことなんですかね?
とりあえずRubyスレにいるなら .hashでハッシュ値くらい確認してからレスしろよゴミ
逆に混在して出して来る様な屑アプリって何? エクセルのエクスポートでも普通に混在されてたりするの?
958 :
615 :2011/06/12(日) 00:49:54.02
>>955 これでも分かる範囲で調べながら自分で考えて書いてるんですが
こういう初歩的なつまりが解決出来なくて、
よく1時間くらい悩むんですよ。勉強不足です
一応後は銘柄でループさせれば完成するところまで来てるんですが
教えてちゃんになってますね。すいません
みなさんある程度コード書けるようになるまでどうやって勉強したんですか?
やっぱり自分で書いてみるより人の書いたの読んでいく方がいいのかなぁ
つうか前にも書き込んだけどハッシュの場合はエラーでるけど、配列の場合はイテレーション中にpushしてもエラーはでない 見事に無限ループになる なぜハッシュ側でだけエラーを出しているのか不明 俺がなぜこんなにこのエラーにつっかかるかっていうと、このエラーが出るせいで組みずらい箇所に当たってる ハッシュ使って木構造染みたソース書いてるからな [Aタスク] │ ┌─┴─┐ [Bノード] [Cノード] こうあるときに CノードからAタスクへ[Dノード]の追加という処理が出来ない それはつまり、Bノードをウィンドウと見立てて、Aタスクがウィンドウ管理のタスクだとした場合 Bのノードにあるウィンドウから、新規ウィンドウを作るときにAタスクへの追加が出来ない == 詰んでるって事 正直これを無限ループになるのが心配でえらーだしてるんだよ とかいってる奴はバカすぎる・・・ 無限ループにならないように制御していくのがプログラミングだろうが 予想するに、そういう仕様にするしかない何らかの事情が絡んじゃってんだろ [key,value]の値を持った配列で書き直したほうがいいかと思うレベル
>>959 あ?誰に口きいてんだお前
技術的に完膚なきまでにぶっ潰されそんな幼稚な反論も出来なくなっちゃった子ですかア?
自分だと思ったんなら君へのレスだよ
>>960 ノードを巡る処理とノードを追加する処理を分離すればいいんじゃないの?
イテレーションで各ノードを巡りながら追加するノードをプールしてイテレーション後にノードを追加する
相手するなよ
> 技術的に完膚なきまでにぶっ潰され ああ、あのストーカーはお前か。
967 :
デフォルトの名無しさん :2011/06/12(日) 02:36:55.45
ttp://hibari.2ch.net/test/read.cgi/prog/1306135242/991+995 > eath_with_object , rotate , cycle , instance_exec __method__ , DATA , erb , instance_eval このあたりの動作わかるか?
> each_with_objectだろ、いきなりスペル間違えてるぞ禁書目録w
あのストーカーもtypoすげー多かった。
コンピュータの歴史の基本部分には詳しかったけど
肝心の言語の知識が皆無だし間違いを訂正しないから専門学校レベルかなと思ってたけど、ビンゴだなこれ。
968 :
けいたいうゆ :2011/06/12(日) 02:57:16.16
>>964 黙れカス
解決方法なんてきいちゃいないしそんなコードはまず書かない
Rubyのゴミ的な部分をね
こっちの世界で影響力のあるお偉いさんが口をとがらせる前に言語のおかしな場所を指摘してやってるだけ
一応これでも応援してる言語だから
配列では可能でハッシュではだめという
しかも回避方法なんていくらでもある
このエラーがいかに不自然なものであるか
それさえもここの奴らは見えないようだな
ここって基本的にトイレでウンコしてるときに読み書きする場所だから、 難しい事まで付き合いきれないよ。
セッタとゲッタを使えば解決
>>955 これ普通は気づかないと思う
まあいいけど
>>958 RubyのCSVライブラリは小難しいことに定評がある
毎回マニュアル読まないとぜんぜん書けない
できれば使いたくないもののひとつ
CSVフォーマットみたいな遺物は使わんでくれって感じ。
人が何使おうが関係ない話だ。使いたいもの使えばいい
自分で使う分には良いけどな。 複数人で使うようなフォーマットとしては駄目。
何も出来ないやつって、あれしちゃだめ、これしちゃだめってうるさいんだよなあ どうでもいいことにこだわってるから何も出来ないままなんだよ
CSVはRDBMSでもSpreadsheetでも日常的に使ってるなあ sed+awkでも簡単に処理出来るし、LLでもCでも扱うのは楽
うん CSVはいいよ へたにリッチなXMLとかで情報交換はめんどくさい
Excelが出すCSVがクソッタレじゃなければもっと便利なんだが。
学ばない奴らだな CSVフォーマットなどというものはない …というかむしろ、どこかの誰かがきちんと決めててくれさえすれば問題なかったんだよ
で、誰が従うの?
Rubyって更新頻度遅い系ですか? Ruby1.9.2 p180から全然バージョンアップしないんですが
>>968 イテレーション中のハッシュに値を追加するなんてコードはまず書かない
エラーが不自然であると思うのならバグレポートとして勝手に報告しろ
英語わかんないからレポート掛けない
配列ならイテレーション途中に末尾に特定条件で要素追加したりして 追加分もそのまままわして欲しいことがままあるから配列はOKなんだろうね。 配列とハッシュは同じコレクションと言っても根本的に別物だもの。 同じ仕様を要求する方がおかしい。
>配列ならイテレーション途中に末尾に特定条件で要素追加したりして >追加分もそのまままわして欲しいことがままあるから配列はOKなんだろうね。 本当にそんなこと考えてると思ってるのか?
RubyのHashは順序を保証してくれるかもしれないけど、一般的なデータ構造としての ハッシュには順序の概念は無いよね? ハッシュを総なめ中にエントリを追加しても、順序づけの基準によっては現在位置の 前かもしれないし後かもしれない そこら辺の意味合いで禁止されてるんじゃないかな
ハッシュで途中参加されると「こいつどうすんのよ……」って空気になりそう。 本質的に順番の観念がないから、 「加えられたものは最後に処理する」ってのも仕様としては気持ち悪いし……。
ここ、初心者スレですよ
回避方法があるからおかしいという話になると privateとかprotectedとか……。
え、Rubyのハッシュって順序保存するの? ヘンなの。
>>990 1.9からの仕様で名前はともかく機能そのものは便利
次スレを誰かおねがい。気軽に立てられる人は少ないだろうが
>>987 順序のない列挙なら最後に銜えるのが当然であり、
順序のある列挙なら銜えないのが当然。
>>993 イケメンおつ
テンプレは前は2-5があったけど無くても問題なさそうだから
これでいいんじゃないかな
995 :
994 :2011/06/12(日) 11:34:30.19
>>993 根拠のない「当然」は受け入れられないなあ。
順序のある列挙なら加えられた後の順序でそのまま続行すりゃいいだけだし。
これ以上やるならC実装に立ち入った議論をすべきじゃないか 実装そっちのけであるべき論やっても虚しいでしょ
順序のある列挙なら加えられた順序で取り扱うのが当然であり、 順序のない列挙なら加えないのが当然。 順序がないのに「最後」ってなに?
梅干
1000ならわたしだけのMatz
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。