<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="http://starling.us/gus_xslt.xsl"?>
<gus_xslt
  xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://starling.ws/XML/howto.xsd">&#160;        
  <head>
    <navigation ToC="Table of Contents" section="yes" topic="yes" subtopic="no" subsubtopic="no" links="yes"/>
    <cgi img="no" img_action="../../cgi-bin/gus_web_photo.pl" img_path="../tet/gus_perl" />
    <syndication atom="http://starling.us/starling_us_atom.xml" />
    <pdfmarks body="no" section="no" topic="no" subtopic="no" subsubtopic="no"/>
    <title>Perl Modules</title>
    <description>Perl modules by Gan Uesli Starling mostly not yet on CPAN.</description>
    <keywords>starling, perl module, perl/tk, </keywords>
    <author>Gan Uesli Starling</author>
    <copyright>2006 &#8212; 2007, Gan Uesli Starling</copyright>
    <link rel="alternate" href="http://starling.us/starling.atom" type="application/atom+xml"/>
  </head>
  <body>
    <title>Perl Modules</title>
    <p class="center"><a class="button" href="http://starling.us/tet/">&#160;home: http://starling.us/tet&#160;</a>
      <br/>
      <br/>by Ĝan Ŭesli Starling
      <br/>copyright 2006 &#8212; 2007 </p> 
      
    <p>Herein I  present my own collection of Perl modules mostly not available elsewhere inasmuch as I have yet to upload all but one of them to <code>CPAN</code>. There are two causes for this. The first is lack of time. The second is that apparently I do not yet fully grok how to write proper tests for <code>CPAN</code> modules. That is to say, my first <code>CPAN</code> effort <code>Chart::EPS_graph.pm</code>, although I use it frequently on both <code>NetBSD UNIX</code> and <code>Win32</code> without any slightest problem, reportedly fails certain (to me) obscure tests by <code>CPANTS</code> (the CPAN Testing Service). Nor do I grok their automated report of to address those issues. My <code> CPANTS</code> kwalitee rating is therefor only 70.83% while I remain temporarily clueless as to the reason. Alas and alack.</p>
    <p>So...until I manage enough spare time to sort that out, and partly out of the wish to avoid further <code>CPANTS</code> humiliation, I'll be stockpiling any new modules which I write here. If they have dependencies not available elsewhere, those too I will include here.</p>
    <p>As for quality (as opposed to <i>kwalitee</i>) know that in my own judgement all these modules are suitable for general use anywhere throughout the Programming Republic of Perl. I do have some others, absent from here, which are not yet ready for public exposure. So these are my best ones. In my own use, these have all performed flawlessly. All are released according to the Perl artistic license. So do whatever you like with them.</p> 
        
      <!-- SECTION DELIMITER -->
    <section>
      <title>Module Installation</title>
      <p><b>Note: </b>Perl newbies read on (all others skip). My modules are all pure Perl, which is to say ASCII text files. Installation consists of nothing more than opening a <code>Perl&#160;as&#160;TXT</code> link in your browser, selecting the complete text, copying and pasting same into any ASCII text editor, then saving into the designated "<i>save to</i>" path.</p>
      <topic>
        <title>Download Path</title>
        <p>Note that the designated <i>save to</i> path always looks like <code>lib/foo/bar</code> or something similar. The starting location of <code>lib/</code> could be any place that Perl might search when looking to load a module. Thus, in theory, you could type the following into a CLI (aka <i>command line instruction</i>) window...
        <br/>
        <br/><code>perl -e "use Foo;"</code>
        <br/>
        <br/>...which would fail with a complaint telling you all the places Perl looked for the non-existent module <code>Foo</code> and locate your modules starting in any one of those instead of starting in <code>lib/</code>. In fact, one of the listed directories will be the acutal <code>lib/</code> which we seek. Alternately you could just browse the varied Perl directories in search of one named similar to either of the following...
        <br/>
        <br/><code>C:/Perl/site/lib</code> <note>...such as for ActivePerl on Win32 or...</note>
        <br/><code>/usr/pkg/lib/perl5/site_perl/5.8.0/lib</code> <note>...such as for Perl 5.8.X on NetBSD UNIX or...</note>
        <br/>
        <br/>...whatever similar path your own Perl installation uses for modules downloaded from <code>CPAN</code>. You must also, of course, name each file as recommended at the download link when saving them. And, of course, if a module path is described as <code>lib/foo/bar.pm</code> yet directory <code>foo</code> does not already exist in <code>lib/</code> then you will have to create that directory.</p>
      </topic>
      
      <topic>
        <title>Module Dependencies</title>
        <p>Since this is not <code>CPAN</code>, module dependencies do not auto-install themselves. Any module having another module as a dependency will be so noted in the module's own <code>POD</code> (acronym for<i>Plain Old Documentation</i>) which you may view from this site as <code>HTML</code>. And, of course, you could find that out almost as easily by looking for a statement like <code>use Foo::Bar.pm</code> or similar near to the top within the Perl code itself.</p>
        <p>The vast majority of all such dependencies will be either Perl core modules <note>(pre-installed when you built Perl)</note> or <code>CPAN</code> modules installable in the regular way. The very few others, if any, will all be available here. A single, partial exception exists. This has to do with one module's <code>CPAN</code> version not being the latest. That single case, although minor, is noted as a "<b>Caveat:</b>" at the top of its explanitory section on this page.</p>
      </topic>
      
      <topic>
        <title>Platform Dependencies</title>
        <p>I design for and test on both <code>NetBSD <note>(a UNIX)</note></code> and <code>WinXP</code>. Thus, accordingly, all but one of these modules work cross-platform. The single exception is due to its own CPAN dependency, <code>Device::LabJack</code>, not being available (yet) for <code>NetBSD</code>. Reportedly, though, they do have it for <code>LINUX</code>. And its author has offered to make it available for <code>Mac&#160;OS&#160;X</code>. But I have no means for testing those.</p>           
      </topic> 
      
      <topic>
        <title>Version Numbers</title>
        <p>Version numbering is for tracking purposes only. It is not a judgement upon the worthiness of said software. Commercial vendors regularly employ it thus...it in the sense of a pre/post beta-release numbering sequence. But after then commercial version <code>2.0</code> only means they were short on revenue and need an excuse to pick your pocket once again. I observe that many a writer of open source software ignores that framework. Those who don't, like the early releases of <code>LINUX</code> sometimes end up with a zillion sub-relases between <code>0.9</code> and <code>1.0</code> for no better reason than an excess of optimism in guessing the illusive <code>1.0</code> benchmark. Meanwhile they will have hopped and skipped forward such that from <code>0.04</code> to <code>0.20</code> there may have been no releases at all in between. This is irrational. I elect to follow rather more sane examples.</p>
        <p>So you should not hold your breath in hopes of a release labled <code>$VERSION = 1.00;</code>. With luck it will never happen because that would be a very bad thing. I choose to follow the more rational example of a wholly sane numbering scheme, one which mandates that the first, plural-copy distribution <note>(hopefully already fit for public use)</note> will be issued as <code>0.01</code> on account of said software having existed as but a single copy. I will have kept it under wraps until completely satisfied. Only thereafter does there arise any motive to duplicate it for distribution. And only then, with multiple copies strewn about does it become problematic to know which is which. Prior till then it needed no version number at all. But from that point forward version numbering becomes crucial.</p>
        <p>Accordingly, none of my efforts will enter into public awareness as versions higher than <code>0.01</code> except for in a very few cases where I may have circulated them privately for some reason or other. Up until then I will not have allowed for multiple copies <note>(other than backup)</note> to exist. Only then will it have become needful to track them. And only after then, should I find occasion to make improvements will they obtain higher version numbers. No matter how vastly improved, the next circulation will be innumerated <code>0.02</code> and so forth. Such a new release as <code>0.02</code> might include whole new additional features but none of the prior ones will be thereby broken.</p>
        <p>Never until such time as I make nasty and dramatic changes which break the original API <note>(requiring users to change the way in which they employ said module)</note> will it be re-released as version <code>1.00</code>. Withdrawl of a previously existing feature would constitute such an API fracture. Big, ugly things like that... Minor changes after then will be numbered <code>1.01</code> and so forth. Not until I cruelly abuse my users again will the release number rise to <code>2.00</code>.</p>           
      </topic> 
    
    </section>      
       
      <!-- SECTION DELIMITER -->     
    
    <section>
      <title>Chart::EPS_graph.pm</title><inlink>Chart-EPS_graph</inlink>
      <p><b>Scope of Use: </b>Graphing.
        <br/><b>Description: </b>Creates graphs having dual Y-axes using PostScript.
        <br/><b>Status: </b>Uploaded to CPAN
        <br/><b>Caveat: </b>CPANTS reports my kwalitee at only 70.83 even though the module works flawlessly whenever I test it myself. The CPANTS automated report on how to improve said kwalitee eludes my poor comprehension. That said, try CPAN first, but fall back to downloading from here if problems arise.</p>
      
      <p>The more generally useful Perl module <code>GD::Graph::Lines</code> does not allow for more than one trace per axis when displaying in dual Y-axis mode. Thus you can only show two traces whereas I most usually need multiple traces for each. This module handles that. The reason it works via EPS is because I ported all the routines from an older program which I had written entirely in PostScript.</p>
            
