<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~files/feed.xsl"?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedpress="https://feed.press/xmlns" version="2.0">
  <channel>
    <feedpress:locale>en</feedpress:locale>
    <atom:link rel="self" href="http://feedpress.me/gallantgames"/>
    <atom:link rel="hub" href="http://feedpress.superfeedr.com/"/>
    <title>Gallant Games Blog</title>
    <description/>
    <link>http://www.gallantgames.com/posts</link>
    <item>
      <title>InControl: State Of The Asset</title>
      <description>&lt;p&gt;&lt;a href="http://www.gallantgames.com/incontrol"&gt;InControl&lt;/a&gt; is just a little over a year old on the Unity Asset Store now. It started as an open source project to scratch my own itch but it clearly resonates with the Unity community. Following the encouragement of friends and fellow developers to turn it into a sustainable paid asset, I&amp;#39;ve been really happy with how it has done.&lt;/p&gt;

&lt;p&gt;There&amp;#39;s always been an essence of good will to this project. Much of its success is due to the generousity of others and spreading it by word of mouth. I&amp;#39;ve tried really hard to provide good support and help folks with what they need. I&amp;#39;ve kept the slightly-less-featured open source version going with near parity, which has been put to great use in countless game jams. For the past year, I&amp;#39;ve shelved working on anything else in order to focus all my free time on it &amp;mdash; well, what little free time one has with an 18-month-old son.&lt;/p&gt;

&lt;p&gt;So, I want to take a moment to give a huge &lt;em&gt;thank you&lt;/em&gt; everyone who has been so supportive of this little project. It has enabled me (in a teensy tiny way) to vicariously be a part of developing several wonderful games out there and that gives me plenty of warm fuzzies. Meeting and catching up with several of you at GDC 2015, was inspiring and motivating.&lt;/p&gt;

&lt;p&gt;I&amp;#39;d also like to give a few of my thoughts on the future.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve just published version 1.5, which contains the long-awaited support for runtime rebindable controls. This update has required several significant changes to the internals in order to support this feature and prepare for some future additions.&lt;/p&gt;

&lt;p&gt;But it has been difficult maintaining two separate forks. As I&amp;#39;ve added more features to the Asset Store version, porting those additions over to the open source version has become more and more time consuming. With the latest update, the internals are so different that it is prohibitive.&lt;/p&gt;

&lt;p&gt;And so, after some deliberation, I&amp;#39;m announcing that the open source version (which roughly corresponds to version 1.4.4) will now be put into a frozen, basic maintenance-only mode. The repository will stay where it is, and I&amp;#39;ll continue to try keeping it compatible with Unity 4 and 5, but it will get no new features or significant changes. I hope that it can continue to be helpful in game jams and prototyping, and so I intend to keep it alive as long as is reasonably possible, but it will inevitably begin to age.&lt;/p&gt;

&lt;p&gt;As for the Asset Store version, untethering it completely from the open source version will allow it more freedom to grow. I&amp;#39;ll be keeping it backwards compatible right down to Unity 4.3 for several months to come to help ease the upgrade cycle as everyone begins to either move to Unity 5 or finish up their games with Unity 4.&lt;/p&gt;

&lt;p&gt;I have a few great features planned for the months ahead. There are certainly plenty of challenges to overcome and problems to solve in the controller space. I&amp;#39;ll briefly mention one planned addition that I&amp;#39;m particularly excited about.&lt;/p&gt;

&lt;p&gt;With the recent announcement of Unity 5 Personal Edition absorbing many of the features previously only available in Unity Professional, the most exciting prospect to me was that native plugins are now supported in the free version of Unity. Even before the announcement, I had begun to work on developing a native component for InControl that will bypass Unity (and many if its more troubling bugs) and provide a host of additional capabilities, specifically on desktop platforms.&lt;/p&gt;

&lt;p&gt;This will allow features such as high-frequency polling, robust hot-plugging and controller specific functions such as haptic-feedback and light control. In some cases it could also allow using certain controllers (for example, on Mac) without the need for installing weird third-party drivers.&lt;/p&gt;

&lt;p&gt;It is certainly a challenging thing to do right and it&amp;#39;s still super early in development, but my plan is to initially bring it to Mac and then grow it to Windows and Linux. I believe it has the potential to really take InControl to the next level.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m excited to see what the next year brings!&lt;/p&gt;
</description>
      <pubDate>Thu, 19 Mar 2015 20:31:00 -0500</pubDate>
      <link>/posts/30/incontrol-state-of-the-asset</link>
      <guid>34173cb38f07f89ddbebc2ac9128303f</guid>
    </item>
    <item>
      <title>Speculation: Unity And Xbox Controllers</title>
      <description>&lt;p&gt;This is a follow up to my &lt;a href="http://www.gallantgames.com/posts/27/details-on-the-xbox-360-controller-bug-in-unity"&gt;last post&lt;/a&gt; on the current Xbox 360 controller bug in Unity. In this post, I speculate on the possible cause of the bug.&lt;/p&gt;

