11月、ということで
俺は日記をはじめるぞー! JOJOォォォォ!!
ということです。
まー、再開になるんだけど。
とりあえず、なんでも書いていこーという感じで。
ここはブログじゃない日記なんだーという感じで。
ちなみに後で書く=もう書かないなのです。
ぶっちゃけマジで書くネタないので、大抵は過去に書いてたメモやボツなテキストが貼られることになります。(なんだそれ)
そして、写真もテキトーに貼っていきます。
今日の写真は結構前にコンビニで買ったバームクーヘン。(撮影場所は我が憩いの和室w イミフ)
近所のミニストップや普段よく行くミニストップでは売ってなかったけど、某ICの近くのミニストップでは絶賛販売中のご様子。
400円の割にこのサイズ。かなりの食い手があります。もgもgもgもg・・・。
そして日記として欠かせないコンテンツ、それは今日の天気!
今日は、朝昼は晴れてて夕方くらいからポツポツ。夜ザーザーの所謂、晴れのち雨。気温はそこそこあったか。
よし!時間的にはギリだが今日の日記、完了だ!
うん、今日やった事には全く触れてないけど、今日の日記は完了です。でわでわ。
[ハレのちアメ]
東京ゲームショウ2009(まだ書き途中)
今更ながらも気になったタイトルをメモ。
タイトル名(名称とかテーマとかシリーズとか)で惹かれたもの
人喰いの大鷲トリコ (PS3)
ときめきメモリアル4
なつかしー。とはいえ・・・このキャラ絵どーよ?
エンド オブ エタニティ
シナリオとグラフィックは良さそう。ゲーム性と操作性はどうでしょうね。
- 4Gamer.net ― [TGS 2009]セガ×トライエースの強力タッグが手がける注目のRPG「END OF ETERNITY」プレイレポート(End of Eternity(エンド オブ エタニティ))
- “銃撃多重奏RPG”の名は伊達じゃない! 『エンド オブ エタニティ』体験レポ
- 『エンド オブ エタニティ』はストーリー、バトル、楽曲にこだわった作品 - ファミ通.com
- 【TGS2009】銃撃RPG『エンド オブ エタニティ』の戦闘システムを体験/ゲーム情報ポータル:ジーパラドットコム
- IGN Video: Resonance of Fate Xbox 360 Trailer - TGS 09: Trailer
ファイナルファンタジー・クリスタルクロニクル クリスタルベアラー
シリーズを重ねる度に“おもしろそう”になってるのでそろそろ良いかも。
.hack//Link
あのドットハックがまさかの復活w というわけで今回もアニメ展開とかするみたいですね。ゲームとしては普通ポイ気がしますが。
テイルズ オブ グレイセス
これはWiiかな。おっさんが出てこなさそうな雰囲気だなあ。大丈夫かいな。つか、TOVとか見た後にこれ見るとローポリローレゾテクスチャが目に染みます・・・。
画面とか記事とかを見て気になったもの
AGAIN FBI超心理捜査官
雰囲気的にDSのゲームぽいなとか思ったけどPS3用なのか・・・。そんなにスペック必要?メディア?
暗闇の果てで君を待つ
一応、乙女ゲーっていう括りだけど、脱出系ADVらしいので注目。「遺作」とか「慟哭、そして・・・」みたいなゲームだったらいいな。
ニーア ゲシュタルト
ちゃんと見てないけど・・・ん? ワンダと巨像?w
- 4Gamer.net ― [TGS 2009]Xbox 360「ニーア ゲシュタルト」プレイレポ。使う武器次第で,まったく違ったプレイ感覚に(ニーア ゲシュタルト)
- Nier Gestalt Video Game, TGS 09: Japanese Trailer | Game Trailers & Videos | GameTrailers.com
- Nier Gestalt Video Game, TGS 09: Slash Gameplay (Cam) | Game Trailers & Videos | GameTrailers.com
- Nier Gestalt Video Game, TGS 09: Boss Gameplay (Cam) | Game Trailers & Videos | GameTrailers.com
Dead Space Extraction (Wii)
INFAMOUS 〜悪名高き男〜
ジェットセットラジオを彷彿とさせるTPS。自由度次第。
SILENT HILL SHATTERED MEMORIES
サイレントヒルの最新作。国内発売されないのってこれかな? ライトを周囲に当てながらの探索は「零〜月蝕の仮面〜」ぽさがある。ような気がする。
へんなの
EyePet
ARなペット育成もの。応用的な利用が出来ると楽しいかも。
買った本の列挙など
ここんところ図書館ではちょこちょこ借りてそれを読んだりしてたんだけど、本を買うという行為をしてなかったので記念に書いときます。
だから、この漫画が好きだ!
泣きました
久々のヒットキャラ野口君(※高2)
零ちゃん≧親父達
いきなり漫画ですけど・・・。本には間違いないっ。
んで、羽海野 チカさんの「3月のライオン 3巻」。おっさんが格好良いです。
私なんかがあれこれ書いた感想とか読むよりアマゾンレビューのすずなみさんという方のレビューを読んだ方がいいですよ。100%同意な素晴らしいレビューです。(すり替え)
あと2冊買ったんですけど、そっちはまだ読んでないです。ゆっくりと読む時間を作りたいもんですが〜。
価格見ないでレジに持っていったんですけどちょっと値段に引きましたw しかし、値段分は楽しんでみせますよ! ああ、楽しむさっ!
みーまーの方に至っては 『 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/</</g; $msg =~ s/>/>/g; $msg =~ s/"/"/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
が正式リリースされたみたいなのでインストールしてみました。
普段はFirefox使ってるんですけど、ニコニコ動画とかのFlashな動画コンテンツはOperaで見てます。
Firefoxで見てるとクソ重くなる上に消費メモリ倍増なので・・・。(Firefoxで重いなーって思っている方は一度Operaを使ってみて欲しいよ)
では、ダウンロードも終わったことだし、インストール開始!
・・・・・。
・・・・・。
・・・・・。
なんか変わった?www
- 窓の杜 - 【NEWS】Opera、“Opera Turbo”機能を搭載した「Opera 10」の正式版を公開
- Opera 10ついに正式リリース: Turbo機能も完璧に動作します
- Opera 10正式版が登場、Opera Turboなど新機能を搭載 | パソコン | マイコミジャーナル
Turboが一押しの機能なのかこれ・・・。あと目に付いたのはタブのサムネイル表示くらい?
- タブのサムネイル
タブ下の部分をぐにょ〜んとドラッグするとタブがサムネイル表示になります。
↓↓ みょ〜ん
こんな感じ。(ちなみに opera_standard_slim-0_17 というテーマを使用)
あと、なんかサーバーになる機能っぽいのがあったような気がしたけど。載ってるのかねえ。(このバージョンでは見送られたらしい)
Operaはかなり軽くて良いブラウザですよ。今のところ、ちょっとだけFirefoxの方が機能的に気に入ってるので(これは拡張機能による所が大きいけど)Firefoxをメインに使ってるけどね。
あとたまにOperaで見てると変になるサイトとかあるけど。標準化がもっと進めばそんなこともなくなるでしょ。
それとSilverlight周りもしっかりしてくれないかな〜と思ってたら、Opera 10では結構ちゃんとしてるっぽい。(あいまいw) あいかわらずSilverlightのサイトのシステム要件には記載されてないけどwww
と、書くことが何にも無いんだけど無理やりエントリにしてみる今日この頃www