トップ «前の日記(2007-06-11) 最新 次の日記(2007-06-13)» 編集

Route 477



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を見つけてくれます。

ドキュメント
http://feed-discover.rubyforge.org/
プロジェクトページ
http://rubyforge.org/projects/feed-discover/

インストールは 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?といっしょ

短所

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

(追記:いろいろな解決案が寄せられています。

ありがとうございます。あとでまとめるかも。)

[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
本日のツッコミ(全3件) [ツッコミを入れる]
ohai (2007-06-13 00:25)

そういうときは zip かな

nov (2007-06-13 08:21)

そこで 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

takkanm (2007-06-14 22:02)

なんとなく誰も言ってないのは、理由があるのかわかりませんが、each_with_indexで十分じゃないかと思っております。