Twitterの1日分のタイムラインをKindleで読む

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

時間かけて探せば良い感じのが有りそうだけど、すぐには見つからなかったのでperlで書いてみた。

仕様的なもの。

  • 常駐せずに、10分おきくらいにcronで動かす。
  • 1日分のtweetは、$timeline_fileに溜め込む。
  • 1日分の切り替えは、Log::Dispatch::FileRotateに任せる。
    (微妙にずれる場合もあるけど、細かいことは(゚ε゚)キニシナイ!!)
  • $timeline_fileへの出力は、Log::Log4perl の INFOで。
  • kindleへ送信するタイミングは、$timeline_fileのサイズが小さくなったら。
    (FileRotateで切り替わったらファイルサイズが小さくなるので、それ契機)
  • kindleへの送信するデータは、htmlファイル。
  • 送信先は、@kindle.com or @free.kindle.com。
    (自動的に変換して、端末へ配信してくれる)

gettimeline.pl(gettimeline.zip)


#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use Encode;
use DateTime;
use DateTime::TimeZone;
use DateTime::Format::DateParse;
use Data::Dumper;
use HTML::Entities;
use MIME::Lite;

use Net::Twitter;
use Log::Log4perl qw(:easy);

# Twitter key and token
my $consumer_key = 'xxxxxxxxxxxxxxxxxxxxx';
my $consumer_secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy';
my $token = 'nnnnnnnnnn-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
my $token_secret = 'sssssssssssssssssssssssssssssssssssssssssss';

# log
my $logfile = '/home/user/tool/twitter.log';
my $timeline_file = '/home/user/tool/timeline.log';

# mail
my $mailfrom = 'xxxx@xxx.xxx';
my $mailto = 'yyyyy@free.kindle.com';

# title
my $title_fmt = 'Twitter_Timeline_%Y-%m-%d(%a)';


my $tid_prefix = '__TID__:';
my $tz = DateTime::TimeZone->new(name => 'local');

&loginit;

&main;

exit;

sub main{
    my $filesize = -s $timeline_file;

    &gettl;

    if($filesize > -s $timeline_file){
	say 'send to kindle';
	&send2kindle;
    }
}

sub send2kindle{
    my $dt = DateTime->now(time_zone => $tz);
    $dt->subtract(days => 1);
    my $title = $dt->strftime($title_fmt);
    my $fname = $title . '.html';

    my $timeline_file1 = $timeline_file . '.1';
    open my $fh, '<', "$timeline_file1"
	or die "failed to open file: $!";
    my $rawdata = do { local $/; <$fh> };

    my @rawdata_array = grep(!/^$tid_prefix \d+$/, split(/\n/, $rawdata));


    my $htmldata = <<_HEADER_;
<html>
  <head>
    <title>$title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
<body>
  <h3>$title</h3>
<pre>
_HEADER_

    $htmldata .= Encode::decode_utf8(join("\n", @rawdata_array));

    $htmldata .= <<_FOOTER_;
</pre>
</body>
</html>
_FOOTER_

    my $subject = $title;

    my $msg = MIME::Lite->new(
	From => "$mailfrom",
	To => "$mailto",
	Subject => "$subject",
	Type => 'multipart/mixed'
    );
    $msg->attach(
	Type => 'text/plain; charset="iso-2022-jp"',
	Data => "no body"
	);
    $msg->attach(
	Type => 'text/html',
	Data => "$htmldata",
	Filename => "$fname",
	Disposition => 'attachment'
	);
    $msg->attr('content-type.charset' => 'UTF-8');

#    WARN Dumper($msg);
#    WARN $htmldata;

    $msg->send();

}

