<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://srtsolutions.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Darrell Hawley Blog</title><subtitle type="html" /><id>http://srtsolutions.com/blogs/darrellhawley/atom.aspx</id><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/default.aspx" /><link rel="self" type="application/atom+xml" href="http://srtsolutions.com/blogs/darrellhawley/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2008-04-12T09:02:04Z</updated><entry><title>Class Variables versus Instance Variables in Python</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/09/05/class-variables-versus-instance-variables-in-python.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/09/05/class-variables-versus-instance-variables-in-python.aspx</id><published>2008-09-05T15:41:06Z</published><updated>2008-09-05T15:41:06Z</updated><content type="html">&lt;p&gt;While writing some Python, I ran into a behavior that I didn&amp;#39;t expect. Check out the following chunk of code:&lt;/p&gt; &lt;p&gt;import unittest  &lt;p&gt;class Task(object):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; keywords = []  &lt;p&gt;class TestClass(unittest.TestCase):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def test_keywords(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mytask = Task()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mytask.keywords.append(&amp;quot;one&amp;quot;)  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mytask2 = Task()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mytask2.keywords.append(&amp;quot;two&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.assertEqual(mytask2.keywords[0], &amp;quot;two&amp;quot;)&amp;nbsp;&amp;nbsp; &lt;p&gt;When I ran the test, it failed with the following exception: &amp;quot;AssertionError: &amp;#39;one&amp;#39; != &amp;#39;two&amp;#39;&amp;quot;. As I dug into the code I found that the mytask and mytask2 instances had received both of the keywords, not just one a piece. My initial reaction was that this must be some sort of Python bug. But as I investigated I found that I had actually created a Class Variable - Python&amp;#39;s way of saying &amp;quot;static&amp;quot;. What I really wanted was an Instance Variable. &lt;p&gt;class Task(object):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.keywords = [] &lt;p&gt;By declaring &amp;quot;keywords&amp;quot; inside the constructor it is now guaranteed to be unique to each instance of the class allowing my test to pass. This &lt;a href="http://www.python.org/doc/2.5.1/ref/class.html" target="_blank"&gt;link&lt;/a&gt; in the &lt;a href="http://www.python.org/doc/2.5.1/ref/" target="_blank"&gt;Python Reference Manual&lt;/a&gt; explains it much more clearly. Note that &lt;a href="http://www.codeplex.com/IronPython" target="_blank"&gt;IronPython&lt;/a&gt; behaves in the same manner.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4515" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>More Lessons from Project Management in the Physical World</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/08/29/more-lessons-from-project-management-in-the-physical-world.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/08/29/more-lessons-from-project-management-in-the-physical-world.aspx</id><published>2008-08-29T15:12:56Z</published><updated>2008-08-29T15:12:56Z</updated><content type="html">&lt;p&gt;&lt;em&gt;This post is a continuation of &lt;/em&gt;&lt;a href="http://www.darrellhawley.com/2008/07/lessons-from-project-management-in_30.html" target="_blank"&gt;&lt;em&gt;my post from July 30&lt;/em&gt;&lt;/a&gt;&lt;em&gt; on some project management lessons I learned while roofing my garage.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I had all of my roofing supplies, my work force was in place and the big day had arrived. Everything was just as I had envisioned it. Then my first volunteer arrived and told me he wasn&amp;#39;t sure how long he was going to be able to help. His wife had gotten sick the day before and it didn&amp;#39;t appear she was going to be in any shape to watch their children. If he would have been the only person I recruited to help, I may have been hard-pressed to accomplish my goal of completing the roof by Sunday evening. But he wasn&amp;#39;t. I still had one other person to help that day and I could have probably found additional help the following day if necessary. Crisis averted.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 4: Mitigating risk is time well spent especially when risk becomes reality.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I had researched getting a dumpster and instead found a company that would load your garbage in a truck with their own work force. They had a nice website that detailed their costs - or so I thought. It turns out that they had a special pricing for roofing which I didn&amp;#39;t learn about until 3 hours prior to pick-up. The additional cost was excessive and there was no way I was going to pay for it. I had no backup plan aside from just leaving a pile of roofing in my driveway until I found alternative. Fortunately, my friend let me borrow his truck and I was able to dispose of the old roofing for a fraction of the cost. I was lucky. In retrospect, having a dumpster on site ahead of time would have completely eliminated this risk. Instead, I knowingly introduced a number of unnecessary variables into my project (reliability of the company schedule, truck and web site pricing for example).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 5: You may not know ALL of the risks ahead of time, but you CAN minimize them by limiting your unknowns.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;When Sunday evening did come, I could say that I had met my goal of having a roof in place. Unfortunately, the job was far from done. The rain storm that had hit meant I had to clean out the garage and I still had a truck load of roofing to take to the landfill. It turns out &amp;quot;done&amp;quot; really meant that the only change to my property was a new garage roof - definitely not the case on Sunday evening. I could have blamed the rain for not meeting my goal but that would have done nothing but assuage the problem. The rain had only changed the actions necessary to attain my goal not change the goal itself.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 6: Make sure that everyone on the team clearly understands what &amp;quot;done&amp;quot; means.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;When the rain started coming down, I looked at it as a bad thing. But it forced me to go through the &amp;quot;features&amp;quot; of my garage - spare sheets of drywall and scrap lumber for example - and make some decisions on them. Removing these features made my garage a more useable space. The irony of course, was that I considered rain a risk not an opportunity.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 7: Beware of bloat&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 8: Look for the opportunities in setbacks. Sometimes they can contribute to the success of the project.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4417" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Speaking at GANG on Wednesday Night</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/08/19/speaking-at-gang-on-wednesday-night.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/08/19/speaking-at-gang-on-wednesday-night.aspx</id><published>2008-08-20T01:32:11Z</published><updated>2008-08-20T01:32:11Z</updated><content type="html">&lt;p&gt;Just a note that I&amp;#39;ll be doing my &amp;quot;Getting Started with IronPython&amp;quot; talk at the &lt;a href="http://www.migang.org" target="_blank"&gt;Great Lakes Area .NET User Group&lt;/a&gt; in Southfield, MI tomorrow night. I&amp;#39;m always glad to go back to GANG since this is where my User Group career started before I moved over to the &lt;a href="http://www.aadnd.org" target="_blank"&gt;Ann Arbor .NET Developers Group&lt;/a&gt;. Come out and learn about one of the new .NET languages while networking with local community leaders. I Hope to see you there.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4334" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Lessons from Project Management in the Physical World</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/07/30/lessons-from-project-management-in-the-physical-world.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/07/30/lessons-from-project-management-in-the-physical-world.aspx</id><published>2008-07-31T03:27:31Z</published><updated>2008-07-31T03:27:31Z</updated><content type="html">&lt;p&gt;When developers talk about projects, they probably are talking about software. But however hard they try, they cannot completely escape &amp;quot;real&amp;quot; world projects. This is especially true when it comes to home ownership. When my wife and I noticed our garage roof deteriorating, I realized I was going to be confronted with an especially nasty real-world undertaking. By looking at it through the eyes of a project manager however, I was able to take an unpleasant task and turn it into a successful learning experience.&lt;/p&gt; &lt;p&gt;Like any project, replacing a roof requires planning and my plan focused on a single goal: there will be a new roof on my garage come Sunday night. The five basic items on my task list - schedule a weekend, purchase supplies, order a dumpster, remove the old roof and install the new roof - were all focused toward achieving that goal. I was concerned about inclement weather, unforeseen repairs and lack of personnel, so I created a plan for each risk and a trigger for implementing it. What I did not plan was HOW to roof the garage. I simply had to be confident that the implementation team could do the work using pre-defined best practices.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 1: Planning is about achieving a goal, identifying general tasks and knowing how to deal with risks. Planning is NOT about implementation details.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;I felt the project could be completed quickly though I didn&amp;#39;t have the experience to say for certain. I contacted someone with more experience (my dad) and he confirmed that one day should be enough time for a 2-man crew to roof a one-car garage. My experience however, told me to include extra time and any additional personnel I felt I could keep consistently busy. In the end, myself and 2 people were able to replace the roof in one very long Saturday. If additional time was required, we still had Sunday as a buffer.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 2: Experience is invaluable. If you don&amp;#39;t have it, find it.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Risk exists. Acknowledge it up front or spend your life being constantly surprised by it&amp;#39;s consequences. When I chose my weekend to roof, I knew three days in advance that rain was a possibility. I knew that afternoon thunderstorms were a certainty the night before. To mitigate the rain risk, I bought a tarp large enough cover only a portion of my garage. I felt that the extra $80 was not worth protecting things that I could either handle the wet or that I could live without. With plan in place and thunderstorms in the forecast, I pressed forward. Guess what? We had a two hour downpour in the morning almost immediately after we had finished removing the old roof. Critical items were protected, but I still suffered some minimal damage. When I cleaned out my garage, the only things I had lost were time and expendable items. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Lesson 3: Just because you mitigate risk doesn&amp;#39;t mean you completely avoid it&amp;#39;s consequences. Take a moment to imagine handling the consequences before committing to anything.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;em&gt;As this could turn into such a large blog post&lt;/em&gt;, I thought I&amp;#39;d break it up into a couple of chunks. I&amp;#39;ll post part two sometime in the next week. &lt;/em&gt;&lt;a href="http://www.dotnetrockstar.com/2008/07/21/ThisBlogEntryInspiredBy.aspx" target="_blank"&gt;&lt;em&gt;John Hopkins&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, I acknowledge that you&amp;#39;ve called me out and I owe a post on who inspires me.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4095" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Speaking at GLUG.Net Tonight</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/19/speaking-at-glug-net-tonight.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/19/speaking-at-glug-net-tonight.aspx</id><published>2008-06-19T13:00:10Z</published><updated>2008-06-19T13:00:10Z</updated><content type="html">&lt;p&gt;I&amp;#39;ll be giving my now re-tooled introduction to IronPython this evening at the &lt;a href="http://portal.artemis-solutions.com/glugnet/" target="_blank"&gt;Greater Lansing User Group .Net&lt;/a&gt; meeting. Entitled &amp;quot;Getting Started with IronPython&amp;quot;, I&amp;#39;ll be focusing on the syntax, rules and &amp;quot;gotchas&amp;quot; of IronPython by making comparisons to C# as well as writing lots of code. My end point - if there&amp;#39;s enough time -&amp;nbsp; is to get started on a very simple windows application. Hope to see you there.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3617" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>AADND and Lessons Learned on Speaking</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/12/aadnd-and-lessons-learned-on-speaking.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/12/aadnd-and-lessons-learned-on-speaking.aspx</id><published>2008-06-12T14:22:29Z</published><updated>2008-06-12T14:22:29Z</updated><content type="html">&lt;p&gt;I gave my &lt;em&gt;Looking Out For IronPython&lt;/em&gt; talk at AADND last night which went really well. People were asking questions and genuinely seemed engaged. But as far as knowledge gained is concerned, I think I was the big winner last night. After the meeting had cleared out, &lt;a href="http://srtsolutions.com/blogs/billwagner" target="_blank"&gt;Bill Wagner&lt;/a&gt; gave me the most in-depth speaking critique I have ever gotten. Typically, the only feedback a speaker gets is a stack of evaluation forms with a bunch of numbers circled and an occasional useful comment. Bill&amp;#39;s comments focused not only content, but also pace and physical movement. His comments in summary...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Only move to different locations in the room if there is a purpose in doing so. I have a tendency to pace which only distracts the audience from your point. Check out &lt;a href="http://www.joshholmes.com/2008/04/28/PublicSpeakingAndMovementOnstage.aspx" target="_blank"&gt;this post&lt;/a&gt; by &lt;a href="http://www.joshholmes.com/default.aspx" target="_blank"&gt;Josh Holmes&lt;/a&gt; to hammer home the point. If you have the time, browse his blog in it&amp;#39;s entirety. He has a lot to say about public speaking.  &lt;li&gt;Posture is important. It magnifies your presence and conveys confidence. Putting your hands in your pockets kills your posture and thus your presence. Even worse, you loose credibility with your audience. Stand tall, keep your hands out of your pockets and use hand gestures only if necessary.  &lt;li&gt;It&amp;#39;s OK to say, &amp;quot;I don&amp;#39;t know,&amp;quot; but it&amp;#39;s not OK to advertise it (yes, there is irony in this post). When you speak, you become the self-professed expert in the room. In this context, I viewed any question from the audience that I couldn&amp;#39;t answer as a failure. Now that I&amp;#39;ve learned differently, I seemed to have gone too far. I LIKE to talk about the issues I&amp;#39;m trying to solve. Great for personal growth, not so much for presentations. I need to focus on what I know.  &lt;li&gt;&lt;em&gt;Looking out for IronPython &lt;/em&gt;was intended to be an introductory talk. People are showing-up to learn the basics of IronPython, not to be wowed by what IronPython can do. I spent too too much time on complex examples that had little value to the audience.  &lt;li&gt;My talk was structured so that the first half was entirely PowerPoint and the second half was entirely code. This sort of thing can be taxing on an audience&amp;#39;s attention span. Do a few slides, show a demo, do some more slides, then do another demo. This breaks things up into smaller, more digestable chunks.  &lt;li&gt;Showing an audience something they already know and then morphing it into something new is an effective teaching technique. I did it in &lt;em&gt;Looking out for IronPython &lt;/em&gt;and I should consider it for future talks.  &lt;li&gt;Humor is risky which is why I have made the conscious decision to stay away from a lot of jokes in my presentations. I did insert one slide that last nights audience found entertaining (earlier audiences did not), but it was directly relevant to my point. My lesson here? Don&amp;#39;t plan a joke. If the opportunity comes, jump on it. Otherwise, just be yourself. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bill&amp;#39;s comments were a nudge in the right direction. If I&amp;#39;m really serious about improving though, I need to find the nearest &lt;a href="http://www.toastmasters.org/" target="_blank"&gt;Toastmasters&lt;/a&gt; group. All I have to do is find the time!&lt;/p&gt; &lt;p&gt;I know I promised a post of IronPython resources. I&amp;#39;m still compiling my list and hope to have those posted by this weekend.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3513" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Speaking at AADND</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/10/speaking-at-aadnd.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/10/speaking-at-aadnd.aspx</id><published>2008-06-11T01:30:32Z</published><updated>2008-06-11T01:30:32Z</updated><content type="html">&lt;p&gt;I&amp;#39;ll be speaking at the &lt;a href="http://www.aadnd.org/Default.aspx" target="_blank"&gt;Ann Arbor .NET Developers&lt;/a&gt; meeting tomorrow evening starting at 6:30. If you&amp;#39;re interested, get there by 6:00 to present a topic of your choosing at the AADND lightning talks. These short presentations (up to 10 minutes) are a great way to ease your way into speaking in front of groups. Even if you have no desire to speak at user groups or conferences, giving an effective presentation to management or your fellow developers has a lot of advantages. Our meeting is held at &lt;a href="http://www.srtsolutions.com" target="_blank"&gt;SRT Solutions&lt;/a&gt;, 206 S Fifth Ave Suite 200 in Ann Arbor (click &lt;a href="http://srtsolutions.com/contact/ContactSRT.aspx" target="_blank"&gt;here&lt;/a&gt; for a map). Hope to see you there.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3491" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>NUnit and IronPython</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/10/nunit-and-ironpython.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/10/nunit-and-ironpython.aspx</id><published>2008-06-11T01:02:53Z</published><updated>2008-06-11T01:02:53Z</updated><content type="html">&lt;p&gt;A while back, I came across &lt;a href="http://blog.bittercoder.com/PermaLink,guid,ef0c495d-6804-4d6e-9537-ce238b6047c3.aspx" target="_blank"&gt;this post&lt;/a&gt; from the &lt;a href="http://blog.bittercoder.com/default.aspx" target="_blank"&gt;Bitter Coder&lt;/a&gt; telling you how to use IronPython with NUnit. It&amp;#39;s an interesting approach in that you actually put your *.py files inside of a C# project. Though you won&amp;#39;t be able to easily test external IronPython code without using the Hosting APIs, it actually is a great way to introduce Python (and unit testing) into your environment. Of course you&amp;#39;ll need to be willing to rip your tests apart as our method of communicating with the DLR languages evolves.&lt;/p&gt; &lt;p&gt;When you download the source code from the Bitter Coder, you&amp;#39;ll need to make a couple of tweaks.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Rename IronPythonTest.Framework.PythonSuiteAttribute to PythonFixtureAttribute. Make sure you use a refactoring tool (either the one that comes with Visual Studio or a third party tool) so that you can be certain that all instances of PythonSuiteAttribute are changed.  &lt;li&gt;I needed to update my nunit.framework reference in the IronPythonTest.Addin project. It may behoove you to update all of your NUnit references to the version you are using.  &lt;li&gt;The nunit.framework reference I just mentioned was also set to copy local. This doesn&amp;#39;t really hurt, but none of the NUnit libraries are set to do this. It&amp;#39;s just aesthetics.  &lt;li&gt;There are a couple of references throughout the solution - nunit.addin for one - that can&amp;#39;t be found. They seem to be artifacts from an earlier iteration and can be removed.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That should do it. Tip o&amp;#39; the hat to the Bitter Coder.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3490" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>So Why Did I Wait So Long to Switch to Gmail?</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/03/so-why-did-i-wait-so-long-to-switch-to-gmail.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/06/03/so-why-did-i-wait-so-long-to-switch-to-gmail.aspx</id><published>2008-06-04T03:30:31Z</published><updated>2008-06-04T03:30:31Z</updated><content type="html">&lt;p&gt;I&amp;#39;ve been asking myself that question ever since my switch to Gmail, but really that is only one of many changes I&amp;#39;ve made. Sure, my life with email has been simplified for a number of reasons (backups are simpler, labeling makes email more searchable and my laptop is not nearly as busy) and I&amp;#39;m really excited about it, but my switch also encouraged me to investigate more of Google&amp;#39;s offerings.&lt;/p&gt; &lt;p&gt;One item that has really bothered me for quite a while are RSS readers. I&amp;#39;ve used various readers over the years and I&amp;#39;ve never been able to adequately fold them into my daily habits. Every reader I&amp;#39;ve ever used has always required me to explicitly do something to view updated blogs as opposed to simply delivering the news. I want my RSS reader to act like a paperboy, not a newsstand. To my delight - and annoyance - Google Reader works exactly like a paperboy (reliability issues notwithstanding). If I open up Google Reader, all my news appears as a simple list of articles. No searching through feeds for new posts. It&amp;#39;s that simple. What&amp;#39;s the annoying part? Paperboys don&amp;#39;t typically keep the five most recent papers on your doorstep. They keep delivering. It&amp;#39;s up to you to get rid of old papers. In my world, an RSS aggregator should afford me the option of telling the paperboy to discard old news. With current tools, I have to separate my feeds from my news to avoid having 2,714 unread items when I get back from vacation.&lt;/p&gt; &lt;p&gt;Yes, I know many aggregators automatically update and some of them can even give me a view that I can acuatlly digest, but can you get them to show-up next to your unread email and upcoming appointments without scrolling or switching tabs? Using &lt;a href="http://www.google.com/ig?hl=en" target="_blank"&gt;iGoogle&lt;/a&gt;, you can do exactly that with Google Gadgets. Below is a snapshot of my iGoogle page with my Google Calendar, unread Gmail, Google Reader feeds, several news feeds and a few miscellaneous tools.&lt;br /&gt;&lt;a href="http://srtsolutions.com/blogs/darrellhawley/WindowsLiveWriter/SoWhyDidIWaitSoLongtoSwitchtoGmail_A3D1/iGoogle_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="354" alt="iGoogle" src="http://srtsolutions.com/blogs/darrellhawley/WindowsLiveWriter/SoWhyDidIWaitSoLongtoSwitchtoGmail_A3D1/iGoogle_thumb.png" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Wow! The ability to absorb that amount of information in just a few seconds is simply astounding. Did I mention I can sync my phone directly to Google? All this because I decided to give Gmail a serious look. I can&amp;#39;t help but wonder why it took me so long for me so long to switch to Gmail.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3390" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Syncing with Google</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/26/syncing-with-google.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/26/syncing-with-google.aspx</id><published>2008-05-27T02:23:26Z</published><updated>2008-05-27T02:23:26Z</updated><content type="html">After my last post, a couple of people recommended &lt;a href="http://www.codeplex.com/gmobilesync"&gt;GMobileSync&lt;/a&gt;, a tool for synchronizing your Windows Mobile 5/6 device with Google Calendar. Unfortunately for me, since GMobileSync does not address contacts I had to keep looking. After a bit of research, I finally landed on &lt;a href="http://www.goosync.com"&gt;GooSync&lt;/a&gt;. Not only does it sync my Calendar directly to my phone, but also my Contacts, one of my stickiest requirements. It&amp;#39;s not a free service, and maybe even a little steep with a £20 ($40) annual cost. But when all I have to do is click three times (opening the application is two of those clicks) and my Contacts and my Calendar sync, I&amp;#39;m happy. I do have the option of an AutoSync, but I don&amp;#39;t have a data plan and don&amp;#39;t want any surprises on the company phone bill, so I&amp;#39;ll do it via Wi-Fi. It wasn&amp;#39;t completely pain free. My initial import would not import any contacts from Outlook that had the same email address in Google. To get around this, I had to delete all of my contacts out of Google before retrying the import. Of course, by doing this, all the contacts were deleted from my phone during my first GooSync operation, proving that GooSync works (and possibly that I don&amp;#39;t understand synchronization). The problem was quickly resolved after re-importing into Google and a GooSync sync operation. Whew! Thus far, I&amp;#39;m really happy with GooSync though it hasn&amp;#39;t been part of my work life quite yet. That test starts tomorrow. My bigger question is, &amp;quot;will I be OK without email if I don&amp;#39;t have internet access?&amp;quot;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3315" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Gmail - My New Email Client</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/23/gmail-my-new-email-client.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/23/gmail-my-new-email-client.aspx</id><published>2008-05-23T15:14:55Z</published><updated>2008-05-23T15:14:55Z</updated><content type="html">&lt;p&gt;After years as an Outlook user, I&amp;#39;ve finally decided that Gmail is the email solution for me. Why? The biggest reason is because I&amp;#39;m tired of running a very resource-intensive application to perform a relatively simple task. Viewing and responding to email is a basic need, not too different than water. For those of you that have city water, you don&amp;#39;t think about where your water supply is, it simply comes into your home. Of course, to have this luxury you get no control over the water treatment process. I&amp;#39;m good with this. I have too much to think about in my daily life to be concerned about water. Email is the same. If someone has an application that will allow me to &lt;em&gt;not&lt;/em&gt; think about my email delivery system, then I need really need to consider it.&lt;/p&gt; &lt;p&gt;But Gmail&amp;#39;s web-based interface is not the only or even best reason for my switch. Google&amp;#39;s system of organizing your email is a big improvement. Instead of putting your email into one folder or another, you can apply multiple Labels to any single email. Viewing emails with a specific label requires only a single click. Receiving email is no longer an &amp;quot;event&amp;quot; affecting computer performance. Instead, email just magically appears in your inbox. And, of course, searching your email is a snap.&lt;/p&gt; &lt;p&gt;It&amp;#39;s not all roses, however. How do I sync my calendar and my contacts to my phone without Outlook? From what I&amp;#39;ve found, you really can&amp;#39;t. And regardless of the buzz surrounding Web 2.0, RIA, etc., actually writing an email in Outlook is a more pleasant experience than in Gmail.&lt;/p&gt; &lt;p&gt;Of course, I&amp;#39;m still in the honeymoon phase of this switch. Some minor issue that I thought I could live with (syncing comes to mind), may be the pain-point that drives me back to Outlook. Hopefully, that&amp;#39;s a blog post I&amp;#39;m not going to write.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3257" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>IronPython in Toledo</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/16/ironpython-in-toledo.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/16/ironpython-in-toledo.aspx</id><published>2008-05-16T14:27:33Z</published><updated>2008-05-16T14:27:33Z</updated><content type="html">&lt;p&gt;I stopped down in Toledo on Tuesday to talk to the &lt;a href="http://www.nwnug.com/"&gt;Northwest Ohio .NET Usergroup&lt;/a&gt; about IronPython. The talk went well, though the demo gods frowned upon me during my presentation. It all boiled down to adding my Python installtion to my IronPython path.&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;
&lt;p&gt;import sys
sys.path.append(&amp;quot;c:\python25\lib&amp;quot;)
import random&lt;/p&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;I kept getting a TypeError exception which I had not seen while building my demos. As it turns out, the reason I had not seen them was because I had been running them via Visual Studio using Ctrl+F5 (Start without Debugging) effectively masking the exception. During the demo, I was simply hitting F5 which of course displayed my dirty laundry for all to see. This doesn&amp;#39;t solve the problem but certainly explains the behavior change. Though I&amp;#39;m not absolutely sure what the root cause is, I&amp;#39;m almost certain the problem is that I was trying to get code written for CPython to run inside IronPython. This definitely merits a bit more research.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3201" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Project Euler Problem Number 3</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/02/project-euler-problem-number-3.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/05/02/project-euler-problem-number-3.aspx</id><published>2008-05-02T14:35:29Z</published><updated>2008-05-02T14:35:29Z</updated><content type="html">&lt;p&gt;Project Euler problem 3 reads as follows:&lt;/p&gt; &lt;blockquote&gt;The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?&lt;/blockquote&gt; &lt;p&gt;There are no special Python features here that really require explaining. The logic is also straightforward: find the smallest prime that divides evenly into &amp;quot;number&amp;quot;; reset &amp;quot;number&amp;quot; to number/prime; if prime is greater than the square root of number, you have your answer. Solution works in both Python and IronPython.&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;def GetNextPrime(allPrimes):
    &amp;quot;&amp;quot;&amp;quot;Given a sequential list of prime numbers, return 
    the next prime number
    &amp;quot;&amp;quot;&amp;quot;
    value = allPrimes[-1]
    if value == 2:
        return 3
    
    while True:
        value += 2
        for prime in allPrimes:
            if value % prime == 0:
                break;
        else:
            return value

def Euler003(number = 600851475143):
    # import the square root function, seed the primes list
    # and determine what
    # the largest possible factor
    from math import sqrt
    primes = [2,3]
    limit = sqrt(number)
    
    # if the last prime number exceeds our limit, we&amp;#39;re out
    while primes[-1] &amp;lt;= limit:
        for prime in primes:
            if number == prime:
                # if the prime and the number are the same, 
                # we&amp;#39;ve found our answer. break out of
                # the loop
                return number
            elif number % prime == 0:
                # number isn&amp;#39;t prime! largest prime factor
                # will be in number/prime.
                number /= prime
                limit = sqrt(number)
                break
        else:
            # still didn&amp;#39;t find number % prime == 0? Maybe
            # we need bigger prime numbers
            while primes[-1] &amp;lt;= limit:
                # get next prime number
                primes.append(GetNextPrime(primes))
                # if number is divisible by next prime number
                if number % primes[-1] == 0:
                    if number == primes[-1]:
                        break
                    number /= primes[-1]
                    limit = sqrt(number)
                    break
    return number

print Euler003()&lt;/pre&gt;&lt;/blockquote&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3056" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author><category term="euler" scheme="http://srtsolutions.com/blogs/darrellhawley/archive/tags/euler/default.aspx" /><category term="python" scheme="http://srtsolutions.com/blogs/darrellhawley/archive/tags/python/default.aspx" /></entry><entry><title>Central Ohio Day of .NET and What I Wish I Said</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/04/28/central-ohio-day-of-net-and-what-i-wish-i-said.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/04/28/central-ohio-day-of-net-and-what-i-wish-i-said.aspx</id><published>2008-04-28T14:36:25Z</published><updated>2008-04-28T14:36:25Z</updated><content type="html">&lt;p&gt;&lt;em&gt;for additional comments on this post, see &lt;/em&gt;&lt;a title="http://www.darrellhawley.com/2008/04/central-ohio-day-of-net-and-what-i-wish.html" href="http://www.darrellhawley.com/2008/04/central-ohio-day-of-net-and-what-i-wish.html"&gt;&lt;em&gt;http://www.darrellhawley.com/2008/04/central-ohio-day-of-net-and-what-i-wish.html&lt;/em&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;First off, the Central Ohio Day of .NET last Saturday (better late than never, right) was a very well done conference as expected. Hats off to &lt;a href="http://www.mvwood.com/blogs/blog/default.aspx"&gt;Mike Wood&lt;/a&gt;, Carey Payette and &lt;a href="http://frazzleddad.blogspot.com/"&gt;Jim Holmes&lt;/a&gt; (in reverse alphabetical order) for all the hard work they did. Events are NOT easy. For a recap - and a reason to attend/support next years event - check out &lt;a href="http://cincinnatirecruiter.wordpress.com/2008/04/22/central-ohio-day-of-net-2008/"&gt;this video&lt;/a&gt; by &lt;a href="http://cincinnatirecruiter.wordpress.com/"&gt;Andy Erickson&lt;/a&gt;. Nice work, Andy!&lt;/p&gt; &lt;p&gt;Once specific thing I&amp;#39;d like to point out about the sessions, was the relatively large number of talks on alternative languages (one session, &lt;a href="http://cinnug.org/cododn/sessions.aspx#Why_Ruby"&gt;Why Ruby?&lt;/a&gt; by &lt;a href="http://objo.com/"&gt;Joe O&amp;#39;Brien&lt;/a&gt;, wasn&amp;#39;t even specific to .NET). Though it&amp;#39;s really refreshing to see sessions that aren&amp;#39;t C# or VB.NET, I wonder what talks are going to look like in another 5 years. Will C# still be the default language for demonstrating new tools or will a DLR-based language (VB.NET, IronPython, IronRuby, etc) or F# be equally as dominant? Hmmmm...&lt;/p&gt; &lt;p&gt;I&amp;#39;m rambling.&lt;/p&gt; &lt;p&gt;After my introductory talk on &lt;a href="http://cinnug.org/cododn/sessions.aspx#Looking_out_for_IronPython"&gt;IronPython&lt;/a&gt;, I started thinking about a lot of things I wish I had said or demonstrated. Of course, I don&amp;#39;t know how I was going to cram more stuff into the allotted one hour and 10 minutes but nonetheless, here is the list of &amp;quot;Things I Wish I Said and Did&amp;quot;:&lt;/p&gt; &lt;ul&gt; &lt;ul&gt; &lt;li&gt;I didn&amp;#39;t explore an IronPython executable or library with Reflector. When you do, the first thing you notice is that there is SIGNIFICANTLY more code with an IP app than with a similar C# app. This would have made for a nice discussion on choosing the right language for a given job.  &lt;li&gt;I didn&amp;#39;t spend enough time on the functional portion of Python. I did gave an example using the map() function and I did a bit with reduce(), but I didn&amp;#39;t have a lambda or filter() example prepared.  &lt;li&gt;Did I forget to mention that IronPython 2 is targeting .NET 2.0? Yup, I did. Kind of important if you were going to try to use Linq with IP.  &lt;li&gt;What about the standard libraries? Python is known as a &amp;quot;batteries included&amp;quot; language, but how would you understand that if I didn&amp;#39;t show you the libraries?&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;I know there are a couple of more items that I&amp;#39;m just forgetting at the moment, but this list discusses some big ones. Hopefully, my next talk will give me some more time.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3012" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author></entry><entry><title>Project Euler Problem 2</title><link rel="alternate" type="text/html" href="http://srtsolutions.com/blogs/darrellhawley/archive/2008/04/12/project-euler-problem-2.aspx" /><id>http://srtsolutions.com/blogs/darrellhawley/archive/2008/04/12/project-euler-problem-2.aspx</id><published>2008-04-12T13:02:04Z</published><updated>2008-04-12T13:02:04Z</updated><content type="html">&lt;p&gt;Problem number 2 reads &amp;quot;Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million.&amp;quot; The resolution to this problem is not quite as simple as the previous one, but it&amp;#39;s not far off.&lt;/p&gt; &lt;blockquote&gt;&lt;pre&gt;def fib(maxFibNumber):
    a, b = 0, 1
    while a &amp;lt; maxFibNumber:
        if (a % 2 == 0):
            yield a
        a, b = b, a + b

print sum([x for x in fib(4000000)])&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;This time we can&amp;#39;t rely entirely on list comprehension for the answer. We have to define the fib(maxfibnumber) function that will calculate our Fibonacci sequence and return only even those that are even. I modified a Fibonacci function I found at &lt;a href="http://en.literateprograms.org/Fibonacci_numbers_(Python)"&gt;literateprograms.org&lt;/a&gt; to do the job. I have to mention one of the little niceties that makes Python so useable: multiple assignment. Multiple assignment describes the technique of assigning - *binding* in Python - two variables simultaneously. We bind &amp;quot;a&amp;quot; and &amp;quot;b&amp;quot; as soon as we enter the &amp;quot;fib&amp;quot; function and then rebind them at the end of the while loop. This is just another way Python can help us with a simple programming idiom.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=2749" width="1" height="1"&gt;</content><author><name>dhawley</name><uri>http://srtsolutions.com/members/dhawley.aspx</uri></author><category term="euler" scheme="http://srtsolutions.com/blogs/darrellhawley/archive/tags/euler/default.aspx" /><category term="python" scheme="http://srtsolutions.com/blogs/darrellhawley/archive/tags/python/default.aspx" /></entry></feed>