<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Heroku</title>
    <link>http://blog.heroku.com</link>
    <description>Heroku</description>
    <ttl>60</ttl>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/heroku" /><feedburner:info uri="heroku" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Introducing the Europe Region, Now Available in Public Beta</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/54FYCttREkQ/europe-region</link>
      <pubDate>Wed, 24 Apr 2013 17:35:38 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/24/europe-region</guid>
      <description>&lt;p&gt;Today we’re happy to announce Heroku’s Europe region, available in public beta. With more than &lt;a href="https://www.heroku.com/"&gt;3 million apps&lt;/a&gt; running on our platform from developers all over the globe, it&amp;#39;s not surprising that we&amp;#39;ve had high demand for Heroku in more regions of the world. After collaborating closely with customers during private beta, we&amp;#39;re now ready to offer Heroku services in Europe to all customers as part of a public beta. The Europe region runs Heroku applications from datacenters located in Europe, offering improved performance for users in that region.&lt;/p&gt;
&lt;h2&gt;One Heroku, Two Continents&lt;/h2&gt;

&lt;p&gt;The Europe region offers all the features of the existing US region. Both regions run apps on infrastructure dedicated to each region, but are managed by the same unified Heroku interface you already know. This provides powerful global app management with isolated, geolocated infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/0s3u2J2K0U2E1i3S062n/how_europe_works.svg" class="stretchy"&gt;&lt;/p&gt;

&lt;h2&gt;Faster Apps&lt;/h2&gt;

&lt;p&gt;The physical proximity of the Europe region to European end-users means reduced latency, often resulting in a dramatic improvement in app responsiveness to those users. We’ve observed performance improvements of 100ms per request or more for European end-users:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/0D040q1E1d1y3z1w2Q22/eu_response_times.svg" alt="Lower Latency in Europe" class="stretchy"&gt;&lt;/p&gt;

&lt;h2&gt;A Familiar Workflow&lt;/h2&gt;

&lt;p&gt;All Heroku users can now create and deploy apps to the Europe region:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku create --region eu
$ git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once the app is created, you can interact with it just like any other Heroku app.&lt;/p&gt;

&lt;h2&gt;Easy App Migration with Heroku Fork&lt;/h2&gt;

&lt;p&gt;To ease the process of migrating existing applications to the Europe region, we created &lt;a href="https://devcenter.heroku.com/articles/app-migration#fork-application"&gt;heroku fork&lt;/a&gt;, a new addition to the Heroku CLI. Heroku fork copies an app's Heroku Postgres data and config vars, and re-provisions all its add-ons. If you have an existing app you’d like to run in the Europe region, check that you’ve got the most recent &lt;a href="https://devcenter.heroku.com/articles/heroku-command#installing-the-heroku-cli"&gt;Heroku toolbelt&lt;/a&gt; installed and use Heroku fork to create a running copy of your app in the new region:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku fork --region eu
Creating fork myapp-332... done
Copying slug... done
Adding newrelic:professional... done
Copying config vars... done
Fork complete, view it at http://myapp-332.herokuapp.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note: &lt;code&gt;heroku fork&lt;/code&gt; will not move any domains or scale your app past a single dyno, so you&amp;#39;re free to decide when your app will be made available to your customers. For more information about this powerful new feature, see the &lt;a href="https://devcenter.heroku.com/articles/app-migration#fork-application"&gt;Dev Center article on heroku fork&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Add-ons&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://addons.heroku.com/?q=europe"&gt;More than 60 add-ons&lt;/a&gt; are currently available in the Europe region, with more on the way. To ensure that your app has fast access to its data wherever it’s deployed, Heroku automatically provisions latency-sensitive add-ons in your app’s region. Many add-ons are already available to apps in the Europe region, including:&lt;/p&gt;

&lt;ol class="addon_matrix"&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/heroku-postgresql"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/46/original.png"&gt;
      &lt;span&gt;Heroku Postgres&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/mongolab"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/750/original.png"&gt;
      &lt;span&gt;MongoLab&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/memcachier"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/322/original.png"&gt;
      &lt;span&gt;Memcachier&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/openredis"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/632/original.png"&gt;
      &lt;span&gt;openredis&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/newrelic"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/144/original.png"&gt;
      &lt;span&gt;New Relic&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/websolr"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/26/original.png"&gt;
      &lt;span&gt;Websolr&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/scheduler"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/176/original.png"&gt;
      &lt;span&gt;Scheduler&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/deployhooks"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/21/original.png"&gt;
      &lt;span&gt;Deploy Hooks&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/sendgrid"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/58/original.png"&gt;
      &lt;span&gt;SendGrid&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/airbrake"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/406/original.png"&gt;
      &lt;span&gt;Airbrake&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/papertrail"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/360/original.png"&gt;
      &lt;span&gt;Papertrail&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="https://addons.heroku.com/cleardb"&gt;
      &lt;img src="https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/catalogs/303/original.png"&gt;
      &lt;span&gt;ClearDB&lt;/span&gt;
    &lt;/a&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To discover which add-ons are available in the Europe region, &lt;a href="https://addons.heroku.com/?q=europe"&gt;search for &amp;#39;europe&amp;#39; on the addons homepage&lt;/a&gt; or use the new &lt;code&gt;--region&lt;/code&gt; flag in the heroku CLI:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku update
$ heroku addons:list --region eu
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Customer Success&lt;/h2&gt;

&lt;p&gt;Several Heroku customers have already deployed their production Heroku apps to the Europe region for improved performance. For example, top Swedish television network TV4 is currently running its video on demand service &lt;a href="http://www.tv4play.se/"&gt;TV4 Play&lt;/a&gt; out of Heroku’s Europe region. TV4 CTO Per Åström says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deploying our app closer to our users in Heroku&amp;#39;s Europe region gave us a 150ms improvement in web performance. Based on this win for our users, we’re moving all of our apps to the Europe region.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Digital agencies and other customers delivering user-facing mobile and social apps have also benefited from improved performance in the Europe region. For example, app development company &lt;a href="http://betapond.com/"&gt;Betapond&lt;/a&gt; COO Conor Ryan says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deploying our Facebook apps live to the Heroku cloud in the EU was pain-free and as easy as staging. We&amp;#39;re delighted to see an average of 11% improvement in page load times since making the switch. Consumers don&amp;#39;t tolerate waiting, particularly on mobile devices, so Heroku&amp;#39;s EU contribution to a snappy user experience is a big boost for Betapond and our customers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Safe Harbor Compliance is Coming Soon&lt;/h2&gt;

&lt;p&gt;Heroku is not yet a registered participant in the Safe Harbor program. We’ve laid the groundwork for becoming Safe Harbor certified and expect to have it soon. The Europe region public beta is designed to let you build high-performance apps for European users. It does not currently address data residency or jurisdiction concerns. You should assume that some portions of your app and its data will be in, or pass through,
datacenters located in the US.&lt;/p&gt;

&lt;h2&gt;We Want Your Feedback&lt;/h2&gt;

&lt;p&gt;
  If you have comments or questions about the Heroku Europe region, email us at &lt;a href="mailto:eu-beta@heroku.com" class="active"&gt;eu-beta@heroku.com&lt;/a&gt;.
  To receive email updates about the Heroku Europe region as it progresses to general availability, subscribe to the beta mailing list below.
&lt;/p&gt;

&lt;form action="http://lists.heroku.com/t/r/s/jdputr/" class="call_to_action simple_signup" method="post"&gt;
&lt;input class="email" id="jdputr-jdputr" name="cm-jdputr-jdputr" placeholder="Enter your heroku email address" type="text" required='required'&gt;
&lt;input class="submit" type="submit" value="Subscribe"&gt;
&lt;/form&gt;

&lt;h2&gt;Additional Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vimeo.com/64769370"&gt;Screencast: Introducing Regions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/regions"&gt;Dev Center: Regions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/regions#ssl"&gt;Dev Center: Configure SSL for Europe Region Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/heroku-postgres-follower-databases"&gt;Dev Center: Production Tier Postgres Database Migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups"&gt;Dev Center: Starter Tier Postgres Database Migration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/54FYCttREkQ" height="1" width="1"/&gt;</description>
      <author>Zeke</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/24/europe-region</feedburner:origLink></item>
    <item>
      <title>Expanded HTTP Method Support</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/k3rOFlvxoRI/expanded_http_method_support</link>
      <pubDate>Mon, 22 Apr 2013 18:26:48 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/22/expanded_http_method_support</guid>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Http" title="Hypertext Transfer Protocol (HTTP)"&gt;HTTP&lt;/a&gt; and its secure variant, HTTPS, are the protocols used by every web
client to talk to web applications. A key part of the protocol is the &lt;a href="https://tools.ietf.org/html/rfc2616#section-5.1.1" title="HTTP/1.1 Method token"&gt;HTTP
method&lt;/a&gt;. Traditionally, web applications used a very limited set of HTTP
methods. It is common for application servers, proxies and routers (such as the
Heroku HTTP router) to prevent unknown methods from being used. This unnecessary
constraint of the Heroku HTTP router has increasingly become a limitation to
developers building modern web applications.&lt;/p&gt;

&lt;p&gt;In the past, if you tried to use an unsupported HTTP method in your Heroku
application, clients would receive a &lt;code&gt;405 METHOD_NOT_ALLOWED&lt;/code&gt; error.&lt;/p&gt;

&lt;p&gt;As of today, that&amp;#39;s no longer the case. The Heroku routers &lt;a href="https://devcenter.heroku.com/articles/http-routing#supported-http-methods" title="Heroku HTTP Routing - Supported HTTP Methods"&gt;now accept any HTTP
method&lt;/a&gt;, allowing you to use newer methods that have recently
gained adoption, such as &lt;code&gt;PATCH&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Why is this important?&lt;/h2&gt;

&lt;p&gt;Many new web frameworks use recently introduced HTTP methods such as &lt;code&gt;PATCH&lt;/code&gt; or
even custom methods that are not yet standardized. Ruby on Rails is one such
framework. Rails has constantly evolved since its birth to always incorporate
the latest development techniques. One such evolution is happening in &lt;a href="http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/" title="Ruby on Rails 4.0 beta1"&gt;Rails
4&lt;/a&gt; where the framework &lt;a href="http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/" title="Edge Rails: PATCH is the primary HTTP method for updates"&gt;uses the &lt;code&gt;PATCH&lt;/code&gt; HTTP method to perform
partial updates of resources&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before Heroku removed restrictions on HTTP method, it was not possible to
leverage this new functionality in Rails 4. Now that any method is supported,
you can take full advantage of &lt;code&gt;PATCH&lt;/code&gt; support in Rails 4.&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;For the curious, a little more background is in order.&lt;/p&gt;

&lt;h3&gt;HTTP is extensible&lt;/h3&gt;

&lt;p&gt;A huge factor in HTTP&amp;#39;s popularity has been its extensibility. HTTP is a simple
protocol that can be used for many different purposes. For instance, the
&lt;a href="https://tools.ietf.org/html/rfc2616" title="RFC2616: Hypertext Transfer Protocol -- HTTP/1.1"&gt;HTTP/1.1 Spec&lt;/a&gt; defines the following set of methods: &lt;code&gt;OPTIONS&lt;/code&gt;, &lt;code&gt;GET&lt;/code&gt;,
&lt;code&gt;HEAD&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;TRACE&lt;/code&gt;, &lt;code&gt;CONNECT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But the spec also states that new methods can be added. In fact, a number of
other RFCs have standardized additional HTTP methods, often for specific
applications such as version control or calendaring. Yet in most cases,
regardless of the underlying application, developers can leverage the same
supporting infrastructure: load balancers, proxies, caching proxies; all
designed for HTTP.&lt;/p&gt;

&lt;h3&gt;The HTTP &lt;code&gt;PATCH&lt;/code&gt; Method&lt;/h3&gt;

&lt;p&gt;A recent extension to HTTP is &lt;a href="http://tools.ietf.org/html/rfc5789" title="RFC5789: PATCH Method for HTTP"&gt;RFC5789&lt;/a&gt;, which introduced the &lt;code&gt;PATCH&lt;/code&gt;
method. This method is particularly useful for web application developers, as it
standardizes a common way to make partial updates to resources. Rails 4 and many
other libraries now make use of it.&lt;/p&gt;

&lt;p&gt;We can quickly demonstrate how it is used by deploying a basic Sinatra app to
Heroku using the &lt;a href="https://devcenter.heroku.com/articles/rack#sinatra" title="Heroku Quickstart - Sinatra"&gt;quick start guide&lt;/a&gt;. Replace the code in
&lt;code&gt;app.rb&lt;/code&gt; with:&lt;/p&gt;

&lt;pre&gt;&lt;code class="ruby"&gt;require &amp;#39;sinatra&amp;#39;
require &amp;#39;json&amp;#39;

class App &amp;lt; Sinatra::Base

  # fake persistent data.
  DATA = { &amp;quot;a&amp;quot; =&amp;gt; 1, &amp;quot;b&amp;quot; =&amp;gt; 2, &amp;quot;c&amp;quot; =&amp;gt; 3 }

  put &amp;#39;/data&amp;#39; do
    # put replaces the existing resource so we simply return the new resource
    new_data = JSON.parse(request.body.read)
    new_data.to_json
  end

  patch &amp;#39;/data&amp;#39; do
    # patch &amp;#39;patches&amp;#39; the existing resource
    new_data = DATA.merge(JSON.parse(request.body.read))
    new_data.to_json
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once your app is deployed, perform a &lt;code&gt;PATCH&lt;/code&gt; and &lt;code&gt;PUT&lt;/code&gt; request with curl:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl -X PATCH http://shiny-object-1234.herokuapp.com/data -d &amp;#39;{&amp;quot;a&amp;quot;: 2, &amp;quot;b&amp;quot;: 3}&amp;#39;
{&amp;quot;a&amp;quot;:2,&amp;quot;b&amp;quot;:3,&amp;quot;c&amp;quot;:3}
$ curl -X PUT http://shiny-object-1234.herokuapp.com/data -d &amp;#39;{&amp;quot;a&amp;quot;: 2, &amp;quot;b&amp;quot;: 3}&amp;#39;
{&amp;quot;a&amp;quot;:2,&amp;quot;b&amp;quot;:3}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;PATCH&lt;/code&gt; logic merges the new values into the existing data structure and
returns the whole data structure, whereas &lt;code&gt;PUT&lt;/code&gt; simply replaces the old data
structure with a new one. While this example doesn&amp;#39;t persist the changes, it
demonstrates the semantic difference between these two HTTP methods.&lt;/p&gt;

