<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUIDRXw8eSp7ImA9WxNUFU4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558</id><updated>2009-11-06T10:52:54.271-08:00</updated><title>Alek Davis: Technoblog</title><subtitle type="html">Random rants on programming, technology, and related stuff</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://alekdavis.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>81</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/AlekDavisTechnoBlog" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CUQGSHo6fSp7ImA9WxNUFU4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-585505735602113501</id><published>2009-11-05T22:47:00.000-08:00</published><updated>2009-11-06T10:48:49.415-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T10:48:49.415-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Essential Visual Studio add-ins and other tools</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Improve your programming experience with Visual Studio add-ins and other enhancements.&lt;/div&gt;&lt;br /&gt;If you are a Windows programmer using Visual Studio, here are a few thing which can enhance your programming experience.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Visual Studio add-ins&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.codeproject.com/KB/macros/Code_convert_add-in.aspx"&gt;Code Convert&lt;/a&gt;&lt;/span&gt; converts source code between C# and Visual Basic.NET.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/vcsharp/dd218053.aspx"&gt;CodeRush Xpress for C#&lt;/a&gt;&lt;/span&gt; includes hand-picked features taken from &lt;a href="http://www.devexpress.com/CodeRush"&gt;CodeRush&lt;/a&gt; and &lt;a href="http://www.devexpress.com/Refactor"&gt;Refactor! Pro&lt;/a&gt; add-ins.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://copysourceashtml.codeplex.com/"&gt;&lt;span style="font-weight:bold;"&gt;CopySourceAsHtml&lt;/span&gt;&lt;/a&gt; allows you to copy source code, syntax highlighting, and line numbers as HTML.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://submain.com/products/ghostdoc.aspx"&gt;&lt;span style="font-weight:bold;"&gt;GhostDoc&lt;/span&gt;&lt;/a&gt; automatically generates XML documentation comments for methods and properties based on their type, parameters, name, and other contextual information.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://narrange.net/"&gt;&lt;span style="font-weight:bold;"&gt;NArrange&lt;/span&gt;&lt;/a&gt; automatically organizes code members and elements within .NET classes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.codeproject.com/KB/install/InsertFeature.aspx"&gt;SelectionTree&lt;/a&gt;&lt;/span&gt; adds feature selection tree dialog to appropriate setup and deployment (MSI) projects.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/webdevtools/archive/2008/11/29/spell-checker-update-2-2-full-support-for-vs-2008-sp1-simpler-setup-and-a-few-bug-fixes.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Spell Checker&lt;/span&gt;&lt;/a&gt; supports text verification in HTML style comments, ASP.NET server side comments, JScript, C# and C++ comments, CSS and C, VB and VBScript style comments, as well as in JS, CS, VB, CSS, CPP and H files (requires Visual Studio 2008 SP1 and Microsoft Word 2003 or 2007).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis"&gt;&lt;span style="font-weight:bold;"&gt;StyleCop&lt;/span&gt;&lt;/a&gt; analyzes C# source code to enforce a set of style and consistency rules.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/macros/versioningcontrolledbuild.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Versioning Controlled Build&lt;/span&gt;&lt;/a&gt; automates versioning of .NET and VC++ projects (handy for multi-project solutions).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Code snippets&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.codeplex.com/snippetlibcsharp"&gt;Visual Studio 2008 Code Snippet Library&lt;/a&gt;&lt;/span&gt; (C#)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/aa718338.aspx"&gt;Visual Studio 2005 Code Snippets&lt;/a&gt;&lt;/span&gt; (C#, Visual Basic.NET)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Hacks&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ehow.com/how_5025041_automatically-visual-studio-build-error.html"&gt;&lt;span style="font-weight:bold;"&gt;How to Automatically Stop a Visual Studio Build on an Error&lt;/span&gt;&lt;/a&gt;: will save you time when the build of dependent assemblies fails (it makes no sense to continue with the solution build when one of the project builds fails).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-585505735602113501?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/585505735602113501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=585505735602113501" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/585505735602113501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/585505735602113501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/WVOfllicDvw/essential-visual-studio-add-ins.html" title="Essential Visual Studio add-ins and other tools" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/11/essential-visual-studio-add-ins.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYASHo8eyp7ImA9WxNVFUQ.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-4146918138375875973</id><published>2009-10-14T23:45:00.000-07:00</published><updated>2009-10-26T14:39:09.473-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T14:39:09.473-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="music" /><title>Download free music... legally</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Discover and download free music without violating the law.&lt;/div&gt;&lt;br /&gt;If there is such thing as a typical music preference of a typical computer programmer, it probably does not apply to me. Sure, I like &lt;a href="http://www.amazon.com/Wall-Deluxe-Packaging-Digitally-Remastered/dp/B000006TRV" title="The Wall"&gt;Pink Floyd&lt;/a&gt;, but my musical preferences diverge from majority of popular rock/hard rock/etc icons. My favorite music genre is baroque (Bach, Palestrina, Vivaldi), but I also enjoy &lt;a href="http://www.youtube.com/watch?v=dN3GbF9Bx6E" title="California Dreamin'"&gt;The Mamas &amp; the Papas&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=NbY7DBLw010" title="Sodade"&gt;Cesária Évora&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=d7cNtjQW4Mc" title="Summertime"&gt;Angelique Kidjo&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=Q0wZQbK938Y" title="Felicita"&gt;Al Bano &amp; Romina Power&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=s5Z2gR-lOXY" title="The Winner Takes It All"&gt;ABBA&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=7pA5UhNaYw0&amp;feature=related" title="Dance Me to the End of Love"&gt;Leonard Cohen&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=r-QpaFBD6nE" title="À toi"&gt;Joe Dassin&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=RUAPf_ccobc" title="Libertango"&gt;Astor Piazzolla&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=kCI7VhQ5Dlg" title="The Sun"&gt;b-tribe&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=9vp0jUxUwPs"&gt;Canadian Brass&lt;/a&gt;, &lt;a href="http://www.youtube.com/watch?v=hAup4WHfvcs" title="Galya"&gt;Ivan Kupala&lt;/a&gt;, and other performers, who have little in common with each other. Within the last year or so, I have been discovering performance by the less known artists (at least, less known by me), such as &lt;a href="http://www.kcrw.com/music/programs/tu/tu070625the_puppini_sisters_" title="I Will Survive"&gt;The Puppini Sisters&lt;/a&gt;, &lt;a href="http://www.kcrw.com/music/programs/tu/tu080612natalia_clavier_el_a" title="El Arbol"&gt;Natalia Clavier&lt;/a&gt;, &lt;a href="http://www.npr.org/templates/story/story.php?storyId=14589441"&gt;Lee Rocker&lt;/a&gt;, and &lt;a href="http://www.kcrw.com/music/programs/tu/tu080702melody_gardot_worris" title="Worrisome Heart"&gt;Melody Gardot&lt;/a&gt;, and I really liked some of them. &lt;br /&gt;&lt;br /&gt;If your interests in music are similar to mine, this is how you can find and enjoy new music; it's free and absolutely legal.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Amazon.com&lt;/span&gt;&lt;br /&gt;Amazon.com offers &lt;a href="http://www.amazon.com/Free-Songs-Music/b?node=334897011"&gt;free MP3 downloads&lt;/a&gt;, but the list of songs can be overwhelming. You can use the navigation panel to narrow songs by genre:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/StLI2Sf2DCI/AAAAAAAAAfY/bF-AXjojVQ8/s1600-h/Amazon_FreeMusic.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 352px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/StLI2Sf2DCI/AAAAAAAAAfY/bF-AXjojVQ8/s400/Amazon_FreeMusic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391592538919799842" /&gt;&lt;/a&gt;&lt;br /&gt;In addition to individual songs, Amazon.com also offers free albums. To find free albums, use the &lt;span style="font-style:italic;"&gt;Sort by Price: Low to High&lt;/span&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/StLN5ze65gI/AAAAAAAAAfg/G72ahJSroyI/s1600-h/Amazon_FreeAlbums.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/StLN5ze65gI/AAAAAAAAAfg/G72ahJSroyI/s400/Amazon_FreeAlbums.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391598096872039938" /&gt;&lt;/a&gt;&lt;br /&gt;Amazon normally offers high quality MP3 files (above 192 Kbps).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Podcasts&lt;/span&gt;&lt;br /&gt;A number of radio stations offer one-song-a-day podcast downloads, which are normally of lower quality (128 Kbps - 192 Kbps), but they should sound fine to most ears. Sure most of the downloads are crap, but occasionally, you may stumble upon a gem. There must be more podcasts available, but here are the ones from &lt;a href="http://www.npr.org/rss/podcast/podcast_directory.php?type=topic&amp;id=-1"&gt;NPR&lt;/a&gt; that I like:&lt;blockquote&gt;&lt;a href="http://minnesota.publicradio.org/radio/podcasts/song_of_the_day/"&gt;MPR: The Current Song of the Day&lt;/a&gt; (&lt;a href="http://minnesota.publicradio.org/tools/podcasts/song_of_the_day.xml"&gt;RSS&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://www.kcrw.com/music/programs/tu"&gt;KCRW's Today's Top Tune&lt;/a&gt; (&lt;a href="http://media.kcrw.com/podcast/show/tu"&gt;RSS&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://kexp.org/podcasting/podcasting.asp"&gt;KEXP Song of the Day&lt;/a&gt; (&lt;a href="http://feeds2.feedburner.com/kexp/songoftheday"&gt;RSS&lt;/a&gt;)&lt;/blockquote&gt;To download podcasts, you can use a device-specific program, such as iTunes or Zune, but I prefer a free, open-source program called &lt;a href="http://juicereceiver.sourceforge.net/"&gt;Juice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/StOtBRMr1HI/AAAAAAAAAfo/dygNcSgcZgk/s1600-h/Juice.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/StOtBRMr1HI/AAAAAAAAAfo/dygNcSgcZgk/s400/Juice.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5391843416200696946" /&gt;&lt;/a&gt;&lt;br /&gt;Once you find a track that you like among the downloads, you can use an application like &lt;a href="http://www.mp3tag.de/en/index.html"&gt;Mp3Tag&lt;/a&gt; to edit ID3 tags (you may also want to rename file names, because the downloaded files normally have cryptic names).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Use RSS tools&lt;/span&gt;&lt;br /&gt;You can automate the process of searching for free MP3 downloads across multiples sources using RSS tools, such as &lt;a href="http://pipes.yahoo.com/pipes/"&gt;Yahoo! Pipes&lt;/a&gt;. The key is to subscribe to the right aggregation service. I would recommend the SlickDeals' &lt;a href="http://slickdeals.net/forums/forumdisplay.php?sduid=111854&amp;f=4"&gt;Freebes&lt;/a&gt; and &lt;a href="http://slickdeals.net/forums/forumdisplay.php?sduid=111854&amp;f=9"&gt;Hot Deals&lt;/a&gt; forums, as well as &lt;a href="http://slickdeals.net/"&gt;Front Page&lt;/a&gt; (each of these has a subscribe/RSS link). You can follow &lt;a href="http://alekdavis.blogspot.com/2008/08/rss-tools-for-smart-shoppers.html" title="RSS tools for smart shoppers"&gt;this tutorial&lt;/a&gt; (and &lt;a href="http://alekdavis.blogspot.com/2008/09/more-fun-with-yahoo-pipes.html" title="More fun with Yahoo! Pipes"&gt;this one&lt;/a&gt;) to set up a Yahoo! Pipe filtering only posts containing music-specific keywords, such as &lt;span style="font-style:italic;"&gt;free&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;MP3&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;music&lt;/span&gt;, &lt;span style="font-style:italic;"&gt;album&lt;/span&gt;, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Keep your eyes (and ears) open&lt;/span&gt;&lt;br /&gt;Many vendors offer free promotional MP3s and CDs, some of which are not too bad. For example, I do not remember how I got it, but somehow I received a free &lt;a href="http://www.box.net/shared/3fv3mard7p" title="Download zipped album"&gt;Mommy Mix&lt;/a&gt; CD from Safeway.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/Stdmv6rPVDI/AAAAAAAAAfw/JsCwTQilD3Y/s1600-h/Mommy_mix_album.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 282px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/Stdmv6rPVDI/AAAAAAAAAfw/JsCwTQilD3Y/s400/Mommy_mix_album.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5392892052189959218" /&gt;&lt;/a&gt;&lt;br /&gt;Being a promotional CD, I did not expect much from it, but it it ended up being one of my family's favorite music CDs (in fact, if it were available for sale, I would've bought it). So don't assume that promotional music is always crappy, some may surprise you.&lt;/li&gt;&lt;/ul&gt;See also:&lt;br /&gt;&lt;a href="http://cybernetnews.com/how-to-get-free-mp3-downloads/"&gt;How to Get Free and Legal MP3 Downloads from… Universal Music!?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-4146918138375875973?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/4146918138375875973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=4146918138375875973" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4146918138375875973?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4146918138375875973?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/1Q_-1eY5rtM/download-free-music-legally.html" title="Download free music... legally" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_J6q1OqNOB0E/StLI2Sf2DCI/AAAAAAAAAfY/bF-AXjojVQ8/s72-c/Amazon_FreeMusic.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/10/download-free-music-legally.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcBR3s-eyp7ImA9WxNQEk4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-6823282137743977543</id><published>2009-09-17T18:05:00.000-07:00</published><updated>2009-09-17T18:07:36.553-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T18:07:36.553-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="technobrief" /><title>Technobrief #9</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Recent findings of software, articles, and more.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;English&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dailywritingtips.com/online-style-guides/"&gt;&lt;span style="font-weight:bold;"&gt;Online Style Guides&lt;/span&gt;&lt;/a&gt;: Collection of free style guides.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Guidelines and standards&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/canux/archive/2009/09/11/windows-ux-interaction-guidelines.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Windows UX Interaction Guidelines&lt;/span&gt;&lt;/a&gt;: 828-page guide (PDF) for each aspect of Windows 7 user experience (UX); the first 32 pages cover the UX design principles for Windows 7, a list of inspirations for how to design a great UX, top design guide violations, and more.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Quotes&lt;/span&gt;&lt;ul&gt;&lt;li&gt;From &lt;a href="http://www.noop.nl/2008/04/dont-believe-an.html"&gt;&lt;span style="font-weight:bold;"&gt;Don't Believe Anyone&lt;/span&gt;&lt;/a&gt; by Jurgen Appelo:&lt;blockquote class="quote"&gt;"After eating and sleeping, disagreeing comes third on the list of basic necessities in my life. It's because I like thinking."&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Jobs&lt;/span&gt;&lt;ul&gt;&lt;li&gt;From &lt;a href="http://www.netflix.com/Jobs?id=5366"&gt;&lt;span style="font-weight:bold;"&gt;7 great reasons to work at Netflix&lt;/span&gt; (Reason #5)&lt;/a&gt;:&lt;blockquote class="quote"&gt;&lt;span style="font-weight:bold;"&gt;Rules Annoy Us&lt;/span&gt;&lt;br /&gt;Rules creep into most companies as they try to prevent errors by less-than-stellar employees. But rules also inhibit creativity and entrepreneurship, leading to a lack of innovation. Over time this drives a company to being less fun and less successful. Instead of adding rules as we grow, our solution is to increase talent density faster than we increase business complexity. Great people make great judgment calls and few errors, despite ambiguity.&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Programming&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/bliki/ComposedRegex.html"&gt;&lt;span style="font-weight:bold;"&gt;ComposedRegex&lt;/span&gt;&lt;/a&gt;: Martin Fowler explains how to write more readable regular expressions.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/ericlippert/archive/2009/08/13/four-switch-oddities.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Four switch oddities&lt;/span&gt;&lt;/a&gt;: Eric Lipper explains non-obvious aspects of the &lt;span class="code"&gt;switch&lt;/span&gt; statement (I did not know any of these).&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.james-carr.org/2006/11/03/tdd-anti-patterns/"&gt;&lt;span style="font-weight:bold;"&gt;TDD Anti-Patterns&lt;/span&gt;&lt;/a&gt;: James Carr catalogs the most common misuses of and omissions in Test-Driven Development.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Software&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.aoamedia.com/audioextractor.htm"&gt;&lt;span style="font-weight:bold;"&gt;AoA Audio Extractor&lt;/span&gt;&lt;/a&gt; provides you a handy tool to extract audio/sound or background music from video files.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.vertigosoftware.com/ralph/archive/2006/09/28/Copy_Path_Shell_Extension.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Copy Path&lt;/span&gt;&lt;/a&gt; is a Windows shell extension that adds the ability to copy the path, folder path, or filename within the right click shell extension; works on individual and multiple files and folders.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.go-oo.org/"&gt;&lt;span style="font-weight:bold;"&gt;GoOo&lt;/span&gt;&lt;/a&gt; is another Microsoft Office alternative based on the &lt;a href="http://openoffice.org"&gt;OpenOffice.org&lt;/a&gt; source code; it claims to be fster and slicker.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.be-precision.com/products/precision-helper/"&gt;&lt;span style="font-weight:bold;"&gt;Precision Helper&lt;/span&gt;&lt;/a&gt; creates and manages help projects; works natively with the Microsoft HTML Help projects format (HHP) and allows to publish resulting help to the CHM, WebHelp, PDF and the single HTML document formats.&lt;/li&gt;&lt;li&gt;&lt;a href="http://imageenlarger.sourceforge.net/"&gt;&lt;span style="font-weight:bold;"&gt;SmillaEnlarger&lt;/span&gt;&lt;/a&gt; increases the size of digital images while trying to retain the quality.&lt;/li&gt;&lt;li&gt;&lt;a href="http://rootkitanalytics.com/userland/spy-dll-remover.php"&gt;&lt;span style="font-weight:bold;"&gt;SpyDLLRemover&lt;/span&gt;&lt;/a&gt; is the standalone tool to detect and delete spywares from the system.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis"&gt;&lt;span style="font-weight:bold;"&gt;StyleCop&lt;/span&gt;&lt;/a&gt; analyzes C# source code to enforce a set of style and consistency rules.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xmedia-recode.de/download.html"&gt;&lt;span style="font-weight:bold;"&gt;XMedia Recode&lt;/span&gt;&lt;/a&gt; is a video converter, which can cut and crop a movie, change the resolution, invert and correct the colors and do more (to change the default German interface to English, use the &lt;span style="font-style:italic;"&gt;Optionen - Sprache&lt;/span&gt; menu option).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Web development&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/html-css-techniques/11-classic-css-techniques-made-simple-with-css3/"&gt;&lt;span style="font-weight:bold;"&gt;11 Classic CSS Techniques Made Simple with CSS3&lt;/span&gt;&lt;/a&gt;: Vasili explains how to create   rounded corners, box/text shadows, use fancy fonts and opacity, define multiple backgrounds and do more using classic way and CSS3 way.&lt;/li&gt;&lt;li&gt;&lt;a href="http://speckyboy.com/2009/02/16/32-indispensable-bookmarklets-for-web-developers-and-designers/"&gt;&lt;span style="font-weight:bold;"&gt;32 Indispensable Bookmarklets for Web Developers and Designers&lt;/span&gt;&lt;/a&gt;: A collection of bookmarklets for testing, analyzing and tweaking web pages.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/inline-validation-in-web-forms/"&gt;&lt;span style="font-weight:bold;"&gt;Inline Validation in Web Forms&lt;/span&gt;&lt;/a&gt;: Luke Wroblewski reports on the findings from the usability study assessing various methods of inline form validation (a must read for developers!).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2009/08/10/mastering-css-advanced-techniques-and-tools/"&gt;&lt;span style="font-weight:bold;"&gt;Mastering CSS, Part 2: Advanced Techniques and Tools&lt;/span&gt;&lt;/a&gt;: advanced techniques and effects you can achieve with CSS, e.g. date parts using sprites, timelines, menu lists, sequential lists, date badges, and more.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.emblematiq.com/lab/niceforms/"&gt;&lt;span style="font-weight:bold;"&gt;Niceforms&lt;/span&gt;&lt;/a&gt; is a script that will replace the most commonly used form elements with custom designed ones.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.antipode.ca/2009/themes-sproutcore-vs-cappuccino/"&gt;&lt;span style="font-weight:bold;"&gt;Web app theme showdown: Aristo and Ace&lt;/span&gt;&lt;/a&gt;: Comparison of web application UI themes released by two thick-client web frameworks; both look great, are licensed as Creative Commons Attribution Share-Alike, and come as part of the framework or as separate assets.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Web tools&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jsonformatter.curiousconcept.com/"&gt;&lt;span style="font-weight:bold;"&gt;JSON Formatter and Validator&lt;/span&gt;&lt;/a&gt; is intended to help debug JSON data.&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.themeforest.net/resources/25-essential-web-services-for-designers/"&gt;&lt;span style="font-weight:bold;"&gt;25 Essential Web Services for Designers&lt;/span&gt;&lt;/a&gt; collected by Giulio Bai (by &lt;span style="font-style:italic;"&gt;Services&lt;/span&gt;, Giulio might have meant tools or sites).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-6823282137743977543?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/6823282137743977543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=6823282137743977543" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6823282137743977543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6823282137743977543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/4wL7LaoZGaQ/technobrief-9.html" title="Technobrief #9" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/09/technobrief-9.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IGR3o-eSp7ImA9WxNSF0g.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-4127707164705840269</id><published>2009-08-25T12:53:00.000-07:00</published><updated>2009-08-31T13:45:26.451-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-31T13:45:26.451-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Sending HTML-based email from .NET applications</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: How to use XSL templates to design, build, and test HTML-based email, and avoid common pitfalls in the process.&lt;/div&gt;&lt;br /&gt;If you're writing a .NET application that sends &lt;span style="font-weight:bold;"&gt;HTML-based emails&lt;/span&gt;, you have a &lt;a href="http://stackoverflow.com/questions/620265/can-i-set-up-html-email-templates-in-c-on-asp-net" title="Can I set up HTML/Email Templates in C# on ASP.NET?"&gt;number of options&lt;/a&gt;: you can use .NET Framework's own &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.maildefinition.aspx"&gt;MailDefinition class&lt;/a&gt;, build a custom solution just like &lt;a href="http://blog.dmbcllc.com/2009/08/24/templated-e-mail-using-net/"&gt;Dave did&lt;/a&gt;, or use a third party library similar to &lt;a href="http://www.1000ad.net/index.cfm?page=templateEngine2)"&gt;TemplateEngine&lt;/a&gt; by Ader Software. In this post I'll explain how to design, test, and generate complex HTML-based email messages using &lt;a href="http://en.wikipedia.org/wiki/XSL_Transformations" title="Wikipedia: XSL transformations"&gt;&lt;span style="font-weight:bold;"&gt;XSL transformations&lt;/span&gt;&lt;/a&gt; (XSLT). I'll also explain how to avoid common problems related to HTML-based emails and describe the tools that will help you in doing so.&lt;br /&gt;&lt;br /&gt;Before I get to the nitty-gritty, let me briefly summarize the idea. You, a designer (or developer), create an XSLT file that defines an email template. To convert the XSLT template to an HTML message body, you application will load the XSLT file at run time (you will need to make sure that the application has access to the file location) and merge it with the data (data must be formatted as an XML document). The XSLT engine will substitute the placeholders with data and use conditional formatting to generate the HTML markup.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight:bold;"&gt;advantages&lt;/span&gt; of using XSLT files for email templates include:&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;No dependency on custom libraries&lt;/span&gt;: Everything is built into the .NET Framework.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Flexible transformations&lt;/span&gt;: XSLT allows rather complex transformations and substitutions. For example, you may not know at design time how many items the message must display, in which case, word-by-word substitution will not work; XSLT handles cases like this nicely.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Ease of design and testing&lt;/span&gt;: You can build a number of data XML files and use them to test your template without running or debugging the application.&lt;/li&gt;&lt;/ul&gt;Here are the steps you need to follow:&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Define XML structure to hold your data inputs.&lt;/span&gt;&lt;br /&gt;I found it helpful to create static XML files to be used for testing XSLT templates for various combination of inputs. Your sample XML data file may look like this one:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;Newsletter.xml&lt;/center&gt;&lt;pre class="brush:xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;br /&gt;&amp;lt;Root&amp;gt;&lt;br /&gt;    &amp;lt;UserName&amp;gt;Mary Sweet&amp;lt;/UserName&amp;gt;&lt;br /&gt;    &amp;lt;Message&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit...&amp;lt;/Message&amp;gt;&lt;br /&gt;    &amp;lt;Offers&amp;gt;&lt;br /&gt;        &amp;lt;Offer&amp;gt;Aenean sed nunc nec felis interdum rutrum...&amp;lt;/Offer&amp;gt;&lt;br /&gt;        &amp;lt;Offer&amp;gt;Nullam facilisis erat nec dolor tempor sed interdum neque consectetur...&amp;lt;/Offer&amp;gt;&lt;br /&gt;    &amp;lt;/Offers&amp;gt;&lt;br /&gt;    &amp;lt;UnsubscribeUrl&amp;gt;http://somesite.com/unsubscribe &amp;lt;/UnsubscribeUrl&amp;gt;&lt;br /&gt;&amp;lt;/Root&amp;gt;&lt;/pre&gt;&lt;br /&gt;You can add sample XML data files to your project so you have them at hand for quick testing once you need to make changes to XSLT files, which you'll create in the next step.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Create XSLT files for HTML-based email templates.&lt;/span&gt;&lt;br /&gt;If your email templates are totally different (say, you use one template for password expiration notices, and another for a weekly newsletter), then you will need to define multiple XSLT files (one for each template), but slight variations in a single template can be handled with the help of &lt;a href="http://www.w3schools.com/xsl/default.asp" title="XSLT Tutorial"&gt;XSLT language&lt;/a&gt; constructs within the same file. If you end up with more then one XSLT template, I recommend implementing common sections of the message (e.g. header, footer, styles) in separate XSLT files, which you can then include in the final templates. For example here are three shared templates that define common header, footer, and CSS styles:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;Header.xslt&lt;/center&gt;&lt;pre class="brush:xslt"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:template name=&amp;quot;Header&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;!-- If you need common header elements (logo, etc), include them here. --&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;center&gt;Footer.xslt&lt;/center&gt;&lt;pre class="brush:xslt"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;Footer&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;xsl:param name=&amp;quot;UnsubscribeUrl&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;Best regards,&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;p&amp;gt;John Doe, Editor&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- Only display message if URL is available --&amp;gt;&lt;br /&gt;    &amp;lt;xsl:if test=&amp;quot;string($UnsubscribeUrl) != ''&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&lt;br /&gt;        &amp;lt;hr/&amp;gt;&lt;br /&gt;        &amp;lt;span class=&amp;quot;Footer&amp;quot;&amp;gt;&lt;br /&gt;          If you wish to stop receiving this newsletter, please&lt;br /&gt;          &amp;lt;a&amp;gt;&lt;br /&gt;            &amp;lt;xsl:attribute name=&amp;quot;href&amp;quot;&amp;gt;&lt;br /&gt;              &amp;lt;xsl:value-of select=&amp;quot;$UnsubscribeUrl&amp;quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/xsl:attribute&amp;gt;unsubscribe&amp;lt;/a&amp;gt;.&lt;br /&gt;        &amp;lt;/span&amp;gt;&lt;br /&gt;      &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;center&gt;Style.xslt&lt;/center&gt;&lt;pre class="brush:xslt"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template name=&amp;quot;Style&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;      body { &lt;br /&gt;        font-family:Verdana; &lt;br /&gt;        font-size: 10pt; &lt;br /&gt;        background-color: white; &lt;br /&gt;        color: black; }&lt;br /&gt;      td {&lt;br /&gt;        font-family:Verdana;&lt;br /&gt;        font-size: 10pt;&lt;br /&gt;        background-color: white; &lt;br /&gt;        color: black; }&lt;br /&gt;      p {&lt;br /&gt;        margin-top: 8pt; &lt;br /&gt;        margin-bottom: 8pt; }&lt;br /&gt;      p + p { &lt;br /&gt;        margin-top: 8pt; &lt;br /&gt;        margin-bottom: 8pt; &lt;br /&gt;      }&lt;br /&gt;      &amp;lt;!-- More definitions --&amp;gt;&lt;br /&gt;    &amp;lt;/style&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;&lt;br /&gt;Assuming that you place the shared files in the &lt;span class="code"&gt;Common&lt;/span&gt; subfolder under the main XSLT templates, you can reference them from templates as illustrated in the following example (note: when referencing an external template, use relative path in relation to the caller template):&lt;br /&gt;&lt;br /&gt;&lt;center&gt;Newsletter.xslt&lt;/center&gt;&lt;pre class="brush:xslt"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;xsl:include href=&amp;quot;Common/Style.xslt&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;xsl:include href=&amp;quot;Common/Header.xslt&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;xsl:include href=&amp;quot;Common/Footer.xslt&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;xsl:output method=&amp;quot;html&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;html&amp;gt;&lt;br /&gt;      &amp;lt;head&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&amp;quot;Style&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/head&amp;gt;&lt;br /&gt;      &amp;lt;body&amp;gt;&lt;br /&gt;        &amp;lt;table&amp;gt;&lt;br /&gt;          &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&lt;br /&gt;              &amp;lt;xsl:call-template name=&amp;quot;Header&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;              &amp;lt;p&amp;gt;Dear &amp;lt;xsl:value-of select=&amp;quot;/Root/UserName&amp;quot;/&amp;gt;,&amp;lt;/p&amp;gt;&lt;br /&gt;              &lt;br /&gt;              &amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;/Root/Message&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;              &amp;lt;xsl:if test=&amp;quot;/Root/Offers/Offer&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;p&amp;gt;Here are this week's offers:&amp;lt;/p&amp;gt;&lt;br /&gt;                &amp;lt;xsl:for-each select=&amp;quot;/Root/Offers/Offer&amp;quot;&amp;gt;&lt;br /&gt;                  &amp;lt;blockquote&amp;gt;&lt;br /&gt;                    &amp;lt;xsl:value-of disable-output-escaping=&amp;quot;yes&amp;quot; select=&amp;quot;.&amp;quot;/&amp;gt;&lt;br /&gt;                  &amp;lt;/blockquote&amp;gt;&lt;br /&gt;                &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;              &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&lt;br /&gt;              &amp;lt;xsl:call-template name=&amp;quot;Footer&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;xsl:with-param name=&amp;quot;UnsubscribeUrl&amp;quot; &lt;br /&gt;                    select=&amp;quot;/Root/UnsubscribeUrl&amp;quot;/&amp;gt;&lt;br /&gt;              &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;          &amp;lt;/tr&amp;gt;&lt;br /&gt;        &amp;lt;/table&amp;gt;&lt;br /&gt;      &amp;lt;/body&amp;gt;&lt;br /&gt;    &amp;lt;/html&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/pre&gt;Notice how the XSLT markup references data values from the XML document using &lt;a href="http://www.w3schools.com/xpath/default.asp" title="Learn XPath"&gt;XPath&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Test XSL transformations.&lt;/span&gt;&lt;br /&gt;Once you got your XSLT templates and sample XML files ready, you can test transformation using Visual Studio (activate XSLT file and select &lt;span style="font-style:italic;"&gt;Show XSLT output&lt;/span&gt; from the &lt;span style="font-style:italic;"&gt;XML&lt;/span&gt; menu; on the first attempt you will be prompted to specify the XML file) or &lt;a href="http://alekdavis.blogspot.com/2009/06/how-to-test-xsl-transformations.html" title="How to test XSL transformations"&gt;other tools&lt;/a&gt;. Use different versions of the data XML files to test various permutations of data.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Test HTML-based email in the intended email client programs (web sites).&lt;/span&gt;&lt;br /&gt;Although, your XSLT template may produce perfectly good HTML, there is no guarantee that it will look good in a particular email client. For example, Microsoft Outlook 2007, which uses the Word 2007 HTML rendering engine, &lt;a href="http://www.webpronews.com/insiderreports/2007/01/12/kiss-your-css-goodbye-with-outlook" title="Kiss Your CSS Goodbye With Outlook 2007"&gt;does not recognize many of the standard CSS&lt;/a&gt; constructs. I learned the hard way that I could not use &lt;span class="code"&gt;DIV&lt;/span&gt; tags to limit the page width (had to switch to &lt;span class="code"&gt;TABLE&lt;/span&gt; tags). In the references section at the bottom of the post I included some articles discussing inconsistencies between HTML rendering in various email clients, but they did not help me much (I figured out how to fix formatting issues by trial and error), so the best thing you can do is to check how the mesages appear in various client application (Outlook 2003, Outlook 2007, Thunderbird, Gmail, etc). &lt;br /&gt;&lt;br /&gt;For testing email messages, I recommend using the free Mozilla &lt;a href="http://www.mozillamessaging.com/en-US/thunderbird/"&gt;Thunderbird&lt;/a&gt; email client. Unlike other email clients, Thunderbird allows pasting unaltered HTML source in the message body, so you can send the message in the exact same format as your program. To send your HTML-based email messages via Thunderbird, do the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In the program you use to test your template transformations, select the option to view source of the resulting HTML and copy it to the clipboard.&lt;/li&gt;&lt;li&gt;Switch to Thunderbird and create a new message.&lt;/li&gt;&lt;li&gt;In the message &lt;span style="font-style:italic;"&gt;Compose&lt;/span&gt; form, click in the body field and select &lt;span style="font-style:italic;"&gt;Insert - HTML&lt;/span&gt; from the main menu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/SpW29b3JRKI/AAAAAAAAAfI/40IgJM2KksA/s1600-h/Thunderburd_Insert.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 331px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/SpW29b3JRKI/AAAAAAAAAfI/40IgJM2KksA/s400/Thunderburd_Insert.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5374402896903881890" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Insert the HTML markup from the clipboard into the &lt;span style="font-style:italic;"&gt;Insert HTML&lt;/span&gt; dialog box, and click the &lt;span style="font-style:italic;"&gt;Insert&lt;/span&gt; button.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/SpW3H79GYkI/AAAAAAAAAfQ/TfKZvmoz_Zc/s1600-h/Thunderburd_InsertHtml.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 344px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/SpW3H79GYkI/AAAAAAAAAfQ/TfKZvmoz_Zc/s400/Thunderburd_InsertHtml.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5374403077317485122" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Implement code to handle XSL transformations.&lt;/span&gt;&lt;br /&gt;The following example illustrates how a console program loads an XSLT template, merges it with XML document holding data, and uses the resulting HTML as the email body (note: the example does not contain any error handling):&lt;br /&gt;&lt;br /&gt;&lt;center&gt;Program.cs&lt;/center&gt;&lt;pre class="brush:csharp"&gt;using System;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Xml.Xsl;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Net.Mail;&lt;br /&gt;&lt;br /&gt;namespace EmailXsltDemo&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;  static void Main(string[] args)&lt;br /&gt;  {&lt;br /&gt;    // Input data will be defined in this XML document.&lt;br /&gt;    XmlDocument xmlDoc = new XmlDocument();&lt;br /&gt;    &lt;br /&gt;    // We will use XML nodes to define data.&lt;br /&gt;    XmlElement xmlRoot;&lt;br /&gt;    XmlNode xmlNode;&lt;br /&gt;    XmlNode xmlChild;&lt;br /&gt;    &lt;br /&gt;    // XML structure for data inputs (we'll add &amp;lt;Offer&amp;gt; elements later).&lt;br /&gt;    xmlDoc.LoadXml(&lt;br /&gt;      &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;utf-8\&amp;quot; ?&amp;gt;&amp;quot; +&lt;br /&gt;       &amp;quot;&amp;lt;Root&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;UserName/&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;Message/&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;Offers/&amp;gt;&amp;quot; +&lt;br /&gt;        &amp;quot;&amp;lt;UnsubscribeUrl/&amp;gt;&amp;quot; +&lt;br /&gt;      &amp;quot;&amp;lt;/Root&amp;gt;&amp;quot;);&lt;br /&gt;    &lt;br /&gt;    // Set the values of the XML nodes that will be used by XSLT.&lt;br /&gt;    xmlRoot = xmlDoc.DocumentElement;&lt;br /&gt;    &lt;br /&gt;    xmlNode = xmlRoot.SelectSingleNode(&amp;quot;/Root/UserName&amp;quot;);&lt;br /&gt;    xmlNode.InnerText = &amp;quot;Mary Sweet&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    xmlNode = xmlRoot.SelectSingleNode(&amp;quot;/Root/Message&amp;quot;);&lt;br /&gt;    xmlNode.InnerText = &lt;br /&gt;      &amp;quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    xmlNode = xmlRoot.SelectSingleNode(&amp;quot;/Root/Offers&amp;quot;);&lt;br /&gt;    &lt;br /&gt;    // Insert two &amp;lt;Offer&amp;gt; elements and set their values.&lt;br /&gt;    xmlChild = xmlDoc.CreateNode(XmlNodeType.Element, &amp;quot;Offer&amp;quot;, null);&lt;br /&gt;    xmlChild.InnerText = &lt;br /&gt;      &amp;quot;Aenean sed nunc nec felis interdum rutrum vivamus tempor.&amp;quot;;&lt;br /&gt;    xmlNode.AppendChild(xmlChild);&lt;br /&gt;    &lt;br /&gt;    xmlChild = xmlDoc.CreateNode(XmlNodeType.Element, &amp;quot;Offer&amp;quot;, null);&lt;br /&gt;    xmlChild.InnerText = &lt;br /&gt;      &amp;quot;Nullam facilisis erat nec dolor tempor sed interdum neque consectetur.&amp;quot;;&lt;br /&gt;    xmlNode.AppendChild(xmlChild);&lt;br /&gt;    &lt;br /&gt;    xmlNode = xmlRoot.SelectSingleNode(&amp;quot;/Root/UnsubscribeUrl&amp;quot;);&lt;br /&gt;    xmlNode.InnerText = &lt;br /&gt;      &amp;quot;http://somesite.com/newsletter/unsubscribe/?user=1234567890&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    // This is our XSL template.&lt;br /&gt;    XslCompiledTransform xslDoc = new XslCompiledTransform();&lt;br /&gt;    xslDoc.Load(@&amp;quot;..\..\Xslt\Newsletter.xslt&amp;quot;);&lt;br /&gt;    &lt;br /&gt;    XsltArgumentList xslArgs = new XsltArgumentList();&lt;br /&gt;    StringWriter writer = new StringWriter();&lt;br /&gt;    &lt;br /&gt;    // Merge XSLT document with data XML document &lt;br /&gt;    // (writer will hold resulted transformation).&lt;br /&gt;    xslDoc.Transform(xmlDoc, xslArgs, writer);&lt;br /&gt;    &lt;br /&gt;    MailMessage email = new MailMessage();&lt;br /&gt;    &lt;br /&gt;    email.From = new MailAddress(&amp;lt;YOUR_FROM_ADDRESS&amp;gt;);&lt;br /&gt;    email.To.Add(&amp;lt;YOUR_TO_ADDRESS&amp;gt;);&lt;br /&gt;    email.Subject = &amp;quot;Demo message&amp;quot;;&lt;br /&gt;    email.IsBodyHtml = true;&lt;br /&gt;    email.Body  = writer.ToString();&lt;br /&gt;    &lt;br /&gt;    // Specify appropriate SMTP server, such as &amp;quot;localhost&amp;quot;.&lt;br /&gt;    SmtpClient smtp = new SmtpClient(&amp;lt;YOUR_MAIL_SERVER&amp;gt;);&lt;br /&gt;     &lt;br /&gt;    smtp.Send(email); &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;For your convenience, I created a sample Visual Studio 2008 project which illustrates the functionality:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.box.net/shared/7d4mtrbcgt"&gt;Download sample project&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/center&gt;&lt;br /&gt;Before running the project, make sure that you substitute the &lt;span class="code"&gt;YOUR_FROM_ADDRESS&lt;/span&gt;, &lt;span class="code"&gt;YOUR_TO_ADDRESS&lt;/span&gt;, and &lt;span class="code"&gt;YOUR_MAIL_SERVER&lt;/span&gt; placeholders with the actual string values.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/library/x-xslt/"&gt;What kind of language is XSLT?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sitepoint.com/article/code-html-email-newsletters/"&gt;How to Code HTML Email Newsletters&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sitepoint.com/newsletter/viewissue.php?id=5&amp;issue=48#5"&gt;The Dark Heart of HTML Email&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.campaignmonitor.com/css/"&gt;Guide to CSS support in email clients&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0B764C08-0F86-431E-8BD5-EF0E9CE26A3A&amp;displaylang=en"&gt;2007 Office System Tool: Outlook HTML and CSS Validator&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/XML/TemplateMessages.aspx"&gt;Template Messages Using XSL Transformations and XML Serialization&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-4127707164705840269?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/4127707164705840269/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=4127707164705840269" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4127707164705840269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4127707164705840269?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/GYvK7nK6aqU/sending-html-based-email-from-net.html" title="Sending HTML-based email from .NET applications" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_J6q1OqNOB0E/SpW29b3JRKI/AAAAAAAAAfI/40IgJM2KksA/s72-c/Thunderburd_Insert.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/08/sending-html-based-email-from-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUHQnoyfSp7ImA9WxNSEks.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1317401666698407549</id><published>2009-08-07T12:33:00.000-07:00</published><updated>2009-08-25T21:50:33.495-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T21:50:33.495-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>How to optimize web page width</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: One approach for optimizing a web page layout to make it look nice on both smaller and bigger screens.&lt;/div&gt;&lt;br /&gt;When it comes to web page width, web designers choose between two basic options: &lt;span style="font-weight:bold;"&gt;fixed&lt;/span&gt; width and &lt;span style="font-weight:bold;"&gt;liquid&lt;/span&gt; (AKA dynamic, stretch, &lt;a href="http://www.enicola.com/Liquid-Website-Design.html" title="What is a Flexible Stretched Dynamic Expandable &amp;quot;Liquid&amp;quot; Layout Web Design?"&gt;etc&lt;/a&gt;) width. Either option has a number of &lt;span style="font-style:italic;"&gt;pros&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;cons&lt;/span&gt;, but it looks like the fixed width approach is more prevalent. And this irritates the heck out of me! I just hate having to scroll up and down when navigating a web page half of which content is empty. I do not use small computing devices, but I suspect that people, who view fixed width web pages on 10"-screen netbooks, also do not enjoy scrolling left and right.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" padding="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/SnyyUk9DGgI/AAAAAAAAAfA/3k47veeXuBY/s1600-h/HtmlLayout_Fixed.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 103px; height: 82px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/SnyyUk9DGgI/AAAAAAAAAfA/3k47veeXuBY/s400/HtmlLayout_Fixed.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367360922505648642" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyyRbuj_BI/AAAAAAAAAe4/UZaLYzB5law/s1600-h/HtmlLayout_Liquid.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 103px; height: 82px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyyRbuj_BI/AAAAAAAAAe4/UZaLYzB5law/s400/HtmlLayout_Liquid.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367360868489362450" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;span style="font-weight:bold;font-size:85%;"&gt;Fixed layout&lt;/span&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;span style="font-weight:bold;font-size:85%;"&gt;Liquid layout&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Dynamic web page layouts maximize the use of screen real estate and minimize scrolling, but they have one drawback: many liquid pages look weird on bigger (24"+) monitors. And just as wide-line paragraphs are &lt;a href="http://www.codinghorror.com/blog/archives/000618.html" title="Text Columns: How Long is Too Long?"&gt;difficult to read&lt;/a&gt;, really wide web pages are difficult to use.&lt;br /&gt;&lt;br /&gt;A few years ago, when 15"-19" monitors used to be the norm and the spread between the small and big monitors was not as big, this was not such a big problem. Now, with cheap large (21"+) monitors and small devices (like 10"-screen netbooks) gaining popularity, it is more difficult to optimize a web page for different screen sizes. So how do you design a web page layout to make it look nice on both 10" and 24" screen? &lt;br /&gt;&lt;br /&gt;I have an idea, but before I get to it, let me summarize and justify my goals.&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Goal #1: No wasted space.&lt;/span&gt;&lt;br /&gt;White space is generally good, but only until it starts causing unnecessary hassles. For example, it makes no sense to force the user to scroll vertically on a page with 40% of blank content (on the left and right sides).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Goal #2. Reduce scrolling.&lt;/span&gt;&lt;br /&gt;Vertical scrolling is bad, but horizontal scrolling is worse. There should be no need to scroll horizontally when viewing a page on 12"+ screen. Of course, depending on the displayed content, there may be exceptions (e.g. a grid is more likely to require horizontal scrolling than say textual content). Vertical scrolling should be required only when there is no wasted white space.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Goal #3: Trim content width when page is too wide.&lt;/span&gt;&lt;br /&gt;Wide page is normally good, but not too wide. There is a threashold, after which each page width increase will reduce its readability.&lt;/li&gt;&lt;/ul&gt;With these goals in mind, here is my &lt;span style="font-weight:bold;"&gt;idea&lt;/span&gt;:&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;When designing a web page layout, use liquid (dynamic) width until a certain threashold is reached (the threashold would depend on the type of the page); when the width of the browser window exceeds the value of this threashold, switch the page layout to fixed width.&lt;/span&gt;&lt;/blockquote&gt;This approach offers the best of both worlds: it minimizes wasted space and scrolling on small and medium size screens, and it improves page readability on larger screens. It also does not require to resize the browser window on a bigger screen to make the page smaller.&lt;br /&gt;&lt;br /&gt;Now, how do you actually implement this layout? I'm not particularly strong in CSS and web design, so I was not even sure if it was possible. Fortunately, it is. The answer came from user &lt;a href="http://stackoverflow.com/users/147851/portagemonkey"&gt;PortageMonkey&lt;/a&gt;, who responded to my &lt;a href="http://stackoverflow.com/questions/1230417/what-is-the-best-method-for-supporting-screen-sizes-in-a-web-app"&gt;question at StackOverflow&lt;/a&gt;. To make it work, you just need to define the maximum width of the container holding your web page content (normally, a &amp;lt;DIV&amp;gt; or &amp;lt;TABLE&amp;gt; element) using the &lt;span class="code"&gt;max-width&lt;/span&gt; CSS selector. The &lt;span class="code"&gt;max-width&lt;/span&gt; selector is &lt;a href="http://www.quirksmode.org/css/contents.html" title="CSS contents and browser compatibility"&gt;supported by all major browsers&lt;/a&gt;, except IE 6 (and earlier). To make this functionality work on IE 6, use &lt;a href="http://msdn.microsoft.com/en-us/library/ms537634(VS.85).aspx"&gt;IE dynamic properties&lt;/a&gt; to set up the page width, such as in the following example, which limits the width of an element to 600 pixels:&lt;br /&gt;&lt;br /&gt;&lt;div class='codeblock'&gt;width: expression(document.body.clientWidth &gt; 600 ? "600px": "auto");&lt;/div&gt;Here is the complete example:&lt;br /&gt;&lt;br /&gt;&lt;div class='codeblock'&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;html&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;head&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;style&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;div#content&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;max-width:&amp;nbsp;600px; &lt;br /&gt;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;expression(document.body.clientWidth&amp;nbsp;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;600&amp;nbsp;?&amp;nbsp;"&lt;span style=' color: Blue;'&gt;600px&lt;/span&gt;"&lt;span style=' color: Blue;'&gt;:&amp;nbsp;&lt;/span&gt;"&lt;span style=' color: Blue;'&gt;auto&lt;/span&gt;"&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;border:&amp;nbsp;red&amp;nbsp;1px&amp;nbsp;solid;&lt;br /&gt;}&lt;br /&gt;div#wrapper&amp;nbsp;{width:&amp;nbsp;auto;&amp;nbsp;border:&amp;nbsp;blue&amp;nbsp;1px&amp;nbsp;solid;}&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;style&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;head&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;body&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=' color: Red;'&gt;id&lt;/span&gt;="&lt;span style=' color: Blue;'&gt;wrapper&lt;/span&gt;"&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;&lt;span style=' color: Maroon;'&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=' color: Red;'&gt;id&lt;/span&gt;="&lt;span style=' color: Blue;'&gt;content&lt;/span&gt;"&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;Lorem&amp;nbsp;ipsum&amp;nbsp;dolor&amp;nbsp;sit&amp;nbsp;amet,&amp;nbsp;consectetur&amp;nbsp;adipiscing&amp;nbsp;elit.[...]&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;div&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;div&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;body&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=' color: Blue;'&gt;&amp;lt;&lt;/span&gt;/&lt;span style=' color: Maroon;'&gt;html&lt;/span&gt;&lt;span style=' color: Blue;'&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;If you save this page on a local drive and try to open it in IE, you will notice an ActiveX warning that gets displayed because the CSS style section uses the &lt;span style="font-style:italic;"&gt;expression&lt;/span&gt; property. If you do not allow blocked content, the page will not work as expected. Fortunately, the warning appears only when you try to open local files (via the &lt;span style="font-style:italic;"&gt;file:///&lt;/span&gt; protocol), so it should not be an issue.&lt;br /&gt;&lt;br /&gt;This is what the content of a page would look like when the width is below the maximum (the inline images are adjusted, so they appear to have the same width, although they are not [compare the text displayed on each line]; to see the original, click the image):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyUShCOpYI/AAAAAAAAAeg/j_CxksQs5FY/s1600-h/HtmlLayout_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 49px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyUShCOpYI/AAAAAAAAAeg/j_CxksQs5FY/s400/HtmlLayout_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367327901745063298" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/SnyUWQT6QEI/AAAAAAAAAeo/ZifzMbkDMss/s1600-h/HtmlLayout_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 44px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/SnyUWQT6QEI/AAAAAAAAAeo/ZifzMbkDMss/s400/HtmlLayout_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367327965975298114" /&gt;&lt;/a&gt;And once you increase the width beyond the threashold, the content will stay within the maximum width boundary:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyUvMNw8_I/AAAAAAAAAew/JF2fYheMy0A/s1600-h/HtmlLayout_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 42px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SnyUvMNw8_I/AAAAAAAAAew/JF2fYheMy0A/s400/HtmlLayout_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5367328394372510706" /&gt;&lt;/a&gt;When using this approach, simply adjust the value of the maximum width to the size that is most appropriate for your application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1317401666698407549?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1317401666698407549/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1317401666698407549" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1317401666698407549?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1317401666698407549?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/ogOLeBbnKb8/how-to-optimize-web-page-width.html" title="How to optimize web page width" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_J6q1OqNOB0E/SnyyUk9DGgI/AAAAAAAAAfA/3k47veeXuBY/s72-c/HtmlLayout_Fixed.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/08/how-to-optimize-web-page-width.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08BRH46fip7ImA9WxJUFUg.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-4849555172738768819</id><published>2009-07-13T20:25:00.000-07:00</published><updated>2009-07-13T23:10:55.016-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-13T23:10:55.016-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="computers" /><title>Improve HP Compaq laptop performance</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: A couple of things that can help improve your HP Compaq performance.&lt;/div&gt;&lt;br /&gt;My company-issued laptop (&lt;a href="http://h71016.www7.hp.com/html/interactive/6910p/model.html"&gt;&lt;span style="font-weight:bold;"&gt;HP Compaq 6910p&lt;/span&gt;&lt;/a&gt;) has been sluggish lately. The major problem was the &lt;span style="font-weight:bold;"&gt;login delay&lt;/span&gt;: it took 3-5 minutes for the system to become responsive on every login. I recently &lt;span style="font-weight:bold;"&gt;cleaned up&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;defragmented&lt;/span&gt; the laptop's hard drive and voila: &lt;span style="font-weight:bold;"&gt;performance has improved&lt;/span&gt;. The login response time now takes a fraction of what it used to be. &lt;br /&gt;&lt;br /&gt;If you are suffering from a poor computer performance (and it does not have to be HP/Compaq laptop, but can be any brand of laptop or desktop), try defragmenting the system drive. Before you start defragmentation, &lt;span style="font-weight:bold;"&gt;uninstall&lt;/span&gt; the programs that you do not need, and use the Disk Cleanup tool to delete unnecessary files. To launch Disk Cleanup, in Windows Explorer, right-click the system drive (normally, &lt;span class="code"&gt;C:&lt;/span&gt;), and select &lt;span style="font-style:italic;"&gt;Properties&lt;/span&gt; from the context menu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/Slv2YdM6_GI/AAAAAAAAAeQ/DpPgY_c7Xrk/s1600-h/DiskCleanup.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 400px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/Slv2YdM6_GI/AAAAAAAAAeQ/DpPgY_c7Xrk/s400/DiskCleanup.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5358147081703455842" /&gt;&lt;/a&gt;&lt;br /&gt;In the &lt;span style="font-style:italic;"&gt;General&lt;/span&gt; tab, click the Disk Cleanup button to launch disk diagnostics. Once diagnostics is complete (which may take a few minutes), use the options to delete all temporary and unneeded files.&lt;br /&gt;&lt;br /&gt;After cleaning up the disk, switch back to the disk Properties dialog box (or re-open it if needed), click the &lt;span style="font-style:italic;"&gt;Tools&lt;/span&gt; tab, and press the &lt;span style="font-style:italic;"&gt;Defragment Now&lt;/span&gt; button. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/Slv4MrbjusI/AAAAAAAAAeY/6uS_wmd2vFI/s1600-h/DiskTools.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 400px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/Slv4MrbjusI/AAAAAAAAAeY/6uS_wmd2vFI/s400/DiskTools.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5358149078387768002" /&gt;&lt;/a&gt;&lt;br /&gt;Depending on how badly your hard drive is defragmented, you may need to run the defragmenter 2-5 times to get the best results. It may take a few hours to complete the first pass, but each consecutive run will take less and less time.&lt;br /&gt;&lt;br /&gt;Along with defragmenting the system drive, I also uninstalled the &lt;a href="http://www.hp.com/sbso/solutions/pc_expertise/professional_innovations/security/protect-tools.html"&gt;&lt;span style="font-weight:bold;"&gt;HP ProtectTools&lt;/span&gt;&lt;/a&gt; software (Credential Manager, Embedded Security, etc), which caused me nothing but irritation (since I use other security solutions, I have no need for HP ProtectTools). &lt;br /&gt;&lt;br /&gt;If you are using an HP Compaq laptop and want to get rid of HP ProtectTools, you need to &lt;span style="font-weight:bold;"&gt;uninstall&lt;/span&gt; the applications in the &lt;span style="font-weight:bold;"&gt;following order&lt;/span&gt; (you may not have all of these utilities installed, so just remove the ones that you have):&lt;ol&gt;&lt;li&gt;Credential Manager for HP ProtectTools&lt;/li&gt;&lt;li&gt;Java Card Security for ProtectTools&lt;/li&gt;&lt;li&gt;Drive Encryption for HP ProtectTools&lt;/li&gt;&lt;li&gt;Smartcard security for HP ProtectTools&lt;/li&gt;&lt;li&gt;Embedded Security for HP ProtectTools&lt;/li&gt;&lt;li&gt;BIOS Security for HP ProtectTools&lt;/li&gt;&lt;li&gt;HP ProtectTools Security Manager&lt;/li&gt;&lt;/ol&gt;I’m not sure if removing HP ProtectTools helped improve my system performance, but at least I do not see the "Embedded security was not initialized" pop-up on every login and my system tray is now a bit cleaner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-4849555172738768819?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/4849555172738768819/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=4849555172738768819" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4849555172738768819?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/4849555172738768819?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/xsvZlZGsXWo/improve-hpcompaq-laptop-performance.html" title="Improve HP Compaq laptop performance" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_J6q1OqNOB0E/Slv2YdM6_GI/AAAAAAAAAeQ/DpPgY_c7Xrk/s72-c/DiskCleanup.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/07/improve-hpcompaq-laptop-performance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMBQXg4fCp7ImA9WxJbEEs.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-16259020646419860</id><published>2009-07-11T14:05:00.000-07:00</published><updated>2009-07-19T22:24:10.634-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-19T22:24:10.634-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>Free WinZip alternatives</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Comparison of several free file archivers.&lt;/div&gt;&lt;br /&gt;&lt;a href="http://winzip.com"&gt;WinZip&lt;/a&gt; is a classic file archiving tool. It is a nice utility, but it has a major drawback: it is not free. If your budget for a file archiver is short of $30 (the current price of the cheapest version of WinZip), you can try a number of FREE alternatives, such as:&lt;ul&gt;&lt;li&gt;&lt;a href="#7-Zip"&gt;7-zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#AlZip"&gt;ALZip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#DesktopZip"&gt;DesktopZip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#iZarc"&gt;iZarc&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#jZip"&gt;jZip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#KgbArchiver"&gt;KGB Archiver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#PeaZip"&gt;PeaZip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SecureZip"&gt;SecureZIP Express&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#TugZip"&gt;TugZip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#ZipGenius"&gt;ZipGenius&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#ZipItFree"&gt;ZipItFree&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I recently checked these tools looking for the following features:&lt;a name="Requirements"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Standard archiving algorithms&lt;/span&gt;: the tool must work with archives produced by other archivers, generate archive files that can be opened by other archivers.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Encryption&lt;/span&gt;: the tools should allow encryption of the new archives and it must be able to decrypt archives generated by other tools.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Self-extractor&lt;/span&gt;: the tool must be able to generate a self-extracting executable archive file.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Filename Unicode support&lt;/span&gt;: the tool should correctly handle Unicode characters in file names.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Multilingual interface&lt;/span&gt; (Russian wanted): not a requirement, but is nice to have.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Installer&lt;/span&gt;: is also nice to have.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Documentation&lt;/span&gt;: help file, or at the very least online help, could be handy.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Command-line operation&lt;/span&gt;: I do not need it now, but being able to compress, update, and decompress files via a command-line interface is a plus.&lt;/li&gt;&lt;/ul&gt;In short, all of the programs I tried (or considered trying) failed in one or more areas; however, some came closer to my ideal than the others. Before I describe how the tools compared, let me briefly explain my testing strategy.&lt;br /&gt;&lt;br /&gt;To test the tools' capabilities, I used a (legally purchased) copy of the &lt;a href="http://www.amazon.com/Cabo-Verde-C%C3%A9saria-%C3%89vora/dp/B000066NWG"&gt;Cabo Verde&lt;/a&gt; album by &lt;a href="http://en.wikipedia.org/wiki/Ces%C3%A1ria_%C3%89vora"&gt;Césaria Évora&lt;/a&gt;. The album folder contained 13 MP3 tracks. Almost all file names included Portuguese characters. I encrypted the files in the archive using the AES encryption algorithm with a 256-bit key and compared the results with the archive generated by WinZip (I used WinZip v. 12). I tried to open the archive generated by each tool in WinZip and extract a single file from it (the file had to be decrypted). I also tried to open the encrypted WinZip archive in each of the tested tools. I ran the tools on Windows XP SP3. This is what I found.&lt;br /&gt;&lt;br /&gt;First, based on the information from &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_file_archivers" title="Comparison of file archivers"&gt;Wikipedia&lt;/a&gt; and some preliminary test, I determined that some tools on my list did not support Unicode file names. Because these archivers &lt;span style="font-weight:bold;"&gt;cannot handle Unicode file names&lt;/span&gt;, I excluded them from my test (which is unfortunate, since some of these programs looked promising):&lt;ul&gt;&lt;li&gt;&lt;a name="AlZip"&gt;&lt;/a&gt;&lt;a href="http://www.altools.com/ALTools/ALZip.aspx"&gt;&lt;span style="text-decoration:line-through;"&gt;ALZip&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="iZarc"&gt;&lt;/a&gt;&lt;a href="http://www.izarc.org/"&gt;&lt;span style="text-decoration:line-through;"&gt;iZarc&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="TugZip"&gt;&lt;/a&gt;&lt;a href="http://www.tugzip.com/index.php"&gt;&lt;span style="text-decoration:line-through;"&gt;TugZip&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="ZipGenius"&gt;&lt;/a&gt;&lt;a href="http://www.zipgenius.it/"&gt;&lt;span style="text-decoration:line-through;"&gt;ZipGenius&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Among the tools supporting Unicode file names, I still noticed a problem related to Unicode characters. For example, file &lt;span style="font-style:italic;"&gt;Cesaria Evora - Mãe Velha (Old Mother).mp3&lt;/span&gt; often appeared normal in the archives opened by the programs that produced it, but its name was corrupted when I opened the same archive in other tools. This is how the archive generated by WinZip appears in WinZip (click to display the original -- bigger -- image):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/SlfP_lH0pdI/AAAAAAAAAb0/tv3eKU1qPR8/s1600-h/Archiver_WinZip.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 243px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/SlfP_lH0pdI/AAAAAAAAAb0/tv3eKU1qPR8/s400/Archiver_WinZip.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5356978972984124882" /&gt;&lt;/a&gt;&lt;br /&gt;But look how 7-Zip displays the archive:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/SlfSi9sw5KI/AAAAAAAAAb8/4uUrLh6y_c8/s1600-h/Archiver_7-Zip_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 377px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/SlfSi9sw5KI/AAAAAAAAAb8/4uUrLh6y_c8/s400/Archiver_7-Zip_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5356981779900196002" /&gt;&lt;/a&gt;&lt;br /&gt;Notice the extra folder that appears at the top of the file list. When I expand this folder, I see the file, but the name appears corrupted (letter &lt;span style="font-style:italic;"&gt;ã&lt;/span&gt; turns into &lt;span style="font-style:italic;"&gt;π&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlfUGDjl5dI/AAAAAAAAAcE/EwTPAdW_YHY/s1600-h/Archiver_7-Zip_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 197px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlfUGDjl5dI/AAAAAAAAAcE/EwTPAdW_YHY/s400/Archiver_7-Zip_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5356983482279388626" /&gt;&lt;/a&gt;&lt;br /&gt;In some tools, Unicode characters appear corrupted only in the GUI, but they were fine in the extracted files; however, most tools -- especially the ones built on the top of the 7-zip compression engine -- actually did corrupt the file names (e.g. name of the file extracted from a WinZip archive in 7-Zip was corrupted). This was a common problem (with slight variations) among the tools.&lt;br /&gt;&lt;br /&gt;Now, let me summarize how the tools stacked up for me.&lt;br /&gt;&lt;br /&gt;&lt;a name="7-Zip"&gt;&lt;/a&gt;&lt;a href="http://www.7-zip.org"&gt;&lt;span style="font-weight:bold;"&gt;7-Zip&lt;/span&gt;&lt;/a&gt; (v. 4.65) is considered a classic free file archiver. I've read lots of praises to 7-Zip, but I did not like it. The interface is not intuitive. It took me a while to figure out the workflow which differs from WinZip-like programs. For example, in WinZip you select &lt;span style="font-style:italic;"&gt;File - New&lt;/span&gt; to create a new archive, to which you can then add files and folders. In 7-Zip, there is no &lt;span style="font-style:italic;"&gt;File - New&lt;/span&gt; menu: you first need to select files or folders, and then click &lt;span style="font-style:italic;"&gt;7-Zip - Add to archive&lt;/span&gt; in the context menu. The purpose of some menu options and features is unclear (for a novice). For example, what's the point of two-panel view? 7-Zip also does not use standard Windows dialog boxes, such as File Open or File Save. Navigation in the file manager is awkward: there are no shortcuts to standard folders, such as Desktop or My Documents. There are many quirks like these. The interface of the program is really outdated. I would probably tolerate 7-Zip after more frequent use, but it is rather irritating for a beginner. On the positive side, 7-Zip is very capable. It can use many archiving algorithms. The interface is available in many languages. Command-line version offers many options. Help file covers available features (especially command-line options) very nicely.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlgPB0GlCjI/AAAAAAAAAcM/qzi0-Zs7K0Y/s1600-h/Archiver_7-Zip.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlgPB0GlCjI/AAAAAAAAAcM/qzi0-Zs7K0Y/s400/Archiver_7-Zip.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357048280597727794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;:If you get used to the 7-zip workflow, can tolerate the ugliness of the GUI, and keep in mind the possible issues with Unicode file names in the archives generated by other tools, 7-Zip is worth considering, but I'll pass.&lt;br /&gt;&lt;br /&gt;&lt;a name="DesktopZip"&gt;&lt;/a&gt;&lt;a href="http://www.desktopzip.com/"&gt;&lt;span style="font-weight:bold;"&gt;DesktopZip 2008&lt;/span&gt;&lt;/a&gt; does not have an installer. It looks simple enough but I quickly dismissed DesktopZip once I realized that it does not support encryption. I did not find an option to encrypt the archive. DesktopZip also did not prompt me for the password/passphrase when I tried to extract an encrypted file from the WinZip archive and promptly failed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlgValE2-eI/AAAAAAAAAcU/tAXny5-ATX4/s1600-h/Archiver_DesktopZip2008.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlgValE2-eI/AAAAAAAAAcU/tAXny5-ATX4/s400/Archiver_DesktopZip2008.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5357055303130479074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: No encryption - no go.&lt;br /&gt;&lt;br /&gt;&lt;a name="jZip"&gt;&lt;/a&gt;&lt;a href="http://www.jzip.com/"&gt;&lt;span style="font-weight:bold;"&gt;jZip&lt;/span&gt;&lt;/a&gt; (v. 1.3.0.67918), which uses the 7-Zip engine, looked nice on the first run. Although the web site &lt;a href="http://forum.jzip.com/showthread.php?t=720"&gt;claims that jZip is available in multiple languages&lt;/a&gt;, I only found an English version. The application UI looks reasonably modern and simple. Basic archiving and dearchiving operations are intuitive, but there are some gaps. When I tried to encrypt the files in the archive, jZip asked me to enter the encryption password (which is expected), but then it asked me to enter the decryption password. This made no sense to me, since in the AES encryption algorithm, which I used, encryption and decryption passwords must be the same. I did not enter the decryption password, and was able to decrypt and extract a file from the jZip archive using jZip and WinZip. Like WinZip, jZip makes it difficult to archive a folder with all its contents (you can archive contents of the folder without the folder info). The program can run from command line, but it does not provide a help file. Development status is unclear. The major problem I encountered in jZip was related to Unicode. For some reason, jZip changed letter &lt;span style="font-weight:bold;"&gt;ã&lt;/span&gt; in the name of the &lt;span style="font-style:italic;"&gt;Cesaria Evora - Mãe Velha (Old Mother).mp3&lt;/span&gt; file to &lt;span style="font-weight:bold;"&gt;a&lt;/span&gt;, and it did this with its own archive.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/Slgsi3eWXhI/AAAAAAAAAcc/Zkd8XyQ1xms/s1600-h/Archiver_jZip.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/Slgsi3eWXhI/AAAAAAAAAcc/Zkd8XyQ1xms/s400/Archiver_jZip.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357080734275624466" /&gt;&lt;/a&gt;&lt;br /&gt;jZip also sneaked a shortcut file &lt;span style="font-style:italic;"&gt;Archive created by free jZip.url&lt;/span&gt;, which I assume points to the jZip's web site, into the archive. In the spirit of the software trojans, jZip GUI did not show the file in the archive, but I noticed it when I opened the jZip archive in WinZip:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/SlgsqHZCaTI/AAAAAAAAAck/omEADGkqjho/s1600-h/Archiver_WinZip_jZip.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 256px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/SlgsqHZCaTI/AAAAAAAAAck/omEADGkqjho/s400/Archiver_WinZip_jZip.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357080858807396658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: Sneaky and corruptive - I'll pass.&lt;br /&gt;&lt;br /&gt;&lt;a name="KgbArchiver"&gt;&lt;/a&gt;&lt;a href="http://kgbarchiver.net/"&gt;&lt;span style="font-weight:bold;"&gt;KGB Archiver&lt;/span&gt;&lt;/a&gt; (v. 1.2) works as a wizard that lets you perform three operations: compress or decompress archive and change the application settings. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlqSTlTU93I/AAAAAAAAAcs/iz87sblWhMw/s1600-h/Archiver_KgbArchiver_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlqSTlTU93I/AAAAAAAAAcs/iz87sblWhMw/s400/Archiver_KgbArchiver_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357755571838973810" /&gt;&lt;/a&gt;&lt;br /&gt;The program offers support for several languages, but not for Russian (and you call yourself &lt;span style="font-weight:bold;"&gt;KGB&lt;/span&gt; Archiver?). Surprisingly, when I opened a WinZip-generated archive in KGB Archiver, it displayed the problematic &lt;span style="font-style:italic;"&gt;Cesaria Evora - Mãe Velha (Old Mother).mp3&lt;/span&gt; file correctly; however, KGB Archiver changed the name of this file in its own archive (a'la jZip). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqZcjkr9JI/AAAAAAAAAc0/Zi0utgXIBc4/s1600-h/Archiver_KgbArchiver_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqZcjkr9JI/AAAAAAAAAc0/Zi0utgXIBc4/s400/Archiver_KgbArchiver_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357763422575129746" /&gt;&lt;/a&gt;&lt;br /&gt;KGB Archiver could not extract files encrypted with a 256-bit AES encryption key from a WinZip archive (it kept popping the Password dialog box even after I submitted the correct password; I assume it would work with legacy WinZip encryption). KGB Archiver cannot create a self-extracting executable archive. Command-line execution is available, but offers just basic options. There is no help file. KGB Archiver does not let you make any changes to an existing archive. I am not sure which encryption algorithm the program uses. The wizard does not provide the back button (to go to the initial screen) and the program closes automatically after performing an operation, which I found a bit irritating.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqbvorH1oI/AAAAAAAAAc8/A37PSaCA9PE/s1600-h/Archiver_KgbArchiver_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqbvorH1oI/AAAAAAAAAc8/A37PSaCA9PE/s400/Archiver_KgbArchiver_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357765949385070210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: Limited capabilities, awkward interface, and shaky handling of Unicode files make KGB Archiver a poor choice.&lt;br /&gt;&lt;br /&gt;&lt;a name="PeaZip"&gt;&lt;/a&gt;&lt;a href="http://peazip.sourceforge.net/"&gt;&lt;span style="font-weight:bold;"&gt;PeaZip&lt;/span&gt;&lt;/a&gt; (v. 2.6.2) is another program that uses the 7-Zip engine and therefore suffers from the similar problems with Unicode file names. It's a bit worse, though: when I opened a WinZip archive in PeaZip, it did not show the &lt;span style="font-style:italic;"&gt;Cesaria Evora - Mãe Velha (Old Mother).mp3&lt;/span&gt; file at all (it correctly identified 13 objects in the archive -- 12 files and one folder -- but it only displayed 11 files). In its own archive, it showed that it had changed letter &lt;span style="font-style:italic;"&gt;ã&lt;/span&gt; in the file name to letter &lt;span style="font-style:italic;"&gt;a&lt;/span&gt;, but when I opened this file in WinZip, the file name appeared correctly (go figure!). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/SlqwRZxq4zI/AAAAAAAAAdU/qecMyyLKPaY/s1600-h/Archiver_PeaZip_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 289px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/SlqwRZxq4zI/AAAAAAAAAdU/qecMyyLKPaY/s400/Archiver_PeaZip_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357788519734108978" /&gt;&lt;/a&gt;&lt;br /&gt;The PeaZip's user interface supports several languages (including Russian), but no matter which language I tried, it seemed confusing. It took me a while to figure out how the interface works, and I'm not sure I got it all. It starts in the Browse mode (showing the file system), but then I clicked the &lt;span style="font-style:italic;"&gt;Options&lt;/span&gt; button and the screen switched to the Options mode (the &lt;span style="font-style:italic;"&gt;Options&lt;/span&gt; button transformed to the &lt;span style="font-style:italic;"&gt;&lt;/span&gt;Browse button). The archive creation operation are relatively straight-forward, but if you want to change the default settings, pay attention to non-obvious clues. For example, to archive a folder, you need to click a down arrow next to the &lt;span style="font-style:italic;"&gt;Add file(s)&lt;/span&gt; button, and select the &lt;span style="font-style:italic;"&gt;Add folder&lt;/span&gt; option. When archiving a folder, I did not find any option to show the archived files. PeaZip claims to support creation of self-extracting archives, but I did not try this feature.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/Slqst1rOTnI/AAAAAAAAAdE/Ao04gGR-WVk/s1600-h/Archiver_PeaZip_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 133px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/Slqst1rOTnI/AAAAAAAAAdE/Ao04gGR-WVk/s400/Archiver_PeaZip_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357784610213088882" /&gt;&lt;/a&gt;&lt;br /&gt;I assume that the Layout feature allows making changes in the archive, but I did not understand how to use it. Archiving options support most common capabilities, such as encryption settings, but still, they are a bit confusing (e.g. see the &lt;span style="font-style:italic;"&gt;Encryption&lt;/span&gt; group: the &lt;span style="font-style:italic;"&gt;Encrypt&lt;/span&gt; option include &lt;span style="font-style:italic;"&gt;None&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Content&lt;/span&gt;; how bizarre; why not use a simple check box or radio buttons to indicate whether to encrypt contents or not; also once the archive is created without encryption, how do you encrypt it?). PeaZip comes with a PDF help file, but reading a manual to understand how to use an archiver should not be necessary.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqveTkM4mI/AAAAAAAAAdM/89VVzCoEsxc/s1600-h/Archiver_PeaZip_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 334px;" src="http://2.bp.blogspot.com/_J6q1OqNOB0E/SlqveTkM4mI/AAAAAAAAAdM/89VVzCoEsxc/s400/Archiver_PeaZip_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357787641893675618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: PeaZip has some potential, but in current implementation, it suffers from usability issues and problems related to handling Unicode file names.&lt;br /&gt;&lt;br /&gt;&lt;a name="SecureZip"&gt;&lt;/a&gt;&lt;a href="http://www.pkware.com/software-data-security/free"&gt;&lt;span style="font-weight:bold;"&gt;SecureZIP Express&lt;/span&gt;&lt;/a&gt; (12.30.0016) is a free and somewhat limited version of SecureZIP made by &lt;a href="http://pkware.com/"&gt;PKWare&lt;/a&gt;. It looks more professional than most tools in this review. The interface is simple and intuitive with exception of security settings pertaining to certificates, which will probably confuse most users. SecureZIP Express handled Unicode file names in a WinZip archive well, but it corrupted the notorious &lt;span style="font-style:italic;"&gt;Cesaria Evora - Mãe Velha (Old Mother).mp3&lt;/span&gt; file name (changed letter &lt;span style="font-style:italic;"&gt;ã&lt;/span&gt; to letter &lt;span style="font-style:italic;"&gt;a&lt;/span&gt;). Two other limitations include English-only interface and no support for command-line execution. SecureZIP can create self-extracting archives.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/Slq4wEtOx7I/AAAAAAAAAdc/qgIkKNp4ViY/s1600-h/Archiver_SecureZip.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/Slq4wEtOx7I/AAAAAAAAAdc/qgIkKNp4ViY/s400/Archiver_SecureZip.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357797842747312050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: I really like the SecureZIP interface, but Unicode file name issues tarnish the tool's reputation (if not for the Unicode problem, I would've overlooked lack of language support and no command-line execution).&lt;br /&gt;&lt;br /&gt;&lt;a name="ZipItFree"&gt;&lt;/a&gt;&lt;a href="http://www.zipitfree.com/"&gt;&lt;span style="font-weight:bold;"&gt;ZipItFree&lt;/span&gt;&lt;/a&gt; (v. 2.10) did not have a good start. During installation, it tried to shove the following programs on to my system: My.Freeze Toolbar, Xobni, SmartShopper, WeatherBug, and Zwangi (I declined every one of these). The tool is kind of a pain to use. For example, to create a new archive, I selected an existing file and changed the name, but the tool asked me if I wanted to override the existing file (the file which I selected first). I had to switch folders to clear the file selection or type in the new file name without selecting a file first. ZipItFree offers several skins, but neither of them makes the application look like a typical Windows program. The dialog boxes and other controls in ZipItFree do not behave like standard Windows controls (e.g. Ctrl+A does not select all displayed files). The windows in the dialog boxes are too small and awkward to use. And you need to pay attention to the instructions (e.g. when archiving a folder, I had to drag-and-drop it from one window to another; I first thought that selecting the folder would've been enough). ZipItFree user interface does not support languages other than English, and I did not find any mentioning of command-line execution. On initial run, ZipItFree displayed a small add in the top right corner of the application window, but after I changed the skin, I did not see the ad (not sure if it is permanently gone or will be back). To my surprise, ZipItFree was the only program that did not have any problem with the Unicode file name. It worked with Unicode file names in both the WinZip and its own archive without a hitch. Wow! After so many disappointments, I'm really impressed. Encryption also worked fine between WinZip and ZipItFree. Unfortunately, ZipItFree cannot make a self-extracting archive.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlrFJOMaEUI/AAAAAAAAAdk/xKxh52cDh_w/s1600-h/Archiver_ZipItFree.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SlrFJOMaEUI/AAAAAAAAAdk/xKxh52cDh_w/s400/Archiver_ZipItFree.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357811468930257218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Summary&lt;/span&gt;: I hate the controls, such as file navigation windows, in the ZipItFree user interface, but it appears to be the only free program among the ones I tried that does not have any problems with Unicode file names. If Unicode file name support is important for you, and you understand English, and you do not need a command-line interface or a self-extracting archive, ZipItFree may be a decent option. Just be careful during installation and decline each crapware offer that you do not need.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The bottom line &lt;/span&gt;&lt;br /&gt;In the world of free archivers, there is no perfection. All tools I tried had problems, but some were worse than others. Nevertheless, you should be able to pick a tool that is more appropriate for your job, preferences, and tolerance level, as long as you understand its limitations. &lt;br /&gt;&lt;br /&gt;If you want to add more pros and cons for the tools that I covered or suggest another application, please leave a comment (just make sure that the tool meets my &lt;a href="#Requirements"&gt;requirements&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-16259020646419860?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/16259020646419860/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=16259020646419860" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/16259020646419860?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/16259020646419860?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/0IxxlLX54LM/free-winzip-alternatives.html" title="Free WinZip alternatives" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_J6q1OqNOB0E/SlfP_lH0pdI/AAAAAAAAAb0/tv3eKU1qPR8/s72-c/Archiver_WinZip.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/07/free-winzip-alternatives.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEBSXoyfyp7ImA9WxJUEEw.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1729765615791578587</id><published>2009-07-06T22:42:00.000-07:00</published><updated>2009-07-07T17:40:58.497-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T17:40:58.497-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="technobrief" /><title>Technobrief #8</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Recent findings of software, articles, videos, and more.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Articles&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.martinfowler.com/bliki/CannotMeasureProductivity.html"&gt;Cannot Measure Productivity&lt;/a&gt;&lt;/span&gt; by Martin Fowler&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.websitemagazine.com/content/blogs/posts/pages/emerging-trends-in-web-design.aspx"&gt;Emerging Trends in Web Design&lt;/a&gt;&lt;/span&gt; by Aaron Kupferberg&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.noop.nl/2009/05/social-media-experts-are-poets-software-developers-are-novelists.html"&gt;Social Media Experts Are Poets, Software Developers Are Novelists&lt;/a&gt;&lt;/span&gt; by Jurgen Appelo&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Blogs&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ajaxline.com/"&gt;&lt;span style="font-weight:bold;"&gt;AjaxLine&lt;/span&gt;&lt;/a&gt; (resources for AJAX, jQuery, ASP.NET, and other web technologies)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.freewaremission.com/2009/06/94-great-freeware-programs-for-a-freeware-only-pc/"&gt;94 Great Freeware Programs For A Freeware Only PC&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.noop.nl/2009/06/top-200-blogs-for-developers-q2-2009.html"&gt;&lt;span style="font-weight:bold;"&gt;Top 200 Blogs for Developers&lt;/span&gt; (Q2 2009)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;English&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.anselm.edu/training/styleguide/"&gt;&lt;span style="font-weight:bold;"&gt;Online Style Guide&lt;/span&gt;&lt;/a&gt; by Saint Anslem College:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.anselm.edu/training/styleguide/guidelines.htm"&gt;Overview of Web style guidelines&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.anselm.edu/training/styleguide/webwriting.htm"&gt;Writing for the web&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.anselm.edu/training/styleguide/alphalisting/"&gt;Alphabetical list of style preferences&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Graphics&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.designer-daily.com/15-wonderful-set-of-icons-for-web-design-2191"&gt;&lt;span style="font-weight:bold;"&gt;15 wonderful set of icons for web design&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://iconza.com/"&gt;&lt;span style="font-weight:bold;"&gt;Iconza&lt;/span&gt;&lt;/a&gt; (free customizable icons for a web site)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;jQuery&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/15-resources-to-get-you-started-with-jquery-from-scratch/"&gt;&lt;span style="font-weight:bold;"&gt;15 Resources To Get You Started With jQuery From Scratch&lt;/span&gt;&lt;/a&gt; by by Jeffrey Way&lt;/li&gt;&lt;li&gt;&lt;a href="http://bassistance.de/jquery-plugins/"&gt;&lt;span style="font-weight:bold;"&gt;jQuery plugins&lt;/span&gt;&lt;/a&gt; by Jörn Zaefferer (includes accordion, auto-complete, password validation, tooltip, treeview, and more)&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.jeremymartin.name/2008/02/jtruncate-in-action.html"&gt;&lt;span style="font-weight:bold;"&gt;jTruncate in Action&lt;/span&gt;&lt;/a&gt; by Jeremy Martin (jTruncate is a jQuery plugin that truncates long text entities on a web page)&lt;/li&gt;&lt;li&gt;&lt;a href="http://jqueryvsmootools.com/"&gt;&lt;span style="font-weight:bold;"&gt;jQuery vs MooTools&lt;/span&gt;&lt;/a&gt; by Aaron Newton&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Programming&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://codeclimber.net.nz/archive/2009/06/22/ajax-survey-2009-jquery-and-ms-ajax-are-almost-tied.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Ajax survey 2009&lt;/span&gt;: jQuery and MS Ajax are almost tied among .NET developers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.dmbcllc.com/2009/06/29/hungarian-notation-use-what-works-spit-out-the-bones/"&gt;&lt;span style="font-weight:bold;"&gt;Hungarian Notation – Use What Works Spit Out The Bones&lt;/span&gt;&lt;/a&gt; by Dave&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Quotes&lt;/span&gt;&lt;ul&gt;&lt;li&gt;From &lt;a href="http://www.theregister.co.uk/2009/05/08/dziuba_sphinx/page2.html"&gt;&lt;span style="font-weight:bold;"&gt;Sphinx - text search The Pirate Bay way&lt;/span&gt;&lt;/a&gt; by Ted Dziuba:&lt;blockquote class="quote"&gt;"Before Sphinx, the other option for text search was Apache Solr. Solr, whose name-giver understands that vowels are a scarce resource and must be used sparingly, is a server that sits on top of Lucene. Solr is popular with the enterprise crowd, who love its Java. Being a Java program, Solr includes no shortage of technology whose acronyms contain the letters J and X."&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Software&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.jockersoft.com/english/codecinstaller.php"&gt;CodecInstaller&lt;/a&gt;&lt;/span&gt; detects the installed audio and video codecs, analyzes files to understand which codecs they require, and suggests which codecs need to be installed.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.convertavitomp4.com/"&gt;Convert AVI to MP4&lt;/a&gt;&lt;/span&gt; converts video files from various formats (AVI, DivX, Xvid, WMA, MOV, H.264, MPEG1/MPEG2) to the MP4 (MPEG4) format.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.headbands.com/gspot/"&gt;GSpot&lt;/a&gt;&lt;/span&gt; shows information about video and audion codecs used in a media file.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://sourceforge.net/projects/drvback/"&gt;DriverBackup!&lt;/a&gt;&lt;/span&gt; backs up, restores, and removes drivers.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.annystudio.com/software/jpeglosslessrotator/"&gt;JPEG Lossless Rotator&lt;/a&gt;&lt;/span&gt; rotates JPEG images without re-encoding and loss of quality.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.squared5.com/svideo/mpeg-streamclip-win.html"&gt;MPEG Streamclip&lt;/a&gt;&lt;/span&gt; video converter plays, cuts, copies, pastes, trims, exports, and converts video files (MPEG, VOB, PS, M2P, MOD,VRO, DAT, MOV, DV, AVI, MP4, TS, M2T, MMV, REC, VID, AUD, AVR, VDR, PVR, TP0, M2V, M1V, MPV, AIFF, M1A, MP2, MPA, AC3, and more).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://postbox-inc.com/"&gt;Postbox&lt;/a&gt;&lt;/span&gt; email client offers an alternative to the popular Outlook and Thunderbird.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.roadkil.net/program.php?ProgramID=29"&gt;Roadkil&lt;/a&gt;&lt;/span&gt; recovers files from disks with physical damage (bad sectors, scratches, etc).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.onthegosoft.com/shrink_pic.htm"&gt;Shrink Pic&lt;/a&gt;&lt;/span&gt; automatically reduces the size of photos sent or uploaded toemail, instant messaging, blogging, and web galleries&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.neuber.com/free/svchost-analyzer/index.html"&gt;Svchost Process Analyzer&lt;/a&gt;&lt;/span&gt; lists all svchost instances and checks the services they contain making it easy to uncover worms and viruses, such as Conficker.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.zimbra.com/products/desktop.html"&gt;Zimbra Desktop&lt;/a&gt;&lt;/span&gt; is an email, which can syncs Zimbra, Yahoo! Mail and Gmail email, contacts, and calendars.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.zortam.com/"&gt;Zortam MP3 Media Studio&lt;/a&gt;&lt;/span&gt; includes audio file organizer, ID3 tag editor, CD ripper, WAV/MP3 converter, MP3 volume normalizer, lyrics finder, batch lyrics and cover finder, playlist manager, CD burner, and more.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Videos&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.uie.com/brainsparks/2009/06/01/presentation-revealing-design-treasures-from-the-amazon/"&gt;&lt;span style="font-weight:bold;"&gt;Revealing Design Treasures from the Amazon&lt;/span&gt;&lt;/a&gt; by Jared Spool&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Web design&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.themeforest.net/general/15-css-tricks-that-must-be-learned/"&gt;&lt;span style="font-weight:bold;"&gt;15 CSS Tricks That Must be Learned&lt;/span&gt;&lt;/a&gt; by Drew Douglass&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.themeforest.net/tutorials/common-mistakes-in-web-design/"&gt;&lt;span style="font-weight:bold;"&gt;Common Mistakes in Web Design&lt;/span&gt;&lt;/a&gt; by Marko&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.welie.com/index.php"&gt;&lt;span style="font-weight:bold;"&gt;A Pattern Library for Interaction Design&lt;/span&gt;&lt;/a&gt; by Welie.com&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.themeforest.net/tutorials/visual-hierarchy-in-web-design/"&gt;&lt;span style="font-weight:bold;"&gt;Visual Hierarchy in Web Design&lt;/span&gt;&lt;/a&gt; by Jarel Remick&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cxpartners.co.uk/thoughts/web_forms_design_guidelines_an_eyetracking_study.htm"&gt;&lt;span style="font-weight:bold;"&gt;Web form design guidelines: an eyetracking study&lt;/span&gt;&lt;/a&gt; by Chui Chui Tan&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Web tools&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://colorschemedesigner.com/"&gt;&lt;span style="font-weight:bold;"&gt;Color Scheme Designer&lt;/span&gt;&lt;/a&gt; (page examples are really helpful)&lt;/li&gt;&lt;li&gt;&lt;a href="https://spideroak.com/"&gt;&lt;span style="font-weight:bold;"&gt;SpiderOak&lt;/span&gt;&lt;/a&gt; provides an easy, secure and consolidated free online backup, sync, sharing, access and storage solution for Windows, Mac OS X, and Linux (Ubuntu, Debian &amp; Fedora)&lt;/li&gt;&lt;li&gt;&lt;a href="http://signup.mojohelpdesk.com/signup"&gt;&lt;span style="font-weight:bold;"&gt;Mojo Helpdesk&lt;/span&gt;&lt;/a&gt; centralizes, assigns and tracks organization requests for customer and tech support, internal tasks management, website maintenance, and so on (free edition offers 3 ticket queues and 2 support accounts)&lt;/li&gt;&lt;li&gt;&lt;a href="http://path101.com/"&gt;&lt;span style="font-weight:bold;"&gt;Path 101&lt;/span&gt;&lt;/a&gt; provides free career services including personality test, resume analysis, and career advice&lt;/li&gt;&lt;li&gt;&lt;a href="http://projectlocker.com/"&gt;&lt;span style="font-weight:bold;"&gt;ProjectLocker&lt;/span&gt;&lt;/a&gt; offers source control, defect tracking, document management and other services (free account supports 5 users, 500 MB of space, and unlimited number of projects)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1729765615791578587?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1729765615791578587/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1729765615791578587" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1729765615791578587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1729765615791578587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/yPSs-tAZ0l0/technobrief-8.html" title="Technobrief #8" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/07/technobrief-8.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08DRHg7eCp7ImA9WxNTEU8.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-8906851798175099255</id><published>2009-07-02T12:59:00.000-07:00</published><updated>2009-08-12T17:04:35.600-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T17:04:35.600-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>Essential freeware for Windows</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: List of my favorite freeware tools and utilities.&lt;/div&gt;&lt;br /&gt;The lists of my favorite &lt;a href="http://alekdavis.blogspot.com/2007/05/whats-in-your-toolbox.html"&gt;freeware for regular users&lt;/a&gt; and &lt;a href="http://alekdavis.blogspot.com/2007/07/free-tools-for-windows-application.html"&gt;developers&lt;/a&gt; have been getting out of hand lately, so until I find a better method, I'll use this post to keep track of the FREE Windows tools and utilities that I consider the best for various tasks. &lt;br /&gt;&lt;br /&gt;When assessing the tools, I prefer software that:&lt;ul&gt;&lt;li&gt;is totally free: no shareware, &lt;span style="font-weight:bold;"&gt;not limited to home&lt;/span&gt; use (although, home-use restriction is fine in some cases, such as for anti-virus software);&lt;/li&gt;&lt;li&gt;works across &lt;span style="font-weight:bold;"&gt;corporate firewalls&lt;/span&gt; (for internet connections);&lt;/li&gt;&lt;li&gt;supports &lt;span style="font-weight:bold;"&gt;Unicode&lt;/span&gt; (international character sets);&lt;/li&gt;&lt;li&gt;offers &lt;span style="font-weight:bold;"&gt;multi-lingual interface&lt;/span&gt; (mostly interested in Russian);&lt;/li&gt;&lt;li&gt;comes with an &lt;span style="font-weight:bold;"&gt;installer&lt;/span&gt; (okay, lack of installer will not kill it, but it's really &lt;a href="http://alekdavis.blogspot.com/2008/02/dude-where-is-your-installer.html"&gt;nice to have&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;Here is the list of my favorite freeware:&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Media Players&lt;/center&gt;&lt;br /&gt;&lt;a name="AudioPlayer"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Audio Player&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.aimp.ru/"&gt;AIMP2&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: highly customizable; clean interface; good sound (with enabled equalizer); no ads; Unicode support; multilingual interface; can be minimized to system tray; rips CD tracks to audio files (including MP3); records streaming audio; converts audio files between different formats (MP3, WAV, OGG, WMA, etc); edits ID3 tags (ID3v1, ID3v2, etc). &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: slight startup delay; some customization options are confusing.&lt;br /&gt;&lt;br /&gt;&lt;a name="VideoPlayer"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Video Player&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.kmplayer.com/forums/"&gt;KMPlayer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: comes with internal codecs; plays practically any video format; easy to launch video from a file, folder, or CD/DVD; clean interface; multi-lingual interface; no ads; captures screenshots. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: I noticed subtitles getting out of sync with video a few times (could be a hardware issue); menu is accessed via right mouse click.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Media Editors&lt;/center&gt;&lt;br /&gt;&lt;a name="VideoEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Video Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://fixounet.free.fr/avidemux/"&gt;Avidemux&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: converts between various video formats; instant preview of changes; easy to adjust cropping settings; simple to use filters; color/saturation/brightness adjustment; displays file video/audio encoding data. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: two versions of UI (GTK+ and Qt4) are confusing; toolbar buttons do not show tooltips; terse descriptions of available options and settings.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.virtualdub.org/"&gt;VirtualDub&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="AudioEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Audio Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: many features; easy to use (once you get familiar with the interface); records streaming audio; trims silence; reduces background noise; imports/exports audio files from/to various audio formats; mixes tracks; adds sound effects (bass boost, etc); Unicode support; multilingual interface. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: outdated look; does not come with LAME MP3 encoder (must be &lt;a href="http://alekdavis.blogspot.com/2007/06/mp3-encoding-primer.html#InstallLame"&gt;installed manually&lt;/a&gt;); cannot edit MP3 natively (need re-encoding); some menu options are not standard (e.g. &lt;span style="font-style:italic;"&gt;Edit - Preferences&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a name="AudioTagEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Audio Tag Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.mp3tag.de/en/index.html"&gt;Mp3Tag&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: supports MP3 tags and other metadata (ID3, Vorbis Comments, APE); renames files based on the tag information; supports cover art; works on multiple files; Unicode support; multilingual interface; retrieves metadata from external sources (Amazon, freedb, etc). &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: populating metadata from external sources is a bit awkward.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;MP3 Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="Mp3Splitter"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best MP3 Splitter&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://mpesch3.de1.cc/mp3dc.html"&gt;mp3DirectCut&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: splits, trims, crops audio files; no-destructive cut, copy and paste; automatic track splitting (by timed intervals); keeps ID3 tags. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot adjust interval-based auto-cues to fall on to silent pause. &lt;br /&gt;&lt;br /&gt;&lt;a name="Mp3Merger"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best MP3 Merger&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.makeitone.net/audio/mp3albummaker.htm"&gt;MP3 Album Maker&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: simple operation; reversible merge. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: I haven't used it much, so can't think of any. &lt;br /&gt;&lt;br /&gt;&lt;a name="Mp3VolumeNormalizer"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best MP3 Volume Normalizer&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://mp3gain.sourceforge.net/"&gt;MP3Gain&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: lossless normalization; can be reverted back to the original. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: functionality is a bit confusing; I'm not sure how it handles clipping.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Disk Tools (CD/DVD)&lt;/center&gt;&lt;br /&gt;&lt;a name="DvdRipper"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best DVD Ripper&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.afterdawn.com/software/video_software/dvd_rippers/dvd_shrink.cfm"&gt;DVD Shrink&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: decrypts (breaks copy protection from) many DVDs; removes region code; rips video to an ISO file or VIDEO_TS folder; can compress ripped video to fit on a standard 4.7 GB DVD; allows removing of unnecessary data (audio/video tracks). &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot decrypt some latest DVDs.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://fileforum.betanews.com/detail/DVD-Decrypter/1011845169/1"&gt;DVD Decrypter&lt;/a&gt; (decrypts most DVDs that DVD Shrink cannot); &lt;a href="http://www.dvdfab.com/free.htm"&gt;DVDFab HD Decrypter&lt;/a&gt; (haven't tried, but seems good); &lt;a href="http://amok.am/en/freeware/amok_dvd_shrinker/"&gt;AmoK DVD Shrinker&lt;/a&gt; (does not remove copy protection, but claims to "[shrink] DVDs up to one fifth of the original size without any noticeable quality reduction").&lt;br /&gt;&lt;br /&gt;&lt;a name="DvdMaker"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best DVD Maker&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.microsoft.com/windowsxp/downloads/updates/moviemaker2.mspx"&gt;Windows Movie Maker&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: creates videos and slide shows; unlimited video clips and audio tracks; many transition effects; fades video/audio in/out; clips video/audio; brightness adjustment; some video effects; supports H.264 encoded videos (via ffdshow video decoder); video menu (several themes); video chapters; video preview; supports PAL and NTSC; not very resource hungry; built into Windows; easy to learn; useful help and tutorials. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: supports limited video formats; does not work with QuickTime (MOV) or Flash (FLV) files; few video improvement features (e.g. no exposure, color correction); few audio adjustment features (e.g. no audio normalization); somewhat crippled Vista version; needs &lt;a href="http://www.microsoft.com/windows/windows-vista/features/dvd-maker.aspx"&gt;Windows DVD Maker&lt;/a&gt; to build DVD menus and burn DVDs (Windows DVD Maker is not available in Windows Vista Basic and Business editions).&lt;br /&gt;&lt;br /&gt;&lt;a name="CdDvdBurner"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best CD/DVD Burner&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.imgburn.com/"&gt;ImgBurn&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: creates image file (such as ISO) from a disk (CD/DVD); writes image file to disk; verifies disk readability; compares disk to image file; checks quality of drive and media (requires &lt;a href="http://www.dvdinfopro.com/"&gt;DVDInfoPro&lt;/a&gt;); lots of customization option (burn speed, etc). &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: does not offer a single-step disk copy. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://download.cnet.com/Ashampoo-Burning-Studio-Free/3000-2646_4-10776287.html"&gt;Ashampoo Burning Studio Free 6.76&lt;/a&gt; (also &lt;a href="http://www.blogsdna.com/2376/get-free-ashampoo-burning-studio-2009-full-version.htm"&gt;version 2009&lt;/a&gt;); &lt;a href="http://www.burnaware.com/burnaware_free.html"&gt;BurnAware Free&lt;/a&gt;; &lt;a href="http://www.cdburnerxp.se/"&gt;CDBurnerXP&lt;/a&gt;; &lt;a href="http://www.exactaudiocopy.de/"&gt;Exact Audio Copy&lt;/a&gt;; &lt;a href="http://infrarecorder.org/"&gt;InfraRecorder&lt;/a&gt;; &lt;a href="http://www.rocketdivision.com/starburn.html"&gt;StarBurn Free&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;File Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="FileManager"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best File Manager&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.cubicreality.com/ce/"&gt;Cubic Explorer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: Multi-tab interface; looks clean out of the box; can copy full file path; quick access to favorite folders via bookmarks; natural sort (e.g. 1.txt, 2.txt, 10.txt); file preview panel; built-in text editor; when renaming a file, extension is not selected; multiple skins; file filtering. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot undo (rename, delete, etc); crippled search (cannot search for text in a file); access to remote shares (via UNC path) is slow; does not display folder sizes; limited customization options. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.mustangpeak.net/ultraexplorer.html"&gt;UltraExplorer&lt;/a&gt; (took me some effort to customize to my liking); &lt;a href="http://www.freecommander.com/"&gt;FreeCommander&lt;/a&gt; (GUI is a bit too busy).&lt;br /&gt;&lt;br /&gt;&lt;a name="FileRenamer"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best File Renamer&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.joejoesoft.com/cms/showpage.php?cid=108"&gt;Rename Master&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: file filtering; preview of results; can use file properties (timestamps, audio tags, image tags, etc); scripts for commonly used renaming options; undo changes; integrated explorer. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: GUI is not very polished. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.den4b.com/projects.php"&gt;ReNamer&lt;/a&gt;; &lt;a href="http://myprogramspace.blogspot.com/2008/07/krename-multi-file-rename-tool-v0.html"&gt;Ken Rename&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="FileSync"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best File Synchronization&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="https://www.getdropbox.com/referrals/NTM5Mzc0OQ"&gt;DropBox&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: 2 GB of free space (+ more via referrals); automatic backups; handles corporate firewalls; tracks file changes. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot delete old file revisions; works only with one parent folder; does not seem to work with auto-proxy configuration scripts (need to explicitly define proxy URL). &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.syncplicity.com/"&gt;Syncplicity&lt;/a&gt; (2 GB of free space; can complement DropBox; manages standard folders, such as My Documents; can customize what get synced); &lt;a href="https://spideroak.com/"&gt;SpiderOak&lt;/a&gt; (2 GB of free space).&lt;br /&gt;&lt;br /&gt;&lt;a name="OnlineBackup"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Online Backup&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="https://mozy.com/"&gt;Mozy&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: 2 GB of free space; automatic backups; uses encryption. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: can't say if there are any. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.idrive.com/"&gt;iDrive&lt;/a&gt; (2 GB of free space; similar to Mozy).&lt;br /&gt;&lt;br /&gt;&lt;a name="FileEraser"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best File Eraser&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://eraser.heidi.ie/"&gt;Eraser&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: simple interface; Windows shell integration. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.cylog.org/utilities/cybershredder.jsp"&gt;CyberShredder&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="VirtualDriveMounter"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Virtual Drive Mounter&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://arainia.com/software/gizmo/overview.php?nID=4"&gt;Gizmo Drive&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: supports various image file formats (ISO, BIN, etc); supports encryption; Windows shell integration. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: a bit heavy on pop-ups. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.slysoft.com/en/virtual-clonedrive.html"&gt;Virtual CloneDrive&lt;/a&gt;; &lt;a href="http://www.magiciso.com/tutorials/miso-magicdisc-overview.htm"&gt;MagicISO Virtual CD/DVD-ROM&lt;/a&gt;; &lt;a href="http://www.kernsafe.com/Product.aspx?id=7"&gt;Total Mounter&lt;/a&gt;; &lt;a href="http://www.rocketdivision.com/starburn.html"&gt;StarBurn Free&lt;/a&gt;; &lt;a href="http://www.pismotechnic.com/pfm/"&gt;Pismo File Mount&lt;/a&gt;; &lt;a href="http://www.isodisk.com/"&gt;ISODisk&lt;/a&gt;; &lt;a href="http://wincdemu.sysprogs.org/"&gt;WinCDEmu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Graphics and Photo Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="VectorGraphicsEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Vector Graphics Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: clean interface; standard commands an operations. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: manual does not load; used the program very few times, so can't say much. &lt;br /&gt;&lt;br /&gt;&lt;a name="ImageEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Image Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: feature rich; bit editor; editable text layers; photo enhancing. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: non-standard menu options; some operations are non-intuitive and/or more complex than they should be. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://paint.net/"&gt;Paint.NET&lt;/a&gt; (does not support editable text layers); &lt;a href="http://www.optikvervelabs.com/virtualstudio.asp"&gt;virtualStudio&lt;/a&gt; (has a few nice touches; red-eye correction needs improvement).&lt;br /&gt;&lt;br /&gt;&lt;a name="PhotoCropper"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Photo Cropper&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://ekot.dk/programmer/JPEGCrops/"&gt;JPEGCrops&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: extremely easy to crop for preset sizes (such as 4x6); preview; lossless cropping; batch mode. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;br /&gt;&lt;a name="PhotoResizer"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Photo Resizer&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.fotosizer.com/"&gt;Fotosizer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: simple resizing process for popular formats; batch operation; can lock aspect ratio. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: Image Resizer (part of &lt;a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx"&gt;Microsoft PowerToys for Windows XP&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a name="ScreenCapture"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Screen Capture&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.gadwin.com/printscreen/"&gt;Gadwin PrintScreen 4.4&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: easy to use, no-frills program; can capture mouse cursor. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: no built-in image editor; no annotation capability; does not detect non-rectangular or shaded windows' borders; development work on free version has stopped. &lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Office and Business Apps&lt;/center&gt;&lt;br /&gt;&lt;a name="OfficeSuite"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Office Suite&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: supports Microsoft Office 2007 formats; multi-lingual interface; traditional toolbar (no ribbon); extensions. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: not as feature-rich as Microsoft Office; interface is somewhat outdated. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.softmakeroffice.com/"&gt;SoftMaker Office 2006&lt;/a&gt;; &lt;a href="http://www.go-oo.org/"&gt;GoOo&lt;/a&gt; (based on OpenOffice, but claims to run faster).&lt;br /&gt;&lt;br /&gt;&lt;a name="TextEditor"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Text Editor&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.pspad.com/"&gt;PSPad&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: supports Unicode; multi-lingual interface; built-in spell checker; syntax highlighting (for many programming languages); ability to run external tools (for example, when editing a VBScript file, you can execute it directly from the editor); search and replace options; supports regular expressions (PSPad is the only free text editor among the ones I tried that correctly handled new line and end-of-line replacements); text bookmarking; line numbering; multi-document interface; built-in file explorer; macros; character case change (UPPER/lower/Sentence/etc); text conversion (to/from Base64, URL, quoted printable, decimal/hexadecimal, etc); auto-insert (optional) and finding matching brackets (parentheses); HTML-RTF conversion; column selection mode; HTML preview; HTML document template; option to set as default text editor. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: some menus are not standard (Settings should be under Tools); I wish it could do XSLT previews. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt; (still has problems with regular expression-based search and replace); &lt;a href="http://www.baara.com/q10/"&gt;Q10&lt;/a&gt; (minimalist, full-screen, spell checker, and more).&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;PDF Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="PdfReader"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best PDF Reader&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.docu-track.com/home/prod_user/PDF-XChange_Tools/pdfx_viewer"&gt;PDF-XChange Viewer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: fast; light; fills and saves forms; exports text an images; adds content to PDF files; allows typing over PDF documents. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: does not remember font settings when typing over multiple fields; when printing documents with typed over text, Print Markups in the Print dialog box must be checked (not obvious).&lt;br /&gt;&lt;br /&gt;&lt;a name="PdfWriter"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best PDF Writer&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.primopdf.com/"&gt;Primo PDF&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: converts many file formats to PDF; works as a printer driver; can append and merge PDF documents; works in remote desktop (over terminal session). &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: text quality of the converted PDF file may be worse than original. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.dopdf.com/"&gt;doPDF&lt;/a&gt; (does not work in remote desktop).&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Language Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="Dictionary"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Dictionary&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.lingoes.net/"&gt;Lingoes&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: Dictionary, glossary, and more; translates to/from many languages; pronounces words. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: plugin for PDF files does not work with Adobe Acrobat Reader (but it &lt;a href="http://www.lingoes.net/forum/viewthread.php?tid=182" title="See post #2 by kevin"&gt;works with FREE PDF-XChange Viewer&lt;/a&gt;). &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.answers.com/main/download_answers_win.jsp"&gt;1-Click Answers&lt;/a&gt;; &lt;a href="http://wordweb.info/free/"&gt;WordWeb&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Security Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="AntiVirus"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Anti-Virus&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.avast.com/eng/avast_4_home.html"&gt;Avast! Home Edition&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: light, yet capable; clean interface; multi-lingual interface; anti-spyware; anti-rootkit; automatic updates; resident execution. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: must re-register every year to get virus signature updates. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://free.avg.com/download-avg-anti-virus-free-edition"&gt;AVG Anti-Virus Free Edition&lt;/a&gt;; &lt;a href="http://www.free-av.com/en/download/index.html"&gt;Avira AntiVir Personal&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="PasswordManager"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Password Manager&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="https://lastpass.com/"&gt;LastPass&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: web-based (no need to sync data between multiple computers); integrated with Firefox and IE; form auto-fill; grouping; search; support for custom properties; can import data from other apps (Firefox, KeePass Password Safe, etc); can export data. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: occasional connectivity errors in Firefox (when connection is fine); interface could be more polished; problem logging on to my Live/Bing cashback account (I have several Live/Bing accounts and something just did not work; I had to switch from Firefox to IE and not use LastPass). &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://keepass.info/"&gt;KeePass Password Safe&lt;/a&gt; (for multi-computer synchronization, it can be used along with &lt;a href="#FileSync"&gt;file synchronization tools&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a name="DiskEncryption"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Disk Encryption&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.truecrypt.org/"&gt;TrueCrypt&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: treats a virtual partition (encrypted file) as a disk; works with flash (USB) drives; can encrypt full or part of a disk. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot auto-grow encrypted partition; need to read instructions to understand how to encrypt removable disks (such as flash drives).&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Desktop Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="ScreenSaver"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Screen Saver&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.jessonyip.com/analogy/"&gt;Analogy&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: fascinating; elegant; simple; shows current time. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none. &lt;br /&gt;&lt;br /&gt;&lt;a name="ClipboardManager"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Clipboard Manager&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.joejoesoft.com/cms/showpage.php?cid=97"&gt;ArsClip&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: keeps track of text and image-based clipboard entries; allows pasting plain text by default; single step to access clipboard history menu; permanent items; under active development. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: pops up an occasional error message; McAfee anti-virus occasionally treats it as a trojan. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://bluemars.org/clipx/"&gt;ClipX&lt;/a&gt; (may require a &lt;a href="http://alekdavis.blogspot.com/2007/05/clipx-fix.html" title="ClipX fix"&gt;hack&lt;/a&gt;); &lt;a href="http://ditto-cp.sourceforge.net/"&gt;Ditto&lt;/a&gt; (paste takes one more step than necessary); &lt;a href="http://www.xneat.com/clipboard-manager/index.htm"&gt;xNeat Clipboard Manager&lt;/a&gt; (supports text only); &lt;a href="http://www.nakka.com/soft/clcl/index_eng.html"&gt;CLCL&lt;/a&gt; (hasn't been updated in a while).&lt;br /&gt;&lt;br /&gt;&lt;a name="TaskBarSorter"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Taskbar Sorter&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://nerdcave.webs.com/"&gt;Taskbar Shuffle&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: supports drag-and-drop; light-weight. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;br /&gt;&lt;a name="TaskManager"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Task Manager&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://systemexplorer.mistergroup.org/"&gt;SystemExplorer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: displays full paths of the running processes; shows command-line parameters; checks suspicious processes against the VirusTotal database; passes process information to Process Library; shows network connection information (which processes are connected to which addresses over UDP or TCP/IP); displays startup data (which applications are loaded at start-up); displays list of open files and file owners (which process holds open handle to which file); displays loaded DLLs and their host processes (press CTRL+F and enter the name of a DLL in the SystemExplorer Search window); can export info from every tab; can be configured as a default task manager. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: when configured as default task manager, cannot start Windows Task Manager; cannot show threads per process; Performance window shows a single graph for multi-CPU systems; controls in the Performance window do not get resized correctly. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.anvir.com/taskmanagerfree/"&gt;AnVir Task Manager Free&lt;/a&gt; (shows prompts when new applications are added to Windows startup); &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="ProgramLauncher"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Program Launcher&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.launchy.net/"&gt;Launchy&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: automatically detects new applications; small footprint; clean interface; plugins; skins. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: defining catalog filters is a bit confusing.&lt;br /&gt;&lt;br /&gt;&lt;a name="StickyNotes"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Sticky Notes&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.zhornsoftware.co.uk/stickies/index.html"&gt;Stickies&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: elegant by default; appear on desktop; can auto hide; transparency effects; rich-text support; hyperlink support. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.igorv.com/Content/Applications/StickyNotes.aspx"&gt;Sticky Notes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name="VolumeControl"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Volume Control&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.mkn-software.de/en/software/desktop/volwheel/"&gt;MKN VolWheel&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: controls volume via mouse wheel. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: no option to mute/unmute.&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Communication and Collaboration Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="Chat"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Chat Application&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.google.com/talk/"&gt;Google Talk&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: minimalist (in a good sense); uses Google account info; takes fewer resources than other apps (such as Skype); informs about incoming Gmail messages; can transfer files; works across corporate firewalls; multi-lingual interface. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="https://www.meebo.com/"&gt;Meebo&lt;/a&gt; (web-based, Firefox add-on, and &lt;a href="http://www.meebo.com/notifier/"&gt;Windows app&lt;/a&gt; versions; supports AIM, Yahoo!, Google Talk, MSN, ICQ, and other protocols; consolidates all chat applications and account in one; clean interface).&lt;br /&gt;&lt;br /&gt;&lt;a name="VideoChat"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Video Chat Application&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://skype.com/"&gt;Skype&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: everybody is using it; works well; user discovery. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: annoying sounds (always need to disable); runs at startup by default (always need to disable).&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://mail.google.com/videochat"&gt;Google Video Chat&lt;/a&gt; (I need to give it a try).&lt;br /&gt;&lt;br /&gt;&lt;a name="DesktopSharing"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Desktop Sharing Tool&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.google.com/talk/"&gt;Team Viewer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: easy set up; can run on-demand; authorization is based on session secret (session ID and password); works on Vista; auto-update. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.ammyy.com/en/admin_overview.html"&gt;Ammyy Admin&lt;/a&gt;; &lt;a href="http://www.connect.microsoft.com/content/content.aspx?ContentID=6415&amp;SiteID=94"&gt;Microsoft SharedView&lt;/a&gt; (per &lt;a href="http://www.connect.microsoft.com/content/content.aspx?ContentID=4885&amp;SiteID=94"&gt;Privacy Statement&lt;/a&gt;: &lt;span style="font-style:italic;"&gt;"This Service may only be used within the United States of America"&lt;/span&gt;); Adobe &lt;a href="https://connectnow.acrobat.com/"&gt;ConnectNow&lt;/a&gt; (web-based; no installation; organizer must have an Adobe account, participants do not; max of 2 participants + organizer).&lt;br /&gt;&lt;br /&gt;&lt;center class="bigheading"&gt;Internet Tools&lt;/center&gt;&lt;br /&gt;&lt;a name="RssReader"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best RSS Reader&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;&lt;/span&gt; (web-based)&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: web-based (stays in sync across multiple computers); quick preview of unread posts; mark as favorite; intergated search. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: does not contain all enclosures (e.g. there is no link to comments for the SlickDeals' &lt;a href="http://forums.slickdeals.net/forumdisplay.php?sduid=0&amp;f=9&amp;daysprune=7&amp;icon=0&amp;order=desc&amp;sort=threadstarted"&gt;Hot Deals forum&lt;/a&gt; posts).&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://www.newsgator.com/Individuals/FeedDemon/"&gt;FeedDemon&lt;/a&gt; (some people swear by it).&lt;br /&gt;&lt;br /&gt;&lt;a name="FtpClient"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best FTP Client&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/684"&gt;FireFTP&lt;/a&gt;&lt;/span&gt; (Firefox add-on)&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: light-weight; works across corporate proxy servers; easy to set up. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: none.&lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: &lt;a href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt;; &lt;a href="http://www.net2ftp.com/index.php"&gt;net2ftp&lt;/a&gt; (web-based).&lt;br /&gt;&lt;br /&gt;&lt;a name="PodacastReceiver"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best Podcast Receiver&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="http://juicereceiver.sourceforge.net/"&gt;Juice&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: automatically downloads podcast audio files; easy to set up; multi-lingual interface. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: cannot be minimized on startup; development work seems to be halted.&lt;br /&gt;&lt;br /&gt;If you have suggestions for applications or categories, please leave a comment. &lt;br /&gt;&lt;!--&lt;br /&gt;&lt;a name="NAME"&gt;&lt;/a&gt;&lt;span style="font-variant:small-caps;"&gt;&lt;span style="font-weight:bold;"&gt;Best CATEGORY&lt;/span&gt;&lt;/span&gt;: &lt;span style="font-weight:bold;"&gt;&lt;a href="URL"&gt;TITLE&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Pros&lt;/span&gt;: PROS. &lt;span style="font-style:italic;"&gt;Cons&lt;/span&gt;: CONS. &lt;br /&gt;&lt;span style="font-variant:small-caps;"&gt;Alternatives&lt;/span&gt;: ALTERNATIVES.&lt;br /&gt;--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-8906851798175099255?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/8906851798175099255/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=8906851798175099255" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8906851798175099255?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8906851798175099255?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/iWKgOHHM_E0/essential-freeware-for-windows.html" title="Essential freeware for Windows" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/07/essential-freeware-for-windows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8MRH05eSp7ImA9WxJVEEk.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-6597756610441586219</id><published>2009-06-23T22:21:00.000-07:00</published><updated>2009-06-26T13:24:45.321-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-26T13:24:45.321-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>How to test XSL transformations</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Brief overview of several tools that can be used for testing XSL transformations.&lt;/div&gt;&lt;br /&gt;I recently spent several days redesigning XSL templates that our application uses to generate email messages. To get the job done faster, I needed a FREE tool that would help me edit XML files and test XSL transformations. &lt;span class="sidenote"&gt;[Note: I'm not against commercial software, but I did not want to get into the licensing mess, since other team members would also need to use the tool.]&lt;/span&gt; Microsoft's recommendation to &lt;a href="http://support.microsoft.com/default.aspx/kb/301394"&gt;create an ASP page for testing XSL transformations&lt;/a&gt; seemed like an overkill, so I looked elsewhere.&lt;br /&gt; &lt;br /&gt;Had I checked &lt;a href="http://stackoverflow.com/search?q=xsl+preview"&gt;StackOverflow&lt;/a&gt; earlier, I would've &lt;a href="http://stackoverflow.com/questions/510637/is-there-a-good-tool-for-xsl-previews/1035570#1035570"&gt;learned&lt;/a&gt; that Visual Studio 2008 offered all features I was looking for. Alas, I trusted Google more, so I started by trying out the tools that I found first:&lt;ul&gt;&lt;li&gt;&lt;a href="#XMLNotepad2007"&gt;XML Notepad 2007&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#XmlCopyEditor"&gt;XML Copy Editor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WMHelpXmlPad"&gt;WMHelp XMLPad&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#Xselerator"&gt;Xselerator&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;This is how these tools stacked up for me.&lt;br /&gt;&lt;br /&gt;&lt;a name="XMLNotepad2007"&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628"&gt;XML Notepad 2007&lt;/a&gt;&lt;/span&gt; is a free utility offered by Microsoft. To preview XSL transformations in XML Notepad 2007, you first need to open the XML data file.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/SkFrdyBq3qI/AAAAAAAAAbM/UQafE55iDwA/s1600-h/XmlNotepad2007_Xml.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/SkFrdyBq3qI/AAAAAAAAAbM/UQafE55iDwA/s400/XmlNotepad2007_Xml.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350675991682014882" /&gt;&lt;/a&gt;&lt;br /&gt;Then switch to the &lt;span style="font-style:italic;"&gt;XSL Output&lt;/span&gt; tab, specify the XSLT file, and click the &lt;span style="font-style:italic;"&gt;Transform &lt;/span&gt;button.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkFr2YGqdAI/AAAAAAAAAbU/sDs5dVQwH4Q/s1600-h/XmlNotepad2007_Xsl.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkFr2YGqdAI/AAAAAAAAAbU/sDs5dVQwH4Q/s400/XmlNotepad2007_Xsl.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350676414220366850" /&gt;&lt;/a&gt;&lt;br /&gt;Although, XML Notepad 2007 is great for previewing XSL transformations, it is not very usable for editing XML documents. The editor does not seem to offer an option to edit the source and I found the built-in XML-specific editing features awkward to use. Another limitation of XML Notepad 2007 is that it does not allow opening more than one XML file at a time. It also considers the XML file to be the primary file for the transformation (other tools let you specify the XSL file for the XML file, as well as the XML file for the XSL file).&lt;br /&gt;&lt;br /&gt;&lt;a name="XmlCopyEditor"&gt;&lt;/a&gt;&lt;a href="http://sourceforge.net/projects/xml-copy-editor/"&gt;&lt;span style="font-weight:bold;"&gt;XML Copy Editor&lt;/span&gt;&lt;/a&gt; has been recently updated. I tried version 1.2.0.4 which was released in April 2009.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_J6q1OqNOB0E/SkFvnrSHfHI/AAAAAAAAAbc/DLmDms-iSpc/s1600-h/XmlCopyEditor.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 207px;" src="http://1.bp.blogspot.com/_J6q1OqNOB0E/SkFvnrSHfHI/AAAAAAAAAbc/DLmDms-iSpc/s400/XmlCopyEditor.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5350680559717153906" /&gt;&lt;/a&gt;&lt;br /&gt;XML Copy Editor lets you edit the source of XML/XSL files, but generating previews takes a couple of steps. Once you load the data XML file, select the &lt;span style="font-style:italic;"&gt;XML - XSL Transform&lt;/span&gt; menu option, and the tool will prompt you to enter the location of the XSLT file. After you specify the XSLT file, XML Copy Editor generates a temporary output file, which you can preview in an external browser by clicking the Browser toolbar button. I did not like this multi-step operation and the need to switch between two applications, so I moved on.&lt;br /&gt;&lt;br /&gt;&lt;a name="WMHelpXmlPad"&gt;&lt;/a&gt;&lt;a href="http://www.wmhelp.com/xmlpad3.htm"&gt;&lt;span style="font-weight:bold;"&gt;WMHelp XMLPad&lt;/span&gt;&lt;/a&gt; (v. 3.0.2.1) turned out to be the tool I used most. At first, I could not figure out how to automatically generate HTML preview after transformations (the tool kept opening the source of the transformed XML file). Eventually I determined that I needed to include the &lt;span class="code"&gt;&amp;lt;xsl:output method="html"/&amp;gt;&lt;/span&gt; element in the XSL file and preview started to work. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkGasRCWxuI/AAAAAAAAAbk/zrve8sbiBlA/s1600-h/WMHelpXmlPad_Source.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 356px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkGasRCWxuI/AAAAAAAAAbk/zrve8sbiBlA/s400/WMHelpXmlPad_Source.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5350727917571065570" /&gt;&lt;/a&gt;&lt;br /&gt;To generate the preview, you need to specify the XML file for the open XSL file (there are a few gotchas here), and then simply click the &lt;span style="font-style:italic;"&gt;Debug current stylesheet&lt;/span&gt; toolbar button.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkGbmNhn63I/AAAAAAAAAbs/4nRt_L1uYK4/s1600-h/WMHelpXmlPad_Preview.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 356px;" src="http://3.bp.blogspot.com/_J6q1OqNOB0E/SkGbmNhn63I/AAAAAAAAAbs/4nRt_L1uYK4/s400/WMHelpXmlPad_Preview.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5350728913060883314" /&gt;&lt;/a&gt;&lt;br /&gt;Once the preview tab appears, you can switch between the &lt;span style="font-style:italic;"&gt;Source&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Preview&lt;/span&gt; modes. The tool can also open the preview page in an external browser, but I found the internal preview option more useful. WMHelp XMLPad keeps your options (such as mappings between XSL templates and XML files) in the &lt;span class="code"&gt;styledata.xml&lt;/span&gt; file in the same folder as the XSL files. Although I found WMHelp XMLPad useful (which was before I discovered the capabilities of Visual Studio), it has a decent number of annoyances including the following:&lt;ul&gt;&lt;li&gt;Help page does not work; causes error "Not Found - The requested URL /doc/XmlPad/Welcome.htm was not found on this server."&lt;/li&gt;&lt;li&gt;Text editing features are really crippled. Tabs are not predictable: sometimes pressing &lt;span style="font-style:italic;"&gt;Tab&lt;/span&gt; moves cursor by 8 positions, sometimes it moves by one position; you never know. If you select a block of text and press &lt;span style="font-style:italic;"&gt;Tab&lt;/span&gt;, the selected text will be deleted. &lt;span style="font-style:italic;"&gt;Shift+Tab&lt;/span&gt; (moving selected block to the left) obviously does not work.&lt;/li&gt;&lt;li&gt;The editor lets you place cursor anywhere. For example, you a line is 10 characters long, you can click on position 25 (a typical text editor would not allow this), hit &lt;span style="font-style:italic;"&gt;Enter&lt;/span&gt;, and the editor will insert 15 new space characters at the end of the line.&lt;/li&gt;&lt;li&gt;For some reason the editor leaves a number of blank lines at the end of the document.&lt;/li&gt;&lt;li&gt;I already mentioned the need to define the output method in XSL files to auto-generate HTML previews.&lt;/li&gt;&lt;li&gt;Auto-complete issues. Say you are entering an &lt;span class="code"&gt;&amp;lt;a&amp;gt;&lt;/span&gt; tag in front of the word &lt;span class="code"&gt;link&lt;/span&gt;. The auto-complete feature will turn your text into the following: &lt;span class="code"&gt;&amp;lt;a&amp;gt;&amp;lt;/alink&amp;gt;link&lt;/span&gt;. Also, auto-complete uses the &lt;span style="font-style:italic;"&gt;Enter&lt;/span&gt; key as a selector; pressing &lt;span style="font-style:italic;"&gt;Tab&lt;/span&gt; will just insert a tab character (or whatever space characters the editor decides to use).&lt;/li&gt;&lt;li&gt;Pressing the &lt;span style="font-style:italic;"&gt;Home&lt;/span&gt; key moves the cursor to the beginning of line instead of the first character of text.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-style:italic;"&gt;File - Open&lt;/span&gt; option does not allow opening multiple files (although, you can drag and drop multiple files from Windows Explorer and the editor opens them fine).&lt;/li&gt;&lt;li&gt;You cannot perform searches across multiple files.&lt;/li&gt;&lt;li&gt;A highlighted word does not get automatically entered in the &lt;span style="font-style:italic;"&gt;Search&lt;/span&gt; dialog, so you need to type it in.&lt;/li&gt;&lt;li&gt;To see transformation properties (such as XML source file), the cursor must be moved to the top of the XSL file. The properties also gets disabled if you open a read-only file.&lt;/li&gt;&lt;li&gt;Right-click clears text selection, so you can't copy or cut selected text using a context menu.&lt;/li&gt;&lt;li&gt;Debug toolbar occasionally disappears.&lt;/li&gt;&lt;li&gt;Switching between open files showing transformation previews causes losing the previews.&lt;/li&gt;&lt;li&gt;Changing the source XML file for a template, results in the preview tab displaying XML text instead of the preview.&lt;/li&gt;&lt;li&gt;It would be nice to be able to open a new tab (with an empty document) by double-clicking empty space in the tab area (a'la Firefox).&lt;/li&gt;&lt;li&gt;There are occasional errors (for the most part, the errors are not serious, although once I had to restart the program).&lt;/li&gt;&lt;/ul&gt;Despite all these annoyances, I found WMHelp XMLPad quite useful.&lt;br /&gt;&lt;br /&gt;&lt;a name="Xselerator"&gt;&lt;/a&gt;&lt;a href="http://sourceforge.net/projects/xselerator/"&gt;&lt;span style="font-weight:bold;"&gt;Xselerator&lt;/span&gt;&lt;/a&gt; was the last free XML editor I tried and I did not like it at all. First, it does not have an installer, so I had to go through the motions of creating folders, extracting files, defining shortcuts. Having done this I started the program and immediately encountered an error: "CoCreate failure on IAltovaApplication. Error: Class not registered." Apparently, the tool expects the &lt;a href="http://www.altova.com/altovaxml.html"&gt;AltovaXML&lt;/a&gt; engine to be installed. It would be nice if there were an indication of this requirement somewhere (installer?). The error does not seem to affect functionality, but still... Anyway, some people praise Xselerator, so you may want to give it a try.&lt;br /&gt;&lt;br /&gt;If I am to test any XSL transformations in future, I will probably stick to Visual Studio, but if you're looking for a free alternative, see if any of the applications I described fits your needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-6597756610441586219?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/6597756610441586219/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=6597756610441586219" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6597756610441586219?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6597756610441586219?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/OOWgA8Ihr0w/how-to-test-xsl-transformations.html" title="How to test XSL transformations" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_J6q1OqNOB0E/SkFrdyBq3qI/AAAAAAAAAbM/UQafE55iDwA/s72-c/XmlNotepad2007_Xml.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/06/how-to-test-xsl-transformations.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIHSH48fyp7ImA9WxJWEU4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-2573452959181610570</id><published>2009-06-15T21:38:00.000-07:00</published><updated>2009-06-15T23:08:59.077-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T23:08:59.077-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>My.Utilities Class Library</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Helper utilities library that some .NET developers may appreciate.&lt;/div&gt;&lt;br /&gt;For several years, I have been compiling a library of &lt;span style="font-weight:bold;"&gt;utility/helper classes&lt;/span&gt; reused across multiple projects. You may recognize some of these classes if you read &lt;a href="http://alekdavis.blogspot.com/2007/05/my-articles.html"&gt;my published articles&lt;/a&gt;, but there are several classes that have not been released to the public, yet.&lt;br /&gt;&lt;br /&gt;Here is a brief description of the most useful classes in the library (and there are more):&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;BaseForm&lt;/span&gt;&lt;br /&gt;I derive all my web form classes from this class. This classed extends the functionality of &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx"&gt;System.Web.UI.Page&lt;/a&gt; by offering many handy features, such as easy time localization (automatically converts time from GMT/UTC to local time on the client and vise versa; for additional information read &lt;a href="http://alekdavis.blogspot.com/2007/05/my-articles.html#ItsAboutTime"&gt;&lt;span style="font-style:italic;"&gt;It's About Time&lt;/span&gt;&lt;/a&gt;), invoking JavaScript pop-ups from code-behind, quick enabling/disabling/showing/hiding page controls, setting/getting session parameter in/from a cookie, retrieval of data values from form/query string, deep search for controls, and more.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;AppProcess&lt;/span&gt;&lt;br /&gt;Loads a named assembly from a non-standard path (assuming that you specify alternate paths).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;ExceptionInfo&lt;/span&gt;&lt;br /&gt;Generates formatted error messages for different type of exceptions based on various parameters and exception types, retrieves messages from inner exceptions and database error objects (for additional info, read &lt;a href="http://alekdavis.blogspot.com/2007/05/my-articles.html#DissectingErrorMessages"&gt;&lt;span style="font-style:italic;"&gt;Dissecting Error Messages&lt;/span&gt;&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Helper&lt;/span&gt;&lt;br /&gt;Okay, I agree: this is not a good name... Anyway, this class makes it easy to check for empty objects of different data types. For example, you can check for empty or null array in a single statement (&lt;span class="code"&gt;if (Helper.IsEmpty(myArray)&lt;/span&gt;) instead of having to check for null first, and then for the number of elements in the array.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;WindowsService&lt;/span&gt;&lt;br /&gt;Simplifies implementation of Windows services. Other classes in the same namespace (&lt;span class="code"&gt;My.Utilities.Services&lt;/span&gt;) make it trivial to write periodic tasks (daily, weekly, etc) that Windows services normally perform (for additional info, see &lt;a href="http://alekdavis.blogspot.com/2009/02/windows-services-in-visual-studio-2008.html"&gt;&lt;span style="font-style:italic;"&gt;Implementing Windows services in Visual Studio 2008&lt;/span&gt;&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;DataHelper&lt;/span&gt;&lt;br /&gt;Converts database values to standard .NET types, so you do not have to worry about special handling of &lt;a href="http://msdn.microsoft.com/en-us/library/system.dbnull.aspx"&gt;DBNull&lt;/a&gt; values.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Name&lt;/span&gt;&lt;br /&gt;Makes formatting of people's names based on the available name parts easier, e.g. &lt;span style="font-style:italic;"&gt;John F Kennedy, Jr&lt;/span&gt;; &lt;span style="font-style:italic;"&gt;Kennedy, John F, Jr&lt;/span&gt;; &lt;span style="font-style:italic;"&gt;John F Kennedy&lt;/span&gt;; &lt;span style="font-style:italic;"&gt;Kennedy, John F&lt;/span&gt;; &lt;span style="font-style:italic;"&gt;John Kennedy&lt;/span&gt;; &lt;span style="font-style:italic;"&gt;Kennedy, John&lt;/span&gt;; etc.&lt;/li&gt;&lt;/ul&gt;To see the description of all classes in the library, download the help file:&lt;blockquote&gt;&lt;a href="http://www.box.net/shared/vco9mhxgf1"&gt;&lt;span style="font-weight:bold;"&gt;My.Utilities.chm&lt;/span&gt;&lt;/a&gt;&lt;/blockquote&gt;This help file covers all classes, methods, properties, etc., and even offers a few samples.&lt;br /&gt;&lt;br /&gt;If you are still interested, you can download the library project:&lt;blockquote&gt;&lt;a href="http://www.box.net/shared/dk9vtrx31b"&gt;&lt;span style="font-weight:bold;"&gt;My.Utilities Class Library Project&lt;/span&gt; (Visual Studio 2008)&lt;/a&gt;&lt;/blockquote&gt;Just keep in mind that I started writing this library around 2001/2002, so some functionality could've been improved had the technology -- nullable types, generics, etc. -- been available at the time. Also, the general disclaimer applies: use at your own risk.&lt;br /&gt;&lt;br /&gt;I hope this helps someone, but if you run into any issues, please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-2573452959181610570?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/2573452959181610570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=2573452959181610570" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/2573452959181610570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/2573452959181610570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/4LYW86dRlfE/myutilities-class-library.html" title="My.Utilities Class Library" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/06/myutilities-class-library.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEICRXs4fSp7ImA9WxJTFUg.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-2579691215004013928</id><published>2009-04-23T16:03:00.000-07:00</published><updated>2009-04-23T22:56:04.535-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T22:56:04.535-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="rants" /><title>Security Hall of Shame: Lenovo</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: What is wrong with password rules at Lenovo?&lt;/div&gt;&lt;br /&gt;The winner of today's Security Hall of Shame Award in the category &lt;span style="font-weight:bold;"&gt;Stupid Password Rules&lt;/span&gt; (subcategory: &lt;span style="font-style:italic;"&gt;We want you to think that we support strong passwords, but we don't, ha-ha&lt;/span&gt;) is... &lt;a href="http://www.lenovo.com/"&gt;&lt;span style="font-weight:bold;"&gt;Lenovo&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When you register at Lenovo &lt;a href="http://www.lenovo.com/ibmspp"&gt;IBM Shareholder Purchase Program&lt;/a&gt;, you are not allowed to specify the password (not sure why, but whatever). Once you submit the registration info, you will receive an e-mail with your user name and random password (not that smart to send password along with user name, but whatever). Now the logical step is to change the password to the one you can remember, so you click the My Account link (not easy to find on the page, but whatever), and then click Change Account Information (would be better to separate security info -- user name, password -- from regular account info -- address, phone, etc. -- but whatever). &lt;br /&gt;&lt;br /&gt;Okay, let's change the password. This is not a financial site, so make a new password, which is:&lt;ul&gt;&lt;li&gt;8 characters long, with&lt;/li&gt;&lt;li&gt;upper-case letters,&lt;/li&gt;&lt;li&gt;lower-case letters, and&lt;/li&gt;&lt;li&gt;a number.&lt;/li&gt;&lt;/ul&gt;This should be good enough, so save changes... and... o-ops, error:&lt;blockquote class="quote" style="text-align: center; color: red;"&gt;"The password is too simple. It must contain at least two numbers."&lt;/blockquote&gt;Hmm, among the passwords I use, none of them has two numbers, but let me try this:&lt;ul&gt;&lt;li&gt;9 characters long, with&lt;/li&gt;&lt;li&gt;upper-case letters,&lt;/li&gt;&lt;li&gt;lower-case letters,&lt;/li&gt;&lt;li&gt;a number, and&lt;/li&gt;&lt;li&gt;a special character.&lt;/li&gt;&lt;/ul&gt;This one complies with most password security guidelines, so save changes... and... da-ang:&lt;blockquote class="quote" style="text-align: center; color: red;"&gt;"The password contains special characters. Only letters (a-z) and numbers are allowed."&lt;/blockquote&gt;Hmm, okay let's try this:&lt;ul&gt;&lt;li&gt;hello123&lt;/li&gt;&lt;/ul&gt;Save changes... and... &lt;span style="font-style:italic;"&gt;no hay problema&lt;/span&gt;. Bravo, Lenovo! You know your security.&lt;br /&gt;&lt;br /&gt;Now, kids, remember that Lenovo will lose its Security Hall of Shame Award when it changes password rules to:&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;allow special characters&lt;/span&gt; (such as: +-*#@!~&amp;%), and&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;not require two numbers&lt;/span&gt; (this is not a bad rule, but it's not  common).&lt;/li&gt;&lt;/ol&gt;See also:&lt;br /&gt;&lt;a href="http://www.webopedia.com/TERM/S/strong_password.html"&gt;What is strong password?&lt;/a&gt; by Webopedia&lt;br /&gt;&lt;a href="http://www.microsoft.com/protect/yourself/password/create.mspx"&gt;Strong passwords: How to create and use them&lt;/a&gt; by Microsoft&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-2579691215004013928?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/2579691215004013928/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=2579691215004013928" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/2579691215004013928?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/2579691215004013928?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/H0QrQ_lcBqM/security-hall-of-shame-lenovo.html" title="Security Hall of Shame: Lenovo" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/04/security-hall-of-shame-lenovo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HSHo7eCp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1725330037199986853</id><published>2009-04-22T12:42:00.000-07:00</published><updated>2009-07-07T14:25:39.400-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T14:25:39.400-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="technobrief" /><title>Technobrief #7</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Recent findings of software, articles, tips, podcasts, and more.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Articles&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.summation.net/2009/03/why-hiring-is-paradoxically-harder-in-a-downturn.html"&gt;&lt;span style="font-weight:bold;"&gt;Why hiring is paradoxically harder in a downturn&lt;/span&gt;&lt;/a&gt; by Auren Hoffman&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Books&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.wordplace.com/ap/"&gt;&lt;span style="font-weight:bold;"&gt;Almost Perfect&lt;/span&gt;&lt;/a&gt; by W. E. Peterson (a story of the rise and fall of WordPerfect Corporation from the author's point of view; free online/PDF version)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Browser add-ons, bookmarklets&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://applian.com/asktoolbar/?src=AARMailing"&gt;&lt;span style="font-weight:bold;"&gt;Ask &amp; Record Toolbar&lt;/span&gt;&lt;/a&gt; lets you download, record and convert all kinds of Internet Video and Audio, right from within your browser.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.priceprotectr.com/"&gt;&lt;span style="font-weight:bold;"&gt;PriceProtectr&lt;/span&gt;&lt;/a&gt; browser toolbar helps you monitor prices, keep track of your purchases, and get rebates when prices drop.&lt;/li&gt;&lt;li&gt;&lt;a href="http://lab.arc90.com/experiments/readability/"&gt;&lt;span style="font-weight:bold;"&gt;Readability&lt;/span&gt;&lt;/a&gt; bookmarklet removes clutter around text on web pages making it easier to read.&lt;/li&gt;&lt;li&gt;&lt;a href="http://projects.nikhilk.net/WebDevHelper/"&gt;&lt;span style="font-weight:bold;"&gt;Web Development Helper&lt;/span&gt;&lt;/a&gt; browser extension for Internet Explorer that provides a set of tools and utilities for the AJAX and ASP.NET developers.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Humor&lt;/span&gt;&lt;ul&gt;&lt;li&gt;From &lt;a href="http://www.weblog.keepthejointrunning.com/wordpress/?p=2951"&gt;&lt;span style="font-weight:bold;"&gt;ManagementSpeak&lt;/span&gt;&lt;/a&gt; by Bob Lewis:&lt;blockquote class="quote"&gt;&lt;span style="font-weight:bold;"&gt;ManagementSpeak&lt;/span&gt;: Work space will be designed to create an environment that promotes teamwork and effectiveness, while improving space utilization.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Translation&lt;/span&gt;: We’re going to cram twice as many employees into the same floor space.&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Quotes&lt;/span&gt;&lt;ul&gt;&lt;li&gt;From &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.noop.nl/2009/04/how-to-do-things-your-customer-didnt-ask-for.html"&gt;How to Do Things Your Customer Didn't Ask For&lt;/a&gt;&lt;/span&gt; by Jurgen Appelo:&lt;blockquote class="quote"&gt;"The underpromise, overdeliver principle tells us that we should manage our customer's expectations in such a way that we are able to deliver more than the customer asked for."&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;From &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.joelonsoftware.com/items/2009/03/09.html"&gt;How to be a program manager&lt;/a&gt;&lt;/span&gt; by Joel Spolsky:&lt;blockquote class="quote"&gt;"There are so many development organizations where specs are a monument to mindless bureaucratic paperwork that entire movements sprung up organized around the idea of not writing specs. These people are misguided. Writing a functional specification is at the very heart of agile development, because it lets you iterate rapidly over many possible designs before you write code."&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;From &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.noop.nl/2008/03/make-it-simple.html"&gt;Make It Simple vs. Do It Simple&lt;/a&gt;&lt;/span&gt; by Jurgen Appelo:&lt;blockquote class="quote"&gt;"It's a complicated thing to build stuff that is simple. It's a simple thing to build stuff that is complicated."&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;From &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.weblog.keepthejointrunning.com/wordpress/?p=2937"&gt;Out with objectives, in with technique?&lt;/a&gt;&lt;/span&gt; by Bob Lewis:&lt;blockquote class="quote"&gt;"Measuring employees is a bad idea because employees have a remarkable talent for gaming the system. They can: Work the system so the numbers look good; behave in ways that make the numbers look good while circumstances deteriorate; or just falsify the data outright. I pointed this out once in an executive meeting, and one of the participants recommended firing any employee who would behave this way. Interesting concept, as I was referring to a very large number of American CEOs."&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Software&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://avidemux.sourceforge.net/"&gt;&lt;span style="font-weight:bold;"&gt;Avidemux&lt;/span&gt;&lt;/a&gt; is a free video editor designed for simple cutting, filtering and encoding tasks.&lt;/li&gt;&lt;li&gt;&lt;a href="http://greenshot.sourceforge.net/"&gt;&lt;span style="font-weight:bold;"&gt;Greenshot&lt;/span&gt;&lt;/a&gt; creates screenshots.&lt;/li&gt;&lt;li&gt;&lt;a href="http://myprogramspace.blogspot.com/2008/07/krename-multi-file-rename-tool-v0.html"&gt;&lt;span style="font-weight:bold;"&gt;Ken Rename&lt;/span&gt;&lt;/a&gt; is a capable a multi-file rename utility.&lt;/li&gt;&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx"&gt;&lt;span style="font-weight:bold;"&gt;RichCopy&lt;/span&gt;&lt;/a&gt;  offers comprehensive file copying capabilities.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/seamonster"&gt;&lt;span style="font-weight:bold;"&gt;SEAMonster&lt;/span&gt;&lt;/a&gt; can resize images with minimal pixel loss (see &lt;a href="http://en.wikipedia.org/wiki/Seam_carving"&gt;seam carving&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;a href="http://codestuff.tripod.com/products_starter.html"&gt;&lt;span style="font-weight:bold;"&gt;Starter&lt;/span&gt;&lt;/a&gt; is an application startup manager which also provides extended process info (similar to Task Manager), as well as service and driver manager.&lt;/li&gt;&lt;li&gt;&lt;a href="http://camtech2000.net/Pages/UnlockMe.htm"&gt;&lt;span style="font-weight:bold;"&gt;UnlockMe&lt;/span&gt;&lt;/a&gt; enables you to delete, move or rename files or folders that are temporarily locked by other processes.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Tips&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.makeuseof.com/tag/10-youtube-url-tricks-you-should-know-about/"&gt;&lt;span style="font-weight:bold;"&gt;10 Youtube URL Tricks You Should Know About&lt;/span&gt;&lt;/a&gt; by Varun Kashyap&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2009/04/07/15-essential-checks-before-launching-your-website/"&gt;&lt;span style="font-weight:bold;"&gt;15 Essential Checks Before Launching Your Website&lt;/span&gt;&lt;/a&gt; by Lee Munroe&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Tutorials&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/aspnet/wcfinjavascript.aspx"&gt;&lt;span style="font-weight:bold;"&gt;A beginner’s guide for consuming a WCF service in JavaScript using ASP.NET AJAX&lt;/span&gt;&lt;/a&gt; by R. M. Masudur&lt;/li&gt;&lt;li&gt;&lt;a href="http://boxesandarrows.com/view/interactive/"&gt;&lt;span style="font-weight:bold;"&gt;Interactive Prototypes with PowerPoint&lt;/span&gt;&lt;/a&gt; by Maureen Kelly&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2009/03/31/make-a-mega-drop-down-menu-with-jquery/"&gt;&lt;span style="font-weight:bold;"&gt;Make a Mega Drop-Down Menu with jQuery&lt;/span&gt;&lt;/a&gt; by Raena Jackson-Armitage&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.themeforest.net/screencasts/regular-expressions-for-dummies/"&gt;&lt;span style="font-weight:bold;"&gt;Regular Expressions for Dummies&lt;/span&gt;&lt;/a&gt; by Jeffrey (video tutorial)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Videos/podcasts&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://railsconfeurope.blip.tv/file/1555560/"&gt;Living with legacy software&lt;/a&gt;&lt;/span&gt; by David Heinemeier Hansson (37signals) at RailsConf Europe '08 (also &lt;a href="http://itc.conversationsnetwork.org/shows/detail3987.html" title="IT Conversations: Legacy Software"&gt;podcast&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Web tools&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://alternativeto.net/"&gt;&lt;span style="font-weight:bold;"&gt;AlternativeTo&lt;/span&gt;&lt;/a&gt; suggests alternatives to popular applications.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.anyclient.com/"&gt;&lt;span style="font-weight:bold;"&gt;AnyClient&lt;/span&gt;&lt;/a&gt; is a web-based file transfer application that supports all major file transfer protocols including FTP/S, SFTP and WebDAV/S.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.styleneat.com/"&gt;&lt;span style="font-weight:bold;"&gt;StyleNeat&lt;/span&gt;&lt;/a&gt; organizes and standardizes your CSS in a structure that makes it easier to define page areas and see how they relate to each other.&lt;/li&gt;&lt;li&gt;&lt;a href="http://whenisgood.net/"&gt;&lt;span style="font-weight:bold;"&gt;When is Good&lt;/span&gt;&lt;/a&gt; offers an easy way to find out when everyone is free for your next meeting or event.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1725330037199986853?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1725330037199986853/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1725330037199986853" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1725330037199986853?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1725330037199986853?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/3A-iLFRr1go/technobrief-7.html" title="Technobrief #7" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/04/technobrief-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EFQHk8fyp7ImA9WxJSEE4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1732777448003369977</id><published>2009-04-22T12:34:00.000-07:00</published><updated>2009-04-29T13:06:51.777-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-29T13:06:51.777-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Convert a string to a table in T-SQL</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Transact-SQL function that converts a string of comma-separated numbers to a table of integers.&lt;/div&gt;&lt;br /&gt;Here is a common SQL programming scenario. Your code receives a string holding comma-separated values (CSVs), such as IDs of records stored in a table (say "98,256,17,34"). Now it needs to retrieve these records from the database. How do you do this?&lt;br /&gt;&lt;br /&gt;&lt;div class="sidenote"&gt;[Note: For the sake of simplicity, I use a comma-separated value (CSV) holding numbers, but the string can contain other values, such as dates, or other strings, which can be separated by semicolons or other delimeters.]&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Option #1. Use EXEC (not recommended).&lt;/span&gt;&lt;br /&gt;The obvious option would be to generate a dynamic SQL query and execute it via an EXEC statement. For example, you can do the following:&lt;br /&gt;&lt;pre class="code"&gt;use AdventureWorks&lt;br /&gt;&lt;br /&gt;declare @ProductIDs varchar(256)&lt;br /&gt;declare @Query      varchar(256)&lt;br /&gt;&lt;br /&gt;select @ProductIDs = '1,350,400,440'&lt;br /&gt;&lt;br /&gt;select @Query =&lt;br /&gt;  'select&lt;br /&gt;    ProductID,&lt;br /&gt;    Name,&lt;br /&gt;    ProductNumber&lt;br /&gt;  from&lt;br /&gt;    Production.Product&lt;br /&gt;  where&lt;br /&gt;    ProductID in (' + @ProductIDs + ')'&lt;br /&gt;&lt;br /&gt;exec(@Query)&lt;/pre&gt;There are two &lt;span style="font-weight:bold;"&gt;major problems&lt;/span&gt; with this approach. First, generating the query -- in this example it's a SELECT query, but it can be any query -- as a string will &lt;span style="font-weight:bold;"&gt;degrade readability&lt;/span&gt;: you will lose syntax highlighting and IntelliSense (if you're using a new SQL Server 2008 IntelliSense feature or some other third-party tool, such as &lt;a href="http://www.red-gate.com/Products/SQL_Prompt/"&gt;SQL Prompt&lt;/a&gt;). Second, and even more important, this approach is prone to &lt;a href="http://en.wikipedia.org/wiki/SQL_injection" title="Wikipedia: SQL injection"&gt;SQL injection&lt;/a&gt; &lt;span style="font-weight:bold;"&gt;attack&lt;/span&gt;. Even if you &lt;a href="http://msdn.microsoft.com/en-us/library/ms998271.aspx#paght000002_step2"&gt;use a command parameter&lt;/a&gt; to pass a comma-separated value (CSV) to the stored procedure, since you're simply appending it to dynamic SQL, you must make sure that it does not contain suspicious characters. Whether you do it in T-SQL code or in the application code (C#, or whatever), it's a hassle.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Option #2. Convert string of values to a table of values (recommended).&lt;/span&gt;&lt;br /&gt;A better alternative would be to convert the CSV to a table of numbers (again, I use numbers in this example, but the values can be of any type). You can accomplish this with the help of a user-defined function (UDF), such as this one:&lt;br /&gt;&lt;pre class="code"&gt;CREATE FUNCTION [dbo].[ConvertCsvToNumbers]&lt;br /&gt;(&lt;br /&gt;    @String AS VARCHAR(8000)&lt;br /&gt;)&lt;br /&gt;RETURNS&lt;br /&gt;     @Numbers TABLE (Number INT)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;    SELECT @String = &lt;br /&gt;        LTRIM(&lt;br /&gt;            RTRIM(&lt;br /&gt;                REPLACE(&lt;br /&gt;                    ISNULL(@String, ''), '  ' /* tab */, ' ')))&lt;br /&gt;&lt;br /&gt;    IF (LEN(@String) = 0)&lt;br /&gt;        RETURN&lt;br /&gt;&lt;br /&gt;    DECLARE @StartIdx       INT&lt;br /&gt;    DECLARE @NextIdx        INT&lt;br /&gt;    DECLARE @TokenLength    INT&lt;br /&gt;    DECLARE @Token          VARCHAR(16)&lt;br /&gt;&lt;br /&gt;    SELECT  @StartIdx       = 0&lt;br /&gt;    SELECT  @NextIdx        = 1&lt;br /&gt;&lt;br /&gt;    WHILE @NextIdx &gt; 0&lt;br /&gt;    BEGIN&lt;br /&gt;        SELECT @NextIdx = CHARINDEX(',', @String, @StartIdx + 1)&lt;br /&gt;&lt;br /&gt;        SELECT @TokenLength =&lt;br /&gt;            CASE&lt;br /&gt;                WHEN @NextIdx &gt; 0 THEN @NextIdx&lt;br /&gt;                ELSE LEN(@String) + 1&lt;br /&gt;            END&lt;br /&gt;        - @StartIdx - 1&lt;br /&gt;&lt;br /&gt;        SELECT @Token = &lt;br /&gt;            LTRIM(&lt;br /&gt;                RTRIM(&lt;br /&gt;                    SUBSTRING(@String, @StartIdx + 1, @TokenLength)))&lt;br /&gt;&lt;br /&gt;        IF LEN(@Token) &gt; 0&lt;br /&gt;            INSERT&lt;br /&gt;                @Numbers(Number)&lt;br /&gt;            VALUES&lt;br /&gt;                (CAST(@Token AS INT))&lt;br /&gt;&lt;br /&gt;        SELECT @StartIdx = @NextIdx&lt;br /&gt;    END&lt;br /&gt;    RETURN&lt;br /&gt;END&lt;/pre&gt;Now you can reference this UDF in a query, such as:&lt;br /&gt;&lt;pre class="code"&gt;select&lt;br /&gt;    ProductID,&lt;br /&gt;    Name,&lt;br /&gt;    ProductNumber&lt;br /&gt;from&lt;br /&gt;    Production.Product                   prod,&lt;br /&gt;    dbo.ConvertCsvToNumbers(@ProductIDs) numbers&lt;br /&gt;where&lt;br /&gt;    prod.ProductID = numbers.Number&lt;/pre&gt;In addition to improving readability and security, this method lets you treat data contained in the CSV as a regular table. If you want to try this approach, you can download the script generating the UDF, which is more robust than the listing above (the script sets the permissions and contains code for repeated compilation):&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.box.net/shared/e7ziuy8qaz"&gt;&lt;span style="font-weight:bold;"&gt;Download ConvertCsvToNumbers.sql&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;See also:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998271.aspx"&gt;How To: Protect From SQL Injection in ASP.NET&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1732777448003369977?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1732777448003369977/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1732777448003369977" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1732777448003369977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1732777448003369977?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/phOuBJTA0lE/convert-string-to-table-in-sql.html" title="Convert a string to a table in T-SQL" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/04/convert-string-to-table-in-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYBRH85fCp7ImA9WxVaFE4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-6465035767250059229</id><published>2009-04-10T00:09:00.000-07:00</published><updated>2009-04-10T23:42:35.124-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T23:42:35.124-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Best of MIX09</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: My favorite presentations from the MIX09 conference.&lt;/div&gt;&lt;br /&gt;If you are interested in design and web technologies, but did not have a chance to attend &lt;a href="http://videos.visitmix.com/MIX09/"&gt;MIX09&lt;/a&gt; (the annual Microsoft conference focusing on design and web technologies),  here are some of the free online presentations that I would recommend.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Best talks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you do not have much time, just watch just these two presentations (they both focus on design):&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/C17F"&gt;Web Form Design&lt;/a&gt;&lt;/span&gt; (74:36)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://www.lukew.com/"&gt;Luke Wrobleski&lt;/a&gt;, Senior Director of Product Design, Yahoo!&lt;/span&gt;&lt;br /&gt;This session focuses on the most common design mistakes and introduces 10 best practices for web form design. The presentation covers such topics as form organization, alignment rules, input validation, using help and tips, progress indicators, error reporting, and more.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/C06F"&gt;Ten Ways to Ensure RIA Failure&lt;/a&gt;&lt;/span&gt; (39:34)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://anthonyfranco.wordpress.com/"&gt;Anthony Franco&lt;/a&gt;, President, EffectiveUI&lt;/span&gt;&lt;br /&gt;Great (and short) talk focusing on what NOT to do in web design and development. My favorite points include:&lt;blockquote class="quote"&gt;"If you're looking to fail, trust developers to make good design decisions."&lt;/blockquote&gt;As well as:&lt;blockquote class="quote"&gt;"If you're looking to fail, value the process over the product."&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;The following presentations mostly focus on design, development, deployment, and security:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Design&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/C14F"&gt;Interactive Prototyping with DHTML&lt;/a&gt;&lt;/span&gt; (75:11)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://looksgoodworkswell.blogspot.com/"&gt;Bill Scott&lt;/a&gt;, Director UI Engineering, Netflix&lt;/span&gt;&lt;br /&gt;Bill is a co-author of &lt;a href="http://designingwebinterfaces.com/authors"&gt;Designing Web Interfaces&lt;/a&gt;, an excellent book for web designers and developers. This talk offers many tips and recommendations on prototyping techniques and related topics, such as CSS frameworks. Great references also.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/C10F"&gt;Design Prototyping: Bringing Wireframes to Life&lt;/a&gt;&lt;/span&gt; (59:49)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://danharrelson.com/"&gt;Dan Harrelson&lt;/a&gt;, Senior Technologist, Adaptive Path&lt;/span&gt;&lt;br /&gt;Dan Harrelson explains how to build great prototypes. After watching this presentation, I learned that I could easily created interactive (animated) prototypes in PowerPoint (did you know that?). (Bonus: Dan also published a &lt;a href="http://www.adaptivepath.com/blog/2009/03/24/rapid-prototyping-tools/"&gt;list of prototyping tools&lt;/a&gt;.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T30F"&gt;Advance Your Design with UX Design Patterns&lt;/a&gt;&lt;/span&gt; (69:17)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://blogs.infragistics.com/blogs/ambrose_little/"&gt;Ambrose Little&lt;/a&gt;, User Experience Designer, Infragistics&lt;/span&gt;&lt;br /&gt;Ambrose goes over common UI design patterns. Helpful references include &lt;a href="http://quince.infragistics.com/"&gt;Quince&lt;/a&gt;, a design pattern aggregator.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Development&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T48F"&gt;Microsoft ASP.NET: Taking AJAX to the Next Level&lt;/a&gt;&lt;/span&gt; (70:11)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://stephenwalther.com/blog/"&gt;Stephen Walther&lt;/a&gt;, Senior Program Manager, Microsoft&lt;/span&gt;&lt;br /&gt;As always, Stephen delivers a great talk on ASP.NET AJAX development.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T25F"&gt;Web Development Using Microsoft Visual Studio: Now and in the Future&lt;/a&gt;&lt;/span&gt; (77:07)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by Jeff King, Program Manager (Visual Studio), Microsoft&lt;/span&gt;&lt;br /&gt;Good overview of new features and capabilities of Visual Studio 2010. &lt;a href="http://blogs.iis.net/msdeploy/default.aspx" title="Microsoft Web Deployment Team Blog"&gt;MSDeploy&lt;/a&gt; was new to me (see around 65 min).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T23F"&gt;Choosing between ASP.NET Web Forms and MVC&lt;/a&gt;&lt;/span&gt; (65:34)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://rachelappel.com/"&gt;Rachel Appel&lt;/a&gt;, Wintellect&lt;/span&gt;&lt;br /&gt;This presentation illustrates the differences between two ASP.NET frameworks: Web Forms and &lt;a href="http://www.asp.net/Mvc/"&gt;MVC&lt;/a&gt; (you can skip the first part -- intro and history -- if you're familiar with classic ASP and Web Forms).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T40F"&gt;Building Amazing Business Centric Applications with Microsoft Silverlight 3&lt;/a&gt;&lt;/span&gt; (75:24)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://blogs.msdn.com/BradA/"&gt;Brad Abrams&lt;/a&gt;, Product Unit Manager (Application Framework), Microsoft&lt;/span&gt;&lt;br /&gt;Good demo of Silverlight 3 capabilities appropriate for business app development (no multimedia crap or spinning buttons).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Deployment&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T57F"&gt;Developing and Deploying Applications on Internet Information Services (IIS)&lt;/a&gt;&lt;/span&gt; (72:40)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://blogs.iis.net/thomad/"&gt;Thomas Deml&lt;/a&gt;, Group Program Manager (Web Platform and Tools), Microsoft&lt;/span&gt;&lt;br /&gt;Overview of changes and new capabilities of IIS7 (interesting new deployment techniques: see around 47 min).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight:bold;"&gt;Security&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://videos.visitmix.com/MIX09/T54F"&gt;Securing Web Applications&lt;/a&gt;&lt;/span&gt; (75:30)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;by &lt;a href="http://www.ericlawrence.com/Eric/"&gt;Eric Lawrence&lt;/a&gt;, Security Program Manager (Internet Explorer), Microsoft&lt;/span&gt;&lt;br /&gt;This talk is more about IE 8 features, but it still raises a few interesting points about web application security.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-6465035767250059229?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/6465035767250059229/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=6465035767250059229" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6465035767250059229?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6465035767250059229?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/gl5D0HgQ6L4/best-of-mix09.html" title="Best of MIX09" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/04/best-of-mix09.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ECSXY4eyp7ImA9WxJRGU8.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1386092185551836103</id><published>2009-03-21T20:23:00.000-07:00</published><updated>2009-05-21T09:01:08.833-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-21T09:01:08.833-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="computers" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="web tools" /><title>Managing files and personal information online</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: How to manage documents, photos, music, passwords, e-mails, contacts, personal information, and other files and data.&lt;/div&gt;&lt;br /&gt;Can you relate to the following scenarios?&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;Scenario #1&lt;/span&gt;: You bought a new computer and now you need to &lt;span style="font-weight:bold;"&gt;migrate&lt;/span&gt; your bookmarks, e-mail messages, music, and other important files from your old PC to the new system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario #2&lt;/span&gt;: You are using several computer (like work PC and home PC) and would like to keep some files in &lt;span style="font-weight:bold;"&gt;sync&lt;/span&gt; between them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario #3&lt;/span&gt;: Your hard drive crashed and you haven't backed it up since &lt;a href="http://en.wikipedia.org/wiki/Prohibition_in_the_United_States" title="Wikipedia: Prohibition in the United States"&gt;Prohibition&lt;/a&gt;. Now all of your important &lt;span style="font-weight:bold;"&gt;files&lt;/span&gt;, including your doctoral dissertation, are gone (well, you have a &lt;a href="http://blogs.computerworld.com/never_mind?page=3" title="Computerworld: Never Mind: Unreliable"&gt;backup of your dissertation on a floppy, but it's also corrupted&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario #4&lt;/span&gt;: You backed up your photos to CDs, but you have so many of then that you cannot find your favorite &lt;span style="font-weight:bold;"&gt;photo&lt;/span&gt; of your cat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Scenario #5&lt;/span&gt;: You're losing track of your Internet &lt;span style="font-weight:bold;"&gt;passwords&lt;/span&gt;, usernames, etc.&lt;/blockquote&gt;I can go on, but the point I'm trying to make is: managing personal information (files and data) on multiple computers and avoiding data loss from a hardware crash is not trivial. In this article, I'll explain how (with minimum effort) you can keep your data safe, up-to-date, and accessible. My recommendations are intended for PC users, but some of them can be applicable to Mac and Linux fans, too.&lt;br /&gt;&lt;br /&gt;Before I get to the recommendations, let me emphasize the following: your personal &lt;span style="font-weight:bold;"&gt;computer&lt;/span&gt; -- whether it's running Windows, Mac OS, or Linux -- is &lt;span style="font-weight:bold;"&gt;not reliable&lt;/span&gt;: its hard drive can fail, the operating system can get corrupted (e.g. via a virus), it can get stolen. To avoid data loss with the loss of your computer (or its parts), you must &lt;span style="font-weight:bold;"&gt;keep copies of your data somewhere&lt;/span&gt; else. &lt;br /&gt;&lt;br /&gt;A traditional approach is to back up files to an external drive. Although, it's a praiseworthy strategy, it has several limitations. First, it requires &lt;span style="font-weight:bold;"&gt;additional hardware&lt;/span&gt;. Second, it does not address the issue of &lt;span style="font-weight:bold;"&gt;accessibility&lt;/span&gt; (not a big deal, if you have only one computer, but can be a problem if you want to keep some data in sync between several machines). Third, have you actually &lt;span style="font-weight:bold;"&gt;tried to recover data&lt;/span&gt; from your backup? If you haven't, you may be up to an &lt;a href="http://www.google.com/search?q=cannot+restore+backup" title="Google search results for &amp;quot;cannot restore backup&amp;quot;"&gt;unpleasant surprise&lt;/a&gt;. Finally, most people don't perform regular backups because they consider them a &lt;span style="font-weight:bold;"&gt;hassle&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Whether you regularly back up your hard drive(s) or not, consider an alternative (or complementing) approach: keep &lt;span style="font-weight:bold;"&gt;important data online&lt;/span&gt; using what techies call &lt;span style="font-style:italic;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cloud_computing" title="Wikipedia: Cloud computing"&gt;cloud computing&lt;/a&gt;&lt;/span&gt;. Here is how you can use cloud computing services from reputable providers and software to keep your data safe, manageable, and accessible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Internet bookmarks/favorites&lt;/span&gt;&lt;br /&gt;First a suggestion: do not add every interesting page you find on the Internet to your browser's bookmarks/favorites; only bookmark the sites which you &lt;span style="font-weight:bold;"&gt;visit regularly&lt;/span&gt; (daily, weekly); for everything else use a social bookmarking service such as &lt;a href="http://alekdavis.blogspot.com/2007/10/synchronize-bookmarks-and-favorites.html" title="Good-bye favorites, hello del.icio.us"&gt;&lt;span style="font-weight:bold;"&gt;Delicious&lt;/span&gt;&lt;/a&gt; (or any of the &lt;a href="http://en.wikipedia.org/wiki/List_of_social_software#Social_bookmarking"&gt;alternatives&lt;/a&gt;). If you're not familiar with social bookmarking, watch this short (3:25 min) &lt;a href="http://www.commoncraft.com/bookmarking-plain-english" title="Common Craft: Social Bookmarking in Plain English"&gt;video&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;object type="application/x-shockwave-flash" height="260" width="320" data="http://www.youtube.com/v/x66lV7GOcNU&amp;amp;rel=0" id="VideoPlayback" &gt;      &lt;param name="movie" value="http://www.youtube.com/v/x66lV7GOcNU&amp;amp;rel=0" /&gt;      &lt;param name="allowScriptAcess" value="sameDomain"/&gt;&lt;param name="quality" value="best"/&gt;&lt;param name="bgcolor" value="#FFFFFF"/&gt;&lt;param name="scale" value="noScale"/&gt;&lt;param name="salign" value="TL"/&gt;&lt;param name="FlashVars" value="playerMode=embedded" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;/object&gt;&lt;/center&gt;&lt;br /&gt;&lt;a name="Foxmarks"&gt;&lt;/a&gt;For regular bookmarks/favorites, use the &lt;a href="http://www.foxmarks.com/"&gt;&lt;span style="font-weight:bold;"&gt;Foxmarks&lt;/span&gt;&lt;/a&gt; browser add-on(s), which will keep your bookmarks (and optionally passwords and cookies) in sync between different machines and browsers. Even if you have one computer, Foxmarks can be handy in case you need to rebuild it or reinstall the browser.&lt;br /&gt;&lt;br /&gt;&lt;div class="note"&gt;&lt;span style="font-weight:bold;"&gt;Note&lt;/span&gt;: Foxmarks are currently being ported to &lt;a href="http://www.xmarks.com/"&gt;Xmarks&lt;/a&gt;, which at the time of writing only work with Firefox, but &lt;a href="http://blog.xmarks.com/?p=738" title="Foxmarks is becoming Xmarks"&gt;support for other browsers is coming&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;E-mail/calendar/contacts&lt;/span&gt;&lt;br /&gt;For e-mail needs, I have two words: &lt;span style="font-weight:bold;"&gt;use &lt;a href="http://mail.google.com/mail/"&gt;Gmail&lt;/a&gt;&lt;/span&gt;. Why? First, Gmail is the only service that lets you forward your e-mail to any other address for free. You can forward your messages to your work e-mail, your &lt;a href="http://en.wikipedia.org/wiki/Internet_service_provider" title="Wikipedia: Internet Service Provider"&gt;ISP&lt;/a&gt;'s account, or anywhere else. This way, you will not lose any messages if you switch jobs or ISPs. Second, Gmail's generous storage capacity (currently, over 7 GB) lets you archive important messages without the risk of running out of space. Third, if you do not like the web-based interface, you can &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;answer=75726" title="Supported IMAP client list"&gt;use Gmail with most mail clients&lt;/a&gt; (also see &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;answer=12103" title="Supported POP client list"&gt;these&lt;/a&gt;), such as Microsoft Outlook, Outlook Express, and Mozilla &lt;a href="http://www.mozillamessaging.com/en-US/thunderbird/"&gt;Thunderbird&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;div class="tip"&gt;&lt;span style="font-weight:bold;"&gt;Tip&lt;/span&gt;: If you are using a desktop e-mail client and keep the incoming e-mail in local/personal folders (&lt;a href="http://en.wikipedia.org/wiki/.pst" title="Wikipedia: .pst"&gt;.PST files&lt;/a&gt; in Outlook), you need to back these up.&lt;/div&gt;&lt;br /&gt;&lt;div class="tip"&gt;&lt;span style="font-weight:bold;"&gt;Tip&lt;/span&gt;: If you are not using a desktop e-mail client, you can still &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;answer=10966" title="Making Gmail your default mail application"&gt;set up Gmail as a default mail application&lt;/a&gt; (also see &lt;a href="http://labnol.blogspot.com/2006/09/replace-outlook-with-gmail-as-your.html" title="Replace Outlook With GMail As Your Default Email Program"&gt;other options&lt;/a&gt;).&lt;/div&gt;&lt;br /&gt;Google offers tools to automatically &lt;a href="http://www.google.com/support/calendar/bin/topic.py?topic=15305" title="Sync: Google Calendar Help"&gt;sync your Google &lt;span style="font-weight:bold;"&gt;calendar&lt;/span&gt;&lt;/a&gt; with Microsoft Outlook and mobile devices (BlackBerry, iPhone), but to sync Google &lt;span style="font-weight:bold;"&gt;contacts&lt;/span&gt; (with Outlook), either &lt;a href="http://office.microsoft.com/en-us/outlook/HA102220481033.aspx" title="Transfer contacts between Outlook and Google Gmail"&gt;transfer them manually&lt;/a&gt; or get a commercial tool, such as &lt;a href="http://getkigoo.com/"&gt;kiGoo&lt;/a&gt; (Google &lt;a href="http://googlesystem.blogspot.com/2008/03/google-releases-api-for-contacts.html" title="Google Releases an API for Contacts"&gt;released the Contacts Data API&lt;/a&gt; about a year ago, but I still cannot find a good and free contact syncing tool).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Passwords&lt;/span&gt;&lt;br /&gt;For storing passwords (and other sensitive information, such as user IDs, bank accounts, etc), I can recommend any one of these two options. &lt;span style="font-weight:bold;"&gt;Option 1&lt;/span&gt;: Use the free web-based password manager &lt;a href="https://lastpass.com/"&gt;&lt;span style="font-weight:bold;"&gt;LastPass&lt;/span&gt;&lt;/a&gt; (other alternatives include &lt;a href="http://clipperz.com/"&gt;Clipperz&lt;/a&gt; and &lt;a href="http://passpack.com/"&gt;Passpack&lt;/a&gt;, but &lt;a href="http://www.pcmag.com/article2/0,2817,2343562,00.asp" title="PC Magazine: LastPass 1.50"&gt;LastPass seems to be the most capable&lt;/a&gt;). LastPass can protect your browser passwords better than the browser. It can also auto-populate login forms. When using LastPass along with &lt;a href="#Foxmarks"&gt;Foxmarks&lt;/a&gt;, you may need to disable the Foxmarks' password synchronization feature. &lt;span style="font-weight:bold;"&gt;Option 2&lt;/span&gt;: Use the free &lt;a href="http://alekdavis.blogspot.com/2007/11/freeware-appreciation-day-keepass.html"&gt;&lt;span style="font-weight:bold;"&gt;KeePass&lt;/span&gt;&lt;/a&gt; application and synchronize the KeePass' data file across multiple computers with the help of DropBox or Sincplicity mentioned &lt;a href="#SyncTools"&gt;below&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Photos&lt;/span&gt;&lt;br /&gt;You can use online photo storage to &lt;span style="font-weight:bold;"&gt;back up&lt;/span&gt; your photos and to &lt;span style="font-weight:bold;"&gt;share&lt;/span&gt; them with friends and family. Many sites, including MySpace and Facebook support photo sharing, but most of them are too restrictive: they resize photos, limit the number of photos you can upload, and so on. Among the sites I tried, &lt;a href="http://flickr.com"&gt;&lt;span style="font-weight:bold;"&gt;Flickr&lt;/span&gt;&lt;/a&gt; (now owned by Yahoo!) seems to be the most feature rich: it supports multiple sizes of photos (including original size), photo downloads, slide shows, videos, and more. A free Flickr account imposes &lt;a href="http://www.flickr.com/help/limits/" title="How many photos and videos can I upload for free?"&gt;a few limitations&lt;/a&gt;, but it's still better than most alternatives. After trying a &lt;a href="http://www.flickr.com/upgrade/"&gt;Pro&lt;/a&gt; account, I decided to keep it for $24.95/year ($2/month is not that much for unlimited photo uploads and storage).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Music&lt;/span&gt;&lt;br /&gt;Most sites that let you upload and listen to music, such as &lt;a href="http://deezer.com"&gt;Deezer&lt;/a&gt; and &lt;a href="http://imeem.com/"&gt;Imeem&lt;/a&gt;, do not allow downloading MP3 files (including the ones you uploaded). There are two exceptions: &lt;a href="http://mp3tunes.com/"&gt;&lt;span style="font-weight:bold;"&gt;mp3Tunes&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://tunesbag.com"&gt;&lt;span style="font-weight:bold;"&gt;tunesBag&lt;/span&gt;&lt;/a&gt; (currently in beta). Mp3Tunes gives you &lt;a href="http://support.mp3tunes.com/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;kbarticleid=166&amp;nav=0" title="How much is the MP3tunes Locker service?"&gt;2 GB of online storage&lt;/a&gt; for music and video files; tunesBag &lt;a href="http://tunesbag.com/james/?event=info.service.faq" title="FAQ - Frequently asked questions"&gt;offers at least 5 GB&lt;/a&gt;. I have been using tunesBag for a few months and so far I have few reasons to complain: it lets me back up my music and listen to it from anywhere. I was a bit disappointed with the mp3Tunes' and tunesBag's upload tools intended to automatically keep the local and online audio libraries in sync: neither of them worked for me (well, they worked, but both had bugs that made them useless). Nevertheless, these two sites are worth considering if you are looking for an online storage option for your music files that also allow playback and other listening and sharing features. [UPDATE: I take back my comment about tunesBag's uploader. It works fine, BUT it does not sync files automatically; you need to run the tool manually to upload the files.]&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Software keys&lt;/span&gt;&lt;br /&gt;Use &lt;a href="https://www.keyfiler.com/"&gt;&lt;span style="font-weight:bold;"&gt;Keyfiler&lt;/span&gt;&lt;/a&gt; to store your software &lt;span style="font-weight:bold;"&gt;license&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;registration&lt;/span&gt; info (serial keys, activation keys, etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Documents&lt;/span&gt;&lt;br /&gt;For Microsoft Office users, &lt;a href="http://www.officelive.com/"&gt;&lt;span style="font-weight:bold;"&gt;Office Live Workspace&lt;/span&gt;&lt;/a&gt; allows storing and sharing documents (Word documents, PowerPoint presentations, Excel spreadsheets, etc) online. If you do not use Microsoft Office, you can try switching completely to a web-based office suite, such as &lt;a href="http://docs.google.com/"&gt;&lt;span style="font-weight:bold;"&gt;Google Docs&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://zoho.com"&gt;&lt;span style="font-weight:bold;"&gt;Zoho&lt;/span&gt;&lt;/a&gt;, or &lt;a href="http://product.thinkfree.com/office"&gt;&lt;span style="font-weight:bold;"&gt;ThinkFree&lt;/span&gt;&lt;/a&gt;. If you prefer a free desktop alternative to Microsoft Office, such as &lt;a href="http://www.softmakeroffice.com/"&gt;SoftMaker Office&lt;/a&gt; or &lt;a href="http://opneoffice.org"&gt;OpenOffice.org&lt;/a&gt;, you can back up your documents and synchronize them across multiple computers with the help of file &lt;a href="#SyncTools"&gt;synchronization&lt;/a&gt; and &lt;a href="#BackupTools"&gt;backup&lt;/a&gt; tools.&lt;br /&gt;&lt;br /&gt;&lt;a name="SyncTools"&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Sync tools&lt;/span&gt;&lt;br /&gt;File synchronization tools allow you to duplicate files across multiple computers. Manual file synchronization tools, such as Microsoft &lt;a href="http://www.microsoft.com/prophoto/downloads/synctoybeta.aspx"&gt;SyncToy&lt;/a&gt; that must be launched by the user, are okay for occasional use, but they are not well suited for continuous synchronization. Out of &lt;span style="font-weight:bold;"&gt;automatic file synchronization&lt;/span&gt; services I tried, I liked &lt;span style="font-weight:bold;"&gt;&lt;a href="https://www.getdropbox.com/referrals/NTM5Mzc0OQ"&gt;DropBox&lt;/a&gt;&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;&lt;a href="http://www.syncplicity.com/"&gt;Syncplicity&lt;/a&gt;&lt;/span&gt; most. Both services offer 2 GB of free online storage and they just work: they work on my home laptop as well as my work PC, they work over firewalls and corporate proxy servers, they work on Windows and Mac OS. The only limitations I can think of include relatively high memory footprint (the running process takes about 50 MB of RAM for DropBox and 70 MB for Symplicity). Also DropBox can synchronize only one root folder (which can contain multiple subfolders), while Syncplicity can synchronizes Desktop, Documents, Favorites, Music, and Pictures. I highly recommend DropBox and Symplicity to anyone who wants to synchronize files across multiple machines. There are other file synchronization services, such as &lt;a href="https://www.mesh.com/"&gt;Microsoft Live Mesh&lt;/a&gt; (currently in beta), &lt;a href="https://www.foldershare.com/"&gt;Windows Live FolderShare&lt;/a&gt; (currently transforming into &lt;a href="https://sync.live.com/"&gt;Windows Live Sync&lt;/a&gt;), but I did not have much luck with these (for one, Mesh and Live Sync &lt;a href="http://social.microsoft.com/Forums/en-US/LiveMesh/thread/3b7d2a91-8c03-42a4-881f-37e1eecd310d/"&gt;do not seem to work across corporate firewalls&lt;/a&gt; (also &lt;a href="http://geekswithblogs.net/sdorman/archive/2008/09/18/windows-live-sync.aspx"&gt;here&lt;/a&gt;), and I could not use FolderShare, because our corporate proxy server settings block access to the site); however, they &lt;a href="http://www.labnol.org/internet/compare-windows-live-sync-mesh-and-skydrive/6166/" title="Windows Live Sync vs. Live Mesh vs. SkyDrive: Which is Right for You?"&gt;work for some some users&lt;/a&gt;, so depending on your settings, they may work for you. &lt;br /&gt;&lt;br /&gt;&lt;a name="BackupTools"&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Backup tools&lt;/span&gt;&lt;br /&gt;You can use scheduled backup to save important files online with the help of such services as &lt;a href="https://mozy.com/registration/free"&gt;&lt;span style="font-weight:bold;"&gt;Mozy&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://www.idrive.com/online-backup-features.htm"&gt;&lt;span style="font-weight:bold;"&gt;iDrive&lt;/span&gt;&lt;/a&gt; (either service offers 2 GB of free online storage).&lt;br /&gt;&lt;br /&gt;&lt;a name="OnlineStorage"&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;Online storage&lt;/span&gt;&lt;br /&gt;Finally, for occasions when you just want to save a files or two online once in a while, you can use the following online file storage services:&lt;ul&gt;&lt;li&gt;&lt;a href="https://acrobat.com/"&gt;&lt;span style="font-weight:bold;"&gt;Acrobat&lt;/span&gt;&lt;/a&gt; (5 GB free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://adrive.com"&gt;&lt;span style="font-weight:bold;"&gt;ADrive&lt;/span&gt;&lt;/a&gt; (50 GB free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://box.net"&gt;&lt;span style="font-weight:bold;"&gt;Box.net&lt;/span&gt;&lt;/a&gt; (1 GB free, 10 MB max file size)&lt;/li&gt;&lt;li&gt;&lt;a href="http://mediafire.com"&gt;&lt;span style="font-weight:bold;"&gt;Mediafire&lt;/span&gt;&lt;/a&gt; (unlimited free file storage, 100 MB max file size)&lt;/li&gt;&lt;li&gt;&lt;a href="http://skydrive.live.com/"&gt;&lt;span style="font-weight:bold;"&gt;SkyDrive&lt;/span&gt;&lt;/a&gt; (25 GB free, 50 MB max file size)&lt;/li&gt;&lt;/ul&gt;Here are some references for other free online file hosting services:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.smashingdownloads.com/2008/10/15/28free-file-storage-hosting-websites-something-you-need-to-bookmark/"&gt;28 Free File Storage Hosting Websites&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sizlopedia.com/2009/01/11/free-online-file-hosting-services/"&gt;30+ Free Online File Hosting Services&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Initially, it may take you a bit of effort to follow these recommendations, but once you adopt them, you will make your digital life easier and data safer.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://alekdavis.blogspot.com/2008/09/get-your-new-pc-ready-for-long-run.html"&gt;Prepare your new PC for a long run&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1386092185551836103?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1386092185551836103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1386092185551836103" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1386092185551836103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1386092185551836103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/VOpUJllDUL8/managing-personal-information-and.html" title="Managing files and personal information online" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/managing-personal-information-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMGSH88cSp7ImA9WxVbEE0.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-8722685869763727482</id><published>2009-03-21T19:35:00.000-07:00</published><updated>2009-03-25T10:33:49.179-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T10:33:49.179-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="articles" /><title>Jurgen Appelo on Agile and more</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Some interesting stuff from Jurgen Appelo.&lt;/div&gt;&lt;br /&gt;Jurgen Apello just published a new quarterly list of the &lt;a href="http://www.noop.nl/2009/03/top-100-blogs-for-developers-q1-2009.html"&gt;&lt;strong&gt;Top 100 Blogs for Developers&lt;/strong&gt;&lt;/a&gt;. I'm glad that &lt;a href="http://www.noop.nl/"&gt;Jurgen's own blog&lt;/a&gt; made the list because it's gooood. Here are some quotes from a few recent articles:&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.noop.nl/2008/02/aino-agile-in-n.html"&gt;&lt;span style="font-weight:bold;"&gt;AINO: Agile In Name Only&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"I want to suggest the acronym AINO (Agile In Name Only) for those cases where there is a significant gap between preaching and practising the agile approach."&lt;/blockquote&gt;From &lt;a href="http://www.noop.nl/2009/03/the-complex-manifesto.html"&gt;&lt;span style="font-weight:bold;"&gt;The Complex Manifesto for Software Development&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"I believe it is time for a new manifesto. A manifesto of complexity. With this manifesto we must recognize that it is human to prefer simple solutions, but also that the world is more complex than we think."&lt;/blockquote&gt;From &lt;a href="http://www.noop.nl/2009/02/the-decline-and-fall-of-agilists.html"&gt;&lt;span style="font-weight:bold;"&gt;The Decline and Fall of Agilists&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"Agility is about staying successful in ever-changing environments. That's it. There's nothing more to it. This includes defying any expert who claims that practice X is essential for your organization. Because, quite likely, practice X happens to be something this expert is very good at, and is willing to assist you with, for a considerable consultancy fee."&lt;/blockquote&gt;While we're on the topic of &lt;strong&gt;Agile development&lt;/strong&gt;, here is a very good and brief &lt;a href="http://www.youtube.com/watch?v=6u5PLAL5fh0" title="Scrum And Agile Practices With Jurgen Appelo"&gt;interview with Jurgen Appelo&lt;/a&gt;, where he discuss his experiences of introducing and using Scrum and the curse of dogmatic use of "recipes for success" in software development:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6u5PLAL5fh0&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6u5PLAL5fh0&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;&lt;br /&gt;On a lighter note, here is some &lt;strong&gt;humor&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.noop.nl/2008/04/thank-you-stupi.html"&gt;&lt;span style="font-weight:bold;"&gt;Thank You, Stupid Americans&lt;/span&gt;&lt;/a&gt; (WARNING: If you easily get offended, do not read this piece):&lt;blockquote class="quote"&gt;"Americans are stupid, and I love them for it. Because stupidity leads to simplicity, and simplicity is exactly what we need in software development."&lt;/blockquote&gt;See also:&lt;br /&gt;&lt;a href="http://www.noop.nl/2009/01/100-interview-questions-for-software-developers.html"&gt;100 Interview Questions for Software Developers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-8722685869763727482?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/8722685869763727482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=8722685869763727482" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8722685869763727482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8722685869763727482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/nNKItjfYcbY/jurgen-appelo-on-agile-and-more.html" title="Jurgen Appelo on Agile and more" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/jurgen-appelo-on-agile-and-more.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEARHc6eCp7ImA9WxVUFE4.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-7940670097377743786</id><published>2009-03-18T12:48:00.000-07:00</published><updated>2009-03-18T21:40:45.910-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-18T21:40:45.910-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>Freeware Appreciation Day: Analogy screensaver</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Analogy screensaver is a thing of beauty.&lt;/div&gt;&lt;br /&gt;Today, my small token of &lt;a href="http://alekdavis.blogspot.com/2007/11/freeware-appreciation-day-keepass.html" title="Freeware appreciation day"&gt;appreciation&lt;/a&gt; goes to &lt;a href="http://www.jessonyip.com/analogy/"&gt;&lt;span style="font-weight:bold;"&gt;Analogy screensaver&lt;/span&gt;&lt;/a&gt; written by Jesson Yip (you can see Analogy in action on Jesson's web site).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J6q1OqNOB0E/ScF9IOg80HI/AAAAAAAAAas/7v71V8baaCQ/s1600-h/Analogy.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 314px; height: 314px;" src="http://4.bp.blogspot.com/_J6q1OqNOB0E/ScF9IOg80HI/AAAAAAAAAas/7v71V8baaCQ/s400/Analogy.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5314666615562621042" /&gt;&lt;/a&gt;&lt;br /&gt;Quoting the author:&lt;blockquote class="quote"&gt;"Analogy is a typographic clock which fuses the immediacy of digital with the visual-spatial quality of analogue into a hybrid format. It presents an everyday object with a fresh twist."&lt;/blockquote&gt;Normally, I would not consider a third-party screen saver a necessity, but being a sucker for minimalism and elegance, I just can't keep my eyes off it. Great job Jesson. You deserve a drink. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-7940670097377743786?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/7940670097377743786/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=7940670097377743786" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/7940670097377743786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/7940670097377743786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/Cjd5lYgDhJc/freeware-appreciation-day-analogy.html" title="Freeware Appreciation Day: Analogy screensaver" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_J6q1OqNOB0E/ScF9IOg80HI/AAAAAAAAAas/7v71V8baaCQ/s72-c/Analogy.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/freeware-appreciation-day-analogy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08BRnw8fCp7ImA9WxVUFkQ.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-6857170042326838381</id><published>2009-03-16T12:47:00.000-07:00</published><updated>2009-03-21T20:17:37.274-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-21T20:17:37.274-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Helper VBScript library</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Common utilities for VBScript files.&lt;/div&gt;&lt;br /&gt;I'm not a fan of VBScript, but I have been using it extensively for writing utility scripts. In this post, I want to share one technique that I found helpful when working with VBScript files.&lt;br /&gt;&lt;br /&gt;The scripts I write share many functions, such as processing command-line parameters, connecting to SQL Server, and so on. To make my life easier, I combined these common functions in a reusable helper file. I called this helper file Common.vbs. Here are some of the most helpful functions implemented in Common.vbs:&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GetParamValue&lt;/span&gt;: Returns the value of the specified parameter for a given command-line switch; command-line switches are case insensitive and support name variations, such as "h|help|?" (i.e. &lt;span class="code"&gt;/h&lt;/span&gt;, &lt;span class="code"&gt;/help&lt;/span&gt;, and &lt;span class="code"&gt;/?&lt;/span&gt; are considered identical).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;GetParamValues&lt;/span&gt;: Returns an array of values for the specified command-line parameter (command-line switches use the format &lt;span class="code"&gt;{/|-}switch[:Value1[,Value2[...]]]&lt;/span&gt;, such as &lt;span class="code"&gt;/in:c:\data1.txt,c:\data2.txt&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;GetFile&lt;/span&gt;: Prompts user to select a file using the standard File Open dialog box.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;GetSecretValue&lt;/span&gt;: Prompts user to enter a password (or any other sensitive value) and masks the entered characters.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;RevertToCscript&lt;/span&gt;: Forces script to be run by the CSCRIPT engine (instead of WSCRIPT).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;SqlConnect&lt;/span&gt;: Opens connection to SQL Server via OLE DB provider (supports Windows authentication).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;ExcelConnect&lt;/span&gt;: Opens an ADO database connection to an Excel file.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;GetComError&lt;/span&gt;: Generates formatted error message retrieved from the Err object.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;GetExcelWorksheetName&lt;/span&gt;: Returns the name of the first worksheet in the Excel file.&lt;/li&gt;&lt;/ul&gt;You can find the detailed description of these and other methods in the file comments. Use the following link to get the Common.vbs file:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.box.net/shared/6thrp4zsdy" title="Download from Box.net"&gt;Download Common.vbs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;To reference the Common.vbs file from another script, implement your script as a &lt;a href="http://msdn.microsoft.com/en-us/library/15x4407c.aspx" title="Using Windows Script Files (.wsf)"&gt;Windows Script File (.wsf)&lt;/a&gt;. Unlike regular VBScript (.vbs) files, .wsf files can reference other VBScript files (you must specify the location of the referenced file using either an absolute or relative path). &lt;br /&gt;&lt;br /&gt;To implement a script as a .WSF file, just wrap you VBScript code in XML elements and add a &lt;span class="code"&gt;&amp;lt;script&amp;gt;&lt;/span&gt; element referencing the Common.vbs file, such as:&lt;br /&gt;&lt;pre class="codeblock"&gt;&amp;lt;package&gt;&lt;br /&gt;&amp;lt;job ID="&lt;span style="font-style:italic;"&gt;SomeID&lt;/span&gt;"&amp;gt;&lt;br /&gt;&amp;lt;script Language="VBScript" Src="Common.vbs" /&amp;gt;&lt;br /&gt;&amp;lt;script Type="text/vbscript"&amp;gt;&lt;br /&gt;' Your VBScript logic goes here.&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/job&amp;gt;&lt;br /&gt;&amp;lt;/package&amp;gt;&lt;/pre&gt;You can execute a .wsf file via the CSCRIPT (or WSCRIPT) command as if it were a .vbs file.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/9bbdkx3k(VS.85).aspx"&gt;Windows Script Host&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/t0aew7h6(VS.85).aspx"&gt;VBScript&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-6857170042326838381?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/6857170042326838381/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=6857170042326838381" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6857170042326838381?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6857170042326838381?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/gCQeVCZnq_k/vbscript-helper.html" title="Helper VBScript library" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/vbscript-helper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAGQ3c_fSp7ImA9WxVVEkQ.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-6160168056364632856</id><published>2009-03-05T12:55:00.000-08:00</published><updated>2009-03-05T15:12:02.945-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T15:12:02.945-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="articles" /><title>According to Bob</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Quotes from (and links to) recent articles by Bob Lewis.&lt;/div&gt;&lt;br /&gt;Here are some good quotes from the recent articles by &lt;a href="http://www.issurvivor.com/"&gt;Bob Lewis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.weblog.keepthejointrunning.com/wordpress/?p=2903"&gt;&lt;span style="font-weight:bold;"&gt;Spotting weak managers&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"[B]ad metrics are worse than no metrics: If you have no metrics you’re ignorant and know it. Bad metrics, in contrast, give either the wrong answer to the right question or answer the wrong question."&lt;/blockquote&gt;From &lt;a href="http://www.weblog.keepthejointrunning.com/wordpress/?p=2889"&gt;&lt;span style="font-weight:bold;"&gt;To cut your budget, hire expensive employees&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"You know and I know that any number of mediocre leaders mistake getting along with strong performance, while considering employees who make waves to be undesirable troublemakers. When they have to lay off staff their troublemakers are the first to go; the employees they personally like the best are the ones who get to stick around. That means exceptional IT professionals are pounding the pavement right now, waiting for you to find them."&lt;/blockquote&gt;From &lt;a href="http://www.weblog.keepthejointrunning.com/wordpress/?p=2867"&gt;&lt;span style="font-weight:bold;"&gt;Methodologies are fine, so long as they aren’t processes&lt;/span&gt;&lt;/a&gt;:&lt;blockquote class="quote"&gt;"No, the problem doesn’t lie in the methodologies themselves. It lies in their cooption by those who turn them into religions, complete with orthodoxies, splinter groups, apostasies, and all the other distractions religiosity introduces to prevent potentially productive employees from accomplishing something useful."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-6160168056364632856?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/6160168056364632856/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=6160168056364632856" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6160168056364632856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/6160168056364632856?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/LioUCO9IpT0/according-to-bob.html" title="According to Bob" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/according-to-bob.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HSHo7eip7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-1194832056657118577</id><published>2009-03-02T21:48:00.000-08:00</published><updated>2009-07-07T14:25:39.402-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T14:25:39.402-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="recommendations" /><category scheme="http://www.blogger.com/atom/ns#" term="technobrief" /><title>Technobrief #6</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Recent (and not so recent) discoveries of software, articles, and more.&lt;/div&gt;&lt;br /&gt;I haven't posted latest findings in a while, so here some of the goodies I've found since the &lt;a href="http://alekdavis.blogspot.com/2008/11/technobrief-5.html"&gt;last Technobrief post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.vga.pe.kr/xe/177569"&gt;&lt;span style="font-weight:bold;"&gt;3DP Chip&lt;/span&gt;&lt;/a&gt;: Shows a summary of devices -- CPU, audio card, video card, hard drive, DVD drive, etc. -- installed on the computer along with device drivers.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ammyy.com/en/admin_overview.html"&gt;&lt;strong&gt;Ammyy Admin&lt;/strong&gt;&lt;/a&gt;: Remote computer access and desktop sharing.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jessonyip.com/analogy/"&gt;&lt;span style="font-weight:bold;"&gt;Analogy&lt;/span&gt; (screensaver)&lt;/a&gt;: Typographic clock which fuses the immediacy of digital with the visual-spatial quality of analogue into a hybrid format (beautiful).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.joejoesoft.com/cms/showpage.php?cid=97"&gt;&lt;span style="font-weight:bold;"&gt;ArsClip&lt;/span&gt;&lt;/a&gt;: Windows clipboard manager (good alternative to &lt;a href="http://www.bluemars.org/clipx/"&gt;ClipX&lt;/a&gt; and &lt;a href="http://ditto-cp.sourceforge.net/"&gt;Ditto&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/drvback/"&gt;&lt;span style="font-weight:bold;"&gt;DriverBackup!&lt;/span&gt;&lt;/a&gt;: Backs up and restores drivers.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dvdflick.net/"&gt;&lt;strong&gt;DVD Flick&lt;/strong&gt;&lt;/a&gt;: DVD authoring tool; supports custom audio tracks, subtitles, and navigation menu.&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.videohelp.com/tin2tin/"&gt;&lt;strong&gt;DVD slideshow GUI&lt;/strong&gt;&lt;/a&gt;: Import photos and burn them as a slideshow on a DVD (supports music, transitions, effects, subtitles, and more).&lt;/li&gt;&lt;li&gt;&lt;a href="http://arainia.com/software/gizmo/overview.php?nID=4"&gt;&lt;span style="font-weight:bold;"&gt;Gizmo Drive&lt;/span&gt;&lt;/a&gt;: Mounts ISO, BIN, CUE, and NRG files to a virtual CD-ROM drive.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.inkscape.org"&gt;&lt;span style="font-weight:bold;"&gt;Inkscape&lt;/span&gt;&lt;/a&gt;: Vector graphics editor with capabilities similar to Illustrator, CorelDraw, or Xara X.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ekot.dk/programmer/JPEGCrops/"&gt;&lt;span style="font-weight:bold;"&gt;JPEGCrops&lt;/span&gt;&lt;/a&gt;: Crops images without quality loss (very handy when preparing images for printing, i.e. 4x6 aspect ratio).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jzip.com/"&gt;&lt;strong&gt;jZip&lt;/strong&gt;&lt;/a&gt;: WinZip alternative that supports many compression formats including Zip, TAR, GZip, 7-Zip, RAR, and ISO (think of it as &lt;a href="http://www.7-zip.org/"&gt;7-Zip&lt;/a&gt; with a better GUI supporting different languages).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mkn-software.de/en/software/desktop/volwheel/"&gt;&lt;span style="font-weight:bold;"&gt;MKN VolWheel&lt;/span&gt;&lt;/a&gt;: Changes system volume via the mouse wheel or a hotkey.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cocoonsoftware.com/"&gt;&lt;strong&gt;Quick Media Converter&lt;/strong&gt;&lt;/a&gt;: Converts files between multiple video and audio formats.&lt;/li&gt;&lt;li&gt;&lt;a href="http://luci.criosweb.ro/riot/"&gt;&lt;span style="font-weight:bold;"&gt;RIOT - Radical Image Optimization Tool&lt;/span&gt;&lt;/a&gt;: Resizes and optimizes JPEG, GIF and PNG images in a simple, clean user interface (offers a nice plugin for &lt;a href="http://www.irfanview.com/"&gt;IrfanView&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;a href="http://rocketdock.com/"&gt;&lt;strong&gt;RocketDock&lt;/strong&gt;&lt;/a&gt;: Slick, &lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X_Dock"&gt;Mac OS X Dock&lt;/a&gt;-like program that gives quick access to programs and Windows features (can replace the default Windows Quick Start toolbar).&lt;/li&gt;&lt;li&gt;&lt;a href="http://pgfearo.googlepages.com/"&gt;&lt;span style="font-weight:bold;"&gt;SketchPath&lt;/span&gt;&lt;/a&gt;: XPath editor and XML analysis and testing tool supporting XPath 1.0-2.0, which provides an integrated graphical environment for viewing XML files, developing and testing XPath expressions against them and managing the expressions in file libraries.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.softmakeroffice.com/"&gt;&lt;span style="font-weight:bold;"&gt;SoftMaker Office 2006 for Windows&lt;/span&gt;&lt;/a&gt;: Free alternative to Microsoft Office and OpenOffice.org (it's smaller, and reportedly faster than OpenOffice.org).&lt;/li&gt;&lt;li&gt;&lt;a href="http://tailforwin32.sourceforge.net/"&gt;&lt;strong&gt;Tail for Win32&lt;/strong&gt;&lt;/a&gt;: Windows version of the UNIX 'tail -f' command.&lt;/li&gt;&lt;li&gt;&lt;a href="http://teamviewer.com/"&gt;&lt;strong&gt;TeamViewer&lt;/strong&gt;&lt;/a&gt;: Remote control your partner's PC.&lt;/li&gt;&lt;li&gt;&lt;a href="http://bhandler.spaces.live.com/blog/cns!70F64BC910C9F7F3!1344.entry"&gt;&lt;span style="font-weight:bold;"&gt;Ultimate List of Free Office Software from Microsoft&lt;/span&gt;&lt;/a&gt;: Lists many FREE software titles offered by Microsoft.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.undercoverxp.tk/"&gt;&lt;strong&gt;UndercoverXP&lt;/strong&gt;&lt;/a&gt;: Prints CD and DVD covers.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mediacodec.org/"&gt;&lt;span style="font-weight:bold;"&gt;Windows Essentials Codec Pack&lt;/span&gt;&lt;/a&gt;: One of the most comprehensive collection of media codecs, filters, splitters and other tools that will enable you to play 99% of all the movies, music, and flash files you download off the internet.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Web&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.accessmylibrary.com/"&gt;&lt;strong&gt;AccessMyLibrary&lt;/strong&gt;&lt;/a&gt;: Free access to millions of articles from top publications available at your library.&lt;/li&gt;&lt;li&gt;&lt;a href="http://converter.telerik.com/"&gt;&lt;span style="font-weight:bold;"&gt;Code Converter&lt;/span&gt;&lt;/a&gt;: Translates C# code to VB.NET, and VB.NET to C#.&lt;/li&gt;&lt;li&gt;&lt;a href="http://thumbtack.livelabs.com/"&gt;&lt;span style="font-weight:bold;"&gt;Microsoft Live Labs: Thumbtack&lt;/span&gt;&lt;/a&gt;: Online notes (similar to &lt;a href="http://www.evernote.com"&gt;Evernote&lt;/a&gt; and defunct &lt;a href="http://www.google.com/notebook/"&gt;Google Notebook&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.net2ftp.com/"&gt;&lt;strong&gt;net2ftp&lt;/strong&gt;&lt;/a&gt;: Web-based FTP client.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nregex.com/nregex/"&gt;&lt;strong&gt;Nregex&lt;/strong&gt;&lt;/a&gt;: Online regular expression builder and evaluator (C# syntax).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rexv.org/"&gt;&lt;strong&gt;Rex V&lt;/strong&gt;&lt;/a&gt;: AJAX regular expression evaluator (JavaScript, PHP syntax).&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Articles&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/items/2008/12/10.html"&gt;&lt;span style="font-weight:bold;"&gt;Amnesia&lt;/span&gt;&lt;/a&gt;: Joel Spolsky writes about effects of short-term memory on project management.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pcmag.com/article2/0,2817,2331278,00.asp"&gt;&lt;span style="font-weight:bold;"&gt;Firefox 3: 8 Things You Didn't Know You Could Do&lt;/span&gt;&lt;/a&gt;: Logan Kugler shares several Firefox usage tips.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Firefox add-ons&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3863"&gt;&lt;strong&gt;iMacros for Firefox&lt;/strong&gt;&lt;/a&gt;: Records and replays repetitive tasks like filling out forms.&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/9603"&gt;&lt;strong&gt;FireRainbow&lt;/strong&gt;&lt;/a&gt;: Javascript syntax highlighting for the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt; add-on.&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/125"&gt;&lt;strong&gt;SwitchProxy Tool&lt;/strong&gt;&lt;/a&gt;: Easily switches proxy settings.&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5369"&gt;&lt;strong&gt;YSlow&lt;/strong&gt;&lt;/a&gt;: Analyzes web pages and tells you why they're slow based on Yahoo's rules for high performance web sites.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://reference.sitepoint.com/css"&gt;&lt;span style="font-weight:bold;"&gt;CSS Reference&lt;/span&gt;&lt;/a&gt; by SitePoint&lt;/li&gt;&lt;li&gt;&lt;a href="http://reference.sitepoint.com/html"&gt;&lt;span style="font-weight:bold;"&gt;HTML Reference&lt;/span&gt;&lt;/a&gt; by SitePoint&lt;/li&gt;&lt;li&gt;&lt;a href="http://reference.sitepoint.com/javascript"&gt;&lt;span style="font-weight:bold;"&gt;JavaScript Reference&lt;/span&gt;&lt;/a&gt; by SitePoint&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Tutorials&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.sitepoint.com/newsletter/viewissue.php?id=3&amp;issue=216#5"&gt;&lt;span style="font-weight:bold;"&gt;6 Steps to Professional Podcast Publishing&lt;/span&gt;&lt;/a&gt;: Kevin Yank describes steps for podcast publishing.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.goingmanual.com/photo/tutorial_index.php"&gt;&lt;strong&gt;GoingManual.com&lt;/strong&gt;&lt;/a&gt;: Tutorials on photography, Adobe &lt;a href="http://www.adobe.com/products/photoshop/photoshop/"&gt;Photoshop&lt;/a&gt;, and &lt;a href="http://www.gimp.org/" title="GNU Image Manipulation Program"&gt;GIMP&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/install/WixSharpArticle.aspx"&gt;&lt;span style="font-weight:bold;"&gt;Wix# (WixSharp) - Managed Interface for WiX&lt;/span&gt;&lt;/a&gt;: Oleg Shilo explains how to build application installers (MSI packages) using his Wix# program.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Photos&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://picasaweb.google.com/spolsky/FogCreekSNewOffice"&gt;&lt;span style="font-weight:bold;"&gt;Fog Creek's New Office&lt;/span&gt;&lt;/a&gt;: Sneak peek at an ideal office space.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-1194832056657118577?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/1194832056657118577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=1194832056657118577" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1194832056657118577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/1194832056657118577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/BnbcAPd4WZ4/technobrief-6.html" title="Technobrief #6" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/03/technobrief-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4AQng-eyp7ImA9WxVWGEo.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-8760780040761414552</id><published>2009-02-27T20:51:00.000-08:00</published><updated>2009-02-28T18:19:03.653-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-28T18:19:03.653-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>From nDoc to Sandcastle</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: A new old way to generate documentation (help) files for .NET 2.0+ applications.&lt;/div&gt;&lt;br /&gt;I owe Kevin Downs, the author of &lt;a href="http://ndoc.sourceforge.net/" title="SourceForge: nDoc Online"&gt;&lt;span style="font-weight:bold;"&gt;nDoc&lt;/span&gt;&lt;/a&gt;, a long delayed apology (nDoc is a popular open-source help file generator designed for .NET 1.x apps). Although I used nDoc extensively (in fact, it was one of my favorite development tools), I did not contribute to the project. The &lt;a href="http://www.charliedigital.com/PermaLink,guid,95b2ab68-ba92-413a-b758-2783cde5df9c.aspx" title="nDoc 2 is officially dead"&gt;nDoc project died in mid-2006&lt;/a&gt; and it was partially my fault. I'm sorry Kevin. Shame on me: I should've started celebrating &lt;a href="http://alekdavis.blogspot.com/2007/11/freeware-appreciation-day-keepass.html"&gt;Freeware Appreciation Day&lt;/a&gt; earlier.&lt;br /&gt;&lt;br /&gt;&lt;div class="sidenote"&gt;[Not to shift the blame, but the role of Microsoft in the nDoc demise was hardly praise-worthy. I never understood Microsoft's approach to successful applications complementing -- notice, not competing with -- Microsoft technologies and tools: announce an alternative solution,  overpromise, and underdeliver. Why wouldn't Microsoft cooperate with the authors of these applications in some way. I totally agree with &lt;a href="http://www.hanselman.com/blog/SandcastleMicrosoftCTPOfAHelpCHMFileGeneratorOnTheTailsOfTheDeathOfNDoc.aspx" title="Sandcastle - Microsoft CTP of a Help CHM file generator on the tails of the death of NDoc"&gt;Scott Hanselman's point&lt;/a&gt;:&lt;blockquote class="quote"&gt;"It's a shame that Microsoft can't put together an organization like INETA (who already gives small stipends to folks to speak at User Groups) and gave away grants/stipends to the 20 or so .NET Open Source Projects that TRULY make a difference in measurable ways. The whole thing could be managed out of the existing INETA organization and wouldn't cost more than a few hundred grand - the price of maybe 3-4 Microsoft Engineers."&lt;/blockquote&gt;Microsoft should've known better.]&lt;/div&gt;Well, life went on and I needed an nDoc replacement, which would work with .NET 2.0+ apps. So I tried &lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt;, the Microsoft-sponsored open-source alternative to nDoc, and to my surprise, it worked reasonably well. There was a couple of problems, though.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problem #1&lt;/span&gt;: Sandcastle failed to convert a working nDoc project with error:&lt;blockquote class="quote"&gt;"Unable to convert project. Reason: Error CVT0005: Error reading project from 'C:\[...]\[...].ndoc' (last property = DocumentInheritedMembers): String was not recognized as a valid Boolean."&lt;/blockquote&gt;I posted this problem at the CodePlex Issue Tracker not expecting it to be noticed, but received a response on the same day. Since it was easy enough for me to create a new project, I did not use the suggestion, but if you encounter a similar issue, check out the replies to the &lt;a href="http://www.codeplex.com/SandcastleStyles/WorkItem/View.aspx?WorkItemId=7154"&gt;&lt;span style="font-style:italic;"&gt;Error CVT0005 converting nDoc project&lt;/span&gt;&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Problem #2&lt;/span&gt;: My first attempt to compile the project failed with error:&lt;blockquote class="quote"&gt;"The imported project "C:\SandcastleHelpFileBuilder.targets" was not found."&lt;/blockquote&gt;After some poking around, I figured out that the environment variable &lt;span class="code"&gt;SHFBROOT&lt;/span&gt; used by the help compiler did not take effect after installation. To fix it, I had to log off and log on to Windows.&lt;br /&gt;&lt;br /&gt;After that everything worked well. You can see an example of the Sandcastle project and the generated help file in the &lt;a href="http://alekdavis.blogspot.com/2009/02/windows-services-in-visual-studio-2008.html#DownloadWinServiceDemo"&gt;Windows service demo project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you want to generate documentation from the XML comments in your Visual Studio 2005 (and later) projects, you need to do the following:&lt;ol&gt;&lt;li&gt;Make sure that &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc" title="Download HTML Help Workshop and Documentation"&gt;HTML Help Workshop&lt;/a&gt; is installed.&lt;/li&gt;&lt;li&gt;Install the main &lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; app.&lt;/li&gt;&lt;li&gt;Install &lt;a href="http://shfb.codeplex.com/"&gt;Sandcastle Help File Builder (SHFB)&lt;/a&gt; (a GUI app used for building help files).&lt;/li&gt;&lt;li&gt;Create a new project and add your Visual Studio 2005 (or later) project, solution, or output (DLL or EXE) file to the SHFB's documentation sources.&lt;/li&gt;&lt;li&gt;Define other project properties and build the project.&lt;/li&gt;&lt;/ol&gt;I specified the HTML Help Workshop location in the Sandacastle settings, but this may not have been necessary. I also used Sandcastle to build HTML Help 1.x (.CHM) files, so I'm not sure how it works for HTML Help 2.x (.HxS) files. &lt;br /&gt;&lt;br /&gt;If you are not sure about particular settings, check the provided help file or &lt;a href="http://www.ewoodruff.us/shfbdocs/Index.aspx?topic=html/8e3f8757-0ef3-4772-bb2f-5d7ae57e50da.htm"&gt;Sandcastle Help File Builder Overview&lt;/a&gt;. You can find a number of related projects -- such as &lt;a href="http://docproject.codeplex.com/"&gt;DocProject for Sandcastle&lt;/a&gt;, &lt;a href="http://sandextensions.codeplex.com/"&gt;Sandcastle Extensions&lt;/a&gt;, and others -- at CodePlex, but I haven't tried them. For the latest news, check the &lt;a href="http://blogs.msdn.com/sandcastle/"&gt;Sandcastle blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://davidhayden.com/blog/dave/archive/2006/08/20/GenerateMSDNStyleDocumentationSandcastle.aspx"&gt;NDoc to Sandcastle - Generate MSDN Style Documentation and Help Files Based on XML Comments in your .NET Code&lt;/a&gt; by David Hayden&lt;br /&gt;&lt;a href="http://www.theserverside.net/news/thread.tss?thread_id=41569"&gt;Microsoft's Sandcastle emerges as NDoc's creator calls it quits&lt;/a&gt; by Brian Eastwood&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-8760780040761414552?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/8760780040761414552/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=8760780040761414552" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8760780040761414552?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8760780040761414552?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/ShhGEwwoP9Q/from-ndoc-to-sandcastle.html" title="From nDoc to Sandcastle" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/02/from-ndoc-to-sandcastle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ARXs5eCp7ImA9WxJbEEs.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-5481492481779624380</id><published>2009-02-24T20:00:00.000-08:00</published><updated>2009-07-19T20:34:04.520-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-19T20:34:04.520-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="technologies" /><title>ASP.NET AJAX and jQuery</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Brief of the talk and presentation given to Sacramento .NET User Group, plus links to shared resources.&lt;/div&gt;&lt;br /&gt;Thanks to all who attended my &lt;a href="http://www.sacnetug.org/archives/022409_1.htm"&gt;talk at Sacramento .NET User Group&lt;/a&gt; on Tuesday. In case you did not attend the event, the discussion focused on developing intranet applications using ASP.NET AJAX and jQuery. We covered the following topics:&lt;ul&gt;&lt;li&gt;Pros and cons of different technologies for building rich internet applications (RIA)&lt;/li&gt;&lt;li&gt;Introduction to ASP.NET AJAX and jQuery&lt;/li&gt;&lt;li&gt;ASP.NET UpdatePanel and UpdateProgress controls&lt;/li&gt;&lt;li&gt;Using UpdatePanel with data-bound controls (such as Repeater)&lt;/li&gt;&lt;li&gt;Pros and cons of using UpdatePanel with jQuery (and other alternatives)&lt;/li&gt;&lt;li&gt;Adding AJAX and jQuery to an ASP.NET applications (walkthrough)&lt;/li&gt;&lt;li&gt;Common problems and solutions for applications using ASP.NET AJAX, UpdatePanels, and jQuery&lt;/li&gt;&lt;li&gt;Demos and references (tools, tutorials, videos, and more)&lt;/li&gt;&lt;/ul&gt;I uploaded the &lt;span style="font-weight:bold;"&gt;presentation&lt;/span&gt; to &lt;a href="http://www.docstoc.com/docs/5169680/Building-intranet-applications-with-ASPNET-AJAX-and-jQuery" title="View slides at Docstoc"&gt;Docstoc&lt;/a&gt; (see the slides below).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center; width=100%;"&gt;&lt;embed id="_ds_5169680" name="_ds_5169680" type="application/x-shockwave-flash" width="100%" height="500" src="http://viewer.docstoc.com/" + FlashVars="doc_id=5169680&amp;mem_id=687922&amp;doc_type=ppt&amp;fullscreen=0" allowScriptAccess="always" allowFullScreen="true"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;br /&gt;You can &lt;a href="http://www.box.net/shared/9kmkzeld2z" title="Download &amp;quot;Building intranet applications with ASP.NET AJAX and jQuery&amp;quot; from Box.net"&gt;download the &lt;span style="font-weight:bold;"&gt;original PowerPoint slides&lt;/span&gt;&lt;/a&gt; from Box.net.&lt;br /&gt;&lt;br /&gt;To run the &lt;span style="font-weight:bold;"&gt;demo project&lt;/span&gt;, &lt;a href="http://www.box.net/shared/k6tuxdqp4j"&gt;download the ZIP file&lt;/a&gt; containing the Visual Studio 2008 solution, extract the files, and open the solution (you will be prompted to create a virtual directory for the project).&lt;br /&gt;&lt;br /&gt;&lt;div class="update"&gt;&lt;span style="font-weight:bold;"&gt;UPDATE&lt;/span&gt;: The following article by Dave Ward explains the idiosyncrasy that I mentioned in the presentation (firing multiple events after partial postback) and offers ways to mitigate the problem (I will update the presentation and sample):&lt;ul&gt;&lt;li&gt;&lt;a href="http://encosia.com/2009/03/25/document-ready-and-pageload-are-not-the-same/"&gt;$(document).ready() and pageLoad() are not the same!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Thanks, Dave!&lt;/div&gt;&lt;br /&gt;Here are some additional references that did not make into presentation but you may find useful:&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/dd453033.aspx"&gt;Explore Rich Client Scripting With jQuery, Part 1&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd569752.aspx"&gt;Part 2&lt;/a&gt; by Dino Esposito&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bennadel.com/resources/presentations/jquery/video/index.htm"&gt;An intensive exploration of jQuery&lt;/a&gt; with Ben Nadel (screencast; also see &lt;a href="http://bennadel.com/" title="Kinky solutions"&gt;Ben's blog&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://designingwebinterfaces.com/essential_controls"&gt;30 Essential Controls&lt;/a&gt; by Theresa Neil (great collection!)&lt;/li&gt;&lt;li&gt;&lt;a href="http://designingwebinterfaces.com/explore"&gt;Designing Web Interfaces&lt;/a&gt; by Bill Scott, Theresa Neil (book)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.noupe.com/css/5-popular-css-frameworks-tutorials-tools-for-getting-started.html"&gt;5 Popular CSS Frameworks + Tutorials &amp; Tools for Getting Started&lt;/a&gt; by NOUPE&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/advanceddebuggingwithjavascript"&gt;Advanced Debugging with JavaScript&lt;/a&gt; by Chris Mills, Hallvord R. M. Steen&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/ajax/ExpandPanelGridView.aspx"&gt;Expandable panel inside a GridView&lt;/a&gt; by Amauri Rodrigues&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163499.aspx"&gt;Client-Side Web Service Calls with AJAX Extensions&lt;/a&gt; by Fritz Onion&lt;/li&gt;&lt;li&gt;&lt;a href="http://daron.yondem.com/PermaLink.aspx?guid=845e2bdb-dfe0-444d-b4e6-60dffaffb2d1"&gt;Embed UpdatePanel inside Repeater&lt;/a&gt; by Daron Yöndem&lt;/li&gt;&lt;li&gt;&lt;a href="http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/"&gt;Why ASP.NET AJAX UpdatePanels are dangerous&lt;/a&gt; by Dave Ward&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx"&gt;jQuery and Microsoft&lt;/a&gt; by Scott Guthrie&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.noupe.com/icons/50-most-beautiful-icon-sets-created-in-2008.html"&gt;50 Most Beautiful Icon Sets Created in 2008&lt;/a&gt; by Noupe&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/ajax/jqmemleak.aspx"&gt;jQuery Memory Leak in UpdatePanel&lt;/a&gt; by gstolarov&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ajaxline.com/15-most-interesting-jquery-tutorials"&gt;15 Most Interesting jQuery Tutorials&lt;/a&gt; by AjaxLine&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ajaxline.com/10-best-jquery-plugins-april-2009"&gt;10 Best jQuery Plugins - April 2009&lt;/a&gt; by AjaxLine&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.code-magazine.com/Article.aspx?quickid=080033"&gt;jQuery Puts the Fun Back into Browser Scripting&lt;/a&gt; by Rick Strahl&lt;/li&gt;&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/15-resources-to-get-you-started-with-jquery-from-scratch/"&gt;15 Resources To Get You Started With jQuery From Scratch&lt;/a&gt; by Jeffrey Way&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-5481492481779624380?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/5481492481779624380/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=5481492481779624380" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/5481492481779624380?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/5481492481779624380?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/-LInI85Va4Y/aspnet-ajax-and-jquery.html" title="ASP.NET AJAX and jQuery" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/02/aspnet-ajax-and-jquery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cCR3c8fSp7ImA9WxVWF0Q.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-8697183408361607656</id><published>2009-02-23T17:45:00.000-08:00</published><updated>2009-02-27T21:31:06.975-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-27T21:31:06.975-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Implementing Windows services in Visual Studio 2008</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: How to write a better Windows service in Visual Studio 2008.&lt;/div&gt;&lt;br /&gt;Last week I discovered a couple of problems related to porting my &lt;a href="http://alekdavis.blogspot.com/2007/09/deploy-windows-services-on-vista.html"&gt;Windows service demo project&lt;/a&gt; from Visual Studio 2003 to Visual Studio 2008. A minor problem was caused by an obsolete method in the sample Windows service. Another problem was quite embarrassing: once started, it was &lt;span style="font-weight:bold;"&gt;impossible to stop a service&lt;/span&gt; from Service Control Manager. To fix this problem (and a couple of other issues related to .NET 2.0-specific functionality), I made the following changes:&lt;ul&gt;&lt;li&gt;Swapped the contents of Start and OnStart methods (now the Start method calls the OnStart method).&lt;/li&gt;&lt;li&gt;Moved the contents of the Stop method to the OnStop method.&lt;/li&gt;&lt;li&gt;Removed the Stop method (it's really not needed).&lt;/li&gt;&lt;li&gt;Modified is IsInstalled method.&lt;/li&gt;&lt;li&gt;Renamed the TestService source file in the demo project to CustomService (to reflect the name of the class).&lt;/li&gt;&lt;/ul&gt;If you have been using the My.Utilities library to implement a Windows service and are planning to upgrade it to the Visual Studio 2008 version, please use the updated projects (see the download link below) and keep an eye on the following:&lt;ol&gt;&lt;li&gt;Move your custom startup logic of a WindowService-derived class from the Start method to the OnStart method.&lt;/li&gt;&lt;li&gt;Don't forget to call the base class' OnStart and OnStop methods in the corresponding overriden methods.&lt;/li&gt;&lt;li&gt;Well... that's it.&lt;/li&gt;&lt;/ol&gt;One other thing that I could've done would be using the nullable DateTime members and variables when checking for uninitialized date and time values (instead of DateTime.MinValue), but since this would not improve functionality, I left the current implementation as is. If you strive for code elegance, feel free to do it yourself, since you have the source.&lt;br /&gt;&lt;br /&gt;Here is the Visual Studio 2008 version of the project, which incorporates all reported bug fixes up-to-date:&lt;ul&gt;&lt;li&gt;&lt;a name="DownloadWinServiceDemo"&gt;&lt;/a&gt;&lt;a href="http://www.box.net/shared/hste5b913t" title="Download from Box.net"&gt;Download the &lt;span style="font-weight:bold;"&gt;Windows service demo&lt;/span&gt; project for Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Let me know if you encounter any problems.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://visualstudiomagazine.com/columns/article.aspx?editorialsid=1983" title="Visual Studio Magazine, August 2005"&gt;Write a Better Windows Service&lt;/a&gt; by Alek Davis&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-8697183408361607656?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/8697183408361607656/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=8697183408361607656" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8697183408361607656?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/8697183408361607656?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/9Gi1Lm3IAjM/windows-services-in-visual-studio-2008.html" title="Implementing Windows services in Visual Studio 2008" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/02/windows-services-in-visual-studio-2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMRXw_fyp7ImA9WxJTFUw.&quot;"><id>tag:blogger.com,1999:blog-1956572409605655558.post-5395394866107506769</id><published>2009-02-12T21:33:00.000-08:00</published><updated>2009-04-23T11:34:44.247-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T11:34:44.247-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="podcasts" /><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="methodologies" /><title>To TDD, or not to TDD?</title><content type="html">&lt;div class="summary"&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: Some thoughts on Test-Driven Development (TDD).&lt;/div&gt;&lt;br /&gt;A few weeks ago, &lt;a href="http://stackoverflow.com"&gt;Stack Overflow&lt;/a&gt; co-founders Joel Spolsky and Jeff Atwood &lt;span style="text-decoration: line-through;"&gt;discussed&lt;/span&gt; criticized certain aspects of Test-Driven Development (TDD) and &lt;a href="http://davesquared.blogspot.com/2009/01/introduction-to-solid-principles-of-oo.html"&gt;SOLID Principles of Object-Oriented Design&lt;/a&gt; (OOD) [the latter advocated by Robert C. Martin, AKA &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Uncle Bob&lt;/a&gt;]. Check out the excerpts from the original podcast and the follow-up talk (you may also want to listen to the &lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast145SOLIDPrinciplesWithUncleBobRobertCMartin.aspx" title="Hanselminutes Podcast 145 - SOLID Principles with Uncle Bob - Robert C. Martin"&gt;Scott Hanselman's interview with Uncle Bob&lt;/a&gt;, which prompted Joel's rant):&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.box.net/shared/5ajjpv1u7a"&gt;The Stack Overflow: Podcast #38, Excerpt (14:32)&lt;/a&gt; [see also &lt;a href="http://blog.stackoverflow.com/2009/01/podcast-38/"&gt;podcast page&lt;/a&gt; and &lt;a href="https://stackoverflow.fogbugz.com/default.asp?pg=pgWiki&amp;command=view&amp;ixWikiPage=29025"&gt;transcript&lt;/a&gt;]&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.box.net/shared/vo79xr9odg"&gt;The Stack Overflow: Podcast #39, Excerpt (18:35)&lt;/a&gt; [see also &lt;a href="http://blog.stackoverflow.com/2009/01/podcast-39/"&gt;podcast page&lt;/a&gt; and &lt;a href="https://stackoverflow.fogbugz.com/default.asp?W29026" title="Incomplete at the time of writing"&gt;transcript&lt;/a&gt;]&lt;/li&gt;&lt;/ul&gt;As expected, the &lt;span style="text-decoration: line-through;"&gt;discussion&lt;/span&gt; criticism triggered rather emotional rebuttals from TDD supporters, including Uncle Bob himself; see (and read comments):&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel"&gt;"Quality Doesn't Matter That Much" -- Jeff and Joel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.objectmentor.com/articles/2009/02/06/on-open-letter-to-joel-spolsky-and-jeff-atwood"&gt;An Open Letter to Joel Spolsky and Jeff Atwood&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And then, a counter-rebuttals by Jeff Atwood:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001225.html"&gt;The Ferengi Programmer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000856.html"&gt;Real Ultimate Programming Power&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Eventually, Joel, Jeff, and Uncle Bob met for a makeup session, which you can find -- along with the summary -- at:&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.stackoverflow.com/2009/02/podcast-41/"&gt;The Stack Overflow: Podcast #41&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Although all participants of the podcast #41 seemed to agree on many issues, I have a feeling that the opposing sides stuck to their points of disagreement: uncle Bob remained convinced that TDD could do only good (the more TDD, the more good), while Jeff and Joel continued emphasizing that other aspects of software development may be more important than TDD.&lt;br /&gt;&lt;br /&gt;I happen to lean more towards Jeff and Joel for the following reasons (in addition to the reasons mentioned in The Stack Overflow podcasts).&lt;br /&gt;&lt;br /&gt;First, Joel mentioned the issues related to GUI testing, but it's not just the GUI: the database layer poses another challenge. When unit testing database-driven apps, a common approach is to rely on &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;mock objects&lt;/a&gt; (in which case, you totally skip database testing) or use test-specific data in a simplified version of the database (here you will have to figure out how to maintain this database and integrate it into your build process). Even with the 100% code coverage of the business layer, if your unit test skip the GUI and database, about half of the application (more or less) will remain untested, and you'll have to address this gap using functional testing, which will overlap with unit tests. So why spend time writing unit test for the code that will be tested functionally anyway?&lt;br /&gt;&lt;br /&gt;Second, claims that TDD improves code quality are rarely, if ever, substantiated by data. You may hear statements like:&lt;blockquote class="quote"&gt;"Since I (we) started using TDD, my (our) code has become much better."&lt;/blockquote&gt;I'm not claiming that these statements are false, but without data they are just personal opinions. Even assuming that code did in fact improve, could it be due to other factors, such as better programming experience, tools, team composition, processes?&lt;br /&gt;&lt;br /&gt;Analyzing effects of TDD on code quality is extremely difficult. One of the better studies on the subject was conducted by Microsoft and IBM (see the 8-minute &lt;a href="http://channel9.msdn.com/posts/Peli/Experimental-study-about-Test-Driven-Development/" title="Nachi Nagappan - Experimental study about Test Driven Development"&gt;interview&lt;/a&gt; with one of the researchers and the &lt;a href="http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf" title="Realizing quality improvement through test driven development: results and experiences of four industrial teams"&gt;original paper&lt;/a&gt;). The study found that TDD improved code quality, but it also increased development time.&lt;br /&gt;&lt;br /&gt;There is a trade-off: either use TDD and spend more time writing, maintaining, and running unit tests now or do not use TDD and spend time fixing bugs later. The question is: how much time? If TDD activities take 2 weeks out of an 8-week development cycle (a typical 25% TDD penalty) to prevent defects that could've been found and fixed in 3 days during functional testing, would TDD give you the best return on investment? By the way, it is worth noting that the team with the smallest test coverage (62%) in the study achieved the best results (90% drop of defects), while the team with the highest test coverage (95%) achieved the "worst" (as compared to other teams) results (40% drop of defects; still not bad when compared to the control group). I would also emphasize that the use of TDD in the study was close to ideal: the projects were appropriate for TDD and the teams were not pushed to achieve the maximum code coverage.&lt;br /&gt;&lt;br /&gt;The Microsoft-IBM study had a few problems, though. First, the number of participants was rather small. Second, and more important, it tried to compare similar teams and projects, but there were many difference between them, such as team/project sizes, and project durations, which is expected in a study focusing on real life projects. Studies performed in academic settings -- with undergraduate students of approximately the same grade working on identical projects -- attempted to minimize some of the differences and make experiments more controlled. According to an &lt;a href="http://iit-iti.nrc-cnrc.gc.ca/publications/nrc-47445_e.html"&gt;abstract&lt;/a&gt; from one of &lt;a href="http://iit-iti.nrc-cnrc.gc.ca/iit-publications-iti/docs/NRC-47445.pdf" title="On the Effectiveness of Test-first Approach to Programming"&gt;such studies&lt;/a&gt;:&lt;blockquote class="quote"&gt;"[T]est-first students on average wrote more tests and, in turn, students who wrote more tests tended to be more productive. We also observed that the &lt;span style="font-weight:bold;"&gt;minimum quality increased&lt;/span&gt; linearly with the number of programmer tests, &lt;span style="font-weight:bold;"&gt;independent of the development strategy&lt;/span&gt; employed."&lt;/blockquote&gt;How this sounds depends on how you interpret the study's findings. If you're a TDD supporter, you may join &lt;a href="http://haacked.com/articles/AboutHaacked.aspx"&gt;Phil Haack&lt;/a&gt; and announce that &lt;a href="http://haacked.com/archive/2008/01/22/research-supports-the-effectiveness-of-tdd.aspx"&gt;Research Supports The Effectiveness of TDD&lt;/a&gt;. Or, you can look more closely at the results of the study and come to a different conclusion. For example, Jacob Proffitt &lt;a href="http://theruntime.com/blogs/jacob/archive/2008/01/22/tdd-proven-effective-or-is-it.aspx"&gt;suggested&lt;/a&gt; (see also &lt;a href="http://scruffylookingcatherder.com/archive/2008/01/29/post-comments.aspx"&gt;post comments&lt;/a&gt;) that:&lt;blockquote class="quote"&gt;"[W]ithout question, testing first leads to having more tests per functional unit. The question is &lt;span style="font-weight:bold;"&gt;if this is valuable&lt;/span&gt;. This study would seem to indicate that this is probably &lt;span style="font-weight:bold;"&gt;not the case&lt;/span&gt;, at least if quality is your intended gain. But then, I'm not that surprised that &lt;span style="font-weight:bold;"&gt;number of tests doesn't correspond to quality&lt;/span&gt; just as I'm not surprised that the number of lines of code doesn't correspond to productivity."&lt;/blockquote&gt;I would also point that the code in the experiments was not written for database-driven apps with web-based GUI, so again it was an ideal usage of TDD. So I would speculate that if either of these studies focused on database-driven apps with web front ends, the results would probably be even less encouraging.&lt;br /&gt;&lt;br /&gt;I'm not an opponent of TDD and agree that it can be valuable when applied to certain types of projects. My gripe against TDD is that it is being often sold as yet another &lt;a href="http://en.wikipedia.org/wiki/No_Silver_Bullet"&gt;silver bullet&lt;/a&gt; and forced into adoption indiscriminately, in the projects where TDD offers minimal, if any, benefits. &lt;br /&gt;&lt;br /&gt;I also resent the assumption that TDD always leads to good code. &lt;span style="text-decoration: line-through;"&gt;Your&lt;/span&gt; My project can have 100% code coverage, but it can still suck. It will pass all unit test, alright, but at the same time it can be unreadable, unnecessarily complex, uncommented, resulting in an app with bad GUI and unintuitive behavior, an app which both the users and support teams hate. But don't you dare to criticize my code: since it's 100% unit tested, it's good by definition. Usability testing? Never heard of it. And as far as everything else goes (like comments, better design, etc), do I have time for this when I spend my better hours working on unit test? Something's gotta give.&lt;br /&gt;&lt;br /&gt;Finally, what about all those great apps written by developers, who did not use TDD or any other silver-bullet-like methodology? Take Google developers, who apparently &lt;a href="http://googleconference.blogspot.com/2008/05/software-development-methodology.html" title="Software Development Methodology at Google"&gt;do not follow any software development methodology or approach&lt;/a&gt;, but somehow manage to write apps that people love. If they can write great apps (which is one of the goals of good code), why would one want to impose TDD on them?&lt;br /&gt;&lt;br /&gt;Now, Google developers are good, but what do you do if your developers are bad? &lt;span class="sidenote"&gt;[I'm not talking about developers who make occasional, sometimes serious, errors (this happens even to the best of us); I'm talking about developers who consistently write bad code.]&lt;/span&gt; Wouldn't TDD help them write better code? I &lt;a href="http://alekdavis.blogspot.com/2007/09/can-man-change.html"&gt;wouldn't expect it&lt;/a&gt;, but if you can share a success story, please leave a comment.  &lt;br /&gt;&lt;br /&gt;If your organization suffers from bad code, consider adopting TDD (when applied correcly, it may help), but more importantly, consider other factors, such as:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test: 12 Steps to Better Code&lt;/a&gt; by Joel Spolsky&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163962.aspx"&gt;What Makes Good Code Good?&lt;/a&gt; by Paul DiLascia&lt;/li&gt;&lt;/ul&gt;Once you the adopt common-sense practices, you may not need TDD after all.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast146TestDrivenDevelopmentIsDesignTheLastWordOnTDD.aspx"&gt;Hanselminutes Podcast 146 - Test Driven Development is Design - The Last Word on TDD&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast31TestDrivenDevelopment.aspx"&gt;Hanselminutes Podcast 31 - Test Driven Development&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stephenwalther.com/blog/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx"&gt;TDD Tests are not Unit Tests&lt;/a&gt; by Stephen Walther&lt;br /&gt;&lt;a href="http://stephenwalther.com/blog/archive/2009/04/08/test-after-development-is-not-test-driven-development.aspx"&gt;Test-After Development is not Test-Driven Development&lt;/a&gt; by Stephen Walther&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1956572409605655558-5395394866107506769?l=alekdavis.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://alekdavis.blogspot.com/feeds/5395394866107506769/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=1956572409605655558&amp;postID=5395394866107506769" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/5395394866107506769?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1956572409605655558/posts/default/5395394866107506769?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AlekDavisTechnoBlog/~3/KaRj5YOFOJE/to-tdd-or-not-to-tdd.html" title="To TDD, or not to TDD?" /><author><name>Alek Davis</name><uri>http://www.blogger.com/profile/00436676606581042455</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07992809466729370201" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://alekdavis.blogspot.com/2009/02/to-tdd-or-not-to-tdd.html</feedburner:origLink></entry></feed>
