Ruby 初心者スレッド Part 17at TECH
Ruby 初心者スレッド Part 17 - 暇つぶし2ch511:デフォルトの名無しさん
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

668:デフォルトの名無しさん
08/02/08 02:35:19
>>667
「しんたっくすしゅがーとかでさいようしましょうよ~」とかでいいですか?w
いや本当はちょっとごねたいんですけど、なにぶん『初心者スレッド』で質問している程度なんで
納得した先にできることがないっす。
+= とか本当は嫌いなんだけどなあ……みたいな感じで。

669:デフォルトの名無しさん
08/02/08 02:41:47
>>668
かわいくゴネたら、俺がパッチ作って匿名でRubyメーリングリストに
なげるっていう条件でどう?w

かわいくなかったら、作らないw

670:デフォルトの名無しさん
08/02/08 03:40:39
>>666
単なる名札。

671:デフォルトの名無しさん
08/02/08 03:59:32
>>659-670
先日、io-languageスレで、++ を実装しようとしてこねくり回してたところだったんで、
タイムリーすぎて吹いた

なんでスマートにできないかというと、
メソッド内で、メソッドを呼んだオブジェクトを、格納した変数に代入できないから。

で、スマートな解決法はある。
Fixnum なら、Fixnum に 中身のデータを設定するメソッドを作ってやればいい。
例えば、Fixnum.set_value() みたいな。
ただし、Rubyのソースをいじるはめになるだろう

どーしても、Rubyのコードでやりたければ、Fixnumのメンバを持った、
Fixnumのラッパーを作るしかないだろうな。
そうすれば、簡単に実現できる。
結局、数字のリテラルを書くように使えず、そのクラスをいちいち new しないといけないのが面倒だが

672:デフォルトの名無しさん
08/02/08 04:00:27
変なところで、句読点打った orz

> メソッド内で、メソッドを呼んだオブジェクトを、格納した変数に代入できないから。

メソッド内で、メソッドを呼んだオブジェクトを格納した変数に、オブジェクトを代入できないから。

673:デフォルトの名無しさん
08/02/08 04:02:27
> 「整数オブジェクトを破壊的に変更できないから」というのもあると思う

ゲ、>>663 が簡潔にまとめてるじゃないか ・・・ orz

674:デフォルトの名無しさん
08/02/08 05:28:31
>>660
残念ながら松本が++が嫌いだと言ってますので多分ないでしょう。

675:デフォルトの名無しさん
08/02/08 06:12:21
a.++
で万事解決

676:デフォルトの名無しさん
08/02/08 07:59:16
>>675
> a.++
> で万事解決

だーかーらー

Rubyの数関係のオブジェクトはイミュータブル、ってのがわかってないダロオマエ

677:デフォルトの名無しさん
08/02/08 08:24:51
rubyのオブジェクト指向度の低さに唖然・・・

678:デフォルトの名無しさん
08/02/08 08:48:36
smalltalkerが来ましたか


679:デフォルトの名無しさん
08/02/08 09:05:54
Smallalk 使いから見ると Ruby はリフレクションが貧弱だよね。
これじゃ、まともなリファクタリングブラウザも作れないだろう…と。

680:デフォルトの名無しさん
08/02/08 09:14:09
a.++!
でよくね

681:デフォルトの名無しさん
08/02/08 09:36:37
a = 1
b = a
a.++!
p b

682:デフォルトの名無しさん
08/02/08 10:24:56
Smalltalkから馬鹿にされるのはしかたないけど、C++から馬鹿にされると釈然としないかも。



683:デフォルトの名無しさん
08/02/08 10:39:02
irb> n = 100
irb> p [n, 100, 99+1, 101-1, 99.succ, 'd'[0], '100'.to_i].map{|e| e.object_id}
[201, 201, 201, 201, 201, 201, 201]

Rubyでは、同じ整数値である限り、同じオブジェクト

684:デフォルトの名無しさん
08/02/08 11:33:22
C++とか、
プリミティブ型があるJavaからも馬鹿にされたくはないな

685:デフォルトの名無しさん
08/02/08 11:53:57
>>683
スゲー

686:デフォルトの名無しさん
08/02/08 12:53:58
>>683
同じ整数値っていうかFixnumの場合だけじゃまいか
irb(main):002:0> [(2 ** 30).object_id, (2 ** 30).object_id]
=> [21803310, 21802580]

687:デフォルトの名無しさん
08/02/08 12:59:06
>>679
>Smallalk 使いから見ると Ruby はリフレクションが貧弱だよね。
>これじゃ、まともなリファクタリングブラウザも作れないだろう…と。
SmallalkじゃなくてSmalltalkな。
それはいいとして、>>679にはぜひSmalltalkのよさを語ってほしいな。
Smalltalkの強力なリフレクション機能がどんなものか知りたい。

688:デフォルトの名無しさん
08/02/08 13:22:15
>>687
たとえば(リファクタリングとは直接関係ないけど)、くだんの #++ とかの実装は、
Ruby の貧弱なイントロスペクションじゃ逆立ちしても無理…とかいう話?

689:デフォルトの名無しさん
08/02/08 14:20:18
>>688
#++は>663,671,672,676,683。README.EXT(.ja)を参照。
誤解を恐れずに簡略すると実はFIXNUMだけオブジェクトじゃない。
オブジェクトじゃないから状態(値)を変更できない。
値の変更は変数に対する操作(代入)で代用。

690:デフォルトの名無しさん
08/02/08 14:25:58
実装の問題は別として
>>681 の p b で 2 が出力されておk、という人は多くないと
思うわけだが。

691:デフォルトの名無しさん
08/02/08 14:54:58
Hash#compare_by_identityって破壊的なのに!つけないんだな
これだからrails厨どもは

692:デフォルトの名無しさん
08/02/08 14:57:01
>>689
Smalltalk も SmallInteger(Fuxnum 相当)は事情は同じだよ?

693:デフォルトの名無しさん
08/02/08 16:26:09
>>687-692
SmallTalkスレで聞いてきたよ。

アラン・ケイも認めた!Ruby>>>>>Smalltalk
スレリンク(tech板:169-171番)

SmallTalkでも、破壊的に変更できない事情は同じで、
そこを強力なメッセージとリファクタリングの言語機能でカバー
力技だから、スマートでないと言われたらそうかもしれない。

Matzは嫌がりそうw

694:デフォルトの名無しさん
08/02/08 16:27:46
x リファクタリング
o リフレクション

>>687-688にturareta

695:デフォルトの名無しさん
08/02/08 16:47:16
>>693
だが Squeak Smalltalk を参考に作られた Rubinius ならきっとやってくれる!

696:デフォルトの名無しさん
08/02/08 16:49:36
C#の完勝ですね

697:デフォルトの名無しさん
08/02/08 20:39:22
クラス変数とかインスタンス変数ってあるけど、モジュール変数的なのってないの?
自作のモジュールに含まれるクラスから自由にぺとぺと触れる変数が欲しいんだけど…

698:デフォルトの名無しさん
08/02/08 20:42:40
モジュール内でクラス変数を定義すれば俗称でモジュール変数と呼ばれてるものになるよ

699:デフォルトの名無しさん
08/02/08 20:54:51
>>698
そうなのかーありがとー!

ちなみに↓のが「@@tempって初期化されてなくね?」って言われるのはなんでなん?
URLリンク(www.ruby-lang.org)
のいちばん最初の例とか見ると平気そうに思えるんだけど…

