<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
	<channel>
		<title>Codestore Activity Log</title>
		<description>Latest ten updates to codestore, be they blogs or articles.</description>
		<language>en-gb</language>
		<link>http://www.codestore.net</link>
		<lastBuildDate>Tue, 16 Mar 2010 04:57:20 -0500</lastBuildDate>
		<atom:link href="http://www.codestore.net/store.nsf/rss.xml" rel="self" type="application/rss+xml" />

		<item>
			<title>Notes Workspace in Flex, For All You Die-Hard Fans | Blog</title>
			<pubDate>Tue, 16 Mar 2010 04:57:20 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>Don't know about you but I like to have at least one "pet project" on the go at any given time. Something for me to mess about on when I get bored during the day (yeah, right) or late at night when all the kids are in bed. </p> <p>For a few days now I'd not had a project and was getting a bit restless. Then I had a brainwave - how about a Flex version of the good ol' Notes Workspace.</p> <p>After a day or two's worth of spare time spent I had come up with <a href="/workspace.nsf">a working prototype</a>:</p> <p><a href="/workspace.nsf"><img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/0998F446D9E858A7862576E80036AFEF/$file/image_4c980ddd-7c89-4b38-9ac6-a0d9c2f77810.png" width="455" height="432"></a> </p> <p>Have a play and see what you think. Try the following features:</p> <ul> <li>Drag and drop icons</li> <li>Double click icon to open the database</li> <li>Right click workspace to add a new icon</li> <li>Right click workspace to change background</li> <li>Right click icon to remove it</li></ul> <p>Note that the icons you see are the actual Icons for the database; loaded via the /$icon URL. Change the icon in Designer and it updates in the Flex version (well, when the cache updates). </p> <p>Note that you need "reader" access to the DB to see the icon!</p> <h4>Why?</h4> <p>A good customer of mine is moving away from Lotus Notes (client) on their desktops but keeping the Domino server and migrating the Notes apps to the web. One of the options I've suggested to them is using a Flex framework to ease the migration.</p> <p>To ease the transition for the user I had the idea of providing some familiarity in the new environment. Whether they want a reminder of the Notes client or not I don't know, but it seemed like an interesting challenge and has been a fun learning experience so far. </p> <p>Whether I'd actually suggest its use or not I don't know. I just thought it might make a nice portal.</p> <h4>Taking it Further</h4> <p>The glaring omission in this prototype is that you can't add your own icons. For now it loads a pre-defined list of icons from the backend DB. For it to work the user really needs to be able to add their own and remove the ones they don't want. It also needs to remember these icons and their positions. </p> <p>And what about the open/add database dialog? This is something I'll add before I consider this "finished". But should there be a pre-defined list of web-enabled/migrated applications to choose from or should it just browse all files on the server? Should it allow the user to browse to other servers?</p> <p>Some other considerations:</p> <ul> <li>Stacking icons for replicas -- does that apply on the web.</li> <li>Unread count. Can this be done on the web and/or does it apply still?</li> <li>Is the option to show server name applicable?</li> <li>Would it be worth adding tabs with custom colours - ala Notes.</li> <li>Mutli-select and move. </li> <li>Keyboard navigation?</li> <li>Might be nice to be able to click to select and (re)move.</li></ul> <p>At first I thought this would be simple then, the more I thought about it, the more complex it became. That's good though, right? A pet project should know no end after all.&nbsp; </p> <p>Taking it much further I guess you could even provide a tool to let the user migrate their existing Notes workspace to the new Flex one.</p> <p>For now it's just something nice to mess about with. Maybe one day you'll be able to visit it and reminisce of the good old days...</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100316-0457?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100316-0457</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100316-0457</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100316-0457?Open#comments</comments>
			<slash:comments>26</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100316-0457</wfw:commentRss>
		</item>
		<item>
			<title>Preserving Future Memories | Blog</title>
			<pubDate>Mon, 15 Mar 2010 05:07:20 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>My childhood is well documented thanks to my mum who did a great job of photographing it and keeping chronological albums from birth up to about when we were about 16 or more. It's great that I can I go back to my parent's and look through the albums of memories I'd otherwise have forgotten.</p> <p>While it was my mum that took on this responsibility in our house it's now down to me to take, store and look after these future memories for not only us, but more importantly, for the kids.</p> <p>It's not that I mind it, in fact <a href="http://www.jakehowlett.com/gallery/">I enjoy taking photos</a>, but I do sometimes worry about how best to preserve these memories. Remember a while back I asked if <a href="http://www.codestore.net/store.nsf/unid/BLOG-20081126">this hard drive sounded broken</a>. It came out of a friend's external hard drive "backup" and he'd given it to me in desperation as it had all his photos and videos of his son from birth to about 3 years of age. I couldn't do anything with it and he later sent it off to a specialist company who couldn't either. </p> <p>You can imagine how distraught he must have been to lose all those memories. He now uses a ReadNAS box with RAID, as do I, but is this enough? RAID won't help in a fire or a burglary.</p> <p>While I could make multiple backups both locally and in the "cloud" I don't think you can beat actual physical photos. Not everything is better on a PC. For me, I don't think you can ever beat an actual book where you can turn real pages!&nbsp; </p> <p>For the past four years on Mother's Day I've made Karen a photo-book which contains a chronological set of photos looking at the year gone by. Here they all are:</p> <p><img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_4410" border="0" alt="IMG_4410" src="http://www.codestore.net/store.nsf/rsrc/46959898C5FE3216862576E700379A41/$file/IMG_4410_1.jpg" width="504" height="379"> </p> <p>The first is told from Felix's point of view and he goes on to narrate all four of them. The latest is the larger one at the back, in which the last page has all <em>four</em> kids on. Karen finds it hard to keep from crying when she looks through them (as do I) and it's something I want to keep on doing until they're in their late teens. </p> <p>In lieu of traditional photo albums these books at least give me some peace of mind, that should the worst happen and all photo files are lost, then it's not the end of the world. These books are precious to me and kept well out of reach of the kids who are only allowed to look at them while supervised and with clean fingers.</p> <p>Look after your photos!</p> <p>The first three books were printed by <a href="http://www.jessops.com">Jessops</a>, while this year I tried out <a href="http://www.blurb.com">Blurb</a> and was very impressed. Although quite expensive (worked out about a pound per page) it's a quality book and the "image wrap" cover is nice and the publishing software easy to use. Blurb deliver world-wide I think. Give them a shot.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100315-0507?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100315-0507</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100315-0507</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100315-0507?Open#comments</comments>
			<slash:comments>4</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100315-0507</wfw:commentRss>
		</item>
		<item>
			<title>Photos of New Office Build From Two Years Ago | Blog</title>
			<pubDate>Fri, 12 Mar 2010 06:17:17 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>While reminiscing <a href="http://www.codestore.net/store.nsf/unid/BLOG-20100311-0258">yesterday</a> I uploaded a set of photos of the destruction and re-build of the garage, which became Rockall HQ. You can <a href="http://picasaweb.google.com/jakehowlett/GarageOfficeBuild?authkey=Gv1sRgCMagqYyQzKvUSQ#">see all the photos here</a>. </p> <p>Some of you DIY geeks might like a look. It was also an excuse to test out the Upload button in Picassa, which works well and seamlessly integrates with my existing Google account. Nice 'n easy. Just how I like things to be.</p> <p>Two years on and I have no regrets in spending 7k on a new office. It was definitely one of my better ideas and worth every penny. Without an out-of-the-house office my productivity would be almost zero. You can't work at home when you have three kids 3 and under. Not a chance.</p> <p>People often say to me "I bet you need to be really disciplined to work from home" to which I normally say "Not really". I just treat it as much like a normal job as I can. Leave the house as much before 9am as I can and come back in just after 5pm.</p> <p>If you're wondering how I know it came to 7k or where all the money went then here's the log of the costs I kept:</p> <table style="width: 221pt; border-collapse: collapse; table-layout: fixed" border="0" cellspacing="0" cellpadding="0" width="295"> <colgroup> <col style="width: 173pt; mso-width-source: userset; mso-width-alt: 8448" width="231"> <col style="width: 48pt" width="64"> <tbody> <tr style="height: 15pt" height="20"> <td style="width: 173pt; height: 15pt" height="20" width="231">Window</td> <td style="width: 48pt" width="64" align="right">108</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Heater and Lights</td> <td align="right">150</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Lock</td> <td align="right">160</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Skip</td> <td align="right">145</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Skip</td> <td align="right">145</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Sand</td> <td align="right">101</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Blocks</td> <td align="right">270</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Concrete for footings</td> <td align="right">250</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Screwfix - misc</td> <td align="right">62</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Labour</td> <td align="right">1200</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Cement 10 bags of</td> <td align="right">25</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Metal mesh reinforcing</td> <td align="right">40</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">B&amp;Q - Misc networking bits</td> <td align="right">65</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Concrete for slab</td> <td align="right">310</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">weather strip for door</td> <td align="right">8</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Large lintel and wood</td> <td align="right">50</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Lintels and bricks from Jewsons</td> <td align="right">128</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Plastering</td> <td align="right">475</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Blocks</td> <td align="right">80</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Door</td> <td align="right">38</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Door frame</td> <td align="right">45</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Rendering</td> <td align="right">760</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">EPDM (rubber) for roof</td> <td align="right">341</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Wood for roof</td> <td align="right">480</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Midi Skip</td> <td align="right">75</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Screwfix - misc</td> <td align="right">165</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Jewsons - fascia wood etc</td> <td align="right">157</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">B&amp;Q - up-n-over frame, fixings etc</td> <td align="right">37</td></tr> <tr style="height: 15pt" class="xl67" height="20"> <td style="height: 15pt" height="20">B&amp;Q - Guttering et misc</td> <td align="right">94</td></tr> <tr style="height: 15pt" class="xl67" height="20"> <td style="height: 15pt" height="20">Laminate flooring</td> <td align="right">84</td></tr> <tr style="height: 15pt" class="xl67" height="20"> <td style="height: 15pt" height="20">Masonry paint</td> <td align="right">36</td></tr> <tr style="height: 15pt" class="xl67" height="20"> <td style="height: 15pt" height="20">Wickes -- Gate and wood</td> <td align="right">70</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt; mso-ignore: colspan" height="20" colspan="2"></td></tr> <tr style="height: 15.75pt" height="21"> <td style="height: 15.75pt" class="xl65" height="21">SUBTOTAL</td> <td class="xl66" align="right">6154</td></tr> <tr style="height: 15.75pt" height="21"> <td style="height: 15.75pt; mso-ignore: colspan" height="21" colspan="2"></td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">Furniture for office</td> <td align="right">900</td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt; mso-ignore: colspan" height="20" colspan="2"></td></tr> <tr style="height: 15pt" height="20"> <td style="height: 15pt" height="20">TOTAL</td> <td class="xl67" align="right"><strong>7054</strong></td></tr></tbody></table> <p>My original budget was 5k, but I think that was a little unrealistic. As you can see it soon adds up.</p> <p>It all leaves me wanting to demolish and rebuild something else. I love a good "project" me.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100312-0617?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100312-0617</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100312-0617</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100312-0617?Open#comments</comments>
			<slash:comments>3</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100312-0617</wfw:commentRss>
		</item>
		<item>
			<title>Twas Two Years Ago | Blog</title>
			<pubDate>Thu, 11 Mar 2010 02:58:27 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>Anybody remember what's going on here?</p> <p>&nbsp;<img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/947088BD79301A75862576E3003164BB/$file/image_190a0d0a-796e-494d-9ef7-41e77f7cc099.png" width="513" height="374"> </p> <p></p> <p>How time flies...</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100311-0258?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100311-0258</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100311-0258</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100311-0258?Open#comments</comments>
			<slash:comments>8</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100311-0258</wfw:commentRss>
		</item>
		<item>
			<title>Flex: Using A SharedObject to Remember User Settings | Blog</title>
			<pubDate>Wed, 10 Mar 2010 03:20:33 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>Try this:</p> <ol> <li>Open the <a href="http://www.codestore.net/apps/contacts.nsf">Contact Manager app</a>.  <li>Change the columns that are visible by using the "column chooser" button, as below:<br>&nbsp;<img style="border-right-width: 0px; margin: 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/0E7F75DEAB186A5B862576E200335210/$file/image_ad337285-748e-4279-8ff2-f739e6ff96ff.png" width="285" height="224">  <li>Quit the browser.  <li>Re-open the browser and visit the app again.  <li>Notice how the visible columns are the same ones as before you closed the browser!</li></ol> <p>The View component I've been developing recently now uses the Flex equivalent to the cookie - the <a href="http://learn.adobe.com/wiki/display/Flex/Shared+Objects">SharedObject</a> - to remember your choice of columns across sessions.</p> <p class="sidePanel">Note that the same column preferences are shared across all browsers on your PC as the SharedObject is per Flash player install rather than per browser.</p> <p>For now <strike>it won't remember your preferred order of columns</strike> (did you know you can drag and drop columns to change the order!?). <strike>I'll work on that</strike>. The updated demo now remembers the order of your columns! Nor does it remember the width of them. I'll work on that too. </p> <p>In the mean time <a href="http://www.codestore.net/store.nsf/rsrc/bloggifs42/$file/contacts_v19.zip">here's the updated source code</a> for both the Domino database and the Flex source code. Enjoy. More to come...</p> <p>...can anybody think of anything else this View component is lacking before I can consider it a universal solution for all your Notes-to-Flex migration tasks?</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100310-0320?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100310-0320</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100310-0320</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100310-0320?Open#comments</comments>
			<slash:comments>9</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100310-0320</wfw:commentRss>
		</item>
		<item>
			<title>Flex: A Toggle-Style Column Component for Your Views | Blog</title>
			<pubDate>Tue, 9 Mar 2010 03:28:58 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>Adding even more functionality to Flex "view" I've <a href="http://www.codestore.net/store.nsf/unid/BLOG-20100203-0300?OpenDocument">been</a> <a href="http://www.codestore.net/store.nsf/unid/BLOG-20100217-0812?OpenDocument">building</a> I've now added a "toggle column" to the list of available column types:</p> <p><img style="border-right-width: 0px; margin: 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/EF6179B0AA033F5A862576E100383B4F/$file/image_39441e0a-56c2-42ab-8323-9ab2efa07aa3.png" width="349" height="241"></p> <p>The idea is simple. You click the icon in the column to toggle a field value on the back end document. The icon in the view is either on or off and is dictated by the value stored in the field. It's an idea <a href="http://www.codestore.net/store.nsf/unid/BLOG-20090403?OpenDocument">I've mentioned before</a> which I've now made into a re-usable and customizable component.</p> <p>In this example I'm using the idea of being able to mark certain contacts as favourites and you can see a working example in <a href="http://www.codestore.net/apps/contacts.nsf">the Contact Manager app</a>. The component itself can be re-used in almost any scenario though.</p> <p>Adding a toggle column to a View is as simple as adding one line of XML to the View's configuration, which is specified in the backend Domino database, as discussed <a href="http://www.codestore.net/store.nsf/unid/BLOG-20100112-0306">previously</a>.</p> <p>The XML looks like this:</p> <p><img style="border-right-width: 0px; margin: 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/0446F17DE5272021862576E10034170D/$file/image3_2.png" width="549" height="52"></p> <p>As you can see it's fairly easy to configure and customize. You can easily change the icon, field name and what the "on"/"off" values should be for the field. You can also add a tooltip for the column. </p> <p>The Column value of "starred" refers to the name of the XML node of each document which holds the field value we're interested. When the grid is first loaded it will show the icon as on or off depending on the value in the "starred" node. </p> <p>Clicking on the toggle column on sets the value of the field called "Favourite" to "1". Clicking it again sets the value to "".</p> <p>To see the XML used in the demo open <a href="http://www.codestore.net/apps/contacts.nsf/vwContactsAsXML">the Contacts view as XML</a>. This is the XML format that defines the structure and data of the View component. Simple, no?</p> <h4>Taking It Further</h4> <p>If you want to go further than simply modifying a single field at a time and want to perform a more involved action then you can do what I tend to always do and add a self-referencing "computed for display" field to the backend Domino form called something like "Action". In the WQS agent you can then check the value of this field. If the value is something like "Approve" then you can run a set of actions against the document. </p> <p>In this scenario the XML data for each row just needs to define a true/false value to let Flex know whether to show the icon as on or off depending on whether it's approved or not. The value for the fieldValueOn would be "Approve" and for fieldValueOff it would be "Unapprove". The actual XML data for approved documents would be "Unapproved" and for unapproved documents the column value would be "Approve". If that makes sense.</p> <h4>Summary</h4> <p>It's the simple little components like this that show how powerful Flex can be once you get going with it. With the View component and the components I'm adding to it I feel like this is getting to the point where it's a viable product that can be re-used in live applications. In fact<em>&nbsp;</em>I already am using it in live applications for paying customers.</p> <p><strike>In the next couple of days I'll update the downloadable version of the app with updated Flex source code. Before I do I want to blog about another addition to the code -- the ability to store a user's choice of columns across sessions using the Flash/Flex equivalent of cookies - the SharedObject. Give me a day or three.</strike> </p> <p><strong>Update:</strong> <a href="http://www.codestore.net/store.nsf/rsrc/bloggifs42/$file/contacts_v19.zip">Here's the updated source code and Domino db</a>.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100309-0328?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100309-0328</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100309-0328</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100309-0328?Open#comments</comments>
			<slash:comments>4</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100309-0328</wfw:commentRss>
		</item>
		<item>
			<title>Domino's POP3 Server Breaks HTML Emails by Removing Characters | Blog</title>
			<pubDate>Wed, 3 Mar 2010 01:14:58 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>There's a bug when sending and retrieving HTML email from Domino that has been plaguing me for years now. Now I've finally decided to take the time to investigate fully and find a fix.</p> <p>First, imagine the code below:</p><pre class="code2"><span class="TPkeyword1">While </span>i&lt;<span class="TPnumber">100 </span>                
        j <span class="TPoperator">= </span><span class="TPnumber">0</span>
        html <span class="TPoperator">=</span><span class="TPstring">""</span>
        <span class="TPkeyword1">While </span>j&lt;i
                html <span class="TPoperator">= </span>html <span class="TPoperator">+ </span><span class="TPstring">"split string "</span>
                j<span class="TPoperator">=</span>j<span class="TPoperator">+</span><span class="TPnumber">1   </span>
        <span class="TPkeyword1">Wend</span>
                                
        <span class="TPkeyword1">Set </span>mail <span class="TPoperator">= </span><span class="TPkeyword1">New </span>Email<span class="TPbracket">()</span>
        mail.Subject <span class="TPoperator">= </span><span class="TPstring">"Test " </span><span class="TPoperator">+ </span><span class="TPkeyword1">CStr</span><span class="TPbracket">(</span>i<span class="TPbracket">)</span>
        mail.HTML <span class="TPoperator">= </span>html
        mail.<span class="TPkeyword4">Send</span><span class="TPbracket">(</span><span class="TPstring">"jake howlett"</span><span class="TPbracket">)       </span>
                
        i<span class="TPoperator">=</span>i<span class="TPoperator">+</span><span class="TPnumber">5</span>
