2011年11月20日

さよなら Google Buzz

Google Buzz に終了宣言が出されましたので、データをエクスポートしておきます。 API 設計がキレイだなぁとは思っていましたが、サービス自体の立ち位置が定まらなかった点が大きかったのでしょうか。 メールシステムとの統合は根深い問題もありそうです。

データのエクスポート

Google Takeout (データエクスポート) を使ってデータをエクスポートします。 サービスを選択してダウンロードできます。 データ量によっては時間がかかるかもしれません。

Buzz のデータをエクスポートしてみるとこんな感じになります。

ファイル名の変換

Takeout では日本語のファイル名がパーセントエンコードされていて個人的に好きでありませんので、 もう少し機械的な文字列として日付日時に変換します。 日付はファイルの変更日時にしますが、同じ時間の場合には連番となる数字を付与して重複を防ぐことにします。 複数人のデータだと重複管理にはもっと気を遣った方が良いでしょうが、 一人分のデータで時間が重なることは少ないでしょうから、 それなりに妥当なとこかなぁと思います。

Python のスニペット:

def determine_new_file_name(timestamp, suffix):
    mtime = datetime.fromtimestamp(timestamp)
    base = mtime.strftime('%Y-%m-%d-%H-%M-%S')
    c = 0
    while True:
        if c:
            cand = "%s.%d%s" % (base, c, suffix)
        else:
            cand = base + suffix
        if not os.path.exists(cand):
            return cand
        c += 1


def fnameconv(basedir, outputdir=None):
    outputdir = outputdir or basedir
    if not os.path.exists(outputdir):
        raise SystemExit("\"%s\" is not found." % (outputdir,))
    for f in os.listdir(basedir):
        # XXX: ignore list should be optional argument
        if f == __file__:
            continue
        fname = os.path.join(basedir, f)
        _, suffix = os.path.splitext(fname)
        cand = determine_new_file_name(os.stat(fname).st_mtime, suffix)
        dst = os.path.join(outputdir, cand)
        shutil.move(fname, dst)


あとは main() 関数で引数をそれっぽく解析すれば良いと思います。

スライドショー風に表示

まずはファイル一覧をリスト (JSON のリスト形式) にして files.json という名前で保存します。

次に HTML ファイルを作成して files.json を読み込めるようにし、 適当なタイマー設定でランダムにファイルの中身を読み込みます。 (jQuery の load() を使うとお手軽。HTML が静的なものであると想定)

たまには自分で選択したいこともあるでしょうから、ランダムに6つのファイル名をタブ表示させておきます。 タブ表示のデザインは Twitter Bootstrap を使うととても簡単に実現できますね。 HTML を組み立てる部分は jQuery Templates にお任せです。

    $(function() {
      $.getJSON("files.json", function(data) {
        var slides = [];
        $(data).each(function() {
          // XXX: parse date and time.
          var t = this.substring(0, 19).split("-");
          slides.push({"file": this.toString(),
                       "name": t[0] + "/" + t[1] + "/" + t[2] + " " + t[3] + ":" + t[4],
                       "date": this.substring(0, 10)});
        });
        function pickup() {
          var len = slides.length;
          return slides[Math.floor(Math.random() * len)];
        }
        $("#screen").load(pickup()["file"]);
        setInterval(function() {
          $("#screen").load(pickup()["file"]);
        }, 6000);
        function update() {
          var dt = [];
          for (var j = 0; j < 6; j++) {
              dt.push(pickup());
          }
          $("#slide-list").empty();
          $("#slide-list-template").tmpl(dt).appendTo("#slide-list");
        }
        update();
        setInterval(function() {
          update();
        }, 20000);
      });
      $("#slide-list a").live("click", function(e) {
        e.preventDefault();
        $("#screen").load($(this).attr("href"));
        // XXX: freshen auto update timer.
      });
    });

NOTE:

jQuery Templates は JsViews に置き換えられる予定 (?) なので、 もう少しちゃんと作る場合はテンプレートライブラリを差し替えるのがベター。

出来上がったものを Web サーバのディレクトリに置けば表示されるようになります。

終わりに

Google Buzz のデータをエクスポートして自前のサーバー環境でスライドショー風に表示しました。 有料か無料かを問わず Web サービスは継続されない可能性がありますが、エクスポートできる仕組みを提供してくれているかどうかは大きな違いだと思います。 画面デザインが刷新されて好き嫌いもあるでしょうが、Google はその辺をうまくやってるなぁ、と思いました。

0 件のコメント: