<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>My personal blog.</description><title>/home/bricas/blog</title><generator>Tumblr (3.0; @bricas001)</generator><link>http://blog.alternation.net/</link><item><title>Finding missing tracks in your Banshee library</title><description>&lt;p&gt;I really love the &lt;a href="http://musicbrainz.org"&gt;MusicBrainz project&lt;/a&gt;. I use their &lt;a href="http://musicbrainz.org/doc/MusicBrainz_Picard"&gt;Picard tagger&lt;/a&gt; all the time.&lt;/p&gt;
&lt;p&gt;I also have an unfortunately complex setup due to the fact that I want to sync all of my music to my iPhone. The current incarnation of this is a Windows 7 VM and a shared folder so I can use &lt;a href="http://banshee.fm/"&gt;Banshee&lt;/a&gt; in Ubuntu, and iTunes on Windows with the same folder as the source of my files.&lt;/p&gt;
&lt;p&gt;In order for this to work properly, all of my music, for one, needs to be something other than ogg (what a PITA, seriously, Apple), and all of the filenames need to be Windows-safe. Picard makes the latter very easy with its renaming features.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;One of the unintended side-effects of doing this is that it will rename all of my files to the name of the track in the MusicBrainz database (NB: directories were left unchanged). This means any differences from the original filename (spelling, capitalization, etc) will mess up my Banshee library.&lt;/span&gt;&lt;strike&gt;&lt;!-- more --&gt;&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;Luckily the Banshee library is just an SQLite database. I wrote a little helper script to help me go through my files and select a new one when a missing one was encountered.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl

use strict;
use warnings;

use DBI;
use URI;
use URI::file;
use File::Basename;

my $dbh = DBI-&amp;gt;connect( 'dbi:SQLite:dbname=' . shift );
my $sth = $dbh-&amp;gt;prepare("SELECT trackid, uri from CoreTracks order by uri;");
$sth-&amp;gt;execute();

my $sth_upd = $dbh-&amp;gt;prepare( "UPDATE CoreTracks set uri = ? WHERE trackid = ?" );

