akishin999の日記

調べた事などを書いて行きます。

Ruby で Twissandra と同じタイムスタンプを生成するには


Twissandra の「Schema Layout」のうち、Timeline と Userline では以下のようにカラムにタイムスタンプを使っているようですが、Ruby でこれをどう生成すればいいかで少し悩みました。


viksit's twissandra at master - GitHub
http://github.com/viksit/twissandra

Timeline = {
    'a4a70900-24e1-11df-8924-001ff3591711': {
        # timestamp of tweet: tweet id
        1267414247561777: '7561a442-24e2-11df-8924-001ff3591711',
        1267414277402340: 'f0c8d718-24e2-11df-8924-001ff3591711',
        1267414305866969: 'f9e6d804-24e2-11df-8924-001ff3591711',
        1267414319522925: '02ccb5ec-24e3-11df-8924-001ff3591711',
    },
}

Userline = {
    'a4a70900-24e1-11df-8924-001ff3591711': {
        # timestamp of tweet: tweet id
        1267414247561777: '7561a442-24e2-11df-8924-001ff3591711',
        1267414277402340: 'f0c8d718-24e2-11df-8924-001ff3591711',
        1267414305866969: 'f9e6d804-24e2-11df-8924-001ff3591711',
        1267414319522925: '02ccb5ec-24e3-11df-8924-001ff3591711',
    },
}


Ruby でタイムスタンプというと、Time#to_i、もしくは Time#to_f ですが、これらは以下のような出力になります。

ruby -r time -e 'p Time.now.to_i'
#=> 1273764355
> ruby -r time -e 'p Time.now.to_f'
#=> 1273764359.34589


これではちょっと違いますね・・・。

一意でありさえすれば全く同じである必要もないと思うのですが、なんとなく気になったので、cass.py を参考に、以下のようにしてみました。
同じ形式のタイムスタンプの取得と、そこからの Time 型の復元ができているようです。

ruby -r time -e 'p (Time.now.to_f * 1e6).to_i'
#=> 1273765302606557
ruby -r time -e 'p Time.at(1273765302606557 / 1e6)'
#=> Fri May 14 00:41:42 +0900 2010


これで Timeline、Userline のように日時をカラム名に値を持つような構造も同じように実装出来そうです。