2007年10月アーカイブ

WWW::Mixiが10/1のMixiのデザイン変更にまだ対応しないので、WWW::Mixi::Scraperを試してみる。
恥ずかしながら、初めてCPANを使ってインストール。portsを使わなくて、他のモジュールと喧嘩しないのかな。
で、対応する。CustomFeed::MixiScraperはCPANにはないようだったので、Charsbar::Note - Plagger::Plugin::CustomFeed::MixiScraperCommentsAdd Starからコピペ。
中を読んでみると、Bbsに対応していないっぽい。WWW::Mixi::ScraperはBbsを読んでいるっぽいので、修正してみる。
さらに、コミュニティ掲示板や日記のコメントにも対応していないようだったので、そっちも手を入れる。
ついでに、改行がなくなってしまうのもなんとかしたい。
ここまでやっても、コミュニティのアンケートには対応していないようだが、今回は面倒なので見送り。

まずは、改行対応(ここで良いのか?試せてない)。WWW::Mixi::Scraper::Plugin
*** Plugin.pm.ORIG      Sat Oct  6 11:08:29 2007
--- Plugin.pm   Sat Oct  6 08:50:56 2007
***************
*** 51,57 ****
    die "no content" unless $content;

    # XXX: preserve some tags like <br>?
!   $content =~ s/<br(\s[^>]*)?>/\n/g; # at least preserve as a space
    $content =~ s/&nbsp;/ /g;          # as it'd be converted as '?'

    return $content;
--- 51,57 ----
    die "no content" unless $content;

    # XXX: preserve some tags like <br>?
!   #$content =~ s/<br(\s[^>]*)?>/\n/g; # at least preserve as a space
    $content =~ s/&nbsp;/ /g;          # as it'd be converted as '?'

    return $content;
続いて、掲示板のコメントの番号をsubjectに追加。WWW::Mixi::Scraper::Plugin::ViewBBS
*** ViewBBS.pm.ORIG     Sat Oct  6 11:08:48 2007
--- ViewBBS.pm  Sat Oct  6 08:41:25 2007
***************
*** 56,72 ****
    $scraper{list} = scraper {
      process 'dl.commentList01>dt[class="commentDate clearfix"]>span.date',
        'times[]' => 'TEXT';
      process 'dl.commentList01>dd>dl.commentContent01',
        'comments[]' => $scraper{comments};
!     result qw( times comments );
    };

    my $stash_c = $self->post_process($scraper{list}->scrape(\$html))->[0];

    my @comments = @{ $stash_c->{comments} || [] };
    my @times    = @{ $stash_c->{times} || [] };
    foreach my $comment ( @comments ) {
      $comment->{time} = _datetime( shift @times );
      $comment->{link} = _uri( $comment->{link} );
    }
    $stash->{comments} = \@comments;
--- 56,76 ----
    $scraper{list} = scraper {
      process 'dl.commentList01>dt[class="commentDate clearfix"]>span.date',
        'times[]' => 'TEXT';
+     process 'dl.commentList01>dt[class="commentDate clearfix"]>span.senderId',
+       'nums[]' => 'TEXT';
      process 'dl.commentList01>dd>dl.commentContent01',
        'comments[]' => $scraper{comments};
!     result qw( times nums comments );
    };

    my $stash_c = $self->post_process($scraper{list}->scrape(\$html))->[0];

    my @comments = @{ $stash_c->{comments} || [] };
    my @times    = @{ $stash_c->{times} || [] };
+   my @nums    = @{ $stash_c->{nums} || [] };
    foreach my $comment ( @comments ) {
      $comment->{time} = _datetime( shift @times );
+     $comment->{subject} = $stash->{subject} . ":" . shift @nums;
      $comment->{link} = _uri( $comment->{link} );
    }
    $stash->{comments} = \@comments;
そして、CustomFeed::MixiScraper。上記のほかに、timezoneの問題で既読管理がうまくいってなかったぽいのも対応。
*** MixiScraper.pm.ORIG	Sat Oct  6 11:27:45 2007
--- MixiScraper.pm	Sat Oct  6 11:29:20 2007
***************
*** 14,19 ****
--- 14,25 ----
          icon       => 'owner_id',
      },
      # can't get icon