<p style="line-height: 150%;"><code>&#160;&#160;&#160;&#160;CPAN:&#160;</code>
<a class="button" href="http://search.cpan.org/~aplonis/Chart-EPS_graph-0.01d/lib/Chart/EPS_graph.pm"> 
<code>HTML</code></a>&#160;
Here is probably the best place to get this, in the usual CPAN way. Otherwise, see links below.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Chart-EPS_graph.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Chart-EPS_graph.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Chart/EPS_graph.pm</code> then call as <code>use Chart::EPS_graph;</code> in scripts.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Chart-EPS_graph-PS.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Chart-EPS_graph-PS.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Chart/EPS_Graph/PS.pm</code> and forget about it.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Chart-EPS_graph-Test.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Chart-EPS_graph-Test.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Chart/EPS_graph/Test.pm</code> where it serves as the module's own test. Useful also as an example.

<br/><code>&#160;Used In:&#160;</code>
<a class="button" href="../gus_tek_csv_merge_pl/"> 
<code>XML</code></a>&#160;
Script <code>gus_tek_csv_merge.pl</code> merges and graphs a pair of Tektronix <code>TEK0000*.CSV</code> data files. 

</p>
    </section>    
    
    <!-- SECTION DELIMITER -->   
    
    <section>
      <title>Device::LabJack::Control.pm</title><inlink>Device-LabJack-Control</inlink>
      <p><b>Scope of Use: </b>Data Acquisition.
        <br/><b>Description: </b>Object Oriented Interface
        <br/><b>Status: </b>Not yet on CPAN
        <br/><b>Caveat: </b>Dependent upon <code>Device::LabJack</code> which is Win32 only. Some features also dependent upon <code>Device::LabJack</code> being version 0.03 or higher, which its author has not yet uploaded to CPAN.
      </p>
      
      <p>I employ the LabJack as a data acquisition and control unit for simple laboratory testing.</p>
            
<p style="line-height: 150%;"><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Device-LabJack-Control.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Device-LabJack-Control.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Device/LabJack/Control.pm</code> then call as <code>use Device::LabJack::Control;</code> in scripts.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Device-LabJack-Control_test.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Device-LabJack-Control_test.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Device/LabJack/Control_test.pl</code> where it serves as the module's own test. Useful also as an example.
</p>
    </section>
    
    <!-- SECTION DELIMITER -->
    
    <section>
      <title>Text::CSV::Munge.pm</title><inlink>Text-CSV-Munge</inlink>
      <p><b>Scope of Use: </b>General.
        <br/><b>Description: </b>Munging CSV files
        <br/><b>Status: </b>Not yet on CPAN
      </p>
      
      <p>Tektronix o'scopes and other devices save data as <code>*.csv</code> files. In order to write reports on said data, I employ Perl scripts to munge them first.</p>
            
<p style="line-height: 150%;"><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Text-CSV-Munge.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Text-CSV-Munge.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Text/CSV/Munge.pm</code> then call as <code>use Text::CSV::Munge;</code> in scripts.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Text-CSV-Munge-Strain.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Text-CSV-Munge-Strain.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Text/CSV/Munge/Strain.pm</code> then call as <code>use Text::CSV::Munge::Strain;</code> in scripts.

