ThunderbirdでドコモメールをGmailに自動転送する

方法を色々と調べてみたのだけど、結論としてはIMAPフォルダーに直接コピーする方法が一番よさそう。

IMAPからみるとGmailのラベルはフォルダーになっているようなので、Inboxと好きなラベル(Mobame)に2つコピーをしている。あとは念のためローカルにもコピー。
ドコモが自動転送をサポートすれば何の問題もないのだけど。あるいはモバメが好きなメールアドレスを使わせてくれれば。

補足

Thunderbirdから転送をすると、Fwd:(件名)みたいなsubjectになったり、差出人が自分の名前になったりしてイマイチ。

公式の拡張機能としてヘッダーをそのままリダイレクトするものもあるけど、どうにも癖があって期待通り動かなかったりする。たぶんSMTPサーバーの動きによるものだと思う。

dropbox-api-commandをCygwinで使うメモ

Perlで実装されたdropboxAPIを使ってUNIX likeなコマンドラインインターフェイス。でいいかな。これは便利。

インストールはReadme通りに

wget https://raw.github.com/miyagawa/cpanminus/master/cpanm
perl cpanm App::dropboxapi

でよい。

Cygwinで使うときはLANGをUTF-8にしておくと日本語ファイルが文字化けしなくて便利。

$ export LANG=ja_JP.UTF-8

あと、syncの挙動を変えたかったのでちょっと中身をいじった。

