http://www.perlmonks.org?node_id=152619


in reply to Flat File Database & GD::Graph (REVISITED)

Hi all,
Thanks to all of you who posted comments on my problem. I know I'm almost there! Why is this script not working? I've spent another good 7 hours trying to debug it, but I still can't figure it out. I know for a fact that it's where the @data array is at (most likely referencing a multidimensional array from 3 seperate arrays?) You can try it for yourself using this data set:
1|1/27|2002|3|26|19|7|7|21|10|3|34|7|73|undef|71|6|20 2|2/03|2002|3|26|19|8|28|21|10|3|34|7|73|undef|72|6|20 3|2/10|2002|3|24|24|8|28|21|10|3|46|7|73|undef|72|8|20 4|2/17|2002|3|22|23|6|28|21|10|3|46|7|73|undef|72|8|20 5|2/24|2002|3|18|23|6|28|22|10|3|46|38|73|undef|72|8|20 6|3/03|2002|3|13|25|6|36|18|28|9|33|38|44|undef|65|8|20 7|3/10|2002|3|13|35|11|50|22|28|9|33|38|44|undef|65|8|20 8|3/18|2002|3|12|33|11|62|24|28|9|33|38|44|undef|65|undef|undef

#!/usr/local/bin/perl5 -wT # Declare the stuff we need to use use strict; use CGI; use GD::Graph::linespoints; use constant TITLE => "AAA Days to Integration Average: Line Chart"; my $q = new CGI; my $graph = new GD::Graph::linespoints(600, 300); my $largestValue = 0; my (@xAxisOfDates,@yAxisOfPartners,@yAxisOfArf, @data) = (); open(HANDLE,"integrate.dat"); while (<HANDLE>) { chomp; @temp1 = split(/\|/, $_); $domain = unpack ("A5", $temp1[17]); push (@xAxisOfDates, $temp1[1]); push (@yAxisOfPartners, $temp1[4]); push (@yAxisOfArf, $temp1[5]); if ($temp1[4] > $largestValue){ $largestValue = $temp1[4]; } if ($temp1[5] > $largestValue){ $largestValue = $temp1[5]; } } close(HANDLE); @data = (\@xAxisOfDates, \@yAxisOfPartners, \@yAxisOfArf); $graph->set( title => TITLE, x_label => "Third Quarter FY 2002", y_label => "Average Days", long_ticks => 1, y_max_value => $largestValue, y_min_value => 0, y_tick_number => 10, y_label_skip => 0, bar_spacing => 4, types => [ "linespoints", "linespoints" ], dclrs => [ "red", "black" ], ); $graph->set( markers => [1,1] ); $graph->set_legend( "Partners", "ARF" ); my $gd_image = $graph->plot( \@data ); print $q->header( -type => "image/png", -expires => "-1d" ); binmode STDOUT; print $gd_image->png; get_data();


I'm always learning. zen-designs.com

Replies are listed 'Best First'.
Re: Re: Flat File Database & GD::Graph (REVISITED)
by seattlejohn (Deacon) on Mar 19, 2002 at 02:12 UTC
    I can't take the time to install GD::Graph right now and test this, but here are some friendly thoughts as to how to effeciently go about debugging your code -- and ask for help when something goes wrong.

    You say the script doesn't work, but don't explain what you mean. Does it crap out with a 500 Internal Server Error? Does it die at a particular line? Does it not produce the results you expect, or nothing at all? The more specific you can be about what you've done and what's going wrong, the more useful responses you'll get.

    I would start by trying to trim the problem down to the smallest possible scope, create a test case that works, and build up from there. Debugging CGI is generally a hassle; can you (temporarily) throw away the CGI part and just try generating the image from the command line? Can you try to generate the simplest possible chart from your data set (leaving out all the legends and other information)? Can you construct an artificial data set with constrained data?

    Once you have a working core, you can incrementally add back features until something breaks, and you will know that whtever change you last made is the one that's causing the problem.

      seattlejohn,
      I'm sorry I failed to note what my errors were (too much coffee is a bad thing you know :P). I did, perform all of my debugging techniques (including the ones you mentioned before asking my fellow monks for assistance). Thanks for your advice though.
      I'm always learning. http://www.zen-designs.com
