<?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>The Brian Olore Story &#187; railsconf</title>
	<atom:link href="http://brian.olore.net/wp/tag/railsconf/feed/" rel="self" type="application/rss+xml" />
	<link>http://brian.olore.net</link>
	<description>Less of a story, more of a brain dump</description>
	<lastBuildDate>Sun, 18 Dec 2011 17:19:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>RailsConf &#8211; Day 3 &#8211; Lightning talks</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-3-lightning-talks/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-3-lightning-talks/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 21:48:56 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[lightning]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=190</guid>
		<description><![CDATA[Brian C &#8211; DNC http://github/dnclabs - client_side_validations &#8211; gem that does client side validation for rails - takes AR validations &#8211; serves them via json &#8211; used by jquery.validate how to kill rails github.com/michel bad practices by a few rails developers Don&#8217;t reduce yourself to $20/hr, stick to your price, delivery quality Communication is important! [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Brian C &#8211; DNC</strong></p>
<p>http://github/dnclabs</p>
<p>- client_side_validations &#8211; gem that does client side validation for rails<br />
- takes AR validations &#8211; serves them via json &#8211; used by jquery.validate</p>
<p><strong>how to kill rails</strong><br />
github.com/michel<br />
bad practices by a few rails developers<br />
Don&#8217;t reduce yourself to $20/hr, stick to your price, delivery quality<br />
Communication is important!</p>
<p><strong>Democracy.com</strong><br />
Raimond Garcia<br />
Revolutionize Democracy<br />
Parsed Congress web page &#8211; created a prototype on heroku in 48 hours<br />
legal palitical party in spain &#8211; &#8220;partido de internet&#8221;</p>
<p><strong>What&#8217;s new in RSpec-2</strong><br />
David Chelimsky<br />
in beta right now<br />
Old rspec won&#8217;t work with Rails 3<br />
doesn&#8217;t work with rails &lt; 3 (yet)</p>
<p>http://github.com/rspec</p>
<p>$rspec spec<br />
modularized, rspec-core is built on micronaut</p>
<p><strong><span id="more-190"></span>Surveyor gem</strong><br />
Mark Yoon<br />
Surveys in your Rails app<br />
write surveys in DSL<br />
exmaple Kitchen Sink survey<br />
dates, ranges, plck any, grids, multiple answers<br />
needs: admin ui, validations in UI, Rails3 support</p>
<p>http://github.com/breakpointer/surveyor</p>
<p><strong>MySQL is awesome</strong></p>
<p>@igrigorik<br />
Don&#8217;t believe all the NoSQL hype</p>
<p>http://bit.ly/bgi1Wf</p>
<p>more flexibility in the relational model<br />
em-proxy gem &#8211; tcp level proxy<br />
- used to rewrite SQL queries on the fly</p>
<p><strong>Michael Hartl</strong><br />
railstutorial.org<br />
Joy of publishing online<br />
goal &#8211; write a source file, publish HTML &amp; PDF with syntax highlighting &amp; linking to other sections<br />
PolyyTeXnic<br />
HTML &amp; PDF stay in sync</p>
<p><strong>Jake Scruggs </strong><br />
@jakescruggs<br />
ActiveMQ &amp; ActiveMessaging<br />
Mostly a Java shop, so not Resque, delayed job<br />
sending messages is easy<br />
pass id&#8217;s NOT serialized objects<br />
Tips:<br />
- Tell ActiveMessage to not be greedy<br />
- Namespace your queues<br />
- Name your pollers<br />
- Double Kill &#8211; Die Poller Die &#8211; script/poller run vs script/poller start</p>
<p><strong>Greg Nelson</strong><br />
foreign assistance</p>
<p>http://bit.ly/RwandaOnRails</p>
<p><strong>Jim Rumsick (Big Tiger)- HashRocket</strong><br />
Improv &#8211; Comedy to Coding<br />
Programming is about communication</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-3-lightning-talks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 3 &#8211; Persistence Smoothie</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-3-persistence-smoothie/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-3-persistence-smoothie/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 19:34:36 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[datamapper]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=188</guid>
		<description><![CDATA[Persistence Smoothie &#8211; Blending SQL &#38; NoSQL &#8211; Flip Sasser (Intridea, Inc.) @flipsasser http://github.com/flipsasser/Persistence-Smoothie NoSQL means no ACID Keep what you know &#8211; don&#8217;t throw out your MySQL DataMapper is the swiss army knife of ORM - can point different models to different datastores - Have a lot of refactoring to do Sample Store App [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/11245">Persistence Smoothie &#8211; Blending SQL &amp; NoSQL</a> &#8211; <a href="http://en.oreilly.com/rails2010/public/schedule/speaker/81272">Flip  Sasser</a> (Intridea, Inc.)<br />
@flipsasser</p>
<p>http://github.com/flipsasser/Persistence-Smoothie</p>
<p>NoSQL means no ACID<br />
Keep what you know &#8211; don&#8217;t throw out your MySQL</p>
<p>DataMapper is the swiss army knife of ORM<br />
- can point different models to different datastores<br />
- Have a lot of refactoring to do</p>
<p>Sample Store App<br />
- Authentication &#8211; keep in Reational DB<br />
- Products &#8211; store metadata<br />
- Purchases &#8211; keep it in RDB<br />
- Activity Stream &#8211; denormalize with key/value store</p>
<p>mongofy &#8211; gem for moving data from mysql to mongo</p>
<p>Drawbacks<br />
- DataPortability is lowered<br />
- Lot more moving parts<br />
- Say goodbye to all your fun AR mixins</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-3-persistence-smoothie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 3 &#8211; Introduction to Cassandra and CassandraObject</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-3-intro-to-cassandra/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-3-intro-to-cassandra/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 18:40:35 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[cassandraobject]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=184</guid>
		<description><![CDATA[Introduction to Cassandra and CassandraObject &#8211; Michael Koziarski (Koziarski Software Limited) Scales linearly &#8211; increases not only read access, but also write access A ColumnFamily per query CassandraObject - Mostly AR compatible - In flux - taking patches]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/14740">Introduction to Cassandra and CassandraObject</a> &#8211; <a href="http://en.oreilly.com/rails2010/public/schedule/speaker/4847">Michael  Koziarski</a> (Koziarski Software Limited)</p>
<p>Scales linearly &#8211; increases not only read access, but also write access</p>
<p>A ColumnFamily per query</p>
<p>CassandraObject<br />
- Mostly AR compatible<br />
- In flux<br />
- taking patches</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-3-intro-to-cassandra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 3 &#8211; Redis, Rails and Resque</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-3-resque/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-3-resque/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 17:52:55 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[resque]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=181</guid>
		<description><![CDATA[Redis, Rails, and Resque &#8211; Background Job Bliss &#8211; Chris Wanstrath (GitHub) redis is a key value store for data structures redis is not use for everything because entire dataset used to have to fit into RAM &#8211; would have to shard across machines github &#8211; uses redis for routing, can add, remove.modify routes quickly [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/14595">Redis, Rails, and Resque &#8211; Background Job Bliss</a> &#8211; <a href="http://en.oreilly.com/rails2010/public/schedule/speaker/45877">Chris  Wanstrath</a> (GitHub)<br />
redis is a key value store for data structures</p>
<p>redis is not use for everything because entire dataset used to have to fit into RAM &#8211; would have to shard across machines</p>
<p>github &#8211; uses redis for routing, can add, remove.modify routes quickly &amp; easily &#8211; can determine what server to put new users on, etc</p>
<p>Old &#8211; HAProxy sending to mongrels<br />
New &#8211; Unicorn &#8211; instead of receiving requests, it asks for one using &#8216;select&#8217;, pooled, forks similar to passenger</p>
<p>Used 6 or 7 different bg &#8211; SQS, DelayedJob<br />
Used Delayed job for 2 years</p>
<p>resque is built on redis, jobs are serialized to json and workers can be in any language http://github.com/defunkt/resque</p>
<p>resque has a plugin API &#8211; 15 or so plugins already exist &#8211; http://wiki.github.com/defunkt/resque/plugins</p>
<p>has admin interface</p>
<p>github has 35 types of background jobs</p>
<p>Notes: lightning fast talker! Lots of good information though. I&#8217;d have a beer with this guy!</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-3-resque/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 3 &#8211; Million Dollar Mongo</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-3-million-dollar-mongo/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-3-million-dollar-mongo/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:44:59 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[monogodb]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=178</guid>
		<description><![CDATA[Million Dollar Mongo - Obie Fernandez (Hashrocket), Durran Jordan (Hashrocket) mongo was a good choice because only one patient record was worked on at a time get entire object graph in a single query previously did 35 joins and took 20 minutes to return comparison between mongo, couch &#38; cassandra big selling point was dynamic [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/11265">Million Dollar Mongo</a> -<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/2747"> Obie  Fernandez</a> (Hashrocket),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/70573">Durran  Jordan</a> (Hashrocket)<br />
mongo was a good choice because only one patient record was worked on at a time</p>
<p>get entire object graph in a single query<br />
previously did 35 joins and took 20 minutes to return</p>
<p>comparison between mongo, couch &amp; cassandra<br />
big selling point was dynamic queries &#8211; nice happy medium when coming from relational databases<br />
&#8220;I don&#8217;t want to write any more ****** XML, so goodbye Cassandra&#8221;</p>
<p>No universal agreement that a NOSQL solution was the right idea</p>
<p>&#8220;Easiest database to install ever (except maybe Redis)&#8221;<br />
No schema migrations</p>
<p>Forked MongoMapper -&gt; Monoid<br />
- MongoMapper was very young</p>
<p>Mongoid<br />
- Prefers Embedding Documents<br />
- Atomic Operations by Default, based on attribute changes<br />
- rich criteria api<br />
- master/slave suppor<br />
- simple versioning<br />
- is NOT ActiveRecord (and should be treated as such)<br />
- Features always have performance in mind</p>
<p>mongo &#8211; can index in background as of 1.4<br />
regex queries on fields<br />
Denormalization is acceptable, embed as much as possible (no FK constraints)</p>
<p>Hybrid DB model<br />
- Hierarchical Data Stored in MongoDB<br />
- Relational Data stored in MySQL<br />
- Data that required transactions stored in MySQL<br />
- Simple Data in Redis<br />
- Favor suitability over simplicity</p>
<p>It&#8217;s ok to use more than one datastore</p>
<p>Working without transactions<br />
- Atomic updates generally cover you<br />
- fairly easy to roll your own optimistic locking<br />
- need to do manual rollback in integration tests<br />
- selenium tests can run in a separate process</p>
<p>in production<br />
- deployed on engine yard cloud / ec2<br />
- 0.5 TB of data<br />
- put mongodb on it&#8217;s own utility space<br />
- feed it lots of ram, lots of disk space<br />
- chef scripts easy due to simple installation</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-3-million-dollar-mongo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 2 &#8211; MongoDB Metamorphosis</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-2-mongodb/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-2-mongodb/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 21:51:21 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=173</guid>
		<description><![CDATA[The MongoDB Metamorphosis: Data as Documents &#8211; Kyle Banker (10gen) http://try.mongodb.com &#8211; mini tutorial MongoDB tries to fit between key-value stores &#38; relational databases Data as Documents &#8211; documents are in BSON (binary json) mongoDB operates on documents using special syntax update() takes a query and an update (what to do) .. the update is [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/12005">The MongoDB Metamorphosis: Data as Documents</a> &#8211; <a href="http://en.oreilly.com/rails2010/public/schedule/speaker/74347">Kyle  Banker</a> (10gen)</p>
<p><a href="http://try.mongodb.com">http://try.mongodb.com</a> &#8211; mini tutorial</p>
<p>MongoDB tries to fit between key-value stores &amp; relational databases</p>
<p>Data as Documents &#8211; documents are in BSON (binary json)</p>
<p>mongoDB operates on documents using special syntax</p>
<p>update() takes a query and an update (what to do) .. the update is applied to the results of the query</p>
<p>Embedded documents &#8211; i.e. Comments become embedded within Posts<br />
Or you can normalize &#8211; Post id within each comment<br />
Decisions to be made on what makes most sense for how you need to access the data</p>
<p>Embedded &#8211; fast queries, document always appears with parent</p>
<p>Hash is the object used to represent MongoDB objects</p>
<p>MongoMapper</p>
<p>Very informational, I want to try using this!</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-2-mongodb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 2 &#8211; Beyond git push heroku</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-2-heroku/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-2-heroku/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 19:41:53 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=169</guid>
		<description><![CDATA[Beyond Git Push Heroku: Battle Stories from Cloud Samurais &#8211; Oren Teich (Heroku), Morten Bagai (Heroku) heroic had down time this morning, so we&#8217;ll talk about that for a bit then resume our normal schedule use something similar to nagios problem was occurring somewhere in http stack form hypothesis &#38; find a way to test [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/15351">Beyond Git Push Heroku: Battle Stories from Cloud  Samurais</a> &#8211; <a href="http://en.oreilly.com/rails2010/public/schedule/speaker/61693">Oren  Teich</a> (Heroku),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/25593">Morten   Bagai</a> (Heroku)<br />
heroic had down time this morning, so we&#8217;ll talk about that for a bit then resume our normal schedule<br />
use something similar to nagios<br />
problem was occurring somewhere in http stack<br />
form hypothesis &amp; find a way to test it quickly and in a non-disruptive manner &#8211; don&#8217;t want to make the problem worse<br />
disabled misbehaving systems &#8211; took them out of the cluster &#8211; didn&#8217;t turn off, wanted to diagnose</p>
<p>2 of the 3 cofounders here in room<br />
Do one thing well &#8211; deploy a rails application onto the web<br />
$git push heroku master<br />
let developers use tools to deploy that they are already using<br />
&#8220;No step 1&#8243;</p>
<p>heroku stacks &#8211; let&#8217;s you target a version of a vm &amp; libraries that you want to target &#8211; linux version, ruby, etc</p>
<p>http://docs.heroku.com/rails3</p>
<p>http://www.scvngr.com</p>
<p>http://www.syphir.com</p>
<p>http://getcloudapp.com</p>
<p>pandastream &#8211; cloud based video encoding</p>
<p>Anything can be a cloud service as long as it&#8217;s deployed in the same infrastructure &#8211; memcached, monogohq, etc</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-2-heroku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 2 &#8211; What should we work on next?</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-2-work-on-next/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-2-work-on-next/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 18:34:08 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=164</guid>
		<description><![CDATA[What should we work on next? &#8211; Brian Doll (New Relic) My note: this is probably a sales pitch on RPM, but at least I know that gong in Performance is value Apdex &#8211; how your customers feel about the service they are getting &#8211; how satisfied they are Awesome &#8220;Knuth is my homeboy&#8221; image [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/15388">What should we work on next?</a> &#8211; Brian Doll (New Relic)</p>
<p>My note: this is probably a sales pitch on RPM, but at least I know that gong in <img src='http://brian.olore.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>Performance is value</li>
<li>Apdex &#8211; how your customers feel about the service they are getting &#8211; how satisfied they are</li>
<li>Awesome &#8220;Knuth is my homeboy&#8221; image with appropriate quote: &#8220;premature optimization is the root of all evil&#8221;</li>
<li>Nice charts to compare metrics vs 24 hours ago, a week ago, a month ago</li>
</ul>
<p>My note: I was right, and now I am bored&#8230;but I am going to go read about <a href="http://lucene.apache.org/solr/">solr</a></p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-2-work-on-next/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 2 &#8211; Metrics Magic</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-2-metrics-magic/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-2-metrics-magic/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 16:28:48 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=159</guid>
		<description><![CDATA[Metrics Magic - Aaron Bedra (Relevance, Inc.) &#8211; maintains rcov How did we get here? Technical Debt &#8211; but there is no bailout program! Good idea if you intend on paying back. Metrics are a great way to facilitation conversation It&#8217;s ok to ask others how/why the code was written if its hard to write [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.oreilly.com/rails2010/public/schedule/detail/11500">Metrics Magic</a> -<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/2634"> Aaron  Bedra</a> (Relevance, Inc.) &#8211; maintains <a href="http://github.com/relevance/rcov">rcov</a></p>
<p>How did we get here?<br />
Technical Debt &#8211; but there is no bailout program! Good idea if you intend on paying back.</p>
<p>Metrics are a great way to facilitation conversation<br />
It&#8217;s ok to ask others how/why the code was written</p>
<p>if its hard to write tests around your code, that&#8217;s a smell</p>
<p>output of metrics tools is just text &#8211; you can make these metrics tool fail the build !</p>
<p>There&#8217;s no substitute for peer review</p>
<p><strong>rcov</strong> can fail the build by setting &#8220;&#8211;failure-threshold n&#8221;<br />
- should increase the threshold as your code coverage goes up so that you know when it drops</p>
<p><strong>reek</strong> &#8211; fail the build by capturing the output<br />
result = %x{reek app lib}<br />
exit 1 unless result.empty?</p>
<p><strong>flog</strong> -<br />
flog app  awk &#8216;NR==4&#8242; | awk &#8216;{print $1}&#8217;<br />
exit 1 if result.gsub(&#8220;:&#8221;,&#8221;").to_i &gt;= 20</p>
<p><strong>metric-fu</strong><br />
wraps tests in pretty pictures</p>
<p>Compare charts to previous sprints &#8211; generate conversation</p>
<p>Great presentation materials &#8211; cartoony, fun<br />
Good speaker, useful demo</p>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-2-metrics-magic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf &#8211; Day 2 &#8211; Building an API with Rails panel</title>
		<link>http://brian.olore.net/wp/2010/06/railsconf-day-2-api/</link>
		<comments>http://brian.olore.net/wp/2010/06/railsconf-day-2-api/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:42:50 +0000</pubDate>
		<dc:creator>Brian</dc:creator>
				<category><![CDATA[work]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://brian.olore.net/?p=151</guid>
		<description><![CDATA[Building an API with Rails Panel  &#8211; http://en.oreilly.com/rails2010/public/schedule/detail/14502 Panelists: Joe Ferris (thoughtbot, inc), Jeremy Kemper (37signals), Marcel Molina (Twitter), Rick Olson (GitHub), Derek Willis (The New York Times) Authentication OAuth 1.0 spec is difficult to implement &#8211; signature difficulties, etc OAuth 2 uses ssl &#38; tokens &#8211; much simpler to implement, has overhead of SSL [...]]]></description>
			<content:encoded><![CDATA[<p>Building an API with Rails Panel  &#8211; http://en.oreilly.com/rails2010/public/schedule/detail/14502</p>
<p>Panelists:<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/45872"> Joe  Ferris</a> (thoughtbot, inc),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/21443">Jeremy  Kemper</a> (37signals),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/82428">Marcel  Molina</a> (Twitter),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/2757">Rick  Olson</a> (GitHub),  	 	  		<a href="http://en.oreilly.com/rails2010/public/schedule/speaker/17183">Derek  Willis</a> (The New York Times)</p>
<p><strong>Authentication</strong></p>
<ul>
<li>OAuth 1.0 spec is difficult to implement &#8211; signature difficulties, etc</li>
<li>OAuth 2 uses ssl &amp; tokens &#8211; much simpler to implement, has overhead of SSL</li>
</ul>
<p><strong>Input &amp; Response Formats</strong></p>
<ul>
<li>Hoptoad now only supports XML &#8211; because they are write heavy and use streaming they were able to simplify their interface and make it faster by dropping support for other formats</li>
<li>NYTimes &#8211; XML &amp; JSON, expanded formats based on user needs</li>
<li>Twitter &#8211; XML, JSON, RSS, Atom &#8211; probably going to move towards JSON only to scale up &#8211; XML is too verbose &#8211; lots of memcache full of XML fragments</li>
<li>37signals &#8211; uses RJS</li>
</ul>
<p><strong>To Version or Not to Version<br />
</strong></p>
<ul>
<li>Twitter &#8211; hard problem &#8211; fork with multiple deploys? Inheritance? &#8211; lots of work. What do we need versioning for? Lotsa stuff we thought needed versioning actually didn&#8217;t. Looking for tips on how to do easily.</li>
<li>37signals &#8211; is it really a problem?  If you think it needs a new versions, just make it a new resource</li>
<li>How do you support legacy &#8211; 37signals: Given enough lead time application developers can deal with it fairly quickly (1 month).</li>
<li>Hoptoad &#8211; no matter how many people you tell, they won&#8217;t upgrade. You won&#8217;t loose as may people as you think. People don&#8217;t upgrade until something is broken.</li>
<li>Twitter &#8211; explosion of resources could be a problem. Implement new option/param/header to allow people to get new functionality during transition period. Look at analytics &amp; how much time has passed then take out conditional and drop previous. &#8220;It&#8217;s going to break if you don&#8217;t upgrade.&#8221;</li>
<li>NYTimes &#8211; &#8220;we&#8217;re shutting this off in 3 months&#8221;</li>
</ul>
<p><strong>Scaling</strong></p>
<ul>
<li>NYTimes uses <a href="http://www.mashery.com">mashery</a> and <a href="http://www.engineyard.com/blog/2010/varnish-its-not-just-for-wood-anymore/">varnish</a></li>
<li>37signals &#8211; reverse proxy caching, usage patterns of API are usually very different than patterns of web traffic</li>
<li>Twitter &#8211; cache not only fragments, but fragments of fragments &#8211; so that the more volatile stuff can expire without losing the more static data. Consider a streaming API instead of having users continuously poll. (mentioned &#8220;Cache Money&#8221; which I had to google cuz it&#8217;s a sweet name: http://github.com/nkallen/cache-money/tree/master)</li>
<li>Github &#8211; take advantage of HTTP headers &amp; caching</li>
</ul>
<p><strong>Code Separation</strong></p>
<ul>
<li>Should there be a separation between your web &amp; api code?</li>
<li>Github &#8211; API code was in same code as controllers &#8211; became separate API controller &#8211; looking at moving to a Sinatra app</li>
<li>Twitter &#8211; used to be DRY and works great for most applications. web/mobile/api encapsulated in respond to&#8217;s. Different code for rate limits, etc, &#8220;became unruly&#8221;, merge conflicts when split across teams, etc. Now they duplicate, but it&#8217;s not that bad because of skinny controllers &amp; fat models.</li>
<li>37signals &#8211; just because twitter does it, doesn&#8217;t mean you have to. Much much easier to keep API in same code, should be exception to separate &#8211; this is why respond_to exists.</li>
</ul>
<p><strong>Security Concerns</strong></p>
<ul>
<li>Twitter &#8211; &#8220;You&#8217;re going to get screwed no matter how awesome you are. And it&#8217;s a really hard problem.&#8221;</li>
<li>Github: Don&#8217;t use cookies &amp; sessions in your API requests</li>
<li>37signals &#8211; don&#8217;t worry about authenticating (use oauth) worry about authorization</li>
</ul>
<p><strong>Developer Communications</strong></p>
<ul>
<li>Twitter &#8211; Tools &amp; documentation &#8211; Page for &#8220;Is there a problem with the system?&#8221; &#8211; portal for developers</li>
<li>Hoptoad &#8211; make sure your documentation is correct &amp; up to date!</li>
<li>37signals &#8211; Don&#8217;t just put up a mailing list.</li>
<li>NYTimes &#8211; use your own API &#8211; build samples &amp; actually use/run them</li>
<li>Github &#8211; documentation is actually stored in git</li>
<li>37signals &#8211; dogfooding</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://brian.olore.net/wp/2010/06/railsconf-day-2-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