+     Bbs => {
+         title      => 'コミュニティ最新書き込み',
+         get_list   => 'new_bbs',
+         get_detail => 'view_bbs',
+     },
+     # can't get icon
      Message => {
          title      => 'ミクシィメッセージ受信箱',
          get_list   => 'list_message',
***************
*** 110,115 ****
--- 116,124 ----
          $entry->link($msg->{link});
          $entry->author($msg->{name});
          $entry->date( Plagger::Date->parse($format, $msg->{time}) );
+ 	if ($entry->date) {
+ 	    $entry->date->set_time_zone('Asia/Tokyo');
+ 	}
  
          if ($self->conf->{show_icon} && !$blocked && defined $MAP->{$type}->{icon}) {
              my $owner_id = $msg->{link}->query_param($MAP->{$type}->{icon});
***************
*** 136,144 ****
              }
          }
  
          if ($self->conf->{fetch_body} && !$blocked && $msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
              $context->log(info => "Fetch body from $msg->{link}");
!             my $item = $self->cache->get_callback(
                  "item-$msg->{link}",
                  sub {
                      Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
--- 145,155 ----
              }
          }
  
+ 	my $item = 0;
+ 
          if ($self->conf->{fetch_body} && !$blocked && $msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
              $context->log(info => "Fetch body from $msg->{link}");
!             $item = $self->cache->get_callback(
                  "item-$msg->{link}",
                  sub {
                      Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
***************
*** 161,166 ****
--- 172,180 ----
                  $entry->body($body);
  
                  $entry->date( Plagger::Date->parse($format, $item->{time}) );
+ 		if ($entry->date) {
+ 		    $entry->date->set_time_zone('Asia/Tokyo');
+ 		}
              } else {
                  $context->log(warn => "Fetch body failed. You might be blocked?");
                  $blocked++;
***************
*** 168,173 ****
--- 182,206 ----
          }
  
          $feed->add_entry($entry);
+ 
+ 	if ($item) {
+ 	    for my $comment (@{ $item->{comments} || [] }) {
+ 		$entry = Plagger::Entry->new;
+ 		if ($comment->{subject}) {
+ 		    $entry->title($comment->{subject});
+ 		} else {
+ 		    $entry->title('comments for [' . $msg->{subject} . ']');
+ 		}
+ 		$entry->link($comment->{link});
+ 		$entry->author($comment->{name});
+ 		$entry->date( Plagger::Date->parse($format, $comment->{time}) );
+ 		if ($entry->date) {
+ 		    $entry->date->set_time_zone('Asia/Tokyo');
+ 		}
+                 $entry->body($comment->{description});
+ 		$feed->add_entry($entry);
+ 	    }
+ 	}
      }
  
      $context->update->add($feed);
本家の方で、WWW::Mixi::Scraper 0.08がリリースされた
ので、早速patchも0.08に対応してみた。
今回から、descriptionはhtmlがデフォルトになったので、Plugin.pmの修正は必要なし。(と言うか前回の修正は意味なしだったけど)

WWW::Mixi::Scraper::Plugin::ViewBBS
コメントのリンクが発言者なのが気に入らない。本当は、コメント自身にlinkを張りたいんだけど、コメント自身を表すpermalinkがそもそも存在しないし、view_bbs.plのページからトピックのURLも直では取り出せなかった(必要な情報はあるので、scrapeしてから文字列処理をすれば良いんだけど)ので、とりあえず諦めた。
*** ViewBBS.pm.ORIG     Sun Oct  7 17:09:55 2007
--- ViewBBS.pm  Sun Oct  7 18:14:14 2007
***************
*** 25,30 ****
--- 25,32 ----
    };

    $scraper{topic} = scraper {
+     process 'div[class="pageTitle communityTitle002"]>h2',
+       comtitle => 'TEXT';
      process 'dl[class="bbsList01 bbsDetail"]>dt>span.date',
        time => 'TEXT';
      process 'dl[class="bbsList01 bbsDetail"]>dt>span.titleSpan',
***************
*** 38,44 ****
        'images[]' => $scraper{images};
      process 'div#localNavigation>ul.localNaviCommunity>li.top>a',
        link => '@href';
!     result qw( time subject description name name_link images link );
    };

    # bbs topic is not an array
--- 40,46 ----
        'images[]' => $scraper{images};
      process 'div#localNavigation>ul.localNaviCommunity>li.top>a',
        link => '@href';
!     result qw( comtitle time subject description name name_link images link );
    };

    # bbs topic is not an array
