NoGoodの日記: TopThirty Nikky Kiddy #2(Code:srush.rb) 5
セキュリティや異常系への配慮をほとんど行っていないので、コードを見て使い方の判らない人には以下略なので説明しません(ぉ
最低限必要な処理だけに絞ったら今までのアレはナニっていうようなコードが残ったんですけど(AA 略
ruby じゃなくても全然おっけぇですな(苦笑
# 修行と洗練を兼ねて Perl と PHP には移植してみたい鴨~
## 直感的には w3m+sh でも逝けそうですが、AirH”からアクセスできるところに環境がないもん(とかゆ
とりあえず、以下の環境でそれなりに動作することを確認。
- 開発環境:Sarafi via ruby 1.6.8 (2002-12-24) [powerpc-darwin7.0]@Apache on Mac OS X
- 人柱環境:AirH”PHONE(J3002V) via ruby 1.8.1 (2003-12-25) [i386-mswin32]@IIS on Windows XP
Mac OS X の ruby は iBook G4 のおまけ(Developer.mpkg)、Windows XP の ruby は ActiveScriptRuby です。
だけどライセンスは www.ruby-lang.org に従うのがスジっていうか AS IS ってヤツでしょう(ぇ
# まぁいずれにせよタイーホされることはないでしょう(とかゆ
予想通り軽いし速いし。
多分、この段階のコードなら、2.3 になってもそれほど大幅な変更は不要でしょう。
つーか本家の最新日記リスト用のコードも用意すればそれが 2.3 のベースになりそうな悪寒
# あ、theme がわかんないと解析が面倒鴨新米(汗
んで、やっぱり AirH”だと /.-J の(というか多分 Adsby Google の)広告は表示できませんわ。
もう少し手を入れようと思っているトコロは、「状態を持つ」ですね。
現状では、Top30 を全件表示するのに journal.pl?op=top を三十回読みに逝く富豪な構造なので、最初に一回読んだら uids を Cookie で持たせるとか、かなぁ。
さらに富豪な解としては、三十人分の日記をキャッシュしちゃえば良いのだけど(ぉ
あと、各日記も最新の二十五エントリを全部表示する構造のままだけど、そんなに遡って読まないので、前回スクリプトを実行した時間を状態として持っておいて、この時間より新しいエントリだけ(あるいは+1エントリくらい?)を表示するとか。
これまでのプラグインとかと違って明らかに未完成なので、バージョン番号とか着けないし、そもそもこのエントリを継続使用しません(ぉ
──────────
んなわけでひとつ前(witch 姐さんの真似 (^^;
──────────
コメント直後 :
うわぁ~^Tをそのままコピペしてインデントが orz
まぁコメントからコピペして動作したので良し(悔泣
srush.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"
this = File::basename($0)
cMax = 30
cgi = CGI::new
if cgi.key?("c")
c = cgi["c"].to_s.to_i
if c < 1 or c > cMax
c = cMax
#else
# uids を状態として持つ場合には取り出し処理をココに
end
else
c = cMax
end
# uids を状態として持つ場合に分岐(未確認)
#if c >= cMax
connection = Net::HTTP.new( fqdn )
status, source = connection.get( path + queryTop + queryTandL )
latest = source.split( journalTopSeparator )
uids = CGI::unescapeHTML(latest[1]).scan(/uid=(\d+)/)
# uids を状態として持つ場合に分岐(未確認)
#end
if c > 1
this << "?c=#{c-1}"
end
uid = uids[c-1].to_s
status, source = connection.get( path + queryUser + uid + queryTandL )
puts <<EOF
Content-Type: text/html
EOF
print '<html>'
print '<head>'
print '<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">'
print '</head>'
print '<body>'
print "<a href=\"#{this}\">#{c}</a>:"
if source =~ /<title>(\w+).*の日記.*<\/title>/
print "<a href=\"http://#{fqdn}#{path}#{queryUser}#{uid}\">#{$1}(#{uid})</a>"
end
if source =~ /<div class="journal slashdotjp">(.*)<div class="journalnav">/m
list = $1.split("<div class=\"journalentry\"")
list.shift
list.each do |day|
if day =~ /<a.*class="journaltitle">(.*)<\/a>/
subject = $1
end
#if day =~ /<span.*class="journaldate">(.*)<\/span>/
# date = $1
#end
if day =~ /<span.*class="journalcomment">(<[^>]*>\d+).*<\/span>/
comment = "#{$1}</a>"
else
comment = "N/A"
end
if day =~ /<div.*class="journaltopic".*alt="(.*)" title.*<\/div>/m
topic = $1
else
topic = "N/A"
end
if day =~ /<div.*class="journaltext">(.*)/m
journal = $1.split("</div>").shift.gsub("\n","")
end
print "<hr>"
print "#{subject}<br>"
#print "#{date}[#{comment}][#{topic}]<p>"
print "[#{comment}][#{topic}]<p>"
print "#{journal}"
end
end
print '</body>'
print '</html>'
mobile ID portable_NoGood [slashdot.jp] 併用中
quick hack (スコア: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"
entryLimit = 5
this = File::basename($0)
cMax = 30
cgi = CGI::new
if cgi.key?("c")
c = cgi["c"].to_s.to_i
if c < 1 or c > cMax
c = cMax
#else
# uids を状態として持つ場合には取り出し処理をココに
end
else
c = cMax
end
# uids を状態として持つ場合に分岐(未確認)
#if c >= cMax
connection = Net::HTTP.new( fqdn )
status, source = connection.get( path + queryTop + queryTandL )
latest = source.split( journalTopSeparator )
uids = CGI::unescapeHTML(latest[1]).scan(/uid=(\d+)/)
# uids を状態として持つ場合に分岐(未確認)
#end
if c > 1
this << "?c=#{c-1}"
end
uid = uids[c-1].to_s
status, source = connection.get( path + queryUser + uid + queryTandL )
if source =~ /<title>(\w+).*の日記.*<\/title>/
nick = $1
else
nick = "N/A"
end
puts <<EOF
Content-Type: text/html
EOF
puts '<html>'
puts '<head>'
puts '<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">'
puts "<title>#{nick} の日記 (#{uid})</title>"
puts '</head>'
puts '<body>'
puts "<a href=\"#{this}\">#{c}</a>:"
puts "<a href=\"http://#{fqdn}#{path}#{queryUser}#{uid}\">#{nick}(#{uid})</a>"
if source =~ /<div class="journal slashdotjp">(.*)<div class="journalnav">/m
list = $1.split("<div class=\"journalentry\"")
if list.length > entryLimit
list = list[1, entryLimit]
end
list.each do |day|
if day =~ /<a.*class="journaltitle">(.*)<\/a>/
subject = $1
end
#if day =~ /<span.*class="journaldate">(.*)<\/span>/
# date = $1
#end
if day =~ /<span.*class="journalcomment">(<[^>]*>\d+).*<\/span>/
comment = "#{$1}</a>"
else
comment = "N/A"
end
if day =~ /<div.*class="journaltopic".*alt="(.*)" title.*<\/div>/m
topic = $1
else
topic = "N/A"
end
if day =~ /<div.*class="journaltext">(.*)/m
journal = $1.split("</div>").shift.gsub("\n","")
end
puts "<hr>"
puts "#{subject}<br>"
#puts "#{date}[#{comment}][#{topic}]<p>"
puts "[#{comment}][#{topic}]<p>"
puts "#{journal}"
end
end
puts '</body>'
puts '</html>'
mobile ID portable_NoGood [slashdot.jp] 併用中
わ~いバグ仕込み(寝ろッ (スコア:1)
なんという解り易いバグなのでしょう(苦笑
そして何故私は気が付かないのか orz
# やはり魔法としか(ぉ もぅこれ以上想定外の現象が確認されたら機能追加の際にまとめて修正ってことで(ドツボ
たまたま 4 エントリ目を投稿して下さっていた RiskTaker さんに感謝しつつ、もぅ寝ます…
mobile ID portable_NoGood [slashdot.jp] 併用中
使ってみました (スコア:1)
すごいなぁ…私も Ruby 使えるようになりたいです。
slashwatch.hn.org に置いてみたけど、cgiパラメータの解釈失敗したときとか、ながーいデータ渡されたときの挙動とか判んないので URLは内緒ってことで…(ごめんなさい)
…って、私の古い au携帯だと表示できないみたい…1ページの容量超えちゃってるかな…
今後の機能アップ期待してますー
痛いトコロを突かれてしまいました(苦笑 (スコア:1)
# いや、何にも考えてないだけッス(ぉ ソース上で改行をしていなかったり、<title> を付けてないほど送信量を抑えたコードだったので、ちょっと削りすぎ?かもしれませんね…
というわけで、早速 /.-J comment search と同程度の出力が得られるように変更してみました [srad.jp]。
また、長文の日記エントリに対応するための試みとして、entryLimit という変数を追加しました。
これを変更すると表示される日記エントリ数が増減します…って決め打ちじゃなくて、クライアント側から指定できるようにした上で、前回取得時間と端末の処理上限を加味して実際に表示するエントリ数を決定したいトコロです。
まぁ、どう実装するかを考えながらなので、ぼちぼちって感じですね。
# キリが悪いので今晩はこのへんで(とかゆ
mobile ID portable_NoGood [slashdot.jp] 併用中