11月、ということで

kujoo2009-11-01


俺は日記をはじめるぞー! JOJOォォォォ!!

ということです。

まー、再開になるんだけど。


とりあえず、なんでも書いていこーという感じで。

ここはブログじゃない日記なんだーという感じで。


ちなみに後で書く=もう書かないなのです。


ぶっちゃけマジで書くネタないので、大抵は過去に書いてたメモやボツなテキストが貼られることになります。(なんだそれ)

そして、写真もテキトーに貼っていきます。


今日の写真は結構前にコンビニで買ったバームクーヘン。(撮影場所は我が憩いの和室w イミフ)
近所のミニストップや普段よく行くミニストップでは売ってなかったけど、某ICの近くのミニストップでは絶賛販売中のご様子。

400円の割にこのサイズ。かなりの食い手があります。もgもgもgもg・・・。


そして日記として欠かせないコンテンツ、それは今日の天気!

今日は、朝昼は晴れてて夕方くらいからポツポツ。夜ザーザーの所謂、晴れのち雨。気温はそこそこあったか。


よし!時間的にはギリだが今日の日記、完了だ!

うん、今日やった事には全く触れてないけど、今日の日記は完了です。でわでわ。


[ハレのちアメ]

東京ゲームショウ2009(まだ書き途中)


今更ながらも気になったタイトルをメモ。

タイトル名(名称とかテーマとかシリーズとか)で惹かれたもの

.hack//Link

あのドットハックがまさかの復活w というわけで今回もアニメ展開とかするみたいですね。ゲームとしては普通ポイ気がしますが。

画面とか記事とかを見て気になったもの

AGAIN FBI超心理捜査官

雰囲気的にDSのゲームぽいなとか思ったけどPS3用なのか・・・。そんなにスペック必要?メディア?

暗闇の果てで君を待つ

一応、乙女ゲーっていう括りだけど、脱出系ADVらしいので注目。「遺作」とか「慟哭、そして・・・」みたいなゲームだったらいいな。

