Ruby 初心者スレッド ..
[2ch|▼Menu]
481:デフォルトの名無しさん
08/02/02 10:04:11
>>478
>>479
せんくす

482:デフォルトの名無しさん
08/02/02 13:43:33
ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。
しかし、「データがありません」という場合どうするかで悩んでます。

a) 空のハッシュ {} を返す
b) 偽である nil を返す
c) 自作の例外を発生させる

どれが妥当でしょか。
このハッシュは別の大きなハッシュに {サイト名 => parsed_hash} のように格納される予定です。
データがありませんの大きな理由として
「過去のハッシュとの差分がゼロ」
「HTML中にパースすべき該当項目なし」
「そもそもサーバにアクセスできない」
等があります。

483:デフォルトの名無しさん
08/02/02 14:05:59
erbについて質問があります。
下記のようなコードを書いてerbに変数ItemListの内容を出力しようと思います。
PHPのテンプレートエンジンのSmartyのようにassignメソッドがあればいいのですが
どうも見当たりません。
変数のスコープの問題だと思うのですが、どうやって出力すればいいのでしょうか?

def initialize
@cgi=CGI.new
end

# 商品一覧
def doItemList
@erb = ERB.new("item_list.tpl")
im=ItemManager.new()
itemList=im.getItemList(10)
display()
end

# テンプレート出力
def display(contentType="text/html")
print "Content-Type: #{contentType}\n\n"
print @erb.result(binding)
end


484:デフォルトの名無しさん
08/02/02 14:49:15
Rubyが面白そうなので今日からRubyをはじめます(^-^)
まずはダウンロードしてこなきゃ!!o(^-^)o

485:デフォルトの名無しさん
08/02/02 14:54:20
>>460
俺がよく書くのは

> ruby -e "puts ENV['PATH'].split(';')"(sortを加えることも)

だって、生のPATH記述って読み辛いんだもの…。

486:デフォルトの名無しさん
08/02/02 15:00:05
>>459
なんだかすごく助けられた気がする
深謝

487:デフォルトの名無しさん
08/02/02 15:09:33
>>483
erbを一度も使ったことのない俺がWeb上の解説を読んで適当に回答するよ!
> in `display': undefined local variable or method `itemList' for #<MyCGI:0x4030ed9c> (NameError)
こんなエラーが出るという質問だと推測。itemListをインスタンス変数あたりに書き変えると動いたよ!

require 'erb'
class MyCGI
def doItemList
im = ItemManager.new
@itemList = im.getItemList(10)
@erb = ERB.new(DATA.read)
display
end
def display(contentType="text/html")
@contentType = contentType
@erb.run(binding)
end
end

class ItemManager
def getItemList(n); (1..n).to_a; end
end

MyCGI.new.doItemList
__END__
Content-Type: <%= @contentType+"\n\n" %>
<%= @itemList.join(',') %>

488:デフォルトの名無しさん
08/02/02 15:17:35
@erb.runあるいは@erb.resultをするメソッドから
erbスクリプト内で使ってる名前の変数が読めないとダメっぽいという話。たぶん。
だからこれでも動く。displayに引数があるのは気持ち悪いのでoutputに変更(というかdisplayはto_sの以下略)

require 'erb'
class MyCGI
def doItemList
im=ItemManager.new
itemList=im.getItemList(10)
@erb = ERB.new(DATA.read)
output(itemList)
end
def output(itemList, contentType='text/html')
@erb.run(binding)
end
end

class ItemManager
def getItemList(n); (1..n).to_a; end
end

MyCGI.new.doItemList
__END__
Content-Type: <%= contentType+"\n\n" %>
<%= itemList.join(',') %>

489:デフォルトの名無しさん
08/02/02 15:17:35
>>487
レスどうもです。
やっぱり、スコープの問題なんですね。
MyCGIのインスタンス変数にしてしまうってのが・・・
なんか書き方として気持ち悪いような。

itemListのまま使いたいとすれば、def doItemListの中でerbを使うしかないって事ですかね?
やっぱり、assign欲しい・・・

490:デフォルトの名無しさん
08/02/02 15:54:52
assignだと何か便利なんですかね
あとerb使うときはERB::Utilでエスケープするようにしてくれえ

491:デフォルトの名無しさん
08/02/02 16:42:55
bindingはただの関数的メソッドなので、変数に入れてdisplayに渡せばいい
ただ、bindingしたあとにローカル変数を「追加」するのは面倒なので注意
この場合、display内でcontentTypeを設定してitem_list.tplで使用するのは面倒

# item_list.tpl
<%=h itemList.map{|e| "<#{e}>"}.join(' ') %>

# out.rb
require 'erb'
class MyCGI
include ERB::Util
def doItemList
@erb = ERB.new(File.open("item_list.tpl").read)
im=ItemManager.new()
itemList=im.getItemList(10)
binding_data = binding
display(binding_data)
end
def display(binding_data,contentType='text/html')
print "Content-Type: #{contentType}\n\n"
print @erb.result(binding_data)
end
end

class ItemManager
def getItemList(n) ['あ','い','う','え','お']; end
end

MyCGI.new.doItemList

492:デフォルトの名無しさん
08/02/02 17:14:24
>>482
ハッシュを加工するなら空のハッシュを返すかも
HTMLから抜き出すならnilでいいんじゃね

493:デフォルトの名無しさん
08/02/02 17:30:02
>>490
assignあると明示的にこれ使いますよってできるから、わかりやすいんですよ。個人的には。
Railsだと、erbのスコープはどうなってるんでしょう?

494:デフォルトの名無しさん
08/02/02 17:48:35
引数バージョンをことごとく無視してるのは何か理由があるのか
いっそのことPHPで書けば?

495:デフォルトの名無しさん
08/02/02 19:35:17
引数バージョンって何?

496:デフォルトの名無しさん
08/02/02 19:41:33
bindingをdisplayの引数にすれば? ということじゃないの?


497:デフォルトの名無しさん
08/02/02 19:43:30
>>482
>ネット上の、時々更新されるHTMLをパースしてハッシュにして返すメソッドを作りました。
>しかし、「データがありません」という場合どうするかで悩んでます。
>
>a) 空のハッシュ {} を返す
>b) 偽である nil を返す
>c) 自作の例外を発生させる

