<?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>Mark Cipolla</title>
	<atom:link href="http://markcipolla.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://markcipolla.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Aug 2010 02:16:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Guide to WordPress&#8217; Custom Write Panels</title>
		<link>http://markcipolla.com/writings/guide-to-wordpress-custom-write-panels/</link>
		<comments>http://markcipolla.com/writings/guide-to-wordpress-custom-write-panels/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 02:13:34 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[Custom Write Panels]]></category>
		<category><![CDATA[SitePoint]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=287</guid>
		<description><![CDATA[Over at SitePoint, I&#8217;ve just published my latest post: A Guide to WordPress&#8217; Custom Write Panels. That’s where Custom Write Panels come in: they let you create slick-looking panels that allow users to enter all the additional information you want for a post. These &#8216;can help you leverage the power of WordPress 3.0&#8242;s custom post [...]]]></description>
			<content:encoded><![CDATA[<p>Over at <a title="SitePoint" href="http://www.sitepoint.com" target="_blank">SitePoint</a>, I&#8217;ve just published my latest post: A Guide to WordPress&#8217; Custom Write Panels.</p>
<blockquote><p>That’s where Custom Write Panels come in: they let you create  slick-looking panels that allow users to enter all the additional  information you want for a post.</p></blockquote>
<p>These &#8216;can help you leverage the power of WordPress 3.0&#8242;s  custom post types to even greater effect. (And I) show you how to wield  them, so your clients will see you as a true WordPress wizard.</p>
<p>To have a read, <a title="A Guide to WordPress' Custom Write Panels" href="http://www.sitepoint.com/blogs/2010/08/26/guide-to-wordpress-custom-write-panels/" target="_blank">check it out</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/guide-to-wordpress-custom-write-panels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Front-end Optimization from the Get-go, Part 2</title>
		<link>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-2/</link>
		<comments>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-2/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 06:26:40 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Optimising]]></category>
		<category><![CDATA[SitePoint]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=279</guid>
		<description><![CDATA[I just published the second of a series of posts over at SitePoint about wrangling every ounce of performance form your CSS. In any web page, the order that your browser downloads your content is simple: it retrieves the HTML, which tells it the other files to request from your server, while your CSS provides [...]]]></description>
			<content:encoded><![CDATA[<p>I just published the second of a series of posts over at SitePoint about wrangling every ounce of performance form your CSS.</p>
<blockquote><p>In any web page, the order that your browser downloads your content  is simple: it retrieves the HTML, which tells it the other files to  request from your server, while your CSS provides all the styling to  make it display as needed.</p>
<p>Improving front-end performance is shown to have an impact on overall  conversion, including click-through rates, average time on site, sales,  and even <a href="http://www.mattcutts.com/blog/site-speed/" target="_blank">Google rankings</a>.</p></blockquote>
<p><a href="http://www.sitepoint.com/blogs/2010/08/03/front-end-optimization-from-the-get-go-part-2/" target="_blank">Have a read</a>. I think I&#8217;ve covered some interesting points.</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Front-end Optimization from the Get-go, Part 1</title>
		<link>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-1/</link>
		<comments>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-1/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 05:16:18 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Front-End]]></category>
		<category><![CDATA[HTML / XHTML / HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Optimising]]></category>
		<category><![CDATA[SitePoint]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=271</guid>
		<description><![CDATA[Over at SitePoint, I just published the first of a series of posts about optimising your website for speed. A web page will make many requests. The first is for the HTML of the page you’re viewing. From that, your browser will request more resources to display the page. A single request has two phases: [...]]]></description>
			<content:encoded><![CDATA[<p>Over at <a title="SitePoint" href="http://www.sitepoint.com">SitePoint</a>, I just published the first of a series of posts about optimising your website for speed.</p>
<blockquote><p>A web page will make many requests. The first is for the HTML of the page you’re viewing. From that, your browser will request more resources to display the page. A single request has two phases: your browser asks for a file–be it an image, a CSS file, or a JavaScript file–and waits to hear back; then it downloads what the browser sends. Therefore, there are two optimizations that can be made: by decreasing the number of requests, you reduce the amount of time the browser spends waiting to hear back from the server; and by limiting the file sizes of the objects being requested, your browser downloads less information to display a page.</p></blockquote>
<p><a href="http://www.sitepoint.com/blogs/2010/07/26/web-frontend-optimization-from-the-get-go-part1/">An overview of the posts to come, so have a read</a>, but I delve into the nature of requests (and how browsers handle them), and optimising CSS/JS/Images.</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/front-end-optimization-from-the-get-go-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Illustrator CS5: New Features</title>
		<link>http://markcipolla.com/writings/adobe-illustrator-cs5-new-features/</link>
		<comments>http://markcipolla.com/writings/adobe-illustrator-cs5-new-features/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 07:43:47 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[CS5]]></category>
		<category><![CDATA[Illustrator]]></category>
		<category><![CDATA[SitePoint]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=263</guid>
		<description><![CDATA[I&#8217;ve started blogging over at SitePoint, and did a bit of a write up on a couple of the features of Adobe Illustrator CS5. With the latest incarnation of the Adobe Suite, Illustrator CS5 brings a slew of new features and improvements to one of my favorite apps. Thankfully, Adobe has considered what worked and, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve started blogging over at <a href="http://www.sitepoint.com">SitePoint</a>, and did a bit of a write up on a couple of the features of Adobe Illustrator CS5.</p>
<blockquote><p>With the latest incarnation of the Adobe Suite, Illustrator CS5 brings a slew of new features and improvements to one of my favorite apps.</p>
<p>Thankfully, Adobe has considered what worked and, more importantly, what did not: the main feature additions center on actual drawing.</p></blockquote>
<p><a href="http://www.sitepoint.com/blogs/2010/07/13/adobe-illustrator-cs5-new-features/">Have a read</a></p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/adobe-illustrator-cs5-new-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualising Builds</title>
		<link>http://markcipolla.com/writings/visualising-builds/</link>
		<comments>http://markcipolla.com/writings/visualising-builds/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 06:09:16 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Infographics]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Padrino]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=237</guid>
		<description><![CDATA[After a few versions of working and reworking the UI for the Hudson Global Dashboard, I quickly realised that it needed a rethink of how the UI elements were displayed. The primary problem was priority: not every element of a build is as important to the others, and not every build as whole to the [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_247" class="wp-caption alignleft" style="width: 310px"><img class="size-full wp-image-247" title="Early Designs" src="http://markcipolla.com/wp-content/uploads/2010/06/earlydesigns.png" alt="Early designs for the reworking of the Hudson Global Dashboard" width="300" height="189" /><p class="wp-caption-text">Early designs; I started to work out the heirachy of information presented...</p></div>
<p>After a few versions of working and reworking the UI for the <a href="http://markcipolla.com/hudson-global-dashboard/">Hudson Global Dashboard</a>, I quickly realised that it needed a rethink of how the UI elements were displayed.</p>
<p>The primary problem was priority: not every element of a build is as important to the others, and not every build as whole to the other builds.</p>
<p>After discussing it with my peers (the people who, ultimately, would be using it), I discovered that they were interested in achieving different goals than I originally anticipated.</p>
<ul>
<li>The title was the most important thing. Full stop. Also, it should be able to be read across the room (whilst being displayed on a 19&#8243; monitor.</li>
<li>The health of a build. Is it passing? And if not, how long for?</li>
<li>Everything else is secondary.</li>
</ul>
<div id="attachment_250" class="wp-caption alignright" style="width: 263px"><img class="size-medium wp-image-250" title="Other initial ideas" src="http://markcipolla.com/wp-content/uploads/2010/06/other-ideas-253x300.png" alt="" width="253" height="300" /><p class="wp-caption-text">I tried using the alignment to display health. Aligning right meant everything was all right...</p></div>
<p>I had the original breakdown of elements like this: a build could be green, blue or red (passing, testing, or failing respectively). This was the background colour. The stats of a build (it&#8217;s health over the last five builds, it&#8217;s IP address, it&#8217;s description) were displayed very small across the bottom of a build for those interested, but it wasn&#8217;t important to the passer by. Every build was the same size, and the builds as a whole expanded to fill the screen.</p>
<p>This worked, I guess, as it&#8217;s users could, at a glance whilst walking around the office, know which builds were failing.</p>
<p>Surely there had to be, however, a better way to mix elements of the build with it&#8217;s appearance. So I started looking.</p>
<p>Infographics are awesome things; they let a casual viewer glance at immense amounts of information, and immediately take in some information without having to read lots of text.</p>
<p>So what is <em>really</em> important when it comes to builds? I figured out, in descending order:</p>
<ol>
<li>Which build?</li>
<li>Is that build passing?</li>
<li>How healthy has that build been?</li>
<li>Everything else: the IP address, it&#8217;s description, etc&#8230;</li>
</ol>
<h3>Which build?</h3>
<p>This one is easy to tackle. The title. It has to be big, so it can be read across the room from a small monitor, so much larger font size than everything else. Also, colour schemes have to be contrast-y enough so it doesn&#8217;t blend.</p>
<h3>Is that build passing?</h3>
<p>Also easy to tackle. Colour. I decided a simple red &#8211; green &#8211; blue scheme, with it getting progressively less luminance as the importance of details decrease; A failing build is red, with the brightest red for the title, and less bright for the details as they go down in relevance.</p>
<h3>How healthy has that build been?</h3>
<div id="attachment_246" class="wp-caption alignleft" style="width: 380px"><img class="size-full wp-image-246" title="The health of a build" src="http://markcipolla.com/wp-content/uploads/2010/06/buildhealth.png" alt="" width="370" height="407" /><p class="wp-caption-text">I found a nice grid structure shows health nicely.</p></div>
<p>I had a bit of fun with a build&#8217;s health. I do show the build&#8217;s health in text (although it is of less importance to if the build is passing right now&#8230;), but instead had a think of what the health of a build <em>actually</em> means to the end user (a developer, or a business unit guy, etc&#8230;).</p>
<p>If a build isn&#8217;t healthy; as in, it hasn&#8217;t been consistently passing for a number of progressive builds, then there a problems that need addressing.</p>
<p>Be it lax attitudes of the developer&#8217;s part (committing untested code&#8230; naughty naughty), or problems with environment consistency (tests pass locally, but fail on the CI machine, or vice-versa), or fragile tests (those that need to be run in a certain order, or fail one-in-every-x-number-of-times), this is the stuff that directly impacts and hampers development velocity.</p>
<p>Hence, size. The larger a build (and hence, less healthy), the more devs and business units are going to be concerned with it. If it is getting larger, then that build needs an investment of time and energy to get it back on track. Hudson&#8217;s JSON API lovingly provides a description of a build&#8217;s health, in percentage (it is really out of five; 0 means a build has failed all of the last five runs, 1 means one of the last five, etc&#8230;)</p>
<p>So we ended up with some really large, red builds indicating neglect (as we have Hudson set to run a build every now and again; I think it runs them daily if no pushes occur). You can also have a moderately large green build (as it has finally passed a run!), but with luck (and work to keep it so) the build will decrease in size and stay green.</p>
<p>Ideally, you want small, green builds. If they are all small, the problems you have keeping them so is small. If you have big, red builds, then you have large problems.</p>
<p>But where it works is when you have multiple teams (or pairs, depending on your structure) showing multiple build sets. In this case, you&#8217;ll probably get a mix of healthy (small, green) builds interspersed with builds in need of some love (big and red). This I think would be especially useful for project managers; they can see what builds are in trouble, and send in those who are better at testing to help out and upskill. I&#8217;ve found in the teams that you&#8217;ll have one or two testing gurus, who can make tests sing and fix those pesky environment problem.</p>
<h3>Caveats</h3>
<p>Naturally, there are caveats. Some builds are just old and haven&#8217;t been removed. These naturally will decay over time and as their dependencies are altered, removed or decay themselves these builds will go red and get larger. I&#8217;ll be building in a selection option so you can opt out of displaying these builds when the time comes to cull them, without necessarily having to remove them from your Hudson builds.</p>
<p>Also, sometimes builds will go through rough patches&#8230; A flurry of commits to try and sort out a build may temporarily make it look a problem, but then get sorted within a few days. Keeping the business units calm during these periods would, hence, be necessary.</p>
<p>Environment problems are just a pain. They crop up from time to time, and can plague builds for ages until they are sorted, if at all.</p>
<h3>How was it built?</h3>
<p>I&#8217;d already rebuilt it on <a href="http://markcipolla.com/code/padrino/">Padrino</a>, so using that I reworked the templates to give it a semantic <a href="http://markcipolla.com/category/code/html/">HTML5</a> layout.</p>
<p>I&#8217;ve been playing with <a href="http://desandro.com/">David DeSandro</a>&#8216;s <a href="http://desandro.com/resources/jquery-masonry/">JQuery Masonry</a>, which lets you build stronger grid layouts by absolutely positioning around floated objects. Have a look; this guy is a genius&#8230;</p>
<p>Colour scheme is a combination of four or five <a href="http://kuler.adobe.com/">Adobe Kuler</a> sets; ever a great combination of colour palettes for a designer.</p>
<h3>Where to?</h3>
<p>So it&#8217;s <em>mostly</em> done. Of course, it&#8217;s a prototype, and I&#8217;ve written no tests around the app that handles testing (I know! Horror!).</p>
<p>Depending on commitments, I&#8217;d like to rewrite it, and clean it up where I had a bit of code smell.</p>
<p>Also, I started to write in a <a href="http://tramtracker.yarratrams.com.au/">TramTracker</a> block that fits in the layout, so you can see when the next trams outside the office are coming. Of course, some of the guys I work with suggested not showing this block until every build is green&#8230;</p>
<p>&#8230;</p>
<p>I thought of that, but then we&#8217;d never get to go home.</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/visualising-builds/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>REA Suburb Profile Pages</title>
		<link>http://markcipolla.com/portfolio/rea-suburb-profile-pages/</link>
		<comments>http://markcipolla.com/portfolio/rea-suburb-profile-pages/#comments</comments>
		<pubDate>Mon, 17 May 2010 03:34:49 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[FLOT]]></category>
		<category><![CDATA[HTML / XHTML / HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=210</guid>
		<description><![CDATA[As part of an exclusive deal with RPData, REA had access to their property data. To that end, we created suburb profile pages, with almost 11,500 suburbs having information regarding buying and selling properties. We created median price graphs, using FLOT, a JavaScript JQuery plotting tool. It&#8217;s very customisable, and allows for awesome, interactive mapping [...]]]></description>
			<content:encoded><![CDATA[<p>As part of an exclusive deal with <a href="http://www.rpdata.net.au/">RPData</a>, <a href="http://www.realestate.com.au">REA</a> had access to their property data. To that end, we created suburb profile pages, with almost 11,500 suburbs having information regarding buying and selling properties.</p>
<p><img src="http://markcipolla.com/wp-content/uploads/2010/05/medianprices-204x300.jpg" alt="" title="Median Prices" width="204" height="300" class="alignleft size-medium wp-image-213" />We created median price graphs, using <a href="http://code.google.com/p/flot/">FLOT</a>, a JavaScript JQuery plotting tool. It&#8217;s very customisable, and allows for awesome, interactive mapping of data. These were shown inside a custom JS tab block. FLOT by default wants JavaScript arrays jammed in page, which is fine, but for accessibility reasons we built a table reader into the initialisation that reads a table of the data, and builds a graph in a corresponding sibling element. FLOT out of the box allows for customisation of colours, and drops tooltips in for you.<br />
To get the appropriate formatting of data (so the graph knows the difference between numerical and financial amounts), we had to create custom initialisations for the differing blocks by a mix of class names and our own DOM walker, that traverses the DOM finding named elements and adding the JS to them.</p>
<hr style="clear:both; margin-bottom: 20px;" />
<p><img src="http://markcipolla.com/wp-content/uploads/2010/05/supplydemand-300x230.jpg" alt="" title="Supply &amp; Demand" style="clear: left" width="300" height="230" class="alignright size-medium wp-image-218" />Using a combination of our own stats and the stats platform we use (in regards to the number of users hitting the properties in that suburb), against the number of properties available in that suburb, we created our Supply &#038; Demand graphs. These graphs were well received by our users as they could see, at a glance, how competitive the suburb in question is. Also attached to this block (by the tab block) is an interest rate graph. This (although primarily an ad) shows Standard Variable Rate (from the major lenders) against the Reserve Bank of Australia Cash Rate, all in the custom colours of whomever had bought the rights to that block. At the larger sites, it is often hard to create new advertising ideas (due to a desire to travel the safe, well-worn roads), but by using supported content we could find a happy medium; something users will use, and raise brand awareness at the same time.</p>
<hr style="clear:both; margin-bottom: 20px;" />
<p>In it&#8217;s full glory, the page offers in-depth information on any given suburb. It has surpassed both usage expectations and ROI, and has made me a little proud to see it get out the door and into the wild.<br />
<img src="http://markcipolla.com/wp-content/uploads/2010/05/sppages.jpg" alt="" title="Suburb Profile Pages" width="600" height="1166" class="alignleft size-full wp-image-230" /></p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/portfolio/rea-suburb-profile-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REA Mobile</title>
		<link>http://markcipolla.com/portfolio/rea-mobile/</link>
		<comments>http://markcipolla.com/portfolio/rea-mobile/#comments</comments>
		<pubDate>Tue, 11 May 2010 06:51:40 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[REA]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=190</guid>
		<description><![CDATA[As part of working at REA as a UI Designer / Developer, one of the platforms for developing new ideas has been &#8216;Labs&#8217;. Just before the release of the iPhone in Australia, I saw a gap in our offering; we didn&#8217;t have a compelling mobile experience. I built the first prototype in a week or [...]]]></description>
			<content:encoded><![CDATA[<p>As part of working at <a href="http://www.realestate.com.au">REA</a> as a UI Designer / Developer, one of the platforms for developing new ideas has been &#8216;Labs&#8217;. Just before the release of the iPhone in Australia, I saw a gap in our offering; we didn&#8217;t have a compelling mobile experience. I built the first prototype in a week or so, and after it was rebuilt for production (with the efforts of Mike Breeze and Michael Allan) and launched in the UK for <a href="http://www.propertyfinder.com">propertyfinder.com</a> it was receiving ~15,000 unique browsers a month. The success of the UK mobile site saw a release for our <a href="http://m.realestate.com.au">main brand</a>, <a href="http://www.realestate.com.au">realestate.com.au</a>, which it now has in the hundreds of thousands unique browsers monthly.</p>
<p>From it&#8217;s inception, it was designed to work across a diverse range of mobile devices, progressively enhancing to adapt to any device. It (on the iPhone) asynchronously loaded properties straight from the results list, reducing the amount of page load and making for an significantly improved fluid search, rather than the &#8220;click-on-property, reload-page, back, repeat&#8221; users saw on their desktop.</p>
<p>The smaller screen offered challenges to how to best use the available space to it&#8217;s maximum, yet remain uncluttered. Key learnings from this were:</p>
<ul>
<li>Don&#8217;t try and remake your whole site, with every feature, on a mobile. Do what people need, and what people need on a mobile is different to what they need on a desktop.</li>
<li>Different users use a mobile to a full site. We found much higher ratios of (mostly likely) younger people were using the mobile site, and the difference of search for Buy verses Rent was much closer on the mobile site rather than the full site (which saw Buy searches having the majority).</li>
<li>If you are going to do browser detection, do it right. We had a simple regex-based solution initially, and it worked well for a while. As soon as you want to fix things for individual devices (especially those used by the business leaders of the business, heheh), without a more robust solution it is hard. However, the trade off is more work up front implementing a solution that is scalable. We found some Apache level ones, but there are lots of options available.</li>
<li>Optimise the hell out of images. We found that the same images, uncompressed from the data centres, could add ~200kb to a page of twenty property listings. Jam those down to JPGs, and up the compression. For desktop, you want to sit around 80% quality, but on a mobile, especially for thumbnails, 20% seemed to work fine for us!</li>
<li>Really simple, good, semantic HTML is key. Browsers (I&#8217;m looking at you, BlackBerry) on the older phones just don&#8217;t support all of HTML, or CSS on certain elements. And it can be hard to debug why. Write simple code, and whole bunches of problems just go away.</li>
</ul>
<p>As my original mobile site has now been replaced with a new one, leveraging a newer platform, I&#8217;m happy to show it here. My pet project has grown up and left the coup, and hopefully will take a life on its own. Check out the new one at <a href="http://m.realestate.com.au">m.realestate.com.au</a>.</p>
<p><img src="http://markcipolla.com/wp-content/uploads/2010/05/reamobile.jpg" alt="" title="REA Mobile" width="600" height="1000" class="alignleft size-full wp-image-185" /></p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/portfolio/rea-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on Cucumber testing: Step Definitions</title>
		<link>http://markcipolla.com/writings/thoughts-on-cucumber-testing-step-definitions/</link>
		<comments>http://markcipolla.com/writings/thoughts-on-cucumber-testing-step-definitions/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 02:39:14 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[step definition]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=156</guid>
		<description><![CDATA[In the previous post Thoughts on Cucumber testing: Features, I went into how features work, how they should be written, and for whom their intended audiences are. Step definitions are the bridge between human readable tests and actual tests that cucumber can understand. Essentially, step definitions can be broken into two parts: The regex part, [...]]]></description>
			<content:encoded><![CDATA[<p>In the previous post <a href="http://markcipolla.com/writings/thoughts-on-cucumber-testing-features/">Thoughts on Cucumber testing: Features</a>, I went into how features work, how they should be written, and for whom their intended audiences are.</p>
<p>Step definitions are the bridge between human readable tests and actual tests that cucumber can understand.</p>
<p>Essentially, step definitions can be broken into two parts:</p>
<ul>
<li>The <a href="http://en.wikipedia.org/wiki/Regular_expression">regex</a> part, where the human readable test can be match appropriately to a step.</li>
<li>The actual tests, where actions are taken or assertions are made.</li>
</ul>
<p>I&#8217;m just going to jump right in, and explain line by line. Here is an example of the step definition for a given step, which is testing the navigation to a group of pages.</p>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^the buyer is on the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> state search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>state<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; state = state.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">3</span> ? <span style="color:#6666ff; font-weight:bold;">State::AUSTRALIAN_STATE_NAMES</span>.<span style="color:#9900CC;">index</span><span style="color:#006600; font-weight:bold;">&#40;</span>state<span style="color:#006600; font-weight:bold;">&#41;</span> : state<br />
&nbsp; visit <span style="color:#996600;">'http://www.example.com/'</span> <span style="color:#006600; font-weight:bold;">+</span> state.<span style="color:#9900CC;">downcase</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
</pre>
<p>It seems that there is quite a lot going on, but it&#8217;s really not too bad.</p>
<hr />
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^the buyer is on the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> state search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>state<span style="color:#006600; font-weight:bold;">|</span></div></td></tr></tbody></table></div>
</pre>
<p>This is the regex part of the step. It is matching on any step that contains the string &#8216;the buyer is on the &#8220;some state&#8221; state search page&#8217;.</p>
<p>The ([^\"]*) in the middle will match any terms between &#8216;the buyer is on the &#8216; and &#8216; state search page&#8217;. Now, when used with &#8216;do |state|&#8217;, it will take whatever the term inside the regexed string and make it available as a variable. So, if in the feature file the step read:</p>
<blockquote><p>Given the buyer is on the VIC state search page</p></blockquote>
<p>It would match the step definition, and the variable &#8216;state&#8217; would equal &#8220;VIC&#8221;. </p>
<hr />
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^the buyer is on the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> state search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>state<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; state = state.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">3</span> ? <span style="color:#6666ff; font-weight:bold;">State::AUSTRALIAN_STATE_NAMES</span>.<span style="color:#9900CC;">index</span><span style="color:#006600; font-weight:bold;">&#40;</span>state<span style="color:#006600; font-weight:bold;">&#41;</span> : state</div></td></tr></tbody></table></div>
</pre>
<p>Now, knowing what state equals, we do some work with the string. If it&#8217;s more than three characters (in this example), we match it against a list of state names to find out what we meant. This is so we can enter both VIC and Victoria as strings.</p>
<hr />
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^the buyer is on the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> state search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>state<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; state = state.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">3</span> ? <span style="color:#6666ff; font-weight:bold;">State::AUSTRALIAN_STATE_NAMES</span>.<span style="color:#9900CC;">index</span><span style="color:#006600; font-weight:bold;">&#40;</span>state<span style="color:#006600; font-weight:bold;">&#41;</span> : state<br />
&nbsp; visit <span style="color:#996600;">'http://www.example.com/'</span> <span style="color:#006600; font-weight:bold;">+</span> state.<span style="color:#9900CC;">downcase</span></div></td></tr></tbody></table></div>
</pre>
<p>This is what given steps will usually do. Given steps (depending on the project) usually do one of two things: having users at pages, and setting up DBs or previous things that are assumed to have happened before the test begins (such as creating users, setting permissions, etc). This step goes to the page using the visit method.</p>
<hr />
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given <span style="color:#006600; font-weight:bold;">/</span>^the buyer is on the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> state search page$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>state<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; state = state.<span style="color:#9900CC;">length</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">3</span> ? <span style="color:#6666ff; font-weight:bold;">State::AUSTRALIAN_STATE_NAMES</span>.<span style="color:#9900CC;">index</span><span style="color:#006600; font-weight:bold;">&#40;</span>state<span style="color:#006600; font-weight:bold;">&#41;</span> : state<br />
&nbsp; visit <span style="color:#996600;">'http://www.example.com/'</span> <span style="color:#006600; font-weight:bold;">+</span> state.<span style="color:#9900CC;">downcase</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
</pre>
<p>And finally, the &#8216;end&#8217; ending the step definition. </p>
<p>As you can see, this is where the human readable part of a feature meets actual code doing some tests. </p>
<p>&#8216;Then&#8217; steps are where you can see some assertions happening. All assertions happen in the steps; there shouldn&#8217;t be any assertions anywhere else (mainly, keep them out of the page model).</p>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> link will have a new icon$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>link<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; on_page_with <span style="color:#ff3333; font-weight:bold;">:sub_navigation</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>page<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; page.<span style="color:#9900CC;">sub_navigation_item</span>.<span style="color:#9900CC;">url</span>.<span style="color:#9900CC;">should</span> eql link<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
</pre>
<p>The on_page_with method calls the page model, which we will go into later. For now, we set up methods against the page. The next line is what we are interested in:</p>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; page.<span style="color:#9900CC;">sub_navigation_item</span>.<span style="color:#9900CC;">url</span>.<span style="color:#9900CC;">should</span> eql link</div></td></tr></tbody></table></div>
</pre>
<p>The page has a method called sub_navigation_item, which in the page model has a css selector to find the list (inside a li inside an ul) in question, and checks it has a url from the link passed in via the feature.</p>
<p>Tests will grow in complexity, and this is okay, but always strive to make your tests as simple as possible, and as readable as possible. When an assertion can be written as:
<pre>page.sub_navigation_item.url.should eql link</pre>
<p> and read as &#8220;the page subnavigation item has a url that equals <em>this</em> link&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/thoughts-on-cucumber-testing-step-definitions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on Cucumber testing: features</title>
		<link>http://markcipolla.com/writings/thoughts-on-cucumber-testing-features/</link>
		<comments>http://markcipolla.com/writings/thoughts-on-cucumber-testing-features/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 06:05:16 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[Writings]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=39</guid>
		<description><![CDATA[It took me a while to get testing. To be honest, there are still bits I just don't quite understand.

Since we build on Rails, automated testing is handled using cucumber. The tests are split into two main parts: features, which are the human readable tests, and the step definitions, which are the actual tests, converting the human readable parts into ruby so we can actually make assertions against what we are testing. The page model also gets mixed in, but I'll get to that.

It is, however, very easy to start making mistakes when writing tests that makes life later much harder, especially when it comes to refactoring time (either for manipulating features, or speeding up a build).]]></description>
			<content:encoded><![CDATA[<p>It took me a while to get testing. To be honest, there are still bits I just don&#8217;t quite understand.</p>
<p>Since we build on Rails, automated testing is handled using <a href="http://wiki.github.com/aslakhellesoy/cucumber/" target="_blank">cucumber</a>. The tests are split into two main parts: features, which are the human readable tests, and the step definitions, which are the actual tests, converting the human readable parts into ruby so we can actually make assertions against what we are testing. The page model also gets mixed in, but I&#8217;ll get to that.</p>
<p>I&#8217;ll only go into features for now; I&#8217;ll get to the step definitions and page model work later.</p>
<p>It is, however, very easy to start making mistakes when writing tests that makes life later much harder, especially when it comes to refactoring time (either for manipulating features, or speeding up a build).</p>
<h3>Features</h3>
<ul>
<li>The features are meant to be as easily read as possible.</li>
<li>Though it can be great to re-use existing features (especially around when setting conditions to go to a page), you <em>really</em> shouldn&#8217;t trade readability for ease of testing. Try and find a happy compromise, or rewrite the existing tests to make them more generic (where appropriate). Be careful, though, to not prematurely over-generalise tests, as they make it a really hard slog later.</li>
<li>The features should be able to be read, and <strong>understood</strong>, by non-techs. Business / Product owners and business analysts, as well as QA, should really know what&#8217;s going on when they&#8217;ve read them.</li>
<li>Basically, they should be based on the feature cards created by business stakeholders / experts.</li>
</ul>
<p>They are broken into three (and a third) parts.</p>
<h4>Given steps</h4>
<ul>
<li>Given steps are used only when there are things that have to have happened prior to the test. There are no actual assertions in these (so nothing actually gets tested), and page models shouldn&#8217;t be involved yet.</li>
</ul>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given articles have been written by an editor</div></td></tr></tbody></table></div>
</pre>
<h4>When steps</h4>
<ul>
<li>When steps also have no assertions. They are for when a user (or equivalent) performs an action against the page. Clicking links, opening menus, or performing searches are all When step material.</li>
<li>Also, When steps start to have actions against the page model (explained below).</li>
</ul>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">When</span> the user clicks on the <span style="color:#996600;">&quot;delete post&quot;</span> button</div></td></tr></tbody></table></div>
</pre>
<h4>Then steps</h4>
<ul>
<li>Then steps are the assertions. Something has happened (be it a page load, or a link clicked, etc), and hence, there is a test against it. It is oft best to only test one thing per step, but there are exceptions, and my personal preference is to test one <em>element</em> at a time, so when I test a link, for example, I&#8217;ll usually test the href, the title, and any rel attributes as well as the anchor text.</li>
<li>Then steps also have actions against the page model (explained below).</li>
</ul>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">Then</span> the user will see the post has been deleted from the list</div></td></tr></tbody></table></div>
</pre>
<h4>And steps</h4>
<ul>
<li>And steps aren&#8217;t steps in their own right, but they perform the same type of step as the previous one. It lets you chain up a series of user interactions, or assertions.</li>
</ul>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">And</span> the user will see the post flash to alert the user it has been deleted<br />
<span style="color:#9966CC; font-weight:bold;">And</span> the user will see the post displaying the <span style="color:#996600;">&quot;Deleted&quot;</span> text</div></td></tr></tbody></table></div>
</pre>
<p>Put it all together, and you get a nice test.</p>
<pre>
<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:600px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Given articles have been written by an editor<br />
<span style="color:#9966CC; font-weight:bold;">When</span> the user clicks on the <span style="color:#996600;">&quot;delete post&quot;</span> button<br />
<span style="color:#9966CC; font-weight:bold;">Then</span> the user will see the post has been deleted from the list<br />
<span style="color:#9966CC; font-weight:bold;">And</span> the user will see the post flash to alert the user it has been deleted<br />
<span style="color:#9966CC; font-weight:bold;">And</span> the user will see the post displaying the <span style="color:#996600;">&quot;Deleted&quot;</span> text</div></td></tr></tbody></table></div>
</pre>
<h3>In conclusion</h3>
<p>I hope that makes some sense. The cleaner you write your tests, the easier life comes later. In conclusion, one simple rule to live by:</p>
<blockquote><p>Write your test as simply as possible, so it&#8217;s meaning is clear and someone else (who isn&#8217;t developing the project) can understand what&#8217;s going on.</p></blockquote>
<p>I&#8217;ll get through the other parts of writing tests (the step definitions and the page model) soon. </p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/writings/thoughts-on-cucumber-testing-features/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Padrino</title>
		<link>http://markcipolla.com/code/padrino/</link>
		<comments>http://markcipolla.com/code/padrino/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 00:21:00 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Padrino]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://markcipolla.com/?p=140</guid>
		<description><![CDATA[As they say themselves on the Padrino site: Many people love the simplicity and expressiveness of Sinatra but quickly come to miss a great deal of functionality provided by other web frameworks such as Rails when building non-trivial applications. Our goal with Padrino is to stay true to the core principles of Sinatra while at [...]]]></description>
			<content:encoded><![CDATA[<p>As they say themselves on the <a href="http://www.padrinorb.com/" title="Padrino">Padrino</a> site:</p>
<blockquote><p>Many people love the simplicity and expressiveness of Sinatra but quickly come to miss a great deal of functionality provided by other web frameworks such as Rails when building non-trivial applications.</p>
<p>Our goal with Padrino is to stay true to the core principles of Sinatra while at the same time creating a standard library of tools, helpers and functions that will make Sinatra suitable for increasingly complex applications.</p></blockquote>
<p>Relatively quickly, after writing the first versions of the <a href="http://markcipolla.com/hudson-global-dashboard/">Hudson Global Dashboard</a> using <a href="http://markcipolla.com/code/sinatra/">Sinatra</a>, it started to get a little too big for it&#8217;s boots.</p>
<p>Sinatra quickly let me get something out there; I could handle the routes, and perform simple tasks to display the appropriate JSON feeds in a meaningful way. But there were features I wanted; features that, should I add them, would mean probably pushing Sinatra beyond what it was meant for.</p>
<p>Enter Padrino. <a href="http://github.com/icaruswings">Luke Cunningham</a> (a rubyist and UI guy of equal measure) put me onto it, and helped me through getting the hang of how things are put together with it.</p>
<p>It&#8217;s the next step when your app grows too large for Sinatra. My main requirement was wanting an admin panel, so users could add Hudson servers willy-nilly, and not have to hard-code them.</p>
<p>Padrino is the step up from Sinatra, and a step below the complexity of a full Ruby on Rails stack. And I&#8217;m a bit of a fan. It&#8217;s really easy to bolt new sections onto, yet still letting you hit the ground running. Give it a try.</p>
]]></content:encoded>
			<wfw:commentRss>http://markcipolla.com/code/padrino/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
