<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Crashlytics Blog</title>
	<atom:link href="http://www.crashlytics.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.crashlytics.com/blog</link>
	<description>The most powerful, yet lightest weight crash reporting solution for iOS and Android</description>
	<lastBuildDate>Thu, 28 Mar 2013 21:19:41 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Crashlytics wins 50 on Fire Award</title>
		<link>http://www.crashlytics.com/blog/crashlytics-wins-50-on-fire-award/</link>
		<comments>http://www.crashlytics.com/blog/crashlytics-wins-50-on-fire-award/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 21:03:29 +0000</pubDate>
		<dc:creator>Stephanie Bullis</dc:creator>
				<category><![CDATA[Awards]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1776</guid>
		<description><![CDATA[The BostInno 50 on Fire awards celebration last night brought together the city's brightest individuals who are powering the future of the Boston community and beyond. We're thrilled to announce that Crashlytics won BostInno's 50 on Fire award in technology!

With more than 2,000 companies nominated, we're humbled to have been selected and are privileged to share this honor with some of Boston's most innovative and inspiring individuals and companies. We had such a great time celebrating with the Boston community and our supporters.

Congratulations to all of the other winners -- it's great to see so much innovation happening in Boston!

Oh, and check out this video featuring highlights of the night's winners.]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1850" alt="wayne 50 on fire" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/03/wayne-50-on-fire.png" width="640" height="427" />(Image Courtesy BostInno)</p>
<p><img class=" wp-image-1851 alignright" alt="Marc and Jeff 50 on fire" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/03/marc-and-jeff-50-on-fire.png" width="230" height="292" /><br />
The <a href="http://50onfire.com/" target="_blank">50 on Fire awards</a> celebration brought together the city&#8217;s brightest individuals who are powering the future of the Boston community and beyond. We&#8217;re thrilled to announce that Crashlytics won BostInno&#8217;s 50 on Fire award in Technology!</p>
<p>With more than 2,000 companies nominated, we&#8217;re humbled to have been selected and are privileged to share this honor with some of Boston&#8217;s most innovative and inspiring individuals and companies. We had such a great time celebrating with the Boston community and our supporters.</p>
<p>Congratulations to all of the other winners &#8212; it&#8217;s great to see so much innovation happening in Boston!</p>
<p>Oh, and check out this <a href="https://www.youtube.com/watch?feature=player_detailpage&amp;v=cpXleuM8PqY#t=692s">video</a> featuring highlights of the night&#8217;s winners.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/crashlytics-wins-50-on-fire-award/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crashlytics @ SXSW 2013</title>
		<link>http://www.crashlytics.com/blog/crashlytics-sxsw-2013/</link>
		<comments>http://www.crashlytics.com/blog/crashlytics-sxsw-2013/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 19:48:40 +0000</pubDate>
		<dc:creator>Stephanie Bullis</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1730</guid>
		<description><![CDATA[We’re excited to announce that we're hosting our very first SXSW event! RSVPs are rolling in from many of the top mobile developers and we hope to see you there as well!]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://try.crashlytics.com/events/sxsw2013/"><img class="aligncenter size-full wp-image-1731" alt="Crashlytics @ SXSW 2013" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/03/Crashlytics@SXSW-2013.png" width="640" height="250" /></a></p>
<p>We’re excited to announce that we&#8217;re hosting our very first SXSW event! RSVPs are rolling in from many of the top mobile developers and we hope to see you there as well!</p>
<p>The brunch will be held at #FEED at the Austin Museum of Art &#8212; located at the center of all the SXSW festivities. Demand is high &#8212; reserve your spot now. <a href="http://try.crashlytics.com/events/sxsw2013/">Learn more about it here</a>.</p>
<ul>
<li><strong>When:</strong> Sunday, March 10th from 12-2pm</li>
<li><strong>Where:</strong> <a href="https://maps.google.com/maps?ie=UTF-8&amp;q=austin+museum+of+art&amp;fb=1&amp;gl=us&amp;hq=austin+museum+of+art&amp;hnear=austin+museum+of+art&amp;cid=0,0,8736891048700903278&amp;ei=axE1UfWHIMq9ywHQ54BA&amp;ved=0CIkBEPwSMAA">#FEED at AMOA</a> (700 Congress Ave, Austin, TX)</li>
<li><strong>Cocktails and brunch: </strong>On us</li>
<li><strong>Want to crash it?</strong> RSVP <a href="http://try.crashlytics.com/events/sxsw2013/">here </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/crashlytics-sxsw-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crashlytics Enterprise Is Now Free</title>
		<link>http://www.crashlytics.com/blog/crashlytics-enterprise-is-now-free/</link>
		<comments>http://www.crashlytics.com/blog/crashlytics-enterprise-is-now-free/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 21:53:01 +0000</pubDate>
		<dc:creator>Wayne Chang</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1670</guid>
		<description><![CDATA[Today we're excited to announce that we’re folding the features of Crashlytics Enterprise into Crashlytics and they will be available to all – for free. With Crashlytics Enterprise, there are no usage costs, fees, or limits when it comes to your app’s performance monitoring. The features and usage we used to charge for based on limits are now unlimited across the board. This means that you no longer need to worry about numbers like monthly active users, disk space or API limits. And since Crashlytics Enterprise has no limits, you can add as many apps and developer seats as your team needs.]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p><img class="aligncenter size-full wp-image-1709" alt="Crashlytics Enterprise" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/02/Crashlytics-Enterprise.png" width="640" height="278" /></p>
<p>Crashlytics gives mobile app developers insight into their apps’ performance, so you can pinpoint and fix issues quickly and easily. In addition to the main Crashlytics product, we’ve also offered Crashlytics Enterprise, which we introduced for those who wanted even more robust reporting and workflow integration, among other features.</p>
<p>Now all developers can have the best tools to identify and fix issues — we’re folding the <a href="http://try.crashlytics.com/enterprise/">features of Crashlytics Enterprise</a> into Crashlytics. The enterprise features will be available to all – for <strong>free</strong>.</p>
<p>With Crashlytics Enterprise, there are <strong>no usage costs, fees, or limits</strong> when it comes to your app’s performance monitoring. The features and usage we used to charge for based on limits are now unlimited across the board. This means that you no longer need to worry about numbers like <strong>monthly active users, disk space or API limits</strong>. And since Crashlytics Enterprise has<strong> no limits</strong>, you can add as many apps and developer seats as your team needs.</p>
<p>In the future, all new Crashlytics accounts will be automatically upgraded to the unlimited, free version of the product; existing users have already been transitioned. And the capabilities of Crashlytics Enterprise don’t stop here. <a href="http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/">Working with Twitter</a>, we’ll continue to develop new features even faster.</p>
<p><a href="http://crashlytics.com/">Try Crashlytics</a> in your app now!</p>
<p>Cheers,</p>
<p><a href="http://twitter.com/Wayne/"><img class="size-full wp-image-1708" alt="Wayne Chang" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/02/Wayne-Chang.png" width="318" height="229" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/crashlytics-enterprise-is-now-free/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crashlytics is joining forces with Twitter</title>
		<link>http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/</link>
		<comments>http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/#comments</comments>
		<pubDate>Mon, 28 Jan 2013 22:14:51 +0000</pubDate>
		<dc:creator>Wayne Chang</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1564</guid>
		<description><![CDATA[What an incredible journey this past year has been -- today, we're excited to announce: we're merging with Twitter to take our platform to an entirely new level!]]></description>
				<content:encoded><![CDATA[<p><center><a class="fancybox" href="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/big_ribbon.png"><img style="padding-top: 10px;" alt="Crashlytics Twitter Acquisition" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/Crashlytics_Twitter_Acquisition.png" width="640" height="538" /></a></center><br />
What an incredible journey this past year has been &#8212; today, we&#8217;re excited to announce: we&#8217;re merging with Twitter to take our platform to an entirely new level!</p>
<p><strong>Our Product</strong></p>
<p>We started Crashlytics a little over a year ago to address a huge hole in mobile app development. With hundreds of millions of devices in use around the world, it was impossible for developers to fully test every edge-case and catch every bug before release. Even worse, when problems did crop up, it was often difficult and complicated to find the root cause. App developers were stuck with little insight into what happened and forced to rely on vague end-user feedback to diagnose problems.</p>
<p>We built Crashlytics to deliver the world’s most powerful and lightest-weight crash reporting solution. With us, developers gain instant visibility into the precise line of code that caused a crash, enabling them to more easily fix issues. Since our iOS launch, we&#8217;ve had the privilege of working with thousands of incredible app developers, from those building independent passion-projects to many of the top iOS apps available today – Twitter, Vine, Yelp, Kayak, TaskRabbit, and Waze, to name just a few.</p>

<a href='http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/02-3-2/' title='Dashboard of Issues'><img width="150" height="150" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/02.31-150x150.png" class="attachment-thumbnail" alt="Dashboard of Issues" /></a>
<a href='http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/02-4-2/' title='Individual crash details'><img width="150" height="150" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/02.41-150x150.png" class="attachment-thumbnail" alt="Individual crash details" /></a>
<a href='http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/03-6-2/' title='Our Mac App'><img width="150" height="150" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/03.61-150x150.png" class="attachment-thumbnail" alt="Our Mac App" /></a>

<p><strong>What’s Next</strong></p>
<p>With today’s announcement, much will remain the same. Development of Crashlytics will continue unabated and we remain dedicated to working with all of our customers – current and new, big and small – to deliver the key app performance insights they need.</p>
<p>Going forward, we&#8217;re thrilled to work with the incredible team at Twitter. We share a passion for innovating on mobile and building world-class applications. Joining forces will accelerate our build-out, allowing us to leverage Twitter’s infrastructure to deliver new features faster than ever.</p>
<p>On a more personal note, it&#8217;s an honor to work with the entire Crashlytics team – the best group we&#8217;ve ever been a part of – and we couldn&#8217;t be more excited to continue doing so.</p>
<p>Join us on our mission and <a href="http://try.crashlytics.com/">try Crashlytics in your app if you haven’t yet!</a></p>
<p>Onwards,</p>
<p><center><a href="http://www.twitter.com/jeffseibert"><img alt="Jeff Seibert" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/jeff.png" width="233" height="229" /></a><a href="http://www.twitter.com/wayne"><img alt="Wayne Chang" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2013/01/wayne.png" width="337" height="229" /></a></center>&nbsp;</p>
<p><strong>Highlights from the Twitterverse:</strong></p>
<blockquote class="twitter-tweet"><p>Welcome @<a href="https://twitter.com/crashlytics">crashlytics</a> to the Twitter team! <a href="http://t.co/l0wSSdNl" title="http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/">crashlytics.com/blog/crashlyti…</a></p>
<p>&mdash; Jack Dorsey (@jack) <a href="https://twitter.com/jack/status/296029920205873152">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Welcoming cool dudes @<a href="https://twitter.com/wayne">wayne</a> and @<a href="https://twitter.com/jeffseibert">jeffseibert</a> along with the entire @<a href="https://twitter.com/crashlytics">crashlytics</a> team to the Flock!</p>
<p>&mdash; Ali Rowghani (@ROWGHANI) <a href="https://twitter.com/ROWGHANI/status/296027867970686976">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Couldn&#8217;t be more pleased to have @<a href="https://twitter.com/wayne">wayne</a>, @<a href="https://twitter.com/jeffseibert">jeffseibert</a>, and the @<a href="https://twitter.com/crashlytics">crashlytics</a> team join the flock.</p>
<p>&mdash; Adam Messinger (@adam_messinger) <a href="https://twitter.com/adam_messinger/status/296049747263893505">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Very excited to have the @<a href="https://twitter.com/crashlytics">crashlytics</a> team <a href="https://twitter.com/search/%23jointheflock">#jointheflock</a>. They&#8217;ve built an amazing product. <a href="http://t.co/Hqk5QDtx" title="http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/">crashlytics.com/blog/crashlyti…</a></p>
<p>&mdash; Michael Sippey (@sippey) <a href="https://twitter.com/sippey/status/296033231227199490">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats to @<a href="https://twitter.com/twitter">twitter</a> and @<a href="https://twitter.com/crashlytics">crashlytics</a> &#8212; KAYAK Mobile uses Crashlytics, a fantastic tool for solving hard-to-find bugs <a href="http://t.co/L7RWn2lR" title="http://on.kayak.com/X63mMT">on.kayak.com/X63mMT</a></p>
<p>&mdash; KAYAK (@KAYAK) <a href="https://twitter.com/KAYAK/status/296294102268510209">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>.@<a href="https://twitter.com/crashlytics">crashlytics</a> Congratulations on being acquired by @<a href="https://twitter.com/twitter">twitter</a>! We&#8217;ve been using your service to help us crash those bugs and we love it!</p>
<p>&mdash; waze (@waze) <a href="https://twitter.com/waze/status/296169547491328000">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Hats off to the amazing @<a href="https://twitter.com/crashlytics">crashlytics</a> team on their big news. @<a href="https://twitter.com/square">square</a> is a very happy customer and we’re excited for its future!</p>
<p>&mdash; nathan spindel (@nathan) <a href="https://twitter.com/nathan/status/296022991257624576">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats @<a href="https://twitter.com/crashlytics">crashlytics</a>! My team here at @<a href="https://twitter.com/walmartlabs">walmartlabs</a> and I are excited about what&#8217;s coming in the future with all those new resources!!</p>
<p>&mdash; Brandon Sneed (@bsneed) <a href="https://twitter.com/bsneed/status/296025550621904897">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats to @<a href="https://twitter.com/crashlytics">crashlytics</a> and @<a href="https://twitter.com/wayne">wayne</a>for joining Twitter! We&#8217;ve been using Crashlytics since the very beginning and we are huge fans.</p>
<p>&mdash; Embark (@letsembark) <a href="https://twitter.com/letsembark/status/296079819127545857">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>A big shoutout to our partner, @<a href="https://twitter.com/crashlytics">crashlytics</a>, for their awesome product suite that makes our mobile app awesome!</p>
<p>&mdash; TaskRabbit (@TaskRabbit) <a href="https://twitter.com/TaskRabbit/status/295979013703364608">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats @<a href="https://twitter.com/crashlytics">crashlytics</a>! And thank you for making me better. <img src='https://d1f4seebrc9wq7.cloudfront.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&mdash; Weddar (@Weddar) <a href="https://twitter.com/Weddar/status/296029628458479617">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>I’m a huge, huge fan of @<a href="https://twitter.com/crashlytics">crashlytics</a> &#8212; glad they’re now a part of @<a href="https://twitter.com/twitter">twitter</a> and that they’ll keep developing it! <a href="http://t.co/NR72XOeV" title="http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/">crashlytics.com/blog/crashlyti…</a></p>
<p>&mdash; Eric Florenzano (@ericflo) <a href="https://twitter.com/ericflo/status/296033565991370753">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats to the @<a href="https://twitter.com/crashlytics">crashlytics</a> team. Been using it for half a year with @<a href="https://twitter.com/niiiws">niiiws</a> and it&#8217;s an amazing service.</p>
<p>&mdash; Tiago Alves (@alvesjtiago) <a href="https://twitter.com/alvesjtiago/status/296031344692183041">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Huge congrats to @<a href="https://twitter.com/jeffseibert">jeffseibert</a> @<a href="https://twitter.com/wayne">wayne</a>, and @<a href="https://twitter.com/twitter">twitter</a> for a smart purchase. Our engineers @<a href="https://twitter.com/thetaplab">thetaplab</a> love this product.</p>
<p>&mdash; Kabir (@KabirH) <a href="https://twitter.com/KabirH/status/296036008401727488">January 28, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Congrats @<a href="https://twitter.com/crashlytics">crashlytics</a> You guys built an incredible product my team and others rely on everyday.Heres to much more success w/ <a href="https://twitter.com/search/%23jointheflock">#jointheflock</a></p>
<p>&mdash; Andrew Rosenblum (@AJRosenblum) <a href="https://twitter.com/AJRosenblum/status/296053613875306496">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet" data-conversation="none"><p>Congrats @<a href="https://twitter.com/wayne">wayne</a>. Been using @<a href="https://twitter.com/crashlytics">crashlytics</a> and it&#8217;s been super awesome.</p>
<p>&mdash; Aditya Herlambang (@aditya_herlamba) <a href="https://twitter.com/aditya_herlamba/status/296059226701299712">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Stoked for the team @<a href="https://twitter.com/crashlytics">crashlytics</a>. Excellent, excellent product.</p>
<p>&mdash; Tom Hauburger (@thauburger) <a href="https://twitter.com/thauburger/status/296091038492274688">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Super excited that @<a href="https://twitter.com/crashlytics">crashlytics</a> is joining the flock!Such a great product and ridiculously smart and fun team!</p>
<p>&mdash; Jeremy Gordon (@JeremySF) <a href="https://twitter.com/JeremySF/status/296091590101970944">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet"><p>Just saw that @<a href="https://twitter.com/crashlytics">crashlytics</a> was acquired by @<a href="https://twitter.com/twitter">twitter</a> today. Great product, congrats!</p>
<p>&mdash; Ben Graver (@bengraver) <a href="https://twitter.com/bengraver/status/296124601493237760">January 29, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/crashlytics-is-joining-forces-with-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Major update: Crashlytics for iOS 2.0</title>
		<link>http://www.crashlytics.com/blog/major-update-crashlytics-for-ios-2-0/</link>
		<comments>http://www.crashlytics.com/blog/major-update-crashlytics-for-ios-2-0/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 18:30:39 +0000</pubDate>
		<dc:creator>Jeff Seibert</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Industry]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1502</guid>
		<description><![CDATA[At Crashlytics, one of our founding principals has been an extreme (some would say, absurd) attention to detail. Crash detection and reporting, particularly on iOS, is a complex and esoteric problem to solve, with arcane restrictions that throw modern programming practices out the window.

Need to allocate memory at crash-time? Revisit your approach. Thinking of calling an Objective-C method? Dream on.

This focus has not gone unnoticed: many of the world's best mobile engineering teams - that build many of the most-well-known apps - now trust our award-winning Crashlytics for iOS solution to deliver accurate, detailed, crash reports from hundreds of millions of devices around the globe.

But we're not satisfied.

Over the past 6 months, we've embarked on a ground-up rewrite of our iOS SDK to take things to a whole new level and, after 2 months of intense testing, I'm extremely pleased to publicly announce the release of Crashlytics for iOS v2.]]></description>
				<content:encoded><![CDATA[<p><img src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2012/12/crashlytics_for_ios.png" alt="Announcing Crashlytics for iOS 2.0" width="640" height="350" class="aligncenter size-full wp-image-1544" /><br />
At Crashlytics, one of our founding principals has been an extreme (some would say, absurd) attention to detail. Crash detection and reporting, particularly on iOS, is a complex and esoteric problem to solve, with arcane restrictions that throw modern programming practices out the window.</p>
<p>Need to allocate memory at crash-time? Revisit your approach. Thinking of calling an Objective-C method? Dream on.</p>
<p>This focus has not gone unnoticed: many of the world&#8217;s best mobile engineering teams &#8211; that build many of the most-well-known apps &#8211; <a href="http://try.crashlytics.com/enterprise">now trust our award-winning Crashlytics for iOS solution</a> to deliver accurate, detailed, crash reports from <i>hundreds of millions of devices</i> around the globe.</p>
<p>But we&#8217;re not satisfied.</p>
<p>Over the past 6 months, we&#8217;ve embarked on a ground-up rewrite of our iOS SDK to take things to a whole new level and, after 2 months of intense testing, I&#8217;m extremely pleased to publicly announce the release of Crashlytics for iOS v2.</p>
<p><strong>Highlights from hundreds of improvements</strong></p>
<p>When we set out to design our new iOS SDK, it was the perfect opportunity to fundamentally rethink our approach. We&#8217;ve made <b><i>hundreds of improvements</i></b> to our iOS SDK that have lead to significant performance and stability increases. Here are some of the major ones:</p>
<ol>
<li><strong>Mach Exceptions. Better than signal handlers.</strong> 
<p>All widely-used crash-reporting solutions for iOS and Mac OS are currently based off signals and uncaught exceptions. By registering handlers for both of these events, it&#8217;s possible to detect and inspect the majority of crashes that occur. As our usage has exploded, however, it became painfully obvious that crashes were sneaking through. For example, it&#8217;s not possible to catch all stack-overflow crashes with a signal handler.</p>
<p>Fortunately, there&#8217;s a better way. In Darwin, signals are actually implemented on top of lower-level events called Mach Exceptions. Handling these directly is the holy-grail &#8211; all crashes can be captured immediately after they happen with far more precision and accuracy. The Mach Exception API is radically more complex than signal handling, but capturing every crash more than justifies the hurdles.</li>
<li><strong>Advanced techniques to stop secondary crashes.</strong>
<p>Processes that crash often end up sustaining considerable damage before the kernel takes action to terminate them. In many of the nastiest crashes we&#8217;ve seen, this can result in secondary crashes, where the crash-handling code itself is unable to operate correctly and fails, obscuring the source of the original crash. Secondary crashes have two primary causes, both due to corruption. A buffer-overrun could mangle or destroy the in-memory data-structures that Crashlytics uses to track state. Alternatively, hardware failures or disk errors could damage the temporary cache files used to record data before it was sent to our servers.</p>
<p>Our new SDK goes to great lengths to address these scenarios. By carefully controlling its memory usage, our new SDK is able to pre-allocate a contiguous block of RAM that it then surrounds with guard pages, protecting against buffer-overruns. In the case of cache corruption, we&#8217;ve invested in making our file-handling code extremely defensive, so parsing cache files can&#8217;t crash unexpectedly.</li>
<li><strong>Stack unwinding. Finding the real path to the crash.</strong>
<p>One of the most abstruse aspects of crash detection is stack unwinding, the seemingly omniscient ability to determine historic code execution that directly lead to the crash. In practice, it involves carefully walking up the stack in memory and searching for return addresses &#8211; the instruction pointers of the calling lines. </p>
<p>Writing an ARM stack unwinder that works in most cases is relatively straightforward &#8211; the stack layout for iOS is well-defined. However, things start to fall apart when custom assembly is thrown into the mix, as there are no hard rules on what can and can&#8217;t be done. It just so happens that objc_msgSend is such a method, performing countless tricks to make dynamic method invocation in Objective-C as fast as possible. All works perfectly during normal operation, but if objc_msgSend crashes, a naïve ARM unwinder could easily miss the stack frame of the calling function. Of course, that&#8217;s the critical line you need to know!</p>
<p>Our new SDK uses a vastly better technique to determine the calling instruction that works in the case of objc_msgSend and many other &#8220;creative&#8221; methods that still conform in-part to Apple&#8217;s iOS ABI.</li>
</ol>
<p>We could not be happier to get these improvements into the hands of thousands of app developers and the feedback so far has been fantastic. Thanks to all those who have helped us test Crashlytics for iOS v2 and trust me &#8211; we&#8217;re not stopping here &#8211; the most advanced crash reporting SDK for iOS will keep getting better! </p>
<p>Have questions about Crashlytics for iOS v2? <a href="http://support.crashlytics.com" title="Crashlytics Support" target="_blank">Send us email</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/major-update-crashlytics-for-ios-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing Crashlytics Logs</title>
		<link>http://www.crashlytics.com/blog/announcing-crashlytics-logs/</link>
		<comments>http://www.crashlytics.com/blog/announcing-crashlytics-logs/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 20:00:11 +0000</pubDate>
		<dc:creator>Jeff Seibert</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Insight]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[app development]]></category>
		<category><![CDATA[Crashlytics Announcement]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1439</guid>
		<description><![CDATA[A treasure-trove of data lies in an app's logs and there's no better way to debug a problem than by knowing exactly what happened leading up to the critical moment. Capturing logging data has been our number-one customer request for months and our number-one concern. We care deeply about security and end-user privacy: collecting logging data opens the door to substantial risks. We wanted to begin the path down the road to building a Splunk for Mobile.

I'm excited to announce that after focusing our R&#38;D efforts, we think we've cracked it, and I wanted to share some details on our approach.]]></description>
				<content:encoded><![CDATA[<p><img src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2012/12/logs.png" alt="logs" width="640" height="278" class="aligncenter size-full wp-image-1486" /><br />
Since our launch one year ago, Crashlytics has set the bar for the most informative crash reports on mobile. Above and beyond stack traces, RAM usage, and disk utilization, we&#8217;ve sought to provide all the critical data-points that developers need to pinpoint and fix issues &#8211; device orientation, battery state, even whether the device was being held up to the ear! And we&#8217;re never satisfied.</p>
<p>A treasure-trove of data lies in an app&#8217;s logs and there&#8217;s no better way to debug a problem than by knowing exactly what happened leading up to the critical moment. Capturing logging data has been our number-one customer request for months and our number-one concern. We care deeply about security and end-user privacy: collecting logging data opens the door to substantial risks. We wanted to begin the path down the road to building a Splunk for Mobile.</p>
<p>I&#8217;m excited to announce that after focusing our R&amp;D efforts, we think we&#8217;ve cracked it, and I wanted to share some details on our approach.</p>
<p><strong>Privacy, Performance</strong></p>
<p>The easiest way to deliver logging would be to capture and redirect all output from NSLog(), but this is also the easiest way to infringe user privacy. Many apps don&#8217;t take the care they should in scrubbing log lines of personally-identifiable information: names, email addresses, even passwords often appear in URLs or internal settings that might commonly get logged. Sending this data, even encrypted over SSL, would be dangerous and in-breach of most privacy policies.</p>
<p>Instead, we&#8217;ve chosen to introduce completely distinct logging functionality called <strong>CLSLog()</strong>, so it&#8217;s explicit what data will be collected and transmitted with Crashlytics reports.</p>
<p>We also took the opportunity to make some performance improvements &#8211; in our benchmarks, <strong>CLSLog() is 10X faster than NSLog()</strong> under the same conditions. Using CLSLog() could not be easier &#8211; it&#8217;s a drop-in replacement:</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_IsltVz  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_IsltVz {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_IsltVz .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_IsltVz pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_IsltVz span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_IsltVz table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_IsltVztable td, .pygmentize_IsltVztable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_IsltVz pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_IsltVz {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_IsltVz {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_IsltVz td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_IsltVz .hll { background-color: #49483e }
.pygmentize_IsltVz  { background: #272822; color: #f8f8f2 }
.pygmentize_IsltVz .c { color: #75715e } /* Comment */
.pygmentize_IsltVz .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_IsltVz .k { color: #66d9ef } /* Keyword */
.pygmentize_IsltVz .l { color: #ae81ff } /* Literal */
.pygmentize_IsltVz .n { color: #f8f8f2 } /* Name */
.pygmentize_IsltVz .o { color: #f92672 } /* Operator */
.pygmentize_IsltVz .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_IsltVz .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_IsltVz .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_IsltVz .c1 { color: #75715e } /* Comment.Single */
.pygmentize_IsltVz .cs { color: #75715e } /* Comment.Special */
.pygmentize_IsltVz .ge { font-style: italic } /* Generic.Emph */
.pygmentize_IsltVz .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_IsltVz .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_IsltVz .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_IsltVz .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_IsltVz .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_IsltVz .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_IsltVz .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_IsltVz .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_IsltVz .m { color: #ae81ff } /* Literal.Number */
.pygmentize_IsltVz .s { color: #e6db74 } /* Literal.String */
.pygmentize_IsltVz .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_IsltVz .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_IsltVz .nc { color: #a6e22e } /* Name.Class */
.pygmentize_IsltVz .no { color: #66d9ef } /* Name.Constant */
.pygmentize_IsltVz .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_IsltVz .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_IsltVz .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_IsltVz .nf { color: #a6e22e } /* Name.Function */
.pygmentize_IsltVz .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_IsltVz .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_IsltVz .nx { color: #a6e22e } /* Name.Other */
.pygmentize_IsltVz .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_IsltVz .nt { color: #f92672 } /* Name.Tag */
.pygmentize_IsltVz .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_IsltVz .ow { color: #f92672 } /* Operator.Word */
.pygmentize_IsltVz .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_IsltVz .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_IsltVz .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_IsltVz .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_IsltVz .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_IsltVz .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_IsltVz .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_IsltVz .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_IsltVz .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_IsltVz .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_IsltVz .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_IsltVz .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_IsltVz .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_IsltVz .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_IsltVz .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_IsltVz .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_IsltVz .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_IsltVz .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_IsltVz .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_IsltVz .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_IsltVz .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_IsltVz"><pre><span class="lineno">1</span> <span class="n">OBJC_EXTERN</span> <span class="kt">void</span> <span class="n">CLSLog</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="n">format</span><span class="p">,</span> <span class="p">...);</span> <span class="c1">// Log messages to be sent with crash reports</span>
</pre></div>


<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_08WpET  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_08WpET {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_08WpET .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_08WpET pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_08WpET span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_08WpET table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_08WpETtable td, .pygmentize_08WpETtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_08WpET pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_08WpET {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_08WpET {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_08WpET td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_08WpET .hll { background-color: #49483e }
.pygmentize_08WpET  { background: #272822; color: #f8f8f2 }
.pygmentize_08WpET .c { color: #75715e } /* Comment */
.pygmentize_08WpET .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_08WpET .k { color: #66d9ef } /* Keyword */
.pygmentize_08WpET .l { color: #ae81ff } /* Literal */
.pygmentize_08WpET .n { color: #f8f8f2 } /* Name */
.pygmentize_08WpET .o { color: #f92672 } /* Operator */
.pygmentize_08WpET .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_08WpET .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_08WpET .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_08WpET .c1 { color: #75715e } /* Comment.Single */
.pygmentize_08WpET .cs { color: #75715e } /* Comment.Special */
.pygmentize_08WpET .ge { font-style: italic } /* Generic.Emph */
.pygmentize_08WpET .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_08WpET .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_08WpET .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_08WpET .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_08WpET .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_08WpET .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_08WpET .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_08WpET .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_08WpET .m { color: #ae81ff } /* Literal.Number */
.pygmentize_08WpET .s { color: #e6db74 } /* Literal.String */
.pygmentize_08WpET .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_08WpET .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_08WpET .nc { color: #a6e22e } /* Name.Class */
.pygmentize_08WpET .no { color: #66d9ef } /* Name.Constant */
.pygmentize_08WpET .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_08WpET .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_08WpET .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_08WpET .nf { color: #a6e22e } /* Name.Function */
.pygmentize_08WpET .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_08WpET .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_08WpET .nx { color: #a6e22e } /* Name.Other */
.pygmentize_08WpET .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_08WpET .nt { color: #f92672 } /* Name.Tag */
.pygmentize_08WpET .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_08WpET .ow { color: #f92672 } /* Operator.Word */
.pygmentize_08WpET .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_08WpET .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_08WpET .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_08WpET .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_08WpET .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_08WpET .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_08WpET .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_08WpET .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_08WpET .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_08WpET .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_08WpET .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_08WpET .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_08WpET .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_08WpET .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_08WpET .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_08WpET .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_08WpET .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_08WpET .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_08WpET .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_08WpET .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_08WpET .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_08WpET"><pre><span class="lineno">1</span> <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Detected Higgs Boson with mass %f!!&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">boson</span> <span class="n">mass</span><span class="p">]);</span>
<span class="lineno">2</span> <span class="n">CLSLog</span><span class="p">(</span><span class="s">@&quot;Detected Higgs Boson with mass %f!!&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">boson</span> <span class="n">mass</span><span class="p">]);</span>
</pre></div>


<p><strong>Options, Options, Options</strong></p>
<p>Of course, in many case you might want your log messages to also output to the system log, or show up in Xcode&#8217;s console. For these cases, we&#8217;ve also provided <strong>CLSNSLog()</strong>, which records the output and then passes it along to NSLog():</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_onZeDd  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_onZeDd {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_onZeDd .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_onZeDd pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_onZeDd span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_onZeDd table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_onZeDdtable td, .pygmentize_onZeDdtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_onZeDd pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_onZeDd {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_onZeDd {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_onZeDd td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_onZeDd .hll { background-color: #49483e }
.pygmentize_onZeDd  { background: #272822; color: #f8f8f2 }
.pygmentize_onZeDd .c { color: #75715e } /* Comment */
.pygmentize_onZeDd .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_onZeDd .k { color: #66d9ef } /* Keyword */
.pygmentize_onZeDd .l { color: #ae81ff } /* Literal */
.pygmentize_onZeDd .n { color: #f8f8f2 } /* Name */
.pygmentize_onZeDd .o { color: #f92672 } /* Operator */
.pygmentize_onZeDd .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_onZeDd .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_onZeDd .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_onZeDd .c1 { color: #75715e } /* Comment.Single */
.pygmentize_onZeDd .cs { color: #75715e } /* Comment.Special */
.pygmentize_onZeDd .ge { font-style: italic } /* Generic.Emph */
.pygmentize_onZeDd .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_onZeDd .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_onZeDd .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_onZeDd .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_onZeDd .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_onZeDd .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_onZeDd .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_onZeDd .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_onZeDd .m { color: #ae81ff } /* Literal.Number */
.pygmentize_onZeDd .s { color: #e6db74 } /* Literal.String */
.pygmentize_onZeDd .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_onZeDd .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_onZeDd .nc { color: #a6e22e } /* Name.Class */
.pygmentize_onZeDd .no { color: #66d9ef } /* Name.Constant */
.pygmentize_onZeDd .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_onZeDd .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_onZeDd .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_onZeDd .nf { color: #a6e22e } /* Name.Function */
.pygmentize_onZeDd .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_onZeDd .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_onZeDd .nx { color: #a6e22e } /* Name.Other */
.pygmentize_onZeDd .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_onZeDd .nt { color: #f92672 } /* Name.Tag */
.pygmentize_onZeDd .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_onZeDd .ow { color: #f92672 } /* Operator.Word */
.pygmentize_onZeDd .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_onZeDd .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_onZeDd .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_onZeDd .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_onZeDd .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_onZeDd .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_onZeDd .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_onZeDd .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_onZeDd .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_onZeDd .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_onZeDd .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_onZeDd .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_onZeDd .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_onZeDd .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_onZeDd .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_onZeDd .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_onZeDd .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_onZeDd .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_onZeDd .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_onZeDd .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_onZeDd .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_onZeDd"><pre><span class="lineno">1</span> <span class="n">OBJC_EXTERN</span> <span class="kt">void</span> <span class="n">CLSNSLog</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="n">format</span><span class="p">,</span> <span class="p">...);</span> <span class="c1">// Log messages to be sent with crash reports as well as to NSLog()</span>
</pre></div>


<p>But what if both could happen? In development builds, it would be ideal for everything to pass-thru to Xcode&#8217;s console so debugging was as easy as possible. In release builds, though, that&#8217;s nothing but overhead — it would be great to take advantage of the blinding speed of our 100% in-memory implementation of <strong>CLSLog()</strong>.</p>
<p>We&#8217;ve got you covered:</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_MgplSx  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_MgplSx {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_MgplSx .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_MgplSx pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_MgplSx span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_MgplSx table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_MgplSxtable td, .pygmentize_MgplSxtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_MgplSx pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_MgplSx {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_MgplSx {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_MgplSx td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_MgplSx .hll { background-color: #49483e }
.pygmentize_MgplSx  { background: #272822; color: #f8f8f2 }
.pygmentize_MgplSx .c { color: #75715e } /* Comment */
.pygmentize_MgplSx .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_MgplSx .k { color: #66d9ef } /* Keyword */
.pygmentize_MgplSx .l { color: #ae81ff } /* Literal */
.pygmentize_MgplSx .n { color: #f8f8f2 } /* Name */
.pygmentize_MgplSx .o { color: #f92672 } /* Operator */
.pygmentize_MgplSx .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_MgplSx .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_MgplSx .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_MgplSx .c1 { color: #75715e } /* Comment.Single */
.pygmentize_MgplSx .cs { color: #75715e } /* Comment.Special */
.pygmentize_MgplSx .ge { font-style: italic } /* Generic.Emph */
.pygmentize_MgplSx .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_MgplSx .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_MgplSx .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_MgplSx .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_MgplSx .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_MgplSx .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_MgplSx .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_MgplSx .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_MgplSx .m { color: #ae81ff } /* Literal.Number */
.pygmentize_MgplSx .s { color: #e6db74 } /* Literal.String */
.pygmentize_MgplSx .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_MgplSx .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_MgplSx .nc { color: #a6e22e } /* Name.Class */
.pygmentize_MgplSx .no { color: #66d9ef } /* Name.Constant */
.pygmentize_MgplSx .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_MgplSx .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_MgplSx .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_MgplSx .nf { color: #a6e22e } /* Name.Function */
.pygmentize_MgplSx .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_MgplSx .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_MgplSx .nx { color: #a6e22e } /* Name.Other */
.pygmentize_MgplSx .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_MgplSx .nt { color: #f92672 } /* Name.Tag */
.pygmentize_MgplSx .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_MgplSx .ow { color: #f92672 } /* Operator.Word */
.pygmentize_MgplSx .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_MgplSx .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_MgplSx .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_MgplSx .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_MgplSx .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_MgplSx .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_MgplSx .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_MgplSx .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_MgplSx .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_MgplSx .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_MgplSx .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_MgplSx .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_MgplSx .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_MgplSx .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_MgplSx .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_MgplSx .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_MgplSx .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_MgplSx .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_MgplSx .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_MgplSx .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_MgplSx .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_MgplSx"><pre><span class="lineno"> 1</span> <span class="cm">/**</span>
<span class="lineno"> 2</span> <span class="cm">*</span>
<span class="lineno"> 3</span> <span class="cm">* The CLS_LOG macro provides as easy way to gather more information in your log messages that are</span>
<span class="lineno"> 4</span> <span class="cm">* sent with your crash data. CLS_LOG prepends your custom log message with the function name and</span>
<span class="lineno"> 5</span> <span class="cm">* line number where the macro was used. If your app was built with the DEBUG preprocessor macro</span>
<span class="lineno"> 6</span> <span class="cm">* defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog.</span>
<span class="lineno"> 7</span> <span class="cm">* If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only, for a ~10X speed-up.</span>
<span class="lineno"> 8</span> <span class="cm">*</span>
<span class="lineno"> 9</span> <span class="cm">* Example output:</span>
<span class="lineno">10</span> <span class="cm">* -[AppDelegate login:] line 134 $ login start</span>
<span class="lineno">11</span> <span class="cm">*</span>
<span class="lineno">12</span> <span class="cm">**/</span>
<span class="lineno">13</span> <span class="cp">#ifdef DEBUG</span>
<span class="lineno">14</span> <span class="cp">#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@&quot;%s line %d $ &quot; __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)</span>
<span class="lineno">15</span> <span class="cp">#else</span>
<span class="lineno">16</span> <span class="cp">#define CLS_LOG(__FORMAT__, ...) CLSLog((@&quot;%s line %d $ &quot; __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)</span>
<span class="lineno">17</span> <span class="cp">#endif</span>
</pre></div>


<p>In Debug builds, CLS_LOG() will pass-thru to NSLog, but in Release builds, it will be as fast as possible:</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_BR1FoS  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_BR1FoS {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_BR1FoS .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_BR1FoS pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_BR1FoS span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_BR1FoS table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_BR1FoStable td, .pygmentize_BR1FoStable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_BR1FoS pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_BR1FoS {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_BR1FoS {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_BR1FoS td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_BR1FoS .hll { background-color: #49483e }
.pygmentize_BR1FoS  { background: #272822; color: #f8f8f2 }
.pygmentize_BR1FoS .c { color: #75715e } /* Comment */
.pygmentize_BR1FoS .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_BR1FoS .k { color: #66d9ef } /* Keyword */
.pygmentize_BR1FoS .l { color: #ae81ff } /* Literal */
.pygmentize_BR1FoS .n { color: #f8f8f2 } /* Name */
.pygmentize_BR1FoS .o { color: #f92672 } /* Operator */
.pygmentize_BR1FoS .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_BR1FoS .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_BR1FoS .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_BR1FoS .c1 { color: #75715e } /* Comment.Single */
.pygmentize_BR1FoS .cs { color: #75715e } /* Comment.Special */
.pygmentize_BR1FoS .ge { font-style: italic } /* Generic.Emph */
.pygmentize_BR1FoS .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_BR1FoS .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_BR1FoS .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_BR1FoS .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_BR1FoS .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_BR1FoS .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_BR1FoS .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_BR1FoS .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_BR1FoS .m { color: #ae81ff } /* Literal.Number */
.pygmentize_BR1FoS .s { color: #e6db74 } /* Literal.String */
.pygmentize_BR1FoS .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_BR1FoS .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_BR1FoS .nc { color: #a6e22e } /* Name.Class */
.pygmentize_BR1FoS .no { color: #66d9ef } /* Name.Constant */
.pygmentize_BR1FoS .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_BR1FoS .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_BR1FoS .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_BR1FoS .nf { color: #a6e22e } /* Name.Function */
.pygmentize_BR1FoS .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_BR1FoS .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_BR1FoS .nx { color: #a6e22e } /* Name.Other */
.pygmentize_BR1FoS .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_BR1FoS .nt { color: #f92672 } /* Name.Tag */
.pygmentize_BR1FoS .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_BR1FoS .ow { color: #f92672 } /* Operator.Word */
.pygmentize_BR1FoS .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_BR1FoS .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_BR1FoS .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_BR1FoS .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_BR1FoS .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_BR1FoS .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_BR1FoS .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_BR1FoS .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_BR1FoS .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_BR1FoS .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_BR1FoS .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_BR1FoS .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_BR1FoS .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_BR1FoS .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_BR1FoS .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_BR1FoS .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_BR1FoS .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_BR1FoS .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_BR1FoS .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_BR1FoS .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_BR1FoS .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_BR1FoS"><pre><span class="lineno">1</span> <span class="n">CLS_LOG</span><span class="p">(</span><span class="s">@&quot;Higgs-Boson detected! Bailing out... %@&quot;</span><span class="p">,</span> <span class="n">attributesDict</span><span class="p">);</span>
</pre></div>


<p><strong>Network Efficient</strong></p>
<p>We&#8217;ve designed our custom logging functionality from the ground-up to respect your end-users network connections and your app&#8217;s performance. Since it&#8217;s implementation is entirely in-process, it&#8217;s blazingly fast with no IPC overhead. It also accepts as much data as you choose to throw at it: CLSLog() maintains an auto-scrolling 64kb buffer of your log data, which is more than enough to record what happened in the moments leading up to a crash without exploding your app&#8217;s memory requirements or your end-users cellular data plan. Believe it or not, it&#8217;s even more memory-efficient than it sounds &#8211; our advanced architecture doesn&#8217;t even require holding all 64kb in RAM!</p>
<p><strong>That&#8217;s Not All&#8230;</strong></p>
<p>Viewing logging information is a whole other story. Rather than explain it, I&#8217;d encourage you to head over to our <a href="http://try.crashlytics.com/sdk/" target="_blank">SDK Overview</a> and see for yourself! We&#8217;re hard at work on additional SDK functionality and have much more to talk about in the coming weeks &#8211; stay tuned!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/announcing-crashlytics-logs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reducing MongoDB traffic by 78% with Redis</title>
		<link>http://www.crashlytics.com/blog/reducing-mongodb-traffic-by-78-with-redis-caching/</link>
		<comments>http://www.crashlytics.com/blog/reducing-mongodb-traffic-by-78-with-redis-caching/#comments</comments>
		<pubDate>Mon, 12 Nov 2012 18:00:33 +0000</pubDate>
		<dc:creator>Jeff Seibert</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Insight]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[redis]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1447</guid>
		<description><![CDATA[As Crashlytics has scaled, we’ve always been on the lookout for ways to drastically reduce the load on our systems. We recently brought production Redis servers online for some basic analytics tracking and we’ve been extremely pleased with their performance and stability. This weekend, it was time to give them something a bit more load-intensive to chew on.
The vast majority – roughly 90% – of inbound traffic to our servers is destined for the same place. Our client-side SDK, embedded in apps on hundreds of millions of devices worldwide, periodically loads configuration settings that power many of our advanced features. These settings vary by app and app version, but are otherwise identical across devices – a prime candidate for caching.]]></description>
				<content:encoded><![CDATA[<p><em>TL;DR: 31 lines of Rack middleware leverage Redis for highly-performant and flexible response caching.</em></p>
<p>As Crashlytics has scaled, we&#8217;ve always been on the lookout for ways to drastically reduce the load on our systems. We recently brought production Redis servers online for some basic analytics tracking and we&#8217;ve been extremely pleased with their performance and stability. This weekend, it was time to give them something a bit more load-intensive to chew on.</p>
<p>The vast majority &#8211; roughly 90% &#8211; of inbound traffic to our servers is destined for the same place. Our client-side SDK, embedded in apps on hundreds of millions of devices worldwide, periodically loads configuration settings that power many of our advanced features. These settings vary by app and app version, but are otherwise identical across devices &#8211; a prime candidate for caching.</p>
<p>There are countless built-in and third-party techniques for Rails caching, but we sought something simple that could leverage the infrastructure we already had. Wouldn&#8217;t it be great if we could specify a cache duration in any Rails action and it would <em>&#8220;just work&#8221;</em>?</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_PMyedd  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_PMyedd {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_PMyedd .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_PMyedd pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_PMyedd span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_PMyedd table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_PMyeddtable td, .pygmentize_PMyeddtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_PMyedd pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_PMyedd {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_PMyedd {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_PMyedd td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_PMyedd .hll { background-color: #49483e }
.pygmentize_PMyedd  { background: #272822; color: #f8f8f2 }
.pygmentize_PMyedd .c { color: #75715e } /* Comment */
.pygmentize_PMyedd .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_PMyedd .k { color: #66d9ef } /* Keyword */
.pygmentize_PMyedd .l { color: #ae81ff } /* Literal */
.pygmentize_PMyedd .n { color: #f8f8f2 } /* Name */
.pygmentize_PMyedd .o { color: #f92672 } /* Operator */
.pygmentize_PMyedd .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_PMyedd .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_PMyedd .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_PMyedd .c1 { color: #75715e } /* Comment.Single */
.pygmentize_PMyedd .cs { color: #75715e } /* Comment.Special */
.pygmentize_PMyedd .ge { font-style: italic } /* Generic.Emph */
.pygmentize_PMyedd .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_PMyedd .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_PMyedd .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_PMyedd .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_PMyedd .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_PMyedd .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_PMyedd .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_PMyedd .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_PMyedd .m { color: #ae81ff } /* Literal.Number */
.pygmentize_PMyedd .s { color: #e6db74 } /* Literal.String */
.pygmentize_PMyedd .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_PMyedd .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_PMyedd .nc { color: #a6e22e } /* Name.Class */
.pygmentize_PMyedd .no { color: #66d9ef } /* Name.Constant */
.pygmentize_PMyedd .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_PMyedd .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_PMyedd .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_PMyedd .nf { color: #a6e22e } /* Name.Function */
.pygmentize_PMyedd .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_PMyedd .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_PMyedd .nx { color: #a6e22e } /* Name.Other */
.pygmentize_PMyedd .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_PMyedd .nt { color: #f92672 } /* Name.Tag */
.pygmentize_PMyedd .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_PMyedd .ow { color: #f92672 } /* Operator.Word */
.pygmentize_PMyedd .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_PMyedd .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_PMyedd .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_PMyedd .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_PMyedd .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_PMyedd .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_PMyedd .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_PMyedd .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_PMyedd .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_PMyedd .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_PMyedd .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_PMyedd .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_PMyedd .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_PMyedd .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_PMyedd .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_PMyedd .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_PMyedd .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_PMyedd .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_PMyedd .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_PMyedd .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_PMyedd .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_PMyedd"><pre><span class="lineno">1</span> <span class="n">cache_response_for</span> <span class="mi">10</span><span class="o">.</span><span class="n">minutes</span>
</pre></div>


<p><strong>Rack Middleware to the Rescue</strong></p>
<p><strong></strong>One of the most powerful features of Rack-based Rails is middleware &#8211; functionality you can inject into the request processing logic to adjust how it is handled. This will let us check Redis for a cached response or fall-through to the standard Rails action.</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_taHUmy  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_taHUmy {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_taHUmy .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_taHUmy pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_taHUmy span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_taHUmy table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_taHUmytable td, .pygmentize_taHUmytable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_taHUmy pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_taHUmy {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_taHUmy {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_taHUmy td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_taHUmy .hll { background-color: #49483e }
.pygmentize_taHUmy  { background: #272822; color: #f8f8f2 }
.pygmentize_taHUmy .c { color: #75715e } /* Comment */
.pygmentize_taHUmy .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_taHUmy .k { color: #66d9ef } /* Keyword */
.pygmentize_taHUmy .l { color: #ae81ff } /* Literal */
.pygmentize_taHUmy .n { color: #f8f8f2 } /* Name */
.pygmentize_taHUmy .o { color: #f92672 } /* Operator */
.pygmentize_taHUmy .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_taHUmy .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_taHUmy .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_taHUmy .c1 { color: #75715e } /* Comment.Single */
.pygmentize_taHUmy .cs { color: #75715e } /* Comment.Special */
.pygmentize_taHUmy .ge { font-style: italic } /* Generic.Emph */
.pygmentize_taHUmy .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_taHUmy .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_taHUmy .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_taHUmy .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_taHUmy .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_taHUmy .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_taHUmy .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_taHUmy .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_taHUmy .m { color: #ae81ff } /* Literal.Number */
.pygmentize_taHUmy .s { color: #e6db74 } /* Literal.String */
.pygmentize_taHUmy .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_taHUmy .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_taHUmy .nc { color: #a6e22e } /* Name.Class */
.pygmentize_taHUmy .no { color: #66d9ef } /* Name.Constant */
.pygmentize_taHUmy .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_taHUmy .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_taHUmy .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_taHUmy .nf { color: #a6e22e } /* Name.Function */
.pygmentize_taHUmy .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_taHUmy .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_taHUmy .nx { color: #a6e22e } /* Name.Other */
.pygmentize_taHUmy .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_taHUmy .nt { color: #f92672 } /* Name.Tag */
.pygmentize_taHUmy .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_taHUmy .ow { color: #f92672 } /* Operator.Word */
.pygmentize_taHUmy .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_taHUmy .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_taHUmy .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_taHUmy .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_taHUmy .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_taHUmy .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_taHUmy .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_taHUmy .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_taHUmy .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_taHUmy .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_taHUmy .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_taHUmy .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_taHUmy .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_taHUmy .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_taHUmy .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_taHUmy .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_taHUmy .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_taHUmy .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_taHUmy .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_taHUmy .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_taHUmy .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_taHUmy"><pre><span class="lineno"> 1</span> <span class="k">class</span> <span class="nc">RackRedisCache</span>
<span class="lineno"> 2</span>   <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">rails</span><span class="p">)</span>
<span class="lineno"> 3</span>     <span class="vi">@rails</span> <span class="o">=</span> <span class="n">rails</span>
<span class="lineno"> 4</span>   <span class="k">end</span>
<span class="lineno"> 5</span>
<span class="lineno"> 6</span>   <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
<span class="lineno"> 7</span>     <span class="n">cache_key</span> <span class="o">=</span> <span class="s2">&quot;rack::redis-cache::</span><span class="si">#{</span><span class="n">env</span><span class="o">[</span><span class="s1">&#39;ORIGINAL_FULLPATH&#39;</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="lineno"> 8</span>
<span class="lineno"> 9</span>     <span class="n">data</span> <span class="o">=</span> <span class="no">REDIS</span><span class="o">.</span><span class="n">hgetall</span><span class="p">(</span><span class="n">cache_key</span><span class="p">)</span>
<span class="lineno">10</span>     <span class="k">if</span> <span class="n">data</span><span class="o">[</span><span class="s1">&#39;status&#39;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">data</span><span class="o">[</span><span class="s1">&#39;body&#39;</span><span class="o">]</span>
<span class="lineno">11</span>       <span class="no">Rails</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Completed </span><span class="si">#{</span><span class="n">data</span><span class="o">[</span><span class="s1">&#39;status&#39;</span><span class="o">].</span><span class="n">to_i</span><span class="si">}</span><span class="s2"> from Redis cache&quot;</span>
<span class="lineno">12</span>       <span class="o">[</span><span class="n">data</span><span class="o">[</span><span class="s1">&#39;status&#39;</span><span class="o">].</span><span class="n">to_i</span><span class="p">,</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">data</span><span class="o">[</span><span class="s1">&#39;headers&#39;</span><span class="o">]</span><span class="p">),</span> <span class="o">[</span><span class="n">data</span><span class="o">[</span><span class="s1">&#39;body&#39;</span><span class="o">]]]</span>
<span class="lineno">13</span>     <span class="k">else</span>
<span class="lineno">14</span>       <span class="vi">@rails</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span><span class="o">.</span><span class="n">tap</span> <span class="k">do</span> <span class="o">|</span><span class="n">response</span><span class="o">|</span>
<span class="lineno">15</span>         <span class="n">response_status</span><span class="p">,</span> <span class="n">response_headers</span><span class="p">,</span> <span class="n">response_body</span> <span class="o">=</span> <span class="o">*</span><span class="n">response</span>
<span class="lineno">16</span>         <span class="n">response_cache_duration</span> <span class="o">=</span> <span class="n">response_headers</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s1">&#39;Rack-Cache-Response-For&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
<span class="lineno">17</span>
<span class="lineno">18</span>         <span class="k">if</span> <span class="n">response_cache_duration</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="lineno">19</span>           <span class="no">REDIS</span><span class="o">.</span><span class="n">hmset</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span>
<span class="lineno">20</span>             <span class="s1">&#39;status&#39;</span><span class="p">,</span> <span class="n">response_status</span><span class="p">,</span>
<span class="lineno">21</span>             <span class="s1">&#39;headers&#39;</span><span class="p">,</span> <span class="n">response_headers</span><span class="o">.</span><span class="n">to_json</span><span class="p">,</span>
<span class="lineno">22</span>             <span class="s1">&#39;body&#39;</span><span class="p">,</span> <span class="n">response_body</span><span class="o">.</span><span class="n">body</span>
<span class="lineno">23</span>           <span class="p">)</span>
<span class="lineno">24</span>
<span class="lineno">25</span>           <span class="no">REDIS</span><span class="o">.</span><span class="n">expire</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="n">response_cache_duration</span><span class="p">)</span>
<span class="lineno">26</span>           <span class="no">Rails</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Cached response to Redis for </span><span class="si">#{</span><span class="n">response_cache_duration</span><span class="si">}</span><span class="s2"> seconds.&quot;</span>
<span class="lineno">27</span>         <span class="k">end</span>
<span class="lineno">28</span>       <span class="k">end</span>
<span class="lineno">29</span>     <span class="k">end</span>
<span class="lineno">30</span>   <span class="k">end</span>
<span class="lineno">31</span> <span class="k">end</span>
</pre></div>


<p>A response in Rails consists of 3 components &#8211; the HTTP status, HTTP headers, and of course, the response body. For clarity, we store these under separate keys within a Hash in Redis, JSON-encoding the headers to convert them into a string.</p>
<p>If the cache key is not present, the middleware falls-through to calling the action, and then checking an internal header value to determine whether the action desires its response be cached. The final critical line leverages Redis&#8217; key expiration functionality to ensure the cache is only valid for a given amount of time. It couldn&#8217;t get much simpler.</p>
<p><strong>Implementing our DSL</strong></p>
<p>To tie it all together, the <code>ApplicationController</code> needs a simple implementation of <code>cache_response_for</code> that sets the header appropriately:</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_QQVHST  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_QQVHST {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_QQVHST .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_QQVHST pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_QQVHST span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_QQVHST table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_QQVHSTtable td, .pygmentize_QQVHSTtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_QQVHST pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_QQVHST {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_QQVHST {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_QQVHST td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_QQVHST .hll { background-color: #49483e }
.pygmentize_QQVHST  { background: #272822; color: #f8f8f2 }
.pygmentize_QQVHST .c { color: #75715e } /* Comment */
.pygmentize_QQVHST .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_QQVHST .k { color: #66d9ef } /* Keyword */
.pygmentize_QQVHST .l { color: #ae81ff } /* Literal */
.pygmentize_QQVHST .n { color: #f8f8f2 } /* Name */
.pygmentize_QQVHST .o { color: #f92672 } /* Operator */
.pygmentize_QQVHST .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_QQVHST .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_QQVHST .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_QQVHST .c1 { color: #75715e } /* Comment.Single */
.pygmentize_QQVHST .cs { color: #75715e } /* Comment.Special */
.pygmentize_QQVHST .ge { font-style: italic } /* Generic.Emph */
.pygmentize_QQVHST .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_QQVHST .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_QQVHST .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_QQVHST .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_QQVHST .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_QQVHST .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_QQVHST .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_QQVHST .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_QQVHST .m { color: #ae81ff } /* Literal.Number */
.pygmentize_QQVHST .s { color: #e6db74 } /* Literal.String */
.pygmentize_QQVHST .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_QQVHST .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_QQVHST .nc { color: #a6e22e } /* Name.Class */
.pygmentize_QQVHST .no { color: #66d9ef } /* Name.Constant */
.pygmentize_QQVHST .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_QQVHST .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_QQVHST .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_QQVHST .nf { color: #a6e22e } /* Name.Function */
.pygmentize_QQVHST .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_QQVHST .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_QQVHST .nx { color: #a6e22e } /* Name.Other */
.pygmentize_QQVHST .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_QQVHST .nt { color: #f92672 } /* Name.Tag */
.pygmentize_QQVHST .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_QQVHST .ow { color: #f92672 } /* Operator.Word */
.pygmentize_QQVHST .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_QQVHST .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_QQVHST .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_QQVHST .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_QQVHST .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_QQVHST .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_QQVHST .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_QQVHST .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_QQVHST .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_QQVHST .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_QQVHST .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_QQVHST .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_QQVHST .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_QQVHST .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_QQVHST .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_QQVHST .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_QQVHST .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_QQVHST .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_QQVHST .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_QQVHST .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_QQVHST .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_QQVHST"><pre><span class="lineno">1</span> <span class="k">def</span> <span class="nf">cache_response_for</span><span class="p">(</span><span class="n">duration</span><span class="p">)</span>
<span class="lineno">2</span>   <span class="n">headers</span><span class="o">[</span><span class="s1">&#39;Rack-Cache-Response-For&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="n">duration</span>
<span class="lineno">3</span> <span class="k">end</span>
</pre></div>


<p>Boom. It was really that easy.</p>
<p><strong>Impact?</strong></p>
<p>This implementation took us only about an hour to develop and deploy, and the effects were immediate. Only 4% of these requests now fall-through to Rails, CPU usage on our API servers has plummeted, and total queries to our MongoDB cluster are down 78%. An hour well-spent. Our Redis cluster also doesn&#8217;t sweat its increased responsibility: its CPU usage is up just marginally!</p>
<p><strong>Join Us!</strong></p>
<p>Interested in working on these and other high-scale challenges?  We’re hiring!  Give us a shout at <a href="mailto:jobs@crashlytics.com">jobs@crashlytics.com</a>. You can stay up to date with all our progress on <a href="https://twitter.com/crashlytics" target="_blank">Twitter</a>, and <a href="https://www.facebook.com/Crashlytics" target="_blank">Facebook</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/reducing-mongodb-traffic-by-78-with-redis-caching/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Aaron Levie, Box&#8217;s CEO, Joins Crashlytics Advisory Board</title>
		<link>http://www.crashlytics.com/blog/aaron-levie-joins-crashlytics/</link>
		<comments>http://www.crashlytics.com/blog/aaron-levie-joins-crashlytics/#comments</comments>
		<pubDate>Thu, 25 Oct 2012 18:09:02 +0000</pubDate>
		<dc:creator>Jeff Seibert</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Industry]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1390</guid>
		<description><![CDATA[Today, we are excited to announce that that Aaron Levie, the CEO at Box, has joined Crashlytics' Advisory Board. Levie, named by Inc. as one of the Top 30 Entrepreneurs Under 30, has grown Box from his USC dorm room to an international heavy-weight that now serves 92% of the Fortune 500.]]></description>
				<content:encoded><![CDATA[<p><a href="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2012/10/52677v4-max-250x250.jpeg"><img class="alignright size-full wp-image-1395" title="Aaron Levie" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2012/10/52677v4-max-250x250.jpeg" alt="" width="172" height="250" /></a>Since starting Crashlytics just over <a href="http://techcrunch.com/2011/10/13/crashlytics-a-crash-reporting-solution-for-mobile-developers-raises-1-million/" target="_blank">one year ago</a> with my co-founder Wayne Chang, our mission has been clear: build tools that mobile developers love. Now, 14 months later, we&#8217;re both humbled and honored to be actively working with many of world&#8217;s top mobile apps &#8211; Square, Yelp, Groupon, Yammer, PayPal, OpenTable, Waze, HBO, Kayak, Orbitz, Hipmunk, Viddy, Socialcam, and thousands of other organizations.</p>
<p>Today, we are excited to announce that Aaron Levie, the CEO at Box, has joined Crashlytics&#8217; Advisory Board. Levie, named by Inc. as one of the Top 30 Entrepreneurs Under 30, has grown Box into an international powerhouse that now serves 92% of the Fortune 500.</p>
<p>Having raised over $284 million for Box, Levie is building the company for the long-term, to revolutionize how businesses collaborate and share content in the global marketplace.</p>
<blockquote><p>&#8220;The world of mobile has changed dramatically in just the past couple of years,&#8221; says Levie, &#8220;and with over 5 billion smartphones expected to be in use by 2016, nothing is slowing down.  The scale of this market shift radically changes how all applications are built, and requires a new set of tools for the Post-PC development process.  Crashlytics sits at the center of this critical part of the ecosystem.&#8221;</p></blockquote>
<p>The state of mobile development is still far from where it needs to be and we look forward to working with Aaron as we hone the next generation of mobile tools.</p>
<blockquote><p>&#8220;Jeff and Wayne are world-class entrepreneurs,&#8221; Levie concludes, &#8220;and undoubtedly are building an incredibly strong foundation to bring these tools to the masses.&#8221;</p></blockquote>
<p>Follow Aaron Levie at <a href="http://twitter.com/levie">@levie</a>, Wayne Chang at <a href="http://twitter.com/wayne">@Wayne</a>, and Jeff Seibert at <a href="http://twitter.com/jeffseibert">@jeffseibert</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/aaron-levie-joins-crashlytics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SLIDES: Building Backbone.js Apps for Scale</title>
		<link>http://www.crashlytics.com/blog/slides-building-backbone-js-apps-for-scale/</link>
		<comments>http://www.crashlytics.com/blog/slides-building-backbone-js-apps-for-scale/#comments</comments>
		<pubDate>Wed, 24 Oct 2012 15:56:24 +0000</pubDate>
		<dc:creator>Patrick Camacho</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Insight]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1384</guid>
		<description><![CDATA[We had a blast at last night's Backbone.js MeetUp. It was awesome to see such a thriving community here in Boston and to share share a few of the insights we've had here at Crashlytics about building scalable application with Backbone.js. The slides from our talk are up on SlideShare for viewing.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.slideshare.net/slideshow/embed_code/14868339"><img class="alignnone size-full wp-image-1559" alt="Building Backbone.js apps for scale" src="https://d1f4seebrc9wq7.cloudfront.net/blog/wp-content/uploads/2012/10/backbone.png" width="640" height="453" /></a></p>
<p>We had a blast at last night&#8217;s Backbone.js MeetUp &#8211; it&#8217;s great to see such a thriving community here in Boston and to share a few of the insights we&#8217;ve had here at Crashlytics about building scalable applications with Backbone.js. The slides from our talk are up on SlideShare for viewing.</p>
<p>We&#8217;re looking forward to the next MeetUp and continuing to work with the Boston Backbone community &#8211; if you have any feedback or want to get in touch, leave a comment below!</p>
<p><a href="http://www.slideshare.net/slideshow/embed_code/14868339">Check out the slides here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/slides-building-backbone-js-apps-for-scale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crashlytics Labs is proud to announce the release of Backbone.StateManager</title>
		<link>http://www.crashlytics.com/blog/crashlytics-labs-is-proud-to-announce-the-release-of-backbone-statemanager/</link>
		<comments>http://www.crashlytics.com/blog/crashlytics-labs-is-proud-to-announce-the-release-of-backbone-statemanager/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 20:36:18 +0000</pubDate>
		<dc:creator>Patrick Camacho</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[crashlyticslabs]]></category>
		<category><![CDATA[frontend]]></category>

		<guid isPermaLink="false">http://www.crashlytics.com/blog/?p=1307</guid>
		<description><![CDATA[Backbone.StateManager is an open-source module for Backbone.js that adds the ability to manage and utilize states in any size JavaScript application.]]></description>
				<content:encoded><![CDATA[<p>Backbone.js is a highly extensible framework that provides an MV* paradigm for Javascript applications that we use here at Crashlytics. Its lightweight architecture provides us a great foundation for building modular thick web clients. Backbone’s adaptability allows for the creation of addons and plugins to help tackle many of the problems faced when building a large scale JS application.</p>
<p>However, one of the problems we ran into while using Backbone at Crashlytics was the difficulty of managing the state of our application and its child components in a modular, scalable fashion. Whether it is choosing how to render a view on the DOM or conditionalizing the functionality of a model, the persistent nature of a web application requires a way to manage state-related logic.</p>
<p><strong>Enter Backbone.StateManager</strong></p>
<p>Backbone.StateManager is a module for Backbone.js that adds the ability to manage and utilize states in any size JavaScript application. It can be used as a stand alone object or in conjunction with a target object. Built on top of Underscore.js and Backbone.js, StateManager allows for modular state definitions, sub/pub architecture support with Backbone.Events, transition events between states, and regular expression matching.</p>
<p>Continuing our commitment to open source software, we&#8217;re happy to announce that Backbone.StateManager is available today on <a title="Backbone.statemanager on Github" href=" https://github.com/crashlytics/backbone.statemanager" target="_blank">Github.</a></p>
<p><strong>Getting Started</strong></p>
<p>The core functionality of StateManager is comprised of 3 simple methods: <em>addState</em>, <em>triggerState</em>, and <em>removeState</em>. Because StateManager extends Backbone.Events, it is also possible to subscribe to the object and listen as it sends out signals when moving between states.</p>
<p>Backbone.StateManager constructor takes two arguments, a state object and an options object, but neither is required. Passed in states will be automatically added and the options are set as an instance property.</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_0mKLNf  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_0mKLNf {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_0mKLNf .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_0mKLNf pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_0mKLNf span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_0mKLNf table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_0mKLNftable td, .pygmentize_0mKLNftable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_0mKLNf pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_0mKLNf {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_0mKLNf {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_0mKLNf td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_0mKLNf .hll { background-color: #49483e }
.pygmentize_0mKLNf  { background: #272822; color: #f8f8f2 }
.pygmentize_0mKLNf .c { color: #75715e } /* Comment */
.pygmentize_0mKLNf .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_0mKLNf .k { color: #66d9ef } /* Keyword */
.pygmentize_0mKLNf .l { color: #ae81ff } /* Literal */
.pygmentize_0mKLNf .n { color: #f8f8f2 } /* Name */
.pygmentize_0mKLNf .o { color: #f92672 } /* Operator */
.pygmentize_0mKLNf .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_0mKLNf .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_0mKLNf .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_0mKLNf .c1 { color: #75715e } /* Comment.Single */
.pygmentize_0mKLNf .cs { color: #75715e } /* Comment.Special */
.pygmentize_0mKLNf .ge { font-style: italic } /* Generic.Emph */
.pygmentize_0mKLNf .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_0mKLNf .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_0mKLNf .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_0mKLNf .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_0mKLNf .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_0mKLNf .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_0mKLNf .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_0mKLNf .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_0mKLNf .m { color: #ae81ff } /* Literal.Number */
.pygmentize_0mKLNf .s { color: #e6db74 } /* Literal.String */
.pygmentize_0mKLNf .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_0mKLNf .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_0mKLNf .nc { color: #a6e22e } /* Name.Class */
.pygmentize_0mKLNf .no { color: #66d9ef } /* Name.Constant */
.pygmentize_0mKLNf .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_0mKLNf .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_0mKLNf .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_0mKLNf .nf { color: #a6e22e } /* Name.Function */
.pygmentize_0mKLNf .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_0mKLNf .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_0mKLNf .nx { color: #a6e22e } /* Name.Other */
.pygmentize_0mKLNf .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_0mKLNf .nt { color: #f92672 } /* Name.Tag */
.pygmentize_0mKLNf .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_0mKLNf .ow { color: #f92672 } /* Operator.Word */
.pygmentize_0mKLNf .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_0mKLNf .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_0mKLNf .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_0mKLNf .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_0mKLNf .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_0mKLNf .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_0mKLNf .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_0mKLNf .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_0mKLNf .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_0mKLNf .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_0mKLNf .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_0mKLNf .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_0mKLNf .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_0mKLNf .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_0mKLNf .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_0mKLNf .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_0mKLNf .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_0mKLNf .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_0mKLNf .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_0mKLNf .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_0mKLNf .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_0mKLNf"><pre><span class="lineno"> 1</span> <span class="kd">var</span> <span class="nx">stateManager</span><span class="p">;</span>
<span class="lineno"> 2</span>
<span class="lineno"> 3</span> <span class="nx">stateManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">StateManager</span><span class="p">();</span>
<span class="lineno"> 4</span> <span class="c1">// or</span>
<span class="lineno"> 5</span> <span class="nx">stateManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">StateManager</span><span class="p">({</span>
<span class="lineno"> 6</span>   <span class="nx">foo</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno"> 7</span>     <span class="nx">enter</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno"> 8</span>       <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;enter bar&#39;</span><span class="p">);</span>
<span class="lineno"> 9</span>     <span class="p">},</span>
<span class="lineno">10</span>     <span class="nx">exit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">11</span>       <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;exit foo&#39;</span><span class="p">);</span>
<span class="lineno">12</span>     <span class="p">}</span>
<span class="lineno">13</span>   <span class="p">},</span>
<span class="lineno">14</span>   <span class="nx">bar</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno">15</span>     <span class="nx">enter</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">16</span>       <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;enter bar&#39;</span><span class="p">);</span>
<span class="lineno">17</span>     <span class="p">},</span>
<span class="lineno">18</span>     <span class="nx">exit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">19</span>       <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;exit bar&#39;</span><span class="p">);</span>
<span class="lineno">20</span>     <span class="p">}</span>
<span class="lineno">21</span>   <span class="p">}</span>
<span class="lineno">22</span> <span class="p">});</span>
</pre></div>


<p><strong>State Definitions</strong></p>
<p>A state is intended to be as modular as possible, so each state definition is expected to contain enter and exit methods that are used when entering or leaving that state. A state definition can also have a transitions property that contains several methods to be used when moving between specified states. There are 4 types of transitions that Backbone.StateManager will defaultly look for: <em>onBeforeExitTo</em>, <em>onExitTo</em>, <em>onBeforeEnterFrom</em>, and <em>onEnterFrom</em>. Each transition is a key value pair, where the value is a method and the key defines the transition type and the specified state (eg <em>onEnterFrom:specifiedState</em>).</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_Jz4JWB  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_Jz4JWB {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_Jz4JWB .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_Jz4JWB pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_Jz4JWB span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_Jz4JWB table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_Jz4JWBtable td, .pygmentize_Jz4JWBtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_Jz4JWB pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_Jz4JWB {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_Jz4JWB {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_Jz4JWB td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_Jz4JWB .hll { background-color: #49483e }
.pygmentize_Jz4JWB  { background: #272822; color: #f8f8f2 }
.pygmentize_Jz4JWB .c { color: #75715e } /* Comment */
.pygmentize_Jz4JWB .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_Jz4JWB .k { color: #66d9ef } /* Keyword */
.pygmentize_Jz4JWB .l { color: #ae81ff } /* Literal */
.pygmentize_Jz4JWB .n { color: #f8f8f2 } /* Name */
.pygmentize_Jz4JWB .o { color: #f92672 } /* Operator */
.pygmentize_Jz4JWB .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_Jz4JWB .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_Jz4JWB .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_Jz4JWB .c1 { color: #75715e } /* Comment.Single */
.pygmentize_Jz4JWB .cs { color: #75715e } /* Comment.Special */
.pygmentize_Jz4JWB .ge { font-style: italic } /* Generic.Emph */
.pygmentize_Jz4JWB .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_Jz4JWB .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_Jz4JWB .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_Jz4JWB .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_Jz4JWB .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_Jz4JWB .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_Jz4JWB .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_Jz4JWB .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_Jz4JWB .m { color: #ae81ff } /* Literal.Number */
.pygmentize_Jz4JWB .s { color: #e6db74 } /* Literal.String */
.pygmentize_Jz4JWB .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_Jz4JWB .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_Jz4JWB .nc { color: #a6e22e } /* Name.Class */
.pygmentize_Jz4JWB .no { color: #66d9ef } /* Name.Constant */
.pygmentize_Jz4JWB .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_Jz4JWB .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_Jz4JWB .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_Jz4JWB .nf { color: #a6e22e } /* Name.Function */
.pygmentize_Jz4JWB .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_Jz4JWB .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_Jz4JWB .nx { color: #a6e22e } /* Name.Other */
.pygmentize_Jz4JWB .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_Jz4JWB .nt { color: #f92672 } /* Name.Tag */
.pygmentize_Jz4JWB .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_Jz4JWB .ow { color: #f92672 } /* Operator.Word */
.pygmentize_Jz4JWB .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_Jz4JWB .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_Jz4JWB .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_Jz4JWB .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_Jz4JWB .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_Jz4JWB .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_Jz4JWB .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_Jz4JWB .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_Jz4JWB .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_Jz4JWB .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_Jz4JWB .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_Jz4JWB .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_Jz4JWB .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_Jz4JWB .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_Jz4JWB .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_Jz4JWB .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_Jz4JWB .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_Jz4JWB .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_Jz4JWB .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_Jz4JWB .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_Jz4JWB .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_Jz4JWB"><pre><span class="lineno"> 1</span> <span class="p">{</span>
<span class="lineno"> 2</span>   <span class="nx">enter</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno"> 3</span>     <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;enter&#39;</span><span class="p">);</span>
<span class="lineno"> 4</span>   <span class="p">},</span>
<span class="lineno"> 5</span>   <span class="nx">exit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno"> 6</span>     <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;exit&#39;</span><span class="p">);</span>
<span class="lineno"> 7</span>   <span class="p">},</span>
<span class="lineno"> 8</span>   <span class="nx">transitions</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno"> 9</span>     <span class="s1">&#39;onBeforeExitTo:anotherState&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
<span class="lineno">10</span>     <span class="s1">&#39;onExitTo:anotherState&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
<span class="lineno">11</span>     <span class="s1">&#39;onBeforeEnterFrom:anotherState&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{},</span>
<span class="lineno">12</span>     <span class="s1">&#39;onEnterFrom:anotherState&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{}</span>
<span class="lineno">13</span>   <span class="p">}</span>
<span class="lineno">14</span> <span class="p">}</span>
</pre></div>


<p><strong>Integration</strong></p>
<p>A benefit of StateManager is that it provides an easy method to painlessly add itself to any object. Through the use of the <em>addStateManager</em>, which takes a target object parameter, it reads in any states defined on the target, binds state methods to the target, and creates a new Backbone.StateManager. It also sets a number of convenience methods on the target, including <em>triggerState</em>, <em>getCurrentState</em>, and a reference to the StateManager at <em>target.stateManager</em>.</p>
<style type="text/css">


/* *************************************************** */
/* WordPress default theme "twenty-ten" compatibility: */
/* FIXME: Is there a way to limit these changes to pygmentize_t5jgjY  */
/*        without editing the WordPress theme directly? */
/* *************************************************** */

#content table {
}

#content table {
	border: 1px solid #e7e7e7;
    margin: 0 0 0 0;
	text-align: left;
	width: 100%;
}
#content tr th,
#content thead th {
	color: #888;
	font-size: 12px;
	font-weight: bold;
	line-height: 18px;
	padding: 0px;
}
#content tr td {
	border: 0px;
	padding: 0px;
	margin: 0px;
    margin-bottom: 0px;
    padding-bottom: 0px;

}

/* *************************************************** */
/* *************************************************** */

/* Standard fixes to the default output: */
.pygmentize_t5jgjY {
  margin: 15px 0;
}

/* Set the tab width in "ch" character units: */
.pygmentize_t5jgjY .tabspan {
  display: inline-block;
  width: 4ch;
}

.pygmentize_t5jgjY pre {
  border: 1px solid #777;

  /* The background: transparent is needed to work with WordPress:*/
  background: transparent;
  /* Default WordPress style has a big fat <pre> margin-bottom: */
  margin-bottom: 0px;

  /*color: #333333;*/
  font-size: .9em; 
  line-height: 1.25em;

  padding: 3px 2px;
  overflow: auto;
}

.pygmentize_t5jgjY span.lineno {
  color: #888 !important;
  text-shadow: none;
  padding 0px 7px;
}

/* When using line numbers, use 100% table width and no cellpadding: */
.pygmentize_t5jgjY table {
  width: 100%;
  border-spacing: 0px;
  border-collapse: collapse;
}


/*
#content table {
    border: 1px solid #E7E7E7;
    margin: 0 -1px 24px 0;
    text-align: left;
    width: 100%;
}
*/

.pygmentize_t5jgjYtable td, .pygmentize_t5jgjYtable th {
  padding: 0px;
  margin: 0px;
}

/* Add a little buffer so the monotype font doesn't bump directly against the edge: */
.pygmentize_t5jgjY pre {
  padding: .6ch;
  color: #F8F8F2;
}

/* This is more consistent with <p> tags... I didn't like it for my use: */
/*
div .pygmentize_t5jgjY {
    margin-bottom: 24px; 
}
*/

td.linenos.pygmentize_t5jgjY {
  width: 1ch;
  padding: .6ch;
  line-height: 1.25em;
}

.pygmentize_t5jgjY td {
  padding-right: 1px;
}


td.linenos { background-color: #f0f0f0; padding-right: 1px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
.pygmentize_t5jgjY .hll { background-color: #49483e }
.pygmentize_t5jgjY  { background: #272822; color: #f8f8f2 }
.pygmentize_t5jgjY .c { color: #75715e } /* Comment */
.pygmentize_t5jgjY .err { color: #960050; background-color: #1e0010 } /* Error */
.pygmentize_t5jgjY .k { color: #66d9ef } /* Keyword */
.pygmentize_t5jgjY .l { color: #ae81ff } /* Literal */
.pygmentize_t5jgjY .n { color: #f8f8f2 } /* Name */
.pygmentize_t5jgjY .o { color: #f92672 } /* Operator */
.pygmentize_t5jgjY .p { color: #f8f8f2 } /* Punctuation */
.pygmentize_t5jgjY .cm { color: #75715e } /* Comment.Multiline */
.pygmentize_t5jgjY .cp { color: #75715e } /* Comment.Preproc */
.pygmentize_t5jgjY .c1 { color: #75715e } /* Comment.Single */
.pygmentize_t5jgjY .cs { color: #75715e } /* Comment.Special */
.pygmentize_t5jgjY .ge { font-style: italic } /* Generic.Emph */
.pygmentize_t5jgjY .gs { font-weight: bold } /* Generic.Strong */
.pygmentize_t5jgjY .kc { color: #66d9ef } /* Keyword.Constant */
.pygmentize_t5jgjY .kd { color: #66d9ef } /* Keyword.Declaration */
.pygmentize_t5jgjY .kn { color: #f92672 } /* Keyword.Namespace */
.pygmentize_t5jgjY .kp { color: #66d9ef } /* Keyword.Pseudo */
.pygmentize_t5jgjY .kr { color: #66d9ef } /* Keyword.Reserved */
.pygmentize_t5jgjY .kt { color: #66d9ef } /* Keyword.Type */
.pygmentize_t5jgjY .ld { color: #e6db74 } /* Literal.Date */
.pygmentize_t5jgjY .m { color: #ae81ff } /* Literal.Number */
.pygmentize_t5jgjY .s { color: #e6db74 } /* Literal.String */
.pygmentize_t5jgjY .na { color: #a6e22e } /* Name.Attribute */
.pygmentize_t5jgjY .nb { color: #f8f8f2 } /* Name.Builtin */
.pygmentize_t5jgjY .nc { color: #a6e22e } /* Name.Class */
.pygmentize_t5jgjY .no { color: #66d9ef } /* Name.Constant */
.pygmentize_t5jgjY .nd { color: #a6e22e } /* Name.Decorator */
.pygmentize_t5jgjY .ni { color: #f8f8f2 } /* Name.Entity */
.pygmentize_t5jgjY .ne { color: #a6e22e } /* Name.Exception */
.pygmentize_t5jgjY .nf { color: #a6e22e } /* Name.Function */
.pygmentize_t5jgjY .nl { color: #f8f8f2 } /* Name.Label */
.pygmentize_t5jgjY .nn { color: #f8f8f2 } /* Name.Namespace */
.pygmentize_t5jgjY .nx { color: #a6e22e } /* Name.Other */
.pygmentize_t5jgjY .py { color: #f8f8f2 } /* Name.Property */
.pygmentize_t5jgjY .nt { color: #f92672 } /* Name.Tag */
.pygmentize_t5jgjY .nv { color: #f8f8f2 } /* Name.Variable */
.pygmentize_t5jgjY .ow { color: #f92672 } /* Operator.Word */
.pygmentize_t5jgjY .w { color: #f8f8f2 } /* Text.Whitespace */
.pygmentize_t5jgjY .mf { color: #ae81ff } /* Literal.Number.Float */
.pygmentize_t5jgjY .mh { color: #ae81ff } /* Literal.Number.Hex */
.pygmentize_t5jgjY .mi { color: #ae81ff } /* Literal.Number.Integer */
.pygmentize_t5jgjY .mo { color: #ae81ff } /* Literal.Number.Oct */
.pygmentize_t5jgjY .sb { color: #e6db74 } /* Literal.String.Backtick */
.pygmentize_t5jgjY .sc { color: #e6db74 } /* Literal.String.Char */
.pygmentize_t5jgjY .sd { color: #e6db74 } /* Literal.String.Doc */
.pygmentize_t5jgjY .s2 { color: #e6db74 } /* Literal.String.Double */
.pygmentize_t5jgjY .se { color: #ae81ff } /* Literal.String.Escape */
.pygmentize_t5jgjY .sh { color: #e6db74 } /* Literal.String.Heredoc */
.pygmentize_t5jgjY .si { color: #e6db74 } /* Literal.String.Interpol */
.pygmentize_t5jgjY .sx { color: #e6db74 } /* Literal.String.Other */
.pygmentize_t5jgjY .sr { color: #e6db74 } /* Literal.String.Regex */
.pygmentize_t5jgjY .s1 { color: #e6db74 } /* Literal.String.Single */
.pygmentize_t5jgjY .ss { color: #e6db74 } /* Literal.String.Symbol */
.pygmentize_t5jgjY .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.pygmentize_t5jgjY .vc { color: #f8f8f2 } /* Name.Variable.Class */
.pygmentize_t5jgjY .vg { color: #f8f8f2 } /* Name.Variable.Global */
.pygmentize_t5jgjY .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.pygmentize_t5jgjY .il { color: #ae81ff } /* Literal.Number.Integer.Long */

  </style>




<div class="pygmentize_t5jgjY"><pre><span class="lineno"> 1</span> <span class="kd">var</span> <span class="nx">View</span><span class="p">;</span>
<span class="lineno"> 2</span>
<span class="lineno"> 3</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
<span class="lineno"> 4</span>   <span class="nx">states</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno"> 5</span>     <span class="nx">foo</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno"> 6</span>       <span class="nx">enter</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno"> 7</span>         <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;enter bar&#39;</span><span class="p">);</span>
<span class="lineno"> 8</span>       <span class="p">},</span>
<span class="lineno"> 9</span>       <span class="nx">exit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">10</span>         <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;exit foo&#39;</span><span class="p">);</span>
<span class="lineno">11</span>       <span class="p">},</span>
<span class="lineno">12</span>       <span class="nx">transitions</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno">13</span>         <span class="s1">&#39;onExitTo:bar&#39;</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">14</span>           <span class="k">return</span> <span class="s1">&#39;just exited and bar is about to be entered&#39;</span><span class="p">;</span>
<span class="lineno">15</span>         <span class="p">}</span>
<span class="lineno">16</span>       <span class="p">}</span>
<span class="lineno">17</span>     <span class="p">},</span>
<span class="lineno">18</span>     <span class="nx">bar</span><span class="o">:</span> <span class="p">{</span>
<span class="lineno">19</span>       <span class="nx">enter</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">20</span>         <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;enter bar&#39;</span><span class="p">);</span>
<span class="lineno">21</span>       <span class="p">},</span>
<span class="lineno">22</span>       <span class="nx">exit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">23</span>         <span class="k">return</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;exit bar&#39;</span><span class="p">);</span>
<span class="lineno">24</span>       <span class="p">}</span>
<span class="lineno">25</span>     <span class="p">}</span>
<span class="lineno">26</span>   <span class="p">},</span>
<span class="lineno">27</span>   <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="lineno">28</span>     <span class="k">return</span> <span class="nx">Backbone</span><span class="p">.</span><span class="nx">StateManager</span><span class="p">.</span><span class="nx">addStateManager</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="lineno">29</span>   <span class="p">}</span>
<span class="lineno">30</span> <span class="p">});</span>
</pre></div>


<p><strong>Get It</strong></p>
<ul>
<li>
    <a href="https://raw.github.com/crashlytics/backbone.statemanager/master/src/backbone.statemanager.coffee" target="_blank">CoffeeScript</a>
  </li>
<li>
    <a href="https://raw.github.com/crashlytics/backbone.statemanager/master/backbone.statemanager.js" target="_blank">JavaScript</a>
  </li>
<li>
    <a href="https://raw.github.com/crashlytics/backbone.statemanager/master/backbone.statemanager.min.js" target="_blank">JavaScript (minified)</a>
  </li>
</ul>
<p><strong>Feedback Welcome</strong></p>
<p>Our goal is to make Backbone.StateManager as useful as possible for you to make writing powerful Backbone.js apps painless. We’re just getting started, and the feedback you provide is critical in achieving this. Please report bugs and discuss features on our Github issues page <a href="https://github.com/crashlytics/backbone.statemanager/issues">https://github.com/crashlytics/backbone.statemanager/issues</a>.</p>
<p><strong>Join the Team</strong></p>
<p>Interested in diving-deep into these and other workflow-enhancing challenges?  We’re hiring!  Give us a shout at <a href="mailto:jobs@crashlytics.com">jobs@crashlytics.com</a>. You can stay up to date with all our progress on <a href="https://twitter.com/crashlytics" target="_blank">Twitter</a>, <a href="https://www.facebook.com/Crashlytics" target="_blank">Facebook</a>, and <a href="https://plus.google.com/b/100381436838311785063/" target="_blank">Google+</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.crashlytics.com/blog/crashlytics-labs-is-proud-to-announce-the-release-of-backbone-statemanager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Database Caching 35/58 queries in 0.014 seconds using apc
Object Caching 720/1166 objects using apc
Content Delivery Network via Amazon Web Services: CloudFront: d1f4seebrc9wq7.cloudfront.net

 Served from: www.crashlytics.com @ 2013-05-18 10:09:17 by W3 Total Cache -->