fc2ブログ

ぼちぼち散歩

livedoor Clipからdel.icio.usに戻る

del.icio.usのFirefox拡張の最新版がすごい!という話を聞きつけ,livedoor Clipからdel.icio.usに戻ってみることに.ただ,livedoor Clipの方にdel.icio.usにないやつがたくさんあったので,移行スクリプト書いた.一応ソースおいとくけど,ものすごく適当なので,利用したい方は自己責任でお願いします.

使い方は,LDC.newの引数に,livedoor ClipからエクスポートしたXMLファイルを指定するのと,usernameとpasswordにdel.icio.usのやつをそれぞれ指定して,

$ ruby ldr2delicious.rb > output.txt

とかして,ログとりながら実行します.ポストに失敗するとsomething wrongとか返ってくるみたいなので,あとで失敗してないか見れるかも.それにしてもアウトプットも適当やなorz

# ldr2delicious.rb
require 'pp'
require 'kconv'

# LDCのクリップ一個
class Clip
  attr_reader :title, :link, :memo, :date, :author, :rate, :tags

  def initialize(title, link, memo, date, author, rate, *tags)
    @title  = title
    @link   = link
    @memo   = memo
    @date   = date
    @author = author
    @rate   = rate
    @tags   = tags
  end

  def to_s
    [
      @title.to_s, 
      @link.to_s, 
      @memo.to_s, 
      [@date.year, @date.month, @date.day, [@date.hour, @date.min, @date.sec].join(':'), @date.offset].join(' '),
      @author.to_s,
      @rate.to_s,
      @tags.join(', ')
    ].join("\n")
  end
end

# LDCのクリップ全部
class LDC
  require 'rexml/document'
#  require 'date'

  attr_reader :clips

  # Apr => 4, May => 5, etc.. 
  month_abbr = Date::ABBR_MONTHNAMES.dup
  month_abbr.shift
  month_num = []
  (1..12).each {|i| month_num.push i}
  @@Month = Hash[*(month_abbr.zip(month_num).flatten)]

  def initialize(file)
    @clips = []
    doc = REXML::Document.new open(file).read
    doc.elements.each '/rss/channel/item' do |elem|
      # title, link, memo      
      title  = elem.text('title')
      link   = elem.text('link')
      memo   = elem.text('description')

      # date
      pubDate = elem.text('pubDate')
      dates = pubDate.split(' ') 
      day = dates[1]
      month = @@Month[dates[2]]
      year = dates[3]

      # time
      times = dates[4].split(':')
      hour = times[0]
      min = times[1]
      sec = times[2]

      # timezone
      offset = 9

      # datetime object
      t = Time.local(year.to_i, month.to_i, day.to_i, hour.to_i, min.to_i, sec.to_i)
      date = t - 9 * 60 * 60 # 時差分 9時間

      # author
      author = elem.text('author')

      # rate
      rate = 0
      (elem.text('rvw:rating').to_i / 20).times { rate += 1 }

      # tag
      tags = []
      elem.elements.each 'dc:subject' do |tag|
        tags.push tag.text
      end

      # add clip
      @clips.push(Clip.new(title, link, memo, date, author, rate, tags))
    end
  end
end


class LDCtoDelicious
  require 'net/https'
  require 'cgi'
  Net::HTTP.version_1_2

  @@API_base_uri = 'api.del.icio.us'
  @@API_post_uri = '/v1/posts/add'
  @@SSL_port     = 443

  def initialize(username, password, ldc) 
    @username = username
    @password = password
    @ldc = ldc
  end

  def post(n = 10000)
    @ldc.clips.each do |clip|
      rate = ''
      clip.rate.times { rate += '*' }

      data = {
        'url'         => clip.link,
        'description' => clip.title,
        'extended'    => clip.memo,
        'tags'        => clip.tags.join(' ') + ' ' + rate,
        'dt'          => clip.date.strftime('%Y-%m-%dT%H:%M:%SZ'), # '2007-04-10T19:00:00+0900'
        'replace'     => 'yes',
        'shared'      => 'yes'
      }

      begin
        resp = ''
        http = Net::HTTP.new(@@API_base_uri, @@SSL_port) 
        http.use_ssl = true
        http.start do |http|
          req = Net::HTTP::Get.new(@@API_post_uri + '?' + create_hash(data))
          # puts 'https://' + @@API_base_uri + @@API_post_uri + '?' + create_hash(data)
          req.basic_auth @username, @password
          res = http.request req
          resp = res.body
        end
        
        puts clip.title.tosjis
        puts resp.tosjis
        puts ''

      rescue SocketError
        raise 'Host ' + host + ' nicht erreichbar'
      end

      n -= 1
      break if n <= 0
    end
  end

  protected

  def create_hash(data)
    ret = []
    data.each do |key, value|
      value = '' if value == nil
      ret.push key + '=' + CGI.escape(value)
    end
    ret.join '&'
  end
end

username = 'username'
password = 'password'

ldc = LDC.new('ldc.xml')

post = LDCtoDelicious.new(username, password, ldc)
post.post()

