<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tripleaxis.com</title>
	<atom:link href="http://blog.tripleaxis.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tripleaxis.com</link>
	<description>Personal portfolio and blog of Kim Holland - a London-based freelance Interactive Developer.</description>
	<lastBuildDate>Fri, 18 May 2012 15:08:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Webthinking Webshop Sales Monitor</title>
		<link>http://blog.tripleaxis.com/webthinking-webshop-sales-monitor/</link>
		<comments>http://blog.tripleaxis.com/webthinking-webshop-sales-monitor/#comments</comments>
		<pubDate>Fri, 18 May 2012 15:08:40 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=1307</guid>
		<description><![CDATA[Description This app provides a portable interface for a web-shop owner to login and quickly see recent orders, their values and statuses and get an overview of their shop&#8217;s performance. Recent orders can be filtered to show only orders of certain statuses or change the timespan for order age (e.g. today, this week, this month). [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fwebthinking-webshop-sales-monitor%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fwebthinking-webshop-sales-monitor%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div style="width:560px;"><a href="http://blog.tripleaxis.com/wp-content/uploads/splash.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/splash.jpg" alt="" title="splash" width="200" height="300" class="alignleft size-full wp-image-1317" align="left" style="margin-right:10px;"/></a></p>
<p style="color:#EFEFEF; font-size:14pt;margin-bottom:6px;">Description</p>
<p>This app provides a portable interface for a web-shop owner to login and quickly see recent orders, their values and statuses and get an overview of their shop&#8217;s performance. </p>
<p>Recent orders can be filtered to show only orders of certain statuses or change the timespan for order age (e.g. today, this week, this month). There is a sales summary screen that shows totals for the selected period and each order has a drill-down detail screen that shows more in-depth information.</p>
<p>In addition, a password change feature is available in case the shop owner feels they need to change their authentication information.</p>
<div style="clear:left;">
Screenshots:<br />
<a href="http://blog.tripleaxis.com/wp-content/uploads/login_screen.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/login_screen.jpg" alt="" title="login_screen" width="90" height="135" class="alignleft size-full wp-image-1315" /></a> <a href="http://blog.tripleaxis.com/wp-content/uploads/order_screen.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/order_screen.jpg" alt="" title="order_screen" width="90" height="135" class="alignleft size-full wp-image-1316" /></a> <a href="http://blog.tripleaxis.com/wp-content/uploads/filter_screen.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/filter_screen.jpg" alt="" title="filter_screen" width="90" height="135" class="alignleft size-full wp-image-1313" /></a> <a href="http://blog.tripleaxis.com/wp-content/uploads/date_filter.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/date_filter.jpg" alt="" title="date_filter" width="90" height="135" class="alignleft size-full wp-image-1312" /></a> <a href="http://blog.tripleaxis.com/wp-content/uploads/status_filter_screen.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/status_filter_screen.jpg" alt="" title="status_filter_screen" width="90" height="135" class="alignleft size-full wp-image-1318" /></a> <a href="http://blog.tripleaxis.com/wp-content/uploads/user_options.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/user_options.jpg" alt="" title="user_options" width="90" height="135" class="alignleft size-full wp-image-1319" /></a>
</div>
<p><br/></p>
<hr style="border-color:#333333;margin-top:0px;" height="1" />
<p style="color:#EFEFEF; font-size:14pt;margin-bottom:6px;">Development Process</p>
<p>A friend of mine operates a company that offers online-webshop software and hosting and we had discussed the possibility of an iPhone app in the past, but now I had the time to devote to a serious project, we spoke again and I knocked up a basic wireframe using <a href="http://www.balsamiq.com/products/mockups" title="Balsamiq Mockups" target="_blank">balsamiq</a>.</p>
<p><a href="http://blog.tripleaxis.com/wp-content/uploads/mockup.jpg" rel="lightbox[1307]"><img src="http://blog.tripleaxis.com/wp-content/uploads/mockup-570x437.jpg" alt="" title="mockup" width="570" height="437" class="alignleft size-medium wp-image-1443" /></a></p>
<p>Having agreed on the basic functionality, I created the core structure and views in storyboard (xcode 4.2) and then fleshed out the detail and polish in the classes themselves.</p>
<p>The nice thing about using the storyboards is the hybrid combination of wire-framing tool and WYSIWYG editor. You can not only design and edit the layouts of each view (although lots of functionality and design work is just not possible directly through the storyboard), you can also wire up transitions between different parts of the app.</p>
<p>The basic premise is a nice separation of code and design and if you keep things super simple, you can get away with defining your view and components in the storyboard and manipulating them with code in your associated UIViewController class.</p>
<p>For this app, there was a lot of subclassing and extending standard functionality as it seems that &#8211; similar to other frameworks &#8211; if you want to do anything that deviates from the standard implementation, things can get complicated. This was definitely the case when it came to seemingly simple tasks such as adding a background layer for an element in a view or changing the text colour for a title in some pages..</p>
<p>One larger issue that needed to be thought carefully about is connectivity. As the app relies on a working internet connection in order to retrieve information from the remote webservice, if there is no connection or connection is lost mid-session, then the app needed to manage these situations properly and inform the user as to the situation. I think this is one of the most challenging aspects of writing portable internet-enabled applications as your connection to the internet simply isn&#8217;t guaranteed and it isn&#8217;t enough to check up front as connection may be lost at any point during the user&#8217;s session.</p>
<hr style="border-color:#333333;margin-top:0px;" height="1" />
<p style="color:#EFEFEF; font-size:14pt;margin-bottom:6px;">Summary</p>
<p>All in all, this was a great learning experience &#8211; I even went back and created a separate storyboard for deployment on iPad. All the code remains the same &#8211; you just need a separate storyboard and that&#8217;s it! (and make sure you&#8217;re not hard-coding screen dimensions anywhere!)
</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/webthinking-webshop-sales-monitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Help your testers &#8211; adding build info to the right-click menu</title>
		<link>http://blog.tripleaxis.com/build-info-context-menu/</link>
		<comments>http://blog.tripleaxis.com/build-info-context-menu/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 10:59:42 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=1054</guid>
		<description><![CDATA[With larger scale projects and applications, bug and issue tracking is an important and often essential part of the development process. Without it, issues can be forgotten or smoothed over and the end product will suffer. It also provides options for issue prioritisation and the ability to perform phased releases, which gives a instant and [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fbuild-info-context-menu%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fbuild-info-context-menu%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>With larger scale projects and applications, bug and issue tracking is an important and often essential part of the development process.<br />
Without it, issues can be forgotten or smoothed over and the end product will suffer.<br />
It also provides options for issue prioritisation and the ability to perform phased releases, which gives a instant and clear view of exactly what issues are fixed and what are not in any single release.<br />
This can be invaluable when communicating with clients as it is easy to get an overview of progress (if development tasks are also itemised in the issue tracker) and whether any new features are feasible given the outstanding issues. It is also an absolute necessity when working alongside testers, who will need to know exactly what is fixed in the version they are testing..</p>
<p>This is all well and good as long as you know beyond a shadow of a doubt which version of the release you&#8217;re dealing with &#8211; the developer has built the correct code; the correct version is on the server; the tester/client/PM looking at the SWF has cleared their cache&#8230; </p>
<p>There are so many ways to fail here and the easiest way to avoid this is to add a build number to the right-click menu so that anyone can quickly see what version of the file they are looking at.<br />
<span id="more-1054"></span><br />
I&#8217;ve seen companies in the past that pass build version numbers into the flash via <a href="http://blog.tripleaxis.com/using-flashvars/" title="Using FlashVars" target="_blank">flashVars</a>, but all this really does is provide the version of the HTML file &#8211; <em>not</em> the version of the SWF file. I&#8217;ve actually seen a day or two of testing work wasted because the build number in the HTML had been incremented, but the new SWF had failed to copy across. The testers were under the impression that they were looking at the latest build and ended up marking all the issues as &#8220;not fixed&#8221;.</p>
<p>You&#8217;ll notice right-click build info around the web. It&#8217;s on <a href="http://www.youtube.com" target="_blank">YouTube</a>, <a href="http://www.bbc.co.uk/iplayer" target="_blank">iPlayer</a>, <a href="http://www.vimeo.com" target="_blank">Vimeo</a> and other large scale applications and I can imagine that on those applications, having baked-in version info is paramount.</p>
<hr/>
<p>Adding a right-click menu item is the easy bit:</p>

<div class="wp_codebox"><table><tr id="p10545"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1054code5"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">version</span>:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">&quot;1.0.0&quot;</span>;
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">menu</span>:<span style="color: #0066CC;">ContextMenu</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">ContextMenu</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">menu</span>.<span style="color: #0066CC;">hideBuiltInItems</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> item:<span style="color: #0066CC;">ContextMenuItem</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">ContextMenuItem</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;build: &quot;</span> + <span style="color: #0066CC;">version</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">menu</span>.<span style="color: #0066CC;">customItems</span>.<span style="color: #0066CC;">push</span><span style="color: #66cc66;">&#40;</span> item <span style="color: #66cc66;">&#41;</span>;
&nbsp;
root.<span style="color: #0066CC;">contextMenu</span> = <span style="color: #0066CC;">menu</span>;</pre></td></tr></table></div>

<p><br/><br />
The hard bit is actually getting a build number actually <em>hard coded</em> into the SWF and for this, the simplest method is to use an <a href="http://ant.apache.org" target="_blank">ANT</a> build file. All the main flash IDEs support ANT and although sometimes you may need to download extra packages in order to enable certain features, everything you need should be there already. If you need help getting an ANT build setup, then check this <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=anttasks_5.html" title="ANT Build Example" target="_blank">good example here</a>.</p>
<p>The idea is that you define a compiler option that will hold the build info and then use that in your code:</p>

<div class="wp_codebox"><table><tr id="p10546"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1054code6"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">public</span> <span style="color: #0066CC;">static</span> const BUILD_INFO:<span style="color: #0066CC;">String</span> = BUILD::INFO;
&nbsp;
<span style="color: #808080; font-style: italic;">//using the previous menu code //</span>
<span style="color: #000000; font-weight: bold;">var</span> item:<span style="color: #0066CC;">ContextMenuItem</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">ContextMenuItem</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;build: &quot;</span> + BUILD_INFO <span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>&#8230;and inside your ANT build file&#8217;s MXMLC task:</p>

<div class="wp_codebox"><table><tr id="p10547"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1054code7"><pre class="ant" style="font-family:monospace;">&lt;compiler.define name=&quot;BUILD::INFO&quot; value=&quot;'1.0.0'&quot; /&gt;</pre></td></tr></table></div>

<p><strong>Note:</strong> <em>the value must be quote delimited or it will fail..</em></p>
<hr/>
<p>The last part is to increment the build info automatically and the simplest way to do that is to hook into your source control system (SVN/GIT).<br />
Getting the latest revision number from your source control is relatively easy and there is even a dedicated ANT package for working with SVN &#8211; <a href="http://subclipse.tigris.org/svnant.html" target="_blank">SVNANT</a>. The idea is to simply execute your source control executable and parse the info given.</p>
<p><em><strong>Note:</strong> your executable must be available to run from your ANT file&#8217;s location.</em></p>
<p>I only have GIT installed on my machine at the moment, so will use that as an example. With GIT, the best practise is to <em><a href="http://schacon.github.com/git/user-manual.html#creating-tags" target="_blank" title="Tagging with GIT">tag</a></em> releases as you go in order to update the build. You can then use <em><a href="http://schacon.github.com/git/git-describe.html" target="_blank">describe</a></em> to pull out the latest tag.</p>

<div class="wp_codebox"><table><tr id="p10548"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p1054code8"><pre class="ant" style="font-family:monospace;">&lt;target name=&quot;getGitRevision&quot;&gt;
    &lt;exec executable=&quot;git&quot; outputproperty=&quot;buildInfo&quot;&gt;
        &lt;arg value=&quot;describe&quot;/&gt;
        &lt;arg value=&quot;--tags&quot;/&gt;
        &lt;arg value=&quot;--always&quot;/&gt;
        &lt;arg value=&quot;HEAD&quot;/&gt;
    &lt;/exec&gt;
&lt;/target&gt;
&nbsp;
/* ..and inside your mxmlc task.. */
&lt;compiler.define name=&quot;BUILD::INFO&quot; value=&quot;'${buildInfo}'&quot; /&gt;</pre></td></tr></table></div>

<p>Make sure the target that contains your MXMLC task &#8216;<a href="http://ant.apache.org/manual/targets.html" title="Target depends" target="_blank">depends</a>&#8216; on the <code>getGitRevision</code> task as any targets defined in the &#8216;depends&#8217; param will be executed before running the current target.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/build-info-context-menu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Focusing flash and trapping browser keyboard input</title>
		<link>http://blog.tripleaxis.com/focusing-flash-and-trapping-browser-keyboard-input/</link>
		<comments>http://blog.tripleaxis.com/focusing-flash-and-trapping-browser-keyboard-input/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 16:55:53 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Tutorials]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=1040</guid>
		<description><![CDATA[A recent flex project I have been working on requires users to log-in using a given username and password combination via a form in order to access a non-public CMS. When the app first loads, the user is presented with a flash login form, in which we have pre-focused the username field. Natural user response [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Ffocusing-flash-and-trapping-browser-keyboard-input%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Ffocusing-flash-and-trapping-browser-keyboard-input%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<style>
#content img { padding: 10px 24px 0px 0px; }
#content ul  { list-style-type:circle; }
#content ul li { line-height: 17px; padding-bottom: 20px; }
</style>
<p>A recent flex project I have been working on requires users to log-in using a given username and password combination via a form in order to access a non-public CMS. When the app first loads, the user is presented with a flash login form, in which we have pre-focused the username field.<br />
Natural user response when faced with a focused text field is to just start typing away and expect full keyboard control over the form.</p>
<p>This does not happen with flash <img src='http://blog.tripleaxis.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> </p>
<p>Usually if you want to give focus to an HTML element, you just call the <code>focus()</code> method directly on the object, but not all browsers support this &#8211; in fact Chrome and Safari will ignore focus requests. (<a href="http://www.webappsolution.com/wordpress/2010/08/31/set-flex-to-focus-on-application-load/" title="Set flex to focus on application load" target="_blank">more info here</a>)</p>
<p>To solve this issue, I setup a keyboard proxy javascript class that acts as a fallback in case the auto focusing doesn&#8217;t operate correctly.<br />
The logic flow is as follows:<br />
<img src="http://blog.tripleaxis.com/wp-content/uploads/KeyboardProxyFlow.jpg" alt="" title="KeyboardProxyFlow" width="250" height="493" align="left"/></p>
<ul>
<li>The first thing we do it set up a flag in the Flex App that is activated when the flash receives focus and the <code>StageEnter</code> event.</li>
<li>When the Flex is loaded and ready, it attempts to draw focus to itself via <code>ExternalInterface</code>.</li>
<li>The app then waits a tenth of a second and checks to see if the focus flag has been activated.<br />
If so, then flash has keyboard focus ok, so we should leave well alone!</li>
<li>If not, then activate the KeyboardProxy so that all keyboard input is trapped by the browser and piped into the flash app.</li>
<li>Finally, whenever the user clicks and focuses the app, our StageEnter event will fire and automatically disable the KeyboardProxy</li>
</ul>
<p><br clear="left" /></p>
<p>Within the KeyboardProxy javascript class, we simply trap keyboard input and pipe it directly into the Flex. Using <code>ExternalInterface</code>, we can expose a method to javascript and use it to send key information into flash and reproduce native Keyboard Events.</p>
<p><strong>Actionscript Class:</strong></p>

<div class="wp_codebox"><table><tr id="p104011"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p1040code11"><pre class="actionscript" style="font-family:monospace;">package com.<span style="color: #006600;">tripleaxis</span>.<span style="color: #006600;">util</span>
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">KeyboardEvent</span>;
  <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">external</span>.<span style="color: #006600;">ExternalInterface</span>;
&nbsp;
  <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BrowserKeyboardProxy
  <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> _enabled:<span style="color: #0066CC;">Boolean</span>;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> BrowserKeyboardProxy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0066CC;">enabled</span> = ExternalInterface.<span style="color: #006600;">available</span>;
      <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span><span style="color: #0066CC;">enabled</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>;
&nbsp;
      ExternalInterface.<span style="color: #006600;">addCallback</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;onKeyPress&quot;</span>,onKeyPress <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onKeyPress<span style="color: #66cc66;">&#40;</span> code:uint <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span>_enabled <span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span>;
      dispatch<span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> KeyboardEvent<span style="color: #66cc66;">&#40;</span> KeyboardEvent.<span style="color: #006600;">KEY_UP</span>,<span style="color: #000000; font-weight: bold;">false</span>,<span style="color: #000000; font-weight: bold;">false</span>,code,code <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">enabled</span><span style="color: #66cc66;">&#40;</span> v:<span style="color: #0066CC;">Boolean</span> <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
    <span style="color: #66cc66;">&#123;</span>
      _enabled = v;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">enabled</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">Boolean</span>
    <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">return</span> _enabled;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p><strong>Javascript Class:</strong></p>

<div class="wp_codebox"><table><tr id="p104012"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
</pre></td><td class="code" id="p1040code12"><pre class="javascript" style="font-family:monospace;">KeyboardProxy <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> validCharRegex	<span style="color: #339933;">=</span> <span style="color: #009966; font-style: italic;">/[\w@]/i</span><span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> validFunctionKeys <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span><span style="color: #CC0000;">9</span><span style="color: #339933;">,</span><span style="color: #CC0000;">13</span><span style="color: #339933;">,</span><span style="color: #CC0000;">37</span><span style="color: #339933;">,</span><span style="color: #CC0000;">39</span><span style="color: #339933;">,</span><span style="color: #CC0000;">46</span><span style="color: #339933;">,</span><span style="color: #CC0000;">190</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Setup keyboardProxy //</span>
  <span style="color: #003366; font-weight: bold;">var</span> keyHandler <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> evt <span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> code <span style="color: #339933;">=</span> evt.<span style="color: #660066;">keyCode</span> <span style="color: #339933;">||</span> evt.<span style="color: #660066;">which</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//console.log( evt.type + &quot;,&quot; + evt.keyCode + &quot;,&quot; + evt.which + &quot;: &quot; + String.fromCharCode( code ) );</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Filter out any unwanted keypresses //</span>
    <span style="color: #000066; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span> evt.<span style="color: #660066;">type</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// Use keypress to capture word chars as it is case specific //</span>
	<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">&quot;keypress&quot;</span><span style="color: #339933;">:</span>
    	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span> code <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span> validCharRegex <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> code <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// Capture delete,tab,enter,left arrow,right arrow,tab keys and dot (.) key //</span>
	<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">&quot;keydown&quot;</span><span style="color: #339933;">:</span>
	    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> validFunctionKeys.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span> code <span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span> <span style="color: #009900;">&#41;</span> code <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// Ignore keyup //</span>
	<span style="color: #000066; font-weight: bold;">case</span> <span style="color: #3366CC;">&quot;keyup&quot;</span><span style="color: #339933;">:</span> 
	    code <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	    <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Pass key data to flash //</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> code <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'flashContent'</span> <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onKeyPress</span><span style="color: #009900;">&#40;</span> code <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Prevent event bubbling to browser of function keys //</span>
    <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> validFunctionKeys.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span> code <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        evt.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	evt.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #006600; font-style: italic;">// Use closure to keep core methods and properties private //</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    active<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
&nbsp;
    init<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">//console.log( '_SM_KeyboardProxy::init' );</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keyup</span><span style="color: #009900;">&#40;</span> keyHandler <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keydown</span><span style="color: #009900;">&#40;</span> keyHandler <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keypress</span><span style="color: #009900;">&#40;</span> keyHandler <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	active <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    destroy<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">//console.log( '_SM_KeyboardProxy::destroy()' );</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">unbind</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'keyup'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">unbind</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'keydown'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span> document <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">unbind</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'keypress'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	active <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>..and that&#8217;s about it. All I needed to do from here is add instantiate the <code>BrowserKeyboardProxy</code> class and add a listener for <code>KeyboardEvents</code> coming from it. The event carried the <code>KeyCode</code>, which was translated into a character using <code>String.fromCharCode()</code> and then injected into the input text field.</p>
<p><em><strong>One thing to watch is if the proxy isn&#8217;t disabled when the flash actually gains focus, you&#8217;ll get duplicated keyboard input and undesirable effects.</strong></em></p>
<p>Add a little finesse when dealing with backspace, delete, arrow and tab keys and the user won&#8217;t ever notice the difference! <img src='http://blog.tripleaxis.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/focusing-flash-and-trapping-browser-keyboard-input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery .stop()</title>
		<link>http://blog.tripleaxis.com/jquery-stop/</link>
		<comments>http://blog.tripleaxis.com/jquery-stop/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 15:58:05 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=1042</guid>
		<description><![CDATA[Adding effects and animations to HTML using jQuery can add a lot of class to a page. It can also help with functionality and UX. Too many times, however, I see a site that has this on it.. Rollover Me &#8230; which is fine &#8211; until you repeat the action many times. Try moving your [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fjquery-stop%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fjquery-stop%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Adding effects and animations to HTML using jQuery can add a lot of class to a page. It can also help with functionality and UX.</p>
<p>Too many times, however, I see a site that has this on it.. </p>
<style>
code
{
  color: #FFF;
  font-size: 8pt;
}
.jquery_test
{
  font-size: 14pt;
  background-color:#992300;
  width:50px;
  height:30px;
  color:black;
  text-align:center;
  position:relative;
}
.jquery_test.notfixed { width:120px; }
.jquery_test.fixed { width: 260px; }
</style>
<div class="jquery_test notfixed">Rollover Me</div>
<p><script language="javascript" type="text/javascript">
    jQuery('.jquery_test.notfixed').mouseover( function(){ jQuery('.jquery_test.notfixed').animate( { width:300 } ); } );
    jQuery('.jquery_test.notfixed').mouseout( function(){ jQuery('.jquery_test.notfixed').animate( {width:120 } ); } );
</script></p>
<p>&#8230; which is fine &#8211; until you repeat the action many times.<br />
Try moving your mouse on and off the above box several times quickly. What you&#8217;ll notice is that the animations are trigged again and again and instead of overwriting the last one, they all end up getting queued, which leaves the page animating away on its own without any way of stopping it.</p>
<p>This is crap and is so easy to fix just by using the <code>jQuery.stop()</code> chained method.</p>
<p>Instead of using <code>$( '.my_element' ).animate( {width:300} );</code> just add a <code>stop()</code> in there, so it reads:<br />
<code>$( '.my_element' ).stop().animate( {width:300} );</code></p>
<div class="jquery_test fixed" id="fixed">I don&#8217;t queue my animations!</div>
<p><script language="javascript" type="text/javascript">
    jQuery('.jquery_test.fixed').mouseover( function(){ jQuery('.jquery_test.fixed').stop().animate( { width:400 } ); } );
    jQuery('.jquery_test.fixed').mouseout( function(){ jQuery('.jquery_test.fixed').stop().animate( {width:260 } ); } );
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/jquery-stop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RegExp Snippets</title>
		<link>http://blog.tripleaxis.com/regexp-snippets/</link>
		<comments>http://blog.tripleaxis.com/regexp-snippets/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 14:20:10 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=1045</guid>
		<description><![CDATA[Just a quick note-to-self&#8230; Find all non-commented trace statements: &#94;&#40;&#63;&#60;&#33;&#92;&#47;&#92;&#47;&#41;&#91;&#92;&#115;&#93;&#42;&#116;&#114;&#97;&#99;&#101;&#92;&#40; Inject GET param onto end of a URL and preserve any existing params. (must have file extension): myURL.replace( /&#40;&#63;&#60;&#61;&#92;&#46;&#92;&#119;&#123;&#51;&#125;&#41;&#92;&#63;&#63;&#40;&#46;&#42;&#41;&#36;/i, '?d=' + new Date().time + '&#038;$1' );]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fregexp-snippets%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fregexp-snippets%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Just a quick note-to-self&#8230;</p>
<p>Find all non-commented trace statements:<br />
<code>&#94;&#40;&#63;&#60;&#33;&#92;&#47;&#92;&#47;&#41;&#91;&#92;&#115;&#93;&#42;&#116;&#114;&#97;&#99;&#101;&#92;&#40;</code></p>
<p>Inject GET param onto end of a URL and preserve any existing params. (must have file extension):<br />
<code>myURL.replace( /&#40;&#63;&#60;&#61;&#92;&#46;&#92;&#119;&#123;&#51;&#125;&#41;&#92;&#63;&#63;&#40;&#46;&#42;&#41;&#36;/i, '?d=' + new Date().time + '&#038;$1' );</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/regexp-snippets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr Badge Reload</title>
		<link>http://blog.tripleaxis.com/flickr-badge-reload/</link>
		<comments>http://blog.tripleaxis.com/flickr-badge-reload/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 19:45:26 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=783</guid>
		<description><![CDATA[Back from hols and with no work on hand, it takes a little over two days before the code gland starts twitching again and I launch into a personal or learning project. This time it was Flex4. I&#8217;ve been meaning to get my head into the Flex framework for a while now, but working fulltime [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fflickr-badge-reload%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fflickr-badge-reload%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Back from hols and with no work on hand, it takes a little over two days before the code gland starts twitching again and I launch into a personal or learning project.</p>
<p>This time it was Flex4. I&#8217;ve been meaning to get my head into the Flex framework for a while now, but working fulltime often drains much of your will to code outside the office and while following the industry is simple enough with Twitter and feeds, actually getting your hands dirty with new tech is more difficult.</p>
<p>Anyway &#8211; not long back from my travels, and having just uploaded a ton of photos up to Flickr, I thought I&#8217;d rewrite my Flickr Badge in Flex and add a few more features.. Pretty simple really &#8211; the only downside I really had was the filesize &#8211; which has always been my main contention with Flex.</p>
<p>As for feature upgrades, I added social network sharing links and a google map component so you can see the location where the photo was taken. The map feature relies on you having previously geo-tagged the item in flickr, but fails gracefully should there be no stored geo-data.<br />
Also added a <a target="_blank" href="http://en.wikipedia.org/wiki/Ken_Burns_effect">Ken Burns effect</a> because EVERYONE LOVES THE KEN BURNS EFFECT! </p>
<p>..it also refreshes your photos and makes it easy to while away the time looking at pics you&#8217;ve seen a hundred times already <img src='http://blog.tripleaxis.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As my <a target="_blank" href="http://www.erik-rasmussen.com/blog/2006/09/14/flash-flickr-badge-widget-for-wordpress/">previous Flickr Badge</a> was a WordPress widget, I did the same for mine, making it configurable via the WordPress admin area.</p>
<p>The plugin should be visible further down this page on the right side bar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/flickr-badge-reload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free Blackberry Playbook</title>
		<link>http://blog.tripleaxis.com/free-blackberry-playbook/</link>
		<comments>http://blog.tripleaxis.com/free-blackberry-playbook/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 13:42:46 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=760</guid>
		<description><![CDATA[Had heard about this one from the flash community and admittedly only had had the slightest interest&#8230; that is until they announced that every developer who gets an app approved and in the Blackberry App Store before the release of the device (US release scheduled for 15th March) gets a free device. As embarrassingly mercenary [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Ffree-blackberry-playbook%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Ffree-blackberry-playbook%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Had heard about this one from the flash community and admittedly only had had the slightest interest&#8230; that is until they announced that <a href="http://us.blackberry.com/developers/tablet/playbook_offer.jsp" target="_blank" title="Free Playbook offer -&gt;">every developer who gets an app approved</a> and in the Blackberry App Store before the release of the device (US release scheduled for 15th March) gets a free device.</p>
<p>As embarrassingly mercenary as it may sound, I suddenly felt the need to develop an app for the Playbook <img src='http://blog.tripleaxis.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="https://appworld.blackberry.com/webstore/content/28170/" target="_blank"><img src="http://blog.tripleaxis.com/wp-content/uploads/2011/03/AppWorld-Screenshot1-300x300.jpg" alt="" title="Morse Tapper - now on the BlackBerry App Store -&gt;" width="115"  class="alignleft size-medium wp-image-765" /></a></p>
<p>It&#8217;s just a basic idea that I&#8217;ve been knocking around since I saw <a href="http://www.imdb.com/title/tt0876563/" target="_blank" title="Ponyo on IMDB -&gt;">Ponyo</a>, it&#8217;s just a Morse Code translator/practise app, allowing the user to either have typed text translated on-the-fly or just tap the screen in order to practise Morse Code input. For newcomers to Morse Code, I included a help screen, with a Morse Code dictionary to learn from.</p>
<p>Insanely simple for existing flash developers, the most difficult part of the process was the paperwork and signing the application. They&#8217;ve even provided an Eclipse plugin for developing and a device simulator for testing. Blackberry seem to have realised the cold hard fact that products like these rely heavily on the software available. Similar to the way game dictate (to a degree) which console is most popular, a touchscreen device is really only the transparent workings behind the software that the user interfaces with. All in all, they&#8217;ve put a lot of work into making it easy for the huge community of flash developers get building content for their device all ready for release. If it costs them a few hundred devices, then it&#8217;s probably a wise investment.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/free-blackberry-playbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lot62</title>
		<link>http://blog.tripleaxis.com/lot62/</link>
		<comments>http://blog.tripleaxis.com/lot62/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 17:06:46 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=725</guid>
		<description><![CDATA[Well I&#8217;ve finally done it.. I&#8217;ve gone limited. Kinda threatened to go limited several times in the past, but never it always seemed to be risky as I never knew if I&#8217;d stay freelance for any decent length of time. Now, with 2yrs freelance under my belt and starting to work on independent, mobile applications/games, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Flot62%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Flot62%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Well I&#8217;ve finally done it.. I&#8217;ve gone limited. Kinda threatened to go limited several times in the past, but never it always seemed to be risky as I never knew if I&#8217;d stay freelance for any decent length of time.</p>
<p>Now, with 2yrs freelance under my belt and starting to work on independent, mobile applications/games, there&#8217;s more call for me to have a business through which I work and release products. It just makes sense now.</p>
<p>The name came from the house my dad had build when he was living in Australia. My parents bought a plot of land (Lot62) in Darlington, Perth, WA and set about making a home there. Seems apt to have a name that represents building something and creating an entity with your own hands&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/lot62/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blighty</title>
		<link>http://blog.tripleaxis.com/blighty/</link>
		<comments>http://blog.tripleaxis.com/blighty/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 10:25:25 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/index.php/archives/710</guid>
		<description><![CDATA[Well we&#8217;re back now, tans have faded and normal daily life has snuck back in. We stayed on AoNang beach for the last week of our trip, spending our time just milling about in the shops and on the beach, eating, drinking coffee and singing along to the Snake Show truck as it passed again [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fblighty%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fblighty%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Well we&#8217;re back now, tans have faded and normal daily life has snuck back in.</p>
<p>We stayed on AoNang beach for the last week of our trip, spending our time just milling about in the shops and on the beach, eating, drinking coffee and singing along to the Snake Show truck as it passed again and again.</p>
<p>We took a couple of day trips that week too &#8211; one was an island hopper, visiting PhiPhi, Monkey Island, Viking Cave and Bamboo Island, with lots of snorkelling with fishes in the clear, shallow water. The other was elephant trekking, the Emerald pool and the natural hot springs, which was one of the highlights of the whole trip for me.</p>
<p>Emma got bitten by monstrous, beastly things &#8211; judging by the bite marks they left and I got sunburned again &#8211; this time twice across my chest over two days, one layer of burn over another&#8230; I ended up with a kind of prickly heat thing going on for our last night there, meaning I only managed to sleep in short bursts, draped in a cold, wet towel to stop the fiery pins and needles across my chest and shoulders.</p>
<p>Flying to KL straight from Krabi, we met up with Michal again at the gate for the London flight in KL airport and he told us about the Vietnamese girl he&#8217;d met, how he&#8217;d flown back out there and spent another week with her and how he was going to fly back out in a couple of weeks to see her again as she was definitely the girl he was going to marry&#8230;</p>
<p>None of us really wanted to go home. We were travel weary and missing the creature comforts and personal space of home, but also wanted this next flight to take us somewhere new and not be our last. </p>
<p>We got off the plane in London nearing 5 am and got the thankfully pre-rush hour tube back home, finishing the journey and our trip back home, feeling out of place and knowing the next trip probably won&#8217;t be too far away.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/blighty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Land That Soap Forgot</title>
		<link>http://blog.tripleaxis.com/the-land-that-soap-forgot/</link>
		<comments>http://blog.tripleaxis.com/the-land-that-soap-forgot/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 09:58:08 +0000</pubDate>
		<dc:creator>Kim</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://blog.tripleaxis.com/?p=708</guid>
		<description><![CDATA[The ferry pier in Phuket was crowded when we got there &#8211; lots of twenty-somethings, waiting for the boat to Phi-Phi and two weeks of alcohol and sunburn punctuated hangovers. Our taxi driver, who had been worryingly following us through the crowds after having dropped us at the pier, now turned out to be a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.tripleaxis.com%2Fthe-land-that-soap-forgot%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.tripleaxis.com%2Fthe-land-that-soap-forgot%2F&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>The ferry pier in Phuket was crowded when we got there &#8211; lots of twenty-somethings, waiting for the boat to Phi-Phi and two weeks of alcohol and sunburn punctuated hangovers. Our taxi driver, who had been worryingly following us through the crowds after having dropped us at the pier, now turned out to be a freelance tour operator and we managed to barter two tickets direct to Railay Bay for 300 baht under the going rate. He left and we immediately hot-footed it to the nearest ticket desk to check the authenticity of the tickets we&#8217;d just bought. They were fine and we grabbed a couple of chairs and laxed out for a couple of hours until our boat was ready.</p>
<p>Placid and sunny for our trip over &#8211; it took a couple of hours or so to make it to Krabi and we sat with our feet over the side of the boat, watching the occasional long-tail or island go slowly past and just loving the feel of the sun on us and the sense of space around us.</p>
<p>We transferred to a speed boat at Krabi as Railay was only just around the headland &#8211; a short trip, but when we got there, it was gorgeous. It was a great, sunny day, so everything looked even better, but as we hopped out into the shallows, there were shoals of tiny fish here and there in the crystal blue water. Groups of long-tail boats were lined up along the beach, coloured cloths and Thai writing on their bows and beyond them, the comparatively pale Europeans bobbing around in the water. The beach at Patong had been pretty nice &#8211; smooth sand and clear, warm water &#8211; a very welcoming first Thai beach experience for the trip, but in Patong, the beach was crowded to capacity &#8211; sun loungers and jet-ski touts, there was even a cordoned off area containing inflatables that you could muck about on for 200 baht. This, however was not oversaturated &#8211; there was a fair amount of people, but none of the claustrophobic, package holiday feel. This was a place to relax.<br />
<span id="more-708"></span><br />
This wasn&#8217;t where our hotel was, though.. We transferred yet again to a long-tail, clambering in out of the water, flip-flops and backpacks in hand and headed back out across the bay to the other side.</p>
<p>Not quite a nice landing this time.. the majority of the beach was rocky and muddy, leaving us picking our way to dry land very carefully through sharp rocks and squelchy mud and feeling like when you board a plane and have to walk past all the premium seats before passing that curtain into cattle class and your own, constricting chair. Tired and (personally) with still a little left to recover from the craziness of Phuket, we just clambered into the nearest restaurant and grabbed some food and cold drinks.. The beach there was pure shipwreck style. There was only a handful of businesses along the beach &#8211; most featuring a dreadlocked white guy or girl, practising with poi. I took a wander up to find where we were staying and, having checked in ok, ended up on a benched sidecar contraption that was attached to a moped, being driven back towards Emma and our bags. The road back barely qualified as one &#8211; pot-holes and rain-worn trenches everywhere. It wove back away from the beach into thick jungle, passing hippie encampments on either side &#8211; the sounds of hair braiding, tie-dying and juggling filtering through the palms and ferns, causing shivers to run up and down my spine. Occasionally you could see a dream-catcher strung up through the trees and I could imagine the soap-dodging bastards, prancing like dicks round midnight fires, celebrating their sustained unemployment to a chorus of indian hand drums.</p>
<p>We dumped the bags on the moped-thingy and walked back up the beach.. I simply couldn&#8217;t face the return journey through the land that soap forgot, although we did get to ride the contraption again as we got ferried up to our villa on it.. I wouldn&#8217;t say the place was terrible, but I didn&#8217;t exactly get that reassured, luxury feeling as the guy unlocked the padlock on the sliding doors and led us in to show us the room whilst a large cockroach sat on the floor next to the bathroom door. After he&#8217;d gone, we &#8216;dealt&#8217; with the cockroach, discovered and blocked the gaping hole in the shower room floor where the bugger&#8217;d crawled up  from and found one of our towels had a huge rip in it. We were paying a fair whack for the room as when you get to the islands there&#8217;s limited space and the hotels tend to charge whatever they like, but this was pretty awful. Poor Emma, found a pretty chunky spider on an early morning toilet trip that I had to get up and eliminate &#8211; to be honest, I took a peek at the dirty hairy bugger the next day and it would&#8217;ve had me hopping around a bit had I come across it sleepily at 3am!</p>
<p>Still, we decided to just get on with it and that first night, we wandered down to the beach, grabbed a meal and then headed over to drink a couple of beers up on a platform in front of the sea. The whole place was lit up, with small paraffin burners on low tables and made for a nice, chilled end to a hectic day.</p>
<p>Tonsai coming up very short compared with Railay, we headed out to catch a long-tail over the other side of the bay &#8211; the nice side. Unfortunately, though, the long-tail pilots only wanted to go with a minimum number of passengers, so we had to wait until more people turned up, wanting to get to Railay. Seemingly, not a place many people wanted to get to, so after waiting for a while, we asked some people about the possibility of a path round the headland to Railay and set off down the beach toward it.</p>
<p>Turns out there was a bit of a climb involved and although  our flip-flops weren&#8217;t exactly idea footwear, we clambered up and over the thing, sweating away and taking it step by step in parts, but finally making it and emerging onto the &#8216;nice&#8217; beach feeling as though we&#8217;d snuck into a restricted area and were going to be found out at any minute.</p>
<p>The beach at Railay is thousands of times better than Tonsai. The people too &#8211; we sat for our hotel&#8217;s thrown together buffet breakfast on Tonsai and were galled to see two girls &#8211; well women really &#8211; at the table next to ours, industriously weaving friendship bracelets. This is the behaviour of eighteen-yr-olds, not grown adults! It was like a their own little Glastonbury in the middle of Thailand. Dirty hippie bastards&#8230;</p>
<p>We spent the day on Railay just wandering about and looking for better hotels than what we were suffering on Tonsai. The first place we walked into threw a £700 per night rate at us and we kinda just ran away, clutching our wallets. We ended up booking into a reasonably expensive place for a couple of nights, but by that time I think we just deserved a bit of comfort to even things out a little.<br />
In the afternoon, we&#8217;d just about managed a quick swim when the heavens opened and the sky took an almighty piss on us, forcing us back to the hotel we&#8217;d made the booking in for shelter and honestly one of the best steak sandwiches I&#8217;ve ever eaten. We sat and dried out, waiting for the rain to stop before heading back to Tonsai. The tide was low this time, so we could avoid the hairy climbing route and instead picked our way across the sharp rocks, avoiding the scuttling crabs that zipped around between them.</p>
<p>Back in the room I wasn&#8217;t feeling right and ended up with a bit of a fever that night &#8211; yet another symptom of my hippie allergy most likely.. We checked ourselves out early and got ourselves over to Railey &#8211; this time making damned sure we waited for a long-tail as neither of us had the energy or enthusiasm for the previous day&#8217;s route. We got to our hotel and were shown to our room. This time we were welcomed with a nice glass of chilled juice and we noticed my name on the &#8216;welcome new guests&#8217; board &#8211; what a difference! The room/villa was nice and cosy but spacious &#8211; a huge four poster ben and an outside shower. Thank fuck for that!</p>
<p>It rained once more in the afternoon of the next day &#8211; again interrupting our beach and swim time, but it was great to be able to duck back into the villa quickly instead of being marooned, sopping, away from a hot shower and dry clothes. Also, as we were in the nice resort for a bit, we took full advantage of the facilities and got massages and a steam sesson in the hotel&#8217;s spa &#8211; well worth it as my shoulder had been really playing up and giving me grief. A little pampering never hurt anyone..</p>
<p>Just to undo all the good work of the massage, I popped out in the morning to go investigate the lagoon climb. Emma had tried it a little on her last visit and not made it up the first bit as it was slippery and steep as hell and she&#8217;d been wearing flip-flops &#8211; not ideal for climbing really. We&#8217;d walked past it on our way to the beach and I couldn&#8217;t resist having a crack at it <img src='http://blog.tripleaxis.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>It was muddy and everything was covered by this red, clay-type mud. There were tree roots and branches all over the place, so no real problems with hand and foot holds and they&#8217;d even attached a load of thick, knotted ropes around the place to make things even easier. The roots and ropes were also covered in the clay stuff, so as soon as you got a sweat up things started getting slippery in your hands as well as under your feet. Still &#8211; always easier going up than down and I nipped up the first section reasonably easily.<br />
Once at the top, it turned into thick forest, with a couple of paths heading off. I chose one and ended up at the viewpoint. Now usually in Europe, when you get any where public that&#8217;s high and even remotely perilous, you&#8217;ll get cordoned off areas, barriers and sometimes even attendants. Not in fucking Thailand, believe me! The trail ended through a couple of bushes and plunged straight down the cliff face a good 200ft. No ropes, no barriers &#8211; not even a bloody sign to warn you. I&#8217;m honestly surprised there&#8217;s not a steady stream of lemming-style deaths up there.<br />
After realising that I was pouring sweat in a thick foresty area with no deet on, I got moving again and headed towards the lagoon. There was another trail heading away from the viewpoint that I tried first, but it ended in a vertical climb up sharp rocks to God knows where, so I opted to leave that for the pros. The route to the lagoon wasn&#8217;t terribly different, though.. The sharp rocks were replaced with rounded, slippery ones, so it was all much of a muchness I suppose..<br />
The way, a gentle but greased slope to start, degraded into vertical faces and free hanging ropes &#8211; all similarly slicked. Between the humidity and sweat there were a couple of times where I nearly lost grip and I got to a point where you had to climb through a hole in the rock and down another free hanging rope. At the bottom of that, there was another sheer drop and nothing but a sweaty, clay pasted rope that I could see to use to stop yourself falling. I could see the lagoon from where I was and, as lovely and cool and refreshing as it looked, I could also see a slip, a short drop and a broken bone in my future so I sacked it off in the name of good sense and headed back.</p>
<p>I&#8217;m sure that if I&#8217;d had Mike with me we&#8217;d have got the job done. A second pair of eyes and a little competitiveness were definitely the missing ingredients.</p>
<p>Weary from changing accommodation every second or third day, we booked a place just round the bay in AoNang that looked nice and wasn&#8217;t too expensive and we opted to dig in there for the remainder of our trip. Less than a week to go before we needed to be back in KL for the dreaded flight back to London and I  really couldn&#8217;t decide whether I wanted to go back or not.. The promise of familiar personal space, the ability to make food or a cuppa whenever you like and the prospect of wearing a different fucking t-shirt was definitely something to look forward to, but we&#8217;d have to lose the warmth, the friendly service and the prices.. </p>
<p>Australia is definitely on the cards&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tripleaxis.com/the-land-that-soap-forgot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

