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

Ruby について Part 3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
http://www.ruby-lang.org/ja/

<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/

<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0133デフォルトの名無しさんNGNG
>>132
それはプロセス内でしか使えないのでは?
0134デフォルトの名無しさんNGNG
>>129
RAAで、semaphoreとかSysV IPCとか入れて探してみれば。

0135デフォルトの名無しさんNGNG
>>133
あ、勘違いスマソ。
プロセス間ね、スレッド間だと思っていた。
0136デフォルトの名無しさんNGNG
勘違いばかりなので責任感じて…

>>134さんが言っているのはたぶん、
http://www.ruby-lang.org/raa/list.rhtml?name=sysvipc
これのことでしょ。
でもプラットフォームによっては使えなさそう…。

flockもプラットフォームによるので、、まあ、UNIX系なら問題ないか。
つか、簡単に使えるのがあったら、CGIがめちゃくちゃ楽になるな〜。
0137デフォルトの名無しさんNGNG
>> 131
> リテラルがあると遅くなるのかなぁ?

構文解析結果のノードの中の文字列をそのまま使用できないので、
毎回、'hoge'文字列のコピーが行われます。
変数を使用する場合は、その変数の値の文字列が
そのまま使用されます。
0138山崎渉NGNG
(^^)
0139デフォルトの名無しさんNGNG
>>137
> 構文解析結果のノードの中の文字列をそのまま使用できないので、
> 毎回、'hoge'文字列のコピーが行われます。

補足すると、文字列自体はStringオブジェクトの間で共有されるので、
文字列のコピーというよりは、Stringオブジェクトのコピーが
毎回行われるということです。
0140デフォルトの名無しさんNGNG
arr.each{|i|...}
の|i|を省略可能にしてくれ。
0141デフォルトの名無しさんNGNG
その場合決め打ちで i になるわけ? そんなのヤだ。
0142デフォルトの名無しさんNGNG
文字列linesをファイルに書き出したいのですが
もっと簡潔に書けないでしょうか?
open("log", "w"){|f|
lines.each{|s|
f.puts s
}
}
0143デフォルトの名無しさんNGNG
>>142
f.puts lines.join("\n")
0144デフォルトの名無しさんNGNG
★http://jsweb.muvc.net/index.html★
 ★こんなサイト見つけました★
0145デフォルトの名無しさんNGNG
>>144 ブラクラ
0146デフォルトの名無しさんNGNG
>>143
joinはいらないのでは?

f.puts lines
0147デフォルトの名無しさんNGNG
IO.popenで起動したプロセスが終了したのを認識するのってどうすればいいんでしょうか?
厨な質問でスマソ
0148デフォルトの名無しさんNGNG
>>147
読み込みならそれが終わるまででいいんでないの。
書き出しなら先に終了されたらエラーになるでそ。

どうしてもやりたきゃ pid をとって waitpid。

0149デフォルトの名無しさんNGNG
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Process
0150デフォルトの名無しさんNGNG
スレ違いかもしんないですが、
Rubyで実装されたWikiを利用するとしたら、

* Tiki
* asWiki

どちらをオススメしますか? パッと見、似たような感じだけど……。
# RWikiはdaemonが必要だからちょっと敬遠。

amritaを使っているのでaswikiかなあ、とは思っているんですが、
「Tikiのほうがイイってば!」ってなポイントがあれば知りたい。
0151デフォルトの名無しさんNGNG
☆★▼▽▲△●○■□◆◇◇◆□■○●△▲▽▼★☆

今月もお小遣いすくなってきたよ・・・トホホ。
そんなあなたにこのサイト!!あなたのお小遣いを
1円でも多くして見せます!!
損はさせません!!早速アクセスをどうぞ!
↓   ↓   ↓
http://finito-web.com/kanemou/index.html

☆★▼▽▲△●○■□◆◇◇◆□■○●△▲▽▼★☆
0152デフォルトの名無しさんNGNG
>>150
Hikiっていうのもあるよ
http://www.namaraii.com/hiki/
0153デフォルトの名無しさんNGNG
>>152
tDiaryのプラグインが使えるってのがちょっと面白い。
0154デフォルトの名無しさんNGNG
>>127

