<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>My Technical Notes Blog</title>
	<atom:link href="http://quicktechnicalnotes.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://quicktechnicalnotes.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Mon, 20 Jul 2009 17:10:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='quicktechnicalnotes.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>My Technical Notes Blog</title>
		<link>http://quicktechnicalnotes.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://quicktechnicalnotes.wordpress.com/osd.xml" title="My Technical Notes Blog" />
	<atom:link rel='hub' href='http://quicktechnicalnotes.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Indexing Unstructured Data</title>
		<link>http://quicktechnicalnotes.wordpress.com/2009/07/19/indexing-unstructured-data/</link>
		<comments>http://quicktechnicalnotes.wordpress.com/2009/07/19/indexing-unstructured-data/#comments</comments>
		<pubDate>Sun, 19 Jul 2009 21:55:51 +0000</pubDate>
		<dc:creator>pauldavidgilligan</dc:creator>
				<category><![CDATA[DMS]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[data model]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[RDBMS]]></category>
		<category><![CDATA[unstructured data]]></category>

		<guid isPermaLink="false">http://quicktechnicalnotes.wordpress.com/?p=47</guid>
		<description><![CDATA[There are a number of Document Management Systems (DMS) on the market and some are very expensive, so why not build your own ? <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=47&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>There are a number of Document Management Systems (DMS) on the market and some are very expensive, so why not build your own ? You could use the tips here also for other applications when you want to index data with a low selectivity or data that is classed as unstructured [<a title="Unstructured Data" href="should be considered for large document" target="_blank">http://en.wikipedia.org/wiki/Unstructured_data</a>]. I have Oracle relational databases in mind in this article but the same techniques could be used for other relational database types.</p>
<p><strong>Objective</strong></p>
<p>The problem with most indexes is that in general they need to match the data in the columns used in the table in order to be selective. There are plenty of articles from Oracle on this and other sources so I won&#8217;t go into it here.</p>
<p>Unstructured data is difficult to index and often you do not know in advance the values that will be contained in the columns.</p>
<p>To aid in locating or classifying documents often phrases or key words are used and or other data that makes up a bibliographical reference for the document [<a title="bibliography" href="http://en.wikipedia.org/wiki/Bibliography" target="_blank">http://en.wikipedia.org/wiki/Bibliography</a>].</p>
<p>Consider you are loading many documents with a simple key phrase, e.g. GOOSE, GOOSEBERRY, GOOSECOID PROTEIN, GOOSEFLESH, GOPHER.</p>
<p>This sequence of phrases or key words represents 5 phrases of index key &#8220;GO&#8221;, if this was followed by 100 phrases of &#8220;JA&#8221; and 1000 phrases of &#8220;WA&#8221; you can soon see that the selectivity is difficult to control and predict. Oracle&#8217;s Cost Based Optimiser and various other indexing techniques can help here but in production environments you really want to guarantee the time it takes to access the documents that you are searching for.</p>
<p>The objective here is therefore to provide a framework around the document data that can be used to guarantee document access times.</p>
<p><strong>Simple Data Model</strong></p>
<p>One answer or tip here is very simple, you have to turn the problem around in order to solve it. If we step back from the problem and think what is the fastest way to access data in a logical database ?</p>
<p>The answer is the primary key.</p>
<p>I am of cause ignoring the physical keys such as rowid in an Oracle database as I want to keep the solution logical and so you might come up with the data model below:</p>
<div id="attachment_14" class="wp-caption aligncenter" style="width: 336px"><img class="size-medium wp-image-14 " title="Simple DMS indexing" src="http://quicktechnicalnotes.files.wordpress.com/2009/07/docdesign12.jpg?w=326&#038;h=379" alt="Simple DMS indexing" width="326" height="379" /><p class="wp-caption-text">Simple DMS indexing</p></div>
<p>In the data model above we make the PHRASE unique and a primary key.</p>
<p>We generate a unique identifier for the row GID, I have used the global identifier that Oracle/JAVA can generate in this example, this is a technical unique identifier and has little meaning for the end user.</p>
<p>The detail table shows the same GID row, with a sequence and then a pointer to the actual document we are trying to locate. This document pointer could be anything of cause and depends on your own design.</p>
<p>So you need an application to handle to incoming data that says:</p>
<ol>
<li>I have a new PHRASE, so generate a new GID value and add rows in the master detail tables.</li>
<li>I have an existing PHRASE so add a new row to the detail table with a new sequence value.</li>
</ol>
<p>A search for a given phrase you then lookup the PHRASE in the master table and get a list, via the GID, of the documents from the detail table. The lookup time should be stable and predictable even with larger row counts for the detail table.</p>
<p>Further more both tables could in fact be Index Oriented Tables (IOT) in the Oracle case.</p>
<p><strong>State Machine</strong></p>
<p>Bibliographical records for documents can contain a number of data field types, so you could have a number of master detail tables for each field type and PL/SQL routines to maintain the data.</p>
<p>The application logic to control this might look like the diagram segment I have drawn below:</p>
<div id="attachment_14" class="wp-caption aligncenter" style="width: 343px"><a href="http://quicktechnicalnotes.files.wordpress.com/2009/07/state1.jpg"><img class="size-medium wp-image-14    " title="State Machine Section" src="http://quicktechnicalnotes.files.wordpress.com/2009/07/state1.jpg?w=333&#038;h=242" alt="Simple DMS indexing" width="333" height="242" /></a><p class="wp-caption-text">State Machine Section</p></div>
<p>The diagram divided into three sections as you often load initial data into a database temporary section which I have called <em>load time</em>. <em>Maintain and query time</em> are the sections that deal with the query framework. The CAR objects are the database objects that store the document data and the CAM objects store the master detail objects in the data model given in this tip. I am using a car engine parts for the object group names which is just my sense of humor. Ignore the CIT objects as they have another purpose.</p>
<p>The diagram really says at X2.10 that you need to generate the required data for each incoming documents bibliographical fields. Each CAM would represent each field, PUBLISHED DATE, AUTHOR, TITLE, PHRASE etc. so you might have to add rows to each CAM depending on the availability of the field data.</p>
<p>X2.11 deals with the removal of a document which should be a rare operation.</p>
<p>So there is a concept of promoting a document for query and then demoting it again if the document is in error.</p>
<p><strong>Disadvantages</strong></p>
<p>The tip here is more complex than using standard indexes and should be considered for large document, but most DMS systems are complicated. Disk storage, CPU and memory are though cheep these days.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/quicktechnicalnotes.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/quicktechnicalnotes.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/quicktechnicalnotes.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=47&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://quicktechnicalnotes.wordpress.com/2009/07/19/indexing-unstructured-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/448f0c88e00b451d552c850a8abefa8c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldavidgilligan</media:title>
		</media:content>

		<media:content url="http://quicktechnicalnotes.files.wordpress.com/2009/07/docdesign12.jpg" medium="image">
			<media:title type="html">Simple DMS indexing</media:title>
		</media:content>

		<media:content url="http://quicktechnicalnotes.files.wordpress.com/2009/07/state1.jpg" medium="image">
			<media:title type="html">State Machine Section</media:title>
		</media:content>
	</item>
		<item>
		<title>Setup SSH public key authentication</title>
		<link>http://quicktechnicalnotes.wordpress.com/2009/07/07/setup-ssh-public-key-authentication/</link>
		<comments>http://quicktechnicalnotes.wordpress.com/2009/07/07/setup-ssh-public-key-authentication/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 17:00:31 +0000</pubDate>
		<dc:creator>pauldavidgilligan</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[rsa]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://quicktechnicalnotes.wordpress.com/?p=37</guid>
		<description><![CDATA[Just some quick notes on how to setup  SSH public key authentication on unix/linux type systems. <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=37&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>Just some quick notes on how to setup  SSH public key authentication on unix/linux type systems. There are various notes around but it can be a pain sometimes to setup and I have some useful tips.</p>
<p><strong>Setup A (normally in .ssh)<br />
</strong></p>
<ul>
<li>You can generated an rsa keypair with :<em> ssh-keygen -b 2048 -t rsa</em></li>
<li>Then make a copy of the public ket file with a name that indicates the source host and user e.g.<em> cat id_rsa.pub &gt; myuser_myhostid_rsa.pub</em></li>
<li>Copy the public key file you have generated onto each host you want to connect to under the same system user account which is <em>myuser</em> in this case.</li>
<li>So on the source host myhostid in this example we have <em>~myuser/.ssh/id_rsa &amp; ~myuser/.ssh/</em><em>myuser_myhostid_rsa.pub</em></li>
<li>On the target hosts we have ~myuser/.ssh/<em>myuser_myhostid_rsa.pub <em>(which we copied)</em></em></li>
<li>On the target hosts you need open a new terminal window and find the the log file that contains the sshd entries.</li>
<li>You should now <em>tail -f</em> the sshd log file</li>
<li>Now if you try and connect to the target host you will find it will not work, the sshd has made error entries in the log file informing you that there is a problem with configuration &#8211; this could be host not accepted or file permission errors</li>
<li>The reason for this is that the sshd is very strict about the locations and permissions of the files under the .ssh directory</li>
</ul>
<p><strong>Setup B</strong></p>
<p>On the target machine you now need to correct these errors:-</p>
<ol>
<li>host permission with cat &#8216;<em>myuser_myhostid_rsa.pu<em>b</em></em><em>&#8216; &gt;&gt; authorized_keys</em></li>
<li> <em>chmod go-w ~/</em><br />
<em>chmod 700 ~/.ssh</em><br />
<em>chmod 600 ~/.ssh/authorized_keys</em><br />
<em>chmod 600 ~/.ssh/identity</em></li>
</ol>
<p>Now from the source host you should be able to connect with little problems and see the connection data logged.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/quicktechnicalnotes.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/quicktechnicalnotes.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/quicktechnicalnotes.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=37&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://quicktechnicalnotes.wordpress.com/2009/07/07/setup-ssh-public-key-authentication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/448f0c88e00b451d552c850a8abefa8c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldavidgilligan</media:title>
		</media:content>
	</item>
		<item>
		<title>Using Apache Ant to handle Peoplesoft Cobol Build</title>
		<link>http://quicktechnicalnotes.wordpress.com/2009/07/05/using-apache-ant-to-handle-peoplesoft-cobol-build/</link>
		<comments>http://quicktechnicalnotes.wordpress.com/2009/07/05/using-apache-ant-to-handle-peoplesoft-cobol-build/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 10:14:06 +0000</pubDate>
		<dc:creator>pauldavidgilligan</dc:creator>
				<category><![CDATA[Ant]]></category>
		<category><![CDATA[Peoplesoft]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://quicktechnicalnotes.wordpress.com/?p=30</guid>
		<description><![CDATA[Ant helping to build more complex Peoplesoft environments(old way)<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=30&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>The ant build script in this blog is a little out of date as Peoplesoft(now Oracle) rely less and less on cobol these days but never the less I thought to write up the techniques here as they can be applied to other situations.</p>
<p>The issues we were facing were:</p>
<ul>
<li>Peoplesoft is developed for both Windows and Unix platforms so CRLF issues vary from file to file.</li>
<li>Peoplesoft file extensions are not always all upper case or lower case creating yet more issues for compilation.</li>
<li>File permissions had to be set correctly (as in most cases).</li>
<li>A bundle for distribution was required.</li>
<li>A call would be required for the pscbl.mak command to build the cobol source files.</li>
</ul>
<p><strong>What It Does</strong></p>
<p>The convert task  does all the file type and content corrections, ant does not have the built in functions for CRLF correction at the time of development so I made some quick and dirty plugins (fixfilecase &amp; fixcrlf).</p>
<p>The compile tasks excecutes a skeleton Peoplesoft environment that has just enough of an install for &lt;exec executable=&#8221;${ps_home}/install/pscbl.mak&#8221;&gt; to run.</p>
<p><strong>The Ant Build Script</strong></p>
<p>&lt;project name=&#8221;build_cobol&#8221; default=&#8221;dist&#8221;&gt;</p>
<p>&lt;taskdef name=&#8221;fixfilecase&#8221; classname=&#8221;AntXtra.FixFileCase&#8221;/&gt;</p>
<p>&lt;description&gt;<br />
This build project allows you to build a distribution of cobol<br />
source from NT based development, correcting for CRLF chars and<br />
source file case sensitivity which can then be distributed to unix<br />
application servers.<br />
&lt;/description&gt;</p>
<p>&lt;target name=&#8221;init&#8221;&gt;<br />
&lt;tstamp/&gt;<br />
&lt;loadproperties srcFile=&#8221;/data/chrispfs/AAB/config/ant/ant.properties&#8221;/&gt;<br />
&lt;record name=&#8221;${aablogs}/cobol_${release}.txt&#8221;/&gt;<br />
&lt;chmod file=&#8221;${aablogs}/cobol_${release}.txt&#8221; perm=&#8221;ugo+r&#8221;/&gt;</p>
<p>&lt;delete dir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;/&gt;<br />
&lt;mkdir  dir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;/&gt;<br />
&lt;delete dir=&#8221;${aabhrms.dmssrc}/${build}/${release}&#8221;/&gt;<br />
&lt;mkdir  dir=&#8221;${aabhrms.dmssrc}/${build}/${release}&#8221;/&gt;</p>
<p>&lt;echo message=&#8221;Using ORACLE_HOME=${oracle_home}&#8221;/&gt;<br />
&lt;echo message=&#8221;Using ANT_HOME=${ant_home}&#8221;/&gt;<br />
&lt;echo message=&#8221;Using JAVA_HOME=${java_home}&#8221;/&gt;<br />
&lt;echo message=&#8221;Using PS_HOME=${ps_home}&#8221;/&gt;</p>
<p>&lt;/target&gt;</p>
<p>&lt;target name=&#8221;convert&#8221; depends=&#8221;init&#8221; description=&#8221;convert the source to unix&#8221; &gt;</p>
<p>&lt;copy todir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;&gt;<br />
&lt;fileset dir=&#8221;${aabhrms.cobolsrc}/${src}/${release}&#8221;&gt;<br />
&lt;include name=&#8221;**/*.*&#8221;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;mapper type=&#8221;regexp&#8221; from=&#8221;^(.*)\.[Cc][Bb][Ll]$$&#8221; to=&#8221;\1.cbl&#8221;/&gt;<br />
&lt;/copy&gt;</p>
<p>&lt;copy todir=&#8221;${aabhrms.dmssrc}/${build}/${release}&#8221;&gt;<br />
&lt;fileset dir=&#8221;${aabhrms.cobolsrc}/${src}/${release}&#8221;&gt;<br />
&lt;include name=&#8221;**/*.*&#8221;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;mapper type=&#8221;regexp&#8221; from=&#8221;^(.*)\.[Dd][Mm][Ss]$$&#8221; to=&#8221;\1.dms&#8221;/&gt;<br />
&lt;/copy&gt;</p>
<p>&lt;copy todir=&#8221;${aabhrms.dmssrc}/${src}/${release}&#8221;&gt;<br />
&lt;fileset dir=&#8221;${aabhrms.cobolsrc}/${src}/${release}&#8221;&gt;<br />
&lt;include name=&#8221;**/*.*&#8221;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;mapper type=&#8221;regexp&#8221; from=&#8221;^(.*)\.[Dd][Mm][Ss]$$&#8221; to=&#8221;\1.dms&#8221;/&gt;<br />
&lt;/copy&gt;</p>
<p>&lt;!&#8211; fix uppercase filename lower case extension  &#8211;&gt;<br />
&lt;fixfilecase srcdir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221; mask=&#8221;1&#8243; action=&#8221;1&#8243;/&gt;<br />
&lt;fixfilecase srcdir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221; mask=&#8221;2&#8243; action=&#8221;2&#8243;/&gt;</p>
<p>&lt;fixcrlf srcdir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;/&gt;<br />
&lt;fixcrlf srcdir=&#8221;${aabhrms.dmssrc}/${build}/${release}&#8221; eol=&#8221;crlf&#8221;/&gt;</p>
<p>&lt;/target&gt;</p>
<p>&lt;target name=&#8221;dist&#8221; depends=&#8221;convert&#8221; description=&#8221;generate the distribution&#8221; &gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/cobolsrc.${release}.tar&#8221;/&gt;<br />
&lt;delete file=&#8221;${aabdist}/cobolsrc.${release}.tar.gz&#8221;/&gt;</p>
<p>&lt;tar tarfile=&#8221;${aabdist}/cobolsrc.${release}.tar&#8221;<br />
basedir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;/&gt;<br />
&lt;gzip zipfile=&#8221;${aabdist}/cobolsrc.${release}.tar.gz&#8221;<br />
src=&#8221;${aabdist}/cobolsrc.${release}.tar&#8221;/&gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/cobolsrc.${release}.tar&#8221;/&gt;<br />
&lt;chmod file=&#8221;${aabdist}/cobolsrc.${release}.tar.gz&#8221; perm=&#8221;ugo+r&#8221;/&gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/dmssrc.${release}.tar&#8221;/&gt;<br />
&lt;delete file=&#8221;${aabdist}/dmssrc.${release}.tar.gz&#8221;/&gt;</p>
<p>&lt;tar tarfile=&#8221;${aabdist}/dmssrc.${release}.tar&#8221;<br />
basedir=&#8221;${aabhrms.dmssrc}/${build}/${release}&#8221;/&gt;<br />
&lt;gzip zipfile=&#8221;${aabdist}/dmssrc.${release}.tar.gz&#8221;<br />
src=&#8221;${aabdist}/dmssrc.${release}.tar&#8221;/&gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/dmssrc.${release}.tar&#8221;/&gt;<br />
&lt;chmod file=&#8221;${aabdist}/dmssrc.${release}.tar.gz&#8221; perm=&#8221;ugo+r&#8221;/&gt;</p>
<p>&lt;/target&gt;</p>
<p>&lt;target name=&#8221;compile&#8221; depends=&#8221;dist&#8221; description=&#8221;compile the source &#8220;&gt;</p>
<p>&lt;delete file=&#8221;${ps_home}/src/cbl/*&#8221;/&gt;<br />
&lt;delete file=&#8221;${ps_home}/src/cbl/int/*&#8221;/&gt;<br />
&lt;delete file=&#8221;${ps_home}/src/cbl/lst/*&#8221;/&gt;<br />
&lt;delete file=&#8221;${ps_home}/src/cbl/obj/*&#8221;/&gt;<br />
&lt;delete file=&#8221;${ps_home}/src/cblunicode/*&#8221;/&gt;<br />
&lt;delete file=&#8221;${ps_home}/cblbin/*&#8221;/&gt;</p>
<p>&lt;copy todir=&#8221;${ps_home}/src/cbl&#8221;&gt;<br />
&lt;fileset dir=&#8221;${aabhrms.cobolsrc}/${build}/${release}&#8221;&gt;<br />
&lt;include name=&#8221;**/*.*&#8221;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;/copy&gt;</p>
<p>&lt;exec executable=&#8221;${ps_home}/install/pscbl.mak&#8221;&gt;<br />
&lt;/exec&gt;</p>
<p>&lt;/target&gt;</p>
<p>&lt;target name=&#8221;bindist&#8221; depends=&#8221;compile&#8221; description=&#8221;generate the distribution&#8221; &gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/cobolbin.${release}.tar&#8221;/&gt;<br />
&lt;delete file=&#8221;${aabdist}/cobolbin.${release}.tar.gz&#8221;/&gt;</p>
<p>&lt;tar tarfile=&#8221;${aabdist}/cobolbin.${release}.tar&#8221;<br />
basedir=&#8221;${ps_home}/cblbin&#8221;/&gt;<br />
&lt;gzip zipfile=&#8221;${aabdist}/cobolbin.${release}.tar.gz&#8221;<br />
src=&#8221;${aabdist}/cobolbin.${release}.tar&#8221;/&gt;</p>
<p>&lt;delete file=&#8221;${aabdist}/cobolbin.${release}.tar&#8221;/&gt;<br />
&lt;chmod file=&#8221;${aabdist}/cobolbin.${release}.tar.gz&#8221; perm=&#8221;ugo+r&#8221;/&gt;</p>
<p>&lt;/target&gt;</p>
<p>&lt;/project&gt;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/quicktechnicalnotes.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/quicktechnicalnotes.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/quicktechnicalnotes.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=30&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://quicktechnicalnotes.wordpress.com/2009/07/05/using-apache-ant-to-handle-peoplesoft-cobol-build/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/448f0c88e00b451d552c850a8abefa8c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldavidgilligan</media:title>
		</media:content>
	</item>
		<item>
		<title>Importing pkcs12 data into jks keystore</title>
		<link>http://quicktechnicalnotes.wordpress.com/2009/07/03/importing-pkcs12-data-into-jks-keystore/</link>
		<comments>http://quicktechnicalnotes.wordpress.com/2009/07/03/importing-pkcs12-data-into-jks-keystore/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 12:19:33 +0000</pubDate>
		<dc:creator>pauldavidgilligan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Keystore]]></category>
		<category><![CDATA[jks]]></category>
		<category><![CDATA[pkcs12]]></category>

		<guid isPermaLink="false">http://quicktechnicalnotes.wordpress.com/?p=23</guid>
		<description><![CDATA[Importing bulk pkcs12 data files into a jks data files is easier than you might think.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=23&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>Recently I was working on a minor tool in java to organise and import various pkcs12 data files that were provided by third partly providers to allow SSL over HTTP connections to be made. The recommended and prefered local storage is the jks format so these data files needed to be converted and imported in bulk into a jks data file. Of cause you can do this by hand but I had many files to look at so I tried to program a tool to help out, the funny thing was it was a very simple process and worked well &#8211; I did not ever have to worry if the same key entry existed in the jks data file so I could re-run the same bulk import many times with no problems.</p>
<p><strong>Development Links</strong></p>
<ul>
<li>http://en.wikipedia.org/wiki/PKCS</li>
<li>http://java.sun.com/javase/6/docs/technotes/tools/solaris/keytool.html</li>
<li>http://java.sun.com/javase/6/docs/technotes/guides/security/SunProviders.html</li>
</ul>
<p><strong>Example Java Code</strong></p>
<p>public static void ImportPKCS12toJKS(   File p12keystorefile,<br />
String p12keystorepass,<br />
String p12keyalias,<br />
String jkskeystorename,<br />
String jkskeystorepass) {</p>
<p>File jksfile = null;</p>
<p>FileOutputStream jksfos = null;<br />
FileInputStream p12fis = null;<br />
FileInputStream jksfis = null;</p>
<p>try {<br />
jksfile = new File(jkskeystorename);<br />
p12fis = new FileInputStream(p12keystorefile);<br />
jksfis = new FileInputStream(jksfile);</p>
<p>final KeyStore kspkcs12 = KeyStore.getInstance(&#8220;pkcs12&#8243;);<br />
final KeyStore ksjks = KeyStore.getInstance(&#8220;jks&#8221;);</p>
<p>kspkcs12.load(p12fis, p12keystorepass.toCharArray());<br />
ksjks.load(jksfis, jkskeystorepass.toCharArray());</p>
<p>final Enumeration en = kspkcs12.aliases();<br />
int n = 0;<br />
while (en.hasMoreElements()) {<br />
String strAlias = (String) en.nextElement();<br />
logger.info(&#8220;Alias &#8221; + n++ + &#8220;: &#8221; + strAlias);<br />
if (kspkcs12.isKeyEntry(strAlias)) {<br />
logger.info(&#8220;Adding key for alias &#8221; + strAlias);<br />
final Key key = kspkcs12.getKey(strAlias, p12keystorepass.toCharArray());<br />
final Certificate[] chain = kspkcs12.getCertificateChain(strAlias);</p>
<p>if(p12keyalias != null){<br />
logger.warn(&#8220;keyalias option set will overide &#8221; + strAlias + &#8221; with &#8221; + p12keyalias);<br />
strAlias = p12keyalias;<br />
}<br />
ksjks.setKeyEntry(strAlias, key, jkskeystorepass.toCharArray(), chain);<br />
}<br />
if(n&gt;1){<br />
logger.fatal(&#8220;Only expecting one alias entry for key pair&#8221;);<br />
}<br />
}<br />
logger.info(&#8220;JKS keystore count: &#8221; + ksjks.size());<br />
jksfos = new FileOutputStream(jksfile);<br />
logger.info(&#8220;JKS keystore commit to: &#8221; + jksfile.getAbsolutePath());<br />
ksjks.store(jksfos, jkskeystorepass.toCharArray());</p>
<p>} catch (UnrecoverableKeyException uke) {<br />
logger.warn(&#8220;UnrecoverableKeyException&#8221;, uke);<br />
} catch (IOException ioe) {<br />
logger.warn(&#8220;IOException&#8221;, ioe);<br />
} catch (NoSuchAlgorithmException nsae) {<br />
logger.warn(&#8220;NoSuchAlgorithmException&#8221;, nsae);<br />
} catch (CertificateException ce) {<br />
logger.warn(&#8220;CertificateException&#8221;, ce);<br />
} catch (KeyStoreException kse) {<br />
logger.warn(&#8220;KeyStoreException&#8221;, kse);<br />
} finally {<br />
try {<br />
jksfos.close();<br />
} catch (Exception e) {<br />
}&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/quicktechnicalnotes.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/quicktechnicalnotes.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/quicktechnicalnotes.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=23&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://quicktechnicalnotes.wordpress.com/2009/07/03/importing-pkcs12-data-into-jks-keystore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/448f0c88e00b451d552c850a8abefa8c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldavidgilligan</media:title>
		</media:content>
	</item>
		<item>
		<title>Test and configure oracle databases</title>
		<link>http://quicktechnicalnotes.wordpress.com/2009/07/02/test-and-configure-oracle-databases/</link>
		<comments>http://quicktechnicalnotes.wordpress.com/2009/07/02/test-and-configure-oracle-databases/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 19:21:34 +0000</pubDate>
		<dc:creator>pauldavidgilligan</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[DBA]]></category>

		<guid isPermaLink="false">http://quicktechnicalnotes.wordpress.com/?p=4</guid>
		<description><![CDATA[Don't just use a script to montior Oracle databases, use it to self configure too.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=4&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>In some situations when you have many Oracle databases to maintain and you do not want to use the Oracle Enterprise Manager (OEM) for this due to complexity, costs, etc. you often find that Oracle DBA&#8217;s write their own scripts.</p>
<p>The <em>testing</em> of the Oracle databases is thus a simple matter of writing a script, using perl, python, java, etc. to connect to a database and then run some test SQL.</p>
<p>The results of these tests are also sometimes written to another non-production database to record history.</p>
<p>What is however sometimes missed by DBA&#8217;s is that you can also automate the <em>configuration</em> of various oracle database files such as oratab, tnsnames ans init.ora files where required.</p>
<p><strong>A Configuration Table</strong></p>
<p>You may have for example created a table like the one below:</p>
<p>CREATE TABLE &#8220;MONITOR&#8221;.&#8221;TARGETS&#8221;<br />
(<br />
&#8220;SID&#8221; VARCHAR2 (9) NOT NULL,<br />
&#8220;TYPE&#8221; CHAR (1) NOT NULL,<br />
&#8220;HOSTNAME&#8221; VARCHAR2 (64) NOT NULL,<br />
&#8220;PORT&#8221; NUMBER NOT NULL,<br />
&#8220;TNS&#8221; VARCHAR2 (255),<br />
&#8220;STATUS&#8221; VARCHAR2 (12),<br />
&#8220;BUILD&#8221; CHAR (1),<br />
&#8220;REGION&#8221; CHAR (2)<br />
) TABLESPACE &#8220;TOOLS&#8221;;</p>
<p>[don't forget primary key]</p>
<p>In this example the SID (or service name these days), HOSTNAME, PORT are used to connect to the database for testing.</p>
<p><strong>The Process</strong></p>
<p>The test and configuration process &#8211; here is the trick.</p>
<ol>
<li>We use the table data (SID, HOSTNAME, PORT) to generate a TNSNAMES.ORA dynamically and store it external to the script in a simple file.</li>
<li>The environment for the script, for example $TNS_ADMIN, points to this generated file so that the oracle client used can connect to the target database for testing.</li>
<li>Call a PL/SQL routine to update the TNS column in the TARGETS table with the required oracle r</li>
<li>The the script can connect to the target database defined in the TARGETS table above. The script can thus loop through the records in the TARGETS table and connect to all the required databases.</li>
<li>Interesting point. If you add/change or remove records in the TARGETS table and then commit the changes the next time the script runs you have a NEW set of targets to process via the changed TNSNAMES.ORA that is generated each time the script runs.</li>
<li>You can of cause generate other oracle configuration files too.</li>
</ol>
<p><strong>PL/SQL Part Example</strong></p>
<p>/**<br />
* build, builds setup data<br />
*/<br />
function build return varchar2 is</p>
<p>v_cnt number := 0;<br />
v_tns targets.tns%TYPE;</p>
<p>cursor ct is select sid, hostname, port<br />
from targets<br />
for update of tns, status;<br />
begin<br />
DBMS_APPLICATION_INFO.SET_MODULE(<br />
module_name =&gt; &#8216;build&#8217;,<br />
action_name =&gt; &#8216;build pounce application data&#8217;);</p>
<p>dbms_utility.analyze_schema(&#8216;MONITOR&#8217;, &#8216;COMPUTE&#8217;);</p>
<p>for rec in ct loop<br />
v_tns := &#8216;(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=&#8217;<br />
|| rec.hostname || &#8216;)(PORT=&#8217;<br />
|| rec.port || &#8216;)))(CONNECT_DATA=(SID=&#8217;<br />
|| rec.sid || &#8216;)(SERVER=DEDICATED)))&#8217;;<br />
update targets set tns = v_tns, build = BUILD_NEW<br />
where sid = rec.sid;<br />
end loop;<br />
commit;</p>
<p>select count(*) into v_cnt from targets;<br />
return v_cnt;<br />
end build;</p>
<p><strong>Python Part Example</strong></p>
<p>#######################<br />
# define writetnsnames<br />
#<br />
def writetnsnames(logging, orcl, ENV):<br />
BEHEER_TXT=ENV['BEHEER_TXT']<br />
tnsfilename = os.path.normcase(BEHEER_TXT+&#8221;/tnsnames.ora&#8221;)<br />
tnsfilenamebck = os.path.normcase(BEHEER_TXT+&#8221;/tnsnames.ora.bck&#8221;)<br />
shutil.copy(tnsfilename, tnsfilenamebck)<br />
f = open(tnsfilename, &#8216;w&#8217;)<br />
f.writelines(&#8220;# \n&#8221;)<br />
f.writelines(&#8220;# tnsnames.ora generated by pounce script on &#8220;+time.ctime()+&#8221;\n&#8221;)<br />
f.writelines(&#8220;# \n&#8221;)<br />
rows = alltargets(orcl)<br />
for row in rows:<br />
(sid, tns) = (row[0], row[4])<br />
f.writelines(sid+&#8221;=&#8221;+tns+&#8221;\n&#8221;)</p>
<p>f.close()<br />
logging.info(&#8220;Generated new tnsnames.ora &#8221; + tnsfilename)<br />
return tnsfilename</p>
<p><strong>Resultant File</strong></p>
<p>#<br />
# tnsnames.ora generated by pounce script on Wed May 30 11:05:43 2007<br />
#<br />
A1ARBAT=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.64.110.142)(PORT=1721)))(CONNECT_DATA=(SID=A1ARBAT)(SERVER=DEDICATED)))<br />
A1ARBIE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.64.110.142)(PORT=1721)))(CONNECT_DATA=(SID=A1ARBIE)(SERVER=DEDICATED)))</p>
<p><strong>HTML Results</strong></p>
<p>Publish results and configurations in XML -&gt; ~HTML too:</p>
<div id="attachment_14" class="wp-caption alignnone" style="width: 459px"><img class="size-full wp-image-14" title="Summary Results in HTML" src="http://quicktechnicalnotes.files.wordpress.com/2009/07/screen1.jpg?w=450" alt="Summary Results in HTML"   /><p class="wp-caption-text">Summary Results in HTML</p></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/quicktechnicalnotes.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/quicktechnicalnotes.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/quicktechnicalnotes.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=quicktechnicalnotes.wordpress.com&amp;blog=8415313&amp;post=4&amp;subd=quicktechnicalnotes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://quicktechnicalnotes.wordpress.com/2009/07/02/test-and-configure-oracle-databases/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/448f0c88e00b451d552c850a8abefa8c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pauldavidgilligan</media:title>
		</media:content>

		<media:content url="http://quicktechnicalnotes.files.wordpress.com/2009/07/screen1.jpg" medium="image">
			<media:title type="html">Summary Results in HTML</media:title>
		</media:content>
	</item>
	</channel>
</rss>