<span class="TPkeyword1">Wend</span></pre>
<p>What this does is send me 20 test emails. Each email is increasingly longer than the one before it and they all just repeat the words "split string" over and over.</p>
<p class="sidePanel">The code to send the email is based on my <a href="http://www.codestore.net/store.nsf/unid/BLOG-20091021-0127?OpenDocument">Email class</a>. All it does is create a multi-part MIME message. Nothing out of the ordinary. If you're using the MIME classes to send emails then this probably applies to you.</p>
<p>At some point in the loop the length of the message will get to such a size that something very worrying happens, as you can see below: </p>
<p><img style="border-right-width: 0px; margin: 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/C09F753B11162C74862576DB0027D283/$file/image_d4dbc923-524e-4dab-83e3-a033998db388.png" width="406" height="128"> </p>
<p>Notice the missing p?! </p>
<h4>The Problem</h4>
<p>From my investigations I've concluded the following:</p>
<p><strong>If you use a 3rd party mail client (like Thunderbird) to download a multi-part HTML email from a mail file on a Domino server using POP3 then the POP3 server will <em>remove</em> the 655th character and put a line break in its place.</strong> </p>
<p>Looking at the very same email in the original mail file - using the Notes client - there's <strong>no</strong> missing character.</p>
<p>What I've also noticed is that it only removes the first 655th char. Not every subsequent 655th char in the whole string. </p>
<p>Obviously this can be very, very bad. At it's least worst, like in this example, it just looks like a typo. However, I've had numerous bug reports because it's broken the string <em>inside</em> an HTML tag, resulting in un-clickable links or -worse still - emails that just show raw HTML.</p>
<p>The problem seems only to occur when sending emails where the HTML content is made up of one very long string. I guess using very long strings is generally a bad idea in any case, but there's nothing actually wrong with it, and nothing half as wrong as the server removing characters. </p>
<h4>The Solution</h4>
<p>What we need to do is avoid very long lines of HTML code in the email. The obvious solution is to add line breaks in the HTML <em>as</em> you build it in your code. </p>
<p>Unfortunately, in my case, I have way too many instances of code sending HTML email to make it practical to go and add new line breaks in to each email. Instead, what I did was put a fail-safe in to the Email class which sends the email. At the point it adds the HTML to the email it adds a new line at every point an HTML tag is closed, like so:</p><pre class="code2"><span class="TPkeyword1">Call </span>stream.WriteText<span class="TPbracket">(</span>Replace<span class="TPbracket">(</span><span class="TPkeyword1">Me</span>.str_HTMLPart, <span class="TPstring">"&gt;"</span>, <span class="TPstring">"&gt;"</span><span class="TPoperator">+</span><span class="TPkeyword1">Chr</span><span class="TPbracket">(</span><span class="TPnumber">10</span><span class="TPbracket">)))</span>
</pre>
<p>There's still a slight chance that there could be a long string that avoids this rule, but it's unlikely enough for me to feel happy this has resolved the issue for now.</p>
<h4>Summary</h4>
<p>So, you've been warned. If you're sending HTML emails to a Domino server, make sure you split the HTML string down in to sizeable chunks so that users who access their email via POP3 don't see broken HTML.</p>
<p>It all leaves me wondering why on earth the POP3 server would replace the 655th character in the first place. Assuming it does of course. My investigation wasn't exactly extensive but, from what I can tell, it definitely looks like it does. Why though? What's significant about 655? It's not like it's a base 2 number or anything.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100303-0114?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100303-0114</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100303-0114</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100303-0114?Open#comments</comments>
			<slash:comments>20</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100303-0114</wfw:commentRss>
		</item>
		<item>
			<title>How Many Programming Languages Is It Possible To Know? | Blog</title>
			<pubDate>Mon, 1 Mar 2010 01:53:07 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>As I go about learning to develop with ASP.NET I can't help thinking what I think about every time I start learning a new programming language or skill -- does my head have the space for all the new information?!</p> <p>While I'm sure the amount of knowledge currently stored in my head doesn't even come close to pushing the limits of the human brain I do sometimes feel a bit over-whelmed when I consider how much knowledge I need to retain in order to do my daily job.</p> <p>It all makes me think of the age-old saying: </p> <blockquote> <p><a href="http://en.wikipedia.org/wiki/Jack_of_all_trades,_master_of_none">Jack of all trades, master of none</a>.</p></blockquote> <p>Does adding yet another skill to my tool belt mean I'll be just a little less able at one of those I already use?</p> <p>Or, just as worrying, does learning something new mean something else is forgotten. Gotten rid of to make space. I remember reading that Einstein used to try and forget the phone numbers of people he no longer called, so that space was freed-up for something else. </p> <p>Perhaps we each have our own amount of RAM that can be used. Perhaps this decreases with age. Perhaps I should consider stopping trying to learn more than I really need to and concentrate on getting better at the ones I do know.</p> <p>Anybody ever think like this or, as I expect, am I just weird?</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100301-0153?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100301-0153</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100301-0153</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100301-0153?Open#comments</comments>
			<slash:comments>28</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100301-0153</wfw:commentRss>
		</item>
		<item>
			<title>Say Hello To Evelyn Howlett | Blog</title>
			<pubDate>Mon, 22 Feb 2010 05:50:24 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>Yesterday morning at 5-something o'clock Karen woke up in the early stages of labour. Within minutes I'd called the midwifes. Remember last time we'd planned a home birth for Minnie, but left it too late to call and ended up speeding to hospital in an ambulance. Didn't want to repeat that experience.</p> <p>It was a good job I called so soon, as it had snowed during the night and the midwife on call had to come from a town about 14 miles away, which took her an hour. An hour after she arrived, so did Evelyn.</p> <p>Here's a photo of her in the style of the one <a href="http://www.codestore.net/store.nsf/unid/BLOG-20061212">of Felix</a> and <a href="http://www.codestore.net/store.nsf/unid/BLOG-20080624">of Minnie</a> on the days they were born. She looks a lot more like her brother than her sister.</p> <p><img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.codestore.net/store.nsf/rsrc/FECA684BF7C1591C862576D2004109F8/$file/image3.png" width="510" height="376"> </p> <p>The birth was all very straight-forward, which I guess it's easy for me to say. Mother and baby are doing well. </p> <p>My plan is to work from the house for at least this week and just spend an hour or so at the laptop each day to keep on top of things. At least that's the plan.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100222-0550?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100222-0550</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100222-0550</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100222-0550?Open#comments</comments>
			<slash:comments>55</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100222-0550</wfw:commentRss>
		</item>
		<item>
			<title>Are Branded Goods Ever Worth The Cost? | Blog</title>
			<pubDate>Thu, 18 Feb 2010 06:05:30 -0500</pubDate>
			<author>Jake Howlett</author>
			<description><![CDATA[ <p>About five weeks ago our 3 year old Hoover washing machine broke for the second time in its short life. The problem was the same as the first time it broke -- the concrete ballast had fallen to pieces. You know when it happens as it starts to sound like a train is coming through the house when it's on full spin.</p> <p>First time it happened (just outside of its 1 year warranty) they came and fixed it within a couple of weeks (and charged us for it). I remember it well, as the Hoover-supplied "engineer" left all the concrete pieces, the old drum, boxes and various other bits on our doorstep as he left. I pointed out he'd forgotten them only to be told they're not Hoover's property so not their responsibility to dispose of. Yeah, thanks for that. </p> <p>But anyway, forward on just over a year later and it's happened again. The concrete that makes up the weight is in bits. Lots of bits. Oh, and lots of dust. It's everywhere. It's now obvious it's an inherent problem with the machine. Looking at the ballast it appears to be concrete of the grade you'd expect in a breeze block. Now I'm now engineer (well, actually I do have a degree in it) but even I know that's not going to last very long.</p> <p>Whether the machine has an inherent problem or not the fact is Hoover's customer service is truly terrible. </p> <p>Here's what happened in the five weeks since it broke:</p> <ul> <li>Rang Hoover "customer services" to tell them it had broken.</li> <li>Told them it was the exact same issue as before but they said an "engineer" would need to visit anyway.</li> <li>Before this first visit I am <em>forced</em> in to paying for either a &pound;110 labour charge or taking a &pound;159 policy with Domestic &amp; General (D&amp;G) to cover the labour charge <em>and</em> any other repairs for a year. Made sense so I went for the &pound;159 option. </li> <li>Wait a week for a man to visit, who takes one look inside the utility room door and say "It's your concrete's gone, love". Yeah, you don't say.</li> <li>Man then puts parts on order.</li> <li>Wait a week and call. Parts still on order.</li> <li>Trouble just about every neighbour on the road to do a load of washing for us.</li> <li>Wait a week and call. Parts still on order.</li> <li>Trouble just about every neighbour on the road to do a load of washing for us.</li> <li>Wait a week and call. Parts still on order.</li> <li>Trouble just about every neighbour on the road to do a load of washing for us.</li> <li>Decide enough is enough and that we might as well buy a new one for the same cost of the policy.</li> <li>Call D&amp;G to cancel policy. They say we can but that we'd be liable to a &pound;90 call-out charge for the man who was charged with coming to point out the obvious.</li> <li>Realise they have us by the short and curlies and there's little we can do but wait.</li> <li>Wait a week and call. Parts still on order.</li> <li>Trouble just about every neighbour on the road to do a load of washing for us.</li> <li>Karen calls and get very irate. Not until she point our her 3rd child is due any day now does the lady take pity and decide to lodge an internal complaint and to waiver the call-out fee.</li> <li>Three days later they confirm they've cancelled and we have nothing to pay.</li> <li>We go to Argos and order the cheapest washing machine we can find.</li> <li>Due for delivery next Tuesday. Well over 6 weeks since we stopped using the other.</li></ul> <p>So we got the refund for the policy, but who won? It certainly doesn't feel like we have! We're just back where we started. No better off and certainly worse off, as we owe all our neighbours a lot of favours.</p> <p>What we've learnt is that buying a top of the range branded domestic appliance is a complete waste of money. I can't remember exactly what we paid for the washing machine but it was in the region of &pound;400. We did this in the naive belief that it was better and would last.</p> <p>The machine that it replaced cost Karen about &pound;200 and lasted her about 10 years! When I buy things I have an expected life-span for them. With something like a washing machine it's in the region of 10 years. Certainly not three.</p> <p>So, what we've done (aside for vowing never to buy Hoover again) is buy a cheapo one instead. As has been pointed out to us recently "They're all just the same plastic crap inside nowadays anyway". </p> <p>We've bought this new cheap one on the premise that if it breaks outside of the warranty then it is, in effect,&nbsp; disposable. When the cost to repair it equals the cost of a new one what are you supposed to do? As much as I hate the idea of sending the "old" one to the tip, what am I supposed to do? </p> <p>There are some things in life you take for granted until they break. I didn't realise how much we relied on a washing machine until now. Well, not so much me, but my very pregnant wife who was way more patient with this whole saga than I would have been.</p> <p>It all leaves me thinking extended warranties and the like are a complete waste of money. Just buy cheap and replace it when broke. I never thought I'd be suggesting such a wasteful idea, but it's the only real option here. Hoover should be ashamed of the terrible, terrible customer service.</p>
<p><a href="http://www.codestore.net/store.nsf/unid/BLOG-20100218-0605?open#post"><img border="0" src="http://www.codestore.net/store.nsf/images/rss_reply.gif" alt="Click here to post a response" /></a></p> 		]]></description>
			<link>http://www.codestore.net/store.nsf/unid/BLOG-20100218-0605</link>
			<guid isPermaLink="true">http://www.codestore.net/store.nsf/unid/BLOG-20100218-0605</guid>
			<comments>http://www.codestore.net/store.nsf/unid/BLOG-20100218-0605?Open#comments</comments>
			<slash:comments>29</slash:comments>
			<wfw:commentRss>http://www.codestore.net/store.nsf/blog.xml?Open=20100218-0605</wfw:commentRss>
		</item>


	</channel>
</rss> 
