<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Ron Savage</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/ron_savage/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/ron_savage//297</id>
    <updated>2013-05-08T04:09:03Z</updated>
    <subtitle>A blog about the Perl programming language</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>Tut # 7: jQuery, Ajax, xml, Perl, databases and utf8</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/05/tut-7-jquery-ajax-xml-perl-databases-and-utf8.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4656</id>

    <published>2013-05-08T04:04:07Z</published>
    <updated>2013-05-08T04:09:03Z</updated>

    <summary>I&apos;ve tried to cover significant interactions between the topics mentioned in the Title above: Tutorial # 7 The tutorial includes references to various now more-or-less standard documents, or collections thereof, pertaining to Perl, databases and utf8....</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>I've tried to cover significant interactions between the topics mentioned in the Title above:</p>

<p><a href="http://savage.net.au/jQuery-tutorials/html/utf8.html">Tutorial # 7</a></p>

<p>The tutorial includes references to various now more-or-less standard documents, or collections thereof, pertaining to Perl, databases and utf8.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl &amp;&amp; jQuery &amp;&amp; XML &amp;&amp; ! taconite</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/04/perl-jquery-xml-taconite.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4595</id>

    <published>2013-04-21T22:58:57Z</published>
    <updated>2013-04-21T23:04:16Z</updated>

    <summary>Hi All If you&apos;re in a hurry, jump to my latest (6th) Perl + jQuery tutorial. In short: I don&apos;t use the clever jQuery add-on taconite because it supports only commands (verbs) and I needed conditional execution (an &apos;if&apos;). Nevertheless,...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi All</p>

<p>If you're in a hurry, jump to my latest (6th) <a href="http://savage.net.au/jQuery-tutorials.html">Perl + jQuery tutorial</a>.</p>

<p>In short: I don't use the clever jQuery add-on taconite because it supports only commands (verbs) and I needed conditional execution (an 'if').</p>

<p>Nevertheless, I pinched-er-adapted the idea to unilaterally update some parts of the DOM, and to conditionally update other parts.</p>

<p>Happy reading...<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Visualising SQL joins</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/04/visualising-sql-joins.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4570</id>

    <published>2013-04-14T22:59:09Z</published>
    <updated>2013-04-14T23:00:42Z</updated>

    <summary>Hi All Here&apos;s an image displaying various options re SQL joins. Wish I&apos;d see this years, nay, decades, ago....</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi All</p>

<p>Here's an <a href="http://savage.net.au/assets/images/web-site/sql.joins.jpg">image</a> displaying various options re SQL joins.</p>

<p>Wish I'd see this years, nay, decades, ago.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>5 jQuery tutorials for budding Perlmeisters</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/04/4-jquery-tutorials-for-budding-perlmeisters.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4487</id>

    <published>2013-04-01T07:58:30Z</published>
    <updated>2013-04-03T00:42:41Z</updated>

    <summary>Click keep reading to, errr, keep reading. This is because I put the text of the entry in MT&apos;s &apos;Extended&apos;, and now I&apos;ve just added this stuff to &apos;Body&apos;. Also, the 5th tut is on Autocomplete....</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Click keep reading to, errr, keep reading.</p>

<p>This is because I put the text of the entry in MT's 'Extended', and now I've just added this stuff to 'Body'.</p>

<p>Also, the 5th tut is on Autocomplete.<br />
</p>]]>
        <![CDATA[<p>Following on from my decision to switch from YUI to jQuery (<a href="http://savage.net.au/Ron/html/review.of.js.libs.html">discussed here</a>), I encountered some curiosities and traps.</p>

<p>So... I've put some <a href="http://savage.net.au/jQuery-tutorials.html">jQuery tutorials</a> on-line.</p>

<p>I hope you have less pain with jQuery than I am having. I will stick to it, because it's certainly noticeably better than YUI.<br />
</p>]]>
    </content>
</entry>

