Tim Freund's Site blog2011-07-02T12:01:24Zhttp://tim.freunds.netF5 BigIP Standby Warning User ScriptTim Freund2011-03-20T23:08:00Z2011-03-20T23:08:00Zhttp://tim.freunds.net/blog/articles/f5_bigip_standby_script.html <!-- Hyde::Excerpt::Begin --> <img src="/media/images/articles/f5_standby.png"/> <p><p><a href="/media/files/greasemonkey/standby_warning.user.js">This Greasemonkey user script</a> inspects the state of an F5 BigIP device and makes the state text large and red if the device is in <span class="caps">STANDBY</span>&nbsp;mode.</p></p> <p><p>You&#8217;ll want to edit the script so that it will activate when you browse to the BigIP devices in your&nbsp;environment.</p></p> <p><p>Why is this important? I&#8217;ve made changes to a device in <span class="caps">STANDBY</span> mode one too many times, and I suspect I&#8217;m not the only&nbsp;one.</p></p> <!-- Hyde::Excerpt::End --> Don't Break The Chain ExporterTim Freund2010-09-25T09:53:00Z2010-09-25T09:53:00Zhttp://tim.freunds.net/blog/articles/dont_break_the_chain_exporter.html <!-- Hyde::Excerpt::Begin --> <p><img src="/media/images/articles/dbtc.png" align="right"> Giles Bowkett emphasizes the importance of picking tools that have export formats in his <a href="http://gilesbowkett.blogspot.com/2010/08/secrets-of-superstar-programmer.html">Time Management for Alpha Geeks</a> video. I can&#8217;t agree more. Web connected make my data available most everywhere I go, but I get nervous when I can&#8217;t back up with a local copy. Web services come, and web services&nbsp;go.</p> <p> I have used Don&#8217;t Break The Chain for 9 months. It tracks 9 different habits for me, and I hope it continues to run for a very long time. To ensure that I will never lose my data regardless of <span class="caps">DBTC</span>&#8217;s continued operation, I wrote an export script. It logs in to the service and outputs chain data as a <span class="caps">CSV</span>. It will optionally export to <span class="caps">JSON</span> as&nbsp;well.</p> <p>If you use <a href="http://dontbreakthechain.com">Don&#8217;t Break The Chain</a>, you should download my <a href="http://github.com/timfreund/dbtc_exporter">dbtc_exporter</a> to save a local copy of your&nbsp;chains.</p> <!-- Hyde::Excerpt::End --> SVG + CSV = IMGTim Freund2010-09-22T22:56:00Z2010-09-22T22:56:00Zhttp://tim.freunds.net/blog/articles/svgcsvimg.html <!-- Hyde::Excerpt::Begin --> <p>I pushed a new project up to github. It is called <a href="http://github.com/timfreund/svgcsvimg">svgcsvimg</a>, and it generates a series of <span class="caps">PNG</span> images from an <span class="caps">SVG</span> template and data provided in a <span class="caps">CSV</span>&nbsp;file. </p> <p>I built this tool because I was too lazy to manually create intro slides for a series of videos. I made the slide template, put all of the video metadata into a csv file, and then spent two hours hacking out this little project. It&#8217;s true: I could have manually created all of those slides in that time, but then I wouldn&#8217;t have this code to give&nbsp;away.</p> <p>My general rule of thumb is to do something manually once. If it comes up a second time, I will manually complete the task and write down the steps with an eye toward repeatable automation. Then I&#8217;m ready to write up code when that third time comes around. I had twenty slides to produce, so I jumped straight to step three for this&nbsp;project.</p> <p>I used <a href="http://inkscape.org/">Inkscape</a> to create the template, and the <span class="caps">SVG</span> rendering was done with a combination of <a href="http://cairographics.org/pycairo/">Pycairo</a> and <a href="http://library.gnome.org/devel/rsvg/stable/"><span class="caps">RSVG</span></a>. <!-- Hyde::Excerpt::End --> You do not have any LADSPA effects plugins installedTim Freund2010-09-05T14:20:00Z2010-09-05T14:20:00Zhttp://tim.freunds.net/blog/articles/ladspa_and_jokosher.html <!-- Hyde::Excerpt::Begin --> <p>Using Jokosher? Are you getting the error message &#8220;You do not have any <span class="caps">LADSPA</span> effects plugins installed&#8221; when attempting to add effects to an&nbsp;instrument?</p> <p>Do&nbsp;this:</p> <p><code>rm -rf ~/.gstreamer-0.10/registry*</code></p> <p>If you want more information, you can find it <a href="http://www.gstreamer.net/wiki/FAQ#IinstallednewLADSPAmodules.2BAC8-libvisualpluginsbutthecorrespondingGStreamerelementsdonotshowup.2Cwhat.27sgoingon.3F">in the GStreamer <span class="caps">FAQ</span></a>. The bug is now closed, but this is still an issue in Ubuntu 10.04. Once Ubuntu updates their GStreamer packages this post should be&nbsp;obsolete.</p> <!-- Hyde::Excerpt::End --> PyTexas 2010 AfterglowTim Freund2010-08-30T21:12:00Z2010-08-30T21:12:00Zhttp://tim.freunds.net/blog/articles/pytexas_2010.html <!-- Hyde::Excerpt::Begin --> <p>I drove to Waco, <span class="caps">TX</span> for <a href="http://pytexas.org/">PyTexas 2010</a> this weekend. It was fantastic, and that&#8217;s even accounting for the 20 hours I spent behind the wheel. We had a great turn out, and a lot of good&nbsp;talks.</p> <p>A huge &#8220;thank you&#8221; to Bill Chipman and Josh Marshall for volunteering their time, talents, and gear to the recording effort. In typical fashion I figured I&#8217;d lug a bunch of gear down I-35 and things would just work out, but it wouldn&#8217;t have gone nearly as well if I had to tackle three rooms all by&nbsp;myself.</p> <p>A hard drive with the raw files will ship to Bill later this week, and I think we can get them ready for upload within the next week or two. Stay tuned for more&nbsp;updates!</p> <!-- Hyde::Excerpt::End --> Configure Postfix to Authenticate with Courier and SASLauthdTim Freund2010-08-21T00:12:00Z2010-08-21T00:12:00Zhttp://tim.freunds.net/blog/articles/ubuntu_postfix_courier_auth_smtp.html <!-- Hyde::Excerpt::Begin --> <p>Once upon a time I had Postfix configured to authenticate incoming <span class="caps">SMTP</span> connections with Courier&#8217;s authdaemond. Then I moved servers, it stopped working, and I never was able to figure out why it failed due to a rather generic error message. I worked through my options and arrived at the&nbsp;following:</p> <ul> <li>Postfix authenticates with&nbsp;saslauthd</li> <li>saslauthd authenticates with Courier&#8217;s <span class="caps">IMAP</span>&nbsp;server</li> <li>Courier&#8217;s <span class="caps">IMAP</span> server authenticates with&nbsp;Postgresql</li> </ul> <p>Courier and most of Postfix were configured a long time ago, so I&#8217;m going to focus on the changes I made this evening while they are&nbsp;fresh.</p> <h3>Configure&nbsp;saslauthd</h3> <p>Open /etc/default/saslauthd and change the&nbsp;following:</p> <ul> <li><span class="caps">START</span>=yes</li> <li><span class="caps">MECHANISMS</span>=&#8221;rimap&#8221;</li> <li>MECH_OPTIONS=&#8221;localhost&nbsp;-r&#8221;</li> </ul> <p>That last option tells it to connect to the <span class="caps">IMAP</span> server running on localhost and pass in the realm (domain) of the user. You will most likely need that -r option if you are hosting multiple&nbsp;domains.</p> <p>Now start saslauthd: /etc/init.d/saslauthd&nbsp;start</p> <h3>Configure&nbsp;smtpd.conf</h3> <ul> <li>pwcheck_method:&nbsp;saslauthd</li> <li>mech_list: <span class="caps">PLAIN</span>&nbsp;<span class="caps">LOGIN</span></li> </ul> <p>Restart postfix: /etc/init.d/postfix&nbsp;restart</p> <p>Postfix now authenticates against my <span class="caps">IMAP</span> server, and I can forget that I wrote this until the next time I execute a server&nbsp;migration.</p> <!-- Hyde::Excerpt::End --> The 7:00 AM Phone CallTim Freund2010-07-08T00:18:00Z2010-07-08T00:18:00Zhttp://tim.freunds.net/blog/articles/seven_am_phone_call.html <!-- Hyde::Excerpt::Begin --> <p><a href="http://www.flickr.com/photos/rickharris/394848744/" title="Booths by Яick Harris, on Flickr"><img src="http://farm1.static.flickr.com/186/394848744_1091e535c2_m.jpg" width="240" height="180" alt="Booths" style="float: left;"></a></p> <p>I much prefer the infamous 3:00 <span class="caps">AM</span> phone call to any 7:00 <span class="caps">AM</span> phone call. I don&#8217;t particularly enjoy either, but I appreciate the gravity of any situation that warrants a phone call at 3:00&nbsp;<span class="caps">AM</span>.</p> <p>7:00 <span class="caps">AM</span> phone calls are often prompted by something strange that the early guy spots after getting in to the office long before anyone else. Although the situation usually warrants attention, it most often does not warrant waking&nbsp;anyone.</p> <p>Three people on my team were called at 7:00 <span class="caps">AM</span> today because a scheduled report didn&#8217;t run at the normal time because of heavy load on our reporting server. Transactions were still processing. and the report was eventually delivered. My team was up late last night doing scheduled maintenance long after normal business hours to reduce impact and provide a high level of customer service. We were all a little perturbed to get wake up calls over a relatively minor issue after a long&nbsp;night.</p> <p>Some folks are night owls because they get their best work done at night. Others are night owls because their work can only be done at night. The early birds can keep their worms, I only ask that they consider the night owl&#8217;s schedule before picking up the phone at 7:00&nbsp;<span class="caps">AM</span>.</p> <!-- Hyde::Excerpt::End --> Python DNS ServerTim Freund2010-07-06T21:58:00Z2010-07-06T21:58:00Zhttp://tim.freunds.net/blog/articles/python_dns_server.html <!-- Hyde::Excerpt::Begin --> <p>I&#8217;ve spent a few hours over the last week working on a Python <span class="caps">DNS</span> server that uses a database to store name records. Reactions to this probably come in one of two flavors: &#8220;Cool!&#8221; or &#8220;Seriously, <span class="caps">WTF</span>, use an existing&nbsp;solution!&#8221;</p> <p>If you immediately like the idea, <a href="http://bitbucket.org/timfreund/nomenpy">download the source</a> from&nbsp;bitbucket.</p> <p>Still here? I guess I have some explaining to&nbsp;do.</p> <h3>I need a dynamic <span class="caps">DNS</span> server at&nbsp;home</h3> <p>Either a proper dynamic <span class="caps">DNS</span> server or at least a <span class="caps">DNS</span> server with some form of <span class="caps">API</span> will do. I work on some sysadmin software and other software that makes use of network&nbsp;services.</p> <h3>I never have fully grasped Twisted&#8217;s deferred&nbsp;model</h3> <p>Sure, I&#8217;ve written some code that uses Twisted, but it is ugly, and it never feels quite right or natural to me. I&#8217;d like to really wrap my head around that style of&nbsp;code.</p> <p>The <a href="http://bitbucket.org/timfreund/nomenpy">NomenPy</a> project is my attempt to satisfy both of those needs. Twisted comes with a fully baked <span class="caps">DNS</span> implementation. This allows me to build out a programmable database backed <span class="caps">DNS</span> server as a thin veneer over a Twisted foundation. I can see real results while working on a real problem and learning a new style of&nbsp;programming.</p> <p>With all of that said, understand that I&#8217;m a complete noob when writing code to fit Twisted&#8217;s model. If the code is an atrocious misuse of Twisted, please let me know what I did wrong. Much thanks in&nbsp;advance!</p> <!-- Hyde::Excerpt::End --> Success with LifeTim Freund2010-06-23T20:35:00Z2010-06-23T20:35:00Zhttp://tim.freunds.net/blog/articles/life_success.html <!-- Hyde::Excerpt::Begin --> <p>Last time around I talked a little bit about my <a href="/blog/articles/package_signed_incorrectly.html">Game of Life</a>&nbsp;wallpaper.</p> <p>It has been a week. In that time I&#8217;ve had a small bit of success, and I am quite happy with the&nbsp;results.</p> <img src="/media/images/articles/life_success.png"/> <p>35 people have software that I wrote on their phones, and one of them was even kind enough to give me a five star rating. It probably sounds like I&#8217;m making a big deal over 35 people, and I am. I write software all day long that people use due to contractual obligation. I&#8217;ve never been good at marketing. The Android Market provides a ready built distribution channel that beats any of my previous attempts at software distribution, and that has me genuinely&nbsp;excited.</p> <!-- Hyde::Excerpt::End --> Android Package Not Signed CorrectlyTim Freund2010-06-16T22:58:00Z2010-06-16T22:58:00Zhttp://tim.freunds.net/blog/articles/package_signed_incorrectly.html <!-- Hyde::Excerpt::Begin --> <img style="float: right;" src="/media/images/android/lifewallpaper/lifewallpaper.png"/> <p>I finally rounded off enough of the rough edges in my <a href="/android/lifewallpaper.html">Game of Life</a> wallpaper that I decided to put it in to the Android Market this afternoon. Publishing the application was easy enough, and seeing the application appear immediately in my search results was fun, but my heart sank when I tried to install the application on my Nexus&nbsp;One.</p> <h3>Package file was not signed&nbsp;correctly</h3> <p>I pulled the application back out of the marketplace to debug it by installing from a local web server. I tried recreating my signing certificate 9 different ways, all of them resulting the same failed installation. Finally I decided to start fresh, and I deleted the application before attempting to reinstall. That did the trick, and it worked for each of the 9 cert variations I had&nbsp;created.</p> <p>Be forewarned, this might not solve your problem. It looks like there are a number of issues that can cause this error message or ones like it. If you are still having trouble, I&#8217;d recommend watching the output of logcat while running through the installation&nbsp;process.</p> <p>And in the unlikely even that you came here to learn more about my <a href="/android/lifewallpaper.html">Game of Life wallpaper</a>, check out the video&nbsp;below:</p> <p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12624122&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12624122&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/12624122">Game of Life Android Wallpaper</a> from <a href="http://vimeo.com/user3420576">Tim Freund</a> on <a href="http://vimeo.com">Vimeo</a>.</p></p> <!-- Hyde::Excerpt::End --> Emacs Animate Birthday PresentTim Freund2010-06-15T22:09:00Z2010-06-15T22:09:00Zhttp://tim.freunds.net/blog/articles/emacs_animate_birthday.html <!-- Hyde::Excerpt::Begin --> <p>Emacs holds features that I would have never imagined. Ever. Some elisp hacker must have been under the gun to produce something, <em>anything</em>, for a friend&#8217;s birthday to produce <code>animate-birthday-present</code>.</p> <p>It was a pleasant diversion on my way to correctly typing <code>ansi-term</code>. Maybe it is just a silly Easter egg, where both the writing and execution of the function was a pleasant&nbsp;diversion.</p> <!-- Hyde::Excerpt::End --> Fifty State Project ActivityTim Freund2010-06-07T22:07:00Z2010-06-07T22:07:00Zhttp://tim.freunds.net/blog/articles/fifty_states_montana.html <!-- Hyde::Excerpt::Begin --> <p>There is something a little bit dirty about screen scraping. In this modern day and age, isn&#8217;t there some sort of RESTful <span class="caps">JSON</span> based <span class="caps">API</span> for all of the important data? Well, no. But the guys at the <a href="http://fiftystates-dev.sunlightlabs.com/">Fifty State Project</a> are trying their best to change that for as much of the state legislation that they can&nbsp;get.</p> <p>I spent some time over the last three weeks working on the legislation scraper for the state of Montana. I picked up where <a href="http://github.com/TheRealFalcon/fiftystates">another programmer left off</a>, and most of the heavy lifting was done in a few days. James really laid down a good foundation, and I was glad that he was happy to see the work continued, even if it wasn&#8217;t by him. The bulk of my time was spent working out all of the little special cases that crop up in systems like these. For instance, since the data is stored in a directory on a web server, folks could put other stuff out there in addition to legislation, like letters from the governor. I didn&#8217;t think to put a &#8220;governor_letter_check&#8221; method in my code until I had scraped 90% of all of the available bills and run in to this one rogue&nbsp;case.</p> <p>The work isn&#8217;t done yet. Special sessions aren&#8217;t yet parsed because they seem to use an entirely different system, and some meta data about bills that are only published in <span class="caps">PDF</span> format get missed. I&#8217;m taking a little bit of a break while the guys bang out the &#8216;newapi&#8217; branch of the project, but I hope to get back at it&nbsp;soon.</p> <!-- Hyde::Excerpt::End --> Cheap Sound ExperimentsTim Freund2010-05-21T01:12:00Z2010-05-21T01:12:00Zhttp://tim.freunds.net/blog/articles/cheap_sound_experiments.html <!-- Hyde::Excerpt::Begin --> <p><img src="/media/images/articles/cheap_sound_experiments-neuropop_overload.jpg" align="right"> The guys at <a href="http://www.neuropop.info/">NeuroPop</a> use neurosensory algorithms to get in to the heads of their listeners. I heard about their work on <span class="caps">NPR</span>&#8217;s Here and Now show, and I was immediately intrigued. I work in an open environment, and large portions of my job involve serious concentration if I ever hope to get anything done. My noise abatement activities range from simply putting on my headphones without any music, to <a href="http://www.ninjatune.net/solidsteel/">the Solid Steel Podcast</a>, to brown noise and rain&nbsp;tracks.</p> <p>If the NeuroPop guys think they&#8217;ve hit upon a combination of sounds that will encourage the listener to focus, and they are willing to sell the track for only $0.99, I&#8217;m definitely up for some&nbsp;experimentation.</p> <p>The verdict? It&#8217;s neat. It definitely does <em>something</em>, but I think I am still focusing on the track rather than focusing on the work that needs to be done. It&#8217;ll stay in my rotation, but I&#8217;m just as likely to get into the code zone with a podcast from <span class="caps">DK</span> as I am when listening to NeuroPop&#8217;s focus&nbsp;track.</p> <p>And for the record, the NeuroPop tracks definitely benefit from good headphones. I use <a href="http://www.google.com/search?hl=en&q=Sennheiser+HD+265&aq=f&aqi=g5&aql=&oq=&gs_rfai=">Sennheiser <span class="caps">HD</span> 265</a>s at work, and the track sounds incredible. At home I&#8217;m using the <a href="http://www.amazon.com/Sennheiser-RS-170-Wireless-Headphone/dp/B002TLT10I/ref=sr_1_7?ie=UTF8&s=electronics&qid=1274508543&sr=8-7">Sennheiser <span class="caps">RS</span> 170</a>s, and the track just sounds good. <p>But that&#8217;s not what I really wanted to talk about today. I was a little shocked at the reaction I got from coworkers when discussing these NeuroPop tracks. I was asked why I bother with such experiments when I could just not bother. I got the same reaction when I built a standing desk at home, and when I went from two monitors to four. I&#8217;d rather run an experiment that fails than always wonder if there was something to a crazy idea that I heard on the radio. And remember, we aren&#8217;t talking about a lot of money. I spent more driving home from the office today than I did on this music&nbsp;track. </p> <p>Failure to experiment sounds terribly dull when compared to the possibilities locked away in experiments that could&nbsp;fail.</p> <!-- Hyde::Excerpt::End --> Stupid Productivity TrickTim Freund2010-05-18T20:07:00Z2010-05-18T20:07:00Zhttp://tim.freunds.net/blog/articles/stupid_productivity_trick.html <!-- Hyde::Excerpt::Begin --> <h3>Or how I keep myself from wasting hours on news.yc and&nbsp;reddit</h3> <p>I use <a href="https://addons.mozilla.org/en-US/firefox/addon/4476/">LeechBlock</a> to keep myself from wasting hours of my life on reddit and news.yc. I have time scheduled in to the day when I can browse to whatever I want, but for the bulk of my day I have the time wasters&nbsp;blocked.</p> <p>But that&#8217;s not the productivity trick I&#8217;m going to write about&nbsp;today.</p> <p>Since I&#8217;m a geek, I have a few browsers installed, and so I have reflexively learned that when LeechBlock presents me with a blank white screen, I should open Galeon instead. No productivity gained there, and it is unfortunate, because I&#8217;m often browsing to avoid&nbsp;thinking.</p> <p>Short of implementing any of the <span class="caps">DNS</span> tricks to block time wasters, I&#8217;ve symlinked the offending browser commands to a script that contains the&nbsp;following:</p> <p><code> notify-send -u critical "Get back to work" "Do you really need $0 right now?" </code></p> <p>The symlinked look-alike is ahead of the real applications in my path, so it gets picked up and executed. Most of the time that is enough to jolt me out of distraction, and in truly dire circumstances I can always manually execute the full path to the time sucking browser that I&nbsp;desire.</p> <!-- Hyde::Excerpt::End --> The Joy of ForkingTim Freund2010-05-16T22:30:00Z2010-05-16T22:30:00Zhttp://tim.freunds.net/blog/articles/joy_of_forking.html <!-- Hyde::Excerpt::Begin --> <p>The thing I love the most about distributed version control systems is not my ability to work on a plane, even though that is an oft-cited reason to use a <span class="caps">DVCS</span>. I am not often on planes, and when I am, I try to sleep through the experience. The joy of forking is what I most love about any of the <span class="caps">DVCS</span> systems in use today. Developers are expected to own and operate their own branch of any given code base if they want to contribute back to the project, and both forking and merging are made easy to support this&nbsp;notion.</p> <p>This is especially helpful in the open source community because it reduces one of the major risks of small open source projects: maintainer abandonment. Many small projects have a bus factor of one, and if that one maintainer has better things to do, the project is guaranteed to stall if the source code is locked away in a traditional version control&nbsp;system.</p> <p>Another nice side effect of easy branching and merging is increased collaboration. I saw a great example of this when I inquired about writing a state scraper for the <a href="http://fiftystates-dev.sunlightlabs.com/">Fifty States Project</a>: a developer was able to give me a jump start by pushing incomplete code up to GitHub. This allowed me to pull his code, and no one using the canonical repository was impacted. It was a heck of a lot easier than emailing patch files, and it saved me a ton of&nbsp;work.</p> <!-- Hyde::Excerpt::End --> Growlish, a growlnotify cloneTim Freund2010-05-10T22:45:00Z2010-05-10T22:45:00Zhttp://tim.freunds.net/blog/articles/growlish.html <!-- Hyde::Excerpt::Begin --> <p><img src="/media/images/articles/growlish.jpg" align="right"> <a href="http://ringce.com/hyde">Hyde</a> has optional support for growl notifications. I was interested to see how Hyde used the growl notifications, but I no longer own an <span class="caps">OS</span> X machine, so I have no copies of&nbsp;growl.</p> <p>Ubuntu has a notification system, complete with a command line interface named <code>notifiy-send</code>, but the options are different than those provided by <code>growlnotify</code>. I wrote <a href="https://launchpad.net/growlish">growlish</a> to fill the&nbsp;gap.</p> <p>There is probably more boilerplate than code in the project. The pynotify <span class="caps">API</span> is very easy to use, so the actual notification implementation is tiny. Never the less, I thought it might be useful to someone, so have at it. I saw that someone else had posted a similar utility a couple of years ago, but the code was missing, so I reinvented this particular&nbsp;wheel.</p> <!-- Hyde::Excerpt::End --> SSL Cert SupportTim Freund2010-05-06T21:48:00Z2010-05-06T21:48:00Zhttp://tim.freunds.net/blog/articles/cert_support.html <!-- Hyde::Excerpt::Begin --> <p>Just heard about someone complaining that an <span class="caps">SSL</span> certificate was incompatible with their application server. It turns out that their application server is really, really old, but somehow this wasn&#8217;t the problem. The guys who procured the fancy new cert for the third party service were obviously at&nbsp;fault.</p> <p>The real problem is that people will pay $20K+ per <span class="caps">CPU</span> for an application server because it comes with support, and then they realize when it is too late that their support dollars don&#8217;t really buy them much in the way of assistance when things don&#8217;t work out right, so then the suckers with the support contract need to pawn off all of their problems on to third parties that are just trying to efficiently run a&nbsp;service.</p> <p>It doesn&#8217;t help that the $20K+ per <span class="caps">CPU</span> application server is such a monster to install and maintain that no one really wants to upgrade until they absolutely must. The folks in question were running said application server under Java 1.4, and that was <span class="caps">EOL</span>&#8217;ed in 2008, so I can only imagine how old the application server is. I can&#8217;t understand how such a situation is at all preferable to running something open source and up to date. The money spent on licensing can be better spent on people who can actually solve real problems as they come&nbsp;up.</p> <!-- Hyde::Excerpt::End --> First PostTim Freund2010-05-02T22:19:00Z2010-05-02T22:19:00Zhttp://tim.freunds.net/blog/articles/first_post.html <!-- Hyde::Excerpt::Begin --> <p><img src="/media/images/articles/first_post-JekyllHyde1931.jpg" align="left"> I did it again. I changed the way I blog. I don&#8217;t want to go too far meta, but I would like to point out that the guys behind <a href="http://ringce.com/hyde">Hyde</a> have created a nice little static website&nbsp;generator.</p> <!-- Hyde::Excerpt::End -->