Städte-Ranglisten TOP 10
Moderators: Miles66, Licht & Feuer
Re: Städte-Ranglisten TOP 10
Hallo Volker,Volker W wrote: Von mir große Glückwünsche an Euch, und vielen Dank an Dich dippu für Deine Mühe mit der Liste und den netten Kommentaren
kein Problem ich mach das doch gern. So kann man sich wenigstens an der Berlin-Liste erfreuen wenn mal wieder eine Hitflaute herrscht (du waerst ja eigentlich auch schon wieder laengst ueberfaellig mit einem Treffer). Vielleicht bringen wir auch irgendwann gemeinsam Berlin in der Staedterangliste voran - hellogs kommt ja bald helfen
Perl-Skript für Ranglisten
Hab am Wochenende mal bisschen rumgetippt. Ist folgendes dabei rausgekommen:
Ein Perl-Skript zur automatischen Erstellung der Ranglisten.
(sorry für die Länge des Beitrags)
Bedienungsanleitung:
1) Stadt und Benutzer für Eure Stadt anpassen.
2) Das Ganze z.B. unter "ebtTop10.pl" abspeichern.
3) Ausführbar machen "chmod u+x ebtTop10.pl" und
4) Starten "perl ebtTop10.pl" !
Die Schrift-Farben und -Größen müssen dann natürlich im Nachhinein noch eingearbeitet werden.
Mit Perl unter Windows habe ich leider keine Erfahrung. Vielleicht kann dazu noch jemand eine Anleitung schreiben. (Naja, wer Perl benutzt, wird auch wissen, wie man es unter dem jeweiligen System ausführt...)
VORSICHT!
Ich habe es noch nicht an "Realdaten" getestet.
Sehe jetzt so auf Anhieb zwar keine Inplausibilitäten mehr, aber probiert es erst mal "außer Konkurrenz" und PMt mir, wenn Euch was auffällt.
Bemerkung: Es müsste auch für Top15, Top20,... funktionieren. -> dito ausprobieren.
Ein Perl-Skript zur automatischen Erstellung der Ranglisten.
(sorry für die Länge des Beitrags)
Code: Select all
#!/usr/bin/perl -w
use strict;
use Getopt::Std;
my $town = "Stuttgart";
# insert the names of the users here
my @topnames = ( 'nessie', 'MartinR', 'redcrew', 'RaF', 'Nivram', 'Hase',
'Nikolai Reininger', 'Gumble', 'igelwald', 'knospe' );
# test
#&printarray( @topnames );
#print $#topnames;
# not necessary, but i like it sorted ;-)
# (case-insensitive sort)
my @topsorted = sort {uc($a) cmp uc($b)} @topnames;
# test
#&printarray( @topsorted );
# hashes which assign the old resp. new number of bills ( = integer )
# to the according name in topsorted
# so: name(topsorted) => no of bills
my %oldnobills;
my %newnobills;
# read the number of bills from STDIN
&readnobills;
# test
foreach ( keys %oldnobills )
{
my $value = $oldnobills{$_};
#print "$_: $value\n";
}
# hash which assigns the old rank ( = integer from 1 ...)
# to the according name in topsorted
# so: name(topsorted) => old rank
my %oldrank = %oldnobills;
# the highest number is set to 1, 2, 3...
# (assuming that the number of bills of the topnames
# is greater than the number of places)
for ( my $i=0; $i<=$#topnames; $i++)
{
my $max = 0;
my $name = "";
foreach ( keys %oldrank )
{
if ( $oldrank{$_} > $max )
{
$max = $oldrank{$_};
$name = $_;
}
}
#print "$i+1: $name ($oldrank{$name})\n";
$oldrank{$name} = $i+1;
}
# test
foreach ( keys %oldrank )
{
my $value = $oldrank{$_};
#print "$_: $value\n";
}
# print sorted topnames:
# Rank, (old rank), name, no of bills, (difference relative to last time)
print "\n$town Top 10:\n";
my $i = 1;
foreach ( sort {$newnobills{$b} <=> $newnobills{$a}} keys %newnobills )
{
my $diff = "";
if ( $newnobills{$_} - $oldnobills{$_} == 0 )
{
$diff = "inaktiv";
}
else
{
my $tmp = $newnobills{$_} - $oldnobills{$_};
$diff = "+$tmp";
}
printf "%02d. (%02d.) %s %7d (%s)\n",
$i, $oldrank{$_}, $_, $newnobills{$_}, $diff;
$i++;
}
print "\n$town Top 10 gesamt: ";
my $newsumofbills = 0;
my $oldsumofbills = 0;
foreach ( keys %newnobills )
{
$newsumofbills = $newsumofbills + $newnobills{$_};
$oldsumofbills = $oldsumofbills + $oldnobills{$_};
}
my $diff = $newsumofbills - $oldsumofbills;
print "$newsumofbills (+$diff)\n";
exit;
sub printarray
{
my @values = @_;
foreach my $value ( @values )
{
print $value, ' ';
}
print "\n";
}
sub readnobills
{
foreach ( @topsorted )
{
print "Old number of bills for user '$_' \t: ";
my $tmp = <STDIN>;
chomp( $tmp );
$oldnobills{$_} = $tmp;
}
foreach ( @topsorted )
{
print "New number of bills for user '$_' \t: ";
my $tmp = <STDIN>;
chomp( $tmp );
$newnobills{$_} = $tmp;
}
}
1) Stadt und Benutzer für Eure Stadt anpassen.
2) Das Ganze z.B. unter "ebtTop10.pl" abspeichern.
3) Ausführbar machen "chmod u+x ebtTop10.pl" und
4) Starten "perl ebtTop10.pl" !
Die Schrift-Farben und -Größen müssen dann natürlich im Nachhinein noch eingearbeitet werden.
Mit Perl unter Windows habe ich leider keine Erfahrung. Vielleicht kann dazu noch jemand eine Anleitung schreiben. (Naja, wer Perl benutzt, wird auch wissen, wie man es unter dem jeweiligen System ausführt...)
VORSICHT!
Ich habe es noch nicht an "Realdaten" getestet.
Sehe jetzt so auf Anhieb zwar keine Inplausibilitäten mehr, aber probiert es erst mal "außer Konkurrenz" und PMt mir, wenn Euch was auffällt.
Bemerkung: Es müsste auch für Top15, Top20,... funktionieren. -> dito ausprobieren.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Money does matter!
Re: Perl-Skript für Ranglisten
Nachschlag:Nivram wrote: Ein Perl-Skript zur automatischen Erstellung der Ranglisten.
zur Generierung von BBCode, um es hier ins Forum zu setzen:
Code: Select all
sub printbbcode
{
# print sorted topnames for pasting into BBCode-abel forums
# rank, (old rank), name, no of bills, (difference relative to last time)
print "\n[color=green][size=18]$town Top 10:[/size][/color]\n";
my $i = 1;
foreach my $name ( sort {$newnobills{$b} <=> $newnobills{$a}}
keys %newnobills )
{
# rank
printf "%02d. ", $i;
# old rank
if ( $oldrank{$name} < $i )
{
printf "[color=green](%02d.)[/color] ", $oldrank{$name};
}
elsif ( $oldrank{$name} > $i )
{
printf "[color=red](%02d.)[/color] ", $oldrank{$name};
}
else
{
printf "(%02d.) ", $oldrank{$name};
}
# name
# hash which assigns the user id to the name
# so: name => user id
# (necessary for the link to user)
my %userid = ( 'nessie' => 10038, 'MartinR' => 9511,
'redcrew' => 28642, 'RaF' => 2651,
'Nivram' => 40342, 'Hase' => 2502,
'Nikolai Reininger' => 9439, 'Gumble' => 33632,
'igelwald' => 37410, 'knospe' => 32771 );
printf "[url=http://eurobilltracker.eu/index.php?command=2048;id=%d;]%s[/url] ", $userid{$name}, $name;
# no of bills, diff
my $diff = "";
if ( $newnobills{$name} - $oldnobills{$name} == 0 )
{
$diff = "inaktiv";
}
else
{
my $tmp = $newnobills{$name} - $oldnobills{$name};
$diff = "+$tmp";
}
printf "[b]%7d[/b] (%s)\n", $newnobills{$name}, $diff;
$i++;
}
# summary
my $newsumofbills = 0;
my $oldsumofbills = 0;
foreach my $name ( keys %newnobills )
{
$newsumofbills = $newsumofbills + $newnobills{$name};
$oldsumofbills = $oldsumofbills + $oldnobills{$name};
}
my $diff = $newsumofbills - $oldsumofbills;
my $nousers = $#topnames+1;
print "\n[b]$town Top $nousers\[/b] gesamt: ";
print "$newsumofbills (+$diff)\n";
}
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Money does matter!
Das wäre ja genial, es würde einem eine Unmenge stupider Rechnerei ersparen.
Wenn die Sache allgemein bekannt ist wird vielleicht die Motivation bei einigen wieder steigen, ihre eigenen Statistiken auf Vordermann zu bringen, weil sie dazu viel weniger Zeit benötigen werden.
(die internationalen Top 50 z.B. sind schon seit 2 Wochen überfällig )
Wie ist dieser Punkt gemeint?
Wenn die Sache allgemein bekannt ist wird vielleicht die Motivation bei einigen wieder steigen, ihre eigenen Statistiken auf Vordermann zu bringen, weil sie dazu viel weniger Zeit benötigen werden.
(die internationalen Top 50 z.B. sind schon seit 2 Wochen überfällig )
Wie ist dieser Punkt gemeint?
3) Ausführbar machen "chmod u+x ebtTop10.pl
Sorry, lesen kann das Skript gar nix. Es rechnet nur.Raurakgan wrote:... nur die Frage ob das Programm auch die 11te Seite lesen kann ?
Es fragt Dich nach der Anzahl der (damals und heute) eingegebenen Scheine der Benutzer, die Du bestimmst (in den ersten paar Zeilen).
Aber wenn Du die Benutzer einmal gefunden hast, kannst Du sie ja in der Rangliste (mit Hilfe ihrer ID) verlinken. Dann musst Du nicht jedes mal aufs Neue suchen, sondern kannst dann immer nur draufklicken um nachzuschauen, wieviele Scheine er nun hat. (Siehe Bspe. auf Seite 1.)
Wie ich das sehe, bleibt nur zu hoffen, dass sich die Top 10 auf den dargestellten Seiten befinden, sonst kann da vielleicht höchstens noch der Admin was machen. (Oder man gibt die IDs der Benutzer ein, aber bei >60.000 Leuten... eher nicht)
PS: Ich habe das Skript inzwischen so weit gebracht, dass es die neuen Werte abspeichert und das nächste mal als default-Eingabe für die alten vorschlägt.
Last edited by Nivram on Tue Jul 19, 2005 3:15 pm, edited 1 time in total.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Money does matter!
source
So, hab die aktuelle Version jetzt mal zum Herunterladen bereitgestellt.
Wie gesagt, Anregung, Kritik,... willkommen.
Wie gesagt, Anregung, Kritik,... willkommen.
Last edited by Nivram on Fri Jul 22, 2005 4:14 pm, edited 3 times in total.
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Money does matter!
- Licht & Feuer
- Euro-Master
- Posts: 1749
- Joined: Tue May 10, 2005 5:44 pm
- Location: Im Osten des Westens der auch als Süden des Nordens betrachtet wird
- Contact:
ich befürchte, dass das mit windows ziemlich kompliziert wird
um das script zu nutzen, braucht man perl, was normalerweise (so weit ich weiss) unter linux nicht installiert ist...
man könnte allerdings überlegen, das ganze auf webspace hochzuladen, der perl hat und dann mit einem ftp-programm, dass auch konsolen-eingabe unterstützt die abfrage machen... oder seh ichd as jetzt falsch Nivram?
dazu könnte man dann ja mal ein tutorial schreiben....
/EDIT: bzw wie wäre es, wenn man das ganze so weiter bearbeitet, dass man ne html eingabe machen kann und dann auch ne ausgabe bekommt... ich glaub das werd ich mal probieren und dann das script hochladen, so dass jeder der will drauf zugreifen kann^^ sollte doch net so schwer sein...
um das script zu nutzen, braucht man perl, was normalerweise (so weit ich weiss) unter linux nicht installiert ist...
man könnte allerdings überlegen, das ganze auf webspace hochzuladen, der perl hat und dann mit einem ftp-programm, dass auch konsolen-eingabe unterstützt die abfrage machen... oder seh ichd as jetzt falsch Nivram?
dazu könnte man dann ja mal ein tutorial schreiben....
/EDIT: bzw wie wäre es, wenn man das ganze so weiter bearbeitet, dass man ne html eingabe machen kann und dann auch ne ausgabe bekommt... ich glaub das werd ich mal probieren und dann das script hochladen, so dass jeder der will drauf zugreifen kann^^ sollte doch net so schwer sein...
Doch, ich denke schon. Unter Linux ist, glaube ich, perl standardmäßig installiert.Hangman wrote:ich befürchte, dass das mit windows ziemlich kompliziert wird
um das script zu nutzen, braucht man perl, was normalerweise (so weit ich weiss) unter linux nicht installiert ist...
Nur für Windows muss man es sich runterladen.
edit:
auf http://www.perl.org/get.html zu lesen
"If you are running a Linux (or most UNIX) system, you probably already have a perl that was packaged with it. Type perl -v at the command line to find out which version."
Nivram <.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·
Money does matter!
Money does matter!
Re: source
Ich habe deine neue Version gerade getestet, das Resultat sieht für den Anfang sehr gut aus.Nivram wrote:So, hab die aktuelle Version jetzt mal zum Herunterladen bereitgestellt:
http://www.kybs.de/~marvin/ebtTop10.pl
Wie gesagt, Anregung, Kritik,... willkommen.
Wäre es denn machbar, das komplette Resultat, so wie es im Dos-Fenster angezeigt wird, als Datei auszugeben?
Bisher steht ja in der Ausgabedatei nur der neue Stand der eingegebenen Scheine.
Diese Meldung kommt jedes Mal bei der Anforderung der "old number of bills":
"Use of unitialized value in concatenation <.> or string at ebtTop10.pl line 301.