<entry>
    <title>GraphViz2 and the dread MusicBrainz db</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/03/graphviz2-and-the-dread-musicbrainz-db.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4451</id>

    <published>2013-03-21T01:49:46Z</published>
    <updated>2013-03-21T02:04:22Z</updated>

    <summary>Hi All OK. After a bit of pain I&apos;ve set up an empty database for the MusicBrainz database. In particular, where they say &apos;sudo cpan Carton&apos; you probably want &apos;cpanm Carton&apos;. This exercise was because, astonishingly, one of the users...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi All</p>

<p>OK. After a bit of pain I've set up an empty database for the <br />
<a href="http://musicbrainz.org/doc/MusicBrainz_Database">MusicBrainz database</a>.</p>

<p>In particular, where they say 'sudo cpan Carton' you probably want 'cpanm Carton'.</p>

<p>This exercise was because, astonishingly, one of the users of my module <a href="https://metacpan.org/release/GraphViz2">GraphViz2</a> had doubts about it handling 149 tables spread over 4 schema.</p>

<p>The version of dbi.schema.pl shipped with GraphViz2 V 2.07 needed a patch to handle multiple schema, but after fixing that, you can view the SVG <a href="http://savage.net.au/Perl-modules/html/graphviz2/musicbrainz.svg">in all its ghastly glory</a>.</p>

<p>Firstly, set up you env vars thusly:<br />
env | grep DBI<br />
DBI_PASS=musicbrainz<br />
DBI_DSN=dbi:Pg:dbname=musicbrainz_db<br />
DBI_SCHEMA=musicbrainz,cover_art_archive,report,statistics<br />
DBI_USER=musicbrainz</p>

<p>Then the command is:<br />
dbi.schema.pl svg musicbrainz.svg > musicbrainz.log</p>