Dead Space Extraction (Wii

SFホラー系ガンシューかな。単純なライドものではなく多少インタラクティブな要素もあるっぽい。

へんなの

EyePet

ARなペット育成もの。応用的な利用が出来ると楽しいかも。

オレコマンダー

はじめてみたけど、これ欲しい!

ロストプラネット
CERO D & CERO Z TITLE PLAY ZONE
Xbox 360リエーター パネルディスカッション
プーペガールDS
カジュアルゲーム、問われる開発力
LAST RANKER
■NeuroSky(ニューロスカイ) MindSet(マインドセット

買った本の列挙など

kujoo2009-09-13



ここんところ図書館ではちょこちょこ借りてそれを読んだりしてたんだけど、本を買うという行為をしてなかったので記念に書いときます。


3月のライオン 3 (ジェッツコミックス)
羽海野 チカ
白泉社
おすすめ度の平均: 4.5
5 兄者と坊。
4 だから、この漫画が好きだ!
5 泣きました
5 久々のヒットキャラ野口君(※高2)
5 零ちゃん≧親父達

いきなり漫画ですけど・・・。本には間違いないっ。

んで、羽海野 チカさんの「3月のライオン 3巻」。おっさんが格好良いです。
私なんかがあれこれ書いた感想とか読むよりアマゾンレビューのすずなみさんという方のレビューを読んだ方がいいですよ。100%同意な素晴らしいレビューです。(すり替え)



あと2冊買ったんですけど、そっちはまだ読んでないです。ゆっくりと読む時間を作りたいもんですが〜。


物語工学論
物語工学論
posted with amazlet at 09.09.13
新城 カズマ
角川学芸出版
売り上げランキング: 2719
おすすめ度の平均: 5.0
5 人間と社会に対する鋭い洞察と高い実用性を両立

価格見ないでレジに持っていったんですけどちょっと値段に引きましたw しかし、値段分は楽しんでみせますよ! ああ、楽しむさっ!


嘘つきみーくんと壊れたまーちゃん〈8〉日常の価値は非凡 (電撃文庫)
入間 人間
アスキーメディアワークス
売り上げランキング: 53
おすすめ度の平均: 3.5
2 正直微妙
4 疲れる…
5 入間人間風群像劇

みーまーの方に至っては 『 i 』 もまだ途中までしか読んでないからなー。先は長そうだw


実際のところは他にも買った本があるんだけど、自分の金じゃないのであんま書けんなー。これは貰ったに相当するのかどうかどうか。アマゾンなら持ってるチェックをポチリとするところだけれど。


そういえば今日気付いたけど、この日記(ブログ?)って IE(8) で見ると酷いレイアウトになったりするみたいだね。・・・そのうち直すかも。

タイトル付けるのも面倒なんでテキトーに各自脳内変換で


引き続きTwitterものです。(先週の日曜日に書いてたんですが、途中でめんどくさくなって放置してました・・・)

過去の投稿を拾ってバックアップ的な事をします。・・・結局、メールで送るようにしてみました。(cronで一日ごとに回す感じの想定です)

前回までのスクリプトをベースに過去の投稿を取ってくるモジュールを書いて、それを利用して取得、整形してメール送信、ってとこですね。

メール送信は MIME::Lite を使ってみました。sendmailのパスはさくらインターネットレンタルサーバーのものです。オプションは MIME::Lite のドキュメントに記述されてたもの。(意味確認してないですけどね)

twitrss2mail.pl

#!perl
use strict;
use warnings;
use utf8;
use Encode;
use Config::Pit;
use MIME::Lite;
use MyApp::TwitRead;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) { die 'invalid parameter.'; }

  my $tw = MyApp::TwitRead->new($input);
  unless($tw) { die 'Not found RSS-feed. (or, Twitter is down.)' }

  my($ps, $dt, $dt2, $l) = $tw->daysago(2);
# if($l) { warn 'last page: '.$l."\n"; }

  # 送信する内容を整形
  my $subject = $input.' on Twitter: '.$dt->ymd('/').' - '.$dt2->ymd('/');
  my $msg_html = '<p>'.$subject.'</p>'."\n\n";
  my $date = "";
  if($ps) {
    foreach(@$ps) {
      if($_->{date} ne $date) {
        if($date) { $msg_html .= "</ul>\n" }
        $date = $_->{date};
        $msg_html .= "<p>$date</p>\n<ul>\n";
      }
      $msg_html .= "<li><a href=\"$_->{link}\">$_->{time}</a> $_->{msg}</li>\n\n";
    }
    $msg_html .= '</ul>'
  } else {
    $msg_html .= '<p>Not twitting about anything. (or, Could not get RSS-feed.)</p>';
  }

  # エンコード
  $subject  = Encode::encode("MIME-Header-ISO_2022_JP", $subject);
  $msg_html = Encode::encode("utf8", $msg_html); # or iso-2022-jp ?

  my $config = pit_get("personal.server"); # config::pitでメールアドレス読み込み

  # メールを設定して送信
  my $mail = MIME::Lite->new(
    From    => $config->{mail},
    To      => $config->{disposablemail},
    Subject => $subject,
    Data    => $msg_html,
    Type    => 'text/html',
  );
  $mail->attr('content-type.charset' => 'UTF-8');
  $mail->send("sendmail", "/usr/sbin/sendmail -t -oi -oem");

MyApp/TwitRead.pm

package MyApp::TwitRead;

use strict;
use warnings;
use utf8;
use XML::TreePP;
use HTML::Entities;
use Web::Scraper;
use URI;
use URI::Escape;
use DateTime;
use DateTime::Format::HTTP;

my $baseuri  = 'http://twitter.com/';
my $charset  = 'utf-8'; # not use
my $timezone = 'Asia/Tokyo'; # or local
my $waitsec  = 3;
my $max_loop = 160; # or Twitter-Spec

sub new {
  my $class = shift;
  my $username = shift
    or return undef, 'please specify twitter-username.';
  my $tz   = shift; if($tz)   { $timezone = $tz; }
  my $wait = shift; if($wait) { $waitsec  = $wait; }
  my $loop = shift; if($loop) { $max_loop = $loop; }
  my($rssuri, $iconuri) = &__get_rss_icon($username)
    or return undef, 'could not get rss-feed.';
  my $obj = {
    username => $username,
    rss      => $rssuri  ? $rssuri  : undef,
    icon     => $iconuri ? $iconuri : undef,
  };
  bless $obj, $class;
  return $obj;
}

sub rss_content {
  my $self = shift;
  my $uri  = $self->{rss};
  my $page = shift;
  if($page) { $uri .= '?page='.$page; }

sleep($waitsec); ### wait

  my $xtpp = XML::TreePP->new(force_array => ["item"]) or return;
  my $rss  = $xtpp->parsehttp(GET => $uri) or return;
  my $item = $rss->{rss}->{channel}->{item} or return;
  return $item;
}

sub date {
  my $self  = shift;
  my $date1 = shift;
  my $date2 = shift;
  unless($date1) {
    $date1 = DateTime->now(time_zone => $timezone);
    $date1 = &__set_day_of_last($date1);
  }
  unless($date2) {
    $date2 = DateTime->now(time_zone => $timezone);
    $date2 = &__set_day_of_first($date2);
  }
  my $start = $date1;
  my $end   = $date2;
  if($date1 < $date2) { $start = $date2; $end = $date1; }

  my $twit;
  my $r_rep = '\@(\w+)';
  my $r_tag = '#\w{2,}';

  for(my $i = 1; $i < $max_loop; $i++) {
    my $rss = $self->rss_content($i);
    unless($rss) { last; }
    foreach(@$rss) {
      my $dt = &__conv_timestamp($_->{pubDate});
      if($dt < $end) {
        return $twit, $end, $start, $i;
      }
      my $link = $_->{link};
      my $text = HTML::Entities::decode($_->{title});
      $text =~ s|^$self->{username}: ||;

      my $msg = $text;
      $msg =~ s/</&lt;/g;
      $msg =~ s/>/&gt;/g;
      $msg =~ s/"/&quot;/g;
      my($tag, $reply_user, $reply_uri);
      foreach my $t ($msg =~ m/$r_tag/g) {
        foreach(@$tag) { if($_ eq $t) { undef $t; last; } }
        if($t) { push(@$tag, $t); }
      }
      foreach my $r ($msg =~ m/$r_rep/g) {
        foreach(@$reply_user) { if($_ eq $r) { undef $r; last; } }
        if($r) { push(@$reply_user, $r); }
      }
      if($reply_user) { $reply_uri = &__get_reply(@$reply_user[0], $link); }
      $msg =~ s|$r_rep|\@<a href\="@{[&__chk_reply($1, $reply_uri)]}">$1</a>|g;
      $msg =~ s|$r_tag|<a href\="$baseuri#search\?q\=@{[uri_escape_utf8($&)]}">$&</a>|g;

      if($dt <= $start) {
        push(@$twit, {
          text => $text,
          msg  => $msg,
          link => $link,
          date => $dt->strftime('%Y/%m/%d'),
          time => $dt->strftime('%H:%M:%S'),
          timezone => $timezone,
          datetime => $dt,
          tag    => $tag ? $tag : undef,
          reply    => $reply_uri  ? $reply_uri  : undef,
          reply_user => $reply_user ? $reply_user : undef,
        });
      }
    }
  }
  return $twit, $end, $start;
}

sub daysago {
  my $self  = shift;
  my $days  = shift;
  my $today = shift;
  unless($days)  { $days  = 1; }
  unless($today) { $today = "-"; }

  my $start = DateTime->now(time_zone => $timezone);
  my $end   = DateTime->now(time_zone => $timezone);
  unless($today =~ m/^today$/i) {
    $start->subtract(days => 1);
    $end->subtract(days => 1);
  }
  if(--$days > 0) { $end->subtract(days => $days); }

  $start = &__set_day_of_last($start, $timezone);
  $end   = &__set_day_of_first($end, $timezone);
  return $self->date($start, $end);
}

sub weeksago {
  my $self = shift;
  my $weeks = shift;
  my $today = shift;
  unless($weeks) { $weeks = 1; }
  unless($today) { $today = "-"; }
  return $self->daysago($weeks * 7, $today);
}

sub datelinechange { # malfunction
  my $self = shift;
  return $self;
}

sub timezonechange {
  my $self = shift;
  my $tz   = shift or return;
  $timezone = $tz;
  return $self;
}

sub waitchange {
  my $self = shift;
  my $wait = shift or return;
  $waitsec = $wait;
  return $self;
}

sub loopchange {
  my $self = shift;
  my $loop = shift or return;
  $max_loop = $loop;
  return $self;
}

sub __get_rss_icon {
  my $id   = shift or return;
  my $uri  = new URI($baseuri.$id);

sleep($waitsec); ### wait

  my $icon = scraper {
    process 'div h2 a img', 'icon' => '@src';
    result 'icon';
  }->scrape($uri);
  my $rss = scraper {
    process 'html head link', 'rss[]' => '@href';
    result 'rss';
  }->scrape($uri);
  foreach(@$rss) {
    if($_ =~ /^($baseuri)statuses\/user_timeline\/\d+\.rss$/) {
      return $_, $icon;
    }
  }
}

sub __get_reply {
  my $user  = shift or return;
  my $entry = shift or return;
  my $uri   = new URI($entry);

sleep($waitsec); ### wait

  my $link = scraper {
    process 'span span.entry-meta a', 'link[]' => '@href';
    result 'link';
  }->scrape($uri);
  foreach(@$link) {
    if($_ =~ /^$baseuri$user\/status\/\d+$/) {
      return $_;
    }
  }
  return "";
}

sub __chk_reply {
  my $user  = shift or return;
  my $reply = shift or return $baseuri.$user;
  if($reply =~ /^$baseuri$user\/status\/\d+$/) {
    return $reply;
  }
  return $baseuri.$user;
}

sub __date_diff {
  my $dt1 = shift or return;
  my $dt2 = shift or return;
  my $dur = $dt1->delta_days($dt2);
  my $by = 1;
  if($dt1 < $dt2) { $by = -1; }
  return $by * $dur->in_units('days');
}

sub __set_day_of_first {
  my $dt = shift or return;
  my $date = DateTime->new(
    time_zone => $timezone,
    year  => $dt->year,
    month => $dt->month,
    day   => $dt->day,
  );
  return $date;
}

sub __set_day_of_last {
  my $dt = shift or return;
  my $date = __set_day_of_first($dt);
  $date->add(days => 1);
  $date->subtract(seconds => 1);
  return $date;
}

sub __conv_timestamp {
  my $timestamp = shift or return;
  return DateTime::Format::HTTP->parse_datetime($timestamp)->set_time_zone($timezone);
}

return 1;


まあ1日ごとだったらこんな感じで毎回拾うんでもいいよね。

でも、@ばっかしてるとキツいかもなー。

やっぱ別途拾うのを回しといた方が良いとは思うけどねー。

まっいっかー、あはははははははー

twitterのつぶやきをリスト形式でまとめる


昨日のをベースにリスト形式(ul-li)にまとめて出力するスクリプトを作ってみました。

処理の割に無駄に長いです。

昨日のtwitrss.plをベースにイロイロ追加

#!perl
use strict;
use warnings;
use utf8;
use Encode;
  binmode STDOUT, ":utf8";
use XML::TreePP;
use HTML::Entities;
use Web::Scraper;
use URI;
use URI::Escape;
use DateTime::Format::HTTP;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) {
    exit;
  }
  my $username = $input;

  my $base = 'http://twitter.com/';
  my($rss, $icon) = &get_uri_rss_icon($base, $username) or die('doesnot get user-code.');

  my($count, $days) = (0, "");
  for(my $i = 1; $i < 99; $i++) {
    my $twit = &get_rss_twit($rss, $i);
    unless($twit) { print "</ul>\n"; $count = $i; last; }
    foreach(@$twit) {
      my($date, $time) = &get_date_timestamp($_->{pubDate});
      my $link = $_->{link};
      my $post = HTML::Entities::decode($_->{title});
      $post =~ s/^$username: //;
      $post =~ s/\@(\w+)/\@<a href\="@{[&get_uri_reply($link, $base.$1)]}">$1<\/a>/g;
      $post =~ s/#\S+/<a href\="$base#search\?q\=@{[uri_escape_utf8($&)]}">$&<\/a>/g;
      if($days ne $date) {
        if($days) { print "</ul>\n"; }
        print "- $date\n";
        print "<ul>\n";
        $days = $date;
      }
      print "<li><a href=\"$link\">$time</a> $post</li>";
    }
  }
  print "\nscraping: $count\n";

  exit;