合成するって、めちゃくちゃにでかい画像ファイルができそうだが。
Ruby でグラフィックを扱うなら Ruby/GD を使うのがいいよ。
0155デフォルトの名無しさんNGNG
やっとrubyがわかってきますた。
慣れたら簡単やね
0156デフォルトの名無しさんNGNG
RDのフォーマットってもうこれ以上変わらんのかな?
オブジェクト(イメージ)の埋め込みが出来てほしい
PODに乗り換えようかと思ったけど、
RDの方が分かりやすかった。
この仕様だけなんだけど。
0157デフォルトの名無しさんNGNG
>>156
もともとはテキストの為のフォーマットなので、
画像を扱うというのは考えられていないと思われ。
RWikiとかみたいに自分で拡張する分には自由でしょう。
0158デフォルトの名無しさんNGNG
>>156
まつもとさんは以前RDをこれ以上複雑にしたくない、
という趣旨の発言をしていたんで、RDという枠組みでは無理じゃないかな。
んで、拡張するのならRDという名前は捨ててくれ、ということだった。
だから、欲しいのなら君が拡張してRDじゃない名前をつけて発表すれ(w
0159牛丼うまうまNGNG
>>127
http://ha9.seikyou.ne.jp/home/sweetbasil/topography-get-from-web
rubyとは関係ないので、他スレへ。

0160デフォルトの名無しさんNGNG
名前付パイプでプロセス間通信をしようとしています。

サーバー[1] <- クライアント[多]

クライアント(送信がわ)のデータが512バイト以下であれば、
データは交じり合わない(アトミック)であるということは調べたのですが、
RubyのIOバッファはどのくらいの大きさなのでしょうか?
512バイトの書き込みをして、2回に分けて書き込みがなされることはないと
考えてもよいのでしょうか?

data = 512バイト以下のデータ
open('パイプのパス', 'w') do |f|
 while ...
  f.print data
  f.flush
 end
end

↑このようにして、手元の環境で、複数のプロセスからパイプに書き込んで、
実験したところ、データが混じりあうことは無かったのですが…
0161160NGNG
>>160
syswrite()でやればOKそうな気がするので、syswrite()でやります。
0162デフォルトの名無しさんNGNG
>>111
そういえば、以前、index を速くするパッチ投げたんですけど、
$= 見てなかったりいまいちだったんで、その後放置してたのを思い出しました。

あの頃から実装変わってるのかな?まあどうでもいいか。
0163デフォルトの名無しさんNGNG
質問です。
-------------------------------
c:/src/hello.rb(↓中身)
def hello()
print("Hello ruby.\n")
end
-------------------------------
c:/src/call.rb(↓中身)
require "hello"
hello()
-------------------------------
c:/bat/hello.bat(↓中身)
ruby c:/temp/call.rb
-------------------------------
上記のような状態で3ファイル有り、
c:/bat>hello.bat(←コマンドプロンプト)
のような状態でバッチファイルを実行するとエラーになります。
そこで次のような形でとりあえず解決しました。
-------------------------------
c:/bat/hello.bat(↓中身)
cd c:
cd temp
ruby call.rb
-------------------------------
もしこれをRubyのみで解決する場合どのようにするのが賢いでしょうか?
どうか教えてください。
よろしくお願いします。
0164デフォルトの名無しさんNGNG
>>163
いつもいつも言われることだが、エラーの中身を書け、と。
あと、ruby -vの結果も。ついでにWindows(だよな?)のバージョンも。

ついでなので、環境変数PATHの中身とrubyがインストールされている
場所も書くとなおよいだろう。
0165デフォルトの名無しさんNGNG
>>163
環境変数 RUBYLIB に hello.rb のあるディレクトリを記述しる
0166デフォルトの名無しさんNGNG
>>163
call.rbの先頭に次の一行追加する。

$:.unshift(File.dirname($0))

これで、call.rbと同じディレクトリにあるファイルを
requireするようになる。
0167デフォルトの名無しさんNGNG
>>163
hello.batの中身を
ruby -IC:/temp C:/temp/call.rb
とするか、
ruby -CC:/temp call.rb
とする。

って、結局、*.rbはC:/srcとC:/tempとどっちにあるんだよ!
0168デフォルトの名無しさんNGNG
Exerb 使って単一ファイルにすれ。
0169163NGNG
こんなまともな回答が来るとは思ってなかったので、正直ビビっております。
昨晩の時点でレス無くてあきらめてたんで、なおさらでした。

まず、 >>164-168 皆様回答ありがとうございます。

んで、回答ですが、私の求めていた形は >>166さんのものでした。
私の作った*.rbを他者が使用する場合、
各環境によってbatやPATHを変更するのがどうにも具合が悪かったためです。
たくさん回答していただきありがとうございました。ホント感激です。
2chなめててスマソ。

>>164
まず質問の書き方を知りませんでした。
以後気を付けます。

>>167さん
srcです。tempじゃ無いです。
ごめんなさい、逝ってきます…

>>168さん
Exerbの存在を知りませんでした。
こういう方法もあるのですね。
勉強になります。ありがとうございました。
0170デフォルトの名無しさんNGNG
>>162
> そういえば、以前、index を速くするパッチ投げたんですけど、
どこにあるの?
0171デフォルトの名無しさんNGNG
>>166
$0より__FILE__の方が良いかも。
0172デフォルトの名無しさんNGNG
Windows(not cygwin)でrdrt2使うとOpen3.popenでforkが実装されていないよとエラーになるのですが解決策があればおしえてください。
0173デフォルトの名無しさんNGNG
>>172
http://ruby-talk.com/60221
http://home.nownuri.net/~phasis/popen/win32_popen_1.6.8.zip
http://home.nownuri.net/~phasis/popen/win32_popen_1.8.0.zip
0174デフォルトの名無しさんNGNG
>>171
なんで?
0175166NGNG
>>174
call.rbが更に別ディレクトリにある他のスクリプトからrequireされると、
File.dirname($0)では困るからとか?
0176デフォルトの名無しさんNGNG
よいかどうかというより、意味が違う。
$0は最初に与えられたスクリプトファイル名、
__FILE__は現に実行中のファイル名(この場合はcall.rb)。
call.rbを基準にロードしたいなら、>>171のいう通りFile.dirname(__FILE__)。

はっきりいって散々外出。
0177デフォルトの名無しさんNGNG
ありがとうございます。
win32 環境で rttool を利用する手順です。

(1) rttool をインストール
(2) win32_popen をインストール
(3) rd/tree.rb:20 を以下のように書き換える
TMP_DIR = ENV["TEMP"] || ENV["TMP"] || "/tmp"
0178172 iなので2分割NGNG
(4) ~/.rd2rc の external_filterを以下のように書き換える

#pipe[0] .close だとブロックしてうまくいかなかった。。。
def external_filter (prog)
require "win32_popen"
pipe = IO.win32_popen3(prog)
pipe[0] .print self
pipe[0] .print "\C-z"
pipe[1] .read
end
(5) rt2 を実行する rt2.bat を作る
ruby %YOUR_RUBY_HOME%/bin/rt2 %*

0179デフォルトの名無しさんNGNG
すいません。すごい馬鹿なこと聞きます。

たとえば、a.txtっていうファイルを作って、
そこに I have a pen って内容を書きたかったらどうしたらいいですか?
次の様に書いたら動きませんでした。

new_file = File.new("a.txt")
new_file.print("I have a pen")
new_file.close
0180デフォルトの名無しさんNGNG
>>179
> new_file = File.new("a.txt")
open modeを省略すると"r"(読み込み)と解釈されるんで、当然書けない。
0181デフォルトの名無しさんNGNG
>>180
これで2時間悩んでました。
ありがとうございました。
0182デフォルトの名無しさんNGNG
>>178
> #pipe[0] .close だとブロックしてうまくいかなかった。。。
win32_popen3は三つのIO全部にpidをセットしてるので、どれかをcloseしよう
とすると子プロセスの終了を待ってしまう。

> def external_filter (prog)
> require "win32_popen"
> pipe = IO.win32_popen3(prog)
stderr垂れ流しでもいいんなら、1.8.0ではIO.popen(prog, "r+")でいけるよ
うになってるはず。
0183 NGNG
rubi-1.6.7で
makeの時わざとconfigure消してautoconfigしたらreadlineの所で
エラーになったんだけど、これってreadlineが古いから?(1.??使用)
ちなみに、元々入ってるConfigreで、./configre、make、make test
だと問題無い。
0184デフォルトの名無しさんNGNG
>>183
rubiの話は専用スレへ。

autoconfのバージョンとエラーの内容は?
0185デフォルトの名無しさんNGNG
mswin32版で拡張ライブラリをmakeするばあいVC++が必須なん?
0186デフォルトの名無しさんNGNG
VC++くらい買えよ
0187デフォルトの名無しさんNGNG
>>185
mingwでコンパイルできるはずだが、rbconfig.rbをいじらんと無理だろうな。
0188デフォルトの名無しさんNGNG
javaでunicodeからshiftJisへの変換ってどうやるの〜????
0189名無しさんNGNG
できません。rubyを使いましょう。

#!/usr/bin/env ruby
system('nkf -Ws #{ARGV[0]}')
0190デフォルトの名無しさんNGNG
>>188
激しくすれ違い。
java.nio.charsetパッケージのリファレンスを読んで自分で調べろ。
0191デフォルトの名無しさんNGNG
>>189
そりゃrubyでやってるとはいわんだろ。
せめてuconvかiconv
0192デフォルトの名無しさんNGNG
>>187 やっぱそうなんだ。
しょうがないのでmingw版のバイナリをもってきて、バイナリエディタでruby-mingw32.dllにリンクしている情報をmswinに書き替えちゃったよ。
0193デフォルトの名無しさんNGNG
>>192
素直にmingw版を使えばいいのにとは思うが、
1.8ではmingwとmswinは拡張ライブラリを共有できるようになってる。
0194質問スレではスルーされたNGNG
Rubyプログラミングを大学でやるらしいのですが、こちとら生まれて此の方
プログラミングなんていう高等技術をやったことがありません。
初心者Rubyプログラマーのポータルサイトなど御座いますでしょうか?
0195デフォルトの名無しさんNGNG
http://www.google.com/search?q=ruby+%93%FC%96%E5&hl=ja
0196名無しさんNGNG
>>194
教授に聞けよ。授業料払ってんだろ。
0197デフォルトの名無しさんNGNG
つーか授業でRuby使うって、島根大学?
0198デフォルトの名無しさんNGNG
>>195-197
入門って入れればいいのか・・・
何やってんだろう、ずっと初心者とかで検索してた。
すいませんでした。今度から徹底的に検索してから参ります。
0199デフォルトの名無しさんNGNG
DelphiのExtractFileExt/Pathのようなパス操作関数ってないですか?
0200デフォルトの名無しさんNGNG
ExtractFileDir: File::dirname
ExtractFileName: File::basename
ExtractFileExt: File::extname
0201MoonWolfNGNG
>>200
使ったことないけど、こんなのもある。
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/rough/lib/pathname.rb
0202デフォルトの名無しさんNGNG
hikiのソースって、まだダウンロードできないのかな?
0203デフォルトの名無しさんNGNG
まだっぽい。早く公開してくれないかねぇ。
0204デフォルトの名無しさんNGNG
2/9「変更点は以下の通り。あと、プラグイン周りを見直してページの凍結を作り込んだら細々と公開させてもらいます。 」
もうしばらく待つが吉。
0205202NGNG
文法がWardCunninghamっぽい、tDiaryの匂いがする、ってことで
ヒジョーに期待しています。
って、ここに書かないでHikiに書いたほうがいいのかもしれないが、
向こうではガイシュツだからここに書こう。

0206デフォルトの名無しさんNGNG
Hiki 良さそうですね。

ひとつだけ気になったのが、画像URLがデフォルトで<img>にされて
しまうこと。コピペしたテキストとかの中身に注意を払わないと、
含まれてた画像URLが意図せず埋め込まれちゃいそう。
0207>>HikiNGNG
あまりあれこれ機能を足さず、シンプルなまま公開してほすい
0208デフォルトの名無しさんNGNG
Windows版ってパス名をC:\RUBY\HELLO.RBみたいに指定したり
SJISのファイル名をちゃんと処理できないんですか?
0209デフォルトの名無しさんNGNG
DOSISH 対応は漸進的に進められているので 1.8-cvs を使って。
0210デフォルトの名無しさんNGNG
すみません。
つかぬことをお聞きしますが、'r+'で開いたファイルを操作する時に、
いままでそのファイルに記述してあったところの途中で、ファイルを終わらせたい場合には、
どのようにすればよいのでしょうか。
部分的に削除をしたいのです。
0211デフォルトの名無しさんNGNG
File#truncate
0212210NGNG
truncateなんてあったのですね。
なんとかできたようです。
ありがとうございました。
0213デフォルトの名無しさんNGNG
>>212
基本的に、UNIX系の標準ライブラリやシステムコールを知ってると類推できる
ことが多い。
0214デフォルトの名無しさんNGNG

オブジェクト指向っていっても、rubyのは単に .でつなぐだけでしょ?
0215デフォルトの名無しさんNGNG
>>214
そうだよ。 Perl にはそれすらできないんだってさ。
0216デフォルトの名無しさんNGNG
perlの話でもうしわけないんだけど、

日本語変換モジュールのJcodeは
Jcode->new($str, 'sjis')->euc;
みたいにできるのに
同じ作者のEncodeは
encode('euc', decode('sjis', $str));
みたいな仕様にしたのかな?
->を使ってOOっぽく見せるのはやめて
関数型でやるのがPerl的には美しいの?
0217デフォルトの名無しさんNGNG
>>216
> Jcode->new($str, 'sjis')->euc;
対応するエンコーディング名があらかじめ決まってないといけないからじゃないの。
0218デフォルトの名無しさんNGNG
あ、なんでこうしなかったかってことか。

Encode->decode($str, 'sjis')->encode('euc')
0219デフォルトの名無しさんNGNG
>>218
ですです
関数型の方が語順が英語と似るからかな。
ruby本に書いてありましたよね。
0220デフォルトの名無しさんNGNG
Jcode.pmのOO風変換インターフェイスは失敗だったと思うから、採用しなくて良かったと思う。
0221デフォルトの名無しさんNGNG
>>220
どういうとこが失敗だったと思う?
0222デフォルトの名無しさんNGNG
>>221
個々のメソッドのインターフェイスがバラバラ。
例えば、下の例の前者は問題なくて後者は実行時エラー
print Jcode->new('文字列')->h2z()->sjis();
print Jcode->new('文字列')->sjis()->h2z(); 
文字列化演算子をオーバーロードするのなら、
両方の構文をサポートしてもよかったのではないかと思うのだが。

更に、convert()のエンコーディング指定文字列も、
正式名称"EUC-JP"などを受け付けるようにしていれば、もっと便利だったはずだ。
0223デフォルトの名無しさんNGNG
>>222
なるほど。
しかしそれはOO風にしたための失敗とはいえないのでは?
0224デフォルトの名無しさんNGNG
>>223
いや、まあ、元々不満だったのは「Jcodeのインターフェイス」であって、
「OO風インターフェイス」だから不満だったわけじゃないのだ。

Encode.pmはというと、インターフェイスこそ手続き型だけど、
その実装はOO無しには語れず、ただの関数を多態的に動作させるようになってる。
にもかかわらずあえて公開OOインターフェイスを備えていないのは、
関数の方が楽だから、だと思う。これは想像だが。
Encode->find('EUC-JP')->encode($str); # タイプが面倒
Encode->encode("EUC-JP", $str); # 悪くないが、まだ長い
encode("EUC-JP", "文字列"); # 短い。楽だ。

0225デフォルトの名無しさんNGNG
スマートにコンマ区切りのCSVを処理したいのですが
どうsplitすればいいのでしょうか?
0226デフォルトの名無しさんNGNG
>>225
聞く前にRAAとかGoogleを検索しろよ。

cols = text.split(/,/)で駄目なら
http://raa.ruby-lang.org/list.rhtml?name=csv 使えば?
0227デフォルトの名無しさんNGNG
>>224
なるほどね。

> Encode->find('EUC-JP')->encode($str); # タイプが面倒
Rubyでいうと、iconvがこのスタイルだな

Iconv.new("shift_jis", "euc-jp").iconv(str)

> Encode->encode("EUC-JP", $str); # 悪くないが、まだ長い
これもあるようだが。
Iconv.iconv("shift_jis", "euc-jp", str)
0228デフォルトの名無しさんNGNG
>>227
Iconv はストリームを処理する状態機械だから str を引数に渡すのは派生だな
0229デフォルトの名無しさんNGNG
>>228
派生?
0230202NGNG
TidyみたいなライブラリのRuby実装ってご存知の方、いらっしゃいますか?
マークアップがぐちゃぐちゃなHTMLをwell-formedなXHTMLに変換してくれ
るようなものを探しています。

html-parser.rbがそうかな?と思ったんですが、
探しているのとちょっと違うような気がするんです……。


0231デフォルトの名無しさんNGNG
>>230
つい最近ruby-extにその話題が([ruby-ext:02143]から)
Ruby-TidyLib: http://arika.org/ruby/tidylib
0232デフォルトの名無しさんNGNG
htmlrepair に手を入れて使うとか。
■ このスレッドは過去ログ倉庫に格納されています