<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Malcolm Groves</title>
	
	<link>http://www.malcolmgroves.com/blog</link>
	<description />
	<lastBuildDate>Wed, 18 Apr 2012 07:56:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MalcolmGroves" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="malcolmgroves" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/MalcolmGroves" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMalcolmGroves" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Delphi, Dropbox and Live Templates</title>
		<link>http://www.malcolmgroves.com/blog/?p=984</link>
		<comments>http://www.malcolmgroves.com/blog/?p=984#comments</comments>
		<pubDate>Wed, 18 Apr 2012 03:57:12 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[Embarcadero]]></category>
		<category><![CDATA[Live Templates]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=984</guid>
		<description><![CDATA[<p>Live Templates have been in <a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &#187;">Delphi</a> and C++Builder since BDS2006 and they offer a way to automate a lot of routine typing in the code editor, especially if you put in the effort to both tailor the standard templates and create new templates. There are plenty of other, better, resources about Live Templates, like <a href="http://delphi.wikia.com/wiki/Delphi_Live_Templates" target="_blank">this</a>, and <a href="http://docwiki.embarcadero.com/RADStudio/en/Live_Templates" target="_blank">this</a>, so I don&#8217;t intend to go into how to write your own. </p>
<p>However, customisations like this are a dual-edged sword: yes, they can make you more productive, but sit down in front of a machine that doesn&#8217;t have them and suddenly you&#8217;re even less productive than before you started. This has been happening more and more frequently to me as I find myself using Delphi in multiple VMs on multiple machines in ... <a href="http://www.malcolmgroves.com/blog/?p=984">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Live Templates have been in <a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &raquo;">Delphi</a> and C++Builder since BDS2006 and they offer a way to automate a lot of routine typing in the code editor, especially if you put in the effort to both tailor the standard templates and create new templates. There are plenty of other, better, resources about Live Templates, like <a href="http://delphi.wikia.com/wiki/Delphi_Live_Templates" target="_blank">this</a>, and <a href="http://docwiki.embarcadero.com/RADStudio/en/Live_Templates" target="_blank">this</a>, so I don&#8217;t intend to go into how to write your own. </p>
<p>However, customisations like this are a dual-edged sword: yes, they can make you more productive, but sit down in front of a machine that doesn&#8217;t have them and suddenly you&#8217;re even less productive than before you started. This has been happening more and more frequently to me as I find myself using Delphi in multiple VMs on multiple machines in multiple physical locations.</p>
<p>My Live Templates are in version control, so for awhile I was just trying to remember to checkout the latest versions prior to starting the IDE, but I&#8217;d forget more often than not, so while I intend keeping them in version control, this isn&#8217;t the solution I&#8217;m looking for.</p>
<p>What I want is a way to make sure my Live Templates are kept up to date on every machine, physical or virtual, with no ongoing intervention on my part. You know, kind of like Dropbox? </p>
<p>Well, actually, exactly like Dropbox.   </p>
<p>When this realisation hit me, I got very excited. I already had Dropbox installed in most of the VMs I was using, so it should be a relatively easy thing to tell it to sync the xml files <a href="http://www.embarcadero.com/products/rad-studio" class="kblinker" target="_blank" title="More about RAD Studio &raquo;">RAD Studio</a> uses to store Live Templates, right?</p>
<p>Yes&#8230; and no. </p>
<p>Getting Dropbox to sync them is stupidly easy. I created a templates folder in my Dropbox folder and copied all my custom Live Templates into it (actually, checked them out of version control, but that&#8217;s beside the point). I gave Dropbox some time to do its magic and Bob&#8217;s your father&#8217;s brother, my templates are on all my machines!</p>
<p>Now I just have to tell all my instances of Delphi to look in this <code>dropbox/templates</code> folder. That should be as easy as setting the path to my Live Templates folder in the IDE options, and&#8230;.err, hang on, there&#8217;s no IDE option for that? </p>
<p>OK Delphi, you&#8217;re gonna make me earn this I see. </p>
<p>So let&#8217;s have a look. In a default installation, the standard Live Templates that come with RAD Studio are stored in:</p>
<p><code>C:\Program Files\Embarcadero\RAD Studio\9.0\ObjRepos\en\Code_Templates</code></p>
<p>In addition, the IDE will look for any custom Live Templates you create in:</p>
<p><code>C:\Users\mgroves\Documents\RAD Studio\code_templates</code></p>
<p>Hmmm, that ObjRepos bit in the first path gives me an idea.</p>
<p><strong>Attempt 1:</strong> There is an IDE option for setting a <a href="http://docwiki.embarcadero.com/RADStudio/en/Using_the_Object_Repository" target="_blank">Shared Object Repository</a>, really meant for sharing common forms and projects across a team so they are visible when you use File | New. This was there long before Live Templates were even a glimmer in someone&#8217;s eye, but still, maybe it&#8217;ll work for everything under that directory?</p>
<p><a href="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/04/Screen-shot-2012-04-14-at-9.53.07-PM.png"><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/04/Screen-shot-2012-04-14-at-9.53.07-PM.png" alt="" title="Delphi Shared Object Repository" width="494" height="139" class="aligncenter size-full wp-image-997" /></a></p>
<p>Unfortunately not. This could still be useful for sharing Object Gallery forms and projects across machines, if you use that feature, but no luck for templates.</p>
<p><strong>Attempt 2:</strong> I didn&#8217;t really expect this one to work, but it was so easy to try I thought I&#8217;d quickly rule it out. I created a Windows Shortcut to my LiveTemplates DropBox folder inside my <code>C:\Users\mgroves\Documents\RAD Studio\code_templates</code> folder. Windows Explorer was happy, but the IDE was not fooled. </p>
<p><strong>Attempt 3:</strong> OK, being polite didn&#8217;t get me anywhere, so let&#8217;s try a different tack: regedit. I spelunked around in the IDE registry keys for quite awhile, sure that I would find an option to change to tell the IDE where to look for user-defined Live Templates. It may well be there, but I didn&#8217;t find it. </p>
<p>I gave up and went and had a coffee. Something about Attempt 2 with the shortcut was nagging at me. I vaguely remembered something about a later Windows version getting a feature like Symbolic Links from Unix. Couldn&#8217;t remember what they were called, but basically, Shortcuts done properly. When I got back, a quick search revealed that in fact I was right, and that in Windows they were cunningly called&#8230;.Symbolic Links. Read up on them <a href="http://en.wikipedia.org/wiki/NTFS_symbolic_link" target="_blank">here</a>, but they are NTFS specific and introduced with Windows Vista. <strong>NB</strong>: See the comment below from Stefano Moratto about the <code>junction</code> command line tool, that looks like it will probably work for earlier versions of windows such as XP. </p>
<p>You create a Symbolic Link at the command line using <code>mklink</code>. You&#8217;ll need Administrator rights to do this, so start up <code>cmd.exe</code> as Administrator, navigate to your user-defined live templates folder (in my case <code>C:\Users\mgroves\Documents\RAD Studio\code_templates</code>) and type the following command:</p>
<p><code>mklink /D SharedTemplates c:\Users\mgroves\Dropbox\templates</code></p>
<p>The params are:</p>
<li><code>/D</code> &#8211; tells it to create a symbolic link to a directory rather than a file</li>
<li><code>SharedTemplates</code> &#8211; the name of the symbolic link that will be created</li>
<li><code>c:\Users\mgroves\Dropbox\templates</code> &#8211; the directory to which the symbolic link should point. In this case, my templates folder being sync&#8217;d by Dropbox.</li>
<p>Do all that properly and you should see a message like this:</p>
<p><code>symbolic link created for SharedTemplates <<===>> c:\Users\mgroves\Dropbox\templates</code></p>
<p>Now, if my theory works, as far as RAD Studio is concerned, the contents of my Dropbox templates folder is actually in a subdirectory of <code>C:\Users\mgroves\Documents\RAD Studio\code_templates</code> called <code>SharedTemplates</code>. </p>
<p><a href="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/04/symboliclink.gif"><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/04/symboliclink.gif" alt="" title="symboliclink" width="676" height="244" class="aligncenter size-full wp-image-998" /></a></p>
<p>Indeed, my theory did work. Firing up the IDE shows that all the templates in that dropbox/templates directory are available when you hit Ctrl-J, and Dropbox takes care of the hard work of keeping all my machines up to date. </p>
<p>This will probably also work if you&#8217;re using some other service apart from Dropbox. It could also be a way to get multiple people on your team sharing a single set of templates from a shared network folder, as a few people have asked about.</p>
<p>Oh, and if you don&#8217;t already use Dropbox, then consider signing up using this <a href="https://www.dropbox.com/referrals/NTM2NDEyNjI5?src=global9" target="_blank">link</a> and we both get an extra 500MB of space (yes, I&#8217;m shameless, I know, but I shove a LOT of stuff into dropbox).</p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/QkwEWSYb5d0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=984</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Tiny USB Wifi Access Point</title>
		<link>http://www.malcolmgroves.com/blog/?p=935</link>
		<comments>http://www.malcolmgroves.com/blog/?p=935#comments</comments>
		<pubDate>Sat, 14 Apr 2012 06:09:09 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Travel Tech]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=935</guid>
		<description><![CDATA[<p>I travel a lot for work, and a surprising number of the hotels at which I stay still don&#8217;t have in-room wifi. Because of this, I&#8217;ve carried an <a href="http://www.apple.com/airportexpress/" target="_blank">Apple Airport Express</a> in my luggage for a couple of years, so that I can have my phone and tablet online while in my room, in addition to my laptop. </p>
<p>Wandering through an electronics store here in Tokyo this afternoon, I came across something confusingly also called an <a href="http://www.iodata.jp/product/network/wnlan/wn-g150tr/" target="_blank">AirPort</a>, from a company called I-O Data. Packaging was all in Japanese, however after a bit of deciphering of diagrams and the odd technical word in English, I realised it was a tiny, USB-powered wifi access point. How tiny? I think the technical term is &#8220;bloody tiny&#8221;. Here&#8217;s a photo beside my Airport Express. </p>
<p><a href="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/02/airport-meet-airport.jpg"></a></p>
<p>Small enough to be permanently ... <a href="http://www.malcolmgroves.com/blog/?p=935">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>I travel a lot for work, and a surprising number of the hotels at which I stay still don&#8217;t have in-room wifi. Because of this, I&#8217;ve carried an <a href="http://www.apple.com/airportexpress/" target="_blank">Apple Airport Express</a> in my luggage for a couple of years, so that I can have my phone and tablet online while in my room, in addition to my laptop. </p>
<p>Wandering through an electronics store here in Tokyo this afternoon, I came across something confusingly also called an <a href="http://www.iodata.jp/product/network/wnlan/wn-g150tr/" target="_blank">AirPort</a>, from a company called I-O Data. Packaging was all in Japanese, however after a bit of deciphering of diagrams and the odd technical word in English, I realised it was a tiny, USB-powered wifi access point. How tiny? I think the technical term is &#8220;bloody tiny&#8221;. Here&#8217;s a photo beside my Airport Express. </p>
<p><a href="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/02/airport-meet-airport.jpg"><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2012/02/airport-meet-airport-300x194.jpg" alt="" title="airport-meet-airport" width="300" height="194" class="aligncenter size-medium wp-image-938" /></a></p>
<p>Small enough to be permanently connected in my USB travel pack, which is a small, padded, zip-up case I&#8217;ve kept in my laptop bag for a few years now, containing a portable HDD, a few cables (iPhone, micro-USB, etc) and now, a wifi access point, all permanently connected to a USB hub (also in the case). One USB cable to plug in, no need to even unzip it, everything I need already connected, and only one thing to remember to pack up again.</p>
<p>Reasonably cheap too. 2,300 yen, which is less than $30 US. </p>
<p>Anyone want to buy an Airport Express? Only one owner! </p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/1S1unzMSrs8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=935</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avoiding Distributed Transactions</title>
		<link>http://www.malcolmgroves.com/blog/?p=968</link>
		<comments>http://www.malcolmgroves.com/blog/?p=968#comments</comments>
		<pubDate>Thu, 29 Mar 2012 08:16:00 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Distributed Systems]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=968</guid>
		<description><![CDATA[<p>Last week I presented on &#8220;Building Distributed Applications That Don&#8217;t Suck&#8221; twice at the <a href="http://www.adug.org.au/meetings/Symposia/2012/">ADUG conferences</a> in Melbourne and Canberra. As the name may suggest, it&#8217;s a heavily opinionated session about the common mistakes people make when building distributed systems, and some techniques you can use to avoid the mistakes. </p>
<p>One of the great things about opinionated sessions is that they spark arguments, and I have thoroughly enjoyed the discussions that started during the breaks between sessions and that have continued on in email since then.  One of those discussions has been around distributed transactions, and my advice to actively look for opportunities to avoid them. In the session I discussed how, where the business rules allowed, you could use things like Idempotency and even ordering of inserts to avoid the cost of a distributed transaction. However, it ... <a href="http://www.malcolmgroves.com/blog/?p=968">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Last week I presented on &#8220;Building Distributed Applications That Don&#8217;t Suck&#8221; twice at the <a href="http://www.adug.org.au/meetings/Symposia/2012/">ADUG conferences</a> in Melbourne and Canberra. As the name may suggest, it&#8217;s a heavily opinionated session about the common mistakes people make when building distributed systems, and some techniques you can use to avoid the mistakes. </p>
<p>One of the great things about opinionated sessions is that they spark arguments, and I have thoroughly enjoyed the discussions that started during the breaks between sessions and that have continued on in email since then.  One of those discussions has been around distributed transactions, and my advice to actively look for opportunities to avoid them. In the session I discussed how, where the business rules allowed, you could use things like Idempotency and even ordering of inserts to avoid the cost of a distributed transaction. However, it was the topic of <a href="http://en.wikipedia.org/wiki/Eventual_consistency">Eventual Consistency</a> that caused the most angst. </p>
<p>In a single RDBMS, we&#8217;re very often taught to wrap changes in a transaction, so that they succeed or fail as a single unit. It&#8217;s also through transactions that we can control the visibility of changes. This is all about ensuring that outside the bounds of that transaction, our data is consistent. All hail <a href="http://en.wikipedia.org/wiki/ACID">ACID</a>!</p>
<p>However in a distributed environment, this strong pursuit of consistency comes at the cost of either availability or partition tolerance (see the <a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP Theorem</a>). Hence the idea that where you see an opportunity to tolerate an inconsistent state for awhile, you may benefit from taking advantage of it. </p>
<p>This can be hard to swallow initially, as a number of people made clear. I struggled with it when I was first introduced to the idea. It doesn&#8217;t apply everywhere, there are some business processes where you absolutely need immediate consistency, however over time I&#8217;ve been surprised at how often I can either relax the consistency for a particular process, or at least minimize the scope of the data that needed to be immediately consistent. </p>
<p>The discussion of Eventual Consistency has had a revival of late with the rise of NoSQL databases, and one of the better discussions I&#8217;ve heard is on an <a href="http://www.se-radio.net/2010/07/episode-165-nosql-and-mongodb-with-dwight-merriman/">episode of Software Engineering Radio with Dwight Merriman</a> from <a href="http://www.10gen.com/">10Gen</a>, the folks behind <a href="http://www.mongodb.org/">MongoDB</a>. If this is new territory for you, and you don&#8217;t mind having your assumptions challenged, I recommend you have a listen. </p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/S-me4I3gYjM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=968</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opening files and URLs in default applications in OS X</title>
		<link>http://www.malcolmgroves.com/blog/?p=887</link>
		<comments>http://www.malcolmgroves.com/blog/?p=887#comments</comments>
		<pubDate>Thu, 29 Sep 2011 04:40:32 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[FireMonkey]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Embarcadero]]></category>
		<category><![CDATA[OS X API]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=887</guid>
		<description><![CDATA[<p>After my article on <a href="http://www.malcolmgroves.com/blog/?p=865">Special Folders</a>, a few people asked how to open a file in the default application. </p>
<p>For example, if I open a JPEG, whichever application is registered as the default app for JPEGs will execute. This is roughly analogous to ShellExecute in Windows. </p>
<p>The question was also asked about opening a URL in the default browser and also sending an email with the default mail application. These are closely related so I&#8217;ll cover them at the same time. </p>
<p>It&#8217;s actually pretty easy. I&#8217;ve got a TOpenDialog on a form, and the following code in a TButton.OnClick event:</p>

procedure TForm2.Button1Click&#40;Sender: TObject&#41;;
var
  Workspace : NSWorkspace;
begin
  if OpenDialog1.Execute then
  begin
    Label1.Text := OpenDialog1.FileName;
    Workspace := TNSWorkspace.Create;
    Workspace.openFile&#40;NSSTR&#40;Label1.Text&#41;&#41;;
  end;
end;

<p>Once we have the filename from the TOpenDialog, we create ... <a href="http://www.malcolmgroves.com/blog/?p=887">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>After my article on <a href="http://www.malcolmgroves.com/blog/?p=865">Special Folders</a>, a few people asked how to open a file in the default application. </p>
<p>For example, if I open a JPEG, whichever application is registered as the default app for JPEGs will execute. This is roughly analogous to ShellExecute in Windows. </p>
<p>The question was also asked about opening a URL in the default browser and also sending an email with the default mail application. These are closely related so I&#8217;ll cover them at the same time. </p>
<p>It&#8217;s actually pretty easy. I&#8217;ve got a TOpenDialog on a form, and the following code in a TButton.OnClick event:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">procedure</span> TForm2<span style="color: #000066;">.</span><span style="color: #006600;">Button1Click</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  Workspace <span style="color: #000066;">:</span> NSWorkspace<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  <span style="color: #000000; font-weight: bold;">if</span> OpenDialog1<span style="color: #000066;">.</span><span style="color: #006600;">Execute</span> <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    Label1<span style="color: #000066;">.</span><span style="color: #006600;">Text</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> OpenDialog1<span style="color: #000066;">.</span><span style="color: #006600;">FileName</span><span style="color: #000066;">;</span>
    Workspace <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSWorkspace<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    Workspace<span style="color: #000066;">.</span><span style="color: #006600;">openFile</span><span style="color: #000066;">&#40;</span>NSSTR<span style="color: #000066;">&#40;</span>Label1<span style="color: #000066;">.</span><span style="color: #006600;">Text</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Once we have the filename from the TOpenDialog, we create a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html">NSWorkspace</a> reference and use the openFile method, converting the filename string to a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html">NSString</a> on the way. NSWorkspace is defined in Macapi.Appkit and the NSSTR function to convert a String to a NSString is defined in Macapi.Foundation;</p>
<p>Opening a URL in a browser is slightly longer but not much:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">procedure</span> TForm2<span style="color: #000066;">.</span><span style="color: #006600;">Button3Click</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  URL <span style="color: #000066;">:</span> NSURL<span style="color: #000066;">;</span>
  Workspace <span style="color: #000066;">:</span> NSWorkspace<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
    URL <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSURL<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    URL<span style="color: #000066;">.</span><span style="color: #006600;">initWithString</span><span style="color: #000066;">&#40;</span>NSSTR<span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'http://www.malcolmgroves.com'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
    Workspace <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSWorkspace<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    Workspace<span style="color: #000066;">.</span><span style="color: #006600;">openURL</span><span style="color: #000066;">&#40;</span>URL<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Instead of the NSWorkspace.openFile method, we need to use openURL. This expects a NSURL as a parameter, so we construct that and load it up with the initWithString method, again converting our String to a NSString along the way. Executing that code causes Safari (on my machine) to open my website.</p>
<p>Opening a new mail and setting the To, Subject and Body is much the same, just down to the string we pass into our NSURL:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">procedure</span> TForm2<span style="color: #000066;">.</span><span style="color: #006600;">Button2Click</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  URL <span style="color: #000066;">:</span> NSURL<span style="color: #000066;">;</span>
  Workspace <span style="color: #000066;">:</span> NSWorkspace<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
    URL <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSURL<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    URL<span style="color: #000066;">.</span><span style="color: #006600;">initWithString</span><span style="color: #000066;">&#40;</span>NSSTR<span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'mailto:fred@flintstones.com?subject=Hello&amp;body=Hello%20Fred'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
    Workspace <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSWorkspace<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    Workspace<span style="color: #000066;">.</span><span style="color: #006600;">openURL</span><span style="color: #000066;">&#40;</span>URL<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>You can download the sample project <a href="http://code.google.com/p/malcolmgrovessamples/downloads/detail?name=OpenDocument.zip">here</a> and the code has been added to my sample code SVN repository <a href="http://code.google.com/p/malcolmgrovessamples/">here</a>.</p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/tH_X533pTQk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=887</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interesting use of 3D UI in music software</title>
		<link>http://www.malcolmgroves.com/blog/?p=882</link>
		<comments>http://www.malcolmgroves.com/blog/?p=882#comments</comments>
		<pubDate>Tue, 27 Sep 2011 02:12:06 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[FireMonkey]]></category>
		<category><![CDATA[Music Tech]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=882</guid>
		<description><![CDATA[<p>Awhile back I <a href="http://www.malcolmgroves.com/blog/?p=819">wrote</a> about music technology being one of the areas pushing new user interface\interaction technologies, such as the Kinect, and the Wii before it.</p>
<p>Well, I&#8217;m a little behind on this one, but this video preview of AudioGL is another example, this time in terms of 3D UI. </p>
<p></p>
<p>Apart from the opening credits, the first section is a pretty standard, albeit slick, 2D interface along the lines of other modular DAWs  or instruments. However, around the 8 minute mark he suddenly zooms back from that 2D interface to show all the modules connected on a plane, with the automation tracks flowing through the property on the 2D interface and away to a vanishing point in the distance. Shades of Tron meet Dance Dance Revolution. </p>
<p>I have no idea if this interface would be useful or usable for ... <a href="http://www.malcolmgroves.com/blog/?p=882">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Awhile back I <a href="http://www.malcolmgroves.com/blog/?p=819">wrote</a> about music technology being one of the areas pushing new user interface\interaction technologies, such as the Kinect, and the Wii before it.</p>
<p>Well, I&#8217;m a little behind on this one, but this video preview of AudioGL is another example, this time in terms of 3D UI. </p>
<p><object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/bCC9uHHAEuA?version=3"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/bCC9uHHAEuA?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"></object></p>
<p>Apart from the opening credits, the first section is a pretty standard, albeit slick, 2D interface along the lines of other modular DAWs  or instruments. However, around the 8 minute mark he suddenly zooms back from that 2D interface to show all the modules connected on a plane, with the automation tracks flowing through the property on the 2D interface and away to a vanishing point in the distance. Shades of Tron meet Dance Dance Revolution. </p>
<p>I have no idea if this interface would be useful or usable for composition, it appears it may be more oriented towards performance, but I&#8217;m impressed with the leap of imagination taken to render automation on the &#8220;z axis&#8221;, and I&#8217;m now wondering about the possibilities for generating 3D datapoints dynamically and the applicability to other domains.</p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/lXbb2HO2fys" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=882</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cross-platform Special Folders in FireMonkey</title>
		<link>http://www.malcolmgroves.com/blog/?p=865</link>
		<comments>http://www.malcolmgroves.com/blog/?p=865#comments</comments>
		<pubDate>Thu, 22 Sep 2011 12:18:01 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[FireMonkey]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Cross Platform]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Embarcadero]]></category>
		<category><![CDATA[OS X API]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=865</guid>
		<description><![CDATA[<p>There was a question on the <a href="http://www.adug.org.au/Admin/mailing_list.htm">ADUG list</a> last week about how to retrieve &#8220;special folder&#8221; locations on OS X. By special folder, I mean locations like the user&#8217;s Home directory, the Documents directory, Temp directory, etc. I thought I&#8217;d write up the solution both because it&#8217;s probably something that more people will be wondering and also because it&#8217;s a nice little introduction to calling out to the OS X API.</p>
<p>If you want either the path to the Home or the Temp directory, this is ridiculously easy. The <a href="http://docwiki.embarcadero.com/VCL/en/IOUtils" target="_blank">IOUtils</a> unit already contains TPath.GetTempPath and TPath.GetHomePath, and these work on both Windows and OS X.</p>
<p>However, if you want another directory, such as the Documents directory, you need to do a little more work.</p>
<p>I&#8217;m sure many of you have done this same thing on Windows, using the Windows API ... <a href="http://www.malcolmgroves.com/blog/?p=865">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>There was a question on the <a href="http://www.adug.org.au/Admin/mailing_list.htm">ADUG list</a> last week about how to retrieve &#8220;special folder&#8221; locations on OS X. By special folder, I mean locations like the user&#8217;s Home directory, the Documents directory, Temp directory, etc. I thought I&#8217;d write up the solution both because it&#8217;s probably something that more people will be wondering and also because it&#8217;s a nice little introduction to calling out to the OS X API.</p>
<p>If you want either the path to the Home or the Temp directory, this is ridiculously easy. The <a href="http://docwiki.embarcadero.com/VCL/en/IOUtils" target="_blank">IOUtils</a> unit already contains TPath.GetTempPath and TPath.GetHomePath, and these work on both Windows and OS X.</p>
<p>However, if you want another directory, such as the Documents directory, you need to do a little more work.</p>
<p>I&#8217;m sure many of you have done this same thing on Windows, using the Windows API SHGetFolderPath, like this:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">function</span> GetDocumentDirectory <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">var</span>
    szBuffer<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span>0<span style="color: #000066;">..</span><span style="color: #006600;">MAX_PATH</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Char</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    OleCheck <span style="color: #000066;">&#40;</span>SHGetFolderPath <span style="color: #000066;">&#40;</span> FmxHandleToHWND<span style="color: #000066;">&#40;</span>Handle<span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span>
                               CSIDL_MYDOCUMENTS<span style="color: #000066;">,</span>
                               <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span>
                               <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span>
                               szBuffer<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> szBuffer<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>As an aside, the first parameter to the SHGetFolderPath is a HWND. In VCL, you could just pass in the Handle of the form, however in FireMonkey the Window handle is a TFmxHandle, not a HWND. The Fmx.Platform.Win unit contains a FmxHandleToHWND function that, as the name suggests, will take your FireMOnkey handle and give you back a HWND. </p>
<p>So, back to the point, if this is how we do it in FireMonkey on Windows, how do we do it on OS X? Let&#8217;s have a look:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">function</span> GetDocumentDirectory <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">var</span>
    FileMgr <span style="color: #000066;">:</span> NSFileManager<span style="color: #000066;">;</span>
    URL <span style="color: #000066;">:</span> NSURL<span style="color: #000066;">;</span>
    Error <span style="color: #000066;">:</span> NSError<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    FileMgr <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TNSFileManager<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span>
    URL <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FileMgr<span style="color: #000066;">.</span><span style="color: #006600;">URLForDirectory</span><span style="color: #000066;">&#40;</span>NSDocumentDirectory<span style="color: #000066;">,</span>
                                   NSUserDomainMask<span style="color: #000066;">,</span>
                                   <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span>
                                   <span style="color: #000000; font-weight: bold;">false</span><span style="color: #000066;">,</span>
                                   Error<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">Assigned</span><span style="color: #000066;">&#40;</span>Error<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #000000; font-weight: bold;">raise</span> Exception<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">&#40;</span>Error<span style="color: #000066;">.</span><span style="color: #006600;">localizedDescription</span><span style="color: #000066;">.</span><span style="color: #006600;">UTF8String</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
    Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> URL<span style="color: #000066;">.</span><span style="color: #006600;">path</span><span style="color: #000066;">.</span><span style="color: #006600;">UTF8String</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>First thing we do is get a reference to a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html" target="_blank">NSFileManager</a> interface. It, and the TNSFileManager class that implements it, can be found in the Macapi.Foundation unit. </p>
<p>Once we have our NSFileManager reference, we can use the URLForDirectory method, which is roughly equivalent to the SHGetFolderPath call in the Windows example. We need to pass in a NSError variable and then check it to make sure everything worked OK. We raise an exception if not. </p>
<p>However, what we get back from URLForDirectory is not a string but a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html" target="_blank">NSURL</a> instance. In order to get a string containing the path, we use, not surprisingly, NSURL.Path. However, this also is not a String, it&#8217;s a <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html%23//apple_ref/doc/c_ref/NSString" target="_blank">NSString</a>. How do we convert that to a string? Well, NSString.UTF8String is a quick, easy way to get back a UTF8 encoded string. If you want a different encoding, check out some of the other extraction methods on NSString. <strong>Update</strong> : Chris Rolliston has written a <a href="http://delphihaven.wordpress.com/2011/09/26/converting-from-a-cocoa-string-to-a-delphi-string/" target="_blank">nice follow-up post</a> digging into converting NSStrings to <a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &raquo;">Delphi</a> Strings in much more detail. </p>
<p>In the example project, once I have the full path of the Documents directory, I use the IOUtils classes to enumerate over the folders and files in that folder and add the names to a listbox:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span>
  DocumentsPath<span style="color: #000066;">,</span> Filename <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">String</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  DocumentsPath <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GetDocumentDirectory<span style="color: #000066;">;</span>
  Label1<span style="color: #000066;">.</span><span style="color: #006600;">Text</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DocumentsPath<span style="color: #000066;">;</span>
&nbsp;
&nbsp;
  <span style="color: #000000; font-weight: bold;">for</span> Filename <span style="color: #000000; font-weight: bold;">in</span> TDirectory<span style="color: #000066;">.</span><span style="color: #006600;">GetDirectories</span><span style="color: #000066;">&#40;</span>DocumentsPath<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span>
    Listbox1<span style="color: #000066;">.</span><span style="color: #006600;">Items</span><span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Format</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Folder : %s'</span><span style="color: #000066;">,</span> <span style="color: #000066;">&#91;</span>Filename<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">for</span> Filename <span style="color: #000000; font-weight: bold;">in</span> TDirectory<span style="color: #000066;">.</span><span style="color: #006600;">GetFiles</span><span style="color: #000066;">&#40;</span>DocumentsPath<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span>
    Listbox1<span style="color: #000066;">.</span><span style="color: #006600;">Items</span><span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Format</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'File : %s'</span><span style="color: #000066;">,</span> <span style="color: #000066;">&#91;</span>Filename<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Here&#8217;s the resulting app on Windows: </p>
<p><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-22-at-10.05.32-PM.png" alt="Screen shot 2011 09 22 at 10 05 32 PM" title="Screen shot 2011-09-22 at 10.05.32 PM.png" border="0" width="441" height="453" /></p>
<p>and on OSX:</p>
<p><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-22-at-10.07.25-PM.png" alt="Screen shot 2011 09 22 at 10 07 25 PM" title="Screen shot 2011-09-22 at 10.07.25 PM.png" border="0" width="427" height="438" /></p>
<p>You can download the sample project <a href="http://code.google.com/p/malcolmgrovessamples/downloads/detail?name=SpecialFolders.zip">here</a> and the code has been added to my sample code SVN repository <a href="http://code.google.com/p/malcolmgrovessamples/">here</a></p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/vIAcrylHnT4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=865</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Delphi XE2 and FireMonkey in Canberra this Wednesday</title>
		<link>http://www.malcolmgroves.com/blog/?p=858</link>
		<comments>http://www.malcolmgroves.com/blog/?p=858#comments</comments>
		<pubDate>Mon, 19 Sep 2011 06:35:26 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Embarcadero]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=858</guid>
		<description><![CDATA[<p>I&#8217;ll be in Canberra showing off <a href="http://www.embarcadero.com/products/rad-studio">Delphi XE2 and FireMonkey</a> this Wednesday for <a href="http://www.adug.org.au/">ADUG</a>. I know numbers are limited (we&#8217;ve been hitting venue capacity in most cities this tour) so if you&#8217;re going to be in the area, head <a href="http://services.adug.org.au/cgi-bin/ADUGWebServices.exe?Events?1446">here</a> to register. </p>
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be in Canberra showing off <a href="http://www.embarcadero.com/products/rad-studio">Delphi XE2 and FireMonkey</a> this Wednesday for <a href="http://www.adug.org.au/">ADUG</a>. I know numbers are limited (we&#8217;ve been hitting venue capacity in most cities this tour) so if you&#8217;re going to be in the area, head <a href="http://services.adug.org.au/cgi-bin/ADUGWebServices.exe?Events?1446">here</a> to register. </p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/Bj4iSorv7po" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=858</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Have your say on the topics for the 2012 ADUG Symposium.</title>
		<link>http://www.malcolmgroves.com/blog/?p=852</link>
		<comments>http://www.malcolmgroves.com/blog/?p=852#comments</comments>
		<pubDate>Thu, 15 Sep 2011 07:15:48 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[ADUG]]></category>
		<category><![CDATA[Embarcadero]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=852</guid>
		<description><![CDATA[<p>The <a href="http://www.adug.org.au/">ADUG</a> Committee have started organising next year&#8217;s <a href="http://www.adug.org.au/meetings/Symposia/2011/default.html">Symposium</a>, and have created a <a href="https://www.surveymonkey.com/s/9QJMNBW">short survey</a> for feedback on topics that you might want to see. So, if you&#8217;re a Delphi or C++Builder developer and there&#8217;s a reasonable chance you&#8217;ll be in Australia around March or April of next year, then make yourself heard by filling out <a href="https://www.surveymonkey.com/s/9QJMNBW">the survey</a>. </p>
]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.adug.org.au/">ADUG</a> Committee have started organising next year&#8217;s <a href="http://www.adug.org.au/meetings/Symposia/2011/default.html">Symposium</a>, and have created a <a href="https://www.surveymonkey.com/s/9QJMNBW">short survey</a> for feedback on topics that you might want to see. So, if you&#8217;re a Delphi or C++Builder developer and there&#8217;s a reasonable chance you&#8217;ll be in Australia around March or April of next year, then make yourself heard by filling out <a href="https://www.surveymonkey.com/s/9QJMNBW">the survey</a>. </p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/3CEqLGmxvqU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=852</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OS X : Folder Comparison with FileMerge</title>
		<link>http://www.malcolmgroves.com/blog/?p=842</link>
		<comments>http://www.malcolmgroves.com/blog/?p=842#comments</comments>
		<pubDate>Wed, 07 Sep 2011 03:58:33 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[OS X 101]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=842</guid>
		<description><![CDATA[<p>I know a number of people in the <a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &#187;">Delphi</a> and C++Builder world are taking their first steps into OS X. To be honest, I&#8217;m not that many steps in either. So I thought I&#8217;d start posting some tips as I strike problems and solve them, so hopefully it&#8217;ll help someone else. </p>
<p>Today&#8217;s problem (and solution) was the need to do a file and folder comparison on OS X. I&#8217;d had a few reports that this blog was not working properly on older versions of Firefox (Firefox 3.6) and wanted to see if I&#8217;d mucked up anything when changing the theme. I downloaded a fresh copy of the base theme and wanted to see all the differences between it and the version I&#8217;m using. </p>
<p>I was about to try and dust off my unix ... <a href="http://www.malcolmgroves.com/blog/?p=842">Read More &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>I know a number of people in the <a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &raquo;">Delphi</a> and C++Builder world are taking their first steps into OS X. To be honest, I&#8217;m not that many steps in either. So I thought I&#8217;d start posting some tips as I strike problems and solve them, so hopefully it&#8217;ll help someone else. </p>
<p>Today&#8217;s problem (and solution) was the need to do a file and folder comparison on OS X. I&#8217;d had a few reports that this blog was not working properly on older versions of Firefox (Firefox 3.6) and wanted to see if I&#8217;d mucked up anything when changing the theme. I downloaded a fresh copy of the base theme and wanted to see all the differences between it and the version I&#8217;m using. </p>
<p>I was about to try and dust off my unix command knowledge when I wondered if XCode had anything. A little digging turned up FileMerge in /Developer/Applications/Utilities. Starting it up you are presented with the following screen:</p>
<p><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-07-at-1.44.15-PM.png" alt="Screen shot 2011 09 07 at 1 44 15 PM" title="Screen shot 2011-09-07 at 1.44.15 PM.png" border="0" width="526" height="163" /></p>
<p>Despite the Caption, you can actually specify a folder name rather than just a filename. If you do so, and then click Compare, it&#8217;ll present you with a screen showing common files in grey, and files that are either unique to one folder, or different in both folders, in black.</p>
<p><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-07-at-1.50.01-PM.png" alt="Screen shot 2011 09 07 at 1 50 01 PM" title="Screen shot 2011-09-07 at 1.50.01 PM.png" border="0" width="575" height="465" /></p>
<p>Selecting one of the black files displays the details of the differences at the bottom, and then clicking on View gives you several options, including Comparison which will bring up a traditional side-by-side view.</p>
<p><img src="http://www.malcolmgroves.com/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-07-at-1.53.36-PM.png" alt="Screen shot 2011 09 07 at 1 53 36 PM" title="Screen shot 2011-09-07 at 1.53.36 PM.png" border="0" width="600" height="481" /></p>
<p>It&#8217;s no <a href="http://www.scootersoftware.com/moreinfo.php">BeyondCompare</a>, but it helped me find and solve the problem quickly.</p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/Zg-K9H3VNEA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=842</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RAD Studio World Tour, now with more cities and a few more details.</title>
		<link>http://www.malcolmgroves.com/blog/?p=826</link>
		<comments>http://www.malcolmgroves.com/blog/?p=826#comments</comments>
		<pubDate>Mon, 25 Jul 2011 23:41:05 +0000</pubDate>
		<dc:creator>Malcolm</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Embarcadero]]></category>

		<guid isPermaLink="false">http://www.malcolmgroves.com/blog/?p=826</guid>
		<description><![CDATA[<p>I promised to post more details of these upcoming events when I could. Well, now I can. </p>
<p>Current cities:</p>

<a href="http://forms.embarcadero.com/forms/APNZRADStudioWorldTourEvent">Auckland</a> (04 August 2011)
<a href="http://forms.embarcadero.com/forms/APAURADWorldTourEvent">Australia</a> (Sydney/Melbourne, 11-12 August 2011)
<a href="http://forms.embarcadero.com/forms/APKRAPRADStudioWorldTourEvent">Seoul</a> (12 August 2011)
<a href="http://forms.embarcadero.com/forms/APTWRADWorldTourEvent">Taiwan</a> (4 cities, 16-19 August 2011)
<a href="http://forms.embarcadero.com/forms/APINRADWorldTourEvent">Mumbai</a> (17 August 2011)
<a href="http://forms.embarcadero.com/forms/APINRADWorldTourEvent">Bangalore</a> (18 August 2011)
<a href="http://forms.embarcadero.com/forms/APIDRADWorldTourEvent">Jakarta</a> (9 September 2011)

<p>&#8230;and here&#8217;s the very high-level description:</p>
<p><em>Whether you are building new applications, or migrating existing systems, this workshop will help you decide where to invest your team&#8217;s time and effort to make the most positive impact on your business, today and into the future.</p>
<p>You will hear about:</p>

Application frameworks
<a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &#187;">Delphi</a> 64-bit
The future of database access
DataSnap and Cloud
Mobile development

<p></em></p>
<p>Before you ask, yes, there will be more cities and countries added soon. Not just in Asia but around the world.  </p>
]]></description>
			<content:encoded><![CDATA[<p>I promised to post more details of these upcoming events when I could. Well, now I can. </p>
<p>Current cities:</p>
<ul>
<li><a href="http://forms.embarcadero.com/forms/APNZRADStudioWorldTourEvent">Auckland</a> (04 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APAURADWorldTourEvent">Australia</a> (Sydney/Melbourne, 11-12 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APKRAPRADStudioWorldTourEvent">Seoul</a> (12 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APTWRADWorldTourEvent">Taiwan</a> (4 cities, 16-19 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APINRADWorldTourEvent">Mumbai</a> (17 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APINRADWorldTourEvent">Bangalore</a> (18 August 2011)</li>
<li><a href="http://forms.embarcadero.com/forms/APIDRADWorldTourEvent">Jakarta</a> (9 September 2011)</li>
</ul>
<p>&#8230;and here&#8217;s the very high-level description:</p>
<p><em>Whether you are building new applications, or migrating existing systems, this workshop will help you decide where to invest your team&#8217;s time and effort to make the most positive impact on your business, today and into the future.</p>
<p>You will hear about:</p>
<ul>
<li>Application frameworks</li>
<li><a href="http://www.embarcadero.com/products/delphi" class="kblinker" target="_blank" title="More about delphi &raquo;">Delphi</a> 64-bit</li>
<li>The future of database access</li>
<li>DataSnap and Cloud</li>
<li>Mobile development</li>
</ul>
<p></em></p>
<p>Before you ask, yes, there will be more cities and countries added soon. Not just in Asia but around the world.  </p>
<img src="http://feeds.feedburner.com/~r/MalcolmGroves/~4/RNXheRp5KvA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.malcolmgroves.com/blog/?feed=rss2&amp;p=826</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

