Ruby 初心者スレッド Part 23at TECH
Ruby 初心者スレッド Part 23 - 暇つぶし2ch447:デフォルトの名無しさん
08/12/12 21:15:44
>>445
できました!
なんという素早く的確なレス!
本当にありがとうございます。ありがとうございます!

448:デフォルトの名無しさん
08/12/12 23:47:41
rubyでcgiの掲示板みたいな物を
作ろうとしているのですが、

テンプレートとなるHTMLを別に用意して
その中の項目などを置き換えて
最終的に表示を行いたいと考えています。

Amrita2 というライブラリが良さげなんですが
サンプルなどが少ないんですよね。
(メインのページ?が404で見れない)

他に、同様な機能を持ったライブラリで
お勧めなどはありますでしょうか。



449:デフォルトの名無しさん
08/12/12 23:56:17
めんどいからrdでやっとけ

450:デフォルトの名無しさん
08/12/13 00:08:10
>>448
Tenjin ってのが速いらしいけど、使ったことないから別にお勧めってわけでもない。
URLリンク(www.kuwata-lab.com)

451:デフォルトの名無しさん
08/12/13 07:29:20
>>448
俺のオススメはTenjinだけど
この辺のライブラリはかなり数があるので、いくつか試して目的に合った奴を使うと良いんじゃないかな
Rubyist Magazine最新号あたりの記事も参考に

ちなみに普通のCGIアプリで使うなら、Amrita2はRubyGemsとHpricotを使っているためオススメできない
(というか普通のレンタルサーバ環境ではまず動かない)
amrita-alteredの方が良いと思う。ただし動作がかなり重いことには注意

452:デフォルトの名無しさん
08/12/13 07:53:50
RDとかではめんどいからテンプレートエンジンが隆盛なんだと思う
決定版がないんだよねという話は5年くらい前からしてる気がするが

453:デフォルトの名無しさん
08/12/13 08:07:15
そもそもテンプレートエンジンに「ただ一つの決定版」って要るのか?
今の状況はけっこう理想的だと思うけど

454:デフォルトの名無しさん
08/12/13 10:35:39
元のファイルを読み込んで新規にファイルを作成し、
その内容を置換する作業を一括してやりたいと思っています。
色々と実験しているのですが通常の置換はできても正規表現による置換ができません。
試している元のファイル「 in.txt 」の内容は、

 |青空文庫《あおぞらぶんこ》
 へのへの

です。この内容を出力して置換するために書いた「 test.rb 」の内容が次です。

open("in.txt","r"){ |元ファイル|
 open("out.txt","w"){ |出力と置換後のファイル|
  while line = 元ファイル.gets
    line.gsub!("(|)(.+?)(《)(.+?)(》)","\4\3\2\1") #正規表現による置換。変化なし。
    line.gsub!("へのへの","もへじ")             #通常の置換。OK。
    出力と置換後のファイル.puts line
  end
 }
}

これによって出力された「 out.txt 」の内容が次のものです。

 |青空文庫《あおぞらぶんこ》
 もへじ

通常の置換は成功していますが、正規表現による置換に変化がありません。
どうすれば良いのでしょうか。

455:デフォルトの名無しさん
08/12/13 10:41:01
あんちゃん、praggerに関するスレってないん?

456:デフォルトの名無しさん
08/12/13 10:42:49
>>454
line.gsub(/(|)(.+?)(《)(.+?)(》)/,"\4\3\2\1") じゃまいか

457:デフォルトの名無しさん
08/12/13 10:47:15
'\4\3\2\1' こうだろ

458:デフォルトの名無しさん
08/12/13 11:03:27
>>448
ふつうにERBでええやん
URLリンク(jp.rubyist.net)
Tenjinは日本語の解説がないからこのレベルの初心者にはムリだと思う

459:デフォルトの名無しさん
08/12/13 11:08:08
>>458
erb より eruby の方が手軽じゃない?

1行目に #!/usr/bin/env eruby って書いておいて、
拡張子を cgi にしておけば普通のCGIと変わらず動くし。

460:デフォルトの名無しさん
08/12/13 11:09:49
>>456
>>457
ありがとうございます。

 line.gsub!(/(|)(.+?)(《)(.+?)(》)/,'\4\3\2\1')

で出来ました!
正規表現はスラッシュで、
後方参照はシングルクォートで囲む必要があるんですね。
すごく勉強になりました。

このスレの皆さんのおかげで本当に助かります。
あらためて感謝します。

461:デフォルトの名無しさん
08/12/13 11:47:48
�ラ 出来ました!
懿「ォ めくらっぽう滅茶苦茶やってたらたまたま動作しました

462:デフォルトの名無しさん
08/12/13 13:05:38
gsubでブロック紹介しない時点でなあ…

463:デフォルトの名無しさん
08/12/13 13:37:05
strscanらぶ

464:デフォルトの名無しさん
08/12/13 13:42:35
>>458
今ならERbよりErubisの方が良くないか?

>>459
まず、erubyのインストールが厄介なのでは

465:デフォルトの名無しさん
08/12/13 14:00:56
各行の先頭に連番を振ることはできませんか。
「行数=挿入する数字」で良いんですが。

466:デフォルトの名無しさん
08/12/13 14:01:26
あのへんはサーバ上で動かすための設定やインストールが面倒でなあ…
ローカルでスクリプトとして使うならそれほどでもないんだが

467:デフォルトの名無しさん
08/12/13 14:03:07
>>465
各行に対して、正規表現の文頭を数字で置換しれ
改行区切りで配列にしてしまうのが簡単だと思う
joinでくっつけるときの改行コードは元の改行にしておくこと

468:デフォルトの名無しさん
08/12/13 14:09:35
str = "a
bb
ccc
dddd"
lines = Array.new
str.to_a.each_with_index do |e, n|
lines.push(e.sub(/^/){"#{n+1}: "})
end
print lines.join


結果

1: a
2: bb
3: ccc
4: dddd

このまま使うと2桁3桁のとき数字表示が汚くなるが、そのへんは自分で考えれ

469:デフォルトの名無しさん
08/12/13 17:17:48
>>467>>468
親切にありがとうございます。

>各行に対して、正規表現の文頭を数字で置換しれ

これはよく分かるのですが、

>改行区切りで配列にしてしまうのが簡単だと思う

というのがよくわからないのです。

str="●●●"の●●●の部分に連番を振りたいファイルの内容を
全部コピーして貼り付けて実行すれば良い、ということなのでしょうか?
確かにそれなら実現できました。

ただ、手間がかかるので
連番を振りたいファイルを指定して、
中身を直接書き換えられれば有難いのです。
そのような方法はありませんでしょうか。

ひょっとして初心者丸出しの質問なのかもしれませんが、
御教示頂ければ幸いです。

470:デフォルトの名無しさん
08/12/13 17:46:04
プログラミングとクラスの考え方がまだ身についてないっぽい
必要なのはString オブジェクトだ
つまり文字列

ファイルパスを指定するとファイル内容を文字列で返すメソッドを持つクラスがあるからそれ使え
ファイル内容を文字列で取得できたら文字列内を置換しれ
んで書き込みたい文字列を作れたら、同じ名前でファイルに書き込め

471:デフォルトの名無しさん
08/12/13 18:02:44
・ スクリプト内の変数の文字列を置換する
・ スクリプト内で指定したファイル内容を読み込んで表示してみる
・ 読み込んだファイル内容を置換して表示してみる
・ 置換した内容を別ファイル名で保存してみる
・ あらかじめ元ファイルをバックアップしておき、置換した内容を元と同じ名前で保存してみる
・ あるフォルダ(ディレクトリ)のファイル一覧を取得して表示してみる
・ 自分の欲しいファイル名だけを抽出する方法を考えてみる
・ 一覧のひとつひとつに対してファイル名だけを表示させてみる
・ ファイル名の表示の部分を「ファイル内容を読み込んで表示」に切り替えてみる
・ 「ファイル内容を読み込んで表示」の部分を「読み込んで置換して同名で保存」に置き換える

こんな感じ?

472:デフォルトの名無しさん
08/12/13 18:03:47
> ・ スクリプト内で指定したファイル内容を読み込んで表示してみる
スクリプト内で指定したファイル名の内容を読み込んで表示してみる、だった

473:デフォルトの名無しさん
08/12/13 18:10:45
問題を「これならできそう」って思える程度に分割する能力って大切だよね
オライリーはPragmatic Thinkingなんちゃらって本の日本語版出せばいいのに

474:デフォルトの名無しさん
08/12/13 18:28:21
>>471みたいなのは、現状、意識的に経験積むしかないんだよね
うまい本とかあればいいんだけど、あんまり聞かないな

475:デフォルトの名無しさん
08/12/13 18:33:15
>>471
そんな感じです。お手数をかけてすみません。
それを参考にして一つ一つ覚えて行きたいと思います。

何度か他の言語を覚えようとして挫折したのですが、
Rubyは簡単に結果を出力できて感動したので、
この言語を勉強することにしました。
(プログラムは素人ですが、
 Rubyのコードがシンプルで美しいと思ったのも動機の一つです)

一応「たのしいRuby」と「Rubyレシピブック」は購入しましたので、
今は「15.2 基本的な入出力操作」を試しています。
プログラムとかはやったことはないのですが、頑張って覚えるつもりです。

476:デフォルトの名無しさん
08/12/13 18:37:33
すると

File.open(path, 'r'){|f| puts f.read}

ができた頃かね
f.read が文字列を返してることがわかったら、ファイルひとつを置換するのはもうすぐだな

477:デフォルトの名無しさん
08/12/13 22:18:03
ワンライナーだと
ruby -pe "printf '%4d ',$." ファイル名
でファイルに4桁の行番号をつけて標準出力に表示

ファイルを書き換えたければ -i.bak などと-i オプションにバックアップの拡張子をつけて実行
ruby -i.bak -pe "printf '%4d ',$." ファイル名

標準入力から読み込んだ場合の行番号は$.に入ってる、行番号の形式を変えたければprintfを勉強する
複数のファイルを指定しても大丈夫

Windowsだと -i の拡張子無しでの直接書き換えが出来ないのがちょっとやだな
UNIXだと ファイル開いておいて、開いたファイルを削除して、書き込み用で同名のファイルを作成するのかな?
PerlでもWindowsだと出来ないので、同じような動作してるんでしょうね
というか、Perlの動作を再現してるんでしょうけど


478:デフォルトの名無しさん
08/12/13 22:25:44
path = 'test.txt' #適当に作っといてね
outfile = 'testwrite.txt' #問答無用で上書きされるぞ
と、すると
pathファイルを開いて、全体を一気に読み込んだものを表示する
open(path, 'r'){|f| puts f.read}
pathファイルを開いて、一行読み込んで表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each{|line| puts line}}
pathファイルを開いて、一行読み込んで、行番号表示して、行の内容を表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each_with_index{|line,ind| printf '%3d ',ind+1;puts line}}
pathファイルを開いて、書き込み用のoutfileファイルも開いて、一行読み込んで、ファイルに行番号書き込んでから行の内容も書き込むのを最後まで繰り返す
open(path, 'r'){|f| open(outfile,'w'){|out| f.each_with_index{|line,ind| out.printf '%3d ',ind+1;out.puts line}}}


479:デフォルトの名無しさん
08/12/13 22:30:00
cat -n

480:デフォルトの名無しさん
08/12/13 22:32:30
>>479
そんなこと言ったら行番号付加ツールインストールすれば一発だぞ

481:デフォルトの名無しさん
08/12/13 23:42:38
$.


482:デフォルトの名無しさん
08/12/14 01:44:40
>>476
お恥ずかしながら io.readlines のことかと思って悪戦苦闘していました。
例文通りに打ち込んでも上手く行かないので、何かプログラムの根本的な
ところが判ってないのだと思って再び悩んでいました。

>>477
>>478
ありがとうございます。おかげさまで希望通りの動作が実現しました。
教えて君のような私にここまでして頂いて何と感謝すれば良いのか判りません。
私に何ができるわけでもありませんが、似たようなことがあったら、
私もこのスレの皆さんのような態度で困った人に接したいと思います。
このスレの皆様に心から感謝します。本当にありがとうございました。

483:デフォルトの名無しさん
08/12/14 03:03:55
馬鹿なの?
死ぬの?

