[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 03/12 09:10 / Filesize : 211 KB / Number-of Response : 848
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 35



1 名前:デフォルトの名無しさん [2010/03/04(木) 11:00:57 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では有名ライブラリやアプリが 1.9.1 に完全には対応していないためです)
 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

152 名前:149 mailto:sage [2010/03/09(火) 01:41:46 ]
それは、知らんかった。
音(的には)P-TOSのなんとかに似ているね。

153 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:42:02 ]
>>150
こんなのあるのか。笑ってしまった。

154 名前:デフォルトの名無しさん [2010/03/09(火) 02:31:05 ]
>>145
まさにその茨の道を進もうとしてるようですよ。

>>147
正直よくわかんね!ってところだからですよ、ええ('A`)
学生の頃も本職になった今もC++で離散系のシミュレーションとかやりつつ時期によっては
しょぼいエクセルの業務システム作りをやってますよ。(VBA嫌いなので得意じゃない)
sed,awkはそんなものがあるのは知ってたけど,perlでやってました。
バイナリとはいいつつ、ファイルレイアウトを見ると間違いなくパック10進数といった類
の補足説明があるので文字だけってことはないようですね。

とまあそんな自己紹介はいいから、とりあえず明日明後日ともうちょっと下調べして出直
してくる。納期もあってないようなもんなのでまったりやりますよ。

>>146手掛かりくれてありがとう。

155 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:01:13 ]
>>114
freeze は(少なくとも組み込みや添付では)破壊的動作のメソッドの動作を禁止させるフラグ立て

def hoge!
 raise "can't modify frozen Hoge" if self.frozen?
 ...
end

というメソッド定義に「自分でする」
破壊的動作や内部構造への再代入をされるとどっかに @foo||= なんかで残ってるインスタンス変数とかが
変更前のまま残ってて場合によっては食い違い動作の原因になりそうだとか
そういうおそれがあるクラスに提供する

ぶっちゃけこれ使わずに「お前が困る動作組み合わせは全部書いてあるからちゃんとマニュアル読め」でもいい
マニュアル読まない人が(あるいはうっかりで)よくないタイミングで破壊的動作をしてしまっても
変更して欲しくないとタグ付けされたオブジェクトだったらメソッド動作の時点でエラー出して守ってあげよう、
そんな若さと渋さの間で揺れるナイス・サーティのアナタに贈る鼻歌みたいな応援歌

156 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:32:47 ]
a = [ [ ] ]
a.freeze
a.frozen? #=> true
a[0].frozen? #=> false

なんだよな。
当然といえば当然なんだが。


157 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:36:24 ]
>>156
それは a つまり Array の freeze メソッドの動作に依存する
配列中の全要素に freeze を適用するという動作にしても構わない(不便だとは思うが)

Array#freeze がそういう「外の入れ物だけフリーズさせる」ような動作にたまたまなってるだけ
freeze の実装自体はもっと柔軟に対処が可能

158 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:50:48 ]
freeze は

def hoge!
 raise_if_frozen
 …
end

とか

def hoge! … end
freeze_method :hoge!

とかいう仕組みを作って簡易に利用できるほうがよかったと思う

159 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 12:58:03 ]
freeze 自体が Ruby 文化とあまり適合しないと言われているから
うまい構文糖や実装ポリシーが
熱心に研究されていないんじゃないかなあ

160 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 13:11:39 ]
evil rubyたのしいです。




161 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 13:11:51 ]
private や protected の動作がイマイチなのと根っこはたぶん一緒だよね

162 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 13:44:44 ]
if hoge && fuga.size > 0

if hoge && !fuga.empty?
どっちがいい?
どっちでもない別の表現がいい?

163 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 13:46:31 ]
あと
if fuga.size > 0

unless fuga.empty?
にした方がいいんだろうか?

どれもお好きなようにっていう程度だろうか

164 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:07:25 ]
>>162-163
字面が違うから意味が違う