<p>Further, you can download this set of files:<br />
o musicbrainz.svg (size: 257,156 bytes)<br />
o musicbrainz.log (output of dbi.schema.pl, containing the DOT file)<br />
o dbi.schema.pl (patched)<br />
o tables.log (the list of 149 tables as output by Pg's psql)<br />
<a href="http://savage.net.au/Perl-modules/html/graphviz2/musicbrainz.tgz">here</a>.</p>

<p>I'll release a new GraphViz2 shortly.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Docs for SQLite&apos;s foreign_key_list($table)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/03/docs-for-sqlites-foreign-key-listtable.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4422</id>

    <published>2013-03-13T02:03:15Z</published>
    <updated>2013-03-13T02:08:46Z</updated>

    <summary>AFAICT SQLite&apos;s foreign_key_list($table_name) pragma returns a list of 8 elements in this order (i.e. with these interpretations): 1: COUNT 2: KEY_SEQ 3: FKTABLE_NAME 4: PKCOLUMN_NAME 5: FKCOLUMN_NAME 6: UPDATE_RULE 7: DELETE_RULE 8: UNKNOWN If anyone can explain the last item,...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>AFAICT SQLite's foreign_key_list($table_name) pragma returns a list of 8 elements in this order (i.e. with these interpretations):</p>

<p>1: COUNT<br />
2: KEY_SEQ<br />
3: FKTABLE_NAME<br />
4: PKCOLUMN_NAME<br />
5: FKCOLUMN_NAME<br />
6: UPDATE_RULE<br />
7: DELETE_RULE<br />
8: UNKNOWN</p>

<p>If anyone can explain the last item, or offer corrections, please advise.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>GraphViz2 V 2.07 and the Chinook test database</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/03/graphviz2-and-the-chinook-test-database.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4421</id>

    <published>2013-03-12T22:39:16Z</published>
    <updated>2013-03-14T22:06:02Z</updated>

    <summary>Tong Sun, a user of GraphViz2, has drawn my attention to the test database Chinook, downloadable here. He and I have both had great difficulty getting GraphViz2 to properly display the schema of this database. He&apos;s using Strawberry Perl, and...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Tong Sun, a user of GraphViz2, has drawn my attention to the test database Chinook, <a href="https://chinookdatabase.codeplex.com/">downloadable here</a>.</p>

<p>He and I have both had great difficulty getting GraphViz2 to properly display the schema of this database. He's using <a href="http://strawberryperl.com/">Strawberry Perl</a>, and I'm using Perl under <a href="http://debian.org">Debian</a>.</p>

<p>Among the various problems are files marked as ISO-8859-1 but containing UTF8 data, and the Postgres data using the string syntax N'...'. AFAICS my Postgres V 8 (printed) manuals don't use this. Perhaps the original Chinook data was prepared by someone using Postgres V 9.</p>

<p>So, I've created Postgres and SQLite files to simplify installation of the Chinook data.</p>

<p>Download the Postgres data from <a href="http://savage.net.au/Perl/Chinook.pg.fix.tgz">here</a>, and the SQLite data from <a href="http://savage.net.au/Perl/Chinook.sqlite.fix.tgz">here</a>.</p>

<p>See create.pg.sh and create.sqlite.sh for the installation steps.</p>

<p>Note also that Postgres' psql and SQLite's sqlite3 both fail to handle UTF8 files starting with a BOM, so I've rigged the code in both cases to generate a deliberate syntax error when the reader attaches the BOM to the first non-comment token.</p>

<p>Recall also this quotation "Both Oracle and SQLite.org ship a program called sqlite3. They are not compatible. Which one are you using? I use the one from the SQLite.org." from the docs for my module <a href="https://metacpan.org/release/WWW-Scraper-Wikipedia-ISO3166">WWW::Scraper::Wikipedia::ISO3166</a>.</p>

<p>Lastly, my test files assume you're using <a href="https://metacpan.org/release/GraphViz2">GraphViz2</a> V 2.07.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Advance warning re App::Office::Contacts V 2.00</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2013/01/advance-warning-re-appofficecontacts-v-200.html" />
    <id>tag:blogs.perl.org,2013:/users/ron_savage//297.4185</id>

    <published>2013-01-09T01:02:17Z</published>
    <updated>2013-01-09T01:23:58Z</updated>

    <summary>Hi I&apos;m re-writing App::Office::Contacts, and making many internal changes. Externally, little will change. (See also: Famous Last Words.) The point of this post is to solicit feedback: If you&apos;re interested in these modules, or are worried about the changes, comment...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>I'm re-writing <a href="https://metacpan.org/release/App-Office-Contacts">App::Office::Contacts</a>, and making many internal changes.</p>

<p>Externally, little will change. (See also: <a href="https://en.wiktionary.org/wiki/famous_last_words">Famous Last Words</a>.)</p>

<p>The point of this post is to solicit feedback: If you're interested in these modules, or are worried about the changes, comment below, or email me directly.</p>

<p>Hopefully, however, no-one is using the module, so exactly the same number of people will be affected...</p>

<p>Some details:</p>

<p>Internal changes include:<br />
o Switch from CGI::Application to CGI::Snapp<br />
o Switch from CGI::Session to Data::Session<br />
o Switch from Log::Dispatch to Log::Handler<br />
o Switch from YUI to jQuery<br />
o Restructure the class hierarchy<br />
o For MySQL users, adopt engine=innodb<br />
o Additions to the people table: facebook_id and twitter_id<br />
o Old fields in the people table now ignored: broadcasts, communication_types</p>

<p>External changes:<br />
o The appearance of each input form will be a bit different, mainly due to adopting jQuery</p>

<p>Future changes:<br />
o I am aware the lack of sites/addresses (per org, per person) is a deficiency. That will be rectified shortly.</p>

<p>The companion modules App::Office::Contacts::Donations and App::Office::Contacts::Import::vCards will of course change to match.</p>]]>
        
    </content>
</entry>

