トップページ⇒tech
1001コメント355KB

Ruby 初心者スレッド Part 48

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/02/08(水) 06:00:47.06
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、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.11
【RoR】Ruby on Rails Part13
http://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
最新の安定版であるruby 1.9.3-p0が各ミラーサイトから入手できます。
[ 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
>>1乙

ようやく立ったなw
0007デフォルトの名無しさん2012/02/08(水) 16:13:42.80
ファイルのエンコードがUTF-8のとき前提で
Shift_JISとEUC-JPをUTF-8に変換する定式コードを教えてください
ググってもいろいろあるみたいでどれが定番なのか分かりません
000872012/02/08(水) 16:14:01.19
Ruby1.9.3です
0009デフォルトの名無しさん2012/02/08(水) 16:45:26.21
変換できない文字があったときにどうなって欲しいのかで書き方が違うのだな
あと1.8.7でも動作する書き方とか
001072012/02/08(水) 17:34:25.93
1.8.7は切り捨てますのでruby1.9.3で動けば問題ないです
変換できない文字が出てもエラーにならなければ問題ありません
0011デフォルトの名無しさん2012/02/08(水) 17:38:32.35
require 'kconv'
'にほんご'.toutf8
001272012/02/08(水) 17:55:44.76
>>11
この方法で今後は統一します
0013デフォルトの名無しさん2012/02/08(水) 22:11:06.63
勉強用に貯めてきたサンプルを読み返したら
ファイルの先頭にこう書いてありました
#!ruby -Ks
これはなんですか?
0014デフォルトの名無しさん2012/02/09(木) 00:07:04.11
http://www.rubylife.jp/ini/japan/
0015デフォルトの名無しさん2012/02/09(木) 11:13:57.76
理解しました
0016デフォルトの名無しさん2012/02/09(木) 18:32:05.29
# -*- encoding: utf-8 -*-
と
# coding: utf-8
の書き方の違いは何ですか?どっちも同じですか?
0017デフォルトの名無しさん2012/02/09(木) 19:25:00.63
Rubyからは「最初のほうに"coding: なんとか"という文字列が書いてあるコメント行がある」という点でどっちも同じ
上で書くとEmacsがUTF-8で書かれたファイルだと解釈する
0018デフォルトの名無しさん2012/02/10(金) 18:07:10.12
意地でも>>16のどちらも書きたくない場合
コマンドラインオプションとかで同等の効果をもたせる方法ないんですか
0019デフォルトの名無しさん2012/02/10(金) 19:25:52.31
コマンドラインからコードを書きたいのですがどうやるのでしょうか?
例えば p 1+1をコマンドラインに書いて実行したいのです
わざわざファイルに書いてから実行するほどでもないような計算するのが目的です
環境はWindows Ruby1.9.3です
0020デフォルトの名無しさん2012/02/10(金) 19:44:58.96
irb使え
0021デフォルトの名無しさん2012/02/10(金) 20:56:34.37
irbで出来ました!
rubyって打ってもそういうモードにならなくて「ruby コマンドライン」でググってもでてこなかったのであきらめるところでした
0022デフォルトの名無しさん2012/02/10(金) 21:54:10.35
ちなみにruby -e 'p 1+1'でもいける
0023デフォルトの名無しさん2012/02/10(金) 22:46:31.53
>>22のやり方は、ワンライナー(one liner)と呼ばれているね
0024デフォルトの名無しさん2012/02/11(土) 01:25:52.30
str.gsub!(/aa(\d+?)aa/, "bb#{$1}bb")

こういうことをやりたいんですけど、どうやったらうまくいきますか?
0025デフォルトの名無しさん2012/02/11(土) 01:55:13.30
すみませんこうですね。。
str.gsub!(/aa(\d+?)aa/, 'bb\1bb')
0026デフォルトの名無しさん2012/02/12(日) 14:49:57.55
s='foo.bar'
t='foo.baz'
で先頭から共通する文字列'foo.ba'を取得するうまい方法って無いですか。
ループで一文字ずつスキャンするしかないですかね。
0027デフォルトの名無しさん2012/02/12(日) 14:59:45.57
windowsでsystem('dir')の返り値を変数に入れる方法を伝授してください
0028デフォルトの名無しさん2012/02/12(日) 15:43:51.93
>>26

結局はループしてるんだけど、文字列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.33
メインphp使いですけどrubyってコード記述量少なくていいですね
0030デフォルトの名無しさん2012/02/12(日) 19:00:46.18
まつもとゆきひろ「public static void mainなど、コンピュータに伝える約束事が多くて、
やりたいことが頭の中から逃げてしまう。簡潔さは力なのです(中略)
“実行可能疑似言語”と呼ばれる何言語でもないコードが示されることが多い。
それは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
CGIの動作をWindowsのコマンドラインからテストするために簡単なスクリプトを書いています。
・呼び出し
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
cmd.exeってheredocはないんだっけか。
標準入力に食わせたいだけなら

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
utf-8で保存したrbファイルの先頭に
#!ruby -Ks
って書くのと
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
って書くのどちらがよいですか?
Windows ruby1.9.3です
0035312012/02/12(日) 23:21:50.26
>>32-33
大変参考になりました。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.36
Class.new で作ったクラスオブジェクトに名前を付ける方法ってどうするの?
c = Class.new
p c.name #=> nil

c.name = 'Foo' はだめだった
0037デフォルトの名無しさん2012/02/13(月) 15:12:51.75
>>36
http://doc.ruby-lang.org/ja/1.9.3/class/Module.html
のModule.newを見れば分かると思うよ
0038デフォルトの名無しさん2012/02/13(月) 16:48:57.93
>>37
ありがとうございます。
ということは、動的に名前をつけたい場合はevalするしかない?
c = Class.new
name = "Foo"
eval "#{name}" = c"
0039デフォルトの名無しさん2012/02/13(月) 17:58:53.99
Module#const_set辺りでどうにかなんないかなー検証してないけど
0040デフォルトの名無しさん2012/02/13(月) 20:21:21.77
const_setでおk
■ このスレッドは過去ログ倉庫に格納されています