「データがありません」を表すなら、b) がよい。
a) は、データがない場合とある場合とを同じように扱いたい場合に採用する設計。
c) はやりすぎ。

ただ、b)とa)はそう大差がない。


498:デフォルトの名無しさん
08/02/02 19:55:28
>>489
>やっぱり、assign欲しい・・・
あんま関係ないけど、Erubisだとできるみたい。assignじゃなくてHashつかうんだけど。
def doItemList
  @eruby = Erubis::Eruby.new(DATA.read)
  itemList = ItemManager.new.getItemList(10)
  output(:itemList=>itemList)
end
def output(hash)
  print @eruby.evaluate(hash)
end

>>490
>あとerb使うときはERB::Utilでエスケープするようにしてくれえ
これもErubis::EscapedEruby使うとデフォルトでエスケープされる。


499:デフォルトの名無しさん
08/02/02 20:23:12
>>496
>>488もじゃね?

表示したいデータをローカル変数にした状態でrunするので問題ないと思うんだけどなあ
変数の参照を全部持ってくbindingがイヤなんだろ、つまり

500:デフォルトの名無しさん
08/02/02 20:26:23
>>499
*.rhtmlでローカル変数を変更したら、それがもとのプログラムにも影響与えるじゃん。問題ありだろ。

501:デフォルトの名無しさん
08/02/02 20:48:21
require 'erb'
def main
include ERB::Util
erb = ERB.new(DATA.read)
str = 'strは文字列だよ!'
puts str
message = 'こんにちは'
print erb.result(binding)
puts str
end
main
__END__
<%=h message %>
<% str='strが変更されました' %>

=============================
~$ ruby erb.rb
strは文字列だよ!
こんにちは

strが変更されました
~$

ぬう

502:デフォルトの名無しさん
08/02/02 20:59:25
ページキャッシュ機能持ってるRubyのテンプレートエンジンってないの?

503:デフォルトの名無しさん
08/02/02 21:12:24
>>500-501
require 'erb'
class MyCGI
def main
str = 'default'
p str
msg1 = 'Hello'; msg2 = 'World'
output(msg1, msg2)
p str
end
def output(msg1, msg2)
erb = ERB.new(DATA.read)
erb.run(binding)
end
end
MyCGI.new.main
__END__
<%= "#{msg1},#{msg2}!" %>
<% str='**CHANGED**' %>

- - - 8< - - - 8< - - - 8< - - - 8< - - - 8< - - -

$ ./test.rb
"default"
Hello,World!

"default"

504:デフォルトの名無しさん
08/02/02 21:33:11
そんなに気になるならErb.newしてrunするクラスを別途作れば?

っていうのがきっとErubisなんだろうな…

505:デフォルトの名無しさん
08/02/02 21:38:29
>>502
出力結果のHTMLをキャッシュするという話なら、それはテンプレートエンジンとは別に用意する機能だよ。
テンプレートエンジンに持たせる機能じゃない。

506:デフォルトの名無しさん
08/02/02 21:56:08
>>505
つSmarty

507:デフォルトの名無しさん
08/02/02 22:17:06
素のERBには無理だろうね
そこまでは気を遣ってないというかそれは自力でやれというか

…Erubisにはあるようなことが書いてあるなあ
URLリンク(www.kuwata-lab.com)

508:デフォルトの名無しさん
08/02/02 23:35:37
Erubisは高速なERBとして、開発されてて、
その高速化の手段の一つとして、キャッシュすることも挙げてたからな。

Preprocessing 何つー機能もあるくらいだし

509:デフォルトの名無しさん
08/02/02 23:38:54
別にERBは遅くないけどね

510:デフォルトの名無しさん
08/02/03 02:08:48
プログラムの中から、コンソール出力に行くはずのテキストオブジェクトを奪ってファイルに出力したいんだけど。。

より具体的にはTest::Unitを使いたいんだが、そのログをファイルにしたい。
ぱっとリファレンスを読んだ限りじゃそういう類の見つからないし、なんかいい方法ないですか。

もし複数いい方法があれば、それぞれの違いについて簡単な解説つきだととても助かる。

511:デフォルトの名無しさん
08/02/03 02:10:55
ruby unko.rb > benki.txt

512:デフォルトの名無しさん
08/02/03 02:21:20
はじめまして、ネットワークの初歩のコードを書いてみたのですが

def checkSite( address )
url = URI.parse(address)
res = Net::HTTP.start(url.host, url.port){|http|
http.head(url.path)
}

# HTTP_OKなら
if res.code == 200 then
p res['content-type']
else
p res['content-type']
puts "error : " + res.code.to_s
end
end

実行結果が

"text/html;charset=UTF-8"
error : 200

になります
res.code == 200なのにifでうまくひっかかりません
これは何を勘違いしているのかご指摘お願いしますm(__)m

513:デフォルトの名無しさん
08/02/03 02:25:00
"200"

514:デフォルトの名無しさん
08/02/03 02:27:07
>>512
こういうのは自分で実際にデータを表示して試行錯誤

require 'uri'
require 'net/http'

url = URI.parse('URLリンク(www.2ch.net)')
res = Net::HTTP.start(url.host, url.port){|http|
http.head(url.path)
}
p res.code


の実行結果

$ ./http.rb
"200"

つまりはそういうこと

515:デフォルトの名無しさん
08/02/03 02:29:21
if res.code == '200' then

ならOK

516:デフォルトの名無しさん
08/02/03 02:31:10
>>513
>>514
>>515
さっそくのお返事ありがとうございます、解決しました
res.codeは数値だと思い込んでいて(.to_sできるし)ハマっていました

517:デフォルトの名無しさん
08/02/03 02:46:58
'200'と書くよりはわかりやすい(かも)

require 'net/http'
Net::HTTP.version_1_2
uri = URI.parse('URLリンク(www.2ch.net)')
res = Net::HTTP.start(uri.host, uri.port){|http|
http.head(uri.path)
}
if res.code_type == Net::HTTPOK
p res
end


518:510
08/02/03 03:16:21
>>511

519:510
08/02/03 03:16:48
すまん…
>>511

520:510
08/02/03 03:21:00
すまん、二回も立て続けに書きかけで書き込んでしまった
>>511
えと、それが出来るのならそうしたんだ。

