tumblr-rb 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +58 -0
- data/README.md +87 -3
- data/Rakefile +6 -1
- data/lib/tumblr.rb +147 -2
- data/lib/tumblr/authenticator.rb +15 -0
- data/lib/tumblr/post.rb +173 -0
- data/lib/tumblr/post/audio.rb +16 -0
- data/lib/tumblr/post/conversation.rb +15 -0
- data/lib/tumblr/post/link.rb +15 -0
- data/lib/tumblr/post/photo.rb +16 -0
- data/lib/tumblr/post/quote.rb +16 -0
- data/lib/tumblr/post/regular.rb +14 -0
- data/lib/tumblr/post/video.rb +17 -0
- data/lib/tumblr/reader.rb +158 -0
- data/lib/tumblr/writer.rb +30 -0
- data/test/fixtures/vcr_cassettes/authenticate/authenticate.yml +39 -0
- data/test/fixtures/vcr_cassettes/read/authenticated.yml +40 -0
- data/test/fixtures/vcr_cassettes/read/authentication_failure.yml +33 -0
- data/test/fixtures/vcr_cassettes/read/mwunsch.yml +101 -0
- data/test/fixtures/vcr_cassettes/read/optional.yml +48 -0
- data/test/fixtures/vcr_cassettes/write/delete.yml +31 -0
- data/test/fixtures/vcr_cassettes/write/edit.yml +31 -0
- data/test/fixtures/vcr_cassettes/write/write.yml +31 -0
- data/test/helper.rb +20 -0
- data/test/test_tumblr.rb +591 -2
- data/{tumblr.gemspec → tumblr-rb.gemspec} +29 -9
- metadata +27 -6
- data/.document +0 -5
@@ -0,0 +1,158 @@
|
|
1
|
+
#TODO: Documentation
|
2
|
+
class Tumblr
|
3
|
+
class Reader < Weary::Base
|
4
|
+
|
5
|
+
def initialize(*credentials)
|
6
|
+
@defaults = {:email => credentials[0], :password => credentials[1]} unless credentials.blank?
|
7
|
+
end
|
8
|
+
|
9
|
+
# http://www.tumblr.com/docs/en/api#api_read
|
10
|
+
def read(username, params={})
|
11
|
+
self.class.read username, :get, parameters(params)
|
12
|
+
end
|
13
|
+
|
14
|
+
# http://www.tumblr.com/docs/en/api#authenticated_read
|
15
|
+
def authenticated_read(username, params={})
|
16
|
+
raise 'Needs requirements badly' unless (params.include?(:email) && params.include?(:password)) || defaults
|
17
|
+
self.class.read username, :post, parameters(params)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Setup parameters for Reads
|
21
|
+
def parameters(params)
|
22
|
+
allowed = [:start,:num,:type,:id,:filter,:tagged,:search,:state,:email,:password]
|
23
|
+
params.merge! defaults if defaults
|
24
|
+
params.reject {|key,value| !allowed.include? key }
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the Posts as Post objects from a Read response.
|
28
|
+
# Pass an additional type parameter to only get Posts of a certain type.
|
29
|
+
def self.get_posts(response, type = nil)
|
30
|
+
tumblr_post = response['tumblr']['posts']['post']
|
31
|
+
posts = tumblr_post.respond_to?(:each_pair) ? [tumblr_post] : tumblr_post
|
32
|
+
posts.collect! { |post| build_post(post) }
|
33
|
+
return posts.select {|post| post.is_a?(Tumblr.map(type)) } if type
|
34
|
+
posts
|
35
|
+
end
|
36
|
+
|
37
|
+
# Build a Post object from Reader's Post XML
|
38
|
+
def self.build_post(post)
|
39
|
+
tumblr_post = setup_post(post)
|
40
|
+
tumblr_post.date = post['date_gmt']
|
41
|
+
tumblr_post.format = post['format'].to_sym if post['format']
|
42
|
+
tumblr_post.slug = post['slug']
|
43
|
+
tumblr_post.tags post['tag'] if post['tag']
|
44
|
+
tumblr_post
|
45
|
+
end
|
46
|
+
|
47
|
+
# Helper method to facilitate standard GET Read and Authenticated Read
|
48
|
+
def self.read(username, via = :get, params = {})
|
49
|
+
Weary.request("http://#{username}.tumblr.com/api/read/", via) do |req|
|
50
|
+
req.with = params unless params.blank?
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# http://www.tumblr.com/docs/en/api#api_dashboard
|
55
|
+
post :dashboard do |dashboard|
|
56
|
+
dashboard.url = "http://www.tumblr.com/api/dashboard"
|
57
|
+
dashboard.requires = [:email,:password]
|
58
|
+
dashboard.with = [:start,:num,:type,:filter,:likes]
|
59
|
+
end
|
60
|
+
|
61
|
+
# http://www.tumblr.com/docs/en/api#api_likes
|
62
|
+
post :likes do |likes|
|
63
|
+
likes.url = "http://www.tumblr.com/api/likes"
|
64
|
+
likes.requires = [:email, :password]
|
65
|
+
likes.with = [:start, :num, :filter]
|
66
|
+
end
|
67
|
+
|
68
|
+
# http://www.tumblr.com/docs/en/api#api_liking
|
69
|
+
post :like do |like|
|
70
|
+
like.url = "http://www.tumblr.com/api/like"
|
71
|
+
like.requires = [:email, :password, :'post-id', :'reblog-key']
|
72
|
+
end
|
73
|
+
|
74
|
+
# http://www.tumblr.com/docs/en/api#api_liking
|
75
|
+
post :unlike do |unlike|
|
76
|
+
unlike.url = "http://www.tumblr.com/api/unlike"
|
77
|
+
unlike.requires = [:email, :password, :'post-id', :'reblog-key']
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def self.setup_post(post)
|
83
|
+
post_type = post['type'].to_sym
|
84
|
+
case post_type
|
85
|
+
when :regular
|
86
|
+
build_regular(post)
|
87
|
+
when :photo
|
88
|
+
build_photo(post)
|
89
|
+
when :quote
|
90
|
+
build_quote(post)
|
91
|
+
when :link
|
92
|
+
build_link(post)
|
93
|
+
when :conversation
|
94
|
+
build_conversation(post)
|
95
|
+
when :video
|
96
|
+
build_video(post)
|
97
|
+
when :audio
|
98
|
+
build_audio(post)
|
99
|
+
else
|
100
|
+
raise "#{post_type} is not a recognized Tumblr post type."
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.build_regular(post)
|
105
|
+
post_id = post['id']
|
106
|
+
regular = Tumblr::Post::Regular.new(post_id)
|
107
|
+
regular.body = post['regular_body']
|
108
|
+
regular.title = post['regular_title']
|
109
|
+
regular
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.build_photo(post)
|
113
|
+
post_id = post['id']
|
114
|
+
photo = Tumblr::Post::Photo.new(post_id)
|
115
|
+
photo.source = post['photo_url'].first
|
116
|
+
photo.caption = post['photo_caption']
|
117
|
+
photo.click_through_url = post['photo_link_url']
|
118
|
+
photo
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.build_quote(post)
|
122
|
+
post_id = post['id']
|
123
|
+
quote = Tumblr::Post::Quote.new(post['quote_text'], post_id)
|
124
|
+
quote.source = post['quote_source']
|
125
|
+
quote
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.build_link(post)
|
129
|
+
post_id = post['id']
|
130
|
+
link = Tumblr::Post::Link.new(post['link_url'], post_id)
|
131
|
+
link.name = post['link_text']
|
132
|
+
link.description = post['link_description']
|
133
|
+
link
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.build_conversation(post)
|
137
|
+
post_id = post['id']
|
138
|
+
chat = Tumblr::Post::Conversation.new(post['conversation_text'], post_id)
|
139
|
+
chat.title = post['conversation_title']
|
140
|
+
chat
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.build_video(post)
|
144
|
+
post_id = post['id']
|
145
|
+
video = Tumblr::Post::Video.new(post['video_player'], post_id)
|
146
|
+
video.caption = post['video_caption']
|
147
|
+
video
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.build_audio(post)
|
151
|
+
post_id = post['id']
|
152
|
+
audio = Tumblr::Post::Audio.new(post_id)
|
153
|
+
audio.caption = post['audio_caption']
|
154
|
+
audio
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Tumblr
|
2
|
+
class Writer < Weary::Base
|
3
|
+
|
4
|
+
def initialize(*credentials)
|
5
|
+
@defaults = {:generator => Tumblr::GENERATOR}
|
6
|
+
@defaults.merge!({:email => credentials[0], :password => credentials[1]}) unless credentials.blank?
|
7
|
+
end
|
8
|
+
|
9
|
+
# http://www.tumblr.com/docs/en/api#api_write
|
10
|
+
post :write do |write|
|
11
|
+
write.url = 'http://www.tumblr.com/api/write'
|
12
|
+
write.requires = [:email, :password, :type]
|
13
|
+
write.with = (Post::BASIC_PARAMS | Post::POST_PARAMS)
|
14
|
+
end
|
15
|
+
|
16
|
+
# http://www.tumblr.com/docs/en/api#editing_posts
|
17
|
+
post :edit do |edit|
|
18
|
+
edit.url = 'http://www.tumblr.com/api/write'
|
19
|
+
edit.requires = [:email, :password, :'post-id']
|
20
|
+
edit.with = (Post::BASIC_PARAMS | Post::POST_PARAMS)
|
21
|
+
end
|
22
|
+
|
23
|
+
# http://www.tumblr.com/docs/en/api#deleting_posts
|
24
|
+
post :delete do |del|
|
25
|
+
del.url = 'http://www.tumblr.com/api/delete'
|
26
|
+
del.requires = [:email, :password, :'post-id']
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::RecordedResponse
|
3
|
+
method: :post
|
4
|
+
uri: http://www.tumblr.com:80/api/authenticate
|
5
|
+
response: !ruby/object:Net::HTTPOK
|
6
|
+
body: |
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<tumblr version="1.0">
|
9
|
+
<user default-post-format="markdown" can-upload-audio="1" can-upload-aiff="1" can-ask-question="1" can-upload-video="1" max-video-bytes-uploaded="26214400"/>
|
10
|
+
<tumblelog title="M. Wunsch" is-admin="1" name="mwunsch" url="http://mwunsch.tumblr.com/" type="public" avatar-url="http://27.media.tumblr.com/avatar_14a45e5585e1_128.png" is-primary="yes" backup-post-limit="30000"/>
|
11
|
+
<tumblelog title="Hacking in the Movies" is-admin="1" name="hackinginthemovies" url="http://hackinginthemovies.tumblr.com/" type="public" avatar-url="http://29.media.tumblr.com/avatar_ccdceda8f0ea_128.png" backup-post-limit="30000"/>
|
12
|
+
<tumblelog title="Testing Tumblr Gem" is-admin="1" private-id="3723757" type="private" backup-post-limit="30000"/>
|
13
|
+
</tumblr>
|
14
|
+
|
15
|
+
body_exist: true
|
16
|
+
code: "200"
|
17
|
+
header:
|
18
|
+
p3p:
|
19
|
+
- CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
|
20
|
+
content-type:
|
21
|
+
- text/xml
|
22
|
+
connection:
|
23
|
+
- close
|
24
|
+
x-tumblr-usec:
|
25
|
+
- D=106425
|
26
|
+
server:
|
27
|
+
- Apache/2.2.3 (Red Hat)
|
28
|
+
date:
|
29
|
+
- Sun, 07 Mar 2010 07:38:07 GMT
|
30
|
+
content-length:
|
31
|
+
- "804"
|
32
|
+
x-tumblr-perf:
|
33
|
+
- "\"ch:4/country_code_for_ip,rate-limiter,tumblelogs,tumblelog_posts_ref cm:2/rate-limiter,rate-limiter ce:0/ c:0/0 d:0/0 e:0/0\""
|
34
|
+
vary:
|
35
|
+
- Accept-Encoding
|
36
|
+
http_version: "1.1"
|
37
|
+
message: OK
|
38
|
+
read: true
|
39
|
+
socket:
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::RecordedResponse
|
3
|
+
method: :post
|
4
|
+
uri: http://mwunsch.tumblr.com:80/api/read/
|
5
|
+
response: !ruby/object:Net::HTTPOK
|
6
|
+
body: |
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<tumblr version="1.0"><tumblelog name="mwunsch" timezone="US/Eastern" title="M. Wunsch">Collected visual and aural interests of <a href="http://markwunsch.com" rel="me">Mark Wunsch</a>.</tumblelog><posts start="0" total="66"><post id="420292045" url="http://mwunsch.tumblr.com/post/420292045" url-with-slug="http://mwunsch.tumblr.com/post/420292045/testing-something-or-other" type="regular" date-gmt="2010-03-01 19:20:12 GMT" date="Mon, 01 Mar 2010 14:20:12" unix-timestamp="1267471212" format="markdown" reblog-key="Bdxz9T94" slug="testing-something-or-other" bookmarklet="true"><regular-body>Just a test.</regular-body></post></posts></tumblr>
|
9
|
+
|
10
|
+
body_exist: true
|
11
|
+
code: "200"
|
12
|
+
header:
|
13
|
+
last-modified:
|
14
|
+
- Fri, 05 Mar 2010 17:12:57 GMT
|
15
|
+
p3p:
|
16
|
+
- CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
|
17
|
+
content-type:
|
18
|
+
- text/xml; charset=UTF-8
|
19
|
+
connection:
|
20
|
+
- close
|
21
|
+
x-tumblr-usec:
|
22
|
+
- D=126358
|
23
|
+
x-robots-tag:
|
24
|
+
- noindex
|
25
|
+
server:
|
26
|
+
- Apache/2.2.3 (CentOS)
|
27
|
+
date:
|
28
|
+
- Sat, 06 Mar 2010 12:16:06 GMT
|
29
|
+
content-length:
|
30
|
+
- "902"
|
31
|
+
x-tumblr-perf:
|
32
|
+
- "\"ch:4/tumblelog_id_for_host,tumblelogs,country_code_for_ip,tumblelog_post_count cm:3/rate-limiter,rate-limiter,rate-limiter ce:0/ c:0/0 d:0/0 e:0/0\""
|
33
|
+
vary:
|
34
|
+
- Accept-Encoding
|
35
|
+
cache-control:
|
36
|
+
- max-age=900
|
37
|
+
http_version: "1.1"
|
38
|
+
message: OK
|
39
|
+
read: true
|
40
|
+
socket:
|
@@ -0,0 +1,33 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::RecordedResponse
|
3
|
+
method: :post
|
4
|
+
uri: http://mwunsch.tumblr.com:80/api/read/
|
5
|
+
response: !ruby/object:Net::HTTPForbidden
|
6
|
+
body: Authentication failed.
|
7
|
+
body_exist: true
|
8
|
+
code: "403"
|
9
|
+
header:
|
10
|
+
last-modified:
|
11
|
+
- Fri, 05 Mar 2010 17:12:57 GMT
|
12
|
+
p3p:
|
13
|
+
- CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
|
14
|
+
content-type:
|
15
|
+
- text/plain; charset=utf-8
|
16
|
+
connection:
|
17
|
+
- close
|
18
|
+
x-tumblr-usec:
|
19
|
+
- D=66602
|
20
|
+
server:
|
21
|
+
- Apache/2.2.3 (CentOS)
|
22
|
+
date:
|
23
|
+
- Sat, 06 Mar 2010 12:22:52 GMT
|
24
|
+
content-length:
|
25
|
+
- "22"
|
26
|
+
x-tumblr-perf:
|
27
|
+
- "\"ch:3/tumblelog_id_for_host,tumblelogs,country_code_for_ip cm:3/rate-limiter,rate-limiter,rate-limiter ce:0/ c:0/0 d:0/0 e:0/0\""
|
28
|
+
vary:
|
29
|
+
- Accept-Encoding
|
30
|
+
http_version: "1.1"
|
31
|
+
message: Forbidden
|
32
|
+
read: true
|
33
|
+
socket:
|
@@ -0,0 +1,101 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::RecordedResponse
|
3
|
+
method: :get
|
4
|
+
uri: http://mwunsch.tumblr.com:80/api/read/
|
5
|
+
response: !ruby/object:Net::HTTPOK
|
6
|
+
body: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
|
7
|
+
<tumblr version=\"1.0\"><tumblelog name=\"mwunsch\" timezone=\"US/Eastern\" title=\"M. Wunsch\">Collected visual and aural interests of <a href=\"http://markwunsch.com\" rel=\"me\">Mark Wunsch</a>.</tumblelog><posts start=\"0\" total=\"66\"><post id=\"428536701\" url=\"http://mwunsch.tumblr.com/post/428536701\" url-with-slug=\"http://mwunsch.tumblr.com/post/428536701/but-for-me-im-going-to-stop-thinking-in-terms-of\" type=\"quote\" date-gmt=\"2010-03-05 17:12:57 GMT\" date=\"Fri, 05 Mar 2010 12:12:57\" unix-timestamp=\"1267809177\" format=\"markdown\" reblog-key=\"OMh0FPCk\" slug=\"but-for-me-im-going-to-stop-thinking-in-terms-of\"><quote-text>But for me, I\xE2\x80\x99m going to stop thinking in terms of products and start releasing projects. I don\xE2\x80\x99t want to be limited by thinking, \xE2\x80\x9Cis there a market for this idea.\xE2\x80\x9D From here on out, success for a project means at least one person is \xE2\x80\x9Cwatching\xE2\x80\x9D it on github.</quote-text><quote-source><a href=\"http://ted-is-a-nerd.tumblr.com/post/428529777/i-quit-or-its-open-source-from-now-on\" class=\"tumblr_blog\">I Quit, or It&#8217;s Open Source from now on!</a> by <a href=\"http://ted-is-a-nerd.tumblr.com/\">Nerdy Ted Roden</a></quote-source></post><post id=\"424706712\" url=\"http://mwunsch.tumblr.com/post/424706712\" url-with-slug=\"http://mwunsch.tumblr.com/post/424706712/world-geodetic-system\" type=\"link\" date-gmt=\"2010-03-03 20:55:36 GMT\" date=\"Wed, 03 Mar 2010 15:55:36\" unix-timestamp=\"1267649736\" format=\"markdown\" reblog-key=\"hoqItOHh\" slug=\"world-geodetic-system\" bookmarklet=\"true\"><link-text>World Geodetic System</link-text><link-url>http://en.wikipedia.org/wiki/World_Geodetic_System</link-url><link-description><p>What I&#8217;m looking at on Wikipedia, right now.</p>\n\n\
|
8
|
+
<blockquote>\n <p>The <strong>World Geodetic System</strong> is a standard for use in cartography, geodesy, and navigation. It comprises a standard coordinate frame for the Earth, a standard spheroidal reference surface&#8230;for raw altitude data, and a gravitational equipotential surface&#8230;that defines the nominal sea level.</p>\n\
|
9
|
+
</blockquote></link-description><tag>Wikipedia</tag></post><post id=\"409216752\" url=\"http://mwunsch.tumblr.com/post/409216752\" url-with-slug=\"http://mwunsch.tumblr.com/post/409216752/leonardo-da-vincis-polyhedra-these-are-the\" type=\"photo\" date-gmt=\"2010-02-24 15:48:17 GMT\" date=\"Wed, 24 Feb 2010 10:48:17\" unix-timestamp=\"1267026497\" format=\"markdown\" reblog-key=\"4mcMnJZx\" slug=\"leonardo-da-vincis-polyhedra-these-are-the\" bookmarklet=\"true\"><photo-caption><p><a href=\"http://georgehart.com/virtual-polyhedra/leonardo.html\">Leonardo da Vinci&#8217;s Polyhedra</a></p>\n\n\
|
10
|
+
<blockquote>\n <p>These are the first illustrations of polyhedra ever in the form of &#8220;solid edges.&#8221; The solidity of the edges lets one easily see which edges belong to the front and which to the back, unlike simple line drawings where the front and back surfaces may be visually confused. Yet the hollow faces allow one to see through to the structure of the rear surface. This is a brilliant new form of geometric illustration, one worthy of Leonardo&#8217;s genius for insightful graphic display of information.</p>\n\
|
11
|
+
</blockquote></photo-caption><photo-link-url>http://georgehart.com/virtual-polyhedra/leonardo.html</photo-link-url><photo-url max-width=\"1280\">http://26.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_250.jpg</photo-url><photo-url max-width=\"500\">http://26.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_250.jpg</photo-url><photo-url max-width=\"400\">http://26.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_250.jpg</photo-url><photo-url max-width=\"250\">http://26.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_250.jpg</photo-url><photo-url max-width=\"100\">http://28.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_100.jpg</photo-url><photo-url max-width=\"75\">http://28.media.tumblr.com/tumblr_kycrwiQSqF1qzykueo1_75sq.jpg</photo-url></post><post id=\"405012793\" url=\"http://mwunsch.tumblr.com/post/405012793\" url-with-slug=\"http://mwunsch.tumblr.com/post/405012793/the-only-programming-literature-worth-writing-is-code\" type=\"regular\" date-gmt=\"2010-02-22 15:14:12 GMT\" date=\"Mon, 22 Feb 2010 10:14:12\" unix-timestamp=\"1266851652\" format=\"markdown\" reblog-key=\"n7BSH8f6\" slug=\"the-only-programming-literature-worth-writing-is-code\"><regular-title>The only programming literature worth writing is code.</regular-title><regular-body><p>I said that, <a href=\"http://twitter.com/markwunsch/status/9453630873\">in a tweet</a>, while thinking about <a href=\"http://www.marco.org/403653088\">Marco Arment&#8217;s latest post</a>.</p>\n\n\
|
12
|
+
<p>I think it&#8217;s true. It&#8217;s not the only programming literature worth <em>reading</em>, but I can&#8217;t stomach the thought of <em>writing</em> about programming, especially when it always falls on selfish, angry, anonymous ears.</p>\n\n\
|
13
|
+
<p>Good code is always outspoken. It&#8217;s why <a href=\"http://yehudakatz.com/\">Yehuda Katz</a> has the best programming blog going: it&#8217;s all just code.</p>\n\n\
|
14
|
+
<p>Related: <a href=\"http://mwunsch.tumblr.com/post/226005635/chris-wanstrath-github\">Chris Wanstrath&#8217;s at RailsConf</a>. <a href=\"https://gist.github.com/0a2655aed6a26fa15a02\">A transcript of that talk</a>.</p>\n\n\
|
15
|
+
<blockquote>\n <p>Code, I&#8217;m learning, is the common thread that brings developers together. It&#8217;s not blogging or trolling or procrastinating, as much as we love those things.</p>\n \n <p>It&#8217;s reading, writing, and sharing code.</p>\n\
|
16
|
+
</blockquote></regular-body></post><post id=\"403791212\" url=\"http://mwunsch.tumblr.com/post/403791212\" url-with-slug=\"http://mwunsch.tumblr.com/post/403791212/everyone-is-the-worst-audience-but-programmers\" type=\"quote\" date-gmt=\"2010-02-22 01:12:56 GMT\" date=\"Sun, 21 Feb 2010 20:12:56\" unix-timestamp=\"1266801176\" format=\"markdown\" reblog-key=\"tRWnT0sU\" slug=\"everyone-is-the-worst-audience-but-programmers\"><quote-text>Everyone is the worst audience. But programmers are a special case. Because not only will they tell you how wrong you are, but they\xE2\x80\x99ll also tell you how stupid and idiotic you are, and they\xE2\x80\x99ll mathematically prove it, and you should never program again, and you should be fired, you moron. Their attacks are all-out personal insults on your intelligence, but much better written and argued than most internet commenters.</quote-text><quote-source><a href=\"http://www.marco.org/403653088\" class=\"tumblr_blog\">Marco.org: Business Insider will probably add an inflammatory headline about Joel Spolsky or Jason Calacanis here</a>\xC2\xA0</quote-source></post><post id=\"402876465\" url=\"http://mwunsch.tumblr.com/post/402876465\" url-with-slug=\"http://mwunsch.tumblr.com/post/402876465/polyglot-computing\" type=\"link\" date-gmt=\"2010-02-21 16:50:06 GMT\" date=\"Sun, 21 Feb 2010 11:50:06\" unix-timestamp=\"1266771006\" format=\"markdown\" reblog-key=\"0uFlVSEs\" slug=\"polyglot-computing\"><link-text>Polyglot (computing)</link-text><link-url>http://en.wikipedia.org/wiki/Polyglot_%28computing%29</link-url><link-description><p>What I\xE2\x80\x99m looking at on Wikipedia, right now.</p>\n\n\
|
17
|
+
<blockquote>\n <p>In the context of computing, a <strong>polyglot</strong> is a computer program or script written in a valid form of multiple programming languages, which performs the same operations or output independently of the programming language used to compile or interpret it.</p>\n\
|
18
|
+
</blockquote></link-description><tag>Wikipedia</tag></post><post id=\"398639335\" url=\"http://mwunsch.tumblr.com/post/398639335\" url-with-slug=\"http://mwunsch.tumblr.com/post/398639335/e-123\" type=\"link\" date-gmt=\"2010-02-19 14:49:49 GMT\" date=\"Fri, 19 Feb 2010 09:49:49\" unix-timestamp=\"1266590989\" format=\"markdown\" reblog-key=\"5jtaBRiP\" slug=\"e-123\"><link-text>E.123</link-text><link-url>http://en.wikipedia.org/wiki/E.123</link-url><link-description><p>What I\xE2\x80\x99m looking at on Wikipedia, right now.</p>\n\n\
|
19
|
+
<blockquote>\n <p><strong>E.123</strong>, also known as <strong>Notation for national and international telephone numbers, e-mail addresses and Web addresses</strong> is an ITU-T standard for printed representation of telephone numbers, e-mail addresses, and web addresses.</p>\n\
|
20
|
+
</blockquote></link-description><tag>Wikipedia</tag></post><post id=\"392873651\" url=\"http://mwunsch.tumblr.com/post/392873651\" url-with-slug=\"http://mwunsch.tumblr.com/post/392873651/marco-org-side-effects-of-developing-for-yourself\" type=\"link\" date-gmt=\"2010-02-16 15:26:29 GMT\" date=\"Tue, 16 Feb 2010 10:26:29\" unix-timestamp=\"1266333989\" format=\"markdown\" reblog-key=\"KUl1i2f8\" slug=\"marco-org-side-effects-of-developing-for-yourself\"><link-text>Marco.org: Side effects of developing for yourself</link-text><link-url>http://www.marco.org/392848093</link-url><link-description><blockquote>\n <p>If I let users steer product decisions, the result would be a massive codebase producing a bloated, cluttered product full of features that hardly anyone used at the expense of everyday usability and polish on the features that matter. Like Microsoft Word. Or Firefox.</p>\n\
|
21
|
+
</blockquote></link-description></post><post id=\"389111213\" url=\"http://mwunsch.tumblr.com/post/389111213\" url-with-slug=\"http://mwunsch.tumblr.com/post/389111213/if-you-can-have-a-bon-mot-or-a-brilliant\" type=\"quote\" date-gmt=\"2010-02-14 16:01:03 GMT\" date=\"Sun, 14 Feb 2010 11:01:03\" unix-timestamp=\"1266163263\" format=\"markdown\" reblog-key=\"Z2sB8ZIP\" slug=\"if-you-can-have-a-bon-mot-or-a-brilliant\"><quote-text>If you can have a bon mot, or a brilliant conversation, or feel strongly about something and express it, succinctly &#8212; that&#8217;s success.</quote-text><quote-source><a href=\"http://www.maximumfun.org/sound-young-america/actor-kevin-kline-interview-sound-young-america\">Kevin Kline on <em>The Sound of Young America</em></a> (at about 32 minutes in or so)</quote-source></post><post id=\"385851242\" url=\"http://mwunsch.tumblr.com/post/385851242\" url-with-slug=\"http://mwunsch.tumblr.com/post/385851242/eric-royer-a-one-man-band-performs-shortnin\" type=\"video\" date-gmt=\"2010-02-12 19:00:00 GMT\" date=\"Fri, 12 Feb 2010 14:00:00\" unix-timestamp=\"1266001200\" format=\"markdown\" reblog-key=\"gymWGGbw\" slug=\"eric-royer-a-one-man-band-performs-shortnin\"><video-caption><p><a href=\"http://guitarmachine.com/\">Eric Royer</a>, a one-man band performs <a href=\"http://en.wikipedia.org/wiki/Shortnin%27_Bread\"><em>Shortnin&#8217; Bread</em></a></p></video-caption><video-source>http://www.youtube.com/watch?v=i7CgL7c4LeE</video-source><video-player><object width=\"400\" height=\"336\"><param name=\"movie\" value=\"http://www.youtube.com/v/i7CgL7c4LeE&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\"></param><param name=\"wmode\" value=\"transparent\"></param><param name=\"allowFullScreen\" value=\"true\"></param><embed src=\"http://www.youtube.com/v/i7CgL7c4LeE&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\" type=\"application/x-shockwave-flash\" width=\"400\" height=\"336\" allowFullScreen=\"true\" wmode=\"transparent\"></embed></object></video-player><tag>one-man-band</tag></post><post id=\"385721948\" url=\"http://mwunsch.tumblr.com/post/385721948\" url-with-slug=\"http://mwunsch.tumblr.com/post/385721948/iso-8601\" type=\"link\" date-gmt=\"2010-02-12 17:13:14 GMT\" date=\"Fri, 12 Feb 2010 12:13:14\" unix-timestamp=\"1265994794\" format=\"markdown\" reblog-key=\"k3vLDmwW\" slug=\"iso-8601\"><link-text>ISO 8601</link-text><link-url>http://en.wikipedia.org/wiki/ISO_8601</link-url><link-description><p>What I&#8217;m looking at on Wikipedia, right now.</p>\n\n\
|
22
|
+
<blockquote>\n <p>ISO 8601 is an international standard covering the exchange of date and time-related data.</p>\n\
|
23
|
+
</blockquote></link-description><tag>Wikipedia</tag></post><post id=\"384113710\" url=\"http://mwunsch.tumblr.com/post/384113710\" url-with-slug=\"http://mwunsch.tumblr.com/post/384113710/i-liked-the-old-facebook-login-better\" type=\"link\" date-gmt=\"2010-02-11 19:02:07 GMT\" date=\"Thu, 11 Feb 2010 14:02:07\" unix-timestamp=\"1265914927\" format=\"markdown\" reblog-key=\"ko3jDOvZ\" slug=\"i-liked-the-old-facebook-login-better\"><link-text>I liked the old Facebook login better</link-text><link-url>http://www.readwriteweb.com/archives/facebook_wants_to_be_your_one_true_login.php</link-url><link-description><p><a href=\"http://mrgan.tumblr.com/post/384061532/i-liked-the-old-facebook-login-better\" class=\"tumblr_blog\">mrgan</a>:</p>\n\n\
|
24
|
+
<blockquote>\n <p>What\xE2\x80\x99s apparently happening here is, Facebook users are googling for \xE2\x80\x9Cfacebook login\xE2\x80\x9D (because how else are you going to log into Facebook?), clicking the first result (which is sometimes a story <i>about</i> Facebook, on an unrelated site), assuming that the site itself <i>is</i> Facebook, scrolling to the bottom to get to the comment form - <i>still thinking they\xE2\x80\x99re on Facebook</i> - and using the comment form to complain about how this, <i>a wholly different website</i>, is a terrible redesign of Facebook.&gt;</p>\n\
|
25
|
+
</blockquote>\n\n\
|
26
|
+
<p>The internet.</p></link-description></post><post id=\"383857890\" url=\"http://mwunsch.tumblr.com/post/383857890\" url-with-slug=\"http://mwunsch.tumblr.com/post/383857890/buzzkill\" type=\"regular\" date-gmt=\"2010-02-11 15:38:00 GMT\" date=\"Thu, 11 Feb 2010 10:38:00\" unix-timestamp=\"1265902680\" format=\"markdown\" reblog-key=\"hJU11uyW\" slug=\"buzzkill\"><regular-title>Buzzkill</regular-title><regular-body><p><a href=\"http://www.google.com/buzz\">Google Buzz</a> is bad.</p>\n\n\
|
27
|
+
<p>Google Buzz is inserted into Gmail, so you&#8217;re really <em>using</em> Buzz whether you want to or not, just by checking your e-mail. Whether you navigate to the Buzz label or not is completely irrelevant, you&#8217;ve signed up, <strong>by default</strong>, simply by doing something you probably do every day. You don&#8217;t opt-in to Google Buzz. Can you imagine if, all of a sudden, you had a Facebook profile, simply because you talk on the phone, sometimes? This is a feature?</p>\n\n\
|
28
|
+
<p>Google Buzz automatically, <strong>by default</strong>, sets you to <em>follow</em> people you&#8217;ve contacted. These may include your friends, but really it&#8217;s just your Google address book. Can you imagine if you signed into Facebook and you were automatically friends with everyone in your Rolodex? Consequently, the people I started out following on Google Buzz were people I hadn&#8217;t talked to in years; folks like a real-estate broker from years ago or relatives I don&#8217;t keep in touch with. And likewise, they are following me. I didn&#8217;t do anything to indicate interest in watching their <em>Buzz</em>, I only had them in my address book. This is a feature?</p>\n\n\
|
29
|
+
<p><strong>By default</strong>, your Google Buzz profile is totally public. So anybody in your address book that you&#8217;re not magically &#8220;following&#8221; can look at your profile and see who else is in your address book. <a href=\"http://www.businessinsider.com/warning-google-buzz-has-a-huge-privacy-flaw-2010-2\">There may be good reasons you don&#8217;t want that</a>.</p>\n\n\
|
30
|
+
<p>The settings where you can set who you want to follow and the publicness of your profile are not in the Settings tab of Gmail, where you would expect them to be. They are kind of hard to find.</p>\n\n\
|
31
|
+
<h2>Quote-Unquote &#8216;Contacts&#8217;</h2>\n\n\
|
32
|
+
<p>This Google model of automatically connecting you with your <em>&#8220;contacts&#8221;</em> is seen all over Google products now. On Google Wave, all of your &#8220;contacts&#8221; are in the contacts pane of Google Wave, <strong>by default</strong>. You can&#8217;t remove them from that pane.</p>\n\n\
|
33
|
+
<p>On Google Reader, I keep my Shared Items private: only a select group of people can see the items I share. When Google Buzz launched, I received a group of requests from my &#8216;contacts&#8217; to see my Shared Items. When I asked one about it, he said that he never requested to see my items, it must have just happened automatically: and indeed it did. Google Reader now, <strong>by default</strong>, tells everybody in your address book that you want to view their share items. It even uses that language:</p>\n\n\
|
34
|
+
<blockquote>\n <p>&#8220;These people are requesting access to your shared items and comments.&#8221;</p>\n\
|
35
|
+
</blockquote>\n\n\
|
36
|
+
<p>But they&#8217;re not. They did not actively <em>request</em> access. Google requested access for them, whether they knew it or not. This is at the very least, <strong><em>completely misleading</em></strong>.</p>\n\n\
|
37
|
+
<h2>Contacts Are Not Friends.</h2>\n\n\
|
38
|
+
<p>What Google does not understand is that simply because I have somebody in my Google Address Book, does not mean I wish to track them. In my address book are my nemeses along with my friends. Simply because I keep a record of somebody&#8217;s e-mail address does not mean I am interested in them. On Facebook, I opt-in to my connections. On Twitter, I elect to follow someone. Google, <strong>by default</strong>, opts you in to these connections, whether you are aware of it or not.</p>\n\n\
|
39
|
+
<h2>Possible solution</h2>\n\n\
|
40
|
+
<p>A much more sensible default would be to only add contacts who are in the <em>Friends</em> group of my address book. Duh.</p></regular-body><tag>Google</tag></post><post id=\"380262584\" url=\"http://mwunsch.tumblr.com/post/380262584\" url-with-slug=\"http://mwunsch.tumblr.com/post/380262584/tiger-rag-performed-by-professor-gizmo-one-man\" type=\"video\" date-gmt=\"2010-02-09 18:00:00 GMT\" date=\"Tue, 09 Feb 2010 13:00:00\" unix-timestamp=\"1265738400\" format=\"markdown\" reblog-key=\"EJbEaOC4\" slug=\"tiger-rag-performed-by-professor-gizmo-one-man\"><video-caption><p><a href=\"http://en.wikipedia.org/wiki/Tiger_Rag\"><em>Tiger Rag</em></a>, performed by Professor Gizmo, one-man band.</p></video-caption><video-source>http://www.youtube.com/watch?v=azb9kN1fgwc</video-source><video-player><object width=\"400\" height=\"336\"><param name=\"movie\" value=\"http://www.youtube.com/v/azb9kN1fgwc&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\"></param><param name=\"wmode\" value=\"transparent\"></param><param name=\"allowFullScreen\" value=\"true\"></param><embed src=\"http://www.youtube.com/v/azb9kN1fgwc&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\" type=\"application/x-shockwave-flash\" width=\"400\" height=\"336\" allowFullScreen=\"true\" wmode=\"transparent\"></embed></object></video-player><tag>one-man-band</tag></post><post id=\"380124621\" url=\"http://mwunsch.tumblr.com/post/380124621\" url-with-slug=\"http://mwunsch.tumblr.com/post/380124621/i-write-a-little-blog-called-hacking-in-the-movies\" type=\"regular\" date-gmt=\"2010-02-09 16:03:56 GMT\" date=\"Tue, 09 Feb 2010 11:03:56\" unix-timestamp=\"1265731436\" format=\"markdown\" reblog-key=\"au3lv6Yt\" slug=\"i-write-a-little-blog-called-hacking-in-the-movies\"><regular-body><p>I write a little blog called <a href=\"http://hackinginthemovies.tumblr.com\">Hacking in the Movies</a> that discusses the tropes surrounding hacking, and computers in general, as portrayed in movies and television; I find the subject fascinating. Like the way movies portray love and revenge, so much of what people know about computers is based on <em>imagery</em> of computing. It&#8217;s a life-imitating-art-imitating-life kind of thing.</p>\n\n\
|
41
|
+
<p>Computer Imagery in film chiefly serves as a plot device to get from Point A to Point B and to create a sense of dramatic action; nothing more. This is why portrayals of computing in film are so obnoxiously silly: the goal is not to accurately represent computers and/or hackers, but to drive the story. Here is an example:</p>\n\n\
|
42
|
+
<ul>\n\
|
43
|
+
<li>Hacker transfers data from computer to floppy disk.</li>\n\
|
44
|
+
<li>\n\
|
45
|
+
<a href=\"http://tvtropes.org/pmwiki/pmwiki.php/Main/ExactProgressBar\">Big progress bar appears</a>.</li>\n\
|
46
|
+
<li>As progress bar advances, the Hacker character is placed in some sort of scenario where time is of the essence.</li>\n\
|
47
|
+
<li>The progress bar completes and the Hacker has secured the data just in the nick of time.</li>\n\
|
48
|
+
</ul>\n\
|
49
|
+
<p>The data is the <a href=\"http://en.wikipedia.org/wiki/MacGuffin\">MacGuffin</a>, containing information about the evil corporation, or the <a href=\"http://en.wikipedia.org/wiki/Non-official_cover\">NOC List</a>, or whatever. The method employed to retrieve the MacGuffin is largely trivial, and enhanced for added dramatic effect.</p>\n\n\
|
50
|
+
<p>These images of hacking, though entertaining, do very little to convince a normal (movie-going) public that computers are not the realm of <a href=\"http://tvtropes.org/pmwiki/pmwiki.php/Main/TechnoWizard\">Wizards</a>. I think these kinds of tropes only reinforce the thinking that computers are magical and require a specialist.</p>\n\n\
|
51
|
+
<blockquote>\n <p>Any sufficiently advanced technology is indistinguishable from magic.<sup id=\"fnref:1\"><a href=\"#fn:1\" rel=\"footnote\">1</a></sup></p>\n\
|
52
|
+
</blockquote>\n\n\
|
53
|
+
<p>Computers are sold and developed by highly specialized technologists; the common portrayal of both computers and the technologists that drive them shows them exist in a magical realm, outside of the scope of a layperson. I think that&#8217;s pretty fair, given what I&#8217;ve learned thus far in my career as a software engineer.</p>\n\n\
|
54
|
+
<h2>Dark Magic</h2>\n\n\
|
55
|
+
<p>As I become a better, and more experienced programmer, I go deeper and deeper into the lower-level systems of the computer. I don&#8217;t have a background in Computer Science so each level of abstraction I remove is very new and fresh to me.</p>\n\n\
|
56
|
+
<p>And the shit I have seen is scary. Cannot be unseen.</p>\n\n\
|
57
|
+
<p>Computers are hard. It&#8217;s reinforced in movie imagery, but I think it is a pretty accurate portrayal. I think what intrigues me the most about the <a href=\"http://www.apple.com/ipad/\">iPad</a> (largely I mean the iPhone OS) is that it provides an air-tight abstraction layer and really guards the user from the dark arts. This is computing, not as its seen in the movies, but as it <em>should</em> be: a simple tool. Practical magic.</p>\n\n\
|
58
|
+
<div class=\"footnotes\">\n\
|
59
|
+
<hr>\n\
|
60
|
+
<ol>\n\
|
61
|
+
<li id=\"fn:1\">\n\
|
62
|
+
<p><a href=\"http://mwunsch.tumblr.com/post/374263788/any-sufficiently-advanced-technology-is\">Arthur C. Clark&#8217;s third law of prediction</a>.\xC2\xA0<a href=\"#fnref:1\" rev=\"footnote\">\xE2\x86\xA9</a></p>\n\
|
63
|
+
</li>\n\n\
|
64
|
+
</ol>\n\
|
65
|
+
</div></regular-body><tag>Apple</tag></post><post id=\"378434375\" url=\"http://mwunsch.tumblr.com/post/378434375\" url-with-slug=\"http://mwunsch.tumblr.com/post/378434375/these-technologies-can-make-life-easier-can-let\" type=\"quote\" date-gmt=\"2010-02-08 18:45:00 GMT\" date=\"Mon, 08 Feb 2010 13:45:00\" unix-timestamp=\"1265654700\" format=\"markdown\" reblog-key=\"I5lQuUru\" slug=\"these-technologies-can-make-life-easier-can-let\"><quote-text>These technologies can make life easier, can let us touch people we might not otherwise. &#8230; These things can profoundly influence life. I&#8217;m not downplaying that. But it&#8217;s a disservice to constantly put things in this radical new light - that it&#8217;s going to change everything. Things don&#8217;t have to change the world to be important.</quote-text><quote-source>Steve Jobs, <a href=\"http://www.wired.com/wired/archive/4.02/jobs_pr.html\">from a 1996&#160;<em>Wired</em> interview</a></quote-source></post><post id=\"378242257\" url=\"http://mwunsch.tumblr.com/post/378242257\" url-with-slug=\"http://mwunsch.tumblr.com/post/378242257/cigo-man-band-a-one-man-band-performing-in\" type=\"video\" date-gmt=\"2010-02-08 16:00:00 GMT\" date=\"Mon, 08 Feb 2010 11:00:00\" unix-timestamp=\"1265644800\" format=\"markdown\" reblog-key=\"KEeTYx6M\" slug=\"cigo-man-band-a-one-man-band-performing-in\"><video-caption><p>Cigo Man Band, a <a href=\"http://en.wikipedia.org/wiki/One-man_band\">one-man band</a>, performing in Croatia</p></video-caption><video-source>http://www.youtube.com/watch?v=uXMuWi0dUBc</video-source><video-player><object width=\"400\" height=\"336\"><param name=\"movie\" value=\"http://www.youtube.com/v/uXMuWi0dUBc&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\"></param><param name=\"wmode\" value=\"transparent\"></param><param name=\"allowFullScreen\" value=\"true\"></param><embed src=\"http://www.youtube.com/v/uXMuWi0dUBc&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1\" type=\"application/x-shockwave-flash\" width=\"400\" height=\"336\" allowFullScreen=\"true\" wmode=\"transparent\"></embed></object></video-player><tag>one-man-band</tag></post><post id=\"376262956\" url=\"http://mwunsch.tumblr.com/post/376262956\" url-with-slug=\"http://mwunsch.tumblr.com/post/376262956/im-a-tool-builder-thats-how-i-think-of-myself\" type=\"quote\" date-gmt=\"2010-02-07 16:41:46 GMT\" date=\"Sun, 07 Feb 2010 11:41:46\" unix-timestamp=\"1265560906\" format=\"markdown\" reblog-key=\"4mjYseNB\" slug=\"im-a-tool-builder-thats-how-i-think-of-myself\"><quote-text>I&#8217;m a tool builder. That&#8217;s how I think of myself. I want to build really good tools that I know in my gut and my heart will be valuable. And then whatever happens is&#8230; you can&#8217;t really predict exactly what will happen, but you can feel the direction that we&#8217;re going. And that&#8217;s about as close as you can get. Then you just stand back and get out of the way, and these things take on a life of their own.</quote-text><quote-source>Steve Jobs, <a href=\"http://www.rollingstone.com/news/story/31896381/from_the_archives_a_revealing_interview_with_steve_jobs/print\">from a 1994 Rolling Stone interview</a></quote-source></post><post id=\"376218408\" url=\"http://mwunsch.tumblr.com/post/376218408\" url-with-slug=\"http://mwunsch.tumblr.com/post/376218408/lonelysandwich-here-is-where-i-make-a-big\" type=\"regular\" date-gmt=\"2010-02-07 16:01:50 GMT\" date=\"Sun, 07 Feb 2010 11:01:50\" unix-timestamp=\"1265558510\" format=\"markdown\" reblog-key=\"wpqXTJQ9\" slug=\"lonelysandwich-here-is-where-i-make-a-big\"><regular-body><p><a href=\"http://lonelysandwich.com/post/374473607/adaptation\" class=\"tumblr_blog\">lonelysandwich</a>:</p>\n\n\
|
66
|
+
<blockquote>\n <p>Here is where I make a Big Point. What we <i>want</i> from our technology, in its most elemental form, is to make our thoughts happen. Sure, it\xE2\x80\x99s still very much sci-fi in 2010, but what every calculating machine and telephone and computer and phonograph and light bulb and hammer and every tool ever invented is about at its core is our desire, our evolutionary imperative to control our environment at our will. And we\xE2\x80\x99re getting closer and closer to that happening. But there are still many layers between our intentions and our environment. As time progresses, we will strip away those layers one by one. And it\xE2\x80\x99s <i>always</i> disruptive to do so. The reason that any manufacturer of technology exists is to ease each step of the process of tearing away the layers of abstraction between our thoughts and our realities.</p>\n\
|
67
|
+
</blockquote>\n\n\
|
68
|
+
<p>Mr. Lisagor crawls into my brain, and steals my thoughts on the iPad.</p></regular-body></post><post id=\"374263788\" url=\"http://mwunsch.tumblr.com/post/374263788\" url-with-slug=\"http://mwunsch.tumblr.com/post/374263788/any-sufficiently-advanced-technology-is\" type=\"quote\" date-gmt=\"2010-02-06 15:59:57 GMT\" date=\"Sat, 06 Feb 2010 10:59:57\" unix-timestamp=\"1265471997\" format=\"markdown\" reblog-key=\"P0rwoDlH\" slug=\"any-sufficiently-advanced-technology-is\"><quote-text>Any sufficiently advanced technology is indistinguishable from magic.</quote-text><quote-source><a href=\"http://en.wikipedia.org/wiki/Clarke's_three_laws\">Arthur C. Clark&#8217;s third law of prediction</a></quote-source></post></posts></tumblr>\n"
|
69
|
+
body_exist: true
|
70
|
+
code: "200"
|
71
|
+
header:
|
72
|
+
last-modified:
|
73
|
+
- Fri, 05 Mar 2010 17:12:57 GMT
|
74
|
+
p3p:
|
75
|
+
- CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
|
76
|
+
content-type:
|
77
|
+
- text/xml; charset=UTF-8
|
78
|
+
connection:
|
79
|
+
- close
|
80
|
+
x-tumblr-usec:
|
81
|
+
- D=23522
|
82
|
+
x-robots-tag:
|
83
|
+
- noindex
|
84
|
+
server:
|
85
|
+
- Apache/2.2.3 (CentOS)
|
86
|
+
date:
|
87
|
+
- Sat, 06 Mar 2010 12:06:17 GMT
|
88
|
+
x-cache-auto:
|
89
|
+
- hit
|
90
|
+
content-length:
|
91
|
+
- "29274"
|
92
|
+
x-tumblr-perf:
|
93
|
+
- "\"ch:4/tumblelog_id_for_host,tumblelogs,country_code_for_ip,auto cm:3/rate-limiter,rate-limiter,rate-limiter ce:0/ c:0/0 d:0/0 e:0/0 auto-hit\""
|
94
|
+
vary:
|
95
|
+
- Accept-Encoding
|
96
|
+
cache-control:
|
97
|
+
- max-age=900
|
98
|
+
http_version: "1.1"
|
99
|
+
message: OK
|
100
|
+
read: true
|
101
|
+
socket:
|