<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-385671493074525977</id><updated>2012-02-16T20:24:18.444-08:00</updated><category term='PHP'/><category term='xml'/><category term='waterfowl'/><category term='business'/><category term='social networking'/><category term='jQuery'/><category term='javascript'/><category term='CSS'/><category term='websites'/><category term='photography'/><category term='outdoors'/><category term='infosec'/><category term='programming'/><category term='drupal'/><category term='random thoughts'/><category term='AJAX'/><category term='Elgg'/><category term='jQueryUI'/><category term='xmlrpc'/><category term='web services'/><category term='computers'/><category term='HTML5'/><category term='web design'/><title type='text'>Paul's thoughts</title><subtitle type='html'>Things I find interesting and my various thoughts. 

Everything posted here is my own and does not reflect the position or opinion of my employer.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-8189894029132119253</id><published>2012-02-14T09:37:00.000-08:00</published><updated>2012-02-14T09:43:00.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Working notes for February 14, 2012</title><content type='html'>Today I am working on integrating &lt;a href="https://github.com/mleibman/SlickGrid/wiki" target="_blank"&gt;SlickGrid &lt;/a&gt;into a project. So far, so good.&lt;br /&gt;&lt;br /&gt;One task this has required is the insertion of a new CSS file into the page. My project structure displays all content inside of a single PHP file based on URL parameters. Therefore, when individual pages require special CSS, I need to make that happen within the page, not in the wrapper, to avoid unnecessary bandwidth usage.&lt;br /&gt;&lt;br /&gt;Here is some Javascript that will load a CSS file into the page's header when called in the body:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;var fileref=document.createElement("link");&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;fileref.setAttribute("rel", "stylesheet");&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;fileref.setAttribute("type", "text/css");&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;fileref.setAttribute("href", "thedir/thefile.css");&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;document.getElementsByTagName("head")[0].appendChild(fileref);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-8189894029132119253?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/8189894029132119253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/02/working-notes-for-february-14-2012.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8189894029132119253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8189894029132119253'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/02/working-notes-for-february-14-2012.html' title='Working notes for February 14, 2012'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-2671163073734706232</id><published>2012-02-03T09:54:00.000-08:00</published><updated>2012-02-03T16:34:28.650-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social networking'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Elgg'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Working notes Feb. 3, 2012</title><content type='html'>I am so thankful to be able to work from my home office on occasion. I can create the ideal atmosphere for maximum productivity. That's where I am today, and things are coming together nicely so far.&lt;br /&gt;&lt;br /&gt;Today, I am working on integrating an &lt;a href="http://www.elgg.org/" target="_blank"&gt;Elgg&lt;/a&gt; social network installation with a custom-built PHP/JS/jQuery/MySQL site for a continent-wide, and potentially worldwide, research project.&lt;br /&gt;&lt;br /&gt;Step 1 is to get the main site to check the user's login status in the Elgg site. Being logged into Elgg will open access to multiple tools not available to the public.&lt;br /&gt;&lt;br /&gt;Based on &lt;a href="http://pastebin.com/kPy5Rnj7" target="_blank"&gt;example code&lt;/a&gt; &lt;a href="http://community.elgg.org/pg/forum/topic/842864/using-elgg-for-user-authentication-in-external-site/" target="_blank"&gt;provided by Steve Clay&lt;/a&gt;, I have been able to access the Elgg session data for a user and return a string to tell the user they are logged in.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;?php&lt;br /&gt;/*require a PHP PDO database instance here */&lt;br /&gt;&lt;br /&gt;$elggstatus=$_COOKIE["Elgg"]; //capture the session ID&lt;br /&gt;&lt;br /&gt;if($elggstatus)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $user_id = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $sql = ("SELECT `data` FROM `elgg_users_sessions` WHERE `session` = :sessVal");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $params=array("sessVal"=&amp;gt;$elggstatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $elggUser=$thePDO-&amp;gt;thePDOselectfunction($sql,$params);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userData=$elggUser[&lt;i&gt;(dissect your PDO data structure here)&lt;/i&gt;];&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userData=explode('attributes";', $userData); //split the user object after the attributes segment&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userData=unserialize($userData[1]); //use PHP's unserialize() function to convert the data back to a PHP value&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $userDisplayName=$userData["name"]; //capture the user's "display name"&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "You are logged in as $displayName";//provide the feedback to the user.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;?&amp;gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;b&gt;Update 12:00&lt;/b&gt;&lt;br /&gt;I sure enjoy these rare occasions when everything falls into place.&amp;nbsp; Since my original posting I have been able to create a PHP class to communicate with Elgg and return user status and data.&amp;nbsp; By using this method I'll be able to extend the communication between Elgg and the main site as needed in the future.&lt;br /&gt;&lt;br /&gt;It took a little while to get past some bumps in establishing a new PHP PDO MySQL class separate from the primary instance used for the other database, but once that was fixed it works fine.&amp;nbsp; The next step is to make sure this works regardless of which URL option the user chooses to access the site. (There is a subdomain that goes directly to it, or they can use a long URL including the primary domain + directory tree) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 14:25&lt;/b&gt;&lt;br /&gt;No real surprise, what I thought was working earlier failed upon testing by a user.&amp;nbsp; Evidently Elgg returned the user object in a different order for different users, so the code I had posted earlier did not work.&amp;nbsp; I revisited Steve's example, found where I had taken a wrong turn, and revised my code. Now it accurately converts the stored value into a standard PHP array for easy and consistent parsing.&amp;nbsp; The code above has been edited to show my corrections.&lt;br /&gt;&lt;br /&gt;Next goal: make Elgg write its session cookies so that it can be read from other subdomains.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 15:35&lt;/b&gt;&lt;br /&gt;Since the last update, I have been working on trying to make the session cookie visible regardless of subdomain. No success.&lt;br /&gt;&lt;br /&gt;I tried creating a new php.ini file in the Elgg root directory with this line:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;session.cookie_domain=.mydomain.org&lt;/span&gt;&lt;br /&gt;and logged in. My browser's cookie library showed that Elgg did properly set the cookie to be owned by &lt;b&gt;.&lt;/b&gt;mydomain.com instead of mydomain.com as previously.&lt;br /&gt;&lt;br /&gt;However, login now fails totally. When I try to log in, Elgg shows a red bar in the upper right corner saying 'you have to be logged in to see this file.' I had to disable my php.ini file to get my site back.&lt;br /&gt;&lt;br /&gt;Back to researching...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 17:30&lt;/b&gt;&lt;br /&gt;The joys of software architecture... nothing to show for the past 3 hours of work. I detailed my work to get a solution for cookie visibility across subdomains in &lt;a href="http://community.elgg.org/pg/forum/topic/842953/make-session-cookie-visible-regardless-of-subdomain/" target="_blank"&gt;a post on the Elgg community&lt;/a&gt;. With an immovable deadline looming and having lost 3 hours to fruitless research on the problem, I am considering changing the entire installation configuration to minimize the chance of problems. I had hoped to build Elgg into a multisite-capable system, since we have at least 5 different projects that could utilize its social networking functionality. Given that development of &lt;a href="http://community.elgg.org/pg/groups/21771/multisite/" target="_blank"&gt;the multisite plugin&lt;/a&gt; appears to be inactive, I'll probably have to reconfigure my system to reside completely within a single subdomain to avoid these cookie issues. Maybe in the future a multi-site version of Elgg will be viable and I will reconfigure at that point in time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-2671163073734706232?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/2671163073734706232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/02/working-notes-feb-3-2012.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/2671163073734706232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/2671163073734706232'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/02/working-notes-feb-3-2012.html' title='Working notes Feb. 3, 2012'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-745891882549428391</id><published>2012-02-01T08:37:00.001-08:00</published><updated>2012-02-01T08:37:43.340-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infosec'/><title type='text'>RFID-enabled credit cards allow wireless pickpocketing</title><content type='html'>An interesting article &lt;a href="http://www.forbes.com/sites/andygreenberg/2012/01/30/hackers-demo-shows-how-easily-credit-cards-can-be-read-through-clothes-and-wallets/" target="_blank"&gt;from Forbes.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-745891882549428391?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/745891882549428391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/02/rfid-enabled-credit-cards-allow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/745891882549428391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/745891882549428391'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/02/rfid-enabled-credit-cards-allow.html' title='RFID-enabled credit cards allow wireless pickpocketing'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-4572691542615060425</id><published>2012-01-26T10:25:00.001-08:00</published><updated>2012-01-26T10:25:55.093-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web design'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='websites'/><title type='text'>Working notes January 26</title><content type='html'>I just came across a block of CSS that I generated a while back using &lt;a href="http://www.colorzilla.com/gradient-editor" target="_blank"&gt;http://www.colorzilla.com/gradient-editor&lt;/a&gt; . This is a useful tool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-4572691542615060425?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/4572691542615060425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/working-notes-january-26.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/4572691542615060425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/4572691542615060425'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/working-notes-january-26.html' title='Working notes January 26'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-8627958441864071770</id><published>2012-01-25T13:37:00.000-08:00</published><updated>2012-01-25T14:43:33.693-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='web design'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='jQueryUI'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='websites'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Useful URLs for today</title><content type='html'>Today I am working on forms. My goal is to have forms in the current project look cleaner and more modern than default HTML.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;The base I am building from:&lt;br /&gt;&lt;a href="http://line25.com/tutorials/create-a-stylish-contact-form-with-html5-css3" target="_blank"&gt;http://line25.com/tutorials/create-a-stylish-contact-form-with-html5-css3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to make form elements float into the same line instead of vertically stacked:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/2306117/radio-buttons-and-label-to-display-in-same-line" target="_blank"&gt;http://stackoverflow.com/questions/2306117/radio-buttons-and-label-to-display-in-same-line&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A good toolset for building HTML5 +CSS + JS forms&lt;br /&gt;&lt;a href="http://www.reformedapp.com/" target="_blank"&gt;www.reformedapp.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This appears to be a promising tool for creating tree controls in HTML5+jQuery&lt;br /&gt;&lt;a href="http://www.jstree.com/" target="_blank"&gt;http://www.jstree.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some tips on styling HTML dropdowns using only CSS:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1895476/how-to-style-select-dropdown-with-css-only-without-javascript" target="_blank"&gt;http://stackoverflow.com/questions/1895476/how-to-style-select-dropdown-with-css-only-without-javascript&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-8627958441864071770?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/8627958441864071770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/useful-urls-for-today.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8627958441864071770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8627958441864071770'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/useful-urls-for-today.html' title='Useful URLs for today'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-846311103297172656</id><published>2012-01-21T07:47:00.000-08:00</published><updated>2012-01-21T08:02:00.593-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Ultimate Waterfowler's Journal registration codes and instructions</title><content type='html'>&lt;span style="font-size: small;"&gt;In 2000, I created software called Ultimate Waterfowler's Journal.&amp;nbsp; I no longer am able to support the software, but I know some people out there are still using it.&amp;nbsp; Due to the registration system built into UWJ, if you upgrade your computer, UWJ will require reregistration. Without my business website online, that is not possible.&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Since UWJ should work with all versions of Windows including 7, anyone with a UWJ installation disc can keep their journals going by using the information below.&amp;nbsp; I have heard rumors that whatever version of Windows replaces Win7 will no longer support the architecture that Ultimate Waterfowler's Journal was built on. So, print out your journals while it still works.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;STEP 1:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Registration keys:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The 5-character code on the left is what UWJ displays for you to enter into the registration system. The right column contains the key that you need to enter into UWJ to satisfy the registration requirement. So, locate the correct code in the left column below, copy the value out of the right column of the same row, and that will be the key you need:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;style&gt;&lt;!--   BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:"Arial"; font-size:x-small }   --&gt; &lt;/style&gt; &lt;br /&gt;&lt;table border="0" cellspacing="0" cols="2" frame="VOID" rules="NONE"&gt; &lt;colgroup&gt;&lt;col width="103"&gt;&lt;/col&gt;&lt;col width="103"&gt;&lt;/col&gt;&lt;/colgroup&gt; &lt;tbody&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18" width="103"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;A1JFY&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT" width="103"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;SEG0V7U&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;A1LOO&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;4BIPN5I&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;B5XLR&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;MJK2BGY&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;C4JME&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;QO18QNK&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;D2QVM&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;J3TFL2W&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;D7LTP&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;2CDID0N&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;E5YGX&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;Q5XOGW1&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;F3KHN&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;Y5X6LRC&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;F6NFZ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;4HT8VED&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;F8PTX&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;CQ49DXQ&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;G6MRW&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;HE5GPJW&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;G9VLM&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;KFIKE6C&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;H1EQK&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;IQ2F5CL&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;H3AHZ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;PHN7V1O&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;H3VVP&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;GRZGN19&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;H6GCB&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;HG4GJ0M&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;I4OUO&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;J5JNLOB&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;J1MFZ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;35XNKVV&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;J4YDQ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;F14YOMY&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;J9WBY&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;TB54HQQ&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;K1LRM&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;ZP5PCF3&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;K4MFI&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;E8CL2WT&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;L7GJK&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;PF18DQX&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;M1DEB&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;OFM77KX&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;M2RTP&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;U2YCC7J&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;O2YXZ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;UZ2ER0I&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;P3KWP&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;IWG2EJ0&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;Q5VCF&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;JES85CT&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;R0ODD&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;BH3IY9K&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;R1DHK&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;HU33KVK&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;R6ZIM&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;EL5U5LN&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;R8WKD&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;RKAEE54&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;S5OHI&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;7USBK8U&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;S6KYQ&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;P7L8HRW&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;T1QSA&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;HZ76KSH&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;T6MEG&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;BN7UI9U&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;T8HSK&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;LCKI63U&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;U4FPX&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;ARYA9C3&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;X2UJH&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;QLCO6X8&lt;/span&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td align="LEFT" height="18"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;X7OLS&lt;/span&gt;&lt;/td&gt;   &lt;td align="LEFT"&gt;&lt;span style="color: black; font-family: Courier New; font-size: small;"&gt;27YJRUB&lt;/span&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;STEP 2:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Customer ID:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;You can make up your own customer ID. It is just the state abbreviation + first 4 characters of your last name + 4 digits of todays date + a random letter. Example: Joe Smith in Texas on Sept. 1 would be "TXSMIT0901X"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-846311103297172656?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/846311103297172656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/ultimate-waterfowlers-journal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/846311103297172656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/846311103297172656'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/ultimate-waterfowlers-journal.html' title='Ultimate Waterfowler&apos;s Journal registration codes and instructions'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-6412425428540349463</id><published>2012-01-21T07:34:00.000-08:00</published><updated>2012-01-21T08:01:40.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random thoughts'/><title type='text'>Pet peeve: Wasteful packaging</title><content type='html'>Why is it so many companies use huge boxes to display and ship tiny products? Such wastefulness has bothered me for a long time. Recently, I received an order that was just so ridiculous I had to share.&lt;br /&gt;&lt;br /&gt;I ordered a tiny HDMI adapter from a popular online store.&amp;nbsp; A few days later, I received a large box. I was confused at first, since I knew I hadn't ordered anything so large.&amp;nbsp; Then I opened the box:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--9Z8Gtq7NNs/Txra_Yhn0DI/AAAAAAAAARs/ZjHs8w3bb2E/s1600/toomuchpackaging.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/--9Z8Gtq7NNs/Txra_Yhn0DI/AAAAAAAAARs/ZjHs8w3bb2E/s400/toomuchpackaging.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Crazy, eh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-6412425428540349463?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/6412425428540349463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/pet-peeve-wasteful-packaging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/6412425428540349463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/6412425428540349463'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/pet-peeve-wasteful-packaging.html' title='Pet peeve: Wasteful packaging'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/--9Z8Gtq7NNs/Txra_Yhn0DI/AAAAAAAAARs/ZjHs8w3bb2E/s72-c/toomuchpackaging.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-4440135276498909303</id><published>2012-01-17T07:45:00.000-08:00</published><updated>2012-01-21T08:01:19.125-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xmlrpc'/><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Work scratchpad for January 17</title><content type='html'>Today I am continuing my effort to retrieve contents of a Drupal node in an authenticated session. I started by setting up the XMLRPC server in Drupal 7 Services 3.&lt;br /&gt;&lt;br /&gt;8:40 a.m. update:&lt;br /&gt;Using the Poster plugin for Firefox, I was able to successfully retrieve a node while logged into Drupal in Firefox by POSTing this to mysite.com/drupal-folder/xmlrpc-endpoint/node/ :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;methodCall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;lt;methodName&amp;gt;node.retrieve&amp;lt;/methodName&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;lt;struct&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;lt;member&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;name&amp;gt;nid&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;value&amp;gt;&amp;lt;i4&amp;gt;19&amp;lt;/i4&amp;gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/member&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;lt;/struct&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;/methodCall&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And, predictably, when I logged out of Drupal in Firefox, the same POST from Poster was rejected as being from an anonymous user. Good.&lt;br /&gt;&lt;br /&gt;I found this valuable comment on &lt;a href="http://stackoverflow.com/questions/8865508/using-c-sharp-to-create-node-in-drupal" target="_blank"&gt;StackOverflow&lt;/a&gt;:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;If you're using Drupal 7 you must be using Services 3 which doesn't have a &lt;code&gt;node.get&lt;/code&gt; method (or &lt;code&gt;node.save&lt;/code&gt; as it happens). They've been &lt;b&gt;replaced with &lt;code&gt;node.retrieve&lt;/code&gt;&lt;/b&gt; and &lt;code&gt;node.create&lt;/code&gt; &amp;amp; &lt;code&gt;node.update&lt;/code&gt; respectively.&lt;/blockquote&gt;&lt;b&gt;Update 9:10&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I was able to get a successful XMLRPC login response and user object from Drupal by POSTing this from Firefox Poster:&lt;br /&gt;&lt;pre id="line1"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&lt;span class="pi"&gt;&amp;lt;?xml version="1.0" encoding="iso-8859-1"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;&lt;span class="start-tag"&gt;methodCall&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span class="start-tag"&gt;methodName&lt;/span&gt;&amp;gt;user.login&amp;lt;/&lt;span class="end-tag"&gt;methodName&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;span class="start-tag"&gt;params&lt;/span&gt;&amp;gt;&lt;br /&gt; &amp;lt;&lt;span class="start-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre id="line20"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;  &amp;lt;&lt;span class="start-tag"&gt;value&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;span class="start-tag"&gt;string&lt;/span&gt;&amp;gt;example.user&amp;lt;/&lt;span class="end-tag"&gt;string&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span class="end-tag"&gt;value&lt;/span&gt;&amp;gt;&lt;br /&gt; &amp;lt;/&lt;span class="end-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;br /&gt; &amp;lt;&lt;span class="start-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;span class="start-tag"&gt;value&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;&lt;span class="start-tag"&gt;string&lt;/span&gt;&amp;gt;password&amp;lt;/&lt;span class="end-tag"&gt;string&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;span class="end-tag"&gt;value&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre id="line28"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt; &amp;lt;/&lt;span class="end-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span class="end-tag"&gt;params&lt;/span&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;/&lt;span class="end-tag"&gt;methodCall&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next step, to capture session auth data and learn how to send it back for the node request.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 12:15&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, it turns out that our webhost doesn't support the php_xmlrpc extension on our server. They do provide the PEAR XML_RPC package. Unfortunately, the encoding results are very different and the PEAR-produced object does not seem to be compatible with what Drupal wants. I &lt;a href="http://stackoverflow.com/questions/8900179/pear-xml-rpc-encode-vs-php-xmlrpc-encode-request" target="_blank"&gt;posted a question&lt;/a&gt; about this difference on StackOverflow. Now, back to digging...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 13:40&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I got a helpful response to my StackOverflow question from mario. He suggested:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;To get the XML marshalled output you first construct a message instead, and then use&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;the&amp;nbsp;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;-&amp;gt;serialize()&lt;/span&gt;&amp;nbsp;&amp;nbsp;method:&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: #f3f3f3; font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;$msg = new XML_RPC_Message("function", array(new XML_RPC_Value(123, "int")));&lt;br /&gt;&lt;br /&gt;print $msg-&amp;gt;serialize();&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I tested that code, and the print result was:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&lt;span class="pi"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;&lt;span class="start-tag"&gt;methodCall&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;&lt;span class="start-tag"&gt;methodName&lt;/span&gt;&amp;gt;function&amp;lt;/&lt;span class="end-tag"&gt;methodName&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;&lt;span class="start-tag"&gt;params&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;&lt;span class="start-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;&lt;span class="start-tag"&gt;value&lt;/span&gt;&amp;gt;&amp;lt;&lt;span class="start-tag"&gt;int&lt;/span&gt;&amp;gt;123&amp;lt;/&lt;span class="end-tag"&gt;int&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span class="end-tag"&gt;value&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;/&lt;span class="end-tag"&gt;param&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;/&lt;span class="end-tag"&gt;params&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;lt;/&lt;span class="end-tag"&gt;methodCall&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;...exactly what I needed. Now I'll modify the example code into the actual parameters and see what I get.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 15:00&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I spent lots of time installing PEAR XML_RPC and XML_RPC2 packages and trying to locate and repair their dependencies. No success on version 2, which was the recommended solution.&lt;br /&gt;&lt;br /&gt;Using the old XML_RPC package, I can talk to the Drupal server and get my user authenticated. However, I have been unable to parse the server's response. I can see the raw XML it returns if I do a PHP var_dump, but attempts to use the XML_RPC methods fail. &amp;nbsp;The var_dump shows it is a proper XML_RPC object, but trying to use the &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;-&amp;gt;value()&lt;/span&gt; method as used in the example at&amp;nbsp;&lt;a href="http://pear.php.net/manual/en/package.webservices.xml-rpc.examples.php"&gt;http://pear.php.net/manual/en/package.webservices.xml-rpc.examples.php&lt;/a&gt;&amp;nbsp;results in fatal errors.&lt;br /&gt;&lt;br /&gt;Example code from above reference:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;if (!$resp-&amp;gt;faultCode()) {&lt;br /&gt;    $val = $resp-&amp;gt;value();&lt;br /&gt;    $data = XML_RPC_decode($val);&lt;br /&gt;    echo $data[0]['name'] . ' is at version ' . $data[0]['version'];&lt;br /&gt;} else {&lt;br /&gt;    /*&lt;br /&gt;     * Display problems that have been gracefully cought and&lt;br /&gt;     * reported by the xmlrpc.php script&lt;br /&gt;     */&lt;br /&gt;    echo 'Fault Code: ' . $resp-&amp;gt;faultCode() . "\n";&lt;br /&gt;    echo 'Fault Reason: ' . $resp-&amp;gt;faultString() . "\n";&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;I get this:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Fatal error&lt;/b&gt;:  Call to a member function kindOf() on a non-object in &lt;b&gt;/mypath/php/XML/RPC.php&lt;/b&gt; on line &lt;b&gt;1948&lt;/b&gt;&lt;/blockquote&gt;&amp;nbsp;even though the var_dump of $resp shows as:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;object(XML_RPC_Response)#4&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Frustrated. I'm going to try another method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-4440135276498909303?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/4440135276498909303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/work-scratchpad-for-january-17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/4440135276498909303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/4440135276498909303'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/work-scratchpad-for-january-17.html' title='Work scratchpad for January 17'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-3262673735064983708</id><published>2012-01-16T15:22:00.000-08:00</published><updated>2012-01-21T08:00:42.244-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Drupal frustrations continue</title><content type='html'>Remember those old cartoons where the characters would open a door, only to discover another door behind it, then another, and another?&amp;nbsp; I have used that visual to illustrate the frustrations of software development to non-technical people. There is just no end of bugs to find and fix.Once one is repaired, another pops up.&lt;br /&gt;&lt;br /&gt;I have been tracking my current problem down for more than three days now. All I want to do is retrieve a node from Drupal as XML so I can manipulate it in my own PHP coding. It should be simple, and it would be if the Drupal site I was trying to retrieve from was public.&lt;br /&gt;&lt;br /&gt;There seems to be a bug or undiscovered setting that is preventing me from retrieving node content from my Drupal installation, which disallows anonymous users entirely.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://paulspurling.blogspot.com/2012/01/drupal-frustrations.html" target="_blank"&gt;I posted earlier&lt;/a&gt;, I found an excellent &lt;a href="http://drupal.org/node/910598#comment-4677738" target="_blank"&gt;sample of code posted by MichaelCole&lt;/a&gt;, and have been using it as my primary reference. Unfortunately, it seems that when trying to do an HTTP GET, passing the session auth data back to Drupal fails. I have tried countless combinations of methods to send the authentication strings, but none work.&lt;br /&gt;&lt;br /&gt;These include PHP CURL options such as:&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;curl_setopt($curl, CURLOPT_COOKIESESSION, false);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile.txt");&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;curl_setopt($curl, CURLOPT_HTTPGET, true);&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json')); (along with JSON-encoding the session cookie)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Multiple methods of sending the data, including:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;$request_data = array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $sessData[0] =&amp;gt; $sessData[1],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "method" =&amp;gt; "node.get",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "nid" =&amp;gt; 18&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;$request_data = http_build_query($request_data, '', '&amp;amp;'); // Format post data as application/x-www-form-urlencoded&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$service_url.="?$request_data"; //append the data as a GET qstring&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;According to the &lt;a href="http://en.wikipedia.org/wiki/REST#RESTful_web_services" target="_blank"&gt;REST entry on Wikipedia&lt;/a&gt; , GET must be used to retrieve a resource, so utilizing POST as is done in the login procedure seems to not be an option.&lt;br /&gt;&lt;br /&gt;I will keep digging at this and post up &lt;strike&gt;if&lt;/strike&gt; when I find a solution (think positive).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-3262673735064983708?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/3262673735064983708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/drupal-frustrations-continue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/3262673735064983708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/3262673735064983708'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/drupal-frustrations-continue.html' title='Drupal frustrations continue'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-8886467848049173069</id><published>2012-01-16T07:43:00.001-08:00</published><updated>2012-01-21T08:00:07.402-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>Sunrise view from my office</title><content type='html'>&lt;div class="mobile-photo"&gt;&lt;a href="http://4.bp.blogspot.com/-Hvq5zGgsK7w/TxRFlBA5g5I/AAAAAAAAARk/8vRD6KL68es/s1600/photo-795766.JPG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5698255930760201106" src="http://4.bp.blogspot.com/-Hvq5zGgsK7w/TxRFlBA5g5I/AAAAAAAAARk/8vRD6KL68es/s320/photo-795766.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;Nice view outside today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-8886467848049173069?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/8886467848049173069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/sunrise-view-from-my-office.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8886467848049173069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/8886467848049173069'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/sunrise-view-from-my-office.html' title='Sunrise view from my office'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Hvq5zGgsK7w/TxRFlBA5g5I/AAAAAAAAARk/8vRD6KL68es/s72-c/photo-795766.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-1423629588994884948</id><published>2012-01-15T08:23:00.000-08:00</published><updated>2012-01-15T09:47:31.077-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Peak Digital Productions: Ruminations on a closed business.</title><content type='html'>In 1995, I was not long out of high school and working for a large corporation. I hated the job and the atmosphere. I knew a lot of people that were self-employed and that seemed like a good fit for me.&lt;br /&gt;&lt;br /&gt;I set up a sole proprietorship named Peak Digital Productions, bought several thousand dollars of equipment for video production, and set off to make a living. I was quickly disappointed by the quality of the video output possible with the extremely expensive equipment. Added to that, the licensing burden of popular music to go with video make the service impossible. Frustrated, I quit offering the video service.&lt;br /&gt;&lt;br /&gt;Next I started working with photo restoration. I liked that, and got a fair amount of business from it, but nowhere near enough to support my new family. Dealing with individual customers was difficult, and the volume of work available in my area was inadequate.&lt;br /&gt;&lt;br /&gt;Sometime around 1998 I started building websites. This became my primary service for the next several years. I enjoyed this work - especially how it allowed me to utilize all my skills and interests. Photography, videography, graphic design, programming, and more went into each custom-built site. I refused to use template sites or pre-packaged coding, always learning each necessary step and building the project from my own effort.&lt;br /&gt;&lt;br /&gt;While I enjoyed the work, making a living was difficult.&amp;nbsp; Earlier, I had done a major programming project for a local government agency and got spoiled by the concept of invoice=payment.&amp;nbsp; While I had a few clients over the years that were excellent to work with, I also had a few that caused so much stress I could hardly stand to work for them. I got really tired of having to chase down my paychecks.&lt;br /&gt;&lt;br /&gt;I tried various contractual variants to control the lack of payment and communication, but with little success. Sometimes the lack of communication was worse than the lack of payment. My benchmark for frustration was the client whose communication was so sparse that it took 16 months to finish a project that had a total of less than 40 billable hours.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Through the years, I gained experience in many skills. Software development became my primary interest and I applied it to both PC-based and web applications. I also got to use my photography skills for displaying client products, video editing to produce videos to place on their sites, graphic design and page layout for creating printed literature to complement the website, and various other miscellaneous jobs.&lt;br /&gt;&lt;br /&gt;I started programming in VBA in Excel, moved to Visual Basic 6 around 2000, used ASP for building dynamic-content websites for several years, then moved to PHP when I decided to leave the Microsoft track. I explored Flex and Air for projects destined for web and desktop applications.&amp;nbsp; I continued to work on keeping up with current technology, re-learning website design to utilize CSS instead of the old methods.&lt;br /&gt;&lt;br /&gt;When the economy tanked, what little business I could rely on disappeared. Most of my clients were small businesses, the majority being one-man operations like mine. As their businesses failed, so did mine. I was left with a huge Accounts Receivable register, which I expect I will never see.&lt;br /&gt;&lt;br /&gt;The financial loss was frustrating, but my lack of ability to provide for my family was devastating. My stress levels were at unhealthful levels.&lt;br /&gt;&lt;br /&gt;I would like to publicly thank Steve Birrer for stepping up and partnering with me on a software project during that time. His belief in my skills and willingness to support my work were a big help. Unfortunately, the project was unable to be completed due to "scope creep" and other issues, but Steve was the best business partner a guy could ask for. Despite the outcome of the project, he continues to be patient as I work to pay back his financial investment in my idea.&lt;br /&gt;&lt;br /&gt;With my software partnership completion always just out of reach, I started looking for a job. In February 2010, I was hired at &lt;a href="http://peregrinefund.org/" target="_blank"&gt;The Peregrine Fund&lt;/a&gt; as their webmaster. (Thanks in part to a glowing reference from Steve.) It continues to be the best work experience of my life. It's an amazing place with great people doing great work.&lt;br /&gt;&lt;br /&gt;If you happen to be one of my past client that has a balance owing, and you wish to make a payment, please contact me - I would appreciate it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-1423629588994884948?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/1423629588994884948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/ruminations-on-closed-business.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1423629588994884948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1423629588994884948'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/ruminations-on-closed-business.html' title='Peak Digital Productions: Ruminations on a closed business.'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-7044341813734301677</id><published>2012-01-15T06:22:00.000-08:00</published><updated>2012-01-15T09:52:14.293-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='websites'/><title type='text'>Drupal frustrations</title><content type='html'>After more than 10 years of building all my software and website coding from zero with primary programming languages like VB6, ASP, PHP, ActionScript and JS, I have begun adopting open-source packages due to their advanced feature sets.&lt;br /&gt;&lt;br /&gt;My newest exploration is &lt;a href="http://drupal.org/" target="_blank"&gt;Drupal&lt;/a&gt;. &amp;nbsp;In many ways I am very impressed with its capabilities. However, one task that seems to me to be a simplistic task has cost me more than two days of work, and now it's early on a Sunday morning and it's still consuming my thoughts: How to make the content of a node visible on a non-Drupal external site.&lt;br /&gt;&lt;br /&gt;I started by installing the &lt;a href="http://drupal.org/project/services" target="_blank"&gt;Services 3&lt;/a&gt; module, configuring the REST server and its endpoint. After hours of fruitless research, I finally discovered &lt;a href="http://drupal.org/node/910598#comment-4677738" target="_blank"&gt;a posting with a good explanation&lt;/a&gt; of accessing Drupal data externally with authenticated access via REST.&lt;br /&gt;&lt;br /&gt;My attempts to implement that were unsuccessful. As &lt;a href="http://drupal.stackexchange.com/questions/19601/7-10-getting-node-as-authorized-user-via-services-3-and-rest" target="_blank"&gt;I posted on drupal.stackexchange.com&lt;/a&gt;, the Drupal system would recognize my login and authenticate my session, but I still can't retrieve a node's content.&lt;br /&gt;&lt;br /&gt;I &lt;a href="http://drupal.org/node/1405386" target="_blank"&gt;posted another request&lt;/a&gt; for help on any method to see Drupal node data externally, and received the suggestion to use feeds. So, this morning I have been researching that avenue. &amp;nbsp;So far, success has been very limited. Based on&amp;nbsp;&lt;a href="http://www.group42.ca/drupal_6_rss_omnibus" target="_blank"&gt;http://www.group42.ca/drupal_6_rss_omnibus&lt;/a&gt;&amp;nbsp;I was able to finally see &lt;i&gt;something&lt;/i&gt; from my Drupal site by requesting the url my-site.com/drupal-folder/rss.xml.&lt;br /&gt;&lt;br /&gt;However, due to the purpose of my Drupal installation, it is locked down to require authenticated access for everything. At this point I am stymied by two problems using the Atom/RSS technique: I haven't seen documentation to do an auth login to request RSS data, and so far I can only see as RSS what appears on the Drupal front page.&lt;br /&gt;&lt;br /&gt;Back to the research...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-7044341813734301677?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/7044341813734301677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/drupal-frustrations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/7044341813734301677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/7044341813734301677'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/drupal-frustrations.html' title='Drupal frustrations'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-232947138515527667</id><published>2012-01-14T20:48:00.000-08:00</published><updated>2012-01-14T20:48:17.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='waterfowl'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>Waterfowl photography morning</title><content type='html'>I went to a local fishing pond this morning where waterfowl congregate.&amp;nbsp; I brought back over 200 photos after lots of culling in the camera. Here are a few that I like.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sJ7rB3dJdec/TxJade5xm3I/AAAAAAAAAQ8/b0MCd-H4Gz0/s1600/IMG_5505.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-sJ7rB3dJdec/TxJade5xm3I/AAAAAAAAAQ8/b0MCd-H4Gz0/s320/IMG_5505.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9vQzIyPBf58/TxJadnPZWjI/AAAAAAAAARE/Ijr8n_6Jwhk/s1600/IMG_5531.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-9vQzIyPBf58/TxJadnPZWjI/AAAAAAAAARE/Ijr8n_6Jwhk/s320/IMG_5531.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Z6cqSyAPzUo/TxJaefkBFbI/AAAAAAAAARM/WSgtDitPMqQ/s1600/IMG_5687.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-Z6cqSyAPzUo/TxJaefkBFbI/AAAAAAAAARM/WSgtDitPMqQ/s320/IMG_5687.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-UFoPjIYvbdg/TxJae4sWXHI/AAAAAAAAARU/gMySuX6F7ek/s1600/IMG_5688.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-UFoPjIYvbdg/TxJae4sWXHI/AAAAAAAAARU/gMySuX6F7ek/s320/IMG_5688.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-232947138515527667?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/232947138515527667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/waterfowl-photography-morning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/232947138515527667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/232947138515527667'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/waterfowl-photography-morning.html' title='Waterfowl photography morning'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sJ7rB3dJdec/TxJade5xm3I/AAAAAAAAAQ8/b0MCd-H4Gz0/s72-c/IMG_5505.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-6253015753317381147</id><published>2012-01-09T21:21:00.000-08:00</published><updated>2012-01-21T08:02:19.597-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random thoughts'/><title type='text'>Cereal</title><content type='html'>Since this is supposed to be a more or less random collection of miscellaneous things, along with being a reference for my own later use, here is a recipe for cereal. I have given up on finding a high protein, low sugar, low fat commercially made cereal.&amp;nbsp; I just want a simple breakfast that doesn't leave me hungry 3 hours before lunch.&lt;br /&gt;&lt;br /&gt;I don't know if it would be considered a granola or muesli, but here it is, based loosely on my Mom's recipe from when I was a kid.&lt;br /&gt;&lt;br /&gt;6 cups old fashioned oats&lt;br /&gt;2 cups sliced raw almonds&lt;br /&gt;3 Tbsp flax meal&lt;br /&gt;1/4 cup quinoa&lt;br /&gt;1/4 cup millet&lt;br /&gt;1/2 cup wheat germ&lt;br /&gt;1/2 cup soy protein&lt;br /&gt;1 cup unsweetened coconut flakes&lt;br /&gt;1/2 cup grape oil&lt;br /&gt;1 cup honey&lt;br /&gt;sprinkle of vanilla extract&lt;br /&gt;dash salt&lt;br /&gt;2 tsp cinnamon&lt;br /&gt;&lt;br /&gt;Mix everything together, bake at 400 degrees, turning every 5 minutes, until browned.&lt;br /&gt;&lt;br /&gt;Add:&lt;br /&gt;1/2 cup dried cranberries&lt;br /&gt;1 cup raisins&lt;br /&gt;&lt;br /&gt;and stir them in while the previous ingredients are still very hot. I learned a long time ago not to put the fruit in before baking unless you like the taste of charcoal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-6253015753317381147?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/6253015753317381147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2012/01/cereal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/6253015753317381147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/6253015753317381147'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/cereal.html' title='Cereal'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-1416684563773894378</id><published>2012-01-02T22:06:00.001-08:00</published><updated>2012-01-02T22:06:58.811-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><title type='text'>Raspberry Pi</title><content type='html'>This looks interesting: &lt;a href="http://www.raspberrypi.org/"&gt;http://www.raspberrypi.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-1416684563773894378?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1416684563773894378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1416684563773894378'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2012/01/raspberry-pi.html' title='Raspberry Pi'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-1281262642945400792</id><published>2011-12-30T11:02:00.000-08:00</published><updated>2011-12-30T11:02:18.274-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='jQueryUI'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery UI Autocomplete: problem solved</title><content type='html'>It seems that in programming, often the simplest issues cause the most wasted time. Most of yesterday was spent trying to integrate the &lt;a href="http://jqueryui.com/demos/autocomplete/"&gt;jQuery UI Autocomplete&lt;/a&gt; component into a project. I could tell it was contacting the target file on the server, but it would never return any matches.&lt;br /&gt;&lt;br /&gt;Today, I opened the Firebug console and noted that despite getting a 200 OK message on the request, the response pane was always empty. A Google search turned up &lt;a href="http://stackoverflow.com/questions/2219274/ajax-problem-200-ok-in-firebug-but-red-message-with-no-response-body"&gt;a discussion on StackOverflow&lt;/a&gt; that described my predicament exactly.&lt;br /&gt;&lt;br /&gt;In reviewing my code, I found that my source parameter in the Autocomplete function code pointed to an absolute URL beginning with http://. Evidently this caused the ajax code to fail on the &lt;a href="http://en.wikipedia.org/wiki/Same_origin_policy"&gt;presumption it was pointing to an external domain&lt;/a&gt;&amp;nbsp;(though the target file was actually on the same domain). By changing it to a site-root relative URL, my autocomplete component works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-1281262642945400792?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulspurling.blogspot.com/feeds/1281262642945400792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://paulspurling.blogspot.com/2011/12/jquery-ui-autocomplete-problem-solved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1281262642945400792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/1281262642945400792'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2011/12/jquery-ui-autocomplete-problem-solved.html' title='jQuery UI Autocomplete: problem solved'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-385671493074525977.post-3625433217367990739</id><published>2011-11-24T17:50:00.000-08:00</published><updated>2011-11-24T17:50:50.507-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outdoors'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><title type='text'>A photograph to get things started</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5nPOqhn_dbo/Ts70RdjyxyI/AAAAAAAAANY/TZVBKICfc2Y/s1600/IMG_4351.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-5nPOqhn_dbo/Ts70RdjyxyI/AAAAAAAAANY/TZVBKICfc2Y/s320/IMG_4351.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;An October sunset in central Idaho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/385671493074525977-3625433217367990739?l=paulspurling.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/3625433217367990739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/385671493074525977/posts/default/3625433217367990739'/><link rel='alternate' type='text/html' href='http://paulspurling.blogspot.com/2011/11/photograph-to-get-things-started.html' title='A photograph to get things started'/><author><name>Paul Spurling</name><uri>https://profiles.google.com/110347450129208586570</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-ofPCkDwEeOE/AAAAAAAAAAI/AAAAAAAAADM/V2LkoEeJfJw/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-5nPOqhn_dbo/Ts70RdjyxyI/AAAAAAAAANY/TZVBKICfc2Y/s72-c/IMG_4351.jpg' height='72' width='72'/></entry></feed>