while ( my $row = $sth-&amp;gt;fetchrow_hashref ) {
    my $u = $row-&amp;gt;{ Uri };
    next if $u =~ m{\.gvfs};
    next if $u =~ m{/Videos/};
    next unless $u =~ m{file://};

    my $url = URI-&amp;gt;new( $u );
    my $file = $url-&amp;gt;file;
    
    next if -e $file;

    print "OLD: $file\n";

    my $basename = esc_chars( basename( $file ) );
    my $dirname  = dirname( $file );

    my $new = `zenity --file-selection --filename="$dirname/" --title="$basename"`;

    unless( $new ) {
        print "CANCELLED\n";
        exit;
    }

    print "NEW: $new";

    my $newuri = URI::file-&amp;gt;new( $new );

    $sth_upd-&amp;gt;execute( $newuri, $row-&amp;gt;{ TrackID } );
}

sub esc_chars {
    my $t = shift;
    $t =~ s/([;&amp;lt;&amp;gt;\*\|`&amp;amp;\$!#\(\)\[\]\{\}:'"])/\\$1/g;
    return $t;
}&lt;br/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The process is still a bit mind-numbing, but it’s slightly more palatable than any other idea I had.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193662196</link><guid>http://blog.alternation.net/post/49193662196</guid><pubDate>Mon, 26 Mar 2012 12:17:00 -0430</pubDate><category>banshee</category><category>musicbrainz</category><category>perl</category></item><item><title>Fixing Trac 0.11 for Subversion 1.7</title><description>&lt;p&gt;This is a short note, which will serve as a reminder, and hopefully help other people who arrive here via &lt;a href="http://google.com"&gt;the oracle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you happen to be running Ubuntu 10.04 LTS, with Trac 0.11 (which can be installed from the canonical repositories), and you decide you want to upgrade Subversion to 1.7 — you will encounter a problem.&lt;/p&gt;
&lt;p&gt;One way to fix it, besides not upgrading things that weren’t broken in the first place, is to patch Trac.&lt;/p&gt;
&lt;p&gt;I found this changeset, &lt;a href="http://trac.edgewall.org/changeset/10833"&gt;10833&lt;/a&gt;, which is a commit against Trac 0.12, and adapted it for use with 0.11.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--- svn_fs.orig.py        2009-11-23 18:29:48.000000000 -0400
+++ svn_fs.py        2011-12-16 11:30:20.000000000 -0400
@@ -894,21 +894,31 @@
             path = _from_svn(path_utf8)
             base_path = _from_svn(base_path_utf8)
             base_rev = change.base_rev
-
+# SVN 1.7 FIX
+            action = getattr(change, 'action', None)
+# EOFIX
             # Ensure `base_path` is within the scope
             if not (_is_path_within_scope(self.scope, base_path) and
                     self.authz.has_permission(base_path)):
                 base_path, base_rev = None, -1
 
             # Determine the action
-            if not path:                # deletion
-                if base_path:
+# SVN 1.7 FIX
+#            if not path:                # deletion
+#                if base_path:
+            if not path and self.scope == '/': 
+                action = Changeset.EDIT # root property change 
+            elif not path or action == repos.CHANGE_ACTION_DELETE: 
+                if path:            # deletion 
+# EOFIX
                     if base_path in deletions:
                         continue # duplicates on base_path are possible (#3778)
                     action = Changeset.DELETE
                     deletions[base_path] = idx
-                elif self.scope == '/': # root property change
-                    action = Changeset.EDIT
+# SVN 1.7 FIX
+#                elif self.scope == '/': # root property change
+#                    action = Changeset.EDIT
+# EOFIX
                 else:                   # deletion outside of scope, ignore
                     continue
             elif change.added or not base_path: # add or copy
                 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NB: The file on my system was located at &lt;code&gt;/usr/share/pyshared/trac/versioncontrol/svn_fs.py&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I’m not entirely unsure if this is 100% correct, but it works for me. I hope it helps you too.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193663283</link><guid>http://blog.alternation.net/post/49193663283</guid><pubDate>Fri, 16 Dec 2011 14:38:00 -0430</pubDate><category>subversion</category><category>trac</category><category>ubuntu</category></item><item><title>Kwalitee Control and Relaxing the Rules</title><description>&lt;p&gt;It’s been online for a couple of weeks now, but if you haven’t already seen it — check out the &lt;a href="http://changes.cpanhq.org"&gt;CPAN::Changes Kwalitee Service&lt;/a&gt;. Special thanks to &lt;a href="http://lumberjaph.net/"&gt;Franck Cuny&lt;/a&gt; for hosting and feeding this beast!&lt;/p&gt;
&lt;p&gt;The site tracks the overall CPAN::Changes spec conformance as well as a break down by author and distribution. For ease of tracking, we offer feeds for both of these facets as well as a global &lt;a href="http://changes.cpanhq.org/recent/feed"&gt;“recent releases” feed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you take a closer look at that feed, any non-conforming releases will indicate that fact with an error message. All of the releases with properly formatted changelogs will have their matching release information extracted and used in the body of the feed entry.&lt;/p&gt;
&lt;p&gt;Any suggestions for the service are welcome. The source for the project can, of course, be &lt;a href="https://github.com/bricas/cpan-changes-web"&gt;found on github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you visited the site early on, you would have seen that the CPAN had about a 10% conformance rate. These days we’re hovering around 30%. Unfortunately, there hasn’t been a mass acceptance of the spec; I’ve just relaxed the date parsing rules.&lt;/p&gt;
&lt;p&gt;I had a number of people question the use of W3CDTF dates when a number of existing distributions use “scalar localtime”-style dates. Since I can easily discover those dates, I’ve changed CPAN::Changes (release 0.09) to parse them and convert them to W3CDTF dates. I will continue to promote the use of W3CDTF dates and the CPAN::Changes tools will continue to output dates in that format &lt;em&gt;only&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;At the same time I’ve tightened up the validation of those W3CDTF dates (release 0.10) to get rid of any false positives I was seeing.&lt;/p&gt;
&lt;p&gt;Happy changelogging!&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193663891</link><guid>http://blog.alternation.net/post/49193663891</guid><pubDate>Wed, 30 Mar 2011 13:16:00 -0430</pubDate></item><item><title>Re: Changes; filenames</title><description>&lt;p&gt;In talking about changelogs, I thought it might be good to take a snapshot of what is out there. I whipped up a quick script to parse through my minicpan and pull out filenames that looked like “change*” (case-insensitive) from the root directory.&lt;/p&gt;
&lt;p&gt;21545 distributions were parsed. *&lt;/p&gt;
&lt;p&gt;Out of those, 2305 (10.7%) had no files matching that regex. This is an unfortunate stat, but one could posit a couple of reasons: 1) the author simply neglected to include it 2) the author chose to use a different naming convention; both are plausible. For the latter, I’ve seen other files such as NEWS or even a pod file (generally within the lib/ structure) in a few distributions.&lt;/p&gt;
&lt;p&gt;The most common filename was, of course, “Changes” with 17138 (79.5%) distributions falling under that naming. Second to that was “CHANGES” — 1016 (4.7%) distributions use that. In third place was “ChangeLog” at 847 (3.9%) distributions.&lt;/p&gt;
&lt;p&gt;As you can see, the drop off after the top spot is significant. There were a few other variations worth mentioning: “CHANGELOG” (136), “Changelog” (70), “Changelog.ini” (64), “Changes.ttl” (58), “Changes.xml” (48) and “Changes.txt” (30).&lt;/p&gt;
&lt;p&gt;It seems fair to say that to achieve consistency, we should adopt “Changes” as the standard name for CPAN distribution changelogs. This is certainly the path of least resistance as nearly 80% already follow this notion. Please feel free to voice your opinion in the comments below!&lt;/p&gt;
&lt;p&gt;In my next post, I will do some further analysis on the actual content of these changelogs.&lt;/p&gt;
&lt;p&gt;* Note: I pulled out all files that matched, thus some distributions returned more than one file. The total of the filenames comes to 21888, which gives us a small margin of error.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193664660</link><guid>http://blog.alternation.net/post/49193664660</guid><pubDate>Tue, 08 Feb 2011 08:49:00 -0430</pubDate><category>cpan</category><category>perl</category></item><item><title>Revisiting CPAN Changes files</title><description>&lt;p&gt;The topic of Changes files has once again come into focus — see Dave Rolsky’s posts &lt;a href="http://blog.urth.org/2011/01/changes-file-how-and-how-not-to.html"&gt;here&lt;/a&gt; and &lt;a href="http://blog.urth.org/2011/01/changes-file-how-to-follow-up.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I posed a question a few years back about machine parsable Changes files. A number of people picked up on this and some further conversations ensued:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://use.perl.org/articles/07/09/06/0324215.shtml"&gt;My original post, front-paged on use.perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~RGiersig/journal/34370/"&gt;YAML-based spec from RGiersig&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~miyagawa/journal/34850"&gt;miyagawa asks for a machine readable “urgency” marker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~hex/journal/34864"&gt;First proposal from hex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~hex/journal/34882"&gt;Second proposal from hex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://use.perl.org/~hanekomu/journal/34857"&gt;hanekomu implements Module::Changes, with support for a YAML format and a basic text format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So, what happened? Well, not much.&lt;/p&gt;
&lt;p&gt;I don’t think there’s a single person that could agree on what should be in a Changes files. Some people wanted to argue about the serialization format (YAML vs Text vs XML vs …). Some people thought that things were “too structured”, some “not structured enough.” This kind of back-and-forth was inevitable — everyone has an opinion.&lt;/p&gt;
&lt;p&gt;At my own peril, I’ve decided to re-tread this old ground.&lt;/p&gt;
&lt;p&gt;To that end, I’ve uploaded &lt;a href="http://search.cpan.org/dist/CPAN-Changes/"&gt;CPAN::Changes&lt;/a&gt; to CPAN (&lt;a href="http://github.com/bricas/cpan-changes"&gt;source here&lt;/a&gt;). What’s inside:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?CPAN::Changes::Spec"&gt;CPAN::Changes::Spec&lt;/a&gt; - A specification document. I’ve attempted to codify a number of standard practices seen in changelogs included in CPAN distributions. It’s a light read with only a few rules, but it gives some consistency to the file’s structure.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?CPAN::Changes"&gt;CPAN::Changes&lt;/a&gt; (and &lt;a href="http://search.cpan.org/perldoc?CPAN::Changes::Release"&gt;::Release&lt;/a&gt;) - An API to read and write Changes files. Once you have a predictable structure, you should be able to play around with it in a programmatic fashion. I can envision integration with distribution building tools, SCM tools, and CPAN clients.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Test::CPAN::Changes"&gt;Test::CPAN::Changes&lt;/a&gt; - A simple module to help automate the validation of Changes files. This is probably most useful during release testing to make sure you’re sending a spec-conforming changelog to CPAN.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I’ve deliberately kept the spec simple, taking what’s already out there and applying some basic rules. It’s open for comments — let me know what you think!&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193665623</link><guid>http://blog.alternation.net/post/49193665623</guid><pubDate>Thu, 03 Feb 2011 13:53:00 -0430</pubDate><category>cpan</category><category>perl</category></item><item><title>File::HomeDir 0.91 data directory changes</title><description>&lt;p&gt;After performing a routine upgrade of my CPAN modules on my $work machine, I noticed that I was prompted to configure CPAN for the first time after I attempted to load the CPAN shell again.&lt;/p&gt;
&lt;p&gt;Obviously I had already done all of that so I had to figure out what had changed. I remembered having installed only a couple new modules, including File::HomeDir.&lt;/p&gt;
&lt;p&gt;Browsing its Changes file shows:&lt;/p&gt;
&lt;blockquote class="posterous_short_quote"&gt;
&lt;p&gt;Moving the FreeDesktop driver to prod&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My operating system is Ubuntu 10.04, which apparently means that File::HomeDir will use these new FreeDesktop rules. The big change is that the default data dir is no longer your home directory, but &lt;strong&gt;~/.local/share/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The simple fix was to move my .cpan dir to ~/.local/share/. From then on, everything worked as per usual. This will also affect any other apps that use File::HomeDir to locate your data dir, including Padre.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193666349</link><guid>http://blog.alternation.net/post/49193666349</guid><pubDate>Thu, 03 Jun 2010 18:02:00 -0430</pubDate></item><item><title>Project Stepping Stones</title><description>&lt;p&gt;Ever looked back at something you’ve worked on and thought: “Gee, it’s too bad that project didn’t get to it’s ultimate goal, but, I’ve learned a lot from it.” I have one of those projects. Such is the world of technology, your toolset is constantly evolving and shape-shifting; even “The Next Big Thing” can become obsolete. We move on to the next “Next Big Thing.”&lt;/p&gt;
&lt;p&gt;One such area in the Web Developer’s toolset is “Search.” I’m sure we can all relate to the experience of our first textbox with some behind-the-scenes code doing SQL “SELECT … LIKE” statements. Perhaps at first it was raw DBI calls; maybe moving on to an abstraction layer (ORM and whatnot) shortly thereafter. Here’s where things get interesting.&lt;/p&gt;
&lt;p&gt;What happens when this is no longer Good Enough(tm). Google being essentially ubiquitous, people expect to plunk some words in the box and magically get what they want out the other side. I put in “Cat Hat” — why didn’t it give me “Cat in the Hat”? Okay, no problem. We can do some field and query normalization; removing stopwords, add term parsing … wait, wait wait. There has to be prior art for this.&lt;/p&gt;
&lt;p&gt;In 2004, the options are somewhat limited as far as Free/Open Source search software goes. Especially in Perl land. &lt;a href="http://swish-e.org/"&gt;Swish-e&lt;/a&gt; looks pretty neat. We actually did some prototyping with it. It was definitely a step ahead of plain old SQL. &lt;a href="http://search.cpan.org/"&gt;Plucene&lt;/a&gt; came on the scene. Unfortunately, it’s poor performance was a bit of a non-starter for us. The fact that it was modeled after the &lt;a href="http://lucene.apache.org/java/"&gt;Lucene Java library&lt;/a&gt;, however, caught my eye.&lt;/p&gt;
&lt;p&gt;I wanted to harness their project and its community, and bring it into our little Perl world. Luckily for me, someone else had already started down that road. The Lucene Web Service was a project by Robert Kaye, sponsored by CD Baby, which allowed users to talk to Lucene via an XML-based web service. After using it for a while, we developed some patches for bug fixes and enhancements. Because of our momentum with the project, we were eventually given total control over its development.&lt;/p&gt;
&lt;p&gt;We attempted to strengthen the project by hooking into some existing standards. We leveraged the &lt;a href="http://bitworking.org/projects/atom/"&gt;Atom Publishing Protocol&lt;/a&gt; as an analogy for dealing with indexes and documents. Search results were returned as an &lt;a href="http://opensearch.org/"&gt;OpenSearch&lt;/a&gt; document. A document’s field-value pairs were listed in the &lt;a href="http://microformats.org/wiki/xoxo"&gt;XOXO microformat&lt;/a&gt;. Creating a client for this setup meant a bunch of glue between the existing components (&lt;a href="http://search.cpan.org/perldoc?XML%3A%3AAtom%3A%3AClient"&gt;XML::Atom::Client&lt;/a&gt; and &lt;a href="http://search.cpan.org/perldoc?WWW%3A%3AOpenSearch"&gt;WWW::OpenSearch&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Almost in parallel, the &lt;a href="http://lucene.apache.org/solr"&gt;Solr project&lt;/a&gt; emerged. Similar idea, much more support behind it. In the end, our idea never got very far, and Solr has turned out to be a fabulous product — which we now use.&lt;/p&gt;
&lt;p&gt;To this end, the &lt;a href="http://lucene-ws.net/"&gt;Lucene WebService website&lt;/a&gt; will (finally) be shutting down in about a week’s time. I’ve moved the pertinent code and wiki data to &lt;a href="http://github.com/lucene-ws"&gt;github&lt;/a&gt; in case anyone wants it. I still think it has some niche applications, but without some serious revamping of the java code, it will likely just rot.&lt;/p&gt;
&lt;p&gt;At least it’s a project that has led me to bigger and better things.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193666834</link><guid>http://blog.alternation.net/post/49193666834</guid><pubDate>Thu, 04 Feb 2010 00:05:00 -0430</pubDate></item><item><title>New Padre-Plugin-PerlTidy release handles project-specific setting</title><description>&lt;p&gt;&lt;a href="http://search.cpan.org/dist/Padre"&gt;Padre 0.54&lt;/a&gt; introduced a couple of project-specific settings, one for Perl::Critic and another for Perl::Tidy. As the maintainer of the &lt;a href="http://search.cpan.org/dist/Padre-Plugin-PerlTidy"&gt;Perl::Tidy plugin&lt;/a&gt;, it was only natural that I should implement support for this new feature.&lt;/p&gt;
&lt;p&gt;Unfortunately, it wasn’t immediately obvious to me how I might get at this info. With Adam’s guidance, I was able to write the following:&lt;/p&gt;
&lt;blockquote class="posterous_short_quote"&gt;
&lt;p&gt;my $tidyrc = $self-&amp;gt;current-&amp;gt;document-&amp;gt;project-&amp;gt;config-&amp;gt;config_perltidy;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s a mess of chained method calls, but, it pretty clear that we’re getting the current document’s project-related config, if it exists.&lt;/p&gt;
&lt;p&gt;Here’s a screenshot of the new version of the plugin in action.&lt;/p&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;
&lt;div&gt;&lt;a href="https://dl.dropbox.com/s/ugpizlz48hmzaex/media_httpa3voxcom6a0_triuz.jpg"&gt;&lt;img alt="image" src="https://dl.dropbox.com/s/6e4i0uz2xpes8ba/media_httpa3voxcom6a0_triuz.jpg.scaled500.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="enclosure-meta"&gt;
&lt;div class="enclosure-asset-name"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b0123dded35c3860c.html" title="Padre w/ Padre-Plugin-PerlTdiy 0.09"&gt;Padre w/ Padre-Plugin-PerlTdiy 0.09&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://search.cpan.org/dist/Padre-Plugin-PerlTidy"&gt;Grab version 0.09 from CPAN now.&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193671867</link><guid>http://blog.alternation.net/post/49193671867</guid><pubDate>Fri, 15 Jan 2010 17:10:00 -0430</pubDate></item><item><title>The last five months</title><description>&lt;p&gt;I haven’t bothered to post anything in the last five months. With Christmas just around the corner, I figure this is as good a time as any to play catch up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Padre-Plugin-PerlTidy&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A new release of this plugin — changes made mostly by other people.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Gedcom-FOAF&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Rather than using a base url for the data, you can now specify a number of url templates. This makes the module actually useful. Thanks to Chris Prather for working through this with me.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Geo-IPfree&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A couple of releases with various refactoring bits and bug fixes. The folks at software77.net now produce a data file specifically for this module. I will ship an updated copy with every release. Refactoring this code has been pretty satisfying, though there are some parts of the module API which I detest but I will be unable to modify them.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Image-Textmode/Image-Textmode-Reader-ANSI-XS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Various bug fixes thanks to some testing with a large dataset from Doug Moore and sixteencolors.net&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Config-Any&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Released version 0.18, which prefers YAML::XS over any other YAML parser. This created a number of issues with the HTML::FormFu crowd as existing parsers allowed this sort of syntax “auto_id: %n” — whereas YAML::XS complains about an exposed percent sign. The easy fix is to wrap the string in quotes “auto_id: ‘%n’”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;GD-Image-Scale2x&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Fixed a nasty bug due to a missing my() which randomly broke the module on some platforms.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;CGI-Application-PhotoGallery&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A tiny patch for max_height included in this release. This still has some pending issues in RT — though I have a hard time justifying spending any time on them as I don’t use this module at all.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Catalyst-Model-WebService-Solr&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Apparently, this module was basically broken. Fixed thanks to a supplied patch.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Template-Provider&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Another kind user supplied some patches/info to support mod_perl and fully qualified template names.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;CQL-Parser/SRU&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Removing use of UNIVERSAL-&amp;gt;import from these module. Not even sure why it was there to begin with.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;WebService-Solr&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A couple of release of this module. Includes some bug fixes, feature additions and Solr 1.4 compatibility.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Remove auto_install from my dists&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Although, as I understand it, auto_install now works in newer versions of Module::Install, I’ve decided to remove it from my dists to avoid any issues.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;See you next year.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49193672428</link><guid>http://blog.alternation.net/post/49193672428</guid><pubDate>Fri, 18 Dec 2009 22:32:00 -0430</pubDate></item><item><title>Adding a feature to Padre</title><description>&lt;p&gt;I’ve been following (and even contributing to) the &lt;a href="http://padre.perlide.org/"&gt;Padre IDE&lt;/a&gt; project from very early on. I’ve watched it grow from very modest beginings into something quite impressive — usable, even.&lt;/p&gt;
&lt;p&gt;Its deep integration with Perl is such a killer feature. There are already a good &lt;a href="http://search.cpan.org/search?query=Padre-Plugin&amp;amp;mode=dist"&gt;two-dozen plugins&lt;/a&gt;, one of which I’ve been shepherding: &lt;a href="http://search.cpan.org/dist/Padre-Plugin-PerlTidy"&gt;Padre-Plugin-PerlTidy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In light of Padre’s first birthday, I decided I wanted to give something back into the Padre core rather than just an ancillary project.&lt;/p&gt;
&lt;p&gt;I tend to use gedit on Ubuntu, and I rather liked the “right margin” option. This option puts a gray vertical line on whichever column you specify. It’s an easy visual queue for long lines. It turns out that the Scintilla editor component supports this feature and all I had to do was enable the menus and dialogs to allow users to toggle the method.&lt;/p&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b01101638c2b0860b.html"&gt;&lt;img alt="image" src="src" title='Padre with \" class='/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><link>http://blog.alternation.net/post/49193673117</link><guid>http://blog.alternation.net/post/49193673117</guid><pubDate>Tue, 28 Jul 2009 14:53:00 -0430</pubDate></item><item><title>Dear Module Author</title><description>&lt;p&gt;Dear Module Author,&lt;/p&gt;
&lt;p&gt;When preparing to upload a new release of your module to PAUSE could you please review your Changes file?&lt;/p&gt;
&lt;p&gt;Did you remember to update it? Does it contain something meaningful? Here are a couple of examples of Changes entries which mean very little to me at a glance:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Bug Fixed&lt;/li&gt;
&lt;li&gt;Foo::Bar Fixed&lt;/li&gt;
&lt;li&gt;Fixed RT #12345&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Also, your SCM revision log does not a good Changes file make.&lt;/p&gt;
&lt;p&gt;Yes, this is old news. This is just a reminder.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194661224</link><guid>http://blog.alternation.net/post/49194661224</guid><pubDate>Wed, 03 Jun 2009 22:11:00 -0430</pubDate></item><item><title>Elsewhere</title><description>&lt;p&gt;This is just a quick note to let y’all know that I now have a &lt;a href="http://twitter.com/bricas/"&gt;twitter account&lt;/a&gt; and an &lt;a href="http://identi.ca/bricas/"&gt;identi.ca account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You have been warned.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194661808</link><guid>http://blog.alternation.net/post/49194661808</guid><pubDate>Tue, 26 May 2009 20:26:00 -0430</pubDate></item><item><title>Benchmark</title><description>&lt;p&gt;As noted in my &lt;a href="http://bricas.vox.com/library/post/develnytprof.html"&gt;last post&lt;/a&gt;, I was able to get a bit of a speed boost based on observations made as a result of code profiling.&lt;/p&gt;
&lt;p&gt;In general, if I want to see if one piece of code is faster than another, I use &lt;a href="http://search.cpan.org/perldoc?Benchmark"&gt;Benchmark&lt;/a&gt;. Benchmark is shipped as part of the core set of modules, so there’s no need to load up CPAN to get started. Its simplest usage, and the one i prefer looks something like this:&lt;/p&gt;
&lt;blockquote class="posterous_medium_quote"&gt;
&lt;p&gt;&lt;br/&gt;    use Benchmark ();&lt;br/&gt;    &lt;br/&gt;    Benchmark::cmpthese( $count, {&lt;br/&gt;        Foo1 =&amp;gt; sub {&lt;br/&gt;            # code to do Foo1 here&lt;br/&gt;        },&lt;br/&gt;        Foo2 =&amp;gt; sub {&lt;br/&gt;            # code to do Foo1 here&lt;br/&gt;        },&lt;br/&gt;    } );&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of note is that $count can be negative, which will then signify how many seconds to run instead of the number of times. The result looks like this:&lt;/p&gt;
&lt;blockquote class="posterous_medium_quote"&gt;
&lt;p&gt;&lt;br/&gt;             Rate Foo1 Foo2&lt;br/&gt;    Foo1 108665/s   — -38%&lt;br/&gt;    Foo2 175460/s  61%   —&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s pretty easy to see that Foo2 was faster. Using the above it was easy for me to test the XS-based ANSI parser vs the pure Perl version.&lt;/p&gt;
&lt;p&gt;4k worth of ANSI over 10 seconds yields the following:&lt;/p&gt;
&lt;blockquote class="posterous_medium_quote"&gt;
&lt;p&gt;&lt;br/&gt;         Rate    PP    XS&lt;br/&gt;    PP 15.7/s    — -96%&lt;br/&gt;    XS  379/s 2316%    —&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For giggles, i tested it against a 33k ANSI, giving:&lt;/p&gt;
&lt;blockquote class="posterous_medium_quote"&gt;
&lt;p&gt;&lt;br/&gt;         Rate    PP    XS&lt;br/&gt;    PP 2.23/s    — -96%&lt;br/&gt;    XS 58.7/s 2528%    —&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looks like a success to me!&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194662207</link><guid>http://blog.alternation.net/post/49194662207</guid><pubDate>Thu, 21 May 2009 20:00:00 -0430</pubDate></item><item><title>Devel::NYTProf</title><description>&lt;p&gt;Another week another QA tool.&lt;/p&gt;
&lt;p&gt;This week I’m going to talk about &lt;a href="http://search.cpan.org/dist/Devel-NYTProf/"&gt;Devel::NYTProf&lt;/a&gt; (aka NYTProf).&lt;/p&gt;
&lt;p&gt;To start, if you’re interested in profilers, you should check out the brief &lt;a href="http://search.cpan.org/dist/Devel-NYTProf/lib/Devel/NYTProf.pm#HISTORY"&gt;history section&lt;/a&gt; of the pod, then take a glance at its &lt;a href="http://search.cpan.org/dist/Devel-NYTProf/lib/Devel/NYTProf.pm#DESCRIPTION"&gt;features&lt;/a&gt;. Until recently, I hadn’t been very interested in profiling my code. I didn’t really have anything that needed the profiling, and the tools just seemed a bit awkward to me. This changed for me when I saw the output from nytprofhtml (&lt;a href="http://timbunce.files.wordpress.com/2008/07/nytprof-perlcritic-index.png"&gt;1&lt;/a&gt;, &lt;a href="http://timbunce.files.wordpress.com/2008/07/nytprof-perlcritic-all-perl-files.png"&gt;2&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;While working on Image-TextMode, I noticed that parsing large (~75k) ANSI files was getting to be pretty slow. I decided to run NYTProf on the parsing code, and here’s what I got:&lt;/p&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;
&lt;div&gt;&lt;a href="https://dl.dropbox.com/s/ktthvkpxn2xfbs8/media_httpa1voxcom6a0_zazjh.jpg"&gt;&lt;img alt="image" src="https://dl.dropbox.com/s/ad9vyyd3cdkg3cu/media_httpa1voxcom6a0_zazjh.jpg.scaled500.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="enclosure-meta"&gt;
&lt;div class="enclosure-asset-name"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b011016826a89860d.html" title="Profiling - Before"&gt;Profiling - Before&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The putpixel(), width() and height() methods are called for every character/attribute combo stored for the image. This turns out to be a really big inefficiency. I’ve had some XS code in my back pocket for ANSI parsing, so I decided to whip up a replacement parser using that code and run the profiler again.&lt;/p&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;
&lt;div&gt;&lt;a href="https://dl.dropbox.com/s/z480cl2uapppzs4/media_httpa6voxcom6a0_bBhwE.jpg"&gt;&lt;img alt="image" src="https://dl.dropbox.com/s/arnuzjgve2a5l6h/media_httpa6voxcom6a0_bBhwE.jpg.scaled500.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="enclosure-meta"&gt;
&lt;div class="enclosure-asset-name"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b011016479126860c.html" title="Profiling - After"&gt;Profiling - After&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Huge win! By moving _read() to XS (including putpixel, width, and height) I was able to shave over a second off of the total time (_read inclusive goes from 1.3 seconds to 0.03). Although working with XS was a bit of a pain, it was really great to see such a speed improvement.&lt;/p&gt;
&lt;p&gt;I recommend everyone take a look at NYTProf if you’re looking find speed inefficients in your code.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194671671</link><guid>http://blog.alternation.net/post/49194671671</guid><pubDate>Mon, 11 May 2009 18:07:00 -0430</pubDate></item><item><title>Perl::Critic</title><description>&lt;p&gt;Holy — this weekly thing goes by way too fast!&lt;/p&gt;
&lt;p&gt;Anyway, as promised, I’m making my first QA tool post. This week, we’re chatting about &lt;a href="http://search.cpan.org/dist/Perl-Critic"&gt;Perl::Critic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Perl::Critic has been around since late 2005. I was able to resist its icy gaze until last fall. So, why wouldn’t I want to jump right in with Perl::Critic early on? Mostly what I imagined was putting a significant amount of time in to bend Perl::Critic policies to my will so I wouldn’t have to change how I code. This is, of course, the wrong way to look at it.&lt;/p&gt;
&lt;p&gt;There’s nothing wrong with having a tool that confirms you’re doing the right thing — but what I really wanted was a tool that showed me the bad habits I’ve learned and gave me a slap on the wrist every time I tried to use them. The easiest way to get started was to copy someone else’s polcy file. RJBS was nice enough to comply.&lt;/p&gt;
&lt;p&gt;For the Image::TextMode project, after adding my own tweaks to the policies, &lt;a href="http://github.com/bricas/image-textmode/blob/0889b780fb657359c3494dbc85c200d8434b6e90/xt/perlcriticrc"&gt;this is the result&lt;/a&gt;. A simple &lt;a href="http://github.com/bricas/image-textmode/blob/0889b780fb657359c3494dbc85c200d8434b6e90/xt/author/critic.t"&gt;automated test&lt;/a&gt; integrates it into my development cycle.&lt;/p&gt;
&lt;p&gt;After running it against my code, it found some issues — most of my which were pretty tame: 2-arg open, lack of pod, plus a few regex and character matching niggles.&lt;/p&gt;
&lt;p&gt;In my policy file, I have two sections: Things I don’t agree with and things I’ve had to disable temporarily. I hope to eventually go back and clean up my code so I can remove the remainder of the temporarily disabled policies. The policies I don’t agree with may change over time, but this is my current list of preferences.&lt;/p&gt;
&lt;p&gt;I have yet to use this setup in any other project, but I think the tool is useful enough that I could put it into place from the very beginning of a project or go back and run it against all of my old projects over time.&lt;/p&gt;
&lt;p&gt;Until next time…&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194672128</link><guid>http://blog.alternation.net/post/49194672128</guid><pubDate>Fri, 01 May 2009 22:11:00 -0430</pubDate></item><item><title>Projects Updates and QA Tools</title><description>&lt;p&gt;NB: This is my first post in the &lt;a href="http://www.shadowcat.co.uk/blog/matt-s-trout/iron-man/#compo"&gt;EPO Iron Man challenge&lt;/a&gt;. (Warning: contains some expletives)&lt;/p&gt;
&lt;p&gt;First and foremost, the long awaited &lt;a href="http://search.cpan.org/dist/Catalyst-Runtime-5.80001/"&gt;Catalyst 5.8&lt;/a&gt; is out! My mind-share has primarily been with the 5.7x series so I’ve been pretty much out of the loop on everything that’s going on. Luckily enough, everything is basically backwards compatible (less any necessary module upgrades).&lt;/p&gt;
&lt;p&gt;Besides the usual round of bug fixes, this release is built on top of &lt;a href="http://search.cpan.org/dist/Moose/"&gt;Moose&lt;/a&gt;. I’m a big fan of Moose and the ease with which it lets me code, so I’m very excited to see this feature. Be sure to check the &lt;a href="http://cpansearch.perl.org/src/FLORA/Catalyst-Runtime-5.80001/Changes"&gt;Changelog&lt;/a&gt; for all of the details.&lt;/p&gt;
&lt;p&gt;As far as my personal projects go, I’ve finally been able to deprecate two of my oldest modules (Image::ANSI and Image::XBin) with the latest release of &lt;a href="http://search.cpan.org/dist/Image-TextMode-0.05/"&gt;Image::TextMode&lt;/a&gt;. This release now mirrors all features provided by the two before it (and then some). It can now write each format (not 100% complete, but release-worthy) — I’ve even included a little bit of naive RLE compression.&lt;/p&gt;
&lt;p&gt;Personal projects let me explore some new/different technologies which may not fit in do my daily $work. One of those would be Moose, as mentioned above (which is now part of our standard “toolkit”). Another would be XS. Writing &lt;a href="http://search.cpan.org/dist/Image-TextMode-Reader-ANSI-XS"&gt;Image::TextMode::Reader::ANSI::XS&lt;/a&gt; was very eye opening as far as hooking Perl and C code together and illuminating the Perl internals for me.&lt;/p&gt;
&lt;p&gt;Recently, I’ve been in tune with adding new QA tools to my repertoire, such as: Benchmark (high time I learned more about it), Perl::Critic (again, about time) and Devel::NYTProf.&lt;/p&gt;
&lt;p&gt;If I’m going to keep up with this “Iron Man Challenge,” then maybe I will save my favorite QA tools for their own post. Stay tuned!&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194672502</link><guid>http://blog.alternation.net/post/49194672502</guid><pubDate>Wed, 22 Apr 2009 20:34:00 -0430</pubDate></item><item><title>github</title><description>&lt;p&gt;Like so many before me, I have now joined the github cabal.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/bricas"&gt;Check out my projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the more interesting parts of github is their breakdown of &lt;a href="http://github.com/languages"&gt;projects by language&lt;/a&gt;. At the time of this post, Perl has 6% of the projects — tied with C, 1% more than PHP, 3% less than Python and most surprisingly 1% less than “Shell”.&lt;/p&gt;
&lt;p&gt;Obviously, given the origin of github, Ruby is way in the lead with 30%. But, I have a feeling that as people get more savvy about SCM tools, especially distributed SCM tools, Perl will make a significant dent in that.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194672917</link><guid>http://blog.alternation.net/post/49194672917</guid><pubDate>Tue, 24 Mar 2009 17:19:00 -0430</pubDate></item><item><title>Catalyst 5.71000</title><description>&lt;p&gt;Like i said back in &lt;a href="http://bricas.vox.com/library/post/catalyst-571-is-nigh.html"&gt;July&lt;/a&gt;, Catalyst 5.71000 would happen before the moose-ified 5.80 gets shipped. That day is &lt;a href="http://search.cpan.org/dist/Catalys-Runtime-5.71000/"&gt;here&lt;/a&gt;. Here’s the basics on what’s new since 5.7015:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Relatively chained actions   &lt;/li&gt;
&lt;li&gt;PathPrefix (I only mentioned that, oh, &lt;a href="http://bricas.vox.com/library/post/catalyst-tip-generic-base-controllers.html"&gt;2 years ago&lt;/a&gt; :)   &lt;/li&gt;
&lt;li&gt;$c-&amp;gt;go and $c-&amp;gt;visit (they do a full dispatch to the action; this should kill the &lt;a href="http://search.cpan.org/dist/Catalyst-Plugin-SubRequest/"&gt;SubRequest plugin&lt;/a&gt;)   &lt;/li&gt;
&lt;li&gt;Refactored component resolution (which is something else &lt;a href="http://bricas.vox.com/library/post/component-resolution-in-57100.html"&gt;I worked on&lt;/a&gt;)   &lt;/li&gt;
&lt;li&gt;Documentation improvements   &lt;/li&gt;
&lt;li&gt;Misc bug fixes&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There’s a &lt;a href="http://cpansearch.perl.org/src/MRAMBERG/Catalyst-Runtime-5.71000/Changes"&gt;full changelog&lt;/a&gt; available. You might also browse the &lt;a href="http://search.cpan.org/diff?from=Catalyst-Runtime-5.7015&amp;amp;to=Catalyst-Runtime-5.71000"&gt;search.cpan diff from 5.7015 to 5.7100&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194673411</link><guid>http://blog.alternation.net/post/49194673411</guid><pubDate>Tue, 20 Jan 2009 00:34:00 -0430</pubDate></item><item><title>Series of articles featuring WebService::Solr</title><description>&lt;p&gt;I’ve had a number of people show interest in &lt;a href="http://search.cpan.org/dist/WebService-Solr/"&gt;WebService::Solr&lt;/a&gt; since its release last fall. This is really encouraging.&lt;/p&gt;
&lt;p&gt;Especially encouraging is seeing &lt;a href="http://infomotions.com/"&gt;Eric Lease Morgan&lt;/a&gt;’s &lt;a href="http://infomotions.com/blog/2009/01/fun-with-webservicesolr-part-i-of-iii/"&gt;first article in a series of three&lt;/a&gt; dealing with indexing and searching using WebService::Solr. The initial post deals with some basic definitions, setting up Solr and writing a basic set of indexing and searching scripts.&lt;/p&gt;
&lt;p&gt;It’ll be great to see how the module gets used in a truly practical way.&lt;/p&gt;</description><link>http://blog.alternation.net/post/49194673759</link><guid>http://blog.alternation.net/post/49194673759</guid><pubDate>Fri, 09 Jan 2009 00:24:00 -0430</pubDate></item><item><title>The hazards of winter driving</title><description>&lt;p&gt;I’m not exactly sure how it happened, but these photos were taken from the 3rd floor of our office building about an hour ago:&lt;/p&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;
&lt;div&gt;&lt;a href="https://dl.dropbox.com/s/c8z1lrpkotw2z7q/media_httpa7voxcom6a0_mexke.jpg"&gt;&lt;img alt="image" src="https://dl.dropbox.com/s/13tamzq8fq2kmj9/media_httpa7voxcom6a0_mexke.jpg.scaled500.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="enclosure-meta"&gt;
&lt;div class="enclosure-asset-name"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b0109d07a639f000e.html" title="The Accident"&gt;The Accident&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;div class="enclosure enclosure-center enclosure-large photo-enclosure"&gt;
&lt;div class="enclosure-inner"&gt;
&lt;div class="enclosure-list"&gt;
&lt;div class="enclosure-item photo-asset last"&gt;
&lt;div class="enclosure-image"&gt;
&lt;div&gt;&lt;a href="https://dl.dropbox.com/s/a2ukjrkdwfjz1nc/media_httpa0voxcom6a0_ojgvj.jpg"&gt;&lt;img alt="image" src="https://dl.dropbox.com/s/igg5gzb3ubnu0ie/media_httpa0voxcom6a0_ojgvj.jpg.scaled500.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="enclosure-meta"&gt;
&lt;div class="enclosure-asset-name"&gt;&lt;a href="http://bricas.vox.com/library/photo/6a00d09e62f541be2b0109811c6750000c.html" title="The Aftermath"&gt;The Aftermath&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;Note the fire hydrant in the second picture — apparently she was on top of it.&lt;/div&gt;</description><link>http://blog.alternation.net/post/49194683505</link><guid>http://blog.alternation.net/post/49194683505</guid><pubDate>Wed, 07 Jan 2009 23:53:00 -0430</pubDate></item></channel></rss>
