<?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>Gando Games</title>
	<atom:link href="http://www.gandogames.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gandogames.com</link>
	<description>Garage Development</description>
	<lastBuildDate>Thu, 06 Oct 2011 06:36:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Thank you Steve</title>
		<link>http://www.gandogames.com/2011/10/some-words/</link>
		<comments>http://www.gandogames.com/2011/10/some-words/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 06:14:07 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Studio]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[steve jobs]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=879</guid>
		<description><![CDATA[
Steve Jobs shaped the way I see the world,
I guess for me it was just life, since I was 4 years old I&#8217;ve had a Macintosh in my house, I remember countless hours of drawing with MacPaint and playing Dark Castle. Eventually I would study Software Engineering with the sole idea of making the world [...]]]></description>
			<content:encoded><![CDATA[<p id="top" /><a href="http://www.gandogames.com/wp-content/uploads/2011/10/t_hero.png"><img class="aligncenter size-full wp-image-880" title="t_hero" src="http://www.gandogames.com/wp-content/uploads/2011/10/t_hero.png" alt="" width="353" height="322" /></a><br />
Steve Jobs shaped the way I see the world,</p>
<p>I guess for me it was just life, since I was 4 years old I&#8217;ve had a Macintosh in my house, I remember countless hours of drawing with MacPaint and playing Dark Castle. Eventually I would study Software Engineering with the sole idea of making the world a better place by creating software that could impact people lives as Apple products did impact mine.</p>
<p>The Apple Way has brought several opportunities for me, and I can say that I&#8217;m one of the few lucky persons (and maybe the only Software Developer) in my country who could actually travel to WWDC (in my case in 2010) and could see Steve Jobs speak that year. While being there, I could realize all the things that I had accomplished in my (still rather short) life, and noticed that I had a vision of the world that without the culture that Steve created would be totally different.</p>
<p>I live every day of my life without any fear of thinking different, and will always chase my dreams with my heart because it&#8217;s part of my nature.</p>
<p>Thank you Steve, you and your vision made me a better human being.</p>
<p>You will be missed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/10/some-words/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous Integration with Jenkins</title>
		<link>http://www.gandogames.com/2011/08/continuous-integration-with-jenkins/</link>
		<comments>http://www.gandogames.com/2011/08/continuous-integration-with-jenkins/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 12:33:28 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=864</guid>
		<description><![CDATA[
I don&#8217;t think I should go all over  the &#8220;Why is continuous integration important?&#8221; topic all over again!, there are many great articles about it ( I recommend you to read Build Server: The Hearbeat of The Project by Noel Llopis ). So, we know that continuous integration is great, it avoids several things that [...]]]></description>
			<content:encoded><![CDATA[<p id="top" /><a href="http://www.gandogames.com/wp-content/uploads/2011/08/jenkins_logo.png"><img class="aligncenter size-full wp-image-865" title="jenkins_logo" src="http://www.gandogames.com/wp-content/uploads/2011/08/jenkins_logo.png" alt="" width="398" height="128" /></a></p>
<p>I don&#8217;t think I should go all over  the &#8220;Why is continuous integration important?&#8221; topic all over again!, there are many great articles about it ( I recommend you to read <a href="http://gamesfromwithin.com/the-heartbeat-of-the-project" onclick="pageTracker._trackPageview('/outgoing/gamesfromwithin.com/the-heartbeat-of-the-project?referer=');">Build Server: The Hearbeat of The Project</a> by Noel Llopis ). So, we know that continuous integration is great, it avoids several things that can slow us down, or can even degrade the quality of our products.</p>
<p>Some of this things are:</p>
<ul>
<li>Making sure our project builds on all platforms.</li>
<li>Making sure the Unit Test and Integration Tests pass on all platforms.</li>
<li>Creating different build setups for Beta Testers / Production / Debugging</li>
<li>Letting the person that broke the build know where did it happen immediately.</li>
</ul>
<p>This things are great when working alone as a &#8220;Single Man Team&#8221;, but I think continuous integration is a must when working on a 2+ persons team. Seriously, I can&#8217;t count the number of hours saved by using C.I, it&#8217;s just so great to be able to send the beta testers a URL address so that they can get the &#8220;goods&#8221; <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>For this week <a href="http://idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/idevblogaday.com?referer=');">iDevBlogADay</a> post, I will talk about how I use Jenkins to build Xcode projects. Remember that you can always <a href="http://twitter.com/ngoles" onclick="pageTracker._trackPageview('/outgoing/twitter.com/ngoles?referer=');">follow me</a> on Twitter if you want to contact me directly <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3><span id="more-864"></span>Jenkins</h3>
<p>So after that short speech, let&#8217;s get into Jenkins&#8230; who is this Jenkins dude ?</p>
<p>Jenkins was previously known as Hudson, is an open source C.I tool written in Java. The project had to change it&#8217;s name after having a <a href="http://java.net/projects/hudson/lists/dev/archive/2011-02/message/0" onclick="pageTracker._trackPageview('/outgoing/java.net/projects/hudson/lists/dev/archive/2011-02/message/0?referer=');">dispute</a> with Oracle, they claimed that owned the right to trademark the previous project name and actually applied for the trademark on December 2010. It&#8217;s even crazier that Oracle, decided to continue the development of hudson, so right now 2 forks of the project exists.</p>
<h3>Installing</h3>
<p>Jenkins is really easy to install under several platforms ( Including OS X, you&#8217;ll need Java on Lion though ), our main C.I server runs under Ubuntu 10.04.2 LTS ( with xen kernel&#8230; ). And installing it couldn&#8217;t be easier, basically this 4 lines made it happen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-q</span> <span style="color: #660033;">-O</span> - http:<span style="color: #000000; font-weight: bold;">//</span>pkg.jenkins-ci.org<span style="color: #000000; font-weight: bold;">/</span>debian<span style="color: #000000; font-weight: bold;">/</span>jenkins-ci.org.key <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-key</span> add -
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">sh</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'echo deb http://pkg.jenkins-ci.org/debian binary/ &amp;gt; /etc/apt/sources.list.d/jenkins.list'</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> update
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> jenkins</pre></div></div>

<p>If you&#8217;re under a different platform, you can actually get a binary <a href="http://mirrors.jenkins-ci.org/" onclick="pageTracker._trackPageview('/outgoing/mirrors.jenkins-ci.org/?referer=');">here</a>. You can also find more details about the installation, like how to change the default port to serve Jenkins <a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu" onclick="pageTracker._trackPageview('/outgoing/wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu?referer=');">here</a>.</p>
<h3>Xcode project + Jenkins</h3>
<p>It&#8217;s quite easy to build an Xcode project with Jenkins, there are several ways to do it. The first thing to note, is that even though our Jenkins server runs Ubuntu 10, Jenkins allows the developer to create several &#8220;build nodes&#8221;. So for example I could have different nodes to build an iOS Project, an Android Project and a Windows Phone 7 Project ( not coming soon though <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p>Creating an OS X node on Jenkins is extremely easy, maybe too easy <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . The only previous required knowledge is to know how to setup &#8220;passwordless SSH login&#8221;, this is because Jenkins has a built-in SSH client implementation that it uses to talk with remote sshd and start slave agents. When Jenkins is installed, you can go to &#8220;Manage Jenkins&#8221;, then Manage Nodes, and then click the &#8220;New Node&#8221; button. Here the important thing is that you&#8217;ll supply the connection information, like slave host name, user, and ssh key. For this to work, you will need to copy the master&#8217;s public ssh key into the ~/.ssh/authorized_keys file. The great thing, is that after that Jenkins will do the rest of the work, it will copy the &#8220;node binary&#8221; to the remote machine via ssh and do the rest of the configuration.</p>
<p>So, to build Xcode projects with Jenkins there are a couple of alternatives, the first one is the <a href="https://github.com/jenkinsci/sicci-for-xcode-plugin" onclick="pageTracker._trackPageview('/outgoing/github.com/jenkinsci/sicci-for-xcode-plugin?referer=');">Xcode Plug-In for Jenkins</a>. I haven&#8217;t personally tried the plug-in, but I think it could be worth a shot.</p>
<p>The way I&#8217;m using Jenkins to build Xcode Projects by creating a new &#8220;Free Style Software Project&#8221; (in the New Job Menu ), be sure to specify your repository URL or SSH adress (ssh://user@host/path/to/project.git), then check the box &#8220;this build is parameterized&#8221; and set it up like this (click the image to enlarge):</p>
<p style="text-align: center;"><a href="http://www.gandogames.com/wp-content/uploads/2011/08/jenkins_parameter.png"><img class="aligncenter size-full wp-image-869" title="jenkins_parameter" src="http://www.gandogames.com/wp-content/uploads/2011/08/jenkins_parameter.png" alt="" width="652" height="150" /></a></p>
<p>So basically I created a new Parameter Called &#8220;CONFIGURATION&#8221; with two Choices, Debug and Release, for a basic setup we need to specify that we are running a script to build our  project, I found this script about a year ago in Stack Overflow, but I haven&#8217;t been able to find it again ( I think the question may have been deleted ). I may have changed a line here or there but it&#8217;s mostly the same (<a href="http://www.gandogames.com/wp-content/uploads/2011/04/build.zip">direct download</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># !/bin/sh</span>
<span style="color: #666666; font-style: italic;"># By Anonymous user on Stack Overflow</span>
<span style="color: #666666; font-style: italic;"># You need to fill your password</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">function</span> fail <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;$*&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #000000;">2</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> section_print <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>=== $* ===&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Building <span style="color: #007800;">$CONFIGURATION</span>&quot;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #007800;">$CONFIGURATION</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    fail <span style="color: #ff0000;">&quot;No configuration specified&quot;</span>;
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>;
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#strange way to force backslash</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$PROJDIR</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #007800;">PROJDIR</span>=<span style="color: #800000;">${PROJDIR%/}</span>
    <span style="color: #007800;">PROJDIR</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROJDIR</span>/&quot;</span>
&nbsp;
    section_print <span style="color: #ff0000;">&quot;Project Dir is specified and is <span style="color: #007800;">$PROJDIR</span>&quot;</span>
    <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROJDIR</span>&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;no directory <span style="color: #007800;">$PROJDIR</span>&quot;</span>
    <span style="color: #7a0874; font-weight: bold;">pwd</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Unlocking keychain&quot;</span>
security unlock-keychain <span style="color: #660033;">-p</span> <span style="color: #ff0000;">&quot;password&quot;</span> ~<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Keychains<span style="color: #000000; font-weight: bold;">/</span>login.keychain
&nbsp;
section_print <span style="color: #ff0000;">&quot;Cleaning build&quot;</span>
xcodebuild <span style="color: #660033;">-configuration</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$CONFIGURATION</span>&quot;</span> clean <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Clean failed&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Building <span style="color: #007800;">$CONFIGURATION</span>&quot;</span>
xcodebuild <span style="color: #660033;">-configuration</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$CONFIGURATION</span>&quot;</span> <span style="color: #660033;">-sdk</span> iphoneos4.2 <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Build failed&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Packaging ipa&quot;</span>
&nbsp;
<span style="color: #007800;">BUILD_PATH</span>=build<span style="color: #000000; font-weight: bold;">/</span><span style="color: #ff0000;">&quot;<span style="color: #007800;">$CONFIGURATION</span>&quot;</span><span style="color: #660033;">-iphoneos</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#we are already in the $PROJDIR</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$BUILD_PATH</span>&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;no directory 'build/<span style="color: #007800;">$CONFIGURATION</span>-iphoneos'&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #ff0000;">&quot;*.app&quot;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #007800;">APP_NAME</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$file</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #007800;">APP_NAME</span>=<span style="color: #800000;">${APP_NAME%.*}</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Removing old artefacts&quot;</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">*</span>.ipa
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">*</span>.dSYM.zip
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">*</span>.mobileprovision
&nbsp;
<span style="color: #666666; font-style: italic;">#take $PROJDIR into account</span>
section_print <span style="color: #ff0000;">&quot;Application name <span style="color: #007800;">$APP_NAME</span>&quot;</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROJDIR</span><span style="color: #007800;">$BUILD_PATH</span>&quot;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> Payload
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>&quot;</span>.<span style="color: #000000; font-weight: bold;">*</span>.ipa
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> Payload
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-Rp</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>.app&quot;</span> Payload<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span>iTunesArtwork <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span>iTunesArtwork Payload<span style="color: #000000; font-weight: bold;">/</span>iTunesArtwork
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">IPA_FILE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>.<span style="color: #007800;">$BUILD_ID</span>.<span style="color: #007800;">$BUILD_NUMBER</span>.ipa&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">zip</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$IPA_FILE</span>&quot;</span> Payload
&nbsp;
section_print <span style="color: #ff0000;">&quot;Compressing dSYM&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;*.dSYM.zip&quot;</span>
<span style="color: #007800;">DSYM_FILE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>.<span style="color: #007800;">$BUILD_ID</span>.<span style="color: #007800;">$BUILD_NUMBER</span>.dSYM.zip&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">zip</span> <span style="color: #660033;">-r</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DSYM_FILE</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>.app.dSYM&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Exporting profile&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$APP_NAME</span>.app/embedded.mobileprovision&quot;</span> profile.mobileprovision
&nbsp;
section_print <span style="color: #ff0000;">&quot;Get the profile name&quot;</span>
&nbsp;
<span style="color: #007800;">PROFILE_NAME</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">strings</span> .<span style="color: #000000; font-weight: bold;">/</span>profile.mobileprovision <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-A1</span> <span style="color: #ff0000;">'Name'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-n1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span><span style="color: #ff0000;">''</span> <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #660033;">-F</span><span style="color: #ff0000;">''</span> <span style="color: #ff0000;">'{print $1}'</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">PROFILE_NAME</span>=<span style="color: #800000;">${PROFILE_NAME//'*'/}</span>
<span style="color: #007800;">PROFILE_NAME</span>=<span style="color: #800000;">${PROFILE_NAME//'?'/}</span>
&nbsp;
<span style="color: #007800;">PROFILE_NAME</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROFILE_NAME</span>.mobileprovision&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Profile name is <span style="color: #007800;">$PROFILE_NAME</span>&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;profile.mobileprovision&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROFILE_NAME</span>&quot;</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>/*.mobileprobision&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Failed to remove <span style="color: #007800;">$WORKSPACE</span>/*.mobileprovision&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>/<span style="color: #007800;">$IPA_FILE</span>&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Failed to remove <span style="color: #007800;">$WORKSPACE</span>/<span style="color: #007800;">$IPA_FILE</span>&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Copying <span style="color: #007800;">$IPA_FILE</span> to artifacts&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$IPA_FILE</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>/.&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Failed to copy ipa&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$PROFILE_NAME</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>/.&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Failed to copy profile&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DSYM_FILE</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$WORKSPACE</span>/.&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> fail <span style="color: #ff0000;">&quot;Failed to copy dSYM&quot;</span>
&nbsp;
section_print <span style="color: #ff0000;">&quot;Build succeeded&quot;</span></pre></div></div>

<p>This script will create artifacts like an IPA, a Profile and a DSYM file, which could be useful for distribution, you need to check the box &#8220;Archive the artifacts&#8221;, which is a post-build action of Jenkins, and basically set it up like this:</p>
<p><a href="http://www.gandogames.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-29-at-2.22.41-PM.png"><img class="aligncenter size-full wp-image-873" title="Screen Shot 2011-08-29 at 2.22.41 PM" src="http://www.gandogames.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-29-at-2.22.41-PM.png" alt="post build" width="540" height="80" /></a></p>
<p>If you followed the instructions correctly, you should have Jenkins up and running and capable of building an Xcode project. If you want to setup more Xcode projects, Jenkins has a very nice feature to duplicate and edit an existing &#8220;Job&#8221;, so you won&#8217;t have to repeat all the previous steps over and over again.</p>
<p>This is it for this week!, I hope you have enjoyed scratching the surface of Jenkins&#8230; I encourage you to look more things that Jenkins is capable of doing, it&#8217;s a very powerful tool!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/08/continuous-integration-with-jenkins/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Automating Xcode 4 Template Generation</title>
		<link>http://www.gandogames.com/2011/08/automating-xcode-4-template-generation/</link>
		<comments>http://www.gandogames.com/2011/08/automating-xcode-4-template-generation/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 09:36:58 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Engine]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[templates]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=830</guid>
		<description><![CDATA[Hello again!,
It&#8217;s a nice day in the French Riviera ( or Côte d&#8217;azur )!, it&#8217;s been more work than pleasure here, but I guess life is good  
In this iDevBlogADay post I will describe how we managed to automate our needs for Xcode 4 template generation. We wanted to automate it because we use [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />Hello again!,</p>
<p>It&#8217;s a nice day in the French Riviera ( or <em>Côte d&#8217;azur )!, </em>it&#8217;s been more work than pleasure here, but I guess life is good <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div id="attachment_836" class="wp-caption aligncenter" style="width: 522px"><a href="http://www.gandogames.com/wp-content/uploads/2011/08/288122_10150274313204814_838604813_7417657_325588_o1.jpg"><img class="size-full wp-image-836" title="288122_10150274313204814_838604813_7417657_325588_o" src="http://www.gandogames.com/wp-content/uploads/2011/08/288122_10150274313204814_838604813_7417657_325588_o1.jpg" alt="" width="512" height="383" /></a><p class="wp-caption-text">Nice Ville</p></div>
<p>In this <a href="http://www.idevblogaday.com/" onclick="pageTracker._trackPageview('/outgoing/www.idevblogaday.com/?referer=');">iDevBlogADay</a> post I will describe how we managed to automate our needs for Xcode 4 template generation. We wanted to automate it because we use a little Engine here at Gando Games (GG), and project templates where more or less a must for us. I have been reading everywhere about project templates in Xcode 4, and I must admit that it&#8217;s a rather obscure process. In order to understand a bit more, I followed the Boreal&#8217;s Kiss &#8220;<em><a href="http://blog.boreal-kiss.net/2011/03/11/a-minimal-project-template-for-xcode-4/" onclick="pageTracker._trackPageview('/outgoing/blog.boreal-kiss.net/2011/03/11/a-minimal-project-template-for-xcode-4/?referer=');">A minimal project template for Xcode 4</a></em>&#8221; article. After reading it, I realized that since our toolset was changing quite often, we where going to need to somehow automate the generation of Xcode 4 Templates for our internal engine, plus I thought it was a cool thing to do <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-830"></span></p>
<p>That lead me to extend a very basic <a href="http://www.cocos2d-iphone.org/" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/?referer=');">Cocos2d</a> tool called <em>Template Generator.</em> This tool is just a simple python script which can build a very basic <em>TemplateInfo.plist</em>, which is basically a .plist file used to describe an Xcode 4 Template, this was great but wasn&#8217;t enough for my needs. After having found that tool, I contacted Ricardo Quesada (Cocos2d Lead Developer) and asked him if I could just take that tool and start a new &#8220;mini project&#8221; from there, he was very cool about it so I started hacking the script right away.</p>
<p>The results can be found in Github under the MIT license under the name of &#8220;<a href="https://github.com/MrGando/Xcode-4-Template-Generator" onclick="pageTracker._trackPageview('/outgoing/github.com/MrGando/Xcode-4-Template-Generator?referer=');">Xcode 4 Template Generator</a>&#8220;, I think the short description is self explanatory:</p>
<blockquote><p>The Xcode 4 template generator, is a simple script written in Python to aid in the rather obscure process of creating Xcode 4 templates. As you may already be aware, Xcode 4 templates are very different from Xcode 3 templates, so taking a look at Boreal&#8217;s Kiss &#8220;<em>A minimal project template for Xcode 4</em>&#8221; is recommended. In that article you will find a lot of information about what is currently known about the new Template System.</p></blockquote>
<p>I thought about this tool as a helper script for a meta script ran my Continuous Integration server, this <em>meta script</em> is the one in charge of actually building the full Xcode 4 template, I present you that script here:</p>
<p><strong>WARNING</strong>: My Python is really noobish, sorry for that&#8230; <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="gist1148722" class="gist">
      <div class="gist-file">
        <div class="gist-data gist-syntax">



  <div class="file-data">
    <table cellpadding="0" cellspacing="0" class="lines highlight">
      <tr>
        <td class="line-numbers">
          <span class="line-number" id="file-engine_template_generator-py-L1" rel="file-engine_template_generator-py-L1">1</span>
          <span class="line-number" id="file-engine_template_generator-py-L2" rel="file-engine_template_generator-py-L2">2</span>
          <span class="line-number" id="file-engine_template_generator-py-L3" rel="file-engine_template_generator-py-L3">3</span>
          <span class="line-number" id="file-engine_template_generator-py-L4" rel="file-engine_template_generator-py-L4">4</span>
          <span class="line-number" id="file-engine_template_generator-py-L5" rel="file-engine_template_generator-py-L5">5</span>
          <span class="line-number" id="file-engine_template_generator-py-L6" rel="file-engine_template_generator-py-L6">6</span>
          <span class="line-number" id="file-engine_template_generator-py-L7" rel="file-engine_template_generator-py-L7">7</span>
          <span class="line-number" id="file-engine_template_generator-py-L8" rel="file-engine_template_generator-py-L8">8</span>
          <span class="line-number" id="file-engine_template_generator-py-L9" rel="file-engine_template_generator-py-L9">9</span>
          <span class="line-number" id="file-engine_template_generator-py-L10" rel="file-engine_template_generator-py-L10">10</span>
          <span class="line-number" id="file-engine_template_generator-py-L11" rel="file-engine_template_generator-py-L11">11</span>
          <span class="line-number" id="file-engine_template_generator-py-L12" rel="file-engine_template_generator-py-L12">12</span>
          <span class="line-number" id="file-engine_template_generator-py-L13" rel="file-engine_template_generator-py-L13">13</span>
          <span class="line-number" id="file-engine_template_generator-py-L14" rel="file-engine_template_generator-py-L14">14</span>
          <span class="line-number" id="file-engine_template_generator-py-L15" rel="file-engine_template_generator-py-L15">15</span>
          <span class="line-number" id="file-engine_template_generator-py-L16" rel="file-engine_template_generator-py-L16">16</span>
          <span class="line-number" id="file-engine_template_generator-py-L17" rel="file-engine_template_generator-py-L17">17</span>
          <span class="line-number" id="file-engine_template_generator-py-L18" rel="file-engine_template_generator-py-L18">18</span>
          <span class="line-number" id="file-engine_template_generator-py-L19" rel="file-engine_template_generator-py-L19">19</span>
          <span class="line-number" id="file-engine_template_generator-py-L20" rel="file-engine_template_generator-py-L20">20</span>
          <span class="line-number" id="file-engine_template_generator-py-L21" rel="file-engine_template_generator-py-L21">21</span>
          <span class="line-number" id="file-engine_template_generator-py-L22" rel="file-engine_template_generator-py-L22">22</span>
          <span class="line-number" id="file-engine_template_generator-py-L23" rel="file-engine_template_generator-py-L23">23</span>
          <span class="line-number" id="file-engine_template_generator-py-L24" rel="file-engine_template_generator-py-L24">24</span>
          <span class="line-number" id="file-engine_template_generator-py-L25" rel="file-engine_template_generator-py-L25">25</span>
          <span class="line-number" id="file-engine_template_generator-py-L26" rel="file-engine_template_generator-py-L26">26</span>
          <span class="line-number" id="file-engine_template_generator-py-L27" rel="file-engine_template_generator-py-L27">27</span>
          <span class="line-number" id="file-engine_template_generator-py-L28" rel="file-engine_template_generator-py-L28">28</span>
          <span class="line-number" id="file-engine_template_generator-py-L29" rel="file-engine_template_generator-py-L29">29</span>
          <span class="line-number" id="file-engine_template_generator-py-L30" rel="file-engine_template_generator-py-L30">30</span>
          <span class="line-number" id="file-engine_template_generator-py-L31" rel="file-engine_template_generator-py-L31">31</span>
          <span class="line-number" id="file-engine_template_generator-py-L32" rel="file-engine_template_generator-py-L32">32</span>
          <span class="line-number" id="file-engine_template_generator-py-L33" rel="file-engine_template_generator-py-L33">33</span>
          <span class="line-number" id="file-engine_template_generator-py-L34" rel="file-engine_template_generator-py-L34">34</span>
          <span class="line-number" id="file-engine_template_generator-py-L35" rel="file-engine_template_generator-py-L35">35</span>
          <span class="line-number" id="file-engine_template_generator-py-L36" rel="file-engine_template_generator-py-L36">36</span>
          <span class="line-number" id="file-engine_template_generator-py-L37" rel="file-engine_template_generator-py-L37">37</span>
          <span class="line-number" id="file-engine_template_generator-py-L38" rel="file-engine_template_generator-py-L38">38</span>
          <span class="line-number" id="file-engine_template_generator-py-L39" rel="file-engine_template_generator-py-L39">39</span>
          <span class="line-number" id="file-engine_template_generator-py-L40" rel="file-engine_template_generator-py-L40">40</span>
          <span class="line-number" id="file-engine_template_generator-py-L41" rel="file-engine_template_generator-py-L41">41</span>
          <span class="line-number" id="file-engine_template_generator-py-L42" rel="file-engine_template_generator-py-L42">42</span>
          <span class="line-number" id="file-engine_template_generator-py-L43" rel="file-engine_template_generator-py-L43">43</span>
          <span class="line-number" id="file-engine_template_generator-py-L44" rel="file-engine_template_generator-py-L44">44</span>
          <span class="line-number" id="file-engine_template_generator-py-L45" rel="file-engine_template_generator-py-L45">45</span>
          <span class="line-number" id="file-engine_template_generator-py-L46" rel="file-engine_template_generator-py-L46">46</span>
          <span class="line-number" id="file-engine_template_generator-py-L47" rel="file-engine_template_generator-py-L47">47</span>
          <span class="line-number" id="file-engine_template_generator-py-L48" rel="file-engine_template_generator-py-L48">48</span>
          <span class="line-number" id="file-engine_template_generator-py-L49" rel="file-engine_template_generator-py-L49">49</span>
          <span class="line-number" id="file-engine_template_generator-py-L50" rel="file-engine_template_generator-py-L50">50</span>
          <span class="line-number" id="file-engine_template_generator-py-L51" rel="file-engine_template_generator-py-L51">51</span>
          <span class="line-number" id="file-engine_template_generator-py-L52" rel="file-engine_template_generator-py-L52">52</span>
          <span class="line-number" id="file-engine_template_generator-py-L53" rel="file-engine_template_generator-py-L53">53</span>
          <span class="line-number" id="file-engine_template_generator-py-L54" rel="file-engine_template_generator-py-L54">54</span>
          <span class="line-number" id="file-engine_template_generator-py-L55" rel="file-engine_template_generator-py-L55">55</span>
          <span class="line-number" id="file-engine_template_generator-py-L56" rel="file-engine_template_generator-py-L56">56</span>
          <span class="line-number" id="file-engine_template_generator-py-L57" rel="file-engine_template_generator-py-L57">57</span>
          <span class="line-number" id="file-engine_template_generator-py-L58" rel="file-engine_template_generator-py-L58">58</span>
          <span class="line-number" id="file-engine_template_generator-py-L59" rel="file-engine_template_generator-py-L59">59</span>
          <span class="line-number" id="file-engine_template_generator-py-L60" rel="file-engine_template_generator-py-L60">60</span>
          <span class="line-number" id="file-engine_template_generator-py-L61" rel="file-engine_template_generator-py-L61">61</span>
          <span class="line-number" id="file-engine_template_generator-py-L62" rel="file-engine_template_generator-py-L62">62</span>
          <span class="line-number" id="file-engine_template_generator-py-L63" rel="file-engine_template_generator-py-L63">63</span>
          <span class="line-number" id="file-engine_template_generator-py-L64" rel="file-engine_template_generator-py-L64">64</span>
          <span class="line-number" id="file-engine_template_generator-py-L65" rel="file-engine_template_generator-py-L65">65</span>
          <span class="line-number" id="file-engine_template_generator-py-L66" rel="file-engine_template_generator-py-L66">66</span>
          <span class="line-number" id="file-engine_template_generator-py-L67" rel="file-engine_template_generator-py-L67">67</span>
          <span class="line-number" id="file-engine_template_generator-py-L68" rel="file-engine_template_generator-py-L68">68</span>
          <span class="line-number" id="file-engine_template_generator-py-L69" rel="file-engine_template_generator-py-L69">69</span>
          <span class="line-number" id="file-engine_template_generator-py-L70" rel="file-engine_template_generator-py-L70">70</span>
          <span class="line-number" id="file-engine_template_generator-py-L71" rel="file-engine_template_generator-py-L71">71</span>
          <span class="line-number" id="file-engine_template_generator-py-L72" rel="file-engine_template_generator-py-L72">72</span>
          <span class="line-number" id="file-engine_template_generator-py-L73" rel="file-engine_template_generator-py-L73">73</span>
          <span class="line-number" id="file-engine_template_generator-py-L74" rel="file-engine_template_generator-py-L74">74</span>
          <span class="line-number" id="file-engine_template_generator-py-L75" rel="file-engine_template_generator-py-L75">75</span>
          <span class="line-number" id="file-engine_template_generator-py-L76" rel="file-engine_template_generator-py-L76">76</span>
          <span class="line-number" id="file-engine_template_generator-py-L77" rel="file-engine_template_generator-py-L77">77</span>
          <span class="line-number" id="file-engine_template_generator-py-L78" rel="file-engine_template_generator-py-L78">78</span>
          <span class="line-number" id="file-engine_template_generator-py-L79" rel="file-engine_template_generator-py-L79">79</span>
          <span class="line-number" id="file-engine_template_generator-py-L80" rel="file-engine_template_generator-py-L80">80</span>
          <span class="line-number" id="file-engine_template_generator-py-L81" rel="file-engine_template_generator-py-L81">81</span>
          <span class="line-number" id="file-engine_template_generator-py-L82" rel="file-engine_template_generator-py-L82">82</span>
          <span class="line-number" id="file-engine_template_generator-py-L83" rel="file-engine_template_generator-py-L83">83</span>
          <span class="line-number" id="file-engine_template_generator-py-L84" rel="file-engine_template_generator-py-L84">84</span>
          <span class="line-number" id="file-engine_template_generator-py-L85" rel="file-engine_template_generator-py-L85">85</span>
          <span class="line-number" id="file-engine_template_generator-py-L86" rel="file-engine_template_generator-py-L86">86</span>
          <span class="line-number" id="file-engine_template_generator-py-L87" rel="file-engine_template_generator-py-L87">87</span>
          <span class="line-number" id="file-engine_template_generator-py-L88" rel="file-engine_template_generator-py-L88">88</span>
          <span class="line-number" id="file-engine_template_generator-py-L89" rel="file-engine_template_generator-py-L89">89</span>
          <span class="line-number" id="file-engine_template_generator-py-L90" rel="file-engine_template_generator-py-L90">90</span>
          <span class="line-number" id="file-engine_template_generator-py-L91" rel="file-engine_template_generator-py-L91">91</span>
          <span class="line-number" id="file-engine_template_generator-py-L92" rel="file-engine_template_generator-py-L92">92</span>
          <span class="line-number" id="file-engine_template_generator-py-L93" rel="file-engine_template_generator-py-L93">93</span>
          <span class="line-number" id="file-engine_template_generator-py-L94" rel="file-engine_template_generator-py-L94">94</span>
          <span class="line-number" id="file-engine_template_generator-py-L95" rel="file-engine_template_generator-py-L95">95</span>
          <span class="line-number" id="file-engine_template_generator-py-L96" rel="file-engine_template_generator-py-L96">96</span>
          <span class="line-number" id="file-engine_template_generator-py-L97" rel="file-engine_template_generator-py-L97">97</span>
          <span class="line-number" id="file-engine_template_generator-py-L98" rel="file-engine_template_generator-py-L98">98</span>
          <span class="line-number" id="file-engine_template_generator-py-L99" rel="file-engine_template_generator-py-L99">99</span>
          <span class="line-number" id="file-engine_template_generator-py-L100" rel="file-engine_template_generator-py-L100">100</span>
        </td>
        <td class="line-data">
          <pre class="line-pre"><div class="line" id="file-engine_template_generator-py-LC1"><span class="c">#!/usr/bin/python</span></div><div class="line" id="file-engine_template_generator-py-LC2"><span class="kn">import</span> <span class="nn">shutil</span></div><div class="line" id="file-engine_template_generator-py-LC3"><span class="kn">import</span> <span class="nn">sys</span></div><div class="line" id="file-engine_template_generator-py-LC4"><span class="kn">import</span> <span class="nn">os</span></div><div class="line" id="file-engine_template_generator-py-LC5"><span class="kn">import</span> <span class="nn">subprocess</span></div><div class="line" id="file-engine_template_generator-py-LC6">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC7"><span class="n">ROOT_PATH</span> <span class="o">=</span> <span class="s">&quot;GGEngine/&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC8"><span class="n">SRC_PATH</span> <span class="o">=</span> <span class="s">&quot;src/gengine&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC9"><span class="n">GG_USERNAME</span> <span class="o">=</span> <span class="s">&quot;username&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC10"><span class="n">GIT_REPO_URL</span> <span class="o">=</span> <span class="s">&quot;ssh://&quot;</span> <span class="o">+</span> <span class="n">GG_USERNAME</span> <span class="o">+</span> <span class="s">&quot;@gandogames.com/path/to/engine.git &quot;</span></div><div class="line" id="file-engine_template_generator-py-LC11">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC12"><span class="k">def</span> <span class="nf">shell_exec</span><span class="p">(</span><span class="n">command</span><span class="p">):</span></div><div class="line" id="file-engine_template_generator-py-LC13">	<span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC14">	</div><div class="line" id="file-engine_template_generator-py-LC15"><span class="k">def</span> <span class="nf">header_print</span><span class="p">(</span><span class="n">text</span><span class="p">):</span></div><div class="line" id="file-engine_template_generator-py-LC16">	<span class="k">print</span><span class="p">(</span><span class="s">&quot;+</span><span class="se">\t</span><span class="s">&quot;</span> <span class="o">+</span> <span class="n">text</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\t</span><span class="s">&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC17">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC18"><span class="k">if</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">SRC_PATH</span><span class="p">)):</span></div><div class="line" id="file-engine_template_generator-py-LC19">	<span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Pulling GGEngine from Master &quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC20">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC21">	<span class="n">pull_command</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC22"><span class="s">					cd </span><span class="si">%s</span><span class="s"> &amp;&amp; </span></div><div class="line" id="file-engine_template_generator-py-LC23"><span class="s">					git --git-dir=.git fetch &amp;&amp; </span></div><div class="line" id="file-engine_template_generator-py-LC24"><span class="s">					git --git-dir=.git --work-tree=. merge origin/master</span></div><div class="line" id="file-engine_template_generator-py-LC25"><span class="s">					&quot;&quot;&quot;</span> <span class="o">%</span> <span class="n">SRC_PATH</span></div><div class="line" id="file-engine_template_generator-py-LC26">									</div><div class="line" id="file-engine_template_generator-py-LC27">	<span class="n">shell_exec</span><span class="p">(</span><span class="n">pull_command</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC28">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC29"><span class="k">else</span><span class="p">:</span></div><div class="line" id="file-engine_template_generator-py-LC30">	<span class="c">#checkout gengine.</span></div><div class="line" id="file-engine_template_generator-py-LC31">	<span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Cloning Good Game Engine from Master&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC32">	<span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;git clone &quot;</span> <span class="o">+</span> <span class="n">GIT_REPO_URL</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC33">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC34"><span class="c">#Library Directory Paths.</span></div><div class="line" id="file-engine_template_generator-py-LC35"><span class="n">LUA_PATH</span> <span class="o">=</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Libraries/Lua/Lua-5.1.4/src/&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC36"><span class="n">BOX2D_PATH</span> <span class="o">=</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Libraries/Box2D/Box2D/&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC37"><span class="n">COCOSDENSHION_PATH</span> <span class="o">=</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Libraries/CocosDenshion/&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC38"><span class="n">UNIT_TEST_PP_PATH</span> <span class="o">=</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Libraries/UnitTest++/UnitTest++/&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC39"><span class="n">GGENGINE_PATH</span> <span class="o">=</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Classes/Engine &quot;</span></div><div class="line" id="file-engine_template_generator-py-LC40"><span class="n">GGENGINE_SCRIPTS_PATH</span> <span class="o">=</span>  <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Resources/Scripts&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC41"><span class="n">GGENGINE_AUDIO_VISUAL_PATH</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">&quot;</span> <span class="o">+</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Resources/Audio &quot;</span> <span class="o">+</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Resources/Fonts &quot;</span> <span class="o">+</span> <span class="n">SRC_PATH</span> <span class="o">+</span> <span class="s">&quot;/Resources/Graphics&quot;</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC42">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC43"><span class="c">#Template Output Paths</span></div><div class="line" id="file-engine_template_generator-py-LC44"><span class="n">LUA_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;lua&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC45"><span class="n">BOX2D_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;box2d&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC46"><span class="n">COCOSDENSHION_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;ccdenshion&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC47"><span class="n">UNIT_TEST_PP_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;unittestpp&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC48"><span class="n">GGENGINE_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;ggengine&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC49"><span class="n">GGENGINE_SCRIPTS_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;ggengine_scripts&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC50"><span class="n">GGENGINE_AUDIO_VISUAL_OUT</span> <span class="o">=</span> <span class="n">ROOT_PATH</span> <span class="o">+</span> <span class="s">&quot;ggengine_audiovisual&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC51">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC52"><span class="c">#Library Identifiers</span></div><div class="line" id="file-engine_template_generator-py-LC53"><span class="n">LUA_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.lualib&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC54"><span class="n">BOX2D_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.box2d&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC55"><span class="n">COCOSDENSHION_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.ccdenshion&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC56"><span class="n">UNIT_TEST_PP_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.unittest&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC57"><span class="n">GGENGINE_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.ggengine&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC58"><span class="n">GGENGINE_SCRIPTS_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.ggengine_scripts&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC59"><span class="n">GGENGINE_AUDIO_VISUAL_ID</span> <span class="o">=</span> <span class="s">&quot;com.gandogames.ggengine_audiovisual&quot;</span></div><div class="line" id="file-engine_template_generator-py-LC60">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC61"><span class="c">#check for Libraries directory and delete if it exists</span></div><div class="line" id="file-engine_template_generator-py-LC62"><span class="k">if</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">ROOT_PATH</span><span class="p">)):</span></div><div class="line" id="file-engine_template_generator-py-LC63">	<span class="n">shutil</span><span class="o">.</span><span class="n">rmtree</span><span class="p">(</span><span class="n">ROOT_PATH</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC64">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC65"><span class="c">#create templates for all the engine required libraries</span></div><div class="line" id="file-engine_template_generator-py-LC66">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC67"><span class="c">#Lua</span></div><div class="line" id="file-engine_template_generator-py-LC68"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating Lualib Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC69"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">LUA_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">Lua Lib</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">LUA_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">LUA_OUT</span> <span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC70">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC71"><span class="c">#Box2d</span></div><div class="line" id="file-engine_template_generator-py-LC72"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating Box2d Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC73"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">BOX2D_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">Box2d Lib</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">BOX2D_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">BOX2D_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC74">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC75"><span class="c">#CocosDenshion</span></div><div class="line" id="file-engine_template_generator-py-LC76"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating CocosDenshion Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC77"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">COCOSDENSHION_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">CocosDenshion Lib</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">COCOSDENSHION_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">COCOSDENSHION_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC78">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC79"><span class="c">#UnitTest++</span></div><div class="line" id="file-engine_template_generator-py-LC80"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating UnitTest++ Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC81"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">UNIT_TEST_PP_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">UnitTest++ Lib</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">UNIT_TEST_PP_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">UNIT_TEST_PP_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC82">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC83"><span class="c">#create template for the Engine Lua scripts</span></div><div class="line" id="file-engine_template_generator-py-LC84"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating GGEngine Scripts Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC85"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_SCRIPTS_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">GGEngine Lua Scripts</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_SCRIPTS_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_SCRIPTS_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC86">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC87"><span class="c">#create template for the Engine audio-vidual Resources</span></div><div class="line" id="file-engine_template_generator-py-LC88"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating GGEngine Audio/Visual Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC89"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_AUDIO_VISUAL_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">GGEngine Audiovisual resources</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_AUDIO_VISUAL_ID</span> <span class="o">+</span> <span class="s">&quot; -c no -o &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_AUDIO_VISUAL_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC90">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC91"><span class="c">#create template for the Engine itself</span></div><div class="line" id="file-engine_template_generator-py-LC92"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Creating GGEngine Template (abstract)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC93"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;python template_generator.py -d &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_PATH</span> <span class="o">+</span> <span class="s">&quot; --description </span><span class="se">\&quot;</span><span class="s">Freetype Lib</span><span class="se">\&quot;</span><span class="s"> -i &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_ID</span> <span class="o">+</span> <span class="s">&quot; --ancestors </span><span class="se">\&quot;</span><span class="s">&quot;</span> <span class="o">+</span> <span class="n">LUA_ID</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">BOX2D_ID</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">COCOSDENSHION_ID</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">UNIT_TEST_PP_ID</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_AUDIO_VISUAL_ID</span> <span class="o">+</span> <span class="s">&quot; &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_SCRIPTS_ID</span> <span class="o">+</span><span class="s">&quot;</span><span class="se">\&quot;</span><span class="s"> -c no -o &quot;</span> <span class="o">+</span> <span class="n">GGENGINE_OUT</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC94">&nbsp;</div><div class="line" id="file-engine_template_generator-py-LC95"><span class="c">#Copy the Base (concrete) OpenGL ES template</span></div><div class="line" id="file-engine_template_generator-py-LC96"><span class="n">header_print</span><span class="p">(</span><span class="s">&quot;Moving Base GL ES Template (concrete)&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC97"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;cp -R base/OpenGLGame.xctemplate GGEngine/&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC98"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;cp -R base/CocoaTouchApplication.xctemplate GGEngine/&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC99"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;cp -R base/StoryboardApplication.xctemplate GGEngine/&quot;</span><span class="p">)</span></div><div class="line" id="file-engine_template_generator-py-LC100"><span class="n">shell_exec</span><span class="p">(</span><span class="s">&quot;cp -R base/iPhoneBase.xctemplate GGEngine/&quot;</span><span class="p">)</span></div></pre>
        </td>
      </tr>
    </table>
  </div>

        </div>

        <div class="gist-meta">
          <a href="https://gist.github.com/Goles/1148722/raw/fe25ef85e04edfd1da6c5f0871fceac433f231fa/engine_template_generator.py" style="float:right" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1148722/raw/fe25ef85e04edfd1da6c5f0871fceac433f231fa/engine_template_generator.py?referer=');">view raw</a>
          <a href="https://gist.github.com/Goles/1148722#file-engine_template_generator-py" style="float:right; margin-right:10px; color:#666;" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1148722_file-engine_template_generator-py?referer=');">engine_template_generator.py</a>
          <a href="https://gist.github.com/Goles/1148722" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1148722?referer=');">This Gist</a> brought to you by <a href="https://github.com" onclick="pageTracker._trackPageview('/outgoing/github.com?referer=');">GitHub</a>.
        </div>
      </div>
</div>

<p>So, that&#8217;s basically it more or less. I hope that from that script you&#8217;re able to extrapolate what you need in order to automate your Xcode 4 Template generation. As a last thing to say, the Xcode 4 Template Generator is far from complete, and should have issues&#8230; if you happen to need a patch feel free to open an issue in Github&#8230; or you want to collaborate I will totally welcome any kind of help, pull requests etc.</p>
<p>Until the next one!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/08/automating-xcode-4-template-generation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Planning a Level Editor for our 2d Game Engine</title>
		<link>http://www.gandogames.com/2011/08/planning-a-level-editor-for-our-2d-game-engine/</link>
		<comments>http://www.gandogames.com/2011/08/planning-a-level-editor-for-our-2d-game-engine/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 13:23:00 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[Engine]]></category>
		<category><![CDATA[level editor]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=826</guid>
		<description><![CDATA[Hello everyone,
I finally arrived to Nice Ville, France. There has been some complications with my residence for the next 6 months  which I hope to resolve tomorrow!  , appart from that I&#8217;m happy to be here and excited to work on an interesting topic! Anyway, I&#8217;ve been a bit short on time and also [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />Hello everyone,</p>
<p>I finally arrived to Nice Ville, France. There has been some complications with my residence for the next 6 months  which I hope to resolve tomorrow! <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , appart from that I&#8217;m happy to be here and excited to work on an interesting topic! Anyway, I&#8217;ve been a bit short on time and also very tired ( 13 hours flight to Madrid from Santiago, and then 2 hours from Madrid to Nice, and +6 hours of time difference with Chile!! ).</p>
<p>For this post I want to discuss/(public brainstorm)  about how would I prefer to work with a Level Editor, and mainly about the target platform for this tool. To be a bit clear, we have a simple internal 2d Game Engine at Gando Games&#8230; we are actually planning to Open Source it, but with all the great 2d Game Engines currently available we&#8217;re not sure about it.</p>
<p>A Level Editor, even in a basic stage, can provide a huge boost to productivity for repetitive tasks like level design, prototyping and Game Entity creation. Our rather simple engine is quite focused on fast prototyping, it has pretty good scripting support using Lua, mainly as an option to describe Game Scenes, Entities, and other game specific elements. This is all very cool, but I&#8217;ve been discussing with Jorge (front-end Engineer), and he agrees that a Level Editor could could speed up the whole creative process.</p>
<p>I&#8217;m just thinking out loud here and I would really appreciate feedback on this matter, our main concern now is the level editor target platform. What I mean with this is that, yes it&#8217;s cool to have a level editor on an iPad/iPhone, but I think I&#8217;m far more proficient using my MacBook/Mac Mini to create a level, still this has lead us to think about two main alternatives:</p>
<ul>
<li>Native Mac App</li>
<li>iOS App</li>
</ul>
<p><span id="more-826"></span></p>
<p>I will try to discuss about each option pros and cons:</p>
<h3>Native Mac App</h3>
<p>The idea here is to make a Mac App, that could describe the Game Logic ( Game Entities, Scenes, etc&#8230; ), and that could preview the specified game logic on the Mac and also push it to an iPad/iPhone in order to test in-device.</p>
<p>Pros:</p>
<ul>
<li>Comfortable to work with for the team,  so far everyone uses a Mac here.</li>
<li>Fast. Being a native App,  performance shouldn&#8217;t be a big concern.</li>
<li>Usability. I think I can achieve better usability for this kind of CAD tool with a desktop application, but I would like to hear your opinion on this.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Native App. What if we start developing for another platform in the future, should I really care? For now we are 100% iOS, and we don&#8217;t care for Android Games yet&#8230; still you can develop Android Apps on your Mac, but what if we have to develop on Windows? (I hope I don&#8217;t though!).</li>
<li>Another point to take into consideration with a native app, is that since it&#8217;s not natively running on the device, it could take a bit more time to preview changes in-device etc&#8230; still this time could be greatly reduced by pushing the data to the device via the Network.</li>
<li>Development time, I think it would take more to develop a native OS X application than an iOS application since I would have to create the layer of communication between iOS and the Mac. Also, currently our small 2d Engine is iOS only, so I would have to add code in order to render properly on OS X.</li>
</ul>
<h3>iOS App</h3>
<p>Pros:</p>
<ul>
<li>Works in-device so it&#8217;s very simple to preview changes.</li>
<li>Faster development process, since everything to visualize the changes is already there, I would just need to expose a simple interface to re-load Lua logic scripts and program the editor GUI, not a lot of new code is needed.</li>
</ul>
<p>Cons:</p>
<ul>
<li>I think that from a usability point of view, this application is more like an &#8220;expert tool&#8221; &#8230; a lot of hotkey usage is expected etc. Our Lua scripting layer does also support to define a Game Entity behavior by actually programming in Lua&#8230; I think a desktop computer could be more suited for that kind of task, which is actually Lua programming.</li>
<li>What if we add Android to our development process ?, if the Application is iPad native, I would then have to program some sort of communication channel between an Android device and the iPad, creating a similar situation than with the Mac Application.</li>
</ul>
<p>Of course I haven&#8217;t covered everything here, though writing this post has made me realize several things already! <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ( thanks <a href="http://www.idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/www.idevblogaday.com?referer=');">iDevBlogADay</a>! ). We have already considered writing Web Application&#8230; feedback on this matter is totally welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/08/planning-a-level-editor-for-our-2d-game-engine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Can NoSQL databases help Mobile Games ?</title>
		<link>http://www.gandogames.com/2011/07/how-could-nosql-databases-help-mobile-games/</link>
		<comments>http://www.gandogames.com/2011/07/how-could-nosql-databases-help-mobile-games/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 14:00:49 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=806</guid>
		<description><![CDATA[

I&#8217;m back!,
It&#8217;s great to be writing for iDevBlogADay again!, I&#8217;ve been very busy since the last time I wrote, mostly because I&#8217;m in the process of starting my Informatics Engineering Student Thesis, which I&#8217;ll begin as soon as I get myself to France, which should happen by July 31. I&#8217;ve been working quite hard the [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />
<p style="text-align: center;"><a href="http://www.gandogames.com/wp-content/uploads/2011/07/couchdb-logo.png"><img class="aligncenter size-full wp-image-819" title="couchdb-logo" src="http://www.gandogames.com/wp-content/uploads/2011/07/couchdb-logo.png" alt="" width="413" height="253" /></a></p>
<p>I&#8217;m back!,</p>
<p>It&#8217;s great to be writing for <a href="http://idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/idevblogaday.com?referer=');">iDevBlogADay</a> again!, I&#8217;ve been very busy since the last time I wrote, mostly because I&#8217;m in the process of starting my Informatics Engineering Student Thesis, which I&#8217;ll begin as soon as I get myself to France, which should happen by July 31. I&#8217;ve been working quite hard the last couple of months, exploring new technologies and trying to figure out how they could fit in the Mobile Games world. One of the technologies that I had heard about in the past was the NoSQL databases.</p>
<p>A NoSQL database attempts to solve many problems that you can face with a typical SQL database on a broad set of applications. They don&#8217;t require fixed table schemas, they try to eliminate join operations and in most cases scale horizontally. This article aims to talk a bit about some database implementations that solve some interesting issues that are experienced in the realm of mobile games.</p>
<p><span id="more-806"></span>I have to admit that I&#8217;m a quite biased in favor of NoSQL databases for most of the mobile games that I see in the App Store, but I must concede that you can come up with some games that would require a regular database engine to solve different sorts of issues, but I think that at least for general purposes, a NoSQL database could be a better choice. I must also admit that I&#8217;m in no way an expert in this technology, and so far I&#8217;ve made only basic experiments. <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h3><strong>Flexibility to model data</strong></h3>
<p>The problem that I see for many kind of games is that the requirements can change extremely fast, and I think that relational databases can be a bit of a drawback when this issues happen, for example, let&#8217;s say I&#8217;m prototyping and polishing for fun in a 2d Beat&#8217;em Up Game ( a la Castle Crashers ), right now I have a database to reflect several item types.</p>
<p>Image we have this in a relational database, I&#8217;m iterating with a designer in order to try out different item types, which is something I tend to do a lot&#8230; , so let&#8217;s say that designer says &#8220;Hey, we should try a Magical Sharp Knife!, I think that would be awesome!&#8221;, well of course I would shrug and reply, &#8220;Ok, but I&#8217;ll have to modify the DB schema to make the data fit&#8221;. That would cost me a bit of time, etc. The idea of a NoSQL database such as CoachDB or MongoDB is that they are schema free, that means that I don&#8217;t have to make my data fit a &#8220;fixed&#8221; schema and I can just model my data the way I want it to be. Of course there&#8217;s the argument that Schema Free can be a disaster if not managed correctly, but I think the same is true ( and even worse ) for a typical relational database.</p>
<div id="gist1091007" class="gist">
      <div class="gist-file">
        <div class="gist-data gist-syntax">



  <div class="file-data">
    <table cellpadding="0" cellspacing="0" class="lines highlight">
      <tr>
        <td class="line-numbers">
          <span class="line-number" id="file-gistfile1-lua-L1" rel="file-gistfile1-lua-L1">1</span>
          <span class="line-number" id="file-gistfile1-lua-L2" rel="file-gistfile1-lua-L2">2</span>
          <span class="line-number" id="file-gistfile1-lua-L3" rel="file-gistfile1-lua-L3">3</span>
          <span class="line-number" id="file-gistfile1-lua-L4" rel="file-gistfile1-lua-L4">4</span>
          <span class="line-number" id="file-gistfile1-lua-L5" rel="file-gistfile1-lua-L5">5</span>
          <span class="line-number" id="file-gistfile1-lua-L6" rel="file-gistfile1-lua-L6">6</span>
          <span class="line-number" id="file-gistfile1-lua-L7" rel="file-gistfile1-lua-L7">7</span>
          <span class="line-number" id="file-gistfile1-lua-L8" rel="file-gistfile1-lua-L8">8</span>
          <span class="line-number" id="file-gistfile1-lua-L9" rel="file-gistfile1-lua-L9">9</span>
        </td>
        <td class="line-data">
          <pre class="line-pre"><div class="line" id="file-gistfile1-lua-LC1"><span class="n">weapon_type_id</span> <span class="err">|</span> <span class="n">weapon_type</span></div><div class="line" id="file-gistfile1-lua-LC2"><span class="mi">1</span> <span class="n">Pierce</span></div><div class="line" id="file-gistfile1-lua-LC3"><span class="mi">2</span> <span class="n">Sharp</span></div><div class="line" id="file-gistfile1-lua-LC4">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC5"><span class="n">magic_type_id</span> <span class="err">|</span> <span class="n">magic_type</span></div><div class="line" id="file-gistfile1-lua-LC6"><span class="mi">1</span> <span class="n">Fire</span></div><div class="line" id="file-gistfile1-lua-LC7">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC8"><span class="n">weapon_id</span> <span class="err">|</span> <span class="n">weapon</span><span class="err">|</span> <span class="n">weapon_type_id</span> <span class="err">|</span> <span class="n">damage</span></div><div class="line" id="file-gistfile1-lua-LC9"><span class="mi">1</span> <span class="err">|</span> <span class="n">Knife</span> <span class="err">|</span> <span class="mi">3</span> <span class="err">|</span> <span class="mi">2</span></div></pre>
        </td>
      </tr>
    </table>
  </div>

        </div>

        <div class="gist-meta">
          <a href="https://gist.github.com/Goles/1091007/raw/dda5393fa6f01268dcde14cf32e5feb51d887210/gistfile1.lua" style="float:right" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091007/raw/dda5393fa6f01268dcde14cf32e5feb51d887210/gistfile1.lua?referer=');">view raw</a>
          <a href="https://gist.github.com/Goles/1091007#file-gistfile1-lua" style="float:right; margin-right:10px; color:#666;" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091007_file-gistfile1-lua?referer=');">gistfile1.lua</a>
          <a href="https://gist.github.com/Goles/1091007" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091007?referer=');">This Gist</a> brought to you by <a href="https://github.com" onclick="pageTracker._trackPageview('/outgoing/github.com?referer=');">GitHub</a>.
        </div>
      </div>
</div>

<p>How the schema can be more flexible in a Schemaless DB (pseudo code but you get the idea, if you don&#8217;t maybe you can take a look at this MongoDB <a href="http://www.mongodb.org/display/DOCS/Schema+Design" onclick="pageTracker._trackPageview('/outgoing/www.mongodb.org/display/DOCS/Schema+Design?referer=');">article</a>, the syntax resembles that a bit)</p>
<div id="gist1091012" class="gist">
      <div class="gist-file">
        <div class="gist-data gist-syntax">



  <div class="file-data">
    <table cellpadding="0" cellspacing="0" class="lines highlight">
      <tr>
        <td class="line-numbers">
          <span class="line-number" id="file-gistfile1-lua-L1" rel="file-gistfile1-lua-L1">1</span>
          <span class="line-number" id="file-gistfile1-lua-L2" rel="file-gistfile1-lua-L2">2</span>
          <span class="line-number" id="file-gistfile1-lua-L3" rel="file-gistfile1-lua-L3">3</span>
          <span class="line-number" id="file-gistfile1-lua-L4" rel="file-gistfile1-lua-L4">4</span>
          <span class="line-number" id="file-gistfile1-lua-L5" rel="file-gistfile1-lua-L5">5</span>
          <span class="line-number" id="file-gistfile1-lua-L6" rel="file-gistfile1-lua-L6">6</span>
          <span class="line-number" id="file-gistfile1-lua-L7" rel="file-gistfile1-lua-L7">7</span>
          <span class="line-number" id="file-gistfile1-lua-L8" rel="file-gistfile1-lua-L8">8</span>
          <span class="line-number" id="file-gistfile1-lua-L9" rel="file-gistfile1-lua-L9">9</span>
          <span class="line-number" id="file-gistfile1-lua-L10" rel="file-gistfile1-lua-L10">10</span>
          <span class="line-number" id="file-gistfile1-lua-L11" rel="file-gistfile1-lua-L11">11</span>
          <span class="line-number" id="file-gistfile1-lua-L12" rel="file-gistfile1-lua-L12">12</span>
          <span class="line-number" id="file-gistfile1-lua-L13" rel="file-gistfile1-lua-L13">13</span>
          <span class="line-number" id="file-gistfile1-lua-L14" rel="file-gistfile1-lua-L14">14</span>
          <span class="line-number" id="file-gistfile1-lua-L15" rel="file-gistfile1-lua-L15">15</span>
          <span class="line-number" id="file-gistfile1-lua-L16" rel="file-gistfile1-lua-L16">16</span>
          <span class="line-number" id="file-gistfile1-lua-L17" rel="file-gistfile1-lua-L17">17</span>
          <span class="line-number" id="file-gistfile1-lua-L18" rel="file-gistfile1-lua-L18">18</span>
          <span class="line-number" id="file-gistfile1-lua-L19" rel="file-gistfile1-lua-L19">19</span>
          <span class="line-number" id="file-gistfile1-lua-L20" rel="file-gistfile1-lua-L20">20</span>
          <span class="line-number" id="file-gistfile1-lua-L21" rel="file-gistfile1-lua-L21">21</span>
          <span class="line-number" id="file-gistfile1-lua-L22" rel="file-gistfile1-lua-L22">22</span>
        </td>
        <td class="line-data">
          <pre class="line-pre"><div class="line" id="file-gistfile1-lua-LC1"><span class="n">db</span><span class="p">.</span><span class="n">itemTypes</span></div><div class="line" id="file-gistfile1-lua-LC2">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC3"><span class="n">name</span><span class="p">:</span> <span class="n">Weapon</span></div><div class="line" id="file-gistfile1-lua-LC4"><span class="n">types</span><span class="p">:</span> <span class="n">Pierce</span><span class="p">,</span> <span class="n">Sharp</span></div><div class="line" id="file-gistfile1-lua-LC5">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC6"><span class="n">name</span><span class="p">:</span> <span class="n">Magic</span></div><div class="line" id="file-gistfile1-lua-LC7"><span class="n">types</span><span class="p">:</span> <span class="n">Fire</span><span class="p">,</span> <span class="n">Ice</span></div><div class="line" id="file-gistfile1-lua-LC8">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC9"><span class="n">db</span><span class="p">.</span><span class="n">items</span></div><div class="line" id="file-gistfile1-lua-LC10">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC11"><span class="n">name</span><span class="p">:</span> <span class="s2">&quot;</span><span class="s">Knife&quot;</span></div><div class="line" id="file-gistfile1-lua-LC12"><span class="n">Weapon</span></div><div class="line" id="file-gistfile1-lua-LC13">    <span class="nb">type</span><span class="p">:</span> <span class="n">Sharp</span> <span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">itemTypes</span> <span class="n">reference</span><span class="p">)</span></div><div class="line" id="file-gistfile1-lua-LC14">    <span class="n">damage</span><span class="p">:</span> <span class="mi">2</span></div><div class="line" id="file-gistfile1-lua-LC15">&nbsp;</div><div class="line" id="file-gistfile1-lua-LC16"><span class="n">name</span><span class="p">:</span> <span class="s2">&quot;</span><span class="s">Piercing Knife of Burn&quot;</span></div><div class="line" id="file-gistfile1-lua-LC17"><span class="n">Weapon</span></div><div class="line" id="file-gistfile1-lua-LC18">    <span class="nb">type</span><span class="p">:</span> <span class="n">Sharp</span> <span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">itemTypes</span> <span class="n">reference</span><span class="p">)</span></div><div class="line" id="file-gistfile1-lua-LC19">    <span class="n">damage</span><span class="p">:</span> <span class="mi">2</span></div><div class="line" id="file-gistfile1-lua-LC20"><span class="n">Magic</span></div><div class="line" id="file-gistfile1-lua-LC21">    <span class="nb">type</span><span class="p">:</span> <span class="n">Fire</span> <span class="p">(</span><span class="n">db</span><span class="p">.</span><span class="n">itemTypes</span> <span class="n">reference</span><span class="p">)</span></div><div class="line" id="file-gistfile1-lua-LC22">    <span class="n">damage</span><span class="p">:</span> <span class="mi">4</span></div></pre>
        </td>
      </tr>
    </table>
  </div>

        </div>

        <div class="gist-meta">
          <a href="https://gist.github.com/Goles/1091012/raw/31ad08914d8519dff5b5ac542695426474343edc/gistfile1.lua" style="float:right" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091012/raw/31ad08914d8519dff5b5ac542695426474343edc/gistfile1.lua?referer=');">view raw</a>
          <a href="https://gist.github.com/Goles/1091012#file-gistfile1-lua" style="float:right; margin-right:10px; color:#666;" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091012_file-gistfile1-lua?referer=');">gistfile1.lua</a>
          <a href="https://gist.github.com/Goles/1091012" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/Goles/1091012?referer=');">This Gist</a> brought to you by <a href="https://github.com" onclick="pageTracker._trackPageview('/outgoing/github.com?referer=');">GitHub</a>.
        </div>
      </div>
</div>

<p class="p1">As you can notice, I didn&#8217;t have to add some &#8220;row&#8221; in order to support  my Piercing Magic Knife of Burn, so I can support my old Knife and the new one without big changes in the DB. For me, this represents an advantage, but it&#8217;s not the biggest advantage, specially if we&#8217;re talking about Mobile Games.</p>
<h3>Mobile Application Data Synchronization</h3>
<p>This feature is implementation dependent, but MongoDB and CouchDB seem to offer it. Since Couchbase has iOS support, it should be ready to go, although the iOS implementation of Couchbase is still Beta, and for now adds significant weight to your App Binary (they are targeting 5 MB for their first round of optimizations, and they state it might get even better in the long term). Trivial synchronization of data between mobile peers is becoming a reality, and this can prove very useful for Mobile Games. Sharing a simple context for a multi-player game (real time or turn based) can be a huge benefit and this is the single thing that excites me the most, of course you could also share a player Game State between his Mac, iPad, iOS in a no-brainer manner.</p>
<p class="p1">The NoSQL database concept is not new, Carlo Strozzi came up with it on 1998 for databases which didin&#8217;t expose an SQL interface. However a lot of the implementations that are appearing these days, are quite new and already show a lot of promise. Their data modeling flexibility, synchronization facilities and low latency, makes them attractive for Game Development. I would be very interested to know how do you think that this new generation of databases could impact Game Development, and in particular, the Mobile Component.</p>
<h3>References:</h3>
<p style="text-align: left;"><a href="http://www.couchbase.com/" onclick="pageTracker._trackPageview('/outgoing/www.couchbase.com/?referer=');">Couchbase</a><br />
<a href="http://www.mongodb.org/" onclick="pageTracker._trackPageview('/outgoing/www.mongodb.org/?referer=');">MongoDB</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/07/how-could-nosql-databases-help-mobile-games/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Status update</title>
		<link>http://www.gandogames.com/2011/04/status-update/</link>
		<comments>http://www.gandogames.com/2011/04/status-update/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:18:57 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Studio]]></category>
		<category><![CDATA[Build Server]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Status]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=796</guid>
		<description><![CDATA[Hey everyone,
Long time with no posts, focusing more on work I guess   ( so no that bad ), so here I present you a brief update of what have we been doing at Gando Games.

Created a build server for our iPhone projects, we are actually running &#8220;Jenkins CI&#8221; on our Virtual host, with [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />Hey everyone,</p>
<p>Long time with no posts, focusing more on work I guess <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ( so no that bad ), so here I present you a brief update of what have we been doing at Gando Games.</p>
<ul>
<li>Created a build server for our iPhone projects, we are actually running &#8220;<a href="http://jenkins-ci.org/" onclick="pageTracker._trackPageview('/outgoing/jenkins-ci.org/?referer=');">Jenkins CI</a>&#8221; on our Virtual host, with build nodes located at our &#8220;offices&#8221; ( garages would be a more appropriate term for that ). We are actually using a custom build script, it&#8217;s quite similar to <a href="http://www.gandogames.com/wp-content/uploads/2011/04/build.zip">this one</a> (presented in this Stack Overflow <a href="http://stackoverflow.com/questions/4871701/setting-up-hudson-for-iphone-builds" onclick="pageTracker._trackPageview('/outgoing/stackoverflow.com/questions/4871701/setting-up-hudson-for-iphone-builds?referer=');">post</a>). The build server has been quite awesome, and I feel really good about having spent the time to configure it, basically it does nightly builds and also runs a Unit/Acceptance battery of tests in Release and Debug mode (currently only on simulator, but I&#8217;m working on getting it to run the tests in-device too).</li>
<li>I mentioned Unit Tests in last post, I always heard wonders about TDD and how it could help a project in many different ways. Well, I spent a lot of time reading about TDD in Game Development and also as a methodology itself and I got to say that It&#8217;s been great, now I feel a lot safer when refactoring.</li>
</ul>
<p>I mostly used two books as a reference:</p>
<table border="0">
<tbody>
<tr>
<td>
<p style="text-align: center;"><a href="http://www.gandogames.com/wp-content/uploads/2011/04/387190.jpeg"><img class="aligncenter size-full wp-image-798" title="387190" src="http://www.gandogames.com/wp-content/uploads/2011/04/387190.jpeg" alt="" width="200" height="250" /></a></p>
</td>
<td><a href="http://www.gandogames.com/wp-content/uploads/2011/04/cover.jpeg"><img class="aligncenter size-full wp-image-799" title="cover" src="http://www.gandogames.com/wp-content/uploads/2011/04/cover.jpeg" alt="" width="200" height="250" /></a></td>
</tr>
</tbody>
</table>
<p>I&#8217;m not really doing a lot of OOP, but &#8220;Growing object-oriented Software, Guided by Tests&#8221; is a great book with a modern approach. A lot of what is there can be applied to other programming paradigms. I also read all of Noel Llopis posts about <a href="http://gamesfromwithin.com/nitty-gritty-unit-testing" onclick="pageTracker._trackPageview('/outgoing/gamesfromwithin.com/nitty-gritty-unit-testing?referer=');">TDD applied to Game Development</a>. He has a lot of blog posts in this area and I must say, they where very helpful.</p>
<ul>
<li>Jorge has been working like crazy on our &#8220;Collaborative&#8221; Game Prototyping tools, he&#8217;s been working on some Web Based tools and also exploring technologies like <a href="http://couchdb.apache.org/" onclick="pageTracker._trackPageview('/outgoing/couchdb.apache.org/?referer=');">CouchDB</a> for our distributed DB needs. CouchDB looks really nice and there&#8217;s an iOS port on <a href="https://github.com/couchbaselabs/iOS-Couchbase" onclick="pageTracker._trackPageview('/outgoing/github.com/couchbaselabs/iOS-Couchbase?referer=');">github</a> and an android port is also planned.</li>
<li>Pablo has been developing the <em>Alpha</em> 2D sprite sheet for the main character of our upcoming game ( which is still in early development, but in the works ).</li>
</ul>
<p>So that&#8217;s it for now, now back to work!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/04/status-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xcode 4 Rant</title>
		<link>http://www.gandogames.com/2011/03/xcode-4-rant/</link>
		<comments>http://www.gandogames.com/2011/03/xcode-4-rant/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 22:57:08 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Studio]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=793</guid>
		<description><![CDATA[It&#8217;s been a while!,I&#8217;ve been working a lot lately to reach Gando Games Engine alpha state. It has been quite interesting, learning a lot, and even contributing to some Open Source projects.
My motivation for this post however, is that Xcode 4 GM was released officially. I&#8217;ve been working with Xcode 4 for a while, and [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />It&#8217;s been a while!,I&#8217;ve been working a lot lately to reach Gando Games Engine alpha state. It has been quite interesting, learning a lot, and even contributing to some Open Source projects.</p>
<p>My motivation for this post however, is that Xcode 4 GM was released officially. I&#8217;ve been working with Xcode 4 for a while, and have filed some  bug reports on <a href="https://bugreport.apple.com/" onclick="pageTracker._trackPageview('/outgoing/bugreport.apple.com/?referer=');">Apple&#8217;s Radar</a>. While I really like the whole Xcode 4 concept and features, and I think that they take the whole Xcode experience to a new level, I&#8217;m not happy to see Apple, my all-time favorite company to release Xcode in it&#8217;s current state. I mean, it happened with Project Builder, but this is 2011, I can&#8217;t believe they did the same thing.</p>
<p><span id="more-793"></span>I&#8217;m angry/sad:</p>
<ul>
<li>One week ago my Xcode project didn&#8217;t compile on Xcode 4 GM seed 2 &#8230; but thanks to a guy in the <a href="https://devforums.apple.com/" onclick="pageTracker._trackPageview('/outgoing/devforums.apple.com/?referer=');">Apple Developer Forums</a> who found a hack, it does now ( with GCC, forget LLVM 2.0 ). But the shipped version of Xcode 4 is <strong>the same</strong> version that  I was using a week ago ( GM seed 2 4A304a ). I wasn&#8217;t the only one experiencing this issue.</li>
<li>I filed a critical issue on Apple radar (<span style="font-family: Geneva, Arial; color: black; font-size: xx-small;"><a href="https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/22/wo/87QbVoks03spW8EDG2sA30/5.83.28.1.9" onclick="pageTracker._trackPageview('/outgoing/bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/22/wo/87QbVoks03spW8EDG2sA30/5.83.28.1.9?referer=');">8965623</a>)</span> about a month ago. Several people working with large C++ codebases (some where using <a href="http://www.google.cl/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBsQFjAA&amp;url=http%3A%2F%2Fwww.boost.org%2F&amp;ei=Yv93TYW1BYzrgQfm0LnSBQ&amp;usg=AFQjCNHTmqrKFK1yAeoy4yxOiVAXrm6zKw" onclick="pageTracker._trackPageview('/outgoing/www.google.cl/url?sa=t_amp_source=web_amp_cd=1_amp_ved=0CBsQFjAA_amp_url=http_3A_2F_2Fwww.boost.org_2F_amp_ei=Yv93TYW1BYzrgQfm0LnSBQ_amp_usg=AFQjCNHTmqrKFK1yAeoy4yxOiVAXrm6zKw&amp;referer=');">boost</a>, some where using <a href="http://www.rasterbar.com/products/luabind.html" onclick="pageTracker._trackPageview('/outgoing/www.rasterbar.com/products/luabind.html?referer=');">luabind</a>) where experiencing awful performance issues. While Xcode indexes my project using luabind my average RAM usage climbs to about 2.5 GB and my CPU ussage to 400%. I wasn&#8217;t alone at this and was contacted twice by Apple Engineering, I even supplied a test project to trigger the issue, result: bug not fixed.  ( <strong>My Fix</strong>: buy 8 GB of RAM for my MacBook Pro i5. )</li>
<li>I&#8217;m now experiencing problems with syntax highlighting and I keep experiencing awful resource usage issues.</li>
</ul>
<p>Some rant about it:</p>
<p>Ok, I know it&#8217;s impossible to ship &#8220;bug free&#8221; software ( yeah, I&#8217;m actually aware of that <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). But what about all the devs who are paying for a developer program ( 100 USD a year or more if you are also involved in OS X dev program ), and actually invested time reporting bugs and issues on Apple Radar and didn&#8217;t get their critical issues fixed ( even if some of them filed issues a while ago ). This &#8220;testers&#8221; where worried about an app that needed to be polished a bit more, and actually their reports where not only on their own direct benefit, but on the benefit of all Apple devs.</p>
<p>We all know how important developers are for Apple, without them, Apple biggest products would be a lot less than what they are ( IMHO ). I&#8217;m sure that Xcode 4 will reach a more polished state sooner than later (at least I hope so), but in my opinion it doesn&#8217;t look good from a developer perspective to see your everyday work tool tagged as GM at it&#8217;s current state.</p>
<p>Perhaps I&#8217;m being naive, maybe it&#8217;s a matter of my own &#8220;Developer Ethics&#8221;&#8230; or maybe not.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/03/xcode-4-rant/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Last post for iDevBlogADay</title>
		<link>http://www.gandogames.com/2011/02/last-post-for-idevblogaday/</link>
		<comments>http://www.gandogames.com/2011/02/last-post-for-idevblogaday/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 13:00:41 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Just for fun]]></category>
		<category><![CDATA[Sketches]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[gando games]]></category>
		<category><![CDATA[sketch]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=772</guid>
		<description><![CDATA[
As you already know, the rules have changed ( for good! ) in iDevBlogADay!  This will be my last post for iDevBlogADay (at least in a while  ), and I pretend to update you all on some of our activities here at Gando Games!.
Before starting I&#8217;ll have to say that I will still post [...]]]></description>
			<content:encoded><![CDATA[<p id="top" /><div id="attachment_774" class="wp-caption aligncenter" style="width: 467px"><a href="http://www.gandogames.com/wp-content/uploads/2011/02/char.jpg"><img class="size-full wp-image-774 " style="border: 2px double grey;" title="char" src="http://www.gandogames.com/wp-content/uploads/2011/02/char.jpg" alt="" width="457" height="545" /></a><p class="wp-caption-text">Who&#39;s this guy ?</p></div></p>
<p>As you already know, the rules have changed ( for good! ) in <a href="http://idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/idevblogaday.com?referer=');">iDevBlogADay</a>!  This will be my last post for iDevBlogADay (at least in a while <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), and I pretend to update you all on some of our activities here at Gando Games!.</p>
<p>Before starting I&#8217;ll have to say that I will still post once every two weeks (so please subscribe to our <a href="http://www.gandogames.com/feed/"><strong>RSS</strong></a> <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> !) to tell you what&#8217;s going on here at gando games and of course give you some articles like I&#8217;ve been doing for the last 10 posts <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Pablo, our art director also wanted to make a guest post of his own, but he was on vacations the last three weeks!, but keep hanging on it, I can asure you guys that it will be worth it.</p>
<p>So, to the updates:</p>
<p>This week has been a crazy one!, lot&#8217;s and lot&#8217;s of work!</p>
<ul>
<li>We have a new member here at Gando Games, Jorge Soto! ( @<a href="http://www.twitter.com/ajeo" onclick="pageTracker._trackPageview('/outgoing/www.twitter.com/ajeo?referer=');">ajeo</a> ) Web Development expert but never afraid of doing some low level coding! He&#8217;s our Tools Engineer ( and like everyone here, he will probably end up working on a lot of different things <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
<li>I had to finish the arrangements for a 7 months trip to <em>Sophia Antipolis</em>, <em>France</em> this year (Jul 2011 &#8211; Jan 2012), I will be there making a R &amp; D internship at <a href="http://en.inria.fr/" onclick="pageTracker._trackPageview('/outgoing/en.inria.fr/?referer=');">INRIA</a>&#8230; so if anyone happens to live there and wants to hang out, it would be amazing!</li>
<li>I still haven&#8217;t finished configuring Gando Games virtual build server!, ( in case you&#8217;re wondering what&#8217;s a build server, or why could you need it, I recommend you to read Snappy Touch amazing <a href="http://gamesfromwithin.com/the-heartbeat-of-the-project" onclick="pageTracker._trackPageview('/outgoing/gamesfromwithin.com/the-heartbeat-of-the-project?referer=');">article</a> about it ).</li>
<li>Gando Games 2D Game Engine is taking shape !, I really hope to show you a bit of it soon, it&#8217;s an engine quite focused on designers and rapid prototyping, more about that in the future!</li>
</ul>
<p>To close off this rather short note, I really want to thank Miguel a.k.a <a href="https://twitter.com/#!/mysterycoconut" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/mysterycoconut?referer=');">Mystery Coconut</a>, all of iDevBlogADay writers and of course the readers for making this service awesome!. I really like the new format, and I think that making one post per two weeks is really the best way to bring better articles to the readers.</p>
<p>till the next one, <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>PS: I hope to be able to tell you who&#8217;s the guy in the picture sooner than later, <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/02/last-post-for-idevblogaday/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fast Guide: Getting started on iPhone Game Development</title>
		<link>http://www.gandogames.com/2011/02/fast-guide-getting-started-on-iphone-game-development/</link>
		<comments>http://www.gandogames.com/2011/02/fast-guide-getting-started-on-iphone-game-development/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 14:00:16 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Just for fun]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Cocos2d]]></category>
		<category><![CDATA[iPhone Development]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=759</guid>
		<description><![CDATA[

Before getting into the actual article I want to remember everyone that the rules for iDevBlogADay have changed, and in two more weeks the current authors will be rotated out. The new system sounds very nice  , but since Gando Games will disappear from the official RSS , if you guys want to keep reading [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />
<p style="text-align: center;"><img class="aligncenter" title="Xcode logo" src="http://yourtechstop.com/wp-content/uploads/2010/06/xcodeLogo.png" alt="" width="255" height="235" /></p>
<p style="text-align: left;">Before getting into the actual article I want to remember everyone that the <a href="http://mysterycoconut.com/blog/2011/02/idevblogaday2/#comment-2418" onclick="pageTracker._trackPageview('/outgoing/mysterycoconut.com/blog/2011/02/idevblogaday2/_comment-2418?referer=');">rules</a> for iDevBlogADay have changed, and in two more weeks the current authors will be rotated out. The new system sounds very nice <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , but since Gando Games will disappear from the official RSS , if you guys want to keep reading I encourage you to subscribe to our <a href="http://www.gandogames.com/feed/">RSS feed</a> <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p style="text-align: left;">Now, the article:</p>
<p style="text-align: left;">I get this question a lot, there many <a href="http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&amp;field-keywords=iphone+game+developent&amp;x=0&amp;y=0" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/s/ref=nb_sb_noss?url=search-alias_3Daps_amp_field-keywords=iphone+game+developent_amp_x=0_amp_y=0&amp;referer=');">books in the subject </a>, but I&#8217;m totally sure that you can get started without even looking at them. For today&#8217;s <a href="http://idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/idevblogaday.com?referer=');">iDevBlogADay</a> post, I made a &#8220;straight to the point guide&#8221;.</p>
<p><em>Note: This guide is also valid for iPod Touch and iPad.</em></p>
<h2>What you&#8217;ll need:</h2>
<p>* A Mac ( you could get away with VMware but I won&#8217;t go into that ) [ <a href="http://store.apple.com/us/browse/home/shop_mac/family/mac_mini?mco=MTQzMDMxODY" onclick="pageTracker._trackPageview('/outgoing/store.apple.com/us/browse/home/shop_mac/family/mac_mini?mco=MTQzMDMxODY&amp;referer=');">699</a> USD$ ]<br />
* <a href="http://developer.apple.com/devcenter/ios/index.action" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/devcenter/ios/index.action?referer=');">Sign-up </a> as an Apple Developer [0 USD$]<br />
* <a href="http://developer.apple.com/technologies/tools/xcode.html" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/technologies/tools/xcode.html?referer=');">Xcode</a> [Free Download as a registered iOS developer ]<br />
* <a href="http://www.cocos2d-iphone.org/" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/?referer=');">Cocos2d</a> [Free Download &amp; Open Source]<br />
* <a href="http://www.google.com" onclick="pageTracker._trackPageview('/outgoing/www.google.com?referer=');">Google</a></p>
<h2><span id="more-759"></span></h2>
<h2>How to:</h2>
<p>Ok, start the Mac up <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , and as soon as you have an internet connection, go to Apple&#8217;s <a href="http://developer.apple.com/devcenter/ios/index.action" onclick="pageTracker._trackPageview('/outgoing/developer.apple.com/devcenter/ios/index.action?referer=');">iOS Dev Center</a>, sign up for Free and download Xcode. Xcode is Apple&#8217;s IDE (Integrated Development Environment), everyone I know is using Xcode to develop for iOS, so don&#8217;t fear, just download/install it.</p>
<p>So far, the Dev Center will grant you access to a lot of great documentation referencing the Cocoa-Touch API ( you will certainly use this when developing for iOS ), and also valuable information about several Developer Tools.</p>
<p>You should now download <a href="http://www.cocos2d-iphone.org/download" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/download?referer=');">Cocos2D latest version</a>. There are several other ways to make a game for iOS this days like <a href="http://www.anscamobile.com/corona/" onclick="pageTracker._trackPageview('/outgoing/www.anscamobile.com/corona/?referer=');">Corona</a> (Lua based), <a href="http://www.sparrow-framework.org/" onclick="pageTracker._trackPageview('/outgoing/www.sparrow-framework.org/?referer=');">Sparrow</a> (Objective-C based) , etc. However cocos2d is great for starters because it has a really big community plus it&#8217;s free. The community is one of Cocos2d bigest (if not the bigest) strength, so go ahead and sign up in the <a href="http://www.cocos2d-iphone.org/forum/" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/forum/?referer=');">cocos2d community forums</a>.</p>
<p>By now, you should be able to start working on the Cocos2d wiki tutorials ( or to find some using the always evil Google <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ), I would recommend doing <a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_1._install_test" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/wiki/doku.php/prog_guide_lesson_1._install_test?referer=');">lesson1</a>, <a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_2._your_first_game" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/wiki/doku.php/prog_guide_lesson_2._your_first_game?referer=');">lesson2</a> and <a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_3._menus_and_scenes" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/wiki/doku.php/prog_guide_lesson_3._menus_and_scenes?referer=');">lesson</a>3. For more just check out Cocos2D<a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:index" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/wiki/doku.php/prog_guide_index?referer=');"> programming guide</a>.</p>
<p><span style="font-weight: normal;">That&#8217;s it, there&#8217;s nothing else you need to know&#8230; for now.</span></p>
<h2>Books to complement your knowledge:</h2>
<ul>
<li><a href="http://www.amazon.com/Beginning-iPhone-Development-Exploring-iOS/dp/143023024X/ref=sr_1_4?ie=UTF8&amp;qid=1297987882&amp;sr=8-4" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Beginning-iPhone-Development-Exploring-iOS/dp/143023024X/ref=sr_1_4?ie=UTF8_amp_qid=1297987882_amp_sr=8-4&amp;referer=');">Beginning iPhone 4 Development: Exploring the iOS SDK</a></li>
<li><a href="http://www.amazon.com/Programming-Objective-C-2-0-Developers-Library/dp/0321711394/ref=sr_1_2?s=books&amp;ie=UTF8&amp;qid=1297987987&amp;sr=1-2" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Programming-Objective-C-2-0-Developers-Library/dp/0321711394/ref=sr_1_2?s=books_amp_ie=UTF8_amp_qid=1297987987_amp_sr=1-2&amp;referer=');">Programming in Objective-C 2.0</a></li>
</ul>
<h2>Personal Opinion:</h2>
<p>I think that the whole &#8220;Game Development Books&#8221; is a sensitive topic by itself (there are some great books, some of them where covered in the last <a href="http://www.gandogames.com/2011/02/short-story-developers-do-your-homework/">iDevBlogADay</a> article), but I&#8217;m quite sure that almost all the &#8220;Making Games for iPhone&#8221;/&#8221;Making Games with Cocos2d&#8221; books don&#8217;t tackle the key questions, ok, they get you to make a game for iPhone, but they don&#8217;t tend to focus on the rather important fact that you are developing for a mobile device which I think it&#8217;s extremely important, how about a section about &#8220;Battery Saving&#8221;, or &#8220;Best usability practices&#8221; specifically targeted for the platform?.</p>
<p>Also, most of the books I browsed about Cocos2d Game Development, where quite vague in some of the more advanced topics, and where often written using earlier versions of the Cocos2d Engine (leaving a lot of the source code examples unusable), so I really encourage beginners to stay away from this books and to try to tackle their issues in the cocos2d forums, which is a great place to learn.</p>
<p>Another important fact is that I don&#8217;t consider it necessary to pay the 99 USD$ that will cost you to finally deploy iOS apps in-device right away. Just play with the iPhone/iPad simulator and pay when you feel crippled by it ( when doing advanced graphics stuff for example , or when you want to deploy your game for a tester, etc.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/02/fast-guide-getting-started-on-iphone-game-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Short Story: Developers, do your homework</title>
		<link>http://www.gandogames.com/2011/02/short-story-developers-do-your-homework/</link>
		<comments>http://www.gandogames.com/2011/02/short-story-developers-do-your-homework/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 14:00:06 +0000</pubDate>
		<dc:creator>Nicolas Goles</dc:creator>
				<category><![CDATA[Just for fun]]></category>
		<category><![CDATA[idevblogaday]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.gandogames.com/?p=750</guid>
		<description><![CDATA[For today&#8217;s iDevBlogADay post I want to tell you guys a rather short but true story that reflects some of our duties as developers for any particular platform. I came to this conclussions after installing beta software ( under NDA ) for the platform we are developing for in Gando Games.
Because of an NDA agreement [...]]]></description>
			<content:encoded><![CDATA[<p id="top" />For today&#8217;s <a href="http://idevblogaday.com" onclick="pageTracker._trackPageview('/outgoing/idevblogaday.com?referer=');">iDevBlogADay</a> post I want to tell you guys a rather short but true story that reflects some of our duties as developers for any particular platform. I came to this conclussions after installing beta software ( under NDA ) for the platform we are developing for in Gando Games.</p>
<p><em>Because of an NDA agreement I will reffer to this product as &#8220;<strong>Pudding</strong>&#8220;</em></p>
<p><em><span id="more-750"></span></em></p>
<h2><strong>The Story</strong></h2>
<p>Ok, so this week I noticed that the latest version of Pudding (a free application provided by Pudding Inc. which is key to make my everyday work happen), which was labeled as GM seed became available from the official Pudding website. Inmediatly I thought with excitement, &#8220;Ok after all those beta versions of Pudding, finally we have a GM seed, hopefully all my problems with the old beta versions are history by now!&#8221;.</p>
<p>So I went ahead, downloaded the Pudding GM and installed it. The whole process took about two hours of my time. After that, I find myself eager to fire up Pudin and start working with my Pudding document (made with the older Pudding version). Exitement fades away in less than 10 seconds, Pudding gets awfully slow when working with my old project, it&#8217;s actually freezing up y whole machine (which should be powerful enough).</p>
<p>I&#8217;m now very worried, my work depends on Pudding to work correctly with my old document. First I think I&#8217;m the one who&#8217;s doing something wrong and go ahead and re-read Pudding&#8217;s on-line docmentaton&#8230; surprise surprise&#8230; I&#8217;m doing everything fine. What I have encountered is a <strong>bug</strong>, a bug in GM seed which makes it impossible to work with my project.</p>
<h2>Initial reaction</h2>
<p>Wrath&#8230; Anger&#8230; i start complaining &#8220;How is it possible! , the <strong>same bug</strong> I encountered in pudin beta 3, 4 and 5 is still present in GM. I can&#8217;t believe QA didn&#8217;t catch this! !@#%^&amp;$^&#8221;</p>
<p>By then, I start reading some very popular Pudding on-line forums (pro-pudding.com, pudding-gurus.com and pudding-god.com) and IRC. A lot of people seems to be experiencing issues with the GM, even quite similar ones.</p>
<p>After a few minutes talking with some Pudding lovers over IRC, I quickly figured out why did this happen&#8230; (and it was in part my mistake)</p>
<h2>Mid reactions</h2>
<p>After noticing my mistake and feeling more than guilty, I went to #pudding-love in IRC and asked:</p>
<p>&#8220;Did anyone report their problems in the official Pudding forums &amp; Bug Tracker?&#8221; ( I knew I hadn&#8217;t so I wanted to check out who did)</p>
<p>I wasn&#8217;t very surprised to see that only about 15% of the people in the IRC channel had done their homework. I asked the same the forums, obtaining similar answers.</p>
<h2>Late reactions</h2>
<p>Ok, I was blaming Pudding Inc. and their QA team, without even having done my homework&#8230; shame on me (and on the rest of Pudding users). So I quickly made my bug reports as detailed as possible, got my issue numbers. Now I feel better.</p>
<h2>Conclusions</h2>
<p>This short story may sound familiar to a lot of you guys, there&#8217;s some really complex software projects out there, and improving them can be quite difficult, even for big companies!. I just couldn&#8217;t believe how many people I saw complaining in unofficial forums (instead of doing so in the official forums where &#8220;Pudding&#8221; devs hang around), same applies to IRC, etc.</p>
<p>If you are using software wich is key for your everyday work, you better care for it. If the company behind it appreciates your bug reports, then do your homework and report the bugs you find! (this assertion is even more true if you are using free/open source software). How is it possible to blame the QA team for a bug to pass undetected if the issue is not reported in the fist place.</p>
<p>I learned my lesson, and I won&#8217;t forget to do my homework again, I encourage you guys to do the exact same thing the next time you find a bug or some strange behavior in your software of choice.</p>
<p>Until next Friday! <img src='http://www.gandogames.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><em>Note: If you are paying to be able to &#8220;forget about this bugs&#8221; I think not reporting them could be valid, but still you should do it if you want them to be addressed faster.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gandogames.com/2011/02/short-story-developers-do-your-homework/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
