<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/3.3.1" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>milesjordan.com</title>
		<link>http://milesjordan.com/index.php</link>
		<atom:link rel="self" type="application/rss+xml" href="http://milesjordan.com/index.php?tempskin=_rss2" />
		<description>Miles Jordan</description>
		<language>en-US</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.1"/>
		<ttl>60</ttl>
				<item>
			<title>Add the action back into JIRA email subjects</title>
			<link>http://milesjordan.com/index.php/2011/12/12/add-the-action-back-into-jira-email-subjects</link>
			<pubDate>Mon, 12 Dec 2011 23:17:52 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">Miscellaneous</category>			<guid isPermaLink="false">39@http://milesjordan.com/</guid>
						<description>&lt;p&gt;JIRA 4.4 introduced a change to the automatic emails that are sent when an action (such as a user commenting) is performed on an issue.&lt;/p&gt;
&lt;p&gt;Up until JIRA 4.3, the subject of these emails would include the action, such as:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;codespan&quot;&gt;[JIRA] (MYPROJ-17) Commented: As a scientist, I want a big red button, so that I can take over the world&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;JIRA 4.4 removes that action from the email subject:&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;codespan&quot;&gt;[JIRA] (MYPROJ-17) As a scientist, I want a big red button, so that I can take over the world&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This was done because having the action in the subject breaks GMail's email threading.&lt;/p&gt;
&lt;p&gt;For those of us that don't use GMail, and actually find it useful to have the action in the subject, you can put it back by editing each of the template files in&amp;#160;&lt;span&gt;&lt;code class=&quot;codespan&quot;&gt;WEB-INF/classes/templates/email/&lt;/code&gt; and adding in the &lt;code class=&quot;codespan&quot;&gt;$eventTypeName&lt;/code&gt; variable, such as:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;code class=&quot;codespan&quot;&gt;($issue.key) $eventTypeName: $issue.summary&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Each file is only one line long, so they are quite easy to edit. Restart JIRA and you'll have the action back in your subject lines!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;There's more info at &lt;/span&gt;&lt;a href=&quot;http://confluence.atlassian.com/display/JIRA/Customising+Email+Content&quot;&gt;&lt;a href=&quot;http://confluence.atlassian.com/display/JIRA/Customising+Email+Content&quot;&gt;http://confluence.atlassian.com/display/JIRA/Customising+Email+Content&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And you can vote for this as a user-configurable option at&amp;#160;&lt;a href=&quot;https://jira.atlassian.com/browse/JRA-25591&quot;&gt;&lt;a href=&quot;https://jira.atlassian.com/browse/JRA-25591&quot;&gt;https://jira.atlassian.com/browse/JRA-25591&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2011/12/12/add-the-action-back-into-jira-email-subjects&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>JIRA 4.4 introduced a change to the automatic emails that are sent when an action (such as a user commenting) is performed on an issue.</p>
<p>Up until JIRA 4.3, the subject of these emails would include the action, such as:</p>
<p><code class="codespan">[JIRA] (MYPROJ-17) Commented: As a scientist, I want a big red button, so that I can take over the world</code></p>
<p>JIRA 4.4 removes that action from the email subject:</p>
<p><code class="codespan">[JIRA] (MYPROJ-17) As a scientist, I want a big red button, so that I can take over the world</code></p>
<p>This was done because having the action in the subject breaks GMail's email threading.</p>
<p>For those of us that don't use GMail, and actually find it useful to have the action in the subject, you can put it back by editing each of the template files in&#160;<span><code class="codespan">WEB-INF/classes/templates/email/</code> and adding in the <code class="codespan">$eventTypeName</code> variable, such as:</span></p>
<p><span><code class="codespan">($issue.key) $eventTypeName: $issue.summary</code></span></p>
<p><span>Each file is only one line long, so they are quite easy to edit. Restart JIRA and you'll have the action back in your subject lines!</span></p>
<p><span>There's more info at </span><a href="http://confluence.atlassian.com/display/JIRA/Customising+Email+Content"><a href="http://confluence.atlassian.com/display/JIRA/Customising+Email+Content">http://confluence.atlassian.com/display/JIRA/Customising+Email+Content</a></a></p>
<p>And you can vote for this as a user-configurable option at&#160;<a href="https://jira.atlassian.com/browse/JRA-25591"><a href="https://jira.atlassian.com/browse/JRA-25591">https://jira.atlassian.com/browse/JRA-25591</a></a></p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2011/12/12/add-the-action-back-into-jira-email-subjects">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2011/12/12/add-the-action-back-into-jira-email-subjects#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=39</wfw:commentRss>
		</item>
				<item>
			<title>Antarctic Voyages iPhone Application</title>
			<link>http://milesjordan.com/index.php/2011/10/04/antarctic-voyages-iphone-application</link>
			<pubDate>Tue, 04 Oct 2011 23:50:50 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="alt">Programming</category>
<category domain="main">iOS Apps</category>			<guid isPermaLink="false">38@http://milesjordan.com/</guid>
						<description>&lt;p&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;About this app:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The Antarctic Voyages iOS app lets you view up-to-date information about the current (or most recent) Antarctic voyage as conducted by the Australian Antarctic Division with Australia's Antarctic research vessel, the RV Aurora Australis.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/us/app/antarctic-voyages/id467074079?mt=8&quot;&gt;View screenshots and Download Antarctic Voyages from the iTunes Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With the Antarctic Voyages app you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;view the latest webcam images &lt;/li&gt;
&lt;li&gt;view the ship track on an interactive map &lt;/li&gt;
&lt;li&gt;view the latest readings from the on-board, scientific sensors &lt;/li&gt;
&lt;li&gt;view situation reports from the voyage leaders&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This app is a great way too see what it's like pushing through the ice at the lower latitudes, and also an excellent way to stay close to loved ones that may be on-board!&lt;/p&gt;
&lt;p&gt;Works with iPhone, iPad, and iPod Touch.&lt;/p&gt;
&lt;p&gt;All data is from the current voyage. If there is no current voyage then webcam images, maps and data are from the most recent voyage. The Australian Antarctic shipping schedule can be found at &lt;a href=&quot;http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules&quot;&gt;&lt;a href=&quot;http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules&quot;&gt;http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Data and images originate from the &lt;a href=&quot;http://www.aad.gov.au&quot;&gt;Australian Antarctic Division&lt;/a&gt; and are licensed for use under &lt;a href=&quot;http://creativecommons.org/licenses/by/3.0/&quot;&gt;Creative Commons by Attribution 3.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upcoming improvements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A better map. The current map sometimes goes blank when crossing the dateline.&lt;/li&gt;
&lt;li&gt;Improved local map tile caching&lt;/li&gt;
&lt;li&gt;Add the voyage schedule to the app&lt;/li&gt;
&lt;li&gt;Push notifications when a new voyage is about to begin&lt;/li&gt;
&lt;li&gt;Customisable push notifications when a voyage reaches a certain location&lt;/li&gt;
&lt;li&gt;Display of waypoints and events&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Miles Jordan (the developer) is an employee of the Australian Antarctic Division.&lt;/p&gt;
&lt;p&gt;If you have a suggestion, please comment below.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2011/10/04/antarctic-voyages-iphone-application&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">About this app:</span></p>
<p>The Antarctic Voyages iOS app lets you view up-to-date information about the current (or most recent) Antarctic voyage as conducted by the Australian Antarctic Division with Australia's Antarctic research vessel, the RV Aurora Australis.</p>
<p><a href="http://itunes.apple.com/us/app/antarctic-voyages/id467074079?mt=8">View screenshots and Download Antarctic Voyages from the iTunes Store</a>.</p>
<p>With the Antarctic Voyages app you can:</p>
<ul>
<li>view the latest webcam images </li>
<li>view the ship track on an interactive map </li>
<li>view the latest readings from the on-board, scientific sensors </li>
<li>view situation reports from the voyage leaders</li>
</ul>
<p>This app is a great way too see what it's like pushing through the ice at the lower latitudes, and also an excellent way to stay close to loved ones that may be on-board!</p>
<p>Works with iPhone, iPad, and iPod Touch.</p>
<p>All data is from the current voyage. If there is no current voyage then webcam images, maps and data are from the most recent voyage. The Australian Antarctic shipping schedule can be found at <a href="http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules"><a href="http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules">http://www.antarctica.gov.au/living-and-working/travel-and-logistics/shipping-and-air-schedules</a></a>.</p>
<p>Data and images originate from the <a href="http://www.aad.gov.au">Australian Antarctic Division</a> and are licensed for use under <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons by Attribution 3.0</a>.</p>
<p><strong>Upcoming improvements:</strong></p>
<ul>
<li>A better map. The current map sometimes goes blank when crossing the dateline.</li>
<li>Improved local map tile caching</li>
<li>Add the voyage schedule to the app</li>
<li>Push notifications when a new voyage is about to begin</li>
<li>Customisable push notifications when a voyage reaches a certain location</li>
<li>Display of waypoints and events</li>
</ul>
<p>Miles Jordan (the developer) is an employee of the Australian Antarctic Division.</p>
<p>If you have a suggestion, please comment below.</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2011/10/04/antarctic-voyages-iphone-application">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2011/10/04/antarctic-voyages-iphone-application#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=38</wfw:commentRss>
		</item>
				<item>
			<title>Nested CFLayouts in Coldfusion 9</title>
			<link>http://milesjordan.com/index.php/2010/05/17/nested-cflayouts-in-coldfusion-9</link>
			<pubDate>Tue, 18 May 2010 03:24:08 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">Coldfusion</category>			<guid isPermaLink="false">37@http://milesjordan.com/</guid>
						<description>&lt;p&gt;If you've tried nesting cflayouts in coldfusion 9 then you may have noticed that it breaks.&lt;/p&gt;
&lt;p&gt;What seems to be happening is that the inner layouts are not being sized and fitted to their parent layouts and the page that they are on.&lt;/p&gt;
&lt;p&gt;Coldfusion 9 uses the ExtJS 3 framework for its layouts, and Ext uses the doLayout() function on its objects to perform such an operation. It seems that CF9 is overlooking this, at least to some extent.&lt;/p&gt;
&lt;p&gt;So as a workaround you could simply grab the layout and call its doLayout() function after the page has finished loading, right? And for this you can use the Ext.onReady() function. However, it seems that Ext.onReady() can fire before the layouts are loaded for some reason. I think it only happens within a Coldfusion environment, not when using Ext straight up.&lt;/p&gt;
&lt;p&gt;How do you do it? Well it's a bit hackish, but you can use javascript's setTimeout() function to keep running a function that checks if the nested layouts exist before running doLayout() on them. See the following example.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;pre&gt;&amp;lt;cflayout name=&quot;outerLayout&quot; type=&quot;border&quot;&amp;gt; 
    &amp;lt;cflayoutarea name=&quot;mainarea&quot; position=&quot;center&quot;&amp;gt; 
        &amp;lt;cflayout name=&quot;tabLayout&quot; type=&quot;tab&quot;&amp;gt; 
            &amp;lt;cflayoutarea name=&quot;tabA&quot; title=&quot;Tab A&quot;&amp;gt; 
                TAB A 
            &amp;lt;/cflayoutarea&amp;gt; 
            &amp;lt;cflayoutarea name=&quot;tabB&quot; title=&quot;Tab B&quot;&amp;gt; 
                &amp;lt;cflayout type=&quot;border&quot; name=&quot;tabABorderLayout&quot;&amp;gt; 
                    &amp;lt;cflayoutarea name=&quot;tabA1&quot; position=&quot;left&quot;&amp;gt; 
                        A1 
                    &amp;lt;/cflayoutarea&amp;gt; 
                    &amp;lt;cflayoutarea name=&quot;tabA2&quot; position=&quot;center&quot;&amp;gt; 
                        A2 
                    &amp;lt;/cflayoutarea&amp;gt; 
                &amp;lt;/cflayout&amp;gt; 
            &amp;lt;/cflayoutarea&amp;gt; 
        &amp;lt;/cflayout&amp;gt; 
    &amp;lt;/cflayoutarea&amp;gt; 
&amp;lt;/cflayout&amp;gt;  &lt;/pre&gt;
&lt;p&gt;And in your head section:&lt;/p&gt;
&lt;pre&gt;&amp;lt;script language=&quot;javascript&quot;&amp;gt; 
    function setLayout(){ 
        try { 
            ColdFusion.Layout.getTabLayout(&quot;mainTabs&quot;).addListener('tabchange', function(){ 
                ColdFusion.Layout.getBorderLayout(&quot;tabABorderLayout&quot;).doLayout(); 
            }); 
        } catch (e) { 
            setTimeout(&quot;setLayout()&quot;,20); 
            //console.log(&quot;waiting...&quot;); 
        } 
    }
    Ext.onReady(function(){ 
        setLayout(); 
    }); 
