<?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>Fri, 24 May 2013 23:00:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Creating real-time Mirrors in Unity Free (attempt 2)</title>
		<link>http://t-machine.org/index.php/2013/05/24/creating-real-time-mirrors-in-unity-free-attempt-2/</link>
		<comments>http://t-machine.org/index.php/2013/05/24/creating-real-time-mirrors-in-unity-free-attempt-2/#comments</comments>
		<pubDate>Fri, 24 May 2013 22:16:28 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Unity3D]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2401</guid>
		<description><![CDATA[OK, a completely different approach this time (based on the &#8220;new technique for Render to Texture&#8221; that I mentioned last time). And it works a lot better &#8211; lighting, shaders, etc is all there for free (but something is wrong with the side-to-side) Note: The player model is a green cube &#8220;head&#8221; that can rotate [...]]]></description>
				<content:encoded><![CDATA[<p>OK, a completely different approach this time (based on the &#8220;new technique for Render to Texture&#8221; that <a href="http://t-machine.org/index.php/2013/05/18/mirrors-in-unity-free-version-almost-works/">I mentioned last time</a>). And it works <strong>a lot</strong> better &#8211; lighting, shaders, etc is all there for free (but something is wrong with the side-to-side)</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/ymEowbNtufE" frameborder="0" allowfullscreen></iframe></p>
<p><span id="more-2401"></span></p>
<p>Note:</p>
<ol>
<li>The player model is a green cube &#8220;head&#8221; that can rotate up/down, and a blue cube body that can rotate left/right
<li>ALL LIGHTING ETC IS CORRECT, without needing to do anything
<li>when I&#8217;m looking at center of miror &#8211; from any angle &#8211; it appears 100% correct
</ol>
<h3>What&#8217;s still wrong here&#8230;</h3>
<p>I don&#8217;t understand why the mirror is wrong when you look away from the center. My best guess is that it&#8217;s something to do with Unity&#8217;s crappy (*) &#8220;Plane&#8221; class, that I&#8217;m using to answer the question &#8220;Where does line L intersect with plane P?&#8221;.</p>
<pre class="brush: csharp; title: ; notranslate">
Ray rayToMirror = new Ray( objectBeforeMirror.transform.position, objectBeforeMirror.transform.forward );
planeOfMirror.Raycast( rayToMirror, out intersectionDistance );
Vector3 hitPoint = rayToMirror.GetPoint( intersectionDistance );
transform.LookAt( hitPoint );
</pre>
<h3>How are you doing this?</h3>
<p>In pseudo terms, because this is the most interesting bit, here&#8217;s what I did:</p>
<ol>
<li>Create a &#8220;mirror&#8221; plane in Unity
<li>Duplicate your main camera
<li>Remove EVERY COMPONENT from the duped camera (you only want the camera itself)
<li>Attach a mini script that moves the duped camera to the opposite side of the mirror, and re-positions it based on main-camera&#8217;s position &#8230; every frame
<li>Attach a tiny 1-line &#8220;DepthMask&#8221; Shader to the &#8220;mirror&#8221; so that it will &#8220;cut-out&#8221; of the game-world
<li>Set your camera &#8220;depths&#8221; so that main camera is rendered last (depth = 1), dupe camera is first (depth=0)
<li>Set your main camera to STOP clearing the screen every frame (set clear mode to &#8220;Depth&#8221;)
<li> &#8230; et voila!
</ol>
<h3>Why are you doing this?</h3>
<p>Because I can. And because: I&#8217;m planning an exciting game project where I&#8217;ll be hacking apart the whole of Unity&#8217;s rendering system to do as many weird tricks as I can. Stuff like this is helping me to learn how Unity abstracts the GL/D3D rendering &#8211; and what I can get away with.</p>
<div style="background: #beb; border: thin gray solid; margin: 50px; text-align: center">
<form class="sml_subscribe" method="post"><input class="sml_hiddenfield" name="sml_subscribe" type="hidden" value="1"><input class="sml_hiddenfield" name="mailinglist" type="hidden" value="deathmatch-dungeon-pre"/><p class="prepend">If you're interested in the game I'm making - Deathmatch Dungeon - enter your email here and I'll contact you when I have some progress to share</p><p class="sml_email"><label class="sml_emaillabel" for="sml_email">Email:</label><input class="sml_emailinput" name="sml_email" placeholder="Email Address..." type="text" value=""></p><p class="sml_submit"><input name="submit" class="btn sml_submitbtn" type="submit" value="Submit"></p></form>
</div>
<p>And &#8230; it&#8217;s an interesting exercise just to see if I can do it at all &#8211; simply and high performance &#8211; without using RenderTexture (Unity&#8217;s implementation of Render to Texture)).</p>
<p>Of course, you should just buy Unity Pro instead; it has MANY improvements (including R-to-T).</p>
<h3>My scripts so far</h3>
<h4>Move the duped camera &#8211; every frame &#8211; to opposite side of mirror</h4>
<p>From: <a href="http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Mirrors">http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Mirrors</a></p>
<p>NB: I have *heavily modified* the original &#8211; it did something weird with negative scales, and it got rotations mixed-up. I had to get the rotations precisely correct to make mine work, so &#8230; the rotations bit is different here.</p>
<pre class="brush: csharp; title: ; notranslate">
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class MirrorMirrifyObject : MonoBehaviour
{
	public GameObject objectBeforeMirror;
	public GameObject mirrorPlane;
	
	void Update ()
	{
		if (null != mirrorPlane) {
			if (null != objectBeforeMirror) {
				transform.position = objectBeforeMirror.transform.position;
				transform.rotation = objectBeforeMirror.transform.rotation;
 
				Vector3 positionInMirrorSpace = mirrorPlane.transform.InverseTransformPoint( objectBeforeMirror.transform.position );
				
				positionInMirrorSpace.y = -positionInMirrorSpace.y;
								
				transform.position = mirrorPlane.transform.TransformPoint( positionInMirrorSpace );
				
				/** object is now in correct position, but looking in parallel look direction to original */
				/* So, cast a ray from the original object along look-direction until you hit the plane,
				 * then make the cloned object &quot;look at&quot; that position */
				Vector3 mirrorsNormal = mirrorPlane.transform.localRotation * new Vector3( 0f, 1, 0f ); // Unity planes always start with normal pointing up
				Plane planeOfMirror = new Plane(  mirrorsNormal, mirrorPlane.transform.position );
				float intersectionDistance;
				Ray rayToMirror = new Ray( objectBeforeMirror.transform.position, objectBeforeMirror.transform.forward );
				planeOfMirror.Raycast( rayToMirror, out intersectionDistance );
				Vector3 hitPoint = rayToMirror.GetPoint( intersectionDistance );
				
				transform.LookAt( hitPoint );
			}
		}
	}
}
</pre>
<h4>Shader that makes an object &#8220;cut-out&#8221; a hole in the camera (depth-mask)</h4>
<p>From: <a href="http://wiki.unity3d.com/index.php?title=DepthMask">http://wiki.unity3d.com/index.php?title=DepthMask</a></p>
<p>NB: I tried some alternative versions of this that didn&#8217;t work<br />
NB: *I have modified the original*. If you look at theirs, they do NOT want it to obscure the entire scene, but I did, so see how I moved it slightly higher in the render-queue&#8230;</p>
<pre class="brush: cpp; title: ; notranslate">
Shader &quot;Custom/DepthMask&quot; {
 
	SubShader {
		// Render the mask BEFORE regular geometry, AND ALSO before masked geometry and
		// transparent things.
 
		Tags {&quot;Queue&quot; = &quot;Geometry-10&quot; }
 
		// Don't draw in the RGBA channels; just the depth buffer
                // ADAM: causes it to mask-out that part of the screen, and
                //       no further rendering will happen there
 
		ColorMask 0
		ZWrite On
 
		// Do nothing specific in the pass:
 
		Pass {}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/24/creating-real-time-mirrors-in-unity-free-attempt-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All you need to know about the new Xbox One, in a single picture</title>
		<link>http://t-machine.org/index.php/2013/05/21/all-you-need-to-know-about-the-new-xbox-one-in-a-single-picture/</link>
		<comments>http://t-machine.org/index.php/2013/05/21/all-you-need-to-know-about-the-new-xbox-one-in-a-single-picture/#comments</comments>
		<pubDate>Tue, 21 May 2013 19:27:49 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games industry]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2398</guid>
		<description><![CDATA[http://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/970105_610268872319582_1123059051_n.png]]></description>
				<content:encoded><![CDATA[<p><a href="http://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/970105_610268872319582_1123059051_n.png">http://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/970105_610268872319582_1123059051_n.png<br />
<img src="http://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc3/970105_610268872319582_1123059051_n.png"/><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/21/all-you-need-to-know-about-the-new-xbox-one-in-a-single-picture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mirrors in Unity Free version &#8211; almost works</title>
		<link>http://t-machine.org/index.php/2013/05/18/mirrors-in-unity-free-version-almost-works/</link>
		<comments>http://t-machine.org/index.php/2013/05/18/mirrors-in-unity-free-version-almost-works/#comments</comments>
		<pubDate>Sat, 18 May 2013 22:29:58 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[Unity3D]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2383</guid>
		<description><![CDATA[UPDATE: see end of post for another idea&#8230; One of the ways they make you buy Unity Pro is gimping the non-Pro version by taking away Stencil Buffer and Render-to-Texture (needed for &#8230; many (most?) of the truly interesting effect you can think of). Except &#8230; it&#8217;s only needed by old-school OpenGL programmers, because everything [...]]]></description>
				<content:encoded><![CDATA[<p>UPDATE: see end of post for another idea&#8230;</p>
<p>One of the ways they make you buy Unity Pro is gimping the non-Pro version by taking away Stencil Buffer and Render-to-Texture (needed for &#8230; many (most?) of the truly interesting effect you can think of). Except &#8230; it&#8217;s only needed by old-school OpenGL programmers, because everything RtT does can be mimicked in Shaders. Stencils &#8230; maybe also?</p>
<p>Anyway, I&#8217;m working on a hobby project and don&#8217;t need or want the Pro version for now (I&#8217;d like to support Unity, but these days the jump in price is way too expensive, at $X000 (they price-gouge you if you&#8217;re purchasing from within EU) for a simple hobby project). If/when we&#8217;re using it at work, and I have lots of cash, sure &#8211; but for now: can&#8217;t find that much money.</p>
<p>For the most part, I&#8217;m happy to go without RtT for now &#8211; generally speaking, hobby projects don&#8217;t &#8220;need&#8221; those kind of effects (and if they do: maybe it&#8217;s not a hobby any more?). There&#8217;s just one exception: reflections.<br />
<span id="more-2383"></span></p>
<h2>Reflections</h2>
<p>Reflections are one of 3D&#8217;s reasons to exist: they are simple, and powerful, and easy to use, and they entirely rely upon Render to Tex .. &#8211; oh, crap.</p>
<p>But I&#8217;ve been using <a href="http://en.wikibooks.org/wiki/GLSL_Programming/Unity/Mirrors">this awesome free online book about writing GLSL shaders in Unity</a> and one of the interesting sections is about demonstrating that a GLSL shader can simulate a combination of RtT and Stencils. The GLSL code is very simple, if you know GLSL already it&#8217;s just a bit odd getting your head around the &#8220;special&#8221; way that Unity requires you to write your code (and note: some of the variable names are &#8220;magic&#8221;: hard-coded into Unity with bonus features).</p>
<p>They use the standard starting point of cloning each of your objects to make a &#8220;mirrored&#8221; object that you can render in the &#8220;mirror universe&#8221;. Then they do a neat trick with simulating a stencil buffer, and simulating RtT through some shader-render-order fun and games. Unfortunately, it doesn&#8217;t work: In Unity 3.x, the objects &#8220;inside the mirror&#8221; still appear outside it, if you walk around behind it: this is the point of what the mirror was supposed to prevent (and it so nearly works &#8211; Unity renders the &#8220;behind&#8221; objects with a strange alpha-effect that makes me wonder if it&#8217;s a built-in anti-Free-version hack, or if there&#8217;s something odd about the default cameras)</p>
<p>The book&#8217;s sample code does this:</p>
<ol>
<li>Javascript that makes any &#8220;reflected&#8221; object track its peer object (so long as they both have meshRenderers)
<li>Shader for the mirror itself to do cool and clever stuff
<li>Shader (very simplistic) for the &#8220;reflected&#8221; objects to render them &#8220;inside the mirror but not outside&#8221; (which doesn&#8217;t quite work, as noted above)
</ol>
<p>I had to add a few things to use this in practice:</p>
<ol>
<li>Convert the script to C#, so I get auto-completion when referencing it
<li>Write some recursive methods to add the script + its parameters to the cloned Player object when player comes near mirror
<li>Write some recursive methods to DESTROY EVERY COMPONENT on the &#8220;cloned&#8221; player, except for: MeshFilter, MeshRenderer (otherwise your mouselook script, your physics RigidBody etc all exist on the clone, and weird and insane freaky sh*t goes down)
<li>Modify the simple &#8220;reflected objects&#8221; shader to support standard texture map
<li>Add a post-attach method that when you mirror a dynamic object (e.g. the player) it grabs the texture from the original and assigns it to the bonus paramter on the mirrored-object shader (the book sample just gave mirrored objects a single colour)
</ol>
<h2>Does it work?</h2>
<p>Well, almost. Very nearly.</p>
<p>All of which is great, except for two major bugs:</p>
<ol>
<li>the bizarre semi-transparent colour of objects if you walk behind the mirror (e.g. if another room in your building lies behind the mirror) &#8211; they shouldn&#8217;t be rendering at all, and I&#8217;ve double-checked the book&#8217;s approach, it all looks like it should work fine to me (or: not at all. Not &#8220;partly work&#8221;) :(
<li>the render-order for items in the mirror is FUBAR. They occlude each other back-to-front based on some weird algorithm. The back-to-front occlusion is part of the magic, IIRC, but &#8230; it seems to go wrong in the final render :(
</ol>
<p>For now, since this is a hobby project, I&#8217;ve removed everything from the mirror-universe except the player. So these are mirrors that don&#8217;t show the room you&#8217;re in &#8211; they only show you! Looks a bit sucky, but is good enough for now.</p>
<p>If I find a way to fix the bugs, it would be great. Nowhere near as neat (or as performant!) a solution as getting Unity Pro (which I&#8217;d certainly encourage you to buy instead of using this poor-man&#8217;s approach), but plenty good enough for me to continue my hobbying&#8230;</p>
<h2>UPDATE: a new technique for Render to Texture</h2>
<p>I kicked myself <a href="http://answers.unity3d.com/questions/421450/how-can-i-render-a-scene-to-a-surface.html#answer-444650">when I saw this, which is a pretty obvious way of simulating RtT</a>. I&#8217;m already doing various tricks with multiple, overlapping cameras &#8211; so why didn&#8217;t I think of this?</p>
<p>Although I fully understand all the techniques above (and can easily write them from scratch), I *don&#8217;t* understand how the occlusion is being simulated/dissimulated via the shaders &#8212; because if I did, I&#8217;d have tried this:</p>
<ol>
<li>Create a slave-cam in mirror-world (I&#8217;ve already written the script to create a slave-player in mirror-world &#8211; doing the same with camera is trivial)
<ul>
<li>&#8230;in Update(), slave-cam re-sets its absolute position to be the opposite side of the mirror to player-cam, taking into account player-cam&#8217;s current/new position</ul>
<li>Draw slave-cam AND player-cam, both full-screen, but depth-sorted (set the camera.depth) so slave-cam is beneath (lower depth number)
<ul>
<li>&#8230;yes, Unity has &#8220;depth&#8221; upside-down, the variable should be called &#8220;height&#8221;</ul>
<li>On slave-cam, &#8220;dis-render&#8221; everything on slave-cam&#8217;s side of the mirror (disable occlusion entirely)
<li>On slave-cam, &#8220;dis-render&#8221; the mirror itself (so you can see through it!)
<li>On player-cam, cut-out (using the link above) the area where mirror appears on-screen, so that slave-cam&#8217;s view shows through
</ol>
<p>As a thought-experiment, that Just Works. Which probably means it&#8217;s fundamentally wrong somehow ;). Sadly, I&#8217;m out of time for working on this now (remember: hobby project), and I don&#8217;t want to spend more time faffing with mirrors, but to anyone else interested, I&#8217;d say this technique is definitely worth a try.</p>
<h2>UPDATE 2: a new way</h2>
<p>I&#8217;ve had partial success with <a href="http://t-machine.org/index.php/2013/05/24/creating-real-…free-attempt-2/">a modified version of the above technique</a>. See that post for details (it took fewer steps than I expected, in some ways)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/18/mirrors-in-unity-free-version-almost-works/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: Add logo top right in Twenty-Twelve theme</title>
		<link>http://t-machine.org/index.php/2013/05/18/wordpress-add-logo-top-right-in-twenty-twelve-theme/</link>
		<comments>http://t-machine.org/index.php/2013/05/18/wordpress-add-logo-top-right-in-twenty-twelve-theme/#comments</comments>
		<pubDate>Sat, 18 May 2013 14:53:16 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>
		<category><![CDATA[server admin]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2376</guid>
		<description><![CDATA[I&#8217;m not sure why, but out-of-the-box, WordPress&#8217;s excellent TwentyTwelve theme prevents you from putting anything in the (empty!) top-right area of the page. It&#8217;s a great place for a &#8220;contact&#8221; link or similar (and check out the Suffusion theme to see how many widget areas a good WP theme ought to have&#8230;). What&#8217;s preventing it? [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m not sure why, but out-of-the-box, WordPress&#8217;s excellent TwentyTwelve theme prevents you from putting anything in the (empty!) top-right area of the page. It&#8217;s a great place for a &#8220;contact&#8221; link or similar (and check out the Suffusion theme to see how many widget areas a good WP theme ought to have&#8230;).<br />
<span id="more-2376"></span></p>
<h2>What&#8217;s preventing it?</h2>
<p>After a little exploration, I found that the H1 tag is inheriting a:</p>
<pre class="brush: css; title: ; notranslate">
clear:both;
</pre>
<p>although this didn&#8217;t show up in Chrome&#8217;s CSS inspector (hmm&#8230;). Anyway, the fix was quite simple:</p>
<ol>
<li>From WP dashboard, go: Appearance -%gt; Editor
<li>Select the &#8220;<strong>Header</strong>(header.php)&#8221; file
<li>near the top, find the &#8220;&lt;hgroup&gt;    &lt;h1&gt;&#8221; part
<li>in the h1 tag, append an override to get rid of the clear:
<ul>
<li>&#8220;&lt;h1 [...whatever was there already...] <strong>style=&#8221;clear:none;&#8221;</strong>&gt;&#8221;
</ul>
<li>above the h1 tag, but inside the hgroup tag, add your logo:
<ul>
<li>an image: &#8220;&lt;img src=&#8221;&#8230;your image&#8230;&#8221;/&gt;
<li>some php / a widget: &#8220;[copy paste whatever you wanted]&#8221;
</ul>
<li>Don&#8217;t forget: click &#8220;Update file&#8221; button on that page, or you&#8217;ll lose your changes ;)
</ol>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/18/wordpress-add-logo-top-right-in-twenty-twelve-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Over 9,000&#8230;</title>
		<link>http://t-machine.org/index.php/2013/05/17/over-9000/</link>
		<comments>http://t-machine.org/index.php/2013/05/17/over-9000/#comments</comments>
		<pubDate>Fri, 17 May 2013 09:50:12 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[reputation systems]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2366</guid>
		<description><![CDATA[I never imagined I&#8217;d reach anything even close to 10k rep. Lots of thoughts and some analysis to come on this in a future post &#8211; but I&#8217;ve got two deadlines coming up, so very rushed right now.]]></description>
				<content:encoded><![CDATA[<p><a href="http://stackoverflow.com/users/153422/adam"><br />
<img src="http://stackoverflow.com/users/flair/153422.png?theme=clean" width="208" height="58" alt="profile for Adam at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for Adam at Stack Overflow, Q&amp;A for professional and enthusiast programmers"><br />
</a></p>
<p>I never imagined I&#8217;d reach anything even close to 10k rep. Lots of thoughts and some analysis to come on this in a future post &#8211; but I&#8217;ve got two deadlines coming up, so very rushed right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/17/over-9000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Indie Developers do an AMA&#8230;</title>
		<link>http://t-machine.org/index.php/2013/05/15/indie-developers-do-an-ama/</link>
		<comments>http://t-machine.org/index.php/2013/05/15/indie-developers-do-an-ama/#comments</comments>
		<pubDate>Wed, 15 May 2013 21:38:11 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[games publishing]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2363</guid>
		<description><![CDATA[A bunch of indie game devs (including various friends of mine) are doing an AMA right now on Reddit. Go have a look (and ask some questions) if interested. I found the answers this question a bit depressing though, given that the audience has increased 100-fold in the last 2 decades. Sad that indie developers [...]]]></description>
				<content:encoded><![CDATA[<p>A bunch of indie game devs (including various friends of mine) are <a href="http://www.reddit.com/r/IAmA/comments/1edf3u/iama_indie_game_developers_behind/">doing an AMA right now on Reddit</a>. Go have a look (and ask some questions) if interested.</p>
<p>I found the answers <a href="http://www.reddit.com/r/IAmA/comments/1edf3u/iama_indie_game_developers_behind/c9z5fja">this question a bit depressing though</a>, given that the audience has increased 100-fold in the last 2 decades. Sad that indie developers still find it almost exactly as hard today as they did in the 1990&#8242;s :(.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/15/indie-developers-do-an-ama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>App takes all the RAM on a Windows tablet; turns out to be debug code the manufacturer left in by accident</title>
		<link>http://t-machine.org/index.php/2013/05/14/app-takes-all-the-ram-on-a-windows-tablet-turns-out-to-be-debug-code-the-manufacturer-left-in-by-accident/</link>
		<comments>http://t-machine.org/index.php/2013/05/14/app-takes-all-the-ram-on-a-windows-tablet-turns-out-to-be-debug-code-the-manufacturer-left-in-by-accident/#comments</comments>
		<pubDate>Tue, 14 May 2013 21:20:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2361</guid>
		<description><![CDATA[http://www.veracode.com/blog/2013/05/executable-archaeology-the-case-of-the-stupid-thing-eating-all-my-ram/ &#8211; Doh! Everyone has had that dreaded experience: you open up the task manager on your computer… and there’s a program name you don’t recognize. It gets worse when you google the name and can’t find a concrete answer on what it is and why it’s there. It gets even worse when you remove [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.veracode.com/blog/2013/05/executable-archaeology-the-case-of-the-stupid-thing-eating-all-my-ram/">http://www.veracode.com/blog/2013/05/executable-archaeology-the-case-of-the-stupid-thing-eating-all-my-ram/</a> &#8211; Doh!</p>
<blockquote><p>
Everyone has had that dreaded experience: you open up the task manager on your computer… and there’s a program name you don’t recognize. It gets worse when you google the name and can’t find a concrete answer on what it is and why it’s there. It gets even worse when you remove it from Autoruns and it comes back. It gets terrible when you realize it has keylogger functionality. The icing on the cake, however, is when the mystery program is also eating up all your RAM.<br />
&#8230;<br />
The application does not store or transmit or even display the information polled. It does nothing. I spent the better part of two hours scouring the obscure corners of the binary, thinking surely I must be missing some cleverly hidden method that actually uses this data. I couldn’t find one.<br />
&#8230;<br />
that still leaves the question of why it’s doing this at all. The clues are there, vestigial remnants of removed code, exciting to any Executable Archaeologist: The generically named “Form1” of the application contains several widgets which are never actually displayed: a start button, a stop button, a place for displaying mouse coordinates, and a text box for displaying some other unspecified data. I believe this was originally a debugging utility used by “Spacer” engineers to calibrate the accelerometer so that it would not go off when one simply tapped on the touchscreen (triggering a mouse event or keyboard event). They didn’t bother to rigorously prevent memory leaks because it was never intended to run for more than a few minutes at a time. Somehow, through some miscommunication, a copy of this program with the logic for rendering the visuals stripped ended up on the list of utilities that needed to be kept in the final version of “Spacer’s” Windows 8 image for this model of tablet.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/14/app-takes-all-the-ram-on-a-windows-tablet-turns-out-to-be-debug-code-the-manufacturer-left-in-by-accident/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why programmers (engineers) don&#8217;t want to work for Google any more&#8230;</title>
		<link>http://t-machine.org/index.php/2013/05/11/why-programmers-engineers-dont-want-to-work-for-google-any-more/</link>
		<comments>http://t-machine.org/index.php/2013/05/11/why-programmers-engineers-dont-want-to-work-for-google-any-more/#comments</comments>
		<pubDate>Sat, 11 May 2013 18:46:08 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Google? Doh!]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2359</guid>
		<description><![CDATA[Kev wrote a short Tumblr on why he no longer wants to work at Google. I am fairly sure this is a wider, expanding trend: great programmers have lost interest/faith in Google as an employer. I&#8217;ve tried (ineffectually) to explain this to some of my Googler friends &#8211; but I&#8217;ve tended to cite too much [...]]]></description>
				<content:encoded><![CDATA[<p>Kev <a href="http://cokeandcode.tumblr.com/post/47459213299/why-i-dont-want-to-work-for-google-anymore">wrote a short Tumblr on why he no longer wants to work at Google</a>.</p>
<p>I am fairly sure this is a wider, expanding trend: great programmers have lost interest/faith in Google as an employer. I&#8217;ve tried (ineffectually) to explain this to some of my Googler friends &#8211; but I&#8217;ve tended to cite too much info, and I think Kev pinpoints it quite nicely:</p>
<blockquote><p>
&#8220;Google’s foundation is it’s image. &#8230; For years we’ve all loved them. Even if sometimes their products fail and don’t provide the experience we want we’re all thinking it’s Google, their nice, they do things for free&#8230;The long and the short of it is Google has done very off the good feeling they’ve generated in the user community at large. The vision of the philanthropic behemoth doing things for the people. Not acting like a huge faceless corporation and doing things “the right way”.</p>
<p>Looking at it now though &#8230; Google are starting down that slippery path to the dark side. Reader is the obvious case but if you look a bit deeper you’ll see a general tend towards money first &#8211; people second culture.<br />
&#8230;<br />
So, why would I want to work for Google now? I could choose any big company with a big chunk of cash and a whole bunch of crazy ideas. There’s plenty of them around and Google is heading rapidly toward being “just another”. It’s Google right? Wrong.&#8221;
</p></blockquote>
<p>Google went from being the forefront of modern, healthy, human-centric company culture &#8230; to a mid-tier, second-rate excuse for bad practices and &#8220;it sucks but we can&#8217;t change it&#8221; culture. Like Kev, I noticed this (and you&#8217;ll see my Google-related blog posts over the years see-sawing between praise and hatred, like a manic depressive). But for the most part I convinced myself it was probably the teething-pains of corporate growth; mis-reported; sensationalized.</p>
<p>That was until I had first-hand experience of Google Europe&#8217;s disastrous hiring process. I went through a recruiter who repeatedly forgot to turn up, staff with no relevance to the role (and who declared their hatred of it), 1950&#8242;s mock-psychological interview questions, and a wilful avoidance of Employment/Privacy Law (I hit them with a DPA when I caught their HR lying to me).</p>
<p>&#8230; well, after all that &#8230; if you got the job, and accepted &#8230; what kind of team-members do you think you&#8217;d end up with? Is this a process that attracts great people &#8211; or turns them off?</p>
<p>That&#8217;s the critical point: when joining a company you expect to work for more than just a half year or so, the interview is as much a chance for you to feel that they&#8217;re recruiting people you like, people you respect &#8211; your current and future team-mates.</p>
<p>I know Kev (author of the post linked above) &#8211; and he&#8217;s not the kind of person to turn Sour Grapes on a failed interview. He&#8217;s a great programmer, skilled, innovative, and pragmatic. Very much the kind of engineer I&#8217;d want to work with &#8211; but also the kind I&#8217;d expect to smile and politely decline when confronted with the Google hiring process.</p>
<p>Which is what decided me against them for good. Although it&#8217;s a wonderful environment, and in many ways I&#8217;d love to work there &#8230; life&#8217;s too short to go without: colleagues you respect, and a culture you love.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/11/why-programmers-engineers-dont-want-to-work-for-google-any-more/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Yahoo&#8217;s &#8220;unusual activity&#8221; detector&#8230;</title>
		<link>http://t-machine.org/index.php/2013/05/06/yahoos-unusual-activity-detector/</link>
		<comments>http://t-machine.org/index.php/2013/05/06/yahoos-unusual-activity-detector/#comments</comments>
		<pubDate>Mon, 06 May 2013 10:12:43 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2355</guid>
		<description><![CDATA[I rather like this. I guess it could feel like an invasion of privacy &#8211; but the truth is: all web companies have been tracking you like this since the late 1990&#8242;s. Until now &#8230; they used the data, but never shared it with the you, the user. This is so much better: Note how [...]]]></description>
				<content:encoded><![CDATA[<p>I rather like this. I guess it could feel like an invasion of privacy &#8211; but the truth is: all web companies have been tracking you like this since the late 1990&#8242;s. Until now &#8230; they used the data, but never shared it with the you, the user. This is so much better:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-05-06-at-10.56.42.png" alt="Screen Shot 2013-05-06 at 10.56.42" width="843" height="230" class="aligncenter size-full wp-image-2356" /></p>
<p><span id="more-2355"></span></p>
<p>Note how it&#8217;s &#8220;with <strong>valid</strong> password&#8221; &#8211; this isn&#8217;t a mere &#8220;someone tried to login and failed&#8221; &#8211; it&#8217;s someone succeeded, but Yahoo&#8217;s noticed this isn&#8217;t a usual login IP address / location for you&#8230;</p>
<p>(2013 is looking interesting: As <a href="http://gigaom.com/2013/05/02/microsoft-weve-migrated-400m-hotmail-users-to-outlook-com/">Microsoft kills hotmail</a>, and <a href="http://t-machine.org/index.php/2013/03/31/the-new-gmail-downgraded-hated-by-users/">Google makes radically unpopular changes</a> to their services &#8230; Yahoo seems to be the one doing good (after years of negligect, of course))</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/06/yahoos-unusual-activity-detector/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Skyrim level-design: transcript (+ notes) from GDC 2013 talk</title>
		<link>http://t-machine.org/index.php/2013/05/04/skyrim-level-design-transcript-notes-from-gdc-2013-talk/</link>
		<comments>http://t-machine.org/index.php/2013/05/04/skyrim-level-design-transcript-notes-from-gdc-2013-talk/#comments</comments>
		<pubDate>Sat, 04 May 2013 12:03:38 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2350</guid>
		<description><![CDATA[A well-written text+images version of their GDC 2013 talk. TL;DR: A couple of things that jumped out at me: The total dev team for Skyrim (TES 5) is 90 people (less than normal for this size game) Oblivion (TES 4) had a mere 45 staff! They strategically embrace modular levels as the way to produce [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.joelburgess.com/2013/04/skyrims-modular-level-design-gdc-2013.html">A well-written text+images version of their GDC 2013 talk</a>.</p>
<p>TL;DR: A couple of things that jumped out at me:</p>
<ul>
<li>The total dev team for Skyrim (TES 5) is 90 people (less than normal for this size game)
<ul>
<li>Oblivion (TES 4) had a mere 45 staff!
</ul>
<li>They strategically embrace modular levels as the way to produce enough content in time
<ul>
<li>&#8230;<em>Added together: explains the recurring Art problem in Elder Scrolls games, where after an hour or so everywhere starts to look very similar</em>
<li>&#8230;NB: while I resent that (and I know many people who won&#8217;t play the games, they hate it so much), the tradeoff is IMHO worth it: broad story-content in a huge world. So it&#8217;s a big loss, but a compromise I&#8217;ve always been willing to accept as a player
<li>&#8230;in the article, they call this &#8220;art fatigue&#8221;
</ul>
<li>Allegedly only in Skyrim (but &#8230; I&#8217;m sure I saw this in Oblivion too), they put arbitrary-rotated wall segments inside rooms to break the sense of &#8220;rectangular&#8221; walls everywhere. <a href="http://1.bp.blogspot.com/-gxtUDEvKUoU/UXBjJ6tbfAI/AAAAAAAAAbU/U-bRUopZKnU/s1600/webCaveShellStages.jpg">They called this &#8220;Shell Based&#8221; building</a>
<li>&#8220;It’s common at the start of a project to strongly associate a particular setting with specific types of inhabitants or gameplay.  You may want to only see soldiers in military bases, and zombies in crypts, for example.  Resist this.&#8221;
<ul>
<li>&#8230;IMHO: obvious (it&#8217;s basic art-composition theory), but worth pointing out to anyone non-art background looking at game and level design
</ul>
<li>There was some pushback in the team against mix/matching modules from different kits: &#8220;The notion of [an artist's] art being used in unforeseen ways could lead to bad intersections or lighting issues, for example.&#8221;
<ul>
<li>&#8230;Stupid of me, I&#8217;d never thought about how the team artists would react to this kind of mix/match (the only games I&#8217;ve worked on with modular art kits &#8230; were 2-3 person indie projects, so the atmosphere was very different)
<li>&#8230;This also explains a *lot* of the geometry bugs in TES games (where you get stuck in angles of the wall, temporarily, or items drop in places you are blocked from reaching for no apparent reason): the combination of assets wasn&#8217;t designed-for / tested-for, so there were bajillions too many combinations to test!
<li>&#8220;when you’re trying to identify somebody with the the aptitude and interest to be a great kit artist, you’re basically looking for a unicorn.  They&#8217;re rare.&#8221;
</ul>
<h4>Art Fatigue</h4>
<p>The author initially cites this with respect to:</p>
<blockquote><p>
&#8220;the same rock or farmhouse or tapestry used again and again.  And another two dozen times after.&#8221;
</p></blockquote>
<p>&#8230;IME, that&#8217;s not the problem at all. The problem is that every internal environment appears to have bought their walls, floor, and ceilings from the same branch of Viking Ikea &#8482;. As demonstrated in the screenshot of &#8220;blatantly modular pipes&#8221; in the article:</p>
<p><img src="http://1.bp.blogspot.com/-bhtTnTcmv9c/UWuMl0W-BjI/AAAAAAAAAWg/Of1_9wUGJyw/s320/gdc2013pipes.png"/></p>
<p>&#8230;and when talking about Oblivion, it sounds like my experience was reflected in their testing with large groups of players too:</p>
<blockquote><p>
you’re more likely to pick up on repeated clutter first, then the repeated architecture.  This is especially true in actual gameplay from a first-person perspective.  To minimize needless repetition, we abolished the use of warehouse cells as they existed in Oblivion.
</p></blockquote>
<p>To be honest, I&#8217;ve long been surprised that Bethesda stuck with &#8220;square-based grids&#8221; for so long (other games were using non-square grids decades ago). As one of the commenters points out:</p>
<blockquote><p>
Square meshes and &#8216;cubic&#8217; tile-blocks on naturalistic indoor environments (eg natural caves) can be a challenge &#8211; how about equilateral triangular meshes, or for 3d space rhombic-dodecahedrons? &#8211; <em><a href="http://www.blogger.com/profile/06280298159625948128">Xu En</a></em>
</p></blockquote>
<h4>Common AAA art/design/level-design problem: handoff</h4>
<p>This is rarely written about but the kind of thing that Leads, Producers, EPs and Project managers spend ages dealing with:</p>
<blockquote><p>
&#8220;They’ll do an art pass and make the level visually appealing   Once they’re at a place they’re happy with, they send it back to design for final markup and scripting. Once design has done that, the level should theoretically be done &#8211; right?</p>
<p>Not usually.  Level designers often inherit a litany of unforeseen problems when receiving final art for their levels.  <strong>Cover along a street</strong> has been <strong>converted into poles too thin to take cover behind</strong>.  A wall <strong>intended as a visual blocker</strong> is now a <strong>see-though chain-link fence</strong>.  A bridge now has support beams which occlude sight lines in a major gunfight you had planned.&#8221;</p>
<p>(my emphasis)
</p></blockquote>
<h4>Common level-design problem: reference sizes</h4>
<p>Obviously, you need to know how &#8220;tall&#8221; your characters are. But how do you translate that into a practical measurement when working on a scene?</p>
<blockquote><p>
&#8220;One thing we&#8217;ve found very useful is to determine a uniform dimension for door frames.  This has a few benefits.  It allows us to transition from kit to kit without unique pieces, as well as allowing easy re-use of doors between kits.  More importantly, it gives AI and animation a fixed standard to work from, which can be reinforced throughout the game.&#8221;
</p></blockquote>
<h4>A little bit of the Agile/Scrum mindset</h4>
<p>Some of their approach is inherently Scrum:</p>
<blockquote><p>
 &#8220;we get our kits to a &#8220;functional-but-ugly&#8221; state as soon as possible&#8221;
</p></blockquote>
<blockquote><p>
&#8220;The level designer should be constantly stress testing throughout these stages.  The artist should deliver pieces as soon as they are even rudimentarily functional, and the level designer should use them in non-ideal conditions. &#8221;
</p></blockquote>
<p>They don&#8217;t go into detail, but imply that this has caused a lot of friction in the past with individual developers who found it emotionally difficult to work in this way. I would have liked some more info on that &#8211; dealing with this kind of &#8220;mindset&#8221; issue on game teams is a major challenge.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/04/skyrim-level-design-transcript-notes-from-gdc-2013-talk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Game on Kickstarter using an Entity System</title>
		<link>http://t-machine.org/index.php/2013/05/01/game-on-kickstarter-using-an-entity-system/</link>
		<comments>http://t-machine.org/index.php/2013/05/01/game-on-kickstarter-using-an-entity-system/#comments</comments>
		<pubDate>Wed, 01 May 2013 15:33:42 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[entity systems]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2348</guid>
		<description><![CDATA[&#8220;Magnetic by Nature&#8221; is using the C# version of Artemis, an Entity System based in part on my original ES posts. Go back it now (they only want $10k total!) &#8230;]]></description>
				<content:encoded><![CDATA[<p>&#8220;Magnetic by Nature&#8221; is using <a href="http://ploobs.com.br/?p=2396">the C# version</a> of <a href="http://gamadu.com/artemis/">Artemis</a>, an Entity System based in part on my original ES posts.</p>
<p><iframe frameborder="0" height="380" src="http://www.kickstarter.com/projects/tripleslash/magnetic-by-nature/widget/card.html" width="220"></iframe></p>
<p>Go back it now (they only want $10k total!) &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/05/01/game-on-kickstarter-using-an-entity-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Southern Rail redefines Customer Service</title>
		<link>http://t-machine.org/index.php/2013/04/29/southern-rail-redefines-customer-service/</link>
		<comments>http://t-machine.org/index.php/2013/04/29/southern-rail-redefines-customer-service/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 15:41:45 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[bitching]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2340</guid>
		<description><![CDATA[For a 45 minute train that they planned to run 1.5 hours late, they told everyone it was: &#8220;On Time&#8221; &#8230;until 60 seconds after leaving the station. The train was sat there for 15 minutes beforehand, with no announcement. Instead, they waited for the earliest moment when no-one could leave or seek alternative routes. Now, [...]]]></description>
				<content:encoded><![CDATA[<p>For a 45 minute train that they planned to run 1.5 hours late, they told everyone it was:</p>
<blockquote><p>
&#8220;On Time&#8221;
</p></blockquote>
<p>&#8230;until 60 seconds after leaving the station.</p>
<p>The train was sat there for 15 minutes beforehand, with no announcement. Instead, they waited for the earliest moment when no-one could leave or seek alternative routes.</p>
<p>Now, that&#8217;s what I call Customer Service ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/29/southern-rail-redefines-customer-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parse.com install is broken; silently requires Facebook SDK</title>
		<link>http://t-machine.org/index.php/2013/04/24/parse-com-install-is-broken-secretly-requires-facebook-sdk/</link>
		<comments>http://t-machine.org/index.php/2013/04/24/parse-com-install-is-broken-secretly-requires-facebook-sdk/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 10:11:35 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2333</guid>
		<description><![CDATA[&#8230;and the last working version of Parse.com&#8217;s SDK isn&#8217;t listed on their website any more. So &#8230; if you see this (which you probably will, on any non-trivial project): Undefined symbols for architecture i386: &#8220;_FBTokenInformationExpirationDateKey&#8221;, referenced from: &#8230;then you MUST download and install the Facebook API into your iOS / Xcode project. Especially if you&#8217;re [...]]]></description>
				<content:encoded><![CDATA[<p>&#8230;and the last working version of <a href="http://parse.com">Parse.com&#8217;s</a> SDK isn&#8217;t listed on their website any more.</p>
<p>So &#8230; if you see this (which you probably will, on any non-trivial project):</p>
<blockquote><p>
Undefined symbols for architecture i386:<br />
  &#8220;_FBTokenInformationExpirationDateKey&#8221;, referenced from:
</p></blockquote>
<p>&#8230;then you MUST <a href="http://developers.facebook.com/ios/">download and install the Facebook API into your iOS / Xcode project</a>. Especially if you&#8217;re not actually using Facebook!</p>
<h3>Why?</h3>
<p>Parse.com for iOS is currently setup so that you CANNOT use ANY LIBRARIES AT ALL, unless you ALSO use the Facebook library. Oops.</p>
<p>A little bit of naive linking by the Parse.com engineers. C-linking is a PITA to get right, so I don&#8217;t blame them.</p>
<h3>More problems</h3>
<p>1. Facebook won&#8217;t let you download their API / library any more.</p>
<p>Instead you have to &#8220;install an application&#8221; on your system that spews to random places on your machine (where? Well &#8230; the app won&#8217;t tell you, but on the Facebook website they say it all goes in ~/Documents) &#8211; and you&#8217;re not allowed to change them.</p>
<p>Wrong place, wrong installer (shouldn&#8217;t be hard-coded, shouldn&#8217;t &#8220;hide&#8221; the location). And a pain to deal with, when all that was needed or wanted was a simple ZIP file&#8230;</p>
<p>2. Facebook&#8217;s latest SDK requires iOS 6 to even compile it &#8211; even if you&#8217;re not using iOS 6. No-one should be hard-coding to iOS 6, though &#8211; so I&#8217;m surprised that FB is targetting it as default. iOS 5 is the main target version of iOS for now.</p>
<p>3. Once you find a 6 SDK, you have to add a bunch of extra frameworks which don&#8217;t exist except on iOS 6, and set them to &#8220;Optional&#8221; in the &#8220;Project Settings &gt; Build Phases &gt; Link with Libraries&#8221; phase.</p>
<p>Details are on the FB iOS Getting Started page, although they&#8217;re pretty hard to find (they&#8217;re hidden inside a drop-down with an unrelated title).</p>
<p>(incidentally: the FB iOS install page has always been way too long, so I suspect someone decided to &#8220;tidy it up&#8221; by hiding 95% of it. I think a better solution would have been to remove all the cruft, and fix the install process :))</p>
<p>&#8230;anyway, once you get past all that, things go smoothly. NB: when I wrote this, I was on a hack-day at Facebook&#8217;s offices, and it took <span style="color:red">30 minutes</span> to get Parse&#8217;s API installed, because of the above problems. It would have been even longer if I&#8217;d not used Facebook in the past, and knew how to navigate their install page.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/24/parse-com-install-is-broken-secretly-requires-facebook-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVGs, silhouettes, and &#8230; dinosaurs</title>
		<link>http://t-machine.org/index.php/2013/04/14/svgs-silhouettes-and-dinosaurs/</link>
		<comments>http://t-machine.org/index.php/2013/04/14/svgs-silhouettes-and-dinosaurs/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 15:12:51 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games design]]></category>
		<category><![CDATA[GamesThatTeach]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2325</guid>
		<description><![CDATA[With my recent fixes to &#8220;auto-scaling&#8221; in SVGKit, I can now take in images, apply various effects, and lay them out in a grid: Top row: input SVGs of arbitrary size, auto-scaled to fit Middle row: applying a 2 lines of code filter to remove the colours Bottom row: applying a 2 lines of code [...]]]></description>
				<content:encoded><![CDATA[<p>With my recent fixes to &#8220;auto-scaling&#8221; in SVGKit, I can now take in images, apply various effects, and lay them out in a grid:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-14-at-16.04.11.png" alt="Screen Shot 2013-04-14 at 16.04.11" width="577" height="603" class="aligncenter size-full wp-image-2326" /></p>
<ul>
<li>Top row: input SVGs of arbitrary size, auto-scaled to fit
<li>Middle row: applying a 2 lines of code filter to remove the colours
<li>Bottom row: applying a 2 lines of code filter to convert to a solid silhouette
</ul>
<p>&#8230;next step: get this stickers-game working&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/14/svgs-silhouettes-and-dinosaurs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVGKit: scaling SVG images</title>
		<link>http://t-machine.org/index.php/2013/04/14/svgkit-scaling-svg-images/</link>
		<comments>http://t-machine.org/index.php/2013/04/14/svgkit-scaling-svg-images/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 00:10:03 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2318</guid>
		<description><![CDATA[This is very easy, but lots of people find this difficult with good reason! Here&#8217;s a quick guide to how image-scaling is implemented with SVGKit, so you can effortlessly scale your images. REQUIRED For any of these techniques to work, we need to know the size of your incoming SVG. According to the spec, EVERY [...]]]></description>
				<content:encoded><![CDATA[<p>This is very easy, but lots of people find this difficult <a href="http://t-machine.org/index.php/2013/04/13/svg-spec-missing-documentation-the-viewport-and-svg-width/">with good reason</a>!</p>
<p>Here&#8217;s a quick guide to how image-scaling is implemented with <a href="https://github.com/SVGKit/SVGKit/">SVGKit</a>, so you can effortlessly scale your images.</p>
<p><span id="more-2318"></span></p>
<h3>REQUIRED</h3>
<p>For any of these techniques to work, we need to know the size of your incoming SVG. According to the spec, EVERY SVG file is supposed to have a size, but it is POSSIBLE for an SVG to be saved &#8220;without a size&#8221;.</p>
<p>This is rare, but it does happen.</p>
<p>In that specific case, we CANNOT do some of the things below (the exception is &#8220;scale&#8221; &#8212; we can do this, using a one-liner built-in to SVGKit, but it would be safer for you to fix your SVG file!).</p>
<p>In particular, we definitely CANNOT scale to fit &#8211; because your SVG is infinite. You need to edit the SVG file and set the &#8220;width&#8221; attribute on the root &lt;svg&gt; tag, or you need to set the &#8220;viewBox&#8221; attribute (on the same tag).</p>
<h3>Use 1: Scale-to-fit</h3>
<p>All you have to do is provide a specific size for your SVGKImage, after it&#8217;s finished parsing. It will do the rest for you automatically:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKImage im = [SVGKImage imageNamed:&quot;myImage&quot;];
im.size = CGSizeMake( 320, 480 ); // fill an iOS screen
SVGKImageView* iv = [[SVGKFastImageView alloc] initWithSVGKImage: im];

[self.view addSubview: iv];
</pre>
<h3>Use 2: Make it half the size</h3>
<p>In this case, you need to specify a size &#8220;half as big as the default&#8221;.</p>
<p>All you have to do is provide a specific size for your SVGKImage, after it&#8217;s finished parsing. It will do the rest for you automatically:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKImage im = [SVGKImage imageNamed:&quot;myImage&quot;];
CGSize originalSize = im.size; // this defaults to the SVG's internal size
float half = 1.0 / 2.0f;
im.size = CGSizeApplyAffineTransform( im.size, CGAffineTransformMakeScale( half, half ));
SVGKImageView* iv = [[SVGKFastImageView alloc] initWithSVGKImage: im];

[self.view addSubview: iv];
</pre>
<h3>Use 3: Make it half the size &#8211; when the SVG is infinite</h3>
<p>If the SVG is infinite, we can&#8217;t make the image half as big &#8211; but we can RENDER it half as big. In this case, it&#8217;ll be up to you to &#8220;guesstimate&#8221; what .frame to place on the SVGKImageView at the end &#8211; or set it to the biggest size you care about rendering?</p>
<pre class="brush: objc; title: ; notranslate">
SVGKImage im = [SVGKImage imageNamed:&quot;myImage&quot;];
im.scale = 0.5f; // NB: this will BE REJECTED if your SVG is non-infinite; 
// ... use the other techniques (listed above) instead!
SVGKImageView* iv = [[SVGKFastImageView alloc] initWithSVGKImage: im];

[self.view addSubview: iv];
</pre>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/14/svgkit-scaling-svg-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVG Spec: missing documentation: the &#8220;Viewport&#8221; (and &lt;svg width=&#8221;&#8230;&#8221;&gt;)</title>
		<link>http://t-machine.org/index.php/2013/04/13/svg-spec-missing-documentation-the-viewport-and-svg-width/</link>
		<comments>http://t-machine.org/index.php/2013/04/13/svg-spec-missing-documentation-the-viewport-and-svg-width/#comments</comments>
		<pubDate>Sat, 13 Apr 2013 19:55:17 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2300</guid>
		<description><![CDATA[In app development, the most common thing people do with an SVG is &#8220;render it to fit a specific area on screen&#8221;. This is very wise &#8211; it&#8217;s making use of the core feature of Scalable Vector Graphics: resolution independence. Unfortunately, achieving that aim is a lot less obvious than you would expect. Most of [...]]]></description>
				<content:encoded><![CDATA[<p>In app development, the most common thing people do with an SVG is &#8220;render it to fit a specific area on screen&#8221;. This is very wise &#8211; it&#8217;s making use of the core feature of <strong>Scalable</strong> Vector Graphics: resolution independence.</p>
<p>Unfortunately, achieving that aim is a lot less obvious than you would expect. Most of <a href="http://www.w3.org/TR/SVG/">the SVG Spec</a> is extremely well written, but for this aspect the authors &#8220;had a bad day&#8221;, and wrote some rubbish prose that&#8217;s not technically possible. This leads to a lot of confusion&#8230;</p>
<p>I&#8217;m trying to make <a href="https://github.com/SVGKit/SVGKit/">SVGKit for iOS/Mac</a> be 100% standards compliant, and the lack of specification in this area has made it very difficult. Worse &#8230; people using the library are often confused by simple items like &#8220;how do I make the SVG file fit into a small area on screen?&#8221;.</p>
<p>It&#8217;s been difficult to work through, and I&#8217;ve decided to document what I *think* the authors intended &#8211; and how I&#8217;m implementing it in our open-source library.</p>
<p><span id="more-2300"></span></p>
<h2>W3C&#8217;s failure: the spec is WRONG</h2>
<p>Before we start, I&#8217;m going to document exactly where the spec is incorrect, so that if they ever fix the spec, you (or I) can easily see if any of my assumptions have been overruled (by the better, newer spec).</p>
<ol>
<li>The &#8220;svg width&#8221; attribute is not defined
<li>The default value for &#8220;svg width&#8221; is illegal
<li>The &#8220;viewport&#8221; definition is INCOMPATIBLE with W3C&#8217;s own example of usage (given at: <a href="http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute">http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute</a>)
</ol>
<h3>SVG width</h3>
<p>NB: we are specifically talking ONLY about &#8220;the width of the outermost SVG element&#8221;. The &#8220;width&#8221; attribute for EVERYTHING ELSE IN SVG is *fully* defined.</p>
<p>The SVG Spec says this about &#8220;svg width&#8221;:</p>
<blockquote><p>
&#8220;If the attribute is not specified, the effect is as if a value of &#8217;100%&#8217; were specified.&#8221;
</p></blockquote>
<p>&#8230;but, according to the spec, &#8220;%&#8221; is an illegal character in the &#8220;svg width&#8221; &#8211; only &#8220;presentation attributes&#8221; are allowed percentages, and &#8220;svg width&#8221; is explicitly NOT a presentation attribute (the full list is defined in <a href="http://www.w3.org/TR/SVG/propidx.html">SVG Spec Appendix N</a>).</p>
<p>Even if were legal, the W3C committee fails to define what &#8220;percentage&#8221; actually means on an outermost SVG element (the definitions used elsewhere don&#8217;t make sense here). I&#8217;m sure there are &#8220;valid&#8221; implementations out there that use incompatible assumptions.</p>
<h3>SVG viewport</h3>
<p>The viewport is described:</p>
<blockquote><p>
The SVG user agent negotiates with its parent user agent to determine the viewport<br />
&#8230;<br />
The ‘width’ attribute on the outermost svg element establishes the viewport&#8217;s width, unless the following conditions are met:</p>
<p>    the SVG content is a separately stored resource that is embedded by reference (such as the ‘object’ element in XHTML [XHTML]), or the SVG content is embedded inline within a containing document;<br />
    and the referencing element or containing document is styled using CSS [CSS2] or XSL [XSL];<br />
    and there are CSS-compatible positioning properties ([CSS2], section 9.3) specified on the referencing element (e.g., the ‘object’ element) or on the containing document&#8217;s outermost svg element that are sufficient to establish the width of the viewport.</p>
<p>Under these conditions, the positioning properties establish the viewport&#8217;s width.
</p></blockquote>
<p>Firstly: that is some of the worst English writing I&#8217;ve seen in a long time. It&#8217;s way below the standard of writing used throughout the rest of the SVG Spec. I don&#8217;t know what happened here, but you get the impression the W3C committee wasn&#8217;t really paying attention when they signed-off on that :(.</p>
<p>Secondly: this is in direct conflict with the SVG Spec&#8217;s example usage of viewports. In the image below, the SVG Spec states that BOTH IMAGES have the same SVG source, that SPECIFIES an SVG width. According to the docs above, they would have to render identically!</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-13-at-19.54.50.png" alt="Screen Shot 2013-04-13 at 19.54.50" width="577" height="394" class="aligncenter size-full wp-image-2305" /></p>
<h3>Why did they do this anyway?</h3>
<p>The first question when fixing a bug in a Spec is to ask: why did they add these features in the first place?</p>
<p>For viewport and width, we need to start with the viewbox. This is because the viewbox is WELL DEFINED, and the viewport and width are defined relative to it.</p>
<p>Also, it&#8217;s very easy to understand why it exists!</p>
<h4>&#8230;why does SVG have a viewbox?</h4>
<p>Easy: so that artists can have a &#8220;canvas&#8221; with many things on it, but tell apps/programmers &#8220;only use the bits I want you to see; ignore the stuff off the edges&#8221;. E.g. in Inkscape, the default setup is an A4 sheet of paper as your viewbox. Whatever you draw &#8220;outside the paper&#8221; is saved in your SVG &#8211; but won&#8217;t appear in any user-facing apps that use your SVG.</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-13-at-20.39.42.png" alt="Screen Shot 2013-04-13 at 20.39.42" width="678" height="553" class="aligncenter size-full wp-image-2302" /></p>
<h4>&#8230;why does SVG have an &#8220;svg width&#8221;?</h4>
<p>Now it begins to make sense: if an artist can declare which parts of the image are &#8220;intended&#8221; to be rendered, what else do they want control over?</p>
<p>&#8230;Size, of course.</p>
<p>A normal bitmap has an explicit size in pixels. The artist decides how big the output image will be WHEN THEY CREATE THE FILE. But SVG has vector &#8211; size is meaningless.</p>
<p>That&#8217;s fine. And an app that merely &#8220;displays SVG files&#8221; will have no problem scaling every image to take up the full size of the app-window.</p>
<p>But many apps use images and RELY UPON the size of the image to do other things. e.g. when developing iPhone apps, we often use the &#8220;size&#8221; of an image to dictate how much space on-screen a widget should occupy. If the SVG file specified no size &#8230; how many pixels should we use to render it?</p>
<p>(this is where programmers get confused: the SVG spec states clearly that the ASSUMPTION is always that &#8220;1 unit = 1 pixel&#8221;)</p>
<p>But my long years of working with graphic artists show that many professional artists wilfully ignore simple facts like &#8220;1 unit is 1 pixel&#8221;, using arguments like &#8220;but it&#8217;s a vector, you can render it any size, so render it the size I told you to&#8221;. So, I suspect &#8230; the W3C committee that defined SVG decided to add a practical feature that would allow artists and programmers to BOTH get an easy life.</p>
<p>In that case, the correct definition of SVG width would be:</p>
<blockquote><p>
SVG width is the number of pixels wide this image would be if it had been created as a bitmap;<br />
SVG height is the number of pixels tall this image would be if it had been created as a bitmap
</p></blockquote>
<h4>&#8230;why does SVG have a &#8220;viewport&#8221;?</h4>
<p>Ah, but it doesn&#8217;t! If you look closely, there is nothing in SVG spec that allows an SVG file to say anything about this mythical &#8220;viewport&#8221;.</p>
<p>In the real world, there are only three ways to render an image file, and one of those is a sub-type of the others:</p>
<ol>
<li>Take an image, scale it to fit the pre-determined &#8220;window&#8221; area on screen, and draw it inside that area
<ol>
<li>e.g. in an image-viewer, there is a fixed area available (the main panel of the app), and you want to show each image COMPLETELY and EXACTLY fitting inside that area
</ol>
<li>Take an image, draw it on screen, and resize the rest of the screen contents based on the image&#8217;s size
<ol>
<li>e.g. in a list, if you have an icon for each row, make the height of each row be &#8220;the height of the icon image, plus 5 pixels above and 5 pixels below&#8221;
</ol>
<li>Draw something which contains an embedded SVG image (e.g. draw a webpage that contains an SVG inside it)
<ol>
<li>&#8230;this is actually either 1 or 2 above, depending on context.
</ol>
</ol>
<p>For option 1, we only need to know &#8220;the total extent of the SVG image&#8221;, so that we can decide how much to scale it. This is COMPLETELY SOLVED by the SVG containing a &#8220;viewbox&#8221; attribute. Nothing else is needed, and nothing else would make sense.</p>
<p>For option 2, the viewbox is useless, but the &#8220;svg width&#8221; and &#8220;svg height&#8221; attributes tell us what the original artist intended.</p>
<p>For option 3 &#8230; choose one of 1 or 2 above depending on context.</p>
<p>&#8230;which leaves no need for a &#8220;viewport&#8221; concept. Except &#8230; it is useful when defining the SVG Spec to be able to describe things inside the SVG relative to the actual on-screen area where the SVG is being drawn.</p>
<p>And so: my *guess* is that the definition of &#8220;viewport&#8221; should be:</p>
<blockquote><p>
The area on screen, in pixels, where the SVG will be rendered.</p>
<p>This is decided by the APPLICATION, and can be any size, independent of the SVG file</p>
<p>In some cases, the APPLICATION will CHOOSE to use the &#8220;svg width&#8221; and &#8220;svg height&#8221; info, or the CSS styling info, to decide the size and shape of the viewport</p>
<p>In other cases, the APPLICATION will CHOOSE a viewport based on external information, and FORCE the SVG to render into that viewport, scaling the SVG&#8217;s viewable area to PRECISELY fill the viewport.</p>
<p>If the APPLICATION chooses to ignore the &#8220;svg width&#8221; and &#8220;svg height&#8221;, and the SVG file has a viewbox, it should COMPLETELY IGNORE the &#8220;svg width&#8221; and &#8220;svg height&#8221; and scale the SVG contents so that the area covered by the viewbox precisely fills the area of the viewport. Alternatively, if the APPLICATION is ignoring the &#8220;svg width&#8221; and &#8220;svg height&#8221; and the SVG file *does not* have a viewbox, it should scale the SVG contents by the ratio of &#8220;viewport width&#8221; to &#8220;svg width&#8221; (e.g. if viewport is 100px, and &#8220;svg width&#8221; is 200px, then all units inside the SVG should be scaled by 1/2).
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/13/svg-spec-missing-documentation-the-viewport-and-svg-width/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compiler author demanded ownership of all programs written using his compiler</title>
		<link>http://t-machine.org/index.php/2013/04/06/compiler-author-demanded-ownership-of-all-programs-written-using-his-compiler/</link>
		<comments>http://t-machine.org/index.php/2013/04/06/compiler-author-demanded-ownership-of-all-programs-written-using-his-compiler/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 14:30:21 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[amusing]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2298</guid>
		<description><![CDATA[(from 1982. Blogged now because &#8230; the named individual who apparently came up with this scam) http://imgur.com/a/P9kFa (for those that haven&#8217;t been following: four years after Langdell tried to bully an award-winning iPhone game into giving him their money, using his invalid trademark to threaten legal action &#8230; the USPTO has finally started cancelling each [...]]]></description>
				<content:encoded><![CDATA[<p>(from 1982. Blogged now because &#8230; <a href="http://en.wikipedia.org/wiki/Edge_Games">the named individual who apparently came up with this scam</a>)</p>
<p><a href="http://imgur.com/a/P9kFa">http://imgur.com/a/P9kFa</a></p>
<p>(for those that haven&#8217;t been following: four years after Langdell tried to bully an award-winning iPhone game into giving him their money, using his invalid trademark to threaten legal action &#8230; the USPTO has finally started cancelling each of his trademarks. Trademark law is FUBAR: 4 years for a fraudulent(*) TM to be cancelled? Ouch.)</p>
<p>(*) &#8211; my opinion, but: read the case notes &#8230; he apparently committed blatant fraud to keep-alive a trademark that legally had already expired</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/06/compiler-author-demanded-ownership-of-all-programs-written-using-his-compiler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Dev: Eclipse won&#8217;t start? Hangs at splash screen? Kill Mylyn&#8230;</title>
		<link>http://t-machine.org/index.php/2013/04/05/android-dev-eclipse-wont-start-hangs-at-splash-screen-kill-mylyn/</link>
		<comments>http://t-machine.org/index.php/2013/04/05/android-dev-eclipse-wont-start-hangs-at-splash-screen-kill-mylyn/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 18:22:27 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[Google? Doh!]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2292</guid>
		<description><![CDATA[For the last couple of months, one of our dev machines has been literally incapable of opening a simple Android project. It crashes every time, on startup, while displaying the Eclipse logo: Re-installing everything had no effect. We tried everything, and the only thing that worked reliably was to keep deleting the project and re-synching [...]]]></description>
				<content:encoded><![CDATA[<p>For the last couple of months, one of our dev machines has been literally incapable of opening a simple Android project. It crashes every time, on startup, while displaying the Eclipse logo:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-05-at-14.45.54.png" alt="Screen Shot 2013-04-05 at 14.45.54" width="452" height="302" class="aligncenter size-full wp-image-2293" /></p>
<p>Re-installing everything had no effect. We tried everything, and the only thing that worked reliably was to keep deleting the project and re-synching from SVN <strong>every time we wanted to start Eclipse</strong></p>
<p>Today I finally discovered the cause: <em>Mylyn</em></p>
<p><span id="more-2292"></span></p>
<h3>Mylyn?</h3>
<p>This is someone&#8217;s research project that they originally implemented as an Eclipse plugin. I&#8217;ve never understood why, but after a few years they &#8211; somehow &#8211; got it &#8220;embedded&#8221; into the core Eclipse downloads at http://eclipse.org . Since then it&#8217;s often been compared to a virus, given that almost every developer I know *detests* Mylyn, has no use for it, and struggles to get rid of it (the &#8220;embedding&#8221; removed your ability to uninstall Mylyn; this was not a popular decision).</p>
<p>Calling it a &#8220;virus&#8221; is (I hope!) clearly an overreaction &#8211; although it shows the depth of hatred a lot of programmers felt. But there is a word for unwanted, unneeded software that you force upon users, and prevent them from uninstalling:</p>
<blockquote><p>
Malware
</p></blockquote>
<p>Anyway, according to Mylyn&#8217;s supporters, the code only runs if you use it. QED if you don&#8217;t use it &#8230; it won&#8217;t *in any way* slow down or crash your Eclipse editor. O, RLY?</p>
<h4>&#8230;Liars, Damned Liars, and &#8230; Mylyn supporters?</h4>
<p>I&#8217;ve long suspected that most of the past 3 years of complaints &#8220;Eclipse is slow&#8221;, &#8220;Eclipse always crashes&#8221; etc are caused by Mylyn, or something similar (something added around that time). I&#8217;ve seen way too many reports of virgin Eclipse installs running very slow and crashing (as far back as 2002 Eclipse ran on old, weak machines &#8211; fast, and with no crashes &#8211; and it&#8217;s very odd for a major piece of software to actively get *worse* over time).</p>
<p>(NB: many reports were from Android devs, since I work in mobile right now &#8212; I&#8217;ve since discovered that Google&#8217;s Android plugin is probably responsible for many of the crashes, since Google doesn&#8217;t seem to be testing it as rigorously as you might expect. But there were plenty of reports from people who were working on non-Android projects, so it seemed there was at least *something* wrong in the core IDE)</p>
<p>I wasn&#8217;t looking to prove Mylyn as the cause &#8211; I just wanted to prove *any* cause, and be sure we&#8217;d never get this problem again in future.</p>
<p>I did this by manually deleting each piece of metadata, then restarting with &#8220;-clean&#8221;, until the crash stopped (you lose lots of core, critical data this way &#8211; but it&#8217;s the fastest way to diagnose which badly-written, untested plugin is crashing your system). Mylyn&#8217;s metadata was the only set that caused the crash.</p>
<p>Then I went one step further: deleting the actual libraries/binary code for each plugin, every feature, until the crash stopped (leaving the metadata alone this time). Again: it started working as soon as Mylyn was gone.</p>
<p>To check, I then reinstated everything from a backup, and this time *only* deleted Mylyn: machine worked perfectly, no crashes.</p>
<h4>How to kill Mylyn with fire</h4>
<p>So, it seems Mylyn is at fault, not just slowing down our development (adding pointless stuff that no-one uses), but &#8211; in this case &#8211; making an entire dev machine unusable. How do we fix this?</p>
<ol>
<li>Close all open copies of Eclipse
<li>Find your &#8220;Eclipse app folder&#8221; (wherever the Eclipse program lives; since Eclipse has no installer (still!) it&#8217;s wherever you chose to copy the files when you installed it originally)
<li>Burn Mylyn out of /features/
<ol>
<li>Find every sub-folder of &#8220;features&#8221; that has the word &#8220;mylyn&#8221; in it &#8211; most of them are together in alphabetical order *but some are not*
<li>Delete the folders themselves
</ol>
<li>Burn Mylyn out of /plugins/
<ol>
<li>Find every sub-folder of &#8220;plugins&#8221; that has the word &#8220;mylyn&#8221; in it &#8211; most of them are together in alphabetical order *but some are not*
<li>Delete the folders themselves
</ol>
<li>Re-start eclipse once per project, using the command-line option &#8221; -clean&#8221; (this means: &#8220;refresh&#8221;)
<ol>
<li>If you&#8217;re using OS X, this is very hard to do, and in 10 years no-one has come up with a workaround; for now, do this:</p>
<ol>
<li>Open Terminal</p>
<li>cd /Applications/Eclipse/ (or whatever you named the Eclipse folder in your drive)
<li>cd Eclipse.app/Contents/MacOS/
<li>./eclipse -clean
</ol>
<li>(eclipse will run as per usual, you need to start it once per workspace, let the project open up, then close it down again)
</ol>
</ol>
<h4>Screenshots</h4>
<p>Sort-by-name, and most of them are easy to find and destroy:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-05-at-18.25.45.png" alt="Screen Shot 2013-04-05 at 18.25.45" width="795" height="555" class="aligncenter size-full wp-image-2294" /></p>
<p>&#8230;but don&#8217;t forget the subtle ones (these are 3rd party projects that have Mylyn &#8220;compatibility&#8221;; if you don&#8217;t remove them, you can get errors and hangs at startups while they try to find Mylyn code they rely upon):</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-04-05-at-18.26.38.png" alt="Screen Shot 2013-04-05 at 18.26.38" width="920" height="505" class="aligncenter size-full wp-image-2295" /></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/05/android-dev-eclipse-wont-start-hangs-at-splash-screen-kill-mylyn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Round Earth? Flat Earth? Impossible to tell?</title>
		<link>http://t-machine.org/index.php/2013/04/01/round-earth-flat-earth-impossible-to-tell/</link>
		<comments>http://t-machine.org/index.php/2013/04/01/round-earth-flat-earth-impossible-to-tell/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 13:35:57 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2290</guid>
		<description><![CDATA[https://en.wikipedia.org/wiki/Bedford_Level_Experiment (unsubstantiated, but hilarious): &#8220;If the measurement is close enough to the surface, light rays can curve downward at a rate equal to the mean curvature of the Earth&#8217;s surface. In this case, the two effects of curvature and refraction cancel each other out and the Earth will appear flat in optical experiments.&#8221; &#8230;&#8221;an increase [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Bedford_Level_Experiment">https://en.wikipedia.org/wiki/Bedford_Level_Experiment</a></p>
<p>(unsubstantiated, but hilarious): &#8220;If the measurement is close enough to the surface, light rays can curve downward at a rate equal to the mean curvature of the Earth&#8217;s surface. In this case, the two effects of curvature and refraction cancel each other out and the Earth will appear flat in optical experiments.&#8221;</p>
<blockquote><p>
&#8230;&#8221;an increase in air temperature &#8230; of 0.11 degrees Celsius per metre of altitude would create an illusion of a flat canal, &#8230; [or if] higher than this &#8230; all optical observations would be consistent with a concave surface, a &#8220;bowl-shaped earth&#8221;"</p>
<p>&#8230;&#8221;Ulysses Grant Morrow, &#8230; found that his target marker, eighteen inches above water level and five miles distant, was clearly visible he concluded that the Earth&#8217;s surface was concavely curved&#8221;
</p></blockquote>
<p>(the history of maps and globe representations of the Earth is full of wonderful things like this)</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/01/round-earth-flat-earth-impossible-to-tell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Activision shows computer-generated human indistinguishable from reality</title>
		<link>http://t-machine.org/index.php/2013/04/01/activision-shows-computer-generated-human-indistinguishable-from-reality/</link>
		<comments>http://t-machine.org/index.php/2013/04/01/activision-shows-computer-generated-human-indistinguishable-from-reality/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 11:31:44 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2287</guid>
		<description><![CDATA[OMGWTFBBQ&#8230; http://uk.ign.com/videos/2013/03/28/activision-reveals-next-gen-tech IMHO this is one of those watersheds: for the people who still believe &#8220;I could tell&#8221; if video is fake &#8230; no, you can&#8217;t. Done properly, you really can&#8217;t. UPDATE: and the blog from one of the guys who did it]]></description>
				<content:encoded><![CDATA[<p>OMGWTFBBQ&#8230;</p>
<p><a href="http://uk.ign.com/videos/2013/03/28/activision-reveals-next-gen-tech">http://uk.ign.com/videos/2013/03/28/activision-reveals-next-gen-tech</a></p>
<p>IMHO this is one of those watersheds: for the people who still believe &#8220;I could tell&#8221; if video is fake &#8230; no, you can&#8217;t. Done properly, you really can&#8217;t.</p>
<p>UPDATE: and the <a href="http://www.iryoku.com/next-generation-life">blog from one of the guys who did it</a></p>
<p><img src="http://www.iryoku.com/images/posts/next-generation-life/lauren-02-thumb.jpg"/></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/04/01/activision-shows-computer-generated-human-indistinguishable-from-reality/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The new gmail: Downgraded, hated by users</title>
		<link>http://t-machine.org/index.php/2013/03/31/the-new-gmail-downgraded-hated-by-users/</link>
		<comments>http://t-machine.org/index.php/2013/03/31/the-new-gmail-downgraded-hated-by-users/#comments</comments>
		<pubDate>Sun, 31 Mar 2013 10:59:41 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[bitching]]></category>
		<category><![CDATA[Google? Doh!]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2281</guid>
		<description><![CDATA[I really don&#8217;t understand this. My best guess: there&#8217;s a new Senior Manager at Google who was doing badly in their peer-reviews, and was determined to &#8220;make their mark&#8221; by changing Gmail &#8211; if necessary over the cold, dead bodies of the thousands of people pointing out that this is a bad idea. I thought [...]]]></description>
				<content:encoded><![CDATA[<p>I really don&#8217;t understand this. My best guess: there&#8217;s a new Senior Manager at Google who was doing badly in their peer-reviews, and was determined to &#8220;make their mark&#8221; by changing Gmail &#8211; if necessary over the cold, dead bodies of the thousands of people pointing out that this is a bad idea.</p>
<p>I thought Google was a company that prided itself on taking the best of a group of people, and putting &#8220;Product&#8221; concerns above all else?</p>
<p>But this week they forced a change on all several hundred million users that removes core features, breaks existing features, and adds only 1 minor feature (you can compose two emails at once without opening a new tab).</p>
<p>Let&#8217;s run through it, <a href="https://support.google.com/mail/answer/2645922?p=newcompose&#038;rd=1">using Google&#8217;s own &#8220;Learn more&#8221; page as a reference</a>.</p>
<p><span id="more-2281"></span></p>
<h3>Line by line, from Google&#8217;s help page</h3>
<blockquote><p>
You can now write messages in a cleaner, simpler experience that puts the focus on your message itself, not all the features around it. Here are some of the highlights:
</p></blockquote>
<p>This experience is cleaner, MORE COMPLICATED and puts the focus on BEING UNABLE TO WRITE YOUR MESSAGE.</p>
<blockquote><p>
Fast: Compose messages right from your inbox.
</p></blockquote>
<p>Yes. Except: Google&#8217;s popup code across their apps (e.g. Google Docs can&#8217;t be used from Firefox any more) has been breaking web-browsers for the past 6 months, so I&#8217;m not sure this is a &#8220;good&#8221; thing.</p>
<p>Today, within a few minutes of using it, I discovered a major cross-browser bug (Chrome + Firefox): the window pops up in a random place, sometimes on right edge of screen, sometimes at bottom edge. This means you have to click on extreme left of screen (to hit the Compose button), then hunt around with your mouse until you find the place where Gmail has &#8220;randomly&#8221; positioned the compose window, before you can click in fields.</p>
<blockquote><p>
Simple: Redesigned with a clean, streamlined look.
</p></blockquote>
<p>Yes.</p>
<blockquote><p>
Powerful: Check emails as you&#8217;re typing, minimize drafts for later, and even compose two messages at once.
</p></blockquote>
<p>Yes &#8211; features Gmail has lacked for a long time. HOWEVER: all these features were provided 5+ years ago when modern web browsers went &#8220;tab&#8221;-based, and Gmail allowed each tab to have separate &#8220;state&#8221;. (originally, Gmail was hardcoded to break multi-tab browsers, but they rapidly fixed it).</p>
<blockquote><p>
Details of the compose window</p>
<p>Instead of taking up your entire Gmail window, clicking Compose now opens a smaller window at the bottom of your screen. Here are some of the features that you&#8217;ll see:
</p></blockquote>
<p>All that money you spent on a large screen for your computer? Google doesn&#8217;t want you to use it.</p>
<blockquote><p>
Recipients: Click this text field to type email addresses. You can also click the Cc or Bcc links to add a new set of recipients. Drag and drop recipients from one field to another, or click the &#8220;x&#8221; to remove them from your message. Hover over the recipient to see details about them, or double-click on them to edit their address.
</p></blockquote>
<p>What percentage of emails NEVER use the CC/BCC fields? It&#8217;s hard to believe that this is anything but a step backwards: Google is removing a core feature of email.</p>
<p>If you read the (copious) amount of &#8220;I hate new gmail&#8221; postings on the web, this is one of the top &#8220;hates&#8221;.</p>
<blockquote><p>
Text formatting: Click this icon  to add formatting like font size, bold, underline, and bullets. Or, use our new formatting keyboard shortcuts. Hover over
</p></blockquote>
<p>Gmail Text formatting has never worked well: it frequently breaks in other mail clients, it breaks on *all* Macs (Google breaks the keyboard shortcuts for Mac). It is not a &#8220;good thing&#8221; to make this more prominent.</p>
<blockquote><p>
 each button to learn the keyboard shortcut you can use for that option. Alignment and indentation options are now collapsed under the alignment icon.
</p></blockquote>
<p>Where before you could read &#8220;words&#8221;, you now have to memorize arcane &#8220;hieroglyphs&#8221;. This is terrible UX. This has always been terrible UX. We know this; why does Google insist on it?</p>
<blockquote><p>
Attachments: Click the Attachment icon to attach files to your message. Hovering over the Attachment icon will also open the insert options menu.
</p></blockquote>
<p>The paperclip is rapidly becoming meaningless: people under the age of 30 or so have rarely encountered them. I guess the Google managers who approved this design don&#8217;t care about the billion or so children in the world, don&#8217;t see them as potential customers&#8230;</p>
<blockquote><p>
Insert options: Hover over the plus icon  to embed photos, links, emoticons, and Google Calendar events. This menu will also open when hovering over the Attachment icon.
</p></blockquote>
<p>So &#8230; the same menu is in two places (a common sign of &#8220;failed UX design&#8221;), but is invisible until you hover.</p>
<p>i.e. this is &#8220;broken by design&#8221; on systems that have no mouse.</p>
<p>i.e. this &#8220;new&#8221; system won&#8217;t work on <a href="http://www.ibtimes.co.in/articles/451904/20130330/tablet-outdo-desktop-pc-tablets-smartphones.htm">approximately half (and growing) of computing devices</a>.</p>
<p>Hmm&#8230;</p>
<blockquote><p>
Discard: Click the trash can icon  to delete your draft.
</p></blockquote>
<p><a href="http://www.etymonline.com/index.php?term=discard">&#8220;Discard: first reference 1590&#8242;s&#8221;</a> &#8212; Google believes that a word that has existed for almost 500 years is inferior to the crappy squiggle that one of their staff came up with the other day.</p>
<p>In their new interface, I struggled to find their &#8220;trash can icon&#8221;. Nearest I could see was a hieroglyph that &#8211; by deduction &#8211; was intended to be a &#8220;post modern representation of one person&#8217;s memory of a trash can they once saw&#8221;. I&#8217;ve never seen a trash can that looked like that (maybe it&#8217;s a North American thing?)</p>
<blockquote><p>
More options: Click this menu  to see other tools such as spell check, plain text format, print, adding labels, and including original attachments.
</p></blockquote>
<p>90% of my emails HAVE TO BE in plaintext format, because IT IS THE INTERNATIONAL STANDARD. I have tried Google&#8217;s crappy &#8220;html emails&#8221;; they get rejected by clients, partners, and customers. For good reason. Every email client in the world lets you say &#8220;all emails are plaintext, because emails are by definition plain text&#8221; &#8211; except Google&#8217;s.</p>
<blockquote><p>
Window size: The writing pane grows as your message gets longer. If you want the window to be bigger, click the middle icon at the top right of the pane to open the message in a new window. Use the other icons to minimize or close the window (which will also save your draft).
</p></blockquote>
<p>Why does it grow? When it&#8217;s a reply to a thread, it should start big. Otherwise, how are we supposed to read what we&#8217;re replying to?</p>
<p>Answer: an action that took ZERO CLICKS (reading the thread) now needs CLICK A TINY TINY BUTTON (the &#8220;&#8230;&#8221; button is extremely difficult to hit &#8211; it&#8217;s smaller than the OS-mandated &#8220;minimum button size&#8221; both on Windows and OS X).</p>
<blockquote><p>
Saving: Gmail automatically saves your drafts while you’re writing, so we&#8217;ve removed the &#8220;Save now&#8221; button (but you can verify that it’s saved if you see the word, &#8220;Saved&#8221; next to the Discard button). Your draft will also be automatically saved when you close the compose window.
</p></blockquote>
<p>No, this is not true. Gmail DOES NOT SAVE while you&#8217;re writing. Google has now removed one of the core features of Gmail :(.</p>
<p>(what actually happens: Gmail &#8220;attempts to&#8221; save &#8211; but frequently fails. e.g. if you are using one of <a href="http://www.telegraph.co.uk/finance/9616011/Number-of-smartphones-tops-one-billion.html">the 1 billion smartphones on the planet</a>, or the similar number of &#8220;free wifi&#8221; or &#8220;contested&#8221; connections, Gmail auto-save &#8230; fails &#8230; as soon as the internet connection suffers a hiccup. The internet was designed to work this way &#8211; this is STANDARD BEHAVIOUR &#8211; which Google used to support via the optional button. But apparently: they&#8217;re now ignoring)</p>
<p>Try it for yourself: compose an email on a slow connection, on a laptop, and close the lid. Open it again in a place with slow wifi. Old gmail would show you the issue, and allow you to keep trying until you&#8217;d saved; new gmail simply crashes and fails to save OR SEND the email</p>
<p>(you have to copy/paste the email into a new window, close gmail, open a new window, go to the gmail website, start a new email, copy/paste the email back into gmail. All to achieve something that used to be 2 button clicks!)</p>
<blockquote><p>
Send mail as: If you use Gmail to send mail from another address (like your work address), click the address in the &#8220;From&#8221; field to choose a different address. If you don&#8217;t see the &#8220;From&#8221; field, first click into the &#8220;Recipients&#8221; field at the top of the compose window.<br />
Changes when replying or forwarding
</p></blockquote>
<p>Great. I rarely use this feature, but I thought it used to work the same way before.</p>
<blockquote><p>
You’ll also see some differences when replying to or forwarding messages. Most of the changes are similar to those that you&#8217;ll see when composing a brand new message. Here are a few additional changes
</p></blockquote>
<p>Read carefully: they say &#8220;here are a few additional changes&#8221; &#8211; i.e. they avoid mentioning some of them.</p>
<p>In particular: Google has broken the &#8220;Send&#8221; button, so that it now archives the message as soon as you press it. You can still access the OLD &#8220;Send&#8221; button &#8211; but you have to work very hard to do it: they have changed the colour, changed the position, so that your brain and fingers have to avoid the new Send button. Decades of HCI research show this is extremely difficult to do if you&#8217;ve spent the past few years constantly doing a different action.</p>
<p>I agree this is probably a positive change for many people &#8211; but it&#8217;s a MAJOR change, and it should be an option, not a hardcoded thing.</p>
<blockquote><p>
Recipients: To change who your message should be sent to, click into the recipient field when you’re replying.<br />
Type of response: Click the arrow  next to the recipient’s name to choose whether your message is a reply, reply all, or forward.<br />
Subject: To change the subject of your message, click the arrow  next to the recipient’s name and click Edit subject.<br />
Pop out reply: To write your reply in a compose window, click the arrow next to the recipient’s name and click Pop out reply .
</p></blockquote>
<p>These are pretty meaningless; I couldn&#8217;t understand what they were saying. I guess it will become clear with usage.</p>
<blockquote><p>
Respond inline: If you want to see the previous message within your reply, scroll down until you see the &#8220;Show trimmed content&#8221; icon  and click it.<br />
Try it out!
</p></blockquote>
<p>i.e. According to Google, almost every email I write NOW REQUIRES FOUR CLICKS, where they USED TO REQUIRE ONE CLICK.</p>
<p>Google has done the exact opposite of what they claimed to be doing &#8211; this is:</p>
<p>Faster? No<br />
Simpler? No<br />
More powerful? No</p>
<blockquote><p>
Once you click the Compose button, click the &#8220;new compose experience&#8221; link right next to the Labels button at the top of the message. Until the change is fully launched, you&#8217;ll be able to choose whether you use the new or current experience.<br />
If you change your mind, you can switch back to the old experience at any time. Here&#8217;s how:
</p></blockquote>
<p>&#8220;Until the change is fully launched, we will pretend to care about our users, and our product quality. The truth is: we don&#8217;t. Prepare to be shafted, at some indeterminate future date of our choosing. Have a nice day!&#8221;</p>
<blockquote><p>
Click Compose<br />
At the bottom corner of the message pane, click the More menu icon  next to the Discard button.<br />
Select &#8220;Temporarily switch back to old compose.&#8221;
</p></blockquote>
<p>Where is the &#8220;Permanently remember this change?&#8221; tickbox, as required by all good product design? Oh, that&#8217;s right &#8211; Google doesn&#8217;t care what you think, you will be forced to the new system very soon anyway.</p>
<h3>Haters gonna hate&#8230;</h3>
<p>A quick sampling of <a href="http://google.com/?q=gmail+new+compose">Google search for &#8220;gmail new compose&#8221;</a> suggests that the vast majority of people &#8220;hate&#8221; the new system. Not &#8220;dislike&#8221;, but &#8220;hate&#8221;.</p>
<p>e.g. from the top of TechCrunch&#8217;s comments feed:</p>
<p>&#8220;&#8221;If it isn&#8217;t broken, either break it or discontinue it.&#8221; &#8211; Google&#8221;<br />
&#8220;I hate, hate, hate it! It wasn&#8217;t broken until Google tried to fix it.&#8221;<br />
&#8220;unacceptable, crap, terrible, unintuitive, small, dumb&#8221;<br />
&#8220;Why are you screwing our lives up?  Gives the original system back it worked great.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/31/the-new-gmail-downgraded-hated-by-users/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Apple finally supports Windows 8</title>
		<link>http://t-machine.org/index.php/2013/03/31/apple-finally-supports-windows-8/</link>
		<comments>http://t-machine.org/index.php/2013/03/31/apple-finally-supports-windows-8/#comments</comments>
		<pubDate>Sun, 31 Mar 2013 09:32:20 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2278</guid>
		<description><![CDATA[Apple has finally released drivers for Windows 8 (NB: because Apple takes standard PC hardware and then customizes it, Apple customers are reliant on Apple for &#8220;custom&#8221; drivers; the manufacturer drivers don&#8217;t work) Download link for the new drivers (March 2013) Also: the built-in copy of BootCamp has been updated, if you upgrade OS X [...]]]></description>
				<content:encoded><![CDATA[<p>Apple <a href="http://support.apple.com/kb/DL1638">has finally released drivers for Windows 8</a> (NB: because Apple takes standard PC hardware and then customizes it, Apple customers are reliant on Apple for &#8220;custom&#8221; drivers; the manufacturer drivers don&#8217;t work)</p>
<blockquote><p>
<a href="http://support.apple.com/downloads/DL1638/en_US/BootCamp5.0.5033.zip">Download link for the new drivers (March 2013)</a>
</p></blockquote>
<p>Also: the built-in copy of BootCamp has been updated, if you <a href="http://support.apple.com/kb/DL1640">upgrade OS X to version 10.8.3 or later</a>.</p>
<p>To recap:</p>
<ul>
<li>2011 September: Microsoft releases first beta of Windows 8
<li>2012 May: Microsoft releases final beta of Windows 8
<li>2012 September: Windows 8 (final) goes on sale
<li>&#8230;
<li>2013 March: Apple enables their customers to install Windows 8
</ul>
<p>Even being generous, that&#8217;s an 11 month delay between &#8220;the world discovering that Apple hardware needed a new set of drivers, or Windows 8 wouldn&#8217;t run&#8221; and &#8220;Apple delivering the drivers&#8221;. Many Apple machines were fine, but a large proportion were effectively blocked from running Windows 8 at all. It&#8217;s good to see this finally released, but &#8230; that&#8217;s a pretty poor service from a company the size of Apple.</p>
<p>Worst was the iMacs, where even machines less than 18 months old were (allegedly, according to the Apple.com forums) unusable on Windows 8. You could install it (with some hacks), but then the graphics card was disabled. This means: most major software won&#8217;t run (because the graphics card is used so heavily on modern computers you got corruption of on-screen info, or just massive drops in performance, so that apps were unusable), and definitely: no games.</p>
<p>&#8230;which, after all, is one of the main reasons for Mac users to dual-install Windows.</p>
<p>Interestingly, it seems this was caused by Apple&#8217;s modifications of the ATI graphics card, so that the ATI drivers were convinced there was an external monitor (which Apple didn&#8217;t provide a socket for, so there was nothing you could do &#8211; even if you owned a second monitor).</p>
<p>Interesting because: in the PC world, ATi used to be famous for writing low-quality, poorly-tested graphics drivers. ATi owners were accustomed to poring over every new minor version update &#8220;just in case&#8221; it fixed the glaring bugs in the previous one &#8211; and spent a lot of time de-installing and re-installing the older versions (when the newest version frequently introduced major new bugs).</p>
<p>So &#8230; although it&#8217;s ostensibly Apple to blame here in being so late to fix it, my suspicion is that it was some shoddy code in ATi&#8217;s driver that (accidentally) only affected Apple-modified cards.</p>
<p>3rd Party Device drivers: every OS-developer&#8217;s nightmare!</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/31/apple-finally-supports-windows-8/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tomb Raider 2013 shows games as a force for good</title>
		<link>http://t-machine.org/index.php/2013/03/27/tomb-raider-2013-shows-games-as-a-force-for-good/</link>
		<comments>http://t-machine.org/index.php/2013/03/27/tomb-raider-2013-shows-games-as-a-force-for-good/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 16:22:31 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2276</guid>
		<description><![CDATA[Ashelia/HellMode&#8217;s review of Tomb Raider 2013: &#8220;Tomb Raider triggered me, sure. But it didn’t do it needlessly. It didn’t do it tactlessly. It didn’t do it for a cheap rise. It instead captured a real emotion and a real experience millions of women will encounter in their life. Some of them won’t be as lucky [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://hellmode.com/2013/03/21/this-isnt-the-article-i-wanted-to-write-about-tomb-raider/">Ashelia/HellMode&#8217;s review of Tomb Raider 2013</a>:</p>
<blockquote><p>
&#8220;Tomb Raider triggered me, sure. But it didn’t do it needlessly. It didn’t do it tactlessly. It didn’t do it for a cheap rise. It instead captured a real emotion and a real experience millions of women will encounter in their life. Some of them won’t be as lucky as I was. Some of them won’t be as lucky as Lara Croft was, either. Some of them won’t survive. Some of them will be silenced forever.</p>
<p>Some of them will die and some of their attackers will live.</p>
<p>Tomb Raider triggered me and that’s ok. Maybe that’s even good. I think it is because it means it’s the first realistic, non-gratifying portrayal of violence against women that I’ve seen in video games. It’s the first one I’ve seen that wasn’t exploitive.&#8221;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/27/tomb-raider-2013-shows-games-as-a-force-for-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GDC 2013 feedback on speakers</title>
		<link>http://t-machine.org/index.php/2013/03/27/gdc-2013-feedback-on-speakers/</link>
		<comments>http://t-machine.org/index.php/2013/03/27/gdc-2013-feedback-on-speakers/#comments</comments>
		<pubDate>Wed, 27 Mar 2013 16:15:19 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[games industry]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2271</guid>
		<description><![CDATA[This year: I hadn&#8217;t even left the talk before I got this email: This is excellent. Easy and automated (using the RFID tags in the pass itself, that&#8217;s scanned as you walk in the door), it&#8217;s quick and accurate. As a bonus, I can rely on it to give me an email record of which [...]]]></description>
				<content:encoded><![CDATA[<p>This year: I hadn&#8217;t even left the talk before I got this email:</p>
<p><a href="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-03-26-at-11.36.14.png"><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-03-26-at-11.36.14.png" alt="Screen Shot 2013-03-26 at 11.36.14" width="500" height="210" class="aligncenter size-full wp-image-2273" /></a></p>
<p>This is excellent. Easy and automated (using the RFID tags in the pass itself, that&#8217;s scanned as you walk in the door), it&#8217;s quick and accurate.</p>
<p>As a bonus, I can rely on it to give me an email record of which talks I attended (so I can easily look them up, share with colleagues, etc).</p>
<p>I&#8217;m looking forwards to more conferences doing this&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/27/gdc-2013-feedback-on-speakers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;We are a compromised profession&#8221; (Game Designers)</title>
		<link>http://t-machine.org/index.php/2013/03/20/we-are-a-compromised-profession-game-designers/</link>
		<comments>http://t-machine.org/index.php/2013/03/20/we-are-a-compromised-profession-game-designers/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 18:46:57 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2266</guid>
		<description><![CDATA[Carlo Delallana responds to the sensationalized report that &#8220;I think most game designers really just suck&#8221;: &#8220;One of biggest problems that game designers face in their path towards mastery is respect. It&#8217;s easy to respect an artist with a demonstrable skill, no average person assumes they can do what an engineer does. But game designer? [...]]]></description>
				<content:encoded><![CDATA[<p>Carlo Delallana responds to the sensationalized report that &#8220;I think most game designers really just suck&#8221;:</p>
<blockquote><p>
&#8220;One of biggest problems that game designers face in their path towards mastery is respect. It&#8217;s easy to respect an artist with a demonstrable skill, no average person assumes they can do what an engineer does. But game designer? For one thing our profession faces a common misconception, that game design is coming up with ideas (as noted by Garrott&#8217;s comment on lazy designers). That all you need to do is clone, that you are no better than your competition (as noted by Mark Pincus).</p>
<p>We are a compromised profession, tasked at executing a formula to minimize risk. Unfortunately, executing on formula is counter to mastery of any skill. If the marching order is &#8220;status quo&#8221; instead of &#8220;challenge yourself&#8221; then how does a game designer grow?&#8221;
</p></blockquote>
<p>(NB: Gamasutra clearly did the IMHO scummy journalist thing of sensationalizing RG&#8217;s quote; and RG should have been a lot more careful &#8211; personally I believe he didn&#8217;t mean it the way it came across, but it came across &#8230; badly)</p>
<p>Either way, <a href="http://www.gamasutra.com/view/news/188854/I_think_most_game_designers_really_just_suck__Richard_Garriott.php#comment193625">Carlo&#8217;s reply is worth reading in full</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/20/we-are-a-compromised-profession-game-designers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Download link for Android ADT in 2013</title>
		<link>http://t-machine.org/index.php/2013/03/17/download-link-for-android-adt-in-2013-which-google-wont-share/</link>
		<comments>http://t-machine.org/index.php/2013/03/17/download-link-for-android-adt-in-2013-which-google-wont-share/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 22:34:55 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2261</guid>
		<description><![CDATA[Tonight I lost 30 minutes because Google&#8217;s Android team still has the wrong links on the download page of their website. Every few months someone from their team copy/pastes the wrong link back onto the page&#8230; Android&#8217;s download page (http://tools.android.com/download) says: &#8220;download &#8230;ADT and Tools &#8230; from http://developer.android.com/sdk/index.html &#8221; This is 50% true. The &#8220;Tools&#8221; [...]]]></description>
				<content:encoded><![CDATA[<p>Tonight I lost 30 minutes because Google&#8217;s Android team still has the wrong links on the download page of their website. Every few months someone from their team copy/pastes the wrong link back onto the page&#8230;</p>
<p>Android&#8217;s download page (<a href="http://tools.android.com/download">http://tools.android.com/download</a>) says:</p>
<blockquote><p>
&#8220;download &#8230;ADT and Tools &#8230; from http://developer.android.com/sdk/index.html &#8221;
</p></blockquote>
<p>This is 50% true. The &#8220;Tools&#8221; are on that page (although some poor web design means you now have to jump through silly JavaScript hoops to see them &#8211; this is a new &#8220;feature&#8221;).</p>
<p>&#8230;but &#8220;ADT&#8221; has NOT been on that page for something like 2 years now. I am surprised that no-one cares enough to fix this. You can wipe your system and download 0.5 gigabytes of trash to replace it, hidden inside which is the ADT &#8211; but you cannot get to the ADT itself.</p>
<p>So, until the Android team checks their links and fixes their webpage, here&#8217;s the actual (official!) download page for ADT:</p>
<blockquote><p>
<a href="http://developer.android.com/sdk/installing/installing-adt.html">http://developer.android.com/sdk/installing/installing-adt.html</a> &#8211; Google&#8217;s ADT download page, NB: IGNORE the part at the top, the actual link is in &#8220;Troubleshooting&#8221;, and has been there for 3+ years
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/17/download-link-for-android-adt-in-2013-which-google-wont-share/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Every size you need to know when designing for iOS</title>
		<link>http://t-machine.org/index.php/2013/03/04/every-size-you-need-to-know-when-designing-for-ios/</link>
		<comments>http://t-machine.org/index.php/2013/03/04/every-size-you-need-to-know-when-designing-for-ios/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 16:38:12 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2235</guid>
		<description><![CDATA[References Complex list of what&#8217;s required vs. optional vs. platform &#8211; http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html Building an app, the basics iPhone launchimage/splash Default.png Default-568@2x.png Model Size Model Size 3 + 3GS 320&#215;480 4 + 4S 640&#215;960 5 640&#215;1136 iPad launchimage/splash Default.png Default@2x.png Model Size Model Size 1 + 2 768&#215;1004 or 1024&#215;748 3 + 4 1536&#215;2008 or 2048&#215;1496 [...]]]></description>
				<content:encoded><![CDATA[<h3>References</h3>
<ul>
<li>Complex list of what&#8217;s required vs. optional vs. platform &#8211; <a href="http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html">http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.html</a>
</ul>
<h3>Building an app, the basics</h3>
<h4>iPhone launchimage/splash</h4>
<table border="1">
<tr>
<th colspan="2">Default.png</th>
<th colspan="2">Default-568@2x.png</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>3 + 3GS</td>
<td>320&#215;480</td>
<td></td>
<td></td>
</tr>
<tr>
<td>4 + 4S</td>
<td>640&#215;960</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td>5</td>
<td>640&#215;1136</td>
</tr>
</table>
<h4>iPad launchimage/splash</h4>
<table border="1">
<tr>
<th colspan="2">Default.png</th>
<th colspan="2">Default@2x.png</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>1 + 2</td>
<td>768&#215;1004<br/> or 1024&#215;748</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td>3 + 4</td>
<td>1536&#215;2008<br/> or 2048&#215;1496</td>
</tr>
</table>
<h4>iPhone fullscreen</h4>
<table border="1">
<tr>
<th colspan="2">No status bar</th>
<th colspan="2">with status bar</th>
<th colspan="2">with status bar + navbar</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>3 + 3GS</td>
<td>320&#215;480</td>
<td>3 + 3GS</td>
<td>320&#215;460<br/> or 480&#215;300</td>
<td>3 + 3GS</td>
<td>320&#215;416<br/> or 480&#215;268</td>
</tr>
<tr>
<td>4 + 4S</td>
<td>640&#215;960</td>
<td>4 + 4S</td>
<td>640&#215;920<br/> or 960&#215;600</td>
<td>4S</td>
<td>640&#215;832<br/> or 960&#215;536</td>
</tr>
<tr>
<td>5</td>
<td>640&#215;1136</td>
<td>5</td>
<td>640&#215;1096<br/> or 1136&#215;600</td>
<td>5</td>
<td>640&#215;1008<br/> or 1136&#215;512</td>
</tr>
</table>
<h4>iPad fullscreen</h4>
<table border="1">
<tr>
<th colspan="2">No status bar</th>
<th colspan="2">with status bar</th>
<th colspan="2">with status bar + navbar</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>1 + 2</td>
<td>768&#215;1024</td>
<td>1 + 2</td>
<td>768&#215;1004<br/> or 1024&#215;748</td>
<td>1 + 2</td>
<td>768&#215;960<br/> or 1024&#215;704</td>
</tr>
<tr>
<td>3 + 4</td>
<td>1536&#215;2048</td>
<td>3 + 4</td>
<td>1536&#215;2008<br/> or 2048&#215;1496</td>
<td>3 + 4</td>
<td>1536&#215;1920<br/> or 2048&#215;1408</td>
</tr>
</table>
<h4>iPhone app icons</h4>
<table border="1">
<tr>
<th colspan="2">App</th>
<th colspan="2">iTunes</th>
<th colspan="2">Spotlight</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>3 + 3GS</td>
<td>57&#215;57</td>
<td>3 + 3GS</td>
<td>512&#215;512</td>
<td>3 + 3GS</td>
<td>29&#215;29</td>
</tr>
<tr>
<td>4 + 4S + 5</td>
<td>114&#215;114</td>
<td>4 + 4S + 5</td>
<td>1024&#215;1024</td>
<td>4 + 4S + 5</td>
<td>58&#215;58</td>
</tr>
</table>
<h4>iPad app icons</h4>
<h5>REQUIRED</h5>
<table border="1">
<tr>
<th colspan="2">App</th>
<th colspan="2">iTunes</th>
<th colspan="2">NewsStand (if Newsstand app)</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>1 + 2</td>
<td>72&#215;72</td>
<td>1 + 2</td>
<td>512&#215;512</td>
<td>1 + 2</td>
<td>&gt;= 512</td>
</tr>
<tr>
<td>3 + 4</td>
<td>144&#215;144</td>
<td>3 + 4</td>
<td>1024&#215;1024</td>
<td>3 + 4</td>
<td>&gt;= 1024</td>
</tr>
</table>
<h5>OPTIONAL</h5>
<table border="1">
<tr>
<th colspan="2">Spotlight</th>
<th colspan="2">Settings</th>
</tr>
<tr>
<tr>
<td>Model</td>
<td>Size</td>
<td>Model</td>
<td>Size</td>
</tr>
<tr>
<td>1 + 2</td>
<td>50&#215;50</td>
<td>1 + 2</td>
<td>29&#215;29</td>
</tr>
<tr>
<td>3 + 4</td>
<td>100&#215;100</td>
<td>1 + 2</td>
<td>58&#215;58</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/03/04/every-size-you-need-to-know-when-designing-for-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Touch interfaces: Help for new users (any app)</title>
		<link>http://t-machine.org/index.php/2013/02/24/touch-interfaces-help-for-new-users-any-app/</link>
		<comments>http://t-machine.org/index.php/2013/02/24/touch-interfaces-help-for-new-users-any-app/#comments</comments>
		<pubDate>Sun, 24 Feb 2013 00:19:04 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2229</guid>
		<description><![CDATA[I&#8217;m writing an iPad game that&#8217;s designed to be self-evident and trivial to use. Today, I made a re-usable &#8220;tell the user how many fingers to use&#8221; animation that would work well with any app. So, I decided to open-source it and stick it on github. Screenshot from my current app (NB: you need to [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m writing an iPad game that&#8217;s designed to be self-evident and trivial to use.</p>
<p>Today, I made a re-usable &#8220;tell the user how many fingers to use&#8221; animation that would work well with any app. So, I decided to <a href="https://github.com/adamgit/iOSTouchHelper">open-source it and stick it on github</a>.</p>
<p>Screenshot from my current app (NB: you need to photo YOUR fingers &#8211; not mine! &#8211; if you want it to look like this)</p>
<p><a href="http://t-machine.org/wp-content/uploads/Screenshot-2013.02.24-00.12.10.png"><img src="http://t-machine.org/wp-content/uploads/Screenshot-2013.02.24-00.12.10.png" alt="" title="Screenshot 2013.02.24 00.12.10" width="800" height="600" class="aligncenter size-full wp-image-2230" /></a></p>
<h3>Usage</h3>
<p>Instructions are in the source code, but my intention is for this to be ULTRA SIMPLE for you to use, so here goes:</p>
<pre class="brush: plain; title: ; notranslate">

// Add this to the main UIViewController for your app - the one that displays
//   when you're ready for user interaction
-(void)viewDidAppear:(BOOL)animated
{
	VFingersHelp* helpView = [[[VFingersHelp alloc] init] autorelease];
	/** This will position the helpview in bottom-left corner. Bottom left/right corners are where 
	users prefer to &quot;touch&quot; (c.f. Disney's style guide for toddlers).
	While they're watching the help, we don't want them touching, so we deliberately place in bottom corner.
	(feel free to move to top corner if you prefer).
	NB: it's easy to take a photo of your fingers and display at bottom of screen...
	*/
	helpView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin;
	helpView.center = CGPointMake( 0 + helpView.bounds.size.width/2.0, 2.0 + self.view.bounds.size.height - helpView.bounds.size.height + helpView.bounds.size.height/2.0);
	[self.view addSubview:helpView];
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/02/24/touch-interfaces-help-for-new-users-any-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OS X: Make your Mac load web pages 1000x faster</title>
		<link>http://t-machine.org/index.php/2013/02/16/os-x-make-your-mac-load-web-pages-1000x-faster/</link>
		<comments>http://t-machine.org/index.php/2013/02/16/os-x-make-your-mac-load-web-pages-1000x-faster/#comments</comments>
		<pubDate>Sat, 16 Feb 2013 21:05:21 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2226</guid>
		<description><![CDATA[Apple&#8217;s core networking for OS X (Lion, Mountain Lion, etc) is famously poor. One of the (many) unfixed bugs is this: &#8220;I go to a webpage (e.g. google.com) and my browser displays a message saying &#8216;Server not Found&#8217;. If I keep hitting Refresh, it never works. If I wait a few minutes and try again, [...]]]></description>
				<content:encoded><![CDATA[<p>Apple&#8217;s core networking for OS X (Lion, Mountain Lion, etc) is famously poor. One of the (many) unfixed bugs is this:</p>
<blockquote><p>
&#8220;I go to a webpage (e.g. google.com) and my browser displays a message saying &#8216;Server not Found&#8217;. If I keep hitting Refresh, it never works. If I wait a few minutes and try again, it works&#8221;
</p></blockquote>
<p>This is entirely Apple&#8217;s fault. They aggressively (and incorrectly) cache &#8220;failed&#8221; lookups. And &#8230; because it&#8217;s Apple &#8230; you can&#8217;t turn it off. It&#8217;s been broken for at least 5 years now, which suggests they have no intention of fixing it.</p>
<p>But: you can &#8220;flush&#8221; it. Since it&#8217;s a cache (which are designed to auto-flush anyway), there&#8217;s no harm in doing this.</p>
<h3>Solution: restart Apple&#8217;s DNS cache</h3>
<ol>
<li>Open a Terminal window
<li>type: &#8220;sudo killall -HUP mDNSResponder&#8221;
<ul>
<li>(you&#8217;ll need your admin password, annoyingly, because you&#8217;re &#8216;forcing&#8217; Apple&#8217;s code to behave itself)</li>
</ul>
<li>Reload your webpage &#8211; works immediately
</ol>
<p>After the first time, you can repeat the command frequently without typing your password. Simply hit the &#8220;up&#8221; arrow (to re-type previous command) and Return to run it.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/02/16/os-x-make-your-mac-load-web-pages-1000x-faster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Teenagers learn to program, write own 3D game, in 3 weeks</title>
		<link>http://t-machine.org/index.php/2013/02/09/teenagers-learn-to-program-write-own-3d-game-in-3-weeks/</link>
		<comments>http://t-machine.org/index.php/2013/02/09/teenagers-learn-to-program-write-own-3d-game-in-3-weeks/#comments</comments>
		<pubDate>Sat, 09 Feb 2013 18:14:13 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[computer games]]></category>
		<category><![CDATA[Dare 2 Be Digital]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[GamesThatTeach]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2217</guid>
		<description><![CDATA[Background Last year, Pearson ran the first ever Innov8 competition, giving tech startups a chance to make their own innovative new product/project. The grand prize was £5,000 towards building the product. Most of the teams were adults (even: real companies), but a team of students from Blatchington Mill School won, with their idea for an [...]]]></description>
				<content:encoded><![CDATA[<h3>Background</h3>
<p>Last year, <a href="http://pearson.com">Pearson</a> ran the first ever <a href="http://innov8.pearson.com/">Innov8 competition</a>, giving tech startups a chance to make their own innovative new product/project. The grand prize was £5,000 towards building the product.</p>
<p>Most of the teams were adults (even: real companies), but a team of students from <a href="http://www.blatchingtonmill.org.uk/">Blatchington Mill School</a> won, with their idea for an iPhone/iPad app: &#8220;My Science Lab&#8221;.</p>
<h3>Team: Quantum Games</h3>
<p>The three students named themselves <a href="http://quantumgames.co.uk">&#8220;Quantum Games&#8221;</a>: Jon, Nick, and Oli. All three of them have been studying for their GCSE&#8217;s in parallel with this project.</p>
<p>They&#8217;ve been supported by <a href="http://www.linkedin.com/pub/mark-leighton/6/942/7b3">Mark Leighton, Assistant Head / ICT Director</a> at the school.</p>
<p>For mentoring and game-development expertise, they had <a href="http://uk.linkedin.com/in/adammartin/">me &#8211; Adam Martin &#8211; previously CTO at MindCandy and NCsoft Europe</a>, now an iPhone/Android developer</p>
<h3>Previously</h3>
<p>The students chose to focus on a game that would help other students revise the &#8220;Momentum&#8221; part of GCSE Physics.</p>
<p>In summer/autumn 2012, they learnt the basics of game design and development. We didn&#8217;t do any formal teaching &#8211; they simply had to pick up the skills they needed as we went along. YouTube videos, and &#8220;trial and error&#8221;, were our primary techniques&#8230;</p>
<p>In particular, they learnt 3D-modelling and texturing (using <a href="http://www.wings3d.com/">Wings3D</a> and Photoshop) and game-programming (using <a href="http://www.unity3d.com/">Unity3D</a> and Javascript).</p>
<p>By the end of 2012, they&#8217;d written their own physics engine, some basic gameplay, and a simple simulation of an exercise/problem in Momentum.</p>
<h3>Last month</h3>
<p>The big thing this month has been BETT. Pearson had a large stand, and asked the students along to talk about the project. They gave an excellent presentation to an audience of approx 30 people at BETT, covering the background and some of the things that went well, that didn&#8217;t, and what they&#8217;d learnt from it.</p>
<p>Leading up to BETT, they worked hard to squeeze in a new build of the game, with a rethink on the interactive sections and how they hang together. Unfortunately, we hit what seemed to be a major bug in Unity&#8217;s camera-handling, and none of us could fix it in time (nor could we get an answer from Unity support in time). But the students managed to invent a workaround at the last minute which worked fine for demoing at BETT.</p>
<p>The game isn&#8217;t finished yet &#8211; GCSE&#8217;s and schoolwork left too little time to complete it before BETT &#8211; but we&#8217;re very close now. The students are aiming to finish it off this month and next, and I&#8217;m hoping I might even be able to take a copy to the GDC conference in March (taking place in San Francisco, GDC is the commercial games industry&#8217;s main annual conference).</p>
<p>In the meantime &#8230; you can sign up now on the Quantum Games website (<a href="http://quantumgames.co.uk">http://quantumgames.co.uk</a>), and we&#8217;ll email you as soon as the game is ready &#8211; or sooner, with a private beta-test!</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/02/09/teenagers-learn-to-program-write-own-3d-game-in-3-weeks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>London &#8230; from VERY high up</title>
		<link>http://t-machine.org/index.php/2013/02/03/london-from-very-high-up/</link>
		<comments>http://t-machine.org/index.php/2013/02/03/london-from-very-high-up/#comments</comments>
		<pubDate>Sun, 03 Feb 2013 00:43:07 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[iphone]]></category>
		<category><![CDATA[photos]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2205</guid>
		<description><![CDATA[Courtesy of Gareth, I got a surprise trip to the Shard on opening day, just after sunset. Tragically, I had my DSLR with me and *left it behind* 10 mins before Gareth phoned me, so all this is from an iPhone 4 (gasp!). Even so, it&#8217;s impressive. The Shard is so tall that you get [...]]]></description>
				<content:encoded><![CDATA[<p>Courtesy of <a href="http://thinkgareth.com/">Gareth</a>, I got a surprise trip to the Shard on opening day, just after sunset.</p>
<p>Tragically, I had my DSLR with me and *left it behind* 10 mins before Gareth phoned me, so all this is from an iPhone 4 (gasp!). Even so, it&#8217;s impressive. The Shard is so tall that you get a view of London without the typical &#8220;squashing&#8221; from perspective. Even from airplanes, flying in to Heathrow for many years, I&#8217;ve never seen quite such a decompressed view of London at night&#8230;</p>
<p><a href="http://www.flickr.com/photos/flickering/8438780203/" title="IMG_3417 by ya_hoo_com, on Flickr"><img src="http://farm9.staticflickr.com/8492/8438780203_8215c45073_z.jpg" width="478" height="640" alt="IMG_3417"></a></p>
<p><a href="http://www.flickr.com/photos/flickering/8439868952/" title="IMG_3427 by ya_hoo_com, on Flickr"><img src="http://farm9.staticflickr.com/8356/8439868952_5dbed4fa4a_z.jpg" width="478" height="640" alt="IMG_3427"></a></p>
<p><a href="http://www.flickr.com/photos/flickering/8438786941/" title="IMG_3448 by ya_hoo_com, on Flickr"><img src="http://farm9.staticflickr.com/8088/8438786941_e8b2ec0c2c_z.jpg" width="478" height="640" alt="IMG_3448"></a></p>
<p><a href="http://www.flickr.com/photos/flickering/8439874544/" title="IMG_3452 by ya_hoo_com, on Flickr"><img src="http://farm9.staticflickr.com/8225/8439874544_b650125aba_z.jpg" width="478" height="640" alt="IMG_3452"></a></p>
<p><a href="http://www.flickr.com/photos/flickering/8439875608/" title="IMG_3456 by ya_hoo_com, on Flickr"><img src="http://farm9.staticflickr.com/8324/8439875608_07ddaef0fd_z.jpg" width="478" height="640" alt="IMG_3456"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/02/03/london-from-very-high-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modem dialup noises &#8230; visualised (and transcribed)</title>
		<link>http://t-machine.org/index.php/2013/01/31/modem-dialup-noises-visualised-and-transcribed/</link>
		<comments>http://t-machine.org/index.php/2013/01/31/modem-dialup-noises-visualised-and-transcribed/#comments</comments>
		<pubDate>Thu, 31 Jan 2013 22:44:31 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2202</guid>
		<description><![CDATA[Visual spectral diagram showing the noises modems make, and box-outs for what they&#8217;re actually saying: &#8230;and Transcription for txtrs Modem A: hey babe, you dtmf? Modem B: u know it Modem A: what u up 4 2nite? wanna v.8? Modem B: i wanna ack u like my daddy net2phone use 2 ack me Modem A: [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://windytan.blogspot.fi/2012/11/the-sound-of-dialup-pictured.html">Visual spectral diagram showing the noises modems make, and box-outs for what they&#8217;re actually saying</a>:</p>
<p><img src="http://1.bp.blogspot.com/-ocE3ypOxO_c/UKf6aOz38lI/AAAAAAAAAn0/lwAZYB11ztY/s400/dialup-final.png"/></p>
<p>&#8230;and <a href="http://www.reddit.com/r/programming/comments/17jwoi/dialup_handshake_explained/c86evsf">Transcription for txtrs</a></p>
<blockquote><p>
Modem A: hey babe, you dtmf?<br />
Modem B: u know it<br />
Modem A: what u up 4 2nite?  wanna v.8?<br />
Modem B: i wanna ack u like my daddy net2phone use 2 ack me<br />
Modem A: um ok&#8230; v.8 then<br />
Modem B: lol jk, u comin?<br />
Modem A: brt just gotta turn off echo suppressors n cancellers<br />
Modem B: ok i wait<br />
Modem B: my pcm is so modulated<br />
Modem A: lol rly?  u think u can handle V.90/V.92?<br />
Modem B: D/A?<br />
Modem A: &#8230;D?<br />
Modem B: wtf no, im not into that<br />
Modem A: lol jk we can do V.42 LAPM if u want im down 4 nething<br />
Modem A: up to 3429 o/c<br />
Modem A: u know i give as good as i get, ne way u want it, loud or soft, high or low, fast or slow, i got all the time in the world 4 u babe, my clock source is internal<br />
Modem B: of course no 3429. and same 4 me. except i might lose track of time, lol<br />
Modem B: and honey if u with me we gon be makin sum NOISE<br />
Modem B: 6db at LEAST u know how i like it<br />
Modem A: lol i hear ya, 3200 all nite long, the way u get me goin maybe we even go 2 4800 lol<br />
Modem A: set ur pre-emphasis filter params n put on that 1920 hz carrier frequency i got u<br />
Modem A: im here baby<br />
[SCRAMBLED]
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/31/modem-dialup-noises-visualised-and-transcribed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon and the high-value of a low-margin business model&#8230;</title>
		<link>http://t-machine.org/index.php/2013/01/28/amazon-and-the-high-value-of-a-low-margin-business-model/</link>
		<comments>http://t-machine.org/index.php/2013/01/28/amazon-and-the-high-value-of-a-low-margin-business-model/#comments</comments>
		<pubDate>Mon, 28 Jan 2013 15:18:54 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[games industry]]></category>
		<category><![CDATA[startup advice]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2188</guid>
		<description><![CDATA[Some good observations on tech business strategy here Low-margin can still mean high-value-business: &#8220;Most people just look at a company&#8217;s margins and judge the quality of the business model based on that, but the cash flow characteristics of the business can make one company a far more valuable company than another with the exact same [...]]]></description>
				<content:encoded><![CDATA[<p>Some <a href="http://www.eugenewei.com/blog/2012/11/28/amazon-and-margins">good observations on tech business strategy here</a></p>
<p>Low-margin can still mean high-value-business:</p>
<p>&#8220;Most people just look at a company&#8217;s margins and judge the quality of the business model based on that, but the cash flow characteristics of the business can make one company a far more valuable company than another with the exact same operating margin. Amazon could have had a margin of zero and still made money.&#8221;</p>
<p>Preventing the number-1 biggest threat to a mainstream company (disruption):</p>
<p>&#8220;Study disruption in most businesses and it almost always comes from the low end. Some competitor grabs a foothold on the bottom rung of the ladder and pulls itself upstream. But if you&#8217;re already sitting on that lowest rung as the incumbent, it&#8217;s tough for a disruptor to cling to anything to gain traction.&#8221;</p>
<p>And &#8230; an idea I&#8217;d considered more seriously back when I started in iOS development. This was the perfect way to disrupt agencies (tough and unpleasant though it was):</p>
<p>&#8220;Not having to sweat a constant onslaught of new competitors is really underrated. You can allocate your best employees to explore new lines of business, you can count on a consistent flow of cash from your more mature product or service lines, and you can focus your management team on offense. I&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/28/amazon-and-the-high-value-of-a-low-margin-business-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virgin Atlantic &#8211; how to get them to phone you back</title>
		<link>http://t-machine.org/index.php/2013/01/28/virgin-atlantic-how-to-get-them-to-phone-you-back/</link>
		<comments>http://t-machine.org/index.php/2013/01/28/virgin-atlantic-how-to-get-them-to-phone-you-back/#comments</comments>
		<pubDate>Mon, 28 Jan 2013 15:06:25 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2198</guid>
		<description><![CDATA[Here&#8217;s the magic URL, that you can&#8217;t access directly from the site: http://www.virgin-atlantic.com/en/gb/bookflightsandmore/bookflights/callme.jsp Huh? In 5+ years of flying with Virgin, their online booking system has always, every single time, failed &#8211; and redirected me to a page where I get that link to get THEM to phone ME. (which is useful, since the evil [...]]]></description>
				<content:encoded><![CDATA[<p>Here&#8217;s the magic URL, that you can&#8217;t access directly from the site:</p>
<p>http://www.virgin-atlantic.com/en/gb/bookflightsandmore/bookflights/callme.jsp</p>
<h4>Huh?</h4>
<p>In 5+ years of flying with Virgin, their online booking system has <em>always, every single time, failed</em> &#8211; and redirected me to a page where I get that link to get THEM to phone ME.</p>
<p>(which is useful, since the evil mobile network operators don&#8217;t like Virgin&#8217;s 08-something numbers, and turn them into premium-rate bills)</p>
<p>It&#8217;s a pain going to the site, going through the pointless online booking, knowing that you&#8217;ll end up on the &#8220;our booking system sucks, click here&#8221; page.</p>
<p>So I&#8217;m blogging this so I never need to do it again!</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/28/virgin-atlantic-how-to-get-them-to-phone-you-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How middleware (and open source) downloads ought to work &#8211; Unity3D</title>
		<link>http://t-machine.org/index.php/2013/01/28/how-middleware-and-open-source-downloads-ought-to-work-unity3d/</link>
		<comments>http://t-machine.org/index.php/2013/01/28/how-middleware-and-open-source-downloads-ought-to-work-unity3d/#comments</comments>
		<pubDate>Mon, 28 Jan 2013 10:44:21 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[startup advice]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2194</guid>
		<description><![CDATA[While upgrading Unity, I noticed the current download page is a great example of how it SHOULD be done: Unity 4 has some &#8230; issues &#8230; with backwards compatibility &#8211; but at least they made the &#8220;need an older version?&#8221; link prominent. And how many old versions can you download? Many! (it goes on right [...]]]></description>
				<content:encoded><![CDATA[<p>While upgrading Unity, I noticed the current download page is a great example of how it SHOULD be done:</p>
<p><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-01-28-at-10.24.33.png" alt="" title="Screen Shot 2013-01-28 at 10.24.33" width="351" height="291" class="aligncenter size-full wp-image-2195" /></p>
<p>Unity 4 has some &#8230; issues &#8230; with backwards compatibility &#8211; but at least they made the &#8220;need an older version?&#8221; link prominent. And how many old versions can you download?</p>
<p>Many!</p>
<p><a href="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-01-28-at-10.26.48.png"><img src="http://t-machine.org/wp-content/uploads/Screen-Shot-2013-01-28-at-10.26.48.png" alt="" title="Screen Shot 2013-01-28 at 10.26.48" width="891" height="466" class="aligncenter size-full wp-image-2196" /></a></p>
<p>(it goes on right back to unity 3.0)</p>
<h4>Old versions? Who cares!</h4>
<p>Well, that backwards compatibility thing is a *****. If you work on a project with other people, and they&#8217;re using Unity 3.5 &#8230; you SHOULD NOT (must not?) use Unity 4 (there be Dragons).</p>
<p>But it&#8217;s fine; Unity makes it trivial for anyone joining such a project to get exactly the version they need.</p>
<p>Some games middleware *cough*<a href="http://hansoft.com">Hansoft</a>*cough* companies declare that everyone must use the latest version, even if it is buggy and breaks existing projects. Or if it requires staff retraining. You must retrain EVERYONE! NOW!</p>
<p>(Hansoft has probably changed by now &#8211; maybe unfair to single them out. But for a long time they only allowed you to download the &#8220;latest&#8221; version, and actively <em>deleted</em> everything else. As soon as a new version existed, BOOM! Everything else got wiped. A happy customer I was not)</p>
<h4>Recap</h4>
<p>So, here we have a piece of middleware, with a download page:</p>
<ul>
<li>Lives at an obvious, permanent URL: <a href="http://unity3d.com/unity/download/">http://unity3d.com/unity/download/</a>
<li>Makes it very easy to find the download link (many open-source projects: shame on you)
<li>Uncluttered webpage, and makes it easy to understand which download you want (<a href="http://Eclipse.org">Eclipse.org</a>: shame on you)
<li>Every version has its release notes right there, for you to click on! (Apple (every product), and <a href="http://firefox.com">Firefox</a>: shame on you)
<li>Every version has BOTH the windows AND the mac downloads (computers today are cheaper than they&#8217;ve ever been. Many people have a laptop thats Mac, and desktop that&#8217;s Windows, or vice versa. You can&#8217;t assume that the browser they&#8217;re using dictates the desktop they&#8217;ll be working from)
</ul>
<p>Designing a website to look simple is certainly a difficult and non-trivial task.</p>
<p>But in the case of a download page &#8211; where almost everyone has the same needs, and there are many examples to copy (plagiarise) from &#8211; it doesn&#8217;t take much. More projects (and companies) should at least try to do this.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/28/how-middleware-and-open-source-downloads-ought-to-work-unity3d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unity crash: &#8220;type == kMetaAssetType &amp;&amp; pathName.find (&#8220;library/metadata&#8221;) != 0&#8243;</title>
		<link>http://t-machine.org/index.php/2013/01/27/unity-crash-type-kmetaassettype-pathname-find-librarymetadata-0/</link>
		<comments>http://t-machine.org/index.php/2013/01/27/unity-crash-type-kmetaassettype-pathname-find-librarymetadata-0/#comments</comments>
		<pubDate>Sun, 27 Jan 2013 15:10:29 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games publishing]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2190</guid>
		<description><![CDATA[Unity&#8217;s QA dept needs a smack up-side the head. If you get this bug, you&#8217;re a bit screwed &#8211; the only &#8220;fix&#8221; is to go into system settings and wipe Unity&#8217;s crud. Error message: type == kMetaAssetType &#038;&#038; pathName.find (&#8220;library/metadata&#8221;) != 0 Thanks, Unity, that&#8217;s very human-readable and helpful. Not. (appears to be an Assert [...]]]></description>
				<content:encoded><![CDATA[<p>Unity&#8217;s QA dept needs a smack up-side the head. If you get this bug, you&#8217;re a bit screwed &#8211; the only &#8220;fix&#8221; is to go into system settings and wipe Unity&#8217;s crud.</p>
<p>Error message:</p>
<blockquote><p>
type == kMetaAssetType &#038;&#038; pathName.find (&#8220;library/metadata&#8221;) != 0
</p></blockquote>
<p>Thanks, Unity, that&#8217;s very human-readable and helpful. Not.</p>
<p>(appears to be an Assert written by a junior programmer &#8211; or a debug-only Assert that got left in the shipping version(!))\</p>
<p>Problem:</p>
<ol>
<li>Unity&#8217;s tech team wrote Unity 3 so that it would open projects BEFORE checking if there was a new version available
<li>Unity 4 is NOT backwards compatible; it corrupts projects so that they will NEVER load in Unity 3.x
<li>&#8230;also: Unity 3.5 will FATAL CRASH if it tries to open a Unity 4 project
<li>Unity (generally) is badly written and auto-opens the last project, even if you don&#8217;t want to, and EVEN IF ITS CORRUPT
<li>Unity (generally) DOESN&#8217;T BOTHER to offer any way of starting &#8220;safely&#8221;
</ol>
<p>Solution (OS X):</p>
<ol>
<li>Force-quit Unity (not only does it crash, but it hangs forever) &#8211; RMB on the icon, hold down alt/option, and the Force Quit option appears
<li>run Finder, go to (your user)/Library, aka &#8220;~/Library&#8221;. If you don&#8217;t know how, then do ONE OF the following (either works):
<ul>
<li>EITHER: Start at your username folder (it&#8217;s the parent folder of your Desktop folder, parent of your Documents folder, etc), un-break OS X (Apple ships it as broken-by-default): google for &#8220;enable see Library folder in Finder&#8221;, follow the instructions
<li>OR: In Finder&#8217;s &#8220;Go&#8221; menu, select &#8220;Go to folder&#8221;, and type &#8220;~/Library&#8221;
<ul>
<li>Inside Library, find &#8220;Preferences&#8221; folder
<li>Find *everything* that begins &#8220;com.unity3d.&#8221; and delete it (there are approx 20 files, of 2 different file types)
<li>Re-start Unity, and it will open the default project
<li>&#8230;And this time, Unity will offer to upgrade to Unity 4
</ol>
<h4>UPDATE</h4>
<p>For bonus points, the Unity 4 &#8220;upgrade&#8221; isn&#8217;t an upgrade: it&#8217;s a replacement. I expected it to download &#8220;the bits that have changed&#8221;. Nuh-uh. One gigabyte download! (try getting that in a hurry, when your project has suddenly imploded in front of you, because of the non-existent backwards-compatibility :( ).</p>
<h4>Some idle thoughts&#8230;</h4>
<p>I&#8217;ve seen similar behaviour before when writing very simple OS X apps. There&#8217;s some massive bugs in Apple&#8217;s code that have been around for 5+ years (and Apple shows no intention of fixing), which cause &#8220;startup actions&#8221; to happen in a semi-random order, depending on the NAME and NUMBER of recently-opened projects.</p>
<p>It takes very little testing to discover this. If it&#8217;s the problem with the Unity software, then Unity needs to seriously improve their testing on OS X &#8211; they should have discovered this easily.</p>
<p>But also &#8230; why on earth are they using the NSDocument loading system? Apple never finished writing the docs for it, they seem to have never finished implementing it (major bits of the API seem to be missing) &#8211; in general, OS X authors don&#8217;t seem to use it any more. Probably because it doesn&#8217;t work?</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/27/unity-crash-type-kmetaassettype-pathname-find-librarymetadata-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Installing Windows on a Mac: what you need to know (2013)</title>
		<link>http://t-machine.org/index.php/2013/01/25/installing-windows-on-a-mac-what-you-need-to-know-2013/</link>
		<comments>http://t-machine.org/index.php/2013/01/25/installing-windows-on-a-mac-what-you-need-to-know-2013/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 12:32:39 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2182</guid>
		<description><![CDATA[Prologue: Apple et al recommend you &#8220;install new OS&#8217;s from USB, not DVD &#8211; USB is faster&#8221;, but I&#8217;ve never bothered before. However, there appears to be a major defect in most Apple iMacs, where the DVD drives fail after only a dozen or so uses (google it and there&#8217;s depressingly-long forum threads of people [...]]]></description>
				<content:encoded><![CDATA[<p>Prologue: Apple et al recommend you &#8220;install new OS&#8217;s from USB, not DVD &#8211; USB is faster&#8221;, but I&#8217;ve never bothered before. However, there appears to be a major defect in most Apple iMacs, where the DVD drives fail after only a dozen or so uses (google it and there&#8217;s depressingly-long forum threads of people reporting the same problem). When this hit my iMac, I was forced to explore the USB alternatives&#8230;</p>
<h4>Windows 8 boots the same way Macs do</h4>
<p>With the arrival of Windows 8, much of what we see on the web about &#8220;installing windows&#8221; or &#8220;booting windows&#8221; is wrong &#8212; including Apple&#8217;s own Bootcamp (currently: almost a year out of date, badly broken, and Apple hasn&#8217;t announced a fix. Sigh).</p>
<p>Allegedly (confirmed by direct experience, but I&#8217;m no expert on this) &#8211; Windows 7 (and previous versions) used &#8220;MBR&#8221; booting. Intel Macs use the more modern &#8220;GPT&#8221; booting &#8211; and Windows 8 has finally dropped backwards compatibility, and uses GPT too.</p>
<p>So, as of 2013: there is nothing &#8220;special&#8221; needed to make a Mac boot in Windows 8</p>
<p>In fact, if you try to, Windows 8 install WILL FAIL because it doesn&#8217;t support the old MBR booting any more (it even produces a clear, helpful error message explaining why)&#8230;</p>
<h4>If something ruins your booting, fix from command line</h4>
<p>For power-users who know what they&#8217;re doing, <a href="http://apple.stackexchange.com/a/55314">this stack-exchange answer gives good step-by-step instructions</a> (with explanations!) on how to &#8220;un-break&#8221; a broken boot setup on Mac. Worth bookmarking (I used it to fix one of my machines).</p>
<p>NB: all the tools they use in that answer are pre-installed with the Mac and have &#8220;man&#8221; docs &#8211; type &#8220;man (command name)&#8221; in Terminal to read them.</p>
<p>NB: you can run these tools straight away, but they will probably refuse to &#8220;save changes&#8221; because you&#8217;re using the disk they&#8217;re trying to change (mentioned in the link above). You&#8217;ll need to boot into a special &#8220;repair mode&#8221; &#8211; see below:</p>
<p>NB: if you mis-type the instructions on that page, you probably will wipe your hard disk. Don&#8217;t try this while tired/drunk/etc &#8211; or at least take a full backup of your computer first!</p>
<h4>An OS X &#8220;emergency boot USB drive&#8221; is only 1GB</h4>
<p>The web is plagued with technically unskilled &#8220;journalists&#8221; who write articles about &#8220;make a USB boot disk for OS X&#8221;, and all they do is copy/paste Apple&#8217;s own instructions on how to INSTALL OS X (and then they claim credit for it).</p>
<p>The OS X installer requires a 4GB &#8211; or, if you&#8217;re unlucky, an 8GB &#8211; USB key. That&#8217;s 8x what you actually need.</p>
<p>It is faster, easier, and safer to <a href="http://support.apple.com/downloads/DL1433/en_US/RecoveryDiskAssistant.dmg">use Apple&#8217;s own &#8220;Make an OS X Bootable USB key&#8221; app</a>, which works on any USB drive that&#8217;s 1 GB or larger.</p>
<p>You can even <a href="http://www.coolestguyplanettech.com/make-a-bootable-usb-drive-of-os-x-10-8-mountain-lion-using-the-recovery-partition/">create the USB key without downloading the special app</a> &#8211; although it requires more fiddling (I recommend: download the app. It&#8217;s small and trivial to use).</p>
<p>NB: if you own a mac, make one of these now. Do something useful with those crappy 1GB USB keys you have gathering dust on the shelf!</p>
<h4>OS X has an Emergency Partition by default &#8211; but you can&#8217;t use it</h4>
<p>Because those USB boot disks are so massively valuable, Apple now includes a hidden one on your hard disk too, so that you can boot into that and &#8220;fix&#8221; your main OS X even if you don&#8217;t have a USB drive.</p>
<p>Here&#8217;s <a href="http://mac.tutsplus.com/tutorials/security/the-os-x-recovery-partition-what-it-is-why-its-there-and-how-to-remove-it/">more info on the &#8220;Recovery Partition&#8221;</a> as its called.</p>
<p>HOWEVER: since that&#8217;s installed on the same disk you&#8217;re partitioning, &#8230; most / all of the disk-repair / disk-alteration utilities are still disabled. That&#8217;s why you want/need a USB emergency disk! </p>
<h4>Apple&#8217;s emergency boot disk doesn&#8217;t support all USB devices (e.g. some mice)</h4>
<p>Even devices that work during the Apple boot-menu are DISABLED BY APPLE in their &#8220;emergency repair / boot&#8221; setup.</p>
<p>But without a mouse, you cannot get to the OS X menubar.</p>
<p>And Apple designed their &#8220;emergency&#8221; system so that most of the features can ONLY be reached viw the menubar (hmm. They really didn&#8217;t think that one through&#8230;)</p>
<p>So, memorize this keyboard shortcut: ctrl-f2 (or, on a wireless keyboard or laptop: fn-ctrl-f2).</p>
<p>That hilights the &#8220;apple symbol&#8221; menu, and you can then use cursor keys to reach the other menus.</p>
<h4>Apple won&#8217;t let you create a USB Windows installer unless you have a MacBook Air</h4>
<p>Someone at Apple went out of their way to make life miserable for Apple customers. If you own (or can borrow) a MacBook Air, Apple&#8217;s Bootcamp enables an extra &#8220;magic feature&#8221;: it will create the Windows 8 install USB key for you. (NB: requires a 4GB or greater USB key).</p>
<p>&#8230;but if you try this on any other physical Mac, Apple blocks that feature. The key you create will work on EVERY Mac &#8211; there&#8217;s nothing magical about it.</p>
<p>NB: if you have a Windows 8 DVD but don&#8217;t own an Air, and you know someone who does, it&#8217;s probably worth borrowing theirs now, to make one of those keys, in case you need it later!</p>
<p>NB: alternatively, if you have access to a machine that already has Windows installed, you can use <a href="http://www.microsoftstore.com/store/msstore/html/pbPage.Help_Win7_usbdvd_dwnTool">Microsoft&#8217;s &#8220;create a Windows8 boot disk / installer&#8221; app (says win7, but works for win8 too)</a>. Unless you have a recent version of Windows, though, you&#8217;ll need to download hundreds of megabytes of .NET updates before this will run &#8211; which makes this a slow and irritating option.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/25/installing-windows-on-a-mac-what-you-need-to-know-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free art can help create a generation of non-pirates</title>
		<link>http://t-machine.org/index.php/2013/01/23/free-art-can-help-create-a-generation-of-non-pirates/</link>
		<comments>http://t-machine.org/index.php/2013/01/23/free-art-can-help-create-a-generation-of-non-pirates/#comments</comments>
		<pubDate>Wed, 23 Jan 2013 22:34:25 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[GamesThatTeach]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2167</guid>
		<description><![CDATA[The 21st century will be dominated by &#8220;digital&#8221; culture and art. History suggests that non-digital art will flourish too (while becoming a smaller, more specialized, part of a larger pie). So it&#8217;s all good: more people will have more opportunities to create &#8211; and more access to experience &#8211; a wider array of art. Win/win! [...]]]></description>
				<content:encoded><![CDATA[<p>The 21st century will be dominated by &#8220;digital&#8221; culture and art. History suggests that non-digital art will flourish too (while becoming a smaller, more specialized, part of a larger pie). So it&#8217;s all good: more people will have more opportunities to create &#8211; and more access to experience &#8211; a wider array of art. Win/win!</p>
<p>Except &#8230; our societies are struggling to work out how we&#8217;ll pay our artists when the marginal price of a copy is less than a penny.</p>
<p>Last week, something interesting happened when several unrelated projects I&#8217;m in all came together at once.</p>
<h3>Someone is &#8216;stealing&#8217; from CGTextures.com</h3>
<p>Marcel at <a href="http://www.cgtextures.com/">http://www.cgtextures.com/</a> gives away a huge library of high-res photo textures, aimed at game-developers, entirely for free. You don&#8217;t pay for access, you don&#8217;t pay to use them. You can include them in commercial games, make a million dollars &#8211; and you owe him nothing (bar gratitude).</p>
<p>Last week he came to a private forum asking for advice on suspected copyright infringers, who might have been taking his free images, removing the attribute/authorship info, and selling them for themselves.</p>
<p>Copying the images, and charging for them, is not theft. It&#8217;s illegal, but it&#8217;s not stealing. The original source is still available &#8211; free &#8211; to anyone who wants it. And many authors in this case are inclined to let the scummers go free, so long as they stop charging innocent users for something that&#8217;s free to all.</p>
<p>But CGTextures isn&#8217;t free to run; if they ever need to raise funds to pay for it, some of that money &#8211; which the community would happily donate &#8211; is being taken right now by a selfish scummer. Hmm. Tricky.</p>
<h3>3D art is hard</h3>
<p>If you&#8217;re &#8220;not an artist&#8221; (which for most people means: &#8220;I&#8217;m crap at drawing/painting!&#8221;) then making any kind of 2D art is very difficult, and tends to look like utter crap.</p>
<p>Computer games are dominated by good or great art. Even in the Indie scene, where &#8220;teams&#8221; are often no more than 2 people working together, we have a blinding array of beautiful artworks. At the opposite end of the spectrum &#8211; the AAA titles with budgets counted in &#8220;tens of millions&#8221; of dollars &#8211; it only gets better.</p>
<p>People love playing games &#8211; and they love making them too. Many people &#8211; artists and programmers &#8211; dream of &#8220;making a game&#8221;. But &#8230; just like &#8220;I&#8217;ve a great idea for a book&#8221; &#8230; the vast majority never manage it.</p>
<p>Two of the most common reasons they fail:</p>
<ol>
<li>Aiming too high: games require a lot more work than people imagine, and most people get 10% in and discover they&#8217;ve bitten off way too much to chew
<li>The artwork looks crap: everyone they show it to hates it (or they dont dare show it), the author hates it, they realise that no-one will play it, let alone pay for it, and they gradually lose the will to finish the project
</ol>
<h3>Anyone can make a game: even un-trained teenagers</h3>
<p>We&#8217;re in the final few weeks of proving this (a team of three 15-year-olds are about to publish their iPhone game that they designed, built, tested, and launched from scratch).</p>
<p>Starting with nothing but beginner-level knowledge of Javascript (not enough to write an app), they&#8217;ve:</p>
<ol>
<li>Learnt Javascript
<li>Learnt 3D-modelling
<li>Created all their own 3D models, with textures
<li>Built, tested, and refined a working game
</ol>
<p>Sounds hard, right? Well, yes, it was. But &#8211; if you know enough tricks of the trade &#8211; most of that can be made easy enough for anyone to do themselves.</p>
<ol>
<li>Game structure &#8211; use an established game engine
<li>Programming &#8211; stick to &#8220;simple&#8221; programming concepts
<li>In-game artwork &#8211; &#8220;stylised&#8221; 3D models are trivial to create (c.f. Minecraft)
<li>Testing &#8211; use a modern IDE with a decent debugger
</ol>
<p>This is all great, but I&#8217;ve glossed-over one item there: textures. You can avoid the need for painting skills by making your game-items 3D instead of 2D, but sooner or later you&#8217;re going to need to texture them.</p>
<h3>JFGI</h3>
<p>With the programming, one of the skills I&#8217;ve drummed into them is JFGI (Just F&#8217;ing Google It). Everytime you get stuck: google it. If you get no hits &#8211; fine, you&#8217;ll have to work it out yourself. But often you&#8217;ll find:</p>
<ol>
<li>It&#8217;s a bug in your tools, not your fault! Here&#8217;s a workaround&#8230;
<li>It&#8217;s practically impossible; don&#8217;t waste time trying to solve it&#8230;
<li>Your software documentation / manual was missing the following info: &#8230;
<li>It&#8217;s a generic boilerplate piece of code. Don&#8217;t worry about it, but use this copy/pasteable code solution: &#8230;
</ol>
<p>Leveraging the internet as a resource is fundamental to being a great programmer. I&#8217;ll gloss over the risks / dangers for now (I&#8217;ll write another post on that later), but most of the time you cannot JFGI too often.</p>
<p>But &#8230; with the 2D artwork, with the textures for 3D models &#8230; Google becomes a danger.</p>
<h3>Google Images: the devil on your shoulder</h3>
<p>Writing a presentation, and need an image? Google Images it!</p>
<p>&#8230;making a game, and need a &#8220;wood texture&#8221;? Google Images it!</p>
<p>WHOA THERE, JOHNNY!</p>
<p>Doesn&#8217;t feel like stealing (that&#8217;s cos it isn&#8217;t) &#8211; but it is something illegal: copyright infringement. It&#8217;s precisely why &#8220;copyright&#8221; was invented in the first place.</p>
<p>And yet: this single problem can make all your effort, all your hard work on your own creative artwork (your game), invalid. You can have the most sublime game design, a control system that a toddler can master, a frame-rate as smooth as silk &#8230; but if the 2D graphics (or the textures) are crap &#8230; the whole thing falls flat on its face. And most people can&#8217;t draw.</p>
<h4>How the pros do it</h4>
<p>There are simple techniques for making very good textures starting from random photographs. Even a novice can create something perfectly &#8220;good enough&#8221; in a short amount of time.</p>
<p>Only one thing is needed: a big library of photographs, MORE THAN ONE per real-world &#8220;texture&#8221; you need to create. If you have the money, there are dozens of Stock Photography resources, each one costing hundreds (or: thousands) of dollars a year.</p>
<p>But if you&#8217;re students &#8211; undergraduates, high-schoolers &#8211; or simply &#8220;not rich&#8221; (&#8220;artist&#8221; isnt&#8217; exactly a high-paid career) and working on your own, you probably don&#8217;t have &#8220;hundreds of dollars&#8221;.</p>
<p>Hey, I know! Let&#8217;s use Google Imag- &#8230; crap.</p>
<p>Enter stage left: &gt; <a href="http://www.cgtextures.com/">http://www.cgtextures.com/</a> &#8211; a FREE, ROYALTY-FREE, MASSIVE collection of photographs DESIGNED FOR USING IN COMPUTER GAMES. Why? I guess Marcel is just a naturally generous person.</p>
<p>I showed the guys CGT. No problem; texture sources a-plenty. And it&#8217;s all free. And legal&#8230;</p>
<h3>Full circle</h3>
<ol>
<li>potential pirates who are &#8216;creating&#8217; are happy to respect copyright, if you educate them early enough &#8230; so long as they have viable alternatives
<li>if you take away the alternatives, they must weigh up the moral &#8220;cost&#8221; of infringement against the moral &#8220;benefit&#8221; (and personal satisfaction) of completing their own work
<ul>
<li>I&#8217;m not advocating this piracy; but where no theft is involved, to most people&#8217;s minds the cost is tiny and the benefit is huge. Realistically I expected few people to resist when he temptations &#8211; both moral and practical &#8211; are so big
</ul>
<li>sites like CGTextures put &#8220;artistic creation with 3D&#8221; in reach of everyone
<li>pirating art from CGTextures is &#8211; AFAICS &#8211; only a criminal activity: illegally extract money from someone else&#8217;s work, with no &#8216;creation&#8217; involved
<li>&#8230;but if sites like CGTextures go away (if Marcel gives up), and the next generation of artists lose their alternatives, &#8220;copyright&#8221; has no chance at all
</ol>
<p>IMNSHO, anti-software-piracy organizations tend to be <a href="http://t-machine.org/index.php/2012/02/04/drm-and-the-consumer/">idiotic, amoral, and begging to be nuked from orbit</a>. They&#8217;re often <em>part of the problem</em>, not the solution. If they genuinely wanted to reduce piracy, they should be creating sites like Marcel&#8217;s: royalty-free resources of reduced cost that their industries could easily afford to give away for free.</p>
<p>The debate has &#8211; for way too long &#8211; characterized software pirates as &#8220;inherently evil; bad-doers; malicious&#8221;. This is undoubtedly true of some (my opionions of anyone re-selling CGT&#8217;s free art are unprintable). But we&#8217;re not born as software-pirates; we get that way because of the culture and society we grow up in. We have the opportunity to teach new generations respect for copyright &#8211; but that cuts both ways.</p>
<p>In the Digital Age, copyright needs to <em>deserve</em> our respect, not simply <strong>demand</strong> it.</p>
<h5>Some other free texture sites</h5>
<p>While checking some of the points in this post, I noticed a few other photo-texture sites that offer royalty-free images suitable for games dev, worth checking out:</p>
<ul>
<li><a href="http://cgtextures.com">http://cgtextures.com</a>
<li><a href="http://www.openfootage.net/">http://www.openfootage.net/</a>
<li><a href="http://www.goodtextures.com/">http://www.goodtextures.com/</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/23/free-art-can-help-create-a-generation-of-non-pirates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The cost of interrupting someone &#8230; analysed</title>
		<link>http://t-machine.org/index.php/2013/01/23/the-cost-of-interrupting-someone-analysed/</link>
		<comments>http://t-machine.org/index.php/2013/01/23/the-cost-of-interrupting-someone-analysed/#comments</comments>
		<pubDate>Wed, 23 Jan 2013 18:38:44 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[startup advice]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2179</guid>
		<description><![CDATA[&#8220;Based on a analysis of 10,000 programming sessions recorded from 86 programmers using Eclipse and Visual Studio and a survey of 414 programmers (Parnin:10), we found: A programmer takes between 10-15 minutes to start editing code after resuming work from an interruption. When interrupted during an edit of a method, only 10% of times did [...]]]></description>
				<content:encoded><![CDATA[<blockquote><p>
&#8220;Based on a analysis of 10,000 programming sessions recorded from 86 programmers using Eclipse and Visual Studio and a survey of 414 programmers (Parnin:10), we found:</p>
<ul>
<li>    A programmer takes between 10-15 minutes to start editing code after resuming work from an interruption.</p>
<li>    When interrupted during an edit of a method, only 10% of times did a programmer resume work in less than a minute.
<li>    A programmer is likely to get just one uninterrupted 2-hour session in a day
</ul>
<p>We also looked at some of the ways programmers coped with interruption:</p>
<ul>
<li>    Most sessions programmers navigated to several locations to rebuild context before resuming an edit.
<li>    Programmers insert intentional compile errors to force a “roadblock” reminder.
<li>    A source diff is seen as a last resort way to recover state but can be cumbersome to review
</ul>
<p>&#8221;
</p></blockquote>
<p>The full article &#8211; <a href="http://blog.ninlabs.com/2013/01/programmer-interrupted/">http://blog.ninlabs.com/2013/01/programmer-interrupted/</a> &#8211; includes graphs, analysis techniques, suggested tools / features that help to fix the problems, etc. Good reading.</p>
<p>Also some good comments, for instance:</p>
<h4>The less-quoted benefit of Pair Programming</h4>
<p>&#8220;I was surprised to discover whenI first started pair programming 13 years ago, how one person ia a pair can hold the context while the other person in the pair gets interrupted. We could get back to work in seconds.&#8221;</p>
<h4>The less-quoted benefit of TDD</h4>
<p>&#8220;I was also surprised by test-driven development, how it helps keep track of where you are. Here are some of the factors I&#8217;ve noticed:<br />
* The test tell you how far you have gone.<br />
* Your test list serves as a reminder of where you need to still get to.<br />
* The focus on small steps meas at any instance there are fewer balls in the air.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/23/the-cost-of-interrupting-someone-analysed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to export timesheets from OfficeTime</title>
		<link>http://t-machine.org/index.php/2013/01/21/how-to-export-timesheets-from-officetime/</link>
		<comments>http://t-machine.org/index.php/2013/01/21/how-to-export-timesheets-from-officetime/#comments</comments>
		<pubDate>Mon, 21 Jan 2013 10:19:42 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[fixing your desktop]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2162</guid>
		<description><![CDATA[OfficeTime is one of the more popular/higher rated time-tracking apps for iOS / OS X. On the whole, it&#8217;s fine. But exporting the data &#8211; which is half of the app&#8217;s purpose &#8211; is extremely difficult. There&#8217;s no docs I could find either in the app or on the website. You have to google, get [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.officetime.net">OfficeTime</a> is one of the more popular/higher rated time-tracking apps for iOS / OS X. On the whole, it&#8217;s fine.</p>
<p>But exporting the data &#8211; which is half of the app&#8217;s purpose &#8211; is extremely difficult. There&#8217;s no docs I could find either in the app or on the website. You have to google, get lucky, and find some old blog posts by the author with hints. And even then you still have to jump through a 9-step process.</p>
<p>Every time I need to do this, its sufficiently un-obvious that I forget how and have to figure it out again. So, here&#8217;s a step by step:</p>
<ol>
<li>You must have a wifi network that both your computer and iphone are on
<ul>
<li>Yes, really :(.
</ul>
<li>Run OfficeTime on the desktop
<li>Create a new project you will never use (author requires you to do this &#8211; if you don&#8217;t create the blank project, the app quits itself!)
<ul>
<li>I prefer names like &#8220;Delete this that Officetime created&#8221;
</ul>
<li>Run the app on iphone
<li>Go to the Settings menu (cog icon from the home screen)
<li>Select &#8220;Desktop Sync&#8221;
<li>Select &#8220;Sync with&#8221;
<li>&#8230;if everything&#8217;s working, your computer name will appear in the list&#8230;
<li>On the computer, ACCEPT the sync
<li>&#8230;nothing happens. None of your data appears, but don&#8217;t panic, this is &#8220;as expected&#8221;
<li>On the computer, open the Reports menu, and create any report &#8211; your data from iPhone will finally appear
</ol>
<p>&#8230;after that, it&#8217;s plain sailing. The UX of the desktop app is poor, but it&#8217;s trivial from here to get to Excel, and clean up the data.</p>
<h3>UPDATE: getting it into Excel&#8230;</h3>
<p>At first, I thought you should use the &#8220;Reports&#8221; menu.</p>
<p>Don&#8217;t do that &#8211; the export GUI is terrible, it saves files in the wrong format, and &#8230; the output format is harder for Excel to use. There&#8217;s an easier, better way&#8230;</p>
<p>Instead:</p>
<ol>
<li>Open the QuickStart menu
<li>&#8230;this will silently, magically, have gained a set of new options now that your iPhone is connected. One for each project on the iPhone
<li>Select the project you want to export. A window will appear with all the data, nicely formatted, easy to read
<li>NB: for me, the desktop app creates a phantom &#8220;0 minutes long&#8221; additional entry when you do this. Select it and delete it
<li>Select all the rows in the window, then CMD-C (copy), switch to Excel/OpenOffice.org and CMD-V (paste)
<ul>
<li>(this uses a better format than the built-in exporter, and you can manually clean it up)
</ul>
</ol>
<p>This gives you the exact times, down to the nearest minute. Most people don&#8217;t bill their client that way &#8211; although it&#8217;s good to show the actual numbers, you usually want to do a precise (accurate) total, and then round to the nearest 15 minutes for each billable period.</p>
<p>Here&#8217;s the Excel / OOO formula for that:</p>
<blockquote><p>
Create a SUM cell for all your times (use the appropraite column, not C6:C10):<br />
=SUM(C6:C10)</p>
<p>Create a ROUNDING cell for final number (C12 is wherever you put your SUM cell above):<br />
=CEILING(C12; 1/24/60 * 15 )
</p></blockquote>
<p>NB: the &#8220;15&#8243; in that last formula is the &#8220;number of minutes to round to&#8221; &#8230; replace it with &#8220;30&#8243; for half-hours, &#8220;60&#8243; for hours &#8230; etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/21/how-to-export-timesheets-from-officetime/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ethics in the modern world: Lessig on Aaron Swartz</title>
		<link>http://t-machine.org/index.php/2013/01/18/ethics-in-the-modern-world-lessig-on-aaron-swartz/</link>
		<comments>http://t-machine.org/index.php/2013/01/18/ethics-in-the-modern-world-lessig-on-aaron-swartz/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 18:21:23 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[bitching]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2157</guid>
		<description><![CDATA[I don&#8217;t normally blog about this stuff, but here we have the intersection of an eloquent speaker on core matters of modern life and how they intersect the legal systems &#8230; with the kind of tragedy that&#8217;s often threatened when elements of society have orders of magnitude more power than responsibility: http://lessig.tumblr.com/post/40347463044/prosecutor-as-bully The public statement [...]]]></description>
				<content:encoded><![CDATA[<p>I don&#8217;t normally blog about this stuff, but here we have the intersection of an eloquent speaker on core matters of modern life and how they intersect the legal systems &#8230; with the kind of tragedy that&#8217;s often threatened when elements of society have orders of magnitude more power than responsibility:</p>
<p><a href="http://lessig.tumblr.com/post/40347463044/prosecutor-as-bully">http://lessig.tumblr.com/post/40347463044/prosecutor-as-bully</a></p>
<p>The public statement by the prosecutors is worth reading too:</p>
<p><a href="http://0v.org/carmen-ortiz-has-released-a-statement/">http://0v.org/carmen-ortiz-has-released-a-statement/<a/></p>
<blockquote><p>
UPDATE: according to <a href="http://www.justice.gov/usao/ma/news/2011/July/SwartzAaronPR.html">the United States Department of Justice&#8217;s own website (?)</a>, in relation to this case:</p>
<blockquote><p>United States Attorney Carmen M. Ortiz said, “Stealing is stealing whether you use a computer command or a crowbar
</p></blockquote>
<p>It is <a href="http://www.aaideas.com/wp-content/uploads/2010/08/piractNotTheft3.jpg">extremely difficult in practice (practically impossible?) to steal via &#8220;a computer command&#8221;</a>. To me, the Attorney&#8217;s statement has no relevance to what &#8211; it is reported &#8211; happened in this case.</p>
<p>For reference, type <a href="https://www.google.com/search?q=define+stealing">&#8220;define: stealing&#8221; into Google, and see what you get</a>
</p></blockquote>
<p>Lawyers can *always* hide behind a claim that they&#8217;re &#8220;only following the letter of the law&#8221;; unfortunately, the Western legal system is generally based upon NOT following the letter of the law, but the spirit of the lawmakers (as interpreted by various stages of Judges). Which makes such arguments inherently specious.</p>
<p>I&#8217;m not a lawyer, merely a slightly-informed amateur, but &#8230; If this is the best defence that the prosecutors can offer, as eloquent lawyers, it appears to me that they knowingly do terrible things.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/18/ethics-in-the-modern-world-lessig-on-aaron-swartz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All Game Developers should read Pat Wyatt&#8217;s blog&#8230;</title>
		<link>http://t-machine.org/index.php/2013/01/06/all-game-developers-should-read-pat-wyatts-blog/</link>
		<comments>http://t-machine.org/index.php/2013/01/06/all-game-developers-should-read-pat-wyatts-blog/#comments</comments>
		<pubDate>Sun, 06 Jan 2013 19:14:29 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[computer games]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[games design]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[network programming]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2148</guid>
		<description><![CDATA[I noticed a few months back that Pat Wyatt has been blogging rgularly and in a lot of detail last year. This (IMHO) is big news: Pat is an awesome developer who held key positions in the teams behind many of the bestselling computer games (e.g.: Diablo 1 + 2, Starcraft, Warcraft) and went on [...]]]></description>
				<content:encoded><![CDATA[<p>I noticed a few months back that <a href="http://www.codeofhonor.com/blog/">Pat Wyatt</a> has been blogging rgularly and in a lot of detail last year. This (IMHO) is big news: Pat is an awesome developer who held key positions in the teams behind many of the bestselling computer games (e.g.: Diablo 1 + 2, Starcraft, Warcraft) and went on to co-found Arena.Net (creators of Guild Wars).</p>
<p>I worked with him briefly in the past, and he&#8217;s friendly and full of advice and knowledge &#8211; but while he was happy to share, IIRC it was rarely in published form.</p>
<p>I&#8217;ve had a tough few months, but I&#8217;ve been dipping into his blog a few times, and it delivers in spades. Here&#8217;s a few hilights:</p>
<h4>Assertions: enable them in live builds</h4>
<p>(I&#8217;ve always felt this was the &#8220;right&#8221; way to do it for servers &#8211; where you don&#8217;t have to worry so much about frame-time, and assertions are more valuable at runtime because they help with the hardest-to-trace bugs &#8230; but it&#8217;s hard to get broad data on what the performance cost is)<br />
<a href="http://www.codeofhonor.com/blog/whose-bug-is-this-anyway">http://www.codeofhonor.com/blog/whose-bug-is-this-anyway</a>:</p>
<blockquote><p>
&#8220;The bug was easily fixed by upgrading the build server, but in the end we decided to leave assertions enabled even for live builds. The anticipated cost-savings in CPU utilization (or more correctly, the anticipated savings from being able to purchase fewer computers in the future) were lost due to the programming effort required to identify the bug, so we felt it better to avoid similar issues in future.&#8221;
</p></blockquote>
<p>&#8230;and a great rule of thumb for any Programmer:</p>
<blockquote><p>
&#8220;After my experience reporting a non-bug to the folks at Microsoft, I was notably more shy about suggesting that bugs might be caused by anything other than the code I or one of my teammates wrote.&#8221;
</p></blockquote>
<h4>Some bugs are due to &#8230; user&#8217;s broken hardware</h4>
<p><a href="http://www.codeofhonor.com/blog/whose-bug-is-this-anyway">http://www.codeofhonor.com/blog/whose-bug-is-this-anyway</a>:</p>
<blockquote><p>
&#8220;Mike O’Brien, one of the co-founders and a crack programmer, eventually came up with the idea that they were related to computer hardware failures rather than programming failures. More importantly he had the bright idea for how to test that hypothesis, which is the mark of an excellent scientist.</p>
<p>He wrote a module (“OsStress”) which would allocate a block of memory, perform calculations in that memory block, and then compare the results of the calculation to a table of known answers. He encoded this stress-test into the main game loop so that the computer would perform this verification step about 30-50 times per second.</p>
<p>On a properly functioning computer this stress test should never fail, but surprisingly we discovered that on about 1% of the computers being used to play Guild Wars it did fail! One percent might not sound like a big deal, but when one million gamers play the game on any given day that means 10,000 would have at least one crash bug. Our programming team could spend weeks researching the bugs for just one day at that rate!&#8221;
</p></blockquote>
<h4>AI cheats to improve game balance in RTS&#8217;s, starting with Warcraft/Starcraft</h4>
<p><a href="http://www.codeofhonor.com/blog/the-making-of-warcraft-part-3">http://www.codeofhonor.com/blog/the-making-of-warcraft-part-3</a>:</p>
<blockquote><p>
In most Warcraft missions the enemy computer players are given entire cities and armies to start with when battling human players. Moreover, Warcraft contains several asymmetric rules which make it easier for the AI player to compete, though these rules would perhaps be called outright cheating by most players.</p>
<p>One rule we created to help the computer AI was to reduce the amount of gold removed from gold mines to prevent them from being mined-out. When a human player’s workers emerge from a gold mine those workers remove 100 units of ore from the mine and deliver it back to the player’s town hall on each trip, and eventually the gold mine is exhausted by these mining efforts. However, when an AI-controlled worker makes the same trip, the worker only remove 8 units of ore from the mine, while still delivering 100 units into the AI treasury.</p>
<p>This asymmetric rule actually makes the game more fun in two respects: it prevents humans from “turtling”, which is to say building an unassailable defense and using their superior strategic skills to overcome the computer AI. Turtling is a doomed strategy against computer AIs because the human player’s gold-mines will run dry long before those of the computer.</p>
<p>Secondarily, when the human player eventually does destroy the computer encampment there will still be gold left for the player to harvest, which makes the game run faster and is more fun than grinding out a victory with limited resources.&#8221;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/06/all-game-developers-should-read-pat-wyatts-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVGKit 2013 &#8211; Recipes</title>
		<link>http://t-machine.org/index.php/2013/01/02/svgkit-2013-recipes/</link>
		<comments>http://t-machine.org/index.php/2013/01/02/svgkit-2013-recipes/#comments</comments>
		<pubDate>Wed, 02 Jan 2013 20:01:16 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2142</guid>
		<description><![CDATA[SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices. This post gives some simple 1-line / few lines of code recipes for using some of the main features of SVGKit – SVG implementation for iOS/OS [...]]]></description>
				<content:encoded><![CDATA[<p>SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices.</p>
<p>This post gives some simple 1-line / few lines of code recipes for using some of the main features of <a href="https://github.com/SVGKit/SVGKit/">SVGKit – SVG implementation for iOS/OS X</a>.</p>
<p><span style="color: red">NOTE: this post refers to the new version of SVGKit, currently found at <a href="https://github.com/SVGKit/SVGKit/tree/2013base">https://github.com/SVGKit/SVGKit/tree/2013base</a>. The main version will soon be upgraded with this version &#8211; but for now, you should the 2013base link in this paragraph</a></p>
<h3>Basic usage / installation</h3>
<p>Install instructions are on the main GitHub page.</p>
<p>Basic usage / first-time usage info is on <a href="http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/">SVGKit 2013 &#8211; Usage</a>.</p>
<h3>Recipes</h3>
<h4>Load an SVG file like loading a PNG file</h4>
<pre class="brush: objc; title: ; notranslate">
SVGKImage* newImage = [SVGKImage imageNamed:@&quot;imagename&quot;];
</pre>
<h4>Display an SVG file on-screen using an ImageView</h4>
<pre class="brush: objc; title: ; notranslate">
[self.view addSubView: [[SVGKFastImageView alloc] initWithImage:newImage];
</pre>
<h4>&#8230;or an ImageView that supports CoreAnimation for every element</h4>
<p>NB: the &#8220;Fast&#8221; imageview above saves everything as a single layer. Good for rendering, but bad for interaction. The &#8220;Layered&#8221; imageview here allows you to tap on any layer, rotate/animate/fade/drop-shadow/glow any element, etc.</p>
<pre class="brush: objc; title: ; notranslate">
[self.view addSubView:  [[SVGKLayeredImageView alloc] initWithImage:newImage];
</pre>
<h4>Use a URL to load an SVG (open an SVG file *directly* from the web)</h4>
<pre class="brush: objc; title: ; notranslate">
// Splitting URL to multiple lines to make blogpost
//    easier to read...
NSString* longURL = [NSString stringWithFormat:@&quot;%@%@%@&quot;,
@&quot;http://upload.wikimedia.org/&quot;,
@&quot;wikipedia/commons/f/fd/&quot;,
@&quot;Ghostscript_Tiger.svg&quot;;
NSURL* url = [NSURL urlWithString:longURL];
SVGKImage* newImage = [SVGKImage imageWithContentsOfURL:url];
</pre>
<h4>Open an SVG from a custom source (maybe an in-memory SVG creation method)</h4>
<p>First, create a class that conforms to SVGKSourceReader, i.e.:</p>
<pre class="brush: objc; title: ; notranslate">
@interface MyNewClass : NSObject &lt;SVGKSourceReader&gt;
...
</pre>
<p>&#8230;then subclass SVGKSource, and over-ride the method:</p>
<pre class="brush: objc; title: ; notranslate">
-(NSObject&lt;SVGKSourceReader&gt;*) newReader:(NSError**) error
</pre>
<p>Finally, use your customized SVGKSource to load your SVG:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKSource* myCustomSource = [[[MyCustomClass alloc] init] newReader:nil];

/** Other examples, using the default SVGKSource class:
SVGKSource* urlSource = [SVGKSource sourceFromURL: [NSURL ...];
SVGKSource* fileSource = [SVGKSource sourceFromFilename: @&quot;monkey.svg&quot;];
*/

SVGKImage* newImage = [SVGKImage imageWithSource:myCustomSource];
</pre>
<h4>Search an SVG file for particular tags / nodes / elements</h4>
<p>SVG is an XML file, containing XML tags/nodes such as: &#8220;&lt;svg&gt;&#8221;, &#8220;&lt;g&gt;&#8221;, &#8220;&lt;path&gt;&#8221;, &#8220;&lt;linearGradient&gt;&#8221;, etc.</p>
<pre class="brush: objc; title: ; notranslate">
NSString* tagToFind = @&quot;linearGradient&quot;;
NodeList* result = [svgImage.DOMDocument getElementsByTagName:tagToFind];

for( Element* domElement in result )
{
   // You can use the Element object directly:
   domElement.tagName;
   ...

   // ...or, if it was parsed by the SVG parser, you can convert it to an SVGElement:
   SVGElement* svgElement = (SVGElement*) domElement; 
   ...
}
</pre>
<h4>Search for sub-tags / sub-nodes of a particular tag/node</h4>
<p>If you already have an SVGElement reference, you can search all its descendants:</p>
<pre class="brush: objc; title: ; notranslate">
// To search the entire document, use:

// SVGElement* startPoint = newImage.DOMTree;
SVGElement* startPoint = ... // from your code

NSString* tagToFind = @&quot;linearGradient&quot;;
NodeList* result = [startPoint getElementsByTagName:tagToFind];

for( Element* domElement in result )
{
   SVGElement* svgElement = (SVGElement*) domElement; // if your tags are all supported by SVGKit, they will be converted to SVGElement instances
   ...
}
</pre>
<h4>Get a list of ALL descendant tags (from a particular node down)</h4>
<pre class="brush: objc; title: ; notranslate">
SVGElement* startPoint = ... // e.g. for whole SVG doc, use: newImage.DOMDocument;
NodeList* allElements = [startPoint getElementsByTagName:@&quot;*&quot;];
</pre>
<h4>Render one small part of the SVG file on its own</h4>
<p>E.g. if you want to display a subset of the SVG, or want to export a single element:</p>
<pre class="brush: objc; title: ; notranslate">
NSString* idInSVGFile = ... // assuming your SVG file has an &quot;id&quot; attribute for this node
CALayer* absoluteLayer = [newImage.newCopyPositionedAbsoluteLayerWithIdentifier:isInSVGFile];

...

// NB: &quot;absoluteLayer&quot; is now positioned in absolute space;
//   if you add it to your window using e.g.:
[self.view.layer addSublayer: absoluteLayer];
// ...it will appear in the same place as it appeared before,
//   keeping all the offsets, rotations, etc
</pre>
<h4>Customise the parsing, using your own parser extensions</h4>
<p>Create your custom class that adheres to SVGKParserExtension:</p>
<pre class="brush: objc; title: ; notranslate">
@interface MyCustomSVGParserExtension : NSObject &lt;SVGKParserExtension&gt;
...
</pre>
<p>Then create a parser, INCLUDE THE DEFAULT extensions, and add your one on the end:</p>
<pre class="brush: objc; title: ; notranslate">
MyCustomSVGParserExtension* myCustomExtension = [[MyCustomSVGParserExtension alloc] init];

SVGKParser* parser = [[SVGKParser alloc] init];
[parser addDefaultSVGParserExtensions]; // HIGHLY RECOMMENDED
[parser addParserExtension:myCustomExtension];

SVGKParseResult* result = [parser parseSynchronously];

SVGKImage* newImage = [[SVGKImage alloc] initWithParsedSVG:result];
</pre>
<h4>Get help on why parsing failed (and warnings and line numbers!)</h4>
<pre class="brush: objc; title: ; notranslate">
SVGKImage* newImage = ... // use methods above

// EITHER: parse using default parser:
SVGKParseResult* parseResult1 = newImage.parseErrorsAndWarnings; // this is a convenience pointer to (SVGKParser*).currentParseRun

// OR: use a custom parser:
SVGKParser* parser = ... // use methods above
SVGKParseResult* parseResult2 = parser.currentParseRun;
</pre>
<p>And then you have the following info:</p>
<pre class="brush: objc; title: ; notranslate">
/*  array of NSError objects, each one a &quot;WARNING&quot; from the parser */
parseResult.warnings;

/* array of NSError objects, each one a &quot;FATAL ERROR&quot; from the parser - if your SVG didn't render at all, this is why! */
parseResult.errorsFatal;

/* array of NSError objects, each one a &quot;RECOVERABLE ERROR&quot; from the parser - if your SVG didn't render correctly, this is why! (although you probably still got to see something) */
parseResult.errorsRecoverable;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2013/01/02/svgkit-2013-recipes/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>SVGKit 2013 &#8211; Usage</title>
		<link>http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/</link>
		<comments>http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 17:14:56 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2132</guid>
		<description><![CDATA[SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices. This post explains how you can use SVGKit – the open-source SVG implementation for iOS/OS X in your own apps NOTE: this post refers to the [...]]]></description>
				<content:encoded><![CDATA[<p>SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices.</p>
<p>This post explains how you can use <a href="https://github.com/SVGKit/SVGKit/">SVGKit – the open-source SVG implementation for iOS/OS X</a> in your own apps</p>
<p><span style="color: red">NOTE: this post refers to the new version of SVGKit, currently found at <a href="https://github.com/SVGKit/SVGKit/tree/2013base">https://github.com/SVGKit/SVGKit/tree/2013base</a>. The main version will soon be upgraded with this version &#8211; but for now, you should the 2013base link in this paragraph</a></p>
<p>(NB: basic installation is covered on the GitHub page &#8211; this is about how you *use* it)</p>
<h3>SVGKit is like Apple&#8217;s UIKit</h3>
<p>Originally, SVGKit was a bit tricky to use. I re-architected it to be an exact clone of Apple&#8217;s UIKit &#8211; same classes, same class structure, same method names.</p>
<p>So, we have:</p>
<table border="true">
<tr>
<th>UIKit</th>
<th>SVGKit</th>
<th>Notes</th>
</tr>
<tr>
<td>
UI*
</td>
<td>
SVGK*
</td>
<td>
Apple&#8217;s standard: library names start with abbreviation of the library name
</td>
</tr>
<tr>
<td>
UIImage
</td>
<td>
SVGKImage
</td>
<td>
SVGKImage.h started as a copy/paste of UIImage.h
</td>
</tr>
<tr>
<td rowspan="3">
UIImageView
</td>
<td>
SVGKImageView
</td>
<td>
You cannot instantiate it directly, have to use a subclass
</td>
</tr>
<tr>
<td>
</td>
<td>
SVGKFastImageView
</td>
<td>
Renders your SVG as a single layer, fast.
</td>
</tr>
<tr>
<td>
</td>
<td>
SVGKLayeredImageView
</td>
<td>
Renders your SVG one CALayer per SVG element; you can hilight individual elements, tap them, animatet hem, etc
</td>
</tr>
</table>
<p>(a side note: We couldn&#8217;t use a classname prefix of &#8220;SVG&#8221; because the SVG spec reserves all classnames beginning &#8220;SVG&#8221;. Apple had a similar problem when they invented GLKit &#8211; the prefix &#8220;GL&#8221; was already used in the OpenGL library they were extending, so they named their classes &#8220;GLK&#8221; prefix. Hence &#8230; &#8220;SVGK&#8221;)</p>
<h4>Loading an image</h4>
<p>You already know how to load a UIImage, the &#8220;easy way&#8221;:</p>
<pre class="brush: objc; title: ; notranslate">
UIImage* newImage = [UIImage imageNamed:@&quot;myImage.png&quot;];
</pre>
<p>Well, SVGKit is &#8230; the same:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKImage* newImage = [SVGKImage imageNamed:@&quot;myImage.svg&quot;];
</pre>
<h4>Displaying an image: UIImageView</h4>
<p>And how do you create a UIImageView?</p>
<pre class="brush: objc; title: ; notranslate">
UIImageView* imageView = [[UIImageView alloc] initWithImage:newImage];
</pre>
<p>&#8230;so, for SVGKit:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKImageView* imageView = [[SVGKFastImageView alloc] initWithImage:newImage];
// ..... or: 
SVGKImageView* imageView = [[SVGKLayeredImageView alloc] initWithImage:newImage];
</pre>
<p>Wait &#8211; why is this different?</p>
<p>The reference in both cases is an SVGKImageView &#8211; but you cannot alloc-init that class directly. Why?</p>
<p>Different people use the library in different ways. Some people need performance, others need detailed aniamtion. SVG&#8217;s contain a lot of bonus info, and it&#8217;s not possible to support every use case with a single class. So, you get to choose which one fits your needs</p>
<h3>Advanced uses</h3>
<p>So far, so easy. What about when you want more control? And how do you load an SVG over the internet (can you load an SVG directly from the web?)</p>
<p>Time to delve a little deeper&#8230;</p>
<h4>Loading an SVG: in detail</h4>
<p>There are four steps to loading an SVG (all of which are done automatically by SVGKImage above):</p>
<ol>
<li>SVGKSource: specify a location (a file, a filename &#8211; or an HTTP URL)
<li>SVGKParser: parse the file (all SVG&#8217;s are XML files, so your file can contain any custom XML you want)
<li>SVG classes: convert to SVG&#8217;s custom classes (from the SVG Spec); includes automatic support for CSS styling, cascades, etc
<li>SVGKImage: export the SVG to something Apple can render: e.g. a flat CALayer, or a hierarchy of CALayers, etc
</ol>
<p>Ultimately, I want to add a fifth (optional) stage, where you can &#8220;export&#8221; the SVG back to a new file. This should be very easy using the SVG classes (they are DOM compliant already).</p>
<p>Every stage is extensible, so you can either add features, or custommize it</p>
<h4>Extend SVGKSource: adding new sources</h4>
<p>Easy: create a new subclass of SVGKSource, and implement the two methods.</p>
<p>The method signatures are a little strange, because they have to support fast file-access (a C native library from Apple) as well as modern Objective-C methods.</p>
<p>One example of each: the supplied SVGKSource for loading from disk uses C methods, and the supplied one for loading from a URL uses Objective-C methods.</p>
<h4>Extend SVGKParser: custom SVG files and formats</h4>
<p>NOTE: do NOT subclass SVGKParser; parsing is very complex, and there&#8217;s a special mechanism that makes it easy to extend the parser (read on&#8230;)</p>
<p>Parsing is complex, so our parser is modular (based on ideas from a modular XML parser I wrote years ago). The SVGKParser class doesn&#8217;t parse SVG direclty: instead, it parses raw XML, and converts it to a higher-level version that&#8217;s much faster to work with. It also manages error handling, loading bytes from an SVGKSource, etc.</p>
<p>You create a new parser instance with a helper method that includes all the modules you need by default:</p>
<pre class="brush: objc; title: ; notranslate">
SVGKParser* parser = [SVGKParser parserWithDefaultParseExtensions];
</pre>
<h5>SVGKParserExtension: adding your own custom parsing</h5>
<p>Our SVG implementation is already split into sub-modules. This makes the code easier to maintain &#8211; and it makes it much easier to add support for SVG features one-by-one, in parallel with other developers.</p>
<p>Example classes:</p>
<ul>
<li>SVGKParserSVG: parses &#8220;Basic&#8221; SVG &#8211; obvious things that require no special handling. NB: this is the most complex parser extension we have. Most are much simpler
<li>SVGKParserGradients: parses SVG Gradients &#8211; because these were added later by a different developer (Stich) &#8230; likewise, if you&#8217;re adding a msising SVG feature, feel free to make a new parser-extension for it, it&#8217;s easier!
<li>SVGKParserDefsAndUse: the SVG &lt;defs&gt; and &lt;use&gt; tags are much harder to parse than 99% of SVG, since they require complex cross-referencing and instancing. So, we use a separate parser extension to isolate this code.
</ul>
<p>For one of my games, I wanted to store gameplay data inside the SVG &#8211; attach info to particular SVG tags (e.g. give each SVG path a &#8220;bonusPoints&#8221; attribute).</p>
<p>To do this in a spec-compliant way, you should:</p>
<ol>
<li>Create a new XML namespace (requires no code: you simply invent a URL on a domain that you own)
<li>Put the namespace in your SVG file, using an &lt;xmlns&gt; tag, and give it a &#8220;prefix&#8221;, e.g. &#8220;my-game&#8221;
<li>Everywhere you want your custom attributes, or custom tags, prefix them, e.g.: &#8220;
<path my-game:bonusPoints="4" ..."<br />
<li>Write an SVGKParserExtension, and in the &#8220;supportedTags&#8221; and &#8220;supportedNamespaces&#8221; methods, return ONLY your namespace, and either nil, or the set of tags you&#8217;ve invented
</ol>
<p>Once the file is parsed, use the DOM to fetch your data (by definition, SVG parsers are required to be DOM-compliant parsers too)</p>
<p>e.g.:</p>
<pre class="brush: objc; title: ; notranslate">
NodeList* myCustomNodes = [svgImage.DOMDocument getElementsByTagNameNS:@&quot;http://my.custom.namespace&quot; localName:@&quot;my-custom-tag&quot;];
</pre>
<p>(NB: NodeList is defined by the DOM, and is just a wrapper for an NSArray. If you #import &#8220;NodeList+Mutable.h&#8221;, you can access the NSArray directly, and use ObjectiveC fast enumeration. This is cheating, it&#8217;s not in the core SVG spec, which is why it&#8217;s hidden inside a separate header file)</p>
<h4>Extend SVG Classes: the core SVG Spec</h4>
<p>Don&#8217;t.</p>
<p>(the only valid reason for doing this is if you find features in the spec that are missing or broken in SVGKit. All other usages, you should be able to do in some other way, more easily, with less risk of your changes being broken when we upgrade SVGKit)</p>
<h4>Extend SVGKImage export: export your SVG into custom rendering or to a new file on disk</h4>
<p>NB: this is subject to change; we will probably invent an interface for exporting at some point. For now, use SVGKImage directly.</p>
<p>All the parsed data for the SVGKImage is available to you directly, for exporting:</p>
<ul>
<li>(SVGKImage* image).DOMTree : this property contains the entire parsed SVG-DOM (all the SVG* classes)
<li>(SVGKImage* image).CALayerTree : this property contains the SVG converted into Apple&#8217;s CALayer classes, renderable directly in OS X and iOS
</ul>
<p>To save memory and CPU, the &#8220;CALayerTree&#8221; property isn&#8217;t created until you request it; if you don&#8217;t want the CALayer&#8217;s, they&#8217;ll never get created.</p>
<h3>Improving SVGKit, fixing bugs, and ultra-advanced development</h3>
<p>But SVGKit isn&#8217;t perfect: there are still missing features, bugs, etc.\</p>
<p>If you find a bug but can&#8217;t understand / fix it, please create a simple-as-possible SVG file and send it to us (create an Issue on the GitHub page, and include a link to the file). If you give us permission, we&#8217;ll add it to the suite of &#8220;test&#8221; images we use to verify each version of SVGKit, and that way it will always work, even with future versions.</p>
<p>If you fix bugs, or have bits you want to fix, please have a look at <a href="https://t-machine.org/index.php/2012/12/31/svgkit-2013-development/">the SVGKit Development guide</a>.</p>
<p>If you want support or help with SVGKit, the very best thing to do is create an Issue on the SVGKit page. That way, any of the contributors can see your problem and help you out. If you email me directly for help, you&#8217;re less likely to get a response (I&#8217;m busy, and I work on SVGKit entirely unpaid).</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SVGKit 2013 &#8211; Development</title>
		<link>http://t-machine.org/index.php/2012/12/31/svgkit-2013-development/</link>
		<comments>http://t-machine.org/index.php/2012/12/31/svgkit-2013-development/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 17:03:59 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2127</guid>
		<description><![CDATA[SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices. This post explains the underlying code architecture of SVGKit &#8211; the open-source SVG implementation for iOS/OS X; the target audience is developers who want to help [...]]]></description>
				<content:encoded><![CDATA[<p>SVG is an awesome image format thats widely used, works in all browsers. SVG graphics make better apps and better games &#8211; and automatically &#8220;upgrade&#8221; themselves for future devices.</p>
<p>This post explains the underlying code architecture of <a href="https://github.com/SVGKit/SVGKit/">SVGKit &#8211; the open-source SVG implementation for iOS/OS X</a>; the target audience is developers who want to help improve SVGKit (adding missing features, fixing bugs, or making it more compliant with the SVG Specification)</p>
<p><span style="color: red">NOTE: this post refers to the new version of SVGKit, currently found at <a href="https://github.com/SVGKit/SVGKit/tree/2013base">https://github.com/SVGKit/SVGKit/tree/2013base</a>. The main version will soon be upgraded with this version &#8211; but for now, you should the 2013base link in this paragraph</a></p>
<h3>Goals</h3>
<p>Primary goals of the SVGKit project:</p>
<ol>
<li>100% compliance with the SVG Specification
<li>Seamless integration with iOS (iPad/iPhone) and OS X
<li>Performance <em>better than</em> PNG/JPG/bitmap graphics
<li>&#8230;a library good enough that Apple would have liked to have included it in iOS
</ol>
<p>NB: the license terms for SVGKit are, without prejudice: &#8220;you can do anything you want with this, so long as you give credit to the SVGKit authors for their work&#8221;. Many of us are using it in commercial projects.</p>
<h3>Core structure</h3>
<p>The SVG Specification forces us to split the library into two parts, from the very start:</p>
<ol>
<li>SVG Spec &#8211; 100% defined by the W3 Consortium
<li>Native rendering &#8211; approx 10% defined by the W3 Consortium
</ol>
<p>The SVG Spec does have *some* requirements on the native rendering, and it has a lot of &#8220;guidelines&#8221; &#8211; but on the whole, it&#8217;s undefined, so that we can provide an implementation that makes sense on our platform (iOS/OS X).</p>
<p>I&#8217;ve divided this up into independent sections:</p>
<ol>
<li>SVG Spec
<ol>
<li>Locating an input stream (e.g. a file, or an HTTP URL)
<li>XML parsing (low-level)
<li>DOM parsing from XML
<li>SVG parsing from DOM
</ol>
<li>Native rendering &#8211; approx 10% defined by the W3 Consortium
<ol>
<li>Conversion from SVG + DOM to SVG data (including: cascading, as per CSS (required by SVG Spec!))
<li>Conversion from SVG data to Apple&#8217;s Quartz (CAlayer) and Apple&#8217;s UIKit (UIView)
<li>Dynamic changes to render data, to support Vector Graphics (Apple&#8217;s runtime support for vectors is &#8211; ironically &#8211; weak)
</ol>
</ol>
<h4>&#8220;Apple&#8217;s support for vector graphics is weak&#8221;</h4>
<p>This was the biggest surprise to me: Apple has spent a decade marketing their OS (Mac / OS X) as &#8220;vector based&#8221;, etc.</p>
<p>In practice &#8230; OS X libraries were usually sparsely documented by Apple, and until iPhone came along, they were messy, buggy, poorly designed, and full of &#8220;out of date&#8221; methods. With iPhone OS (now renamed &#8220;iOS&#8221;), Apple cleaned their house out, and made some very lean, clear, logical APIs (with many fewer bugs!). They also &#8211; finally &#8211; documented it all.</p>
<p>That&#8217;s an amazing achievement, it&#8217;s very impressive. But along the way (probably to save time) they ignored some parts. The original iPhone&#8217;s CPU and GPU were very weak (compared to today), so it&#8217;s no surprise that Apple didn&#8217;t update their vector graphics libraries. iOS (as of 2013) is still using the under-documented and flawed OS X classes.</p>
<p>(NB: the lack of documentation also means that very few people know how to use Core Animation/Quartz/CALayer for high performance &#8211; you have to &#8220;experiment&#8221; and deduce what Apple *might* be doing, and test extensively. [Incidentally, there's a lot of misinformation around - rumour and theory, in the absence of official docs from Apple])</p>
<p>Find the link for <a href="https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html">CALayer</a> and bookmark it. This core class is where Apple&#8217;s vector libraries and main rendering intersect. It&#8217;s powerful &#8211; but it&#8217;s ugly and bloated too.</p>
<h3>Simple bits, see elsewhere</h3>
<h4>&#8220;Locating an input stream (e.g. a file, or an HTTP URL)&#8221;</h4>
<p>c.f. the SVGKit Usage post. This stuff is very simple, but it&#8217;s lacking features. Would be great for you to add some new SVGKSource subclases, with better features.</p>
<h4>&#8220;XML parsing (low-level)&#8221;</h4>
<p>Currently uses libxml (because that is built-in to iOS, OS X, and Xcode).</p>
<p>This wraps libxml, and adds three features:</p>
<ol>
<li>Captures every parse-error, and provides a list + line numbers when parsing is finished (libxml doesn&#8217;t have this feature by default)
<li>Converts low-level libxml C library to high-level ObjectiveC calls
<li>Provides a &#8220;modular&#8221; parsing system, where parsing code is very simple to write
</ol>
<p>On the whole, we have NO INTENTION of changing the parser &#8211; it works, and its intended to be as simple as possible. It&#8217;s really just an upgrade to libxml.</p>
<p>But there&#8217;s one thing it&#8217;s missing that we&#8217;d love to add:</p>
<ul>
<li>Streaming / interrupt-based parsing
</ul>
<p>This is potentially more efficient in CPU and memory usage (not much, since we HAVE to use DOM &#8211; it&#8217;s required by the SVG Spec), but requires making the SVGKParser.m class a bit cleverer.</p>
<h4>&#8220;Conversion from SVG data to Apple&#8217;s Quartz (CAlayer) and Apple&#8217;s UIKit (UIView)&#8221;</h4>
<p>SVGKit originally included &#8211; in every &#8220;SVG&#8221; class &#8211; a method that creates a new CALayer object, for that specific SVG element.</p>
<p>We *might* move that code to external classes, since I don&#8217;t think the Spec allows it to be there &#8211; but the core behaviour is: one class per SVG tag, that generates a CALayer for that tag.</p>
<p>Since UIView uses CALayer&#8217;s internally, you can take any CALayer and add it to a UIView ([UIView.layer addSublayer:(CALayer*)]).</p>
<h3>Complex parts</h3>
<h4>&#8220;DOM parsing from XML&#8221;</h4>
<p>The way this works is <em>very rigidly defined by the SVG Spec</em>, and you absolutely must stick to the Spec.</p>
<p>DOM is a major web standard, and the SVG authors thought it would save everyone a lot of time to re-use it.</p>
<p>Unfortunately &#8211; tragically! &#8211; iOS has no DOM implementation:</p>
<ol>
<li>Apple has a private implementation available in Safari. It&#8217;s not entirely private (we had to rename one of our classes because of a careless name from Apple), but Apples policy is &#8220;if it&#8217;s not explicitly public, we can reject your app for using it&#8221;. In theory, we could get access to this via WebKit source, or via an embedded WebView. But it would probably be much slower, and use a lot more memory, than our current native implementation
<li>There are a couple of open-source implementations, most of which have sadly been abandoned by their authors. Also, most of those I looked at are incomplete, and non-compliant; we can&#8217;t afford to rely on them.
</ol>
<p>The process for adding / modifying DOM classes goes like this:</p>
<ol>
<li>Copy/paste the DOM official class name (including the capitalization)
<li>In the header, paste the HTTP link to the *paragraph* of the DOM specification that defines that DOM class
<li>&#8230;then copy/paste the DOM&#8217;s interface/class declaration (usually 5-10 lines of code beginning &#8220;interface&#8221;, and blockquoted)
<li>Copy/paste that a second time, this time as the ObjectiveC Interface
<li>Convert every &#8220;variable&#8221; to an ObjectiveC @property
<ul>
<li>Note: by definition, you are supposed to replace DOMString with NSString*
</ul>
<li>Convert every &#8220;method&#8221; to an ObjectiveC &#8220;-(something) methodSomething:(something);&#8221; method &#8211; NB: do *not* implement as C-methods
<li>Fill the .m file with @synthesize directives
<li>Create a blank method in the .m file for each method, and put an &#8220;NSAssert( FALSE, &#8220;Not implemented yet&#8221; );&#8221; in there (or implement it yourself)
<li>Any other DOM classes that are used as variables or method parameters &#8230; do all the above again
</ol>
<h5>Hiding NSArray and NSDictionary behind SVG Spec methods</h5>
<p>The SVG Spec is designed to work in ANY programming language &#8211; so it doesn&#8217;t support some core features of ObjectiveC, such as fast enumeration (i.e. the &#8220;for( NSObject* o in array)&#8221; syntax).</p>
<p>A much bigger problem for you is that you can&#8217;t include &#8220;init&#8221; methods, which are necessary for good ObjectiveC code.</p>
<p>Our DOM and SVG classes *must* be spec compliant, so we cannot expose the raw array &#8211; and we can&#8217;t add methods to provide fast enumeration, nor custom init methods.</p>
<p>Instead &#8230; when you have a situation like that, and you want users to be able to (optionally) access them &#8230; go ahead and do it, but put the &#8220;bonus&#8221; methods into a separate header file.</p>
<p>In Xcode, this is called a &#8220;class extension&#8221;, and it&#8217;s a special feature of ObjectiveC. Select &#8220;Class Extension&#8221; when creating the new file.</p>
<p>e.g. look at the source for Nodelist.h and NodeList.m &#8211; and notice that some of the methods are missing from the header file, but appear in NodeList+Mutable.h</p>
<p>In general, you should use the following naming strategies:</p>
<ul>
<li>If the bonus features are needed to modify properties that SVG Spec says are &#8220;read only&#8221;, name the extension &#8220;Mutable&#8221; to make it clear that&#8217;s what it&#8217;s for
<li>If the bonus features are ONLY a convenience, e.g. to enable fast enumeration, name the extension &#8220;NotInSpec&#8221; or similar
</ul>
<h4>&#8220;SVG parsing from DOM&#8221;</h4>
<p>Again, the SVG spec <em>rigorously defines</em> the name of every &#8220;SVG&#8221; class, and its methods, and its variables. You must follow these exactly.</p>
<p>The process is identical as for the DOM Spec notes above.</p>
<p><storng>NB: SVG was <em>designed and intended</em> to be implemented on-top-of DOM; many of the SVG Spec methods are trivial to implement if you use the DOM methods that already exist. You are not supposed to re-invent the wheel!</strong></p>
<p>For instance, have a look at DOMDocument, and Node, and Element &#8211; they have some very useful methods built-in to them.</p>
<p>Remmember: if you call SVGElement&#8217;s init method, then every SVG tag <em>has already been parsed into a DOM Element (which extends DOM Node)</em>. It already has all the XML attributes pre-parsed and available to you!</p>
<h5>Gotcha 1: SVG attributes are NOT nil</h5>
<p>SVG Spec defines that &#8220;empty&#8221; or &#8220;missing&#8221; attributes have to be returned NOT AS NULL but as an empty string (&#8220;&#8221;).</p>
<p>This means you must NEVER write:</p>
<pre class="brush: objc; title: ; notranslate">
Attr* fillAttribute = [self getAttribute:@&quot;fill&quot;];
if( fillAttribute ) // DO NOT DO THIS!!!
  ...
</pre>
<p>&#8230;because according to the spec fillAttribute can be non-null even though in the SVG it&#8217;s blank. Instead, you must (according to spec) do:</p>
<pre class="brush: objc; title: ; notranslate">
Attr* fillAttribute = [self getAttribute:@&quot;fill&quot;];
if( fillAttribute.length &gt; 0 ) // This is correct, according to SVG Spec
  ...
</pre>
<h5>Gotcha 2: XML Namespaces</h5>
<p>You can parse a lot of SVG&#8217;s and ignore namespaces; most SVG&#8217;s use the same &#8220;convention&#8221; for naming the XML tags.</p>
<p>It&#8217;s a convention; it&#8217;s a default; it IS NOT GUARANTEED.</p>
<p>But XML-namespaes are guaranteed. All SVGKit code should be using namespaces explicitly.</p>
<p><strong>As a convenience for users</strong>, the DOM spec allows us to provide methods that do NOT need an explicit namespace &#8211; but you should not be using them! They will occasionally fail when used on some input SVG files</p>
<p>So, for instance, you should NOT do this:</p>
<pre class="brush: objc; title: ; notranslate">
Attr* fillAttribute = [self getAttribute:@&quot;fill&quot;]; // DON'T DO THIS (it'll work 99% of the time, but ... best not to)
</pre>
<p>instead do this:</p>
<pre class="brush: objc; title: ; notranslate">
Attr* fillAttribute = [self getAttributeNS:svgNamespace localName:@&quot;fill&quot;]; // CORRECT. (svgNamespace is the HTTP URL of the official SVG Spec)
</pre>
<p>At the moment, we don&#8217;t have a convenience method for &#8220;get the namespace that means SVG&#8221; &#8211; this really should be part of the SVGKparserSVG extension.</p>
<p>NB: if you&#8217;re afraid this namespace stuff won&#8217;t work, note that SVGKparser <em>already has full namespace support, and will automatically create the SVG namespace if needed when parsing incoming SVG files</em></p>
<h5>Gotcha 3: Cascading (as in: &#8220;Cascading Style Sheets&#8221; i.e. CSS)</h5>
<p>The SVG spec officially is based on DOM; but it&#8217;s also (officially) based on CSS.</p>
<p>Fortunately, we only have to support a subset of CSS &#8211; the two parts that SVG uses are:</p>
<ol>
<li>Embedding stylesheets, or referencing them with an external &#8220;link&#8221; tag
<li>Cascading
</ol>
<p>But cascading is tricky. There are approximately 50 XML attributes that &#8211; officially &#8211; must be &#8220;cascaded&#8221; when using SVG. There&#8217;s a table of them in the spec &#8211; <a href="http://www.w3.org/TR/SVG/propidx.html">http://www.w3.org/TR/SVG/propidx.html</a></p>
<p>Cascading is tricky, and it&#8217;s potentially quite slow &#8211; you have to look-up the property in many different places, and check each one &#8220;in correct order&#8221; until you find the first match.</p>
<p>So, we have a method in SVGElement that does all this for you:</p>
<pre class="brush: objc; title: ; notranslate">
-(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty
</pre>
<p>&#8230;but that is not part of the SVG Spec, and it&#8217;s possible it *is* part of the CSS spec, but located in a different class (I haven&#8217;t found it yet). We&#8217;ll leave that method there as a convenience, but you might need to import a special header to access it (since it&#8217;s not part of the SVG Spec).</p>
<p>To use cascading (which you MUST do), instead of this:</p>
<pre class="brush: objc; title: ; notranslate">
// DON'T DO THIS (it ignores cascading and styles and CSS-classes)
Attr* fillAttribute = [self getAttribute:@&quot;fill&quot;];
</pre>
<p>&#8230;do this:</p>
<pre class="brush: objc; title: ; notranslate">
// Automatically does all the CSS stuff for you
NSString* fillAttributeValue = [self cascadedValueForStylableProperty:@&quot;fill&quot;];
</pre>
<p>&#8230;eventually, we&#8217;ll add an error / NSAssert for cases where you pass in a property that is not one of the cascadeable ones &#8211; for now, just use the table as a reference.</p>
<h3>Class names and method names</h3>
<p>We couldn&#8217;t use a classname prefix of &#8220;SVG&#8221; because the SVG spec reserves all classnames beginning &#8220;SVG&#8221;. Inside the project, you&#8217;ll find all of these in the &#8220;SVG DOM&#8221; folder &#8211; please note: these are MANDATED by the SVG Spec, we did NOT come up with the names.</p>
<p>Apple had a similar problem when they invented GLKit &#8211; the prefix &#8220;GL&#8221; was already used in the OpenGL library they were extending, so they named their classes &#8220;GLK&#8221; prefix. Hence &#8230; &#8220;SVGK&#8221;)</p>
<p>Whenever you create a new class that is not part of the SVG Spec &#8211; for any reason &#8211; you must prefix the name with &#8220;SVGK&#8221;.</p>
<p>Some of our classes &#8211; for historic reasons &#8211; don&#8217;t follow this convention. Yet. Feel free to refactor any you encounter.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/12/31/svgkit-2013-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Microsoft&#8217;s Fraudulent Windows8 &#8220;upgrade&#8221; offer?</title>
		<link>http://t-machine.org/index.php/2012/12/12/microsofts-fraudulent-windows8-upgrade-offer/</link>
		<comments>http://t-machine.org/index.php/2012/12/12/microsofts-fraudulent-windows8-upgrade-offer/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 21:14:41 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[bitching]]></category>
		<category><![CDATA[Web 0.1]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2120</guid>
		<description><![CDATA[Windows 8 It&#8217;s great, it&#8217;s beautifully presented, and the best OS I&#8217;ve used in the last 20 years or so. It makes OS X look clunky (which, let&#8217;s face it &#8211; for Microsoft &#8211; is one hell of an achievement) The upgrade My primary windows machine (used to) run XP. Microsoft has a &#8220;special offer&#8221; [...]]]></description>
				<content:encoded><![CDATA[<h3>Windows 8</h3>
<p>It&#8217;s great, it&#8217;s beautifully presented, and the best OS I&#8217;ve used in the last 20 years or so.</p>
<p>It makes OS X look clunky (which, let&#8217;s face it &#8211; for Microsoft &#8211; is one hell of an achievement)</p>
<h3>The upgrade</h3>
<p>My primary windows machine (used to) run XP. Microsoft has a &#8220;special offer&#8221; to upgrade you to Windows 8. So I took it, and paid the extra for the physical DVD to be sent to me. That was on November 20th &#8211; more than 3 weeks ago, and it never arrived.</p>
<p>In the meantime, Microsoft auto-downloads and installs &#8220;Windows 8&#8243;</p>
<p>Or they claim to&#8230;</p>
<h3>The bait-and-switch</h3>
<p>&#8230;in the weeks since, I&#8217;ve found LOTS of Windows apps crashing, with &#8220;out of memory&#8221; errors on my 12 GB RAM machine. WTF?</p>
<p>After days of searching, I eventually found the cause:</p>
<blockquote><p>
Microsoft will charge you for 64bit windows BUT ONLY GIVE YOU 32bit windows
</p></blockquote>
<p>They never state this.</p>
<p>Allegedly, the DVD they send (or not, in my case) happens to contain the 64bit version. You won&#8217;t know this, but if you work it out, you can allegedly delete the crap they install on your system and replace it with the correct, actual, Windows 8.</p>
<h3>The problem: Installed Physical Memory is different from Available Memory</h3>
<p>32bit Windows 8 running on a 64bit CPU is ridiculous, from any perspective.</p>
<p>If you run &#8220;Device Information&#8221;, you&#8217;ll see a massive discrepancy between the memory that Microsoft agrees is in your machine (8Gb, 16GB, 32GB etc), and the memory Windows is willing to use (typically: 3.1 GB, 2.9GB, 3.5GB or similar).</p>
<p>There&#8217;s nothing you can do to make windows &#8220;enable&#8221; your memory &#8211; a 32bit copy of Windows cannot access more than 4GB of memory, by its very nature.</p>
<p>Good luck finding this out &#8211; Microsoft&#8217;s own website, if you select &#8220;windows 8&#8243; and search for &#8220;RAM&#8221; or &#8220;memory&#8221; instead takes you to Windows-7 specific problems. Sigh.</p>
<h4>Addendum 1: Microsoft support</h3>
<ol>
<li>Microsoft&#8217;s &#8220;Live Support&#8221; personnel HUNG UP 5 seconds into the live-chat
<li>Microsoft&#8217;s official email address that sends the electronic order info &#8230; has an auto-responder saying it&#8217;s not ACTUALLY an email address, it&#8217;s a fake
</ol>
<p>What can you do? &#8230; not much.</p>
<h3>Addendum 2: Microsoft&#8217;s &#8216;other&#8217; support</h3>
<p>*IF* you can get through to Microsoft&#8217;s generic, non-Windows8, support, you might be in luck.</p>
<p>That way, I finally got into a livechat with someone from Microsoft who &#8220;reprocessed&#8221; the mailing of the DVD. It&#8217;s a 1-2 week wait (how are they sending these things &#8211; by pigeon??), and we&#8217;ll see what happens&#8230;</p>
<p>They also gave me a different download link for Windows8, which they specifically stated was the 64 bit version.</p>
<p>&#8230;12 hours later&#8230;</p>
<p>Nope! Microsoft lied again: it re-installed the OS it was already running, with zero changes. Still 32bit. Still application crashes left, right, and center.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/12/12/microsofts-fraudulent-windows8-upgrade-offer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>HSBC&#8217;s web team: WTF?</title>
		<link>http://t-machine.org/index.php/2012/11/23/hsbcs-web-team-wtf/</link>
		<comments>http://t-machine.org/index.php/2012/11/23/hsbcs-web-team-wtf/#comments</comments>
		<pubDate>Fri, 23 Nov 2012 19:18:17 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[marketing and PR]]></category>
		<category><![CDATA[Web 0.1]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2116</guid>
		<description><![CDATA[Why does the login URL for internet banking: http://www.hsbc.co.uk/1/2/marketing/businessinternetbanking &#8230;redirect to the newsletter for global investors: https://investments.hsbc.co.uk/article/world-selection-newsletter ? Do you *want* people to think your website has been hacked? Or do you just not know what a cool URI is? I think your VP Marketing / Marketing Director needs a slap upside the head&#8230;]]></description>
				<content:encoded><![CDATA[<p>Why does the login URL for internet banking:</p>
<p><a href="http://www.hsbc.co.uk/1/2/marketing/businessinternetbanking">http://www.hsbc.co.uk/1/2/marketing/businessinternetbanking</a></p>
<p>&#8230;redirect to the newsletter for global investors:</p>
<p><a href="https://investments.hsbc.co.uk/article/world-selection-newsletter">https://investments.hsbc.co.uk/article/world-selection-newsletter</a></p>
<p>?</p>
<p>Do you *want* people to think your website has been hacked?</p>
<p>Or do you just not <a href="http://www.w3.org/Provider/Style/URI">know what a cool URI is?</a></p>
<p>I think your VP Marketing / Marketing Director needs a slap upside the head&#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/11/23/hsbcs-web-team-wtf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Epic Rap Battles of History compilation&#8230;</title>
		<link>http://t-machine.org/index.php/2012/11/18/epic-rap-battles-of-history-compilation/</link>
		<comments>http://t-machine.org/index.php/2012/11/18/epic-rap-battles-of-history-compilation/#comments</comments>
		<pubDate>Sun, 18 Nov 2012 16:13:50 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[amusing]]></category>
		<category><![CDATA[funny]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2111</guid>
		<description><![CDATA[&#8220;Commander of the third reich, and a little known fact: Also dope on the mic!&#8221; EDIT: in case you missed it: &#8220;&#8230; of the people &#8230; by the people &#8230; for the people &#8230; EAGLE!&#8221;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=VN_rgTHq_gE"><br />
&#8220;Commander of the third reich,<br />
and a little known fact:<br />
Also dope on the mic!&#8221;<br />
</a></p>
<p>EDIT: in case you missed it: <a href="http://www.youtube.com/watch?v=dX_1B0w7Hzc&#038;feature=related">&#8220;&#8230; of the people &#8230; by the people &#8230; for the people &#8230; EAGLE!&#8221;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/11/18/epic-rap-battles-of-history-compilation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ObjectiveC: how to make an abstract class / forbid the &#8220;init&#8221; method</title>
		<link>http://t-machine.org/index.php/2012/11/11/objectivec-how-to-make-an-abstract-class-forbid-the-init-method/</link>
		<comments>http://t-machine.org/index.php/2012/11/11/objectivec-how-to-make-an-abstract-class-forbid-the-init-method/#comments</comments>
		<pubDate>Sun, 11 Nov 2012 19:04:22 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2102</guid>
		<description><![CDATA[Abstract classes: saving programmers from each other For trivial apps, no-one cares. But most libraries take huge advantage of the concept of &#8220;subclassing&#8221;, and programmers using those libraries need to make intelligent choices about &#8220;which subclass do I use?&#8221;. Thanks to auto-complete, or &#8220;because it sounded what I needed at that moment in time&#8221; &#8211; [...]]]></description>
				<content:encoded><![CDATA[<h3>Abstract classes: saving programmers from each other</h3>
<p>For trivial apps, no-one cares. But most libraries take huge advantage of the concept of &#8220;subclassing&#8221;, and programmers using those libraries need to make intelligent choices about &#8220;which subclass do I use?&#8221;.</p>
<p>Thanks to auto-complete, or &#8220;because it sounded what I needed at that moment in time&#8221; &#8211; or simply &#8220;because I was tired&#8221; &#8211; your base class gets instantiated when it shouldn&#8217;t have been. And strange bugs come from it, wasting everyone&#8217;s time. You might argue &#8220;not MY time&#8221;, but I&#8217;m a strong believer in writing code that EITHER does the obvious OR protects the people using it &#8211; my code doesn&#8217;t crash, it checks for obvious mistakes (e.g. checks that a file exists before loading it!), etc.</p>
<p>In the long run, that frequently comes back to help you: when YOU then re-use your own code, and make a dumb mistake because it&#8217;s been a long time and you&#8217;d forgotten how to use it.</p>
<p>In some languages, you can create &#8220;abstract base classes&#8221; that allow other classes to share type, but cannot be used on their own. This makes it obvious to other programmers that they should look for subclasses and pick one &#8211; instead of trying to use the superclass.</p>
<p>Unfortunately, ObjectiveC has no support for &#8220;abstract classes&#8221;.</p>
<p>&#8230;or does it?</p>
<h3>What&#8217;s an abstract class?</h3>
<p>An abstract class is one that cannot be instantiated. To achieve that in Objective-C, all you have to do is:</p>
<pre lang="objc">
@implementation DontAllowInit

- (id)init
{
    NSAssert(false, @"You cannot init this class directly. Instead, use a 
subclass e.g. AcceptableSubclass");

    // NB: I prefer to use NSAssert because this is aimed at programmers, and 
    //     ObjC programmers should generally be using assertions during dev!
 
    // You could instead use more fancy approaches, like raising an NSException
    //     - but Apple/Cocoa are very anti-exception, and don't support them well.

    return nil;
}
@end
</pre>
<p>&#8230;but this causes a problem. Because as soon as someone creates a subclass, they&#8217;ll find their code crashes:</p>
<pre lang="objc">
@interface SubClass : DontAllowInit
@end

@implementation SubClass

- (id)init
{
    self = [super init]; // CRASH!
    if( self != nil )
    {
        // all the normal setup code
    }
    return self;
}
@end
</pre>
<p>You can workaround this by writing documentation that says:</p>
<blockquote><p>
/*<br />
This class can&#8217;t be instantiated, because I wanted an Abstract Class, but Objective-C was too primitive to allow it.</p>
<p>So, um, please don&#8217;t call [super init]. Instead call &#8230; ah .. [super secretInit] which does the same thing, but which other people won&#8217;t realise exists!<br />
*/
</p></blockquote>
<p>There&#8217;s an obvious problem there &#8230; the super-secret-init is easy to call anyway, and BOOM your library. It might seem obvious to you that no-one would call that method without understanding it, but this is the way of the world.</p>
<h3>Selective Denial: what am I?</h3>
<p>The solution is to think about what happens when you instantiate a subclass. The key thing here is that when you call:</p>
<pre lang="objc">
Super* s = [[Super alloc] init];
</pre>
<p>it&#8217;s NOT the same as when you call:</p>
<pre lang="objc">
Sub* s = [[Sub alloc] init];
</pre>
<p>&#8230;in the first case, the thing that gets sent &#8220;init&#8221; is an instance of &#8220;Super&#8221;, whereas in the second case it&#8217;s an instance of &#8220;Sub&#8221;.</p>
<p>That might not sound interesting, but when Sub executes the first (standards-compliant) line of its init method:</p>
<p>The key thing here is that when you call:</p>
<pre lang="objc">
-(id) init
{
     self = [super init];
</pre>
<p>&#8230;then the code in Super.m is *not* being run on an object of type &#8220;Super&#8221;, but rather an object of type &#8220;Sub&#8221;.</p>
<p>And so we have a solution:</p>
<pre lang="objc">
@implementation DontAllowInit
- (id)init
{
	if( [self class] == [DontAllowInit class])
	{
		NSAssert(false, @"You cannot init this class directly. Instead, use a subclass e.g. MyPreferredSubclass");
		
		return nil;
	}
	else
		return [super init];
}
</pre>
<h3>Does it really matter?</h3>
<p>When writing code, you have lots to think about. In my years of experience, two of the most important questions are:</p>
<ol>
<li>Does it do what it says / work as intended?
<li>Can someone else use (and modify) the code later, when you&#8217;re not there &#8230; correctly?
</ol>
<p>Documentation goes a long way to solving both those issues. However &#8230; docs take a long time to write, and more importantly:</p>
<blockquote><p>
Other people frequently don&#8217;t read the documentation
</p></blockquote>
<p>More importantly:</p>
<blockquote><p>
If you are a great programmer, other programmers SHOULD NOT NEED TO read the code documentation any more than they expected to
</p></blockquote>
<p>&#8220;Expected to&#8221; is critical here. If your codebase is 1 million lines long, then a programmer would be insane to think they could just &#8220;dive in&#8221; and start writing / modifying it &#8211; the thing is fantastically complex. But if it&#8217;s clear and simple, then often they should expect to read the &#8220;core&#8221; documentation, and be able to work the rest out as they go, from reading your class and method names.</p>
<p>Abstract classes enable you &#8211; with very little effort &#8211; to use complex chains of OOP subclassing <em>without endangering the programmers who come after you</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/11/11/objectivec-how-to-make-an-abstract-class-forbid-the-init-method/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Reaction to CoH (City of Heroes) community, and NCsoft&#8217;s response</title>
		<link>http://t-machine.org/index.php/2012/10/16/reaction-to-coh-city-of-heroes-community-and-ncsofts-response/</link>
		<comments>http://t-machine.org/index.php/2012/10/16/reaction-to-coh-city-of-heroes-community-and-ncsofts-response/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 00:15:39 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[advocacy]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[computer games]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[games industry]]></category>
		<category><![CDATA[games publishing]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[MMOG development]]></category>

		<guid isPermaLink="false">http://t-machine.org/?p=2083</guid>
		<description><![CDATA[(background: after 8 years as one of the world&#8217;s mid-tier MMO games, City of Heroes (+ City of Villains) is being shut down. The community banded together to ask if they could take over running the world that meant so much to them; NCsoft (the publisher, and a company I used to work for) said: [...]]]></description>
				<content:encoded><![CDATA[<p>(background: after 8 years as one of the world&#8217;s mid-tier MMO games, City of Heroes (+ City of Villains) is being shut down. The community banded together to ask if they could take over running the world that meant so much to them; NCsoft (the publisher, and a company I used to work for) said: no)</p>
<h3>&#8220;No means no&#8221;</h3>
<p>NCsoft <a href="http://us.ncsoft.com/en/news/response-to-city-of-heroes-player-and-fan-suggestions.html">is basically saying</a>: &#8220;Please. We love you, but &#8230; you just *don&#8217;t understand*. It&#8217;s more complex than you could possibly imagine!&#8221;</p>
<p>That&#8217;s not a dialogue; it reads like a &#8220;this conversation ends when I stop talking&#8221; monologue.</p>
<h3>&#8220;Why on earth wouldn&#8217;t you say yes?&#8221;</h3>
<p>Lots of people wondering that. Obviously, being a public company, no-one&#8217;s going to answer that in public. We can only guess. But hear&#8217;s a few (over the top) suggestions&#8230;</p>
<p>If the community succeeds &#8230; then THE FEAR IS: some Executive(s), somewhere, are going to look like bad (I&#8217;m not accusing; I&#8217;m just saying that in corporates I&#8217;ve worked at, this kind of *fear* is common). A lot of the work they do is guess-work. That&#8217;s fine, they&#8217;re paid to make the best decision they can, while never truly know if they made the right one.</p>
<p>But if a bunch of inexperienced, eager novices come along and offer to do it for free. And &#8211; the worst possible outcome &#8211; they succeed &#8230; that could make someone look really bad.</p>
<p>Another thing I&#8217;ve seen in corporate politics at this level is a lot of &#8220;horse-trading&#8221;. i.e. sacrificing one project (that someone else resents, or has been snubbed by) in return for that person helping out out with a problem on a separate project, that you&#8217;re trying to rescue.</p>
<p>Who (individually or collectively) made the decision, and what did they stand to gain or lose? (they are probably worried about / aiming for / trying to win &#8230; something bigger than this single game. c.f. my 2009 post on why NCsoft is so huge a company gains nothing from &#8220;profitable&#8221; games, they need &#8220;mega profitable&#8221; games)</p>
<h3>&#8220;Software is software&#8221;</h3>
<p>Ha!</p>
<p>Has anyone found out yet what format(s) the data is in? Imagine the most insane, unwieldy, incomprehensible, inconsistent, unusable format that bears no relationship *at all* to the game itself &#8230; and you&#8217;re probably half way there.</p>
<p>This game was written *8 years ago*.</p>
<p>Read the biographies of the people involved. Were they non-game developers &#8230; academics with decades of expertise in distributed systems and real-time transaction messaging? &#8230; or &#8230; were they a bunch of smart guys trying to catch up with the academic research in the space of months, just enough to build and ship a major new computer game? And &#8230; most importantly &#8230; to make it &#8220;fun&#8221; before they ran out of budget.</p>
<p>I&#8217;ve not yet found an MMO where the people who made it feel &#8211; with hindsight &#8211; they had any idea what they were doing at the start. When they started, of course, many of them thought they&#8217;d covered all the bases, and were &#8220;well prepared&#8221;. Everyone tries their best up-front (or fails completely); but everyone finds it much harder than expected.</p>
<h3>What should we/they do?</h3>
<p>Looking at it analytically and logically, I&#8217;d give the community a very high chance of failing dismally if they were given the game. But &#8230; the eagerness, the excitement, the sheer determination: I&#8217;d give them a small chance of succeeding despite everything. Simply because: when you see this much determination, it often wins out and overcomes the obstacles in its way.</p>
<p>So, I say: Go for it.</p>
<p>They know the game they&#8217;re trying to (re-)create. The difficulty is simple: whenever you try to re-create a game, the temptation is always there to &#8220;improve&#8221; it &#8230; and 99 times in 100, you find you slightly misunderstood what you were &#8220;improving&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://t-machine.org/index.php/2012/10/16/reaction-to-coh-city-of-heroes-community-and-ncsofts-response/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