<entry>
    <title>A font just for sarcasm - gotta love it</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/11/a-font-just-for-scarcasm---gotta-love-it.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4078</id>

    <published>2012-11-29T00:25:53Z</published>
    <updated>2012-11-29T02:36:37Z</updated>

    <summary>Hi Yes, it&apos;s true: Click to behold. Cheers...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>Yes, it's true:</p>

<p><a href="http://siineofthetimes.blogspot.com.au/2011/12/siine-writer-and-sarcastic-font.html">Click to behold</a>.</p>

<p>Cheers<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>30 url mappers for Google code-in</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/11/30-url-mappers-for-google-code-in.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4028</id>

    <published>2012-11-07T05:16:29Z</published>
    <updated>2012-11-07T05:18:24Z</updated>

    <summary>Hi Here&apos;s a list of 30 url mappers I&apos;d like to treat as per the list of 122 class builders. Please comment re adds or deletes, evaluation criteria, whatever. Catalyst::Dispatcher CGI::Application::Plugin::ActionDispatch CGI::Application::Plugin::REST CGI::Application::Plugin::Routes CGI::Application::URIMapping Dancer::Plugin::Dispatcher Dancer::Route Forward::Routes HTTP::Router::Route Jifty::Dispatcher Mojolicious::Routes...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>Here's a list of 30 url mappers I'd like to treat as per the list of 122 class builders. Please comment re adds or deletes, evaluation criteria, whatever.</p>

<p>Catalyst::Dispatcher<br />
CGI::Application::Plugin::ActionDispatch<br />
CGI::Application::Plugin::REST<br />
CGI::Application::Plugin::Routes<br />
CGI::Application::URIMapping<br />
Dancer::Plugin::Dispatcher<br />
Dancer::Route<br />
Forward::Routes<br />
HTTP::Router::Route<br />
Jifty::Dispatcher<br />
Mojolicious::Routes<br />
Path::Dispatcher<br />
Path::Router<br />
Pickles::Dispatcher<br />
Pinwheel::Mapper<br />
Plack::App::Path::Router<br />
Plack::App::Path::Router::PSGI<br />
Plack::App::URLMap<br />
PlackX::RouteBuilder<br />
REST::Application::Routes<br />
Router::Dumb<br />
Router::Generic<br />
Router::Simple<br />
Routes::Tiny<br />
Scaffold::Routes<br />
Silki::Action::REST<br />
Sleep::Routes<br />
Web::API::Mapper<br />
Web::Dispatcher::Simple<br />
Web::Simple</p>

