<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-7120499569834790849</id><updated>2010-03-08T09:02:34.156-08:00</updated><title type='text'>leobartnik.net</title><subtitle type='html'>General spoutage and some technical stuff too</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://leobartnik.net/blog/feed/rss.xml'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-7228039497041755943</id><published>2010-02-22T10:28:00.001-08:00</published><updated>2010-03-08T09:00:23.543-08:00</updated><title type='text'>Replacement iPhone</title><content type='html'>Those Apple folks are pretty cool -- my iPhone 3G had developed a crack starting at the dock connector so I took it in to one of the Apple stores in town and they said it still was under warranty and replaced it with a brand new one (3G, no free upgrade to 3GS).  I had &lt;a href="http://www.macworld.com/article/141923/2009/07/iphonecasecrack.html"&gt;researched&lt;/a&gt; the problem a bit before making the appointment to take it in and found that my iPhone was not the only one with that problem, but I was a bit skeptical that it would be as easy as it sounded to get it swapped out for a new one.&lt;br /&gt;&lt;br /&gt;Sure, it shouldn't have cracked in the first place, but they definitely made good on it in my book.  I assume the warranty doesn't reset with the new hardware (although maybe that assumption is wrong) but it doesn't matter, really -- I now have a brand new device that should last well beyond the original warranty period.&lt;br /&gt;&lt;br /&gt;If you have an iPhone, go to the Apple &lt;a href="https://selfsolve.apple.com/GetWarranty.do"&gt;Service and Repair site&lt;/a&gt; and enter your hardware serial number to see if you are covered.  Don't assume that using a protective case prevents the crack from occurring; although I don't use a case, it doesn't seem to be related to anything a case could prevent from happening.  My guess is that the problem is related to repeated use of the dock connector, and everyone uses that.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE 3/8/2010:&lt;/span&gt; The new iPhone had a dud battery -- it seemed like about 8 hours was all it was good for even with minimal active use (e.g. sitting on the night stand overnight).  I watched it one day during the day and noticed that after about 6 hours following a full charge it would be down to 25%, again with minimal use.&lt;br /&gt;&lt;br /&gt;Over the past weekend we were in the shopping center that has the Apple store where I got the replacement, so I stopped in to see if there was any chance of getting an appointment with the Genius Bar.  This was a busy Saturday at a busy location, and the concierge said she had one spot, which was an hour and ten minutes away.  That actually wasn't going to be a big problem because we had just gotten there, but then she looked in the Mac queue (she had looked previously in the iPhone queue) and saw that they had a slot coming up in 25 minutes, so she gave me that one instead, a nice touch.&lt;br /&gt;&lt;br /&gt;At the appointed time a tech ran a piece of diagnostic software on the phone that seemed like it was more for show than anything (e.g. the tech noticed it had a handful of dropped calls, which seemed significant to him, although I don't see how that has anything to do with anything relating to the battery, but hey, who am I to complain?) and deemed it a dud.  He grabbed out a new one from the back, swapped the SIM and did the paperwork, and we were out of there.&lt;br /&gt;&lt;br /&gt;I am happy to report that the battery in this latest handset is working extremely well, holding a charge for a couple of days under normal use, and once again I felt like they had done right by me, even with the hassle of having to take the replacement unit back.  That's good customer service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-7228039497041755943?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/7228039497041755943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=7228039497041755943&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7228039497041755943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7228039497041755943'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2010/02/replacement-iphone.html' title='Replacement iPhone'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-8834541410731829199</id><published>2010-02-12T13:50:00.000-08:00</published><updated>2010-02-12T16:04:19.078-08:00</updated><title type='text'>Aggregate extension method in LINQ</title><content type='html'>It seems that I never stop finding new reasons to love LINQ and today I've found another: the Aggregate extension method.  &lt;br /&gt;&lt;br /&gt;Here's the scenario: we have a Silverlight application with a UIElement that binds to an IEnumerable of type string where the contents of each item is an error or validation message.  There are times when instead of binding to the list I just want a concatenated string of all the items in the collection with a CRLF stuck on the end of each.  Just for kicks I asked my friend &lt;a href="http://useableconcepts.com/"&gt;Nick&lt;/a&gt; what at the time felt like a silly &amp;quot;how many convoluted ways can you think of to solve this simple programming problem, and how would you do it in LINQ?&amp;quot; question and, being the genius that he is, he suggested using the Aggregate extension method.&lt;br /&gt;&lt;br /&gt;I already had a passing awareness of .Aggregate() but to be honest it hadn't occurred to me that it would be useful for something other than aggregating numbers, and at any rate I found it a bit unintuitive to use initially.  It turns out, of course, that the accumulator can work on a series of strings just as easily as, say, ints, and it really couldn't be much simpler.&lt;br /&gt;&lt;br /&gt;Here's how it looks as a C# Statement in &lt;a href="http://www.linqpad.net/"&gt;LinqPad&lt;/a&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;string[] words = { "foo", "bar", "ski" };&lt;br /&gt;words.Aggregate(string.Empty, (seed, w) =&gt; seed + "\r\n" + w).Dump();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And in the Results pane:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;foo&lt;br /&gt;bar&lt;br /&gt;ski&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pretty slick!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-8834541410731829199?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/8834541410731829199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=8834541410731829199&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8834541410731829199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8834541410731829199'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2010/02/aggregate-extension-method-in-linq.html' title='Aggregate extension method in LINQ'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-8014602520890434056</id><published>2010-01-20T14:13:00.000-08:00</published><updated>2010-01-20T14:49:07.754-08:00</updated><title type='text'>If It's Not Information It's Just Noise</title><content type='html'>If you write code for a living, you don't have to be around very long before the subject of coding standards comes up, and it is a subject about which people tend to have very strong opinions.  My own very strong opinion is that most so-called standards really are styles, and that they do not rise to the same level as standards.  How many spaces you use to indent a line of code is a style (or do you use tabs?); whether your code compiles when you don't have a trailing semicolon is a standard.  &lt;br /&gt;&lt;br /&gt;Call me pedantic (you wouldn't be the first) but I think the distinction is important.  When people are discussing the formatting of any given piece of code, it is easier for the proponent of a certain style (opening curly braces, for example) to get his way if he can appeal to the authority of the &amp;quot;standard&amp;quot; to support his position (reference to the &lt;a href="http://en.wikipedia.org/wiki/Argument_from_authority"&gt;logical fallacy&lt;/a&gt; fully intentional).  Just because that person was pushy enough to get his way codified doesn't make it right, though.&lt;br /&gt;&lt;br /&gt;Countless hours have been spent discussing, drafting, arguing about, and then conforming code to some standard or another, and that's a sad waste of time.  Worse, for me anyway, is that many coding standards make code harder to read, such as requiring comments on every method, requiring regions (collapsible blocks in which code lives in a code file) around every conceivable form of code in a file and in a certain order (sometimes even where there is nothing actually *in* the blocks, or when the block already has a collapsible region with a title!), and worst of all, requiring that something like a property getter or setter take up four lines of code when it could all fit on one.&lt;br /&gt;&lt;br /&gt;Standards that don't help your code convey something important or interesting about the code should be eliminated, at least as far as what a coder has to deal with on a day-to-day basis.  If stylized code makes it easier for the source control tool to diff and merge, well, require running it through a prettifier before committing changes.  Just make sure the prettifier can reverse-engineer the code back to *my* way before I have to see it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-8014602520890434056?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/8014602520890434056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=8014602520890434056&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8014602520890434056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8014602520890434056'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2010/01/if-its-not-information-its-just-noise.html' title='If It&apos;s Not Information It&apos;s Just Noise'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-6750416699649211826</id><published>2010-01-11T14:34:00.000-08:00</published><updated>2010-01-11T15:32:36.038-08:00</updated><title type='text'>Silverlight UIAutomation Testing -- Using WatiN to navigate to a page and White to test a Silverlight app</title><content type='html'>I had the need recently to automate testing of a Silverlight app and ran into a problem using &lt;a href="http://www.codeplex.com/white"&gt;white&lt;/a&gt; (could anyone have come up with a more difficult name to search on?) where white does not provide functionality to get a reference to a hyperlink in the DOM and click it in the way that, for example, WatiN does.  The scenario where this came up is there is a web app with a landing page that has a link to the page hosting the Silverlight app and we need to click through the link into the Silverlight hosting page.&lt;br /&gt;&lt;br /&gt;I briefly thought about just cribbing the functionality from WatiN and extending white's capabilities but quickly discarded that idea as too complicated and out of concern that it would become a maintenance nightmare.&lt;br /&gt;&lt;br /&gt;The solution I came up with is to use WatiN and white together in a hybrid fashion, where WatiN spins up a browser instance and then white attaches to that browser instance using the ProcessID of the instance from WatiN.  White doesn't expose an Attach method up in the InternetExplorer class where Launch lives, but it does have it down in White.Core on the Application class, so it was a simple matter to create an extension method on the InternetExplorer class to expose one that can be used in unit tests.&lt;br /&gt;&lt;br /&gt;It goes a little like this (warning: horrible formatting):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static class WhiteExtensions&lt;br /&gt;{&lt;br /&gt;    // the extension method to simplify usage&lt;br /&gt;    public static InternetExplorerWindow Attach(&lt;br /&gt;        this InternetExplorer val, int processId, string title)&lt;br /&gt;    {&lt;br /&gt;        InternetExplorerFactory.Plugin();&lt;br /&gt;&lt;br /&gt;        return (InternetExplorerWindow)Application&lt;br /&gt;            .Attach(processId)&lt;br /&gt;            .GetWindow(title);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// new up a browser with WatiN&lt;br /&gt;Watin.Core.IE watin = new Watin.Core.IE(url);&lt;br /&gt;watin.Link(Find.ByText("foo")).Click();&lt;br /&gt;&lt;br /&gt;// spin up white and attach to the browser that WatiN started&lt;br /&gt;White.WebBrowser.InternetExplorer white = new White.WebBrowser.InternetExplorer();&lt;br /&gt;white.Attach(watin.ProcessID, "browser window title");&lt;br /&gt;&lt;br /&gt;// get the Silverlight app reference from the white browser reference&lt;br /&gt;White.WebBrowser.Silverlight.SilverlightDocument sl = white.SilverlightDocument;&lt;br /&gt;&lt;br /&gt;// do stuff&lt;br /&gt;sl.Get&amp;lt;Button&amp;gt;(SearchCriteria.ByAutomationId("SomeButton")).Click();&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-6750416699649211826?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/6750416699649211826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=6750416699649211826&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/6750416699649211826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/6750416699649211826'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2010/01/silverlight-uiautomation-testing-using.html' title='Silverlight UIAutomation Testing -- Using WatiN to navigate to a page and White to test a Silverlight app'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-2531170155907885429</id><published>2009-12-15T20:27:00.000-08:00</published><updated>2009-12-15T20:29:00.670-08:00</updated><title type='text'>787 First Flight</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=Fucq5BoEfEI"&gt;She flies!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-2531170155907885429?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/2531170155907885429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=2531170155907885429&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2531170155907885429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2531170155907885429'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/12/787-first-flight.html' title='787 First Flight'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-8915829740865053901</id><published>2009-12-07T09:49:00.001-08:00</published><updated>2009-12-07T09:51:20.636-08:00</updated><title type='text'>Ender's Game come to life</title><content type='html'>&lt;a href="http://www.avweb.com/avwebflash/news/syracuse_reaper_uav_training_drone_201647-1.html?CMP=OTC-RSS"&gt;Remote Control Warfare Prompts Protest&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-8915829740865053901?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/8915829740865053901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=8915829740865053901&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8915829740865053901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8915829740865053901'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/12/enders-game-come-to-life_07.html' title='Ender&apos;s Game come to life'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-5880410191218655151</id><published>2009-11-30T09:14:00.000-08:00</published><updated>2009-11-30T09:34:51.954-08:00</updated><title type='text'>Unit Testing as an afterthought</title><content type='html'>Something you hear a lot in the development world is &amp;quot;We'll write unit tests if we have time,&amp;quot; which usually means &amp;quot;we'll go back and take a look at the huge stack of code we are about to toss over the wall to QA and try to write tests for all of it.&amp;quot;  Quite often it is the case that some tests are better than none, but as part of a mature development process, this is the wrong way to view unit tests.&lt;br /&gt;&lt;br /&gt;If your motivation for writing unit tests is that you do it so that you can put a check mark on a development process list, you are missing the point of writing the tests in the first place.  Writing the tests as you go (as mini test harnesses to help quickly test and guide development, or immediately along with development to test edge cases and cyclomatic complexity pathways) helps you to write more accurate code more quickly, which is what most people would say their goal is in the first place when they set out to commit acts of programming on their trusting clients' code bases.&lt;br /&gt;&lt;br /&gt;Very often it is the case that writing tests for a given piece of code leads to a much better understanding of the code under test, which helps to a) write the correct code and b) be able to explain and understand it later when you need to look at it again, or when a colleague or QA tester comes calling. &lt;br /&gt;&lt;br /&gt;Writing unit tests is like showing your work in elementary school -- the point is not to write down an answer, it is to work through the process so that you understand what you actually are doing.  And with unit tests we have an added bonus: the tests are repeatable and automatable, and they inform future developers (including the author of the code) of the intent and purpose of the code under test quickly and clearly, in a way that just reading the tested code alone cannot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-5880410191218655151?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/5880410191218655151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=5880410191218655151&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/5880410191218655151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/5880410191218655151'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/11/unit-testing-as-afterthought.html' title='Unit Testing as an afterthought'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-4827728918275137466</id><published>2009-09-13T16:35:00.000-07:00</published><updated>2009-09-13T16:44:53.765-07:00</updated><title type='text'>Safari performance problem fix</title><content type='html'>I found the fix for the horribly-slow performance of &lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt; on the Mac: &lt;a href="http://www.google.com/chrome/intl/en/eula_dev.html?dl=mac"&gt;google chrome&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm a relatively new Mac OSX user so I am still getting used to the feel of things, but after upgrading to Snow Leopard last weekend the Mac mini has been noticeably slower, especially when using Safari.  I check every now and then for Chrome on the mac and until today always hit a dead end.  But, there now is a pre-beta version available for public consumption (google calls the early-access release levels "Dev Channel" and "Beta Channel," where "Dev Channel" roughly equates to "alpha.")&lt;br /&gt;&lt;br /&gt;The difference is immediately noticeable: no more wait icon when trying to create a new tab, no more waiting while the tab contents are grayed out when choosing a previous page, etc., and switching tabs is snappy.  From google's description of the Dev Channel it sounds like what is reasonably stable today could at any time become unstable, but the build I am using right now is working great, so no complaints at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-4827728918275137466?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/4827728918275137466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=4827728918275137466&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4827728918275137466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4827728918275137466'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/09/safari-performance-problem-fix.html' title='Safari performance problem fix'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-1089683393702344715</id><published>2009-06-23T17:40:00.001-07:00</published><updated>2009-06-23T17:41:52.253-07:00</updated><title type='text'>iPod Playlist Genius ain't so smart</title><content type='html'>If the iPod playlist genius is so smart, how come it's always repeating songs from playlist to playlist?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-1089683393702344715?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/1089683393702344715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=1089683393702344715&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1089683393702344715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1089683393702344715'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/06/ipod-playlist-genius-aint-so-smart.html' title='iPod Playlist Genius ain&apos;t so smart'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-1588076130757276224</id><published>2009-05-14T09:59:00.000-07:00</published><updated>2009-05-14T10:01:44.102-07:00</updated><title type='text'>xkcd software funny</title><content type='html'>This is pretty funny, if you are a software person:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://imgs.xkcd.com/comics/cnr.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-1588076130757276224?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/1588076130757276224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=1588076130757276224&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1588076130757276224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1588076130757276224'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/05/xkcd-software-funny.html' title='xkcd software funny'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-3463976438982207277</id><published>2009-04-09T12:08:00.000-07:00</published><updated>2009-04-09T12:13:10.806-07:00</updated><title type='text'>Momus Iratus</title><content type='html'>I discovered a new blog the other day in the same vein as &lt;a href="http://www.violentacres.com/"&gt;Violent Acres&lt;/a&gt;; if you like that, you'll love this one too.  It's written by a mom who has a few things to say, and she's not afraid to say them!&lt;br /&gt;&lt;br /&gt;I present to you: &lt;a href="http://momusiratus.blogspot.com/"&gt;Momus Iratus&lt;/a&gt;.  I recommend you give it a read, she has a great writing style and a natural talent for blog-post-sized story telling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-3463976438982207277?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/3463976438982207277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=3463976438982207277&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/3463976438982207277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/3463976438982207277'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/04/momus-iratus.html' title='Momus Iratus'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-4880281797228427589</id><published>2009-04-01T09:51:00.000-07:00</published><updated>2009-04-01T10:22:15.378-07:00</updated><title type='text'>FSX pushback bug?</title><content type='html'>I haven't had a lot of time for PC gaming this year but when I do it's all Microsoft Flight Simulator for me.  I got a copy of Flight Simulator X (FSX) for Christmas and it really is fantastic in terms of airports, scenery, and realism.  The developers even wrote a patch that allows the game to utilize multiple CPU cores if your PC has them, which really boosted performance from the original version.&lt;br /&gt;&lt;br /&gt;Anybody who has played the game or some previous version of it knows that even though it is fairly realistic, there is a certain level of suspension of disbelief at work that you need in order to have a good experience.  For example, if you play the Caribbean Landing mission you'll notice there is an airliner holding short for the runway while you land.  If you taxi clear of the runway rather than just ending the mission after a successful landing, ATC will clear the airliner for takeoff and you can watch him leave.  As he is climbing out and turns away from the runway heading, he magically flies right through the mountain in front of him rather than crashing into it and comes out just fine on the other side.  The same thing sometimes happens with floating runway lights, bouncing airport trucks, etc.  These kind of things obviously are collision-detection (in the pixel sense, not the aircraft sense) related and don't really detract from the game.&lt;br /&gt;&lt;br /&gt;The other day, though, I found something that felt like a bug in the gameplay: I was playing the African Relief mission (no spoilers here so don't worry if you haven't yet played it) and overshot the runway on my first landing on the dirt strip because I was carrying too much speed and couldn't brake in time before rolling a little way down the hill at the end of the strip.  Not one to give up easily I tried to turn the plane around and taxi back up the hill but it was no go -- I was stuck.  An alternative occurred to me: turn back around and try taking off down the hill and coming back around for another landing attempt.  But, I didn't have enough energy even to turn around and the plane wasn't rolling back on its own.  Just for grins I hit Shift+P, the keyboard command for "request pushback," normally used when you are parked at the gate and need a tug to back you up at an airport.  To my surprise it actually worked!  Out in the middle of nowhere Africa, on a hill past the end of the dirt strip I had skidded off of, an invisible tug started pushing me backwards and I was able to turn the plane around and attempt a takeoff.  I botched the takeoff with a nasty bounce/stall/crash combination but I managed to refly the entire mission successfully the second time around.&lt;br /&gt;&lt;br /&gt;So I wondered: was it really a bug, or is it plausible that when I requested pushback a bunch of the guys who were based at the strip ran over and started pushing us backwards for the takeoff attempt?  I guess that explanation is believable and not totally out of line with other events that happen where you can't see the actors, but it seemed a little fishy to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-4880281797228427589?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/4880281797228427589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=4880281797228427589&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4880281797228427589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4880281797228427589'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/04/fsx-pushback-bug.html' title='FSX pushback bug?'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-2104092293308023583</id><published>2009-02-18T20:53:00.001-08:00</published><updated>2009-02-18T21:11:43.136-08:00</updated><title type='text'>Found key -- an ethical conundrum</title><content type='html'>Tonight after dinner I was talking on the phone with my daughters, pacing back and forth on the sidewalk near the restaurant where I had eaten, because it's agin' the law to talk on the phone without a hands-free setup while driving in California.  While pacing I happened upon a key, not a car key, but the kind that goes to a building door lock.  It had nothing no identifying information on it, and I felt like I couldn't just pocket it without someone stressing out big time if it was a lost key, so I had to come up with a plan.&lt;br /&gt;&lt;br /&gt;Being the kind of person who thinks way too much about this kind of thing, I analyzed the situation and my options for how to dispose of said key:&lt;br /&gt;&lt;br /&gt;1) Try all the business doors and loot, loot, loot!  This has obvious negative repercussions, and, lack of religious beliefs notwithstanding, I'm not the stealing kind.&lt;br /&gt;&lt;br /&gt;2) Truck on over to Ace Hardware, where the key evidently was duplicated, which I brilliantly deduced by reading "Ace" on it.  This would require either a) walking across the street, which I think also is against the law in California and at any rate would take longer than just driving over there (no joke -- I tried it once), or b) driving there -- but that felt like just a bit more than I was willing to do, even given my strong feelings that I needed to do *something*.  Plus, I doubt they would know to whom it belonged, so that seemed like a dead end.&lt;br /&gt;&lt;br /&gt;3) Keep the stupid thing and not worry about it.  I think I've already established that this was not an option I considered for very long.&lt;br /&gt;&lt;br /&gt;4) Toss it through the mail slot of the door in front of which I found it with the hope that it either belongs to that business, or that they would find the rightful owner.&lt;br /&gt;&lt;br /&gt;In the end I opted for number 4.  What would you have done?  Was it a copout and did I only succeed in making it someone else's problem?  Genny suggested I return during business hours to inquire about whether the key made it home, which I thought was a good idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-2104092293308023583?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/2104092293308023583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=2104092293308023583&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2104092293308023583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2104092293308023583'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/02/found-key-ethical-conundrum.html' title='Found key -- an ethical conundrum'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-1773119436892824444</id><published>2009-02-18T17:22:00.000-08:00</published><updated>2009-02-18T20:51:23.042-08:00</updated><title type='text'>Only one room number has a locking cover on it</title><content type='html'>I'm staying at a hotel in the Bay Area this week and my room is on the fourth floor.  One of the rooms I walk past to get to my room has a locking cover on it, like so:&lt;br /&gt;&lt;a href="http://leobartnik.net/blog/uploaded_images/roomnumber-737644.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 160px; height: 120px;" src="http://leobartnik.net/blog/uploaded_images/roomnumber-737636.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;It struck me as funny, in an oxymoronic way, to think of an herbalizer who is motivated enough to steal a 420 sign.  It must be a problem, though, and it got me wondering how many other hotels have the same kind of problem.&lt;br /&gt;&lt;br /&gt;10 points if you got the drug reference (minus 5 points for getting the drug reference; shame on you!).&lt;br /&gt;&lt;br /&gt;100 bonus points if you get the nerd reference to my room number: 414.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-1773119436892824444?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/1773119436892824444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=1773119436892824444&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1773119436892824444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1773119436892824444'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2009/02/only-one-room-number-has-locking-cover.html' title='Only one room number has a locking cover on it'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-3525335097774033775</id><published>2008-12-06T10:01:00.001-08:00</published><updated>2009-04-15T14:02:11.568-07:00</updated><title type='text'>Airplane in google maps</title><content type='html'>I was looking around in google maps at the area near where we live to see if they have updated photos of a new road extension that recently was completed, and found a weirdish image of an airplane in one like you sometimes hear about:&lt;br /&gt;&lt;br /&gt;&lt;iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=sherwood+or&amp;amp;sll=45.416015,-122.896371&amp;amp;sspn=0.012426,0.027895&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;s=AARTsJosNZD07-EJsTOKRWzHvlaj5daO0g&amp;amp;ll=45.41603,-122.900984&amp;amp;spn=0.00723,0.013733&amp;amp;z=16&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=sherwood+or&amp;amp;sll=45.416015,-122.896371&amp;amp;sspn=0.012426,0.027895&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;ll=45.41603,-122.900984&amp;amp;spn=0.00723,0.013733&amp;amp;z=16&amp;amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;A couple of things jumped out at me:&lt;br /&gt;1. The plane looks flat, which made me wonder why; was it high-altitude and got flattened out in appearance because of the telephoto effect?&lt;br /&gt;2. It doesn't have much in the way of markings except for American flags on the wings.&lt;br /&gt;3. It looks like it is on a pretty steep bank angle&lt;br /&gt;4. It looks like the front of the plane is on the left and the back is on the right, but when you look closely at the wings it looks like the flaps and ailerons are on the leading edge of the wing, which doesn't make sense&lt;br /&gt;5. If you zoom in a little more to see what is on the ground, there is a very small landing strip with a "don't use" X on it that may be a RC strip but I can't tell.  I don't know if that has anything to do with the airplane but perhaps it does -- maybe the plane is a remote controlled one being flown from the area immediately below&lt;br /&gt;&lt;br /&gt;So, I'm off to search a site that has weird objects in google maps photos to see if there is a better way to identify aircraft in the pics.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE:&lt;/span&gt; &lt;a href="http://blogs.sftsrc.com/shaun/"&gt;Shaun&lt;/a&gt; was able to identify this as the &lt;a href="http://www.modelaircraft.org/clubdetails.aspx?club=532"&gt;Fly-A-Ways RC Club&lt;/a&gt; in Aloha, OR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-3525335097774033775?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/3525335097774033775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=3525335097774033775&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/3525335097774033775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/3525335097774033775'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/12/airplane-in-google-maps.html' title='Airplane in google maps'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-1907013961236396018</id><published>2008-10-01T15:38:00.000-07:00</published><updated>2008-10-01T15:51:03.355-07:00</updated><title type='text'>Sudoku</title><content type='html'>I recently (as in last weekend) became interested in Sudoku and in addition to thoroughly enjoying solving them I found that it is thoroughly annoying to have to manually track which answers remain as possible choices are ruled out when I commit answers to my answer grid.  Naturally I wrote a program to handle that tedium for me, which I present to you here: The &lt;a href="http://leobartnik.net/Sudoku.aspx"&gt;Sudoku Solver Helper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's what the instructions say:&lt;br /&gt;&lt;blockquote&gt;When solving Sudoku puzzles you need some way of keeping track of&lt;br /&gt;       what possible answer values remain as you work your way&lt;br /&gt;       through the answer grid.  The newspaper puzzles have squares that are too        small to write more than a couple of numbers in, and using scratch paper isn't very practical unless you go to the trouble of creating a grid to hold all of your markup.&lt;br /&gt;&lt;br /&gt;       This seemed like the perfect job for a web application, so I set out&lt;br /&gt;       to create a grid I could use to track my guesses and remaining choices        as I worked my way through a Sudoku, and what you see here is the result of that effort.  To use it you enter your answers in the top grid, and the lower grid        automatically removes those values from the row, column, and sub-grid region        that the answer is in in the top grid.&lt;br /&gt;&lt;br /&gt;       A couple of things to note:&lt;ul&gt;            &lt;li&gt;Puzzles that are easy and medium pretty much solve themselves.  As you enter values in the top grid, enough values are eliminated in the lower one to leave only one choice per square.  This gets boring fast, and if you don't want to see the answers, either try harder puzzles, or don't use this tool.&lt;/li&gt;&lt;br /&gt;           &lt;li&gt;There is no undo -- if you make a mistake and want to change your value in the top grid you can, but the lower-grid values that were removed already for the mistaken entry will not be restored.&lt;/li&gt;&lt;br /&gt;           &lt;li&gt;As I tested a few different puzzles I thought it would be handy to somehow lock the starter values in the top grid, or at least to be able to know what they were initially by giving them a different background color.  That way, if things go wrong and you start shifting things around to get a fit on a tough area you would know which ones should not be changed.  I ended up not adding that feature but may do so in the future.&lt;/li&gt;&lt;br /&gt;           &lt;li&gt;There is no code in place to enforce using only digits 1 through 9.  I went back and forth on this one and decided that it doesn't really matter what you use as answers in a Sudoku as long as you have only one of each in each row, column, and region.  So, use letters or symbols if you like; it doesn't matter (except that the lower grid always holds 1-9 -- sounds like another future feature to allow setting the answer types).&lt;/li&gt;&lt;/ul&gt;So, it takes the drudgery out of tracking answer choices and is pretty simple to use.  If you have any comments or questions, shoot me an e-mail at sudoku@leobartnik.net.&lt;br /&gt;&lt;br /&gt;       Enjoy!&lt;br /&gt;  &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-1907013961236396018?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/1907013961236396018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=1907013961236396018&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1907013961236396018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1907013961236396018'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/10/sudoku.html' title='Sudoku'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-4121838803243240851</id><published>2008-09-17T10:30:00.000-07:00</published><updated>2008-09-17T10:31:34.362-07:00</updated><title type='text'>WATIN</title><content type='html'>WATIN totally rocks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-4121838803243240851?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/4121838803243240851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=4121838803243240851&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4121838803243240851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/4121838803243240851'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/09/watin.html' title='WATIN'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-8918313601051619668</id><published>2008-09-14T19:23:00.001-07:00</published><updated>2008-09-14T19:23:29.018-07:00</updated><title type='text'></title><content type='html'>&lt;!-- Start Brinkster Referral Link --&gt;&lt;br /&gt;&lt;a  onMouseOver="window.status='Host your site with Brinkster!'; return true" onMouseOut="window.status=''; " href="http://www.brinkster.com/redirect.aspx?rf=leobartnik&amp;ad=1019&amp;redirect=/hosting/hosting.aspx" target="_blank"&gt;&lt;img src="http://www.brinkster.com/images/ads/2007/ReferralBanner2v2.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- End Brinkster Referral Link --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-8918313601051619668?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/8918313601051619668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=8918313601051619668&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8918313601051619668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8918313601051619668'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/09/blog-post.html' title=''/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-8288976563361958950</id><published>2008-06-04T10:03:00.001-07:00</published><updated>2008-06-04T10:05:40.207-07:00</updated><title type='text'>Download Nintendo DS demo games on the Wii</title><content type='html'>Not sure why it took so long but you now can &lt;a href="http://www.nintendo.com/wii/channels/nintendochannel"&gt;download demo games for the DS on the Wii&lt;/a&gt;.  You could download demos for the DS all along but you had to go to your local game seller that served up the demo.  Now you can do it through the Wii in the comfort of your own home.&lt;br /&gt;&lt;br /&gt;Let the synergisticism begin!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-8288976563361958950?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/8288976563361958950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=8288976563361958950&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8288976563361958950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/8288976563361958950'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/06/download-nintendo-ds-demo-games-on-wii.html' title='Download Nintendo DS demo games on the Wii'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-7702749374453972264</id><published>2008-06-03T22:54:00.000-07:00</published><updated>2008-06-03T22:56:49.421-07:00</updated><title type='text'>Self-reassembling robot</title><content type='html'>There's a &lt;a href="http://funvampires.com/2008/05/01/modular-robot-reassembles-when-kicked-apart/"&gt;robot that reassembles itself&lt;/a&gt; after being kicked apart; that's some freaky stuff right there.  It's all Terminator-like, crawling across the floor to find the other parts of itself.  I wish I could live to be 500 just to see what this kind of thing turns into (as long as it doesn't actually turn into Terminator!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-7702749374453972264?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/7702749374453972264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=7702749374453972264&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7702749374453972264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7702749374453972264'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/06/self-reassembling-robot.html' title='Self-reassembling robot'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-7776507499991785723</id><published>2008-05-25T21:06:00.001-07:00</published><updated>2008-10-01T15:54:22.784-07:00</updated><title type='text'>anonymous post</title><content type='html'>Worse than the "I'd hit it" McDonald's ad campaign?  You be the judge:&lt;br /&gt;&lt;br /&gt;Today's Target ad:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://leobartnik.net/blog/uploaded_images/targetnotporn-724769.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://leobartnik.net/blog/uploaded_images/targetnotporn-724764.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and:&lt;br /&gt;&lt;br /&gt;UPDATE: I removed the actual image and replaced it with this link because it seemed a little crass; &lt;a href="http://www.encyclopediadramatica.com/Image:Porn-SFW.jpg"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.encyclopediadramatica.com/images/d/da/Porn-SFW.jpg"&gt; click here to see possibly NSFW image&lt;/a&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-7776507499991785723?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/7776507499991785723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=7776507499991785723&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7776507499991785723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7776507499991785723'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/05/anonymous-post.html' title='anonymous post'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-1324881681271575931</id><published>2008-03-25T12:59:00.001-07:00</published><updated>2008-03-25T13:05:50.911-07:00</updated><title type='text'>4000 Dead</title><content type='html'>I try not to get political in my blog but today I am breaking that rule by linking to a &lt;a href="http://images.huffingtonpost.com/gen/15983/original.jpg"&gt;mosaic made up of the photographs of 4,000 American soldiers killed in Iraq&lt;/a&gt;.  It's a political statement because the mosaic of the dead makes an image of George Bush.  &lt;br /&gt;&lt;br /&gt;Whether you agree with the sentiment that the deaths are directly the president's fault, you can't help but be moved by seeing the faces of all those people on the screen at once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-1324881681271575931?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/1324881681271575931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=1324881681271575931&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1324881681271575931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/1324881681271575931'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/03/4000-dead.html' title='4000 Dead'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-5602298124770064073</id><published>2008-02-09T19:28:00.000-08:00</published><updated>2008-02-09T19:39:15.536-08:00</updated><title type='text'>Fios performance</title><content type='html'>It's been a few months now that we have been living with Verizon Fios after ditching Comcast, and I can say that the two most important criteria are being fulfilled; they are: &lt;br /&gt;&lt;br /&gt;    1) Reliability: it's always up, and the issues we had initially with connectivity were resolved and have not returned.&lt;br /&gt;&lt;br /&gt;    2) Performance/speed: this screenshot says it all:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://leobartnik.net/blog/uploaded_images/fiosfast-773393.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://leobartnik.net/blog/uploaded_images/fiosfast-773390.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(1901 KB converts to 14.85 megabits, which is right at the service level we are paying for)&lt;br /&gt;&lt;br /&gt;So, Fios is two for two in my book, and I am loving it.  Vista does *not* do the smoking fast downloads that XP does, though, so if I have something large to download like the 800 meg ISO in the screenshot above I remote into a computer that is running XP and download it there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-5602298124770064073?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/5602298124770064073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=5602298124770064073&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/5602298124770064073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/5602298124770064073'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/02/fios-performance.html' title='Fios performance'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-2303935277406992353</id><published>2008-01-31T23:38:00.001-08:00</published><updated>2008-01-31T23:49:55.200-08:00</updated><title type='text'>free subversion host</title><content type='html'>A while back I was looking for a free subversion host, and I wasn't able to find a whole lot.  I had thought about setting up a server on one of my own machines at home, but part of the reason for using a remote host (outside of me not having to hassle with setting it up) was that I wanted it to be offsite so that I didn't have to worry about my clunky old hardware going toes-up and taking out my source code with it.  The last time I looked I found &lt;a href="http://cvsdude.com/"&gt;cvsdude&lt;/a&gt;, which works well but only gives you 2 megs of space for free.  Tonight I looked again, and I found &lt;a href="http://unfuddle.com/home"&gt;unfuddle&lt;/a&gt;, which offers free account users 200 megs of space, a vast improvement over 2!&lt;br /&gt;&lt;br /&gt;I just started using unfuddle, and I haven't used cvsdude much at all because of the space limitations, so I can't offer a comparison yet.  unfuddle is looking better because of the additional space alone, but they also offer a set of project managment tools that might come in handy.  &lt;br /&gt;&lt;br /&gt;If you love subversion, you'll love having a free offsite host.  If you don't love subversion, it just means you haven't used it yet; once you do you'll never want to use anything else.  Get yourself the &lt;a href="http://tortoisesvn.tigris.org/"&gt;tortoisesvn&lt;/a&gt; client and enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-2303935277406992353?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/2303935277406992353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=2303935277406992353&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2303935277406992353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/2303935277406992353'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/01/free-subversion-host.html' title='free subversion host'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7120499569834790849.post-7490898539759732641</id><published>2008-01-22T22:31:00.001-08:00</published><updated>2008-01-22T22:31:53.356-08:00</updated><title type='text'>Fun new way to read Dilbert (in color no less)</title><content type='html'>&lt;object id="W4796df582be655aa" width="400" height="300" quality="high" data="http://widgets.clearspring.com/o/4782b1ae641c3eb6/4796df582be655aa" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent"&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;param name="movie" value="http://widgets.clearspring.com/o/4782b1ae641c3eb6/4796df582be655aa" /&gt;&lt;param name="allowNetworking" value="all" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7120499569834790849-7490898539759732641?l=leobartnik.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/7490898539759732641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7120499569834790849&amp;postID=7490898539759732641&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7490898539759732641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7120499569834790849/posts/default/7490898539759732641'/><link rel='alternate' type='text/html' href='http://leobartnik.net/blog/2008/01/fun-new-way-to-read-dilbert-in-color-no.html' title='Fun new way to read Dilbert (in color no less)'/><author><name>Leo</name><uri>http://www.blogger.com/profile/17787316106178792994</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12974158663513259147'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>