<?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>T=Machine</title>
	<atom:link href="http://t-machine.org/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://t-machine.org</link>
	<description>Internet Gaming, Computer Games, Technology, MMO, and Web 2.0</description>
	<lastBuildDate>Wed, 09 May 2012 18:31:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Warning: OS X Lion downloads gigabytes of data, secretly</title>
		<link>http://t-machine.org/index.php/2012/05/09/warning-os-x-lion-downloads-gigabytes-of-data-secretly/</link>
		<comments>http://t-machine.org/index.php/2012/05/09/warning-os-x-lion-downloads-gigabytes-of-data-secretly/#comments</comments>
		<pubDate>Wed, 09 May 2012 18:31:50 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1901</guid>
		<description><![CDATA[When you &#8220;upgrade&#8221; to Lion, be aware that Apple will silently wipe your &#8220;auto install / update&#8221; settings, and start aggressively downloading every update it can find for every Apple app you use. In my case, this was gigabytes of data &#8211; I really don&#8217;t care (and don&#8217;t want) &#8220;upgrades&#8221; to PhotoBooth and other trash [...]]]></description>
			<content:encoded><![CDATA[<p>When you &#8220;upgrade&#8221; to Lion, be aware that Apple will silently wipe your &#8220;auto install / update&#8221; settings, and start aggressively downloading every update it can find for every Apple app you use.</p>
<p>In my case, this was gigabytes of data &#8211; I really don&#8217;t care (and don&#8217;t want) &#8220;upgrades&#8221; to PhotoBooth and other trash that Apple pre-installs. But, because Apple wants to force these on you, they&#8217;d already wasted large amounts of bandwidth (on my laptop &#8211; on a desktop broadband connection, I wouldn&#8217;t care), and reduced my internet browsing for a few days before I found this out.</p>
<p>So &#8230; when you upgrade &#8230; remember to open &#8220;Software Updater&#8221;, and change the setting (that Apple has overwritten), back to &#8220;don&#8217;t check automatically&#8221;. Sadly, there&#8217;s no setting for &#8220;don&#8217;t download stuff unless I tell you to&#8221; &#8211; but at least turning off the auto-check avoids this.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/05/09/warning-os-x-lion-downloads-gigabytes-of-data-secretly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe&#8217;s Updater destroys Mac OS X: trying to remove it, part 1</title>
		<link>http://t-machine.org/index.php/2012/05/06/adobes-updater-destroys-mac-os-x-trying-to-remove-it-part-1/</link>
		<comments>http://t-machine.org/index.php/2012/05/06/adobes-updater-destroys-mac-os-x-trying-to-remove-it-part-1/#comments</comments>
		<pubDate>Sun, 06 May 2012 16:44:31 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1898</guid>
		<description><![CDATA[Adobe just doesn&#8217;t seem to get the message: the latest version of Adobe Acrobat Reader puts a NEW virus(*) on your desktop, and all the old methods for removing it &#8230; don&#8217;t work. I previously used this tip from 2010 to remove the virus, while still using the Adobe software installed on my machine, but [...]]]></description>
			<content:encoded><![CDATA[<p>Adobe just doesn&#8217;t seem to get the message: the latest version of Adobe Acrobat Reader puts a NEW virus(*) on your desktop, and all the old methods for removing it &#8230; don&#8217;t work. I previously <a href="http://osxdaily.com/2010/06/21/stop-adobe-update-manager-launching/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://osxdaily.com/2010/06/21/stop-adobe-update-manager-launching/');">used this tip from 2010 to remove the virus, while still using the Adobe software installed on my machine</a>, but it no longer works.</p>
<p>With OS X Lion, I&#8217;m now trying again with a new approach (through trial and error this seems it might work &#8211; but I&#8217;ll update this in a few months if the virus still hasn&#8217;t come back)</p>
<ol>
<li>Open Finder
<li>Search for &#8220;Adobe Updater&#8221;
<li>Should be in an &#8220;Adobe Utilities&#8221; folder (if they had the chutzpah to call it &#8220;Adobe Viruses&#8221; I&#8217;d at least give them some credit for humour and outright shamelessness :))
<li>Delete that app &#8211; move it to Trash
<li>Empty the Trash (just in case it tries to run while hiding in the Trash &#8211; should be impossible, but with the back-door hacks Adobe&#8217;s already doing, you never know&#8230;)
</ol>
<p>(*) Adobe&#8217;s &#8220;Updater&#8221; has so far:</p>
<ol>
<li>crashed my laptop (multiple times)
<li>caused it to overheat to the point of hardware damage (laptop emits a screeching noise &#8211; that&#8217;s the hardware&#8217;s &#8220;emergency shutdown&#8221; warning)
<li>stolen my internet bandwidth when I&#8217;m on 3G modem, costing me money, and preventing me from using my own machine
</ol>
<p>This app cannot be disabled, the web is full of people complaining and begging Adobe to get rid of it, it&#8217;s installed secretly (the user is not informed it exists, let alone asked if they want it), and it has NOTHING TO DO WITH the actual app I installed.</p>
<p>What do you reckon? To me, that sounds closer to a virus than anything else. I don&#8217;t for a moment believe that Adobe is unaware of the amount of hatred it instils in their customers&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/05/06/adobes-updater-destroys-mac-os-x-trying-to-remove-it-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WTF is an Archveult?</title>
		<link>http://t-machine.org/index.php/2012/04/26/wtf-is-an-archveult/</link>
		<comments>http://t-machine.org/index.php/2012/04/26/wtf-is-an-archveult/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 12:30:37 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1891</guid>
		<description><![CDATA[One of the peculiar distinctions of Jack Vance&#8217;s writing is that he vomits obscure words onto the page as if he&#8217;d just eaten a dictionary that severely disagreed with him. Sometimes he seems to be parodying his characters &#8211; but other times he happily does it for himself. To be clear: I&#8217;ve never seen him [...]]]></description>
			<content:encoded><![CDATA[<p>One of the peculiar distinctions of Jack Vance&#8217;s writing is that he vomits obscure words onto the page as if he&#8217;d just eaten a dictionary that severely disagreed with him. Sometimes he seems to be parodying his characters &#8211; but other times he happily does it for himself.</p>
<p>To be clear: I&#8217;ve never seen him mis-use or abuse a word. When you know what all the words mean, it&#8217;s a joy to read (although he uses very few words &#8211; preferring to use the exact correct &#8211; single &#8211; word &#8230; than to use 10 more commonly-known words to describe the same thing)</p>
<p>Many of them I know &#8211; although I know that most people don&#8217;t. But at least as many I *don&#8217;t* know &#8211; although I do recognise them as genuine English words.</p>
<p>And then, occasionally, you meet an Archveult. And then it gets interesting.</p>
<p>JustF***ingGoogleIt: <a href="http://www.google.com/search?q=archveult" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.google.com/search?q=archveult');">Google: Archveult</a></p>
<p>The only dictionary hit I could find was an evil bit of SEO that claimed &#8211; in the lies it told Google &#8211; that it held a definition for the word, but actually just provided a page that said: &#8220;I think you mistyped XXXX instead&#8221;.</p>
<p>Next step: commercial, offline, paper dictionaries. <a href="http://oed.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://oed.com');">Real ones</a>, Shakespearean ones, etc.</p>
<p>In the meantime, my best guess &#8211; and this is rather funny if true &#8211; is that it&#8217;s a deliberate portmanteau of &#8220;Archmagician&#8221; and &#8220;La Reyne le Veult&#8221; (the Royal Assent). Because the only story I&#8217;ve found it in so far (where the word is used repeatedly) is about an (almost) all-powerful woman attempting to conquer the universe by turning all men into women.</p>
<p>(and read the story before you get too excited by that)</p>
<p>Filed in &#8220;game design&#8221; because &#8230; well.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/26/wtf-is-an-archveult/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Toshiba&#8217;s &#8220;failed vs. Apple&#8221; marketing</title>
		<link>http://t-machine.org/index.php/2012/04/23/toshibas-failed-vs-apple-marketing/</link>
		<comments>http://t-machine.org/index.php/2012/04/23/toshibas-failed-vs-apple-marketing/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 13:40:54 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[marketing and PR]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1884</guid>
		<description><![CDATA[I feel sorry for Toshiba; they make good products, but their marketing seems to belong to a much smaller, poorer company. Take this advert, from April 2012, when Apple is already far along with shifting their whole laptop lineup to &#8220;ultra thin&#8221; MacBook airs (rumour suggests the non-thin models will continue to be phased out [...]]]></description>
			<content:encoded><![CDATA[<p>I feel sorry for Toshiba; they make good products, but their marketing<br />
seems to belong to a much smaller, poorer company.</p>
<p>Take this advert, from April 2012, when Apple is already far along with shifting their whole laptop lineup to &#8220;ultra thin&#8221; MacBook airs (rumour suggests the non-thin models will continue to be phased out next cycle &#8211; doesn&#8217;t matter so much for this post, but if true, it adds extra emphasis to the post):</p>
<p><img src="http://t-machine.org/wp-content/uploads/toshiba-marketing-photo1.jpg" alt="" title="toshiba-marketing-photo" width="400" height="446" class="alignnone size-full wp-image-1886" /></p>
<p>&#8230;and compare it with Apple&#8217;s photo from the same period:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2012-04-23-at-14.23.21.png" alt="" title="Screen Shot 2012-04-23 at 14.23.21" width="556" height="281" class="alignnone size-full wp-image-1887" /></p>
<h3>Apple&#8217;s problems</h3>
<p>The iPad 3 is considerably heavier and thicker than the iPad 2. This is a pain for users, but for Apple Marketing it&#8217;s a disaster. They&#8217;ve been fighting to prevent people equating &#8220;iPad&#8221; with &#8220;low power, low utility, inferior Laptop&#8221;. The iPad 1 had a fair go, but struggled. The iPad 2 went a long way to achieve it with it&#8217;s ultra slim/light/long battery life.</p>
<p>With other companies (e.g. Google) we&#8217;d assume that Apple did intensive market research on iPad 1 vs iPad 2, and found that weight didn&#8217;t factor into the purchase decision much. Given this is Apple &#8230; I expect it was an internal decision instead. They decided that the sheer awesomeness of the Retina display meant the pain of the weight + thickness would just have to be accepted. Personally, I agree: the Retina makes such a huge difference that it&#8217;s a no-brainer to buy an iPad 3.</p>
<p>(NB: even with the considerable increase in weight, and in battery quality, the iPad 3 has a considerably shorter battery life than previous iterations)</p>
<p>So, what does Apple do?</p>
<h3>It&#8217;s not a bug, it&#8217;s a feature: Apple redefines Reality</h3>
<p>All previous Apple marketing for iPad/iPhone has included side-on photos on the front page. iPad 3 is the first to use an isometric view &#8211; not just on the front page, but *everywhere*.</p>
<p><strong>APPLE LESSON 1: If it&#8217;s bad, hide it.</strong></p>
<p>The photo they use is EXTREMELY poorly positioned. The iPad 3 is contorted, the image is squished by perspective, the flower image looks terrible.</p>
<p>But you won&#8217;t notice any of that (unless you&#8217;re a product-photographer). No, you&#8217;ll notice HOW THIN IT LOOKS!</p>
<p>Apple carefully chose the angle to use perspective to hide the actual width of the product. It&#8217;s just shallow enough an angle to make it appear that you&#8217;re seeing the width &#8211; but just deep enough an angle to hide most of the width. (recall that the iPad 2 and iPad 3 both have a very deep bevel on the underside).</p>
<p>Apple also carefully chose the lighting: white iPad 3, ultra bright lights (my gut feel is these are even brighter than normal in Apple ads, which is very bright to start with), even the photo of a delicate thin flower (see what they did there?) is itself over-exposed a little. The iPad itself seems to almost &#8230; disappear &#8230; on the advert.</p>
<p><strong>APPLE LESSON 2: If it&#8217;s really bad, make a photo that lies.</strong></p>
<h3>Toshiba: Fat, dark, and ugly</h3>
<p>Let&#8217;s revisit Toshiba&#8217;s photo:</p>
<p><img src="https://t-machine.org/wp-content/uploads/toshiba-marketing-photo1.jpg" alt="" title="toshiba-marketing-photo" width="400" height="446" class="alignnone size-full wp-image-1886" /></p>
<ol>
<li>the angle TRIPLES the width of the lid
<li>the angle DOUBLES the width of the base (look at the extreme bottom right edge &#8211; the base appears to mirror around the white hilight stripe)
<li>the inside is DARK, with HEAVY, THICK, DIRTY lighting
<li>the shadow underneath the laptop is ALMOST AS THICK AS the laptop itself, and coloured DARK BLACK
</ol>
<p>OK, so I could forgive poor colour scheme &#8211; marketing had no choice in that.</p>
<p>You could (maybe) forgive the stupid choice of perspective &#8211; maybe the laptop just looks ugly at any other angle. Or maybe they &#8220;needed&#8221; to show the ports on the side (if so, they failed: the lighting is so bad you can&#8217;t see the important ones).</p>
<p>But &#8230; who in Toshiba Marketing approved a photo with a black shadow underneath that makes their &#8220;thin&#8221; laptop look considerably thicker than it is? There&#8217;s no excuse for this: it&#8217;s a terrible photo (should have been rejected during the photo-shoot) &#8211; but it&#8217;s a catastrophically bad piece of marketing.</p>
<p><strong>TOSHIBA LESSON 1: ?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/23/toshibas-failed-vs-apple-marketing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Concepts of &#8220;object identity&#8221; in game programming&#8230;</title>
		<link>http://t-machine.org/index.php/2012/04/19/concepts-of-object-identity-in-game-programming/</link>
		<comments>http://t-machine.org/index.php/2012/04/19/concepts-of-object-identity-in-game-programming/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 15:01:01 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[entity systems]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[network programming]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1879</guid>
		<description><![CDATA[Hume just posted his Lessons Learned from the warmup for Ludum Dare 23 (48 hours to write a game from scratch &#8211; starts this weekend!) &#8211; and his positive experience using an Entity System. In his epic comment (sparked by a different Adam &#8211; not me, honest), is this gem: &#8220;Using the entity system for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://humespeaks.tumblr.com/post/21273251357/ludum-dare-dry-run-lessons-learned" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://humespeaks.tumblr.com/post/21273251357/ludum-dare-dry-run-lessons-learned');">Hume just posted his Lessons Learned</a> from the warmup for <a href="http://www.ludumdare.com/compo/about-ludum-dare/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.ludumdare.com/compo/about-ludum-dare/');">Ludum Dare 23</a> (48 hours to write a game from scratch &#8211; starts this weekend!) &#8211; and his positive experience using an Entity System.</p>
<p>In his epic comment (sparked by a different Adam &#8211; not me, honest), is this gem:</p>
<blockquote><p>
&#8220;Using the entity system for the first time was unreal to me.  It&#8217;s like polymorphic code.  I did really weird things on the fly. For example:</p>
<p>- In the health processor, if the enemy was just destroyed, set a flag in the lifecycle component.<br />
- In the lifecycle processor, if the fresh kill flag is set, extract its loot component and put that into a new entity with a small randomized velocity component and a gravity component so that the loot drops; then, remove most of the other components from the entity and add an explosion component. </p>
<p>The &#8220;enemy&#8221; still has the same entity ID &#8212; <strong>any other components that are looking for that entity will still find it (e.g. missiles homing in on the wreckage, or score processors looking for slain entities)</strong> &#8212; but by swapping one set of data with another, its implementation has changed from an enemy to some kind of non-interactive effect object.&#8221;</p>
<p><strong>(emphasis mine)</strong>
</p></blockquote>
<p>Identity. It&#8217;s important.</p>
<p>(Quick sidenote: for all the people asking questions like &#8220;but &#8230; which variables do I put in Component A as opposed to Component B? How do I manage Events in an Entity System? &#8230; etc&#8221; &#8211; Hume&#8217;s approach above is a good concrete example of the first-draft, easy-to-write way of doing things. Copy it.)</p>
<h3>Identity in games</h3>
<p>This is one of those things that newbie game programmers seem to underestimate, frequently.</p>
<p>And when I say &#8220;newbie&#8221; I include &#8220;experienced, skilled programmers with 10+ years of coding experience &#8211; but who haven&#8217;t yet shipped a game of their *own*&#8221;.</p>
<p>(e.g. I&#8217;ve seen a couple of studios that started as Digital Agencies, or as Animation Studios, etc &#8211; that then transitioned to writing their own games. This is the kind of thing that they often struggle with. Not for lack of skill or general programming experience, but for lack of the domain-specific experience of game coding)</p>
<p>Examples of Identity in games, off the top of my head &#8211; <em>all of these are independent, and interact in complex ways with each other</em> :</p>
<ol>
<li>Game-role: e.g. &#8230; &#8220;enemy&#8221;, &#8220;powerup&#8221;, &#8220;start location&#8221;
<li>Code &#8216;object&#8217; (in OOP terms): e.g. &#8230; &#8220;the sprite you are drawing at position (4,5) is part of Object X. X is coloured THIS colour&#8221;
<li>Gameplay &#8216;object&#8217;: e.g. &#8230; &#8220;the sprite at (4,5) represents a Tank. If a Tank sprite ever touches a Glass sprite, we need to play the Broken Glass noise&#8221;
<li>Physics element: e.g. &#8230; &#8220;5 milliseconds ago, our Physics Engine thought this thing was THERE. Now it&#8217;s over HERE. Don&#8217;t confuse the Physics Engine! Make sure it &#8216;knows&#8217; they are the same object &#8211; not two separate objects&#8221;
<li>Network &#8220;master/clone&#8221;: e.g. &#8230; in multiplayer, there are N copies of my avatar: one per computer in the game. One of those N is the original &#8211; and changes to the original are constantly used to overwrite the clones; changes to clones are LOCAL ONLY and are discarded. Which is original? What do we do with incoming &#8220;changes&#8221; &#8211; which local Code Object do we apply them to? (your Code Object will be different from my Code Object &#8211; but they&#8217;ll both be the same identical Network Object, save mine is flagged &#8220;clone&#8221;)
<li>Proper Noun object: e.g. &#8230; &#8220;The Player&#8217;s Tank&#8221; is a very specific tank out of all the Tanks in the game. Many lines of game code don&#8217;t care about anything except finding and operating on that specific tank.
<li>Game-Over representation: e.g. &#8230; after the player has killed all the enemies, and they see a Game Over (won/lost/etc) screen, and you want to list all the enemies they killed &#8230; how do you do that? The enemies &#8211; by definition &#8211; no longer exist. They got killed, removed from the screen, removed from memory. You could store just the absolute numbers &#8211; but what if you want to draw them, or replay the death animations?
<li>&#8230;etc
</ol>
<h3>Identity in Entity Systems</h3>
<p>ES&#8217;s traditionally give you a SINGLE concept of Identity: the Entity (usually implemented as a single Integer). Hmm. That sounds worryingly bad, given what I wrote above. One identity cannot &#8211; by definition &#8211; encompass multiple, independent, interrelated identities.</p>
<p>But we&#8217;re being a bit too literal here. ES&#8217;s give you one PRIMARY identity, but they also give you a bunch of SECONDARY identities. So, in practice&#8230;</p>
<h4>Secondary Identities in an ES</h4>
<p>In OOP, the Object is atomic, and the Class is atomic. You cannot &#8220;split&#8221; an Object, nor a Class, without re-defining it (usually: re-compile).</p>
<p>In ES, the Entity is atomic, and the Component is atomic. But the equivalent of an OOP Object &#8211; i.e. &#8220;an Entity plus zero or more Components&#8221; &#8211; is *not* atomic. It can be split.</p>
<p>And from there comes the secondary identities&#8230;</p>
<blockquote><p>
A Primary Identity: e.g. &#8220;The Player&#8217;s Tank&#8221; (specific)<br />
A Primary Identity: e.g. &#8220;a Gun Component&#8221; (generic)</p>
<p>A Secondary Identity: e.g. &#8220;The Gun component &#8230; of the Player&#8217;s Tank Entity&#8221; (specific)
</p></blockquote>
<p>Revisiting my ad-hoc list of Game Identities above, I hope it&#8217;s clear that you can easily re-write most of those in terms of secondary identity.</p>
<p>And &#8211; bonus! &#8211; suddenly the relationships between them start to become (a little) clearer and cleaner. Easier for humans to reason about. Easier *for you to debug*. Easier *for you to design new features*.</p>
<h4>Global Identity vs. Local Identity</h4>
<p>Noticeably, the network-related Identities are still hard to deal with.</p>
<p>On *my* computer, I can&#8217;t reference entities on *your* computer. I cannot store: &#8220;The Gun component &#8230; of YOUR player&#8217;s tank&#8221;, because your &#8220;Player&#8217;s Tank&#8221; only exists in the memory of your computer &#8211; not mine.</p>
<p>There are (trivially) obvious solutions / approaches here, not least: make your Entity integers global. e.g. split the 64bit Integer into 2 32bit Integers: first Integer is the computer that an Entity lives on, the second is the local Entity Integer. Combined, they are a &#8220;global Entity ID&#8221;.</p>
<p>(I&#8217;m grossly over-simplifying there &#8211; if you&#8217;re interested in this, google for &#8220;globally unique identifiers&#8221; &#8211; the problems and solutions have been around for decades. Don&#8217;t re-invent the wheel)</p>
<p>But &#8230; at this point, they also offer you the chance to consider your game&#8217;s network architecture. Are you peer-to-peer, or client-server?</p>
<p>For instance, P2P architectures practically beg for unique Global entity numbers. But C/S architectures can happily live off non-global. For instance:</p>
<ul>
<li>On each client, there are ONLY local Entity numbers
<li>When the client receives data from the server, it generates new, local, Entities
<li>&#8230;and adds a &#8220;ServerGenerated&#8221; component to each one, so it&#8217;s easy to see that they are &#8220;special&#8221; in some ways. That component could hold info like &#8220;the time in milliseconds that we last received an update on this object&#8221; &#8211; which is very useful for doing dead-reckoning, to make your remote objects appear to move smoothly on the local screen
<li>The server *does* partition all entities from all machines. But none of the clients need to know that
</ul>
<p>Or, to take it further, if your network arch is any good at all for high-paced gaming:</p>
<ul>
<li>The server differentiates between:
<ol>
<li>The entity that the game-rules are operating on
<li>The entity that client 1 *believes* is current
<li>&#8230;ditto for client 2, client 3 &#8230; etc (each has their own one)
<li>The entity that the game-rules accept (e.g. if a hacked client has injected false info, the game-rules may override / rewrite some data in the local object)
</ol>
<li>The server also tags all the entities for a single in-game object as being &#8220;perspectives on the same thing&#8221;, so that it can keep them in synch with each other
<li>The server does Clever Stuff, e.g.:
<ul>
<li>Every 2 milliseconds, it looks at the &#8220;current entity&#8221;, and compares it to the &#8220;client&#8217;s belief of that entity&#8221;. If it finds any differences, it sends a network message to the client, telling it that &#8220;you&#8217;re wrong, my friend: that entity&#8217;s components have changed their data. They are now X, Y and Z&#8221;
</ul>
</ul>
<p>&#8230; or something like that. Again, I&#8217;m grossly over-simplifying &#8211; if you want to write decent network code, Google is your friend. But the fastest / lowest latency multiplayer code tends to work something like that.</p>
<h4>How?</h4>
<p>Ah, well.</p>
<p>What do you think?</p>
<p>(hint: you can do wonders using Reflection/Introspection on your entity / components. By their nature, they&#8217;re easy to write generic code for.</p>
<p>But you WILL need some extra metadata &#8211; to the extent that you may wish to &#8216;upgrade&#8217; your Entity System into a SuperEntity System &#8211; something with a bit more expressive power, to handle the concept of multiple simultaneous *different* versions of the same Entity. Ouch)</p>
<p>Yeah, I&#8217;m bailing on you here. Too little time to write much right now &#8211; and it&#8217;s been a *long* time since I&#8217;ve implemented this level of network code for an ES. So, I&#8217;m going to have to think hard about it, refresh my memory, re-think what I think I knew. Will take some time&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/19/concepts-of-object-identity-in-game-programming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google interview questions: beware the Interviewer</title>
		<link>http://t-machine.org/index.php/2012/04/19/google-interview-questions-beware-the-interviewer/</link>
		<comments>http://t-machine.org/index.php/2012/04/19/google-interview-questions-beware-the-interviewer/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 13:10:30 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Google? Doh!]]></category>
		<category><![CDATA[recruiting]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1876</guid>
		<description><![CDATA[This is from 4 years ago, courtesy of Steve Yegge. I just came across it by accident, it&#8217;s wonderfully well written, but one bit caught my attention in particular: &#8220;First, you can&#8217;t tell interviewers what&#8217;s important. Not at any company. Not unless they&#8217;re specifically asking you for advice.&#8221; Wait &#8211; what? &#8230; why not? Surely [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://steve-yegge.blogspot.co.uk/2008/03/get-that-job-at-google.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://steve-yegge.blogspot.co.uk/2008/03/get-that-job-at-google.html');">This is from 4 years ago, courtesy of Steve Yegge</a>. I just came across it by accident, it&#8217;s wonderfully well written, but one bit caught my attention in particular:</p>
<blockquote><p>
&#8220;First, you can&#8217;t tell interviewers what&#8217;s important. Not at any company. Not unless they&#8217;re specifically asking you for advice.&#8221;
</p></blockquote>
<p>Wait &#8211; what? &#8230; why not? Surely &#8211; if you&#8217;re being an honest candidate &#8211; your views on what&#8217;s important are a huge part of the interview process? These people want to know what you&#8217;ll be like as a colleague, how you tick &#8211; no?</p>
<blockquote><p>
&#8220;You have a very narrow window of perhaps one year after an engineer graduates from college to inculcate them in the art of interviewing, after which the window closes and they believe they are a &#8220;good interviewer&#8221; and they don&#8217;t need to change their questions, their question styles, their interviewing style, or their feedback style, ever again.&#8221;
</p></blockquote>
<p>Ah. Right. Yes, makes sense now. Sad, but true.</p>
<p>I will also add: for all the reasons Steve cited, I *do not run interviews this way*, and haven&#8217;t for a long time now. In my late twenties, I learnt the hard way how stupid a lot of those practices are.</p>
<p>Looking back at my sole Google interview, it explains a lot: I had no idea that Google accepted / allowed these practices among their interviewers &#8211; I&#8217;d assumed they&#8217;d have actively stamped them out. Apparently not. It was a big part of why I never considered Google again: if &#8220;A people hire A people&#8221; and &#8220;B people hire C people&#8221;, that part of Google&#8217;s process stank of the B people. Not a place I wanted to work&#8230;</p>
<p>Of course, Steve&#8217;s still writing about Google&#8217;s hiring, and his criticisms seem to be getting sharper over time. Just last year, he <a href="http://steve-yegge.blogspot.co.uk/2011/07/hacker-news-fires-steve-yegge.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://steve-yegge.blogspot.co.uk/2011/07/hacker-news-fires-steve-yegge.html');">dropped this into a post</a>:</p>
<blockquote><p>
&#8220;It&#8217;s a match made in heaven, I&#8217;m tellin&#8217; ya. It might take you a couple tries to get in the door, because Google&#8217;s interview process &#8212; what&#8217;s the word I&#8217;m looking for here &#8212; ah yes, their process sucks at letting in all the qualified people. They&#8217;re trying to get better at it, but it&#8217;s not really Google&#8217;s fault so much as the fault of interviewers who insist that you&#8217;re not qualified to work there unless you are exactly like them.&#8221;
</p></blockquote>
<p>So &#8230; given Steve&#8217;s one-man crusade to undo the bad work of Google HR, I&#8217;d recommend anyone rejected by Google to give them another go. But don&#8217;t look at interview prep questions, don&#8217;t brush up on obscure programming technique &#8211; just read and re-read Steve&#8217;s blog posts, and remind yourself that it&#8217;s &#8220;a stupid process&#8221; you&#8217;re trying to get past, one that doesn&#8217;t fairly represent the company &#8211; nor the colleagues &#8211; you&#8217;ll be working for.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/19/google-interview-questions-beware-the-interviewer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warning: before you install OS X lion</title>
		<link>http://t-machine.org/index.php/2012/04/18/warning-before-you-install-os-x-lion/</link>
		<comments>http://t-machine.org/index.php/2012/04/18/warning-before-you-install-os-x-lion/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 20:30:55 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1872</guid>
		<description><![CDATA[&#8230; It removes one of the most valuable features of OS X for laptop owners: OS x lion WILL NOT recharge a plugged-in iPhone when the lid is closed (after 10 seconds of pretending to charge &#8211; just long enough to fool you &#8211; Apple cuts the power) At conferences, on sales trips, on plane [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; It removes one of the most valuable features of OS X for laptop owners:</p>
<blockquote><p>
 OS x lion WILL NOT recharge a plugged-in iPhone when the lid is closed (after 10 seconds of pretending to charge &#8211; just long enough to fool you &#8211; Apple cuts the power)
</p></blockquote>
<p>At conferences, on sales trips, on plane trips &#8230; I have relied on this feature many many times to recharge a phone off the laptop battery.</p>
<p>Now?</p>
<p>Denied.</p>
<p>No user setting for it (that I can find so far) just &#8230; Removed :(</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/18/warning-before-you-install-os-x-lion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Games QA job in Brighton UK</title>
		<link>http://t-machine.org/index.php/2012/04/17/games-qa-job-in-brighton-uk/</link>
		<comments>http://t-machine.org/index.php/2012/04/17/games-qa-job-in-brighton-uk/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 12:24:15 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games industry]]></category>
		<category><![CDATA[recruiting]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1870</guid>
		<description><![CDATA[No link provided, but should be easy to find the studio email HR address: &#8220;Hi All, I&#8217;m looking for a QA person to join us at Zoe Mode. I need someone with experience as I need QA for multiple titles of different genres. A sense of rhythm will help. Please pass this on, thx.&#8221; Alys [...]]]></description>
			<content:encoded><![CDATA[<p>No link provided, but should be easy to find the studio email HR address:</p>
<blockquote><p>
&#8220;Hi All, I&#8217;m looking for a QA person to join us at Zoe Mode. I need someone with experience as I need QA for multiple titles of different genres. A sense of rhythm will help. Please pass this on, thx.&#8221;
</p></blockquote>
<p>Alys is a good person to work with.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/17/games-qa-job-in-brighton-uk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple OS X install hell: way worse than Windows :(</title>
		<link>http://t-machine.org/index.php/2012/04/14/apple-os-x-install-hell-way-worse-than-windows/</link>
		<comments>http://t-machine.org/index.php/2012/04/14/apple-os-x-install-hell-way-worse-than-windows/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 11:56:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Web 0.1]]></category>
		<category><![CDATA[bitching]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1862</guid>
		<description><![CDATA[Almost a year after Apple&#8217;s disastrous &#8220;force consumers to download Lion, instead of installing from DVD&#8221;, apparently it still doesn&#8217;t work. It&#8217;s hard to recommend OS X to anyone after this experience. UPDATE 2: Apple&#8217;s &#8220;download a file from the internet&#8221; code is so bad it&#8217;s causing the MacBook to overheat &#8211; 80 degrees celsius, [...]]]></description>
			<content:encoded><![CDATA[<p>Almost a year after Apple&#8217;s disastrous &#8220;force consumers to download Lion, instead of installing from DVD&#8221;, apparently it still doesn&#8217;t work. It&#8217;s hard to recommend OS X to anyone after this experience.</p>
<p>UPDATE 2: Apple&#8217;s &#8220;download a file from the internet&#8221; code is so bad it&#8217;s causing the MacBook to overheat &#8211; 80 degrees celsius, very close to the &#8220;automatically reboot&#8221; temperature. This is *to download a file*. Apple&#8217;s misuse / misunderstanding of web technologies seems quite incredible.</p>
<p>(the process is called &#8220;storeagent&#8221;)</p>
<p>My last 24 hours:</p>
<ol>
<li>Buy Lion
<li>Download starts
<li>&#8230;it&#8217;s a 4gb download, this takes a long time&#8230;
<li>Download stops at 25% for no reason.
<li>Resume button gives a wait cursor for 5 seconds, then goes back to &#8220;paused&#8221;
<li>Repeat twice
<li>Third time, the Resume button is disabled, and now Lion is stuck in &#8220;Waiting&#8221; and there&#8217;s no buttons you can press except &#8220;cancel&#8221;
<li>&#8230;
<li>Remains in &#8220;waiting&#8221; for many hours. Googling suggests this is a permanent crash in Apple&#8217;s App Store.
<li>Cancel the download, re click the &#8220;buy app&#8221; link
<li>Apple quits OS X, kills all apps, deletes all unsaved data, throws me out to the login screen
<li>Login again, and Lion icon has appeared in the dock.
<li>&#8230;but: Lion now refuses to even start downloading &#8211; it&#8217;s stuck on &#8220;Paused, 0 of 0 bytes&#8221;
</ol>
<p>UPDATE:</p>
<ol>
<li>Try again (delete OS X Lion, re-purchase from App Store) and &#8230; finally the download starts. Waiting now to see if it will complete this time, instead of giving up partway like before&#8230;
</ol>
<p>I.e. Apple&#8217;s infrastructure is still blocking me from downloading the OS. How hard can it be to *download a file* ?</p>
<p>Next step: walk in to an apple store and ask them to give me a USB stick, since their webserver is FUBAR.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/14/apple-os-x-install-hell-way-worse-than-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hitler meets George RR Martin</title>
		<link>http://t-machine.org/index.php/2012/04/13/hitler-meets-george-rr-martin/</link>
		<comments>http://t-machine.org/index.php/2012/04/13/hitler-meets-george-rr-martin/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 00:42:44 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1860</guid>
		<description><![CDATA[Third Reich vs. Game of Thrones &#8230; one of the best Downfall mashups I&#8217;ve seen (particularly like the timing on &#8220;Headless&#8221;) http://www.youtube.com/watch?feature=fvwp&#038;v=1kLSYTHQbm4&#038;NR=1]]></description>
			<content:encoded><![CDATA[<p>Third Reich vs. Game of Thrones &#8230; one of the best Downfall mashups I&#8217;ve seen (particularly like the timing on &#8220;Headless&#8221;)</p>
<p><a href="http://www.youtube.com/watch?feature=fvwp&#038;v=1kLSYTHQbm4&#038;NR=1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.youtube.com/watch?feature=fvwp&#038;v=1kLSYTHQbm4&#038;NR=1');">http://www.youtube.com/watch?feature=fvwp&#038;v=1kLSYTHQbm4&#038;NR=1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/13/hitler-meets-george-rr-martin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Great explanation of &#8220;disruption&#8221; &#8211; and why investors dislike startups that meet expectations</title>
		<link>http://t-machine.org/index.php/2012/04/06/great-explanation-of-disruption-and-why-investors-dislike-startups-that-meet-expectations/</link>
		<comments>http://t-machine.org/index.php/2012/04/06/great-explanation-of-disruption-and-why-investors-dislike-startups-that-meet-expectations/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 11:06:51 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[investors]]></category>
		<category><![CDATA[startup advice]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1856</guid>
		<description><![CDATA[&#8220;Disruption&#8221; used to be mentioned frequently as the thing that every company wanted to be (urged on by investors). But what is it, really? I&#8217;ve met lots of people who believe it&#8217;s &#8220;a fancy word for &#8216;innovation&#8217;&#8221; &#8211; but if that&#8217;s all, it would be pretty pointless and vapid. This post from 2011 gives a [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Disruption&#8221; used to be mentioned frequently as the thing that every company wanted to be (urged on by investors).</p>
<p>But what is it, really? I&#8217;ve met lots of people who believe it&#8217;s &#8220;a fancy word for &#8216;innovation&#8217;&#8221; &#8211; but if that&#8217;s all, it would be pretty pointless and vapid.</p>
<p><a href="http://blog.intercom.io/to-sustain-or-disrupt/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.intercom.io/to-sustain-or-disrupt/');">This post from 2011</a> gives a great explanation based on simple concrete ideas. It explains why disruption is interesting to companies and managers.</p>
<h3>What about investors?</h3>
<p>It&#8217;s a great explanation, although it&#8217;s mostly from the perspective of business owners / management. Why do investors &#8211; especially startup / VC investors &#8211; care about disruption?</p>
<p>The key here is Des&#8217;s paragraph about share price:</p>
<blockquote><p>
&#8220;Microsoft’s share price hasn’t moved. This is because they are precisely predictable. Their shareholders have gotten exactly what they paid for, and not a penny more.&#8221;
</p></blockquote>
<p>A share price that doesn&#8217;t move *still provides profit to shareholders* (in the form of annual dividend). In fact, it often provides rather a nice sum of money &#8211; just like the rental income from owning property).</p>
<p>&#8230;but: Angel/VC investors make the bulk of their profit from changes in the share-price, not from dividends. Two reasons:</p>
<ol>
<li>Startups usually choose NOT to pay dividends &#8211; the money is reinvested into the company instead, to try and grow even bigger, even faster (pour gasoline on the fire of your success, make it burn faster!)
<li>The returns from dividends are &#8211; like rent on property &#8211; a small fraction of the investment. The returns from the share-price changing are &#8211; like betting on a horse-race &#8211; a substantial multiple of the investment
</ol>
<p>If you run your startup perfectly &#8230;</p>
<p>If you do everything you said you would do &#8230;</p>
<p>If nothing goes wrong &#8230;</p>
<p>&#8230; your investors may class you a failure. And they&#8217;d be right to do so. They didn&#8217;t invest for the dividends, they invested for the &#8220;surprise me&#8221; factor.</p>
<p>(which should, perhaps, give you pause for thought: if they&#8217;re &#8220;right&#8221; to pan you for achieving your aims &#8230; are/were you &#8220;right&#8221; to take their investment?)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/06/great-explanation-of-disruption-and-why-investors-dislike-startups-that-meet-expectations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entity Systems: integrating Box2D with Artemis</title>
		<link>http://t-machine.org/index.php/2012/04/03/entity-systems-integrating-box2d-with-artemis/</link>
		<comments>http://t-machine.org/index.php/2012/04/03/entity-systems-integrating-box2d-with-artemis/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 09:25:48 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[MMOG development]]></category>
		<category><![CDATA[entity systems]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1854</guid>
		<description><![CDATA[Thanks to Mike Leahy for spotting this: http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/ &#8230;a short blog post (with code) on how a team is integrating Box2D (a very well known open source physics lib) with Artemis (a java implementation of Entity Systems which starts from the same point as my Entity Systems posts, but fleshes it out)]]></description>
			<content:encoded><![CDATA[<p>Thanks to <a href="http://www.typhonrt.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.typhonrt.org/');">Mike Leahy</a> for spotting this:</p>
<p><a href="http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/');">http://blog.gemserk.com/2012/02/02/how-we-use-box2d-with-artemis/</a></p>
<p>&#8230;a short blog post (with code) on how a team is integrating <a href="http://box2d.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://box2d.org/');">Box2D</a> (a very well known open source physics lib) with <a href="http://www.gamadu.com/artemis/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.gamadu.com/artemis/');">Artemis</a> (a java implementation of Entity Systems which starts from the same point as <a href="http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/" >my Entity Systems posts</a>, but fleshes it out)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/04/03/entity-systems-integrating-box2d-with-artemis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Realm of the Mad God &#8211; a great game, interesting monetization</title>
		<link>http://t-machine.org/index.php/2012/03/28/realm-of-the-mad-god-a-great-game-interesting-monetization/</link>
		<comments>http://t-machine.org/index.php/2012/03/28/realm-of-the-mad-god-a-great-game-interesting-monetization/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 20:26:13 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[network programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1851</guid>
		<description><![CDATA[I&#8217;ve recently been playing the excellent Realm of the Mad God &#8211; a very fast-paced 2d co-operative shooter. My feeling is that it&#8217;s going to be one of the most important games of 2011/2012, as it continues to grow in popularity. Typical experience of this game is that within 30 seconds of being dumped into [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently been playing the excellent <a href="http://www.realmofthemadgod.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.realmofthemadgod.com/');">Realm of the Mad God</a> &#8211; a very fast-paced 2d co-operative shooter. My feeling is that it&#8217;s going to be one of the most important games of 2011/2012, as it continues to grow in popularity. Typical experience of this game is that within 30 seconds of being dumped into the main level, you&#8217;re surrounded by monsters, and then surrounded by other players, all on the same screen as you, blasting away in a rainbow of colours.</p>
<p>Sounds good. As if that&#8217;s not enough &#8230; it&#8217;s the guys who&#8217;ve been working with <a href="http://www-cs-students.stanford.edu/~amitp/gameprog.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www-cs-students.stanford.edu/~amitp/gameprog.html');">AmitP (Amit J Patel)</a> (Amit maintains one of the best up-to-date collections of links and algorithms for indie game-developers). If you haven&#8217;t seen Amit&#8217;s pages, I recommend browsing through the blog &#8211; his links collection is OK, but his blog posts on algorithm design are excellent. If you get as far as the posts on &#8220;how I auto-generated a realistic 3D-world&#8221;, you may notice a striking similarity to the 2D worlds used in RotMG &#8230;</p>
<p>Anyway, it parallels an idea for an MMO shooter I&#8217;ve had kicking around for a long, long time. For me, it&#8217;s been a delight to see what works (and doesn&#8217;t) about the core ideas. The RotMG authors have done a great job of making a fast, simple, quick, easy-to-grasp game.</p>
<h3>The Good</h3>
<h4>Fast. No barriers to play</h4>
<p>This is how MMO-shooters should be: fast, furious, permadeath &#8211; but very quick to get back into the fray. You should expect to die tens of times every hour.</p>
<h4>Permadeath &#8211; but paralled with some perma-advancement</h4>
<p>Your progress is split evenly between items (which can be banked) and avatar stats (which are lost forever upon death).</p>
<h4>Perma-advancement increases variety, unlocks new features</h4>
<p>With 10 classes, there&#8217;s plenty of variety &#8211; and each class can only be unlocked by achieving a minimum level of progress with one or more other classes.</p>
<p>NB: this part could be improved and expanded IMHO. In particular, the classes are wonderfully varied &#8211; but merely unlocking classes isn&#8217;t enough these days. Plenty of games have shown that permanent-unlocks work best when there&#8217;s a variety of game-features in there. Also, the classes themselves would work better if there were some cross-effects (c.f. Diablo 2&#8242;s Lord of Destruction expansion, which had abilities in one class improve abilities in your older classes, re-vitalizing them for re-play)</p>
<h4>Free game, paying is optional &#8211; payment kicks in when you&#8217;re most bought-in to the design</h4>
<p>Free players get a tiny storage for permanent items (1/50th of what paying players get &#8211; it&#8217;s not enough! &#8230; so pay!), and are only allowed 1 class &#8220;alive&#8221; at once.</p>
<p>In a delicious twist, if you don&#8217;t pay for the game, the only way to take advantage of a newly-unlocked class is &#8230; to commit suicide &#8230; since you&#8217;re only allowed a single character per account (unless you pay)</p>
<h4>You can ONLY benefit from other players, never suffer</h4>
<p>(there&#8217;s actually a case where you can suffer, sadly &#8211; Thief&#8217;s get killed as a secondary-effect of other players teleporting to them, since the game doesn&#8217;t have a &#8220;prevent people from teleporting to me&#8221; flag)</p>
<p>This is the one that should have most wannabe-MMO-designers sitting up and paying attention. If you group-up with other players:</p>
<ol>
<li>You all get the same experience-points as if you&#8217;d single-handedly killed every monster
<li>You get the points just for being nearby &#8211; no need to score hits just to &#8220;tag&#8221; it for yourself
<li>Mob strength is constant, but player damage is multiplicative on number of players present
</ol>
<p>Net effect:</p>
<blockquote><p>
Every player is willing and eager (*) to collaborate with every other player, without words being exchanged, without fear of being ripped-off.</p>
<p>In a game that&#8217;s fast paced and frantic, you don&#8217;t have to keep pausing to negotiate. Other players can ONLY benefit you, so &#8230; run with them.
</p></blockquote>
<p>(*) &#8211; or just ignores the other players. Their presence doesn&#8217;t provide negative impact on you. It&#8217;s only their absence that is negative (in game-design terms).</p>
<h3>Interesting design choices for lag</h3>
<p>As a real-time game with dozens of players on screen at once, lag is guaranteed to effect gameplay. We&#8217;re always saying &#8220;try to work around lag through game-design changes&#8221;, so here&#8217;s the decisions they made:</p>
<ol>
<li>When packets are lost, everything moves in exactly the same direction it was going, at exactly the same speed, forever
<li>&#8220;Speed&#8221; used above is the &#8220;on-screen speed, including any rubber-banding effect&#8221;
<ul>
<li>FAIL: this means monsters and players often move MANY times faster than they are allowed to &#8211; so that when the lag stops, the side-effects are magnified
</ul>
<li>Your avatar can&#8217;t be hit NOR damaged while it&#8217;s missing packets from the server
<ul>
<li>For the early parts of the game, this *almost* completely fixes lag problems
<li>
</ul>
<li>Projectiles (bullets etc) that your client didn&#8217;t receive are queued up and sent to you all in one go once the packet-dropping stops
<ul>
<li>FAIL: this multiplies the damage output of enemies (NB: not players!), breaking all the designed-in balance in the game
<li>In mid to late game, this ruins the gameplay &#8211; players end up running around never seeing a single enemy, because if you&#8217;re close enough to see it, a single flicker of lag will cause you to receive ZERO damage initially, followed by MORE damage than the monster is capable of &#8211; delivered instantaneously
</ul>
<li>The client is authoritative on player liveness/death
<ul>
<li>MILD FAIL: in effect, coupled with the other features of the game, and the lack of lag compensation &#8230; this means you CAN and SHOULD (and, for some cases, effectively: MUST) cheat. You can run a bot on your machine &#8211; and if the network is less than perfect, you have to, in order to play the game properly.
</ul>
</ol>
<p>Overall, apart from the massive security flaw (where anyone could write a bot to be invulnerable &#8211; and the developers are encouraging them to do so), it seems very close to a good solution for an MMO shooter.</p>
<p>I&#8217;m surprised by the way they approached the &#8220;save up the enemy bullets, then unleash them all at once&#8221;. My guess is that it wasn&#8217;t designed, it was just an accident: maybe they took a slightly lazy approach to compensating for lag (they don&#8217;t), and the net effect is this. It looks very much like what you get when using TCP for game-data packets (I really hope they&#8217;re not using TCP; if so, most of the lag is the developers&#8217; own fault)</p>
<h3>The Bad</h3>
<p>I&#8217;ve unlocked half the classes, and looked at what classes other people play (and which classes rise high on the leaderboards). There&#8217;s good variety, and almost all the classes get used &#8211; even the beginning class, the one you get for free, works well.</p>
<p>Except one.</p>
<p>Unfortunately, at around 50% through unlocking the special classes, one of the classes is horribly unbalanced. The Assassin (which is supposedly an upgraded Thief &#8211; but is a massive downgrade) is almost impossible to play. The special ability fails completely when there&#8217;s lag (which is frequent in this game), and the class is the weakest, lowest-range of the lot. Looking around, you rarely see Assassins (I suspect: you only see them when people are desperately trying to upgrade them, to get past this dull and frustrating point in the upgrade tree).</p>
<p>Worse, because the *only* way to unlock the higher level classes is to reach the level cap with this class &#8230; you&#8217;re forced to play it. Over and over again. Watching the bad game-design &#8230; over and over &#8230; and over &#8230; again.</p>
<p>Every time the assassin dies, it&#8217;s like another twist of the knife:</p>
<blockquote><p>
We know you don&#8217;t enjoy this</p>
<p>We know that a mistake in our game design has you stuck here</p>
<p>(and our overall game design makes that &#8220;mistake&#8221; into &#8220;a disaster&#8221;)</p>
<p>We know that this whole process is turning &#8220;a class that wasn&#8217;t much fun&#8221; into &#8220;a class you hate&#8221;</p>
<p>And there&#8217;s nothing you can do about it!
</p></blockquote>
<p>So, single-handedly, it&#8217;s driven me to *not* purchase any game credit. I&#8217;d enjoyed the game enough to that point that I&#8217;d already decided to buy it &#8211; and if this had been on iTunes, I&#8217;d have paid already. But since it&#8217;s not an iPhone/iPad game, and paying for it is a bit more difficult, I hadn&#8217;t made the payment yet.</p>
<p>As it stands, I&#8217;m still playing occasionally, but now it&#8217;s for research rather than for enjoyment, which is a great pity.</p>
<h3>Monetization: money thrown away</h3>
<p>I think the developers are missing an ENORMOUSLY successful way to make money from this game. In fact, it&#8217;s so big, I suspect they could increase their revenues by a substantial multiplier.</p>
<p>With a permadeath game, there really is no need to actually delete the dead character. If the player isn&#8217;t paying, they are forced to kill their character sooner or later to change characters.</p>
<p>Taking a leaf from Flickr&#8217;s book, why not keep ONE single character in storage, with a tempting &#8220;buy now, for goodies *and to have this one returned to you, ready to play*&#8221;?</p>
<p>I&#8217;d set it so that when you change class (if you&#8217;re a free player), only the last character of the PREVIOUS class is retained. If you switch from Warrior to Knight, you can die many times as a Knight, and your Warrior remains on ice. But if you then grow tired of the Knight and switch to a Rogue &#8230; the Warrior is tipped out, and replaced with the last Knight you had.</p>
<p>i.e. you setup the exact flow of decision-making and options and &#8220;safety&#8221; that the player <em>would have had, if only they&#8217;d purchased sooner</em>, and allow them to benefit from it retroactively &#8211; if only they make the decision to pay.</p>
<p>Of course, it&#8217;s a very limited &#8220;retroactively&#8221; &#8211; it&#8217;s a sampler, to let you see the benefits of paying.</p>
<p>(*) &#8211; Flickr&#8217;s early promise was &#8220;upload your photos in highest resolution, you can view them for free &#8211; but only low-res versions. HOWEVER, we keep the high-res versions for you &#8211; forever, for free &#8211; until you decide to purchase a subscription. At which point, not just your new photos, but ALL your photos, become magically available at highest res&#8221;. It was a great way of simultaneously offering a high-value to paying customers, while making non-paying customers feel they weren&#8217;t committing themselves to loss. It reassured a lot of potential customers at a time when Flickr wasn&#8217;t yet famous, and most people weren&#8217;t yet &#8220;hooked&#8221; &#8211; it bridged that gap.</p>
<h3>Analyse this</h3>
<p>So, the interesting question is: how common is this problem?</p>
<p>Are the dev team correlating &#8220;players who pay&#8221; and &#8220;the point at which they pay&#8221;?</p>
<p>More importantly, are they correlating &#8220;players who DON&#8217;T pay&#8221; and &#8220;how their experience differed from the average&#8221;?</p>
<p>The last time I saw an MMO with a level-based kick in the teeth this bad &#8230; was in Tabula Rasa. We had a point where poor signposting by the quest designers meant many players were given quests that were many levels too hard for them, and effectively impossible to do. Those players died over and over and over again in a short time &#8211; and they hated it.</p>
<p>The dev team knew &#8220;you&#8217;re not supposed to do that quest&#8221;, but often they (randomly) gave it to new players as the first quest. I wasn&#8217;t privy to the arguments over whether this needed to be changed (and there were definitely arguments), but I did see the analytics that eventually got produced. They showed an almost perfectly smooth, averaged, graph of player behaviour &#8211; bar a big notch at this particular location. It stuck out like Rudolph&#8217;s nose on a snowy day.</p>
<p>I wonder if there&#8217;s a similar notch in RotMG? For a game that&#8217;s almost *designed* to drive people to rage-quit &#8230; what stats do they see on &#8220;what the last thing was before a player stopped playing forever?&#8221; &#8230; and what stats do they see on &#8220;&#8230;stopped playing for a long time, but eventually came back&#8221;?</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/28/realm-of-the-mad-god-a-great-game-interesting-monetization/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>What google.com would look like &#8230; designed by a GeoCities user</title>
		<link>http://t-machine.org/index.php/2012/03/20/what-google-com-would-look-like-designed-by-a-geocities-user/</link>
		<comments>http://t-machine.org/index.php/2012/03/20/what-google-com-would-look-like-designed-by-a-geocities-user/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 22:32:46 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1849</guid>
		<description><![CDATA[http://wonder-tonic.com/geocitiesizer/content.php?theme=2&#038;music=1&#038;url=google.com (see what I did there? topical music + animated gif combo!)]]></description>
			<content:encoded><![CDATA[<p><a href="http://wonder-tonic.com/geocitiesizer/content.php?theme=2&#038;music=1&#038;url=google.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://wonder-tonic.com/geocitiesizer/content.php?theme=2&#038;music=1&#038;url=google.com');">http://wonder-tonic.com/geocitiesizer/content.php?theme=2&#038;music=1&#038;url=google.com</a></p>
<p>(see what I did there? topical music + animated gif combo!)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/20/what-google-com-would-look-like-designed-by-a-geocities-user/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloud Computing: Google Translate has stopped speaking Chinese, and we can&#8217;t get it back</title>
		<link>http://t-machine.org/index.php/2012/03/20/google-translates-chinese-bizarrely-poor/</link>
		<comments>http://t-machine.org/index.php/2012/03/20/google-translates-chinese-bizarrely-poor/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 23:57:04 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1841</guid>
		<description><![CDATA[Finally, I worked out how to type pinyin on a mac, using only the keyboard. Nǐ hǎo! Only, GoogleTranslate acts like a prick, and pretends it has no idea what you&#8217;re saying. This, Google, is just silly: (for comparison, I tested &#8211; if you hit the &#8220;switch&#8221; button, and type &#8220;Hello&#8221;, you can copy the [...]]]></description>
			<content:encoded><![CDATA[<p>Finally, I worked out how to type pinyin on a mac, using only the keyboard.</p>
<blockquote><p>
Nǐ hǎo!
</p></blockquote>
<p>Only, GoogleTranslate acts like a prick, and pretends it has no idea what you&#8217;re saying. This, Google, is just silly:</p>
<p><img src="https://t-machine.org/wp-content/uploads/Screen-shot-2012-03-19-at-23.54.25.png" alt="" title="Screen shot 2012-03-19 at 23.54.25" width="767" height="324" class="aligncenter size-full wp-image-1842" /></p>
<p>(for comparison, I tested &#8211; if you hit the &#8220;switch&#8221; button, and type &#8220;Hello&#8221;, you can copy the output, hit switch again, and Google still pretends you&#8217;re talking gibberish)</p>
<p>To add insult to injury, if you don&#8217;t manually hit the &#8220;Turn OFF instant translate&#8221;, it keeps manually switching the From language &#8230; to English. Every time you type a letter, it reverts to &#8220;English &#8211;> English&#8221;. HOW MANY WORDS IN ENGLISH EVER USE ACUTE, GRAVE, OR CIRCUMFLEX? Sigh. Not very smart.</p>
<p>Worst bit is &#8230; this was working fine a couple of months ago. Then Google &#8220;rewired it&#8221;, and now it&#8217;s broken. My friends at Google say this (constantly breaking things, never letting the user keep a working version) is &#8220;good&#8221; and &#8220;the future&#8221; because it puts control into Google&#8217;s hands: one version, on all desktops. If this is the future of Cloud Computing, Cloud Computing is dead and buried already&#8230; Version control is not a &#8220;feature&#8221;, it&#8217;s a right.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/20/google-translates-chinese-bizarrely-poor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TCE iPhone Games by Indie (and mainstream) Game Professionals</title>
		<link>http://t-machine.org/index.php/2012/03/19/tce-iphone-games-by-indie-and-mainstream-game-professionals/</link>
		<comments>http://t-machine.org/index.php/2012/03/19/tce-iphone-games-by-indie-and-mainstream-game-professionals/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 12:06:19 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[games publishing]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1839</guid>
		<description><![CDATA[TheChaosEngine &#8211; private forums hangout for games-industry professionals. There&#8217;s an epic thread on there where people post projects they / their team / their employer has published on iPhone. It&#8217;s currently 40 pages long, so I went through and pulled out the links to the iTunes pages for each game. NB: these run the gamut [...]]]></description>
			<content:encoded><![CDATA[<p>TheChaosEngine &#8211; private forums hangout for games-industry professionals. There&#8217;s an epic thread on there where people post projects they / their team / their employer has published on iPhone. It&#8217;s currently 40 pages long, so I went through and pulled out the links to the iTunes pages for each game.</p>
<p>NB: these run the gamut from &#8220;my first iPhone app&#8221; to &#8220;large-team of developers working for multinational publisher&#8221;. Quality here will vary hugely &#8211; YMMV!</p>
<p>Also, interesting to note &#8230; these are listed in order of posting to the forums, so &#8230; as you go down the list, you&#8217;re seeing an evolution over time of personal/indie (and occasionally &#8220;big team / AAA&#8221;) games on the app store.</p>
<h3>TCE games, in first-launched order (earliest first)</h3>
<ol>
<li><a href="http://toucharcade.com/2008/12/12/ivory-tiles-a-unique-iphone-puzzle-game/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://toucharcade.com/2008/12/12/ivory-tiles-a-unique-iphone-puzzle-game/');">http://toucharcade.com/2008/12/12/ivory-tiles-a-unique-iphone-puzzle-game/</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298060143&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298060143&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298060143&#038;mt=8</a>
<li><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=289208006&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=289208006&#038;mt=8');">http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=289208006&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303057162&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303057162&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=303057162&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=305889055&#038;mt=8&#038;s=143441" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=305889055&#038;mt=8&#038;s=143441');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=305889055&#038;mt=8&#038;s=143441</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307740243&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307740243&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307740243&#038;mt=8</a>
<li><a href="http://zenbound.com/itunes" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://zenbound.com/itunes');">http://zenbound.com/itunes</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307117698&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307117698&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307117698&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=311115651&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=311115651&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=311115651&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318996099&#038;mt=8&#038;s=143441" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318996099&#038;mt=8&#038;s=143441');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318996099&#038;mt=8&#038;s=143441</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=317781445&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=317781445&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=317781445&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321510472&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321510472&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321510472&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=323694495&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=323694495&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=323694495&#038;mt=8</a>
<li><a href="http://bit.ly/ifistchaosengine" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/ifistchaosengine');">http://bit.ly/ifistchaosengine</a>
<li><a href="http://appshopper.com/utilities/isundial-2" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://appshopper.com/utilities/isundial-2');">http://appshopper.com/utilities/isundial-2</a>
<li><a href="http://bit.ly/qqq_iphone" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/qqq_iphone');">http://bit.ly/qqq_iphone</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=333962577&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=333962577&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=333962577&#038;mt=8</a>
<li><a href="http://itunes.com/app/Coretex" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.com/app/Coretex');">http://itunes.com/app/Coretex</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334682266&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334682266&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334682266&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334683021&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334683021&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=334683021&#038;mt=8</a>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=335955369&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=335955369&#038;mt=8');">http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=335955369&#038;mt=8</a>
<li><a href="http://tinyurl.com/yc9bpr5" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://tinyurl.com/yc9bpr5');">http://tinyurl.com/yc9bpr5</a>
<li><a href="http://itunes.apple.com/us/app/revz/id352513901?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/revz/id352513901?mt=8');">http://itunes.apple.com/us/app/revz/id352513901?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/fm-2010/id352933624?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/fm-2010/id352933624?mt=8');">http://itunes.apple.com/gb/app/fm-2010/id352933624?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/koan/id366816832?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/koan/id366816832?mt=8');">http://itunes.apple.com/gb/app/koan/id366816832?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/tiki-towers/id298127125?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/tiki-towers/id298127125?mt=8');">http://itunes.apple.com/us/app/tiki-towers/id298127125?mt=8</a>
<li><a href="http://ultrablast.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://ultrablast.net/');">http://ultrablast.net/</a>
<li><a href="http://bit.ly/aurifi_itunes" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/aurifi_itunes');">http://bit.ly/aurifi_itunes</a>
<li><a href="http://itunes.apple.com/gb/app/denki-blocks/id371685186?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/denki-blocks/id371685186?mt=8');">http://itunes.apple.com/gb/app/denki-blocks/id371685186?mt=8</a>
<li><a href="http://bit.ly/yatr_iphone" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/yatr_iphone');">http://bit.ly/yatr_iphone</a>
<li><a href="http://bit.ly/qqq_worldfoot" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/qqq_worldfoot');">http://bit.ly/qqq_worldfoot</a>
<li><a href="http://itunes.apple.com/au/app/gamebook-adventures-2-the/id375065935?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/gamebook-adventures-2-the/id375065935?mt=8');">http://itunes.apple.com/au/app/gamebook-adventures-2-the/id375065935?mt=8</a>
<li><a href="http://itunes.apple.com/app/id356565414?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/id356565414?mt=8');">http://itunes.apple.com/app/id356565414?mt=8</a>
<li><a href="http://itunes.apple.com/app/reckless-racing/id386234787?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/reckless-racing/id386234787?mt=8');">http://itunes.apple.com/app/reckless-racing/id386234787?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/tiltstorm/id392545121?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/tiltstorm/id392545121?mt=8');">http://itunes.apple.com/gb/app/tiltstorm/id392545121?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/awakening-the-dreamless-castle/id386161821?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/awakening-the-dreamless-castle/id386161821?mt=8');">http://itunes.apple.com/us/app/awakening-the-dreamless-castle/id386161821?mt=8</a>
<li><a href="http://itunes.apple.com/au/app/gamebook-adventures-1-an-assassin/id352871101?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/gamebook-adventures-1-an-assassin/id352871101?mt=8');">http://itunes.apple.com/au/app/gamebook-adventures-1-an-assassin/id352871101?mt=8</a>
<li><a href="http://itunes.apple.com/au/app/gamebook-adventures-4-revenant/id395652668?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/gamebook-adventures-4-revenant/id395652668?mt=8');">http://itunes.apple.com/au/app/gamebook-adventures-4-revenant/id395652668?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/cricket-captain-2010/id406333955?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/cricket-captain-2010/id406333955?mt=8');">http://itunes.apple.com/gb/app/cricket-captain-2010/id406333955?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/pocket-frogs/id386644958?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/pocket-frogs/id386644958?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo');">http://itunes.apple.com/us/app/pocket-frogs/id386644958?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo</a>
<li><a href="http://itunes.apple.com/us/app/sky-burger/id311972587?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/sky-burger/id311972587?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo');">http://itunes.apple.com/us/app/sky-burger/id311972587?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo</a>
<li><a href="http://itunes.apple.com/us/app/scoops-ice-cream-fun-for-everyone/id291591378?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/scoops-ice-cream-fun-for-everyone/id291591378?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo');">http://itunes.apple.com/us/app/scoops-ice-cream-fun-for-everyone/id291591378?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo</a>
<li><a href="http://itunes.apple.com/us/app/dizzypad-frog-jump-fun/id357104694?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/dizzypad-frog-jump-fun/id357104694?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo');">http://itunes.apple.com/us/app/dizzypad-frog-jump-fun/id357104694?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo</a>
<li><a href="http://itunes.apple.com/us/app/textropolis/id301643671?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/textropolis/id301643671?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo');">http://itunes.apple.com/us/app/textropolis/id301643671?mt=8&#038;partnerId=30&#038;siteID=0JkCNyaaKoo</a>
<li><a href="http://itunes.apple.com/gb/app/kamicrazy/id299644692?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/kamicrazy/id299644692?mt=8');">http://itunes.apple.com/gb/app/kamicrazy/id299644692?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/bubble-dreams/id400309976?mt=8&#038;ls=1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/bubble-dreams/id400309976?mt=8&#038;ls=1');">http://itunes.apple.com/us/app/bubble-dreams/id400309976?mt=8&#038;ls=1</a>
<li><a href="http://itunes.apple.com/au/app/gamebook-adventures-5-catacombs/id422246290?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/gamebook-adventures-5-catacombs/id422246290?mt=8');">http://itunes.apple.com/au/app/gamebook-adventures-5-catacombs/id422246290?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/family-games/id417601428?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/family-games/id417601428?mt=8');">http://itunes.apple.com/gb/app/family-games/id417601428?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/moving-day/id395714931?mt=8&#038;ign-mpt=uo%3D4" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/moving-day/id395714931?mt=8&#038;ign-mpt=uo%3D4');">http://itunes.apple.com/gb/app/moving-day/id395714931?mt=8&#038;ign-mpt=uo%3D4</a>
<li><a href="http://itunes.apple.com/gb/app/to-fu-the-trials-of-chi/id436987555?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/to-fu-the-trials-of-chi/id436987555?mt=8');">http://itunes.apple.com/gb/app/to-fu-the-trials-of-chi/id436987555?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/bashi-blocks/id441051678?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/bashi-blocks/id441051678?mt=8');">http://itunes.apple.com/gb/app/bashi-blocks/id441051678?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/magnetic-billiards-blueprint/id432152950?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/magnetic-billiards-blueprint/id432152950?mt=8');">http://itunes.apple.com/gb/app/magnetic-billiards-blueprint/id432152950?mt=8</a>
<li><a href="http://itunes.apple.com/au/app/specky-mark-of-the-year/id458244379?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/specky-mark-of-the-year/id458244379?mt=8');">http://itunes.apple.com/au/app/specky-mark-of-the-year/id458244379?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/quarrel-deluxe/id453203047?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/quarrel-deluxe/id453203047?mt=8');">http://itunes.apple.com/gb/app/quarrel-deluxe/id453203047?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/death-at-fairing-point-a-dana/id445507820?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/death-at-fairing-point-a-dana/id445507820?mt=8');">http://itunes.apple.com/us/app/death-at-fairing-point-a-dana/id445507820?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/lap-uranus/id447548601?ls=1&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/lap-uranus/id447548601?ls=1&#038;mt=8');">http://itunes.apple.com/us/app/lap-uranus/id447548601?ls=1&#038;mt=8</a>
<li><a href="http://itunes.apple.com/app/cutesy-the-quest-unicorn/id463920538?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/cutesy-the-quest-unicorn/id463920538?mt=8');">http://itunes.apple.com/app/cutesy-the-quest-unicorn/id463920538?mt=8</a>
<li><a href="http://itunes.apple.com/app/funpark-friends/id444438531?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/funpark-friends/id444438531?mt=8');">http://itunes.apple.com/app/funpark-friends/id444438531?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/myragdoll-3d/id444210353?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/myragdoll-3d/id444210353?mt=8');">http://itunes.apple.com/gb/app/myragdoll-3d/id444210353?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/puzzler-world-2/id465620717?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/puzzler-world-2/id465620717?mt=8');">http://itunes.apple.com/gb/app/puzzler-world-2/id465620717?mt=8</a>
<li><a href="http://itunes.apple.com/app/shark-jug/id473563382" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/shark-jug/id473563382');">http://itunes.apple.com/app/shark-jug/id473563382</a>
<li><a href="http://itunes.apple.com/au/app/mini-motor-racing/id426860241?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/au/app/mini-motor-racing/id426860241?mt=8');">http://itunes.apple.com/au/app/mini-motor-racing/id426860241?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/grabatron/id481309065?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/grabatron/id481309065?mt=8');">http://itunes.apple.com/gb/app/grabatron/id481309065?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/leapin-frogs/id487318065?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/leapin-frogs/id487318065?mt=8');">http://itunes.apple.com/us/app/leapin-frogs/id487318065?mt=8</a>
<li><a href="http://itunes.com/apps/gravityrocks" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.com/apps/gravityrocks');">http://itunes.com/apps/gravityrocks</a>
<li><a href="http://itunes.apple.com/app/puzzle-bonsai/id491318778?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/app/puzzle-bonsai/id491318778?mt=8');">http://itunes.apple.com/app/puzzle-bonsai/id491318778?mt=8</a>
<li><a href="http://bit.ly/lighthousegame" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/lighthousegame');">http://bit.ly/lighthousegame</a>
<li><a href="http://itunes.apple.com/us/app/my-coin-match/id472717295?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/my-coin-match/id472717295?mt=8');">http://itunes.apple.com/us/app/my-coin-match/id472717295?mt=8</a>
<li><a href="http://itunes.apple.com/gb/app/froad/id469021974?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/gb/app/froad/id469021974?mt=8');">http://itunes.apple.com/gb/app/froad/id469021974?mt=8</a>
<li><a href="http://j.mp/EufloriaHD" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://j.mp/EufloriaHD');">http://j.mp/EufloriaHD</a>
<li><a href="http://itunes.apple.com/us/app/end-night-hd/id498102948?ls=1&#038;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/end-night-hd/id498102948?ls=1&#038;mt=8');">http://itunes.apple.com/us/app/end-night-hd/id498102948?ls=1&#038;mt=8</a>
<li><a href="http://smallgreenhill.com/ballonawall/index.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://smallgreenhill.com/ballonawall/index.php');">http://smallgreenhill.com/ballonawall/index.php</a>
<li><a href="http://itunes.apple.com/us/app/rune-raiders/id497702195?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/rune-raiders/id497702195?mt=8');">http://itunes.apple.com/us/app/rune-raiders/id497702195?mt=8</a>
</ol>
<h3>Non-chronological</h3>
<p>These posters didn&#8217;t provide a real iTunes link &#8211; I had to hunt it down on their websites &#8211; so they&#8217;re out of order:</p>
<ol>
<li><a href="http://itunes.apple.com/us/app/ax-raven-elite/id331999733?mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/ax-raven-elite/id331999733?mt=8');">http://itunes.apple.com/us/app/ax-raven-elite/id331999733?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/red-card-rampage" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/red-card-rampage');">http://itunes.apple.com/us/app/red-card-rampage/id388957922?mt=8</a>
<li><a href="http://itunes.apple.com/us/app/wordsnap-contraption/id412453514?mt=8&#038;ls=1" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://itunes.apple.com/us/app/wordsnap-contraption/id412453514?mt=8&#038;ls=1');">http://itunes.apple.com/us/app/wordsnap-contraption/id412453514?mt=8&#038;ls=1</a>
<li><a href="http://bit.ly/zSf5vc" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://bit.ly/zSf5vc');">http://bit.ly/zSf5vc</a>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/19/tce-iphone-games-by-indie-and-mainstream-game-professionals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox Auto-restore (after a crash): Impressive stuff</title>
		<link>http://t-machine.org/index.php/2012/03/19/firefox-auto-restore-after-a-crash-impressive-stuff/</link>
		<comments>http://t-machine.org/index.php/2012/03/19/firefox-auto-restore-after-a-crash-impressive-stuff/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 11:04:49 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1837</guid>
		<description><![CDATA[For a couple of years now, Firefox has had a nifty feature where if it crashes &#8211; for ANY reason &#8211; the next time you run it, it gives you a &#8220;menu&#8221; of the windows you had open, and lets you selectively re-open them. As a bonus, this menu is just a plain window &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>For a couple of years now, Firefox has had a nifty feature where if it crashes &#8211; for ANY reason &#8211; the next time you run it, it gives you a &#8220;menu&#8221; of the windows you had open, and lets you selectively re-open them. As a bonus, this menu is just a plain window &#8211; you can ignore it (if you&#8217;re too busy right now), and open some other windows in parallel.</p>
<p>(even if it&#8217;s not Firefox that crashed &#8211; e.g. a laptop battery ran out, or someone tripped over your power cable &#8211; you still get this window. This is a huge help on OS X, which crashes quite a lot if you&#8217;re running Apple&#8217;s dev tools :))</p>
<p>I&#8217;d wondered a few times &#8220;what happens if it crashes again, before you&#8217;ve selected which things from that menu you want to re-open?&#8221;</p>
<p>I just found out the hard way: actually, it gives you a new menu, where one of the items is &#8230; the previous menu. It nests, all the way down (I had a crash-of-a-crash-of-a-crash &#8211; and I got everything back perfectly. Very useful, too &#8211; one of the deeply nested open windows was an important form I&#8217;d forgotten I&#8217;d not yet sent).</p>
<p>On the downside, if you close Firefox, and re-open it normally, the menu gets blown away &#8211; but that&#8217;s probably to do with the &#8220;five-years-and-counting still unfixed&#8221; bugs in Firefox where &#8220;remember open windows on startup&#8221; doesn&#8217;t work properly (there&#8217;s some epic threads in their bug tracker, many complaints, but no fix yet).</p>
<p>Still, for the most part, this is a very nice approach to application-crashing. One to remember when designing your own document-based applications&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/19/firefox-auto-restore-after-a-crash-impressive-stuff/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entity Systems: what makes good Components? good Entities?</title>
		<link>http://t-machine.org/index.php/2012/03/16/entity-systems-what-makes-good-components-good-entities/</link>
		<comments>http://t-machine.org/index.php/2012/03/16/entity-systems-what-makes-good-components-good-entities/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 16:19:20 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[entity systems]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1832</guid>
		<description><![CDATA[In the ongoing, epic comments (300+ and counting!) for my Entity Systems posts, one of the recurring questions is: What makes a good Component? How should I split my conceptual model into Entities and Components? How should I split my algorithms and methods into Systems? It&#8217;s often difficult to answer these questions without concrete examples, [...]]]></description>
			<content:encoded><![CDATA[<p>In the ongoing, epic comments (300+ and counting!) for my Entity Systems posts, one of the recurring questions is:</p>
<blockquote><p>
What makes a good Component?<br />
How should I split my conceptual model into Entities and Components?<br />
How should I split my algorithms and methods into Systems?
</p></blockquote>
<p>It&#8217;s often difficult to answer these questions without concrete examples, which are thin on the ground.</p>
<p>Good news, then&#8230;</p>
<p><a href="http://paulgestwicki.blogspot.com/2010/06/entity-system-vs-oo-game-engine.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://paulgestwicki.blogspot.com/2010/06/entity-system-vs-oo-game-engine.html');">Paul Gestwicki runs a CS315: Game Programming course</a>, and last year his students used an Entity System to implement <a href="https://sites.google.com/site/morgansraidgame/" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://sites.google.com/site/morgansraidgame/');">their game &#8211; Morgan&#8217;s Raid</a>. In a recent email conversation, he mentioned he&#8217;d been monitoring the actual number &#8211; and nature &#8211; of the Components and Systems that the teams developed and used on the project.</p>
<p>He&#8217;s now <a href="http://paulgestwicki.blogspot.com/2012/03/components-and-systems-of-morgans-raid.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://paulgestwicki.blogspot.com/2012/03/components-and-systems-of-morgans-raid.html');">posted this list, along with some brief analysis</a>.</p>
<h3>All systems and Components</h3>
<p>Read Paul&#8217;s post &#8211; there are some caveats he mentions, and there&#8217;s a useful diagram showing roughly how many systems were using each component.</p>
<p>I strongly recommend you play the game too (it&#8217;s free, and quick to play) so you can get an idea straight away &#8211; just from the names &#8211; what data and code some of these contain.</p>
<p>To recap, here&#8217;s the list:</p>
<blockquote><p>
&#8220;For your reading convenience, here&#8217;s a simple tabular view of the systems and components</p>
<table border="1">
<tr>
<th>Systems</th>
<th colspan="2">Components</th>
</tr>
<tr>
<td>
BackgroundTileSystem<br />
CityNameSystem<br />
DestinationSystem<br />
FadingSystem<br />
GPSToScreenSystem<br />
HoverableSystem<br />
ImageRenderingSystem<br />
IntInterpolationSystem<br />
MinimumSleepTimeSystem<br />
MorganLocationSystem<br />
NightRenderingSystem<br />
OnClickMoveHereSystem<br />
OnScreenBoundingBoxSystem<br />
RaidSoundSystem<br />
RailwaySystem<br />
ReputationSystem<br />
RevealingTextSystem<br />
SpeedSystem<br />
StepwisePositionInterpolationSystem<br />
SunSystem<br />
TimePassingSystem<br />
TimeTriggeredSystem<br />
TownArrivalSystem<br />
TownArrowSystem<br />
TownUnderSiegeSystem
</td>
<td>
AnimationRenderable<br />
ArrivesAtTownIndex<br />
BackgroundTile<br />
BeenRaided<br />
CentersOnGPS<br />
CityData<br />
CityImages<br />
CityName<br />
CityPopulation<br />
CityTargets<br />
CommandPoint<br />
Destination<br />
DoesCityHaveMilitia<br />
DoesCityLoseGame<br />
DoesCityWinGame<br />
GPSPosition<br />
GPSPositionList<br />
HasMorganGPS<br />
Hoverable<br />
ImageRenderable<br />
ImageRenderLayer<br />
InGameTime<br />
IntInterpolated
</td>
<td>
MinimumSleepTimeOverride<br />
Morgan<br />
MorganLocation<br />
MovesOnClick<br />
OnClickMoveHere<br />
OnScreenBoundingBox<br />
OnScreenBoundingBoxList<br />
PositionInterpolated<br />
Raidable<br />
Raider<br />
Railway<br />
Reputation<br />
ReputationValue<br />
RevealingText<br />
Road<br />
RoadsToCity<br />
RouteTaken<br />
Speed<br />
Sun<br />
Terrain<br />
TimeToRaid<br />
TimeTriggeredEvent<br />
TownAdjacency<br />
TownArrow<br />
TownUnderSeige
</td>
</tr>
</table>
<p>&#8221;
</p></blockquote>
<p>Things I noticed straight away:</p>
<ol>
<li>There&#8217;s approximately 2:1 ratio of &#8220;components&#8221; to &#8220;systems&#8221;
<li>In Paul&#8217;s post, all the Systems are accessing *something*
<li>In Paul&#8217;s post, quite a few Components are NOT accessed
<li>A couple of components are used by almost every System
<li>The names of some Systems suggest they&#8217;re very trivial &#8211; perhaps only a dozen lines of effective code
<li>The names of some Components suggest they&#8217;re being designed in an OOP hierarchy
</ol>
<p>NB: I haven&#8217;t had time to look at the source code, but <a href="https://sites.google.com/site/morgansraidgame/news/sourcecodenowavailablenewversionuploaded" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://sites.google.com/site/morgansraidgame/news/sourcecodenowavailablenewversionuploaded');">it&#8217;s freely downloadable here</a>, so I&#8217;d recommend having a look if you have time.</p>
<h3>How many Components per System?</h3>
<p>I&#8217;ve generally started people off with: &#8220;aim for 1:1 ratio&#8221;. This is mainly to kick them out of the traditional class-based OOP mindset. In practice, there&#8217;s really no need to stick to that religiously &#8211; once you get the hang of ES design, you should be freely adding and subtracting components all over the place.</p>
<p>In reality, the pressures on &#8220;number of systems&#8221; and &#8220;number of components&#8221; are independent. Ideally, you add a new system when you have a major new concept to add to your game &#8211; e.g. &#8220;previously I was using hand-made jumping, now I want to add a complete physics-driven approach. This will mean changing collision-detection, changing the core game-loop, etc&#8221;.</p>
<p>Ideally, you add a new component when you have a new &#8220;dimension&#8221; to the game objects. For instance, if you&#8217;re adding a physics System, you may not need to add any new Components &#8211; it might be that all you need is Location (containing x,y,x position and dx,dy,dz velocity) and RenderState (containing screen-pixels x,y) &#8211; and that you already have those components.</p>
<h3>Zero systems per component</h3>
<p>One of the advantages of an ES is that old code can just fall off the radar and disappear. So I&#8217;m not surprised at all to see some components that appear to be unused &#8211; and it&#8217;s MUCH easier to simply delete this code from your project than it would be on a traditional OOP project. Does anything reference that data? If so, it&#8217;s a set of particular systems. For each system, you can look at MERELY the system and the component, and make a very quick decision about whether you still need this access &#8211; or if you can refactor to move (some of) it somewhere else. The amount of code you need to read to make such decisions safely is typically very small &#8211; i.e. easy, quick, and less error-prone.</p>
<h3>Many systems per component</h3>
<p>This is fine. However, it can also be an early-warning sign of a design or code-architecture bug. Sometimes, there are components that &#8211; innately &#8211; are just needed all over the place. For instance, in a team-based game, the component saying which &#8220;team&#8221; a given object/player/item/building belongs to is likely to affect almost every piece of algorithm code across the board. It&#8217;ll be referenced by many systems.</p>
<p>On the flip-side, it may be a sign that you&#8217;ve put too much data into one component. There are two usual versions of this:</p>
<ol>
<li>You have &#8211; say &#8211; 8 variables in the struct where you should instead have two structs (components), one with 5 variables, the other with 3.
<li>You have &#8211; say &#8211; 4 variables in the struct, but different systems are using those variables to mean different things. It works OK for now, but it&#8217;s very fragile &#8211; as soon as the different meanings diverge even a little, your code is going to start breaking
</ol>
<p>Of course, you get this exact problem in traditional OOP setups, but with an ES it&#8217;s trivial to fix. Split &#8211; or duplicate &#8211; the Component, change a few references in the Systems, and you&#8217;re done. If it turns out a week later that the split wasn&#8217;t necessary &#8211; or worse, was a step backwards (e.g. you find yourself frequently synching the data between those components) &#8211; it&#8217;s extremely cheap to swap it back.</p>
<p>By contrast, with OOP, this is a nightmare scenario, because you have to worry about every method on the original class. Does that method:</p>
<ol>
<li>Need to exist on both the new classes, or just one?
<li>Work correctly for the new class it will be on &#8211; or does it currently rely on some of the data  (and shoudln&#8217;t) and will need to be re-written?
<li>Get used by other parts of the codebase in ways that will break if/when you split the class?
</ol>
<h3>Thoughts, Suggestions?</h3>
<p>&#8230;this is just a lightning quick analysis, but I strongly invite you to do you own digging into the classes &#8211; and the codebase &#8211; and come up with your own thoughts and feedback. We have here a convenient, real-life, list of components/systems &#8211; something to dig our teeth into, and debate the rights and wrongs of each decision. And I&#8217;m sure the students involved on the project would be interested in your feedback on their approaches :)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/16/entity-systems-what-makes-good-components-good-entities/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>2 reasons to beware Apple&#8217;s NSDictionary, and CoreData</title>
		<link>http://t-machine.org/index.php/2012/03/13/2-reasons-to-beware-apples-nsdictionary-and-coredata/</link>
		<comments>http://t-machine.org/index.php/2012/03/13/2-reasons-to-beware-apples-nsdictionary-and-coredata/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 17:25:09 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1826</guid>
		<description><![CDATA[Ever seen this hard to notice bug in an iPhone / Mac project? Caused by a flaw (bug?) in Apple&#8217;s own API: NSDictionary * map; &#8230; NSObject * key; NSObject * value; &#8230; // NB: next line will frequently crash at runtime // &#8230;but even if doesn&#8217;t crash, it probably won&#8217;t do // what you&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>Ever seen this hard to notice bug in an iPhone / Mac project? Caused by a flaw (bug?) in Apple&#8217;s own API:</p>
<blockquote><p>
NSDictionary * map;<br />
&#8230;<br />
NSObject * key;<br />
NSObject * value;<br />
&#8230;<br />
// NB: next line will frequently crash at runtime<br />
// &#8230;but even if doesn&#8217;t crash, it probably won&#8217;t do<br />
//     what you&#8217;d expect it to:<br />
[map setObject:value forKey:key];</p>
<p>if( value != [map objectForKey:key] ) // HA!<br />
{<br />
    NSAssert( 1 == 0, @&#8221;What the **** just happened??&#8221; );<br />
}
</p></blockquote>
<p>NSDictionary is one of the nastier things I&#8217;ve seen in a programming language: in an Object-Oriented Language, it&#8217;s a class that refuses to take Objects as arguments, *but pretends to*. If you attempt it, it either crashes, or it invalidates your objects, breaking contracts all over the place.</p>
<h4>ObjC&#8217;s bizarre design</h4>
<p>In the days pre-OOP, a &#8220;dictionary&#8221; was something that mapped:</p>
<blockquote><p>
 &#8220;a string&#8221;<br />
to<br />
&#8220;anything&#8221; (usually: basic datatypes &#8211; e.g. strings, integers, floats, etc).
</p></blockquote>
<p>In the days of OOP, the same thing is usually called a &#8220;map&#8221; (which is a better term) &#8211; although the terms are synonymous &#8211; and maps:</p>
<blockquote><p>
&#8220;an object&#8221;<br />
to<br />
&#8220;another object&#8221;
</p></blockquote>
<p>What did Apple/NextStep/Crazy-Guys-Behind ObjC do?</p>
<p>NSDictionary: maps:</p>
<blockquote><p>
&#8220;STRINGS ONLY&#8221; (no objects allowed!)<br />
to<br />
&#8220;OBJECTS ONLY&#8221; (no core datatypes allowed!)
</p></blockquote>
<h4>But &#8230; I can use an NSObject as key?</h4>
<p>Yep &#8211; but Apple&#8217;s internal implementation takes a *copy* of the object, and uses that as a key &#8211; rather than using the object that you gave it. This is a common problem in OOP languages and implementations of Map &#8211; e.g. Java does the same thing.</p>
<p>Unfortunately, this means that you can call &#8220;setObject:forKey:&#8221;, and then &#8220;objectForKey:&#8221; will return nil *for the same key*.</p>
<p>In Java and other OOP languages, you are required to implement a custom &#8220;isObjectEqualToObject&#8221; method. In ObjC too &#8211; except that that method is ILLEGAL if you&#8217;re using CoreData.</p>
<h4>And ObjC will crash too, as a bonus</h4>
<p>I&#8217;ve never seen this in other OOP languages, but in ObjC *additionally*: if you don&#8217;t manually add <NSCopying> to the object you pass-in &#8230; it crashes at runtime. Yay!</p>
<p>How come? AFAICT, Apple&#8217;s header file is wrong:</p>
<blockquote><p>
- (void)setObject:(id)anObject forKey:(id)aKey // You lie!
</p></blockquote>
<p>it seems the implementation of that method is:</p>
<blockquote><p>
- (void)setObject:(id)anObject forKey:(id&lt;NSCopying&gt;)aKey; // the correct signature?
</p></blockquote>
<p>Net result? Code that happily compiles &#8230; will crash. ARGH!</p>
<h3>Two reasons to beware&#8230; </h3>
<p>&#8230;so what&#8217;s the other one?</p>
<p>Ah, just the one we see again and again on live projects, wasting hours and hours of time:</p>
<blockquote><p>
NSDictionary* dictionary = [NSDictionary dictionaryWithObjectsAndKeys:<br />
     object1, key1,<br />
     object2, key2,<br />
     nil];</p>
<p>NSLog( @&#8221;dictionary = %@&#8221;, dictionary ); // but it only has one key/value pair. ?!?!?
</p></blockquote>
<p>Ah, well &#8230; that nil &#8230; what happens when object2 is nil? Oh, damn.</p>
<p>What about if key2 is nil? Now we&#8217;re really nasty &#8230; we&#8217;ve given it &#8220;half&#8221; of key/value pair. Nice!</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/13/2-reasons-to-beware-apples-nsdictionary-and-coredata/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>GitHub for Mac: don&#8217;t use it :(</title>
		<link>http://t-machine.org/index.php/2012/03/09/github-for-mac-dont-use-it/</link>
		<comments>http://t-machine.org/index.php/2012/03/09/github-for-mac-dont-use-it/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 19:36:33 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1816</guid>
		<description><![CDATA[It looked so good, finally &#8211; a decent Git client for Mac. But, no. It just &#8211; simply &#8211; doesn&#8217;t work (version 1.2.1). Great for browsing, but sometimes you simply can&#8217;t commit changes to a repository! (a few hours earlier, it was committing fine. Nothing had changed in the meantime) And what do you get [...]]]></description>
			<content:encoded><![CDATA[<p>It <a href="http://t-machine.org/index.php/2012/03/06/awesome-git-client-for-mac/" >looked so good</a>, finally  &#8211; a decent Git client for Mac.</p>
<p>But, no. It just &#8211; simply &#8211; doesn&#8217;t work (version 1.2.1). Great for browsing, but sometimes you simply can&#8217;t commit changes to a repository! (a few hours earlier, it was committing fine. Nothing had changed in the meantime)</p>
<p>And what do you get as an error, when you try?</p>
<blockquote><p>
&#8220;A git error occurred.&#8221;
</p></blockquote>
<p>Seems the folks at GitHub know this is unacceptable. Because they also put a message onto the (invisible) system console:</p>
<blockquote><p>
-[GHErrorSheetController presentWithError:] [Line 84]<br />
 Presenting with error, but let&#8217;s do better guys: Error Domain=GHGitControllerErrorDomain Code=556 UserInfo=0x117f63fa0 &#8220;A git error occurred.&#8221;
</p></blockquote>
<p>For the record, there was nothing wrong, and no errors &#8211; all other clients worked fine. So it&#8217;s probably an internal problem with GitHub&#8217;s code. They know it&#8217;s a problem (they wrote an error for it) but they won&#8217;t tell you what that problem is. Classy :)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/09/github-for-mac-dont-use-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails dead. All sites p0wned. GitHub shoots the messenger?</title>
		<link>http://t-machine.org/index.php/2012/03/07/ruby-on-rails-dead-all-sites-p0wned-github-shoots-the-messenger/</link>
		<comments>http://t-machine.org/index.php/2012/03/07/ruby-on-rails-dead-all-sites-p0wned-github-shoots-the-messenger/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 19:34:33 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[marketing and PR]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[server admin]]></category>
		<category><![CDATA[system architecture]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1812</guid>
		<description><![CDATA[Two things here: if you run any Rails site, check out the security hole ASAP if you haven&#8217;t already. You might be safe &#8211; but given that even GitHub wasn&#8217;t, I&#8217;d double check if I were you. (The Rails community seemingly isn&#8217;t patching it &#8211; and there&#8217;s nothing recent on the Security list. Which leaves [...]]]></description>
			<content:encoded><![CDATA[<p>Two things here: if you run any Rails site, check out the security hole ASAP if you haven&#8217;t already. You might be safe &#8211; but given that even GitHub wasn&#8217;t, I&#8217;d double check if I were you. (The Rails community seemingly <a href="https://github.com/rails/rails/pull/4062" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/rails/rails/pull/4062');">isn&#8217;t patching it</a> &#8211; and there&#8217;s nothing recent on the Security list. Which leaves me going: WTF? <a href="https://github.com/rails/rails/issues/5239" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/rails/rails/issues/5239');">The evidence is right there on GitHub</a> of how bad this is right now, in the wild).</p>
<p>Secondly &#8230; what just happened? Apart from doom and gloom and &#8220;the end of every unpatched Rails site on the planet&#8221;, there&#8217;s a fun story behind this one. As someone put it &#8220;it&#8217;s the whitest of white-hat attacks&#8221; (i.e. the &#8220;attacker&#8221;&#8216;s motives appear extremely innocent &#8211; but foolish and naive)</p>
<p>It seems that GitHub got hit by <a href="https://github.com/rails/rails/issues/5228#issuecomment-4304367" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/rails/rails/issues/5228#issuecomment-4304367');">the world&#8217;s nastiest security hole, in Rails</a> &#8211; trivial to take advantage of, and utterly lethal. The hole appears to allow pretty much anyone, any time, to do anything, anywhere &#8211; while PRETENDING to be any other user of the system. So, for instance, in the attack itself, someone inserted arbitrary source code into a project they had no right to.</p>
<p>Hmm. That&#8217;s bad. It effectively destroys GitHub&#8217;s entire business (it&#8217;s already fixed, don&#8217;t worry)</p>
<p>But it gets worse &#8230; it&#8217;s a flaw in the RoR framework, not GitHub itself (although apparently GitHub&#8217;s authors were supposed to know about the flaw by reading the Rails docs, as far as I can tell from a quick glimpse at the background). Rails authors have (allegedly) known about it and underestimated how bad it is in the wild, and left Rails completely open with zero security by default.</p>
<p>So, allegedly, the same attack works for most of the web&#8217;s large Web 2.0 sites &#8211; any of them that run on Rails.</p>
<p>WTFOMGBBQ!</p>
<p>Who was the perpetrator of this attack? Ah, well&#8230;</p>
<p><a href="http://homakov.blogspot.com/2012/03/im-disappoint-github.html>A Rails contributor</a> &#8230; working on the Rails project on GitHub &#8230; who felt the maintainers weren&#8217;t taking the security hole seriously enough. When they continued to close his issues, he turned around and wondered: Hmm. GitHub itself &#8211; which hosts our source code &#8211; also runs on the framework we provide, the same framework that has this flaw. I wonder if &#8230;?</p>
<p>And lo, it turns out that no &#8211; GitHub weren&#8217;t aware of the &#8220;no security by default&#8221;, and GitHub was wide open.</p>
<p>So, to prove how bad the problem was, he re-opened issues that the others had closed (which he shouldn&#8217;t have been able to do), and then <a href="https://github.com/rails/rails/issues/5239" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/rails/rails/issues/5239');">made an impossible issue, a post that GitHub&#8217;s database believed was created 1,000 years in the future</a>.</p>
<p>Classy. Dangerous (high risk of someone calling the police and the lawyers), but if people won&#8217;t believe you, and *close* your issues, claiming it&#8217;s not that important, what more amusing way to prove them wrong?</p>
<h4>Whoops, shouldn&#8217;t have done that</h4>
<p>I can&#8217;t state this strongly enough: never attack a live system. Just &#8230; don&#8217;t.</p>
<p>Any demonstration of a security flaw has to be done very carefully &#8211; people have been arrested for demonstrating a flaw allegedly *at the owner&#8217;s request*, because under some jurisdiction&#8217;s it&#8217;s technically a crime even if you&#8217;re given permission. In general, security researchers never show a flaw on a real system &#8211; they explain how to, and do it on a dummy system, so no-one can arrest them.</p>
<p>(why arrest the researcher? Usually seems to be no reason beyond ass-covering by executives and lawyers, and a petty vindictiveness)</p>
<p>Homakov appears to have been ignorant of this little maxim, hence I&#8217;m writing it here, let as many people as possible know: never attack a live system (unless you&#8217;re very sure the owners and the police won&#8217;t come after you)!</p>
<h4>GitHub&#8217;s response</h4>
<p>On the plus side, they fixed it within hours, on a weekend. And then proceeded to tell every single user what had happened. And did so in a clever way &#8211; they put a block on all GitHub accounts that practically forces you to read their &#8220;here&#8217;s what happened, but we&#8217;ve fixed it&#8221; message. They could have kept it quiet.</p>
<p>Which is all rather wonderful and reassuring.</p>
<p>On the minus side, IMHO they rather misrepresented what actually happened, portraying it more as a malicious attack, and something they fixed, rather than what it was &#8211; the overspill from an argument between developers on some software that GitHub uses.</p>
<p>And they initially reported they&#8217;d &#8220;suspended&#8221; the user&#8217;s account. Normally I&#8217;d support this action &#8211; generally it&#8217;s a bad idea to let it be known you&#8217;ll accept attacks and not fight back. But in this case it appears that GitHub didn&#8217;t read the f***ing manual, and the maintainers apparently (based on reading their tickets on the GitHub DB) refused to accept it was a serious problem &#8211; and apparently didn&#8217;t care that one of their own high-profile clients was wide open and insecure. The attack wasn&#8217;t even against GitHub per se &#8211; it was against the Rails team who weren&#8217;t acting. IF it had e.g. been a defacement of GitHub&#8217;s main site, that would have been different, both in impact and in intent. Instead, the attack appears to be a genuinely dumb act by someone being naive. </p>
<p>Seems that <a href="https://github.com/blog/1069-responsible-disclosure-policy" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://github.com/blog/1069-responsible-disclosure-policy');">GitHub agreed</a> &#8211; although their reporting is a bit weak, it happened days ago, but they never thought to edit any of their material and back-link it.</p>
<blockquote><p>
&#8220;Now that we&#8217;ve had a chance to review his activity, and have determined that no malicious intent was present, @homakov&#8217;s account has been reinstated.
</p></blockquote>
<p>&#8230;and it&#8217;s pleasing to see that their reaction included a small mea culpa for being unclear in what they expect (although anyone dealing with security ought to be aware of this stuff as &#8220;standard practice&#8221;, sometimes it&#8217;s not security experts who find the holes):</p>
<blockquote><p>
&#8220;We haven&#8217;t been as clear as we should have been on how to responsibly disclose security problems, and for that I&#8217;m sorry. To prevent future confusion about security-related account suspension, and to make explicit our stance on responsible disclosure, we have added a section entitled Responsible Disclosure of Security Vulnerabilities to our Security policy.&#8221;
</p></blockquote>
<h4>Rails&#8217;s response</h4>
<p>I&#8217;d expect: shame, weeping, and BEGGING the web world to forgive their foolishness. I&#8217;m not sure, but it&#8217;s going to be interesting to watch. As of right now, the demo&#8217;s of the flaw are still live. I particularly like one commenter&#8217;s:</p>
<blockquote><p>
drogus  closed the issue 5 days ago</p>
<p>kennyj commented</p>
<p>5 days ago</p>
<p>&#8220;I&#8217;m closing it (again).<br />
@drogus was close it, but it still open.<br />
github bug?&#8221;</p>
<p>Closed</p>
<p>kennyj closed the issue 5 days ago
</p></blockquote>
<p>&#8220;github bug?&#8221; LOL, no &#8211; massive security flaw :).</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/07/ruby-on-rails-dead-all-sites-p0wned-github-shoots-the-messenger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Awesome GIT client for Mac</title>
		<link>http://t-machine.org/index.php/2012/03/06/awesome-git-client-for-mac/</link>
		<comments>http://t-machine.org/index.php/2012/03/06/awesome-git-client-for-mac/#comments</comments>
		<pubDate>Tue, 06 Mar 2012 15:13:12 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1809</guid>
		<description><![CDATA[I&#8217;ve only played with this for a few minutes, but so far it seems to have an excellent, simple, clear GUI with the core features I&#8217;d expect. Way better than any other Git client I&#8217;ve seen for Mac. And it&#8217;s free! GitHub for Mac v1.2.1 (NB: works with any Git server, not just GitHub.com!) I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve only played with this for a few minutes, but so far it seems to have an excellent, simple, clear GUI with the core features I&#8217;d expect. Way better than any other Git client I&#8217;ve seen for Mac. And it&#8217;s free!</p>
<p><a href="http://mac.github.com/help.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://mac.github.com/help.html');">GitHub for Mac v1.2.1</a> (NB: works with any Git server, not just GitHub.com!)</p>
<p>I&#8217;ve noticed some cosmetic bugs &#8211; e.g. it renders all the user-account avatars completely wrong (puts wrong image next to each commiter) &#8211; so I&#8217;d advise &#8220;use this with caution&#8221; until you&#8217;re sure it&#8217;s got no fatal bugs. Although, since it&#8217;s from GitHub.com, I expect it&#8217;s pretty robust.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/06/awesome-git-client-for-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mongo DB is WebScale. MySQL is not WebScale.</title>
		<link>http://t-machine.org/index.php/2012/03/05/mongo-db-is-webscale-mysql-is-not-webscale/</link>
		<comments>http://t-machine.org/index.php/2012/03/05/mongo-db-is-webscale-mysql-is-not-webscale/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 04:56:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[MMOG development]]></category>
		<category><![CDATA[amusing]]></category>
		<category><![CDATA[network programming]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[system architecture]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1806</guid>
		<description><![CDATA[There&#8217;s good reasons for adopting Mongo, I&#8217;m unconvinced (but open-minded) that performance is one of them. Here&#8217;s a ROFLMAO viewpoint on it: &#8220;If your write fails, you&#8217;re ****ed&#8221; Obviously, MySQL&#8217;s not perfect, but in most cases I&#8217;ve seen, it&#8217;s been lack of competence on the developer side, and the lack of basic DBA skills &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s good reasons for adopting Mongo, I&#8217;m unconvinced (but open-minded) that performance is one of them. Here&#8217;s a ROFLMAO viewpoint on it:</p>
<p><a href="http://www.xtranormal.com/watch/6995033/mongo-db-is-web-scale" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.xtranormal.com/watch/6995033/mongo-db-is-web-scale');">&#8220;If your write fails, you&#8217;re ****ed&#8221;</a></p>
<p>Obviously, MySQL&#8217;s not perfect, but in most cases I&#8217;ve seen, it&#8217;s been lack of competence on the developer side, and the lack of basic DBA skills &#8211; not problems with MySQL itself &#8211; that&#8217;s broken scalability. In which case, I&#8217;m a little suspicious that a company that fails to scale MySQL will equally fail to write their code correctly on Mongo. In many ways, throwing away SQL makes it much easier to prevent scalability&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/03/05/mongo-db-is-webscale-mysql-is-not-webscale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UK companies don&#8217;t suck, they just need tax breaks</title>
		<link>http://t-machine.org/index.php/2012/02/24/uk-companies-dont-suck-they-just-need-tax-breaks/</link>
		<comments>http://t-machine.org/index.php/2012/02/24/uk-companies-dont-suck-they-just-need-tax-breaks/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 13:38:19 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[games industry]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1801</guid>
		<description><![CDATA[According to Sefton Hill: &#8220;You just think about quality developers like Bizarre Creations, Black Rock &#8211; people who are making really good games and going out of business. Those guys were so talented so how can that happen? Well, obviously, it wasn&#8217;t anything to do with operational mis-management, poor commercial decisions, gambles that didn&#8217;t pay [...]]]></description>
			<content:encoded><![CDATA[<p>According to <a href="http://www.computerandvideogames.com/335207/rocksteady-uk-couldve-been-world-leader-in-games/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.computerandvideogames.com/335207/rocksteady-uk-couldve-been-world-leader-in-games/');">Sefton Hill</a>:</p>
<blockquote><p>
&#8220;You just think about quality developers like Bizarre Creations, Black Rock &#8211; people who are making really good games and going out of business. Those guys were so talented so how can that happen?
</p></blockquote>
<p>Well, obviously, it wasn&#8217;t anything to do with operational mis-management, poor commercial decisions, gambles that didn&#8217;t pay off, bad strategic decisions about partnerships/publishers/<a href="http://disney.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://disney.com');">companies to sell themselves to</a>, <strong>a global recession</strong>, failure to keep pace with changing trends in culture and audience, technology falling behind, etc.</p>
<p>No &#8211; it was the lack of tax breaks.</p>
<p>Obviously.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/02/24/uk-companies-dont-suck-they-just-need-tax-breaks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apple laptop overheats when running iOS 5 on iPad or iPhone Simulator</title>
		<link>http://t-machine.org/index.php/2012/02/12/apple-laptop-overheats-when-running-ios-5-on-ipad-or-iphone-simulator/</link>
		<comments>http://t-machine.org/index.php/2012/02/12/apple-laptop-overheats-when-running-ios-5-on-ipad-or-iphone-simulator/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 22:36:32 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1794</guid>
		<description><![CDATA[Here&#8217;s ANOTHER overheating bug in Apple&#8217;s OS X. This time, it&#8217;s the BlueTooth simulator built-in to the iOS Simulator (used every day by iPhone and iPad developers). The iOS5 version of the simulator has this crazy BT demon (process &#8220;BTServer&#8221;) that will sometimes &#8211; for no apparent reason &#8211; take up 100% CPU usage and [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s ANOTHER overheating bug in Apple&#8217;s OS X.</p>
<p>This time, it&#8217;s the BlueTooth simulator built-in to the iOS Simulator (used every day by iPhone and iPad developers). The iOS5 version of the simulator has this crazy BT demon (process &#8220;BTServer&#8221;) that will sometimes &#8211; for no apparent reason &#8211; take up 100% CPU usage and melt your machine.</p>
<p>Solution:</p>
<ol>
<li>Open terminal
<li>Type: sudo vi &#8220;/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/LaunchDaemons/com.apple.BTServer.plist&#8221;
<ul>
<li>NOTE: the inverted commas are required, it seems
</ul>
<li>Enter your admin password for the machine (the file is locked to all except admin)
<li>Use vi to change the 8th line to: &lt;true/&gt;
<ul>
<li>NOTE: the line immediately above should be: &lt;key&gt;Disabled&lt;/key&gt;
</ul>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/02/12/apple-laptop-overheats-when-running-ios-5-on-ipad-or-iphone-simulator/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>DRM and the consumer</title>
		<link>http://t-machine.org/index.php/2012/02/04/drm-and-the-consumer/</link>
		<comments>http://t-machine.org/index.php/2012/02/04/drm-and-the-consumer/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 16:02:29 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[reputation systems]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1791</guid>
		<description><![CDATA[The mashup (My new &#8220;preferred explanation of piracy + DRM&#8221;) The original (From Cyanide&#038;Happiness webcomic, if you don&#8217;t know it already..)]]></description>
			<content:encoded><![CDATA[<h3>The mashup</h3>
<p>(My new &#8220;preferred explanation of piracy + DRM&#8221;)</p>
<p><a href="http://dudelol.com/drm/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://dudelol.com/drm/');"><img src="http://dudelol.com/DO-NOT-HOTLINK-IMAGES/DRM.png"/></a></p>
<h3>The original</h3>
<p>(From Cyanide&#038;Happiness webcomic, if you don&#8217;t know it already..)</p>
<p><a href="http://www.explosm.net/comics/1881/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.explosm.net/comics/1881/');"><img src="http://www.explosm.net/db/files/Comics/Rob/onetwo.png"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/02/04/drm-and-the-consumer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thinking of moving from Game Design/Development &#8230; to Media/Marketing?</title>
		<link>http://t-machine.org/index.php/2012/02/02/thinking-of-moving-from-game-designdevelopment-to-mediamarketing/</link>
		<comments>http://t-machine.org/index.php/2012/02/02/thinking-of-moving-from-game-designdevelopment-to-mediamarketing/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 19:49:17 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1788</guid>
		<description><![CDATA[Here&#8217;s what you need to know about your new co-workers: https://www.youtube.com/watch?v=SJiC4EglCX0&#038;feature=related]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s what you need to know about your new co-workers:</p>
<p><a href="https://www.youtube.com/watch?v=SJiC4EglCX0&#038;feature=related" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://www.youtube.com/watch?v=SJiC4EglCX0&#038;feature=related');">https://www.youtube.com/watch?v=SJiC4EglCX0&#038;feature=related</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/02/02/thinking-of-moving-from-game-designdevelopment-to-mediamarketing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Game Pitches &#8211; actual pitch docs from real games</title>
		<link>http://t-machine.org/index.php/2012/01/30/game-pitches-actual-pitch-docs-from-real-games/</link>
		<comments>http://t-machine.org/index.php/2012/01/30/game-pitches-actual-pitch-docs-from-real-games/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 14:38:55 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[games publishing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1786</guid>
		<description><![CDATA[http://www.gamepitches.com/ (just discovered this, via TCE): The repository for video game pitches and design documents This site serves to be a free resource to game designers offering them the web’s largest single collection of game design documents and game pitches. It says &#8220;resource got game designers&#8221;, but &#8230; pitch documents are hugely valuable to anyone [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gamepitches.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.gamepitches.com/');">http://www.gamepitches.com/</a> (just discovered this, via TCE):</p>
<blockquote><p>
The repository for video game pitches and design documents</p>
<p>This site serves to be a free resource to game designers offering them the web’s largest single collection of game design documents and game pitches.
</p></blockquote>
<p>It says &#8220;resource got game designers&#8221;, but &#8230; pitch documents are hugely valuable to anyone working on the business/funding side too. (there are two aspects to the site &#8211; design docs, and pitch docs).</p>
<p>There&#8217;s some good stuff on there &#8211; from the <a href="http://www.gamepitches.com/2011/04/dma-design-ltd-grand-theft-auto-1-design-document/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.gamepitches.com/2011/04/dma-design-ltd-grand-theft-auto-1-design-document/');">GTA design doc</a> to <a href="http://www.gamepitches.com/2010/06/tiger-style-games-spider-concept-document/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.gamepitches.com/2010/06/tiger-style-games-spider-concept-document/');">Spider&#8217;s original concept doc</a>. Note to fledgling designers: they&#8217;re impressively brief and succinct!</p>
<p>&#8230;and if you work for a studio or publisher, perhaps you could ask about getting some of your company&#8217;s old pitch/design docs put up online?</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/01/30/game-pitches-actual-pitch-docs-from-real-games/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using Genetic Algorithms to playtest an iPad game</title>
		<link>http://t-machine.org/index.php/2012/01/16/using-genetic-algorithms-to-playtest-an-ipad-game/</link>
		<comments>http://t-machine.org/index.php/2012/01/16/using-genetic-algorithms-to-playtest-an-ipad-game/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 13:20:39 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games design]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1784</guid>
		<description><![CDATA[Looks like a &#8220;normal&#8221; KickStarter project for a new Tower Defence game. Halfway through the demo video, it switches to &#8220;here&#8217;s how I&#8217;ve been using GA to detect game-design flaws, and to test ideas in tweaking game design&#8221;. Something I&#8217;ve wanted to do for more than a decade, but could never find a company who&#8217;d [...]]]></description>
			<content:encoded><![CDATA[<p>Looks like a &#8220;normal&#8221; <a href="http://www.kickstarter.com/projects/632613697/city-conquest" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.kickstarter.com/projects/632613697/city-conquest');">KickStarter project for a new Tower Defence game</a>.</p>
<p>Halfway through the demo video, it switches to &#8220;here&#8217;s how I&#8217;ve been using GA to detect game-design flaws, and to test ideas in tweaking game design&#8221;.</p>
<p>Something I&#8217;ve wanted to do for more than a decade, but could never find a company who&#8217;d take it seriously :). I really hope this iPad game does well &#8211; would be great to see a poster-child / real-world demonstration of a workable technique here.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/01/16/using-genetic-algorithms-to-playtest-an-ipad-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New game (Risk clone) &#8211; need SVG maps!</title>
		<link>http://t-machine.org/index.php/2012/01/16/new-game-risk-clone-need-svg-maps/</link>
		<comments>http://t-machine.org/index.php/2012/01/16/new-game-risk-clone-need-svg-maps/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 13:05:58 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1781</guid>
		<description><![CDATA[As a free-time project, I&#8217;ve been writing a Risk clone (*) for iPad. One of the bits I like best right now is that you can give it the URL of *any* SVG file on the web, and it automatically turns it into a Risk map. (e.g. all the maps in Wikipedia articles are SVG [...]]]></description>
			<content:encoded><![CDATA[<p>As a free-time project, I&#8217;ve been writing a Risk clone (*) for iPad.</p>
<p>One of the bits I like best right now is that you can give it the URL of *any* SVG file on the web, and it automatically turns it into a Risk map.</p>
<p>(e.g. all the maps in Wikipedia articles are SVG files &#8211; it&#8217;s a common file format with good browser support)</p>
<p>This was one of those &#8220;interesting&#8221; technical challenges &#8211; I had to find an algorithm that would automatically work out which territories a human would &#8220;assume&#8221; were connected to each other.</p>
<p>I&#8217;m using an open-source SVG library which works fine for basic SVG files but has a lot of bugs with the more esoteric ones. I&#8217;ve already fixed a few of the major bugs (they&#8217;re now merged into the GitHub project) &#8211; but I&#8217;d like to get more SVG files to test with.</p>
<p>The one thing to bear in mind is that the colour-data gets wiped when it imports. So &#8230; SVG files that make heavy use of different colours or gradient-fills/pattern-fills lose detail when imported.</p>
<p>Also, files where none of the elements are close enough to be deemed &#8220;connected territories&#8221; &#8230; work poorly.</p>
<p>Everything else works fine.</p>
<p>So &#8230; if you&#8217;ve got any, please post a comment here with URL, or email them to me directly (address in the About link at top of this page).</p>
<p>(*) &#8211; I say &#8220;clone&#8221; because it&#8217;s the same genre &#8211; but the gameplay is &#8220;fixed&#8221; quite a lot. If you once loved Risk, but grew to hate it, you&#8217;ll see why I wanted to change the baic game design :).</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/01/16/new-game-risk-clone-need-svg-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2012: the year of UNcollaborative development, or: when GitHub kills Open Source</title>
		<link>http://t-machine.org/index.php/2012/01/13/2012-the-year-of-uncollaborative-development-or-when-github-kills-open-source/</link>
		<comments>http://t-machine.org/index.php/2012/01/13/2012-the-year-of-uncollaborative-development-or-when-github-kills-open-source/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 01:08:57 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1775</guid>
		<description><![CDATA[What happens when you get 2 developers working together, sharing their source? What about 10? &#8230; or a 100? There was a dream, 20 years ago, that the total would be greater than the sum of the parts. That developers could *re-use* each-other&#8217;s code. Sadly, that dream &#8211; in 2012 &#8211; is poisoned. What I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>What happens when you get 2 developers working together, sharing their source? What about 10? &#8230; or a 100?</p>
<p>There was a dream, 20 years ago, that the total would be greater than the sum of the parts. That developers could *re-use* each-other&#8217;s code.</p>
<p>Sadly, that dream &#8211; in 2012 &#8211; is poisoned.</p>
<p>What I&#8217;m going to describe here happens a lot &#8211; although in absolute terms, I hope it&#8217;s just a drop in the ocean. Maybe it&#8217;s nothing to worry about. Or maybe &#8230; well. In the last 15-odd GitHub projects I&#8217;ve tried to use, it affected more than a third of them. Such tiny stats are statistically meaningless, of course &#8211; but if you look at the causes of this, I think it&#8217;s more likely part of a general trend &#8211; and that really is worrying.</p>
<p>So. What&#8217;s going on?</p>
<h3>The curse of Github</h3>
<p>I love GitHub, I&#8217;m a paying member (and I regularly sell it to clients and colleagues) but &#8230; in some ways, it&#8217;s IMHO actively preventing collaboration.</p>
<blockquote><p>
Just to be clear: it doesn&#8217;t have to be this way &#8211; you can run your own projects on GitHub and prevent this happening.</p>
<p>But &#8230; GitHub makes this the path of least resistance, and that means &#8211; in the world of Open Source &#8211; it&#8217;s the path that gets most followed
</p></blockquote>
<p>When you fix a bug on GitHub, you have to wait for the original project author to &#8220;accept&#8221; your fix.</p>
<p>If they don&#8217;t accept it, as far as collaboration goes: you&#8217;re screwed. There is no &#8220;plan B&#8221; for collaboration.</p>
<p>Your only option is to tell the world:</p>
<blockquote><p>
&#8220;Stop using his project! It sucks! Use my project instead! I promise I&#8217;ll be a better merger!&#8221;
</p></blockquote>
<p>But then &#8230; if *you* stop accepting fixes for a while, one of the developers fixing YOUR bugs will have to do the same thing.</p>
<p>And each of these &#8220;Stop! Use mine instead!&#8221; calls is one-way: once another developer who&#8217;s making use of the source moves to a sub-fork, they can never go back. In theory, the original Author could do a back-dated merge &#8230; but in reality, that won&#8217;t happen, because of the cost involved:</p>
<h4>Back-dated merging is combinatorially expensive</h4>
<p>In practice, that&#8217;s more expensive than a normal person can afford, in terms of time and effort.</p>
<p>For each SubAuthor they want to back-merge with, they have to check every single change that person has made &#8230; against every change that they&#8217;ve merged already, from every single source. Otherwise they break the previously-merged code. Usually, each individual SubAuthor makes an incompatible change sooner or later &#8211; and so prevents the original Author from ever merging with them.</p>
<p>It&#8217;s no surprise &#8211; usually by this point the Sub Author has given up on the original Author (can you blame them? the Author has disappeared and ignored merge requests for months or years by this point)</p>
<p>So, in practice, very few GitHub authors (so far: none that I&#8217;ve seen) re-merge SubAuthor projects once the SubAuthor has really got going. On the projects I&#8217;ve been involved in, when a popular SubAuthor disappears for a while, there&#8217;s been a desperate scramble by the SubSubAuthors to find the guy/gal and beg/bribe/bully them into merging &#8211; otherwise we know that our combined efforts are about to be blown up.</p>
<p>What? Well &#8230;</p>
<h3>The actions of the Author can undo the work of the Collaborators</h3>
<p>Say you have Author &#8220;A&#8221;, and 3 people making changes and fixes to the code (&#8220;B&#8221;, &#8220;C&#8221;, and &#8220;D&#8221;).</p>
<p>At first, while A accepts merges quickly, B, C and D are all sharing code together &#8211; in practice, they are collaborating. However, they are not truly sharing code &#8211; GitHub does not allow this &#8211; they are sharing code with a Master (A), who is forwarding their work to all 3 of them.</p>
<p>When A disappears, B C and D can no longer collaborate. If A disappears with merges pending &#8230; then B/C/D find they have 3 distinct codebases, and no way within GitHub to do a simple cross-merge.</p>
<p>Now, the situation is not lost &#8211; if B, C, and D get in contact (somehow) and negotiate which one of them is going to become &#8220;the primary SubAuthor&#8221; (somehow), and they issue manual patches to each other&#8217;s code (surprisingly tricky to do on GitHub) &#8230; then they can resume collaboration. I&#8217;ve done this myself &#8211; it works. But it&#8217;s massively more complex than the process they were using before, which was *one-click-merge*.</p>
<p>In practice, at this point B/C/D will stop collaborating. Sad, but true. This happens over and over again on GitHub projects &#8211; when a SubAuthor arises, the other collaborators stop collaborating and become new SubAuthors in their own right.</p>
<p>Often it feels like watching a religion split, with each of the senior priests declaring themself &#8220;the new Prophet&#8221;, and going forth to spread (their) word&#8230;</p>
<h3>Net effect: GitHub may be killing open-source projects</h3>
<p>In theory, GitHub is wonderful.</p>
<p>But the combination of its bad design around some core use-cases, and its intransigence when it comes to the VERY common case of a single person disappearing  &#8230; have lead to the point where I believe it&#8217;s killing projects. This is a gross generalization &#8211; and not every project that loses its Author will get this problem &#8211; but I&#8217;ve encountered more and more &#8220;dead&#8221; projects on GitHub over the course of 2011.</p>
<p>Of course &#8230; the way GitHub is designed, *those projects do not appear to be dead*. Often they appear to be very much &#8220;alive&#8221; &#8211; there&#8217;s tonnes of activity.</p>
<p>But all that activity is going on in radically different and massively incompatible forks. It&#8217;s wasted time and energy, it&#8217;s programmers fixing the same bugs &#8211; multiple times &#8211; because they are NOT collaborating any more.</p>
<p>In the case I cited at the start, 100-plus developers have (probably) re-written the same fixes for the same problems.</p>
<p>i.e. the total effect of this project is tending towards ONE HUNDRED TIMES less than the sum of its parts.</p>
<p>Note: LESS &#8230; not more!</p>
<p>There&#8217;s some value there, still &#8211; anyone can come along and start from the original project and make their own fork. But it&#8217;s a sad and sorry fraction of what the Open Source world dreamed of when the word Collaboration was fresh and exciting.</p>
<p>This is UnCollaboration. And its becoming depressingly common.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/01/13/2012-the-year-of-uncollaborative-development-or-when-github-kills-open-source/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>T-Machine *may* briefly disappear&#8230;</title>
		<link>http://t-machine.org/index.php/2012/01/01/t-machine-may-briefly-disappear/</link>
		<comments>http://t-machine.org/index.php/2012/01/01/t-machine-may-briefly-disappear/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 18:54:28 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[maintenance]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1773</guid>
		<description><![CDATA[T-Machine.org is up for renewal, Joker.com won&#8217;t accept credit and debit cards any more, so I&#8217;m having to remote pull everything to a new host. Hopefully this will work first time, without screw-ups&#8230; (Joker.com doesn&#8217;t take any other form of payment &#8211; PayPal, bank transfer, etc. They used to do plain Credit/Debit, until recently (that&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>T-Machine.org is up for renewal, Joker.com won&#8217;t accept credit and debit cards any more, so I&#8217;m having to remote pull everything to a new host. Hopefully this will work first time, without screw-ups&#8230;</p>
<p>(Joker.com doesn&#8217;t take any other form of payment &#8211; PayPal, bank transfer, etc. They used to do plain Credit/Debit, until recently (that&#8217;s now been removed) when they switched to the &#8220;insecure password and spam email account&#8221; system that Visa/Mastercard are pushing)</p>
<p>This Visa/Mastercard system is not only a joke, it&#8217;s also a great way to lose business: moving to the new system just cost Joker.com a 5+ year customer &#8211; and I&#8217;d have continued to be a customer for decades to come, I&#8217;m sure. Web 0.1 triumphs again &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/01/01/t-machine-may-briefly-disappear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Throw away the iPhone? or throw away Gmail? Decisions, decisions&#8230;</title>
		<link>http://t-machine.org/index.php/2011/12/09/throw-away-the-iphone-or-throw-away-gmail-decisions-decisions/</link>
		<comments>http://t-machine.org/index.php/2011/12/09/throw-away-the-iphone-or-throw-away-gmail-decisions-decisions/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 23:14:00 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Google? Doh!]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1770</guid>
		<description><![CDATA[For the past week, my iPhone&#8217;s have been unable to use Gmail. After approximately 4 hours, gmail locks you out of IMAP completely, unless/until you force-kill Apple&#8217;s mail client. The problem is &#8230; if you force-kill the client, you lose all emails you wrote, and you lose all emails you filed into IMAP folders (Apple&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>For the past week, my iPhone&#8217;s have been unable to use Gmail. After approximately 4 hours, gmail locks you out of IMAP completely, unless/until you force-kill Apple&#8217;s mail client. The problem is &#8230; if you force-kill the client, you lose all emails you wrote, and you lose all emails you filed into IMAP folders (Apple&#8217;s client refuses to save state &#8211; it requires the server to do it).</p>
<p>Nothing has changed on the phones &#8211; and Google has been putting up irritating &#8220;stop using gmail, use the new gmail&#8221; ads for the same period of time &#8211; so I&#8217;m going to go out on a limb and guess that someone at Google changed something on the IMAP protocol that makes it no longer work correctly with iPhone.</p>
<p>I just had to write the same email for the second time, and re-file 50+ emails for the third time &#8211; and I&#8217;m giving up. You just can&#8217;t use gmail on an iOS 4 iPhone right now (I&#8217;m guessing that iOS 5 works OK, or there&#8217;d be an internet rage fest going on.</p>
<p>So. What to do. Dump the iPhone (switch to Android as my main phone, perhaps?)?</p>
<p>Or decide that enough&#8217;s enough, gmail is just too damn annoying these days (e.g. the 3 week period earlier this year where &#8220;reply all&#8221; was disabled on my gmail account) &#8230; I&#8217;ve heard there&#8217;s an email-for-life system called &#8230; hotmail?</p>
<p>Hmm&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/12/09/throw-away-the-iphone-or-throw-away-gmail-decisions-decisions/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>New startup, aiming for acquisition by Facebook</title>
		<link>http://t-machine.org/index.php/2011/12/05/new-startup-aiming-for-acquisition-by-facebook/</link>
		<comments>http://t-machine.org/index.php/2011/12/05/new-startup-aiming-for-acquisition-by-facebook/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 03:19:40 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[recruiting]]></category>
		<category><![CDATA[startup advice]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1768</guid>
		<description><![CDATA[Please email me (adam at red-glasses.com) if you have skills / interest in the following: Mass market (i.e. everyone + their mom) telling stories javascript frameworks for complex visual 2D stuff (e.g. iGoogle, Netvibes, etc) Visual manipulation of large 2D images on mobile (especially iPhone) NB: we have no funding yet, just an idea. This [...]]]></description>
			<content:encoded><![CDATA[<p>Please email me (adam at red-glasses.com) if you have skills / interest in the following:</p>
<ol>
<li>Mass market (i.e. everyone + their mom) telling stories
<li>javascript frameworks for complex visual 2D stuff (e.g. iGoogle, Netvibes, etc)
<li>Visual manipulation of large 2D images on mobile (especially iPhone)
</ol>
<p>NB: we have no funding yet, just an idea. This is a scatter-gun first approach &#8211; if things go well, there will be another call for people in 2-4 months time.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/12/05/new-startup-aiming-for-acquisition-by-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GDC 2012 Rejection</title>
		<link>http://t-machine.org/index.php/2011/12/01/gdc-2012-rejection/</link>
		<comments>http://t-machine.org/index.php/2011/12/01/gdc-2012-rejection/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 00:41:11 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1766</guid>
		<description><![CDATA[Against my own advice, I submitted an eleventh hour proposal for the 2012 GDC. I&#8217;ve fallen in love with San Francisco, but I&#8217;m in two minds about going next year, it seems to have too much of E3 about it. The simple beauty of a conference for games people, about games, feels washed out and [...]]]></description>
			<content:encoded><![CDATA[<p>Against my own advice, I submitted an eleventh hour proposal for the 2012 GDC. I&#8217;ve fallen in love with San Francisco, but I&#8217;m in two minds about going next year, it seems to have too much of E3 about it. The simple beauty of a conference for games people, about games, feels washed out and faded away.</p>
<blockquote><p>
&#8220;While we can&#8217;t comment on why individual submissions were declined due to the high volume of submissions received, be aware that it can often be due to multiple reasons &#8212; many of which have nothing to do with the professionalism or quality of the talk proposed.&#8221;
</p></blockquote>
<p>The more time I spend around inspirational people, the more I realise that it is never acceptable to refuse reasons for a decision. Usually, the reasons are things you&#8217;d rather not hear &#8211; criticisms too close to the bone, complaints too painful but fair &#8211; but they are things you need to hear anyway, to have a decent chance of moving forwards as a person.</p>
<p>CMP / Think Services is in the unenviable position that they own the only global event that speaks for mankind&#8217;s total relationship with computer games. I&#8217;m sure it seemed like a good commercial play at the time &#8211; but how fair is it that they now must shoulder the total face-time of every step forwards in the art and science of game development? Tough crowd, if you ask me.</p>
<p>Or is there some other (non judgemental) forum for face-to-face game design that I&#8217;ve missed?</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/12/01/gdc-2012-rejection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fight the Guardian&#8217;s and The Independent&#8217;s spam</title>
		<link>http://t-machine.org/index.php/2011/11/29/fight-the-guardians-and-the-independents-spam/</link>
		<comments>http://t-machine.org/index.php/2011/11/29/fight-the-guardians-and-the-independents-spam/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 13:55:45 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[bitching]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1762</guid>
		<description><![CDATA[On Facebook.com front page: &#8220;Dave Stone and Mike Merren recently read articles.&#8221; &#8230;so I click on one of them. Lo and behold, instead of getting an article, I get The Independent app trying to force me to install it. Force. Yes, force &#8211; there is no option to &#8220;view the article&#8221;, the only option is [...]]]></description>
			<content:encoded><![CDATA[<p>On Facebook.com front page:</p>
<p>&#8220;Dave Stone and Mike Merren recently read articles.&#8221;</p>
<p>&#8230;so I click on one of them. Lo and behold, instead of getting an article, I get The Independent app trying to force me to install it.</p>
<p>Force. Yes, force &#8211; there is no option to &#8220;view the article&#8221;, the only option is &#8220;install this app or cancel&#8221;.</p>
<p>Lots of people complaining about this recently, but there&#8217;s really only two things to do:</p>
<ol>
<li>Shame the newspaper by tweeting them
<li>Report them to Facebook for abuse
</ol>
<h4>Tweet them to let them know what you think</h4>
<p><a href="http://twitter.com/Guardian" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://twitter.com/Guardian');">@Guardian</a> and <a href="http://twitter.com/TheIndyNews" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://twitter.com/TheIndyNews');">@TheIndyNews</a></p>
<h4>Report to Facebook</h4>
<p>Yes, I know Facebook is behind this in the first place, but if you don&#8217;t bug them about it, they&#8217;re less likely to care:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-11-29-at-13.47.04.png" alt="" title="Screen shot 2011-11-29 at 13.47.04" width="575" height="354" class="aligncenter size-full wp-image-1763" /></p>
<p>&#8230;and you might as well let the developers know how pissed you are &#8211; directly &#8211; since Facebook gives you this option:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-11-29-at-13.47.18.png" alt="" title="Screen shot 2011-11-29 at 13.47.18" width="583" height="200" class="aligncenter size-full wp-image-1764" /></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/29/fight-the-guardians-and-the-independents-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linkedin now blocking iPhones</title>
		<link>http://t-machine.org/index.php/2011/11/28/linkedin-now-blocking-iphones/</link>
		<comments>http://t-machine.org/index.php/2011/11/28/linkedin-now-blocking-iphones/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 02:14:59 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Web 0.1]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1760</guid>
		<description><![CDATA[If you follow links in linkedin emails today, from an iPhone, you get kicked off the linkedin.com site, and every page redirects to: Https://touch.www.linkedin.com Even if you type in the front page URL directly, you are *not allowed* to visit the website. Classy.]]></description>
			<content:encoded><![CDATA[<p>If you follow links in linkedin emails today, from an iPhone, you get kicked off the linkedin.com site, and every page redirects to:</p>
<p>Https://touch.www.linkedin.com</p>
<p>Even if you type in the front page URL directly, you are *not allowed* to visit the website.</p>
<p>Classy.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/28/linkedin-now-blocking-iphones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototyping: Chess Quest v0.4</title>
		<link>http://t-machine.org/index.php/2011/11/21/prototyping-chess-quest-v0-4/</link>
		<comments>http://t-machine.org/index.php/2011/11/21/prototyping-chess-quest-v0-4/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 23:15:28 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[computer games]]></category>
		<category><![CDATA[dev-process]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1756</guid>
		<description><![CDATA[(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; original post here) Major changes: Enemies have health, and can be killed by touching them Performance is another 30% faster (should be running OK on most phones now?) Enemies have a direction indicator (not necessary right now, but it&#8217;ll become important in a later version&#8230;) Download [...]]]></description>
			<content:encoded><![CDATA[<p>(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; <a href="http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/" >original post here</a>)</p>
<p>Major changes:</p>
<ol>
<li>Enemies have health, and can be killed by touching them
<li>Performance is another 30% faster (should be running OK on most phones now?)
<li>Enemies have a direction indicator (not necessary right now, but it&#8217;ll become important in a later version&#8230;)
</ol>
<h3>Download link</h3>
<p><a href='https://t-machine.org/wp-content/uploads/Chess-Quest-0.4.0.apk'>Chess Quest-0.4.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/21/prototyping-chess-quest-v0-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>16 KB Game Competition (winter 2011) &#8211; Java</title>
		<link>http://t-machine.org/index.php/2011/11/20/16-kb-game-competition-winter-2011-java/</link>
		<comments>http://t-machine.org/index.php/2011/11/20/16-kb-game-competition-winter-2011-java/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 21:15:55 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1754</guid>
		<description><![CDATA[http://www.java-gaming.org/topics/lwjgl16k/25093/view.html &#8220;the LWJGL16k competition starts right here, right now.&#8221; &#8211; Cas The rules First deadline: 25th November 2011 First task: get a black screen running using LWJGL &#8220;you&#8217;ve got 7 days. All I&#8217;m looking for at this stage from you is a blank window opening up and maybe a rotating square or whatever. Of course [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.java-gaming.org/topics/lwjgl16k/25093/view.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.java-gaming.org/topics/lwjgl16k/25093/view.html');">http://www.java-gaming.org/topics/lwjgl16k/25093/view.html</a></p>
<blockquote><p>
&#8220;the LWJGL16k competition starts right here, right now.&#8221; &#8211; Cas
</p></blockquote>
<h4>The rules</h4>
<p>First deadline: 25th November 2011<br />
First task: get a black screen running using LWJGL</p>
<blockquote><p>
&#8220;you&#8217;ve got 7 days. All I&#8217;m looking for at this stage from you is a blank window opening up and maybe a rotating square or whatever. Of course complete games are even more welcome but the idea is to get something shipped.&#8221;
</p></blockquote>
<p>Well, what are you waiting for?</p>
<p>If you&#8217;ve got Eclipse installed, all you need do is download the LWJGL library, copy/paste the 50-line minimal project from the Wiki, and submit your entry!</p>
<p>(I believe Cas is onto a good thing here &#8230; force people to realise how easy it is to make a game if you focus on small-but-visible steps done *quickly* &#8211; No more procrastination!)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/20/16-kb-game-competition-winter-2011-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eventbrite: please un-break your login page</title>
		<link>http://t-machine.org/index.php/2011/11/18/eventbrite-please-un-break-your-login-page/</link>
		<comments>http://t-machine.org/index.php/2011/11/18/eventbrite-please-un-break-your-login-page/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 08:30:46 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Web 0.1]]></category>
		<category><![CDATA[amusing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1751</guid>
		<description><![CDATA[And repeat after me: &#8220;novice web developers should NOT override the Enter key on the keyboard&#8221; (autocomplete fails &#8211; when you hit enter to accept browser-autocomplete, the idiotic untested, badly-written javascript kicks in and deletes the form data)]]></description>
			<content:encoded><![CDATA[<p>And repeat after me:</p>
<blockquote><p>
&#8220;novice web developers should NOT override the Enter key on the keyboard&#8221;
</p></blockquote>
<p>(autocomplete fails &#8211; when you hit enter to accept browser-autocomplete, the idiotic untested, badly-written javascript kicks in and deletes the form data)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/18/eventbrite-please-un-break-your-login-page/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Kongregate: Level = 47</title>
		<link>http://t-machine.org/index.php/2011/11/16/kongregate-level-47/</link>
		<comments>http://t-machine.org/index.php/2011/11/16/kongregate-level-47/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 02:51:29 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[funny]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1749</guid>
		<description><![CDATA[That&#8217;s one higher than Jim Greer. Finally.]]></description>
			<content:encoded><![CDATA[<p>That&#8217;s one higher than <a href="http://www.kongregate.com/accounts/jimgreer" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.kongregate.com/accounts/jimgreer');">Jim Greer</a>.</p>
<p>Finally.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/16/kongregate-level-47/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fixing Suffusion: List posts from a single WordPress category</title>
		<link>http://t-machine.org/index.php/2011/11/15/fixing-suffusion-list-posts-from-a-single-wordpress-category/</link>
		<comments>http://t-machine.org/index.php/2011/11/15/fixing-suffusion-list-posts-from-a-single-wordpress-category/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 19:04:16 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[fixing your desktop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1740</guid>
		<description><![CDATA[UPDATE: So &#8230; it seems Suffusion has (buried deep inside the config) a way of displaying category pages with a higher-level workaround to the WP &#8220;missing feature&#8221;. Although so far I can&#8217;t find a way to set the settings on individual pages (which is what you generally need). So, I&#8217;ll leave this post up &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE: So &#8230; it seems Suffusion has (buried deep inside the config) a way of displaying category pages with a higher-level workaround to the WP &#8220;missing feature&#8221;. Although so far I can&#8217;t find a way to set the settings on individual pages (which is what you generally need). So, I&#8217;ll leave this post up &#8211; it&#8217;s a good starting point for customizing Suffusion&#8217;s page-of-pages (which is also, it seems, how you would customize its Category pages.</p>
<p>Just to be clear, this is not a bug in Suffision, although it&#8217;s an oversight and I hope it&#8217;ll be included in a future version. The core problem is in WordPress: people have been requesting/expecting this feature for the past 5+ years, it&#8217;s pretty basic, but for now the WP folks haven&#8217;t added it.</p>
<h3>Problem: List all the posts in a single category</h3>
<p>This is VERY frequently requested by WP users: you want to have a Page on your site which lists the posts that are in a single Category.</p>
<p>WP has a very low-level way of doing this &#8211; which is very error-prone, hard to maintain (it&#8217;s hard-coded to database ID&#8217;s!), and requires you to break every single theme you own. Every time the theme is updated, you have to manually re-implement the fix!</p>
<p>Fortunately, there&#8217;s a minimal workaround (<a href="http://codex.wordpress.org/Pages" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://codex.wordpress.org/Pages');">which is documented in the WP docs now</a> (scroll to bottom)) which still (!) requires some theme editing.</p>
<p>Fortunately, Suffusion already has most of this workaround implemented, so we can make the fix without screwing around with the theme so much. The source code in Suffusion is almost identical to the sample provided by WP &#8211; but unfortunately it&#8217;s missing a key part. In Suffusion, you CAN list posts on a Page, but you CANNOT filter those posts by category.</p>
<h3>Solution: Combine WP&#8217;s source with Suffusion, with a bit of safety improvement</h3>
<p>So, edit the file &#8220;posts.php&#8221;, titled (in Suffusion): &#8220;Page of Posts&#8221;.</p>
<p>Where it has these lines:</p>
<pre lang="PHP">
$args = array(
	'orderby' => 'date',
	'order' => 'DESC',
	'paged' => $paged,
);
</pre>
<p>&#8230;instead copy/paste the following:</p>
<pre lang="PHP">
$category_exclusive = get_post_meta($posts[0]->ID, 'category', true );

if( $category_exclusive )
{
$cat = get_cat_ID($category_exclusive);
$args = array(
	'category__in' => array( $cat ),
	'orderby' => 'date',
	'order' => 'DESC',
	'paged' => $paged,
);
}
else
{
$args = array(
	'orderby' => 'date',
	'order' => 'DESC',
	'paged' => $paged,
);
}
</pre>
<h3>Usage</h3>
<p>As per WP&#8217;s official suggestion &#8230; if you want a page to filter by category:</p>
<ol>
<li>Edit the page
<li>Select the &#8220;Page of Posts&#8221; template (this is Suffusion specific; in other themes, it might not exist)
<li>Add a &#8220;custom field&#8221; (scroll down on the edit screen), called &#8220;category&#8221;, with a value of the NAME of the category you want to be included
</ol>
<h3>Explanation</h3>
<p>One major thing here: We are being SAFE and non-destructive to the Suffusion theme.</p>
<p>Critically important is that we ONLY do a &#8220;filter by category&#8221; if the Page itself requests it. WP&#8217;s sample code does NOT have this protection (which is why the code above is slightly different).</p>
<p>This means that the rest of Suffusion (which doesn&#8217;t know about our new feature) is unaffected, and works as normal</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/11/15/fixing-suffusion-list-posts-from-a-single-wordpress-category/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prototyping: Chess Quest v0.3</title>
		<link>http://t-machine.org/index.php/2011/10/26/prototyping-chess-quest-v0-3/</link>
		<comments>http://t-machine.org/index.php/2011/10/26/prototyping-chess-quest-v0-3/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 01:49:29 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[devdiary]]></category>
		<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1734</guid>
		<description><![CDATA[(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; original post here) Three major changes: You have a health bar, and can die The trackball is now supported for movement Performance is literally 1.5x &#8211; 2x faster Download link Chess Quest-0.3.3 So, a friend of mine tried it out today, and he couldn&#8217;t move around [...]]]></description>
			<content:encoded><![CDATA[<p>(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; <a href="http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/" >original post here</a>)</p>
<p>Three major changes:</p>
<ol>
<li>You have a health bar, and can die
<li>The trackball is now supported for movement
<li>Performance is literally 1.5x &#8211; 2x faster
</ol>
<h3>Download link</h3>
<p><a href='http://t-machine.org/wp-content/uploads/Chess-Quest-0.3.3.apk'>Chess Quest-0.3.3</a></p>
<p>So, a friend of mine tried it out today, and he couldn&#8217;t move around at all &#8211; something wrong with his HTC Desire (even though I&#8217;ve been testing on near-identical phone, for some reason his phone was losing the input gestures). This evening I did some improvements and fixes until it began to work &#8220;tolerably&#8221; on his phone &#8211; and I threw in some new small features too.</p>
<p>It&#8217;s still test stuff &#8211; not indicative of the final gameplay, but I&#8217;m trying out different basic ways of achieveing the stuff I want to achieve in the later versions.</p>
<h3>Overview of what&#8217;s changed</h3>
<ul>
<li>You have a very basic HUD
<li>There&#8217;s a couple of coloured powerups scattered around &#8211; red restores health, green increases maximum health permanently
<li>Enemies actually kill you now, every moment you&#8217;re touched by one, your health drains continuously
<li>You can choose different levels at the start &#8211; I included one of the early test levels that was easy for me to upgrade with recent changes. I&#8217;ve got another one I can probably add quickly later (one which generates 100% random mazes each time you play)
<li>The ultra-simple EntitySystem I&#8217;m using was running too slow. There&#8217;s no simple fix I can see &#8211; the ES really needs to be written for performance, if I want it to be high performance &#8211; but I was able to do a 10-lines-of-code workaround that took the worst piece of bad performance in my game and made it literally 5 times faster. That&#8217;s good enough for now!
<li>Input system has changed *again* &#8211; the Android OS has poor input management, a bit buggy, with an inconsistent programming API, which *also* runs differently on different phones &#8211; so I keep trying to do as little work on this as possible. The Android OS is desperately trying to prevent me from doing any prototyping at all &#8211; it&#8217;s begging for me to write hundreds of lines of code to make up for Google&#8217;s inattention there &#8211; but if I do that, I will lose all the time I would have spent doing game design and dev, and the whole project will be a failure. So, yet again, I&#8217;m putting on a band-aid and dodging the rest for now. But &#8230; at least now you can use trackball instead of / in addition to swiping on the touchscreen
<li>There&#8217;s an FPS counter on the screen
</ul>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/26/prototyping-chess-quest-v0-3/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>StackOverflow: &#8220;Communal&#8221; development at its best</title>
		<link>http://t-machine.org/index.php/2011/10/25/stackoverflow-communal-development-at-its-best/</link>
		<comments>http://t-machine.org/index.php/2011/10/25/stackoverflow-communal-development-at-its-best/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 23:02:59 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[social networking]]></category>
		<category><![CDATA[startup advice]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1731</guid>
		<description><![CDATA[Someone just wrote this comment on one of my StackOverflow answers: Fundamentally, this question/answer pair is saying: &#8220;Apple: one of your non-programming managers made a stupid mistake in one of your core tools, one used every day by hundreds of thousands of people; since you won&#8217;t fix it, here&#8217;s a (tricky) workaround that anyone can [...]]]></description>
			<content:encoded><![CDATA[<p>Someone just wrote this comment on <a href="http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4/" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4/');">one of my StackOverflow answers</a>:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-10-24-at-23.57.31.png" alt="" title="Screen shot 2011-10-24 at 23.57.31" width="591" height="39" class="alignnone size-full wp-image-1732" /></p>
<p>Fundamentally, this question/answer pair is saying:</p>
<blockquote><p>
&#8220;Apple: one of your non-programming managers made a stupid mistake in one of your core tools, one used every day by hundreds of thousands of people; since you won&#8217;t fix it, here&#8217;s a (tricky) workaround that anyone can use&#8221;
</p></blockquote>
<p>Apple &#8220;doesn&#8217;t do&#8221; anything open, doesn&#8217;t do community support, or community development &#8211; you&#8217;re not even allowed to know if you&#8217;re the first person to report a bug, or the millionth.</p>
<p>But if they did, just imagine how much better their tools would be, and how much more productive the iOS developer community would be&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/25/stackoverflow-communal-development-at-its-best/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prototyping: Chess Quest v0.2</title>
		<link>http://t-machine.org/index.php/2011/10/24/prototyping-chess-quest-v0-2/</link>
		<comments>http://t-machine.org/index.php/2011/10/24/prototyping-chess-quest-v0-2/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 14:00:27 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[devdiary]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1728</guid>
		<description><![CDATA[(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; original post here) A couple more hours work, a few more changes: Overview of what&#8217;s changed Obvious from the screenshot: added alternating black/white background tiles. I want it to feel like the traditional chessboard has become the &#8220;floors&#8221; of the dungeons/towers you&#8217;re exploring Major fixes for [...]]]></description>
			<content:encoded><![CDATA[<p>(I&#8217;m prototyping a new game (working title: &#8220;ChessQuest&#8221;) &#8211; <a href="http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/" >original post here</a>)</p>
<p>A couple more hours work, a few more changes:</p>
<p><a href="https://t-machine.org/wp-content/uploads/chessquest-0.2-ss1.png" ><img src="https://t-machine.org/wp-content/uploads/chessquest-0.2-ss1.png" alt="" title="chessquest-0.2-ss1" width="400" height="240" class="alignnone size-full wp-image-1729" /></a></p>
<h3>Overview of what&#8217;s changed</h3>
<ul>
<li>Obvious from the screenshot: added alternating black/white background tiles. I want it to feel like the traditional chessboard has become the &#8220;floors&#8221; of the dungeons/towers you&#8217;re exploring
<li>Major fixes for collision detection: player and enemies now do pixel-precise collisions (previously, if e.g. a piece moved 5 pixels per tick, it would move either 0 pixels (if 5 would collide) or 5. Now it moves &#8220;as many pixels as it can before the collision happens&#8221;)
<li>Major upgrade to renderering: instead of just &#8220;render everything, in random order&#8221; it now sorts all sprites once per frame. Each sprint is instantiated with a sort-layer; things in the same layer are rendered in random order, but before all things in the next layer
<li>Minor tweaks to movement: not happy with this, but I found the &#8220;never stops moving&#8221; annoying. Now I find the &#8220;stops too easily&#8221; annoying.
<li>Various experiments with zoom level &#8211; I tried 20px, 32px, 64px and 100px (very zoomed in!). I found 32 px was working nicest on the Nexus 1, so I&#8217;ve stuck with that for now. In a future build, I&#8217;ll probably bring back the option to switch to a zoom level of your choice.
<li>Added Flurry: I&#8217;ve never done this with a prototype before, but then I&#8217;ve never prototyped in public :). I&#8217;ve added Flurry just so I can keep track of how many people are running the prototype; as I add to the prototype, I&#8217;ll start adding in-app feedback options, so you can effectively &#8220;vote&#8221; on things you like/dislike, and I&#8217;ll use Flurry to graph it all automatically.
</ul>
<h3>Download link for this version</h3>
<p><a href="http://t-machine.org/wp-content/uploads/Chess-Quest-0.2.apk" >Version 0.2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/24/prototyping-chess-quest-v0-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Game prototype: Chess Quest</title>
		<link>http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/</link>
		<comments>http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 14:41:20 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[computer games]]></category>
		<category><![CDATA[devdiary]]></category>
		<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1717</guid>
		<description><![CDATA[Last weekend, I was playing around with some ideas for a Chess / RPG mashup. I did some prototyping with Android (because iPhone apps can&#8217;t be shared, and Java is much faster to debug than ObjC). If you&#8217;ve got an Android phone, try this, and let me know if it runs: Chess Quest (requires Android [...]]]></description>
			<content:encoded><![CDATA[<p>Last weekend, I was playing around with some ideas for a Chess / RPG mashup. I did some prototyping with Android (because iPhone apps can&#8217;t be shared, and Java is much faster to debug than ObjC).</p>
<p>If you&#8217;ve got an Android phone, try this, and let me know if it runs:</p>
<ul>
<li><a href="https://t-machine.org/wp-content/uploads/Chess-Quest.apk" >Chess Quest (requires Android 2.1 or newer)</a>
<li><a href='https://t-machine.org/wp-content/uploads/Chess-Quest-0.2.apk'>Chess Quest-0.2</a> (small features added)
<li><a href="https://t-machine.org/wp-content/uploads/Chess-Quest-0.3.3.apk" >Chess Quest-0.3.3</a> (you can actually die now, and you can use trackball for input)
<li><a href='https://t-machine.org/wp-content/uploads/Chess-Quest-0.4.0.apk'>Chess Quest-0.4.0</a> (enemies can be killed)
</ul>
<p>There&#8217;s not much you can do &#8211; touch and drag on the screen to move up/down/left/right (you&#8217;re the Rook &#8211; hence no diagonal moves). Bishops and pawns wander around randomly, pawns slower than bishops.</p>
<p>UPDATED: if you rotate the screen sideways, it&#8217;ll randomly pick a different size / zoom level. There&#8217;s four sizes, from 20&#215;20 squares up to 100&#215;100 squares. Player moves at different speeds based on the size too.</p>
<p>I wanted to make it a dungeon-exploration style, but with a Chess theme &#8211; and (like in chess) each time you complete a dungeon (kill the boss) you get to &#8220;pawn&#8221; and switch your character to the chess piece you killed.</p>
<p>i.e. first boss would be the Rook, second the Bishop, third the Knight, etc.</p>
<p>&#8230;but I&#8217;m not sure I&#8217;ll stick with that. If I get some more time this weekend, I&#8217;ll prototype a bit more.</p>
<p>NB: the APK above might run slow &#8211; I&#8217;m interested if it looks jerky / doesn&#8217;t work on your phone. It runs fine on an old Nexus One.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/21/game-prototype-chess-quest/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Is Google&#8217;s mistaken belief in the power of Product killing them?</title>
		<link>http://t-machine.org/index.php/2011/10/20/is-googles-mistaken-belief-in-the-power-of-product-killing-them/</link>
		<comments>http://t-machine.org/index.php/2011/10/20/is-googles-mistaken-belief-in-the-power-of-product-killing-them/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 15:49:22 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[social networking]]></category>
		<category><![CDATA[startup advice]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1715</guid>
		<description><![CDATA[Steve Yegge&#8217;s Google Platforms Rant is not so much a rant as a sign of someone fighting an inappropriate culture. We saw stuff like this a lot at NCsoft when people were trying to turn around the $100 million clusterf*ck that created hundreds of redundancies all the way to director level. It&#8217;s a great article, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://plus.google.com/112678702228711889851/posts/eVeouesvaVX#112678702228711889851/posts/eVeouesvaVX" onclick="javascript:pageTracker._trackPageview('/outbound/article/https://plus.google.com/112678702228711889851/posts/eVeouesvaVX#112678702228711889851/posts/eVeouesvaVX');">Steve Yegge&#8217;s Google Platforms Rant</a> is not so much a rant as a sign of someone fighting an inappropriate culture. We saw stuff like this a lot at NCsoft when people were trying to turn around the <a href="http://t-machine.org/index.php/2009/01/16/we-need-to-talk-about-tabula-rasa-when-will-we-talk-about-tabula-rasa/" >$100 million clusterf*ck that created hundreds of redundancies all the way to director level</a>.</p>
<p>It&#8217;s a great article, but a couple of the key points resonated with my own experience of Google UK&#8217;s hiring practices a couple of years ago. There was clearly a lot wrong with the internal culture, but as an outsider I couldn&#8217;t quite put my finger on it. Here&#8217;s the crux of Steve&#8217;s post (but seriously &#8211; read the whole thing, it&#8217;s rich and meaty):</p>
<blockquote><p>
That one last thing that Google doesn&#8217;t do well is Platforms. We don&#8217;t understand platforms. We don&#8217;t &#8220;get&#8221; platforms. Some of you do, but you are the minority. This has become painfully clear to me over the past six years. I was kind of hoping that competitive pressure from Microsoft and Amazon and more recently Facebook would make us wake up collectively and start doing universal services. Not in some sort of ad-hoc, half-assed way, but in more or less the same way Amazon did it: all at once, for real, no cheating, and treating it as our top priority from now on.</p>
<p>But no. No, it&#8217;s like our tenth or eleventh priority. Or fifteenth, I don&#8217;t know. It&#8217;s pretty low. There are a few teams who treat the idea very seriously, but most teams either don&#8217;t think about it all, ever, or only a small percentage of them think about it in a very small way.</p>
<p>It&#8217;s a big stretch even to get most teams to offer a stubby service to get programmatic access to their data and computations. Most of them think they&#8217;re building products. And a stubby service is a pretty pathetic service. Go back and look at that partial list of learnings from Amazon, and tell me which ones Stubby gives you out of the box. As far as I&#8217;m concerned, it&#8217;s none of them. Stubby&#8217;s great, but it&#8217;s like parts when you need a car.
</p></blockquote>
<p>&#8230;and finally, reading that, it clicked for me what I saw that was so wrong:</p>
<h3>Google has forgotten what a Product is</h3>
<p>&#8220;It&#8217;s a big stretch even to get most teams to offer a stubby service to get programmatic access to their data and computations. Most of them think they&#8217;re building products.&#8221;</p>
<p>That pair of sentences, back to back, is the problem: people outside Google would put the word &#8220;except&#8221; in between. Googlers put the word &#8220;because&#8221; in between. Google&#8217;s cultural definition of Product has got lost and perverted somewhere along the way, and now looks and smells like the real thing but is &#8211; to the rest of the world &#8211; a fake. Except Google &#8211; internally &#8211; can&#8217;t see this.</p>
<p>Every Googler I talked to worshipped at the altar of Product-as-King; three quarters of them would then &#8211; even in the same sentence &#8211; admit that they hated Product, didn&#8217;t believe in it, and felt it was a waste of time &#8212; &#8220;get out of my face with your product BS, and let me write beautiful code in my Ivory Towers, and leave me alone&#8221;.</p>
<p>They were smart people; they never said this explicitly (although one came very close &#8211; and you could see the moment when he had the thought: &#8220;oh crap; if anyone else hears I said that&#8230;&#8221;, then backtracked very hastily) &#8211; instead they frequently said mutually conflicting things, and dressed them up in enough abstractions that you could pretend that they weren&#8217;t conflicting. They were very good at it &#8211; I could tell there was a crack, but I couldn&#8217;t work out where the fault-line lay.</p>
<h3>Google&#8217;s illusions of Product</h3>
<p>As Steve puts it later on:</p>
<blockquote><p>
Google+ is a prime example of our complete failure to understand platforms from the very highest levels of executive leadership (hi Larry, Sergey, Eric, Vic, howdy howdy) down to the very lowest leaf workers (hey yo). We all don&#8217;t get it. The Golden Rule of platforms is that you Eat Your Own Dogfood. The Google+ platform is a pathetic afterthought. We had no API at all at launch, and last I checked, we had one measly API call. One of the team members marched in and told me about it when they launched, and I asked: &#8220;So is it the Stalker API?&#8221; She got all glum and said &#8220;Yeah.&#8221; I mean, I was joking, but no&#8230; the only API call we offer is to get someone&#8217;s stream. So I guess the joke was on me.
</p></blockquote>
<p>Product. Platform. Since when have those been mutually exclusive? Not in this Millennium, I believe&#8230;</p>
<p>And even when Google gets over their hatred of Platform, even with something as simple as the pixels that their apps put on screen, they&#8217;ve jumped the shark:</p>
<blockquote><p>
You know how people are always saying Google is arrogant? I&#8217;m a Googler, so I get as irritated as you do when people say that. We&#8217;re not arrogant, by and large. </p>
<p>But when we take the stance that we know how to design the perfect product for everyone, and believe you me, I hear that a lot, then we&#8217;re being fools. You can attribute it to arrogance, or naivete, or whatever &#8212; it doesn&#8217;t matter in the end, because it&#8217;s foolishness. There IS no perfect product for everyone.</p>
<p>And so we wind up with a browser that doesn&#8217;t let you set the default font size. Talk about an affront to Accessibility. I mean, as I get older I&#8217;m actually going blind. For real. I&#8217;ve been nearsighted all my life, and once you hit 40 years old you stop being able to see things up close. So font selection becomes this life-or-death thing: it can lock you out of the product completely. But the Chrome team is flat-out arrogant here: they want to build a zero-configuration product, and they&#8217;re quite brazen about it, and Fuck You if you&#8217;re blind or deaf or whatever. Hit Ctrl-+ on every single page visit for the rest of your life.</p>
<p>It&#8217;s not just them. It&#8217;s everyone.
</p></blockquote>
<p>Any genuine Product person would run screaming from that situation &#8211; there&#8217;s nothing salvageable. It&#8217;s like someone coming to you with their design for a chocolate teapot: &#8220;Once you&#8217;ve had your tea, you can have a tasty chocolate treat too!&#8221;, leaving you wondering: where do I even start with trying to explain to this person what they&#8217;re missing?</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/20/is-googles-mistaken-belief-in-the-power-of-product-killing-them/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>D&amp;D on Facebook</title>
		<link>http://t-machine.org/index.php/2011/10/13/dd-on-facebook/</link>
		<comments>http://t-machine.org/index.php/2011/10/13/dd-on-facebook/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 12:08:04 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1708</guid>
		<description><![CDATA[Step 1 follow link Step 2 app demands your date of birth, for no reason (one day &#8230; Facebook will stop being so ridiculous about this, and give the user power, rather than the advertisers. One day&#8230;) Step 3 app fails to install (having taken your private data) Step 4: tell them what to do [...]]]></description>
			<content:encoded><![CDATA[<h3>Step 1</h3>
<p>follow link</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-10-13-at-13.00.41-300x122.png" alt="" title="Screen shot 2011-10-13 at 13.00.41" width="300" height="122" class="aligncenter size-medium wp-image-1709" /></p>
<h3>Step 2</h3>
<p>app demands your date of birth, for no reason (one day &#8230; Facebook will stop being so ridiculous about this, and give the user power, rather than the advertisers. One day&#8230;)</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-10-13-at-13.01.52.png" alt="" title="Screen shot 2011-10-13 at 13.01.52" width="423" height="289" class="aligncenter size-full wp-image-1710" /></p>
<h3>Step 3</h3>
<p>app fails to install (having taken your private data)</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-10-13-at-13.00.21.png" alt="" title="Screen shot 2011-10-13 at 13.00.21" width="510" height="108" class="aligncenter size-full wp-image-1711" /></p>
<h3>Step 4: tell them what to do with it</h3>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-shot-2011-10-13-at-13.01.15.png" alt="" title="Screen shot 2011-10-13 at 13.01.15" width="675" height="211" class="aligncenter size-full wp-image-1712" /></p>
<p>Bye-bye!</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/13/dd-on-facebook/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The FAILtrepreneur?</title>
		<link>http://t-machine.org/index.php/2011/10/12/the-failtrepreneur/</link>
		<comments>http://t-machine.org/index.php/2011/10/12/the-failtrepreneur/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 14:32:23 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[startup advice]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1704</guid>
		<description><![CDATA[Here&#8217;s a new term: The FAILtrepreneur FAILtrepreneur def: someone who tries to be an Entrepreneur, and takes advantage of lots of things intended to &#8220;help&#8221; them be a success, but somehow finds each &#8220;help&#8221; pushes them further and further into mediocrity and the failure of their business. Then they go work for a management consultancy; [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a new term: The FAILtrepreneur</p>
<blockquote><p>
<i><br />
FAILtrepreneur</p>
<p>def: someone who tries to be an Entrepreneur, and takes advantage of lots of things intended to &#8220;help&#8221; them be a success, but somehow finds each &#8220;help&#8221; pushes them further and further into mediocrity and the failure of their business. Then they go work for a management consultancy; they have great stories to tell about their jolly jaunty time playing at being an Entrepreneur</i>
</p></blockquote>
<h3>What &#8220;business-people&#8221;, consultants, politicians etc tend to  think Entrepeneurs need</h3>
<p>Time and again, these people think they&#8217;re &#8220;helping&#8221;. They never stop to think about what their assumptions say about themselves &#8211; and how little they say about Entrepreneurs.</p>
<p>Typically, they believe that startup-founders-to-be need:</p>
<ol>
<li>An office &#8211; &#8220;rent is too expensive for poor people!&#8221;
<li>Tax breaks &#8211; &#8220;my biggest financial worry each year is my personal tax bill. And it would be the same if I started a new company. I&#8217;d get taxed on my £500k profits straight away, after taking all that risk! That&#8217;s why I don&#8217;t do it. Other people must feel the same!&#8221;
<li>Income guarantees &#8211; &#8220;startups are risky &#8211; you can spend years running a startup, and not be able to contribute to your mortgage and your pension. No-one would dare skimp their Mortgage and Pension!&#8221;
<li>Opportunity &#8211; &#8220;I always feel I could have done more in this world, if only I&#8217;d been running my own company. Look at how successful I&#8217;ve been, working for others &#8211; and imagine what I&#8217;d have achieved with my intelligence/contacts/business skills if I&#8217;d been running the show!&#8221;
<li>Contacts &#8211; &#8220;I hate it when startups talk to me, they&#8217;re useless to my career, and they&#8217;re so likely to fail they&#8217;ll probably make me look bad when they blow all our money. I would never trust them / sign a deal with them. So it must be really hard for them to talk to / meet other companies, potential partners and investors!&#8221;
<li>Confidence &#8211; &#8220;To be honest, I&#8217;m terrified of starting a company &#8211; God! it must be so awful! &#8211; if it fails, it&#8217;ll all be my fault, and everyone will finally realise what a talentless hack I am!&#8221;
</ol>
<h3>What DOESN&#8217;T an Entrepreneur want?</h3>
<p>The last thing that Entrepreneurs need &#8211; the very last thing &#8211; is to be given handouts or to be patronized.</p>
<p>Being an Entrepreneur is *all about* starting from an inferior position and not just out-doing everyone else, but positively eclipsing them.</p>
<p>The idea that they need &#8220;a leg up&#8221; or &#8220;handouts&#8221; is laughable &#8211; all it does is re-enforce the qualities and expectations that the Entrepreneur needs to avoid.</p>
<h3>What does an Entrepreneur really need?</h3>
<p>Resource; specifically: whatever resource they cannot manufacture for themselves, out of thin air.</p>
<p>Ultimately, a great Entrepreneur is someone who sees opportunities, leaps on them, knocks them to the ground, and exploits the heck out of them.</p>
<p>If they can do that, normally they can magic-up whatever else they need. But there&#8217;s often a couple of needs that prove slightly too overwhelming:</p>
<ol>
<li>Time &#8211; a lot of the time, an Entrepreneur misjudges an opportunity. Given time, they can usually bend it into a new opportunity &#8211; or adjust their own spending to fit the potential profit. Often, they run out of time before they finish that.
<li>Cash &#8211; &#8220;running out of cash before our profit comes in&#8221; is really the only thing that kills startups
<li>Staff &#8211; cash often kills startups because the first thing you lose is your staff. Everything else is negotiable (deadlines, suppliers, tax, creditors, etc) &#8211; but people need money to live, and you can&#8217;t negotiate with &#8220;hunger&#8221; or &#8220;I have to pay my rent&#8221;.
</ol>
<p>Everything else is fluff:</p>
<ol>
<li>Office space &#8211; have you ever heard of a startup that failed because &#8220;we didn&#8217;t have an office&#8221;? Of course not &#8211; that would be stunningly pathetic &#8211; like saying: &#8220;we failed because my pen ran out of ink, so I could never sign any more contracts. Ever.&#8221;
<li>Tax &#8211; to a startup founder, their concept of &#8220;success&#8221; is making so much money that they&#8217;ll be *proudly* paying $1 million / year in tax &#8211; and not sweating it. People who fail &#8230; never earn enough to pay tax in the first place (something many rich people forget is possible). In the end, it&#8217;s only the people in corporate jobs that worry about tax&#8230;
<li>Income guarantees &#8211; to say to a startup founder that they need something to offset lost income is to say: &#8220;I believe you will fail&#8221;. If you&#8217;re building a multi-million-dollar company of which you own &#8211; at minimum &#8211; 50% of the company, you really couldnt&#8217; care less about &#8220;salary&#8221;. You&#8217;ll be a multi-millionaire just from your shares (and not a paper one: a real one. Because you&#8217;re one of the few people who will be legally able to sell them)
<li>Opportunity &#8211; what? Do you even know what &#8220;entrepreneur&#8221; means?
<li>Contacts &#8211; every (legal) business needs to sell something. Selling requires finding people and persuading them to give you money that is MORE than the cost of the thing you&#8217;re giving them. If you&#8217;re able to do that &#8230; how could &#8220;contacts&#8221; ever be a challenge for you? If you&#8217;re NOT able to do that &#8230; you are guaranteed to fail anyway
<li>Confidence &#8211; an Entrepreneur is confident almost by definition &#8211; you don&#8217;t become a fledling Entrepreneur until the day you leave behind your un-confidence. If you don&#8217;t have a vision, and self-belief, you haven&#8217;t even started yet.
</ol>
<h3>Concrete suggestions for helping Entrepreneurs</h3>
<h4>1. Give salary guarantees to the employees, not the founders</h4>
<h4>2. Cash (but here be dragons: so many ways to do this badly, so few to do it well!)</h4>
<p>(this would need a series of posts just to summarise the successes and failures to date &#8211; and I believe the professional investors of this world are doing a pretty good job already via the VC blogs, the Angel blogs, VentureHacks, etc)</p>
<h4>3. Give cash to failed startups who can explain how they&#8217;re salvaging their failure</h4>
<p>Professional investors won&#8217;t touch a small failed business with a bargepole (usually).</p>
<p>Not because there&#8217;s no profit there &#8211; there manifestly IS profit there &#8211; but because the potential upside has been given a glass ceiling, and they&#8217;re not interested in &#8220;small but steady profit&#8221;.</p>
<p>Fair enough; but that leaves a gulf where someone else could step in. If the businesses that failed are big enough, then professional investors are happy to be involved &#8211; the money becomes enough to excite them. It&#8217;s when they&#8217;re small that there&#8217;s a black hole.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/12/the-failtrepreneur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum: I added a feature to my game, but it&#8217;s 5% broken</title>
		<link>http://t-machine.org/index.php/2011/10/10/scrum-i-added-a-feature-to-my-game-but-its-5-broken/</link>
		<comments>http://t-machine.org/index.php/2011/10/10/scrum-i-added-a-feature-to-my-game-but-its-5-broken/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 12:13:28 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=1701</guid>
		<description><![CDATA[With Scrum, you&#8217;re constantly focussing on: How does the application look / work for the user *right now*? &#8230;to the extent that you care more about &#8220;does this feature work for the user?&#8221; than &#8220;is the code/art/architecture for this feature ideal?&#8221;. &#8220;It&#8217;s not done&#8221; &#8230; &#8220;but it looks done!&#8221; We regularly get situations where a [...]]]></description>
			<content:encoded><![CDATA[<p>With Scrum, you&#8217;re constantly focussing on:</p>
<p>How does the application look / work for the user *right now*?</p>
<p>&#8230;to the extent that you care more about &#8220;does this feature work for the user?&#8221; than &#8220;is the code/art/architecture for this feature ideal?&#8221;.</p>
<h3>&#8220;It&#8217;s not done&#8221; &#8230; &#8220;but it looks done!&#8221;</h3>
<p>We regularly get situations where a feature *appears* to work, to a casual observer &#8211; but on deeper inspection, it&#8217;s clearly broken in one or more significant ways. Sometimes, the &#8220;broken&#8221; parts are so obscure that you&#8217;d need help to even find them. Other times, they&#8217;re obvious if you try to to use the feature more than just once or twice.</p>
<p>In Scrum terms, it&#8217;s pretty clear what&#8217;s gone wrong: the Product Owner didn&#8217;t describe the feature clearly enough (they implicitly included functionality they didn&#8217;t really care about, &#8230; or they described it too vaguely to be implemented well).</p>
<p>Scrum&#8217;s in-built check/balance against that is the Team. The developer who adopted the task should have rejected it during the Planning meeting, should have insisted on a clearer User Story (or a more explicit feature description).</p>
<p>But in the real world, this stuff happens. Leaving the issue: What do you do next?</p>
<h3>One technique: Divide and Conquer</h3>
<p>Here&#8217;s an approach I&#8217;ve been experimenting with recently.</p>
<p>When it happens, you split the feature description in half, re-defining one half as the part which is done + working, and the other half as the part which isn&#8217;t working. Or into 3, 4, etc &#8211; if there&#8217;s multiple &#8220;player visible&#8221; ways in which it&#8217;s not working.</p>
<p>This seems to work pretty well &#8211; it lets us independently prioritise &#8220;the bit we&#8217;ve already got (hence: zero extra dev cost)&#8221; and &#8220;the hard stuff that&#8217;s not working&#8221;. And quite often, we end up redesigning some other part in a way that makes the broken edge-cases no longer exist &#8211; so we never need to fix them.</p>
<p>&#8230;but I&#8217;m still experimenting with it. I&#8217;m sure we could do our Planning meetings better &#8211; both from the PO side (more detailed descriptions, more PO planning) and/or from the developer side (more questioning, demands for more detail).</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2011/10/10/scrum-i-added-a-feature-to-my-game-but-its-5-broken/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

