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

<channel>
	<title>refactr blog on software development, design, agile processes, and business</title>
	<atom:link href="http://refactr.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://refactr.com/blog</link>
	<description>informs on and evangelizes best practices of using  &#60;a href="http://refactr.com/the-agile-manifesto/"&#62;agile methods&#60;/a&#62; when designing and developing what are currently being called “Web 2.0” products and applications.</description>
	<lastBuildDate>Tue, 23 Oct 2012 19:22:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>More Grails Filter Tricks: JSONify Controller Actions</title>
		<link>http://refactr.com/blog/2012/10/more-grails-filter-tricks-jsonify-controller-actions/</link>
		<comments>http://refactr.com/blog/2012/10/more-grails-filter-tricks-jsonify-controller-actions/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 15:16:17 +0000</pubDate>
		<dc:creator>Josh Reed</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=2076</guid>
		<description><![CDATA[Building on the previous post, we can use the same filter tricks to clean up some other controller smells. When building REST APIs, it&#8217;s a common requirement to output your data in JSON and/or XML. This is usually accomplished using &#8230; <a href="http://refactr.com/blog/2012/10/more-grails-filter-tricks-jsonify-controller-actions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Building on the previous post, we can use the same filter tricks to clean up some other controller smells.  When building REST APIs, it&#8217;s a common requirement to output your data in JSON and/or XML.  This is usually accomplished using <a href="http://grails.org/doc/latest/guide/single.html#contentNegotiation">Content Negotiation</a> and the <code>withFormat</code> method:<br />
<span id="more-2076"></span></p>
<pre><code>class BookController {
    def list() {
        def books = Book.list()
        withFormat {
            html bookList: books
            json { render books as JSON }
        }
    }
}
</code></pre>
<p>Both of the formats in the <code>withFormat</code> block are working with the same list of books, just rendering them differently.  We can use the same <strong>after</strong> filter trick to clean this up a bit:</p>
<pre><code>jsonify(controller: '*', action: '*') {
    after = { Map model -&gt;
        def accept = request.getHeader('Accept')
        if (!accept.contains('application/json')) { return true }

        // find our controller to see if the action is jsonified
        def artefact = grailsApplication
            .getArtefactByLogicalPropertyName("Controller", controllerName)
        if (!artefact) { return true }

        // check if our action is jsonified
        def isJsonified = artefact.clazz.declaredFields.find {
            it.name == 'jsonify' &amp;&amp; isStatic(it.modifiers)
        } != null

        def jsonified = isJsonified ? artefact.clazz?.jsonify : []
        if (actionName in jsonified || '*' in jsonified) {
            // check if we can unwrap the model (such in the case of a show)
            if (model.size() == 1) {
                def nested = model.find { true }.value
                render nested as JSON
            } else {
                render model as JSON
            }
            return false
        }
        return true
    }
}
</code></pre>
<p>This filter has a similar structure as the <code>ajaxify</code> one.  Instead of looking for an AJAX request, we check to see if the Accept header is &#8216;<code>application/json</code>&#8216;.  Next we check whether the controller has a <code>static jsonify = [...]</code> declaration that includes the action being called.  If so, we render the model as JSON.  The filter also tries to be a bit smart.  If the model only has a single key, e.g. [bookInstance: book], it&#8217;ll render just the value.  This results in a more natural output:</p>
<pre><code>{"title":"The Stand","author":"Stephen King"}</code></pre>
<p>vs</p>
<pre><code>{"bookInstance":{"title":"The Stand","author":"Stephen King"}}</code></pre>
<p>With the filter, our controller actions can go back to their standard, unadulterated form in favor of a <code>jsonify</code> declaration:</p>
<pre><code>class BookController {
    static jsonify = ['list', 'show']

    def list() {
        [bookList: Book.list()]
    }
    ...
}
</code></pre>
<h3>Conclusion</h3>
<p>This is another way to use filters to keep your controller actions cleaner.  It should be noted that the <code>withFormat</code> looks at more than just the Accept header when deciding what format was requested.  It also looks at the URL for an explicit <code>format=json</code> URL parameter and for a filename extension, e.g. <code>/book/show/1.js</code>.  The filter as written only uses the Accept header, which is common practice when building APIs, but you should evaluate whether that will fit your needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/10/more-grails-filter-tricks-jsonify-controller-actions/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>iOS tips: @synchronized</title>
		<link>http://refactr.com/blog/2012/10/ios-tips-synchronized/</link>
		<comments>http://refactr.com/blog/2012/10/ios-tips-synchronized/#comments</comments>
		<pubDate>Fri, 12 Oct 2012 14:59:57 +0000</pubDate>
		<dc:creator>Steve Vlaminck</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[synchronized]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=2085</guid>
		<description><![CDATA[If you&#8217;re just getting started with threading in Objective-C, it won&#8217;t be long before you&#8217;ll need to make some thread-safe modifications to objects. One of the many useful tools that Objective-C gives us is the @synchronized directive. From the documentation: &#8230; <a href="http://refactr.com/blog/2012/10/ios-tips-synchronized/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re just getting started with threading in Objective-C, it won&#8217;t be long before you&#8217;ll need to make some thread-safe modifications to objects. One of the many useful tools that Objective-C gives us is the <code>@synchronized</code> directive. From the <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html" target="_blank">documentation</a>:</p>
<blockquote><p>The <code>@synchronized</code> directive is a convenient way to create mutex locks on the fly in Objective-C code. The <code>@synchronized</code> directive does what any other mutex lock would do—it prevents different threads from acquiring the same lock at the same time.</p></blockquote>
<p>Using <code>@synchronized</code> is super easy</p>
<pre><code>@synchronized(key) {
// thread-safe code goes here
}</code></pre>
<p><span id="more-2085"></span></p>
<h3>Examples!</h3>
<p>First we&#8217;re going to create an <code>NSMutableArray</code> and fill it with garbage.</p>
<pre><code>bigArray = [NSMutableArray arrayWithCapacity:5];
&nbsp;for (int i = 0; i &lt; 5; i++) {
&nbsp;&nbsp;[bigArray addObject:[NSString stringWithFormat:@"object-%i", i]];
}</code></pre>
<p>And a method to display/modify the array.</p>
<pre><code>- (void)updateBigArray:(NSString *)value {
&nbsp;for (int j = 0; j &lt; bigArray.count; j++) {
&nbsp;&nbsp;NSString *currentObject = [bigArray objectAtIndex:j];

&nbsp;&nbsp;[bigArray replaceObjectAtIndex:j withObject:[currentObject stringByAppendingFormat:@"-%@", value]];

&nbsp;&nbsp;NSLog(@"%@", [bigArray objectAtIndex:j]);
&nbsp;}
}</code></pre>
<p>Now let&#8217;s call our method on two separate threads. Notice I&#8217;m sending <code>foo</code> in for both of them. I&#8217;ll explain why in a bit.</p>
<pre><code>NSString *foo = @"foo";

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&nbsp;[self updateBigArray:foo];
});

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&nbsp;[self updateBigArray:foo];
});
</code></pre>
<p>This gives us the output:
<pre>object-0-foo
object-0-foo
object-1-foo-foo
object-1-foo
object-2-foo
object-2-foo
object-3-foo
object-3-foo
object-4-foo-foo
object-4-foo</pre>
<p>Both threads are working over the top of each other which could lead to app crashes depending on what you&#8217;re doing. So let&#8217;s update our method to use <code>@synchronized</code> with <code>value</code> as our lock key.</p>
<pre><code>- (void)updateBigArray:(NSString *)value {
&nbsp;@synchronized (value) {
&nbsp;&nbsp;for (int j = 0; j &lt; bigArray.count; j++) {
&nbsp;&nbsp;&nbsp;NSString *currentObject = [bigArray objectAtIndex:j];

&nbsp;&nbsp;&nbsp;[bigArray replaceObjectAtIndex:j withObject:[currentObject stringByAppendingFormat:@"-%@", value]];

&nbsp;&nbsp;&nbsp;NSLog(@"%@", [bigArray objectAtIndex:j]);
&nbsp;&nbsp;}
&nbsp;}
}</code></pre>
<pre>object-0-foo
object-1-foo
object-2-foo
object-3-foo
object-4-foo
object-0-foo-foo
object-1-foo-foo
object-2-foo-foo
object-3-foo-foo
object-4-foo-foo
</pre>
<p>That looks a lot better. What&#8217;s happening is that our <code>@synchronized</code> block effectively pauses one thread, allowing the other thread access to the block, then un-pauses it once the first has finished.</p>
<h3>So what about the key?</h3>
<p>This is where it gets interesting. If you pass the same object to <code>@synchronized</code> as the key, it will get paused (which we just saw). However, if you send a different object than the key it will get through. Remember when we passed <code>foo</code> through twice? Let&#8217;s pass something else the second time instead.</p>
<pre><code>NSString *foo = @"foo";
NSString *bar = @"bar";

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&nbsp;[self updateBigArray:foo];
});

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&nbsp;[self updateBigArray:bar];
});
</code></pre>
<pre>object-0-foo
object-0-bar
object-1-foo
object-1-bar
object-2-foo
object-2-foo-bar
object-3-foo
object-3-foo-bar
object-4-foo
object-4-foo-bar</pre>
<p>There could be reasons why you would want to lock on <code>value</code>, but in this case it would be smarter to use a different key.<br />
Let&#8217;s use</p>
<pre><code>&nbsp;@synchronized (bigArray) {
...
</code></pre>
<p>instead of</p>
<pre><code>&nbsp;@synchronized (value) {
...
</code></pre>
<p><code>
<pre>object-0-foo
object-1-foo
object-2-foo
object-3-foo
object-4-foo
object-0-foo-bar
object-1-foo-bar
object-2-foo-bar
object-3-foo-bar
object-4-foo-bar</pre>
<p></code></p>
<h3>In the end</h3>
<p> <code>@synchronized</code> is a great shorthand mutex lock. It may not be the most efficient lock, but chances are you won&#8217;t notice. If you&#8217;re just getting started with threading, I highly recommend getting more familiar with it.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/10/ios-tips-synchronized/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Grails Filter Tricks: Ajaxify Controller Actions</title>
		<link>http://refactr.com/blog/2012/10/grails-filter-tricks-ajaxify-controller-actions/</link>
		<comments>http://refactr.com/blog/2012/10/grails-filter-tricks-ajaxify-controller-actions/#comments</comments>
		<pubDate>Fri, 05 Oct 2012 16:01:47 +0000</pubDate>
		<dc:creator>Josh Reed</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[grails]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=2051</guid>
		<description><![CDATA[A common requirement in the last couple of projects I worked on was the ability to create and edit domain classes via modal dialogs instead of Grail&#8217;s standard scaffolded pages. Originally I started down the path of embedding hidden forms &#8230; <a href="http://refactr.com/blog/2012/10/grails-filter-tricks-ajaxify-controller-actions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A common requirement in the last couple of projects I worked on was the ability to create and edit domain classes via modal dialogs instead of Grail&#8217;s standard scaffolded pages. Originally I started down the path of embedding hidden forms in page and displaying them as needed. This quickly proved cumbersome on pages with many editable objects. I then hit upon the idea of fetching the forms via AJAX and displaying them in the modal dialogs. This worked pretty well but meant that I had to update some of my controller actions, typically &#8216;<strong>create</strong>&#8216; and &#8216;<strong>edit</strong>&#8216;, to be aware of AJAX requests so they would only render the appropriate form instead of the whole page. The updates were relatively minor, usually as simple as adding a check of <code>request.xhr</code> and rendering a template:<br />
<span id="more-2051"></span></p>
<pre><code>def create() {
    def book = new Book()
    if (request.xhr) {
        render(template: 'createAjax', model: [instance: book])
    } else {
        [instance: book]
    }
}
</code></pre>
<p>This same pattern was repeated in every action I wanted to expose. It worked but was not very DRY, so I set out to find a better way. Since it&#8217;s the same model but routed to a different view for AJAX requests, I figured I might leverage the magic of <a href="http://grails.org/doc/latest/guide/single.html#filters">Grails Filters</a>. Filters give us a chance to intercept requests before they go to the controller (<strong>before</strong>), after the controller but before it gets passed to the view (<strong>after</strong>), and after the view is rendered (<strong>afterView</strong>). An after filter is just the ticket:</p>
<pre><code>ajaxify(controller: '*', action: '*') {
    after = { Map model -&gt;
        // only intercept AJAX requests
        if (!request.xhr) { return true }

        // find our controller to see if the action is ajaxified
        def artefact = grailsApplication
            .getArtefactByLogicalPropertyName("Controller", controllerName)
        if (!artefact) { return true }

        // check if our action is ajaxified
        def isAjaxified = artefact.clazz.declaredFields.find {
            it.name == 'ajaxify' &amp;&amp; isStatic(it.modifiers)
        } != null

        def ajaxified = isAjaxified ? artefact.clazz?.ajaxify : []
        if (actionName in ajaxified || '*' in ajaxified) {
            render(template: "/${controllerName}/${actionName}Ajax",
                model: model)
            return false
        }
        return true
    }
}
</code></pre>
<p>The filter intercepts AJAX requests after they are processed by the controller. It looks in the controller to see if it declares a &#8216;<strong>ajaxify</strong>&#8216; static field. If so, and if the current action is listed in the ajaxify list, the filter takes the returned model and renders a template using the naming convention of: <strong>_&lt;action&gt;Ajax.gsp</strong>.</p>
<p>With this filter, the only change we need to make in a controller to expose actions is to declare them in a static field. The actions themselves remain unchanged:</p>
<pre><code>class BookController {
    static ajaxify = ['create', 'edit']

    def create() {
        [bookInstance: new Book()]
    }
    ...
}
</code></pre>
<p>We also need to make sure that an appropriate template exists for the action, e.g. <code>grails-app/views/book/_createAjax.gsp</code>.</p>
<h3>Bonus</h3>
<p>As a bonus, here&#8217;s a quick little Javascript trick we use with this modal technique. The user should be able to perform their action even if something goes wrong with the AJAX request or if Javascript is disabled. To support this, we use a standard link to the controller action and then add a special CSS class for the links we want to trigger a modal:</p>
<pre>&lt;g:link controller="project" action="create"
    class="ajax-modal"&gt;Add Project&lt;/g:link&gt;
</pre>
<p>We then use a little Javascript to progressively enhance the <strong>ajax-modal</strong> links to pop open a modal dialog instead of following the link:</p>
<pre><code>$('.ajax-modal').live('click', function() {
    var url = $(this).attr('href');
    $('.modal').load(url, function() {
        // using the Twitter Bootstrap modal here
        $(this).modal({ show: true });
    });
    return false;
});
</code></pre>
<p>If all works well, the user will see the create/edit/etc. form in a modal dialog. If something goes wrong with the Javascript or AJAX request, the browser should take the user to the linked page.</p>
<h3>Conclusion</h3>
<p>While nothing earth-shattering, these little tricks have helped to DRY up a couple of my codebases.  Hopefully they highlight the power of filters in Grails and are of use to you.</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/10/grails-filter-tricks-ajaxify-controller-actions/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>It&#8217;s not about automation, its about elimination</title>
		<link>http://refactr.com/blog/2012/10/its-not-about-automation-its-about-elimination/</link>
		<comments>http://refactr.com/blog/2012/10/its-not-about-automation-its-about-elimination/#comments</comments>
		<pubDate>Thu, 04 Oct 2012 15:32:25 +0000</pubDate>
		<dc:creator>Matt Bjornson</dc:creator>
				<category><![CDATA[Agile Processes]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Corporate America]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1766</guid>
		<description><![CDATA[Yesterday, after finishing up a meeting at a coffee shop, I happened to overhear two people talking about IT automation. I wasn&#8217;t eavesdropping, one of the men was so adamant in his &#8220;they don&#8217;t get automation&#8221; tirade, I am sure &#8230; <a href="http://refactr.com/blog/2012/10/its-not-about-automation-its-about-elimination/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yesterday, after finishing up a meeting at a coffee shop, I happened to overhear two people talking about IT automation. I wasn&#8217;t eavesdropping, one of the men was so adamant in his &#8220;they don&#8217;t get automation&#8221; tirade, I am sure half of the people in the coffee shop did as well. </p>
<p>&#8220;Sorry *you* don&#8217;t get it, it&#8217;s about elimination, not automation&#8221;, is what I wanted to say. I didn&#8217;t. Don&#8217;t get me wrong, where appropriate, automation is a good thing, but it begs a *bigger* question: why? This is a good time to pull out the &#8220;5 Whys&#8221; from our Lean toolkit, which originated with the Toyota Production System. It&#8217;s *really* simple, just ask &#8216;why?&#8217; five times.</p>
<p>The 5 Why&#8217;s is a simple, but not easy, tool to use to get to a root cause. You start by asking &#8220;why are we doing x&#8221;, wait for a response, to which you respond with a &#8220;why?&#8221;, followed by a response. This iterates for three more cycles of &#8220;why?&#8221; followed by responses &#8211; you know, like a 5-year-old.</p>
<p>What is the first &#8220;why&#8221; we should be asking? If you said &#8220;why are we automating?&#8221;, you&#8217;d be wrong. The correct answer is&#8230;..</p>
<p><strong>&#8220;Why are we doing this at all, is this a value add activity?&#8221;</strong></p>
<p>Value add means &#8211; is the customer willing to pay for this? It&#8217;s time to be brutally honest here, and it&#8217;s especially difficult for Corporate America&#8217;s IT organizations to answer. They are far too separated from the customer. I would venture the response to this question is something along the lines of &#8220;this is how we do that&#8221; or &#8220;it says in our process document&#8221;. </p>
<p><strong>&#8220;Why?&#8221;</strong></p>
<p>At this point, we start to get into institutional disfunction, and culture problems (which often manifest themselves as technical debt). This process needs to be honest, candid, and without political motivation. Tough to do in Corporate America, but many companies have implemented Lean, why shouldn&#8217;t IT be the same?</p>
<p>You&#8217;ve got 3 more &#8220;whys&#8221; to ask&#8230; If, at the end of each of these 5 whys, you don&#8217;t receive responses that indicate there are good reasons to be performing an activity, you shouldn&#8217;t be doing it. Activities that aren&#8217;t value-added should be eliminated. </p>
<p>What does this typically say about IT Operations? What activities in your development team and process are value-added?</p>
<p>Even in startup companies, what features of your product are value-add? The highest value-added should really be what your MVP is about. The lowest, don&#8217;t do them. </p>
<p>Eliminate where possible, automate if you can&#8217;t eliminate. </p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/10/its-not-about-automation-its-about-elimination/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iOS tips: Custom Fonts</title>
		<link>http://refactr.com/blog/2012/09/ios-tips-custom-fonts/</link>
		<comments>http://refactr.com/blog/2012/09/ios-tips-custom-fonts/#comments</comments>
		<pubDate>Wed, 19 Sep 2012 15:01:54 +0000</pubDate>
		<dc:creator>Steve Vlaminck</dc:creator>
				<category><![CDATA[Agile Processes]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1851</guid>
		<description><![CDATA[My good friend google told me that using a custom font in iOS is &#8220;easy&#8221;. And for the most part it is, but I got tripped up in a few places. I happen to have Apples Keychain example code lying around &#8230; <a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My good friend google told me that using a custom font in iOS is &#8220;easy&#8221;. And for the most part it is, but I got tripped up in a few places. I happen to have Apples Keychain example code lying around so I&#8217;ll be using that in this example. I am also using Xcode 4.5 and focusing on iOS 5.1, and iOS 6.</p>
<h2>Adding the font to your project</h2>
<p>Drag the .ttf file to your project.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/add-ttf-to-project/" rel="attachment wp-att-1852"><img class="alignnone size-full wp-image-1852" src="http://refactr.com/blog/wp-content/uploads/2012/08/add-ttf-to-project.png" alt="" width="518" height="242" /></a></p>
<p><span id="more-1851"></span></p>
<p>Make sure &#8220;Add to targets&#8221; is checked.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/add-ttf-to-project-target-2/" rel="attachment wp-att-1858"><img class="alignnone size-full wp-image-1858" src="http://refactr.com/blog/wp-content/uploads/2012/08/add-ttf-to-project-target1.png" alt="" width="1240" height="864" /></a></p>
<p>Verify the font is in the project. There are two places you can do this.</p>
<p>By selecting the font, and verifying &#8220;Target Membership&#8221; in the Utilities area.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/add-ttf-taget-membership-2/" rel="attachment wp-att-1857"><img class="alignnone size-full wp-image-1857" src="http://refactr.com/blog/wp-content/uploads/2012/08/add-ttf-taget-membership1.png" alt="" width="2220" height="1396" /></a></p>
<p>And By selecting your apps target, selecting the &#8220;Build Phases&#8221; tab, and verifying that your font is in the &#8220;Copy Bundle Resources&#8221; section.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/add-ttf-build-phases-2/" rel="attachment wp-att-1856"><img class="alignnone size-full wp-image-1856" src="http://refactr.com/blog/wp-content/uploads/2012/08/add-ttf-build-phases1.png" alt="" width="1970" height="1231" /></a></p>
<p>And finally, add the font to your Info.plist. Note that most apps change the name of their plist to something like &lt;ProjectName&gt;-Info.plist. Add a key of &#8220;Fonts provided by application&#8221;, and make sure it&#8217;s an array, then add your font file name as an item in the array. Make sure you use the exact file name, and that your file name has an all-lowercase extension (.TTF apparently doesn&#8217;t work on iPhones, but .ttf does).</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/add-ttf-to-plist/" rel="attachment wp-att-1881"><img class="alignnone size-full wp-image-1881" src="http://refactr.com/blog/wp-content/uploads/2012/08/add-ttf-to-plist.png" alt="" width="1979" height="1237" /></a></p>
<h2>Knowing your font</h2>
<p>This is where I had some issues. When you <strong>add</strong> your font you use the <strong>file</strong> name, but when you <strong>use</strong> your font you use the <strong>font</strong> name&#8230; The EXACT font name. If you ctrl + click on the .ttf file and select &#8220;Get Info&#8221;, you can find the &#8220;Full Name&#8221;. That seems to work with a lot of fonts, but the font I&#8217;m using doesn&#8217;t work that way. I had to open the .ttf file in the Font Book application, and look at the window header.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/know-your-font-name/" rel="attachment wp-att-1882"><img class="alignnone size-full wp-image-1882" src="http://refactr.com/blog/wp-content/uploads/2012/08/know-your-font-name.png" alt="" width="1781" height="1113" /></a></p>
<p>Using this name, you can log what font names you have available by using the fontNamesForFamilyName method like so:</p>
<p><code><br />
NSLog(@"tt0001m_: %@",<br />
[UIFont fontNamesForFamilyName:@"Swis721 Lt BT"]<br />
);<br />
</code></p>
<p>Which gives the output:<br />
<code>2012-08-24 11:25:10.968 GenericKeychain[7260:c07] tt0001m_: (<br />
"Swiss721BT-Light"<br />
)</code></p>
<h2>Using your font programmatically</h2>
<p>Say you have a UILabel:<br />
<code><br />
UILabel *myLabel = [[UILabel alloc] init];<br />
[myLabel setText:@"Label Text"];<br />
</code></p>
<p>We set the font of our label by creating a UIFont, and setting it to our label with setFont.<br />
<code><br />
UIFont *swissLight = [UIFont<br />
fontWithName:@"Swiss721BT-Light"<br />
size:myLabel.font.pointSize];<br />
[myLabel setFont:swissLight];<br />
</code></p>
<h2>Using your font in Interface Builder</h2>
<p>This is an interesting solution that I got from <a title="stackoverflow" href="http://stackoverflow.com/questions/4284817/using-custom-fonts-in-interface-builder/6620938#6620938" target="_blank">stackoverflow</a>. First you need to create a subclass of UILabel. Hit Cmd + N (or go to File &gt; New &gt; File&#8230;), select &#8220;Cocoa Touch&#8221; &gt; &#8220;Objective-C class&#8221;, and hit &#8220;Next&#8221;. Name your class something like CustomFontSwissLightLabel and choose UILabel in the &#8220;Subclass of&#8221; section. Open your CustomFontSwissLightLabel.m file and override the awakeFromNib method like so:<br />
<code><br />
- (void)awakeFromNib {<br />
[super awakeFromNib];<br />
self.font = [UIFont fontWithName:@"Swiss721BT-Light"<br />
size:self.font.pointSize];<br />
}<br />
</code><br />
Now add a UILabel to you .xib file. In the &#8220;Utilities&#8221; area, under the &#8220;Identity Inspector&#8221; tab change the Class from UILabel to CustomFontSwissLightLabel.</p>
<p><a href="http://refactr.com/blog/2012/09/ios-tips-custom-fonts/use-your-font-interface-builder/" rel="attachment wp-att-1899"><img class="alignnone size-full wp-image-1899" src="http://refactr.com/blog/wp-content/uploads/2012/08/use-your-font-interface-builder.png" alt="" width="2228" height="1393" /></a></p>
<p><strong>That&#8217;s all there is to it. </strong></p>
<p>It really is pretty easy, but there are a handful of things that can trip you up, and I wrote this blog post because I got tripped up on every one of them :)</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/09/ios-tips-custom-fonts/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Welcome Scott Atkins!</title>
		<link>http://refactr.com/blog/2012/09/welcome-scott-atkins/</link>
		<comments>http://refactr.com/blog/2012/09/welcome-scott-atkins/#comments</comments>
		<pubDate>Mon, 17 Sep 2012 16:10:04 +0000</pubDate>
		<dc:creator>Matt Bjornson</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[growth]]></category>
		<category><![CDATA[new hires]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1966</guid>
		<description><![CDATA[We&#8217;re excited to welcome Scott Atkins to the team! He&#8217;s joining us from Garmin where he has been developing mobile products for iOS, Android and Windows Mobile. Scott will be jumping into a project that we&#8217;re very excited about: SmartThings. &#8230; <a href="http://refactr.com/blog/2012/09/welcome-scott-atkins/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re excited to welcome <a href="http://refactr.com/team/atkins/">Scott Atkins</a> to the team! He&#8217;s joining us from Garmin where he has been developing mobile products for iOS, Android and Windows Mobile.</p>
<p style="margin: -30px 0 0 0">
<a href="http://refactr.com/team/atkins/"><img src="http://refactr.com/blog/wp-content/uploads/2012/09/scotta.jpg" alt="" title="Scott Atkins" width="575" height="320" class="aligncenter size-full wp-image-1972" /></a>
</p>
<p>Scott will be jumping into a project that we&#8217;re very excited about: <a href="http://smartthings.com" title="SmartThings" target="_blank">SmartThings</a>. He&#8217;ll be working on the mobile clients of SmartThings. Scott is particularly proud of his work developing Garmin&#8217;s Pilot for iOS product. He also enjoyed development of the Android app, MyCast, which he worked on for the past 3 years.</p>
<p>Welcome Scott!</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/09/welcome-scott-atkins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails Tip: Deploy to the Cloud with AppFog</title>
		<link>http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/</link>
		<comments>http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/#comments</comments>
		<pubDate>Tue, 28 Aug 2012 14:36:43 +0000</pubDate>
		<dc:creator>Matt Nohr</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[hosting]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1801</guid>
		<description><![CDATA[AppFog (appfog.com, @appfog) is a relatively new cloud platform that lets you deploy your applications to one of a number of different cloud providers like HP Openstack, Rackspace, and Amazon Web Services. It supports a number of languages and databases, &#8230; <a href="http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1825" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-20-at-8.41.30-AM.png" alt="AppFog Logo" width="184" height="50" />AppFog (<a title="AppFog website" href="http://appfog.com/">appfog.com,</a> <a title="AppFog on Twitter" href="https://twitter.com/appfog">@appfog</a>) is a relatively new cloud platform that lets you deploy your applications to one of a number of different cloud providers like HP Openstack, Rackspace, and Amazon Web Services. It supports a number of languages and databases,  but I&#8217;ll be focusing on Grails.</p>
<p>The real interesting part to me is that there is a free plan you can use to test your applications. The free plan currently includes unlimited number of applications, as long as you only use 2 GB of RAM. There is a 50 GB data transfer limit, and a 1 GB database limit. If the free plan is not quite enough, they have paid plans starting at $100/month.</p>
<h2>AppFog and Grails</h2>
<p>If you have a Grails application that you want to deploy to AppFog, it can be a little confusing the first time, but once you go through the process once, following these steps, it should be fairly straight-forward.<br />
<span id="more-1801"></span> Set Up the Application in AppFog</p>
<ol>
<li><a title="AppFog signup" href="https://console.appfog.com/signup">Create an account</a> with AppFog</li>
<li><img class="alignnone size-full wp-image-1803" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-20-at-8.16.14-AM.png" alt="AppFog - Create App" width="114" height="39" /> Click the Create App button:</li>
<li><img class="wp-image-1934 alignnone" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-28-at-8.12.53-AM.png" alt="" width="114" height="42" /> Choose Java Grails:</li>
<li><img class="alignnone  wp-image-1935" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-28-at-8.14.53-AM.png" alt="" width="114" height="39" /> Choose an infrastructure (AWS for example):</li>
<li>Pick a subdomain</li>
<li><img class="alignnone size-full wp-image-1936" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-28-at-8.15.49-AM.png" alt="" width="114" height="41" /> Click Create App:</li>
</ol>
<p>At this point it does some initialization, including creating and starting a default grails application. You could go to your new URL and see a Grails application running.</p>
<h3>Upload Your Grails App</h3>
<ol>
<li>Create a war file for your application (grails war)</li>
<li>Navigate to the /target directory where the .war file was built</li>
<li>The first time, you will have to install the &#8220;af&#8221; ruby gem. In your app console on AppFog there are instructions under &#8220;Update Source Code&#8221; for different platforms (or more <a title="AppFog Documentation" href="http://docs.appfog.com/getting-started/af-cli">detailed information here</a>)</li>
<li>Login from the console with the command &#8220;af login&#8221;. You will have to enter your email and password.</li>
<li>Upload your application with the command &#8220;af update &lt;project name&gt;&#8221;. This will take a minute or two depending on the size of your application (even a basic Grails application is over 20 MB)</li>
</ol>
<p><a href="http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/screen-shot-2012-08-20-at-8-09-39-am/" rel="attachment wp-att-1804"><img class="alignnone size-full wp-image-1804" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-20-at-8.09.39-AM.png" alt="AppFog Update" width="251" height="133" /></a></p>
<p>If you have multiple .war files in the /target directory, it appears to just take the first one it finds. You may want to do some clean-up in that directory if the wrong .war is being uploaded.</p>
<h3>Adding a Database</h3>
<p>You will probably need to configure a database. First you have to add the database (as a service) to your AppFog console. For this example I&#8217;ll be using MySQL:</p>
<p><a href="http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/screen-shot-2012-08-20-at-8-19-13-am/" rel="attachment wp-att-1809"><img class="alignnone size-full wp-image-1809" src="http://refactr.com/blog/wp-content/uploads/2012/08/Screen-Shot-2012-08-20-at-8.19.13-AM.png" alt="AppFog - Database" width="219" height="89" /></a></p>
<ol>
<li>Go to your <a title="AppFog Console" href="http://console.appfog.com">console</a></li>
<li>Click &#8220;Services&#8221;</li>
<li>Click &#8220;MySQL&#8221; button, give it a name, and click &#8220;Create&#8221;</li>
<li>Then you may have to &#8220;bind&#8221; this to your application, so click the &#8220;Bind&#8221; button.</li>
</ol>
<h3>Configuring the Database</h3>
<p>With MySQL (and the other databases), AppFog stores all the login information in a system environment variable called &#8220;VCAP_SERVICES&#8221;. To use that you will have to update your DataSource.groovy file. Here is an example of how I configured a production datasource:</p>
<pre>production {
   def envVar = System.env.VCAP_SERVICES
   def credentials = envVar?grails.converters.JSON.parse(envVar)["mysql-5.1"][0]["credentials"]:null

   dataSource {
      pooled = true
      dbCreate = "update"
      driverClassName = "com.mysql.jdbc.Driver"
      url =  credentials?"jdbc:mysql://${credentials.hostname}:${credentials.port}/${credentials.name}?useUnicode=yes&amp;characterEncoding=UTF-8":""
      username = credentials?credentials.username:""
      password = credentails?credentials.password:""
   }
}</pre>
<h2>Summary</h2>
<p>Getting your application configured the first time does take a little work. Hopefully this guide makes it a little bit easier. The free plan seems like a good platform to use for testing/proof-of-concept type applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/08/grails-tip-deploy-to-the-cloud-with-appfog/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Creating a Flipping Tile Transition in Motion 5 for Final Cut Pro X</title>
		<link>http://refactr.com/blog/2012/08/creating-a-flipping-tile-transition-in-motion-5-for-final-cut-pro-x/</link>
		<comments>http://refactr.com/blog/2012/08/creating-a-flipping-tile-transition-in-motion-5-for-final-cut-pro-x/#comments</comments>
		<pubDate>Tue, 21 Aug 2012 14:19:47 +0000</pubDate>
		<dc:creator>Hiromi Matsumoto</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1835</guid>
		<description><![CDATA[One of our clients wanted a transition for a marketing video that mimics the tile animation in their mobile app. There are a few options to accomplish this. FCPx ships with a few similar transitions like “Mosaic”, but they don’t &#8230; <a href="http://refactr.com/blog/2012/08/creating-a-flipping-tile-transition-in-motion-5-for-final-cut-pro-x/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p class="fitVid-container">
<iframe width="560" height="315" src="http://www.youtube.com/embed/cW7oouqBux4" frameborder="0" allowfullscreen></iframe>
</p>
<p><a href="http://smartthings.com/" target="_blank">One of our clients</a> wanted a transition for a marketing video that mimics the tile animation in their mobile app. There are a few options to accomplish this. FCPx ships with a few similar transitions like “Mosaic”, but they don’t offer granular control over the grid configuration, or the direction of the animation. There are also paid third party plugins, but they don’t seem to have been updated to work within FCPx. So here’s one possible 10 minute solution:</p>
<p><span id="more-1835"></span></p>
<p>Open Motion 5 and from the project browser, open a new blank Final Cut Transition template. Within the template, you’ll notice a group with two layers is created for you automatically. The top layer (“Transition A”) represents the clip you’ll be transitioning from, and “Transition B” represents the clip you’ll be transitioning to. Since we want our transition to start revealing the underlying layer right away, drag each transition so that they cover the entire timeline.</p>
<p>Next, using the shape tool, create the shape you want to tile. In my case this is just a square. The position of the shape doesn’t matter, since it will only be used as a reference.</p>
<p>Once you have your shape selected, click the “Create Replicator” button with the atom-like icon on the right side. This automatically creates a 5 x 5 grid of our select shape. Drag and position the grid container to fill the screen. With the replicator layer selected, open the Inspector in the upper left. Set the number of columns and rows to produce a full grid. Below the “Replicator Controls”, the “Cell Controls” modify the shapes properties. Bump up the shape’s “Scale” until there are no gaps in the grid. Because we want the tile to “flip” in 3D space, check the “3D” box within Replicator Controls. From there you can specify the “Origin” of the animation (Lower Left, Upper Right&#8230; etc) as well as the “Build Style” (Across, By Row, By Column&#8230; etc)</p>
<p>Nothing moves yet. So to make it animate, select the shape layer and click on the “Behaviors” button with the gear icon and select “Replicators » Sequence Replicator”. In the “Behaviors” tab on the left, we can add parameters that will make our grid animate. Since we want to “flip” the tiles, pull open the “Add” menu and select “Rotation”. Expand the rotation dialogue and change the Y axis to 90 degrees. Then add an opacity parameter and set it to 0%. As you scrub the playhead thru the timeline, you’ll see that we told Motion to rotate each of our tiles in turn and animate the opacity to 0% at the end of each rotation. To spread the animation out more evenly, modify the “Spread” slider and set easing to taste under the “Traversal” dialogue.</p>
<p>Now we want to get this animated grid to affect the transition layers underneath. Right-click “Transition A” and select “Add Image Mask”. Drag the Replicator layer onto the blank image mask and Motion will hide the replicator layer and use it as a reference for the transition layer.</p>
<p>At this point, the transition is done. However, if you want to be able to modify parameters from within FCPx, select “Publish” from the pull down menu next to each parameter you want to be able to modify. Save the project, and the transition will show up automatically in FCPx.</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/08/creating-a-flipping-tile-transition-in-motion-5-for-final-cut-pro-x/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Reserved Words as Grails Domain Objects</title>
		<link>http://refactr.com/blog/2012/08/reserved-words-as-grails-domain-objects/</link>
		<comments>http://refactr.com/blog/2012/08/reserved-words-as-grails-domain-objects/#comments</comments>
		<pubDate>Tue, 14 Aug 2012 15:51:30 +0000</pubDate>
		<dc:creator>Matt Nohr</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[domain classes]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[H2]]></category>
		<category><![CDATA[persistence]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1789</guid>
		<description><![CDATA[I recently ran into a SQL exception creating a simple domain class called &#8220;Group&#8221; that looked like this: class Group { static constratints = {} } When I ran my application I got this not-exactly-helpful error: &#124; Compiling 1 source &#8230; <a href="http://refactr.com/blog/2012/08/reserved-words-as-grails-domain-objects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I recently ran into a SQL exception creating a simple domain class called &#8220;Group&#8221; that looked like this:</p>
<pre>class Group {
    static constratints = {}
}</pre>
<p>When I ran my application I got this not-exactly-helpful error:</p>
<pre>| Compiling 1 source files....
| Running Grails application
| Error 2012-08-14 09:30:01,325 [pool-5-thread-1] ERROR hbm2ddl.SchemaExport - Unsuccessful: create table group (id bigint generated by default as identity, version bigint not null, primary key (id))
| Error 2012-08-14 09:30:01,325 [pool-5-thread-1] ERROR hbm2ddl.SchemaExport - Syntax error in SQL statement "CREATE TABLE GROUP[*] (ID BIGINT GENERATED BY DEFAULT AS IDENTITY, VERSION BIGINT NOT NULL, PRIMARY KEY (ID)) "; expected "identifier"; SQL statement:
create table group (id bigint generated by default as identity, version bigint not null, primary key (id)) [42001-164]
| Server running. Browse to http://localhost:8080/test</pre>
<p><span id="more-1789"></span><br />
I should say that once I figured out the problem, then the error message did make sense. The problem turned out to be that I was trying to use a reserved word for the H2 database, in this case &#8220;Group&#8221;. And you cannot create a table with the same name as a keyword.</p>
<p>Luckily, this is pretty easy to fix and still use the same domain class. Just add a &#8220;static mapping&#8221; block so your class looks like this:</p>
<pre>class Group {
    static constratints = {}
    static mapping = { table 'my_group' }
}</pre>
<p>This will vary based on your database implementation. For H2, here are the list of keywords you cannot use (from <a title="H2 Advanced Documentation" href="http://www.h2database.com/html/advanced.html">H2 documentation</a>):</p>
<p>CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, DISTINCT, EXCEPT, EXISTS, FALSE, FOR, FROM, FULL, GROUP, HAVING, INNER, INTERSECT, IS, JOIN, LIKE, LIMIT, MINUS, NATURAL, NOT, NULL, ON, ORDER, PRIMARY, ROWNUM, SELECT, SYSDATE, SYSTIME, SYSTIMESTAMP, TODAY, TRUE, UNION, UNIQUE, WHERE</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/08/reserved-words-as-grails-domain-objects/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GR8Conf Overview</title>
		<link>http://refactr.com/blog/2012/08/gr8conf-overview/</link>
		<comments>http://refactr.com/blog/2012/08/gr8conf-overview/#comments</comments>
		<pubDate>Fri, 03 Aug 2012 15:48:47 +0000</pubDate>
		<dc:creator>Matt Nohr</dc:creator>
				<category><![CDATA[Agile Processes]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[gr8conf]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>

		<guid isPermaLink="false">http://refactr.com/blog/?p=1769</guid>
		<description><![CDATA[This week was the United States GR8Conf, and we were lucky enough to have it right here in Minneapolis. GR8Conf is a conference focusing on Groovy and Grails and is held in the US, Europe, and Australia. Refactr was one &#8230; <a href="http://refactr.com/blog/2012/08/gr8conf-overview/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img class="size-full wp-image-1771 aligncenter" src="http://refactr.com/blog/wp-content/uploads/2012/08/gr8uslogo_with_tagline.png" alt="" width="241" height="79" /></p>
<p>This week was the United States <a title="GR8Conf Website" href="http://gr8conf.us/">GR8Conf</a>, and we were lucky enough to have it right here in Minneapolis. GR8Conf is a conference focusing on Groovy and Grails and is held in the US, Europe, and Australia. Refactr was one of the sponsors this year as well.<br />
<span id="more-1769"></span><br />
The conference started off on Sunday with a few introductory sessions to get attendees up to speed on Groovy and Grails. Monday and Tuesday had 4 different tracks of presentations over 5 sessions for a grand total of 40 different presentations. There were also 3 keynote addresses from Graeme Rocher on the current state and future of Grails, Dr. Venkat Subramaniam on the rise and fall of programming languages, and Dierk König having some fun with Groovy.</p>
<p>There seemed to be a focus on using Grails for mobile development, using Async and REST interfaces, and developing for the cloud. There also seemed to be some crowd favorites like &#8220;<a title="Slides" href="http://www.bobbywarner.com/2012/07/31/gr8conf">Contributing Back to Grails</a>&#8221; by <a title="Twitter" href="https://twitter.com/bobbywarner">Bobby Warner</a>, &#8220;<a title="Git Code" href="https://github.com/robfletcher/fields-gr8conf-demo">Future-proof scaffolding with the Fields plugin</a>&#8221; by <a title="Twitter" href="https://twitter.com/rfletcherEW">Rob Fletcher</a>, and &#8220;<a title="Slides" href="http://tednaleid.github.com/showoff-git-core-concepts/#1">Git Core Concepts</a>&#8221; by <a title="Twitter" href="https://twitter.com/tednaleid">Ted Naleid</a>.</p>
<p>The slides and code samples from the talks are being collected on <a title="All Slides" href="https://github.com/sjurgemeyer/GR8-US-2012">github here</a>. There was also talk of delivering some videos of the presentations on the <a title="GR8Conf Website" href="http://gr8conf.us">GR8Conf website</a>.</p>
<p><a title="Twitter" href="https://twitter.com/sjurgemeyer">Shaun Jurgemeyer</a> and everyone else did a great job of organizing this event and I&#8217;m looking forward to next year.</p>
]]></content:encoded>
			<wfw:commentRss>http://refactr.com/blog/2012/08/gr8conf-overview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