<p>Omitted: Apache-specific, FCGI-specific, Engine X-specific.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>122 class builders for Google code-in</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/11/122-class-builders-for-google-code-in.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4027</id>

    <published>2012-11-07T05:10:18Z</published>
    <updated>2012-11-07T05:16:12Z</updated>

    <summary>Hi Here&apos;s a list of class builders which I&apos;d like to turn into a task to assess them (I&apos;d mentor it) for Google&apos;s code-in. If you have any suggestions (add, delete), please do so in the comments. Assessment would include...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>Here's a list of class builders which I'd like to turn into a task to assess them (I'd mentor it) for Google's code-in. If you have any suggestions (add, delete), please do so in the comments.</p>

<p>Assessment would include features, outstanding bugs, reviews, date of last update, whatever. Perhaps even speed.</p>

<p>accessors<br />
accessors::fast<br />
App::Benchmark::Accessors (Benchmarks the other modules)<br />
Attribute::Property<br />
AutoCode::AccessorMaker<br />
Badger<br />
Basset::Object<br />
Class::Accessor<br />
Class::Accessor::Assert<br />
Class::Accessor::Chained<br />
Class::Accessor::Children<br />
Class::Accessor::Class<br />
Class::Accessor::Classy<br />
Class::Accessor::Complex<br />
Class::Accessor::Constructor<br />
Class::Accessor::Contextual<br />
Class::Accessor::FactoryTyped<br />
Class::Accessor::Fast<br />
Class::Accessor::Fast::Contained<br />
Class::Accessor::Fast::GXS<br />
Class::Accessor::Fast::WithBuilder<br />
Class::Accessor::Fast::XS<br />
Class::Accessor::Grouped<br />
Class::Accessor::Installer<br />
Class::Accessor::Lite<br />
Class::Accessor::Lite::Lazy<br />
Class::Accessor::Lvalue<br />
Class::Accessor::Named<br />
Class::Accessor::Ref<br />
Class::Accessor::Tiny<br />
Class::Accessor::WithDefault<br />
Class::AccessorMaker<br />
Class::Adapter::Builder<br />
Class::Attrib<br />
Class::AutoAccess<br />
Class::AutoClass<br />
Class::Axelerator<br />
Class::Builder<br />
Class::Class<br />
Class::Classgen<br />
Class::Closure<br />
Class::Colon<br />
Class::Constructor<br />
Class::Contract<br />
Class::Data::Accessor<br />
Class::Data::Inheritable<br />
Class::Declare<br />
Class::Delegate<br />
Class::Delegation<br />
Class::Dot<br />
Class::Easy<br />
Class::Field<br />
Class::Fields (Obsolete)<br />
Class::Frame<br />
Class::Framework<br />
Class::Generate<br />
Class::Gomor<br />
Class::Holon<br />
Class::Hook<br />
Class::InsideOut<br />
Class::Light<br />
Class::MakeMethods<br />
Class::MakeMethods::Emulator::AccessorFast<br />
Class::Maker<br />
Class::Member<br />
Class::Meta<br />
Class::Meta::AccessorBuilder<br />
Class::Meta::Express<br />
Class::MethodMaker<br />
Class::Monkey<br />
Class::MOS (Special case)<br />
Class::NamedParms<br />
Class::ObjectTemplate<br />
Class::Prototyped<br />
Class::Root<br />
Class::Scaffold::Accessor<br />
Class::SelfMethods (Deprecated)<br />
Class::Std<br />
Class::Struct<br />
Class::StructTemplate<br />
Class::Tangram<br />
Class::Template<br />
Class::Trigger<br />
Class::Virtual<br />
Class::XSAccessor<br />
Class::XSAccessor::Compat<br />
classes<br />
CodeGen::PerlBean<br />
Data::AsObject<br />
EntityModel::Class::Accessor<br />
Hash::FieldHash<br />
Hash::Objectify<br />
Hash::Util::FieldHash<br />
HTML::Mason::MethodMaker<br />
Lexical::Attributes<br />
Loompa<br />
M<br />
Mo<br />
Moo<br />
Moos<br />
Moose (The heavy-weight one of the pack)<br />
Moose::Tiny<br />
Moose::Micro<br />
MooseX::EasyAcc<br />
MooseX::FollowPBP<br />
MooseX::SemiAffordanceAccessor<br />
Mouse<br />
Object::Accessor<br />
Object::Accessor::XS<br />
Object::Botox<br />
Object::Generic<br />
Object::InsideOut<br />
Object::Simple<br />
Object::Tiny<br />
Object::Tiny::Lvalue<br />
OOP::Perlish::Class::Accessor<br />
OOPS<br />
Package::New<br />
Reindeer<br />
Simple::Accessor<br />
Sub::Auto<br />
Sub::Mage</p>]]>
        
    </content>
</entry>

<entry>
    <title>Auto-detection of clusters in Graphviz *.gv files</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/11/auto-detection-of-clusters-in-graphviz-gv-files.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4014</id>

    <published>2012-11-03T23:28:54Z</published>
    <updated>2012-11-03T23:35:49Z</updated>

    <summary>Hi I&apos;ve released GraphViz2::Marpa::PathUtils V 1.01, which now offers an algorithm that performs auto-detection of clusters in Graphviz *.gv files, via the find_clusters() method. Download, or read the docs at the usual place: GraphViz2::Marpa::PathUtils Peruse the demo. The most complex...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>I've released GraphViz2::Marpa::PathUtils V 1.01, which now offers an algorithm that performs auto-detection of clusters in Graphviz *.gv files, via the find_clusters() method.</p>

