<?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>Adrian Smith&#039;s Blog</title>
	<atom:link href="http://www.17od.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.17od.com</link>
	<description></description>
	<lastBuildDate>Mon, 27 Feb 2012 20:15:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Testing Android Activity &amp; Process Lifecycles</title>
		<link>http://www.17od.com/2011/11/20/testing-android-activity-process-lifecycles/</link>
		<comments>http://www.17od.com/2011/11/20/testing-android-activity-process-lifecycles/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 20:04:50 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=473</guid>
		<description><![CDATA[Developing robust Android applications is challenging. At any moment your application can be interrupted, sent the background or just simply terminated. There are a few hooks to help you prepare for these scenarios but it&#8217;s such a dynamic environment it can be hard to anticipate how your application will behave. Take the activity lifecycle for [...]]]></description>
			<content:encoded><![CDATA[<p>Developing robust Android applications is challenging. At any moment your application can be interrupted, sent the background or just simply terminated. There are <a href="http://developer.android.com/guide/topics/fundamentals/activities.html#ImplementingLifecycleCallbacks">a few hooks</a> to help you prepare for these scenarios but it&#8217;s such a dynamic environment it can be hard to anticipate how your application will behave.</p>
<p>Take the <a href="http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle">activity lifecycle</a> for example. Under normal circumstances activities are only destroyed when their <em>finish()</em> method is called or the system needs to free up some memory. From a testing perspective this isn&#8217;t very deterministic so testing what happens when activities are destroyed is either forgotten about or not given the attention it deserves.</p>
<p>Luckily there are tools to help in these scenarios. The <a href="http://developer.android.com/guide/developing/debugging/debugging-devtools.html">Dev Tools App</a> is particularly useful. It&#8217;s automatically installed with every virtual device created using the Android Virtual Device Manager in Eclipse.</p>
<h2>Testing Activity Destruction</h2>
<p>To test what happens to your app when activities are destroyed tick the <em>Immediately destroy activities</em> checkbox under <em>Development Settings</em> in <em>Dev Tools</em>. This instructs Android to immediately destroy activities that are no longer visible. Under normal conditions you might never get to this test scenario if you don&#8217;t explicitly call <em>finish()</em> on your activities. It&#8217;s amazing the subtle bugs this can throw up.</p>
<h2>Testing Process Termination</h2>
<p>Another very useful test is to see what happens when your application&#8217;s process is terminated. When I stated out with <a href="https://market.android.com/details?id=com.u17od.upm">UPM</a> I received quite a number of crash reports that initially baffled me. The stack traces suggested situations that I just couldn&#8217;t recreate. It wasn&#8217;t until I started thinking about the impact of process termination that I found the root of the problems.</p>
<p>When a terminated application is restarted Android will try and return the user to whatever activity was previously in the foreground. This can cause problems if the activity assumes too much about the application&#8217;s state, e.g. what static variables are initialized. Restarting the application means there&#8217;s a new process so the static state of the previous instance is gone. Here&#8217;s how I test this scenario.</p>
<p>First I start the application in an emulator as normal. Once I&#8217;ve made it to the activity under test I hit the Home button to send the application into the background. Now I need to kill the application&#8217;s process. There&#8217;s a few ways to do this. My favourite is to use <a href="http://developer.android.com/guide/developing/tools/adb.html">adb</a>. adb is located in the Android SDK platform-tools directory. Running
<pre>$ adb shell</pre>
<p> starts a shell on the emulator. From there I use
<pre>$ ps</pre>
<p> to find the application&#8217;s process and
<pre>$ kill -9 &lt;pid&gt;</pre>
<p> to kill the process. Once I&#8217;ve killed the process I go back to the emulator and hit the application&#8217;s icon to restart it. Android will try to resume the activity that was previously in the foreground. Ideally there should be no problems but if there are they&#8217;ll usually present themselves as a NullPointerException with a &#8220;Force Close&#8221; dialog for the user.</p>
<p>Android can be a difficult, confusing platform to work with. This is particularly true if you&#8217;re coming from a regular desktop application environment. There&#8217;s a paradigm shift in thinking required to fully appreciate the transient nature of the Android environment. Thankfully, once you&#8217;ve made that leap things do get easier. The most useful resources I&#8217;ve found are the <a href="http://developer.android.com/guide/index.html">Android Developer&#8217;s Guide</a> and <a href="http://stackoverflow.com/questions/tagged/android">Stackoverflow</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2011/11/20/testing-android-activity-process-lifecycles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Searching the PRTB Database</title>
		<link>http://www.17od.com/2011/05/14/searching-the-prtb-database/</link>
		<comments>http://www.17od.com/2011/05/14/searching-the-prtb-database/#comments</comments>
		<pubDate>Sat, 14 May 2011 14:59:34 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=444</guid>
		<description><![CDATA[The PRTB publish a list of all registered rental properties in Ireland on their website. The data is split up into 47 separate spreadsheets (xls), one for each county and Dublin postcode. There&#8217;s a lot of interesting information in there but it&#8217;s very difficult to get at it when it&#8217;s in so many files. For [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">
  table td.number {
    text-align: right;
  }
</style>
<p>The <a href="https://www.prtb.ie/">PRTB</a> publish a list of <a href="https://www.prtb.ie/public_registrations.aspx">all registered rental properties in Ireland</a> on their website. The data is split up into 47 separate spreadsheets (xls), one for each county and Dublin postcode. There&#8217;s a lot of interesting information in there but it&#8217;s very difficult to get at it when it&#8217;s in so many files. For this reason I&#8217;ve loaded all the information into a database.</p>
<p>Before looking at the data it&#8217;s worth bearing a few things in mind,</p>
<ul>
<li>the data is effective 1-Apr-2011</li>
<li>there are a lot of properties included in &#8220;County Dublin&#8221; that are really part of an area code. this has the effect of bumping up the number of properties in &#8220;County Dublin&#8221;</li>
<li>some properties appear to have their floorspace given in square meters while others have it in square feet. this makes it difficult to do a consistent  analysis of the full dataset</li>
<li>there seems to be a few properties with duplicate entries</li>
</ul>
<p>I&#8217;ve included some high level numbers below. If you&#8217;d like to have a look at the data yourself I&#8217;ve <a href="http://www.17od.com/prtb/">published it in searchable form here</a>. The code for this application is <a href="https://github.com/adrian/search-prtb">available on my GitHub page</a>.</p>
<p><strong>Total number of properties:</strong> 221,315</p>
<p><strong>Number of properties per county:</strong></p>
<table>
<tr>
<td>Dublin</td>
<td class="number">67,828</td>
</tr>
<tr>
<td>Cork</td>
<td class="number">27,631</td>
</tr>
<tr>
<td>Galway</td>
<td class="number">15,626</td>
</tr>
<tr>
<td>Kildare</td>
<td class="number">8,807</td>
</tr>
<tr>
<td>Waterford</td>
<td class="number">6,079</td>
</tr>
<tr>
<td>Kerry</td>
<td class="number">5,684</td>
</tr>
<tr>
<td>Wexford</td>
<td class="number">5,571</td>
</tr>
<tr>
<td>Meath</td>
<td class="number">5,441</td>
</tr>
<tr>
<td>Wicklow</td>
<td class="number">5,372</td>
</tr>
<tr>
<td>Tipperary</td>
<td class="number">5,250</td>
</tr>
<tr>
<td>Sligo</td>
<td class="number">4,545</td>
</tr>
<tr>
<td>Westmeath</td>
<td class="number">4,520</td>
</tr>
<tr>
<td>Mayo</td>
<td class="number">4,269</td>
</tr>
<tr>
<td>Louth</td>
<td class="number">4,223</td>
</tr>
<tr>
<td>Clare</td>
<td class="number">3,888</td>
</tr>
<tr>
<td>Donegal</td>
<td class="number">3,566</td>
</tr>
<tr>
<td>Kilkenny</td>
<td class="number">3,134</td>
</tr>
<tr>
<td>Carlow</td>
<td class="number">2,806</td>
</tr>
<tr>
<td>Laois</td>
<td class="number">2,276</td>
</tr>
<tr>
<td>Offaly</td>
<td class="number">2,165</td>
</tr>
<tr>
<td>Longford</td>
<td class="number">1,947</td>
</tr>
<tr>
<td>Roscommon</td>
<td class="number">1,922</td>
</tr>
<tr>
<td>Cavan</td>
<td class="number">1,783</td>
</tr>
<tr>
<td>Limerick</td>
<td class="number">1,764</td>
</tr>
<tr>
<td>Leitrim</td>
<td class="number">1,185</td>
</tr>
<tr>
<td>Monaghan</td>
<td class="number">222</td>
</tr>
</table>
<p><strong>Number of properties per Dublin area code</strong>:</p>
<table>
<tr>
<td>Dublin County</td>
<td class="number">18,216</td>
</tr>
<tr>
<td>Dublin 8</td>
<td class="number">8,472</td>
</tr>
<tr>
<td>Dublin 15</td>
<td class="number">7,417</td>
</tr>
<tr>
<td>Dublin 1</td>
<td class="number">6,792</td>
</tr>
<tr>
<td>Dublin 4</td>
<td class="number">6,732</td>
</tr>
<tr>
<td>Dublin 7</td>
<td class="number">6,529</td>
</tr>
<tr>
<td>Dublin 9</td>
<td class="number">4,726</td>
</tr>
<tr>
<td>Dublin 24</td>
<td class="number">3,930</td>
</tr>
<tr>
<td>Dublin 2</td>
<td class="number">3,736</td>
</tr>
<tr>
<td>Dublin 3</td>
<td class="number">3,708</td>
</tr>
<tr>
<td>Dublin 18</td>
<td class="number">3,201</td>
</tr>
<tr>
<td>Dublin 14</td>
<td class="number">2,902</td>
</tr>
<tr>
<td>Dublin 6W</td>
<td class="number">2,599</td>
</tr>
<tr>
<td>Dublin 11</td>
<td class="number">2,595</td>
</tr>
<tr>
<td>Dublin 12</td>
<td class="number">2,098</td>
</tr>
<tr>
<td>Dublin 22</td>
<td class="number">1,960</td>
</tr>
<tr>
<td>Dublin 16</td>
<td class="number">1,555</td>
</tr>
<tr>
<td>Dublin 13</td>
<td class="number">1,496</td>
</tr>
<tr>
<td>Dublin 5</td>
<td class="number">1,485</td>
</tr>
<tr>
<td>Dublin 20</td>
<td class="number">586</td>
</tr>
<tr>
<td>Dublin 17</td>
<td class="number">542</td>
</tr>
<tr>
<td>Dublin 10</td>
<td class="number">362</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2011/05/14/searching-the-prtb-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon Prices for Ireland Update</title>
		<link>http://www.17od.com/2011/01/25/amazon-prices-for-ireland-update/</link>
		<comments>http://www.17od.com/2011/01/25/amazon-prices-for-ireland-update/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 20:33:48 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=433</guid>
		<description><![CDATA[Given the recent VAT rate change in the UK I&#8217;ve released a new version of the Amazon Prices for Ireland browser plugin. This script will decorate product pages on amazon.co.uk with the equivilent irish price. This price will be in euro and include the irish VAT rate where applicable. Firefox GreaseMonkey Script: Install, Source Code [...]]]></description>
			<content:encoded><![CDATA[<p>Given the <a href="http://www.amazon.co.uk/gp/help/customer/display.html/ref=hp_left_sib?ie=UTF8&#038;nodeId=200587420">recent VAT rate change in the UK</a> I&#8217;ve released a new version of the <em>Amazon Prices for Ireland</em> browser plugin.</p>
<blockquote><p>This script will decorate product pages on amazon.co.uk with the equivilent irish price. This price will be in euro and include the irish VAT rate where applicable.</p></blockquote>
<p>Firefox GreaseMonkey Script: <a href="http://userscripts.org/scripts/show/64262">Install</a>, <a href="https://github.com/adrian/Amazon-Prices-for-Ireland">Source Code</a></p>
<p>Chrome Extension: <a href="https://chrome.google.com/extensions/detail/ljbghemliajpgabhbaecbipkgngkoalf?hl=en">Install</a>, <a href="https://github.com/adrian/Amazon-Prices-for-Ireland-Chrome-Extension">Source Code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2011/01/25/amazon-prices-for-ireland-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating a SourceForge Subversion Repository to GitHub</title>
		<link>http://www.17od.com/2010/11/11/migrating-a-sourceforge-subversion-repository-to-github/</link>
		<comments>http://www.17od.com/2010/11/11/migrating-a-sourceforge-subversion-repository-to-github/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 17:55:57 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=381</guid>
		<description><![CDATA[One of greatest attractions of GitHub is the community and the tooling that allows this community to share code. It&#8217;s all down to Git of course but the presentation and traction that GitHub offers makes it a very compelling choice for an open source project looking for a home. Universal Password Manager has been hosted [...]]]></description>
			<content:encoded><![CDATA[<p>One of greatest attractions of <a href="http://github.com">GitHub</a> is the community and the tooling that allows this community to share code. It&#8217;s all down to Git of course but the presentation and traction that GitHub offers makes it a very compelling choice for an open source project looking for a home.</p>
<p><a href="http://upm.sourceforge.net/">Universal Password Manager</a> has been hosted on SourceForge since it&#8217;s launch in December 2005. Over the course of those years there have been many patches offered by generous developers looking to help improve it. While merging these patches is usually straight forward I can imagine how difficult it would be if the project was very popular and had tens or even hundreds of contributors.</p>
<p>GitHub offers a very attractive alternative. Each contributor can clone the repository, make their changes and then send you a <a href="http://help.github.com/pull-requests/">pull request</a>. As the project maintainer your job is now a whole lot easier and more manageable. No more patch files to worry about. Everything is organised and fully traceable.</p>
<p>For this reason (and so that I can use and learn more about <a href="http://git-scm.com/">Git</a>) I decided to move UPM&#8217;s code from SourceForge to GitHub. These instructions are nothing new. There are plenty of similar posts. What I&#8217;m offering here are the steps I went through from start to finish.</p>
<p>1. Install svn2git. This involves installing git, ruby and ruby gems. Full instructions are available <a href="https://github.com/nirvdrum/svn2git">here</a>.</p>
<p>2. Create a link to svn2git</p>
<pre><code>$ sudo ln -s /var/lib/gems/1.8/bin/svn2git /usr/bin/svn2git</code></pre>
<p>3. Copy down your project&#8217;s subversion repository to help speed up the migration process. SourceForge make this very easy by providing an rsync daemon. See <a href="http://sourceforge.net/apps/trac/sourceforge/wiki/Subversion#Backups">here</a> for details.</p>
<pre><code>$ rsync -av upm.svn.sourceforge.net::svn/upm/* .</code></pre>
<p>4. Create an authors file. This is used to map the authors in your Subversion repository to those you want to use in Git.</p>
<pre><code>adrian = Adrian Smith &lt;adrian@email.com&gt;</code></pre>
<p>5. Create a new Git repository for your project. This will be a local repository for now so there&#8217;s no need to worry about GitHub just yet.</p>
<pre><code>$ mkdir my_project
$ cd my_project
$ git init</code></pre>
<p>6. Run svn2git. This process can take a while (hours if your repository is exceptionally large). What it&#8217;s doing is reading each Subversion revision and creating a corresponding Git commit.</p>
<pre><code>$ svn2git file:///home/adrian/upm.sourceforge/ --trunk swing/trunk --branches swing/branches --tags swing/tags --authors ../upm-authors</code></pre>
<p>7. If you want to check that you new repository has the same number of commits as your old Subversion repository you can do something like this&#8230;</p>
<pre><code>$ svn log -q | grep '^r[0-9]' | wc -l (count subversion revisions)
$ git log --oneline | wc -l (count git commits)</code></pre>
<p>8. Create your new GitHub repository as described on <a href="http://help.github.com/creating-a-repo/">this page</a> following the <b>Existing Repo?</b> instructions.</p>
<p>Since we&#8217;ve gone to all this trouble we might as well leave a little message on SourceForge redirecting visitors interested in the source code to the new GitHub page.</p>
<p>1. Logon to SourceForge and go to <b>Project Admin -> Feature Settings</b>.</p>
<p>2. Select <b>Manage</b> next to Subversion and go to <b>Non-SF.net Resource (Active)</b>. This page allows you to leave a short message and a link to the new project page. It&#8217;s unfortunate there&#8217;s so much talk about Subverison on this page but the Git feature doesn&#8217;t have the option of redirecting visitors to an external host.</p>
<p>That should be it. Have fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/11/11/migrating-a-sourceforge-subversion-repository-to-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UPM for Android 1.2 Released</title>
		<link>http://www.17od.com/2010/08/09/upm-for-android-1-2-released/</link>
		<comments>http://www.17od.com/2010/08/09/upm-for-android-1-2-released/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 18:07:50 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[upm]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=351</guid>
		<description><![CDATA[Universal Password Manager for Android 1.2 has been released. The easiest way to install it is from the Android Market. Alternatively the apk can be downloaded from SourceForge. The source is also available there. From the release notes&#8230; Long-clicking on an account now brings up a context menu allowing you to copy username, copy password, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://upm.sourceforge.net">Universal Password Manager</a> for Android 1.2 has been released. The easiest way to install it is from the Android Market. Alternatively the apk can be downloaded from <a href="https://sourceforge.net/projects/upm/files/UPM/upm-android-1.2/">SourceForge</a>. The source is also available there.</p>
<p>From the release notes&#8230;</p>
<ul>
<li>Long-clicking on an account now brings up a context menu allowing you to copy username, copy password, launch URL or edit account</li>
<li>Added the ability to trust self signed certificates and certificates that have a different Common Name to the website hostname</li>
<li>Increased the font size on the Account Details activity</li>
<li>Fixed a bug on the main Accounts page so that it recovers gracefully when the database is closed unexpectedly</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/08/09/upm-for-android-1-2-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calling RESTful Recess Services using Javascript and JSON</title>
		<link>http://www.17od.com/2010/08/02/calling-restful-recess-services-using-javascript-and-json/</link>
		<comments>http://www.17od.com/2010/08/02/calling-restful-recess-services-using-javascript-and-json/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 19:25:04 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[recessframework]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=332</guid>
		<description><![CDATA[As part of a proof of concept I was carrying recently I wanted to deploy and call a simple REST service from Javascript. Ultimately I&#8217;ll probably use a Java based framework like Restlet (I&#8217;ll be deploying to Google App Engine) but in the meantime the Recess framework proved very useful. Using it&#8217;s GUI based tools [...]]]></description>
			<content:encoded><![CDATA[<p>As part of a proof of concept I was carrying recently I wanted to deploy and call a simple <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services">REST service</a> from Javascript. Ultimately I&#8217;ll probably use a Java based framework like <a href="http://www.restlet.org/">Restlet</a> (I&#8217;ll be deploying to <a href="http://code.google.com/appengine/">Google App Engine</a>) but in the meantime the <a href="http://www.recessframework.org/">Recess</a> framework proved very useful. Using it&#8217;s GUI based tools it&#8217;s very easy to setup a persistent data model and expose it as a REST service.</p>
<p>On the client side I used the <a href="http://developer.yahoo.com/yui/3/">YUI</a> Javascript framework and <a href="http://www.json.org/">JSON</a> as the data interchange format. There didn&#8217;t seem to be a direct example of doing this on the Recess website here&#8217;s what I came up with.</p>
<p>The only Recess specific requirement is that the Json View is registered on your application controller. More info on views <a href="http://www.recessframework.org/book/html/ch10s02.html">here</a>.</p>
<pre><code>!RespondsWith Layouts, Json</code></pre>
<p>Here&#8217;s Javascript code to create a object of type Entry. The object has two attributes, &#8220;date&#8221; and &#8220;data&#8221;.</p>
<pre><code>Y.io("/recess/myjournal/entry/", {
  method: "POST",
  data: {
    "entry[date][day]": Y.one("#entryDay").get("value"),
    "entry[date][month]": Y.one("#entryMonth").get("value"),
    "entry[date][year]": Y.one("#entryYear").get("value"),
    "entry[data]": Y.one("#entryText").get("value")
  },
  on: {
    success: function(transactionid, response, arguments) {
      alert("entry successfully added");
    },
    failure: function(transactionid, response, arguments) {
      alert("add entry failed: " + response.responseText);
    }
  }
});</code></pre>
<p>For anyone interested in seeing this code in context here&#8217;s the page it&#8217;s used on. Remember this is just some simple proof of concept stuff so it&#8217;s very rough and ready.</p>
<pre><code>&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;My Journal&lt;/title&gt;
    &lt;script type="text/javascript" charset="utf-8" src="http://yui.yahooapis.com/3.1.1/build/yui/yui-min.js"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h2&gt;Entries&lt;/h2&gt;
    &lt;ul id="entriesList"&gt;
    &lt;/ul&gt;

    &lt;form id="newEntryForm" style="display: none"&gt;
      &lt;input id="entryDay" type="text" size="2" maxlength="2"&gt;
      &lt;select id="entryMonth"&gt;
        &lt;option value="1"&gt;Jan&lt;/option&gt;
        &lt;option value="2"&gt;Feb&lt;/option&gt;
        &lt;option value="3"&gt;Mar&lt;/option&gt;
        &lt;option value="4"&gt;Apr&lt;/option&gt;
        &lt;option value="5"&gt;May&lt;/option&gt;
        &lt;option value="6"&gt;June&lt;/option&gt;
        &lt;option value="7"&gt;July&lt;/option&gt;
        &lt;option value="8"&gt;Aug&lt;/option&gt;
        &lt;option value="9"&gt;Sept&lt;/option&gt;
        &lt;option value="10"&gt;Oct&lt;/option&gt;
        &lt;option value="11"&gt;Nov&lt;/option&gt;
        &lt;option value="12"&gt;Dec&lt;/option&gt;
      &lt;/select&gt;
      &lt;input id="entryYear" type="text" size="2" maxlength="4"&gt;
      &lt;br /&gt;
      &lt;textarea id="entryText" rows="10" cols="20"&gt;&lt;/textarea&gt;
      &lt;br /&gt;
      &lt;input id="cancelAddButton" type="button" value="Cancel"&gt;
      &lt;input id="saveEntryButton" type="button" value="Save"&gt;
    &lt;/form&gt;

    &lt;form&gt;
      &lt;input id="refreshButton" type="button" value="Refresh" disabled="true"&gt;
      &lt;input id="addButton" type="button" value="Add"&gt;
    &lt;/form&gt;

    &lt;script&gt;
      YUI().use("node", "io", "json", "datatype-date", "querystring-stringify-simple", function(Y) {
        // Add an entry to list
        var addEntryToList = function(entryDate) {
          var listNode = Y.one("#entriesList");
          var date = Y.DataType.Date.format(entryDate, {format: "%Y-%m-%d"});
          listNode.append("&lt;li&gt;" + date + "&lt;/li&gt;");
        };

        // Retrieve entries and add them to the list
        var populateEntriesList = function() {
          Y.one("#refreshButton").set("disabled", true);

          Y.io("/recess/myjournal/entry.json", {
            method: "GET",
            on: {
              success: function(transactionid, response, arguments) {
                var listNode = Y.one("#entriesList");
                listNode.get("children").remove();

                var entries = Y.JSON.parse(response.responseText);

                Y.each(entries.entrySet, function(entry, index, array) {
                  // The date coming from the server will by in seconds. Date() expects milliseconds so * by 1000.
                  addEntryToList(new Date(entry.date * 1000));
                });
              },
              failure: function(transactionid, response, arguments) {
                alert("get entries failed: " + response.responseText);
              },
              end: function(transactionid, arguments) {
                Y.one("#refreshButton").set("disabled", false);
              }
            }
          });
        };

        var showAddEntryControls = function() {
          Y.one("#newEntryForm").setStyle("display", "block");
        };

        var saveEntry = function() {
          Y.io("/recess/myjournal/entry/", {
            method: "POST",
            data: {
              "entry[date][day]": Y.one("#entryDay").get("value"),
              "entry[date][month]": Y.one("#entryMonth").get("value"),
              "entry[date][year]": Y.one("#entryYear").get("value"),
              "entry[data]": Y.one("#entryText").get("value")
            },
            on: {
              success: function(transactionid, response, arguments) {
                var entryDate = new Date(
                  Y.one("#entryYear").get("value"),
                  Y.one("#entryMonth").get("value") - 1,
                  Y.one("#entryDay").get("value")
                );
                addEntryToList(entryDate);
              },
              failure: function(transactionid, response, arguments) {
                alert("add entry failed: " + response.responseText);
              },
              end: function(transactionid, arguments) {
                Y.one("#newEntryForm").setStyle("display", "none");
              }
            }
          });
        };

        var cancelAddEntry = function() {
          Y.one("#newEntryForm").setStyle("display", "none");
        };

        Y.on("available", populateEntriesList, "#entriesList");
        Y.one("#refreshButton").on("click", populateEntriesList);
        Y.one("#addButton").on("click", showAddEntryControls);
        Y.one("#cancelAddButton").on("click", cancelAddEntry);
        Y.one("#saveEntryButton").on("click", saveEntry);
      });
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/08/02/calling-restful-recess-services-using-javascript-and-json/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon Prices for Ireland &#8211; Chrome Extension</title>
		<link>http://www.17od.com/2010/07/01/amazon-prices-for-ireland-chrome-extension/</link>
		<comments>http://www.17od.com/2010/07/01/amazon-prices-for-ireland-chrome-extension/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 07:37:26 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[chrome]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=324</guid>
		<description><![CDATA[Even though amazon.co.uk ship to Ireland they don&#8217;t price their products in Euro. It&#8217;s not until we reach the very last page of the order process that we see the full Euro value of the order with Irish VAT applied. What this plugin does is update each product page with the equivalent Euro price. The [...]]]></description>
			<content:encoded><![CDATA[<p>Even though amazon.co.uk ship to Ireland they don&#8217;t price their products in Euro. It&#8217;s not until we reach the very last page of the order process that we see the full Euro value of the order with Irish VAT applied.</p>
<p>What this plugin does is update each product page with the equivalent Euro price. The GBP to EUR rate is retrieved in real time from Yahoo Finance. The Irish VAT rate of 21% is included except on books which are exempt from VAT.</p>
<p>Now <a href="https://chrome.google.com/extensions/detail/ljbghemliajpgabhbaecbipkgngkoalf?hl=en">available on Chrome</a>. </p>
<p>The original Firefox version is still available <a href="http://userscripts.org/scripts/show/64262">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/07/01/amazon-prices-for-ireland-chrome-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UPM 1.6 Released</title>
		<link>http://www.17od.com/2010/06/23/upm-1-6-released/</link>
		<comments>http://www.17od.com/2010/06/23/upm-1-6-released/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:45:06 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[upm]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=320</guid>
		<description><![CDATA[Universal Password Manager 1.6 has just been released. It can be downloaded here. From the release notes&#8230; Added the ability to export/import from/to a CSV file Added a random password generator Removed the dependency on JCE Unlimited Strength Jurisdiction Policy Files Added support for using HTTPS URLs with database sharing Set focus on the password [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://upm.sourceforge.net">Universal Password Manager</a> 1.6 has just been released. It can be downloaded <a href="http://sourceforge.net/projects/upm/">here</a>.</p>
<p>From the release notes&#8230;</p>
<ul>
<li>Added the ability to export/import from/to a CSV file</li>
<li>Added a random password generator</li>
<li>Removed the dependency on JCE Unlimited Strength Jurisdiction Policy Files</li>
<li>Added support for using HTTPS URLs with database sharing</li>
<li>Set focus on the password field on all enter master password dialogs</li>
<li>Added Spanish translation (courtesy of Victor Alfonso Pineda)</li>
<li>Resize the &#8220;Notes&#8221; text area when the Account Details dialog is resized</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/06/23/upm-1-6-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UPM 1.1 Released</title>
		<link>http://www.17od.com/2010/03/30/upm-1-1-released/</link>
		<comments>http://www.17od.com/2010/03/30/upm-1-1-released/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 18:55:10 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[upm]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=305</guid>
		<description><![CDATA[With this release UPM on Android reaches feature parity with the desktop version. The main features included with this release are, Shared Database support Delete Database support Lots of bugs fixes and improvements The shared database feature was the primary focus of 1.1. With this it&#8217;s now possible to sync your password database with the [...]]]></description>
			<content:encoded><![CDATA[<p>With this release <a href="http://upm.sourceforge.net/">UPM on Android</a> reaches feature parity with the desktop version. The main features included with this release are,</p>
<ul>
<li>Shared Database support</li>
<li>Delete Database support</li>
<li>Lots of bugs fixes and improvements</li>
</ul>
<p>The shared database feature was the primary focus of 1.1. With this it&#8217;s now possible to sync your password database with the desktop version. For full details on how to setup and use database sharing see the <a href="http://upm.sourceforge.net/userguide.html">user guide</a>. </p>
<p>You can upgrade from the Android Marketplace or <a href="https://sourceforge.net/projects/upm/files/UPM/upm-android-1.1/UPM-Android-1.1.apk/download">download the APK</a> directly from Sourceforge.</p>
<p>If you have any problems post please use the <a href="https://sourceforge.net/projects/upm/forums/forum/517034">Help Forum</a>.</p>
<p><strong>UPDATE: When you upgrade you may get an error telling you UPM is no longer available when you try to start it. To fix this you should restart your phone and recreate any shortcut you have to UPM on your Home screen.</strong></p>
<p><strong>For those who are interested this seems to be a problem with Android 1.5 and how it handles a change to the main Activity after an upgrade. If you have any experience or details on this problem I&#8217;d be interested hear about it.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/03/30/upm-1-1-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bookmarks for 2010-03-05</title>
		<link>http://www.17od.com/2010/03/04/bookmarks-for-2010-03-05/</link>
		<comments>http://www.17od.com/2010/03/04/bookmarks-for-2010-03-05/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 20:03:29 +0000</pubDate>
		<dc:creator>Adrian</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bookmarks]]></category>

		<guid isPermaLink="false">http://www.17od.com/?p=296</guid>
		<description><![CDATA[Randy Pausch: Really achieving your childhood dreams &#124; Video on TED.com Randy Pausch shares his story. Amazing stuff. I can only imagine what it would have been like to work (or play) with this man. Oracle DBMS_CHANGE_NOTIFICATION An interesting way of subscribing to events in an Oracle db. Could be used as an alternative to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ted.com/talks/randy_pausch_really_achieving_your_childhood_dreams.html">Randy Pausch: Really achieving your childhood dreams | Video on TED.com</a><br />
Randy Pausch shares his story. Amazing stuff. I can only imagine what it would have been like to work (or play) with this man.</p>
<p><a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_chngnt.htm">Oracle DBMS_CHANGE_NOTIFICATION</a><br />
An interesting way of subscribing to events in an Oracle db. Could be used as an alternative to triggers where the work to be carried out is not possible from a trigger or needs to be done async to the trigger.</p>
<p><a href="http://quicksharp.sourceforge.net/">QuickSharp</a><br />
<a href="http://monodevelop.com/">MonoDevelop</a><br />
<a href="http://sharpdevelop.com/">SharpDevelop IDE for C#</a><br />
A few opensource C# IDEs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.17od.com/2010/03/04/bookmarks-for-2010-03-05/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

