2007-06-12
■ [Ruby/SDL][idea] 位置決め
ゲーム製作において、キャラクタや文字の位置を決めるのが結構めんどい。「ちょっと座標をいじって再実行」とかさ。
GUIビルダみたいな感じで位置を検討できると便利そうだ。
■ [Ruby/SDL][idea] デバッガ
スライドに書き忘れたんだけどHSPは実行時に変数の内容とか別ウィンドウに表示できて便利だった覚えがあります。
最近local_variablesというメソッドを知ったので、Rubyでも(黒魔術を駆使すれば)実装できそうな予感。
■ [ruby] あるURLからフィードを見つけてくれるライブラリ、FeedDiscover
例のOPMLを作るときにいちいちフィードのURLを探すのが面倒だったので、rubyforgeからそれっぽい (PerlのFeed::Findみたいな)ライブラリを探してみました。
FeedDiscoverを使うと、あるURLのHTMLを解析してフィードのURLを見つけてくれます。
インストールは gem install feed_discover で。
長所
使い方が超簡単なところ。
require 'rubygems'
require 'feed_discover'
fd = FeedDiscover.new('http://bbc.co.uk/')
fd.feeds #=> ["http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml"]
fd.feed #=> feeds[0]といっしょ
fd.feeds? #=> !feeds.empty?といっしょ
短所
- 遅い(パーサのせい?)
- たまにフィードを見つけられない
- たまにHTMLがパースできなくて落ちる
Hpricotベースになるといいなぁ。
■ [ruby][memo] eachで回してるときの次の要素がほしい
ary.each do |item| ... end
みたいな定番のループで、itemの次の要素や前の要素が欲しくなることってないかい?
こういう時はだいたい下のようにインデックスを使うようにするんだけど、もっと簡単な方法はないかな。
(0..ary.size).each do |i| prev = item[i-1] succ = item[i+1] end
隣り合う要素を2つずつ…ってことは隙あらばinjectか?
ary.inject([]){|sum, item|
...
}
いやいや、injectは「ある要素」と「そこまでの結果」を扱うメソッドだからあんまり向いてないよな。
prevやsuccが暗黙的に束縛されるようなメソッドを(Rubyレベルで)実装できないだろうか。
ary.each_with_prevsucc do |item| p [prev, item, succ] end
(追記:いろいろな解決案が寄せられています。
- http://mono.kmc.gr.jp/~yhara/d/?date=20070612#c01
- http://mono.kmc.gr.jp/~yhara/d/?date=20070612#c02
- http://mono.kmc.gr.jp/~yhara/d/?date=20070612#c03
- http://d.hatena.ne.jp/odz/20070612
- http://shinh.skr.jp/m/?date=20070613#p01
- http://d.hatena.ne.jp/ku-ma-me/20070613/p2
- http://d.hatena.ne.jp/ku-ma-me/20070614/p1
- http://d.hatena.ne.jp/niha/20070613
- http://d.hatena.ne.jp/ha-tan/20070613/1181759059
- http://d.hatena.ne.jp/sumim/20070614/p1
- http://d.hatena.ne.jp/kaitoh/20070614
- http://d.hatena.ne.jp/xtalco/20070616#1181848684
- http://d.hatena.ne.jp/oto-oto-oto/20070119/1169283285#c
ありがとうございます。あとでまとめるかも。)
■ [ruby] SimpleOPML
RubyでOPMLファイルを生成するクラスを作ってみました。
OPMLはもともと文書のアウトラインを記述するフォーマットとして作られた そうなのですが、今ではなぜかRSSのリストを記述するのに使われているようです。
OPMLファイルの仕様に関しては以下のサイトが参考になります。
require 'cgi'
require 'time'
require 'kconv'
require 'rubygems'
require 'hpricot'
require 'open-uri'
class SimpleOPML
Site = Struct.new(:url, :rss, :title)
def initialize(title)
@title = title
@sites = []
end
def add(url, rss, title=nil)
title = get_title(url) if title.nil?
@sites << Site.new(url, rss, title)
end
def get_title(url)
doc = Hpricot(open(url).read)
if (title = doc % :title)
title.inner_html
else
""
end
end
def to_s
<<EOD
<?xml version="1.0" encoding="utf-8"?>
<opml version="1.0">
<head>
<title>#{CGI.escapeHTML @title}</title>
<dateCreated>#{Time.now.rfc822}</dateCreated>
<ownerName />
</head>
<body>
<outline text="Subscriptions">
#{@sites.map{|s| site_to_outline(s)}}
</outline>
</body>
</opml>
EOD
end
def site_to_outline(site)
%!<outline title="#{CGI.escapeHTML site.title.toutf8}" htmlUrl="#{CGI.escapeHTML site.url}" text="#{CGI.escapeHTML site.title.toutf8}" type="rss" xmlUrl="#{CGI.escapeHTML site.rss}" />\n!
end
end
#---- example
opml = SimpleOPML.new("RubyKaigi2007 Speakers & Staffs")
File.read("sites.txt").each do |line|
url, feed = line.split /\t/
opml.add(url, feed)
end
puts opml
そういうときは zip かな
そこで Enumerable::Enumerator#{each|enum}_cons ですよ!<br>>> (0..9).each_cons(3){|x| p x}<br>[0, 1, 2]<br>[1, 2, 3]<br>...<br>[7, 8, 9]<br>#=> nil<br>……って、先頭と末尾の処理が面倒かも。<br><br>つ http://jp.rubyist.net/magazine/?0011-BundledLibraries
なんとなく誰も言ってないのは、理由があるのかわかりませんが、each_with_indexで十分じゃないかと思っております。