***************
*** 50,72 ****
        name => 'TEXT';
      process 'dd',
        description => $self->html_or_text;
!     result qw( link name description );
    };

    $scraper{list} = scraper {
      process 'dl.commentList01>dt[class="commentDate clearfix"]>span.date',
        'times[]' => 'TEXT';
      process 'dl.commentList01>dd>dl.commentContent01',
        'comments[]' => $scraper{comments};
!     result qw( times comments );
    };

    my $stash_c = $self->post_process($scraper{list}->scrape(\$html))->[0];

    my @comments = @{ $stash_c->{comments} || [] };
    my @times    = @{ $stash_c->{times} || [] };
    foreach my $comment ( @comments ) {
      $comment->{time} = _datetime( shift @times );
      $comment->{link} = _uri( $comment->{link} );
    }
    $stash->{comments} = \@comments;
--- 52,80 ----
        name => 'TEXT';
      process 'dd',
        description => $self->html_or_text;
!     process 'dd>table>tr>td',
!       'images[]' => $scraper{images};
!     result qw( link name description images );
    };

    $scraper{list} = scraper {
      process 'dl.commentList01>dt[class="commentDate clearfix"]>span.date',
        'times[]' => 'TEXT';
+     process 'dl.commentList01>dt[class="commentDate clearfix"]>span.senderId',
+       'nums[]' => 'TEXT';
      process 'dl.commentList01>dd>dl.commentContent01',
        'comments[]' => $scraper{comments};
!     result qw( times nums comments );
    };

    my $stash_c = $self->post_process($scraper{list}->scrape(\$html))->[0];

    my @comments = @{ $stash_c->{comments} || [] };
    my @times    = @{ $stash_c->{times} || [] };
+   my @nums    = @{ $stash_c->{nums} || [] };
    foreach my $comment ( @comments ) {
      $comment->{time} = _datetime( shift @times );
+     $comment->{subject} = '[' . $stash->{comtitle} . '] ' . $stash->{subject} . ": " . shift @nums;
      $comment->{link} = _uri( $comment->{link} );
    }
    $stash->{comments} = \@comments;
Plagger::Plugin::CustomFeed::MixiScraper
*** /home/sugimoto/MixiScraper.pm.ORIG  Sat Oct  6 11:27:45 2007
--- MixiScraper.pm      Sun Oct  7 18:15:22 2007
***************
*** 14,19 ****
--- 14,25 ----
          icon       => 'owner_id',
      },
      # can't get icon