&amp;lt;/script&amp;gt; 
&lt;/pre&gt;
&lt;p&gt;Now, if anyone has a good suggestion as to a well-priced coldfusion host, I'd be happy to move to it so I can show some real examples!&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2010/05/17/nested-cflayouts-in-coldfusion-9&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>If you've tried nesting cflayouts in coldfusion 9 then you may have noticed that it breaks.</p>
<p>What seems to be happening is that the inner layouts are not being sized and fitted to their parent layouts and the page that they are on.</p>
<p>Coldfusion 9 uses the ExtJS 3 framework for its layouts, and Ext uses the doLayout() function on its objects to perform such an operation. It seems that CF9 is overlooking this, at least to some extent.</p>
<p>So as a workaround you could simply grab the layout and call its doLayout() function after the page has finished loading, right? And for this you can use the Ext.onReady() function. However, it seems that Ext.onReady() can fire before the layouts are loaded for some reason. I think it only happens within a Coldfusion environment, not when using Ext straight up.</p>
<p>How do you do it? Well it's a bit hackish, but you can use javascript's setTimeout() function to keep running a function that checks if the nested layouts exist before running doLayout() on them. See the following example.</p>
<p>&#160;</p>
<pre>&lt;cflayout name="outerLayout" type="border"&gt; 
    &lt;cflayoutarea name="mainarea" position="center"&gt; 
        &lt;cflayout name="tabLayout" type="tab"&gt; 
            &lt;cflayoutarea name="tabA" title="Tab A"&gt; 
                TAB A 
            &lt;/cflayoutarea&gt; 
            &lt;cflayoutarea name="tabB" title="Tab B"&gt; 
                &lt;cflayout type="border" name="tabABorderLayout"&gt; 
                    &lt;cflayoutarea name="tabA1" position="left"&gt; 
                        A1 
                    &lt;/cflayoutarea&gt; 
                    &lt;cflayoutarea name="tabA2" position="center"&gt; 
                        A2 
                    &lt;/cflayoutarea&gt; 
                &lt;/cflayout&gt; 
            &lt;/cflayoutarea&gt; 
        &lt;/cflayout&gt; 
    &lt;/cflayoutarea&gt; 
&lt;/cflayout&gt;  </pre>
<p>And in your head section:</p>
<pre>&lt;script language="javascript"&gt; 
    function setLayout(){ 
        try { 
            ColdFusion.Layout.getTabLayout("mainTabs").addListener('tabchange', function(){ 
                ColdFusion.Layout.getBorderLayout("tabABorderLayout").doLayout(); 
            }); 
        } catch (e) { 
            setTimeout("setLayout()",20); 
            //console.log("waiting..."); 
        } 
    }
    Ext.onReady(function(){ 
        setLayout(); 
    }); 
&lt;/script&gt; 
</pre>
<p>Now, if anyone has a good suggestion as to a well-priced coldfusion host, I'd be happy to move to it so I can show some real examples!</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2010/05/17/nested-cflayouts-in-coldfusion-9">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2010/05/17/nested-cflayouts-in-coldfusion-9#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=37</wfw:commentRss>
		</item>
				<item>
			<title>Outlook 2007 and plain text</title>
			<link>http://milesjordan.com/index.php/2009/12/01/outlook-2007-and-plain-text</link>
			<pubDate>Wed, 02 Dec 2009 00:27:55 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">Miscellaneous</category>			<guid isPermaLink="false">36@http://milesjordan.com/</guid>
						<description>&lt;div&gt;&lt;div&gt;&lt;a href=&quot;http://milesjordan.com/media/blogs/a/OutlookDummies.png&quot;&gt;&lt;img src=&quot;http://milesjordan.com/media/blogs/a/./.evocache/OutlookDummies.png/fit-320x320.png&quot; alt=&quot;&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;I hate Outlook 2007. I don't like using it. Unfortunately, like many other public servants, I have little choice in the matter until I get home and open my macbook pro.&lt;/p&gt;
&lt;p&gt;There are two &lt;em&gt;big&lt;/em&gt; issues with it that I can't stand. The first is the rubbish RSS support that it has. I mean, RSS is pretty standard these days, right? So why, if you are subscribed to a few RSS feeds in Outlook, does it freeze the whole program every second or two? Because it's crap (well, actually because it's constantly synchronising with Internet Explorer). The only way to get around it is to &lt;a href=&quot;http://www.tech-recipes.com/rx/2031/outlook_2007_remove_or_disable_rss_feed_support/&quot;&gt;turn off RSS&lt;/a&gt;. Not a good option for me - I follow many blogs that I take no shame in plugging, including &lt;a href=&quot;http://blog.cleverelephant.ca/&quot;&gt;Paul Ramsey&lt;/a&gt;, &lt;a href=&quot;http://www.spatiallyadjusted.com/&quot;&gt;James Fee&lt;/a&gt;, &lt;a href=&quot;http://www.coldfusionjedi.com/&quot;&gt;Ray Camden&lt;/a&gt; and &lt;a href=&quot;http://slashgeo.org/&quot;&gt;SlashGeo&lt;/a&gt;. I don't want to run a separate RSS reader because I like that it's integrated with my email, so I put up with it.&lt;/p&gt;
&lt;p&gt;Second, I can't stand emails that are of a simple, textual nature, yet sent in HTML. Even if you have Outlook set up to compose in plain text, if someone sends you a HTML email and you hit reply, you will be composing in HTML. I'm an active member of a number of mailing lists, and find that HTML really clutters them up. It's much easier to keep track&lt;span style=&quot;background-color: #ffffff;&quot;&gt; of a conversation if the entire thread is in plain text.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://home.in.tum.de/~jain/software/outlook-quotefix/&quot;&gt;Outlook QuoteFix&lt;/a&gt; was a great solution with Outlook 2000, but unfortunately it doesn't work with Outlook 2007. However &lt;a href=&quot;http://sourceforge.net/apps/mediawiki/macros4outlook/index.php?title=QuoteFix_Macro&quot;&gt;QuoteFix Macro&lt;/a&gt; does. I recommend it. To use it you have to turn on the &lt;a href=&quot;http://support.microsoft.com/kb/831607/&quot;&gt;option&lt;/a&gt; to view all messages you receive in plain text (which I like). But never fear, if you do get an email that is supposed to be viewed as HTML you can on a per-email basis by clicking on &quot;This message was converted to plain text&quot; at the top of the message, and choosing &quot;View as HTML&quot;.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2009/12/01/outlook-2007-and-plain-text&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<div><div><a href="http://milesjordan.com/media/blogs/a/OutlookDummies.png"><img src="http://milesjordan.com/media/blogs/a/./.evocache/OutlookDummies.png/fit-320x320.png" alt="" title="" /></a></div></div><p>I hate Outlook 2007. I don't like using it. Unfortunately, like many other public servants, I have little choice in the matter until I get home and open my macbook pro.</p>
<p>There are two <em>big</em> issues with it that I can't stand. The first is the rubbish RSS support that it has. I mean, RSS is pretty standard these days, right? So why, if you are subscribed to a few RSS feeds in Outlook, does it freeze the whole program every second or two? Because it's crap (well, actually because it's constantly synchronising with Internet Explorer). The only way to get around it is to <a href="http://www.tech-recipes.com/rx/2031/outlook_2007_remove_or_disable_rss_feed_support/">turn off RSS</a>. Not a good option for me - I follow many blogs that I take no shame in plugging, including <a href="http://blog.cleverelephant.ca/">Paul Ramsey</a>, <a href="http://www.spatiallyadjusted.com/">James Fee</a>, <a href="http://www.coldfusionjedi.com/">Ray Camden</a> and <a href="http://slashgeo.org/">SlashGeo</a>. I don't want to run a separate RSS reader because I like that it's integrated with my email, so I put up with it.</p>
<p>Second, I can't stand emails that are of a simple, textual nature, yet sent in HTML. Even if you have Outlook set up to compose in plain text, if someone sends you a HTML email and you hit reply, you will be composing in HTML. I'm an active member of a number of mailing lists, and find that HTML really clutters them up. It's much easier to keep track<span style="background-color: #ffffff;"> of a conversation if the entire thread is in plain text.</span></p>
<p><a href="http://home.in.tum.de/~jain/software/outlook-quotefix/">Outlook QuoteFix</a> was a great solution with Outlook 2000, but unfortunately it doesn't work with Outlook 2007. However <a href="http://sourceforge.net/apps/mediawiki/macros4outlook/index.php?title=QuoteFix_Macro">QuoteFix Macro</a> does. I recommend it. To use it you have to turn on the <a href="http://support.microsoft.com/kb/831607/">option</a> to view all messages you receive in plain text (which I like). But never fear, if you do get an email that is supposed to be viewed as HTML you can on a per-email basis by clicking on "This message was converted to plain text" at the top of the message, and choosing "View as HTML".</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2009/12/01/outlook-2007-and-plain-text">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2009/12/01/outlook-2007-and-plain-text#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=36</wfw:commentRss>
		</item>
				<item>
			<title>Moving Oracle Spatial data to PostGIS</title>
			<link>http://milesjordan.com/index.php/2009/11/17/moving-oracle-spatial-data-to-postgis</link>
			<pubDate>Wed, 18 Nov 2009 02:19:31 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">GIS</category>
<category domain="alt">Databases</category>
<category domain="alt">Oracle</category>			<guid isPermaLink="false">35@http://milesjordan.com/</guid>
						<description>&lt;div&gt;&lt;div&gt;&lt;a href=&quot;http://milesjordan.com/media/blogs/a/oracletopostgis.jpg&quot;&gt;&lt;img src=&quot;http://milesjordan.com/media/blogs/a/./.evocache/oracletopostgis.jpg/fit-320x320.jpg&quot; alt=&quot;&quot; title=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I put together a small &lt;a href=&quot;http://www.geotools.org/&quot;&gt;Geotools&lt;/a&gt; based jar that Coldfusion can use to copy data from Oracle Spatial directly into &lt;a href=&quot;http://postgis.refractions.net/&quot;&gt;PostGIS&lt;/a&gt;. Previously, we had needed to export the data as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Shapefile&quot;&gt;shapefile&lt;/a&gt;, and use shp2pgsql to load the data into PostGIS.&lt;/p&gt;
&lt;p&gt;That method had an ESRI imposed limitation, in that the length of shapefile attribute names can only be up to 10 characters long, whereas Oracle column names can be much longer, so they were truncated. No good!&lt;/p&gt;
&lt;p&gt;Even though Geotools made it &lt;em&gt;ridiculously&lt;/em&gt; easy to implement, it turns out I didn't even need to do it. I should have thought of ogr2ogr in the beginning! Of course, it supports Oracle Spatial and PostGIS, and its main function is to convert features from one data type to another. Anyways, here's how you would do it.&lt;/p&gt;
&lt;p&gt;First you need to download ogr2ogr with the OCI driver. You can get it from FWTools but I found it easier to use the one distributed with &lt;a href=&quot;http://trac.osgeo.org/osgeo4w/&quot;&gt;OSGeo4W&lt;/a&gt;, from &lt;a href=&quot;http://www.osgeo.org&quot;&gt;OSGeo&lt;/a&gt;, becuase it already includes the OCI driver.&lt;/p&gt;
&lt;p&gt;The OCI driver uses a &lt;a href=&quot;http://en.wikipedia.org/wiki/Oracle_Call_Interface&quot;&gt;thick connection&lt;/a&gt; to your Oracle database, so you need to have the Oracle Instant Client or SQL Developer installed on the machine that you wish to connect from. This doesn't have to be the PostGIS machine &lt;em&gt;or&lt;/em&gt; the Oracle machine - it can just be your normal desktop. Anyways, you need to copy the oci.dll that comes with your Instant Client installation to the &quot;bin&quot; directory of OSGeo4W.&lt;/p&gt;
&lt;p&gt;Also, make sure you can connect to your Oracle database using the instant client. If you can't do that, you need to edit your &lt;a href=&quot;http://www.orafaq.com/wiki/Tnsnames.ora&quot;&gt;TNSNAMES.ORA&lt;/a&gt; until you get it right.&lt;/p&gt;
&lt;p&gt;Now you should be able to use ogr2ogr to connect to oracle using the name you gave it in your TNSNAMES.ORA, and transfer spatial tables to PostGIS, using this command (on one line):&lt;/p&gt;
&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;ogr2ogr -a_srs &amp;lt;srs&amp;gt; -overwrite -f &quot;PostgreSQL&quot;&amp;#160;-nln &amp;lt;postgis schema&amp;gt;.&amp;lt;postgis table&amp;gt; PG:&quot;host=&amp;lt;postgis host&amp;gt; user=&amp;lt;postgis user&amp;gt; password=&amp;lt;postgis password&amp;gt; dbname=&amp;lt;postgis database&amp;gt;&quot; OCI:&amp;lt;oracle user&amp;gt;/&amp;lt;oracle password&amp;gt;@&amp;lt;oracle tns name&amp;gt;:&amp;lt;oracle schema&amp;gt;.&amp;lt;oracle table&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;It looks complicated, but it's really not.&lt;/p&gt;
&lt;p&gt;Open source software wins again. Why does anyone still use shapefiles again?&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2009/11/17/moving-oracle-spatial-data-to-postgis&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<div><div><a href="http://milesjordan.com/media/blogs/a/oracletopostgis.jpg"><img src="http://milesjordan.com/media/blogs/a/./.evocache/oracletopostgis.jpg/fit-320x320.jpg" alt="" title="" /></a></div></div><p style="text-align: left;">I put together a small <a href="http://www.geotools.org/">Geotools</a> based jar that Coldfusion can use to copy data from Oracle Spatial directly into <a href="http://postgis.refractions.net/">PostGIS</a>. Previously, we had needed to export the data as a <a href="http://en.wikipedia.org/wiki/Shapefile">shapefile</a>, and use shp2pgsql to load the data into PostGIS.</p>
<p>That method had an ESRI imposed limitation, in that the length of shapefile attribute names can only be up to 10 characters long, whereas Oracle column names can be much longer, so they were truncated. No good!</p>
<p>Even though Geotools made it <em>ridiculously</em> easy to implement, it turns out I didn't even need to do it. I should have thought of ogr2ogr in the beginning! Of course, it supports Oracle Spatial and PostGIS, and its main function is to convert features from one data type to another. Anyways, here's how you would do it.</p>
<p>First you need to download ogr2ogr with the OCI driver. You can get it from FWTools but I found it easier to use the one distributed with <a href="http://trac.osgeo.org/osgeo4w/">OSGeo4W</a>, from <a href="http://www.osgeo.org">OSGeo</a>, becuase it already includes the OCI driver.</p>
<p>The OCI driver uses a <a href="http://en.wikipedia.org/wiki/Oracle_Call_Interface">thick connection</a> to your Oracle database, so you need to have the Oracle Instant Client or SQL Developer installed on the machine that you wish to connect from. This doesn't have to be the PostGIS machine <em>or</em> the Oracle machine - it can just be your normal desktop. Anyways, you need to copy the oci.dll that comes with your Instant Client installation to the "bin" directory of OSGeo4W.</p>
<p>Also, make sure you can connect to your Oracle database using the instant client. If you can't do that, you need to edit your <a href="http://www.orafaq.com/wiki/Tnsnames.ora">TNSNAMES.ORA</a> until you get it right.</p>
<p>Now you should be able to use ogr2ogr to connect to oracle using the name you gave it in your TNSNAMES.ORA, and transfer spatial tables to PostGIS, using this command (on one line):</p>
<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">ogr2ogr -a_srs &lt;srs&gt; -overwrite -f "PostgreSQL"&#160;-nln &lt;postgis schema&gt;.&lt;postgis table&gt; PG:"host=&lt;postgis host&gt; user=&lt;postgis user&gt; password=&lt;postgis password&gt; dbname=&lt;postgis database&gt;" OCI:&lt;oracle user&gt;/&lt;oracle password&gt;@&lt;oracle tns name&gt;:&lt;oracle schema&gt;.&lt;oracle table&gt;</span></code></td></tr>
</table></div>
<p>It looks complicated, but it's really not.</p>
<p>Open source software wins again. Why does anyone still use shapefiles again?</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2009/11/17/moving-oracle-spatial-data-to-postgis">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2009/11/17/moving-oracle-spatial-data-to-postgis#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=35</wfw:commentRss>
		</item>
				<item>
			<title>Geoserver 2.0 and Oracle spatial with multiple schemas</title>
			<link>http://milesjordan.com/index.php/2009/11/12/geoserver-2-0-and-oracle-spatial-with-multiple-schemas</link>
			<pubDate>Fri, 13 Nov 2009 01:45:50 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="alt">Oracle</category>
<category domain="main">Geoserver</category>			<guid isPermaLink="false">34@http://milesjordan.com/</guid>
						<description>&lt;p&gt;An issue came up on the &lt;a href=&quot;http://geoserver.org&quot;&gt;Geoserver&lt;/a&gt; users mailing list the other day, which I myself have had in the past. It goes like this:&lt;/p&gt;
&lt;p&gt;Lets say you have a table &lt;em&gt;a &lt;/em&gt;and table &lt;em&gt;b&lt;/em&gt; that you want to publish through Geoserver. &lt;em&gt;a&lt;/em&gt; belongs to schema &lt;em&gt;GIS1&lt;/em&gt; and &lt;em&gt;b&lt;/em&gt; belongs to schema&amp;#160;&lt;em&gt;GIS2&lt;/em&gt;.&amp;#160;Now, it would be nice to be able to set up one datastore that can connect to Oracle with a username that has access to both tables, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Connection_pool&quot;&gt;pool connections&lt;/a&gt; between them.&lt;/p&gt;
&lt;p&gt;Unfortunately it doesn't quite work like that.&lt;/p&gt;
&lt;p&gt;The reason being is that you &lt;em&gt;must&lt;/em&gt; specify a schema in the datastore configuration for the Oracle plugin to know how to find the spatial metadata of a table, unless the table belongs to the user that you are connecting with. For example, you could try connecting as user &lt;em&gt;GIS1&lt;/em&gt;. If &lt;em&gt;GIS1&lt;/em&gt; has access to &lt;em&gt;GIS2.&lt;/em&gt;&lt;em&gt;b&lt;/em&gt;, you will be able to see it in your list of available layers in the geoserver layer chooser. If you select it and try to use it, you will most likely get an exception from the Oracle driver, along the lines of:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;ORA-00942: table or view does not exist&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Why? Well there are two different ways a user can access spatial metadata for tables in Oracle.&lt;/p&gt;
&lt;p&gt;1. USER_SDO_GEOM_METADATA - This is a special view that gives a user access to the spatial metadata for all of the spatially enabled tables that they own. It identifies geometry objects that the user owns using columns table_name and column_name. Geoserver will first try to use this view to obtain spatial metadata for your selected table. In our case, &lt;em&gt;GIS1&lt;/em&gt; does not own table &lt;em&gt;b&lt;/em&gt;, so it won't come up in the list. So it tries the other technique.&lt;/p&gt;
&lt;p&gt;2. ALL_SDO_GEOM_METADATA - This view is available to all users, and shows the spatial metadata for all spatial tables in the Oracle instance. That means that &lt;em&gt;b&lt;/em&gt; will be in there, but ALL_SDO_GEOM_METADATA contains one vital extra column that it uses to tell tables apart; the schema_name. Because this view shows tables from all schemas, we need to be able to identify them!&lt;/p&gt;
&lt;p style=&quot;text-align: center; &quot;&gt;&lt;a href=&quot;http://geoserver.org&quot;&gt;&lt;img src=&quot;https://svn.openplans.org/svn/geoserver-confluence/trunk/images/geoserver-logo.png&quot; alt=&quot;Geoserver&quot; width=&quot;353&quot; height=&quot;112&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Now, geoserver won't remember that &lt;em&gt;b&lt;/em&gt; comes from a schema other than &lt;em&gt;GIS1&lt;/em&gt;, which we are trying to access it with. So it will find the appropriate metadata in ALL_SDO_GEOM_METADATA, but it will only check for the table using table_name and column_name, which will &lt;em&gt;not&lt;/em&gt; uniquely identify it, if there is another table called &lt;em&gt;b&lt;/em&gt; in another schema!&lt;/p&gt;
&lt;p&gt;That won't be a problem if &lt;em&gt;b&lt;/em&gt; is the only spatially enabled table in the Oracle instance that is called &lt;em&gt;b&lt;/em&gt;. What will be a problem is when Oracle tries to use the table. If you have no schema specified in your geoserver datastore, geoserver (well, geotools, actually) will test access to &lt;em&gt;b&lt;/em&gt; like this:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;SELECT MY_PK FROM B WHERE 0=1&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;That will result in the oracle error ORA-00942, above.&lt;/p&gt;
&lt;p&gt;So how do we get around all this? I really want to access multiple schemas in geoserver but I only want&lt;em&gt; &lt;/em&gt;to connect with &lt;em&gt;one&lt;/em&gt; username so that I can pool connections across schemas!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://java.sun.com/products/jndi/&quot;&gt;JNDI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Using JNDI you can set up a datasource in your application container (i.e. Tomcat) that can be referenced by multiple Geoserver datasources. You still need to hard-code a username and password into the connection config for Tomcat, but you can set up a Geoserver datasource for each schema that you want to access, which uses that connection pool, but that allows you to specify a schema name!&lt;/p&gt;
&lt;p&gt;And voila, we have got multiple datasources in Geoserver that point to different schemas, using the same username and password for connecting, but we are actually pooling connections across datasources. And best of all Geoserver knows exactly where to find all your tables.&lt;/p&gt;
&lt;p&gt;If you need help setting up connection pooling for Geoserver, they have a &lt;a href=&quot;http://docs.geoserver.org/2.0.x/en/user/tutorials/tomcat-jndi/tomcat-jndi.html&quot;&gt;great guide&lt;/a&gt; in amongst the rest of their super &lt;a href=&quot;http://docs.geoserver.org/2.0.x/en/user/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2009/11/12/geoserver-2-0-and-oracle-spatial-with-multiple-schemas&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>An issue came up on the <a href="http://geoserver.org">Geoserver</a> users mailing list the other day, which I myself have had in the past. It goes like this:</p>
<p>Lets say you have a table <em>a </em>and table <em>b</em> that you want to publish through Geoserver. <em>a</em> belongs to schema <em>GIS1</em> and <em>b</em> belongs to schema&#160;<em>GIS2</em>.&#160;Now, it would be nice to be able to set up one datastore that can connect to Oracle with a username that has access to both tables, and <a href="http://en.wikipedia.org/wiki/Connection_pool">pool connections</a> between them.</p>
<p>Unfortunately it doesn't quite work like that.</p>
<p>The reason being is that you <em>must</em> specify a schema in the datastore configuration for the Oracle plugin to know how to find the spatial metadata of a table, unless the table belongs to the user that you are connecting with. For example, you could try connecting as user <em>GIS1</em>. If <em>GIS1</em> has access to <em>GIS2.</em><em>b</em>, you will be able to see it in your list of available layers in the geoserver layer chooser. If you select it and try to use it, you will most likely get an exception from the Oracle driver, along the lines of:</p>
<pre><span>ORA-00942: table or view does not exist</span></pre>
<p>Why? Well there are two different ways a user can access spatial metadata for tables in Oracle.</p>
<p>1. USER_SDO_GEOM_METADATA - This is a special view that gives a user access to the spatial metadata for all of the spatially enabled tables that they own. It identifies geometry objects that the user owns using columns table_name and column_name. Geoserver will first try to use this view to obtain spatial metadata for your selected table. In our case, <em>GIS1</em> does not own table <em>b</em>, so it won't come up in the list. So it tries the other technique.</p>
<p>2. ALL_SDO_GEOM_METADATA - This view is available to all users, and shows the spatial metadata for all spatial tables in the Oracle instance. That means that <em>b</em> will be in there, but ALL_SDO_GEOM_METADATA contains one vital extra column that it uses to tell tables apart; the schema_name. Because this view shows tables from all schemas, we need to be able to identify them!</p>
<p style="text-align: center; "><a href="http://geoserver.org"><img src="https://svn.openplans.org/svn/geoserver-confluence/trunk/images/geoserver-logo.png" alt="Geoserver" width="353" height="112" /></a></p>
<p><br />Now, geoserver won't remember that <em>b</em> comes from a schema other than <em>GIS1</em>, which we are trying to access it with. So it will find the appropriate metadata in ALL_SDO_GEOM_METADATA, but it will only check for the table using table_name and column_name, which will <em>not</em> uniquely identify it, if there is another table called <em>b</em> in another schema!</p>
<p>That won't be a problem if <em>b</em> is the only spatially enabled table in the Oracle instance that is called <em>b</em>. What will be a problem is when Oracle tries to use the table. If you have no schema specified in your geoserver datastore, geoserver (well, geotools, actually) will test access to <em>b</em> like this:</p>
<pre><span>SELECT MY_PK FROM B WHERE 0=1</span></pre>
<p>That will result in the oracle error ORA-00942, above.</p>
<p>So how do we get around all this? I really want to access multiple schemas in geoserver but I only want<em> </em>to connect with <em>one</em> username so that I can pool connections across schemas!</p>
<p><a href="http://java.sun.com/products/jndi/">JNDI</a>.</p>
<p>Using JNDI you can set up a datasource in your application container (i.e. Tomcat) that can be referenced by multiple Geoserver datasources. You still need to hard-code a username and password into the connection config for Tomcat, but you can set up a Geoserver datasource for each schema that you want to access, which uses that connection pool, but that allows you to specify a schema name!</p>
<p>And voila, we have got multiple datasources in Geoserver that point to different schemas, using the same username and password for connecting, but we are actually pooling connections across datasources. And best of all Geoserver knows exactly where to find all your tables.</p>
<p>If you need help setting up connection pooling for Geoserver, they have a <a href="http://docs.geoserver.org/2.0.x/en/user/tutorials/tomcat-jndi/tomcat-jndi.html">great guide</a> in amongst the rest of their super <a href="http://docs.geoserver.org/2.0.x/en/user/">documentation</a>.</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2009/11/12/geoserver-2-0-and-oracle-spatial-with-multiple-schemas">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2009/11/12/geoserver-2-0-and-oracle-spatial-with-multiple-schemas#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=34</wfw:commentRss>
		</item>
				<item>
			<title>GIS Programmers: From Different Worlds</title>
			<link>http://milesjordan.com/index.php/2009/11/11/gis-programmers-from-different-worlds</link>
			<pubDate>Thu, 12 Nov 2009 03:26:59 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">GIS</category>			<guid isPermaLink="false">33@http://milesjordan.com/</guid>
						<description>&lt;p&gt;&lt;a title=&quot;More about this author&quot; href=&quot;http://www.directionsmag.com/author.php?author_id=605&quot;&gt;Tad Larsen&lt;/a&gt; wrote a great &lt;a href=&quot;http://www.directionsmag.com/article.php?article_id=3327&quot;&gt;article&lt;/a&gt; for Directions Magazine yesterday, discussing &amp;#160;the two very distinct categories of GIS developers, that often get labelled the same thing: GIS Developer.&lt;/p&gt;
&lt;p&gt;He mentions the GIS developer with a background in GIS, that has learned some aspects of programming, and the other kind, the developer with a background in Computing who has learned some aspects of GIS.&lt;/p&gt;
&lt;p&gt;I fall into the second category, but get the feeling that there are many more who fall into the first. Either way, he makes a very valid point: There are very few GIS developers in this world that are experts in both fields. But realistically we are better off that way.&lt;/p&gt;
&lt;p&gt;I liken it to going to a large supermarket to get your bread and vegetables. You will get bread and vegetables, but they'll be that little bit better if you get your bread from a bread shop and your vegetables from a grocer. What makes it interesting is if the bakery knows a bit about vegetables and then uses the grocer's knowledge expertise, resulting in a fantastic sandwich!&lt;/p&gt;
&lt;p&gt;Thanks Tad, for a great article.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;vertical-align: middle;&quot; src=&quot;http://img.dailymail.co.uk/i/pix/2006/04/sandwichR110406_450x330.jpg&quot; alt=&quot;Copyright Reuters&quot; width=&quot;450&quot; height=&quot;330&quot; /&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2009/11/11/gis-programmers-from-different-worlds&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><a title="More about this author" href="http://www.directionsmag.com/author.php?author_id=605">Tad Larsen</a> wrote a great <a href="http://www.directionsmag.com/article.php?article_id=3327">article</a> for Directions Magazine yesterday, discussing &#160;the two very distinct categories of GIS developers, that often get labelled the same thing: GIS Developer.</p>
<p>He mentions the GIS developer with a background in GIS, that has learned some aspects of programming, and the other kind, the developer with a background in Computing who has learned some aspects of GIS.</p>
<p>I fall into the second category, but get the feeling that there are many more who fall into the first. Either way, he makes a very valid point: There are very few GIS developers in this world that are experts in both fields. But realistically we are better off that way.</p>
<p>I liken it to going to a large supermarket to get your bread and vegetables. You will get bread and vegetables, but they'll be that little bit better if you get your bread from a bread shop and your vegetables from a grocer. What makes it interesting is if the bakery knows a bit about vegetables and then uses the grocer's knowledge expertise, resulting in a fantastic sandwich!</p>
<p>Thanks Tad, for a great article.</p>
<p><img style="vertical-align: middle;" src="http://img.dailymail.co.uk/i/pix/2006/04/sandwichR110406_450x330.jpg" alt="Copyright Reuters" width="450" height="330" /></p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2009/11/11/gis-programmers-from-different-worlds">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2009/11/11/gis-programmers-from-different-worlds#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=33</wfw:commentRss>
		</item>
				<item>
			<title>SDO_GEOM.RELATE vs SDO_FILTER vs SDO_RELATE</title>
			<link>http://milesjordan.com/index.php/2009/11/10/sdo_geom-relate-vs-sdo_filter-vs-sdo_relate</link>
			<pubDate>Tue, 10 Nov 2009 08:28:13 +0000</pubDate>			<dc:creator>milesj</dc:creator>
			<category domain="main">Oracle</category>			<guid isPermaLink="false">32@http://milesjordan.com/</guid>
						<description>&lt;p&gt;It was a showdown between the three different methods to compare geometry in Oracle today. My lesson for the day was what the subtle differences are between SDO_RELATE and SDO_GEOM.RELATE.&lt;/p&gt;
&lt;p&gt;I had a left outer join to a table with a geometry attribute &amp;#160;in it. If there was no matching record in the table I was joining to, it would return null for the geometry:&lt;/p&gt;
&lt;pre&gt;SELECT a.id, b.name, b.geometry&lt;br /&gt;FROM   voyage a&lt;br /&gt;LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id&lt;/pre&gt;
&lt;p&gt;OK, simple stuff, but I wanted to only return voyage tracks that intersect with the MBR of a user-specified geometry. To make things difficult, I also needed to return any records that ended up with a null geometry. So in other words, I needed to filter out only the records that have a geometry, which don't intersect with our user-specified MBR.&lt;/p&gt;
&lt;p&gt;We can rule one method out straight up: &lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#76214&quot;&gt;SDO_FILTER&lt;/a&gt;. Why? SDO_FILTER is fast but it compares the MBR of &lt;em&gt;both&lt;/em&gt; geometry objects that you feed it. If I have a voyage track that goes from Tasmania to New Zealand the MBR is going to be quite large, but I just wanted to see if the voyage had passed through a particular place.&lt;/p&gt;
&lt;p&gt;Next I tried&amp;#160;&lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674&quot;&gt;SDO_GEOM.RELATE&lt;/a&gt;, using the 'ANYINTERACT' property:&lt;/p&gt;
&lt;pre&gt;SELECT a.id, b.name, b.geometry&lt;br /&gt;FROM   voyage a&lt;br /&gt;LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id&lt;br /&gt;WHERE  (&lt;br /&gt;    b.geometry IS NULL&lt;br /&gt;) OR (&lt;br /&gt;    SDO_GEOM.RELATE (&lt;br /&gt;       b.geometry,       &lt;br /&gt;       'ANYINTERACT',&lt;br /&gt;       SDO_GEOMETRY(2003, 8307, NULL,SDO_ELEM_INFO_ARRAY(1, 1003, 3),&lt;br /&gt;           SDO_ORDINATE_ARRAY(131.563, -65.246, 134.421, -62.388)&lt;br /&gt;       ),&lt;br /&gt;       0.000005&lt;br /&gt;    ) = 'TRUE'&lt;br /&gt;)&amp;#160;&lt;/pre&gt;
&lt;p&gt;One would have thought that this would be a reasonable way to approach the task. ERRRRR: fail. Why? Oracle, for some reason, doesn't &lt;em&gt;always&lt;/em&gt; check what the left predicate of an OR statement evaluates to first, before trying the right predicate. I mean, think about this statement:&lt;/p&gt;
&lt;pre&gt;IF (a OR b)&lt;/pre&gt;
&lt;p&gt;Now, do you think it would be optimal to continue evaluating what 'b' is if you already knew 'a' to be true? Well guess what, Oracle does, well, &lt;em&gt;sometimes&lt;/em&gt;. So even if my geometry was null, it was still trying to compare it with a real geometry object using&amp;#160;&lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674&quot;&gt;SDO_GEOM.RELATE&lt;/a&gt;.&amp;#160;This confused me somewhat!&lt;/p&gt;
&lt;pre&gt;ORA-13050: unable to construct spatial object&lt;/pre&gt;
&lt;p&gt;Looking further into the &lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674&quot;&gt;docs&lt;/a&gt; I find:&lt;/p&gt;
&lt;blockquote&gt;A null value (empty geometry) as an input parameter to a geometry function (for example,&amp;#160;&lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674&quot;&gt;SDO_GEOM.RELATE&lt;/a&gt;) produces an error.&lt;/blockquote&gt;
&lt;p&gt;Enter &lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#78532&quot;&gt;SDO_RELATE&lt;/a&gt;. It turns out that Oracle have three functions that do more or less the same thing in three different ways, and yielding three different results. Oracle &lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#78532&quot;&gt;say&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;Unlike with the&amp;#160;&lt;a href=&quot;http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674&quot;&gt;SDO_GEOM.RELATE&lt;/a&gt; function, DISJOINT and DETERMINE masks are not allowed in the relationship mask with the SDO_RELATE operator. This is because SDO_RELATE uses the spatial index to find candidates that may interact, and the information to satisfy DISJOINT or DETERMINE is not present in the index.&lt;/blockquote&gt;
&lt;p&gt;OK, fine. So I gather that means SDO_GEOM.RELATE will accept two geometry objects that you feed it and will not work as efficient as SDO_RELATE it whereas SDO_RELATE is optimised to use indexes on existing tables to help out with the query. So I tried using SDO_RELATE and it started working:&lt;/p&gt;
&lt;pre&gt;SELECT a.id, b.name, b.geometry&lt;br /&gt;FROM   voyage a&lt;br /&gt;LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id&lt;br /&gt;WHERE  (&lt;br /&gt;    b.geometry IS NULL&lt;br /&gt;) OR (&lt;br /&gt;    SDO_RELATE (&lt;br /&gt;       b.geometry,&lt;br /&gt;       SDO_GEOMETRY(2003, 8307, NULL,SDO_ELEM_INFO_ARRAY(1, 1003, 3),&lt;br /&gt;           SDO_ORDINATE_ARRAY(131.563, -65.246, 134.421, -62.388)&lt;br /&gt;       ),&lt;br /&gt;       'mask=anyinteract'&lt;br /&gt;    ) = 'TRUE'&lt;br /&gt;)&amp;#160;&lt;/pre&gt;
&lt;p&gt;Well, yippee, it actually returns null if there isn't any geometry, and for all other rows it returns only the ones with geometries that intersect.&lt;/p&gt;
&lt;p&gt;Now, just to explore a bit further, I tried SDO_GEOM.RELATE again, and, uh... even though the docs contradict it... it works with a null value passed into it. I think I'll stick to SDO_RELATE for now though - it at least uses the spatial index on the voyage_track table.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://milesjordan.com/index.php/2009/11/10/sdo_geom-relate-vs-sdo_filter-vs-sdo_relate&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>It was a showdown between the three different methods to compare geometry in Oracle today. My lesson for the day was what the subtle differences are between SDO_RELATE and SDO_GEOM.RELATE.</p>
<p>I had a left outer join to a table with a geometry attribute &#160;in it. If there was no matching record in the table I was joining to, it would return null for the geometry:</p>
<pre>SELECT a.id, b.name, b.geometry<br />FROM   voyage a<br />LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id</pre>
<p>OK, simple stuff, but I wanted to only return voyage tracks that intersect with the MBR of a user-specified geometry. To make things difficult, I also needed to return any records that ended up with a null geometry. So in other words, I needed to filter out only the records that have a geometry, which don't intersect with our user-specified MBR.</p>
<p>We can rule one method out straight up: <a href="http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#76214">SDO_FILTER</a>. Why? SDO_FILTER is fast but it compares the MBR of <em>both</em> geometry objects that you feed it. If I have a voyage track that goes from Tasmania to New Zealand the MBR is going to be quite large, but I just wanted to see if the voyage had passed through a particular place.</p>
<p>Next I tried&#160;<a href="http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674">SDO_GEOM.RELATE</a>, using the 'ANYINTERACT' property:</p>
<pre>SELECT a.id, b.name, b.geometry<br />FROM   voyage a<br />LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id<br />WHERE  (<br />    b.geometry IS NULL<br />) OR (<br />    SDO_GEOM.RELATE (<br />       b.geometry,       <br />       'ANYINTERACT',<br />       SDO_GEOMETRY(2003, 8307, NULL,SDO_ELEM_INFO_ARRAY(1, 1003, 3),<br />           SDO_ORDINATE_ARRAY(131.563, -65.246, 134.421, -62.388)<br />       ),<br />       0.000005<br />    ) = 'TRUE'<br />)&#160;</pre>
<p>One would have thought that this would be a reasonable way to approach the task. ERRRRR: fail. Why? Oracle, for some reason, doesn't <em>always</em> check what the left predicate of an OR statement evaluates to first, before trying the right predicate. I mean, think about this statement:</p>
<pre>IF (a OR b)</pre>
<p>Now, do you think it would be optimal to continue evaluating what 'b' is if you already knew 'a' to be true? Well guess what, Oracle does, well, <em>sometimes</em>. So even if my geometry was null, it was still trying to compare it with a real geometry object using&#160;<a href="http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674">SDO_GEOM.RELATE</a>.&#160;This confused me somewhat!</p>
<pre>ORA-13050: unable to construct spatial object</pre>
<p>Looking further into the <a href="http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674">docs</a> I find:</p>
<blockquote>A null value (empty geometry) as an input parameter to a geometry function (for example,&#160;<a href="http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674">SDO_GEOM.RELATE</a>) produces an error.</blockquote>
<p>Enter <a href="http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#78532">SDO_RELATE</a>. It turns out that Oracle have three functions that do more or less the same thing in three different ways, and yielding three different results. Oracle <a href="http://download.oracle.com/docs/html/A85337_01/sdo_oper.htm#78532">say</a>:</p>
<blockquote>Unlike with the&#160;<a href="http://download.oracle.com/docs/html/A85337_01/sdo_objg.htm#863674">SDO_GEOM.RELATE</a> function, DISJOINT and DETERMINE masks are not allowed in the relationship mask with the SDO_RELATE operator. This is because SDO_RELATE uses the spatial index to find candidates that may interact, and the information to satisfy DISJOINT or DETERMINE is not present in the index.</blockquote>
<p>OK, fine. So I gather that means SDO_GEOM.RELATE will accept two geometry objects that you feed it and will not work as efficient as SDO_RELATE it whereas SDO_RELATE is optimised to use indexes on existing tables to help out with the query. So I tried using SDO_RELATE and it started working:</p>
<pre>SELECT a.id, b.name, b.geometry<br />FROM   voyage a<br />LEFT OUTER JOIN voyage_track b ON b.voyage_id = a.voyage_id<br />WHERE  (<br />    b.geometry IS NULL<br />) OR (<br />    SDO_RELATE (<br />       b.geometry,<br />       SDO_GEOMETRY(2003, 8307, NULL,SDO_ELEM_INFO_ARRAY(1, 1003, 3),<br />           SDO_ORDINATE_ARRAY(131.563, -65.246, 134.421, -62.388)<br />       ),<br />       'mask=anyinteract'<br />    ) = 'TRUE'<br />)&#160;</pre>
<p>Well, yippee, it actually returns null if there isn't any geometry, and for all other rows it returns only the ones with geometries that intersect.</p>
<p>Now, just to explore a bit further, I tried SDO_GEOM.RELATE again, and, uh... even though the docs contradict it... it works with a null value passed into it. I think I'll stick to SDO_RELATE for now though - it at least uses the spatial index on the voyage_track table.</p><div class="item_footer"><p><small><a href="http://milesjordan.com/index.php/2009/11/10/sdo_geom-relate-vs-sdo_filter-vs-sdo_relate">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://milesjordan.com/index.php/2009/11/10/sdo_geom-relate-vs-sdo_filter-vs-sdo_relate#comments</comments>
			<wfw:commentRss>http://milesjordan.com/index.php?tempskin=_rss2&#38;disp=comments&#38;p=32</wfw:commentRss>
		</item>
			</channel>
</rss>