sub get_uri_rss_icon {
  my $base = shift or return;
  my $id = shift or return;
  my $uri = new URI($base.$id);
  my $icon = scraper {
    process 'div h2 a img', 'icon' => '@src';
    result 'icon';
  }->scrape($uri);
  my $rss = scraper {
    process 'html head link', 'rss[]' => '@href';
    result 'rss';
  }->scrape($uri);
  foreach(@$rss) {
    if($_ =~ /^($base)statuses\/user_timeline\/\d+\.rss$/) {
      return $_, $icon;
    }
  }
}

sub get_rss_twit {
  my $uri = shift or return;
  my $page = shift or return;
  my $xtpp = XML::TreePP->new() or return;
  my $rss = $xtpp->parsehttp(GET => $uri.'?page='.$page) or return;
  my $item = $rss->{rss}->{channel}->{item} or return;
  sleep(7);
  return $item;
}

sub get_date_timestamp {
  my $timestamp = shift or return;
  my $dt = DateTime::Format::HTTP->parse_datetime($timestamp)->set_time_zone('local');
  my($date, $time) = split(/T/, $dt);
  return $date, $time;
}

sub get_uri_reply {
  my $entry = shift or return;
  my $user_tl = shift or return;
  my $uri = new URI($entry);
  my $link = scraper {
    process 'span span.entry-meta a', 'link[]' => '@href';
    result 'link';
  }->scrape($uri);
  foreach(@$link) {
    if($_ =~ /^$user_tl\/status\/\d+$/) {
      return $_;
    }
  }
  return $user_tl;
}