ただ、残念ながら、telnetが禁止されてるレンタルサーバー上で、念のためモジュールテストを行いたくて、
そいでそういうニーズが出てきてるんだよ。

だから、そうやってコマンドラインでリダイレクトできれば楽なんだけど、コマンドラインそのものが扱えないというわけ。

まぁもっとも、UnixもRubyも初心者なので、その回答で正しいのなら…もう少し説明してくれると助かる。

521:デフォルトの名無しさん
08/02/03 03:25:56
#!/usr/bin/ruby
system("ruby unko.rb > benki.txt")

522:510
08/02/03 03:34:55
当たり前でシンプル。
ありがとう。なるほど。
後は必要に応じて加工し放題だな。

523:デフォルトの名無しさん
08/02/03 03:39:09
Ruby的には出力先をねじ曲げるのが妥当

$stdout=File.open('output.txt','w')
$stderr=File.open('errors.txt','w')
puts 'テストだよん'
raise 'エラーだよん'

これ以降、puts や print の標準出力は$stdoutで指定したoutput.txtに、
例外とかのエラー出力は$stderrで指定したerrors.txtに書き込まれる

が、これは意外とめんどいんで、シェルのリダイレクト代わりに使うなら>>521で十二分かと

524:デフォルトの名無しさん
08/02/03 03:41:42
>>521 だとフォームとかの情報が伝わらないんじゃないかな?
標準入力の情報を渡す必要がありそう。

525:デフォルトの名無しさん
08/02/03 03:45:40
ユニットテストならフォームの情報は不要で
自分でデータ渡してるだろうから多分問題ないだろう。

526:デフォルトの名無しさん
08/02/03 04:28:14
>ただ、残念ながら、telnetが禁止されてるレンタルサーバー上で、念のためモジュールテストを行いたくて、

いまどきtelnetなんてどこでも禁止されてるだろ


527:デフォルトの名無しさん
08/02/03 04:31:17
ターミナル経由のログインのことだと解釈したけど
ファミコンとかゼロックスとかと同じような感じ

528:デフォルトの名無しさん
08/02/03 05:29:46
今時、telnetといって文字通り捉えるのははずかしいぞ

529:デフォルトの名無しさん
08/02/03 06:18:09
今時telnetがデフォで入ってるのはWindowsとOSXくらいのもんだろw

530:デフォルトの名無しさん
08/02/03 11:46:24
普通は「shellの利用が禁止されてる」っつー罠

531:デフォルトの名無しさん
08/02/03 12:17:56
>>529
デーモンはともかく、クライアントとしてのtelnetはPOPやHTTPみたいな
プロトコルを手で喋る(?)ときに重宝するから入っていそうだが。

とはいえ、デフォでは入ってないかもな。


532:デフォルトの名無しさん
08/02/03 12:37:16
本の感想サイトから書名とレビューを抜き出して表示するプログラムを作るとします。
表示は「とにかく一覧として表示されればいい(新着が存在することを明示しなくていい)」とします。

昨日抽出したとある本のデータのハッシュは以下の通りでした。PStoreで保存します。
book = {'title'=>書籍名, '著者'=>著者名, 'review'=>['面白かった。','まあまあだと思った。']}
で、今日アクセスしてHTMLをスキャンした結果が
today = {'title'=>書籍名, '著者'=>著者名, 'review'=>['面白かった。','まあまあだと思った。']}
という、昨日と中身同じな未更新の内容でした。相手のHTMLには最終更新日などの情報はありません。

1) ハッシュの上書きの特徴を利用し、強制的にbook.update(today)してbookを今日の結果として表示させる
2) reviewの中身を比較して違いがあった場合のみbook.update(today)とかしてbookを表示する

2通りの手段があると思うんですが、2ってもしかして比較に時間かかったりしますか。
プログラム的には「差分が存在した場合のみ変数を更新」というのがいいような気はするんですが。
サイトから抜き出した要素がある日突然減ってることはありません(今日はtitleが無いとか)。

533:デフォルトの名無しさん
08/02/03 12:51:42
>>532
データの量にもよるけど、単純な比較に致命的な時間がかかる事はあまり無いと思う。
その前提なら変化があるのは review の項目だけだろうから、これだけでいいのでは?

today['review'] == yesterday['review']

534:デフォルトの名無しさん
08/02/03 12:56:59
>>532
いきなり全体に上書きしてもデータ上は問題ないのなら1でいいんでないかい
つまり「過去ログは不要で今日のサイトの状況のみをリアルに反映する」のが目的ならね

ある日のレビューが
'review'=>['面白かった。','まあまあだと思った。','↑厨の連投自演乙wwww']
になってて、翌日に
'review'=>['面白かった。','まあまあだと思った。']
に戻ってた場合とかは、1の方法だとレビュー削除を検知も保存もできないけど、2ならやろうと思えばできる

535:デフォルトの名無しさん
08/02/03 13:02:23
Hash#updateは機械的にキー捜して値を更新してるだけだよね?
>>533のように変化しうるキーの値だけ更新するのが本当なんだろうけど、
100項目くらいなら全部をupdateしちゃって問題ないと思う

536:デフォルトの名無しさん
08/02/03 19:45:26
Rakefileでtaskが失敗したことを表現するにはどうしたらよいでしょうか?
test taskが成功したときのみinstall taskを実行して欲しいです
exitで終了させる方法しか思いつきません

task :default => [:install]