が、fuga が配列みたいなもんなら、俺は empty? の活用をまず考える
empty? を使うことで否定要素が複数混じってしまうようならすっぱり諦めて size の比較とかにする

そんな感じ

あと配列なら Enumerable 由来の any? とか all? とかの利用も考えるといい

165 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:21:52 ]
>>164
書き忘れてましたfugaはArrayインスタンスです

配列であれば162も163もそれぞれ動作は同じですよね?

166 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:51:22 ]
なにを心配してるのかわからん
sizeが整数や実数を返す可能性とか考えてる?

167 名前:162 mailto:sage [2010/03/09(火) 17:42:10 ]
心配しているわけじゃなく
意味が同じなら書き方としてどっちがRubyっぽいのかなと思って

>>162,163で例に出した形の文は今まで前者で書いてたんですけど
empty?を使う方がいいという意見を別のところでも見たので。
特に>>162の方は否定(!)をつけてまでempty?にするのがいいのかどうかってことです

168 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:49:23 ]
? を使う述語があるならそっちのほうがいいという話にはどうしてもなるな

!foo.empty? みたいなのにはうんざりしてるのか、
ユーザーの作るライブラリでは相反する述語がセットで定義されてることも多い

&& などで繋ぐ場合は !foo.empty? みたいな記述はけっこう容認されてる雰囲気
if !foo.empty? だけだったら unless foo.empty? 使えという話になるんだけど

169 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 18:26:00 ]
>>162
fuga.size > 0 より断然 fuga.empty? をお勧めします。
理由は、fuga.empty? はまさに「空かどうか」を調べるメソッドであり、やりたいことを明確に示しているからです。
これに対し、fuga.size > 0 は「サイズが0より大きいか」を表しており、「空かどうか」を直接表しているわけではありません。
つまり、fuga.size > 0 より fuga.empty? のほうがより抽象度の高い記述になっています。

なお Ruby では .empty? のほうが若干ですが動作速度が速いはずです。

170 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:01:57 ]
「要素があるか」を調べたいのに「空か」を調べてさらに加えて否定まで付けなきゃならんのは如何なものかってことじゃろ



171 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:35:09 ]
だから標準で all? とか any? とかあるって
それで不足ならメソッドに掃き出すことを厭ってはならね

172 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:41:12 ]
unlessがあるんだから使おう、と思うか、他の言語と同じようにifで書こう、と思うか、は
微妙なところだな。自分の場合、何年かの周期でふらふらしてる。

173 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:42:39 ]
メソッドフル活用派とプリミティブ派のたたかいはまだつづく

174 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:37 ]
Pythonスレ
社会人が多く、大人の発言
初心者に優しい

Rubyスレ
キチガイ、偏執狂、厨房の巣窟

175 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:49:56 ]
要素の数が0以外なら真を返す、みたいなメソッドがないことが問題をややこしくしてる
本当はこのへんは対称性があってもいい(なくてもいいが)

うまいメソッド名が思いつかなかったっぽい雰囲気はあるが

176 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:56:30 ]
>>170
(誤) さらに加えて
(正) かてて加えて

177 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:05:28 ]
any? はよいんだけど、 [ nil ].any? #=> false なので
要素が1つでもあるか、という判定としては万能ではないかもなー。


178 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:11:51 ]
万能ではないも何も
> 要素の数が0以外なら真を返す、みたいなメソッドがない
という話が既に

179 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 20:18:35 ]
def hage?

end

def fusa?
!hage
end

みたいなメソッド定義はよく見る
empty? も時流に乗るべきだとは思う

180 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:10 ]
富士通御謹製エフトランを知らん奴が意外と多いんだな
汎用機、オフコンを知らん世代が増えて来たったことだな
z/OSで仕事してたころはデータセットをFTPのBINでダウンロードして
shift-JISに変換とかよくやってたぜ






181 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:33:53 ]
懐古厨乙

182 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:37:02 ]
>>181
レスしたのお前だけだぞ