&lt;p&gt;In my last post, I wrote the following:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;ldquo;An brief note on the Xbox 360 controller: Microsoft originally designed the triggers to work on a combined axis, with the left trigger adding 0..-1 to the axis and the right trigger 0..1. The value of the axis is the sum of the two trigger values. In Unity on Windows, this axis happens to be axis 2. Recently, support has (somehow) been added to Unity for splitting the triggers properly on axes 8 and 9.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It&amp;#39;s the word &amp;ldquo;somehow&amp;rdquo; that got me thinking. Please grab your tinfoil hats and accompany me on this train of thought.&lt;/p&gt;

&lt;p&gt;I was surprised when I found out that separated triggers had become possible with this controller in Unity. As far as I know, there &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx"&gt;isn&amp;#39;t a way to get access to those through DirectInput.&lt;/a&gt; But, I thought, maybe Microsoft had done something about it in a Windows update, or maybe Unity was doing some low level HID shenanigans to query the necessary trigger data.&lt;/p&gt;

&lt;p&gt;In the light of what I observed while experimenting with the recent bug, I have a new theory.&lt;/p&gt;

&lt;p&gt;I think Unity is using XInput.&lt;/p&gt;

&lt;p&gt;But XInput is a very &lt;em&gt;targeted&lt;/em&gt; API for querying up to four Xbox 360 controllers. Unity supports up to ten controllers, all of which could conceivably be of Xbox variety.&lt;/p&gt;

&lt;p&gt;Furthermore, Unity would logically need to use DirectInput to query for &lt;em&gt;other&lt;/em&gt; types of controllers, but Xbox controllers would &lt;em&gt;also&lt;/em&gt; show up through DirectInput. The same goes for XInput compatible clones. Which creates the challenge of &lt;em&gt;ignoring&lt;/em&gt; the first four XInput compatible controllers from the DirectInput list.&lt;/p&gt;

&lt;p&gt;And this is where I feel Unity may have gone wrong. I do not believe matching up controllers between XInput and DirectInput is reliably possible. And yet, they may have tried, most likely by trying to identify XInput compatible controllers in the DirectInput list by name and then matching them up in order.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The problem is Microsoft never intended for XInput and DirectInput to be used in conjunction. They explicitly state DirectInput is essentially deprecated, and is, in fact, not supported for Windows Store apps. Which is interesting, considering Unity 5 will add support for joysticks in Windows Store apps. &lt;em&gt;Hmm.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So now, assuming that it &lt;em&gt;is&lt;/em&gt; the case that Unity is trying to use XInput together with DirectInput, or perhaps their own native HID input library, suddenly the observations made about the bug begin to make sense.&lt;/p&gt;

&lt;p&gt;This would explain why the problems usually start with a controller being in the wrong XInput position, for example, slot 3 instead of 1, with slot 1 being empty. There is no guarantee that the DirectInput/HID device order would match up with the XInput order. This could throw off the logic for matching up controllers, which would in turn cause the wrong devices to be ignored or &amp;ldquo;deactivated&amp;rdquo; by Unity leading to a dead controller.&lt;/p&gt;

&lt;p&gt;This would explain why it&amp;#39;s always the &lt;em&gt;separated triggers&lt;/em&gt; that malfunction on one or both devices.&lt;/p&gt;

&lt;p&gt;This would explain why, in rare circumstances, there is a third phantom controller which matches one of the others on all input &lt;em&gt;except&lt;/em&gt; the separate trigger axes. In this case, Unity has not disabled the DirectInput/HID version while still enabling the XInput version.&lt;/p&gt;

&lt;p&gt;This would explain why it takes more than one Xbox controller to cause the problem reliably, as quickly plugging and unplugging them could create a small window of time where Windows hasn&amp;#39;t quite realized one is disconnected before assigning a new slot.&lt;/p&gt;

&lt;p&gt;This would explain why, at times, even with a single controller, the separated triggers don&amp;#39;t work for some users. This is either because DirectX (and therefore XInput) isn&amp;#39;t installed correctly or some internal logic in Unity didn&amp;#39;t match up the controllers and is ignoring the XInput side.&lt;/p&gt;