&lt;h3&gt;Other HTTP methods&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PATCH&lt;/code&gt; is just one example of how a new HTTP method was defined, standardized
and successfully achieved widespread use. Because Heroku no longer imposes any
restrictions on HTTP methods, future extensions will work seamlessly without
requiring explicit support. This also means that the Heroku platform can be used
as a proving ground for new, non-standardized HTTP methods.&lt;/p&gt;

&lt;h3&gt;Why restrict HTTP methods in the first place?&lt;/h3&gt;

&lt;p&gt;The original motivation for application servers, proxies and HTTP routers to
restrict HTTP methods was that these intermediaries often performed more
functions than just passing through requests. For example, if an intermediary
wants to retry a failed request, it needs to understand whether a retry is safe.
&lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;PATCH&lt;/code&gt; requests are generally not safe to retry while &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, and
&lt;code&gt;DELETE&lt;/code&gt; are.&lt;/p&gt;

&lt;p&gt;Heroku&amp;#39;s routers pass requests straight through to the application, without
special handling based on the particular HTTP method; the routers therefore
handle all requests the same, regardless of which method was used. This results
in maximum flexibility for the application developer to use any HTTP method and
fully control the semantics of each request.&lt;/p&gt;

&lt;p&gt;For more on HTTP routing visit our &lt;a href="https://devcenter.heroku.com/articles/http-routing#supported-http-methods" title="Heroku HTTP Routing - Supported HTTP Methods"&gt;Dev Center article&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/k3rOFlvxoRI" height="1" width="1"/&gt;</description>
      <author>Blake</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/22/expanded_http_method_support</feedburner:origLink></item>
    <item>
      <title>Heroku Postgres – Version 9.2 now Default</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/3c878CRAugY/heroku_postgres_version_9_2_now_default</link>
      <pubDate>Thu, 18 Apr 2013 18:43:46 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/18/heroku_postgres_version_9_2_now_default</guid>
      <description>&lt;p&gt;Over a year ago we began working with the community as to how we could help to make Postgres better. Much of this came to fruition with PostgreSQL version 9.2 and three months ago we released support of Postgres 9.2 into GA. PostgreSQL version 9.2 is now the new default when provisioning a Heroku Postgres database. &lt;/p&gt;

&lt;p&gt;You can read more about the powerful features in this version over on the &lt;a href="https://postgres.heroku.com/blog/past/2013/4/18/postgres_92_now_default/"&gt;Heroku Postgres blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/3c878CRAugY" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/18/heroku_postgres_version_9_2_now_default</feedburner:origLink></item>
    <item>
      <title>Empowering Change: Programming Literacy for All</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/OawVPtYXDhY/heroku_in_the_classroom_ut_on_rails</link>
      <pubDate>Fri, 12 Apr 2013 16:00:45 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/12/heroku_in_the_classroom_ut_on_rails</guid>
      <description>&lt;p&gt;There has never been a better time to be a programmer. Every day more and more gadgets get connected or &lt;a href="http://en.wikipedia.org/wiki/Overclocking"&gt;over-clocked&lt;/a&gt;. Programming is so prevalent that it often goes unnoticed in our daily lives. Whether we&amp;#39;re scripting out social presence with &lt;a href="https://ifttt.com/"&gt;IFTTT&lt;/a&gt;, or doing taxes with Excel, automation and programming has become an inescapable part of the modern world.&lt;/p&gt;

&lt;p&gt;Heroku believes that to invest in our future, we must invest in &lt;a href="http://vimeo.com/groups/waza2012/videos/49701839"&gt;programming literacy&lt;/a&gt;. While we&amp;#39;re waiting for recursion to be a staple in our children’s classrooms,  we can work on continuing and higher education today.&lt;/p&gt;

&lt;p&gt;Heroku engineers are given opportunities and encouragement to be part of this movement. They’ve done so through supporting and participating in a number of groups including &lt;a href="http://hungryacademy.com/"&gt;Hungry academy&lt;/a&gt;, &lt;a href="http://railsgirls.com/"&gt;Rails Girls&lt;/a&gt;, &lt;a href="http://www.pyladies.com/"&gt;PyLadies&lt;/a&gt;, and more. &lt;/p&gt;

&lt;p&gt;As a Heroku engineer I had a recent opportunity to teach a class in Ruby on Rails at the University of Texas in Austin. While nothing beats an in-classroom experience, it&amp;#39;s not modular or scalable. In an effort to further scale programming literacy, we’ve been working to make this content available for everyone. After many re-takes, re-writes and hours of editing, we are happy to provide you with over 40 hours of video, lectures, exercises and quizes for free: &lt;a href="http://schneems.com/ut-rails"&gt;Heroku Presents: UT on Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The course will take a brand new developer up through the ranks, until they can build and deploy a fully functional website. If you or someone you know is interested in learning web programming, it&amp;#39;s a great opportunity.&lt;/p&gt;
&lt;h2&gt;Staying Connected&lt;/h2&gt;

&lt;p&gt;At Heroku, we are encouraged to get involved with our respective communities. While we dogfood our product on a daily basis, there is no substitute for seeing how other developers actually work with it.&lt;/p&gt;

&lt;p&gt;Developers don&amp;#39;t have to teach a &lt;a href="http://schneems.com/ut-rails"&gt;full length course&lt;/a&gt; to get involved with their communities. We&amp;#39;ve had developers help out at a number of community sponsored events that focus on getting more people engaged with technology. One of them, &lt;a href="http://railsgirls.com"&gt;Rails Girls&lt;/a&gt;, has been so successful that we&amp;#39;ve had engineers participate at events in over 6 different countries.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/3Q270g1E2z372U131q2K/picstitch.jpg" width='100%' /&gt;
&lt;a href="https://www.flickr.com/photos/khaase/7334469186/in/set-72157630042269314"&gt;Terence Lee at Rails Girls Amsterdam, photos by: Konstantin Haase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By staying connected, we help a new generation of programmers while making our own products better. It&amp;#39;s a win-win situation.&lt;/p&gt;

&lt;h2&gt;Feedback Cycles&lt;/h2&gt;

&lt;p&gt;Learning is a feedback loop. You take an action, see the result, learn a lesson. The smaller the loop, the less time from action to result: the quicker you learn, the faster you advance. For students, using Heroku means they can spend less time worrying about their production environments and more focusing on their application logic.&lt;/p&gt;

&lt;p&gt;Millions of application developers choose Heroku to get their features to market as quickly as possible. It&amp;#39;s that same speed of delivery and deployment that also makes Heroku a natural choice for beginners.&lt;/p&gt;

&lt;h2&gt;The Next Generation&lt;/h2&gt;

&lt;p&gt;As we move further into an ever-connected society, developers and companies must do their part to promote programming and technology in the classroom. While the demand for tech jobs seems to be constantly increasing, where will tomorrow&amp;#39;s senior developers come from? Perhaps they will come from programs like &lt;a href="https://us.pycon.org/2013/events/letslearnpython/"&gt;Let’s Learn Python&lt;/a&gt; at this years PyCon or through intensive focus courses like those offered by &lt;a href="http://www.gschool.it/"&gt;gSchool&lt;/a&gt;, or perhaps from general education courses. Wherever the next generation of programmers comes from, we want to set them up to succeed.&lt;/p&gt;

&lt;p&gt;Heroku has always had a &lt;a href="https://devcenter.heroku.com/articles/usage-and-billing#750-free-dynohours-per-app"&gt;free tier&lt;/a&gt; which is perfect for prototyping and learning. Putting the right tools in a student’s hands can empower them to succeed. If you are picking up web development or know someone who is, consider &lt;a href="http://schneems.com/ut-rails"&gt;introducing them to this Rails course&lt;/a&gt; and volunteering to help mentor them. The reward is far greater than the effort. &lt;/p&gt;

&lt;p&gt;If you&amp;#39;re teaching technology or programming and are using Heroku, we want to get to know you better. Please reach out and &lt;a href="mailto:education@heroku.com"&gt;contact us&lt;/a&gt;, we&amp;#39;re interested in your story. Help us invest in programming literacy, and make the future a better place.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/OawVPtYXDhY" height="1" width="1"/&gt;</description>
      <author>Richard</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/12/heroku_in_the_classroom_ut_on_rails</feedburner:origLink></item>
    <item>
      <title>2X Dynos in Public Beta</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/odp2BSp0RyQ/2x-dynos-beta</link>
      <pubDate>Fri, 05 Apr 2013 17:33:20 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/5/2x-dynos-beta</guid>
      <description>&lt;p&gt;A &lt;a href="https://devcenter.heroku.com/articles/dynos"&gt;dyno&lt;/a&gt;, the unit of computing power on Heroku, is a lightweight container running a single user-specified command. Today we’re announcing a dyno with twice the capacity: 2X dynos.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/1X2q3K2x1T2H1H2F3F3B/double-dynos.png" class="nobox" alt="2X Dynos" style="float: right;"&gt;&lt;/p&gt;

&lt;p&gt;Existing dynos are now called 1X dynos. They come with 512MB of memory and 1x CPU share. They cost $0.05/hr. 2X dynos are exactly what their name implies: 1GB of memory and twice the CPU share for $0.10/hr. To support the growth of current and future apps on the platform, you can now control your dyno resources on two axes: size and quantity.&lt;/p&gt;

&lt;p&gt;Let’s try them out.&lt;/p&gt;
&lt;h2&gt;Getting started with 2X dynos&lt;/h2&gt;

&lt;p&gt;Using the Heroku &lt;a href="https://toolbelt.heroku.com/"&gt;Toolbelt&lt;/a&gt;, resize your dynos with the &lt;code&gt;resize&lt;/code&gt; command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku ps:resize web=2X worker=1X
Resizing dynos and restarting specified processes... done
web dynos now 2X ($0.10/dyno-hour)
worker dynos now 1X ($0.05/dyno-hour)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To view the dyno size of a process type, use the ps command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku ps
=== web (2X): `bundle exec unicorn -p $PORT -c ./config/unicorn.rb`
web.1: up 2013/03/27 14:27:58 (~ 6h ago)
web.2: up 2013/03/27 14:47:04 (~ 6h ago)
web.3: up 2013/03/27 15:08:23 (~ 5h ago)

=== worker (1X): `bundle exec rake worker:job`
worker.1: up 2013/03/27 14:39:04 (~ 6h ago)
worker.2: up 2013/03/27 15:08:24 (~ 5h ago)
worker.3: up 2013/03/27 14:30:55 (~ 6h ago)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using the &lt;a href="https://dashboard.heroku.com/"&gt;Dashboard&lt;/a&gt; use the app’s resources page:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/3S1U0T1z1i0m382g2s3K/2x-dynos-dashboard.png" class="nobox" alt="Dashboard Resources Page" style="width: 100%;"&gt;&lt;/p&gt;

&lt;p&gt;For full instructions, see the &lt;a href="https://devcenter.heroku.com/articles/dyno-size"&gt;Dev Center article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Use Cases&lt;/h2&gt;

&lt;p&gt;You can already scale horizontally, adding more dynos with &lt;code&gt;heroku ps:scale&lt;/code&gt;. When you want to scale vertically instead, use larger dynos with &lt;code&gt;heroku ps:resize&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Concurrency for Rails with &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;Unicorn&lt;/a&gt;&lt;/strong&gt; - The first use case is increasing concurrency on single-threaded Rails apps using Unicorn. Due to the improved in-dyno queuing efficiency that results from increasing the number of Unicorn workers, doubling the workers in 2X dynos while halving the dyno count often results in better performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. JVM Languages&lt;/strong&gt; - The modern JVM has an explicit memory model designed for multi-threaded concurrency, and has many frameworks explicitly designed to take advantage of this property. Utilizing more threads requires more memory for both the thread stacks and for objects created by these threads. The JVM is fully capable of taking advantage of the vertical scale in a 2X dyno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Memory-intensive background jobs&lt;/strong&gt; - image processing and geospatial processing often need larger dynos. If you’ve gotten an &lt;a href="https://devcenter.heroku.com/articles/error-codes#r14-memory-quota-exceeded"&gt;R14&lt;/a&gt; out-of-memory error and this is not a leak, 2X dynos might be for you.&lt;/p&gt;

&lt;h2&gt;Horizontal vs. Vertical Scale&lt;/h2&gt;

&lt;p&gt;2X dynos give you a new knob to turn: vertical scale. Vertical scaling is appealing when the consolidation of compute power and memory increases overall performance. This can translate into better app performance at the same cost, and possibly lower costs if the set of dynos can be reduced by more than half.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/0U272139311b2J022k2O/horizontal_and_vertical_scaling.svg" class="stretchy"&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s impossible to make blanket statements about app performance due to each app&amp;#39;s unique performance characteristics. I/O-bound apps may not benefit from an increase in memory and compute, while process-heavy apps would. The best way to determine in what configuration your app runs best is to measure it. Heroku provides several tools to help you understand your application&amp;#39;s behavior.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://blog.heroku.com/archives/2013/3/19/log2viz"&gt;log2viz&lt;/a&gt; to understand how much memory and CPU is being consumed by your current app/dyno configuration. If the memory usage or web dyno activity indicators are close to their limits, 2X dynos may provide much-needed increase in resources. The latest &lt;a href="https://addons.heroku.com/newrelic"&gt;New Relic add-on&lt;/a&gt; accurately displays request queue times and can be used to visualize the impact a higher-concurrency configuration has on your app. Use 2X dynos to double your in-dyno Unicorn workers and mitigate inconsistent and variable queue times.&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Through the duration of the beta period, 2X dynos will cost the same as 1X dynos, that is $0.05 per hour. Once generally available they will cost $0.10 per hour. &lt;/p&gt;

