tag:blogger.com,1999:blog-123902292024-03-12T21:07:51.348-07:00John HannRandomly cohesive thoughts and ramblings...John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-12390229.post-55439131608238870992007-05-25T09:24:00.000-07:002007-05-25T09:32:09.510-07:00The Value of Writing Unit TestsDo unit tests make sense from a business perspective? <a href="http://codebetter.com/blogs/jean-paul_boodhoo/archive/2007/05/23/how-can-i-convince-my-management-other-developers-of-the-value-of-unit-testing.aspx">Jean-Paul S. Boodhoo's take here</a>. BTW, if you're doing Agile development and don't read <a href="http://codebetter.com">CodeBetter</a>, now is a great time to start.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-40626430365631526192007-05-20T11:39:00.001-07:002007-05-20T11:44:42.960-07:00Code Camp Slides and Source<a href="http://www.mediafire.com/?4t5cxxdwjq4">Here's a link</a> to the slides and sample code I used for my talk at Code Camp. And here's a link to more information about Selenium: <a href="http://www.openqa.org/selenium/">http://www.openqa.org/selenium/</a><br /><br />Thanks for attending!John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com2tag:blogger.com,1999:blog-12390229.post-14560679036524735002007-05-02T23:30:00.000-07:002007-05-03T13:21:25.107-07:00Test Utility ClassesWhen you start to write a substantial number of unit tests, you may discover that your tests have quite a bit in common. For instance, if you have a CreditCard class, you may have a block of code like this in each of your tests:<br /><div class="code-box"><pre>Assert.AreEqual( expectedCard.Number, actualCard.Number );<br />Assert.AreEqual( expectedCard.FirstName, actualCard.FirstName );<br />Assert.AreEqual( expectedCard.MiddleName, actualCard.MiddleName );<br />Assert.AreEqual( expectedCard.LastName, actualCard.LastName );<br />Assert.AreEqual( expectedCard.ExpMonth, actualCard.ExpMonth );<br />Assert.AreEqual( expectedCard.ExpYear, actualCard.ExpYear );<br /></pre></div><br />Of course, it won't be <span style="font-style: italic;">exactly </span>the same in each test, and that just amplifies the problem. What happens when you want to add a variable to CreditCard? Copy, paste, paste, paste... and inevitably, miss one. One way to manage this complexity is to implement a custom Equals() method in your class. With that in place, you can collapse the previous code into this:<br /><div class="code-box"><pre><br />Assert.AreEqual( expectedCard, actualCard );<br /></pre></div><br />Sure enough, this reduces the amount of code in your unit tests and makes them less error-prone. However, if the equality test fails, you will know that <span style="font-style: italic;">one </span>of the credit card's values is incorrect, but you won't know <span style="font-style: italic;">which.</span><span style="font-weight: bold; font-style: italic;"> </span>You can probably figure that out with a little debugging, but I prefer tests to be more explicit when they fail. So to deal with this, I'll typically create a test utility class for each class that looks something like this:<br /><div class="code-box"><pre><br />public class CreditCardUtil<br />{<br /> public static void AssertAreEqual( CreditCard expected, CreditCard actual )<br /> {<br /> Assert.AreEqual( expected.Number, actual.Number );<br /> Assert.AreEqual( expected.FirstName, actual.FirstName );<br /> Assert.AreEqual( expected.MiddleName, actual.MiddleName );<br /> Assert.AreEqual( expected.LastName, actual.LastName );<br /> Assert.AreEqual( expected.ExpMonth, actual.ExpMonth );<br /> Assert.AreEqual( expected.ExpYear, actual.ExpYear );<br /> }<br />}<br /></pre></div><br />This way, the unit test code is just as simple, but you get meaningful error messages when the test fails. This pattern is useful when you're working on a TDD project with a group, because each person on the team will know where to look if they need a particular bit of functionality. Looking for a method that will compare two Invoices? Try InvoiceUtil.AssertAreEqual. Not there? Write it.<br /><br />You may want to extend these utility classes to do other useful things, such as:<br /><ul><li>Instance an object that is initialized with unique properties (useful for comparison)<br /></li><li>Perform CRUD database operations<br /></li><li>Setup all of the object's dependencies<br /></li><li>Define useful constants, file paths, etc. specific to the object</li></ul>This may seem obvious, but I've seen a number of people (myself included) treat test code as a second class citizen in their projects. The beginner's approach is typically to:<br /><ol><li>Find a similar test</li><li>Copy it<br /></li><li>Change it a little</li><li>Repeat</li></ol>This is fine when the code is well-factored, but in the beginning, it usually isn't. Take the time to tighten up your test code before it's too late. That way, when your manager wants to add CVV numbers to credit card processing, you'll be in a much more responsive position. Remember, test code is production code.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-9577808354821400832007-05-01T22:40:00.000-07:002007-05-01T22:58:50.091-07:00New Rhino Mocks Record/Replay Syntax<a href="http://ayende.com/Blog/Default.aspx">Oren Eini</a> (aka Ayende Rahien) just released the latest version of Rhino Mocks, v3.0.5. This release includes a great new syntax for record and replay that will make your tests much easier to follow. Check out the syntactic sweetness <a href="http://ayende.com/Blog/archive/2007/05/01/Rhino-Mocks-3.0.5-Released.aspx">here</a>, be impressed, then download it <a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx">here</a>.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-48476080346623803402007-04-26T10:47:00.000-07:002007-04-26T19:42:39.680-07:00Unit Testing Private MethodsWhen writing unit tests, I frequently find myself wanting to test private methods. I used to think there were only three approaches to solving this problem.<br /><ol><li>Test the private method indirectly through some other, public method that invokes it.</li><ul><li>Pros: Keeps your class interface clean and doesn't compromise your OO design<br /></li><li>Cons: You may not be able to test all of the cases you'd like through the public method, and your test results may be affected by the code in the public method.</li></ul><br /><li>Make the private method protected and create a derived class in your test project that exposes the method publicly.</li><ul><li>Pros: Allows you test the method directly</li><li>Cons: Compromises the encapsulation of your initial design, requires writing more test classes.</li></ul><br /><li>Refactor the private method into some other class that exposes it publicly.</li><ul><li>Pros: Doesn't require more test code, you may actually end up with more well-factored design</li><li>Cons: You probably don't want to make this code public, isn't that why it was private in the first place?</li></ul></ol>So, given these options, I went with #2. I've written a lot of tests like this, but it's a chore to implement these wrapper classes in your test code, and I always thought there <span style="font-style: italic;">must </span>be a better way. Fortunately, if you're programming in .Net, there is:<br /><ol><li>Use reflection to invoke the private method directly</li><ul><li>Pros: Totally rocks.</li><li>Cons: Invoking the private method looks a little funky<br /></li></ul></ol>Kudos to Michael Kelly for showing me this approach. Now that I've seen this in action, its the only way I deal with this case. Here's a sample implementation to get you started:<br /><div class="code-box"><pre><br />using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Reflection;<br /><br />public class TestReflector<br />{<br /> public static T InvokeNonPublicMethod<T>( string methodName, object obj,<br /> params object[] parameters )<br /> {<br /> MethodInfo methodInfo =<br /> obj.GetType().GetMethod( methodName, BindingFlags.NonPublic |<br /> BindingFlags.Instance |<br /> BindingFlags.Static);<br /> if ( methodInfo == null )<br /> {<br /> throw new ApplicationException( "Private method not found for: '" +<br /> methodName + "'." );<br /> }<br /> return (T)methodInfo.Invoke( obj, parameters );<br /> }<br />}<br /><br /></pre></div><br />With that in place, it's very simple to use:<br /><div class="code-box"><pre><br />MyClass myClass = new MyClass();<br />string string1 = "abcdef";<br />string string2 = "123456";<br />string result = TestReflector.InvokeNonPublicMethod<string>(<br /> "MyPrivateMethod", myClass, string1, string2 );<br /><br /></pre></div><br />This code will support any non-public method with any number of parameters and any return type, except void. If you do need void support, its a simple adaptation of this code. Hope this helps!John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com5tag:blogger.com,1999:blog-12390229.post-32112189433198585342007-04-25T13:50:00.000-07:002007-04-25T23:29:35.305-07:00Unit Testing With Mock Objects - Slides and Sample CodeThanks to everyone who attended my mock objects talk at <a href="http://www.innotechconference.com/pdx/">Innotech </a>today, I hope it wasn't <span style="font-style: italic;">too </span>obvious that it was the first time I've presented at a conference ;-) As promised, I've posted my slides and source code <a href="http://www.mediafire.com/?cm01tyomdgi">here</a>. Sorry about the ads, but Blogger doesn't support file uploads and this site was the best I could find on short notice. If you're here for the links, here you go:<br /><ul><li>Rhino Mocks: <a href="http://shrinkster.com/ocn">http://shrinkster.com/ocn</a></li><li>WSCF: <a href="http://shrinkster.com/oco">http://shrinkster.com/oco</a> </li><li>Wikipedia Article: <a href="http://shrinkster.com/ocp">http://shrinkster.com/ocp</a> </li><li>Pragmatic Unit Testing: <a href="http://shrinkster.com/ocq">http://shrinkster.com/ocq</a> </li><li><a href="http://www.MockObjects.com">MockObjects.com</a></li><li>Martin Fowler’s Article: <a href="http://shrinkster.com/ocr">http://shrinkster.com/ocr</a></li><li>XUnit Test Patterns: <a href="http://shrinkster.com/ocs">http://shrinkster.com/ocs </a> </li></ul>If you have any additional resources you'd like to share, let me know and I'll post them here.<br /><br />Thanks again,<br />JohnJohn Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com4tag:blogger.com,1999:blog-12390229.post-22235405024765635932007-01-07T12:03:00.000-08:002008-12-08T21:29:58.175-08:00Online Mii Maker<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZdguX0WFB44/RaFS_Yq4VzI/AAAAAAAAAAU/wCObLG0ndAE/s1600-h/Mii.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZdguX0WFB44/RaFS_Yq4VzI/AAAAAAAAAAU/wCObLG0ndAE/s400/Mii.png" alt="" id="BLOGGER_PHOTO_ID_5017382708774983474" border="0" /></a>Have some time to waste? Try <a href="http://www.blogsmithmedia.com/www.joystiq.com/media/2006/10/mii-v3.swf">this</a>!John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1165545472692847502006-12-07T18:27:00.000-08:002006-12-07T21:34:48.276-08:005 Things I Look for in a Job<span style="font-weight: bold;">1. Passion</span> - Is the team passionate about the craft of software development? Is the company? People who love software breed enthusiasm, while the apathetic, "it's just a job" types can suck the life out of any room.<br /><br /><span style="font-weight: bold;">2. Purpose</span> - What impact will this software have on its users? Working on tax management software is considerably less appealing than developing a website that allows people to donate to charity.<br /><br /><span style="font-weight: bold;">3. Respect</span> - You've just entrusted me to develop your server applications, don't prohibit me from browsing Flickr. It's insulting. Occasionally, a cup of coffee and a random diversion are exactly what I need to solve a hard problem.<br /><br /><span style="font-weight: bold;">4. Opportunity </span>- How can this company change the world? What part might I play in that? Not everyone is in this game for the money.<br /><br /><span style="font-weight: bold;">5. Comfort</span> - Is there good coffee? Decent chairs? Windows? A company that creates an uplifting work environment is far more likely to attract top talent than a company that keeps its developers in the basement.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1135066270458689202005-12-20T00:06:00.000-08:002005-12-20T00:11:10.476-08:00My Photo CollectionI just finished uploading a bunch of my favorite photos to Flickr. Photography has been a hobby of mine for a few years now, and I figured that anyone reading this might also be interested in my work. <a href="http://www.flickr.com/photos/15733622@N00/">Check it out!</a>John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com1tag:blogger.com,1999:blog-12390229.post-1127537627958523442005-09-23T21:40:00.000-07:002005-09-23T22:19:16.480-07:00OEF Entrepreneurship AwardLast night, my company, <a href="http://www.elevenwireless.com">Eleven Wireless</a>, attended the <a href="https://www.oef.org/home/">Oregon Entrepreneurs Forum's</a> awards dinner. We were nominated for the Development Stage Company of the Year award, and, as luck would have it, <a href="https://www.oef.org/events/awards/recipients_2005">we won</a>! Needless to say, we were all surprised and delighted, and we spent the rest of the night celebrating. <br /><br />It's great to see our sacrifices, hard work, and potential recognized by Portland's investment community. The company has been around for about three years now, and it just keeps getting better. I think we have great opportunities ahead of us, and we're in for one hell of a ride.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com1tag:blogger.com,1999:blog-12390229.post-1126681882829197772005-09-13T23:47:00.000-07:002005-09-14T01:05:57.783-07:00XPDX RocksI just got home from my first <a href="http://xpdx.org/">XPDX</a> meeting, and I have to say I was very impressed. Arlo Belshee's presentation on <a href="http://agiletoolkit.libsyn.com/index.php?post_id=15636">Promiscuous Pairing</a> was great, and there were many interesting discussions before, during, and after the presentation.<br /><br />As a member of a team that moved to XP (<a href="http://www.extremeprogramming.org/">Extreme Programming</a>, for the non-nerds in the audience) nearly a year ago, I am interested in seeing what other teams have done with XP, and what results they've had. I've found that, while XP has a few essential <a href="http://www.jamesshore.com/Blog/An-Extreme-Stake-in-the-Ground.html">core practices</a>, every team that implements XP does so in a unique fashion. This is not a bad thing, and, in fact, is a part of the methodology.<br /><br />The great thing about this group is that folks with extremely diverse backgrounds can share their thoughts and experiences with development in general, and XP in particular. At this point, you're probably thinking, "What the hell else did you expect from an XP user group? Recipes?" Well, what I find particularly interesting is that XP evolves by design. This is sometimes criticized as loose definition, but, when you get a bunch of people exchanging their experiences with XP in the same room, you see that its strength lies in its flexibility.<br /><br />It empowers a team to adjust its process to fit into its working environment without degrading into chaos. Over time, variations of the process are exchanged within the community, and the most successful variations are canonized in the process definition itself. Groups like XPDX accelerate this evolution, and it was great to see it in action. If you live in the Portland area and are interested in software development, check it out. You won't be disappointed.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1122276043859033702005-07-24T23:27:00.000-07:002012-07-20T08:17:39.350-07:00Is This Thing On?Hello, all! I just wanted to touch base with my loyal readers to let you know that I have not, in fact, fallen off of the face of the Earth. What <i>have</i> I been doing, you ask? Well, for starters, enjoying summer. Rock climbing, camping, rafting, hiking, and so on. It's been great fun, and I'm hoping to do some whitewater kayaking before the summer is over.<br />
<br />
On the computer geekery front, I've started working with <a href="http://wtr.rubyforge.org/">WATIR</a> for testing web applications, and absolutely love it. It's really a beautiful, simple piece of technology that Just Works. We've started using it at work, and it is sooo much better than the manual test plans we had before. I'm also keeping an eye on <a href="http://selenium.thoughtworks.com/index.html">Selenium</a>, which looks like it may work as well as WATIR for all browsers. How cool is that?<br />
<br />
In other geek news, I attended the Portland Code Camp this weekend and met a lot of interesting people. The whole thing was a remarkable success, with quality content, good community turnout, and a great location. Kudos to <a href="http://www.jasonmauer.com/">Jason Mauer</a>, <a href="http://richhubbins.theclaussens.com/">Rich Claussen</a>, and many others for doing the legwork to put it all together. You guys rock!<br />
<br />John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1116995750768884302005-05-24T20:35:00.000-07:002005-05-28T03:03:53.390-07:00My First BackpackLast weekend, I decided to do a little backpacking in the Olympics. It was my first backpacking trip, and my first trip to the Olympic Peninsula. I didn’t really know what to expect, but I bought myself a backpack and a down sleeping bag, packed up my best raingear, and hit the trail with a few friends.<br /><br />The first day, we were greeted with <i>perfect</i> hiking weather. It was overcast (which, for a pasty, freckled fellow like myself, rocks) and about 60 degrees. We started our journey near <a href="http://virtualguidebooks.com/Washington/OlympicPeninsula/QuinaltLakeRiver/QuinaltLakeEvening.html">Quinault Lake</a>, and our goal was to reach the Enchanted Valley, a mere 13 miles up the trail. The trail started off wide and level, almost like a logging road, but quickly narrrowed to the single-track, rock hopping type of trail I love.<br /><br />I was amazed by the sheer amount of water flowing through this place. Countless streams and waterfalls fed the river that raged beside us. Huge trees covered with moss and mushrooms sheltered us from the rain, and the sounds of wildlife echoed through the valley. We hiked on for hours, skipping across puddles, traversing streams, and taking in the beauty of it all.<br /><br /><a href='http://photos1.blogger.com/img/179/5371/1024/Creek1.jpg'><img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/179/5371/400/Creek1.jpg'></a><br /><br />After about 5 hours or so of hiking, we stumbled across the <span style="font-style: italic;">perfect</span> campsite. It was right next to the river, covered with trees, and had a big stack of firewood just waiting to be burned. After realizing that there was no way we were going to make it to the Enchanted Valley before sundown, we decided to bag it and set up camp there.<br /><br />As we were talking about how this site was just too good to be true, a couple of guys walked up and told us that a scout troop had Such-and-Such campsite reserved, and that this might be it. Now, we didn't actually know the <span style="font-style: italic;">name</span> of our site, but we weren't about to give it up on a rumor.<br /><br />Once the hikers had moved on, we got out the map and tried in vain to find the reserved site. Not long after we had pitched the first tent, the scout troop came marching by.<br /><br />Making small talk and avoiding eye contact, we politely waited for the scouts to pass. Eventually, the scoutmaster and his assistant came into view. As they approached us, one of them stopped and asked if this was Such-and-Such camp. Naturally, we replied with a confident "No." Now, we didn't actually <span style="font-style: italic;">know </span>this in the 'factual' sense of the word, but we were pretty sure it wasn't <span style="font-style: italic;">our </span>camp.<br /><br />The scoutmaster went on to tell us that the kids were getting really tired, and that he didn't think they could go on much further. At this point, our able bodies felt kinda bad, and we reassured the scoutmaster that his campsite was probably <span style="font-style: italic;">really </span>close. He grudgingly continued to hike, and I <strike>did a victory dance</strike> stoically continued setting up camp.<br /><br />About ten minutes later, the scout leaders returned. They again told us how tired the kids were, and asked us if we could <span style="font-style: italic;">share </span>the campsite with them. The scoutmaster assured us that all twelve kids were exhausted and would be asleep by 8. My friend Isaiah explained that we were looking to have a nice, mellow, evening, and the scoutmaster promised that the they would be really quiet. I reiterated that we really wanted to have a relaxed, mellow night, and if they really wanted the site, we could find another one.<br /><br />At that point, the scoutmaster's sidekick turned to him and said, "Al, I think they might be saying that they won't be able to be as 'mellow' as they want to be with all the kids around." I fought the urge to burst out laughing, but it was really hard. Maybe he thought we wanted to smoke pot, or that we were couples who wanted some 'quiet time' together, but whatever it was, it went uncorrected. The scouts ended up at a campsite not far from our own, and we had a nice, peaceful night by the campfire.<br /><br />After listening to the rain patter its way towards morning, I woke up warm, dry, and comfortable. The girls, on the other hand, woke up in a puddle. The seams in their tent had leaked pretty bad and their sleeping pads were soaked. Needless to say, we made excellent time on our way back to the trailhead. Three hours later, we were sipping lattes in the Lake Quinault Lodge.<br /><br />After this experience, I will definitely be doing more backpacking trips this summer. I'd really like to see more of the Olympic Penninsula and the San Juans. Also, getting down to the redwoods would be great. Loooong story short, backpacking rocks. Do it.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1115965079773006712005-05-12T22:57:00.000-07:002005-05-13T00:17:44.886-07:00XBox 360 - The MarketingJust finished watching the XBox 'launch event' on MTV, here are a few things I took away from it:<br /><ol> <li><span style="font-weight: bold;">Microsoft has A LOT of money </span>- I know this isn't exactly news, but between the airtime on MTV, the falsely enthusiastic celebrities, and the band, I think I just saw upwards of $10 million dollars being spent. Yikes!<br /></li> <li><span style="font-weight: bold;">People Will Say Anything for a Buck<span style="font-weight: bold;"> </span></span>- Yes, I know that media whoring is a celebrity's stock and trade, but this was SO transparent. Most expensive infomercial ever made.<br /></li> <li><span style="font-weight: bold;">This is a GAME console, right?</span> - Maybe I'm not the target audience here, but I wanted to see more about the actual games. The brief snippets showed some good graphics, but there was <span style="font-style: italic;">nothing</span> that stood out from an innovation perspective (ok, the <a href="http://www.vgmuseum.com/pics4/madden95.html">same old Madden</a> with graphics like <a href="http://xboxmovies.teamxbox.com/xbox/1854/Madden-NFL-NextGen-Commercial/">these</a> might be pretty cool).</li> </ol><a href="http://msxb.wmod.llnwd.net/a274/o2/ourcolony/TheColony_v1_750k.wmv">Here's</a> a link to a much better video about the XBox 360. And while we're on the topic of next generation graphics and gameplay, check out <a href="http://www.3dgamers.com/dlselect/games/myst5/myst5e3-1.wmv.html">this trailer</a> for Myst 5. From what I've seen so far, this should be a great game. I doubt that the MTV crowd will 'get it', but the aesthetes among you will love it.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com4tag:blogger.com,1999:blog-12390229.post-1115789031249280912005-05-10T21:36:00.000-07:002005-05-10T22:24:07.513-07:00And Now for Another Kind of Race...Whew! This last week was intense. My trip to Spokane was nice, I got a chance to see my parents, my grandma, and my friend Jason, who is putting the finishing touches on some <a href="http://myst5.ubi.com/us/">very cool stuff</a> at <a href="http://www.cyanworlds.com">Cyan Worlds</a>. I also ran Bloomsday with my dad, which was great (except for the fact that he dusted me by a full 24 minutes). Honestly, I was happy that I actually ran the whole thing with having to walk. Still, I would have liked to have outpaced my dad, since he's like, 80 and all. Maybe next year...<br /><br />My weekend in Spokane was busy, but the following week back in Portland was <i>intense</i>. The details are better left unpublicized, but it suffices to say that there was no shortage of obstacles to overcome. I spent the following weekend doing a whole lot of nothing, and that was about all I had energy left to do. Slowly, cautiously, I'm stepping back towards normalcy (well, normal <i>for me</i>, anyway), and hopefully, that will mean more time for blogging. Stay tuned.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1114959374954123182005-05-01T07:25:00.000-07:002005-05-01T07:56:14.953-07:00Wanna Race?I'm visiting <a href="http://www.spokanecity.org/">Spocompton, WA</a>, getting ready to run my first <a href=http://www.bloomsdayrun.org/>Bloomsday</a>. Before moving to Portland in 1999, I lived here for about 12 years, but never ran Bloomsday. Today, that all changes. Watch your back, <a href="http://www.bloomsdayrun.org/ResultsHistory.htm">Simon Wangai</a>! This year, the crown is mine.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1114585111077424612005-04-26T23:06:00.000-07:002005-04-26T23:58:31.080-07:00Just Installed GentooMy <a href="http://neopoleon.com/blog/posts/13798.aspx">technical bi-curiousity</a> finally got the best of me. Today, I installed a distro of <a href="http://www.gentoo.org/">Gentoo Linux</a> configured specifically for my Compaq X1000 laptop by <a href="http://www.x1000forums.com/index.php?showuser=278">Ahmad</a>. So far, all I can say is that it works. I don't know much about Linux or Unix, but, as a self-proclaimed geek, I think I'm long overdue for some exposure.<br /><br />Hopefully, the feeling of being a n00b will subside soon. It really sucks not knowing your way around an OS, I just take Windows for granted. Not knowing how to do simple things like install a friggin' Firefox upgrade is rather humbling. I extract the installer to my desktop, run the setup script, and it defaults to attempting to install on the desktop!<br /><br />Now, I know Firefox is already installed, but where? Right-click the shortcut, select properties, and I see "/usr/bin/firefox" Mmm, ok, so, do I just point the setup script there? Do I have to delete it first? Let's see what it contains. Oh, it's not a directory, it's a shell script! Wonderful. This really makes me appreciate OSs that don't make you <i>think</i> about this sort of thing.<br /><br />I suspect that anyone reading this who knows Linux probably thinks I'm an idiot, but it's just this sort of thing that's deterred me from using it in the past. And I'm not alone. If the open source community ever expects to Linux to make a dent in the desktop market, they'll need to make little things like this "just work". Until then, a few users, like myself, may take the time to figure it out, but the majority will turn to more user-friendly alternatives.John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1114375217569943802005-04-24T13:40:00.000-07:002005-04-24T14:41:17.626-07:00Urban GrindOne of my favorite aspects of living in Portland is the variety of coffeeshops. They range from larger chains, like Peet's and Seattle's Best to small, hip places like Annabanana's, <a href="http://www.backspace.bz/">Backspace</a>, and, my personal favorite, <a href="http://www.urbangrindcoffee.com/">Urban Grind</a>. For a tech-minded person like myself, Urban Grind strikes the right balance between tech savvy and good old-fashioned customer service.<br /><br />It's a large, open space with lots of comfortable couches and chairs. It also serves as a gallery, showcasing a variety of pieces from local artists. Any given day, you're likely to see students, artists, musicians, and programmers commingling and slurping down large quantities of Urban Grind's excellent, home-roasted coffee. If that's not enough, there's free WiFi, courtesy of the <a href="http://www.personaltelco.net/static/index.html">Personal Telco Project</a>, and Mac, who rocks.<br /><br />I like to spend at least one morning here a week, mainly to do some research and meet random people. Case in point, I was just chillin' on the couch, typing this post, and I noticed that the guy sitting across from me had a Personal Telco sticker on his laptop. I asked him about it, and it turns out that in addition to contributing to Personal Telco, he's a technical marketing engineer at Intel, working on laptops that we'll see in two years.<br /><br />Would I have stumbled across someone this cool at a local Starbucks? I think not. Nor would I be as wired, but I digress...<br /><br />We had a good talk about Linux, open source networking utilities, and the future of paid WiFi. As a Microsoft-centric programmer developing software that, among other things, enables people to charge for wireless access, it was interesting to talk to someone who derides Windows and thinks that paid WiFi will only work in very niche markets. He had some valid points, and it will be interesting to see where the market goes.<br /><br />My take on it is that there will be a continued market for paid wireless, particularly in the hospitality and travel industries, where you have a captive audience. Also, as wireless networks evolve and higher bandwidth content becomes available, a new market for ultra-high bandwidth will emerge, and people (like me) will be willing to pay for premium service.<br /><br />Just like TV, which supports over the air, basic cable, and digital high definition, internet access will continue to have differing tiers of service. Now it's 56k, DSL, and FIOS for wired access, but it's basically WiFi (802.11b/g/x) and everything else (3G and it's brethren) for wireless. Eventually, 802.11x won't be enough for Joe Consumer to use his Killer App wirelessly, and he'll be willing to pay a little extra for better service. This is, IMHO, where the market for paid wireless access will continue to exist. And with a little luck, it will be <a href="http://www.elevenwireless.com">Powered by Eleven™</a>John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com0tag:blogger.com,1999:blog-12390229.post-1114310708738273652005-04-23T18:54:00.000-07:002005-04-23T20:46:06.543-07:00Taking the PlungeFirst post!!!<br /><br />Ok, so this isn't Slashdot, and I'm not about to launch into some anti-Microsoft/RIAA/DRM tirade. Instead, I'd simply like to introduce myself. My name is John Hann, and I'm a software developer in Portland, OR. In addition to programming, I have a lot of other hobbies including snowboarding, mountain biking, and hiking.<br /><br />I don't know what you'll be reading here in the coming months, but chances are you'll see posts on life, technology, culture, and maybe even politics. You'll laugh, you'll cry, and, hopefully, you'll contribute a comment or two.<br /><br />I'd like to thank the folks that encouraged me to take the plunge and start a blog, including <a href="http://richhubbins.theclaussens.com/">Rich</a>, <a href="http://geekswithblogs.net/jolson">Jason</a>, and <a href="http://ponzarelli.com/">Ponzi</a>. The cusp has been crossed, and the best is yet to come. <a href="http://johnhann.blogspot.com/atom.xml">Stay tuned.</a>John Hannhttp://www.blogger.com/profile/10469674279015637491noreply@blogger.com3