これは引数で与えられたユーザーの呟きをリスト形式で抽出するものです。最新から順に最古の呟きまで遡ります(ビビリなので99pageまでにしてます)。あとtwitterが機嫌を損ねない様にウェイトを入れているので遅いです。

しかし・・・。う〜ん、きたないwww


とりあえず、これを書いててわかったことは、RSS2.0等でよく使われてる日付形式は DateTime::Format::HTTP でパースできます。ってことかな。

ちなみに関係無いけど最後に 'Z' が付いてるタイムゾーンって何? はてなのサービスでよく使われてるけど。


さて、もうちょっと整理して1日毎にまとめてどこかにアップするようなものに仕上げよう。まあ自分用ですけどね。出力先はやっぱハイクかなw(と思ってたけどハイクってhtml書けないのか・・・)

思い付きスクリプト


帰宅後、ダカダカ書いてた物を晒しときまーす。

いろいろ書きかけですが。

twitscrape.pl

#!perl
use strict;
use warnings;
use utf8;
use Encode;
  binmode STDOUT, ":utf8";
use Web::Scraper;
use URI;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) {
    exit;
  }
  my $username = $input;

  my $i;
  for($i = 1; $i < 999; $i++) {
    my $twit = &do_scrape_twit($username, $i);
    unless($twit) { last; }
    foreach(@$twit) {
      print $_->{uri}."\t".$_->{date}."\t".$_->{msg}."\n";
    }
  }
  print "\nscraping: $i\n";

  exit;

