Archive for 12月, 2010

DeliciousからTumblrに移行

2010年 12月 18日 Published by under 開発

Tumblr APIの使用にいつの間にかOAuthが必要になっていた件。 http://t.co/bOSftoDR
@hkitago
h. kitago

更新(2011/11/22):API 利用に変更が生じたためこの記事は参考程度に留めておいてください。

ソーシャルブックマークの Delicious がサービスを終了するという話があったので、Flickr も然り、Yahoo! に買収されたスタートアップは成長が見込めないという懸念も以前からあったので重い腰を上げて Tumblr へデータを移行することにした。

「私の中では、今日デリシャスが完全に死んだ。さようなら。」
@hkitago
h. kitago

既に誰かが試みているだろうと調べるとそれらしい記事があったのだけど、Delicious の出力が XML から(タグが閉じられていたりいなかったり、属性が全て大文字だったり)汚い HTM ファイルに変わってたことに加え、Tumblr API の利用制限が考慮されていなかったので、移行ツールを以下の様に自作した。

ini_set('error_reporting', E_ALL);
date_default_timezone_set('Asia/Tokyo');
define('FNAME', 'delicious-20101216.htm');
define('EMAIL', 'hkitago@gmail.com');
define('PASSW', '*********');
define('SLEEP_SEC', 10);
require('simplehtmldom/simple_html_dom.php');
 
header('Content-type: text/plain; charset=UTF-8');
parseHTM();
 
function parseHTM() {
  $htm = file_get_html(FNAME);
  $posts = array();
  foreach($htm->find('dt') as $dt) {
    $a = $dt->first_child();
    $d = $dt->next_sibling();
    $posts[] = array(
      'url'         => $a->href,
      'name'        => trim($a->innertext),
      'tags'        => $a->tags,
      'date'        => date("Y-m-d H:i:s", $a->add_date),
      'private'     => $a->private,
      'description' => (is_object($d) && $d->tag == 'dd') ? trim(strip_tags($d->innertext)) : null
    );
  }
 
  $time_start = microtime(true);
  foreach($posts as $value) {
    postToTumblr($value['url'], $value['name'], $value['description'], $value['tags'], $value['date'], $value['private']);
    if(microtime(true) - $time_start > 10) {
      sleep(SLEEP_SEC);
      $time_start = microtime(true);
    }
  }
}
 
function postToTumblr($url, $name, $description, $tags, $date, $private) {
  $tumblr_email    = EMAIL;
  $tumblr_password = PASSW;
 
  $post_type        = 'link';
  $post_generator   = 'Delicious';
  $post_url         = $url;
  $post_description = $name;
  $post_tags        = $tags;
  $post_date        = $date;
  $post_extended    = $description;
  $post_private     = $private;
 
  $request_data = http_build_query(
    array(
      'email'       => $tumblr_email,
      'password'    => $tumblr_password,
      'type'        => $post_type,
      'description' => $post_extended,
      'generator'   => $post_generator,
      'date'        => $post_date,
      'url'         => $post_url,
      'tags'        => $post_tags,
      'name'        => $post_description,
      'private'     => $post_private
    )
  );
  $c = curl_init('http://www.tumblr.com/api/write');
  curl_setopt($c, CURLOPT_POST, true);
  curl_setopt($c, CURLOPT_POSTFIELDS, $request_data);
  curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
  $result = curl_exec($c);
  $status = curl_getinfo($c, CURLINFO_HTTP_CODE);
  curl_close($c);
 
  if ($status == 201) {
    echo "Success! The new post ID is $result"."\n";
  } else if ($status == 403) {
    echo 'Bad email or password';
  } else {
    echo "Error: $result"."\n";
  }
}

Delicious から出力した HTM ファイルと上記の PHP ファイル、それに HTML 解析ツールとしてPHP Simple HTML DOM Parser を適当な場所に置いて実行するだけで2005年辺りから保存していた4,151件分のデータを無事に移行することができた。所要時間を具体的に計測していないのだけど、10秒間に100件ほど処理できていた気がする。

サンプルのコードを利用する際は先頭の7行を環境に応じた値に適宜変更することと、あまりにもデータ量が多いと php.ini の設定次第では “[notice] child pid ***** exit signal Segmentation fault (11)” を出力し行末に達せず完了しない場合があるので、postToTumblr 関数を実行する前に var_dump 関数等で確認しておくと良いかと。

ってな訳で、タンブラ始めましたのでよろしくお願いします。 :-)

P.S. リンク先のページが存在するかどうか確認するようにすれば良かったなとチョット後悔。

コメントは受け付けていません。

位置情報サービス

2010年 12月 15日 Published by under 評価

あるエバンジェリストさんがススメて(そして位置情報サービスとして最初に利用して)いた、チェックインサービスの先駆者”Brightkite”がチェックインから離脱というお話から。

“テックサビーなアーリーアダプターからはチェックイン疲れなんて言葉も若干聞こえてきているし、チェックインの先に何が提供できるのか、が課題。” http://j.mp/eW8cLNless than a minute ago via Reeder

その後、日本人の運営側とうまく連携をとった Foursquare を使い出して現在に至っているのだけど、どうも上述されているように偽メイヤー問題とそれを助長する iPhone アプリがあったりしてゲームとしての価値は低くなってきたし、そもそも、自宅警備員な身分としては妻が帰宅途中のどの辺りにいるのか分かれば良いと言うこともあって Google Latitude に移行すべく試用してみることにした。


タップ数も Foursquare であれば、起動>チェックインボタン>場所選択>チェックインボタン>共有設定…(略) と複雑なのだけど、Google Latitude の方は単に起動するだけ。「バックグラウンド更新」をオンにしている場合は起動する必要すら無いという簡易さが最大の利点だと思う。

気がかりなのは「バックグラウンド更新」をオンにしている際のバッテリ持続時間なのだと思うけど、オフにしておいて移動地点に到達する毎にチェックインするように起動したり、ある移動距離間だけオンにしたりという使い分けをすることで回避できる気がしている。

一方で Foursquare は行き先の統計を取得しておく事ができるのが便利だったのだけど、行った場所なんてものの情報の鮮度はあっという間にどうでも良くなるのがオチだと思った次第。

先のエバンジェリストのように Foursquare に誘ってしまった友人達には申し訳ないなと思う反面、Google Latitude の友達リクエストはいつでも受け付けているので利用される方は Gmail 宛によろしくお願いします。

P.S. iPhone 利用者同士であれば Apple が提供している「iPhone を探す」を使っても良いのだけど、妻は 3GS なのでした…。

コメントは受け付けていません。