&lt;p&gt;If you’re looking to improve concurrency on Rails apps, making use of JVMs or other memory-hungry tasks, 2X dynos have a lot of potential to make apps faster. Give them a try. &lt;/p&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How can I measure how much memory my dynos are using?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;log-runtime-metrics&lt;/code&gt; Labs feature provides logged metrics that can be consumed and inspected with an add-on that consumes logs such as Papertrail, or displayed by a visualization tool like log2viz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do 2X dynos affect the 750 free dyno hours?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;2X dynos consume twice as many free dyno-hours per hour as 1X dynos. Example: A 2X one dyno app will run for free for 375 hours compared to 750 hours for a 1X one dyno app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do single 2X dyno apps idle?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Idling affects single 1X and 2X dyno apps alike.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can dyno size be configured on a per process-type basis?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Dyno size can be applied on a per process-type basis. For example: &lt;code&gt;heroku ps:resize web=2X worker=1X worker2=2X&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I get 4X (or larger) dynos?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are exploring the option. If you have an app that may need these, send us a &lt;a href="http://go.heroku.com/critical/"&gt;note&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/odp2BSp0RyQ" height="1" width="1"/&gt;</description>
      <author>Nicolas</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/5/2x-dynos-beta</feedburner:origLink></item>
    <item>
      <title>Heroku Postgres Databases Patched</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/3eNygUHHdx4/heroku_postgres_databases_patched</link>
      <pubDate>Thu, 04 Apr 2013 14:43:21 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/4/heroku_postgres_databases_patched</guid>
      <description>&lt;p&gt;&lt;em&gt;This post originally appeared on the postgres blog. We are also posting it in full here because we believe the content is so important.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Data is one of the most valuable assets of any company. As a database-as-a-service provider, one of our biggest responsibilities is ensuring your data is kept safe. A few weeks ago, one of the worst security vulnerabilities to date in PostgreSQL &lt;a href="http://www.postgresql.org/about/news/1456/"&gt;was discovered&lt;/a&gt;. To address this issue, Heroku &lt;a href="https://status.heroku.com/incidents/510"&gt;deployed a point release upgrade&lt;/a&gt; across the entire Heroku Postgres service earlier this week. This resulted in a period of database unavailability, typically with a duration of less than one minute. Every database running on Heroku Postgres is now appropriately patched and is unaffected by the vulnerability.&lt;/p&gt;

&lt;h3&gt;PostgreSQL Vulnerability Details&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The PostgreSQL project has provided official &lt;a href="http://www.postgresql.org/support/security/faq/2013-04-04/"&gt;detail on CVE-2013-1899&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Several weeks ago there was a responsible disclosure of a serious security vulnerability within PostgreSQL by &lt;a href="http://www.postgresql.org/support/security/faq/2013-04-04/"&gt;Mitsumasa Kondo and Kyotaro Horiguchi&lt;/a&gt;. The vulnerability allows unauthenticated remote users to use the ‘postmaster‘ process to write data to any accessible file, including critical internal database files.&lt;/p&gt;

&lt;p&gt;The vulnerability was fixed and then committed to the PostgreSQL’s &lt;a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a6e0cd7b76c04acc8c8f868a3bcd0f9ff13e16c8"&gt;private git repository&lt;/a&gt;, but only after updates to anonymously accessible copies &lt;a href="www.postgresql.org/message-id/14040.1364490185@sss.pgh.pa.us"&gt;were disabled&lt;/a&gt;. Updated versions of PostgreSQL were released today to most large packaging repositories, as well as source code and installers.&lt;/p&gt;

&lt;h3&gt;Heroku Postgres Patching&lt;/h3&gt;

&lt;p&gt;The Heroku Postgres team worked with the PostgreSQL community to ensure we would be able to rapidly apply this patch. However, due to the nature of the issue, and aiming to mitigate risk for others, we were not able to discuss specifics until now. Our goal — in addition to ensuring your data was safe — was to continue monitoring this upgrade as it was deployed, providing early feedback to the community should bugs be found, and not jeopardizing in any way the coordinated public disclosure process stewarded by the PostgreSQL community. Most importantly, the PostgreSQL source code that included the patch was held in the utmost secrecy. In addition, the deployment plan was reviewed by PostgreSQL community members in advance.&lt;/p&gt;

&lt;p&gt;Once the source code was released to the PostgreSQL packagers—of which a member of the Heroku Postgres staff is a part of—we began applying this patch to all Heroku Postgres databases, with the first updates starting on Monday. As of Wednesday at 6:30 PM PDT, all Heroku Postgres databases had been upgraded to their appropriate point release and were no longer vulnerable to &lt;a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1899"&gt;CVE-2013-1899&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;We realize that having no control over a maintenance window, however brief, is among the worst possible experiences. We are very sorry. Two reasons prevented us from working with you to schedule the security update. First, we prioritize ensuring your data is safe above all else, as a result making sure that every database was patched before this exploit was weaponized was paramount. Secondly, this was the first time we&amp;#39;ve had to deal with a security update of this scale, and have no machinery in place to schedule upgrades of this sort. Spending time to build such machinery would have prevented us from having every database patched in time. We will continue to work on improving our process around such maintenance to provide a better experience in the future.&lt;/p&gt;

&lt;p&gt;As of late Wednesday all Heroku Postgres databases were upgraded and no longer at risk of &lt;a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-1899"&gt;CVE-2013-1899&lt;/a&gt;. No further action is required on your part to ensure your data remains safe.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/3eNygUHHdx4" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/4/heroku_postgres_databases_patched</feedburner:origLink></item>
    <item>
      <title>Routing and Web Performance on Heroku: a FAQ</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/lHhBRv8V6lk/routing_and_web_performance_on_heroku_a_faq</link>
      <pubDate>Wed, 03 Apr 2013 17:02:27 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq</guid>
      <description>&lt;p&gt;Hi. I&amp;#39;m Adam Wiggins, cofounder and CTO of Heroku.&lt;/p&gt;

&lt;p&gt;Heroku has been my life’s work. Millions of apps depend on us, and I take that responsibility very personally.&lt;/p&gt;

&lt;p&gt;Recently, Heroku has faced criticism from the hacker community about how our HTTP router works, and about web performance on the platform in general. I’ve read all the public discussions, and have spent a lot of time over the past month talking with our customers about this subject.&lt;/p&gt;

&lt;p&gt;The concerns I&amp;#39;ve heard from you span past, present, and future.&lt;/p&gt;

&lt;p&gt;The past: some customers have hit serious problems with poor web performance and insufficient visibility on their apps, and have been left very frustrated as a result. What happened here? The present: how do you know if your app is affected, and if so what should you do? And the future: what is Heroku doing about this? Is Heroku a good place to run and scale an app over the long term?&lt;/p&gt;

&lt;p&gt;To answer these questions, we’ve written a FAQ, found below. It covers what happened, why the router works the way that it does, whether your app is affected by excessive queue time, and what the solution is.&lt;/p&gt;

&lt;p&gt;As to the future, here’s what we’re doing. We’re ramping up hands-on migration assistance for all users running on our older stack, Bamboo, or running a non-concurrent backend on our new stack, Cedar. (See the FAQ for why this is the fix.) We’re adding new features such as 2X dynos to make it easier to run concurrent backends for large Rails apps. And we&amp;#39;re making performance and visibility a bigger area of product attention, starting with some tools we&amp;#39;ve already released in the last month.&lt;/p&gt;

&lt;p&gt;If you have a question not answered by this FAQ, post it as a comment here, &lt;a href="https://news.ycombinator.com/item?id=5487316"&gt;on Hacker News&lt;/a&gt;, or &lt;a href="https://twitter.com/heroku"&gt;on Twitter&lt;/a&gt;. I’ll attempt to answer all such questions posted in the next 24 hours.&lt;/p&gt;

&lt;p&gt;To all our customers who experienced real pain from this: we&amp;#39;re truly sorry. After reading this FAQ, I hope you feel we&amp;#39;re taking every reasonable step to set things right, but if not, please let us know.&lt;/p&gt;

&lt;p&gt;Adam&lt;/p&gt;

&lt;hr&gt;

&lt;h2&gt;Overview&lt;/h2&gt;

&lt;h3&gt;Q. Is Heroku’s router broken?&lt;/h3&gt;

&lt;p&gt;A. No. While hundreds of pages could be written on this topic, we’ll address some of this in &lt;a href="#routing_technology"&gt;Routing technology&lt;/a&gt;. Summary: the current version of the router was designed to provide the optimum combination of uptime, throughput, and support for modern concurrent backends. It works as designed.&lt;/p&gt;

&lt;h3&gt;Q. So what’s this whole thing about then?&lt;/h3&gt;

&lt;p&gt;A. Since early 2011, high-volume Rails apps that run on Heroku and use single-threaded web servers sometimes experienced severe &lt;a href="http://highscalability.com/blog/2012/3/12/google-taming-the-long-latency-tail-when-more-machines-equal.html"&gt;tail latencies&lt;/a&gt; and poor utilization of web backends (dynos). Lack of visibility into app performance, including incorrect queue time reporting prior to the &lt;a href="https://blog.heroku.com/archives/2013/2/21/better_queuing_metrics_with_updated_new_relic_add_on"&gt;New Relic update in February 2013&lt;/a&gt;, made diagnosing these latencies (by customers, and even by Heroku’s own support team) very difficult.&lt;/p&gt;

&lt;h3&gt;Q. What types of apps are affected?&lt;/h3&gt;

&lt;p&gt;A. Rails apps running on Thin, with six or more dynos, and serving 1k reqs/min or more are the most likely to be affected. The impact becomes more pronounced as such apps use more dynos, serve more traffic, or have large request time variances.&lt;/p&gt;

&lt;h3&gt;Q. How can I tell if my app is affected?&lt;/h3&gt;

&lt;p&gt;A. Add the free version of New Relic (&lt;code&gt;heroku addons:add newrelic&lt;/code&gt;) and install the latest version of the &lt;code&gt;newrelic_rpm&lt;/code&gt; gem, then watch your queue time. Average queue times above 40ms are usually indicative of a problem.&lt;/p&gt;

&lt;p&gt;Some apps with lower request volume may be affected if they have extremely high request time variances (e.g., HTTP requests lasting 10+ seconds) or make callbacks like &lt;a href="https://groups.google.com/forum/#!msg/plataformatec-devise/FYv2ojbvswo/XLCJ_PMcgK4J"&gt;this OAuth example&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Q. What’s the fix?&lt;/h3&gt;

&lt;p&gt;A. Switch to a concurrent web backend like &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;Unicorn&lt;/a&gt; or &lt;a href="https://devcenter.heroku.com/articles/moving-an-existing-rails-app-to-run-on-jruby"&gt;Puma on JRuby&lt;/a&gt;, which allows the dyno to manage its own request queue and avoid blocking on long requests.&lt;/p&gt;

&lt;p&gt;This requires that your app be on our most current stack, &lt;a href="https://devcenter.heroku.com/articles/cedar"&gt;Cedar&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Q. Can you give me some help with this?&lt;/h3&gt;

&lt;p&gt;A. Certainly. We’ve already emailed all customers with apps running on Thin with more than six dynos with self-migration instructions, and a way to reach us for direct assistance.&lt;/p&gt;

&lt;p&gt;If you haven’t received the email and want help making the switch, &lt;a href="https://help.heroku.com/cedar-migration"&gt;contact us for migrating to Cedar&lt;/a&gt; or &lt;a href="https://help.heroku.com/unicorn-upgrade"&gt;migrating to Unicorn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a name="routing_technology"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Routing technology&lt;/h2&gt;

&lt;h3&gt;Q. Why does the router work the way that it does?&lt;/h3&gt;

&lt;p&gt;A. The Cedar router was built with two goals in mind: (1) to support the new world of concurrent web backends which have become the standard in Ruby and all other language communities; and (2) to handle the throughput and availability needs of high-traffic apps.&lt;/p&gt;

&lt;p&gt;Read &lt;a href="https://devcenter.heroku.com/articles/http-routing"&gt;detailed documentation of Heroku’s HTTP routing&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Q. Even with concurrent web backends, wouldn’t a single global request queue still use web dynos more efficiently?&lt;/h3&gt;

&lt;p&gt;A. Probably, but it comes with trade-offs for availability and performance. The Heroku router favors availability, stateless horizontal scaling, and low latency through individual routing nodes. Per-app global request queues require a sacrifice on one or more of these fronts. See Kyle Kingsbury’s &lt;a href="http://aphyr.com/posts/278-timelike-2-everything-fails-all-the-time"&gt;post on the CAP theorem implications for global request queueing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After extensive research and experimentation, we have yet to find either a theoretical model or a practical implementation that beats the simplicity and robustness of random routing to web backends that can support multiple concurrent connections.&lt;/p&gt;

&lt;h3&gt;Q. So does that mean you aren’t working on improving HTTP performance?&lt;/h3&gt;

&lt;p&gt;A. Not at all. We&amp;#39;re always looking for new ways to make HTTP requests on Heroku faster, more reliable, and more efficient. For example, we’ve been experimenting with &lt;a href="http://en.wikipedia.org/wiki/Backpressure_routing"&gt;backpressure routing&lt;/a&gt; for web dynos to signal to the router that they are overloaded.&lt;/p&gt;

&lt;p&gt;You, our customers, have told us that it’s not routing algorithms you ultimately care about, but rather overall web performance. You want to serve HTTP requests as quickly as possible, for fast page loads or API calls for your users. And you want to be able to quickly and easily diagnose performance problems.&lt;/p&gt;

