Author: satoshiokita
DATE:2008/03/12 TIME:18:08:32 JST
fliename: 01_connecct_postgresql741.rb
require 'postgres'
#conn = PGconn.connect("127.0.0.1", 5432, "", "", "test", "postgres", "postgres")
# conn = PGconn.connect("127.0.0.1", 5432, "", "", "test", "testman", "testman")
conn = PGconn.connect("localhost", 5432, "", "", "test", "testman", "testman")
res = conn.exec("select * from aaa;")
p res
fliename: 020_dbm_access.rb
#!/usr/local/bin/ruby
#
# reference.
# http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=DBM
#
require 'dbm'
# stacic method.
# create 'test_db' Berkley DB file in current directory.
#
# flag is Ruby 1.8.2 fuature
# DBM::READER -- open read only
# DBM::WRITER -- cannot create database and open grant privilege of read/write.
# DBM::WRCREAT -- if database is not exist, this create it and r/w.
# DBM::NEWDB -- if same name database was exist, destroy and new create it.
#
d = DBM.open('test_db',0666,DBM::WRCREAT);
# insert
d["insert test key1"]="value1"
d["insert test key2"]="hoge2"
d["insert test key3"]="fuga3"
# select
p d.size
p d["insert test key1"]
# delete
d.delete("insert test key3")
p d.size
# question?
p d.empty?
p d.has_key?("aaa")
p d.has_value?("bbb")
# get all keys
keyArrays = d.keys
p keyArrays.class
keyArrays.each { |i|
print i , "\n"
}
# get all values
keyValues = d.values
p keyValues.class
keyValues.each { |i|
print i , "\n"
}
# one element delete and pop.
p d.shift
p d.size
# all clear
d["test key7"]="value1"
d["test key8"]="hoge2"
d["test key9"]="fuga3"
p d.size
d.clear
p d.size
d.close()
fliename: 021_dbm_access.rb
#!/usr/local/bin/ruby
require 'dbm'
$connect = DBM.open('test2_db', 0666, DBM::WRCREAT)
$connect['comment01'] = "hello comment test"
p $connect['comment01']
$connect.close
fliename: 03_cgi_escape.rb
#!/usr/local/bin/ruby
# escape
require 'cgi'
# escape space, '/' and '&'
escaped_value = CGI.escape("HELLO WORLD 123/246___&___")
print escaped_value , "\n"
unescaped_value = CGI.unescape(escaped_value)
print unescaped_value , "\n"
p CGI.escape("\r\n")
p CGI.escape("\r")
p v2 = CGI.escape("&")
p CGI.unescape(v2)
p v2 = CGI.escape("aa&bb")
p CGI.unescape(v2)
p v2 = CGI.escape("\"&")
p CGI.unescape(v2)
p v2 = CGI.escape(">gt;")
p CGI.unescape(v2)
p v3 = CGI.escapeHTML(">gt;")
p CGI.unescapeHTML(v3)
fliename: 04_rdoc.rb
#!/usr/local/bin/ruby
#
# = List.
#
# == Order List.
#
# 1. list sample [ num + period ]
# 1. list sample [ this generate html of '2. list sample' ]
#
# == Unorder List.
#
# * unorder list
# * unorder list 2
#
# == Description List.
#
# [ruby] description ilst aka lavel list.
# [+ruby+] red
#
# == Description List with Markup.
#
# ruby::http://www.oklab.org
# +ruby+::
# http://www.oklab.org (if List is long, you can write next line)
#
# = Headline
# == Headline
# === Headline
# ==== Headline
# ===== Headline
# ====== Headline
# ========= Headline (samle html of gt; tag)
#
# = gt;
# ---
#
# = other
#
# _italic
#
# *bold*
#
# +typewriter+
#
# above only alphabetic code so follow use other language.
# gt;Japanesegt;
# gt;Japanesegt;
# gt;Japanesegt;
#
# = Auto Link
# rdoc automatically link to calss name , source file and method name in comments.
# * 04_rdoc.rb -- sourcefile name.
# * HelloRdoc -- class name.
# * HelloRdoc#printHello -- method name.
#
# = Skip
#-- this mark skip begin.
#
# skip!!
#
#++ this mark skip end.
#
# Author:: satoshiokita gt;
# Copyright:: Copyright (c) 2005 satoshiokita
# License:: Free
#
# Hello Rdoc is sample Ruby script for Rdoc tool.
class HelloRdoc
#
# print message of "hello world".
#
def printHello
print "hello world\n"
end
#
# print message.
#
def printMessage(message)
print message, "\n"
end
end
obj = HelloRdoc.new
obj.printHello
#
# Get current executing data for Debug.
#
class CurrentPrinter
#
# get current method, classname, and source line number
# by built-in function.
#
def getCurrent(message)
print caller.first, message, "\n"
end
#
# print current method, classname, ant source line number
# initialized data of argument is null string.
#
def printTest(message = "")
getCurrent message
end
end
obj2 = CurrentPrinter.new
obj2.printTest("HOGE")
obj2.printTest
fliename: 051_http_client.rb
#!/usr/local/bin/ruby
require 'net/http'
# Ruby1.6$B$H(BRuby1.7$B$+$i$N%i%$%V%i%j$N
fliename: 05_http.rb
#!/usr/local/bin/ruby
require 'net/http'
#
# $B%j%U%!%l%s%9(B
# http://www.ruby-lang.org/ja/man/?cmd=view;name=Net%3A%3AHTTPRequest;em=http
#
# www.oklab.org/index.html$B$X(BHTTP$B%j%/%(%9%H$rAw?.$7$F%l%9%]%s%9$rJV$7$F$b$i$&(B
# $B%5%s%W%k(B.
#
http = Net::HTTP.new('www.oklab.org', 80)
reqObj = Net::HTTP::Get.new('/index.html')
res = http.request(reqObj)
#p res.class
print res.body
fliename: 06_blog_trackback_client.rb
#!/usr/local/bin/ruby
#
# Trackback CLIENT.
#
#
require 'net/http'
# IN. url
# OUT. Trackback Ping URL
def discover_trackbacks(dc_identifier = "")
return "" if (dc_identifier == nil || dc_identifier == "")
dc_identifier = dc_identifier.gsub(/\n/,'')
ip_domain = ""
request_url = ""
dc_identifier.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
=begin --DEBUG--
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
=end
ip_domain = "#{$3}"
request_url = "#{$4}"
}
http = Net::HTTP.new(ip_domain,80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
if (res.code != 200.to_s)
return res
end
content = res.body
$KCODE='u'
#/[gt;$/m # the 'm' option sign multilines.
# /gt;/m # the 'm' option sign multilines.
# content = content.gsub(/\n/,' ')
=begin ???
content.grep(
/gt;/m
) { |buff|
p buff
}
=end
#
contentAry = content.split(/\n+/)
for item in contentAry
# tag header.
if ( item =~ /gt;','')
else
result = nil
end
elsif ( item =~ /.*gt;/ )
#p item
end
return result if ( result != nil )
end
end
def requestTrackbackPingURL(tb_ping_url = "")
return nil if (tb_ping_url == "")
ip_domain = ""
request_url = ""
tb_ping_url.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
ip_domain = "#{$3}"
request_url = "#{$4}"
}
#p ip_domain
#p request_url
http = Net::HTTP.new(ip_domain, 80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
print res.body
end
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
# p tb_ping_url
requestTrackbackPingURL(tb_ping_url)
=begin
"http://www.oklab.org/cgi-bin/OkiBlog.cgi#5".grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
}
=end
fliename: 07_blog_trackback_server.rb
#!/usr/bin/ruby
# トラックバック・サーバ
# [ Trackback Technical Specification 1.1 Japanese ]
# http://lowlife.jp/yasusii/stories/8.html#sending%20a%20trackback%20ping
#
# トラックバックPingとは何か?
# あなたの記事に対するリンクがある記事を書きましたということを、そのサーバが
# 自動的に(プログラミング)で通知してくる。そこで、私の記事にも、あなたの記事
# でリンクされましたということを私のサーバで自動的に(プログラミング)受信して
# Webサイトを更新する。この自動的に私のサーバが「あなたの記事が私の記事にリンク
# されていることを私のWebサイトを更新して情報を残しておきます」という逆リンク
# をトラックバックと呼ぶ。
#
# 機能概要
# 1) クライアントからのトラックバックPing URL受信
#
# ex) http://www.foo.com/mt-tb.cgi/5
#
# この場合、5をトラックバックIDと呼ぶ.
# return REQUEST_SCCESS | REQUEST_FAILURE
#
# 2) 対象のサーバから、トラックバックPingの一覧を受信する.
# [[[疑問]]]
# (RSS形式で出力の事? Trackback Technical Specification 1.1 Japaneseには
# 詳しく書いていない。ブログの実装によっては、1つのコンテンツに対して複数の
# 記事情報があり、それを一覧で返すという事か?
# とりあえずは、RSS形式で値を返すように実装してみる.
#
# (クライアント機能)
# 単純に、1)で受けたトラックバックPing URLに対して、受信したサーバが
# クライアントとなり、GETリクエストを送信する.その時?__mode=rssを付加する.
#
# ex) GET http://myserver/mt-tb.cgi/5?__mode=rss
#
# 成功時対象のサーバは、以下のようなデータを返す.
=begin
gt;
gt;
gt;0gt;
gt;gt;
gt;TrackBack Testgt;
gt;http://this.is/the/trackback/item/link/gt;
gt;Description of the TrackBack itemgt;
gt;en-usgt;
gt;
gt;TrackBack Demogt;
gt;http://this.is/the/permalink/gt;
gt;Excerptgt;
gt;
gt;
gt;gt;
=end
# つまり、トラックバック・サーバを実装するのであれば、不特定のトラックバッククライアント
# から、トラックバックPingの一覧を受信するGETリクエストがきた場合、上記のXMLデータを
# 返さなければならない.
#
# 3) トラックバックPing URLの自動検知
# 不特定多数のトラックバッククライアントが、トラックバックPing URLをこのサーバに送るに
# は、何らかの方法でトラックバックPing URLが分からなければならない。そのためには
# 記事(ブログエントリ)内に、RDFを埋め込む必要がある。
#
# つまり、トラックバック・クライアントを実装するには、ブログエントリを検索してRDFを
# 読み取る機能を実装しなければならない.
#
#
# クライアントのトラックバックPing URLを送信するまでの流れ
# [Client] [Blog Server]
# 1. | HTTP GET によるコンテンツ取得REQUEST ------------------>gt;|
# | gt; |
# | gt;
gt;gt;0gt;gt;
RS_HEREDOC
#
# トラックバックPingURLを受信した時の失敗時の応答ステータス
#
$REQUEST_FAILURE = gt;
gt;
gt;1gt;gt;gt;
gt;
RF_HEREDOC
#
# Trackback CLIENT.
#
#
require 'net/http'
# IN. url
# OUT. Trackback Ping URL
def discover_trackbacks(dc_identifier = "")
return "" if (dc_identifier == nil || dc_identifier == "")
dc_identifier = dc_identifier.gsub(/\n/,'')
ip_domain = ""
request_url = ""
dc_identifier.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
=begin --DEBUG--
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
=end
ip_domain = "#{$3}"
request_url = "#{$4}"
}
http = Net::HTTP.new(ip_domain,80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
if (res.code != 200.to_s)
return res
end
content = res.body
$KCODE='u'
#/[gt;$/m # the 'm' option sign multilines.
# /gt;/m # the 'm' option sign multilines.
# content = content.gsub(/\n/,' ')
=begin ???
content.grep(
/gt;/m
) { |buff|
p buff
}
=end
# $BB?J,!">gt;e5-$O(Bgrep$B$GJ#?t9T$r%Q!gt;','')
else
result = nil
end
elsif ( item =~ /.*gt;/ )
#p item
end
return result if ( result != nil )
end
end
def requestTrackbackPingURL(tb_ping_url = "")
return nil if (tb_ping_url == "")
ip_domain = ""
request_url = ""
tb_ping_url.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
ip_domain = "#{$3}"
request_url = "#{$4}"
}
#p ip_domain
#p request_url
http = Net::HTTP.new(ip_domain, 80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
print res.body
end
# CLIENT MODE TEST
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
p tb_ping_url
# requestTrackbackPingURL(tb_ping_url)
#
# SERVER MODE SERVICES
#
$CONTENT_TYPE = "Content-Type: text/html; charset=utf-8\r\n\r\n"
def print_rss(tb_ping_url)
p "HOGE"
#open RSSFeed file and close it.
rssfeed_xml_fname = "/usr/local/apache2/htdocs/OkiBlog_rss.xml"
rss_fp = File.open(rssfeed_xml_fname, "r")
rssfeed_xml_ary = rss_fp.readlines
rss_fp.close
flag_data = FALSE
string_buff = ""
for rssdata in rssfeed_xml_ary
if (rssdata =~ /gt;(.*)gt;/ )
flag_data = TRUE
end
# parse
if (flag_data)
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_title = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ ) # primary key.
rss_link = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_desc = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_date = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ ) # guid isPermaLink="true"
rss_guid = "#{$2}"
end
end
end
trackback_mode_rss = gt;
gt;
gt;0gt;
gt;gt;
gt;TrackBack Testgt;
gt;http://this.is/the/trackback/item/link/gt;
gt;Description of the TrackBack itemgt;
gt;en-usgt;
gt;
gt;#{rss_title}gt;
gt;#{rss_link}gt;
gt;#{rss_desc}gt;
gt;
gt;
gt;gt;
TRACKBACK_MODE_RSS
print trackback_mode_rss
end
def receive_tb_url(tb_ping_url = "")
rcode = 0
if (tb_ping_url != "" && tb_ping_url != nil)
# check request parameter
flag_is_list = FALSE
tb_ping_url.grep(
/((http:\/\/)(.*?)(\/.*?)(\?.*))/
) { |b|
p "$5= #{$5}"
if ( "?__mode=rss" == "#{$5}".gsub(" ",""))
flag_is_list = TRUE
end
}
begin
print_rss(tb_ping_url) if (flag_is_list)
return
rescue RuntimeError =>gt; evar
print $CONTENT_TYPE
print $REQUEST_FAILURE
rcode = 1
return
end
# TODO write trackback data to a textfile or a dbm.
# and I have to append the blog program to filter of trackback list.
# when a exception occured, execute handling and error process.
#
begin
# DEBUG CODE.
# Exception Test code.
# raise "Exception!"
# append trackback list.
# TODO codec.
tbl_fname = "tbl.txt"
fp = File.open(tbl_fname, "a")
fp.puts(tb_ping_url)
fp.close()
rescue RuntimeError =>gt; evar
# exception
print $CONTENT_TYPE
print $REQUEST_FAILURE
rcode = 1
else
print $CONTENT_TYPE
print $REQUEST_SUCCESS
end
end
return rcode
end
# SERVER TEST
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
p tb_ping_url
p receive_tb_url(tb_ping_url)
# SERVER MODE TEST
p receive_tb_url("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0?__mode=rss")
=begin
"http://www.oklab.org/cgi-bin/OkiBlog.cgi#5".grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
}
=end
fliename: 08_use_profiler.rb
#!/usr/local/bin/ruby
#
# $ ruby -r profile ./08_use_profiler.rb
#
require "profiler"
Profiler__.start_profile
fp = File.open("test_profile.txt", "a+")
Profiler__.print_profile(fp)
#Profiler__.print_profile(STDIN)
fliename: 09_timestamp.rb
#!/usr/local/bin/ruby
#
# Time$B%*%V%8%'%/%H$+$i;~4V$rgt;.$5$$IC?t$rgt;l9g$O(BTime$B%*%V%8%'%/%H$r;H$C$?$[$&$,NI$$$h$&$@(B.
#
#
require 'date'
begin_datetime = DateTime.new
sleep(1)
end_datetime = DateTime.new
diff_datetime = end_datetime - begin_datetime
p diff_datetime.to_f
fliename: 10_performance_mon.rb
#!/usr/local/bin/ruby
#
# $Id: 10_performance_mon.rb 1365 2006-03-02 03:26:57Z s-okita $
# Author:: satoshiokita gt;
# $Rev: 1365 $ $Date: 2006-03-02 12:26:57 +0900 (木, 02 3 2006) $
#
class PT
@@begin_time = Time.new
@@fp_pt = File.open("pt.txt", "a+")
def self.get_begin_time
return @@begin_time
end
def self.diff
return Time.new - PT.get_begin_time
end
def self.p_diff(message = "")
@@fp_pt.puts(message)
@@fp_pt.puts(Time.new - PT.get_begin_time)
@@fp_pt.flush
end
def self.close
@@fp_pt.close
end
end
p PT.get_begin_time
PT.p_diff("hoge")
PT.close
fliename: 11_printenv.rb
#!/usr/local/bin/ruby
#
# http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=ENV
#
require 'cgi'
cgi = CGI.new
env = ENV
print "Content-Type: text/html;"
print "\n\n"
print "gt;gt;"
ENV.each_pair { |key, value|
print "gt;#{key} = #{value}gt;"
}
print "gt;gt;"
fliename: 12_mail.rb
#!/usr/local/bin/ruby
# Reference
# http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fsmtp
require 'net/smtp'
smtp_server_host = "bc.wakwak.com"
smtp_server_port = 25
Net::SMTP.start(smtp_server_host, smtp_server_port) { |smtp|
smtp.send_mail gt;
To: satoshiokita gt;
Subject: Hello Ruby Mail World!!
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: gt;
X-Mailer: HOGE!!!
X-Sender: FUGA!!!
hello world!
HEREDOC
}
fliename: 13_generate_random_data.rb
#!/usr/local/bin/ruby
require 'date'
#
#= ランダムデータをCSV出力するクラス.
# シーケンス,ランダム文字列,日付[日付]...]を1レコードとした、複数レコードを生成して、
# CSV形式ファイルに出力するクラス.
#
#Authors:: satoshiokitagt;
#Version:: 1.0 $Rev: 2049 $
#Copyright:: 無料・無償
#License:: なし
#
class GenerateRandomData
@@version_info = "$Id: 13_generate_random_data.rb 2049 2008-03-12 09:08:01Z s-okita $"
attr_accessor :outputStream
# このプログラムの情報出力.
def self.printInfo
p @@version_info
end
# ランダムな数値を返す.
def genRandamNum(length = 10)
src = (0..9).to_a
dest= ""
length.times {
dest += src[rand(src.size)].to_s
}
return dest
end
# ランダムなAlphaNumを返す.
def genRandamChar(length = 50)
src = ("a".."z").to_a + ("A".."Z").to_a + (0..9).to_a# + ["_","-","."]
dest= ""
length.times {
dest += src[rand(src.size)].to_s
}
return dest
end
# シーケンスと、出力ストリームの初期化.
def initialize()
@sequence_cnt = 0
@outputStream = STDOUT
end
@sequence_cnt
# シーケンスの生成.
# データベースではプライマリキーなどにシーケンシャルデータを利用する場合が多いので
# シーケンシャルデータを生成したい場合に利用する.
def sequence()
@sequence_cnt += 1
return sprintf("%010d", @sequence_cnt)
end
# CSV生成.
# 例) method(365, 5, 3)
# 今日から遡って365日分で、一日あたり、5件のレコードを出力する.
# また、レコードには、3カラム分、Timestamp型が存在する.
# この場合、1レコードは、[シーケンス,ランダム文字列,日時,日時,日時]となる.
#
def generateOneYearData(days_count = 5, oneDayReportAll = 5, columnSize = 7)
days_count.downto(0) {|i|
daybefore = (DateTime.now - i) # 365日前.
#p daybefore.to_s
# 1日のデータは150件.
aboutOneSec = 0.00002
0.upto(oneDayReportAll) {|i|
tmpDateTime = daybefore + aboutOneSec
#p tmpDateTime.to_s
# 1レコードにカンマ区切りでcolumnSize分,日時を生成.
tmpStr = ""
1.upto(columnSize + 1) { |z|
comma = ","
comma = "" if (columnSize + 1) == z
tmpStr = tmpStr + sequence + "," + genRandamChar + "," + (fmt(tmpDateTime + aboutOneSec * z) + comma)
}
outputStream.puts tmpStr
aboutOneSec += 0.00002
}
}
end
# SQLのTimestamp型(Oracle9iのDate型)での文字列出力フォーマット.
def fmt(obj)
return obj.strftime("%Y.%m.%d %H:%M:%S")
end
end
outputFileName = $0.upcase + "_" + DateTime.now.strftime("%Y%m%d_%H%M%S") + ".csv"
puts "writing to " + outputFileName
fo = File.open(outputFileName,"w",0666)
instance = GenerateRandomData.new
instance.outputStream = fo;
instance.generateOneYearData(5, 5, 7)
fo.close
fliename: mysql.rb
#!/usr/local/bin/ruby -w
require "mysql"
dbname = "railsdb"
m = Mysql.new("localhost", "satoshiokita", "satoshiokita")
m.select_db(dbname)
result = m.query("select * from articles")
fields = result.fetch_fields
fields.each do |field|
puts field.name
puts field.type
puts field.def
puts field.length
puts field.table
puts field
end
m.close
fliename: mysql_crud.rb
#!/usr/local/bin/ruby -w
require 'date'
require "mysql"
# fetch sample
#fields = result.fetch_fields
#fields.each do |field|
# print field.name, "|", field, "\n"
# puts field.type
# puts field.def
# puts field.length
# puts field.table
#
# MySQLのカラムにauto_increment属性をつけた場合、NULLで増加できる。
# 初期値を入れたい場合はNULLを設定する.
def insert_article(title = "", content = "")
db = Mysql.new("localhost", "satoshiokita", "satoshiokita")
db.select_db("railsdb")
stmt = "insert into articles values (NULL,1, '",title,"','",content,"',NULL,NULL,'0',NULL,NULL)"
db.query(stmt.to_s)
db.commit
db.close
end
def update_article(content = "")
db = Mysql.new("localhost", "satoshiokita", "satoshiokita")
db.select_db("railsdb")
upd_ts = gen_timestamp()
stmt = "update articles set content = '", content, "',",
"upd_date = '", upd_ts, "',",
"sys_upd_date = '", upd_ts, "'"
db.query(stmt.to_s)
db.commit
db.close
end
def delete_article(article_id)
db = Mysql.new("localhost", "satoshiokita", "satoshiokita")
db.select_db("railsdb")
stmt = "delete from articles where id = " , article_id
db.query(stmt.to_s)
db.commit
db.close
end
def select_articles()
db = Mysql.new("localhost", "satoshiokita", "satoshiokita")
db.select_db("railsdb")
stmt = "select title, content, reg_date from articles"
rs = db.query(stmt.to_s)
rs.each { |row|
puts row.join("\t")
}
db.close
end
# MySQL 4.1用フォーマット用の日付時刻を生成する.
# ex) 2006-07-04 18:20:00
def gen_timestamp()
return DateTime.now().strftime("%Y-%m-%d %H:%M:%S")
end
# RFC822形式のフォーマットの日付を生成する.
# ex) Wed, 30 Nov 2005 22:07:01 +0900
def gen_timestamp_rfc822()
return DateTime.now().strftime("%a, %e %b %Y %H:%M:%S %z")
end
# テストコード
insert_article("aaa","bbb")
update_article("ccc")
select_articles()
delete_article(1)
puts gen_timestamp
fliename: tback.rb
#!/usr/bin/ruby
#
# TODO
# * ドメインやファイルに依存しているので外部から初期化を行うようにする。
# * この場合、クラスで実装し、初期化コンストラクタを持たせたほうが良いかもしれない.
# * 関数のみでは、初期化を強制する契約を明記してもユーザが行わない可能性がある.
#
##########################################################################################
# トラックバック・サーバ仕様
#
# [ Trackback Technical Specification 1.1 Japanese ]
# http://lowlife.jp/yasusii/stories/8.html#sending%20a%20trackback%20ping
#
# トラックバックPingとは何か?
# あなたの記事に対するリンクがある記事を書きましたということを、そのサーバが
# 自動的に(プログラミング)で通知してくる。そこで、私の記事にも、あなたの記事
# でリンクされましたということを私のサーバで自動的に(プログラミング)受信して
# Webサイトを更新する。この自動的に私のサーバが「あなたの記事が私の記事にリンク
# されていることを私のWebサイトを更新して情報を残しておきます」という逆リンク
# をトラックバックと呼ぶ。
#
# 機能概要
# 1) クライアントからのトラックバックPing URL受信
#
# ex) http://www.foo.com/mt-tb.cgi/5
#
# この場合、5をトラックバックIDと呼ぶ.
# return REQUEST_SCCESS | REQUEST_FAILURE
#
# 2) 対象のサーバから、トラックバックPingの一覧を受信する.
# [[[疑問]]]
# (RSS形式で出力の事? Trackback Technical Specification 1.1 Japaneseには
# 詳しく書いていない。ブログの実装によっては、1つのコンテンツに対して複数の
# 記事情報があり、それを一覧で返すという事か?
# とりあえずは、RSS形式で値を返すように実装してみる.
#
# (クライアント機能)
# 単純に、1)で受けたトラックバックPing URLに対して、受信したサーバが
# クライアントとなり、GETリクエストを送信する.その時?__mode=rssを付加する.
#
# ex) GET http://myserver/mt-tb.cgi/5?__mode=rss
#
# 成功時対象のサーバは、以下のようなデータを返す.
=begin
gt;
gt;
gt;0gt;
gt;gt;
gt;TrackBack Testgt;
gt;http://this.is/the/trackback/item/link/gt;
gt;Description of the TrackBack itemgt;
gt;en-usgt;
gt;
gt;TrackBack Demogt;
gt;http://this.is/the/permalink/gt;
gt;Excerptgt;
gt;
gt;
gt;gt;
=end
# つまり、トラックバック・サーバを実装するのであれば、不特定のトラックバッククライアント
# から、トラックバックPingの一覧を受信するGETリクエストがきた場合、上記のXMLデータを
# 返さなければならない.
#
# 3) トラックバックPing URLの自動検知
# 不特定多数のトラックバッククライアントが、トラックバックPing URLをこのサーバに送るに
# は、何らかの方法でトラックバックPing URLが分からなければならない。そのためには
# 記事(ブログエントリ)内に、RDFを埋め込む必要がある。
#
# つまり、トラックバック・クライアントを実装するには、ブログエントリを検索してRDFを
# 読み取る機能を実装しなければならない.
#
#
# クライアントのトラックバックPing URLを送信するまでの流れ
# [Client] [Blog Server]
# 1. | HTTP GET によるコンテンツ取得REQUEST ------------------>gt;|
# | gt; |
# | gt;
gt;gt;0gt;gt;
RS_HEREDOC
#
# トラックバックPingURLを受信した時の失敗時の応答ステータス
#
$REQUEST_FAILURE = gt;
gt;
gt;1gt;gt;gt;
gt;
RF_HEREDOC
#
# トラックバックPing URLの自動検知
# 引数を元に対象のアドレスにHTTPリクエストを送信しRDFのdc:identifier属性が
# 存在した場合、その記事のtrackback:ping属性を参照し、トラックバックPing URL
# を検知し返す.失敗時はnilを返す.
#
# ex)
=begin
#!/usr/local/bin/ruby
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
p tb_ping_url
=end
#
def discover_trackbacks(dc_identifier = "")
return "" if (dc_identifier == nil || dc_identifier == "")
dc_identifier = dc_identifier.gsub(/\n/,'')
ip_domain = ""
request_url = ""
dc_identifier.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
=begin --DEBUG--
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
=end
ip_domain = "#{$3}"
request_url = "#{$4}"
}
http = Net::HTTP.new(ip_domain,80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
if (res.code != 200.to_s)
return res
end
content = res.body
contentAry = content.split(/\n+/)
for item in contentAry
# tag header.
if ( item =~ /gt;','')
else
result = nil
end
elsif ( item =~ /.*gt;/ )
#p item
end
return result if ( result != nil )
end
end
#
# トラックバックPing URLを引数に対象のURLへHTTPリクエストを送信し
# そのコンテンツボディを取得する.現状は通常のHTTPリクエストと同等なので
# URLを指定すれば、そのコンテンツボディを取得する.失敗時は
# Ruby言語のnetライブラリのエラーコードを返す.
#
def requestTrackbackPingURL(tb_ping_url = "")
return nil if (tb_ping_url == "")
ip_domain = ""
request_url = ""
tb_ping_url.grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
ip_domain = "#{$3}"
request_url = "#{$4}"
}
#p ip_domain
#p request_url
http = Net::HTTP.new(ip_domain, 80)
req = Net::HTTP::Get.new(request_url)
res = http.request(req)
print res.body
end
#
# SERVER MODE SERVICES
#
$CONTENT_TYPE = "Content-Type: text/html; charset=utf-8\r\n\r\n"
#
# トラックバックサーバは仕様により、トラックバックPing URLの
# HTTPリクエスト・パラメータに__mode=rssが含まれている場合は、
# RSS形式のレスポンスを返さなければならない。そのRSS形式の出力
# を行う.現在は、RSS0.91形式のみ標準出力に出力する.
#
#
def print_rss(tb_ping_url, rssfeedxml_fname)
#open RSSFeed file and close it.
rss_fp = File.open(rssfeedxml_fname, "r")
rssfeed_xml_ary = rss_fp.readlines
rss_fp.close
flag_data = FALSE
string_buff = ""
for rssdata in rssfeed_xml_ary
if (rssdata =~ /gt;(.*)gt;/ )
flag_data = TRUE
end
# parse
if (flag_data)
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_title = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ ) # primary key.
rss_link = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_desc = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ )
rss_date = "#{$1}"
end
if ( rssdata =~ /gt;(.*?)gt;/ ) # guid isPermaLink="true"
rss_guid = "#{$2}"
end
end
end
trackback_mode_rss = gt;
gt;
gt;0gt;
gt;gt;
gt;TrackBack Testgt;
gt;http://this.is/the/trackback/item/link/gt;
gt;Description of the TrackBack itemgt;
gt;en-usgt;
gt;
gt;#{rss_title}gt;
gt;#{rss_link}gt;
gt;#{rss_desc}gt;
gt;
gt;
gt;gt;
TRACKBACK_MODE_RSS
print trackback_mode_rss
end
#
# トラックバックPing URLの処理を行う.
# もし、トラックバックPing URLを正常に正常に処理が出来た場合は、
# XML形式の成功文字列の応答を標準出力に出力する。失敗時には、
# XML形式の失敗文字列の応答を標準出力に出力する。
# もしトラックバックPing URLのHTTPリクエストに__mode=rssパラメータが
# 付加されている場合は、RSS形式の応答を標準出力に出力する.
#
# rssfeed_xml_fname = "/usr/local/apache2/htdocs/OkiBlog_rss.xml"
#
def receive_tb_url(tb_ping_url = "", rssfeedxml_fname = "", tbl_fname = "")
rcode = 0
if (tb_ping_url != "" && tb_ping_url != nil)
# check request parameter
flag_is_list = FALSE
tb_ping_url.grep(
/((http:\/\/)(.*?)(\/.*?)(\?.*))/
) { |b|
# DEBUG
# p "$5= #{$5}"
if ( "?__mode=rss" == "#{$5}".gsub(" ",""))
flag_is_list = TRUE
end
}
begin
print_rss(tb_ping_url, rssfeedxml_fname) if (flag_is_list)
return
rescue RuntimeError =>gt; evar
print $CONTENT_TYPE
print $REQUEST_FAILURE
rcode = 1
return
end
# TODO write trackback data to a textfile or a dbm.
# and I have to append the blog program to filter of trackback list.
# when a exception occured, execute handling and error process.
#
begin
# DEBUG CODE.
# Exception Test code.
# raise "Exception!"
# append trackback list.
# TODO codec.
fp = File.open(tbl_fname, "a")
fp.puts(tb_ping_url)
fp.close()
rescue RuntimeError =>gt; evar
# exception
print $CONTENT_TYPE
print $REQUEST_FAILURE
rcode = 1
else
print $CONTENT_TYPE
print $REQUEST_SUCCESS
end
end
return rcode
end
=begin
"http://www.oklab.org/cgi-bin/OkiBlog.cgi#5".grep(
/((http:\/\/)(.*?)(\/.*))/
) { |b|
p "#{$1}"
p "#{$2}"
p "#{$3}"
p "#{$4}"
}
=end
fliename: tback_test.rb
#!/usr/local/bin/ruby
require 'tback'
# CLIENT MODE TEST
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
p tb_ping_url
# requestTrackbackPingURL(tb_ping_url)
# SERVER TEST
tb_ping_url = discover_trackbacks("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0")
p tb_ping_url
p receive_tb_url(tb_ping_url)
# SERVER MODE TEST
p receive_tb_url("http://www.oklab.org/cgi-bin/OkiBlog.cgi#0?__mode=rss", "/usr/local/apache2/htdocs/OkiBlog_rss.xml", "tbl.txt")