<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Go Tripod Ltd</title><link>http://www.gotripod.com</link><description>Just another WordPress weblog</description><language>en</language><lastBuildDate>Mon, 02 Nov 2009 01:49:06 PST</lastBuildDate><generator>http://wordpress.org/?v=2.8.4</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><geo:lat>50.2638</geo:lat><geo:long>-5.059</geo:long><image><link>http://clockobj.co.uk/</link><url>http://clockobj.co.uk/images/cwo-mid.png</url><title>Clockwork Objects</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/miletbaker" type="application/rss+xml" /><feedburner:emailServiceId>miletbaker</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Ext JS 3.0 Cookbook – Available Now</title><link>http://feedproxy.google.com/~r/miletbaker/~3/YP7MQahwugg/</link><category>Authoring</category><category>Ext JS</category><category>Javascript</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Mon, 02 Nov 2009 01:49:06 PST</pubDate><guid isPermaLink="false">http://www.gotripod.com/?p=925</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>The <a href="http://www.packtpub.com/ext-js-3-0-cookbook/">Ext JS 3.0 Cookbook</a> by <a href="http://miamicoder.com/">Jorge Ramon</a> is now available. As Jorge says in his <a href="http://www.miamicoder.com/post/2009/08/Announcing-the-Ext-JS-30-Cookbook.aspx">introductory post</a>:</p>
<blockquote><p>The Ext JS 3.0 Cookbook is for developers who want a book of useful techniques, with explanations, that they can refer to and adapt to their purposes. </p></blockquote>
<p>I was a Technical Reviewer for this book, and it contains not just simple recipes to get you started, but complex ones to allow you to bend Ext JS to your will. If you buy Ext JS 3.0 Cookbook eBook along with the eBook edition of the book I co-authored, Learning Ext JS, you can get a 50% discount using the promo code <strong>jsco34ler</strong> on the <a href="http://www.packtpub.com/ext-js-3-0-cookbook/">Packt website</a>. Congratulations Jorge!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=YP7MQahwugg:GGbcUfH53sQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=YP7MQahwugg:GGbcUfH53sQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=YP7MQahwugg:GGbcUfH53sQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=YP7MQahwugg:GGbcUfH53sQ:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/YP7MQahwugg" height="1" width="1"/>]]></content:encoded><description>The Ext JS 3.0 Cookbook by Jorge Ramon is now available. As Jorge says in his introductory post:
The Ext JS 3.0 Cookbook is for developers who want a book of useful techniques, with explanations, that they can refer to and adapt to their purposes. 
I was a Technical Reviewer for this book, and it contains [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/11/02/ext-js-3-0-cookbook-available-now/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/11/02/ext-js-3-0-cookbook-available-now/</feedburner:origLink></item><item><title>Problem Solving in Software</title><link>http://feedproxy.google.com/~r/miletbaker/~3/v7W8z-sdwDY/</link><category>Entrepreneurship</category><category>Go Tripod</category><category>Software Development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Fri, 30 Oct 2009 07:03:03 PDT</pubDate><guid isPermaLink="false">http://www.gotripod.com/?p=909</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Very occasionally, people will start asking me in detail what I do for a living. When &#8220;I write software&#8221; or &#8220;I make websites&#8221; doesn&#8217;t satisfy them, I go into a bit more detail about the different aspects of my job. One thing that happens quite regularly if I don&#8217;t go into <em>enough</em> detail, is that I&#8217;ll tell someone how long it took to write something, or how much it cost, and they&#8217;ll raise their eyebrows.</p>
<p>&#8220;How can it cost so much?! It&#8217;s just a website!&#8221;</p>
<p>I can see their point. Most websites contain common elements &#8211; login, lists, articles, shopping carts, and so on &#8211; so you&#8217;d think that once you&#8217;ve written one, you&#8217;ll have the bits and pieces you need to make more. And taken individually, each of these parts are fairly straightforward &#8211; a list of products contains some pretty basic HTML, surely? And HTML is just a text file?</p>
<p>And again, that&#8217;s a fair point. The real time isn&#8217;t taken in writing these bits and pieces, it&#8217;s taken in understanding how the customer wants them to be written and how they need to fit together in a certain situation. For example, a shopping cart quickly becomes more complex when the customer adds on a few more features:</p>
<ul>
<li>Integrates with Google Checkout</li>
<li>Customers can save carts for later ordering</li>
<li>Customers can reload past orders into a few cart</li>
</ul>
<p>But it&#8217;s not just the cart, it&#8217;s viewing products too &#8211; what if certain customers see custom trade prices? Or products can be assigned to multiple categories and the customer wants to see how many products are in each category next to the category name? All of these things are minor when taking in isolation, but together they are a thousand tiny cuts which bleed development time.</p>
<p>As well as a collection of features, a specification for a website will also discuss requirements in language which is specific to the company you&#8217;re quoting for. Rather than &#8220;cart&#8221; you might have &#8220;basket&#8221;. Or you could have &#8220;assessors&#8221;, &#8220;reviewers&#8221;, &#8220;investigators&#8221;, or any other number of terms which a company uses internally and when referencing all of the features they want on their site. <a href="http://domaindrivendesign.org/">Eric Evans talks</a> about the &#8220;domain&#8221; of a problem when discussing software &#8211; not only do you have to appreciate what kind of features are necessary but you have to understand the domain in which they&#8217;re going to be used, in order to create a solution which fits together correctly.</p>
<p>So software is a whole big bag of questions and clarifications and solutions. From a developer&#8217;s point of view, it&#8217;s not just a case of taking some standard components and piecing them together &#8211; though that does happen occasionally. Instead every step of the development process is about solving problems, by understanding what the customer wants and by understanding the problem domain. Every day of development sees a developer tackle a new bit of work that needs resolving in a novel way, and that&#8217;s why making software isn&#8217;t just a case of shoving some parts together and hoping that it works, but a process, an evolution of the initial ideas.</p>
<p>When clients come to us and ask for software, they&#8217;ll pitch it by saying &#8220;make us a website&#8221;. But we know that what they really mean is &#8220;look, understand, and solve our problem&#8221;. And that&#8217;s what we do. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=v7W8z-sdwDY:Eji_aFM_Pz4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=v7W8z-sdwDY:Eji_aFM_Pz4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=v7W8z-sdwDY:Eji_aFM_Pz4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=v7W8z-sdwDY:Eji_aFM_Pz4:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/v7W8z-sdwDY" height="1" width="1"/>]]></content:encoded><description>Very occasionally, people will start asking me in detail what I do for a living. When &amp;#8220;I write software&amp;#8221; or &amp;#8220;I make websites&amp;#8221; doesn&amp;#8217;t satisfy them, I go into a bit more detail about the different aspects of my job. One thing that happens quite regularly if I don&amp;#8217;t go into enough detail, is that [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/10/30/problem-solving-in-software/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/10/30/problem-solving-in-software/</feedburner:origLink></item><item><title>Dynamic Nested Forms in Rails 2.3+ Using RJS</title><link>http://feedproxy.google.com/~r/miletbaker/~3/IwLu2WKD4ho/</link><category>Uncategorized</category><category>accepts_nested_attributes_for</category><category>plugin</category><category>rails</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jon</dc:creator><pubDate>Wed, 30 Sep 2009 01:11:55 PDT</pubDate><guid isPermaLink="false">http://www.gotripod.com/2009/09/30/dynamic-nested-forms-in-rails-2-3-using-rjs/</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Rails 2.3 delivered a new feature that allows you to easily write forms in rails that can process nested attributes for related objects using the accepts_nested_attributes_for method in your models. Now there is a plugin to make adding and removing nested forms a walk in the park!</p>
<p>I am not going to go into detail about this feature as <a href="http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes#comment-form">Ryan Daigle has an excellent write up on his blog</a>.</p>
<p>However I have been looking at ways to easily add and remove nested form blocks using Javascript/RJS and came across a good method of achieving this <a href="http://railsforum.com/viewtopic.php?pid=91229">by Marsvin on the RailsForum website</a>.</p>
<p>We have used this method a few times now, so thought we would roll it up into a plugin. Simply install the plugin to give you two new view helpers that allow you to create links to add and remove these nested form item partials using RJS.</p>
<p><a href="http://github.com/miletbaker/add_nested_fields">Visit the plugin&#8217;s page on GitHub to install or view the documentation.</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=IwLu2WKD4ho:qW4VewO38ck:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=IwLu2WKD4ho:qW4VewO38ck:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=IwLu2WKD4ho:qW4VewO38ck:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=IwLu2WKD4ho:qW4VewO38ck:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/IwLu2WKD4ho" height="1" width="1"/>]]></content:encoded><description>Rails 2.3 delivered a new feature that allows you to easily write forms in rails that can process nested attributes for related objects using the accepts_nested_attributes_for method in your models. Now there is a plugin to make adding and removing nested forms a walk in the park!
I am not going to go into detail about [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/09/30/dynamic-nested-forms-in-rails-2-3-using-rjs/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/09/30/dynamic-nested-forms-in-rails-2-3-using-rjs/</feedburner:origLink></item><item><title>ASP.NET SMTP – Setting a Pickup Directory for Development</title><link>http://feedproxy.google.com/~r/miletbaker/~3/_h7enn5TIUE/</link><category>.Net</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Mon, 03 Aug 2009 09:39:07 PDT</pubDate><guid isPermaLink="false">http://www.gotripod.com/?p=669</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>One of the hidden gems of System.Net is the ability to change from using an SMTP server for sending your email. Instead you can specify a pickup directory which will receive all emails sent from your application as a .EML text file. There are clearly uses for this in production &#8211; you may have a second application which monitors this pickup directory and sends the emails after performing some processing on them. </p>
<p>My favourite use of this feature is for development &#8211; when you&#8217;re sending loads of test emails you can avoid polluting your inbox and simply check the pickup directory. You also avoid having to set up an SMTP host and all of the associated configuration.</p>
<p>Simply add the following to your web.config&#8217;s system.net section:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mailSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;smtp</span> <span style="color: #000066;">deliveryMethod</span>=<span style="color: #ff0000;">&quot;SpecifiedPickupDirectory&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;specifiedPickupDirectory</span> <span style="color: #000066;">pickupDirectoryLocation</span>=<span style="color: #ff0000;">&quot;c:\temp\&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/smtp<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mailSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Make sure you&#8217;ve got the right permissions on the directory. Now, send an email from your application and watch it appear in c:\temp, as if by magic!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=_h7enn5TIUE:X30Eu42m72Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=_h7enn5TIUE:X30Eu42m72Q:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=_h7enn5TIUE:X30Eu42m72Q:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=_h7enn5TIUE:X30Eu42m72Q:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/_h7enn5TIUE" height="1" width="1"/>]]></content:encoded><description>One of the hidden gems of System.Net is the ability to change from using an SMTP server for sending your email. Instead you can specify a pickup directory which will receive all emails sent from your application as a .EML text file. There are clearly uses for this in production &amp;#8211; you may have a [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/08/03/asp-net-smtp-setting-a-pickup-directory-for-development/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/08/03/asp-net-smtp-setting-a-pickup-directory-for-development/</feedburner:origLink></item><item><title>Scale-9 in Objective-C Cocoa on the Mac</title><link>http://feedproxy.google.com/~r/miletbaker/~3/5k3jV_Vr_rg/</link><category>Objective-C and Cocoa</category><category>Cocoa</category><category>Objective-C</category><category>Scale9</category><category>UI Design</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Thu, 18 Jun 2009 15:49:35 PDT</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=297</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Having used flash extensively for the last few years I have really come to rely on using Scale-9 scaling on UI elements in the rich internet apps I design and develop. It is a great technique for things like rounded rectangles, button graphics etc and ensuring the rounded corners do not distort when stretched.</p>
<p>I have recently been doing Cocoa Development on Mac OS X 10.5 and was looking for a way to do this in Cocoa and <a href="http://www.karlkraft.com/index.php/2007/11/14/nsdrawninepartimage/">came across</a> a great drawing method named <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Miscellaneous/AppKit_Functions/Reference/reference.html">NSDrawNinePartImage</a>. The method has the following signature:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">void</span> NSDrawNinePartImage<span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRect</span> frame,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>topLeftCorner,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>topEdgeFill,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>topRightCorner,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>leftEdgeFill,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>centerFill,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>rightEdgeFill,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottomLeftCorner,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottomEdgeFill,
   <span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottomRightCorner,
   NSCompositingOperation op,
   CGFloat alphaFraction,
   <span style="color: #a61390;">BOOL</span> flipped
<span style="color: #002200;">&#41;</span>;</pre></div></div>

<p><span id="more-401"></span><br />
This method requires the developer to provide 9 separate images to create the 9 sections of the scale 9 image. Luckily the article I had stumbled across had a handy example for using a single class, so I thought that I would use their technique to create a simple generic class that can be used to draw a single NSImage as a Scale-9 scalable image. This could be used for example in an NSView or NSButtonCell.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//</span>
<span style="color: #11740a; font-style: italic;">//  GTDrawImage.m</span>
<span style="color: #11740a; font-style: italic;">//  StretchMyView</span>
<span style="color: #11740a; font-style: italic;">//</span>
<span style="color: #11740a; font-style: italic;">//  Created by Jon Baker on 17/06/2009.</span>
<span style="color: #11740a; font-style: italic;">//  Copyright 2009 Go Tripod Ltd. All rights reserved.</span>
<span style="color: #11740a; font-style: italic;">//</span>
&nbsp;
<span style="color: #6e371a;">#import &quot;GTDrawImage.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> GTDrawImage
&nbsp;
&nbsp;
<span style="color: #002200;">+</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> drawScalableImage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sourceImage scaleTopLeft<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSPoint</span><span style="color: #002200;">&#41;</span>topLeftPoint scaleBottomRight<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSPoint</span><span style="color: #002200;">&#41;</span>bottomRightPoint inFrame<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRect</span><span style="color: #002200;">&#41;</span>frame
<span style="color: #002200;">&#123;</span>
	NSSize sourceSize <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>sourceImage size<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Top left</span>
	<span style="color: #a61390;">NSRect</span> topLeftTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, topLeftPoint.x, sourceSize.height <span style="color: #002200;">-</span> topLeftPoint.y<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> topLeftCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, topLeftPoint.y, topLeftTileRect.size.width, topLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// TopRight</span>
	<span style="color: #a61390;">NSRect</span> topRightTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">0</span>, sourceSize.width <span style="color: #002200;">-</span> bottomRightPoint.x, topLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> topRightCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>sourceSize.width <span style="color: #002200;">-</span> topRightTileRect.size.width, topLeftPoint.y, topRightTileRect.size.width, topRightTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Top</span>
	<span style="color: #a61390;">NSRect</span> topTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, sourceSize.width <span style="color: #002200;">-</span> topLeftTileRect.size.width <span style="color: #002200;">-</span> topRightTileRect.size.width, topLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> topCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>topLeftPoint.x, topLeftPoint.y, topTileRect.size.width, topTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Bottom Left</span>
	<span style="color: #a61390;">NSRect</span> bottomLeftTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, topLeftCutRect.size.width, bottomRightPoint.y<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> bottomLeftCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, bottomLeftTileRect.size.width, bottomLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Bottom Right</span>
	<span style="color: #a61390;">NSRect</span> bottomRightTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">0</span>, topRightCutRect.size.width, bottomLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> bottomRightCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>topRightCutRect.origin.x, <span style="color: #2400d9;">0</span>, bottomRightTileRect.size.width , bottomRightTileRect.size.height <span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Bottom</span>
	<span style="color: #a61390;">NSRect</span> bottomTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">0</span>, topTileRect.size.width, bottomLeftTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> bottomCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>topCutRect.origin.x, <span style="color: #2400d9;">0</span>, bottomTileRect.size.width, bottomTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// left</span>
&nbsp;
	<span style="color: #a61390;">NSRect</span> leftTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, bottomLeftTileRect.size.width, sourceSize.height <span style="color: #002200;">-</span> topTileRect.size.height <span style="color: #002200;">-</span> bottomTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> leftCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, bottomRightPoint.y, leftTileRect.size.width, leftTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// right</span>
&nbsp;
	<span style="color: #a61390;">NSRect</span> rightTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, topRightCutRect.size.width, leftCutRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> rightCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>bottomRightPoint.x, bottomRightPoint.y, rightTileRect.size.width, rightTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//center</span>
	<span style="color: #a61390;">NSRect</span> centerTileRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, topTileRect.size.width, leftTileRect.size.height<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">NSRect</span> centerCutRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span>topCutRect.origin.x, bottomRightPoint.y, centerTileRect.size.width, centerTileRect.size.height<span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>topLeft <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>topLeftTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>topLeft lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>topLeftTileRect fromRect<span style="color: #002200;">:</span>topLeftCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>topLeft unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>top <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>topTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>top lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>topTileRect fromRect<span style="color: #002200;">:</span>topCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>top unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>topRight <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>topRightTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>topRight lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>topRightTileRect fromRect<span style="color: #002200;">:</span>topRightCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>topRight unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//setup center section, left, right</span>
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>left <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>leftTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>left lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>leftTileRect fromRect<span style="color: #002200;">:</span>leftCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>left unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>center <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>centerTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>center lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>centerTileRect fromRect<span style="color: #002200;">:</span>centerCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>center unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>right <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>rightTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>right lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>rightTileRect fromRect<span style="color: #002200;">:</span>rightCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>right unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottomLeft <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>bottomLeftTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomLeft lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>bottomLeftTileRect fromRect<span style="color: #002200;">:</span>bottomLeftCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomLeft unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottom <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>bottomTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottom lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>bottomTileRect fromRect<span style="color: #002200;">:</span>bottomCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottom unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSImage</span> <span style="color: #002200;">*</span>bottomRight <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSImage</span> alloc<span style="color: #002200;">&#93;</span> initWithSize<span style="color: #002200;">:</span>bottomRightTileRect.size<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomRight lockFocus<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sourceImage drawInRect<span style="color: #002200;">:</span>bottomRightTileRect fromRect<span style="color: #002200;">:</span>bottomRightCutRect operation<span style="color: #002200;">:</span>NSCompositeCopy fraction<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomRight unlockFocus<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
	NSDrawNinePartImage<span style="color: #002200;">&#40;</span>
						frame,
						topLeft, top, topRight,
						left, center, right,
						bottomLeft, bottom, bottomRight,
						NSCompositeSourceOver, <span style="color: #2400d9;">1.0</span>, <span style="color: #a61390;">NO</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>topLeft release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>top release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>topRight release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>left release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>center release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>right release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomLeft release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottom release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>bottomRight release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>To use this generic classes, you simply need to import it where required:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;GTDrawImage.h&quot;</span></pre></div></div>

<p>&#8230;and then you can call from within, for example the drawRect:, selector using the following method:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>drawRect<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRect</span><span style="color: #002200;">&#41;</span>rect <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>GTDrawImage drawScalableImage<span style="color: #002200;">:</span>baseImage scaleTopLeft<span style="color: #002200;">:</span>NSMakePoint<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">8</span>, <span style="color: #2400d9;">16</span><span style="color: #002200;">&#41;</span> scaleBottomRight<span style="color: #002200;">:</span>NSMakePoint<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">16</span>,<span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span> inFrame<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span>self bounds<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>drawScalableImage takes an NSImage, in this case baseImage, and two reference points (NSPoint) to split the image into nine slices, firstly the scaleTopLeft: and secondly the scaleBottomRight:, both located from the bottom left corner. So for example to split a 24px x 24px image into 9 equal 8px by 8px segments (see below), the topLeftPoint would be x=8px, y=16px and the bottom x=16 and y=8.</p>
<p><img class="s3-img" src="http://clockobj.co.uk.s3.amazonaws.com/scale9.png" border="0" alt="scale9.png" /></p>
<p>Just download the following classes into your projects and away you go:</p>
<ul>
<li>Header: <a class="s3-link" href="http://clockobj.co.uk.s3.amazonaws.com/GTDrawImage.h">GTDrawImage.h</a></li>
<li>Implementation: <a class="s3-link" href="http://clockobj.co.uk.s3.amazonaws.com/GTDrawImage.m">GTDrawImage.m</a></li>
<li>Sample Project using GTDrawImage: <a class="s3-link" href="http://clockobj.co.uk.s3.amazonaws.com/StretchMyView.zip">StretchMyView.zip</a> (Adapted example I found. Unfortunately I can&#8217;t remember where and so don&#8217;t know who to credit)</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=5k3jV_Vr_rg:mG-_58F3qY4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=5k3jV_Vr_rg:mG-_58F3qY4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=5k3jV_Vr_rg:mG-_58F3qY4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=5k3jV_Vr_rg:mG-_58F3qY4:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/5k3jV_Vr_rg" height="1" width="1"/>]]></content:encoded><description>Having used flash extensively for the last few years I have really come to rely on using Scale-9 scaling on UI elements in the rich internet apps I design and develop. It is a great technique for things like rounded rectangles, button graphics etc and ensuring the rounded corners do not distort when stretched.
I have [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/06/18/scale-9-in-objective-c-cocoa-on-the-mac/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/06/18/scale-9-in-objective-c-cocoa-on-the-mac/</feedburner:origLink></item><item><title>Great 404 Page Idea</title><link>http://feedproxy.google.com/~r/miletbaker/~3/bNe4tPuFA4M/</link><category>Entrepreneurship</category><category>Usability</category><category>404</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">simon</dc:creator><pubDate>Thu, 18 Jun 2009 02:53:23 PDT</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=273</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I came across <a href="http://www.hogbaysoftware.com/book/">a great 404 page</a> the other day and thought I would share it. The page at first glances looks like any other but if you read the text, you will see that they have redeemed themselves for the broken link by offering me a discount of $3 off any of their products.</p>
<p><img class="s3-img" style="border: 0px initial initial;" src="http://clockobj.co.uk.s3.amazonaws.com/Picture 1.png" border="0" alt="Picture 1.png" width="477" height="439" /></p>
<p>This is a great way to capture the interest of would be browsers that would normally see this page and immediately hit the back key, instead not only do they capture my attention, but they also tap into my curiosity which gets me to immediately click the products link.</p>
<p>In this case I didn&#8217;t need any of their products but this is a great tip.</p>
<p>Also note the search bar being visible. This is essential on a 404 page for keeping customers that know what they are looking for on your site.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=bNe4tPuFA4M:CZ3-x_5p12g:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=bNe4tPuFA4M:CZ3-x_5p12g:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=bNe4tPuFA4M:CZ3-x_5p12g:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=bNe4tPuFA4M:CZ3-x_5p12g:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/bNe4tPuFA4M" height="1" width="1"/>]]></content:encoded><description>I came across a great 404 page the other day and thought I would share it. The page at first glances looks like any other but if you read the text, you will see that they have redeemed themselves for the broken link by offering me a discount of $3 off any of their products.

This [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2009/06/18/great-404-page-idea/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.gotripod.com/2009/06/18/great-404-page-idea/</feedburner:origLink></item><item><title>Rails deployment is so easy these days</title><link>http://feedproxy.google.com/~r/miletbaker/~3/ILwGwVtH3tc/</link><category>Ruby on Rails</category><category>Apache</category><category>Phusion Passenger</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Sat, 22 Nov 2008 04:04:16 PST</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=196</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a href="http://www.gotripod.com/wp-content/uploads/2008/11/enterprise_logo_alpha.png"><img class="float_left alignleft size-full wp-image-214" style="margin: 5px;" title="enterprise_logo_alpha" src="http://www.gotripod.com/wp-content/uploads/2008/11/enterprise_logo_alpha.png" alt="" width="261" height="68" /></a>I have been meaning to blog about Phusion Passenger for a while as about 3-4 months ago we migrated Stubmatic from using Apache / Mongrel Cluster to <a href="http://www.modrails.com/">Phusion Passenger A.K.A. mod_rails</a>.<br />
<span id="more-196"></span><br />
Mod rails is extreamly easy to install. Make sure you update gem first:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gem update <span style="color: #660033;">--system</span></pre></div></div>

<p>Then install the Phusion Passenger gem</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">gem <span style="color: #c20cb9; font-weight: bold;">install</span> passenger</pre></div></div>

<p>Once complete you can run the Phusion Passenger install that compiles mod_rails for you.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">passenger-install-apache2-module</pre></div></div>

<p>Once this completes it will give you some code to past into your httpd.conf file and you are ready to start configuring your sites.. Well actually if you have been using Mongrels then time to strip most of the configuration out of your https.conf file. You can have as simple a configuration as shown below. <strong>Note:</strong> The DocumentRoot should be set to the public folder within your app. Passenger automatically detects that this is a rails app.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    ServerName www.stubmatic.com
    DocumentRoot /websites/stubmatic/public</pre></div></div>

<p>One thing to note is that by default Passenger disables ModRewrite for that VirtualHost and in our case we use ModRewrite for a number of things such as providing a Maintenance page when maintenance.html is in our public folder allowing us to take the app offline. We also use ModRewrite to hide .svn folders, so we needed to use ModRewrite. Thankfully Passenger provides a solution. <strong>Note: You must first make sure you remove the .htaccess file in your rails public folder!</strong></p>
<p>So our new Apache configuration looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    ServerName www.stubmatic.com
    DocumentRoot /websites/stubmatic/public
&nbsp;
    RailsAllowModRewrite on
&nbsp;
    RewriteEngine On
&nbsp;
    RewriteRule ^(.*/)?.svn/ - [F,L]
&nbsp;
    RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
    RewriteCond %{SCRIPT_FILENAME} !maintenance.html
    RewriteRule ^.*$ /maintenance.html [L]</pre></div></div>

<p>If you want to setup an Apache / Phusion Passenger testing server you will also need to add the following directive to your VirtualHost configuration:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">RailsEnv development</pre></div></div>

<p>As you can see Phusion Passenger make deployment of Ruby on Rails as trivial as deploying a PHP. You can easily reload Phusion Passenger by running the following command from within your Rails project root.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">touch tmp/restart.txt</pre></div></div>

<p>In terms of performance, Phusion Passenger holds it&#8217;s own against Mongrel and there are <a href="http://www.modrails.com/documentation.html">plenty of details on Phusion&#8217;s website</a>.</p>
<p>For more information:</p>
<ol>
<li><a href="http://www.modrails.com/">Phusion Passenger</a></li>
<li><a href="http://www.modrails.com/documentation/Users%20guide.html">Phusion Passenger Documentation</a></li>
</ol>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=ILwGwVtH3tc:9DTo7r5C-6Y:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=ILwGwVtH3tc:9DTo7r5C-6Y:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=ILwGwVtH3tc:9DTo7r5C-6Y:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=ILwGwVtH3tc:9DTo7r5C-6Y:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/ILwGwVtH3tc" height="1" width="1"/>]]></content:encoded><description>I have been meaning to blog about Phusion Passenger for a while as about 3-4 months ago we migrated Stubmatic from using Apache / Mongrel Cluster to Phusion Passenger A.K.A. mod_rails.

Mod rails is extreamly easy to install. Make sure you update gem first:

gem update --system

Then install the Phusion Passenger gem

gem install passenger

Once complete you can [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2008/11/22/rails-deployment-is-so-easy-these-days/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://www.gotripod.com/2008/11/22/rails-deployment-is-so-easy-these-days/</feedburner:origLink></item><item><title>Excellent OS X SQLite 3 Management &amp; Query App</title><link>http://feedproxy.google.com/~r/miletbaker/~3/3qDpil_Ea4o/</link><category>Flex and Air</category><category>Objective-C and Cocoa</category><category>Python Django</category><category>Ruby on Rails</category><category>Adobe Air</category><category>iPhone</category><category>sqlite 3</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Thu, 20 Nov 2008 12:11:50 PST</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=190</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<dl id="attachment_191" class="wp-caption alignnone" style="width: 138px;">
<dt class="wp-caption-dt"><a href="http://www.gotripod.com/wp-content/uploads/2008/11/baseicon.png"><img class="size-medium wp-image-191 alignnone float_left" title="baseicon" src="http://www.gotripod.com/wp-content/uploads/2008/11/baseicon.png" alt="Base Icon" width="102" height="102" /></a></dt>
</dl>
<p>iPhone and Adobe Air developers (as well as any others that use SQLite 3) <a href="http://menial.co.uk">Menial</a> has just released an excellent little app for creating, managing and running queries against SQLite 3 databases called Bases.</p>
<p><a href="http://www.gotripod.com/wp-content/uploads/2008/11/schema1.png"><img class="alignnone size-full wp-image-193" title="schema1" src="http://www.gotripod.com/wp-content/uploads/2008/11/schema1.png" alt="" width="500" height="424" /></a></p>
<p>The application is simple to use, very user friendly and has worked well from the testing I have done. It costs just £10 and there is a free trial available so you can try before you buy.</p>
<p><a href="http://menial.co.uk/software/base/">Find out more and download here</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=3qDpil_Ea4o:xpY1wbXwDk8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=3qDpil_Ea4o:xpY1wbXwDk8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=3qDpil_Ea4o:xpY1wbXwDk8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=3qDpil_Ea4o:xpY1wbXwDk8:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/3qDpil_Ea4o" height="1" width="1"/>]]></content:encoded><description>iPhone and Adobe Air developers (as well as any others that use SQLite 3) Menial has just released an excellent little app for creating, managing and running queries against SQLite 3 databases called Bases.

The application is simple to use, very user friendly and has worked well from the testing I have done. It costs just [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2008/11/20/excellent-os-x-sqlite-3-management-query-app/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://www.gotripod.com/2008/11/20/excellent-os-x-sqlite-3-management-query-app/</feedburner:origLink></item><item><title>Ruby on Rails, PayPal Express Recurring Payments using Active Merchant</title><link>http://feedproxy.google.com/~r/miletbaker/~3/qg_H5YnFBvU/</link><category>Ruby on Rails</category><category>PayPal</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Colin</dc:creator><pubDate>Mon, 08 Sep 2008 02:31:52 PDT</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=128</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I recently needed to setup recurring payments through PayPal&#8217;s express checkout for a subscription based site I have writen using Ruby on Rails. There is already an excellent framework for interacting with most payment gateways, including PayPal, for Ruby called <a href="http://www.activemerchant.org/">Active Merchant</a>. Unfortunately recurring payments support in Active Merchant for PayPal Express Checkout is limited to a <a href="http://jadedpixel.lighthouseapp.com/projects/11599-active-merchant/tickets/17-patch-creating-paypal-recurring-payments-profile-with-activemerchant#ticket-17-4">script pasted into their lighthous bug tracking system</a>. The trouble is that this script only covers creating subscription profiles and also later getting details of that profile, but I needed to be able to suspend and cancel subscriptions profiles as well as make changes to the subscription from my site.</p>
<p><span id="more-128"></span></p>
<p><strong>**** UPDATE: ActiveMerchant recently removed the functionality to use PayPal&#8217;s NVP API and so this code will no longer work with the latest ActiveMerchant. Raymond Law has kindly ported the code to use the SOAP API and <a href="http://rayvinly.com/articles/2009/02/20/paypal-recurring-billing-with-activemerchant-in-ruby-on-rails/">you can find out more information and usage on his blog</a>. ****</strong></p>
<p>Active Merchant is very easy to extend so I have written a Ruby class that can be dropped into /vendor/plugins/active_merchant/billing/gateways/ within your Rails project (assuming you have AM installed as a plugin)</p>
<p>Below is the code: (I have also attached the .rb file: <a href="http://www.gotripod.com/wp-content/uploads/2008/09/paypal_express_recurring_nv.rb">paypal_express_recurring_nv.rb</a>)</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># simple extension to ActiveMerchant for basic support of recurring payments with Express Checkout API</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># See http://http://www.gotripod.com/2008/09/07/ruby-on-rails-paypal-express-recurring-payments-using-active-merchant/</span>
<span style="color:#008000; font-style:italic;"># for details on getting started with this gateway</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#9966CC; font-weight:bold;">module</span> ActiveMerchant <span style="color:#008000; font-style:italic;">#:nodoc:</span>
  <span style="color:#9966CC; font-weight:bold;">module</span> Billing <span style="color:#008000; font-style:italic;">#:nodoc:</span>
    <span style="color:#9966CC; font-weight:bold;">class</span> PaypalExpressRecurringNvGateway <span style="color:#006600; font-weight:bold;">&amp;</span>lt; Gateway
      <span style="color:#9966CC; font-weight:bold;">include</span> PaypalNvCommonAPI
&nbsp;
      LIVE_REDIRECT_URL = <span style="color:#996600;">'https://www.paypal.com/cgibin/webscr?cmd=_customer-billing-agreement&amp;amp;token='</span>
      TEST_REDIRECT_URL = <span style="color:#996600;">'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_customer-billing-agreement&amp;amp;token='</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> redirect_url
        test? ? TEST_REDIRECT_URL : LIVE_REDIRECT_URL
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> redirect_url_for<span style="color:#006600; font-weight:bold;">&#40;</span>token<span style="color:#006600; font-weight:bold;">&#41;</span>
          <span style="color:#996600;">&quot;#{redirect_url}#{token}&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> setup_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>description, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        requires!<span style="color:#006600; font-weight:bold;">&#40;</span>options, <span style="color:#ff3333; font-weight:bold;">:return_url</span>, <span style="color:#ff3333; font-weight:bold;">:cancel_return_url</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'SetCustomerBillingAgreement'</span>, build_setup_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>description, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> get_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>token<span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'GetBillingAgreementCustomerDetails'</span>, build_get_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>token<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> create_profile<span style="color:#006600; font-weight:bold;">&#40;</span>money, token, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'CreateRecurringPaymentsProfile'</span>, build_create_profile<span style="color:#006600; font-weight:bold;">&#40;</span>money, token, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> get_profile_details<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'GetRecurringPaymentsProfileDetails'</span>, build_get_profile_details<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> manage_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, action, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'ManageRecurringPaymentsProfileStatus'</span>, build_manage_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, action, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> update_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'UpdateRecurringPaymentsProfile'</span>, build_update_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> bill_outstanding<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, money, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        commit <span style="color:#996600;">'BillOutstandingAmount'</span>, build_bill_outstanding<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, money, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      private
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_setup_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>description, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:billingagreementdescription</span>, description<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:returnurl</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:return_url</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:cancelurl</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:cancel_return_url</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:billingtype</span>, <span style="color:#996600;">&quot;RecurringPayments&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:paymenttype</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:payment_type</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:payment_type</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:localecode</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:locale</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:locale</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:billingagreementcustom</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:custom_code</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:custom_code</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_get_agreement<span style="color:#006600; font-weight:bold;">&#40;</span>token<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:token</span>, token<span style="color:#006600; font-weight:bold;">&#41;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_create_profile<span style="color:#006600; font-weight:bold;">&#40;</span>money, token, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:token</span>, token<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_amount<span style="color:#006600; font-weight:bold;">&#40;</span>post, money, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:subscribername</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:subscriber_name</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:subscriber_name</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:initamt</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:initamt</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:initamt</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:failedinitamtaction</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:failedinitamtaction</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span>  options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:failedinitamtaction</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profilestartdate</span>, <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span>.<span style="color:#9900CC;">utc</span>.<span style="color:#9900CC;">iso8601</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:billingperiod</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_period</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_period</span><span style="color:#006600; font-weight:bold;">&#93;</span> : <span style="color:#996600;">&quot;Month&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:billingfrequency</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_frequency</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_frequency</span><span style="color:#006600; font-weight:bold;">&#93;</span> : <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:totalbillingcycles</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_cycles</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:billing_cycles</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profilereference</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:reference</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:reference</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:autobillamt</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:auto_bill_amt</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:auto_bill_amt</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:maxfailedpayments</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:max_failed_payments</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:max_failed_payments</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:shippingamt</span>, amount<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:allow_blank</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:taxamt</span>, amount<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:tax_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:allow_blank</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:tax_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_shipping_address<span style="color:#006600; font-weight:bold;">&#40;</span>post, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_address</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_address</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_get_profile_details<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profileid</span>, profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_manage_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, action, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profileid</span>, profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:action</span>, action<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:note</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_update_profile<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profileid</span>, profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:note</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:desc</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:description</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:description</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:subscribername</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:subscriber_name</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:subscriber_name</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profilereference</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:reference</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:reference</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:additionalbillingcycles</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:additional_billing_cycles</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:additional_billing_cycles</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_amount<span style="color:#006600; font-weight:bold;">&#40;</span>post, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:money</span><span style="color:#006600; font-weight:bold;">&#93;</span>, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:shippingamt</span>, amount<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:allow_blank</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:autobillamt</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:auto_bill_amt</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:auto_bill_amt</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:maxfailedpayments</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:max_failed_payments</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:max_failed_payments</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:taxamt</span>, amount<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:tax_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:allow_blank</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:tax_amount</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        add_shipping_address<span style="color:#006600; font-weight:bold;">&#40;</span>post, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_address</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:shipping_address</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_bill_outstanding<span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, money, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        post = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:profileid</span>, profile_id<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_amount<span style="color:#006600; font-weight:bold;">&#40;</span>post, money, options<span style="color:#006600; font-weight:bold;">&#41;</span>
        add_pair<span style="color:#006600; font-weight:bold;">&#40;</span>post, <span style="color:#ff3333; font-weight:bold;">:note</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:note</span><span style="color:#006600; font-weight:bold;">&#93;</span>
        post
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> build_response<span style="color:#006600; font-weight:bold;">&#40;</span>success, message, response, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        PaypalExpressNvResponse.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>success, message, response, options<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>With this class installed using Active Merchant to set up a subscription / recurring payment through PayPal Express Checkout is easy. Firstly setup your gateway object:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gw = <span style="color:#6666ff; font-weight:bold;">ActiveMerchant::Billing::PaypalExpressRecurringNvGateway</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#ff3333; font-weight:bold;">:login</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">'PAYPALEMAIL'</span>, <span style="color:#ff3333; font-weight:bold;">:password</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">'PASSWORD'</span>, <span style="color:#ff3333; font-weight:bold;">:signature</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">'PAYPALAPISIGNATURE'</span> <span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Then make a request to PayPal to setup the recurring payment. At this stage you pass through a description (which is what is shown to the user when they are asked to authorise the subscription so make it descriptive) and you also need to provide URLs on your site, that PayPal should redirect the subscriber back to when they either complete the payment, or alternatively if they choose to cancel.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">response = gw.<span style="color:#9900CC;">setup_agreement</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Subscription £25 per month&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:cancel_return_url</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;https://mysite.com/cancel&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:return_url</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;https://mysite.com/complete&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>The request above returns us a token in the response from paypal and at this point we need to redirect the user to PayPal to authorise this subscription. The user will see the description &#8220;Subscription £25 per month&#8221; as sent in the previous request. We need to redirect the subscriber to PayPal using the following line of ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">redirect_to gw.<span style="color:#9900CC;">redirect_url_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>response.<span style="color:#9900CC;">token</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Once the user has authorised the subscription they are returned to the :return_url we specified earlier, at which point we can create the actual subscription using the following:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">response = gw.<span style="color:#9900CC;">create_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2500</span>, response.<span style="color:#9900CC;">token</span>, <span style="color:#ff3333; font-weight:bold;">:currency</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;GBP&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:reference</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;34&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Note: PayPal are really confusing having one API for the US and another for the UK but if you are using PayPal Express (which is free) independently of PayPal Website Payments Pro (Which you need to pay for) the US PayPal Express API works for all countries (apart from Germany I believe) and as you can see above I am passing in the UK currency. I am using the US API and I have a UK PayPal account. Also note that I have passed in a reference (I have an IPN URL setup in my PayPal account &#8211; Unfortunately you cannot pass an IPN URL with the request) to be sent in the IPN.</p>
<p>The previous step completes the set up of our Subscription. However if we need to later get information on the subscription or change it, we need to extract the Profile ID from the response as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">profile_id = response.<span style="color:#9900CC;">params</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;profileid&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>With this profile_id we can then later use these additional methods that I have included, such as getting details of the subscription profile using:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gw.<span style="color:#9900CC;">get_profile_details</span><span style="color:#006600; font-weight:bold;">&#40;</span>profile_id<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Update the subscription using various options (i.e. changing subscription amount shown below):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gw.<span style="color:#9900CC;">update_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, <span style="color:#ff3333; font-weight:bold;">:money</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">3000</span>, <span style="color:#ff3333; font-weight:bold;">:currency</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;GBP&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Manage the subscription, for example cancel it as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gw.<span style="color:#9900CC;">manage_profile</span><span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, <span style="color:#996600;">&quot;Cancel&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:note</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;Your subscription has been cancelled by us&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>And finally bill any outstanding subscription balance:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gw.<span style="color:#9900CC;">bill_outstanding</span><span style="color:#006600; font-weight:bold;">&#40;</span>profile_id, <span style="color:#006666;">2500</span>, <span style="color:#ff3333; font-weight:bold;">:currency</span>=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;GBP&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:note</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;£20 Overdue Subscription&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Please note that as of yet this class is not part of Active Merchant, however it has been added to <a href="http://jadedpixel.lighthouseapp.com/projects/11599-active-merchant/tickets/17-patch-creating-paypal-recurring-payments-profile-with-activemerchant#ticket-17-4">Active Merchants case #17</a> If you want to use this you will have to add it manually as above.</p>
<p>I recommend reading <a href="https://www.paypal.com/en_US/pdf/PP_ExpressCheckout_IntegrationGuide.pdf">PayPals Express Checkout Integration Guide</a> and the <a href="https://www.paypal.com/en_US/pdf/PP_NVPAPI_DeveloperGuide.pdf">Name Value Pair API Developer Guide and Reference</a> for more information on what variables can be passed in each request to PayPal.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=qg_H5YnFBvU:6H9UDqC278I:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=qg_H5YnFBvU:6H9UDqC278I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=qg_H5YnFBvU:6H9UDqC278I:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=qg_H5YnFBvU:6H9UDqC278I:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/qg_H5YnFBvU" height="1" width="1"/>]]></content:encoded><description>I recently needed to setup recurring payments through PayPal&amp;#8217;s express checkout for a subscription based site I have writen using Ruby on Rails. There is already an excellent framework for interacting with most payment gateways, including PayPal, for Ruby called Active Merchant. Unfortunately recurring payments support in Active Merchant for PayPal Express Checkout is limited [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2008/09/08/ruby-on-rails-paypal-express-recurring-payments-using-active-merchant/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">37</slash:comments><feedburner:origLink>http://www.gotripod.com/2008/09/08/ruby-on-rails-paypal-express-recurring-payments-using-active-merchant/</feedburner:origLink></item><item><title>Objective-J &amp; Cappuccino</title><link>http://feedproxy.google.com/~r/miletbaker/~3/Hs5PCJsS7WQ/</link><category>Javascript</category><category>Misc..</category><category>Objective-C and Cocoa</category><category>Technology Rants and Raves</category><category>AJAX</category><category>Cocoa</category><category>Objective-C</category><category>RIA</category><category>web development</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">simon</dc:creator><pubDate>Sun, 07 Sep 2008 05:32:47 PDT</pubDate><guid isPermaLink="false">http://clockobj.co.uk/?p=113</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p><a href="http://cappuccino.org/"><img class="float_right alignright" style="border: 1px solid black; margin-left: 5px; margin-right: 5px;" title="Cappuccino Framework" src="http://cappuccino.org/images/cappuccino-icon.png" alt="" width="180" height="180" /></a>This may be an unusual first post in my Objective-C and Cocoa categories however it is quite relevant as the guys behind <a href="http://280slides.com/">280 Slides</a> have released a <a href="http://cappuccino.org/">new open source extension</a> to the Javascript language known as Objective-J and a new Javascript framework based on Cocoa named Cappuccino.</p>
<p>Other than having a very nice logo designed by the guys at <a href="http://madebysofa.com/">Sofa</a> my first impressions are they have implemented Objective-C in javascript. To me this seems an unusual choice as I can&#8217;t image there are that many developers (within the web development industry) who are that familiar with Objective-C. Maybe I am wrong, certainly with the current gold rush to develop for the iPhone this will increase. I must admit I have been toying with Objective-C recently and once I got the hang of the syntax am really starting to enjoy it. So maybe there is method to their madness?<span id="more-373"></span></p>
<p>The <a href="http://cappuccino.org/">Cappuccino framework</a> has been likened to the recently released (and overhyped in my opinion &#8211; seems slow and clunky to me) <a href="http://www.sproutcore.com/">SproutCore</a> framework. However I am extreamly impressed with how quick <a href="http://280slides.com/">280 Slides</a> responds to user interactions and in addition to this the set of controls provided with Cappuccino have a nicer OS X quality to them.</p>
<p>My personal opinion is that the future of Rich Internet Applications does not lie with Javascript (though I am biased to Flex). It is not that I dislike Javascript, quite the oposite in fact. My reservations mainly lie in Javascript relying too heavily on the HTML DOM and is at the mercy of browsers and their stakeholders (for which there are too many). One of the nices things with technologies such as Flex and Silverlight is the cross browser consistency. Not only this but also the many rich media features such as image manipulation &amp; processing, the ability to do advanced animation including 3D animation, video features etc. which to me put the Rich in Rich Internet Applications.</p>
<p>I may well eat my words as two major players in the form of Apple and Google are backing Javascript as the future standard for RIA development. Google&#8217;s <a href="http://www.google.com/chrome">Chrome</a> browser addresses some of the performance and stability issues and Apple has recently based it&#8217;s online MobileMe business on Javascript (aparently using <a href="http://www.sproutcore.com/">SpoutCore</a>) as well as introducing new extensions to Javascript such as the Canvas tag that help overcome some of Javascripts shortfalls.</p>
<p>One thing is sure I take my hat off to these guys for pushing the boundaries of Javascript and in particular for implementing Objective-C in Javascript. If you are an Objective-C developer, it is well worth a look as you will be able to quickly develop javascript web applications using a near identical language. If not, check it out anyway. These guys can certainly claim that this is Cocoa for Web Development.</p>
<h3>Update</h3>
<p>I wanted to include a couple of code snippets (taken from Cappuccino.org) just to illustrate how similar to Objective-C, Objective J is.</p>
<p>In Objective-J classes are declared much like an Objective-C header file:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> Person <span style="color: #002200;">:</span> CPObject
<span style="color: #002200;">&#123;</span>
   CPString name;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Methods are declared using the identical Objective-C syntax:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>aName
<span style="color: #002200;">&#123;</span>
	name <span style="color: #002200;">=</span> aName;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>name
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> name;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>And class methods can be called using a once again similar syntax:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>myPerson setJobTitle<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">&quot;Founder&quot;</span> company<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">&quot;280 North&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p><a href="http://theocacao.com/document.page/593">Cocoa Master Scott Stevenson has done a nice comparison between Cocoa and Cappuccino, well worth a read..</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=Hs5PCJsS7WQ:NxfkIggv_bM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=Hs5PCJsS7WQ:NxfkIggv_bM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=l6gmwiTKsz0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/miletbaker?i=Hs5PCJsS7WQ:NxfkIggv_bM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/miletbaker?a=Hs5PCJsS7WQ:NxfkIggv_bM:XAVGb8Xj5zA"><img src="http://feeds.feedburner.com/~ff/miletbaker?d=XAVGb8Xj5zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/miletbaker/~4/Hs5PCJsS7WQ" height="1" width="1"/>]]></content:encoded><description>This may be an unusual first post in my Objective-C and Cocoa categories however it is quite relevant as the guys behind 280 Slides have released a new open source extension to the Javascript language known as Objective-J and a new Javascript framework based on Cocoa named Cappuccino.
Other than having a very nice logo designed [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.gotripod.com/2008/09/07/objective-j-cappuccino/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">3</slash:comments><feedburner:origLink>http://www.gotripod.com/2008/09/07/objective-j-cappuccino/</feedburner:origLink></item></channel></rss>
