<?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/"
	>

<channel>
	<title>canspice.org &#187; perl</title>
	<atom:link href="http://www.canspice.org/tag/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.canspice.org</link>
	<description>all about a canadian guy living in canada</description>
	<lastBuildDate>Sun, 05 Feb 2012 14:59:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Notes on creating a Shipwright package for Starlink Perl modules</title>
		<link>http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/</link>
		<comments>http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 02:51:00 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[Geek Stuff]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[shipwright]]></category>

		<guid isPermaLink="false">http://www.canspice.org/?p=1066</guid>
		<description><![CDATA[I&#8217;m using Shipwright to come up with an easier method of installing Perl modules for the Starlink Software Collection. Normally it takes me the better part of a day to manually install everything for one platform. Given we support (at least) four different platforms, this is a waste of my time. Shipwright can (purportedly) automate [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m using <a href="http://search.cpan.org/dist/Shipwright/">Shipwright</a> to come up with an easier method of installing Perl modules for the <a href="http://starlink.jach.hawaii.edu/starlink">Starlink Software Collection</a>. Normally it takes me the better part of a day to manually install everything for one platform. Given we support (at least) four different platforms, this is a waste of my time. Shipwright can (purportedly) automate this to some degree.</p>
<p>Unfortunately Shipwright&#8217;s documentation is lacking, so I thought I&#8217;d keep some notes about my process in hopes that it will help others in creating a Shipwright package (or vessel, or repository, or whatever it&#8217;s actually called). These notes were written with version 2.2.1.</p>
<p>By the way, I&#8217;m only showing output from Shipwright and not from any of the other commands I run. A command run on the command-line is prefixed with a <tt>%</tt>.</p>
<p>I first started by creating a directory (<tt>oracdr-perl-modules</tt>) that would hold everything. Then I changed into that directory and initialized a git repository:</p>
<pre> % cd oracdr-perl-modules
 % git init</pre>
<p>I then initialized my Shipwright repository and commited the initial state to my git repository:</p>
<pre> % shipwright create -r fs:`pwd`
 % git add *
 % git commit -m 'Shipwright initialization.'</pre>
<p>I am not using the git backend for Shipwright, as I will be handling my git repository manually.</p>
<p>As I will be making tweaks to modules to make sure they build correctly, pass tests, etc., I created a <tt>vendor</tt> branch that would hold the un-modified modules as downloaded from <a href="http://search.cpan.org/">CPAN</a>:</p>
<pre> % git branch vendor
 % git checkout vendor</pre>
<p>Then I started adding modules from CPAN:</p>
<pre> % shipwright -r fs:`pwd` import cpan:Proc::Simple
 % git add *
 % git commit -m 'Added Proc::Simple.'</pre>
<p>These three steps were repeated for all of the CPAN modules I needed.</p>
<p>Once I finished importing the CPAN modules, I switched to my <tt>master</tt> branch and merged from <tt>vendor</tt>, since I want my <tt>vendor</tt> branch to reflect the &#8220;base&#8221; state of modules as obtained from the vendor, and my <tt>master</tt> branch to hold any local changes I have to make to the modules to get them to build properly:</p>
<pre> % git checkout master
 % git merge vendor</pre>
<p>Now it was time to make tweaks to some of the modules. As an example, <tt><a href="http://search.cpan.org/~kgb/ExtUtils-F77-1.16/">ExtUtils::F77</a></tt> doesn&#8217;t support the <a href="http://www.g95.org/">g95</a> Fortran compiler, so I had to make some changes to the <tt>F77.pm</tt> file:</p>
<pre> % cd sources/cpan-ExtUtils-F77/vendor
 % xemacs F77.pm</pre>
<p>Once my changes were complete, I checked in the modified file:</p>
<pre> % git add F77.pm
 % git commit -m 'ExtUtils::F77: Tweaks to support g95.'</pre>
<p>I had to add some compilation options for <tt><a href="http://search.cpan.org/~pratzlaff/Astro-FITS-CFITSIO-1.05/">Astro::FITS::CFITSIO</a></tt>, adding a command-line option when running <tt>perl Makefile.PL</tt> and tweaking <tt>Makefile.PL</tt>. To do this, I modified the <tt>build</tt> file:</p>
<pre> % cd ../../../scripts/cpan-Astro-FITS-CFITSIO
 % xemacs build</pre>
<p>As I needed to add a command-line option to the <tt>Makefile.PL</tt> line, I edited the <tt>configure:</tt> line to read:</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1066code2'); return false;">View Code</a> PERL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p10662"><td class="code" id="p1066code2"><pre class="perl" style="font-family:monospace;">configure<span style="color: #339933;">:</span> <span style="color: #339933;">%</span><span style="color: #0000ff;">%PERL</span><span style="color: #339933;">%%</span> Makefile<span style="color: #339933;">.</span>PL OPTIMIZE<span style="color: #339933;">=-</span>O LIB<span style="color: #339933;">=%</span><span style="color: #0000ff;">%INSTALL_BASE</span><span style="color: #339933;">%%/</span>lib<span style="color: #339933;">/</span>perl5<span style="color: #339933;">/</span> PREFIX<span style="color: #339933;">=%</span><span style="color: #0000ff;">%INSTALL_BASE</span><span style="color: #339933;">%%</span> <span style="color: #339933;">%</span><span style="color: #0000ff;">%MAKEMAKER_CONFIGURE_EXTRA</span><span style="color: #339933;">%%</span></pre></td></tr></table></div>

<p>In this case, I added <tt>OPTIMIZE=-O</tt>. </p>
<p>I then edited the <tt>Makefile.PL</tt>:</p>
<pre> % cd ../../sources/cpan-Astro-FITS-CFITSIO/vendor
 % xemacs Makefile.PL</pre>
<p>Then, another commit to the git repository:</p>
<pre> % git add Makefile.PL ../../../sources/cpan-Astro-FITS-CFITSIO/build
 % git commit -m 'Astro::FITS::CFITSIO: Add OPTIMIZE=-O to Makefile.PL command-line, edit Makefile.PL to know about $ENV{STARLINK_DIR}'</pre>
<p>At this point I thought I&#8217;d test out the build process, making sure that the modules I&#8217;d imported passed their tests. If they didn&#8217;t, I could either fix the tests or patch modules (or, in a worse-case scenario, tell Shipwright to skip testing specific modules). I had to make a clone of my git repository in a different directory:</p>
<pre> % cd ~/development
 % mkdir shipwright-test
 % cd shipwright-test
 % git clone file:///home/bradc/development/oracdr-perl-modules</pre>
<p>Testing time! I&#8217;m testing with a private build of Perl, which is located in <tt>$STARLINK_DIR/Perl/bin/perl</tt>, thus the extra preamble. If I was just using the system Perl I&#8217;d leave that out.
<pre> % cd oracdr-perl-modules
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder
no default install-base, will set it to /tmp/vessel_oracdr-perl-modules-pHWh30/oracdr-perl-modules
Building cpan-Proc-Simple
Building cpan-Tk</pre>
<p>During <tt>Tk</tt>&#8216;s tests it hung up. I&#8217;ve seen this before, so I cancelled the build by hitting <tt>Ctrl-C</tt>. I changed to my original Shipwright directory, deleted the offending test file, and updated my repository:</p>
<pre> % cd ~/development/oracdr-perl-modules/sources/cpan-Tk/vendor/t
 % git rm font.t
 % git commit -m 'Tk: font.t test locks up, remove it'</pre>
<p>Then back to my Shipwright test directory and continue on merrily. I first cleaned up the Shipwright build by adding <tt>--clean</tt> &#8212; this might not be necessary, but it allows things to start from a fresh slate. When building XS modules like Tk sometimes header or object files can get into a state, so cleaning them up before rebuilding is good practice, I&#8217;ve found.</p>
<pre> % cd ~/development/shipwright-test/oracdr-perl-modules
 % git pull
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder --clean
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder
Building cpan-Tk
Use of uninitialized value in string at bin/shipwright-builder line 443.
build cpan-Tk test part failed.
 at bin/shipwright-builder line 456
        main::_install('cpan-Tk', 'GLOB(0x12f73e10)') called at bin/shipwright-builder line 346
        main::install() called at bin/shipwright-builder line 241</pre>
<p>Another error. Rerunning with <tt>--verbose</tt><sup>[<a href="http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/#footnote_0_1066" id="identifier_0_1066" class="footnote-link footnote-identifier-link" title="sunnavy, the author of Shipwright, notes below that a build.log file is written, and that contains the error messages. Just check that for the error messages instead of having to re-run with --verbose!">1</a>]</sup> shows that the problem is with the <tt>t/listbox.t</tt> test, which I removed in a similar fashion to the <tt>t/font.t</tt> test. Update the repository, clean up, and start again:</p>
<pre> % git pull
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder --clean
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder
Building cpan-Tk
Building cpan-Params-Validate
Building cpan-Class-Singleton
Building cpan-Compress-Raw-Zlib
Building cpan-Compress-Raw-Bzip2
Building cpan-IO-Compress
Building cpan-IO-Zlib
Building cpan-Package-Constants
Building cpan-Archive-Tar
Building cpan-Regexp-Common
Building cpan-Pod-Escapes
Building cpan-Pod-Simple
Building cpan-podlators
Building cpan-Devel-Symdump
Building cpan-Pod-Coverage
Building cpan-Test-Pod-Coverage
Building cpan-Test-Pod
Building cpan-Test-Portability-Files
Building cpan-Pod-Readme
Building cpan-version
Building cpan-ExtUtils-CBuilder
Building cpan-Digest-SHA
Building cpan-Module-Signature
Building cpan-ExtUtils-ParseXS
Building cpan-Test-Harness
Building cpan-Module-Build
Building cpan-DateTime-TimeZone
Building cpan-List-MoreUtils
Building cpan-DateTime-Locale
Building cpan-DateTime
Building cpan-Time-Piece
Building cpan-IO-Tee
Building cpan-URI
Building cpan-HTML-Tagset
Building cpan-HTML-Parser
Building cpan-libwww-perl
Building cpan-Tk-TextANSIColor
Building cpan-XML-Parser
build cpan-XML-Parser make part failed.
 at bin/shipwright-builder line 456
        main::_install('cpan-XML-Parser', 'GLOB(0x116f0e10)') called at bin/shipwright-builder line 346
        main::install() called at bin/shipwright-builder line 241</pre>
<p>Well, that&#8217;s a bit more successful. Running with <tt>--verbose</tt> showed that the <tt>expat.h</tt> file couldn&#8217;t be found. I then determined that <tt><a href="http://search.cpan.org/~msergeant/XML-Parser-2.36/">XML::Parser</a></tt> is needed by <tt><a href="http://search.cpan.org/~mkutter/SOAP-Lite-0.710.08/">SOAP::Lite</a></tt>, which we don&#8217;t really need after all, so I switched to my Shipwright directory, changed to the <tt>vendor</tt> branch, removed <tt>SOAP::Lite</tt>, changed back to the <tt>master</tt> branch, then merged in the changes:</p>
<pre> % cd ~/development/oracdr-perl-modules
 % get checkout vendor
 % shipwright -r fs:`pwd` delete cpan-SOAP-Lite
 % shipwright -r fs:`pwd` delete cpan-XML-Parser
 % git add *
 % git rm -r scripts/cpan-SOAP-Lite
 % git rm -r scripts/cpan-XML-Parser
 % git rm -r sources/cpan-SOAP-Lite
 % git rm -r sources/cpan-XML-Parser
 % git commit -m 'Remove SOAP::Lite and XML::Parser.'
 % git checkout master
 % git merge vendor</pre>
<p>Note the change in naming convention when using <tt>shipwright delete</tt> versus <tt>shipwright import</tt>! For CPAN modules,  you import using <tt>cpan:SOAP::Lite</tt> and delete using <tt>cpan-SOAP-Lite</tt>.</p>
<p>Now, back to the test directory to start again:
<pre> % cd ~/development/shipwright-test/oracdr-perl-modules
 % git pull
 % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder --clean
akule % $STARLINK_DIR/Perl/bin/perl bin/shipwright-builder
Building cpan-Task-Weaken
Building cpan-DateTime-Format-Strptime
Use of uninitialized value in string at bin/shipwright-builder line 443.
build cpan-DateTime-Format-Strptime test part failed.</pre>
<p>This error is because of <tt><a href="http://search.cpan.org/~drolsky/DateTime-Locale-0.43/">DateTime::Locale</a></tt>. You&#8217;ll note that the most recent version (as of this writing) is 0.43. Apparently this version causes one of the tests in <tt><a href="http://search.cpan.org/~rickm/DateTime-Format-Strptime-1.0901/">DateTime::Format::Strptime</a></tt> to fail, so we need to tell Shipwright that we only want version 0.42 of <tt>DateTime::Locale</tt>. In our Shipwright repository we do:</p>
<pre> % git checkout vendor
 % shipwright update -r fs:`pwd` cpan-DateTime-Locale --version 0.42
imported with success
updated with success</pre>
<p>Don&#8217;t let those two lines fool you! Nothing has actually happened here<sup>[<a href="http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/#footnote_1_1066" id="identifier_1_1066" class="footnote-link footnote-identifier-link" title="Actually, this whole section doesn&amp;#8217;t apply to version 2.3 of Shipwright, as this version bug has since been fixed.">2</a>]</sup>. If you run the last command with <tt>-l info</tt> you&#8217;ll see a message stating:
<pre>path scripts/cpan-DateTime-Locale alreay exists, need to set overwrite arg to overwrite</pre>
<p>I wouldn&#8217;t call this &#8220;success&#8221;, so I <a href="http://rt.cpan.org/Public/Bug/Display.html?id=47789">filed a bug</a><sup>[<a href="http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/#footnote_2_1066" id="identifier_2_1066" class="footnote-link footnote-identifier-link" title="Like I said, this bug was fixed in Shipwright v2.3.">3</a>]</sup>. Turns out the <tt>overwrite</tt> argument isn&#8217;t implemented (<a href="http://rt.cpan.org/Public/Bug/Display.html?id=47790">another bug filed</a>) so I just deleted <tt>DateTime::Locale</tt> and imported version 0.42:
<pre> % shipwright -r fs:`pwd` delete cpan-DateTime-Locale
 % shipwright -r fs:`pwd` import cpan:DateTime::Locale --version 0.42
 % git add *
 % git commit -m 'Revert DateTime::Locale to v0.42 to...'
 % git checkout master
 % git merge vendor</pre>
<p>At this point I&#8217;m not going to show every little error that popped up. Let&#8217;s skip ahead to the end:
<pre>Building cpan-Astro-FITS-CFITSIO
install finished, the dists are at /tmp/vessel_oracdr-perl-modules-GwEUP5/oracdr-perl-modules</pre>
<p>Success!</p>
<p>Sort of. At this point I&#8217;ve only done the CPAN modules. Now it&#8217;s time to do some of our own modules. Because our modules aren&#8217;t stored in separate git repositories, I have to make a <a href="http://en.wikipedia.org/wiki/Tar_(file_format)">tarball</a> of each one and import that:</p>
<pre> % shipwright import -r fs:`pwd` file:/home/bradc/development/starlink/perlmods/Starlink/Config/Starlink-Config-1.01.tar.gz</pre>
<p><tt>Starlink-Config-1.01.tar.gz</tt> is the result of doing <tt>perl Makefile.PL &#038;&#038; make dist</tt> in our <tt>starlink/perlmods/Starlink/Config</tt> directory, which is the standard method of creating a tarball for distribution. Shipwright can import these directly.</p>
<p>Unfortunately when you import a module using a tarball, Shipwright doesn&#8217;t seem to realize that it exists for the purposes of being an installation requirement for future modules. For example, our <tt>Astro::Telescope</tt> module depends on <tt>Astro::SLA</tt>. I imported <tt>Astro::SLA</tt> from a tarball, then tried to import <tt>Astro::Telescope</tt>. Instead of realizing that <tt>Astro::SLA</tt> was already imported, Shipwright imported it again from CPAN. This is a particular problem when you&#8217;ve imported a module that doesn&#8217;t exist on CPAN, as Shipwright tries to find it, then fails to, and then crashes with a scary error:</p>
<pre> % shipwright import -r fs:`pwd` file:/home/bradc/development/starlink/perlmods/Starlink/HDSPACK/Starlink-HDSPACK-undef.tar.gz
CPAN related output will be at /tmp/shipwright_cpan.log
Use of uninitialized value in numeric eq (==) at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Source/CPAN.pm line 85.
invalid source: can't find 'NDF' in your CPAN mirror(s) [http://cpan.mirror.facebook.com http://cpan.knowledgematters.net http://cpan.yahoo.com]. at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Source/CPAN.pm line 97
        Shipwright::Source::CPAN::run('Shipwright::Source::CPAN=HASH(0x789c8d0)') called at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Source/Base.pm line 441
        Shipwright::Source::Base::_follow('Shipwright::Source::Compressed=HASH(0x6ca0770)', '/tmp/shipwright_source_gIMm9O/Starlink-HDSPACK-undef') called at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Source/Compressed.pm line 33
        Shipwright::Source::Compressed::run('Shipwright::Source::Compressed=HASH(0x6ca0770)', 'copy', 'HASH(0x661ac80)') called at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Script/Import.pm line 157
        Shipwright::Script::Import::run('Shipwright::Script::Import=HASH(0x639b500)', 'file:/home/bradc/development/starlink/perlmods/Starlink/HDSPA...') called at /local/perl-5.8/lib/site_perl/5.8.8/App/CLI/Command.pm line 53
        App::CLI::Command::run_command('Shipwright::Script::Import=HASH(0x639b500)', 'file:/home/bradc/development/starlink/perlmods/Starlink/HDSPA...') called at /local/perl-5.8/lib/site_perl/5.8.8/App/CLI.pm line 79
        App::CLI::dispatch('Shipwright::Script') called at /local/perl/bin/shipwright line 16</pre>
<p>Did you spot the key piece of information there? Here it is:
<pre>invalid source: can't find 'NDF' in your CPAN mirror(s) [http://cpan.mirror.facebook.com http://cpan.knowledgematters.net http://cpan.yahoo.com]. at /local/perl-5.8/lib/site_perl/5.8.8/Shipwright/Source/CPAN.pm line 97</pre>
<p>Even though I&#8217;ve already imported <tt>NDF</tt> to this Shipwright repository, Shipwright can&#8217;t find it. I&#8217;ve <a href="https://rt.cpan.org/Ticket/Display.html?id=47846">filed a bug</a> about this one<sup>[<a href="http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/#footnote_3_1066" id="identifier_3_1066" class="footnote-link footnote-identifier-link" title="&amp;#8230;which has since been closed because the developer doesn&amp;#8217;t consider this a bug. You can see his reply and rationale by clicking that link.">4</a>]</sup>.</p>
<p>The only work-around I can see at this point is to add <tt>--no-follow</tt> to my imports. This means that I have to have figured out the module requirements and dependency tree before importing every module from this point, which luckily I&#8217;ve already done. However, if this had been early in the process and I was relying on Shipwright to figure all of this out for me (which it&#8217;s supposed to do) I&#8217;d be screwed.</p>
<p>I found that the <tt>NDF</tt> module was missing a file in its <tt>MANIFEST</tt> so it wouldn&#8217;t build properly. I fixed the module, recreated the tarball, and deleted and imported the module again:</p>
<pre> % shipwright delete -r fs:`pwd` NDF
 % shipwright import -r fs:`pwd` file:/home/bradc/development/starlink/perlmods/Starlink/NDF/NDF-1.48.tar.gz</pre>
<p>Now unfortunately when you do this sort of thing Shipwright thinks you want to build this module at the end, when actually you just want to build it where it was before. If you&#8217;ve already imported a bunch and want to go back and fix a module in this way, things will build out of order and your dependency tree will be all screwed up. Since I&#8217;m keeping this repository in git, I just have to revert a couple of files:</p>
<pre> % git checkout -- shipwright/order.yml
 % git checkout -- scripts/NDF/require.yml</pre>
<p>The <tt>shipwright/order.yml</tt> file tells Shipwright which order to build modules in, and since we want to keep that order, we just revert it to lose the changes imposed by the delete/import pair of commands. The <tt>scripts/NDF/require.yml</tt> file lists requirements for <tt>NDF</tt> &#8212; I don&#8217;t know if this is used by Shipwright anywhere, but we might as well revert it anyhow.</p>
<p>I&#8217;m skipping ahead here to the point where I&#8217;ve ironed out all the kinks in my Shipwright repository, and it&#8217;s time to create a vessel on each platform and install the modules in my Starlink distribution directory. For future reference, Starlink has Perl installed in <tt>/star/Perl</tt>, so that&#8217;s the base directory for this case.</p>
<p>I start by checking out the repository via git:</p>
<pre> % git clone file:///net/akule/export/data/bradc/backup/development/oracdr-perl-modules perlmods-nanahope</pre>
<p>Once this is done, I create my vessel:</p>
<pre> % cd perlmods-nanahope
 % /star/Perl/bin/perl bin/shipwright-builder --install-base /tmp/shipwright-vessel</pre>
<p>This goes about and, since I&#8217;ve fixed up all of the tests and compiles and whatnot, creates the vessel in <tt>/tmp/shipwright-vessel</tt>.</p>
<p>Because the library directory structure doesn&#8217;t match that for Perl itself, I can&#8217;t install directly into <tt>/star/Perl</tt> like I&#8217;d want. Instead I have to change to my <tt>/star/Perl/lib/perl5/site_perl/5.10.0</tt> directory, then copy the Shipwright-created files over:</p>
<pre> % cd /star/Perl/lib/perl5/site_perl/5.10.0
 % rsync -avz /tmp/shipwright-vessel/lib/perl5/ ./</pre>
<p>And I&#8217;m done! Well, not quite, as I have some scripts in <tt>/tmp/shipwright-vessel/bin</tt> that need copying over. However, those scripts are merely wrappers around calls to a Shipwright-specific script. If you&#8217;re just installing into a Perl tree, you should copy the files in <tt>/tmp/shipwright-vessel/bin-wrapped</tt> into your Perl <tt>bin</tt> directory instead, as it keeps things clean.</p>
<ol class="footnotes"><li id="footnote_0_1066" class="footnote">sunnavy, the author of Shipwright, <a href="http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/comment-page-1/#comment-62266">notes below</a> that a <tt>build.log</tt> file is written, and that contains the error messages. Just check that for the error messages instead of having to re-run with <tt>--verbose</tt>!</li><li id="footnote_1_1066" class="footnote">Actually, this whole section doesn&#8217;t apply to version 2.3 of Shipwright, as this version bug has since been fixed.</li><li id="footnote_2_1066" class="footnote">Like I said, this bug was fixed in Shipwright v2.3.</li><li id="footnote_3_1066" class="footnote">&#8230;which has since been closed because the developer doesn&#8217;t consider this a bug. You can see his reply and rationale by clicking that link.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2009/08/03/notes-on-creating-a-shipwright-package-for-starlink-perl-modules/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>YAPC 10: Trapped In A Room With Schwern, by Michael Schwern</title>
		<link>http://www.canspice.org/2009/06/22/yapc-10-trapped-in-a-room-with-schwern-by-michael-schwern/</link>
		<comments>http://www.canspice.org/2009/06/22/yapc-10-trapped-in-a-room-with-schwern-by-michael-schwern/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 01:50:45 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[YAPC 10]]></category>
		<category><![CDATA[michael schwern]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.canspice.org/?p=1054</guid>
		<description><![CDATA[This wasn&#8217;t really a talk, it was more &#8220;ask Schwern questions and he&#8217;ll answer them and maybe go off on a tangent about something else.&#8221; First question was a two-parter: what do you want to work on next year and what don&#8217;t you want to work on next year? First answer is for the second [...]]]></description>
			<content:encoded><![CDATA[<p>This wasn&#8217;t really a talk, it was more &#8220;ask Schwern questions and he&#8217;ll answer them and maybe go off on a tangent about something else.&#8221;</p>
<p>First question was a two-parter: what do you want to work on next year and what don&#8217;t you want to work on next year?</p>
<p>First answer is for the second question: PHP. Second answer for the first question: he wants to be (or make) the <a href="http://www.redhat.com/">Red Hat</a> of <a href="http://www.cpan.org/">CPAN</a>. He wants to take the 5000 modules and 2000 developers and have one front-end where things just work. When you&#8217;re using a module from CPAN you don&#8217;t know what you&#8217;re going to get, as modules change all the time with new releases. Schwern wants to change this somehow.</p>
<p>Regarding PHP, Schwern is working with PHP full-time. He says that the good thing about PHP is that when you download it, it just works right out of the box. You don&#8217;t have to worry about modules and plugins and whatnot. This leads to PHP&#8217;s bad side: global namespace pollution. There are 75 built-in functions to deal with arrays and 13 different sort functions. Crazy!</p>
<p>He wants to declare <a href="http://perldoc.perl.org/ExtUtils/MakeMaker.html"><tt>ExtUtils::MakeMaker</tt></a> finished. Go use <a href="http://perldoc.perl.org/Module/Build.html"><tt>Module::Build</tt></a> instead!</p>
<p>A while back Damian Conway said something about Perl 5 + <em>i</em>, which was kind of a joke in that Damian way, but Schwern went and created <a href="http://search.cpan.org/dist/perl5i/">perl5i</a>. It modifies perl5 &#8220;so it fits how it works in [Schwern's] imagination&#8221; by enabling a bunch of modules automatically, like <a href="http://search.cpan.org/~chromatic/Modern-Perl-1.03/"><tt>Modern::Perl</tt></a>, <a href="http://search.cpan.org/~msergeant/Time-Piece-1.14/"><tt>Time::Piece</tt></a> and <a href="http://search.cpan.org/~chocolate/autobox-2.55/"><tt>autobox</tt></a>.</p>
<p>Then there was something about how being polyamorous is like <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile software development</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2009/06/22/yapc-10-trapped-in-a-room-with-schwern-by-michael-schwern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YAPC 10: Opening Addresses</title>
		<link>http://www.canspice.org/2009/06/22/yapc-10-opening-addresses/</link>
		<comments>http://www.canspice.org/2009/06/22/yapc-10-opening-addresses/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 00:49:55 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[YAPC 10]]></category>
		<category><![CDATA[jerry gay]]></category>
		<category><![CDATA[larry wall]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[richard dice]]></category>
		<category><![CDATA[the parrot foundation]]></category>
		<category><![CDATA[the perl foundation]]></category>
		<category><![CDATA[yaakov]]></category>

		<guid isPermaLink="false">http://www.canspice.org/?p=1052</guid>
		<description><![CDATA[YAPC 10 kicked off Monday morning. Two of the organizers (Casey West and Dan Wright) started things off by regaling us with their tale of getting to and from YAPC::NA 2005 in Toronto. The take-away message was when you&#8217;re travelling to a foreign country, take appropriate travel documentation. A drivers license doesn&#8217;t count. After the [...]]]></description>
			<content:encoded><![CDATA[<p>YAPC 10 kicked off Monday morning. Two of the organizers (Casey West and Dan Wright) started things off by regaling us with their tale of getting to and from YAPC::NA 2005 in Toronto. The take-away message was when you&#8217;re travelling to a foreign country, take appropriate travel documentation. A drivers license doesn&#8217;t count.</p>
<p>After the opening spiel came <a href="http://www.operationaldynamics.com/about/staff/richard/">Richard Dice</a>, the president of <a href="http://www.perlfoundation.org/">The Perl Foundation</a>, gave us an update on TPF and Perl over the past year. From someone who doesn&#8217;t follow TPF it looks like financially it&#8217;s doing fairly well. It&#8217;s <a href="http://news.perlfoundation.org/2008/05/tpf_receives_large_donation_in.html">a $200,000 donation from Ian Hague</a> in May 2008, it received a $50,000 donation from <a href="http://www.booking.com/">booking.com</a>, and received another $70,000 from other donations. It has given out grants to help support Perl 6 development, to Nick Clark to release Perl 5.8.9, and to David Mitchell to release Perl 5.10.1.</p>
<p>In March 2009 <a href="http://www.parrot.org/foundation">The Parrot Foundation</a> was spun off from TPF.</p>
<p>TPF gave out five grands in each of the second and third quarters of 2008, two in the fourth quarter, and one in the first quarter of 2009. It&#8217;s sponsoring nine <a href="http://code.google.com/soc/">Google Summer of Code</a> projects, up from five last year.</p>
<p>Over the past year, Perl 5 has moved to <a href="http://www.git-scm.com/">git</a> for version control. <a href="http://strawberryperl.com/">Strawberry Perl</a>, for running Perl on Windows, was released. Various Perl groups were formed, such as the <a href="http://japan.perlassociation.org/jpa">Japan Perl Association</a> and the <a href="http://www.enlightenedperl.org/">Enlightened Perl Organization</a>.</p>
<p>There were many Perl-related events over the past year, from <a href="http://www.canspice.org/category/geek-stuff/oscon-2008/">OSCON</a> to workshops and hackathons around the world.</p>
<p>After Richard, <a href="http://www.wall.org/~larry/">Larry Wall</a> gave a keynote about error messages and how he&#8217;s making the ones in Perl 6 chatty.</p>
<p>After Larry, Jerry Gay from The Parrot Foundation gave a talk, and after him came <a href="http://kovaya.com/miscellany/">Yaakov</a>, telling new YAPCers to go talk to people.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2009/06/22/yapc-10-opening-addresses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Higher-Order Perl by MJD for free</title>
		<link>http://www.canspice.org/2008/12/09/higher-order-perl-by-mjd-for-free/</link>
		<comments>http://www.canspice.org/2008/12/09/higher-order-perl-by-mjd-for-free/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 02:17:07 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[Geek Stuff]]></category>
		<category><![CDATA[higher-order perl]]></category>
		<category><![CDATA[mark-jason dominus]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.canspice.org/?p=774</guid>
		<description><![CDATA[I&#8217;ve blogged about Mark-Jason Dominus before (2005, 2006, 2007) and each time I&#8217;ve told you to buy his book, Higher-Order Perl. Well now you don&#8217;t have to! He&#8217;s made it available for free on-line! Of course, if you want to support Perl programmers you should still buy his book.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve blogged about <a href="http://perl.plover.com/">Mark-Jason Dominus</a> before (<a href="http://www.canspice.org/2005/08/05/oscon-2005-you-cant-get-there-from-here-mark-jason-dominus/">2005</a>, <a href="http://www.canspice.org/2006/07/26/oscon-2006-higher-order-perl-mark-jason-dominus/">2006</a>, <a href="http://www.canspice.org/2007/07/23/oscon-2007-advanced-parsing-techniques-by-mark-jason-dominus/">2007</a>) and each time I&#8217;ve told you to buy his book, <a href="http://hop.perl.plover.com/">Higher-Order Perl</a>.</p>
<p>Well now you don&#8217;t have to! He&#8217;s made it <a href="http://hop.perl.plover.com/book/">available for free on-line</a>!</p>
<p>Of course, if you want to support Perl programmers you should still buy his book.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2008/12/09/higher-order-perl-by-mjd-for-free/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON 2005: Presentation Aikido, Damian Conway, second half</title>
		<link>http://www.canspice.org/2005/08/01/oscon-2005-presentation-aikido-damian-conway-second-half/</link>
		<comments>http://www.canspice.org/2005/08/01/oscon-2005-presentation-aikido-damian-conway-second-half/#comments</comments>
		<pubDate>Mon, 01 Aug 2005 19:23:07 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[OSCON 2005]]></category>
		<category><![CDATA[damian conway]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[powerpoint]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://canspice.org/?p=78</guid>
		<description><![CDATA[Starting off the second half of Damian Conway&#8217;s presentation titled &#8220;Presentation Aikido&#8221; with visual style. Again, it&#8217;s about simplicity, using shadows and underlining and whatnot subtly. He&#8217;s done shadowing so subtly that we can&#8217;t even see it. Clearly one needs to check monitors and projectors before doing a presentation. :-) Luckily his second example worked, [...]]]></description>
			<content:encoded><![CDATA[<p>Starting off the second half of Damian Conway&#8217;s presentation titled &#8220;Presentation Aikido&#8221; with visual style. Again, it&#8217;s about simplicity, using shadows and underlining and whatnot subtly. He&#8217;s done shadowing so subtly that we can&#8217;t even see it. Clearly one needs to check monitors and projectors before doing a presentation. :-) Luckily his second example worked, although I don&#8217;t really care for his choice of colours (yellow on green).</p>
<p>Which transitions nicely into colour schemes. Contrast is essential. Contrast is essential. Contrast is essential. There are many tools that allow you to generate complementary colour schemes: use them. Keep in mind that about 10% of the population has some difficulty with colour perception, so don&#8217;t use colour as a tool for discriminating between different texts, use brightness instead (or maybe different fonts). There&#8217;s a tool at <a href="http://www.vischeck.com">vischeck.com</a> that one can use to view webpages under different types of colour impairment.</p>
<p>It&#8217;s essential to keep people interested, so every so often surprise your audience. Tell them a story, use examples, make comparisons, change your pace and style (but don&#8217;t change your pace just for the sake of it). And every so often, give your staircases landings to give people a chance to digest what they&#8217;re injesting. You can also use those landings to let people know that a new topic is coming up, to keep the audience oriented with the flow of the presentation.</p>
<p>&#8220;Just because you can doesn&#8217;t mean you should.&#8221; He&#8217;s talking about transitions. Make them smooth and elegant, and use the obvious transitions in special occasions, possibly when you come to a &#8220;landing.&#8221; And for the love of Pete, don&#8217;t use transitions between slides, either fade in or just switch to the next one. Don&#8217;t zoom in, don&#8217;t do cube rotation, don&#8217;t do any of that rot.</p>
<p>Don&#8217;t use architecture charts. I&#8217;ve been guilty of this, and nearly every presentation I&#8217;ve seen has one. &#8220;Show a chart, lose an entire audience.&#8221; If the audience needs to know it, put it in the notes. Ditto for graphs.</p>
<p>If you&#8217;re going to put your name and title on your slides (which isn&#8217;t a bad idea), make them subtle and ignorable so they don&#8217;t interfere with the information on your slides. Lose the logo from each slide, because putting the logo on is distracting and it makes you look like a salesperson. If you have to have a logo because of corporate policy, watermark it.</p>
<p>Moving on to presentation, make it look effortless. Make it look like you&#8217;re on TV so your audience doesn&#8217;t feel pity for you. That&#8217;s something that&#8217;s learned and comes with practice. Make it look easy, even if the actual material is difficult, because the audience wants it to look easy and not threatening. And be yourself, but be yourself-less. The presentation isn&#8217;t about you, it&#8217;s about your material. You&#8217;re a conduit for relaying the information to the audience.</p>
<p>&#8220;Don&#8217;t be paralyzed by the butterflies.&#8221; Use your nervousness and turn it into nervous energy. Rituals can help you focus, get you into the same groove. Rituals can be anything, but as long as it takes you back to the familiar it&#8217;s good, it&#8217;s less frightening. He recommends not ignoring the audience before doing your presentation, but if you talk with someone, talk about them instead of yourself.</p>
<p>Have a backup plan. Always carry backups of your material. Conway&#8217;s a little anal about backups (he says &#8220;sophisticated&#8221;), with five backups in five different locations, but it works for him. It may only save you once, but that&#8217;s enough.</p>
<p>Dress how your audience expects you to dress. If you&#8217;re a CEO, dress like a CEO. If you&#8217;re a hacker, dress like a hacker.</p>
<p>Don&#8217;t read your presentation. The audience is perfectly capable of reading the presentation, they don&#8217;t need it read for them. Unless you&#8217;re reading to 2-year olds, of course. To do this, make sure you rehearse your presentation, and rehearse it aloud. You can have a cheat sheet, but it&#8217;s not the script, it&#8217;s a list of points you are going to make.</p>
<p>Demonstrations beat descriptions, because it&#8217;s easier for the audience to get the point. Make sure that your demonstrations work, though, and make sure that you&#8217;ve got local copies of your demos, if they normally live on the Internet somewhere. Use <a href="http://search.cpan.org/dist/IO-Prompt/">IO::Prompt</a> if at all possible.</p>
<p>Use a microphone, drink water, and make a pitstop before you start. Watch the time, and make sure you stick to your intended schedule.</p>
<p>For handling questions, have a policy. Don&#8217;t just take questions randomly, decide where and when and if you&#8217;ll take questions, and let the audience know about this policy. When you answer questions, repeat the question and try to paraphrase it. If you don&#8217;t know the answer, don&#8217;t fake it, say something clever instead like &#8220;I don&#8217;t know the answer,&#8221; or try to redirect the question to someone who might know the answer.</p>
<p>And try to do presentations fairly often. Even if they&#8217;re not formal presentations, there are many situations you can use to improve your skills. &#8220;The only way to speak better is to speak.&#8221;</p>
<p>[<a href="http://www.canspice.org/2005/08/01/oscon-2005-the-conway-channel-first-half/">link to first half</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2005/08/01/oscon-2005-presentation-aikido-damian-conway-second-half/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON 2005: Presentation Aikido, Damian Conway, first half</title>
		<link>http://www.canspice.org/2005/08/01/oscon-2005-the-conway-channel-first-half/</link>
		<comments>http://www.canspice.org/2005/08/01/oscon-2005-the-conway-channel-first-half/#comments</comments>
		<pubDate>Mon, 01 Aug 2005 17:02:49 +0000</pubDate>
		<dc:creator>Brad</dc:creator>
				<category><![CDATA[OSCON 2005]]></category>
		<category><![CDATA[damian conway]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[powerpoint]]></category>
		<category><![CDATA[presentation]]></category>

		<guid isPermaLink="false">http://canspice.org/?p=76</guid>
		<description><![CDATA[I don&#8217;t give presentations all that often, but when I do I generally tend to get nervous and flustered and do all the bad things that you&#8217;re not supposed to do to give a good presentation. When I saw that Damian Conway was giving a tutorial at OSCON 2005 titled Presentation Aikido, I was jazzed. [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t give presentations all that often, but when I do I generally tend to get nervous and flustered and do all the bad things that you&#8217;re not supposed to do to give a good presentation. When I saw that <a href="http://www.csse.monash.edu.au/~damian/">Damian Conway</a> was giving a tutorial at <a href="http://conferences.oreillynet.com/os2005/">OSCON 2005</a> titled <a href="http://conferences.oreillynet.com/cs/os2005/view/e_sess/6439">Presentation Aikido</a>, I was jazzed. Conway always does a good talk, and a presentation about giving presentations was just too good to pass up.</p>
<p>20 minutes in and the main point seems to be &#8220;be confident.&#8221; To be confident you need to know your material beforehand and know it well. If you don&#8217;t know it well then you&#8217;ll be up there giving a presentation, stumbling all over the place. You need to prepare your presentation and notes beforehand and practice it. You need to talk about what you care about.</p>
<p>You should take quite a bit of time to come up with your presentation. Conway suggested 10 hours of prep for each hour of presentation. 20:1 if you&#8217;ve got something relatively tough. He said for this three hour tutorial he took 80 hours to come up with it, and was still fiddling with it the night before.</p>
<p>Oh, and you need to be entertaining: &#8220;Entertaining always trumps informative.&#8221; Tell a story. Even if it&#8217;s made up, it&#8217;ll keep the audience interested and keep the presentation topic grounded in reality. Use metaphors, but use good metaphors: &#8220;I&#8217;ve never considered time as a non-renewable resource.&#8221;</p>
<p>Sidenote: This must be a good presentation because in a room full of geeks only a handful have their laptops out, and there are only two or three typing. End sidenote.</p>
<p>You should have five major points that the listener is going to take away with them. Humans don&#8217;t have a very big buffer so any more information than this will just leak out of their ears. </p>
<p>He&#8217;s currently making the point that presentation is more important than the information: &#8220;having great information on a shoddy-looking slide is actually worse than shoddy information on a great-looking slide.&#8221; I agree with his point, but for the most part I think he should be making the point that simplicity is more important than attacking the user with graphics. Actually, it looks like he is, but doing so in a bit of a roundabout fashion instead of outright saying it.</p>
<p>Yes, he is promoting simplicity. For presentation style, don&#8217;t use the Microsoft standard PowerPoint templates. &#8220;Steal from the cool kids: Apple, Bang &#038; Olufsen, The Perl Journal&#8230; no substance, but lots of style.&#8221; For fonts, don&#8217;t use many. Give each font a meaning: italics for headings, classic serif for content, fixed width for code. Don&#8217;t use Papyrus (it&#8217;s overused) or Comic Sans (it looks amateurish). If you use images, use them meaningfully and in moderation, &#8220;like seasoning.&#8221; Ditto for animations, but use them even more sparingly: &#8220;if I can&#8217;t do it easily with the limited facilities in PowerPoint, it&#8217;s probably too complex to bother with.&#8221; Ditto for video, but use video even less often than animations.</p>
<p>We&#8217;re now at the half-way point. Time to get some coffee.</p>
<p>[<a href="http://www.canspice.org/2005/08/01/oscon-2005-presentation-aikido-damian-conway-second-half/">link to second half</a>]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.canspice.org/2005/08/01/oscon-2005-the-conway-channel-first-half/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

