<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Not this... &#187; software</title>
	<atom:link href="http://blog.timbunce.org/category/tech/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.timbunce.org</link>
	<description>Listen. Reflect. Explore. Solve.</description>
	<lastBuildDate>Thu, 29 Jul 2010 00:00:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.timbunce.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/eb188a9f7199a98e44133dc454d3873b?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Not this... &#187; software</title>
		<link>http://blog.timbunce.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.timbunce.org/osd.xml" title="Not this..." />
	<atom:link rel='hub' href='http://blog.timbunce.org/?pushpress=hub'/>
		<item>
		<title>java2perl6api &#8211; Java to Perl 6 API translation &#8211; What, Why, and Whereto</title>
		<link>http://blog.timbunce.org/2010/07/16/java2perl6api-java-to-perl-6-api-tranalation-what-why-and-whereto/</link>
		<comments>http://blog.timbunce.org/2010/07/16/java2perl6api-java-to-perl-6-api-tranalation-what-why-and-whereto/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 17:12:59 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[dbdi]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=460</guid>
		<description><![CDATA[In this post I&#8217;m going to talk about the java2perl6api project. What its goals are, why I think it&#8217;s important, how it relates to a Perl 6 DBI, what exists now, what&#8217;s needs doing, and how you can help. Firstly I&#8217;d like to point out that, funnily enough, I&#8217;m not very familiar with Java or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=460&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>In this post I&#8217;m going to talk about the java2perl6api project. What its goals are, why I think it&#8217;s important, how it relates to a Perl 6 DBI, what exists now, what&#8217;s needs doing, and how you can help.<br />
<span id="more-460"></span></p>
<p>Firstly I&#8217;d like to point out that, funnily enough, I&#8217;m not very familiar with Java or Perl6. It&#8217;s entirely possible that I&#8217;ll make all sorts of errors in the following details. If you spot any do please let me know.</p>
<h2>Background</h2>
<p>The Java language ecosystem is big and mature after years of heavy investment of time and money.</p>
<p>It doesn&#8217;t have a central repository of Open Source modules like CPAN (though <a href="http://en.wikipedia.org/wiki/Apache_Maven">Maven</a> repositories <a href="http://download.java.net/maven/1/">like</a> <a href="http://repo1.maven.org/maven2/">these</a> are similar I guess). It does, however, have a number of mature high quality class libraries, and a very large number of developers familiar with those libraries (more on that below).</p>
<h2>Goals</h2>
<p>The primary goal of the java2perl6api project is to make it easy to create Perl 6 class libraries that <em>mirror</em> Java equivalents. By <em>mirror</em> I mean share the same method names and semantics at a high level (though not at a low-level, more on that below).</p>
<p>Secondary goals are to do that well enough that:</p>
<ul>
<li>the documentation for Java classes can serve as primary the documentation for the corresponding Perl 6 classes. The Perl 6 classes need only document the differences in behavior, which these should be minimal and &#8216;natural&#8217;. The same applies to books describing the Java classes.
</li>
<li>Java developers familiar with the Java classes should feel comfortable working with the corresponding Perl 6 classes.
</li>
<li>and, hopefully, some way can be found to convert test suites for the Java classes into Perl 6 code that&#8217;ll test the corresponding Perl 6 classes. (I appreciate that this is a non-trivial proposition, but there are viable approaches available, like <a href="http://www.xmlvm.org/overview/">xmlvm</a>.) Even if that can&#8217;t be done, extracting and translating tests manually is less work, and more effective, than creating them from scratch for a new API.
</li>
</ul>
<h2>Why?</h2>
<p>Firstly, creating good APIs is hard. Java APIs like <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/jdbc/">JDBC 3.0</a> and <a href="http://java.sun.com/developer/technicalArticles/javase/nio/">NIO.2</a> are the result of years of professional effort and demanding commercial experience. Why not build on that experience?</p>
<p>I appreciate that Java APIs are often limited by the constraints of the language, such as the lack of closures, and that Perl 6 can probably express any given set of semantics more effectively than Java. My point here is that some Java APIs embody, however inelegantly, years of hard won experience that we can benefit from. I&#8217;d rather make new mistakes than repeat old ones.</p>
<p>Secondly, there are many more Java developers than Perl developers. Many <em>many</em> more if job vacancies are any indication:</p>
<p><img src="http://www.indeed.com/trendgraph/jobgraph.png?q=%22perl+developer%22%2C%22java+developer%22" alt="job vacancy trends for perl developer and java developer" height="300" width="540" /></p>
<p>I think we&#8217;d be foolish not to try to smooth the path for any Java developers who might be interested in Perl 6. The java2perl6api project is just one small aspect of that.</p>
<p>I really hope someone starts writing a &#8220;Perl 6 for Java Developers&#8221; tutorial. Perl 6 has the potential to become a very popular language<sup><a href="#1">1</a></sup>. Getting just a tiny percentage of Java developers (and Computer Science majors and their teachers) interested in it could be a big help.</p>
<p>Thirdly, any future DBI for Perl 6 and Parrot needs a much better foundation than the very limited and poorly defined one that <a href="http://search.cpan.org/~timb/DBI-1.611/lib/DBI/DBD.pm">underlies the Perl 5 DBI</a>. I plan to adopt the JDBC 3.0 API <em>and test suite</em> for that <em>internal</em> role. (You could call this a &#8220;Test Suite Driven Strategy&#8221;.) I&#8217;ll talk more about that in a future blog post.</p>
<h2>The History java2perl6api</h2>
<p>I&#8217;ve been kicking around various ideas for integrating Java and Perl6/Parrot for years. I think I first decided to use JDBC as the inspiration for the DBI-to-driver API in 2006.</p>
<p>You may remember back in 2004, around the 10th anniversary of the DBI, the <a href="http://www.perlfoundation.org/">Perl Foundation</a> setup a &#8220;DBI Development Fund&#8221; that people could <a href="http://dbi.perl.org/donate/">donate</a> to. I&#8217;ve never drawn any money from that fund. I want to use it to oil other peoples wheels.</p>
<p>In 2007 <a href="http://news.perlfoundation.org/2007/03/best-practical-sponsors-perl-6.html">Best Practical sponsored Perl 6 Microgrants</a> through the Perl Foundation. I asked if I could piggyback my idea for a Java to Perl 6 API translator onto their microgrant management process but using money from the DBI Development Fund. TPF and Best Practical kindly agreed. I posted a description of the task and Phil Crow volunteered and was <a href="http://news.perlfoundation.org/2007/04/phil-crow-to-create-jdbc-api-f.html">awarded the microgrant</a> in April 2007.</p>
<p>At OSCON in July 2007 I gave lightning talk called &#8220;<a href="http://www.slideshare.net/Tim.Bunce/dbi-for-parrot-and-perl-6-lightning-talk-2007">Database interfaces for open source languages suck</a>&#8221; which explained the rationale for using JDBC as a foundation for the DBI-to-driver API and mentioned Phil&#8217;s java2perl6 project.</p>
<p>Development ground to a halt around the end of 2007 for various reasons. It picked up again for a few months after OSCON 2009 (where I gave a short lightning talk asking for help) then stalled again in October. Partly because we seemed to have hit a limitation with Rakudo and partly because I was focussed on Devel::NYTProf <a href="http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/">version 3</a> and then <a href="http://blog.timbunce.org/2010/06/09/nytprof-v4-now-with-string-eval-x-ray-vision/">version 4</a>, which took <em>way</em> more time than I expected.</p>
<p>There&#8217;s life in the project again now. We&#8217;ve dodged the earlier problem, put the <a href="http://github.com/timbunce/java2perl6">code on github</a>, brought it into sync with current <a href="http://rakudo.org/">Rakudo</a> Perl 6 syntax, and generally instilled some momentum.</p>
<h2>The Current java2perl6api</h2>
<p>Let&#8217;s take a look at a simple example.</p>
<p>To generate a perl6 file that mirrors the API of the java.sql.Savepoint class you&#8217;d just execute java2perl6api like this:</p>
<pre style="background-color:#ddd;margin:2em;padding:1em;">$ java2perl6api java.sql.Savepoint
loading java.sql.Savepoint
wrote java/sql/Savepoint.pm6 - interface java.sql.Savepoint
checking java/sql/Savepoint.pm6 - interface java.sql.Savepoint
</pre>
<p>That&#8217;s loaded and parsed the description of the java.sql.Savepoint class (from the <a href="http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/tooldocs/windows/javap.html">javap</a> command), generated a corresponding perl6 module, and run perl6 to validate it.</p>
<p>The generated module (with some whitespace and cruft removed) looks like this:</p>
<pre style="background-color:#ddd;margin:1em;padding:1em;">use v6;
role java::sql::Savepoint {
    method getSavepointId (
    --&gt; Int   #  int
    ) { ... }
    method getSavepointName (
    --&gt; Str   #  java.lang.String
    ) { ... }
};
=begin pod
=head1 Java
  Compiled from "Savepoint.java"
  public interface java.sql.Savepoint{
      public abstract int getSavepointId() throws java.sql.SQLException;
      public abstract java.lang.String getSavepointName() throws java.sql.SQLException;
  }
=end pod
</pre>
<p>The pod section shows the description of the class that javap returned. The java2perl6api utility parsed that <a href="http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/concepts/interface.html">Java interface</a> and generated the corresponding <a href="http://perlcabal.org/syn/S14.html#Roles">Perl6 role</a>. The &#8216;java.sql.Savepoint&#8217; has been mapped to &#8216;java::sql::Savepoint&#8217;. The generated methods are stubs using <code>...</code> (the &#8220;yada, yada, yada&#8221; operator). The types int and java.lang.String have been mapped to Int and Str. Because the only types used were built-ins, no type declarations were added.</p>
<p>Currently java2perl6api handles the above plus overloaded methods (which generate <a href="http://perlcabal.org/syn/S12.html#Multisubs_and_Multimethods">multi methods</a>), multiple implements clauses (which generate multiple <a href="http://perlcabal.org/syn/S14.html#Compile-time_Composition">does</a> clauses). There&#8217;s also partial support for class/interface constants (which currently generate exported methods).</p>
<p>The default behavior is to recursively process any Java types referenced by the class which aren&#8217;t mapped to Perl 6 types. So executing <code>java2perl6api java.sql.Connection</code>, for example, will generate 48 Perl 6 modules! (Because <code>java.sql.Connection</code> refers to many types, including <code>java.sql.Array</code> which refers to many types including <code>java.sql.ResultSet</code> which refers to <code>java.net.URL</code> which refers to <code>java.net.Proxy</code> etc. etc.) The <code>--norecurse</code> options disables this behavior.</p>
<p>Normally you&#8217;ll want to use the recursion but instead of letting it drill <em>all</em> the way into the Java types, you would supply your own &#8216;typemap&#8217; specification via an option. That tells java2perl6api which Java types you want to map to which Perl 6 types. So instead of recursing into the <code>java.net.URL</code> type to generate a <code>java/net/URL.pm6</code> file, for example, you can tell java2perl6api to use a specific Perl 6 type. Perhaps just <code>Str</code> for now.</p>
<h2>How this relates to JDBC / DBDI / DBI v2</h2>
<p>I want to start applying java2perl6api to the <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/guides/jdbc">JDBC</a> classes now to create a &#8220;Database Driver Interface&#8221; or &#8220;DBDI&#8221; for Perl 6.</p>
<p>Starting with the <a href="http://download-llnw.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/sql/DriverManager.html">DriverManager</a> class and the <a href="http://download-llnw.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/sql/Connection.html">Connection</a>  interface I&#8217;ll use java2perl6api to generate corresponding Perl 6 roles with <em>heavy</em> stubbing out of types. Basically anything I don&#8217;t need to think about right now will be mapped to the <code>Any</code> type.</p>
<p>I&#8217;ll start fleshing out some basic implementation logic for each in a Perl 6 class that <a href="http://perlcabal.org/syn/S14.html#Compile-time_Composition">does</a> the corresponding role. I&#8217;ll probably use PostgreSQL as the first driver and the guts of <a href="http://github.com/mberends/MiniDBI/blob/master/lib/MiniDBD/Pg.pm6">MiniDBD::Pg</a> as inspiration.</p>
<p>The first minor milestones will be creating connections, then execute non-selects, then selects then prepared statements. Somewhere along the way I expect they&#8217;ll be a Perl 6 DBDI driver implemented for the <a href="http://blogs.perl.org/users/martin_berends/2010/06/rakudo-perl-6-gets-into-databases.html">Perl 6 MiniDBI project</a>. The next key step would be to start refactoring the code heavily so anyone wanting to implement a new driver should only have to implement the driver specific parts. (There are some JDBC driver toolkits that can provide useful ideas for that.)</p>
<h2>What needs doing</h2>
<p>There&#8217;s a <a href="http://github.com/timbunce/java2perl6/blob/master/TODO">TODO file in the repository</a> that lists the current items that need working on.</p>
<p>One fairly simple item is to add a <code>--prefix</code> option to specify an extra leading name for the generated role. So <code>java.sql.Savepoint</code> with a prefix of <code>DBDI</code> would generate a <code>DBDI::java::sql::Savepoint</code> role.</p>
<p>Another item, less simple but more important, is to automatically discover the values of constants and embed them into the generated file. Probably the best way to do that is to extend <a href="http://github.com/timbunce/java2perl6/blob/master/lib/Java/Javap/javap.grammar">the parser</a> (which uses <a href="http://search.cpan.org/perldoc?Parse::RecDescent">Parse::RecDescent</a>) to parse the verbose-mode output of javap, which includes those details.</p>
<p>There are <a href="http://github.com/timbunce/java2perl6/blob/master/TODO">plenty of others</a>.</p>
<h2>How you can get involved</h2>
<p>Firstly, come and say &#8220;Hi!&#8221; in the <a href="irc://chat.freenode.net/#dbdi">#dbdi</a> IRC channel on irc.freenode.net.</p>
<p>The code is on <a href="http://github.com/timbunce/java2perl6">github</a>. You can get commit access by asking on the <a href="irc://chat.freenode.net/#perl6">#perl6</a> channel.</p>
<p>There&#8217;s also a mailing list at <a href="mailto:dbdi-dev@perl.org">dbdi-dev@perl.org</a> which you can <a href="mailto:dbdi-dev-subscribe@perl.org">subscribe</a> to.</p>
<p>I look forward to hearing from you!</p>
<hr />
<ol>
<li><a name="1"></a><br />
When I say &#8220;Perl 6 has the potential to become a very popular language&#8221; I do so with typical British <a href="http://en.wikipedia.org/wiki/Understatement">Understatement</a>.
</li>
</ol>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a>, <a href='http://blog.timbunce.org/category/tech/software/'>software</a> Tagged: <a href='http://blog.timbunce.org/tag/dbdi/'>dbdi</a>, <a href='http://blog.timbunce.org/tag/java/'>java</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/perl6/'>perl6</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/460/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/460/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/460/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/460/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/460/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/460/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/460/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/460/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/460/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/460/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=460&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/16/java2perl6api-java-to-perl-6-api-tranalation-what-why-and-whereto/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>

		<media:content url="http://www.indeed.com/trendgraph/jobgraph.png?q=%22perl+developer%22%2C%22java+developer%22" medium="image">
			<media:title type="html">job vacancy trends for perl developer and java developer</media:title>
		</media:content>
	</item>
		<item>
		<title>NYTProf 4.04 &#8211; Came, Saw Ampersand, and Conquered</title>
		<link>http://blog.timbunce.org/2010/07/09/nytprof-4-04-came-saw-ampersand-and-conquered/</link>
		<comments>http://blog.timbunce.org/2010/07/09/nytprof-4-04-came-saw-ampersand-and-conquered/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 21:06:24 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[nytprof]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=457</guid>
		<description><![CDATA[Please forgive the title! Perl has three regular expression match variables ( $&#38; $&#8216; $&#8217; ) which hold the string that the last regular expression matched, the string before the match, and the string after the match, respectively. As you&#8217;re probably aware, the mere presence of any of these variables, anywhere in the code, even [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=457&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><em>Please forgive the title!</em></p>
<p>Perl has three regular expression match variables ( <code>$&amp; $&lsquo; $&rsquo;</code> ) which hold the string that the last regular expression matched, the string before the match, and the string after the match, respectively.</p>
<p>As you&#8217;re probably aware, the mere presence of <em>any</em> of these variables, <em>anywhere</em> in the code, even if never accessed, will slow down <em>all</em> regular expression matches in the <em>entire</em> program. (See the WARNING at the end of the <a href="http://perldoc.perl.org/perlre.html#Capture-buffers">Capture Buffers section of the perlre documentation</a> for more information.)</p>
<p>Clearly this is not good.<br />
<span id="more-457"></span></p>
<p>I&#8217;ve long planned to add detection and reporting of this to <a href="http://search.cpan.org/dist/Devel-NYTProf/">Devel::NYTProf</a>, along with things like method cache invalidation, but it&#8217;s never risen to the top of the list. In fact, now I look, I see it never even got entered into the ever-growing collection of ideas recorded in the <a href="http://cpansearch.perl.org/src/TIMB/Devel-NYTProf-4.04/HACKING">HACKING</a> file.</p>
<p>After the 4.00 release, plus few minor releases, I&#8217;d put NYTProf on hold and was starting to focus on my java2perl6 API translation project (more news on that soon).</p>
<p>Then I saw a recent <a href="http://www.effectiveperlprogramming.com/blog/140">blog post by Josh McAdams</a>, one of the authors of <a href="http://www.amazon.com/exec/obidos/ASIN/0321496949/theeffeperl-20">Effective Perl Programming</a> (along with Joseph N. Hall and brian d foy) about detecting these variables using the <a href="http://search.cpan.org/perldoc?Devel::SawAmpersand">Devel::SawAmpersand</a> and <a href="http://search.cpan.org/perldoc?Devel::FindAmpersand">Devel::FindAmpersand</a> modules. Firstly it reminded me of the issue, and then it struck me that few people would bother using those tools because they simply <em>wouldn&#8217;t know they had the problem</em> in the first place.</p>
<p>Someone with a performance problem is likely to use a profiler like NYTProf to see where time is being spent in their code. That might point out that significant time is being spent in regular expressions, but even then they might not make the leap to consider these special match variables as a possible cause. <em>The profiler should point it out to them!</em></p>
<p>NYTProf version 4.03 didn&#8217;t. Clearly that was not good. So NYTProf version 4.04 now does!</p>
<p>In the list of files on the index page it highlights the file and adds a comment:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/07/nytprof-highlighted-file-on-index-page.png?w=815&#038;h=157" alt="highlighted file on index page" border="0" width="815" height="157" /></p>
<p>On the report page for the file itself it adds an unmissable, and hopefully self-explanatory, note to the top of the page:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/07/nytprof-note-on-report-page.png?w=670&#038;h=186" alt="note on report page" border="0" width="670" height="186" /></p>
<p>I&#8217;d be very interested to hear from anyone who now discovers these problem variable lurking in their application code or any CPAN modules.</p>
<p>Go take a look!</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/nytprof/'>nytprof</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/457/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=457&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/09/nytprof-4-04-came-saw-ampersand-and-conquered/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/07/nytprof-highlighted-file-on-index-page.png" medium="image">
			<media:title type="html">highlighted file on index page</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/07/nytprof-note-on-report-page.png" medium="image">
			<media:title type="html">note on report page</media:title>
		</media:content>
	</item>
		<item>
		<title>Reflections on Perl and DBI from an Early Contributor</title>
		<link>http://blog.timbunce.org/2010/07/08/reflections-on-perl-and-dbi-from-an-early-contributor/</link>
		<comments>http://blog.timbunce.org/2010/07/08/reflections-on-perl-and-dbi-from-an-early-contributor/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 12:48:27 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[dbi]]></category>
		<category><![CDATA[perl4]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=449</guid>
		<description><![CDATA[The name Buzz Moschetti probably isn&#8217;t familiar to you. Buzz was the author of the Perl 4 database for Interbase known as Interperl. Back in those days Perl 5 was barely a twinkle in Larry&#8217;s eye and database interfaces for Perl 4 required building a custom perl binary. Buzz was one of the four people [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=449&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The name Buzz Moschetti probably isn&#8217;t familiar to you. Buzz was the author of the Perl 4 database for <a href="http://en.wikipedia.org/wiki/InterBase#History">Interbase</a> known as <a href="http://cpan.perl.org/modules/dbperl/perl4/interperl/README">Interperl</a>.</p>
<p>Back in those days Perl 5 was barely a twinkle in Larry&#8217;s eye and <a href="http://cpan.perl.org/modules/dbperl/perl4/">database interfaces for Perl 4</a> required building a custom perl binary.</p>
<p>Buzz was one of the four people to get the email on September 29th 1992 from Ted Lemon that started the <a href="http://cpan.perl.org/modules/dbperl/DBI/perldb-interest/">perldb-interest</a> project which defined a <a href="http://cpan.perl.org/modules/dbperl/DBI/dbispec.v04">specification</a> that ultimately lead to the DBI. (The other people were Kurt Andersen re informix, Kevin Stock re <a href="http://cpan.perl.org/modules/dbperl/perl4/oraperl/">oraperl</a>, and Michael Peppler re <a href="http://cpan.perl.org/modules/dbperl/perl4/sybperl/">sybperl</a>. I joined a few days later.)</p>
<p><strong>Update</strong>: It turns out that it was actually Buzz who sent that original email, Ted just forwarded it on to others, including me. So Buzz can be said to have started the process that led to the DBI!</p>
<p>I hadn&#8217;t heard from Buzz for <em>many</em> years until he sent me an email recently.</p>
<p>This is his story:<span id="more-449"></span><br />
<hr />
Thought I&#8217;d share a quick story with you.</p>
<p>Recently, I was frustrated with a development team&#8217;s efforts in putting<br />
together some DB-oriented reconciliations.  The candidate solution was a<br />
blend of precompiled SQL in COBOL code, file dumps and ftps, programs to<br />
read files, more programs to read other DBs, etc. etc.   Not only was<br />
the process orchestration a project in its own right, the end-to-end<br />
logic required to accurately perform the reconciliation was distributed<br />
across several programs and platforms, diluting the knowledge base.  I<br />
knew a perl program using multiple DBD drivers to different DB engines<br />
could do it in a much cleaner way, but over the years my job has changed<br />
and although I still use perl regularly, I don&#8217;t do much in the way of<br />
DBD/DBI.   To make matters worse, one of the targets was mainframe DB2<br />
and very little work had been done here with DBD::DB2.   Also, the<br />
Sybperl module continues to be heavily used in addition to DBD::Sybase,<br />
so local DBD/DBI expertise in general is thin.  I decided to get it<br />
working on my own.</p>
<p>The infrastructure team spun up for me a Linux virtual machine with a<br />
modern build environment on it.  This had the latest gcc compilers and a<br />
firm-approved build of perl 5.8.5 right out of the box.  It took a few<br />
days of low-priority requests to get the appropriate 32bit Linux<br />
client-side SDKs for the DB2 and Sybase products but soon enough I had<br />
an environment set up with headers and shared libs.  I was ready to<br />
build some perl modules, something I haven&#8217;t done in years.</p>
<p>I went to CPAN and downloaded DBD::DB2, untar&#8217;d it, and ran perl<br />
Makefile.PL and make.  Everything worked perfectly and the whole<br />
exercise took minutes.  &#8216;make test&#8217; sets PERL_DL_NONLAZY and warned of<br />
some unused symbols not being found, but that was OK.  The rest of the<br />
tests that I expected to work with my level of permissions worked fine.<br />
&#8216;make install&#8217; worked perfectly.  Buoyed by this success, I wrote a<br />
4-liner test program just to connect and fetch some data from a table I<br />
knew about.  Outside of the test environment, however, the shared libs<br />
for DB2 were not found so I cheated and relinked and reinstalled DB2.so<br />
with the -Wl,-rpath option to &#8220;cement in&#8221; the location of those libs so<br />
I wouldn&#8217;t have to fuss with LD_LIBRARY_PATH.   My test program now<br />
worked fine.  Newly comfortable with the process, I downloaded<br />
DBD::Sybase and built and installed the module in scarcely more time than<br />
it took for the compiler to run.  In my excitement I skipped over the<br />
DBD::Sybase 4-liner test program and went straight to a slightly bigger<br />
script that used both modules and grabbed data from both DBs.  It<br />
quietly and quickly executed.  </p>
<p>Total time from initial download with almost no clues to a running<br />
example: about 40 minutes.  Later, for grin&#8217;s sake, I threw in<br />
DBD::Oracle for good measure.  That went even faster &#8212; about 5 minutes<br />
&#8211; from CPAN download to printing &#8220;Oracle connected!&#8221; because I was more<br />
familiar with the connection string syntax that is bespoke for each<br />
engine.</p>
<p>As I watched the program run, it made me reflect on how far we&#8217;ve come<br />
and how easy yet sophisticated the perl module ecosystem has become.<br />
There is no question that this multi-DBD perl program is easier to<br />
understand and support than a solution involving a set of disconnected<br />
programs, platforms, and files.  But I think it is the organization and<br />
design of the resources as a whole &#8212; DBI, DBD, CPAN, MakeMaker, pod,<br />
binary and non-binary library locations, etc. &#8212; that makes the whole<br />
environment so clear, symmetric, and easy to use with confidence.  I<br />
think back to the build environment that I used to create <a href="http://cpan.perl.org/modules/dbperl/perl4/interperl/README">interperl</a>, and<br />
the progress that has been made in terms of both breadth of module<br />
functionality and depth of framework for module build portability is<br />
simply amazing.  Perl has grown far beyond just being another language.<br />
It has a value proposition as an able integrator of widely disparate<br />
functionality.  </p>
<p>I exited the Perl mainstream some time ago but I am watching from the<br />
side and I applaud the work you&#8217;ve done in this space.</p>
<p>Take care.</p>
<hr />
<p>Thanks Buzz!</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/cpan/'>cpan</a>, <a href='http://blog.timbunce.org/tag/dbi/'>dbi</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/perl4/'>perl4</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/449/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/449/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/449/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=449&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/08/reflections-on-perl-and-dbi-from-an-early-contributor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Looking for a new job? TigerLead is also Hiring in Ann Arbor MI</title>
		<link>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/</link>
		<comments>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:41:27 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=443</guid>
		<description><![CDATA[In addition to the job vacancy in West LA, the company I work for, TigerLead.com, has an opening for a &#8220;skilled developer&#8221; in Ann Arbor, Michigan: Our work involves manipulating and warehousing external data feeds and developing web interfaces to create home search tools for prospective buyers and lead management tools for real estate agents. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=443&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>In addition to the <a href="http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/">job vacancy in West LA</a>, the company I work for, <a href="http://www.tigerlead.com/">TigerLead.com</a>, has an opening for a &#8220;skilled developer&#8221; in Ann Arbor, Michigan:</p>
<blockquote><p> Our work involves manipulating and warehousing external data feeds and developing web interfaces to create home search tools for prospective buyers and lead management tools for real estate agents. We&#8217;re looking for a skilled coder to join our small team of talented engineers in Ann Arbor. We hope to find an experienced programmer who is a good fit with our team, well-versed in multiple languages, able to learn quickly and work independently. We work in a Linux environment, and tools and languages we use include Perl, Ruby on Rails, PostgreSQL, and GIT. Perl experience is a significant plus, but your current comfort level with any of these specific tools is less important than overall technical aptitude and ability to learn quickly and fit in well with the current team.</p></blockquote>
<p>That&#8217;s a little thin on details partly because the work is varied. If you think you might be interested, take a look at the <a href="http://annarbor.craigslist.org/eng/1804836163.html">full job posting</a>.</p>
<p>TigerLead is a lovely company to work for and this is a great opportunity. Highly recommended.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/'>software</a> Tagged: <a href='http://blog.timbunce.org/tag/jobs/'>jobs</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a>, <a href='http://blog.timbunce.org/tag/ruby/'>ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/443/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/443/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/443/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=443&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-also-hiring-in-ann-arbor-mi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Looking for a new job? TigerLead is Hiring in West LA</title>
		<link>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/</link>
		<comments>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 17:37:22 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=439</guid>
		<description><![CDATA[The company I work for, TigerLead.com, has an opening for a &#8220;skilled coder / database wrangler&#8221;. We&#8217;re looking for a skilled coder / database wrangler to play a key role within our Operations and Engineering teams. The various responsibilities of the job include working with the large databases underlying our real estate search tools, setting [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=439&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The company I work for, <a href="http://www.tigerlead.com/">TigerLead.com</a>, has an opening for a &#8220;skilled coder / database wrangler&#8221;. </p>
<blockquote><p>We&#8217;re looking for a skilled coder / database wrangler to play a key role within our Operations and Engineering teams. The various responsibilities of the job include working with the large databases underlying our real estate search tools, setting up services for new clients, communicating with clients to evaluate bug reports, troubleshooting technical issues escalated by our client services team, and interfacing with the engineering team on systems maintenance and development. The scope of work that we do involves managing hundreds of external data feeds that feed into in-house databases totaling several million property listings. These listing databases power hundreds of real estate search sites used by more than a million home-buyer leads, who are tracked and cultivated by the thousands of Realtors using our management software. This position is critical to the robustness of these systems.</p></blockquote>
<p>If that sounds like interesting work to you then take a look at the <a href="http://losangeles.craigslist.org/wst/eng/1821042952.html">full job posting</a>.</p>
<p>TigerLead is a lovely company to work for and this is a great opportunity. Highly recommended.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/'>software</a> Tagged: <a href='http://blog.timbunce.org/tag/jobs/'>jobs</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a>, <a href='http://blog.timbunce.org/tag/ruby/'>ruby</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/439/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/439/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/439/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=439&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/07/02/looking-for-a-new-job-tigerlead-is-hiring-in-west-la/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>New lease of life for Yahoo::Search</title>
		<link>http://blog.timbunce.org/2010/06/11/new-lease-of-life-for-yahoosearch/</link>
		<comments>http://blog.timbunce.org/2010/06/11/new-lease-of-life-for-yahoosearch/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 14:01:58 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=405</guid>
		<description><![CDATA[I&#8217;ve recently started looking into geocoding in perl. We&#8217;re currently using some old hand-coded logic to query the Yahoo Search API. I wanted to switch to Geo::Coder::Yahoo but I noticed that that depended on Yahoo::Search which hadn&#8217;t been updated since March 2007 and had accumulated a number of bug reports (which may well be closed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=405&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently started looking into <a href="http://blog.timbunce.org/2010/06/09/high-quality-multi-source-geocoding-in-perl/">geocoding in perl</a>. We&#8217;re currently using some old hand-coded logic to query the Yahoo Search API. I wanted to switch to <a href="http://search.cpan.org/perldoc?Geo::Coder::Yahoo">Geo::Coder::Yahoo</a> but I noticed that that depended on <a href="http://search.cpan.org/perldoc?Yahoo::Search">Yahoo::Search</a> which hadn&#8217;t been updated since March 2007 and had accumulated <a href="https://rt.cpan.org/Dist/Display.html?Name=Yahoo-Search">a number of bug reports</a> (which may well be closed by the time you read this).</p>
<p>Several related to the fact that Yahoo::Search didn&#8217;t handle Unicode properly when using its default internal XML parser (instead of the optional XML::Simple which does the right thing, but slowly).</p>
<p>What happened next makes a nice little example of getting things done in the Open Source world&#8230;<span id="more-405"></span><br />
I emailed Jeffrey Friedl, the author of Yahoo::Search, to enquire about the status of the module and saying I might be willing to help out with maintenance. He replied promptly saying he&#8217;d be delighted if someone could take it over.</p>
<p>So I created a <a href="http://github.com/timbunce/Yahoo-Search">new repository on github</a> (with the release history from the <a href="http://github.com/gitpan/Yahoo-Search">repository</a> maintained by the amazingly useful <a href="http://github.com/schwern/gitpan/blob/master/README">gitPAN project</a>).</p>
<p>Then I <a href="http://github.com/timbunce/Yahoo-Search/commits/master/">started hacking</a>, mostly adding tests and applying patches and straight-forward fixes for the open tickets. The Unicode fix turned out to be <a href="http://github.com/timbunce/Yahoo-Search/commit/677f719030b86eee0c2b22682290e58317870cd9#diff-3">reasonably small and simple</a>.</p>
<p>I also changed the distribution from using a traditional Makefile.PL over to the awesome <a href="http://dzil.org/">dzil</a> tool to reduce friction and simplify future releases.</p>
<p>Then I changed the permissions on <a href="http://pause.perl.org">PAUSE</a> to enable me to make releases and eventually, when that propagates to <a href="https://rt.cpan.org/">RT</a>, be able to maintain the bug tracker and close the tickets.</p>
<p>And finally for today, I&#8217;ve uploaded a development release to CPAN for <a href="http://www.cpantesters.org/">cpantesters</a> to smoke test. I&#8217;ll close the RT tickets in due course.</p>
<p>Once I&#8217;ve made a final release in a few days I&#8217;ll have shaved my Yahoo::Search <a href="http://en.wiktionary.org/wiki/yak_shaving">yak</a>. After that I&#8217;ve no real interest in maintaining it on an ongoing basis.</p>
<p>Could you be interested looking after a freshly shaven and sweet smelling Yahoo::Search? Available free of charge to a good home!</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/geo/'>geo</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/xml/'>xml</a>, <a href='http://blog.timbunce.org/tag/yahoo/'>yahoo</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/405/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/405/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/405/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/405/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/405/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/405/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=405&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/06/11/new-lease-of-life-for-yahoosearch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>High Quality Multi-Source Geocoding in Perl</title>
		<link>http://blog.timbunce.org/2010/06/09/high-quality-multi-source-geocoding-in-perl/</link>
		<comments>http://blog.timbunce.org/2010/06/09/high-quality-multi-source-geocoding-in-perl/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 21:24:40 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[geo]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=399</guid>
		<description><![CDATA[Where I&#8217;m working at the moment we&#8217;re using the Yahoo Geocoding API but aren&#8217;t very happy with it. I&#8217;ve been asked to look into how we can improve our geo coding. Geo coding services vary greatly in accuracy, precision, availability, throughput capping, and other attributes. So it can help to try multiple services until you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=399&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Where I&#8217;m working at the moment we&#8217;re using the Yahoo Geocoding API but aren&#8217;t very happy with it. I&#8217;ve been asked to look into how we can improve our geo coding.</p>
<p><span id="more-399"></span>Geo coding services vary greatly in accuracy, precision, availability, throughput capping, and other attributes. So it can help to try multiple services until you get <em>sufficient confidence</em> in the result.</p>
<p>It seems there are <a href="http://search.cpan.org/search?query=geocode&amp;mode=all">plenty of modules on CPAN for geocoding</a> from a single source, including Yahoo, Google, Mapquest, Multimap, Cloudmade and Bing. The only one that I could find that handles multiple services was <a href="http://search.cpan.org/perldoc?Geo::Coder::Multiple">Geo::Coder::Multiple</a>.</p>
<p>I&#8217;m writing this blog post for two reasons&#8230;</p>
<p>Firstly I&#8217;m interested in your experiences with geocoding services. Which you&#8217;ve tried, and which you&#8217;d recommend (for geocoding for US addresses). What problems you&#8217;ve encountered and any advice you&#8217;d like to pass on.</p>
<p>Secondly I&#8217;m interested in your thoughts on working with multiple services.</p>
<p><a href="http://search.cpan.org/perldoc?Geo::Coder::Multiple">Geo::Coder::Multiple</a> looks interesting but quite limited. For example, it&#8217;ll accept the first valid response even if it&#8217;s of low precision. There&#8217;s also no provision for checking multiple results to derive some measure of confidence, for &#8220;knowing when to stop&#8221;.</p>
<p>Some feature ideas:</p>
<ul>
<li>Ordered list of geocoders
</li>
<li>Auto rate limit by detecting over-limit response and disabling for a period, perhaps with exponential back-off.
</li>
<li>Result-filter callback to discard uninteresting responses, e.g., precision too low to be useful.
</li>
<li>Result-picking callback to pick best result from those collected so far. It could tell if there were more to try and return undef to mean &#8220;keep going&#8221;.
</li>
<li>Some pre-defined result-picking callbacks for common use cases.
</li>
</ul>
<p>Any thoughts on those?</p>
<p>What kind of features would you like to see?</p>
<p>Want to help build this?</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/geo/'>geo</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/399/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=399&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/06/09/high-quality-multi-source-geocoding-in-perl/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>NYTProf v4 &#8211; Now with string-eval x-ray vision!</title>
		<link>http://blog.timbunce.org/2010/06/09/nytprof-v4-now-with-string-eval-x-ray-vision/</link>
		<comments>http://blog.timbunce.org/2010/06/09/nytprof-v4-now-with-string-eval-x-ray-vision/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 19:26:17 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[nytprof]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=393</guid>
		<description><![CDATA[I released Devel::NYTProf v3 on Christmas Eve 2009. Over the next couple of months a few more features were added. The v3 work had involved a complete rewrite of the subroutine profiler and heavy work on much else besides. At that point I felt I&#8217;d done enough with NYTProf for now and it was time [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=393&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I released Devel::NYTProf <a href="http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/">v3 on Christmas Eve</a> 2009. Over the next couple of months a <a href="http://blog.timbunce.org/2010/03/18/polishing-nytprof/">few more features</a> were added. The v3 work had involved a complete rewrite of the subroutine profiler and heavy work on much else besides. At that point I felt I&#8217;d done enough with NYTProf for now and it was time to focus on other more pressing projects.
</p>
<p>Over those months I&#8217;d also started working on <a href="http://blog.timbunce.org/2009/10/05/wishlist-of-plperl-enhancements-for-postgresql-8-5/">enhancements for PostgreSQL PL/Perl</a>. That project turned into something of an <em>epic adventure</em> with more than its fair share of highs and lows and twists and turns. The dust is only just settling now. I would have blogged about it but security issues arose that led the PostgreSQL team to consider removing the plperl language entirely. Fortunately I was able to help avoid that by removing Safe.pm entirely! At some point I hope to write a blog post worthy of the journey. Meanwhile, if you&#8217;re using PostgreSQL, you really do want to upgrade to the latest point-release.
</p>
<p>One of the my goals in enhancing PostgreSQL PL/Perl was improve the integration with NYTProf. I wanted to be able to profile PL/Perl code embedded in the database server. With PostgreSQL 8.4 I could get the profiler to run, with some <a href="http://github.com/timbunce/posgtresql-plperl-injector/blob/master/lib/PostgreSQL/PLPerl/Injector.pm">hackery</a>, but in the report the subroutines were all __ANON__ and you couldn&#8217;t see the source code, so there were no statement timings. <em>It was useless</em>.
</p>
<p>The key problem was that Devel::NYTProf couldn&#8217;t see into string evals properly. To fix that I <em>had</em> to go back spelunking deep in the NYTProf guts again; mostly in the data model and report generation code. With NYTProf v4, string evals are now treated as files, mostly, and a whole new level of insight is opened up!
</p>
<p>In the rest of this post I&#8217;ll be describing this and other new features.</p>
<p><span id="more-393"></span></p>
<h2>Seeing Into String Evals</h2>
<p>Let&#8217;s start by taking a look at a small example:</p>
<blockquote><p><code>perl -d:NYTProf -e 'eval("sub { $_ }")-&gt;() for 1,2,2'</code>
</p></blockquote>
<p>That executes three string evals, each of which defines an anonymous subroutine which is then executed. Two of the three evals have identical source code.</p>
<p>With NYTProf 3.11 the report for the &#8220;<code>-e</code> file&#8221; looked like this:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-example1-3111.png?w=765&#038;h=260" alt="NYTProf eval-sub example1 311.png" border="0" width="765" height="260" /></p>
<p>Two key things to note: Firstly, there&#8217;s no link to drill-down to see the actual source code executed by the eval. (In this example we can <em>see</em> the source, but that&#8217;s rare in practice.) Secondly, the three anonymous subroutines have been merged. You can&#8217;t see individual details like call counts, callers, or timings.</p>
<p>(In case you&#8217;re wondering, the main::BEGIN subroutine is defined as a side effect of loading NYTProf, and the main::RUNTIME subroutine is a dummy created by NYTProf to act as the &#8216;root caller&#8217;. You&#8217;ll see it appear as the caller of the anonymous subs in a later screenshot.)</p>
<p>With NYTProf 4.00 the same report looks like this:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/06/screen-shot-2010-06-08-at-00-11-03.png?w=766&#038;h=291" alt="NYTProf eval-sub example1 400.png" border="0" width="766" height="291" /></p>
<p>Now you can see much more detail right there. The two evals with identical source code have been merged, as have the identical anonymous subroutines defined by them. The eval and anonymous sub with different source code have been kept separate. What you can&#8217;t easily see from the image is that the &#8220;<code>string eval</code>&#8221; texts in the grey annotation are links. This is where it&#8217;s gets more interesting&#8230;</p>
<p>Clicking on the &#8220;<code>2 string evals (merged)</code>&#8221; link takes us to a typical NYTProf report page showing the performance-annotated source code executed by the eval:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-example1-eval1.png?w=849&#038;h=359" alt="NYTProf eval-sub example1 eval.png" border="0" width="849" height="359" /></p>
<p>What you&#8217;re looking at here is source code <em>that never existed as a file</em>. (That second line containing a semicolon was added by perl as part of the implementation of <code>eval</code>.)</p>
<p>In the table at the top, you&#8217;ll see &#8220;Eval Invoked At&#8221; with a link that&#8217;ll take you to the eval statement that executed this source code. You&#8217;ll also see a &#8220;Sibling evals&#8221; row. That&#8217;s added in cases where an eval was executed multiple times and not all were merged into a single report. Finally, because this particular eval includes data merged from others, the report includes a clear banner alerting you to how many evals were merged to produce this report page.</p>
<p><em><strong>Update</strong>: You&#8217;ll need a recent version of perl (5.8.9+, 5.10.1+, or 5.12+) to see the eval source code.<br />
</em></p>
<p>So why does NYTProf go to all the effort of merging evals and anonymous subs? Here&#8217;s a real-world example using <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-perlcritic-demo/PPI-Node-pm-56-line.html#645">a profile of perlcritic</a>:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-perlcritic1.png?w=795&#038;h=154" alt="NYTProf eval-sub perlcritic1.png" border="0" width="795" height="154" /></p>
<p>Without merging, those 4196 evals would have produced 4196 report pages! Their sheer volume making them almost useless. Now it&#8217;s clear from the report that only a few distinct source code strings are used and <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-perlcritic-demo/(eval%20189)[-usr-local-perl512-dev-lib-site_perl-5-12-0-PPI-Node-pm-654]-516-line.html">the reports</a> for each are <em>far</em> more useful.</p>
<p>In that example perlcritic is compiling lots of tiny snippets of code. Many applications use string eval to compile large quantities of code. The <a href="http://search.cpan.org/perldoc?ORLite">ORLite module</a> is one example. It dynamically generates and compiles a large chunk of code with many subroutines that implement a customized interface for a specific <a href="http://www.sqlite.org/">SQLite</a> database file.</p>
<p>With NYTProf 3.11 you couldn&#8217;t <em>see</em> the hundreds of lines of source code, <em>or</em> the per-caller subroutine performance, <em>or</em> the individual statement performance. All you could see was a list of subs calls and the overall time spent in each:</p>
<p><img src="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-cpangraph-311.png?w=905&#038;h=249" alt="NYTProf eval-sub cpangraph 311.png" border="0" width="905" height="249" /> </p>
<p>That was better than nothing, but now, with NYTProf v4, <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-cpangraph-demo/(eval%20957)[-usr-local-perl512-dev-lib-site_perl-5-12-0-ORLite-pm-586]-1097-line.html">you can see everything</a>!</p>
<div style="background-color:#eeeeee;padding:10px;">
Aside&hellip;</p>
<h2>I see a SQLite in the Distance</h2>
<p>Getting all this working correctly, especially the data model manipulations required for merging evals and anonymous subroutines, was far more painful than I&#8217;d anticipated. I both blessed and cursed the test suite on numerous occasions!</p>
<p>I think it would be wise for NYTProf reporting and data model code to read the data from, and manipulate the data in, an SQLite database. That would yield simpler more maintainable code. It would also be enable nytprofhtml to be used for presenting performance data from other sources, including perl6.</p>
<p>If you&#8217;re interested in working on this, starting with a utility to load an nytprof.out file into a SQLite database, please <a href="http://groups.google.com/group/develnytprof-dev">contact the mailing list</a>.
</div>
<p></p>
<h2>String Eval Timings</h2>
<p>There&#8217;s a slight caveat worth noting about the timings shown for string evals <em>that define subroutines</em>.</p>
<p>Timings for string evals are taken from the statement profiler (the subroutine profiler doesn&#8217;t pay attention to evals). So the &#8220;time spent executing the eval&#8221; is the sum of the time spent executing <em>any statements within the eval</em>.</p>
<p>That&#8217;s fine for evals that don&#8217;t define subroutines. For those that do, the time for the eval includes not only the time spent executing the eval itself but also time spent executing statements in subroutines defined within the eval but called later from outside it.</p>
<p>Hence the careful wording you can see in the example from perlcritic shown previously:</p>
<blockquote><pre># spent  2.65s executing statements in 1369 string evals (merged)
# includes 1.83s spent executing 122015 calls to 1 sub defined therein.</pre>
</blockquote>
<p>I could have automatically subtracted the subroutine time from the eval time but I was wary about doing that (for some reason that currently escapes me). Maybe that&#8217;ll change in the near future. Further out, a future version of NYTProf might use the subroutine profiler logic to time evals. That&#8217;s a deeper change that would give a more natural view of the timings.</p>
<h2>Other Changes in v4</h2>
<ul>
<li>Subroutines that couldn&#8217;t be associated with a perl source file, such as xsubs in packages with no perl source, used to not appear in reports at all. So associated caller and timing information couldn&#8217;t be seen. <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-cpangraph-demo/usr-local-perl512-dev-bin-cpangraph-1-line.html#163">Now it can</a>.
</li>
<li>Similarly, subroutine calls that couldn&#8217;t be associated with a specific <em>line</em>, such as calls made by perl to END blocks, are now shown in reports. They appear as <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-cpangraph-demo/usr-local-perl512-dev-bin-cpangraph-1-line.html#0">as calls from line 0</a>.
</li>
<li>NYTProf v3 added renaming of <code>BEGIN</code> subs, so a BEGIN (or <code>use</code>) on line 3 would be called <code>BEGIN@3</code> and so kept distinct from others in the same package. NYTProf v4 takes that further by detecting the rare cases where the modified name isn&#8217;t unique and adding a sequence number to it, like <a href="https://www.me.com/ix/tim.bunce/Public/perl/nytprof/nytprof-cpangraph-demo/(eval%20957)[-usr-local-perl512-dev-lib-site_perl-5-12-0-ORLite-pm-586]-1097-line.html#3"><code>BEGIN@3.59</code></a>.
</li>
<li>NYTProf v2 added the savesrc option to enable storing a copy of the profiled perl source code into the profile data file itself. This makes report generation immune from later changes to the source files. NYTProf v4 now enables that option by default.
</li>
<li>The report generator used to only generate report lines up to the maximum number of source lines present. If there was no source code available, for whatever reason, you&#8217;d get an empty report for that file, even though there was useful information to report. Now the report generates enough lines to ensure all available profile information gets included. This is especially useful for old perl versions where source code is more likely to be unavailable. Also, the report generator now collapses groups of three or more blank lines.
</li>
<li>Nicholas Clark contributed changes to refine the timing of the beginning and end of profiling. Now END blocks defined at runtime are included in the profile and compilation-only checks (e.g., <code>perl -c</code>) can also be profiled.
</li>
<li>You may be aware that the <code>POSIX::_exit</code> function exits the process immediately, without flushing stdio buffers and without giving perl a chance to clean up. That means NYTProf didn&#8217;t get a chance to finish and the profile wasn&#8217;t usable. NYTProf v4 now intercepts calls to <code>POSIX::_exit</code> and cleans up properly.
</li>
<li>Finally, tired of waiting for nytprofhtml to produce a report from a long profile run? The new <code>--minimal</code> (-m) option makes nytprofhtml skip building reports for the rarely used &#8216;blocks&#8217; and &#8216;subs&#8217; levels of detail and skips generating the graphviz .dot files. That saves a lot of time.
</li>
</ul>
<p>Enjoy!</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/nytprof/'>nytprof</a>, <a href='http://blog.timbunce.org/tag/performance/'>performance</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=393&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/06/09/nytprof-v4-now-with-string-eval-x-ray-vision/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-example1-3111.png" medium="image">
			<media:title type="html">NYTProf eval-sub example1 311.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/06/screen-shot-2010-06-08-at-00-11-03.png" medium="image">
			<media:title type="html">NYTProf eval-sub example1 400.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-example1-eval1.png" medium="image">
			<media:title type="html">NYTProf eval-sub example1 eval.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-perlcritic1.png" medium="image">
			<media:title type="html">NYTProf eval-sub perlcritic1.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2010/06/nytprof-eval-sub-cpangraph-311.png" medium="image">
			<media:title type="html">NYTProf eval-sub cpangraph 311.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Relaxed Perl Myths in Ann Arbor</title>
		<link>http://blog.timbunce.org/2010/05/31/relaxed-perl-myths-in-ann-arbor/</link>
		<comments>http://blog.timbunce.org/2010/05/31/relaxed-perl-myths-in-ann-arbor/#comments</comments>
		<pubDate>Mon, 31 May 2010 12:25:34 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[modern perl]]></category>
		<category><![CDATA[myths]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=383</guid>
		<description><![CDATA[Speaking of belated screencasts, I also haven&#8217;t blogged about my visit to the Ann Arbor Perl Mongers in Michigan. The Ann Arbor Perl Mongers group was being restarted (after a 10 year gap) by the TigerLead tech team. I&#8217;m working for TigerLead and was going to be in Ann Arbor for a meeting so they [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=383&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Speaking of <a href="http://blog.timbunce.org/2010/05/31/screencasts-from-the-italian-perl-workshop-2009/">belated screencasts</a>, I also haven&#8217;t blogged about my visit to the <a href="http://annarbor.pm.org/">Ann Arbor Perl Mongers</a> in Michigan.
</p>
<p>The Ann Arbor Perl Mongers group was being restarted (after a 10 year gap) by the <a href="http://www.tigerlead.com/">TigerLead</a> tech team. I&#8217;m working for TigerLead and was going to be in Ann Arbor for a meeting so they asked me to give a couple of talks: Devel::NYTProf and Perl Myths.
</p>
<p>I like giving talks at events like these because there&#8217;s no set time limit and the audience is more relaxed (the free pizza probably helped).
</p>
<p>I&#8217;ve uploaded a <a href="http://blip.tv/file/3303623">screencast of the Perl Myths talk</a>. As usual it covers the Perl jobs market, CPAN, best practices, power tools, community and perl6. At almost 1 hour 20 minutes it&#8217;s significantly longer than my usual, more rushed, 40 minute version given at conferences and includes 15 minutes of Q &amp; A at the end.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/modern-perl/'>modern perl</a>, <a href='http://blog.timbunce.org/tag/myths/'>myths</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=383&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/05/31/relaxed-perl-myths-in-ann-arbor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Screencasts from the Italian Perl Workshop 2009</title>
		<link>http://blog.timbunce.org/2010/05/31/screencasts-from-the-italian-perl-workshop-2009/</link>
		<comments>http://blog.timbunce.org/2010/05/31/screencasts-from-the-italian-perl-workshop-2009/#comments</comments>
		<pubDate>Mon, 31 May 2010 12:09:49 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[ipw09]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[yapc]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=381</guid>
		<description><![CDATA[I&#8217;ve just been updating the page where I keep links to my presentations and noticed that, not only had I not updated the section for the 2009 Italian Perl Workshop, but I hadn&#8217;t even uploaded the screencasts I&#8217;d made. So, with apologies for the delay, here&#8217;s my entry for IPW09, with the links to the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=381&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just been updating the page where I keep links to <a href="http://blog.timbunce.org/my-presentations/">my presentations</a> and noticed that, not only had I not updated the section for the 2009 Italian Perl Workshop, but I hadn&#8217;t even uploaded the screencasts I&#8217;d made.
</p>
<p>So, with apologies for the delay, here&#8217;s my entry for IPW09, with the links to the uploaded screencasts:
</p>
<blockquote><p>I&nbsp;<a href="http://blog.timbunce.org/2008/09/24/the-italian-perl-workshop/">had a great time</a> at IPW08 and was delighted to be invited back for IPW09, which was another great success. My contributions were two talks. The first was called &ldquo;<a href="http://conferences.yapceurope.org/ipw2009/talk/2366">DBI Oddmenti</a>&rdquo; and covered DBD::Gofer (16 minute&nbsp;<a href="http://blip.tv/file/3693768">screencast</a>), DBI::Profiler (7 minute&nbsp;<a href="http://blip.tv/file/3199117">screencast</a>), and DBDI a key component of a future DBI for Perl 6 (5 minute&nbsp;<a href="http://blip.tv/file/3693636">screencast</a>). The second was &ldquo;<a href="http://conferences.yapceurope.org/ipw2009/talk/2355">State-of-the-art Profiling with Devel::NYTProf</a>&rdquo; (40 minute&nbsp;<a href="http://blip.tv/file/2840795">screencast</a>).&#65279;</p>
<p>With 30 talks from 20 speakers on 2 tracks, IPW09 was another success for the <a href="http://www.perl.it/associazione/index.html">Italian Perl Association</a>, which was formally incorporated at the event. I&rsquo;m confident that <a href="http://conferences.yapceurope.org/ye2010/">YAPC::EU 2010</a> is in safe hands.
</p></blockquote>
<p>I&#8217;m really looking forward to YAPC::EU. We&#8217;re combining the conference with our family summer holiday. We&#8217;ll be staying in a cottage in the <a href="http://maps.google.co.uk/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=calci&amp;sll=53.800651,-4.064941&amp;sspn=16.889907,46.318359&amp;ie=UTF8&amp;hq=&amp;hnear=Calci+Pisa,+Tuscany,+Italy&amp;ll=43.723227,10.484734&amp;spn=0.161026,0.361862&amp;t=h&amp;z=12">village of Calci</a> a few miles outside Pisa.</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/ipw09/'>ipw09</a>, <a href='http://blog.timbunce.org/tag/presentation/'>presentation</a>, <a href='http://blog.timbunce.org/tag/yapc/'>yapc</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/381/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/381/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/381/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=381&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/05/31/screencasts-from-the-italian-perl-workshop-2009/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Polishing NYTProf</title>
		<link>http://blog.timbunce.org/2010/03/18/polishing-nytprof/</link>
		<comments>http://blog.timbunce.org/2010/03/18/polishing-nytprof/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 10:30:03 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[nytprof]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=376</guid>
		<description><![CDATA[I released Devel::NYTProf 3.0 almost three months ago, on Christmas Eve. Since then a few point releases have accumulated some changes and features worth mentioning: Jan Dubois contributed portability fixes for Windows and 64bit configurations. NYTProf should now run well on most, if not all, Windows configurations with recent versions of perl. Markus Peter contributed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=376&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I released <a href="http://search.cpan.org/dist/Devel-NYTProf">Devel::NYTProf</a> 3.0 almost three months ago, <a href="http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/">on Christmas Eve</a>.</p>
<p>Since then a few point releases have accumulated some changes and features worth mentioning:</p>
<p><span id="more-376"></span>
<ul>
<li> Jan Dubois contributed portability fixes for Windows and 64bit configurations. NYTProf should now run well on most, if not all, Windows configurations with recent versions of perl.
</li>
<li> Markus Peter contributed a sub-microsecond timer for Mac OS X. It yields the same 100ns resolution used on systems with POSIX realtime clocks.
</li>
<li> Nicholas Clark has contributed a huge amount of work recently, including many optimizations and a <em>major</em> refactoring of I/O.
</li>
<li> Nicholas&#8217;s <code>nytprofmerge</code> utility is now significantly faster as a result of those changes. He&#8217;s also fixed a bunch of edge cases. If you&#8217;re generating multiple profile data files and would like to merge them into a single report, <code>nytprofmerge</code> is now a very effective tool.
</li>
<li>I fixed the <code>usecputime=1</code> option as it was broken in several ways. It&#8217;s still of limited value and the docs now explain that more clearly.
</li>
<li>I&#8217;ve also added a section to the docs to explain how to make NYTProf faster. For those rare cases where the performance impact of profiling is a problem.
</li>
<li>Assorted crashing bugs and odd behaviors in edge cases (like <code>goto &amp;sub</code> out of an <code>AUTOLOAD</code> being called for a <code>DESTROY</code> in perl &lt;5.8.8) have been fixed. NYTProf now also behaves more sanely with multiplicity and threads (although it still can&#039;t actually profile multiple threads or interpreters).
</li>
<li>The <code>Devel::NYTProf::PgPLPerl</code> module has been removed and the code moved to a separate <a href="http://search.cpan.org/perldoc?PostgreSQL::PLPerl::NYTProf"><code>PostgreSQL::PLPerl::NYTProf</code></a> distribution.
</li>
<li>One little UI tweak worth noting is that sortable tables now show a little arrow in the heading of the sorted column. If you didn&#8217;t know that you could click most column headings to sort by that column, hopefully the arrow will act as a visual reminder.
</li>
</ul>
<p>The only thing I&#8217;m likely to work on soon is the handling is string evals. They&#8217;re mostly hidden in the reports now. I need to improve that to make <code>PostgreSQL::PLPerl::NYTProf</code> actually <em>useful</em>. So that&#8217;s pretty much bound to happen sometime between now and my speaking at <a href="http://www.pgcon.org/2010/">PGcon</a> in May.</p>
<p>Meanwhile, if you&#8217;re not using Devel::NYTProf 3.11, <a href="http://search.cpan.org/dist/Devel-NYTProf/">upgrade</a>!</p>
<br />Filed under: <a href='http://blog.timbunce.org/category/tech/software/perl/'>perl</a> Tagged: <a href='http://blog.timbunce.org/tag/nytprof/'>nytprof</a>, <a href='http://blog.timbunce.org/tag/performance/'>performance</a>, <a href='http://blog.timbunce.org/tag/perl/'>perl</a>, <a href='http://blog.timbunce.org/tag/postgresql/'>postgresql</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/376/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=376&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2010/03/18/polishing-nytprof/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>NYTProf v3 &#8211; Worth the wait!</title>
		<link>http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/</link>
		<comments>http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 23:08:54 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[nytprof]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=362</guid>
		<description><![CDATA[After more than six months, and more than a few technical hurdles, NYTProf v3 has been released at last. In this post I&#8217;ll review the major changes and significant new features. What&#8217;s new in Devel::NYTProf v3? Treemap The first big feature is a visualization of the exclusive time spent in subroutines represented as a treemap: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=362&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>After more than six months, and more than a few technical hurdles, NYTProf v3 has been released at last.</p>
<p>In this post I&#8217;ll review the major changes and significant new features.<span id="more-362"></span><br />
<h1>What&#8217;s new in Devel::NYTProf v3?<br />
</h1>
<h2>Treemap</h2>
<p>The first big feature is a visualization of the exclusive time spent in subroutines represented as a <a href="http://en.wikipedia.org/wiki/Treemap">treemap</a>:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/07/filename.png?w=770" alt="filename.png" border="0" width="770" height="550	" /></p>
<p>That&#8217;s a treemap of a profile of perlcritic 1.088. The colors don&#8217;t mean anything. They&#8217;re just used to visually group subroutines in the same package. (I&#8217;m not very happy with the colors but the <a href="http://thejit.org/">JIT toolkit</a> I&#8217;m using doesn&#8217;t make it easy to use an attractive colour range. It interpolates a value in RGB color space. It would be much better to interpolate the value in HSV color space.)</p>
<p>The treemap is interactive! If you click on a square then the treemap is redrawn &#8220;zoomed in&#8221; one package level &#8216;closer&#8217; to the package of the subroutine you clicked on.</p>
<h2>Subroutine Caller Tracking</h2>
<p>The subroutine profiler has been almost completely rewritten, yielding another major new feature. It now finds and records the name of the <em>calling</em> subroutine. (You might have assumed that NYTProf always did that. In fact it <em>guessed</em> based on the calling file and line number, and so was easily confused by nested subroutines and closures.) By properly tracking the calling subroutine NYTProf can now generate a more accurate call graph.</p>
<p>One immediate beneficiary is the nytprofcg utility (contributed by <a href="http://search.cpan.org/~clkao/">Chia-liang Kao</a>). nytprofcg reads NYTProf profile data and generates callgrind data for viewing via <a href="http://kcachegrind.sourceforge.net/html/Home.html">Kcachegrind</a>. The previous guessing behaviour limited the usefulness of nytprofcg. Now it works well, as you can see here: </p>
<p><img src="http://timbunce.files.wordpress.com/2009/07/zz4f06129a.png?w=799&#038;h=562" alt="ZZ4F06129A.png" border="0" width="799" height="562" /></p>
<p>I&#8217;ve not played with it much yet. If you do, <a href="http://groups.google.com/group/develnytprof-dev">let us know</a> how it works out for you!</p>
<p>The subroutine called <code>main::RUNTIME</code> in the image above is the fake name that NYTProf gives to &#8216;caller&#8217; of the main script code. Code run at compile time will have a top-level caller of <code>main::BEGIN</code>.</p>
<h2>BEGIN</h2>
<p>Speaking of <code>BEGIN</code>s, they&#8217;ve always been a problem because there can be many of them in a single package. Each <code>use</code> statement, for example, generates a <code>BEGIN</code> sub that&#8217;s immediately executed then discarded. Previously the data for all those <code>BEGIN</code>s was mashed together and so almost useless.</p>
<p>The NYTProf subroutine profiler now renames <code>BEGIN</code>s by appending <code>@<em>linenumber</em></code> to make them unique. A whole new level of detail is opened up by this change. (This, along with a few other new features, requires perl 5.10.1+ or 5.8.9+.)</p>
<h2>Goto</h2>
<p>NYTProf now handles <code>goto &amp;sub;</code> properly. That tail-call construct is commonly found at the end of <code>AUTOLOAD</code> subroutines&mdash;so it&#8217;s more common than you might think.</p>
<p>The calling and called subroutine call counts and timings are updated correctly. For the call graph, the destination subroutine appears to have been called by the subroutine that called the subroutine that executed the goto. In other words, if A calls B and B does a goto &amp;C, that call to C will show A as the caller. That fits the way goto &amp;sub works, and ensures inclusive and exclusive times make sense.</p>
<h2>Slow Opcode Profiling</h2>
<p>This is another major new feature. NYTProf can now profile the time spent executing certain opcodes (the lowest-level units of execution in the perl interpreter).</p>
<p>I originally envisaged adding the mechanism for opcodes that corresponded to system calls (read, write, mkdir, chdir etc.) and called the feature &#8216;sys ops&#8217;. Then I realised there were other perl opcodes that would be worth profiling. The main two being <code>match</code> (<code>m/.../</code>) and <code>subst</code> (<code>s/.../.../</code>). So now the NYTProf subroutine profiler can now profile time spent in regular expressions!</p>
<p>Here&#8217;s an example:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/08/zz1f7ce510.png?w=755&#038;h=235" alt="ZZ1F7CE510.png" border="0" width="755" height="235" /></p>
<p>The opcodes are given pseudo-subroutine names <em>in the package that invoked the opcode</em> with &#8220;<code>CORE:</code>&#8221; prepended to the opcode name. In the example above you can see  two instances of <code>CORE:match</code>. One accounting for matches performed in the <code>main::</code> package, and another accounting for matches performed in the <code>File::Find::</code> package. (They&#8217;re marked &#8216;xsub&#8217; above but I&#8217;ve changed that to &#8216;opcode&#8217; now.)</p>
<p>Profiling of &#8216;slowops&#8217;, as I&#8217;ve called them, is controlled by the <code>slowops=N</code> option. A value of 0 turns off slowop profiling. A value of 2 (the default) gives the behaviour shown above, with opcodes called in different packages being accounted for separately. A value of 1 will put all the slowops into a single package named &#8220;<code>CORE::</code>&#8220;.</p>
<h2>GraphViz</h2>
<p>Another spin-off from the work on call graphs: NYTProf now also outputs representations of the subroutine call graph as GraphViz <a href="http://en.wikipedia.org/wiki/DOT_language">dot language</a> files. These can be rendered by<br />
<a href="http://www.graphviz.org/">a variety of viewers</a>. I use <a href="http://www.pixelglow.com/graphviz/">GraphViz by pixelglow</a>.</p>
<p>Here&#8217;s a simple example showing the calling relationship between packages in a little demo script I use for testing:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/08/subs-callgraph.png?w=514&#038;h=282" alt="subs-callgraph.png" border="0" width="514" height="282" /></p>
<p>The dot file for that inter-package view is available as a link on the top-level index page of the report.</p>
<p>On the individual report pages for each source file there&#8217;s a link to another dot file. This one shows the calls into, out of, and between the subroutines in package(s) in that source file. For example, here&#8217;s the call graph for the subs in the File::Find module:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/08/call-graphviz-file-find-pm.png?w=682&#038;h=365" alt="call-graphviz-File-Find-pm.png" border="0" width="682" height="365" /></p>
<p>There are many things that could be improved with that graph, such as adding call counts. Overall though, I&#8217;m pretty happy with it.</p>
<h2>Report Format Changes</h2>
<p>There have been some changes to the main report columns:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/08/zz5dc6382a.png" alt="ZZ5DC6382A.png" border="0"/></p>
<p>There are two new columns, &#8220;Calls&#8221; and &#8220;Time in Subs&#8221;. They show the number of subroutine calls executed on that line, and the total time spent in those subroutines due to those calls. Both are color coded, <em>relative to the other values in the same columns</em>, using the same <a href="http://en.wikipedia.org/wiki/Median_absolute_deviation">Median Average Deviation</a> that&#8217;s used elsewhere.</p>
<p>To make room for the new columns, the column showing the average statement execution time has been removed (it wasn&#8217;t much use anyway) and the column headings tightened up. The average value, if you&#8217;re interested, is available as a tool-tip, as shown above.</p>
<h2>New Options</h2>
<p>A few new options have been added, including:</p>
<ul>
<li><code>sigexit=<em>S</em> </code> Some signals will abort a process leaving a corrupt profile data file. The <code>sigexit</code> option can be used to tell NYTProf to catch those signals and close the profile cleanly before exiting.
</li>
<li><code>forkdepth=<em>N</em> </code>When a process being profiled is forked the child process is also profiled. The <code>forkdepth=N</code> option can be used to limit the number of generations that are profiled. The default is -1 (all generations). A value of 0 effectively disables profiling of child processes.
</li>
<li><code>log=<em>F</em> </code>If you enable NYTProf trace output, via the <code>trace=<em>N</em></code> option, it&#8217;s normally written to stderr. The <code>log=<em>F</em> </code> can be used to write the log to a specific file instead.
</li>
</ul>
<h2>nytprofmerge</h2>
<p>As I mentioned above, when a profiled process forks, the child is also profiled, with the profile being written to a new file. So processes which have many children, like mod_perl, end up with many profile data files. Naturally many people have expressed a wish for NYTProf to be able to merge multiple profiles into a single report. Sadly no one has stepped up actually do the work, till now.</p>
<p><a href="http://www.ccl4.org/~nick/">Nicholas Clark</a>, who contributed the great <a href="http://blog.timbunce.org/2008/10/03/nytprof-204-gives-you-90-smaller-data-files/">zip compression</a> for v2.04 (and a major contributor to the perl core and pumpkin for the 5.8.2+ releases) has come up trumps again. NYTProf v3 includes a new nytprofmerge utility that&#8217;ll read multiple profiles and write out a new, merged, profile. It&#8217;s very new, and somewhat experimental, but answers a very real need. Give it a whirl and <a href="http://groups.google.com/group/develnytprof-dev">let us know</a> how it goes. </p>
<h2>Screencast</h2>
<p>I gave a talk on Devel::NYTProf at the (excellent) <a href="http://conferences.yapceurope.org/ipw2009">Italian Perl Workshop</a> in October. I covered both the features in version 3 and the phased approach I take to optimizing perl code. You can <a href="http://blip.tv/file/2840795">watch the screencast</a>.</p>
<h2>And finally</h2>
<p>For more information on the changes in Devel::NYTProf v3 you can <a href="http://search.cpan.org/~timb/Devel-NYTProf-3.00/Changes">read the Changes file</a>.</p>
<p>It&#8217;s <a href="http://en.wikipedia.org/wiki/Christmas_Eve">Christmas Eve</a> here in Ireland. After days, and nights, of hard frost the countryside is spectacularly encased in tiny ice crystals sparking in the bright sunshine. I&#8217;m delighted to have stumbled into working on NYTProf. It&#8217;s a great project at the intersection of two of my professional passions: performance and visualization. And I&#8217;m delighted to give you NYTProf v3 in time for <em>this</em> Christmas.</p>
<p>Enjoy!</p>
<p>Tim.</p>
<br />Posted in perl Tagged: nytprof <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/362/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/362/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/362/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=362&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/12/24/nytprof-v3-worth-the-wait/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/07/filename.png" medium="image">
			<media:title type="html">filename.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/07/zz4f06129a.png" medium="image">
			<media:title type="html">ZZ4F06129A.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/08/zz1f7ce510.png" medium="image">
			<media:title type="html">ZZ1F7CE510.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/08/subs-callgraph.png" medium="image">
			<media:title type="html">subs-callgraph.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/08/call-graphviz-file-find-pm.png" medium="image">
			<media:title type="html">call-graphviz-File-Find-pm.png</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/08/zz5dc6382a.png" medium="image">
			<media:title type="html">ZZ5DC6382A.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Wishlist of PL/Perl Enhancements for PostgreSQL 8.5</title>
		<link>http://blog.timbunce.org/2009/10/05/wishlist-of-plperl-enhancements-for-postgresql-8-5/</link>
		<comments>http://blog.timbunce.org/2009/10/05/wishlist-of-plperl-enhancements-for-postgresql-8-5/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 22:00:42 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[plperl]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=344</guid>
		<description><![CDATA[I&#8217;m working with PostgreSQL for my day job, and liking it. We&#8217;re fairly heavy users of stored procedures implemented in PL/Perl, with ~10,000 lines in ~100 functions (some of which have bloated to painful proportions). This creates some interesting issues and challenges for us. There&#8217;s a window of opportunity now to make improvements to PL/Perl [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=344&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m working with PostgreSQL for my day job, and liking it.</p>
<p>We&#8217;re fairly heavy users of stored procedures implemented in PL/Perl, with ~10,000 lines in ~100 functions (some of which have bloated to painful proportions). This creates some interesting issues and challenges for us.</p>
<p>There&#8217;s a window of opportunity <em>now</em> to make improvements to PL/Perl for PostgreSQL 8.5. I&#8217;m planning to work with <a href="http://developer.postgresql.org/~adunstan/">Andrew Dunstan</a> to agree on a set of changes and develop the patches.</p>
<p>As a first step along that road I want to map out here the changes I&#8217;m thinking of and to ask for comments and suggestions.</p>
<p><span id="more-344"></span><br />
<h2>Goals:</h2>
<ul>
<li>Enable modular programming by pre-loading user libraries.</li>
<li>Soften the hard choice between plperl and <a href="http://www.postgresql.org/docs/8.4/interactive/plperl-trusted.html">plperlu</a>, so there&#8217;s less reason to &#8220;give up&#8221; and use plperlu.</li>
<li>Improve performance.</li>
<li>Improve flexibility for future changes.</li>
<li>Enable use of tracing/debugging tools.</li>
</ul>
<h2>Specific Proposals:</h2>
<ol>
<li><strong>Enable configuration of perl at initialization</strong></li>
<p>Add ability to specify in postgresql.conf some code to be run when a perl interpreter is initialized. For example:</p>
<p><code>plperl.at_init_do = 'use lib qw(/path/to/mylib); use MyPlPerlUtils; use List::Util qw(sum);'</code></p>
<li><strong>Configure extra items to be shared with the Safe compartment</strong></li>
<p>The Safe compartment used for plperl functions can&#8217;t access any namespace outside the compartment. So, by default, any subroutines defined by libraries loaded via <code>plperl.at_init_do</code> won&#8217;t be callable from plperl functions.</p>
<p>Some mechanism is needed to specify which extra subroutines, and/or variables, should be shared with the Safe compartment. For example:</p>
<p><code>plperl.safe_share = '$foo, myfunc, sum'</code></p>
<li><strong>Permit some more opcodes in the Safe compartment</strong></li>
<p>I&#8217;d like to add the following opcodes to the set of opcodes permitted in the Safe compartment: <code>caller, dbstate, tms</code>.</p>
<li><strong>Execute END blocks at process end</strong></li>
<p>Currently PostgreSQL doesn&#8217;t execute END blocks when the backend postgres process exits (oddly, it actually executes them immediately after initializing the interpreter). Fixing that would greatly simplify use of tools like NYTProf that need to know when the interpreter is exiting. <em>Updated: used to say &#8220;at server shutdown&#8221; which was wrong.</em></p>
<li><strong>Name PL/Perl functions</strong></li>
<p>Currently PL/Perl functions are compiled as anonymous subroutines. Applying the same technique as the <a href="http://search.cpan.org/perldoc?Sub::Name">Sub::Name</a> module would allow them have &#8216;more useful&#8217; names than the current &#8216;__ANON__&#8217;.</p>
<p>For a PL/Perl function called &#8220;foo&#8221;, a minimal implementation would use a name like &#8220;foo__id54321&#8243; where 54321 is the oid of the function. This avoids having to deal with polymorphic functions (where multiple functions have the same name but different arguments). </p>
<p>The names won&#8217;t enable inter-function calling and may not even be installed in the symbol table. They&#8217;re just to improve error messages and to enable use of tools like <a href="http://code.google.com/p/perl-devel-nytprof/source/browse/trunk/lib/Devel/NYTProf/PgPLPerl.pm">Devel::NYTProf:: PgPLPerl</a> (as yet unreleased).</p>
<li><strong>Miscellaneous updates to the PL/Perl documentation</strong></li>
<p>To document the new functionality and expand/update the related text.</p>
<li><strong>Improve Performance</strong></li>
<p>It seems likely that there&#8217;s room for improvement. Some code profiling is needed first, though, so I&#8217;ll leave this one vague for now.</p>
</ol>
<p>Any comments on the above?<br />
Anything you&#8217;d like to add?</p>
<p>If so, speak up, time is short!<br />
<hr />
<div style="font-size:-2px;">
<h2>Footnote</h2>
<p>For completeness I&#8217;ll mention that I was thinking of adding a way to permit extra opcodes (plperl.safe_permit=&#8217;caller&#8217;) and a way to use a subclass of the Safe module (plperl.safe_class=&#8217;MySafe&#8217;). I dropped them because I felt the risks of subtle security issues outweighed the benefits. Any requirements for which these proposals seem like a good fit can also be met via <code>plperl.at_init_do</code> and <code>plperl.safe_share</code>.</div></p>
<br />Posted in perl Tagged: plperl, postgresql <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/344/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/344/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/344/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=344&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/10/05/wishlist-of-plperl-enhancements-for-postgresql-8-5/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Perl Myths and Mongers in Dublin</title>
		<link>http://blog.timbunce.org/2009/09/22/perl-myths-and-mongers-in-dublin/</link>
		<comments>http://blog.timbunce.org/2009/09/22/perl-myths-and-mongers-in-dublin/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 21:41:26 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[ireland]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[myths]]></category>
		<category><![CDATA[perl6]]></category>
		<category><![CDATA[ossbarcamp]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=339</guid>
		<description><![CDATA[Last weekend I went up to Dublin to speak at OSSBarcamp. I took the train from Limerick on Friday so I&#8217;d already be in Dublin the following morning, without having to get up at the crack of dawn. Dublin.pm Aidan Kehoe and I had a very small but interesting Dublin.pm meeting that night. Their first [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=339&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Last weekend I went up to Dublin to speak at <a href="http://www.ossbarcamp.com/">OSSBarcamp</a>. I took the train from Limerick on Friday so I&#8217;d already be in Dublin the following morning, without having to get up at the crack of dawn.</p>
<h2>Dublin.pm</h2>
<p>Aidan Kehoe and I had a very small but interesting Dublin.pm meeting that night. Their first since 2004! Our wide-ranging discussions that night included me trying to understand what led Dublin.pm to flounder instead of flourish. I think a key factor was the (implicit?) expectation that members should make technical presentations.</p>
<p>Living in the west of Ireland there aren&#8217;t enough local Perl users (that I&#8217;ve found so far) to have a viable Perl Mongers group. So I setup the <a href="http://www.meetup.com/limerick-open-source/">Limerick Open Source</a> meetup instead.</p>
<p>Here&#8217;s what worked for us: We sit around in a quiet comfy hotel bar and chat. Naturally the chat tends towards the technical, and laptops are produced and turned around to illustrate a point or show results of a search, a chunk of video etc. There&#8217;s no set agenda, no declared topics, and no presentations. And yet, I think it&#8217;s fair to say, that everyone who&#8217;s come along has learnt interesting (albeit random) stuff.</p>
<p>I&#8217;d like to hear from perl mongers, in groups of all sizes, what kinds of balance between the social and technical aspects of Perl Mongers meetings works (or doesn&#8217;t work) for you.</p>
<h2>OSSBarcamp</h2>
<p>At OSSBarcamp I gave a ~15 minute &#8216;lightning talk&#8217; on Devel::NYTProf in the morning, and a ~50 minute talk on Perl Myths in the afternoon.</p>
<p>The Perl Myths talk was a major update to my <a href="http://www.slideshare.net/Tim.Bunce/perl-myths-200802">previous version</a>, now over 18 months old, incorporating lots of updated graphs and <a href="http://blog.timbunce.org/2009/08/13/help-me-update-my-perl-myths-talk-for-2009/">other fresh information</a>.</p>
<p>There is so much happy vibrant productive life in the Perl community that updating the presentation has been lovely experience. I keep having to revise the numbers on the slides upwards. There are lots of great graphs and they&#8217;re all going upwards too! (Many thanks to <a href="http://barbie.missbarbell.co.uk/">Barbie</a> for the great new graphs of CPAN stats.)</p>
<p>I&#8217;ve put a PDF of the slides, with notes, <a href="http://www.slideshare.net/Tim.Bunce/perl-myths-200909">on slideshare</a>. Best viewed full-screen or downloaded.</p>
<p>I made a screencast but I think I&#8217;ll hang on to that until after I give the same talk, updated again, at the <a href="http://conferences.yapceurope.org/ipw2009/">Italian Perl Workshop</a> (IPW09) in Pisa in October &mdash; I&#8217;m really looking forward to that! I&#8217;ll make another screencast there and decide then which to upload.</p>
<p>After OSSBarcamp last week, and before IPW09 in late October, I&#8217;ll be flying to Moscow, visa permitting, to give a talk at the <a href="http://www.highload.ru/">HighLoad++</a> (<a href="http://translate.google.com.au/translate?u=http%3A%2F%2Fwww.highload.ru&amp;sl=ru&amp;tl=en&amp;hl=en&amp;ie=UTF-8">translated</a>) conference. I&#8217;ve never been to Russia before so that&#8217;s going to be an amazing experience!</p>
<br />Posted in ireland, perl Tagged: conference, graphs, jobs, language, myths, ossbarcamp, perl6, presentation <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=339&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/09/22/perl-myths-and-mongers-in-dublin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Perl in five sentences</title>
		<link>http://blog.timbunce.org/2009/09/10/perl-in-five-sentences/</link>
		<comments>http://blog.timbunce.org/2009/09/10/perl-in-five-sentences/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 12:00:54 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[myths]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=326</guid>
		<description><![CDATA[I just added a concluding slide to my updated Perl Myths talk. Having comprehensively debunked some myths with hard facts about perl and its ecosystem, I wanted to end with a slide that summarized some truths. I liked the slide text so much I wanted to share it with you: Perl: has a massive library [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=326&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I just added a concluding slide to my updated Perl Myths talk. Having comprehensively debunked some myths with hard facts about perl and its ecosystem, I wanted to end with a slide that summarized some truths.</p>
<p>I liked the slide text so much I wanted to share it with you:</p>
<hr />
<p><strong><br />
<blockquote>
Perl:</p>
<p>has a massive library of reusable code<br />
has a culture of best practice and testing<br />
has a happy welcoming growing community<br />
has a great future in Perl 5 and Perl 6<br />
is a great language <em>for getting your job done</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;for the last 20 years, and the next 20!</p></blockquote>
<p></strong></p>
<p>&nbsp;</p>
<hr />
<p>It would make more sense after seeing the talk, but I think it stands well on its own as a summary of Perl.</p>
<p></p>
<br />Posted in perl Tagged: myths, presentation <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/326/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=326&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/09/10/perl-in-five-sentences/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Is your Perl community visible?</title>
		<link>http://blog.timbunce.org/2009/09/04/is-your-perl-community-visible/</link>
		<comments>http://blog.timbunce.org/2009/09/04/is-your-perl-community-visible/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 12:44:50 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[graphs]]></category>
		<category><![CDATA[trends]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=316</guid>
		<description><![CDATA[As I mentioned recently, I&#8217;m working on an update to my Perl Myths talk. (Which is really a review of the state of the art, state of the community, resources, and best practices. You could even call it marketing.) In recent months, and especially while researching for this update, it&#8217;s become clear to me that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=316&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>As I mentioned <a href="http://blog.timbunce.org/2009/08/13/help-me-update-my-perl-myths-talk-for-2009/">recently</a>, I&#8217;m working on an update to my Perl Myths talk. (Which is really a review of the state of the art, state of the community, resources, and best practices. You could even call it marketing.)</p>
<p>In recent months, and especially while researching for this update, it&#8217;s become clear to me that the Perl community is both functioning well and growing more conscious of its own role and value.</p>
<p>But are the various components of &#8220;the community&#8221; sufficiently visible?<span id="more-316"></span></p>
<p>You&#8217;ll often hear expressions like CPAN is the &#8220;jewel in the crown&#8221; of Perl. To the extent that&#8217;s true, it&#8217;s the Perl community that we have to thank. CPAN feeds the community, and the community feeds CPAN &#8211; at an <a href="http://stats.cpantesters.org/trends.html">ever increasing rate</a>. <em>(Those graphs currently include the current incomplete month, so often show a sudden but unrepresentative drop in the final value. That&#8217;s being fixed.)</em></p>
<p>When I read stories from those new to the community <a href="http://use.perl.org/~redspike/journal/39576">like this</a>, or <a href="http://thejoysofcomputing.wordpress.com/2009/09/02/why-i-love-perl-already/">this</a>, I think Larry&#8217;s <a href="http://use.perl.org/article.pl?sid=00/07/19/161217">vision</a> expressed in 2000 (and <a href="http://www.oreillynet.com/pub/wlg/5091">echoed</a> in 2004 by Nat) of &#8220;the community&#8217;s rewrite of the community&#8221; has come to pass.</p>
<p>But for every user in the perl community there are countless more perl users outside it. Unaware of other perl users near them, either physically or <a href="http://www.irc.perl.org/">virtually</a>. We need to find ways of reaching out to those users and encouraging them to join our various communities (Perl Mongers, PerlMonks, IRC channels etc. etc.).</p>
<h2>On The Map?</h2>
<p>So, back to my Perl Myths talk&#8230; To help convey the scale and geographic spread of the perl community I&#8217;m including <a href="http://www.pm.org/groups/map.html">this map</a> of the locations of Perl Mongers groups:</p>
<p><img src="http://timbunce.files.wordpress.com/2009/09/zz3d4a76b3.png?w=639&#038;h=426" alt="Global map of perl monger group locations" border="0" width="639" height="426" /></p>
<p>When I zoomed in on Europe I could see that there was no marker for the <a href="http://dublin.pm.org/">Dublin Perl Mongers</a>. Now I know that the Dublin group is <a href="http://mail.pm.org/pipermail/dublin-pm/">barely</a> active, but it is alive and should be on the map. So that got me thinking &#8220;how many more Perl Monger groups are alive but not on the map?&#8221;.</p>
<p>Please go check the map for any perl monger groups <em>you know of</em> and, if you can&#8217;t find them, email the admin for the group (you can find the email address at http://www.pm.org) and ask them to update their details to include the location. Also, if possible, email the approximate location to <a href="http://www.pm.org/contact/index.html">pm.org</a> yourself so they can be added to the map ASAP. (I&#8217;d be especially grateful if more markers could be added for groups in sparse areas of the map!)</p>
<h2>In The Calendar?</h2>
<p>To help convey the scale of <em>activity</em> within the community I include this graph of conferences, workshops, and hackathons (<em>thanks to BooK for updating it for me</em>):</p>
<p><img src="http://act.mongueurs.net/act-conferences.png" alt="graph of perl conferences, workshops, and hackathons by year" border="0" width="639" height="426" /></p>
<p>Notice the dip in &#8220;Other conferences&#8221; in 2009? Perhaps the rise in 2008 was an aberration, and 2009 has returned to the underlying trend. Or perhaps some smaller events, like workshops and hackathons, might have been missed, in the same way that Perl Monger groups might not be &#8216;on the map&#8217;.</p>
<p>So I&#8217;m looking for help in checking that all perl workshops and hackathons in 2009 have been noted.</p>
<p>The underlying data for the graph can be found in a YAML file <a href="http://www.yapceurope.org/events/conferences.yml">here</a>. Or, instead of rummaging though a YAML file, you could look at <a href="http://www.google.com/calendar/embed?src=ngctmrd1cac35061mrjt3hpgng%40group.calendar.google.com">this calendar</a>. I&#8217;ve already checked that all entries matching &#8216;workshop&#8217; or &#8216;hackathon&#8217; are in the YAML file. What I&#8217;d like <em>you</em> to do, is check that any workshops or hackathons that <em>you&#8217;re aware of</em> are in the calendar. If not, let me know.</p>
<p>Thanks!</p>
<br />Posted in life, perl Tagged: community, graphs, trends <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/316/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/316/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/316/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=316&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/09/04/is-your-perl-community-visible/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>

		<media:content url="http://timbunce.files.wordpress.com/2009/09/zz3d4a76b3.png" medium="image">
			<media:title type="html">Global map of perl monger group locations</media:title>
		</media:content>

		<media:content url="http://act.mongueurs.net/act-conferences.png" medium="image">
			<media:title type="html">graph of perl conferences, workshops, and hackathons by year</media:title>
		</media:content>
	</item>
		<item>
		<title>Help me update my Perl Myths talk for 2009</title>
		<link>http://blog.timbunce.org/2009/08/13/help-me-update-my-perl-myths-talk-for-2009/</link>
		<comments>http://blog.timbunce.org/2009/08/13/help-me-update-my-perl-myths-talk-for-2009/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 15:21:18 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[ireland]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[myths]]></category>
		<category><![CDATA[perl6]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=306</guid>
		<description><![CDATA[I&#8217;m going to be speaking at the OSS BarCamp in Dublin in September. Given the likely audience I think my Perl Myths talk would be a good fit. It needs updating though, and that&#8217;s where you can help&#8230; It&#8217;s a strongly fact base talk with lots of graphs, numbers, and references. A lot has happened [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=306&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to be speaking at the <a href="http://www.ossbarcamp.com">OSS BarCamp</a> in Dublin in September. Given the likely audience I think my <a href="http://blog.timbunce.org/2008/03/08/perl-myths/">Perl Myths talk</a> would be a good fit.</p>
<p>It needs updating though, and that&#8217;s where <em>you can help</em>&#8230;<span id="more-306"></span></p>
<p>It&#8217;s a strongly fact base talk with lots of graphs, numbers, and references. A <em>lot</em> has happened in the Perl community since I wrote the talk over 18 months ago!</p>
<p>Lots of the information needs to be checked and updated. The <a href="http://blog.timbunce.org/2008/02/12/comparative-language-job-trend-graphs/">jobs graphs are easy</a>, as are the basic CPAN numbers.</p>
<p>I&#8217;d like to get updated versions of: the graph of CPAN uploads (slide 23), test counts for perl 5.10.1 (slide 44), the graph of cpan-testers reports (slide 47).</p>
<p>One item that&#8217;s not in the slides, which were written in Feb 2008, but is in <a href="http://blip.tv/file/1150746">the screencast</a> made later at OSCON (at 7:00) is the statement that &#8220;<em>One quarter of all CPAN distributions have been updated in the last 4 months! Half of all in the last 17 months!</em>&#8221; That&#8217;s an impressive and important statistic but it need updating. I think I got that from Schwern&#8217;s excellent &#8220;<a href="http://use.perl.org/~schwern/journal/36705">Perl is unDead</a>&#8221; talk, but I don&#8217;t know how he got the figures or, more importantly, how to update them. (And schwern.org seems down so I can&#8217;t get the <a href="http://schwern.org/~schwern/talks/Perl%20is%20unDead%20-%20YAPC-NA-2008.pdf">slides</a>.)</p>
<p>At OSCON I also talked about myths relating to Perl 6 (again, not in the old slides, but starting at 19:20 in the <a href="http://blip.tv/file/1150746">screencast</a>). I&#8217;d like to cover Perl 6 when I talk in Dublin in September, but the status of Parrot and Perl 6 has changed in the last 18 months even more than Perl 5. So I need help with good sources of hard data for Parrot and Perl 6, similar to what I have in the screencast but updated.</p>
<p>More generally, I&#8217;m also looking for new sources of information &mdash; hard data about the vigourous health of perl and its community. Have you seen any relevant talks/slides or blog posts you can recommend?</p>
<p>Can you help with any of the above?</p>
<p>Thank you in advance!</p>
<br />Posted in ireland, perl Tagged: myths, perl, perl6, presentation <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/306/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=306&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/08/13/help-me-update-my-perl-myths-talk-for-2009/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>NYTProf v3 &#8211; a sneak peak</title>
		<link>http://blog.timbunce.org/2009/08/07/nytprof-v3-a-sneak-peak/</link>
		<comments>http://blog.timbunce.org/2009/08/07/nytprof-v3-a-sneak-peak/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 02:12:49 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[slideshare]]></category>
		<category><![CDATA[nytprof]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=301</guid>
		<description><![CDATA[I&#8217;ve had a great week at OSCON. The talks are excellent but the real value is in the relationships formed and renewed in the &#8220;hallway track&#8221;. I&#8217;m honoured and humbled to be able to call many great people my friends. My talk on Devel::NYTProf seemed to go well. This year I covered not just NYTProf [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=301&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a great week at OSCON. The talks are excellent but the real value is in the relationships formed and renewed in the &#8220;hallway track&#8221;. I&#8217;m honoured and humbled to be able to call many great people my friends.</p>
<p>My <a href="http://en.oreilly.com/oscon2009/public/schedule/detail/7941">talk on Devel::NYTProf</a> seemed to go well. This year I covered not just NYTProf and the new features in v3 (not yet released) but also added a section on how to use NYTProf to optimize your perl code.</p>
<p>Here&#8217;s a quick summary, with links to the slides and screen-cast, and outline what&#8217;s still to be done before v3 gets released (getting closer by the day).<span id="more-301"></span>The first two-thirds of the talk covered general profiling topics and an overview of NYTProf v3. This was an updated and compressed version of the talk I gave last year.</p>
<p>The final third covered optimization techniques.</p>
<p>I began with stern warning against optimization unless there&#8217;s a clear need, followed by a selection of quotes, among which is the well known classic from <a href="http://en.wikipedia.org/wiki/Donald_Knuth">Donald Knuth</a>: &#8220;premature optimization is the root of all evil&#8221;. What few people remember is that that&#8217;s just a fragment of a more balanced statement:</p>
<blockquote><p><em>“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. <strong>Yet we should not pass up our opportunities in that critical 3%.</strong>”</em></p></blockquote>
<p>After getting an implicit nod from Donald I quoted <a href="http://en.wikipedia.org/wiki/Rob_Pike">Rob Pike</a> on the importance of measurement:</p>
<blockquote><p><em>“Bottlenecks occur in surprising places, so don&#8217;t try to second guess and put in a speed hack until you have </em>proven<em> that&#8217;s where the bottleneck is.”</em></p></blockquote>
<p>Then I outlined the sequence of steps I usually take when performance profiling and optimizing code. These were grouped into three phases: &#8220;Low Hanging Fruit&#8221;, &#8220;Deeper Changes&#8221;, and &#8220;Structural Changes&#8221;.</p>
<p>I&#8217;ve generated a <a href="http://assets.en.oreilly.com/1/event/27/State-of-the-art%20Profiling%20with%20Devel__NYTProf%20Presentation.pdf">PDF of the slides</a> and made it <a href="http://www.slideshare.net/Tim.Bunce/develnytprof-200907">available on slideshare.net</a>. I&#8217;ve also uploaded <a href="http://blip.tv/file/2396942">the 45 minute screencast</a> to <a href="http://timbunce.blip.tv/">my blip.tv channel</a>.</p>
<p>Let me know if you find them useful.</p>
<hr />
p.s. This was originally a large post highlighting features of NYTProf v3. I hate talking about vapourware and with every day that passes the code is getting closer to being ready. In the end I decided to split the post in two. The shiny goodness in v3 will get its own blog post when it&#8217;s released. Meanwhile the slides and screencast will give you a sneak peek.</p>
<br />Posted in perl Tagged: conference, nytprof, oscon, presentation, slideshare, video <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/301/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/301/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/301/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/301/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/301/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/301/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/301/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/301/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/301/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/301/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=301&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/08/07/nytprof-v3-a-sneak-peak/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Customer Relationship Management (CRM) systems in Perl</title>
		<link>http://blog.timbunce.org/2009/07/06/customer-relationship-management-crm-systems-in-perl/</link>
		<comments>http://blog.timbunce.org/2009/07/06/customer-relationship-management-crm-systems-in-perl/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:28:17 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[crm]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=286</guid>
		<description><![CDATA[I&#8217;m looking for a CRM system implemented in Perl. As it turns out, so are the Perl Foundation. So I thought I&#8217;d summarize my interpretation of the comments on that thread, as much for my own benefit as yours, and see if this post flushes out any further information. We&#8217;ll start with the smaller/personal projects [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=286&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m looking for a CRM system implemented in Perl. As it turns out, <a href="http://news.perlfoundation.org/2008/01/i_need_a_crm_package.html">so are the Perl Foundation</a>.</p>
<p>So I thought I&#8217;d summarize my interpretation of the comments on that thread, as much for my own benefit as yours, and see if this post flushes out any further information.</p>
<p>We&#8217;ll start with the smaller/personal projects and work up from there&#8230;<br />
<span id="more-286"></span></p>
<h2>John Cappiello</h2>
<p>John mentioned that he was working on something. I sent John an email to ask for an update and he said it had &#8220;morphed away from a CRM into something not really overlapping much at all&#8221;.</p>
<h2>Gábor Szabó</h2>
<p>Gábor Szabó mentioned in the thred that he has &#8220;a simple CRM I use in-house that I plan to release as open source one day. It is written in Perl. While it is very minimalistic if you are interested I can show it and we can discuss what additional features TPF might need.&#8221;</p>
<h2><a href="http://www.hiivesystems.com">Affinity</a></h2>
<p>Affinity was mentioned in the thread, but I can&#8217;t find any <a href="http://www.google.com/search?q='open+source'+site:hiivesystems.com">references</a> to it being open source.</p>
<h2><a href="http://www.thinx.ch">CustomX</a></h2>
<p>The web pages are in German, so here&#8217;s a <a href="http://translate.google.com/translate_c?hl=en&amp;sl=de&amp;tl=en&amp;u=http://www.thinx.ch/topic7854/story20752.html&amp;rurl=translate.google.com&amp;usg=ALkJrhiQbWFGGcA08iaAz6pwcweciFno_g">translation to English</a> of their web site, which gets visually mangled in the process, and a much more readable translation of their 2006 <a href="http://translate.google.com/translate?hl=en&amp;sl=de&amp;tl=en&amp;u=http://download.contentx.ch/1/crm_whitepaper.pdf&amp;rurl=translate.google.com">whitepaper</a>.</p>
<p>It&#8217;s available under the Perl Artistic License. The base language is German. I don&#8217;t know what level of internationalization/locaization they support.</p>
<p>They currently use mod_perl v1 and say it&#8217;s &#8220;not tested&#8221; for v2, which seems to suggest a lack of maintenance. Databases supported include Postgres, Oracle, MySQL, and Informix. It&#8217;s extensible via plugins.</p>
<p>I couldn&#8217;t find any indication of a development community.</p>
<h2><a href="http://wice.de/produkt.html">Wice CRM Groupware</a></h2>
<p>Another German CRM system, so here&#8217;s a <a href="http://translate.google.com/translate?hl=en&amp;sl=de&amp;u=http://www.wice.de/">translation</a> of their home page. It&#8217;s in use by <a href="http://translate.google.com/translate?hl=en&amp;sl=de&amp;u=http://www.wice.de/partner.html">a range of companies</a>, and they even have a <a href="http://www.wice.de/20051114_Magazin_mit_Award.pdf">glossy magazine</a> (though it looks like a once-off produced in 2005).</p>
<p>&#8220;Wice is a LAMP system with Linux as operating system, Apache as web and application server, MySQL as the database and the system is developed as an Apache module in mode_perl.&#8221;</p>
<p>&#8220;We have Wice a plugin architecture, which we almost arbitrary adjustments, enhancements and interfaces can be realized [...] There are also numerous standard plugins, such as a web, an integrated CMS, or a Customer Self Service Center.&#8221;</p>
<p>The source code is not &#8216;free&#8217;, however. You get the source code only <a href="http://translate.google.com/translate?hl=en&amp;sl=de&amp;u=http://crm.blogg.de/eintrag.php%3Fid%3D245">when you licence the software</a>.</p>
<h2><a href="http://donor.com/">Donor.com</a></h2>
<p>&#8220;Our software has been serving non-profits for 30+ years. We have spent the past 5 years wrapping all of our C-based business logic with Perl to expose everything as Web Services (50 modules and 300+ methods so far). Our presentation layers are the WebGUI CMS (also Perl) and a cross-client GUI (Win/OSX/Linux) written in wxPerl. Our systems integrate everything from CRM, inventory management, event tracking, credit card processing, bulk email, direct mail, magazine subscriptions, sponsorships, etc. Almost everything in our system is configurable. We have not yet open-sourced all of our code, but we did just transition our ownership to a new 501(c)3, the DonorWare Foundation, to help facilitate that in the future.&#8221;</p>
<p>Jim Brandt replied to comment in the thread saying &#8220;I got another response from the folks who run donor.com. Turns out they are heavy perl users, so we&#8217;re looking at their system right now to see if it will meet our needs. I&#8217;ll post with more details once we know.&#8221; No news yet.</p>
<p>Josh Berkus expressed some <a href="http://lists.flossfoundations.org/pipermail/foundations-software/Week-of-Mon-20080929/thread.html#22">pros and cons</a> of using donor.com.</p>
<h2>Other Perl CRM Systems?</h2>
<p>What have I missed? Are there any other open source CRM systems out there implemented in Perl?</p>
<hr />
<p>For comparison, here are some details (mostly skimmed from Wikipedia) of open source CRM systems not implemented in perl&#8230;</p>
<h2><a href="http://en.wikipedia.org/wiki/CiviCRM">CiviCRM</a></h2>
<p>Designed to meet the needs of advocacy, non-profit and non-governmental groups. Implemented in PHP. The license for the current version is the GNU AGPL 3.</p>
<p>CiviCRM may be deployed either standalone or alongside Drupal and Joomla! content management systems. Both the Drupal and Joomla! professional associations use CiviCRM. The standalone version is intended to work alongside other CMSs.</p>
<p>CiviCRM is used by many large NGOs including Amnesty International, Creative Commons and the Wikimedia Foundation for their fundraising.</p>
<p>They&#8217;re currently considering a <a href="http://civicrm.org/node/589">new architecture</a>:</p>
<blockquote><p><em>In short, we propose using PHP Doctrine for the ORM layer [...] we propose using thin controllers which speak XML and JSON. All UI is subsequently pushed directly to HTML, JS and jQuery. The controllers and the UI are connected through authenticating RESTful interface.</em></p></blockquote>
<p>Link to the <a href="https://www.ohloh.net/p/civicrm"> CiviCRM project page</a> at Ohloh.net.</p>
<h2><a href="http://en.wikipedia.org/wiki/Vtiger_CRM">vtiger CRM</a></h2>
<p>An open source fork of SugerCRM. Implemented in PHP, initially released in 2003. Seems to be supported by AdventNet, who make a non-open source Java based CRM called Zoho. Licences: vtiger Public License 1.1 and SugarCRM Public License 1.1.2.</p>
<p>Hosted at <a href="http://sourceforge.net/projects/vtigercrm/">sourceforge</a>. Link to <a href="https://www.ohloh.net/p/civicrm"> vtiger project page</a> at Ohloh.net.</p>
<h2><a href="http://www.epesibim.com/">epesi BIM</a></h2>
<p>Implemented in PHP. Links to the developers <a href="http://www.epesi.org/index.php?title=Main_Page">wiki</a>, <a href="http://forum.epesibim.com/">forums</a>, and Ohloh.net <a href="https://www.ohloh.net/p/12690">project page</a>.</p>
<hr />
<p>A search on Ohloh.net for <a href="https://www.ohloh.net/p?q=tag%3Acrm">tag:crm</a> yields 649 projects with the CRM tag!</p>
<p>It turns out that Ohloh is a great way to look for projects. The Analysis Summary on each project page gives a useful overview of some key metrics: &#8220;Large, active development team&#8221;, &#8220;Few source code comments&#8221; etc.</p>
<p>Sorting the list in various ways and taking the projects (other than those above) that appear on the first page of each, gives this list, in no particular order:</p>
<h2><a href="https://www.ohloh.net/p/openerp">OpenERP</a></h2>
<p>&#8220;Python. Formerly known as TinyERP. OpenERP is an Open Source enterprise management software.	It covers and integrates most enterprise needs and processes: accounting, hr, sales, crm, purchase, stock, production, services management, project management, marketing campaign, management by affairs, &#8230; </p>
<p>Once in production, it automates and help you to control all activities: sales triggers manufacturing orders, accounting entries are updated by stock operations, incoming mails are tracked in the system, the integrated document management system helps your team to collaborate, &#8230;&#8221;</p>
<h2><a href="https://www.ohloh.net/p/162">Open For Business Project (Apache OFBiz)</a></h2>
<p>Java. &#8220;The Open For Business Project is a set of tools and enterprise applications including ERP, CRM, e-commerce, SCM, MRP, and CMMS/EAM. It uses a service oriented and events driven architecture and tools to automate all aspects of application development and maintenance.&#8221;</p>
<h2><a href="https://www.ohloh.net/p/omnierp">Omni ERP</a></h2>
<p>Python. &#8220;Omni ERP is an innovative business application platform; it is completely based in open source technologies and brings a whole new level of modularity and flexibility to the business solutions environment.<br />
It uses a new approach combining new software engineering techniques like plugin based architecture, inversion of control and aspect oriented programming with a refreshing new RIA UI to bring a new level of experience to the SME market&#8221;</p>
<h2><a href="https://www.ohloh.net/p/adempiere">ADempiere</a></h2>
<p>Java. &#8220;ADempiere Business Suite ERP/CRM/MFG/SCM/POS done the Bazaar way in an open and unabated fashion. Focus is on the Community that includes Subject Matter Specialists, Implementors and End-Users. We are a community fork of Compiere&#8221;</p>
<h2><a href="https://www.ohloh.net/p/erp5">ERP5</a></h2>
<p>Python. &#8220;ERP5 is a full featured high end Open Source / Libre Software solution published under GPL license and used for mission critial ERP / CRM / MRP / SCM / PDM applications by industrial organisations and government agencies.</p>
<p>It is distributed to linux community via packages for numerous distributions (Mandriva, Debian, Ubuntu,&#8230;) and a dedicated Live CD.&#8221;</p>
<h2><a href="https://www.ohloh.net/p/jfire">JFire</a></h2>
<p>Java. &#8220;JFire is an ERP, CRM, eBusiness, and SCM/SRM solution for business enterprises. It uses JavaEE, JDO, and Eclipse RCP, and is designed to be highly customizable. It is a complete and extensible solution that fulfills business needs like user management, online trade with business partners, points of sale, various distribution channels forming a distribution network, store management, etc.&#8221;</p>
<h2><a href="https://www.ohloh.net/p/5550">CK-ERP</a></h2>
<p>PHP. &#8220;CK-ERP is an open source accounting / MRP / ERP / CRM system that runs on top of multiple middlewares. It provides accounting and back office functionalities to SMEs and utilizes the underlying middleware to administer accounts/groups.</p>
<p>It comprises 22 modules &#8211; Administration, Multilingual Facility, Contact Management, Customer Relationship, Customer Self Service, Vendor Relationship, Material Requirement Planning, Warehouse, Inventory, Service, Accounting Ledger, Bank Reconciliation, Accounts Payable, Accounts Receivable, Purchase Order, Sales Order, Quotation, POS for Cashier, POS for Manager, Human Resources, Staff Self Service and Payroll.</p>
<p>Operating platform can either be LAMP or LAPP. Backend database engine can be anyone of MySQL, PostgreSQL and SQLite&#8221;. Oddly, their home page says &#8220;minimal documentation will be made available to users of CK-ERP&#8221; and their <a href="http://ck-erp.net/xoops/htdocs/modules/content/index.php?id=7">roadmap</a> is old.</p>
<h2><a href="https://www.ohloh.net/p/5061">Blue ERP</a></h2>
<p>PHP. &#8220;Blue ERP is an open source, web based ERP application. Its goal is to provide a flexible and user friendly interface that can work out of the box and be modified to suit specific needs easily.</p>
<p>The main goals of the projects are:* provide a feature full ERP application<br />
* be open in licence and in spirit &#8211; in blue ERP everything is open, especially the development<br />
* be user friendly by providing adequate documentation and assistance to users to encourage widespread adoption&#8221;</p>
<h2><a href="https://www.ohloh.net/p/5613">OTRS::ITSM</a></h2>
<p>After all the PHP systems, it&#8217;s nice to find one implemented in Perl! Though the description suggests it&#8217;s geared towards the needs of an IT Service organization.</p>
<p>&#8220;ITIL compliant Open Source IT Service Management Solution (ITSM). Requires the OTRS (Open Ticket Request System) framework.</p>
<p>Besides all OTRS features, new ones include Incident, Problem and Configuration Management, integrated Configuration Management Data Base; process spanning Communication management: within the IT Service organization, towards Customers/Users/Management and Suppliers/Providers; powerfull statistical features for (Trend-)Analysis, key figured Reporting, ITSM-Planning/-Controlling; flexible configuration, customizing and expandability regarding your individual requirements.&#8221;</p>
<hr />
<p>[That's quite enough "CRM" systems! Ed.]</p>
<br />Posted in software Tagged: crm, open source, perl, php <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/286/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/286/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/286/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=286&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/07/06/customer-relationship-management-crm-systems-in-perl/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
		<item>
		<title>Unattributed copying of perl blog content via Planet Perl</title>
		<link>http://blog.timbunce.org/2009/06/15/unattributed-copying-of-perl-blog-content-via-planet-perl/</link>
		<comments>http://blog.timbunce.org/2009/06/15/unattributed-copying-of-perl-blog-content-via-planet-perl/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 09:22:38 +0000</pubDate>
		<dc:creator>TimBunce</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[license]]></category>
		<category><![CDATA[perl blogs]]></category>

		<guid isPermaLink="false">http://timbunce.wordpress.com/?p=282</guid>
		<description><![CDATA[I recall other bloggers complaining of unattributed redistribution of their work. Now a site called rapid-dev.net has started redistributing Plant Perl posts, including mine, with an advert at the top. I wouldn&#8217;t mind if the page had clear attribution, but it doesn&#8217;t. In fact, at the bottom it says &#8220;Author: hoanatwho&#8221;. That doesn&#8217;t feel right. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=282&subd=timbunce&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I recall other bloggers complaining of unattributed redistribution of their work. Now a site called rapid-dev.net has started redistributing Plant Perl posts, including mine, with an advert at the top.</p>
<p>I wouldn&#8217;t mind if the page had clear attribution, but it doesn&#8217;t. In fact, at the bottom it says &#8220;Author: hoanatwho&#8221;.</p>
<p>That doesn&#8217;t feel right. Especially as many of my posts, and probably many others from Planet Perl, use the first-person pronoun &#8220;I&#8221;.</p>
<p>Why does this matter? A couple of months ago Merlin Mann wrote a long but <a href="http://www.43folders.com/2009/04/10/free-me">excellent piece</a> that explains why <em>far</em> better than I could.</p>
<blockquote><p><em>Nobody but me is allowed to decide why I make things. And — if and when I choose to give away the things that I make — nobody but me is allowed to define how or where I’ll do it. I am independent.</em></p></blockquote>
<p>Merlin discusses, with his typical style, the motivations of those who make their work available for free, and the perils of presuming to understand their motives. Although written mostly about bloggers it seems very applicable to authors of Open Source software. For me it echoes how I feel about coding and, to an extent, the freedom that Perl give me to express my thoughts.</p>
<p>If you have a blog I recommend you at least make the licence for reuse clear. <a href="http://blog.timbunce.org">My blog</a> has a &#8220;Terms of Use&#8221; link in the sidebar that refers to <a href="http://creativecommons.org/">Creative Commons</a> &#8220;Attribution-Noncommercial-Share Alike 3.0&#8243; <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/">license</a>.</p>
<p>Looking at the <a href="http://planet.perl.org/">Planet Perl page</a> I see it has no licence. Perhaps that should be fixed &mdash; even if only to say that the license of the feeds being aggregated must be respected.</p>
<br />Posted in life, perl, tech Tagged: license, perl blogs <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/timbunce.wordpress.com/282/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/timbunce.wordpress.com/282/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/timbunce.wordpress.com/282/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/timbunce.wordpress.com/282/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/timbunce.wordpress.com/282/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/timbunce.wordpress.com/282/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/timbunce.wordpress.com/282/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/timbunce.wordpress.com/282/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/timbunce.wordpress.com/282/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/timbunce.wordpress.com/282/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.timbunce.org&blog=2562816&post=282&subd=timbunce&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.timbunce.org/2009/06/15/unattributed-copying-of-perl-blog-content-via-planet-perl/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cf82705f5ab43c73273ab5d690866b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">TimBunce</media:title>
		</media:content>
	</item>
	</channel>
</rss>