パスワードを忘れた? アカウント作成
614077 journal

NoGoodの日記: TopThirty Nikky Kiddy #2(Code:srush.rb) 5

日記 by NoGood
昨日思索機能試作。
セキュリティや異常系への配慮をほとんど行っていないので、コードを見て使い方の判らない人には以下略なので説明しません(ぉ

最低限必要な処理だけに絞ったら今までのアレはナニっていうようなコードが残ったんですけど(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
まぁコメントからコピペして動作したので良し(悔泣

──────────
↓前次↑

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • #!/usr/bin/ruby
    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] 併用中
    • #!/usr/bin/ruby
      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] 併用中
      親コメント
      • list.shift を省いちゃうと、日記エントリの総数が entryLimit 以下の場合に…
        なんという解り易いバグなのでしょう(苦笑
        そして何故私は気が付かないのか orz
        # やはり魔法としか(ぉ
        if list.length > entryLimit
          list = list[1, entryLimit]
        ──────────
        else
          list.shift
        ──────────
        end
        もぅこれ以上想定外の現象が確認されたら機能追加の際にまとめて修正ってことで(ドツボ
        たまたま 4 エントリ目を投稿して下さっていた RiskTaker さんに感謝しつつ、もぅ寝ます…
        --
        mobile ID portable_NoGood [slashdot.jp] 併用中
        親コメント
  • by witch (3127) on 2004年07月01日 23時29分 (#580638) 日記
    おもしろいー
    すごいなぁ…私も Ruby 使えるようになりたいです。

    slashwatch.hn.org に置いてみたけど、cgiパラメータの解釈失敗したときとか、ながーいデータ渡されたときの挙動とか判んないので URLは内緒ってことで…(ごめんなさい)

    …って、私の古い au携帯だと表示できないみたい…1ページの容量超えちゃってるかな…

    今後の機能アップ期待してますー
    • > パラメータの解釈失敗したときとか、ながーいデータ渡されたときの挙動とか判んないので
      このへんは処理系の実装依存と言うか ruby におまかせというか、http サーバのエラーログを読めることが前提なので (^^;
      # いや、何にも考えてないだけッス(ぉ
      > 私の古い au携帯だと表示できないみたい…1ページの容量超えちゃってるかな…
      ソース上で改行をしていなかったり、<title> を付けてないほど送信量を抑えたコードだったので、ちょっと削りすぎ?かもしれませんね…
      というわけで、早速 /.-J comment search と同程度の出力が得られるように変更してみました [srad.jp]。

      また、長文の日記エントリに対応するための試みとして、entryLimit という変数を追加しました。
      これを変更すると表示される日記エントリ数が増減します…って決め打ちじゃなくて、クライアント側から指定できるようにした上で、前回取得時間と端末の処理上限を加味して実際に表示するエントリ数を決定したいトコロです。

      まぁ、どう実装するかを考えながらなので、ぼちぼちって感じですね。
      # キリが悪いので今晩はこのへんで(とかゆ

      --
      mobile ID portable_NoGood [slashdot.jp] 併用中
      親コメント
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...