Ruby 初心者スレッド Part 48
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/02/08(水) 06:00:47.06質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
前スレ
Ruby 初心者スレッド Part 47
http://toro.2ch.net/test/read.cgi/tech/1322819329/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
0002デフォルトの名無しさん
2012/02/08(水) 06:05:33.11http://kohada.2ch.net/test/read.cgi/php/1320393984/
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://hibari.2ch.net/test/read.cgi/tech/1155031689/
書籍:ほぼ公式
「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」 (プログラミング自体が初めてでない人向け)
http://www.amazon.co.jp/dp/4797357401/
「初めてのRuby」 (同上)
http://www.amazon.co.jp/dp/4873113679/
書籍:紙のマニュアルに相当
「Rubyレシピブック 第3版 303の技」((脱)初心者向け基礎テクニック集、1.9対応)
http://www.amazon.co.jp/dp/4797359986/
「プログラミングRuby 第2版 言語編」(初心者向け参考書)
http://www.amazon.co.jp/dp/4274066428/
現在、1.8 系列の最新である Ruby 1.8.7 と 1.9 系列の最新である Ruby 1.9.2 の2系統が存在
肝心な部分がわりと違い、プログラムはそのままでは動作せず、予備知識も別個。両対応させるには相応の追加記述が必要
1.9.2 用の教科書があるなら 1.9.2 から始めても構わないが、1.8 用のスクリプトやライブラリは 1.9.2 では動作しないので注意
Windows用Rubyは、Ruby以外のものもあらかた入っているActiveScriptRubyと
http://www.artonx.org/data/asr/
RubyだけインストールされるRubyInstallerの2種類存在
http://rubyinstaller.org/downloads/
何が必要なのかわからない人はとりあえずActiveScriptRuby使っと毛
chm(HTMLヘルプ)式のダウンロードできるマニュアルが便利
http://www.ruby-lang.org/ja/documentation/
0003デフォルトの名無しさん
2012/02/08(水) 06:12:35.15[ tar.bz2 | tar.gz | zip ]
ダウンロード
http://www.ruby-lang.org/ja/downloads/
0004デフォルトの名無しさん
2012/02/08(水) 06:15:06.06・ エディタ初めてならRubyスクリプトをを着色してくれる(できればオートインデントの)エディタ好きなの選べ
・ いわゆるIDEはRubyの学習に際しては恐ろしくコスパが悪いのでRubyのためだけに新規導入するのはお勧めしない
Q. XXX を使ってるんですが Ruby も覚えたほうがいいんでしょうか?
A. 好きにしろ
0005デフォルトの名無しさん
2012/02/08(水) 06:28:43.23,/ ノ ヽ ~\
/ ノ IPA ヽ ~\
/ ノ ヽ、 `ヽ
| ノ / ̄\ / ̄~ヽ ヽ i
| ノ | ノ
\ | <●> <●> ( )
\ | | | i /
| / ヽ レ
i (●_●) /
i、 ,-――-、 ・ /
i、 <(EEEEE)> ∵/ IPA Rubyスレにようこそ
i、 \ ./ /
\ ーー ,ノ
,,.....イ.ヽヽ、ー-―一ノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
0006デフォルトの名無しさん
2012/02/08(水) 07:31:40.24ようやく立ったなw
0007デフォルトの名無しさん
2012/02/08(水) 16:13:42.80Shift_JISとEUC-JPをUTF-8に変換する定式コードを教えてください
ググってもいろいろあるみたいでどれが定番なのか分かりません
00087
2012/02/08(水) 16:14:01.190009デフォルトの名無しさん
2012/02/08(水) 16:45:26.21あと1.8.7でも動作する書き方とか
00107
2012/02/08(水) 17:34:25.93変換できない文字が出てもエラーにならなければ問題ありません
0011デフォルトの名無しさん
2012/02/08(水) 17:38:32.35'にほんご'.toutf8
0013デフォルトの名無しさん
2012/02/08(水) 22:11:06.63ファイルの先頭にこう書いてありました
#!ruby -Ks
これはなんですか?
0014デフォルトの名無しさん
2012/02/09(木) 00:07:04.110015デフォルトの名無しさん
2012/02/09(木) 11:13:57.760016デフォルトの名無しさん
2012/02/09(木) 18:32:05.29と
# coding: utf-8
の書き方の違いは何ですか?どっちも同じですか?
0017デフォルトの名無しさん
2012/02/09(木) 19:25:00.63上で書くとEmacsがUTF-8で書かれたファイルだと解釈する
0018デフォルトの名無しさん
2012/02/10(金) 18:07:10.12コマンドラインオプションとかで同等の効果をもたせる方法ないんですか
0019デフォルトの名無しさん
2012/02/10(金) 19:25:52.31例えば p 1+1をコマンドラインに書いて実行したいのです
わざわざファイルに書いてから実行するほどでもないような計算するのが目的です
環境はWindows Ruby1.9.3です
0020デフォルトの名無しさん
2012/02/10(金) 19:44:58.960021デフォルトの名無しさん
2012/02/10(金) 20:56:34.37rubyって打ってもそういうモードにならなくて「ruby コマンドライン」でググってもでてこなかったのであきらめるところでした
0022デフォルトの名無しさん
2012/02/10(金) 21:54:10.350023デフォルトの名無しさん
2012/02/10(金) 22:46:31.530024デフォルトの名無しさん
2012/02/11(土) 01:25:52.30こういうことをやりたいんですけど、どうやったらうまくいきますか?
0025デフォルトの名無しさん
2012/02/11(土) 01:55:13.30str.gsub!(/aa(\d+?)aa/, 'bb\1bb')
0026デフォルトの名無しさん
2012/02/12(日) 14:49:57.55t='foo.baz'
で先頭から共通する文字列'foo.ba'を取得するうまい方法って無いですか。
ループで一文字ずつスキャンするしかないですかね。
0027デフォルトの名無しさん
2012/02/12(日) 14:59:45.570028デフォルトの名無しさん
2012/02/12(日) 15:43:51.93結局はループしてるんだけど、文字列2個程度なら
>> t.chars.with_index.take_while{|c,i| c == s[i]}.map(&:first).join
=> "foo.ba"
とか
>> t.chars.zip(s.chars).take_while {|e| e[0] == e[1]}.map(&:first).join
=> "foo.ba"
とか
本格的にやるならtrie木について調べるといいと思う。
0029デフォルトの名無しさん
2012/02/12(日) 18:38:04.330030デフォルトの名無しさん
2012/02/12(日) 19:00:46.18やりたいことが頭の中から逃げてしまう。簡潔さは力なのです(中略)
“実行可能疑似言語”と呼ばれる何言語でもないコードが示されることが多い。
それはPascalもどきとか、Algolもどきで書いてある。
もどきといっても、アルゴリズムをちゃんと記述できている。
だったら、それを理解できる言語を作ればいいじゃん、ということで、ある意味、それがRubyの目標です」
「ソフトウェアは工業製品ではない」、Rubyのまつもと氏が講演 − @IT
http://www.atmarkit.co.jp/news/200904/10/matz.html
2009/04/10
メタ言語のことで、一般にBNFやBN記法と略される
バッカス・ナウア記法 − Wikipedia
0031デフォルトの名無しさん
2012/02/12(日) 21:14:27.94・呼び出し
ruby -w foo.cgi param1=hoge method=GET
・パラメータ受け取り(GETリクエストをシュミレーション)※一部略
ENV['QUERY_STRING'] = ARGV.join('&')
あとはcgi.rb任せです。
ですがcgi.rbがSTDINからパラメータを受け取る場合(POST)
どうやってセットしたらいいのでしょうか。
0032デフォルトの名無しさん
2012/02/12(日) 21:19:07.11標準入力に食わせたいだけなら
type post_data.txt | ruby -w foo.cgi ...
でいいんじゃないの?
※そういえば、CGI.rb を使っているスクリプトを直接端末から起動すると
パラメータを受け取るモードになる機能があったような。
0033デフォルトの名無しさん
2012/02/12(日) 21:26:49.12% ruby -rcgi -e'cgi=CGI.new;p cgi.params'
(offline mode: enter name=value pairs on standard input)
a=1&b=2
{"a"=>["1"], "b"=>["2"]}
% echo x=3 | ruby -rcgi -e'cgi=CGI.new;p cgi.params'
{"x"=>["3"]}
0034デフォルトの名無しさん
2012/02/12(日) 21:40:14.27#!ruby -Ks
って書くのと
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
って書くのどちらがよいですか?
Windows ruby1.9.3です
003531
2012/02/12(日) 23:21:50.26大変参考になりました。cgi.rbにあらかじめそのような機能がついていたとはorz
CGIスクリプトは今どきのRESTfulな感じで、リクエストメソッドを意識した作りでしたため
cgi.rbのオフラインモードではENV['REQUEST_METHOD']に値が入らず、うまくいきませんでした。
作成中のコマンドライン用追加スクリプトの段階で(cgiインスタンス作成前に)
ENV['REQUEST_METHOD']に値を入れると、パラメータが無効になってしまうようでした。
そこで以下のように起動し(-dオプションを追加)
ruby -w -d -rcgi foo.cgi
(offline mode: enter name=value pairs on standard input)
param1=hoge&method=post
cgiインスタンス作成後に以下のコードを入れておくことにしました
ENV['REQUEST_METHOD'] ||= (@cgi['method'] ? @cgi['method'].upcase : 'GET') if $DEBUG
ぎこちない感じではありますが、ともあれこれでテストを進められそうです。
ありがとうございましたm(_ _)m
0036デフォルトの名無しさん
2012/02/13(月) 14:41:17.36c = Class.new
p c.name #=> nil
c.name = 'Foo' はだめだった
0037デフォルトの名無しさん
2012/02/13(月) 15:12:51.75http://doc.ruby-lang.org/ja/1.9.3/class/Module.html
のModule.newを見れば分かると思うよ
0038デフォルトの名無しさん
2012/02/13(月) 16:48:57.93ありがとうございます。
ということは、動的に名前をつけたい場合はevalするしかない?
c = Class.new
name = "Foo"
eval "#{name}" = c"
0039デフォルトの名無しさん
2012/02/13(月) 17:58:53.990040デフォルトの名無しさん
2012/02/13(月) 20:21:21.770041デフォルトの名無しさん
2012/02/14(火) 02:45:58.49class Cls
def self.foo
@var = 'varrrrr' ### この@varは何変数なんでしょう?###
end
def bar
@var # nil
@@var # NameError
self.class.var # NoMethod
Cls.var # NoMethod
Cls.instance_variable_get(:@var) # == OK! ==
Cls.class_variable_get(:@@var) # NameError
end
def self.baz
@var # OK
end
end
@varはClsクラスオブジェクトのインスタンス変数か、あるいはClsの特異クラスの
インスタンス変数なのでしょうか?だとして、それはClsのインスタンスから見ると
一体何なんでしょう
004241
2012/02/14(火) 02:46:39.12module Singleton
def self.included(cls)
cls.instance_eval do
def get_instance
@instance ||= new
end
private_class_method :new
end
end
end
これはオブジェクトの関連からはどう説明すればいいんでしょうか
インスタンスをクラスオブジェクトに突っ込んでいるように見えるのですが…
evernoteに生のタコを突っ込んで保存するようなものではないのでしょうか
0043デフォルトの名無しさん
2012/02/14(火) 03:43:40.90で、 def self.メソッド名 の中で定義されてるから、
そのクラスを表す、Ruby 組み込みクラスである Class クラスのオブジェクトに属する(=Classクラスのインスタンスに属する)インスタンス変数
class C; end
p C.class #=> Class ← これ
最近はこのインスタンス変数がしょっちゅう使われてて、呼び名がないと説明に困るというので、
「クラスCのクラスインスタンス変数」という呼び方が他の言語から借りて使われてる
ただのインスタンス変数なので、クラスのオブジェクト部分でいわゆるアクセサメソッドを自作するか、
class C << self
attr_reader :var
end
クラスのオブジェクトに対して instance_variable_get/set しないと利用できない
で2、クラスメソッド(=クラスオブジェクトに属するインスタンスメソッド)の定義を def self.hoge のようにドットつきでしてる人であっても、
クラスインスタンス変数のアクセサを作るときは
class クラス名 << self
インスタンスメソッドな書き方
end
という再オープン記述を使うことが多い
0044デフォルトの名無しさん
2012/02/14(火) 06:16:09.40>@varはClsクラスオブジェクトのインスタンス変数
です
>インスタンスをクラスオブジェクトに突っ込んで
ます
その理解であってる
呼び方は「クラスインスタンス変数」(smalltalk起源?)
普通にインスタンス変数だからインスタンス(Cls自身)以外からは見えないので
Clsのインスタンスがどうとか気にする必要は無い
class Cls
@var = 'クラスインスタンス変数'
def initialize ; @var = 'インスタンス変数' ; end
def var ; @var ; end
def self.var ; @var ; end
end
puts "Cls.new.var は #{Cls.new.var} です"
puts "Cls.var は #{Cls.var} です"
0045デフォルトの名無しさん
2012/02/14(火) 09:11:26.93「UTF-8に含まれてなさそうなコントロールコードや不完全なバイナリの連なり」は^@みたいな表示で着色されて表示されます
これと似たような処理(をするための振り分け)はどうしたらいいもんでしょう
コントロールコードっぽい配列と、UTF-8っぽい配列の2つに分けたいです
0046デフォルトの名無しさん
2012/02/14(火) 09:19:12.01UTF-8にマッチする正規表現でscanとかsplitして、マッチしないものを「コントロールコードその他」にするとうまくいく
0047デフォルトの名無しさん
2012/02/14(火) 10:50:19.26いろいろ試してみたいのですがnet/httpとnokogiri以外にありますか?
0048デフォルトの名無しさん
2012/02/14(火) 10:54:06.780049デフォルトの名無しさん
2012/02/14(火) 10:57:30.71Web から HTML やファイルとかを取得したいのなら、標準の Net::HTTP
HTML から正規表現じゃなく HTML 構造を頼りにテキストデータを取り出したいのなら、gem の Nokogiri
上記2つが融合したもので、リンクをクリックしたりしてページアクセスもできるのが、gem の Mechanize
libcurl と呼ばれる巷では定番の外部ライブラリを利用することでネットアクセスを実現してるのが、gem の curb
好きなの使え
0050デフォルトの名無しさん
2012/02/14(火) 11:26:10.45ありがとうございます
シンプルにやりたいときはopen-uriかNet::HTTP + Nokogiri
便利屋になるならMechanize
並列でアクセスさせたいときはcurb
を使います
とりあえずopen-uriが一番シンプルだったのでここからcurbまでサンプル作って覚えてみます
0051デフォルトの名無しさん
2012/02/14(火) 14:50:58.04例えばrequire "date"だったらDateとDateTimeの2つのクラス名が知りたいです
0052デフォルトの名無しさん
2012/02/14(火) 15:19:49.04$LOAD_PATHからdate.soかdate.rbを探してクラス定義を正規表現で探せばできるけど、それほど完全でもない
というか、それが必要になることはないはず
衝突の回避はユーザーに任せろ
完全初心者が使ってることを前提にするのはやめよう
0053デフォルトの名無しさん
2012/02/14(火) 15:33:55.520054デフォルトの名無しさん
2012/02/14(火) 15:39:41.07質問1
マニュアルの見方を教えてください
http://doc.ruby-lang.org/ja/1.9.3/library/index.html
このページのライブラリ名は全てrequire "〜"にそのまま書いていいようになってますか?
質問2
クラス名からメソッド一覧を取得したいので
p Dir.methodsって書いて表示できたんですが
例えばhttp://doc.ruby-lang.org/ja/1.9.3/class/Date.htmlの
特異メソッドとインスタンスメソッドを別々に取得して表示させる方法はありませんか?
0055デフォルトの名無しさん
2012/02/14(火) 16:06:39.74とループ回答
>>54
ひとつめYES
スラッシュ「/」や大文字もそのまま書く
irb> require 'english'
LoadError: no such file to load -- english
irb> require 'English'
irb>
ふたつめ
ttp://doc.ruby-lang.org/ja/1.9.3/method/Object/i/singleton_methods.html
ttp://doc.ruby-lang.org/ja/1.9.3/method/Module/i/instance_methods.html
このマニュアル、一覧ページにアンカーがないから使いにくいなあ
irb> require 'date'
irb> p Date.singleton_methods(false)
[:_strptime, :_parse, :_iso8601, :_rfc3339, :_xmlschema, :_rfc2822, :_rfc822, :_httpdate,
:_jisx0301, :julian_leap?, :gregorian_leap?, :leap?, :new!, :valid_jd?, :valid_ordinal?, :valid_civil?,
...
irb> p Date.instance_methods(false)
[:strftime, :asctime, :ctime, :iso8601, :rfc3339, :xmlschema, :rfc2822, :rfc822, :httpdate,
:jisx0301, :ajd, :amjd, :jd, :day_fraction, :mjd, :ld, :year, :yday, :mon, :mday, :month, :day,
...
■ このスレッドは過去ログ倉庫に格納されています