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

<channel>
	<title>iandouglas.com &#187; howto</title>
	<atom:link href="http://iandouglas.com/category/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://iandouglas.com</link>
	<description>senior web architect</description>
	<lastBuildDate>Thu, 10 Jun 2010 17:58:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Dropbox client for Android, beta review</title>
		<link>http://iandouglas.com/2010/05/02/dropbox-client-for-android-beta-review/</link>
		<comments>http://iandouglas.com/2010/05/02/dropbox-client-for-android-beta-review/#comments</comments>
		<pubDate>Mon, 03 May 2010 03:55:01 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogging]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=1163</guid>
		<description><![CDATA[Thanks again to AndroidPolice.com for publishing a piece I wrote, detailing the v0.9 beta client that Dropbox developed for the Android platform. They&#8217;ve brought me on as a &#8220;contributor&#8221; to their site, and feels a lot like what I used to do for the Blackjack 2 sit I ran a few years ago.]]></description>
			<content:encoded><![CDATA[<p>Thanks again to <a href="http://AndroidPolice.com">AndroidPolice.com</a> for publishing a piece I wrote, detailing the <a href="http://www.androidpolice.com/2010/05/01/detailed-previewreview-of-the-official-android-dropbox-client-beta/">v0.9 beta client that Dropbox developed for the Android platform</a>. They&#8217;ve brought me on as a &#8220;contributor&#8221; to their site, and feels a lot like what I used to do for the Blackjack 2 sit I ran a few years ago.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/05/02/dropbox-client-for-android-beta-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apparently there&#8217;s no escape from Facebook&#8217;s Social Web</title>
		<link>http://iandouglas.com/2010/04/28/apparently-theres-no-escape-from-facebooks-social-web/</link>
		<comments>http://iandouglas.com/2010/04/28/apparently-theres-no-escape-from-facebooks-social-web/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 17:12:52 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=1147</guid>
		<description><![CDATA[Like it or not, opt-out or not, Facebook will deliver a social web. I have my Facebook account locked down fairly well with very few details open to the public (my website and Email) and I of course followed my own instructions on how to properly opt out of Facebook&#8217;s &#8220;Instant Personalization&#8221; settings. Or so [...]]]></description>
			<content:encoded><![CDATA[<p>Like it or not, opt-out or not, Facebook will deliver a social web.</p>
<p>I have my Facebook account locked down fairly well with very few details open to the public (my website and Email) and I of course followed <a href="http://iandouglas.com/2010/04/21/howto-protect-yourself-as-best-you-can-from-facebooks-f8-platform/">my own instructions</a> on how to properly opt out of Facebook&#8217;s &#8220;Instant Personalization&#8221; settings. Or so I thought.</p>
<p><a href="http://iandouglas.com/wp-content/uploads/2010/04/facebook-personalization.png"><img src="http://iandouglas.com/wp-content/uploads/2010/04/facebook-personalization.png" alt="" title="facebook-personalization" width="209" height="443" class="alignleft size-full wp-image-1149" /></a><br />
Even though I have opted out and set up restrictive privacy settings as seen to the left, visiting <a href="http://www.facebook.com/cormyn">http://www.facebook.com/cormyn</a> will allow you to view my entire friend&#8217;s list, and show you all products, apps, music and games that I am a fan of, or have selected that I like. Honestly, I could care less that the world can see that I like Jason Mraz or Sara Bareilles, they&#8217;re both excellent musicians. And I&#8217;m certain that nobody is going to lose any sleep knowing that I&#8217;m a die-hard Dr Pepper fan or that I play some of Zynga&#8217;s games on Facebook.</p>
<p><br clear=all /><br />
However, despite my efforts to follow Facebook&#8217;s instructions to opt out of Instant Personalization, I visited CNN.com this morning to read a news article about a tweet I read a few minutes ago, and saw the following:<br />
<a href="http://iandouglas.com/wp-content/uploads/2010/04/cnn-facebook-home.png"><img src="http://iandouglas.com/wp-content/uploads/2010/04/cnn-facebook-home.png" alt="" title="cnn-facebook-home" width="307" height="410" class="aligncenter size-full wp-image-1152" /></a></p>
<p>Upon clicking an article, I also saw this at the top right of the screen and also at the bottom of the article I was reading:<br />
<a href="http://iandouglas.com/wp-content/uploads/2010/04/CNN-facebook.png"><img src="http://iandouglas.com/wp-content/uploads/2010/04/CNN-facebook.png" alt="" title="CNN-facebook" width="359" height="88" class="aligncenter size-full wp-image-1148" /></a></p>
<p>This is definitely something that concerns me. Not only is the front page of CNN showing me messages about one of my Facebook friends, it&#8217;s also aware of the fact that none of my 300-something friends on Facebook have &#8220;recommended&#8221; the article on their Facebook pages, and suggests I get the scoop and be the first of my friends to do so.</p>
<p>Seriously, Facebook? I&#8217;ve opted out, I&#8217;ve blocked the three partner sites, yet there are still other sites out there, implementing your &#8220;like&#8221; button for your grandiose &#8220;social web&#8221; scheme, and my information and web browsing will be made known to you just because I happen to be logged into Facebook?</p>
<div style="float:left; margin-right:10px;"><script type="text/javascript"><!--
google_ad_client = "pub-1335093070283715";
/* id content, 300x250, created 4/26/10 */
google_ad_slot = "8498795251";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<p>That&#8217;s right, folks: as soon as I&#8217;ve logged out of Facebook, CNN fails to show any of the text/graphics which I show in the screenshots above.</p>
<p>I will admit, the web developer in me is amazed because I know the effort and technology that goes into building something like this. At the same time, if the only way I can NOT see this information is to log out of Facebook, then perhaps I will reserve a separate browser for my Facebook activity, and use my primary browser choice (Google Chrome) for the rest of the web.</p>
<p>Either that, or I need to see if AdBlock has a rule implemented that blocks Facebook&#8217;s iframe on every other web site. That&#8217;d be convenient.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/04/28/apparently-theres-no-escape-from-facebooks-social-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HOWTO: start named PuTTY sessions from a Windows shortcut</title>
		<link>http://iandouglas.com/2010/04/23/howto-start-named-putty-sessions-from-a-windows-shortcut/</link>
		<comments>http://iandouglas.com/2010/04/23/howto-start-named-putty-sessions-from-a-windows-shortcut/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 18:38:55 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[putty]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=687</guid>
		<description><![CDATA[I have Windows 7 on my laptop, but since I&#8217;m a die-hard Linux geek and haven&#8217;t got the patience to wait for anyone else to figure out all of the drivers needed for a clean, working Linux build on my M17x, I installed Cygwin. However, the limitation of running Cygwin in a DOS-like command line [...]]]></description>
			<content:encoded><![CDATA[<p>I have Windows 7 on my laptop, but since I&#8217;m a die-hard Linux geek and haven&#8217;t got the patience to wait for anyone else to figure out all of the drivers needed for a clean, working Linux build on my <a href="http://www.dell.com/us/en/home/notebooks/laptop-alienware-m17x/pd.aspx?refid=laptop-alienware-m17x&amp;cs=19&amp;s=dhs" target="_blank">M17x</a>, I installed <a href="http://www.cygwin.com/" target="_blank">Cygwin</a>. However, the limitation of running Cygwin in a DOS-like command line window that couldn&#8217;t be expanded beyond 80 characters was a nuisance. Enter &#8220;puttytel&#8221; (<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">downloadable on this page</a>) which can connect to your local Cygwin installation in a PuTTY-like SSH terminal. Running this executable gives you a connection type of &#8220;cygterm&#8221; which you select along with a command of just a dash mark for a local shell.</p>
<p>Of course, then came the mind-numbing exercise of clicking the PuTTY icon, and having to double-click the &#8220;cygwin&#8221; profile I made (for scrollback, colored terminal, etc). A quick Google search later, and I had my answer.</p>
<p>1. Create a shortcut on your desktop for PuTTYtel.exe (right-button drag and drop the executable works great, select &#8220;Create Shortcuts here&#8221;)<br />
2. Right-click the shortcut icon and select Properties<br />
3. Under the &#8220;General&#8221; tab, give it a meaningful name<br />
4. Under the &#8220;Shortcut&#8221; tab, where it lists your target as &#8220;C:\whateverpath\puttytel.exe&#8221; change it to include a parameter of -load (single dash) and then a string (quoted if it contains spaces, etc) of which profile name you want to autoload. Since mine was called &#8220;&#8212;-cygwin&#8221; (so it would appear at the top of my stored session list), my new Target line became this:<br />
<code>"C:\Program Files (x86)\putty\puttytel.exe" -load "----cygwin"</code><br />
5. Click OK to save, then right-click on the shortcut again and select &#8220;pin to taskbar&#8221;<br />
6. Now you can simply click that icon, and it will immediately load that PuTTY saved session for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/04/23/howto-start-named-putty-sessions-from-a-windows-shortcut/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO: protect yourself (as best you can) from Facebook&#8217;s F8 platform</title>
		<link>http://iandouglas.com/2010/04/21/howto-protect-yourself-as-best-you-can-from-facebooks-f8-platform/</link>
		<comments>http://iandouglas.com/2010/04/21/howto-protect-yourself-as-best-you-can-from-facebooks-f8-platform/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 23:18:03 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=681</guid>
		<description><![CDATA[To recap my &#8220;social web is not a private web&#8221; article, Facebook&#8217;s F8 platform will begin to create a massive social web for which you have already given them permission to share your public info. Be warned though that even if you do take some of the following steps to opt-out, your friends might still [...]]]></description>
			<content:encoded><![CDATA[<p>To recap my &#8220;s<a title="Facebook's social web will not be a private web" href="http://iandouglas.com/2010/04/21/facebooks-social-web-will-not-be-a-private-web/">ocial web is not a private web</a>&#8221; article, Facebook&#8217;s F8 platform will begin to create a massive social web for which you have already given them permission to share your public info.</p>
<p>Be warned though that even if you do take some of the following steps to opt-out, your friends might still be able to share some of your public information (Name, Profile Picture, Gender, Current City, Networks, Friend List, and Pages) without your consent as these &#8216;partner&#8217; sites will have access to your friend&#8217;s contact list which can contain public pieces of information about you.</p>
<p>To help protect yourself, here are some links at Facebook that can help you opt out of as much of this F8 platform as you can:</p>
<p>1. <a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications">http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications</a></p>
<p>You&#8217;ll notice a new check box at the bottom called &#8220;Instant Personalization&#8221; which is enabled &#8212; this was Facebook&#8217;s way of forcing you to opt into their f8 platform without asking you first.<br />
Recommendation: un-select the &#8220;Instant Personalization&#8221; checkbox.</p>
<p>2. <a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications&amp;field=friends_share">http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications&amp;field=friends_share</a></p>
<p>This first link will let you control which pieces of your profile data can be shared by your friends.<br />
Recommendation: turn them all off.</p>
<div style="float:left"><script type="text/javascript"><!--
google_ad_client = "pub-1335093070283715";
/* id content, 300x250, created 4/26/10 */
google_ad_slot = "8498795251";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
<div>
3. <a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=profile">http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=profile</a></div>
<p>This is where you can see who has access to various pieces of information you store on Facebook.<br />
Recommendation: set everything to &#8220;Only Friends&#8221;.</p>
<p>4. <a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=contact">http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=contact</a></p>
<p><a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=contact"></a>This is where you select who can access the contact information you store on Facebook.<br />
Recommendation: Lock this area down unless there&#8217;s information here that you truly want to be publicly available such as an IM screen name for your friends to find. I have contact information that I only make available to family (cell phone, etc) so I have a contact group set up, and give them permission to certain pieces of info that wouldn&#8217;t be shown even to &#8220;only friends.&#8221; I let my web site, iandouglas.com, be available to &#8216;everyone&#8217;.</p>
<p>5. Block the partner apps you don&#8217;t want your information given to. Each of these three links will have a &#8220;Block Application&#8221; link on the left menu of the page.<br />
Recommendation: block these apps unless you want these partners to have your data.</p>
<p>Microsoft Docs.com: <a href="http://www.facebook.com/docs">http://www.facebook.com/docs</a><br />
Pandora: <a href="http://www.facebook.com/apps/application.php?id=139475280761">http://www.facebook.com/apps/application.php?id=139475280761<br />
</a>Yelp: <a href="http://www.facebook.com/apps/application.php?id=97534753161">http://www.facebook.com/apps/application.php?id=97534753161</a></p>
<p><a href="http://www.facebook.com/apps/application.php?id=97534753161"></a>Once you block them, you can verify they&#8217;re listed here: <a href="http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications&amp;field=blocked_apps">http://www.facebook.com/settings/?tab=privacy#!/settings/?tab=privacy&amp;section=applications&amp;field=blocked_apps</a></p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/04/21/howto-protect-yourself-as-best-you-can-from-facebooks-f8-platform/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Reinventing myself, and my blog</title>
		<link>http://iandouglas.com/2010/03/26/reinventing-myself-and-my-blog/</link>
		<comments>http://iandouglas.com/2010/03/26/reinventing-myself-and-my-blog/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 20:41:11 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[freelance]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=653</guid>
		<description><![CDATA[In 2005 and 2006, I blogged a LOT. So did my wife. It seems that since our son was born in late 2008, neither of us has had much time for blogging any more, and I think my wife has lost interest in it as other things occupy her time. Combined with the prevalence of [...]]]></description>
			<content:encoded><![CDATA[<p>In 2005 and 2006, I blogged a LOT. So did <a href="http://bloggymommer" target="_blank">my wife</a>. It seems that since our son was born in late 2008, neither of us has had much time for blogging any more, and I think my wife has lost interest in it as other things occupy her time.</p>
<p>Combined with the prevalence of micro-blogging such as Twitter and Facebook status updates, writing out full-length quality postings seems to be quite old-school now. While in the process of migrating my old blog articles back to WordPress, I&#8217;m reading through all of them again and finding some oldies but goodies, such as &#8220;<a href="http://iandouglas.com/2005/05/11/date-a-geek/">Reasons to Date a Geek</a>&#8221; and &#8220;<a href="http://iandouglas.com/2005/07/17/do-you-geek-take-this-mini-geek/">I, Geek, take you, Mini-geek</a>&#8221; among others. I also see lots of failed potential such as setting up thedouglasclan.com as a photo site for our family, and I&#8217;ve lost count of how many times I&#8217;ve switched from one blog engine to another or posted about new layouts on the site.</p>
<p>Like most full-time employees, I fear blogging about my workplace or what I&#8217;m working on, so as not to <a href="http://www.urbandictionary.com/define.php?term=dooced" target="_blank">get dooced</a> which really only leaves a few areas of my life to share that I feel could help others: running a freelance business, web development, marriage, finances, and being a new dad. And since I&#8217;m not particularly an expert in any of those areas, I imagine iandouglas.com will be a culmination of all of those topics. I&#8217;ll do my best to categorize and tag my ramblings so you can filter out only what you really want to read.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/03/26/reinventing-myself-and-my-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data migration</title>
		<link>http://iandouglas.com/2010/03/26/data-migration/</link>
		<comments>http://iandouglas.com/2010/03/26/data-migration/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 07:43:33 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=482</guid>
		<description><![CDATA[After importing my Drupal database into my WordPress database, a single MySQL query imported all of my articles from Drupal to WordPress (without comments). All that&#8217;s left is to add categories and tags, and build URL redirects from thedouglasclan.com over to iandouglas.com. I simply got tired of some of the imitations I found in Drupal, [...]]]></description>
			<content:encoded><![CDATA[<p>After importing my Drupal database into my WordPress database, a single MySQL query imported all of my articles from Drupal to WordPress (without comments). All that&#8217;s left is to add categories and tags, and build URL redirects from thedouglasclan.com over to iandouglas.com. I simply got tired of some of the imitations I found in Drupal, and find WordPress a much friendlier interface to use.</p>
<p>For anyone curious enough, here&#8217;s the query I used to migrate from Drupal 6.8 to WordPress 2.9:</p>
<p><code>INSERT INTO wp_posts (id, post_author, post_date, post_content, post_title, post_excerpt, post_name, post_modified, post_status)<br />
SELECT DISTINCT 120+n.nid, 1, FROM_UNIXTIME(created), body, n.title, teaser, REPLACE(REPLACE(REPLACE(REPLACE(LOWER(n.title),' ', '-'),'.', '-'),',', '-'),'+', '-'),FROM_UNIXTIME(changed), "draft"<br />
FROM drupal6_node n, drupal6_node_revisions r<br />
WHERE n.vid = r.vid;<br />
</code></p>
<p>The 120+ vaue in the ID field is because I currently had 120 items in my wp_posts table already, and each post must have a unique ID. So, I simply added a value of 120 to whatever ID value was in Drupal. The &#8217;1&#8242; value in the post_author field assigns my WordPress user ID as the author of each article. I also added a post_status of &#8220;draft&#8221; so I could go through the articles, verify their integrity, and then publish them.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/03/26/data-migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hacked an iPhone car kit for the Nexus One</title>
		<link>http://iandouglas.com/2010/02/25/hacked-iphone-car-kit-for-nexus-one/</link>
		<comments>http://iandouglas.com/2010/02/25/hacked-iphone-car-kit-for-nexus-one/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 22:40:59 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[nexus one]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=48</guid>
		<description><![CDATA[Even while I had my iPhone as my primary mobile device, I had been interested in a car dock of some kind that didn&#8217;t involve a suction cup to my windshield or dashboard that could power the device and play audio into my car speakers. A coworker at Armor Games has a neat device, and [...]]]></description>
			<content:encoded><![CDATA[<p>Even while I had my iPhone as my primary mobile device, I had been interested in a car dock of some kind that didn&#8217;t involve a suction cup to my windshield or dashboard that could power the device and play audio into my car speakers. A coworker at Armor Games has a neat device, and forwarded a link to it at mwave.com: <a href="https://www.mwave.com/mwave/skusearch_v3.asp?scriteria=BA36862">The Pixxo PF-C001 All-in-One Hands-Free Car Kit and Charger for iPhone or iPod w/ FM transmitter</a>. It&#8217;s $15-$25 at mwave.com, $27 on eBay at the moment, and there are several similar items on Amazon for $15+. I went to Fry&#8217;s Electronics looking for something similar and only found iPhone-related gear. While the Pixxo device has an additional USB port on the side of the FM Transmitter, it would be inconvenient to have to use that to charge the primary device that&#8217;s being docked once my Nexus One arrived. What to do?</p>
<p>First off, my apologies for lack of photos. I thought about documenting it while I worked, but it was late last night. However, I do need to replace some of my handiwork with proper stuff like heat shrink and insulated wires to cut down on some radio interference.</p>
<p>First, I cut the iPod/iPhone adapter from the Pixxo unit, and saw that there were 8 wires (red, black, white, green, yellow, brown, purple and orange). Next, I cut a micro USB cable and saw that while it was well shielded on the outside, inside the foil insulator were only four wires (red, black, white and green). I twisted the matching wires together, taped it up enough that nothing was shorted, and tested it in the car, and my Nexus One started charging. w00t</p>
<p>Only thing left was to trim the wires back as far as I felt comfortable, shorten up the micro USB plug, and get everything taped up better. Which worked like a champ, except that I had no electrical tape, and I&#8217;m sure that as good as blue 3M Painter tape is, actual electrical tape or heat shrink would do a much better job.</p>
<p>Then, I shortened and spliced a stereo 3.5mm audio cable, as the one that shipped with the Pixxo unit was about two inches two short.</p>
<p>The net result:</p>
<table style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.com/lh/photo/hhoh1DIf8YQESrNy6b4bCA?authkey=Gv1sRgCM6iovbYuKTXmQE&#038;feat=embedwebsite"><img src="http://lh5.ggpht.com/_Hy2suZQNKEY/S4cJSlKfrpI/AAAAAAAAASs/CuT4ZBrdNIU/s400/2010-02-25%2015.34.58.jpg" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">(hosted at picasa)</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/02/25/hacked-iphone-car-kit-for-nexus-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO: redirect iPhone/iPod users on nginx</title>
		<link>http://iandouglas.com/2010/01/20/howto-redirect-iphoneipod-users-on-nginx/</link>
		<comments>http://iandouglas.com/2010/01/20/howto-redirect-iphoneipod-users-on-nginx/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 23:44:46 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=35</guid>
		<description><![CDATA[I learned a little something about nginx, a small footprint web server that is ideal for serving up mobile sites, or sites where you don&#8217;t want the heavy usage of Apache. Today, I needed to solve a problem where we redirected iPhone/iPod users to a different URL. Since nginx doesn&#8217;t use the old-style mod_rewrite rules, [...]]]></description>
			<content:encoded><![CDATA[<p>I learned a little something about nginx, a small footprint web server that is ideal for serving up mobile sites, or sites where you don&#8217;t want the heavy usage of Apache. Today, I needed to solve a problem where we redirected iPhone/iPod users to a different URL. Since nginx doesn&#8217;t use the old-style mod_rewrite rules, I had to learn how to enable redirection in the server.</p>
<p>Since nginx was already compiled with redirection support, I simply had to locate the correct configuration file and add a few lines of code, and away it went.</p>
<p>First, I checked out /etc/nginx/ and opened the site configuration file within the /sites-enabled/ path. For this example, let&#8217;s say the site was m.iandouglas.com:</p>
<pre><code># vi /etc/conf/nginx/sites-enabled/m.iandouglas.com</code></pre>
<p>In here, I&#8217;d look for the &#8216;server&#8217; block and add my redirection rules:</p>
<pre><code>server {
	listen      80;
	server_name m.iandouglas.com;
        root /var/www/m.iandouglas.com/public;

	# redirect iPhone/iPod users to the new iphone site
        if ($http_user_agent ~* '(iPhone|iPod)') {
                rewrite ^/$ http://m.iandouglas.com/iphone/index.html;
        }
.
.
.
</code></pre>
<p>Then a simple nginx restart:</p>
<p><code># /etc/init.d/nginx restart</code></p>
<p>&#8230; and we were all set.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/01/20/howto-redirect-iphoneipod-users-on-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO: enable a &#8220;god mode&#8221; control panel in Windows 7</title>
		<link>http://iandouglas.com/2010/01/07/howto-enable-a-god-mode-control-panel-in-windows-7/</link>
		<comments>http://iandouglas.com/2010/01/07/howto-enable-a-god-mode-control-panel-in-windows-7/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 04:23:58 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=31</guid>
		<description><![CDATA[CNET posted a HOWTO video on how to enable a much broader Control Panel setup by creating a folder with a specific filename. In a nutshell, create a folder in the root level of any drive, and call it &#8220;GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}&#8221; (without the quotes).]]></description>
			<content:encoded><![CDATA[<p><a href="http://cnettv.cnet.com/enable-godmode-windows-7/9742-1_53-50081662.html">CNET posted a HOWTO video</a> on how to enable a much broader Control Panel setup by creating a folder with a specific filename.</p>
<p>In a nutshell, create a folder in the root level of any drive, and call it &#8220;GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}&#8221; (without the quotes).</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/01/07/howto-enable-a-god-mode-control-panel-in-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO: stop wasting time at work</title>
		<link>http://iandouglas.com/2010/01/04/howto-stop-wasting-time-at-work/</link>
		<comments>http://iandouglas.com/2010/01/04/howto-stop-wasting-time-at-work/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 17:48:56 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=28</guid>
		<description><![CDATA[quick and simple: edit /etc/hosts (or on Windows machines: C:\WINDOWS\system32\drivers\etc\hosts) and add the following: 0.0.0.0 www.facebook.com facebook.com apps.facebook.com 0.0.0.0 www.myspace.com myspace.com 0.0.0.0 www.digg.com digg.com etc. Add as many sites as you want. When you want to stop being productive at work, simply comment out those lines (like during a lunch break). Just be sure to [...]]]></description>
			<content:encoded><![CDATA[<p>quick and simple: edit /etc/hosts<br />
(or on Windows machines: C:\WINDOWS\system32\drivers\etc\hosts)<br />
and add the following:</p>
<p>0.0.0.0 www.facebook.com facebook.com apps.facebook.com<br />
0.0.0.0 www.myspace.com myspace.com<br />
0.0.0.0 www.digg.com digg.com</p>
<p>etc. Add as many sites as you want. When you want to stop being productive at work, simply comment out those lines (like during a lunch break). Just be sure to uncomment the lines when you need to be productive again&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2010/01/04/howto-stop-wasting-time-at-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Review: QNAP TS-109 Pro II</title>
		<link>http://iandouglas.com/2008/12/02/review-qnap-ts-109-pro-ii/</link>
		<comments>http://iandouglas.com/2008/12/02/review-qnap-ts-109-pro-ii/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 20:56:12 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nas]]></category>
		<category><![CDATA[qnap]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=62</guid>
		<description><![CDATA[I bit the bullet and bought a SOHO-level / entry-level NAS unit for the home office. I reviewed several units online for the past month or so and finally decided that the QNAP TS-109 Pro II did everything I&#8217;d need. &#8220;But Ian,&#8221; you say. &#8220;You run Linux, why not do it all there?&#8221; Frankly, the [...]]]></description>
			<content:encoded><![CDATA[<p>I bit the bullet and bought a SOHO-level / entry-level NAS unit for the home office. I reviewed several units online for the past month or so and finally decided that the QNAP TS-109 Pro II did everything I&#8217;d need.</p>
<p>&#8220;But Ian,&#8221; you say. &#8220;You run Linux, why not do it all there?&#8221;</p>
<p>Frankly, the recent fires around Los Angeles, and paranoid need to keep stuff backed up and immediately packable should we ever need to evacuate, plus the need to organize our digital life a little at home, all culminated in this purchase. The last time I changed anything on my home network, Samba broke (badly) and shared files and printing capability got kinda hosed.</p>
<p>For $320, the NAS unit has a wealth of features that ultimately came cheaper than buying a whole machine to manage:<br />
- gigabit interface<br />
- two USB ports on the back, one will be used for the printer so we&#8217;ll have proper print sharing on our machines<br />
- eSATA port on the back which I&#8217;ll use in the near future for mirroring the data on the NAS in RAID fashion<br />
- USB port on the front with a button above it that copies all files from whatever device you plug in (like our digital camera), and copies the files into a unique folder name on the enclosed drive<br />
- runs embedded linux and formats the internal drive as ext3, so hard symlinks have become my new best friend for getting rid of duplicate files on the drive while giving Elizabeth and I the flexibility to store our music/photos how we each see fit.<br />
- only runs at 14W at maximum usage &#8212; far cheaper to run this than a full system with a 300W or 400W power supply.<br />
- no fan, so the only noise it makes is from the hard drive<br />
- Samba functionality is very seamless on my wife&#8217;s Windows PC, and the Pro version has NFS capability for mounting somewhat more natively on my Linux workstation.</p>
<p>For another $129 ($99 after rebate), I picked up a duplicate Hitachi DeskStar 1TB drive that I&#8217;ve currently got in my workstation &#8212; once I get files moved to the NAS unit, I&#8217;ll ask Santa for an eSATA enclosure to plug into the TS-109 to set up RAID mirroring of the data.</p>
<p>It&#8217;ll be nice to have this unit available on the network (though all 4 ports on my wireless router are now completely full), which will also give me the flexibility to dual-boot my workstation into Windows from time to time, though I rarely have any free time to do any gaming whatsoever. But at least the headaches of configuring Samba for file/printer sharing are all taken care of with this box.</p>
<p>A really great, really long review of the unit is at this URL:<br />
<a href="http://www.bjorn3d.com/read.php?cID=1137&#038;pageID=">http://www.bjorn3d.com/read.php?cID=1137&#038;pageID=</a></p>
<p>The unit has plenty of other features like an iTunes server, a photo slideshow engine, a built-in web server with PHP, MySQL and SQLite, and opkg for package updates. Oh yeah, and a bittorrent client built in to download torrent files for you in case you want to shut off your computer.</p>
<p>Setup of the unit was pretty simple, though there&#8217;s no option to configure it for Linux, you need a Mac or Windows machine to install the initial setup software, though in retrospect, I probably could have accessed it via its web browser to configure everything.</p>
<p>The longest part of the setup was letting it format the 1TB drive as ext3 &#8212; it took about 20 minutes &#8212; then I mounted a few of the folders onto my wife&#8217;s PC:<br />
Z:\ is the Public folder where we can share files with each other<br />
Y:\ is the copied-from-USB folder where we&#8217;ll retrieve camera photos and anything from a USB key drive<br />
X:\ is a &#8216;multimedia&#8217; folder where we&#8217;ll put our music and photos.</p>
<p>As I mentioned, Elizabeth and I store our photos and music entirely differently. Elizabeth has stated several times, no joking intended, that she&#8217;d rather share a toothbrush than share a hard drive.</p>
<p>With hard symlinks, the underlying file system will only store one copy of a file, but make it accessible as many times as we need to. Soft symlinks don&#8217;t give the same functionality, and Windows doesn&#8217;t seem to handly soft symlinks well over the network.</p>
<p>So now I can simply move all of our music into /artist/album/song.mp3 folders, hard symlink the same structure to a music folder I created for her, and she can move the files via Windows into /year/genre/artist-song.mp3 or whatever format she wants. Though my suspicion is that she uses the Zune software to manage all of her files now so she probably doesn&#8217;t even care where the music lives. But the other nice thing is that we&#8217;ll have copies of all of the music on the NAS for ourselves, and we can delete whichever music files we don&#8217;t want to keep &#8212; for example, I&#8217;m not as big a fan of her swing music, and she hates most of my music, but there&#8217;s a lot of overlap like 80&#8242;s rock, the Wicked soundtrack, stress-relief music, etc.</p>
<p>Photos can be managed the same way, though since our Sony camera has reset the filename counter a few times, we&#8217;ll have several copies of files like DSC00001.JPG which I&#8217;ll need to figure out &#8230; I&#8217;ll probably work something out with MD5 checksums to determine which photos are duplicated, and sort them by content. Does anybody know if there&#8217;s an f-spot equivalent for Windows, or should we both start using Picassa or something to tag our photos?</p>
<p>As I use the drive more, I&#8217;ll write another review in a couple of weeks, but so far I&#8217;m extremely happy. The only drawback I&#8217;ve found so far is typical of any external hard drive &#8212; you&#8217;re limited by the connection. Even with a gigabit network, copying music and photos from my wife&#8217;s PC at the same time as copying about 15GB of files from my PC, plus testing the USB-device-copy to pull photos and video off our camera, slowed the little unit to a crawl. Then again, it&#8217;s only got a 500MHz CPU and 256MB of RAM, so I&#8217;m sure I taxed it pretty hard last night. Under typical usage, I&#8217;m sure it&#8217;ll perform just fine.</p>
<p>I&#8217;ll also share any scripts I write for detecting duplicates or symlinking files.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2008/12/02/review-qnap-ts-109-pro-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Build-it-Yourself SpamAssassin Trainer</title>
		<link>http://iandouglas.com/2008/11/18/build-it-yourself-spamassassin-trainer/</link>
		<comments>http://iandouglas.com/2008/11/18/build-it-yourself-spamassassin-trainer/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 20:45:09 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=64</guid>
		<description><![CDATA[Over the past while, I&#8217;ve been working on a build-it-yourself interface for configuring my SpamAssassin Training script. You can find it here. Keep in mind, I&#8217;m not the author of SpamAssassin, nor its included utility called &#8220;sa-learn&#8221;. My Perl script simply tells the sa-learn utility how to find your mailboxes to train it on spam/non-spam. [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past while, I&#8217;ve been working on a build-it-yourself interface for configuring my SpamAssassin Training script. <a href="http://iandouglas.com/spamassassin-trainer/">You can find it here</a>.</p>
<p>Keep in mind, I&#8217;m not the author of SpamAssassin, nor its included utility called &#8220;sa-learn&#8221;. My Perl script simply tells the sa-learn utility how to find your mailboxes to train it on spam/non-spam.</p>
<p>After fielding several support requests over the past year which usually result from basic syntax errors or confusion over which option(s) to use, I decided to write a front-end for the script, asking which of several scenarios are best suited to the user, and then have PHP do a search-and-replace on the Perl script to build the configuration the user ultimately needs to install on their web hosting account.</p>
<p>So far this has been very successful. I&#8217;ve had several users write in saying it&#8217;s much easier for them to manage.</p>
<p>I&#8217;ll have to tweak the next version of the script, though, to alert other users to visit the build-it-yourself page to download a new copy of the script whenever I make a change.</p>
<p>The other thing that might be handy, of course, is to separate out the logic of the scanning script from the configuration, and just have the main portion of the script download a new copy of the scanning logic whenever a new version is detected &#8230; I&#8217;ll have to think about that one a little longer.</p>
<p>I also promised about a year ago to write a PHP version of the training script, since some users just don&#8217;t understand Perl or execution permissions or what a &#8220;500&#8243; error means or how to work around it, etc., but truth be told, PHP is a bit of a pain to write output of shell-executed programs while they run. In my experience, PHP waits for everything to be finished before displaying any output.</p>
<p>Does anyone know of the equivalent command in PHP that unbuffers output like $|=1; does in Perl for PHP calls like exec() or passthru()?</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2008/11/18/build-it-yourself-spamassassin-trainer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sony Vaio VGN-BX760, dual screen output in Ubuntu 8.04</title>
		<link>http://iandouglas.com/2008/06/26/sony-vaio-vgn-bx760-dual-screen-output-in-ubuntu-8-04/</link>
		<comments>http://iandouglas.com/2008/06/26/sony-vaio-vgn-bx760-dual-screen-output-in-ubuntu-8-04/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 19:10:01 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://iandouglas.com/2008/06/26/sony-vaio-vgn-bx760-dual-screen-output-in-ubuntu-8-04/</guid>
		<description><![CDATA[After a lot of digging and some tweaking, I *finally* have Ubuntu playing nicely on my work laptop, so wanted to post my findings here in hopes it can help someone else.

My video chipset:
<code>$ lspci &#124; grep Graphics
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)
00:02.1 Display controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)</code>
]]></description>
			<content:encoded><![CDATA[<p>After a lot of digging and some tweaking, I *finally* have Ubuntu playing nicely on my work laptop, so wanted to post my findings here in hopes it can help someone else.</p>
<p>My video chipset:<br />
<code>$ lspci | grep Graphics<br />
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)<br />
00:02.1 Display controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (rev 0c)</code></p>
<p>The annoyance I faced was that plugging an external monitor into the laptop before powering it on forced the laptop/monitor to be a mirrored/clone display output, which is annoying. My laptop screen is 1280&#215;800, my external display is 1680&#215;1050, so I was losing a decent chunk of display real estate.</p>
<p>After tweaking my xorg.conf file (listed below), I found the right parameters to change the display to a split desktop mode once I&#8217;ve logged into Xorg:</p>
<p><code>$  xrandr --output LVDS --left-of VGA</code></p>
<p>My laptop sits to the left of the external display, and this command leaves the gnome toolbars and menus on the larger screen, and pushes additional window space to the left where my laptop screen physically sits.</p>
<p>The weirdness with this setup is that the laptop&#8217;s virtual horizontal screen size has to be set to the maximum vertical resolution of the external monitor, so I&#8217;ve got an extra 250px of space at the bottom of my laptop screen. Annoying, but I&#8217;ll live with it.</p>
<p>Here&#8217;s my xorg.conf:</p>
<p><code><br />
Section "InputDevice"<br />
  Identifier "Generic Keyboard"<br />
  Driver "kbd"<br />
  Option "XkbRules" "xorg"<br />
  Option "XkbModel" "pc105"<br />
  Option "XkbLayout" "us"<br />
EndSection</p>
<p>Section "InputDevice"<br />
  Identifier "Configured Mouse"<br />
  Driver "mouse"<br />
  Option "CorePointer"<br />
EndSection</p>
<p>Section "Device"<br />
  Identifier  "Card0"<br />
  Driver      "intel"<br />
  VendorName  "Intel Corporation"<br />
  BoardName   "GM965/GL960 Integrated Graphics Controller"<br />
  BusID       "PCI:0:2:0"<br />
  Option "Monitor-VGA" "laptop"<br />
EndSection</p>
<p>Section "Device"<br />
  Identifier  "Card1"<br />
  Driver      "intel"<br />
  VendorName  "Intel Corporation"<br />
  BoardName   "GM965/GL960 Integrated Graphics Controller"<br />
  BusID       "PCI:0:2.1:0"<br />
  Option "Monitor-TMDS-1" "externallcd"<br />
EndSection</p>
<p>Section "Monitor"<br />
  Identifier "laptop"<br />
  Option "DPMS"<br />
EndSection</p>
<p>Section "Monitor"<br />
  Identifier "externallcd"<br />
  Option "DPMS"<br />
EndSection</p>
<p>Section "Screen"<br />
  Identifier "Screen1"<br />
  Monitor "laptop"<br />
  Device "Card0"<br />
  Defaultdepth    24<br />
  SubSection "Display"<br />
    Depth   24<br />
# Horizontal: 1280 + 1650 = 2930, Vertical: Max(800, 1080) = 1080<br />
    Virtual 2930 1080<br />
  EndSubSection<br />
EndSection</p>
<p>Section "Screen"<br />
  Identifier "Screen2"<br />
  Monitor "externallcd"<br />
  Device "Card1"<br />
EndSection</p>
<p>Section "ServerLayout"<br />
  Identifier "Default Layout"<br />
  Screen 0 "Screen1"<br />
  Screen 1 "Screen2" RightOf "Screen1"<br />
EndSection<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2008/06/26/sony-vaio-vgn-bx760-dual-screen-output-in-ubuntu-8-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Upgrade failed &#8212; Should I reinstall?</title>
		<link>http://iandouglas.com/2008/06/14/ubuntu-upgrade-failed-should-i-reinstall/</link>
		<comments>http://iandouglas.com/2008/06/14/ubuntu-upgrade-failed-should-i-reinstall/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 17:48:09 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://iandouglas.com/2008/06/14/ubuntu-upgrade-failed-should-i-reinstall/</guid>
		<description><![CDATA[Ubuntu, you have let me down in a most heinous way.

For months, your update manager has been telling me to upgrade from 7.04 to 7.10. When 8.04 came out, you didn't offer me a direct upgrade path to the very latest, I had to upgrade one version at a time.

The upgrade from 7.04 to 7.10 took about 5 hours and a handful of prompts about keeping configuration changes.

I figured I might as well open the update manager and upgrade again to 8.04 LTS.
]]></description>
			<content:encoded><![CDATA[<p>Ubuntu, you have let me down in a most heinous way.</p>
<p>For months, your update manager has been telling me to upgrade from 7.04 to 7.10. When 8.04 came out, you didn&#8217;t offer me a direct upgrade path to the very latest, I had to upgrade one version at a time.</p>
<p>The upgrade from 7.04 to 7.10 took about 5 hours and a handful of prompts about keeping configuration changes.</p>
<p>I figured I might as well open the update manager and upgrade again to 8.04 LTS.</p>
<p>Everything was running fine, for another 5+ hours (I went to bed), and I got up, answered a few more prompts about configuration files, and then suddenly the upgrade program crashed just before  the &#8216;clean up&#8217; stage, so now I don&#8217;t know if the upgrade process is finished enough to continue, or if I need to install from scratch all over again.</p>
<p>There&#8217;s no documentation I can find that tells me how to manually download and run the upgrader again or what needs to be finished, etc.</p>
<p>I&#8217;m *so* tempted to go back to Gentoo &#8230; I&#8217;ll need to go re-read my own blog to see why I gave on Gentoo last time. Given the state of my hard drives lately, I&#8217;m tempted to buy another 1TB drive and install on that, use the other 1TB just for backups, and take the other mid-size drive (I think it&#8217;s 500) and reserve that just for Windows (I still dual-boot to play a game or two every 6 months).</p>
<p>More later, I need to use my fancy Ambir DocketPORT 465 to scan my office documents into PDF format, to clean up the office paper load here at home. I&#8217;ll post later on some Linux-based PDF-OCR scanning packages from CPAN that work *really* well.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2008/06/14/ubuntu-upgrade-failed-should-i-reinstall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7 Things I&#8217;ve Learned in 10 Years as a Web Developer</title>
		<link>http://iandouglas.com/2007/07/18/7-things-ive-learned-in-10-years-as-a-web-developer/</link>
		<comments>http://iandouglas.com/2007/07/18/7-things-ive-learned-in-10-years-as-a-web-developer/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 20:23:15 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://iandouglas.com/2007/07/18/7-things-ive-learned-in-10-years-as-a-web-developer/</guid>
		<description><![CDATA[<p>Through a lot of thinking over the past few months, and some recent events that have gone on, I wanted to pass along a few tidbits of advice to up-and-coming web developers, as well as seasoned professionals that need to remember a few key point...Through a lot of thinking over the past few months, and some recent events that have gone on, I wanted to pass along a few tidbits of advice to up-and-coming web developers, as well as seasoned professionals that need to remember a few key points about doing business as a web de]]></description>
			<content:encoded><![CDATA[<p>Through a lot of thinking over the past few months, and some recent events that have gone on, I wanted to pass along a few tidbits of advice to up-and-coming web developers, as well as seasoned professionals that need to remember a few key point&#8230;Through a lot of thinking over the past few months, and some recent events that have gone on, I wanted to pass along a few tidbits of advice to up-and-coming web developers, as well as seasoned professionals that need to remember a few key points about doing business as a web developer.</p>
<p><strong>Get it all in writing ahead of time, preferably with a signature</strong></p>
<p>The very first web project I ever did, commercially, was for the husband of a friend of a friend. Things were communicated very casually that he wanted me to redesign his company&#8217;s web page, but didn&#8217;t give any specifics at all. I agreed, although graphic design is not my strongest talent. I talked to him on the phone once or twice and most of our conversation was handled via Email, and I spent a couple of weeks working out a new design for his site. I never wrote up a quote, I just gave him my hourly rate, and away I went.</p>
<p>At the end of the project, I delivered the new site design to his server, submitted an invoice via Email, and eagerly awaited my money to arrive. A few weeks later I got a check in the mail for only two-thirds the amount of my invoice. I was puzzled and Emailed him back saying I&#8217;d only received a partial payment. His response was a very curt &#8220;We didn&#8217;t like your design and didn&#8217;t think it was worth paying 100% of your invoice.&#8221;</p>
<p>I was new at this, and frankly stunned that a friend of a friend would do this to me. I didn&#8217;t have anything with their signature on it stating I would do &#8220;ABC&#8221;, following a design they approved ahead of time, and be paid a specific amount of money when the work was delivered.</p>
<p>Could I have gone to small claims court? Yes, but it wasn&#8217;t worth my time for the amount of money I lost. Some have argued with me that I should have gone to small claims court just on principle but he was a friend of a friend. Chalk up my first of many experiences of not doing business with friends.</p>
<p>Nowadays, when I discuss work with a client, I write up an initial quote, I specify that the the client will receive a minimum of three designs to choose from (more if they pay extra), and once they choose a design, that they have a set number of hours to tweak that design until they&#8217;re 100% comfortable with it, and then work begins once we work out an exact list of requirements to accomplish. Not a single line of code gets written on my end until they sign off on a design to follow, a contract is signed by both parties, and I&#8217;ve cashed their non-refundable deposit to begin work.</p>
<p><strong>Write up a contract, and use it</strong></p>
<p>Given the &#8220;once bitten, twice shy&#8221; life lesson I learned from my first (bad) experience as a web developer, I immediately started working on a contract layout which I&#8217;ve tweaked to death over the past decade. When writing up your contract, it&#8217;s important to specify milestones and partial payments along the way. My standard project contract template, which gets sent with every quote I submit, now lists things like:</p>
<ul>
<li>A payment schedule, including a non-refundable deposit before I even begin any work, another partial payment when I show them the design on my own server, and the final payment upon delivery. I structure it so that the client pays me about 90% of my original quote before they have the project delivered, so I&#8217;ll never be out very much money if they decide not to pay my final invoice.</li>
<li>In the case where I&#8217;m simply adding something onto an existing site, I include a disclaimer that I must be paid for my work regardless of whether the client implements my work or not, although typically I&#8217;m being contracted to build something directly into their site to begin with.</li>
<li>Clear definitions of their scope and requirements and that anything requested outside of those separate documents will be charged as extra work, to avoid &#8220;feature creep&#8221; or &#8220;scope creep&#8221;.</li>
<li>A disclaimer that they may not end up owning 100% of the copyright on everything delivered if I need to implement third-party software as part of the development. For example, if I were to use [link=http://www.symfony-project.com]Symfony[/link] as a framework on a site, that the client cannot own the copyright on the framework software, just the software I develop on top of the framework.</li>
<li>A portion dedicated to their agreeing to allow me to subcontract any portion of work if I deem it necessary, and that any subcontractors will sign any non-disclosure agreement that my client requests to ensure confidentiality.</li>
<li>A single sentence stating clearly that they will receive a discount for repeat business and to allow me to &#8216;brand&#8217; their site with my business name (&#8220;developed by &#8230;&#8221; and linked back to my site)</li>
<li>Areas to initial allowing me to brand their site, add their site to my portfolio, etc. &#8212; all optional things that I can do after the project is completed. If they don&#8217;t initial an area, I don&#8217;t do it.</li>
</ul>
<p><strong>Know your strengths and weaknesses</strong></p>
<p>It&#8217;s important to know what you&#8217;re good at and what you&#8217;re not good at, when meeting with clients to discuss their project. When I know for a fact that I&#8217;m a very capable programmer and a weak graphic designer, if the client wants a very visually-captivating design, I have to discuss with them various subcontracting allowances as graphic design is not my strongest talent. And to let them know that quite often, graphic designers and Flash programmers are quite expensive, sometimes prohibitively so.</p>
<p>Can I make a visually-appealing site? Yes. Can I do it quickly? No, and it&#8217;s not fair to charge my client twice as much money to do it myself. I&#8217;m better off subcontracting that portion of work to someone with far more talent in the graphics arena to have it done quicker.</p>
<p>The newest spin-off business I&#8217;m working on with my friend Robert is developing a catalog of web designs, some hand-drawn and illustrated by Robert, and slicing those designs into skins/themes for about a dozen of the more popular CMS/blog engines being used today. We work well together because we understand that I am a strong programmer, he&#8217;s a strong graphic designer, and we each know enough about what each other does to appreciate the work involved.</p>
<p><strong>Know how to build an accurate time line</strong></p>
<p>One of the most important skills that I&#8217;ve learned over the years, besides the multiple programming languages I&#8217;m quite fluent in, is estimation. It&#8217;s important to have a good understanding of how long something will take you to accomplish, since no client will want to agree to a time line and then be asked over and over to stretch it out. In college, no joke, I had my professors all discuss estimation with us (this was back in 1993-1996), and they all had different views: have everyone in your team write out their estimate, and do one of the following:</p>
<ul>
<li>take the highest value, submit that as your estimate</li>
<li>take the highest value, double it, submit that as your estimate</li>
<li>add them all together, submit that as your estimate</li>
</ul>
<p>Obviously their approaches on this wouldn&#8217;t fly in today&#8217;s economy, plus they never taught us how to accurately estimate something. I&#8217;ve learned on my own through the guidance of a manger I worked under briefly, that by breaking something down into smaller pieces and realistically work out how long those smaller modules will take ME to develop, accounting for a typical 40-hour work week, I can often come up with a very realistic and very accurate answer as to how long something should take to develop.</p>
<p>I&#8217;ve often been asked to come up with an estimate in the middle of a meeting, so I start thinking out loud, writing down my notes the same way I would if I were alone working on something. This process almost always makes your client impatient though, however it shows them that you are methodical in your approach to things, and they&#8217;ll learn to appreciate your efforts more. To give them a quick answer off the top of my head, it&#8217;d be no more accurate, and just as much of a gamble, for me to pull out some dice and use a roll of those dice to determine how long something would take without carefully analyzing everything.</p>
<p><strong>Keep a portfolio of your work, but keep it maintained</strong></p>
<p>In a world where you must prove to others that you know what you claim to know, maintaining a portfolio of your work is an important aspect of marketing yourself. However, that same world also changes quickly and frequently, and some of your clients may use other designers and developers over time, minimizing the effort you put into their site. This can happen as quickly as a few months, or as long as a few years. My goal, of course, is that my clients will come back for repeat business instead of going elsewhere, because taking their business elsewhere tells me they were not 100% satisfied with what I did. Granted, some clients will always look for the &#8216;lowest bidder&#8217; just to save a buck, but those clients are usually very easy to spot.</p>
<p>When developing your portfolio, it&#8217;s important to keep a few things in mind:</p>
<ul>
<li>Get permission from your clients, and a clear outline from them what you&#8217;re allowed to discuss or not. Never assume you can show their site to anyone else (in fact, your non-disclosure agreement may explicitly prohibit you from doing so). Don&#8217;t assume that linking to their site is okay either. Also, don&#8217;t hide your name in HTML comments on their site unless you explicitly have their permission to do so. Discuss with your client what you can say on the site in a sentence or two about your work, whether a browser screen shot is permitted, even a testimonial from the client in their own words, etc.</li>
<li>Time stamp your involvement. Without this, you&#8217;re essentially claiming, incorrectly, you are the current developer/maintainer of the site, if the client has gone elsewhere. This will only lead to confusion when people no longer see your design or your branding.</li>
<li>Be honest about your role. If you worked through an agency on a site, say so on your portfolio. If all you did was the HTML/code while someone else did the graphics, you need to outline that. It&#8217;s simply dishonest to claim you were the only developer on a project for a client when you were working for or contracted through some third-party group when you did the work, or only a portion of the work. For example, I could easily list a popular customer service web site at Toyota in my portfolio, but I&#8217;m not entitled to, as I was working for another agency at the time, and my contract prohibits me from claiming I worked on the site, though I did, happily, for 6 months.</li>
</ul>
<p>It&#8217;s also very important to note that while your clients may go elsewhere for workers over time for any number of reasons, that you keep tabs on the sites you build, because while designers and developers change over time, domain names as well can change hands over time too, which means you no longer have any claim to the site whatsoever. My suggestion is, where possible, to use <a href="http://www.archive.org/">The Wayback Machine</a> to look for the version of the web site you worked on, and link to archive.org&#8217;s older version of the site instead of the current design.</p>
<p><strong>Keep learning</strong></p>
<p>My wife and I both are very keen learners. I credit my parents for always encouraging me to stretch myself to learn something. My web development expertise is pretty much entirely self-taught, but I have a formal college education in software development, so learning new web-based programming languages has been quite easy for me. In 1996 it was learning basic HTML. In 1997, it was Perl. In 1998, it was MySQL and PHP. In 2002 it was XHTML, and so on. If you stop learning, your skills become stale, and having stale skills will effectively end your career. Being good at one thing used to be a major credit, but in a field of technology that changes so quickly, there is no question that you must adapt to keep up.</p>
<p>What I&#8217;m learning right now is that it&#8217;s important to learn technologies you&#8217;ve always said you&#8217;d never learn. Those that read my blog will know I don&#8217;t really care for Microsoft&#8217;s approach to many things, and that has frankly kept me from learning ASP or .NET programming, despite the fact that it&#8217;s still very strongly supported by the industry. Being such a strong advocate for open source, I tend to shy away from closed-source solutions. However, my current contract position is with a company that is a &#8220;Microsoft shop&#8221;. And while they run PHP and MySQL, they do so on Windows servers with IIS 6. The smart aleck in me wants to talk about the LAMP acronym (linux, apache, mysql, php/perl/python) and apply that to my working environment and how ineffective I see it as Windows IIS MySQL PHP (&#8220;WIMP&#8221;), but I digress. Whether I like it or not, I MUST learn ASP and .NET to keep up with where this company is headed, or I&#8217;m out of a job.</p>
<p>It&#8217;s important to keep tabs on where industry is today, and also where it&#8217;s headed, and learning those skills too. For this reason, I&#8217;ve started working with some J2EE and Java Beans code lately. Granted, I&#8217;m a few years behind on learning J2EE, but that&#8217;s the latest trend, so if I want to compete, I have to learn. If I don&#8217;t keep up, I might as well go learn a completely new kind of career.</p>
<p><strong>Give back to the community</strong></p>
<p>I used to tutor in college, especially in my programming classes, but also in math which I hated. However, nothing will reinforce your knowledge for something like having to teach it to someone else. Find a prodigy, and be a mentor. Find a forum to get involved in and share some of your knowledge with others. Go sit in an IRC chat room for a while and give out some friendly advice.</p>
<p>Giving back to the community is the biggest thing that working with open source has taught me. And while I&#8217;ve never submitted code patches for any large-scale projects of note, like the Linux kernel, Apache or PHP, I have certainly given my ideas and code back to other smaller open-source projects, some of them will be marked with my name forever in subversion repositories. I participate in forums where I can, and I release my own software as open source and often use suggestions submitted by my own user base.</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2007/07/18/7-things-ive-learned-in-10-years-as-a-web-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The stigma of being a computer guy</title>
		<link>http://iandouglas.com/2007/05/03/the-stigma-of-being-a-computer-guy/</link>
		<comments>http://iandouglas.com/2007/05/03/the-stigma-of-being-a-computer-guy/#comments</comments>
		<pubDate>Thu, 03 May 2007 22:06:18 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p>Shaun Boyd wrote an excellent article (http://www.lifereboot.com.nyud.net:8080/2007/10-reasons-it-doesnt-pay-to-be-the-computer-guy/) about the Top 10 Reasons it sucks to be a &#34;computer guy&#34;, and not only do I feel his article was worth sharing, but wanted to share my experiences with this as well. The link to his site is actually going through a mirrored cache, since his original site seems to be taken offline thanks to the Digg effect.</p><p>My favorite bit from his article: </p>]]></description>
			<content:encoded><![CDATA[<p>Shaun Boyd wrote an excellent article (http://www.lifereboot.com.nyud.net:8080/2007/10-reasons-it-doesnt-pay-to-be-the-computer-guy/) about the Top 10 Reasons it sucks to be a &#8220;computer guy&#8221;, and not only do I feel his article was worth sharing, but wanted to share my experiences with this as well. The link to his site is actually going through a mirrored cache, since his original site seems to be taken offline thanks to the Digg effect.</p>
<p>My favorite bit from his article:</p>
<blockquote><p>&#8220;So Shaun, what do you do for a living?&#8221;<br />
Hesitantly, I responded: &#8220;I work in computer support.&#8221;<br />
The transition to silence was immediate. All eyes suddenly turned to me, raised eyebrows all around. If you hadn&#8217;t heard my response, judging from everyone&#8217;s reaction you might think I said something outrageous like I was a male stripper or a gynecologist &#8230; but I knew the awkward silence would soon be broken by an overwhelming outpouring of computer questions.</p></blockquote>
<p>He hit the nail on the head about the whole &#8220;career-choice-inquiry&#8221; conversation ice-breaker. When I tell people that I&#8217;m a software developer, I get asked all kinds of crazy questions, usually about Windows. Why does it do this, why does it do that? I work on software, so I must have some sort of insider knowledge about every piece of software out there.</p>
<p>My favorite game lately is to hint strongly that they probably have a virus or trojan on their system causing the problem, or that it&#8217;s just a bug in Windows (more on that soon), and that they should transition to Linux or change completely to a Mac system.</p>
<p>The most common question I get asked lately is whether they really need to upgrade their computer to use Vista. My response is simple: &#8220;My geek friends are all abandoning Vista and switching to Linux or going back to XP &#8212; even after spending a boatload of money on hardware that&#8217;s only been out for a few months, the driver support hasn&#8217;t caught up yet, so you could spend $1500+ on a new system and have it run like a $200 piece of junk you pulled out of a dumpster.&#8221;</p>
<p>I usually encourage them to stick with XP, or offer to move them to Linux after explaining that &#8216;wine&#8217; support makes using some of their favorite Windows-based applications much easier, lessening their worry about transitional problems.</p>
<p>I&#8217;ve been doing some form of PC support for more than half of my life now, everything from installing mouse drivers back in the old DOS days, to installing Linux on systems, to developing and maintaining web sites, to trying to debug why their home DSL suddenly stopped working (&#8220;I told them to cancel the DSL six months ago and it&#8217;s been working fine until just recently&#8230;&#8221;)</p>
<p>The people I run into usually let the conversation go this way:</p>
<blockquote><p>Them: What do you do for a living?<br />
Me: I&#8217;m an independent freelance software developer &#8211; I work on web sites mostly, E-commerce/shopping cart kind of stuff<br />
Them: Really? Wow &#8230; How much would you charge to &#8230;</p></blockquote>
<p>&#8230; and usually end up describing a printer issue or wireless network problem, or ask my advice on an upgrade of some sort. As Shaun points out in his article, giving advice is risky because you become the target for blame if the advice turns out to be bad, or if their upgrade experience isn&#8217;t as magical as they dreamed it would be.</p>
<p>Still, charging money for what I do is a given, to the point where people expect to have to pay me since I roll out the redundant &#8220;independent freelance&#8221; description of what I do &#8230; Then again, I discount my usual rates, sometimes quite heavily (or completely) depending on the circumstance. For example, I work for my church for free, I don&#8217;t even ask for credit on their web site. Registered non-profit groups usually get $15/hr-$20/hr off my regular rate. Groups that claim to be non-profit may or may not get any discount. Complete strangers get the full hourly rate for programming or IT type work, unless I feel like being a boy scout or just get my name out there. The clock starts when I ring your doorbell, and it stops when I walk back out the door, or I&#8217;ll track it online with a timecard application I wrote. Family gets me for free, and worthy causes tend to get me for free too&#8230;</p>
<p>Lately though, I&#8217;m purposely tapering off what sort of freelance stuff I get myself into, and only look at projects I can complete in a day or two, so I might need to find a new answer to the old &#8220;What do you do for a living&#8221; question to avoid getting into long-term projects. Not that I&#8217;m opposed, but when working with/on computers is your career and your hobby, it gets difficult to draw the line of when to unplug. And knowing I&#8217;ll be a future dad some day, I&#8217;ll want to be sure to have a healthier lifestyle, and outdoor hobbies. I digress.</p>
<p>I&#8217;ve worked on systems quite happily for friends, family, and clients, and I&#8217;ve also avoided some systems like the plague because I know no matter how bullet-proof I try to make something, any problem with the system will be met with &#8220;Well, Ian was the last one to work on it&#8230;&#8221; or &#8220;It was okay until Ian did something&#8230;&#8221; I have this unnatural fear of being blamed for any little thing after I&#8217;ve done some work, so I try to go the extra mile lately of showing my clients &#8220;Look, see? It works, I&#8217;m done, finished.&#8221; If something worked perfectly when I left it last, and it&#8217;s been more than a week since I was there, and now suddenly it doesn&#8217;t work or something else has gone wrong, my natural assumption would be of course that you&#8217;ve tinkered with something, or downloaded something you shouldn&#8217;t have, etc. so of course I&#8217;m going to bill you to fix it&#8230;</p>
<p>One of Shaun&#8217;s other points was:</p>
<blockquote><p>Your Assumed &#8220;All-Knowing&#8221; Status Sets You Up To Let People Down &#8212; There is no common understanding that there are smaller divisions within the computer industry, and that the computer guy cannot be an expert in all areas. What makes things worse, is when the computer guy attempts to explain this to someone asking for help, the person will often believe that the computer guy is withholding the desired knowledge to avoid having to help.</p></blockquote>
<p>I&#8217;ve personally hit this so many times it isn&#8217;t funny. People expect that you&#8217;re an expert in everything and that perhaps you&#8217;re just feigning disinterest in helping them to avoid some work. As a freelance developer, I get the attitude of &#8220;If you freelance, shouldn&#8217;t you be more willing to help with my problem to make some money?&#8221; Truth is, I work full-time at a contract position right now, so that means I get to be picky and scrutinize whether I really want to get involved in something &#8217;cause I don&#8217;t need to hustle for work like I used to. You work your butt off in an industry for 11 years building a name for yourself, and you&#8217;ll have enough people knocking on your door to keep the bills and rent paid, trust me. The extra work I do pays for getaway vacations, gifts for my wife, toys for the dog, gadgets for me, tickets to see Weird Al at the OC County Fair this summer, upgrades for the computers, etc.</p>
<p>Thankfully in my current contract position, I&#8217;m just a webmonkey, churning out HTML/PHP code for the time being for various projects. There will be opportunity to learn new things related to programming, but that&#8217;s all I&#8217;m seen as here &#8211; a code jockey. I don&#8217;t fuss with network issues, it&#8217;s not my role or responsibility to debug your Windows error, there&#8217;s a whole team of people across the hall who can figure out why your wireless keyboard doesn&#8217;t work.</p>
<p>As 2007 goes on, I believe I&#8217;ll be more firm about my position as a software developer, specifically web development, and not deal so much with hardware problems. This alone will free up more of my time to focus on my own projects and interests, and find that new outdoor hobby&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2007/05/03/the-stigma-of-being-a-computer-guy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Goodies for the iRiver H320</title>
		<link>http://iandouglas.com/2005/05/15/goodies-for-the-iriver-h320/</link>
		<comments>http://iandouglas.com/2005/05/15/goodies-for-the-iriver-h320/#comments</comments>
		<pubDate>Sun, 15 May 2005 16:26:26 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://iandouglas.com/?p=109</guid>
		<description><![CDATA[The label of &#8216;hacker&#8217; isn&#8217;t always a negative thing. Sometimes being a hacker is just a label given to someone who likes to tinker with something to improve its usability. In my case, I bought a refurbished iRiver H320 digital jukebox, and found some shortcomings, so set out to make handling the player easier (for [...]]]></description>
			<content:encoded><![CDATA[<p>The label of &#8216;hacker&#8217; isn&#8217;t always a negative thing. Sometimes being a hacker is just a label given to someone who likes to tinker with something to improve its usability. In my case, I bought a refurbished iRiver H320 digital jukebox, and found some shortcomings, so set out to make handling the player easier (for me).</p>
<p>These scripts work for me, your mileage may vary.</p>
<p><strong>longname.pl</strong><br />
download link<br />
First of all, the firmware that ships with the iRiver H320 will choke on any files longer than 52 characters (so I&#8217;ve heard), so I had a sysadmin guy at work help me with a shell script to find the files &#8230; only problem is that his method strips out all pathing information, which is kinda useless if your DAP has hundreds of folders like mine. So I wrote it in Perl instead.<br />
It will recursively scan any level of directories looking for filenames which are longer than the supplied length.<br />
My usage:<br />
<code># cd /music/musicfiles<br />
# scan.pl 52 .<br />
*** filename too long (63): ./tmp/Ian Douglas - Too Soon - Christmas Recording - Instrumental.mp3<br />
found 1 filenames too long, from a selection of 3125 files and 445 folders</code></p>
<p><strong>M3U playlist creator v1</strong><br />
download link<br />
I don&#8217;t use WinAmp for anything, let alone to make m3u playlists. And since my H320 doesn&#8217;t seem to have a search feature that will work with .ogg music files, I had to generate playlists to have a decent way to listen to my tunes. PLEASE read the notes within the script to understand how to configure it to tweak it for your own system. Obviously, rename it as a .pl or .cgi script and chmod +x the file so it&#8217;ll run.<br />
Generally speaking, this should generate playlists for *any* purpose &#8230; /shrug<br />
USAGE for VERSION 1:<br />
<code># cd /mymountpoint<br />
# cd mymusicfiles<br />
# mkm3u-v1.pl Rock 12 Stones/* Smashing Pumpkins/* Seether/* Pearl Jam/*<br />
Number of files to process: 18<br />
/music/playlists/Rock.m3u contains a total of 17 songs</code></p>
<p>KNOWN BUGS/ISSUES in VERSION 1:<br />
* the counter is always one more than the files listed in the m3u &#8230; it&#8217;s just a counter error, all matching files get listed in the m3u file<br />
* it won&#8217;t traverse directories if you run it like this:<br />
<code># mkm3u Rock 12* Smashing* Seeth* Pearl*</code><br />
Instead, it&#8217;ll say this:<br />
<code># mkm3u Rock 12* Smashing* Seeth* Pearl*<br />
Number of files to process: 4<br />
BAD FILE: 12 Stones<br />
BAD FILE: Pearl Jam<br />
BAD FILE: Seether<br />
BAD FILE: Smashing Pumpkins</code><br />
I&#8217;ll get around to fixing that &#8220;one of these days&#8221;</p>
<p><strong>M3U playlist creator v2</strong><br />
download link<br />
PLEASE read the notes within the script to understand how to configure it to tweak it for your own system. Obviously, rename it as a .pl or .cgi script and chmod +x the file so it&#8217;ll run.</p>
<p>Generally speaking, this should generate playlists for *any* purpose &#8230; /shrug</p>
<p>USAGE for VERSION 2:<br />
<code># cd /mymountpoint<br />
# cd mymusicfiles<br />
# mkm3u-v2.pl</code><br />
Typical Usage:<br />
<code>mkm3u --playlist=MyPlayList file1 file2 file3 dir/</code><br />
or<br />
<code>(some process that generates a list of filenames) | mkm3u --playlist=MyPlayList --stdin</code></p>
<p>&#8211;playlist, -p [mandatory]<br />
This contains the name of the playlist file, with or<br />
without an .m3u extension</p>
<p>&#8211;stdin, -s [optional]<br />
This will read a list of files from STDIN; use is required if no list of files is given on the command line</p>
<p>&#8211;overwrite, -o [optional]<br />
This will overwrite an existing playlist; not including this option will merge any *new* files into the existing list (duplicate files will be ignored)</p>
<p>&#8211;verbose, -v [optional]<br />
Go into verbose mode, prints out various debugging information</p>
<p>Running as:<br />
<code>find . -name "*coustic*" -print | cut -c3-200 | mkm3u-v2.pl -p Acoustic --stdin</code><br />
builds me a wonderful set of all acoustic files. Other notes:<br />
<code># mkm3u-v2.pl --playlist=Canadian.m3u Colin James/*<br />
# mkm3u-v2.pl --playlist=Canadian.m3u Colin James/<br />
# mkm3u-v2.pl --playlist=Canadian.m3u Colin Jam*</code><br />
all do exactly the same thing</p>
<p>KNOWN BUGS/ISSUES in VERSION 2:<br />
* none that i&#8217;ve found yet &#8230;</p>
<p>TODO list in Version 2:<br />
* general enhancements &#8230; I *know* there are efficiency issues in the way I&#8217;ve coded it, but this was just a quick and dirty attempt at getting a script together that works.<br />
* add a command line switch that will simply run through every directory in &#8220;mymusicfiles&#8221; and build playlists based on the genre tagged within each mp3 file it finds</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2005/05/15/goodies-for-the-iriver-h320/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing XHTML</title>
		<link>http://iandouglas.com/2004/08/11/writing-xhtml/</link>
		<comments>http://iandouglas.com/2004/08/11/writing-xhtml/#comments</comments>
		<pubDate>Thu, 12 Aug 2004 01:23:33 +0000</pubDate>
		<dc:creator>id</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://iandouglas.com/2004/08/11/writing-xhtml/</guid>
		<description><![CDATA[<p>XHTML 1.1 isn't as bad as I thought it was going to be. It's all about closing tags, basically, and forcing you to really understand what you're trying to accomplish. I'll have to look around for some truly compliant XHTML authoring software ...</p>]]></description>
			<content:encoded><![CDATA[<p>XHTML 1.1 isn&#8217;t as bad as I thought it was going to be. It&#8217;s all about closing tags, basically, and forcing you to really understand what you&#8217;re trying to accomplish. I&#8217;ll have to look around for some truly compliant XHTML authoring software though &#8211; typing it by hand is prone to mistakes.</p>
<p>update: May 2005<br />obviously, geeklog isn&#8217;t xhtml 1.1 strict compliant, so that&#8217;ll give me something to do in all that spare time i have</p>
]]></content:encoded>
			<wfw:commentRss>http://iandouglas.com/2004/08/11/writing-xhtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