task :test => OUT do |t|
 %x{ #{Dir.pwd + '/' + t.preqs[0]} }
 if $? != 0
  print "sippai\n"
  #exit(1)
 end
end

task :install => :test do |t|
 print "install...\n"
end

537:デフォルトの名無しさん
08/02/03 19:52:19
raise でメッセージつけるとか

538:デフォルトの名無しさん
08/02/04 00:26:55
中途半端に自作のデータ格納クラス作るよりも、
適当なでかいハッシュにキーと値のペアで格納したほうがマシだよね?

539:デフォルトの名無しさん
08/02/04 00:31:22
Structってのもあるよ。


540:デフォルトの名無しさん
08/02/04 00:36:25
> Struct
> 構造体クラス。
> Struct.new はこのクラスのサブクラスを新たに生成します。
> 個々の構造体はサブクラスから new を使って生成します。
> 個々の構造体サブクラスでは構造体のメンバに対するアクセスメソッドが定義されています。

…ハッシュでいいや

541:デフォルトの名無しさん
08/02/04 00:37:03
俺はモジュール1〜2つ作って、その中にクラス作りまくる派。
・後でメソッド持たせたくなった時、楽
・項目名を間違っていた場合すぐ判る
・その一連のデータにどんな項目があるかが一目瞭然

542:デフォルトの名無しさん
08/02/04 00:49:19
データクラスを設定するためだけにインスタンス変数をいちいち30こくらい作るの面倒なので中身はただのHashです
Hashでkeyを指定するのとaccessorでインスタンス変数にアクセスするのってたいして変わらん気がする
もっと複雑怪奇なデータ構造なら破綻するのかもしれないけど

あとただのデータの癖にメソッドたくさん持ってるのは気持ち悪い
おまえらは素直にアプリケーションクラスにいじられてればいいんだよ

543:デフォルトの名無しさん
08/02/04 01:02:19
ネットからデータをげっとぉするメソッド内で、アクセス間隔intervalを設定したいです。

# その1 -----------------------------
interval = nil
interval = 10 if 適当な条件

sleep interval if interval
# その2 -----------------------------
if 適当な条件 then
interval = 10
else
interval = nil
end

sleep interval if interval
# その3 -----------------------------
interval = 10 if 適当な条件

sleep interval if defined?(interval)
# -----------------------------------

どれがいいかな?
intervalはここでしか使わないんですが。
今までは何の疑いもなくインスタンス変数を消費して
sleep @interval if @interval
とか書いてたんですがこれを機にインスタンス変数の乱用減らそうかと

544:デフォルトの名無しさん
08/02/04 02:04:31
"あいうえお"[2]で"う"が出ないのって、アホなの?

545:デフォルトの名無しさん
08/02/04 02:30:29
その問いへの答えは
"abcde"[2]が"a"がでないのをどう受け止めるかによって変わりそう。


546:デフォルトの名無しさん
08/02/04 04:07:12
>>543
こーゆーのは?
interval = ( 適当な条件 ? 10 : 0 )
:
sleep(interval)

ローカル変数で間に合うくらい近い場所ならこーするけど
sleep(10) if 適当な条件

547:デフォルトの名無しさん
08/02/04 09:06:08
>>545
卑近実際の使い勝手が悪いのには反論の余地はないな
いちいちアスキー文字に変換されないのは便利なこともあるんだろうが

>>543
ローカル変数の初期値のスタンスに関する問題だということでいいよな
その2かそれに類するものであるべきだとは思う
その1のようにnilを指定したあとで別オブジェクトに挿げ替えるというのは気持ち悪い
あと、その3は常にtrueになるような気がしてならんのだが

548:デフォルトの名無しさん
08/02/04 12:01:44
驚き最小の原理的に望ましくないし、使い勝手も悪いっつーたら何の利点があるんだろ

549:デフォルトの名無しさん
08/02/04 12:18:20
一応、Stringはバイト列であるという考え方らしい

だったらString.eachはString.each_lineではなくString.each_byteと同じものにしとけバーカバーカ

>>544
$KCODE='e'
puts 'あいうえお'[4,2]

"う"


550:デフォルトの名無しさん
08/02/04 12:31:02
>>548
驚き最小の原理というのは(Matzの)驚きが最小って意味。
Cでも"abcdef"[0]は"a"じゃないじゃん。ブロック変数がローカルでないのも
Cの
int i = 42;
for (i = 0; i < 100; i++) {
process();
}
i => 99
って動作を踏まえたものだし、それなりに根拠はある。

1.9だと両方とも変わったんだけど、?aという記法は残して欲しかったな。


551:デフォルトの名無しさん
08/02/04 12:46:47
>>550
記法自体は残ってるよ。挙動を変えないでほしかった、という意味かな。

552:デフォルトの名無しさん
08/02/04 12:52:31
Perlでは文字列の4番目って何になるんだっけ、と思ったが
どう書いていいのか全く思いつかなくなっててとてもショック
そんなにまじめに勉強してたわけじゃないけどさー

いかん、これでは「Rubyしか使えない可哀想な人」になってしまう

553:デフォルトの名無しさん
08/02/04 13:00:27
>>551
Yes。Emacsの記法だっけか。

>>552
RubyはPerlの互換だから、RubyのほかにPerlだけ使えてもあんまり意味ないけど


そういや最近話題のarcでは("abcdef" 0)が#\aなんだよな。

554:デフォルトの名無しさん
08/02/04 13:30:03
/home/me/ruby
というディレクトリに
main.rb
sub.rb
uri.rb
という3つのファイルがあって、main.rbからsub.rbとuri.rbを読み込んで中のクラスやモジュールを利用したいです。
一番好ましい書き方は何ですか?
main.rbの実行時のカレントディレクトリは/home/me/rubyだけとは限りません。

555:デフォルトの名無しさん
08/02/04 13:55:42
$: << File.dirname(__FILE__)

556:デフォルトの名無しさん
08/02/04 13:57:08
>>542
30ってヤケにでかい塊だな。

557:デフォルトの名無しさん
08/02/04 14:02:59
>>555
__FILE__はフルパスとは限らないので
$: << File.expand_path("..", __FILE__)
のほうがいい。


558:デフォルトの名無しさん
08/02/04 14:17:24
いやこれは意図的な罠だろ

> cat uri.rb
class URI
MSG="このファイルは#{__FILE__}です"
end
> cat main.rb
$LOAD_PATH << File.expand_path("..", __FILE__)
require 'uri'
puts URI::MSG
> ruby ./main.rb
main.rb:3: uninitialized constant URI::MSG (NameError)

横着せずに require をフルパスつきで読み込んだほうが確実だと思う


559:デフォルトの名無しさん
08/02/04 14:28:41
q = abcd
q.length × 1.5 =>8
てしたいのですが、うまいことぐぐれないので助けてください。

560:デフォルトの名無しさん
08/02/04 14:35:40
>>559
ぐぐる以前に体系的に一通りRubyの基礎を学ぶといいぞ

561:デフォルトの名無しさん
08/02/04 14:43:43
何がしたいのかもっと具体的に。

562:デフォルトの名無しさん
08/02/04 14:46:08
>>558
$LOAD_PATH.unshift(File.expand_path("..", __FILE__))


563:デフォルトの名無しさん
08/02/04 14:47:22
>>561
いや、意味は不明だがとりあえずは比較だろ

q = 'abcd'
if (q.length * 1.5 >= 8.0) then
puts 'とりあえず8かそれ以上です(何が?)'
else
puts 'とりあえず8未満です(何が?)'
end



564:デフォルトの名無しさん
08/02/04 14:49:44
>>562
それだと添付ライブラリの uri を require 'uri' で読めなくならないか
自作ファイルのほうを特別扱いするのが妥当かと思われ

565:デフォルトの名無しさん
08/02/04 14:52:57
ああ、-rubygemsなんか使ってたりで、すでに標準ライブラリのuri.rb読んでるとダメなのか
パスが変わってないと読み込んでくれないってことか

566:デフォルトの名無しさん
08/02/04 16:30:37
これだから、Rubyは・・・

567:デフォルトの名無しさん
08/02/04 16:32:09
言語仕様自体の是非は隔離スレでやれと

568:デフォルトの名無しさん
08/02/04 16:42:17
普段数十行の処理用にperl使ってる程度ですが、そういう人間にもruby使う意味ってありますか?

569:デフォルトの名無しさん
08/02/04 16:44:49
Perlでの記述に速度以外の不満があるのなら

とらえず、既存の仕事をRubyで置き換える意味はないよ

570:デフォルトの名無しさん
08/02/04 16:45:26
Rubyの字面が好きなら乗り換える価値はあるかもな。
自分も1000行行った事ないけど字面が好きだから細々と使ってるよ。
正直細かい機能はほとんどしらねぇw

571:568
08/02/04 16:51:22
いえ、perlに不満があるわけではないです。
単にruby流行ってるみたいなんで興味持った、っていう程度です。スンマセン

でもちょっとかじってみようかな。perlからの乗り換えも結構多いようですね

572:デフォルトの名無しさん
08/02/04 17:02:29
Perlの人が飯を賭けずに家で遊んでみるぶんには大変魅力的な言語でございますよ
一通り使ってみた後にはPerlでのプログラミングの筋もよくなってるという矯正効果つき

573:559
08/02/04 19:39:05
算数ができてませんでした。
4文字を入れて出力したいのは6ってゆー数字です。

574:デフォルトの名無しさん
08/02/04 20:00:09
>>573
体系的に一通りRubyの基礎を学ぶといいぞ

575:デフォルトの名無しさん
08/02/04 20:03:24
Rubyの基礎って言うか
どんなプログラム言語でもExcelとかでも
「かける」は*で「わる」は/とか
プログラム以前の問題かもな

576:デフォルトの名無しさん
08/02/04 20:05:20
"abcd".length * 1.5
=> 6.0

577:デフォルトの名無しさん
08/02/04 20:11:19
>>575
いや四則演算の記号はRubyの基礎だろ

>>576
要件満たしてないぞ

578:559
08/02/04 21:10:54
ありがとうございました。

579:デフォルトの名無しさん
08/02/04 22:31:14
Windows上でWinpcapを利用して、Etherealキャプチャデータをいじりたいんですが、
おすすめな方法ありますか?

libpcapなら以下の方法があるみたいなんですけど・・・
URLリンク(www.goto.info.waseda.ac.jp)

580:デフォルトの名無しさん
08/02/04 22:32:10
Rubyに慣れてないようだから、コード書くより日本語で書いたほうが早かったかもね。

とりあえず、6.0を四捨五入させて6にしかたったのなら
(q.length*1.5).round と書くといいよ。

581:デフォルトの名無しさん
08/02/05 18:19:56
今までRubyの公式のチュートリアルを見て勉強してきたんですが
やっぱり物足りないなぁと思い始めてきました。
まだ趣味でやってる範囲なのですが本などを買ってやったほうがいいんですかね?
インターネットで解説見れば無料だから・・・っていうのは甘いですか?

582:デフォルトの名無しさん
08/02/05 18:23:29
本なんかいらんよ

583:デフォルトの名無しさん
08/02/05 18:34:14
Rubyistはオブジェクト指向スクリプト言語 Rubyを本棚に飾るのがマナーです

584:デフォルトの名無しさん
08/02/05 18:39:06
まー、言語にかかわらず、本とか買っても意外と読まないよなー。
空き時間に小説感覚で読んだりはするけどw
慣れてきちゃえば、実用的にデジタルデータの方が楽というか。

585:初心者
08/02/05 20:10:35
Ruby初心者が質問します

ブラウザでRubyが受け取った値をCのプログラムに渡して、Cで計算してRubyで
返すなんてことできますか?

586:デフォルトの名無しさん
08/02/05 20:13:35
>>585
Ruby っつーかプログラミングと日本語の初心者だな。

587:初心者(プログラミング、日本語、2ちゃんねる)
08/02/05 20:14:36
すまん

588:デフォルトの名無しさん
08/02/05 20:23:22
よくわからん
Rubyでhttpなデータをダウンロードして
それをCで書いたルーチンに処理させて結果をRubyで受け取りたいって事か?

それともサーバ側でRubyなCGIを動かしてボトルネックになりそうな部分をCで書きたいということか?
どっちもとりあえず可能とだけいっておく。

589:デフォルトの名無しさん
08/02/05 20:24:09
>ブラウザでRubyが受け取った値
ここが曖昧。Ruby組み込みブラウザか? とか言ってみる。
それともCGIなのか。COMでAcviteScriptRubyを呼ぶのか。

>Cのプログラムに渡して、Cで計算して
Cで書かれた実行ファイルが既にあるのか、計算部分を
拡張ライブラリとして書き下ろすのか。

>Rubyで返す
X:で -> O:に
あるいはさらにRubyからブラウザになにか反映させるということか?


ざっと見てこれぐらいオモタ


590:デフォルトの名無しさん
08/02/05 21:32:46
SWIGのことか?


591:デフォルトの名無しさん
08/02/05 23:09:44
だれかRubyコンパイラ作らないの?

592:デフォルトの名無しさん
08/02/05 23:10:50
きちんとコンパイルされてるだろ

593:デフォルトの名無しさん
08/02/05 23:12:27
じゃあネイティブコード吐けよ。

594:デフォルトの名無しさん
08/02/05 23:25:57
B-Rubyだっけ

595:デフォルトの名無しさん
08/02/06 00:00:15
Rubyで、2chの特定のスレURL(またはdatファイル)を任意で指定し、
すべての投稿から、「すでに投稿された文面が再度登場していたら、
その数だけレス番付きで抽出する」
というものはできないでしょうか。

要は何がやりたいのかと言うと、
「スレッドがコピペ投稿だらけ」になっており、
レス削除要請を行いたいのです。
ただ、そのコピペの数が尋常じゃないので抽出が困難なのです。
「文面の95%が一致していたらコピペとみなす」機構が嬉しいです。

596:デフォルトの名無しさん
08/02/06 00:00:59
できるよ。

597:デフォルトの名無しさん
08/02/06 00:02:54
>>581
本が無くてもWebページで身につけられるのは事実
ただ、はじめのうちは本があった方が理解しやすい

とりあえず、本屋・図書館で立ち読みしてみてはどうだろう
必要だと思ったなら買えば(借りれば)いい

598:デフォルトの名無しさん
08/02/06 00:04:02
どうせ買うならポケットリファレンスみたいのは避けた方がいいと思う
あれはWebで調べられるし、あんまり意味ない

599:デフォルトの名無しさん
08/02/06 00:07:52
Webが見られないところで調べられることは重要

600:デフォルトの名無しさん
08/02/06 00:24:14
言い方が悪かった。
あれは辞書みたいなもんだからテキストそのものにはならない。

601:デフォルトの名無しさん
08/02/06 00:36:37
>>595
丸投げするなら「Rubyの宿題スレ」の方があってるかもしれん
ただ、すぐに流れるかもしれんが。

もし自分でやりたいのなら、ここで質問しまくったらできる範囲だと思う。
あと、プログラム組んだことなくて、極力自分でやりたくないなら、宿題ス(ry

ヒント的なもの
・datのDLは、 open-uri でいけるだろう
・datの中身は、cvsみたいなものなので、cvsライブラリか、eachlinesあたりで
・完全一致ならハッシュ取って調べるのが楽。
・類似度判定が一番問題
 AAに特化ということで、記号の数をデータとしてとって、とか。
 専門じゃないので厳密なやり方はわからん

あとは、datのサンプルがいくつかいるだろう。

602:デフォルトの名無しさん
08/02/06 00:45:25
今からRubyを本格的にはじめようと思ってるんですが
メーリングリストはどれを購読するのがお勧めですか?

603:デフォルトの名無しさん
08/02/06 00:56:00
MLは初心者にはお奨めしない

604:デフォルトの名無しさん
08/02/06 01:01:22
>>601
類似度判定はこのスレの上の方にでてた
レーベンシュタイン距離とか何とかで出来るんじゃね?

605:デフォルトの名無しさん
08/02/06 02:26:58
2chへのアクセスは、下手に簡易にすると
「2chの全板取得」とか「24時間丸ごと10分ごとに板の全スレの新着取得」とか
そういう馬鹿をする人間が必ず出ている(確定事項)なので
プログラム板の最後の良心の欠片として自力で調べてもらうということになってる

板自治を気取るのではなく自分の見てるスレだけから抜き出したいのなら、
自分の使ってる2ch専用ブラウザのローカルのログを加工するといい

作ったことのある初心者から言うと2ch仕様の調べもの込みで休日の朝から夜までかかった
全くのRuby素人なら1週間くらいかかるんじゃなかろうか

606:デフォルトの名無しさん
08/02/06 02:33:35
>>605
下手に簡易って、探せば適当なライブラリがいっぱいありそうだが。

607:デフォルトの名無しさん
08/02/06 02:42:46
goRuaだっけかrubyでかかれた2chクライアントあるよね

608:デフォルトの名無しさん
08/02/06 03:03:11
Rubyを学ぶ気がないならぶっちゃけPerlで既存の組み合わせて作ったほうが楽かと

609:デフォルトの名無しさん
08/02/06 08:13:24
Cのプリプロセッサ
#ifdef DEBUG
hoge();
#endif
のように、デバッグモードのときだけhoge()を実行するコードを書くのに良い方法はありますか?

610:デフォルトの名無しさん
08/02/06 08:15:39
ここにうpしてもいいですか?

611:デフォルトの名無しさん
08/02/06 08:25:26
>>609
hoge if $DEBUG

612:デフォルトの名無しさん
08/02/06 08:46:22
>>611
ありがとうございます(^^)

613:デフォルトの名無しさん
08/02/06 08:49:28
あ、所詮ただのif文/if節だから厳密な意味でデバッグモード専用にはできないよ

if $DEBUG
str='string!'
end
p defined?('s')

これの場合、pで真が表示される
いわゆる「実行させない」ようにさせるだけ(これで充分なことが大半だが)
真にNameErrorを出すような芸当をさせる簡易な書き方は知らない

614:デフォルトの名無しさん
08/02/06 10:32:45
>>602
「今から始める」人が、MLの購読で得るものは少ないと思うが
敢えて言うなら、日本語で質問ができるruby-list

615:デフォルトの名無しさん
08/02/06 19:20:38
ruby 1.9.0ビルドしてrubyなスクリプト実行してみたんだけど
pythonでいうところの.pycみたいのが作られないんだけどそういうもん?

616:デフォルトの名無しさん
08/02/06 19:27:25
そういうもんです

617:デフォルトの名無しさん
08/02/06 19:28:57
いずれそのうちもしかしたらやるかもしれないみたいなことはいっていたけどな

618:デフォルトの名無しさん
08/02/06 19:42:00
brubyを1.6で作ったのが間違いだったらしい

619:デフォルトの名無しさん
08/02/06 20:48:17
質問させてください

いま、Fileオブジェクトを引数に持ち、ファイルに結果を書き込むメソッドを考えています
引数がFileオブジェクトの場合はそのファイルに書き込み、nullの場合は標準出力に書き込んで欲しいと考えています
そこで
class hoge
def print(file)
if(file ==null)
××××
end

file.puts "なんだかの結果、書き出し"

end
end

と書いているのですが、××××の部分をfile = selfとかしてもダメです

なにかいい方法はあるのでしょうか?
file.putsが複数回出てくるのでif文でnullの時だけputs ""にして、それ以外はfile.puts ""にするのややりたくありません

よろしくお願いいたします


620:デフォルトの名無しさん
08/02/06 20:51:22
def print(io)
 io = STDOUT if io == null

 io.puts "hoge"
end

621:デフォルトの名無しさん
08/02/06 20:58:13
ちなみにRubyではnullじゃなくnilな

622:デフォルトの名無しさん
08/02/06 21:00:32
>>620
ありがとうございます
助かりました

STDOUTとか、その辺の定数みたいなものは自然と身についていくものなんでしょうか?
ちょっと前にもARGVに気が付かず、コマンドライン引数を取得する方法に悩んでしまいました


623:デフォルトの名無しさん
08/02/06 21:03:53
マニュアル読めよ

624:デフォルトの名無しさん
08/02/06 21:19:02
>>623
まあそうなんですけど、私みたいな日曜プログラマはプログラム書きながらわからんところだけ調べるスタイルなので
それに、どの言語もそうですけど、マニュアル分厚くて読む気しない


625:デフォルトの名無しさん
08/02/06 21:23:36
役に立つかどうかはわからんが、
逆引きRuby www.namaraii.com/rubytips/


626:デフォルトの名無しさん
08/02/06 21:25:08
おまいらやさしいな
傍から見ててテンプレ嫁ググレカスとか書き込もうと思ったよ

627:デフォルトの名無しさん
08/02/06 21:34:27
本を一冊読めば大抵のこと書いてあると思う。

628:デフォルトの名無しさん
08/02/06 21:47:04
コンピュータのディスプレイで読めるリファレンスマニュアルに分厚いも糞も無いだろ

629:デフォルトの名無しさん
08/02/06 21:47:54
マニュアルに一通り目を通すのがめんどい、とかは分からないでもないけど、
この場合「組み込み定数」って項目がリファレンスのトップレベルにあるしなあ。

630:デフォルトの名無しさん
08/02/06 21:56:32
>>628
Rubyのオンラインマニュアルは充分「厚い」部類に入ると思うぞ

やっぱ3000円出してたのしいRuby第2版買わないとどうにもならん
最初に4時間ほど使って本読んでおけば10分で見つかるものを
オンラインヘルプとへなちょこチュートリアルで1時間かけて探すのはアホらしい

631:デフォルトの名無しさん
08/02/06 21:58:40
>>629
本気で言ってる?
「組み込み定数」という文字のどこをどう見れば
「RubyにはSTDOUTというIOオブジェクトの定数があってputsやprintのデフォルトになってる」って思いつくんだ?

632:デフォルトの名無しさん
08/02/06 22:03:55
組み込み定数というページを見れば組み込み定数が載ってるよってことだと思うが

633:デフォルトの名無しさん
08/02/06 22:05:46
わからんといってる人にわかると言い張っても何も解決するはずもなく

634:デフォルトの名無しさん
08/02/06 22:11:12
日曜プログラマじゃなくて、ただのバカなんだな

635:デフォルトの名無しさん
08/02/06 22:23:40
「わからない俺のほうが正常なのだ」と言い張る馬鹿には
もう何も言えることは無いものな・・・。

636:デフォルトの名無しさん
08/02/06 22:28:41
ここは初心者に優しくないスレですね

とりあえず>>622には、俺も書籍の購入をすすめる
でもそれに加えて、リファレンスマニュアルの内容は一通り把握した方が良い
(どこに何が書いてあるか、が分かるぐらいには)
HTML Help版なら検索も楽だよ

637:デフォルトの名無しさん
08/02/06 23:00:28
スクリプト言語に馴染みある人なら、特にRuby本買う必要ないと思うなぁ。
スクリプト言語Rubyの2分冊のやつ買ったけど、ほとんど見ないしWebの
リファレンスですませてる。

Webのリファレンスですまない内容って、結局本にものってなくて、
メーリングリスト検索か、ソース読むしかないし。

638:デフォルトの名無しさん
08/02/06 23:01:47
まぁ救いは、Rubyのソースコードが綺麗に書かれていることくらいか。

639:デフォルトの名無しさん
08/02/07 01:46:46
Rubyにまともなデバグ環境ってないの?

640:デフォルトの名無しさん
08/02/07 02:03:54
まともな人はRubyを選びませんから

641:デフォルトの名無しさん
08/02/07 02:08:18
10年後にはRubyが主要な言語になってるよ。

642:デフォルトの名無しさん
08/02/07 02:15:54
>>641
(期待も込めて)ハゲドウ

643:デフォルトの名無しさん
08/02/07 02:27:37
>>641
無理。

644:デフォルトの名無しさん
08/02/07 02:28:42
>>643
お前何も分かってないんだな。

645:デフォルトの名無しさん
08/02/07 02:38:59
>>639
URLリンク(www.ruby-lang.org)

646:デフォルトの名無しさん
08/02/07 02:39:53
>>645
それはまともじゃない

647:デフォルトの名無しさん
08/02/07 02:55:29
戦略としてはアレだ、PerlのカリスマであるラリーウォールをRuby陣営に
引きずり込もう、なんとしても。

どうしたらいいか?

-なにはともあれラリーウォールと合意を採る
-Perlモード作って、Perl6完全互換Rubyを作る
-Perlコミュニティを取り込む
-。。。

こりゃ不可能だww

だがカリスマ性は重要。MatzはMatzだが、ラリーと
どうしても比較してしまう。

648:デフォルトの名無しさん
08/02/07 06:19:43
Rubyのチートシート集(チートシートとはカンニングペーパーのことです)

Ruby and Ruby on Rails cheat sheets >> Scott Klarr
URLリンク(www.scottklarr.com)

649:デフォルトの名無しさん
08/02/07 07:00:19
>>647
Ruby本スレ向きの話題だが・・・
ジョークで言っているのだろうが、現実的に考える

人というのは、振り向け振り向けと言っても、振り向いてくれないもの
向こうから来てくれる魅力のあるものを提供する必要がある

-Parrot上でRubyを実装
-RubyからもPerlの膨大なライブラリを使えるようにする
-ちょっと使ってみようと思わせる、移行しても不利益がないと感じさせる
-多くのPerlの人たちがRubyに興味を持つ
-そのうちラリーウォールが気に留める

だな
引きずり込もうと考えてはあかんと思う。得たいならまずは与えることだろう。

650:デフォルトの名無しさん
08/02/07 08:04:18
Rubyをアニメ化すれば、ラリーも鞍替えしてくれるに違いない。

651:デフォルトの名無しさん
08/02/07 08:40:51
そこでRubyちゃんですよ

652:デフォルトの名無しさん
08/02/07 10:13:44
>RubyからもPerlの膨大なライブラリを使えるように

これ確かあったんだけど、もうメンテされてないんだよな。

653:デフォルトの名無しさん
08/02/07 11:55:46
>>652
kwsk
とりあえず、Acme::JapaneseAvActress が動けばいい

654:デフォルトの名無しさん
08/02/07 13:00:43
>>653
URLリンク(www.yoshidam.net)

自分は試せる環境がないのでそのへんはよろしく。
「Ruby Susieプラグイン」でググると手繰って辿り着けたハズ。

655:デフォルトの名無しさん
08/02/07 17:04:38
AmritaでのHTML出力でわからない所があるので質問させてください

テンプレートにこう書いといて
<tr id="table1">
<td id="name"><td id="author">
</tr>
data = {
:table1=>[
{ :name=>"Ruby", :author=>"matz" },
{ :name=>"perl", :author=>"Larry Wall" }
]
}
こうすりゃサンプルにある通り
<tr>
<td>Ruby</td>
<td>matz</td>
</tr>
<tr>
<td>perl</td>
こうでますよね。 この時に tr の属性値を変えるのってどうすればできるんでしょうか?
:table1=>[ Amrita::a(:value => "test"){:name => "Ruby"} ]
だと文法エラーになっちゃうんですよね...

Amritaのバージョンは調べ方がわからなかったので
ファイルの作成日時だけ書かせて頂くと、2003/03/09になっています

656:デフォルトの名無しさん
08/02/07 23:04:16
煽りじゃなくて、Scheme(or Lisp)に有って、Rubyに無い機能ってある?
あるとしたら、その機能って必要?他の機能で代用可能?

657:デフォルトの名無しさん
08/02/07 23:07:02
>>656
S式

658:デフォルトの名無しさん
08/02/07 23:08:32
そりゃLispではない以上
Lispにあるものをすべて備えているわけがない
すべて備えたらそれはただのLispだ

本スレで聞くといろいろ細かいこと教えてもらえるかもよ

659:デフォルトの名無しさん
08/02/08 01:31:39
質問というよりも言語仕様の問題に近いのかもしれませんが、
どうしてRubyにはインクリメントならびにデクリメント演算子がないのでしょうか?
実質 x += 1 で何も問題はないのですが、
この表記は個人的になんか気に入らないので、納得のいく理由が欲しいのです。
調べたりしてもなぜないのかまで踏み込んでいるところが見つからなくて……よろしくお願いします。

前置や後置でややこしいからかな……などと思いましたが、
それならば後置限定で採用するなりすればいいじゃないかと思うのは浅知恵でしょうか?

ならびに x.next x.succ で後置インクリメントじみた挙動が実現できるのは知っていますが、
インクリメントの意味合いでこのメソッドを使用するのは感心できる行為なんでしょうか?
またその場合、インクリメントはメソッド、デクリメントは演算子とアシンメトリになってしまうのですが、
なんかもう全部ひっくるめて、ここらへんはどう解釈すればいいんでしょうか?

660:デフォルトの名無しさん
08/02/08 01:41:44
>>659
現行のRubyにインクリメント演算子が無いのは言語作成者のポリシー。
10年も前のMLでの発言だが、基本的には変わってないはずだ。
URLリンク(blade.nagaokaut.ac.jp)
> すんません.この件は以前から指摘されているのですが(演算子はC
> に似ているのに++と--は対応する演算子が無い),++の動作が本質
> 的に「変数を操作する」ものであるため,変数がオブジェクトでな
> いRubyでは導入できないでいます.++や--の「オブジェクト指向的
> 意味」がRubyの他の部分と整合性を保ったまま定義できれば採用し
> たいのですが….
うまい実装の仕方があれば要望として取り入れると思うぞ。

661:デフォルトの名無しさん
08/02/08 01:47:56
あと

> x.next x.succ で後置インクリメントじみた挙動が実現できる
できないと思うぞ
i = i.succ
と書くことは
i += 1
と書くのと見栄え的にも手間的にもたいして変わらないんじゃないかと

662:デフォルトの名無しさん
08/02/08 01:49:15
Cだとx++;で済んで簡潔なのかもしれんが、
例えばループ書くのに使うときとかは、ブロック使ってメソッドに抽象化して使う
ようにして、元が多少ダサくなるのは見逃してくれ。

663:デフォルトの名無しさん
08/02/08 01:57:55
なんでインクリメント作れないのかは
「整数オブジェクトを破壊的に変更できないから」というのもあると思う

664:デフォルトの名無しさん
08/02/08 02:11:45
俺もRuby使って最初に躓いたのが、++と--が使えないことだったw
Matzらしくもない。こんなんとっとと取り込んじまえばイイヤン。

665:659
08/02/08 02:15:06
>>660-663
まとめてですみません。素早いお返事ありがとうございます。
確かにそう考えると合点がつきますね。
自分で考えても全然納得できなかったのですが、ようやくすっきりしました。
ありがとうございます。

>>661
できませんね……
succをリファレンスで調べたときに「インクリメントの代替はあるじゃん!」と勘違いして、
そのままずっと勘違いし続けてたみたいです。重ね重ねありがとうございます。

666:デフォルトの名無しさん
08/02/08 02:18:50
>>660の「変数がオブジェクトでない」ってどういう意味?

667:デフォルトの名無しさん
08/02/08 02:20:24
>>665
え〜納得しちゃうの?w

ごねようぜ・・・w


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5384日前に更新/271 KB
担当:undef