<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>dev@courseadvisor</title>
	<atom:link href="http://courseadvisor.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://courseadvisor.wordpress.com</link>
	<description>The CourseAdvisor.com Developers Blog</description>
	<lastBuildDate>Fri, 08 May 2009 14:39:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='courseadvisor.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>dev@courseadvisor</title>
		<link>http://courseadvisor.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://courseadvisor.wordpress.com/osd.xml" title="dev@courseadvisor" />
	<atom:link rel='hub' href='http://courseadvisor.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Railsconf 2009 &#8211; Code quality analysis</title>
		<link>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-code-quality-analysis/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-code-quality-analysis/#comments</comments>
		<pubDate>Fri, 08 May 2009 14:22:33 +0000</pubDate>
		<dc:creator>dereky13</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[flay]]></category>
		<category><![CDATA[flog]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails 2009 keynote]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[roodi]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=134</guid>
		<description><![CDATA[On Thursday Martin Andrews gave a talk which I think covered similar ground to the metrics_fu talk of earlier in the week.  He dove into a subset of tools used by metrics_fu written by he and Ryan Davis, running these tests agains this own code, and then also running them against the rails code, just [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=134&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>On Thursday Martin Andrews gave a talk which I think covered similar ground to the metrics_fu talk of earlier in the week.  He dove into a subset of tools used by metrics_fu written by he and Ryan Davis, running these tests agains this own code, and then also running them against the rails code, just for fun.<br />
The tools he covered in detail were:</p>
<ul>
<li> rails stats &#8211; rake tasks to give summary tasks for rails application.  code to test ratio  &#8211; use for regular human review</li>
<li> reek &#8211; wiki.github.com/kevinrutherford/reek  &#8211; looks for code smells &#8211; use for regular human review</li>
<li> flog -  ruby.sadi.st/flog.html  &#8211; complexity checking of ruby code  using ABC Assignments, Branches, Conditionals</li>
<li> flay-   ruby.sadi.st/flay.html  &#8211; structural similiarity.  fine grained duplication checking&#8230;</li>
<li> roodi-  roodi.rubyforge.org &#8211; like checkstyle in java and joodi   &#8216;ruby object oriented design inforomiter&#8217; &#8211; looks for deign problems.</li>
</ul>
<p>A bunch of this is based on parsetree by Ryan davis that only works in 1.8, you need to use the RubyParser implementation for this to work in Ruby 1.9..</p>
<p>I&#8217;ve tried to run these against Rails 1.2.6 and 2.3.2 codebases, and it looks like flay needs rubygems 1.3.1 or greater.  Stats, reek, roodi and flog worked just fine for me.  Trying to run the whole of metric_fu hangs for me on churn right now in OSX, I may try to figure out how to remove churn, or hunt around for root cause, top of the stack is below</p>
<p>/opt/local/lib/ruby/gems/1.8/gems/jscruggs-metric_fu-1.0.1/lib/generators/churn.rb:68:in &#8220;&#8217;<br />
/opt/local/lib/ruby/gems/1.8/gems/jscruggs-metric_fu-1.0.1/lib/generators/churn.rb:68:in `get_logs&#8217;<br />
/opt/local/lib/ruby/gems/1.8/gems/jscruggs-metric_fu-1.0.1/lib/generators/churn.rb:37:in `parse_log_for_changes&#8217;</p>
<p>To install and run each of the tools by hand you can do the following or just sudo gem install metric_fu which does them all!</p>
<ul>
<li> stats   &#8211; sudo gem install stats &#8212; rake stats</li>
<li>reek    &#8211; sudo gem install reek  &#8212; find app -name &#8220;*.rb&#8221; | xargs reek</li>
<li> flog    &#8211; sudo gem install flog  &#8212; flog app  (or whatever directories you want to flog)</li>
<li> flay    &#8211; sudo gem install flog  &#8212; flay app  (or whatever directory you want to flay)</li>
<li> roodi   &#8211; sudo gem install roodi &#8212; roodi &#8220;app/**/*.rb&#8221;</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=134&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-code-quality-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d7ce587cae70c084b5966b8428e5974?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dereky13</media:title>
		</media:content>
	</item>
		<item>
		<title>Railsconf 2009 &#8211; testing javascript with blue ridge</title>
		<link>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-testing-javascript-with-blue-ridge/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-testing-javascript-with-blue-ridge/#comments</comments>
		<pubDate>Fri, 08 May 2009 14:09:10 +0000</pubDate>
		<dc:creator>dereky13</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[blue-ridge]]></category>
		<category><![CDATA[javascript testing]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=130</guid>
		<description><![CDATA[A great session on Wednesday was on javascript testing by the thinkrelevance guys, larry and jason.  They are advancing js testing by gluing together some existing libraries (smoke for mocking, screw-unit to run the tests, env-js to read the html fixture file and maybe some more) and writing some code of their own.  The tools [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=130&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A great session on Wednesday was on javascript testing by the thinkrelevance guys, larry and jason.  They are advancing js testing by gluing together some existing libraries (smoke for mocking, screw-unit to run the tests, env-js to read the html fixture file and maybe some more) and writing some code of their own.  The tools they&#8217;ve put together is blue-ridge (./script/plugin install blue_ridge git://github.com/relevance/blue-ridge) (./script/generate blue_ridge)</p>
<p>This was a fast moving talk, they paired up to turn a few TDD loops with some javascript code using the &#8216;ping-pong&#8217; methodology (one person writes a test, the other writes the bare minimum of code to make it pass).  We currently use developer and QA eyeball testing to ensure javascript works, which is pretty fragile.  As we dive more into TDD this stack could definitely be helpful.</p>
<p>This plugin uses the screw unit framework and allows you to run javascript tests in the command line.  there is a blueridge textmate bundle which lets you kick off test runs from within textmate.</p>
<p>One of coolest things is the ability to produce an .html file out of a particular test suite run that contains the code to run the tests.  You then are able to launch this html page in a multitude of browsers to make sure your javascript still works.  End to end cross browser testing js is definitely needed and personally would&#8217;ve saved us lots and time and money with random IE 6.0.x version bugs.</p>
<p>Lastly they&#8217;ve made a runcodedun continuous integration plugin that can work in cruise control, a cherry on top here.</p>
<p>slides for this talk are here (github.com/karnowski/blue-ridge-tmbundle) and some notes by another railsconfer (I think dirty_frank) are here (http://pastie.org/469178)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/130/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=130&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/08/railsconf-2009-testing-javascript-with-blue-ridge/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d7ce587cae70c084b5966b8428e5974?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dereky13</media:title>
		</media:content>
	</item>
		<item>
		<title>Notes on UI Fundamentals for Programmers by Ryan Singer</title>
		<link>http://courseadvisor.wordpress.com/2009/05/07/notes-on-ui-fundamentals-for-programmers-by-ryan-singer/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/07/notes-on-ui-fundamentals-for-programmers-by-ryan-singer/#comments</comments>
		<pubDate>Thu, 07 May 2009 22:22:26 +0000</pubDate>
		<dc:creator>mdeane</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[37signals]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[programmers]]></category>
		<category><![CDATA[Ryan Singer]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=37</guid>
		<description><![CDATA[Ryan Singer of 37signals, discussed concepts to understand how to implement UI for applications. 1. MODELING: This session began by highlighting that UI is a layer of Software. It’s not an independent property. From a customers point of view, the UI is the entire application. So start with UI first, not the implementation. The example [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=37&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ryan Singer of 37signals, discussed concepts to understand how to implement UI for applications.</p>
<h3>1. MODELING:</h3>
<p>This session began by highlighting that UI is a layer of Software. It’s not an independent property. From a customers point of view, the UI <strong>is</strong> the entire application. So start with UI first, not the implementation.</p>
<p>The example used throughout the session was a course booking form which included multiple participants, a calendar feature, who goes to the course and on which day. For a simple form, the design is about how it works and not necessarily how flashy or color heavy it is. This concept in my opinion can be translated site wide.</p>
<p>Ryan along with a designer engaged in an open conversation to define key parts of UI that aren&#8217;t shown.</p>
<p>Compared to the old form which consisted of about 20-30% text, the new redesign was 70% text. Ryan stressed that terseness is not valued in UI.</p>
<p>By starting with a model that is defined by conversations between developing parties, this allowed for an implementation that makes sense to customers and begins to reflect partials. The result was a distilled and logically consistent design; it makes sense to customer which is reflected in code as well.</p>
<p>One book Ryan recommended was <cite><a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" title="Domain Driven Design">Domain Driven Design, by Eric Evans</a></cite> which covers bringing a more universal language between customer, designer and developer.</p>
<h3>2. SCREENS:</h3>
<p>REST conventions can apply to UI design when dividing screens and screen content. Customers understand general group categories such as &ldquo;show all&rdquo;, &ldquo;edit&rdquo; or &ldquo;submit&rdquo;. By focusing from inside out, you begin with what matters to the person that is actually using this screen. Err on side of too much on one screen.</p>
<p>Another book Ryan recommended was <cite><a href="http://www.edwardtufte.com/tufte/books_vdqi" title="The Visual Display of Quantitative Information">The Visual Display of Quantitative Information, by the great Edward Tufte</a></cite>.</p>
<p>Edward Tufte takes a very scientific approach to design and promotes the least effective difference for maximum effectiveness</p>
<h4 style="margin-bottom:15px;">Below are my iterations of some of the examples Ryan provided:</h4>
<p>Emphasizing and de-emphasizing elements on page allows for less scanning. Minimal!!!</p>
<div style="background-color:#e3e3e3;margin-bottom:3px;padding:5px;">
<div style="text-align:center;background-color:#fff;padding-top:15px;">
<table cellspacing="0" style="border:1px solid #000;font-size:18px;margin:0 auto 15px;">
<tbody>
<tr>
<td style="border:1px solid #000;padding:8px 13px;">1</td>
<td style="border:1px solid #000;padding:8px 13px;">2</td>
<td style="border:1px solid #000;padding:8px 13px;">3</td>
<td style="border:1px solid #000;padding:8px 13px;">4</td>
</tr>
<tr>
<td style="border:1px solid #000;padding:8px 13px;">5</td>
<td style="border:1px solid #000;padding:8px 13px;">6</td>
<td style="border:1px solid #000;padding:8px 13px;">7</td>
<td style="border:1px solid #000;padding:8px 13px;">8</td>
</tr>
</tbody>
</table>
<p>vs.</p>
<table cellspacing="1" style="font-size:18px;margin:0 auto 15px;">
<tbody>
<tr>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">1</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">2</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">3</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">4</td>
</tr>
<tr>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">5</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">6</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">7</td>
<td style="background-color:#d7d7d7;color:#fff;padding:8px 13px;">8</td>
</tr>
</tbody>
</table>
</div>
</div>
<p style="margin-bottom:30px;color:#999;"><cite>ex. Table of data – What is the least we could for the information to make sense and visually appealing? Simplicity can make scanning cognitively easier for customers to choose from available options.</cite></p>
<p>Nothing is equal. Define the most and least important elements. Using the least effective differences creates a calming effect allowing the viewer to easily to jump from section to section.</p>
<div style="background-color:#e3e3e3;margin-bottom:3px;padding:5px;">
<div style="text-align:center;background-color:#fff;padding-top:15px;">
<table cellspacing="1" style="text-align:center;font-size:18px;margin:0 auto 15px;">
<tbody>
<tr>
<td style="background-color:#33ff00;color:#fff;width:50px;padding:8px 0;">1</td>
<td style="background-color:#33ff00;color:#fff;width:50px;padding:8px 0;">2</td>
<td style="background-color:#ff3300;color:#fff;width:50px;padding:8px 0;">3</td>
<td style="background-color:#33ff00;color:#fff;width:50px;padding:8px 0;">4</td>
</tr>
</tbody>
</table>
<p>vs.</p>
<table cellspacing="1" style="background-color:#fff;text-align:center;font-size:18px;margin:0 auto 15px;">
<tbody>
<tr>
<td style="background-color:#d7d7d7;color:#fff;width:50px;padding:8px 0;">1</td>
<td style="background-color:#d7d7d7;color:#fff;width:50px;padding:8px 0;">2</td>
<td style="background-color:#ff3300;color:#fff;width:50px;padding:8px 0;">3</td>
<td style="background-color:#d7d7d7;color:#fff;width:50px;padding:8px 0;">4</td>
</tr>
</tbody>
</table>
</div>
</div>
<p style="margin-bottom:30px;color:#999;"><cite>ex. Once again, least effective solution can make for a more visually appealing application.</cite></p>
<div style="background-color:#e3e3e3;margin-bottom:3px;padding:5px;">
<div style="font-size:18px;text-align:center;background-color:#fff;padding:15px 0;">
<p><strong>Strong</strong></p>
<p>Normal</p>
<p style="color:#ccc;margin-bottom:0;">Weak</p>
</div>
</div>
<p style="margin-bottom:30px;color:#999;"><cite>ex. Contrast is an eye attractor.</cite></p>
<h3>ACTIONS:</h3>
<p>The main concept Ryan wanted to stress under actions is every action has a beginning, middle and end. Set clear expectations between different steps.</p>
<h3>TEMPLATES:</h3>
<p>Ryan recommended not using any HTML in your helpers. If you do include html in your helpers, don’t prematurely extract and only extract when you are completely sure(ex. error confirmation txt). Use helpers to reveal intention.</p>
<p>CSS and JS can also follow the same REST-inspired convention. Keeping templates and elements clear and concise.</p>
<h3>RECAP:</h3>
<ul>
<li>Base everything on a model</li>
<li>Be explicit and use a lot of language</li>
<li>Break screens out with REST conventions</li>
<li>Designing screens from inside out</li>
<li>Use least effective difference to control priority on the screen</li>
<li>Think of action in three parts</li>
<li>Keep templates clear</li>
</ul>
<p>Overall I felt this was a great session to help programmers create more effective and visually pleasing applications that work. Thanks Ryan!</p>
<p>Ryan&#8217;s email address is Ryan Singer @ rjs.tumblr.com</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=37&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/07/notes-on-ui-fundamentals-for-programmers-by-ryan-singer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/2dc55d472b2f4bb6da83ec2b3a7e61b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mdeane</media:title>
		</media:content>
	</item>
		<item>
		<title>Sinatra, a Ruby microframework</title>
		<link>http://courseadvisor.wordpress.com/2009/05/06/sinatra-a-ruby-microframework/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/06/sinatra-a-ruby-microframework/#comments</comments>
		<pubDate>Thu, 07 May 2009 00:01:50 +0000</pubDate>
		<dc:creator>reidlynch</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[rack sinatra]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=36</guid>
		<description><![CDATA[I had the pleasure of attending the Sinatra tutorial at RailsConf &#8217;09. Given by the creator of Sinatra, Blake Mizerany, the talk gave a great introduction to the framework, and a good bottom-up perspective on web application stacks in general. What is Sinatra? Sinatra is built on Rack and simplifies the structure and process of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=36&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I had the pleasure of attending the <a href="http://sinatrarb.com">Sinatra</a> tutorial at RailsConf &#8217;09.  Given by the creator of Sinatra, Blake Mizerany, the talk gave a great introduction to the framework, and a good bottom-up perspective on web application stacks in general.</p>
<p><strong>What is Sinatra?</strong><br />
Sinatra is built on <a href="http://rack.rubyforge.org/">Rack</a> and simplifies the structure and process of developing web applications.  Requests are handled blocks identified by request slug and HTTP verb, fitting nicely into the RESTful model.  Each block simply returns a string, which is rendered to the browser.  Sinatra allows for hierarchical templates and views, but in general breaks with the MVC paradigm used by Rails and a multitude of other web frameworks.</p>
<p><strong>Is it good for non-trivial applications?</strong><br />
Despite its simplicity, Sinatra proves to be quite extensible, both through the web server stack and at the application level.  This is largely thanks to Ruby and Rack.  Modifying requests before they reach a Sinatra app, or after a response is returned, is as simple as adding pieces of Rack middleware.  Within a Sinatra app, the pattern of adding useful code modules namespaced in a lib directory facilitates extensibility and modularity in without bogging down the framework&#8217;s simplicity.  Furthermore, this simplicity and less-is-more approach allows for any ORM or Javascript library to be used at will.</p>
<p><strong>When might you use Sinatra?</strong><br />
How many times have you (and I) created a new rails app just to try or demonstrate really simple behavior?  It&#8217;s a perfect tool for quickly stubbing out projects, letting one naturally build features as needed.  Think about how this affects the cognitive process of development &#8211; how often do we tarnish ideas by tying them to an opinionated framework?  But is Sinatra just a toy &#8211; is it production ready?  Some have already done this, with good results.  Sinatra&#8217;s simplicity also means speed &#8211; there&#8217;s very little you don&#8217;t need.  Rails was once not thought to be appropriate for important applications.  In many ways Sinatra takes Rails&#8217; strengths and pushes them further.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=36&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/06/sinatra-a-ruby-microframework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2a9f85a8110530b0496a6a6c420412?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Reid Lynch</media:title>
		</media:content>
	</item>
		<item>
		<title>Notes on David Heinemeier Hansson&#8217;s Keynote at RailsConf 2009</title>
		<link>http://courseadvisor.wordpress.com/2009/05/05/notes-on-david-heinemeier-hanssons-keynote-at-railsconf-2009/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/05/notes-on-david-heinemeier-hanssons-keynote-at-railsconf-2009/#comments</comments>
		<pubDate>Tue, 05 May 2009 17:41:27 +0000</pubDate>
		<dc:creator>cwade</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[keynote]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails 2009 keynote]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=28</guid>
		<description><![CDATA[These are my notes on David Heinemeier Hansson&#8217;s (aka DHH&#8217;s) keynote at RailsConf 2009. Rails hasn&#8217;t changed all that much DHH has been working with Rails for 5 years now. He&#8217;s realized that we&#8217;re largely doing the same things now that we were doing 5 years ago &#8211; the fundamental principles are basically the same. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=28&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>These are my notes on David Heinemeier Hansson&#8217;s (aka DHH&#8217;s) keynote at RailsConf 2009.</p>
<p><strong>Rails hasn&#8217;t changed all that much</strong></p>
<p>DHH has been working with Rails for 5 years now. He&#8217;s realized that we&#8217;re largely doing the same things now that we were doing 5 years ago &#8211; the fundamental principles are basically the same.</p>
<ul>
<li>He thinks we should all stop fretting about whether we&#8217;re up-to-date with the latest and the greatest. He was looking at some old Rails code a few days ago and found that it&#8217;s not that stale.</li>
<li>Realize that you can still enjoy Rails without knowing every new thing</li>
<li>You don&#8217;t need to rewrite your app every time something new comes out</li>
</ul>
<p><strong>Supposed Rails-killers</strong></p>
<p>Over the years, there have been several things that were supposedly Rails killers</p>
<ul>
<li>Not enterprise-ready</li>
<li>Opposite criticism &#8211; Rails is incredibly relevant &#8211; just need to find the components (e.g. scaffolding) that work and clone them (Sails, PHP on Rails, Grails, Monorails)</li>
<li>High-profile &#8220;switch backs&#8221;:</li>
</ul>
<ol>
<li>Derek Sivers (of CD Baby) <a href="http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html">blog post on why he switched back to PHP from Rails</a>.</li>
<li>The &#8220;fail whale&#8221; (image you see when Twitter goes down)</li>
</ol>
<ul>
<li>Internal struggles &#8211; Array first, second, third..forty-two methods debate. Debate wasn&#8217;t about that &#8211; it was a philosophical debate. Merb brought this to light too.</li>
</ul>
<p>But Rails is still here and still going strong. Rate of improvement is accelerating but still convening around the same core principles. That doesn&#8217;t mean we should learn from these challenges but we need to chill out. Most of these debates aren&#8217;t that important &#8211; what does matter will come through.</p>
<p><strong>The Fundamentals Principles of Rails</strong></p>
<p>We need to recognize the fundamental philosophies that make us the Rails community and that will persist in Rails 3:</p>
<ul>
<li>&#8220;We&#8217;re going to lock up all the unicorns&#8221; &#8211; Rails 3 is not a complete re-write, will not solve everyone&#8217;s problems. Need to recognize that we can&#8217;t get all of those unicorns out of their cages. Don&#8217;t get sucked into the world of all the magical possibilities.</li>
<li>&#8220;We&#8217;re not going to have holy cows&#8221; &#8211; Also recognize that nothing is sacred in Rails &#8211; everything is up for debate. Your arguments will need to be very persuasive to get us to make big changes, but nothing is set in stone.</li>
<li>&#8220;Have it your way&#8221; &#8211; Just because we all have minor individual differences, it doesn&#8217;t mean we can&#8217;t all come together. Most of the time for most of the people, they want to just write web applications. We can allow people to make their individual choices and still be together in one community.</li>
</ul>
<p><strong>Progress of Rails 3</strong></p>
<p>Goal had been an alpha release at Rails 3. That&#8217;s not happening, but there is a lot of code in the repository already. Here are some of the new features:</p>
<ul>
<li>New Router &#8211; It&#8217;s faster. It can route by subdomains, user agents, and other stuff. Working Rack into the routes so that you can mount multiple applications at the same time. Rails&#8217; routing API hasn&#8217;t changed in a long time. It was designed in a pre-REST time period for Rails. Router has been re-designed with that in mind (wycats and dkubb both just commented on the #railsconf IRC channel that the new router looks very similar to Merb&#8217;s router).</li>
<li>XSS (Cross-site scripting) protection &#8211; This is a type of <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">code injection security attack</a>. Rails 3 is changed to escape everything by default &#8211; you have to mark output as &#8216;raw&#8217; to <em>not</em> escape it. This is something Rails avoided for a while because it seemed cumbersome but then the Django guys did it and it seemed to work well, so Rails is copying that.</li>
<li>JavaScript goes unobtrusive and agnostic &#8211; The notion of unobtrusive javascript bubbled up a couple years ago &#8211; idea that javascript should be separated out from HTML. DHH thought this was a good idea in theory but a terrible idea in practice at first because it seemed like a hassle. In Rails 3 they&#8217;re adopting the HTML 5 standard of custom attributes. (I kind of missed the rest of what he was saying here)</li>
<li>More agnosticism &#8211; Action ORM &#8211; slim proxy wrapper around other ORMs. He also said something about generators I didn&#8217;t quite catch.</li>
<li>The great refactoring &#8211; Most of the work is in places that people won&#8217;t notice it. A lot of folks have been working on cleaning up the internals:</li>
</ul>
<ol>
<li>Abstract Controler + Action Dispatch</li>
<li>Active Relation underpins Active Record using relational algebra</li>
<li>Cherry picking from Active Support</li>
<li>Speedy callbacks</li>
</ol>
<p><strong>The real secret to high productivity</strong></p>
<p>In the early days DHH was able to get a lot done, working on Basecamp alone even though he only had 10 hours a week to spend on it. He doesn&#8217;t feel like he&#8217;s been as productive since then.</p>
<p>What was the key?</p>
<p>Developers need to renegotiate requirements &#8211; most developers treat requirements as holy commandments. Maybe we shouldn&#8217;t accept these stone tablets, maybe what the stakeholders are telling us to do isn&#8217;t really what you should do. It&#8217;s okay to say &#8220;let&#8217;s do something else instead.&#8221; As programmers, we so often want to be loved and thus are unwilling to challenge authority. Everything turned out just right with Basecamp because it needed to be &#8211; nobody had enough time to spend on it so it wasn&#8217;t engineered to be overly complex. They &#8220;cut corners&#8221; by simplifying, but ended up with a much better system as a result of less ambitious requirements. Not as flexible, but very fast, very simple, and good enough. The term &#8220;programmer&#8221; implies some kind of machine that outputs code, &#8220;partner&#8221; is a better term.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=28&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/05/notes-on-david-heinemeier-hanssons-keynote-at-railsconf-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0809c9d2a7b1dd7d861239d8a737d1c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cwade</media:title>
		</media:content>
	</item>
		<item>
		<title>Railsconf 2009 Tutorial &#8211; Testing Design and Refactoring</title>
		<link>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-testing-design-and-refactoring/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-testing-design-and-refactoring/#comments</comments>
		<pubDate>Tue, 05 May 2009 16:20:43 +0000</pubDate>
		<dc:creator>dereky13</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[Connascence]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=19</guid>
		<description><![CDATA[Monday 1-5pm, Jim Weirich, Joe O&#8217;Brien Great session broken into two parts, first section was some intro stuff on OO Design and principals, and some more depth on some topics like Cohesion, SOLID http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx and software connascence.  Jim indicated a cancellation later in the week opened up the spot for him to give a whole [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=19&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Monday 1-5pm, Jim Weirich, Joe O&#8217;Brien</p>
<p>Great session broken into two parts, first section was some intro stuff on OO Design and principals, and some more depth on some topics like Cohesion, SOLID <a title="SOLID" href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx" target="_blank">http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx</a> and software connascence.  Jim indicated a cancellation later in the week opened up the spot for him to give a whole talk on degrees of connascence, should be a good one.  Then overviewed some topics from Fowler&#8217;s Refactoring book, bad smells, speculative generality, ect.</p>
<p>The second half of the session was spent going through an application Jim and Joe had prepared that was a dice rolling application, with a number of refactorable items.  They handed out the code, complete with suites of fully passing  shoulda and cucumber tests, and after the break told the group to go nuts and refactor it up, using earlier smells if possible.</p>
<p>So of course my unit tests wouldn&#8217;t run, neither did anyones around me, luckilly someone discovered you had to install RSpec as a plugin and not as a gem, to make the suite actually run, luckilly I hung out during the break and had the entire 2nd half to mess around with the application.</p>
<p>So Joe wandered around during the session and Jim was helping folks as well, but the real interesting and great part of the session was that you had random people pair programming, there were people asking questions out loud where I was sitting, and people answering with solutions or ideas on how to refactor.</p>
<p>At one point Jim indicated he wanted to de-factor the code, ie make it refactorable, but they really didnt have to.  This was an interesting admission, that if you do Red-Green and skip refactor, you can end up with some smelly code.</p>
<p>I&#8217;ve used Test::Unit and RSpec so the Shoulda piece was tractable, but man trying to figure out legal syntax for cucumber without ever having used the DSL was a bit tough.</p>
<p>Highs:</p>
<ul>
<li>Jim&#8217;s a great speaker, and had great ideas on good OO Design, always fun to watch.  Joe did a nice job as well, and the interplay between the 2 hosts cutting each other off was kinda funny.</li>
<li>Jim and Joe obviously had put a ton of time into this session.  They built an entire dice rolling application, built up 100+ tests, packaged all the gems needed, ect.  This made the session work, people in the room could discuss a common codebase, a great move.  In other breakouts where you are told &#8216;well now work on your own code&#8217; you don&#8217;t get this community effect of people helping others on a common codebase.</li>
</ul>
<p>Lows:</p>
<ul>
<li>Power problems again, the daisy chaining 89 power strips together&#8217;s fatal flaw was revealed when twice the entire right side of the room was killed because someone stepped on the powerstip button, grrrrr.</li>
<li>Standard configuration problems getting a full working environment.  The nikogiri gem which was native was frozen in.</li>
<li>It would have been helpful to get a quick 10 minute primer on the syntax of Cucumber and Shoulda.  They really weren&#8217;t listed as tools prior to the session, so I spent a bunch of time messing around with them in the blind during the 2nd half of the session.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=19&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-testing-design-and-refactoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d7ce587cae70c084b5966b8428e5974?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dereky13</media:title>
		</media:content>
	</item>
		<item>
		<title>Railsconf 2009 Tutorial &#8211; Configuration Management with Chef</title>
		<link>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-configuration-management-with-chef/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-configuration-management-with-chef/#comments</comments>
		<pubDate>Tue, 05 May 2009 14:07:33 +0000</pubDate>
		<dc:creator>dereky13</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[chef]]></category>
		<category><![CDATA[knife]]></category>
		<category><![CDATA[poolparty]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=11</guid>
		<description><![CDATA[Session was 9-12 on Monday by Edd Dumbill I&#8217;ve never used Chef before (http://wiki.opscode.com/display/chef/Home), but had done some light reading about it.  We&#8217;re currently using Capistrano to push code and configurations, and some homegrown ruby scripts integrated with svn to create nightly release candidates (2009-05-rc-1.. ect), push those to staging, and when we&#8217;re ready make [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=11&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Session was 9-12 on Monday by Edd Dumbill</p>
<p>I&#8217;ve never used Chef before (<a title="chef homepage" href="http://wiki.opscode.com/display/chef/Home" target="_blank">http://wiki.opscode.com/display/chef/Home</a>), but had done some light reading about it.  We&#8217;re currently using Capistrano to push code and configurations, and some homegrown ruby scripts integrated with svn to create nightly release candidates (2009-05-rc-1.. ect), push those to staging, and when we&#8217;re ready make the &#8216;release&#8217; branch.</p>
<p>The one piece that I dont control is the kickstart of machines, I need to rely on the ops team for that, and it seems that I could install Apache through Capistrano (haven&#8217;t tried it), but Chef&#8217;s approach to configuration files seems pretty cool.  You basically make an erb template for various sections of the httpd.conf file (theres a huge library of &#8216;cookbooks&#8217; <a title="opscode cookbooks" href="http://github.com/opscode/cookbooks" target="_blank">http://github.com/opscode/cookbooks</a> to do apache installs, memcached installs, ect.. that you basically override with your own site-cookbook to tweak).  So if you for example want to add a vhost to your 10 different apache machines, you change the template generating the vhost section, add another named host, and have chef repush the apache configs, and it will generate an additional VirtualHosts area with the new information, pretty cool.</p>
<p>Theres a client/server mode as well as chef-solo, and you an run the client as a deamon to check in with the server every hour for changes.  This deamon seems cool but I have to admit it scares the heck out of me, polling and changing production hourly, perhaps its an uncomfort I would learn to live with, but having my servers asking for changes in production and then auto-applying them, seems scary.  I&#8217;ll probably start with solo, where you have push-button deploys.</p>
<p>The Web GUI is good for high level overview of components, I fired up webistrano at one point but there were some built in assumptions about how you managed your servers that just didnt work for us, cant remember what they were&#8230;  One odd thing about the UI is the fact that to edit parameters you click on the client in question and get a window with a ton of JSON, it works but you really have to know what you&#8217;re looking for in there ahead of time, decent learning curve.</p>
<p>Although Edd did not align Chef as competition to Capistrano, he did spend a bunch of time on chef_deploy, which on the surface does a number of the same things as Capistrano.</p>
<p>The Highs:</p>
<ul>
<li>Chef seems to have handled the OS qurikiness, ie install apache here on OSX, install there on Debian, install there on Redhat, through the cookbooks and a nice abstraction layer using ohai to poll the OS for info.</li>
<li>chef-solo and chef_deploy and chef, lots of good options there about how to manage your environment, looks like you can kickstart, deploy an app, config it and startup in one script, pretty cool.</li>
<li>Cool addons like :</li>
<li>Knife that supplies a RESTful API to manage remotely ( flashed this url <a title="knife snippet" href="http://gist.github.com/104080" target="_blank">http://gist.github.com/104080</a>) ,</li>
<li>poolparty (poolpartyrb.com) to help manage in the Cloud</li>
<li>search feature using ferret that lets you query stuff like &#8216;hey what IP addresses are running Apache?&#8217;</li>
<li> tons of default cookbooks, if you have a vanilla install or are starting fresh, you may not have much code to write at all.</li>
</ul>
<p>The Lows:</p>
<ul>
<li>No power strips in the room at all!!  WTF, I actually took notes using a pen and paper when my battery flatlined, how analog.</li>
<li>Edd was kinda tough to understand at times, and was unfortunately plagued with the demo deamons and couldn&#8217;t get his VM clients to recognize the network intially so the very simple demo didnt work until the second half burning some time up front.</li>
<li>As stated above, have a perfectly working Capistrano setup.  We&#8217;ll have to see how the community handles Jamis&#8217; departure from Capistrano, I&#8217;m sure I&#8217;m not the only one facing this.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=11&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/05/railsconf-2009-tutorial-configuration-management-with-chef/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d7ce587cae70c084b5966b8428e5974?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dereky13</media:title>
		</media:content>
	</item>
		<item>
		<title>Dude, We&#8217;re at Railsconf</title>
		<link>http://courseadvisor.wordpress.com/2009/05/05/dude-were-at-railsconf/</link>
		<comments>http://courseadvisor.wordpress.com/2009/05/05/dude-were-at-railsconf/#comments</comments>
		<pubDate>Tue, 05 May 2009 13:13:49 +0000</pubDate>
		<dc:creator>dereky13</dc:creator>
				<category><![CDATA[railsconf-2009]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[railsconf]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=7</guid>
		<description><![CDATA[I think that &#8216;dude im at railsconf&#8217; is the theme this year.  It may replace acts_as or _fu, I think we may make a dude_im_at_soa_addons plugin soon The CourseAdvisor Site-Dev team is here and we&#8217;re trying to fan out as much as possible and post about the sessions attended so we can look back in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=7&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I think that &#8216;dude im at railsconf&#8217; is the theme this year.  It may replace acts_as or _fu, I think we may make a dude_im_at_soa_addons plugin soon <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The CourseAdvisor Site-Dev team is here and we&#8217;re trying to fan out as much as possible and post about the sessions attended so we can look back in 6 months and remember what cool tool to get Chef working in the cloud was (poolparty), and so folks that couldn&#8217;t make it have session highlights.  Oh and to justify to the bosses that we werent hitting the blackjack tables too hard (to that person who hit on 14 with the dealer showing a 5 and got upset when they got the dealer&#8217;s Queen), I am going to find you, and it&#8217;s not going to be pretty.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=7&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2009/05/05/dude-were-at-railsconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d7ce587cae70c084b5966b8428e5974?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">dereky13</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8216;fresh_cookies&#8217; plugin released</title>
		<link>http://courseadvisor.wordpress.com/2008/02/13/fresh_cookies-plugin-released/</link>
		<comments>http://courseadvisor.wordpress.com/2008/02/13/fresh_cookies-plugin-released/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 22:47:46 +0000</pubDate>
		<dc:creator>reidlynch</dc:creator>
				<category><![CDATA[plugins]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://development.courseadvisor.com/?p=5</guid>
		<description><![CDATA[CourseAdvisor&#8217;s site, like many web applications, uses cookies to store a user&#8217;s state information. We, along with many others in the Rails community, were unsatisfied with the default cookie behavior, in which data written to a cookie cannot be read until the subsequent request. Rails&#8217; generally intuitive behavior is seemingly absent with cookies, as the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=5&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>CourseAdvisor&#8217;s site, like many web applications, uses cookies to store a user&#8217;s state information.  We, along with many others in the Rails community, were unsatisfied with the default cookie behavior, in which data written to a cookie cannot be read until the subsequent request.  Rails&#8217; generally intuitive behavior is seemingly absent with cookies, as the following demonstrates:<br />
<pre class="brush: ruby;">
def cookie_set
  cookies['foo'] = 'bar'
  return cookies['foo'] == 'bar'
end</pre><br />
Rather than return true, the above method rather frustratingly returns <tt>false</tt>.    Our <a href="http://courseadvisor.rubyforge.org/fresh_cookies" target="_blank"><tt>fresh_cookies</tt></a> gem transparently alters this behavior to what one would expect, such that the above method returns <tt>true</tt>.</p>
<p>The gem can be found at <a href="http://courseadvisor.rubyforge.org" target="_blank">CourseAdvisor&#8217;s RubyForge page</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/courseadvisor.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/courseadvisor.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=5&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2008/02/13/fresh_cookies-plugin-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2a9f85a8110530b0496a6a6c420412?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Reid Lynch</media:title>
		</media:content>
	</item>
		<item>
		<title>Aspect-Oriented Programming Rails plugin released</title>
		<link>http://courseadvisor.wordpress.com/2007/11/06/aspect-oriented-programming-rails-plugin-released/</link>
		<comments>http://courseadvisor.wordpress.com/2007/11/06/aspect-oriented-programming-rails-plugin-released/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 22:38:49 +0000</pubDate>
		<dc:creator>cwade</dc:creator>
				<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://courseadvisor.wordpress.com/2007/11/06/aspect-oriented-programming-rails-plugin-released/</guid>
		<description><![CDATA[Aspect-oriented programming is a programming paradigm that enables programmers to separate out crosscutting concerns (e.g. logging, sending email) from the flow of application logic, resulting in cleaner and more scalable code. Today CourseAdvisor has released a simple plugin that adds aspect-oriented programming capabilities to Rails. This plugin enables programmers to: define custom events of interest [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=4&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aspect-oriented programming is a programming paradigm that enables programmers to separate out crosscutting concerns (e.g. logging, sending email) from the flow of application logic, resulting in cleaner and more scalable code.</p>
<p>Today CourseAdvisor has released a simple plugin that adds aspect-oriented programming capabilities to Rails. This plugin enables programmers to:</p>
<ul>
<li>define custom events of interest in arbitrary locations</li>
<li>automatically log these events, if desired</li>
<li>define behavior relating to cross-concerns in a single place</li>
<li>untangle program control code to free it of unrelated code belonging to event points of interest</li>
<li>use the built-in observer mechanism to keep the implementation clean and simple</li>
</ul>
<p>More information to follow soon, with sample code&#8230;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/courseadvisor.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/courseadvisor.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/courseadvisor.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/courseadvisor.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/courseadvisor.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=courseadvisor.wordpress.com&amp;blog=1841452&amp;post=4&amp;subd=courseadvisor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://courseadvisor.wordpress.com/2007/11/06/aspect-oriented-programming-rails-plugin-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0809c9d2a7b1dd7d861239d8a737d1c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cwade</media:title>
		</media:content>
	</item>
	</channel>
</rss>