&lt;p&gt;Performance and visibility are what matters, and that’s what we’ll work on. This will include ongoing improvements to dynos, the router, visibility tools, and our docs.&lt;/p&gt;

&lt;h2&gt;Retrospective&lt;/h2&gt;

&lt;h3&gt;Q. Did the Bamboo router degrade?&lt;/h3&gt;

&lt;p&gt;A. Yes. Our older router was built and designed during the early years of Heroku to support the Aspen and later the Bamboo stack. These stacks did not support concurrent backends, and thus the router was designed with a per-app global request queue. This worked as designed originally, but then &lt;a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update"&gt;degraded slowly over the course of the next two years&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Q. Were the docs wrong?&lt;/h3&gt;

&lt;p&gt;A. Yes, for Bamboo. They were correct when written, but fell out of date starting in early 2011. Until February 2013, the documentation described the Bamboo router only sending one connection at a time to any given web dyno.&lt;/p&gt;

&lt;h3&gt;Q. Why didn’t you update Bamboo docs in 2011?&lt;/h3&gt;

&lt;p&gt;A. At the time, our entire product and engineering team was focused on our new product, Cedar. Being so focused on the future meant that we slipped on stewardship of our existing product.&lt;/p&gt;

&lt;h3&gt;Q. Was the &amp;quot;How It Works&amp;quot; section of the Heroku website wrong?&lt;/h3&gt;

&lt;p&gt;A. Yes. Similar to the docs, How It Works section of our website described the router as tracking which dynos were tied up by long HTTP requests. This was accurate when written, but gradually fell out of date in early 2011. Unlike the docs, we completely rewrote the homepage in June of 2011 and it no longer referenced tracking of long requests.&lt;/p&gt;

&lt;h3&gt;Q. Was the queue time metric in New Relic wrong?&lt;/h3&gt;

&lt;p&gt;A. Yes, for the same 2011—2013 period from previous questions. The metric was transmitted to the New Relic instrumentation in the app via a set of HTTP headers set by the Heroku router. The root cause was the same as the Bamboo router degradation: the code didn&amp;#39;t change, but scaling out the router nodes caused the data to become increasingly inaccurate and eventually useless. With New Relic&amp;#39;s help, &lt;a href="https://blog.heroku.com/archives/2013/2/21/better_queuing_metrics_with_updated_new_relic_add_on"&gt;we fixed this in February 2013&lt;/a&gt; by calculating queue time using a different method.&lt;/p&gt;

&lt;h3&gt;Q. Why didn’t Heroku take action on this until Rap Genius went public?&lt;/h3&gt;

&lt;p&gt;A. We’re sorry that we didn’t take action on this based on the customer complaints via support tickets and other channels sooner. We didn’t understand the magnitude of the confusion and frustration caused by the out-of-date Bamboo docs, incorrect queue time information in New Relic, and the general lack of visibility into web performance on the platform. The huge response to the Rap Genius post showed us that this touched a nerve in our community.&lt;/p&gt;

&lt;h2&gt;The Future&lt;/h2&gt;

&lt;h3&gt;Q. What are we doing to make things right from here forward?&lt;/h3&gt;

&lt;p&gt;A. We’ve been working with many of our customers to get their queue times down, get them accurate visibility into their app’s performance, and make sure their app is fast and running on the right number of dynos. So far, &lt;a href="https://twitter.com/jakeonrails/status/317777081100554242"&gt;the results are good&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Q. What about everyone else?&lt;/h3&gt;

&lt;p&gt;A. If we haven’t been in touch yet, here’s what we’re doing for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration assistance:&lt;/strong&gt; We’ll give you hands-on help migrating to a concurrent backend, either individually or in online workshops. This includes the move to Cedar if you’re still on Bamboo. If you’re running a multi-dyno app on a non-concurrent backend and haven’t received an email, drop us a line about &lt;a href="https://help.heroku.com/unicorn-upgrade"&gt;Thin to Unicorn&lt;/a&gt; or &lt;a href="https://help.heroku.com/cedar-migration"&gt;Bamboo to Cedar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2X dynos:&lt;/strong&gt; We’re fast-tracking the launch of 2X dynos, to provide double the memory and allow for double (or more) Unicorn concurrency for large Rails apps. This is already available in private beta in use by several hundred customers, and will be available in public beta shortly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New visibility tools:&lt;/strong&gt; We’re putting more focus on bringing you new performance visibility features, such as &lt;a href="https://blog.heroku.com/archives/2013/3/19/log2viz"&gt;the log2viz dashboard&lt;/a&gt;, &lt;a href="https://devcenter.heroku.com/articles/log-runtime-metrics"&gt;CPU and memory use logging&lt;/a&gt;, and &lt;a href="https://devcenter.heroku.com/articles/http-request-id"&gt;HTTP request IDs&lt;/a&gt;. We’ll be working to do much more on this front to make sure that you can diagnose performance problems when they happen and know what to do about it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want something else not mentioned here? &lt;a href="mailto:cedar@heroku.com"&gt;Let us know.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/lHhBRv8V6lk" height="1" width="1"/&gt;</description>
      <author>Adam</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq</feedburner:origLink></item>
    <item>
      <title>Helios - open source framework for mobile</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/mD8YHgyUAIg/helios</link>
      <pubDate>Tue, 02 Apr 2013 19:11:59 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/4/2/helios</guid>
      <description>&lt;p&gt;Heroku has a strong tradition with open source projects. Engineers have dedicated countless hours to the projects that developers count on every day. Open Source Software is in our DNA.&lt;/p&gt;

&lt;p&gt;Speaking personally, I’m passionate about building tools like &lt;a href="http://afnetworking.com/"&gt;AFNetworking&lt;/a&gt; and &lt;a href="https://github.com/mattt/cupertino"&gt;cupertino&lt;/a&gt;, in order to help developers build insanely great experiences for mobile devices. It’s with great pleasure that I introduce something new I’ve been working on:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://heroku-mattt.s3.amazonaws.com/astronaut.png" style="height:287px; width:262px; float:right; padding:5px; border:none"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://helios.io/"&gt;Helios&lt;/a&gt; is an open-source framework that provides essential backend services for iOS apps. This includes data synchronization, push notifications, in-app purchases, and passbook integration. It allows developers to get a client-server app up-and-running while seamlessly incorporating functionality as necessary.&lt;/p&gt;

&lt;p&gt;Helios is designed for &amp;quot;mobile first&amp;quot; development. Build out great features on the device, and implement the server-side components as necessary. Pour all of your energy into crafting a great user experience, rather than getting mired down with the backend.&lt;/p&gt;

&lt;p&gt;Built on the &lt;a href="http://bit.ly/11id8Bu"&gt;Rack&lt;/a&gt; webserver interface, Helios can be easily added into any existing &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; or &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; application. Or, if you&amp;#39;re starting with a Helios application, you can build a new Rails or Sinatra application on top of it. This means that you can develop your application using the tools and frameworks you love, and maintain flexibility with your architecture as your needs evolve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/helios-framework/helios"&gt;Give it a try and let me know what you think!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/mD8YHgyUAIg" height="1" width="1"/&gt;</description>
      <author>Mattt</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/4/2/helios</feedburner:origLink></item>
    <item>
      <title>Waza 2013: How Ecosystems Build Mastery</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/RBVO1NGX1B0/waza_wrap</link>
      <pubDate>Wed, 20 Mar 2013 19:57:35 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/3/20/waza_wrap</guid>
      <description>&lt;p&gt;When we think of the concept of Waza (技) or &amp;quot;art and technique,&amp;quot; it&amp;#39;s easy to get caught up in the idea of individual mastery. It&amp;#39;s true that works of art are often created by those with great skill, but acquiring that skill is neither solitary nor static. Generations of masters contribute to a canon and it is in that spirit that we built the Heroku platform and the Waza event. This year&amp;#39;s Waza was no exception. &lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/61829655" width="100%" height="381" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;On February 28th, more than 900 attendees participated in Waza including Ruby founder &lt;a href="https://vimeo.com/61043050"&gt;Yukihiro &amp;quot;Matz&amp;quot; Matsumoto&lt;/a&gt;, Django co-creator &lt;a href="https://vimeo.com/61059530"&gt;Jacob Kaplan-Moss&lt;/a&gt; and Codeacademy’s &lt;a href="https://vimeo.com/groups/waza2013/videos/61113155"&gt;Linda Liukas&lt;/a&gt;. True to form, we offered you a platform for experimentation and you surprised us with your contributions. &lt;/p&gt;

&lt;p&gt;From your origami creations, to your Arduino hacks, to the technical conversations over craft beer -- you taught us that the definition of software development is ever-evolving. Thank you for allowing us to help you change lives and push boundaries. We will continue our commitment to growing the platform for you and look forward to collaborating with you in the future. &lt;/p&gt;

&lt;p&gt;For more event highlights visit the Waza &lt;a href="https://vimeo.com/herokuwaza"&gt;videos&lt;/a&gt; and &lt;a href="http://www.flickr.com/groups/2080225@N23/pool/"&gt;photos&lt;/a&gt;. To learn more about Heroku, add yourself to our &lt;a href="http://lp.heroku.com/EmailSubscribeLandingPage.html"&gt;mailing list&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/RBVO1NGX1B0" height="1" width="1"/&gt;</description>
      <author>Dana</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/3/20/waza_wrap</feedburner:origLink></item>
    <item>
      <title>log2viz: Logs as Data for Performance Visibility</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/E8m5SUsbNxI/log2viz</link>
      <pubDate>Tue, 19 Mar 2013 18:36:53 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/3/19/log2viz</guid>
      <description>&lt;p&gt;If you’re building a customer-facing web app or mobile backend, performance is a critical part of user experience. &lt;a href="http://mattwalton.co.uk/2011/04/07/%E2%80%9Cfast-is-a-feature%E2%80%9D/"&gt;Fast is a feature&lt;/a&gt;, and affects everything from &lt;a href="http://blog.tagman.com/2012/03/just-one-second-delay-in-page-load-can-cause-7-loss-in-customer-conversions/"&gt;conversion rates&lt;/a&gt; to your site’s &lt;a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html"&gt;search ranking&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first step in performance tuning is getting visibility into the app’s web performance in production. For this, we turn to the app’s logs.&lt;/p&gt;

&lt;h2&gt;Logs as data&lt;/h2&gt;

&lt;p&gt;There are many ways to collect metrics, the most common being direct instrumentation into the app. &lt;a href="https://addons.heroku.com/newrelic"&gt;New Relic&lt;/a&gt;, &lt;a href="https://addons.heroku.com/librato"&gt;Librato&lt;/a&gt;, and &lt;a href="https://addons.heroku.com/hostedgraphite"&gt;Hosted Graphite&lt;/a&gt; are cloud services that use this approach, and there are numerous roll-your-own options like &lt;a href="http://codeascraft.etsy.com/2011/02/15/measure-anything-measure-everything/"&gt;StatsD&lt;/a&gt; and &lt;a href="http://metrics.codahale.com/"&gt;Metrics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another approach is to send metrics to the logs. Beginning with the idea that &lt;a href="http://www.12factor.net/logs"&gt;logs are event streams&lt;/a&gt;, we can use logs for a holistic view of the app: your code, and the infrastructure that surrounds it (such as the Heroku router). Mark McGranaghan’s &lt;a href="http://blip.tv/clojure/mark-mcgranaghan-logs-as-data-5953857"&gt;Logs as Data&lt;/a&gt; and Ryan Daigle’s &lt;a href="http://www.miyagijournal.com/articles/five-steps-application-logging/"&gt;5 Steps to Better Application Logging&lt;/a&gt; offer an overview of the logs-as-data approach.&lt;/p&gt;

&lt;p&gt;Put simply, logs as data means writing semi-structured data to your app&amp;#39;s logs via STDOUT. Then the logs can be consumed by one or more services to do dashboards, long-term trending, and threshold alerting.&lt;/p&gt;

&lt;p&gt;The benefits of logs-as-data over direct instrumentation include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No additional library dependencies for your app&lt;/li&gt;
&lt;li&gt;No CPU cost to your dyno by in-app instrumentation&lt;/li&gt;
&lt;li&gt;Introspection capability by reading the logs directly&lt;/li&gt;
&lt;li&gt;Metrics backends can be swapped out without changes to app code&lt;/li&gt;
&lt;li&gt;Possible to split the log stream and send it to multiple backends, for different views and alerting on the same data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Introducing log2viz, a public experiment&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://log2viz.herokuapp.com/"&gt;log2viz&lt;/a&gt; is an open-source demonstration of the logs-as-data concept for Heroku apps. Log in and select one of your apps to see a live-updating dashboard of its web activity.&lt;/p&gt;

&lt;p&gt;For example, here’s a screenshot of log2viz running against the &lt;a href="https://github.com/rubygems/bundler-api"&gt;Rubygems Bundler API&lt;/a&gt; (written and maintained by Terence Lee, André Arko, and Larry Marburger, and running on Heroku):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://log2viz.herokuapp.com/"&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/0z1b262t2p1Z0l1B2e0c/Image%202013.03.19%2011:41:08%20AM.png" alt="" style="max-width: 100%" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;log2viz gets all of its data from the Heroku log stream — the same data you see when running &lt;code&gt;heroku logs --tail&lt;/code&gt; at the command line. It requires no changes to your app code and works for apps written in any language and web framework, demonstrating some of the benefits of logs as data.&lt;/p&gt;

&lt;h2&gt;Also introducing: log-runtime-metrics&lt;/h2&gt;

