<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2476501167135957943</id><updated>2011-11-27T16:12:47.135-08:00</updated><category term='mvc'/><category term='module monday'/><category term='css'/><category term='backlog'/><category term='mysql'/><category term='java'/><category term='spring'/><category term='html'/><category term='orm'/><category term='attributes'/><category term='perl'/><category term='mac os x'/><category term='catalyst'/><category term='lalocalfood.com'/><category term='version control'/><category term='productivity'/><category term='test-driven development'/><category term='stripes'/><category term='database'/><title type='text'>Agile Perl (and other technologies)</title><subtitle type='html'>Notes on agile development, Perl, Java, the tech life and whatever catches my fancy</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-3134221410565973946</id><published>2010-06-30T14:37:00.001-07:00</published><updated>2010-06-30T14:37:40.219-07:00</updated><title type='text'>Deep thought</title><content type='html'>Quick and dirty code is seldom quick in the long run. It is, however, always dirty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-3134221410565973946?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/3134221410565973946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=3134221410565973946' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/3134221410565973946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/3134221410565973946'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2010/06/deep-thought.html' title='Deep thought'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-4038649022854058472</id><published>2009-07-30T09:09:00.000-07:00</published><updated>2009-07-30T09:14:10.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perlmonks is a bit of an embarrassment</title><content type='html'>The site is painfully slow, not really a good advertisement for Perl as a web implementation language. And now the latest revelation is that &lt;a href="http://www.perlmonks.org/?node_id=784123"&gt;passwords were stolen because they were stored in plaintext&lt;/a&gt;. I hate to say it, but perlmonks is probably a significant reason why Perl is a language in danger of dying out. Not just the technical issues (although perlmonks is a painfully difficult site to use), but cultural as well as there's a rather hierophantic attitude on the site, maybe no worse than at similar sites of other technologies, but my impression is that it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-4038649022854058472?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/4038649022854058472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=4038649022854058472' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4038649022854058472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4038649022854058472'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/07/perlmonks-is-bit-of-embarrassment.html' title='Perlmonks is a bit of an embarrassment'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-6472742226432784371</id><published>2009-07-07T16:25:00.000-07:00</published><updated>2009-07-07T16:28:35.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Stripes</title><content type='html'>I came across a reference to Stripes while trying to figure out how to handle some mapping issues in Spring MVC, so I'm taking a look at it and trying to use it in place of Spring MVC on the view part of a learning app I'm building. My property mapping question is explicitly answered in the documentation, which makes me feel comfortable with the prospect of working with Stripes, although the instructions for installing and using the Stripes archetype failed badly in my environment. I'll come back to this at some point in the future, I suppose, assuming that Stripes does all that I would like it to and I'll skip that. But in the meantime, it doesn't appear that I really need it for what I'm doing, so I'll happily continue on my way as I develop my app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-6472742226432784371?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/6472742226432784371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=6472742226432784371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/6472742226432784371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/6472742226432784371'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/07/stripes.html' title='Stripes'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-8698177855391204852</id><published>2009-06-04T16:24:00.000-07:00</published><updated>2009-06-04T16:26:08.291-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS z-index not working</title><content type='html'>It's worth noting that z-index is only applied to absolutely positioned elements.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-8698177855391204852?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/8698177855391204852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=8698177855391204852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/8698177855391204852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/8698177855391204852'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/06/css-z-index-not-working.html' title='CSS z-index not working'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-768017227738258998</id><published>2009-03-13T21:34:00.000-07:00</published><updated>2009-03-13T21:38:46.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='attributes'/><title type='text'>Arg, Perl attributes don't do what I want them to</title><content type='html'>Apparently, there is no way to get the name of a non-subroutine with an attribute. That means that if I want to annotate fields in a class for serialization, I need to identify the column for each one. On the plus side, I guess that means that I can move pass this particular hurdle (for now, at least).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-768017227738258998?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/768017227738258998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=768017227738258998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/768017227738258998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/768017227738258998'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/03/arg-perl-attributes-dont-do-what-i-want.html' title='Arg, Perl attributes don&apos;t do what I want them to'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-5778837160491885389</id><published>2009-03-12T08:51:00.000-07:00</published><updated>2009-03-12T08:54:00.478-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Time to start again</title><content type='html'>I had thought that Attribute::Handlers was going to be the quick and easy solution to dealing with attributes for my ORM, but it turns out that it can only get the name of a subroutine with an attribute, not arrays (or hashes). I'm thinking that perhaps the solution is to (old-school) subclass Object::InsideOut and integrate with its attribute parsing code... This would also enable me to see the :Type attribute from OIO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-5778837160491885389?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/5778837160491885389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=5778837160491885389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5778837160491885389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5778837160491885389'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/03/time-to-start-again.html' title='Time to start again'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-4665286674145956982</id><published>2009-02-16T18:10:00.000-08:00</published><updated>2009-02-16T18:15:27.002-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>A roadmap for my Perl ORM</title><content type='html'>Mostly for my own purposes (and subject to modification).&lt;br /&gt;&lt;br /&gt;0.1 Handle serializing a simple OIO class&lt;br /&gt;0.2 Handle de-serializing a simple OIO class&lt;br /&gt;0.3 Allow embedding classes (1-1 relationship) in a class (serialize/deserialize)&lt;br /&gt;1.0 Allow 1-many, many-1, many-many relationships between classes (to separate tables, using join table if necessary)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-4665286674145956982?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/4665286674145956982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=4665286674145956982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4665286674145956982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4665286674145956982'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/02/roadmap-for-my-perl-orm.html' title='A roadmap for my Perl ORM'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-2296081772400089312</id><published>2009-02-10T21:50:00.001-08:00</published><updated>2009-02-10T22:01:19.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Thoughts on ORM in Perl</title><content type='html'>One thing that I really admire from Java world is the EJB3 Persistence annotations. A class can be made persistent with a simple mark-up:&lt;pre&gt;&lt;br /&gt;@Entity&lt;br /&gt;class Foo {&lt;br /&gt;   private int count;&lt;br /&gt;   private String name;&lt;br /&gt;   @Transient&lt;br /&gt;   private int temp_var;&lt;br /&gt;   ....&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;code&gt;@Entity&lt;/code&gt; notation indicates that the class should map to a table (unless overridden, it will use the class name as the table name). Every field then automatically maps to a column in the table (column names can be overridden) unless marked with the &lt;code&gt;@Transient&lt;/code&gt; annotation.&lt;br /&gt;&lt;br /&gt;I was thinking that something similar could be executed in Perl using perl attributes. I could do something like&lt;pre&gt;&lt;br /&gt;package Foo;&lt;br /&gt;use Object::InsideOut;&lt;br /&gt;&lt;br /&gt;my @int :Field :Entity;&lt;br /&gt;my @string :Field :Entity;&lt;br /&gt;my @temp_var :Field;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Using something like Object::InsideOut seems essential for this sort of attribute-based mark-up, although perhaps I should look at Moose instead (although that does seem to have some significant performance penalties). There are some questions about how to handle exporting the serialization routines. Should I work towards a DAO solution or set up serialization routines directly in the class (perhaps as protected by default with the class making a decision about whether to provide public methods to expose these to clients.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-2296081772400089312?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/2296081772400089312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=2296081772400089312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/2296081772400089312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/2296081772400089312'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/02/thoughts-on-orm-in-perl.html' title='Thoughts on ORM in Perl'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-1113255681760669906</id><published>2009-02-03T17:22:00.000-08:00</published><updated>2009-02-03T17:27:08.119-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='attributes'/><title type='text'>A tutorial on attributes</title><content type='html'>The perldoc on &lt;a href="http://perldoc.perl.org/attributes.html"&gt;attributes&lt;/a&gt; is a bit opaque, so digging about for information on how to program attributes in Perl, I managed to come across slides from a talk at london.pm &lt;a href="http://london.pm.org/lpw-2005/talks/2005/casey_west-using_attributes_effectively.pdf"&gt;Using Attributes Effectively (PDF)&lt;/a&gt;. It suffers a bit in being only the slides and not the talk, but it does cover some things (like the handler functions) that seem to be largely undocumented elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-1113255681760669906?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/1113255681760669906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=1113255681760669906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/1113255681760669906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/1113255681760669906'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/02/tutorial-on-attributes.html' title='A tutorial on attributes'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-2818109880859927407</id><published>2009-01-29T22:36:00.000-08:00</published><updated>2009-01-29T23:53:45.092-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>MySQL bench marks, comparing MyISAM to InnoDB and evaluating the performance hit of foreign keys</title><content type='html'>During an interview earlier this week, the question of how using foreign keys would impact performance on MySQL. I decided that it would be worthwhile to actually check this out in practice. I started out with a basic structure as follows:&lt;pre&gt;&lt;br /&gt;CREATE TABLE IF NOT EXISTS `a` (&lt;br /&gt;  `id` int(11) NOT NULL,&lt;br /&gt;  `data` varchar(255) NOT NULL,&lt;br /&gt;  `data2` varchar(255) NOT NULL,&lt;br /&gt;  PRIMARY KEY  (`id`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;CREATE TABLE IF NOT EXISTS `b` (&lt;br /&gt;  `id` int(11) NOT NULL,&lt;br /&gt;  `a_id` int(11) NOT NULL,&lt;br /&gt;  `data3` varchar(255) NOT NULL,&lt;br /&gt;  PRIMARY KEY  (`id`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then added a second database where we had a foreign key:&lt;pre&gt;&lt;br /&gt;CREATE TABLE IF NOT EXISTS `b` (&lt;br /&gt;  `id` int(11) NOT NULL,&lt;br /&gt;  `a_id` int(11) NOT NULL,&lt;br /&gt;  `data3` varchar(255) NOT NULL,&lt;br /&gt;  PRIMARY KEY  (`id`),&lt;br /&gt;  KEY `a_id` (`a_id`)&lt;br /&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;ALTER TABLE `b`&lt;br /&gt;  ADD CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`) ON DELETE CASCADE;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And just to make things complete, I added a third database identical to the first, but using MyISAM as the engine.&lt;br /&gt;&lt;br /&gt;The first thing is to do a data population. I wrote a perl script to generate 10,000 inserts of random data into table A, each with 0-5 random inserts into table B. &lt;br /&gt;Next a selection of queries. I did 500 variations of &lt;code&gt;SELECT * FROM a INNER JOIN b ON (a.id=b.a_id) WHERE a.id=?&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For deletes, I deleted 500 rows, using &lt;code&gt;DELETE FROM a WHERE id=?; DELETE FROM b WHERE a_id=?&lt;/code&gt; for the databases without the foreign key and the simple DELETE FROM a for the foreign key database.&lt;br /&gt;&lt;br /&gt;The results for inserts:&lt;table&gt;&lt;tr&gt;&lt;th&gt;database&lt;/th&gt;&lt;th&gt;insert time (s)&lt;/th&gt;&lt;th&gt;select time (s)&lt;/th&gt;&lt;th&gt;delete time (s)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InnoDB, no FK&lt;/td&gt;&lt;td&gt;4.5&lt;/td&gt;&lt;td&gt;0.25&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;InnoDB,  FK&lt;/td&gt;&lt;td&gt;4.0&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MyISAM&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;0.75&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;I had always assumed that the advantage of MyISAM over InnoDB was the opposite of what it turned out to be with this benchmark. Perhaps even more surprisingly, the foreign key version of the InnoDB database was uniformly faster than the non FK version. I would have expected to see some overhead at least in the insertion stage, but even on multiple trials, I found a consistent advantage for the foreign keys on the insertion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-2818109880859927407?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/2818109880859927407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=2818109880859927407' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/2818109880859927407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/2818109880859927407'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/01/mysql-bench-marks-comparing-myisam-to.html' title='MySQL bench marks, comparing MyISAM to InnoDB and evaluating the performance hit of foreign keys'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-658274961780556774</id><published>2009-01-17T20:23:00.001-08:00</published><updated>2009-01-17T20:27:27.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='lalocalfood.com'/><title type='text'>Digging back in</title><content type='html'>Having recently been downsized from oversee.net, I'm using some of the time to revisit some of my old projects. At the top of the stack is lalocalfood.com, where the first phase is an improved version of my map of Los Angeles farmer's markets. Coming back to some of the old code, it's interesting to see how much time is necessary to recover my memories of some of this code I haven't touched in years. That said, once I get over that, I'm finding that my code has surprisingly good design where very little effort is required to handle new cases. I should be finished with the scraper code to collect the farmer's market data from the two main sites with one more day's work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-658274961780556774?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/658274961780556774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=658274961780556774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/658274961780556774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/658274961780556774'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2009/01/digging-back-in.html' title='Digging back in'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-4695709094288999414</id><published>2008-04-24T21:33:00.000-07:00</published><updated>2008-04-24T22:08:38.344-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Creating a controller in Catalyst</title><content type='html'>A new controller in Catalyst is registered by running &lt;code&gt;script/&lt;i&gt;APPNAME&lt;/i&gt;_create.pl &lt;i&gt;CONTROLLER_NAME&lt;/i&gt;&lt;/code&gt;. This creates a module in the controller directory and a test in the test directory. These are apparently all that is needed for a controller to be created. &lt;br /&gt;&lt;br /&gt;It's worth noting that /foo can activate either App::Controller::Foo::index() or App::Controller::Root::foo(). However, if both exist, App::Controller::Foo::index() takes precedence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-4695709094288999414?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/4695709094288999414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=4695709094288999414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4695709094288999414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4695709094288999414'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/creating-controller-in-catalyst.html' title='Creating a controller in Catalyst'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-5971027507903752238</id><published>2008-04-21T21:09:00.000-07:00</published><updated>2008-04-21T21:17:20.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='module monday'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Module Monday: Quantum::Superpositions</title><content type='html'>A new weekly feature. I'm going to dig out some of the hidden gems of CPAN. One of the best places to look is &lt;a href="http://search.cpan.org/~dconway/"&gt;Damian Conway's&lt;/a&gt; list of modules and this is one fun and interesting one.&lt;br /&gt;&lt;br /&gt;Here's a selection of what &lt;a href="http://search.cpan.org/~dconway/Quantum-Superpositions-1.03/lib/Quantum/Superpositions.pm"&gt;Quantum::Superpositions&lt;/a&gt; can do:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$wanted = any("Mr","Ms").any(@names);&lt;br /&gt;if ($name eq $wanted) { print "Reward!"; } &lt;br /&gt;&lt;br /&gt;$okay = all(\&amp;check1,\&amp;check2);&lt;br /&gt;die unless $okay-&gt;();&lt;br /&gt;&lt;br /&gt;my $large =&lt;br /&gt;         all(    BigNum-&gt;new($centillion),&lt;br /&gt;                   BigNum-&gt;new($googol),&lt;br /&gt;                   BigNum-&gt;new($SkewesNum)&lt;br /&gt;          );&lt;br /&gt;@huge =  grep {$_ &gt; $large} @nums;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-5971027507903752238?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/5971027507903752238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=5971027507903752238' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5971027507903752238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5971027507903752238'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/module-monday-quantumsuperpositions.html' title='Module Monday: Quantum::Superpositions'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-1444594232691161558</id><published>2008-04-20T01:20:00.000-07:00</published><updated>2008-04-22T14:48:59.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='backlog'/><title type='text'>Installing Rose::DB::Object</title><content type='html'>For the Backlog project, I was thinking this was going to be a good opportunity to also learn Rose::DB::Object, so I tried installing it via CPAN. Oops, it had some errors along the way. It turns out that SQL::ReservedWords has a dependency on Data::OptList which it doesn't declare. Installing Data::OptList solved that problem, but Rose::DB::Object is still failing its test suite:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;t/db-object-manager..................7/3900 Can't locate object method "format_select_start_sql" via package "Rose::DB::__RoseDBPrivate__::Rose::DB::MySQL" at /Users/dhosek/.cpan/build/Rose-DB-Object-0.769-AXgKMz/blib/lib/Rose/DB/Object/QueryBuilder.pm line 725.&lt;br /&gt;# Looks like you planned 3900 tests but only ran 827.&lt;br /&gt;# Looks like your test died just after 827.&lt;br /&gt;t/db-object-manager.................. Dubious, test returned 255 (wstat 65280, 0xff00)&lt;br /&gt; Failed 3073/3900 subtests &lt;br /&gt; (less 783 skipped subtests: 44 okay)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;My insomnia feels resolved, so I'll come back to this after sleep.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update (21 April)&lt;/b&gt;: I managed to solve the problem: Doing an install of Rose::DB::MySQL then re-trying to install Rose::DB::Object managed to do the trick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-1444594232691161558?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/1444594232691161558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=1444594232691161558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/1444594232691161558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/1444594232691161558'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/installing-rosedbobject.html' title='Installing Rose::DB::Object'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-5057623989959094536</id><published>2008-04-18T21:20:00.000-07:00</published><updated>2008-04-18T21:24:18.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='backlog'/><title type='text'>Learning Catalyst: The Backlog project. Day 1</title><content type='html'>&lt;b&gt;The Plan&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What I'm looking to build is a web application which is designed for maintaining a product backlog. I see the following as the key user stories:&lt;ul&gt;&lt;li&gt; As a programmer, I want the system to use the wiki as its primary display and authentication system (so, users will log into Backlog using their wiki credentials, and the backlog is visible from the wiki).&lt;li&gt; As a programmer, I want the system to import the existing backlog from the wiki.&lt;li&gt; As a User, I want to be able to submit stories to the product backlog.&lt;li&gt; As a product owner, I want to be able to prioritize and arrange the backlog.&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installing Catalyst&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This went far more easily than I expected. A simple CPAN install brought it in with no problems. I guess I was just lucky on that front.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building the core&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Step one was to build the core of the application. I ran &lt;code&gt;catalyst.pl&lt;/code&gt; from the command line and got the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/dev/Backlog&gt; catalyst.pl Backlog&lt;br /&gt;To use the Catalyst development tools including catalyst.pl and the&lt;br /&gt;generated script/myapp_create.pl you need Catalyst::Helper, which is&lt;br /&gt;part of the Catalyst-Devel distribution. Please install this via a&lt;br /&gt;vendor package or by running one of -&lt;br /&gt;&lt;br /&gt;  perl -MCPAN -e 'install Catalyst::Devel'&lt;br /&gt;  perl -MCPANPLUS -e 'install Catalyst::Devel'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Apparently the Catalyst package is divided into two parts, one just for running Catalyst, one for developing Catalyst applications. Fortunately this install was also uneventful.&lt;br /&gt;&lt;br /&gt;Rerunning it, I got&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/dev/Backlog&gt; catalyst.pl Backlog&lt;br /&gt;created "Backlog"&lt;br /&gt;created "Backlog/script"&lt;br /&gt;created "Backlog/lib"&lt;br /&gt;created "Backlog/root"&lt;br /&gt;created "Backlog/root/static"&lt;br /&gt;created "Backlog/root/static/images"&lt;br /&gt;created "Backlog/t"&lt;br /&gt;created "Backlog/lib/Backlog"&lt;br /&gt;created "Backlog/lib/Backlog/Model"&lt;br /&gt;created "Backlog/lib/Backlog/View"&lt;br /&gt;created "Backlog/lib/Backlog/Controller"&lt;br /&gt;created "Backlog/backlog.yml"&lt;br /&gt;created "Backlog/lib/Backlog.pm"&lt;br /&gt;created "Backlog/lib/Backlog/Controller/Root.pm"&lt;br /&gt;created "Backlog/README"&lt;br /&gt;created "Backlog/Changes"&lt;br /&gt;created "Backlog/t/01app.t"&lt;br /&gt;created "Backlog/t/02pod.t"&lt;br /&gt;created "Backlog/t/03podcoverage.t"&lt;br /&gt;created "Backlog/root/static/images/catalyst_logo.png"&lt;br /&gt;created "Backlog/root/static/images/btn_120x50_built.png"&lt;br /&gt;created "Backlog/root/static/images/btn_120x50_built_shadow.png"&lt;br /&gt;created "Backlog/root/static/images/btn_120x50_powered.png"&lt;br /&gt;created "Backlog/root/static/images/btn_120x50_powered_shadow.png"&lt;br /&gt;created "Backlog/root/static/images/btn_88x31_built.png"&lt;br /&gt;created "Backlog/root/static/images/btn_88x31_built_shadow.png"&lt;br /&gt;created "Backlog/root/static/images/btn_88x31_powered.png"&lt;br /&gt;created "Backlog/root/static/images/btn_88x31_powered_shadow.png"&lt;br /&gt;created "Backlog/root/favicon.ico"&lt;br /&gt;created "Backlog/Makefile.PL"&lt;br /&gt;created "Backlog/script/backlog_cgi.pl"&lt;br /&gt;created "Backlog/script/backlog_fastcgi.pl"&lt;br /&gt;created "Backlog/script/backlog_server.pl"&lt;br /&gt;created "Backlog/script/backlog_test.pl"&lt;br /&gt;created "Backlog/script/backlog_create.pl"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;running &lt;code&gt;./Backlog/script/backlog_server.pl&lt;/code&gt; started up the web server on port 3000 and I was able to verify that I had a working Catalyst application to begin playing with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-5057623989959094536?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/5057623989959094536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=5057623989959094536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5057623989959094536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/5057623989959094536'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/learning-catalyst-backlog-project-day-1.html' title='Learning Catalyst: The Backlog project. Day 1'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-4627453598450549301</id><published>2008-04-17T20:23:00.000-07:00</published><updated>2008-04-17T20:29:13.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>The @INC array can be more dynamic than you think</title><content type='html'>We can put subroutine references, array references and objects into the &lt;code&gt;@INC&lt;/code&gt; array. See &lt;a href="http://perldoc.perl.org/functions/require.html"&gt;perldoc -f require&lt;/a&gt; for the hairy details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-4627453598450549301?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/4627453598450549301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=4627453598450549301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4627453598450549301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4627453598450549301'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/inc-array-can-be-more-dynamic-than-you.html' title='The @INC array can be more dynamic than you think'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-9112430619078519355</id><published>2008-04-15T13:42:00.000-07:00</published><updated>2008-04-15T13:45:17.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test-driven development'/><title type='text'>Test-first doesn't mean every test must be written before you start coding</title><content type='html'>It's worth noting that test-first doesn't mean that &lt;i&gt;all&lt;/i&gt; the tests have to be written before any code is written. In fact, in some cases, it's actually impossible to write the test before the implementation is at least partly scoped out (e.g., when it's necessary to mock objects or modules external to what you're testing). A lot of test cases end up coming up during the development process. Just like elsewhere in agile development, the secret is in tight loops. Write the test as soon as possible, but no sooner than necessary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-9112430619078519355?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/9112430619078519355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=9112430619078519355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/9112430619078519355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/9112430619078519355'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/test-first-doesnt-mean-every-test-must.html' title='Test-first doesn&apos;t mean every test must be written before you start coding'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-4899545269922794884</id><published>2008-04-07T19:11:00.001-07:00</published><updated>2008-04-11T10:43:22.879-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Installing DBD::mysql on OS X Leopard 10.5.2</title><content type='html'>One of those minor nightmare installs. I need this though, so I've gotta work for a while.&lt;br /&gt;&lt;br /&gt;Here is the problem that shows up:&lt;pre&gt;&lt;br /&gt;~/.cpan/build/DBD-mysql-4.006-j5Hpiv&gt; prove -v -l t/00base.t&lt;br /&gt;t/00base......&lt;br /&gt;1..5&lt;br /&gt;ok 1&lt;br /&gt;ok 2&lt;br /&gt;ok 3&lt;br /&gt;install_driver(mysql) failed: Can't locate loadable object for module DBD::mysql in @INC (@INC contains: /Users/dhosek/.cpan/build/DBD-mysql-4.006-j5Hpiv/lib /Users/dhosek/.cpan/build/DBD-mysql-4.006-j5Hpiv/lib /System/Library/Perl/5.8.8/darwin-thread-multi-2level /System/Library/Perl/5.8.8 /Library/Perl/5.8.8/darwin-thread-multi-2level /Library/Perl/5.8.8 /Library/Perl /Network/Library/Perl/5.8.8/darwin-thread-multi-2level /Network/Library/Perl/5.8.8 /Network/Library/Perl /System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level /System/Library/Perl/Extras/5.8.8 /Library/Perl/5.8.6 /Library/Perl/5.8.1 .) at (eval 3) line 3&lt;br /&gt;Compilation failed in require at (eval 3) line 3.&lt;br /&gt;Perhaps a module that DBD::mysql requires hasn't been fully installed&lt;br /&gt; at t/00base.t line 38&lt;br /&gt; Dubious, test returned 2 (wstat 512, 0x200)&lt;br /&gt; Failed 2/5 subtests &lt;br /&gt;&lt;br /&gt;Test Summary Report&lt;br /&gt;-------------------&lt;br /&gt;t/00base.t (Wstat: 512 Tests: 3 Failed: 0)&lt;br /&gt;  Non-zero exit status: 2&lt;br /&gt;  Parse errors: Bad plan.  You planned 5 tests but ran 3.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;First step, is that I'm finding that the blib/arch/auto/DBD/mysql/mysql.so file is not being created.&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;Actually, that's not the problem! Looking closer, I'm seeing that the .bs and .bundle files are apparently the ones that apply now. Interestingly using prove -b t/00base.t does in fact work. But make test has the same test fail...&lt;br /&gt;&lt;br /&gt;Ignoring that issue, I move on to the next test:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;prove -b t/10connect.t &lt;br /&gt;t/10connect......dyld: lazy symbol binding failed: Symbol not found: _mysql_server_init&lt;br /&gt;  Referenced from: /Users/dhosek/.cpan/build/DBD-mysql-4.006-j5Hpiv/blib/arch/auto/DBD/mysql/mysql.bundle&lt;br /&gt;  Expected in: dynamic lookup&lt;br /&gt;&lt;br /&gt;dyld: Symbol not found: _mysql_server_init&lt;br /&gt;  Referenced from: /Users/dhosek/.cpan/build/DBD-mysql-4.006-j5Hpiv/blib/arch/auto/DBD/mysql/mysql.bundle&lt;br /&gt;  Expected in: dynamic lookup&lt;br /&gt;&lt;br /&gt;t/10connect...... Failed 2/2 subtests &lt;br /&gt;&lt;br /&gt;Test Summary Report&lt;br /&gt;-------------------&lt;br /&gt;t/10connect.t (Wstat: 5 Tests: 0 Failed: 0)&lt;br /&gt;  Parse errors: Bad plan.  You planned 2 tests but ran 0.&lt;br /&gt;Files=1, Tests=0,  0 wallclock secs ( 0.01 usr  0.00 sys +  0.04 cusr  0.00 csys =  0.05 CPU)&lt;br /&gt;Result: FAIL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: 11 April 2008&lt;/b&gt; The problem has its roots in using the pre-compiled distribution of mysql from mysql.com rather than building from source. This resulted in getting incompatible libraries between what was compiled for DBD::mysql and what I had in the mysql directory. Building from source resolved the problem. Good instructions on doing the job are available at &lt;a href="http://hivelogic.com/articles/installing-mysql-on-mac-os-x/"&gt;HiveLogic&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-4899545269922794884?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/4899545269922794884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=4899545269922794884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4899545269922794884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/4899545269922794884'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/04/installing-dbdmysql-on-os-x-1052.html' title='Installing DBD::mysql on OS X Leopard 10.5.2'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-3691139143812102025</id><published>2008-03-07T18:59:00.000-08:00</published><updated>2008-03-07T19:03:17.678-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title type='text'>Getting Things Done</title><content type='html'>I first became aware of &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0142000280/donhosek"&gt;Getting Things Done&lt;/a&gt; from &lt;a href="http://www.43folders.com"&gt;the 43 folders web site&lt;/a&gt;. While I've had the book for a couple years, I finally read it this week (along with installing OmniFocus on my work Mac). So far, I'm finding the GTD workflow to be quite helpful. Omnifocus, somewhat less so, other than as a trusted repository for projects. The big difficulty is that Omnifocus ties me too much to the Mac. On the other hand, there has been an announcement that OmniGroup will be doing an iPhone version of Omnifocus. That plus multi-computer syncing could make Omnifocus a really great product for my needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-3691139143812102025?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/3691139143812102025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=3691139143812102025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/3691139143812102025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/3691139143812102025'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/03/getting-things-done.html' title='Getting Things Done'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-7002128022057127945</id><published>2008-03-05T17:36:00.000-08:00</published><updated>2008-03-05T17:51:44.937-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac os x'/><title type='text'>First experiences with OS X Leopard (10.5)</title><content type='html'>I've finally got the iMac with Leopard on my desk at work. So far it's pretty good, although I do have a few complaints, most notably spaces got a few things wrong: cmd-tab and cmd-` should never change spaces. It's really disconcerting to have that happen. I want to be able to pretend that what's in the current workspace is everything I've got, so I can do quick and easy context switches.&lt;br /&gt;&lt;br /&gt;And the choices for the switch between spaces are really disappointing. I don't think that I have an app which doesn't use one of ctrl-arrow, opt-arrow or cmd-arrow for something. At this point, I've just disabled the arrow switching.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-7002128022057127945?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/7002128022057127945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=7002128022057127945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/7002128022057127945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/7002128022057127945'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/03/first-experiences-with-os-x-leopard-105.html' title='First experiences with OS X Leopard (10.5)'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2476501167135957943.post-8453427290686750974</id><published>2008-03-04T17:21:00.001-08:00</published><updated>2008-03-04T20:53:25.119-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='version control'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Version control and databases</title><content type='html'>We have a practice of having a branch for each story in the sprint. This works fine with most stories, but what happens when we have stories that affect the database. I found &lt;a href="http://www.codinghorror.com/blog/archives/000743.html"&gt;this discussion on the topic&lt;/a&gt; which has some interesting reflections and comments. In general, though, my sense is that version control for databases is at best ad hoc and kludgy. RIght now we're doing something similar to Rails migrations, but handled manually. I'd like to formalize that process. I'm looking at &lt;a href="http://search.cpan.org/~crakrjack/DBIx-Migration-Directories-0.05/lib/DBIx/Migration/Directories.pod"&gt;DBIx::Migration::Directories&lt;/a&gt;, although I find no commentary on it at all, anywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2476501167135957943-8453427290686750974?l=agileperl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://agileperl.blogspot.com/feeds/8453427290686750974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2476501167135957943&amp;postID=8453427290686750974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/8453427290686750974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2476501167135957943/posts/default/8453427290686750974'/><link rel='alternate' type='text/html' href='http://agileperl.blogspot.com/2008/03/version-control-and-databases.html' title='Version control and databases'/><author><name>Don</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
