Ruby 初心者スレッド Part 23
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/11/20(木) 04:30:21【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.7 の使用をお勧めします】
※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
1.9 の新機能の一部が利用可能なので初学者にお勧めです。
※ただし十分安定しているとは言えないので
プロダクション環境での利用にはお勧めしません。
関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0893デフォルトの名無しさん
2008/12/28(日) 14:31:060894デフォルトの名無しさん
2008/12/28(日) 14:31:360895デフォルトの名無しさん
2008/12/28(日) 14:33:07COBOLを調べるために本を買う気もないし
図書館まで行く気はもないw
0896ばかでもわかるようにかかないと…
2008/12/28(日) 14:35:270897デフォルトの名無しさん
2008/12/28(日) 14:36:36ソースの存在を認めるかどうかは、それを自分で確かめたから言えることだろ。
本当ならソースを出されたら自分で確かめないといけない。
俺はどうでもいいから放置だけど。
だれかが(この場合>>881)が「ソースはこれ」って言っただけで信じる人は
ものわかりがよすぎですね。
0898デフォルトの名無しさん
2008/12/28(日) 14:38:150899デフォルトの名無しさん
2008/12/28(日) 14:46:02<a><b><c>ふがふが</c></b></a>
<a><b>ほげふが</b></a>
こんな感じのコンテキストがあったとして
<c>ノード要素がある<a>ノード要素を選択したいときのXPath(REXML)がわからんのです。
’//c'とするとノードが<c>ふがふが</c>となるのですが
<a><b><c>ふがふが</c></b></a>となって欲しい。
'a[name()="c"]'としてもダメみたいで。(cノードを含むaノード、のつもり)
REXMLというよりXPathの質問みたいですが,よろしくどうぞ。
0900デフォルトの名無しさん
2008/12/28(日) 14:48:15> 自分で確かめないといけない。
それだからこそ「ご苦労なこと」はソースの存在の可否に関係ないじゃん。
0901デフォルトの名無しさん
2008/12/28(日) 15:43:26いまさらこれをどうにかできるものではありません。
それならば、むしろ精一杯「成功」して、
後に続くオープンソース開発者の模範あるいは
ロールモデルになろうと思うようになりました。
「オープンソースをやっていても食べていけるんだ」
とか、
「オープンソースを仕事にして幸せそうだ」
とかいうありさまを見せることもわたしの使命の1つなのでしょう。
きっと。
0902デフォルトの名無しさん
2008/12/28(日) 16:06:06やってみたんだけどね
require 'rexml/document'
xml = '<x>
<a><b>ほげほげ</b></a>
<a><b><c>ふがふが</c></b></a>
<a><b>ほげふが</b></a>
</x>'
doc = REXML::Document.new(xml)
puts doc.elements['x/a[.//c]'] # <a><b><c>ふがふが</c></b></a>
puts doc.elements['x/a[//c]'] # <a><b>ほげほげ</b></a>
puts doc.elements['//a[.//c]'] # <a><b><c>ふがふが</c></b></a>
puts doc.elements['//a[descendant::c]'] # <a><b><c>ふがふが</c></b></a>
puts doc.elements['//a[Descendant::c]'] # nil
なやましす
0903デフォルトの名無しさん
2008/12/28(日) 17:10:23これが正解じゃまいか?
0904デフォルトの名無しさん
2008/12/28(日) 17:28:41なのかな。XPathの文法見たらどうもそれっぽい
ttp://www.doraneko.org/xml/xpath10/19991116/Overview.html#axes
たまにREXML使うと間違いなく細かいところではまるんだよなあ
XPathにしろ文法に合致してないんなら例外吐いてくれるとうれしいのに
0905デフォルトの名無しさん
2008/12/28(日) 20:54:57Windows上では問題ないのにサーバにアップロードして実行すると
文字化けしてしまいます。
何か足りないものがあるのでしょうか?
現状:
CentOS
Ruby 1.8
Rmagick 2.8
imageimgickはjpeg,png,zlibのライブラリとともにインストール。
ghostscript8.63をあとから追加
ソース
img1 =Magick::ImageList.new("back.jpg")
dr = Magick::Draw.new
dr.pointsize = 12
dr.fill = "#000000"
dr.font = "/usr/local/rails/test/config/test.ttc"
dr.gravity = Magick::CenterGravity
dr.annotate(img1, 0, 0, 0, 0, "テスト")
0906デフォルトの名無しさん
2008/12/28(日) 21:05:24表示する日本語が表示ロケールと合ってないに一票
0907デフォルトの名無しさん
2008/12/28(日) 22:55:43"テスト" はスクリプトファイルの文字エンコードで送られるはず
Windowsで動いてたってんならたぶんShiftJISだろうから、ShiftJISのテストという文字送られて化けてるだけだろう
0908デフォルトの名無しさん
2008/12/29(月) 00:48:38ソースファイルの文字コードはUTF-8です。
あと、渡す文字列のところを
NKF.nkf("-e","テスト")
とNKF.nkf("-s","テスト")にして
試してみたのですが化け方が変わるだけでした。
0909デフォルトの名無しさん
2008/12/29(月) 03:18:45$KCODE = 'u'
requireq 'jcode'
直る保障はないが、日本語の扱いは基本これ入れておくと無難だと思うわ。
0910デフォルトの名無しさん
2008/12/29(月) 03:19:33require 'jcode'
0911デフォルトの名無しさん
2008/12/29(月) 04:03:160912デフォルトの名無しさん
2008/12/29(月) 04:06:110913デフォルトの名無しさん
2008/12/29(月) 06:57:550914デフォルトの名無しさん
2008/12/29(月) 06:58:11jcodeとrmagickが何するライブラリか調べてからまた来い
0915デフォルトの名無しさん
2008/12/29(月) 07:38:240916デフォルトの名無しさん
2008/12/29(月) 07:43:050917デフォルトの名無しさん
2008/12/29(月) 11:22:20日本語使えるよ。以下のコードでちゃんと合成できた。
CentOS5.1
Ruby1.8.7-p72
スクリプトはUTF-8で保存。
フォントはWindowsXPからMSゴシック持ってきた。
require 'rubygems'
require 'RMagick'
img1 = Magick::ImageList.new("back.jpg")
dr = Magick::Draw.new
dr.pointsize = 12
dr.fill = "#000000"
dr.font = "./MSgothic.ttf"
dr.gravity = Magick::CenterGravity
dr.annotate(img1, 0, 0, 0, 0, "テスト")
File.open("./back01.jpg", "w"){|f|
f.binmode
f.print img1.to_blob{quality = 95}
}
0918デフォルトの名無しさん
2008/12/29(月) 11:43:590919デフォルトの名無しさん
2008/12/29(月) 13:19:59awk '!dup[$0]++ {print $0}'
0920デフォルトの名無しさん
2008/12/29(月) 15:50:29for (1..5, 10..15) {
print;
}
Rubyではどう書くのですか?
(1..5, 10..15).each do |i|
puts i
end
0921デフォルトの名無しさん
2008/12/29(月) 16:00:10つflatten
0922デフォルトの名無しさん
2008/12/29(月) 16:04:25書けない
範囲オブジェクトは加算も追加もできないから、配列にして連結するしかないな
((1..5).to_a+(10..15).to_a).each do |n|
puts n
end
0923デフォルトの名無しさん
2008/12/29(月) 16:06:32他にもあるだろうけど、俺にすぐ思いつくのは
((1..5).to_a+(10..15).to_a).each{ |j|
puts j
}
0924デフォルトの名無しさん
2008/12/29(月) 16:16:26�d
この場合のflattenの使い方がちょっとわかりませんが、一旦、配列に戻すんすね
0925デフォルトの名無しさん
2008/12/29(月) 16:27:57あと、RangeとArrayには関連性はないから「戻す」という表現は好ましくないがまあどうでもいいや
0926デフォルトの名無しさん
2008/12/29(月) 16:31:52ruby1.8
([*1..5] + [*5..10]).each {|i| puts i}
ruby1.9
[*1..5, *10..15].each {|i| puts i}
0927デフォルトの名無しさん
2008/12/29(月) 16:40:130928デフォルトの名無しさん
2008/12/29(月) 16:51:15やっぱ、flattenを使うところではないんですか。
戻すでなく変換っすね。
>>926
おー、簡潔でいいです。
0929デフォルトの名無しさん
2008/12/29(月) 16:54:45引数* は全く簡潔じゃないよ
perlをやっているならコードが短いことと簡潔性には関連がないことは知ってるはず
0930デフォルトの名無しさん
2008/12/29(月) 17:02:26[1..5, 10..15].each do |r|
r.each do |i|
puts i
end
end
配列中にRangeと数値が混在しているなら
Rangeじゃないのものは配列に変換しちゃう
[1,3, 7..9, 13..15, 20].each do |r|
r = [r] unless Range === r
r.each do |i|
puts i
end
end
0931デフォルトの名無しさん
2008/12/29(月) 17:06:29def range_flatten(arg)
result = []
arg.each{|e| result += Range === e ? e.to_a : [e] }
result
end
range_flatten([1,3,7..9,13..15,20]).each do |i|
puts i
end
いっそ配列中のRangeを展開しつつ回すイテレーターにもしちゃう(少メモリ)
def range_flatten(arg)
if block_given?
arg.each do |r|
r = [r] unless Range === r
r.each {|i| yield i }
end
arg
else
result = []
arg.each{|e| result += Range === e ? e.to_a : [e] }
result
end
end
range_flatten([1,3,7..9,13..15,20]) do |i|
puts i
end
0932デフォルトの名無しさん
2008/12/29(月) 17:12:42module Enumerable
def depth_1st_each(&block)
each {|e| e.respond_to?(:depth_1st_each) ? e.depth_1st_each(&block) : yield(e) }
end
end
StringがEnumerableな1.8系だと不幸が起こるなぁ。
0933デフォルトの名無しさん
2008/12/29(月) 18:10:32挙動もかわってしまった。
require 'hpricot'
require 'nokogiri'
src = '<r>
<a>ほげ</a>
<a>ふが</a>
</r>'
doc = Hpricot(src)
node = doc.search('//a')[0]
puts node #-><a>ほげ</a>
puts node.next_sibling #-><a>ふが</a>
doc = Nokogiri(src)
node = doc.search('//a')[1]
puts node #-><a>ほげ</a>
puts node.next_sibling.to_s[0] #-> ¥n
みたいな違いが出ます。Nokogiriのほうが見栄えを良くするための
改行文字(空白文字)も正しくパースしているからだと
思うのですが,Hpricotの振る舞いの方が便利なこともある。
ソースを変更できないので質問なんですが,
Nokogiriで空白文字を無視する方法を知りませんか?
(何が必要な空白文字で,何が不要な空白文字かの判断は難しいですが,それはそれとして)
要するに,'<r><a>ほげ</a><a>ふが</a></r>'と解釈して読み込んでほしい。
0934933
2008/12/29(月) 18:30:11スクリプトでなくて。念のため。
0935デフォルトの名無しさん
2008/12/29(月) 18:51:51俺の環境だと
0要素目はきちんと <a>ほげ</a>
1要素目はきちんと <a>ふが</a>
を返すぞ
文字エンコードがまずいんだと思う
素の Nokogiri は UTF-8 しか読まないから、
事前に変換するか、Nokogiri.parse の第3引数にHTMLやXMLの文字コードを表すiconvな文字列を指定してみ
第2引数は nil でいい
0936デフォルトの名無しさん
2008/12/29(月) 20:33:02�d
よく見てみます
0937933
2008/12/29(月) 20:45:46Nokogiriのほうの
node = doc.search('//a')[1]
ではなくて
node = doc.search('//a')[0]
です。
比較対象用のコードに誤りがあれば検証できませんよね。
念のため環境はruby 1.8.7 (2008-08-11 patchlevel 72) [powerpc-darwin7]です。
一応doc = Nokogiri(src, nil, 'UTF-8')にもしてみましたが,結果は同じでした。
HpricotとNokogiriでのnode.next_siblingの結果が,
同じ,<a>ふが</a>になればいいのですが...
ということでよろしくお願いします。
0938デフォルトの名無しさん
2008/12/29(月) 21:17:02うーん。
ttp://d.hatena.ne.jp/kitamomonga/20081229/ruby_difference_nokogiri_hpricot#nokogiri_4th_arg
動作原理は不明な上に他のHTMLではなんか動作しないんだけど、parseの第4引数に整数 2401 を指定してみ。
libxml2 の HTML_PARSE_NOBLANKS が有効になる。
require 'hpricot'
require 'nokogiri'
src = '<r>
<a>ほげ</a>
<a>ふが</a>
</r>'
p Nokogiri(src).search('//a')[0].next_sibling
p Nokogiri(src, nil, nil, 2401).search('//a')[0].next_sibling
結果:
←改行\n
<a>ふが</a>
0939デフォルトの名無しさん
2008/12/29(月) 21:27:540940デフォルトの名無しさん
2008/12/29(月) 21:50:02…メソッド定義を直に書き換えちゃうのが簡単だと思う…。
>>939
agent.post_connect_hooks に params[:response_body].gsub! なProc オブジェクト登録すれば動くかも
でもそれだと本文部分の改行も全部消えちゃいそうだな
agent.get(uri)
agent.page.body = Nokogiri.parse(agent.page.body, nil, nil, 2401).to_s
なら2度手間だけどなんとかなる?
0941デフォルトの名無しさん
2008/12/30(火) 12:41:570942デフォルトの名無しさん
2008/12/30(火) 12:51:520943デフォルトの名無しさん
2008/12/30(火) 12:52:220944デフォルトの名無しさん
2008/12/30(火) 13:26:370945デフォルトの名無しさん
2008/12/30(火) 14:16:30合点
0946デフォルトの名無しさん
2008/12/30(火) 14:32:360947デフォルトの名無しさん
2008/12/30(火) 14:50:04それはもっともらしいけど、本当?
awk由来だけど、たとえばgrepはedコマンドの
g/RE/pをそのまま読んだわけで、なんかの略というわけではない。
gsubはedならg//s/RE/Replacement/ってところ(ちょっと無理があるが)
だろうが、ほんとにglobal substitutionの略だろうか?
0948デフォルトの名無しさん
2008/12/30(火) 14:57:58フラグのgがglobalであること、s///がsubstitutionであることなどから推し量れば、
global substitutionが妥当だが、作者がそう言ったという根拠がなければ信用したく
ないなら、そういうスタンスもありなんでしょうね。どうでもいい話ではあるが。
0949デフォルトの名無しさん
2008/12/30(火) 15:09:27http://oreilly.com/catalog/unixnut3/chapter/ch11.html
この本での説明が
gsub(r, s [, t])
Globally substitute s for each match of the regular expression r
in the string t. If t is not supplied, defaults to $0.
Return the number of substitutions. {N}
なので、これ以外をこじつけるのは無意味。
0950デフォルトの名無しさん
2008/12/30(火) 17:42:51>g/RE/pをそのまま読んだわけで、なんかの略というわけではない。
global reguler expression print の略ですが
0951デフォルトの名無しさん
2008/12/30(火) 17:45:350952デフォルトの名無しさん
2008/12/30(火) 17:58:43それは無理矢理だ。
0953デフォルトの名無しさん
2008/12/30(火) 22:05:110954デフォルトの名無しさん
2008/12/30(火) 22:07:360955デフォルトの名無しさん
2008/12/30(火) 22:42:59print の p 以外の方が、使用頻度が高い。
:g/RE/y A
y は yank の略、A はバッファー a に追加
:g/RE/d
d は delete の略
:g/RE/s/^/#/
s は substitution の略
RE のある行の行頭に # を挿入
0956デフォルトの名無しさん
2008/12/31(水) 01:06:13gがglobalの略で、全行選択の意味。
REがRegular Expression
pがprintの略で、表示だ。
それぞれ独立の要素であって、一体としてGlobal Regular Expression Printの
略なわけではない。英語になってないし。
0957デフォルトの名無しさん
2008/12/31(水) 01:38:14>>953
0958デフォルトの名無しさん
2008/12/31(水) 06:35:33マニュアルのほうが後付け。
0959デフォルトの名無しさん
2008/12/31(水) 07:00:43一般には「RFC=インターネット世界の標準的な規格書」という認識が広まっているが
RFCは日本語では「コメント募集」の意味であり、もともとは技術仕様を公開し、
それについての意見を広く募集してより良いものにしていく観点から始められたようである。
そもそもインターネットにおける規格を記述する文書に『Request For Comments』、
日本語に訳すと「ご意見お待ちしています」という名前が付けられているのは、
冷静に考えてみるとかなり変な話だ。
最初は「ただのメモ書きや提案」程度の意味合いしか持たなかったRFCだが、
その性質は今もある程度引き継いでいる。
今まで規格として紹介してきたRFCも、正確にはRFCの中でも『STANDARD』として
認められたものであり、決して「RFC=正式な規格書」というわけではない。
むしろRFCとは「インターネットを理解する上で役立つとIETF
(もしくはRFC編集グループ)が認めた文書」程度の意味合いしかない、
と考えた方がよい。
RFCは全て英語で書かれることが必須条件となっているため、
IT業界に籍を置きRFCを読まなければならないような立場になると、
RFCの表現をどう実装すればいいのか頭を悩ませることが少なくない。
そんなときは気分転換がてら、これらのジョークRFCを読んで頭を休ませるとか、
あるいは腕に覚えのある人ならジョークRFCを本当に実装してしまうなんていうのもおもしろいのではないか。
0960デフォルトの名無しさん
2008/12/31(水) 07:02:410961デフォルトの名無しさん
2008/12/31(水) 10:54:350962デフォルトの名無しさん
2008/12/31(水) 12:38:09問い合わせを受けたことがあるそうな。
0963デフォルトの名無しさん
2008/12/31(水) 13:02:57結果が2008-12-20になるんです。
年月日の部分を分解して組み立て直すしかないのでしょうか?
明治以降の和暦<->西暦ぐらいならライブラリがあっても良さそうなのですが。
0964デフォルトの名無しさん
2008/12/31(水) 13:14:13court(法廷)はもともと「囲まれた庭」という意味だから(以下略)
0965デフォルトの名無しさん
2008/12/31(水) 13:22:26NENGO = { "平成" => 1989 }
m = (/(.+?)(\d{1,2})年(\d{1,2})月(\d{1,2})日/).match "平成20年12月31日"
y = NENGO[m[1]] + m[2].to_i - 1
p [y, m[3], m[4]].join("-")
こんなんでどう?
0966デフォルトの名無しさん
2008/12/31(水) 13:26:42rubyforge.org/projects/jadtfmt/
ICUのラッパだから裏方の作りは問題ないはず。
0967デフォルトの名無しさん
2008/12/31(水) 13:28:16NENGO吹いたwwwww
0968966
2008/12/31(水) 13:35:210969デフォルトの名無しさん
2008/12/31(水) 13:40:29.NETだと、System.Globalization.JapaneseCalendar
(前者はJRuby、後者はIronRubyで使えるかなー?)
どちらも明治以降の太陽暦しか扱えないので、Rubyでは是非とも
それ以前の元号と太陰暦のサポートを。
0970デフォルトの名無しさん
2008/12/31(水) 13:43:510971963
2008/12/31(水) 13:46:53>>966
ぱっとみただけだと西暦->和暦の一方通行だけなのかな?
で自己レスですが,Dateクラスを斜め読みしていたら,
self._parse_jisというクラスメソッドがあった。
MTSHの和暦->西暦だったらパースできるみたいです。
なので「平成年月日」の漢字部分をそれなりに置き換えたあとに
パースすればいいみたい...
(でもそれぐらいなら,はじめから組み込んでくれればいいのだが、こーどのもんだいがあるのかもしれない,,,1.9.1に期待)
0972デフォルトの名無しさん
2008/12/31(水) 14:04:43明治5年12月3日が1872年12月3日になった。
(明治5年12月2日の翌日は明治6年1月1日なので、1873年1月1日のはず)
JavaのCalendarはこのへん妙に凝ってた気がするんだが……
こういう改暦の境界って扱いがめんどくさそうだな。
0973デフォルトの名無しさん
2008/12/31(水) 14:08:020974デフォルトの名無しさん
2008/12/31(水) 14:29:16Javaの影すらなかった時代からあるのにな...
jlessとかjawkとかいっぱいあるのに。外国人の日本認識なんてそんなものか。
0975デフォルトの名無しさん
2008/12/31(水) 14:39:20知るわけがないだろ
0976デフォルトの名無しさん
2008/12/31(水) 14:53:480977デフォルトの名無しさん
2008/12/31(水) 15:08:53ジャストタイミングでJRuby作者が、Iokeとかいうのを作ったみたいw
Ioke 0 released | Ola Bini: Programming Language Synchronicity
http://olabini.com/blog/2008/12/ioke-0-released/
0978デフォルトの名無しさん
2008/12/31(水) 15:18:56ttp://homepage1.nifty.com/gyouseinet/history/nengouichiran.htm
ユリウス暦-グレゴリオ暦の変換とかも必要なのかな
0979デフォルトの名無しさん
2008/12/31(水) 17:12:10明治以降限定で割り切るのが楽かね。(それでも改暦が1回あるが)
0980デフォルトの名無しさん
2008/12/31(水) 18:02:460981デフォルトの名無しさん
2008/12/31(水) 18:22:36すげくねっといわれても
暗黙の機能の多さの違いとしか
awk "!dup[$0]++ {print}"
perl -ne "print if!$dup{$_}++"
ruby -e "puts readlines.uniq"
もしくは
ruby -ne "BEGIN{$dup=Hash.new 0};print if 2>$dup[$_]+=1"
awkから引き継いだフリップフロップ演算子なんて
ワンライナー以外で使うことがあるのかしら
awk "/^=begin/,/^=end/{print}
perl -ne "print if /^=begin/../^=end/"
ruby -ne "print if /^=begin/../^=end/"
0982デフォルトの名無しさん
2008/12/31(水) 18:50:010983デフォルトの名無しさん
2008/12/31(水) 22:15:160984デフォルトの名無しさん
2008/12/31(水) 22:40:55書きかけの文書が多いの?
http://www.ruby-lang.org/ja/man/html/Ruby_A5EAA5D5A5A1A5ECA5F3A5B9A5DEA5CBA5E5A5A2A5EB.html
本買ってね、ということなの?
0985デフォルトの名無しさん
2008/12/31(水) 23:06:43http://doc.loveruby.net/refm/api/view/index
ライブラリの網羅率は、
今年の夏には5割で「来年の夏には終わる」とか言われてたから
たぶん今頃は7割ぐらい?
0986デフォルトの名無しさん
2008/12/31(水) 23:25:49そう思ったらあなたが書き足せば良いんですよ
っていうスタンス
0987デフォルトの名無しさん
2008/12/31(水) 23:54:21RWiki重すぎで静的HTMLになっちゃたっんだよねぇ。
0988デフォルトの名無しさん
2008/12/31(水) 23:55:52本がどうとかいう以前に、「ソース嫁」と思っている。
0989 【大吉】
2009/01/01(木) 00:15:500990 【大凶】 >>1000に 【564円】 あげます。
2009/01/01(木) 00:21:43今年もよろしくね!
0992 【大吉】
2009/01/01(木) 00:57:37レス数が950を超えています。1000を超えると書き込みができなくなります。