greedy 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Jeremy Weiland
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,36 @@
1
+ = Greedy
2
+
3
+ A simple way to use the Google Reader API to retrieve streams of content.
4
+
5
+ == Dependencies
6
+
7
+ * gdata (http://rubygems.org/gems/gdata)
8
+
9
+ == Usage Example
10
+
11
+ +list = Greedy::Stream.new("username", "password")
12
+ list.pull!("reading-list", 10)
13
+ list.entries.each do |e| = iterate over each Greedy::Entry
14
+ puts e.title
15
+ puts e.body
16
+ end
17
+ list.continue!(20).entries.each do |e| = pull next 20 and iterate over them
18
+ e.mark_as_read!
19
+ e.share!
20
+ end
21
+ list.continue!(50)
22
+ list.entries.size = 80+
23
+
24
+ == Note on Patches/Pull Requests
25
+
26
+ * Fork the project.
27
+ * Make your feature addition or bug fix.
28
+ * Add tests for it. This is important so I don't break it in a
29
+ future version unintentionally.
30
+ * Commit, do not mess with rakefile, version, or history.
31
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
32
+ * Send me a pull request. Bonus points for topic branches.
33
+
34
+ == Copyright
35
+
36
+ Copyright (c) 2010 Jeremy Weiland. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "greedy"
8
+ gem.summary = "Access a Google Reader reading list"
9
+ gem.description = "With greedy, you can access and manipulate the reading list for a Google Reader account via the API. Inspired by John Nunemaker's GoogleReader gem."
10
+ gem.email = "jeremy6d@gmail.com"
11
+ gem.homepage = "http://github.com/jeremy6d/greedy"
12
+ gem.authors = ["Jeremy Weiland"]
13
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ gem.add_development_dependency "mcmire-matchy"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'rake/testtask'
23
+ Rake::TestTask.new(:test) do |test|
24
+ test.libs << 'lib' << 'test'
25
+ test.pattern = 'test/**/test_*.rb'
26
+ test.verbose = true
27
+ end
28
+
29
+ begin
30
+ require 'rcov/rcovtask'
31
+ Rcov::RcovTask.new do |test|
32
+ test.libs << 'test'
33
+ test.pattern = 'test/**/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+ rescue LoadError
37
+ task :rcov do
38
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
39
+ end
40
+ end
41
+
42
+ task :test => :check_dependencies
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "greedy #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/greedy.gemspec ADDED
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{greedy}
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeremy Weiland"]
12
+ s.date = %q{2010-07-24}
13
+ s.description = %q{With greedy, you can access and manipulate the reading list for a Google Reader account via the API. Inspired by John Nunemaker's GoogleReader gem.}
14
+ s.email = %q{jeremy6d@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "greedy.gemspec",
27
+ "lib/greedy.rb",
28
+ "lib/greedy/connection.rb",
29
+ "lib/greedy/entry.rb",
30
+ "lib/greedy/feed.rb",
31
+ "lib/greedy/stream.rb",
32
+ "test/fixtures/another_success_hash.txt",
33
+ "test/fixtures/lorem_ipsum.txt",
34
+ "test/fixtures/success_json_hash.txt",
35
+ "test/fixtures/update_hash.txt",
36
+ "test/test_connection.rb",
37
+ "test/test_entry.rb",
38
+ "test/test_helper.rb",
39
+ "test/test_stream.rb"
40
+ ]
41
+ s.homepage = %q{http://github.com/jeremy6d/greedy}
42
+ s.rdoc_options = ["--charset=UTF-8"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.7}
45
+ s.summary = %q{Access a Google Reader reading list}
46
+ s.test_files = [
47
+ "test/test_connection.rb",
48
+ "test/test_entry.rb",
49
+ "test/test_helper.rb",
50
+ "test/test_stream.rb"
51
+ ]
52
+
53
+ if s.respond_to? :specification_version then
54
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
59
+ s.add_development_dependency(%q<mcmire-matchy>, [">= 0"])
60
+ else
61
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
62
+ s.add_dependency(%q<mcmire-matchy>, [">= 0"])
63
+ end
64
+ else
65
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
66
+ s.add_dependency(%q<mcmire-matchy>, [">= 0"])
67
+ end
68
+ end
69
+
@@ -0,0 +1,93 @@
1
+ require 'gdata'
2
+ require 'nokogiri'
3
+ require 'json'
4
+ require 'cgi'
5
+
6
+ module Greedy
7
+ class Connection
8
+ BASE_URL = "http://www.google.com/reader/api/0/"
9
+
10
+ # Create a new connection to the Google Reader API
11
+ # Example:
12
+ # Greedy::Connection.new 'username', 'password', 'my aggregator application'
13
+ def initialize(username, password, appname = "Greedy")
14
+ @username = username
15
+ @password = password
16
+ @application_name = appname
17
+ connect!
18
+ end
19
+
20
+ # Issue a GET HTTP request to the Google Reader API
21
+ # Example
22
+ # connection.fetch "stream/contents/user/-/state/com.google/unread", :c => '976H987BKU'
23
+ def fetch(path, options = {})
24
+ url = [full_path(path), convert_to_querystring(options)].join
25
+ response = @client.get url
26
+ JSON.parse response.body
27
+ rescue GData::Client::RequestError => e
28
+ if Greedy::AuthorizationError.gdata_errors.include?(e.class.to_s)
29
+ raise Greedy::AuthorizationError.new(e.message)
30
+ else
31
+ raise Greedy::ServiceError.new(e.message)
32
+ end
33
+ end
34
+
35
+ # Issue a POST HTTP request to the Google Reader API
36
+ # Example:
37
+ # connection.fetch "stream/contents/user/-/state/com.google/edit-tag", :form_data => { :async => false, :a => 'broadcast' }
38
+ def post(path, form_data = {})
39
+ uri = [full_path(path), convert_to_querystring(:client => @application_name)].join
40
+ response = @client.post uri, convert_to_post_body(form_data)
41
+ JSON.parse response.body
42
+ rescue GData::Client::RequestError => e
43
+ if Greedy::AuthorizationError.gdata_errors.include?(e.class.to_s)
44
+ raise Greedy::AuthorizationError.new(e.message)
45
+ else
46
+ raise Greedy::ServiceError.new(e.message)
47
+ end
48
+ end
49
+
50
+ # Determine the status of the connection
51
+ def connected?
52
+ !@client.nil?
53
+ end
54
+
55
+ protected
56
+ # Perform the connection based on credentials set in intitializer
57
+ # This is all straight from http://code.google.com/apis/gdata/articles/gdata_on_rails.html
58
+ def connect!
59
+ handler = GData::Auth::ClientLogin.new('reader', :account_type => "HOSTED_OR_GOOGLE")
60
+ @token = handler.get_token(@username, @password, @application_name)
61
+ @client = GData::Client::Base.new(:auth_handler => handler)
62
+ rescue GData::Client::RequestError => e
63
+ if Greedy::AuthorizationError.gdata_errors.include?(e.class.to_s)
64
+ raise Greedy::AuthorizationError.new(e.message)
65
+ else
66
+ raise Greedy::ServiceError.new(e.message)
67
+ end
68
+ end
69
+
70
+ # Build out the full path to a Googler Reader API resource
71
+ def full_path(path)
72
+ File.join(BASE_URL, path)
73
+ end
74
+
75
+ # Turn the options hash into a valid querystring for GET requests
76
+ def convert_to_querystring in_hash
77
+ "?#{parameterize(in_hash)}"
78
+ end
79
+
80
+ def convert_to_post_body in_hash = {}
81
+ parameterize in_hash.merge(:T => @token, :async => false)
82
+ end
83
+
84
+ def parameterize in_hash
85
+ result = in_hash.to_a.sort do |a,b|
86
+ a.to_s <=> b.to_s
87
+ end.collect do |key, value|
88
+ [CGI.escape(key.to_s), CGI.escape(value.to_s)].join("=")
89
+ end.join("&")
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,99 @@
1
+ module Greedy
2
+ class Entry
3
+ attr_reader :title, :author, :href, :google_item_id, :feed,
4
+ :categories, :body, :truncated_body, :stream
5
+
6
+ # Entry States
7
+ # read A read item will have the state read
8
+ # kept-unread Once you've clicked on "keep unread", an item will have the state kept-unread
9
+ # fresh When a new item of one of your feeds arrive, it's labeled as fresh. When (need to find what remove fresh label), the fresh label disappear.
10
+ # starred When your mark an item with a star, you set it's starred state
11
+ # broadcast When your mark an item as being public, you set it's broadcast state
12
+ # reading-list All you items are flagged with the reading-list state. To see all your items, just ask for items in the state reading-list
13
+ # tracking-body-link-used Set if you ever clicked on a link in the description of the item.
14
+ # tracking-emailed Set if you ever emailed the item to someone.
15
+ # tracking-item-link-used Set if you ever clicked on a link in the description of the item.
16
+ # tracking-kept-unread Set if you ever mark your read item as unread.
17
+ module States
18
+ ALL = ["read", "kept-unread", "fresh", "starred", "broadcast",
19
+ "reading-list", "tracking-body-link-used", "tracking-emailed",
20
+ "tracking-item-link-used", "tracking-kept-unread"]
21
+ ALL.each do |name|
22
+ const_set name.upcase.gsub("-", "_"), "user/-/state/com.google/#{name}"
23
+ end
24
+ end
25
+
26
+ DEFAULT_CHAR_COUNT = 2000
27
+
28
+ # Instantiate and normalize a new Google Reader entry
29
+ def initialize(item, stream)
30
+ @stream = stream
31
+ raise "Title is nil" unless item['title']
32
+ @title = normalize item['title']
33
+ @author = normalize item['author']
34
+ @href = item['alternate'].first['href']
35
+ @google_item_id = item['id']
36
+ @published = item['published']
37
+ @updated = item['updated']
38
+ body = get_body(item)
39
+ @feed = Greedy::Feed.new(item['origin'])
40
+ end
41
+
42
+ # Provide the entry time by which the entry should be sorted amongst other entries
43
+ def sort_by_time
44
+ updated_at || published_at
45
+ end
46
+
47
+ # Provide the canonical publish date in +Time+ format
48
+ def published_at
49
+ Time.at @published rescue nil
50
+ end
51
+
52
+ # Provide the canonical date and time of update in +Time+ format
53
+ def updated_at
54
+ Time.at @updated rescue nil
55
+ end
56
+
57
+ # Set the body of the entry as normalized text and create a truncated version
58
+ def body=(text, char_count = DEFAULT_CHAR_COUNT)
59
+ @body = normalize(text)
60
+ doc = Nokogiri::XML::DocumentFragment.parse(@body)
61
+ count = index = 0
62
+ truncated = false
63
+
64
+ doc.children.each do |child|
65
+ count = count + child.content.length.to_i
66
+ index = index + 1
67
+ if count > char_count
68
+ truncated = true
69
+ break
70
+ end
71
+ end
72
+
73
+ @truncated_body = doc.children.slice(0, index).to_html
74
+ @body
75
+ end
76
+
77
+ def mark_as_read!
78
+ stream.change_state_for(self, States::READ)
79
+ end
80
+
81
+ def share!
82
+ stream.change_state_for(self, States::BROADCAST)
83
+ end
84
+
85
+ protected
86
+
87
+ def get_body(item_hash)
88
+ container = item_hash['content'] || item_hash['summary'] || item_hash['description']
89
+ return container['content']
90
+ rescue
91
+ nil
92
+ end
93
+
94
+ def normalize(text)
95
+ return text if text.nil?
96
+ Nokogiri::XML::DocumentFragment.parse(text).to_html
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,13 @@
1
+ module Greedy
2
+ class Feed
3
+ attr_reader :google_feed_id, :title, :href, :entries
4
+
5
+ # Instantiate a record corresponding to a feed
6
+ def initialize(options)
7
+ @title = options['title']
8
+ @href = options['htmlUrl']
9
+ @google_feed_id = options['streamId']
10
+ @entries = options['entries'] || []
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,83 @@
1
+ require 'gdata'
2
+ require 'nokogiri'
3
+ require 'json'
4
+ require 'cgi'
5
+
6
+ module Greedy
7
+ class Stream
8
+ BASE_PATH = "stream/contents/"
9
+ CHANGE_STATE_PATH = "user/-/state/com.google/edit-tag"
10
+
11
+ attr_accessor :entries, :feeds, :last_update_token
12
+
13
+ # Instantiate a new Google Reader stream of entries based on a given entry state
14
+ def initialize(username, password, in_state = nil, in_options = {})
15
+ @connection = Greedy::Connection.new(username, password, in_options[:connection_name] || "Greedy::Stream")
16
+ reset!(in_state, in_options)
17
+ end
18
+
19
+ # Wipe the stream and reinitialize with the given state
20
+ def reset!(in_state = nil, in_options = {})
21
+ @state = in_state || @state || Greedy::Entry::States::READING_LIST
22
+ @options = in_options
23
+ @entries = pull!(endpoint(@state), @options)
24
+ @feeds = distill_feeds_from @entries
25
+ end
26
+
27
+ # Continue fetching earlier entries from where the last request left off
28
+ def continue!
29
+ new_entries = pull!(endpoint(@state), @options.merge(:c => @continuation_token))
30
+ @entries.concat new_entries
31
+ new_entries
32
+ end
33
+
34
+ # Continue fetching later entries from where the last request left off
35
+ def update!
36
+ new_entries = pull!(endpoint(@state), @options.merge(:ot => @last_update_token))
37
+ @entries = new_entries + @entries
38
+ new_entries
39
+ end
40
+
41
+ def change_state_for(entry, state)
42
+ debugger
43
+ @connection.post((BASE_PATH + CHANGE_STATE_PATH), { :a => state,
44
+ :i => entry.google_item_id,
45
+ :s => entry.feed.google_feed_id })
46
+ end
47
+
48
+ def share_all!
49
+ @entries.each { |e| e.share! }
50
+ end
51
+
52
+ def mark_all_as_read!
53
+ @entries.each { |e| e.mark_as_read! }
54
+ end
55
+
56
+ protected
57
+ # Retrieve entries based on the provided path and options
58
+ def pull! path, options
59
+ hash = @connection.fetch(path, options) || { 'items' => [] }
60
+ @continuation_token = hash['continuation'] unless options[:ot]
61
+ @last_update_token = hash['updated'] unless options[:c]
62
+ hash["items"].collect do |entry_hash|
63
+ Greedy::Entry.new entry_hash, self
64
+ end
65
+ end
66
+
67
+ # Accepts an array of entries and sets an array of feeds for the stream
68
+ def distill_feeds_from entry_list
69
+ feeds = entry_list.collect { |e| e.feed }.uniq
70
+ entry_list.each do |e|
71
+ f = feeds.find { |f| f.google_feed_id == e.feed.google_feed_id }
72
+ f.entries.push(e) if f
73
+ f.entries.uniq!
74
+ end
75
+ feeds
76
+ end
77
+
78
+ # Determine the unique URL segment for a given state
79
+ def endpoint(state)
80
+ File.join BASE_PATH, state
81
+ end
82
+ end
83
+ end
data/lib/greedy.rb ADDED
@@ -0,0 +1,32 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), %w[lib]))
2
+
3
+ require "rubygems"
4
+
5
+ require 'gdata'
6
+ require 'nokogiri'
7
+ require 'json'
8
+ require 'cgi'
9
+
10
+ require 'lib/greedy/connection'
11
+ require 'lib/greedy/stream'
12
+ require 'lib/greedy/entry'
13
+ require 'lib/greedy/feed'
14
+
15
+ module Greedy
16
+ class ConnectionError < RuntimeError
17
+ end
18
+
19
+ class AuthorizationError < ConnectionError
20
+ def self.gdata_errors
21
+ %w{AuthorizationError BadRequestError CaptchaError}.collect do |e|
22
+ "GData::Client::#{e}"
23
+ end
24
+ end
25
+ end
26
+
27
+ class ServiceError < ConnectionError
28
+ %w{ServerError UnknownError VersionConflictError}.collect do |e|
29
+ "GData::Client::#{e}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1 @@
1
+ {"items"=>[{"likingUsers"=>[], "comments"=>[], "author"=>"noreply@blogger.com (Jeremy Trombley)", "title"=>"Calling out Conservatives", "crawlTimeMsec"=>"1279763170585", "published"=>1279761780, "annotations"=>[], "alternate"=>[{"href"=>"http://feedproxy.google.com/~r/EideticIlluminations/~3/WcA87ld-1nc/calling-out-conservatives.html", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/393b756e0467a965", "origin"=>{"title"=>"Eidetic Illuminations", "htmlUrl"=>"http://jmtrom.blogspot.com/", "streamId"=>"feed/http://feeds.feedburner.com/EideticIlluminations"}, "summary"=>{"content"=>"This story has been all over the news the last few days - I've heard something about it every time I turn on NPR. Basically Shirley Sherrod at the USDA allegedly claimed to refuse help to white farmers. The video of the talk where she mentioned this was posted on some conservative blogs and Fox News (Specifically Bill O'Reilly and Sean Hannity) grabbed the story up. Sherrod was forced to resign from her position on the grounds that her actions were racist. Then the full, unedited video was posted, and it turned out that she was just providing an example of learning from past mistakes. The Obama administration apologized and offered her another job. <br><br>Here's the problem...<a href=\"http://www.nytimes.com/2010/07/22/us/politics/22sherrod.html?_r=1&amp;hp\"> the media has made this into another criticism of the Obama administration</a>. I agree, they should not have trusted these blogs and should have looked into it further before taking such harsh action. But the Obama administration is not to blame here! It's the conservative bloggers who are to blame! More and more, they're making shit up just to get people upset - this is just one case out of many - and in this case, they've won despite being exposed. Conservative bloggers and talking heads need to be called out for spreading this kind of misinformation, and not allowed to scurry away under the criticism of Obama. Why are we not hearing profuse apologies coming from O'Reilly and Hannity?<div><img width=\"1\" height=\"1\" src=\"https://blogger.googleusercontent.com/tracker/2029194950153680522-3199030301217780994?l=jmtrom.blogspot.com\" alt=\"\"></div><div>\n<a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:yIl2AUoC8zA\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=yIl2AUoC8zA\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:63t7Ie-LG7Y\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=63t7Ie-LG7Y\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:qj6IDK7rITs\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=qj6IDK7rITs\" border=\"0\"></a>\n</div><img src=\"http://feeds.feedburner.com/~r/EideticIlluminations/~4/WcA87ld-1nc\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/libertarian", "user/17398194162169227368/label/left", "user/17398194162169227368/label/blog", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279761780}, {"likingUsers"=>[], "comments"=>[], "author"=>"Jesse Walker", "title"=>"Economics Am One Lesson", "crawlTimeMsec"=>"1279761562221", "published"=>1279754100, "annotations"=>[], "alternate"=>[{"href"=>"http://reason.com/blog/2010/07/21/economics-am-one-lesson", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/bc4fee3fe7026dbc", "origin"=>{"title"=>"Reason Magazine Full Feed", "htmlUrl"=>"http://reason.com/", "streamId"=>"feed/http://reason.com/allarticles/index.xml"}, "content"=>{"content"=>"<div>\n<p>Art Caden presents <a href=\"http://blog.mises.org/13312/principles-of-bizarro-economics/\">nine\nprinciples of bizarro economics</a>.</p>\t\t</div>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/libertarian", "user/17398194162169227368/label/politics", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279754100}, {"likingUsers"=>[], "comments"=>[], "title"=>"I Once Wrote . . .", "crawlTimeMsec"=>"1279761209235", "published"=>1279759386, "annotations"=>[], "alternate"=>[{"href"=>"http://agonist.org/sean_paul_kelley/20100721/i_once_wrote", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/7a276f46f7333619", "origin"=>{"title"=>"The Agonist - thoughtful, global, timely", "htmlUrl"=>"http://agonist.org", "streamId"=>"feed/http://agonist.org/xml"}, "summary"=>{"content"=>"<p> . . . an essay on Orwell that went down the memory hole.</p>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/economics", "user/17398194162169227368/label/blog", "user/17398194162169227368/label/liberal", "user/17398194162169227368/state/com.google/fresh", "Ruminations"], "updated"=>1279759386}, {"likingUsers"=>[], "comments"=>[], "author"=>"The Cornucopia Institute", "title"=>"Farming the Future", "crawlTimeMsec"=>"1279760824216", "published"=>1279760207, "annotations"=>[], "alternate"=>[{"href"=>"http://www.cornucopia.org/2010/07/farming-the-future/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/d889579195701d19", "origin"=>{"title"=>"Cornucopia Institute", "htmlUrl"=>"http://www.cornucopia.org", "streamId"=>"feed/http://cornucopia.org/index.php/feed/"}, "content"=>{"content"=>"<p><strong>We’ve been waiting 32 years for the state to map and protect Hawai‘i’s Important Agricultural Lands. The moment may be at hand.</strong></p>\n<p><em><a href=\"http://honoluluweekly.com/cover/2010/07/farming-the-future/\">Honolulu Weekly</a><br>\nBy Ragnar Carlson</em></p>\n<p><strong>Hawaii ‘78</strong></p>\n<p>The 1978 Constitutional Convention was the most significant moment in Hawaii politics since statehood. Among other sweeping reforms–the creation of the Office of Hawaiian Affairs, the balanced-budget requirement, the establishment of term limits and the adoption of ‘Olelo Hawaii as one of two official state languages–delegates proposed an amendment designed to protect agriculture in perpetuity.</p>\n<p>A generation ago, sugar was everywhere in the Islands, but the industry was well into its decline. Con-Con delegates, led by young Kauai biology professor–and future Honolulu mayor–Jeremy Harris, worried along with the rest of the Islands that out-of-control housing development would overwhelm Hawaii agriculture.<span></span></p>\n<p>The result of the convention’s discussions was this passage:</p>\n<p>“The State shall conserve and protect agricultural lands, promote diversified agriculture, increase agricultural self-sufficiency and assure the availability of agriculturally suitable lands…Lands identified by the State as important agricultural lands needed to fulfill the purposes above shall not be reclassified by the State or rezoned by its political subdivisions without meeting the standards and criteria established by the legislature and approved by a two-thirds vote of the body responsible for the reclassification or rezoning action.”</p>\n<p>Sustainability, it turns out, was on the agenda in 1978–and not only on the minds of idealistic young convention delegates. The Important Agricultural Lands amendment went onto the ballot that fall, where it was approved by voters as Article XI ,Section 3.</p>\n<p>Had the state government acted then–that is, had it fulfilled a constitutionally mandated duty to keep agricultural land in the hands of farmers–Hawaii would almost certainly be a very different place in 2010. In the years following the Con-Con, the collapse of Hawaii’s sugar and pineapple industries left thousands of acres of prime farmland open to new uses, and developers were ready to satisfy skyrocketing demand for housing. The housing industry thrived, the farming industry–from monoculture to family farms–nose-dived, and Hawaii woke from three decades of breathless growth–dreamy or nightmarish, depending on where you stand–into a strange new century of tourism and, well, nothing else. In the face of these forces, the state did nothing on Important Agricultural Lands for almost 30 years.</p>\n<p><strong>Planting the seed</strong></p>\n<p>Clift Tsuji was elected to the State House of Representatives from the Hilo area in 2004. He now chairs the Agriculture Committee. “Immediately,” he said last week, “I was given the historic background of all of this, and a number of lawmakers said, ‘We’ve been trying to do this for 30 years, and nothing has happened and it just goes on and on.’” Tsuji said the issue immediately became a priority. “Hawaii was built on ag. The economic demise of agriculture is well known. If we have any thoughts of trying to put ag in the forefront, we better get off our bottoms and start doing something.”</p>\n<p>But do what? Voters had approved the constitutional amendment in broad form, but over the decades of inaction, no one had been able to agree on what constituted important ag land, how it would be mapped and inventoried, or what kinds of incentives and compensation would be offered to landowners whose property was deemed too agriculturally important to ever be rezoned.</p>\n<p>In 2005, the Legislature passed Act 183, which established–finally–the standards and criteria for the determination of what farmlands should be protected in perpetuity. Among the most important criteria:</p>\n<ol>\n• Capable of producing sustained high agricultural yields when treated and managed according to accepted farming methods and technology\n<p>• Economic value, whether for export or consumption</p>\n<p>• Viability for future use, even among lands not currently in production</p>\n<p>• High soil quality.</p>\n<p>• Value for traditional Hawaiian agricultural uses, such as taro cultivation</p>\n<p>• Viability for coffee, vineyards, aquaculture</p>\n<p>• Potential for biofuels</p>\n<p>• Access to water</p>\n<p>• Access to infrastructure needed to make agriculture viable, particularly roads</p></ol>\n<p>Left unanswered in 2005, however, were the twin questions of how to compensate landowners for taking their lands out of possible rezoning and redevelopment essentially forever, and how to ensure that the state actually accomplished the purpose of the IAL amendment, which was not about zoning, after all, but about ensuring a viable agricultural future for Hawaii.</p>\n<p><strong>Full bloom?</strong></p>\n<p>Three years later, in 2008, Act 233 finally brought IAL into a kind of reality by responding to these questions. The law set up a detailed process of compensation for landowners and established a timeline for landowners to voluntarily designate 85 percent of their holdings as IAL, in exchange for what amounts to a fast-tracked development process on the remaining 15 percent. In short, this means that a landholder could agree to set aside 8,500 acres from residential development permanently, with the assurance that the remaining 1,500 would receive an expedited–though not guaranteed–permitting and rezoning process.</p>\n<p>For farmers themselves, Act 233 promised substantial tax credits and other subsidies designed to make farming more viable in the Islands. These include loan guarantees, lending at below-market rates and a range of tax-credits for investment in agricultural infrastructure.</p>\n<p>That was critical, says David Arakawa, director of the Land Use Research Foundation of Hawaii, because it clarified that Important Agricultural Lands law is in fact not primarily about land, but about farming.</p>\n<p>“The IAL process has taken a long time, but more important than a sense of urgency is the understanding, which is emerging, that this is a new paradigm for Hawaii. IAL is first and foremost about supporting farmers. It’s not about how much land you take. You can have all the land in the world. If you don’t have water, and you don’t have labor, and you don’t have incentives, you can designate all the land you want, and you’re only going to have soil and stone.”</p>\n<p>The law also established a window–set to close on July 1, 2011–for landowners to voluntarily designate land as IAL. After that point, it will be left to the counties to prepare their own IAL maps, and for the state Land Use Commission to unilaterally designate lands. All of the incentives–including the 85/15 rule–will still apply.</p>\n<p>Alexander &amp; Baldwin has been the first major landowner to step into the IAL process, having designated more than 27,000 acres on Maui and 3,700 on Kauai since 2009. According to a Honolulu city official who asked not to be identified, both Kamehameha Schools and Castle &amp; Cooke are in the process of preparing designations.</p>\n<p>With the voluntary deadline just a year away, only Kauai County has so far begun the process of preparing its IAL maps–because only Kauai had state funding with which to do it.</p>\n<p>On Oahu, City Councilman Donovan Dela Cruz put money into the budget for the project this summer. “The state didn’t give the counties the funding. Most time there’s an unfunded mandate, the countries won’t do it, and that’s what happened with IAL. I put half a million into the budget this year so we can do this.”</p>\n<p>Earlier this month, Arakawa, who is part of the city’s Agricultural Development Task Force, called for the city to begin work on mapping the IAL in anticipation of next summer’s deadline on voluntary designation.</p>\n<p>Bill Brennan, spokesman for Mayor Mufi Hannemann, could not immediately say where the city was on the release of the funding, but one official, who asked not to be named, said the city’s planning department was simply waiting for the funds to become available.</p>\n<p><strong>The proof’s in the planting</strong></p>\n<p>Going forward, Arakawa and Nalo Farms owner Dean Okimoto both say that IAL is long overdue, but caution that the designation of land will not in itself revitalize farming in Hawaii.</p>\n<p>Arakawa actually points to Okimoto, who is on leave as head of the Hawaii Farm Bureau, as an example of how strapped farmers truly are. “Who’s the most famous farmer in Hawaii? Maybe Richard Ha on the Big Island, maybe the folks at MAO Organic Farm, but probably Dean Okimoto. Guess how many acres this guy, this giant of farming has in production? Five. Five acres. If that doesn’t tell you what’s going on, nothing will.”</p>\n<p>“There are some good incentives in place but if we could get everything that was necessary, it would make more of a difference,” says Okimoto. He says red-tape at the county level is a significant hindrance to many farmers looking to expand. “Look at me–it took me almost two years to go through the permitting process for a new processing facility. That raised our costs from $500,000 to $1.8 million, just because it took so long. It’s put me in jeopardy basically. We definitely need an expedited process, and more incentives for farmers to invest in the future.”</p>\n", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/activism", "user/17398194162169227368/label/business", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/cooperativism", "user/17398194162169227368/label/environmentalism", "user/17398194162169227368/state/com.google/fresh", "Media/News"], "updated"=>1279760207}, {"likingUsers"=>[], "comments"=>[], "author"=>"The Cornucopia Institute", "title"=>"Community Supported Agriculture Provides Links to Healthy Foods", "crawlTimeMsec"=>"1279760824215", "published"=>1279759831, "annotations"=>[], "alternate"=>[{"href"=>"http://www.cornucopia.org/2010/07/community-supported-agriculture-provides-links-to-healthy-foods/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/560bf580ab8092ce", "origin"=>{"title"=>"Cornucopia Institute", "htmlUrl"=>"http://www.cornucopia.org", "streamId"=>"feed/http://cornucopia.org/index.php/feed/"}, "content"=>{"content"=>"<p><strong>Consumers buy ‘shares,’ get fresh local produce </strong></p>\n<p><a href=\"http://www.news-sentinel.com/apps/pbcs.dll/article?AID=/20100721/NEWS01/7210301/1001/NEWS\"><em>Fort Wayne News Sentinel</em></a><br>\n<em>By Lauren Caggiano</em></p>\n<p>Local consumers have discovered another way to avoid the middleman when it comes to buying fresh produce.</p>\n<p>Over the last 20 years, Community Supported Agriculture (CSA) has emerged as an alternative to buying grocery store produce. In short, CSA makes it possible for consumers to buy local, seasonal food directly from a farmer.</p>\n<p>The concept is founded on a transactional relationship between the consumer and the farmer. A farmer offers a certain number of “shares” of the projected crops to the public, who then become “members.” Members help pay for seeds and additional costs.</p>\n<p>In return, the farm provides, to the best of its ability, an abundant supply of seasonal fresh produce throughout the growing season. <span></span></p>\n<p>Most often, this consists of a box of vegetables, but other farm products, like dairy items, may be included. Due to weather and things beyond the farmer’s control, the dates of produce availability are subject to change.</p>\n<p><strong>A ‘win-win situation’</strong></p>\n<p>Proponents of CSA argue it’s a win-win situation for the consumer and the farmer.</p>\n<p>“CSAs provide a link for healthy local food between consumers and the producer,” said Ricky Kemery, horticulture educator at the Allen County office of the Purdue Cooperative Extension service. “They help the local economy by providing a ready-made market for the local small producer. This reduces the risk that farmers take when they produce a crop(s) and then have to search for places to sell their product.”</p>\n<p>It’s also common for produce to be shipped hundreds or thousands of miles to distribution centers before ultimately ending up on the shelves of a local supermarket. Those transportation costs can be reduced if more consumers purchased local produce, Kemery said.</p>\n<p>Finally, Kemery said CSAs help urban dwellers become re-connected with nature and learn to appreciate and understand food production.</p>\n<p>“CSAs will have a hard time taking (the) place of supermarkets, but they are an alternative for folks who prefer local produce and want to promote a sustainable local economy,” he said.</p>\n<p><strong>Other benefits</strong></p>\n<p>For Addie Bhuiya, CSA coordinator for Graber Farms in Harlan, the difference between store-bought products and fresh-from-the farm produce is the health benefit. The farming methods that most CSA farmers follow are no-spray or organic, Bhuiya said. Ultimately, this is better for the world’s water supplies, wildlife and soil, which need to be preserved for future generations.</p>\n<p>Another added benefit is the sense of community CSA tends to create:</p>\n<p>“It is a really great way to get to know people that have like-minded interests,” she said. </p>\n<p><strong>Getting involved</strong></p>\n<p>Here are some of the community-supported agriculture providers in the Fort Wayne, Indiana area:</p>\n<ol>\n♦Country Garden &amp; Farm Market\n<p>Address: 1410 U.S. 24 West, Roanoke</p>\n<p>Phone: 672-1254</p>\n<p>Share prices: $120-$1,026</p>\n<p>Note: Check Web site for information on discounts.</p>\n<p>♦Goldwood Gardens</p>\n<p>Address: 4750 W. 350 North, northwest of Columbia City</p>\n<p>Phone: 1-260-244-6482</p>\n<p>Share prices: $250-$450</p>\n<p>Contact: Canda Goldwood, 1-260-244-6482</p>\n<p>♦Graber Farms</p>\n<p>Address: 26409 Springfield Center Road, Harlan</p>\n<p>Phone: 657-5061</p>\n<p>Share prices: $480-$825</p>\n<p>Contact: Addie Bhuiya, CSA coordinator, 241-7309 or <a href=\"mailto:aebhuiya@%20yahoo.com\">aebhuiya@ yahoo.com</a></p>\n<p>Note: CSA members get a 5 percent discount off you-pick cost for produce.</p>\n<p>♦Little Hillside CSA</p>\n<p>Address: Delivery only</p>\n<p>Phone: 403-3101</p>\n<p>Share prices: $40-$75</p>\n<p>Contact: Paul Oberly, 403-3101</p>\n<p>Note: Due to the small size of the operation, Little Hillside currently limits memberships to 20 per year, on a first-come, first-served basis.</p>\n<p>♦Old Loon Farm</p>\n<p>Address: 7551 N. Brown Road, Loon Lake, north of Columbia City</p>\n<p>Phone: 1-260-799- 4422</p>\n<p>Web site: <a href=\"http://www.oldloonfarm.com\">www.oldloonfarm.com</a></p>\n<p>Share prices: $100 (fall basket) Note: Fall share starts Sept. 15.</p>\n<p>Contact: Jane Loomis, 1-260-799-4422, <a href=\"mailto:cjloomis7551@gmail.com\">cjloomis7551@gmail.com</a></p></ol>\n", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/activism", "user/17398194162169227368/label/business", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/cooperativism", "user/17398194162169227368/label/environmentalism", "user/17398194162169227368/state/com.google/fresh", "Media/News"], "updated"=>1279759831}, {"likingUsers"=>[], "comments"=>[], "author"=>"Little Alex", "title"=>"Report: Netanyahu Bragged of Disregarding Oslo and Implementing <b>...</b>", "crawlTimeMsec"=>"1279760802312", "published"=>1279555227, "annotations"=>[], "alternate"=>[{"href"=>"http://littlealexinwonderland.wordpress.com/2010/07/19/report-netanyahu-bragged-of-disregarding-oslo-and-terror-strategy/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/e7eddd58b09fb2dd", "origin"=>{"title"=>"&quot;jeremy+weiland&quot; - Google Blog Search", "htmlUrl"=>"http://blogsearch.google.com/blogsearch?hl=en&q=%22jeremy%2Bweiland%22&ie=utf-8", "streamId"=>"feed/http://blogsearch.google.com/blogsearch_feeds?hl=en&q=%22jeremy%2Bweiland%22&ie=utf-8&num=100&output=atom"}, "content"=>{"content"=>"This post was mentioned on Twitter by LittleAlex and <b>Jeremy Weiland</b>, Dark Politricks RT. Dark Politricks RT said: RT @6dbl5321 Report: Netanyahu Bragged of Disregarding Oslo and Terror Strategy http://wp.me/pnWUd-2Tj #tlot #p2 ...", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/jeremy6d", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279555227}, {"likingUsers"=>[], "mediaGroup"=>{"content"=>[{"url"=>"http://1.gravatar.com/avatar/dc459648cc4b64d4e03f544503b49288?s=96&d=identicon&r=G"}, {"url"=>"http://ihasahotdog.files.wordpress.com/2010/03/funny-dog-pictures-bottled-water.jpg"}]}, "comments"=>[], "author"=>"chwazymoto", "title"=>"Dog Days of Summer", "crawlTimeMsec"=>"1279760613032", "published"=>1279760420, "annotations"=>[], "alternate"=>[{"href"=>"http://feedproxy.google.com/~r/IHasAHotdog/~3/bVmthKjVbNo/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/a5da47edf0ef5400", "origin"=>{"title"=>"Loldogs, Dogs &#39;n&#39; Puppy Dog Pictures - I Has A Hotdog!", "htmlUrl"=>"http://ihasahotdog.com", "streamId"=>"feed/http://feedproxy.google.com/IHasAHotdog"}, "content"=>{"content"=>"<p><em><strong>Don’t Say No to H2O</strong></em></p>\n<p><em><strong> </strong></em></p>\n<p><br>\n<img title=\"funny-dog-pictures-bottled-water\" src=\"http://ihasahotdog.files.wordpress.com/2010/03/funny-dog-pictures-bottled-water.jpg\" alt=\"funny pictures of dogs with captions\"></p>\n<p>In the age of bottled water, Ralph decided he deserved better than the toilet.</p>\n<p>Picture by: dunno source Caption by: MK via <a rel=\"nofollow\" href=\"http://cheezburger.com/\">Loldog Builder</a></p>\n<p><em><strong></strong></em></p>\n<br> Tagged: <a href=\"http://ihasahotdog.com/tag/bulldog/\">bulldog</a>, <a href=\"http://ihasahotdog.com/tag/dog-days/\">dog days</a>, <a href=\"http://ihasahotdog.com/tag/drink/\">drink</a>, <a href=\"http://ihasahotdog.com/tag/water/\">water</a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/gocomments/ihasahotdog.wordpress.com/80770/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/comments/ihasahotdog.wordpress.com/80770/\"></a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/godelicious/ihasahotdog.wordpress.com/80770/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/delicious/ihasahotdog.wordpress.com/80770/\"></a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/gostumble/ihasahotdog.wordpress.com/80770/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/stumble/ihasahotdog.wordpress.com/80770/\"></a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/godigg/ihasahotdog.wordpress.com/80770/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/digg/ihasahotdog.wordpress.com/80770/\"></a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/goreddit/ihasahotdog.wordpress.com/80770/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/reddit/ihasahotdog.wordpress.com/80770/\"></a> <img alt=\"\" border=\"0\" src=\"http://stats.wordpress.com/b.gif?host=ihasahotdog.com&amp;blog=2069225&amp;post=80770&amp;subd=ihasahotdog&amp;ref=&amp;feed=1\"><div>\n<a href=\"http://feeds.feedburner.com/~ff/IHasAHotdog?a=bVmthKjVbNo:6hfPB6M_tp0:yIl2AUoC8zA\"><img src=\"http://feeds.feedburner.com/~ff/IHasAHotdog?d=yIl2AUoC8zA\" border=\"0\"></a>\n</div>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/comic", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/humor", "user/17398194162169227368/state/com.google/fresh", "Uncategorized", "bulldog", "dog days", "drink", "water"], "updated"=>1279760420}, {"likingUsers"=>[{"userId"=>"00258619971631230464"}], "comments"=>[], "author"=>"Darian Worden", "title"=>"What Makes Bradley Manning a Hero?", "crawlTimeMsec"=>"1279759812951", "via"=>[{"href"=>"http://www.google.com/reader/public/atom/user/00258619971631230464/state/com.google/broadcast", "title"=>"Brad's shared items"}], "published"=>1279741678, "annotations"=>[], "alternate"=>[{"href"=>"http://feedproxy.google.com/~r/c4ss/~3/-Ebjz5n0bwM/3223", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/810a4fc431f95678", "origin"=>{"title"=>"Center for a Stateless Society", "htmlUrl"=>"http://c4ss.org", "streamId"=>"feed/http://feeds.feedburner.com/c4ss"}, "content"=>{"content"=>"<p>On Wednesday, July 21, members of the Facebook group <a href=\"http://www.facebook.com/savebradley\">savebradley</a> encouraged supporters to change their profile pictures to say “Google Bradley Manning.” The group hopes to raise public interest in the US Army soldier who was arrested in connection to the appearance of classified material on the website <a href=\"http://wikileaks.org/\">Wikileaks</a>.</p>\n<p>The material that Manning is in trouble for leaking includes <a href=\"http://collateralmurder.com/\">footage</a> of American helicopter crews eagerly gunning down Iraqi civilians, including the occupants of a van attempting to carry away wounded people. The giggling murderers caught on tape do not appear to have suffered any official consequences, but the soldier who exposed the killings to public scrutiny has been arrested.</p>\n<p>Manning’s increasing disillusionment with the Army was punctuated by episodes including his discovery that Iraqis had been arrested for criticizing corruption in the Prime Minister’s cabinet. After he brought the issue to his officers he was told to shut up and get more detainees. Eventually, in the face of court martial and the harshest “military justice,” Manning allegedly decided to release classified information to Wikileaks.</p>\n<p>Problems arose when he discussed his actions with the wrong person. Adrian Lamo, deciding to take the side of occupation and murder cover-ups, provided investigators with records of communications in which Manning allegedly discussed his law-breaking.</p>\n<p>So Manning felt a need to talk. Maybe even to brag to someone. This was a tactical error that doesn’t make his actions any less honorable. Are people only to act selflessly and negate pride and ambition? Nobody meets this standard. Manning just failed to exercise proper judgment.</p>\n<p>Detractors have tried to invalidate Manning’s actions by claiming that he had psychological problems or saying that he was in trouble for assaulting another soldier. If someone is unable to hold himself together while figuring out the right thing to do, it only shows that he wasn’t strong enough to prevail all of the time against forces that yanked at his conscience. And who is rational all of the time anyway?</p>\n<p>As for allegations of assault, Manning was in a profession with the explicit purpose of doing violence. If he used violence inappropriately, the best thing to do would be to try to make restitution and redeem himself. Exposing the violence the system tries to hide seems a good step towards this goal.</p>\n<p>Why shouldn’t Manning have been angry at the system and those knowingly complicit in it? If oppression wasn’t so infuriating, it might never be fought against.</p>\n<p>Everybody must deal with stress and everybody makes mistakes. A hero is not someone without weakness. A hero is someone who manages to do the right thing in spite of his weaknesses.</p>\n<p>Manning realized the tyranny of an organization he played an active part in. Instead of force-feeding himself more propaganda or eating his gun, he did something positive about it.</p>\n<p>As Henry David Thoreau said in Civil Disobedience, “Must the citizen ever for a moment, or in the least degree, resign his conscience to the legislator? Why has every man a conscience, then?”</p>\n<p>Bradley Manning did not resign his conscience to his officers or to policy makers.</p>\n<p>His moral choice provides an example for others to look to. If more soldiers, commanders, and politicians took responsibility for their actions and honestly evaluated the claims of authority that have been battered into them since birth, the world would be much better.</p>\n<p>Holding heroes to an unrealistic standard of perfection means idolizing lies. The truth is, nobody is that great. Some overcome their flaws to do great things. When Bradley Manning found that he was complicit in the violent suppression of freedom, he did the best he could to make things right.</p>\n<p>And now he sits in a jail cell while those who make the policies of death sleep comfortably.</p>\n<div>\n<a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:yIl2AUoC8zA\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=yIl2AUoC8zA\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:D7DqB2pKExk\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=-Ebjz5n0bwM:kvy0PG29pRQ:D7DqB2pKExk\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:F7zBnMyn0Lo\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=-Ebjz5n0bwM:kvy0PG29pRQ:F7zBnMyn0Lo\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:V_sGLiPBpWU\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=-Ebjz5n0bwM:kvy0PG29pRQ:V_sGLiPBpWU\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:qj6IDK7rITs\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=qj6IDK7rITs\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:l6gmwiTKsz0\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=l6gmwiTKsz0\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:gIN9vFwOqvQ\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=-Ebjz5n0bwM:kvy0PG29pRQ:gIN9vFwOqvQ\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=-Ebjz5n0bwM:kvy0PG29pRQ:TzevzKxY174\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=TzevzKxY174\" border=\"0\"></a>\n</div><img src=\"http://feeds.feedburner.com/~r/c4ss/~4/-Ebjz5n0bwM\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/00258619971631230464/state/com.google/broadcast", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/state/com.google/broadcast-friends", "user/17398194162169227368/state/com.google/fresh", "Commentary", "adrian lamo", "bradley manning", "hacking", "hero", "Iraq", "wikileaks"], "updated"=>1279741678}, {"likingUsers"=>[{"userId"=>"12833142084095559233"}, {"userId"=>"00258619971631230464"}, {"userId"=>"16394323617704064098"}], "comments"=>[], "author"=>"Kevin Carson", "title"=>"The “Internet Kill Switch” Works Both Ways", "crawlTimeMsec"=>"1279759808068", "via"=>[{"href"=>"http://www.google.com/reader/public/atom/user/00258619971631230464/state/com.google/broadcast", "title"=>"Brad's shared items"}], "published"=>1279658257, "annotations"=>[], "alternate"=>[{"href"=>"http://feedproxy.google.com/~r/c4ss/~3/auTfEFaefHo/3214", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/ceda2865d6700267", "origin"=>{"title"=>"Center for a Stateless Society", "htmlUrl"=>"http://c4ss.org", "streamId"=>"feed/http://feeds.feedburner.com/c4ss"}, "content"=>{"content"=>"<p>In a recent column (“<a href=\"http://c4ss.org/content/3197\">Homeland Security Mission Creep:  ‘Intellectual Propety Crime’</a>“),  I wrote that file-sharing had apparently become the latest “terrorist threat” targeted by the national  security state.  Against this background, the immediatelty following shutdown of 73,000 blogs using the blogetery Wordpress platform hosted by Burstnet is especially alarming.  Burstnet announced that, in compliance with an urgent and extraordinary request by “law enforcement officials,” it was shutting down blogetery.   Their motivation is suggested by the tens of thousands of hits if you Google the blogetery site for “rapidshare” and “megaupload.”</p>\n<p>Maybe this is what Holy Handwringing Joe Lieberman meant by an Internet “kill switch” to protect against “terrorism.”</p>\n<p>This is just the latest example of a growing phenomenon:  businesses treating their own customers as criminal suspects, while serving “the Authorities” as their primary actual clientele.  That’s why your bank informs the Feds of large money transactions, Home Depot reports purchases of chemicals used in meth labs, and the drug store keeps track of the amount of Sudafed you buy.</p>\n<p>The first question that comes to mind is:  Who pays Burstnet’s bills — “the Authorities” or the customers?</p>\n<p>A friend at work recently had a relevant experience with her broadband ISP, Cox Communications.  Apparently her grandkids had downloaded a movie from some torrent site and Disney had leaned on Cox (with Cox presumably rolling over and giving them customer records without due process).  The lady at the cable office called her up and began warning her “You need to monitor your grandkids more closely,” and assorted other things she “needed to do.”  Normally I’d expect that kind of condescending lecture from someone who was paying ME money, not the other way around.</p>\n<p>If you haven’t had your daily dose of irony, Secretary of State Clinton recently warned other countries against the dangers of imposing burdens on civil society:  “progress in the 21st century depends on the ability of individuals to coalesce around shared goals, and harness the power of their convictions. But when governments crack down on the right of citizens to work together, as they have throughout history, societies fall into stagnation and decay.”</p>\n<p>Clinton added that “Democracies don’t fear their own people.”  I imagine the guy in the Guy Fawkes mask would get a big laugh out of that.  For a government that doesn’t fear its own people, the U.S. “democracy” spends an awful lot of time obsessing over whether we’re ingesting prohibited substances into our own bodies, downloading songs, and other “terroristic” activities that it’s made its business.  Talk about paranoia!  “Now nothing will be withheld from them, which they have imagined to do.”</p>\n<p>The shutdown of file-sharing sites will probably backfire, I’m afraid.  Such authoritarian actions by the Copyright Nazis and their government spear-carriers will, I fear, lead to an outcome that should alarm all good citizens.  Sadly, denial-of-service attacks against the websites of various government agencies, the RIAA and MPAA, have become increasingly frequent in recent years.  If you’re the kind of juvenile person who takes misguided pleasure in seeing bad things happen to some of the most wicked people in the world, just Google “DOS+attack RIAA+website.”   Shocking.</p>\n<p>At one time the cat and mouse game between hackers and the RIAA got so intense that for a while the RIAA was constantly shifting its site around between low-profile servers, to protect itself from hackers (kind of like Saddam randomly sleeping in a different palace every night as an anti-assassination precaution).</p>\n<p>The latest such incident was “Operation T*tstorm,” a distributed DOS attack by the hacker group “Anonymous” on the sites of the Australian Parliament and Ministry of Communications in retaliation for increased censorship of porn websites.</p>\n<p>Thank God these poor misguided anti-social saps have mitigated the potential harm by focusing up till now on  the public websites of organizations they hate, instead of on the intranets on which their actual functioning as organizations depends.  I greatly fear that someday soon some utterly reprehensible sociopath will manage to do this, and when someone like Mitch Bainwol shows up at work and logs on to check his email, he’ll see nothing but a blank screen.</p>\n<div>\n<a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:yIl2AUoC8zA\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=yIl2AUoC8zA\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:D7DqB2pKExk\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=auTfEFaefHo:shmhwuTzums:D7DqB2pKExk\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:F7zBnMyn0Lo\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=auTfEFaefHo:shmhwuTzums:F7zBnMyn0Lo\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:V_sGLiPBpWU\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=auTfEFaefHo:shmhwuTzums:V_sGLiPBpWU\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:qj6IDK7rITs\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=qj6IDK7rITs\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:l6gmwiTKsz0\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=l6gmwiTKsz0\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:gIN9vFwOqvQ\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?i=auTfEFaefHo:shmhwuTzums:gIN9vFwOqvQ\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/c4ss?a=auTfEFaefHo:shmhwuTzums:TzevzKxY174\"><img src=\"http://feeds.feedburner.com/~ff/c4ss?d=TzevzKxY174\" border=\"0\"></a>\n</div><img src=\"http://feeds.feedburner.com/~r/c4ss/~4/auTfEFaefHo\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/00258619971631230464/state/com.google/broadcast", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/state/com.google/broadcast-friends", "user/17398194162169227368/state/com.google/fresh", "Commentary"], "updated"=>1279658257}, {"likingUsers"=>[], "comments"=>[], "author"=>"Rad Geek", "title"=>"Wednesday Lazy Linking", "crawlTimeMsec"=>"1279758974686", "published"=>1279749600, "annotations"=>[], "alternate"=>[{"href"=>"http://radgeek.com/gt/2010/07/21/wednesday-lazy-linking/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/690fa557b6db7501", "origin"=>{"title"=>"Rad Geek People&#39;s Daily", "htmlUrl"=>"http://radgeek.com/", "streamId"=>"feed/http://radgeek.com/feed/atom"}, "content"=>{"content"=>"<ul>\n\t<li><p><a href=\"http://feedproxy.google.com/~r/FalseDichotomyByCharlesDavis/~3/7jF7fMVrYZ4/united-states-of-british-petroleum.html\">The United States of British Petroleum. Charles Davis, <cite>false dichotomy by charles davis</cite> (2010-07-17)</a>. <q>If you're anything like me, or if you've spent more than five minutes over the last decade glancing at the headlines, you're probably suffering from some form of outrage fatigue. Well, make room for one more thing to get mad about. From Reuters: Fishermen in Mississippi say they are angry...</q> <em style=\"font-size:smaller\">(Linked Monday 2010-07-19.)</em></p></li>\n\t<li><p><a href=\"http://pandagon.net/index.php/site/dont_shoot_a_milk_enema_all_over_my_leg_and_tell_me_its_raining/#When:11:35:00Z\">Don’t shoot a milk enema all over my leg and tell me it’s raining. <cite>pandagon.net - it&#39;s the eye of the panda, it&#39;s the thrill of the bite</cite> (2010-07-20)</a>. <q>by Amanda Marcotte I’ve been following this “Buttman” trial with some interest, though I rightly suspected that it wouldn’t get far.  I was glad when the case was dismissed. I dislike vicious, mean-spirited pornography as much as the next person who loves humanity, but I also tend to be a...</q> <em style=\"font-size:smaller\">(Linked Tuesday 2010-07-20.)</em></p></li>\n</ul>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/1st_priority", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/libertarian", "user/17398194162169227368/label/left", "user/17398194162169227368/label/anarchist", "user/17398194162169227368/label/blog", "user/17398194162169227368/state/com.google/fresh", "Lazy Linking", "Barack Obama", "BP", "Corporatism", "Legal Issues"], "updated"=>1279749600, "replies"=>[{"href"=>"http://radgeek.com/gt/2010/07/21/wednesday-lazy-linking/#comments", "type"=>"text/html"}, {"href"=>"http://radgeek.com/gt/2010/07/21/wednesday-lazy-linking/feed/", "type"=>"application/atom+xml"}]}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6597907/VA/Richmond/Doc-Branch-amp-The-Keynotes/Emilio39s-Restaurante/"}], "title"=>"Jul 30, 2010: Doc Branch &amp; The Keynotes at Emilio&#39;s Restaurante", "crawlTimeMsec"=>"1279757115657", "published"=>1279754810, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6597907/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/519e7c9ddf2b83c3", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"Richmond&#39;s longest running jazz jam<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279754810}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598319/DC/Richmond/Caulit-Anything-Jason-E-Call/The-National/"}], "title"=>"Aug 6, 2010: Caulit Anything, Jason E. Call at The National", "crawlTimeMsec"=>"1279757115645", "published"=>1279775346, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598319/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/93f6317f665d6d69", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"Caulit Anything<br>\nJason E. Call<br>\nwith Special Guests<br><br>\nGenre/Extra Info: Tickets on sale now at all Ticketmaster outlets, nattickets.com, ticketstobuy.com, and The National box office<br><br>\ndate:Fri., Aug. 6<br><br>\nshow time:7:00 PM<br><br>\ndoors open:6:30PM<br><br>\nprice:$10.00<br><br>\nday of show:$13.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775346}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598323/DC/Richmond/This-Life-Departed/The-National/"}], "title"=>"Aug 14, 2010: This Life Departed at The National", "crawlTimeMsec"=>"1279757115636", "published"=>1279775554, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598323/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/5906f3e42bef0bfb", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"This Life Departed<br>\nwith Special Guests<br><br>\nGenre/Extra Info: Tickets on sale now at all Ticketmaster outlets, nattickets.com, ticketstobuy.com, and The National box office<br><br>\ndate:Sat., Aug. 14<br><br>\nshow time:7:00 PM<br><br>\ndoors open:6:30PM<br><br>\nprice:$10.00<br><br>\nday of show:$13.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775554}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598326/VA/Richmond/Tribal-Seeds-Lionize-Three-Legged-Fox/The-Canal-Club/"}], "title"=>"Aug 4, 2010: Tribal Seeds, Lionize, Three Legged Fox at The Canal Club", "crawlTimeMsec"=>"1279757115636", "published"=>1279775646, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598326/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/107039c9decafb40", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"Tribal Seeds<br>\nLionize<br>\nThree Legged Fox<br><br>\n7:00 doors<br><br>\n$20.00/$25.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775646}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598327/VA/Richmond/The-Whigs-Marionette-The-Hounds/The-Canal-Club/"}], "title"=>"Aug 7, 2010: The Whigs, Marionette, The Hounds at The Canal Club", "crawlTimeMsec"=>"1279757115636", "published"=>1279775765, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598327/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/8778ecb1b7de8b3a", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"WNRN presents<br>\nThe Whigs<br>\nMarionette<br>\nThe Hounds<br><br>\n7:00 doors<br><br>\n$8.00/$10.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775765}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598329/VA/Richmond/House-of-Heroes-The-Greater-the-Risk-Glass-Clovers-Alleyways-and-Avenues/The-Canal-Club/"}], "title"=>"Aug 11, 2010: House of Heroes, The Greater the Risk, Glass Clovers, Alleyways and Avenues at The Canal Club", "crawlTimeMsec"=>"1279757115635", "published"=>1279775900, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598329/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/d4c361e27e6cfb6b", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"House of Heroes<br>\nThe Greater the Risk<br>\nGlass Clovers<br>\nAlleyways and Avenues<br><br>\n6:30 doors<br><br>\n$12.00/$14.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775900}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598332/VA/Richmond/Soilwork-Death-Angel-Augury-Mutiny-Within-Swashbuckle-Impale-the-Sun/The-Canal-Club/"}], "title"=>"Aug 12, 2010: Soilwork, Death Angel, Augury, Mutiny Within, Swashbuckle, Impale the Sun at The Canal Club", "crawlTimeMsec"=>"1279757115624", "published"=>1279775994, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598332/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/01912552af148e6a", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"Big Daddy Productions presents<br>\nSoilwork<br>\nDeath Angel<br>\nAugury<br>\nMutiny Within<br>\nSwashbuckle<br>\nImpale the Sun<br><br>\n6:00 doors<br><br>\n$20.00/$25.00<br><br>\nMeet&amp;Greet one hour before doors<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279775994}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598333/VA/Richmond/The-Influence-Halflit-Halo/The-Canal-Club/"}], "title"=>"Aug 13, 2010: The Influence, Halflit Halo at The Canal Club", "crawlTimeMsec"=>"1279757115618", "published"=>1279776094, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598333/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/17b724889a981d5d", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"The Influence<br>\nHalflit Halo<br><br>\n8:00 doors<br><br>\n$8.00/$10.00<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279776094}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598335/VA/Richmond/Facing-Heights-Keegan-Vessel/The-Camel/"}], "title"=>"Aug 1, 2010: Facing Heights, Keegan, Vessel at The Camel", "crawlTimeMsec"=>"1279757115607", "published"=>1279776230, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598335/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/67fa929999c4107c", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"6:00 doors<br>\n$5.00 cover<br><br>\nwww.thecamel.org<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279776230}, {"likingUsers"=>[], "comments"=>[], "related"=>[{"href"=>"http://upcoming.yahoo.com/event/6598336/VA/Richmond/Jason-Scott-Jazz/The-Camel/"}], "title"=>"Aug 2, 2010: Jason Scott Jazz at The Camel", "crawlTimeMsec"=>"1279757115607", "published"=>1279776305, "annotations"=>[], "alternate"=>[{"href"=>"http://upcoming.yahoo.com/event/6598336/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/5d9e4d405f054445", "origin"=>{"title"=>"Upcoming: Richmond Events", "htmlUrl"=>"http://upcoming.yahoo.com/metro/us/va/rva/", "streamId"=>"feed/http://upcoming.org/syndicate/v2/metro/381"}, "summary"=>{"content"=>"9:00 doors<br>\n$5.00 cover<br><br>\nwww.thecamel.org<br>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/local", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279776305}], "self"=>[{"href"=>"http://www.google.com/reader/api/0/stream/contents/user/-/state/com.google/reading-list?c=CPPUt6mB_qIC"}], "author"=>"Jeremy", "title"=>"Jeremy's reading list in Google Reader", "continuation"=>"CKXmmOLq_aIC", "id"=>"user/17398194162169227368/state/com.google/reading-list", "updated"=>1279763170, "direction"=>"ltr"}
@@ -0,0 +1 @@
1
+ <p>Lorem ipsum putant alterum in ius. Ex partiendo honestatis ius, ex ignota lucilius eam. Nec modo utroque mentitum id, id erant adipisci democritum qui. Veniam altera vim ex. In nullam constituto mei, singulis electram adipiscing eu nam. Eos debet impedit perpetua ad, movet luptatum sit at. </p> <p> Ut sale utinam has, at eam enim fabellas probatus. Id sea autem nostro maiorum, ridens cotidieque an eam. Dolore corpora pro cu, eu quodsi probatus deseruisse sea. Eu ullum oratio voluptatum vim. </p> <p> Quo labore iisque erroribus ne, homero doctus ex usu. His dicant aliquam verterem in. Eum id zzril altera. Per ei novum perpetua salutandi, noluisse scaevola sententiae an eam. </p> <p> Mea no noluisse persequeris, ea eos mazim possit salutandi, aeque malorum eloquentiam usu te. Et vidit nostrum pertinax sea, eros voluptua officiis in vis. Te dolorum molestie inciderint est. Mea ei populo quaeque euripidis, invenire democritum omittantur et mel. Nullam epicurei ex nam, no mea cetero disputationi. Ne utinam feugait sed. No impedit appareat mei, qui at facete aperiam comprehensam, omnes complectitur mea id. </p> <p> Eum nostrud laoreet invidunt ne, puto elitr per ex. Modo accusamus ex eos. Sit cu dicam nominati, animal regione eam at. Prima tation suavitate ea eam. Sea error perpetua consetetur ex, duo inani decore dissentias ne. Quidam inimicus vis ad, modo duis et pro, id porro dicunt maluisset eos. </p> <p> In elitr ceteros laboramus vis, cu meliore scribentur eum. Ne graece corpora vim, in zzril tamquam persecuti pro. Mel dicit eripuit ad, fugit rationibus consectetuer cu cum. Qui mandamus adipiscing in. Ei duo meis liber, his admodum tincidunt ad. Mea ut detracto iracundia. </p> <p> Vel altera labore ponderum an, ea has sapientem gloriatur, ad vim prompta eleifend. Ut per nostro alterum noluisse, in eruditi nostrum vim. No fugit virtute alterum mei, vis ne autem clita. Duo in sonet epicurei expetenda, ea movet erroribus ius, ne usu nihil nobis. Legere liberavisse his ne, pri cibo invenire cotidieque ut. No elaboraret referrentur sit, sea ne iuvaret oporteat. Eum cu quidam maiorum, est ex indoctum rationibus voluptatibus. </p> <p> Puto reque porro ea has. Et nam tota vidisse incorrupte. Ex tamquam consectetuer vis, quo tollit sanctus alienum et. An error nostro cum. Qui probo possit aperiri an, hinc nihil intellegat duo ex. </p> <p> Et assum audire meliore vix. Meis qualisque consequat an nam, mel soleat explicari patrioque no. Sed mollis suavitate corrumpit ex, veniam elaboraret sit ne. Vidit virtute ancillae at nec. Sale iudico feugait ad mei, alia aliquam nusquam nec te. </p> <p> Vel natum postea ei. Mei an tractatos accommodare, est id facete doctus splendide, est alii zzril cu. Id saepe animal pro, dicunt pertinacia efficiendi nec ei. Vel no audiam legimus menandri. Agam postea accusam eum ne. Quis fabellas eu pro. Quo ullum deterruisset et, eu atqui scripserit ius, vix diam omnium et. </p> <p> Vivendo elaboraret eam ne. Probo eleifend has no, id persius recusabo reformidans ius. Laudem euismod voluptaria est te. Solet commodo dissentiet sed in, quidam principes evertitur his ea. Sed ex nostrum senserit, eros postulant nec eu. </p> <p> Odio erant nostro te per. Nec cu etiam regione, oblique elaboraret quo ea, idque munere voluptatibus te per. Vim eruditi molestiae intellegat an. Id tibique corpora perpetua vim, ne has quidam prompta nonummy. Harum contentiones nam an, vim stet accusam praesent ex. Eu aperiam eloquentiam sit. </p> <p> Id mel ubique lucilius. Et hinc conceptam mel, agam quot ea qui, an amet pertinax vis. Mei omittam lucilius instructior ex, sea commodo mentitum et, quis amet meis per te. Eam quas appellantur ad, ius ei quem justo adolescens. </p> <p> Graece nostrum in nec, assum choro ubique ad quo, ei sonet virtute dignissim eum. Duo an epicuri urbanitas. Et aliquip democritum referrentur cum, ex vel error nostro maiorum. At harum labitur delicata mea, cibo dicta viderer in per. Copiosae persecuti sed ex, has te eruditi liberavisse. Eu cum wisi ferri, quo brute mucius id. </p> <p> Vim ea altera omittantur. Eu sumo duis iusto cum, enim ocurreret an qui, ei eirmod erroribus quo. Ne nam fierent delectus, at pro nihil legere numquam. Rebum oratio prompta ius ne, ut sea suas solet vulputate. Vim ut laudem eruditi. </p> <p> Ut temporibus dissentiet mea, eos accumsan luptatum tincidunt at, te cum suas expetendis interesset. Modo dolorem nec ex, ad postea vocibus inimicus nec, ne vim legimus intellegat. Viderer praesent dignissim nec et, assum assueverit eu usu. Graeco reprimique vis eu, ad his iudicabit reprimique appellantur, pro ad wisi similique voluptatum. Eu nusquam officiis eos, nec cu atqui fabulas. </p> <p> An mentitum perfecto sed, duo esse oblique ei. Per latine dolorem contentiones et, alia erant maiorum ex mei. At mel puto consulatu. Ius ei eruditi vocibus. An vix maluisset dissentias. Eos cu eruditi impedit evertitur, ad summo adipisci concludaturque usu. </p> <p> Ut porro etiam vis. In mei hinc ocurreret, harum indoctum eum at. Pro eu assum percipit democritum, modo solet et usu, brute paulo cum ad. Sit omnis vivendo et, eam eirmod antiopam cu. Ferri graece persecuti mel cu. </p> <p> Aliquip atomorum postulant qui eu, ne omnes honestatis his, nec eripuit tibique repudiandae eu. Oratio gubergren has ut. Amet idque propriae ea usu, ad vim quando ceteros. Vel at sanctus omittantur, mei an commodo erroribus posidonium, wisi verterem perfecto usu ei. Elitr fabellas oportere et has. </p> <p> His te atqui errem prodesset, cibo latine an duo. Eos puto pericula suscipiantur ne, everti vocibus consulatu has te, eu lorem graeci ancillae eos. Ex falli vulputate cum, id putant dictas pertinacia mel. An eum exerci animal vivendo, duo et voluptatum signiferumque. </p> <p> Erat habeo dissentias his ad, pro no ubique tempor conclusionemque. Usu ei porro repudiandae, vix ex suas erroribus. Ne quaeque graecis vim, ad impedit persequeris pro. Ad simul utroque voluptatibus vim. </p> <p> At vel atqui dolore aliquando, te idque repudiandae usu. Cum ponderum salutatus persecuti ut. Cum reque scaevola adipiscing at, nam reque interpretaris id. Eum ex menandri senserit. Vidisse adipisci facilisis sit in, cum eu definitionem mediocritatem, everti bonorum philosophia no cum. </p> <p> Clita labitur inimicus et duo. Ex vim alii sint oportere, nam alienum sadipscing an. Graece mediocrem in mei, mundi aperiri cum in. Urbanitas similique nam id, aliquid oporteat an eum. </p> <p> Nulla latine gloriatur an mea, eu utinam periculis vel. Meliore honestatis mea cu. Idque nullam adolescens at sit, ex inani necessitatibus cum, nam no omittam accumsan. Erat exerci constituto quo an. Noster indoctum conclusionemque eam in. </p> <p> Est ne vivendum posidonium, mea no cibo errem aliquip. Quis dolor accommodare est eu, eu fastidii praesent sit. Has vidisse patrioque pertinacia ad. Paulo scribentur theophrastus est et. Et nec soleat vivendum oportere. Ea principes honestatis scribentur ius, odio qualisque repudiandae vis no. </p> <p> No blandit salutandi eum, est cu voluptua senserit. Nisl solum choro ad his, pri ea doctus quaestio maiestatis, eu pri atqui inermis appellantur. Eos soleat commodo suscipit ne, duo no vocent aliquid efficiendi, oratio mentitum deserunt mea ad. An sed iisque accusam intellegebat, sed modus cotidieque eu. Vis ne dolorum efficiantur. </p> <p> Amet putant consectetuer vix in. Cum puto sale accusata ne, usu et magna repudiandae definitiones. Sed et appareat assueverit. Vix ne veri euripidis, pro detracto atomorum mnesarchum cu. Sea minim dignissim te. </p> <p> Prompta electram eam eu, ad clita quaestio recteque per. Ea mundi dolor vis. Ut elitr tibique duo. Novum prompta epicuri ne eum. Pro docendi platonem te, an ubique noster dissentiunt sed, eam saperet corrumpit ne. </p> <p> Cu duo graeco essent convenire, est in unum justo argumentum. Alii urbanitas his ei, duis lucilius sea an. Graece putent concludaturque ex mea. Ius salutandi salutatus persecuti te, ea meis ubique quaestio sit. Posse tempor intellegat eam at, mei alia iusto repudiandae eu. </p> <p> His id primis volumus consulatu. No vel expetendis efficiendi, atqui mazim signiferumque sed ne, impetus definiebas scripserit sea id. Simul ubique admodum te sit, est ea audiam equidem. Sed an melius partiendo definiebas, ea vis dicit dolor. Nostro voluptua eos ne, ei eam viris appetere liberavisse. Qui reque ponderum menandri et. </p> <p> At movet assentior mea, vel in elitr quaeque inimicus. Mea no alia consulatu, et mea patrioque definiebas. Inani dolor verear pri et, ei epicuri explicari molestiae per, tollit detraxit vel ne. Te augue falli usu. </p> <p> Eruditi torquatos sit cu, usu vidit vidisse nonummy ex. Quo in ferri nominati scriptorem. Qui alii civibus ut, eos quem graeco causae ei, eu erant ludus mei. Id usu homero mentitum. </p> <p> Id clita oportere intellegam mea, nec laudem ridens an. Nam fabulas saperet docendi id, mutat debitis torquatos te mei. Movet gloriatur definitiones ex nec, ius nonumy discere dolorem ei. In sit ubique temporibus, appetere gubergren eum ad. Ius ceteros vivendo suavitate ex, vidit graecis definitiones quo ex. Utinam integre mei cu, cu eius iusto vivendum quo. </p> <p> At mea hinc persequeris. Vix et paulo dicant pericula. Vis in volutpat aliquando pertinacia, amet tota no his. Ius duis prompta et. In usu veniam exerci, detracto imperdiet gloriatur in est. </p> <p> Usu oratio nominati concludaturque ne. Mutat audiam mel at. Usu justo nonummy ut. Ut quo tation lucilius, vim tale mutat semper no. Paulo veritus atomorum vim id, at pro vivendo appareat appetere, pri cu duis tritani detraxit. </p> <p> Adhuc suscipit no nec. Vidisse nusquam interpretaris at per, quaestio consequat duo et, eum et oratio partiendo iracundia. Persequeris definitiones his ne. In homero laudem pro, amet nihil blandit ea qui, eos cibo laudem laoreet no. Ad unum solet dissentiunt vis. Ex mel odio vocibus. </p> <p> Ne ius tation imperdiet, nulla quando veritus his id. Referrentur intellegebat ne usu. Eam te wisi viris dissentias, et vis summo habemus. Prima quando eirmod id nec, qui mazim aperiri definiebas te. At magna dicta voluptatum eam, eu sit takimata adolescens. Consetetur cotidieque in mel. Vel mazim laoreet repudiare in. </p> <p> Quo denique eloquentiam cu, duo eu minim civibus, te ridens nonummy pri. Vel magna semper ad. Vituperata reformidans eum ad, quo essent probatus consequuntur ut. Eu mel labitur suavitate, vix ex illud lucilius. In choro denique vis, autem munere iuvaret eos eu, semper feugiat in eam. </p> <p> Eu zzril gloriatur liberavisse mel. His cibo ubique cu, ei brute detraxit mea. Mea no paulo mundi, libris habemus nec ad. Verterem electram philosophia usu ei, harum mentitum maluisset ad quo. </p> <p> Simul eirmod menandri sed cu, ea modo dissentiet vis, disputando definitiones ius id. Alia mnesarchum theophrastus pri et, in altera accusata mediocritatem nec. Vidisse efficiantur in vel, solet praesent conceptam his eu. Vis veniam accusata id, id apeirian signiferumque eos, dicit dissentiunt in nam. Eam salutandi patrioque ne, an vocent impetus habemus mei. Eam ceteros salutandi contentiones eu, ea nec autem minim. </p> <p> Detraxit petentium vis ea, sit cu meis ceteros moderatius. Facer soleat voluptatum ei his, et duo nisl repudiandae, ex qui vivendo lucilius periculis. Dolorem suscipit molestiae no pri, vix ridens instructior an. Pro solet timeam minimum an. </p> <p> Vim hendrerit assueverit definitionem ad. An nec dicat aeque primis. Commune neglegentur sed no, quod mundi accommodare et vix. Tempor fabellas ei eam. At mea etiam dissentias, per voluptua imperdiet ea. Vocent epicuri voluptatibus nam eu, ut nec debet oratio vivendum. </p> <p> Ut duo wisi blandit. Ad nisl clita virtute cum. Erant iriure qui ex, meis alienum mea ei. Ne ubique appetere quo, cu consul perfecto indoctum his, pri id nostro apeirian. Sale persius disputationi ne quo. </p> <p> Nam explicari democritum ut, quas nemore appetere sea ne. Fugit veniam at ius, alii atomorum no vis, ne persecuti voluptatibus vix. Ad omnes graeci nec. Persius dolores sadipscing mel no, nemore tractatos facilisis et vix. </p> <p> An veniam timeam ius, pri ad modo patrioque, vel ne audiam fastidii eloquentiam. Eam et amet movet deserunt, his denique dissentiet at, et quot invidunt adipiscing usu. Ut pro volutpat honestatis, sit an vide quaeque. Sea cu idque mediocrem, nusquam volumus intellegam ex his. </p> <p> Ne sed invenire persecuti. His at erat accusam adversarium, vis an ludus electram aliquando, pro ex hinc ludus saperet. Tota idque debet per ad, forensibus scripserit cu ius, sumo patrioque rationibus pro ex. Errem graeci adipisci eam ad, vis illum officiis an, ei tamquam volutpat eloquentiam qui. Ea posse inciderint usu. </p> <p> Ex sed wisi officiis. Error vivendum senserit id usu. Oporteat tractatos id usu, exerci oblique qualisque vix eu, velit sonet delectus te has. Alia nonumy vim ut, mei ut graeco mandamus. </p> <p> Pro ad congue ignota. Dicunt civibus percipitur te vim. Cu homero denique eos, posse scripta fabulas ex mel. Ut accusam eligendi salutandi pro, ut alia ferri inani sed. Veniam vocent suscipiantur cu vix, mucius rationibus assueverit mei te, sed ei simul possim. His et dicant consequuntur voluptatibus, et congue quidam torquatos his. Nec at meliore omnesque. </p> <p> Cu modus forensibus duo, quis stet elaboraret vix te. Ei usu cibo salutatus, ne his dolor essent, pri praesent persequeris in. Ei prima laboramus vulputate vis, tation partem lobortis ei sea, no dictas aeterno quaestio eam. Apeirian splendide ei his. </p> <p> Nec cetero complectitur in, ut accumsan oporteat assueverit eum, sit legimus fabellas at. Vero iisque dolorum id eam, et has legere dissentias, eos in ceteros quaestio. Mea ut habeo appellantur dissentiunt. Eu labore vulputate liberavisse his. </p> <p> Eum ea eius omnesque. Cu harum tibique vis, choro eripuit comprehensam cum ea. Ad iudico expetenda sit, inermis nonummy nominati ea pro, congue consulatu qui ne. Cu aeque consul legere eam. Ne movet malorum sit, at vis vide repudiandae, vis diceret iudicabit percipitur in. </p> <p> Vitae aliquip sanctus has cu, legere atomorum sit ei. Melius accumsan has at, ex pro elit abhorreant. Eum ad fabulas quaerendum, te kasd magna labores est, erat natum maiestatis nec at. Et usu saepe alterum accumsan. </p> <p> Eos te vivendo denique oportere. Eos eu fugit apeirian honestatis. Ei sint lucilius consequuntur vel. Ut quis forensibus eloquentiam pro. Ad partiendo prodesset his, eum deleniti abhorreant efficiendi cu. </p> <p> Sit omnes aperiam cu. Pro ei iudico option, duo no noster labores. Nec verear postulant expetendis an, nam amet consetetur eu. Ei est nostro constituto. </p> <p> Suas nihil eam no, sonet zzril lobortis et qui. Homero partem eu his, cum in dicat adversarium. Delenit ponderum eos cu. Pri insolens accusata neglegentur ad, an has dictas eloquentiam, laudem menandri at sed. Cu mei quis agam omnesque. Cu putant sapientem ius, recusabo partiendo in sit. </p> <p> Ea facete ceteros luptatum vim, sint equidem accumsan no eam. Saperet incorrupte comprehensam eam id, vel et quod fabellas, atqui facete voluptua vis in. Id pri appareat disputationi, ubique impetus mel at. Usu ipsum labitur erroribus ei, his in cibo petentium splendide. </p> <p> Aperiam mediocritatem vituperatoribus ex cum. Facer philosophia ad has, eam prima officiis laboramus in, et prima placerat tincidunt eum. Pri tritani delicatissimi no. Ea pro nonumy partem evertitur, deleniti fabellas mei ea, te per prima dicta ceteros. Dignissim incorrupte necessitatibus mea ut. </p> <p> Sit iriure eripuit ex. Duis zzril virtute mea in, causae euripidis nec ad. Pro omnis tibique fierent cu, accusata intellegat vix ex, quo mandamus euripidis dissentias ea. Eius indoctum ex vim, agam oratio vel an, mel quaestio forensibus ut. Ad eum dicit alterum. Te assum deleniti scriptorem his, affert maiestatis mnesarchum usu id. </p> <p> Vix ferri exerci admodum at, vim electram intellegat in. Cibo posse velit id eum, ex per ullum scripta adolescens. Id minim veritus dissentiet sed, has ad semper invidunt. Veri eleifend ullamcorper usu in. </p> <p> Eam duis petentium ut, ei debet melius equidem eum. Utinam quaeque vix te, fuisset albucius his ne, ipsum ridens no qui. Ludus antiopam eos in. Voluptua recteque repudiandae his eu, mea.</p>
@@ -0,0 +1 @@
1
+ {"items"=>[{"likingUsers"=>[], "comments"=>[], "author"=>"noreply@blogger.com (Jeremy Trombley)", "title"=>"Calling out Conservatives", "crawlTimeMsec"=>"1279763170585", "published"=>1279761780, "annotations"=>[], "alternate"=>[{"href"=>"http://feedproxy.google.com/~r/EideticIlluminations/~3/WcA87ld-1nc/calling-out-conservatives.html", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/393b756e0467a965", "origin"=>{"title"=>"Eidetic Illuminations", "htmlUrl"=>"http://jmtrom.blogspot.com/", "streamId"=>"feed/http://feeds.feedburner.com/EideticIlluminations"}, "summary"=>{"content"=>"This story has been all over the news the last few days - I've heard something about it every time I turn on NPR. Basically Shirley Sherrod at the USDA allegedly claimed to refuse help to white farmers. The video of the talk where she mentioned this was posted on some conservative blogs and Fox News (Specifically Bill O'Reilly and Sean Hannity) grabbed the story up. Sherrod was forced to resign from her position on the grounds that her actions were racist. Then the full, unedited video was posted, and it turned out that she was just providing an example of learning from past mistakes. The Obama administration apologized and offered her another job. <br><br>Here's the problem...<a href=\"http://www.nytimes.com/2010/07/22/us/politics/22sherrod.html?_r=1&amp;hp\"> the media has made this into another criticism of the Obama administration</a>. I agree, they should not have trusted these blogs and should have looked into it further before taking such harsh action. But the Obama administration is not to blame here! It's the conservative bloggers who are to blame! More and more, they're making shit up just to get people upset - this is just one case out of many - and in this case, they've won despite being exposed. Conservative bloggers and talking heads need to be called out for spreading this kind of misinformation, and not allowed to scurry away under the criticism of Obama. Why are we not hearing profuse apologies coming from O'Reilly and Hannity?<div><img width=\"1\" height=\"1\" src=\"https://blogger.googleusercontent.com/tracker/2029194950153680522-3199030301217780994?l=jmtrom.blogspot.com\" alt=\"\"></div><div>\n<a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:yIl2AUoC8zA\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=yIl2AUoC8zA\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:63t7Ie-LG7Y\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=63t7Ie-LG7Y\" border=\"0\"></a> <a href=\"http://feeds.feedburner.com/~ff/EideticIlluminations?a=WcA87ld-1nc:SiNRSQT2kSY:qj6IDK7rITs\"><img src=\"http://feeds.feedburner.com/~ff/EideticIlluminations?d=qj6IDK7rITs\" border=\"0\"></a>\n</div><img src=\"http://feeds.feedburner.com/~r/EideticIlluminations/~4/WcA87ld-1nc\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/libertarian", "user/17398194162169227368/label/left", "user/17398194162169227368/label/blog", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279761780}, {"likingUsers"=>[], "comments"=>[], "author"=>"Jesse Walker", "title"=>"Economics Am One Lesson", "crawlTimeMsec"=>"1279761562221", "published"=>1279754100, "annotations"=>[], "alternate"=>[{"href"=>"http://reason.com/blog/2010/07/21/economics-am-one-lesson", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/bc4fee3fe7026dbc", "origin"=>{"title"=>"Reason Magazine Full Feed", "htmlUrl"=>"http://reason.com/", "streamId"=>"feed/http://reason.com/allarticles/index.xml"}, "content"=>{"content"=>"<div>\n<p>Art Caden presents <a href=\"http://blog.mises.org/13312/principles-of-bizarro-economics/\">nine\nprinciples of bizarro economics</a>.</p>\t\t</div>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/libertarian", "user/17398194162169227368/label/politics", "user/17398194162169227368/state/com.google/fresh"], "updated"=>1279754100}, {"likingUsers"=>[], "comments"=>[], "title"=>"I Once Wrote . . .", "crawlTimeMsec"=>"1279761209235", "published"=>1279759386, "annotations"=>[], "alternate"=>[{"href"=>"http://agonist.org/sean_paul_kelley/20100721/i_once_wrote", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/7a276f46f7333619", "origin"=>{"title"=>"The Agonist - thoughtful, global, timely", "htmlUrl"=>"http://agonist.org", "streamId"=>"feed/http://agonist.org/xml"}, "summary"=>{"content"=>"<p> . . . an essay on Orwell that went down the memory hole.</p>", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/economics", "user/17398194162169227368/label/blog", "user/17398194162169227368/label/liberal", "user/17398194162169227368/state/com.google/fresh", "Ruminations"], "updated"=>1279759386}, {"likingUsers"=>[], "comments"=>[], "author"=>"The Cornucopia Institute", "title"=>"Farming the Future", "crawlTimeMsec"=>"1279760824216", "published"=>1279760207, "annotations"=>[], "alternate"=>[{"href"=>"http://www.cornucopia.org/2010/07/farming-the-future/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/d889579195701d19", "origin"=>{"title"=>"Cornucopia Institute", "htmlUrl"=>"http://www.cornucopia.org", "streamId"=>"feed/http://cornucopia.org/index.php/feed/"}, "content"=>{"content"=>"<p><strong>We’ve been waiting 32 years for the state to map and protect Hawai‘i’s Important Agricultural Lands. The moment may be at hand.</strong></p>\n<p><em><a href=\"http://honoluluweekly.com/cover/2010/07/farming-the-future/\">Honolulu Weekly</a><br>\nBy Ragnar Carlson</em></p>\n<p><strong>Hawaii ‘78</strong></p>\n<p>The 1978 Constitutional Convention was the most significant moment in Hawaii politics since statehood. Among other sweeping reforms–the creation of the Office of Hawaiian Affairs, the balanced-budget requirement, the establishment of term limits and the adoption of ‘Olelo Hawaii as one of two official state languages–delegates proposed an amendment designed to protect agriculture in perpetuity.</p>\n<p>A generation ago, sugar was everywhere in the Islands, but the industry was well into its decline. Con-Con delegates, led by young Kauai biology professor–and future Honolulu mayor–Jeremy Harris, worried along with the rest of the Islands that out-of-control housing development would overwhelm Hawaii agriculture.<span></span></p>\n<p>The result of the convention’s discussions was this passage:</p>\n<p>“The State shall conserve and protect agricultural lands, promote diversified agriculture, increase agricultural self-sufficiency and assure the availability of agriculturally suitable lands…Lands identified by the State as important agricultural lands needed to fulfill the purposes above shall not be reclassified by the State or rezoned by its political subdivisions without meeting the standards and criteria established by the legislature and approved by a two-thirds vote of the body responsible for the reclassification or rezoning action.”</p>\n<p>Sustainability, it turns out, was on the agenda in 1978–and not only on the minds of idealistic young convention delegates. The Important Agricultural Lands amendment went onto the ballot that fall, where it was approved by voters as Article XI ,Section 3.</p>\n<p>Had the state government acted then–that is, had it fulfilled a constitutionally mandated duty to keep agricultural land in the hands of farmers–Hawaii would almost certainly be a very different place in 2010. In the years following the Con-Con, the collapse of Hawaii’s sugar and pineapple industries left thousands of acres of prime farmland open to new uses, and developers were ready to satisfy skyrocketing demand for housing. The housing industry thrived, the farming industry–from monoculture to family farms–nose-dived, and Hawaii woke from three decades of breathless growth–dreamy or nightmarish, depending on where you stand–into a strange new century of tourism and, well, nothing else. In the face of these forces, the state did nothing on Important Agricultural Lands for almost 30 years.</p>\n<p><strong>Planting the seed</strong></p>\n<p>Clift Tsuji was elected to the State House of Representatives from the Hilo area in 2004. He now chairs the Agriculture Committee. “Immediately,” he said last week, “I was given the historic background of all of this, and a number of lawmakers said, ‘We’ve been trying to do this for 30 years, and nothing has happened and it just goes on and on.’” Tsuji said the issue immediately became a priority. “Hawaii was built on ag. The economic demise of agriculture is well known. If we have any thoughts of trying to put ag in the forefront, we better get off our bottoms and start doing something.”</p>\n<p>But do what? Voters had approved the constitutional amendment in broad form, but over the decades of inaction, no one had been able to agree on what constituted important ag land, how it would be mapped and inventoried, or what kinds of incentives and compensation would be offered to landowners whose property was deemed too agriculturally important to ever be rezoned.</p>\n<p>In 2005, the Legislature passed Act 183, which established–finally–the standards and criteria for the determination of what farmlands should be protected in perpetuity. Among the most important criteria:</p>\n<ol>\n• Capable of producing sustained high agricultural yields when treated and managed according to accepted farming methods and technology\n<p>• Economic value, whether for export or consumption</p>\n<p>• Viability for future use, even among lands not currently in production</p>\n<p>• High soil quality.</p>\n<p>• Value for traditional Hawaiian agricultural uses, such as taro cultivation</p>\n<p>• Viability for coffee, vineyards, aquaculture</p>\n<p>• Potential for biofuels</p>\n<p>• Access to water</p>\n<p>• Access to infrastructure needed to make agriculture viable, particularly roads</p></ol>\n<p>Left unanswered in 2005, however, were the twin questions of how to compensate landowners for taking their lands out of possible rezoning and redevelopment essentially forever, and how to ensure that the state actually accomplished the purpose of the IAL amendment, which was not about zoning, after all, but about ensuring a viable agricultural future for Hawaii.</p>\n<p><strong>Full bloom?</strong></p>\n<p>Three years later, in 2008, Act 233 finally brought IAL into a kind of reality by responding to these questions. The law set up a detailed process of compensation for landowners and established a timeline for landowners to voluntarily designate 85 percent of their holdings as IAL, in exchange for what amounts to a fast-tracked development process on the remaining 15 percent. In short, this means that a landholder could agree to set aside 8,500 acres from residential development permanently, with the assurance that the remaining 1,500 would receive an expedited–though not guaranteed–permitting and rezoning process.</p>\n<p>For farmers themselves, Act 233 promised substantial tax credits and other subsidies designed to make farming more viable in the Islands. These include loan guarantees, lending at below-market rates and a range of tax-credits for investment in agricultural infrastructure.</p>\n<p>That was critical, says David Arakawa, director of the Land Use Research Foundation of Hawaii, because it clarified that Important Agricultural Lands law is in fact not primarily about land, but about farming.</p>\n<p>“The IAL process has taken a long time, but more important than a sense of urgency is the understanding, which is emerging, that this is a new paradigm for Hawaii. IAL is first and foremost about supporting farmers. It’s not about how much land you take. You can have all the land in the world. If you don’t have water, and you don’t have labor, and you don’t have incentives, you can designate all the land you want, and you’re only going to have soil and stone.”</p>\n<p>The law also established a window–set to close on July 1, 2011–for landowners to voluntarily designate land as IAL. After that point, it will be left to the counties to prepare their own IAL maps, and for the state Land Use Commission to unilaterally designate lands. All of the incentives–including the 85/15 rule–will still apply.</p>\n<p>Alexander &amp; Baldwin has been the first major landowner to step into the IAL process, having designated more than 27,000 acres on Maui and 3,700 on Kauai since 2009. According to a Honolulu city official who asked not to be identified, both Kamehameha Schools and Castle &amp; Cooke are in the process of preparing designations.</p>\n<p>With the voluntary deadline just a year away, only Kauai County has so far begun the process of preparing its IAL maps–because only Kauai had state funding with which to do it.</p>\n<p>On Oahu, City Councilman Donovan Dela Cruz put money into the budget for the project this summer. “The state didn’t give the counties the funding. Most time there’s an unfunded mandate, the countries won’t do it, and that’s what happened with IAL. I put half a million into the budget this year so we can do this.”</p>\n<p>Earlier this month, Arakawa, who is part of the city’s Agricultural Development Task Force, called for the city to begin work on mapping the IAL in anticipation of next summer’s deadline on voluntary designation.</p>\n<p>Bill Brennan, spokesman for Mayor Mufi Hannemann, could not immediately say where the city was on the release of the funding, but one official, who asked not to be named, said the city’s planning department was simply waiting for the funds to become available.</p>\n<p><strong>The proof’s in the planting</strong></p>\n<p>Going forward, Arakawa and Nalo Farms owner Dean Okimoto both say that IAL is long overdue, but caution that the designation of land will not in itself revitalize farming in Hawaii.</p>\n<p>Arakawa actually points to Okimoto, who is on leave as head of the Hawaii Farm Bureau, as an example of how strapped farmers truly are. “Who’s the most famous farmer in Hawaii? Maybe Richard Ha on the Big Island, maybe the folks at MAO Organic Farm, but probably Dean Okimoto. Guess how many acres this guy, this giant of farming has in production? Five. Five acres. If that doesn’t tell you what’s going on, nothing will.”</p>\n<p>“There are some good incentives in place but if we could get everything that was necessary, it would make more of a difference,” says Okimoto. He says red-tape at the county level is a significant hindrance to many farmers looking to expand. “Look at me–it took me almost two years to go through the permitting process for a new processing facility. That raised our costs from $500,000 to $1.8 million, just because it took so long. It’s put me in jeopardy basically. We definitely need an expedited process, and more incentives for farmers to invest in the future.”</p>\n", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/activism", "user/17398194162169227368/label/business", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/cooperativism", "user/17398194162169227368/label/environmentalism", "user/17398194162169227368/state/com.google/fresh", "Media/News"], "updated"=>1279760207}, {"likingUsers"=>[], "comments"=>[], "author"=>"The Cornucopia Institute", "title"=>"Community Supported Agriculture Provides Links to Healthy Foods", "crawlTimeMsec"=>"1279760824215", "published"=>1279759831, "annotations"=>[], "alternate"=>[{"href"=>"http://www.cornucopia.org/2010/07/community-supported-agriculture-provides-links-to-healthy-foods/", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/560bf580ab8092ce", "origin"=>{"title"=>"Cornucopia Institute", "htmlUrl"=>"http://www.cornucopia.org", "streamId"=>"feed/http://cornucopia.org/index.php/feed/"}, "content"=>{"content"=>"<p><strong>Consumers buy ‘shares,’ get fresh local produce </strong></p>\n<p><a href=\"http://www.news-sentinel.com/apps/pbcs.dll/article?AID=/20100721/NEWS01/7210301/1001/NEWS\"><em>Fort Wayne News Sentinel</em></a><br>\n<em>By Lauren Caggiano</em></p>\n<p>Local consumers have discovered another way to avoid the middleman when it comes to buying fresh produce.</p>\n<p>Over the last 20 years, Community Supported Agriculture (CSA) has emerged as an alternative to buying grocery store produce. In short, CSA makes it possible for consumers to buy local, seasonal food directly from a farmer.</p>\n<p>The concept is founded on a transactional relationship between the consumer and the farmer. A farmer offers a certain number of “shares” of the projected crops to the public, who then become “members.” Members help pay for seeds and additional costs.</p>\n<p>In return, the farm provides, to the best of its ability, an abundant supply of seasonal fresh produce throughout the growing season. <span></span></p>\n<p>Most often, this consists of a box of vegetables, but other farm products, like dairy items, may be included. Due to weather and things beyond the farmer’s control, the dates of produce availability are subject to change.</p>\n<p><strong>A ‘win-win situation’</strong></p>\n<p>Proponents of CSA argue it’s a win-win situation for the consumer and the farmer.</p>\n<p>“CSAs provide a link for healthy local food between consumers and the producer,” said Ricky Kemery, horticulture educator at the Allen County office of the Purdue Cooperative Extension service. “They help the local economy by providing a ready-made market for the local small producer. This reduces the risk that farmers take when they produce a crop(s) and then have to search for places to sell their product.”</p>\n<p>It’s also common for produce to be shipped hundreds or thousands of miles to distribution centers before ultimately ending up on the shelves of a local supermarket. Those transportation costs can be reduced if more consumers purchased local produce, Kemery said.</p>\n<p>Finally, Kemery said CSAs help urban dwellers become re-connected with nature and learn to appreciate and understand food production.</p>\n<p>“CSAs will have a hard time taking (the) place of supermarkets, but they are an alternative for folks who prefer local produce and want to promote a sustainable local economy,” he said.</p>\n<p><strong>Other benefits</strong></p>\n<p>For Addie Bhuiya, CSA coordinator for Graber Farms in Harlan, the difference between store-bought products and fresh-from-the farm produce is the health benefit. The farming methods that most CSA farmers follow are no-spray or organic, Bhuiya said. Ultimately, this is better for the world’s water supplies, wildlife and soil, which need to be preserved for future generations.</p>\n<p>Another added benefit is the sense of community CSA tends to create:</p>\n<p>“It is a really great way to get to know people that have like-minded interests,” she said. </p>\n<p><strong>Getting involved</strong></p>\n<p>Here are some of the community-supported agriculture providers in the Fort Wayne, Indiana area:</p>\n<ol>\n♦Country Garden &amp; Farm Market\n<p>Address: 1410 U.S. 24 West, Roanoke</p>\n<p>Phone: 672-1254</p>\n<p>Share prices: $120-$1,026</p>\n<p>Note: Check Web site for information on discounts.</p>\n<p>♦Goldwood Gardens</p>\n<p>Address: 4750 W. 350 North, northwest of Columbia City</p>\n<p>Phone: 1-260-244-6482</p>\n<p>Share prices: $250-$450</p>\n<p>Contact: Canda Goldwood, 1-260-244-6482</p>\n<p>♦Graber Farms</p>\n<p>Address: 26409 Springfield Center Road, Harlan</p>\n<p>Phone: 657-5061</p>\n<p>Share prices: $480-$825</p>\n<p>Contact: Addie Bhuiya, CSA coordinator, 241-7309 or <a href=\"mailto:aebhuiya@%20yahoo.com\">aebhuiya@ yahoo.com</a></p>\n<p>Note: CSA members get a 5 percent discount off you-pick cost for produce.</p>\n<p>♦Little Hillside CSA</p>\n<p>Address: Delivery only</p>\n<p>Phone: 403-3101</p>\n<p>Share prices: $40-$75</p>\n<p>Contact: Paul Oberly, 403-3101</p>\n<p>Note: Due to the small size of the operation, Little Hillside currently limits memberships to 20 per year, on a first-come, first-served basis.</p>\n<p>♦Old Loon Farm</p>\n<p>Address: 7551 N. Brown Road, Loon Lake, north of Columbia City</p>\n<p>Phone: 1-260-799- 4422</p>\n<p>Web site: <a href=\"http://www.oldloonfarm.com\">www.oldloonfarm.com</a></p>\n<p>Share prices: $100 (fall basket) Note: Fall share starts Sept. 15.</p>\n<p>Contact: Jane Loomis, 1-260-799-4422, <a href=\"mailto:cjloomis7551@gmail.com\">cjloomis7551@gmail.com</a></p></ol>\n", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/activism", "user/17398194162169227368/label/business", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/label/cooperativism", "user/17398194162169227368/label/environmentalism", "user/17398194162169227368/state/com.google/fresh", "Media/News"], "updated"=>1279759831}], "self"=>[{"href"=>"http://www.google.com/reader/api/0/stream/contents/user/-/state/com.google/reading-list?n=5"}], "author"=>"Jeremy", "title"=>"Jeremy's reading list in Google Reader", "continuation"=>"continuationtoken", "id"=>"user/17398194162169227368/state/com.google/reading-list", "updated"=>1234567890, "direction"=>"ltr"}
@@ -0,0 +1 @@
1
+ {"items"=>[{"likingUsers"=>[], "comments"=>[], "author"=>"rss@officer.com (Maggie Ybarra)", "title"=>"Fake Texas Cop Tries to Pull Over Undercover Officer", "crawlTimeMsec"=>"1279769942562", "published"=>1279773120, "annotations"=>[], "alternate"=>[{"href"=>"http://feeds.officer.com/~r/officerrss/top_news_stories/~3/UmVWa_XwtRc/article.jsp", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/1b233c6c984c64b0", "origin"=>{"title"=>"Officer.com: Top News Stories", "htmlUrl"=>"http://www.officer.com", "streamId"=>"feed/http://feeds.officer.com/officerrss/top_news_stories"}, "summary"=>{"content"=>"Jeremy Hernandez, 20, was arrested after he tried to pull over an undercover police officer.<img src=\"http://feeds.feedburner.com/~r/officerrss/top_news_stories/~4/UmVWa_XwtRc\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/law_enforcement", "user/17398194162169227368/label/mainstream", "user/17398194162169227368/label/news", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/state/com.google/fresh", "Top News Stories"], "updated"=>1279773120}], "self"=>[{"href"=>"http://www.google.com/reader/api/0/stream/contents/user/-/state/com.google/reading-list?"}], "author"=>"Jeremy", "title"=>"Jeremy's reading list in Google Reader", "continuation"=>"CKDIsM2M_qIC", "id"=>"user/17398194162169227368/state/com.google/reading-list", "updated"=>1279769942, "direction"=>"ltr"}
@@ -0,0 +1,91 @@
1
+ require 'test_helper'
2
+
3
+ class TestConnection < Test::Unit::TestCase
4
+ context "A Greedy connection" do
5
+ setup do
6
+ @client = stub("gdata client connection")
7
+ @handler = stub("client login handler")
8
+ @handler.stubs(:get_token).with("username", "password", "app").returns("token")
9
+ GData::Client::Base.stubs(:new).with(:auth_handler => @handler).returns(@client)
10
+ GData::Auth::ClientLogin.stubs(:new).with("reader", :account_type => "HOSTED_OR_GOOGLE").returns(@handler)
11
+ @connection = Greedy::Connection.new("username", "password", "app")
12
+ end
13
+
14
+ context "upon instantiation when authentication succeeds" do
15
+ should "store the Google username" do
16
+ @connection.instance_variable_get("@username").should == "username"
17
+ end
18
+
19
+ should "store the Google password" do
20
+ @connection.instance_variable_get("@password").should == "password"
21
+ end
22
+
23
+ should "store the name of the app using this account" do
24
+ @connection.instance_variable_get("@application_name").should == "app"
25
+ end
26
+
27
+ should "set the connection object" do
28
+ @connection.instance_variable_get("@client").should == @client
29
+ end
30
+
31
+ should "correctly respond to connection state inquiry" do
32
+ @connection.should be_connected
33
+ end
34
+ end
35
+
36
+ context "upon instantiation when authentication fails" do
37
+ context "because of a 403" do
38
+ setup do
39
+ @response = stub("response", :status_code => '403', :body => "Error=BadAuthentication")
40
+ @handler.stubs(:get_token).with("username", "password", "app").raises(GData::Client::AuthorizationError, @response)
41
+ end
42
+
43
+ should "raise an authentication error" do
44
+ lambda { Greedy::Connection.new("username", "password", "app") }.should raise_error(Greedy::AuthorizationError)
45
+ end
46
+ end
47
+ end
48
+
49
+ context "using GData to" do
50
+ setup do
51
+ @body = stub("unparsed response body")
52
+ @response = stub("google reader API response", :body => @body)
53
+ @return_hash = { :eeny => 'meeny', :miney => "moe" }
54
+ JSON.stubs(:parse).with(@body).returns(@return_hash)
55
+ end
56
+
57
+ context "retrieve data" do
58
+ setup do
59
+ @client.stubs(:get).returns(@response)
60
+ end
61
+
62
+ should "construct a valid url to the API given a path and options" do
63
+ valid_urls = ["http://www.google.com/reader/api/0/path/to/resource?n=10&t=wesdg",
64
+ "http://www.google.com/reader/api/0/path/to/resource?t=wesdg&n=10"]
65
+ @client.expects(:get).with do |value|
66
+ valid_urls.include?(value)
67
+ end.returns(@response)
68
+ @connection.fetch("path/to/resource", :n => 10, :t => "wesdg")
69
+ end
70
+
71
+ should "be able to return the response" do
72
+ JSON.expects(:parse).with(@body).returns(@return_hash)
73
+ @connection.fetch("path").should == @return_hash
74
+ end
75
+ end
76
+
77
+ context "send data" do
78
+ should "send a POST to the path with the options turned into the POST body" do
79
+ @client.expects(:post).with("http://www.google.com/reader/api/0/sample/path?client=app",
80
+ "T=token&async=false&option=one").returns(@response)
81
+ @connection.post "sample/path", :option => "one"
82
+ end
83
+
84
+ should "be able to handle the response" do
85
+ @client.stubs(:post).returns(@response)
86
+ @connection.post("path/to/resource").should == @return_hash
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class TestEntry < Test::Unit::TestCase
4
+ context "A Greedy entry" do
5
+ setup do
6
+ @stream = stub("Greedy::Stream")
7
+ @raw_entry = {"likingUsers"=>[], "comments"=>[], "author"=>"rss@officer.com (Maggie Ybarra)", "title"=>"Fake Texas Cop Tries to Pull Over Undercover Officer", "crawlTimeMsec"=>"1279769942562", "published"=>1279773120, "annotations"=>[], "alternate"=>[{"href"=>"http://feeds.officer.com/~r/officerrss/top_news_stories/~3/UmVWa_XwtRc/article.jsp", "type"=>"text/html"}], "id"=>"tag:google.com,2005:reader/item/1b233c6c984c64b0", "origin"=>{"title"=>"Officer.com: Top News Stories", "htmlUrl"=>"http://www.officer.com", "streamId"=>"feed/http://feeds.officer.com/officerrss/top_news_stories"}, "summary"=>{"content"=>"Jeremy Hernandez, 20, was arrested after he tried to pull over an undercover police officer.<img src=\"http://feeds.feedburner.com/~r/officerrss/top_news_stories/~4/UmVWa_XwtRc\" height=\"1\" width=\"1\">", "direction"=>"ltr"}, "categories"=>["user/17398194162169227368/label/law_enforcement", "user/17398194162169227368/label/mainstream", "user/17398194162169227368/label/news", "user/17398194162169227368/state/com.google/reading-list", "user/17398194162169227368/state/com.google/fresh", "Top News Stories"], "updated"=>1279773120}
8
+ @entry = Greedy::Entry.new(@raw_entry, @stream)
9
+ end
10
+
11
+ should "be able to instantiate from a raw entry hash and a stream" do
12
+ @entry.class.should == Greedy::Entry
13
+ end
14
+
15
+ should "set href correctly" do
16
+ @entry.href.should == "http://feeds.officer.com/~r/officerrss/top_news_stories/~3/UmVWa_XwtRc/article.jsp"
17
+ end
18
+
19
+ should "set truncated_body correctly" do
20
+ @entry.body = File.open("test/fixtures/lorem_ipsum.txt").read
21
+ @entry.truncated_body.should == "<p>Lorem ipsum putant alterum in ius. Ex partiendo honestatis ius, ex ignota lucilius eam. Nec modo utroque mentitum id, id erant adipisci democritum qui. Veniam altera vim ex. In nullam constituto mei, singulis electram adipiscing eu nam. Eos debet impedit perpetua ad, movet luptatum sit at. </p> <p> Ut sale utinam has, at eam enim fabellas probatus. Id sea autem nostro maiorum, ridens cotidieque an eam. Dolore corpora pro cu, eu quodsi probatus deseruisse sea. Eu ullum oratio voluptatum vim. </p> <p> Quo labore iisque erroribus ne, homero doctus ex usu. His dicant aliquam verterem in. Eum id zzril altera. Per ei novum perpetua salutandi, noluisse scaevola sententiae an eam. </p> <p> Mea no noluisse persequeris, ea eos mazim possit salutandi, aeque malorum eloquentiam usu te. Et vidit nostrum pertinax sea, eros voluptua officiis in vis. Te dolorum molestie inciderint est. Mea ei populo quaeque euripidis, invenire democritum omittantur et mel. Nullam epicurei ex nam, no mea cetero disputationi. Ne utinam feugait sed. No impedit appareat mei, qui at facete aperiam comprehensam, omnes complectitur mea id. </p> <p> Eum nostrud laoreet invidunt ne, puto elitr per ex. Modo accusamus ex eos. Sit cu dicam nominati, animal regione eam at. Prima tation suavitate ea eam. Sea error perpetua consetetur ex, duo inani decore dissentias ne. Quidam inimicus vis ad, modo duis et pro, id porro dicunt maluisset eos. </p> <p> In elitr ceteros laboramus vis, cu meliore scribentur eum. Ne graece corpora vim, in zzril tamquam persecuti pro. Mel dicit eripuit ad, fugit rationibus consectetuer cu cum. Qui mandamus adipiscing in. Ei duo meis liber, his admodum tincidunt ad. Mea ut detracto iracundia. </p> <p> Vel altera labore ponderum an, ea has sapientem gloriatur, ad vim prompta eleifend. Ut per nostro alterum noluisse, in eruditi nostrum vim. No fugit virtute alterum mei, vis ne autem clita. Duo in sonet epicurei expetenda, ea movet erroribus ius, ne usu nihil nobis. Legere liberavisse his ne, pri cibo invenire cotidieque ut. No elaboraret referrentur sit, sea ne iuvaret oporteat. Eum cu quidam maiorum, est ex indoctum rationibus voluptatibus. </p>"
22
+ end
23
+
24
+ should "be able to share itself" do
25
+ # @stream.expects(:change_state_for).with(@entry, "broadcast").returns
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ require 'rubygems'
5
+
6
+ require 'test/unit'
7
+ require 'shoulda'
8
+ require 'matchy'
9
+ require 'mocha'
10
+ require 'ruby-debug'
11
+
12
+ require 'greedy'
13
+
14
+ class Test::Unit::TestCase
15
+ end
@@ -0,0 +1,114 @@
1
+ require 'test_helper'
2
+
3
+ class TestStream < Test::Unit::TestCase
4
+ context "A Greedy stream" do
5
+ setup do
6
+ @connection = stub("a greedy connection", :fetch => {} )
7
+ end
8
+
9
+ context "initializing with successful pull from Google" do
10
+ setup do
11
+ @response_hash = eval(File.open('test/fixtures/success_json_hash.txt').read)
12
+ @connection.expects(:fetch).with("stream/contents/user/-/state/com.google/reading-list", {}).returns(@response_hash)
13
+ Greedy::Connection.expects(:new).with("username", "passwort", "Greedy::Stream").returns(@connection)
14
+ @reading_list = Greedy::Stream.new "username", "passwort"
15
+ end
16
+
17
+ should "set the continuation token" do
18
+ @reading_list.instance_variable_get("@continuation_token").should == "continuationtoken"
19
+ end
20
+
21
+ should "set the last update token" do
22
+ @reading_list.last_update_token.should == 1234567890
23
+ end
24
+
25
+ should "set the entries" do
26
+ @reading_list.entries.size.should == 5
27
+ end
28
+
29
+ context "when continuing" do
30
+ setup do
31
+ assert_equal @reading_list.instance_variable_get("@continuation_token"), "continuationtoken"
32
+ @continued_response_hash = eval(File.open('test/fixtures/another_success_hash.txt').read)
33
+ @connection.expects(:fetch).with("stream/contents/user/-/state/com.google/reading-list",
34
+ { :c => "continuationtoken" }).returns(@continued_response_hash)
35
+ end
36
+
37
+ should "send the continuation token on the next pull" do
38
+ @reading_list.continue!
39
+ @reading_list.instance_variable_get("@continuation_token").should == "CKXmmOLq_aIC"
40
+ end
41
+
42
+ should "increase the entries size" do
43
+ entry_count = @reading_list.entries.size
44
+ continued_count = @reading_list.continue!.size
45
+ @reading_list.entries.size.should == (entry_count + continued_count)
46
+ end
47
+
48
+ should "not change the last update token" do
49
+ token = @reading_list.instance_variable_get("@last_update_token")
50
+ @reading_list.continue!
51
+ @reading_list.instance_variable_get("@last_update_token").should == token
52
+ end
53
+ end
54
+
55
+ context "when resetting" do
56
+ setup do
57
+ @connection.expects(:fetch).with("stream/contents/user/-/state/com.google/reading-list", {}).returns(@response_hash)
58
+ @reading_list.reset!
59
+ end
60
+
61
+ should "reset the entries" do
62
+ @reading_list.entries.size.should == 5
63
+ end
64
+
65
+ should "set the last update token" do
66
+ @reading_list.last_update_token.should == 1234567890
67
+ end
68
+
69
+ should "set the continuation token" do
70
+ @reading_list.instance_variable_get("@continuation_token").should == "continuationtoken"
71
+ end
72
+ end
73
+
74
+ context "when updating" do
75
+ setup do
76
+ @updated_hash = eval(File.open('test/fixtures/update_hash.txt').read)
77
+ @connection.expects(:fetch).with("stream/contents/user/-/state/com.google/reading-list",
78
+ { :ot => 1234567890 }).returns(@updated_hash)
79
+ @reading_list.update!
80
+ end
81
+
82
+ should "append new entries" do
83
+ @reading_list.entries.size.should == 6
84
+ end
85
+
86
+ should "set the last update token" do
87
+ @reading_list.last_update_token.should == 1279769942
88
+ end
89
+
90
+ should "not set the continuation token" do
91
+ @reading_list.instance_variable_get("@continuation_token").should_not == "CKDIsM2M_qIC"
92
+ end
93
+ end
94
+
95
+ context "when changing the state of an entry" do
96
+ setup do
97
+ @connection.expects(:post).with("broadcast", { :a => state,
98
+ :i => entry.google_item_id,
99
+ :s => entry.feed.google_feed_id })
100
+ end
101
+ end
102
+ end
103
+
104
+ context "intializing with bad credentials" do
105
+ setup do
106
+ Greedy::Connection.stubs(:new).with("username", "passwort", "Greedy::Stream").raises(Greedy::AuthorizationError)
107
+ end
108
+
109
+ should "raise error on initialization" do
110
+ lambda { Greedy::Stream.new "username", "passwort" }.should raise_error(Greedy::AuthorizationError)
111
+ end
112
+ end
113
+ end
114
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: greedy
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 0
10
+ version: 0.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Jeremy Weiland
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-24 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: thoughtbot-shoulda
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: mcmire-matchy
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: With greedy, you can access and manipulate the reading list for a Google Reader account via the API. Inspired by John Nunemaker's GoogleReader gem.
50
+ email: jeremy6d@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - LICENSE
57
+ - README.rdoc
58
+ files:
59
+ - .document
60
+ - .gitignore
61
+ - LICENSE
62
+ - README.rdoc
63
+ - Rakefile
64
+ - VERSION
65
+ - greedy.gemspec
66
+ - lib/greedy.rb
67
+ - lib/greedy/connection.rb
68
+ - lib/greedy/entry.rb
69
+ - lib/greedy/feed.rb
70
+ - lib/greedy/stream.rb
71
+ - test/fixtures/another_success_hash.txt
72
+ - test/fixtures/lorem_ipsum.txt
73
+ - test/fixtures/success_json_hash.txt
74
+ - test/fixtures/update_hash.txt
75
+ - test/test_connection.rb
76
+ - test/test_entry.rb
77
+ - test/test_helper.rb
78
+ - test/test_stream.rb
79
+ has_rdoc: true
80
+ homepage: http://github.com/jeremy6d/greedy
81
+ licenses: []
82
+
83
+ post_install_message:
84
+ rdoc_options:
85
+ - --charset=UTF-8
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ hash: 3
103
+ segments:
104
+ - 0
105
+ version: "0"
106
+ requirements: []
107
+
108
+ rubyforge_project:
109
+ rubygems_version: 1.3.7
110
+ signing_key:
111
+ specification_version: 3
112
+ summary: Access a Google Reader reading list
113
+ test_files:
114
+ - test/test_connection.rb
115
+ - test/test_entry.rb
116
+ - test/test_helper.rb
117
+ - test/test_stream.rb