183 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:41:39 ]
おっさん多いなこのスレ。。

184 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:51:59 ]
うんにゃ、知らない奴はレスしないだけ
バックグラウンドがたまたま見えただけに過ぎない

185 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:22:42 ]
メソッドと変数が見分けがにくいな

186 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:11:00 ]
ローカル変数のように見えて実はメソッド、というのはままある。


187 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:19:08 ]
「値は必ず確固としたオブジェクト」なので、メソッドだろうがローカル変数だろうが
値を返すキーワードが実際は何でできてるのかは使用者からは区別する必要ないよねというポリシーがある

mes(foo) としたとき、foo が変数なのかメソッドなのかは実際どうでもいい
foo という名前が解決されてその結果返されるオブジェクトだけが重要

代入が文脈依存なのはそれなりに面倒
selfの有無で同じ名前を2回使い分けられるということでもあるが

188 名前:デフォルトの名無しさん [2010/03/10(水) 09:26:35 ]
さすがにそれはどうでもよくないだろー
local_var()もできないんだし

189 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 10:01:42 ]
問題になる状況自体が問題だと思うぞ
どういうネーミングだよ

190 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 10:10:12 ]
めっちゃプリミティブな名前のインスタンスメソッドを作って、なおかつローカル変数もそのままの名前である場合
uri とか



191 名前:デフォルトの名無しさん [2010/03/10(水) 10:34:48 ]
下記コピペの拡散、お願いします!

-- ここから --
欠陥だらけの悪法、民主党が準備を進めている「子ども手当」がまもなく国会を通過する見込みです。
そこで、この法案に対するクレームを直接政府に届けて、少しでも本法案を阻止できるよう動きませんか!?

クレーム先:www.cao.go.jp/sasshin/hatomimi/re_hato/uketsuke.html
ハトミミ「国民の声」 受付窓口
の「■ 一般受付窓口 【おかしなルール(規制・制度)】」に、「基準や要件の見直し」として、本件に関する
抗議をお願いします。実名とメールアドレスが必要となります。○制度の所管省庁 は、厚生労働省です。

なぜ本法案がまずいのか?子ども手当支給対象者、民主党支持者もじっくり考えてみてください。

【子供手当て驚愕の真実】 www.youtube.com/watch?v=Y4wuKv8ExeM&feature=related
驚愕の子供手当て 5959goc.iza.ne.jp/blog/entry/1475880/
2010/3/10付の中日新聞
up3.viploader.net/pic/src/viploader1186653.jpg
viploader.net/pic/src/viploader1186654.jpg

要件をまとめると、
「外国籍の人間も支給対象」「海外在住の日本人は支給対象外」「養子も支給対象」「財源が赤字国債」
「子どもが外国にいても支給対象」「子どもの存在証明として、法的な力を持つ手段がない」
となります。これにより、以下のことが考えられます。

1. この手当目的に、日本より経済状態が低い外国において不当な養子縁組を作るケースが激増する。
2. この手当目的に、日本にやってくる外国人(特に中国人)が激増する。
3. なによりも、負担は将来の子ども達が背負わなければならない。

国会答弁にて、政府も設計に難があるのは認めていますが、今後検討するという理由で、この欠陥を
そのまま推し進めようとしています。まだ諦めるのは早いです。できる限りの手を尽くしましょう!!
-- ここまで --

192 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 10:57:01 ]
スレ違い

193 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 10:58:59 ]
>>192
レスしたのお前だけだぞ

194 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 13:02:57 ]
>>191
民主は売国政党だからな


195 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:09:34 ]
初心者は1.8.7をインストールすればいいんでしょうか?

196 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:36:37 ]
はい、そうです。

197 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:37:07 ]
はい

Windowsならarton.hp.infoseek.co.jp/indexj.html
ただしコマンドプロンプトの知識がどうしても必要

