extractula 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,576 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <meta name="generator" content="http://www.typepad.com/" />
7
+
8
+ <meta name="description" content="I've been quietly working on Typhoeus for the last few months. With the help of Wilson Bilkovich and David Balatero I've finished what I think is a significant improvement to the library. The new interface removes all the magic and..." />
9
+ <link rel="stylesheet" href="http://www.pauldix.net/styles.css?v=2" type="text/css" media="screen" />
10
+ <link rel="stylesheet" href="/.shared/themes/common/print.css" type="text/css" media="print" />
11
+ <link rel="alternate" type="application/atom+xml" title="Posts on 'Paul Dix Explains Nothing' (Atom)" href="http://www.pauldix.net/atom.xml" />
12
+ <link rel="alternate" type="application/rss+xml" title="Posts on 'Paul Dix Explains Nothing' (RSS 1.0)" href="http://www.pauldix.net/index.rdf" />
13
+ <link rel="alternate" type="application/rss+xml" title="Posts on 'Paul Dix Explains Nothing' (RSS 2.0)" href="http://www.pauldix.net/rss.xml" />
14
+ <script type="text/javascript">
15
+ var TPApp = {};
16
+ TPApp.app_uri = "http://www.typepad.com/";
17
+ </script>
18
+ <script type="text/javascript" src="/.shared/js/yui/yahoo-dom-event.js"></script>
19
+ <script type="text/javascript" src="/.shared/js/app/thumbnail-gallery-min.js"></script>
20
+ <script type="text/javascript" src="/.shared/js/app/flyouts.js"></script>
21
+
22
+ <title>Paul Dix Explains Nothing: Typhoeus, the best Ruby HTTP client just got better</title>
23
+ <link rel="start" href="http://www.pauldix.net/" title="Home" />
24
+ <link rel="prev" href="http://www.pauldix.net/2009/10/bypassing-wxwidgets-error-when-building-erlang-from-source-on-os-x.html?no_prefetch=1" title="Bypassing wxWidgets error when building Erlang from Source on OS X" />
25
+ <link rel="next" href="http://www.pauldix.net/2009/11/resources-for-synchronous-reads-asynchronous-writes-at-rubyconf-2009.html?no_prefetch=1" title="Resources for Synchronous Reads, Asynchronous Writes at RubyConf 2009" />
26
+
27
+ </head>
28
+
29
+ <body class="layout-two-column-right">
30
+
31
+ <div id="container">
32
+ <div id="container-inner" class="pkg">
33
+
34
+ <!-- banner -->
35
+ <div id="banner">
36
+ <div id="banner-inner" class="pkg">
37
+
38
+ <h1 id="banner-header"><a href="http://www.pauldix.net/" accesskey="1">Paul Dix Explains Nothing</a></h1>
39
+ <h2 id="banner-description">Entrepreneurship, programming, software development, politics, NYC, and random thoughts.</h2>
40
+ </div>
41
+ </div>
42
+
43
+
44
+
45
+ <div id="pagebody">
46
+ <div id="pagebody-inner" class="pkg">
47
+ <div id="alpha">
48
+ <div id="alpha-inner" class="pkg">
49
+ <!-- content nav -->
50
+ <p class="content-nav">
51
+ <a href="http://www.pauldix.net/2009/10/bypassing-wxwidgets-error-when-building-erlang-from-source-on-os-x.html">&laquo; Bypassing wxWidgets error when building Erlang from Source on OS X</a> |
52
+ <a href="http://www.pauldix.net/">Main</a>
53
+ | <a href="http://www.pauldix.net/2009/11/resources-for-synchronous-reads-asynchronous-writes-at-rubyconf-2009.html">Resources for Synchronous Reads, Asynchronous Writes at RubyConf 2009 &raquo;</a>
54
+ </p>
55
+
56
+ <!-- entry -->
57
+ <h2 class="date-header">October 29, 2009</h2>
58
+
59
+
60
+ <div class="entry-author-paul_dix entry-type-post entry" id="entry-6a00d8341f4a0d53ef0120a6340f31970b">
61
+ <h3 class="entry-header">Typhoeus, the best Ruby HTTP client just got better</h3>
62
+
63
+ <div class="entry-content">
64
+ <div class="entry-body">
65
+ <p>I&#39;ve been quietly working on Typhoeus for the last few months. With the help of <a href="http://metaclass.org/">Wilson Bilkovich</a> and <a href="http://github.com/dbalatero">David Balatero</a> I&#39;ve finished what I think is a significant improvement to the library. The new interface removes all the magic and opts instead for clarity.</p><p>It&#39;s really slick and includes improved stubing support, caching, memoization, and (of course) parallelism. The <a href="http://github.com/pauldix/typhoeus/">Typhoeus readme</a> highlights all of the awesomeness. It should be noted that the old interface of including Typhoeus into classes and defining remote methods has been deprecated. I&#39;ll be removing that sometime in the next six months.</p><p>In addition to thanking everyone using the library and everyone contributing, I should also thank my employer kgbweb. If you&#39;re a solid Rubyist that likes parsing, crawling, and stuff, or a machine learning guy, or a Solr/Lucene/indexing bad ass, let me know. We need you and we&#39;re doing some crazy awesome stuff.</p>
66
+ </div>
67
+
68
+ <script src="http://feeds.feedburner.com/~s/PaulDixExplainsNothing?i=http%3A%2F%2Fwww.pauldix.net%2F2009%2F10%2Ftyphoeus-the-best-ruby-http-client-just-got-better.html" type="text/javascript"></script>
69
+
70
+ </div>
71
+ <div class="entry-footer">
72
+ <p class="entry-footer-info">
73
+ <span class="post-footers">October 29, 2009 at 12:29 PM </span> <span class="separator">|</span> <a class="permalink" href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html">Permalink</a>
74
+ </p>
75
+
76
+ <!-- technorati tags -->
77
+
78
+
79
+
80
+ <!-- post footer links -->
81
+
82
+ </div>
83
+ </div>
84
+
85
+ <div class="trackbacks">
86
+ <a id="trackback"></a>
87
+ <h3 class="trackbacks-header">TrackBack</h3>
88
+ <div class="trackbacks-info">
89
+ <p>TrackBack URL for this entry:<br /><span class="trackbacks-link">http://www.typepad.com/services/trackback/6a00d8341f4a0d53ef0120a6340f31970b</span></p>
90
+ <p>Listed below are links to weblogs that reference <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html">Typhoeus, the best Ruby HTTP client just got better</a>:</p>
91
+ </div>
92
+ <div class="trackbacks-content">
93
+
94
+ </div>
95
+ </div>
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ <a id="comments"></a>
104
+ <div class="comments" id="all-comments">
105
+ <h3 class="comments-header">Comments</h3>
106
+
107
+ <div class="comments-content" id="comments-content">
108
+ <!-- comment list --><a id="c6a00d8341f4a0d53ef0120a63a2b7c970b"></a>
109
+ <div class="comment comment-odd comment-has-avatar" id="comment-6a00d8341f4a0d53ef0120a63a2b7c970b">
110
+ <div class="comment-avatar">
111
+ <img id="comment-6a00d8341f4a0d53ef0120a63a2b7c970b-avatarimg" src="http://static.typepad.com/.shared/images/default-avatars/avatar-16-50x50.gif" alt="quinn shanahan" width="50" height="50" />
112
+ </div>
113
+ <div class="comment-content" id="comment-6a00d8341f4a0d53ef0120a63a2b7c970b-content">
114
+ <span id="comment-6a00d8341f4a0d53ef0120a63a2b7c970b-content"><p>I love the new api. In this example</p>
115
+
116
+ <p>response = Typhoeus::Request.get(&quot;http://www.pauldix.net&quot;)</p>
117
+
118
+ <p>if i was instead to do </p>
119
+
120
+ <p>response = Typhoeus::Request.get(&quot;https://www.pauldix.net&quot;)</p>
121
+
122
+ <p>would it be clever enough to use ssl and port 443? if it did that would be <i>awesome</i>.</p></span>
123
+ </div>
124
+ <p class="comment-footer">
125
+ Posted by:
126
+ <a rel="nofollow" target="_blank" title="http://whattechnology.com" href="http://whattechnology.com">quinn shanahan</a> |
127
+ <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html?cid=6a00d8341f4a0d53ef0120a63a2b7c970b#comment-6a00d8341f4a0d53ef0120a63a2b7c970b">October 29, 2009 at 07:26 PM</a>
128
+ </p>
129
+ </div><a id="c6a00d8341f4a0d53ef0120a690c502970c"></a>
130
+ <div class="comment comment-even comment-by-owner comment-has-avatar" id="comment-6a00d8341f4a0d53ef0120a690c502970c">
131
+ <div class="comment-avatar">
132
+ <img id="comment-6a00d8341f4a0d53ef0120a690c502970c-avatarimg" src="http://up5.typepad.com/6a00d8341f4a0d53ef00e553f5dd328833-50si" alt="Paul Dix" width="50" height="50" at:flyout-userxid="6p00d8341f4a0d53ef" at:flyout-enabled="yes" />
133
+ </div>
134
+ <div class="comment-content" id="comment-6a00d8341f4a0d53ef0120a690c502970c-content">
135
+ <span id="comment-6a00d8341f4a0d53ef0120a690c502970c-content"><p>I&#39;m pretty sure it does that. At least, I think libcurl does that automagically.</p></span>
136
+ </div>
137
+ <p class="comment-footer">
138
+ Posted by:
139
+ <a rel="nofollow" target="_blank" title="http://profile.typepad.com/pauldix" href="http://profile.typepad.com/pauldix">Paul Dix</a> |
140
+ <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html?cid=6a00d8341f4a0d53ef0120a690c502970c#comment-6a00d8341f4a0d53ef0120a690c502970c">October 29, 2009 at 09:54 PM</a>
141
+ </p>
142
+ </div><a id="c6a00d8341f4a0d53ef0120a6c73c17970b"></a>
143
+ <div class="comment comment-odd comment-has-avatar" id="comment-6a00d8341f4a0d53ef0120a6c73c17970b">
144
+ <div class="comment-avatar">
145
+ <img id="comment-6a00d8341f4a0d53ef0120a6c73c17970b-avatarimg" src="http://a1.twimg.com/profile_images/340990556/images_normal.jpeg" alt="Stockbaat" width="50" height="50" at:flyout-userxid="6p0120a6c73b69970b" at:flyout-enabled="yes" />
146
+ </div>
147
+ <div class="comment-content" id="comment-6a00d8341f4a0d53ef0120a6c73c17970b-content">
148
+ <span id="comment-6a00d8341f4a0d53ef0120a6c73c17970b-content"><p>can I do HEAD requests using typhoeus ?</p></span>
149
+ </div>
150
+ <p class="comment-footer">
151
+ Posted by:
152
+ <a rel="nofollow" target="_blank" title="http://profile.typepad.com/stockbaat" href="http://profile.typepad.com/stockbaat">Stockbaat</a> |
153
+ <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html?cid=6a00d8341f4a0d53ef0120a6c73c17970b#comment-6a00d8341f4a0d53ef0120a6c73c17970b">November 23, 2009 at 03:43 AM</a>
154
+ </p>
155
+ </div><a id="c6a00d8341f4a0d53ef0120a6e2a9f9970b"></a>
156
+ <div class="comment comment-even comment-by-owner comment-has-avatar" id="comment-6a00d8341f4a0d53ef0120a6e2a9f9970b">
157
+ <div class="comment-avatar">
158
+ <img id="comment-6a00d8341f4a0d53ef0120a6e2a9f9970b-avatarimg" src="http://up5.typepad.com/6a00d8341f4a0d53ef00e553f5dd328833-50si" alt="Paul Dix" width="50" height="50" at:flyout-userxid="6p00d8341f4a0d53ef" at:flyout-enabled="yes" />
159
+ </div>
160
+ <div class="comment-content" id="comment-6a00d8341f4a0d53ef0120a6e2a9f9970b-content">
161
+ <span id="comment-6a00d8341f4a0d53ef0120a6e2a9f9970b-content"><p>The main Hydra, Request interface doesn&#39;t, but using the basic Easy object should work for HEAD requests.</p></span>
162
+ </div>
163
+ <p class="comment-footer">
164
+ Posted by:
165
+ <a rel="nofollow" target="_blank" title="http://profile.typepad.com/pauldix" href="http://profile.typepad.com/pauldix">Paul Dix</a> |
166
+ <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html?cid=6a00d8341f4a0d53ef0120a6e2a9f9970b#comment-6a00d8341f4a0d53ef0120a6e2a9f9970b">November 27, 2009 at 03:37 PM</a>
167
+ </p>
168
+ </div><a id="c6a00d8341f4a0d53ef012875e66100970c"></a>
169
+ <div class="comment comment-odd comment-has-avatar" id="comment-6a00d8341f4a0d53ef012875e66100970c">
170
+ <div class="comment-avatar">
171
+ <img id="comment-6a00d8341f4a0d53ef012875e66100970c-avatarimg" src="http://static.typepad.com/.shared/images/default-avatars/avatar-20-50x50.gif" alt="Chris" width="50" height="50" />
172
+ </div>
173
+ <div class="comment-content" id="comment-6a00d8341f4a0d53ef012875e66100970c-content">
174
+ <span id="comment-6a00d8341f4a0d53ef012875e66100970c-content"><p>I&#39;m loving your work, kudos...</p></span>
175
+ </div>
176
+ <p class="comment-footer">
177
+ Posted by:
178
+ <a rel="nofollow" target="_blank" title="http://rubyrambler.posterous.com/" href="http://rubyrambler.posterous.com/">Chris</a> |
179
+ <a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html?cid=6a00d8341f4a0d53ef012875e66100970c#comment-6a00d8341f4a0d53ef012875e66100970c">November 28, 2009 at 12:23 AM</a>
180
+ </p>
181
+ </div>
182
+
183
+ </div>
184
+
185
+ </div>
186
+ <!-- comment-form-atp -->
187
+
188
+
189
+ <div id="atp-comments">
190
+
191
+ <div id="comment-preview" class="hiddenBox">
192
+ <h3 id="header-verify-comment" class="comments-header hiddenBox">Verify your Comment</h3>
193
+ <h3 id="header-preview-comment" class="comments-header hiddenBox">Previewing your Comment</h3>
194
+ <div class="comments-content">
195
+ <div class="comment comment-has-avatar">
196
+ <div id="comment-preview-content" class="comment-content">
197
+ </div>
198
+ <p class="comment-footer">
199
+ Posted by:
200
+ <span id="comment-preview-author"></span>&nbsp;|&nbsp;<span id="comment-preview-datetime"></span>
201
+ </p>
202
+ </div>
203
+ </div>
204
+ </div>
205
+ <div id="comment-preview-confirmation" class="hiddenBox yellowBox">
206
+ <p>This is only a preview. Your comment has not yet been posted.</p>
207
+ <form id="comment-preview-form"
208
+ method="post"
209
+ onsubmit="atpComments.interceptPost(commentFormNum); return false;">
210
+ <input type="submit" name="post" id="comment-confirm-post" value="&nbsp;Post&nbsp;" onclick="atpComments.interceptPost(commentFormNum); return false;"/>
211
+ <input type="submit" name="edit" id="comment-edit" value="&nbsp;&nbsp;Edit&nbsp;&nbsp;" onclick="atpComments.previewOnly(commentFormNum, 2); return false;"/>
212
+ <span id="previewFormSpinner" class="hiddenBox"><img src="/.shared/images/spinner.gif" alt="Working..." /></span>
213
+ </form>
214
+ </div>
215
+ <div id="comment-error" class="hiddenBox redBox">
216
+ Your comment could not be posted. Error type: <span id="comment-error-msg"></span>
217
+ </div>
218
+ <div id="comment-complete" class="hiddenBox yellowGreenBox">
219
+ Your comment has been posted. <a href="javascript:void 0;" onclick="window.location.hash='#comment-form';window.location.reload(false)">Post another comment</a>
220
+ </div>
221
+ <div id="comment-captcha" class="hiddenBox yellowBox">
222
+ <div id="captchaText">
223
+ <p id="captchaFailMsg" class="captchaErrorText hiddenBox">The letters and numbers you entered did not match the image. Please try again.</p>
224
+ <p>As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.</p>
225
+ <p><span id="comment-captcha-viewalt">Having trouble reading this image? <a href="#comment-captcha" onClick="atpComments.generateCaptcha(commentFormNum);">View an alternate.</a></span></p>
226
+ </div>
227
+ <p class=""><img id="captchaImg" /></p>
228
+ <form id="comment-captcha-form"
229
+ method="post"
230
+ onsubmit="atpComments.submitWithCaptcha(commentFormNum); return false;">
231
+ <input type="hidden" name="captcha_chal" id="comment-captcha-chal" value="" />
232
+ <p>
233
+ <input id="comment-captcha-text" name="captcha_text" size="10" />
234
+ </p>
235
+ <p>
236
+ <input type="submit" name="continue" id="captcha-continue" value="&nbsp;Continue&nbsp;" />
237
+ <span id="captchaFormSpinner" class="commentSpinner hiddenBox"><img src="/.shared/images/spinner.gif" alt="Working..." /></span>
238
+ </p>
239
+ </form>
240
+ </div>
241
+
242
+
243
+ <div id="primary-comment-form" class="comment-form">
244
+ <form id="comment-form" action="http://www.typepad.com/services/comments"
245
+ method="post">
246
+ <input type="hidden" name="entry_xid" id="comment-entry-xid" value="6a00d8341f4a0d53ef0120a6340f31970b" />
247
+ <input type="hidden" name="token" value="1262120431-993e39c91caa7a617b9ce413d6a60a130da05782:LQU8mWveraGQkTDq" />
248
+ <div class="comments-open">
249
+ <h2 class="comments-open-header" id="comment-title">Post a comment</h2>
250
+ <div id="comments-open-content" class="comments-open-content">
251
+
252
+
253
+
254
+ <div id="comments-open-login" style="display: none;">
255
+ <div class="login-list">
256
+
257
+ <span class="first">Comment below or sign in with</span> <span class="typepad"><a href="https://www.typekey.com/t/typekey/login?v=1.0&t=ec5d3da7462ec508b255452f5b8959f6d827a2d3&lang=en_US&_return=http%3A%2F%2Fwww.pauldix.net%2F2009%2F10%2Ftyphoeus-the-best-ruby-http-client-just-got-better.html&_portal=typepad">TypePad</a></span> <span class="facebook"><a href="https://www.typekey.com/t/typekey/login?v=1.0&t=ec5d3da7462ec508b255452f5b8959f6d827a2d3&lang=en_US&_return=http%3A%2F%2Fwww.pauldix.net%2F2009%2F10%2Ftyphoeus-the-best-ruby-http-client-just-got-better.html&_portal=typepad&service=facebook">Facebook</a></span> <span class="twitter"><a href="https://www.typekey.com/t/typekey/login?v=1.0&t=ec5d3da7462ec508b255452f5b8959f6d827a2d3&lang=en_US&_return=http%3A%2F%2Fwww.pauldix.net%2F2009%2F10%2Ftyphoeus-the-best-ruby-http-client-just-got-better.html&_portal=typepad&service=twitter">Twitter</a></span> <span>and <a href="https://www.typekey.com/t/typekey/login?v=1.0&t=ec5d3da7462ec508b255452f5b8959f6d827a2d3&lang=en_US&_return=http%3A%2F%2Fwww.pauldix.net%2F2009%2F10%2Ftyphoeus-the-best-ruby-http-client-just-got-better.html&_portal=typepad&service=openid">more...</a></span>
258
+
259
+ </div>
260
+ <div class="clr"></div>
261
+ </div>
262
+ <div id="comments-open-logout" style="display: none;">
263
+ You are currently signed in as
264
+ <span id="commenter-name">(nobody)</span>.
265
+ <a href="http://www.pauldix.net/.services/sitelogout?to=https%3A%2F%2Fwww.typekey.com%2Ft%2Ftypekey%2F%3F__mode%3Dlogout%26_return%3Dhttp%253A%252F%252Fwww.pauldix.net%252F2009%252F10%252Ftyphoeus-the-best-ruby-http-client-just-got-better.html">Sign Out</a>
266
+ </div>
267
+
268
+ <div id="comments-open-text" style="display:none;">
269
+ <textarea id="comment-text" name="text" rows="10" cols="30" onkeyup="atpComments.maxTextArea(this, 64000);"></textarea>
270
+
271
+ <p class="comments-open-subtext">
272
+ (You can use HTML tags like &lt;b&gt; &lt;i&gt; and &lt;ul&gt; to style your text. URLs automatically linked.)
273
+ </p>
274
+
275
+ </div>
276
+ <div id="comments-open-data" style="display:none;">
277
+ <p>Your Information</p>
278
+ <p>
279
+ (Name and email address are required. Email address will not be displayed with the comment.)
280
+
281
+ </p>
282
+ <p>
283
+ <input id="comment-author" at:default="Name" name="author" size="30" value="Name" onfocus="if(this.value==this.getAttribute('at:default')) this.value='';" onBlur="if(this.value=='') this.value=this.getAttribute('at:default');" class="grayText"/>
284
+ <label for="comment-author" id="comment-author-error" class="comment-error hiddenBox">Name is required to post a comment</label>
285
+ </p>
286
+ <p>
287
+ <input id="comment-email" at:default="Email Address" name="email" size="30" value="Email Address" onfocus="if(this.value==this.getAttribute('at:default')) this.value='';" onBlur="if(this.value=='') this.value=this.getAttribute('at:default');" class="grayText"/>
288
+ <label for="comment-email" id="comment-email-error" class="comment-error hiddenBox">Please enter a valid email address</label>
289
+ </p>
290
+ <p>
291
+ <input id="comment-url" at:default="Web Site URL" name="url" size="30" value="Web Site URL" onfocus="if(this.value==this.getAttribute('at:default')) this.value='';" onBlur="if(this.value=='') this.value=this.getAttribute('at:default');" class="grayText"/>
292
+ <label for="comment-url" id="comment-url-error" class="comment-error hiddenBox">Invalid URL</label>
293
+ </p>
294
+ </div>
295
+ </div>
296
+ <div id="comments-open-footer" class="comments-open-footer" style="display:none;">
297
+ <input type="submit" name="post" id="comment-post-button" value="&nbsp;Post&nbsp;" onclick="atpComments.interceptPost(commentFormNum); return false;" disabled="true" />
298
+ <input type="submit" name="preview" id="comment-preview-button" value="&nbsp;Preview&nbsp;" onclick="atpComments.previewOnly(commentFormNum, 1); return false;" disabled="true" />
299
+ <span id="commentEntryFormSpinner" class="commentSpinner hiddenBox"><img src="/.shared/images/spinner.gif" alt="Working..." /></span>
300
+ </div>
301
+ </div>
302
+ </form>
303
+ <noscript>
304
+
305
+ <div id="comments-open-noscript" class="comments-open-noscript">
306
+ <form action="http://www.typepad.com/services/comments" method="post">
307
+ <input type="hidden" name="entry_xid" id="comment-entry-xid" value="6a00d8341f4a0d53ef0120a6340f31970b" />
308
+ <input type="hidden" name="token" value="1262120431-77ab5caefffe75a7198d215ac6b043ad542f6acf:H23MwoUs0F3kW8IZ" />
309
+ Name:<br /><input type="text" name="author" size="30" /><br />
310
+ Email address:<br /><input type="text" name="email" size="30" /><br />
311
+ URL:<br /><input type="text" name="url" size="30" /><br /><br />
312
+ Comment:<br /><textarea name="text" cols="40" rows="4"></textarea><br />
313
+
314
+ <input type="submit" name="submit" value="Submit" />
315
+ </form>
316
+ </div>
317
+
318
+ </noscript>
319
+ </div>
320
+ </div>
321
+
322
+
323
+
324
+
325
+
326
+
327
+ </div>
328
+ </div>
329
+ <div id="beta">
330
+ <div id="beta-inner" class="pkg">
331
+
332
+ <!-- sidebar -->
333
+
334
+
335
+ <!-- user photo -->
336
+ <div class="module-photo module">
337
+ <div class="module-content"><img src="http://pauldix.blogs.com/.a/6a00d8341f4a0d53ef00e553f5dd328833-150wi" alt="My Photo" /></div>
338
+ </div>
339
+
340
+ <div class="module-widget module" id="widget-LinkedIn_linkedin_profile_widget">
341
+ <div class="module-content">
342
+ <div style="text-align:center"><a href="http://www.linkedin.com/in/pauldix?trk=btn_typepad" ><img src="http://www.linkedin.com/img/webpromo/btn_viewmy_160x25.gif" width="160" height="25" border="0" alt="View Paul Dix's profile on LinkedIn" style="margin-bottom:5px"></a><br><a href="http://www.linkedin.com/in/pauldix?trk=btn_typepad" style="color:#0783B6;font:11px arial,sans-serif;text-decoration:none">See how we're connected</a></div>
343
+
344
+ </div>
345
+ </div><div class="module-email module">
346
+ <div class="module-content">
347
+ <script type="text/javascript">
348
+ <!--
349
+ document.write('<a href="ma' + 'ilto:&#112;&#97;&#117;&#108;&#64;&#112;&#97;&#117;&#108;&#100;&#105;&#120;&#46;&#110;&#101;&#116;">Email Me</a>');
350
+ // -->
351
+ </script>
352
+
353
+ </div>
354
+ </div>
355
+ <div class="module-widget module" id="widget-FeedBurner_standardSmall">
356
+ <div class="module-content">
357
+ <p><a href="http://feeds.feedburner.com/PaulDixExplainsNothing" rel="alternate" type="application/rss+xml"><img src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="vertical-align:middle;border:0"/></a>&nbsp;<a href="http://feeds.feedburner.com/PaulDixExplainsNothing" rel="alternate" type="application/rss+xml">Subscribe in a reader</a></p>
358
+ </div>
359
+ </div><div class="module-typelist module">
360
+ <h2 class="module-header">Linkage</h2>
361
+ <div class="module-content">
362
+ <ul class="module-list">
363
+ <li class="module-list-item"><a href="http://github.com/pauldix">My Github</a><br /></li>
364
+ <li class="module-list-item"><a href="http://github.com/pauldix/feedzirra">Feedzirra</a><br />My Ruby library for parsing and fetching feeds at blinding speed.</li>
365
+ <li class="module-list-item"><a href="http://github.com/pauldix/sax-machine">SAX Machine</a><br />My Ruby library exposes a DSL for building Nokogiri backed SAX parsers.</li>
366
+ <li class="module-list-item"><a href="http://github.com/pauldix/typhoeus">Typhoeus</a><br />My Ruby library for running HTTP requests quickly, easily, and in parallel.</li>
367
+
368
+ </ul>
369
+ </div>
370
+ </div>
371
+
372
+ <div class="module-archives module">
373
+ <h2 class="module-header">Recent Posts</h2>
374
+ <div class="module-content">
375
+ <ul class="module-list">
376
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/11/resources-for-synchronous-reads-asynchronous-writes-at-rubyconf-2009.html">Resources for Synchronous Reads, Asynchronous Writes at RubyConf 2009</a></li>
377
+
378
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html">Typhoeus, the best Ruby HTTP client just got better</a></li>
379
+
380
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/10/bypassing-wxwidgets-error-when-building-erlang-from-source-on-os-x.html">Bypassing wxWidgets error when building Erlang from Source on OS X</a></li>
381
+
382
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/10/detect-and-parse-atom-and-rss-feed-urls-from-html-with-trufflehog.html">Detect and Parse Atom and RSS Feed URLs from HTML with TruffleHog</a></li>
383
+
384
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/10/using-the-nginx-memcached-module-with-passenger.html">Using the Nginx Memcached module with Passenger</a></li>
385
+
386
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/09/first-nyc-machine-learning-meetup.html">First NYC Machine Learning Meetup</a></li>
387
+
388
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/07/using-named-pipes-in-ruby-for-interprocess-communication.html">Using Named Pipes in Ruby for Inter-process Communication</a></li>
389
+
390
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/06/on-ruby-interview-with-me.html">On Ruby Interview with me</a></li>
391
+
392
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/05/breath-fire-over-http-in-ruby-with-typhoeus.html">Breathe fire over HTTP in Ruby with Typhoeus</a></li>
393
+
394
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/05/railsconf-this-week.html">RailsConf this week</a></li>
395
+
396
+
397
+ </ul>
398
+ </div>
399
+ </div>
400
+ <div class="module-feed module">
401
+ <h2 class="module-header">Twitter / pauldix</h2>
402
+ <div class="module-content" id="feed-39393fef12adc57def656d605a14747caac52903">
403
+ <script type="text/javascript" defer="defer" src="http://pauldix.blogs.com/.services/content?src=Feed:http%3A%2F%2Ftwitter.com%2Fstatuses%2Fuser_timeline%2F13826102.rss,5"></script>
404
+ </div>
405
+ </div>
406
+ <div class="module-elsewhere module">
407
+ <h2 class="module-header">Services I'm On</h2>
408
+ <div class="typelist-plain module-content">
409
+ <ul class="module-list">
410
+ <li class="module-list-item">
411
+ <a href="aim:goim?screenname=dixp77"><img src="/.shared/images/profile/service_icons/aim.png" alt="AIM" width="16" height="16" /></a>
412
+ <a href="aim:goim?screenname=dixp77" rel="me">AIM: dixp77</a>
413
+ </li>
414
+ <li class="module-list-item">
415
+ <a href="http://delicious.com/pauldix"><img src="/.shared/images/profile/service_icons/delicious.png" alt="Delicious" width="16" height="16" /></a>
416
+ <a href="http://delicious.com/pauldix" rel="me">Delicious: pauldix</a>
417
+ </li>
418
+ <li class="module-list-item">
419
+ <a href="http://www.facebook.com/profile.php?id=pcd2104%40columbia.edu"><img src="/.shared/images/profile/service_icons/facebook.png" alt="Facebook" width="16" height="16" /></a>
420
+ <a href="http://www.facebook.com/profile.php?id=pcd2104%40columbia.edu" rel="me">Facebook: pcd2104@columbia.edu</a>
421
+ </li>
422
+ <li class="module-list-item">
423
+ <a href="http://www.flickr.com/photos/pauldix/"><img src="/.shared/images/profile/service_icons/flickr.png" alt="Flickr" width="16" height="16" /></a>
424
+ <a href="http://www.flickr.com/photos/pauldix/" rel="me">Flickr: pauldix</a>
425
+ </li>
426
+ <li class="module-list-item">
427
+ <a href="msnim:chat?contact=paul%40pauldix.net"><img src="/.shared/images/profile/service_icons/msn.png" alt="MSN Messenger" width="16" height="16" /></a>
428
+ <a href="msnim:chat?contact=paul%40pauldix.net" rel="me">MSN Messenger: paul@pauldix.net</a>
429
+ </li>
430
+ <li class="module-list-item">
431
+ <a href="callto://paulcdix"><img src="/.shared/images/profile/service_icons/skype.png" alt="Skype" width="16" height="16" /></a>
432
+ <a href="callto://paulcdix" rel="me">Skype: paulcdix</a>
433
+ </li>
434
+ <li class="module-list-item">
435
+ <a href="http://twitter.com/pauldix"><img src="/.shared/images/profile/service_icons/twitter.png" alt="Twitter" width="16" height="16" /></a>
436
+ <a href="http://twitter.com/pauldix" rel="me">Twitter: pauldix</a>
437
+ </li>
438
+ <li class="module-list-item">
439
+ <a href="http://edit.yahoo.com/config/send_webmesg?.target=paulcdix"><img src="/.shared/images/profile/service_icons/yahoo.png" alt="Yahoo!" width="16" height="16" /></a>
440
+ <a href="http://edit.yahoo.com/config/send_webmesg?.target=paulcdix" rel="me">Yahoo!: paulcdix</a>
441
+ </li>
442
+
443
+ </ul>
444
+ </div>
445
+
446
+
447
+ </div>
448
+ <div class="module-archives module">
449
+ <h2 class="module-header"><a href="http://www.pauldix.net/archives.html">Archives</a></h2>
450
+ <div class="module-content">
451
+ <ul class="module-list">
452
+
453
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/11/index.html">November 2009</a></li>
454
+
455
+
456
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/10/index.html">October 2009</a></li>
457
+
458
+
459
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/09/index.html">September 2009</a></li>
460
+
461
+
462
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/07/index.html">July 2009</a></li>
463
+
464
+
465
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/06/index.html">June 2009</a></li>
466
+
467
+
468
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/05/index.html">May 2009</a></li>
469
+
470
+
471
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/04/index.html">April 2009</a></li>
472
+
473
+
474
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/03/index.html">March 2009</a></li>
475
+
476
+
477
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/02/index.html">February 2009</a></li>
478
+
479
+
480
+ <li class="module-list-item"><a href="http://www.pauldix.net/2009/01/index.html">January 2009</a></li>
481
+ </ul>
482
+ <p class="module-more"><a href="http://www.pauldix.net/archives.html">More...</a></p>
483
+
484
+
485
+
486
+ </div>
487
+ </div>
488
+
489
+ <div class="module-widget module" id="widget-Widgetbox_1f1dca67-0b36-4e14-803b-6bfd184abac1">
490
+ <div class="module-content">
491
+ <script type="text/javascript" src="http://widgetserver.com/syndication/subscriber/InsertPanel.js?panelId=1f1dca67-0b36-4e14-803b-6bfd184abac1"></script>
492
+ </div>
493
+ </div>
494
+
495
+
496
+
497
+
498
+ </div>
499
+ </div>
500
+ </div>
501
+ </div>
502
+
503
+
504
+ </div>
505
+ </div>
506
+
507
+
508
+ <script type="text/javascript">
509
+ <!--
510
+ var extra_happy = Math.floor(1000000000 * Math.random());
511
+ document.write('<img src="http://www.typepad.com/t/stats?blog_id=108605&amp;user_id=280961&amp;page=' + escape(location.href) + '&amp;referrer=' + escape(document.referrer) + '&amp;i=' + extra_happy + '" width="1" height="1" alt="" style="position: absolute; top: 0; left: 0;" />');
512
+ // -->
513
+ </script>
514
+
515
+
516
+ <!-- Start Quantcast tag -->
517
+ <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
518
+ <script type="text/javascript">_qoptions = { tags:"typepad.extended" }; _qacct="p-fcYWUmj5YbYKM"; quantserve();</script>
519
+ <noscript>
520
+ <a href="http://www.quantcast.com/p-fcYWUmj5YbYKM" target="_blank"><img src="http://pixel.quantserve.com/pixel/p-fcYWUmj5YbYKM.gif?tags=typepad.extended" style="display: none" border="0" height="1" width="1" alt="Quantcast"/></a>
521
+ </noscript>
522
+ <!-- End Quantcast tag -->
523
+
524
+ <script src="http://cdn.media6degrees.com/static/ty2093.js" type="text/javascript"></script></body>
525
+ </html>
526
+
527
+ <script type="text/javascript">
528
+ var captchaImgAttempts = 0;
529
+ var allowAnonComments = '0';
530
+ var registrationRequired = 0;
531
+ var registrationOptional = 1;
532
+ var emailRequired = 1;
533
+ var useAvatars = 1;
534
+ var jsonURL = "/.services/json-rpc";
535
+
536
+ var captchaSrc = "/.services/captcha?code_encrypted=";
537
+ var alertCommentCannotBeBlank = "You can not leave an empty comment. Please enter some text in the Comment field.";
538
+ var alertEditingExpired = "Sorry, you're no longer allowed to edit this comment. You may have taken too much time before submitting your edit or someone may have already replied to it.";
539
+
540
+ var alertAuthorCannotBeBlank = "Name must not be blank.";
541
+ var alertEmailCannotBeBlank = "Email Address must not be blank.";
542
+ var alertAuthorAndEmailCannotBeBlank = "Name and email address are both required!";
543
+ var alertEmailIsInvalid = "The Email Address you entered is invalid. Please enter a valid email address.";
544
+ var alertUnauthorizedAction = "The comments on this post are closed.";
545
+ var msgPostReplyTo = "Reply to ";
546
+ var msgInReplyTo = "In reply to ";
547
+ var msgPostAComment = "Post a comment ";
548
+ var atpCommentsPath = "/.shared/js/atpcomments_yui.js?v=4";
549
+ var hasChanged = 0;
550
+ var hostName = ".pauldix.net";
551
+ var tp_comment_token = "1262120431-62d457c45cff3b5b3ca447963486db9fee330526:QblOpHWDjTK4zh4M";
552
+
553
+ var isPage = 0;
554
+ var blog_xid = "6a00d8341f4a0d53ef00d8341f536453ef";
555
+ var xid = "";
556
+ var injectCode = '<div id=\"comment-preview\" class=\"hiddenBox\">\n\t<h3 id=\"header-verify-comment\" class=\"comments-header hiddenBox\">Verify your Comment<\/h3>\n <h3 id=\"header-preview-comment\" class=\"comments-header hiddenBox\">Previewing your Comment<\/h3>\n\t<div class=\"comments-content\">\n\t\t<div class=\"comment comment-has-avatar\">\n\t\t\t<div id=\"comment-preview-content\" class=\"comment-content\">\n\t\t\t<\/div>\n\t\t\t<p class=\"comment-footer\">\n\t\t\t\tPosted by: \n\t\t\t\t<span id=\"comment-preview-author\"><\/span>&nbsp;|&nbsp;<span id=\"comment-preview-datetime\"><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n<div id=\"comment-preview-confirmation\" class=\"hiddenBox yellowBox\">\n <p>This is only a preview. Your comment has not yet been posted.<\/p>\n \t<form id=\"comment-preview-form\"\n \t\tmethod=\"post\"\n \t\tonsubmit=\"atpComments.interceptPost(commentFormNum); return false;\">\n\t\t<input type=\"submit\" name=\"post\" id=\"comment-confirm-post\" value=\"&nbsp;Post&nbsp;\" onclick=\"atpComments.interceptPost(commentFormNum); return false;\"/>\t\t \n\t\t<input type=\"submit\" name=\"edit\" id=\"comment-edit\" value=\"&nbsp;&nbsp;Edit&nbsp;&nbsp;\" onclick=\"atpComments.previewOnly(commentFormNum, 2); return false;\"/>\n <span id=\"previewFormSpinner\" class=\"hiddenBox\"><img src=\"/.shared/images/spinner.gif\" alt=\"Working...\" /><\/span>\n\t<\/form>\n<\/div>\n<div id=\"comment-error\" class=\"hiddenBox redBox\">\t \n Your comment could not be posted. Error type: <span id=\"comment-error-msg\"><\/span> \n<\/div>\t\n<div id=\"comment-complete\" class=\"hiddenBox yellowGreenBox\">\n Your comment has been posted. <a href=\"javascript:void 0;\" onclick=\"window.location.hash=\'#comment-form\';window.location.reload(false)\">Post another comment<\/a>\n<\/div>\t\n<div id=\"comment-captcha\" class=\"hiddenBox yellowBox\">\t\n <div id=\"captchaText\">\n\t <p id=\"captchaFailMsg\" class=\"captchaErrorText hiddenBox\">The letters and numbers you entered did not match the image. Please try again.<\/p>\t \t \n\t <p>As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.<\/p>\n\t <p><span id=\"comment-captcha-viewalt\">Having trouble reading this image? <a href=\"#comment-captcha\" onClick=\"atpComments.generateCaptcha(commentFormNum);\">View an alternate.<\/a><\/span><\/p>\n <\/div>\n <p class=\"\"><img id=\"captchaImg\" /><\/p>\t\t\n <form id=\"comment-captcha-form\" \n\t\t method=\"post\"\n\t\t onsubmit=\"atpComments.submitWithCaptcha(commentFormNum); return false;\">\n\t\t<input type=\"hidden\" name=\"captcha_chal\" id=\"comment-captcha-chal\" value=\"\" />\n <p>\n\t <input id=\"comment-captcha-text\" name=\"captcha_text\" size=\"10\" />\n <\/p>\n <p>\n <input type=\"submit\" name=\"continue\" id=\"captcha-continue\" value=\"&nbsp;Continue&nbsp;\" />\n <span id=\"captchaFormSpinner\" class=\"commentSpinner hiddenBox\"><img src=\"/.shared/images/spinner.gif\" alt=\"Working...\" /><\/span>\n <\/p>\n <\/form>\n<\/div>\n';
557
+ var commentFormNum;
558
+ var entryPermalink = "http://www.pauldix.net/2009/10/typhoeus-the-best-ruby-http-client-just-got-better.html";
559
+ var inlineReply = document.createElement("div");
560
+ var commentFooterLinks;
561
+ var commentHeader;
562
+ var commentReplyXID;
563
+ var commentReplyAuthor;
564
+ var commentReplyComplete;
565
+ var inlineReplyLoaded = 0;
566
+
567
+ function xidToCommentPermalink (entryUrl, xid) {
568
+ return entryUrl + "?cid=" + xid + "#comment-" + xid;
569
+ }
570
+
571
+ </script>
572
+ <script type="text/javascript" src="/.shared/js/yui/yuiloader-beta-min.js"></script>
573
+ <script type="text/javascript" src="/.shared/js/atpcomments.js?v=3"></script>
574
+
575
+ <!-- ph=1 -->
576
+ <!-- nhm:from_kauri -->