&lt;p&gt;In order to get memory use stats for your dynos, we’ve added a new experimental feature to &lt;a href="https://devcenter.heroku.com/articles/labs"&gt;Heroku Labs&lt;/a&gt; to log CPU and memory use by the dyno: &lt;a href="https://devcenter.heroku.com/articles/log-runtime-metrics"&gt;&lt;code&gt;log-runtime-metrics&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To enable this for your app (and see memory stats in log2viz), type the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ heroku labs:enable log-runtime-metrics -a myapp
$ heroku restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This inserts data into your logs like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;heroku[web.1]: measure=load_avg_5m val=0.0
heroku[web.1]: measure=memory_total val=209.64 units=MB
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;log2viz reads these stats and displays average and max memory use across your dynos. (Like all Labs features, this is experimental and the format may change in the future.)&lt;/p&gt;

&lt;h2&gt;Looking under the hood&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/heroku/log2viz"&gt;log2viz is open source.&lt;/a&gt; Let’s look at the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It uses &lt;a href="https://github.com/heroku/heroku-bouncer"&gt;OAuth via &lt;code&gt;heroku-bouncer&lt;/code&gt;&lt;/a&gt; to connect to your Heroku account and &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/app.rb#L57"&gt;make API calls&lt;/a&gt; to access information about your apps.&lt;/li&gt;
&lt;li&gt;It &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/app.rb#L82"&gt;reads from your app&amp;#39;s log stream&lt;/a&gt;. This is the same &lt;a href="https://github.com/heroku/heroku.rb/blob/master/lib/heroku/api/logs.rb"&gt;API endpoint that the Heroku CLI connects to&lt;/a&gt; when you run &lt;code&gt;heroku logs --tail&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It&amp;#39;s written in Ruby and uses the &lt;a href="http://www.sinatrarb.com/contrib/streaming.html"&gt;Sinatra streaming API&lt;/a&gt; (an EventMachine implementation of &lt;a href="http://en.wikipedia.org/wiki/Server-sent_events"&gt;Server-sent Events&lt;/a&gt;) to handle both the &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/app.rb#L88"&gt;incoming log data&lt;/a&gt; and &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/app.rb#L126"&gt;outgoing live updates&lt;/a&gt; to the user&amp;#39;s browser.&lt;/li&gt;
&lt;li&gt;It uses the Heroku API when you connect to the page to &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/app.rb#L63-L70"&gt;fetch the app&amp;#39;s name and number of web dynos&lt;/a&gt;. It takes a hint for concurrency per dyno based on the &lt;code&gt;WEB_CONCURRENCY&lt;/code&gt; config var.&lt;/li&gt;
&lt;li&gt;All of the metrics are derived from 60 seconds of data, &lt;a href="https://github.com/heroku/log2viz/blob/4e09fb7bbed831a8c1f1a095c1bbc31778ec2cf2/public/app.js"&gt;stored in-memory in the user’s browser&lt;/a&gt;. (Storing historical data would enable trend analysis, but we chose to leave that out of scope for this experiment.)&lt;/li&gt;
&lt;li&gt;log2viz only subscribes to the app’s logs while the page is open in your browser. Closing the window also closes the log connection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can &lt;a href="https://github.com/heroku/log2viz#running-on-heroku"&gt;deploy your own copy of log2viz on Heroku&lt;/a&gt;, so fork away! For example, Heroku customer &lt;a href="http://timehop.com/"&gt;Timehop&lt;/a&gt; has &lt;a href="https://github.com/heroku/log2viz/pull/11"&gt;experimented with trending graphs&lt;/a&gt; via &lt;a href="http://code.shutterstock.com/rickshaw/"&gt;Rickshaw&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Logs-as-data add-ons&lt;/h2&gt;

&lt;p&gt;log2viz isn&amp;#39;t the only way to take advantage of your log stream for visibility on Heroku today. Here are a few add-ons which consume your app&amp;#39;s logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://addons.heroku.com/loggly"&gt;Loggly&lt;/a&gt; offers a web console that lets you search your log history, and graph event types over time. For example, let’s search for status=404, logged by the Heroku router whenever your app serves a page not found:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/2L1u093x3t1A2l3W1e3a/Image%202013.03.19%2011:43:30%20AM.png" alt="" style="max-width:100%" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://addons.heroku.com/papertrail"&gt;Papertrail&lt;/a&gt; offers search archival and history, and can also alert on events when they pass a certain threshold. Here’s how you can set up an email alert every time your app experiences more than 10 H12 errors in a 60 second period. Search for the router log line:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/3g341B1b1X463E2F2n1y/Image%202013.03.19%2011:44:14%20AM.png" alt="" style="max-width:100%" /&gt;&lt;/p&gt;

&lt;p&gt;Click “Save Search,” then:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/290B3V0j2b3g2h1K2K0m/Image%202013.03.19%2011:44:52%20AM.png" alt="" style="max-width:100%" /&gt;&lt;/p&gt;

&lt;p&gt;Other add-ons that consume logs include &lt;a href="https://addons.heroku.com/treasure-data"&gt;Treasure Data&lt;/a&gt; and &lt;a href="https://addons.heroku.com/logentries"&gt;Logentries&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also use non-add-on cloud services, as shown in &lt;a href="http://robots.thoughtbot.com/post/43803022282/how-to-splunk-with-heroku"&gt;thoughtbot&amp;#39;s writeup on using Splunk Storm with Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Visibility is a vast and challenging problem space. The logs-as-data approach is still young, and log2viz is just an experiment to get us started. We look forward to your feedback on log2viz, log visibility via add-ons, and your own experiments on performance visibility.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/E8m5SUsbNxI" height="1" width="1"/&gt;</description>
      <author>Adam</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/3/19/log2viz</feedburner:origLink></item>
    <item>
      <title>Running Rails on Heroku Update</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/UhFbpETudlM/running_rails_on_heroku_update</link>
      <pubDate>Wed, 13 Mar 2013 21:11:12 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/3/13/running_rails_on_heroku_update</guid>
      <description>&lt;p&gt;On February 16th, we published a &lt;a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update"&gt;blog post&lt;/a&gt; outlining five specific and immediate actions we would take to improve our Rails customers&amp;#39; experience with Heroku. We want to provide you with an update on where these things stand. As a reminder, here’s what we committed to do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improve our documentation so that it accurately reflects how our service works across both Bamboo and Cedar stacks&lt;/li&gt;