484:デフォルトの名無しさん
08/12/14 05:12:40
>>482
たかが2chでそこまでバカ丁寧になる必要はない
教えてやりたい人間が教えたいように教えただけ

>>483
バカ丁寧だから、バカなんじゃない?

485:デフォルトの名無しさん
08/12/14 05:13:18
ああ忘れてた、>>477-478, 乙であります

486:デフォルトの名無しさん
08/12/14 05:40:39
>>484
たかが2chで「必要がない」ことをそんな大きく見てもしょうがない。
他の多くのレスの不必要な表現と同じように、>>482も書きたいように書いただけ。

487:デフォルトの名無しさん
08/12/14 12:37:57
>>455
ないみたいね
そもそもPlaggerのスレさえも立ってない
(理由は不明だけど、俺は人気がないんだと思っている)

話したいなら、ここや本スレでも良いと思うよ

488:デフォルトの名無しさん
08/12/14 12:47:00
ruby-ldapのインストール方法について質問です。
OSはcentos5.2を使用して
ruby本体は、 ruby-1.8.6-p287をcheckinstallにてRPM化しインストールしています。
ruby-ldap-0.9.7-1.i386.rpmを入手して、インストールを試みたところ下記のような
エラーメッセージが出力されて、二日ほど止まりっぱなしです。
どなたかアドバイスをお願いします。

# rpm -ivh ./ruby-ldap-0.9.7-1.i386.rpm
警告: ./ruby-ldap-0.9.7-1.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID bfbaf0e8
エラー: 依存性の欠如:
libcrypto.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
libruby.so.1.8 は ruby-ldap-0.9.7-1.i386 に必要とされています
libssl.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
#


489:デフォルトの名無しさん
08/12/14 13:03:15
>>488
ruby-dev のようなもの、libopenssl-ruby のようなもの、openssl のようなもの、のインストールが足りない
Ruby関係ないな

490:デフォルトの名無しさん
08/12/14 13:13:04
rpm コマンドの使い方の話だね
必要なファイルを含むパッケージを表示する方法があるはずだから、それでインストールするパッケージを調べるといい

491:デフォルトの名無しさん
08/12/14 13:49:11
>>489-490
ruby-devとlibopenssl-rubyについては入っていません。。
ruby-dev`については、自ら作成したrubyのRPMファイルを入れるときに
アンインストールしちゃいました。
含んでいそうなファイルを探してみます。
ありがとうございました。

492:デフォルトの名無しさん
08/12/14 13:53:01
devは作るときのだから、バイナリを入れるだけならなくても大丈夫だと思う。


493:デフォルトの名無しさん
08/12/14 14:51:23
結局、
# rpm -qa | grep ruby
ruby-irb-1.8.6.287-1.el5.kb.1
ruby-libs-1.8.6.287-1.el5.kb.1
ruby-1.8.6.287-1.el5.kb.1
ruby-devel-1.8.6.287-1.el5.kb.1
こんな感じに拾ってきたrpmを入れてから、
#rpmbuild -ta ruby-ldap-0.9.7.tar.gz
を実行して、自分でrpmファイルを作ったら、インストールできました。

この状態だとgemが入れられなかったので、rubyのrpmファイルを自前で作成して
インストール後、上記の状態にしたのでgemがどっかで不具合を起こさないか不安ですけど。
ちなみに、gemがインストールできないのはrdocがロードできないとか怒られた。
rdocのrpmファイルってどこかに落ちてるんでしょうか?

494:デフォルトの名無しさん
08/12/14 14:56:39
ディストリビューションオフィシャルリポジトリの存在を無視するな

495:デフォルトの名無しさん
08/12/14 20:54:03
関連付けでファイルを開きたいのですが、
どうすればいいでしょうか。

 path ="test.txt"
 system("start path")

これだとコマンドプロンプトが立ち上がるだけで
関連付けでファイルを開いてくれません。

496:デフォルトの名無しさん
08/12/14 21:01:50
コマンドラインから「start path」という9文字を入力してEnterしてみ
それと同じことが起きてるだけ

497:デフォルトの名無しさん
08/12/14 21:03:03
system("start #{path}")

498:デフォルトの名無しさん
08/12/14 21:43:35
>>497
出来ました! ありがとうございます。 m(_ _)m

499:デフォルトの名無しさん
08/12/14 22:13:54
あと10日で1.9正式リリースなわけだが大丈夫なの?
1.9向けにライブラリ作っていい?

500:デフォルトの名無しさん
08/12/14 22:26:51










るなら作ってみな

という感じだ
特にEncode関連

501:デフォルトの名無しさん
08/12/14 22:29:24
文法エラーが出なくなる程度の対応は進めてもらえると
いちユーザーとしてもいきなり挫折しなくて済んでいいかも

ruby1.9 ./hoge.rb

しただけで普段見たことも無いファイルのやたら多い行数のとこでSyntaxErroroとか挫けるし

502:デフォルトの名無しさん
08/12/14 22:30:51
>>499
1月に延期されたとかなんとか

503:デフォルトの名無しさん
08/12/14 22:32:38
1.9に自作ライブラリを対応させるためのHOWTOとかそういう文書ってある?
1.9.0 features を読んで逐一チェックするしかない?

504:デフォルトの名無しさん
08/12/14 22:51:10
>>499
12月25日に予定されてるのは、1.9.1のRC(リリース候補)で正式版じゃない
といっても、現時点でもう1.9.1の仕様は固まってるはずなので、今から作り始めても良いと思うが

505:デフォルトの名無しさん
08/12/14 22:51:59
>>503
たぶんrubikitichがホッテントリ狙って書くよ。

506:デフォルトの名無しさん
08/12/14 22:58:22
ぬう

507:デフォルトの名無しさん
08/12/14 23:10:00
下の文字列がなぜ文字化けするのですが、何が原因でしょうか。

$KCODE="s"
tut = "12月28日 夢見師(プリンセスソフト、7,140円) "
p tut

508:デフォルトの名無しさん
08/12/14 23:13:46
s?

509:デフォルトの名無しさん
08/12/14 23:14:57
すいません、

#!/usr/local/bin/ruby -Ks
の1行入れてなかったことによるものでした。お騒がせしてすいません。
>>508
sjisのことです。

510:デフォルトの名無しさん
08/12/14 23:49:31
やっぱり詰まった...。
以下a1の文字列の内()とその中身を消したいのですが、
なぜか ) だけ残して全て消えてしまいます。

#!/usr/local/bin/ruby -Ks
$KCODE="s"
a1="最強 東大将棋6(毎日コミュニケーションズ、2,940円) "
a1 = a1.gsub(/.*?月.*?日 /,"")
a1 = a1.gsub(/(.*?円)/,"")
p a1

511:デフォルトの名無しさん
08/12/14 23:53:36
正規表現中のカッコは特別な意味を持つメタ文字だよ
正規表現中でカッコそのものを表すなら \( や \) のようにエスケープしなきゃだめ

512:デフォルトの名無しさん
08/12/15 01:03:05
>>511
え゛っ、そうなんですか!!
/に\/しなきゃならないのは知っていたですが、()もでしたか。
他でもポカしてそうだな。
ご解答ありがとうございます。

513:デフォルトの名無しさん
08/12/15 01:04:30
>512
英数はそのまま書くとその文字、\を付けると特別な意味になることが多い。
逆に記号はそのまま書くと特別な意味があることが多く、\を付けるとその文字ってことが多い。

514:デフォルトの名無しさん
08/12/15 01:41:29
てかマニュアルに全部書いてあるんだからきちんと読め
記号の意味そのものは必要なときに調べればいいから覚えなくてよし
エスケープが必要な文字かどうかだけを記憶すればおk

515:デフォルトの名無しさん
08/12/15 09:11:03
ピリオドも意味もってるんだけど
間違ってエスケープせずにピリオド使ってても
そのまま動いてしまって気付かないことが多い

あとで忘れた頃に問題が表面化するから初心者は注意な

516:デフォルトの名無しさん
08/12/15 09:54:50
image_paths = filepaths.find_all{|e| /.jpg\Z/ =~ e}

で99.99%くらいは普通に動作するんだよな

517:デフォルトの名無しさん
08/12/15 10:02:26
正規表現の粒度をどれくらいにするかというのは永遠の問題
わかってない人が「メールアドレスにヒットする正規表現を書け」とか課題出したりするんだが

518:デフォルトの名無しさん
08/12/15 10:27:14
"(a)"
から
/\s*\(a\)\s*/
を生成するのってどうやるんですか?
a = "(a)"
/\s*#{a.escape}\s*/
みたいに書ければいいんだけど

519:デフォルトの名無しさん
08/12/15 10:41:09
>>518
マニュアル読んどけ
Rubyの正規表現はただのオブジェクトだからRegexpクラスのメソッドで生成できる
/~/ で書くのはただのわかりやすいエイリアスに過ぎない

あと、半角スペースと \s には直接の関係はないから、あらかじめ \s で書いておくしかないよ
個人的には半角スペースを \s で表現するようにするのは後々罠に落ちるから全くお勧めしない
半角スペースがあるのなら、どんなに正規表現の見かけがマヌケになっても半角スペースで書くべき

520:デフォルトの名無しさん
08/12/15 11:10:37
>>518
/\s*#{Regexp.escape(a)}\s*/
Regexp.quoteという別名も。

521:455
08/12/15 21:43:26
>>487
あんちゃん、ありがとう。
せつこ、このスレで日本一のpragger目指すんよ。

522:デフォルトの名無しさん
08/12/15 21:57:53
技術的には便利だけど、他のことで代替できるよね、という微妙な立ち位置がどうにも…
プラガブルであることのメリットがイマイチ生かされてないんだな

523:デフォルトの名無しさん
08/12/16 05:42:09
URLリンク(www.google.co.jp)

逆転しそう

524:デフォルトの名無しさん
08/12/16 05:46:15
URLリンク(www.tiobe.com)

逆転もなにも、世界的には10位以下に後退したダメダメ言語だけどね
(ただ、Pythonが下がってたりLogoが爆上げしてるところから見ても
かなり変な順位づけであることは間違いない)

525:デフォルトの名無しさん
08/12/16 19:07:50
D:/desktop にある、

 001test.txt
 002test.txt
 003test.txt

という複数のファイルを、
数字の部分に正規表現を使ったパスで一度に開きたいのですが、
どうすれば良いでしょうか?
次のように書いているのですが上手く行きません。

files = /D:/desktop/[0-9]+test.txt/
 system("start #{files}")


526:デフォルトの名無しさん
08/12/16 19:21:31
リファレンスマニュアルの正規表現のとこ読め
あと %r の使い方も調べとけ

527:デフォルトの名無しさん
08/12/16 19:24:19
よく見たら正規表現関係無いじゃないか
Dir.glob

528:デフォルトの名無しさん
08/12/16 21:05:12
>>527
御返事ありがとうございます。
それで調べたら Dir.glob は正規表現ではなくワイルドカード対応と書いてあるのですが、
これは正規表現には対応していないということではないでしょうか。

>>525の書き込みはあくまで勉強中の実験のものなので、
実際に使う時にはパスを正規表現で指定したいのです。

また、>>525では省略しましたが、
開きたいファイルは似たような名前が多いので、最終的には、

name = ●●
files = %r("D:/desktop/[-9]+●●.txt")
 system("start #{files}")

というような形にして、●●の部分を書き換えるだけで
任意のの複数のファイルを開けるようにしたいのです。

529:デフォルトの名無しさん
08/12/16 21:28:50
>>528
そういうのだと全ファイル名から正規表現でselectせざるをえないかな。


530:デフォルトの名無しさん
08/12/16 21:50:09
Rubyではselectはあまり使わない
find_all と呼ぶ

531:デフォルトの名無しさん
08/12/16 21:59:18
>>528
まったく同じことを繰り返すことになるが、Rubyのオブジェクトについての考え方学んでくれ
返り値がただの文字列なら、それはただの文字列(String クラスのオブジェクト)で、何か特別なものがあるわけじゃない
Stringクラスのメソッドが完全に全て動作するし、文字列オブジェクトを引数にとるメソッドは全て完全に動作する
メソッドの返り値がどのクラスのオブジェクトなのかということは絶対に意識しないと駄目よ

正規表現を使いたいなら、引数…、まあ、引数の見かけしてないことが多いけど、マッチ試行対象は文字列だ
いちばん単純な状態で必要なのは、ディレクトリ中のファイルを文字列で返すメソッド
その文字列の一群の中から、正規表現にマッチする文字列を探して、その文字列をどうにかすればいい

532:デフォルトの名無しさん
08/12/16 21:59:19
>>530
ソースは?

533:デフォルトの名無しさん
08/12/16 22:43:20
target = 'D:/desktop/*'
filter = /\d+test.txt/
system(Dir.glob(target).select{|i| i =~ filter}.unshift('start').join(' '))

534:デフォルトの名無しさん
08/12/17 00:24:48
>>533
なあ、初心者スレなんだから、もっと分かりやすく書こうぜ

filenames = Dir.glob('D:/desktop/*')
filenames = filenames.grep(/^¥d+test¥.txt$/)
system "start #{filenames.join(' ')}"



535:デフォルトの名無しさん
08/12/17 00:34:21
>>534
改行が存在しない文字列に対して ^ と $ は不適
代わりに \A と \Z を使おう

536:デフォルトの名無しさん
08/12/17 00:43:57
どなたかアドバイスください。ruby1.8.7です。

require 'tk' がうまく いきません。以下のようなメッセージが表示されます。
in `require' : no such file to load --tk (LoadError)

