20080506

Twitterにデータが集中するのはリスクがあるので、非集中型のマイクロブログプラットフォームを作ろう
TechCrunch Japanese アーカイブ » Twitterは解放できる—これがシナリオだ
と考えている人がいるそうな

TwitterからJaikuへ移行とか、その逆とか自由にできるプラットフォームを作ろう、と考えているのかな
データポータビリティというか、Twitter互換サービスはまずとりあえずAPITwitter互換にしておけば良いのに、あとデータを勝手にキャッシュしておくとか。

ドキュメント指向DBの StrokeDB のドキュメントを見てるとき、各データに全世界でユニークなUUIDを振ったり、バージョン管理機能を持たせたりして、データ層で独立させようと考えていると思った。↓のようなメッセージが書いてあったり。


Users finally have generated content / ユーザ自身がコンテンツを持つ
My data is mine / ユーザのデータはユーザ自身の物


Amazon SimpleDB のようなWebAPIを持ったデータストレージにユーザのデータは保存してあり、そのデータはユーザ自身の物。新しいサービスを利用開始するときは各サービス(Twitter / Jaiku)へ権限を与える。という仕組みなら先行サービスへのデータの集中は避けられんかな。

Twitterで勤怠管理のするためのRubyスクリプト

これまで ”見込み残業” という制度で残業代とかあまり関係なかったけど、最近になって普通に残業代が付くようになった。
なので仕事開始・終了時間を付ける必要が出てきたんだけど、これが意外にめんどくさい。。
ということで一つTwitterで付けてみようと思ってスクリプト書いてみた、rubyで:-)

以下のソースをhoge.rbとかで保存して ruby hoge.rb userid password 2007-04-01  とかで実行
今から仕事だ!!を見つけたら開始、仕事終わった!!を見つけたら終了時間として保存されて、csv出力 DETH

しかしあれだね、TwitterAPIを使ってごにょごにょやってるのを見ると思うけど、Twitterてまさにライフログだよね。正直ライフログの話をネットや本で見ててもいまいち実感がわかなかったけど、実際にやってみると良いね。

require 'rexml/document'
require 'date'
require 'net/http'
Net::HTTP.version_1_2

class Twitter
  @@URL = {:host=>"twitter.com", :status=>"/statuses"}
  @@URL.merge!({
    :user_timeline    => @@URL[:status]+"/user_timeline",
    :friends_timeline => @@URL[:status]+"/friends_timeline",
    :public_timeline  => @@URL[:status]+"/public_timeline"
  })

  def initialize(user, pass)
    @user, @pass = user, pass
  end
  
  def get(target, options={})
    endpoint_url = @@URL[target] + (options["type"] ? options["type"] : ".xml") + "?hoge=hoge"
    options.each do |key, value|
      endpoint_url += "&"+URI.encode(key)+"="+URI.encode(value)
    end
    result=nil
    req = Net::HTTP::Get.new(endpoint_url)
    req.basic_auth @user, @pass
    Net::HTTP.start(@@URL[:host], 80){|http|
      res = http.request(req)
      result = parse(res.body) if res["status"]=="200 OK"
    }
    result
  end
  
  def parse(body)
    doc = REXML::Document.new(body)
    results = []
    doc.each_element('/statuses/status') do |elem|
      id = elem.elements['id'].text.to_i
      time = DateTime.parse(elem.elements['created_at'].text)
      text = elem.elements['text'].text
      results << {:id=>id, :time=>time, :text=>text}
    end
    results
  end
end

class TwittimeSheet
  def initialize(twitter)
    @twitter = twitter
  end
  
  def get_date(date)
    work_time = {}
    max_date = date
    statuses = @twitter.get(:user_timeline, {"since"=> date.strftime("%a, %d %b %Y %X GMT+900") })
    if(statuses) then
      statuses.each do |status|
        max_date = status[:time] if status[:time] > max_date
        work_time[status[:time].strftime("%Y-%m-%d")] ||= {}
        work_time[status[:time].strftime("%Y-%m-%d")][:start] = status[:time] if status[:text] =~ /.*今から仕事だ.*/
        work_time[status[:time].strftime("%Y-%m-%d")][:end]   = status[:time] if status[:text] =~ /.*仕事終わった.*/
      end
    end
    return work_time,max_date
  end
  
  def get_month(date_string)
    result = {}
    date = Date.parse(date_string)
    end_date = date
    while((date.month == end_date.month) && (date < Date.today)) do
      p "Now get..." + date.to_s
      work,max_date = get_date(date)
      result.merge!( work )
      date = max_date.next
      sleep(1)
    end
    result
  end
end

user, pass, date = ARGV.shift, ARGV.shift, ARGV.shift
unless date then
  p "ENTER!! user password date"
else
  twitter = Twitter.new(user, pass)
  twittimeSheet = TwittimeSheet.new(twitter)
  result = twittimeSheet.get_month(date)
  
  work_csv = "date,start,end\n"
  result.each{|k,v|
	work_csv += "#{k},#{ v[:start].to_s },#{ v[:end].to_s }\n"
  }
  
  File.open("work_sheet_#{date}.csv","w") do |file|
    file.puts work_csv
  end
  
  p "output end work_sheet_#{date}.csv"
end

最近RubyOnRailsを

色々触ってる、楽しい。
FlexのバックエンドにRailsを利用するSDKがあるらしく
http://journal.mycom.co.jp/news/2006/09/07/347.html
これは面白そうだ、と思うけどいまいちFlexがよくわかんない
 ・ActionScriptのライブラリなのか
 ・開発環境なのか (Flex Builder)
 ・実行環境なのか
 ・なんなのか
結局全部を総称してFlexて言うの?クライアントはFlashPlayerでうごくんだよね?(・し・)