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> mode.</p></p>
<p><p>You’ll want to edit the script so that it will activate when you browse
to the BigIP devices in your environment.</p></p>
<p><p>Why is this important? I’ve made changes to a device in <span class="caps">STANDBY</span>
mode one too many times, and I suspect I’m not the only 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’t agree more. Web
connected make my data available most everywhere I go, but I get
nervous when I can’t back up with a local copy. Web services come,
and web services go.</p>
<p>
I have used Don’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>’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 well.</p>
<p>If you use <a href="http://dontbreakthechain.com">Don’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 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> 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’s true: I could have manually created
all of those slides in that time, but then I wouldn’t have this code
to give 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’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 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 “You do not have
any <span class="caps">LADSPA</span> effects plugins installed” when attempting to add effects
to an instrument?</p>
<p>Do 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 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’s even accounting for the 20 hours I spent behind
the wheel. We had a great turn out, and a lot of good talks.</p>
<p>A huge “thank you” to Bill Chipman and Josh Marshall for
volunteering their time, talents, and gear to the recording effort.
In typical fashion I figured I’d lug a bunch of gear down I-35 and
things would just work out, but it wouldn’t have gone nearly as well
if I had to tackle three rooms all by 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 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’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 following:</p>
<ul>
<li>Postfix authenticates with saslauthd</li>
<li>saslauthd authenticates with Courier’s <span class="caps">IMAP</span> server</li>
<li>Courier’s <span class="caps">IMAP</span> server authenticates with Postgresql</li>
</ul>
<p>Courier and most of Postfix were configured a long time ago, so I’m going
to focus on the changes I made this evening while they are fresh.</p>
<h3>Configure saslauthd</h3>
<p>Open /etc/default/saslauthd and change the following:</p>
<ul>
<li><span class="caps">START</span>=yes</li>
<li><span class="caps">MECHANISMS</span>=”rimap”</li>
<li>MECH_OPTIONS=”localhost -r”</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 domains.</p>
<p>Now start saslauthd: /etc/init.d/saslauthd start</p>
<h3>Configure smtpd.conf</h3>
<ul>
<li>pwcheck_method: saslauthd</li>
<li>mech_list: <span class="caps">PLAIN</span> <span class="caps">LOGIN</span></li>
</ul>
<p>Restart postfix: /etc/init.d/postfix 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 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’t particularly enjoy either, but I appreciate the gravity
of any situation that warrants a phone call at 3:00 <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 anyone.</p>
<p>Three people on my team were called at 7:00 <span class="caps">AM</span> today because a
scheduled report didn’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 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’s schedule before picking up the phone at 7:00 <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’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: “Cool!” or “Seriously, <span class="caps">WTF</span>, use
an existing solution!”</p>
<p>If you immediately like the
idea, <a href="http://bitbucket.org/timfreund/nomenpy">download the
source</a> from bitbucket.</p>
<p>Still here? I guess I have some explaining to do.</p>
<h3>I need a dynamic <span class="caps">DNS</span> server at 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 services.</p>
<h3>I never have fully grasped Twisted’s deferred model</h3>
<p>Sure, I’ve written some code that uses Twisted, but it is ugly,
and it never feels quite right or natural to me. I’d like to really
wrap my head around that style of 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 programming.</p>
<p>With all of that said, understand that I’m a complete noob
when writing code to fit Twisted’s model. If the code is an atrocious
misuse of Twisted, please let me know what I did wrong. Much thanks
in 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> wallpaper.</p>
<p>It has been a week. In that time I’ve had a small bit of success, and I
am quite happy with the 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’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’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 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 One.</p>
<h3>Package file was not signed 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 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’d recommend watching the output of logcat while
running through the installation 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 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&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12624122&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&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’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 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’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 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’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’t think to put a “governor_letter_check” method in
my code until I had scraped 90% of all of the available bills and run
in to this one rogue case.</p>
<p>The work isn’t done yet. Special sessions aren’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’m taking
a little bit of a break while the guys bang out the ‘newapi’ branch
of the project, but I hope to get back at it 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>’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 tracks.</p>
<p>If the NeuroPop guys think they’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’m definitely up for some experimentation.</p>
<p>The verdict? It’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’ll stay in my rotation, but I’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’s focus 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’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’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’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’t talking about a lot of money. I spent more driving home
from the office today than I did on this music track. </p>
<p>Failure to experiment sounds terribly dull when compared to the
possibilities locked away in experiments that could 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 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 blocked.</p>
<p>But that’s not the productivity trick I’m going to write about today.</p>
<p>Since I’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’m often browsing to avoid thinking.</p>
<p>Short of implementing any of the <span class="caps">DNS</span> tricks to block time wasters, I’ve
symlinked the offending browser commands to a script that contains the 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 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 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 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 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 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 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 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’t the problem. The guys who procured
the fancy new cert for the third party service were obviously at 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’t really buy them much in the way of assistance when things don’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 service.</p>
<p>It doesn’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>’ed in 2008,
so I can only imagine how old the application server is. I can’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 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’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 generator.</p>
<!-- Hyde::Excerpt::End -->