sub gettl{
    my $nt = Net::Twitter->new(
	traits => [qw/OAuth API::REST/],
	consumer_key => $consumer_key,
	consumer_secret => $consumer_secret,
	access_token => $token,
	access_token_secret => $token_secret,
	);

#    WARN "TWEET: " . $tweet;

    my @tl = $nt->home_timeline({count => 200});

    my @rtl = reverse(@{$tl[0]});

    my $tail_cmd = "tail -2 $timeline_file";
    my $grep_cmd = "grep -e \"$tid_prefix [0-9]\\+\"";
    my $sed_cmd = "sed -r \"s/[^0-9]+([0-9]+)/\\1/\"";
    my $lastid = `$tail_cmd | $grep_cmd | $sed_cmd`;
    chomp $lastid;

    if($lastid){
	for my $i (0 .. $#rtl) {
	    if($lastid eq $rtl[$i]->{id}){
#say "0 -> " . $i . " ($#rtl)";
		splice(@rtl, 0, $i+1);
#say "  -> " . $#rtl;
		last;
	    }
	}
    }

    my $id = '';
    foreach my $t(@rtl){
	WARN $t->{id};
	$id = $t->{id};
	my $s = &mklinktag($t->{text});
	my $dt = DateTime::Format::DateParse->parse_datetime($t->{created_at});
	$dt->set_time_zone($tz);

	INFO encode_utf8($t->{user}{name}) .
	    ' (<a href="https://twitter.com/' . $t->{user}{screen_name} . '">' .
	    '@' . $t->{user}{screen_name} . '</a>)' . "\n" .
	    encode_utf8($s) . "\n" .
	    $dt->strftime('(%Y/%m/%d %H:%M:%S)') . "\n";
#	WARN Dumper($t);
	WARN Dumper($s);
    }
    INFO "$tid_prefix " . $id . "\n" if $id;
}