&lt;p&gt;Of course, this could all just be me connecting unrelated dots like &lt;a href="http://en.wikipedia.org/wiki/A_Beautiful_Mind_(film)"&gt;John Forbes Nash, Jr.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;1.&lt;/sup&gt; It&amp;#39;s worth noting, that InControl takes a similar approach when enabling XInput support, except that it never tries to match up controllers. It simply ignores and hides any known XInput compatible devices with the result that a limit of four Xbox 360 controllers can be used in that mode. If Unity wants to tread this path, it should impose the same limit as the price to pay for separated triggers, or accept the limitation of the single combined trigger axis.&lt;/p&gt;
</description>
      <pubDate>Fri, 08 Aug 2014 13:00:00 -0500</pubDate>
      <link>/posts/29/speculation-unity-and-xbox-controllers</link>
      <guid>6ea9ab1baa0efb9e19094440c317e21b</guid>
    </item>
    <item>
      <title>Details On The Xbox 360 Controller Bug In Unity</title>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; Unity (as of at least 4.5.2) has significant problems dealing with two or more Xbox 360 controllers on Windows, where they randomly may not work at all, or have non-functioning triggers, and/or have phantom clones. This is significant because it is the most common controller on the most common platform for many desktop gamers. There is no known workaround or reliable method for returning all connected controllers to a working state, except by trial and error.&lt;/p&gt;

&lt;a name="update"&gt;&lt;/a&gt;&lt;h2 id="update"&gt;Update&lt;/h2&gt;

&lt;p&gt;The bugginess turns out to be due to a conflagration of several issues. As of &lt;a href="http://unity3d.com/unity/whats-new/unity-4.6.3"&gt;Unity 4.6.3&lt;/a&gt; and the &lt;a href="http://unity3d.com/unity/qa/patch-releases"&gt;4.6.2p2 patch&lt;/a&gt;, two critical fixes have been made by Unity to address part of the problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows Standalone: Adding/removing game controllers should be detected more reliably now.&lt;/li&gt;
&lt;li&gt;Windows Standalone: Fallback to XInput 1.0 when XInput 1.3 is not installed on the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another critical fix was added in &lt;a href="http://unity3d.com/unity/qa/patch-releases"&gt;Unity 4.6.3p1 and 5.0.0p1&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: Changed Input.GetJoystickNames() on Windows to always match names to joystick numbers, similar to most other platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I believe there may be a few more issues to deal with, but it should be somewhat more reliable now.&lt;/p&gt;

&lt;a name="context"&gt;&lt;/a&gt;&lt;h2 id="context"&gt;Context&lt;/h2&gt;

&lt;p&gt;My project, &lt;a href="http://www.gallantgames.com/incontrol"&gt;InControl&lt;/a&gt;, has been an increasingly popular solution for cross-platform controller support in Unity.&lt;/p&gt;

&lt;p&gt;Recently, I started receiving scattered bug reports about strange controller behavior on Windows. It&amp;#39;s been surprisingly difficult to get details, with some users never responding to requests for more information, or replying that the problem has inexplicably solved itself.&lt;/p&gt;

&lt;p&gt;Reports covered a range of controllers, with the general flavor being controls not working, or working incorrectly, particularly triggers. Over time, the Xbox 360 controller has been the common denominator. Finally, one user responded with some specifics: two wired Xbox 360 controllers, on Windows, occasionally not working at all or the triggers not working properly.&lt;/p&gt;

&lt;p&gt;An brief note on the Xbox 360 controller: Microsoft originally designed the triggers to work on a combined axis, with the left trigger adding 0..-1 to the axis and the right trigger 0..1. The value of the axis is the sum of the two trigger values. In Unity on Windows, this axis happens to be axis 2. Recently, support has (somehow) been added to Unity for splitting the triggers properly on axes 8 and 9.&lt;/p&gt;

&lt;p&gt;As I experimented, it&amp;#39;s been relatively easy to reproduce, although it takes some persistence.&lt;/p&gt;

&lt;a name="results"&gt;&lt;/a&gt;&lt;h2 id="results"&gt;Results&lt;/h2&gt;

&lt;p&gt;With at least two Xbox 360 controllers connected, and launching Unity or a pre-built player on a freshly booted system, things usually work fine. If any of the controllers are attached and detached a few times, either while the app is running or before launch, things get a bit crazy. I found at least four states you can end up in randomly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everything works perfectly.&lt;/li&gt;
&lt;li&gt;The controllers are recognized by Unity, and all controls work with the exception of the independent trigger axes (8 and 9). These are not to be confused with the combined trigger axis 2, which &lt;em&gt;does&lt;/em&gt; continue work in this state.&lt;/li&gt;
&lt;li&gt;Both devices are recognized by Unity, but one or both devices do not report input.&lt;/li&gt;
&lt;li&gt;A &amp;quot;phantom&amp;quot; third device appears, which also receives input (so two joysticks in Unity are receiving the input from the same physical device, although one of them has the independent trigger axes working, while the other does not). This state is very rare.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem state will usually persist indefinitely through restarting Unity (or relaunching a built player), although, at least once I observed a controller going from state 3 to state 2 after relaunching Unity.&lt;/p&gt;

&lt;p&gt;Once one or more devices are unplugged and replugged, it goes to a random state in the list again.&lt;/p&gt;

&lt;p&gt;Often a broken state may be accompanied by one of the Xbox 360 controller player lights being &amp;ldquo;incorrect&amp;rdquo;. For instance, two controllers connected and they have lights 2 and 3 respectively. I&amp;#39;m not certain if Microsoft guarantees that two attached controllers will always occupy positions 1 and 2.&lt;/p&gt;