sub do_scrape_twit {
  my $id = shift or return;
  my $page = shift or return;
  my $uri = new URI('http://twitter.com/'.$id.'?page='.$page);
  sleep(5);
  return scraper {
    process 'ol.statuses li span.status-body',
      'twit[]' => scraper {
        process 'span.entry-content', msg => 'TEXT';
        process 'span a.entry-date', uri => '@href';
        process 'span a.entry-date span.published', date => 'TEXT';
      };
    result 'twit';
  }->scrape($uri);
}

引数にユーザー名を指定するとWeb::ScraperでついったのWebページからそのユーザーの発言を抽出します。

連続して拾うとついったが500とかになったりする気がするのでウェイトとして5秒入れてますが、タイミングの問題かもしれませんなー。

Webで表示されてるものそのままなので、直近の発言時間は現在から相対時間ですね・・・。あと、いろいろテキトーですwww

twitrss.pl

#!perl
use strict;
use warnings;
use utf8;
use Encode;
  binmode STDOUT, ":utf8";
use XML::TreePP;
use HTML::Entities;
use Web::Scraper;
use URI;

  my $input = $ARGV[0] or die 'no input error.';
  unless($input =~ /^\w+$/) {
    exit;
  }
  my $username = $input;
  my $urirss = &get_rss_uri($username) or die('doesnot get user-code.');

  my $i;
  for($i = 1; $i < 999; $i++) {
    my $twit = &get_rss_twit($urirss, $i);
    unless($twit) { last; }
    foreach(@$twit) {
    print $_->{pubDate}."\t".$_->{link}."\t".
          HTML::Entities::decode($_->{title})."\n";
    }
  }
  print "\nscraping: $i\n";

  exit;

sub get_rss_uri {
  my $id = shift or return;
  my $uri = new URI('http://twitter.com/'.$id);
  my $rss = scraper {
    process 'html head link', 'rss[]' => '@href';
    result 'rss';
  }->scrape($uri);
  foreach(@$rss) {
    if($_ =~ /^http:\/\/twitter\.com\/statuses\/user_timeline\/\d+\.rss$/) {
      return $_;
    }
  }
  return;
}

sub get_rss_twit {
  my $uri = shift or return;
  my $page = shift or return;
  sleep(5);
  my $xtpp = XML::TreePP->new() or return;
  my $rss = $xtpp->parsehttp(GET => $uri.'?page='.$page) or return;
  my $item = $rss->{rss}->{channel}->{item} or return;
  return $item;
}

こっちはRSS経由で発言を抽出します。

以前はついったのRSSって反映遅かった気がしますが最近は普通みたいなのでこっちでいいんじゃね?

こっちはさらにいろいろテキトーにやっちゃてますけど・・・。しかしなんで日本語が数値文字参照になってんでしょうね? RSSの仕様かなんかですかね?

それと時間に関してはUTC表記になってる(?)のでこっちの方が使いやすいですねってそりゃそうだwww

あと、見えてるものしか取れないので、プロテクトな人のTLは取得できないっす。(両方とも)



しかし、Web::Scraper って凄いし面白いな〜。

Perl使いにとっちゃ当たり前らしいけどはじめて使ってみたよ。

XPath練習もそのうちしようっと。

Opera 10

kujoo2009-09-02



が正式リリースされたみたいなのでインストールしてみました。

普段はFirefox使ってるんですけど、ニコニコ動画とかのFlashな動画コンテンツはOperaで見てます。
Firefoxで見てるとクソ重くなる上に消費メモリ倍増なので・・・。(Firefoxで重いなーって思っている方は一度Operaを使ってみて欲しいよ)


では、ダウンロードも終わったことだし、インストール開始!


・・・・・。


・・・・・。


・・・・・。


なんか変わった?www


Turboが一押しの機能なのかこれ・・・。あと目に付いたのはタブのサムネイル表示くらい?

  • タブのサムネイル
    タブ下の部分をぐにょ〜んとドラッグするとタブがサムネイル表示になります。



         ↓↓   みょ〜ん



    こんな感じ。(ちなみに opera_standard_slim-0_17 というテーマを使用)
  • Opera Turbo
    なんか低速回線使用時にブラウジングが速くなる機能らしい。低速ネットワークってのがどの程度なのかわかりませんが・・・。


あと、なんかサーバーになる機能っぽいのがあったような気がしたけど。載ってるのかねえ。(このバージョンでは見送られたらしい)


Operaはかなり軽くて良いブラウザですよ。今のところ、ちょっとだけFirefoxの方が機能的に気に入ってるので(これは拡張機能による所が大きいけど)Firefoxをメインに使ってるけどね。

あとたまにOperaで見てると変になるサイトとかあるけど。標準化がもっと進めばそんなこともなくなるでしょ。


それとSilverlight周りもしっかりしてくれないかな〜と思ってたら、Opera 10では結構ちゃんとしてるっぽい。(あいまいw) あいかわらずSilverlightのサイトのシステム要件には記載されてないけどwww



と、書くことが何にも無いんだけど無理やりエントリにしてみる今日この頃www