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

<channel>
	<title>davidjmurray</title>
	<atom:link href="http://davidjmurray.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidjmurray.org</link>
	<description>IT, Coffee and Me</description>
	<lastBuildDate>Mon, 20 Feb 2012 16:59:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Data Privacy Day</title>
		<link>http://davidjmurray.org/2012/01/28/data-privacy-day/</link>
		<comments>http://davidjmurray.org/2012/01/28/data-privacy-day/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 12:05:55 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Data Privacy]]></category>

		<guid isPermaLink="false">http://davidjmurray.org/?p=677</guid>
		<description><![CDATA[Today is Data Privacy Day. This occurs every year on the 28 January. Data Privacy Day is an annual international celebration designed to promote awareness about privacy and education about best privacy practices. Click on the link above to go &#8230; <a href="http://davidjmurray.org/2012/01/28/data-privacy-day/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 478px"><a href="http://www.staysafeonline.org/dpd"><img title="Data Privacy Day" src="http://www.staysafeonline.org/sites/default/files/resource_documents/eng468.jpg" alt="Data Privacy Day Logo" width="468" height="60" /></a><p class="wp-caption-text">Data Privacy Day</p></div>
<p>Today is Data Privacy Day. This occurs every year on the 28 January. Data Privacy Day is an annual international celebration designed to promote awareness about privacy and education about best privacy practices.</p>
<p>Click on the link above to go to the Data Privacy page for more information and a list of resources to aid you in keeping your data safe while online.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2012/01/28/data-privacy-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open and Closed Programming Worlds.</title>
		<link>http://davidjmurray.org/2011/10/10/open-and-closed-programming-worlds/</link>
		<comments>http://davidjmurray.org/2011/10/10/open-and-closed-programming-worlds/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 16:26:50 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=539</guid>
		<description><![CDATA[The perils of Vivek Haldar &#8211; his article (http://blog.vivekhaldar.com/post/5542454900/the-perils-of-closed-worlds) covers the idea that a computer language or system can be a closed or open world. To some extent, this is true. For instance, JAVA can be considered a closed world, &#8230; <a href="http://davidjmurray.org/2011/10/10/open-and-closed-programming-worlds/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The perils of Vivek Haldar &#8211; his article (<a title="http://blog.vivekhaldar.com/post/5542454900/the-perils-of-closed-worlds" href="http://blog.vivekhaldar.com/post/5542454900/the-perils-of-closed-worlds" target="_blank">http://blog.vivekhaldar.com/post/5542454900/the-perils-of-closed-worlds</a>) covers the idea that a computer language or system can be a closed or open world.</p>
<p>To some extent, this is true. For instance, JAVA can be considered a closed world, as it has it&#8217;s own tool set and virtual machine. Vivek uses Unix as the example of a open world, a loosely coupled system of programs and utilities which can be split apart and run on multiple systems; Unix being only one of many.</p>
<p>The multivalued database systems definitely fall into the closed world category. Considering that the heritage of all mvdbms comes from PICK, which was a standalone operating system with a database and programming tools added. Is this an issue? Vivek considers that all closed worlds eventually die; the multivalued market is not large, but also not dead yet. But then, it is so closed, that only VAR&#8217;s can get full access to development tools anyway. Maybe this is how it has survived for so long.</p>
<p>On another note, the <a title="http://dx.doi.org/10.1016/0165-6074(85)90032-8" href="http://dx.doi.org/10.1016/0165-6074(85)90032-8" target="_blank">Programming as Theory-Building</a> sounds very interesting.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/10/10/open-and-closed-programming-worlds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What happened in 1986?</title>
		<link>http://davidjmurray.org/2011/07/21/what-happened-in-1986/</link>
		<comments>http://davidjmurray.org/2011/07/21/what-happened-in-1986/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 16:12:44 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[mvdbs]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[RANT]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Technologies]]></category>
		<category><![CDATA[DBMS]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=530</guid>
		<description><![CDATA[I have been rather busy of late, doing a bit of reading and a lot of research regarding the NF² or The Nested Relational Model. While browsing my old Universities library last year, I discovered an old text book on &#8230; <a href="http://davidjmurray.org/2011/07/21/what-happened-in-1986/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have been rather busy of late, doing a bit of reading and a lot of research regarding the NF² or The<a title="http://en.wikipedia.org/wiki/Database_normalization#Non-first_normal_form_.28NF.C2.B2_or_N1NF.29" href="http://en.wikipedia.org/wiki/Database_normalization#Non-first_normal_form_.28NF.C2.B2_or_N1NF.29" target="_blank"> Nested Relational Model</a>.</p>
<p>While browsing my old Universities library last year, I discovered an old text book on the subject of <a title="http://amzn.com/0136292399" href="http://amzn.com/0136292399" target="_blank">Object-Oriented Database Management by Kemper &amp; Moerkotte</a>. What is of real interest is that &#8220;Chapter 6 &#8211; Extensions of Relational DBMSs&#8221; has a rather good coverage of the &#8220;6.6 &#8211; The Nested Relational Model NF2&#8243; with a bunch of references or citations to papers all written around about 1986.</p>
<p>So, what happen within the database academic world in the mid 1980&#8242;s that NF² was all the rage?</p>
<p><span id="more-530"></span></p>
<p>Now, the text book is analyzing the NF² model as an extension to the relational SQL database model and comparing all relational database models to an object-oriented model. So, as object-oriented anything is all so much better than anything else (good-bye and farewell <a title="http://en.wikipedia.org/wiki/Forth_%28programming_language%29" href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29" target="_blank">Forth</a>), it is a bit biased.</p>
<p>The mathematics for the <a title="http://en.wikipedia.org/wiki/Relational_model#Set-theoretic_formulation" href="http://en.wikipedia.org/wiki/Relational_model#Set-theoretic_formulation" target="_blank">set-theory</a> around the &#8220;6.6.2 &#8211; Formal Definition of NF² Relations&#8221; section is good; for those of you whom like maths. The theory eventually gives way to a section on the query language to support NF²; all of which is in a modified/extended form of SQL. That is OK, but it is easy to forget that the multi-value data model that is implemented within the PICK model is  single file based; a data selection can only be performed or centered around one table or file at a time, with the use of translations to other files is within virtual fields. SQL has the ability to dynamically link tables together within the selection process; hence the relational side of a RDBMS. It&#8217;s really all good stuff&#8230;</p>
<p>The summary of the chapter leads to the conclusion that the NF² data model is &#8220;&#8230;really a hybrid of the relational and the hierarchical data model.&#8221; and there are problems with data redundancy, ownership of objects, and sharing of objects due to the nesting. The NF² model provides a extremely concise data structure, but the side-effect is that the extended SQL query becomes non-trivial and just as complex as for a pure relational model schema. OK!</p>
<p>The annotated bibliography at the end of the chapter lists an interesting selection of papers and presentations regarding NF² data structuring concepts. They are all based approximately around 1986 to 1987.  There are references to the AIM-P and DASDBS database prototypes, and the HDBL language. And then there is R²D² &#8211; a relational database system; not the <a title="http://en.wikipedia.org/wiki/R2D2" href="http://en.wikipedia.org/wiki/R2D2" target="_blank">inverted-rubbish-bin-on-wheels robot</a>. There is NO references to the PICK data model. Rather sad.</p>
<p>So, I am currently attempting to beg, borrow, and steal the text of these references and citations, in an attempt to follow through and see that all the excitement is all about. Why? Well, this is the first time that I have come across some form of academic analysis of the NF² model. There is nothing contemporary  happening on the subject &#8211; shame on the multi-value database vendors (remember, a white-paper is a SALES tool &#8211; like a brochure; not an unbiased scientific/academic paper).</p>
<p>So, if you have any information regarding the above NF² systems, leave a comment please.</p>
<p>And I will be writing more when I  found out more. It would be nice to be able to sit across the boardroom table and throw out some academic references on the multi-value model when the selling gets tough.</p>
<p>All good stuff really&#8230;</p>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/07/21/what-happened-in-1986/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Document Paradigm in UniBasic</title>
		<link>http://davidjmurray.org/2011/05/16/document-paradigm-in-unibasic/</link>
		<comments>http://davidjmurray.org/2011/05/16/document-paradigm-in-unibasic/#comments</comments>
		<pubDate>Mon, 16 May 2011 19:19:11 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Idea!]]></category>
		<category><![CDATA[mvdbs]]></category>
		<category><![CDATA[SystemBuilder]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[UniBasic]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[U2]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=517</guid>
		<description><![CDATA[Yet again, while running around the great inter-web, I found an interesting article which compares different database paradigms. The comparisons provided are between relational, document, key/value, and column-oriented databases. This lead me to thinking back to a comment that someone &#8230; <a href="http://davidjmurray.org/2011/05/16/document-paradigm-in-unibasic/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yet again, while running around the great inter-web, I found an interesting <a title="http://www.brentozar.com/archive/2011/05/which-database-right-for-me/" href="http://www.brentozar.com/archive/2011/05/which-database-right-for-me/" target="_blank">article</a> which compares different database paradigms. The comparisons provided are between <a title="http://en.wikipedia.org/wiki/Relational_database" href="http://en.wikipedia.org/wiki/Relational_database" target="_blank">relational</a>, <a title="http://en.wikipedia.org/wiki/Document-oriented_database" href="http://en.wikipedia.org/wiki/Document-oriented_database" target="_blank">document</a>, <a title="http://en.wikipedia.org/wiki/Key-value_store#Key-value_store" href="http://en.wikipedia.org/wiki/Key-value_store#Key-value_store" target="_blank">key/value</a>, and <a title="http://en.wikipedia.org/wiki/Column-oriented_DBMS" href="http://en.wikipedia.org/wiki/Column-oriented_DBMS" target="_blank">column-oriented</a> databases. This lead me to thinking back to a comment that someone recently said to me that they use UniVerse as a document store database.</p>
<p>At the time, I thought &#8211; what the &#8230; But then again, there just might be something in this:</p>
<p><span id="more-517"></span>As I have stated before, I consider that the U2/PICK database model to be very ER (<a title="http://en.wikipedia.org/wiki/Entity-relationship_model" href="http://en.wikipedia.org/wiki/Entity-relationship_model" target="_blank">Entity-Relationship</a>) Model based; hence the name I use: DDERDBMS &#8211; Dictionary-Driven Entity-Relationship DataBase Management System.</p>
<p>This makes sense, as the data is structured as ER relationships, and in most cases does not need to be normalized (think back to your text book ERD chapter). The actual fields, attributes, and values are then defined at the dictionary level.; where the dictionary definitions actually &#8216;point&#8217; to fixed positions within the database e.g. &lt;1,2&gt;.</p>
<p>But, what about the UniBasic coding environment? Fields are not actually referenced by the data dictionary definitions. They are referenced as either a static multidimensional array or as a dynamic array,  essentially as a document structure. Of cause, like many other people, I have written or used some sort of utility to create a series of EQUATE statements for each data file, which can be INCLUDE&#8217;d within the appropriate UniBasic source code so some sort of relevance between the field and value numbers and names exist. Even SB+ has such a utility. But, even then, the ASSOCIATIVE relationship between fields and values are not known within UniBasic. It&#8217;s all manually managed outside of the programming environment (think paper, the brain,and a good memory).</p>
<p>But, at the end of the day, all references of fields and values are via positional numbers, not by actual field names. There are significant advantages and disadvantages, as expected; lack of self-documenting code is the first one that comes to mind as a major disadvantage.</p>
<p>So, what is the big deal? Well, over the last couple of months, longer maybe, there has been spurts of chatter within the couple of U2 forums about the future of U2 (market is growing?) and job opportunities etc. Ignoring all the politics which exists between the Haves (VAR&#8217;s) and the Have-Nots (employees and contractors) the general consensus is that the market has changed. This is  due to the way that U2 is used. It is no longer used as a complete front-end to back-end development environment. There are now multiple front-ends to consider (desktop, phone, web, tablet!) with better tools to create and maintain them. U2 is being relegated to the back-end.</p>
<p>This is a trend that no-one should be surprised with, as in the distant past, PICK -type databases were the OS, database, programming environment, and the client interface. Over time each of these functions have been replaced with more generic, and better alternatives e.g. the OS is now either MS-Windows or Linux (Unix).</p>
<p>So, if you are using a client/server structure for access to the U2 database, then there is probability an API. Therefore, using U2 Access for report generation must be on the decline, and the use of the dictionary definitions for a data file are for documentation reasons only? Well, using the field definitions does come in handy for implementing indexing and the odd SELECT statement, I suppose.</p>
<p>Which comes back to the UniBasic programming paradigm environment. Reading a record returns a collection of  multiple collections of multiple values, which all have positional relevance. Something like a document-oriented database.</p>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/05/16/document-paradigm-in-unibasic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft to standardize NoSQL?</title>
		<link>http://davidjmurray.org/2011/04/26/microsoft-to-standardize-nosql/</link>
		<comments>http://davidjmurray.org/2011/04/26/microsoft-to-standardize-nosql/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 20:42:15 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=514</guid>
		<description><![CDATA[An interesting news item from Computer World points to an article in the ACM magazine about Microsoft wanting to standardize NoSQL &#8211; similar to SQL (Structured Query Language) and how this gained traction for relational databases. This also leads to &#8230; <a href="http://davidjmurray.org/2011/04/26/microsoft-to-standardize-nosql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>An interesting news item from <a title="http://www.computerworld.com/s/article/9215526/Microsoft_researchers_NoSQL_needs_standardization" href="http://www.computerworld.com/s/article/9215526/Microsoft_researchers_NoSQL_needs_standardization" target="_blank">Computer World</a> points to an article in the ACM magazine about Microsoft wanting to standardize NoSQL &#8211; similar to SQL (Structured Query Language) and how this gained traction for relational databases.</p>
<p>This also leads to what a NoSQL database actually is &#8211; and is U2 a NoSQL database?</p>
<p>I personally believe that U2 and PICK type databases , in general, are not NoSQL.</p>
<p>They are DDERDBMS &#8211; Dictionary Driven Entity Relationship DataBase Management Systems.</p>
<p>Just rolls off the tongue&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/04/26/microsoft-to-standardize-nosql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free eBook on Database Team Development</title>
		<link>http://davidjmurray.org/2011/03/24/free-ebook-on-database-team-development/</link>
		<comments>http://davidjmurray.org/2011/03/24/free-ebook-on-database-team-development/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 20:52:16 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Free-bees]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Techniques]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=512</guid>
		<description><![CDATA[Well, the focus of the book is on Microsoft SQL-Server, but there are some ideas there, which may be of interest to U2 people. Have a look at &#8211; http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/assets/RG_Guide_to_SQL_Server_Dev.pdf]]></description>
			<content:encoded><![CDATA[<p>Well, the focus of the book is on Microsoft SQL-Server, but there are some ideas there, which may be of interest to U2 people.</p>
<p>Have a look at &#8211; <a title="http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/assets/RG_Guide_to_SQL_Server_Dev.pdf" href="http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/assets/RG_Guide_to_SQL_Server_Dev.pdf" target="_blank">http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/assets/RG_Guide_to_SQL_Server_Dev.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/03/24/free-ebook-on-database-team-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Knuth Humor</title>
		<link>http://davidjmurray.org/2011/03/04/knuth-humor/</link>
		<comments>http://davidjmurray.org/2011/03/04/knuth-humor/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 18:04:54 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Laugh]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=510</guid>
		<description><![CDATA[I recently purchased Donald Knuth&#8217;s &#8216;The Art of Computer Programming: Volume 3: Sorting and Searching&#8221;.  It&#8217;s a heavy read, but has some rather good bits. Also Knuth has a sense of humor which lightens the reading a wee bit, so &#8230; <a href="http://davidjmurray.org/2011/03/04/knuth-humor/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I recently purchased Donald Knuth&#8217;s &#8216;The Art of Computer Programming: Volume 3: Sorting and Searching&#8221;.  It&#8217;s a heavy read, but has some rather good bits.</p>
<p>Also Knuth has a sense of humor which lightens the reading a wee bit, so I am glad to find an article which lists one-liner jokes about Knuth &#8211; <a title="http://jjinux.blogspot.com/2011/03/humor-donald-knuth-jokes.html" href="http://jjinux.blogspot.com/2011/03/humor-donald-knuth-jokes.html" target="_blank">http://jjinux.blogspot.com/2011/03/humor-donald-knuth-jokes.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/03/04/knuth-humor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to time travel with @DATE</title>
		<link>http://davidjmurray.org/2011/02/28/how-to-time-travel-with-date/</link>
		<comments>http://davidjmurray.org/2011/02/28/how-to-time-travel-with-date/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 02:15:02 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[mvdbs]]></category>
		<category><![CDATA[U2]]></category>
		<category><![CDATA[unFeature]]></category>
		<category><![CDATA[UniBasic]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Weird]]></category>

		<guid isPermaLink="false">http://mvdbs.e-methods.net/?p=4</guid>
		<description><![CDATA[Way back in Feb. 2008, I started to write this article about an interesting @DATE pass-by-reference issue. Then I got sidetracked. So, this bug existed in whatever version was trialware at that time. Guess what? It still exists in 10.3.7.0 &#8230; <a href="http://davidjmurray.org/2011/02/28/how-to-time-travel-with-date/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Way back in Feb. 2008, I started to write this article about an interesting @DATE pass-by-reference issue. Then I got sidetracked. So, this <em>bug</em> existed in whatever version was trialware at that time.</p>
<p>Guess what? It still exists in 10.3.7.0 on MS-Windows. So, here is how to time travel with @DATE.</p>
<p><span id="more-493"></span></p>
<p>Before we start, take this poll:</p>
<p>[poll id="3"]</p>
<p>I had found a problem with the SUBR call in a I-Type field definition. After testing, it appears to be within a BASIC program as well and is to do with the pass-by-value and pass-by-reference differences. So I thought.</p>
<p>The routine is passed a date, which I use @DATE as the default for this month. For other months or days, I would add or subtract 30,60,90 etc.</p>
<blockquote>
<pre>SUBR("CALC.DTE.SUBR",MODE,@DATE)
</pre>
</blockquote>
<p>Within the routine, the date variable is changed &#8211; adding 1 or 2 days based on some simple calculations. What I found was that the system date was changing as well!</p>
<p>So, I have below two routines to test the theory:</p>
<blockquote>
<pre>PROGRAM RUN.TEST.DATE

RESULT = 0

PRINT "S@DATE = ", @DATE, OCONV(@DATE, "D4")
RESULT = SUBR("TEST.DATE", @DATE)
PRINT "E@DATE = ", @DATE, OCONV(@DATE, "D4")

END
</pre>
</blockquote>
<p>and</p>
<blockquote>
<pre>SUBROUTINE TEST.DATE(RESULT, PARAM1 )

PRINT "PDATE = ", PARAM1, OCONV(PARAM1, "D4")
PRINT "@DATE = ", @DATE, OCONV(@DATE, "D4")
PRINT "DATE() = ", DATE(), OCONV(DATE(), "D4")

PARAM1 += 1
PRINT "ADDED A DAY"

PRINT "PDATE = ", PARAM1, OCONV(PARAM1, "D4")
PRINT "@DATE = ", @DATE, OCONV(@DATE, "D4")
PRINT "DATE() = ", DATE(), OCONV(DATE(), "D4")

RESULT = 0

RETURN
END
</pre>
</blockquote>
<p>The output will be:</p>
<blockquote>
<pre>S@DATE =  15765     28 FEB 2011
PDATE =   15765     28 FEB 2011
@DATE =   15765     28 FEB 2011
DATE() =  15765     28 FEB 2011
ADDED A DAY
PDATE =   15766     01 MAR 2011
@DATE =   15766     01 MAR 2011
DATE() =  15765     28 FEB 2011
E@DATE =  15766     01 MAR 2011
</pre>
</blockquote>
<p>So, if you follow the PRINT statements, I start in the PROGRAM with 28 Feb, pass that through with @DATE as the parameter (pass by reference) and then added one day to it. The parameter within the subroutine changes to 1st March (PDATE) and also the date @DATE has also changed!</p>
<p>Since the parameter was passed by reference, the date (via @DATE) has also changed within the calling program (E@DATE).</p>
<p>If I change the passing of the parameter to pass-by-value by placing the parameter within brackets, the problem goes away.</p>
<p>If I change the passing parameter to DATE(), then the problem does not occur. So, what is the difference between @DATE and DATE()?</p>
<p>Well, I did discover something which I was not aware of: @DATE is the &#8220;internal date when the program was invoked&#8221;. This is from the UniBasic Reference documentation. I had always assumed that it was the system date now. Appears not! You learn something new everyday&#8230;</p>
<p>And DATE() &#8220;&#8230; return(s) the numeric value of the internal system date.&#8221; That makes sense. OK&#8230;</p>
<p>So, @DATE (and assuming that all derived @ values e.g. @DAY) are actually system variables that are created at the time of the program is invoked (run). And they are mutable. That is, they can be changed.</p>
<p>And this is all correct!</p>
<p>Oh, Yes. In the Appendix E of the UniVerse Basic Manual, there is a list of the @variables and &#8220;&#8230;denoted by an asterisk (*) are read-only. All others can be changed by the user.&#8221;</p>
<p>@DATE, @DAY, @MONTH and a whole bunch of others are mutable.</p>
<p>So, if you want to fudge your time sheets within your departments time-sheet software, in the next maintenance cycle, refactor to use @DATE and @TIME. Only joking, of cause.</p>
<p>So, recapping; DATE() is the CURRENT system date; @DATE WAS the date that the program was started, and if you started it late, you can change it. And all the subroutine parameter passing? Not really relevant; it was how I re-found the knowledge of @DATE.</p>
<p>Now, who can be honest here? How many readers thought that @DATE and DATE() were interchangeable?</p>
<p>And now?</p>
<p>[poll id="4"]</p>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/02/28/how-to-time-travel-with-date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cult of Excel</title>
		<link>http://davidjmurray.org/2011/02/28/cult-of-excel/</link>
		<comments>http://davidjmurray.org/2011/02/28/cult-of-excel/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 18:13:13 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[MS-Excel]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=492</guid>
		<description><![CDATA[I have written about the use of MS-Excel before (see related posts at end), so an article on the weirder uses of MS-Excel is not out of order- http://www.computerworld.com/s/article/9211699/Use_Microsoft_Excel_for_Nearly_Everything . As most IT people have found, I also repeatedly find &#8230; <a href="http://davidjmurray.org/2011/02/28/cult-of-excel/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I have written about the use of MS-Excel before (see related posts at end), so an article on the weirder uses of MS-Excel is not out of order- <a title="http://www.computerworld.com/s/article/9211699/Use_Microsoft_Excel_for_Nearly_Everything" href="http://www.computerworld.com/s/article/9211699/Use_Microsoft_Excel_for_Nearly_Everything" target="_blank">http://www.computerworld.com/s/article/9211699/Use_Microsoft_Excel_for_Nearly_Everything</a> .</p>
<p>As most IT people have found, I also repeatedly find MS-Excel used for all sorts of patchwork business processes. Some have even been clever. But the <a title="http://en.wikipedia.org/wiki/Information_silo" href="http://en.wikipedia.org/wiki/Information_silo" target="_blank">MS-Excel silo issue</a> always raises it ugly head.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/02/28/cult-of-excel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DRY Subroutines</title>
		<link>http://davidjmurray.org/2011/02/26/dry-subroutines/</link>
		<comments>http://davidjmurray.org/2011/02/26/dry-subroutines/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 18:00:47 +0000</pubDate>
		<dc:creator>davidjmurray</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Idea!]]></category>
		<category><![CDATA[mvdbs]]></category>
		<category><![CDATA[SystemBuilder]]></category>
		<category><![CDATA[Techniques]]></category>
		<category><![CDATA[UniBasic]]></category>
		<category><![CDATA[UniVerse]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[U2]]></category>

		<guid isPermaLink="false">http://mvdbs.com/?p=441</guid>
		<description><![CDATA[The principle of DRY has been around for sometime. When applied to the PICK/U2 environment, there are two main methods of implementation via routines &#8211; internal subroutines (GOSUB) and external subroutines (SUBROUTINE/FUNCTION). But the relationship between these two methods and &#8230; <a href="http://davidjmurray.org/2011/02/26/dry-subroutines/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The principle of <a title="Don't Repeat Yourself" href="https://secure.wikimedia.org/wikipedia/en/wiki/Don%27t_repeat_yourself" target="_blank">DRY</a> has been around for sometime. When applied to the PICK/U2 environment, there are two main methods of implementation via routines &#8211; internal subroutines (GOSUB) and external subroutines (SUBROUTINE/FUNCTION).</p>
<p>But the relationship between these two methods and in particular between SUBROUTINE and FUNCTION is rather interesting.</p>
<p><span id="more-441"></span></p>
<h2>Internal Subroutine</h2>
<p>The internal subroutine GOSUB is really just a hacked GOTO with a automatically stored jump back or RETURN.</p>
<p>The mechanism of use is to call the subroutine via the GOSUB statement with a label which refers to the code point to transfer to. Ending and exiting the subroutine is via the RETURN statement.</p>
<blockquote>
<pre>PROGRAM XYZ
...
GOSUB READSTUFF:
...
STOP
READSTUFF: *Routine to Read stuff
...
RETURN
</pre>
</blockquote>
<p>The internal subroutine has no local <a title="https://secure.wikimedia.org/wikipedia/en/wiki/Scope_%28programming%29" href="https://secure.wikimedia.org/wikipedia/en/wiki/Scope_%28programming%29" target="_blank">scope capabilities</a> and if not carefully written, variable naming can become an issue as they are global within the complete routine.</p>
<p>But the GOSUB can very handy when the processing and code logic becomes large and repeatable. I also think that the ON GOSUB is rather neat. I have ignored the RETURN TO statement, as like a GOTO, it is just plain evil.</p>
<p>The external subroutine on the other hand consists within it&#8217;s own right as a compiled and cataloged routine and comes within two forms &#8211; SUBROUTINE and FUNCTION.</p>
<h2>External Subroutine</h2>
<p>The subroutine is a separate routine which has been compiled and cataloged and that can be called by any other routine by the CALL statement. The routine must start with a SUBROUTINE statement which provides a name and a list of parameters that will be passed:</p>
<blockquote>
<pre>SUBROUTINE TEST(VAR1, VAR2)
...
RETURN
</pre>
</blockquote>
<p>and therefore,</p>
<blockquote>
<pre>PROGRAM XYZ
...
CALL TEST(TEST1, TEST2)
...
END
</pre>
</blockquote>
<p>Strangely enough, how the variables are passed is governed by the calling process, not the SUBROUTINE definition. By default the parameters are passed by reference; that is, the pointers to the parameter variables are passed and the values are not copied. Hence, within the SUBROUTINE, any changes to the passed variables will be reflected within the calling routine. This method is used as it is faster at transferring variables than by copying a value, where each parameter must be copied to a new variable,  especially if a large number of parameters are to be passed or if the parameters are arrays.</p>
<p>There are two common methods of dealing with this situation: define the passed parameters as pass-by values (enclose within brackets) or copy the parameters to new variables within the subroutine:</p>
<blockquote>
<pre>PROGRAM XYZ
...
CALL TEST((TEST1), (TEST2))
...
END
</pre>
</blockquote>
<p>or</p>
<blockquote>
<pre>SUBROUTINE TEST(VARTEMP1, VARTEMP2)
VAR1 = VARTEMP1
VAR2 = VARTEMP2
...
RETURN
</pre>
</blockquote>
<p>With the SUBROUTINE, any return values are transferred back via one of the calling parameters. So, I prefer to use method two, copying around the input values as it is not really appropriate to have this controlled by the calling routine.</p>
<blockquote>
<pre>PROGRAM XYZ
...
CALL TEST(INVAR1, INVAR2, RESULT)
...
END
</pre>
</blockquote>
<p>and</p>
<blockquote>
<pre>SUBROUTINE TEST(INVARTEMP1, INVARTEMP2, RESULT)
INVAR1 = INVARTEMP1
INVAR2 = INVARTEMP2
...
RETURN
</pre>
</blockquote>
<h2>External Function</h2>
<p>The FUNCTION is similar to the SUBROUTINE except that a value is returned by the RETURN statement and the calling process is similar to a normal function with UniBasic.</p>
<p>The routine must be defined as a function by the FUNCTION statement on  the first line of the routine and within the calling routine, the  function name must be defined as a function via the DEFFUN statement:</p>
<blockquote>
<pre>FUNCTION TEST(VAR1, VAR2)
...
RETURN(RESULT)
</pre>
</blockquote>
<p>and</p>
<blockquote>
<pre>PROGRAM TESTFUN
DEFFUN TEST(VAR1, VAR2)
...
RESULT = TEST(VAR1, VAR2)
...
END
</pre>
</blockquote>
<p>The parameters within the DEFFUN statement are dummies, and are only used to define what type of data is being transferred (string or array, for example). The interesting part is that there is an &#8216;invisible&#8217; variable created within the function parameter list for the return value. It is placed as the first variable within the argument list. This is equivalent to:</p>
<blockquote>
<pre>FUNCTION TEST(<em>RESULT</em>, VAR1, VAR2)
</pre>
</blockquote>
<h2>SUBR</h2>
<p>The use of the SUBR statement is similar to the FUNCTION except the name of the function to call is passed as the first parameter. Also, the returned parameter must be the second parameter within the list.</p>
<p>There is a lengthy description within the U2documentation &#8211; the UniBasic Reference Manual &#8211; about how to structure a SUBROUTINE to work with the SUBR.</p>
<p>So, can a function and a subroutine be interchangeable when used with a SUBR? Yes, if the subroutine follows the return-as-first-parameter rule.</p>
<p>For example, here are a subroutine and function:</p>
<blockquote>
<pre>SUBROUTINE TESTSUB(RESULT, PARAM1, PARAM2)
  RESULT = "TESTSUB = " : PARAM1 + PARAM2
RETURN
</pre>
</blockquote>
<p>and</p>
<blockquote>
<pre>FUNCTION TESTFUNC(PARAM1, PARAM2)
  RESULT = "TESTFUNC = " : PARAM1 * PARAM2
RETURN(RESULT)
</pre>
</blockquote>
<p>and</p>
<blockquote>
<pre>PROGRAM TEST
  EQUATE EMPTY.STR TO ""

  PRINT SUBR("TESTSUB", 2, 3)
  PRINT SUBR("TESTFUNC", 2, 3)

  DEFFUN TESTSUB(PARAM1, PARAM2)
  PRINT "DEFFUN = " : TESTSUB(1,2)

  RESULT = EMPTY.STR
  CALL TESTFUNC(RESULT, 3, 4)
  PRINT "FUNC AS SUB = " : RESULT
END
</pre>
</blockquote>
<p>and the output will be:</p>
<blockquote>
<pre>TESTSUB = 5
TESTFUNC = 6
DEFFUN = TESTSUB = 3
FUNC AS SUB = TESTFUNC = 12
</pre>
</blockquote>
<p>The SUBROUTINE and FUNCTION are interchangeable as long as the parameters adhere to the structure of the result variable as the first variable in the SUBROUTINE list.</p>
<p>As the SUBR is normally used within a derived field, it is possible to write one routine that can be used within a UniBasic program and within a dictionary field (derived) definition without any changes. This is an important concept that is often overlooked within U2.</p>
<p>And yes, if you had noticed, everything becomes a function! Is this so bad?</p>
<p>This can also be extended into SB+ by the use of a small PARAGRAPH to wrap the CALL statement. And as I have mentioned before, SB+ is a <strong>highly functional paradigm</strong>.</p>
<p>So, back to DRY &#8211; Don&#8217;t Repeat Yourself &#8211; use one routine for each of your business logic and processes, in all places within U2.</p>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
<div style="position: absolute; background-color: #f5ebbc; margin: 0pt; padding: 2px; z-index: 10000000; visibility: hidden; border: 1px solid #ffffdd #857a4a #857a4a #ffffdd;"><a class="zoomtoolbarbutton" title="Zoom in" href="#">+</a><a class="zoomtoolbarbutton" title="Zoom out" href="#">-</a><a class="zoomtoolbarbutton" title="Restore" href="#">↲</a><a class="zoomtoolbarbutton" title="View image" href="#">V</a></div>
]]></content:encoded>
			<wfw:commentRss>http://davidjmurray.org/2011/02/26/dry-subroutines/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  www.davidjmurray.org/feed/ ) in 0.34026 seconds, on Feb 23rd, 2012 at 1:58 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 23rd, 2012 at 11:58 am UTC -->