<br/><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Text-CSV-Munge-Test.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Text-CSV-Munge-Test.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Text/CSV/Munge/Test.pm</code> where it serves as the module's own test. Useful also as an example.

<br/><code>&#160;Used In:&#160;</code>
<a class="button" href="../gus_tek_csv_merge_pl/"> 
<code>XML</code></a>&#160;
Script which merges and graphs a pair of Tektronix <code>TEK0000*.CSV</code> data files. 

</p>
    </section> 
    
    <!-- SECTION DELIMITER -->    
    
    <section>
      <title>Tk::EasyGUI.pm</title><inlink>Tk-EasyGUI</inlink>
      <p><b>Scope of Use: </b>General.
        <br/><b>Description: </b>Quick and dirty Perl/Tk GUI builder.
        <br/><b>Status: </b>Not yet on CPAN
      </p>
      
      <p>Many a Perl script run quite well without any GUI. A Perl hacker will quite often even prefer that there be no GUI. Yet to share one's Perl scripts with (as yet) Perl-ignorant cohorts a GUI is pretty much required. Here is a way to bang out quick and dirty Perl/Tk GUI's which you may either embed into your Perl scripts, permanently GUI-ifying them, or else build an outboard GUI to emulate the CLI call so that your Perl script might remain GUI-free.</p>
            
<p style="line-height: 150%;"><code>&#160;&#160;Module:&#160;</code>
<a class="button" href="./Tk-EasyGUI.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="./Tk-EasyGUI.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save to path <code>lib/Tk/EasyGUI.pm</code> then call as <code>use Tk::EasyGUI;</code> in scripts.

<br/><code>&#160;Example:&#160;</code>
<a class="button" href="../gus_easy_gui_pl/gus_example_easy_gui.html"> 
<code>POD&#160;as&#160;HTML</code></a>&#160;
<a class="button" href="../gus_easy_gui_pl/gus_example_easy_gui.txt"> 
<code>Perl&#160;as&#160;TXT</code></a>&#160;
Save anywhere as <code>gus_example_easy_gui.pl</code>

<br/><code>&#160;Example:&#160;</code>
<a class="button" href="../gus_easy_gui_pl/gus_example_easy_gui.NetBSD.png"> 
<code>Screenshot&#160;</code></a>&#160;
<a class="button" href="../gus_easy_gui_pl/gus_example_easy_gui.Win32.png"> 
<code>Screenshot&#160;</code></a>&#160;
Showing tests on <code>NetBSD</code> and <code>WinXP</code>

<br/><code>&#160;Used In:&#160;</code>
<a class="button" href="../gus_barometric_pressure_pl/"> 
<code>XML</code></a>&#160;
Script <code>gus_barometric_pressure.pl</code> provided with embeded GUI.

<br/><code>&#160;Used In:&#160;</code>
<a class="button" href="../gus_calc_generic_pl/"> 
<code>XML</code></a>&#160;
GUI-less script <code>gus_calc_generic.pl</code> provided with outboard GUI.

<br/><code>&#160;Used In:&#160;</code>
<a class="button" href="../gus_tek_csv_merge_pl/"> 
<code>XML</code></a>&#160;
GUI-less script <code>gus_tek_csv_merge.pl</code> provided with outboard GUI.
</p>
    </section>
    
    <!-- SECTION DELIMITER -->
    
    <!-- SECTION DELIMITER -->
   
  </body>
</gus_xslt>    

