Ruby Tips

Author: satoshiokita

DATE:2008/03/12 TIME:18:08:32 JST

Contents

01_connecct_postgresql741

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

Return Contents

020_dbm_access

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()

Return Contents

021_dbm_access

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

Return Contents

03_cgi_escape

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)

Return Contents

04_rdoc

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

Return Contents

051_http_client

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

Return Contents

05_http

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

Return Contents

06_blog_trackback_client

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

Return Contents

07_blog_trackback_server

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

Return Contents

08_use_profiler

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)

Return Contents

09_timestamp

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


Return Contents

10_performance_mon

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

Return Contents

11_printenv

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;"

Return Contents

12_mail

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
}

Return Contents

13_generate_random_data

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

Return Contents

mysql

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

Return Contents

mysql_crud

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

Return Contents

tback

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

Return Contents

tback_test

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")

Return Contents