More Related Content Similar to TwitterToDayOne Similar to TwitterToDayOne (20) TwitterToDayOne10. <?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>
12. 作戦
• Twitterからツイートとふぁぼを取ってくる
- 前の起動時にもう読み込んだツイートは無視する
• 日記エントリーのXMLを作って、情報をその中に書き出す
- その日のエントリーがもうあれば、それを更新する形
• 最後に読み込んだツイートのIDを保存する
• 自動的に更新させる
13. Gem
require 'rubygems'
require 'time'
require 'twitter'
require 'nokogiri'
require 'nokogiri-plist'
require 'erb'
• Twitter
- 簡単にAPI使える
• Nokogiri
- XMLなどを簡単に作成・変更できる
• Nokogiri-plist
- Macのplistファイルもできる
14. 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使ってる気もするけどまあいいか
16. 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
• テンプレを先に作って、後から変数を差し込む
18. 既存のファイルを更新する場合
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 部分を更新する
• またファイルとして書き出す
20. 結果
<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: I'm not saying I code too much, but whenever I go through a door labelled "push", I
have 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>
22. 自動的に更新させる
• 最近のOSXは cron ではなく launchd を使っているらしい
• 「なにをいつ起動するのか」という情報を plist ファイルに保存
• その plist ファイルを ~/Library/LaunchAgents にいれると
勝手に色々してくれる
23. たとえば
<?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>
24. たとえば
<?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>
25. たとえば
<?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>
26. たとえば
<?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>