Wikipedia:Archiv/Alternative Benutzerstatistik/Programme/aktivitaet
<syntaxhighlight lang="perl">
- !/usr/bin/perl
use Time::Local;
$debug = 0; # 1 = debuggen, 0 = nicht debuggen $bs = "Linux"; # Windows oder Linux
$aktuell = 90*86400;
mkdir "sort-tmp" unless -d "sort-tmp";
- Stand: 06.07.2006
$admins = "
1. 1001 �$-1òî(Administrator) 2. AHZ �$-1òî(Administrator) 3. APPER �$-1òî(Administrator) 4. Achim Raschka �$-1òî(Administrator) 5. Aglarech �$-1òî(Administrator) 6. Aineias �$-1òî(Administrator) 7. Aka �$-1òî(Administrator) 8. AlexR �$-1òî(Administrator) 9. Alexander Z. �$-1òî(Administrator) 10. Alkuin �$-1òî(Administrator) 11. Alma �$-1òî(Administrator) 12. AndreasPraefcke �$-1òî(Administrator) 13. Anneke Wolf �$-1òî(Administrator) 14. Aristeides �$-1òî(Administrator) 15. Arnomane �$-1òî(Administrator) 16. ArtMechanic �$-1òî(Administrator) 17. Asb �$-1òî(Administrator) 18. Atamari �$-1òî(Administrator) 19. Avatar �$-1òî(Administrator) 20. BLueFiSH.as �$-1òî(Administrator) 21. Baldhur �$-1òî(Administrator) 22. Bdk �$-1òî(Administrator) 23. Ben-Zin �$-1òî(Administrator) 24. Berlin-Jurist �$-1òî(Administrator) 25. Bernhard55 �$-1òî(Administrator) 26. Beyer �$-1òî(Administrator) 27. Birger Fricke �$-1òî(Administrator) 28. Blaite �$-1òî(Administrator) 29. Bradypus �$-1òî(Administrator) 30. Bubo bubo �$-1òî(Administrator) 31. Carbidfischer �$-1òî(Administrator) 32. CdaMVvWgS �$-1òî(Administrator) 33. Chb �$-1òî(Administrator) 34. Chef �$-1òî(Administrator) 35. Christian Günther �$-1òî(Administrator) 36. ChristophLanger �$-1òî(Administrator) 37. Chrkl �$-1òî(Administrator) 38. Crux �$-1òî(Administrator) 39. D �$-1òî(Administrator) 40. DaB. �$-1òî(Administrator) 41. Darkone �$-1òî(Administrator) 42. Davidl �$-1òî(Administrator) 43. Dbenzhuser �$-1òî(Administrator) 44. Dickbauch �$-1òî(Administrator) 45. Dishayloo �$-1òî(Administrator) 46. Duesentrieb �$-1òî(Administrator) 47. Dundak �$-1òî(Administrator) 48. EBB �$-1òî(Administrator) 49. Echoray �$-1òî(Administrator) 50. Eike sauer �$-1òî(Administrator) 51. ElRaki �$-1òî(Administrator) 52. Elian �$-1òî(Administrator) 53. Eloquence �$-1òî(developer, Administrator) 54. Elya �$-1òî(Administrator) 55. Erwin E aus U �$-1òî(Administrator) 56. Factumquintus �$-1òî(Administrator) 57. Fantasy �$-1òî(Administrator) 58. Fb78 �$-1òî(Administrator) 59. Filzstift �$-1òî(Administrator) 60. Finanzer �$-1òî(Administrator) 61. Fire �$-1òî(Administrator) 62. Flominator �$-1òî(Administrator) 63. Florian Adler �$-1òî(Administrator) 64. Flups �$-1òî(Administrator) 65. Frank Schulenburg �$-1òî(Administrator) 66. Fristu �$-1òî(Administrator) 67. FritzG �$-1òî(Administrator) 68. Fusslkopp �$-1òî(Administrator) 69. GS �$-1òî(Administrator) 70. Gardini �$-1òî(Administrator) 71. Geiserich77 �$-1òî(Administrator) 72. Geisslr �$-1òî(Administrator) 73. Georg Slickers �$-1òî(Administrator) 74. Geos �$-1òî(Administrator) 75. Gerbil �$-1òî(Administrator) 76. Gnu1742 �$-1òî(Administrator) 77. Gunter.krebs �$-1òî(Administrator) 78. Gunther �$-1òî(Administrator) 79. H-stt �$-1òî(Administrator) 80. Hadhuey �$-1òî(Administrator) 81. Hafenbar �$-1òî(Administrator) 82. He3nry �$-1òî(Administrator) 83. Head �$-1òî(Administrator) 84. Hejkal �$-1òî(Administrator) 85. Henriette Fiebig �$-1òî(Administrator) 86. Hermannthomas �$-1òî(Administrator) 87. Herr Klugbeisser �$-1òî(Administrator) 88. Hoch auf einem Baum �$-1òî(Administrator) 89. Hoheit �$-1òî(Administrator) 90. IGEL �$-1òî(Administrator) 91. Idler �$-1òî(Administrator) 92. Igelball �$-1òî(Administrator) 93. Ilja Lorek �$-1òî(Administrator) 94. Irmgard �$-1òî(Administrator) 95. Ixitixel �$-1òî(Administrator) 96. J budissin �$-1òî(Administrator) 97. JD �$-1òî(Administrator) 98. JHeuser �$-1òî(Administrator) 99. JakobVoss �$-1òî(Administrator) 100. Janneman �$-1òî(Administrator) 101. Jcornelius �$-1òî(Administrator) 102. Jergen �$-1òî(Administrator) 103. Jofi �$-1òî(Administrator) 104. John N. �$-1òî(Administrator) 105. KMJ �$-1òî(Administrator) 106. Kam Solusar �$-1òî(Administrator) 107. Karl Gruber �$-1òî(Administrator) 108. Karl-Henner �$-1òî(Administrator) 109. Kh80 �$-1òî(Administrator) 110. Kiker99 �$-1òî(Administrator) 111. Kku �$-1òî(Administrator) 112. Kubrick �$-1òî(Administrator) 113. Kurt Jansson �$-1òî(Administrator) 114. Langec �$-1òî(Administrator) 115. Leipnizkeks �$-1òî(Administrator) 116. Lennert B �$-1òî(Administrator) 117. LeonWeber �$-1òî(Administrator) 118. Liesel �$-1òî(Administrator) 119. Limasign �$-1òî(Administrator) 120. LosHawlos �$-1òî(Administrator) 121. Lou.gruber �$-1òî(Administrator) 122. Lung �$-1òî(Administrator) 123. Lyzzy �$-1òî(Administrator) 124. Maclemo �$-1òî(Administrator) 125. Magadan �$-1òî(Administrator) 126. Magnus Manske �$-1òî(developer, Administrator) 127. Marcus Cyron �$-1òî(Administrator) 128. Markus Mueller �$-1òî(Administrator) 129. Markus Schweiß �$-1òî(Administrator) 130. Martin-vogel �$-1òî(Administrator) 131. Mathias Schindler �$-1òî(Administrator) 132. Matthäus Wander �$-1òî(Administrator) 133. Mazbln �$-1òî(Administrator) 134. Media lib �$-1òî(Administrator) 135. Melkom �$-1òî(Administrator) 136. MichaelDiederich �$-1òî(Bürokrat, Administrator) 137. Mikue �$-1òî(Administrator) 138. Mnh �$-1òî(Administrator) 139. Mogelzahn �$-1òî(Administrator) 140. Napa �$-1òî(Administrator) 141. Nb �$-1òî(Administrator) 142. Nerd �$-1òî(Administrator) 143. NiTenIchiRyu �$-1òî(Administrator) 144. NickKnatterton �$-1òî(Administrator) 145. Nina �$-1òî(Administrator) 146. Nocturne �$-1òî(Administrator) 147. Okatjerute �$-1òî(Administrator) 148. Ot �$-1òî(Administrator) 149. Pelz �$-1òî(Administrator) 150. Perrak �$-1òî(Administrator) 151. Peterlustig �$-1òî(Administrator) 152. Philipendula �$-1òî(Administrator) 153. Pischdi �$-1òî(Administrator) 154. Pit �$-1òî(Administrator) 155. Poupou l'quourouce �$-1òî(Administrator) 156. RKraasch �$-1òî(Administrator) 157. Rainer Zenz �$-1òî(Administrator) 158. Ralf Roletschek �$-1òî(Administrator) 159. Raven �$-1òî(Administrator) 160. Rax �$-1òî(Administrator) 161. Raymond �$-1òî(Administrator) 162. Rdb �$-1òî(Administrator) 163. Redf0x �$-1òî(Administrator) 164. Richardfabi �$-1òî(Administrator) 165. RobbyBer �$-1òî(Administrator) 166. Robert Kropf �$-1òî(Administrator) 167. Robodoc �$-1òî(Administrator) 168. Sarazyn �$-1òî(Administrator) 169. Schewek �$-1òî(Administrator) 170. Schnargel �$-1òî(Administrator) 171. Schwalbe �$-1òî(Administrator) 172. Sechmet �$-1òî(Administrator) 173. Seidl �$-1òî(Administrator) 174. Sicherlich �$-1òî(Administrator) 175. Sigune �$-1òî(Administrator) 176. Silberchen �$-1òî(Administrator) 177. Skriptor �$-1òî(Administrator) 178. Slomox �$-1òî(Administrator) 179. Smurf �$-1òî(Administrator) 180. Southpark �$-1òî(Administrator) 181. Srbauer �$-1òî(Administrator) 182. Stahlkocher �$-1òî(Administrator) 183. Stechlin �$-1òî(Administrator) 184. Stefan Kühn �$-1òî(Bürokrat, Administrator) 185. Stefan64 �$-1òî(Administrator) 186. Steffen Löwe Gera �$-1òî(Administrator) 187. Stern �$-1òî(Administrator) 188. Steschke �$-1òî(Administrator) 189. Stw �$-1òî(Administrator) 190. Superbass �$-1òî(Administrator) 191. Terabyte �$-1òî(Administrator) 192. Thomas Luft �$-1òî(Administrator) 193. Threedots �$-1òî(Administrator) 194. Tigerente �$-1òî(Administrator) 195. Tilman Berger �$-1òî(Administrator) 196. Tobnu �$-1òî(Administrator) 197. Tolanor �$-1òî(Administrator) 198. TomK32 �$-1òî(Administrator) 199. Tsor �$-1òî(Administrator) 200. Tsui �$-1òî(Administrator) 201. Tullius �$-1òî(Administrator) 202. UW �$-1òî(Administrator) 203. Ureinwohner �$-1òî(Administrator) 204. Uwe Gille �$-1òî(Administrator) 205. Vic Fontaine �$-1òî(Administrator) 206. Vigala Veia �$-1òî(Administrator) 207. Voyager �$-1òî(Administrator) 208. Vulture �$-1òî(Administrator) 209. W.wolny �$-1òî(Administrator) 210. Wahrerwattwurm �$-1òî(Administrator) 211. Waugsberg �$-1òî(Administrator) 212. Wolfgangbeyer �$-1òî(Administrator) 213. Wst �$-1òî(Administrator) 214. Xocolatl �$-1òî(Administrator) 215. Zenogantner �$-1òî(Administrator) 216. Zenon �$-1òî(Administrator) 217. Zinnmann �$-1òî(Administrator) 218. Zumbo �$-1òî(Administrator)
"; while($admins =~ /\d+\. (.*?) .*?\(.*?\)\n/g) { $admin{$1} = 1; }
@keineAdmins = (
- "217", "Achim Raschka", "AN", "Andrsvoss", "Albrecht Conz", "Benowar", "Bierdimpfl", "Diana",
- "El", "ErikDunsing", "Erwin E aus U", "Fritz", "HenrikHolke", "Isis2000",
- "Keichwa", "Lienhard Schulz", "MAK", "Martin W. Richter", "Martin-vogel",
- "Odin", "Otto", "Paddy", "Pjacobi", "SirJective", "Southpark", "Stefan Volk", "Wiska Bodo"
); map { $keinAdmin{$_} = 1 } @keineAdmins;
$bots = "
1. AgentSpartiBot �$-1òî(Bot) 2. AkaBot �$-1òî(Bot) 3. ApeBot �$-1òî(Bot) 4. BWBot �$-1òî(Bot) 5. Botteler �$-1òî(Bot) 6. Chlewbot �$-1òî(Bot) 7. Chobot �$-1òî(Bot) 8. ConBot �$-1òî(Bot) 9. CyeZBot �$-1òî(Bot) 10. CyroBot �$-1òî(Bot) 11. DHN-bot �$-1òî(Bot) 12. Eskimbot �$-1òî(Bot) 13. FlaBot �$-1òî(Bot) 14. Flothi bot �$-1òî(Bot) 15. GGNBot �$-1òî(Bot) 16. GeoBot �$-1òî(Bot) 17. Gpvosbot �$-1òî(Bot) 18. Heikobot �$-1òî(Bot) 19. KocjoBot �$-1òî(Bot) 20. KokoBot �$-1òî(Bot) 21. LeonardoRob0t �$-1òî(Bot) 22. LiBot �$-1òî(Bot) 23. MelancholieBot �$-1òî(Bot) 24. MoriBot �$-1òî(Bot) 25. OlliBot �$-1òî(Bot) 26. PixelBot �$-1òî(Bot) 27. PnBot �$-1òî(Bot) 28. PortalBot �$-1òî(Bot) 29. PyBot �$-1òî(Bot) 30. QS-Bot �$-1òî(Bot) 31. RCBot �$-1òî(Bot) 32. RKBot �$-1òî(Bot) 33. RedBot �$-1òî(Bot) 34. Robbot �$-1òî(Bot) 35. RobotE �$-1òî(Bot) 36. RobotQuistnix �$-1òî(Bot) 37. SirBot �$-1òî(Bot) 38. Sk-Bot �$-1òî(Bot) 39. Slobot �$-1òî(Bot) 40. SpBot �$-1òî(Bot) 41. Thijs!bot �$-1òî(Bot) 42. Tsca.bot �$-1òî(Bot) 43. Ugur Basak Bot �$-1òî(Bot) 44. VBot �$-1òî(Bot) 45. YurikBot �$-1òî(Bot) 46. Zwobot �$-1òî(Bot)
"; while($bots =~ /\d+\. (.*?) .*?\(.*?\)\n/g) { $bot{$1} = 1; } $bot{"conversion script"} = 1; $bot{"Template namespace initialisation script"} = 1; $bot{"Kategobot"} = 1; $bot{"Plattbot"} = 1; $bot{"HotBot"} = 1; $bot{"Newsbot"} = 1;
print int(keys %admin) . " Admins, " . int(keys %bot) . " Bots\n";
sub istAnon { my $user = shift; $user =~ /^\d+\.\d+\.\d+\.(\d+|xxx)$/ || $user =~ /\.\S*?\.(\w\w|net|com|edu)$/i; }
sub zeit { my $timestamp = shift; $timestamp =~ /^(....)(..)(..)(..)(..)(..)/; timelocal($6, $5, $4, $3, $2-1, $1-1900); }
$mitKat = -f "kattree" && -r _ && -f "katlinks" && -r _;
if($mitKat) { open KATTREE, "kattree"; while(<KATTREE>) { chop; ($subkat, @kat) = split; push @{$subkat{$_}}, $subkat for @kat; } close KATTREE; @hauptkategorien = sort @{$subkat{"!Hauptkategorie"}}; foreach $hk (@hauptkategorien) { @kats = ($hk); %tag = (); while(@kats>0) { $kat = pop @kats; next if defined $tag{$kat}; $tag{$kat} = 1; push @{$hauptkatKat{$kat}}, $hk; push @kats, @{$subkat{$kat}}; } } # print $_ . ": " . join(",", @{$hauptkatKat{$_}}) . "\n" for keys %hauptkat; open KATLINKS, "katlinks"; while(<KATLINKS>) { chop; ($artikel, @kat) = split; %hauptkatTmp = (); for $kat (@kat) { $hauptkatTmp{$_} = 1 for @{$hauptkatKat{$kat}}; } @{$hauptkat{$artikel}} = keys %hauptkatTmp; } close KATLINKS; }
if($bs eq "Linux") { open IN, "tail -1 zsf|"; $jetzt = zeit(<IN>); } else { open IN, "zsf"; while(<IN>) { $jetzt = zeit $_; } }
print "Anzahl der Bearbeitungen bestimmen ...\n"; open IN, "zsf"; open OUT, ">zsf.tmp2"; while(<IN>) { chop; ($timestamp, $l, $is_redirect, $loesch, $text, $user, $namespace, $titel) = split; next if $timestamp eq "00000000000000" || $user eq "_" || $titel eq "_" || $namespace == 99; $user = "+Anon+" if istAnon($user); if($namespace eq "0") { $ldiff = $l-$lalt{$titel}; print OUT "$user $timestamp $titel $l $ldiff $is_redirect $loesch $text\n"; $lalt{$titel} = $l; } $titel =~ s/_/ /g; $user =~ s/_/ /g; next if $ns==2 || $user eq "WikiSysop" || $user eq "WikiDeveloper"; $nVers{$titel}++ if $namespace eq "0"; # die Keys von %nVers werden unten für die Längenberechnung benutzt $gesamtEdits{$user}++; $Zeit = zeit($timestamp); unless($is_redirect) { # Die Zeitstempel einiger Redirects sind falsch. $erstbearbeitung{$user} = $Zeit if !defined $erstbearbeitung{$user} || $Zeit<$erstbearbeitung{$user}; $letztbearbeitung{$user} = $Zeit if !defined $letztbearbeitung{$user} || $Zeit>$letztbearbeitung{$user}; } if(!defined $letzteBearbeitung{"$user#$titel#$namespace"} || $Zeit-$letzteBearbeitung{"$user#$titel#$namespace"}>3600) { $nEchteEdits++; $echteEdits{$user}++; if($mitKat) { $echteEditsKat{$_}{$user}++ for @{$hauptkat{$titel}}; } if($jetzt-$Zeit<$aktuell) { $echteEditsAktuell{$user}++; if($mitKat) { $echteEditsAktuellKat{$_}{$user}++ for @{$hauptkat{$titel}}; } } $letzteBearbeitung{"$user#$titel#$namespace"} = $Zeit; } $loesch{$text}++ if $namespace==0 && $loesch; } close OUT; %lalt = ();
%letzteBearbeitung = undef;
- fehlerhafte Erstbearbeitungszeiten manuell korrigieren:
- grep 'benutzername' < zsf | head -10
- davon den ersten richtigen Zeitstempel verwenden
$erstbearbeitung{"AndreasPraefcke"} = zeit("20041005150418");
- print "Benutzer mit den meisten Bearbeitungen:\n";
@gesamtEditsRangfolge = sort { $gesamtEdits{$b} <=> $gesamtEdits{$a} } keys %gesamtEdits; for($i=0; $i<@gesamtEditsRangfolge; $i++) { $gesamtEditsPos{$gesamtEditsRangfolge[$i]} = $i+1; }
open OUT, ">AnzahlEdits.out";
print OUT "{| border=\"1\" cellspacing=\"0\"\n"; print OUT "|-\n"; print OUT "! Pos. || off. || Bearb. || Bearb. aktuell || zus. || Benutzer || Erstbearb. || Letztbearb. \n"; print OUT "|-\n"; @echteEditsRangfolge = sort { $echteEdits{$b} <=> $echteEdits{$a} } keys %echteEdits; for($i=0, $j=0; $i<200+$j; $i++) { $user = $echteEditsRangfolge[$i]; if($user eq "+Anon+" || defined $bot{$user}) { $j++; next; } $zus = $gesamtEdits{$user}/$echteEdits{$user}; printf OUT "| %3i || %3i || %5i || %5i || " . "style=\"background:#%s;\" | %.2f || %s || %i || %i\n", $i-$j+1, $gesamtEditsPos{$user}, $echteEdits{$user}, $echteEditsAktuell{$user}, $zus>1.2?($zus>1.5?"ff5050":"ffff30"):"50ff50", $zus, $user, $user, int(($jetzt-$erstbearbeitung{$user})/86400), int(($jetzt-$letztbearbeitung{$user})/86400); print OUT "|-\n"; } print OUT "|}\n";
- print "Größe der beigetragenen Textmenge bestimmen ...\n";
sub zusammenrechnen { my ($aenderung, $aenderungAktuell, $max_laenge, $titel) = @_; my $user; foreach $user (keys %$aenderung) { $aenderung->{$user} = $max_laenge if $aenderung->{$user} > $max_laenge; $aenderung->{$user} = -$max_laenge if $aenderung->{$user} < -$max_laenge; $gesamtBytes{$user} += $aenderung->{$user}; if($mitKat) { $gesamtBytesKat{$_}{$user} += $aenderung->{$user} for @{$hauptkat{$titel}}; } $nEchteBytes += $aenderung->{$user}; } foreach $user (keys %$aenderungAktuell) { $aenderungAktuell->{$user} = $max_laenge if $aenderungAktuell->{$user} > $max_laenge; $aenderungAktuell->{$user} = -$max_laenge if $aenderungAktuell->{$user} < -$max_laenge; $gesamtBytesAktuell{$user} += $aenderungAktuell->{$user}; if($mitKat) { $gesamtBytesAktuellKat{$_}{$user} += $aenderungAktuell->{$user} for @{$hauptkat{$titel}}; } } }
- negative Längenänderungen nur in +/- 10-Minuten-Zeitraum berücksichtigen
sub schreibeVersion { ($user, $timestamp, $titel, $l, $ldiff, $is_redirect, $loesch, $text) = @{shift @versionen}; $ldiff=$ldiff<0?0:$ldiff; print OUT "$titel $timestamp $l $ldiff $is_redirect $loesch $text $user\n"; }
sortExtern("zsf.tmp2", "zsf.tmp2s"); open IN, "zsf.tmp2s"; open OUT, ">zsf.tmp"; $user_alt = ""; while(<IN>) {
chop;
push @versionen, [ split ];
if($versionen[-1]->[0] ne $versionen[0]->[0]) { # neuer User
while(@versionen>1) { schreibeVersion(); }
}
while(zeit($versionen[-1]->[1])-zeit($versionen[0]->[1])>600) { schreibeVersion(); }
my ($ldiffpos, $ldiffneg) = (0, 0);
foreach my $vers (@versionen) {
$ldiffpos += $vers->[4] if $vers->[4]>0;
$ldiffneg -= $vers->[4] if $vers->[4]<0;
}
$ldiffpos = $ldiffneg = $ldiffpos>$ldiffneg?$ldiffneg:$ldiffpos;
foreach my $vers (@versionen) {
if($vers->[4]>0) {
if($vers->[4]<$ldiffpos) {
$ldiffpos -= $vers->[4]; $vers->[4] = 0;
} else {
$vers->[4] -= $ldiffpos; $ldiffpos = 0;
}
} elsif($vers->[4]<0) {
if(-$vers->[4]<$ldiffneg) {
$ldiffneg += $vers->[4]; $vers->[4] = 0;
} else {
$vers->[4] += $ldiffneg; $ldiffneg = 0;
} } }
} while(@versionen>0) { schreibeVersion(); } close OUT; unlink "zsf.tmp2s";
sortExtern("zsf.tmp", "zsf.tmps"); open IN, "zsf.tmps"; $titel_alt=""; while(<IN>) {
chop;
($titel, $timestamp, $l, $ldiff, $is_redirect, $loesch, $text, $user) = split;
$titel =~ s/_/ /g; $user =~ s/_/ /g;
if($titel ne $titel_alt) {
zusammenrechnen(\%aenderung, \%aenderungAktuell, $max_laenge, $titel) if $titel_alt ne "";
$nArt++;
- printf "%3i %s\n", $nVers{$titel}, $titel;
%text_hash = ();
$titel2 = $titel;
$titel2 =~ s/'/\\'/g;
$loesch = 0; $max_laenge = 0; %aenderung = (); %aenderungAktuell = ();
$titel_alt = $titel;
}
next if $user eq "WikiSysop" || $user eq "WikiDeveloper";
$Zeit = zeit($timestamp);
$gesamtGroesse += $l if $tab eq "cur";
$istRev = $istLoesch = 0;
if(defined $text_hash{$text}) {
$reverts{$titel}++;
$nRev++;
$istRev=1;
}
if(defined $loesch{$text}) {
$loesch=1; $istLoesch=1;
} elsif($loesch) {
$loesch=0; $istLoesch=1;
}
$aenderung{$user}+=$ldiff unless $istRev||$istLoesch;
$aenderungAktuell{$user}+=$ldiff if($jetzt-$Zeit<$aktuell && !($istRev||$istLoesch));
$max_laenge = $l if $l>$max_laenge;
$text_hash{$text}++;
} zusammenrechnen(\%aenderung, \%aenderungAktuell, $max_laenge, $titel) if $titel_alt ne ""; unlink "zsf.tmps";
@sGesamtBytes = sort { $gesamtBytes{$b} <=> $gesamtBytes{$a} } keys %gesamtBytes;
open OUT, ">AnzahlBytes.out"; print OUT "$nEchteEdits Bearbeitungen, $gesamtGroesse Bytes insgesamt, $nEchteBytes Bytes gezählt\n\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Bytes || Bytes aktuell || Benutzer || Erstbearb. || Letztbearb.\n"; print OUT "|-\n"; for($i=0, $j=0; $i<200+$j; $i++) {
$user = $sGesamtBytes[$i];
if($user eq "+Anon+" || defined $bot{$user}) {
$j++;
next;
}
printf OUT "| %i || %i || %i || %s || %i || %i\n", $i-$j+1, $gesamtBytes{$user},
$gesamtBytesAktuell{$user}, $user, $user, int(($jetzt-$erstbearbeitung{$user})/86400),
int(($jetzt-$letztbearbeitung{$user})/86400);
print OUT "|-\n";
} print OUT "|}\n";
- foreach $user (keys %gesamtBytes) {
$Punkte{$user} = $echteEdits{$user}+int($gesamtBytes{$user}/240); $PunkteAktuell{$user} = $echteEditsAktuell{$user}+int($gesamtBytesAktuell{$user}/240); if($mitKat) { foreach $kat (@hauptkategorien) { $PunkteKat{$kat}{$user} = $echteEditsKat{$kat}{$user}+int($gesamtBytesKat{$kat}{$user}/240); $PunkteGesamtKat{$kat} += $PunkteKat{$kat}{$user}; $PunkteAktuellKat{$kat}{$user} = $echteEditsAktuellKat{$kat}{$user}+int($gesamtBytesAktuellKat{$kat}{$user}/240); } } if(int(($jetzt-$letztbearbeitung{$user})/86400)<30) { $PunkteAktiv{$user} = $Punkte{$user}; $PunkteAktuellAktiv{$user} = $PunkteAktuell{$user}; } else { $PunkteInaktiv{$user} = $Punkte{$user}; } }
@sPunkte = sort { $Punkte{$b} <=> $Punkte{$a} } keys %Punkte; @sPunkteAktiv = sort { $PunkteAktiv{$b} <=> $PunkteAktiv{$a} } keys %PunkteAktiv; @sPunkteInaktiv = sort { $PunkteInaktiv{$b} <=> $PunkteInaktiv{$a} } keys %PunkteInaktiv; @sPunkteAktuell = sort { $PunkteAktuell{$b} <=> $PunkteAktuell{$a} } keys %PunkteAktuell; @sPunkteAktuellAktiv = sort { $PunkteAktuellAktiv{$b} <=> $PunkteAktuellAktiv{$a} } keys %PunkteAktuellAktiv;
open OUT, ">Aktivitaet.txt"; foreach $user (@sPunkte) {
printf OUT "%7i %7i %9i %7i %7i %9i %11i %11i %s\n", $Punkte{$user}, $echteEdits{$user}, $gesamtBytes{$user},
$PunkteAktuell{$user}, $echteEditsAktuell{$user}, $gesamtBytesAktuell{$user}, $erstbearbeitung{$user},
$letztbearbeitung{$user}, $user;
}
open OUT, ">AnzahlPunkte.out"; print OUT "===Aktive Benutzer===\n"; print OUT "{| cellspacing=\"20\"\n"; print OUT "| Gesamtaktivität || Aktivität in den letzten 90 Tagen\n"; print OUT "|- valign=\"top\"\n"; print OUT "|\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Punkte || Benutzer || A || Erstbearb. || Letztbearb.\n"; print OUT "|-\n"; for($i=0, $j=0, $k=0; $i<200+$j+$k; $i++) {
$user = $sPunkteAktiv[$i];
if($user eq "+Anon+" || defined $bot{$user}) {
$j++;
next;
}
- print "$i $j $k\n";
printf OUT "| %i || %i || %s || %s || %i || %i\n", $i-$j-$k+1, $PunkteAktiv{$user}, $user, $user, ($admin{$user}?"+":($keinAdmin{$user}?"-":"")),int(($jetzt-$erstbearbeitung{$user})/86400), int(($jetzt-$letztbearbeitung{$user})/86400); print OUT "|-\n"; $k = $PunkteAktiv{$user}==$PunkteAktiv{$sPunkteAktiv[$i+1]}?$k+1:0;
} print OUT "|}\n"; print OUT "|\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Punkte || Benutzer || A\n"; print OUT "|-\n"; for($i=0, $j=0, $k=0; $i<200+$j+$k; $i++) {
$user = $sPunkteAktuellAktiv[$i];
if($user eq "+Anon+" || defined $bot{$user}) {
$j++;
next;
}
printf OUT "| %i || %i || %s || %s\n", $i-$j-$k+1, $PunkteAktuellAktiv{$user}, $user, $user,
($admin{$user}?"+":($keinAdmin{$user}?"-":""));
print OUT "|-\n";
$k = $PunkteAktuellAktiv{$user}==$PunkteAktuellAktiv{$sPunkteAktuellAktiv[$i+1]}?$k+1:0;
} print OUT "|}\n"; print OUT "|}\n\n";
print OUT "===Inaktive Benutzer===\n"; print OUT "{| cellspacing=\"20\"\n"; print OUT "|\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Punkte || Benutzer || A || Erstbearb. || Letztbearb.\n"; print OUT "|-\n"; for($i=0, $j=0, $k=0; $i<50+$j+$k; $i++) {
$user = $sPunkteInaktiv[$i];
if($user eq "+Anon+" || defined $bot{$user}) {
$j++;
next;
}
printf OUT "| %i || %i || %s || %s || %i || %i\n", $i-$j-$k+1, $PunkteInaktiv{$user}, $user, $user,
($admin{$user}?"+":($keinAdmin{$user}?"-":"")), int(($jetzt-$erstbearbeitung{$user})/86400),
int(($jetzt-$letztbearbeitung{$user})/86400);
print OUT "|-\n";
$k = $PunkteInaktiv{$user}==$PunkteInaktiv{$sPunkteInaktiv[$i+1]}?$k+1:0;
} print OUT "|}\n"; print OUT "|}\n"; close OUT;
if($mitKat) { open OUT, ">AnzahlPunkteKat.out"; foreach $kat (@hauptkategorien) { next if $PunkteGesamtKat{$kat}<10000; @sPunkteKat = sort { $PunkteKat{$kat}{$b} <=> $PunkteKat{$kat}{$a} } keys %{$PunkteKat{$kat}}; @sPunkteAktuellKat = sort { $PunkteAktuellKat{$kat}{$b} <=> $PunkteAktuellKat{$kat}{$a} } keys %{$PunkteAktuellKat{$kat}}; $katSp = $kat; $katSp =~ s/_/ /g; print OUT "===$katSp===\n"; print OUT "{| cellspacing=\"20\"\n"; print OUT "| Gesamtaktivität || Aktivität in den letzten 90 Tagen\n"; print OUT "|- valign=\"top\"\n"; print OUT "|\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Punkte || Benutzer || A || Erstbearb. || Letztbearb.\n"; print OUT "|-\n"; for($i=0, $j=0, $k=0; $i<50+$j+$k; $i++) { $user = $sPunkteKat[$i]; if($user eq "+Anon+" || defined $bot{$user}) { $j++; next; } printf OUT "| %i || %i || %s || %s || %i || %i\n", $i-$j-$k+1, $PunkteKat{$kat}{$user}, $user, $user, ($admin{$user}?"+":($keinAdmin{$user}?"-":"")), int(($jetzt-$erstbearbeitung{$user})/86400), int(($jetzt-$letztbearbeitung{$user})/86400); print OUT "|-\n"; $k = $PunkteKat{$kat}{$user}==$PunkteKat{$kat}{$sPunkteKat[$i+1]}?$k+1:0; } print OUT "|}\n"; print OUT "|\n"; print OUT "{| cellspacing=\"0\" border=\"1\"\n"; print OUT "|-\n"; print OUT "! Pos. || Punkte || Benutzer || A\n"; print OUT "|-\n"; for($i=0, $j=0, $k=0; $i<50+$j+$k; $i++) { $user = $sPunkteAktuellKat[$i]; if($user eq "+Anon+" || defined $bot{$user}) { $j++; next; } printf OUT "| %i || %i || %s || %s\n", $i-$j-$k+1, $PunkteAktuellKat{$kat}{$user}, $user, $user, ($admin{$user}?"+":($keinAdmin{$user}?"-":"")); print OUT "|-\n"; $k = $PunkteAktuellKat{$kat}{$user}==$PunkteAktuellKat{$kat}{$sPunkteAktuellKat[$i+1]}?$k+1:0; } print OUT "|}\n"; print OUT "|}\n\n"; } close OUT; }
rmdir "sort-tmp";
- sub flushLines {
my ($lines, $n) = @_; @$lines = sort @$lines; open OUT, ">sort-tmp/$n"; print OUT $_ for @$lines; close OUT; }
sub sortExtern { my ($unsorted, $sorted) = @_; open IN, $unsorted; my $n=0; my $lines = []; while(<IN>) { push @$lines, $_; if(@$lines==500000) { flushLines($lines, $n); $lines = []; $n++; } } flushLines($lines, $n); $lines = []; $n++; close IN; unlink $unsorted;
my @in = (); my @z = (); for(my $i=0; $i<$n; $i++) { open $in[$i], "sort-tmp/$i"; my $line = readline $in[$i]; push @z, [ $line, $i ]; }
open OUT, ">$sorted"; while(@z>0) { @z = sort { $b->[0] cmp $a->[0] } @z; my $y = pop @z; print OUT $y->[0]; my $i = $y->[1]; unless(eof $in[$i]) { my $line = readline $in[$i]; push @z, [ $line, $i ]; } } close OUT;
for(my $i=0; $i<$n; $i++) { close $in[$i]; unlink "sort-tmp/$i"; } } </syntaxhighlight>