<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8845224290899123374</atom:id><lastBuildDate>Sat, 30 May 2026 06:42:34 +0000</lastBuildDate><category>programming</category><category>C++</category><category>work</category><category>games</category><category>GLToy</category><category>graphics</category><category>rant</category><category>real life</category><category>Codemasters</category><category>Escapist</category><category>Star Chart</category><category>blog</category><category>Microsoft</category><category>Windows 8</category><category>learning</category><category>internet</category><category>optimisation</category><category>FridgeScript</category><category>Bodycount</category><category>AVS</category><category>scripting</category><category>iOS</category><category>maths</category><category>non-programming</category><category>Apple</category><category>OS X</category><category>Blogger</category><category>Codiesgate</category><category>series</category><category>web design</category><category>Objective-C</category><category>OpenGL</category><category>Pogo Guy</category><category>cars</category><category>compiler</category><category>raytracing</category><category>Excel</category><category>Google</category><category>JavaScript</category><category>Visual Studio</category><category>assembler</category><category>canvas</category><category>rendering</category><category>DirectX</category><category>Fridge</category><category>HTML5</category><category>floating point</category><category>BSP tree</category><category>FPSToy</category><category>STL</category><category>Visual Basic</category><category>Whittaker's method</category><category>bit hacks</category><category>shaders</category><category>C</category><category>Metro</category><category>PVS</category><category>Windows</category><category>debugging</category><category>lighting</category><category>physics</category><category>programming with no internet</category><category>space</category><category>useful resources</category><category>FSAssembler</category><category>HTML</category><category>Haskell</category><category>PHP</category><category>QBasic</category><category>Quake</category><category>UI</category><category>WinRT</category><category>demo</category><category>inverse square root hack</category><category>matrix</category><category>memory</category><category>meta-programming</category><category>politics</category><category>reinventing the wheel</category><category>visibility</category><category>.NET</category><category>Android</category><category>CSS</category><category>Curiosity</category><category>Google Analytics</category><category>Linux</category><category>MFC</category><category>Rebellion</category><category>Steam</category><category>app</category><category>app store</category><category>art</category><category>astronomy</category><category>demoscene</category><category>design</category><category>document</category><category>functional</category><category>game killer</category><category>hacking</category><category>id Tech 3</category><category>intel</category><category>noise</category><category>non programming</category><category>philosophy</category><category>procedural content</category><category>search</category><category>struct layout rules</category><category>templates</category><category>video</category><category>64k</category><category>BASIC</category><category>Bison</category><category>C#</category><category>C++/CX</category><category>DMC</category><category>Doom</category><category>Duck Duck Go</category><category>Flex</category><category>Fortran</category><category>Hacker News</category><category>Havok</category><category>Java</category><category>Kerbal Space Program</category><category>LinkedIn</category><category>Playstation 3</category><category>Quake 2</category><category>Quake 3</category><category>Radiant</category><category>Unity</category><category>Winamp</category><category>Wolfenstein 3D</category><category>aaq.cc</category><category>augmented reality</category><category>bad practice</category><category>bugs</category><category>clouds</category><category>coding standards</category><category>const_cast</category><category>database</category><category>deferred</category><category>distance fields</category><category>e-mail</category><category>engine</category><category>evil</category><category>framebuffer</category><category>hack</category><category>insurance</category><category>interview</category><category>inverse</category><category>jEngine</category><category>library</category><category>link</category><category>logic</category><category>malware</category><category>motivation</category><category>multithreading</category><category>normal mapping</category><category>operator overloading</category><category>patents</category><category>primes</category><category>projects</category><category>real programming</category><category>shadows</category><category>software</category><category>stack</category><category>stargazing</category><category>static code analysis</category><category>text editing</category><category>threading</category><category>vba</category><category>visualisation</category><category>web</category><category>x86</category><category>22 cans</category><category>3D</category><category>ARM</category><category>ASCII</category><category>ASCII art</category><category>Apps World</category><category>Aqua Moon Games</category><category>Ariel</category><category>AvP</category><category>BNFC</category><category>Beyond Compare</category><category>Bitbucket</category><category>Blinn</category><category>COM</category><category>Chmutov</category><category>Chrome</category><category>Command and Conquer</category><category>DLL hell</category><category>DbgHelp</category><category>Deep Space Defence</category><category>E3</category><category>EA</category><category>Eclipse</category><category>Edison</category><category>Einstein notation</category><category>FNF</category><category>FX Composer</category><category>Firefox</category><category>GDI+</category><category>GTA</category><category>GUI</category><category>Google Code</category><category>Gunslingers</category><category>IBM</category><category>Internet Explorer</category><category>JPEG</category><category>JPL</category><category>Joel Test</category><category>LGPL</category><category>MIT license</category><category>MS Paint</category><category>MSDN</category><category>MWC</category><category>Mac</category><category>Mars</category><category>Matchup Mayhem</category><category>Model M</category><category>Moon Goons</category><category>MySQL</category><category>NASA</category><category>NAT</category><category>NSDictionary</category><category>NXTDS</category><category>NeverDead</category><category>Notepad++</category><category>OpenAL</category><category>Outlook</category><category>PARC</category><category>PNG</category><category>PS3</category><category>Paint.NET</category><category>Peter Molyneux</category><category>Plan It Out</category><category>PowerPC</category><category>RSI</category><category>Ruby</category><category>SQL</category><category>Samsung</category><category>SketchUp</category><category>Small Basic</category><category>Source</category><category>SourceTree</category><category>TIOBE</category><category>TMP</category><category>Tesla</category><category>Thunderbird</category><category>Tiled</category><category>Tony Hawk's American Wasteland</category><category>Trillium</category><category>Uranus</category><category>VMWare</category><category>Virgin Media</category><category>Voyager</category><category>W3Schools</category><category>WinMerge</category><category>WinScript</category><category>Windows 7</category><category>Word</category><category>X</category><category>XAudio 2</category><category>Xcode</category><category>Xerox</category><category>Y U NO</category><category>astrophysics</category><category>birthday</category><category>boilerplate</category><category>breakpoint</category><category>browser</category><category>build</category><category>build process</category><category>cell portal graph</category><category>community</category><category>competition</category><category>const-correctness</category><category>controls</category><category>crunch</category><category>dialog</category><category>diff</category><category>dynamic dispatch</category><category>encapsulation</category><category>environment</category><category>exceptions</category><category>filedump</category><category>fmod</category><category>formatting</category><category>gcc</category><category>generics</category><category>git</category><category>good practice</category><category>gotcha</category><category>goto</category><category>graphics cards</category><category>gravity duel</category><category>half-angle approximation</category><category>handedness</category><category>iPad</category><category>iPhone</category><category>icons</category><category>incompetence</category><category>inheritance</category><category>install</category><category>integer</category><category>interpreter</category><category>invsqrt</category><category>jerks</category><category>keyboard</category><category>language</category><category>laptop keyboard</category><category>late binding</category><category>lazy evaluation</category><category>lexer</category><category>linked list</category><category>low level</category><category>macros</category><category>mechanical keyboard</category><category>merge</category><category>metablobs</category><category>mod</category><category>multiplayer</category><category>nop</category><category>notepad</category><category>number theory</category><category>object orientation</category><category>open source</category><category>overtime</category><category>particles</category><category>past</category><category>piracy</category><category>pixel art</category><category>pixlr.com</category><category>platform independence</category><category>popularity</category><category>programmer art</category><category>proxy</category><category>quaternion</category><category>random</category><category>readability</category><category>real-life</category><category>refactoring</category><category>reference counting</category><category>regular expressions</category><category>review</category><category>scam</category><category>scanner</category><category>science</category><category>sound</category><category>source control</category><category>specular</category><category>standard library</category><category>streaming</category><category>style</category><category>summary</category><category>tab order</category><category>teaching</category><category>tensors</category><category>texture coordinates</category><category>texture tool</category><category>textures</category><category>time</category><category>tips</category><category>tools</category><category>transpose</category><category>twitter</category><category>ubuntu</category><category>unordered_map</category><category>url</category><category>usability</category><category>user interface</category><category>vanity</category><category>virtual inheritance</category><category>virtual machines</category><category>voting</category><category>water</category><category>web programming</category><category>wikipedia</category><category>writing</category><title>Reinventing the Wheel</title><description></description><link>http://jheriko-rtw.blogspot.com/</link><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><generator>Blogger</generator><openSearch:totalResults>360</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-6097320391045852835</guid><pubDate>Thu, 28 Sep 2017 19:48:00 +0000</pubDate><atom:updated>2017-09-28T20:48:27.388+01:00</atom:updated><title>Known Space</title><description>Coming soon to iOS, Known Space is the premiere app for astronomical discovery and education...&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;img src="http://cranium-software.co.uk/wp-content/uploads/2017/09/Web6.png" /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
http://cranium-software.co.uk/known-space/&lt;/div&gt;
</description><link>http://jheriko-rtw.blogspot.com/2017/09/known-space.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-4873456953969519443</guid><pubDate>Sat, 07 Dec 2013 13:28:00 +0000</pubDate><atom:updated>2013-12-07T13:28:39.939+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">birthday</category><category domain="http://www.blogger.com/atom/ns#">Google</category><title>Neat little Google feature I never noticed before...</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQLBmM2E5XkDxDhiolUceSevttLUViucmkFj5nuk23yYiyi2O9DBMdd2Eoa4e3MXRXKLPot9HgF_0iaOdXS4cq28PYtsbnJL5sGLvjcY2YJEuYFcZNkLKHnZ2GbDnDGw_x_LESM3WpQOE/s1600/goog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQLBmM2E5XkDxDhiolUceSevttLUViucmkFj5nuk23yYiyi2O9DBMdd2Eoa4e3MXRXKLPot9HgF_0iaOdXS4cq28PYtsbnJL5sGLvjcY2YJEuYFcZNkLKHnZ2GbDnDGw_x_LESM3WpQOE/s1600/goog.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
A Google doodle for my birthday... :)&lt;/div&gt;
</description><link>http://jheriko-rtw.blogspot.com/2013/12/neat-little-google-feature-i-never.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQLBmM2E5XkDxDhiolUceSevttLUViucmkFj5nuk23yYiyi2O9DBMdd2Eoa4e3MXRXKLPot9HgF_0iaOdXS4cq28PYtsbnJL5sGLvjcY2YJEuYFcZNkLKHnZ2GbDnDGw_x_LESM3WpQOE/s72-c/goog.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-1392728820261755002</guid><pubDate>Wed, 04 Dec 2013 15:01:00 +0000</pubDate><atom:updated>2013-12-04T15:01:45.410+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><category domain="http://www.blogger.com/atom/ns#">Unity</category><title>My rule of three...</title><description>... is that three times is too many!&lt;br /&gt;
&lt;br /&gt;
I do tend to repeat a variation on&amp;nbsp;"if you have to do some thing three times with only small differences, generalise that code". The example that makes this clearest is copy-paste code with small differences...&lt;br /&gt;
&lt;br /&gt;
So, to give a concrete example I hit this code a little earlier and needed to add an extra instance of the repeated logic here:&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;protected override void OnGo()&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;{&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FloatyBoostTrail&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform childTransform = transform.FindChild( "Pickup" );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( childTransform )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameObject icon = childTransform.gameObject;&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; icon.SetActive( false );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; childTransform = transform.FindChild( "FloatyBoostTrail" );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( childTransform )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameObject trail = childTransform.gameObject;&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; trail.SetActive( true );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayFlash();&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;Yes, its copy-paste code! I still haven't quite learned the discipline 
to do it right first time.&lt;br /&gt;
&lt;br /&gt;
Now that I need to add a third
 case its pretty strikingly obvious that doing the same thing three times here is bad (doing it twice was probably bad too, but in cases
 less trivial than copy-paste vs. functions its not usually so obvious) 
so I've added a function - actually two because of utility and the 
confusion that the combination of 'set' and any boolean state causes for
 the reader/user where they may or may not expect a parameterless 
version of the function which sets it to true:&lt;br /&gt;

&lt;br /&gt;
&lt;tt&gt;private void SetChildActive( string name )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;{&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetChildActive( name, true );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;}&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;private void SetChildActive( string name, bool active )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;{&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform childTransform = transform.FindChild( name );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( childTransform )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameObject child = childTransform.gameObject;&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; child.SetActive( active );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
Simple really... when we look at the call site, even with the new 
addition, the code is clean and more readable.&lt;br /&gt;
&lt;br /&gt;
&lt;tt&gt;protected override void OnGo()&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;{&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetChildActive( "Pickup", false );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetChildActive( "FloatyBoostTrail", true );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetChildActive( "Aura", true );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayFlash();&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;}&lt;/tt&gt;&lt;br /&gt;
&lt;br /&gt;
More importantly the 
number of points of failure in the code have decreased - we can no 
longer break or misuse the code with a bad copy-paste and there are less
 lines of code to handle when debugging without taking anything much 
away. This code 'just is' more robust - breaking it is more easily 
detected because it will break a lot of things and not one - fixing it 
is also more strongly verified since it can be seen if it works for 
most, if not all cases, when testing - rather than a single case.&lt;br /&gt;
&lt;br /&gt;
Now that I've done this, looking at that code the null check is not 
ideal - i'm tempted to take it out because things shouldn't be trying to
 make non-existent children active - that's the sort of thing I like to 
have a crash for rather than a silent failure...&lt;br /&gt;

&lt;br /&gt;
&lt;tt&gt;private void SetChildActive( string name, bool active )&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;{&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Transform childTransform = transform.FindChild( name );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GameObject child = childTransform.gameObject;&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; child.SetActive( active );&lt;/tt&gt;&lt;tt&gt;&lt;br /&gt;
&lt;/tt&gt;&lt;tt&gt;}&lt;/tt&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/12/my-rule-of-three.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-847213986971290570</guid><pubDate>Wed, 04 Dec 2013 14:56:00 +0000</pubDate><atom:updated>2013-12-04T14:56:38.339+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">real life</category><title>Still working on leaving...</title><description>Its just so unimportant... and so little time to migrate the blog.</description><link>http://jheriko-rtw.blogspot.com/2013/12/still-working-on-leaving.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-623521362181997937</guid><pubDate>Mon, 18 Nov 2013 07:34:00 +0000</pubDate><atom:updated>2013-11-18T08:01:44.125+00:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Bitbucket</category><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">source control</category><category domain="http://www.blogger.com/atom/ns#">SourceTree</category><title>Why I 'hate' git...</title><description>Okay, so I don't really hate git as such, but I have mentally categorised as 'unusable software'.&lt;br /&gt;
&lt;br /&gt;
I made a &lt;a href="https://news.ycombinator.com/item?id=6751416"&gt;pretty harsh comment to that effect on Hacker News&lt;/a&gt; recently, with some overly strong wording and some confusion about things due to my haste and rage, complete with a stab at all of the 'hipsters' who love to downvote things without thinking... and quite deservedly it has been voted down to oblivion, although a lot of it came with some useful and insightful comments.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;EDIT: I should make it clear, I really appreciate all the effort that most of the commenters went to in trying to explain how to solve this problem to me. Like the original 'article' there it does help show that the OSS community doesn't always devolve into name-calling and emotional responses - that its an exception rather than the case. Also its nice to know that people want to educate as well as criticise - the two should always come hand in hand, as its somewhat unfair to make criticism without the ability to suggest improvements or fixes.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
To help give some context as to why I have a problem with git I'll explain the exact situation I was in and reproduce a trivialised version of the same scenario, explaining problems along the way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I wanted to revert a merge on the remote server (as well as in my local copy).&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This is the essence of the problem I had, and recreating a trivialised version of this in the same way reveals why it was troublesome for me. There is no obviously visible commit for the merge.&lt;br /&gt;
&lt;br /&gt;
To explain what I did to reach this I created a new &lt;a href="https://bitbucket.org/jheriko/git-test/"&gt;git repo on Bitbucket&lt;/a&gt; (which I highly recommend for Mercurial hosting - but in hindsight, why didn't i use Github?). I followed their example to commit README.md then created a branch 'test', made a single change to the file then merged 'test' into master. After this I stack another change on top.&lt;br /&gt;
&lt;br /&gt;
I did this at the command line except for the branch and merge, which I did using &lt;a href="http://www.google.co.uk/url?sa=t&amp;amp;rct=j&amp;amp;q=source%20tree&amp;amp;source=web&amp;amp;cd=1&amp;amp;cad=rja&amp;amp;ved=0CC8QFjAA&amp;amp;url=http%3A%2F%2Fwww.sourcetreeapp.com%2F&amp;amp;ei=p7yJUpOFGe-v7AaL9YC4Cg&amp;amp;usg=AFQjCNFMFsVR4sTJqNNuZEDeJJ13qbFiew&amp;amp;sig2=bHMN0COoyctyfMq5C1pNrw&amp;amp;bvm=bv.56643336,d.ZGU"&gt;SourceTree&lt;/a&gt; (because this is what I did at work at the time - I don't think thats too important).&lt;br /&gt;
&lt;br /&gt;
Now I am left with this picture of the history&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggeir42H4y72RmLysrJCoFX7VRWcvt9yDT_ObFVBvnxFm-8thnuA1-UxYObk7alwIQhpNfA0bNfcIxIL-bqCCb9l2rjsLd4gHIka-m3dsMYbErFhtEwmfBiQ-D3hOcMymK6BDEIzWLbdk/s1600/Screen+Shot+2013-11-18+at+07.15.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggeir42H4y72RmLysrJCoFX7VRWcvt9yDT_ObFVBvnxFm-8thnuA1-UxYObk7alwIQhpNfA0bNfcIxIL-bqCCb9l2rjsLd4gHIka-m3dsMYbErFhtEwmfBiQ-D3hOcMymK6BDEIzWLbdk/s1600/Screen+Shot+2013-11-18+at+07.15.47.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;There is no obviously visible commit for the merge.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As an aside it also looks like something has altered history - this might not be the case, but the first time I merged using git this was mildly terrifying for me. I expected to see an actual branch and a merge and some kind of changes for the making of the branch and the merge. I shrugged it off at the time because everyone else on the team was using git and didn't seem to think it was a problem so far... this kind of thinking is always a mistake and I should know better.&lt;br /&gt;
&lt;br /&gt;
Now, when it comes time to revert this change how can I do it?&lt;br /&gt;
&lt;br /&gt;
Following my standard practice when I don't know how to do something I asked the team. Nobody knew. This is really the heart of the problem, we were using a tool and we didn't know how to use it. The first time I used mercurial this was something that I learned how to do on a test repository, because it seemed like a good idea to learn the tool in a safe environment before entrusting it with my code (which I didn't do for a long time after that anyway...).&lt;br /&gt;
&lt;br /&gt;
My next stop was the man page for git revert, it seemed like the operation I wanted to do, I just needed some way to specify what to revert. Now, it seems to want a 'commit' parameter so I look at its suggestion of the git-revisions man page too...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
I read through that somewhat at the time, but gave up quickly because it seemed to only tell me how to specify a commit, not how to find the one I was looking for (this was a mistake too - reading it now I have learned that there is such a thing as MERGE_HEAD, although I'm not sure it would have helped) and looked at git rev-list also pointed to on that page.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I ran git rev-list HEAD because it seemed like the right way to find the commit. It lists three commit hashes:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="p1"&gt;
27376d9b1ca61dbcb1cb3c35c9697ac2e7bc894d&lt;/div&gt;
&lt;div class="p1"&gt;
a5a1238b9d1e59b80d0738e983af6695254d1077&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;/div&gt;
&lt;div class="p1"&gt;
037c6bb92392e19e9fc2f73ed4f73e1da522afef&lt;/div&gt;
&lt;div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
These are the commits I can already see in SourceTree. Clearly I am out of my depth or there is something fundamentally wrong here. Maybe SourceTree can help me somehow? So I spend some time investigating its UI and find nothing that is obviously helpful.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
The next stop was Google with the search string "revert merge in git" or very similar. I don't think I can go and see what the exact search results at the time were but I think the current ones are probably quite indicative...&lt;br /&gt;
&lt;br /&gt;
So, doing the search today I find several results that look promising:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/2389361/undo-a-git-merge"&gt;http://stackoverflow.com/questions/2389361/undo-a-git-merge&lt;/a&gt; - okay, so this isn't my situation..&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/11722533/git-rollback-a-merge"&gt;http://stackoverflow.com/questions/11722533/git-rollback-a-merge&lt;/a&gt; - and again...&lt;/li&gt;
&lt;li&gt;&lt;a href="http://git-scm.com/blog/2010/03/02/undoing-merges.html"&gt;http://git-scm.com/blog/2010/03/02/undoing-merges.html&lt;/a&gt; - this looks promising&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div class="p1"&gt;
Now, to me we were already at 'serious UX bug' when I couldn't see a commit for my merge. The length of this page and the number of diagrams reinforces my belief that this tool was made by developers with no care for the end user. This might sound harsh, but its extremely common for development tools - they are made by programmers for programmers, and programmers easily forget just how bad programmers can be - including themselves. This biases me further against git.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Anyway reading through the first example solution it looks just like my problem. I don't want to lose the changes on top of the branch merge so this should work, but as I read further it becomes obvious that I missed something - well maybe I can muddle through if I just rewind back to the first revision on master. No wait... those arrows are backwards! RAGE! Who are these people?!?! etc. Gah.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
So I read the thing knowing that the arrows are backwards - this is not my situation at all, I don't want to remove a change from just before a merge (but its useful to know that I can at least). Then suddenly I click that these diagrams are representing merges by commits. I can't find a commit for my merge - and that was the problem I was hoping to resolve here.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
The next example starts out much more promising - it actually does describe my situation. However, the opening statement fills me with dread.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: #fcfcfa; line-height: 22px;"&gt;&lt;span style="font-family: inherit;"&gt;Now you either have to revert one of the merges, or go back, remerge and then cherry-pick the remaining changes again (C9 and C10 in this case), which is confusing and difficult, especially if there are a lot of commits after those merges.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;div class="p1"&gt;
&lt;span style="background-color: #fcfcfa; color: #4e443c; font-family: adelle, Georgia, 'Times New Roman', serif; font-size: 14px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
I think 'if this guy thinks this is confusing and difficult then I am probably boned'. There were quite a lot of changes on top of the merge - unlike in my simplified example. I read through anyway but, this also wants me to be able to identify the merge commit as well.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
All that is left is a slightly confusing paragraph and comment about git merge --no-ff... right well, maybe I should have used that when I did my merge. No help to me now.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
What to do next? At this point I've spent too much time on what shouldn't even be a problem. I unpick the changes myself with diff tools and memory (because it was more than one commit and I can't see which ones are from the original branch in SourceTree or Bitbucket) and build a 'anti-merge' commit myself. Maybe there was an easier way to do this - my experience to this point was telling me that the documentation was not going to help me because it seemed to be missing critical information...&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Once done and our immediate concern of shipping our product was resolved I moved the repo to Mercurial.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Now, maybe a lot of this is my own fault, but this is considerably more effort than I have needed to make with any other source control solution (I have used most of the other popular ones - cvs, svn, p4, hg) where the built in help at the command line was more than adequate to learn how to solve this problem.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Maybe I am just deluded or wrong - but I doubt it - this is a horrible user experience and frankly, it makes the tool dangerous - especially if you are confident with source control and having used multiple different solutions in the past. I think everyone was quite happy to 'make the mistake' of using a tool they didn't know because it was so popular, it couldn't possibly be worse than all of the other tools we've ever used? Could it?&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="p1"&gt;
Well it is.&lt;/div&gt;
&lt;div class="p1"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://jheriko-rtw.blogspot.com/2013/11/why-i-hate-git.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggeir42H4y72RmLysrJCoFX7VRWcvt9yDT_ObFVBvnxFm-8thnuA1-UxYObk7alwIQhpNfA0bNfcIxIL-bqCCb9l2rjsLd4gHIka-m3dsMYbErFhtEwmfBiQ-D3hOcMymK6BDEIzWLbdk/s72-c/Screen+Shot+2013-11-18+at+07.15.47.png" width="72"/><thr:total>11</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-5114785809894917057</guid><pubDate>Sat, 12 Oct 2013 19:06:00 +0000</pubDate><atom:updated>2013-10-12T20:06:00.563+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bugs</category><category domain="http://www.blogger.com/atom/ns#">build</category><category domain="http://www.blogger.com/atom/ns#">build process</category><category domain="http://www.blogger.com/atom/ns#">dialog</category><category domain="http://www.blogger.com/atom/ns#">install</category><category domain="http://www.blogger.com/atom/ns#">Joel Test</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Mac</category><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">scripting</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>One button to rule them all...</title><description>Haven't seen one of these in years. Is this really something we are expected to do ever?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQn7tS13vKOZHBIqY-pkl5aqcTqBzUWDLqJENrxC6Etom_9n0-e2VkoJIgJdruuDrQEACTgjcqSJ8j3-ixlMeIhr2ayDosaz5vTEoZ1QY6VvQP9FcKPfqUhznM669HyAmOmGOSxd0TBpc/s1600/dialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQn7tS13vKOZHBIqY-pkl5aqcTqBzUWDLqJENrxC6Etom_9n0-e2VkoJIgJdruuDrQEACTgjcqSJ8j3-ixlMeIhr2ayDosaz5vTEoZ1QY6VvQP9FcKPfqUhznM669HyAmOmGOSxd0TBpc/s1600/dialog.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Never been a fan of this sort of thing... even back in the 90s when there was something resembling an excuse for programmers to be that awful at their jobs. I get the financial implications and not wanting to spend time on installers but I've always been of the opinion that they are the first exposure of the user to your product - you want to get it right because, traditionally, first impressions matter.&lt;br /&gt;
&lt;br /&gt;
Other people care about this too thankfully. Relatively recently I commented on&lt;a href="http://jheriko-rtw.blogspot.co.uk/2012/09/first-impressions-of-ubuntu-linux.html"&gt; the awesomeness of the Ubuntu install process&lt;/a&gt;. More and more installers seem to be moving towards silent and painless installs. I quite like the Mac install process - but even that could be slicker, the drag and drop takes a veritable eternity and a colossal effort over a single, or even double click. Why on Earth do I need to press more than one button if I don't need to provide any information for the installer?&lt;br /&gt;
&lt;br /&gt;
Perhaps there should be some rule 'single actions should require single triggers'...&lt;br /&gt;
&lt;br /&gt;
This is a generalisation of the spirit behind one of Joel Spolsky's '&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;Joel Test&lt;/a&gt;' questions...&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: white; font-family: Georgia, serif; line-height: 20px;"&gt;2. Can you make a build in one step?&lt;/span&gt;&lt;/blockquote&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I spent a little while taking this to the extreme recently, but even before discovering Joel's blog I managed to intuit my own way to a similar conclusion.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A few years back I clocked that needing to install or build dependencies is not only a massive headache (yes, Linux fanboys an enormous, colossal waste of my time) but it can be avoided if you make your project properly by checking-in dependencies in an appropriate fashion. (btw, MS, Apple, Google, can you make yours right so that users don't pick up your filthy habits? the damage done by that source/headers split in VS is colossal - for example)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So for a long time I've always been able to get latest and press build and have it run without any messing about that is avoidable. This is partly why I have such a passionate hatred for the 'bad default bug' in VS that it always runs out of $(ProjectDir) and not the only possible sensible default of $(TargetDir) which emulates the launch behaviour of every piece of commercial software I have ever touched and would allow me to check-out latest /and/ build with one click. Don't get me wrong, it makes me mad that such an obvious bug does not get fixed, or that any one who decided $(ProjectDir) was sensible is employed in a job that requires thinking... but it actually prevents me from doing something valuable, which is otherwise entirely possible. I can actually script this away by violating politeness but I refuse to on principle...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Amazingly Mac's are less rubbish - although there is a different snag there if you want a one click 'get latest then build it on this clean and unused machine' - installing xcode. Now, I'm not a great Apple user nor a Mac fanboy so I do not know how to install Xcode non-interactively - all I know is that "Xcode install non-interactive" as a Google search string gives me nothing useful. Is there a user manual for the Mac like there is for the iPhone? (...and how do Apple manage to make the only products I ever want a manual for!)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Anyway rant over. I can probably sum this up with the obvious and seemingly redundant statement: Unnecessary user interaction is not required.&lt;/div&gt;
</description><link>http://jheriko-rtw.blogspot.com/2013/10/one-button-to-rule-them-all.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQn7tS13vKOZHBIqY-pkl5aqcTqBzUWDLqJENrxC6Etom_9n0-e2VkoJIgJdruuDrQEACTgjcqSJ8j3-ixlMeIhr2ayDosaz5vTEoZ1QY6VvQP9FcKPfqUhznM669HyAmOmGOSxd0TBpc/s72-c/dialog.png" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-857252470003858619</guid><pubDate>Mon, 07 Oct 2013 06:55:00 +0000</pubDate><atom:updated>2013-10-07T07:55:00.259+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">Blogger</category><category domain="http://www.blogger.com/atom/ns#">real life</category><title>I will leave blogger soon (!)</title><description>After realising that I can't see or reply to comment threads in the layout I use, and generally things like having to delete posts because they break the page layout... I'm sick of it. Time to go.&lt;br /&gt;
&lt;br /&gt;
I will set up some redirects and replicate everything that is already here so as to avoid creating a load of dead links on the web.&lt;br /&gt;
&lt;br /&gt;
I hate to say it Blogger just doesn't provide a good enough service for me. There are much better free alternatives and I will be experimenting with them to select a new platform over the coming week...&lt;br /&gt;
&lt;br /&gt;
I have spectacularly low standards. Blogger should feel ashamed of their ineptitude... :/</description><link>http://jheriko-rtw.blogspot.com/2013/10/i-will-leave-blogger-soon.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-7274708936783168235</guid><pubDate>Sat, 05 Oct 2013 14:51:00 +0000</pubDate><atom:updated>2013-10-05T15:51:25.035+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">3D</category><category domain="http://www.blogger.com/atom/ns#">art</category><category domain="http://www.blogger.com/atom/ns#">projects</category><category domain="http://www.blogger.com/atom/ns#">SketchUp</category><title>SketchUp is awesome</title><description>Just a little reminder after working on some 3D assets recently...&lt;br /&gt;
&lt;br /&gt;
Also, hint at all the other ridiculous 3d modelling software - please steal their input mechanism - its a million times better than all of yours. :P&lt;br /&gt;
&lt;br /&gt;
Sure it lacks all the cool tools of 3DS or Maya, but for actually making raw geometry its infinitely better IMO.&lt;br /&gt;
&lt;br /&gt;
Check out this low poly mesh for some project I am working on. Whilst I'm sure I could have made this with other tools, fiddling with the geometry around the joins to reduce the polycount is a lot easier for me when I can easily edit vertices and edges in the SketchUp style... building construction lines then cutting at midpoints or intervals etc. probably doesn't appeal to most art types though I'm sure.&lt;br /&gt;
&lt;br /&gt;
... and before anyone says it, that door isn't going to open out through the sides of the octagonal tube, but rather the toothed bits will slide along the other surface to reveal a gap. My hope is that it will work without looking stupid... :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqkThwq6yMkgwwiH8xeuLXoKPrzH-iZXN8nQAwnw3xWSlCHpnGQtDg1CkcueFrcm4HdGeT7KphtSYdazaPiZuGygTpcgJ8q69todMS6ir7iabeb38CjX4MNfYQn50fGL-kp1inc2fxFtA/s1600/Screen+Shot+2013-10-05+at+15.44.51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="303" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqkThwq6yMkgwwiH8xeuLXoKPrzH-iZXN8nQAwnw3xWSlCHpnGQtDg1CkcueFrcm4HdGeT7KphtSYdazaPiZuGygTpcgJ8q69todMS6ir7iabeb38CjX4MNfYQn50fGL-kp1inc2fxFtA/s400/Screen+Shot+2013-10-05+at+15.44.51.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3M8-PPQtUR6bCmYAUgxv52wvQxsoyPP3h4aJRSISt-U1VAM4fpWqxlR3pNG1Io5VkpMJe5t0Dz0HsQanVbTtxD7J_zbQLXQ8j_wxYcV_-jd1trVjF1gAeumQ9SJtPLHVelICpB74O9ZY/s1600/Screen+Shot+2013-10-05+at+15.45.06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3M8-PPQtUR6bCmYAUgxv52wvQxsoyPP3h4aJRSISt-U1VAM4fpWqxlR3pNG1Io5VkpMJe5t0Dz0HsQanVbTtxD7J_zbQLXQ8j_wxYcV_-jd1trVjF1gAeumQ9SJtPLHVelICpB74O9ZY/s400/Screen+Shot+2013-10-05+at+15.45.06.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6RyTR1qtez2bsDS5rFNxhOgPfbv4X5OsKP896lM-onIGtBEaenxFBV085fQU3TxetSIVC9kmuprvfPL4JfJn9TIPyL3-WLfYYA8JhFPOb-uSw58prwvEZ4bSt7qoeQcsEkGfD7jeVJFQ/s1600/Screen+Shot+2013-10-05+at+15.45.16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6RyTR1qtez2bsDS5rFNxhOgPfbv4X5OsKP896lM-onIGtBEaenxFBV085fQU3TxetSIVC9kmuprvfPL4JfJn9TIPyL3-WLfYYA8JhFPOb-uSw58prwvEZ4bSt7qoeQcsEkGfD7jeVJFQ/s400/Screen+Shot+2013-10-05+at+15.45.16.png" width="328" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/10/sketchup-is-awesome.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqkThwq6yMkgwwiH8xeuLXoKPrzH-iZXN8nQAwnw3xWSlCHpnGQtDg1CkcueFrcm4HdGeT7KphtSYdazaPiZuGygTpcgJ8q69todMS6ir7iabeb38CjX4MNfYQn50fGL-kp1inc2fxFtA/s72-c/Screen+Shot+2013-10-05+at+15.44.51.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-2837326343951511028</guid><pubDate>Wed, 02 Oct 2013 10:45:00 +0000</pubDate><atom:updated>2013-10-03T16:56:23.435+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Aqua Moon Games</category><category domain="http://www.blogger.com/atom/ns#">Matchup Mayhem</category><category domain="http://www.blogger.com/atom/ns#">Moon Goons</category><category domain="http://www.blogger.com/atom/ns#">work</category><title>Mini Moon Goon Matchup Mayhem</title><description>Worked on this game recently and now its shipped (in Canada):&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://itunes.apple.com/ca/app/matchup-mayhem/id681228541?mt=8"&gt;https://itunes.apple.com/ca/app/matchup-mayhem/id681228541?mt=8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Check it out. :)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://a5.mzstatic.com/us/r30/Purple/v4/b4/9c/bb/b49cbb2d-7cf8-a5da-22be-1f08022cab09/screen568x568.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://a5.mzstatic.com/us/r30/Purple/v4/b4/9c/bb/b49cbb2d-7cf8-a5da-22be-1f08022cab09/screen568x568.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/10/mini-moon-goon-matchup-mayhem.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-751333126094125475</guid><pubDate>Fri, 27 Sep 2013 11:32:00 +0000</pubDate><atom:updated>2013-09-27T12:32:00.384+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C++</category><category domain="http://www.blogger.com/atom/ns#">compiler</category><category domain="http://www.blogger.com/atom/ns#">dynamic dispatch</category><category domain="http://www.blogger.com/atom/ns#">late binding</category><category domain="http://www.blogger.com/atom/ns#">NSDictionary</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">STL</category><category domain="http://www.blogger.com/atom/ns#">TIOBE</category><category domain="http://www.blogger.com/atom/ns#">unordered_map</category><title>C++ once again more popular than Objective-C</title><description>At least according to the &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE programming language index&lt;/a&gt;, C++ is once again more popular than Objective-C...&lt;br /&gt;
&lt;br /&gt;
I wonder if this is app developers optimising out Objective-C wherever its unnecessary to use it? Although its a fairly naive strategy for optimisation, it is valid in my experience.&lt;br /&gt;
&lt;br /&gt;
Simple changes like removing &lt;a href="https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSDictionary_Class/Reference/Reference.html"&gt;NSDictionaries&lt;/a&gt; where possible and using some e.g. &lt;a href="http://www.cplusplus.com/reference/unordered_map/unordered_map/"&gt;stl::unordered_map&lt;/a&gt;, can drastically improve performance simply because the 'messaging', i.e. member function calling mechanism, in Objective-C is rather heavyweight compared to a C/C++ function call, which (except in the cases of virtual member functions and virtual inheritance) is near identical with the x86 CALL instruction, which is equivalent to a move and an unconditional branch - instructions supported by every CPU.&lt;br /&gt;
&lt;br /&gt;
This case of the unordered_map lookup is especially illuminating because the underlying implementation of the message call has worse runtime characteristics than doing a lookup in the unordered_map - so before it even starts a look up NSDictionary is crippled by its run-time environment. This is entirely due to the requirement of dynamic dispatch, that the function being called can be decided at run-time. C or C++ functions use static dispatch - the address of its code is known at compile-time (unless you are fool enough to turn on the utterly redundant and needlessly slow RTTI feature).&lt;br /&gt;
&lt;br /&gt;
It is possible to optimise around this within the scope of Objective-C and its run-time library, but by using long winded boilerplate-y API functions to reduce the amount of lookups being done... (hint: can we not have a language feature that implements something like thiscall? I can write equivalent C code and get the same performance benefit already... syntactic sugar is all we need)&lt;br /&gt;
&lt;br /&gt;
Of course in most cases apps don't do anywhere near enough stuff often enough to need to care about this, and performance critical lookups can be cached which is often a much more significant win than making the lookups themselves any faster...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/09/c-once-again-more-popular-than.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-5357746554594229899</guid><pubDate>Thu, 26 Sep 2013 18:30:00 +0000</pubDate><atom:updated>2013-09-26T19:30:00.771+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">Blogger</category><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">reinventing the wheel</category><category domain="http://www.blogger.com/atom/ns#">search</category><title>No 3. search result for "reinventing the wheel" on Google is...</title><description>... this blog. (!)&lt;br /&gt;
&lt;br /&gt;
Maybe this is because Google own Blogger, but I appear to be as far up this page of search results as I would imagine is reasonable. Wikipedia and the Free Dictionary probably deserve those top two spots quite a lot... I'm not sure I should be beating the company called 'Reinventing the Wheel' though.&lt;br /&gt;
&lt;br /&gt;
Maybe this is Google tailoring the search results to me though? I'd be interested to know if anybody else sees this same result...&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.google.co.uk/#q=reinventing+the+wheel"&gt;https://www.google.co.uk#q=reinventing+the+wheel&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrX1PT9RZSbJPImabG7O8rVnQ_ftjiPXHWKqGI2HuNbDPXrpz7yJLZ09wGeO-JaCHts_cM-A6u6NMOrfw6Q-WPGfycis6iLK9NtjDVz6ViSXaWfAPKKAb77BZh5N2cI2vJdGXw2xaMTIU/s1600/Screen+Shot+2013-09-26+at+02.03.59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrX1PT9RZSbJPImabG7O8rVnQ_ftjiPXHWKqGI2HuNbDPXrpz7yJLZ09wGeO-JaCHts_cM-A6u6NMOrfw6Q-WPGfycis6iLK9NtjDVz6ViSXaWfAPKKAb77BZh5N2cI2vJdGXw2xaMTIU/s1600/Screen+Shot+2013-09-26+at+02.03.59.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Someone should sell SEO to the alloy wheel refurbishment company with the same name as this blog... quick!&lt;br /&gt;
&lt;br /&gt;
Also when did Google stop responding to ?q=search+string ? Or is this just some weirdness in chrome that I now need to use # to get my desired result?&lt;br /&gt;
&lt;br /&gt;
Nevermind, I am happy whatever the case... I think.</description><link>http://jheriko-rtw.blogspot.com/2013/09/no-3-search-result-for-reinventing.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrX1PT9RZSbJPImabG7O8rVnQ_ftjiPXHWKqGI2HuNbDPXrpz7yJLZ09wGeO-JaCHts_cM-A6u6NMOrfw6Q-WPGfycis6iLK9NtjDVz6ViSXaWfAPKKAb77BZh5N2cI2vJdGXw2xaMTIU/s72-c/Screen+Shot+2013-09-26+at+02.03.59.png" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-7397291239674289740</guid><pubDate>Wed, 25 Sep 2013 09:49:00 +0000</pubDate><atom:updated>2013-09-25T10:49:59.002+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">NXTDS</category><category domain="http://www.blogger.com/atom/ns#">Plan It Out</category><category domain="http://www.blogger.com/atom/ns#">work</category><title>Plan It Out</title><description>Sister company to my employer Aqua Moon Games has just launched their new SaaS product for beta. Its an all-in-one planning, time and project management package handling many common day-to-day tasks of running a business.&lt;br /&gt;
&lt;br /&gt;
If this is your kind of thing I'd recommend checking it out...&lt;br /&gt;
&lt;br /&gt;
There is a blog post about it all here:&amp;nbsp;&lt;a href="http://nxtds.com/blog/PlanItOut.com-has-arrived"&gt;http://nxtds.com/blog/PlanItOut.com-has-arrived&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
You can sign up for the beta here:&amp;nbsp;&lt;a href="http://www.planitout.com/"&gt;http://www.planitout.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/09/plan-it-out.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-5583459119628749362</guid><pubDate>Mon, 26 Aug 2013 18:29:00 +0000</pubDate><atom:updated>2013-08-26T19:29:37.124+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">e-mail</category><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">Windows 8</category><title>Windows 8 Mail Fail</title><description>Winodws 8's built-in metro style mail app was working just fine, then one day it started crashing on launch making it utterly useless.&lt;br /&gt;
&lt;br /&gt;
Crashing on launch.&lt;br /&gt;
&lt;br /&gt;
I just want to say that again so that it is clear I did not make a typo - because its a very special class of bug this one. Class 'A'. In fact if there were such a thing as a triple-A bug this would be it...&lt;br /&gt;
&lt;br /&gt;
Microsoft deserve an extra special well done for this one... god knows if they will find time to fix it between making their sample code actually compile, fixing 'exclude file from build' in Visual Studio or finishing the sorely missing Speech API support (what did you guys need to change, really? lets be perfectly honest...). Maybe they are really busy with xbone as well... almost certainly fixing the same class of idiot bugs we see in Windows 8.&lt;br /&gt;
&lt;br /&gt;
I love Windows 8 in general, but ffs, if your mail app crashes on launch then there is something seriously wrong... I for one would have been happier with Outlook Express again - its a superior product in every way except the visual style.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/rant&amp;gt;</description><link>http://jheriko-rtw.blogspot.com/2013/08/windows-8-mail-fail.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-1336945280491326716</guid><pubDate>Mon, 12 Aug 2013 15:28:00 +0000</pubDate><atom:updated>2013-08-12T16:28:35.358+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">streaming</category><category domain="http://www.blogger.com/atom/ns#">Unity</category><title>Loading Unity3D asset bundles asynchronously in iOS</title><description>I recently got snagged trying to load asset bundles asynchronously on iOS. Like every 'good' 'cross-platform' engine the same code did not actually work across platforms. After sifting through a page of useless google results to searches like "asset bundle iOS" and "asset bundle async load iOS" (&lt;a href="https://www.google.co.uk/search?q=unity+asset+bundle+async+load+ios"&gt;https://www.google.co.uk/search?q=unity+asset+bundle+async+load+ios&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
I was eventually able to solve this problem based on information I found here:

&lt;a href="http://stackoverflow.com/questions/8246917/how-to-access-unity-assets-natively-on-android-or-iphone/8298046#8298046"&gt;http://stackoverflow.com/questions/8246917/how-to-access-unity-assets-natively-on-android-or-iphone/8298046#8298046&lt;/a&gt; which suggests the existence of a special path for streaming assets out of...&lt;br /&gt;
&lt;br /&gt;
Most of the easy to find solutions were terrible and I didn't follow them, but I feel I should do my part to contribute a nice solution that doesn't involve disgusting hackery like manually altering your xcode project or suffering stalls mid game for no good reason...&lt;br /&gt;
&lt;br /&gt;
Once your asset bundle is in the correct Assets/StreamingAssets path you can load it with something like this:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0-4tY4aWnz2MU9-tVNvF-CS5LNMEmHlJLglZ2GJq3m5QYNYGjDQA-wip_Fhbyom90PooJIbzWlaUrYUlPMixaw0-kvteoZLQ8U3IVzeWqbFH3jaxUfVy4Qb0q60olrB1G-aclt841Qqb3/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt; string path = "file://" + Application.streamingAssetsPath + "/Bundles/" + name + "_" + BundlePlatform.Current + ".unity3d";  
 WWW loader = WWW.LoadFromCacheOrDownload( path, 0 );  
   
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Note that I place my bundles in Assets/StreamingAssets/Bundles in order for this to work&lt;br /&gt;
&lt;br /&gt;
Now... the magical BundlePlatform.Current I have in there is because there seems to have been little or no consideration for the platform specific build process... or I just haven't found the right bit of obscure documentation to make it work nicely yet. My solution is to name the file differently per platform on export, because trying to load a Win32 or MacOS X bundle on iOS won't work...&lt;br /&gt;
&lt;br /&gt;
Anyway once you have the loader you can use your revolting yield keyword or a beautiful loading queue to manage the timing of loading assets out of the bundles once they are in memory... hope this helps. :)</description><link>http://jheriko-rtw.blogspot.com/2013/08/loading-unity3d-asset-bundles.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-2582693830935824610</guid><pubDate>Wed, 26 Jun 2013 19:05:00 +0000</pubDate><atom:updated>2013-06-26T20:05:35.823+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">Blogger</category><title>Why is my formatting screwed on the 'Unappreciated' blog post?</title><description>I made it with draft.blogger.com using only the compose feature. Nothing special.

The formatting is screwed up and I can't seem to fix it.

Annoying.

I will have to bury it with small and pointless posts.... perhaps.</description><link>http://jheriko-rtw.blogspot.com/2013/06/why-is-my-formatting-screwed-on.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-328452877684136244</guid><pubDate>Fri, 14 Jun 2013 21:54:00 +0000</pubDate><atom:updated>2013-06-14T22:54:27.479+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Dear Visual Studio dev team...</title><description>$(TargetDir) is the only correct default for the working directory preference in a project, please fix this utterly stupid bug.&lt;br /&gt;
&lt;br /&gt;
$(ProjectDir) is not just wrong, it encourages bad practice and is confusing.</description><link>http://jheriko-rtw.blogspot.com/2013/06/dear-visual-studio-dev-team.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-6417419150255169407</guid><pubDate>Sun, 26 May 2013 14:27:00 +0000</pubDate><atom:updated>2013-05-26T15:27:00.096+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blinn</category><category domain="http://www.blogger.com/atom/ns#">half-angle approximation</category><category domain="http://www.blogger.com/atom/ns#">lighting</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">rendering</category><category domain="http://www.blogger.com/atom/ns#">shaders</category><category domain="http://www.blogger.com/atom/ns#">specular</category><title>Blinn specular hack is not faster</title><description>I've heard that it looks closer to the real deal a few times, but that half-angle approximation has a serious problem - it lets reflections through to the other side. Nowadays it is not a performance improvement either because we have good dot and multiply-add instructions on hardware.&lt;br /&gt;
&lt;br /&gt;
Now, this is not a problem if you have self-shadowing, but otherwise quit prematurely optimising and do it right. :)</description><link>http://jheriko-rtw.blogspot.com/2013/05/blinn-specular-hack-is-not-faster.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-4544494176712065640</guid><pubDate>Sat, 25 May 2013 08:55:00 +0000</pubDate><atom:updated>2013-05-25T09:55:00.354+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">games</category><category domain="http://www.blogger.com/atom/ns#">Kerbal Space Program</category><category domain="http://www.blogger.com/atom/ns#">space</category><title>Kerbal Space Program</title><description>&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I was recently introduced to &lt;a href="https://kerbalspaceprogram.com/"&gt;Kerbal Space Program&lt;/a&gt; - a space simulator game that is still under active development. I'd highly recommend trying it out if you are a fan of space or physics simulation games. Considering that its still in 'alpha' and the main chunk of the game is an open world with no objectives or scripted gameplay, its surprisingly good fun...&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzFgvs4PfJt6pykcwRTKFjhF6qdqnyjFmHB7io5gJ3Hwd33dNrp96DVVhODRU5neufjqVw899h-X0nLWrNCr2F7dCFbFk9q7x3TxD4SMVviEtVAhnJ-D-hTfp6FBce_g2NkYp5QDxYDEU/s1600/mun_land_return.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="492" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzFgvs4PfJt6pykcwRTKFjhF6qdqnyjFmHB7io5gJ3Hwd33dNrp96DVVhODRU5neufjqVw899h-X0nLWrNCr2F7dCFbFk9q7x3TxD4SMVviEtVAhnJ-D-hTfp6FBce_g2NkYp5QDxYDEU/s640/mun_land_return.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ever since the days of &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Space_Simulator"&gt;MS Space Simulator&lt;/a&gt; I've wanted to make a game like this... but I think they have done a better job than I would have. The rendering is fairly standard, but stylised in a cartoony fashion which makes it seem that bit better than it really is. The solar system they provide is a much simplified and slightly different version of our own, but there are plenty of things to see all the same.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjstW7jLTcuVhCl3sz9CsvV5mLwjg46vBatZOh2wLVKwMz7rsPx5_L1tiD4w5fXvzSYrdudgdpL0J4YF66fkitBLYnFkAXWrMXU_T2lTyoNlSBfmCSL7EbAllfiYPuMkOxpDqhMHLNsZvg/s1600/construction.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="494" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjstW7jLTcuVhCl3sz9CsvV5mLwjg46vBatZOh2wLVKwMz7rsPx5_L1tiD4w5fXvzSYrdudgdpL0J4YF66fkitBLYnFkAXWrMXU_T2lTyoNlSBfmCSL7EbAllfiYPuMkOxpDqhMHLNsZvg/s640/construction.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The vehicle construction is its own game, and the possibilities they allow you to explore are numerous. Its possible to build planes and rovers as well as rockets, so a flying rocket powered car isn't out of the question. Rockets can be built with multiple stages and various parts can be extended or explosively separated which is&amp;nbsp;surprisingly&amp;nbsp;fun to&amp;nbsp;set-up&amp;nbsp;and watch. Its even possible to dock components together in space and build your own space station...&lt;br /&gt;
&lt;br /&gt;
There are also a load of community created mods available for the game adding all kinds of parts and scenarios to the game. You can provide a .dll as well as art assets for a mod, so the possibilities there are virtually unbounded.&lt;br /&gt;
&lt;br /&gt;
Its not all good though - the game is still an alpha version and it really shows in places. The physics is altered by the time-warp functionality in ways that can be frustrating at times... sometimes an otherwise stable spacecraft will tear itself apart when time is sped up. There is some weirdness with the controls as well - driving the rovers around was a pain until I realised I could use docking mode to stop WASD also controlling pitch and yaw. I think this would be helped with a tutorial or two though - along with the other frustrating elements of the game - a lot of which boil down to it not being obvious what to do e.g. knowing that you must provide electricity for automated command modules or that the 'ASAS' component will make it possible to use the auto-stabilisation by pressing 'T' - vital if you don't want to have to painstakingly guide your rockets during their launches.&lt;br /&gt;
&lt;br /&gt;
Performance is not great either - building large rockets reduces the framerate to a crawl, even on a high-end machine and when a planet fills your screen the framerate can plummet. The load time is appallingly long, and so is exiting the game. There is an annoying 'hitch' when first starting a mission - I think framerate is fine, it just refuses to let you interact for a second or two which is mildly infuriating. These are the kind of problems I expect will be fixed as the game is developed though - either that or are down to Unity and its general shoddiness when it comes to performance.&lt;br /&gt;
&lt;br /&gt;
My main gripe is the price tag. £17 seems a little steep for something so completely unfinished - and even if it was finished... I'm of the opinion that the wannabe AAA titles who expect you to fork over £35 or so aren't even worth that much any more... this feels like £5 worth of game, although I expect that will change in the future when they add more missions and the career mode.&lt;br /&gt;
&lt;br /&gt;
Although I seem to have found more negative points than bad, the game is really, really, REALLY good and I'd highly recommend it. The fun to be had with the physics model and the open environment is probably limitless - and if you are a programmer or artist there is even more fun to be had with modifications.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0758CLWJCkiNsAqZlH1J-NZkCK-jEt4Vs8c5VtGaJtnHnChfY-wul_3Uj2pVUKjYtPpo8pGI9BNKQ0Tb8-sB21AyaN2ngE-wNWufpXG4y_fMLAEeXO2PNBF2esOA2iNo2LYUR5Zdco4/s1600/duna_ike.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="494" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ0758CLWJCkiNsAqZlH1J-NZkCK-jEt4Vs8c5VtGaJtnHnChfY-wul_3Uj2pVUKjYtPpo8pGI9BNKQ0Tb8-sB21AyaN2ngE-wNWufpXG4y_fMLAEeXO2PNBF2esOA2iNo2LYUR5Zdco4/s640/duna_ike.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/05/kerbal-space-program.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzFgvs4PfJt6pykcwRTKFjhF6qdqnyjFmHB7io5gJ3Hwd33dNrp96DVVhODRU5neufjqVw899h-X0nLWrNCr2F7dCFbFk9q7x3TxD4SMVviEtVAhnJ-D-hTfp6FBce_g2NkYp5QDxYDEU/s72-c/mun_land_return.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-4685993462074825308</guid><pubDate>Sat, 25 May 2013 07:19:00 +0000</pubDate><atom:updated>2013-05-25T08:19:59.736+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">art</category><category domain="http://www.blogger.com/atom/ns#">Kerbal Space Program</category><category domain="http://www.blogger.com/atom/ns#">mod</category><title>I did an art!</title><description>&lt;div class="separator" style="clear: both; text-align: left;"&gt;
So, I decided to put together a little mod for &lt;a href="https://kerbalspaceprogram.com/"&gt;Kerbal Space Program&lt;/a&gt; - since I wanted a UK flag for the new flag feature in v0.20 I decided I might as well find some sources for some national flags and package them up and stick them on &lt;a href="http://kerbalspaceport.com/"&gt;Kerbal Space Port&lt;/a&gt;.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
It was pretty straightforward art work - nothing actually creative or involving mad Photoshop skills - just some clipping, resizing and minor retouching based on copyright-free source images found with Google image search. I think I've managed to preserve all of the important details, such as the text on the Brazilian flag and the detail on the coat of arms for Spain.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1c5ZRPCX7CAtWiJwtyRx9OQyUUyfmyGt9H1F8TfKSGhKqbHBVM08IXzFpOwGlb-Xu3jdzXS97OWRlH9PxeEwtI8WHPdvaTM_jPnA8RKPbBiXUpVu8ewNwrIvvY6HvvPSt0jQDMNXos0c/s1600/flags.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1c5ZRPCX7CAtWiJwtyRx9OQyUUyfmyGt9H1F8TfKSGhKqbHBVM08IXzFpOwGlb-Xu3jdzXS97OWRlH9PxeEwtI8WHPdvaTM_jPnA8RKPbBiXUpVu8ewNwrIvvY6HvvPSt0jQDMNXos0c/s1600/flags.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can find the addon here:&amp;nbsp;&lt;a href="http://kerbalspaceport.com/international-flag-pack-2/"&gt;http://kerbalspaceport.com/international-flag-pack-2/&lt;/a&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/05/i-did-art.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1c5ZRPCX7CAtWiJwtyRx9OQyUUyfmyGt9H1F8TfKSGhKqbHBVM08IXzFpOwGlb-Xu3jdzXS97OWRlH9PxeEwtI8WHPdvaTM_jPnA8RKPbBiXUpVu8ewNwrIvvY6HvvPSt0jQDMNXos0c/s72-c/flags.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-6733766629383547729</guid><pubDate>Wed, 15 May 2013 12:53:00 +0000</pubDate><atom:updated>2013-05-15T13:53:00.178+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Apple</category><category domain="http://www.blogger.com/atom/ns#">boilerplate</category><category domain="http://www.blogger.com/atom/ns#">C++</category><category domain="http://www.blogger.com/atom/ns#">DirectX</category><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">OpenGL</category><category domain="http://www.blogger.com/atom/ns#">OS X</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">rant</category><title>Boilerplate code</title><description>Boilerplate code enforced by APIs is a problem... it saddens me to see that something as cool and exciting as shaders have even been reduced to it now. Why is there not a default shader that does the old fixed-function pipeline, but built in to the API?&lt;br /&gt;
&lt;br /&gt;
Its not hard to provide defaults, its also not hard to group your colossal lists of function parameters into structs - because then you might realise that you are solving the problem poorly by not using objects or functions or any of the other modern&amp;nbsp;facilities&amp;nbsp;we have to prevent us from needing to ever deal with this kind of garbage code... My OpenGL or DirectX initialisation code - I am not by any means the best programmer in the world, but the way in which these things have been implemented is&amp;nbsp;appalling. You know how to get it right? You make your function prototypes look like this and then the programmer doesn't have to worry about the implementation:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;void glInit( void );&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;void DXInit( void );&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;NOT HARD!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
With sensible defaults this serves most purposes and lowers the barrier to entry considerably. We have overloading, but we can do things the C style too... so if you want to expose those more powerful options, like choosing your depth/stencil formats or using fullscreen, or whatever else then you provide new functions.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;void glInitFullscreenMaxRes( void ); // an extremely common case&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;void glInitEx( struct SomeStructOfParametersWhichAreMostlyOptional );&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This is not even close to being 'advanced' programming or design - this is the kind of thing that most competent programmers just do without thinking...&lt;br /&gt;
&lt;br /&gt;
Its even worse away from sane platforms like Windows - Apple and Google seem intent to allow us not to write good clean native code, but force us to write some boilerplate in 'alien' languages like Java and Objective-C. Huge chunks of API are dedicated purely to facilitating the piles and piles of needed boilerplate NSValue, NSString, NSRange etc. JNI is much more long winded than necessary as well - how many variables and function calls should it really take to call a static public member function on an object?&lt;br /&gt;
&lt;br /&gt;
Blah!</description><link>http://jheriko-rtw.blogspot.com/2013/05/boilerplate-code.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-5682140080425864948</guid><pubDate>Fri, 10 May 2013 09:07:00 +0000</pubDate><atom:updated>2013-05-10T10:07:51.750+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C++</category><category domain="http://www.blogger.com/atom/ns#">exceptions</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">rant</category><title>Exceptions -  they are what they say on the tin</title><description>... meant for handling the most exceptional of cases when you can't handle the problem yourself.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(TL;DR: Exceptions are evil. Never use them, if you can avoid them.)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Using exceptions in place of a return code is just as bad as trying to use return codes to handle exceptional cases...&lt;br /&gt;
&lt;br /&gt;
If I'm throwing an exception I would hope that some horrible dialog box like this would appear - its an emergency escape that saves me having to write a pile of code to carefully and &lt;i&gt;correctly&lt;/i&gt; cleanup the resources used by execution. Or to escape a situation where its not even possible to know what I should cleanup (without writing dedicated code... but actually the OS already has this information)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyBAJvVkHqUospuXDrtF5zac1GnK_1F9fJJuDTn7TksUDeM0m7T1YYtCJT6KZEhU-54rzRMLI5Mzu1Hg-934RCjB85j756vuCr4TGppM6sc2jHDjcR7dPcQqURb3ok7KnKYTxiswr8Pw/s1600/NotebookToolbarDebug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyBAJvVkHqUospuXDrtF5zac1GnK_1F9fJJuDTn7TksUDeM0m7T1YYtCJT6KZEhU-54rzRMLI5Mzu1Hg-934RCjB85j756vuCr4TGppM6sc2jHDjcR7dPcQqURb3ok7KnKYTxiswr8Pw/s1600/NotebookToolbarDebug.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
In practice I never throw an exception - any time where I would write 'throw' I should be handling the case properly because it is expected and not exceptional. In the genuine cases where I really do want to throw an exception the OS does it for me already. Its almost as if it was designed that way... so we can get indecipherable message boxes and Windows can deflect the blame from our shoddy code with its robust error handling mechanisms.&lt;br /&gt;
&lt;br /&gt;
I once took a look at the &lt;a href="http://www.parashift.com/c++-faq/exceptions-eliminate-ifs.html"&gt;C++ FAQ&lt;/a&gt; for 'guidance' - its the kind of FAQ entry that justifies the &lt;a href="http://yosefk.com/c++fqa/"&gt;FQA&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;b&gt;[17.1] What are some ways try / catch / throw can improve software quality?&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
By eliminating one of the reasons for if statements.&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
The commonly used alternative to try / catch / throw is to return a return code (sometimes called an error code) that the caller explicitly tests via some conditional statement such as if. For example, printf(), scanf() and malloc() work this way: the caller is supposed to test the return value to see if the function succeeded.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Although the return code technique is sometimes the most appropriate error handling technique, there are some nasty side effects to adding unnecessary if statements:&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;ul&gt;
&lt;li&gt;Degrade quality: It is well known that conditional statements are approximately ten times more likely to contain errors than any other kind of statement. So all other things being equal, if you can eliminate conditionals / conditional statements from your code, you will likely have more robust code.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Slow down time-to-market: Since conditional statements are branch points which are related to the number of test cases that are needed for white-box testing, unnecessary conditional statements increase the amount of time that needs to be devoted to testing. Basically if you don't exercise every branch point, there will be instructions in your code that will never have been executed under test conditions until they are seen by your users/customers. That's bad.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Increase development cost: Bug finding, bug fixing, and testing are all increased by unnecessary control flow complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
So compared to error reporting via return-codes and if, using try / catch / throw is likely to result in code that has fewer bugs, is less expensive to develop, and has faster time-to-market. Of course if your organization doesn't have any experiential knowledge of try / catch / throw, you might want to use it on a toy project first just to make sure you know what you're doing — you should always get used to a weapon on the firing range before you bring it to the front lines of a shooting war.&lt;/blockquote&gt;
Eliminating if statements? Seriously? So instead of an if statement we use an extremely difficult to master language feature with a heavy performance penalty? Maybe the &lt;a href="http://yosefk.com/c++fqa/exceptions.html"&gt;C++ FQA&lt;/a&gt; speaks more sense...&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
This is &lt;i&gt;cargo cult&lt;/i&gt; programming. Conditional statements are error-prone because they are used to handle complicated scenarios, where an action can result in many different outcomes, which affect the next actions. In order to make errors less probable, one has to simplify the model of the desired behavior of the software. The problem is the complexity that leads to if statements, not the if keyword, and &lt;b&gt;using different keywords is not going to solve the problem by itself&lt;/b&gt;.&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Exceptions are supposed to simplify the error handling model &lt;b&gt;based on the assumption that in most cases, a function that detected an error can't handle it, and has to propagate it to the caller&lt;/b&gt;. Finally, a "high-level" enough caller is reached and actually makes a decision (pops up an error message, tries a different action, etc.).&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Despite its promises, this approach has inherent problems. There's a "social" problem - with exceptions, people are not aware of the different errors that may happen in the code because most of the code doesn't deal with errors. And when people rarely think about a particular aspect of an application, ultimately this aspect is unlikely to be handled well. There's a more "technical" problem - functions essentially doing nothing upon error except for propagating errors to the caller still can't be completely unaware of errors. That's because they may need to release the resources they acquired before returning to the caller, which may lead tomore errors, which must also be handled. Finally, in practice &lt;b&gt;exception support has run-time overhead, and very significant code size overhead, even if exceptions are never raised at run time, and even if they are not mentioned in your code. C++ devotees may claim otherwise; you can check by compiling your code with and without exception support&lt;/b&gt; (if your compiler doesn't have such a flag, compile code as C and as C++ instead). This is unacceptable in resource-constrained systems.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
Still, in many cases, the benefits of exceptions are more important than their problems. For example, if your language manages memory automatically, the problem of releasing acquired resources becomes a small one (you only have to care about files, etc., which are a tiny part of the "resources" used by a program - most of the "resources" are memory). If your language throws exceptions when you violate its rules (for example, upon out-of-bounds array access), these exceptions will help you find lots of bugs, especially if you can get the call stack from an exception. If the purpose of an application is automated testing, and/or it's used as a quick-and-dirty internal tool as opposed to a product for an end user, this kind of exceptions is all you need to handle errors of almost all kinds. In some languages, you can even resume the execution from the point where the exception was raised after fixing the problem at the point where it was caught.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;b&gt;C++ exceptions offer none of these features. "Exception-safe" C++ code &lt;i&gt;can't handle errors&lt;/i&gt; which happen when it tries to release resources; "exception-unsafe" C++ code will leak resources, most frequently memory; and once you throw an exception, the call stack is &lt;i&gt;lost&lt;/i&gt;. &lt;/b&gt;This means that even separating your code to several processes and executing code like *(int*)0 = 0; upon error is a better way to handle errors than C++ exceptions: at least the memory is going to be reclaimed by the operating system, and you can typically have it save a snapshot of the process, so that you can open it in a debugger and see where the error happened. A recommendation to "ban" exceptions is probably over the edge, but think a lot before using C++ exceptions, or a feature that implicitly depends on them, such as &lt;i&gt;constructors&lt;/i&gt; and &lt;i&gt;overloaded operators&lt;/i&gt;, which have no other way to report an error. What C++ calls "exceptions" is as unlikely to give you the benefits people get from exceptions in other languages as what C++ calls "classes" is &lt;i&gt;unlikely&lt;/i&gt; to give you the benefits of OO.&lt;/blockquote&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGD0XgLLs8XdIWPr6L6bcxbfIR1i9XXOGbc2oiBpdavp9Hs5SmRXDJqgt2TViO22tmgZezJoIGc4KqaEsfN_msGWamoATd4_1jDGlauCpGywar_k3bVLa1HWntfJqdAYgP3G-BY0CdOYI/s1600/Exception+Message.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGD0XgLLs8XdIWPr6L6bcxbfIR1i9XXOGbc2oiBpdavp9Hs5SmRXDJqgt2TViO22tmgZezJoIGc4KqaEsfN_msGWamoATd4_1jDGlauCpGywar_k3bVLa1HWntfJqdAYgP3G-BY0CdOYI/s1600/Exception+Message.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 13px;"&gt;Visual Basic 6 was one of the 'mythical' languages where you could continue from an exception after fixing the bug&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
I disagree that exceptions are especially useful /ever/ beyond unexpected scenarios like writing to memory you didn't allocate... there is a lot of truth in here though, I will sum up.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Exceptions destroy your call stack&lt;/li&gt;
&lt;li&gt;Exceptions have a severe run-time penalty both in memory footprint and execution time&lt;/li&gt;
&lt;li&gt;Exceptions introduce the chance for subtle bugs, e.g. memory leaks because they break the 'locality of code' that is otherwise present when considering program flow&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
I would add:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Uncaught exceptions produce scary dialogs for the end user&lt;/li&gt;
&lt;li&gt;If you are catching a specific exception you are effectively abusing a goto like feature and producing a disgusting code structure to work with for all of the same reasons, with the added bonus that your code has to handle difficult to think of cases as well&lt;/li&gt;
&lt;li&gt;You replace the use of a standard, simple language feature (if-else, switch - branching) with something that breaks the standard notation for flow, is platform specific and hides a very complicated implementation (try, catch( ... ), finally, throw - stack unwinding, goto style jumping, CPU and OS specific implementations, behaviour which can vary based on the day of the week [well, very many arbitrary factors, many of which change constantly]). Its more than just syntactic sugar and keyword juggling...&lt;/li&gt;
&lt;li&gt;They are the only way to report errors from some functions - personally I think that these functions should never be failing - otherwise it probably shouldn't be a constructor, or overloaded operator - more so, you can use asserts and debug traces to report these errors in a much more useful fashion that doesn't destroy your call stack or obscure the original point of failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9YDBAhSQys6Zmh2qMc2XfPy-PmcZcUHdnOW6kzmBImDzIyPdFJLRYxJyzDulGgz5247Cc8J9rDbfH36748L2v1kp3ZPcgfKSxBtodTF0jfhTfJLN93KSaV00n11_nLXezjFUoOv-80Zs/s1600/exception-expanded.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9YDBAhSQys6Zmh2qMc2XfPy-PmcZcUHdnOW6kzmBImDzIyPdFJLRYxJyzDulGgz5247Cc8J9rDbfH36748L2v1kp3ZPcgfKSxBtodTF0jfhTfJLN93KSaV00n11_nLXezjFUoOv-80Zs/s1600/exception-expanded.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
To be honest though I have used them, here is the list of reasons why, and why all of these reasons are wrong or avoidable:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Detecting support for obscure instructions on Intel CPUs by catching the unrecognised instruction exception&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;This was a bad idea, I know better now - CPUID instructions are plenty good&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Because my workplace used them as their error handling mechanism&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;This was stupid but practical - I could have improved the code by replacing them. They wound up being used as for loops, do-while, switch statements and so-on.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Because MS force my hand with their terrible language extensions and runtime libraries.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Not much I can do about that... it amazes me that MS programmers can't do a better job than crap like C++/Cx, .NET or other hand tying contrivances that introduce more problems than they solve for me &lt;i&gt;because I wasn't bad enough at my job to have the 'original' problems&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
Exceptions are evil. Never use them, if you can avoid them.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO0lThLE55qmyA22QECk59q2hUwntFfDLvkuofEiVO0tG-7EXgJLKLHjrLc7AH0yUxUA2V6FEOlreURie-17gdm8-H6W9_QscPZ6dIwdhgAjVgoBt6ViTqyCT_KBp1ZJAyuBcpjHadrHM/s1600/bsod.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO0lThLE55qmyA22QECk59q2hUwntFfDLvkuofEiVO0tG-7EXgJLKLHjrLc7AH0yUxUA2V6FEOlreURie-17gdm8-H6W9_QscPZ6dIwdhgAjVgoBt6ViTqyCT_KBp1ZJAyuBcpjHadrHM/s1600/bsod.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
</description><link>http://jheriko-rtw.blogspot.com/2013/05/exceptions-they-are-what-they-say-on-tin.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyBAJvVkHqUospuXDrtF5zac1GnK_1F9fJJuDTn7TksUDeM0m7T1YYtCJT6KZEhU-54rzRMLI5Mzu1Hg-934RCjB85j756vuCr4TGppM6sc2jHDjcR7dPcQqURb3ok7KnKYTxiswr8Pw/s72-c/NotebookToolbarDebug.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-7581032853986841291</guid><pubDate>Wed, 24 Apr 2013 15:58:00 +0000</pubDate><atom:updated>2013-04-24T16:58:36.669+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">intel</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">raytracing</category><category domain="http://www.blogger.com/atom/ns#">rendering</category><category domain="http://www.blogger.com/atom/ns#">Star Chart</category><category domain="http://www.blogger.com/atom/ns#">work</category><title>Star Chart raytracing articles</title><description>Some articles in Intel Software Adrenaline:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://software.intel.com/sites/billboard/article/star-chart-developer-diary-part-1"&gt;http://software.intel.com/sites/billboard/article/star-chart-developer-diary-part-1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://software.intel.com/sites/billboard/article/star-chart-developer-diary-part-2"&gt;http://software.intel.com/sites/billboard/article/star-chart-developer-diary-part-2&lt;/a&gt;</description><link>http://jheriko-rtw.blogspot.com/2013/04/star-chart-raytracing-articles.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-6420390922150404354</guid><pubDate>Thu, 11 Apr 2013 16:23:00 +0000</pubDate><atom:updated>2013-04-11T17:23:14.172+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">games</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Radiant</category><category domain="http://www.blogger.com/atom/ns#">Tiled</category><category domain="http://www.blogger.com/atom/ns#">tools</category><title>The joy of other people's tools</title><description>I love pre-made tools, they have been saving me pointless programming effort for almost 15 years.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinhinJNwDjLrzYEsDsFIFIjzKaKRLlCBg7jjDdgs3fqlVZJ14G34yOnvRlz32HHuRyfDJ5lIs6xLrDVxu2IFtRJWWYzmOgcPd5AxdSx2Tfe84WHqWhyphenhyphenqb63GMxLi7E-6A1SaKU7Zw48eg/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinhinJNwDjLrzYEsDsFIFIjzKaKRLlCBg7jjDdgs3fqlVZJ14G34yOnvRlz32HHuRyfDJ5lIs6xLrDVxu2IFtRJWWYzmOgcPd5AxdSx2Tfe84WHqWhyphenhyphenqb63GMxLi7E-6A1SaKU7Zw48eg/s320/Untitled.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I recently discovered &lt;a href="http://www.mapeditor.org/"&gt;Tiled&lt;/a&gt;, which I think is going to become my &lt;a href="http://icculus.org/gtkradiant/"&gt;Radiant&lt;/a&gt; for 2D. It has some quirks and niggles, but look at it, its a beautiful tool - I'm not spending all the time making an inferior version so I can get a worse quality result... better to make one or two slightly distasteful, but well hidden fudges&amp;nbsp;than&amp;nbsp;write a whole tool.</description><link>http://jheriko-rtw.blogspot.com/2013/04/the-joy-of-other-peoples-tools.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinhinJNwDjLrzYEsDsFIFIjzKaKRLlCBg7jjDdgs3fqlVZJ14G34yOnvRlz32HHuRyfDJ5lIs6xLrDVxu2IFtRJWWYzmOgcPd5AxdSx2Tfe84WHqWhyphenhyphenqb63GMxLi7E-6A1SaKU7Zw48eg/s72-c/Untitled.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-7934622587517867140</guid><pubDate>Sat, 06 Apr 2013 16:56:00 +0000</pubDate><atom:updated>2013-04-06T17:56:00.760+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">browser</category><category domain="http://www.blogger.com/atom/ns#">Chrome</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">internet</category><category domain="http://www.blogger.com/atom/ns#">link</category><category domain="http://www.blogger.com/atom/ns#">UI</category><category domain="http://www.blogger.com/atom/ns#">web design</category><title>Dear Chrome and other broswers</title><description>If I click a link and hold down, can you please begin a selection instead of doing whatever currently happens.&lt;br /&gt;
&lt;br /&gt;
This is natural behaviour - it is not only how I have observed many users frustratedly trying to copy text - its something that with the knowledge that it will never work I still naturally try and do. The ability to drag the link away onto some other app is a feature that I never use. I constantly have to copy-paste text comprising or inside of a hyperlink. If you want to maintain the link dragging behaviour as well this is perfectly possible with a little thought and some sensible thresholds.&lt;br /&gt;
&lt;br /&gt;
Thank you.</description><link>http://jheriko-rtw.blogspot.com/2013/04/dear-chrome-and-other-broswers.html</link><author>noreply@blogger.com (Anonymous)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8845224290899123374.post-4528499194008575922</guid><pubDate>Sat, 06 Apr 2013 00:14:00 +0000</pubDate><atom:updated>2013-04-06T01:14:59.856+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Einstein notation</category><category domain="http://www.blogger.com/atom/ns#">maths</category><category domain="http://www.blogger.com/atom/ns#">matrix</category><category domain="http://www.blogger.com/atom/ns#">tensors</category><title>Tensors and Einstein notation vs. matrices...</title><description>&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I like to think that is 'common sense' that matrices are horrible things to work with. The first and last mathematical construct I have encountered where I can't derive the rules from first principles because they are fantastically 'non-obvious' and ambiguous. The thing that got me to remember matrix multiplication, how it works, and how to derive it meaningfully from scratch was learning about tensors and discovering Einstein notation.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Here is a matrix multiplication to prove my point - expanding the terms was too much of a chore for me to stomach so I use some ellipses to imply the continued expansion. The first line here is how we write this in Einstein notation. The second line is the traditional 'rows by columns' approach - or we can view it as an expansion of the first line.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjojDMjaagT28y6MhJl6Ewl_YsQJjYB6bHsGra8fMk1k2Xm4rdFgsnl0XeNyGSkrjbpSCUIdOHsZUn8Z0UeNyUAjgarbrNEn8Hou573O1yyZsLZP5dBcwRIGRLwFEvcgd8VIvBkiJg2Lc/s1600/matrix_dumbassery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjojDMjaagT28y6MhJl6Ewl_YsQJjYB6bHsGra8fMk1k2Xm4rdFgsnl0XeNyGSkrjbpSCUIdOHsZUn8Z0UeNyUAjgarbrNEn8Hou573O1yyZsLZP5dBcwRIGRLwFEvcgd8VIvBkiJg2Lc/s640/matrix_dumbassery.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Einstein notation translates well to computer programs, it is a&amp;nbsp;succinct&amp;nbsp;way of&amp;nbsp;inserting&amp;nbsp;for loops into mathematical expressions. When I write a generic n dimensional matrix multiply I use this approach in code - it reads well.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;for( int i = 0; i &amp;lt; d; ++i )
{
    for( int j = 0; j &amp;lt; d; ++j )
    {
        C[ i ][ j ] = 0;
        for( int k = 0; k &amp;lt; d; ++k )
        {
            C[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Instead of remembering matrix multiplication as 'rows by columns', 'columns by rows' or whatever the rule is I could never remember (because it has an exact dual you can follow with non-obvious consequences) I can remember instead to contract across the middle... its unambiguous and also enlightening about the deeper significance of transformation matrices.&lt;br /&gt;
&lt;br /&gt;
The fact that a matrix can carry out a transformation is often treated as a mathematical convenience. I've never been able to swallow this because I find matrices to be manifestly inconvenient. A little understanding about tensors, and about coordinate axes &lt;a href="http://jheriko-rtw.blogspot.com/2010/12/avoiding-full-matrix-inversion-for.html"&gt;as I have described before&lt;/a&gt;, removes all of the magic and mystery. I discovered not only that matrices really do hide the truth of what is happening, but that what really happens is easier to understand and calculate with - to the point where it explains transformation matrices and we can also develop a much deeper understanding of geometry, transformations and vectors in the most general cases...</description><link>http://jheriko-rtw.blogspot.com/2013/04/tensors-and-einstein-notation-vs.html</link><author>noreply@blogger.com (Anonymous)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjojDMjaagT28y6MhJl6Ewl_YsQJjYB6bHsGra8fMk1k2Xm4rdFgsnl0XeNyGSkrjbpSCUIdOHsZUn8Z0UeNyUAjgarbrNEn8Hou573O1yyZsLZP5dBcwRIGRLwFEvcgd8VIvBkiJg2Lc/s72-c/matrix_dumbassery.png" width="72"/><thr:total>0</thr:total></item></channel></rss>