NoGoodの日記: TopThirty Nikky Kiddy #4(Code:rookie.rb) 1
日記 by
NoGood
Cookie を使って状態を保持するようにした。
さらに、HTTP_USER_AGENT を参照して、AH-J3002V の時のみ 5KB を超える部分の日記エントリは表示しないようにした。
# ココは各自端末毎の UA & データサイズに変更されたし。
さらに、HTTP_USER_AGENT を参照して、AH-J3002V の時のみ 5KB を超える部分の日記エントリは表示しないようにした。
# ココは各自端末毎の UA & データサイズに変更されたし。
Cookie に記録しているのは、ある時点の Top30 における最新エントリまでの uid リスト(rookie_uids)と、その時点での最新エントリが保存された日時(rookie_last)の二つ。
Top30 を再度取得した場合、保持している最新エントリ時間よりも新しい日記エントリだけを uid リストに追加するようにしてある。
従って、Top30 を再度取得した場合に、古い方に既読分のエントリが残っていてもパスされる。
とりあえず、これでパケット量の観測を実施するので、少なくともロジックの変更や機能の追加は当面無し。
# でもブラウザの限界までっていうのはなんとかしたいなぁ…
rookie.rb (スコア:1)
require 'net/http'
require 'cgi'
fqdn = "slashdot.jp"
path = "/journal.pl"
queryTop = "?op=top"
queryUser = "?op=display&uid="
queryTandL = "&theme=slashdotjp&light=1"
journalTopSeparator = "ID 58, journaltop"
now = Time::now
limit = now + 60 * 60 * 24 * 365
$counter = 0
$output_limit = 0
if ENV["HTTP_USER_AGENT"] =~ /AH-J3002V/
# </body>\n</html> の分を考慮してあります。
$output_limit = 50 * 1024 - 15
end
def cntprint(string)
flag = false
counter = $counter + string.length
if $output_limit < 1 || counter < $output_limit
$counter = $counter + string.length
print string
flag = true
end
return flag
end
cgi = CGI::new
if cgi.cookies.key?("rookie_last")
rookie_last = cgi.cookies["rookie_last"]
(year, month, day, hour, min) = rookie_last.value
lastreadtime = Time::local(year, month, day, hour, min)
else
rookie_last = CGI::Cookie::new
rookie_last.name = "rookie_last"
lastreadtime = Time::at(0)
rookie_last.value = lastreadtime.strftime("%Y,%m,%d,%H,%M").split(",")
rookie_last.expires = limit
end
if cgi.cookies.key?("rookie_uids")
rookie_uids = cgi.cookies["rookie_uids"]
uids = rookie_uids.value
else
rookie_uids = CGI::Cookie::new
rookie_uids.name = "rookie_uids"
rookie_uids.value = []
rookie_uids.expires = limit
uids = []
end
if uids.length < 1
connection = Net::HTTP.new( fqdn )
status, source = connection.get( path + queryTop + queryTandL )
latest = source.split( journalTopSeparator )
uidlist = latest[1].split("<\/TR>")
uidlist.shift
uidlist.each do |uidentry|
tdlist = uidentry.split("<\/TD>")
if tdlist[0] =~ /uid=(\d+)/
uid = $1
if tdlist[2] =~/(\d+)月(\d+)日.*(\d+):(\d+).*([AP]M)/
month = $1
day = $2
hour = $3
min = $4
if $5 =~ /PM/
hour = hour.to_i + 12
end
entrytime = Time::local(now.strftime("%Y"), month, day, hour, min)
if entrytime > now
year = now.strftime("%y").to_i - 1
entrytime = Time::local(year, month, day, hour, min)
end
mobile ID portable_NoGood [slashdot.jp] 併用中