で,移行した感想.今,del.icio.usには3000件以上ブックマークあんねんけど,さすがにこれはインクリメンタルサーチが重いな(-.-;)Sticknの方がいいやん.Sticknのページによると,livedoor Clipへの対応も目指しているそうで,移行した意味がない気もする.ただ,livedoor ClipのAPIは,タグの取得とか,タグで絞り込んでクリップを取得とかがまだできないっぽいので,すぐには難しい気もするなぁ.ともかく,Stickenは超絶便利なので,作者の方には感謝です.

スポンサーサイト



2007/04/11 11:14 | Web | トラックバック(0) | コメント(0)

ページの先頭へ

がんばれlivedoor!

なんだかホリエモン事件以降のlivedoorは良い方向に向かっている気がします.特にlivedoor Readerはものすごく良くできているし,livedoor clipもなかなかいい感じです.(とりあえずアカウント作ってみました.もう一息でdel.icio.usから乗り換えられる?)

トップページもYahoo!のパクリっぽかったっていうかYahoo!そのものでしたが,ついにオリジナルなものに変更され独自のコンテンツを提供していくそうです.じゃあ今度ははてなのパクリか,っていう話もあるみたいですが,そうではなくlivedoorにしかできないサービスになることを期待しています.

余談ですが,livedoor Readerは英語化したら普通に世界を取れそうなぐらいのクオリティだと勝手に感じているのですが,livedoorのコンテンツの英語化というか国際化はしないのかなぁとちょっと思いました.

参考ニュース

2006/07/05 20:01 | Web | トラックバック(0) | コメント(0)

ページの先頭へ

フィード取得しすぎ

気がついたらlivedoor Readerで取得しているフィードの数が100件になっていました.普通に一日当たりの新着記事が200件を越えるので目を通るだけでも大変だったりします.だったら,辞めれば良いのですが見逃すと損しそうというか,見逃すのが怖くてどんどん溜め込むので,フィードの数が増える一方です.

知識はたくさん持っているに越したことはないし,人のブログやニュースを読むのは楽しいので良いのですが,問題はその知識を活かせるかどうかだと最近思うようになりました.知識なしに思考してもだめだし,知識ばっかりで思考しないのもだめなので,フィードから得られる知識をなんらかの形でアウトプットして自分のものにしたいです.HTMLやCSSはブログのデザイン,JavaScriptやPHPも最近はとあるページで活かせたので,完全に知識ばっかりの頭でっかちではないのですが,まだまだなのでいろんなことにチャレンジしたいものです.

とりあえず,今のところやってみたいこととしては,Ruby on Railsでなんか作る,Cocoa + Objective-Cでなんか作る,Scheme,Haskellあたりの関数型言語を勉強する,でしょうか.方法論ばっかり先行して目的がないのがすごくだめです.C++,PHPあたりは必要に迫られてある程度できるようになった感があるので,なんか面白そうな目的を考えてやった方が良さそうです.なんだかグダグダですが,マイペースでいきたいと思います.

2006/06/27 00:19 | Web | トラックバック(0) | コメント(3)

ページの先頭へ

学術論文用ソーシャルブックマークCiteULike

学術論文用のソーシャルブックマークサービスであるCiteULikeというサービスを見つけました.大学で研究している人なんかはわかると思うのですが,参考論文の管理や自分で論文を書くときのBibTexの編集なんかはものすごくめんどくさいです.その辺をある程度解決してくれるのがこのCiteULikeです.

使い方は対応サイトでBookmarkletを実行するだけでおーけーなのが素敵です.自分は情報系なのでACMなどをよく参照するのですが,ばっちり対応していて試しにACMに登録されている先輩の論文をCiteULikeに追加してみたのですが,完璧ではないものの,著者名,年,書籍名,ページ数ぐらいは自動で入力されました.しかも,BibTexでエクスポートできるので,自分で論文を書く際にも重宝しそうです.

ちなみに,MacユーザならばpKizzyもオススメです.PDFファイルを簡単に整理,閲覧できる上にBibTex形式のエクスポートも可能なので便利です.

2006/04/15 00:43 | Web | トラックバック(0) | コメント(0)

ページの先頭へ

Googleさんもカレンダーサービス出した

Google Calendarがリリースされました.個人的には以前紹介したKikoの方がデザインがきれいだし,使い勝手も良く,フィードバックに対する返事も異様に早いので好みなのですが,Google Calendarは日本の休日も表示できたり,おそらくこれからはGmailなどと連携して行くと思われるのでそれはそれで魅力的です.

ところで,パソコン上で扱うカレンダーはiCalendarという形式で標準化されているので,オンライン,オフラインに関わらず全てのカレンダーアプリが対応してくれたり,携帯電話がうまいことサポートしたりして,その上同期も取れればスケジュール管理が手軽にできて楽しい気がします.

ちなみに,Google Calendarの利用にはGmailのアカウントが必要なようです.リアルで知ってる人ならば招待するので,興味のある方は連絡ください.

2006/04/14 01:56 | Web | トラックバック(0) | コメント(0)

ページの先頭へ

トップページへ >> 次のページへ