198 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:11:43 ]
def method1(x)
 return true if (0...1000).include?(x)
 return true if (2000...3000).include?(x)
 return true if (4000...5000).include?(x)
 return false
end
---
def initialize
 @arr = []
for i in 0...1000
 @arr.push(i)
end
for i in 2000...3000
 @arr.push(i)
end
for i in 4000...5000
 @arr.push(i)
end
def method2(x)
 return @arr.include?(x)
end

上のmethod1とmethod2をそれぞれ呼び出したとき、
結果は変わらないと思うんですが、処理速度に違いは出ますか?

199 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:49:57 ]
def method3(i)
case i
when 0...1000, 2000...3000, 4000...5000 then true
else false
end
end

ほんとうに整数ならこれが速くてわかりやすい
整数なのならわざわざ配列作る必要はない

200 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:22:30 ]
int x=1000;
for(int i=0;i<=x;x*i)
{
}



201 名前:デフォルトの名無しさん [2010/03/10(水) 19:40:05 ]
(0...1000).include?(x) は 0<=x && x<1000 と同じだけど
(0...1000).to_a.include?(x) は配列の要素を一つずつ比較するので当然遅くなる

202 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:48:12 ]
処理が遅いってどういうとき遅いの?

203 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:05:01 ]
>>202
実際に遅いかどうかプログラム作って確かめてから考えたほうがいい
机上で遅そうだと思っても意外と許容範囲内であることは多い

204 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:09:02 ]
.NETで作ったdllは参照できますか?

205 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:16:00 ]
dll <-> COM <-> Ruby

206 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:18:58 ]
へー、COMなら参照できるのか

どういう原理なんだ?

207 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 20:38:42 ]
COM Ruby でぐぐると…わあ微妙

208 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:27:35 ]
pause(2) に相当するメソッドでないんですかね。
とりあえずKernel.#sleepによる無限スリープで代用していますが

> sleep(sec = 0) -> Integer
> sec が省略されたり 0 を指定した場合、他スレッドからの Thread#run
> などで明示的に起こさない限り永久にスリープします。

sleep(0) してもすぐ戻ってきやがる。
マニュアルと実際の挙動が違うのはなぜ?
ちなみに引数を省略した場合は仕様通りなんですけど。

209 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:33:11 ]
pause(2)ってサスペンドの時に発行される奴だっけ?

Process.kill :STOP, $$
じゃだめですかね?


210 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:34:53 ]
>>209
ああ、それいいかもです。

ところでKernel.#sleepの挙動がマニュアルと異なるのが気になりますw
sleep(0) ですぐリターンするのは何故でしょう??



211 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:38:10 ]
まあ個人的にはただしい挙動だとは思いますが。
シェルから sleep 3 を実行すると0秒後に復帰しますし、永久にスリープはしませんね。はい。

212 名前:198 mailto:sage [2010/03/11(木) 00:38:23 ]
みなさん、ありがとうございます。
method1の代わりには、ご提示くださったmethod3が確かに良さそうですね

0...1000等はデータ的な数値(整数)で、頻繁に比較するのですが、
データ専用のクラスに数値の配列とmethod2を定義して呼び出し側のクラスから参照して比較したほうが、
呼び出し側のクラス内に直接method1を書くよりも記述のまとまりとしては良いと思ったんです

かと言って、データのクラスにmethod1や3のような記述をしても、
データを管理しているイメージはないですよね

213 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:58:39 ]
www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html
ここには0の場合永久スリープとは書いてないな。

RubySpecには
it "pauses execution indefinitely if not given a duration"
(引数がないなら無限に止まる)
はあるけど0を指定した場合の仕様は書いてない。
github.com/rubyspec/rubyspec/blob/master/core/kernel/sleep_spec.rb

でもって、るりま
doc.okkez.net/static/187/class/Kernel.html
には0だと永久スリープとある。

るりまの間違いだろうか。



214 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:02:12 ]
>>212
え、なにそれ