どうすればいいでしょうか?


537:デフォルトの名無しさん
08/12/17 00:46:52
>>536
Tcl/Tkが入ってないんじゃね?

538:デフォルトの名無しさん
08/12/17 00:48:23
>>536
tkライブラリを見つけられなかった。

tkがインストールされない環境(ってなんだろ?)か
$LOAD_PATHがおかしいんじゃない?

539:536
08/12/17 01:02:12
sudo find / -name tk で検索したところ

/usr/local/lib/ruby/1.8/test/unit/ui/tk
/usr/lib/ruby/1.8/test/unit/ui/tk

が見つかったんですけどこれとは違うんでしょうか?
ちなみに echo $LOAD_PATHでは何も表示されませんでした。

540:デフォルトの名無しさん
08/12/17 01:13:10
>>534
質問者の求める「正規表現の使えるglob」が提供されて無いから別解を提示しただけ
分かりにくいってのはわざとそうしてるんだから許してよ

>>539
それ違う
OS何?tcl/tk入ってる?wishコマンド使える?

541:デフォルトの名無しさん
08/12/17 08:10:32
>>535
>改行が存在しない文字列に対して ^ と $ は不適
逆だろ。改行が存在しない文字列だからこそ ^ や $ を使っても構わない。



542:デフォルトの名無しさん
08/12/17 08:13:15
>>540
>分かりにくいってのはわざとそうしてるんだから許してよ
なんでそんなことをするの
分かりやすく書けないのをごまかしてるだけじゃねーのかよ

543:デフォルトの名無しさん
08/12/17 08:22:36
>>541
あまりRubyの正規表現に詳しくない人間が見たら
「ああ^と$は文字列先頭と末尾なんだな。Perlと同じなんだな」とか
勘違いしちゃうよ

544:デフォルトの名無しさん
08/12/17 08:44:02
>>534
>system "start #{filenames.join(' ')}"
system 'start', *filenames
でよくね?

545:デフォルトの名無しさん
08/12/17 10:21:20
>>544
そんなこと言ったら2行目はメソッドチェーンで消えるし、
対象ディレクトリが専用ディレクトリならそもそも Dir.glob のワイルドカードつき文字列でも充分だ

君が *引数 をオボエタテだからだからといってわざわざ難しくする必要はない

546:デフォルトの名無しさん
08/12/17 10:28:48
>>541
目に見えない文字や場所にマッチする正規表現は慎重に使ったほうがええぞ
半角空白にマッチさせるために \s を使ったりしないだろ
それと同じこと

547:デフォルトの名無しさん
08/12/17 10:30:19
>>545
544じゃないけど、一般にsystemの引数は ' ' でjoinするより * で渡すほうが空白を含むファイル名等の問題をより安全に回避できるので、* のほうがお勧めだけどね

548:デフォルトの名無しさん
08/12/17 10:37:16
*の引数展開はマニュアルでも辺鄙なとこにしか書いてないからな
使うなら堂々と初心者向け解説の3ページ目から使いまくるくらいの感じにして欲しいとは思う

549:デフォルトの名無しさん
08/12/17 10:45:05
`
mkdir foo
mkdir bar
`

みたいに途中でシェルスクリプトだらだら書けるようなやり方ってない?
上の書き方だとmkdir fooだけ実行されるっぽい


550:デフォルトの名無しさん
08/12/17 10:49:19
`` はシェルコマンドを実行したいときに使う記法じゃないぞ
返り値が必要なときに使うもんだ
system 使え

551:デフォルトの名無しさん
08/12/17 10:57:56
>>544 >>547
やってみた?

552:デフォルトの名無しさん
08/12/17 11:17:32
534です。
>>547
たいへん参考になりました。
ただ初心者スレで使うには説明が必要ですね。

553:デフォルトの名無しさん
08/12/17 11:21:00
>>550
system "
mkdir foo
mkdir bar
"
でも変わらなかった

554:デフォルトの名無しさん
08/12/17 11:31:24
>>553
シェルスクリプトとみなせる環境であるなら全部実行できるはず
動作しないとしたらWindowsかCygwinだな

555:デフォルトの名無しさん
08/12/17 11:33:20
渡した文字列がshに渡るんだから
mkdir foo; mkdir bar だろう。

つーかそんなことしなくても、
mkdir foo bar でいいだろう。

556:デフォルトの名無しさん
08/12/17 11:35:50
>>555
最新5レスしか読めない携帯からのご参加ですか?

557:デフォルトの名無しさん
08/12/17 11:38:56
>>555
mkdir したいって話じゃねーだろ

>>553
Windowsではでっかいひとつのスクリプトとして実行するしかなさそうだな

558:デフォルトの名無しさん
08/12/17 11:39:43
つーか、全部シェルスクリプトで書けば?
system "foo.sh"
したらいいやん

559:540
08/12/17 12:15:12
>>542
初心者にはメソッドチェーンが読みにくいかもしれない、とは思ったけど
読み解くのも勉強になるだろうと思ってそのまま書いた
grep と system(*args) は知らなかったから書き直すよ

target = 'D:/desktop/*'
filter = /\d+test.txt/
command = 'start'
system(*Dir.glob(target).grep(filter).unshift(command))

560:デフォルトの名無しさん
08/12/17 14:15:15
>>559
>system(*Dir.glob(target).grep(filter).unshift(command))
なぜわざわざunshiftを使うのか分からん。>>544の通りに
system command, *Dir.glob(target).grep(filter)
でええやん。

561:デフォルトの名無しさん
08/12/17 14:34:26
すっごい前に、配列からの抽出にpopとshiftを使う子がスレにいたな
キューじゃないものに pop とか使ったらダメよ混乱するから

562:デフォルトの名無しさん
08/12/17 15:00:35
>>530
RubyのselectはSQLのselectじゃなくて
Smallltalkのselectに由来するって知ってるか?


563:デフォルトの名無しさん
08/12/17 15:09:54
>>561
普通に使ってるし、混乱するって話もあまり聞かないぞ
そもそもpopやshiftを使わないとすると、代わりにどんな風に書くんだ?

564:デフォルトの名無しさん
08/12/17 15:14:58
>>562
「外来語」の detect と select で悩むくらいなら find と find_all を使うなあ、俺は
というかなんでそこで SQL が出てくるんだ?

565:デフォルトの名無しさん
08/12/17 15:21:17
当時の様子は知らないし、同じくキューでない配列にも普通にpop/shiftは使うけど
配列から取り除くことが作用ではなく副作用になる場合以外、
「配列から取り除く(ついでに値を得る)」ではなく
「値を得る(ついでに取り除く)」だと思ってるとミスするという話かと。

def get_first(ary)
 ary.shift
end
ary = [1,2,3]
put get_first(ary) # aryが破壊される


566:デフォルトの名無しさん
08/12/17 15:35:31
>>563
同意
queue じゃなくても、popもshiftも使うよな

567:デフォルトの名無しさん
08/12/17 15:38:04
キューでもないのにpopが積極的に必要になる場面が思いつかない
イテレータ拒絶派か何かか?

568:デフォルトの名無しさん
08/12/17 15:42:26
>>567
split結果の先端や終端にゴミついてるのが確実なときに切り落とすためとか。

569:デフォルトの名無しさん
08/12/17 15:55:45
>>568
delete_at(0)


配列先頭のデータが欲しいときに

data = arr.delete(0)

と書くのが奇妙なのと同程度には

# 先頭は不要
arr.shift

と書くのは奇妙だと思う
shift に関してはコマンドライン引数を順に扱うときに shift コマンドを使った経験が後を引いてるのかもしれないが、
ここは Ruby だし shift は変

570:デフォルトの名無しさん
08/12/17 15:57:55
そろそろ誰の何の質問の答えているのかはっきりさせようか

571:デフォルトの名無しさん
08/12/17 15:58:58
じゃあどう書けばRuby的なの?

572:デフォルトの名無しさん
08/12/17 16:19:46
配列を破壊しなければうまくいかないかどうかによって違うんじゃね

573:デフォルトの名無しさん
08/12/17 16:19:54
>>570
>質問・要望・雑談などどうぞ。

>>569
奇妙なのはそのコメント文だろうw
代入操作がないことから不要なことは自明。
返値があるものは代入しないといけないなんてルールはないし。

>>565のように先頭や末尾の要素を配列から取り除くのが主の操作で、
popやshiftにそれ以上の意味(=キュー専用)はないと考えてる。
だからdelete_at使えというのは、firstやlastもat(0)やat(-1)にしろと
言っているように聞こえる。

キューでない配列に対してpopやshiftがよろしくないなら
Array#pop #shift #push #unshiftは廃止してQueueクラスを用意するべき。
運用で制限しようとするほうがおかしい。
(threadのものと名前がかぶるけどそれはさておき)


574:デフォルトの名無しさん
08/12/17 19:49:45
難しく考えたことねえな

ところでその考え方だとpopはキューに使っちゃダメだろ
あれはスタックに使うものでは?

575:デフォルトの名無しさん
08/12/17 21:13:20
>>569
切り捨てるより、shiftで切り出された結果を使う方が多い

param = ARGV.shift
line = lines.shift

とか

576:デフォルトの名無しさん
08/12/17 21:39:05
each でブン回すのが Ruby 的ではあるんだろうな

577:デフォルトの名無しさん
08/12/17 21:54:01
>>574
push⇔shift
unshift⇔pop
これでキューが出来上がる。ただし左がエンキュー、右がデキュー

578:デフォルトの名無しさん
08/12/17 21:59:30
素直にQueueクラス作れよ、というのは昔から言われてはいたな
というか、説明もないしキューの概念知らない人もそこそこいるのでは

579:デフォルトの名無しさん
08/12/17 22:02:02
unshiftだけ遅いから注意が必要

580:デフォルトの名無しさん
08/12/17 22:26:23
unshift遅くなくね?

581:デフォルトの名無しさん
08/12/17 22:33:43
>>578
自慢だが知らん
popやshiftは配列から1個取る便利メソッドだと思ってる

582:デフォルトの名無しさん
08/12/17 23:47:16
>>531
丁寧な解説をありがとうございます。
Rubyの「オブジェクト指向」という考え方が何となく判って来た気がします。

つまり、文字列などの何らかのデータをオブジェクトとして扱い、
その内容に変更を加えたデータ(や当該コード)もオブジェクトにでき、
更にそのオブジェクトに変更を加えたデータも・・・・・
という事が限りなくできる、ということなんですね。
つまり「全てがオブジェクト」なんですよね?

そして、そのあらゆる段階でのオブジェクト(データ)に自分で名前を付けることによって、
任意の段階でのデータ(オブジェクト)をコードのどこでも簡単に使い回しできるようにしたものが、
Rubyのオブジェクト指向、だと理解しました。

そして、初心者が常に気を付けるべき点は、
データを処理するためのメソッドが「どのオブジェクトを対象としているのか」という点にある、
というのが>>531でのアドバイスの要点だと思いました。

