<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>by Jon Crosby</description><title>Blog.</title><generator>Tumblr (3.0; @jcrosby)</generator><link>http://blog.joncrosby.me/</link><item><title>Lift</title><description>&lt;p&gt;Great news today! I am joining my long-time friend and colleague, &lt;a href="http://www.stubbleblog.com/"&gt;Tony Stubblebine&lt;/a&gt;, to co-found a new company, &lt;a href="http://lift.do"&gt;Lift&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re working in a space we love &amp;ndash; human potential &amp;ndash; in a unique partnership with &lt;a href="http://obvious.com/"&gt;Obvious&lt;/a&gt;, founded by Evan Williams, Biz Stone, and Jason Goldman. There will be more to share in the coming months. If you&amp;rsquo;re interested, please let us know by signing up for the upcoming beta.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/9310953188</link><guid>http://blog.joncrosby.me/post/9310953188</guid><pubDate>Tue, 23 Aug 2011 16:27:22 -0700</pubDate></item><item><title>Snarl - A JavaScript Bridge for JRuby</title><description>&lt;p&gt;If you would like to use JavaScript directly from Ruby, check out &lt;a title="Snarl on GitHub" href="http://github.com/jcrosby/snarl"&gt;Snarl&lt;/a&gt;. I just pushed its first public release to &lt;a title="Gemcutter" href="http://gemcutter.org/"&gt;Gemcutter&lt;/a&gt;. Snarl is JRuby-only, as it uses Mozilla&amp;rsquo;s &lt;a title="Rhino" href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt; JavaScript engine to do its work.&lt;/p&gt;
&lt;p&gt;First, make sure you&amp;rsquo;re using Gemcutter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gem install gemcutter&lt;br/&gt;gem tumble&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then, install and use:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gem install snarl&lt;br/&gt;irb&lt;br/&gt;&amp;gt; context = Snarl::JavascriptContext.new&lt;br/&gt;&amp;gt; context.eval(&amp;ldquo;1+1&amp;rdquo;) # =&amp;gt; 2&lt;br/&gt;&amp;gt; context.eval(&amp;ldquo;var increment = function(i) { return i+1 };&amp;rdquo;)&lt;br/&gt;&amp;gt; context.eval(&amp;ldquo;increment(3)&amp;rdquo;) # =&amp;gt; 4&lt;br/&gt;&amp;gt; context.load(&amp;ldquo;/path/to/js/lib.js&amp;rdquo;) # allows use of lib.js&lt;br/&gt;&amp;gt; context.put(&amp;ldquo;foo&amp;rdquo;, &amp;ldquo;bar&amp;rdquo;)&lt;br/&gt;&amp;gt; context.get(&amp;ldquo;foo&amp;rdquo;) # =&amp;gt; &amp;ldquo;bar&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.joncrosby.me/post/237659479</link><guid>http://blog.joncrosby.me/post/237659479</guid><pubDate>Sun, 08 Nov 2009 19:36:52 -0800</pubDate></item><item><title>Golden Gate Ruby Conference: CloudKit Video and Slides</title><description>&lt;p&gt;In April of this year, I had the pleasure of presenting CloudKit at the first &lt;a title="Golden Gate Ruby Conference Site" href="http://gogaruco.com/"&gt;Golden Gate Ruby Conference&lt;/a&gt; here in San Francisco. The videos are now online thanks to Pivotal Labs. If you&amp;rsquo;re interested in CloudKit, REST, Discovery, or the Open Stack, please take a moment to &lt;a title="CloudKit Video from Golden Gate Ruby Conference" href="http://pivotallabs.com/gogaruco/talks/60-cloudkit-hacking-the-open-stack-with-ruby-and-rack"&gt;check it out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a title="CloudKit Slides from Golden Gate Ruby Conference" href="http://www.slideshare.net/joncrosby/cloudkit"&gt;Slides are also available&lt;/a&gt; on SlideShare and a brief article on Composable REST Services is available in the wrap-up &lt;a title="Golden Gate Ruby Conference Wrap PDF" href="http://gogaruco.com/downloads/Wrap2009.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/118294539</link><guid>http://blog.joncrosby.me/post/118294539</guid><pubDate>Thu, 04 Jun 2009 22:09:31 -0700</pubDate></item><item><title>CloudKit 0.11.2 Released</title><description>&lt;p&gt;A patch release for &lt;a href="http://getcloudkit.com" title="CloudKit Site"&gt;CloudKit&lt;/a&gt;, version 0.11.2, has been released. This is a recommended upgrade for those using the 0.11.x series of gems.&lt;/p&gt;
&lt;p&gt;From the release notes:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Added Location header for 201s&lt;/li&gt;
&lt;li&gt;Fixed JSON response for DELETE operations&lt;/li&gt;
&lt;li&gt;Updated MD5 dependency for Ruby 1.9 (Andreas Haller)&lt;/li&gt;
&lt;li&gt;Updated spec setup for RSpec 1.2 (Andreas Haller)&lt;/li&gt;
&lt;li&gt;Updated gem dependencies for Rack, OpenID, and JSON&lt;/li&gt;
&lt;li&gt;Other minor fixes&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The next planned release is 0.12 with JSONQuery support (already &lt;a title="JSONQuery Announcement" href="http://blog.joncrosby.me/post/94444609/jsonquery-new-api-in-cloudkit-jquery-plugin"&gt;available&lt;/a&gt; client-side in the &lt;a title="CloudKit JQuery Plugin" href="http://github.com/jcrosby/jquery-cloudkit"&gt;JQuery plugin&lt;/a&gt;). If you are interested in working on this, see the jsonquery branch on &lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you to everyone for the feedback and patches.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/103958553</link><guid>http://blog.joncrosby.me/post/103958553</guid><pubDate>Tue, 05 May 2009 17:55:24 -0700</pubDate></item><item><title>JSONQuery, New API in CloudKit jQuery Plugin</title><description>&lt;p&gt;Upcoming  JSONQuery support was recently announced for &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; and there is now good news to share about the progress.&lt;/p&gt;
&lt;h3&gt;A No-Dependency JSONQuery Library for JavaScript&lt;/h3&gt;
&lt;p&gt;Thanks to &lt;a title="Kris Zyp on the SitePen Blog" href="http://www.sitepen.com/blog/author/kzyp/"&gt;Kris Zyp&lt;/a&gt; and Jason Smith, a no-dependency JavaScript library for JSONQuery is &lt;a title="JSONQuery on GitHub" href="http://github.com/JasonSmith/jsonquery/tree/master"&gt;available&lt;/a&gt; on GitHub. I am &lt;a title="jcrosby/jsonquery on GitHub" href="http://github.com/jcrosby/jsonquery/tree/master"&gt;maintaining my own fork&lt;/a&gt; of this library with bug fixes and a large set of tests. If you&amp;rsquo;ve been curious about JSONQuery but wanted some concrete examples of usage, there are now over &lt;a title="JSONQuery Tests" href="http://github.com/jcrosby/jsonquery/blob/0efae9caf5d763f8452227a99502b784e80e642d/test/test.js"&gt;300 lines of tests and examples&lt;/a&gt; to browse on my GitHub fork.&lt;/p&gt;
&lt;h3&gt;JSONQuery in the CloudKit jQuery Plugin&lt;/h3&gt;
&lt;p&gt;The latest version of the &lt;a title="CloudKit jQuery Plugin" href="http://github.com/jcrosby/jquery-cloudkit/tree/master"&gt;jQuery plugin for CloudKit&lt;/a&gt; now supports JSONQuery and includes an improved API. The original version of the plugin used TaffyDB. While TaffyDB is a quality library, the promise of a standard querying mechanism for JSON via JSONQuery was too powerful to ignore.&lt;/p&gt;
&lt;h3&gt;jQuery.data Inside&lt;/h3&gt;
&lt;p&gt;Under the hood, jquery.cloudkit.js uses &lt;a title="jQuery.data" href="http://docs.jquery.com/Core/data"&gt;jQuery.data&lt;/a&gt; as its local in-browser store now that TaffyDB is no longer required. jQuery.data is nothing new, but for those unfamiliar, the quick summary is that it provides a key/value store that can be attached to any DOM element.&lt;/p&gt;
&lt;p&gt;This is useful in the case of CloudKit where a top-level store for each resource collection is attached to the window element.&lt;/p&gt;
&lt;h3&gt;The New API&lt;/h3&gt;
&lt;p&gt;The basics of setting up your local in-browser database mapped to a CloudKit service are the same; you can still point the library at the metadata URL and it will configure and load itself. Each RESTful collection in CloudKit is still exposed as its own store. Beyond this, the API has been altered to provide a better interface, delegating work to the resources themselves instead of filtering all work through the outer collection. This new philosophy more closely matches that of CloudKit::Resource on the server.&lt;/p&gt;
&lt;p&gt;Here are some examples from the README:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/92294.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;h3&gt;JSONQuery in CloudKit&lt;/h3&gt;
&lt;p&gt;On the server side, things are moving quickly thanks to &lt;a title="Johnson on GitHub" href="http://github.com/jbarnette/johnson/tree/master"&gt;Johnson&lt;/a&gt;, a JavaScript bridge for Ruby. Johnson vendors &lt;a title="Mozilla SpiderMonkey" href="http://www.mozilla.org/js/spidermonkey/"&gt;SpiderMonkey&lt;/a&gt; to perform its work which means the exact same query API that is available in your browser is also available in CloudKit. Interested hackers can build a current gem for Johnson and use it with the jsonquery branch of CloudKit on GitHub today. These updates will be merged into the master branch for the next release.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/94444609</link><guid>http://blog.joncrosby.me/post/94444609</guid><pubDate>Wed, 08 Apr 2009 23:56:30 -0700</pubDate></item><item><title>CloudKit 0.11.1 Released</title><description>&lt;p&gt;&lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; 0.11.1 has just been released. This is a maintenance update for the 0.11.x series of gems. It is a recommended upgrade, containing the following changes (pulled straight from the change log):&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Added a block option for configuring OpenID bypassed routes (Devlin Daley)&lt;/li&gt;
&lt;li&gt;Added write locks for Tokyo Tyrant Tables&lt;/li&gt;
&lt;li&gt;Added Tokyo Tyrant Table example&lt;/li&gt;
&lt;li&gt;Fixed POST method tunneling bug (Saimon Moore)&lt;/li&gt;
&lt;li&gt;Fixed escaping of nested JSON Objects and Arrays&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You can track CloudKit in these places:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;The Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="CloudKit Google Group" href="http://groups.google.com/group/cloudkit"&gt;The Mailing List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="jcrosby on Twitter" href="http://twitter.com/jcrosby"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;#cloudkit on Freenode&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Thanks to all who provided feedback and patches for this release.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/89589183</link><guid>http://blog.joncrosby.me/post/89589183</guid><pubDate>Tue, 24 Mar 2009 21:07:43 -0700</pubDate></item><item><title>Video for Rack Middleware Presentation Available</title><description>&lt;p&gt;The &lt;a title="Confreaks" href="http://www.confreaks.com"&gt;Confreaks&lt;/a&gt; crew is lightning fast. The video from my Rack Middleware presentation at MountainWest is &lt;a title="MountainWest RubyConf Rack Middleware Video" href="http://mwrc2009.confreaks.com/13-mar-2009-11-05-in-a-world-of-middleware-who-needs-monolithic-applications-jon-crosby.html"&gt;now available&lt;/a&gt;, just days after the event.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/87740889</link><guid>http://blog.joncrosby.me/post/87740889</guid><pubDate>Wed, 18 Mar 2009 18:01:18 -0700</pubDate></item><item><title>Rack Middleware Slides from MountainWest RubyConf 2009</title><description>&lt;p&gt;&lt;a title="MountainWest RubyConf 2009" href="http://mtnwestrubyconf.org/2009/"&gt;MountainWest RubyConf&lt;/a&gt; was an incredibly good experience this year. There was a high signal-to-noise ratio with great speakers stacked up on both days. I consider myself the least of these speakers, but nevertheless have posted my slides for anyone who may be interested.&lt;/p&gt;
&lt;h3&gt;In a World of Middleware, Who Needs Monolithic Applications?&lt;/h3&gt;
&lt;p&gt;
&lt;object height="355" width="425" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=rack-090317024421-phpapp02&amp;amp;stripped_title=rack-middleware"&gt;&lt;embed height="355" width="425" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=rack-090317024421-phpapp02&amp;amp;stripped_title=rack-middleware" allowscriptaccess="always" allowfullscreen="true" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;Some of the slides won&amp;rsquo;t convey all of the intended meaning without the audio, but that should be reconciled once &lt;a title="Confreaks Site" href="http://www.confreaks.com"&gt;Confreaks&lt;/a&gt; posts the videos on their site. I&amp;rsquo;ll link again when those appear for those who are interested.&lt;/p&gt;
&lt;p&gt;Beyond the main conference track, the people in attendance really made the event special. There were many great conversations between talks and especially at the Engine Yard HackFest, which was amazingly good. At $100, the conference was a steal and one that I&amp;rsquo;ll never forget.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/87204828</link><guid>http://blog.joncrosby.me/post/87204828</guid><pubDate>Tue, 17 Mar 2009 01:20:33 -0700</pubDate></item><item><title>JSON Meets Tokyo Cabinet (and More!): CloudKit 0.11.0 Released</title><description>&lt;p&gt;&lt;a href="http://getcloudkit.com" title="CloudKit Site"&gt;CloudKit&lt;/a&gt; 0.11.0 is out with exciting new features!&lt;/p&gt;
&lt;h3&gt;Tokyo Cabinet&lt;/h3&gt;
&lt;p&gt;CloudKit now supports Tokyo Cabinet as its storage system. If you haven&amp;rsquo;t checked out Tokyo Cabinet, take a moment to read Ilya Grigorik&amp;rsquo;s &lt;a href="http://www.igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store/" title="Tokyo Cabinet: Beyond Key-Value Store"&gt;overview&lt;/a&gt; or check out its &lt;a href="http://tokyocabinet.sourceforge.net/index.html" title="Tokyo Cabinet Site"&gt;main site&lt;/a&gt;. You will find it to be an extremely fast and compelling storage system.&lt;/p&gt;
&lt;p&gt;While Tokyo Cabinet is impressive, it comes with the cost of a binary dependency. Although it took only a moment to install it on my Mac using &lt;a href="http://jmettraux.wordpress.com/" title="John Mettraux"&gt;John Mettraux&amp;rsquo;s&lt;/a&gt; simple &lt;a href="http://openwferu.rubyforge.org/tokyo.html" title="Tokyo Cabinet / Tyrant Install"&gt;instructions&lt;/a&gt;, I didn't want to sacrifice CloudKit&amp;rsquo;s install-and-go development experience. So, I added a pure Ruby store that mimics the Tokyo Table API (as exposed to CloudKit via &lt;a href="http://github.com/jmettraux/rufus-tokyo/tree/master" title="Rufus Tokyo"&gt;Rufus::Tokyo&lt;/a&gt;). This is the default store used by CloudKit until you specify otherwise. See the README for an example of using the native Tokyo Table backend when you&amp;rsquo;re ready.&lt;/p&gt;
&lt;p&gt;Making the switch to Tokyo Cabinet paves the way for the final significant piece of CloudKit&amp;rsquo;s architecture &amp;ndash; &lt;a href="http://docs.persvr.org/documentation/jsonquery" title="JSONQuery in Persevere"&gt;JSONQuery&lt;/a&gt; support. With super-fast storage, a discoverable API, built-in Open Web auth (using OpenID and OAuth), and fully searchable data with JSONQuery, CloudKit will cover a wide range of use cases. Not only this, but it fits in the Rack stack, so it can be used alongside your other favorite frameworks and middleware.&lt;/p&gt;
&lt;h3&gt;CloudKit::Resource&lt;/h3&gt;
&lt;p&gt;Unsatisfied with &amp;ldquo;alongside,&amp;rdquo; CloudKit has made the move to &amp;ldquo;inside&amp;rdquo; too. Prior to this release, the only interface to CloudKit was through its HTTP/REST web service. With the 0.11 release, you can also use it in a manner similar to &lt;a href="http://datamapper.org/doku.php" title="DataMapper Site"&gt;DataMapper&lt;/a&gt; or &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html" title="ActiveRecord API"&gt;ActiveRecord&lt;/a&gt; with one small difference; instead of having to map arbitrary models to SQL, CloudKit provides a single Resource model that represents a JSON document and all of its metadata (URI, ETag, Last-Modified date, etc.). There are more details in the CloudKit docs, but here are a few examples:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/76145.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;h3&gt;JQuery Plugin&lt;/h3&gt;
&lt;p&gt;Still early in development, a working &lt;a title="CloudKit jQuery Plugin" href="http://github.com/jcrosby/jquery-cloudkit/tree/master"&gt;jQuery plugin&lt;/a&gt; is available for CloudKit. The plugin provides an in-browser queryable JSON database that automatically loads and configures itself using the metadata provided by CloudKit. For every resource collection you are hosting with CloudKit, the plugin will expose a local mirror that amounts to a queryable JSON array (implemented using &lt;a href="http://taffydb.com/" title="TaffyDB Site"&gt;TaffyDB&lt;/a&gt; patched for asynchronous operation). Updating your local data is simple and is synchronized with the matching web service automatically.&lt;/p&gt;
&lt;p&gt;Here are some examples from the README:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/76147.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;h3&gt;Clouder: A Ruby API for CloudKit&lt;/h3&gt;
&lt;p&gt;For across-the-network access to CloudKit using Ruby, &lt;a href="http://www.demetriusnunes.com/" title="Demetrius Nunes"&gt;Demetrius Nunes&lt;/a&gt; has put together a library called &lt;a title="Clouder" href="http://github.com/demetriusnunes/clouder/tree/master"&gt;Clouder&lt;/a&gt;. This use case matches the way many are using CouchDB as an ORM backend. If you&amp;rsquo;re interested in using CloudKit in this manner, be sure to fork Demetrius&amp;rsquo;s &lt;a title="Clouder on GitHub" href="http://github.com/demetriusnunes/clouder/tree/master"&gt;project on GitHub&lt;/a&gt; and contribute.&lt;/p&gt;
&lt;h3&gt;IRC&lt;/h3&gt;
&lt;p&gt;Beyond the existing &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;site&lt;/a&gt;, GitHub &lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit/tree/master"&gt;repository&lt;/a&gt;, &lt;a title="jcrosby on Twitter" href="http://twitter.com/jcrosby"&gt;Twitter&lt;/a&gt;, and &lt;a title="CloudKit Google Group" href="http://groups.google.com/group/cloudkit"&gt;mailing list&lt;/a&gt;, there is now &lt;b&gt;#cloudkit&lt;/b&gt; on Freenode for interested hackers. Feel free to drop in and participate in the next release or ask questions about using CloudKit in your own projects.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/84826886</link><guid>http://blog.joncrosby.me/post/84826886</guid><pubDate>Mon, 09 Mar 2009 01:30:53 -0700</pubDate></item><item><title>CloudKit 0.10.1 Released</title><description>&lt;p&gt;A new 0.10.1 &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; gem has been released. This is the first release with patches from the growing community on GitHub. As always, a big thank you to everyone who sent feedback or code.&lt;/p&gt;
&lt;p&gt;To install:&lt;br/&gt;&lt;br/&gt;&lt;b&gt;gem install cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To update:&lt;br/&gt;&lt;br/&gt;&lt;b&gt;gem update cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;From the change log:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Updated oauth and sequel gem dependencies&lt;/li&gt;
&lt;li&gt;Fixed 410 responses for stale PUT operations&lt;/li&gt;
&lt;li&gt;Fixed MySQL content encoding (Harry Weppner)&lt;/li&gt;
&lt;li&gt;Various fixes for filter_merge!, rekey!, and excluding (Cameron Walters)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;You can track CloudKit in these places:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;The Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="CloudKit Google Group" href="http://groups.google.com/group/cloudkit"&gt;The Mailing List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="jcrosby on Twitter" href="http://twitter.com/jcrosby"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.joncrosby.me/post/73688468</link><guid>http://blog.joncrosby.me/post/73688468</guid><pubDate>Tue, 27 Jan 2009 21:58:53 -0800</pubDate></item><item><title>A World of Middleware</title><description>&lt;p&gt;What if every endpoint (or &amp;ldquo;origin&amp;rdquo; in HTTP-speak) was a 404 and everything else was middleware? In &lt;a title="Rack Site" href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;-land, this can be a reality. &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt;, for example, detects if it is the last thing in the stack, inserting a default developer page at the root and a 404 everywhere else. If it is not the last item in the stack, requests for resources that it has not claimed are passed downstream.&lt;/p&gt;
&lt;p&gt;If you consider that no web framework or piece of middleware is all-knowing, then this behavior seems to be more flexible than that of the pre-Rack view of the world where the URI space was &amp;ldquo;everything&amp;rdquo; by default.&lt;/p&gt;
&lt;p&gt;This Gist from &lt;a title="Jesse Newland" href="http://jnewland.com/"&gt;Jesse Newland&lt;/a&gt; shows a quick hack to make &lt;a title="Sinatra Site" href="http://sinatra.github.com/"&gt;Sinatra&lt;/a&gt; behave as middleware for Rack:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/50625.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;There is no reason that Rails and other frameworks should not behave similarly, allowing themselves to be yet another component in a chain leading to the eventual 404 at the end of the stack. I struggle to see the distinction between middleware and &amp;ldquo;web apps&amp;rdquo; as anything other than arbitrary.&lt;/p&gt;
&lt;p&gt;This concept and a few others provide the idea behind my upcoming talk &lt;b&gt;&amp;ldquo;In a World of Middleware, Who Needs Monolithic Applications?&amp;rdquo;&lt;/b&gt; at &lt;a title="MountainWest RubyConf 2009" href="http://mtnwestrubyconf.org/2009/"&gt;MountainWest RubyConf&lt;/a&gt; in March of this year. If you haven&amp;rsquo;t registered, take a moment to browse the &lt;a title="Speaker List" href="http://mtnwestrubyconf.org/2009/speakers"&gt;list of speakers&lt;/a&gt; and see if there is a way to get away from work for a long weekend.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/72451217</link><guid>http://blog.joncrosby.me/post/72451217</guid><pubDate>Thu, 22 Jan 2009 17:14:28 -0800</pubDate></item><item><title>CloudKit 0.10.0 Released: Rack 0.9, Batch URI Resolution</title><description>&lt;p&gt;A new 0.10.0 &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; gem is out.&lt;/p&gt;
&lt;p&gt;To install:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;gem install cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To update:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;gem update cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;This was originally going to be 0.9.2 with support for this week&amp;rsquo;s &lt;a title="Rack 0.9 Release Announcement" href="http://groups.google.com/group/rack-devel/msg/bf90c531a528c1ff?hl=en"&gt;Rack 0.9 release&lt;/a&gt;. However, the new batch URI resolution in the REST API was too valuable to hold back for the 1.0 release so it was pulled in and the minor version number was incremented to reflect its presence. This release contains no breaking API changes.&lt;/p&gt;
&lt;p&gt;The exact details of the new feature are in the updated &lt;a title="CloudKit REST API" href="http://getcloudkit.com/rest-api.html"&gt;REST API document&lt;/a&gt; and &lt;a title="CloudKit via cURL" href="http://getcloudkit.com/curl.html"&gt;cURL tutorial&lt;/a&gt; on the site. I will attempt to summarize with an embedded cURL log:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/45327.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;As always, thank you for the feedback on &lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit/tree/master"&gt;GitHub&lt;/a&gt;, &lt;a title="Twitter" href="http://twitter.com/jcrosby"&gt;Twitter&lt;/a&gt;, the &lt;a title="CloudKit Google Group" href="http://groups.google.com/group/cloudkit?hl=en"&gt;mailing list&lt;/a&gt;, and elsewhere.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/69480214</link><guid>http://blog.joncrosby.me/post/69480214</guid><pubDate>Fri, 09 Jan 2009 16:45:36 -0800</pubDate></item><item><title>OAuth, Phishing, and Twitter</title><description>&lt;p&gt;In the midst of what might seem like a crisis when viewed from within the web&amp;rsquo;s echo chamber, it can be difficult to sort fact from fiction, threat from hysteria. Such was the case last weekend when three terms that typically evoke passionate responses were combined in a single meme &amp;ndash; OAuth, Phishing, and Twitter.&lt;/p&gt;
&lt;p&gt;The source of concern was a scam spreading on Twitter via fake direct messages. These messages mimicked Twitter&amp;rsquo;s own opt-in email notifications that go out when users of the service receive a direct message. You can &lt;a title="Twitter Blog: Gone Phishing" href="http://blog.twitter.com/2009/01/gone-phishing.html"&gt;read the details&lt;/a&gt; on Twitter&amp;rsquo;s blog, released in a responsible and timely fashion during the incident. Engineers no doubt worked overtime to mitigate this while the rest of us enjoyed holiday leftovers and more relaxing weekends.&lt;br/&gt;&lt;br/&gt;It didn&amp;rsquo;t take long for some to try and link the incident to Twitter&amp;rsquo;s lack of &lt;a title="OAuth Site" href="http://oauth.net/"&gt;OAuth&lt;/a&gt; support in their API. Some, such as &lt;a title="Chris Messina" href="http://factoryjoe.com/"&gt;Chris Messina&lt;/a&gt;, clearly &lt;a title="FactoryCity: Twitter and the Password Anti-Pattern" href="http://factoryjoe.com/blog/2009/01/02/twitter-and-the-password-anti-pattern/"&gt;understood&lt;/a&gt; the distinction but others seemed to blur the line. This post is an attempt to demonstrate the &lt;i&gt;orthogonality of OAuth and phishing with regard to this specific incident&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Phishing Defined&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with a precise definition of phishing, taken from &lt;a title="Wikipedia on Phishing" href="http://en.wikipedia.org/wiki/Phishing"&gt;Wikipedia&lt;/a&gt; and quoted on Twitter&amp;rsquo;s own blog covering the incident:&lt;/p&gt;
&lt;blockquote&gt;&amp;ldquo;Phishing is the criminally fraudulent process of attempting to acquire sensitive information such as usernames, passwords and credit card details by masquerading as a trustworthy entity in an electronic communication.&amp;rdquo;&lt;/blockquote&gt;
&lt;p&gt;If your inbox looks like mine, phishing attempts are nothing new. Links typically contain misleading subdomains, misspelled top level domains, and other tactics in an attempt to establish enough trust to get a click, after which a fake site mirroring the original attempts to collect the sensitive information.&lt;br/&gt;&lt;br/&gt;This was the tactic employed by the scammers over the weekend in their attack against Twitter users and it is almost completely unrelated to OAuth or lack thereof in Twitter&amp;rsquo;s API. The end-to-end flow of receiving an email, clicking a link, and logging into what looks like a legitimate site does not change when using OAuth. &lt;b&gt;This exact attack is equally possible for sites using OAuth.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Authentication vs. Authorization&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;OAuth provides a method of secure API &lt;b&gt;authorization&lt;/b&gt; where as the act of logging into a site is the act of &lt;b&gt;authentication&lt;/b&gt;. For sites that use OAuth, users normally must authenticate &lt;i&gt;prior&lt;/i&gt; to authorizing third party API access. These are two separate steps. The difference between authentication and authorization isn&amp;rsquo;t mere pedantry; it is critical to the understanding of OAuth and its place along side complementary technologies such as session-based logins or &lt;a title="OpenID.net: What is OpenID?" href="http://openid.net/what/"&gt;OpenID&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Remember that &lt;i&gt;authentication&lt;/i&gt; answers more of the &amp;ldquo;Who am I?&amp;rdquo; question, sometimes merely validating a claim such as &amp;ldquo;I have control of this URL,&amp;rdquo; as is the case with OpenID. &lt;i&gt;Authorization&lt;/i&gt; handles the &amp;ldquo;I, having been authenticated, am authorized to perform this action&amp;rdquo; part of the equation.&lt;br/&gt;&lt;br/&gt;OAuth allows scoped API access (a la &lt;a title="Hueniverse: Explaining OAuth" href="http://www.hueniverse.com/hueniverse/2007/09/explaining-oaut.html"&gt;valet keys&lt;/a&gt;) to user data. The user remains in control, having the ability to disable a particular third party&amp;rsquo;s access to data while leaving others intact. Service providers can take this as far as they want, scoping each OAuth token to specific actions rather than an all-or-nothing approach. Users under this system have no reason to give their passwords to any third parties and sites can message strongly against it without worries of curtailing API usage and its related marketing benefits.&lt;br/&gt;&lt;br/&gt;Tying (or rather, &lt;i&gt;not&lt;/i&gt; tying) this back to Twitter, the phishing scam was an attack to gain authentication credentials for Twitter users and had nothing to do with authorization, the domain of OAuth.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/68470033</link><guid>http://blog.joncrosby.me/post/68470033</guid><pubDate>Mon, 05 Jan 2009 02:33:16 -0800</pubDate></item><item><title>CloudKit 0.9.1 Released</title><description>&lt;p&gt;A new &lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; 0.9.1 gem has been released. Thank you to everyone who sent feedback via the &lt;a title="CloudKit Google Group" href="http://groups.google.com/group/cloudkit"&gt;mailing list&lt;/a&gt;, &lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit"&gt;GitHub&lt;/a&gt;, &lt;a title="jcrosby on Twitter" href="http://twitter.com/jcrosby"&gt;Twitter&lt;/a&gt;, and personal email.&lt;/p&gt;
&lt;p&gt;To install:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;gem install cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;To update:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;gem update cloudkit&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;From the change log:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Fixed Rack::Lint/rackup errors related to Content-Type headers&lt;/li&gt;
&lt;li&gt;Patched Rack to support StringIO#string in Rack::Lint::InputWrapper&lt;/li&gt;
&lt;li&gt;Fixed server_url encoding in OpenIDStore&lt;/li&gt;
&lt;li&gt;Added sqlite3-ruby dependency in gemspec&lt;/li&gt;
&lt;li&gt;Updated documentation&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.joncrosby.me/post/67644315</link><guid>http://blog.joncrosby.me/post/67644315</guid><pubDate>Wed, 31 Dec 2008 02:40:35 -0800</pubDate></item><item><title>Release: CloudKit 0.9 - An Open Web JSON Appliance</title><description>&lt;p&gt;How many lines of code does it take to deploy a fully discoverable, RESTful, GET-optimized, auto-versioned, JSON API?&lt;/p&gt;
&lt;p&gt;Two. First, install the gem:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/38985.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="CloudKit Site" href="http://getcloudkit.com"&gt;CloudKit&lt;/a&gt; is &lt;a title="Rack" href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; middleware, so let&amp;rsquo;s create a rackup file called config.ru like this:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/38986.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Fire it up with &lt;a title="Thin" href="http://code.macournoyer.com/thin/"&gt;Thin&lt;/a&gt;, for example:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/38987.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;You now have a running JSON container managing collections of &amp;ldquo;notes&amp;rdquo; and &amp;ldquo;projects.&amp;rdquo; For the full &lt;a title="CloudKit REST API" href="http://getcloudkit.com/rest-api.html"&gt;REST API spec&lt;/a&gt;, see the CloudKit site. Don&amp;rsquo;t miss the &lt;a title="CloudKit cURL Tutorial" href="http://getcloudkit.com/curl.html"&gt;curl tutorial&lt;/a&gt; while you&amp;rsquo;re there.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say we want to add both &lt;a title="OpenID Site" href="http://openid.net/"&gt;OpenID&lt;/a&gt; and &lt;a title="OAuth Site" href="http://oauth.net/"&gt;OAuth&lt;/a&gt; support to this API. How many more lines of code?&lt;br/&gt;&lt;br/&gt;Zero. Simply change &amp;ldquo;expose&amp;rdquo; to &amp;ldquo;contain&amp;rdquo; and you&amp;rsquo;re ready to go:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/38988.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;CloudKit is built around HTTP and JSON for the purpose of building efficient APIs quickly. It&amp;rsquo;s a bit like CouchDB with baked-in Open Web auth plus the entire spectrum of Rack middleware at its disposal. The automatic version history for each JSON document is provided as an aid for decentralized or occasionally-connected clients, allowing a progressive diff/merge against history to &amp;ldquo;catch up&amp;rdquo; in the case of conflicts.&lt;/p&gt;
&lt;p&gt;Thanks to Rack, you can run CloudKit on its own or alongside other Rack-based apps or middleware components such as Rails, Merb, or Sinatra. Any requests outside of the named collection scopes or authentication endpoints are passed along to the next piece in the stack.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re interested in hacking, the source is on &lt;a title="CloudKit on GitHub" href="http://github.com/jcrosby/cloudkit"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/66224875</link><guid>http://blog.joncrosby.me/post/66224875</guid><pubDate>Mon, 22 Dec 2008 06:07:11 -0800</pubDate></item><item><title>Rack::Config 0.9 Released</title><description>&lt;p&gt;Smaller than its own README, &lt;a href="http://github.com/jcrosby/rack-config"&gt;Rack::Config&lt;/a&gt; is a straightforward method of configuring a stack of Rack middleware that needs to share information.&lt;/p&gt;
&lt;p&gt;To install:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/29939.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Example config.ru:&lt;/p&gt;
&lt;p&gt;
&lt;script src="http://gist.github.com/29936.js"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/61945266</link><guid>http://blog.joncrosby.me/post/61945266</guid><pubDate>Thu, 27 Nov 2008 23:54:49 -0800</pubDate></item><item><title>"JSCocoa bridges Cocoa to JavascriptCore (WebKit’s JS engine). It allows you to call C code,..."</title><description>“JSCocoa bridges Cocoa to JavascriptCore (WebKit’s JS engine). It allows you to call C code, ObjC code, use C structs, and build Javascript classes inheriting from ObjC classes.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://inexdo.com/JSCocoa"&gt;JSCocoa — A bridge from JavascriptCore to Cocoa&lt;/a&gt;&lt;/em&gt;</description><link>http://blog.joncrosby.me/post/53831270</link><guid>http://blog.joncrosby.me/post/53831270</guid><pubDate>Thu, 09 Oct 2008 12:24:18 -0700</pubDate></item><item><title>"However, the NDA has created too much of a burden on developers, authors and others interested in..."</title><description>“However, the NDA has created too much of a burden on developers, authors and others interested in helping further the iPhone’s success, so we are dropping it for released software.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://developer.apple.com/iphone/program/"&gt;iPhone Developer Program&lt;/a&gt;&lt;/em&gt;</description><link>http://blog.joncrosby.me/post/52627744</link><guid>http://blog.joncrosby.me/post/52627744</guid><pubDate>Wed, 01 Oct 2008 10:54:51 -0700</pubDate></item><item><title>"SquirrelFish Extreme runs JavaScript quite a bit faster than the original SquirrelFish. It’s..."</title><description>“SquirrelFish Extreme runs JavaScript quite a bit faster than the original SquirrelFish. It’s available in Mac and Windows nightlies and you can take it for a spin yourself.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="https://lists.webkit.org/pipermail/webkit-dev/2008-September/004823.html"&gt;[webkit-dev] SquirrelFish Extreme?&lt;/a&gt;&lt;/em&gt;</description><link>http://blog.joncrosby.me/post/49220588</link><guid>http://blog.joncrosby.me/post/49220588</guid><pubDate>Mon, 08 Sep 2008 00:27:50 -0700</pubDate></item><item><title>Peace, Hope &amp; Surveilance (via get directly down)</title><description>&lt;img src="http://67.media.tumblr.com/J6FqPCSqldccrn59VFcwlLie_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Peace, Hope &amp; Surveilance (via &lt;a href="http://flickr.com/photos/65172294@N00"&gt;get directly down&lt;/a&gt;)&lt;/p&gt;</description><link>http://blog.joncrosby.me/post/48243223</link><guid>http://blog.joncrosby.me/post/48243223</guid><pubDate>Mon, 01 Sep 2008 01:06:49 -0700</pubDate></item></channel></rss>