<?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>Tilion</title>
	<atom:link href="http://www.tilion.org.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tilion.org.uk</link>
	<description>Resources and technical documentation</description>
	<lastBuildDate>Wed, 16 May 2012 13:34:21 +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>Subversion Cheat Sheet</title>
		<link>http://www.tilion.org.uk/2012/05/subversion-cheat-sheet/</link>
		<comments>http://www.tilion.org.uk/2012/05/subversion-cheat-sheet/#comments</comments>
		<pubDate>Wed, 16 May 2012 13:34:21 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.tilion.org.uk/?p=133</guid>
		<description><![CDATA[Examples below use an imaginery repository located at svn+ssh://user@svn.domain.com/project Create and Import I prefer to create plain file backed repositories as they don&#8217;t suffer the same inconsistency quirks as the berkley database backed repositories. The following will create a new &#8230; <a href="http://www.tilion.org.uk/2012/05/subversion-cheat-sheet/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Examples below use an imaginery repository located at <strong>svn+ssh://user@svn.domain.com/project</strong></p>
<h3>Create and Import</h3>
<p>I prefer to create plain file backed repositories as they don&#8217;t suffer the same inconsistency quirks as the berkley database backed repositories.  The following will create a new repository called <em>project</em> in the current working directory.</p>
<pre class="code">svnadmin create project --fs-type fsfs</pre>
<p>If you don&#8217;t have any files to import you can start creating files as you develop and then use <em>svn add</em> to put them into version management.</p>
<h3>Checkout</h3>
<p>The following will checkout the project into a directory called <em>myproject</em>, created in the current working directory.</p>
<pre class="code">svn checkout svn+ssh:/user@svn.domain.com/project/trunk myproject</pre>
<h3>Ignoring File/Directories</h3>
<p>Build directories or log directories can be annoying when they continue to show up in the <em>svn status</em> command.  You can instruct subversion to ignore them using</p>
<pre class="code">svn propedit svn:ignore target</pre>
<h3>Tagging and Branching</h3>
<p>Make sure the <em>tags</em> or <em>branches</em> directory is created first.</p>
<pre class="code">svn mkdir svn+ssh://user@svn.domain.com/project/tags</pre>
<p>From the base directory of your project, tag the release or create the branch.</p>
<pre class="code">svn copy . svn+ssh://user@svn.domain.com/project/tags/1_0_0</pre>
<h3>Updating a tagged revision</h3>
<p>If you need to make updates to a tagged revision (say 2.1.0) when the main trunk has already progressed with new development (2.2.0 for instance) you can do it as follows.</p>
<p>Copy the 2.1.0 tag into a branch</p>
<pre class="code">svn copy svn+ssh://user@svn.domain.com/project/tags/2_1_0 svn+ssh://user@svn.domain.com/project/branches/2_1_1</pre>
<p>Checkout this new branch and make code updates within it.  You can commit changes as you would if you were working on the trunk.</p>
<pre class="code">svn checkout svn+ssh:/user@svn.domain.com/project/branches/2_1_1 myproject-2_1_1</pre>
<p>When finished, tag the new version.</p>
<pre class="code">svn move svn+ssh:/user@svn.domain.com/project/branches/2_1_1 svn+ssh:/user@svn.domain.com/project/tags/2_1_1</pre>
<h3>Conflict Resolution</h3>
<p>If you try to apply changes and end up with a file in conflict (marked with a <strong>C</strong> next to its name) you have 3 ways to solve this; merge text in the file by hand, copy one of the temporary files over the top of the original, run <em>svn revert</em> on the file.</p>
<p>If you fix the problem by hand, or by copying one of the temporary files over the top, you must let subversion know by using the following command.
<pre class="code">svn resolved &lt;FILE&gt;</pre>
<h3>Merging changes from a tag/branch back into trunk</h3>
<p>You need checked out copies of the tag/branch and trunk.  It&#8217;s easier if changes in trunk are committed as it makes rolling back easier (just use the revert command).</p>
<p>Next, work out which revisions from the tag/branch you want to apply into trunk.  You can do this with <em>svn log</em> (within the tag/branch) to see when it was created and what has been committed.  From with trunk, run the following command.</p>
<pre class="code">svn merge -r 200:204 svn+ssh:/user@svn.domain.com/project/branch/big_change</pre>
<p>At this point changes are made locally in trunk (201,202,203,204, 200 is <strong>not</strong> inclusive).  Compile code, check changes work then commit them being very specific of what just happened in the log message, e.g. <em>Merged branch/big_change r200:204 into trunk</em></p>
<h3>Relocating a subversion repository</h3>
<p>Maybe the server breaks down, or you just need to move the location of your subversion server.  In theory you can do it with the following command.</p>
<pre class="code">svn switch --relocate svn+ssh:/user@svn.domain.com/project/branch/2_2_2 svn+ssh:/newuser@svn.newdomain.com/project/branch/2_2_2 .</pre>
<p>The command above should recurse into subdirectories, although when I tried it, it didn&#8217;t work for me.  Resorting back to sed you can do the same as follows.</p>
<pre class="code">for file in `find . -name 'entries'`; do sed s/user@svn.domain.com/newuser@svn.newdomain.com/g $file > $file'A'; done
for file in `find . -name 'entriesA'`; do mv `dirname $file`/entriesA `dirname $file`/entries; done</pre>
<!-- AdSense Now! Lite V3.04 -->
<!-- Post[count: 2] -->
<div class="adsense adsense-leadout" style="text-align:center;margin: 12px;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-3357713325835138";
/* 728x90, created 12/02/08 */
google_ad_slot = "0996730963";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/05/subversion-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SCORM (Adobe Captivate and ADL Test Suite 1.2.7)</title>
		<link>http://www.tilion.org.uk/2012/03/scorm-adobe-captivate-and-adl-test-suite-1-2-7/</link>
		<comments>http://www.tilion.org.uk/2012/03/scorm-adobe-captivate-and-adl-test-suite-1-2-7/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 11:13:48 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.tilion.org.uk/?p=114</guid>
		<description><![CDATA[This document describes my experience using Adobe Captivate to generate a SCORM 1.2 content package. This includes the verification of such a package using the ADL test suite. Using captivate I created a set of multiple choice questions &#8211; I &#8230; <a href="http://www.tilion.org.uk/2012/03/scorm-adobe-captivate-and-adl-test-suite-1-2-7/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This document describes my experience using Adobe Captivate to generate a SCORM 1.2 content package.  This includes the verification of such a package using the ADL test suite.</p>
<p>Using captivate I created a set of multiple choice questions &#8211; I won&#8217;t go into all the details of how to do this as it was the easy bit!  Export the package as a SCORM 1.2 zip file.</p>
<p>Running the output from captivate straight through the ADL test suite you&#8217;ll see it fails with an initial error of <strong>ERROR: LMS Not initialized</strong>.  If you look at the content window opened up by the test suite you&#8217;ll also notice there are javascript errors, the first one being access denied to scorm_support.js</p>
<p>The details of this fix have been borrowed, then embellished, from http://www.mylearning.be/2009/09/adobe-captivate-and-the-adl-scorm-test-suite-1-2-7/</p>
<p>To make sure that your SCO gets launched in the test suite, you need to <strong>edit the html file</strong> that is generated by Captivate when publishing your content (the .html that has the same name as your project .swf). Open the file with a text editor (Notepad), on the second line you will find <em>&lt;!&#8211; saved from url=(0013)about:internet &#8211;&gt;. </em><strong>Delete</strong> that line.</p>
<p>Restart your test, and your SCO will now launch. But you will get errors in your test now.  Fix number two: change the <strong>security settings of the Flash player</strong> on your machine.</p>
<ul>
<li>Get some Flash content playing in your browser. Any Flash animation will do. Go e.g. to <a href="http://www.adobe.com">www.adobe.com</a>.</li>
<li>Right-click on the animation, you will get the Flash context menu. Select <strong>Settings</strong>.</li>
<li>You will get a little menu like this:<br />
<img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/flash-settings.png" alt="" title="flash-settings" width="218" height="141" class="alignnone size-full wp-image-112" /></li>
<li>Click the <strong>Advanced </strong>button. This will bring you to an <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager.html" target="_blank">Adobe Web site</a>.</li>
<li>In the table of contents on the left, click <strong>Global Security Settings Panel</strong>. This will show you a panel like this:<br />
<img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/trusted-locations.png" alt="" title="trusted-locations" width="403" height="278" class="alignnone size-full wp-image-113" /></li>
<li>Add the location where your ADL TestSuite software is installed to the trusted locations. The location of the TEST SUITE software, not the location of your zip file or your content files. Those get copied automatically to a TestSuite subfolder when you run the test.</li>
<li>Close all your browser windows and re-run the test.</li>
</ul>
<p>From here, I continue the explanation with my own experience &#8230; having unzipped the original zip file to make changes to the HTML file I decided to test with it unzipped as the test suite has that option &#8211; <strong>do not do this</strong>.  I wasted a great deal of time trying to work out why LMSInitialize() was not being called by my content, to the extent that I actually hardcoded a change in to make sure it was called.  This unzipped package now passed the test suite, but having never run anything through the test suite before I couldn&#8217;t tell if it was working correctly.</p>
<p>Everything now works, hurrah, so I rezip the package and decide to give it a final test.  LMSInitialize() now gets called twice, hence the waste of all my effort &#8211; I then removed my hardcoded call.  Now, when you run this package through the test suite, not only does it pass, but it shows you all the data communicated from the content package to the LMS (getValue/setValue calls).</p>
<p>In summary, the only thing wrong with the initial Captivate output is that it contains a comment (on line 2) that needs to be removed.  I suspect the other fix is only needed to satisfy the test suite running the package from the local disk, as opposed to being served through a web server over HTTP.<br />
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/03/scorm-adobe-captivate-and-adl-test-suite-1-2-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat SSL Certificate &#8211; Alias tomcat name does not identify a key entry</title>
		<link>http://www.tilion.org.uk/2012/03/tomcat-ssl-certificate-alias-tomcat-name-does-not-identify-a-key-entry/</link>
		<comments>http://www.tilion.org.uk/2012/03/tomcat-ssl-certificate-alias-tomcat-name-does-not-identify-a-key-entry/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 11:28:55 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.tilion.org.uk/?p=108</guid>
		<description><![CDATA[A post that may help someone out if they get into the same situation I did with regards to importing SSL certificates into a java keystore for Tomcat. When renewing my certificate, my CA had the ability to use my &#8230; <a href="http://www.tilion.org.uk/2012/03/tomcat-ssl-certificate-alias-tomcat-name-does-not-identify-a-key-entry/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A post that may help someone out if they get into the same situation I did with regards to importing SSL certificates into a java keystore for Tomcat.</p>
<p>When renewing my certificate, my CA had the ability to use my old CSR (certificate signing request) which I accepted as it saved me a few minutes.  Before, I&#8217;d always started with an empty keystore, generated my private key, CSR, then imported my new certificate along with the any needed to complete the chain.  It seemed easy, I just needed to import my new certificate into the old keystore, right?</p>
<pre>keytool -import -alias intermed -keystore tomcat.keystore -trustcacerts -file gd_intermediate.crt
Enter keystore password:
keytool error: java.lang.Exception: Certificate not imported, alias <intermed> already exists</pre>
<p>I see, I&#8217;ve already got a certificate under that alias, so I need to remove it first.  Into the manual, -delete option looks good and away we go &#8230; I delete and then import 2 certificates that make up the chain and do the same with my newly issued certificate.  Update my tomcat config to be greeted by the following:</p>
<pre>LifecycleException:  service.getName(): "Catalina";  Protocol handler start failed: java.io.IOException: Alias name tomcat does not identify a key entry</pre>
<p>To cut a long story short, when you use the -delete option of keytool on an alias with a private key in it, it doesn&#8217;t just remove the certificate, it removes your private key as well.  Adding in my new certificate is all well and good if I no longer have a private key associated with it!  The correct thing to do is not use the -delete option at all, because keytool will not complain if you&#8217;re importing a new certificate like that over the top of an old one, e.g I already have a certificate in the alias &#8216;tomcat&#8217; but &#8230;</p>
<pre>keytool -import -alias tomcat -keystore tomcat.keystore -trustcacerts -file mydomain.com.crt
Enter keystore password:
Certificate was added to keystore</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/03/tomcat-ssl-certificate-alias-tomcat-name-does-not-identify-a-key-entry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tilion Live Tournament Manager Demo</title>
		<link>http://www.tilion.org.uk/2012/02/tilion-live-tournament-manager-demo/</link>
		<comments>http://www.tilion.org.uk/2012/02/tilion-live-tournament-manager-demo/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 09:13:50 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tournament]]></category>

		<guid isPermaLink="false">http://www.tilion.org.uk/?p=91</guid>
		<description><![CDATA[Imagine the scene &#8230; you&#8217;re running a pool competition and need some way to coordinate everything on the day. You could use pieces of paper, even excel spreadsheets, but wouldn&#8217;t it be easier if you could do it all in &#8230; <a href="http://www.tilion.org.uk/2012/02/tilion-live-tournament-manager-demo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Imagine the scene &#8230; you&#8217;re running a pool competition and need some way to coordinate everything on the day.  You could use pieces of paper, even excel spreadsheets, but wouldn&#8217;t it be easier if you could do it all in one simple software application?</p>
<p>What follows isn&#8217;t a new idea and doesn&#8217;t necessarily include new concepts. However, it is my take on a solution that allows me to continually extend if necessary &#8211; it&#8217;s often very difficult to extend someone else&#8217;s work, especially if it is closed source.</p>
<h3>Screenshots</h3>
<p>Players overview: when you announce a competition you&#8217;ll get a list of players stating their interest, some even paying you money, but at this point there is no guarantee they&#8217;ll turn up on the day.</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.11.46.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.11.46-300x241.png" alt="" title="TLTM_Players" width="300" height="241" class="alignnone size-medium wp-image-94" /></a></p>
<p>Competitions overview: most competitions I&#8217;ve been involved in include a main event and then a plate event to keep early round losers interested.  Competitions have multiple rounds and can be run simultaneously over the available tables.</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.22.02.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.22.02-300x238.png" alt="" title="TLTM_Competitions" width="300" height="238" class="alignnone size-medium wp-image-96" /></a></p>
<p>Teams overview: for most competitions this tab would be better named as <em>Registered Players</em>, but the software is designed to work for single, or team events, in the same way. When the players arrive at the venue you can register them by creating a team entry (1 or more players per team) for a particular competition.</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.24.31.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.24.31-300x239.png" alt="" title="TLTM_Teams" width="300" height="239" class="alignnone size-medium wp-image-100" /></a></p>
<p>Matches overview: this tab shows a complete list of matches that need to be played.  Grouped by competition/round and showing home team and away team.</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.25.28.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.25.28-300x240.png" alt="" title="TLTM_Matches" width="300" height="240" class="alignnone size-medium wp-image-101" /></a></p>
<p>Tables overview: tables available for use at the venue. Each table has a status so you can tell if it&#8217;s in use, or the players on it just happen to be practicing and causing delays!</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.26.06.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.26.06-300x238.png" alt="" title="TLTM_Tables" width="300" height="238" class="alignnone size-medium wp-image-102" /></a></p>
<p>Status: this page is where the benefit of using a software application comes into its own.  At the top you can see the currently in progress matches.  At the bottom you can see a list of matches that need to be played and if there are any free tables.</p>
<p><a href="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.27.37.png"><img src="http://www.tilion.org.uk/wp-content/uploads/2012/03/Screen-Shot-2012-02-29-at-09.27.37-300x238.png" alt="" title="TLTM_Status" width="300" height="238" class="alignnone size-medium wp-image-103" /></a></p>
<h3>Omissions from this first demo?</h3>
<p>Yes, there are some things missing and some things I&#8217;ll change as development progresses. For example, most tabs include a data entry area and an <em>Add</em> button which makes development/testing easier, but these will be moved into dialog boxes in time as they clutter up the main UI.</p>
<p>There&#8217;s also no obvious way to create matches between teams.  This is coming, although it&#8217;s a bit more complex than other tabs as it needs to include a manual match creation and a randomised draw creation.</p>
<p>Results, I don&#8217;t see anywhere I can see match results! Again, an extra tab to be developed. The reason it&#8217;s not in the demo screenshots is that I don&#8217;t want it to be a tab in the same way as the other sections. I want it to be a separate window so those that run tournaments with a laptop and second screen can display the results window on the second screen. This allows players to come and see results (as well as the draw) without having to bug the organiser with questions.</p>
<p>Finally, the extra bits only possible by a software application. What if there was an internet forum you planned to update with results throughout the day? Wouldn&#8217;t it be nice if there was a <em>Publish</em> button that did everything for you &#8211; from logging into the forum, formatting the results and continually updating each time you click the <em>Publish</em> button? And, what about a website? A lot of organisers need their results published in a way they can put on their website.</p>
<p>The development continues &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/02/tilion-live-tournament-manager-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripting Snippets</title>
		<link>http://www.tilion.org.uk/2012/02/scripting-snippets/</link>
		<comments>http://www.tilion.org.uk/2012/02/scripting-snippets/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 16:09:50 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.tilion.org.uk/?p=84</guid>
		<description><![CDATA[Bits of scripting I use infrequently and always have to lookup! Looping and reading a line at a time while read line; do echo $line done < test.txt Remove annoying .DS_Store files even if directories that have spaces in them &#8230; <a href="http://www.tilion.org.uk/2012/02/scripting-snippets/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bits of scripting I use infrequently and always have to lookup!</p>
<p>Looping and reading a line at a time</p>
<pre class="code">while read line; do
  echo $line
done < test.txt</pre>
<p>Remove annoying .DS_Store files even if directories that have spaces in them</p>
<pre class="code">find . -name .DS_Store -exec rm {} \;</pre>
<p>Find differences between two directories (with subdirectories), stating if files differ</p>
<pre class="code">diff -rq $DIR1 $DIR2</pre>
<p>Count files in current and all subdirectories</p>
<pre class="code">find . -type f | wc -l</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/02/scripting-snippets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notification Wrapper</title>
		<link>http://www.tilion.org.uk/2012/01/notification-wrapper/</link>
		<comments>http://www.tilion.org.uk/2012/01/notification-wrapper/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:45:42 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://ray.tilion.org.uk/?p=63</guid>
		<description><![CDATA[In a few of my projects I need to provide feedback using notifications, configurable by the user. What I need is a lightweight framework that allows a user to subscribe to notifications via various channels, e.g. growl, taskbar notification, email, &#8230; <a href="http://www.tilion.org.uk/2012/01/notification-wrapper/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In a few of my projects I need to provide feedback using notifications, configurable by the user. What I need is a lightweight framework that allows a user to subscribe to notifications via various channels, e.g. growl, taskbar notification, email, sms, instant message, etc.  Varying levels of severity, perhaps 5.</p>
<p>I&#8217;ve not researched this a huge amount, so there is likely something out there that can provide most of my requirements.  Initial searches show up web service solutions, but I need this to be local to the client machine or network for some channels of notification.</p>
<h2>Requirements</h2>
<ul>
<li>Subscribe to notifications from various channels with various levels of severity (thinking logging conifgurations)</li>
<li>Fire notification events and let the framework handle distributing them to the subscribers</li>
</ul>
<h2>Implementation</h2>
<ul>
<li>Configure new plugin wrapper via a configuration file &#8211; probably go down the <a href="http://www.springsource.org/" rel="nofollow">Spring</a> route for this</li>
<li>OSX growl implementation using a native libgrowl library</li>
<li>Windows growl implementation, <a href="http://sourceforge.net/projects/libgrowl/" rel="nofollow">libgrowl</a>, using the java library that supports GNTP (Growl Network Transport Protocol)</li>
<li>Java 6 system tray integration for taskbar notifications &#8211; looks crap on OSX</li>
</ul>
<h2>Progress</h2>
<p>Initial concept developed and working, but not a reusable library</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/01/notification-wrapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cue Sport Diagrams</title>
		<link>http://www.tilion.org.uk/2012/01/cue-sport-diagrams/</link>
		<comments>http://www.tilion.org.uk/2012/01/cue-sport-diagrams/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:44:43 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://ray.tilion.org.uk/?p=61</guid>
		<description><![CDATA[If you&#8217;re creating diagrams of ball positions on a pool table it would be much easier if there was a dedicated tool rather than trying to use a paint package all the time. Whether you&#8217;re trying to show your friends &#8230; <a href="http://www.tilion.org.uk/2012/01/cue-sport-diagrams/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re creating diagrams of ball positions on a pool table it would be much easier if there was a dedicated tool rather than trying to use a paint package all the time.  Whether you&#8217;re trying to show your friends a position from a recent frame or describing a practice routine, you&#8217;d need the same tools.</p>
<p>I came across a tool that does most of what you&#8217;d need, but it is based around US 9 ball tables.  The tool is called <a href="http://www.cuetable.com" rel="nofollow">Cue Table</a>, although it is a bit buried within the forum section of the site.</p>
<h2>Requirements</h2>
<ul>
<li>Select a cue sport table to show the correct background (7&#215;4 uk 8 ball, 6&#215;3 uk 8 ball, etc)</li>
<li>Drag and drop balls into position on the backgrond image</li>
<li>Create line paths if ball movement needs to be displayed</li>
<li>Create multiple scenes within a diagram if the scenario is better illustrated with multiple steps</li>
</ul>
<h2>Progress</h2>
<p>Draft version created and functional, below is a rough idea of the save format.</p>
<pre class="code">&lt;diagram name="Yesterday" width="800" height="450"&gt;
  &lt;scene name="Default"&gt;
    &lt;background image="7x4_uk8ball.jpeg"&gt;
      &lt;coord x="0" y="0"/&gt;
    &lt;/background&gt;
    &lt;icon name="red1" image="50mmRedBall.png"&gt;
      &lt;coord x="100" y="150"/&gt;
    &lt;/icon&gt;
    &lt;icon name="white1" image="50mmWhiteBall.png"&gt;
      &lt;coord x="190" y="150"/&gt;
    &lt;/icon&gt;
    &lt;path colour="red" arrowhead="end"&gt;
      &lt;coord x="100" y="150"/&gt;
      &lt;coord x="790" y="155"/&gt;
      &lt;coord x="650" y="160"/&gt;
    &lt;/path&gt;
  &lt;/scene&gt;
&lt;/diagram&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/01/cue-sport-diagrams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backup Tool</title>
		<link>http://www.tilion.org.uk/2012/01/backup-tool/</link>
		<comments>http://www.tilion.org.uk/2012/01/backup-tool/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:43:08 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://ray.tilion.org.uk/?p=59</guid>
		<description><![CDATA[Backup tools are not in short supply, but simplicity isn&#8217;t always a word I&#8217;d use to describe some solutions. I make extensive use of rsync, but without a simple equivalent on windows (although DeltaCopy looks promising) it&#8217;s hard to backup &#8230; <a href="http://www.tilion.org.uk/2012/01/backup-tool/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Backup tools are not in short supply, but simplicity isn&#8217;t always a word I&#8217;d use to describe some solutions.  I make extensive use of rsync, but without a simple equivalent on windows (although <a href="http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp" rel="nofollow">DeltaCopy</a> looks promising) it&#8217;s hard to backup consistently across many platforms. Having the backup storage mirror the files so you can easily navigate and restore a lost file is also important.</p>
<p>This tool isn&#8217;t very high on my list these days due to suitable alternatives.</></p>
<h2>Requirements</h2>
<ul>
<li>Backup files to a local disk</li>
<li>Backup files to a remote disk over FTP</li>
<li>Backup files to a remote disk over SFTP</li>
<li>Backup files allowing individual file transformations, i.e. zip, encryption</li>
</ul>
<h2>Progress</h2>
<p>Initial version developed, but poorly designed file wrapper class means rewrite is necessary</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/01/backup-tool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dropbox Clone</title>
		<link>http://www.tilion.org.uk/2012/01/dropbox-clone/</link>
		<comments>http://www.tilion.org.uk/2012/01/dropbox-clone/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:40:42 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://ray.tilion.org.uk/?p=57</guid>
		<description><![CDATA[Dropbox is a great idea with nice GUIs for multiple platforms, as well as a web interface. The problem is, if you&#8217;re a business you have to pay for a decent amount of storage &#8211; even 100GB isn&#8217;t enough sometimes. &#8230; <a href="http://www.tilion.org.uk/2012/01/dropbox-clone/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dropbox is a great idea with nice GUIs for multiple platforms, as well as a web interface.  The problem is, if you&#8217;re a business you have to pay for a decent amount of storage &#8211; even 100GB isn&#8217;t enough sometimes.  Plus, if your data is client confidential, the last thing you want to do is store it on a server out of your control.  You could put it in a truecrypt vault, but backing up a binary blob isn&#8217;t great considering it will need an update for each slight change (this may be negated somewhat by Dropbox using rsync style technology for only transfering binary differences, not the whole file).</p>
<p>There is a project in it&#8217;s early stages, as I write this (Oct 2010), that can solve some of the problems &#8211; <a href="http://www.sparkleshare.org/" rel="nofollow">SparkleShare</a>.  It allows you to use your own server to store the files, removing the problems of insufficient storage space and using untrusted servers to store your confidential data.</p>
<p> That&#8217;s it right?  Just wait for <a href="http://www.sparkleshare.org/" rel="nofollow">SparkleShare</a> to reach a production level product?  Well maybe &#8230; but I have more requirements for the environment I work in. We use a very large amount of disk space as we deal with video files, amongst other things. Employees tend to syncronise the parts of the remote storage they require to their local machine.  Changes are re-synchronised on a &#8216;updated files only&#8217; basis, but this is hardly full proof and only works at the moment due to the small number of employees with access. There is also no ability to backtrack changes, apart from resorting to the nightly backups. So, what would I like from a dropbox clone?</p>
<h2>Requirements</h2>
<ul>
<li>Dropbox style folder on local machine that automatically stays in sync with the server</li>
<li>File versioning with the ability to backtrack changes (binary blob only, no subversion style change tracking)</li>
<li>Web interface for remote file access</li>
<li>File/folder filtering to allow the local directory to only synchronise part of the remote storage, while keeping the folder structure (remember it may be huge!)</li>
<li>Remote storage accessed over common file transfer protocols, such as FTP, or more likely SFTP</li>
</ul>
<h2>Implementation</h2>
<ul>
<li>Local file system change monitoring using <a href-"http://jnotify.sourceforge.net/" rel="nofollow">JNotify</a></li>
<li>Hand crafted flat file DB system on remote storage to remove the need for a DB or server software.  The clients will understand how to interpret the meta files stored alongside the actual data files/folders.</li>
</ul>
<h2>Progress</h2>
<p>Planning &#8211; not started</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/01/dropbox-clone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JasperReports Tips</title>
		<link>http://www.tilion.org.uk/2012/01/jasperreports-tips/</link>
		<comments>http://www.tilion.org.uk/2012/01/jasperreports-tips/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:32:40 +0000</pubDate>
		<dc:creator>Darren</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://ray.tilion.org.uk/?p=55</guid>
		<description><![CDATA[JasperReports is a java based open source reporting framework with similar, if not more, functionality to that of Crystal Reports. There is a visual report designer called iReport, but my experience of using it for anything but the simplest report &#8230; <a href="http://www.tilion.org.uk/2012/01/jasperreports-tips/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="jasperreports.sourceforge.net/" rel="nofollow">JasperReports</a> is a java based open source reporting framework with similar, if not more, functionality to that of <a href="www.crystalreports.com">Crystal Reports</a>. There is a visual report designer called iReport, but my experience of using it for anything but the simplest report has been a waste.  It is useful for dragging and dropping report layouts around, but once you get the hang of it, it&#8217;s far easier to do it directly in XML.</p>
<p>Documentation is available, but it&#8217;s quite often difficult to get simple answers via a google search &#8211; as is possible for most open source software.  The current books also lack good examples when they explain some of the more powerful features.  Simple things like, I don&#8217;t want my report to have <em>null</em>s printed on it, what are my options are suprisingly awkward to locate!  My own, FAQs &#8230;</p>
<ul>
<li>
<strong>Null values in reports, what can I do?</strong><br/></p>
<p>If you want to replace the null value with a blank entry this is easy to achieve with the <em>isBlankWhenNull</em> attribute of <em>textField</em></p>
<pre class="code">&lt;textField isBlankWhenNull="true"&gt; ... &lt;/textField&gt;</pre>
<p>If you need to replace the null value with something else, you can do this directly in the report as shown below.  Using the ternary operator the GROUP_NAME field is checked for a null, if it is null the text <em>None</em> is used instead.</p>
<pre class="code">&lt;textFieldExpression&gt;(($F{GROUP_NAME} != null) ? $F{GROUP_NAME} : "None")&lt;/textFieldExpression&gt;</pre>
</li>
<li>
<strong>How to add a row count?</strong><br/></p>
<p>If you need a row count and don&#8217;t want to add unnecessary fields into the SQL statement you can use a variable. Straight after your <em>field</em> definitions include the following, assuming you have a field named <em>USER_NAME</em> in your fied definitions!</p>
<pre class="code">&lt;variable name="row_count" class="java.lang.Integer" calculation="Count"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;variableExpression&gt;&lt;![CDATA[$F{USER_NAME}]]&gt;&lt;/variableExpression&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;initialValueExpression&gt;&lt;![CDATA[new java.lang.Integer(0)]]&gt;&lt;/initialValueExpression&gt;
&lt;/variable&gt;</pre>
<p>This can be used in the report as follow</p>
<pre class="code">&lt;textField&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;reportElement x="0" y="0" width="30" height="20"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;textFieldExpression class="java.lang.Integer"&gt;&lt;![CDATA[$V{row_count}]]&gt;&lt;/textFieldExpression&gt;
&lt;/textField&gt;</pre>
</li>
<li>
<strong>Highlight certain rows depending on the value of other data?</strong><br/></p>
<p>If you need to highlight some text, the trick is to create two versions of the <em>textField</em> that displays it and use the &lt;printWhenExpression&gt; tag to determine which one displays the text.  The below example highlight in red if the <em>PASS_DATE</em> field is null.</p>
<pre class="code">&lt;!-- main textField --&gt;
&lt;textField&gt;
    &lt;reportElement x="466" y="0" width="228" height="20"&gt;
        &lt;printWhenExpression&gt;new Boolean($F{PASS_DATE} != null)&lt;/printWhenExpression&gt;
    &lt;/reportElement&gt;
    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{USER_NAME}]]&gt;&lt;/textFieldExpression&gt;
&lt;/textField&gt;

&lt;!-- highlight textField --&gt;
&lt;textField&gt;
    &lt;reportElement x="466" y="0" width="228" height="20" <strong>forecolor="red"</strong>&gt;
        &lt;printWhenExpression&gt;new Boolean($F{PASS_DATE} <strong>==</strong> null)&lt;/printWhenExpression&gt;
    &lt;/reportElement&gt;
    &lt;textFieldExpression class="java.lang.String"&gt;&lt;![CDATA[$F{USER_NAME}]]&gt;&lt;/textFieldExpression&gt;
&lt;/textField&gt;</pre>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tilion.org.uk/2012/01/jasperreports-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