sub mklinktag{
    my ($s) = @_;

    $s = encode_entities($s, q{&<>"'});

    $s =~ s!(https?://)([0-9a-zA-Z/\.]+)!<a href="$1$2">$2</a>!go;

    $s =~ s!@([a-zA-Z0-9_]+)!<a href="https://twitter.com/$1">\@$1</a>!go;

    $s;
}

sub loginit{
  my $logsize = 10*1024*1024;
  Log::Log4perl->init(\ qq{
    log4perl.logger = INFO, AppError, Tweet

    # filter range
    log4perl.filter.MatchRange               = Log::Log4perl::Filter::LevelRange
    log4perl.filter.MatchRange.LevelMin      = WARN
    log4perl.filter.MatchRange.LevelMax      = ERROR
    log4perl.filter.MatchRange.AcceptOnMatch = true

    # Error appender
    log4perl.appender.AppError = Log::Dispatch::FileRotate
    log4perl.appender.AppError.filename   = $logfile
    log4perl.appender.AppError.max   = 10
    log4perl.appender.AppError.autoflush   = 1
    log4perl.appender.AppError.size   = $logsize
    log4perl.appender.AppError.mode = append
    log4perl.appender.AppError.layout   = Log::Log4perl::Layout::PatternLayout
    log4perl.appender.AppError.layout.ConversionPattern = %d %02X{client} %p %F{1} %L: %m %n
    log4perl.appender.AppError.Filter   = MatchRange

    # Filter to match level WARN
    log4perl.filter.MatchInfo  = Log::Log4perl::Filter::LevelMatch
    log4perl.filter.MatchInfo.LevelToMatch  = INFO
    log4perl.filter.MatchInfo.AcceptOnMatch = true

    # Error appender
    log4perl.appender.Tweet = Log::Dispatch::FileRotate
    log4perl.appender.Tweet.filename   = $timeline_file
    log4perl.appender.Tweet.max   = 10
    log4perl.appender.Tweet.autoflush   = 1
    log4perl.appender.Tweet.DatePattern = yyyy-MM-dd
    log4perl.appender.Tweet.TZ = JST
    log4perl.appender.Tweet.mode = append
    log4perl.appender.Tweet.layout   = Log::Log4perl::Layout::PatternLayout
    log4perl.appender.Tweet.layout.ConversionPattern = %m %n
    log4perl.appender.Tweet.Filter   = MatchInfo
 });
}

↑のコードで送信されたファイルのスクリーンショットが↓。

screenshot_2013_05_19T09_28_12 0900

アイコンとかも持って来たほうが見栄えが良いんだろうけど、とりあえずシンプルなこれで使ってみる。

カテゴリー: ソフトウェア, プログラム | タグ: , , , , | コメントする

Log4perlでスレッドIDを出力する

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Log4perlでスレッドIDを出力する方法が分からなかったのでググったところ、
以下の頁が参考になった。

Log4perl log rotation in threadpool environment
Log::Log4perl::MDC – search.cpan.org


#!/usr/bin/perl

use strict;
use warnings;

use threads;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init({level => $INFO, layout => "%d %02X{TID} %p %F{1} %L> %m %n"});

# 標準エラーのバッファリングを止める
use IO::Handle;
STDERR->autoflush;

# メインスレッドを0
Log::Log4perl::MDC->put("TID", '0');


my ($thr1, $thr2, $thr3) = (0) x 3;
$thr1 = threads->create(\&func);
INFO 'threads create: tid='.$thr1->tid();

$thr2 = threads->create(\&func);
INFO 'threads create: tid='.$thr2->tid();

$thr3 = threads->create(\&func);
INFO 'threads create: tid='.$thr3->tid();

$thr1->join();
$thr2->join();
$thr3->join();

sub func{
    Log::Log4perl::MDC->put("TID", threads->tid());

    INFO 'start';

    my $w = int(rand 10);
    INFO 'wait: ' . $w;
    sleep $w;

    INFO 'end';
    Log::Log4perl::MDC->remove();
}

↑のスクリプトを実行した場合、↓のような出力が得られる。

% perl log_threads.pl
2013/05/05 00:20:02 01 INFO log_threads.pl 34> start
2013/05/05 00:20:02 00 INFO log_threads.pl 19> threads create: tid=1
2013/05/05 00:20:02 01 INFO log_threads.pl 37> wait: 6
2013/05/05 00:20:03 00 INFO log_threads.pl 22> threads create: tid=2
2013/05/05 00:20:03 02 INFO log_threads.pl 34> start
2013/05/05 00:20:03 02 INFO log_threads.pl 37> wait: 2
2013/05/05 00:20:03 00 INFO log_threads.pl 25> threads create: tid=3
2013/05/05 00:20:03 03 INFO log_threads.pl 34> start
2013/05/05 00:20:03 03 INFO log_threads.pl 37> wait: 3
2013/05/05 00:20:05 02 INFO log_threads.pl 40> end
2013/05/05 00:20:06 03 INFO log_threads.pl 40> end
2013/05/05 00:20:08 01 INFO log_threads.pl 40> end

カテゴリー: プログラム | タグ: | コメントする

標準SIMをカットしてmicroSIMに・・・失敗

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

・IIJmioの標準SIM(ミニマムスタートプラン契約)
・SC-03E(SIMの形状はmicroSIM)
が手元にあったので、SC-03Eでも使えるか(テザリング等も含めて)試してみたくなった。

標準SIMをmicroSIMにカットするのは問題ないか調べた所、IIJmioさんが以下の発言をされていた。

とカットする事についてはご自由にどうぞと。カットしたSIMの契約を解除するとき、SIMカードの返却は?手数料掛かる?ってのも心配になったけど、IIJmioの公式HPのFAQに

5. SIMカードを返却できなかったらどうなりますか?

SIMカードを返却いただかなかったことによる請求等はありません。

(https://www.iijmio.jp/guide/faq/hdd/faq.jsp より)

とあるので、返却しなくても手数料が掛かるとかは無さそう。

なので、早速、右側の標準SIMを左側のmicroSIMになるようカッターで削って・・・
IMG_3465 IMG_3468

刺さった!電源たちあげて認識も出来た!
IMG_3469IMG_3472
・・・が、どうにもこうにも取り出せなくなってしまった。
おそらく縦を削りすぎて、横は削らなすぎた模様。(SIMカード刺す時、ちょっときつかったし、奥まで押し込んでもカチっと言わなかったし・・・)

ま、いっか。

SPEEDTEST.NETで測定してみた。

Screenshot_2013-03-11-23-06-10Screenshot_2013-03-11-23-07-17Screenshot_2013-03-11-23-08-28

UPLOADの400kbpsは嘘くさいけど、128kbpsは余裕でオーバーしていて良い感じ。

カテゴリー: モバイル | タグ: , | コメントする

IIJmio 高速モバイル/Dプラン契約(ライトスタートプラン)

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

ミニマムスタート128プランで使っていて、メール見たりするくらいなら問題はないけど、重めのWebサイトを見ると、イラッとすることがあるので、ライトスタートプランに変更したかった。・・・が、プランを変更するには一度解約して、契約し直さないとダメらしく、面倒だし手数料かかるしで二の足を踏んでいたけど、以下のツイートを見てキャンペーンの内容次第で契約しようかなと考えていた。

 

職場付近のイオンにちょくちょく足を運んでいた所、3/1に「ウェルカムパック+HE-WR01(ワイヤレスルータ)」で¥3,150というキャンペーンをやっていたので、つい購入してしまった。ミニマムスタートプランはまだ解約していないので、現在2回線ある。

iijmio_0001iijmio_0002iijmio_0003iijmio_0004

ワイヤレスルータは売ろうと思ってたけど、売りに行くのが面倒だったので試しに使ってみた。

HE-WR01_0001HE-WR01_0002HE-WR01_0003HE-WR01_0004HE-WR01_0005HE-WR01_0007HE-WR01_0009HE-WR01_0012
かなり分厚いので、iPodTouchに装着して使う気にはなれない。

3G通信モジュール(CTM-600W)の取り外し方の説明が入ってたけど、「※2012年10月現在、弊社で確認できておりますCTM-600W対応製品はございません」と。。
image

電源を入れてHE-WR01へ接続。(パスワード: info+MACアドレスの下6桁を小文字で)
HE-WR01_0017HE-WR01_0018HE-WR01_0019

USIMを刺さずに、ブラウザから接続してみる。(ユーザ:user, パスワード:user)
HE-WR01_0020HE-WR01_0021HE-WR01_0022HE-WR01_0023HE-WR01_0024HE-WR01_0025

ミニマムスタートプランのUSIM挿してから再度アクセス。
HE-WR01_0026HE-WR01_0027HE-WR01_0028HE-WR01_0029

ネットワーク接続設定(ID:mio@iij, パスワード:iij, ServiceNumber: *99***2#)
HE-WR01_0030HE-WR01_0031

PDP(Packet Data Protocol)設定(CID:*99***2#, PDP Type: IP, APN: iijmio.jp)
HE-WR01_0033HE-WR01_0034HE-WR01_0035

再起動
HE-WR01_0036HE-WR01_0037HE-WR01_0038

IPアドレスが取得で来てる事を確認。
HE-WR01_0039HE-WR01_0040HE-WR01_0041

他の設定を眺めてみる。
HE-WR01_0042HE-WR01_0043HE-WR01_0044HE-WR01_0045HE-WR01_0046HE-WR01_0047HE-WR01_0048

SSID Broadcastのチェックを外して、ステルスモードにしておく。設定を反映するには再起動。
HE-WR01_0049HE-WR01_0050HE-WR01_0051HE-WR01_0052

ミニマムスタートプランを解約するまでは使うかも。

カテゴリー: モバイル | タグ: , , , , | コメントする

収納用品を細々と購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

ドアの上部に取り付けて、ハンガーを掛けれるようにする奴。ウォールポケットを取り付けたくて購入。
耐荷重:3kg
¥1,150。

IMG_3410IMG_3412IMG_3413IMG_3415IMG_3416IMG_3420

DMとか小物を入れるようにウォールポケット購入。
耐荷重:1.5kg
¥1,523。

IMG_3417IMG_3418IMG_3419IMG_3425

吊戸棚?に取り付けるカゴ。収納スペースを増やしたくて購入。
耐荷重:2kg
¥975。

IMG_3433IMG_3434IMG_3435IMG_3436IMG_3439

冷蔵庫にマグネットで貼り付けられる小物入れ。キッチンペーパーも取り付けられる。
耐荷重:2kg
¥617。

IMG_3441IMG_3442IMG_3444IMG_3447

レンジの上に物置くために購入。
耐荷重:5kg
¥1,651。

IMG_3426IMG_3427IMG_3428IMG_3429

カテゴリー: その他 | コメントする

コーヒー豆を入れる用にキャニスターを購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

amazon.co.jpで、¥641。
容量:750ml
本体重量:730g

結構な重量感。
IMG_3383IMG_3388IMG_3390
少量の水を入れて、ちゃんと密閉されている事も確認。

残っていたコーヒー豆(たぶん120gくらい)を入れてみた。
IMG_3392
コーヒー豆200gくらいは余裕で入る模様。
 
一週間後くらいに、もう一つ購入。

イオンで、¥498。
容量:420ml
本体重量:250g

コンパクトで、コーヒー豆100gが入る容器が欲しくて探してたら発見。
S3 と L3 が置いてあって、L3は、S3 2つ分の大きさだった。
コーヒー豆100g入れるには、S3では無理っぽかったのでL3を購入。

IMG_3400IMG_3402IMG_3404IMG_3405

グァテマラSHB 100g+おまけ付!【メール便発送】:コーヒー豆専門店ボレロコーヒーを購入して届いたので、そのコーヒー豆 100gを入れてみた。
IMG_3409
ピッタリ。密閉性も問題なし。
たまに開けづらい時があるけど、握力鍛えれば問題なし。たぶん。

カテゴリー: その他 | タグ: , | コメントする

Amazonで購入したキャニスターが初期不良だったので返品

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

ハンドドリップブーム継続中につき、コーヒー豆を入れるため、おしゃれなキャニスターを購入してみたけど、運悪く初期不良に遭遇。
泣き寝入らず返品したので、忘れないようにメモ。
デザインが素敵だったので交換でも良かったんだけど、そこまで必要じゃなかったし。

IMG_3374IMG_3381IMG_3377IMG_3379

初期不良の現象は、↓の赤丸の所に小さな隙間があって密閉されていない。
目で見ても分からないけど、少量の水を入れて、蓋を閉めて逆さにすると、水が漏れて来て判明。
IMG_3376

↑の旨をまず「https://www.amazon.co.jp/gp/help/customer/」に問い合わせる。
いきなり返品したら、仕様だから返品できないとか言われると困るので。(言われることがあるのか知らないけど)

1.お問い合わせの種類を選択してください
「注文について」を選択
2.お問い合わせ内容を選択してください (選択いただいた内容にあわせて、適切な部署からご案内させていただきます)
以下を選択
お問い合せ内容:「商品のトラブル」
詳細内容:「商品に不具合がある、もしくは付属品が足りない」
3.お問い合わせ方法を選択してください
「Eメール」を選択

1/19 21:00くらいに問い合わせたら、同日23:00くらいに、
以下の様な返信があった。


Subject: Amazon.co.jpへのご注文について(#???-???????-???????)

○○様

Amazon.co.jpにご連絡いただき、ありがとうございます。

このたびはお届けした商品『・・・』につきまして、ご迷惑をおかけしておりますことをお詫び申し上げます。

お問い合わせの商品は、商品到着後30日以内に限り、返金または交換を承ります。お手数ですが、以下の内容をご確認のうえ、返品受付センターでお手続きいただきますようお願いいたします。

1. 「返品受付センター」(http://www.amazon.co.jp/henpin) にアクセスします。
2. 「購入商品を返品する」ボタンをクリックします。
3. Eメールアドレスとパスワードを入力し、サインインします。
4. 該当の注文番号の右横にある「この注文の商品を返品する」ボタンをクリックします。
5. 該当する商品にチェックを入れ、返品理由をドロップダウンメニューより選びます。
6. コメント欄に説明を入力し、「次に進む」ボタンをクリックします。
7. 「返金」または「交換」を選択して、「次に進む」ボタンをクリックします。
8.返送方法をご確認のうえ、「次に進む」ボタンをクリックすると、手続き完了です。

返品受付センターでの手続き完了後、確認のEメールをお送りします。

お手数ですが、お手元にある商品は、返品受付期間内に日本郵便株式会社集荷サービス、宅配便または郵便局のゆうパックを使って着払いでご返送ください。詳しい返送手順は、返品受付センターでの手続き完了後に表示されるページ、または確認のEメールに記載されているURLのページでご確認いただけますので必ずお読みください。

その他、ご不明な点がありましたらご遠慮なくお問い合わせください。

ご不明な点がある場合は、このEメールに返信または以下のURLから再度カスタマーサービスまでお問い合わせください。
http://www.amazon.co.jp/contact-us/
・・・

↑の手順通り進めると、次に、↓のようなメールが届く。1/19 23:55くらい。


Subject: Amazon.co.jpでのご注文の返品(#???-???????-???????)

返品受付センターをご利用いただき、ありがとうございます。

以下のリンクから返品用ラベルを印刷してご利用ください。返送の手順についても、以下のページでご確認いただけます。

https://www.amazon.co.jp/gp/orc/rml/xxxxxxxxxx

返金をご希望の場合は、お客様から返送された商品を受領後、返金手続きを開始します。 返金処理には、商品受領後、通常1~3日(代金引換の場合は通常1週間程度)かかります。返金手続きが完了した際には、返金完了メールをお送りします。
・・・

上記メールのリンク先(xxxxxxxxxx は返信用ID番号が入る)に、以下の住所へ着払いで送ってくれと書いてあった。


〒272-0127
市川市塩浜 2-13-1
アマゾン 返品係

ラベルを貼るノリが無かったので、ヤマト運輸の「宅急便送り状印字サービス」を使って発送。

1/22 10:30頃に↓。

Subject: Amazon.co.jpからのお知らせ:返品のご確認(# ???-???????-???????)

いつもAmazon.co.jp をご利用いただき、ありがとうございます。

お客様にご返送いただいたご注文番号???-???????-???????の商品を、当サイトの返品受付センターで受け取りましたので、お知らせいたします。

Amazon.co.jp のまたのご利用を、心よりお待ちしております。

このEメールアドレスは、配信専用です。このメッセージに返信しないようお願いいたします。

1/22 11:10頃に↓。

Subject: ご注文の返金について(???-???????-???????)

Amazon.co.jpをご利用いただき、ありがとうございます。

ご注文(注文番号:???-???????-???????)に対して、お客様へ¥1,529の返金処理が完了しましたので、ご連絡いたします。

この返金は以下の商品に対する返金です。

商品: パール金属 アルゴ 密閉容器(M)角タイプ CUP(フロスト) MK-4152
個数: 1
ASIN: B000IC597E
理由: ご返品

返金の詳細は以下の通りです。

商品代金: ¥1,456
商品代金消費税: ¥73
・・・

すんなりと返品完了。

カテゴリー: その他 | タグ: , | 5件のコメント

iPod touch 32GB (MD720J/A) 購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

ビックカメラで¥24,800。
以前買った、iPod touch 4thの電池持ちが悪くなってきたのと、脱獄した後、挙動がおかしくなることが多くなったので、新しいiPod touchを購入することに。
復元すりゃ良いって話もあるけど、まぁ、それは置いといて。

ついでに、iPod touch 4thのコネクタを、新コネクタに変換するアダプタも購入。 ¥2,800。

 

iPodTouch5th_0005iPodTouch5th_0001iPodTouch5th_0002iPodTouch5th_0003iPodTouch5th_0007

付属品。イヤホンが変わった形をしてらっしゃる。使わないけど。
iPodTouch5th_0008iPodTouch5th_0009iPodTouch5th_0010iPodTouch5th_0011

iPodTouch5th_0012iPodTouch5th_0013

iPodTouch5th_0014iPodTouch5th_0015iPodTouch5th_0017iPodTouch5th_0019iPodTouch5th_0020iPodTouch5th_0021iPodTouch5th_0022

iPodTouch4th(右)と並べてみる。縦の長さ以外は大体同じ。
iPodTouch5th_0023iPodTouch5th_0025iPodTouch5th_0026

ケースを買い忘れたので、後日、Amazon.co.jpで↓を購入。

¥1,098。

iPodTouch5th_0202iPodTouch5th_0203iPodTouch5th_0204iPodTouch5th_0205iPodTouch5th_0206

装着後。ぴったりフィットして良い感じ。
iPodTouch5th_0208iPodTouch5th_0209iPodTouch5th_0211iPodTouch5th_0212

液晶保護フィルム
iPodTouch5th_0200iPodTouch5th_0207

 

続きを読む

カテゴリー: その他, モバイル | タグ: , , , , , , | コメントする

電気ケトル(ハリオ V60 細口パワーケトル・ヴォーノ EVKB-80HSV)を購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Amazon.co.jpで、¥4,700。
ハンドドリップブームが未だ継続中。
ドリップしやすい電気ケトルが欲しくて、

と迷った。ELP-800のレビューに、残量が少なくなるとお湯のラインが太くなる旨の記述があり、それが嫌で、ハリオの細口の方を購入。

 

EVKB-80HSV_0002EVKB-80HSV_0004
EVKB-80HSV_0010

今まで使ってた、PO-105BK(左)と並べてみた。だいたい同じ大きさ。
EVKB-80HSV_0017

最初はやっぱ臭いが気になったので、MAXまで水入れて、重曹を入れて沸騰させてすすぐと、気にならないくらいまでになった。
その後、試しにドリップしてみると、コーヒー粉が今までよりきれいに膨らみ良い感じに入れられた。今までは調整が難しくお湯を入れすぎていたのだろう。

さて、次はどのコーヒー器具が欲しくなるのだろう。。

 

続きを読む

カテゴリー: その他 | タグ: , , | コメントする

WWW::Mechanizeが便利

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

WWW::Mechanize – search.cpan.org

WWW::Mechanize, or Mch for short, is a Perl module for stateful programmatic web browsing, used for automating interaction with websites.

Features include:

  • All HTTP methods
  • High-level hyperlink and HTML form support, without having to parse HTML yourself
  • SSL support
  • Automatic cookies
  • Custom HTTP headers
  • Automatic handling of redirections
  • Proxies
  • HTTP authentication

Mech supports performing a sequence of page fetches including following links and submitting forms. Each fetched page is parsed and its links and forms are extracted. A link or a form can be selected, form fields can be filled and the next page can be fetched. Mech also stores a history of the URLs you’ve visited, which can be queried and revisited.

websiteとの対話を自動化するモジュール。

RSSフィード配信サービスを利用していると手動で指定先へ送信するのは無料だけど、定期的に指定先へ送信するのは有料みたいなのがよくある。(例えば、kindlefeeder.comとか)
そういうサービスも、Mechanize使ってスクリプト書いて、cronで回せば無料で定期的に送信可能。

kindlefeeder.comだと


#!/usr/bin/perl

use WWW::Mechanize;

my $mech = new WWW::Mechanize( autocheck => 1, agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)' );

$mech->get('http://kindlefeeder.com/users/xxxxx');

# login
$mech->submit_form(
    fields => {
        login => 'username',
        password => 'passwd',
    },
    );

# submit
my $response = $mech->submit_form(
    form_number => 2,
    );

みたいな感じで。まぁ、ページの内容が変わると、その都度対応必要だけど。

カテゴリー: プログラム | タグ: , , , , , , | コメントする