&lt;li&gt;Remove incorrect and confusing metrics reported by Heroku or partner services like New Relic&lt;/li&gt;
&lt;li&gt;Add metrics that let customers determine queuing impact on application response times&lt;/li&gt;
&lt;li&gt;Provide additional tools that developers can use to augment our latency and queuing metrics&lt;/li&gt;
&lt;li&gt;Work to better support concurrent-request Rails apps on Cedar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We have resolved the first two items:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improving Documentation&lt;/strong&gt;: We’ve updated our Dev Center docs and website to more accurately describe how routing occurs on Heroku (e.g., &lt;a href="https://devcenter.heroku.com/articles/http-routing-bamboo"&gt;HTTP Routing on Bamboo&lt;/a&gt; and &lt;a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update#how_bamboo"&gt;How Routing Works on the Bamboo Stack&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Removing Incorrect Metrics&lt;/strong&gt;: We’ve worked with New Relic to release an updated version of their monitoring tools, which we documented in &lt;a href="https://blog.heroku.com/archives/2013/2/21/better_queuing_metrics_with_updated_new_relic_add_on"&gt;Better Queuing Metrics With Updated New Relic Add-on&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We are working on the remaining three items in partnership with our early beta users:&lt;/p&gt;

&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;Adding New Metrics&lt;/strong&gt;: We are improving the data available through our &lt;a href="https://devcenter.heroku.com/articles/logging"&gt;logs&lt;/a&gt; in two ways. First, we’re adding a transaction ID to every request log. Second, we are working on application middleware to provide additional metrics in customer logs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Providing Additional Measurement Tools&lt;/strong&gt;: We have created a data visualization tool that analyzes log data in real-time and helps observe an app’s performance across a few key Heroku-specific metrics. This tool is currently being beta tested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improving Cedar Support&lt;/strong&gt;: &lt;a href="https://blog.heroku.com/archives/2013/2/27/unicorn_rails"&gt;Unicorn&lt;/a&gt; is now the recommended Rails app server. We are currently beta testing larger dynos to support additional unicorn processes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fulfilling these commitments is Heroku’s number one priority. We have dedicated engineering and product teams focused on improving the performance of Rails apps on Heroku.&lt;/p&gt;

&lt;p&gt;We’ll detail the availability of our improvements in future blog posts. If you would like to beta test any of these new features, please &lt;a href="mailto:rails-beta@heroku.com"&gt;drop us a note&lt;/a&gt; and let us know which features you are interested in testing.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/UhFbpETudlM" height="1" width="1"/&gt;</description>
      <author>Oren</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/3/13/running_rails_on_heroku_update</feedburner:origLink></item>
    <item>
      <title>Jacob Kaplan-Moss, Django Co-Creator, Talks Ecosystems at Heroku's Waza</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/rb7ktlcdRKA/jacob_kaplan_moss_on_creating_ecosystems</link>
      <pubDate>Sat, 09 Mar 2013 19:36:15 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/3/9/jacob_kaplan_moss_on_creating_ecosystems</guid>
      <description>&lt;p&gt;The value of a network is proportional to the square of the number of users connected to the system, according to Metcalfe’s law. &lt;a href="http://twitter.com/jacobian"&gt;Jacob Kaplan-Moss&lt;/a&gt;, co-creator of &lt;a href="http://www.djangoprojects.com"&gt;Django&lt;/a&gt;, highlights this as a value in creating communities or as he puts it, “ecosystems”. In his talk at &lt;a href="https://waza.heroku.com"&gt;Waza&lt;/a&gt; last week on building ecosystems, he went on to highlight three key principles of creating ecosystems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;APIs to support extensibility&lt;/li&gt;
&lt;li&gt;Conservatism as a value&lt;/li&gt;
&lt;li&gt;Empowering the community&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whether building a platform or a framework, these key principles ring true. Check out his talk or read more on creating ecosystems below:&lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/61059530?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=a086ee" width="100%" height="381" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;h3&gt;APIs to support extensibility&lt;/h3&gt;

&lt;p&gt;You don’t choose to become an ecosystem, but you can choose to do the groundwork. By defining APIs you enable others to build on the foundation you lay. Django core member Russ Keith-McGee summed this up quite clearly on the Django mailing list – &lt;a href="https://groups.google.com/d/msg/django-developers/7CnhbABp9dI/6atOKsSK7tEJ"&gt;&amp;quot;I’m not sure if this is appropriate, but it should be possible. If its not possible we should build the APIs to support it.&amp;quot;&lt;/a&gt; This sentiment is at the core of building ecosystems.&lt;/p&gt;

&lt;p&gt;Django succeeded at this with its apps API, and has a &lt;a href="https://www.djangopackages.com/"&gt;full directory in Django Packages&lt;/a&gt; to help others discover what has already been built. At Heroku we’re seeing the same phenomon with our &lt;a href="https://devcenter.heroku.com/articles/buildpack-api"&gt;buildpacks API&lt;/a&gt; resulting in numerous &lt;a href="https://devcenter.heroku.com/articles/third-party-buildpacks"&gt;third-party buildpacks&lt;/a&gt;. By building APIs and empowering users, you solve more problems.&lt;/p&gt;

&lt;h3&gt;Conservatism as a value&lt;/h3&gt;

&lt;p&gt;There’s great value in the “move fast and break stuff” concept. However, creating explicit APIs and contracts that are stable is critical for an ecosystem to thrive longer term. For Django as a framework this means being slow moving and reliable when it comes to modifying any APIs in the core framework. For Heroku as a platform it means a dedication to &lt;a href="https://blog.heroku.com/archives/2011/6/28/the_new_heroku_4_erosion_resistance_explicit_contracts"&gt;erosion resistance&lt;/a&gt;. Jacob cleanly highlights this by pointing out that “Interoperabilty only works when the common parts don’t change.” &lt;/p&gt;

&lt;h3&gt;Empowering the community&lt;/h3&gt;

&lt;p&gt;Ecosystems create ways for the community to engage and contribute. With an ecosystem there’s even additional ways in which users can contribute and those contributions don’t have to be code. When a project first starts, it’s creator tests it and consumes it acting as developer and QA. As it gains popularity a project may attract new developers, then more users, who submit their own bug reports and issues. These newcomers contribute documentation patches, triage tickets, and recruit others to help with the project. Where once a single developer committed quietly, now a thriving ecosystem of contributors and consumers exists. &lt;/p&gt;

&lt;p&gt;This change from product to ecosystem doesn’t happen overnight, it must be nurtured and nudged. Kaplan-Moss, a self-proclaimed “documentation nut” has done just that by cultivating a better understanding of Django through documentation and carefully working with patch and issue submitters. Jacob explains that if you document your process, you can increase transparency and understanding of the way things work. Django does this by clearly documenting how users can &lt;a href="https://docs.djangoproject.com/en/dev/internals/contributing/"&gt;contribute back to Django&lt;/a&gt;; at Heroku we’ve done this by &lt;a href="http://12factor.net/"&gt;documenting our methodology&lt;/a&gt; on how apps should be built.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Building a great product isn’t enough, as Jacob points out: you’ve got to create a vibrant community and build an ecosystem. If it wasn’t for Django’s community there wouldn’t be over 3500 Python packages for Django. If it wasn’t for our community, you wouldn’t be able to deploy &lt;a href="https://github.com/kr/heroku-buildpack-go"&gt;Go&lt;/a&gt;, &lt;a href="https://github.com/mtravers/heroku-buildpack-cl"&gt;common lisp&lt;/a&gt;, or &lt;a href="https://github.com/cirlabs/heroku-buildpack-geodjango"&gt;GeoDjango&lt;/a&gt; to Heroku with just one command. &lt;/p&gt;

&lt;p&gt;Learn more about ecosystems by listening to &lt;a href="https://vimeo.com/61059530"&gt;Jacob’s talk&lt;/a&gt;, check out &lt;a href="https://vimeo.com/groups/waza2013"&gt;other talks from Waza available now&lt;/a&gt;, or engage with the ecosystem of your choice today.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/rb7ktlcdRKA" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/3/9/jacob_kaplan_moss_on_creating_ecosystems</feedburner:origLink></item>
    <item>
      <title>Matz on Ruby 2.0 at Heroku's Waza</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/vzfD5dX2n5A/matz_highlights_ruby_2_0_at_waza</link>
      <pubDate>Wed, 06 Mar 2013 22:53:28 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.heroku.com/archives/2011/7/12/matz_joins_heroku"&gt;Matz&lt;/a&gt;, the creator of Ruby, spoke at &lt;a href="http://waza.heroku.com"&gt;Waza&lt;/a&gt; for the 20th anniversary of the language and the release of &lt;a href="https://devcenter.heroku.com/changelog-items/209"&gt;Ruby 2.0&lt;/a&gt;. If you weren&amp;#39;t in the sold out crowd, not to worry. Information should flow free and experiences should be shared; in line with those concepts you can watch Matz&amp;#39;s talk right here, then read about what&amp;#39;s new in this version of Ruby and how to run it on Heroku.&lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/61043050" width="100%" height="381" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;em&gt;With slides available on &lt;a href="https://speakerdeck.com/yukihiro_matz/ruby-2-dot-0-en"&gt;speakerdeck&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keep reading for more information on Ruby 2.0 or check out our first batch of &lt;a href="https://vimeo.com/groups/waza2013"&gt;videos from Waza 2013&lt;/a&gt;. To stay up to date as we post new videos, follow us &lt;a href="http://twitter.com/heroku"&gt;@heroku&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;Compatibility&lt;/h2&gt;

&lt;p&gt;Iterating quickly means happier developers and happier customers. We optimize our platform to allow you to develop, stage, and deploy faster. Not only does this make running software easier, but it makes trying new technologies like Ruby 2.0 as simple as spinning up a new app. During Matz&amp;#39;s talk at Waza, he mentioned that, while 1.9.3 is popular now, it took years after 1.8.7 was released to gain traction. With the release of Ruby 2.0 Matz hopes to reduce upgrading barriers and allow developers to iterate quicker using newer, faster and better tools. &lt;/p&gt;

&lt;p&gt;Ruby 2.0 was written to be backwards compatible and it &lt;a href="https://twitter.com/tenderlove/status/264043676358045696"&gt;works with Rails 3.2.13&lt;/a&gt; out of the box. If your Ruby apps are running using 1.8.7, you should upgrade. Ruby 1.8.7 is approaching End of Life (EOL) in three months on June 2013. EOL for Ruby 1.8.7 means no security or bug patches will be provided by the maintainers. Not upgrading means you&amp;#39;re potentially opening up your application and your users to vulnerabilities. Don&amp;#39;t wait till the final hour, upgrade now to be confident and secure.&lt;/p&gt;

&lt;h2&gt;Speed&lt;/h2&gt;

&lt;p&gt;Ruby 2.0 has a faster garbage collector and is &lt;a href="http://en.wikipedia.org/wiki/Copy-on-write"&gt;Copy on Write&lt;/a&gt; friendly. Copy on Write or COW is an optimization that can reduce the memory footprint of a Ruby process when it is copied.  Instead of allocating duplicate memory when a process is forked, COW allows multiple processes to share the same memory until one of the processes needs to modify a piece of information. Depending on the program, this optimization can dramatically reduce the amount of memory used to run multiple processes. Most Ruby programs are memory bound, so reducing your memory footprint with Ruby 2.0 may allow you to run more processes in fewer dynos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’re not already running a concurrent backend consider trying the &lt;a href="https://blog.heroku.com/archives/2013/2/27/unicorn_rails"&gt;Unicorn web server&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Features&lt;/h2&gt;

&lt;p&gt;In addition to running faster than 1.9.3, and having a smaller footprint, Ruby 2.0 has a number of new features added to the language including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dev.af83.com/2013/02/18/ruby-2-0-keyword-arguments.html"&gt;Keyword arguments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kernel#require optimization which makes Rails startup very fast&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Copy-on-write"&gt;Copy on write&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/DTrace"&gt;Dtrace&lt;/a&gt; support&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html"&gt;Module#prepend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-doc.org/core-2.0/Enumerable.html#method-i-lazy"&gt;Enumerable#lazy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;__dir__&lt;/code&gt; to get the current directory of &lt;code&gt;__FILE__&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UTF-8 is now the default encoding&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/"&gt;Much, much more&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list of new features is more than we can cover here. If you really wanted to dig in you can check the &lt;a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/#label-2"&gt;Ruby changelog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Running 2.0 on Heroku&lt;/h2&gt;

&lt;p&gt;If you’re interested in taking advantage of these new features give it a try on Heroku today. To &lt;a href="https://devcenter.heroku.com/articles/ruby-versions"&gt;run Ruby 2.0 on Heroku&lt;/a&gt; you&amp;#39;ll need this line in your &lt;code&gt;Gemfile&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ruby &amp;quot;2.0.0&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then commit to git:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git add .
$ git commit -m &amp;quot;Using Ruby 2.0 in production&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We recommend that you test your app using 2.0 locally and deploy to a staging app before pushing to production. Now when you &lt;code&gt;$ git push heroku master&lt;/code&gt; our &lt;a href="https://github.com/heroku/heroku-buildpack-ruby/"&gt;Ruby buildpack&lt;/a&gt; will see that you&amp;#39;ve declared your Ruby version and make sure you get the right one.&lt;/p&gt;

&lt;h2&gt;20 years of simplicity, elegance, and programmer happiness&lt;/h2&gt;

&lt;p&gt;Heroku, since its founding, has been aligned with the key values of Ruby – simplicity, elegance, and programmer happiness. Heroku still believes in the power and flexibility of Ruby, and we&amp;#39;ve invested in the language by hiring &lt;a href="https://twitter.com/yukihiro_matz"&gt;Yukihiro &amp;quot;Matz&amp;quot; Matsumoto&lt;/a&gt;, &lt;a href="https://twitter.com/_ko1"&gt;Koichi Sasada&lt;/a&gt; and &lt;a href="https://twitter.com/n0kada"&gt;Nobuyoshi Nakada&lt;/a&gt;. We would like to thank them and the whole Ruby core team for making this release happen. Join us in celebrating Ruby&amp;#39;s successes and in looking forward to the next twenty years by trying Ruby 2.0 on Heroku today.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/vzfD5dX2n5A" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/3/6/matz_highlights_ruby_2_0_at_waza</feedburner:origLink></item>
    <item>
      <title>Idea to Delivery: Application Development in the Modern Age. Adam Wiggins at Waza 2012 [video] </title>
      <link>http://feedproxy.google.com/~r/heroku/~3/V_IGlGptLhM/idea_to_delivery</link>
      <pubDate>Wed, 27 Feb 2013 23:05:55 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/27/idea_to_delivery</guid>
      <description>&lt;p&gt;Great coders know their technology intimately. And they know how to choose it. Truly awesome application developers know more. They know the human side of technology. They know technique. They focus on their method—their practice. &lt;/p&gt;

&lt;p&gt;In 2000 Heroku co-founder and CTO Adam Wiggins saw this more clearly than ever before. He read The &lt;a href="http://pragprog.com/book/tpp/the-pragmatic-programmer"&gt;Pragmatic Programmer&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/Andy_Hunt_(author)"&gt;Andy Hunt&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Dave_Thomas_(programmer)"&gt;Dave Thomas&lt;/a&gt;. The book, as Adam explains in this thought-provoking (and method-shifting) Waza talk, showed him that his work could not only be about technology. It HAD to be about technique. &lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/49701839" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;Heroku Co-founder, CTO and general badass, Adam Wiggins&lt;/p&gt;

&lt;p&gt;Adam discusses techniques—historical ones such as agile development and the power of rapid and flexible response to change; frameworks which helped drive speed by allowing developers to focus on the specifics of their application without having to reinvent basic wheels of, say, state management and request handling; the cloud which removed a huge burden of selecting, purchasing and maintaining hardware; and Software as a Service (SaaS), which, in addition to providing incredible benefit to end-users has created a development culture of continual, rapid improvement.&lt;/p&gt;

&lt;p&gt;Technique means a lot. How we think about and describe what we do means a great deal too. Adam makes a strong point when he compares thinking and describing ourselves as programmers vs. application developers.  Application developers, Adam says, think more broadly. They think about the end-to-end process of developing and deploying an application. 
 vs. &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/3A140T2g0B1K2f2w2L09/Screenshot_2_25_13_11_07_AM.png" style="width:280px;border:0px;"&gt; vs. &lt;img src="https://s3.amazonaws.com/f.cl.ly/items/2R1t1u1A441u3d0s2F0S/Screenshot_2_25_13_11_08_AM.png" style="width:280px;border:0px;"&gt;&lt;/p&gt;

&lt;p&gt;By taking ownership of thinking across the full spectrum from idea to delivery, application developers play a far more strategic role in their app—and their company’s—growth and success. Developers who think and work like this are truly “&lt;a href="http://redmonk.com/sogrady/2013/01/09/the-new-kingmakers-the-book/"&gt;the new kingmakers&lt;/a&gt;” and a “powerful force to be reckoned with.”&lt;/p&gt;

&lt;p&gt;Adam shares newer, even more powerful techniques that will help a developer who wants to think more broadly, act more strategically, and increase efficiency in her or his organization. Adam also discusses a number of these in &lt;a href="http://12factor.net/"&gt;The Twelve-Factor App&lt;/a&gt;: &lt;/p&gt;

&lt;h3&gt;Deploying from Day One and Continuous Development/Deployment&lt;/h3&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/130R1T470K3c2I0E0H18/codebase-deploys.png" style="border:0px;width:200px;"&gt;&lt;/p&gt;

&lt;p&gt;Having one (version controlled) &lt;a href="http://12factor.net/codebase"&gt;codebase&lt;/a&gt; that is deployed in various states of completion across several instances from a live production app/site to development environments of different employees’ machines means we can all move faster and we can all stay in tune with one another. It means we can be deploying from day one and we can rapidly improve our products via continuous development and deployment.&lt;/p&gt;

&lt;h3&gt;Development and Production Parity: Keeping development, staging, and production as similar as possible&lt;/h3&gt;

&lt;p&gt;Historically, there have been substantial gaps between development (a developer making live edits to a local deploy of the app) and production (a running deploy of the app accessed by end users). These gaps, as Adam discussed at Waza and at The &lt;a href="http://12factor.net/dev-prod-parity"&gt;Twelve-Factor App&lt;/a&gt; manifest in three areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The time gap: A developer may work on code that takes days, weeks, or even months to go into production.&lt;/li&gt;
&lt;li&gt;The personnel gap: Developers write code, ops engineers deploy it.&lt;/li&gt;
&lt;li&gt;The tools gap: Developers may be using a stack like Nginx, SQLite, and OS X, while the production deploy uses Apache, MySQL, and Linux.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Staying Close to Production&lt;/h3&gt;

&lt;p&gt;As we&amp;#39;ve come to appreciate agile development techniques and put such a sharp focus on shipping features, minimizing each of these gaps allows developers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the time gap small: a developer may write code and have it deployed hours or even just minutes later.&lt;/li&gt;
&lt;li&gt;Make the personnel gap small: developers who wrote code are closely involved in deploying it and watching its behavior in production.&lt;/li&gt;
&lt;li&gt;Make the tools gap small: keep development and production as similar as possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;We have come along way since The Pragmatic Programer. But it remains highly influential and set much of the tone for the many pragmatic developments in technique and practice that have come to the fore in recent years. You could say that Adam reading The Pragmatic Programmer back in 2000 is one of the reasons we invite developers to come together for Waza, &lt;a href="http://waza.heroku.com"&gt;which happens tomorrow&lt;/a&gt;. And one of the reasons we share the talks freely online for those who cannot make it. Waza is all about technique, about personal improvement for developers, about, as the subtitle of The Pragmatic Programmer says, the journey from journeyman to master.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/V_IGlGptLhM" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/27/idea_to_delivery</feedburner:origLink></item>
    <item>
      <title>Adding Concurrency to Rails Apps with Unicorn</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/dL9JVuuTjIQ/unicorn_rails</link>
      <pubDate>Wed, 27 Feb 2013 03:35:10 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/27/unicorn_rails</guid>
      <description>&lt;p&gt;With support for Node.js, Java, Scala and other multi-threaded languages, Heroku allows you to take full advantage of concurrent request processing and get more performance out of each dyno. Ruby should be no exception.&lt;/p&gt;

&lt;p&gt;If you are running Ruby on Rails with Thin, or another single-threaded server, you may be seeing bottlenecks in your application. These servers only process one request at a time and can cause unnecessary queuing. Instead, you can improve performance by choosing a concurrent server such as &lt;a href="http://unicorn.bogomips.org/"&gt;Unicorn&lt;/a&gt; which will make your app faster and make better use of your system resources. In this article we will explore how Unicorn works, how it gives you more processing power, and how to run it on Heroku.&lt;/p&gt;

&lt;h2&gt;Concurrency and Forking&lt;/h2&gt;

&lt;p&gt;At the core of Heroku is the &lt;a href="http://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix Philosophy&lt;/a&gt;, and we see this philosphy at work in Unicorn. Unicorn uses the Unix concept of &lt;a href="http://bit.ly/st2m"&gt;forking&lt;/a&gt;  to give you more concurrency.&lt;/p&gt;

&lt;p&gt;Process forking is a critical component of Unix&amp;#39;s design. When a process forks it creates a copy of itself. Unicorn forks multiple OS processes within each dyno to allow a Rails app to support multiple concurrent requests without requiring them to be thread-safe. This means that even if your app is only designed to handle one request at a time, with Unicorn you can handle concurrent connections.&lt;/p&gt;

&lt;p&gt;Unicorn leverages the operating system to do most of the heavy lifting when creating and maintaining these forks. Unix-based systems are extremely efficient at forking, and even take advantage of &lt;a href="http://en.wikipedia.org/wiki/Copy-on-write"&gt;Copy on Write&lt;/a&gt; optimizations that are similar to those in the recently released &lt;a href="https://devcenter.heroku.com/changelog-items/209"&gt;Ruby 2.0&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Unicorn on Rails&lt;/h2&gt;

&lt;p&gt;By running Unicorn in production, you can significantly increase throughput per dyno and avoid or reduce queuing when your app is under load. Unicorn can be difficult to setup and configure, so we’ve provided &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;configuration documentation&lt;/a&gt; to make it easier to get started.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s set up a Rails app to use Unicorn.&lt;/p&gt;

&lt;h2&gt;Setting up Unicorn&lt;/h2&gt;

&lt;p&gt;First, add Unicorn to your application &lt;code&gt;Gemfile&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem &amp;#39;unicorn&amp;#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run &lt;code&gt;$ bundle install&lt;/code&gt;, now you are ready to configure your app to use Unicorn.&lt;/p&gt;

&lt;p&gt;Create a configuration file for Unicorn at &lt;code&gt;config/unicorn.rb&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ touch config/unicorn.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we&amp;#39;re going to add Unicorn-specific configuration options, that we explain in detail in &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;Heroku&amp;#39;s Unicorn documentation&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# config/unicorn.rb
worker_processes 3
timeout 30
preload_app true

before_fork do |server, worker|

  Signal.trap &amp;#39;TERM&amp;#39; do
    puts &amp;#39;Unicorn master intercepting TERM and sending myself QUIT instead&amp;#39;
    Process.kill &amp;#39;QUIT&amp;#39;, Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap &amp;#39;TERM&amp;#39; do
    puts &amp;#39;Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT&amp;#39;
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This default configuration assumes a standard Rails app with Active Record, see &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;Heroku&amp;#39;s Unicorn documentation&lt;/a&gt; for more information. You should also get acquainted with the different options in &lt;a href="http://unicorn.bogomips.org/Unicorn/Configurator.html"&gt;the official Unicorn documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now that we&amp;#39;ve got your app setup to use Unicorn, you’ll need to tell Heroku how to run it in production.&lt;/p&gt;

&lt;h3&gt;Unicorn in your Procfile&lt;/h3&gt;

&lt;p&gt;Change the web command in your &lt;code&gt;Procfile&lt;/code&gt; to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now try running your server locally with &lt;code&gt;$ foreman start&lt;/code&gt;. Once you&amp;#39;re happy with your changes, commit to git, deploy to staging, and when you&amp;#39;re ready deploy to production.&lt;/p&gt;

&lt;h3&gt;A World of Concurrency&lt;/h3&gt;

&lt;p&gt;With the recent release of the &lt;a href="https://devcenter.heroku.com/articles/rails4"&gt;Rails 4 beta&lt;/a&gt;, which is threadsafe by default, it&amp;#39;s becoming increasingly clear that Rubyists care about concurrency.&lt;/p&gt;

&lt;p&gt;Unicorn gives us the ability to take multiple requests at a time, but it is by no means the only option when it comes to concurrent Rack servers. Another popular alternative is &lt;a href="http://puma.io/"&gt;Puma&lt;/a&gt; which uses threads instead of forking processes. Puma does however require that your code is &lt;a href="http://en.wikipedia.org/wiki/Thread_safety"&gt;threadsafe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;ve never run a concurrent server in production, we encourage you to spend some time exploring the ecosystem. After all no one knows your app&amp;#39;s requirements better than you.&lt;/p&gt;

&lt;p&gt;Whatever you do don&amp;#39;t settle for one request at a time. Demand  performance, demand concurrency, and &lt;a href="https://devcenter.heroku.com/articles/rails-unicorn"&gt;try Unicorn today&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/dL9JVuuTjIQ" height="1" width="1"/&gt;</description>
      <author>Richard</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/27/unicorn_rails</feedburner:origLink></item>
    <item>
      <title>Concurrency is not Parallelism. Rob Pike at Waza 2012 [video]</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/Sbpfqhikirs/concurrency_is_not_parallelism</link>
      <pubDate>Sun, 24 Feb 2013 20:11:50 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/24/concurrency_is_not_parallelism</guid>
      <description>&lt;p&gt;&lt;em&gt;In planning Waza 2013 we went back to reflect on last year’s speakers.  And we want to make the talks readily availble to anybody who could not make it last year—or who wants a refresher. Check back soon for more talks from Waza 2012. And we hope to see you in person at &lt;a href="https://waza.heroku.com/register"&gt;Waza 2013&lt;/a&gt; coming up FAST on Feb. 28 in San Francisco.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In a world of evolving languages, frameworks and development patterns, we developers must continually improve our craft. Innovative developers already have jumped on board many of these shifts. We’ve seen this with the adoption of more agile frameworks (such as Rails, Django, and Play). We’ve seen it too with a shift towards asynchronous programming patterns such as in Node.js and with evented programming in Rails. &lt;/p&gt;

&lt;p&gt;One clear example of this evolution is the re-emergence of a focus on concurrency.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://research.google.com/pubs/r.html"&gt;Rob Pike&lt;/a&gt;—with the help of a few gophers—gave this fantastic educational talk on concurrency at last year’s Heroku waza conference. Rob covered big themes that are important to developers—speed, efficiency and productivity. And he covered parallelism and concurrency in programming processes—making it very clear that they are not the same thing. If you want to click through Rob’s slides while watching, they are hosted at &lt;a href="http://concur.rspace.googlecode.com/hg/talk/concur.html#landing-slide"&gt;GoogleCode&lt;/a&gt;.&lt;/p&gt;

&lt;iframe src="https://player.vimeo.com/video/49718712?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=a086ee" width="100%" height="381" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt; 

&lt;p&gt;Rob (&lt;a href="http://twitter.com/rob_pike"&gt;@rob_pike&lt;/a&gt;) is a software pioneer. His influence is everywhere: Unix, Plan 9 OS, The Unix Programming Environment book, UTF-8, and most recently the &lt;a href="http://golang.org/"&gt;Go programming language&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Waza is the Japanese word for art and technique and it&amp;#39;s where we celebrate craft and the creative process of software development with &lt;a href="https://blog.heroku.com/archives/2013/1/29/waza_2013_keynote_speakers/"&gt;technical sessions&lt;/a&gt; and &lt;a href="https://blog.heroku.com/archives/2013/2/20/waza-2013-happening/"&gt;interactive artistic happenings&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/f.cl.ly/items/2P342k1r120P2A273i0T/Screenshot_2_23_13_8_40_AM.png" style="border:0px"/&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/Sbpfqhikirs" height="1" width="1"/&gt;</description>
      <author>Craig</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/24/concurrency_is_not_parallelism</feedburner:origLink></item>
    <item>
      <title>Better Queuing Metrics With Updated New Relic Add-On</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/x6GeGANWktw/better_queuing_metrics_with_updated_new_relic_add_on</link>
      <pubDate>Thu, 21 Feb 2013 14:00:28 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/21/better_queuing_metrics_with_updated_new_relic_add_on</guid>
      <description>&lt;p&gt;Today our partner, &lt;a href="https://addons.heroku.com/newrelic"&gt;New Relic&lt;/a&gt;, &lt;a href="http://blog.newrelic.com/2013/02/21/using-new-relic-on-heroku-read-how-our-new-ruby-agent-measures-queue-time/"&gt;released an update&lt;/a&gt; to the &lt;a href="https://rubygems.org/gems/newrelic_rpm/versions/3.5.7.59"&gt;Ruby New Relic agent&lt;/a&gt; that addresses &lt;a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update"&gt;issues&lt;/a&gt; brought up by our customers. The new version corrects how New Relic reports performance metrics for applications running on Heroku. Queueing time is now reported as the total time from when a request enters the router until the application starts processing it. Previous versions of New Relic only reported queueing time in the router. The new approach will result in more accurate queueing metrics that allow you to better understand and tune the performance of your application. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update, Feb 22:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New Relic has released a &lt;a href="https://newrelic.com/docs/releases/python"&gt;similar update for Python&lt;/a&gt;. Python developers should update to this latest version to benefit from the improved metrics. JVM language developers do not need to take any action. The current New Relic Java agent already includes the improved queue time metrics.&lt;/p&gt;

&lt;h2&gt;Install or update the New Relic Ruby Add-on&lt;/h2&gt;

&lt;p&gt;If you are already using New Relic with your Ruby apps, then simply update your &lt;code&gt;Gemfile&lt;/code&gt; to reference the new agent version:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem &amp;quot;newrelic_rpm&amp;quot;, &amp;quot;~&amp;gt; 3.5.7.59&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ bundle update newrelic_rpm
$ git add Gemfile Gemfile.lock
$ git commit -m &amp;#39;update new relic agent&amp;#39;
$ git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you are not yet using New Relic, you can learn how to &lt;a href="https://devcenter.heroku.com/articles/newrelic"&gt;install and configure the add-on&lt;/a&gt; on Dev Center.&lt;/p&gt;

&lt;h2&gt;How It Works&lt;/h2&gt;

&lt;p&gt;The updated New Relic agent uses an improved strategy for reporting request queue times on Heroku. Prior to this update, New Relic reported request queue time using a value set by the Heroku routing mesh. This only reflected the time a request spent in the router queue and did not properly include time spent waiting in the dyno’s request queue.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://blog.heroku.com/archives/2013/2/16/routing_performance_update/"&gt;routing performance update&lt;/a&gt; documents our finding that some applications have requests that may spend significant time queued on dynos. To help our customers understand precisely where their applications are being delayed, the updated New Relic agent includes dyno wait time in the total queue time metric. The new queue time is calculated as the difference between the time the Heroku router first gets a request and the time the request begins processing on the dyno. The result is a more accurate picture of how long requests wait in queues.&lt;/p&gt;

&lt;p&gt;&lt;img src="//s3.amazonaws.com/f.cl.ly/items/2Z0l0q0z0F1h330A0u1K/2013-02-20-190455_986x386_scrot.png" width="100%" /&gt;&lt;/p&gt;

&lt;h2&gt;Clock Skew&lt;/h2&gt;

&lt;p&gt;The new version of New Relic calculates queue times using two different clocks — the dyno and router clocks. While Heroku servers &lt;a href="http://www.ntp.org/"&gt;regularly sync their clocks&lt;/a&gt;, it’s common for clocks to drift apart between syncs. This phenomenon is known as clock skew and it can affect the queue time metric collected by New Relic. In our experience, even though clock skew can cause small inaccuracies, the overall trend data displayed by New Relic will still accurately reflect your application’s queue times.&lt;/p&gt;

&lt;h2&gt;How to Learn More&lt;/h2&gt;

&lt;p&gt;If you’d like more information on how to install and configure the New Relic add-on, please see the &lt;a href="https://devcenter.heroku.com/articles/newrelic"&gt;New Relic Dev Center article&lt;/a&gt; and the &lt;a href="https://newrelic.com/docs/ruby/no-data-with-unicorn"&gt;Unicorn specific instructions&lt;/a&gt;. For general suggestions on how to improve the performance of your app, check out our &lt;a href="https://devcenter.heroku.com/articles/performance-overview"&gt;performance overview page&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/x6GeGANWktw" height="1" width="1"/&gt;</description>
      <author>Jesper</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/21/better_queuing_metrics_with_updated_new_relic_add_on</feedburner:origLink></item>
    <item>
      <title>What’s Happening at Waza  </title>
      <link>http://feedproxy.google.com/~r/heroku/~3/QwTcQRgQgk8/waza-2013-happening</link>
      <pubDate>Wed, 20 Feb 2013 16:04:55 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/20/waza-2013-happening</guid>
      <description>&lt;p&gt;&lt;strong&gt;Waza (技) 2013&lt;/strong&gt; is only a week away and the &lt;a href="https://waza.heroku.com/2013/waza-agenda.pdf"&gt;schedule&lt;/a&gt; is packed with amazing &lt;a href="https://waza.heroku.com/2013"&gt;speakers&lt;/a&gt; and hands-on craft experiences. We can’t wait to share this day with all of you. If you haven’t yet, &lt;a href="https://waza.heroku.com/2013"&gt;register now&lt;/a&gt; before it’s too late!&lt;/p&gt;

&lt;p&gt;This year, Waza will have three stages with a total of 20 talks. The rest of the venue is packed with lounges, co-working spaces, snack and beverage stations, and, thanks to our sponsors, all kinds of interactive, craft-based activities to fuel your creative mind.&lt;/p&gt;

&lt;h2&gt;Hands-on Crafts&lt;/h2&gt;

&lt;p&gt;In addition to our great sponsored happenings, we have quilting, dye-making and printmaking artists on hand. Come experience their unique crafts, hands-on and up-close. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quilting and Dye-making&lt;/strong&gt;: Maura Grace Ambrose is bringing her &lt;a href="http://www.folkfibers.com/"&gt;Folk Fibers&lt;/a&gt; all the way from Austin, TX. Maura collects natural materials to dye fabrics then uses them to stitch together special quilts. Join Maura in the hands-on creation of a custom Waza quilt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Printmaking&lt;/strong&gt;: Marissa Marquez joins us at Waza for the second time. Marissa uses woodworking tools to hand-carve original designs into blocks and stamp them onto paper. She has created some beautiful prints for Waza which you can use to print your own postcard, or she can teach you how to make your own.&lt;/p&gt;

&lt;h2&gt;All Things Delicious&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Blue Bottle Coffee&lt;/strong&gt;: We’re a bit obsessed with coffee at Heroku. And it’s an obsession we like to share. Doors open at 10am for badge pickup, show up early and enjoy a cup of pour-over coffee while you get to know some Herokai. But don’t worry, this cup-at-a-time coffee service will be available all day. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tea Lounge&lt;/strong&gt;: We know some people prefer tea, including many of our own staff, so we’ve set aside space for the Waza tea lounge where you’ll find a variety of loose-leaf teas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Food Trucks&lt;/strong&gt;: We will have an assortment of local food trucks offering a selection of lunch specials. Use the ticket on your badge and select your favorite.&lt;/p&gt;

&lt;h2&gt;Don’t Want to Deal with Parking?&lt;/h2&gt;

&lt;p&gt;Secure bike parking will be available thanks to the fine folks at the &lt;strong&gt;&lt;a href="http://www.sfbike.org/"&gt;San Francisco Bicycle Coalition&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;Meet our Sponsors&lt;/h2&gt;

&lt;h4&gt;&lt;a href="http://www.atlassian.com/"&gt;Atlassian&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Well-known for their collaboration tools that help teams build better products, Atlassian is providing Waza with co-working spaces to get the job done.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.dodocase.com/"&gt;DODOcase&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Creating artisan products for technology is the core of DODOcase’s business. Stop by and create your own Waza-branded, hand-bound notepad to take home . &lt;/p&gt;

&lt;h4&gt;&lt;a href="https://github.com/"&gt;Github&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;We all know that Github knows how to throw a great party, so we’re pumped that they are sponsoring the Waza afterparty. The fun starts at 9 p.m., and everyone with a Waza badge is invited. &lt;/p&gt;

&lt;h4&gt;&lt;a href="https://www.mongohq.com/home"&gt;MongoHQ&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;We are pleased to have an origami artist, Linda Mihara as part of the Waza experience. And thanks to MongoHQ for adding rockets to her repertoire. Learn the ancient art of paper folding and make your own shiny silver rocket to take home.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.neo4j.org/"&gt;Neo4j&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Adding an art experience to one of the lounges, Neo4j is bringing an amaizng &lt;a href="http://www.kickstarter.com/projects/fnbrit/zen-table"&gt;Zen Table&lt;/a&gt; to Waza. They’ll also use their superstar graphing skills to monitor and display the event’s Twitter activity.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://site.neonroots.com/"&gt;Neon Roots&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;A full service interactive agency specializing in custom web &amp;amp; mobile development that contributed to our web site.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://newrelic.com/"&gt;New Relic&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Cheers! Thanks to New Relic, we’ll be serving craft beers at Happy Hour. To kick things off at 5 p.m., an expert from 21st Amendment Brewery will share how those delicious flavors you’re enjoying came to be.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://sendgrid.com/"&gt;SendGrid&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;SendGrid is bringing us a Waza first: Arduino hacking in the Garden! If you are new to Arduino, SendGrid will be leading two intro talks to get you started. If you’re already an Arduino, just sit down and hack! You might even win an Arduino kit to take home.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.treasure-data.com/"&gt;Treasure Data&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Saving us all from huddling in a corner near a power source, or missing anything to charge our laptops, Treasure Data is providing Waza attendees with two power valet stations. Drop off your electronics to be safely stored and charged while you enjoy the talks and activities. &lt;/p&gt;

&lt;h2&gt;Register Now&lt;/h2&gt;

&lt;p&gt;February 28th is less than two short weeks away.  If you haven’t &lt;a href="https://waza.heroku.com/2013"&gt;registered&lt;/a&gt; yet, now is the time. Looking forward to seeing you all at the Concourse for a sure-to-be-epic Waza! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/QwTcQRgQgk8" height="1" width="1"/&gt;</description>
      <author>Sara</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/20/waza-2013-happening</feedburner:origLink></item>
    <item>
      <title>Routing Performance Update</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/pW6ChELyIvU/routing_performance_update</link>
      <pubDate>Sat, 16 Feb 2013 06:10:38 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/16/routing_performance_update</guid>
      <description>&lt;p&gt;Over the past couple of years Heroku customers have occasionally reported unexplained latency on Heroku. There are many causes of latency—some of them have nothing to do with Heroku—but until this week, we failed to see a common thread among these reports. We now know that our routing and load balancing mechanism on the Bamboo and Cedar stacks created latency issues for our Rails customers, which manifested themselves in several ways, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unexplainable, high latencies for some requests&lt;/li&gt;
&lt;li&gt;Mismatch between reported queuing and service time metrics and the observed reality&lt;/li&gt;
&lt;li&gt;Discrepancies between documented and observed behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For applications running on the Bamboo stack, the root cause of these issues is the nature of routing on the Bamboo stack coupled with gradual, horizontal expansion of the routing cluster. On the Cedar stack, the root cause is the fact that  Cedar is optimized for concurrent request routing, while some frameworks, like Rails, are not concurrent in their default configurations.&lt;/p&gt;

&lt;p&gt;We want Heroku to be the best place to build, deploy and scale web and mobile applications. In this case, we’ve fallen short of that promise. We failed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Properly document how routing works on the Bamboo stack &lt;/li&gt;
&lt;li&gt;Understand the service degradation being experienced by our customers and take corrective action&lt;/li&gt;
&lt;li&gt;Identify and correct confusing metrics reported from the routing layer and displayed by third party tools&lt;/li&gt;
&lt;li&gt;Clearly communicate the product strategy for our routing service&lt;/li&gt;
&lt;li&gt;Provide customers with an upgrade path from non-concurrent apps on Bamboo to concurrent Rails apps on Cedar &lt;/li&gt;
&lt;li&gt;Deliver on the Heroku promise of letting you focus on developing apps while we worry about the infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are immediately taking the following actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving our documentation so that it accurately reflects how our service works across both Bamboo and Cedar stacks&lt;/li&gt;
&lt;li&gt;Removing incorrect and confusing metrics reported by Heroku or partner services like New Relic&lt;/li&gt;
&lt;li&gt;Adding metrics that let customers determine queuing impact on application response times&lt;/li&gt;
&lt;li&gt;Providing additional tools that developers can use to augment our latency and queuing metrics&lt;/li&gt;
&lt;li&gt;Working to better support concurrent-request Rails apps on Cedar &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The remainder of this blog post explains the technical details and history of our routing infrastructure, the intent behind the decisions we made along the way, the mistakes we made and what we think is the path forward.&lt;/p&gt;

&lt;h2 id="how_bamboo"&gt;How routing works on the Bamboo stack&lt;/h2&gt;

&lt;p&gt;In 2009, Heroku introduced the Bamboo stack. It supported only one language, one web framework and one embedded webserver. These were: Ruby (MRI 1.8), Rails (2.x) and Thin, respectively. &lt;/p&gt;

&lt;p&gt;The Bamboo stack does not support concurrency. On Bamboo, a single process can serve only one request at a time. To support this architecture, Heroku’s HTTP router was designed to queue requests at the router level. This enabled it to efficiently distribute requests to all available dynos.&lt;/p&gt;

&lt;p&gt;The Bamboo router never used a global per-application request queue. The router is a clustered service where each node in the cluster maintains its own per-application request queue. This is less efficient than routing with a global request queue, but it is a reasonable compromise as long as the cluster is small.&lt;/p&gt;

&lt;p&gt;To see why, let’s look at a simplistic example. In the two diagrams below, requests are coming in through three router nodes and being passed to two dynos. The majority of requests take 50ms, while a rare slow request takes 5000ms. In the first diagram, you can see how a slow request, coming in to Router 1, is passed to Dyno 1. Until Dyno 1 is finished with that request, Router 1 will not send any more requests to that dyno. However, Routers 2 and 3 may still send requests to that dyno.&lt;/p&gt;

&lt;p&gt;&lt;img src="//s3.amazonaws.com/f.cl.ly/items/3z3x1D1O1E3q0m121M0l/requests-info-graphic1.png" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, as illustrated in the next diagram, because Routers 2 and 3 are not aware that Dyno 1 is busy, they may still queue up one request each for Dyno 1. These requests are delayed until Dyno 1 finishes processing the slow request. &lt;/p&gt;

&lt;p&gt;&lt;img src="//s3.amazonaws.com/f.cl.ly/items/0N213h0O1R0n0M0y3301/requests-infographic-2.png" alt=""&gt;&lt;/p&gt;

&lt;p&gt;The inefficiency in request routing gets worse as the number of routers increases. This is essentially what’s been happening with Rails apps running on the Bamboo stack. Our routing cluster remained small for most of Bamboo’s history, which masked this inefficiency. However, as the platform grew, it was only a matter of time before we had to scale out and address the associated challenges.&lt;/p&gt;

&lt;h2 id="how_cedar"&gt;Routing on Cedar&lt;/h2&gt;

&lt;p&gt;As part of the new Cedar stack, we chose to evolve our router design to achieve the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support additional HTTP features like long polling and chunked responses&lt;/li&gt;
&lt;li&gt;Support multi-threaded and multi-process runtimes like JVM, Node.js, Unicorn and Puma&lt;/li&gt;
&lt;li&gt;Stateless architecture to optimize for reliability and scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, to meet the scalability requirements of Cedar we chose to remove the queuing logic and switch to random assignment. This new routing design was released exclusively on Cedar and was significantly different from the old design. What’s important to note is we intended customers to get the new routing behavior only when they deployed applications to Cedar.&lt;/p&gt;

&lt;h2&gt;Degradation of Bamboo routing&lt;/h2&gt;

&lt;p&gt;In theory, customers who had relied on the behavior of Bamboo routing could continue to use the Bamboo stack until they were ready to migrate to Cedar. Unfortunately that is not what happened. As traffic on Heroku grew, we added new nodes to the routing cluster rendering the per-node request queues less and less efficient, until Bamboo was effectively performing random load balancing.&lt;/p&gt;

&lt;p&gt;We did not document this evolution for our customers nor update our reporting to match the changing behavior. As a result, customers were presented with confusing metrics. Specifically, our router logs captured the service time and the depth of the per app request queue and present that to customers, who in turn were relying on these metrics to determine scaling needs. However, as the cluster grew, the time-and-depth metric for an individual router was no longer a relevant way to determine latency in your app.&lt;/p&gt;

&lt;p&gt;As a result, customers experienced what was effectively random load balancing applied to their Bamboo applications. This was not caused by an explicit change to the Bamboo routing code. Nor was it related to the new routing logic on Cedar. It was a pure side-effect of the expansion of the routing cluster. &lt;/p&gt;

&lt;h2&gt;No path for concurrent Rails apps on Cedar&lt;/h2&gt;

&lt;p&gt;We launched Cedar in beta in May 2011 with support for Node.js and Ruby on Rails. Our documentation recommends the use of Thin, which is a single-threaded, evented web server. In theory, an evented server like Thin can process multiple concurrent requests, but doing this successfully depends on the code you write and the libraries you use. Rails, in fact, does not yet reliably support concurrent request handling. This leaves Rails developers unable to leverage the additional concurrency capabilities offered by the Cedar stack, unless they move to a concurrent web server like Puma or Unicorn.&lt;/p&gt;

&lt;p&gt;Rails apps deployed to Cedar with Thin can rather quickly end up with request queuing problems. Because the Cedar router no longer does any queuing on behalf of the app, requests queued at the dyno must wait until the single Rails process works its way through the queue. Many customers have run into this issue and we failed to take action and provide them with a better approach to deploying Rails apps on Cedar.&lt;/p&gt;

&lt;h2&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;To reiterate, here is what we are doing now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving our documentation so that it accurately reflects how our service works across both Bamboo and Cedar stacks&lt;/li&gt;
&lt;li&gt;Removing incorrect and confusing metrics reported by Heroku or partner services like New Relic&lt;/li&gt;
&lt;li&gt;Adding metrics that let customers determine queuing impact on application response times&lt;/li&gt;
&lt;li&gt;Providing additional tools that developers can use to augment our latency and queuing metrics&lt;/li&gt;
&lt;li&gt;Working to better support concurrent-request Rails apps on Cedar &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have thoughts or questions, please comment below or reach out to me directly at &lt;a href="mailto:jesperj@heroku.com"&gt;jesperj@heroku.com&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/pW6ChELyIvU" height="1" width="1"/&gt;</description>
      <author>Jesper</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/16/routing_performance_update</feedburner:origLink></item>
    <item>
      <title>Bamboo Routing Performance</title>
      <link>http://feedproxy.google.com/~r/heroku/~3/NAvzQyep_Cc/bamboo_routing_performance</link>
      <pubDate>Fri, 15 Feb 2013 03:55:28 GMT</pubDate>
      <guid isPermaLink="false">http://blog.heroku.com/archives/2013/2/15/bamboo_routing_performance</guid>
      <description>&lt;p&gt;Yesterday, one of our customers let us know about significant performance issues they have experienced on Heroku. They raised an important issue and I want to let our community know about it. In short, Ruby on Rails apps running on Bamboo have experienced a degradation in performance over the past 3 years as we have scaled. &lt;/p&gt;

&lt;p&gt;We failed to explain how our product works. We failed to help our customers scale. We failed our community at large. I want to personally apologize, and commit to resolving this issue. &lt;/p&gt;

&lt;p&gt;Our goal is to make Heroku the best platform for all developers. In this case, we did not succeed. But we will make it right. Here’s what we are working on now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Posting an in-depth technical review tomorrow&lt;/li&gt;
&lt;li&gt;Quickly providing more visibility into your app’s queue of web requests&lt;/li&gt;
&lt;li&gt;Improving our documentation and website to accurately reflect our product&lt;/li&gt;
&lt;li&gt;Giving you tools to understand and improve the performance of your apps&lt;/li&gt;
&lt;li&gt;Working closely with our customers to develop long-term solutions &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am committing to listening to you, acting quickly to meet your needs and making sure Heroku is a platform that you trust for all of your applications. If you have additional concerns, please let me know. My email address is oren.teich@heroku.com.&lt;/p&gt;

&lt;p&gt;Oren Teich
GM, Heroku&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/heroku/~4/NAvzQyep_Cc" height="1" width="1"/&gt;</description>
      <author>Oren</author>
    <feedburner:origLink>http://blog.heroku.com/archives/2013/2/15/bamboo_routing_performance</feedburner:origLink></item>
  </channel>
</rss>