<p>Download, or read the docs at the usual place:</p>

<p><a href="https://metacpan.org/module/GraphViz2::Marpa::PathUtils">GraphViz2::Marpa::PathUtils</a></p>

<p>Peruse <a href="http://savage.net.au/Perl-modules/html/graphviz2.pathutils/index.html">the demo</a>.</p>

<p>The most complex input file I tested ran foul of a bug in Graphviz itself, which I've reported. I am using Graphviz V 2.26.3, and the bug has been kindly confirmed by Ryan Schimdt in 2.28.0 and 2.29.20121022.0445 on OS X. So, that image is not yet on the demo page.</p>

<p>Note: An option in the code allows outputting the resultant *.gv file, hence making it available for further processing, and the format of the (optional) output image (svg, png, ...) is also an option (which is passed to 'dot').</p>

<p>Note: Nodes and edges using ports are not yet supported.</p>

<p>Thanx to Ron Newman (on the Graphviz mailing list) for the suggestion to implement this (despite the complexity of the code I had to write :-).</p>

<p>Lastly, the previous algorithm in the module (in V 1.00), accessed via the find_fixed_length_paths() method, finds all paths of a given length starting from a given node. Demo output is included in the above URL.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Tree, Tree::Binary, Tree::DAG_Node, Tree::Persist and Forest</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/11/tree-treebinary-treedag-node-treepersist-and-forest.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4009</id>

    <published>2012-11-02T09:21:02Z</published>
    <updated>2012-11-02T09:39:07Z</updated>

    <summary>Hi I wanted to title this post: The Tree::Hugger Chronicles: Tree, etc, but that was too long. Anyway, I mention Forest only to say I won&apos;t mention it further. I&apos;ve become co-maint (or accidentally, owner) of various Tree-ish modules, so...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>I wanted to title this post: The Tree::Hugger Chronicles: Tree, etc, but that was too long.</p>

<p>Anyway, I mention Forest only to say I won't mention it further.</p>

<p>I've become co-maint (or accidentally, owner) of various Tree-ish modules, so I thought I mention what's up. Each module is followed by an extract from the CHANGES file.</p>

<p>o Tree: I've just released V 1.03:<br />
- Rename Tree::Binary to Tree::Binary2 so it no longer clashes with the Tree::Binary shipped in the Tree-Binary distro. MetaCPAN was getting confused, and automatically redirected links from this  module's Tree:Binary to the other one.</p>

<p>o Tree:Binary: No activity.</p>

<p>o Tree::DAG_Node. I've just released V 1.06:<br />
- Pre-emptive apologies for any changes which are not back-compat. No such problems are expected, but the introduction of new methods may disconcert some viewers.<br />
- Fix RT#78858, reported by Gene Boggs. Audit code for similar problems.<br />
- Fix RT#79506. reported by Ron Savage.<br />
- Rename ChangeLog to CHANGES, and add Changelog.ini.<br />
- Replace all uses of cyclicity_fault() and Carp::croak with die.<br />
- Remove unused methods: decommission_root(), cyclicity_allowed(), cyclicity_fault(), inaugurate_root(),  no_cyclicity() and _update_links(). OK - cyclicity_fault() was called once. It just died.<br />
- Add methods: format_node(), hashref2string(), is_root(), node2string(), tree2string().<br />
tree2string($opts, $node) - unlike draw_ascii_tree() - can optionally print the tree starting at any node. Override format_node(), hashref2string(), and node2string() if desired.<br />
- Reformat the POD big-time.<br />
- Add Build.PL.<br />
- Re-write Makefile.PL.<br />
- Remove use vars(@ISA $Debug $VERSION). Replace latter 2 with 'our ...'.<br />
- Rename t/00_about_verbose.t to t/about.perl.t.<br />
- Add scripts/cut.and.paste.subtrees.pl. Warning: Some trees get into an infinite loop.<br />
- Add t/cut.and.paste.subtrees.t.        Warning: Some trees get into an infinite loop.<br />
- Document the options (discouraged by Sean) supported in the call to new($hashref).</p>

