<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://srtsolutions.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>SRT Solutions</title><link>http://srtsolutions.com/blogs/</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Monthly user group meetings this week!</title><link>http://srtsolutions.com/blogs/diannemarsh/archive/2008/08/05/monthly-user-group-meetings-this-week.aspx</link><pubDate>Wed, 06 Aug 2008 02:47:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4171</guid><dc:creator>dmarsh</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It&amp;#39;s the first full week of the month.&amp;nbsp; Hoping I&amp;#39;m able to get away for some user group meetings.&lt;/p&gt;&lt;p&gt;On Wednesday August 6, AACS (&lt;a href="http://www.computersociety.org"&gt;Ann Arbor Computer Society&lt;/a&gt;) has Eric Inancich discussing Ruby and Domain Specific Languages.&amp;nbsp; The meeting starts at 6.&amp;nbsp; Pizza will be provided by AACS, free of charge.&amp;nbsp; The meeting&amp;#39;s free too, but door prizes only go to paid-up members (note to self: remember to take $20 for annual membership).&amp;nbsp; AACS usually gives out gift certificates.&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;On Thursday August 7, the &lt;a href="http://groups.google.com/group/MichiPUG"&gt;Michigan Python User Group&lt;/a&gt; (MichiPUG) will be discussing the state of &lt;a href="http://turbogears.org/"&gt;Turbo Gears&lt;/a&gt; 2.&amp;nbsp; Created in Ann Arbor by local Kevin Dangoor, another local (Mark Ramm) has taken over maintenance of the TG2 project.&amp;nbsp; Both are very knowledgeable and it&amp;#39;s always interesting to hear where the project is, and where it&amp;#39;s going.&amp;nbsp; MichiPUG starts at 7. &lt;/p&gt;&lt;p&gt;Both meetings are at SRT Solutions, 206 S. Fifth Ave., Suite 200, Ann Arbor, MI 48104 and are free and open to the public. Hope to see you at a meeting or two. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4171" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Ruby+on+Rails/default.aspx">Ruby on Rails</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Python/default.aspx">Python</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Ann+Arbor+Computer+Society/default.aspx">Ann Arbor Computer Society</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/MichiPug/default.aspx">MichiPug</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Ann+Arbor+events/default.aspx">Ann Arbor events</category></item><item><title>ZedGraph for 2D Plotting</title><link>http://srtsolutions.com/blogs/annemarsan/archive/2008/08/01/zedgraph-for-2d-plotting.aspx</link><pubDate>Fri, 01 Aug 2008 18:42:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4114</guid><dc:creator>amarsan</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Previously I wrote about choosing ZedGraph as my graphing tool in a C#.Net project for a client. Today I&amp;#39;d like to give an update on how it&amp;#39;s going. I have been very pleased with this graphing library, and it has been relatively straightforward to figure out how to make it do what I want it to do.  &lt;/p&gt;&lt;p&gt;I&amp;#39;m plotting X-Y data that represents the shape of an airfoil on a 2D plot with grid lines, axes, and axes labels. One of my main concerns was having the ability to force the scales of the X and Y axes to be the same value. If they are locked, my plot will show the airfoil with the right proportions. If not, the airfoil appears to be a lot fatter than it really is.  &lt;/p&gt;&lt;p&gt;Figure 1. Airfoil with axis scales locked  &lt;/p&gt;&lt;h3&gt;&lt;/h3&gt; &lt;p&gt;&lt;a href="http://srtsolutions.com/blogs/annemarsan/WindowsLiveWriter/ZedGraphfor2DPlotting_A980/airfoil_with_axes_locked_2.gif"&gt;&lt;img src="http://srtsolutions.com/blogs/annemarsan/WindowsLiveWriter/ZedGraphfor2DPlotting_A980/airfoil_with_axes_locked_thumb.gif" style="border-width:0px;" alt="airfoil_with_axes_locked" border="0" height="412" width="644" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Figure 2. Airfoil with axis scales determined independently of one another  &lt;/p&gt;&lt;p&gt;&lt;a href="http://srtsolutions.com/blogs/annemarsan/WindowsLiveWriter/ZedGraphfor2DPlotting_A980/airfoil_with_axes_unlocked_2.gif"&gt;&lt;img src="http://srtsolutions.com/blogs/annemarsan/WindowsLiveWriter/ZedGraphfor2DPlotting_A980/airfoil_with_axes_unlocked_thumb.gif" style="border-width:0px;" alt="airfoil_with_axes_unlocked" border="0" height="412" width="644" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;The ZedGraph library comes with a ZedGraph control, which contains of a collection of one or more GraphPane objects. The GraphPane holds all of the plotting information for a single plot, including settings and options in addition to the actual plotting data. For my particular problem I only need one GraphPane, which is the default. My first step is to initialize my GraphPane object.&lt;/p&gt; &lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;span&gt;public&lt;/span&gt; MainForm()&lt;br /&gt;{&lt;br /&gt;    InitializeComponent();&lt;br /&gt;&lt;br /&gt;     &lt;span&gt;// Initialize ZedGraph&lt;/span&gt;&lt;br /&gt;    GraphPane graphPane = zedGraphControl1.GraphPane;&lt;br /&gt;    graphPane.XAxis.Title.Text = &lt;span&gt;&amp;quot;Chord&amp;quot;&lt;/span&gt;;&lt;br /&gt;    graphPane.YAxis.Title.Text = &lt;span&gt;&amp;quot;Thickness&amp;quot;&lt;/span&gt;;&lt;br /&gt;    graphPane.XAxis.MajorGrid.IsVisible = &lt;span&gt;true&lt;/span&gt;;&lt;br /&gt;    graphPane.YAxis.MajorGrid.IsVisible = &lt;span&gt;true&lt;/span&gt;;&lt;br /&gt;    graphPane.Legend.IsVisible = &lt;span&gt;false&lt;/span&gt;;&lt;br /&gt;    graphPane.Title.IsVisible = &lt;span&gt;false&lt;/span&gt;;&lt;br /&gt;    &lt;span&gt;//graphPane.Title.Text = &amp;quot;ZedGraph&amp;quot;;&lt;/span&gt;&lt;br /&gt;    zedGraphControl1.Resize += &lt;span&gt;new&lt;/span&gt; System.EventHandler(this.zedGraphControl1_Resize);    &lt;br /&gt;    graphPane.AxisChangeEvent += &lt;span&gt;new&lt;/span&gt; GraphPane.AxisChangeEventHandler(graphPane_AxisChangeEvent);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The key here is the last line of initialization, where I add an event handler for the AxisChangeEvent. This event is invoked by calling the AxisChange() method in the ZedGraphControl object. One generally calls this method whenever new plotting data is added to a GraphPane; it takes care of adjusting the minimum and maximum axes values and the grid spacing. AxisChangeEvents are also generated whenever the user zooms or pans a GraphPane. It is not invoked, however, when the user resizes the ZedGraphControl, so I added an event handler for the Resize event that calls the AxisChange() method. The Resize event handler looks like this:&lt;/p&gt;
&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; zedGraphControl1_Resize(&lt;span&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    zedGraphControl1.AxisChange();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The AxisChange event handler is called after the the ZedGraphControl has recomputed the minimum and maximum axis values and the grid spacing. It adjusts the minimum and maximum values so that the scale in the X and Y directions are equal, and then it recomputes the grid spacing to ensure that the grid does not have too many or too few lines.&lt;/p&gt;
&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;&lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; graphPane_AxisChangeEvent(GraphPane target)&lt;br /&gt;{&lt;br /&gt;    GraphPane graphPane = zedGraphControl1.GraphPane;&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;// Correct the scale so that the two axes are 1:1 aspect ratio&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;double&lt;/span&gt; scalex2 = (graphPane.XAxis.Scale.Max - graphPane.XAxis.Scale.Min) / graphPane.Rect.Width;&lt;br /&gt;    &lt;span&gt;double&lt;/span&gt; scaley2 = (graphPane.YAxis.Scale.Max - graphPane.YAxis.Scale.Min) / graphPane.Rect.Height;&lt;br /&gt;    &lt;span&gt;if&lt;/span&gt; (scalex2 &amp;gt; scaley2)&lt;br /&gt;    {&lt;br /&gt;        &lt;span&gt;double&lt;/span&gt; diff = graphPane.YAxis.Scale.Max - graphPane.YAxis.Scale.Min;&lt;br /&gt;        &lt;span&gt;double&lt;/span&gt; new_diff = graphPane.Rect.Height * scalex2;&lt;br /&gt;        graphPane.YAxis.Scale.Min -= (new_diff - diff) / 2.0;&lt;br /&gt;        graphPane.YAxis.Scale.Max += (new_diff - diff) / 2.0;&lt;br /&gt;    }&lt;br /&gt;    &lt;span&gt;else&lt;/span&gt; &lt;span&gt;if&lt;/span&gt; (scaley2 &amp;gt; scalex2)&lt;br /&gt;    {&lt;br /&gt;        &lt;span&gt;double&lt;/span&gt; diff = graphPane.XAxis.Scale.Max - graphPane.XAxis.Scale.Min;&lt;br /&gt;        &lt;span&gt;double&lt;/span&gt; new_diff = graphPane.Rect.Width * scaley2;&lt;br /&gt;        graphPane.XAxis.Scale.Min -= (new_diff - diff) / 2.0;&lt;br /&gt;        graphPane.XAxis.Scale.Max += (new_diff - diff) / 2.0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;// Recompute the grid lines&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;float&lt;/span&gt; scaleFactor = graphPane.CalcScaleFactor();&lt;br /&gt;    Graphics g = zedGraphControl1.CreateGraphics();&lt;br /&gt;    graphPane.XAxis.Scale.PickScale(graphPane, g, scaleFactor);&lt;br /&gt;    graphPane.YAxis.Scale.PickScale(graphPane, g, scaleFactor);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Having the ZedGraph source control was extremely useful in figuring all of this out, particularly for resizing the grid after I have adjust the minimum and maximum axes values. In the end, I did not need to modify any of the ZedGraph source code, but because it is fairly clean and readable, I was able to use it in place of documentation when I needed more explanation than what was provided in the basic tutorial and class descriptions. &lt;/p&gt;
&lt;p&gt;So I still feel good about ZedGraph, and my customer is happy, too!&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4114" width="1" height="1"&gt;</description></item><item><title>Need a Break? Got a few seconds? A "one URL" post</title><link>http://srtsolutions.com/blogs/annejackson/archive/2008/07/31/got-a-few-seconds-a-one-url-post.aspx</link><pubDate>Thu, 31 Jul 2008 16:15:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4103</guid><dc:creator>ajackson</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is a one URL blog. I&amp;#39;m not lazy this week, but I am busy. Busy at work and in my personal life. Sounds familiar, I bet.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;My former colleague at &lt;a href="http://www.sungard.com" target="_blank"&gt;SunGard&lt;/a&gt; sent this link to me. Glad she did. She never sends junk.&lt;/p&gt;&lt;p&gt;I love fonts, as we call them now. Typefaces. This little gem of a clip will put characters and a plot to the typefaces you know and love (or hate). It&amp;#39;s definitely worth a look and a laugh when you have time and just wanna watch a video.&lt;/p&gt;&lt;p&gt;Go &lt;a href="http://www.collegehumor.com/video:1823766" target="_blank"&gt;here&lt;/a&gt; and have fun!&lt;br /&gt;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4103" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/annejackson/archive/tags/video/default.aspx">video</category><category domain="http://srtsolutions.com/blogs/annejackson/archive/tags/humor/default.aspx">humor</category><category domain="http://srtsolutions.com/blogs/annejackson/archive/tags/typefaces/default.aspx">typefaces</category></item><item><title>Lessons from Project Management in the Physical World</title><link>http://srtsolutions.com/blogs/darrellhawley/archive/2008/07/30/lessons-from-project-management-in-the-physical-world.aspx</link><pubDate>Thu, 31 Jul 2008 03:27:31 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4095</guid><dc:creator>dhawley</dc:creator><slash:comments>1</slash:comments><description>&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;</description></item><item><title>Vacation Fun: Deciding on a Media Center Solution (part 1)</title><link>http://srtsolutions.com/blogs/chrismarinos/archive/2008/07/29/vacation-fun-deciding-on-a-media-center-solution-part-1.aspx</link><pubDate>Tue, 29 Jul 2008 04:11:02 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4072</guid><dc:creator>cmarinos</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;For a year or so now, I have been thinking about setting up some sort of media center for my home theater.&amp;nbsp; After looking at a few different options, I decided to try setting up my Xbox 360 as my media center hub while I was on vacation the past few days.&amp;nbsp; Read on to see how everything worked out. &lt;h4&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;&lt;strong&gt;Goals &lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;My ideal solution to my media center &amp;quot;problem&amp;quot; had to solve these problems:&lt;/p&gt; &lt;p&gt;&lt;br /&gt;1) Ripping of all of my DVDs to my desktop PC (without compression).&lt;/p&gt; &lt;p&gt;2) Streaming of these ripped DVDs as well as my music from my desktop for playback on my home theater.&lt;/p&gt; &lt;p&gt;3) Playback of all media quickly and without a drop in quality (5.1 sound for audio, no quality loss from compression for video, etc.)&lt;/p&gt; &lt;p&gt;4) Cost effectiveness (read: free)&lt;/p&gt; &lt;p&gt;5) Not interfering with my day to day computer usage.&amp;nbsp; I run Ubuntu Linux as my primary OS at home, so any programs for my PC would have to run in Linux.&lt;/p&gt; &lt;p&gt;6) Playback of High Definition content. (optional)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4&gt;&lt;strong&gt;Step 1 - DVD Ripping &lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;I played around with a few different methods of DVD ripping before finally settling on &lt;a href="http://www.softpedia.com/get/CD-DVD-Tools/CD-DVD-Rip-Other-Tools/DVD-Shrink.shtml"&gt;DVD Shrink&lt;/a&gt;.&amp;nbsp; My goal was to be able to rip DVDs from my Linux desktop, but I ran into a few problems, so I gave up and took the easy way out.&amp;nbsp; Unfortunately, the &amp;quot;easy way out&amp;quot; was to install a &lt;a href="http://www.virtualbox.org/"&gt;virtual machine&lt;/a&gt; running Vista, install DVD Shrink, rip the DVD and send it back to a shared drive on my host machine (this process was a blog post in itself).  &lt;p&gt;I set everything up so that the result was a single .vob file for each item on the DVD (eg. main movie, special features).&amp;nbsp; So far so good.&amp;nbsp; High quality DVD rips- check. &lt;h4&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;&lt;strong&gt;Step 2 - Setup the Media Server&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;Once I got a movie stored on my server machine, it was time to setup a server to enable streaming to my 360.&amp;nbsp; There were a few Windows-based ways to do this (it looks like &lt;a href="http://tversity.com/"&gt;Tversity&lt;/a&gt; was the favorite), but I definitely wanted to do this in Linux since running a windows VM all the time is too resource intensive.&amp;nbsp; I tried out a couple programs to do this.&amp;nbsp; First up was &lt;a href="http://ushare.geexbox.org/"&gt;uShare&lt;/a&gt;.  &lt;p&gt;uShare is a &lt;a href="http://en.wikipedia.org/wiki/Universal_Plug_and_Play"&gt;UPnP&lt;/a&gt; server that is light on features, but light on setup.&amp;nbsp; It was fairly painless to setup (it installs right from the Ubuntu repositories), but I immediately ran into some problems.&amp;nbsp; First, the 360 does not support a lot of video formats, and somewhat surprisingly, .vob files with&amp;nbsp; MPEG-2 were not supported.&amp;nbsp; Furthermore, uShare did not read the tags for audio files or specify the type of any file, so my media was a MESS when viewed from my 360.&amp;nbsp; My images would show up under both the &amp;quot;video&amp;quot; and &amp;quot;music&amp;quot; sections, and some movies would &lt;em&gt;only&lt;/em&gt; show up under &amp;quot;music&amp;quot;.&amp;nbsp; Lastly, since my .vob files were not playable by the 360, I needed something that could transcode them as they were streaming (I don&amp;#39;t want to have to transcode every single DVD that I rip).&amp;nbsp; Clearly uShare was not the right choice. &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp; &lt;h4&gt;&lt;strong&gt;Step 2.1 - Setup the Media Server with Transcoding on the Fly and Improved Categorizing Features&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;There were a few Linux compatible UPnP server programs that I researched to accomplish this. &lt;p&gt;First up was &lt;a href="http://mediatomb.cc/pages/download"&gt;MediaTomb&lt;/a&gt;.&amp;nbsp; Although it did not support the 360 due to the 360&amp;#39;s funky Windows Media Center-crippled UPnP support, it was a breeze to setup.&amp;nbsp; Although the UI was pretty clunky it seemed like a decent program for anyone with a compatible UPnP player (like a PS3). &lt;p&gt;Next was &lt;a href="http://www.twonkyvision.de/"&gt;TwonkyMedia&lt;/a&gt;.&amp;nbsp; I didn&amp;#39;t evaluate this program because it costs money to use beyond a 30 day trial, and the trial wouldn&amp;#39;t install properly on my machine.&amp;nbsp; This is too bad, since I did read good things about it. &lt;p&gt;&amp;nbsp; &lt;p&gt;Finally I decided to try &lt;a href="http://fuppes.ulrich-voelkel.de/"&gt;Fuppes&lt;/a&gt;.&amp;nbsp; Although, I had to compile it from source, Fuppes had the honor of being one of the very few open source projects that actually built and installed without any errors or hiccups whatsoever.&amp;nbsp; Very big kudos, and a nice way to start off.&amp;nbsp; Configuration for Fuppes was straightforward (I followed &lt;a href="http://ubuntuforums.org/showthread.php?t=597650"&gt;this&lt;/a&gt; guide) except for one minor problem.&amp;nbsp; It turns out that you really do have to specify the port number and network interface in the &amp;quot;network&amp;quot; section of the config file or the 360 won&amp;#39;t find your Fuppes server.&amp;nbsp; Aside from that, things worked pretty well once I got everything configured.&amp;nbsp; Music was sorted by artist and album (once I built with taglib installed), and everything seemed to be organized much better.&amp;nbsp; I could stream my .mp3s without a hitch, and my xvid encoded .avi files played great as well.&amp;nbsp; Unfortunately, I still had some tinkering to do with my mpeg-2 encoded .vob files... &lt;p&gt;I tried out a few different codecs for transcoding my .vob files on the fly, but I was consistently rewarded with &amp;quot;unsupported format&amp;quot; errors from my 360.&amp;nbsp; Finally, I realized that my 360 would ONLY play xvid encoded .avis with a mime type of video/x-ms-wmv.&amp;nbsp; Fun.&amp;nbsp; Unfortunately, Fuppes only supported on the fly transcoding using &lt;a href="http://ffmpeg.mplayerhq.hu/"&gt;ffmpeg&lt;/a&gt; which did not seem to support encoding to xvid.&amp;nbsp; Crap.&amp;nbsp; Scratch one night of tinkering until dawn. &lt;p&gt;As a last ditch effort, I tried hacking on the Fuppes source to get it to use &lt;a href="http://en.wikipedia.org/wiki/Mencode"&gt;mencoder&lt;/a&gt; to do the transcoding to xvid instead of ffmpeg.&amp;nbsp; Surprisingly, my hack actually worked on the &lt;strike&gt;first&lt;/strike&gt; second compile.&amp;nbsp; What didn&amp;#39;t work was the 360 playing the file as it was transcoding.&amp;nbsp; As soon as I stopped mencoder from transcoding the file, it would play the partially converted file, but it simply refused to play the thing when mencoder was still working it&amp;#39;s magic.&amp;nbsp; Scratch one weekend of tinkering. &lt;p&gt;&amp;nbsp; &lt;h4&gt;&lt;strong&gt;Conclusion - Temporary Defeat&lt;/strong&gt;&lt;/h4&gt; &lt;p&gt;Although I learned way more than I though I would need to about video encoding, and the 360&amp;#39;s UPnP support, I did not accomplish my goal.&amp;nbsp; I &lt;em&gt;could &lt;/em&gt;just transcode my MPEG-2 ripped .vob files into xvid .avi files, but the encoding process is time intensive, and the 360s interface and UPnP support leave something to be desired for a media center.&amp;nbsp; The 360 just does not seem like a great solution for my media center needs at this time.&amp;nbsp; Next up, it looks like I will probably be taking a look at installing &lt;a href="http://xbmc.org/"&gt;XBMC&lt;/a&gt; on an original Xbox.&amp;nbsp; We&amp;#39;ll see how that goes soon!&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4072" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/chrismarinos/archive/tags/Media+Center/default.aspx">Media Center</category><category domain="http://srtsolutions.com/blogs/chrismarinos/archive/tags/Xbox+360/default.aspx">Xbox 360</category></item><item><title>This is all Seth Godin's fault</title><link>http://srtsolutions.com/blogs/billwagner/archive/2008/07/28/this-is-all-seth-godin-s-fault.aspx</link><pubDate>Mon, 28 Jul 2008 22:19:14 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4066</guid><dc:creator>wwagner</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Or, what I think about the Alt.Net Vote of No Confidence on the Entity Framework.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Almost a month ago, some folks post the &lt;a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/" target="_blank"&gt;Entity Framework Vote of No Confidence&lt;/a&gt; petition.&amp;nbsp; I didn&amp;#39;t say anything at that time for a few reasons: I was on vacation, something that controversial requires a thoughtful response, and I wanted to wait for the predictable firestorm to die down.&lt;/p&gt; &lt;p&gt;Last week, the &lt;a href="http://altnetpodcast.com/episodes/8-vote-of-no-confidence" target="_blank"&gt;Alt.Net podcast&lt;/a&gt; featured Ward Bell and Jeremy Miller discussing, among other things, the petition. It&amp;#39;s well worth a listen. For one, the length of the show, almost 44 minutes of content, gives enough space for Ward and Jeremy to go into much more detail about each of the points in the petition. Regardless of how you felt when you first saw the petition, you&amp;#39;ll find yourself nodding in agreement at many of their points.&lt;/p&gt; &lt;p&gt;That&amp;#39;s why I chose this title for this blog post. Seth Godin is great at marketing and getting attention. He preaches (among other things) to make a big splash when you want to make a point: knock your audience far out of their comfort zone immediately; it makes them much more reachable.&lt;/p&gt; &lt;p&gt;That works great for marketing, but it&amp;#39;s lousy as a technical argument.&lt;/p&gt; &lt;p&gt;For the record, I agree with every technical point in the Entity Framework petition. It&amp;#39;s v1 software, and it shows a long history of the &amp;#39;everything is a table in a database&amp;#39; design philosophy that plagues almost all data access libraries. From that assumption several decisions are clear:&amp;nbsp; You won&amp;#39;t want to test without attaching to a database. Your data is model a set of tables and relations. All your entities are coming from and stored back into a relational database. What else is there? (If you don&amp;#39;t fit that model, EF isn&amp;#39;t for you). &lt;/p&gt; &lt;p&gt;This data-centric view is difficult to reconcile with modern agile and object oriented principles. It&amp;#39;s no surprise that EF (v1) failed to deliver on the promise of bridging the gap between an arbitrary storage model and a in-memory object model. That to me is the biggest failing with EF, as it exists today. If I start with a business problem, my first reaction isn&amp;#39;t &amp;quot;Let&amp;#39;s go design the database&amp;quot;. It&amp;#39;s &amp;quot;Let&amp;#39;s build some scenarios.&amp;quot; Those scenarios will start to reveal some objects that need both behavior and persistent storage. That persistent storage will be designed, but it will also evolve over several sprints. Some sprints will be about normalizing the data store, if a relational data store is the right answer. Those sprints shouldn&amp;#39;t have a huge impact on the other layers. Unfortunately, nothing in the current Entity Framework helps me work that way. They expect, or even demand, that an existing database schema (and probably even sample data) exists. Northwind anyone?&amp;nbsp; AdventureWorks?&lt;/p&gt; &lt;p&gt;But, a signed petition calling it a &amp;#39;vote of no confidence&amp;#39; is obviously an attention grabber.&amp;nbsp; It clearly grabbed attention. We don&amp;#39;t yet know if it achieved the desired result. The EF team is clearly going to make some changes, but the open question is whether those changes will be what the signatories want, or a different direction, attempting to prove that the signatories had the wrong idea about what EF should be.&lt;/p&gt; &lt;p&gt;As for me, I&amp;#39;d much prefer that MS spent more time producing a library that enabled developers to write their own IQueryProvider implementations for specific vertical scenarios.&amp;nbsp; &lt;a href="http://blogs.msdn.com/mattwar/archive/2008/07/14/linq-building-an-iqueryable-provider-part-xi.aspx" target="_blank"&gt;Matt Warren&lt;/a&gt; has written quite a few blog posts discussing the design, and some of the implementation for the IQueryProvider used by LINQ to SQL. Read those articles, and you&amp;#39;ll get a feel for just how much work this is. You&amp;#39;ll also get a good feel for how much of the code is common code to visit nodes and parse expressions. I&amp;#39;d really prefer seeing those common algorithms exposed for the rest of us. That would go a long way toward many different application types: data in the cloud, data in other blogs, data in almost anything but a relational structures in a database.&amp;nbsp; From that standpoint, Entity Framework is an evolutionary dead end no matter what they add.&lt;/p&gt; &lt;p&gt;LINQ to Live Mesh anyone? Or even more powerful:&amp;nbsp; LINQ to &amp;lt;your data stored on LiveMesh&amp;gt;...&lt;/p&gt; &lt;p&gt;To close, yes, I&amp;#39;ve got issues with the Entity Framework design. yes, all the technical arguments in the vote of no confidence are valid. But, that&amp;#39;s not they way I want technical debates to proceed. It gives me visions of glib people spouting nonsense to make a point, not technologists discussing the merits of their work. Our work environments would be much better with more of the latter.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4066" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/Me/default.aspx">Me</category><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/.NET+General/default.aspx">.NET General</category></item><item><title>Euler Problem #14</title><link>http://srtsolutions.com/blogs/annemarsan/archive/2008/07/24/euler-problem-14.aspx</link><pubDate>Thu, 24 Jul 2008 23:34:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4015</guid><dc:creator>amarsan</dc:creator><slash:comments>2</slash:comments><description>
   
   


   

&lt;p&gt;I&amp;#39;m on
  vacation this week in northern Michigan, enjoying the good weather
  and time with my family, and also reading quite a bit, including a
  book called &lt;i&gt;Beautiful Code&lt;/i&gt; published by O&amp;#39;Reilly (more about
  that in another post). One chapter in particular got me fired up to
  revisit Euler Problem 14, which I started to work on back in May,
  but got stuck and have been thinking about it ever since.&lt;/p&gt;

&lt;p&gt;The problem goes like this:&lt;/p&gt;

&lt;div style="margin:10px;"&gt;The following iterative sequence is defined for the set of positive integers:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;
n -&amp;gt; n/2 (n is even)&lt;br /&gt;
n -&amp;gt; 3n + 1 (n is odd)&lt;br /&gt;
&lt;p&gt;Using the rule above and starting with 13, we generate the following sequence:&lt;br /&gt;
13 40 20 10 5 16 8 4 2 1&lt;/p&gt;
&lt;p&gt;It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it
is thought that all starting numbers finish at 1.&lt;/p&gt;
&lt;p&gt;Which starting number, under one million, produces the longest chain?&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;I&amp;#39;m solving the Euler problems in Matlab, and I&amp;#39;m working on a 867 MHz Mac
  PowerBook G4. Sometimes I also limit myself to the time it takes to
  drain the battery, just so that I don&amp;#39;t end up spending days and
  days solving a problem (I have to work once in awhile, and my kids
  get upset if I ignore them too much :). So my goal is generally to
  come up with a fast solution, which in most cases rules out brute
  force.&lt;/p&gt;

&lt;p&gt;With these goals in mind, I thought and thought and thought and
  thought about this problem, trying to come up with a trick that
  would allow me to rule out most numbers between 1 and 1,000,000. The
  most obvious thing to try is only the odd numbers. But I wanted to
  winnow down my search set even further. Not coming up with anything,
  I gave up and abandoned Euler problems altogether. I had plenty of
  other things to work on. But this problem kept gnawing at the edges
  of my brain.&lt;/p&gt;

&lt;p&gt;With so many problems in life, sometimes it&amp;#39;s best to stop
  thinking and start doing. So finally this week I threw in the towel
  and wrote some code to do a brute force search on all odd
  numbers. It definitely occured to me that once a sequence has been
  generated for a number, when that number shows up in a subsequent
  sequence I should reuse what has already been computed. But I got
  hung up in figuring out how big I should preallocate my array to
  store the sequence count for each integer, so I even left off that. I
  just wrote a loop that computes the sequence for every number.&lt;/p&gt;

&lt;p&gt;Imagine my surprise when it took only about 15 or 20 minutes to
  run!&lt;/p&gt;

&lt;p&gt;Sometimes brute force isn&amp;#39;t so bad. Sometimes the only way to know
  is to try it.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s my code:&lt;/p&gt; 

      &lt;div class="content" style="background-color:white;font-family:monospace;font-size:medium;"&gt;&lt;pre class="codeinput"&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; euler14

max_count = 0;
max_nn = 1;
&lt;span class="keyword"&gt;for&lt;/span&gt; nn = 3:2:1000000

    new_nn = nn;
    count = 0;

    &lt;span class="keyword"&gt;while&lt;/span&gt; new_nn ~= 1
        &lt;span class="keyword"&gt;if&lt;/span&gt; mod(new_nn,2) == 0
            new_nn = new_nn/2;
        &lt;span class="keyword"&gt;else&lt;/span&gt;
            new_nn = new_nn*3+1;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
        count = count + 1;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;if&lt;/span&gt; count &amp;gt; max_count
        max_count = count;
        max_nn = nn;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    disp([num2str(nn), &lt;span class="string"&gt;&amp;#39;: &amp;#39;&lt;/span&gt;, num2str(count)]);
&lt;span class="keyword"&gt;end&lt;/span&gt;

disp([&lt;span class="string"&gt;&amp;#39;Max: &amp;#39;&lt;/span&gt;, num2str(max_count), &lt;span class="string"&gt;&amp;#39; for nn = &amp;#39;&lt;/span&gt;, num2str(max_nn)]);

&lt;/pre&gt;
      &lt;/div&gt;
   


&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4015" width="1" height="1"&gt;</description></item><item><title>Let me put it to you this way...</title><link>http://srtsolutions.com/blogs/annejackson/archive/2008/07/23/let-me-put-it-to-you-this-way.aspx</link><pubDate>Thu, 24 Jul 2008 03:39:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4006</guid><dc:creator>ajackson</dc:creator><slash:comments>1</slash:comments><description>
&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;I heard NPR&amp;#39;s &lt;a href="http://www.bbc.co.uk/blogs/thereporters/claire_bolderson/2006/10/about_claire_bolderson.html" target="_blank"&gt;&lt;i&gt;Claire Bolderson&lt;/i&gt;&lt;/a&gt; a few days ago and I was intrigued
by what she said. Not the news report so much (she is reporting from Havana right now) as how
she introduced her interview with a &lt;font size="2"&gt;Cuban officia&lt;/font&gt;l. She said something like:&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&amp;quot;What&amp;#39;s happening now in Cuba regarding
freedom of speech? I met with &amp;lt;name of interviewee&amp;gt; and thought I would put
it to him...&amp;quot;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;I started pondering the term &lt;b&gt;&lt;i&gt;Put it to him&lt;/i&gt;&lt;/b&gt;
and was wondering...What does that mean?&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;She could have said &lt;i&gt;&amp;quot;I thought I&amp;#39;d ask
him...&amp;quot;&lt;/i&gt; But she said &lt;b&gt;&lt;i&gt;put it to him&lt;/i&gt;&lt;/b&gt;.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;Hmmm...&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;I&amp;#39;m of the “old school,” I guess, when I hear slang.
I&amp;#39;m no prude, growing up in the 70s. I heard (and made use of) a lot of slang. &lt;b&gt;Bogue.
Far Out. Be There or Be Square. Heavy. Right On! Truckin&amp;#39;. &lt;/b&gt;Of
course, there is a lot more slang and slang phrases now, 35 odd years later. To me, &lt;b&gt;put it
to&lt;/b&gt; him/her conjures up an image of being assertive (if not aggressive) and
extremely confident. It&amp;#39;s like throwing down a gauntlet (forgive the cliché). A
challenge. It is much more resonant than just saying &lt;i&gt;&amp;quot;ask.&amp;quot; &lt;/i&gt;It
is saying...&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&amp;quot;Look. I know these things (because I&amp;#39;m an expert
interviewer and have this great job at the BBC) and now I&amp;#39;m going to &lt;b&gt;put it&lt;/b&gt;
(what I know) &lt;b&gt;to&lt;/b&gt; you...it&amp;#39;s in your hands now to respond to (or--if you dare!--counter) my
assertions.&amp;quot;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin:0in 0in 0.0001pt;"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;I like it. It&amp;#39;s sharp. Definite. But, it is slang. So,
I had to find a definition of this verb phrase. I found this from &lt;a href="http://www.thefreedictionary.com/put" target="_blank"&gt;The Free Dictionary&lt;/a&gt;:&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0.0001pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal" style="margin:0in 0in 0.0001pt;"&gt;&lt;font face="helvetica" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;put it to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt; (someone) &lt;i&gt;Slang.&lt;/i&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;ol start="1"&gt;&lt;li class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;To overburden with tasks or work.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;To put blame on.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;To take unfair advantage of.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;To lay out the facts of a situation to
     (another) in a forceful candid manner.&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;li class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;To defeat soundly; trounce.&lt;/span&gt;&lt;/font&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;



&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;Claire&amp;#39;s usage had to be #4, but I would add this
thought to her usage.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;Yes, she was being forceful and candid. But with &lt;b&gt;US&lt;/b&gt;,
the listener. She was saying to the listener: &lt;i&gt;&amp;quot;I&amp;#39;m going to put it to
him.&amp;quot;&lt;/i&gt; But she didn&amp;#39;t actually say that to her interviewee. Why?
Because using it directly with someone &lt;b&gt;is&lt;/b&gt; being forceful and candid, and
by extension, not so nice. She was inviting us to&lt;b&gt; &lt;/b&gt;be in cahoots with her&amp;nbsp; --
that she was going to be assertive and get the real story. But she didn&amp;#39;t want
to appear this way to her subject. Like all good journalists, she wanted to
appear to be unbiased and objective.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;No doubt unconscious for her. But clever.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;This little verb is indeed a useful, flexible,
slippery, chameleon-like word.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;And, after getting to know &lt;b&gt;put&lt;/b&gt; a little better,
I&amp;#39;m getting quite fond it.&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;So, if you talk to me someday, you might hear me
saying:&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;"&gt;&amp;quot;Let me put it to you this way...I put it in the
proper place, OK? If you have any more questions about this, I might just have
to put it to you.&amp;quot;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="helvetica" size="2"&gt;&lt;span style="font-size:10pt;"&gt;Don&amp;#39;t think I&amp;#39;m being forceful or anything. Just put
up with it, OK?&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Times New Roman&amp;#39;;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p&gt;&lt;font face="helvetica" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4006" width="1" height="1"&gt;</description></item><item><title>Multithreading in C#</title><link>http://srtsolutions.com/blogs/charliesears/archive/2008/07/23/multithreading-in-c.aspx</link><pubDate>Wed, 23 Jul 2008 18:58:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4005</guid><dc:creator>cmsears</dc:creator><slash:comments>1</slash:comments><description>Multithreading is something that seems to keep popping up on me when I am coding. My applications either need to do some crazy calculation (and not return 42) or a function will be waiting for a while before returning anything. Both of these leave my GUI locked up to the point where in Vista I get a straight black screen and the wait O, and in XP if I click on the GUI I get yelled at for touching an application that is not responding. I soon learned you can&amp;#39;t just call all your code out of the...(&lt;a href="http://srtsolutions.com/blogs/charliesears/archive/2008/07/23/multithreading-in-c.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4005" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/charliesears/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://srtsolutions.com/blogs/charliesears/archive/tags/Multithreading/default.aspx">Multithreading</category><category domain="http://srtsolutions.com/blogs/charliesears/archive/tags/Threading/default.aspx">Threading</category></item><item><title>Tech events in and around Ann Arbor</title><link>http://srtsolutions.com/blogs/diannemarsh/archive/2008/07/23/tech-events-in-and-around-ann-arbor.aspx</link><pubDate>Wed, 23 Jul 2008 14:14:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:4002</guid><dc:creator>dmarsh</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The end of the month is sort of light on tech events in Ann Arbor, but STILL there are things to do within driving distance! &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pyohio.org/"&gt;PyOhio &lt;/a&gt;is going on in Columbus, Ohio on Saturday July 26.&amp;nbsp; It&amp;#39;s a free event, and includes talks, open spaces, lightning talks, and poster sessions. If you&amp;#39;re planning to attend and want to carpool, check with other Python developers on the &lt;a href="http://groups.google.com/group/michipug"&gt;MichiPUG Google group.&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The &lt;a href="http://www.aajug.org"&gt;Ann Arbor Java User Group&lt;/a&gt; canceled their meeting for next week
(would have been on Tuesday July 29), but look for their meeting next
month.&amp;nbsp; Rumor has it that the August talk will be on &lt;a href="http://www.sun.com/software/javafx/index.jsp"&gt;JavaFX&lt;/a&gt;, which is getting some air time at &lt;a href="http://en.oreilly.com/oscon2008/public/content/home"&gt;OSCON &lt;/a&gt;this week.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Next week, Wednesday and Thursday (July 30-31) is the Michigan Flex Camp in Lansing.&amp;nbsp; The price is only $40 ($25 if you only want to attend the first day).&amp;nbsp; This hands-on interactive camp looks really interesting.&amp;nbsp; Registration is limited to 150 people, so sign up now if you&amp;#39;re planning to attend: &lt;a href="http://www.theflexgroup.org/camp/"&gt;http://www.theflexgroup.org/camp/&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;a href="http://srtsolutions.com/content/LightningTalks.aspx"&gt;Lightning Talk Fridays&lt;/a&gt;, hosted by SRT Solutions, continue on Friday, August 1 from 3:30-5 pm. &lt;/p&gt;&lt;p&gt;And one non-technical event will be held next week as well.&amp;nbsp; The WXW Business group is holding a networking event for businesswomen at the Ann Arbor Art Center.&amp;nbsp; Cost is $10, and registration is limited to 120 people.&amp;nbsp; Wine and appetizers will be served. Registration is available at &lt;a href="http://wxwbusiness.com/"&gt;http://wxwbusiness.com/&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;If you have any interest in traveling to North Carolina in next week or the week after, &lt;a href="http://trizpug.org/boot-camp/2008/%20"&gt;TrizPugBootCampArama&lt;/a&gt; is being held there, with 3 consecutive camps: PyCamp and 2 on Plone. &lt;/p&gt;&lt;p&gt;Oh, and of course, the first week in August will be busy event-wise, with both the &lt;a href="http://www.computersociety.org"&gt;Ann Arbor Computer Society&lt;/a&gt; meeting on August 6 (topic: Ruby for Domain Specific Languages) and the Michigan Python User Group on August 7.&amp;nbsp; More details on those meetings to come. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=4002" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Java/default.aspx">Java</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Python/default.aspx">Python</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Flex/default.aspx">Flex</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/JavaFX/default.aspx">JavaFX</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/lightning+talks/default.aspx">lightning talks</category><category domain="http://srtsolutions.com/blogs/diannemarsh/archive/tags/Ann+Arbor+events/default.aspx">Ann Arbor events</category></item><item><title>Q &amp; A on a recent VSM Article</title><link>http://srtsolutions.com/blogs/billwagner/archive/2008/07/22/q-amp-a-on-a-recent-vsm-article.aspx</link><pubDate>Tue, 22 Jul 2008 18:13:33 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3982</guid><dc:creator>wwagner</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;One of my last Visual Studio Magazine article discussed object validation and&amp;nbsp; object invariants.&lt;/p&gt; &lt;p&gt;I received a great email discussing questions about how to handle UI validation in this world. My recommendation in the article was that classes should be responsible for their own state. Furthermore, they should enforce that validity at all times. Objects are easier to use if they are always valid.&lt;/p&gt; &lt;p&gt;The question can be boiled down to &amp;quot;what about objects that provide the backing store for UI controls? How do you let the user edit a type and still mandate that it&amp;#39;s always valid?&amp;quot;&lt;/p&gt; &lt;p&gt;As an example, let&amp;#39;s imagine a set of UI fields to edit an address in the United States. You could code that imaginary Address type to query some map service and determine if the address really existed. For an Address object to pass its validity checks, all fields would need to be consistent.&lt;/p&gt; &lt;p&gt;However, users can&amp;#39;t edit this type of Address type. Change the city, and the state and zip code are no longer valid. Change the zip, and the city and state are no longer valid. No matter what order a poor user tries, she cannot get past the first field to edit the other fields necessary to get the Address back in a valid state.&lt;/p&gt; &lt;p&gt;Yes, it&amp;#39;s a problem. The reader posed two ways to solve this consistency issue. &lt;/p&gt; &lt;p&gt;For one, you can loosen the definition of &amp;#39;valid&amp;#39; to allow the type to be invalid for a while. Other code would test stricter conditions when an Address object was being saved to persistent storage. &lt;/p&gt; &lt;p&gt;I don&amp;#39;t like that approach. It weakens the concept of valid until it&amp;#39;s almost meaningless. Weakening the concept of &amp;#39;valid&amp;#39; simply pushes the test to other code: any type that uses an Address object must now perform extra tests because a &amp;#39;valid&amp;#39; address might not really exist. It might be one of those weakened concepts of &amp;#39;valid&amp;#39; to allow editing.&lt;/p&gt; &lt;p&gt;His second approach was to introduce two classes that represent an &amp;quot;Address&amp;quot;: one that represents the business object concept, and one that represents an Address in the UI layer. &lt;/p&gt; &lt;p&gt;I prefer this approach, even though it appears to be more work at first examination. Let&amp;#39;s start with the business object for an Address. It&amp;#39;s always valid, and it always must exist. Any code using this address can assume the address exists, and is valid. That makes it much simpler for client code. It could provide one public method that allows client code to set all fields or properties at once, ensuring that it is still valid. The Address type could throw an exception when client code tried to set an invalid address.&lt;/p&gt; &lt;p&gt;The other Address type, used by the UI, would have much looser validation. Its visibility would be limited to the UI editor, and it would be only used by the UI. To perform the full validation, this EditingAddress type would rely on the Address type. Users would then be informed at save time that an object wasn&amp;#39;t valid.&lt;/p&gt; &lt;p&gt;As a footnote, the same strategy, using two different types, would be appropriate for types that are loaded and saved using the XML Serializer. You can&amp;#39;t rely on the order in which properties are set during the Deserialization process. Objects might not be valid during those transition points.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3982" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/articles/default.aspx">articles</category><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/C_2300_+General/default.aspx">C# General</category></item><item><title>C# Features As Requested By Others: Please No Duck Type By Default in C#</title><link>http://srtsolutions.com/blogs/jaywren/archive/2008/07/21/c-features-as-requested-by-others-please-no-duck-type-by-default-in-c.aspx</link><pubDate>Mon, 21 Jul 2008 14:16:38 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3966</guid><dc:creator>Jay R. Wren - lazy dawg evarlast</dc:creator><slash:comments>0</slash:comments><description>I replied to a blog post by Tosos over here:
The reply was long enough that I thought it warranted posting here too. I expand on why &amp;#8220;var&amp;#8221; is not dangerous and can go away. I also describe why it isn&amp;#8217;t duck or dynamic or anything but strong and static. If you know F# this is [...]...(&lt;a href="http://srtsolutions.com/blogs/jaywren/archive/2008/07/21/c-features-as-requested-by-others-please-no-duck-type-by-default-in-c.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3966" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/jaywren/archive/tags/Programming/default.aspx">Programming</category></item><item><title>Software Projects Do Fail for Technical Reasons</title><link>http://srtsolutions.com/blogs/billwagner/archive/2008/07/17/software-projects-do-fail-for-technical-reasons.aspx</link><pubDate>Thu, 17 Jul 2008 15:36:46 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3918</guid><dc:creator>wwagner</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It&amp;#39;s been repeated so often that now it&amp;#39;s not even questioned:&amp;nbsp; Software projects fail not because of technology missteps, but because of &amp;#39;business issues&amp;#39;. That&amp;#39;s a catch all phrase for misunderstanding business needs, implementing the wrong features, or poor resource management.&lt;/p&gt; &lt;p&gt;But like so many items that have become conventional wisdom, this one is also only right some of the time. Sometimes projects fail because of technical issues.&amp;nbsp; Like every other profession, there is a bell curve of skills and abilities. Some developers (and architects, testers, and designers) just aren&amp;#39;t real professionals, and don&amp;#39;t follow a professional software development practice of any sort.&lt;/p&gt; &lt;p&gt;In particular, our business, SRT Solutions, often helps companies whose primary skill is not software development. It&amp;#39;s in whatever domain they are targeting: healthcare, manufacturing, engineering research, or whatever. That means all these issues become problems:&lt;/p&gt; &lt;p&gt;Software Architecture:&amp;nbsp; Architecture is a study in tradeoffs. Which goals are most important?&amp;nbsp; Which goals are secondary?&amp;nbsp; Of course, customers say everything is important, but which matters more? In particular, we run into companies that don&amp;#39;t have answers for:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Scaling&lt;/strong&gt;:&amp;nbsp; How many users must the system support? When?&amp;nbsp; How fast will the user base grow? How will that growth be accommodated?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Longevity of the code base&lt;/strong&gt;:&amp;nbsp; Release 1 is usually fairly simple. It&amp;#39;s creating release N + 1, as N grows that gets more and more difficult.&amp;nbsp; What about backwards compatibility? What constitutes a breaking change? How will you migrate or update your data store to handle unexpected upgrades?&amp;nbsp; And, understand that every project will have unexpected upgrades. That&amp;#39;s even more true as the release number keeps growing.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Platform&lt;/strong&gt;:&amp;nbsp; How will your users interact with your software? Is it a web site? A web –based application? Smart Client? Some combination? Something even more radical?&amp;nbsp; Why? &lt;/p&gt; &lt;p&gt;In addition, many of the smaller startup companies we work with have absolutely no knowledge, or even awareness of software development practices. Even rudimentary software engineering topics like source control is foreign to some of these companies. Moving beyond that, what processes should be adopted?&amp;nbsp; Is it agile? If so, Scrum, XP, or something else? How do you handle change requests? How do you do validation? Rollout? &lt;/p&gt; &lt;p&gt;If you&amp;#39;re reading my blog, you probably have very strong opinions on all these topics. You probably are a software engineer (or some other title related to software developer). But, how often do you feel that the &amp;#39;business side&amp;#39; just doesn&amp;#39;t get it? You&amp;#39;re correct, that these issues are important. Without quality software, your business fails. But the business side doesn&amp;#39;t understand that. &lt;/p&gt; &lt;p&gt;That attitude is just plain wrong. Labeling those functions &amp;#39;the business side&amp;#39; and &amp;#39;the technical side&amp;#39; cause some of the problems.&amp;nbsp; Everyone is focused on succeeding as a business, generating revenue and profit by delivering solutions to customers. Mutual respect helps a great deal: regardless of your function, you must recognize that other functions are equally important to the overall success. Software people must understand that the software they develop must satisfy real business objectives. True success will be achieved only when we, the technical experts, champion issues of quality, tools, techniques and practices that will promote technical excellence, in parallel to business excellence.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s the punch line: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;It&amp;#39;s your job as a technical professional to engage the business leaders and help them understand why software engineering is important.&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;What are the business risks if you create software without source control?&amp;nbsp; &lt;br /&gt;What happens to your business if you can&amp;#39;t create release 5 as quickly as you created release 1?&lt;/p&gt; &lt;p&gt;More importantly:&amp;nbsp; What happens if your company has developers that don&amp;#39;t care about those questions?&lt;/p&gt; &lt;p&gt;That&amp;#39;s the real issue:&amp;nbsp; If your company creates software, you need to have a strategy to create excellent software. Otherwise, the software becomes a burden, and a risk – not an asset. Often projects fail to achieve the business goals because of technical issues, not business issues, or communications issues.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3918" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/billwagner/archive/tags/Software+Engineering/default.aspx">Software Engineering</category></item><item><title>The importance of vacations and recharging</title><link>http://srtsolutions.com/blogs/billwagner/archive/2008/07/15/the-importance-of-vacations-and-recharging.aspx</link><pubDate>Wed, 16 Jul 2008 03:33:52 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3892</guid><dc:creator>wwagner</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;I took a one week vacation at the end of June, and I&amp;#39;ve been going crazy working since then.&lt;/p&gt; &lt;p&gt;Our company has a rare policy of offering 4 weeks of vacation for new hires. A lot of folks are surprised by that, but it has many benefits.&amp;nbsp; &lt;/p&gt; &lt;p&gt;For one, it seems everyone in this industry works hard, and spends quite a bit of extra time working, or growing. If you don&amp;#39;t take the time to do something different, you&amp;#39;ll burn out. Period.&lt;/p&gt; &lt;p&gt;Equally important, the week or so not looking at daily deadlines means you can take a longer view: I came back from vacation with 6 pages of notes on future strategy. I don&amp;#39;t get the chance to do that with the ongoing deadlines while I&amp;#39;m working. It&amp;#39;s an important benefit.&lt;/p&gt; &lt;p&gt;By far the most important benefit is restoring work / family balance. This was especially important this year, since I had just finished the manuscript for More Effective C#. That sprint made the rest and relaxation important.&lt;/p&gt; &lt;p&gt;That means this is one of the employee benefits we intend to keep, despite some conventional wisdom that we&amp;#39;re spending too much money on this benefit. The benefits are too great, both to our employees and our company.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3892" width="1" height="1"&gt;</description></item><item><title>Ann Arbor Give Camp Developers: Half a Million Dollars to Charities</title><link>http://srtsolutions.com/blogs/srtinsights/archive/2008/07/15/ann-arbor-give-camp-developers-half-a-million-dollars-to-charities.aspx</link><pubDate>Wed, 16 Jul 2008 02:55:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3889</guid><dc:creator>dmarsh</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;a href="http://www.annarborgivecamp.org/"&gt;Ann Arbor Give Camp&lt;/a&gt; started with &lt;a href="http://blogs.msdn.com/jennifer/"&gt;Jennifer Marsman&lt;/a&gt;, of Microsoft, wanting to organize an event to pull together the developer community in the Ann Arbor area. She had heard about a Give Camp organized in Dallas, where developers worked over a weekend to produce applications and/or websites for charities, and wondered if it would work here.&amp;nbsp; She started organizing this a few months ago, and started soliciting charities.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;45 charities submitted proposals, but only about 15 could be selected.&amp;nbsp; A team of volunteers (including SRT&amp;#39;s &lt;a href="http://srtsolutions.com/blogs/billwagner/"&gt;Bill Wagner&lt;/a&gt; and Patrick Steele) called charities to clarify requirements and to ensure that their projects could be done by a team over the weekend.&amp;nbsp; It was critical that the charities be given something of value, something complete. The organizers thought that it was critical that the charities not be left holding partially done work.&amp;nbsp; Other volunteers, including SRT&amp;#39;s Lisa Zuber, reached out to area restaurants and stores for donations of food, water, and snacks.&amp;nbsp; Lisa even stopped by on Friday night (her day off!) to deliver the snacks! &lt;/p&gt;&lt;p&gt;About 118 developers signed up (some on the day before the event!) and showed up at Washtenaw Community College on Friday July 11 to kick things off.&amp;nbsp; Satellite teams worked in &lt;a href="http://devlicio.us/blogs/vinull/archive/2008/07/15/knoxville-takes-part-in-the-ann-arbor-give-camp.aspx"&gt;Knoxville, TN&lt;/a&gt; and in Columbus, OH.&amp;nbsp; SRT&amp;#39;s &lt;a href="http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-angel-s-place.aspx"&gt;Patrick Steele&lt;/a&gt; and &lt;a href="http://srtsolutions.com/blogs/mikewoelmer/archive/2008/07/14/ann-arbor-give-camp-and-the-developers-in-room-be-240.aspx"&gt;Mike Woelmer&lt;/a&gt; were in the main group working from Ann Arbor. &lt;/p&gt;&lt;p&gt;The blogs about Ann Arbor Give Camp are amazing.&amp;nbsp; Jennifer has posted a &lt;a href="http://blogs.msdn.com/jennifer/archive/2008/07/15/ann-arbor-give-camp.aspx"&gt;list of blogs for GiveCamp&lt;/a&gt; on her blog; read more about it there.&amp;nbsp; It was estimated that about a half of a million dollars in value was donated by these generous folks over the weekend.&amp;nbsp; Great job, everyone!&amp;nbsp; With a success like this in the first year of this event, I can only imagine that both charities and developers will be even more interested in contributing next time! &lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3889" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/srtinsights/archive/tags/srtinsights/default.aspx">srtinsights</category><category domain="http://srtsolutions.com/blogs/srtinsights/archive/tags/Ann+Arbor+events/default.aspx">Ann Arbor events</category><category domain="http://srtsolutions.com/blogs/srtinsights/archive/tags/GiveCamp/default.aspx">GiveCamp</category></item><item><title>Sloppy Writing Can Cost a Business a Bundle - Who picks up the tab?</title><link>http://srtsolutions.com/blogs/annejackson/archive/2008/07/15/writing-sure-does-affect-a-business-s-bottom-line.aspx</link><pubDate>Tue, 15 Jul 2008 21:30:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3888</guid><dc:creator>ajackson</dc:creator><slash:comments>2</slash:comments><description>&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;i&gt;My main purpose in this post is to point out how one company
(no doubt representative of a lot of companies) wasted words and money and,
ultimately, let their customers pick up the tab. They could have done it
right the first time if they had put a &lt;a href="http://en.wikipedia.org/wiki/Technical_writer"&gt; professional writer&lt;/a&gt; on the task, to check important
benefit statements, ensuring that they were accurate and clearly written to avoid any ambiguity.&lt;/i&gt;&lt;/span&gt;&lt;/font&gt;



&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;font face="georgia,palatino"&gt;The Story: Letter from
BCN&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Recently, I received a letter from 
&lt;a href="http://www.mibcn.com/"&gt; Blue Care Network of Michigan&lt;/a&gt;,
my health insurance company. I was in my &amp;quot;ready state,” prepared to accept
that BCN had again reduced some of my benefits, when I opened the letter. At
first glance, I saw the words &amp;quot;surrogate parenting exclusion&amp;quot; and
relaxed a little. OK, so far, so good. Doesn&amp;#39;t pertain to me.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Then I read more carefully (the topic piqued my interest):&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;BlueCare Network has made a change to your certificate of
coverage.&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;As required by the state, we replaced the surrogate parent
exclusion with the following new language:&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;All services provided to nonmember surrogate parents are
excluded from coverage.&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;“OK, sure, that&amp;#39;s good. 11 words, to the point...(ignore: passive sentence structure).”&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Then I read the next paragraph:&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;The benefit has not changed. The language simply restates it
more clearly. Previously the benefit stated: …&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;“Whoa...wait a minute...isn’t there some “spin” going on
here? Since when does the aforementioned “exclusion” become a “benefit?” Sigh.” I read on: &lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Previously the benefit stated:&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;All services related to surrogate parenting arrangements,
including, but not limited to, maternity and obstetrical care for non-member
surrogate parents&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;This sentence, despite the length (20 words), had something missing. Sure, it didn&amp;#39;t have a period at the end of the sentence, but where&amp;#39;s the all important “are not covered” that should go at the end? It was such a poor sentence
to begin with, I was thrown for a minute. How could this have been left out? Also, I started to fume when I
realized that this mailing must have cost the company a lot of money.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;font face="georgia,palatino"&gt;The Gory Details: Bad Writing and the Damage ($$)&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;First and foremost, doesn’t BCN know the first thing about
writing to their customers? Never send it out if it has only passed under the
eyes of a lawyer. The erroneous statement’s legal sentence structure suggests
that a lawyer probably wrote it and carelessly submitted it to BCN without the
“are not covered” on the end. BCN probably accepted it blindly and,
knowing as I do how looming deadlines impact things, they printed their benefit
coverage book without a thorough, final review.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Did the benefit coverage book ever have a good review by one
or more writers or editors? Were they even involved in the process? A
good writer or editor would have never let this get to press. In my admittedly
fictitious world where writers rule, they would have had the unconditional blessing by management to scan for potential errors, question anything and everything that looked off, and then rewrite them if needed.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;This sentence should have been stopped dead in
its tracks. It illustrates out how poorly constructed sentences can
cause so much ambiguity that they leave businesses open to potential lawsuits, causing them to have to spend a lot of money to repair the damage.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;So, how much did this cost BCN and, ultimately, its
customers? See my calculation below. Go ahead, feel free to dispute my numbers
and knock off $10,000 or $20,000 if you think I&amp;#39;m off on my quote. It still
cost a bundle&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;font face="georgia,palatino"&gt;The Cost Calculation:
And who will pay for it?&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;I learned that Blue Care Network of Michigan and its
subsidiaries has &lt;a href="http://www.reuters.com/article/pressRelease/idUS138219+12-May-2008+PRN20080512"&gt; 648,000 members&lt;/a&gt;.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;All figures have been rounded in some way or another.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Paper &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;- 2 pages, plus envelope = $ .05 per member =&amp;nbsp; $324.00&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Ink&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;
- $.02 per member =&amp;nbsp; $130.00&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Postage&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt; - This is a biggie. I saw that the envelope was marked &lt;i&gt;Presorted STD&lt;/i&gt;,
so I figured each piece cost the rate of $.394 per member =&amp;nbsp; $255,300&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Employee Cost.&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt; It takes a team of people in a big corporation to agree on
the composition of the letter (hmmm…I wonder where they were&lt;span&gt; &lt;/span&gt;when the erroneous sentence was approved?) and
approval takes some more people. I&amp;#39;d estimate a total cost of $6,000.00. Then
you need to have it printed, put into the envelopes, and put on pallets to be
picked up. Total labor? I&amp;#39;d say another $6,000. So, $12,000 in all.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Updating Sections 1.09 and 2.13 (in the BCN benefit book)
with&lt;span&gt;&amp;nbsp; &lt;/span&gt;proper wording&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt; = $3000.00&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Total Cost of this mailing = $270,754.00&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;



&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;That&amp;#39;s more than a quarter of a million dollars, folks.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;Now, who’s going to pay for it? You’re right. We are. With higher
health care expenses. This money wasting exercise&lt;span&gt; &lt;/span&gt;could have been easily avoided: Hire a
professional writer (not a lawyer, not a vice-president, not an HR person) who knows words, knows the company policy, and who&lt;span&gt; &lt;/span&gt;&lt;b&gt;cares&lt;/b&gt; about words and their meaning. A writer who is in a valued
position and has clout with upper management could have flagged the error and
written the correcting sentence very easily. (You know, the sentence that BCN
says “simply restates it more clearly.”)&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;It’s always not simple to be clear. It’s not always apparent
when something is not clear. And it’s easy to throw legalese on top of a
sentence to make it appear important and correct.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;No, it’s not simple to write clearly. It takes someone who is
dedicated to the job, who is focused on the correct use of words to save a
company from issuing embarrassing, expensive letters like the one I received.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="line-height:150%;"&gt;&lt;font face="arial,helvetica,sans-serif" size="2"&gt;&lt;span style="font-size:10pt;line-height:150%;"&gt;A writer can prevent a company from losing money and thereby
prevent the company from peeling the cost off its bottom line and sticking it
on the back of the customer.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3888" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/annejackson/archive/tags/writing+business/default.aspx">writing business</category></item><item><title>Ann Arbor Give Camp - Angel's Place</title><link>http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-angel-s-place.aspx</link><pubDate>Tue, 15 Jul 2008 17:48:03 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3885</guid><dc:creator>Patrick Steele's .NET Blog</dc:creator><slash:comments>1</slash:comments><description>I was fortunate enough to be not only an organizer for the Ann Arbor Give Camp, but I also put myself on the development team for Angel&amp;#39;s Place -- a local charity that helps place developmentally and physically challenged adults into good homes. Our team of Paul Vollweiler, Carl Furrow, Aditya (Adi) Thakker and myself had a great time with our assigment. After Friday&amp;#39;s night&amp;#39;s dinner, we met with our charitiy representative Marcie Levey and started working on a solution for their ever...(&lt;a href="http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-angel-s-place.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3885" width="1" height="1"&gt;</description></item><item><title>Ann Arbor Give Camp - The Internet Speaks!</title><link>http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-the-internet-speaks.aspx</link><pubDate>Tue, 15 Jul 2008 17:36:23 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3886</guid><dc:creator>Patrick Steele's .NET Blog</dc:creator><slash:comments>0</slash:comments><description>People are blogging about their experience at Give Camp. Here&amp;#39;s just a few: http://www.michaeleatonconsulting.com/blog/archive/2008/07/14/ann-arbor-give-camp---wrap-up.aspx http://srtsolutions.com/blogs/mikewoelmer/archive/2008/07/14/ann-arbor-give-camp-and-the-developers-in-room-be-240.aspx http://fullextension.blogspot.com/2008/07/ann-arbor-give-camp-report.html http://theumlguy.spaces.live.com/blog/cns!B4665B67C2981533!231.entry http://www.codinggeekette.com/2008/07/ann-arbor-give-camp-day...(&lt;a href="http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-the-internet-speaks.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3886" width="1" height="1"&gt;</description></item><item><title>Ann Arbor Give Camp - WOW!</title><link>http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-wow.aspx</link><pubDate>Tue, 15 Jul 2008 17:26:31 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3883</guid><dc:creator>Patrick Steele's .NET Blog</dc:creator><slash:comments>0</slash:comments><description>Wow! Wow! All I can say is WOW! As one who helped organize this event (along with Microsoft&amp;#39;s Jennifer Marsman , John Hopkins and Todd Bohlen) I was simply amazed, impressed and astounded about the weekend&amp;#39;s events. We had an awesome group of developers give up a beautiful July weekend in Michigan (and if you know Michigan, there haven&amp;#39;t been too many nice weekends this summer) to come out and help charities solve their IT problems -- mostly by developing/enhancing a website or creating...(&lt;a href="http://srtsolutions.com/blogs/patricksteele/archive/2008/07/15/ann-arbor-give-camp-wow.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3883" width="1" height="1"&gt;</description></item><item><title>Business Logic is a Bad Word</title><link>http://srtsolutions.com/blogs/jaywren/archive/2008/07/14/business-logic-is-a-bad-word.aspx</link><pubDate>Mon, 14 Jul 2008 23:09:14 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3876</guid><dc:creator>Jay R. Wren - lazy dawg evarlast</dc:creator><slash:comments>0</slash:comments><description>I do not write business applications. Oh sure, I write applications for a business. This business makes money. The applications which I write helps them make more money. However, these applications are in the domain of product engineering. They are not in the domain of running the business. They do not deal with cash flow, [...]...(&lt;a href="http://srtsolutions.com/blogs/jaywren/archive/2008/07/14/business-logic-is-a-bad-word.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3876" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/jaywren/archive/tags/Programming/default.aspx">Programming</category></item><item><title>Ann Arbor Give Camp and the developers in room BE-240</title><link>http://srtsolutions.com/blogs/mikewoelmer/archive/2008/07/14/ann-arbor-give-camp-and-the-developers-in-room-be-240.aspx</link><pubDate>Mon, 14 Jul 2008 23:04:49 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3875</guid><dc:creator>mwoelmer</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;&lt;a href="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/camp.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="95" alt="camp" src="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/camp_thumb.jpg" width="374" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This weekend I had the opportunity to participate in the first &lt;a href="http://annarborgivecamp.org" target="_blank"&gt;Ann Arbor Give Camp&lt;/a&gt;.&amp;nbsp; I wasn&amp;#39;t sure what to expect at first since this was the first event of its kind in the area, but I had a blast!&amp;nbsp; At the end of the week, all of the charities that participated walked away with some great projects and the developers walked away with an amazing experience.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href="http://mobilitymatters.wordpress.com/" target="_blank"&gt;Dan Hibbitts&lt;/a&gt; originally convinced me to attend give camp with the lure of working on adding digital signing to a mobile app for &lt;a href="http://www.forgottenharvest.org/" target="_blank"&gt;Forgotten Harvest&lt;/a&gt;.&amp;nbsp; I&amp;#39;ve been interested in learning more about mobile development, so I decided to give it a try.&amp;nbsp; I worked with Dan at Media Station for a few years and was looking forward to working on the same project with him again.&amp;nbsp; &lt;a href="http://www.theumlguy.com/" target="_blank"&gt;Martin Shoemaker&lt;/a&gt; was the other developer on the project.&amp;nbsp; Besides his reputation on UML, Martin also has a lot of mobile experience.&amp;nbsp; Our team was set to crank out this project in a weekend.&lt;/p&gt; &lt;p&gt;On the first day we met with the representative from &lt;a href="http://www.forgottenharvest.org/" target="_blank"&gt;Forgotten Harvest&lt;/a&gt; Donald Washington.&amp;nbsp; &lt;a href="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/IMAG0069_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 15px 0px 0px;border-left:0px;border-bottom:0px;" height="184" alt="IMAG0069" src="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/IMAG0069_thumb.jpg" width="244" align="left" border="0" /&gt;&lt;/a&gt; As he explained, the person who wrote the proposal for Give Camp didn&amp;#39;t understand completely what Forgotten Harvest&amp;#39;s needs were.&amp;nbsp; They already had a mobile app that would capture digital signatures from food donors or recipients of the donated food.&amp;nbsp; What they needed was to get the digital signatures integrated into their database and signed receipts to be automatically emailed or faxed to the recipient.&amp;nbsp; Their current process required many manual steps.&amp;nbsp; Some Give Camp teams were able to start from scratch on their database projects, but Forgotten Harvest had a large pre-existing database in Access 2000 with many custom forms, so we had to integrate with their database.&amp;nbsp; It was a lucky thing that Dan is also an expert on anything having to do with databases, I had some ADO.Net experience to facilitate talking to the Access database, and Martin and I had plenty of desktop windows experience to knock out the necessary automation. &lt;/p&gt; &lt;p&gt;There were over a hundred developers that signed up to volunteer their time developing for local charities.&amp;nbsp; Each charity had a team of anywhere between 3 to 7 developers working on their project.&amp;nbsp; Each room at Washtenaw Community College had two development teams in them.&amp;nbsp; The other team occupying our room (BE-240) was the team developing for &lt;a href="http://www.nocircofmi.org/" target="_blank"&gt;NOCIRC of Michigan&lt;/a&gt;.&amp;nbsp; Jeff McWherter headed up a team that was working on a web site that allowed any charity (not just NOCIRC) to keep track of and schedule volunteers for upcoming events.&amp;nbsp; He drafted (conned) many developers to help him out.&amp;nbsp; It seemed that every day there was someone new working on the project.&amp;nbsp; I follow many of the people in the room on &lt;a href="http://www.twitter.com/" target="_blank"&gt;twitter&lt;/a&gt;, so it was great to work with them for a weekend and get to know them better.&lt;/p&gt; &lt;p&gt;&lt;a href="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/IMAG0068_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;margin:10px 20px 10px 0px;border-left:0px;border-bottom:0px;" height="290" alt="IMAG0068" src="http://srtsolutions.com/blogs/mikewoelmer/WindowsLiveWriter/AnnArborGiveCampandthedevelopersinroomBE_D41E/IMAG0068_thumb.jpg" width="386" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Both teams had an incredible amount of work to do in a short amount of time.&amp;nbsp; The chemistry in the room was shall we say very jovial.&amp;nbsp; Jokes (good and bad) were flying all weekend long.&amp;nbsp; It was probably the opposing forces of the intense caffeine we were drinking and our lack of sleep that made the atmosphere in the room so much fun. &lt;/p&gt; &lt;p&gt;In the picture you can see Jeff wearing a florescent head band -- Jeff stayed up for over 40 hours before he took a cat nap.&amp;nbsp; In the back you can also see another developer Marc (can&amp;#39;t recall his last name) who downed a stack of 8 monster energy drinks and one red bull.&amp;nbsp; Yikes!&lt;/p&gt; &lt;p&gt;Sometime on Saturday Dan decided to play episodes from &lt;a href="http://www.channel4.com/entertainment/tv/microsites/I/itcrowd/" target="_blank"&gt;&amp;quot;The IT Crowd&amp;quot;&lt;/a&gt;.&amp;nbsp; A very funny English sitcom on the overhead projector while everyone worked.&amp;nbsp; This was very natural to me since most evenings I enjoy having a movie on in the background while I get some work done on the computer.&lt;/p&gt; &lt;p&gt;The Give Camp was also a good opportunity for developers to learn new skills.&amp;nbsp; The environment of the room provided a great opportunity for people to pair program on projects.&amp;nbsp; On the NOCIRC team there were a couple developers that learned C# and ASP.NET for the first time.&amp;nbsp; On the first day Martin and I paired up and both of us learned little things here and there from each other.&amp;nbsp; On Saturday I wrote a windows service for the first time and learned a few good techniques on how to debug it.&amp;nbsp; Neither Martin or I wanted to pair with Dan since he was stuck working on the Access 2000 database.&amp;nbsp; Sorry Dan.&lt;/p&gt; &lt;p&gt;I would like to thank all of the organizers of the &lt;a href="http://annarborgivecamp.org" target="_blank"&gt;Ann Arbor Give Camp&lt;/a&gt; for putting together a great event for the charities and also the developers of room BE-240 for making the experience a lot of fun.&amp;nbsp; If you get a chance, make sure you attend a Give Camp. It is definitely worth it.&amp;nbsp; I can&amp;#39;t wait for next year.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3875" width="1" height="1"&gt;</description></item><item><title>C# vNext feature request 2</title><link>http://srtsolutions.com/blogs/jaywren/archive/2008/07/13/c-vnext-feature-request-2.aspx</link><pubDate>Sun, 13 Jul 2008 15:28:34 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3862</guid><dc:creator>Jay R. Wren - lazy dawg evarlast</dc:creator><slash:comments>0</slash:comments><description>I previously had a list of things I wanted. Yes, I am like a 2-year old. I want. I want. I want.
mdavey posted a link to a channel 9 video which made me rethink my request. Oh I still want all of the original list and&amp;#8230; I want more. I want more. I want more. List [...]...(&lt;a href="http://srtsolutions.com/blogs/jaywren/archive/2008/07/13/c-vnext-feature-request-2.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3862" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/jaywren/archive/tags/Programming/default.aspx">Programming</category></item><item><title>On Bad Matlab</title><link>http://srtsolutions.com/blogs/annemarsan/archive/2008/07/11/on-bad-matlab.aspx</link><pubDate>Fri, 11 Jul 2008 20:15:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3840</guid><dc:creator>amarsan</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;In the past year I&amp;#39;ve worked on two projects that involved piecing through someone else&amp;#39;s Matlab code, making sense of it, making it work, and figuring out how to link to it from a Windows desktop application. In both cases, it was clear that the Matlab had been writen by someone who does not normally spend a lot of time writing code. All of the tenets that we developers hold sacred had been broken: global variables abounded; code was copied over and over; large sections of code were commented out for no apparent reason; and in one of the projects, functions were dispensed with all together in favor of scripts, which often relied on variables that had been declared and set elsewhere in another script. In both cases the original author of the code was not available to explain how things were supposed to work, so fixing the code was a lengthy, tedious process.&lt;/p&gt;&lt;p&gt;It got me wondering...why do engineers write bad Matlab code? Most engineers have had at least one programming course in college, and presumably in that course they are taught how to organize code, declare functions, and pass arguements. Now granted, some people have a harder time than others in figuring out a good architecture for a project. But my observation is that engineers writing Matlab seem to have an aversion to declaring functions. They would rather copy and paste code 20 times than make that code into a function.&lt;/p&gt;&lt;p&gt;And then, as I was working on my most recent Matlab project, it occurred to me what the problem is. When I write C# or C++ code with Microsoft Visual Studio 2005 or 2008, I have IntelliSense, which is a godsend because I can never remember the order in which arguements are supposed to be passed to a function. Matlab does not have anything like IntelliSense, and it has lots and lots of functions, most of them overloaded or with a variable number of arguments. I can&amp;#39;t be the only scatter-brained engineer out there who has trouble keeping track of all of my options.&lt;/p&gt;&lt;p&gt;So this blog post is really a plea to The MathWorks folks - give us IntelliSense! &lt;/p&gt;&lt;p&gt;At a minimum, I&amp;#39;d be happy if there were a window that I could have open that would automatically show me the help file for a function as I type its name into an M-file. This would be similar to the context-sensitive help that&amp;#39;s available in Labview, another engineering tool that has lots and lots of functions that are hard (for me) to keep track of. &lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3840" width="1" height="1"&gt;</description></item><item><title>It's the weekend; do you know where your programmers are?</title><link>http://srtsolutions.com/blogs/diannemarsh/archive/2008/07/11/it-s-the-weekend-do-you-know-where-your-programmers-are.aspx</link><pubDate>Fri, 11 Jul 2008 19:06:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3839</guid><dc:creator>dmarsh</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Today is the start of the weekend ICFP (&lt;a href="http://www.icfpcontest.org/"&gt;International Conference on Functional Programming&lt;/a&gt;) contest.&amp;nbsp;&lt;a href="http://srtsolutions.com/blogs/jaywren/"&gt; Jay Wren&lt;/a&gt;, &lt;a href="http://srtsolutions.com/blogs/charliesears"&gt;Charlie Sears&lt;/a&gt;, and &lt;a href="http://srtsolutions.com/blogs/chrismarinos/"&gt;Chris Marinos&lt;/a&gt; are teaming up to participate.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Across town,&lt;a href="http://srtsolutions.com/blogs/mikewoelmer/"&gt; Mike Woelmer&lt;/a&gt; is participating in the &lt;a href="http://www.annarborgivecamp.org"&gt;Ann Arbor Give Camp&lt;/a&gt;, where developers &amp;quot;give back&amp;quot; by implementing a requested application or website for charities over the weekend. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Have fun guys (and many kudos to the spouses who support the effort on a weekend). &lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3839" width="1" height="1"&gt;</description></item><item><title>Spice Up Your C# Code With Currying</title><link>http://srtsolutions.com/blogs/chrismarinos/archive/2008/07/11/spice-up-your-c-code-with-currying.aspx</link><pubDate>Fri, 11 Jul 2008 15:49:00 GMT</pubDate><guid isPermaLink="false">727bb5a1-3d8b-4cbc-a411-ac1a71136f7d:3838</guid><dc:creator>cmarinos</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Just because C# doesn&amp;#39;t have language support for &lt;a href="http://en.wikipedia.org/wiki/Currying"&gt;currying&lt;/a&gt;, doesn&amp;#39;t mean you can&amp;#39;t spice up your code by implementing currying methods yourself.&amp;nbsp; Even better news is that, it&amp;#39;s very easy to do.&amp;nbsp; Let&amp;#39;s look at the following code, to see how it&amp;#39;s done:&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Func&amp;lt;T2, TR&amp;gt; Bind1&amp;lt;T1, T2, TR&amp;gt;(Func&amp;lt;T1, T2, TR&amp;gt; function, T1 param1)
{
   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(T2 param2) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; function(param1, param2); };
} &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, this simple method returns a delegate accepting one parameter corresponding to the second argument of the input function.&amp;nbsp; This means that the returned delegate acts the same way as the input function, except that the first argument is now &lt;em&gt;bound&lt;/em&gt; to the input parameter.&amp;nbsp; We&amp;#39;ve just curried the method.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s see an example of how this might be useful:&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; CreateMessage(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; b)
{
   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Let&amp;#39;s write a message.... {0} + {1}&amp;quot;&lt;/span&gt;, a, b);
} 
&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)
{
   Func&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; tmp = CreateMessage;
   var CurriedCreate = Bind1(tmp, &lt;span style="color:#006080;"&gt;&amp;quot;Some crazy string value&amp;quot;&lt;/span&gt;);

   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;Another insane string!&amp;quot;&lt;/span&gt;));
   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;and another&amp;quot;&lt;/span&gt;));
   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;yet another&amp;quot;&lt;/span&gt;));
} 
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output: 
&lt;blockquote&gt;
&lt;p&gt;Let&amp;#39;s write a message.... Some crazy string value + Another insane string! 
&lt;p&gt;Let&amp;#39;s write a message.... Some crazy string value + and another 
&lt;p&gt;Let&amp;#39;s write a message.... Some crazy string value + yet another&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Pretty cool.&amp;nbsp; Now, there is a little bit of work to do because you have to write a new bind function for each number of arguments that you want to support.&amp;nbsp; I supported up to 4 arguments, since that meshes with the definition of Func.&amp;nbsp; You also will probably want to write out Bind1, Bind2, Bind3, and Bind4 methods, so that you aren&amp;#39;t limited to always binding to the first argument.&amp;nbsp; That&amp;#39;s a lot of &amp;quot;duplicated&amp;quot; code for the definitions, but C# doesn&amp;#39;t have a way to specify variable-arity (think params[]) for generic parameters, so you&amp;#39;re stuck writing everything out. 
&lt;p&gt;&amp;nbsp; &lt;p&gt;Another interesting thing to note is that you have to explicitly cast your method as a Func for this to work, or you&amp;#39;ll get a &amp;quot;type arguments cannot be inferred from usage&amp;quot; compile error.&amp;nbsp; It would be nice to be able to just write: 
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;var CurriedCreate = Bind1(CreateMessage); &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;cbut, alas, C#&amp;#39;s type inference doesn&amp;#39;t let you do this.&amp;nbsp; Implementing Bind1 as an extension method, is one option to clean up the syntax, though: 
&lt;p&gt;&amp;nbsp; &lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Func&amp;lt;T2, TR&amp;gt; Bind1&amp;lt;T1, T2, TR&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; Func&amp;lt;T1, T2, TR&amp;gt; function, T1 param1)
{
   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(T2 param2) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; function(param1, param2); };
} 

&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; CreateMessage(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; a, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; b)
{
   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Let&amp;#39;s write a message.... {0} + {1}&amp;quot;&lt;/span&gt;, a, b);
} 

&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)
{
   Func&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; tmp = CreateMessage;
   var CurriedCreate = tmp.Bind1(&lt;span style="color:#006080;"&gt;&amp;quot;Some crazy string value&amp;quot;&lt;/span&gt;); 

   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;Another insane string!&amp;quot;&lt;/span&gt;));
   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;and another&amp;quot;&lt;/span&gt;));
   Console.WriteLine(CurriedCreate(&lt;span style="color:#006080;"&gt;&amp;quot;yet another&amp;quot;&lt;/span&gt;));
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Note that there is a &lt;strong&gt;lot &lt;/strong&gt;more to say on this subject, but that will have to wait for another post.&lt;/p&gt;&lt;img src="http://srtsolutions.com/aggbug.aspx?PostID=3838" width="1" height="1"&gt;</description><category domain="http://srtsolutions.com/blogs/chrismarinos/archive/tags/Currying/default.aspx">Currying</category><category domain="http://srtsolutions.com/blogs/chrismarinos/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://srtsolutions.com/blogs/chrismarinos/archive/tags/Functional/default.aspx">Functional</category></item></channel></rss>