<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14034177</id><updated>2011-12-30T13:09:53.962-08:00</updated><category term='math-illiterate'/><category term='web'/><category term='books'/><category term='Sci-Fi'/><category term='DST'/><category term='self-examination'/><category term='functions'/><category term='wtf'/><category term='agility'/><category term='turned eye'/><category term='strabismus'/><category term='Pictems'/><category term='get off my lawn'/><category term='starchytuber'/><category term='PuzzleTwist'/><category term='notareview'/><category term='lazy eye'/><category term='Beta'/><category term='windows'/><category term='Lua'/><category term='amblyopia'/><category term='basics'/><category term='Mary Hart'/><category term='hardware'/><category term='science'/><category term='contest'/><category term='math'/><category term='business'/><category term='softwarebiz'/><category term='tech'/><category term='personal'/><category term='programming'/><category term='rants'/><category term='Java'/><category term='XCode'/><category term='nearsightedness'/><category term='arithmetic'/><category term='iPhone'/><category term='eyesight'/><category term='software'/><category term='Rodents'/><category term='functional programming'/><category term='languages'/><category term='puzzles'/><category term='exotropia'/><category term='life imitates art'/><category term='JavaScript'/><category term='blogging'/><category term='writing'/><category term='dropout'/><category term='myopia'/><category term='modular'/><title type='text'>Another Day In The Code Mines</title><subtitle type='html'>Yet another infrequently-updated blog, this one about the daily excitement of working in the software industry.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14034177.post-5314156668395455677</id><published>2011-06-08T01:50:00.000-07:00</published><updated>2011-06-08T01:52:00.128-07:00</updated><title type='text'>Time for a reboot...</title><content type='html'>Okay, it's now been more than a year and a half since I updated this blog. I need to get back on the horse. Stay tuned for an update soon (really)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-5314156668395455677?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/5314156668395455677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=5314156668395455677' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5314156668395455677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5314156668395455677'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2011/06/time-for-reboot.html' title='Time for a reboot...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3456272328970650666</id><published>2010-01-24T13:08:00.000-08:00</published><updated>2010-01-24T14:43:43.471-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='basics'/><category scheme='http://www.blogger.com/atom/ns#' term='functions'/><title type='text'>JavaScript by example: functions and function objects</title><content type='html'>I've been working in JavaScript a lot these last couple of months, and I feel like I've learned a lot. I wanted to show some of the more interesting aspects of JavaScript that I've had the opportunity to bump into. I'll use some simple examples along the way to illustrate my points.&lt;br /&gt;&lt;br /&gt;Note: If you want to follow along with the examples in this blog post (and the followup posts), you'll probably want to use an interactive JavaScript environment. I tend to use &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; with Firefox when I'm trying stuff out, but there shouldn't be anything in these examples that won't work in the WebKit console in Safari or Chrome, or in &lt;a href="http://www.mozilla.org/rhino/"&gt;Rhino&lt;/a&gt;, for that matter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Functions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A simple function is defined and used in JavaScript thusly:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   function add(x, y) {&lt;br /&gt;       return  x + y;&lt;br /&gt;   }&lt;br /&gt;   console.log(add(3, 5)); // this prints "8" to the console&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This does just about what it looks like it does. There's no trickery here (the trickery comes later on). Let's say that we want a version of this function that takes a single argument, and always adds 5 to it. You could do that like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   function add5(a) {&lt;br /&gt;       return add(a, 5);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   console.log(add5(3)); // prints "8"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But what if you're going to need a bunch of these one-argument variants on the add function? Well, since functions are first-class objects in JavaScript, you can do this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   function make_adder(v) {&lt;br /&gt;       var f = function(x) {&lt;br /&gt;           return add(x, v);&lt;br /&gt;       };&lt;br /&gt;       return f;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var add7 = make_adder(7); //create a function&lt;br /&gt;   console.log(add7(3)); // prints "10"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is only slightly more complicated than the original example. One possibly subtle point here is that the returned function "captures" the value of v that was passed into make_adder. In a more formal discussion, you'd call this a &lt;a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29"&gt;closure&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3456272328970650666?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3456272328970650666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3456272328970650666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3456272328970650666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3456272328970650666'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2010/01/javascript-by-example-functions-and.html' title='JavaScript by example: functions and function objects'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1374769942639240051</id><published>2009-06-07T22:11:00.000-07:00</published><updated>2009-06-07T22:21:58.538-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='puzzles'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='PuzzleTwist'/><title type='text'>PuzzleTwist is now available!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MR7bT7RHlnY/Siyf5L4GBDI/AAAAAAAAAHI/_E2djdAGotw/s1600-h/CableUnSolved.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 278px; height: 400px;" src="http://1.bp.blogspot.com/_MR7bT7RHlnY/Siyf5L4GBDI/AAAAAAAAAHI/_E2djdAGotw/s400/CableUnSolved.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5344822662571361330" /&gt;&lt;/a&gt;&lt;div&gt;My latest creation is now up on the iTunes App Store. It's called &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;PuzzleTwist&lt;/span&gt;, and it's a puzzle game where you unscramble a picture by rotating the pieces.  As each piece is rotated into place, others will rotate as well - some in the same direction, some in the opposite direction. The key to solving the puzzle is to figure out what order to move the pieces in.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One unique feature is that the rules for each puzzle are different - some are simple, some are more complex. A few are so difficult that I can't solve them without looking at the solution.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you've solved a puzzle, you can save the resulting picture in the Photo Library on your iPhone, and then use it as the wallpaper image for the phone, or assign it to one of your contacts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PuzzleTwist also keeps track of the best reported scores, so you can compare your scores versus the rest of the world.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're a puzzle fan, you should check it out. &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318648860&amp;amp;mt=8"&gt;Here's the iTunes store link&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a side note, this application was approved much faster than the previous applications I submitted. Perhaps the App Store review team is coming out from under their backlog.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1374769942639240051?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1374769942639240051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1374769942639240051' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1374769942639240051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1374769942639240051'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/06/puzzletwist-is-now-available.html' title='PuzzleTwist is now available!'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MR7bT7RHlnY/Siyf5L4GBDI/AAAAAAAAAHI/_E2djdAGotw/s72-c/CableUnSolved.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-4613813710099806173</id><published>2009-05-12T18:24:00.000-07:00</published><updated>2009-05-13T09:06:38.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='turned eye'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='eyesight'/><category scheme='http://www.blogger.com/atom/ns#' term='strabismus'/><category scheme='http://www.blogger.com/atom/ns#' term='amblyopia'/><category scheme='http://www.blogger.com/atom/ns#' term='nearsightedness'/><category scheme='http://www.blogger.com/atom/ns#' term='myopia'/><category scheme='http://www.blogger.com/atom/ns#' term='exotropia'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy eye'/><title type='text'>The eyes have it - a tale of 3 vision problems</title><content type='html'>I'm recovering from a head cold today, so rather than try to do heavy programming work, I decided to write up a personal story that I've been thinking about lately, for a variety of reasons. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As anyone who knows me personally can probably attest, I wear glasses and have pretty bad eyesight.  Not many of my friends, and probably not even all of my family, know that I have three distinct vision problems, only one of which is actually addressed by my glasses. I'm going to tell y'all about all three, more or less in the order that I found out about them, and the ways in which they've been treated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Disclaimer: I'm not an eye doctor, nor an expert in human vision. This is all about what my experience has been. It's entirely likely that I'll make at least one glaring error in my use of some technical term. Feel free to correct me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Chapter 1: Nearsightedness and Astigmatism&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Okay, that probably looks like two different problems, but they're both refractive issues, and they're caused by misshapen eyeballs, and so are corrected easily with eyeglasses. If I remember correctly, I got my first pair of glasses in the 5th grade, when I was 10 years old or so. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was pretty astounded at the difference when I put them on - for the first time, I could see the leaves on trees as individual objects. I asked my eye doctor how bad my vision was compared to the 20/20 that's considered "normal" and got the unsatisfying response that the 20/x scale wasn't really a useful measure for people with strong nearsightedness. Since I can barely find the eyechart on the wall at 20 feet without my glasses, I can now understand where he was coming from.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There was some consternation amongst the various parties involved about how it is that I could have gone without glasses as long as I had without anybody noticing that I was blind as a bat. For whatever reason, there wasn't any mandatory screening for vision problems in my elementary school. I got screened for a number of other potential issues, amusingly including &lt;span class="Apple-style-span" style="font-style: italic;"&gt;colorblindness&lt;/span&gt;, but nobody ever stuck an eye chart up on the wall and had me read it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The biggest issue was probably a simple (dare I say child-like?) assumption on my part that everybody else saw things more or less the same way that I did. So, since I couldn't see the blackboard if I was sitting in the back row, I assumed that nobody else could, either. And if it was critical to the learning process for us to be able to read what the teacher was writing, the school would have arranged the classroom such that it was possible, right?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It probably didn't help that I was also a bit of a daydreamer and a slacker. I think that when I said I didn't know that we had homework due, my teachers and my Mom assumed that I just wasn't paying attention, when in reality, I might have simply not seen the homework assignment written on the board.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I get older, and more and more of my friends have children, it's occurring to me that there might actually be something useful for other people to learn from my experiences. I think the lesson here is actually a pretty simple one.&lt;span class="Apple-style-span" style="font-style: italic;"&gt; Parents, talk to your kids about what their sensory experiences are&lt;/span&gt;. If someone had at any point between age 2 and age 10 simply asked me whether or not I could see some distant object, or count the number of birds on a telephone wire, or even tacked up an eye chart on the wall and tested me, I might have gotten into glasses sooner.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alright, so I got glasses at age 10, which helped a lot with being able to see what was written on the blackboard, probably made it a lot safer for me to ride my bicycle around, and generally greatly improved my quality of life. Problem solved, right? Not so much. It turns out that I had another problem, which went unnoticed for several more years, despite going to the eye doctor regularly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Chapter 2: Strabismus, or the "turned" eye&lt;/span&gt;&lt;/div&gt;&lt;div&gt;My right eye has a tendency to turn outwards and upwards, away from whatever it is that I'm looking at. When I was younger, this happened involuntarily, and fairly frequently. These days, I can do it "at will" which is a pretty great way to weird people out if they haven't seen it before. It still tends to happen spontaneously when I'm tired, or when I'm drunk.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since my left eye is (evidently) my dominant eye, the turning out of my right eye didn't cause me much difficulty, except in one critical visual skill - &lt;span class="Apple-style-span" style="font-style: italic;"&gt;depth perception&lt;/span&gt;. As best as I can remember, I was hit in the face by a baseball or softball while trying to catch it at least a dozen times during my youth. I was also considered pretty "clumsy" in general by most of my friends. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An interesting aside is that your brain actually uses a lot of other cues besides the convergence of your eyes to judge depth, so it's not exactly true that I didn't have &lt;span class="Apple-style-span" style="font-style: italic;"&gt;any&lt;/span&gt; depth perception. It is true that I had really bad depth perception up close, which is where convergence counts the most - hence my spectacularly-bad performance in the whole "get the glove up in front of the ball before it hits you" task.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This particular quirk in my vision went for quite a while before being discovered. In fact, I think it wasn't noticed until I was examined by a new eye doctor for the first time. The doctor who examined me actually had an intern working with him at the time. When he discovered the eye turn, he called the intern in so he could see how it worked.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having established that I had this eye problem, the question then became what to do about it. The treatment for this problem varies depending on the ultimate cause, but can include everything from eye exercises, to wearing an eye patch, to surgery. At the time, it was widely believed that any treatment for this condition was essentially useless after about age 10 or so. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only recommendation from the eye doctor was that they could put a "prism" correction in my eyeglass lenses, which would help reduce any eyestrain I felt from the misaligned eye. As it turned out, the prism correction didn't do very much, either positive or negative, for me, though it did help my eye appear to other people to be pointing in the right direction.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the years since, I've met several people who've had the Strabismus surgery, mostly as young children, and overall the success rate doesn't seem to be particularly high. I opted not to have the surgery, and it's worked out pretty well for me. I'd say that if you (or your child) have Strabismus, and someone suggests surgery, you'd do well to get a second opinion, and/or try some of the other treatments, before going forward with the surgery.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Chapter 3: Amblyopia, or "lazy" eye&lt;/span&gt;&lt;/div&gt;&lt;div&gt; It turns out that if you have Strabismus from an early age, and/or if your eyes have significant differences in their refractive power (which mine do), then you've got an excellent chance of developing Amblyopia, which is where your brain adapts to ignore the input from the defective eye.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had always known that the vision in my right eye was considerably worse than in my left eye, even when I wore my glasses. I had assumed (there's that word again) that the difference had something to do with the difference in astigmatism and nearsightedness between the two eyes. While that was probably part of the cause, it wasn't the whole story.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It turns out that my brain had mostly adapted to not use my right eye, though I still had some amount of vision from it. My right eye provided some peripheral vision on that side, and was essentially ignored for everything else. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An interesting consequence of this that I discovered sometime in my twenties, was that I actually &lt;span class="Apple-style-span" style="font-style: italic;"&gt;couldn't read&lt;/span&gt; if I covered up my left eye. This was a very strange experience. I could see through my right eye fairly well, and there was an image with shapes on it that I knew I ought to be able to recognize, but I wasn't able to make sense of them, at all.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Chapter 4: What I did about it&lt;/span&gt;&lt;/div&gt;&lt;div&gt;It bugged me that my eye was pointing out into space like that, and it really freaked me out that I had one eye that really didn't work at all, so I decided to try to "fix" it. You'll recall that the eye doctor told me that there really wasn't much to be done about this since I was "too old". I figured that if it wasn't going to work, it wasn't likely to hurt to try some things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I also figured that you hear about people who suffer traumatic brain injuries of one sort or another, and need to spend years in therapy, while their brain works around the damage. By comparison, working around a mental block on my right eye should be easy, right?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I started working on getting my right eye to point in the right direction. Since I did this on my own, I wasn't following anybody else's accepted eye training program, I just did the things that made sense to me. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I strengthened my eye muscles and stretched them by repeatedly moving my eyes back and forth to the very limits of their motion. Sometimes I'd go left to right, sometimes top to bottom, sometimes in circles one way or another. I did this for a few minutes at a time, working up to about 1/2 an hour or so. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did these self-invented exercises nearly every night for probably a year or so, before I started noticing an improvement. When I first started, it was relatively easy for me to over-strain my right eye by trying to force it to the limit of its motion. Let me tell you, a cramp in your eye muscles is no fun at all. I still have a couple of positions that my right eye really doesn't like to go into, but the range of motion is much improved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Concurrent with the work on the eye muscles, I tried closing my left eye when I was performing various everyday tasks - watching TV, shopping, driving (not in heavy traffic!), or just walking around. Doing that was always very tiring, and a bit stressful. I tended to get headaches if I tried to do it for very long.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sometime after I moved to California, I had a breakthrough - occasionally, I'd briefly get my eyes to align properly as I was going about my everyday business, and the whole world would suddenly snap into 3-D perspective. It was really disorienting the first couple of times it happened, but I soon enough got used to it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a little like those "magic eye" random-dot stereograms. At first, it takes a while to get the knack of getting your eyes to cross by the right amount. Then suddenly, you get it right, and the image jumps out at you. After that, it gets easier to do. Over the course of several more years, I gradually trained myself to keep my eyes pointed in the same place, such that it's now second-nature.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did go through an irritating period where the convergence of my vision wasn't 100% correct, but I was starting to pick out more detail with my right eye. That caused some double vision and headaches, from time to time. These days, I only have double vision sometimes at night.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Chapter 5: Closing Thoughts&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Well, this is already ridiculously long, so I guess I'll save some of the amusing anecdotes I was originally going to include in here for a follow-up post. Mostly I wanted to get the story down so the folks that have heard me wise-cracking about "now" being able to see in 3-D know what I've been talking about. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also hope that if someone with relatively mild Strabismus and/or  Amblyopia comes across this article, they'll be somewhat encouraged by my success in overcoming them, even after having a late start. Everybody's case is going to be different, but personally, I'm glad that I made the effort.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-4613813710099806173?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/4613813710099806173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=4613813710099806173' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4613813710099806173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4613813710099806173'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/05/eyes-have-it-tale-of-3-vision-problems.html' title='The eyes have it - a tale of 3 vision problems'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3264933929505627942</id><published>2009-04-22T18:54:00.001-07:00</published><updated>2009-04-22T19:07:34.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agility'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>Release early, release often...</title><content type='html'>&lt;div&gt;&lt;b&gt;Six Apps In Six Months - or, Why Mark Can't Schedule&lt;/b&gt;&lt;/div&gt;&lt;div&gt;That was the plan, anyway - but I haven't been able to keep myself on track. It's really difficult to release something when you're the only engineer working on it. It's hard to resist the temptation to just keep polishing the thing, or try out some new ideas, until you're well and truly past your milestone. Ah, well.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Beta Test Now Open&lt;/b&gt;&lt;br /&gt;In the interest of trying to keep the pipeline flowing, I've just released &lt;b&gt;"The Picture Puzzle Game Without an Interesting Name"&lt;/b&gt; to a select group of Beta testers. Since I don't want anyone to miss out on the fun of seeing what you get when I'm forced to release something that I don't think is ready, I'll put a link here to &lt;a href="http://www.starchytuber.com/beta/beta.html"&gt;Starchy Tuber's Secret Beta&lt;/a&gt; page, where you can sign up to Beta test my latest creation.&lt;br /&gt;&lt;br /&gt;If you like puzzle games, or if you're just interested in seeing how the sausage is made, the &lt;b&gt;Starchy Tuber Secret Beta&lt;/b&gt; program is the place to be!&lt;br /&gt;&lt;br /&gt;I reserve the right to limit Beta signups to the first 100 applicants (ha! as if...).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Grr. I just found a typo on the Beta Sign Up instructions. I'll go fix that...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3264933929505627942?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3264933929505627942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3264933929505627942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3264933929505627942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3264933929505627942'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/04/release-early-release-often.html' title='Release early, release often...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-7066967102199013453</id><published>2009-03-25T09:26:00.000-07:00</published><updated>2009-03-25T09:48:01.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='starchytuber'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Easter Pictems - a marketing experiment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MR7bT7RHlnY/Scpb8kKGXRI/AAAAAAAAAFc/XtLOt9mFol4/s1600-h/mark_bunny.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://1.bp.blogspot.com/_MR7bT7RHlnY/Scpb8kKGXRI/AAAAAAAAAFc/XtLOt9mFol4/s400/mark_bunny.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5317163406120606994" /&gt;&lt;/a&gt;&lt;br /&gt;I'm trying an experiment. There's a free version of Pictems up on the App Store now, loaded with just the subset of items appropriate for Easter. &lt;br /&gt;&lt;br /&gt;This version is called "Easter Pictems", appropriately enough, and you can &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=308616518&amp;mt=8"&gt;get it here&lt;/a&gt;, if you're curious about Pictems, but didn't feel like ponying up the $2.99 to find out whether you liked it.&lt;br /&gt;&lt;br /&gt;I'm hoping that folks will download the free version and like it enough to upgrade to the full version. This seems to be a common tactic among developers on the App Store. Of course, people have to find out about your free app if it's to be of any value as a marketing tool. I'll update this post if anything dramatic happens with sales.&lt;br /&gt;&lt;br /&gt;In related news, product #2 is coming along nicely. It's a puzzle game, along the lines of the sliding-squares puzzles you might be familiar with, but with a twist (literally, in this case). For this game, the idea of Free and Pay versions makes a lot of sense, so I'm going to release both at the same time. Here's a preview of the (as yet unnamed) puzzle game:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MR7bT7RHlnY/Scpe9Ar7UvI/AAAAAAAAAFk/QTkJq2TTewg/s1600-h/puzzle.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 208px; height: 400px;" src="http://4.bp.blogspot.com/_MR7bT7RHlnY/Scpe9Ar7UvI/AAAAAAAAAFk/QTkJq2TTewg/s400/puzzle.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5317166712313565938" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-7066967102199013453?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/7066967102199013453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=7066967102199013453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7066967102199013453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7066967102199013453'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/03/easter-pictems-marketing-experiment.html' title='Easter Pictems - a marketing experiment'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MR7bT7RHlnY/Scpb8kKGXRI/AAAAAAAAAFc/XtLOt9mFol4/s72-c/mark_bunny.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1044868089718632623</id><published>2009-03-05T16:16:00.001-08:00</published><updated>2009-03-05T16:36:57.025-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>Obsolescence is a pain in the neck...</title><content type='html'>I'm trying to clean out some of the unused/unloved technology around the house. An interesting case that I'm currently working on is Yvette's old laptop. She used this thing back in her college days, and it'd be nice to be able to get the data off it (for nostalgic purposes), then send it to the great computer graveyard.&lt;br /&gt;&lt;br /&gt;It's an approximately 20-year old NEC DOS-based laptop, with a black-and-white LCD screen, and a massive &lt;span style="font-style:italic;"&gt;20 MB&lt;/span&gt; hard drive. It boots and seems to run just fine, a bit of a miracle in itself, but I haven't yet figured out how to get the data off of it.&lt;br /&gt;&lt;br /&gt;You'd think that it'd be relatively easy to copy the data off this thing, but:&lt;br /&gt;&lt;br /&gt;1. Accessing the floppy drive causes the computer to reboot.&lt;br /&gt;&lt;br /&gt;2. Neither the serial port nor the modem are recognized by the communications software installed on the thing, so I can't transfer data that way.&lt;br /&gt;&lt;br /&gt;3. This computer is old enough that those (and the printer port) are only external I/O ports - there's no USB, no network port, and no wireless network ability.&lt;br /&gt;&lt;br /&gt;I took the thing apart, and discovered that the hard drive in it is actually an IDE drive. Wow - that's almost a current-generation drive technology. I figured I could just get an adapter, and connect the old hard drive directly to a new system. Piece of cake, right? I've already got a Firewire-to-IDE external drive case, so it ought to be just a matter of hooking things up.&lt;br /&gt;&lt;br /&gt;Not so fast. They do make a 44-pin to 40 pin adaptor just for connecting laptop 40-pin drives to an IDE connector, and I can connect that adapter to my Firewire-to-IDE external drive enclosure, and the drive spins up on power-up and everything. However, it isn't recognized properly. Apparently the firewire-IDE adapter doesn't work correctly with this drive. If I had to take a guess, I'd guess that the adapter doesn't support IDE drives which don't do DMA transfers.&lt;br /&gt;&lt;br /&gt;It's a bit frustrating to have a drive that I know is readable, and have no way to get the data off of it. I'll probably try another IDE bridge and see if it works with this drive, but if that's a bust, I may be in the market for an OLD PC that I can connect the drive to, copy the data off of it, and then recycle.&lt;br /&gt;&lt;br /&gt;There may be a trip to &lt;a href="http://www.weirdstuff.com"&gt;Weird Stuff Warehouse&lt;/a&gt; in my near future...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1044868089718632623?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1044868089718632623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1044868089718632623' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1044868089718632623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1044868089718632623'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/03/obsolescence-is-pain-in-neck.html' title='Obsolescence is a pain in the neck...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1949288074985190114</id><published>2009-02-16T12:08:00.001-08:00</published><updated>2009-02-16T12:08:58.583-08:00</updated><title type='text'>Grr. Blogger hates me.</title><content type='html'>It won't even scale images correctly if I use the "upload image" tool. Oh, well. click the image to see the full comic...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1949288074985190114?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1949288074985190114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1949288074985190114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1949288074985190114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1949288074985190114'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/02/grr-blogger-hates-me.html' title='Grr. Blogger hates me.'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1288252862831651225</id><published>2009-02-16T11:51:00.000-08:00</published><updated>2009-02-16T12:07:54.461-08:00</updated><title type='text'>A New Kind of Science meets XKCD</title><content type='html'>400 pages down, 450 to go. Here's my impression so far, with a little help from &lt;a href="http://xkcd.com/"&gt;xkcd&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Conspiracy Theories&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/conspiracy_theories.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 740px; height: 574px;" src="http://imgs.xkcd.com/comics/conspiracy_theories.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;String Theory&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/string_theory.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 386px;" src="http://imgs.xkcd.com/comics/string_theory.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1288252862831651225?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1288252862831651225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1288252862831651225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1288252862831651225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1288252862831651225'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/02/new-kind-of-science-meets-xkcd.html' title='A New Kind of Science meets XKCD'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-9005364617717239434</id><published>2009-02-07T15:27:00.000-08:00</published><updated>2009-02-07T16:32:52.566-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notareview'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>A New Kind Of Science</title><content type='html'>I'm currently struggling my way through Stephen Wolfram's book &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.amazon.com/New-Kind-Science-Stephen-Wolfram/dp/1579550088"&gt;A New Kind Of Science&lt;/a&gt;&lt;/span&gt;. So far, I've made it to about page 200 or so (of 850, not including almost 350 pages of end-notes). I'm not going to review it until (unless?) I've gotten to the end, but so far, I'm not very impressed. This book is really frustrating to read.&lt;br /&gt;&lt;br /&gt;For starters, the title of the book ends up getting repeated over and over in the text. It's fairly common when writing about new phenomena or new ideas to assign names to them, for purposes of shorthand if nothing else. But no - phrases like "a new kind of science", or "the new kind of science I've discovered", or "the new  kind of science described in this book" appear &lt;span style="font-weight:bold;"&gt;over and over&lt;/span&gt; in the first few chapters. This is really hard to read, and gives the impression of really trying to "sell" the idea that there's some kind of radical new idea here, which, 1/4 of the way in, there is so far no sign of.&lt;br /&gt;&lt;br /&gt;It's also really hard to  read a book where the author seems to be taking personal credit for well-known results in computer science, without so much as a reference to the work other people have done in the area. There are some references in the end-notes, but the main text doesn't seem to make any kind of distinction between what's new, and what's well-known or borrowed. For someone who isn't familiar with the field, it'd be easy to get the impression that Wolfram invented everything here. &lt;br /&gt;&lt;br /&gt;I expected that this book would be fascinating. I've been interested in Cellular Automata since the 80's, and some of the things people have been able to do with the &lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt;Game Of Life&lt;/a&gt;, or the &lt;a href="http://en.wikipedia.org/wiki/Wireworld"&gt;Wireworld&lt;/a&gt; CA are pretty amazing. So far, though, there's been a lot of build up for the "big discovery", and some fairly rough-shod introduction to CA theory, but I feel like I'm not making much progress towards any kind of goal.&lt;br /&gt;&lt;br /&gt;Yesterday, in an attempt to see whether it's just me that's having a problem with this book, I did a search for &lt;a href="http://www.cscs.umich.edu/~crshalizi/reviews/wolfram/"&gt;reviews&lt;/a&gt; of &lt;a href="http://www.kurzweilai.net/articles/art0464.html?printable=1"&gt;the book&lt;/a&gt;. The results were not encouraging. &lt;br /&gt;&lt;br /&gt;I'd really like to hear from anybody who has made it all the way through this book. In particular, I'd like to know if I should just skip ahead to the grand conclusion, or slog through the rest of the text.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-9005364617717239434?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/9005364617717239434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=9005364617717239434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/9005364617717239434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/9005364617717239434'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/02/new-kind-of-science.html' title='A New Kind Of Science'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-5595762096210666689</id><published>2009-02-03T12:13:00.000-08:00</published><updated>2009-02-03T12:22:15.244-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='self-examination'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><title type='text'>Well, I'm getting better...</title><content type='html'>I updated my Blogger layout to the "new and improved" form of the old layout. I'm not sure how "improved" it is, but I ended up with a hierarchical archive, which makes it really easy to see how many blog posts I've had in any given month or year, over the history of the blog.&lt;br /&gt;&lt;br /&gt;As I start my 4th year of blogging, I can see that the trend looks like this:&lt;br /&gt;2005: 3 posts&lt;br /&gt;2006: 12 posts&lt;br /&gt;2007: 14 posts&lt;br /&gt;2008: 25 posts&lt;br /&gt;&lt;br /&gt;Last year was the first year that I managed to post at least one blog post a month. That's nowhere  near where I thought I wanted to be, but at least I'm getting better at consistently writing. I think the writing has gotten easier for me, as well. I suspect that the quality hasn't gone up much (if at all), but I've effectively trained myself not to edit my posts to death, and I'm no longer taking months to get one paragraph&lt;span style="font-style:italic;"&gt; just right &lt;/span&gt;for publishing.&lt;br /&gt;&lt;br /&gt;So it's a qualified success. Onward and upward!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-5595762096210666689?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/5595762096210666689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=5595762096210666689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5595762096210666689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5595762096210666689'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/02/well-im-getting-better.html' title='Well, I&apos;m getting better...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1035619070133013359</id><published>2009-01-24T13:08:00.000-08:00</published><updated>2009-01-24T13:22:40.111-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XCode'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>This week's iPhone SDK sob story</title><content type='html'>I have ranted about this before, I know, but I'm a little irritated. Every single time I update the iPhone tools, I run into some crazy issue building code that worked just fine on a previous version.&lt;br /&gt;&lt;br /&gt;This week, after digging my office out from under all the mess from moving to a new house, I revisited one of my older projects (yes, &lt;a href="http://starchytuber.com/Pictems/Pictems.html"&gt;Pictems&lt;/a&gt; is finally getting an update!). And I ran into not one, but two of these issues. That's not counting the usual Code Signing errors, which I don't even pay attention to - I just click randomly on the Code Signing options until they go away.&lt;br /&gt;&lt;br /&gt;(For my friends on the XCode team: Yes, I will file bugs on these issues, once I figure out what's going on. This is not a bug report)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Issue #1:&lt;/span&gt; During some early experimentation, I had set the "Navigation Bar Hidden" property on one of my Nib files. It didn't seem to do what I wanted, but I didn't bother to change it back. At some point, a change was made such that it now works. Great, but apparently the change was actually made in one of the iPhone tools, so even if I build my old project, with the SDK set to 2.0, I still get the new behavior. Easy to fix, but it's weird to have to change my "archived" version of my source so it builds correctly with the current version of XCode. If I build my old project against the old SDK, I'd expect to get the old behavior. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Issue #2:&lt;/span&gt; One of my resource files has a $ character in the name. One of the XCode copy scripts apparently changed such that it's not escaping the filename correctly, so now the resource doesn't get copied. Amusingly, no error message results - the file just ain't there. Yes, it's dubious to name a file with a $ in the name. But, again, it used to work just fine.&lt;br /&gt;&lt;br /&gt;Oh, well. In the bigger scheme of things, I still prefer XCode/iPhone to Eclipse/Android...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1035619070133013359?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1035619070133013359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1035619070133013359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1035619070133013359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1035619070133013359'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2009/01/this-weeks-iphone-sdk-sob-story.html' title='This week&apos;s iPhone SDK sob story'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-241632129342955533</id><published>2008-12-28T14:46:00.001-08:00</published><updated>2008-12-28T17:21:09.271-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dropout'/><category scheme='http://www.blogger.com/atom/ns#' term='puzzles'/><category scheme='http://www.blogger.com/atom/ns#' term='math-illiterate'/><category scheme='http://www.blogger.com/atom/ns#' term='arithmetic'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='modular'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>A math problem</title><content type='html'>Okay, so here's an example of where dropping out of math classes after Differential Equations is coming back to bite me a bit. I'm working on a kind of puzzle, mostly for fun, but possibly to incorporate into a future software product. &lt;br /&gt;&lt;br /&gt;At its most basic, the solution process for the puzzle turns out to be solving a system of simultaneous equations. Which is something I learned how to do way back in High School, and for linear equations, I can even find off-the-shelf algorithms and libraries for doing so.&lt;br /&gt;&lt;br /&gt;The catch, of course, is that these aren't linear equations. They use modular arithmetic, which is something I understand at a basic level, like anybody who programs for a living probably does, but I don't know where to even start breaking this down to solve a non-trivial version, and Google isn't helping me.&lt;br /&gt;&lt;br /&gt;Let's start with a simple linear example:&lt;br /&gt;5x + 7y + 4 = 0&lt;br /&gt;4x + 3y + 1 = 0&lt;br /&gt;&lt;br /&gt;Use whatever method you like, and you get:&lt;br /&gt;x = 0.3846&lt;br /&gt;y = -0.846&lt;br /&gt;&lt;br /&gt;Piece of cake. Now, what if the equation looks like this?&lt;br /&gt;5x + 7y + 4 = 0 (modulo 16)&lt;br /&gt;4x + 3y + 1 = 0 (modulo 16)&lt;br /&gt;&lt;br /&gt;If we want to find a few integer solutions for x and y, how do we find them? I could write a program to just guess every integer between 1 and 1,000,000 for each of the coefficients, and that'd find me a solution, but it doesn't scale well if I have a large number of variables. In the example equations given, there are rather a lot of solutions ([9,9],[9,25],[25,25]...), but I suspect that some other (carefully chosen?) sets of coefficients would have a much smaller set of solutions. Actually, that's kind of the point of the whole exercise.&lt;br /&gt;&lt;br /&gt;Anyone out there got some hints for me? &lt;br /&gt;Googling "simultaneous modular equations" got me:&lt;br /&gt;&lt;a href="http://en.wikibooks.org/wiki/Discrete_mathematics/Modular_arithmetic#Simultaneous_equations"&gt;http://en.wikibooks.org/wiki/Discrete_mathematics/Modular_arithmetic#Simultaneous_equations&lt;/a&gt;&lt;br /&gt;and&lt;br /&gt;&lt;a href="http://www.nada.kth.se/~johanh/rsalowexponent.ps"&gt;http://www.nada.kth.se/~johanh/rsalowexponent.ps&lt;/a&gt;&lt;br /&gt;,both of which are interesting, but not quite what I'm looking for.&lt;br /&gt;&lt;br /&gt;For the case where the modulus is 2, addition is equivalent to XOR, and so logic minimization techniques from EE can be used, but it's not clear to me how to move those up to work in a higher modulus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-241632129342955533?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/241632129342955533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=241632129342955533' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/241632129342955533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/241632129342955533'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/12/math-problem.html' title='A math problem'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-708356612995824947</id><published>2008-11-13T10:29:00.000-08:00</published><updated>2008-11-13T11:00:15.567-08:00</updated><title type='text'>Synchronicity...</title><content type='html'>&lt;a href="http://codemines.blogspot.com/2008/10/returning-to-java-after-10-years-away.html"&gt;A couple of posts ago&lt;/a&gt;, I said:&lt;br /&gt;&lt;blockquote&gt;Hopefully backsliding on the Java thing doesn't mean I'm about to backslide&lt;br /&gt;on the WoW thing - I can't afford the lost time. I've got to learn about how you&lt;br /&gt;do things in Java again.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Today, I got an email from Blizzard, makers of World of Warcraft:&lt;br /&gt;&lt;blockquote&gt;Mark,&lt;br /&gt;You've been summoned back to Azeroth! Your World of Warcraft®&lt;br /&gt;account has been selected to receive 10 FREE days of game time and a FREE trial of The Burning Crusade® expansion pack.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Weird timing. On the other hand, 10 free days can't hurt, right? right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-708356612995824947?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/708356612995824947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=708356612995824947' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/708356612995824947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/708356612995824947'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/11/synchronicity.html' title='Synchronicity...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1207245359393468547</id><published>2008-11-11T17:25:00.000-08:00</published><updated>2008-11-13T10:25:23.476-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>Just In Time compilation vs. the desktop and embedded worlds</title><content type='html'>Okay, rant mode on. As I was waiting for Eclipse to launch again today, it occured to me that one of the enduring mysteries of Java (and C#/.NET) for me is the continued dominance of just-in-time compilation as a runtime strategy for these languages, wherever they're found. We've all read the articles that claim that Java is "nearly as fast as C++", we also all know that that's a bunch of hooey, particularly with regard to startup time. Of course, if Eclipse wasn't periodically crashing on me with out-of-memory errors, then I'd care less about the startup time - but that's another rant. Back to startup time and JIT compilation...&lt;br /&gt;&lt;br /&gt;If you're creating a server-based application, the overhead of the JIT compiler is probably pretty nominal - the first time through the code, it's a little pokey, but after that, it's plenty fast, and you're likely throttled by network I/O or database performance, anyway. And in theory, the JIT compiler can make code that's optimal for your particular hardware, though in practice, device-specific optimizations are pretty minimal.&lt;br /&gt;&lt;br /&gt;On the other hand, if you're writing a desktop application (or worse yet, a piece of embedded firmware), then startup time, and first-time through performance, matters. In many cases, it matters rather a lot.&lt;br /&gt;&lt;br /&gt;There are a number of advantages to writing code in a "managed", garbage-collected language, especially for desktop applications - memory leaks are much reduced, you eliminate buffer overflows, and there is the whole Java standard library full of useful code that you don't have to write for yourself. I'm willing to put up with many of the disadvantages of Java to gain the productivity and safety advantages. But waiting for the Java interpreter to recompile the same application over and over offends me on some basic level.&lt;br /&gt;&lt;br /&gt;On a recent project, we used every trick in the book to speed up our startup time, including a "faked" startup splash screen, lazy initialization of everything we could get away with, etc, etc. Despite all that effort (and unecessary complication in the code base), startup time was still one of the most common complaints from users.&lt;br /&gt;&lt;br /&gt;Quite a bit of profiling was done, and in our case, much of the startup time was taken up deep inside the JIT, where there was little we could do about it. Why oh why doesn't anybody make a Java (or .NET) implementation that keeps the safe runtime behavior, and implements a simple all-at-once compilation to high-performance native code? Maybe somebody does, but I haven't heard of them.&lt;br /&gt;&lt;br /&gt;For that matter, why don't the reference implementations of these language runtimes just save all that carefully-compiled native code so they can skip all that effort the next time? The .NET framework even has a global cache for shared assemblies. Why those, at least, aren't pre-compiled during installation, I can't even imagine.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;I was helpfully reminded of NGen, which will pre-compile .NET assemblies to native code. I had forgotten about that, since so much of my most recent C# work was hosted on Mono, which does things a bit differently. Mono has an option for AOT (ahead of time) compilation, which works, sort of, but could easily be the subject of another long article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1207245359393468547?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1207245359393468547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1207245359393468547' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1207245359393468547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1207245359393468547'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/11/just-in-time-compilation-vs-desktop-and.html' title='Just In Time compilation vs. the desktop and embedded worlds'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-4929067673950509641</id><published>2008-11-04T11:33:00.000-08:00</published><updated>2008-11-04T11:41:01.568-08:00</updated><title type='text'>Vote.</title><content type='html'>It's election day today in America. THis is just a quick reminder for all my friends out there to get out and vote.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Vote.&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Even if "your guy" isn't going to win.&lt;/li&gt;&lt;li&gt;Even if some irresponsible news organization announces "winners" for your state, before the polls are even closed.&lt;/li&gt;&lt;li&gt;Even if "the election has already been decided" before your state's polls close.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There's a lot more going on than just elections for the Federal Government. Whether you're pro-growth or pro-environment, whether you want to support gigantic infrastructure programs in a time of depression, or if you just want to reduce the cost of parking at the airport, &lt;em&gt;ensure that your voice is heard&lt;/em&gt;.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-4929067673950509641?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/4929067673950509641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=4929067673950509641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4929067673950509641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4929067673950509641'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/11/vote.html' title='Vote.'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1721905312808136280</id><published>2008-10-19T18:58:00.000-07:00</published><updated>2008-10-20T15:53:30.358-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><category scheme='http://www.blogger.com/atom/ns#' term='get off my lawn'/><title type='text'>Returning to Java, after 10 years away</title><content type='html'>&lt;img id="BLOGGER_PHOTO_ID_5259372089379016594" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_MR7bT7RHlnY/SP0LDMkKT5I/AAAAAAAAAEE/PAkr17zKrtc/s400/duke.gif" border="0" /&gt;&lt;br /&gt;I'm once again writing Java code professionally, something that I haven't done in nearly 10 years (no, really - I had to stop and think it through because I didn't believe it, either). A couple of thoughts did occur to me, after I'd figured out the time frames involved.&lt;br /&gt;&lt;br /&gt;I was a little taken aback by the very idea that Java is more than 10 years old. It just seems weird that a new programming language could go from introduction to being a major part of the world's IT infrastructure and college curriculums, in less time than I've been living here in California.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Java sure has evolved a lot in the last 10 years. There have been major changes to the language, the libraries, and the tools. I'd bet that some of my 10-year old Java code would throw deprecation warnings for nearly every line of code...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;On the other hand, my final thought is along the lines of "Oh, my god. So much has changed, but Java is still irritating in nearly all the ways that made me crazy ten years ago! What have these people been up to for the last decade?"&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Oh, and I was the first person I knew to "quit" Java, much like I was the first person to "quit" World of Warcraft. Hopefully backsliding on the Java thing doesn't mean I'm about to backslide on the WoW thing - I can't afford the lost time. I've got to learn about how you do things in Java again.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;One good thing for my loyal readers (if any exist) is that I have a bunch of stored-up vitriol about Java that I can just uncork and pour out, so I should be updating more frequently.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1721905312808136280?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1721905312808136280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1721905312808136280' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1721905312808136280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1721905312808136280'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/10/returning-to-java-after-10-years-away.html' title='Returning to Java, after 10 years away'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MR7bT7RHlnY/SP0LDMkKT5I/AAAAAAAAAEE/PAkr17zKrtc/s72-c/duke.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2199214880155279550</id><published>2008-09-28T09:03:00.000-07:00</published><updated>2008-09-28T10:28:59.784-07:00</updated><title type='text'>So, what's it good for? (XO Laptop, part 3)</title><content type='html'>&lt;div&gt;(I wrote this quite a while back, but was never really happy with how it turned out. Here it is, nevertheless)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See also &lt;a href="http://codemines.blogspot.com/2008/01/xo-laptop-mini-review.html"&gt;Part 1&lt;/a&gt; and &lt;a href="http://codemines.blogspot.com/2008/01/xo-laptop-part-2.html"&gt;Part 2&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Okay, so I've had a chance to play with the XO some more, and I've been thinking about how it might be useful for school kids in the developing world. You can read more about the project and their official justifications for it at the &lt;a href="http://laptop.org/"&gt;OLPC web site&lt;/a&gt;. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;But as a computer geek, and an early adopter of the personal computer in my own country (the USA), I thought it might be interesting to look at it from the perspective of my own experience.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;History&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I first encountered Personal Computers some time in the mid-to-late 1970's, when they started appearing, in small numbers, in schools, at my friends' houses, and in stores. The first time I sat down at a computer and typed in a BASIC program, I was totally hooked. I experiemented with computers at other kid's houses, played with the systems on display at local stores, and even stayed after school and took summer classes at the local community college to get access to computers. &lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;For the next few Christmases and birthdays, when my parents asked me what I wanted, I only had one answer: "I want a computer!". Unfortunately, it wasn't until about 1982/3 when my parents could scrape together the nearly unimaginable sum of $500 or so to buy me my first computer - a &lt;a href="http://en.wikipedia.org/wiki/TI-99"&gt;Texas Instruments 99/4a&lt;/a&gt;. I loved that thing to death, and it was a major part of my life for several years. I would have been ecstatic if someone had come to me at age 9 or so and said "here is a computer of your very own, to use at school, and to take home with you at night".&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;I got my first computer-related job my Junior year in High School. In theory, I was hired to do simple assembly and software loading on PCs, but I very rapidly got into more and more programming on a regular basis. You could fairly say that I wouldn't be where I am today without that early access to computer technology. &lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;I went to my 20-year High School reunion recently, and one of the things that struck me was the number of folks who were working in more-or-less high-tech fields, particularly computer software. For a bunch of middle-class midwestern folks, we did really well riding the tech wave. I think that having computers in our schools (and a mandatory computer literacy class in high school) was a major factor there.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Okay, back on track...&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So, having access to computers at an early age changed my life, and led to me to a highly-paid job in the technology industry.  So what? That's probably not a reasonable goal for a poor kid in South America or Africa, there being no reasonable local high-tech industry for them to move into when they grow up (yet).&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;But, as the OLPC folks put it, "this is an education project, not a laptop project". So it's not (just) about providing computer literacy, but improving the educational process overall. &lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;One example of this is textbooks - textbooks are surprisingly expensive, and as a result, aren't readily available, or frequently updated, in developing countries. If every child has their laptop, then textbooks can be stored on them, greatly reducing year-to year costs, allowing for more frequent updates, and freeing the students from carting a heavy load of books to and from school.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Or take language instruction - if you live in a developing country, one of the best things you can do to improve your chances at a better career is to learn a major language of commerce - English, Japanese, Chinese, Arabic, or whatever. But if there aren't any native English speakers in your village, who are you going to learn from? It'd be *really* easy to write a basic English primer to run on the OLPC, complete with video of a native English speaker demonstrating pronunciation.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Other features of the laptop are especially geared towards communication. In addition to the ability to access the internet, every laptop has an integrated video camera. In addition to giving the kids another device to experiment with, the teachers can use it to "send a note home" with the child, even if the child's parents are illiterate. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;But, aren't there better places to spend the money? Don't these people need food and medicine first?&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Yes, that's a common criticism - what's the point of giving children laptops, if they're dying of malnutrition, dysentery, malaria, and AIDS? &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;First, not everybody in the developing world is starving&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In fact, there's no good reason for anybody to go without food, given the surpluses in the USA and elsewhere. If someone is starving out there, it's a political problem (i.e. someone in power doesn't care enough about them to feed them).&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;strong&gt;Second, who's to say we can't do both?&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;There are already lots of charities working on addressing basic human needs. The &lt;a href="http://www.gatesfoundation.org/default.htm"&gt;Gates Foundation&lt;/a&gt; is working to improve the health and basic welfare of children and adults all over the world. They're vaccinating children, helping small businesspeople bootstrap local economies, etc, etc. Meanwhile, the &lt;a href="http://www.who.int/"&gt;World Health Organization&lt;/a&gt; and &lt;a href="http://www.unicef.org/"&gt;UNICEF&lt;/a&gt; are doing their part as well. As an exclusively education-focused initiative, OLPC can provide services that aren't being covered by other agencies.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Knowledge is power&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Finally, you can easily make the argument that a lot of the problems in the developing world are actually educational problems at the root. One reason that AIDS infection rates are so high in Africa is because of lack of education about the causes of AIDS and how to avoid becoming infected.&lt;/div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Similarly, rampant governmental corruption is &lt;span class="Apple-style-span" style="font-style: italic;"&gt;not&lt;/span&gt; inevitable, but if you don't actually &lt;em&gt;know&lt;/em&gt; that things don't work that way elsewhere in the world, how are you ever going to start down the road of cleaning it up?&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I'd like to think that hundreds of thousands of schoolchildren running around with laptops that can function as digital camcorders would help bridge the gap of understanding between the folks in the developing world, and us in the "developed" world. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;In conclusion&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I think that despite the much-publicized management problems with the OLPC project, it's an interesting approach that I hope will have a positive effect on the children that participate. Even if the program as a whole doesn't quite work out as planned, hopefully we'll all learn something from it about how to "do it right" the next time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2199214880155279550?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2199214880155279550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2199214880155279550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2199214880155279550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2199214880155279550'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/01/so-whats-it-good-for-xo-laptop-part-3.html' title='So, what&apos;s it good for? (XO Laptop, part 3)'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-6059153634619849807</id><published>2008-08-28T10:32:00.000-07:00</published><updated>2008-08-28T10:36:55.699-07:00</updated><title type='text'>Cleaning out the backlog...</title><content type='html'>&lt;div align="center"&gt;&lt;span style="font-size:130%;"&gt;Working it to death...&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;It occurs to me that writing a long blog post, then saving it as a draft, and sitting on it for months, occasionally tweaking the wording, then putting it back on the drafts pile to languish is &lt;strong&gt;&lt;em&gt;exactly the kind of behavior&lt;/em&gt;&lt;/strong&gt; I was trying to wean myself off of when I started this blog.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;Bad Mark! No Biscuit!&lt;/div&gt;&lt;br /&gt;So, I'm going to go back through the "drafts" folder and either publish or delete everything in it over the next week or so. So, y'all can look forward to lots of sentence fragments and unfinished thoughts over the next few days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-6059153634619849807?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/6059153634619849807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=6059153634619849807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6059153634619849807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6059153634619849807'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/08/cleaning-out-backlog.html' title='Cleaning out the backlog...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3632361336678096412</id><published>2008-08-28T10:18:00.000-07:00</published><updated>2008-08-28T10:29:21.148-07:00</updated><title type='text'>Team Building: cautionary tales</title><content type='html'>I happened to read &lt;a href="http://thedailywtf.com/Articles/Anything-You-Can-Do-Lyle-Can-Do-Better.aspx"&gt;this article&lt;/a&gt; over at The Daily WTF, and it reminded me of some previous team-building events I've been subjected to over the years. Don't miss the comments, there are some pretty great stories in there, as well.&lt;br /&gt;&lt;br /&gt;What I've learned over the last 20 years or so is that your team either gets along on a day to day basis, or they don't. If management keeps the more dysfunctional members of the group in line, and encourages working together, rather than finger pointing, you've probably already got as coherent a team as you're likely to get, and having them all go go-carting together isn't going to matter.&lt;br /&gt;&lt;br /&gt;On the other hand, if the management plays favorites, or allows bullying to go unchecked, or actually engages in a bit of anti-social behavior themselves, no amount of pot-luck parties are going to change that.&lt;br /&gt;&lt;br /&gt;Having said all that, here are some of my experiences:&lt;br /&gt;&lt;strong&gt;Always remember rule #1:&lt;/strong&gt; If the activity is competitive, &lt;strong&gt;do not&lt;/strong&gt; divide your larger team up according to their everyday organizational structure - e.g. Marketing vs. Engineering, for example. Do it however you have to (alphebetical by last name?) to make sure that the distribution is essentially random. Inter-group rivalry is exactly what you're trying to eliminate, or should be, anyway.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Athletic Competition:&lt;/strong&gt; One former employer had a yearly multi-event athletic competition (mostly "fun" events, like a sack race, or water-balloon toss). Any group of interested employees could form a team, and t-shirts were printed up for the event, and medals given out. As you might well imagine, given that this is an Engineering-heavy organization, injuries were fairly common. Over the years, they gradually rotated out the most physically-stressful events, but I think at least one person still gets injured every year - I had a nerve in my hand crushed during the Tug-of-War one year, for example.&lt;br /&gt;&lt;br /&gt;The hyper-competitive types still worry way too much about doing well, sometimes dragging other folks into their sphere of influence (I mean really, what kind of person &lt;em&gt;organizes drills&lt;/em&gt; for a Pictionary competition?). But overall, it works well, because everybody knows it's just for fun. Since teams are formed on an ad-hoc basis, it has very little of the "you are now part of a team, go be excellent together" aspect of other team-building exercises. Generally, managers don't force their "best" employees to form a team with them, for example.&lt;br /&gt;&lt;br /&gt;Okay, so we can't all work at a company that's willing to throw huge amounts of money and time at something like that. Here's some other experiences I've had:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Laser Tag:&lt;/strong&gt; I have done this a few times, with different teams. There is a bit of a tendency for the more blood-thirsty team members to enjoy themselves &lt;em&gt;a little too much&lt;/em&gt;, but at least the chances of physical injury are minimal. The poor losers will whine that "my gun didn't work", or "I totally shot you first", but the rest of us are used to that (they do it at work every day), so it won't be a problem.&lt;br /&gt;&lt;br /&gt;Most LT arenas can be set up to report only the aggregate team score, which helps the whole team feel like they're working together (which is the whole point, after all), and cuts down on whining. I highly recommend not getting individual stats for each player - those of us who suck at the game, or just aren't as into it, don't need a reminder of how poorly we did.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Movies:&lt;/strong&gt; This can be fun, and usually goes over pretty well, but there's relatively little interaction between team members at a movie. Also, consider that some folks aren't going to want to go to any particular movie you might choose, so have a plan for them to have some fun at the company's expense, too.&lt;br /&gt;&lt;br /&gt;One thing you can do to make this more of an interactive experience is to combine the movie with a pre-or-post get-together (catered lunch, maybe?) where people can get together and mingle casually - maybe even discuss the movie together. Many movie theater chains have an "events person" to help arrange this stuff.&lt;br /&gt;&lt;br /&gt;If you really want to get the biggest bang for the buck, talk to your local theater about renting out an entire theater for your team (if you're large enough), and have the employees choose which movie they want to see, by voting. Or surprise everybody by renting out a theater for the big summer blockbuster movie on opening day.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pot-luck lunches:&lt;/strong&gt; You'd better combine this with something else, or you're in trouble. Some of us really like cooking for a group, but for a lot of employees, this just seems like the company trying to cheap out. At the very least, combine the pot-luck with a 1/2 day, or do it for Halloween and combine it with a costume contest, or something. See also: Picnic in the Park, below.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Miniature Golf:&lt;/strong&gt; This was a surprising (to me, anyway) success. I figured that all the little cliques would go off and do their thing, but we actually had a pretty good mixing thing going on. We played for fun, rather than running some kind of a tournament structure, which probably helped. It's low-impact, so people can chat, and in general, few team memebers are invested enough to get over-competitive.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bowling:&lt;/strong&gt; You might want to try to figure out ahead of time if any of the team members are "serious" bowlers - they might not enjoy playing with a bunch of losers who bowl in the low '60s. But in general, this can work out great - bowling is a "do stuff, then wait" kind of activity, so there will be socialization between rounds. Beer helps with that aspect as well, of course.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Picnic in the Park / Beach day:&lt;/strong&gt; You're probably located not very far from a nice park of some sort. Take all the employees out for the day, and feed them barbeque, or (if budgets are tight) have them pot-luck it, making sure that the basics are covered, using a sign-up sheet. Make sure frisbees and other fun toys are available, and make sure you have some shade. For extra points, make it an "employees and their families" event.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Amusement Park:&lt;/strong&gt; Yeah, everybody will be really excited about this, but you likely won't see anybody after the initial arrival, unless you have a very large group, or a very small park. You can plan to have lunch together at one of the "group areas", and that'll get everyone in the same place for a while, but as a team-building experience, it's low on interaction.&lt;br /&gt;&lt;br /&gt;So, that's my experience, what's yours? I'm particularly keen to hear from folks that have done more strenuous team-building activities, like the ropes course, or paintball...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3632361336678096412?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3632361336678096412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3632361336678096412' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3632361336678096412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3632361336678096412'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/05/team-building-cautionary-tales.html' title='Team Building: cautionary tales'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2752541221136537624</id><published>2008-08-13T14:56:00.000-07:00</published><updated>2008-08-13T15:13:42.449-07:00</updated><title type='text'>Julia Child, International Super-spy</title><content type='html'>They say "truth is stranger than fiction", and &lt;a href="http://news.yahoo.com/s/ap/20080813/ap_on_go_ot/spies_revealed"&gt;stories like this one&lt;/a&gt; prove that beyond any doubt:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;By BRETT J. BLACKLEDGE and RANDY HERSCHAFT, Associated Press Writers &lt;br /&gt;24 minutes ago&lt;br /&gt; &lt;br /&gt;WASHINGTON - Famed chef Julia Child shared a secret with Supreme Court Justice Arthur Goldberg and Chicago White Sox catcher Moe Berg at a time when the Nazis threatened the world. They served in an international spy ring managed by the Office of Strategic Services, an early version of the CIA created in World War II by President Franklin Roosevelt. &lt;/blockquote&gt;&lt;br /&gt;Apparently the CIA is finishing up the transfer of old OSS documents to the National Archives, and the list of OSS employees was one of the most recent things to get approved for declassification. &lt;br /&gt;&lt;br /&gt;The article on Yahoo! News has a link to &lt;a href="http://tinyurl.com/6bvmhf"&gt;this page&lt;/a&gt;, a CIA page describing the history and activities of the OSS during World War II.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2752541221136537624?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2752541221136537624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2752541221136537624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2752541221136537624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2752541221136537624'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/08/julia-child-international-super-spy.html' title='Julia Child, International Super-spy'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-6036992033575092044</id><published>2008-08-03T15:31:00.000-07:00</published><updated>2008-08-03T17:04:19.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pictems'/><category scheme='http://www.blogger.com/atom/ns#' term='softwarebiz'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Pictems, three weeks in</title><content type='html'>&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;a href="http://2.bp.blogspot.com/_MR7bT7RHlnY/SJZEXg2PeZI/AAAAAAAAADM/yHTpCDzuk14/s1600-h/MarkPirate.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230443187982530962" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_MR7bT7RHlnY/SJZEXg2PeZI/AAAAAAAAADM/yHTpCDzuk14/s400/MarkPirate.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;"So, where's my update?"&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;That seems to be the most common question from our &lt;a href="http://starchytuber.com/Pictems/Pictems.html"&gt;Pictems&lt;/a&gt; customers lately. I've been running a bit behind my (unannounced) schedule, but I'm still hopeful that I'll have the first update finished and posted sometime this week. Mark K. has done some awesome updated item artwork (see above), and I think I have a handle on the user-interaction problems we had with 1.0, such that the new version will be easier to use.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;"How many downloads have you gotten?"&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The most common question from my friends and family seems to be "how many downloads have you gotten?", or alternatively, "are you ready to quit your day job, yet?". We don't actually know how many downloads we've gotten overall, since we haven't gotten our first monthly financial statement from Apple, yet.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I did try some hand-waving estimates, based on traffic on the starchytuber.com site. Based on those figures, I figured we had &lt;em&gt;somewhere between 30 and 300 users&lt;/em&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;and boy, was I ever wrong...&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Apple has just recently given us the last 6 days worth of daily download statistics, and I'm . . . stunned at the number of downloads we're getting. In the last 6 days, we've averaged more than 50 downloads a day. That means we've had as many downloads &lt;em&gt;this week&lt;/em&gt; as I was expecting to see from the whole three week period.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, despite the fact that Pictems isn't localized for any other language than English, we have downloads from more than 18 different countries. That's pretty astonishing to me, and probably indicates that we'd do a lot better with an application that was localized in multiple languages. I'll have to look into translation costs for application #2.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Where my estimates went wrong&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;Here's where I think I misled myself and came up with a far too low estimate of our customer base.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;"Unique" computers aren't&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;The "unique hosts" count that our web hosting provider gives us doesn't exactly correspond to the actual number of people that visit the site - someone who looks at the site from home &amp;amp; from work will be counted twice, multiple people hitting our site from behind a web proxy or NAT router would only count as one person, etc. I figured that these would balance out, but I think that the latter factor turns out to have a much greater influence.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Most people will never look at the web site&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I figured that some of the people hitting the site would be friends and relatives, and some percentage would be actual customers. I also assumed that some small percentage of people would see the application on iTunes, check out the website, then decide the software wasn't for them.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;So I estimated that somewhere between 10-100% of the "website visitors" represented sales. Building on top of the (probably worthless) "unique hosts" number, I compounded the error by assuming every paying customer would look at the site at least once.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;As it turns out, I personally have bought something like 10 applications for my iPhone (other photo-related apps for competitive analysis, and a few games), and I've visited the websites for only two of them, once each.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;No one signs up for the mailing list&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;I also had an email address set up so people could ask to be put on a list to be notified of updates when they were available. We've had 6 people (I think) sign up for the mailing list so far. This means that the sign-up percentage is probably substantially below 1%, which was what I figured would be the minimum number that would sign up.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Given that the iTunes App Store will automatically notify customers when an update is available, there's really no reason for them to sign up. I didn't really consider that, but I may just quietly kill off the "updates" mailing list if it never gets above 12 users or so.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;So what's your best guess now?&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Well, I really don't want to go out on a limb here, but it seems likely that the last 6 days probably don't represent our "best" days, in terms of downloads. They probably aren't the "worst" days, either. If we assume that they were about average, then we've had about 1,100 downloads over the last 22 days. That's &lt;em&gt;not bad at all&lt;/em&gt;, by my standards. It's possible that the actual number of downloads is much higher - the first couple of weeks of the App Store being open was probably a bit of a feeding frenzy...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;So my current guess is that we'll probaby have sold somewhere between 1,200 and 5,000 copies of Pictems in the first month. If you think you have a better guess, e-mail it to me, along with your t-shirt size, at &lt;a href="mailto:salescontest@starchytuber.com"&gt;salescontest@starchytuber.com&lt;/a&gt;, and if you have the closest guess, I'll send you a one-of-a-kind Starchy Tuber t-shirt to celebrate your estimation prowess. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;So, &lt;em&gt;are you&lt;/em&gt; going to quit your day job?&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;When i was asked "are you going to quit your day job?" for the first time, I decided to sit down and work it out. I figured that if we sold 100 copies in the first month, we'd have lost money on the whole thing, if we had 1,000 downloads we'd actually be making money, and if we had 10,000 downloads in the first month, then I'd seriously have to consider whether it made sense to stay in my "day job", or actually try to make a living as an independent software developer.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I guess we'll know in a week or two if the number of downloads is close to that 10,000 download mark in the sand. Of course, it'd be sheer madness to assume that downloads will continue at the same rate forever, so it'll be several months at least before I'm ready to make that "stay or go" decision.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Hopefully by then I'll have several applications on the store, at different stages in their lifecycles, and at different price points. That should give me a more realistic idea of what the earning potential is. I'll keep you posted.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-6036992033575092044?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/6036992033575092044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=6036992033575092044' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6036992033575092044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6036992033575092044'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/08/pictems-three-weeks-in.html' title='Pictems, three weeks in'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MR7bT7RHlnY/SJZEXg2PeZI/AAAAAAAAADM/yHTpCDzuk14/s72-c/MarkPirate.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2543623593672862691</id><published>2008-07-11T02:27:00.000-07:00</published><updated>2008-07-12T14:16:50.625-07:00</updated><title type='text'>Pictems!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MR7bT7RHlnY/SHkarIpcGFI/AAAAAAAAADE/cOBK6eBF3FA/s1600-h/IMG_0096.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_MR7bT7RHlnY/SHkarIpcGFI/AAAAAAAAADE/cOBK6eBF3FA/s400/IMG_0096.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5222234571270789202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pictems is now available!&lt;br /&gt;&lt;/span&gt;Hey, so my first iPhone application is currently available on the iPhone App Store. It's been a tremendous amount of work to get to this point, but now it's out, and I can step back a little and take a deep breath and think about what was good, what was bad, and what I would do differently next time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://starchytuber.com/Pictems.html"&gt;We even have a website set up!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;So, what is it?&lt;br /&gt;&lt;/span&gt;The name "Pictems" is a conflation of "Pictures" and "items". Pictems is a simple application that lets you take the pictures from the photo library on your iPhone or iPod touch, add a variety of fun embellishments to them, and save them to send them to your friends and family.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What's it like writing iPhone applications?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;It's pretty great. Having previously written applications using the Cocoa framework on Mac OS X, I was in pretty familiar territory. There are a few little quirks in the iPhone framework, and a number of features are a little clunky, but the tools are eminently useable, and the documentation is already much better than I expected. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For anybody who has experience developing for other mobile platforms, I can tell you that this is a lot more like developing a desktop application than like developing for a traditional embedded system. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What do I like most about the application?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I think we started with a really fun idea, and (mostly) resisted the temptation to throw in lots of features at the last minute. The current version is really stable, and (I think) is easy to use.  More importantly, it's fun!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We'll be doing a feature update soon to polish the user interaction model a bit, but at this point, Yvette (my lovely wife and Alpha tester) and I have made literally hundreds of these images, and we're still having fun with it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What will I do differently next time?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I wish I'd thought through the application "flow" a bit better. Our current design has a bit of a "dead end" in one of the user interactions - you can get in easily, but it's not obvious how to get back to where you were. That's partly a result of a feature that we pulled at the last minute, but I wish I'd paid a bit more attention to the iPhone Human Interface Guidelines. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next version will be more polished, but I think we got the underlying model right, so it'll be easy to expand the feature set without having to redesign everything from scratch.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I already have plans for a couple more iPhone applications, so I need to start looking into which of those I'm going to add to the Starchy Tuber family of programs first.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2543623593672862691?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2543623593672862691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2543623593672862691' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2543623593672862691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2543623593672862691'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/07/pictems.html' title='Pictems!'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MR7bT7RHlnY/SHkarIpcGFI/AAAAAAAAADE/cOBK6eBF3FA/s72-c/IMG_0096.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3234339195206019639</id><published>2008-06-16T23:23:00.000-07:00</published><updated>2008-06-17T09:33:38.984-07:00</updated><title type='text'>The Problem with Magic...</title><content type='html'>The problem with software that works as if "by magic" is that when it's broken, you're practically helpless. I just ran into my first instance of that with the iPhone SDK. I can't go into specifics here because of the NDA, but I just spent a really annoying couple of hours trying to resolve a problem where a better-worded error message would have immediately revealed the actual issue.&lt;br /&gt;&lt;br /&gt;Hint to API implementers. Saying: "I loaded your file, but **** isn't set correctly" is &lt;span style="font-style:italic;"&gt;not at all the same thing as&lt;/span&gt; "I tried to load your file, but I couldn't find it, and therefore **** couldn't be set up". Finding a typo in a textfield in Interface Builder by starting from scratch and re-building the whole interface kind of eats into the productivity advantage of using IB in the first place.&lt;br /&gt;&lt;br /&gt;Oh, well. At least I didn't have to burn one of my tech support incidents to have someone point out a typo for me. That would have been really infuriating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3234339195206019639?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3234339195206019639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3234339195206019639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3234339195206019639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3234339195206019639'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/06/problem-with-magic.html' title='The Problem with Magic...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1110780074691822590</id><published>2008-06-13T13:18:00.000-07:00</published><updated>2008-06-13T13:30:53.588-07:00</updated><title type='text'>What a week...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MR7bT7RHlnY/SFLXiqsNpiI/AAAAAAAAACk/k62Uha5y7k4/s1600-h/IMG_0003.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_MR7bT7RHlnY/SFLXiqsNpiI/AAAAAAAAACk/k62Uha5y7k4/s400/IMG_0003.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5211464709396342306" /&gt;&lt;/a&gt;&lt;br /&gt;Five days, 21 sessions (not including the keynote), and 12 rides on Caltrain up to San Francisco and back. My head is spinning, but my first two iPhone applications are installing and running. &lt;br /&gt;&lt;br /&gt;I think I'm ready to go back to work and &lt;span style="font-style:italic;"&gt;take it easy&lt;/span&gt; for a while. Unfortunately, I think my boss has other ideas...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1110780074691822590?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1110780074691822590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1110780074691822590' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1110780074691822590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1110780074691822590'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/06/what-week.html' title='What a week...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MR7bT7RHlnY/SFLXiqsNpiI/AAAAAAAAACk/k62Uha5y7k4/s72-c/IMG_0003.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-984896396206924151</id><published>2008-06-06T10:50:00.000-07:00</published><updated>2008-06-06T11:31:00.817-07:00</updated><title type='text'>WWDC 2008</title><content type='html'>&lt;a href="http://farm2.static.flickr.com/1127/1244581090_12805fed47_b.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px;" src="http://farm2.static.flickr.com/1127/1244581090_12805fed47_b.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I'm really excited to be going to WWDC this year, for the first time as an attendee. WWDC is Apple's Worldwide Developer Conference, which is 5 solid days of technical education and on all things related to Mac and iPhone development. &lt;br /&gt;&lt;br /&gt;The only other times I've gone to WWDC, it was as an Apple employee, and I spent my time there helping customers with their issues. Not that that wasn't fun - it was probably the most enjoyable part of my time at Apple. But I am looking forward to sponging up mass quantities of information, and asking my former co-workers stupid questions :-)&lt;br /&gt;&lt;br /&gt;I know a lot of the Mac enthusiast and rumor-tracking sites are wildly speculating on what new Apple products might or might not be announced at WWDC. I'm only vaguely interested in any possible hardware announcements. I think the most important announcement form Apple in the last 10 years was the introduction of the iPhone - not because the hardware was so special, but because they built it on OS X, and released an SDK relatively soon thereafter.&lt;br /&gt;&lt;br /&gt;Hardware is interesting, but it tends to follow a fairly predictable pattern. This year's Macs will be some combination of faster, lighter, and thinner, and there will inevitably be iPhones with more storage, faster network connectivity, and more features.&lt;br /&gt;&lt;br /&gt;More interesting to me is that Apple has really started to embrace having a single platform that supports multiple kinds of products. I wrote &lt;a href="http://codemines.blogspot.com/2007/01/so-thats-what-it-feels-like.html"&gt;a whole blog post&lt;/a&gt; on that subject a while back, but the fact that Apple can now get a microprocessor for $10 or so that'll run OS X means that they can aggressively move into whatever new kinds of products they want, based on variations of the new iPhone platform. It's an exciting time to be a developer for Apple's platform.&lt;br /&gt;&lt;br /&gt;For those of you who'll also be there, keep an eye out for me - I'll be haunting the iPhone sessions, and working furiously to finish up a couple of projects I've been working on, now that I can actually test and debug them on iPhone hardware (my developer certificate arrived just in time for WWDC).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-984896396206924151?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/984896396206924151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=984896396206924151' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/984896396206924151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/984896396206924151'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/06/wwdc-2008.html' title='WWDC 2008'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1127/1244581090_12805fed47_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-8965719363411436986</id><published>2008-05-28T14:06:00.000-07:00</published><updated>2008-05-28T14:42:59.850-07:00</updated><title type='text'>Why you should visit the Computer History Museum sooner, rather than later</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_MR7bT7RHlnY/SD3KLG9disI/AAAAAAAAACc/YlNHtHLFtGQ/s1600-h/Victoria%27sBirthday%26ComputerHistory+076.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5205539036505934530" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_MR7bT7RHlnY/SD3KLG9disI/AAAAAAAAACc/YlNHtHLFtGQ/s400/Victoria%27sBirthday%26ComputerHistory+076.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If you live in Silicon Valley, you've probably at least heard of the &lt;a href="http://www.computerhistory.org/"&gt;Computer History Museum&lt;/a&gt;. If you're like me, you probably even planned on going "one of these days". There's a very good reason to schedule that visit sometime in the next 10 months or so, though.&lt;br /&gt;&lt;br /&gt;A full-scale working model of Charles Babbage's &lt;a href="http://en.wikipedia.org/wiki/Difference_engine"&gt;Difference Engine&lt;/a&gt; Number Two is currently on display at the CHM until May of 2009. There is only one other like it in the world, at the Science Museum in London, UK.&lt;br /&gt;&lt;br /&gt;It's one of the most beautiful pieces of machinery I've ever seen, as well as marking a significant milestone in the evolution of computers. We went down for the exhibit's opening, and actually got to see the machine in operation. I gather that they're not running it all the time on regular days - that's a pity, but seeing as it cost millions of dollars to make, and they're merely borrowing it, I guess I understand that.&lt;br /&gt;&lt;br /&gt;It's almost hypnotic to watch, with the carry mechanism rippling up the columns of digits, and hundreds of pounds of brass and steel moving up and down for each step of the calculation. &lt;br /&gt;&lt;br /&gt;In addition (ha, ha!) to the Difference Engine, the museum has a large number of other historic computer systems on display, including a Connection Machine, several Cray super computers, and pieces of the SAGE system. Walking through their "Visible Storage" area, a loosely-organized subset of the museum's collection, was fascinating. There's everything from abacuses to supercomputers in there, along with various bits of esoterica that the younger generation wouldn't have seen or even heard of before - drum memory, magnetic cores, etc, etc.&lt;br /&gt;&lt;br /&gt;All in all, well worth a visit. The museum is definitely a work in progress, but admission is free, and there's nothing quite like it anywhere else. They also have a regular lunch lecture series, starting up again soon, with discussions of various people and machines in computing history. Since I work right down the street from the museum, I'm planning to try to attend events at the museum more often.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-8965719363411436986?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/8965719363411436986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=8965719363411436986' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/8965719363411436986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/8965719363411436986'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/05/why-you-should-visit-computer-history.html' title='Why you should visit the Computer History Museum sooner, rather than later'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MR7bT7RHlnY/SD3KLG9disI/AAAAAAAAACc/YlNHtHLFtGQ/s72-c/Victoria%27sBirthday%26ComputerHistory+076.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-4642876868788387499</id><published>2008-05-06T09:18:00.000-07:00</published><updated>2008-05-16T23:31:32.865-07:00</updated><title type='text'>The intermediate approach...</title><content type='html'>I've &lt;a href="http://codemines.blogspot.com/2006/09/hell-is-multi-threaded-c-program.html"&gt;written before&lt;/a&gt; about how the shared memory multi-threaded model for concurrent processing is an evolutionary dead-end, and how we'll "inevitably" need to move to some other model. I'm a big fan of message-passing systems, but there are other models that also take advantage of multiple processors without the fiendish complexity of mutex-protected, shared memory threads.&lt;br /&gt;&lt;br /&gt;Well, you might have heard that Microsoft (with some assistance from the academic community and hardware vendors) is working on their own solution to the "multicore dilemma". Unsurprisingly, they're not recommending that everybody throw away their imperative C++ and C# code, and adopt an entirely new programming paradigm, like functional programming. Instead, they're implementing a series of tools that make it much easier to get a lot of the benefit of multiple processors, without having to learn a new way of thinking.&lt;br /&gt;&lt;br /&gt;Late last year, the first fruits of this work became available. The "Parallel Extensions to .NET" (or Parallel FX) are available from Microsoft as a free download, as a Community Technology Preview (basically, an open Beta).  You can read much more about it at Microsoft's website &lt;a href="http://msdn.microsoft.com/en-us/concurrency/default.aspx"&gt;here&lt;/a&gt;. There's a great &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163340.aspx"&gt;MSDN Magazine article&lt;/a&gt; that hits the high points, as well.&lt;br /&gt;&lt;br /&gt;One key point in their design is the realization that anonymous functions (they call them anonymous delegates, but that's just jargon) provide a simple way to package up a "unit of work" to pass off to another processor. This is nothing new to the functional programmers out there, I know. But for folks who are firmly rooted in the C/C++ tradition, learning that they can replace:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;for (int i = 0; i &lt; 100; i++) { &lt;br /&gt;  a[i] = a[i]*a[i]; &lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;with &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Parallel.For(0, 100, delegate(int i) { &lt;br /&gt;  a[i] = a[i]*a[i]; &lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and get a massive speedup on multi-core machines, is likely to be something of a revelation. Parallel FX does some fun stuff under the hood with all those delegate invocations, as well, enabling better work sharing - see the MSDN article for details. I thought this was an interesting hybrid approach, rather than the "all or nothing" approach to addressing concurrency.&lt;br /&gt;&lt;br /&gt;For those that are already familiar with OpenMP, it's a somewhat similar model, in many ways. The additional abstraction provided by having an anonymous function does simplify the simple cases, though - the arguments to the function are "private", and everything else is "shared", basically.&lt;br /&gt;&lt;br /&gt;One of these weekends, I'll have to take a deeper look into Parallel FX. I did find it fascinating that a single language feature (anonymous delegates) can be leveraged to do so much, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-4642876868788387499?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/4642876868788387499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=4642876868788387499' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4642876868788387499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/4642876868788387499'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/05/intermediate-approach.html' title='The intermediate approach...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-1574993647189010683</id><published>2008-04-09T11:00:00.000-07:00</published><updated>2008-05-06T09:55:09.880-07:00</updated><title type='text'>Tolkien is probably rolling in his grave</title><content type='html'>This is just sick and wrong:&lt;br /&gt;&lt;a href="http://overview.mail.yahoo.com/featured_video"&gt;The Friends List Of The Ring&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;edit 2008/05/06: The original link is gone. Here's a &lt;a href='http://www.youtube.com/watch?v=UK_KQwsYB1I'&gt;YouTube&lt;/a&gt; link.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-1574993647189010683?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/1574993647189010683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=1574993647189010683' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1574993647189010683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/1574993647189010683'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/04/tolkien-is-probably-rolling-in-his.html' title='Tolkien is probably rolling in his grave'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-7135121004484836860</id><published>2008-03-19T16:27:00.000-07:00</published><updated>2008-03-20T07:39:51.925-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sci-Fi'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='life imitates art'/><title type='text'>Most surpising headline of the year</title><content type='html'>&lt;a href="http://www.eetimes.com/news/latest/showArticle.jhtml;jsessionid=HTTOTGYXPCPWSQSNDLSCKHA?articleID=206904213"&gt;"Silicon compound superconducts at room temperature"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately this turns out to be bad reporting...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-7135121004484836860?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/7135121004484836860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=7135121004484836860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7135121004484836860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7135121004484836860'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/03/most-surpising-headline-of-year.html' title='Most surpising headline of the year'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-8811540617481057868</id><published>2008-03-18T11:27:00.001-07:00</published><updated>2008-03-18T12:05:42.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='rants'/><title type='text'>Is it my imagination?</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_MR7bT7RHlnY/R-APPBawkLI/AAAAAAAAACU/vcUQe6QGLk8/s1600-h/IEerror.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5179156322229194930" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_MR7bT7RHlnY/R-APPBawkLI/AAAAAAAAACU/vcUQe6QGLk8/s400/IEerror.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Am I mis-remembering, or did Internet Explorer formerly produce more helpful error messages than this one when failing to connect to a website? Is this another IE7 "feature"? Why would you display the exact same error message for no network connectivity, a DNS failure, and a site that doesn't respond?&lt;br/&gt;&lt;br/&gt;Given that it's trivially easy to distinguish each of these three from the other cases, why not at least tell me which is actually the problem?&lt;br/&gt;&lt;br/&gt;Grr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-8811540617481057868?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/8811540617481057868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=8811540617481057868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/8811540617481057868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/8811540617481057868'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/03/is-it-my-imagination.html' title='Is it my imagination?'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MR7bT7RHlnY/R-APPBawkLI/AAAAAAAAACU/vcUQe6QGLk8/s72-c/IEerror.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2200349431962763922</id><published>2008-03-12T09:25:00.000-07:00</published><updated>2008-03-13T23:55:04.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Lua'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>L. U. A. That spells Moon!</title><content type='html'>&lt;p&gt;As I mentioned previously, I've been working with Lua recently. I'm really enjoying it. I'd place Lua somewhere slightly to the right of Tcl on my &lt;a href="http://codemines.blogspot.com/2008/03/leaning-towards-left.html"&gt;Programming Language Complexity Chart&lt;/a&gt;, which probably explains why I found it so immediately appealing.&lt;br /&gt;&lt;br /&gt;There are many kinds of simplicity. I think that one of Lua's strong points is that it tries to get the most possible mileage out of each language feature. For example: Lua is dynamically typed, meaning that values have a type, but any variable can hold a value of any type. Lua defines the following value types: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;number&lt;/li&gt;&lt;li&gt;string&lt;/li&gt;&lt;li&gt;boolean&lt;/li&gt;&lt;li&gt;nil&lt;/li&gt;&lt;li&gt;function&lt;/li&gt;&lt;li&gt;table&lt;/li&gt;&lt;li&gt;thread&lt;/li&gt;&lt;li&gt;userdata&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For purposes of this discussion, we're going to ignore the userdata type, since that's mostly used when dealing with opaque data from the "host" program (Lua being designed to be used as an embeddable interpreter).&lt;/p&gt;&lt;p&gt;Now, this is obviously more types than some other scripting languages, but it's still a fairly short list. Most of the types are fairly self-explanatory - number represents a numeric value, strings are used for text, booleans are used for true and false, nil is the value of an uninitialized variable, and function represents a function.&lt;/p&gt;&lt;p&gt;Tables are an interesting case. Tables are Lua's implementation of the Associative Array, everybody's (or at least my) favorite universal data structure. Once you've got a data structure that can index arbitrary values with arbitrary keys, you can use it for all sorts of things - and Lua does. As the book &lt;a href="http://www.lua.org/pil/"&gt;Programming in Lua&lt;/a&gt; puts it:&lt;/p&gt;&lt;blockquote&gt;Tables in Lua are not a data structure; they are &lt;em&gt;the&lt;/em&gt; data structure.&lt;/blockquote&gt;&lt;p&gt;Tables are used to implement records, arrays, Object-Oriented Programming features, namespaces (the package system),  and a variety of other features. Even global variables are implemented as entries in a table. &lt;/p&gt;&lt;p&gt;One extremely powerful feature of Lua is metatables, which are tables that affect the behavior of other tables. Every table can have a metatable attached to it, which controls the behavior of the table when certain operations are perfomed on it. This is conceptually similar to operator overloading in C++, but again just implemented as a series of entries in a table.&lt;/p&gt;&lt;p&gt;People have implemented both class-based and prototype-based OOP systems for Lua using just a few relatively simple functions that manipulate tables and metatables. That's a pretty good example of the power that's available. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2200349431962763922?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2200349431962763922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2200349431962763922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2200349431962763922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2200349431962763922'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/03/l-u-that-spells-moon.html' title='L. U. A. That spells Moon!'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-5741046498048955346</id><published>2008-03-10T22:20:00.000-07:00</published><updated>2008-03-10T22:59:07.310-07:00</updated><title type='text'>Leaning towards the left...</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_MR7bT7RHlnY/R9YacxawkKI/AAAAAAAAACM/uHat1g4K5f8/s1600-h/Complexity.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_MR7bT7RHlnY/R9YacxawkKI/AAAAAAAAACM/uHat1g4K5f8/s400/Complexity.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5176353903313195170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This diagram is an adaptation of something I wrote on a co-worker's cube wall. I based this on my own experiences, so it probably reflects my prejudices, especially with regard to the placement of the "Human Limit" marker. It'd be interesting to come up with some kind of objective measure for the complexity of a programming language. Maybe multiply the number of reserved words by the number of operators, or something.&lt;br /&gt;&lt;br /&gt;I think that excessive simplicity is one issue that limits adoption of the languages to the left of the diagram. Though I've never heard someone come out and say it, I think a lot of programmers are actually put off by syntax that's too simple. People complain about "all those parantheses" in Lisp, but what really bugs them is that the parentheses are really all there is to Lisp, the language.&lt;br /&gt;&lt;br /&gt;I tend to prefer languages with simple syntax. I find that a simple set of rules to remember helps me to focus on what I'm trying to accomplish, rather than how to harness the myriad of tools available to me to actually do the work. I also find that simple languages are paradoxically more flexible. In a language like Lisp or Tcl, it's easy (and more or less encouraged) to extend the language with your own constructs, which are "first class citizens" as far as the language is concerned. &lt;br /&gt;&lt;br /&gt;Having said all that, even I have my limits. While Smalltalk is a wonderful system for puttering around with, I don't love it. I think the lack of a more-sophisticated syntax for algebraic expression really hampers the usability of the language.&lt;br /&gt;&lt;br /&gt;I'll add some additional commentary tomorrow, especially with regards to where Lua (the most recent language I've learnt) fits on the diagram, and what that implies about Lua...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-5741046498048955346?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/5741046498048955346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=5741046498048955346' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5741046498048955346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5741046498048955346'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/03/leaning-towards-left.html' title='Leaning towards the left...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MR7bT7RHlnY/R9YacxawkKI/AAAAAAAAACM/uHat1g4K5f8/s72-c/Complexity.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-5356811949768940354</id><published>2008-02-27T12:11:00.000-08:00</published><updated>2008-02-27T13:23:30.970-08:00</updated><title type='text'>A fun little puzzle</title><content type='html'>I ran into this interesting puzzle over at &lt;a href="http://discuss.techinterview.org/"&gt;techInterview.org&lt;/a&gt;, which is a site dedicated to the kind of mental puzzles interviewers at certain companies love to ask job candidates. The puzzle is:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;A 5*5 array is initialized to all 1s. Each cell can be either 0 or 1. When you flip a cell (m,n) (say from 1 to 0) all its four neighbors(left, right, up and down) flip. You need to change the array into all ZEROs by flipping the cells. How many minimum flips are required?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If I was really clever, I'd insert a Javascript widget here that let you play the game (assuming that Blogger even allows that), but I think the description is probably clear enough.&lt;br /&gt;&lt;br /&gt;What was fun about the puzzle to me is that there are a huge number of states that the puzzle can be in, but it's obvious that there just has to be a better way to find a solution than just thrashing around blindly.&lt;br /&gt;&lt;br /&gt;I was out sick from work yesterday, and in between naps, I tried working on the puzzle. Unfortunately, I just wasn't able to get much traction on the problem by trying to figure it out logically. Once I got frustrated enough, I resorted to a brute-force search of the solution space, which found 4 solutions, all of which were reflections and rotations of the same moves.&lt;br /&gt;&lt;br /&gt;Leaving aside whether it's really very fair to ask for a "minimal" solution to a puzzle that only has one solution, it wasn't until I was copying the solution out of the terminal window that I saw the symmetry trick that makes it work.&lt;br /&gt;&lt;br /&gt;Normally, when I'm trying to solve something like this, which just "has" to have a simple solution, I start by solviung a much simpler version, then try to scale up to the original problem as stated. For some reason, that process simply didn't occur to me yesterday. Had I tried starting with a 2x2 matrix and working my way up, I probably would have seen a pattern in the solutions pretty easily, and solved the puzzle by hand in a few minutes.&lt;br /&gt;&lt;br /&gt;What did occur to me was that the total number of states, while large, was still well within the range where an exhaustive search would be reasonable. Once I had the program written to search for solutions, I ran it, and it finished suspiciously quickly. It turned out I had a bug, along the lines of using 2^25 instead of 2^26-1 in a critical place. I fixed that, re-ran it, and it still took less than 10 seconds. What the heck?&lt;br /&gt;&lt;br /&gt;I tend to forget that the computers we have these days are &lt;em&gt;so darn fast&lt;/em&gt;. Despite the fact that I'd done nothing to optimize that algorithm I was using, the PC was cranking along at 1 or 2 billion instructions a second, evaluating the 33,554,431 possible solutions at a speed of a few million iterations a second.&lt;br /&gt;&lt;br /&gt;It's easy to think "this computer is so slow", when you're waiting multiple seconds for it to wake from sleep, or for some crazy Java applet to load, but when I see the results of the machine just cranking on some simple calculation, I'm just amazed at the power there.&lt;br /&gt;&lt;br /&gt;If you want to see my thought process while I was working on this puzzle, you can read the techInterview discussion &lt;a href="http://discuss.techinterview.org/default.asp?interview.11.596782.9"&gt;here&lt;/a&gt;, though my solution is there, so don't read it if you don't want to be spoiled. I'll probably post my code here later, so you can see what kind of C code I write when nobody's watching, and while I'm sick to my stomach :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-5356811949768940354?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/5356811949768940354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=5356811949768940354' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5356811949768940354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5356811949768940354'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/02/fun-little-puzzle.html' title='A fun little puzzle'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-7525893151787364216</id><published>2008-02-22T14:12:00.000-08:00</published><updated>2008-02-22T15:39:44.324-08:00</updated><title type='text'>Monkey madness!</title><content type='html'>It seems like in every job I take, I eventually end up developing an API, or a programming language, or a macro processor, or something similar. I don't know if this is characteristic of the sorts of jobs I take, or if it's just a reflection of the sort of approach I tend to take to solving problems. I suspect both factors are at play.&lt;br /&gt;&lt;br /&gt;My latest foray into tool development started innocently enough. At &lt;a href="http://www.zing.net/"&gt;Zing&lt;/a&gt;, we develop software and hardware for portable entertainment devices. Examples would be MP3 players, satellite radios, and portable internet radio streaming devices.&lt;br /&gt;&lt;br /&gt;Anyway, one of the guys on the development team suggested that we ought to implement a bit of software to simulate the actions of a user - pressing buttons, spinning the scroll wheel, changing the volume, that sort of thing. Apparently Palm used a similar system (called a Gremlin) to flush out some of the more obscure timing-related bugs in their software.&lt;br /&gt;&lt;br /&gt;Our version was called the UI Monkey (after the &lt;a href="http://en.wikipedia.org/wiki/Infinite_monkey_theorem"&gt;Infinite Monkey Theorem&lt;/a&gt;). The initial implementation was fairly straightforward, generating random user-input events and feeding them into the event queue on the device.&lt;br /&gt;&lt;br /&gt;Then someone wanted a way to record and play back events, so we could do some testing automation. That was straightforward enough, though anyone who's implemented UI automation on such a low level can tell you than the resulting scripts are very fragile, in that any tiny change to the UI will break the script.&lt;br /&gt;&lt;br /&gt;Once I had the basic framework in place, more requests came in, everything from "can we have the monkey scripts check for success?", to "how about implementing a way to repeat a bunch of actions over and over?". Since the whole Monkey code structure was based on sending and receiving UI events, other features had to be hacked in as "special" events, which each had their own syntax. After I had finished "goto", and had started working on some other features, I decided it was time to take a step back from the ledge and re-evaluate my options.&lt;br /&gt;&lt;br /&gt;Despite the great amount of interest expressed in UI automation, nobody else was using the system I'd created. Given the sheer impenetrability of the syntax, I can't really blame them, but it was a little disappointing. I decided it was time to come up with something a little less insane, and a bit more appropachable.&lt;br /&gt;&lt;br /&gt;The one thing I was pretty sure of was that I didn't want to implement my own scripting language from scratch. While designing your own language is an interesting project, and gives you a lot of power, it always takes a lot longer than you'd expect, and you're never really done. Implementing a "Monkey library" on top of a more-standard language seemed like a better bet.&lt;br /&gt;&lt;br /&gt;I considered using C# as our UI scripting language. Unfortunately, C# requires a fair amount of boilerplate code just to make a basic loadable assembly, and a lot of the folkks that want to do scripting aren';t familiar with the development tools. So, some kind of scripting language seemed to be in order. As it turns out, we already have a scripting language interpreter embedded into our product (which is another story, and a great example of the Law Of Unintended Consequences at work).&lt;br /&gt;&lt;br /&gt;So, I threw out all of the crazy hacky code I had been writing, and re-built the Monkey on top of &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt;, a light-weight scripting language. Instead of an event recording and playback system, we now have a set of event-related primatives, and a real programming language to call them from, with functions, for loops, if-then-else, and variables. The integration of the Lua and C++/C# code was pretty easy, as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-7525893151787364216?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/7525893151787364216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=7525893151787364216' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7525893151787364216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7525893151787364216'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/02/monkey-madness.html' title='Monkey madness!'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-6953652493116783402</id><published>2008-01-09T09:36:00.000-08:00</published><updated>2008-01-09T13:54:31.729-08:00</updated><title type='text'>XO Laptop, part 2</title><content type='html'>Now that I've had a chance to play with it a bit more, a few more impressions. I've been thinking about the "but what's it good for?" question, as well, and I'll have more to say on that later. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Everything is terribly slow&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Part of this is because a lot of the UI and the Activities (applications) are written in Python. I understand that the goal of tinker-ability is trumping the desire for a snappy UI, but I fear that children (who aren't after all, known for their great patience) will get bored when they try to do something, and all they get is a blinking icon on the screen for a minute or more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A co-worker says that he pulled his out of the box, turned it on, tried to use it for a while, decided it was unusable, and put it back in the box. I don't think it's that bad, but performance is definitely an issue. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the first things I tried was launching each of the activities, to see what each one was. That lead to the discovery that you &lt;span class="Apple-style-span" style="FONT-STYLE: italic"&gt;really&lt;/span&gt; don't want to launch multiple activities at the same time. It was probably 5-10 minutes before the laptop was responsive again. They ought to consider throttling this in the shell, because I'd bet your average 8 year old is going to do just that when they use it for the first time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Given that &lt;a href="http://psyco.sourceforge.net/"&gt;Psyco&lt;/a&gt; exists, I don't know why it's not installed on the XO to begin with. I couldn't find any indication on the &lt;a href="http://wiki.laptop.org/"&gt;OLPC Wiki&lt;/a&gt; that anybody had actually tried it. I'll try building a version and enabling it for a few applications to see what impact that has.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Great wireless sensitivity/range&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I haven't had a chance to use the mesh networking features yet (due to lack of another XO, or a School Server to hook up to. But the standard 802.11b networking gets a substantially stronger signal than my conventional Dell laptop does.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Lots of features are still "to be implemented"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Totally understandable, I think. The hardware seems to be pretty well worked out, the software is just lagging behind (and who hasn't seen that on a project?). For example: there are about half a dozen keys on the keyboard for various special features. about half of them do nothing at all. There's a "view source" key combination, which doesn't do anything, presumably because the "Develop" activity isn't finished yet. So much for "easy to tinker", though...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Relatively clean User Interface&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I admit it - I'm a fan of minimalist UI "chrome". I liked Nextstep, I liked the old Mac OS, I even liked CDE. The modern UI trend toward glossy reflective surfaces and transparency effects feels like a major step backwards in usability to me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The OLPC "Sugar" interface is largely monochrome, and very simple. Presumably at least part of this is due to the limitations of the system (especially the requirement to be usable in black-and-white mode), but overall, it's pretty pleasing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;The camera and microphone work well&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I can't wait to see what the kids will do with this. It's only camera-phone quality, but I think that'll be a popular feature. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Many of the activities are a little impenetrable&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Unfortunately, many of the included activities are a bit hard to get started in. The music stuff is particularly bad. I understand that a full user-manual for these applications is a bit much to expect, but trying to "drive" a multi-track sequencing application without any documentation or online help, and with only icons in the user interface, can get a little frustrating.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Too many programming environments&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The standard install comes with Etoys, Pippy, and TurtleArt - development environments for Squeak Smalltalk, Python, and some kind of "graphical" language, respectively. Rather than three different programming environments, I would have liked to see more "out of the box" usable software.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-6953652493116783402?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/6953652493116783402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=6953652493116783402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6953652493116783402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6953652493116783402'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/01/xo-laptop-part-2.html' title='XO Laptop, part 2'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-6338234243421270021</id><published>2008-01-04T21:20:00.001-08:00</published><updated>2008-01-04T22:42:11.130-08:00</updated><title type='text'>XO laptop mini-review</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;br /&gt;My first hours with the XO laptop&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;Back when the One Laptop Per Child Foundation was running their "give one, get one" promotion, I signed up to donate a laptop, and get one for myself. I figured I could do some good, and get a chance to see what it's all about.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Initial impressions:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Hardware:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;I&lt;/span&gt;t's small - really small. Seems more deserving of the "notebook" designation, rather than calling it a "laptop". It'd probably fit well on a child's lap, though.&lt;br /&gt;&lt;br /&gt;The exterior case feels very solidly constructed, and has a built-in handle. It reminds of my original iBook. It does look a little like a toy, but that impression goes away pretty rapidly once you start using it.&lt;br /&gt;&lt;br /&gt;The keyboard is a rubber dome "chiclet" keyboard of the sort you might have found on inexpensive home computers in the 1980's in the USA. It's not too hard to type on, with the exception of the "space bar", which seems to be made up of 10 or so individual switches, and my thumb keeps hitting it between the individual switches. &lt;br /&gt;The screen is very clear and readable. I haven't used it in black &amp;amp; white mode very much yet, but it's readable in a (fairly bright) room with the backlight off. Not bad at all.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Software:&lt;/b&gt;&lt;br /&gt;The user interface is a little weird, if you're used to a standard PC operating system interface. I think someone who's coming to it with no preconceptions would find it fairly easy to get started.&lt;br /&gt;&lt;br /&gt;It's running Ubuntu Linux, but you'd never know it from looking at the UI. Everything uses just one mouse button - none of the right-click, middle-click crap from KDE.&lt;br /&gt;&lt;br /&gt;The "window manager" doesn't so much manage windows as screens - most of the applications run in full-screen mode, to make better use of the low resolution screen.&lt;br /&gt;&lt;br /&gt;The web browser is plain but functional. I'm using it to type this entry, as a matter of fact. So far the only problem is that the cursor disappears in some text boxes. That makes it a little harder to  edit text than it should be. Might be a Blogger Javascript problem, I'll see if it come up elsewhere.&lt;br /&gt;&lt;br /&gt;I'll report back with an update after I've tried out the other included applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-6338234243421270021?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/6338234243421270021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=6338234243421270021' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6338234243421270021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/6338234243421270021'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2008/01/xo-laptop-mini-review.html' title='XO laptop mini-review'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-116943951696115303</id><published>2007-12-06T18:28:00.000-08:00</published><updated>2007-12-06T18:29:14.368-08:00</updated><title type='text'>Programmer's purity test</title><content type='html'>There's an enormous list of programming languages up on the Wikipedia at &lt;a href="http://en.wikipedia.org/wiki/Alphabetical_list_of_programming_languages"&gt;Alphabetical List Of Programming Languages&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It occurred to me that that'd make for an interesting variation on the classic "purity test". A number of "hacker" and "geek" purity tests are out there, but I haven't seen one specifically for programming. There are way too many extremely obscure languages on that Wikipedia list, though.&lt;br /&gt;&lt;br /&gt;If we trimmed out the truly obscure languages, we'd get something like this:&lt;br /&gt;&lt;br /&gt;Have you ever:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Programmed a computer?&lt;/li&gt;&lt;li&gt;In ADA?&lt;/li&gt;&lt;li&gt;In ALGOL?&lt;/li&gt;&lt;li&gt;In APL?&lt;/li&gt;&lt;li&gt;In APPLESCRIPT?&lt;/li&gt;&lt;li&gt;In Assembly?&lt;/li&gt;&lt;li&gt;In AWK?&lt;/li&gt;&lt;li&gt;In B, or BCPL?&lt;/li&gt;&lt;li&gt;In BASIC?&lt;/li&gt;&lt;li&gt;In brainf*ck?&lt;/li&gt;&lt;li&gt;In Bourne Shell? &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Nah - too boring, and we haven't even gotten out of the B's yet. Maybe we could organize it by generation:&lt;br /&gt;&lt;br /&gt;Have you ever: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Programmed a computer?&lt;/li&gt;&lt;li&gt;With jumper wires?&lt;/li&gt;&lt;li&gt;In machine code?&lt;/li&gt;&lt;li&gt;...without a coding sheet or other aid?&lt;/li&gt;&lt;li&gt;...with toggle switches?&lt;/li&gt;&lt;li&gt;...from a Hex keypad?&lt;/li&gt;&lt;li&gt;In assembly language?&lt;/li&gt;&lt;li&gt;On punched cards?&lt;/li&gt;&lt;li&gt;In a language whose syntax assumes that you're still using punched cards (eg Fortran, RPG)?&lt;/li&gt;&lt;li&gt;In COBOL?&lt;/li&gt;&lt;li&gt;In C or Pascal?&lt;/li&gt;&lt;li&gt;In Forth?&lt;/li&gt;&lt;li&gt;In Lisp (Scheme, Logo)?&lt;/li&gt;&lt;li&gt;In Smalltalk?&lt;/li&gt;&lt;li&gt;In a 4GL?&lt;/li&gt;&lt;li&gt;In C++?&lt;/li&gt;&lt;li&gt;In Java or C#?&lt;/li&gt;&lt;li&gt;With a scripting language?&lt;/li&gt;&lt;li&gt;In a modern functional language (Haskell, etc)?&lt;/li&gt;&lt;li&gt;In an object-oriented language without class-based inheritance?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;That's a pretty good start, maybe we could add a few questions on how you used these various tools.&lt;/p&gt;&lt;p&gt;Have you ever...&lt;/p&gt;&lt;ol&gt;&lt;li value="21"&gt;Written a program that directly controlled objects in the physical world?&lt;/li&gt;&lt;li&gt;...did you ever injure anyone with a bug?&lt;/li&gt;&lt;li&gt;...other than yourself?&lt;/li&gt;&lt;li&gt;Written software for internal business use?&lt;/li&gt;&lt;li&gt;Written software that was sold at retail?&lt;/li&gt;&lt;li&gt;Written software that sends email?&lt;/li&gt;&lt;li&gt;...did it ever send thousands of messages due to a bug?&lt;/li&gt;&lt;li&gt;...outside the organization you were working at?&lt;/li&gt;&lt;li&gt;Programmed in a language of your own design?&lt;/li&gt;&lt;li&gt;...did anyone else ever use your language?&lt;/li&gt;&lt;li&gt;...did it become a de-facto standard?&lt;/li&gt;&lt;li&gt;...or an ISO or ECMA standard?&lt;/li&gt;&lt;li&gt;Written a compiler?&lt;/li&gt;&lt;li&gt;...not as an assignment for a class?&lt;/li&gt;&lt;li&gt;..."by hand" (without using lex/yacc or related tools)?&lt;/li&gt;&lt;li&gt;Created self-modifying code?&lt;/li&gt;&lt;li&gt;Written code that modifies some other program's binary?&lt;/li&gt;&lt;li&gt;Written self-reproducing code?&lt;/li&gt;&lt;li&gt;...without it getting away from you?&lt;/li&gt;&lt;li&gt;Changed the class of an object at runtime?&lt;/li&gt;&lt;li&gt;...in a language without dynamic dispatch?&lt;/li&gt;&lt;li&gt;Created a program that took longer to run (once) than it did to write?&lt;/li&gt;&lt;li&gt;...while running on a cluster of computers?&lt;/li&gt;&lt;li&gt;...or a conventional supercomputer?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I seem to have run out of ideas. Suggestions for additional questions would be greatly appreciated. A traditional Purity Test would have 100 questions, so you could easily generate a percentage score.&lt;/p&gt;&lt;p&gt;For what it's worth, I scored 32/44, or about 27% pure. I think that probably indicates that the test is a little too focused on my own experiences. Send me your questions, and I'll work up a better list...&lt;/li&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-116943951696115303?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/116943951696115303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=116943951696115303' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116943951696115303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116943951696115303'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/01/because-i-like-lists-language-matters.html' title='Programmer&apos;s purity test'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-5854687743083732561</id><published>2007-11-24T10:32:00.000-08:00</published><updated>2007-11-24T20:46:19.468-08:00</updated><title type='text'>Fear of teaching</title><content type='html'>I gave a little presentation or lecture at work last week (on pair-wise testing and higher-level test planning) and I was reminded of one of the great tragedies of my life. I really love to help people learn new things, but actually standing up in front of a crowd and talking makes me physically ill. It's been like this for as long as I can remember, and I've learned to work around it in the work context, but if I had to do this every day I'd be pretty miserable.&lt;br /&gt;&lt;br /&gt;Since I knew other people would want to read about it later, especially given that I gave the presentation on the Wednesday before Thanksgiving, I put my notes up on our Wiki. I have a bit of a love-hate relationship with the Wiki. While I love the idea of a single place to look for information, the usability of Wiki markup languages really stinks. It's a bit like Blogger's "plain text" format, in that if you don't care about what things come out looking like, it's alright, but I always spend more effort trying to work around the limitations of the format than I do actually writing the content.&lt;br /&gt;&lt;br /&gt;I've learned over the years that there are about three major methods of preparing for giving a presentation. Some people actually go to the effort of writing out everything that they want to say, similar to a speech as given by politician. Some people write nothing down, and ad-lib the whole thing, and then there's the approach I've always used. I usually write an outline that contains all the topics I want to cover, and then I ad-lib the presentation around the outline, making whatever mid-course corrections might seem necessary based on the audience's reactions.&lt;br /&gt;&lt;br /&gt;Because I wanted people to be able to get something out of my notes without having to be at the presentation, I filled in the outline with some additional explanatory text. That's very similar to the process I usually use when I write other things (for example, blog posts). I start with an outline, then I replace items in the outline with paragraphs and sentences. Even when I do something more free-form like this post, I have the outline in my head, at least. Revising an outline on the iPhone would have pretty painful...&lt;br /&gt;&lt;br /&gt;When I finished the presentation, I got some very positive feedback from the audience, including at least one actual pat on the back, something I had thought of as a metaphor before. Afterwards, I thought a little bit about what I thought was good about that presentation, especially compared to other presentations I've seen lately, and I think it's all about not over-planning or under-planning it. The worst presentations I've been subjected to are of the "guy reading directly from his Powerpoint slides" style. Second worst are the "guy who is  totally not prepared or sure what he wants to say" variety. Once again, the happy medium wins out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-5854687743083732561?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/5854687743083732561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=5854687743083732561' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5854687743083732561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/5854687743083732561'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/11/fear-of-teaching.html' title='Fear of teaching'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3304905620396193279</id><published>2007-10-28T14:02:00.000-07:00</published><updated>2007-10-28T18:25:25.329-07:00</updated><title type='text'>The C++ FQA (frequently questioned answers)</title><content type='html'>No updates for 6 months, then two in a day...&lt;br /&gt;Via a discussion on &lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.557377.62"&gt;Joel On Software&lt;/a&gt;, I got directed to this:&lt;br /&gt;&lt;a href="http://yosefk.com/c++fqa/index.html"&gt;The C++ FQA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a response, of sorts, to the C++ FAQ. You can read moreabout it on the site, but he basically goes through the questions in the C++ FAQ, and explores &lt;em&gt;what it is about C++&lt;/em&gt; that makes those questions "frequently asked". There is some sarcasm, and some rather insightful commentary on why C++ is so very hard to develop real expertise in.&lt;br /&gt;&lt;br /&gt;It would be neat to see something like this done for Java and C#. I think the idea of looking at a language from the standpoint of "why are these areas confusing to so many users?" is an interesting approach.&lt;br /&gt;&lt;br /&gt;I have always felt that my resistance to really learning C++ was a failure on my part, but after reading "Effective C++", and with the backing of the C++ FQA, I feel a little better about taking the position that C++ is really far too complex for the good of the people who need to work with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3304905620396193279?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3304905620396193279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3304905620396193279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3304905620396193279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3304905620396193279'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/10/no-updates-for-6-months-then-two-in-day.html' title='The C++ FQA (frequently questioned answers)'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-7304722820054500898</id><published>2007-10-24T23:30:00.000-07:00</published><updated>2007-10-28T13:58:33.895-07:00</updated><title type='text'>You're probably using "unsigned" incorrectly</title><content type='html'>&lt;h3&gt;You're probably using "unsigned" incorrectly, and that makes me sad.&lt;/h3&gt;Chances are that if you write code in C (or related languages like Java, C#, or C++), then you've come across the "unsigned" type, and its relatives "unsigned long" and "unsigned short". If you've written code that uses unsigned types, it's also quite likely that &lt;em&gt;you've used them incorrectly&lt;/em&gt;, at least by my standards.&lt;br /&gt;&lt;br /&gt;Misuse of "unsigned" in C is one of those things that I keep seeing over and over, with different developers, even folks who really ought to know better. I find it immensely frustrating. If I had to pick one aspect of C that was responsible for more stupid bugs than anything else, this'd be one of the top candidates. Probably not &lt;em&gt;the&lt;/em&gt; top candidate - the string-handling functions in the standard library probably win that handily.&lt;br /&gt;&lt;br /&gt;Here are my simple rules for the use of unsigned integer types: &lt;ul&gt;&lt;li&gt;Don't use unsigned just because "that value should never be less than zero"&lt;/li&gt;&lt;li&gt;Always compile your code with all warnings enabled&lt;/li&gt;&lt;li&gt;Avoid mixing the use of signed and unsigned integers in the same calculation&lt;/li&gt;&lt;li&gt;Do use unsigned when modelling hardware registers that hold unsigned values&lt;/li&gt;&lt;li&gt;Do used unsigned when performing bit-wise arithmetic&lt;/li&gt;&lt;/ul&gt;Okay, back to the subject at hand, and let's take a look at those rules, shall we?&lt;h3&gt;Don't use unsigned just because "that value should never be less than zero"&lt;/h3&gt;This is by far the most common abuse of unsigned types that I see on a regular basis. It's not even a bad idea, as far as it goes. A majority of the values in a typical program are going to be non-negative by design - sizes, screen coordinates, loop counters, etc, etc. The problem really isn't unsigned values per se, it's how unsigned and signed values interact.&lt;br /&gt;&lt;br /&gt;Part of the problem is that constant values in C are signed by default, which means that signed values will creep into your program unless you make a concerted attempt to avoid them. When you compare signed and unsigned values, the results will often not be what you expect. For example: &lt;br /&gt;&lt;pre&gt;unsigned four = 4; &lt;br /&gt;int neg_one = -1; &lt;br /&gt;if (neg_one &lt; four) &lt;br /&gt;{ &lt;br /&gt;  printf("true\n"); &lt;br /&gt;} &lt;br /&gt;else &lt;br /&gt;{ &lt;br /&gt;  printf("false\n"); &lt;br /&gt;}&lt;/pre&gt;Looking at this code, it's pretty obvious what the programmer intended, but in fact the comparison "neg_one &lt; four" evaluates to false in this case. This is because the signed value will be "promoted" to unsigned, turning it from a small negative number to a very large positive number, before the comparison is made.&lt;br /&gt;&lt;br /&gt;In actual cases of this problem in the wild, the declarations will typically be a long way away from the comparison, and it won't be at all obvious what the cause of the problem actually is. I've seen experienced programmers stare at the debugger in disbelief when it seems to be showing them that their program thinks that -1 is greater than 4. An additional complication is that constants in C are signed by default, so you can replace the "neg_one" variable in the example with the constant "-1", and you'll get the same behavior.&lt;br /&gt;&lt;br /&gt;A related problem comes with the handling of sizes and lengths. A size is typically going to bea non-zero value, so it "makes sense" to use unsigned variables. The problem is that sizes are often calculated by subtracting one value from another. If you accidentally subtract a larger value from a smaller one with signed variables, you get a negative size, which you can at least detect and handle (with an assert(), if nothing else). If you're using unsigned math, you just get a huge bogus "size", which may or may not be immediately obvious.&lt;h3&gt;Always compile your code with all warnings enabled&lt;/h3&gt;Admittedly, this rule is more general, rather than specifically tied to problems with using "unsigned" correctly. Most C and C++ compilers have an option to warn on comparisons between signed and unsigned values, when there's a chance the comparison will be interpreted incorrectly. It's even more frustrating to debug one of these issues when compiling with warnings enabled would have produced a warning message that points to exactly where the problem is, but some yutz has that particular warning disabled. &lt;br /&gt;&lt;br /&gt;Of course, they have it disabled because enabling warnings on comparisons between signed and unsigned tends to generate zillions of bogus warnings. That's just a good reason to avoid using unsigned variable, where possible - it obscures the actual problem areas with bogus warnings.&lt;h3&gt;Avoid mixing the use of signed and unsigned integers in the same calculation&lt;/h3&gt;Given the example above of a simple comparison going wrong, it ought to be obvious that anything more complex is at least as likely to go subtly wrong in some way. Again, the real problem arises because the declarations of the variables (and constants) will be far far away from the point of the errant calculation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, when is it okay to used unsigned types?&lt;/b&gt;&lt;br /&gt;&lt;h3&gt;Do use unsigned when modelling hardware registers that hold unsigned values&lt;/h3&gt;This is most likely how unsigned types got into C in the first place. If you're writing low-level OS or driver code that talks to the hardware, you'll often find that the unsigned int type exactly matches what the hardware is using. This also segues nicely into the next rule...&lt;h3&gt;Do used unsigned when performing bit-wise arithmetic&lt;/h3&gt;If you're doing something with fancy binary arithmetic, like an encryption algorithm, or something else where you're using an integer as a sollection of bits, unsigned types are probably what you want. I'd put something in here about using "unsigned" with bitfields, but the bitfield construct in C is pretty useless (and a topic for another rant), so I'll just mention that it's worth thinking about whether you want an unsigned or signed bitfield, if you ever use them.&lt;h3&gt;Unfortunately, you actually can't avoid "unsigned" values&lt;/h3&gt;As it turns out, there are types that the standard library uses that are usually unsigned, for example size_t. So, your inteactions with the standard library will occsionally force unsigned values to creep into your program. Still, that's no reason for you to make it any harder on yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-7304722820054500898?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/7304722820054500898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=7304722820054500898' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7304722820054500898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7304722820054500898'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/10/youre-probably-using-unsigned.html' title='You&apos;re probably using &quot;unsigned&quot; incorrectly'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3004255885928206999</id><published>2007-05-28T21:22:00.000-07:00</published><updated>2007-05-28T22:16:14.360-07:00</updated><title type='text'>New Blender!</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_MR7bT7RHlnY/RlurJCnytBI/AAAAAAAAAAc/fK6XI6CgaJw/s1600-h/TB-621-BHM_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_MR7bT7RHlnY/RlurJCnytBI/AAAAAAAAAAc/fK6XI6CgaJw/s400/TB-621-BHM_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5069833977346569234" /&gt;&lt;/a&gt;&lt;br /&gt;Last week, we got a new blender - a &lt;a href='http://www.blendtec.com/productDetails.aspx?id=28#'&gt;Blendtec Total Blender&lt;/a&gt;. Since Yvette started her &lt;a href='http://www.hmrprogram.com/'&gt;weight loss program&lt;/a&gt;, we've gone through 4 blenders or so. Making multiple shakes every morning wears out your typical bargain basement blender in 6 months or less. We're hoping that the new blender lasts us a whole lot longer. It had better last a long time, it was nearly 10 times as expensive as the last blender we bought.&lt;br /&gt;&lt;br /&gt;The Total Blender is based on Blendtec's commercial blenders (my local Starbucks uses Blendtec blenders). It's got a 1500 watt motor, as compared to the 300-600 watt motors in a typical home blender. It's got a very solid square blender jar, and a scary-looking set of ultra-sharp blades. Instead of a set of speed buttons that are labeled with wacky labels like "frappe" and "fold", it's got buttons naming what food you're making - "milkshake", "soup", "smoothie". Each button initiates an automatic program which speeds up or slows down as necessary to perfectly mix whatever you're making. It even stops automatically at the end of the program. Nifty!&lt;br /&gt;&lt;br /&gt;So how well does it work? It's incredibly powerful - it crushes ice without even slowing down. It's also &lt;strong&gt;very loud&lt;/strong&gt; at full speed. The instructions that came with the blender were minimal, but it did come with a pretty big cookbook. Apparently, the motor is strong enough to actually grind flour, make peanut butter from whole nuts, etc. On the "soup" setting, the friction of the blending actually makes the soup hot! For simple stuff, like the aforementioned diet shakes, it does the job about twice as fast as our old blender. The jar is super easy to clean, and doesn't seem like it'll get food stuck under the blades like our old blender tended to. &lt;br /&gt;&lt;br /&gt;There is one downside that I've identified so far. Have you ever had a blender accident, where an overloaded blender popped the top off and splashed stuff everywhere? Try to imagine what it looks like when that happens with a blender that's 4 times as powerful. This is particularly problematic with hot liquids - the fast start of the blender throws the hot liquid up in the jar, which causes the air in the jar to expand and jet out the top. I think of it as &lt;strong&gt;&lt;em&gt;Mount Blendtec erupting&lt;/em&gt;&lt;/strong&gt;. Cleaning shake mix off the ceiling isn't very much fun. &lt;br /&gt;&lt;br /&gt;I &lt;em&gt;think&lt;/em&gt; I've got the technique dialed in now. I do wish they'd implement a slightly softer start for the low-speed settings, though. All in all, it's definitely a massive improvement over our old, tired blender. I'm going to try some of the recipes from the cookbook. That should help familiarize me with the various cycles. Besides, it's just plain fun to use - it'll blend darn near anything. Speaking of which, if you haven't seen it, check out Blendtec's &lt;a href='http://willitblend.com'&gt;Will It Blend?&lt;/a&gt; for amusing demos of the blender in action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3004255885928206999?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3004255885928206999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3004255885928206999' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3004255885928206999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3004255885928206999'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/05/new-blender.html' title='&lt;strong&gt;New Blender!&lt;/strong&gt;'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MR7bT7RHlnY/RlurJCnytBI/AAAAAAAAAAc/fK6XI6CgaJw/s72-c/TB-621-BHM_1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-508435401803057387</id><published>2007-05-02T12:04:00.000-07:00</published><updated>2007-05-02T12:41:42.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contest'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>They're running a contest over at Worse Than Failure</title><content type='html'>&lt;a href="http://thedailywtf.com"&gt;Worse Than Failure&lt;/a&gt; (formerly The Daily WTF) is having a &lt;a href="http://omg.worsethanfailure.com/"&gt;programming contest&lt;/a&gt;, with either a MacBook Pro or Sony VAIO laptop as first prize. &lt;br /&gt;&lt;br /&gt;For those not familiar with the site, their theme is &lt;em&gt;Curious Perversions in Information Technology&lt;/em&gt;. People submit particularly awful pieces of code, or database schemas, or business practices, and the readers of the site make various insightful, witty, outraged, or just plain misguided, comments on them.&lt;br /&gt;&lt;br /&gt;The contest: Implement a four-function calculator program (for Windows, or UNIX/GTK). Your program must pass the specified test cases, have a GUI driveable using a mouse, and should cause people who read the code to shake their heads sadly in disgust.&lt;br /&gt;&lt;br /&gt;There's much more detail on the contest website, but I thought the idea of the contest was interesting enough to mention. The &lt;a href="http://forums.worsethanfailure.com/forums/24/ShowForum.aspx"&gt;contest discussion forum&lt;/a&gt; is hilarious, as well. Check out this comment:  &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Mine's too slow right now.  It's taking about 45 minutes to add 9876 and 1234, when I was hoping for about three seconds.  I knew it was O(n^2), but I was expecting the constant to be a bit smaller.  I may need to replace the Mersenne twister with a faster random-number generator.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I have what I think is a pretty good set of ideas for a submission, I'm just not sure that I'll be able to finish in the time remaining (12 days left). I'll probably submit whatever I have by then, even though I almost certainly won't win. I'm looking forward to seeing the other entries, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-508435401803057387?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/508435401803057387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=508435401803057387' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/508435401803057387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/508435401803057387'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/05/theyre-running-contest-over-at-worse.html' title='They&apos;re running a contest over at Worse Than Failure'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-9050004809194755988</id><published>2007-05-02T09:05:00.000-07:00</published><updated>2007-05-02T09:13:20.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rodents'/><category scheme='http://www.blogger.com/atom/ns#' term='Mary Hart'/><title type='text'>Oops...</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_MR7bT7RHlnY/Rji4VrjgEtI/AAAAAAAAAAU/NGHBHWCNfys/s1600-h/MouseBait.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_MR7bT7RHlnY/Rji4VrjgEtI/AAAAAAAAAAU/NGHBHWCNfys/s400/MouseBait.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5059996863959143122" /&gt;&lt;/a&gt;&lt;br /&gt;Looks like somebody at Amazon.com accidentally merged two entries in the product database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-9050004809194755988?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/9050004809194755988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=9050004809194755988' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/9050004809194755988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/9050004809194755988'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/05/oops.html' title='Oops...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MR7bT7RHlnY/Rji4VrjgEtI/AAAAAAAAAAU/NGHBHWCNfys/s72-c/MouseBait.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-7705414825921172514</id><published>2007-04-10T23:08:00.000-07:00</published><updated>2007-04-10T23:31:00.160-07:00</updated><title type='text'>Slashdot really irritates me sometimes...</title><content type='html'>&lt;a href='http://hardware.slashdot.org/article.pl?sid=07/04/10/2118235'&gt;There's a story on Slashdot&lt;/a&gt; about a new idea for a way to enable patching complex microprocessors to work around design defects, or "errata", as they're called in the industry. The basic concept is to include a small amount of configurable logic on a chip, and use it to detect conditions that would otherwise trigger a known errata, and automatically work around it. &lt;br /&gt;&lt;br /&gt;This would allow manufacturers to fix design defects in already-manufactured chips, rather than fixing the defects in subsequent revisions of the chips, and leaving earlier customers with the buggy chips they bought (which is what they do now).&lt;br /&gt;&lt;br /&gt;Unfortunately, the article that's linked in the Slashdot submission is a little light on details, and the summary is just plain misleading, so the Slashdot comments are completely swamped in responses like: "this is an old idea!", "what's so novel about an FPGA?", "FPGA's are expensive, slow, and inefficient!", and other nonsense.&lt;br /&gt;&lt;br /&gt;I actually read the article and tried to understand what it was about. When I posted that it sounded like a good idea, and it'd be interesting to read more about the design, an unregistered Slashdot user provided me with a link to &lt;a href='http://iacoma.cs.uiuc.edu/iacoma-papers/micro06_phoenix.pdf'&gt;the original paper&lt;/a&gt;, which made it much more clear what the whole thing was about. &lt;br /&gt;&lt;br /&gt;But nobody else can see that link, because Slashdot's moderation system assumes that unregistered users are less trustworthy, so the comment with the link to the original paper is invisible to the idiots that keep ranting back and forth to each other about what a dumb idea this is, without having any idea what they're talking about.&lt;br /&gt;&lt;br /&gt;So, go &lt;a href='http://iacoma.cs.uiuc.edu/iacoma-papers/micro06_phoenix.pdf'&gt;here&lt;/a&gt;, and read the original paper, especially if you've ever had the experience of running into one of these errata before. Hopefully, the folks at AMD, Intel, and IBM will see this, and it'll make it's way into newer designs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-7705414825921172514?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/7705414825921172514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=7705414825921172514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7705414825921172514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/7705414825921172514'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/04/slashdot-really-irritates-me-sometimes.html' title='Slashdot really irritates me sometimes...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-3455225592423672147</id><published>2007-03-12T13:05:00.000-07:00</published><updated>2007-03-12T13:50:27.637-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DST'/><title type='text'>Daylight Saving Time is here...</title><content type='html'>[edit: changed the title of this entry, since the old one wasn't quite relevant anymore]&lt;br /&gt;&lt;br /&gt;Daylight Saving Time is here again in the good 'ole US of A. This year, the dates for the switch to and from summer time have changed. Naturally, despite the fact that this change has been known about for nearly two years, there was a last-minute scramble by various companies to get "patches" for their software out in time for the new Daylight Saving switchover.&lt;br /&gt;&lt;br /&gt;And some of them didn't, in fact, get ready on time. Despite the fact that I (and the rest of my company) installed Microsoft's patches for Windows, this morning all of our meetings in our Outlook calendars are shifted by one hour. And we're not the only ones - I see in the news that this is causing problems all over. If someone's late for an appointment with you today, cut them some slack - it's probably Microsoft's fault.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-3455225592423672147?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/3455225592423672147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=3455225592423672147' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3455225592423672147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/3455225592423672147'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/03/why-you-should-never-use-local-time-for.html' title='Daylight Saving Time is here...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2757043493380458960</id><published>2007-02-27T11:59:00.000-08:00</published><updated>2007-02-27T12:02:31.085-08:00</updated><title type='text'>What was that?</title><content type='html'>When I was a young lad I had, shall we say, a more "carefree" attitude towards software development. This is the story of how I learned to be a bit more methodical in my approach to certain types of issues.&lt;br /&gt;&lt;br /&gt;The project I was working on was the motion control system for a robot. Now, I should probably clarify that, so you don't get the wrong idea - we're not talking about C3PO or R2D2, here. This was an industrial robot, used for 3-d imaging. The robot itself was made out of slabs of cast iron bolted together, was probably 8 feet tall, 4 feet wide, and ten feet long, and weighed in the neighborhood of 4 tons.&lt;br /&gt;&lt;br /&gt;The problem I was having was that the motion control was somewhat unresponsive - you'd move the joystick, and the translation table or the optical head would slowly start to move, and when you got to where you wanted to go, it'd keep on moving for a little while before coming to a stop.&lt;br /&gt;&lt;br /&gt;As I was looking at the code, I found what I thought was the problem - I had simply put the wrong coefficient in for one of the control equations, so we weren't getting the proper exponential factor applied to the requested motion. A quick edit and recompile, and I was ready to test the new code.&lt;br /&gt;&lt;br /&gt;I started the system up, and very slightly moved the joystick. The translation table started to creep forward. I then pushed the stick over a little farther, and the table accellerated. So far so good.&lt;br /&gt;&lt;br /&gt;And then, something very bad happened. When I put the stick back to the rest position, the table didn't slow down. In fact, it kept speeding up. I tried pulling back on the stick, but that didn't seem to have any effect. I managed to turn off the power to the motors just before the table hit the hard stops at the end of its travel.&lt;br /&gt;&lt;br /&gt;So this 600 pound cast-iron table slams into the rubber bumpers at the back of the machine, going something like 30 feet per second. The whole machine rings like a gong, and all work in the entire shop grinds to a halt as everybody looks over to see this multi-ton machine gently rocking back and forth. I was really worried that I'd wrecked at least part of a very expensive machine, but a later calibration run showed that the mechanical parts of the robot were just fine.&lt;br /&gt;&lt;br /&gt;It turns out that there were two problems in the system - the incorrect exponential on the input side that I'd corrected, and an additional incorrect damping factor on the output side. The upshot of all this is that once the system was up to speed, it took a very long time to slow down, but the bug on the input side ensured that it never got up to more than a tiny fraction of the maximum speed.&lt;br /&gt;&lt;br /&gt;The next time I needed to make a change in those calculations, I did a "dry run" with the motors disconnected first...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2757043493380458960?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2757043493380458960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2757043493380458960' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2757043493380458960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2757043493380458960'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/02/what-was-that.html' title='What was &lt;em&gt;that&lt;/em&gt;?'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-2799796294062223622</id><published>2007-02-12T22:33:00.000-08:00</published><updated>2007-02-12T22:44:12.468-08:00</updated><title type='text'>Just barely better than no backup at all...</title><content type='html'>So, the hard drive on my Mac died. Disk Utility won't fix it, Techtool pro just throws up its hands at the 2,000 bad blocks on the drive, etc, etc.&lt;br /&gt;&lt;br /&gt;That kind of sucks, but at least I have relatively recent backups to restore from. &lt;strong&gt;Or, maybe I actually don't&lt;/strong&gt;. I've been using the .Mac Backup program to do backups for the last year or so - prior to that, I was just bulk-copying stuff by hand to an external hard drive. The Backup program is a lot more convenient, and makes much better use of the space on the external drive.&lt;br /&gt;&lt;br /&gt;I figured that surely, now that Backup is at version 3.1, it'll be rock-solid reliable, right? I mean, once they fixed that awful crashing bug I reported back in the 1.0 days, I hadn't noticed any problems, so everything is OK, right? Well, as it turns out, Backup 3.1 is no more reliable than the old Backup - &lt;em&gt;it just has different bugs&lt;/em&gt;. Now, instead of crashing on backing up large numbers of files, it crashes when trying to restore them. If I was given a choice between these two behaviors, which do you think I would have chosen?&lt;br /&gt;&lt;br /&gt;The one saving grace is that inside the broken Backup file package is a more-or-less standard Mac OS X disk image file. So, I can mount those files (one from the last full backup, and one from each of the incrementals), and hand-copy the files over from them. Let's hear it for unreliable backup software...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-2799796294062223622?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/2799796294062223622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=2799796294062223622' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2799796294062223622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/2799796294062223622'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/02/just-barely-better-than-no-backup-at.html' title='&lt;u&gt;Just barely&lt;/u&gt; better than no backup at all...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-116901757829300170</id><published>2007-01-16T22:58:00.000-08:00</published><updated>2007-01-21T19:57:30.760-08:00</updated><title type='text'>Language matters</title><content type='html'>My non-programmer friends and relatives sometimes ask me:&lt;br /&gt;&lt;em&gt;Why are there are so many different computer languages?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;My co-workers sometimes ask me:&lt;br /&gt;&lt;em&gt;Why are there so many reference books for obscure languages on your bookshelf?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The answer in both cases turns out to be the same: &lt;em&gt;Language matters&lt;/em&gt;. The language you use affects how you think about a problem. Psychologists and Linguists (and Politicians and Salesmen) have known about this for years as it applies to human languages, and it turns out to be true for computer languages as well, of course.&lt;br /&gt;&lt;br /&gt;I was reminded of this fact just today, as I was explaning some concepts in Object Oriented Programming to a co-worker who's just coming up to speed on C#, after using mostly C and Perl for several years.&lt;br /&gt;&lt;br /&gt;My own first exposure to Object Oriented Programming was back in the (very) early 90's, with Borland and Microsoft's C++ compilers. I'm not sure I ever really "got" OOP in C++, and neither did most (all?) of the people I worked with. We mostly just used C++ as a better version of C.&lt;br /&gt;&lt;br /&gt;Fortunately for me, I managed to snag a copy of Digitalk's Smalltalk for Windows not long after that. And suddenly, &lt;em&gt;it all made sense!&lt;/em&gt;. Because the Object-Oriented nature of Smalltalk is so "in your face", you can't help but start thinking about things in a new way. The version I got came with pretty decent tutorial info as well, which was also a big help.&lt;br /&gt;&lt;br /&gt;I never actually produced any large-scale software in Smalltalk (it was impractical for work projects in terms of performance), but the new way of looking at things stuck with me as I continued to write low-level bit-banging code in C. When I came out to California and worked for NeXT, my Smalltalk experience translated, more or less directly, to Objective-C.&lt;br /&gt;&lt;br /&gt;Anyway, back to the discussion with my co-worker. There are a couple of different ways of thinking about "using objects" that I'm familiar with, and I tend to think of them as "The C++ way" and "The Smalltalk way". In some sense, this isn't entirely a fair characterization, but in my experience, the two views are more-or-less endemic in their respective programmer communities, so that's how I think of them.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The C++ view:&lt;/em&gt;&lt;br /&gt;An object is a combination of some data, and functions that operate on that data. To perform some action, you &lt;em&gt;call a member function&lt;/em&gt; of the object instance that has the data you need to work on.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Smalltalk view:&lt;/em&gt;&lt;br /&gt;An object is a model of some part of your problem domain, and each object has its own set of responsibilities and capabilities. To cause something to happen in your program, you &lt;em&gt;send a message to an object&lt;/em&gt;, which may in turn send messages to other objects.&lt;br /&gt;&lt;br /&gt;Now, it turns out that these two definitions are actually equivalent, or at least compatible, despite the fact that the C++ definition is entirely focused on the implementation detail, and the Smalltalk definition is entirely focused on the semantics.&lt;br /&gt;&lt;br /&gt;When you get right down to the low-level implementation details, "sending a messsage" and "calling a member function" are really the same thing. A couple of CPU registers get loaded with a couple of addresses, and then you jump to a subroutine. &lt;span style="font-size:78%;"&gt;Yes, I know it's more complicated than that in the real world, where you've got vTables, and dynamically-compiled methods, etc, etc. Work with me here...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The C++ programmers that I've met usually come to C++ from a background writing software in C. Because C is such a very low-level language, it encourages (or maybe I should say requires) that you understand the low-level details of how stuff works under the hood - memory management, how structures are laid out in memory, that sort of thing. When these folks start using C++, they apply the same low-level filter to things, and they see a class as just a data structure with some functions attached to it. This is in fact &lt;em&gt;technically true&lt;/em&gt;, but kind of misses the point. &lt;br /&gt;&lt;br /&gt;As I was trying to explain to my co-worker what I didn't like about some code of his that I was reviewing, I ran into a bit of a wall. I &lt;em&gt;knew&lt;/em&gt; that something wasn't quite right, but I wasn't able to articulate the problems well enough. I think I finally figured out that it was at least partly a result of the difference in perspective due to our different backgrounds. Once I figured that out, I was able to take the discussion out of the tactical questions like "should I use a Regular Expression here?", and into the more theoretical territory of "is this an appropriate way to model the problem you're trying to solve?", and I think we made better progress after that.&lt;br /&gt;&lt;br /&gt;It'll be interesting to see whether my co-worker has the same kind of epiphany that I did, or if he'll pick stuff up more gradually. Given that we're mostly using C# and C++ at ZING, I suspect it'll be the latter. You can write code in C# that looks just like C, with the minimal amount of "classiness" wrapped around it to compile. I suspect it would be easier for most folks to learn a new concept in a language where their old habits are obviously not going to do the trick.&lt;br /&gt;&lt;br /&gt;Which reminds me of something else I wanted to write...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-116901757829300170?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/116901757829300170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=116901757829300170' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116901757829300170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116901757829300170'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/01/language-matters.html' title='Language matters'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-116889295175545190</id><published>2007-01-15T12:00:00.000-08:00</published><updated>2007-01-18T23:14:55.746-08:00</updated><title type='text'>So, how was CES, anyway?</title><content type='html'>For those who don't recognize the name, "CES" is the Consumer Electronics Show, a yearly trade show for the Consumer Electronics industry.&lt;br /&gt;&lt;br /&gt;ZING did really well at CES this year. In addition to the usual behind the scenes deal-making and partner development, we had a couple of high-profile announcements, and one of the products we're helping to bring to market won an award!&lt;br /&gt;&lt;br /&gt;SanDisk's Sansa Connect got a &lt;a href='http://reviews.cnet.com/8301-12760_7-9672478-5.html?tag=txt'&gt;"best of show" award from CNET&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What does that have to do with ZING, you ask? We designed the hardware, software, and service infrastructure that makes the Sansa Connect work.&lt;br /&gt;&lt;br /&gt;ZING also announced a deal with FON that will allow ZING-enabled players to connect to the FON network. This is great because FON is the fastest-growing WiFi hotspot network out there. They've got an interesting business model, too - share your WiFi bandwidth at home, and get free access to WiFi when you're not at home. Check them out at &lt;a href=http://www.fon.com&gt;http://www.fon.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For a while there, an at-CES interview with our CEO Tim Bucher was linked from the front page of CBS.com. It's a little harder to find today, but &lt;a href='http://www.cbsnews.com/sections/i_video/main500251.shtml?id=2340530n'&gt;here's a link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-116889295175545190?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/116889295175545190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=116889295175545190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116889295175545190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116889295175545190'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/01/so-how-was-ces-anyway.html' title='So, &lt;em&gt;how was CES&lt;/em&gt;, anyway?'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-116862647002541756</id><published>2007-01-12T10:04:00.000-08:00</published><updated>2007-01-12T10:27:50.036-08:00</updated><title type='text'>So that's what it feels like...</title><content type='html'>It was an interesting experience watching a MacWorld keynote address with a feeling of dread, rather than one of anticipation. Fortunately, Apple didn't announce anything that makes the product I'm currently working on irrelevant, but it was interesting feeling that cold prickle of fear. &lt;br /&gt;&lt;br /&gt;The iPhone is very expensive by my standards, but that's always true for Apple hardware. When I worked there, I never really felt like I belonged, in some sense. I never would have bought an iPod when they came out, but the market certainly ate them up. I'll most likely take a pass on the iPhone as well, not least because it's not a clamshell phone. I'm not really a fan of phones that are designed such that I can't sit down with them in my pocket. &lt;br /&gt;&lt;br /&gt;The more surprising thing (and frankly worrying, as a competitor) is Jobs' claim that the iPhone is running Mac OS X. Now, we all know that that's not *quite* true - presumably it's been stripped down a bit for the environment. But the key thing is that it's actually got a rational software architecture. One of the things that was a constant drain on the iPod team when I was there was that there wasn't any OS as such on the iPods, and they weren't really built on any kind of common platform. &lt;br /&gt;&lt;br /&gt;This made adding new features to the product line, or even fixing minor bugs, a major hassle - between making the changes in 3 or 4 gradually diverging code bases, and retesting absolutely everything anytime we changed anything (no memory protection or preemptive multitasking on those old iPods), we had a hell of a time just getting anything done.&lt;br /&gt;&lt;br /&gt;When Apple needs to add a new feature to the iPhone, they'll just have any one of Apple's developers crank out a widget in DashCode, and they can then just make it available for download. If you're any kind of Consumer Electronics company, you really ought to see this as a shot across the bow. Maybe you're not in the mobile phone business, and you don't see how a $500 cell phone is relevant to you. &lt;br /&gt;&lt;br /&gt;First, don't expect that the price is going to stay that high for long. Second, think about what's the actual difference between an iPhone and a new wide-screen iPod, or an Apple portable game machine, or whatever? That's right - a couple of minor board changes, and some new application software, and it's whatever Apple wants it to be. They've got an actual PLATFORM for high-end (currently) Consumer Electronics, and the game as we've known it is changing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-116862647002541756?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/116862647002541756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=116862647002541756' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116862647002541756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116862647002541756'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2007/01/so-thats-what-it-feels-like.html' title='So that&apos;s what it feels like...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-116301818448103824</id><published>2006-11-08T12:20:00.000-08:00</published><updated>2006-11-08T12:43:02.060-08:00</updated><title type='text'>Job postings...</title><content type='html'>I'm trying to hire some White Box testers to grow my Platform QA Team here at ZING. The job descriptions on our website (and that we've posted to various job boards) don't really do much to interest me in the job, so I'm worried that they're not appealing to the folks I'm trying to recruit, either.&lt;br /&gt;&lt;br /&gt;I spent some time trying to come up with something short and sweet that at least answers the basic set of questions somebody might have about us, and about the jobs I have available. This was in the context of emailing a possible candidate that one of my co-workers referred to me.&lt;br /&gt;&lt;br /&gt;Here's what I came up with in about 5 minutes between lunch and a meeting -&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What we do:&lt;/strong&gt;The Platform QA team is responsible for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Writing automated tests&lt;/li&gt;&lt;li&gt;Developing testing frameworks&lt;/li&gt;&lt;li&gt;Executing automated and semi-automated tests, and reporting the results&lt;/li&gt;&lt;li&gt;Participating in design and code reviews with the development team&lt;/li&gt;&lt;li&gt;Creating utilities to improve the Development and QA processes&lt;/li&gt;&lt;li&gt;Evaluating and implementing tools (Static Analysis, Code Coverage, etc) to enhance the testing process&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;What we’re looking for:&lt;/strong&gt; &lt;ul&gt;&lt;li&gt;Experience in software testing and software development, either as a white-box tester or software developer&lt;/li&gt;&lt;li&gt;Familiarity with one or more of: C++, C#, or Java&lt;/li&gt;&lt;li&gt;Someone who likes to debug complicated problems&lt;/li&gt;&lt;li&gt;Some experience with API testing is useful, but not required&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;About ZING:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We’re a Consumer Electronics technology company – we license our hardware and software designs to companies that sell them under their own brand&lt;/li&gt;&lt;li&gt;We’re a pre-IPO startup&lt;/li&gt;&lt;li&gt;Located in Mountain View, California&lt;/li&gt;&lt;li&gt;The first product based on our technology just recently went on the market – the Sirius Stiletto 100 portable satellite radio&lt;/li&gt;&lt;li&gt;Website: www.zing.net (a little short on details, but it’s getting better)&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Why you should come work here:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You’ll get to work with a wide variety of cutting-edge technologies&lt;/li&gt;&lt;li&gt;We’ve got a great working relationship between QA and Development&lt;/li&gt;&lt;li&gt;You’ll actually get to write code, report bugs, and see them get fixed quickly&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;What do you think? Is that a reasonable job description, and what sorts of things strike you as missing? Should I include more information about what the actual job duties are? Or more information about the company?&lt;br /&gt;&lt;br /&gt;Any suggestions gratefully accepted. And, should you happen to know someone who's an ace White Box tester looking for a job, send them my way, OK?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-116301818448103824?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/116301818448103824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=116301818448103824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116301818448103824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/116301818448103824'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/11/job-postings.html' title='Job postings...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115937794382598151</id><published>2006-09-27T10:11:00.000-07:00</published><updated>2006-09-27T10:27:41.720-07:00</updated><title type='text'>A couple of quick links...</title><content type='html'>First, the first ZING product is out. Sirius Satellite Radio officially announced the &lt;em&gt;Stiletto 100&lt;/em&gt; yesterday. This is an important new product for Sirius, and the first use of ZING's technology "in the wild". More details coming soon, but you can watch the presentation from the DEMOfall 2006 conference &lt;a href='http://www.demo.com/demonstrators/demo2006fall/79988.php'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Second, at the Intel Developer Forum, Intel showed off a prototype of an &lt;a href='http://news.com.com/2100-1006_3-6119618.html?part=rss&amp;tag=6119618&amp;subj=news'&gt;80-core processor&lt;/a&gt;, which they expect to have commercially available in 5 years or less. It's an amusing bit of synchronicity that they announced this a day after &lt;a href='http://codemines.blogspot.com/2006/09/another-thread-on-threads.html'&gt;my blog post&lt;/a&gt; discussing the inevitable adoption of massively-parallel processor designs for the desktop market.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115937794382598151?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115937794382598151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115937794382598151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115937794382598151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115937794382598151'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/09/couple-of-quick-links.html' title='A couple of quick links...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115683665319026352</id><published>2006-09-26T00:53:00.000-07:00</published><updated>2006-09-27T22:22:43.376-07:00</updated><title type='text'>Another thread on . . . threads</title><content type='html'>&lt;h2&gt;Thanks for reading...&lt;/h2&gt;First, I want to thank everybody who read &lt;a href="http://codemines.blogspot.com/2006/09/hell-is-multi-threaded-c-program.html"&gt;Part I&lt;/a&gt;, especially those of you who made comments on it. I'm going to address a couple of those comments and questions first, then proceed to my philosophy of &lt;em&gt;How not to shoot yourself in the foot when writing multi-threaded code in C-like languages&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;In a completely non-technical aside, one of my previous articles somehow got listed on both digg and reddit, and now random people on the Internet are making cogent, well-reasoned responses to it, and to my previous posts. I feel like a "real blogger" now. Thanks, and I'll try not to let it go to my head. It's a bit ironic, in that the original purpose of this blog was to help me get over my fear of writing, and now that I know that I have an audience, it's even harder...&lt;br /&gt;&lt;br /&gt;Okay, back to threads...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/profile/19209381"&gt;Graham Lee&lt;/a&gt; pointed out that Mach threads can in fact be configured to conform to something like the no-state shared model. All you have to do is create a new task, use vm_inherit() to disallow any sharing of memory regions with the old task, and Bob's your Uncle. That's a good point, and something that I might have glossed over. In many cases, &lt;em&gt;you can&lt;/em&gt; get a separation of state between threads by doing a little additional work outside the pthreads-style interface.&lt;br /&gt;&lt;br /&gt;Reimer Mellin mentioned that the CSP model had been around for quite some time before Occam was invented. That's true - the initial paper describing CSP was apparently published in 1978, whereas Occam didn't hit the scene until 1983 or so, when the Transputer first started to become available. Apparently, Tony Hoare (the inventor of CSP) wrote a book on a more formalized version of CSP in 1985. &lt;a href="http://www.usingcsp.com/"&gt;It's available online&lt;/a&gt;, but if you're not a mathematician, it might be rough going. Personally, I find that the more funky symbols used in a piece of writing, the harder it is to read. Hoare's book uses lots of symbols - there's even a &lt;em&gt;six page long&lt;/em&gt; "glossary of symbols".&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Some Dos and Don'ts&lt;/h2&gt;These are in no particular order, and simply represent some different ways of slicing the multi-programming pie. One or more of them may apply to your next project...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do consider &lt;em&gt;whether you need to use threads at all&lt;/em&gt;&lt;/h3&gt;Sometimes what you actually want is a separate process, in the heavy-weight, OS-level process sense. If you think about it, one program doing two things at once isn't fundamentally all that different from two programs doing one thing each. Yeah, I know, &lt;em&gt;all that overhead&lt;/em&gt;, spawning a whole new process, setting up IPC with named pipes or whatever... But have you ever actually &lt;em&gt;measured&lt;/em&gt; the overhead of creating a process, or transferring a few megabytes of data between two processes on the same machine?&lt;br /&gt;&lt;br /&gt;I've done a couple of simple, two-process (GUI and background server) applications on both Mac OS and Windows, and you might well be surprised by how well this design works in practice. Of course, if your 'background' process just ends up spinning its wheels inside some hideously-complex calculation, or you actually need to send a lot of data between the GUI and the calculation engine, then you haven't actually solved your problem, and you'll have to do something more sophisticated.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Don't use threads to avoid blocking on I/O&lt;/h3&gt;Unless you're programming on some seriously old, backwater OS, you should have other options for your file and network I/O that don't involve waiting for the I/O to complete. This is very dependent on what platform you're using. Try hitting your favorite search engine with the terms "async I/O" or "nonblocking I/O" to read about the various options available. The complexity of these async I/O approaches can seem a little daunting, until you realize that in the simple-seeming "create a thread for background I/O" model, the complexity is all still there, it's just not as easy to see.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do know what each thread in your program is for&lt;/h3&gt;You need to have an identified set of responsibilities for each thread in your system. Without a clear idea of what each thread is responsible for, you'll never be able to figure out what your data-sharing strategy needs to be. If you use UML or CRC cards to model your system, or even if your "design" is a bunch of clouds and arrows on a whiteboard, you need to be able to determine which parts of the system can run concurrently, and what information they need to share. Otherwise, you're &lt;u&gt;doomed&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Don't reinvent the wheel&lt;/h3&gt;It's harder than you might think to write code that's truly thread-safe. You'd be well advised to see what's been done already for your language &amp; environment of choice. If someone has already gone to the effort of creating thread-safe data structures for you to use, then use them, don't create your own.&lt;br /&gt;&lt;br /&gt;For example, if you're already running your "main" GUI thread in an event-processing loop, consider using that message queue as your communication channel between threads. The .NET 2.0 framework provides a class called BackgroundWorker specifically to address the "trivial background calculation in a GUI app". The design of BackgroundWorker is worth reading about (&lt;a href='http://www.google.com/search?q=BackgroundWorker'&gt;Google it&lt;/a&gt;), even if you're on another platform. It's a nice, simple way to manage a second thread for background processing in a GUI application.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do consider developing a strategy for detecting and/or avoiding deadlocks&lt;/h3&gt;Let's get this out of the way - in any non-trivial shared-memory system with conventional locking semantics, you'll never be able to predict ahead of time whether on not a deadlock will occur. I'm told there's a proof that in the general case, predicting deadlocks is equivalent to the infamous &lt;em&gt;Halting Problem&lt;/em&gt;, which you've perhaps heard of before. If you have a reference to a research paper on this, let me know - I'd like to beat some people over the head with it. Despite all that, it's relatively easy to &lt;em&gt;detect&lt;/em&gt; when the system is deadlocked. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Don't spawn threads in response to external events&lt;/h3&gt;This is really just a special case of &lt;em&gt;know what each thread in your program is for&lt;/em&gt;. It's hard enough to coordinate all the concurrency in your program with a static set of threads. Adding in the additional complication of unknown numbers of active threads at any given time is sheer insanity.&lt;br /&gt;&lt;br /&gt;Also, given that there's some amount of overhead involved for each thread that you create or have active, scaling up the number of threads as load increases will often have the perverse effect of decreasing throughput by attempting to improve it..&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do consider a message-passing design&lt;/h3&gt;I mentioned this in Part I, but you might want to consider using the message passing model, even if you're working in a shared-memory world. The basic rule here is to avoid modifying any global state from within more than one thread. When you send a message from one thread to another, you pass in all the data it'll need to access in order to complete its job. Then, you don't touch those data structures from anywhere else until the other thread is done working with them.&lt;br /&gt;&lt;br /&gt;The only real hurdle in implementing this strategy is in keeping up the separation between threads, despite not having any language-level support for the desired partitioning. You need to be really careful to not accidentally start sharing data between threads without intending to (and without having a plan).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Don't hold a lock or semaphore any longer than actually necessary&lt;/h3&gt;In particular, never hold a lock across a function call. Now, this might seem a bit extreme, but remember, we're trying to manage complexity here. If you can see all the places where a lock can be acquired and released all at once, it's easier to verify that it's actually acquired and released in the right places. Holding locks for the shortest time practical also shortens the window in which you can experience a deadlock, if you've made some other mistake in your locking strategy.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do stay on the well-trodden path&lt;/h3&gt;The producer-consumer model, thread pools and work queues all exist for a reason. There's a solid theoretical underpinning for these designs, and you can find robust, well tested implementations for most any environment you might be working in. Find out what's been done, and understand &lt;em&gt;how it was done&lt;/em&gt;, before you go off half-cocked, inventing you own inter-thread communication and locking mechanisms. If you don't understand the very low-level details of how (and when) to use the "volatile" qualifier on a variable, or you haven't heard of a memory barrier, then you shouldn't be trying to implement your own unique thread-safe data structures.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Do use multiple threads to get better performance on multi-processor systems&lt;/h3&gt;If your program is running on a multi-processor or multi-core computer (and chances are that it will be, eventually) you'll want to use multiple threads to get the best possible performance.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Moore's Law, and what the future holds&lt;/h2&gt;&lt;h3&gt;Welcome to the multi-core era&lt;/h3&gt;I can't find the excellent blog post I was reading on this subject just yesterday, but here's &lt;a href='http://www.gotw.ca/publications/concurrency-ddj.htm'&gt;an article by Herb Sutter&lt;/a&gt; that hits the high points. The bottom line is that you're not going to see much improvement in the performance of single-threaded code on microprocessors in the near future. In order to make any kind of performance headway with the next couple generations of processors, your code needs to be able to distribute load over multiple processes or threads.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The future is &lt;em&gt;now&lt;/em&gt;&lt;/h3&gt;&lt;a href='http://www.apple.com/macpro/'&gt;Desktop PCs with 4 processors&lt;/a&gt; are already readily available. &lt;a href='http://www.sun.com/processors/UltraSPARC-T1/index.xml'&gt;Sun's UltraSparc T1&lt;/a&gt; has 8 cores on one chip, and can execute 32 threads "simultaneously", under ideal conditions. Even Intel's Itanium is going multi-core, a dramatic departure from the instruction-level parallelism that was supposed to be the hallmark of the EPIC architecture (but that's a story for another time). &lt;br /&gt;&lt;br /&gt;Some time in the very near future, the programs that you're writing will be executing on systems with 8, 16, or more processors. If you want to get anything near the peak level of performance the hardware is capable of, you're going to need to be comfortable with multi-processor programming.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Everything old is NUMA again&lt;/h3&gt;It's perhaps a trite observation that yesterday's supercomputer is tomorrow's desktop processor. Actually, I think it's more like there is a tide in processor design, that hits the supercomputer world, then hits the mainstream a couple decades or so later, when the high-performance folks have moved on to something else. &lt;br /&gt;&lt;br /&gt;In the 1980's, supercomputers were all about high clock-speed vector (SIMD) processing, which is where the current generation of desktop chips have stalled out. Clock speeds aren't going to massively increase, and the vector capabilities of the Pentium and PowerPC processors, while impressive, are still limited in the kinds of calculations they can accelerate. And the processor designs are so very complex, that it's hard to imagine that there are many more tricks available to get more performance-pre-clock out of the existing designs.&lt;br /&gt;&lt;br /&gt;When the supercomputer folks hit their own megahertz and design complexity wall, they went through their own muti-core CPU era, then in rapid succession to massively parallel MIMD systems, then to the super-cluster computers we see these days. It seems reasonable to expect an explosion of processors in desktop systems too, and for much the same reason - the standard SMP shared memory model doesn't scale well.&lt;br /&gt;&lt;br /&gt;In particular, cache coherency becomes a major performance issue in shared-memory multi-processor systems as the number of processors increases. The conventional wisdom says that a design where all memory is shared can scale to 4-8 processors. This is obviously dependent on memory performance, cache architecture, and a number of other factors. Perhaps worryingly, this means we're not only at the start of the multi-core era in the desktop world, we're also about one processor generation away from the end of it. Gee, that went by pretty fast, didn't it?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;So, what's next?&lt;/h3&gt;Going by the "20 years behind supercomputers" model, the Next Big Thing in desktop processors would be massively-parallel architectures, with locally-attached memory. You'd expect to see something like the Connection Machine, or the Transputer-based systems of the 90's. Given the advances in process technology, you might even be able to fit hundreds of simple processors on a single chip (actually, some folks have already done that for the DSp market).&lt;br /&gt;&lt;br /&gt;However, the desktop computer market has shown a remarkable reluctance to embrace new instruction sets. So a design using hundreds or thousands of very simple processors with fast locally-attached memory isn't likely to succeed the currently ascendant IA32/IA64 Intel architecture. So where do we go from here? I think Intel is going to keep trying to wring as much performance out of their now-standard two chip, multiple cores per chip design. They can certainly do some more clever work with the processor caches, and with a little help from the OS, they can try to minimize thread migration.&lt;br /&gt;&lt;br /&gt;Ultimately that approach is going to run out of steam though, and when that happens, there's going to be a major shift in the way these systems are designed and programmed. Through the multi-core era, and even into the beginning of the massively parallel era which will inevitably follow, you ought to be able to get away with following the pthreads model. You might need to think about processor affinity and cache sharing in ways you don't have to now, but it'll at least be familiar territory.&lt;br /&gt;&lt;br /&gt;When really massively-parallel systems start to become more common, the programming model will &lt;em&gt;have&lt;/em&gt; to change. The simplicity of implementation of the shared-memory model will inevitably give way to more explicitly compartmentalized models. What languages you'll likely use to program these beasts is an interesting question - most likely, it'll be a functional language, something like Haskell, or Erlang. I've been lax in getting up to speed on functional programming, and I'm going to make an effort to do better. I recommend that you do the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115683665319026352?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115683665319026352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115683665319026352' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115683665319026352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115683665319026352'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/09/another-thread-on-threads.html' title='Another thread on . . . threads'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115536076404339034</id><published>2006-09-02T18:49:00.000-07:00</published><updated>2006-09-26T01:02:43.276-07:00</updated><title type='text'>Hell is a multi-threaded C++ program.</title><content type='html'>&lt;h3&gt;What are threads?&lt;/h3&gt;Every modern operating system has support for threads, and most programming environments provide some level of support for threading. What threads give you is the ability for your program to do more than one thing at once. The problem with threads is the way that they can dramatically increase the complexity of your program.&lt;br /&gt;&lt;br /&gt;First, a little background, so we're all on the same page. In Computer Science, as in the physical sciences, using a simplified model makes it easier to discuss complex phenomena without getting bogged down in insignificant details. The trick of course, is in knowing where your simplifications deviate from reality in a way that affects the validity of the results. While spherical cows on an infinite frictionless plane &lt;em&gt;do&lt;/em&gt; make the calculations easier, sometimes the details matter.&lt;br /&gt;&lt;br /&gt;When &lt;b&gt;Real Computer Scientists (tm)&lt;/b&gt; are discussing problems in concurrent programming (like the Dining Philosophers), they'll sometimes refer to a &lt;em&gt;Process&lt;/em&gt;, which is kind of abstract ideal of a computer program. Multiple Processes can be running at the same time in the same system, and can also interact and communicate in various ways.&lt;br /&gt;&lt;br /&gt;The threads provided by your favorite operating system and programming language are something basically similar to this theoretical concept of a Process, with a few unfortunate details of implementation.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The New Jersey approach&lt;/h3&gt;I couldn't find a definitive reference to the history of the development of threads as we know them today, but the model most people are familiar with arose out of POSIX, which was largely an attempt to formalize existing practice in UNIX implementations.&lt;br /&gt;&lt;br /&gt;It turns out that POSIX Threads, Mach Threads, Windows Threads, Java Threads, and C# Threads all work very much the same, since they're all implemented in more or less the same way. The object-oriented environments wrap a thin veneer of objects around a group of extremely low-level functions, but you've got your basic operations of create(), join(), and exit(), as well as operations on condition variables and mutexes. For the rest of this rant, I'll refer to these as "Pthreads", for convenience.&lt;br /&gt;&lt;br /&gt;Pthreads are an example of the &lt;a href="http://www.jwz.org/doc/worse-is-better.html"&gt;Worse is better&lt;/a&gt; philosophy of software design, as applied to the problems of concurrent programming. The POSIX threading model is just about the simplest possible implementation of multi-threading you could have. When you want to create a new thread, you call pthread_create(), and a new thread is created, starting execution with some function you provide. The newly-created thread is created by allocating some memory for a stack for the new thread, loading up a couple of machine registers, and jumping to an address.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Shared state - two models&lt;/h3&gt;In the Pthreads model, all of your threads share the same address space. This makes sharing data between threads very simple and efficient. On the other hand, the fact that all of the state in the program is accessible and changeable from every thread can make it very difficult to ensure that access to all this shared state is managed correctly. Race conditions, where one thread attempts to update a data structure at the same time that another thread is trying to access or change that same structure, are common.&lt;br /&gt;&lt;br /&gt;The problem with the &lt;em&gt;all state is shared&lt;/em&gt; model is that it doesn't match up very well with what you're generally trying to accomplish when you spawn a thread. You'll normally create a new thread because you want that thread to do something &lt;em&gt;different&lt;/em&gt; than what the main thread is already doing. This implies that not all of the state in the parent thread needs to be available to be modified in the second thread. But because of the way threads are created in this model, it's easier (for the OS or language implementor) to share everything rather than a well-defined subset, so that's what you get.&lt;br /&gt;&lt;br /&gt;The other major model for multi-threading is known as message-passing multiprocessing. Unless you're familiar with the &lt;a href="http://en.wikipedia.org/wiki/Occam_programming_language"&gt;Occam&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Erlang_programming_language"&gt;Erlang&lt;/a&gt; programming languages, you might not have encountered this model for concurrency before.&lt;br /&gt;&lt;br /&gt;There are a number of variations on the message-passing model, but they all have one thing in common: In the message-passing model, your threads &lt;em&gt;don't share any state&lt;/em&gt; by default. If you want some information to go from one thread to another, you need to do it by having one thread send a message to the other thread, typically by calling a function provided by the system for just this purpose. Two popular variants of the message-passing model are &lt;a href="http://en.wikipedia.org/wiki/Communicating_sequential_processes"&gt;"Communicating Sequential Processes"&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;"Actor model"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can get a nice introduction to the message-passing model by reading the first couple chapters of the &lt;a href="http://wotug.org/occam/documentation/oc21refman.pdf"&gt;Occam Reference Manual&lt;/a&gt;, which is apparently available online these days (I got mine by digging around in a pile of unwanted technical books at a former employer). Occam is of course the native language of the Transputer, a very inventive but commercially unsuccessful parallel processor architecture from the UK which made a big splash in the mid-80's before vanishing without a trace.&lt;br /&gt;&lt;br /&gt;Why would you want to learn about this alternative model, when Pthreads have clearly won the battle for the hearts and minds of the programming public? Well, besides the sheer joy of learning something new, you might develop a different way of looking at problems, that'll help you top make better use of the tools that you do use regularly. In addition, as I'll explain in Part II of this rant, there's good reason to believe that message-passing concurrency is going to be coming back in a big way in the near future.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enough rope to hang yourself with&lt;/h3&gt;As I mentioned earlier, the Pthreads model implies that all of your program's address space is shared between all threads. Most (all?) implementations allow you to allocate some amount of thread-local storage, but in general, the vast majority of your program's state is shared by every thread. This implies that every thread has the ability to modify the value of any variable, and call any arbitrary function, at any time. This is a really powerful tool, but like all powerful tools, it can be dangerous if misused.&lt;br /&gt;&lt;br /&gt;It's extremely difficult to predict what the behavior of even fairly simple code will be, when multiple threads can run it simultaneously. For more complex code, the problem rapidly becomes intractable. In a low-level language like C, you need to know the intimate details of how the compiler will optimize your code, which operations are guaranteed to be completed atomically, what the register allocation policy is, etc, etc. In a JIT-compiled language like Java or C#, it's impossible to even know what machine code will be used at runtime, so analyzing runtime behavior in detail just isn't possible.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;An unlocked gun cabinet&lt;/h3&gt;I think one of the major problems with Pthreads is that &lt;em&gt;it's too easy to make something that almost works&lt;/em&gt;. This then leads to an unwarranted belief that multi-threaded programming is simple. For example, say you've got a simple interactive GUI application, and you think that the application takes too long to calculate something after the user presses a button. The "obvious" solution to this problem is to have your button-press handler spawn off a new thread to perform the long-running operation. &lt;br /&gt;&lt;br /&gt;So you try this, and it works perfectly on the first try - the child thread launches, and then calculates away while the main thread goes back to handling the UI. You still need to notify the main thread when the calculation is complete, but there any number of easy ways to do this, and you probably won't have much trouble figuring that out. &lt;em&gt;Gee, that wasn't so difficult, I wonder why people say that multi-threaded programming is difficult?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;It's this sort of ad-hoc approach to creating threads that gets people into trouble. They create a new thread to solve one problem, and then another, and then they suddenly realize that thread A and thread M are interacting in a bad way. So they protect some critical data structures with mutexes, and before they know it, they're trying to debug a deadlock situation where they don't even understand how those two pieces of code could interact. &lt;br /&gt;&lt;br /&gt;You need to really think about &lt;em&gt;why&lt;/em&gt; you're creating a thread, before you spawn it. I'm not going to go so far as to say that creating threads while your program is running (rather than at startup) is de-facto proof that you're doing something wrong, but it's definitely a strong indication that you're not thinking about &lt;em&gt;what your threads are for&lt;/em&gt; with any great rigor.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to not shoot yourself in the foot&lt;/h3&gt;... is going to be the subject of &lt;a href='http://codemines.blogspot.com/2006/09/another-thread-on-threads.html'&gt;Part II&lt;/a&gt;. Sorry for the cliff-hanger ending, but I wanted to get at least a little of this published, and potentially get some comments on it, before finishing the rest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115536076404339034?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115536076404339034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115536076404339034' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115536076404339034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115536076404339034'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/09/hell-is-multi-threaded-c-program.html' title='Hell is a multi-threaded C++ program.'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115614273626376756</id><published>2006-08-20T23:33:00.000-07:00</published><updated>2006-08-20T23:45:36.303-07:00</updated><title type='text'>A Cockatoo joke...</title><content type='html'>I'm still working on my "why threads are bad" rant, but in the meantime, here's a joke with a Parrot in it...&lt;br /&gt;&lt;br /&gt;One day, a Cockatoo walks into an antique shop. The owner walks over and says to the Cockatoo:&lt;br /&gt;&lt;br /&gt;"Hello there, can I help you with anything?"&lt;br /&gt;&lt;br /&gt;The Cockatoo points his wing at a chair, and says to the shopkeeper:&lt;br /&gt;&lt;br /&gt;"What can you tell me about this chair?"&lt;br /&gt;&lt;br /&gt;The shopkeeper smiles at the bird, and launches into his best sales speech:&lt;br /&gt;&lt;br /&gt;"I must say, you've got an eye for exceptional furniture. This chair is executed in the Lous XIV style, we estimate the manufacturing date to be around 1880, and the fantastic patina of the wood shows that it's been exceptionally well cared-for..."&lt;br /&gt;&lt;br /&gt;The Cockatoo interrupts the sales pitch, and says:&lt;br /&gt;&lt;br /&gt;"Yes, yes, that is all well and good, but what I really wanted to know is - &lt;br /&gt;&lt;br /&gt;&lt;em&gt;how does it taste?&lt;/em&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115614273626376756?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115614273626376756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115614273626376756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115614273626376756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115614273626376756'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/08/cockatoo-joke.html' title='A Cockatoo joke...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115527076445070559</id><published>2006-08-10T20:41:00.000-07:00</published><updated>2006-09-26T01:04:22.616-07:00</updated><title type='text'>Now they have two problems...</title><content type='html'>Today, I'm going to write a bit about programming. But first, a short detour into the wonderful world of USENET, and the adaptability of certain quotes to any situation...&lt;br /&gt;&lt;br /&gt;There's a fairly well known quote (among programmers, at least), that goes like this:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have &lt;b&gt;two&lt;/b&gt; problems. &lt;/p&gt;&lt;p&gt;-- Jamie Zawinski &lt;/p&gt;&lt;/blockquote&gt;Jamie posted this to USENET back in 1997, and people have been quoting it ever since. I did some more searching, and I found an earlier variation, with citations going back as far 1988. Yes, Google Groups does have (some) USENET postings going back nearly 20 years. The older version is this:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Whenever faced with a problem, some people say `Lets use AWK.'&lt;br /&gt;Now, they have two problems." &lt;/p&gt;&lt;p&gt;-- D. Tilbrook &lt;/p&gt;&lt;/blockquote&gt;Cool, so this is apparently one of those all-purpose jokes, much like any ethnic joke. Actually, that could be pretty interesting:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Whenever faced with a problem, some people say "Lets have the American do it." Now, they have &lt;b&gt;two&lt;/b&gt; problems. &lt;/p&gt;&lt;p&gt;-- M. Bessey &lt;/p&gt;&lt;/blockquote&gt;Wow, that's &lt;em&gt;comedy gold!&lt;/em&gt; Okay, maybe not. But it leads nicely into the topic I actually wanted to talk about:&lt;br /&gt;&lt;br /&gt;presenting...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Mark's list of the Top Four programming technologies that fit into the "now they have &lt;b&gt;two&lt;/b&gt; problems" template:&lt;/span&gt;&lt;br /&gt;(in no particular order)&lt;br /&gt;&lt;br /&gt;1. &lt;a href='http://codemines.blogspot.com/2006/09/hell-is-multi-threaded-c-program.html'&gt;Threads&lt;/a&gt;&lt;br /&gt;2. XML&lt;br /&gt;3. Singleton objects&lt;br /&gt;4. Regular Expressions&lt;br /&gt;&lt;br /&gt;The common theme here is that these are all useful techniques, but are often misused by well-meaning programmers. I've seen more grief caused by misapplication of these technologies than anything else in my career. I'm going to write up a couple of quick rants on each of these subjects. This will be good for two reasons:&lt;br /&gt;&lt;br /&gt;1. It gives me something to write about for the next couple of days.&lt;br /&gt;2. I can vent a little about some particularly irritating instances of these things that I've seen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115527076445070559?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115527076445070559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115527076445070559' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115527076445070559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115527076445070559'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/08/now-they-have-two-problems.html' title='Now they have &lt;b&gt;two&lt;/b&gt; problems...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115501866990516374</id><published>2006-08-07T23:13:00.000-07:00</published><updated>2006-08-07T23:32:17.256-07:00</updated><title type='text'>Like an out-take from The Birds</title><content type='html'>Continuing the "Wildlife Adventures in Suburbia" theme from the last post... &lt;br /&gt;&lt;br /&gt;As I was driving up to my house Sunday evening, I noticed about a half-dozen or so little Sparrow-looking birds pecking at the sidewalk at the end of my driveway. I thought "that's a little odd, I wonder what they're eating?". As I was gathering up my stuff out of the car, I saw that another ten or so were perched on the fence around  my front yard. Curiouser and curiouser...&lt;br /&gt;&lt;br /&gt;I went around to the back of the Jeep, got my groceries, and turned towards the house, only to see that there were dozens and dozens of these birds perched on my fence and the gutters of the house, and just hopping around on the roof. at this point, I'm starting to get a bit freaked out. I've seen small groups of birds around the house before, but nothing like this.&lt;br /&gt;&lt;br /&gt;Just as the "I feel like I'm in a Hitchcock movie" vibe really started to take hold, one of my neighbors drove by in a rather loud Ford Bronco. Apparently the birds didn't like either the sound or the look of the thing, so they all took off at once - from the street, off my fence and roof, and from the neighbor's yard, where I hadn't noticed that they were also congregating. &lt;br /&gt;&lt;br /&gt;In total, probably a hundred of these tiny little birds took off from the ground, coalesced into a swirling cloud, and headed out to Santa Clara, presumably on a mission to freak someone else out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115501866990516374?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115501866990516374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115501866990516374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115501866990516374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115501866990516374'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/08/like-out-take-from-birds.html' title='Like an out-take from &lt;em&gt;The Birds&lt;/em&gt;'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115441358318576698</id><published>2006-07-31T22:45:00.000-07:00</published><updated>2006-08-01T08:37:35.863-07:00</updated><title type='text'>Not a story about Black Widow Spiders</title><content type='html'>On Sunday, Yvette and I were rearranging stuff in the garage in preparation for the roofing guys to come in and tear the roof off way too early in the morning on Monday. During the course of moving all the boxes around and covering stuff up, we managed to disturb a spider. I looked over at Yvette, and I saw a large, globular black spider crawling up her neck. Now, it so happens that Black Widow spiders aren't all that uncommon around here, and from a few feet away, this thing really, &lt;em&gt;really&lt;/em&gt; looked like a Black Widow.&lt;br /&gt;&lt;br /&gt;I attempted to calmly say "Hold still" so I could brush it off her without her getting bitten, but apparently my eyes gave me away, and Yvette totally freaked out. So she's shaking all of her clothing out and moving around, while I'm trying to get her to stand still so I can find the stupid spider and get it off her before she gets bitten. Mentioning that I thought the spider was a Black Widow was decidedly &lt;u&gt;not helpful&lt;/u&gt;. It probably would have been comical if we weren't doing such a good job of completely panicking each other. Yvette managed to get the spider off of herself, and I eventually recovered it. It turned out to most likely be &lt;em&gt;Steatoda grossa&lt;/em&gt;, a much less dangerous relative of the Black Widow.&lt;br /&gt;&lt;br /&gt;After the incident, Yvette and I talked about what we might have done differently. We didn't really come up with anything, other than possibly running "Spider Drills". I'd just walk up to her and calmly say "Don't move" or something similar, and we'd practice not freaking each other out. I really hated the feeling of the whole thing spiraling out of control like that, with everything I said and did just making the situation worse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115441358318576698?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115441358318576698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115441358318576698' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115441358318576698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115441358318576698'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/07/not-story-about-black-widow-spiders.html' title='&lt;em&gt;Not&lt;/em&gt; a story about Black Widow Spiders'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115410578030556846</id><published>2006-07-28T09:26:00.000-07:00</published><updated>2006-09-03T11:26:43.896-07:00</updated><title type='text'>Damned zombie python processes...</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/4400/1257/1600/ss_image_2770.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4400/1257/200/ss_image_2770.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;If you're running Mac OS X, and you've installed XCode, try this:&lt;br /&gt;&lt;br /&gt;open up a Terminal window, and type &lt;br /&gt;&lt;em&gt;ps -x |grep -i python&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Do you see dozens and dozens of processes named (python)? Then you'll probably be interested in the discussion &lt;a href='http://groups.google.com/group/comp.sys.mac.system/browse_thread/thread/dfc0557a3bdf862c/247d219b839c1505?lnk=st'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This turns out to be due to a bug in XCode 2.3's distributed builds functionality. There's this sctwistd process that gets launched at startup, and every time you log in and out (even switching to another user counts), it spawns off a couple of python processes that get orphaned from their parent. These zombies accumulate over time, eventually leaving your Mac unable to launch any more programs. &lt;br /&gt;&lt;br /&gt;Long story short, if you don't use dedicated network builders and you don't want to fill up your process table with &lt;em&gt;&lt;b&gt;Zombie Python Processes from Hell&lt;/b&gt;&lt;/em&gt;, perform these commands in a Terminal window, then reboot:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cd /System/Library/LaunchDaemons &lt;br /&gt;sudo launchctl unload -w com.apple.dnbobserver.plist&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Now if I can just figure out why Nikon View Monitor is being launched, even though I don't even use Nikon View anymore, I'll be a happy camper. I just don't like running software that I don't need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115410578030556846?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115410578030556846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115410578030556846' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115410578030556846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115410578030556846'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/07/damned-zombie-python-processes.html' title='Damned zombie python processes...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-115164943121317777</id><published>2006-06-29T23:32:00.000-07:00</published><updated>2006-06-29T23:59:31.673-07:00</updated><title type='text'>One Small Victory...</title><content type='html'>Last night, walking back to work from dinner, I happened to pass by the Scientology building in downtown Mountain View. As I passed by, I studiously ignored a Scientology drone as he tried to hand me a pamphlet explaining some of the finer points of L. Ron's philosophy. &lt;br /&gt;&lt;br /&gt;As he asked me "Would you like a pamphlet?", I thought to myself "No, but &lt;em&gt;I've got something for you&lt;/em&gt;". At which point I loosed the Silent-But-Deadly fart I'd been holding in for two blocks. &lt;br /&gt;&lt;br /&gt;Maybe he can use those Dianetics mental control techniques to resist the urge to pass out...&lt;br /&gt;&lt;br /&gt;One small victory. Have you farted on a Scientologist today?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-115164943121317777?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/115164943121317777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=115164943121317777' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115164943121317777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/115164943121317777'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/06/one-small-victory.html' title='One Small Victory...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-113822949103093635</id><published>2006-01-25T14:41:00.000-08:00</published><updated>2006-01-30T11:32:17.180-08:00</updated><title type='text'>Fun with eBay lenses</title><content type='html'>I'll need to add a couple of pictures to this post to illustrate, but I just received a lens I purchased on eBay. It's a well-used, manual-focus Vivitar 70-150 "Macro" zoom. I put Macro in quotes because it doesn't appear that this lens gets anywhere near the range of true macro 1:1 magnification. The closest focus distance is a couple of feet. &lt;br /&gt;&lt;br /&gt;It's kind of an interesting challenge using a manual lens on the d50. Obviously, the lens is manual focus, but apparently because the d50 also lacks some mechanical linkage to read aperture information, the camera can't set the aperture either, so only the fully Manual mode really works. &lt;br /&gt;&lt;br /&gt;So, I end up setting the aperture on the lens, the shutter speed with the camera, and figuring the exposure by taking a test shot and adjusting based on what the histogram shows. I got a couple of decent pictures of Jeremy the Attack Cockatoo before he got bored and tried to eat me. &lt;br /&gt;&lt;br /&gt;http://web.mac.com/mbessey/iWeb/Site/Vivitar%2070-150.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It appears that this lens, at closest focus, gives about a 19cm wide field of view, as opposed to the 17cm I get with the 18-55 lens. Not exactly a "macro" zoom. I wonder if the fact that the lens rattles when I shake it has anything to do with that? Maybe there's supposed to be some additional extension at the end of the range, or something? I may just take it apart and see what I can do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-113822949103093635?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/113822949103093635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=113822949103093635' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113822949103093635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113822949103093635'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/01/fun-with-ebay-lenses.html' title='Fun with eBay lenses'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-113711361258776186</id><published>2006-01-12T16:43:00.000-08:00</published><updated>2006-01-12T17:03:30.260-08:00</updated><title type='text'>On the subject of camera lenses</title><content type='html'>From an email I sent to a friend. The question at issue revolves around me getting my first digital camera with interchangeable lenses (a Nikon d50). The problem with having a choice of lenses is...needing to make a choice.&lt;br /&gt;&lt;br /&gt;I've been thinking about the "how do I know what lenses I need?" question lately...&lt;br /&gt;&lt;br /&gt;I was reading online that the conventional wisdom holds that the vast majority of pictures taken with a zoom lens are taken at either the minimum or the maximum focal length. So, I decided to check my own pictures and see if that's true. I found this program online called jhead, which will dump the exposure info out of digital camera JPEG files.I ran my entire iPhoto library through it, and analyzed the results with a Perl script.&lt;br /&gt;&lt;br /&gt;I found out some interesting things about my picture taking habits.&lt;br /&gt;&lt;br /&gt;Looking at the data for the E-10, which is the camera that I've taken the most pictures with, the distribution of zoom focal lengths look like this. To convert these from the E-10's smaller sensor size to the equivalent for 35mm field of view, you'd need to multiply by about 4.&lt;br /&gt;&lt;br /&gt;focal # of pictures&lt;br /&gt;&lt;strong&gt;9.0mm 1352&lt;br /&gt;&lt;/strong&gt;10.0mm 70&lt;br /&gt;11.0mm 57&lt;br /&gt;12.0mm 51&lt;br /&gt;13.0mm 39&lt;br /&gt;14.0mm 43&lt;br /&gt;15.0mm 50&lt;br /&gt;16.0mm 34&lt;br /&gt;&lt;strong&gt;17.0mm 103&lt;br /&gt;&lt;/strong&gt;18.0mm 42&lt;br /&gt;19.0mm 41&lt;br /&gt;20.0mm 49&lt;br /&gt;21.0mm 15&lt;br /&gt;22.0mm 27&lt;br /&gt;23.0mm 11&lt;br /&gt;24.0mm 25&lt;br /&gt;25.0mm 8&lt;br /&gt;26.0mm 35&lt;br /&gt;27.0mm 16&lt;br /&gt;28.0mm 16&lt;br /&gt;29.0mm 15&lt;br /&gt;30.0mm 16&lt;br /&gt;31.0mm 22&lt;br /&gt;32.0mm 34&lt;br /&gt;34.0mm 21&lt;br /&gt;&lt;strong&gt;36.0mm 488&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;The conventional wisdom is confirmed, I guess. It's kind of fascinating to me that it's as lopsided as it is in favor of wide-angle though. I mean, I suspected that would be the case, but I didn't expect that it'd be so extreme.&lt;br /&gt;&lt;br /&gt;It also interesting that there's that peak at 17mm (68mm equiv). Unfortunately, iPhoto won't let me search by focal length, but a quick visual scan through the library shows that most of these are relatively close-up shots of people's faces.&lt;br /&gt;&lt;br /&gt;So based on the data, what *I* really need is one wide angle zoom lens, one portrait taking lens, which can probably be a non-zoom lens, and one telephoto zoom. Since the E-10 had neither a truly wide-angle or a truly high-magnification telephoto, it's not entirely clear what actual range I need on either end of the scale.&lt;br /&gt;&lt;br /&gt;On the wide end I think the decision is easier. I decided to just get the widest wide-angle zoom I could find, which is how I ended up with my 10-20mm (15-30 35mm eq) zoom. So far, that's working out pretty well for me. And now I can shoot a 180 degree panorama in two shots, which is pretty cool...&lt;br /&gt;&lt;br /&gt;For portraits, a 50mm lens is pretty close to the 45mm lens my data says I'd want. I'd just have to step a little farther away. 50mm being the "standard" length for 35mm lenses, the basic Nikon 50mm f/1.8 lens is relatively inexpensive at $100 or so. Now, I do have that range covered with my existing zoom lens, but the fixed lens gathers way more light at f/1.8 than the zoom does at its maximum f/5.6 - doing the calculation, that's about 9 times as much light, which will make all the difference in whether I need to use a flash or if I can use available light.&lt;br /&gt;&lt;br /&gt;On the telephoto end, I'm at a bit of a loss. I wasn't very happy with the limited telephoto on the E-10, so I'm pretty sure I'll need something considerably longer than the 17-55 lens that came with the d50, which isn't even as good as that. But how far do I need to reach? I don't think I want a lens that absolutely requires the use of a tripod for every shot, and it would be pure insanity to pay over $1,000 for an optically stabilized (VR in Nikon-ese) lens.&lt;br /&gt;&lt;br /&gt;One interesting (but not surprising) thing is that almost all of my (semi-Macro) flower pictures are at the far end of the E-10's zoom, as well. They look pretty good at that magnification, so the equivalent focal length on the d50 (which would be about 90mm)would be a good thing to have.&lt;br /&gt;&lt;br /&gt;I should just get the 50mm lens, I guess, and maybe get a cheap telephoto zoom and explore what range I need before plunking down the money on a "serious" telephoto lens.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-113711361258776186?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/113711361258776186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=113711361258776186' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113711361258776186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113711361258776186'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2006/01/on-subject-of-camera-lenses.html' title='On the subject of camera lenses'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-113008679690902416</id><published>2005-10-23T09:57:00.000-07:00</published><updated>2005-10-23T10:23:20.803-07:00</updated><title type='text'>The best-laid plans...</title><content type='html'>Okay, so I haven't been updating this as often as I'd like. I guess that's not too surprising, given my "issues" with writing. Of course, that's a major part of why I started this 'blog - to get practice writing, to improve my comfort level.&lt;br /&gt;&lt;br /&gt;In that spirit, here's an  update. I complained in an earlier post that I felt like my technical skills were deteriorating, and I needed to work on some independent projects to keep sharp. Well, I no longer have that problem anymore. I just started a new job, and there's more than enough technical challenge to go around - I've got to learn a new language (C#), and a new platform (the .NET framework). So maybe my little project will fall by the wayside for now, or perhaps I'll write a .NET gamne instead. We'll see what the next few weeks hold.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-113008679690902416?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/113008679690902416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=113008679690902416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113008679690902416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/113008679690902416'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2005/10/best-laid-plans.html' title='The best-laid plans...'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-112390799144134394</id><published>2005-08-12T21:34:00.000-07:00</published><updated>2005-08-12T21:39:51.446-07:00</updated><title type='text'>Getting my feet wet (again)</title><content type='html'>I've decided that I need to exercise my coding muscles a bit more. I've been doing little tiny programs as part of my day job as a software tester, but it's been a few years since I've done any original, from-scratch application development.&lt;br /&gt;&lt;br /&gt;Since I've got a Mac, and Cocoa is the environment I'm most familiar with, I'm going to start my new project as a Cocoa application. But what's the application going to be, you ask? Well, I have traditionally started out in any new environment by writing a video game, so why break with tradition?&lt;br /&gt;&lt;br /&gt;Now, I just need to choose a basic idea...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-112390799144134394?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/112390799144134394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=112390799144134394' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/112390799144134394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/112390799144134394'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2005/08/getting-my-feet-wet-again.html' title='Getting my feet wet (again)'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14034177.post-111999297388899649</id><published>2005-06-28T14:08:00.000-07:00</published><updated>2005-06-28T14:09:33.890-07:00</updated><title type='text'>First Post!</title><content type='html'>Heh, just kidding. But at least with my own blog, I'll always get the first (and last) word on whatever discussion I'm in.&lt;br /&gt;&lt;br /&gt;-Mark&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14034177-111999297388899649?l=codemines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codemines.blogspot.com/feeds/111999297388899649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14034177&amp;postID=111999297388899649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/111999297388899649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14034177/posts/default/111999297388899649'/><link rel='alternate' type='text/html' href='http://codemines.blogspot.com/2005/06/first-post.html' title='First Post!'/><author><name>Mark Bessey</name><uri>http://www.blogger.com/profile/12091448340989293403</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_MR7bT7RHlnY/SjqZgPOy0GI/AAAAAAAAAHQ/obghMBMSYPo/S220/n1434932199_1738.jpg'/></author><thr:total>0</thr:total></entry></feed>
