diff --git a/etc/t-completion.sh b/etc/t-completion.sh index 3f79110a..7960e77e 100644 --- a/etc/t-completion.sh +++ b/etc/t-completion.sh @@ -90,7 +90,7 @@ favorites) -C|--color) completions='auto never' ;; - *) completions='--csv -c --decode_uris -d --id -i --long -l --max_id -m --number -n --relative_dates -a --reverse -r --since_id -s -H --host -C --color -P --profile' ;; + *) completions='--csv -c --decode_uris -d --id -i --long -l --max_id -m --number -n --relative_dates -a --reverse -r --since_id -s -H --host -C --color -P --profile --photos' ;; esac;; follow) @@ -188,7 +188,7 @@ mentions) -C|--color) completions='auto never' ;; - *) completions='--csv -c --decode_uris -d --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile' ;; + *) completions='--csv -c --decode_uris -d --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile --photos' ;; esac;; mute) @@ -253,7 +253,7 @@ retweets) -C|--color) completions='auto never' ;; - *) completions='--csv -c --decode_uris -d --id -i --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile' ;; + *) completions='--csv -c --decode_uris -d --id -i --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile --photos' ;; esac;; retweets_of_me) @@ -261,7 +261,7 @@ retweets_of_me) -C|--color) completions='auto never' ;; - *) completions='--csv -c --decode_uris -d --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile' ;; + *) completions='--csv -c --decode_uris -d --long -l --number -n --relative_dates -a --reverse -r -H --host -C --color -P --profile --photos' ;; esac;; ruler) @@ -286,7 +286,7 @@ timeline) completions='replies retweets' ;; -C|--color) completions='auto never' ;; - *) completions='--csv -c --decode_uris -d --exclude -e --id -i --long -l --max_id -m --number -n --relative_dates -a --reverse -r --since_id -s -H --host -C --color -P --profile' ;; + *) completions='--csv -c --decode_uris -d --exclude -e --id -i --long -l --max_id -m --number -n --relative_dates -a --reverse -r --since_id -s -H --host -C --color -P --profile --photos' ;; esac;; trends) @@ -380,7 +380,7 @@ create) completions='-H --host -C --color -P --profile' ;; information) completions='-H --host -C --color -P --profile' ;; members) completions='-H --host -C --color -P --profile' ;; remove) completions='-H --host -C --color -P --profile' ;; -timeline) completions='-H --host -C --color -P --profile' ;; +timeline) completions='-H --host -C --color -P --profile --photos' ;; help) completions='-H --host -C --color -P --profile' ;; -C|--color) completions='auto never' ;; @@ -392,11 +392,11 @@ search) case "$prev" in search) completions='all favorites list mentions retweets timeline users help';; all) completions='-H --host -C --color -P --profile' ;; -favorites) completions='-H --host -C --color -P --profile' ;; -list) completions='-H --host -C --color -P --profile' ;; -mentions) completions='-H --host -C --color -P --profile' ;; -retweets) completions='-H --host -C --color -P --profile' ;; -timeline) completions='-H --host -C --color -P --profile' ;; +favorites) completions='-H --host -C --color -P --profile --photos' ;; +list) completions='-H --host -C --color -P --profile --photos' ;; +mentions) completions='-H --host -C --color -P --profile --photos' ;; +retweets) completions='-H --host -C --color -P --profile --photos' ;; +timeline) completions='-H --host -C --color -P --profile --photos' ;; users) completions='-H --host -C --color -P --profile' ;; help) completions='-H --host -C --color -P --profile' ;; @@ -427,11 +427,11 @@ stream) case "$prev" in stream) completions='all list matrix search timeline users help';; all) completions='-H --host -C --color -P --profile' ;; -list) completions='-H --host -C --color -P --profile' ;; +list) completions='-H --host -C --color -P --profile --photos' ;; matrix) completions='-H --host -C --color -P --profile' ;; -search) completions='-H --host -C --color -P --profile' ;; -timeline) completions='-H --host -C --color -P --profile' ;; -users) completions='-H --host -C --color -P --profile' ;; +search) completions='-H --host -C --color -P --profile --photos' ;; +timeline) completions='-H --host -C --color -P --profile --photos' ;; +users) completions='-H --host -C --color -P --profile --photos' ;; help) completions='-H --host -C --color -P --profile' ;; -C|--color) completions='auto never' ;; diff --git a/lib/t/cli.rb b/lib/t/cli.rb index ad52e8b0..196fcc8e 100644 --- a/lib/t/cli.rb +++ b/lib/t/cli.rb @@ -32,6 +32,7 @@ class CLI < Thor class_option 'color', aliases: '-C', type: :string, enum: %w(icon auto never), default: 'auto', desc: 'Control how color is used in output' class_option 'profile', aliases: '-P', type: :string, default: File.join(File.expand_path('~'), T::RCFile::FILE_NAME), desc: 'Path to RC file', banner: 'FILE' + class_option 'photos', type: :boolean, default: false, desc: 'Render photos as ASCII (requires netpbm)' def initialize(*) @rcfile = T::RCFile.instance @@ -279,7 +280,7 @@ def favorites(user = nil) count = options['number'] || DEFAULT_NUM_RESULTS opts = {} opts[:exclude_replies] = true if options['exclude'] == 'replies' - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] opts[:include_rts] = false if options['exclude'] == 'retweets' opts[:max_id] = options['max_id'] if options['max_id'] opts[:since_id] = options['since_id'] if options['since_id'] @@ -520,7 +521,7 @@ def matrix def mentions count = options['number'] || DEFAULT_NUM_RESULTS opts = {} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = collect_with_count(count) do |count_opts| client.mentions(count_opts.merge(opts)) end @@ -657,7 +658,7 @@ def retweet(status_id, *status_ids) def retweets(user = nil) count = options['number'] || DEFAULT_NUM_RESULTS opts = {} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = if user require 't/core_ext/string' user = options['id'] ? user.to_i : user.strip_ats @@ -683,7 +684,7 @@ def retweets(user = nil) def retweets_of_me count = options['number'] || DEFAULT_NUM_RESULTS opts = {} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = collect_with_count(count) do |count_opts| client.retweets_of_me(count_opts.merge(opts)) end @@ -762,7 +763,7 @@ def timeline(user = nil) count = options['number'] || DEFAULT_NUM_RESULTS opts = {} opts[:exclude_replies] = true if options['exclude'] == 'replies' - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] opts[:include_rts] = false if options['exclude'] == 'retweets' opts[:max_id] = options['max_id'] if options['max_id'] opts[:since_id] = options['since_id'] if options['since_id'] diff --git a/lib/t/list.rb b/lib/t/list.rb index a19ac146..4d93835a 100644 --- a/lib/t/list.rb +++ b/lib/t/list.rb @@ -114,7 +114,7 @@ def timeline(user_list) owner, list_name = extract_owner(user_list, options) count = options['number'] || DEFAULT_NUM_RESULTS opts = {} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = collect_with_count(count) do |count_opts| client.list_timeline(owner, list_name, count_opts.merge(opts)) end diff --git a/lib/t/printable.rb b/lib/t/printable.rb index fc7866df..b2fc164e 100644 --- a/lib/t/printable.rb +++ b/lib/t/printable.rb @@ -111,25 +111,44 @@ def print_table_with_headings(array, headings, format) STDOUT.flush end - def print_message(from_user, message) + def print_message(from_user, message, media = []) require 'htmlentities' case options['color'] when 'icon' print_identicon(from_user, message) + print_media(media.first) if options['photos'] && media.first say say when 'auto' say(" @#{from_user}", [:bold, :yellow]) print_wrapped(HTMLEntities.new.decode(message), indent: 3) + print_media(media.first) if options['photos'] && media.first say else say(" @#{from_user}") print_wrapped(HTMLEntities.new.decode(message), indent: 3) + print_media(media.first) if options['photos'] && media.first say end end + def print_media(media) + # Guess image format from file extension in URL + convert = + {'jpeg' => 'jpegtopnm - 2>/dev/null', + 'jpg' => 'jpegtopnm - 2>/dev/null', + 'png' => 'pngtopnm -', + 'gif' => 'giftopnm -'}[media.media_uri.to_s.downcase[/\.([^.]+)$/, 1]] + return if convert.nil? + + indent = options['color'] == 'icon' ? 10 : 3 + scale = "pamscale -xyfill #{terminal_width - indent} 20 -" + output = `curl -s '#{media.media_uri}' | #{convert} | #{scale} | ppmtoascii -1x2` + + $stdout.puts output.lines.map { |x| ' ' * indent << x } + end + def print_identicon(from_user, message) require 'htmlentities' require 't/identicon' @@ -177,7 +196,7 @@ def print_tweets(tweets) print_table_with_headings(array, TWEET_HEADINGS, format) else tweets.each do |tweet| - print_message(tweet.user.screen_name, decode_uris(tweet.full_text, options['decode_uris'] ? tweet.uris : nil)) + print_message(tweet.user.screen_name, decode_uris(tweet.full_text, options['decode_uris'] ? tweet.uris : nil), tweet.media) end end end diff --git a/lib/t/search.rb b/lib/t/search.rb index 2c2932dd..1c4c5728 100644 --- a/lib/t/search.rb +++ b/lib/t/search.rb @@ -33,7 +33,7 @@ def initialize(*) def all(query) count = options['number'] || DEFAULT_NUM_RESULTS opts = {count: MAX_SEARCH_RESULTS} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = client.search(query, opts).take(count) tweets.reverse! if options['reverse'] if options['csv'] @@ -51,7 +51,7 @@ def all(query) else say unless tweets.empty? tweets.each do |tweet| - print_message(tweet.user.screen_name, decode_full_text(tweet, options['decode_uris'])) + print_message(tweet.user.screen_name, decode_full_text(tweet, options['decode_uris']), tweet.media) end end end @@ -66,7 +66,7 @@ def favorites(*args) query = args.pop user = args.pop opts = {count: MAX_NUM_RESULTS} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] if user require 't/core_ext/string' user = options['id'] ? user.to_i : user.strip_ats @@ -96,7 +96,7 @@ def favorites(*args) def list(user_list, query) owner, list_name = extract_owner(user_list, options) opts = {count: MAX_NUM_RESULTS} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = collect_with_max_id do |max_id| opts[:max_id] = max_id unless max_id.nil? client.list_timeline(owner, list_name, opts) @@ -114,7 +114,7 @@ def list(user_list, query) method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.' def mentions(query) opts = {count: MAX_NUM_RESULTS} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] tweets = collect_with_max_id do |max_id| opts[:max_id] = max_id unless max_id.nil? client.mentions(opts) @@ -136,7 +136,7 @@ def retweets(*args) query = args.pop user = args.pop opts = {count: MAX_NUM_RESULTS} - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] if user require 't/core_ext/string' user = options['id'] ? user.to_i : user.strip_ats @@ -171,7 +171,7 @@ def timeline(*args) user = args.pop opts = {count: MAX_NUM_RESULTS} opts[:exclude_replies] = true if options['exclude'] == 'replies' - opts[:include_entities] = !!options['decode_uris'] + opts[:include_entities] = !!options['decode_uris'] || !!options['photos'] opts[:include_rts] = false if options['exclude'] == 'retweets' opts[:max_id] = options['max_id'] if options['max_id'] opts[:since_id] = options['since_id'] if options['since_id'] diff --git a/lib/t/stream.rb b/lib/t/stream.rb index dd4f8d2b..6b90ba54 100644 --- a/lib/t/stream.rb +++ b/lib/t/stream.rb @@ -50,7 +50,7 @@ def all end print_table([array], truncate: STDOUT.tty?) else - print_message(tweet.user.screen_name, tweet.text) + print_message(tweet.user.screen_name, tweet.text, tweet.media) end end end @@ -82,7 +82,7 @@ def list(user_list) end print_table([array], truncate: STDOUT.tty?) else - print_message(tweet.user.screen_name, tweet.text) + print_message(tweet.user.screen_name, tweet.text, tweet.media) end end end @@ -125,7 +125,7 @@ def search(keyword, *keywords) end print_table([array], truncate: STDOUT.tty?) else - print_message(tweet.user.screen_name, tweet.text) + print_message(tweet.user.screen_name, tweet.text, tweet.media) end end end @@ -153,7 +153,7 @@ def timeline end print_table([array], truncate: STDOUT.tty?) else - print_message(tweet.user.screen_name, tweet.text) + print_message(tweet.user.screen_name, tweet.text, tweet.media) end end end @@ -186,7 +186,7 @@ def users(user_id, *user_ids) end print_table([array], truncate: STDOUT.tty?) else - print_message(tweet.user.screen_name, tweet.text) + print_message(tweet.user.screen_name, tweet.text, tweet.media) end end end diff --git a/spec/fixtures/statuses_with_entities.json b/spec/fixtures/statuses_with_entities.json new file mode 100644 index 00000000..5a3e4575 --- /dev/null +++ b/spec/fixtures/statuses_with_entities.json @@ -0,0 +1 @@ +[{"created_at":"Fri Sep 07 16:35:24 +0000 2012","id":4611686018427387904,"id_str":"4611686018427387904","text":"Happy Birthday @imdane. Watch out for those @rally pranksters!","source":"Twitter for iPhone","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5819322,"id_str":"5819322","name":"Maggie Utgoff","screen_name":"mutgoff","location":"san francisco","description":"I live every week like it's Shark Week. ","url":"http://www.mutgoff.com","entities":{"url":{"urls":[{"url":"http://www.mutgoff.com","expanded_url":null,"indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":263063,"friends_count":708,"listed_count":534,"created_at":"Mon May 07 01:02:52 +0000 2007","favourites_count":444,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":4604,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://a0.twimg.com/profile_background_images/344662358/x88fe902ff835983434794eb1f9d7370.jpg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/344662358/x88fe902ff835983434794eb1f9d7370.jpg","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1199277090/Screen_shot_2010-12-26_at_11.31.51_AM_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1199277090/Screen_shot_2010-12-26_at_11.31.51_AM_normal.png","profile_link_color":"9DDD95","profile_sidebar_border_color":"A0EEF5","profile_sidebar_fill_color":"1A3F57","profile_text_color":"72B9BF","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":{"type":"Point","coordinates":[43.46481998,-73.64247884]},"coordinates":{"type":"Point","coordinates":[-73.64247884,43.46481998]},"place":{"id":"003cd76c24b9fa3b","url":"https://api.twitter.com/1.1/geo/id/003cd76c24b9fa3b.json","place_type":"city","name":"Bolton","full_name":"Bolton, NY","country_code":"US","country":"United States","bounding_box":{"type":"Polygon","coordinates":[[[-73.750813,43.442073],[-73.525347,43.442073],[-73.525347,43.678377],[-73.750813,43.678377]]]},"attributes":{}},"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[],"media":[{"id":415602857409122300,"id_str":"415602857409122304","indices":[12,34],"media_url":"http://pbs.twimg.com/media/BcSEmMuCEAALt3v.png","media_url_https":"https://pbs.twimg.com/media/BcSEmMuCEAALt3v.png","url":"http://t.co/S1Bmg5Yspi","display_url":"pic.twitter.com/S1Bmg5Yspi","expanded_url":"http://twitter.com/nikisanders_/status/415602857572700160/photo/1","type":"photo","sizes":{"medium":{"w":600,"h":600,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":340,"resize":"fit"},"large":{"w":827,"h":827,"resize":"fit"}}}]},"favorited":false,"retweeted":false},{"created_at":"Fri Sep 07 16:33:36 +0000 2012","id":244111183165157376,"id_str":"244111183165157376","text":"If you like good real-life stories, check out @NarrativelyNY's just-launched site http://t.co/wiUL07jE (and also visit http://t.co/ZoyQxqWA)","source":"Tweetbot for Mac","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":14163141,"id_str":"14163141","name":"David Friedman","screen_name":"ironicsans","location":"New York","description":"Photographer. Idea blogger. Occasional historian.","url":"http://www.davidfriedman.info","entities":{"url":{"urls":[{"url":"http://www.davidfriedman.info","expanded_url":null,"indices":[0,29]}]},"description":{"urls":[]}},"protected":false,"followers_count":4131,"friends_count":1270,"listed_count":220,"created_at":"Mon Mar 17 13:47:33 +0000 2008","favourites_count":1377,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":4753,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"AAB4B5","profile_background_image_url":"http://a0.twimg.com/profile_background_images/66248418/Untitled-1.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/66248418/Untitled-1.gif","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/427291735/n645611374_892426_9102_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/427291735/n645611374_892426_9102_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"BDDCAD","profile_sidebar_fill_color":"DDFFCC","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/wiUL07jE","expanded_url":"http://narrative.ly","display_url":"narrative.ly","indices":[82,102]},{"url":"http://t.co/ZoyQxqWA","expanded_url":"http://www.kickstarter.com/projects/narratively/narratively","display_url":"kickstarter.com/projects/narra…","indices":[119,139]}],"user_mentions":[{"screen_name":"NarrativelyNY","name":"Narratively","id":576457087,"id_str":"576457087","indices":[46,60]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:30:14 +0000 2012","id":244110336414859264,"id_str":"244110336414859264","text":"Something else to vote for: \"New Rails workshops to bring more women into the Boston software scene\" http://t.co/eNBuckHc /cc @bostonrb","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":43234200,"id_str":"43234200","name":"Pat Shaughnessy","screen_name":"pat_shaughnessy","location":"Boston","description":"Blogger, Rubyist, Writing a new eBook: http://patshaughnessy.net/ruby-under-a-microscope","url":"http://patshaughnessy.net","entities":{"url":{"urls":[{"url":"http://patshaughnessy.net","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":734,"friends_count":362,"listed_count":38,"created_at":"Fri May 29 00:55:48 +0000 2009","favourites_count":35,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":1620,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1950093297/pat2_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/1950093297/pat2_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[],"media":[{"id":415592649580507140,"id_str":"415592649580507137","indices":[108,130],"media_url":"http://pbs.twimg.com/media/BcR7UBmCcAEOnQx.jpg","media_url_https":"https://pbs.twimg.com/media/BcR7UBmCcAEOnQx.jpg","url":"http://t.co/Wjk28q2a33","display_url":"pic.twitter.com/Wjk28q2a33","expanded_url":"http://twitter.com/HiddenSayings/status/415592649681145856/photo/1","type":"photo","sizes":{"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":254,"h":269,"resize":"fit"},"small":{"w":254,"h":269,"resize":"fit"},"large":{"w":254,"h":269,"resize":"fit"}},"source_status_id":415592649681145860,"source_status_id_str":"415592649681145856"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:28:05 +0000 2012","id":244109797308379136,"id_str":"244109797308379136","text":"Pushing the button to launch the site. http://t.co/qLoEn5jG","source":"Instagram","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1882641,"id_str":"1882641","name":"Caleb Elston","screen_name":"calebelston","location":"San Francisco","description":"Co-founder & CEO of Yobongo. Dubious of people who claim to be experts. Formerly VP Products at Justin.tv. Advisor to Simpler.","url":"http://www.calebelston.com","entities":{"url":{"urls":[{"url":"http://www.calebelston.com","expanded_url":null,"indices":[0,26]}]},"description":{"urls":[]}},"protected":false,"followers_count":1960,"friends_count":151,"listed_count":136,"created_at":"Thu Mar 22 14:34:22 +0000 2007","favourites_count":815,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":7068,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"666666","profile_background_image_url":"http://a0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_link_color":"0099CC","profile_sidebar_border_color":"E3E3E3","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"292E38","profile_use_background_image":false,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"symbols":[],"urls":[],"user_mentions":[],"media":[{"id":415601041628205060,"id_str":"415601041628205056","indices":[56,78],"media_url":"http://pbs.twimg.com/media/BcSC8gaIEAAPC11.gif","media_url_https":"https://pbs.twimg.com/media/BcSC8gaIEAAPC11.gif","url":"http://t.co/Pa6BMk4rUH","display_url":"pic.twitter.com/Pa6BMk4rUH","expanded_url":"http://twitter.com/milenacastrr/status/415601041858899969/photo/1","type":"photo","sizes":{"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":453,"resize":"fit"},"medium":{"w":600,"h":800,"resize":"fit"},"large":{"w":960,"h":1280,"resize":"fit"}},"source_status_id":415601041858900000,"source_status_id_str":"415601041858899969"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:23:50 +0000 2012","id":244108728834592770,"id_str":"244108728834592770","text":"RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1882641,"id_str":"1882641","name":"Caleb Elston","screen_name":"calebelston","location":"San Francisco","description":"Co-founder & CEO of Yobongo. Dubious of people who claim to be experts. Formerly VP Products at Justin.tv. Advisor to Simpler.","url":"http://www.calebelston.com","entities":{"url":{"urls":[{"url":"http://www.calebelston.com","expanded_url":null,"indices":[0,26]}]},"description":{"urls":[]}},"protected":false,"followers_count":1960,"friends_count":151,"listed_count":136,"created_at":"Thu Mar 22 14:34:22 +0000 2007","favourites_count":815,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":7068,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"666666","profile_background_image_url":"http://a0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_link_color":"0099CC","profile_sidebar_border_color":"E3E3E3","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"292E38","profile_use_background_image":false,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 16:12:47 +0000 2012","id":244105944508796931,"id_str":"244105944508796931","text":"Mosaic looks cool: http://t.co/A8013C9k","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":13634322,"id_str":"13634322","name":"Oliver Cameron","screen_name":"olivercameron","location":"Palo Alto, CA","description":"Co-founder of @everyme.","url":"http://everyme.com","entities":{"url":{"urls":[{"url":"http://everyme.com","expanded_url":null,"indices":[0,18]}]},"description":{"urls":[]}},"protected":false,"followers_count":1365,"friends_count":218,"listed_count":57,"created_at":"Mon Feb 18 18:08:32 +0000 2008","favourites_count":8,"utc_offset":0,"time_zone":"London","geo_enabled":false,"verified":false,"statuses_count":3346,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://a0.twimg.com/profile_background_images/5435833/pat_20060420022220.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/5435833/pat_20060420022220.gif","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/1237999642/Oliver_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1237999642/Oliver_normal.png","profile_link_color":"454545","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"000000","profile_use_background_image":false,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/A8013C9k","expanded_url":"http://heymosaic.com/i/1Z8ssK","display_url":"heymosaic.com/i/1Z8ssK","indices":[19,39]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},"retweet_count":1,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/A8013C9k","expanded_url":"http://heymosaic.com/i/1Z8ssK","display_url":"heymosaic.com/i/1Z8ssK","indices":[38,58]}],"user_mentions":[{"screen_name":"olivercameron","name":"Oliver Cameron","id":13634322,"id_str":"13634322","indices":[3,17]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:20:31 +0000 2012","id":244107890632294400,"id_str":"244107890632294400","text":"The Weatherman is Not a Moron: http://t.co/ZwL5Gnq5. An excerpt from my book, THE SIGNAL AND THE NOISE (http://t.co/fNXj8vCE)","source":"TweetDeck","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":16017475,"id_str":"16017475","name":"Nate Silver","screen_name":"fivethirtyeight","location":"New York","description":"FiveThirtyEight blogger (http://nyti.ms/Qp8cqb). Author, The Signal and the Noise (http://amzn.to/QdyFYV). Sports/politics/food geek.","url":"http://amzn.to/QdyFYV","entities":{"url":{"urls":[{"url":"http://amzn.to/QdyFYV","expanded_url":null,"indices":[0,21]}]},"description":{"urls":[]}},"protected":false,"followers_count":183238,"friends_count":475,"listed_count":8160,"created_at":"Wed Aug 27 20:56:45 +0000 2008","favourites_count":6,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":true,"statuses_count":6786,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1110592135/fivethirtyeight73_twitter_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1110592135/fivethirtyeight73_twitter_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":19,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/ZwL5Gnq5","expanded_url":"http://nyti.ms/OW7n5p","display_url":"nyti.ms/OW7n5p","indices":[31,51]},{"url":"http://t.co/fNXj8vCE","expanded_url":"http://amzn.to/Qg2SEu","display_url":"amzn.to/Qg2SEu","indices":[104,124]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:20:15 +0000 2012","id":244107823733174272,"id_str":"244107823733174272","text":"RT @randomhacks: Going to Code Across Austin II: Y'all Come Hack Now, Sat, Sep 8 http://t.co/Sk5BM7U3 We'll see y'all there! #rhok @cod ...","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":64482503,"id_str":"64482503","name":"Code for America","screen_name":"codeforamerica","location":"San Francisco, California","description":"Code for America helps governments work better for everyone with the people and the power of the web.","url":"http://www.codeforamerica.org","entities":{"url":{"urls":[{"url":"http://www.codeforamerica.org","expanded_url":null,"indices":[0,29]}]},"description":{"urls":[]}},"protected":false,"followers_count":11824,"friends_count":783,"listed_count":981,"created_at":"Mon Aug 10 18:59:29 +0000 2009","favourites_count":20,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":3611,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EBEBEB","profile_background_image_url":"http://a0.twimg.com/images/themes/theme7/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme7/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1118630094/logosquare_bigger_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/1118630094/logosquare_bigger_normal.jpg","profile_link_color":"990000","profile_sidebar_border_color":"DFDFDF","profile_sidebar_fill_color":"F3F3F3","profile_text_color":"333333","profile_use_background_image":false,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 16:11:02 +0000 2012","id":244105505390350336,"id_str":"244105505390350336","text":"Going to Code Across Austin II: Y'all Come Hack Now, Sat, Sep 8 http://t.co/Sk5BM7U3 We'll see y'all there! #rhok @codeforamerica @TheaClay","source":"Tweet Button","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":75361247,"id_str":"75361247","name":"Random Hacks","screen_name":"randomhacks","location":"USA","description":"Official Twitter account for Random Hacks of Kindness.","url":"http://www.rhok.org","entities":{"url":{"urls":[{"url":"http://www.rhok.org","expanded_url":null,"indices":[0,19]}]},"description":{"urls":[]}},"protected":false,"followers_count":3917,"friends_count":202,"listed_count":209,"created_at":"Fri Sep 18 19:22:26 +0000 2009","favourites_count":1,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":1173,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/profile_background_images/102109549/rhok_social_media_wallpaper.png","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/102109549/rhok_social_media_wallpaper.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/905274924/rhok_social_media_logo_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/905274924/rhok_social_media_logo_normal.png","profile_link_color":"2087E7","profile_sidebar_border_color":"2087E7","profile_sidebar_fill_color":"E8E7E7","profile_text_color":"030303","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":2,"entities":{"hashtags":[{"text":"rhok","indices":[109,114]}],"urls":[{"url":"http://t.co/Sk5BM7U3","expanded_url":"http://zvents.com/e/IhP3T/7o","display_url":"zvents.com/e/IhP3T/7o","indices":[64,84]}],"user_mentions":[{"screen_name":"codeforamerica","name":"Code for America","id":64482503,"id_str":"64482503","indices":[115,130]},{"screen_name":"TheaClay","name":"Thea Clay","id":34324747,"id_str":"34324747","indices":[131,140]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},"retweet_count":2,"entities":{"hashtags":[{"text":"rhok","indices":[126,131]}],"urls":[{"url":"http://t.co/Sk5BM7U3","expanded_url":"http://zvents.com/e/IhP3T/7o","display_url":"zvents.com/e/IhP3T/7o","indices":[81,101]}],"user_mentions":[{"screen_name":"randomhacks","name":"Random Hacks","id":75361247,"id_str":"75361247","indices":[3,15]},{"screen_name":"cod","name":"Chris OBrien","id":13791662,"id_str":"13791662","indices":[132,136]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:17:55 +0000 2012","id":244107236262170624,"id_str":"244107236262170624","text":"RT @jondot: Just published: \"Pragmatic Concurrency With #Ruby\" http://t.co/kGEykswZ /cc @JRuby @headius","source":"Twitter for iPhone","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":10248172,"id_str":"10248172","name":"Fredrik Björk","screen_name":"fbjork","location":"San Francisco, CA","description":"Director of Engineering at @banjo","url":"http://ban.jo","entities":{"url":{"urls":[{"url":"http://ban.jo","expanded_url":null,"indices":[0,13]}]},"description":{"urls":[]}},"protected":false,"followers_count":266,"friends_count":343,"listed_count":18,"created_at":"Wed Nov 14 14:58:28 +0000 2007","favourites_count":7,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":944,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http://a0.twimg.com/images/themes/theme14/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme14/bg.gif","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/2167836514/252562_10150648192185221_786305220_19068177_4887761_n_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/2167836514/252562_10150648192185221_786305220_19068177_4887761_n_normal.jpg","profile_link_color":"009999","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 15:53:34 +0000 2012","id":244101108983803904,"id_str":"244101108983803904","text":"Just published: \"Pragmatic Concurrency With #Ruby\" http://t.co/kGEykswZ /cc @JRuby @headius","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":25607541,"id_str":"25607541","name":"dotan nahum","screen_name":"jondot","location":"","description":"I'm just a mean code machine. Constantly scanning, hunting and building the next big thing.","url":"http://blog.paracode.com","entities":{"url":{"urls":[{"url":"http://blog.paracode.com","expanded_url":null,"indices":[0,24]}]},"description":{"urls":[]}},"protected":false,"followers_count":410,"friends_count":85,"listed_count":13,"created_at":"Sat Mar 21 00:26:10 +0000 2009","favourites_count":0,"utc_offset":-10800,"time_zone":"Greenland","geo_enabled":false,"verified":false,"statuses_count":784,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"2B1F44","profile_background_image_url":"http://a0.twimg.com/profile_background_images/437973354/nwgrand_516_142243.jpg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/437973354/nwgrand_516_142243.jpg","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1181955409/nd_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1181955409/nd_normal.png","profile_link_color":"1C62B9","profile_sidebar_border_color":"F1A253","profile_sidebar_fill_color":"221309","profile_text_color":"755C8A","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":8,"entities":{"hashtags":[{"text":"Ruby","indices":[44,49]}],"urls":[{"url":"http://t.co/kGEykswZ","expanded_url":"http://blog.paracode.com/2012/09/07/pragmatic-concurrency-with-ruby/","display_url":"blog.paracode.com/2012/09/07/pra…","indices":[51,71]}],"user_mentions":[{"screen_name":"jruby","name":"JRuby Dev Team","id":16132186,"id_str":"16132186","indices":[78,84]},{"screen_name":"headius","name":"Charles Nutter","id":9989362,"id_str":"9989362","indices":[85,93]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},"retweet_count":8,"entities":{"hashtags":[{"text":"Ruby","indices":[56,61]}],"urls":[{"url":"http://t.co/kGEykswZ","expanded_url":"http://blog.paracode.com/2012/09/07/pragmatic-concurrency-with-ruby/","display_url":"blog.paracode.com/2012/09/07/pra…","indices":[63,83]}],"user_mentions":[{"screen_name":"jondot","name":"dotan nahum","id":25607541,"id_str":"25607541","indices":[3,10]},{"screen_name":"jruby","name":"JRuby Dev Team","id":16132186,"id_str":"16132186","indices":[90,96]},{"screen_name":"headius","name":"Charles Nutter","id":9989362,"id_str":"9989362","indices":[97,105]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:14:53 +0000 2012","id":244106476048764928,"id_str":"244106476048764928","text":"If you are wondering how we computed the split bubbles: http://t.co/BcaqSs5u","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":43593,"id_str":"43593","name":"Mike Bostock","screen_name":"mbostock","location":"San Francisco, CA","description":"Purveyor of fine misinformations.","url":"http://bost.ocks.org","entities":{"url":{"urls":[{"url":"http://bost.ocks.org","expanded_url":null,"indices":[0,20]}]},"description":{"urls":[]}},"protected":false,"followers_count":4090,"friends_count":181,"listed_count":227,"created_at":"Tue Dec 05 21:57:30 +0000 2006","favourites_count":124,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":2237,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http://a0.twimg.com/images/themes/theme14/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme14/bg.gif","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/1434042628/mbostock-sf_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1434042628/mbostock-sf_normal.png","profile_link_color":"9F0606","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/BcaqSs5u","expanded_url":"http://bl.ocks.org/3422480","display_url":"bl.ocks.org/3422480","indices":[56,76]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:11:24 +0000 2012","id":244105599351148544,"id_str":"244105599351148544","text":"\"Write drunk. Edit sober.\"—Ernest Hemingway","source":"Twittelator Neue","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":485409945,"id_str":"485409945","name":"Fake Jack Dorsey","screen_name":"FakeDorsey","location":"San Francisco","description":"Simplify, bitches.","url":"http://square.twitter.com","entities":{"url":{"urls":[{"url":"http://square.twitter.com","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":3275,"friends_count":1,"listed_count":61,"created_at":"Tue Feb 07 05:16:26 +0000 2012","favourites_count":4,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":86,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1810072255/Untitled_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1810072255/Untitled_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":14,"entities":{"hashtags":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false},{"created_at":"Fri Sep 07 16:07:16 +0000 2012","id":244104558433951744,"id_str":"244104558433951744","text":"RT @wcmaier: Better banking through better ops: build something new with us @Simplify (remote, PDX) http://t.co/8WgzKZH3","source":"Tweetbot for iOS","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":18713,"id_str":"18713","name":"Alex Payne","screen_name":"al3x","location":"Berlin (Aug 31 - Sept 21)","description":"Programmer. Writer. Secular Humanist.","url":"http://al3x.net","entities":{"url":{"urls":[{"url":"http://al3x.net","expanded_url":null,"indices":[0,15]}]},"description":{"urls":[]}},"protected":false,"followers_count":36487,"friends_count":323,"listed_count":2272,"created_at":"Thu Nov 23 19:29:11 +0000 2006","favourites_count":4615,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":23134,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"E5E9EB","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/357750272/small_3_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/357750272/small_3_normal.png","profile_link_color":"336699","profile_sidebar_border_color":"333333","profile_sidebar_fill_color":"C3CBD0","profile_text_color":"232323","profile_use_background_image":false,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 15:27:38 +0000 2012","id":244094582411890689,"id_str":"244094582411890689","text":"Better banking through better ops: build something new with us @Simplify (remote, PDX) http://t.co/8WgzKZH3","source":"Tweetbot for iOS","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":11125102,"id_str":"11125102","name":"Will Maier","screen_name":"wcmaier","location":"Madison, WI, USA","description":"I help @Simplify ship beautiful things. Previously @lt_kije.","url":"http://wcm.aier.us/","entities":{"url":{"urls":[{"url":"http://wcm.aier.us/","expanded_url":null,"indices":[0,19]}]},"description":{"urls":[]}},"protected":false,"followers_count":240,"friends_count":193,"listed_count":16,"created_at":"Thu Dec 13 12:35:31 +0000 2007","favourites_count":2,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":3898,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/39909052/kije-final_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/39909052/kije-final_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":3,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/8WgzKZH3","expanded_url":"http://careers.simple.com/apply/LKW4tQ/Operations-Engineer.html","display_url":"careers.simple.com/apply/LKW4tQ/O…","indices":[87,107]}],"user_mentions":[{"screen_name":"Simplify","name":"Simple","id":71165241,"id_str":"71165241","indices":[63,72]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},"retweet_count":3,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/8WgzKZH3","expanded_url":"http://careers.simple.com/apply/LKW4tQ/Operations-Engineer.html","display_url":"careers.simple.com/apply/LKW4tQ/O…","indices":[100,120]}],"user_mentions":[{"screen_name":"wcmaier","name":"Will Maier","id":11125102,"id_str":"11125102","indices":[3,11]},{"screen_name":"Simplify","name":"Simple","id":71165241,"id_str":"71165241","indices":[76,85]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:05:38 +0000 2012","id":244104146997870594,"id_str":"244104146997870594","text":"We just announced Mosaic, what we've been working on since the Yobongo acquisition. My personal post, http://t.co/ELOyIRZU @heymosaic","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1882641,"id_str":"1882641","name":"Caleb Elston","screen_name":"calebelston","location":"San Francisco","description":"Co-founder & CEO of Yobongo. Dubious of people who claim to be experts. Formerly VP Products at Justin.tv. Advisor to Simpler.","url":"http://www.calebelston.com","entities":{"url":{"urls":[{"url":"http://www.calebelston.com","expanded_url":null,"indices":[0,26]}]},"description":{"urls":[]}},"protected":false,"followers_count":1960,"friends_count":151,"listed_count":136,"created_at":"Thu Mar 22 14:34:22 +0000 2007","favourites_count":815,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":7068,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"666666","profile_background_image_url":"http://a0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/322151965/ngb.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2584558450/elyaf9epw0kcnh9gxglp_normal.jpeg","profile_link_color":"0099CC","profile_sidebar_border_color":"E3E3E3","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"292E38","profile_use_background_image":false,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":4,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/ELOyIRZU","expanded_url":"http://calebelston.com/2012/09/07/meet-mosaic/","display_url":"calebelston.com/2012/09/07/mee…","indices":[102,122]}],"user_mentions":[{"screen_name":"heymosaic","name":"Mosaic","id":772256556,"id_str":"772256556","indices":[123,133]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:01:18 +0000 2012","id":244103057175113729,"id_str":"244103057175113729","text":"Donate $10 or more --> get your favorite car magnet: http://t.co/NfRhl2s2 #Obama2012","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":813286,"id_str":"813286","name":"Barack Obama","screen_name":"BarackObama","location":"Washington, DC","description":"This account is run by #Obama2012 campaign staff. Tweets from the President are signed -bo.","url":"http://www.barackobama.com","entities":{"url":{"urls":[{"url":"http://www.barackobama.com","expanded_url":null,"indices":[0,26]}]},"description":{"urls":[]}},"protected":false,"followers_count":19449227,"friends_count":673288,"listed_count":175179,"created_at":"Mon Mar 05 22:08:25 +0000 2007","favourites_count":0,"utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":true,"statuses_count":5968,"lang":"en","contributors_enabled":true,"is_translator":false,"profile_background_color":"77B0DC","profile_background_image_url":"http://a0.twimg.com/profile_background_images/584034019/tkwyaf768hs9bylnus1k.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/584034019/tkwyaf768hs9bylnus1k.jpeg","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2325704772/wrrmef61i6jl91kwkmzq_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/2325704772/wrrmef61i6jl91kwkmzq_normal.png","profile_link_color":"2574AD","profile_sidebar_border_color":"C2E0F6","profile_sidebar_fill_color":"C2E0F6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":147,"entities":{"hashtags":[{"text":"Obama2012","indices":[77,87]}],"urls":[{"url":"http://t.co/NfRhl2s2","expanded_url":"http://OFA.BO/eWNq2T","display_url":"OFA.BO/eWNq2T","indices":[56,76]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:00:25 +0000 2012","id":244102834398851073,"id_str":"244102834398851073","text":"RT @tenderlove: If corporations are people, can we use them to drive in the carpool lane?","source":"YoruFukurou","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":20941662,"id_str":"20941662","name":"James Edward Gray II","screen_name":"JEG2","location":"Edmond, OK","description":"Rubyist, Husband, Father, Atheist, Oklahoman, and all around weird guy.","url":"http://blog.grayproductions.net","entities":{"url":{"urls":[{"url":"http://blog.grayproductions.net","expanded_url":null,"indices":[0,31]}]},"description":{"urls":[]}},"protected":false,"followers_count":4206,"friends_count":174,"listed_count":389,"created_at":"Sun Feb 15 22:05:54 +0000 2009","favourites_count":0,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":11780,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EBEBEB","profile_background_image_url":"http://a0.twimg.com/images/themes/theme7/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme7/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2311650093/fkgorpzafxmsafxpf6wi_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/2311650093/fkgorpzafxmsafxpf6wi_normal.png","profile_link_color":"990000","profile_sidebar_border_color":"DFDFDF","profile_sidebar_fill_color":"F3F3F3","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 15:57:28 +0000 2012","id":244102091730210816,"id_str":"244102091730210816","text":"If corporations are people, can we use them to drive in the carpool lane?","source":"Echofon","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":14761655,"id_str":"14761655","name":"Aaron Patterson","screen_name":"tenderlove","location":"Seattle, WA","description":"ひげの山男。 When I'm not trimming my beard, I'm hanging out with my lady, @ebiltwin.","url":"http://tenderlovemaking.com","entities":{"url":{"urls":[{"url":"http://tenderlovemaking.com","expanded_url":null,"indices":[0,27]}]},"description":{"urls":[]}},"protected":false,"followers_count":10869,"friends_count":365,"listed_count":862,"created_at":"Tue May 13 17:25:31 +0000 2008","favourites_count":275,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":14623,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1261953917/headshot_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1261953917/headshot_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":10,"entities":{"hashtags":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false},"retweet_count":10,"entities":{"hashtags":[],"urls":[],"user_mentions":[{"screen_name":"tenderlove","name":"Aaron Patterson","id":14761655,"id_str":"14761655","indices":[3,14]}]},"favorited":false,"retweeted":false},{"created_at":"Fri Sep 07 16:00:03 +0000 2012","id":244102741125890048,"id_str":"244102741125890048","text":"LDN—Obama's nomination; Putin woos APEC; Bombs hit Damascus; Quakes shake China; Canada cuts Iran ties; weekend read: http://t.co/OFs6dVW4","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":632391565,"id_str":"632391565","name":"Evening Edition","screen_name":"eveningedition","location":"","description":"The perfect commute-sized way to catch up on the day's news after a long day at work. Brought to you by @MuleDesign.","url":"http://evening-edition.com","entities":{"url":{"urls":[{"url":"http://evening-edition.com","expanded_url":null,"indices":[0,26]}]},"description":{"urls":[]}},"protected":false,"followers_count":3357,"friends_count":3,"listed_count":115,"created_at":"Tue Jul 10 23:02:44 +0000 2012","favourites_count":19,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":76,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2406639576/q8cnprnmdv0z0gt6wtda_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/2406639576/q8cnprnmdv0z0gt6wtda_normal.png","profile_link_color":"CC3333","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":false,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":3,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/OFs6dVW4","expanded_url":"http://evening-edition.com","display_url":"evening-edition.com","indices":[118,138]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 16:00:00 +0000 2012","id":244102729860009984,"id_str":"244102729860009984","text":"RT @ggreenwald: Democrats parade Osama bin Laden's corpse as their proudest achievement: why this goulish jingoism is so warped http://t ...","source":"Echofon","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":14561327,"id_str":"14561327","name":"DHH","screen_name":"dhh","location":"Chicago, USA","description":"Creator of Ruby on Rails, Partner at 37signals, Co-author of NYT Best-Seller Rework, and racing driver in ALMS.","url":"http://david.heinemeierhansson.com","entities":{"url":{"urls":[{"url":"http://david.heinemeierhansson.com","expanded_url":null,"indices":[0,34]}]},"description":{"urls":[]}},"protected":false,"followers_count":63074,"friends_count":140,"listed_count":4874,"created_at":"Sun Apr 27 20:19:25 +0000 2008","favourites_count":5,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"verified":true,"statuses_count":8710,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2556368541/alng5gtlmjhrdlr3qxqv_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2556368541/alng5gtlmjhrdlr3qxqv_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":true,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Fri Sep 07 15:23:23 +0000 2012","id":244093513216696321,"id_str":"244093513216696321","text":"Democrats parade Osama bin Laden's corpse as their proudest achievement: why this goulish jingoism is so warped http://t.co/kood278s","source":"web","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":16076032,"id_str":"16076032","name":"Glenn Greenwald","screen_name":"ggreenwald","location":"","description":"Columnist & blogger for the Guardian (http://is.gd/WWjIKY) - author, With Liberty and Justice for Some - dog/animal fanatic ","url":"http://is.gd/WWjIKY","entities":{"url":{"urls":[{"url":"http://is.gd/WWjIKY","expanded_url":null,"indices":[0,19]}]},"description":{"urls":[]}},"protected":false,"followers_count":93616,"friends_count":610,"listed_count":5680,"created_at":"Mon Sep 01 03:13:32 +0000 2008","favourites_count":22,"utc_offset":-16200,"time_zone":"Caracas","geo_enabled":false,"verified":true,"statuses_count":22441,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2182259529/glenn_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/2182259529/glenn_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":95,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/kood278s","expanded_url":"http://is.gd/6rrjXd","display_url":"is.gd/6rrjXd","indices":[112,132]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},"retweet_count":95,"entities":{"hashtags":[],"urls":[],"user_mentions":[{"screen_name":"ggreenwald","name":"Glenn Greenwald","id":16076032,"id_str":"16076032","indices":[3,14]}]},"favorited":false,"retweeted":false},{"created_at":"Fri Sep 07 15:59:03 +0000 2012","id":244102490646278146,"id_str":"244102490646278146","text":"The story of Mars Curiosity's gears, made by a factory in Rockford, IL: http://t.co/MwCRsHQg","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":14372143,"id_str":"14372143","name":"Jason Fried","screen_name":"jasonfried","location":"Chicago, IL","description":"Founder of 37signals. Co-author of REWORK. Credo: It's simple until you make it complicated.","url":"http://www.37signals.com","entities":{"url":{"urls":[{"url":"http://www.37signals.com","expanded_url":null,"indices":[0,24]}]},"description":{"urls":[]}},"protected":false,"followers_count":90623,"friends_count":94,"listed_count":6724,"created_at":"Sun Apr 13 01:31:17 +0000 2008","favourites_count":502,"utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":true,"statuses_count":11501,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http://a0.twimg.com/profile_background_images/157820538/37sicon1.png","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/157820538/37sicon1.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/585991126/jasonfried-avatar_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/585991126/jasonfried-avatar_normal.jpg","profile_link_color":"0099CC","profile_sidebar_border_color":"FFF8AD","profile_sidebar_fill_color":"F6FFD1","profile_text_color":"000000","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":4,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/MwCRsHQg","expanded_url":"http://kottke.org/12/09/the-story-of-mars-curiositys-gears","display_url":"kottke.org/12/09/the-stor…","indices":[72,92]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 15:57:56 +0000 2012","id":244102209942458368,"id_str":"244102209942458368","text":"@episod @twitterapi now https://t.co/I17jUTu2 and https://t.co/deDu4Hgw seem to be missing \"1.1\" from the URL.","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":244100786940964865,"in_reply_to_status_id_str":"244100786940964865","in_reply_to_user_id":819797,"in_reply_to_user_id_str":"819797","in_reply_to_screen_name":"episod","user":{"id":7505382,"id_str":"7505382","name":"Erik Michaels-Ober","screen_name":"sferik","location":"San Francisco","description":"Vagabond.","url":"https://github.com/sferik","entities":{"url":{"urls":[{"url":"https://github.com/sferik","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":2383,"friends_count":210,"listed_count":126,"created_at":"Mon Jul 16 12:59:01 +0000 2007","favourites_count":4157,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":8342,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http://a0.twimg.com/profile_background_images/643217856/we_concept_bg2.png","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/643217856/we_concept_bg2.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1759857427/image1326743606_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"urls":[{"url":"https://t.co/I17jUTu2","expanded_url":"https://dev.twitter.com/docs/api/post/direct_messages/destroy","display_url":"dev.twitter.com/docs/api/post/…","indices":[24,45]},{"url":"https://t.co/deDu4Hgw","expanded_url":"https://dev.twitter.com/docs/api/post/direct_messages/new","display_url":"dev.twitter.com/docs/api/post/…","indices":[50,71]}],"user_mentions":[{"screen_name":"episod","name":"Taylor Singletary","id":819797,"id_str":"819797","indices":[0,7]},{"screen_name":"twitterapi","name":"Twitter API","id":6253282,"id_str":"6253282","indices":[8,19]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 15:50:47 +0000 2012","id":244100411563339777,"id_str":"244100411563339777","text":"@episod @twitterapi Did you catch https://t.co/VHsQvZT0 as well?","source":"Twitter for Mac","truncated":false,"in_reply_to_status_id":244097234432565248,"in_reply_to_status_id_str":"244097234432565248","in_reply_to_user_id":819797,"in_reply_to_user_id_str":"819797","in_reply_to_screen_name":"episod","user":{"id":7505382,"id_str":"7505382","name":"Erik Michaels-Ober","screen_name":"sferik","location":"San Francisco","description":"Vagabond.","url":"https://github.com/sferik","entities":{"url":{"urls":[{"url":"https://github.com/sferik","expanded_url":null,"indices":[0,25]}]},"description":{"urls":[]}},"protected":false,"followers_count":2383,"friends_count":210,"listed_count":126,"created_at":"Mon Jul 16 12:59:01 +0000 2007","favourites_count":4157,"utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":8342,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http://a0.twimg.com/profile_background_images/643217856/we_concept_bg2.png","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/643217856/we_concept_bg2.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1759857427/image1326743606_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"show_all_inline_media":true,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"urls":[{"url":"https://t.co/VHsQvZT0","expanded_url":"https://twitter.com/sferik/status/243988000076337152","display_url":"twitter.com/sferik/status/…","indices":[34,55]}],"user_mentions":[{"screen_name":"episod","name":"Taylor Singletary","id":819797,"id_str":"819797","indices":[0,7]},{"screen_name":"twitterapi","name":"Twitter API","id":6253282,"id_str":"6253282","indices":[8,19]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false},{"created_at":"Fri Sep 07 15:47:01 +0000 2012","id":244099460672679938,"id_str":"244099460672679938","text":"Gentlemen, you can't fight in here! This is the war room! http://t.co/kMxMYyqF","source":"Instagram","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2897431,"id_str":"2897431","name":"Dave Wiskus ","screen_name":"dwiskus","location":"Denver / Amsterdam","description":"I draw pictures of software for money.","url":"http://betterelevation.com/","entities":{"url":{"urls":[{"url":"http://betterelevation.com/","expanded_url":null,"indices":[0,27]}]},"description":{"urls":[]}},"protected":false,"followers_count":2367,"friends_count":271,"listed_count":187,"created_at":"Thu Mar 29 21:37:02 +0000 2007","favourites_count":3314,"utc_offset":-25200,"time_zone":"Mountain Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":12827,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C6E2EE","profile_background_image_url":"http://a0.twimg.com/images/themes/theme2/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme2/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1514640834/dwiskus-avatar-2011_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/1514640834/dwiskus-avatar-2011_normal.png","profile_link_color":"1F98C7","profile_sidebar_border_color":"C6E2EE","profile_sidebar_fill_color":"DAECF4","profile_text_color":"663B12","profile_use_background_image":true,"show_all_inline_media":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"entities":{"hashtags":[],"urls":[{"url":"http://t.co/kMxMYyqF","expanded_url":"http://instagr.am/p/PR5cDLzFz5/","display_url":"instagr.am/p/PR5cDLzFz5/","indices":[58,78]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false}] diff --git a/spec/list_spec.rb b/spec/list_spec.rb index e8b600cc..a24d4983 100644 --- a/spec/list_spec.rb +++ b/spec/list_spec.rb @@ -328,6 +328,7 @@ before do @list.options = @list.options.merge('color' => 'always') stub_get('/1.1/lists/statuses.json').with(query: {owner_screen_name: 'testcli', count: '20', slug: 'presidents', include_entities: 'false'}).to_return(body: fixture('statuses.json'), headers: {content_type: 'application/json; charset=utf-8'}) + stub_get('/1.1/lists/statuses.json').with(query: {owner_screen_name: 'testcli', count: '20', slug: 'presidents', include_entities: 'true'}).to_return(body: fixture('statuses_with_entities.json'), headers: {content_type: 'application/json; charset=utf-8'}) end it 'requests the correct resource' do @list.timeline('presidents') @@ -787,6 +788,101 @@ eos end end + context '--photos' do + before do + @list.options = @list.options.merge('photos' => true) + end + it 'downloads photo and converts to ASCII with netpbm' do + expect(@list).to receive(:`).with("curl -s 'http://pbs.twimg.com/media/BcSEmMuCEAALt3v.png' | pngtopnm - | pamscale -xyfill 77 20 - | ppmtoascii -1x2").and_return(['ASCII 10', 'ASCII 11'].join("\n")) + expect(@list).to receive(:`).with("curl -s 'http://pbs.twimg.com/media/BcR7UBmCcAEOnQx.jpg' | jpegtopnm - 2>/dev/null | pamscale -xyfill 77 20 - | ppmtoascii -1x2").and_return(['ASCII 20', 'ASCII 21'].join("\n")) + expect(@list).to receive(:`).with("curl -s 'http://pbs.twimg.com/media/BcSC8gaIEAAPC11.gif' | giftopnm - | pamscale -xyfill 77 20 - | ppmtoascii -1x2").and_return(['ASCII 30', 'ASCII 31'].join("\n")) + + @list.timeline('presidents') + expect($stdout.string).to eq <<-eos + @mutgoff + Happy Birthday @imdane. Watch out for those @rally pranksters! + ASCII 10 + ASCII 11 + + @ironicsans + If you like good real-life stories, check out @NarrativelyNY's just-launched + site http://t.co/wiUL07jE (and also visit http://t.co/ZoyQxqWA) + + @pat_shaughnessy + Something else to vote for: "New Rails workshops to bring more women into the + Boston software scene" http://t.co/eNBuckHc /cc @bostonrb + ASCII 20 + ASCII 21 + + @calebelston + Pushing the button to launch the site. http://t.co/qLoEn5jG + ASCII 30 + ASCII 31 + + @calebelston + RT @olivercameron: Mosaic looks cool: http://t.co/A8013C9k + + @fivethirtyeight + The Weatherman is Not a Moron: http://t.co/ZwL5Gnq5. An excerpt from my book, + THE SIGNAL AND THE NOISE (http://t.co/fNXj8vCE) + + @codeforamerica + RT @randomhacks: Going to Code Across Austin II: Y'all Come Hack Now, Sat, + Sep 8 http://t.co/Sk5BM7U3 We'll see y'all there! #rhok @codeforamerica + @TheaClay + + @fbjork + RT @jondot: Just published: "Pragmatic Concurrency With #Ruby" + http://t.co/kGEykswZ /cc @JRuby @headius + + @mbostock + If you are wondering how we computed the split bubbles: http://t.co/BcaqSs5u + + @FakeDorsey + "Write drunk. Edit sober."—Ernest Hemingway + + @al3x + RT @wcmaier: Better banking through better ops: build something new with us + @Simplify (remote, PDX) http://t.co/8WgzKZH3 + + @calebelston + We just announced Mosaic, what we've been working on since the Yobongo + acquisition. My personal post, http://t.co/ELOyIRZU @heymosaic + + @BarackObama + Donate $10 or more --> get your favorite car magnet: http://t.co/NfRhl2s2 + #Obama2012 + + @JEG2 + RT @tenderlove: If corporations are people, can we use them to drive in the + carpool lane? + + @eveningedition + LDN—Obama's nomination; Putin woos APEC; Bombs hit Damascus; Quakes shake + China; Canada cuts Iran ties; weekend read: http://t.co/OFs6dVW4 + + @dhh + RT @ggreenwald: Democrats parade Osama bin Laden's corpse as their proudest + achievement: why this goulish jingoism is so warped http://t.co/kood278s + + @jasonfried + The story of Mars Curiosity's gears, made by a factory in Rockford, IL: + http://t.co/MwCRsHQg + + @sferik + @episod @twitterapi now https://t.co/I17jUTu2 and https://t.co/deDu4Hgw seem + to be missing "1.1" from the URL. + + @sferik + @episod @twitterapi Did you catch https://t.co/VHsQvZT0 as well? + + @dwiskus + Gentlemen, you can't fight in here! This is the war room! + http://t.co/kMxMYyqF + + eos + end + end context '--csv' do before do