$ diff /usr/local/bin/dropbox-api /usr/local/bin/dropbox-api.org
34d33
< unless($command){help('help'); exit(1)};
579c578
<                 (($remote_size != $local_size) and ($remote_epoch > $local_epoch)) or
---
>                 ($remote_size != $local_size) or
704c703
<                 if ((($remote_size != $local_size) and ($remote_epoch < $local_epoch)) or
---
>                 if (($remote_size != $local_size) or
  • 引数無しで実行した時にはhelpを出して終了
  • syncの際にファイルを上書きする条件を変更(サイズが違う&更新時間が新しいときにする)

ファイルの変更を行う時の条件はもっときめ細かくオプションで指定できると便利かなー。まあ適宜調節していけばよいか。

追記 2016/11/11

最新版では、こんな感じになってスッキリしていた。ほんとは != じゃなくて大小も判定したいけど、まあ実用上不都合もなさそうだからこのままでいいか。

   1114 sub has_change ($$) {
   1115     my ($local_path, $content) = @_;
   1116
   1117     my $remote_epoch = $strp->parse_datetime($content->{client_modified})->epoch;
   1118     my $local_epoch = $local_path->stat->mtime;
   1119     my $remote_size = $content->{size};
   1120     my $local_size = $local_path->stat->size;
   1121
   1122     if ($debug) {
   1123         printf "remote: %10s %10s %s\n", $remote_epoch, $remote_size, $content->{path_display};
   1124         printf "local:  %10s %10s %s\n", $local_epoch, $local_size, decode('locale_fs', $local_path);
   1125     }
   1126
   1127     if (($remote_size != $local_size) || ($remote_epoch != $local_epoch)) {
   1128         return 1;
   1129     }
   1130
   1131     return;
   1132 }
   1133

Cygwinでcronを使うときのメモ その2

cygwinでcron使おうとすると毎回何かしらはまってる気がする。

Cygwinでcronを使うときのメモ - XXXannex

今回はこんな感じのエラーが出た。

$ cronevents | tail
..
2015/07/17 12:14:01 [SYSTEM] /usr/sbin/cron: PID 5676: (k) CMD (/usr/bin/echo aa)
2015/07/17 12:14:01 [SYSTEM] /usr/sbin/cron: PID 5676: (CRON) error (can't switch user context)

詳細はよく分からないけど、passwd -R でパスワードをレジストリに保存しておいて、"Do you want the cron daemon to run as yourself?" の質問は "no" で答えると良いみたい。

$ passwd -R
This functionality stores a password in the registry for usage by services
which need to change the user context and require network access.  Typical
applications are interactive remote logons using sshd, cron task, etc.
This password will always tried first when any privileged application is
about to switch the user context.

Note that storing even obfuscated passwords in the registry is not overly
secure.  Use this feature only if the machine is adequately locked down.
Don't use this feature if you don't need network access within a remote
session.

You can delete the stored password by specifying an empty password.

Enter your current password:
Re-enter your current password:
$ cron-config
The cron daemon can run as a service or as a job. The latter is not recommended.
Cron is already installed as a service under account LocalSystem.
Do you want to remove or reinstall it? (yes/no) yes
OK. The cron service was removed.

Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ]

You must decide under what account the cron daemon will run.
If you are the only user on this machine, the daemon can run as yourself.
   This gives access to all network drives but only allows you as user.
To run multiple users, cron must change user context without knowing
  the passwords. There are three methods to do that, as explained in
  http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1
If all the cron users have executed "passwd -R" (see man passwd),
  which provides access to network drives, or if you are using the
  cyglsa package, then cron should run under the local system account.
Otherwise you need to have or to create a privileged account.
  This script will help you do so.
Do you want the cron daemon to run as yourself? (yes/no) no

Were the passwords of all cron users saved with "passwd -R", or
are you using the cyglsa package ? (yes/no) yes
The cron daemon will run as SYSTEM.

Running cron_diagnose ...
... no problem found.

Do you want to start the cron daemon as a service now? (yes/no) yes
OK. The cron daemon is now running.
(以下略)

怪文書

はてなダイアリーの下書きを整理してたら謎の怪文書が。消すには惜しいし、残しておくには怪文書すぎるし、と思ってここに貼っておく。2009-11-10 23:32:23 更新らしい。昔すぎて何のことやらですな。
いや、何の話をしてるかは分かるけど、やっぱり怪文書としかいいようのない不気味さを感じる。

逆算を重ねた計算通りでした。目的を達成するためには手段は選ばない

一番怖いのは「別に困ってない」「繋がりたきゃmixiでやれ」という意見。具体的に言えばXX

有形無形の無形とはそう言う意味。

1アクセスの多い場所で騒ぐ
2有名ブロガーが取り上げる
3話題になった頃を見てメール

いかにして釣るか…という話。
アクセスを稼げる記事。2chか増田だが…まず2chは却下、増田も微妙。となれば、自サイトでアクセスの見込める記事と言えば…

第一の関門は突破できた。では次の関門として、いかに釣るか。「不便」ではちと弱い、「アクセスが減る」も釣り餌としては取り上げにくかろう。では、それらによって、失われる本質的なものは何だ?と考えた挙げ句思い付いたのが「文化」。
これはすごいキャッチーじゃないか!ブログサービスの一機能が「文化」まで昇華し、それが今失われようとしてるんだよ。他のバグで「文化」まで失われることが果たしてあるだろうか?そう、これは単なるバグ報告ではない、我々の文化を取り戻す戦いなのだ!
このフレーズが思い浮かんだ瞬間、全てのシナリオが繋がりました。気分はすっかりブリタイ閣下、テンション高めで一気に書き上げました。
もちろん、キーワード調査に相応しく定量的な調査結果も付けて…。

その後の経過
身内(勝手に…)

http://d.hatena.ne.jp/kkobayashi_a/20090719/p2

自己実現理論 - Wikipedia
http://ja.wikipedia.org/wiki/%E8%87%AA%E5%B7%B1%E5%AE%9F%E7%8F%BE%E7%90%86%E8%AB%96

この辺を踏まえつつ、「帰属」欲求をくすぐる感じで。

-具体的な効果を
-定量的に
-最後は感情に訴える

危惧していたのが「売名」的なアレ。うまい隠れ蓑があってよかった。

ESDちゃんのRT & Fav

冬コミの原稿でRを全く触らなかった(グラフはRで書いたけど)のでリハビリも兼ねてESDちゃんのtwitterからメンバーごとのRTとFavの統計を求めることにした。

https://twitter.com/earthstar_dream

今現在350くらいしかpostしてないので簡単に全部のログを取ってこれる。

とりあえずこんな感じの入力ファイルを作る。

$ cut -c -70 esd_rtfav.txt | head -5
name    rt      fav     id      text
谷尻まりあ      3       5       555225418421112833      こんにちは。青の谷尻まりあです。「声
中島由貴        3       12      555129738151219200      アーススタードリーム中島由貴です?おは
曽我部英理      2       8       555025061426368512      こんばんは!オレンジの曽我部英理です
小出ひかる      2       12      555021299517374467      こんばんは?(*∩ω∩*)黄色の小出ひか

データはgithubにアップロードしようかと思ったけどgoogleでいいわ。

https://docs.google.com/spreadsheets/d/1b6mMbliVOAwspOO5dtCwdrWyzwknD8nCN5WI_x9GlDk/export?format=tsv

で、ggplot2でグラフにする。

library(ggplot2)
library(reshape2)
library(plyr)

# データ読み込み
d <- read.delim("esd_rtfav.txt", colClasses=c("character", "numeric", "numeric", "character", "character"))

# その他(運営とか)のpostを除外
d2 <- d[d[,1] != "その他",]

# ggplot2用にデータを加工
d.m <- melt(d2[,1:3])

# favのmedian順でfactorをソート
d.m[,1] <- factor(d.m[,1], levels=names(sort(tapply(d2[,3], factor(d2[,1]), median), dec=T)), ordered=T)

# plot
p <- ggplot(data=d.m, aes(x=name, y=value)) + geom_boxplot(aes(colour=variable), outlier.shape=NA) + theme(axis.text.x=element_text(angle=90)) + scale_y_continuous(limits=quantile(d.m$value, c(0, 0.9)))
ggsave(file="esd.png", plot=p)

# 参考1:最大RT/fav
ldply(by(d2, factor(d2[,1]), function(x){x[which.max(x$rt),]}))
ldply(by(d2, factor(d2[,1]), function(x){x[which.max(x$fav),]}))

# 参考2:post数
data.frame(count=sort(tapply(d2[,1], factor(d2[,1]), length), dec=T))

こんな短いコードで書けて便利だね!でもコードの書き方調べるのに5時間くらい掛かってるからExcelでやったほうが早いね!

fav数の中央値でx軸ソートしたけど、これを見るとゆっきーさおりん辺りが人気なのかなあ。さおりんは自撮りカワイイからね!

いづみんこと新井田いづみちゃん、favはそれほどでも無いけどRTが多い。スパルタンMXに出ていたようなので、その辺の身内関連なのかも。調べてないけど。

とは言え、こうして見ると多少の上下はあるものの、それほどRTやfavに格差が出てるわけでは無さそう。今のところは中島由貴ちゃんが比較的推されてる感あるけど、まだまだ横並びな感じですね。

個別のtwitterアカウントができればもう少し格差が広がっていくことになるのかなあ。社長の方針としては、まだ個別アカウントは作らないみたいなので、もうしばらく様子を見守ろう。

post数の統計

名前 post数
中島由貴 51
小出ひかる 38
斎藤愛永 33
谷尻まりあ 33
高尾奏音 32
愛原ありさ 30
村北沙織 27
新井田いづみ 26
曽我部英理 21

なるほど。

最大RT/favを達成したpostも調べたけど、「はじめまして」postがほとんどであんまり面白くない。

RT

愛原ありさ (30 RT)

高尾奏音 (25 RT) 斎藤愛永 (18 RT) 小出ひかる (35 RT)新井田いづみ (19 RT) 曽我部英理 (17 RT) 村北沙織 (14 RT) 谷尻まりあ (20 RT) 中島由貴 (32 RT)

fav

愛原ありさ (42 fav)

高尾奏音 (24 fav) 斎藤愛永 (24 fav) 小出ひかる (35 fav)新井田いづみ (23 fav) 曽我部英理 (33 fav) 村北沙織 (26 fav) 谷尻まりあ (24 fav) 中島由貴 (38 fav)

データ取得用コード

本文に名前か担当色が入っているかどうかで名前の判別をしている。

一番先にキーワードが出てきた人が投稿者だろうと仮定しているけど、ときどき誤検知をするので最終的には手動でチェックしないといかん。

use strict;
use warnings;
use Net::Twitter;
use Scalar::Util qw/blessed/;
use Getopt::Std;
use Encode;
use List::Util qw/reduce/;
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

my $opt = {};
getopts("n:p:c:", $opt);

my $name_table = {
  中島由貴     => '中島由貴|ゆっきー|白',
  高尾奏音     => '高尾奏音|のんのん|ピンク',
  小出ひかる   => '小出ひかる|ひかるん|黄色',
  斎藤愛永     => '斎藤愛永|ぴぃちゃん|水色',
  愛原ありさ   => '愛原ありさ|あーりぃ|赤',
  曽我部英理   => '曽我部英理|えりりん|オレンジ',
  谷尻まりあ   => '谷尻まりあ|まりあんぬ|青',
  新井田いづみ => '新井田いづみ|いづみん|黄緑',
  村北沙織     => '村北沙織|紫',
};

my $screen_name = $opt->{n} || 'earthstar_dream';
my $page        = $opt->{p} || 1;
my $count       = $opt->{c} || 20;

my $nt = Net::Twitter->new(
  traits   => [qw/API::RESTv1_1/],
  consumer_key        => $consumer_key       ,
  consumer_secret     => $consumer_secret    ,
  access_token        => $access_token       ,
  access_token_secret => $access_token_secret,
);

my $statuses = [];

while(1){
  print STDERR "getting page $page..\n";
  
  eval{
    $statuses = $nt->user_timeline({screen_name=>$screen_name, page=>$page, count=>$count});
    ### $statuses
  };
  if(my $err = $@){
    ### $err
    if(blessed $err && $err->isa('Net::Twitter::Error')){
      warn $err->error;
    }
    else {
      # something bad happened!
      die $err;
    }
  }
  last unless @$statuses;
  print_status($statuses);
  $page++;
  sleep 1;
}

sub print_status{
  my $st = shift;
  foreach my $e (@$st){
    # determine a name : check the first matched position, and choose the leftmost person
    my $text = $e->{text}; $text =~ tr/\x0A\x0D//d;
    my %l = map { $text =~ /$name_table->{$_}/; (@- ? ($_ => $-[0]) : ()) } keys %$name_table;
    my $n = (%l ? (reduce { $l{$a} < $l{$b} ? $a : $b } keys %l) : 'その他');
    printf("%s\t%d\t%d\t%s\t%s\n", $n, $e->{retweet_count}, $e->{favorite_count}, $e->{id}, $text);
  }
}

Movesのデータをgoole mapに載せる

ASCII.jp:Movesのライフログや写真をGoogleマップやGoogleアースに表示するワザ (1/2)|柳谷智宣の「真似したくなるPC活用術」
なるほど便利だな。
https://www.google.com/maps/d/viewer?mid=z-EYc6GDOZHg.k8yF7Lfrue1A
無駄なデータを切り取ったりしたので若干不整合があるかもしれない。

ラスベガス -> グランドキャニオン -> ホースシューベンド -> アンテロープ -> モニュメントバレー -> ブレイスキャニオン -> ラスベガス、を2泊3日で回るコース。

日の長い夏ならともかく、17:30には日が落ちてしまうこの時期にはかなり無謀なプランであった。それもまた一人旅の自由さかなー。

特に3日目、モニュメントバレーからブライスキャニオンに行くのは相当厳しいスケジュールで、元々はザイオンでお茶を濁そうと思っていたのだけど・・・ブライスキャニオンはすごくイイらしいという話を見かけて、うーん多少無理してでも行きたいと思って行くことにしたのだった。結局、2時間くらいしか滞在できなかったけど、それでも苦労した甲斐があった。

しかしその代償として、1日でトータル10時間くらい運転する羽目になってしまったのだった。疲れた。

グランドキャニオンからホースシューベンドに向かう途中、89号が通行止めになってて泣きながら引き返したところもしっかりログに載っていて笑える。89TのTって"Temporary"なのね!ちょろっと山道みたいなのが出てるだけで、こんなの分かるか!ってなった。事前にGoogle mapで調べてなきゃ路頭に迷うところだったわ。NeverLostとかマジで糞。

思い出のついでに当時使ったプレイリストを残しておこう。トータルで2、3周くらいしたのかな?

  • 控えめI love you ! - HKT48
  • ウラオモテ・フォーチュン - 小澤亜李
  • 青春セッションPARADISE(ニコ生音源) - A応P
  • 出る杭は撃たれる - 流星群少女
  • 何度目の青空か? - 乃木坂64
  • A.T.M.O.S.P.H.E.R.E - スフィア
  • Spring is here - スフィア
  • Third Planet - スフィア
  • 4 colors for you - スフィア

それにしてもアイドルソングとドライブの相性よすぎ。アリゾナの荒野を走りながらアイドルソング爆音で流すの最高。放課後胸キュンスターとかテンション上がる曲は運転のテンションも上がるので助かった。あと車の中だと、えーおーぴー!とか叫んでも外には聞こえないしな。なかなか楽しい。

Twitpicの画像を一括ダウンロードするスクリプトが動かなかったのでクイックハックした

ふーん。まぁ何だかんだ大丈夫やろって思って油断してたけど、本当に終了なのか。

自分のtwitpicに関しては正直なんの関心もないけど、日高里菜ちゃんのアカウントだけは守らねば。

twitterが乗っ取られてしまった現在、twitpicとかyfrogとかだけがインターネットに残された貴重な記録だったのになあ。

Twitpic / rina_hidaka

適当に "twitpic 保存" とかで検索すると当然ながら既存のモノがあるので使わせていただこう。

下のシェルスクリプトにしよう。

と思ったけど、何やらうまく動かないのでちょっといじった。他のは知らんが日高里菜ちゃんのアカウントは保存できたのでよしとしよう。

変更点は以下の2箇所。やっつけ感。

  1. 最終ページの取得方法を変更(たぶんtwitpicのデザイン変更による影響だと思うけど)
  2. curlが何故かエラー22だけを決め打ちでリトライしていたので正常終了以外は全部リトライ

100万年ぶりにgist使った。

https://gist.github.com/kkobayashi/e50b3869f4dc91cf725e

スクリプトだと自分でちょこちょこ直せるのがよいね。でも俺シェルスクリプト読むの嫌いだけどね。

$ diff twpicdl.sh twpicdl_dbg.sh
52,54c52,55
< LAST=`curl http://twitpic.com/photos/${TP_NAME} \
<   | grep "<a href=.*>Last<" \
<   | sed "s/.*\?page=\([0-9]*\).*/\1/"`
---
> #LAST=`curl http://twitpic.com/photos/${TP_NAME} \
> #  | grep "<a href=.*>Last<" \
> #  | sed "s/.*\?page=\([0-9]*\).*/\1/"`
> LAST=`curl http://twitpic.com/photos/${TP_NAME} | grep "<a href=.*?page=" | grep -v Next | sed "s/.*\?page=\([0-9]*\).*/\1/" | tail -1`
78c79,80
<     if [ $? -eq 22 -a $RETRY -le $MAXRETRY ]; then
---
> #    if [ $? -eq 22 -a $RETRY -le $MAXRETRY ]; then
>     if [ $? -ne 0 -a $RETRY -le $MAXRETRY ]; then
110c112,113
<       if [ $? -eq 22 ]; then
---
> #      if [ $? -eq 22 ]; then
>       if [ $? -ne 0 ]; then
133c136,137
<         if [ $? -eq 22 ]; then
---
> #        if [ $? -eq 22 ]; then
>         if [ $? -ne 0 ]; then

追記

などと言ってるうちにtwitpic自体が写真の公開を停止してるようで。午前中にクロールして、昼食後にそろそろ自分のアカウントもダウンロードしておくか・・・って思ったら写真が見られなくなってた。わろす。ギリギリのタイミングだったんだなー。