100 lines
3 KiB
Perl
100 lines
3 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# postingstats.pl
|
|
#
|
|
# This script will create a posting statistic for de.admin.lists
|
|
# from NewsStats output.
|
|
#
|
|
# It is part of the NewsStats package.
|
|
#
|
|
# Copyright (c) 2010-2012 Thomas Hochstein <thh@inter.net>
|
|
#
|
|
# It can be redistributed and/or modified under the same terms under
|
|
# which Perl itself is published.
|
|
#
|
|
# $~ groupstats.pl --nocomments --sums --format dump | postingstats.pl xxxx-xx
|
|
#
|
|
|
|
use strict;
|
|
use constant TABLEWIDTH => 28; # width of table without newsgroup name
|
|
|
|
our $VERSION = '0.01';
|
|
|
|
##### ----- subroutines -----
|
|
|
|
sub percentage {
|
|
# calculate percentage rate from base value and percentage
|
|
my ($base,$percentage) = @_;
|
|
return ($percentage * 100 / $base);
|
|
}
|
|
|
|
sub divider {
|
|
# build a divider line of $symbol as wide as the table is
|
|
my ($symbol,$maxlength) = @_;
|
|
return ':' . $symbol x ($maxlength+TABLEWIDTH) . ":\n";
|
|
}
|
|
|
|
##### ----- main loop -----
|
|
|
|
# get $month from ARGV
|
|
my $month = shift;
|
|
|
|
# read from STDIN
|
|
my (%postings, $hierarchy, $maxlength);
|
|
|
|
while(<>) {
|
|
my ($group, $postings) = split;
|
|
$hierarchy = $postings if $group eq 'de.ALL';
|
|
next if $group =~ /ALL$/;
|
|
$postings{$group} = $postings;
|
|
$maxlength = length($group) if length($group) > $maxlength;
|
|
}
|
|
|
|
# print to STDOUT
|
|
my $heading = ' Postingstatistik fuer de.* im Monat '.$month;
|
|
my $padding = ' ' x (($maxlength+TABLEWIDTH-2-length($heading))/2);
|
|
my $timestamp = time;
|
|
my $counter = 0;
|
|
|
|
print <<HEADER;
|
|
From: Thomas Hochstein <thh\@inter.net>
|
|
Newsgroups: de.admin.news.misc
|
|
Subject: Postingstatistik fuer de.* im Monat $month
|
|
Message-ID: <destat-postings-$month.$timestamp\@mid.news.szaf.org>
|
|
Mime-Version: 1.0
|
|
Content-Type: text/plain; charset=ISO-8859-1
|
|
Content-Transfer-Encoding: 7bit
|
|
User-Agent: postingstats.pl/$VERSION (NewsStats)
|
|
|
|
HEADER
|
|
|
|
print ÷r('=',$maxlength);
|
|
printf(": %s%s%s :\n",$padding,$heading,$padding);
|
|
print ÷r('=',$maxlength);
|
|
printf(": Nr. : Anzahl : Prozent : %-*s :\n",$maxlength,'Newsgroup');
|
|
print ÷r('-',$maxlength);
|
|
|
|
foreach my $group (sort { $postings{$b} <=> $postings {$a}} keys %postings) {
|
|
$counter++;
|
|
printf(": %3u. : %6u : %6.2f%% : %-*s :\n",$counter,$postings{$group},&percentage($hierarchy,$postings{$group}),$maxlength,$group);
|
|
}
|
|
|
|
print ÷r('-',$maxlength);
|
|
printf(": : %6u : %s : %-*s :\n",$hierarchy,'100.00%',$maxlength,'de.*');
|
|
print ÷r('=',$maxlength);
|
|
|
|
print <<LEADOUT;
|
|
|
|
Alle Zahlen wurden ermittelt auf einem Newsserver mit redundanter Anbin-
|
|
dung fuer de.* unter Anwendung ueblicher Filtermassnahmen. Steuernach-
|
|
richten werden nicht erfasst; Postings, die supersedet oder gecancelt
|
|
wurden, bleiben erfasst, sofern sie das System ueberhaupt (und vor der
|
|
Loeschnachricht) erreicht haben. Crosspostings werden in jeder Gruppe,
|
|
in die sie gerichtet sind, gezaehlt, aber bei Ermittlung der Summe be-
|
|
reinigt; daher ist die Postinganzahl fuer de.* gesamt niedriger als die
|
|
Summe der Postinganzahlen der Einzelgruppen.
|
|
|
|
Die Daten stehen graphisch aufbereitet unter <http://usenet.dex.de/> zur
|
|
Verfuegung.
|
|
LEADOUT
|