&lt;p&gt;I should point out that even while in a broken state in Unity, input still works correctly for both controllers with other applications. For example, using the XInput API with something like XInput.NET, or opening the controller properties in Windows Devices and Printers and testing the inputs there. The devices are still fully functional as far as Windows is concerned.&lt;/p&gt;

&lt;a name="thoughts"&gt;&lt;/a&gt;&lt;h2 id="thoughts"&gt;Thoughts&lt;/h2&gt;

&lt;p&gt;There seems to be no reliable course of action to get the devices back into a proper state, even plugging them all out, closing Unity, plugging them all back in one at a time slowly, and relaunching Unity, does not always seem to work. Rebooting may be the most reliable option, but I have not tested this extensively (yet).&lt;/p&gt;

&lt;p&gt;It is possible this bug manifests with other controllers too, as other controllers have been mentioned in bug reports I have received, but since at least one Xbox 360 controller has always been involved in every case, that issue needs to be resolved before any further assumptions can be made.&lt;/p&gt;

&lt;p&gt;The Xbox 360 controller is the &amp;ldquo;go-to&amp;rdquo; device for most desktop gamers, and Windows is their platform of choice, so this is a fairly serious issue. I have submitted a bug report to Unity and Unity QA has been quick to respond. Hopefully, it can be resolved soon in a patch update.&lt;/p&gt;

&lt;p&gt;A possible workaround in the short term, is turning on InControl&amp;#39;s &lt;a href="http://www.gallantgames.com/pages/incontrol-xinput"&gt;XInput&lt;/a&gt; support, however, since the Xbox 360 controllers are still picked up and processed by Unity they may very well affect, and break other kinds of attached controllers.&lt;/p&gt;

&lt;p&gt;I will update the status message at the top of this post as things progress.&lt;/p&gt;

&lt;p&gt;(For some wild speculation on why the bug may be happening, &lt;a href="http://www.gallantgames.com/posts/29/speculation-unity-and-xbox-controllers"&gt;read this follow up post.&lt;/a&gt;)&lt;/p&gt;
</description>
      <pubDate>Fri, 08 Aug 2014 12:00:00 -0500</pubDate>
      <link>/posts/27/details-on-the-xbox-360-controller-bug-in-unity</link>
      <guid>02e74f10e0327ad868d138f2b4fdd6f0</guid>
    </item>
    <item>
      <title>Irons In The Fire</title>
      <description>&lt;p&gt;It&amp;#39;s been a long time&amp;mdash;too long&amp;mdash;since I last posted. Work and life got busy, as they tend to do. Our first child was born three months ago. And I&amp;#39;ve been all over the place with side projects and prototypes. But now it&amp;#39;s time to dust off the site with a fresh redesign and begin talking about some of the things I&amp;#39;m chipping away at this year.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve been getting into &lt;a href="http://unity3d.com/"&gt;Unity3D&lt;/a&gt; over the last year or so, learning C# and generally getting the hang of things. I&amp;#39;ve worked on a little &lt;a href="https://github.com/pbhogan/TinyJSON"&gt;JSON library&lt;/a&gt; and a controller library (more on this later). After working on and discarding a bunch of game prototypes, it became time to work on a something more seriously and feel&amp;hellip; well&amp;hellip; productive.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve started work on a &lt;a href="http://en.wikipedia.org/wiki/Shoot_&amp;#x27;em_up"&gt;shmup&lt;/a&gt;, partly because I enjoy the genre and partly because it is simple enough that I won&amp;#39;t get overwhelmed&amp;mdash;though it certainly has its challenges.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m hoping to have something playable to show at &lt;a href="http://www.gdconf.com/"&gt;GDC&lt;/a&gt; this year. Maybe a level or so. I&amp;#39;ve put some money into graphics assets and have commissioned an illustrator to work on some of the characters for the little plot it has. I think it is safe to say I am committed to finishing it. Anyhow, here&amp;#39;s a little clip of the work in progress:&lt;/p&gt;

&lt;p&gt;        &lt;div class="embed"&gt;
          &lt;iframe class="vine-embed" src="https://vine.co/v/MzKdMLe65J2/embed/simple" width="600" height="600" frameborder="0"&gt;&lt;/iframe&gt;
          &lt;script async src="//platform.vine.co/static/scripts/embed.js" charset="utf-8"&gt;&lt;/script&gt;
        &lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;The controller library is called &lt;a href="https://github.com/pbhogan/InControl"&gt;InControl&lt;/a&gt; and I created it to scratch a big itch. It certainly isn&amp;#39;t the first cross-platform controller solution for Unity, so it is surprising just how enthusiastically other developers have received it. The project gets plenty of e-mail, bug reports and patches. A more recent trend is a flood of feedback during large game jams. Clearly, it is needed. Unfortunately, it does take time and, ultimately, hardware, to test, add to and maintain.&lt;/p&gt;

&lt;p&gt;InControl has reached a tipping point. I am still weighing the options, but it is almost certainly going to go into the Unity Asset Store soon, possibly with a few &amp;ldquo;pro&amp;rdquo; features to come. Still, I hope it can continue to be viable as an open source project.&lt;/p&gt;

&lt;p&gt;Playing board games is one of my passions. As a designer/developer, I love being exposed to new mechanics. There is something special about the raw, tactile nature of board games and they have a great social aspect too.&lt;/p&gt;

&lt;p&gt;As a child, long before I was able to program digital games, I would draw on bits of cardboard and make up games and activities. So perhaps they also hold sentimental value for me. They certainly inspire me. I&amp;#39;ve left dozens of discarded ideas and a few prototypes in my wake. I&amp;#39;ve been working on a prototype lately that I think has real potential, but it is early days yet.&lt;/p&gt;

&lt;p&gt;So, it looks like I have a few irons in the fire this year. They all seem viable and I&amp;#39;m excited to see how they pan out.&lt;/p&gt;
</description>
      <pubDate>Sun, 02 Feb 2014 21:01:00 -0600</pubDate>
      <link>/posts/25/irons-in-the-fire</link>
      <guid>8e296a067a37563370ded05f5a3bf3ec</guid>
    </item>
    <item>
      <title>Xcode Version Icons</title>
      <description>&lt;p&gt;Typically, I have at least two versions of Xcode installed. Occasionally more. Keeping track of which one is running can be difficult, so I grabbed &lt;a href="http://www.iconarchive.com/show/mac-icons-by-artua/Xcode-icon.html"&gt;this lovely icon&lt;/a&gt; by &lt;a href="http://www.artua.com/"&gt;Artua&lt;/a&gt; and put a ribbon on it with a label. &lt;/p&gt;

&lt;p&gt;It helps keep me sane.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/139412/GallantGames/Images/XcodeIcons/Suite.png" alt="Suite"&gt;&lt;/p&gt;

&lt;p&gt;In the package available below, I&amp;#39;ve included the Illustrator CS3 file (so you can make your own), ICNS and PNG versions.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://dl.dropbox.com/u/139412/GallantGames/Downloads/Xcode-Icons.zip"&gt;Download Xcode Versions Icon Pack&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Wed, 05 Oct 2011 19:00:00 -0500</pubDate>
      <link>/posts/24/xcode-version-icons</link>
      <guid>1ff1de774005f8da13f42943881c655f</guid>
    </item>
    <item>
      <title>360iDev Comments, Video and Slides</title>
      <description>&lt;p&gt;&lt;a href="http://360idev.com"&gt;360iDev&lt;/a&gt; was a blast. Several other iDevBlogADay authors have already commented on this. In trying to explain what the conference is like, I came up with the phrase &amp;ldquo;liberal arts developer conference.&amp;rdquo; There are plenty of developer talks, but also some great design, business and just-plain-makes-you-think talks.&lt;/p&gt;

&lt;p&gt;And multiplayer Pac-Man. Let&amp;#39;s not forget that. Oh, and donut burgers.&lt;/p&gt;

&lt;p&gt;I had a fantastic time meeting folks. While the talks were fantastic on their own, talking to other devs, sharing perspectives and experiences on various subjects took it to a whole new level. Below is a photo of &lt;a href="http://weheartgames.com/"&gt;Mike Berg&lt;/a&gt;, &lt;a href="http://struct.ca/"&gt;Matt Rix&lt;/a&gt; and myself.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/139412/GallantGames/Images/360iDev2011/MikeMattPat.png" alt="Faces"&gt;&lt;/p&gt;

&lt;p&gt;Mike and I teamed up for the Game Jam which was a lot of fun. We came up with a little game called Darkolite. You can check it out &lt;a href="http://gamejam.360idev.com/darkolite/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And finally, I promised to post my Git talk slides after the conference, but I also managed to get a pretty good screencast video of the talk and the audio pickup from the laptop was surprisingly good &amp;mdash; so if you missed it, or couldn&amp;#39;t make it to the conference, check it out below.&lt;/p&gt;

&lt;p&gt;&lt;div class="embed"&gt;&lt;iframe width="600" height="371" src="http://www.youtube.com/embed/GYnOwPl8yCE?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;        &lt;div class="embed"&gt;
          &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/9378128?rel=0" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen&gt;&lt;/iframe&gt;
        &lt;/div&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.slideshare.net/pbhogan/power-your-workflow-with-git"&gt;View/Download Slides&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Wed, 21 Sep 2011 19:00:00 -0500</pubDate>
      <link>/posts/23/360idev-comments-video-and-slides</link>
      <guid>37693cfc748049e45d87b8c7d8b9aacd</guid>
    </item>
    <item>
      <title>360iDev Git Talk</title>
      <description>&lt;p&gt;As I&amp;#39;ve mentioned before, I will be speaking at &lt;a href="http://360idev.com"&gt;360iDev&lt;/a&gt;. I do have a few announcements about that. With just a few days to go and many attendees also reading iDevBlogADay, I hope you will forgive this post not being all that developerish.&lt;/p&gt;

&lt;p&gt;My talk has taken a slightly different angle than the original proposal, and for those wondering whether to come to my talk or not, here is some more information.&lt;/p&gt;

&lt;p&gt;In preparing my talk, it became obvious that a different presentation on Git was needed. I really wanted to focus on things that you &lt;em&gt;cannot&lt;/em&gt; get by just hitting Google &amp;mdash; or at least not easily.&lt;/p&gt;

&lt;p&gt;This talk &lt;em&gt;will&lt;/em&gt; be technical, though not hard to understand.&lt;/p&gt;

&lt;p&gt;There are nearly 200 slides. I will take you on a deep dive inside Git, how it works, how it thinks about your project. I will show you why it is fast and powerful on the operational level. Then with that foundation I&amp;#39;ll take you into workflow and organization. I believe this is the right approach to demystifying and really &amp;ldquo;getting&amp;rdquo; Git.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m not going to spend much time on using Git or getting it set up. There will be no boring command line demos. I&amp;#39;ll touch on a few things, but that stuff is all available online. If you DO need help with using Git, I will be happy to talk to you at any time during the conference to help you get set up or answer questions. If I don&amp;#39;t know something off the cuff, I&amp;#39;ll find an answer and get back to you.&lt;/p&gt;

&lt;p&gt;I recently had an opportunity to give a beta version of this talk at my local CocoaHeads. One developer commented that although he had been using Git for a while, this talk revolutionized how he thought about it and prompted lots of discussion with his team. Based on further feedback, I tried to strip out or trim down any less interesting part to get it streamlined. &lt;/p&gt;

&lt;p&gt;I&amp;#39;m really excited to give this talk at 360iDev and I hope you&amp;#39;ll join me for it. If you do miss it, you can always get the &lt;a href="http://360idev.com/session-videos"&gt;session video&lt;/a&gt; after the fact. The slides will be available on this blog.&lt;/p&gt;

&lt;p&gt;Here are a few more reasons to attend:&lt;/p&gt;

&lt;p&gt;The awesome guys at &lt;a href="http://www.fournova.com/"&gt;Fournova&lt;/a&gt; have generously allowed me to give away a free copy of &lt;a href="http://www.git-tower.com/"&gt;Tower&lt;/a&gt; to an attendee. They&amp;#39;ve also provided some stickers, Git cheat sheets, and a coupon code for 10% off during the conference.&lt;/p&gt;

&lt;p&gt;As if that isn&amp;#39;t enough, &lt;a href="http://www.github.com"&gt;GitHub&lt;/a&gt; have provided a pile of stickers and a free month of their Micro hosting plan.&lt;/p&gt;

&lt;p&gt;Regardless of your interest in Git, please come up and introduce yourself &amp;mdash; I&amp;#39;d love to meet you.&lt;/p&gt;

&lt;p&gt;See you there!&lt;/p&gt;
</description>
      <pubDate>Wed, 07 Sep 2011 19:00:00 -0500</pubDate>
      <link>/posts/22/360idev-git-talk</link>
      <guid>b6d767d2f8ed5d21a44b0e5886680cb9</guid>
    </item>
    <item>
      <title>Scaffolding Code From Shaders</title>
      <description>&lt;p&gt;I don&amp;#39;t like writing boilerplate code.&lt;/p&gt;

&lt;p&gt;A while back, I started dragging my game engine kicking and screaming into the world of OpenGL ES 2. The good news is this lets me write shaders. The bad news is I need to write boilerplate code every time I write a shader &amp;mdash; you know the kind &amp;mdash; scaffolding code to load the shader, code to bind the attributes and uniforms and provide some sort of constant, enum or handle to refer to them, etc.&lt;/p&gt;

&lt;p&gt;Meh.&lt;/p&gt;

&lt;p&gt;So of course this is a terrific opportunity to write some code to write my code for me.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve blogged on &lt;a href="http://www.complang.org/ragel/"&gt;Ragel&lt;/a&gt; and its usefulness for parsing things like shaders before. I don&amp;#39;t know what happened to that post, though. It seems to have disappeared in the transition from Tumblr to my new site. Oh well. It was a bad post anyway.&lt;/p&gt;

&lt;p&gt;I won&amp;#39;t bore you with all the details, but I wrote a little tool called &lt;code&gt;shaderize&lt;/code&gt; which takes a folder full of vertex and fragment shaders (hereafter referred to as the shader directory) along with an output folder containing templates (hereafter referred to as the output directory), parses the shaders and applies the data to the templates producing&amp;hellip; code I did not have to write! Hooray!&lt;/p&gt;

