<?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>Soft Werewolf</title>
	<atom:link href="http://www.softwerewolf.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.softwerewolf.com</link>
	<description>Jeff Fal&#039;s Development Blog</description>
	<lastBuildDate>Wed, 18 Apr 2012 18:54:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>My rookie&#8217;s confusion with Objective-C properties</title>
		<link>http://www.softwerewolf.com/2012/04/my-rookies-confusion-with-objective-c-properties/</link>
		<comments>http://www.softwerewolf.com/2012/04/my-rookies-confusion-with-objective-c-properties/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 18:50:37 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[properties]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=82</guid>
		<description><![CDATA[When I started coding in Objective-C, one of the first things I learned about was properties. The tutorials I worked from showed me properties before talking about instance variables. In fact, they didn&#8217;t go into much detail about instance variables, so you&#8217;ll forgive me for starting out thinking that properties were instance variables. It wasn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>When I started coding in Objective-C, one of the first things I learned about was properties. The tutorials I worked from showed me properties before talking about instance variables. In fact, they didn&#8217;t go into much detail about instance variables, so you&#8217;ll forgive me for starting out thinking that properties <em>were</em> instance variables.</p>
<p>It wasn&#8217;t even a problem until I made a sub-class that needed to use one of its super-class&#8217;s properties. It didn&#8217;t think the property existed. I thought maybe the problem was that the property was only synthesized in the super-class, so I tried copying the &#8220;@synthesize&#8221; line into the sub-class&#8217;s implementation. It seemed to work at first, but it turns out it was just creating a new property. It didn&#8217;t get or set the same data that the super-class was referring to.</p>
<p>Of course, what I was missing is that the whole point of properties is not to make a place to store data. You can do plenty of data storage with simple instance variables in the &#8220;@interface&#8221; block like so:</p>
<p><code>@interface Class : SuperClass<br />
{<br />
  ObjectClass *myData;<br />
}</code></p>
<p>You use properties when you want to give outside objects access to data, and all properties do is automatically create method to get and set instance variables. So I could write an object like this:</p>
<p><code>@interface Class : SuperClass<br />
{<br />
  ObjectClass *_myData;<br />
}</p>
<p>- (id)myData;<br />
- (void)setMyData:(ObjectClass *)myData;</code></p>
<p>Or I could get the same result by writing this:</p>
<p><code>@interface Class : SuperClass<br />
{<br />
  ObjectClass *myData;<br />
}</p>
<p>@property myData;</code></p>
<p>Now when you write &#8220;@synthesize myData;&#8221; in your implementation file, you should think of that as the same as defining two methods, &#8220;myData&#8221; and &#8220;setMyData&#8221;. In fact, if you don&#8217;t write a &#8220;@synthesize&#8221; line and just start typing &#8220;- (void)setM&#8221;, Xcode will want to finish it as &#8220;- (void)setMyData&#8221; because declaring the property in the interface sets us up to expect getter and setter methods in the implementation. You can even leave &#8220;@synthesize&#8221; out of it and define the methods by hand, if you want. That can be convenient if you need extra stuff to happen when outside objects get and set your properties. Which leads me to another thing that confused me. When you define a property, you&#8217;ve also got options like this:</p>
<p><code>@property (assign) myData;<br />
@property (readOnly) myData;<br />
@property (retain) myData;</code></p>
<p>What&#8217;s the difference? The difference is what kind of setter method you&#8217;re automatically defining. &#8220;(assign)&#8221; gives you straight up assignment. &#8220;(readOnly)&#8221; doesn&#8217;t let you set at all. &#8220;(retain)&#8221; does the extra magic to manage the memory for your property. This is where properties get really nice. You can make sure your object is getting retained and released at all the right times if you use &#8220;(retain)&#8221;. And you can be sure that when you assign your property with a brand new object, the old one will be disposed of correctly. When you deallocate, you don&#8217;t release this kind of property. Instead, you just assign it to nil. Your synthesized setter method will do the rest.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/04/my-rookies-confusion-with-objective-c-properties/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memory management with Objective-C</title>
		<link>http://www.softwerewolf.com/2012/04/memory-management-with-objective-c/</link>
		<comments>http://www.softwerewolf.com/2012/04/memory-management-with-objective-c/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 18:34:41 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[memory management]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=81</guid>
		<description><![CDATA[The most daunting thing about learning Objective-C after living in the world of high level scripting languages is the memory management. From the beginning, I figured it would be a hassle, but I didn&#8217;t think it would be complicated. Turns out, it&#8217;s not even though there&#8217;s a lot written out there on the Web that [...]]]></description>
			<content:encoded><![CDATA[<p>The most daunting thing about learning Objective-C after living in the world of high level scripting languages is the memory management. From the beginning, I figured it would be a hassle, but I didn&#8217;t think it would be complicated. Turns out, it&#8217;s not even though there&#8217;s a lot written out there on the Web that makes it sound that way. The best article I&#8217;ve found is here: <a href="http://interfacelab.com/objective-c-memory-management-for-lazy-people/" onclick="pageTracker._trackPageview('/outgoing/interfacelab.com/objective-c-memory-management-for-lazy-people/?referer=');">Objective-C Memory Management for Lazy People</a>. Some simple rules make the whole project very easy.</p>
<blockquote>
<ul>
<li>If you own it, release it.</li>
<li>If you don’t own it, don’t release it.</li>
<li>Override dealloc in your classes to release the fields that you own.</li>
<li>Never call dealloc directly.</li>
</ul>
</blockquote>
<p>Which are made simpler by these rules about when you own something.</p>
<blockquote>
<ul>
<li>You own it if you <strong>alloc</strong> it.</li>
<li>You own it if you <strong>copy</strong> it.</li>
<li>You own it if you <strong>new</strong> it.</li>
</ul>
</blockquote>
<p>Easy. As soon as you write one of those three commands, ask yourself where you&#8217;re releasing the object in question. If you allocate something in your init method, you probably want to release it in your dealloc method. If you allocate it in a method and never use it again, you probably want to release it in the method. If you allocate it in one place and then need to pass it off somewhere else, you probably want to autorelease it, which is just like releasing except that it doesn&#8217;t happen right away. Autoreleasing is good for methods that return objects. Chances are that when your method returns an object, the object that called said method will have a way to retain the object on its own without your help. And if it doesn&#8217;t, it should. A lot of your convenience methods like NSArray&#8217;s arrayWithArray: provide you with autoreleased objects, which is nice. That&#8217;s why you don&#8217;t have to release them yourself.</p>
<p>Things get a bit more complicated when you throw properties into the mix, but I&#8217;ll leave that for another time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/04/memory-management-with-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Very special rooms</title>
		<link>http://www.softwerewolf.com/2012/04/very-special-rooms/</link>
		<comments>http://www.softwerewolf.com/2012/04/very-special-rooms/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:08:08 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Dungeonism]]></category>
		<category><![CDATA[dungeonism]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[ios]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=77</guid>
		<description><![CDATA[Here are a bunch of diagrams of special rooms that will go in the dungeons of Dungeonism. The blocks represent &#8212; in order of appearance top left-to-bottom right &#8212; walls, breakable blocks, bad guys, movable blocks, bombs, pressure plates, coins, remotely-activated moving blocks, gates, holes, and switches.]]></description>
			<content:encoded><![CDATA[<p>Here are a bunch of diagrams of special rooms that will go in the dungeons of <em>Dungeonism</em>. The blocks represent &mdash; in order of appearance top left-to-bottom right &mdash; walls, breakable blocks, bad guys, movable blocks, bombs, pressure plates, coins, remotely-activated moving blocks, gates, holes, and switches.</p>
<p><img class="aligncenter size-full wp-image-78" title="Special Rooms" src="http://www.softwerewolf.com/wp-content/uploads/2012/04/specialRooms.jpg" alt="" width="510" height="510" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/04/very-special-rooms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terrible design concepts</title>
		<link>http://www.softwerewolf.com/2012/04/terrible-design-concepts/</link>
		<comments>http://www.softwerewolf.com/2012/04/terrible-design-concepts/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 19:23:19 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Dungeonism]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[dungeonism]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[ios]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=75</guid>
		<description><![CDATA[My functioning Dungeonism app still exists in the world of placeholder graphics, but I have been working to home in on the design direction I want to take once the gameplay&#8217;s ready to go. To that end, I&#8217;ve got a small pool of concepts I&#8217;m playing with. My process is to every once in a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">My functioning <em>Dungeonism</em> app still exists in the world of placeholder graphics, but I have been working to home in on the design direction I want to take once the gameplay&#8217;s ready to go. To that end, I&#8217;ve got a small pool of concepts I&#8217;m playing with. My process is to every once in a while remove two concepts from consideration and come up with two new ones to replace them. Here are the outtakes so far:</p>
<p><img class="aligncenter size-full wp-image-76" title="Concept Rejects" src="http://www.softwerewolf.com/wp-content/uploads/2012/04/conceptrejects.jpg" alt="Concept Rejects" width="540" height="1080" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/04/terrible-design-concepts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Combat systems and Dungeonism</title>
		<link>http://www.softwerewolf.com/2012/04/combat-systems-and-dungeonism/</link>
		<comments>http://www.softwerewolf.com/2012/04/combat-systems-and-dungeonism/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 18:54:37 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Dungeonism]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[dungeonism]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[ios]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=71</guid>
		<description><![CDATA[If you&#8217;ve played my Dungeon Escape prototype, you may have encountered a skeleton. If you did, you may have attacked him. If you attacked him, you surely were witness to what I affectionately call my Pie Chart Combat System. I was much pleased when I invented it. It solved a problem I gave myself, which [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-72 alignleft" title="Pie Chart Combat" src="http://www.softwerewolf.com/wp-content/uploads/2012/04/pieChart.png" alt="Pie Chart Combat" width="200" height="200" /> If you&#8217;ve played my <a href="http://lab.softwerewolf.com/dungeon/de.html" onclick="pageTracker._trackPageview('/outgoing/lab.softwerewolf.com/dungeon/de.html?referer=');">Dungeon Escape prototype</a>, you may have encountered a skeleton. If you did, you may have attacked him. If you attacked him, you surely were witness to what I affectionately call my Pie Chart Combat System. I was much pleased when I invented it. It solved a problem I gave myself, which was to make a random combat system that used attack and defense skills and wasn&#8217;t picky about what those skill values were. That is, no maximums and minimums. The Pie Chart system takes an attacker&#8217;s attack skill, adds it to a defender&#8217;s defend skill, picks a number in that range, and then makes the attack successful if the result is less than the attack skill. In other words, the two skills become pies on a wheel of fortune, and then you spin the wheel. It&#8217;s simple. That&#8217;s why I liked it. It even allows for more than two outcomes if you add in another skill.</p>
<p>The Pie Chart Combat System is one of the fundamental things I carried over from <em>Dungeon Escape</em> to <em>Dungeonism</em>. It was a crucial piece of value I was going to preserve in the new, simpler game, while most things around it changed. In some ways, it was the central aspect of <em>Dungeonism</em>.</p>
<p><img class="alignright size-full wp-image-73" title="Diagram of possible attacks" src="http://www.softwerewolf.com/wp-content/uploads/2012/04/attackDiagram.png" alt="Diagram of possible attacks" width="200" height="200" /> That is, until I got rid of it, which I had to do because it was getting in the way of some other mechanics I had added in. Because one of my goals for <em>Dungeonism</em> was to make the player use the space a little more in his strategies, I came up with a new blocking system. Attacks would always get blocked when the defender was facing the attacker. Right away, this encourages you to always step around your victim before you hit them, which you&#8217;re not always close enough to do. (The defender also automatically turns to block if he rested that turn.) This sets up an interesting trade-off that gets too muddied when you&#8217;re also hoping not to get tripped up by pure chance. And along with some fatigue-based mechanics, it makes combat interesting enough that any benefit from the ambiguity of a random system is redundant. Sorry, pie chart.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/04/combat-systems-and-dungeonism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cocos2d</title>
		<link>http://www.softwerewolf.com/2012/03/cocos2d/</link>
		<comments>http://www.softwerewolf.com/2012/03/cocos2d/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 13:58:53 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Dungeonism]]></category>
		<category><![CDATA[cocos2d]]></category>
		<category><![CDATA[dungeonism]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=68</guid>
		<description><![CDATA[I was probably four hours into coding Dungeonism before I discovered the 2D game engine cocos2d. It&#8217;s good that it didn&#8217;t take me longer because those four hours were essentially wasted. I was already intimidated enough by the strange syntax of Objective-C and the prospect of having to manage memory myself, like a sucker. There [...]]]></description>
			<content:encoded><![CDATA[<p>I was probably four hours into coding <em>Dungeonism</em> before I discovered the 2D game engine <a href="http://www.cocos2d-iphone.org/" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/?referer=');">cocos2d</a>. It&#8217;s good that it didn&#8217;t take me longer because those four hours were essentially wasted. I was already intimidated enough by the strange syntax of Objective-C and the prospect of having to <em>manage memory myself, like a sucker</em>. There was no power left in my brain to grapple with the basic iOS frameworks.</p>
<p>cocos2d was originally written for Python, but it&#8217;s been ported to Objective-C, and it&#8217;s become a very popular way to make iOS games. It provides an intuitive way to create sprites, move them around, and recognize touches. It also makes it simple to create menus and to switch between scenes. In no time, I recreated everything I&#8217;d done from scratch (not much) and was ready to import some the images I had from the <em>Dungeon Escape</em> prototype. Gladly, I left behind grappling with graphics and user input, and I was able to really work on the game. Fantastic.</p>
<p>And <em>Dungeonism</em> doesn&#8217;t even use the physics engines Box2d (used by <em>Angry Birds</em>) or Chipmunk, which are integrated into cocos2d for iPhone. It&#8217;s no wonder there are <a href="http://www.cocos2d-iphone.org/games/?orderby=rating&amp;order=down" onclick="pageTracker._trackPageview('/outgoing/www.cocos2d-iphone.org/games/?orderby=rating_amp_order=down&amp;referer=');">so many games that use cocos2d.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/03/cocos2d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Dungeonism</title>
		<link>http://www.softwerewolf.com/2012/03/introducing-dungeonism/</link>
		<comments>http://www.softwerewolf.com/2012/03/introducing-dungeonism/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 16:47:42 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Dungeonism]]></category>
		<category><![CDATA[dungeon crawling]]></category>
		<category><![CDATA[dungeonism]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=65</guid>
		<description><![CDATA[Blog went dark for a while. Hmmm&#8230; I guess I was concentrating too hard on my new project Dungeonism. It&#8217;s a dungeon crawling game for iPhone. I&#8217;ve been coding it since January, and I estimate it&#8217;s 50% done, but that might be optimistic. The gameplay is certainly 50% done, but after that, I have a [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_67" class="wp-caption alignright" style="width: 210px"><a href="http://www.softwerewolf.com/wp-content/uploads/2012/03/Dungeonism_2.png"><img class="size-medium wp-image-67" title="Dungeonism 2" src="http://www.softwerewolf.com/wp-content/uploads/2012/03/Dungeonism_2-200x300.png" alt="Screenshot of Dungeonism" width="200" height="300" /></a><p class="wp-caption-text">Dungeonism</p></div>
<p>Blog went dark for a while. Hmmm&#8230; I guess I was concentrating too hard on my new project <em>Dungeonism</em>. It&#8217;s a dungeon crawling game for iPhone. I&#8217;ve been coding it since January, and I estimate it&#8217;s 50% done, but that might be optimistic. The gameplay is certainly 50% done, but after that, I have a lot of audio-visual polish to add. Right now, it&#8217;s a silent game with simple geometric artwork &#8212; which captures the classic gaming spirit the final game will have, but more refined.</p>
<p><em>Dungeonism</em> began life last year as this semi-absurd concept: a 2-dimensional, turn-based take on the <em>Elder Scrolls</em> games. I guess it grew from my desire to continue to play <em>Oblivion</em> while I was in meetings at work. There should be an engrossing fantasy game that demands the same amount of your attention as <em>Bejeweled</em>. To this end, I spent a few months building an HTML/JavaScript prototype of a dungeon game, which you can mess around with if you want. Let&#8217;s call this iteration <em>Dungeon Escape</em>. You can play what I made here: <a href="http://lab.softwerewolf.com/dungeon/de.html" onclick="pageTracker._trackPageview('/outgoing/lab.softwerewolf.com/dungeon/de.html?referer=');">http://lab.softwerewolf.com/dungeon/de.html</a></p>
<p>As you can see, <em>Dungeon Escape</em> has a more detailed (if crudely so) look to it, and that&#8217;s because it emphasized world exploration. It was going to take place in a vast world with settings and characters and stories and lots and lots of content that would&#8217;ve take many many hours of work to create.</p>
<p>The emphasis in <em>Dungeonism</em> is pure gameplay. You do unlock new dungeons in it. And you do develop your character. But the dungeons are created procedurally each time you play them. And you develop your character so you can play harder dungeons, traveling deeper into them, and encountering new monsters.</p>
<p>It&#8217;s a more casual approach, and it brings it closer to the original idea for creating a low-attention, still-immersive experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2012/03/introducing-dungeonism/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adobe Edge experiment: Eddie the Brick</title>
		<link>http://www.softwerewolf.com/2011/08/adobe-edge-experiment-eddie-the-brick/</link>
		<comments>http://www.softwerewolf.com/2011/08/adobe-edge-experiment-eddie-the-brick/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 16:25:17 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[adobe edge]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[eddie the brick]]></category>
		<category><![CDATA[edge]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=62</guid>
		<description><![CDATA[Adobe has seen the future &#8212; or at least a potential future &#8212; and they have prepared accordingly. If Flash meets an untimely end, Adobe Edge will rise to take its place. Even if Flash sticks around, Adobe Edge is a cool little tool that lets you add HTML/CSS/JS animation to a page in a [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe has seen the future &#8212; or at least a potential future &#8212; and they have prepared accordingly. If Flash meets an untimely end, <a href="http://labs.adobe.com/technologies/edge/" onclick="pageTracker._trackPageview('/outgoing/labs.adobe.com/technologies/edge/?referer=');">Adobe Edge</a> will rise to take its place. Even if Flash sticks around, Adobe Edge is a cool little tool that lets you add HTML/CSS/JS animation to a page in a design-friendly interface, dragging and dropping, timelining and keyframing.</p>
<p>I decided to give Edge a spin, and I made <a href="http://lab.softwerewolf.com/edge/ETB_Caffeine.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/lab.softwerewolf.com/edge/ETB_Caffeine.html?referer=');">this unfunny Eddie the Brick cartoon</a> with it.</p>
<p><img src="http://www.softwerewolf.com/wp-content/uploads/2011/08/adobeedge.png" alt="Screenshot of Adobe Edge" title="Adobe Edge" width="540" height="338" class="aligncenter size-full wp-image-63" /></p>
<p>The current release is Preview 1, and it&#8217;s pretty rough. While working with it I ran into several bugs and missing features. When I first saved my project, it reset all my settings. I was stumped for a bit because I turned off the auto-keyframe function and didn&#8217;t realize there was also a function that was hiding all my static objects (because they hadn&#8217;t been automatically given keyframes). My project involved bits of text appearing and disappearing, and I couldn&#8217;t find a way to have objects only appear at certain times. I used opacity keyframes instead. Images can&#8217;t be scaled in the interface. Also, the full animation can&#8217;t be looped. None of these are big deals, and I&#8217;m sure Adobe will address them as development continues.</p>
<p>One thing that might be an issue occurred when I added a whole bunch of keyframes. Eddie is jittering for the whole animation, so I created a repeating pattern of him slightly, rapidly moving about. The last few pastes I did of the pattern made the program hang for several minutes. It probably also makes up the bulk of the 240k JavaScript file Edge created for the project.</p>
<p>All in all, it&#8217;s a cool start, and I look forward to a much-polished version of this becoming a standard part of my workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2011/08/adobe-edge-experiment-eddie-the-brick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrapy helps me scrape</title>
		<link>http://www.softwerewolf.com/2011/08/scrapy-helps-me-scrape/</link>
		<comments>http://www.softwerewolf.com/2011/08/scrapy-helps-me-scrape/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 10:22:49 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[denver]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scrapy]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=61</guid>
		<description><![CDATA[Between a recent Edward Tufte talk in Denver and the Kindle release of Flowing Data&#8217;s new book, my distraction of choice lately has been data visualization. In particular, I&#8217;ve been on the hunt for data about my city. I had an idea for a chart displaying a map of houses in Denver color-coded by year [...]]]></description>
			<content:encoded><![CDATA[<p>Between a recent Edward Tufte talk in Denver and the Kindle release of Flowing Data&#8217;s new book, my distraction of choice lately has been data visualization. In particular, I&#8217;ve been on the hunt for data about my city. I had an idea for a chart displaying a map of houses in Denver color-coded by year built. Now, this is simple and publicly available data. But it&#8217;s also not that easy to collect in bulk. The city of Denver has <a href="http://denvergov.org/tabid/37889/Default.aspx?link=http://www.denvergov.org/apps/realpropertyapplication/realproperty.asp&#038;title=Real%20Property" onclick="pageTracker._trackPageview('/outgoing/denvergov.org/tabid/37889/Default.aspx?link=http_//www.denvergov.org/apps/realpropertyapplication/realproperty.asp_038_title=Real_20Property&amp;referer=');">an online database of property records</a>, but you have to search by address. You can&#8217;t just download a big table. Also, I don&#8217;t want my map to get cut off at the city limits, especially when what people think of as Denver extends far beyond these limits. Which means I&#8217;d have to figure out how to extract Denver&#8217;s data, and then do the same for every city in the metro area &#8212; assuming they even put their data online. This would be a serious pain.</p>
<p>Besides, someone has already gone through the pain for me: real estate websites. I won&#8217;t say exactly which site I went to because I&#8217;m pretty sure harvesting their data would be considered a terms of use violation. But let&#8217;s just say there&#8217;s a site out there (and there are several, actually) that serves up all kinds of basic, publicly available data about homes, and they make it easy to browse the entire Denver Metro Area from a single starting page. It couldn&#8217;t be more perfect for spidering and data-scraping.</p>
<p>This was my first time building a spider or scraping, but it didn&#8217;t take much searching around to find <a href="http://scrapy.org/" onclick="pageTracker._trackPageview('/outgoing/scrapy.org/?referer=');">Scrapy</a>, a Python framework for doing just this. It&#8217;s a little complicated to start, but they have a <a href="http://doc.scrapy.org/intro/tutorial.html" onclick="pageTracker._trackPageview('/outgoing/doc.scrapy.org/intro/tutorial.html?referer=');">good tutorial</a>, as well as a <a href="http://doc.scrapy.org/topics/shell.html" onclick="pageTracker._trackPageview('/outgoing/doc.scrapy.org/topics/shell.html?referer=');">live command line environment</a> that lets you test out code.</p>
<p>In the end, it worked beautifully. If you want the data I scraped, it&#8217;s here: <a href="http://softwerewolf.com/data/denverproperty" onclick="pageTracker._trackPageview('/outgoing/softwerewolf.com/data/denverproperty?referer=');">Denver Metro Property Data</a></p>
<p>Now if I can just figure out how to call Google&#8217;s GPS-finding service more than 15,000 times a day&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2011/08/scrapy-helps-me-scrape/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Splitter: A split-testing plugin for WordPress</title>
		<link>http://www.softwerewolf.com/2011/07/splitter-a-split-testing-plugin-for-wordpress/</link>
		<comments>http://www.softwerewolf.com/2011/07/splitter-a-split-testing-plugin-for-wordpress/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 17:17:21 +0000</pubDate>
		<dc:creator>Jefff</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Splitter]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[split testing]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.softwerewolf.com/?p=49</guid>
		<description><![CDATA[I built a new little WordPress plugin called Splitter, and I&#8217;m using it to run A/B tests on Truth (plus lies). Its purpose is to show different users slightly different page layouts and report back to Google Analytics who was looking at what. It works by randomly setting a cookie for new visitors and then [...]]]></description>
			<content:encoded><![CDATA[<p>I built a new little WordPress plugin called Splitter, and I&#8217;m using it to run A/B tests on <a href="http://truthpluslies.com" onclick="pageTracker._trackPageview('/outgoing/truthpluslies.com?referer=');">Truth (plus lies)</a>. Its purpose is to show different users slightly different page layouts and report back to Google Analytics who was looking at what. It works by randomly setting a cookie for new visitors and then using JavaScript to show/hide elements based on that cookie. It reports back to Google Analytics by setting a custom variable with the cookie&#8217;s value.</p>
<p><a href='http://www.softwerewolf.com/wp-content/uploads/2011/07/splitter.zip'>Here is the source for the plugin</a>, which is made up of three files &#8212; two JavaScript, one PHP. The PHP file splitter.php defines the plugin, some settings, and inserts JavaScript based on those settings into the header of the page. The JavaScript file splitter.js does the work of actually setting the cookie, modifying the page, and setting the Google Analytics custom variable.</p>
<p>As for trigger_yoast.js &#8212; unfortunately, I ended up coding Splitter to work specifically with <a href="http://yoast.com/wordpress/google-analytics/" onclick="pageTracker._trackPageview('/outgoing/yoast.com/wordpress/google-analytics/?referer=');">Yoast&#8217;s Google Analytics</a> plugin. This was a tricky issue for me to figure out because the custom variable has to be set after the Google Analytics scripts are included but before the pageview event is fired. With a Google Analytics plugin, Splitter&#8217;s JavaScript can&#8217;t run until after the plugin is initialized, but then the plugin has to wait for Splitter to set the variable until it can finish what it&#8217;s doing. Yoast&#8217;s plugin lets us do that by providing the &#8220;Where should the tracking code be placed&#8221; and &#8220;Custom Code&#8221; settings. If the first is set to &#8220;Insert manually&#8221;, then it&#8217;s up to me to trigger the pageview event, so I added a footer action in splitter.php to do that. Then I set the &#8220;Custom Code&#8221; to call the function in splitter.js &#8212; gaVariable() &#8212; that sets the custom variable.</p>
<p>I used this to explore whether a couple of the widgets I&#8217;ve got in the sidebar of <em>Truth (plus lies)</em> were worth their real estate. The first was the tag cloud. I decided that the goal of my tag cloud was to encourage visitors to explore the most common topics on my blog, so if it was successful, the tag cloud would be driving down the bounce rate.</p>
<p>In my Splitter settings, I created state A, which showed the tag cloud widget, and state B, where it was hidden. The element is defined by a CSS selector. I defined my cookie name as &#8216;tagcloud&#8217; and my two states as &#8216;yes&#8217; and &#8216;no&#8217;. With this information, I created two custom segments in Google Analytics that matched for the custom variable name and values, which are the same as in the cookie. Then I applied my segments and checked out the Bounce Rate report for the home page of my blog. (The home page is the only page that had the tag cloud.) Here were my results:</p>
<p><img src="http://www.softwerewolf.com/wp-content/uploads/2011/05/tagcloud-notagcloud.png" alt="Google Analytics Report" title="tagcloud-notagcloud" width="540" height="144" class="aligncenter size-full wp-image-50" /></p>
<p>The total bounce rates were: 60.53% total, 68.18% with the tag cloud, and 53.33% with no tag cloud. So, a definite win for removing the tag cloud, right? Not necessarily. Here&#8217;s where I&#8217;m a total beginner at A/B testing. These results were for just 65 total pageviews &#8212; 40 with the tag cloud and 24 without. (I don&#8217;t know where the 65th one went.) This leads me into the biggest A/B testing trap, <a href="http://www.cennydd.co.uk/2009/statistical-significance-other-ab-test-pitfalls/" onclick="pageTracker._trackPageview('/outgoing/www.cennydd.co.uk/2009/statistical-significance-other-ab-test-pitfalls/?referer=');">statistical significance</a>. Crazy things can happen by chance, so it&#8217;s important to be rigorous about making sure your test results actually say something useful about your design.</p>
<p>The home page of <em>Truth (plus lies)</em> doesn&#8217;t get too many hits. Most of the traffic goes to single post pages, so I decided to end my split test without a strong conclusion. I did go ahead and remove the tag cloud though. Not only did my aborted test show no advantage, but some click tracking I was doing at the same time showed that no one ever clicked the tag cloud.</p>
<p>Before doing my second test, I improved Splitter by automatically turning my A/B tests into A/B/A tests. That is, when you create to states to test, the plugin will create a third &#8220;control&#8221; state that is a copy of the A state. The control state is tracked separately, so in Google Analytics, you&#8217;ve got three segments to look at. But now you know that two of these segments should be producing pretty much the same results and that any difference between them is pure chance. Which is helpful when you&#8217;re trying to decide if a difference between states A and B is significant.</p>
<p>Armed with this new feature, I set up a test that either shows or hides the &#8220;About Me&#8221; widget in <em>Truth (plus lies)</em>&#8216;s sidebar. Actually, the test&#8217;s still going, and it&#8217;s been going for over a month. Here are the current results in Google Analytics:</p>
<p><img src="http://www.softwerewolf.com/wp-content/uploads/2011/07/aboutbox-noaboutbox.png" alt="Google Analytics Report" title="aboutbox-noaboutbox" width="540" height="366" class="aligncenter size-full wp-image-58" /></p>
<p>Still ambiguous! There&#8217;s a slight advantage for the &#8220;With&#8221; states. But for bounce rate, the difference between &#8220;With About Box&#8221; and &#8220;With About Box (Control)&#8221; is bigger than the difference between the control state and &#8220;No About Box&#8221;. A little clearer are the numbers for &#8220;Pages/Visit&#8221; and &#8220;Avg. Time on Site&#8221;. Both show &#8220;With&#8221; and &#8220;Control&#8221; close together and doing better than &#8220;No About Box&#8221;.</p>
<p>But only slightly. More than anything, my tests show me that the presence of both these widgets doesn&#8217;t make much difference to the users.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwerewolf.com/2011/07/splitter-a-split-testing-plugin-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