+     Bbs => {
+         title      => 'コミュニティ最新書き込み',
+         get_list   => 'new_bbs',
+         get_detail => 'view_bbs',
+     },
+     # can't get icon
      Message => {
          title      => 'ミクシィメッセージ受信箱',
          get_list   => 'list_message',
***************
*** 110,115 ****
--- 116,124 ----
          $entry->link($msg->{link});
          $entry->author($msg->{name});
          $entry->date( Plagger::Date->parse($format, $msg->{time}) );
+       if ($entry->date) {
+           $entry->date->set_time_zone('Asia/Tokyo');
+       }

          if ($self->conf->{show_icon} && !$blocked && defined $MAP->{$type}->{icon}) {
              my $owner_id = $msg->{link}->query_param($MAP->{$type}->{icon});
***************
*** 136,144 ****
              }
          }

          if ($self->conf->{fetch_body} && !$blocked && $msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
              $context->log(info => "Fetch body from $msg->{link}");
!             my $item = $self->cache->get_callback(
                  "item-$msg->{link}",
                  sub {
                      Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
--- 145,155 ----
              }
          }

+       my $item = 0;
+
          if ($self->conf->{fetch_body} && !$blocked && $msg->{link} =~ /view_/ && defined $MAP->{$type}->{get_detail}) {
              $context->log(info => "Fetch body from $msg->{link}");
!             $item = $self->cache->get_callback(
                  "item-$msg->{link}",
                  sub {
                      Time::HiRes::sleep( $self->conf->{fetch_body_interval} || 1.5 );
***************
*** 161,166 ****
--- 172,180 ----
                  $entry->body($body);

                  $entry->date( Plagger::Date->parse($format, $item->{time}) );
+               if ($entry->date) {
+                   $entry->date->set_time_zone('Asia/Tokyo');
+               }
              } else {
                  $context->log(warn => "Fetch body failed. You might be blocked?");
                  $blocked++;
***************
*** 168,173 ****
--- 182,215 ----
          }

          $feed->add_entry($entry);
+
+       if ($item) {
+           for my $comment (@{ $item->{comments} || [] }) {
+               $entry = Plagger::Entry->new;
+               if ($comment->{subject}) {
+                   $entry->title($comment->{subject});
+               } else {
+                   $entry->title('comments for [' . $msg->{subject} . ']');
+               }
+               $entry->link($comment->{link});
+               $entry->author($comment->{name});
+               $entry->date( Plagger::Date->parse($format, $comment->{time}) );
+               if ($entry->date) {
+                   $entry->date->set_time_zone('Asia/Tokyo');
+               }
+                 my $body = $comment->{description};
+                 for my $image (@{ $comment->{images} || [] }) {
+                     $body .= qq(<div><a href="$image->{link}"><img src="$image->{thumb_link}" style="border:0" /></a></div>);
+                     my $enclosure = Plagger::Enclosure->new;
+                     $enclosure->url($image->{thumb_link});
+                     $enclosure->auto_set_type;
+                     $enclosure->is_inline(1);
+                     $entry->add_enclosure($enclosure);
+                 }
+                 $entry->body($body);
+               $feed->add_entry($entry);
+           }
+       }
      }

      $context->update->add($feed);
これでだいぶ快適になった。作者の方ありがとう。
2007年11月1日より、「なりすましメール対策」の提供を行います。
お客様が、「全て拒否する」と設定された場合には、DNSサーバに必要な対処を行っていないISP事業者様や企業様などからのメールは認証ができないため受信できません。
とのことなので、DNSのSPFレコードとやらを設定してみることに。
Sender ID:送信者側の設定作業
の記事を参考にして、送信者側の設定をやってみた。
DomainKeysのときは、gmailに送って動作確認したけど、SPFのときはどうすればいいのかな。
しかし、いずれにしろちっとも普及して来ないので、spamの量が減りゃーしないのである。
普及の兆しが見えたら、受信側も考えてみよう。
portauditから毎日php4の脆弱性があるとメールが送られてくる。
php4はもう開発終了らしいので、php5に乗り換えることにする。
/var/db/pkg/を見て、php4で始まるものをリストアップし、一度pkg_deinstall -f でアンインストール。
そして、php5で同じパッケージを全てインストールした。 後は、apacheを再起動して、動作確認。
うちで使っているphpを使うものは、pukiwiki, cacti, ilohamail。すべて、そのまま動いたようだ。
pukiwikiだけは、一応1.4.5から1.4.7に上げておいた。
家計簿をつけるのに、Microsoft MoneyとMoney Lookを使っている。
今回、Money Lookを起動したら、Money Look2から3にバージョンアップされた。
この手のソフトはバージョンが上がると使いにくくなるっぽいのはなんとかならないかな。
で、IE7にしてから初めてMoney Lookを起動したのだけれど、Money LookからIEを起動したらIEが帰ってこない。
全部プロセスを殺して、普通にIE7を立ち上げても一緒。普段はFireFoxを使っているので、いつからIE7が使えなくなったのかわからない。
検索してみたら、結構メジャーな問題らしく、いろいろなページが見つかった。
結局、Internet Explorer 7 が起動しない、または応答を停止するに従ってアドオンなしで起動し、設定からYahoo関連のアドオンを無効にしたら無事にIEが起動するようになった。

Moneyも、サポート期限が切れてバージョンアップしないといけないらしい・・・。
今はMoney2004を使っているのだけれど、ひょっとしてバージョンアップしたらMoneyLookを併用しなくても良くなったりするのかな?
PHPを5にしたついでに、pukiwikiを1.4.7に上げたら、またコメントspamがひどいことになった。
前は、asciiのみの投稿をblockするような改造を入れてあったのだけれど、今回はそれを入れなかったので。
で、つらつらと調べていたら、akismetと言うwebサービス(?)を使ったspam対策を見つけた。
PukiWiki/1.4/ちょっと便利に/Akismetによるspam(スパム)防止機能 - PukiWiki-dev
Plugin/akismet.inc.php - SONOTS Plugin

後者の方が機能も充実していて良さそうだったんだけど、akismetの他にreCAPTCHAのAPI Keyも取得しなくちゃいけないのが面倒だったので、前者を採用した。
手順通りakismetのAPI Keyを取得して、akismet.class.phpをインストールして、lib/pukiwiki.phpを修正・・・。
せんせー!
// Spam filtering
if ($spam && $method != 'GET') {
なんて行ないんですけど?
手元にあるpukiwiki1.4.5のソースでも該当箇所はなし。記事自体は今年の2月に更新されていて、1.4.5はもっと古いはずなんだけどなあ・・・。
リプレースするソースを読むと、spamチェックをして該当すればdieするだけのようなので、どこに挟んでも変わらないだろうと思って、適当に入れてみた。
とりあえず、普通にコメントは投稿できちゃったけど、問題はこれでspamをはじいてくれるかどうかだなあ。
うちの環境はB-flet'sのpppoeにFreeBSDで繋いで、ipf/ipnatでnatしている。
一応linuxigd 0.92_2と言うupnpdも入れていたのだけれど、うまく動いていなくて、PS3で接続テストをすると「NATタイプ3(他のPS3と通信できません)」なんて表示されていた。
今までは、PS3で体験版をダウンロードしたりする分には問題なかったのだけれど、今回「THE EYE OF JUDGEMNT」を買ったら、接続テストでタイプ1かタイプ2じゃないと対戦できないと書かれていた。
で、THE EYE OF JUDGEMENT wikiによると、udpの3658を飛ばせばいいみたいなことが書いてあったので、ipnat.rulesに以下を追記してみたら、無事に「タイプ2」になった。(tun0は外向きのインターフェイス名)
rdr tun0 外向きIP/32 port 3658 -> PS3のIP port 3658 udp

upnpdが動いたらその方が楽だよなあと思って一応起動してみようとしたら、libuuid.soがないとか言って起動すらしない。以前は起動していてうまく動いてなかったはずなんだけど。
駄目もとで再インストールしてみようと思ってportsでmakeしてみたら、いつのまにかlibupnpとlinuxigdがバージョンアップしていた。linuxigdは1.0_2になっている
バージョンアップしたら、/usr/local/etc/rc.d/linuxigd.shがlinuxigdに変わっていて、最近のrcスクリプトの書き方になっていた。
そこで、/etc/rc.confに以下を追加してみた。
linuxigd_enable="YES"
linuxigd_extif="tun0"
linuxigd_intif="rl0"
tun0は外向きのインターフェイスで、rl0が内向きのインターフェイス。
すると、無事にupnpdが起動して、PS3にも認識された。ipnat.rulesの静的ルールを削除しても、PS3にタイプ2/UPNPありで認識される。
ばっちりじゃないですか!

まあ、まだ怖くてネット対戦してないんですけどね(汗)
2007年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

このアーカイブについて

このページには、2007年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2007年9月です。

次のアーカイブは2007年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1