class HogeDataRange
def include?(x)
case x
when 0..1000, 2000...3000 then true else false
end
end
end

puts "13は含まれてるよー" if HogeDataRange.new.include?(13)

とかやる気なの?

215 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:24:00 ]
Rubyでできないことって何?

216 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:26:47 ]
>>215
あなたができそうだと思っているようなことは全てうまく行えない

と答えるのが一番実態に近いと思うん
説明してだいたいをわかってもらえるような人はそういう聞き方しないので

217 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:33:05 ]
そっか

218 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:40:42 ]
ものそい他人任せだが、他の初心者にやさしい「見た目わかりやすい」言語を学んでからだと
Rubyのような言語の立ち位置がよく理解できるかと思う

最初からRubyだけ与えられている状態はけっこう不幸だ
だから大学1年の授業にRubyを使うとかいうのは俺はあまりいいと思わん

219 名前:212 mailto:sage [2010/03/11(木) 02:53:01 ]
>>214
そんな感じのをやる気なのですが

220 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:49:39 ]
pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%B5%D5%B0%FA%A4%ADRuby%2FTk
ここの一つ目のサンプルコードをコピペして実行したのですがエラーになってしまいます
それとサンプルのVisualnovelも他のrbファイルを取り込むところで
見つけられないらしくエラーが出てしまいます
requireをしないコードは普通に実行できます
それと実行はRDEでやっています
Pathはbinが環境変数のところで通っています
何がいけないんでしょうか?

XPsp3 Ruby1.8.7 RDE1.1.1.1