&lt;h2 id="toc_0"&gt;Installation&lt;/h2&gt;

&lt;p&gt;I used Ruby to write &lt;code&gt;shaderize&lt;/code&gt;, so I packaged it up as a gem. All you need to do is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;gem install shaderize
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You&amp;#39;ll probably need to prefix that with &lt;code&gt;sudo&lt;/code&gt; unless you&amp;#39;re using &lt;a href="http://beginrescueend.com/"&gt;Ruby Version Manager&lt;/a&gt;. Note: OS X comes with Ruby installed out-of-the-box.&lt;/p&gt;

&lt;h2 id="toc_1"&gt;Templates&lt;/h2&gt;

&lt;p&gt;The templates are written in &lt;a href="http://mustache.github.com/"&gt;mustache&lt;/a&gt;, a wonderfully simple little templating language. Seriously, it will take you about 2 minutes to learn. Your code templates can have anything in them, but mine look something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Shaders.h.tpl&lt;/span&gt;

&lt;span class="cp"&gt;#pragma once&lt;/span&gt;
&lt;span class="cp"&gt;#ifndef _Shaders_H_&lt;/span&gt;
&lt;span class="cp"&gt;#define _Shaders_H_&lt;/span&gt;

&lt;span class="cp"&gt;#include &amp;quot;ShaderProgram.h&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;#include &amp;quot;ShaderUniform.h&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;#include &amp;quot;ShaderAttribute.h&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;Shader&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;


