<?xml version="1.0" encoding="utf-16"?><rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel><title>BucketSoft Blog</title><description /><item xml:base="https://www.bucketsoft.com/blog/front-end-wpo-presentation"><title>Front-End WPO Presentation</title><description>&lt;p&gt;I've created a little presentation in effort to demonstrate a few simple front-end web performance optimization techniques.&lt;/p&gt;&lt;iframe height="400" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/29116100" frameborder="0" width="100%" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br&gt;&lt;br&gt; &lt;p&gt;To go along with this presentation I've also created two sample websites:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://wposample1.bucketsoft.com"&gt;wposample1.bucketsoft.com&lt;/a&gt; (unoptimized)  &lt;li&gt;&lt;a href="http://wposample2.bucketsoft.com"&gt;wposample2.bucketsoft.com&lt;/a&gt; (optimized) &lt;/li&gt;&lt;/ul&gt;</description><pubDate>Wed, 11 Dec 2013 23:24:00 Z</pubDate><a10:updated>2013-12-13T23:24:53Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/designing-the-new-bucketsoft-website"><title>Designing the New BucketSoft Website</title><description>&lt;p&gt;My old BucketSoft site was simply a place where I could show off the products I've built under the BucketSoft name. But as I'm taking on new clients and doing more web performance work the site was in need of an overhaul to reflect my new mission.&lt;/p&gt; &lt;h2&gt;The Requirements&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;It must be fast, of course.  &lt;li&gt;It can be simple but it should be rich enough to be pleasing with nice web fonts and icons.  &lt;li&gt;It must look good everywhere: phone, tablet, and desktop. But it must be especially fast on a phone. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;For every site I design, my very first step is to start with &lt;a href="http://www.balsamiq.com" target="_blank"&gt;Balsamiq Mockups&lt;/a&gt;. This one was no different...&lt;/p&gt;&lt;img class="fancy-border" alt="BucketSoft homepage mockup" src="http://cdn.bucketsoft.com/articles/bucketsoft-homepage-mockup1.png?v=09B0D57DFAAB754A704D15BFD1CFBBFF" width="600"&gt;  &lt;p&gt;It doesn't look like much. The goal is to just focus on basic content and layout at this stage, and not get too carried away. Balsamiq Mockups is meant to be a low-fi tool and that's exactly how I use it.&lt;/p&gt; &lt;h2&gt;The first attempt in Photoshop&lt;/h2&gt;&lt;img class="fancy-border" alt="BucketSoft homepage #1" src="http://cdn.bucketsoft.com/articles/bucketsoft-homepage1-600px.png?v=4509BE6E18B943EA72384ED6EBEA7C87" width="600"&gt;  &lt;p&gt;I love the photo and the tagline, "Let me make your website fast". I'm also pretty happy with the color scheme at this stage. But the layout isn't really working for me and the icons I'm using lack consistency.&lt;/p&gt; &lt;h2&gt;The second attempt in Photoshop&lt;/h2&gt;&lt;img class="fancy-border" alt="BucketSoft homepage #2" src="http://cdn.bucketsoft.com/articles/bucketsoft-homepage2-600px.png?v=B5897500288E6C5617917A7171D1FDBA" width="600"&gt;  &lt;p&gt;Now we're getting there. The text justification is consistent all the way down the page like you might see in a magazine. And the icons along the left hand side have a consistent look to them. Since the photo of the kids and the shopping cart is so great, I've made it much bigger. I've also applied a darkened corner effect to the photo like the Top Gear TV show likes to do, and I've given the photo a grainy look to match the grainy texture on the top of the page.&lt;/p&gt; &lt;p&gt;I made a few tweaks even after this, but not much. This was pretty much what I wanted.&lt;/p&gt; &lt;h2&gt;Responsive Design and Optimization&lt;/h2&gt; &lt;p&gt;At this point I began cutting images, creating CSS sprites, writing code, and designing my stylesheet. One of the most important parts of optimizing a site is to reduce the number of requests as much as possible. So I'm strategic in the way I create my CSS sprites. Not only do I want to reduce the number of images the client's browser has to download, but I also don't want mobile devices to download images that they aren't even going to display.&lt;/p&gt;&lt;img class="fancy-border" alt="BucketSoft homepage with responsive design" src="http://cdn.bucketsoft.com/articles/bucketsoft-homepage-responsive-600px.png?v=150807BA3B72A8D3440336272591B4CE" width="600"&gt;  &lt;p&gt;And there we have it. The site is configured to hide the large photo and icons on mobile displays. And these images won't even be downloaded on mobile devices. They are 69 KB and 12 KB respectively, so this is substantial savings.&lt;/p&gt; &lt;h2&gt;Final Optimizations&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;Set up a CDN for all the images and my CSS file. I like to use MaxCDN.  &lt;li&gt;Set a far-future (1 year) expiration date for all static files.  &lt;li&gt;Make sure GZIP is enabled in IIS. &lt;/li&gt;&lt;/ol&gt; &lt;h2&gt;Performance Verdict&lt;/h2&gt; &lt;p&gt;According to &lt;a href="http://www.webpagetest.org"&gt;webpagetest.org&lt;/a&gt; the homepage will load in &lt;b&gt;1.5 seconds&lt;/b&gt; over DSL. And there are 10 requests totalling 163 KB.&lt;/p&gt;&lt;img class="fancy-border" alt="BucketSoft homepage waterfall from WebPageTest.org" src="http://cdn.bucketsoft.com/articles/bucketsoft-homepage-waterfall.png?v=7548F7D5D2A165057B9F509227C31949" width="600"&gt;  &lt;p&gt;On a mobile device it's even better with 8 requests totalling just 82 KB. This is far better than average by today's standards.&lt;/p&gt;</description><pubDate>Wed, 05 Jun 2013 23:19:00 Z</pubDate><a10:updated>2013-12-13T23:20:33Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/my-favorite-website-optimization-tools"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><category>Development / Technical</category><title>My Favorite Web Performance Tools and Services</title><description>&lt;h4&gt;&lt;a href="http://www.webpagetest.org/"&gt;WebPageTest.org&lt;/a&gt; (free)&lt;/h4&gt;I tell people about WebPageTest all the time.&amp;nbsp; It allows you to test your website from a server that you choose from a dropdown list.&amp;nbsp; They have locations all over the world to choose from and you can even choose a connection speed to simulate.&amp;nbsp; After the test is finished, you'll get a neat waterfall view showing the elapsed time of every request.&amp;nbsp; It's a great tool to use to observe realistic before &amp;amp; after improvements as you optimize your site.&lt;br&gt;&lt;br&gt; &lt;h4&gt;&lt;a href="http://developer.yahoo.com/yslow/" target="_blank"&gt;YSlow&lt;/a&gt; (free)&lt;/h4&gt; &lt;div&gt;YSlow has been around a long time.&amp;nbsp; It's a tool that you run locally to analyze a page of your site.&amp;nbsp; It then grades your page and offers detailed suggestions about ways to improve page load times.&amp;nbsp; There are similar tools that have come along since this one.&amp;nbsp; Even WebPageTest does this.&amp;nbsp; But most others I've seen will leave out details and miss important suggestions that YSlow produces.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;h4&gt;&lt;a href="http://fiddler2.com/" target="_blank"&gt;Fiddler&lt;/a&gt; (free)&lt;/h4&gt; &lt;div&gt;Fiddler is a neat little tool that allows you to view details of every request and response that goes through your browser.&amp;nbsp; In general, it's a good thing to learn and understand HTTP request and response headers.&amp;nbsp; With time and practice using Fiddler (and a little Googling) you can do exactly that.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt; &lt;h4&gt;&lt;a href="http://www.microsoft.com/web/seo" target="_blank"&gt;Microsoft SEO Toolkit&lt;/a&gt; (free)&lt;/h4&gt; &lt;div&gt;This one requires IIS to be installed, and it's primarily designed to uncover SEO problems, broken links, and such.&amp;nbsp; But it's neat because it crawls your entire site and it'll also identify slow pages on your site and warn you about it.&lt;/div&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;h4&gt;&lt;a href="http://newrelic.com/" target="_blank"&gt;New Relic&lt;/a&gt;&lt;/h4&gt; &lt;div&gt;Think of New Relic as a lightweight profiler that's designed to gather basic timings on your production code and database. It's detailed enough to be very useful in identifying bottlenecks, but not so detailed as to slow down your production website.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;h4&gt;&lt;a href="http://www.maxcdn.com/" target="_blank"&gt;MaxCDN&lt;/a&gt;&lt;/h4&gt; &lt;div&gt;It used to be that CDNs were all designed for large clients and you needed to sign a crazy contract for millions of GB worth of data transfer.&amp;nbsp; Now the prices have come down drastically, and you have services like Amazon CloudFront, RackSpace Cloud Files, and MaxCDN who all have good introductory rates for the little guy.&amp;nbsp; I like MaxCDN in particular because they have all the features I could want, and they perform admirably.&amp;nbsp; By the way, if you have a global audience, a CDN is a worthy thing to invest in.&amp;nbsp; Just use WebPageTest.org to see proof of that.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;h4&gt;&lt;a href="http://www.dnsmadeeasy.com/" target="_blank"&gt;DNS Made Easy&lt;/a&gt;&lt;/h4&gt; &lt;div&gt;Again, if you have a global audience and are looking to reduce your global latency, a good DNS provider with IP Anycast routing can help.&amp;nbsp; DNS Made Easy is a great choice as they have a great track record and locations all over the world.&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt;</description><pubDate>Thu, 09 May 2013 23:26:00 Z</pubDate><a10:updated>2013-12-13T23:27:03Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/embracing-dapper-as-my-orm-of-choice"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Embracing Dapper as my ORM of Choice</title><description>An Object Relational Mapper, or ORM, can be a great way of improving code readability and resilience. &amp;nbsp;The idea is to perform your basic CRUD statements against your database with a small layer in between that handles type conversions so you don't have to.  For instance, SQL has multiple types for dates and strings whereas .NET really just has one date type, and one string type.  Having something to bridge that gap in type systems can really be handy.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My first experience with an ORM was with LINQ to SQL. &amp;nbsp;Then soon after that I tried Entity Framework. &amp;nbsp;Working with either of these is similar as the primary way you're going to write queries with these is through LINQ. &amp;nbsp;The LINQ statements then are translated into SQL, and it's a pretty sweet set up most of the time. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, these two ORMs have a lot of functionality behind the scenes which you really have to learn about when troubleshooting performance problems and such. &amp;nbsp;The problem then is that the abstraction level is so high that when there's a problem it's hard to figure out how to solve it. &amp;nbsp;And I mean, why spend all of this time refining your LINQ queries to spit out better SQL queries, when you can just write a straight SQL query that does what you want more efficiently?&lt;/div&gt;&lt;h4&gt;Dapper: the micro-ORM&lt;/h4&gt;&lt;div&gt;So that's what &lt;a href="https://code.google.com/p/dapper-dot-net/" target="_blank"&gt;Dapper&lt;/a&gt; is all about. &amp;nbsp;Dapper could be classified as a micro-ORM. &amp;nbsp;It really is just a bare minimum implementation of an ORM with two main extension methods to work with. &amp;nbsp;You have &lt;i&gt;Query&lt;/i&gt; and &lt;i&gt;Execute&lt;/i&gt;. &amp;nbsp;That's all. &amp;nbsp;The simplicity of the API makes it beautiful to work with. &amp;nbsp;It doesn't hurt that it's also one of the fastest and most efficient ORMs out there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is one extra step you have to follow when working with Dapper. &amp;nbsp;And that is, you have to manually write your classes that map to your database. &amp;nbsp;Both Linq to SQL and Entity Framework have tight integration with Visual Studio and will do this for you. &amp;nbsp;But with Dapper I had to create a class for my SQL table called CarModel...&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;public class CarModel&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public int CarModelID { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; public string Make { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; public string Model { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; public string ModelUrl { get; set; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; public int Year { get; set; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a simple query which returns a Dictionary&amp;lt;int, CarModel&amp;gt; ...&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;using (var conn = Db.OpenConnection)&lt;br /&gt;{&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;return conn.Query&amp;lt;CarModel&amp;gt;("SELECT * FROM CarModel").ToDictionary(k =&amp;gt; k.CarModelID);&lt;br /&gt;}&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's another example where I'm getting the logged in user's UserID with a parameterized query...&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;public static int? UserId&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; get&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!HttpContext.Current.User.Identity.IsAuthenticated) return null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; using (var conn = Db.OpenConnection)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return conn.Query&amp;lt;int&amp;gt;("SELECT UserId FROM UserProfile WHERE UserName = @UserName",&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new { @UserName = HttpContext.Current.User.Identity.Name }).FirstOrDefault();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Even though Dapper isn't as rich in features as something like Entity Framework, I still feel like it's saving me time in the long run while also allowing me to write faster and more efficient applications.&lt;/p&gt;&lt;br /&gt;</description><pubDate>Thu, 25 Apr 2013 19:00:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/regex-hero-1000-registered-users"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>Regex Hero: 1,000 Registered Users</title><description>4 years later, &lt;a href="http://regexhero.net/" target="_blank"&gt;Regex Hero&lt;/a&gt; is still growing by word of mouth. &amp;nbsp;It consistently gets 600 to 800 visits a day. &amp;nbsp;A few days ago the 1000th user registered on the site. &amp;nbsp;And February was the best month to date in terms of sales.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fGM15zfPHro/UTDaM-8LdII/AAAAAAAAAgU/sNEsWaCRjhE/s1600/regexhero-traffic-2013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="440" src="http://2.bp.blogspot.com/-fGM15zfPHro/UTDaM-8LdII/AAAAAAAAAgU/sNEsWaCRjhE/s640/regexhero-traffic-2013.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There have been a number of feature requests from Regex Hero customers over the past few months that I'll be working on very soon. &amp;nbsp;It obviously deserves the attention.</description><pubDate>Fri, 01 Mar 2013 10:38:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/liquid-webs-smart-servers"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Liquid Web's Smart Servers</title><description>I've been using a &lt;a href="http://www.liquidweb.com/"&gt;Liquid Web&lt;/a&gt; dedicated server for the past couple years to host &lt;a href="http://www.bucketsoft.com/"&gt;BucketSoft&lt;/a&gt;, &lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt;, and &lt;a href="http://www.silverlightxap.com/"&gt;SilverlightXAP&lt;/a&gt;.  It's been dependable and I've been happy with their service.&lt;br /&gt;&lt;br /&gt;But in March 2011 they rolled out a new service called Smart Servers that's pretty clever.  Basically, they provide dedicated and virtual dedicated servers with added provisions for imaging and easy upgrades.  So with a click of a button you could for example upgrade a low-end single-CPU virtual dedicated server to a monstrous dedicated server with 96 GB RAM, 4 CPUs / 32 cores, and 8 hard drives in RAID 10.&lt;br /&gt;&lt;br /&gt;They of course have a lot of other options in between.  But it's neat how they're able to automate all of this.  They don't go into a great deal of detail on the site, but I'm assuming that there's a virtualization layer even on the dedicated servers which makes these migrations/upgrades possible.  So when you click the button to upgrade, an image is created of your server and copied over to another server in the datacenter.  I know Windows Azure has similar capabilities but I like how Liquid Web was able to retain the simplicity and flexibility of a dedicated server while accomplishing all of this.&lt;br /&gt;&lt;br /&gt;Yesterday I migrated &lt;a href="http://www.contractedge.com/"&gt;ContractEdge&lt;/a&gt; over to one of Liquid Web's Virtual Dedicated smart servers because I liked this model so much.  It was quick and painless to setup.  I'm thinking that before long I'll do the same with my own sites.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (September 5, 2012)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;On Monday I migrated all of my sites, including regexhero.net, silverlightxap.com, and bucketsoft.com over to a new virtual dedicated smart server with Liquid Web. &lt;br /&gt;&lt;br /&gt;The basic specs are as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Server 2008 R2 &lt;/li&gt;&lt;li&gt;SQL Server 2008 Web Edition&lt;/li&gt;&lt;li&gt;4GB RAM &lt;/li&gt;&lt;li&gt;2 CPU cores &lt;/li&gt;&lt;li&gt;300GB storage&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;And then I'm using MozyPro for off-site backups as I always have. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was sort of a downgrade and an upgrade at the same time. &amp;nbsp;It was a downgrade because I went from a dedicated server to a virtual dedicated server and this could hurt the I/O potential of the server. &amp;nbsp;But at the same time, I also upgraded from 2GB RAM to 4GB RAM. &amp;nbsp;Having the extra RAM is really nice and it means that I don't even need to hesitate about employing more server caching strategies on my websites. &amp;nbsp;In any case, it handles the current load with ease.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The new server is cheaper than the old one too at&amp;nbsp;$210/mo vs $269/mo. &amp;nbsp;All in all, a pretty good deal. &amp;nbsp;And it's good to know I have an easy upgrade path from here.</description><pubDate>Sat, 04 Aug 2012 12:52:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/being-clever-with-css-sprites"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><category>Development / Technical</category><title>Clever CSS Sprites : Repeating and Non-Repeating</title><description>&lt;br /&gt;If you're a web designer or front-end developer and you've never created CSS sprites, then it's time to stop living in the past.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WYZ4EZjumjk/T_G0nPuh5uI/AAAAAAAAAd8/JhQl3ULxZlM/s1600/sprite-example.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-WYZ4EZjumjk/T_G0nPuh5uI/AAAAAAAAAd8/JhQl3ULxZlM/s200/sprite-example.png" width="157" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Super Mario sprites&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Actually, &lt;a href="http://en.wikipedia.org/wiki/Sprite_(computer_graphics)"&gt;sprites&lt;/a&gt; aren't a particularly new idea. &amp;nbsp;Sprites were first used in video games in 1974. &amp;nbsp;Basically the idea is that you join a bunch of unrelated images into one big image. &amp;nbsp;That way, when you're loading your sprites, they're coming from a single bitmap in video memory. &amp;nbsp;For example, one technique would be to include various positions and poses for a character into a single image such as walking, running, jumping, etc. &amp;nbsp;And then changing poses would be a matter of shifting the offset of the bitmap, rather than loading a new bitmap entirely.&lt;br /&gt;&lt;br /&gt;CSS sprites are a similar concept, but we use them for a different reason. &amp;nbsp;The reason is simple -- there's overhead and latency in every HTTP request and response. &amp;nbsp;An HTTP request header is usually going to be over 500 bytes, or perhaps over 1 KB if it contains a cookie. &amp;nbsp;&lt;span style="background-color: white;"&gt;This is made worse by the fact that bandwidth speeds have improved disproportionately to latency. &amp;nbsp;In other words, some lucky people have 50 mbps connections to their homes and you'd expect latency numbers to be measured in microseconds by now, but that simply hasn't happened. &amp;nbsp;Latency is worse on DSL, worse still on mobile connections, and it's even impacted by the distance and network hops involved in the user's connection to your server. &amp;nbsp;All that said,&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white;"&gt;it's wise to combine files whenever possible, especially when those files tend to be almost as small as the request and response headers themselves.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So how do CSS sprites work, and how can I build them?&lt;/b&gt;&lt;br /&gt;Well, in essence it's a matter of creating a &lt;i&gt;block&lt;/i&gt; element in your CSS with a specific &lt;i&gt;width&lt;/i&gt; and &lt;i&gt;height&lt;/i&gt;, and then using the&amp;nbsp;&lt;i&gt;background-position&lt;/i&gt; property to position your sprite sheet, as it were. &amp;nbsp;Rather than write a new tutorial for CSS sprites, I'm going to refer to the &lt;a href="http://css-tricks.com/css-sprites/" target="_blank"&gt;best introduction &amp;amp; tutorial for CSS sprites&lt;/a&gt; I'm aware of.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now that you know what CSS sprites are, and how to build them...&lt;/b&gt;&lt;br /&gt;I'm going to dive into a slightly more advanced use case for CSS sprites which I implemented yesterday for my site at &lt;a href="http://www.silverlightxap.com/"&gt;SilverlightXAP.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qfAMk_sMhhk/T_G58B-bSyI/AAAAAAAAAeI/hNizuAhueFQ/s1600/silverlightxap-screen.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://2.bp.blogspot.com/-qfAMk_sMhhk/T_G58B-bSyI/AAAAAAAAAeI/hNizuAhueFQ/s640/silverlightxap-screen.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I focused on optimizing the upper-half of the site. &amp;nbsp;So that means everything you see in green. &amp;nbsp;There are a few tricky things about this which influenced my strategy.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The big "Royalty-free Silverlight goodness" tagline with the nice gradient is only on the homepage. &amp;nbsp;So it felt like a bit of a waste to include this in one image along with the header/navigation above it, especially since it's over 16KB. &lt;/li&gt;&lt;li&gt;The green section should stretch across the entire width of the browser, so I'd prefer to use &lt;i&gt;repeat-x&lt;/i&gt; in the CSS for this.&lt;/li&gt;&lt;li&gt;The green&amp;nbsp;section&amp;nbsp;of the interior pages of the site is the same color, but is much shorter.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;This is what the interior pages look like (notice how much shorter the green section is)...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-C62zKlbg9TY/T_G-c5bGknI/AAAAAAAAAec/4o75_4cDPpk/s1600/silverlightxap-screen-interior.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://3.bp.blogspot.com/-C62zKlbg9TY/T_G-c5bGknI/AAAAAAAAAec/4o75_4cDPpk/s640/silverlightxap-screen-interior.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The slightly unusual part about all of this is building an image where some sprites are going to use &lt;i&gt;no-repeat&lt;/i&gt; and others will be using &lt;i&gt;repeat-x&lt;/i&gt;. &amp;nbsp;It turns out that you can pull this off, however, by including the section that'll be repeated horizontally underneath the section that's not repeated. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here's what I came up with for header.png...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fxSpZ85-i7o/T_G9vK_WQ8I/AAAAAAAAAeU/0YNR6KFgt5g/s1600/header.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://1.bp.blogspot.com/-fxSpZ85-i7o/T_G9vK_WQ8I/AAAAAAAAAeU/0YNR6KFgt5g/s640/header.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;As you can see, the green area underneath the header is nice and tall, with a 1 pixel horizontal dark line along the bottom. But because most of it is a solid color, the PNG file size is still quite small. &amp;nbsp;This header.png file is just 11.8 KB. &amp;nbsp;The other advantage with combining the background with the header is that they'll both load at precisely the same time, which creates a slightly nicer and less jarring experience as the various page elements load.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;So I have a header that's 950px wide which uses header.png...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#header {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;margin: 0 auto;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;padding-top: 25px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;width: 950px;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;position: absolute;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;top: 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;background: white url(header.png) no-repeat scroll 0 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;span style="font-family: inherit;"&gt;And then I have a declaration for the &lt;i&gt;body&lt;/i&gt; which repeats the lower half of header.png horizontally across the screen...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;body {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;padding: 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;margin: 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;background: white url(header.png) repeat-x scroll 0 -299px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;Notice the &lt;i&gt;background-position&lt;/i&gt; is set to -299px vertically.  This is for the interior pages, and it shifts the background up enough to meet up with the lower portion of the header.&lt;br /&gt;&lt;br /&gt;On the homepage we then want to override this &lt;i&gt;background-position&lt;/i&gt; because we want the green area to be taller...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="white-space: pre-wrap;"&gt;body { &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&lt;span style="white-space: pre-wrap;"&gt;background-position: 0 -162px !important; &lt;/span&gt;&lt;span style="white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre-wrap;"&gt;That takes care of the header.  Then silverlight-goodness.png is simple and is only used on the homepage...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--yfrCVFblO4/T_HBusoAxfI/AAAAAAAAAeo/NRrGZacZrys/s1600/silverlight-goodness.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://4.bp.blogspot.com/--yfrCVFblO4/T_HBusoAxfI/AAAAAAAAAeo/NRrGZacZrys/s640/silverlight-goodness.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre-wrap;"&gt;And there we have it.  The entire upper green section of the homepage is composed of just two images (header.png and silverlight-goodness.png).  And for the interior pages it's just a single image (header.png).  This front-end optimization along with caching settings, gzip compression, a cookieless domain for static assets, and a CDN makes the site very fast.  As always, if you're interested in going beyond CSS sprites and want to optimize your site further, I'd suggest running &lt;a href="http://developer.yahoo.com/yslow/" target="_blank"&gt;YSlow&lt;/a&gt; to analyze your site and follow its recommendations.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;</description><pubDate>Mon, 02 Jul 2012 10:59:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/taking-my-sweet-time-to-write-quality"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Taking My Sweet Time to Write Quality Code</title><description>Whenever possible I like to take my time when working on new projects. &amp;nbsp;I like to research techniques as I'm writing code, and try not to fall back on old habits simply out of familiarity. &amp;nbsp;Even more importantly, I want to fully understand the code that I'm writing to take the guesswork out of the process. &amp;nbsp;This is possible when you don't create arbitrary deadlines for yourself. &amp;nbsp;And the results can speak for themselves. &amp;nbsp;Incidentally, hard deadlines are the one thing I don't miss about doing web consulting for other companies.&lt;br /&gt;&lt;br /&gt;So the past few weeks I've been working on a &lt;a href="http://blog.regexhero.net/2012/06/new-regex-parser-improved-syntax.html"&gt;new parser for Regex Hero&lt;/a&gt;. &amp;nbsp;I had some ideas for what I wanted to accomplish with it. &amp;nbsp;And taking lessons from my old parser, I began to build something that was both faster and more powerful. &amp;nbsp;I put some finishing touches on it recently and began to write some automated tests to make sure I'm not getting any errors. &amp;nbsp;I ran another test just now where I'm ensuring that the tokenized pattern that comes out adds up to the original pattern that went in. &amp;nbsp;The test was performed by running 10 million randomly generated regular expressions through the parser. &amp;nbsp;In the end it had a 100% success rate.&lt;br /&gt;&lt;br /&gt;I'm very pleased with the way the parser is working now, and it's going to open up a lot of new possibilities for Regex Hero. &amp;nbsp;Would it have been as good if I had rushed things? &amp;nbsp;I don't think so.</description><pubDate>Mon, 04 Jun 2012 11:06:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/user-experience-5-contrast"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>User Experience #5: Contrast</title><description>Contrast is one of the more important concepts in design.  And it can affect the user experience in a profound way.  I mean, &lt;span style="background-color: red; color: lime;"&gt;this text is a little hard to read&lt;/span&gt;, isn't it? &amp;nbsp;I would say that &lt;span style="background-color: #fff2cc; color: #7f6000;"&gt;this is much more pleasant&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;In fact, in the above examples, there's a good chance that those with red-green color blindness will not see the statement, "&lt;span style="background-color: white;"&gt;this text is a little hard to read" at all.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So you have to be especially careful with contrast when text is involved. &amp;nbsp;Fortunately we have some &lt;a href="http://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast"&gt;contrast guidelines from the W3C&lt;/a&gt;. &amp;nbsp;As a rule of thumb I think it's wise to try to at least meet their "AA" standards explained in section 1.4.3. &amp;nbsp;The intent of the AA standards is to "provide enough contrast between text and its background so that it can be read by people with moderately low vision." &amp;nbsp;That means a contrast ratio of 4.5:1 for small text and 3:1 for large text.&lt;br /&gt;&lt;br /&gt;There's a nice tool from snook.ca&amp;nbsp;called the&amp;nbsp;&lt;a href="http://www.snook.ca/technical/colour_contrast/colour.html"&gt;Colour Contrast Check&lt;/a&gt;. &amp;nbsp;And I'd recommend checking your own website's colors to make sure you're meeting the AA standards.</description><pubDate>Thu, 17 May 2012 14:52:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/lazy-loading-jquery-selector"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Lazy Loading jQuery Selector</title><description>I had this thought today when I was reading a question on StackOverflow.  The question was about the performance advantage of &lt;a href="http://stackoverflow.com/questions/10489525/does-storing-selected-found-elements-in-variable-increase-performance"&gt;caching your DOM elements found with jQuery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what if jQuery had a mechanism for lazy loading DOM objects?&lt;br /&gt;&lt;br /&gt;I mean, as it stands, every time you use a jQuery selector it's crawling the DOM to find elements. &amp;nbsp;So it's wise to cache those results when appropriate.&lt;br /&gt;&lt;br /&gt;Or if you know you're dealing with static page elements then you can just use this handy plugin I created...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="prettyprint"&gt;(function($){&lt;br /&gt;  var cachedObjects = new Array();&lt;br /&gt;&lt;br /&gt;  $.lazy = function(selector) {&lt;br /&gt;    if (typeof selector != "string" || arguments.length &gt; 1) &lt;br /&gt;      return $.apply(this, arguments);&lt;br /&gt;&lt;br /&gt;    var o = cachedObjects[selector];&lt;br /&gt;    if (o == undefined)&lt;br /&gt;    {&lt;br /&gt;      o = $(selector);&lt;br /&gt;      cachedObjects[selector] = o;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return o;&lt;br /&gt;  };&lt;br /&gt;})(jQuery);&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then you'd use it like this...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="prettyprint"&gt;$.lazy(".BestSellers").show();&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This will cache the results internally after the first call.  As a result, jQuery doesn't have to work so hard to crawl the DOM with every call to this selector.  This should actually speed up the page.  Most of the time the performance advantage here won't be noticeable unless you're dealing with a very large page.  Still, I thought this was a neat way of handling the problem without completely refactoring your code.</description><pubDate>Mon, 07 May 2012 17:42:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/user-experience-4-back-button"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>User Experience #4: The Back Button</title><description>Don't break the back button. &amp;nbsp;Nobody likes this...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://i.stack.imgur.com/gpk68.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I've been making websites with ASP.NET Web Forms since it came out in 2001. &amp;nbsp;The problem is that many of the built-in controls work off of Postbacks and Viewstate. &amp;nbsp;So what? &amp;nbsp;Well, a postback is where a form POST &amp;nbsp;is used&amp;nbsp;on a page&amp;nbsp;to send data back to itself. &amp;nbsp;The trouble is that if you then refresh the page after the post occurs, you'll see the ugly message above.&lt;br /&gt;&lt;br /&gt;So one of the worst examples of this is the DataPager control. &amp;nbsp;The DataPager control will allow you to create pages for your data like this...&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;1&lt;/b&gt;&amp;nbsp; &lt;u&gt;2&lt;/u&gt; &amp;nbsp;&lt;u&gt;3&lt;/u&gt; &amp;nbsp;&lt;u&gt;4&lt;/u&gt; &amp;nbsp;&lt;u&gt;5&lt;/u&gt;&lt;/span&gt;&lt;/blockquote&gt;Now with the default behavior of the DataPager, every link above will result in a postback. &amp;nbsp;This means that if you hit the back button and then hit refresh you'll see the ugly message above again. &amp;nbsp;It also means that every "page" will have the same URL, so this approach is lousy for &lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization"&gt;SEO&lt;/a&gt; purposes. &lt;br /&gt;&lt;br /&gt;You can of course avoid all of these problems by avoiding certain controls in ASP.NET Web Forms and writing custom code where necessary. &amp;nbsp;But these types of mistakes can be made with other languages and web frameworks too.&lt;br /&gt;&lt;br /&gt;So what should you do? &amp;nbsp;Well, there are two approaches:&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Use a form GET instead. &amp;nbsp;&lt;/b&gt;When your form sends data with a GET, then everything is passed by querystring and you'll never run into the problem above. &amp;nbsp;The drawback here is that since everything is in the querystring this is not secure. &amp;nbsp;So it's a good approach for search engines, data pagers (as above), etc. &amp;nbsp;But it's a bad approach if your form is used to change data, log in with a password, checkout with a credit card, etc. &amp;nbsp;The GET also has a limit when it comes to length. &amp;nbsp;It's going to depend on the browser, but as a rule, don't expect it to handle anything over 2,000 characters long reliably.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Use a form POST followed by a redirect. &amp;nbsp;&lt;/b&gt;So in the examples I mentioned above where a GET is a bad approach, this is what you'll need. &amp;nbsp;After the form POST, redirect the user to a different URL with a 302, or better, a &lt;a href="http://en.wikipedia.org/wiki/HTTP_303"&gt;303 redirect&lt;/a&gt;. &amp;nbsp;This will allow the user to flow between pages with the back, forward, and refresh buttons, and they'll never see the ugly "form resubmission" message.</description><pubDate>Mon, 07 May 2012 10:28:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/user-experience-3-required-fields-and"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>User Experience #3: Required Fields and Form Validation</title><description>One thing we do for the sake of web usability is we find commonality between the popular sites and copy these conventions for our own websites. &amp;nbsp;After all, if everyone knows how to use Google, Amazon, and Facebook, then copying their designs will create a familiar experience for them. &amp;nbsp;For example, it's common to see the log in button in the upper-right hand corner. &amp;nbsp;It's common to use &lt;span style="color: blue;"&gt;blue&lt;/span&gt; for links. &amp;nbsp;And it's common to use red asterisks &lt;span style="color: red;"&gt;*&lt;/span&gt; to indicate required fields in a form.&lt;br /&gt;&lt;br /&gt;That last one is what I want to talk about. &amp;nbsp;First, the whole red asterisk thing may seem like a standard convention. &amp;nbsp;And it is in fact very common. &amp;nbsp;But it's not a universal standard. &amp;nbsp;For example, Amazon.com doesn't use them. &amp;nbsp;And NewEgg uses asterisks but they're black, not red. &amp;nbsp;Second, there is an alternative which not only looks cleaner and is easier to understand, but it can actually eliminate problems.&lt;br /&gt;&lt;br /&gt;So here's a form with red asterisks...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-qAzFh50KVFo/T6KysADsAVI/AAAAAAAAAb4/_VDJAPfLhaw/s1600/validation-bad.gif" /&gt;&lt;/div&gt;&lt;br /&gt;With this simple example, I don't think most people will have a problem. &amp;nbsp;However, imagine the form was made up of 50 questions. &amp;nbsp;When you're using &lt;span style="color: red;"&gt;red&lt;/span&gt;&amp;nbsp;for validation errors and red for the asterisks &lt;span style="color: red;"&gt;*&lt;/span&gt;, and you have a long scrollable page, then the validation errors may not stand out on the page enough when it's cluttered with red asterisks. &lt;br /&gt;&lt;br /&gt;In fact, we ran into this very problem at TechInsurance.com and we'd occasionally have people call us about it. &amp;nbsp;Some of the pages on that site can have a lot of questions on them. &amp;nbsp;And so they thought they had corrected all the validation errors on the page, but had obviously missed something.&lt;br /&gt;&lt;br /&gt;Another pain point is that some people are not sure if the red asterisks denote a problem. &amp;nbsp;They may not remember that in fact they were red even before they clicked submit.&lt;br /&gt;&lt;br /&gt;In 2009 I began a large overhaul of TechInsurance.com. &amp;nbsp;And this was one of the problems I was looking to solve. &amp;nbsp;I thought, why not denote the exception, rather than the rule? &amp;nbsp;I mean, since 95% of the fields are required, why not just mark the optional fields with the word "optional." &amp;nbsp;So that's what I did, and after launching in 2010 all indications show that this solved the problem.&lt;br /&gt;&lt;br /&gt;So this new approach looks something like this...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-fDcvrcS4nq8/T6K19ui4F7I/AAAAAAAAAcE/3-36nMezrgE/s1600/validation-good.gif" /&gt;&lt;/div&gt;You'll notice a few things about this approach:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Instead of red asterisks to mark the required fields, I'm using the word "optional" to mark the optional fields.&lt;/li&gt;&lt;li&gt;As another visual cue, I'm using &lt;b&gt;bold&lt;/b&gt; for required fields to add more contrast against the optional fields.&lt;/li&gt;&lt;li&gt;I made the validation errors themselves more obvious by styling the textbox and making the label next to it red as well.&lt;/li&gt;&lt;li&gt;I styled the button &lt;span style="color: red;"&gt;red &lt;/span&gt;to make it obvious that you've clicked it and something is wrong.&lt;/li&gt;&lt;li&gt;I added a note to "&lt;span style="color: red;"&gt;please correct the errors above&lt;/span&gt;." &amp;nbsp;This should absolutely be there, especially when the form is long and the user has to scroll through it.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I've also given this advice on ux.stackexchange.com and it was &lt;a href="http://ux.stackexchange.com/questions/840/whats-the-best-way-to-highlight-a-required-field-on-a-web-form-before-submissio/846#846"&gt;well received&lt;/a&gt;. &amp;nbsp;Later I even found that Erin Walsh and Luke Wroblewski&amp;nbsp;had come to the&amp;nbsp;&lt;a href="http://www.lukew.com/ff/entry.asp?725"&gt;same conclusion&lt;/a&gt; I did.&lt;/div&gt;</description><pubDate>Thu, 03 May 2012 12:09:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/user-experience-2-links-and-buttons"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>User Experience #2: Links and Buttons</title><description>&lt;h4&gt;        It's important to make links look like links, and buttons look like buttons.&lt;/h4&gt;&lt;br /&gt;Way back in the day, Jakob Nielsen announced that &lt;span style="color: blue; text-decoration: underline;"&gt;blue underlined text&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;was the most common design for a link and we should all follow that convention. &amp;nbsp;In 2004, he conceded a few &lt;a href="http://www.useit.com/alertbox/20040510.html"&gt;exceptions to this rule&lt;/a&gt;.&amp;nbsp; His guidelines still seem very strict.&amp;nbsp; But basically I think he'd agree that the main idea is that the user shouldn't have to struggle to find your links.&lt;br /&gt;&lt;br /&gt;As Jakob Nielsen puts it, "Users shouldn't have to guess or scrub the page to find out where they can click." &amp;nbsp;And the same goes for buttons. &amp;nbsp;A button should have sufficient whitespace around it and should resemble a button in some fashion.&lt;br /&gt;&lt;br /&gt;I learned my lesson the hard way about all of this last year. &amp;nbsp;I offered my site as an example in an answer to this &lt;a href="http://ux.stackexchange.com/questions/3542/peripherial-vision-vs-results-of-eye-tracking"&gt;question about peripheral vision vs results of eye tracking&lt;/a&gt;. &amp;nbsp;Hisham responded with the best answer where he cited Don Norman's book, &lt;a href="http://www.amazon.com/gp/product/0465051367/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=bucke04-20"&gt;Emotional Design&lt;/a&gt;. &amp;nbsp;Then he goes on to describe why the design of my homepage for Regex Hero doesn't work.&lt;br /&gt;&lt;br /&gt;Take a look at this...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://i.stack.imgur.com/FTaGz.png" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;This design is a year old now. &amp;nbsp;And there's a strong chance that even if the red circle wasn't there, your eyes would be drawn to the "Buy Regex Hero Professional" link. &amp;nbsp;In reality, that wasn't my intention. &amp;nbsp;I was hoping for users to click the giant "Try it now" link. &amp;nbsp;Only, as Hisham noted, it doesn't look like a link. &amp;nbsp;It looks like a giant headline.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So I redesigned the homepage, replacing the "Try it now" link with a button (which looks like a button), leaving everything else the same. &amp;nbsp;This resulted in a&amp;nbsp;&lt;b&gt;47% increase&lt;/b&gt; in people clicking "Try it now".&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Of course I kept the button, but I've redesigned the page a couple times since then which also offered a marginal improvement. &amp;nbsp;This is what it looks like today...&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://regexhero.net/"&gt;&lt;img border="0" height="348" src="http://2.bp.blogspot.com/-R5zikFy729Y/T6FrITJmetI/AAAAAAAAAbs/-KUEItG-lgo/s640/regex-hero-homepage.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</description><pubDate>Wed, 02 May 2012 12:16:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/why-i-dont-like-enterprise-software"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>Why I Don't Like Enterprise Software</title><description>&lt;br /&gt;&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="0" height="197" src="http://1.bp.blogspot.com/-_2jkNfg6Ymk/T6AOEKVWlsI/AAAAAAAAAbg/4DkPkGlh0Pw/s320/USS_Enterprise_(NCC-1701),_ENT.jpg" width="320" /&gt;&lt;/div&gt;&lt;br /&gt;Enterprise software is typically designed for medium to large sized businesses. &amp;nbsp;Sometimes small businesses will buy enterprise software as well. &amp;nbsp;In any case, the idea is that it's sold in low volume at high prices. &amp;nbsp;But that's not what bothers me.&lt;br /&gt;&lt;br /&gt;This certainly isn't a hard and fast rule, but in the majority of cases companies will sell support contracts along with their enterprise software. &amp;nbsp;This is because the software is so big an unwieldy that the client will surely run into problems when using it, configuring it, etc.&lt;br /&gt;&lt;br /&gt;But to me, selling support contracts is the source of the problem. &amp;nbsp;The trouble is that once the support contracts become a large portion of their revenue, it really puts the company's motivations in the wrong place. &amp;nbsp;What do I mean by that? &lt;br /&gt;&lt;br /&gt;Well there are two common reasons why a customer will call in for support:&lt;br /&gt;1. They've encountered some sort of technical problem or bug.&lt;br /&gt;2. The software has some major usability issues which basically means it's not as intuitive or self-explanatory as it should be.&lt;br /&gt;&lt;br /&gt;Most of the time the company will put a high priority on fixing the major bugs. &amp;nbsp;Because those will really frustrate the customer and can give the company a bad name. &amp;nbsp;But I feel like the usability issues are often swept under the rug. &amp;nbsp;After all, if the customers continue to call support for problems, then they'll become dependent on support and will be more likely to renew their support contract. &amp;nbsp;For this reason, the balancing act of trying to rake in money from support in addition to software sales is really ugly.&lt;br /&gt;&lt;br /&gt;So what do I suggest instead? &amp;nbsp;Sell the enterprise software for whatever price you need to, and then offer free support. &amp;nbsp;Either that, or offer the software on a subscription basis with a monthly fee and again offer free support. &amp;nbsp;Either way, this puts the motivation in the right place. &amp;nbsp;It's now all about making the software better. &amp;nbsp;It shifts the focus into making the software highly usable, easy to understand, and with great documentation. &amp;nbsp;And that's exactly how it should be anyway.</description><pubDate>Tue, 01 May 2012 10:00:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/user-experience-1-users-dont-read"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>User Experience</category><title>User Experience #1: Users Don't Read</title><description>Users don't read... they scan. &lt;br /&gt;&lt;br /&gt;I came to this conclusion on my own when I worked for TechInsurance. &amp;nbsp;I was the sole web developer for TechInsurance.com and BusinessInsuranceNow.com for 6 years. As I soon found out, my job became much more than just programming. &amp;nbsp;I found that a large portion of my time was spent improving the user experience of the two sites. &amp;nbsp;And I'd find that time and time again, even when the instructions were staring the user in the face, they'd gloss right over it and call us for help. &lt;br /&gt;&lt;br /&gt;You might be tempted to make things&amp;nbsp;&lt;b&gt;bold&lt;/b&gt;, or some sort of &lt;span style="color: red;"&gt;loud &lt;/span&gt;color which surely has its uses. &amp;nbsp;But you have to be careful here, because if you go overboard you can end up with multiple elements fighting for your attention and no real improvement is made. So often the first thing you should focus on is stripping away text that isn't crucial so as to make everything as concise as possible.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;&lt;span style="text-align: left;"&gt;"Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away."&amp;nbsp;&lt;/span&gt;&lt;i style="text-align: left;"&gt;- Antoine de Saint-Exupery&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I've taken this lesson and applied it to BucketSoft products. &amp;nbsp;I've even put it to the test on a few occasions at ux.stackexchange.com. &amp;nbsp;One of the better examples is with &lt;a href="http://ux.stackexchange.com/questions/4038/activation-email-message-optimisation/4045#4045"&gt;this question about email activation&lt;/a&gt;. &amp;nbsp;The person asking the question had a website that required account activation after the user registers. &amp;nbsp;So after the user registers, the site presents the user with this message...&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;&lt;span style="text-align: left;"&gt;Instructions on how to activate your account have beem emailed to you. Please check your email.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="font-family: inherit;"&gt;I felt this could be improved. &amp;nbsp;First, I felt like the word "instructions" made the task sound more daunting than it really is. &amp;nbsp;Second, I thought the user might be glossing over this message if there's nothing there to grab the user's attention. &amp;nbsp;So I suggested changing it to this...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;strong style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;Almost done...&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;We've sent an email to joe.doe@gmail.com. Open it up to activate your account.&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; line-height: 18px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; line-height: 18px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;"Almost done..." is a very effective attention grabber, and with a simple wording change the task now sounds like it'll be a cinch. So after this change, the abandonment rate dropped from 25-30% to 5-10%.&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline; word-wrap: break-word;"&gt;&lt;span style="background-color: white; font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; clear: both; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: baseline; word-wrap: break-word;"&gt;And it turns out there have been other studies that illustrate the importance of being concise and to the point. &amp;nbsp;Jakob Nielsen has been one of the more influential usability experts on the web over the years and he has an article from 1997 titled, "&lt;a href="http://www.useit.com/alertbox/9710a.html"&gt;How Users Read on the Web&lt;/a&gt;." &amp;nbsp;In his article, he came to many of the same conclusions I did. &amp;nbsp;But he has some hard data to back it up. &amp;nbsp;He even mentions that, "In research on how people read websites we found that 79 percent of our test users always scanned any new page they came across; only 16 percent read word-by-word."&lt;/div&gt;</description><pubDate>Sun, 29 Apr 2012 17:30:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/why-are-you-still-hosting-your-own-dns"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Why are you still hosting your own DNS?</title><description>I've worked for a couple of web consulting companies in my career. &amp;nbsp;In both cases, they hosted the websites that they built for their clients in-house, and even hosted their own DNS for those websites. &amp;nbsp;Back then I didn't know any better. &amp;nbsp;And I was a developer and the infrastructure wasn't my responsibility anyway.&lt;br /&gt;&lt;br /&gt;However, today I realize that there's really no point in hosting your own DNS. &amp;nbsp;What it all comes down to is reliability and latency. &amp;nbsp;It might sound like a good idea to throw a couple cheap DNS servers in your closet. &amp;nbsp;But what many people fail to realize is that global latency is a significant factor. &amp;nbsp;It's why &lt;a href="http://blog.bucketsoft.com/2011/06/amazon-cloudfront-vs-rackspace-cloud.html"&gt;content delivery networks&lt;/a&gt; exist, and it's something that should not be ignored. &amp;nbsp;If someone in Australia visits your site hosted in the U.S. then the latency for DNS resolution alone could be as much as 1 second long. &amp;nbsp;In addition to that, unless you have ridiculous network and power redundancy, your DNS is unlikely to be as reliable as a professionally hosted DNS service would be.&lt;br /&gt;&lt;br /&gt;So what I'd recommend instead is a DNS service with &lt;a href="http://www.dnsmadeeasy.com/technology/ip-anycast/"&gt;IP AnyCast&lt;/a&gt; routing. &amp;nbsp;I've been using &lt;a href="http://www.dnsmadeeasy.com/"&gt;DNS Made Easy&lt;/a&gt; for the past 3 years. &amp;nbsp;Below is a map showing their &lt;a href="http://www.dnsmadeeasy.com/technology/network/"&gt;network locations&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-J4R3qMIqWHM/T5WxorxOkAI/AAAAAAAAAbI/bmhJ3eFyep8/s1600/networklocales.jpg" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Essentially, when you sign up you're given 6 DNS addresses (rather than just two that you typically get with GoDaddy). &amp;nbsp;And through their routing techniques, the nearest network location is typically the one that is used for DNS resolution, which in turn keeps latency very low no matter where you are in the world. &amp;nbsp;And with all of this redundancy in place, their uptime is ridiculous and it's something you'd never match with a couple servers in your closet. &amp;nbsp;The icing on the cake, so to speak, is that all of this is very cheap.&lt;br /&gt;&lt;br /&gt;So let's be smart about this. &amp;nbsp;The cheapest option with DNS Made Easy as of today is $30/year for 10 domains and 5 million queries per month. &amp;nbsp;The service is obviously better than anything you could do with your own servers under one roof. &amp;nbsp;And at that price, it's going to be a lot cheaper as well. &amp;nbsp;The conclusion I made is that it's absolutely not worth it to host your own DNS anymore.</description><pubDate>Mon, 23 Apr 2012 15:11:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/optimizing-for-happiness-in-software"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Deep Thoughts</category><category>Company / Business</category><title>Optimizing for Happiness in Software Development</title><description>&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;This is something I've been thinking about a lot lately running my own business and doing contract work on the side. &amp;nbsp;Optimizing for happiness is all about creating a work environment for yourself and those around you where stress and burnout are no longer a concern. &amp;nbsp;And yet you can still get work done, and do it well.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;A little background&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;I started programming when I was 12 as a hobby. &amp;nbsp;But my very first job was actually doing manual labor at age 16. &amp;nbsp;I did maintenance and repairs for a local tennis club. &amp;nbsp;It was a summer job in Texas and my boss had this philosophy about work. &amp;nbsp;He said that in his experience, once you start working too deep into the day you begin making mistakes. &amp;nbsp;Then you spend the next morning undoing your mistakes. &amp;nbsp;So we had hours from 8AM to 3PM, or roughly 6 1/2 hours a day with the lunch break. &amp;nbsp;For those counting, that's about 32 hours a week. &amp;nbsp;I always liked those hours, and I liked his philosophy.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Fast forward a couple years and I began working as a web developer at age 18. &amp;nbsp;This company had your basic 40 hour work weeks. &amp;nbsp;And it was alright for me because I was doing programming for a living and I loved it. &amp;nbsp;I was learning faster during the 3 years of working there than anytime before it. &amp;nbsp;But as my career progressed I began to think more and more that my boss was right. &amp;nbsp;And a shorter work week could be a good thing&amp;nbsp;in the world of software development&amp;nbsp;as well.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;Burnout&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="clear: right; font-family: inherit; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;a href="http://www.blogger.com/goog_2012600576"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/BurnOut.JPG/240px-BurnOut.JPG" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;&lt;span style="font-family: inherit;"&gt;Doctor:&amp;nbsp;Eh... in my opinion you are having a burnout.&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;About 5 years later I was experiencing symptoms of &lt;a href="http://en.wikipedia.org/wiki/Burnout_(psychology)"&gt;burnout&lt;/a&gt;&amp;nbsp;which can be described as, "long-term exhaustion and diminished interest". &amp;nbsp;Deadlines were constantly being missed which feels like a continuous string of failures. &amp;nbsp;There were surely a lot of contributing factors. &amp;nbsp;But however you slice it, it was clear that I had become disenchanted with what I did for a living. &amp;nbsp;It was no coincidence that was the same year that I created BucketSoft.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;When burnout occurs, you might continue working for the company cranking out project after project. &amp;nbsp;But the quality of work will likely suffer, as will your mental and physical health. &amp;nbsp;If you don't recover from it, it'll surely lead to you quitting your job just as I did.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;A better way&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;It's my belief that the way to run a software company is to do the following:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;1. Reduce the number of work hours&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;2. Eliminate deadlines&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Of course this is all about optimizing for happiness and it's obvious that these are very attractive ideas to any employee. &amp;nbsp;But it's more than that.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Let's break it down...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Advantages of &amp;nbsp;&lt;u&gt;reducing the number of work hours&lt;/u&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;1. Improve focus. &amp;nbsp;How many people can claim they have 100% focus every day, 40 hours a week? &amp;nbsp;Focus is absolutely critical in building quality software and it's something we should absolutely optimize for.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;2. By giving your employees a little more time for themselves they're able to take care of personal errands during off hours. &amp;nbsp;And that's exactly how it should be anyway.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Advantages of &lt;u&gt;eliminating deadlines&lt;/u&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;1. Google the words "deadline stress" and you'll find thousands of sources talking about it. &amp;nbsp;The pressure and urgency that comes from a deadline encourages people to work extra hours. &amp;nbsp;But at what cost to your employees?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;2. Improve software quality. &amp;nbsp;What kind of mistakes are going to happen when your employees rush to finish a project within the deadline?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;Don't take my word for it&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Some extremely successful software companies operate with this philosophy.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;At 37signals they work 4 days (32 hours) a week. &amp;nbsp;They've been doing this since 2008 and they've mentioned it in blog posts on several occasions. &amp;nbsp;My favorite is titled, "&lt;a href="http://37signals.com/svn/posts/966-urgency-is-poisonous"&gt;Urgency is poisonous&lt;/a&gt;".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Tom Preston-Werner, the founder of GitHub, also talks about &lt;a href="http://tom.preston-werner.com/2010/10/18/optimize-for-happiness.html"&gt;Optimizing for Happiness&lt;/a&gt;. &amp;nbsp;He says...&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: inherit;"&gt;There are other really great things you can do when you optimize for happiness. You can throw away things like financial projections, &lt;u&gt;hard deadlines&lt;/u&gt;, ineffective executives that make investors feel safe, and everything that hinders your employees from building amazing products.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;And last but not least, there's Balsamiq. &amp;nbsp;They're one of my favorite startups ever and a big inspiration for me in creating BucketSoft. &amp;nbsp;And they &lt;a href="http://blogs.balsamiq.com/team/2011/09/07/pace/"&gt;do not believe in deadlines&lt;/a&gt;&amp;nbsp;either...&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: inherit;"&gt;It may be because we're small and it might change in the future, but the few times I've tried to set a deadline so far, things quickly started to go south. &amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;We started stressing out, not enjoying our work as much and, ultimately, not doing our best work.&lt;/span&gt;&lt;/blockquote&gt;He goes on to say...&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;I also value work/life balance immensely, and believe employee burnout is one of the worst things that can happen to a small business.&lt;/blockquote&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;</description><pubDate>Fri, 16 Mar 2012 19:58:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/maximize-your-chances-of-caching-your"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Maximize Your Chances of Caching Your jQuery</title><description>Many people will include jQuery on their website using the CDN (content delivery network) from Google, Microsoft, or sometimes jQuery themselves. &amp;nbsp;There are &lt;a href="http://docs.jquery.com/Downloading_jQuery"&gt;links for each option on jQuery's site&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This is a good thing for several reasons:&lt;br /&gt;&lt;br /&gt;1. Using a CDN in general is a good idea as you're never going to have good performance worldwide with just a single server. &amp;nbsp;A CDN is optimized to lower the average worldwide latency.&lt;br /&gt;2. Each &lt;a href="http://docs.jquery.com/Downloading_jQuery"&gt;CDN-hosted copy of jQuery&lt;/a&gt; is gzipped.&lt;br /&gt;3. Because so many websites are using these links, there's a good chance that your visitors will have a cached copy of jQuery before ever visiting your site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;There's a catch...&lt;/span&gt;&lt;br /&gt;The whole caching issue depends on the links you're using. &amp;nbsp;I've observed that quite often people aren't linking to exact version numbers of jQuery.&lt;br /&gt;&lt;br /&gt;For example, from code.jquery.com you can reference this file...&lt;br /&gt;http://code.jquery.com/jquery-latest.min.js&lt;br /&gt;&lt;br /&gt;... and you'll always get the latest copy of jQuery.&lt;br /&gt;&lt;br /&gt;Or you can do something similar from Google...&lt;br /&gt;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&lt;br /&gt;&lt;br /&gt;That one from Google will get the latest version, assuming it starts with "1". The trouble is that when you use these references you don't get a far-future expiration date set in the cache-control header. &amp;nbsp;Therefore the user's browser will be checking for updates much too frequently, slowing down your site's load times.&lt;br /&gt;&lt;br /&gt;In fact here's a breakdown of several options and their expiration settings...&lt;br /&gt;&lt;br /&gt;http://code.jquery.com/jquery-latest.min.js &amp;nbsp;&lt;b&gt;(no cache)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js &amp;nbsp;&lt;b&gt;(1 hour)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js &amp;nbsp;&lt;b&gt;(1 hour)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js &amp;nbsp;&lt;b&gt;(1 year)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;So that last one is what I'd recommend using. &amp;nbsp;By explicitly stating the exact version of jQuery you want Google sends back a max-age header of 1 year. &amp;nbsp;So you're greatly increasing the chances that the client will simply use a cached copy. &amp;nbsp;And if a new version of jQuery comes along with bug fixes or features you really want, then just update your link.</description><pubDate>Thu, 08 Mar 2012 16:16:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/bucketsofts-first-profitable-month"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><category>Branding / Marketing</category><title>BucketSoft's First Profitable Month</title><description>These are exciting times.  October was by far the best month for &lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt; ever.  In total there were $450 in sales.  Now, I must say that I have also been doing some contract work on the side to earn some cash for BucketSoft and keep the lights on, so to speak.  So technically I've had profitable months before this.  But if you're just counting product sales and company expenses then October is the month to beat.&lt;br /&gt;&lt;br /&gt;Traffic hasn't changed much during the past few months.  It's consistently been at around 250 visits per day.  So how can we explain this success?  Well, in part I think it's due to the new &lt;a href="http://blog.bucketsoft.com/2011/09/benefits-of-selling-standard-and.html"&gt;Standard / Professional version strategy with Regex Hero&lt;/a&gt;.  It's wild to think that you can spend hundreds of hours on design and development and only see a slow trickle of sales.  Then by employing a simple marketing trick, the sales take off.  &lt;br /&gt;&lt;br /&gt;In fact, here are the sales before and after I began selling the two versions...&lt;br /&gt;&lt;br /&gt;Before (July 1st to August 31st)&lt;br /&gt;&lt;b&gt;$135&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After (September 1st to October 31st)&lt;br /&gt;&lt;b&gt;$510&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;That's nearly 3.8 times more sales in the two month span following this change.  Of course I can't attribute all of that just to this change.  I've also added some functionality to Regex Hero Professional that allows you to save your regular expressions to your local computer (rather than saving it online).  And then I added &lt;a href="http://blog.regexhero.net/2011/10/asynchronous-regex-matching-and.html"&gt;multithreaded regex matching and highlighting&lt;/a&gt;.  Both are welcome improvements, but due to the timeline in which they were released it's impossible to know exactly how much these improvements affected sales.  &lt;br /&gt;&lt;br /&gt;Regardless, it's obvious that BucketSoft is doing better.  I still love working on Regex Hero and I'm encouraged to see what the future might bring.</description><pubDate>Thu, 03 Nov 2011 17:38:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/avoiding-race-conditions-with"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Avoiding Race Conditions with a BackgroundWorker</title><description>Today I released an update to Regex Hero, adding &lt;a href="http://blog.regexhero.net/2011/10/asynchronous-regex-matching-and.html"&gt;asynchronous regex matching and highlighting&lt;/a&gt;.  This is something I've attempted in the past.  But my past attempts resulted in a race condition.  &lt;br /&gt;&lt;br /&gt;What is a race condition you say?  Well, simply put, it's when two or more threads race to an event or line of code.  Sometimes one thread will win the race, and sometimes the other thread will.  What this comes down to is that this inconsistent behavior can cause some strange and unexpected results.&lt;br /&gt;&lt;br /&gt;Now, often times when I've used a BackgroundWorker, it's for a fairly long running task.  The task executes and the user can cancel if they want (which will call CancelAsync behind the scenes).  And everything's just fine.  &lt;br /&gt;&lt;br /&gt;But what if the application calls CancelAsync() &lt;i&gt;very&lt;/i&gt; frequently (after every keypress), and every time it does you want the BackgroundWorker to stop, and then start over?  And what if the execution time ranges from a couple milliseconds to a couple seconds?  Well, as I found, these characteristics can be problematic.&lt;br /&gt;&lt;br /&gt;From MSDN's documentation for the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync(v=VS.95).aspx"&gt;BackgroundWorker.CancelAsync&lt;/a&gt; Method:&lt;br /&gt;&lt;blockquote&gt;Be aware that your code in the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.dowork(v=VS.95).aspx"&gt;DoWork&lt;/a&gt; event handler may finish its work as a cancellation request is being made, and your polling loop may miss &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancellationpending(v=VS.95).aspx"&gt;CancellationPending&lt;/a&gt; being set to true. In this case, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.asynccompletedeventargs.cancelled(v=VS.95).aspx"&gt;Cancelled&lt;/a&gt; flag of System.ComponentModel.RunWorkerCompletedEventArgs in your RunWorkerCompleted event handler will not be set to true, even though a cancellation request was made. This situation is called a &lt;b&gt;race condition&lt;/b&gt; and is a common concern in multithreaded programming. For more information about multithreading design issues, see &lt;a href="http://msdn.microsoft.com/en-us/library/1c9txz50(v=VS.95).aspx"&gt;Managed Threading Best Practices&lt;/a&gt;.&lt;/blockquote&gt;&lt;br /&gt;This is exactly what happened to me.  With every keypress I'd check the BackgroundWorker IsBusy flag.  And if it was busy I'd call CancelAsync().  Then if the Cancelled flag was set to true, I'd call RunWorkerAsync() to start it over.  The thing is, as noted above, calling CancelAsync() doesn't guarantee that the Cancelled flag will be set to true.  And this messed everything up since it meant that the last call to the BackgroundWorker wasn't always made.  So if you're familiar with &lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt;, you can imagine a situation where the highlighted matches aren't accurate because it's not in sync.  And that's bad.&lt;br /&gt;&lt;br /&gt;But of course I found something that works, and that's what this post is all about.  I've rewritten the code and made a simple example to make it easier to follow.  This example is in Silverlight, but of course the same could be done in the full .NET Framework.&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;         #silverlightControlHost {      height: 100%;      text-align:center;     }     &lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="silverlightControlHost"&gt;&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="450" height="300"&gt;     &lt;param name="source" value="http://www.bucketsoft.com/files/AvoidingRaceConditions.xap"/&gt;&lt;param name="background" value="white" /&gt;&lt;param name="minRuntimeVersion" value="4.0.50826.0" /&gt;&lt;param name="autoUpgrade" value="true" /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=4.0.50826.0" style="text-decoration:none"&gt;       &lt;img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/&gt;     &lt;/a&gt;      &lt;/object&gt;&lt;iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;I start by declaring a few variables and initializing the BackgroundWorker...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;private Boolean PerformHashRetry = false;&lt;br /&gt;private HMACSHA256 sha256 = new HMACSHA256();&lt;br /&gt;private UTF8Encoding utf8 = new UTF8Encoding();&lt;br /&gt;private BackgroundWorker PerformHashWorker = new BackgroundWorker();&lt;br /&gt;&lt;br /&gt;public MainPage()&lt;br /&gt;{&lt;br /&gt; InitializeComponent();&lt;br /&gt;&lt;br /&gt; PerformHashWorker = new BackgroundWorker();&lt;br /&gt; PerformHashWorker.WorkerSupportsCancellation = true;&lt;br /&gt; PerformHashWorker.DoWork += PerformHash_DoWork;&lt;br /&gt; PerformHashWorker.RunWorkerCompleted += PerformHash_Completed;&lt;br /&gt;&lt;br /&gt; txtBox.TextChanged += new TextChangedEventHandler(txtBox_TextChanged);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void txtBox_TextChanged(object sender, TextChangedEventArgs e)&lt;br /&gt;{&lt;br /&gt; PerformHash();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Here's my PerformHash() function, which decides whether to run the background worker, or cancel it and signal it to run again...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;void PerformHash()&lt;br /&gt;{&lt;br /&gt; if (PerformHashWorker.IsBusy)&lt;br /&gt; {&lt;br /&gt;  PerformHashRetry = true;&lt;br /&gt;  PerformHashWorker.CancelAsync();&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  PerformHashRetry = false;&lt;br /&gt;  PerformHashWorker.RunWorkerAsync(txtBox.Text);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Then the PerformHash_DoWork() function is pretty straightforward.  I've set it up for 10,000 iterations so the delay will be noticeable.  However, notice how it checks for the CancellationPending flag, so it can terminate early if necessary...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;void PerformHash_DoWork(object sender, DoWorkEventArgs e)&lt;br /&gt;{&lt;br /&gt; for (int i = 0; i &lt; 10000; i++)&lt;br /&gt; {&lt;br /&gt;  Byte[] HashValue = sha256.ComputeHash(utf8.GetBytes((string)e.Argument + i.ToString()));&lt;br /&gt;  e.Result = utf8.GetString(HashValue, 0, HashValue.Length);&lt;br /&gt;&lt;br /&gt;  if (PerformHashWorker.CancellationPending)&lt;br /&gt;  {&lt;br /&gt;   e.Cancel = true;&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Last, but certainly not least, there's the PerformHash_Completed() function...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;code&gt;&lt;br /&gt;void PerformHash_Completed(object sender, RunWorkerCompletedEventArgs e)&lt;br /&gt;{&lt;br /&gt; if (PerformHashRetry || e.Cancelled) // instead of relying solely on the e.Cancelled flag, we're also using our global PerformHashRetry variable&lt;br /&gt; {&lt;br /&gt;   // This is where the magic happens.  &lt;br /&gt;   // If the BackgroundWorker has been flagged for a retry, &lt;br /&gt;   // then we call PerformHash to start this whole process over.&lt;br /&gt;   // By doing it this way, race conditions can be avoided and&lt;br /&gt;   // the last call to the BackgroundWorker will always be made. &lt;br /&gt;  PerformHash();&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; txtHash.Text = (string)e.Result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.bucketsoft.com/files/AvoidingRaceConditions.zip"&gt;Download AvoidingRaceConditions.zip&lt;/a&gt; (Visual Studio 2010 project) to try this out yourself.&lt;br /&gt;</description><pubDate>Thu, 06 Oct 2011 17:48:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/benefits-of-selling-standard-and"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Branding / Marketing</category><title>The Benefits of Selling Standard and Professional Versions</title><description>In February I posted a question on the Regex Hero Blog, &lt;a href="http://blog.regexhero.net/2011/02/which-trial-experience-do-you-prefer.html"&gt;which trial experience do you prefer?&lt;/a&gt;  There aren't a great many people who read that blog so I only got 3 votes, but they were unanimous...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make Regex Hero full-featured for everyone but with a nag popup every 5 minutes for non-paying customers. &lt;b&gt;3 votes (100%)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Leave it as is with a trial where you can sign up to evaluate the software uninterrupted for 64 days. &lt;b&gt;0 votes&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;3 votes is not as conclusive as I'd like but I did think it was interesting that everyone preferred the full-featured / nag popup approach.  This was a surprise because I thought everyone hated popups.  In addition to this bit of information, I learned something valuable about marketing from Dan Ariely.  From his book &lt;a href="http://www.amazon.com/gp/product/0061854549/ref=as_li_ss_tl?ie=UTF8&amp;tag=bucke04-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399369&amp;creativeASIN=0061854549"&gt;Predictably Irrational&lt;/a&gt;, he states, "When Williams-Sonoma introduced bread machines, sales were slow. When they added a "deluxe" version that was 50% more expensive, they started flying off the shelves; the first bread machine now appeared to be a bargain."&lt;br /&gt;&lt;br /&gt;So the past few days I've been working towards a solution that I'm hoping will make most people happy while also resulting in more sales.  Essentially I've ditched the free-but-limited version entirely in favor of a new "Standard" version which sells for $10.  The Standard version has more features than the free version it replaces, but not as many as the professional version.  And like the free version, the standard version is what people will be using when they first come to the site, except that they'll see this old nag popup every 5 minutes...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-zh-OZETWi34/TmU-d5CkmiI/AAAAAAAAAV4/RSIAjJGSqT4/s1600/nag-standard-professional.PNG" /&gt;&lt;/div&gt;&lt;br /&gt;The whole nag popup thing is annoying, but then again so is a limited trial.  At least the nag popup has some advantages.  Because you can close the popup as many times as you'd like, this allows for a variable trial period.  By contrast, sometimes a potential customer could be annoyed by a 30-day trial if they're not using the software frequently enough to properly evaluate it during those 30 days.  Then they'll want to re-evaluate the software months down the road, but they can't because it's expired (happens to me all the time).  It also means that the user doesn't have to register or do anything special to start the trial.  They literally navigate to &lt;a href="http://regexhero.net/tester/"&gt;regexhero.net/tester&lt;/a&gt; and just start using the software.  I think breaking down that barrier to entry has huge advantages.&lt;br /&gt;&lt;br /&gt;And then the "Professional" version has moved upmarket to $20, and it now provides the ability to save your regular expressions locally with the desktop version.  This whole Standard / Professional idea was taken right out of Dan Ariely's book.  It's nothing new of course, but I never understood what influences having different product editions could make on the buying decision.  If the anecdote about bread machines has any parallels to software, one could assume this will result in more sales of Regex Hero.  So I'll track sales for the next couple months and post back here with the results.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;br /&gt;You can read all about the results of this change in my new article, &lt;a href="http://blog.bucketsoft.com/2011/11/bucketsofts-first-profitable-month.html"&gt;BucketSoft's First Profitable Month&lt;/a&gt;.</description><pubDate>Mon, 05 Sep 2011 16:31:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/amazon-cloudfront-vs-rackspace-cloud"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Amazon CloudFront vs RackSpace Cloud Files Performance Testing</title><description>I've been using Amazon S3 coupled with Amazon CloudFront as my CDN for about half a year now.  It's been a great service.  It's fast and cheap, and relatively easy to set up.  There's no monthly fee as they charge purely on usage.  My sites are only receiving a few hundred visits a day collectively.  And all I'm using the CDN for are small images so far, so it's only been costing me about 10 cents a month.  Yep, 10 cents.&lt;br /&gt;&lt;br /&gt;But after a &lt;a href="http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html"&gt;recent post at Coding Horror&lt;/a&gt;, I was left wondering if perhaps there was something even better than Amazon CloudFront that wasn't orders of magnitude more expensive.&lt;br /&gt;&lt;br /&gt;Turns out, there is.  It's called RackSpace Cloud Files.  Pricing is comparable to Amazon and is based on usage, but RackSpace uses the Akamai network.  Akamai has been around a long time and has a huge widespread network with servers deployed in 72 countries.  As a result their speed is good pretty much everywhere.&lt;br /&gt;&lt;br /&gt;So I signed up with RackSpace today and performed some tests with &lt;a href="http://www.webpagetest.org/"&gt;webpagetest.org&lt;/a&gt;.  I tested 7 locations which I chose loosely based on the traffic I actually receive from different parts of the world.  And to keep it simple, I was loading an 18KB jpg.  Because bandwidth on these test servers can sometimes fluctuate, I ran each test twice and recorded the faster times for each respective location.&lt;br /&gt;&lt;br /&gt;Below are the results...&lt;br /&gt;&lt;br /&gt;&lt;img src="https://docs.google.com/spreadsheet/oimg?key=0AjHNyHwc6VXKdHNjOE5QeVZUQUotMWhXallBQjZ3eVE&amp;oid=1&amp;zx=nz5ritm5uz9d" /&gt;&lt;br /&gt;&lt;br /&gt;So RackSpace wins in 5 out of 7 locations.  If you add up the load times of this sampling you'll get 5.645 seconds for Amazon CloudFront and 4.203 seconds for RackSpace Cloud Files.  So RackSpace is about 34% faster in my tests.  The location that really stands out is Australia which is roughly 4X faster with RackSpace.  And then Amazon seems to be faster in India, but not by nearly as large of a margin.  Some of the others are a little closer to call, and it may be a different story at a different time of day (too many variables to predict).  But it's pretty clear that the abundant Akamai network being available in so many locations has its advantages.&lt;br /&gt;&lt;br /&gt;At this point though, the big reason I'm switching to RackSpace is that they support gzip compression natively.  Up until now I've mostly just been using a CDN for images, where gzip doesn't help a thing anyway.  But I'd like to push my css and js files to a CDN if only the CDN supported gzip.  You &lt;i&gt;can&lt;/i&gt; use gzip with Amazon CloudFront if you &lt;a href="http://aws.amazon.com/about-aws/whats-new/2010/11/09/cloudfront-adds-support-for-custom-origins-and-sla/"&gt;set up a Custom Origin&lt;/a&gt;, but this looked like a bit of hassle.  &lt;br /&gt;&lt;br /&gt;RackSpace, however, enables gzip compression automatically for any css or js file you upload.  So now that gzip is at my disposal, I'm in the process of moving even more content over to the CDN world in hopes of making my sites unbelievably fast.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE (February 21, 2012)&lt;br /&gt;I found that RackSpace had become sporadically slow the past few months. &amp;nbsp;Some days it would be blazing fast while others would be painfully slow (like 5 seconds to download an image less than 50 KB in size). &amp;nbsp;My guess is that the DNS was slow to resolve but it was tough to find out since it was so inconsistent. &lt;br /&gt;&lt;br /&gt;Anyway, today I switched back to Amazon for hosting my images. &amp;nbsp;And then I'm serving up my css and js with my own server again. &amp;nbsp;This solution seems to work pretty well and I'll stick with it for now. &lt;br /&gt;&lt;br /&gt;Hopefully one of two things will happen:&lt;br /&gt;1. RackSpace will solve the inconsistent performance problems I was experiencing.&lt;br /&gt;2. Amazon CloudFront/S3 will introduce native support for gzip.</description><pubDate>Sat, 25 Jun 2011 13:47:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/windows-eye-tracking-awesome"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Windows + Eye Tracking = Awesome</title><description>I have a habit of checking out the videos at Microsoft's Channel 9 every day.  I tend to skip around but in general I like to stay up to date on what's going on.  Today they posted one of the coolest videos I've seen in a long time... &lt;a href="http://channel9.msdn.com/posts/A-New-NUI-Tobii-Eyetracking-Hardware#time=0h9m12s"&gt;A New NUI - Tobii Eyetracking Hardware&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(I linked to the start of the demonstration because talking about it doesn't do it justice.)</description><pubDate>Thu, 12 May 2011 13:05:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/following-my-dream-new-life-in-colorado"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>Following My Dream : A New Life in Colorado</title><description>I've had a dream for years to create my own software company and start a new life in Colorado.  Of course I founded BucketSoft back in 2009.  But today I'm proud to say I'm living at 6,500 feet.  I moved into my new apartment in Colorado Springs on April 11th.&lt;br /&gt;&lt;br /&gt;The apartment is in southwest Colorado Springs near Cheyenne Mountain (home of NORAD).  It's a truly beautiful part of the city, and I think I'll be happy here.&lt;br /&gt;&lt;br /&gt;I've taken a few pictures around the general area...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swortham.smugmug.com/Other/Colorado-Springs-Apartment/i-qDz4Frn/0/XL/c%3Ausersstevepictures2011-04-17%20deerdeer%20014-XL.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://swortham.smugmug.com/Other/Colorado-Springs-Apartment/i-qDz4Frn/0/M/c%3Ausersstevepictures2011-04-17%20deerdeer%20014-M.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This deer was just kickin' it behind my apartment.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1311/1040534701_uhWTX-X2.jpg"&gt;&lt;img src="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1311/1040534701_uhWTX-M.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;The nearby mountains.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/030/1035256207_wyTZ4-X2.jpg"&gt;&lt;br /&gt;&lt;img src="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/030/1035256207_wyTZ4-M.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is on the way to a park a couple miles away.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1283/1040518346_vHbBS-X2.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1283/1040518346_vHbBS-M.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;I just like this picture.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1308/1040533429_JZhNN-X2.jpg"&gt;&lt;img src="http://swortham.smugmug.com/Vacation/Colorado-Vacation-2010/IMG1308/1040533429_JZhNN-M.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Overlooking Colorado Springs from Cheyenne Mountain Zoo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://blog.bucketsoft.com/2011/03/finally-moving-to-colorado-this-april.html"&gt;I've said before&lt;/a&gt;, Colorado Springs strikes a nice balance.  It's beautiful, but it's not too expensive or too remote.  I mean, I have every modern convenience up here including a smoking fast internet connection. Of course it'd be nice if there was an even stronger technology presence here.  Most of the big technology companies, conferences, and such are going to be in Denver or Boulder.  Nevertheless, it's a pretty cool spot.</description><pubDate>Tue, 03 May 2011 16:09:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/my-favorite-marketing-videos"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Branding / Marketing</category><title>My Favorite Marketing Videos</title><description>I constantly look for inspiration and education outside of programming.  After all, programming all the time makes Steve a dull boy.  The talks below were truly remarkable and are worth sharing.&lt;br /&gt;&lt;br /&gt;First up is Malcolm Gladwell who talks about the revelations behind spaghetti sauce made by Howard Moskowitz.  He sheds some light on variances in human behavior, which all comes down to personal taste.  He even demonstrates how an individual doesn't necessarily know what they want.  As Howard Moskowitz puts it: there is no perfect sauce, there are only perfect sauces...&lt;br /&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/MalcolmGladwell_2004-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MalcolmGladwell-2004.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=20&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=malcolm_gladwell_on_spaghetti_sauce;year=2004;theme=food_matters;theme=tales_of_invention;theme=unconventional_explanations;theme=not_business_as_usual;theme=what_makes_us_happy;event=What+Makes+Us+Happy%3F;tag=Business;tag=Culture;tag=choice;tag=economics;tag=food;tag=marketing;tag=media;tag=shopping;tag=storytelling;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/MalcolmGladwell_2004-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MalcolmGladwell-2004.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=20&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=malcolm_gladwell_on_spaghetti_sauce;year=2004;theme=food_matters;theme=tales_of_invention;theme=unconventional_explanations;theme=not_business_as_usual;theme=what_makes_us_happy;event=What+Makes+Us+Happy%3F;tag=Business;tag=Culture;tag=choice;tag=economics;tag=food;tag=marketing;tag=media;tag=shopping;tag=storytelling;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dan Ariely is a behaviorial economist.  His research is truly fascinating and in many cases defies logic.  He talks about how seemingly irrational human behavior affects major decisions.  And you don't have to know much to see the implications in marketing...&lt;br /&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/DanAriely_2008P-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DanAriely-2008P.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=548&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=dan_ariely_asks_are_we_in_control_of_our_own_decisions;year=2008;theme=unconventional_explanations;theme=speaking_at_ted2009;event=A+Taste+of+TED2009;tag=Culture;tag=Global+Issues;tag=Science;tag=economics;tag=psychology;tag=society;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/DanAriely_2008P-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/DanAriely-2008P.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=548&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=dan_ariely_asks_are_we_in_control_of_our_own_decisions;year=2008;theme=unconventional_explanations;theme=speaking_at_ted2009;event=A+Taste+of+TED2009;tag=Culture;tag=Global+Issues;tag=Science;tag=economics;tag=psychology;tag=society;"&gt;&lt;/embed&gt;&lt;/object&gt;</description><pubDate>Wed, 20 Apr 2011 16:26:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/so-im-software-designer-now"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>So I'm a Software Designer Now</title><description>I've been digging through stuff, packing, and preparing for my move and I just found an old year book from Elementary School.  I came across a page that I had filled out in the year book, answering a number of questions.  And it turns out that I wanted to be a Software Designer even back in the 6th grade.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hoSvx3oytco/TZJQwK5s6jI/AAAAAAAAAR4/58MyuZirc08/s1600/grow-up.jpg" imageanchor="1" style=""&gt;&lt;img border="0" height="81" width="400" src="http://1.bp.blogspot.com/-hoSvx3oytco/TZJQwK5s6jI/AAAAAAAAAR4/58MyuZirc08/s400/grow-up.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I didn't realize that I had it all figured out at such a young age.  In fact, I don't know how to best describe what I do today.  The ubiquitous title, "Software Developer" isn't bad.  But now that I am truly on my own I'm responsible for the planning, design, and development of my products from start to finish.  As such I've been concentrating on improving in disciplines outside of just programming.  So now I'm liking the title I came up with in 6th grade, "Software Designer."&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_design"&gt;&lt;b&gt;Software design&lt;/b&gt; is a process of problem-solving and planning for a software solution.&lt;/a&gt;&lt;/blockquote&gt;</description><pubDate>Tue, 29 Mar 2011 16:13:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/finally-moving-to-colorado-this-april"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>Finally Moving to Colorado this April</title><description>I've been talking about it a long time. &amp;nbsp;Now I'm making the move for real. &amp;nbsp;I'll be moving into a new apartment in Colorado Springs on April 11th. &amp;nbsp;It's on the west side of the city near the mountains.&lt;br /&gt;&lt;br /&gt;Why Colorado Springs?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The mountains. &amp;nbsp;I love mountain biking, or hiking to the top of a mountain, or any kind of activity near mountains, really. &amp;nbsp;I think the Pikes Peak Hill Climb might be fun to watch. &amp;nbsp;And although I'll be in desperate need of lessons, I want to try snowboarding too.&lt;/li&gt;&lt;li&gt;The weather. &amp;nbsp;Some don't think they'd like Colorado because they don't like the cold. &amp;nbsp;In reality, it's not that bad. &amp;nbsp;On average it's about 20 degrees cooler year round in Colorado Springs than here in Dallas. &amp;nbsp;But because the air is so dry up there, the cold doesn't bite into you like you might expect. &amp;nbsp;And then the payoff of course are the mild summers with highs in the 70s and 80s.&lt;/li&gt;&lt;li&gt;My allergies, or lack thereof. &amp;nbsp;Dallas has always been bad for my allergies. &amp;nbsp;But I've been to Colorado 6 times and I always spend a lot of time outside. &amp;nbsp;Even still, my allergies barely affect me up there.&lt;/li&gt;&lt;li&gt;It's a beautiful place without being too expensive, or too remote. &amp;nbsp;That's a delicate balance, but it's what makes it the right place for me.&lt;/li&gt;&lt;/ol&gt;</description><pubDate>Thu, 03 Mar 2011 14:11:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/road-more-traveled-is-road-less-paid"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Deep Thoughts</category><category>Company / Business</category><title>A Road More Traveled is a Road Less Paid</title><description>You can certainly look at success in different ways.  One of my projects in particular has taken up a lot of my time. &amp;nbsp;But it's also been one of the more enjoyable projects I've ever worked on. &amp;nbsp;It's been a good learning experience, and it's a good feeling to have helped as many people as it has. &amp;nbsp;It's called&amp;nbsp;&lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt;.  And it has received a good amount of attention since I launched it in April 2009, which in turn is good attention for BucketSoft.&lt;br /&gt;&lt;br /&gt;In fact, it continues to grow in popularity...&lt;br /&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://3.bp.blogspot.com/-efeZpJupHWM/TVv06HKtn7I/AAAAAAAAARg/7vJKr01OeOA/s1600/stats-2009-2011.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-efeZpJupHWM/TVv06HKtn7I/AAAAAAAAARg/7vJKr01OeOA/s1600/stats-2009-2011.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;40,000 visits overall, and lately over 3,000 visits a month. &amp;nbsp;And this February looks like it'll be a record-breaking month in terms of traffic. &amp;nbsp;On top of that it's now the #2 ranked regex tester out there according to &lt;a href="http://alternativeto.net/software/regex-hero/"&gt;AlternativeTo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In terms of sales, however, the numbers have not been as spectacular...&lt;br /&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://2.bp.blogspot.com/-Vmr9oosjrtM/TVv1n7050pI/AAAAAAAAARo/xoL8KPrFvRg/s1600/sales-2009-2011.PNG" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Vmr9oosjrtM/TVv1n7050pI/AAAAAAAAARo/xoL8KPrFvRg/s1600/sales-2009-2011.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;18 sales overall. &amp;nbsp;Or about $270. &amp;nbsp;Taking a conservative estimate of 1,000 hours of design and development time I've spent, that amounts to 27 cents/hour. &amp;nbsp;I've found that most people are satisfied with using the free version. &amp;nbsp;That really illustrates to me how hard it can be to sell software today. &amp;nbsp;It also reminds me of a piece of advice I heard recently in a talk by Peldi (founder of Balsamiq). &amp;nbsp;He said, "Don't look for an idea. &amp;nbsp;Look for a problem." &amp;nbsp;I think that holds true of Regex Hero. &amp;nbsp;I didn't really solve a big enough problem with Regex Hero. &amp;nbsp;I merely created an alternative to many other similar tools. &amp;nbsp;It has a richer feature set than any of the free tools, but most people aren't willing to pay for that.&lt;br /&gt;&lt;br /&gt;Despite its lack of financial success, I'm not one to give up on a website. &amp;nbsp;Regex Hero is not going anywhere but up. &amp;nbsp;You can look at my track record. &amp;nbsp;&lt;a href="http://gldomain.com/"&gt;GLdomain.com&lt;/a&gt;, for example, is a site I created in 1999 when I was in high school. &amp;nbsp;Some of the work I did then was published in a book called &lt;a href="http://glbook.gamedev.net/oglgp.asp"&gt;OpenGL Game Programming&lt;/a&gt;. &amp;nbsp;And one of my screen savers from that site was published on 3dfiles.com (now GameSpot), and was downloaded over 75,000 times in 2000. &amp;nbsp;Even though much of what you see on gldomain is outdated by today's standards, there are still people looking at it everyday. &amp;nbsp;They're downloading my work, studying my tutorials, and hopefully it's helping a few people. &lt;br /&gt;&lt;br /&gt;So just because it's costing me more money to host GLdomain and Regex Hero than what I make from them, doesn't mean I'm going to take them down. &amp;nbsp;That's not going to happen in my lifetime.</description><pubDate>Wed, 16 Feb 2011 11:09:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/introducing-silverlightxapcom-royalty"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>Introducing SilverlightXAP.com : Royalty Free Silverlight Controls</title><description>After about a year in the making I have launched &lt;a href="http://www.silverlightxap.com/"&gt;SilverlightXAP.com&lt;/a&gt;.  Originally the site was called Silverlight Shaders and was going to be dedicated to Silverlight pixel shaders, but that was decidedly short-sighted.  SilverlightXAP is an online marketplace for Silverlight controls.  I expect the range of products to be broader since a Silverlight control can be just about anything.  And in keeping with the spirit of the original idea, I even created a control that involves a pixel shader called the &lt;a href="http://www.silverlightxap.com/controls/27/saturation-rollover-effect"&gt;saturation rollover effect&lt;/a&gt;.  I have also launched the site with some &lt;a href="http://www.silverlightxap.com/controls/tagged/silverlight-sdk"&gt;controls stripped from the Silverlight SDK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The idea behind SilverlightXAP is similar to Zune Marketplace or the iPhone app store.  A developer submits a control to the site and sets their price.  I then review, test, obfuscate, and publish the control.  The developer then gets up to 70% of every sale of their controls.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.silverlightxap.com/developers/information" imageanchor="1" style=""&gt;&lt;img border="0" height="165" width="850" src="http://www.silverlightxap.com/images/developer-illustration.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;These past few weeks have been intense.  I've been spending 50 or 60 hours a week, and working right through the weekends.  I've been so focused on building the site that I've forgotten things that should be routine.  Someone might ask me, did you shower today?  And I think to myself and simply say, "I don't remember."  Now that the site is released, I hope to finish up some things and then restore my life/work balance.&lt;br /&gt;&lt;br /&gt;Beyond the hectic pace, this site has been more involved than other recent projects as there's a lot to think about on the business side of things.  But I found a lawyer named Matt Thomson from Kronenberger Burgoyne who specializes in all things internet.  He drafted an online distribution agreement and end user license agreement for me last November.  That took care of my biggest concerns around copyright infringement and such.  He also answered a lot of questions I had and affirmed for me that my idea was sound.&lt;br /&gt;&lt;br /&gt;Anyway, the site is brand new and the collection is a meager 5 controls at the moment.  But in the next few weeks I'll be pursuing various avenues in getting the word out.  I know that it's absolutely critical that I find Silverlight developers other than myself who are willing to contribute.</description><pubDate>Fri, 21 Jan 2011 14:12:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/100-bucketsoft"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>100% BucketSoft</title><description>I'm now &lt;a href="http://blog.bucketsoft.com/2010/08/when-plan-comes-together.html"&gt;on my own&lt;/a&gt; and for the past 2.5 months I've been working on BucketSoft products full time.  After years of working for various small companies this is certainly a big change.  I no longer set my alarm clock.  I write code when I'm inspired.  And I only pursue what I'm interested in.&lt;br /&gt;&lt;br /&gt;As of late I've been putting my hours into 3 areas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blog.bucketsoft.com/2010/11/new-apps-for-windows-phone-7.html"&gt;Apps for Windows Phone 7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt; improvements&lt;/li&gt;&lt;li&gt;And a slightly modified version of my SilverlightShaders.net idea (it will have a different domain name)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;That last one is something I've spent a lot of time on. &amp;nbsp;I won't be sharing many details just yet. &amp;nbsp;It's been a little more involved than some of my other projects not just technically but logistically.  It is coming along nicely though.  I'm particularly proud of the search engine and the product feedback functionality.  I wish I could say more but I should be ready to launch by this coming February.&lt;/div&gt;</description><pubDate>Thu, 16 Dec 2010 22:12:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/smugmug-viewer-for-windows-phone-7"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>SmugMug Viewer for Windows Phone 7</title><description>&lt;h2 style="font-size: 32pt; line-height: 0; margin: 35px 0 20px 0;"&gt;SmugMug Viewer&lt;/h2&gt;&lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;amp;id=55a46068-98f1-df11-9264-00237de2db9e" style="font-size: 22pt;"&gt;&lt;strong&gt;Download&lt;/strong&gt; from Zune Marketplace&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Supports password-protected SmugMug profiles and galleries&lt;/li&gt;&lt;li&gt;Automatically saves previously visited SmugMug profiles&lt;/li&gt;&lt;li&gt;Images are progressively downloaded for a smooth user experience&lt;/li&gt;&lt;li&gt;Supports flick and pinch-to-zoom gestures&lt;/li&gt;&lt;li&gt;Caches images for quick review&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I love &lt;a href="http://www.smugmug.com/"&gt;SmugMug&lt;/a&gt;.  In my opinion they have the best online photo gallery site in the business.  One of the things that sets them apart is their beautiful UI which properly adapts to your screen resolution.  As a result, it's faster and more intuitive to browse through your pictures on their site than any other.&lt;br /&gt;&lt;br /&gt;So I wanted to bring those same qualities to this app.  One of the bigger challenges with a phone is its relatively slow connection speeds.  And I designed the app to minimize bandwidth and wait times by downloading the proper resolution images at the proper times.  When you choose a gallery, you'll see tiny thumbnails appear.  When you click a thumbnail, the thumbnail image itself blows up to fill the screen, while a higher res image is being downloaded to replace it.  You can also pinch to zoom in on a picture, or flick it left or right to go to the previous or next picture.  All of these images are also cached on the phone so once downloaded they are quick to review.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_uAFGogqHOtg/TOwl_bFM4OI/AAAAAAAAAP4/iMQP9RdjAss/s1600/screen2.png" imageanchor="1" style="margin: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_uAFGogqHOtg/TOwl_bFM4OI/AAAAAAAAAP4/iMQP9RdjAss/s320/screen2.png" width="192" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_uAFGogqHOtg/TOwmCOo8kVI/AAAAAAAAAP8/AYtYq67Hdsw/s1600/screen3.png" imageanchor="1" style="margin: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_uAFGogqHOtg/TOwmCOo8kVI/AAAAAAAAAP8/AYtYq67Hdsw/s320/screen3.png" width="192" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_uAFGogqHOtg/TOarFxnMKhI/AAAAAAAAAP0/my7Ei6dv4dM/s1600/screen4.png" imageanchor="1" style="margin: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_uAFGogqHOtg/TOarFxnMKhI/AAAAAAAAAP0/my7Ei6dv4dM/s320/screen4.png" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just received my first review...&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;SUHASMD (3 out of 5 stars)&lt;/strong&gt;&lt;br /&gt;Would love to see how this app evolves, like the ability to login, to include uploading pictures from a gallery on the phone or directly from the camera to SmugMug.  Would love a thumbnail view of the galleries or the ability to sort galleries by date with a default for recently updated at the top.&lt;/blockquote&gt;Excellent feedback.  I like the idea for the default sort order.  I would like to add a thumbnail next to each gallery, but because of the amount of data required to do this I'm afraid it'll slow the initial loading time too much.  But I definitely want the ability to upload pictures.  I'll get to work.</description><pubDate>Fri, 19 Nov 2010 10:56:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/new-apps-for-windows-phone-7"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>New Apps for Windows Phone 7</title><description>I got my Samsung Focus last Tuesday (November 9th), the day after it became available, in fact.  I mostly got it just so I could develop apps for it.  You see, the development platform of choice for Windows Phone 7 is Silverlight, and I love Silverlight.  After everything I've learned developing &lt;a href="http://regexhero.net/"&gt;Regex Hero&lt;/a&gt; I've gotten pretty handy with it too.  &lt;br /&gt;&lt;br /&gt;As if Silverlight wasn't enough motivation, the Windows Phone 7 OS is pretty slick as well.  I think Microsoft did a lot of things right which will make these phones far more popular than their predecessors.&lt;br /&gt;&lt;br /&gt;For those reasons I'm motivated to get my work out there in the marketplace for this phone.  And I cranked out a couple of apps over the past week.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_uAFGogqHOtg/TOKyD_7i8RI/AAAAAAAAAPo/tpClhbCVFFE/s1600/0-60-screen1.PNG" imageanchor="1" style="float: left; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_uAFGogqHOtg/TOKyD_7i8RI/AAAAAAAAAPo/tpClhbCVFFE/s320/0-60-screen1.PNG" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong style="font-size: 150%"&gt;0-60 mph Calculator for Cars&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;id=7f68e956-8eea-df11-9264-00237de2db9e"&gt;&lt;strong&gt;Download&lt;/strong&gt; from Zune Marketplace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This calculator has exactly the same functionality as my site &lt;a href="http://www.060calculator.com/"&gt;060calculator.com&lt;/a&gt;.  But for the phone it's a little more handy to use as an app.  Put simply, it estimates a car's 0-60 time based off of horsepower, weight, drive wheels, and transmission type.  It's built around statistical averages that are more heavily influenced by these factors than anything else.  In other words, if you could only choose 4 pieces of information to build a best-fit formula, these would be the best to go by.  It's simple, surprisingly accurate, and addictive.  The website has been visited over 130,000 times and now this little app is seeing some action as well.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_uAFGogqHOtg/TOK1KodDO0I/AAAAAAAAAPs/3CtdkJAqUDQ/s1600/screen3.png" imageanchor="1" style="margin-right: 1em; float: left;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_uAFGogqHOtg/TOK1KodDO0I/AAAAAAAAAPs/3CtdkJAqUDQ/s320/screen3.png" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong style="font-size: 150%"&gt;SmugMug Viewer&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://social.zune.net/redirect?type=phoneApp&amp;id=55a46068-98f1-df11-9264-00237de2db9e"&gt;&lt;strong&gt;Download&lt;/strong&gt; from Zune Marketplace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I love &lt;a href="http://www.smugmug.com"&gt;SmugMug&lt;/a&gt;.  In my opinion they have the best online photo gallery site in the business.  One of the things that sets them apart is their beautiful UI which properly adapts to your screen resolution.  As a result, it's faster and more intuitive to browse through your pictures on their site than any other.&lt;br /&gt;&lt;br /&gt;So I wanted to bring those same qualities to this app.  One of the bigger challenges with a phone is its relatively slow connection speeds.  And I designed the app to minimize bandwidth and wait times by downloading the proper resolution images at the proper times.  When you choose a gallery, you'll see tiny thumbnails appear.  When you click a thumbnail, the thumbnail image itself blows up to fill the screen, while a higher res image is being downloaded to replace it.  All of these images are also cached on the phone so once downloaded they are quick to review.&lt;br /&gt;&lt;br /&gt;The first release of this app is completely free and light on features, but I have more planned for it.</description><pubDate>Tue, 16 Nov 2010 11:01:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/when-plan-comes-together"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>When a Plan Comes Together</title><description>I've worked for TechInsurance.com for about 6 years now.  I've been their sole web developer all this time and it has been a big job.  Since I've been there I've learned a tremendous amount about providing good support and creating highly usable interfaces.  And I've worked with people with a vast pool of experience.  Their technical infrastructure combined with a really good &amp; dedicated group of people is what sets them apart from other insurance agencies.  It's been a great company to work for and I just know they'll continue to thrive.&lt;br /&gt;&lt;br /&gt;But my desire to work for BucketSoft has taken over and I gave my notice a couple weeks ago.  My final day at TechInsurance will be September 24th.  And my &lt;a href="http://blog.bucketsoft.com/2010/04/my-future-plans-full-time-colorado-dog.html"&gt;plan that I talked about in April&lt;/a&gt; is about to be set in motion.&lt;br /&gt;&lt;br /&gt;My first priority will be moving to Colorado.  Once I'm settled in up there I will be once again coding every day.  Only this time 100% of my computer time will be spent on BucketSoft products.  I can hardly wait to finally act on some of my ideas.  It's going to be an exciting time for me, and an exciting time for BucketSoft.  Stay tuned.</description><pubDate>Fri, 27 Aug 2010 16:34:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/my-future-plans-full-time-colorado-dog"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>My Future Plans: Full-Time, Colorado, and a Dog</title><description>As I devote more and more time to BucketSoft and BucketSoft products, I can't help but think of my future plans.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Alaskan_Malamute_R_Bartz.jpg/220px-Alaskan_Malamute_R_Bartz.jpg" style="float: right" alt="Malamute" /&gt;I expect a few key things will happen in the next 12 to 16 months:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I'll quit my day job so that I may work on BucketSoft full-time.  This is a big deal that'll mark a new chapter in my life.  I look forward to it with a nervousness that's hard to explain.  This is everything I've worked towards.  And after this BucketSoft will be my livelihood.&lt;/li&gt;&lt;li&gt;I'll move to Colorado (most likely Colorado Springs).  I've been to Colorado on five separate occasions and I love it up there.  The snowy winters, mild summers, beautiful mountains... what is there to complain about?  I'm a young single guy so if I'm going to make the move then now is the time to do it.  Nearly all of my family lives in Texas so this is a big deal too.  They will be sorely missed, but I'm hoping they'll visit often.&lt;/li&gt;&lt;li&gt;Next fall when I get an Alaskan Malamute I will name him "Burrito" in honor of &lt;a href="http://www.joelonsoftware.com/items/2010/03/14.html"&gt;Joel Spolsky&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;Anyway, if two out of three of those things happen I'll be pretty happy about it.</description><pubDate>Mon, 19 Apr 2010 15:20:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/upgraded-to-virtual-dedicated-server"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Upgraded to a Virtual Dedicated Server from Orcs Web</title><description>So for the past several months I've been running BucketSoft.com, RegexHero.net, SilverlightXAP.com, and 060calculator.com all on a shared server with GoDaddy.  It's actually served me well for the most part.  But there are some limitations with shared servers.  I couldn't set up things like content expiration and gzip compression for js and css files.  And I couldn't easily set up dynamic gzip compression for aspx files either.  And then there were some severe limitations on SQL databases which I decided wasn't going to work for me.&lt;br /&gt;&lt;br /&gt;So I shopped around and eventually decided that a virtual dedicated server from Orcs Web was the thing for me.  The idea with virtual dedicated hosting is that multiple virtual machines run on a single physical server, and then the hosting company configures and sells each virtual dedicated server to individual customers at a monthly rate.  Orcs Web is able to sell this service significantly cheaper than a true dedicated server.&lt;br /&gt;&lt;br /&gt;The nice thing for me is that I have full control of this virtual server, including Remote Desktop support.  And I was able to configure the server just how I wanted it.  So now I'm using gzip compression and content expiration extensively on every site.  And then when you combine that with the fact that Orcs Web provides triple redundant OC12 connections, I think you'll notice that the site really screams right now. ;)</description><pubDate>Sat, 29 Aug 2009 12:19:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/attribute-driven-search-engines-and"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Attribute-Driven Search Engines to Prevent Dead Ends</title><description>&lt;span style="font-weight:bold;"&gt;Dead Ends and Searching&lt;/span&gt;&lt;br /&gt;Dead ends occur whenever you search only to see that dreaded page that says "0 results."  It can be a poor user experience to be limited to refining your search with a single textbox, not knowing if your search will return any results.  Web search engines like Google can get away with this because they have billions of results to be found and dead ends are few and far between.  That, and the wild wild web is so unpredictable and inconsistent that they can't easily implement more advanced features with any real benefit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Attribute-Driven Search Engines&lt;/span&gt;&lt;br /&gt;I've made up the term "Attribute-Driven Search Engine" because I don't know what else to call it.  The idea is to display the attributes for the current search results and allow the user to click an attribute to further filter the results.  As you filter the results, the new attribute list is also filtered.  As a result, you'll never reach a dead end.  This characteristic is what makes this type of search engine so awesome.  &lt;a href="http://www.newegg.com/"&gt;NewEgg&lt;/a&gt;, &lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt;, &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; -- these are just some of the sites that have adopted this type of search engine. &lt;br /&gt;&lt;br /&gt;An attribute-driven search engine can be implemented in any database-driven site where you have some level of control over your content.  If you have a site like NewEgg with a wide variety of products then you'll probably need a combination of categories and attributes.  For example, when searching for processors you'll need categories for the brand (AMD, Intel), number of cores (1, 2, 3, 4), socket type (AM2, AM3), etc.  &lt;br /&gt;&lt;br /&gt;But if you're dealing with content more like StackOverflow you can get away with simply using tags.  You can assign a variable number of tags to a given article, product, or whatever it is, and the search engine will treat the tags as the attributes.  This greatly simplifies things from a management point of view as you don't have to continually modify your categories as your site grows.  You can see this in action at &lt;a href="http://stackoverflow.com/questions/"&gt;stackoverflow.com/questions&lt;/a&gt; if you start clicking the tags on the right hand side under "Related Tags."  If you'd like you can keep clicking tags to add to the filter until you're down to just 1 result.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The SilverlightXAP.com Search Engine&lt;/span&gt;&lt;br /&gt;So I've been giving all of this a lot of thought.  I think having a good search engine can be very important for a website.  Maybe it's not such a big deal when it's small.  But once you have accumulated 500+ items to search through, then it quickly becomes more difficult to navigate the site.&lt;br /&gt;&lt;br /&gt;So what I'm implementing for &lt;a href="http://www.silverlightxap.com/"&gt;SilverlightXAP.com&lt;/a&gt; takes aspects of sites I've done before and combines them with features of StackOverflow.  Every pixel shader will have tags assigned to it, and combined with full-text searching this should allow you to find what you're looking for.  &lt;br /&gt;&lt;br /&gt;Oh, and there's one other thing.  Since I still allow you to search using a textbox, there's still the possibility of reaching dead ends.  So I've implemented a simple feature to prevent this.  I've added some AJAX which searches as you type and tells you how many results there will be before you actually click "Search."  &lt;br /&gt;&lt;br /&gt;This is all working with my sample data.  And I think this combination of features should allow this search engine to scale well.  But only time will tell.  I'm just about to move from shared hosting to a virtual dedicated server.  After that's done I'll try to get a beta site out there where you guys can check this out.  I'd love to hear some feedback.</description><pubDate>Thu, 27 Aug 2009 13:25:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/silverlightshadersnet-coming-soon"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>SilverlightXAP.com Coming Soon</title><description>I'm really excited about this site.  It'll be a place where Silverlight &amp; WPF developers can go to find specialized &lt;a href="http://www.silverlightxap.com/"&gt;pixel shader effects&lt;/a&gt;.  Every shader will have an instant online preview to make it easy to find what you're looking for.&lt;br /&gt;&lt;br /&gt;The idea is to open up the site to pixel shader developers everywhere.  If everything goes well it'll quickly become the largest Silverlight &amp; WPF pixel shader collection on the web.&lt;br /&gt;&lt;br /&gt;I've been working on developing some pixel shaders of my own to add to the site.  And this weekend I'll begin building out the site to make it functional.  I'll keep you posted.</description><pubDate>Fri, 31 Jul 2009 16:47:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/little-progress-report"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><category>Branding / Marketing</category><title>A Little Progress Report</title><description>It's always exciting during the early days of launching your website and releasing your first products.  I remember 10 years ago with gldomain.com I released my Nebula screensaver.  It was a simple OpenGL screensaver that didn't take me long to create, but it was somewhat unique and perhaps cooler to look at than any of the default Windows screensavers at the time.  One night I decided to send an email to 3dfiles.com about it.  And to my surprise, the next morning it had been posted on their front page and had over 5,000 downloads overnight.  It would go on to be downloaded over 100,000 times across the web.  That was a really cool experience for me even if I didn't make a dime from it.  It was the first time I had gotten my work out into the world on such a massive scale.&lt;br /&gt;&lt;br /&gt;Fast forward 10 years, I've since learned that my success with gldomain.com really was something special.  You really have to hit a niche to make that kind of overnight impression on the internet these days.  So I don't have those gldomain numbers from the early days, but BucketSoft is coming along.&lt;br /&gt;&lt;br /&gt;Since its inception almost 4 months ago, BucketSoft.com has had over 1,600 visits.  Data Comparisons Express has been downloaded 46 times from the site, and a combined total of over 250 downloads from other download sites on the web.  That's decent but I really need to focus on getting Data Comparisons to version 1.0 to improve its web presence.  I have several improvements to make to get it there.  Then hopefully this fall I'll have Data Comparisons Professional ready and for sale.&lt;br /&gt;&lt;br /&gt;Then there's RegexHero.com, which I launched just 2 weeks ago as another BucketSoft product.  As it turns out it's doing even better than I expected.  I've had over 550 visits in those 2 weeks, and my search engine placement is already pretty good.  I think this site has a lot of potential and I have some cool things planned for it.  The nice part about it is that it promotes itself.  In other words, other people are starting to link to it on the web because it's a good resource for their readers.</description><pubDate>Thu, 14 May 2009 14:40:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/wpf-is-like-fat-super-hero"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>WPF is Like a Fat Super Hero</title><description>It's slow to start up, but once it gets going it really moves.&lt;br /&gt;&lt;br /&gt;For those that don't know, WPF stands for Windows Presentation Foundation.  It is Microsoft's latest and greatest .NET Windows user interface development architecture, aimed to replace Windows Forms.  Having built a fairly large Windows Forms app in .NET 2.0 Windows Forms before, I thought WPF would be an easy transition for me.  That hasn't exactly been the case -- a lot has changed.&lt;br /&gt;&lt;br /&gt;However, now that I'm a little more comfortable with WPF, I've come to certain conclusions about it.  First of all, I'm loving the flexibility.  In some ways it's like Flash development and I loved Flash development when I did it for a bunch of projects between 2001 and 2005.  Being able to apply custom gradients, draw custom shapes and buttons, and animate objects all in vector form is pretty cool.&lt;br /&gt;&lt;br /&gt;But to me the best thing about WPF, and the thing that I think often goes under-appreciated, is how it takes advantage of the GPU in your video card to off-load some of the UI processing from your CPU.  As a former OpenGL 3D programming hobbyist, I can really appreciate the power of the GPU.  My $100 video card at home has 112 cores each running at 1.5 GHz.  That's essentially like 112 processors that (when I'm not playing a video game) are never used to their potential.  So Microsoft has finally recognized how much processing power are in these massively powerful video cards that are now commonplace in even the most basic new PC's and they've made WPF take advantage of that.  As a result, I can build an application with thousands and thousands of UI elements in large grids or whatever you can imagine and the computer can actually handle it while simultaneously ripping CD's.  Parallel processing is sweet.&lt;br /&gt;&lt;br /&gt;Of course, there is one little problem.  It is slow to start up a WPF application after a fresh reboot.  It's faster after subsequent launches, but on the first launch Windows typically has to start the font cache service because by default it is not configured to start automatically.  I know that plays a big part in the slow start up but I'm sure there are other factors.  To give you some idea of what I mean by slow, I'd say &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons Express&lt;/a&gt; typically takes around 5-7 seconds to start up after a fresh reboot on the computers I've tested it with.  That may not sound like a terribly long time.  But when you're a speed freak like me, it's an eternity.  Especially considering the entire application fits into a 315 KB installer.  &lt;br /&gt;&lt;br /&gt;Apparently Microsoft has been working on this and made some big improvements in .NET 3.5 SP1.  But it's still not fast enough.  I hope they can improve it more, and improve it soon because other than that WPF really is a beautiful thing.</description><pubDate>Fri, 01 May 2009 17:27:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/introducing-regexherocom"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><title>Introducing RegexHero.net</title><description>So this is one of my little side projects.  I've been working on it after work for the past few days.  It's simple, but as far as I know it's the first of its kind.  It's a &lt;a href="http://regexhero.net/"&gt;Silverlight .NET regular expression testing tool&lt;/a&gt;.  The thing that makes it especially useful is it's real-time highlighting.  In other words, it'll highlight all matches found as you change the regular expression and/or the target string.  &lt;br /&gt;&lt;br /&gt;This isn't a new idea really.  I was inspired by a program I've used plenty of times called The Regex Coach.  The thing about The Regex Coach though is that it was designed around Perl-compatible regular expressions.  .NET regular expressions were designed to be Perl 5 compatible, so The Regex Coach is typically good to use, but not always.  I've seen special circumstances where it doesn't behave like my .NET regular expressions do.  So ideally it's best to use a true .NET regular expression tester for your .NET applications.  And that's why I built Regex Hero.</description><pubDate>Wed, 29 Apr 2009 22:49:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/is-usability-standard-changing"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><category>Branding / Marketing</category><title>Are Usability Standards Changing?</title><description>&lt;span style="font-weight:bold;"&gt;Standards and Conventions&lt;/span&gt;&lt;br /&gt;Conventional wisdom would state that the best way to create good usability in your desktop application would involve copying popular design standards.  For example, users are accustomed to seeing a menu bar with Save and Open under "File" and Cut, Copy, and Paste under "Edit."  And then there are keyboard shortcuts like Ctrl+S to save.  There's really no point in changing that up on users.  I mean, you wouldn't want to put Copy and Paste under "File" instead.  And just think about how awful it would be if Ctrl+S closed your application instead of saving your work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A Little Creativity&lt;/span&gt;&lt;br /&gt;However, some applications have abandoned the File/Edit menu bar mentality entirely.  And every once in awhile I run across a slightly non-standard application that looks really slick aesthetically while also being intuitive and easy to use.  &lt;br /&gt;&lt;br /&gt;The Microsoft Zune software is a good example of that.  &lt;br /&gt;&lt;img src="http://www.cliczune.com/Zune-software-screenshots2.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;And I'm also a fan of Jing from TechSmith.&lt;br /&gt;&lt;img src="http://cybernetnews.com/wp-content/uploads/2007/07/jing1.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Jing looks very, very non-standard in that screenshot but once you actually use it you'll quickly see that they get away with it because it's such a simple application to begin with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Why the Change?&lt;/span&gt;&lt;br /&gt;I can't help but think of what an impact the web has made.  After all, historically web usability patterns have been somewhat different from desktop applications.  But why should it be that way?  Almost everyone using desktop applications also uses the web.  So wouldn't it make sense that these usability standards can play together?  Well I think that's exactly what's happening.  The creative nature of website design is now influencing the design of desktop applications as well.  And now that the technology exists to make this happen easily we're seeing more and more of this creativity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;With Great Creativity Comes Great Responsibility&lt;/span&gt;&lt;br /&gt;I believe that when you can create an aesthetically pleasing interface with a usable and intuitive flow to it, you will inevitably create a greater impact.  It's one thing to have a simple, standard-looking Windows application.  But if it looks good too you'll give your users the impression that it's really well polished and more inviting to use.  And that may just give you the edge over your competition.&lt;br /&gt;&lt;br /&gt;I'm building &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons&lt;/a&gt; in WPF.  And WPF allows more flexibility than any Windows development technology before it.  It's easy to let all of this power go to your head.  I can just think back to all the misuses of Flash in website design that I've witnessed.  If you focus too much on achieving the cool factor you can easily overlook the most important point: Users have to be able to use your software.  So I'm avoiding all urges to create a confusing layout, obscure or hidden buttons, elaborate screen transitions, and sweet (slow-loading) sound effects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Form Should Still Follow Function&lt;/span&gt;&lt;br /&gt;I suppose my opinion about all of this is that usability should always be the top priority.  If your application somewhat resembles and behaves like something your target audience has used before, they're going to have a much easier time with it.  Ideally, they won't ever have to look at your help documentation.  But that doesn't mean your application has to be ugly.</description><pubDate>Tue, 28 Apr 2009 17:21:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/data-comparisons-express-always"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><title>Data Comparisons Express... Always Improving</title><description>New in &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons Express 0.97 Beta&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Improved start-up time by adding UI virtualization to many of the elements that don't need to appear initially.  I also moved some of the initialization code into a BackgroundWorker thread to further improve perceived start-up performance.&lt;/li&gt;&lt;li&gt;Added better error handling around auto-saving connection settings, opening new connections, and application start-up.&lt;/li&gt;&lt;li&gt;The application will now check for updates as it starts up.  I tried to make this obvious yet unobtrusive.  I've always hated the big "there is an update available" popups that come up when you don't ask them to.  So instead I just provide a little link that appears next to the help button that you can click to get the update.&lt;/li&gt;&lt;li&gt;Created better multi-threading for opening connections.  You should notice that if you click cancel while attempting to connect to a server, then the operation will be cancelled immediately.&lt;/li&gt;&lt;li&gt;Added a context menu for the datagrid with the option to copy the cells you have selected into your clipboard.  You can then paste this into Excel or your tool of choice.&lt;/li&gt;&lt;/ul&gt;</description><pubDate>Sat, 25 Apr 2009 17:45:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/formula-for-success-as-micro-isv-maybe"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><category>Branding / Marketing</category><title>A Formula for Success as a Micro-ISV... Maybe</title><description>&lt;span style="font-weight:bold;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;I'll be very up front about the fact that I'm making most of this up as I go along.  After all, I don't have anything for sale yet and I don't think of BucketSoft as a success yet.  Ever since I first started programming at age 12 I had lingering thoughts about what it would take to start my own software company.  I thought about how great it would be to write some awesome software, sell it online, and then sit back and rake in the dough.  Since then my delusions of grandeur have changed a bit, but the dream lives on.&lt;br /&gt;&lt;br /&gt;Before I go on, what is a Micro ISV?  Well, it's simply a one-man independent software vendor.  In the traditional usage of the term, a Micro ISV requires the owner to develop and sell his or her software all by themselves.  So as you can imagine, the thing about starting a Micro ISV is that it requires you to wear a lot of hats.  You're the owner, developer, accountant, and marketing expert all in one person.  Actually that's only the tip of the iceberg.  In reality, I think the title of the website 47hats.com sums it up perfectly, a site dedicated to Micro ISV news &amp; resources.  So my initial idea of "sitting back" is perhaps a little off.  I fully expect I'll be a busy boy as BucketSoft takes off.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Preparing Myself&lt;/span&gt;&lt;br /&gt;I think I've unknowingly prepared myself for this through my experiences, if that makes any sense.  If you count the time I did it as a hobby, I've been programming for a total of 14 years now.  And I've had 8 years of actual experience working for small (10-20 person) companies.  I never really planned on it happening this way, but working for these small companies has helped a tremendous amount when it comes to planning and starting my own business.  That's because at these various jobs I became involved not only in the programming, but also technical support, usability testing, SEO (search engine optimization), marketing, advertising, etc.  I wore several hats and gained the type of experience needed for very small businesses.&lt;br /&gt;&lt;br /&gt;Although I'm fairly confident that I'll be able to make a living off of BucketSoft alone at some point, I am still cautious by nature.  My approach so far has been to take it slow.  I still have a full-time job separate from BucketSoft.  And I'm working on getting the BucketSoft name out there a little bit at a time.  I don't have any investors and I don't expect I'll need it.  For the most part all I have invested is time.  And it's time that I would otherwise be spending watching reruns of House and Smallville.  So why not do something productive instead?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;On with the Formula&lt;/span&gt;&lt;br /&gt;Put simply, my whole opinion about how business should be conducted can be summed up in a quote from the Bible, "Give and you shall receive."  Obviously, this is not a new concept.  I wrote an article about this when it comes to &lt;a href="http://swortham.blogspot.com/2008/06/give-and-you-shall-receive-guide-to.html"&gt;attracting the most possible visitors to your website&lt;/a&gt;.  I wrote that article out of frustration of some dishonest business practices I've observed all too frequently.  My thought is that what's best for your customers is also best for your company.  I plan to go to great lengths to meet that standard.&lt;br /&gt;&lt;br /&gt;So I want to give away a lot for free.  As you can see with my first product, &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons Express&lt;/a&gt;, it's free.  I want to be open about everything that goes on, making this site an inviting place to visit.  And I hope to create dependable software while at the same time providing great support.  The ultimate goal of all this is to establish a good reputation with my customers and ultimately attract new customers by word of mouth.&lt;br /&gt;&lt;br /&gt;Back to this idea of wearing "47" hats, I'll just expand a little bit on the subject of support.  One thing I expect will help me drastically is GetSatisfaction.com.  The site is extremely well done and really takes the idea of online customer support to another level.  They have an ajax-enabled widget that you'll see on my &lt;a href="http://www.bucketsoft.com/feedback/"&gt;Contact Us&lt;/a&gt; page.  Essentially, whenever you begin to type your question or request, an ajax call is made to find similar questions that other users have already asked.  It's a way of more efficiently managing support requests and ultimately saving time for both me and the customer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Will it Work?&lt;/span&gt;&lt;br /&gt;When I first started thinking about starting up my own Micro ISV I was searching for advice, tips, and especially success stories.  I found some good information, for sure.  But I didn't find a lot of success stories.  I know there are stories out there but I guess most people just don't blog about that.  Well, hopefully a year from now I'll have a story to tell.  So that's what I'll do, one year from today I'll make another blog post talking about my journey.</description><pubDate>Tue, 21 Apr 2009 18:05:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/asking-for-your-bug-reports-and"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>Asking for Your Bug Reports and Suggestions</title><description>I've been following my stats in Google Analytics as well as the download sites out there and I've noticed the increasing number of downloads of Data Comparisons Express with each passing week.  However, I haven't gotten much as far as feedback.  I'm trying to work out any bugs or UI problems while the product is still in beta.  But I need your help.  So if you find a problem &lt;a href="http://www.bucketsoft.com/feedback/"&gt;let me know&lt;/a&gt;.</description><pubDate>Mon, 20 Apr 2009 12:20:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/conjuring-up-some-creativity-in-wpf"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Conjuring up some Creativity in WPF</title><description>I spent the past few days working on the user interface of &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons&lt;/a&gt;.  I made the decision to get rid of the standard Windows title bar in favor of something custom.  So I made a bar with a gray-to-black gradient similar to the header of this site.  Then I made minimize, restore, maximize, and close buttons with hardware-accelerated mouse over effects.  That may sound like overkill, but it's not really.  It was relatively easy to do and doesn't add any unnecessary size or complexity to the application.&lt;br /&gt;&lt;br /&gt;Then I reworked each section of the application to include my little red and blue database icons for a consistent feel throughout.  And lastly, I added a splitter between the console/textbox at the bottom and everything above so you can resize it however you like.&lt;br /&gt;&lt;br /&gt;While I was at it I also built a simple &lt;a href="http://www.bucketsoft.com/data_comparisons/help/"&gt;help topics page&lt;/a&gt;.  And now you can go directly to Online Help, Send Feedback, or Check for Updates all within &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons Express 0.96&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My goal with all of this was to create a clean and simple design that maximizes your workspace inside the application.  I'm sure there will be more tweaks to come but I'm liking it better already.</description><pubDate>Sun, 19 Apr 2009 15:07:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/data-comparisons-express-released"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><title>Data Comparisons Express released</title><description>After much thought I've decided how I want to differentiate the free and professional versions of Data Comparisons.  Essentially, all the work I've put into Data Comparisons thus far is now in the free version: &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons Express&lt;/a&gt;.  That includes support for all versions of Microsoft SQL Server.  That means I'm giving away a lot for free, but I'm OK with that.  I've submitted the software to a couple of download sites so the upcoming weeks should be interesting.&lt;br /&gt;&lt;br /&gt;In many ways the Express version is also serving as a pilot program to test the waters and see what people have to say about it.  And then I'll take the feedback I get and perfect it the best I can from there.  The professional version is still in the works, but it will have all the same features plus a few more things to make it more powerful.  Some of the immediate features I'm planning are in-place editing, multiple table comparisons, and the ability to save comparisons settings to be reused.  I know that even this feature set doesn't compete with some of the top dogs but I'll be pricing it accordingly.</description><pubDate>Sun, 29 Mar 2009 21:59:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/why-i-develop-with-microsoft-net"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Why I develop with the Microsoft .NET Framework</title><description>&lt;span style="font-weight:bold;"&gt;A Little Background&lt;/span&gt;&lt;br /&gt;Prior to .NET I built Windows applications in Visual C++ 6.0.  I still believe C++ has its advantages.  It is very fast at simple math operations as it compiles down very well.  Because of that it was my language of choice for the OpenGL programs I used to write at www.gldomain.com.  Some of those programs had loops in them which handled millions of math operations per second.  If that code wasn't executed fast enough, you'd see the direct results in the form of a slow or choppy frame rate.  But as I'll expand on later, C++ development has one big disadvantage.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Coming to Accept .NET as a Viable Platform&lt;/span&gt;&lt;br /&gt;Some people are still apprehensive about developing Windows applications in .NET because it requires users to also have the .NET Framework on their computer.  It's certainly a valid concern.  Of course, any programming architecture you choose is going to require certain dependencies.  I suppose the adoption rate of those dependencies is the big defining factor.  These days I believe Adobe (formerly Macromedia) Flash is used by over 90% of all users browsing the web.  Then DirectX is required for basically any video game worth playing.  And then at a deeper level, Windows Installer is required to install most Windows applications.  All of these components are so common by now that I don't hear much complaint about the need to install them.&lt;br /&gt;&lt;br /&gt;Of course, Microsoft has included .NET in Windows distributions since Windows XP SP1.  And they push it out in Microsoft Updates.  So its adoption rate is quite good as well.  Unfortunately, the simple fact is that not everyone is going to have the latest version because not everyone keeps their computer up-to-date.  But Microsoft is pushing .NET for a good reason.  It is an extremely well done platform to build upon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.NET Stability&lt;/span&gt;&lt;br /&gt;One of the biggest changes when using the .NET Framework is managed code.  Managed code is like a virtual space where the code will run without affecting outside applications.  Because of this, applications that run on the .NET platform are less likely to crash, and it is virtually impossible (or extremely rare) for a pure .NET application to take down the system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.NET Speed&lt;/span&gt;&lt;br /&gt;.NET performance is quite good as a whole if you use its features wisely.  The one bottleneck that remains is math operations in VB or C#.  That's why you're not going to see many video games being built in VB.NET.  But performance tuning is all about finding and eliminating bottlenecks.  And one thing you can do is include unmanaged C++ in your .NET application for any math-intensive sections or loops in your code.  If you do this well you can have your cake and eat it too.  You can get the advantage of stability and rapid development time of a .NET application with the speed of a C++ application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;.NET Simplicity&lt;/span&gt;&lt;br /&gt;From my point of view .NET makes a lot of things easier which is the primary reason why I use it.  It allows me to focus a little more on building the functionality I want and a little less on the variances in Windows installations and computer hardware differences.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;My Real World .NET Example&lt;/span&gt;&lt;br /&gt;Going back to C++, I must say that in my opinion C++ is too much of a low-level language for most large business applications.  In my eyes that's its disadvantage and that's the problem I ran into with one application in particular that was originally developed in India.  It was a simple document management system of sorts with a nice wizard-like interview process to help you fill out documents.  It really shouldn't be too complicated when you think about it.  But the sheer amount of C++ code needed to write it was insane.  &lt;br /&gt;&lt;br /&gt;In 2004 I was given the task to take over the development and support of this application.  And after about a year of that I ran into a compatibility issue when Vista was coming out.  At that point I was faced with a decision.  Either I needed to hunt down the problem in hundreds of thousands of lines of mostly unfamiliar code, or scrap the C++ and rebuild it in .NET.  Well, I rewrote the whole thing in VB.NET 2.0.  It turned out to be the right decision as I was able to recreate its functionality in a couple months.  And in the end I probably wrote only about 1/10th the amount of code of the original.  Furthermore, I was able to make certain enhancements, and it's been virtually problem-free and hasn't needed any changes at all in the past couple years.</description><pubDate>Fri, 27 Mar 2009 15:44:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/what-i-use-bucketsoft-data-comparisons"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><category>Company / Business</category><title>What I use BucketSoft Data Comparisons for</title><description>Comparing data, of course.  OK I'll expand on that.  I'd say the most common thing I have to do regularly is prepare website updates.  I make a habit of creating development &amp; production environments that are practically identical to eachother.  And whenever it comes time to make some database updates I'll do so in development first so I can test everything out.  My goal is to iron out any bugs in the development environment first, and then copy over everything I changed bit for bit.&lt;br /&gt;&lt;br /&gt;Now, one could do this with an import or export through Microsoft SQL.  But in some cases this can be a destructive process, essentially taking your website down and throwing errors as the transfer takes place.  And that's generally a bad idea if you're concerned about your users.&lt;br /&gt;&lt;br /&gt;OK, the other option is to manually and tediously look for the changes you made and make them one-by-one in the production database.  The problem here is that you'll often overlook something.&lt;br /&gt;&lt;br /&gt;So the happy medium is Data Comparisons.  Using it to correct differences is still a manual process, but with Data Comparisons you can find those differences faster.  And at the end of the day you can be confident that the tables you're working with are indeed identical.</description><pubDate>Wed, 25 Mar 2009 17:15:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/data-comparisons-intro-video"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Data Comparisons Intro Video</title><description>I made a little intro video for Data Comparisons and uploaded it to YouTube and Vimeo today.&lt;br /&gt;&lt;br /&gt;The Vimeo version is right here:&lt;br /&gt;&lt;object width="640" height="480"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3805334&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3805334&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/3805334"&gt;BucketSoft Data Comparisons Intro (Beta)&lt;/a&gt;</description><pubDate>Sun, 22 Mar 2009 15:19:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/finally-good-installer-now-in-data"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>Finally a good installer now in Data Comparisons 0.9.3.1</title><description>So I made an NSIS Windows installer package for Data Comparisons.  It's smart enough to check for the prerequisites (.NET Framework and Windows Installer) and only download and install them if necessary.  Thanks to this technique and the fact that NSIS only has 34KB of overhead, the installer is just 310 KB.  &lt;br /&gt;&lt;br /&gt;I've used NSIS for past projects and I love it.  It's extremely lightweight, fast, and stable.  And since it's completely scriptable, it'll only do what I tell it to do.</description><pubDate>Sat, 21 Mar 2009 17:53:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/bucketsoft-labs"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Development / Technical</category><title>BucketSoft Labs</title><description>Every once in a while I'll create little applications just for the fun and challenge of doing it.  So I've added a &lt;a href="http://www.bucketsoft.com/labs/"&gt;BucketSoft Labs&lt;/a&gt; section to be a home for such applications.&lt;br /&gt;&lt;br /&gt;The only program there for now is a Tic Tac Toe game.  It was one of the first applications I wrote in WPF, and my first real attempt at writing artificial intelligence.</description><pubDate>Tue, 17 Mar 2009 22:53:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/shared-connection-mode-lightning-speed"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><category>Development / Technical</category><title>Shared connection mode = lightning speed</title><description>This weekend I implemented a new feature and released it in &lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;Data Comparisons 0.9.2.13&lt;/a&gt;.  If you establish connection "A", you'll now see a little red arrow that you can click to copy connection "A" onto connection "B".  This will put Data Comparisons into a shared connection mode.  Behind the scenes this affects performance in a big way.  I'll try to explain...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dual connection mode&lt;/span&gt;&lt;br /&gt;When two separate database connections are established, Data Comparisons will actually pull the complete result set of each table you're comparing, then compare them in memory, and then show the differences.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Shared connection mode&lt;/span&gt;&lt;br /&gt;When a single database connection is used, Data Comparisons will query the SQL server directly.  In effect, the SQL server will do the bulk of the comparison and ONLY return the differences.  Say for example you're comparing two tables with a million records each.  If there are only 5 differences total, then all the SQL server will return are just those 5 rows.  This has enormous performance benefits, especially when you're connecting to a server over the internet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;You should use dual connection mode only when you have to.  In other words, when you're comparing data between two different physical servers, then you must use dual connections.  Otherwise, click those little red or blue arrows to use shared connection mode.</description><pubDate>Mon, 09 Mar 2009 14:56:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/data-comparisons-free-vs-professional"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Company / Business</category><title>Data Comparisons: Free vs Professional</title><description>If you're using a free database server such as Microsoft SQL Express, or mysql, would you want to pay for a database comparison tool?&lt;br /&gt;&lt;br /&gt;I'd tend to think that you'd look at the free options first, just as I would.  For that reason, I'm thinking about giving away a full-featured free version of Data Comparisons with only one limitation -- it can only be used with free database servers.&lt;br /&gt;&lt;br /&gt;Now the beta isn't yet compatible with anything other than Microsoft SQL for now.  But once I make it compatible with more servers, that's the idea I'd build upon.  There's potential for this tool to become very popular among mysql and SQL Express users, of which there are many.&lt;br /&gt;&lt;br /&gt;The professional version would be the very same product, but with no limitations on what server you can connect to.  I still have to figure out the price, but I'll be sure to price it below the competition.&lt;br /&gt;&lt;br /&gt;So that's the plan.  The plan &lt;span style="font-style:italic;"&gt;may&lt;/span&gt; change but I really do believe that the "Give and you shall receive" approach will work for BucketSoft in the long run.  As you may have read in some of my other posts and even my "About Us" page, I like the companies out there that are willing to cater to the work-at-home types and hobbyists.  And I want BucketSoft to be one of those.  I'd love to hear your thoughts.</description><pubDate>Tue, 03 Mar 2009 17:57:00 Z</pubDate><a10:updated>2013-12-13T23:03:59Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/it-really-is-amazing-what-you-can-get"><category>http://schemas.google.com/blogger/2008/kind#post</category><title>It really is amazing what you can get for free</title><description>&lt;span style="font-weight:bold;"&gt;1. Blogger.&lt;/span&gt;  It's super easy to use, and I didn't realize I could set it up to publish via FTP until I set it up for this site.  So now all I have to do to publish a post is login to my blogger account, write a new post, and click "Publish Post", and the HTML files, and RSS feed are all updated on my site.  The side benefit is that my posts are also backed up at blogger.com.  There are certain limitations of doing it this way, but it's still an impressive service for free.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Gmail.&lt;/span&gt;  I recently learned that Gmail can be setup for an external address.  I was able to setup my bucketsoft.com email address in Google Apps, then change my MX records to point to the Gmail server.  And then, voila, I get emails through Gmail for free.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Google Analytics.&lt;/span&gt;  Man, years ago I wrote a web traffic tool that would gather statistics and would allow you to view reports and graphs in a similar way.  I went through 4 complete rewrites of that code.  But when the company I was working for folded, I lost the code (and they never did anything with it).  It was pretty cool, and fast... very fast.  But I must admit it was never as advanced or flexible as Google Analytics.  I've used Google Analytics on every site I've made for the past few years, and of course I'm using it here as well... for free.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. GetSatisfaction.com&lt;/span&gt;  For those who aren't familiar with this site, check out my page here: &lt;a href="http://getsatisfaction.com/bucketsoft/"&gt;getsatisfaction.com/bucketsoft&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This site is extremely well done.  My page may not be the best example because it's pretty empty right now.  But I love the way their feedback engine automatically shows popular subjects so you don't necessarily have to ask a question if it's the most asked question already.  Oh yeah, it's free too.</description><pubDate>Tue, 03 Mar 2009 17:33:00 Z</pubDate><a10:updated>2013-12-13T23:04:00Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/data-comparisons-090-beta-released"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><title>Data Comparisons 0.90 Beta released</title><description>I spent this weekend working on a few things I wanted to have done in Data Comparisons before it went from Alpha to Beta.&lt;br /&gt;&lt;br /&gt;In the alpha version the software would look for a common primary key between the two tables you're comparing.  If it can't find a primary key of the same name in both tables, it simply won't allow you to perform the comparison.  That's obviously a huge limitation.  So I've made the beta a bit more flexible.  It'll automatically select the first key it finds in a table you select, but it'll also allow you to select a column to key the comparison off of.  It'll warn you if the column you select isn't guaranteed to be unique, but it'll still allow you to perform the comparison.  I think this allows the flexibility that it desperately needed.&lt;br /&gt;&lt;br /&gt;The next thing I wanted to fix was the lack of multi-threading on the comparison itself.  So I've added multi-threading to the "Results" screen where you'll see a progress bar as it does its thing.  You can also click "Cancel" to stop the comparison if it's taking too long.  &lt;br /&gt;&lt;br /&gt;While I was at it I took a deeper look into the code to see if I could find any obvious bottlenecks.  I happened to find a huge inefficiency where I wasn't making full use of the primary keys in the comparison.  I fixed that and increased performance by at least 5x.  I've done some performance tuning like this in a few places already but pretty soon I'm going to start getting a little more scientific with my measurements.  I'll try to see what techniques are the fastest, use the least memory, etc.  Maybe I'm weird, but I love that kind of work; getting every last ounce of performance out of my applications.&lt;br /&gt;&lt;br /&gt;Anyway, I think that sums up what's new in the beta.  There are still UI improvements I'd like to make, but overall I'm pleased with the way its working now.  All I need now are more people using it. =)</description><pubDate>Sun, 01 Mar 2009 23:01:00 Z</pubDate><a10:updated>2013-12-13T23:04:00Z</a10:updated></item><item xml:base="https://www.bucketsoft.com/blog/introducing-bucketsoft-data-comparisons"><category>http://schemas.google.com/blogger/2008/kind#post</category><category>Release Announcements</category><title>Introducing BucketSoft Data Comparisons</title><description>I've been working on this off &amp;amp; on for the past few months.  But just last weekend I made a big push to finish up a few things and get it out into the wild as an Alpha release.  As of right now it's limited to only comparing two database tables at a time, and it'll only work when it can find a common primary key between those two tables.  But other than that, it's a pretty effective little database comparison tool.  I'm working on improving it every day and in fact I've released a new version every day since Saturday.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Check it out...&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.bucketsoft.com/data_comparisons/"&gt;&lt;img src="http://3.bp.blogspot.com/_uAFGogqHOtg/SaVuMo0l0TI/AAAAAAAAAHs/Uk619ZLGm4I/s320/Screenshot3.png" style="cursor:pointer; cursor:hand;width: 320px; height: 251px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5306768899321483570" /&gt;&lt;br /&gt;www.bucketsoft.com/data_comparisons&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;</description><pubDate>Thu, 26 Feb 2009 17:14:00 Z</pubDate><a10:updated>2013-12-13T23:04:00Z</a10:updated></item></channel></rss>