Your SlideShare is downloading. ×
0
Rubyで自動日記Twitter + DayOne
自己紹介• Alex Onsager(アレックス)です。  - 色々な場所で @aonsager• Happy Elementsのプランナーです• エンジニアではないですが、プログラミング勉強したことはあって、今も趣味として続けています
突然ですが、僕は日記が苦手です
そんな僕でも、継続的に使いたいと思える日記アプリがありました
Day One
何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML)
何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML)  - 今日はここに注目
自動日記• 確かにこのアプリは好きだけど、やっぱり三日坊主な自分• もしデータがわかりやすい形なら、なにか動的に書き込むスクリプト作ってみたい• なんとか楽してコンテンツが増えていけば気持ちもいいし、サボってもまた書き始めやすい• その日のTw...
どうにかなりそうか、 の XML をチェック...
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/Prope...
よめる!かけそう!!
作戦• Twitterからツイートとふぁぼを取ってくる  - 前の起動時にもう読み込んだツイートは無視する• 日記エントリーのXMLを作って、情報をその中に書き出す  - その日のエントリーがもうあれば、それを更新する形• 最後に読み込んだツイ...
Gemrequire   rubygemsrequire   timerequire   twitterrequire   nokogirirequire   nokogiri-plistrequire   erb• Twitter  - 簡単...
TwitterのOAuthを設定するTwitter.configure do |config|  config.consumer_key = "hogehoge"  config.consumer_secret = "hogehoge"  co...
ツイートとふぁぼを取ってくる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 "...
新しいファイルを作る場合created_time = date.strftime("%FT00:00:00Z")text = "Tweets for #{date.strftime(%F)}nn" + textFile.open(@dayone...
既存のファイルを更新する場合if File.exists? @dayone_journal_path      plist = Nokogiri::PList(open(@dayone_journal_path))      plist[Ent...
最後に読み込んだツイートの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* ☆...
結果
自動的に更新させる• 最近の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/...
たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/...
たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/...
たとえば<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/...
Githubにもあります• https://github.com/aonsager/TwitterToDayOne• それなりに使えそうなので、forkしていただけると超嬉しいです• 色々おかしい部分もありそうなので、指摘していただけると 超嬉...
ありがとうございました
Upcoming SlideShare
Loading in...5
×

TwitterToDayOne

172

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
172
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "TwitterToDayOne"

  1. 1. Rubyで自動日記Twitter + DayOne
  2. 2. 自己紹介• Alex Onsager(アレックス)です。 - 色々な場所で @aonsager• Happy Elementsのプランナーです• エンジニアではないですが、プログラミング勉強したことはあって、今も趣味として続けています
  3. 3. 突然ですが、僕は日記が苦手です
  4. 4. そんな僕でも、継続的に使いたいと思える日記アプリがありました
  5. 5. Day One
  6. 6. 何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML)
  7. 7. 何が好きか• UIがすばらしいので書きたくなる• OSXとiOSに両方対応していて、同期が簡単• Markdown使える• データは plist ファイルにもっている (XML) - 今日はここに注目
  8. 8. 自動日記• 確かにこのアプリは好きだけど、やっぱり三日坊主な自分• もしデータがわかりやすい形なら、なにか動的に書き込むスクリプト作ってみたい• なんとか楽してコンテンツが増えていけば気持ちもいいし、サボってもまた書き始めやすい• その日のTwitterの様子をダイジェスト式に保存するのが良さそう!
  9. 9. どうにかなりそうか、 の XML をチェック...
  10. 10. <?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>
  11. 11. よめる!かけそう!!
  12. 12. 作戦• Twitterからツイートとふぁぼを取ってくる - 前の起動時にもう読み込んだツイートは無視する• 日記エントリーのXMLを作って、情報をその中に書き出す - その日のエントリーがもうあれば、それを更新する形• 最後に読み込んだツイートのIDを保存する• 自動的に更新させる
  13. 13. Gemrequire rubygemsrequire timerequire twitterrequire nokogirirequire nokogiri-plistrequire erb• Twitter - 簡単にAPI使える• Nokogiri - XMLなどを簡単に作成・変更できる• Nokogiri-plist - Macのplistファイルもできる
  14. 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使ってる気もするけどまあいいか
  15. 15. ツイートとふぁぼを取ってくるstatuses = Twitter.user_timeline(@username, options)favorites = Twitter.favorites(@username, options)• オブジェクトとして帰ってくるので使いやすい• 以前取ってきたツイートをまだ見てないなら、もっとあるかもし れないので繰り返す
  16. 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• テンプレを先に作って、後から変数を差し込む
  17. 17. 新しいファイルを作る場合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)) でさっきのテンプレに変数が差し 込まれて、そのままファイルに書き出される
  18. 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 部分を更新する• またファイルとして書き出す
  19. 19. 最後に読み込んだツイートのIDを保存する File.open(File.join(AppRoot, "latest_tweet"), "w+") {|f|f.write(first[:id]) }• 前もって保存してた、一番最近のツイートのIDをファイルに書き 出す
  20. 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: 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>
  21. 21. 結果
  22. 22. 自動的に更新させる• 最近のOSXは cron ではなく launchd を使っているらしい• 「なにをいつ起動するのか」という情報を plist ファイルに保存• その plist ファイルを ~/Library/LaunchAgents にいれると勝手に色々してくれる
  23. 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. 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. 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. 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>
  27. 27. Githubにもあります• https://github.com/aonsager/TwitterToDayOne• それなりに使えそうなので、forkしていただけると超嬉しいです• 色々おかしい部分もありそうなので、指摘していただけると 超嬉しいです
  28. 28. ありがとうございました
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×