module Test
 @@temp = "test"
 
 class TestTest
  # def initialize
  #  @@temp = "test2"
  # end
  
  def print
   puts @@temp
  end
 end
end

Test::TestTest.new.print


700:デフォルトの名無しさん
08/02/08 21:04:40
ネストと継承がわかってないようだね

701:デフォルトの名無しさん
08/02/08 21:09:55
マニュアルにある通り、「上」のクラスのサブクラスかインスタンスメソッドにしないと読めないぞ
モジュールを継承することはできないからincludeする。…できないはず。まあいいや。

module Test
@@temp = "test"

class TestTest
include Test
# def initialize
# @@temp = "test2"
# end

def print
puts @@temp
end
end
end

Test::TestTest.new.print

個人的にはあまりきれいに思えない

702:デフォルトの名無しさん
08/02/08 21:18:33
>>700
継承?わからんので教えてほしいかも

>>701
自分が所属してるモジュールもincludeできるのかー
でも、確かに美しくないね


質問を変えると、例えばDBの接続やらなんかのオブジェクトを
同じモジュールのクラス間で共有して使い回したいとすると、
なんかいい方法ってある?

703:デフォルトの名無しさん
08/02/08 21:23:19
定数

704:デフォルトの名無しさん
08/02/08 21:23:30
クラス変数自体が存在微妙だからな
クラス内定数にハッシュ設定して読んだり書いたりしたほうがマシ

module Test
TEMP = {'str1'=>"test"}

class TestTest
def initialize
TEMP['str2']='test2'
end

def print
p TEMP
end
end
end

Test::TestTest.new.print

$ ruby test.rb
{"str1"=>"test", "str2"=>"test2"}


705:デフォルトの名無しさん
08/02/08 21:26:37
>>702
そもそも、たいていの場合ならクラス間で共有して使いまわすよりも
initializeの引数として渡した方が(コンポジションにした方が)いいと思う

706:デフォルトの名無しさん
08/02/08 21:29:03
もうdef initializeのあとに@ナントカって10個くらい書き続ける仕事はいやだお

707:デフォルトの名無しさん
08/02/08 21:40:53
>>704
そんなんできるのかー
でも定数に読み書きするのはなんかきもちわるい気もするなぁ…

>>705
いちいち渡すのがめんどくさい気がしたんだ


708:デフォルトの名無しさん
08/02/08 21:52:59
>>707
定数ってのは、同じオブジェクトを指し続けているという意味であって
その中の状態は不問だからな。

オブジェクトのほうを不変にするには.freezeする。



709:デフォルトの名無しさん
08/02/08 21:56:53
>>706
少数のオブジェクトにまとめろよw
それができないようなクラス構成なのかもしれないけど

>>707
渡すのが面倒なのは確か
でもテストのことを考えると、引数で明示的に「どの値を使うか」を指定できる方が便利だよ

710:デフォルトの名無しさん
08/02/08 21:58:21
STR = 'before'
STR.replace('after')
puts STR

これはSTRが指すオブジェクトが変更されないから警告出ないよね
このへんまで説明してる初心者向け解説はあまり見ないけど

711:デフォルトの名無しさん
08/02/08 22:01:28
>>708 >>710
そう書かれるとなんか自然に見えてきたぞ…

>>709
DBの接続とかMechanizeのオブジェクトとかを渡したいので「どの値」とかは特に関係ない件


むしろRuby慣れてないから引数でオブジェクト渡すと参照渡しになってるのかどうかさえ知らん

712:デフォルトの名無しさん
08/02/08 22:15:07
>>711
自分で注意深くコードを書いて試すといい
ちなみにいわゆる参照渡しだ

class Test
def initialize(str,h)
@str = str; @h = h
end
def modify
@str.replace('MODIFIED')
@h['MODIFIED'] = 'MODIFIED'
end
end

str = 'default'
h = {'key'=>'value'}
Test.new(str,h).modify
p str
p h

# ================================
$ ruby ./test.rb
"MODIFIED"
{"MODIFIED"=>"MODIFIED", "key"=>"value"}




713:デフォルトの名無しさん
08/02/08 22:22:01
>>712
昔はこれを意識したコードを書いてたんだけど
最近はもうこういうとこに気を遣って手品みたいなことするのめんどくさくなって

class Test
def initialize(str,h)
@str = str.dup; @h = h.dup
end
def modify
@str.replace('MODIFIED')
@h['MODIFIED']='MODIFIED'
end
def result
return @str,@h
end
end

str = 'default'
h = {'key'=>'value'}
test = Test.new(str,h)
test.modify
(str,h) = test.result
puts str
p h

こんなコード書いてる
たいていこれで済むし

714:デフォルトの名無しさん
08/02/08 22:25:42
「参照の値渡し」ね

715:デフォルトの名無しさん
08/02/08 22:37:35
そこが「いわゆる」に含めた意味だろうな。


716:デフォルトの名無しさん
08/02/08 22:39:50
Gaucheのwww.cgi.testみたいなやつない?
とりあえずRubyにCGIパラメータ渡したいんだけど。
ブラウザでちまちまやるの面倒くさくて。。。

717:デフォルトの名無しさん
08/02/08 22:49:23
~$ cat cgi.rb
require 'cgi'
cgi = CGI.new
p cgi.params

~$ ruby cgi.rb 'title=ruby&creator=matz'
{"creator"=>["matz"], "title"=>["ruby"]}


718:655
08/02/08 22:51:13
あれ? スルーされてる…。
何か質問の仕方、もしくは場所がまずかったですか?

719:デフォルトの名無しさん
08/02/08 22:56:01
Amritaというものを使ってる人がスレにおらんのだろう

720:デフォルトの名無しさん
08/02/08 22:57:44
>>691
それ言っちゃうと、Array#shiftとかも不統一だよね。

721:デフォルトの名無しさん
08/02/08 23:02:17
shift,unshift,push,popあたりはperlから受け継いでるからな。
!がついてないからといって破壊的じゃないとは限らない。

722:デフォルトの名無しさん
08/02/08 23:21:24
emacs+ruby-mode.elで書いていて質問があります。

ヒアドキュメントを記述して、頭の方でruby-indent-exp(再インデント)を実行しても、
終端行以降に記載した部分がインデントされません。
もし対処法ありましたら、教えて下さい。
(もしくはそういう書き方をしないのでしょうか)

--
 def hoge()
  print <<-EOT
こんばんは。
EOT # <= ここ以下インデントされない
end

def foo()
print <<-EOT
こんにちは。
EOT
end
--

emacs->22.1
ruby-mode-> r15297

723:デフォルトの名無しさん
08/02/08 23:34:26
>>718
ごめん普通に見逃してた
Amrita.aを使うなら

:table1=> Amrita::a(:value => "test"){[:name => "Ruby"]}

でOK
今やるなら、それよりもamrita-alteredの属性値展開を使う方がいいと思う

724:デフォルトの名無しさん
08/02/08 23:42:35
>>716
ふつうに
QUERY_STRING='a=1&b=2' ruby mycgi.rb
とすればよくね?
POSTなら
ruby mycgi.rb < request.txt

まあWindowsならどうやるのか知らないけど。

725:デフォルトの名無しさん
08/02/08 23:45:45
ruby-modeのインデントは微妙に信頼性が低くて困る

def hoge
=begin
なんとか
=end
end



def hoge
=begin
なんとか
=end
end

にして潰してくれたときには参った
最新版では直ってるのかね

>>722
終端文字列の直後の行を正しいインデント量に手動で直してから再インデント

726:デフォルトの名無しさん
08/02/09 00:15:46
>>717 >>724
ありがとうごぜえますだ。

727:722
08/02/09 00:53:14
>>725
↓こんな感じでグダグダです
def hoge
 =begin
  なんとか
   =end
end

>終端文字列の直後の行を正しいインデント量に手動で直してから再インデント
うまくいかないですorz
emacs 21.4でも同じ


728:デフォルトの名無しさん
08/02/09 03:25:48
windows XP proでVisualuRuby上(ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32])で
Susie::Plugin library for Rubyを使いたいのですが、ソースからコンパイルするしかないのでしょうか?

URLリンク(www.yoshidam.net) をDLし解凍したものを ruby\lib\ruby\1.8\susie 下に
置いてもrequire "susie"ができないので…

他にsusieを使う方法ってあるのでしょうか?(COM経由とかではなく)


729:デフォルトの名無しさん
08/02/09 10:08:51
全く使ったことないが、require 'susie' という書き方で探されるのは ruby\lib\ruby\1.8\susie.rb だと思うぞ

730:デフォルトの名無しさん
08/02/09 10:10:36
susie/susie

731:デフォルトの名無しさん
08/02/09 10:21:37
exec() や system() メソッドで、
コマンド実行後に独自の入力プロンプト(入力待ち)状態になるコマンド(ftp, sqlplus 等)を実行したあとに、
さらに、そこへ入力を続けるようなことはどうすれば出来るでしょうか。
以前、どこかのサイトでその方法を見かけて、使ったことがあったのですが、
そのコードが手元に残っていなく、サイトを探してもみあたらなかったため、
質問させて頂きました。
よろしくお願いいたします。


732:デフォルトの名無しさん
08/02/09 11:00:53
>>731
標準で付いてるexpect.rbが使えるケースかも?


733:デフォルトの名無しさん
08/02/09 18:16:41
POPFileというベイジアンフィルターソフトの設定画面が、ローカルにたてたhttp鯖に接続して行う形になっています。
スパムを誤認したメールがたまりまくって手動では無理なため、一括で、教育しなおしたいのですが、
httpのPOSTを簡単に扱えるライブラリはないでしょうか?

hpricot的にお手軽にPOSTしたいのですが・・・

734:デフォルトの名無しさん
08/02/09 18:25:44
net/http のどのへんがダメなのか教えてくれると代替案があるかも

735:デフォルトの名無しさん
08/02/09 18:29:23
自己解決した!
WWW::Mechanize というのを発見しました。

お騒がせしました。ありがとうございました。

> net/http
んーなんていうか、httpを意識しないといけない、低レイヤーっぽい感じがします。
hpricot使ったら他に移れないくらい便利だったので、
似たような高レベルなラッパーがないかな、と。

736:デフォルトの名無しさん
08/02/09 18:32:55
require 'rubygems' しなければならないのがどうにもなあ
いや、贅沢なこと言ってる自覚はあるが

>>735
WWW::Mechanizeが利用できる環境なのならそれ使うといいぞ

737:735
08/02/09 19:00:00
環境変数RUBYOPT を -rubygems にしておくとgem関連は楽っすよ

738:デフォルトの名無しさん
08/02/09 19:50:45
>>737は問題を理解してないと思った

739:735
08/02/09 21:18:13
あ、ええと、レンサバとかRubyGemsをインスコできない環境とかの話かな?
それなら失礼しますた

740:デフォルトの名無しさん
08/02/09 21:48:52
本家のヘルプ以外のライブラリなどのドキュメントを見ようと、
コマンドラインのドキュメントヘルプを試したのですが、いまいちどれがどうなのかわかりません。

ri:標準。英語ドキュメント。サンプルソースなどもしっかり
refe:gem install refeで入る。日本語ドキュメント。全然少ない。メソッド名の部分一致検索ができる。
rdoc:標準。エラーでて動かず

riは、詳細が載っていてわかりやすいのですが、
検索しずらい・・・
refeみたいに、部分一致だったらいいのに

741:デフォルトの名無しさん
08/02/09 22:18:25
gemしかないならともかく、tar玉あるんだから
$HOMEでもどこでもすきなようにインストールすればいいじゃん。


742:デフォルトの名無しさん
08/02/09 22:38:10
>>740
> rdoc:標準。エラーでて動かず
rdocはriのデータを作るコマンド。

743:デフォルトの名無しさん
08/02/09 22:51:39
>>724
なにそのめちゃくちゃ端折った説明

現状は「英語でいいならri、日本語がいいならReFe」という住み分けになっとる
ReFeの内容がヘナチョコなのは日本語マニュアルがヘナチョコだからだな

むしろ俺はRDocとかRDとかのマニュアル用書式がわからん
何のときに == で書くのかとかさっぱりだ

744:デフォルトの名無しさん
08/02/09 22:57:07
あれだ、もうちょっとMatzがユーザ愛を持って、マニュアルに全身全霊を
傾ければ、Rubyはもっと愛されると思う。願望だけど。

「そんなの面白くない」とか「Matzは開発を優先すべきで、他の人が
やったほうがいい」という反論は重々承知だが。

745:デフォルトの名無しさん
08/02/09 23:00:05
優秀な言語開発者が優秀な初心者向けマニュアルを記述できるとは限らないのは
例の分厚くて黄色くて背が硬い本で痛いほどわかっただろうに

746:デフォルトの名無しさん
08/02/09 23:02:37
>>745
いやでもな、とてつもなく優れたオープンソース開発者が、とてつもなく
優秀なドキュメントを提供する人間である例が目の前にあるとさ。
すごい!と思ってしまうのよね。Vimの開発者のことだけど。

747:デフォルトの名無しさん
08/02/09 23:03:35
日本語マニュアルがイマイチなのの原因は何なのよ

今のRubyユーザー数ならWikiシステムあたりを使って一斉に取り掛かれば
1年くらいで今の倍くらいのボリュームにならんかね

748:デフォルトの名無しさん
08/02/09 23:05:30
>>747
RDだかRDocだかで記述しないと取り込めないからRDだかRDocだかで書いてね、というのがかなり壁
PukiWiki互換で書いていいよと言われたら一気に進みそうな気がする

749:デフォルトの名無しさん
08/02/09 23:09:04
まぁMatzはEmacs信者で、Bramのことなんかよく知らないだろうけど。

750:デフォルトの名無しさん
08/02/09 23:24:35
マニュアル内容の改定に関しては計画はあるんだし参加しようよ
URLリンク(doc.loveruby.net)

751:デフォルトの名無しさん
08/02/10 02:39:04
例のデイトレ男に一億くらい恵んでもらってフルタイムのドキュメント書きを雇えばいいんだよ

752:デフォルトの名無しさん
08/02/10 02:57:58
なんで、ここで B・N・Fこと小手っちゃんがww

753:デフォルトの名無しさん
08/02/10 04:51:26
いやもうmatzは開発しなくて良いよ。
MLのやり取り見てると、正直もう1.8+αで良いと思うし。

754:デフォルトの名無しさん
08/02/10 05:15:38
>>741-743
ありがとう

マニュアル用のコマンドとして使えるのは ri と refe なのね。

gemsに fxri っつーri GUIフロントエンドがあったから入れたら、まだ使いものにならなかった orz

・起動が遅い
・riのエントリーの読み込みに20分近くかかる(全部よんでると20000エントリくらいになる)
・全部読みこまないと、検索できないw
・検索中に、カラムをクリックすると落ちたwwww
・読み込んだ データ をキャッシュしないので、次回起動時もまた20分かか(ry

読み込んだ後は、リアルタイムに部分一致検索できるし、
irbが立ち上がっててすぐ試せるので、すごく理想的!
いいのにもったいない!!



そして今気づいたのですが、rubyのdocディレクトリに Programming Ruby のHTMLヘルプがついているんですね。
英語だけど、サンプルコードはあるし、入門にはよいですね。

755:デフォルトの名無しさん
08/02/10 11:15:30
ドキュメントは文句だけいって手を動かさない人が多いから進まない

756:デフォルトの名無しさん
08/02/10 11:33:43
>>755
>>750読め

757:デフォルトの名無しさん
08/02/10 11:40:12
オフィシャルにする気マンマンなとこが敷居高いのは仕方あんめえ
変なのが混じりにくいわけでむしろそれ自体は頼もしいとも思うぞ

この調子だといつ完成するのかわからんのが難だが

758:デフォルトの名無しさん
08/02/10 11:53:10
19株売れよwwww

759:デフォルトの名無しさん
08/02/10 19:08:04
>>743
自作のクラスのマニュアルとか作れたらRRSEで楽だろうなと思うんだけどね
メソッドにカーソルが当たったらEmacs下部のミニバッファに1行マニュアル表示

760:デフォルトの名無しさん
08/02/10 19:36:18
特に意味のないサンプルコードなんだけど、
require "Kconv"
puts "隕".toutf8.tosjis

とかするとなんも表示されなかったりするんだけどなんでだ?

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]に標準添付のヤツ

761:デフォルトの名無しさん
08/02/10 20:23:41
>>760
puts "隕".toutf8

の時点で空文字列が返っているのなら
kconv が文字コードの判定に失敗してる。


762:デフォルトの名無しさん
08/02/10 20:32:17
require "Kconv"
require 'nkf'

p "隕".toutf8
p "隕".kconv(Kconv::UTF8,Kconv::SJIS)
p NKF.nkf('-Sw',"隕")


# 結果
"\356\242\246" # 誤り
"\351\232\225" # 正しい
"\351\232\225" # 正しい


763:デフォルトの名無しさん
08/02/10 22:44:27
漢字一文字なんて、どうやってエンコーディングを判別するというのだ(w

764:デフォルトの名無しさん
08/02/10 23:40:14
Rubyの正規表現で前方不一致(否定後読み?)を指定するにはどう書けばよいでしょうか?
秀丸やEmEditorにおける(?<!pattern)です。
具体的にしたいことは、"B"の前に"A"が来ないときだけ
"A"の前に"_"を加えるという処理を行いたいのです。
CB #=> C_B
AB #=> AB

765:デフォルトの名無しさん
08/02/10 23:54:13
1.8:
string.gsub(/(\A|[^A])B/, '\1_B')

1.9:
string.gsub(/(?<!A)B/, '_B')



766:764
08/02/10 23:54:36
訂正
× "A"の前に"_"を
○ "B"の前に"_"を

767:デフォルトの名無しさん
08/02/11 00:03:08
>>763


あるいは



768:764
08/02/11 00:03:10
>>765
すみません。間違いに気づいて訂正を書いている間にレスをいただいたようです。
ありがとうございました。
1.9では実装されているのですね。

769:デフォルトの名無しさん
08/02/11 05:02:35
>>762
把握した

>>763
いや、"隕"が入ってるときにおかしくなるなぁつー話だったさサンプル悪かったごめん


770:デフォルトの名無しさん
08/02/11 07:15:07
シフトJISの半角カタカナ偶数個かEUCか、は同じバイト列だったりするから、
エンコーディングは可能な限り明示的にすべきと思うけどね。

771:デフォルトの名無しさん
08/02/11 09:27:46
toutf8とかtoeucとかtosjisみたいなのは、本当は「selfを○○に変換する」という動作じゃないんだよな
「selfのエンコーディングが△△だと推測した上で○○に変換する」という動作をしてる

だから、△△であろうという部分の推測がコケると変な文字列になる
元の文字列のエンコーディングは指定しておくべき
10文字くらい余分に書かないといけないが、そのほうが動作も確実に速い

772:デフォルトの名無しさん
08/02/11 11:54:23
>>759
検索できるマニュアルって自分で追加して作れるの?

773:デフォルトの名無しさん
08/02/11 12:12:22
無理なんじゃない?
いや、やってやれなくはなさそうだけど

774:デフォルトの名無しさん
08/02/11 21:27:24
>>771
テキストエディタでも、全角文字少ないと誤認するのと一緒だよなあ

775:655
08/02/11 22:46:06
>>719
Amrita使ってる人って少ないのかな(´・ω・`)
>>723
なるほど、そう書くんですね!
…ということは tr の属性値を項目ごとに変えるのはできないわけですよね、、
amrita-altered を試してみることにします

776:デフォルトの名無しさん
08/02/12 00:47:19
常にUTF8として ENV['PATH_INFO']を受け取りたいのですが
うまい方法はないでしょうか?

下のコードで大体はうまくいくのですが
例にあげてるように短めのカタカナは判別、変換に失敗してしまいます

$KCODE="UTF8"
require "cgi"
require 'nkf'
class String
def to_utf8
NKF::UTF8 != NKF::guess(self) ? NKF::nkf("-w", self) : self
end
end
print "Content-type:text/html;charset=utf-8\n\n"
print ENV['PATH_INFO'].to_utf8

#アテレコ NG
#アテレコテ OK
#アテレコア NG
#アレコテ OK
#テレアコ NG


777:デフォルトの名無しさん
08/02/12 00:52:23
% time python -c 'range(0,10000000).sort'
0.769u 1.022s 0:01.79 99.4% 0+0k 0+0io 0pf+0w
% time ruby -e '(0...10000000).sort'
3.170u 0.259s 0:03.42 100.0% 0+0k 0+0io 0pf+0w

778:デフォルトの名無しさん
08/02/12 01:13:47
>>776
「UTF8以外で送ってきたら頃す」とCGIを使うページのトップに朱書きする

779:デフォルトの名無しさん
08/02/12 01:31:27
>>777
そのコード違うぞ
ボトルネックはこれだ

$ time ruby -e '(0...1000000).to_a'

real 0m2.535s
user 0m2.040s
sys 0m0.490s

Range#to_aは内部的には以下と似たようなことをしてて、
数値が大きくなるとこれが非常に遅い

arr = Array.new
range.each do |i|
arr.push(i)
end
return arr


780:デフォルトの名無しさん
08/02/12 01:44:25
>>778が最善策

「9 27 45 81」は3の倍数でしょうか9の倍数でしょうか? という問いに近い
これは「6」や「3」や「321」が含まれない限り同定できない

781:776
08/02/12 02:01:17
>>778>>780
無理なもんなんですか…。
wikiとかで似たような処理をしてるかと思ってたんですが
基本的に違う処理なんですね。

>>778の方法だと法律上ややこちらが不利な気がするので
guessで判断できないときは別の処理にまわすことにします



782:デフォルトの名無しさん
08/02/12 02:08:50
>>781
Webブラウザ経由の場合はUserAgentを見るという手も…
UTF-8なページからPOSTさせるとか

783:デフォルトの名無しさん
08/02/12 02:16:44
Ruby/SDLでWindows向けゲーム作ろうと思うんですが
Windows標準フォントを引っ張るのってどうやればいいでしょう?
例えばTTFフォント指定で"MS ゴシック"と指定すると、
どのコンピュータでも一意にMSゴシックを引っ張るという事です


784:デフォルトの名無しさん
08/02/12 02:27:26
ダミーで既知な文字列をhideen-inputなフィールドに埋め込んでおいて、
そいつがどういうバイナリになってるかを調べる手があったはず。

785:デフォルトの名無しさん
08/02/12 02:37:26
>>784
おーちょっと感動した
覚えとこ

>>783
全く使ったこともなければ実行環境もないが
> font = SDL::TTF.open('sample.tff', 24)
という表記方法から考えて、どうしかして%WINDIR%\Fonts\msgothic.ttcにアクセスすればいいんじゃね

とここまで書いてTTCじゃダメだろと思った
TTCはTTFのカタマリだけど、TTFしか読めませんというやつはTTCは普通読めない
Ruby/SDLには「いくつか埋め込み用フォントがあるようだけど、それでは用足りない?

786:デフォルトの名無しさん
08/02/12 04:26:23
Miyakoが、MSゴシックとかメイリオに対応してた
Miyakoのソースでも見たらどうかな?

787:デフォルトの名無しさん
08/02/12 08:37:53
>>783
URLリンク(www.kmc.gr.jp)

ちなみにTTCは、Ruby/SDLのリファレンスでは読めることになっているが
俺の手元で試した限りでは成功しなかった
Miyakoではどうやってるんだろう……

788:デフォルトの名無しさん
08/02/12 16:28:42
コード生成機能を持たないフレームワークプリーズ

789:デフォルトの名無しさん
08/02/12 17:51:40
Webサーバ上の巨大ファイルをダウンロードしたいんですが、
ダウンロード状況を「30%」など表示するにはどうしたらいいですか?
TCPSocket#readで数バイトずつチマチマ取得するしかないでしょうか?

790:デフォルトの名無しさん
08/02/12 18:00:13
数バイト単位はアホすぎます

791:デフォルトの名無しさん
08/02/12 18:04:00
#readの引数に合わせただけです

792:デフォルトの名無しさん
08/02/12 18:05:13
>>789
URLリンク(0xcc.net)

あとはopen-uriでopenするときに
:content_length_proc で 最初のサイズ設定
:progress_proc で進捗伝達
をさせるようにすればいい

793:デフォルトの名無しさん
08/02/12 18:17:14
require 'open-uri'

uri = URI.parse('URLリンク(gems.rubyforge.org)')
total = 0
count = (0..100).to_a
open(uri,
:content_length_proc => lambda {|n| total = n; puts "#{n}バイトいきます"},
:progress_proc => lambda {|n|
pc = (n.to_f/total*100).to_i
if pc == count.first then
puts "#{pc}%終了"
count.shift
end
}).read

# =====================================
$ ruby ./progress.rb
16047764バイトいきます
0%終了
1%終了
2%終了
3%終了




794:デフォルトの名無しさん
08/02/12 18:48:25
メソッドの引数にハッシュを取りたいです。
とり得るキーが多めにあった場合とか、うまく処理する方法ってありますか?
キーは1個の場合も4個の場合もあり、複数のキーが互いに必須なこともあります。

795:デフォルトの名無しさん
08/02/12 18:53:08
>>792-793
なるほどこりゃ便利ですね
open-uriのライブラリを掘り下げてみましたら
なるほどキモになってる部分は Net::HTTPResponse#read_body {|str| .... } ですね
ありがとうございました

796:デフォルトの名無しさん
08/02/12 18:55:43
うまく処理する方法とは?
まず、まずい処理がどんなものか説明してもらおうか。



797:デフォルトの名無しさん
08/02/12 19:00:04
>>794
素直にやるとこうだと思うぞ

def hoge(h)
case h
when h.has_key?(:param1) ...
when h.has_key?(:param2) && h.has_key?(:param3) ...
else raise "引数が不正です"
end
end

:param1と:param2は背反でないと処理上困るのになぜか同時に指定されてる、
とかいうエラーへの対処は無視しろめんどくさくなるから
「同時に指定したら死刑」とかいう立て札でも立てとけ

798:デフォルトの名無しさん
08/02/12 19:01:42
>>794
質問の意味が良く分からないが・・・

>キーは1個の場合も4個の場合もあり、
case hash.size
when 0
when 1
・・・

>複数のキーが互いに必須なこともあります。
if hash.key?(foo) && hash.key?(bar)

こんな感じじゃないか?

799:デフォルトの名無しさん
08/02/12 21:35:04
>>792-793
open-uriってお手軽なだけかと思ったら、意外に融通利いてびっくりだ

800:デフォルトの名無しさん
08/02/12 22:13:34
もう見てないかもしれないが
>>310>>316
今北なので、亀レスで申し訳ない

nowrite(true)、verbose(true) メソッドを使えばそれ以降
:noop=>true、:verbose=>true がデフォルトで設定される…はずなのだが
Rakeのバグでshとruby以外のメソッドに適用されない

つづく

801:800
08/02/12 22:15:10
修正するには rake.rb に以下のパッチを当てればおk
Index: rake.rb
===================================================================
--- rake.rb (revision 639)
+++ rake.rb (working copy)
@@ -871,8 +871,8 @@
module FileUtils
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])

- OPT_TABLE['sh'] = %w(noop verbose)
- OPT_TABLE['ruby'] = %w(noop verbose)
+ OPT_TABLE['sh'] = [:noop, :verbose]
+ OPT_TABLE['ruby'] = [:noop, :verbose]

# Run the system command +cmd+. If multiple arguments are given the command
# is not run with the shell (same semantics as Kernel::exec and
@@ -970,10 +970,10 @@

FileUtils::OPT_TABLE.each do |name, opts|
default_options = []
- if opts.include?('verbose')
+ if opts.include?(:verbose)
default_options << ':verbose => RakeFileUtils.verbose_flag'
end
- if opts.include?('noop')
+ if opts.include?(:noop)
default_options << ':noop => RakeFileUtils.nowrite_flag'
end



802:デフォルトの名無しさん
08/02/12 22:28:06
既出でしたらすみません。トップレベルのインスタンス変数、selfについて質
問です。

クラス・モジュール定義内ではインスタンスメソッドの外に定義したインスタ
ンス変数はクラスオブジェクト(Klass)のインスタンス変数になり、インスタン
スメソッドとはselfが異なるのでアクセスできません。

class Klass
@a = 1 <--
def foo \
@a <-----+-- 別物(selfが異なる)
end
end
Klass.new.foo => nil

しかし、トップレベルで定義したインスタンス変数はトップレベルで定義した
メソッドからselfが同一なのでアクセスすることができます。

@a = 1 <--
def foo \
@a <-----+-- 同一(selfが一緒)
end
foo => 1

なぜトップレベルではメソッド定義内のselfとメソッド定義の外のselfが同一
になるのでしょうか。
rubyインタプリタが起動時に

Object.new.instance_eval { *ここがトップレベル* }

のようにしてトップレベルを作っていると解釈すればよいのでしょうか。


803:デフォルトの名無しさん
08/02/12 22:39:00
$ cat top.rb
p self
def hoge
p self
end
hoge
p self.class

$ ruby top.rb
main
main
Object


804:デフォルトの名無しさん
08/02/12 23:07:32
>>803さん、ありがとうございます。

トップレベルのselfはObjectのインスタンスで評価するとmainというものが返っ
てくるというのは理解できるのですが、トップレベルがどのようにして作られ
てselfが設定されているのかがわかりません。
あと、なぜトップレベルのselfはmainという表記で#<Object:0x294dc>みたいな
表記にならないのでしょうか。
そういう言語仕様なのでしょうか...


805:デフォルトの名無しさん
08/02/12 23:24:52
>>804
トップレベルをオブジェクト指向として悩むのはあまりよくないぞ
URLリンク(blade.nagaokaut.ac.jp)

まあ、Module#privateされたでっかいObjectクラスの中身だと考えられなくもないけど

806:デフォルトの名無しさん
08/02/12 23:39:52
"main"と返るのはそう定義されてるから。(object.c)
RubyのCソースは一部の例外を別にすれば見やすいから追いかけてみるとよい。


807:804
08/02/12 23:58:30
>>805さん、>>806さんありがとうごぜいます。
>>805さん
bladeのスレッド読んでみました。確かにEiffelやJavaよりもいきなり制御を書
けてしまうrubyのほうがありがたい気がします。
そういえば質問する前にbladeでnamazu検索してみたのですが、結果のリストが
表示されませんでした。壊れているんでしょうか?
>>806さん
そうですね。rb_internあたりで萎えてしまうのですが。頑張って読んでみます。


808:デフォルトの名無しさん
08/02/13 00:01:03
あ、それ俺も気づいた。bladeの検索は死んでる。
今じゃgoogle site:使ってるなあ

809:804
08/02/13 00:24:48
そうかgoogle site:を使えばよかったのかー。頭悪いな > オレ
>>806さん、ソース読んでみました。
main_to_s
rb_define_singleton_method(ruby_top_self, "to_s", main_to_s, 0);
拍子抜けしました。Init_Objectあたりをもっと深く読んでみようと思います。
ありがとうございました。


810:783
08/02/13 02:49:21
レスくれた方有難うございました。
確かにttcは読み込めなかったので
Miyako入れる方向で探っていく事にします
それにしてもruby/SDLの文字表示がこんなに弱いとは…

811:デフォルトの名無しさん
08/02/13 04:33:24
>>779
釣られてるよ。
>>777のpythonのコードは、sortに()が付いてないから実際にはソートしてない。

812:デフォルトの名無しさん
08/02/13 07:53:37
$ irb
irb(main):001:0> l=[100,101,102,103,104,105,106,107,108,109]
=> [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
irb(main):002:0> l.each_with_index do |item,idx|
irb(main):003:1* puts "hit #{item}"
irb(main):004:1> l.delete_at idx if 0==item%2
irb(main):005:1> end
hit 100
hit 102
hit 104
hit 106
hit 108
=> [101, 103, 105, 107, 109]
irb(main):006:0>
意図したとおり奇数だけ残せたのですがhitの表示がなぜ偶数だけになっているか分かりません
delete_atするより前でputs "hit #{item}"してるので全要素がputsされると思ったのですが。。。


813:デフォルトの名無しさん
08/02/13 08:07:34
消す度にずれてるから

p l
とか
puts "hit #{item} at #{idx}"
にして見れば分かる

delete_ifを使えばいいよ

814:812
08/02/13 08:28:52
理解できました ありがとうございます
delete_if使ってみます

815:デフォルトの名無しさん
08/02/13 09:05:53
>>811
python -c 'range(0,10000000).sort'
real 0.0859320 user 0.0468750 sys 0.0312500

python -c 'range(0,10000000).sort()'
real 0.0771435 user 0.0312500 sys 0.0468750

>>779
ruby -e '(0...10000000).sort'
real 2.1707595 user 1.6875000 sys 0.1406250

ruby -e '(0...1000000).to_a
real 0.3525165 user 0.2500000 sys0.0937500

816:デフォルトの名無しさん
08/02/13 09:10:38
桁が違うとか紛らわしい
ruby -e '(0...10000000).to_a
real 1.6034130 user 1.4531250 sys 0.1406250

817:デフォルトの名無しさん
08/02/13 10:14:36
10000000 を 10_000_000 とか 1000_0000 とか書けることは意外と知られてないし使われてないな

irb> p 10_000_000
10000000


818:デフォルトの名無しさん
08/02/13 10:41:43
>>810
でもMiyakoでは特に変なことしてないみたいだぞ?
api/font.rb を「TTF」で検索してみ

819:デフォルトの名無しさん
08/02/13 14:09:52
Pythonのマージソートは部分整列を利用してほげほげとかクックブックに書いてあったから
range(0,10000000).sort() のソートにほとんど時間がかからないはず。
(参考:URLリンク(svn.python.org))
Rubyはどうなのよ

820:デフォルトの名無しさん
08/02/13 15:29:39
マージソートなのか。
rubyはクイックソートだから、整列済みのものには不利だな。

821:デフォルトの名無しさん
08/02/13 15:34:42
>>820
それもあるけど、1.9だとシステム提供のqsortでなく割と高速なqsort実装を使っているので、その例だとPythonとほぼ互角の速度になる。

822:デフォルトの名無しさん
08/02/13 18:19:53
"ID;本文"という形式のcsvファイルを読み込み、
本文だけを文節単位でわかち書き(半角スペースを挿入する)して
返すスクリプトを書きたいと思っています。
そのため、RubyからCaboChaにテキストを渡して処理しようと
CaboCha0.53をインストールしたのですが、
肝心のCaboChaの呼び出し方がさっぱりわかりません。

CaboCha公式サイト(URLリンク(chasen.org)
には「詳しくは, ruby/README…をご覧ください.」と書いてあるのですが
そのruby/READMEがCaboChaインストールフォルダ内に見つからず…
どなたか、インストール方法とRubyからの呼び出し方を
教えていただけますでしょうか。

●実行環境
WindowsXP SP2
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
※One-Click Installer - Windows 1.8.6-26 Final Release 使用

CaboCha 0.53(Binary package for MS-Windows)

823:デフォルトの名無しさん
08/02/13 19:18:25
>>822
CaboCha というのは全く使ったことがないけど、
そのページから落せるソース cabocha-0.53.tar.gz には
ruby/README は入ってたよ。
中を読むとさらに test.rb を読めとあって、test.rb 内には
コメントとかまったく書いてないんだけど、まあその辺は C ライブラリの
方を見て予想しろってことなんじゃないかと。

あ、Windows での tar.gz の伸長には適当になんかフリーソフトを探してくれ。

824:デフォルトの名無しさん
08/02/13 20:44:51
Cgi = CGI.new

ip = ENV['REMOTE_ADDR']
host = ''

begin
host = Socket.gethostbyname(ip)[0]
rescue
host = ip
end

Cgi.out{host}

これでちゃんとリモホ名に変換出来る鯖と
出来ない鯖があるんですが、鯖の問題なんですよね?

825:デフォルトの名無しさん
08/02/13 20:52:30
rescueでエラー殺しておいてそういう質問するな

SocketError: host not found
が出るという話ならRubyのバージョンが悪いとかなんとかいうことになってた気がする
エラー時にコマンドラインから外部コマンド使うとなんとかなるかも

826:デフォルトの名無しさん
08/02/13 21:08:44
>>825
すみません…
助言ありがとうございました!

827:デフォルトの名無しさん
08/02/13 21:31:37
require 'cgi'
require 'socket'
cgi = CGI.new
begin
cgi.out{Socket.gethostbyname(ENV['REMOTE_ADDR'])[0]}
rescue
cgi.out{CGI.escapeHTML($!.inspect)}
end

う~ん、こうやっても特に例外は出てない様です…
変換出来ない鯖のRubyのversionは1.8.5でした…

828:783
08/02/14 02:31:38
ruby/SDLの日本語表示の質問した者ですが
IPAフォントというフリーのttfを見付けたので
Miyakoを入れずとも日本語表示は出来ました

ただ、新たな問題としてボールドとイタリックの書体設定が出てきました
見る限りSDLやMiyakoにそういう機能は無いようですし…
そもそもこういう書体設定はどういう理屈でやってるんでしょうか

829:デフォルトの名無しさん
08/02/14 02:35:27
>>827
とりあえず何かのファイルにENV全体を書き出してみたら?
CLIENT_IPとかX_FORWARDED_FORとかVIAとかなら取れるかもしれない。


830:828
08/02/14 02:41:52
>>828
自己解決しました
思いっきりスタイルの設定部分見落としてたわ…
失礼しました

831:デフォルトの名無しさん
08/02/14 07:29:33

正規表現でこういうのは無理?

p "X(1)((2)Y)Z".gsub(/\([0-90-9]+\)/g, '')

やりたいこと
・(1)(2)を両方取り除く

わからんこと
・gオプションって無い?
・全角0-9の指定は無理?
※cygwin版ruby

832:デフォルトの名無しさん
08/02/14 07:30:27
↑全角がまじっちゃったけど、( )は全て半角

833:デフォルトの名無しさん
08/02/14 07:36:47
jcodeかなんかrequreする必要があったような無かったような・・・
gオプションってマッチを1回で止めない、ってperlのおぷそんだったけ?
それならデフォルトでそうなんじゃなかったっけか。

834:デフォルトの名無しさん
08/02/14 07:37:15
sub
gsub

835:デフォルトの名無しさん
08/02/14 07:47:34
さんくす

>>833
jcodeじゃgsubないっぽい
[0123456789]て書かないと駄目くさい

>>834
そうだった、gは必要ないな

836:デフォルトの名無しさん
08/02/14 10:51:43
>>831
jcodeをrequireして、
str.tr("0-9", "0-9").gsub(...)
ただ他の関係ない全角数字も巻き込まれる :-)

837:デフォルトの名無しさん
08/02/14 11:00:58
>823
ありがとう。
結局、rubyバインディングをインストールするには
Win用のCaboChaバイナリのほかに
UNIX用のCaboChaとSWIGを落としてきて自分でmakefileしないと
いけないようですね。

838:デフォルトの名無しさん
08/02/14 11:20:26
全くカボチャやらメカブやらチャセンやら・・・

ズイキはないのっ!?

839:デフォルトの名無しさん
08/02/14 11:40:53
>>831
半角開きカッコ・半角または全角数字・半角閉じカッコ

の並びを消去したいなら、正規表現はそれで問題ないぞ
(たしかにgオプションは存在しないのでつけたら駄目だが)
もし動作しないというなら、それは単に文字コード指定の問題だろう
対象文字列がShift_JISやらCP932やらならsを、日本語EUCならeつけろ

irb> p "X(1)((2)Y)Z(3)45".gsub(/\([0-90-9]+\)/e, '')
"X(Y)Z45"

840:デフォルトの名無しさん
08/02/14 14:16:13
>>839
確認してみたら通ったよ。

何が悪かったかといえば、コマンドラインで-Kオプションつけずに
ネイティブでないエンコード使ってたからぽい

だからコンパイル時にエラーになってた。

841:デフォルトの名無しさん
08/02/14 15:26:24
Rubinius で、Ruby にインクリメント演算子モドキを実装 - sumim’s smalltalking-tos
URLリンク(d.hatena.ne.jp)

…バイトコードを探して加算するという力技

842:デフォルトの名無しさん
08/02/14 16:26:06
コンテキストがべたべたに見えてるのか、
Rubyはなぜかそれをやらなかったんだよね、
フレームのオブジェクト化。

843:デフォルトの名無しさん
08/02/14 16:26:39
rubyは、か。

844:デフォルトの名無しさん
08/02/14 16:54:11
>>843
matzは、か?

845:デフォルトの名無しさん
08/02/14 16:59:21
>>842
しないほうがいいんじゃね?>>841なんてどうかんがえても力業だし

846:デフォルトの名無しさん
08/02/14 17:07:43
この手のイントロスペクションが可能だと、デバッガを強化できるんだがな。

847:デフォルトの名無しさん
08/02/14 17:15:38
ドコに力点を置くかだよね
特に悪影響がないのなら導入すればいいわけで

848:デフォルトの名無しさん
08/02/14 18:33:31
ruby/SDLの日本語表示の質問してた者です
何度も何度も済みません…

ttfのフォントで半角英数文字列を出力すると
全角幅で出てしまうんですが、何か調整する機能は無いのでしょうか?
一応ゴリ押しすれば、
文字列を各文字に分割して文字幅取りつつ各個表示
という風に行けそうではありますが…


849:デフォルトの名無しさん
08/02/14 19:45:01
>>848
何を言ってるのかよく分からないのですが、とりあえず
URLリンク(mono.kmc.gr.jp)
にある作品で、該当しそうなことをやってるものの
ソースを読んでみたらどうでしょうか。
高橋メソッドとか文字表示に特化してそうだし、
ソースをちょっと見てみた限りTTF使ってるみたいだし、
実行してみてないので想像ですが、半角/全角が
区別されずに表示されるという事もないんじゃないかなあと思います。

850:デフォルトの名無しさん
08/02/14 20:27:32
>>848
俺の環境ではそういった現象は起こっていない(半角は半角幅で出力される)
もう少しkwsk

851:デフォルトの名無しさん
08/02/14 20:35:06
フォントによってはそうなるよ
ruby/sdlではなくfreetypeの仕様っぽい
プロポーショナルなフォント使えば大丈夫だったと思う

852:848
08/02/14 20:49:34
ソース出した方が早そうですね
フォントはIPAゴシックです

SDL.init(SDL::INIT_EVERYTHING)
screen = SDL.set_video_mode(SCREEN_W, SCREEN_H, 16, SDL::SWSURFACE)

SDL::TTF.init
font = SDL::TTF.open("IPAFont/ipag.ttf", 24)
font.style = SDL::TTF::STYLE_ITALIC
font.draw_blended_utf8(screen, "abc", 0, 32, 255, 255, 255)

これで全角幅で出ます(Pゴシックも同じ)
「abc」でなく「a b c」という感じ

853:848
08/02/15 03:47:05
レスどうもです
色々試しましたがどうもフォント依存の問題みたいですね
Arialだと普通に間合いが詰まってましたし

…しかし日本語フォントで
サイズ一定以下にすると表示がバグるとか不具合もあるようで
これ本当にゲーム作れるのか…?

854:デフォルトの名無しさん
08/02/15 04:07:32
>>835
ここで愚痴るより作者にメールを送れYO!
反応のある確率はここより低いかもしれんが、
もしあった場合より的確な答が返ってくるだろうし
パッチも当たるかもしれないじゃん。

855:デフォルトの名無しさん
08/02/15 04:33:18
追試してみたけどそもそも文字が出ないw
なにがわるいんだろ?

856:デフォルトの名無しさん
08/02/15 15:31:04
かなり亀だが
>>797
case h
when h.has_key?(:param1) ...

これって期待通りの動作しなくね?

857:デフォルトの名無しさん
08/02/15 16:07:58
h === h.has_key?(:param1) って何が起こるの?

858:デフォルトの名無しさん
08/02/15 16:10:42
あ、逆か。
h.has_key?(:param1) === h って何が起こるの?

859:デフォルトの名無しさん
08/02/15 16:43:47
そのまんまだよ
h が === 的に true と同一なら true、同一でないなら false が返る
Hash は TrueClass に属してないから常に false だね

860:デフォルトの名無しさん
08/02/15 16:46:09
変な書き方だった
Hash は TrueClass にも FalseClass にも属してないから結果は常に false だね
に変更

861:デフォルトの名無しさん
08/02/15 19:22:31
休刊になったLinux Magazine全部入りDVDを入手
Matz御大による、初等Ruby講座(と探訪Ruby)の
存在を知り拝読(中)

しっかし、なんつーわかりやすさなんでしょう
なんでもないと思ってたとこでも
目からうろこが、ぽろぽろぽろぽろ…

開発者自身の手でここまでやさしく書かれた
ドキュメントがあったなんて!と
ちょっと感動しました

過ぎるほど今更ですみません

862:デフォルトの名無しさん
08/02/15 20:21:59
>>858
逆じゃないよ。(when式)===(case結果)で合ってる。

863:デフォルトの名無しさん
08/02/15 21:33:48
>>862
だから>>858はそう書いてるんじゃないか?

864:デフォルトの名無しさん
08/02/15 21:49:36
case h
じゃなくて
case
なんだろうね。


865:デフォルトの名無しさん
08/02/15 22:13:01
gem install したときに 所有者 root でインストールしようとするのを止めさせることはできますか?
$ gem install --no-ri --no-rdoc hpricot

make
cc -I. -I. -I/usr/local/lib/ruby/1.8/i386-freebsd6 -I. -fPIC -O2 -fno-strict-aliasing -pipe -fPIC -c hpricot_scan.c
cc -shared -Wl,-soname,hpricot_scan.so -L'/usr/local/lib' -Wl,-R'/usr/local/lib' -o hpricot_scan.so hpricot_scan.o \
-Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -L. -lruby18 -lc -lcrypt -lm -pthread -lc

make install
/usr/bin/install -c -o root -g wheel -m 0755 hpricot_scan.so /home/俺/rubygems/gems/hpricot-0.6/lib/i686-linux

install: /home/俺/rubygems/gems/hpricot-0.6/lib/i686-linux/hpricot_scan.so: chown/chgrp: Operation not permitted
*** Error code 71



866:デフォルトの名無しさん
08/02/16 00:35:29
原因が絞られたので再質問します

Ruby1.8.5にて、ユーザー権限でgem install hpricotしようと思いました。
しかし、root権限でインストールしようとしてしまってうまくいきません。
/usr/bin/install -c -o root -g wheel -m 0755 hpricot_scan.so
レンタルサーバ(さくら)なので rbconfig の CONFIG の INSTALLキーに
/usr/bin/install -c -o root -g wheel という文字列が入ってしまってるからのようです。
これを変更した上でgem install を実行させることはできますか?

867:866
08/02/16 01:25:16
あーできたー。っていうかこれ罠っぽい…
さくらインターネットでrubygemsのインストールでコケる場合の対処

/usr/local/lib/ruby/1.8/i386-freebsd6/rbconfig.rb を見ると
> CONFIG["INSTALL"] = ENV['RB_USER_INSTALL'] ? '/usr/bin/install -c' : '/usr/bin/install -c -o root -g wheel'
とかいう記述がある
よって
setenv RB_USER_INSTALL true
とかコマンドラインで入力してから rubugemsをインストールすればいい
(試してないけどたぶんrubygemsのインストール時1回のみでおk)

あーもう寝る

868:デフォルトの名無しさん
08/02/16 02:52:50
>>861
宗教じみてるので釣りかと思った

869:デフォルトの名無しさん
08/02/16 02:58:43
>>861
そんなに分かりやすいのか・・・買う価値ありかね?

870:デフォルトの名無しさん
08/02/16 03:48:49
初めて知ったが、そもそもLinux Magazineぜんぶ入りが買いじゃね?

>>866-867
さくらの共有?Railsまともにうごきます?

871:デフォルトの名無しさん
08/02/16 04:21:29
でももう2年前の話だしなぁ・・・休刊。
まだVineが人気の時代じゃね?

872:デフォルトの名無しさん
08/02/16 10:07:47
>>870
FastCGI入ってないけどそれでもよければ

873:デフォルトの名無しさん
08/02/16 10:16:34
Webサービスとして使うのは問題外ってことだな
自分用かバックグラウンド動作用か

874:デフォルトの名無しさん
08/02/16 11:15:37
% time python -c 'range(0,10000000).sort'
0.769u 1.022s 0:01.79 99.4% 0+0k 0+0io 0pf+0w
% time ruby -e '(0...10000000).sort'
3.170u 0.259s 0:03.42 100.0% 0+0k 0+0io 0pf+0w

875:デフォルトの名無しさん
08/02/16 11:58:20
>>872
まともに使えない上に、同じ鯖の人に迷惑になりそうな(´・ω・`)

876:デフォルトの名無しさん
08/02/16 12:02:23
どっかのページで、CGI版でも高速動作させるって方法があったけど、
結局、プロセスをしばらく立ちあげといてって方法なので、レンサバだと無理そうだった・・・

CGIでRailsをまともに動かす - 古橋貞之の日記
URLリンク(d.hatena.ne.jp)

877:デフォルトの名無しさん
08/02/16 13:00:28
以前からずううううっと気になってたんだけどさ

file = open('test.txt','r').read

とか

file = File.open('test.txt','r').read

ってしたときって、test.txtを開いたときに使ったIOオブジェクトってcloseされてる?
readの中で実はブロックとか使っててcloseしてるとか

878:デフォルトの名無しさん
08/02/16 13:06:30
>>877
close はしてないので File.read("test.txt") を使ったほうがいい。
バイナリモードの指定ができないくそインターフェイスだけど。

879:デフォルトの名無しさん
08/02/16 13:18:18
あるいは、長くなってもいいなら content = open(...) {|io| io.read }


880:デフォルトの名無しさん
08/02/16 13:26:21
File.open(path).read は「動くけどあまり好ましくない書き方」のひとつだな

881:デフォルトの名無しさん
08/02/16 13:47:03
参照カウンタの方がスクリプト言語にはあうね

882:デフォルトの名無しさん
08/02/16 13:52:34
やっぱり、そんなには知られていなかったんですね>Matzの連載
私も知らずに手に入れたんですけど

初等講座が190ページ、探訪が96ページ
雑誌連載ならではの密度(基本2段組でビッシリ)ですので
これ目当てで買っても損はないかと思います。
ただ、PDFの2段組は読みづらいです。

私はスレタイどおりの初心者なので
正直、中盤以降はナナメ読みになりましたが
ハッシュと正規表現の置換のところで
そう書いてくれればわかる!という開発者ならではの
曇りのない記述に出会えたので
これだけで個人的には得した気分です。

883:デフォルトの名無しさん
08/02/16 14:04:34
何の本の話ですか?


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