<p>o Tree::Persist. No activity.<br />
In fact I'm not yet co-maint of this, due to a typo by $name_elided who removed himself as owner rather than make me co-maint.<br />
A fix from the CPAN admins is taking so long I decided to volunteer to become an admin rather than complain, but that matter is still up in the air. Perhaps nothing will come of it.</p>

<p>Also, as I release updates, I'm adding some common POD to each. Just a See Also so far, with a little FAQ.</p>

<p>And why do this? Well, I've been doing a lot of work which required a tree data structure, will parsing Graphviz *.gv files, and ended up using Tree::DAG_Node after switching back and forth between it and Tree, because the former is so good. But I'm aware it was criticised for having no meaningful tests, so I wrote a test which cuts-and-pastes a few sub-trees. But be warned, such code can easily get into an infinite loop, so don't copy it mindlessly.</p>

<p>As for the Graphviz work, that deserves a separate blog entry.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Calling David Hand, author of Tree::DAG_Node</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/10/calling-david-hand-author-of-treedag-node.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.4000</id>

    <published>2012-10-28T23:04:42Z</published>
    <updated>2012-10-28T23:07:56Z</updated>

    <summary>Hi Neither I nor Sean Burke can get a response from David, bit if anyone knows him, please let him know I&apos;d like to take co-maint of Tree::DAG_Node in order to fix bugs. So, I&apos;ll ask the CPAN admins on...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>Neither I nor Sean Burke can get a response from David, bit if anyone knows him, please let him know I'd like to take co-maint of Tree::DAG_Node in order to fix bugs.</p>

<p>So, I'll ask the CPAN admins on Friday to do that if I don't hear from him beforehand.</p>

<p>If he doesn't want me to be co-maint, I'll fork the code...</p>]]>
        
    </content>
</entry>

<entry>
    <title>Graphviz and fixed length paths</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2012/10/graphviz-and-fixed-length-paths.html" />
    <id>tag:blogs.perl.org,2012:/users/ron_savage//297.3902</id>

    <published>2012-09-30T23:14:43Z</published>
    <updated>2012-09-30T23:21:16Z</updated>

    <summary>Hi If you&apos;re using AT&amp;T&apos;s Graphviz and you&apos;re interested in finding fixed length paths thru your graphs, there&apos;s a new module to help. You&apos;ll need Marpa, and GraphViz2, and GraphViz2::Marpa. These will be installed as pre-reqs. Then all you need...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Hi</p>

<p>If you're using <a href="http://www.graphviz.org/">AT&T's Graphviz</a> and you're interested in finding fixed length paths thru your graphs, there's a new module to help.</p>

<p>You'll need <a href="https://metacpan.org/release/Marpa-R2">Marpa</a>, and <a href="https://metacpan.org/release/GraphViz2">GraphViz2</a>, and <a href="https://metacpan.org/release/GraphViz2-Marpa">GraphViz2::Marpa</a>. These will be installed as pre-reqs.</p>

<p>Then all you need is <a href="https://metacpan.org/release/GraphViz2-Marpa-PathUtils">GraphViz2::Marpa::PathUtils</a>, after it hits CPAN.</p>

<p>You can start reading the docs <a href="http://savage.net.au/Perl-modules/html/GraphViz2/Marpa/PathUtils.html">here</a>.</p>

<p>Cheers<br />
</p>]]>
        
    </content>
</entry>

</feed>