基本的な理解はこれで合っているでしょうか? (^^;)

583:デフォルトの名無しさん
08/12/17 23:53:26
Rubyは肯定(否定)戻り読みには対応していないんでしょうか?
肯定(否定)先読みには対応しているようですが。
使っているエディターがPerl準拠の正規表現なので
今までは戻り読みが使えて便利だったのです。

584:デフォルトの名無しさん
08/12/18 00:02:13
lookbehind は鬼車が要るはず

585:デフォルトの名無しさん
08/12/18 00:29:31
>>580
a = []; 50000.times { a.push(0) }

a = []; 50000.times { a.unshift(0) }
を比べてみな

586:デフォルトの名無しさん
08/12/18 00:33:16
yield

587:デフォルトの名無しさん
08/12/18 00:57:28
>>584
ほほう。こういうものがあるんですね。
次期Rubyに搭載予定だそうで凄そうです。
それで鬼車のホームページには、

>* 5.xはUnicode Property/Scriptを提供
>* 2.xはRuby1.6/1.8組込みライブラリとして動作する。 (2006年末で保守を終了)

と書いてありますが、どちらをインストールしたら良いんでしょうか。
詳しい方がいらっしゃったら御教示願います。

588:デフォルトの名無しさん
08/12/18 08:51:32
>>580 じゃないが、試してみて >>585 の優しさを知った。
50000 は絶妙なとこだな。(celeron 1.3GHz)

589:デフォルトの名無しさん
08/12/18 09:31:25
そんな中古でも売ってないような激遅CPUで話にしゃしゃり出られても困る

590:デフォルトの名無しさん
08/12/18 09:47:36
今の平均的なCPU速度ってどのくらいなのかね
自分でちょっと重い処理するライブラリとか公開したときちょっと気になる

591:デフォルトの名無しさん
08/12/18 09:51:40
>>589
Core2Duoでも相当差が付くぞ

592:デフォルトの名無しさん
08/12/18 09:59:23
>>589
そのご立派なCPUで500000とか試してみなよ。

593:デフォルトの名無しさん
08/12/18 10:05:52
噛み付かれた>>588カワイソス

594:デフォルトの名無しさん
08/12/18 10:09:49
>>590
2GHzくらいじゃね

595:デフォルトの名無しさん
08/12/18 10:17:43
てかPentium4からこっちはよくわからん理由で処理速度が違うから周波数アテにならん

596:デフォルトの名無しさん
08/12/18 11:26:59
公開するライブラリの重さなんて気にしなくてもいいんでは?
使う人次第で負荷なんて桁で変わるんだし。

軽く使えるノウハウでもついでに書いとけば喜ばれると思うけど。

597:デフォルトの名無しさん
08/12/18 12:02:34
RubyのArrayはリストとかじゃなくてまんま配列なので、
pushと違ってunshiftは必ずメモリのコピーが発生するから
ってことかな>速度差

598:デフォルトの名無しさん
08/12/18 12:34:38
IronRubyって終わったんでしょうか?

599:デフォルトの名無しさん
08/12/18 15:12:50
>>587
どちらもインストールしないでrubyの1.9.1をインストールする。
まだリリースされてないけど。

600:デフォルトの名無しさん
08/12/18 15:13:58
>>598
終わったというか、まだ始まってない。
そもそもIronRubyの動作基盤であるDLRがまだリリースされてないし。

601:デフォルトの名無しさん
08/12/18 15:19:49
Ruby で「静的 HTML に変換して出力してくれる入力テンプレシステム」って何がありますか?
* で始めると見出しとか、 - で始めるとリストとか、そういうので適当な日記的 HTML を楽に書きたいです
日記や Wiki みたいな動的機能はいらないです
サーバにアップロードするときに Ruby スクリプトで変換して FTP するとか、そんな感じなんですが

602:デフォルトの名無しさん
08/12/18 15:36:51
RD

は死んでる?
gem でイイのないもんかね

603:デフォルトの名無しさん
08/12/18 15:41:45
Hiki に Wiki 書法用のパーサが付いてたような気が

604:デフォルトの名無しさん
08/12/18 15:42:53
WikiCreoleパーサをさがしてみるといいんじゃないか?
あるかどうか知らんけど。

605:デフォルトの名無しさん
08/12/18 15:48:25
RedCloth とか BlueCloth とか。
日本語がちゃんと扱えるかどうかは知らないけど。

606:デフォルトの名無しさん
08/12/18 16:08:25
つWikiforme
使いやすいとは言えないがかなり面白い。
これとTenjin組み合わせれば・・・とか妄想してる。

607:デフォルトの名無しさん
08/12/18 16:09:43
rake で sh "command" としたときに、command が画面に表示されないんですが、そんなものでしょうか。
どんなコマンドが実行されているか表示されてほしいんですけど。

608:デフォルトの名無しさん
08/12/18 17:18:08
Installing ri documentation
Installing rdoc documentation

これでバカみたいに遅いのはなぜ?
中で何やってこんなに遅いの?

609:デフォルトの名無しさん
08/12/18 17:21:52
ソースコードを解析してドキュメントを作ってるから、だと思う。多分

610:デフォルトの名無しさん
08/12/18 17:29:06
ファイルが細かくて多いと死ヌほど時間かかる印象

611:デフォルトの名無しさん
08/12/18 17:30:06
あれってなんで事前作成してないんだろ。
環境によって出力結果変わったりするもの?

612:デフォルトの名無しさん
08/12/18 17:31:55
>>611
できるものがでかいから。

613:デフォルトの名無しさん
08/12/18 17:35:48
まあつまりファイルサイズをケチってるわけだな
実際のドキュメントを見るとわかるがまあ結構デカい

デフォルトデザインのドキュメントくらい添付してもいいと思うんだが、
まあ、全パッケージの全バージョンを保持してるわけだし、
それぞれに2種類のドキュメントをさらに保持というのは確かに辛いかもしれず

614:デフォルトの名無しさん
08/12/18 17:53:36
回答サンクス。でも所詮は圧縮効率よさげなテキストでしょ。
パッケージはgzipとかしてるだろうし、試しにzipアーカイブに・・・

rubygems-1.3.1/rdoc/ 2,425,167byte -> zipped 820,211byte

把握したw

615:デフォルトの名無しさん
08/12/18 18:16:02
余裕じゃん

616:デフォルトの名無しさん
08/12/18 18:45:30
>>603
HikiDocか。

>>601
Hikiのは古いから、HikiDocでぐぐって(単体で保守されてる)
あとはRakeと連携して細かいところを自分で書けばおっけーじゃね。

617:デフォルトの名無しさん
08/12/18 19:17:03
>>601
Marukuもあるよ
高機能な割に、いまいち安定しないが

618:デフォルトの名無しさん
08/12/18 19:26:32
>>611
>あれってなんで事前作成してないんだろ。
事前に作成できるよう指定できるよ。
ようは各gem作者がそれを指定してないだけ。

619:デフォルトの名無しさん
08/12/18 20:10:37
>>599
鬼車のを今の1.86で組み込んで使うことはできないんでしょうか?
戻り読みの正規表現が使えないと非常に困るのです。

ネットで調べたら「VC++で鬼車をコンパイル云々」と出て来ましたが、
プログラミングはRubyから始めたばかりなので、
別のプログラムが必要とかになるとお手上げなのです。

何とかならないものでしょうか。鬼車の2.x系で構わないので。

620:デフォルトの名無しさん
08/12/18 20:18:19
鬼車を使うか旧来のregexエンジンを使うかはコンパイルオプションで
決まっちゃうので、自分でコンパイルがお手上げなら、鬼車を有効に
してあるバイナリを探すしかない。あるかどうか知らないけど。

駄目ならRubyでやるのを諦めるしかないと思うけど。

621:デフォルトの名無しさん
08/12/18 21:13:29
鬼車gemもあるな。
リテラルの/.../だと組込の正規表現クラスを使ってしまうので、
全部明示的にメソッド呼んで組み立てる必要があるが。


622:デフォルトの名無しさん
08/12/18 21:29:29
gem のライブラリのファイルをどこで誰が読んでるかを調べる方法はある?

gem 'package_name', '=1.0.0'

でバージョンを指定してるはずなんだけど、

/usr/lib/ruby/1.8/rubygems.rb:142:in `activate':
can't activate package_name (>= 1.0.1, runtime),
already activated package_name-1.0.0 (Gem::Exception)

という例外が出て動作しない
1.0.0 を指定してるんだから 1.0.0 だけ読んでくれよ
っていうかバージョン指定でインストールさせるライブラリの作者は安易に require だけすんな氏ね

623:デフォルトの名無しさん
08/12/18 21:32:02
>>620
レスありがとうございます。
戻り読みが使えないのは大変に困るので、
素人でもコンパイルと言うものができるなら挑戦してみようと思います。

ええと、ネットで調べたのですが、
Rubyと鬼車のソースを手に入れて解凍し、
鬼車の解凍フォルダをRubyの解凍フォルダに入れて、
Visual C++ Toolkit 2003 Commandでコマンドを入力してコンパイル

で、基本的な流れは良いんでしょうか。
鬼車を組み込むために特別なことは必要ないのでしょうか?

>>621
できれば他の正規表現と全く変わらないように使いたいので、
鬼車を組み込んだRubyの方がありがたいのです。

624:デフォルトの名無しさん
08/12/18 21:39:26
>>623
なんかすごいことしようとしてるなー

ちなみに、その戻り読みが必要な正規表現ってどんなの?
もしかしたら、戻り読みが必要ないかたちに書き換えられるかもしれないし。

625:デフォルトの名無しさん
08/12/18 22:13:45
>>624
> なんかすごいことしようとしてるなー

そんなに素人には敷居が高いのでしょうか?
確かに戻り読みは全ての正規表現に使うわけではないので、
>>621さんの鬼車gemというのを使った方が良いのでしょうか。

626:デフォルトの名無しさん
08/12/18 22:17:53
たぶん、
Object.const_set('Regexp', ORegexp)とかしてしまえば(警告出る)、
Regexp.newで作った後は同じように使える(と思う)から、
/.../と書けない以外はそれなりに使えるんじゃないだろうか。


627:デフォルトの名無しさん
08/12/18 22:18:01
コンパイルとか一回やっとくと後々役に立つこともあるだろうから
やっといてもいいと思うけど。
Cygwinじゃダメなの?

628:デフォルトの名無しさん
08/12/18 22:58:02
>>607
-v

629:デフォルトの名無しさん
08/12/18 23:06:19
>>623
「鬼車を組み込むために特別なこと」は鬼車のドキュメントに書いてある。
それに従えば大丈夫だと思うよ。

630:デフォルトの名無しさん
08/12/18 23:48:15
「ひらがな ←→ カタカナ」の変換ってどうやるんでしたっけ。

631:デフォルトの名無しさん
08/12/18 23:56:38
>>630
Ruby単体では難しいな
NKFに頼るのが妥当か

632:デフォルトの名無しさん
08/12/19 00:01:56
プログラムのlogを自分宛にメールで送りたいと思ったんだがpop before smtpってよくわからん
○行処理完了,×行目失敗,△行目失敗...ぐらいのちょっとしたものなのに

633:デフォルトの名無しさん
08/12/19 00:05:43
>>632
そのまんまだよ
smtpの前にpopでただアクセスすればいい
履歴はサーバが短時間記憶してくれているから普通にsmtpでアクセスだ

メール関連は詳しく説明するとSPAM送るアホが出るからどこも親切にはしてくれないだろうね

634:デフォルトの名無しさん
08/12/19 00:15:20
>>631
サンクス

635:デフォルトの名無しさん
08/12/19 00:51:58
>>630-631
一方向の変換ならString#trじゃダメ?

636:デフォルトの名無しさん
08/12/19 09:48:35
aという配列の要素に、正規表現でキャプチャした値を入れたいです。
具体的には
a[0]=$1
a[1]=$2
以下同様です。
これを
0.upto(4) do i
 a[i]=$(j+1)
end
とかやってもコンパイルエラーがでてしまうのですが、組み込み変数$1,$2・・・に
イテレータを利用してアクセスできる方法はありますか?

637:636
08/12/19 09:49:51
>>636は書き間違いました。
a[i]=$(i+1)
です。

638:636
08/12/19 09:54:02
自己解決しました。
0.upto(4) do i
 a[i]=$~[j+1]
end
でいけました。一人で何やっとるんだ俺は。

639:デフォルトの名無しさん
08/12/19 09:56:11
自己解決ハヤスw

640:636
08/12/19 09:59:49
>>638は書き間違いました。a[i]=$~[i+1]です。もう俺は死ね。

641:デフォルトの名無しさん
08/12/19 10:06:44
萌えた

とりあえず a = $~[1..-1]

642:デフォルトの名無しさん
08/12/19 10:07:51
$~.capturesオススメ

643:641
08/12/19 10:10:44
1.8から追加された便利メソッドか。老害の俺も死んでくる

644:デフォルトの名無しさん
08/12/19 11:00:36
もちつけ >638

645:デフォルトの名無しさん
08/12/19 11:53:42
>>631
NKFにそんな機能あったっけ?
ていうか、ひらがな←→カタカナなら
str.tr 'あいう(略)アイウ(略)', 'アイウ(略)あいう(略)'
でどうだろう。「ヴ」をどうするかとか問題はあるけど。

646:デフォルトの名無しさん
08/12/19 12:45:16
>>645
irb> puts NKF.nkf('--hiragana', 'ルビーは超うんこ').toutf8
るびーは超うんこ
nil
irb> puts NKF.nkf('--katakana', 'ルビーは超うんこ').toutf8
ルビーハ超ウンコ

toutf8は表示用

647:デフォルトの名無しさん
08/12/19 12:51:20
きれいなプログラムを書くには 箸キプログラミング基礎
URLリンク(d.hatena.ne.jp)

…4点くらい

648:デフォルトの名無しさん
08/12/19 12:54:27
このスレの住人はRuby嫌いなのか

649:デフォルトの名無しさん
08/12/19 20:18:16
File.open と、単なるopenの違いは何ですか?

650:デフォルトの名無しさん
08/12/19 20:54:14
Ruby1.91はいつ出るのでしょうか? 検索したら、
「Rubyf1.91 2007年12月リリース」とかいうページが出て来るし。

651:デフォルトの名無しさん
08/12/19 20:59:17
>>649
普通にファイル開いて使ってるぶんにはどっちも同じです
File オブジェクトを返します
好きなほう使ってください

File.open 派が若干多いような雰囲気はするけど

652:デフォルトの名無しさん
08/12/19 21:20:28
>>651
同じですか
サンクス

653:デフォルトの名無しさん
08/12/19 21:26:50
>>601です
いろいろフォーマット扱える Webgen に手を出したらもうぜんぜん動きません
reStructuredText とか文法いいなーと思うけどこれ Python なんだよね
教えてもらったものいろいろ試します
せんきゅです

654:デフォルトの名無しさん
08/12/19 21:31:59
>>651
>普通にファイル開いて使ってるぶんには
普通でない場合を勝手に補足。
組み込み関数のほうのopenはPerlのopenみたいに"|cat"みたいなパイプの繋ぎ方を
半端にサポートする。
あと、open-uriを使う場合も違いが出る。

655:デフォルトの名無しさん
08/12/19 21:39:11
RubyでMatlabの行列ファイルを読みたいんだけどいいライブラリないですか?

656:デフォルトの名無しさん
08/12/19 21:56:41
全部Matlabで完結したほうがよくね?

657:デフォルトの名無しさん
08/12/19 22:06:19
>>656
実は、データファイルを持ってきてシミュレートせよという課題なんですが
Matlabがなく、OctaveはまともにWindowsでは動かないので…

658:デフォルトの名無しさん
08/12/19 22:24:43
そういうのはデータファイルだけもってこいよ

659:デフォルトの名無しさん
08/12/20 02:39:59
Ruby on railsは、まともなスピードで動かす場合、
月5,000円のレンタルサーバーが必要です。

一方、cakephpなら、月500円のレンタルサーバーで
十分なスピードで動きます。

660:デフォルトの名無しさん
08/12/20 08:29:05
>>658
1.配布されてるデータがMatlab形式
2.解析方法がワカンネ
3.これを使ってk-NN法の実験をしなくちゃならない(レポートの提出はあさってAM10:40)
4.私はMatlabを持ってない

\(^o^)/

661:デフォルトの名無しさん
08/12/20 08:42:09
>>660
エディタで開け
バイナリならMatlabスレで聞けば目で読める形式にしてくれるだろ

662:デフォルトの名無しさん
08/12/20 08:53:53
>>661
バイナリですよ
で、どこの板にありますか?

663:デフォルトの名無しさん
08/12/20 09:45:04
見つかりましたがなんか雰囲気が違います

664:デフォルトの名無しさん
08/12/20 10:05:56
Windows版のOctaveを使ってファイルの変換だけやって
テキストファイルにしてしまえ
いくらWindows版Octaveが不安定といっても
ファイル読んで書くくらいならできるだろう

もしくは、仮想マシンにLinuxいれてでもOctaveをつかうとか


665:デフォルトの名無しさん
08/12/20 10:44:07
>>664
とりあえず書き出し中。ただ、ディスクが逼迫しているのできちんと書き出せるか
かなり不安だが。

666:デフォルトの名無しさん
08/12/20 10:52:43
とりあえず書き出せた。テキスト形式の解析も完了。
さあRubyでがしがし処理するか

667:デフォルトの名無しさん
08/12/20 19:08:36
「10日でおぼえるRuby on Rails」と「はじめてのRuby」を読んだばかりの
Ruby歴2週間のおれに教えてくれ。

Rails2.2を入れたいのだが、Ruby1.9.0Xでいいの?1.9.1の未完成版は止めた方がいい?
仕事じゃないから人柱でもなんでもいいけど、
慣れない環境であまりにも動かないと何が何だか分からなくなってつらい。
最新版命主義だから1.8.6Xはよほどひどくないと考えていないっす。

668:デフォルトの名無しさん
08/12/20 19:12:33
Rubyの最新版は1.8.7だよ
1.8.6は古いから、しがらみも資産もない新規さんなら1.8.7でウキウキ新機能をエンジョイしろ
Railsも完全に動作するし

669:デフォルトの名無しさん
08/12/20 19:22:18
>>668
レスサンクス

1.8.7ってあいのこみたいなイメージがあるのだが。
1.9系みたいにマルチバイト文字列を簡単に扱いたいんだけどできる?

670:デフォルトの名無しさん
08/12/20 19:51:18
結局速いのがいいから1.9.1系にしちゃった。不具合上等。サンキューな。

671:デフォルトの名無しさん
08/12/20 19:54:11
さて果たして670がどうなるのか
ちょっとワクワクしてきた

672:632
08/12/20 20:05:21
>>633
gmail使うことにしました
我ながらなんという遅レスか

673:デフォルトの名無しさん
08/12/20 20:44:50
>>660
Matlab持ってる研究室尋ね歩いて使わせてもらえ

674:デフォルトの名無しさん
08/12/20 21:33:35
1.91はまだか。

675:670
08/12/20 22:26:30
Vista64を使ってるから、1.9.1最新(64bit)入れたけどgemが動かず。
1.9.0最新(64bit)入れたけど動かず。1.9.1最新(32bit)入れてようやくRailsのインストールまで終わった。
落としたバイナリのzlibがだめなのかなと思ったが、疲れたから完璧ということにした。

676:デフォルトの名無しさん
08/12/20 22:40:31
Vista 64ビット版で1.9.1に挑戦するとは……なんという茨の道
でもそんな根性のあるユーザーは嫌いじゃないぜ

677:デフォルトの名無しさん
08/12/20 22:48:29
>>676
嫌いになる可能性しかないような気がするんだが
問題切り分けできない状態でなにが勉強か

678:デフォルトの名無しさん
08/12/20 23:46:21
32bitや64bitという言葉が出てくるんだから、まるっきりコンピュータの素人というわけでもなかろう。
たぶん誰も助けてやることはできないだろうけど、がんばれ。

679:デフォルトの名無しさん
08/12/21 09:12:31
>>673
とりあえずなんとかOctaveでテキスト形式に変換完了。
今延々回してるがかなり長くなりそうorz

680:デフォルトの名無しさん
08/12/21 09:35:39
そもそもRubyは学術計算には向かない

681:デフォルトの名無しさん
08/12/21 12:18:43
>>680
何をするかに依るが、簡単な数値計算には俺は使うよ。
一行で書いて答ポンと出す感じのコード。向いてると思う。
ちょっと入り組んでる計算(シミュレーション、微分方程式、FFT etc)
だと C++ で書くけど。

682:デフォルトの名無しさん
08/12/21 12:34:26
計算が多少複雑でも、コード書くことだけ考えればRubyで十分扱えると思う
むしろ問題なのは処理速度

683:デフォルトの名無しさん
08/12/21 12:35:45
行列演算の結果狂ってるとかいうのなかったっけ

684:デフォルトの名無しさん
08/12/21 14:07:22
学術計算にいまどきプログラミング言語か

入り組んでいる計算なら
mathematicaとかmatlabのほうが向いてると思うね
簡単な計算ならlinuxについているbcが向いてる

685:デフォルトの名無しさん
08/12/21 14:09:34
mathematicaも立派な関数型言語搭載のプログラミング環境ですから

686:デフォルトの名無しさん
08/12/21 14:10:34
はいはい、「汎用の」が抜けてた抜けてた

687:デフォルトの名無しさん
08/12/21 14:29:33
巨大な計算をする時はやっぱmathematicaやmatlabは遅い。
とは言え、代替物としてRubyを使うのもどうかとは思うが。

688:デフォルトの名無しさん
08/12/21 17:00:04
nokogiriのgemインストールが失敗します。
riの生成に失敗しているようなのですが、これはどのように対処したもんでしょうか?


> gem install nokogiri
Successfully installed nokogiri-1.0.7-x86-mswin32-60
1 gem installed
Installing ri documentation for nokogiri-1.0.7-x86-mswin32-60...
ERROR: While executing gem ... (NoMethodError)
undefined method `new' for nil:NilClass

> ruby -v
uby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

689:デフォルトの名無しさん
08/12/21 17:31:48
>>681
計算時間の見積もりが4日とかorz
256次元のベクトルの距離を頻繁に求めるので手間かかりすぎ。
ある1本と別の4000本との距離を求めるだけで45秒。
使ってるクラスはmatrixに入ってるVectorクラス。

690:デフォルトの名無しさん
08/12/21 19:55:22
>>688
$ gem install --no-ri nokogiri
とりあえず。ちなみに gem help install で調べられる。

ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
gem 1.3.1
では問題は起きなかったっす。

691:デフォルトの名無しさん
08/12/21 21:08:15
>>690
rdocもなんか失敗したので、これでいけました。
gem install --no-ri --no-rdoc nokogiri
ありがとう。


692:デフォルトの名無しさん
08/12/21 21:10:09
ちょいと質問なのですが、
HTMLファイルの一部を書き換えたいのですが、
nokogiriとか使うとパースや部分的なノード置換がすごく楽なのですが、
出力すると(to_html)元のHTMLがかなり崩れてしまいます。

元のHTMLをなるべく維持したい場合はどうしたらよいものでしょうか?

693:デフォルトの名無しさん
08/12/21 21:13:02
見掛けが崩れるだけで、htmlとしては大部分が同じはずだが
HTML上の改行位置や空白数なんかも維持したい場合は正規表現で置換するしかないな

694:デフォルトの名無しさん
08/12/21 21:19:33
フラットな処理で何とかなるならHTMLSplitとか

695:デフォルトの名無しさん
08/12/21 21:35:38
rubygemsのsyntaxってあんじゃん
なんていうか、マトモなCSSってどこかにない? vimやEmacsのハイライト意識したやつとか
RubyとHTMLのだけあればいいんだけど

あのRubyのとか酷過ぎるだろ常識的に考えて

696:デフォルトの名無しさん
08/12/21 21:42:02
>>693-694
レスありがとう。

なるたけ維持したかったので、頑張って正規表現でgsubしてみました。
そんなに複雑じゃなかったのでなんとかなったみたいです。
お騒がせしました

697:デフォルトの名無しさん
08/12/21 22:03:17
for i in 1..50
hoge
end
の 50 を a を Array として
for i in 1..(a.size)
としたらだめのようでした。
aのサイズだけ for を走らせたい場合、Ruby はどうするのがよいでしょうか?


698:デフォルトの名無しさん
08/12/21 22:07:31
普通はこうする。

a.size.times { |i| p a[i] }

699:デフォルトの名無しさん
08/12/21 22:09:38
>>697
a.each do |e|
p e
end

Ruby では for はまず使わない

700:デフォルトの名無しさん
08/12/21 22:10:35
>>697
よのどのことがないかぎり、Rubyでは単純ループにforは使わないと慣習があるぞ
>>698 でよいかと思う

701:デフォルトの名無しさん
08/12/21 22:10:50
インデックスが欲しければこう

a.each_with_index { |e, i|
}

702:デフォルトの名無しさん
08/12/21 22:11:32
ごめん、>>699

703:デフォルトの名無しさん
08/12/21 22:13:40
a のサイズ分ループしたいけど、
a の要素を使わない時は >>698 だっしょ。
a の要素を単に順番に使いたいだけの場合は >>699 で、
a の要素とそのインデックスを両方使いたい場合は >>701 だ。

704:デフォルトの名無しさん
08/12/21 22:17:21
>>698-701
みなさま本当にありがとうです。
for をそもそも使わないのか・・・そもそも入門からおかしかったようです。


705:デフォルトの名無しさん
08/12/21 22:19:16
もちろん普通はfor使わないのは分かるんだがなんで>>697が動作しないんだ?
範囲式に制限でもあるのか?

706:デフォルトの名無しさん
08/12/21 22:21:00
0 オリジンじゃないから
配列にアクセスする部分で死んでるとか

707:デフォルトの名無しさん
08/12/21 22:23:11
そうだな
50番目の a[i] で nil の NoMethodError でも出てるのだろう

708:705
08/12/21 22:33:17
なるほど。自分も初心者だが確かにやりそうだ。
まあこういうのを防ぐ為にもforは使わないってことだな。

709:デフォルトの名無しさん
08/12/21 23:14:47
Rubyを書き慣れてくると、forの書き方はちょっと考えないと
思い出せないようになってくる。


710:デフォルトの名無しさん
08/12/21 23:17:48
freezeしたHashの要素を変更するシンプルな方法はありますか?
freezeの意味ないやんってなるけど仕様変更で一か所だけ要素を変更する必要があります
freezeしているクラスと同じクラス内なので影響が他のクラスに及ぶことはありません

711:デフォルトの名無しさん
08/12/21 23:52:38
>>695
「酷すぎる」って言ってるのが
syntax-*/data/ruby.css とかのことだったら、あれ以上のもので公開されてるのは多分ない。

712:デフォルトの名無しさん
08/12/22 00:08:51
>>680-687
遅レスだが(というかなぜか今日は流れ速い)、俺がよく ruby 使うのは
簡単な計算でパラメータ変えて繰り返して使う式ですぐ答が欲しいときかな。
わざわざ Mathematica とか Maple, Maxima 立ち上げる気がしない程度のもの。
あと、これらでもプログラム書けるけど個人的には ruby の coding の方が好き。
3次方程式の解レベルの複雑さ。Ruby で端末でパラメータ入力して結果
すぐ帰ってくる。bc, とかではできない。多少複雑なら C++ で書いてる。
ruby は遅いし、書き捨て的に使ってるし、mma, maple, maxima とかでも
遅すぎることも多い。



713:デフォルトの名無しさん
08/12/22 00:45:33
>>710
h = {:ary => [1]}.freeze # => {:ary=>[1]}
h[:ary][0] = 2
p h # =>{:ary=>[2]}

Hashオブジェクトをfreezeしてもその中にあるオブジェクトまでは
freezeされてないから、それを直接書き換えるとか。
これ、本来はfreezeの落とし穴だから気をつけて。


714:デフォルトの名無しさん
08/12/22 01:38:05
要素を変更したいんですー
h = {:ary => 1}.freeze
h[:ary] = 2

715:デフォルトの名無しさん
08/12/22 01:46:09
Are you happy?

716:デフォルトの名無しさん
08/12/22 02:00:18
じゃあdupしてfreezeされてないコピーに差し替えれば?
と言いたいけど別のところに参照されちゃってるんだろうなぁ。

そもそもfreezeしてるコードをいじれるならfreezeやめれば
いいじゃんと思うんだけど、freezeしないといけない理由を詳しく。


717:デフォルトの名無しさん
08/12/22 03:08:37
文字通り邪悪だけど、
evil-ruby gemをインストールして h.unfreeze


718:デフォルトの名無しさん
08/12/22 06:52:25
>>710
出来ないことはないけど、不可能と考えて別の方法を探すべきだと思われる
そもそも、freezeされてるってことはそれなりの理由があるんじゃないのか?

719:デフォルトの名無しさん
08/12/22 10:55:22
>>710
びみょーに違うけど、こんなん(不完全だけど)をextendして
freezeを遅延させるとか…? やっぱ変だな

# 一箇所だけ変えたいところのキーは'hoge'決めうち
module HashLasyFreeze
 def []=(key, val)
  ret = super
  freeze if key == 'hoge'
  ret
 end
end

720:デフォルトの名無しさん
08/12/22 15:28:52
いくつかのサイトの更新状況を取得するプログラム組んでいるのですが、
File::statしてatimeしたいのですが、サイトで公開されているページの最終更新時間など取得する場合どのようにすればいいのでしょうか。

721:デフォルトの名無しさん
08/12/22 15:33:54
>>720
require 'net/http'
Net::HTTP.version_1_2
Net::HTTP.start('www.example.com', 80) {|http|
 response = http.get('/index.html')
 puts response['last-modified']
}
こんな感じ。

722:デフォルトの名無しさん
08/12/22 20:27:20
WindowsXP SP3、OneClickInstaller
デスクトップ(や他のアプリケーション上)に文字列を表示させるソフトを作りたいのですが、
それが可能なGUIツールキットってあるのでしょうか?

ググってみたところ、ウィンドウの半透明化ができれば可能そうだと思ったのですが、
それが可能なツールキットを探すことができませんでした。

ご存知の方いらっしゃれば教えてください。

723:デフォルトの名無しさん
08/12/22 20:37:03
いわゆる付箋ソフトだな

Rubyでやるこっちゃないねえ
他のC#とかで作れるようになってからその知識を流用してRuby+GUIでやれ
95パーセントくらいRuby無関係だし

724:デフォルトの名無しさん
08/12/22 20:40:41
Win32OLE.rb

725:デフォルトの名無しさん
08/12/22 20:51:05

def getWindowLong(hwnd, index)
api = Win32API.new('user32', 'GetWindowLong', 'LL', 'L')
return api.call(hwnd, index)
end
def setWindowLong(hwnd, index, gwl)
api = Win32API.new('user32', 'SetWindowLong', 'LLL', 'L')
return api.call(hwnd, index, gwl)
end
def setLayeredWindowAttributes(hwnd, crkey, alpha, flags)
api = Win32API.new('user32', 'SetLayeredWindowAttributes', 'LLLL', 'L')
return api.call(hwnd, crkey, alpha, flags)
end
gwl = getWindowLong(hwnd, GWL_EXSTYLE)
gwl &= ~WS_EX_LAYERED
gwl |= ((ratio != 100) ? WS_EX_LAYERED : 0)
gwl &= ~WS_EX_TRANSPARENT
gwl |= (transparent ? WS_EX_TRANSPARENT : 0)
setWindowLong(hwnd, GWL_EXSTYLE, gwl)
setLayeredWindowAttributes(hwnd, (ckey ? color : 0),
((255 * ratio) / 100), (LWA_ALPHA | (ckey ? LWA_COLORKEY : 0))
)

726:デフォルトの名無しさん
08/12/22 20:55:22
GWL_EXSTYLE = 0xFFFFFFEC
WS_EX_LAYERED = 0x00080000
WS_EX_TRANSPARENT = 0x00000020
LWA_COLORKEY = 0x00000001
LWA_ALPHA = 0x00000002


727:デフォルトの名無しさん
08/12/22 20:56:50
>>723
うむ、95パーセントくらいRuby無関係だな

728:722
08/12/22 21:11:41
>>724-726
レスありがとうございます。試してみます!

>>723,727
既存のrubyプログラムの処理結果をデスクトップに書きたかったんです。
rubyでどう頑張ってもダメならC#覚えるつもりでした。助言ありがとうございます。

729:デフォルトの名無しさん
08/12/22 21:33:18
rubyで幾つかのオブジェクトを生成・初期化したかったので、
a=b=c=d=Array.new
とかやったら、全部が同じオブジェクトを指してしまうという大惨事に見舞われました。

Cとかなら int a=b=c=d=0;
とか書いて複数の変数の生成・初期化が問題なく行われるんですが、rubyでこれをやると
同じオブジェクトが参照されてしまうのってどうなんですか?

730:デフォルトの名無しさん
08/12/22 21:37:50
>>729
だってそれは初期化でもなんでもなく、単に同じオブジェクトを指すように指示してるだけだもの
そのオブジェクト内容が変化すれば全部が変化するというそんだけの話
オブジェクトという考え方をRubyでは無視せんでくれ

a = Array.new
b = Array.new
c = Array.new
d = Array.new

こうだな
Arrayオブジェクトを生成する使い方をしてるならArray.newではなくnilでもいいかも

731:デフォルトの名無しさん
08/12/22 21:38:46
Cでポインタ使ったことある?

732:デフォルトの名無しさん
08/12/22 21:46:33
>>729
Array.newが一度しか実行されなければ、Arrayのオブジェクトは一つしか生成されない
って見方もできるかと

733:デフォルトの名無しさん
08/12/22 21:47:27
a,b,c,d=Array.new*4

734:デフォルトの名無しさん
08/12/22 21:50:15
あーはいはい

>>729
Ruby は代入文も値を返す

a=b=c=d=Array.new



d=Array.new
c=d
b=c
a=b

と全く同じだ
a が b=c=d= を「透過して」 Array.new を起動することはない

735:デフォルトの名無しさん
08/12/22 21:54:50
>>730
たとえば、100個のオブジェクトを生成・初期化したいときには、
a1=Array.new
a2=Array.new
   ・
   ・
   ・
a99=Array.new
a100=Array.new
って書かなきゃだめなの?
a自体をarrayにしろと言われそうだけど、多数のオブジェクトを生成・初期化したい場合は
一行に一個書くしかないの?

736:デフォルトの名無しさん
08/12/22 21:56:01
そのためにもArrayを使えよw

737:デフォルトの名無しさん
08/12/22 21:56:46
a = Array.new(100)
a.each { |b| b = Array.new }

738:735
08/12/22 22:00:14
どうやら俺はデータ構造というものについて真剣に考えるべき時期に来たようだ。
Rubyだけですむ話ではなさそうだ。すまん。このスレからは消えることにする。

739:デフォルトの名無しさん
08/12/22 22:09:53
a1=Array.new
a2=Array.new
   ・
   ・
   ・
a99=Array.new
a100=Array.new

まじでこういうソース見たことあるよ
某上場電気メーカーのソフトウェア部門で

740:デフォルトの名無しさん
08/12/22 22:13:20
そいつの方が給料いっぱいもらって勝ち組みなんですね
わかります

741:デフォルトの名無しさん
08/12/22 22:30:43
1.upto(100) {|i| eval "a#{i} = Array.new" }

1.9だと外側のbindingをevalに渡す必要があったりするのかな。


742:デフォルトの名無しさん
08/12/23 00:30:25
>729
その文って、Cで書くとすれば
int array[] = {3,4,7,2,9,1};
int *a,*b,*c,*d;
a=b=c=d=array;
みたいな感じでは?だからCでも全部同じ配列を指してしまうのは変わりないよ
Rubyでも、Fixnum同士ならその代入でも問題は起こらん
違うのは構造体やクラスから生成した、実体同士の代入ってのがRubyに無いことかな

743:デフォルトの名無しさん
08/12/23 02:50:57
Dir.glob("./*")

で、ディレクトリを含まないリストを得るにはどうやったら良いのでしょうか?


744:デフォルトの名無しさん
08/12/23 02:54:55
globは糞なのでls, dirを使いましょう

745:デフォルトの名無しさん
08/12/23 02:59:04
なるべく機種依存のコーディングは避けたいんですが・・・


746:デフォルトの名無しさん
08/12/23 03:04:57
Dir.glob("*").select {|f| !File.directory?(f) }
かな。ちなみに "./" は不要。

747:デフォルトの名無しさん
08/12/23 03:18:27
少しスレ違いかもしれませんが、特定のファイルをscanした時だけ
500 Internal Server Errorして落ちてしまうのですが、
タグ内で異様にスペースがやたらあるような文字列にscanすると異様に負荷がかかるとか聞いたことありませんか?


748:デフォルトの名無しさん
08/12/23 04:40:50
>>746
なるほど。ディレクトリ判定を入れればいいのですね。ありがとうございます。

749:デフォルトの名無しさん
08/12/23 06:41:46
>>747
Ruby自体はHTTPのエラーを出さない
それは、サーバが実行したコマンドが正規の出力をしなかったという意味しか持たないよ
原因を知りたかったら勝手な推測は止めて、その正規ではない出力が何かを調べる

コマンドラインから実行すれば一発だが、どうせコマンドラインから実行できないんだろうから、スクリプト内の実行部分を

begin



rescue Exception => e
File.open('/自分のディレクトリ/error.txt', 'w'){|f| f.print(e)}
end

で囲んでRubyの出す例外出力を読め

750:デフォルトの名無しさん
08/12/23 07:43:45
>>600
wikiみろ

751:750
08/12/23 07:44:16
誤爆

752:デフォルトの名無しさん
08/12/23 08:30:59
Windowsで日本語を扱っています。

require 'jcode'
$KCODE='SJIS'
str = 'aあいbうえおc'

上記のような時に2文字目までを切り出したいんですが、
「str[0, 2]」では2バイト目までということになってしまいます。


下記のような冗長なやり方しか思いつかないのですが、もっとスマートなやり方はないでしょうか?
jcodeのリファレンスマニュアルを見てみたのですが使えそうなものが見つかりませんでした。

i = 0
str_part = ""
str.each_char do |x|
str_part += x if i < 2
i += 1
end

753:デフォルトの名無しさん
08/12/23 08:41:38
>>752
str.split('')[0,2]*''

754:デフォルトの名無しさん
08/12/23 08:50:16
すごくスマートですね! Array経由とは考え付きませんでした。

755:デフォルトの名無しさん
08/12/23 09:18:23
strがめちゃくちゃ長くて
2文字目だけでいいときは
もったいない


756:デフォルトの名無しさん
08/12/23 10:06:48
配列内の数値の類似度を求めるのはどうすればいいでしょうか?
偏差なのか、相関係数なのか?
スレチですかね・・・・

757:デフォルトの名無しさん
08/12/23 10:23:04
>>756
配列の要素にアクセスする方法はRubyだな

758:デフォルトの名無しさん
08/12/23 10:26:20
「類似度」を定義しないことにはどうにも

759:デフォルトの名無しさん
08/12/23 10:33:02
>>756
具体例を出してみれば?
じゃないと他の人にはわからん

760:デフォルトの名無しさん
08/12/23 10:37:29
[1, 2, 3, 4]
[16, 8, 4, 2]
の二つの類似度は 100% です

761:デフォルトの名無しさん
08/12/23 10:51:47
>>758 さんの言うように定義の問題では。定義をすれば解き方は
いろいろある。逆に定義が無ければ何したいのかわからん。
偏差でも相関係数でも変数のタイプでも良いが。

762:デフォルトの名無しさん
08/12/23 10:56:24
Rubyでスマートな書き方して生産性が上がったためしがないな。
もう何年も使ってるけど相変わらず配列にデータ突っ込んで
forかeachでまわしてみたいなBASICと大差ないコードしか書いてないw

763:デフォルトの名無しさん
08/12/23 11:02:18
>>760
なぜそれが類似度100% ?

764:デフォルトの名無しさん
08/12/23 11:03:27
Ruby関係ないな

765:デフォルトの名無しさん
08/12/23 11:04:53
そだな

計算式を持ってきてRubyでの実装方法を聞くとかなら手伝う人が出るかも
計算式の出し方そのものは知らん
教科書なり論文なり読め

766:デフォルトの名無しさん
08/12/23 11:19:07
Eclipse に RDT を入れて開発しています。
Ruby Explorer で、[Run as]->[Ruby Application] を選択すれば実行できるのですが、
これを、コードを編集するウインドウがアクティブな時に、キーボードショートカットで
実行する方法はないでしょうか?
キー割り当てで、[Run Ruby Application] に Binding [F5] When [In Windows] もしくは
[Ruby Editor]で割り当てても反応なしでした。

Eclipse のバージョンは 3.4.1
RDT は 1.1.0.200812081651NGT です。


767:デフォルトの名無しさん
08/12/23 11:20:22
レーベンシュタイン距離でも求めれば?


768:デフォルトの名無しさん
08/12/23 13:37:32
>>749
自機でやるとエラー吐かないのに、鯖で動かすと特定の文字列を含むファイルだけ
500エラー吐くですよね。テストした結果scanで100パー落ちていましたし。
でも他のファイルなら普通に鯖でも動いている点から見て、作りが悪いのではなくて特定の文字が含まれてるファイルに対してscanの処理がいように重くなったことによる、
負荷の掛かりすぎて500なのではないかと。
>>749さんの方法も含めつつindexで処理する方法に切り替えや、怪しい文字列の置き換えなど施して処理するなどの方法をやってみたいと思います。
ありがとうございました。

769:768
08/12/23 13:47:40
今やってみた所、indexで切り出したら鯖実行で100%コケていた場所を抜けられました。
scanに比べて負荷が緩やかなんでしょうかindex。

770:デフォルトの名無しさん
08/12/23 14:00:56
原因を知りたかったら勝手な推測は止めて、その正規ではない出力が何かを調べる


771:デフォルトの名無しさん
08/12/23 17:54:55
130MHz駆動の組み込みマシンでrubyプログラムを走らせたら重すぎて笑った。

772:デフォルトの名無しさん
08/12/23 18:12:34
apacheで出してるerror_logみるとか

773:デフォルトの名無しさん
08/12/23 18:28:46
>>769
できるよ。
以上。
はい次の方。

774:デフォルトの名無しさん
08/12/23 19:06:53
自分用ライブラリです。なので、究極的にはどうでもいいんですけれど。
「ローカルファイルを読み込んで、書いてあるデータを変数とかに取り込むクラス」があります。
変数は外部からそれなりの頻度で参照されますが負荷とかは無視して結構です。

class HogeFile
 def initialize(path)
  @path = path ...
 end
 attr_reader :mtime, data2, ...
 def parse
  file = File.read(@path)
  @mtime = File.stat(@path).mtime
  @data1 = file.scan(/.../)
 end
end
という、HogeFile.new.parse が必要なタイプと

class HogeFile
 def initialize(path)
  @path = path
  @data = File.read(@path)
 end
 def mtime; @mtime ||= File.stat(@path).mtime; end
 def data1; @data1 ||= @file.scan(/.../); end
end
という、なんというか遅延評価?っぽいのって、どっちをメインに使っていくのがいいもんでしょか。
こういうデータクラスってけっこう作るんですよね。

775:デフォルトの名無しさん
08/12/23 19:13:25
ほぼ全ての変数を必要とする(アクセスしない可能性のある変数というのがまず無い)のなら前者
変数をまとめてPStoreとかに保存する可能性があるとかいう場合も前者
っていうか基本は前者

data4 くらいで超ごっつい正規表現処理があって処理の流れが一瞬止まるとかいうことがあるなら後者がいいかも
ネットからファイルを適宜取得するタイプのライブラリでは後者を時々見るな

考え方のベースとなるものは君の言う通り遅延評価だ
それが有効かどうかだけで決めちゃっていいと思う
あるいはカッコイイかどうかだけでもいい
(この場合ほぼ全ての自作スクリプトで後者になって、2年くらいして見返して「あーこの頃は遅延評価時代だー」とか懐かしむことになる)

776:デフォルトの名無しさん
08/12/23 19:37:02
てかデータクラスにparseさせんな
それは別のクラスでやって、結果だけをアクセサ経由でデータクラスに登録しろ

777:デフォルトの名無しさん
08/12/23 20:00:17
>>776
えー
めんどい

778:デフォルトの名無しさん
08/12/23 21:05:40
>>769
その環境かかないとよくわからんぞ
共有レンタルサーバーなら負荷掛けるとかってに落とすところもある。

見れるならerror_logは最低みとかないとな

いや多分、個別の環境かかれても俺はなんともいえんと思うけどw

779:デフォルトの名無しさん
08/12/23 21:11:45
>>776
主張の理由kwsk

780:デフォルトの名無しさん
08/12/23 21:18:50
いやそれ自体はそのまんまだろ
めんどくさいからやんねーというのも反論そのまんまだ

781:デフォルトの名無しさん
08/12/23 21:27:09
そういう宗教があるんだろう

782:デフォルトの名無しさん
08/12/23 21:30:16
データとパーサを分けるのは設計の常識みたいなものだけど、個人で作るアプリなら分けなくてもいい。
他人に迷惑をかけないという意味でね。

783:デフォルトの名無しさん
08/12/23 23:02:54
>>771 むしろ ruby がちゃんと走ること自体結構感心した。130MHz だもの。



784:デフォルトの名無しさん
08/12/23 23:08:05
組み込みでも 130MHz とかいくのか・・・。
8~9年前は普通にノートパソコンで使ってたぜ・・・。

785:デフォルトの名無しさん
08/12/23 23:25:22
Mechanize で質問です。

agent = WWW::Mechanize.new
agent.get(url)
form0 = agent.page.forms[0]
form1 = agent.page.forms.name('form1')
form0.name == form1.name #=>true
form0 == form1 #=>false
となります。
form0とform1とは同じものを参照していると思ってたのですが,
どんな違いがあるのですか?
form0.action = 'hogehoge'はうまくいくのに
form1.action = 'hogehoge'はエラーになるので疑問が生じました。

786:デフォルトの名無しさん
08/12/23 23:33:45
>>784
うちの自宅サーバ、その頃のノートPCだったりする。(Pentium133MHz、メモリ40MB)
RubyのCGIが、起動するだけで4秒かかるよ!! 動き始めるとそんなに遅くないんだけどな……。

787:デフォルトの名無しさん
08/12/23 23:40:24
>>785
form1は WWW::Mechanize::List だから、= を使った代入は行えない
form1.action は form1[0].action の返り値、すなわち action 属性の文字列を返す
URLリンク(d.hatena.ne.jp)
form1.action = 'hogehoge' は文字列に代入するという奇妙なことになっているだけ

788:デフォルトの名無しさん
08/12/23 23:48:58
このへんの動作と返り値のオブジェクトの種類を全部把握しないと使えなくて紛らわしいので、
WWW::Mechanize::List は最新版 0.9.0 では削除されてる
agent.page.forms.name('form1') と書いたら NoMethodError で動作しない

Mechanize のバージョンが 0.8.5 かそれ以降なら form_with が使えるよ
それより古いなら、name に限っては agent.page.form('form1') がフォームオブジェクトを返すほぼ同じ動作をする

form0 == form1 を true にしたいなら、List からフォームオブジェクトを取り出して比較してくれ
form1[0] が WWW::Mechanize::Form クラスのオブジェクトを返して form0 と同じもののはず

789:デフォルトの名無しさん
08/12/24 00:04:55
う、答えになってね
> どんな違いがあるのですか?

  「agent.page.forms[0] は WWW::Mechanize::Form クラスのオブジェクトを返しているが、
   agent.page.forms.name('form1') は WWW::Mechanize::List クラスのオブジェクトを返してる」

が回答でございます
だから、

form1 = agent.page.forms.name('form1')[0]

と、List 内の要素を明示的に取り出さないと、WWW::Mechanize::Form オブジェクトそのものにはならないよ
「クラスのメソッドは Object#send で動作するし、返り値も普通に返ってくるけど、目的のクラスのオブジェクトではない」という変な状態
抽出作業が完了したら [0] をつけて特定する癖をつけておかないと、今みたいに変なとこで詰まったりするぞ

790:デフォルトの名無しさん
08/12/24 00:19:13
120MHzあればRubyは動くよね
rubygems は鬼のように重いけど

791:デフォルトの名無しさん
08/12/24 00:22:34
>>787
…このサイト作った奴バカだろ
せいぜい中堅どころのライブラリのメソッド全解説とか何が楽しいんだよ

792:デフォルトの名無しさん
08/12/24 00:29:41
>>791
現在のRubyはそのような
「こんなことまでわざわざ書く理由って何よ?」
という人の努力によってなんとかうまく支えられております
マニュアル書く人しかり、丁寧な導入記事書く人しかり

793:デフォルトの名無しさん
08/12/24 00:49:24
>>791
真意は知らないけど個人的感想としては、mechanizeのライブラリ構造も
単純ではないしRubyの勉強方法として良い手だと思った。
「理解した(自称)」以上に理解が進んでないと説明することなんて
できないんだよなぁ・・・。説明してる内に薄っぺらさが露呈する。
告白デバッグが気付かせてくれるのはまさにそれ。


794:デフォルトの名無しさん
08/12/24 00:58:31
以上ちらうら

795:デフォルトの名無しさん
08/12/24 03:08:36
hpricotでdiv.entryで取得した記事数分ハッシュを作成するにはどうすればよいでしょうか?
Keyはentry_1->entry_nまででvalueは単語数とか他で計算した値を入れようと思うのですが.

796:デフォルトの名無しさん
08/12/24 03:27:22
mechanizeのデフォルトパーサがHpricotからNokogiriになったな。
いつのまに・・・

797:デフォルトの名無しさん
08/12/24 05:57:55
Railsを使ってプロジェクトを自動生成して
ruby script\generate controller main index
を実行したのみのプロジェクトでRubyのテストをしています.
webrickを起動して
URLリンク(localhost:3000)
のhtmlページは,問題なく表示するのですが
URLリンク(localhost:3000)
でindexページを見ようとすると
1度目は正常に表示されますが,
更新ボタン(もしくは,アドレスバーの移動ボタン)を押すとWebrickが次のようなエラーを出して終了していしまいます.

127.0.0.1 - - [24/Dec/2008:05:44:28 東京 (標準時)] "GET /main HTTP/1.1" 200 283
- -> /main
127.0.0.1 - - [24/Dec/2008:05:44:33 東京 (標準時)] "GET /main HTTP/1.1" 200 283
- -> /main
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:196: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-24) [i386-mswin32]

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

ひとつ目の-->/mainが移動時,ふたつ目が更新時です
どのように対応すればいいでしょうか.

798:デフォルトの名無しさん
08/12/24 07:21:44
>>795
search メソッドの返り値は Hpricot::Elements で、配列のような動作をするっていうか配列でできることは全部できる
これに詰まってる要素に当たるものは Hpricot::Elem だ
Hpricot::Elem にはタグに囲まれてる文字列を適当に返す inner_text メソッドや
HTMLで整形して返す inner_html メソッドがあるし、
Hpricot::Elem オブジェクトから search でさらに探すこともできる

それ以上のもんではないので、普通にどうにかして作れ

799:デフォルトの名無しさん
08/12/24 08:43:05
>>797
[BUG]と出た場合、Rubyのスクリプトレベルの誤りではないので、
開発サイドに再現コードを教えるくらいしかできることはない。


800:デフォルトの名無しさん
08/12/24 08:49:16
BUGと出ても、自分がわけのわからんオブジェクトを引数でメソッドに渡してるとか
回避できるものもあるけど

801:デフォルトの名無しさん
08/12/24 09:45:55
回避できてもバグはバグなんじゃね?

802:デフォルトの名無しさん
08/12/24 10:59:53
すいません、ググっても解決できなくてハマっているので教えてください。

ruby1.8にて、ptyとexpectモジュールで、自動sshログインをしようとしているのですが。
cygwin上では、問題なく動かせるものの。
solaris(free10)では、spawn('ssh ***.***.**')の所で

> open: pty slave: No such file or directory

とでてしまいます。
このspawnの内部をsshのフルパス指定にしたり、lsなど他のコマンドに代えても同じでした。
どうもptyモジュールが上手く動かせてないと考えているのですが。。。
特にptyにはパラメータはなさそうです。

ptyがやろうとしてる仮想tty?という処理がなんなのかが理解できてない....

すみません、どなたか動かすヒントだけでも教えてください。

803:デフォルトの名無しさん
08/12/24 11:18:49
>>802
Solarisスレで聞く

804:797
08/12/24 13:03:37
>>799-801
こちらの環境が悪いんじゃなくて
Ruby(もしくはRails)開発側が悪いってことでしょうか?

手書きでは,まだコードを一行も書いていないので
そんなことないと思いたいのですが...

Rubyのダウングレードとかで対応できないか今夜にでもやってみます...

805:デフォルトの名無しさん
08/12/24 13:22:51
>>804
まずは1.8.7-p72のか、せめて1.8.6の一番新しいp287を試してみるべき。
URLリンク(www.garbagecollect.jp)
one-click installer使ってるんだろうけどこの際我慢。

806:802
08/12/24 14:13:10
1.8.7-p27 のソースからのビルドでしたので。
なにかヒントがないかとざっと眺めると、 ./ext/pty を発見。

ダメ元でpty.c をのぞいて、問題点を探してみると、
どうも"TIOCSCTTY "の定義が無い事がまずいんじゃないかと推測。

この情報を元にググってみると
去年の8月、ruby-lang に "Bug in ruby extension" というスレを発見
> I noticed that Solaris 10 does not support TIOCSCTTY so in function
> establishShell() the child process closes the slave device and reopens it to ...

どうやらSolaris 10 において、ptyの問題が指摘されている模様。
TIOCSCTTY がキーワードみたいだが。 私では何がまずいか理解できない(汗)

このスレで問題対応パッチが登場し、最後にmatzさんが"そのパッチをコミットしてくれー"と書いている。

これが今回の私の問題点と同じであるなら、最新版なら動くはずじゃん。と思い・・・.
あ、でも、1.8.7-p27 が 1.8系の最新版ですよねぇ。
うぐぐ、この問題と関係がないのかなあ。。。。(´・ω・`)ショボーン


>803

レスサンクス。
推測通りsolarisの環境がらみの問題なら、海外で聞いた方がよさそうですね。
英語で聞くのは閾が高いなあ...(´・ω・`)

807:802
08/12/24 14:14:57
>806

s/1.8.7-p27/1.8.7-p72/

808:デフォルトの名無しさん
08/12/24 15:34:50
>>786
Passenger入れろw
っていうほどのメモリもないみたいだがwww

809:デフォルトの名無しさん
08/12/24 16:20:13
以下のようなフォームデータを cgi クラスで受け渡したいと思っています。
<form action="" method="post">
<input type="text" name="server" value="#{server}" />
<input type="text" name="name" value="#{name}" />
<input type="submit" value="更新" />
</form>
それも同じ形式のフォームを何個か繰り返しおいて、しかもその個数も可変にしたいと思っています。
さらにそのデータは pstore に保存したいと思っています。

古い CGI での方法ならば変数名 server などに番号をつけて server1, server2 などという変数名として
ループで 1..max をまわして処理するというのが思いつくのですが、Ruby 的にエレガントな方法はあるのでしょうか?
配列やハッシュなどを使ってスマートに書く方法があったら教えていただけませんでしょうか。

810:デフォルトの名無しさん
08/12/24 17:50:42
hiddenを入れれば区別出来るんじゃね

811:797
08/12/25 00:36:49
>805
どちらをインストールしてみても結果は一緒でした...
これってRuby開発者側に伝えた方がいいのでしょうか
うちの環境のみの再現だと思うのですが...

812:デフォルトの名無しさん
08/12/25 01:18:37
rakeで、src/**/*.txt から dst/**/*.html に変換するような file タスクを書きたいんですけど、どうかけばいいですか。


813:デフォルトの名無しさん
08/12/25 05:11:00
a hrefの値の中にABCっていう文字列があるリンクの中身つまりinner_textを取得するにはどうすればいいでしょうか?
hpricotやNokogiriで指定しようにも複数のページでXPATHのaの順番が違っていて取得できません。

814:813
08/12/25 05:36:00
すいません、事故解決です。
doc/"a[text()*='ABC']"でできますね。
Hpricotとかをtagやセレクタでぐるぐる回すものだと勘違いしてました。
お騒がせしました。

815:デフォルトの名無しさん
08/12/25 06:04:46
>>811
自分のコードかデータにバグを引き起こす原因があるとは思わないの?


816:デフォルトの名無しさん
08/12/25 06:44:34
>>815
スレリンク(tech板)l50

817:デフォルトの名無しさん
08/12/25 06:51:44
>>797
とりあえず該当の行を見て、まずどこて落ちたのかを調べるべき
それでも本体のバグっぽかったら諦めて報告

>>809
本題とは関係ないけど、CGIアプリケーションでPStore使うのはオススメしない
rubyのバージョンが古くなるとデータ読めないことがあるから
自分しか使わないスクリプトなら問題はないけど

今ならYAML::Storeオススメ

818:デフォルトの名無しさん
08/12/25 13:26:33
>>810
hiddenを入れて対処できました。ありがとうございました。

>>817
そうなんですね。YAML::Store に書き換えておきました。ありがとうございました。

819:デフォルトの名無しさん
08/12/25 13:59:37
>>815
>>797見てそう思う方がおかしくないか?w
でもmysql環境を見直してみる価値はありそう。

820:デフォルトの名無しさん
08/12/25 15:36:57
某サイトのurlをopenした所、

uninitialized constant StanderdError (NameError)

こんなメッセージが出てプログラムが途中で止まることがあるですけど、これって何が原因なんでしょうか。

821:デフォルトの名無しさん
08/12/25 15:38:47
>>820
>StanderdError
StandardErrorと書いたつもりのどっかでスペルミスしてる。

822:デフォルトの名無しさん
08/12/25 15:45:45
がっちょわるー

class MyHogeError < StanderdError
end

とか書いてあるんだな
がっちょわるー

>>820
使ってる外部ライブラリの中から「StanderdError」という文字列を探して「StandardError」に直接書き換えとく

823:デフォルトの名無しさん
08/12/25 15:51:11
> rubyのバージョンが古くなるとデータ読めないことがあるから
これをあまり心配してない俺
その時になってから過去のバージョンの pstore で読んで、新しいバージョンの pstore で書き出せばよくね?
PStore を YAML で置き換えて常用するなんてブルジョワジョワジョワに過ぎるだろ

824:デフォルトの名無しさん
08/12/25 15:57:22
どんなデータをどんだけ保存したいかによるね
ファイルが数KB程度で収まるなら読みやすいYAMLのほうがよかろう

なんかよくわからん大量のデータの数百KBを読み書きしまーすというのならさすがにちょっと
うっかり画像を保存したことがあるが遅くて死んだ

825:デフォルトの名無しさん
08/12/25 16:06:11
バイナリだとクラッシュしたときの復旧がしんどいから
ちょっとしたデータのシリアライズにはyaml/storeがお気に入り。

826:デフォルトの名無しさん
08/12/25 16:09:07
とりあえず一般ユーザーはこれ使っとけ、と言えるほどのものがRubyにはまだないんだ
用途に応じて使って適宜バックアップだの負荷測定だのしなきゃならん

827:デフォルトの名無しさん
08/12/25 16:15:51
>>826
ガイドみたいなのがあるといいよね
ってるびまにあるのか

828:797
08/12/25 16:26:27
>819

mysql関係ですか,
とりあえず今夜は,sqliteで同じように実装してから
再現確認してみます.

829:デフォルトの名無しさん
08/12/25 16:51:39
>>821
>>822

begin
open("URLリンク(*****)")
rescue Timeout::Error
rescue StanderdError <<<<<某プログからのコピペまんま
rescue EOFErro
rescue Exception
rescue NameError
end

こんな感じで例外関係の対処法ググっては追加していた中で某ブログからコピペしたものが、
スペルミスしていたとは..。
即回答ありがとうございました。実は昨日からハマってました。

830:デフォルトの名無しさん
08/12/25 17:05:59
>>829
コピペうんぬんより、エラーメッセージを*よく*見て原因を考えるクセをつけようぜ!


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