C:/DOCUME~1/***/LOCALS~1/Temp/rbF.tmp:1:in `require': no such file to load -- tk (LoadError)
from C:/DOCUME~1/***/LOCALS~1/Temp/rbF.tmp:1
Complete(1)



221 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 06:08:59 ]
tcl入れてないんじゃね?

222 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 10:16:02 ]
そのRuby自体が、tkをサポートしてないRubyに見える

223 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 11:27:44 ]
net/httpライブラリでデフォルトのリクエストヘッダを設定する賢い方法ない?

http.rbのHTTPGenericRequest#initializeを直に書き換えるのは気持ち悪いよな

224 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 11:44:58 ]
そのような動作をするクラスやメソッドを別途作る
net/http そのものを弄ることは推奨されない
固定の HTTP ヘッダが必要なら、固定の HTTP ヘッダを追加して Net::HTTP オブジェクトを作るメソッドを作る

225 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 11:46:51 ]
手順的に不正確だった
> 固定の HTTP ヘッダを追加して Net::HTTP オブジェクトを作るメソッドを作る

Net::HTTP オブジェクトを作って固定の HTTP ヘッダを追加して返すメソッドを作る

226 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 11:57:11 ]
そこまで書くなら Net::HTTP オブジェクト自体はヘッダのデータ持たないと思うにゃん

227 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 12:16:18 ]
よーわからんがこういうの?

require 'net/http'
# Net::HTTP.version_1_2 # 1.8.7では既にtrue

def http_get(uri, header={})
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Get.new(uri.request_uri)
header.each_pair{|k, v| req[k] = v}
return http.request(req)
end
end

uri = URI.parse('www.ruby-lang.org/')
p http_get(uri, {'Accept-Language' => 'ja'}).response['location']
p http_get(uri, {'Accept-Language' => 'en'}).response['location']

228 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 12:19:50 ]
/aaa\/bbb/
という正規表現文字列にマッチする正規表現というのはどう書けばいいんでしょうか。

\/.*?\/
と書いて、中の\/にマッチしないように
\/[^\\\/]*?\/
としてもダメでした。


229 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 12:37:15 ]
irb> Regexp.new(Regexp.quote("/aaa\\/bbb/")) =~ "/aaa\\/bbb/"
0
irb> Regexp.new(Regexp.quote("/aaa\\/bbb/"))
/\/aaa\\\/bbb\//
irb> p "/aaa\\/bbb/".scan(/\/aaa\\\/bbb\//)
["/aaa\\/bbb/"]
nil
irb> p "/aaa\\/bbb/".scan(/\/.+?\\\/.+?\//)
["/aaa\\/bbb/"]

どこまで汎用になればいい?
本当にマッチさせたいものはなに?

230 名前:220 mailto:sage [2010/03/11(木) 12:41:00 ]
jp.rubyist.net/magazine/?0011-CGIProgrammingForRubyBeginners-2#l2
ここに書いてある通り、One clickインストーラーをインストールしたので
tkは自動で入っているらしいのですが
tk.rbで検索してもHDD内のどこにもなかったんですが
やっぱりインストールされていないということなのでしょうか?



231 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 12:53:06 ]
>>230
OneClickInstallerを使って1.8.7になるはずがない
あれは1.8.6しか存在しない
君が使ったのはRubyInstallerで、これはtkライブラリは含まない
Windowsでtkライブラリを使いたいのなら>>6のActiveScriptRubyを使うべき
これならActiveTclが別途入ってればなんとかなる

余談だけど
> 更新日時:2005/11/16 21:36:46
5年も前の記事をほいほい参考にすべきではない

232 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 13:47:54 ]
>>224-227
Thanks!
やっぱソコソコ手間かかるか

目的を正直に白状すると,デフォルトのUAがアレなので
常時ナチュラルなUAでライブラリを使用したいだけなんだよね

俺仕様ってことで推奨されない方法で行きます

233 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 13:53:49 ]
>>228
str = "hoge/aaa\/bbb/fuga"
re = /\/[^\/]++\/[^\/]++\//
p str.slice(re) #=> "/aaa/bbb/"

234 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 13:59:46 ]
>>232
Net::HTTP を直接使用することは極力避けたほうがいい(第一面倒だ)
自作のスクリプトで何度も使うというのならそのようなライブラリを自作するチャンス

俺は wget を定義して require 'orelib/wget' してしばらく使い回してたぞ

235 名前:232 mailto:sage [2010/03/11(木) 14:15:56 ]
>>234
>極力避けたほうがいい
それはどうして?
net/httpのAPIは結構気に入ってるんだけど

コネクションがスレッドセーフじゃないとか
Errno系の例外が不親切とかそこら辺?

236 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 14:28:03 ]
Net::HTTP は抽象度がわりと低いほうだからじゃないでしょうかぬ
システム的な問題ではないと推測

237 名前:220 mailto:sage [2010/03/11(木) 15:25:24 ]
>>231
仰る通り単体のRubyを入れていたようです
oldと書いていたので新しいもののほうがいいと思って
そっちをダウンロードしてしまったみたいです

ActiveRubyをダウンロード
gemのアップグレード
この時点で試しに
require "tk"
したけどエラー、tcltklibbなどtk関連のファイルがあるのに開けないみたい

>これならActiveTclが別途入ってればなんとかなる
この一文がなければここで挫折してました

そしていろいろぐぐっているとVisualuRubyはすでに入っているようなので
こちらでGUIを作りたいと思います
ありがとうございました

238 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:51:12 ]
すみません。お尋ねします。
ファイル上書き確認のコードを書いているのですが

if File.exist?(outfile)
print "#{outfile} は存在しています。上書きしますか ? (y/n): "
answer = STDIN.gets
if /y/i !~ answer
exit;
end
end

問題ないときもあるのですが、状況によっては(その状況が
いまいちよく分からないのですが)printが実行される前に
STDIN.getsに入って、何も表示されないまま待ち受け状態に
なってしまいます。printの対象を事前にflush(?)するには
どうしたら良いのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:08:07 ]
>>213
あんまりよくわからんなりにソースを読んで見たところ(Windows版Ruby1.8.7だとして)

sleep は引数が無いなら WinapiのSleep(INFINITE)で無限に待つみたいで
引数があるなら Winsockのselectっていうのを呼んでた
selectはタイムアウト0秒だとすぐに帰って来るみたいなので
sleep(0) だと sleep() とは違ってすぐに帰ってくるようだ

るりまが間違ってるんじゃないだろうか?
あんまり自信があるわけじゃないので
だれか詳しい人、正確な説明よろしく


240 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:08:27 ]
自分で答言ってる

if File.exist?(outfile)
print "#{outfile} は存在しています。上書きしますか ? (y/[n]): "
$stdout.flush
exit if $stdin.gets =~ /\Ay/i
end



241 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:09:19 ]
>>238
flushって言葉を知ってるなら
IOのインスタンスでありprint等の出力先である$stdoutにそれをすればいい
と言えばわかるんじゃないかな

242 名前:238 mailto:sage [2010/03/11(木) 17:25:47 ]
>>240, 241

バッチリ動きました。ありがとうございました。

情けないことに$stdinの方をflushして
動かんなー、と悩んでました・・・。

243 名前:220 mailto:sage [2010/03/11(木) 18:02:05 ]
tkの方が解説サイトや機能が多いので
TCLフォルダにActiveTCL入れてみたけど実行するとエラーになる
いろんなサイトみて環境変数にパスもちゃんと入れたのに
TCL_LIBRARY TKL_LIBRARY INCLUDE LIBなど
実行するとここを読みに行ってエラー
/Ruby/lib/ruby/1.8/i386-mswin32
ここにもActiveRuby入れたときのTCLがあるのになぜエラー?

もう疲れたよ・・・

244 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:11:21 ]
ActiveScriptRuby(ActiveRubyというものは存在しないしこう表現してもいけない)は
デフォルトで C:\Program Files\ruby-1.8 にインストールするはずだが
C:\Ruby にインストールされるのは RubyInstaller の Ruby

245 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:18:22 ]
RubyInstallerをアンインストールしなかったのか
予想外だ

というかRubyでGUIなんかわざわざやろうという人はもっと熟練して賢いもんだと思ってた

246 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:24:04 ]
やはりTkへのアクセスの存在は隠したほうがいいのかもしれない
もう応対がめんどくさすぎる
デフォルトOFFのRubyInstallerの判断は賢い
…正式版じゃないからかもしれないが

どうしてもTkに処理を渡したいとき用のライブラリであって、
Rubyでウィンドウを作るためにあるわけじゃない
なんでRubyでウィンドウアプリケーションを作ろうと考えるのかもう全く理解できない

247 名前:220 mailto:sage [2010/03/11(木) 18:32:29 ]
簡単なのはRubyと聞いたのでやろうと思ったんだけど
まさかインストールするだけで2日かかるなんて

248 名前:220 mailto:sage [2010/03/11(木) 18:35:42 ]
>>244
空白開いてるといけないとかどこかで見たから
デフォルト変えてD;\直下にインストールしただけ
エラー表示されるときのパスもちゃんとインストールされた
場所のTCLを参照しているし、でもエラーが出る

RubyInstallerはActivescriptRubyを入れる前に
ちゃんとアインインストールしました
残ったフォルダも直接削除しましたし

249 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:38:28 ]
>>247
簡単だよ

ただ、OS操作とコマンドライン文化に不慣れなプログラミング初心者が独学でやっても簡単だと言った人がいたなら
俺が許可するのでグーで殴れグーで

250 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:40:00 ]
>>249
スレのテンプレすら読めない人も追加で



251 名前:220 mailto:sage [2010/03/11(木) 18:46:47 ]
>>246
>なんでRubyでウィンドウアプリケーションを作ろうと考えるのかもう全く理解できない

ここを見たので、この通りやろうとして躓きました
jp.rubyist.net/magazine/?0002-FirstProgramming
逆になぜ作ってはだめなのか私にはわかりません
そういった説明もないですし

252 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 18:48:50 ]
>>250
そだな、>>1の注意書きとか読めてないような人にはたぶん無理だな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef