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

Ruby 初心者スレッド Part 50

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/07/29(日) 14:26:28.92
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0152デフォルトの名無しさん2012/08/29(水) 00:33:19.21
>>145

こういうこと?

def norm doc
sum = 0.0
doc.each_value{|v| sum += v * v}
Math.sqrt(sum)
end

def cosine_similarity doc1,doc2
sum = 0.0
(doc1.keys & doc2.keys).each {|k| sum += doc1[k] * doc2[k]}
sum / (norm(doc1) * norm(doc2))
end

doc1 = {"私" => 1, "太郎" => 1} # 単語の頻度
doc2 = {"私" => 1, "花子" => 1}

puts cosine_similarity doc1,doc2
0153デフォルトの名無しさん2012/08/29(水) 00:46:21.53
>>145
参考までに。
Octopress/JekyllでGroongaによる類似文書検索機能を使う
http://arika.org/2012/07/28/jekyll-and-groonga-similar-search/
0154デフォルトの名無しさん2012/08/29(水) 05:02:47.75
そういえばmecab-rubyてどこいったの?
0155デフォルトの名無しさん2012/08/29(水) 18:10:00.84
「ruby2.0がかなりすごいらしい」ってコピペして回ってるのが居たんですが、1.9と比べて何が凄いんですか?
0156デフォルトの名無しさん2012/08/29(水) 20:57:05.07
下のような、module A と Class C を準備したのですが、同じI/F の module B も準備して
Class C を共通で使いたくなりました。file C.rb で require "A" を "B" 、A::hoge を B::hoge
にするだけですが、class C (file C.rb) は1つのままにしたいです。さらに、Class C を
インスタンスするときにA,B を指示する I/F にはしたくないです。module A,B の wrapper を
用意してclass C はそれを使い、module の切り替えは global チックに行いたいのですが、
その wrapperをどのように記述したらよいかが、わかりません。。


file A.rb
module A
module_function
def hoge(x,y)
end
end

file B.rb
module B
module_function
def hoge(x,y)
end
end

file C.rb
require "A"
class C
def initilize(z)
@x = z
def hoge(w)
A::hoge(@x,w)
end
end
0157デフォルトの名無しさん2012/08/29(水) 21:58:08.61
>>156
AとBを同時に使う必要が無いのであれば
AとBはクラス名を同じにしてそれぞれでrequire 'C'すればいんでね

そうでないなら例えばこんなん
class C
def self.m=(mod) ; @m = mod ; end
def self.m ; @m ; end
def hoge(w) ; self.class.m::hoge(@x,w) ; end
end
C.m = A
0158uy2012/08/30(木) 02:01:13.96
module A
  module_function
  def hoge x , y
    p :a
  end
end

module B
  module_function
  def hoge x , y
    p :b
  end
end

class C
  class << self
    attr_accessor :mod
  end
  def initialize z
    @x = z
  end
  def hoge w
    self.class.mod.method(__method__).call @x , w
  end
end
C.mod = B
c = C.new 2
c.hoge 4
0159デフォルトの名無しさん2012/08/30(木) 23:22:57.36
>>167, >>158 さん、ありがとうございます。
やりたいことができました。本当に助かりました
動的なケースと静的なケースどちらも教えて
いただけて感激です。

確かに静的なケースでは、異なるファイル名で
準備しておいて require しながら起動すれば、
自然に使えますね。依存関係でこり固まっていた
思考が溶けた気分です。
0160デフォルトの名無しさん2012/08/30(木) 23:23:43.38
>>167 でなくて、>>157 さんの間違いです。すみません
0161デフォルトの名無しさん2012/08/31(金) 06:45:57.23
>>137
> (1..20).sort_by{rand}
それ、考えなしの安直プログラマーが高確率でやらかす、典型的なやってはいけないアンチパターンだな。
これは偏りが発生するのでアウト。確率論の問題としては良い題材だから、理由は自分で考えてみるといい。
ぐぐるとこれと同じパターンをやらかす人間が多くて唖然とするが。
0162デフォルトの名無しさん2012/08/31(金) 10:42:37.54
>>161
shuffleが無かった時代に、偏ってもいいからサクッと書きたい用途でよく使われてたんだよ
当時から「ちゃんと混ぜるならちゃんと書く」という風に知られてた
0163デフォルトの名無しさん2012/08/31(金) 11:36:15.90
そもそも言うほど偏り有るの?
sort_by{rand(20)} とか sort{rand-0.5} とかやるならともかく
0164デフォルトの名無しさん2012/08/31(金) 12:21:11.02
irb> a=(1..6).to_a; r=Hash.new{|h,k| k=0}; 1000000.times{r[a.shuffle] +=1}; d=r.values; p Math::sqrt(d.inject(0){|x,y| x+y*y}/d.size-(d.inject(0){|x,y| x+y}/d.size)**2)
62.6418390534633
irb> a=(1..6).to_a; r=Hash.new{|h,k| k=0}; 1000000.times{r[a.sort_by{rand}] +=1}; d=r.values; p Math::sqrt(d.inject(0){|x,y| x+y*y}/d.size-(d.inject(0){|x,y| x+y}/d.size)**2)
61.37589103222861

うん、たいして変わらんですな
0165デフォルトの名無しさん2012/08/31(金) 12:47:16.12
1:def hoge
2:    a = [1,2,3,4,5]
3:
4:    a.each do |b|; c = b; end
5:    p c
6:end

これだとcのスコープが4行目内だけになってエラーになりますが
そこで3行目に
 c = nil
と入れているんですがこれでいいでしょうか?
もっとスマートな方法はないでしょうか
0166デフォルトの名無しさん2012/08/31(金) 12:53:56.71
eachの代わりにfor b in a; c = b; end
0167デフォルトの名無しさん2012/08/31(金) 13:17:29.57
>>165
スコープがそのようになっているんだから、そのように書くのがいちばんスマートだと思うがなにか問題ある?
0168uy2012/08/31(金) 14:40:17.28
1:def hoge
2:    a = [1,2,3,4,5]
3:    p a.last
6:end
0169uy2012/08/31(金) 14:46:12.18
意味把握した
変数宣言がイヤだって事か
元コードみないとわからんけど、eachじゃなくてinjectとかeach_with_objectでやって
そのイテレータの戻り値をcに格納すれば
0170デフォルトの名無しさん2012/08/31(金) 15:17:26.34
>>161
このイディオムはsort_byだから問題ないんだろうと思ってたが
0171デフォルトの名無しさん2012/08/31(金) 15:37:46.80
161はどんなドヤ顔で言ってんだろうw
いるよねー、ランダムのラの字を行った瞬間に脊髄反射で食って掛かるひとw
0172デフォルトの名無しさん2012/08/31(金) 22:21:59.27
>>167-169
ありがとうございます
すいません
説明不足でしたがブロック内で初めて変数を使うとスコープがそのブロック内になってしまうので
>>165のようにブロックの前で変数を宣言するのか(グローバル変数は使うべきではないですよね)もっといい方法があるのか知りたかったということです
>>168>>169
なるほどこれは便利ですね
0173デフォルトの名無しさん2012/08/31(金) 22:45:17.75
ちなみに>>161が言いたかったであろう偏るようなパターンってどんなの?
>>137は偏るの?
0174デフォルトの名無しさん2012/09/01(土) 10:10:46.31
>>173
>>163のパターンは偏るはず
sort_by{rand}はほとんど偏らないけどshuffleよりかなり重い
0175デフォルトの名無しさん2012/09/02(日) 14:15:38.97
module MyModule
def a; p "this is method a"; end
end
class MyClass
include MyModule
def b; p "this is method b"; end
a rescue p "no such method"
b rescue p "no such method"
end

MyClass.new

これでメソッドaとbがないと怒られてしまうのは何ででしょう?
クラス定義の中ではレシーバselfはカレントクラスであるMyClassを参照するはずなのでメソッドa,bを呼べるのでは、と思ったのですが…
0176デフォルトの名無しさん2012/09/02(日) 14:31:05.87
ものすごくおおざっぱに言うと、ふつうのincludeは引数モジュールのメソッドをインスタンスメソッドとして追加する
そして、インスタンスメソッドはクラス定義のclass...endの文脈では呼べない
class C
def a; end
a
end
が3行目でNoMethodError起こすのと同じ理屈
これで納得しない場合はincludeとはなんぞやという話になる
0177デフォルトの名無しさん2012/09/02(日) 15:36:55.01
ゴミみたいなスコープだよね
0178デフォルトの名無しさん2012/09/02(日) 19:00:21.38
>>176
調べてみたりしてなんとなくincludeの役割がわかりましたが、次のコードが動かない理由がわからないです

module MyModule
def self.a; p "this is method a"; end
end
class MyClass
include MyModule
end
MyClass.a

