フォーチュンサモナーズ
«前の日記(2003-09-10) 最新 次の日記(2003-09-12)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2003-09-11

_ [スクラップ][2ch] 野鳥観察 このエントリーを含むブックマーク

超・掲示板 2ch 内輪ネタでしかないわけで。

_ [blog] weblogUpdate の Ruby 実装 : スタンドアローンサーバ版 このエントリーを含むブックマーク

Weblogs.Com XML-RPC interface を Ruby で実装してみます。まずはスタンドアローンサーバ版です。
必要なライブラリ

ping server

#!/usr/bin/env ruby
require 'xmlrpc/server'
server = XMLRPC::Server.new(10080)
class WeblogUpdates
  def ping(name, url)
    { "flerror" => false, "message" => "Tanks for the ping" }
  end
end
server.add_handler("weblogUpdates", WeblogUpdates.new)
server.serve

ping client

#!/usr/bin/env ruby
require 'xmlrpc/client'
name = ARGV.shift
url  = ARGV.shift
connection = XMLRPC::Client.new("localhost", "/RPC2", 10080)
result =  connection.call("weblogUpdates.ping", name, url)
puts "message: " + result["message"]

実行例

$ruby ping_server.rb &
[Thu Sep 11 13:03:08 2003] HttpServer 127.0.0.1:10080 start
$ruby ping_client.rb my_blog http://www.example.com/blog/
[Thu Sep 11 13:03:47 2003] HttpServer 127.0.0.1:10080 client:40594 some.where.example.jp<127.0.0.1> connect
[Thu Sep 11 13:03:47 2003] HttpServer 127.0.0.1:10080 client:40594 disconnect
message: Tanks for the ping

_ [blog] weblogUpdate の Ruby 実装 : CGI 版 このエントリーを含むブックマーク

XMLRPC::Server の代わりに XMLRPC::CGIServer を使います。

ping server

#!/usr/bin/env ruby
require 'xmlrpc/server'
server = XMLRPC::CGIServer.new
class WeblogUpdates
  def ping(name, url)
    { "flerror" => false, "message" => "Tanks for the ping" }
  end
end
server.add_handler("weblogUpdates", WeblogUpdates.new)
server.serve

ping client

XMLRPC::Client.new(host, path, port) の引数を変えるだけです。
#!/usr/bin/env ruby
require 'xmlrpc/client'
name = "MyBlog"
url  = "http://www.example.com/blog/"
connection = XMLRPC::Client.new("localhost", "/cgi-bin/ping_server.cgi", 80)
result =  connection.call("weblogUpdates.ping", name, url)
puts "message: " + result["message"]

_ [blog] Weblogs.Com changes.xml を Ruby で料理する一例 このエントリーを含むブックマーク

NDO::Weblog さんの Weblogs.Com changes.xml を Perl で料理する一例 の Ruby 版です。ローカルに changes.xml を用意して実行すると、更新時刻とWeblog名のリストを吐きます。REXML::StreamParser の使い方があっているのか怪しいですが。Ruby 1.8.0 以上でどうぞ。
必要なライブラリ
require 'rexml/document'
require 'rexml/streamlistener'
 
module WeblogUpdates
  class Handler
    include REXML::StreamListener
    attr_reader :weblog_updates
    
    def tag_start(name, attrs)
      case name
      when "weblogUpdates"
	@weblog_updates = WeblogUpdates.new(attrs["version"], attrs["updated"], attrs["count"].to_i)
      when "weblog"
	weblog = Weblog.new(attrs["name"], attrs["url"], attrs["when"].to_i)
	@weblog_updates.add(weblog)
      end
    end
  end
  
  class Parser
    def self.parse(xml_source)
      parser = Parser.new
      parser.parse(xml_source)
    end
    
    def parse(xml_source)
      handler = Handler.new
      REXML::Document.parse_stream(xml_source, handler)
      handler.weblog_updates
    end
  end
  
  
  class WeblogUpdates
    include Enumerable
    
    def self.load(filename)
      Parser.parse(File.new(filename))
    end
    
    def self.create(xml_source)
      Parser.parse(xml_source)
    end
    
    attr_accessor :version, :updated, :count, :weblogs
    def initialize(version=nil, updated=nil, count=nil)
      @version = version
      @updated = updated
      @count = count
      @weblogs = []
    end
    
    def add(weblog)
      @weblogs << weblog
    end
    
    def each
      @weblogs.each do |weblog|
	yield weblog
      end
    end
    
    def save(filename)
      File.open(filename, 'w') do |f|
	f.puts(self.to_s)
      end
    end
    
    def to_s
      str =<<-_XML_
<?xml version="1.0"?>
      _XML_
      str << self.to_xml
    end
    
    def to_xml
      str =<<-_XML_
<weblogUpdates version="#{@version}" updated="#{@updated}" count="#{@count}">
      _XML_
      @weblogs.each do |weblog|
	str << weblog.to_xml
      end
      str << "</weblogUpdates>\n"
    end
  end
  
  
  class Weblog
    attr_accessor :name, :url, :when
    def initialize(name=nil, url=nil, _when=nil)
      @name = name
      @url = url
      @when = _when
    end
    
    def to_s
      to_xml
    end
    
    def to_xml
      <<-_XML_
	<weblog name="#{@name}" url="#{@url}" when="#{@when}"/>
      _XML_
    end
  end
  
end
 
# -- demo
if __FILE__ == $0
  require 'time'
  
  weblog_updates = WeblogUpdates::WeblogUpdates.load("changes.xml")
  updated = Time.rfc822(weblog_updates.updated)
  weblog_updates.each do |weblog|
    date = updated - weblog.when
    name = weblog.name
    puts "#{date.strftime('%m/%d/%y %H:%M:%S')}\t#{name}"
  end
end
[]

最近のコメント:

  1. 僕ドラえもん (11-23)
  2. 長谷部隼 あべし (11-23)
  3. だて (09-30)

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).