Re: Re: Flat File Database & GD::Graph (REVISITED)
by tfrayner (Curate) on Mar 19, 2002 at 17:27 UTC
    Hi,

    While I also am not entirely clear on your problem, I have managed to get your modified code to work simply scoping @temp1 and $domain using my, and by not printing the header out to the same location as the data. The following code generates a PNG image on STDOUT:

    #!/usr/bin/perl -w # Declare the stuff we need to use use strict; use CGI; use GD::Graph::linespoints; use constant TITLE => "AAA Days to Integration Average: Line Chart"; my $q = new CGI; my $graph = new GD::Graph::linespoints(600, 300); my $largestValue = 0; my (@xAxisOfDates,@yAxisOfPartners,@yAxisOfArf, @data) = (); #open(HANDLE,"integrate.dat"); # commented out 'cos I'm using DATA while (<DATA>) { # note DATA here chomp; my @temp1 = split(/\|/, $_); # use strict needs 'my' here my $domain = unpack ("A5", $temp1[17]); # and here push (@xAxisOfDates, $temp1[1]); push (@yAxisOfPartners, $temp1[4]); push (@yAxisOfArf, $temp1[5]); if ($temp1[4] > $largestValue){ $largestValue = $temp1[4]; } if ($temp1[5] > $largestValue){ $largestValue = $temp1[5]; } } #close(HANDLE); # using DATA for simplicity here @data = (\@xAxisOfDates, \@yAxisOfPartners, \@yAxisOfArf); $graph->set( title => TITLE, x_label => "Third Quarter FY 2002", y_label => "Average Days", long_ticks => 1, y_max_value => $largestValue, y_min_value => 0, y_tick_number => 10, y_label_skip => 0, bar_spacing => 4, types => [ "linespoints", "linespoints" ], dclrs => [ "red", "black" ], ); $graph->set( markers => [1,1] ); $graph->set_legend( "Partners", "ARF" ); my $gd_image = $graph->plot( \@data ); # I don't know where you want this, but putting it # in the png doesn't seem to work :-P #print $q->header( -type => "image/png", -expires => "-1d" ); binmode STDOUT; print $gd_image->png; #get_data(); # undefined function; perl not happy __DATA__ 1|1/27|2002|3|26|19|7|7|21|10|3|34|7|73|undef|71|6|20 2|2/03|2002|3|26|19|8|28|21|10|3|34|7|73|undef|72|6|20 3|2/10|2002|3|24|24|8|28|21|10|3|46|7|73|undef|72|8|20 4|2/17|2002|3|22|23|6|28|21|10|3|46|7|73|undef|72|8|20 5|2/24|2002|3|18|23|6|28|22|10|3|46|38|73|undef|72|8|20 6|3/03|2002|3|13|25|6|36|18|28|9|33|38|44|undef|65|8|20 7|3/10|2002|3|13|35|11|50|22|28|9|33|38|44|undef|65|8|20 8|3/18|2002|3|12|33|11|62|24|28|9|33|38|44|undef|65|undef|undef
    Note that I had to turn taint checking off ("Too late for -T option..."). I'm afraid I don't have the time right now to address this issue and must therefore leave it as an exercise for the reader :-)
    I hope this answers your problem.

    Tim

    Update: *sigh*, shows how often I use -T...
    This thread explains the taint problem I was having. In short: don't worry about it :-P

      Hi Tim,

      Thanks for your help! When I tried it it still gave me a 500 error. I checked the code again for another hour and noticed that you commented out the:
      # I don't know where you want this, but putting it # in the png doesn't seem to work :-P #print $q->header( -type => "image/png", -expires => "-1d" );
      When I uncommented it, it worked fine! What was your reasoning as to why this is not needed? When I initially started this project, I took the bare sample from the CGI programming book (mouse book). It had that line of code in there so I just left it there.
      Slowly but surely, I'll get down Perl like the rest of you cool cats! Thank you everyone who contributed. I've gain tons of wisdom from your help. :)
      I'm always learning. http://www.zen-designs.com
        Hi,

        I think I was misinterpreting what was to be returned by your code. I assumed it was to be a bare png file, and by examining an example of my own determined that the header was not needed. If this code snippet is used in the shell, you get just the png file. I must confess that I have no experience with CGI, and did not spot that the header might be required. Ah well, glad I could help anyway :-)

        Tim