TwitterToDayOne
Upcoming SlideShare
Loading in...5
×
 

TwitterToDayOne

on

  • 242 views

 

Statistics

Views

Total Views
242
Views on SlideShare
241
Embed Views
1

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 1

http://s.deeeki.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    TwitterToDayOne TwitterToDayOne Presentation Transcript

    • Rubyで自動日記Twitter + DayOne
    • 自己紹介• Alex Onsager(アレックス)です。 - 色々な場所で @aonsager• Happy Elementsのプランナーです• エンジニアではないですが、プログラミング勉強したことはあって、今も趣味として続けています
    • 突然ですが、僕は日記が苦手です
    • そんな僕でも、継続的に使いたいと思える日記アプリがありました
    • Day One
    • 何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML)
    • 何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML) - 今日はここに注目
    • 自動日記• 確かにこのアプリは好きだけど、やっぱり三日坊主な自分• もしデータがわかりやすい形なら、なにか動的に書き込むスクリプト作ってみたい• なんとか楽してコンテンツが増えていけば気持ちもいいし、サボってもまた書き始めやすい• その日のTwitterの様子をダイジェスト式に保存するのが良さそう!
    • どうにかなりそうか、 の XML をチェック...
    • <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Creation Date</key> <date>2012-06-20T12:00:24Z</date> <key>Entry Text</key> Text <string>今日は面白いことを沢山しました</string> <key>Starred</key> <false/> <key>UUID</key> <string>7CE4F200A67C45C8A1332778AE8E27C3</string></dict></plist>
    • よめる!かけそう!!
    • 作戦• Twitterからツイートとふぁぼを取ってくる - 前の起動時にもう読み込んだツイートは無視する• 日記エントリーのXMLを作って、情報をその中に書き出す - その日のエントリーがもうあれば、それを更新する形• 最後に読み込んだツイートのIDを保存する• 自動的に更新させる
    • Gemrequire rubygemsrequire timerequire twitterrequire nokogirirequire nokogiri-plistrequire erb• Twitter - 簡単にAPI使える• Nokogiri - XMLなどを簡単に作成・変更できる• Nokogiri-plist - Macのplistファイルもできる
    • TwitterのOAuthを設定するTwitter.configure do |config| config.consumer_key = "hogehoge" config.consumer_secret = "hogehoge" config.oauth_token = "hogehoge" config.oauth_token_secret = "hogehoge"end @username = "username"• 簡単• OAuth無しでもいけるAPI使ってる気もするけどまあいいか
    • ツイートとふぁぼを取ってくるstatuses = Twitter.user_timeline(@username, options)favorites = Twitter.favorites(@username, options)• オブジェクトとして帰ってくるので使いやすい• 以前取ってきたツイートをまだ見てないなら、もっとあるかもし れないので繰り返す
    • XMLをつくる (Nokogiri)@template = ERB.new <<-XMLTEMPLATE <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Creation Date</key> <date><%= created_time %></date> <key>Entry Text</key> <string><%= text %></string> <key>Starred</key> <false/> <key>UUID</key> <string><%= uuid %></string> </dict> </plist> XMLTEMPLATE• テンプレを先に作って、後から変数を差し込む
    • 新しいファイルを作る場合created_time = date.strftime("%FT00:00:00Z")text = "Tweets for #{date.strftime(%F)}nn" + textFile.open(@dayone_journal_path, "w+") {|f|f.write(@template.result(binding)) }• @template.result(binding)) でさっきのテンプレに変数が差し 込まれて、そのままファイルに書き出される
    • 既存のファイルを更新する場合if File.exists? @dayone_journal_path plist = Nokogiri::PList(open(@dayone_journal_path)) plist[Entry Text] += "nn#{text}" File.open(@dayone_journal_path, "w+") {|f|f.write(plist.to_plist_xml) }• Nokogiriでファイルを読み込む• Entry Text 部分を更新する• またファイルとして書き出す
    • 最後に読み込んだツイートのIDを保存する File.open(File.join(AppRoot, "latest_tweet"), "w+") {|f|f.write(first[:id]) }• 前もって保存してた、一番最近のツイートのIDをファイルに書き 出す
    • 結果<dict> <key>Creation Date</key><date>2012-10-15T00:00:00Z</date> <key>Entry Text</key><string>Tweets for 2012-10-15* ☆ 心ないらくがき http://t.co/wfQ90fWh [(_kyocha)](https://twitter.com/#!/_kyocha/status/257667654196797440)* @_kyocha @daihay0217 本人も否定できないクオリティー [(12:47)](https://twitter.com/#!/aonsager/status/257689026247655426)* RT @idiot: Im not saying I code too much, but whenever I go through a door labelled "push", Ihave to pull first to avoid conflicts. [(15:36)](https://twitter.com/#!/aonsager/status/257731686131965952)* 今日やけにiPhoneの電池消費が激しいのはなぜだ [(19:45)](https://twitter.com/#!/aonsager/status/257794243203063808)* はっ!LTEか? [(19:47)](https://twitter.com/#!/aonsager/status/257794878283595776)* ☆ 10fpsしか出ないとは情けないぜ∼∼ [(kusakari)](https://twitter.com/#!/kusakari/status/257797888447479810)* 今週土曜日、友達と2人で東京に行きます!時間がある人は遊んでください ^_^ [(23:25)](https://twitter.com/#!/aonsager/status/257849733756895232)</string> <key>Starred</key><false/> <key>UUID</key><string>TWITTER00000000000000020121015</string></dict>
    • 結果
    • 自動的に更新させる• 最近のOSXは cron ではなく launchd を使っているらしい• 「なにをいつ起動するのか」という情報を plist ファイルに保存• その plist ファイルを ~/Library/LaunchAgents にいれると勝手に色々してくれる
    • たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.aonsager.TwitterToDayOne</string> <key>ProgramArguments</key> <array> <string>/Users/aonsager/Dropbox/Documents/scripts/TwitterToDayOne/twitter_to_dayone.rb</string> </array> <key>StartInterval</key> <integer>3600</integer> <key>RunAtLoad</key> <true/> <key>StandardErrorPath</key> <string>/tmp/TwitterToDayOne.err</string> <key>StandardOutPath</key> <string>/tmp/TwitterToDayOne.out</string></dict></plist>
    • たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.aonsager.TwitterToDayOne</string> <key>ProgramArguments</key> <array> <string>/Users/aonsager/Dropbox/Documents/scripts/TwitterToDayOne/twitter_to_dayone.rb</string> </array> このスクリプトを <key>StartInterval</key> <integer>3600</integer> <key>RunAtLoad</key> <true/> <key>StandardErrorPath</key> <string>/tmp/TwitterToDayOne.err</string> <key>StandardOutPath</key> <string>/tmp/TwitterToDayOne.out</string></dict></plist>
    • たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.aonsager.TwitterToDayOne</string> <key>ProgramArguments</key> <array> <string>/Users/aonsager/Dropbox/Documents/scripts/TwitterToDayOne/twitter_to_dayone.rb</string> </array> <key>StartInterval</key> <integer>3600</integer> 〇〇秒毎に起動する <key>RunAtLoad</key> <true/> <key>StandardErrorPath</key> <string>/tmp/TwitterToDayOne.err</string> <key>StandardOutPath</key> <string>/tmp/TwitterToDayOne.out</string></dict></plist>
    • たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Label</key> <string>com.aonsager.TwitterToDayOne</string> <key>ProgramArguments</key> <array> <string>/Users/aonsager/Dropbox/Documents/scripts/TwitterToDayOne/twitter_to_dayone.rb</string> </array> <key>StartInterval</key> <integer>3600</integer> <key>RunAtLoad</key> <true/> <key>StandardErrorPath</key> <string>/tmp/TwitterToDayOne.err</string> <key>StandardOutPath</key> ログとかはここ <string>/tmp/TwitterToDayOne.out</string></dict></plist>
    • Githubにもあります• https://github.com/aonsager/TwitterToDayOne• それなりに使えそうなので、forkしていただけると超嬉しいです• 色々おかしい部分もありそうなので、指摘していただけると 超嬉しいです
    • ありがとうございました