aメソッドをクラスメソッドではなくインスタンスメソッドとして定義してextendしたら MyClass.a で実行できることは確認しました
includeもextendもクラスメソッドは相手にせず、インスタンスメソッドしか見ないという事なんでしょうか
0179デフォルトの名無しさん2012/09/02(日) 20:00:57.17
Rubyに本来クラスメソッドはない。
あるのはクラスインスタンスのインスタンスメソッド。
あとはincludeとextendが何をするものかを考えれ。
0180デフォルトの名無しさん2012/09/02(日) 20:42:44.15
>>179
横から勝手に訂正させてもらうね
×あるのはクラスインスタンスのインスタンスメソッド。
○あるのはクラスインスタンスの特異メソッド。
0181デフォルトの名無しさん2012/09/02(日) 20:44:52.28
Rubyに存在するのはインスタンスメソッドだけ、というのは昔俺も思ってた
普段考えるぶんにはそれでもいいし統一概念ですっきりするんだけど、でも本当はやっぱり違う…
0182デフォルトの名無しさん2012/09/03(月) 00:25:02.82
モジュールをあるクラスにインクルードして使う場合、
モジュール側のメソッド内でそのクラスのインスタンス変数にアクセスするのって普通ですか?
0183uy2012/09/03(月) 05:05:18.87
そのくらいはいいけど
個人的な意見でいえばそこら辺明らかに仕様がイかれてるから
バージョンアップ時に動かないソース作りたくなければ
あまりこだわったことやらない方がいいと俺様は思う
0184デフォルトの名無しさん2012/09/03(月) 06:30:18.49
>>182
システム上および慣習上の問題はないよ
特定のクラス専用の実装べったりのmix-inだね
だいたいにおいてあとあと後悔したりもするが、それが起こらない限りは便利だろう
0185デフォルトの名無しさん2012/09/03(月) 08:23:23.82
>>178
def には役目が2つある
ひとつは、その文脈でのメソッドの定義(予約)

module M
def a; end
end

class C
def b; end
end

これらはメソッドの定義行為であって、その時点で実際にメソッドが作られるわけではない
(include先が)newしたときに、生成オブジェクトに対してインスタンスメソッドとしてどさっと追加される
そしてもうひとつ、既に存在する特定のオブジェクトに対する特異メソッドの追加

def obj.s; end

これは特異メソッドの追加で、オブジェクトobjに対して即座に特異メソッドsを追加する

module MyModule
def self.a; p "this is method a"; end
end

でのdefはその文脈におけるselfの指すオブジェクト(ModuleクラスのオブジェクトMyModule)に特異メソッドを追加する行為であって、クラスやモジュールにメソッドを定義することではない
モジュールオブジェクトMyModuleは定義されたメソッドを持ってないので、includeしようがextendしようがメソッドは使えない
0186デフォルトの名無しさん2012/09/03(月) 09:38:20.46
質問です
初歩的すぎるかもしれませんm(_ _)m
1.9だとerbコマンドは使えないんでしょうか?
参考にしている本は1.8前提だったので;
USB(F:)に入れたためコマンドプロントから入力している状況です

F:\>ruby erb hello.txt.erb

と入力すると、ファイルかディレクトリが見つかりませんというメッセージが出ます
hello.txt.erbというファイルはFドライブに入れています
わかる方教えて頂きたいです
0187デフォルトの名無しさん2012/09/03(月) 09:45:00.50
erbは添付されてるはずだよ
実行できないとしたらそれはcmd.exeが実行ファイルを見つけられないだけだろう

なに言ってるかわからないのなら、フォルダ/ディレクトリと実行パスの勉強をするといい
どうせこれからもずっと必要になる知識だ
0188デフォルトの名無しさん2012/09/03(月) 09:49:38.88
素早いお返事ありがとうございます!!!
回答を頂けて安心しました
勉強します!
0189デフォルトの名無しさん2012/09/03(月) 17:31:55.82
ruby.exeがある場所にerb.batもありませんか?
あれば
ruby erb ではなくてerbだけで実行できるはずですが
01901822012/09/03(月) 21:53:13.15
ありがとうございます
やはり下位のものを上位に持っていくことは極力避けるべきですかね
まだ歴が浅いので、システム面や慣習に関する言及は助かります
0191デフォルトの名無しさん2012/09/03(月) 22:04:43.67
>>190
だから管理できる範囲であるならどうでもいいって
ユーザーがincludeして使うモジュールを作ってるわけでも、ファイル数が30超えてるめんどくさいライブラリを作ってるわけでもあるまい
あるオブジェクトのメソッドがクラス定義に書いてあったものかモジュールで追加されたものかを気にする人はまずいない
ほんとにそっちのほうがプログラミングに便利だと確信するのなら、メソッド定義をごっそりモジュールに移すといい
0192デフォルトの名無しさん2012/09/04(火) 06:12:17.13

def f
p 3
end

lambda(&f).call

これを実行すると

:6:in `<main>': wrong argument type Fixnum (expected Proc) (TypeError)

と、でるんですけど動作原理が良く分かりません
どうなっているんでしょうか?


0193デフォルトの名無しさん2012/09/04(火) 06:36:43.28
まずfが普通に評価されて3になる。つまりこれと同じ
lambda(&3).call
3はProcじゃないしto_procも定義されてないからlambda(&3)でエラー
0194デフォルトの名無しさん2012/09/04(火) 06:59:32.42
試したかったことって要は __send__(:f) とか self.method(:f).call とかでいい?
0195デフォルトの名無しさん2012/09/04(火) 08:37:00.94
どちらがエレガントで負荷的にも良いか質問です。
hogeというメソッドを何度も実行したいとき、
1000.times { B.hoge }
というよりも、
app = A.new
1000.times { app.hoge }
とやるほうがいいのでしょうか?

class A
def initialize
...
end
def hoge
...
end
end

class B
def self.hoge
...
end
end
0196デフォルトの名無しさん2012/09/04(火) 10:45:31.38
100万回連続実行したときに0.001秒の遅れが数億円の損害になるような環境であって、
なおかつどうしてもRubyでやらなければ家族がどうなるかわからないぞと脅されているのなら、俺なら前者で書く
なぜなら、定数Bとローカル変数appを比べたとき、絶対的に定数Bのほうが参照が速いから

そうでないのなら意味的に妥当なほうでやるといい
このためにクラスメソッドっぽくない使い方するクラスメソッドをわざわざ作るようなことはしない
0197デフォルトの名無しさん2012/09/04(火) 10:55:13.62
「メソッドが使いたいだけであって、オブジェクト作りたいわけじゃないんだよね」という感覚はないでもないことがないでもない
もしそうならクラスメソッドとかの出番だろうか
0198デフォルトの名無しさん2012/09/04(火) 12:00:10.98
あとあとめんどくさくないことが多いのはAのパターンだと思う
効率とエレガントさに関してはどっちも変わらん
0199デフォルトの名無しさん2012/09/04(火) 22:09:07.93
家族を見殺しにしてでも、cで書くよ
0200デフォルトの名無しさん2012/09/09(日) 20:24:13.08
ruby-openglが、ruby 1.9.3 でインストできない。

1.8.7使えってことかよ。
0201デフォルトの名無しさん2012/09/09(日) 21:20:17.29
>>200
ttp://ruby-opengl.rubyforge.org/build_install.html
まあ最新が2009年なので現在の環境ではどーやっても動作しない可能性はないでもない
02021952012/09/10(月) 02:15:56.97
196-199
スピードと使い勝手の勘所、
よくわかりました、あざっす!
0203デフォルトの名無しさん2012/09/10(月) 10:06:55.79
Bは毎回initializeする訳ですか?
0204デフォルトの名無しさん2012/09/10(月) 10:29:53.45
Ruby が class B ... end を最初に見かけたときに1度だけ B = Class.new 相当をしてる
メソッドを1回使いたいだけなのに毎回オブジェクトを作るのはなんかアレだということが起こらないという点でもエコ

っていうか状態を保持利用しない単発野良メソッドでいいならモジュールのクラスメソッドでいい

module M
def M.mes
end
end

M.mes
M.mes
M.mes
0205デフォルトの名無しさん2012/09/13(木) 11:55:57.43
mtime, atimeを変更するメソッドってありますか?unixでいうと
touch -t yymmddみたいなものです。
File.mtime File.atimeはただ取得するだけみたいなのです。
system(touch -t yymmdd)するしかないですか?
02062052012/09/13(木) 11:57:46.80
あ,すいません。「特定の日付」に変更という意味です。
0207デフォルトの名無しさん2012/09/13(木) 12:02:41.51
utime
02082052012/09/13(木) 12:15:20.71
>>207
ありがとうございました。
0209デフォルトの名無しさん2012/09/13(木) 13:12:39.38
どういたしまして
0210デフォルトの名無しさん2012/09/14(金) 11:11:18.61
Ruby始めようと思っていきなりプログラミング言語Ruby買ったけどちょっと難しいな
C、Java、Pythonは経験あるんだが
0211デフォルトの名無しさん2012/09/14(金) 12:36:26.71
言語が平易だからといって言語本体の解説書が平易だとは限らない
素直に入門書を手に取るべきだったな
0212デフォルトの名無しさん2012/09/14(金) 12:58:29.16
つ ttp://i.loveruby.net/ja/rhg/
0213デフォルトの名無しさん2012/09/14(金) 23:15:17.09
>>210
あれをいきなりやるのは難しいと思う
『初めてのRuby』辺りで書き方をつかむと、言語仕様との落差にびっくりする
大部分のケースでは平易に書ける一方で
細部をつつくといくらでもカオスになるのがRuby
0214デフォルトの名無しさん2012/09/15(土) 22:14:50.24
Windows上のあるフォルダが隠し属性または保護されたオペレーティングファイルであるか判定する方法はありませんか?
例えば "$RECYCLE.BIN" と "System Volume Information" というフォルダです。
これらのフォルダが存在しないパス上で、これらの名前でフォルダを作れるので名前で判定することは出来ません。
どなたか知恵を伝授してください。
0215デフォルトの名無しさん2012/09/16(日) 01:34:44.72
// cscript attr.js
var o, f;
var hidden = 2;
var system = 4; // 設定がわからん
var folder = 16;
var mask = hidden | folder;
o = WScript.CreateObject("Scripting.FileSystemObject");
f = o.GetFolder("D:\\work\\hiddenFolder");
if( (f.Attributes & mask) == mask ) {
  WScript.echo("hidden | folder");
}

/*

D:\work>cscript attr.js
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

hidden | folder

D:\work>

*/
0216デフォルトの名無しさん2012/09/16(日) 02:13:49.46
D:\work>attrib /?
ファイル属性を表示または変更します。

ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[ドライブ:] [パス] ファイル名]
       [/S [/D]]

  +   属性を設定します。
  -   属性を解除します。
  R   読み取り専用属性。
  A   アーカイブ属性。
  S   システム ファイル属性。
  H   隠しファイル属性。
  /S  現在のディレクトリとすべてのサブフォルダの一致するファイルを
      処理します。
  /D  フォルダも処理します。


D:\work>attrib /s /d hiddenFolder
    HR     D:\work\hiddenFolder

D:\work>
0217デフォルトの名無しさん2012/09/16(日) 13:37:15.68
Rubyからファイル属性を取得することは無理でしょうか?
cscriptの他にRubyからWind32apiを呼び出すぐらいしか方法ないでしょうか?
0218デフォルトの名無しさん2012/09/16(日) 14:17:06.28
できないんじゃないかなあ。こういうのあるぐらいだし
https://github.com/djberg96/win32-file-stat
system? と hidden? で取れるっぽい
0219デフォルトの名無しさん2012/09/16(日) 17:50:34.30
おいバカ初心者、よく見やがれw

死ねバカwwwwwwwwwwwwwwwwwwwwwwww

死ねwwwwwwwwwwwwwwwwwwwwwwww


死ねwwwwwwwwwwwwwwwwwwwwwwww


死ねwwwwwwwwwwwwwwwwwwwwwwww

ゴミwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

ゴミゴミゴミwwwwwwwwwwwwゴミゴミゴミwwwwwwwwwwww

ゴミwwwwwwwwwwwwゴミゴミゴミwwwwwwwwwwwwwwwwww
死ねゴミwwwwwwwwwwwwwwwwwwwwwwwwコラwwwwwwwwwwww
死ねコラゴミwwwwwwwwwwwwwwwwww
0220デフォルトの名無しさん2012/09/17(月) 02:21:48.68
「ひな壇は韓流タレント中心に」という構想が一変、TV界と韓流の今 09/16 13:00
http://woman.infoseek.co.jp/news/entertainment/cyzowoman_16Sep2012_25106


 日韓の関係悪化の影響により、韓流離れが加速する現在のテレビ業界。
しかし、2年ほど前には広告代理店を中心に「ゴールデンタイムの番組には韓国人タレントを使用する」流れが作られていたという。

現在は吉本興業所属の芸人が幅を利かせる“ひな壇タレント”を、そっくり韓流と入れ替えるという計画だったそうだ。

 日本国内で、KARAや少女時代がブレークした2010年。
日本音楽事業者協会会長で「尾木プロ」社長の尾木徹氏が、K-POPアーティストの誘致に尽力したと伝えられていた。
そして同時期頃から、広告代理店やテレビ局上層部の間では、こんな“定説”が存在していたという。

「2011年以降は、ゴールデンのバラエティから、吉本芸人はほとんどいなくなります。
代わりにひな壇に座るのがK-POPアーティストや、韓流タレントたち。

安定してレギュラー番組を続けられそうなのは明石家さんま、島田紳助、ダウンタウンくらいで、その他の芸人たちは有名無名問わず降板させていこうという方針でした」(広告代理店幹部)

 ところが3月の震災で、エンタメ業界は数カ月ほど停滞状態が続くことに。
その前後に日本デビューを果たしたK-POPアーティストや、バラエティに登場した韓流タレントも少なからず存在したが、テレビ出演者が大幅に入れ替わるといった事態に至ることはなかった。

「紳助は引退してしまったし、高岡蒼佑のフジテレビ韓流傾倒批判など想定外の事態はいくつも発生しました。
特にネット上でのフジテレビ批判は見過ごせるレベルの話ではなく、連日の抗議デモやスポンサー企業の不買運動など、韓流に対する不安要素ばかりが高まっていきました」(同)

 そして今回の竹島問題で、韓流コンテンツへの傾倒に関して沈黙を貫いてきたテレビ各局も、方針を表明。
フジテレビは当面韓流ドラマの放送予定はないとし、またBS日テレの定例会見では赤座弘一社長が「韓国ドラマが多すぎるのではという声もある。
少なすぎるという声はないので、今後、(韓流ドラマを)少なくしていく方向になると思う」と発言したことも話題になった。


0221デフォルトの名無しさん2012/09/17(月) 12:18:52.78
anというバイト情報サイトから最新情報をプログラムで取得しようと思って以下のようなプログラムを書きました。

require 'net/http'

Net::HTTP.start("area-baito.weban.jp", 80) do |http|
response = http.get('/webapp/are/PSPCALI200L.do?A1=03&J1=07&V1=05&Z1=014&CMD=300&FID=300&V13=40&V2=1')
puts response.body
end

しかし結果は何も表示されません。
調べてみると、responseの時点で、正常であればNet::HTTPOKが返ってくるはずなのですが、
上のプログラムだとなぜかエラーページにリダイレクトされてNet::HTTPFoundが返ってきていました。

http://area-baito.weban.jp/webapp/are/PSPCALI200L.do?A1=03&J1=07&V1=05&Z1=014&CMD=300&FID=300&V13=40&V2=1
というアドレスはブラウザで見れば正常に見れるURLです。
なぜプログラムで取得しようとするとエラーページに飛ばされてしまうのでしょうか?
0222デフォルトの名無しさん2012/09/17(月) 12:55:07.69
そのスクリプトのままで動いたよ

$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]

$ ruby hoge.rb
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   :
<html lang="ja">
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J">
        <meta http-equiv="Content-Style-Type" content="text/css">
        <meta http-equiv="Content-Script-Type" content="text/javascript">
  :
02232212012/09/17(月) 13:35:02.72
>>222
試していただいてありがとうございます。
ただ、それはrubyのバージョンの違いのようです。
1.8.7だとリダイレクト先の結果が表示されるみたいです。
私の環境の1.9だと何も表示されないようです。
いずれにしてもエラーページにリダイレクトされているみたいです。

プログラムでアクセスするとanのサーバー側で何かしらのヘッダーを見て、これはロボットだからエラーに飛ばせ、
みたいな処理をしているのかなぁと。。
0224デフォルトの名無しさん2012/09/17(月) 13:49:19.74
その可能性に考えが及んでいるなら
とりあえずUser-Agentの偽装くらいは試そうぜ。
02252212012/09/17(月) 14:12:48.25
User-Agentはgetメソッドのオプションで色々設定してみたのですが、駄目でした。
javascriptはブラウザで無効にしてもページが見れたので、問題ないようです。
02262222012/09/17(月) 15:05:31.78
確かに >>222 はエラーページだった。
調べてみたら、User-AgentとCookieのANUSRIDを返せばページが返ってくるみたい。
Cookieは他にもJSESSIONID等がセットされるので、それらも含めてちゃんと
セットするのがよいと思う。とりあえず確認するなら、ブラウザが保存しているANUSRIDを
使ってみればいいかと

require 'net/http'

Net::HTTP.start("area-baito.weban.jp", 80) do |http|
    hdr = Hash.new
    hdr['User-Agent']='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'
    hdr['Cookie']='ANUSRID=999999999999999999999999999999999999999999'
    response = http.get('/webapp/are/PSPCALI200L.do?A1=03&J1=07&V1=05&Z1=014&CMD=300&FID=300&V13=40&V2=1', hdr)
    puts response.body
end
02272212012/09/17(月) 19:33:21.58
ありがとうございます!無事表示できました!
もう諦めていたので2chを見ていませんでした。遅くなってしまいすいませんでした。
クッキーを設定しないと駄目だったとは・・・これは自力では無理でした。ありがとうございました。
0228デフォルトの名無しさん2012/09/18(火) 07:29:40.40
ゴミ
0229デフォルトの名無しさん2012/09/19(水) 15:23:37.62
すいません。
ライブラリーとモジュールの違いを分かりやすく説明してくれないでしょうか?
グーグルで調べたんだけどいまいち分からない。
0230デフォルトの名無しさん2012/09/19(水) 16:25:38.37
関数を別ファイルにして後から再利用可能な形で呼べるようにしたものがライブラリ
ライブラリに沢山関数があると訳が判らなくなるので名前空間がぶつからないように整理したり
必要に応じて関連した処理や機能でまとめてライブラリにしたものがモジュール
0231デフォルトの名無しさん2012/09/20(木) 00:35:11.70
クラスとことなり、モジュールは、インスタンスをもてない。
クラスにモジュールをインクルードして新しいクラスを作る機能をMix-inと呼びます。
多重継承と対照的に、単一継承によって、Rubyは、継承関係を保ちながら、
モジュールのMix-inによって、多様な依存関係を表現できます。
0232デフォルトの名無しさん2012/09/20(木) 05:17:09.05
>> [1,2,3,4,5].sort{|i,j| i.odd? - j.odd?}
NoMethodError: undefined method `-' for true:TrueClass

>> [1,2,3,4,5].sort{|i,j| i.odd? <=> j.odd?}
NoMethodError: undefined method `<=>' for true:TrueClass

>> [1,2,3,4,5].sort{|i,j| i.odd?.to_i - j.odd?.to_i}
NoMethodError: undefined method `to_i' for true:TrueClass

>> [1,2,3,4,5].sort{|i,j| (i.odd? ? 1:0) - (j.odd? ? 1:0)}
=> [2, 4, 3, 1, 5]

実際に使いたいのはodd?ではなくString#include?等なんですが
boolの比較のもうちょっとスマートな書き方ってないでしょうか
0233デフォルトの名無しさん2012/09/20(木) 06:14:21.84
irb> p %w[A1 2b A3 4A c5].partition{|s| s.include?('A')}
[["A1", "A3", "4A"], ["2b", "c5"]]
irb> p %w[A1 2b A3 4A c5].partition{|s| s.include?('A')}.map{|a| a.sort}.flatten
["4A", "A1", "A3", "2b", "c5"]

あんま短くなってないっすな
0234デフォルトの名無しさん2012/09/20(木) 06:28:01.86
('A`)マンドクセ
0235デフォルトの名無しさん2012/09/20(木) 12:13:48.33
cond? ? 0 : 1 とかの結果でソートするしかないね
true と false を比較したら true が先に来て欲しいという要望は結構あるんだが

?> [2,3,1,5,4].sort_by{|x| [(x.odd? ? 1 : 0), x]}
[2, 4, 1, 3, 5]
0236デフォルトの名無しさん2012/09/21(金) 07:55:38.84
rubyって真理値のソートできないのかよ
クソだな
0237デフォルトの名無しさん2012/09/21(金) 08:16:34.63
列挙型は定数で勝手にやれといういい加減さなのに
真偽はなぜかPascalをはるかに上回る厳格さ(≒貧弱さ)というのが謎だ
0238デフォルトの名無しさん2012/09/21(金) 10:41:20.09
真理値はintじゃないし、Boolクラスもない、という、
単に「そういう設計」というだけのことなのだが。

C言語あたりを、たいして深く理解もせずに、他の言語を、
俺の知ってる言語と違うとdisる輩は多いねぇ。
0239デフォルトの名無しさん2012/09/21(金) 11:00:59.45
馬鹿には無理
0240デフォルトの名無しさん2012/09/21(金) 21:21:39.20
最低限これくらいのメソッドは実装して欲しいところ。
http://msdn.microsoft.com/ja-jp/library/system.boolean_members%28v=vs.80%29.aspx
0241デフォルトの名無しさん2012/09/21(金) 23:39:02.69
文字列tとsがあって、tがsで始まるかどうか判定するにはどうすればいいでしょうか?
if t[0,s.size] == s
0242デフォルトの名無しさん2012/09/21(金) 23:45:34.39
irb> p 'Ruby'.start_with?('Ru')
true
irb> p 'Perl'.start_with?('Ru')
false

Ruby1.8.6では動作しないので正規表現を使う

irb> p 'Ruby' =~ /\A#{'Ru'}/
0
irb> p 'Perl' =~ /\A#{'Ru'}/
nil
0243デフォルトの名無しさん2012/09/21(金) 23:46:34.98
いやいやいや、indexでしょ
0244デフォルトの名無しさん2012/09/21(金) 23:53:11.03
('Perl'*2**2**1024+'Ruby').index('Ruby')
0245デフォルトの名無しさん2012/09/22(土) 00:34:21.36
irb> "This is a pencil." =~ /\A#{"This is a pen."}/
=> 0
0246デフォルトの名無しさん2012/09/22(土) 00:38:03.01
嫌な性格してるなあ

"This is a pencil." =~ /\A#{Regexp.quote("This is a pen.")}/

これでいっすか
0247デフォルトの名無しさん2012/09/22(土) 00:43:25.34
start_with?なんていつの間に追加されたんだよ
ありがとうこれで行きます
0248デフォルトの名無しさん2012/09/22(土) 06:46:31.03
旅行会社にソウルなど韓国へのツアーのキャンセルが相次いでいる。竹島問題をめぐる感情悪化が理由だが、
両国の対立はこれまでにも繰り返され、そのたびに「政治と経済は別」との考えから沈静化に向かっていた。
ところが今回は「嫌韓ムード」もあり、問題再燃から1カ月近くたった今も沈静化どころか、影響が拡大しつつある。

 「韓国は海外渡航先でトップ3に入るドル箱。事態の長期化だけは避けてほしいのだが…」

 大阪市内の日本旅行の店頭には担当者の願いもむなしく、8月下旬以降、韓国への個人パック旅行のキャンセルが
止まらない。関西発着分の9〜10月の予約は前年同期比4割減にまで達しているほどだ。

旅行会社にとってはドル箱の韓国だが、韓流に夢中となり、韓国に何度も出掛けていた女性を中心とする日本人の
意識も少しずつ変わり始めている。

「どのチャンネルも似たような韓国ドラマばかりでうんざりしている」。大阪市内に住む40歳代の女性はこう話す。

また、6月に兵庫県・神鍋高原で韓国人歌手によるコンサートを企画した大阪のイベント会社が突然、倒産した。
2日間でチケット約2万枚の販売を見込んでいたが、売れたのはわずか1400枚。しかも、チケットの全売上高を
歌手への出演料に回したため、払い戻しに応じられない事態となり、チケット購入者からは「詐欺だ」との声が上がった。

 「必要以上に持ち上げられた韓流ブームが薄らぐ一方、嫌韓ムードは日増しに高まっている。韓国への旅行の
落ち込みも長期化するのでは」と旅行業界の関係者は先行きを警戒する。

 実際、韓国に旅行した東京都在住の40歳代女性はこう話す。

 「日本人とわかれば、屋台やタクシーなどは平気で価格をつり上げる。罵声を浴びせる人もいる。竹島問題もあり、
今は行きたくないですね」
http://www.sankeibiz.jp/econome/news/120918/ecc1209180800000-n3.htm
0249デフォルトの名無しさん2012/09/23(日) 16:11:57.97
5バイトのファイルがあって、中身が
先頭4bit : 項目A
次の12bit : 項目B
次の20bit : 項目C
次の4bit : 項目D
の数値データ(big endian)が格納されているとします。
項目A〜Dの値をスマートに取り出すにはどうすればいいですか?
0250デフォルトの名無しさん2012/09/23(日) 17:32:19.11
bindataっていうライブラリがあるよ。gemで入る

以下スマートとはほど遠いコード
buf.unpack("B*")[0].scan(/(.{4})(.{12})(.{20})(.{4})/)[0].map{|e| e.to_i(2) }
0251デフォルトの名無しさん2012/09/23(日) 21:31:34.85
Rubyの標準添付ライブラリってどういう意味なの?
たとえば、
http://doc.ruby-lang.org/ja/1.9.3/library/index.html
を見るとGDBMなんかも入っているけど、実際にはLinuxでもWindowsでも標準で入ってないんだが

0252デフォルトの名無しさん2012/09/23(日) 21:37:00.13
ext/gdbm はソースに入ってるだろ。
■ このスレッドは過去ログ倉庫に格納されています