&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="err"&gt;{{&lt;/span&gt;&lt;span class="nc"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="n"&gt;_Shader&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ShaderProgram&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="n"&gt;ShaderAttribute&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
    &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="n"&gt;ShaderUniform&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
    &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ShaderProgram&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{{name}}&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{{name}}&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetUniform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{{name}}&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uniforms&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="n"&gt;_Shader&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;


&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;LoadShaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// namespace&lt;/span&gt;

&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="c1"&gt;// _Shaders_H_&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// Shaders.cpp.tpl&lt;/span&gt;

&lt;span class="cp"&gt;#include &amp;quot;Shaders.h&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;Shader&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;


&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="n"&gt;_Shader&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;


&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;LoadAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shaders&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// namespace&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can see the files have a double extension. Shaderize expects the templates to end in &lt;code&gt;.tpl&lt;/code&gt; and will produce files in the same directory with the same name sans the &lt;code&gt;.tpl&lt;/code&gt; extension.&lt;/p&gt;

&lt;h2 id="toc_2"&gt;Invoking&lt;/h2&gt;

&lt;p&gt;You can run &lt;code&gt;shaderize&lt;/code&gt; from the command line like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;shaderize Resources/Shaders Source/Application
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I have a shell build phase that does this for me. Shaderize is smart enough to only update the scaffolded files if something has changed that requires it to do so.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;shaderize &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;/Resources/Shaders &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;/Source/Application
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And that&amp;#39;s it. Now when I hit build, &lt;code&gt;shaderize&lt;/code&gt; will take all my shaders and produce wrapper classes for me, including members for the attributes and uniforms, along with a method that loads them all. This means I can write a shader, and use it without &lt;u&gt;writing a single line of boilerplate code to manage it&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;Nifty.&lt;/p&gt;

&lt;p&gt;Of course there is a lot more code hiding behind &lt;code&gt;ShaderProgram&lt;/code&gt;, &lt;code&gt;ShaderAttribute&lt;/code&gt; and &lt;code&gt;ShaderUniform&lt;/code&gt;, but that&amp;#39;s just vanilla C++ code and left as an exercise to the reader.&lt;/p&gt;

&lt;h2 id="toc_3"&gt;Tangent&lt;/h2&gt;

&lt;p&gt;I do actually have a C version of my shader parser that I use to extract the uniforms and attributes at load time so I can set those up with the appropriate OpenGL handles and so on. As a result I have no enums, constants or &lt;code&gt;#define&lt;/code&gt; statements littering my code. That&amp;#39;s really a more complicated subject and could be done with &lt;code&gt;shaderize&lt;/code&gt; too &amp;mdash; I just haven&amp;#39;t got around to it yet. &lt;/p&gt;

&lt;p&gt;I&amp;#39;m really happy with my shader workflow now. Code for using them is very clean. There&amp;#39;s a lot more that could be done, including smart shader generation, but I&amp;#39;ve done enough yak shaving for now.&lt;/p&gt;

&lt;h2 id="toc_4"&gt;Meta&lt;/h2&gt;

&lt;p&gt;You can get the Ruby source for &lt;code&gt;shaderize&lt;/code&gt; on &lt;a href="https://github.com/pbhogan/shaderize"&gt;my GitHub page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code is released under the MIT license.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is part of &lt;a href="http://idevblogaday.com/"&gt;iDevBlogADay,&lt;/a&gt;, a collaboration of blogs by indie iOS developers. You can subscribe to iDevBlogADay through &lt;a href="http://feeds.feedburner.com/idevblogaday"&gt;RSS&lt;/a&gt; or follow the &lt;a href="http://twitter.com/#search?q=%23idevblogaday"&gt;#iDevBlogADay&lt;/a&gt; hash tag or &lt;a href="http://twitter.com/#!/idevblogaday"&gt;@idevblogaday&lt;/a&gt; on Twitter.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Wed, 24 Aug 2011 19:00:00 -0500</pubDate>
      <link>/posts/21/scaffolding-code-from-shaders</link>
      <guid>3c59dc048e8850243be8079a5c74d079</guid>
    </item>
    <item>
      <title>Turn TODOs Into Warnings With Xcode</title>
      <description>&lt;p&gt;In the process of going through my game engine and refactoring a few things, I noticed a bunch of &lt;code&gt;TODO:&lt;/code&gt; reminders that I had apparently dropped in months ago and promptly forgot about. Out of sight, out of mind.&lt;/p&gt;

&lt;p&gt;After a quick search, I found this very helpful &lt;a href="http://deallocatedobjects.com/2011/05/11/show-todos-and-fixmes-as-warnings-in-xcode-4"&gt;post&lt;/a&gt; by Jake Marsh for turning them (and other markers) into Xcode warnings at build time.&lt;/p&gt;

&lt;p&gt;I refactored his snippet slightly and ended up with the following. Just drop it in as a script build phase.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;TYPES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m|mm|c|cc|cpp|cxx|h|hpp&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;MATCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TODO:|FIXME:|\?\?\?:|\!\!\!:&amp;quot;&lt;/span&gt;
find &lt;span class="s2"&gt;&amp;quot;${SRCROOT}&amp;quot;&lt;/span&gt; -type f | egrep &lt;span class="s2"&gt;&amp;quot;^.*\.($TYPES)$&amp;quot;&lt;/span&gt; | xargs egrep --with-filename --line-number --only-matching &lt;span class="s2"&gt;&amp;quot;($MATCH).*\$&amp;quot;&lt;/span&gt; | perl -p -e &lt;span class="s2"&gt;&amp;quot;s/($MATCH)/ warning: \$1/&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The advantage of all this is that I absolutely abhor warnings. Having them show up every time I build will quickly grate on my nerves until I go in and address them.&lt;/p&gt;
</description>
      <pubDate>Thu, 18 Aug 2011 19:00:00 -0500</pubDate>
      <link>/posts/20/turn-todos-into-warnings-with-xcode</link>
      <guid>98f13708210194c475687be6106a3b84</guid>
    </item>
    <item>
      <title>Speaking At 360idev</title>
      <description>&lt;p&gt;I am super excited to announce that I will be speaking at &lt;a href="http://360idev.com"&gt;360iDev&lt;/a&gt; this September. You can see the schedule &lt;a href="http://360idev.com/schedule"&gt;here&lt;/a&gt;. This is going to be an awesome conference, and I&amp;#39;m stoked to be a part of it. Everyone who attends 360iDev raves about it so, if you can attend, don&amp;#39;t miss it! &lt;/p&gt;

&lt;p&gt;My talk is entitled, &amp;ldquo;Power Your Workflow With Git.&amp;rdquo; Here is an excerpt from the description:&lt;/p&gt;

&lt;div class="blockquote"&gt;&lt;i class="fa fa-quote-left"&gt;&lt;/i&gt;
&lt;p&gt;Xcode 4 finally includes much requested support for Git. Git is a free, distributed version control system designed to handle everything from small to very large projects with speed and efficiency. This makes it perfect for indie developers.&lt;/p&gt;

&lt;p&gt;While Git has been around for a while, the tools and workflows are only now maturing. Now is the time to examine how you can benefit from using it.&lt;/p&gt;

&lt;p&gt;This talk will be practical. We will start by briefly introducing Git, the core concepts of a distributed version control system and why it might be preferable over Subversion. &lt;/p&gt;

&lt;p&gt;After peeking under the hood, we will focus on how to use it effectively in iOS development. Git does not enforce any given workflow, so we&amp;#39;ll discuss best practices, the pedantically &amp;ldquo;perfect&amp;rdquo; workflow and then scale it back for the indie developer and small teams. We&amp;#39;ll run through the common use cases, tasks and configurations, survey several of the tools and services available and, of course, get down and dirty on the command line.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;You can expect this talk to be &lt;em&gt;packed&lt;/em&gt; with content. Even if you&amp;#39;ve kicked the tires with Git already, you will most likely learn a few tips along the way.&lt;/p&gt;
</description>
      <pubDate>Tue, 19 Apr 2011 19:00:00 -0500</pubDate>
      <link>/posts/19/speaking-at-360idev</link>
      <guid>1f0e3dad99908345f7439f8ffabdffc4</guid>
    </item>
  </channel>
</rss>
