pricecharts

track prices of consumer electronics
Log | Files | Refs | README

commit c475365bcedbbd47973ce8f89fcebc08f7643661
parent d95903131208200cf089f69f32602581f14a9120
Author: Kyle Milz <kyle@getaddrinfo.net>
Date:   Fri, 24 Oct 2014 00:41:29 -0600

site_gen: split into index gen and svg gen

Diffstat:
Agen_svg.pl | 131+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msite_gen.pl | 117+------------------------------------------------------------------------------
2 files changed, 132 insertions(+), 116 deletions(-)

diff --git a/gen_svg.pl b/gen_svg.pl @@ -0,0 +1,131 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use SVG; +use POSIX; + +use shared; + +my $cfg = get_config(); +my $dbh = get_dbh($cfg); +my $log = get_log($cfg, "pricecharts_gen_svg"); + +print $log strftime "%b %e %Y %H:%M ", localtime; + +my $svg_dir = "$cfg->{general}{var}/www/htdocs/svg"; +mkdir $svg_dir; + +my $query = "select part_num from products"; +my $products = $dbh->selectcol_arrayref($query); + + +if ($args{p}) { + gen_chart($args{p}); + print $log "$args{p} generated\n"; +} +else { + gen_chart($_) for (@$products); + print $log scalar(@$products) . " products generated\n"; +} + +sub gen_chart +{ + my $part_num = shift; + vprint("$part_num:\n"); + + $query = "select min(date) from prices where part_num = ?"; + my $x_min = $dbh->selectrow_array($query, undef, $part_num); + + $query = "select max(date) from prices where part_num = ?"; + my $x_max = $dbh->selectrow_array($query, undef, $part_num); + + $query = "select min(price) from prices where part_num = ?"; + my $y_min = $dbh->selectrow_array($query, undef, $part_num); + + $query = "select max(price) from prices where part_num = ?"; + my $y_max = $dbh->selectrow_array($query, undef, $part_num); + + vprintf("\tdomain: $x_min - $x_max\n"); + vprintf("\trange: $y_min - $y_max\n"); + + my $svg = SVG->new(viewBox => "0 0 1000 250"); + + $query = "select distinct vendor from prices where part_num = ?"; + my $vendors = $dbh->selectcol_arrayref($query, undef, $part_num); + vprintf("\tvendors: " . scalar @$vendors . "\n"); + + for (@$vendors) { + $query = "select date from prices where " . + "part_num = ? and vendor = ? order by date"; + my $dates = $dbh->selectcol_arrayref($query, undef, + $part_num, $_); + vprintf("\tdates found: " . scalar @$dates . "\n"); + $query = "select price from prices where " . + "part_num = ? and vendor = ? order by date"; + my $prices = $dbh->selectcol_arrayref($query, undef, + $part_num, $_); + vprintf("\tprices found: " . scalar @$prices . "\n"); + + my @xs = map { ($_ - $x_min) / ($x_max - $x_min) * 900 + 30 } @$dates; + my @ys = map { ($_ - $y_min) / ($y_max - $y_min) * 210 + 20 } @$prices; + + my $vendor_color = "#$cfg->{vendors}{$_}{color}"; + + my $i = 0; + for (@xs) { + $svg->circle(cx => $xs[$i], cy => $ys[$i], r => 2, + style => { + 'fill-opacity' => 1, + 'fill' => $vendor_color, + 'stroke' => $vendor_color + } + ); + $i++; + } + + my $points = $svg->get_path(x => \@xs, y => \@ys, + -closed => "false"); + $svg->path( + %$points, + id => $_, + style => { + 'fill-opacity' => 0, + 'fill' => $vendor_color, + 'stroke' => $vendor_color, + 'stroke-width' => 2, + } + ); + } + + for my $i (0..5) { + my $price = $y_max - $i * ($y_max - $y_min) / 5; + my $y = 20 + $i * (210 / 5); + $svg->text(id => $i, x => 950, y => $y, + style => "font-size: 12px; fill: #666", + "text-anchor" => "start")->cdata("\$$price"); + $svg->line(id => "line_$i", x1 => 30, y1 => $y, + x2 => 930, y2 => $y, + "fill" => "#CCC", + "stroke" => "#CCC", + "stroke-width" => 1, + ); + } + + for my $i (0..5) { + my $time = $x_min + $i * ($x_max - $x_min) / 5; + my $date = strftime "%b %e %Y", localtime($time); + my $x = 30 + $i * 900 / 5; + $svg->text(id => $time, x => $x, y => 250, + style => "font-size: 12px; fill: #666", + "text-anchor" => "middle")->cdata($date); + } + + open my $svg_fh, ">", "$svg_dir/$part_num.svg" or die $!; + print $svg_fh $svg->xmlify; + close $svg_fh; +} + +close $log; +$dbh->disconnect(); diff --git a/site_gen.pl b/site_gen.pl @@ -4,12 +4,11 @@ use strict; use warnings; use File::Copy; -use SVG; use Template; -use POSIX; use shared; + my $cfg = get_config(); my $dbh = get_dbh($cfg); my $log = get_log($cfg, "pricecharts_webgen"); @@ -41,119 +40,5 @@ my $vars = { $template->process("index.html", $vars, "index.html") || die $template->error(); copy("html/pricechart.css", "www/htdocs/pricechart.css"); -# $query = "select part_num from products"; -# my $products = $dbh->selectcol_arrayref($query); - -print $log strftime "%b %e %Y %H:%M ", localtime; - -my $svg_dir = "$cfg->{general}{var}/www/htdocs/svg"; -mkdir $svg_dir; - -if ($args{p}) { - gen_chart($args{p}); - print $log "$args{p} generated\n"; -} -else { - gen_chart($_) for (@$products); - print $log scalar(@$products) . " products generated\n"; -} - -sub gen_chart -{ - my $part_num = shift; - vprint("$part_num:\n"); - - $query = "select min(date) from prices where part_num = ?"; - my $x_min = $dbh->selectrow_array($query, undef, $part_num); - - $query = "select max(date) from prices where part_num = ?"; - my $x_max = $dbh->selectrow_array($query, undef, $part_num); - - $query = "select min(price) from prices where part_num = ?"; - my $y_min = $dbh->selectrow_array($query, undef, $part_num); - - $query = "select max(price) from prices where part_num = ?"; - my $y_max = $dbh->selectrow_array($query, undef, $part_num); - - vprintf("\tdomain: $x_min - $x_max\n"); - vprintf("\trange: $y_min - $y_max\n"); - - my $svg = SVG->new(viewBox => "0 0 1000 250"); - - $query = "select distinct vendor from prices where part_num = ?"; - my $vendors = $dbh->selectcol_arrayref($query, undef, $part_num); - vprintf("\tvendors: " . scalar @$vendors . "\n"); - - for (@$vendors) { - $query = "select date from prices where " . - "part_num = ? and vendor = ? order by date"; - my $dates = $dbh->selectcol_arrayref($query, undef, - $part_num, $_); - vprintf("\tdates found: " . scalar @$dates . "\n"); - $query = "select price from prices where " . - "part_num = ? and vendor = ? order by date"; - my $prices = $dbh->selectcol_arrayref($query, undef, - $part_num, $_); - vprintf("\tprices found: " . scalar @$prices . "\n"); - - my @xs = map { ($_ - $x_min) / ($x_max - $x_min) * 900 + 30 } @$dates; - my @ys = map { ($_ - $y_min) / ($y_max - $y_min) * 210 + 20 } @$prices; - - my $vendor_color = "#$cfg->{vendors}{$_}{color}"; - - my $i = 0; - for (@xs) { - $svg->circle(cx => $xs[$i], cy => $ys[$i], r => 2, - style => { - 'fill-opacity' => 1, - 'fill' => $vendor_color, - 'stroke' => $vendor_color - } - ); - $i++; - } - - my $points = $svg->get_path(x => \@xs, y => \@ys, - -closed => "false"); - $svg->path( - %$points, - id => $_, - style => { - 'fill-opacity' => 0, - 'fill' => $vendor_color, - 'stroke' => $vendor_color, - 'stroke-width' => 2, - } - ); - } - - for my $i (0..5) { - my $price = $y_max - $i * ($y_max - $y_min) / 5; - my $y = 20 + $i * (210 / 5); - $svg->text(id => $i, x => 950, y => $y, - style => "font-size: 12px; fill: #666", - "text-anchor" => "start")->cdata("\$$price"); - $svg->line(id => "line_$i", x1 => 30, y1 => $y, - x2 => 930, y2 => $y, - "fill" => "#CCC", - "stroke" => "#CCC", - "stroke-width" => 1, - ); - } - - for my $i (0..5) { - my $time = $x_min + $i * ($x_max - $x_min) / 5; - my $date = strftime "%b %e %Y", localtime($time); - my $x = 30 + $i * 900 / 5; - $svg->text(id => $time, x => $x, y => 250, - style => "font-size: 12px; fill: #666", - "text-anchor" => "middle")->cdata($date); - } - - open my $svg_fh, ">", "$svg_dir/$part_num.svg" or die $!; - print $svg_fh $svg->xmlify; - close $svg_fh; -} - close $log; $dbh->disconnect();