Archiv der Kategorie: Wordpress

 – Kleines Jubiläum – 

viertel-million

Gestern hatte ich die wenigsten Views seit langem, nur 7 Stück, aber die Viertelmillion insgesamt vollgemacht. Am aktuellen Rückgang ist das Ende von Google+ schuld. Als Nerd feier ich vielleicht nochmal bei 2^{18} , also 262144 Views.

 

 – Und noch mehr Rohstoff –

Morgen soll es hier schon 15°C werden. Das wird nix mehr mit meinem Winterparanoia/-depressionscomic. Nutze ich die Gelegenheit, und schimpfe über Wortpress, das mit dem jüngsten Update vor ein paar Monaten alle von mir mittels Absatz: zentriert formatierten Bilder jetzt linksbündig ausrichtet, insbesondere 5 Jahre alte Beiträge. Das alles manuell zu korrigieren, über 1500 Beiträge, würde viele Stunden Arbeit nonstop bedeuten, bei 20s/Beitrag ca. 8h.

In der Livevorschau sieht man die Bilder per default mittig ausgerichtet, so dass man es bei neuen Beiträgen auch leicht vergisst. Im jüngsten Rohstoffbeitrag lässt sich aber auch mit ausdrücklicher Formatierung des Bildes als mittig nichts erreichen – das dritte Bild erscheint linksbündig.

– WordPress Blogchart –

feininger-stats

Dieser Beitrag stützt sich auf den ersten Schritt, die verschwundene Ministatistik aus WordPress zurückzuholen bzw. Ersatz dafür zu schaffen. Ziel war es, ein kleines, grafisches Diagramm zu erzeugen, das man in das Menüpanel von XFCE4 wie es bei Xubuntu zum Einsatz kommt, integriert – mit möglichst wenig Arbeit, geringem Ressourcenverbrauch und Tools, die ich eh so rumliegen habe.

(Update: Bugfix und Erweiterung, Nachtrag)

Teilweise ist das auch gelungen.

Es gibt ein praktisches Grafikformat, XPM, bei dem man eine Textrepresentation der Grafik mit ein wenig Syntax dekoriert, und fertig ist das Bild. Wird von sehr vielen Programmen verstanden, ist prima um zu kontrollieren, ob alles an seinem Platz ist, auch aus einem Textfenster heraus, und es kann einigermaßen per Hand erzeugt werden, umso besser je kleiner es ist und je  weniger Farben man hat. Klein und schwarz/weiß sollte es eh werden – dafür könnte man auch XBM nehmen, aber das macht kaum einen Unterschied, nur dass der XBM-Eintrag bei Wikipedia nur eine Wurzel ist.

Man erinnert sich – meine Blogstatistik liegt als ~/.bloglog in solchen Daten vor:

185451 8 8 59 20:00 2017-01-10
185455 4 3 60 21:00 2017-01-10
185455 0 0 60 22:00 2017-01-10
185457 2 2 60 23:00 2017-01-10

und ich wollte die letzten 48 Stunden abbilden, also von den letzten 48 Zeilen der Datei die Spalte 2. Meine naive Idee war es, irgendein Icon in der Titelleiste von XFCE, dem Desktop von Xubuntu, einzubinden, und dieses rhythmisch mit einer selbstgemachten Grafik zu überschreiben. Im original Iconpath hat der ordinäre User keine Schreibrechte. Die Lösung ist dann nicht, sich solche Rechte einzuräumen. Als isolierte Lösung, die man nur selbst verwendet wäre das vielleicht kein Problem, aber vielleicht rollt das nächste Update die Rechte zurück (eher nicht). Oder man verbloggt die Lösung, sie greift um sich und schwupp-di-wupp ist eine Sicherheitslücke gerissen. Man kann aber einen Starter im XFCE-Menü anlegen, verknüpft ihn mit einem Programm das gar nichts macht, und ordnet diesem ein Icon zu, das man da platziert, wo man selbst Schreibrechte hat, also unter /home/saskia oder wie man gerade heißt.

Das funktionierte als Schritt eins, aber dann war Schluss mit lustig. Erst erhöhte ich die Höhe meiner Leiste von 24 auf 32 Pixel, weil 32 größer ist als 24. :) Dann machte ich aus der Kopie irgendeiner XPM-Datei eine Schwarz-Weiß-Grafik, was auch gelang, aber Änderungen an dieser wurden nicht bemerkt. Man musste die Eigenschaft des Starters aufrufen, dann, ohne was zu ändern „Speichern“ drücken, und erst dann wurde die geänderte Grafik auch verändert angezeigt.

toxic-stats

Und das zweite Ärgernis: Eine 3232 Grafik wurde schön angezeigt, aber eine 3248 Grafik nicht, wobei ich zwischenzeitlich noch in die übliche Grafikformatfalle tappte, x und y zu vertauschen – bei quadratischem Ausgangsmaterial passiert das leicht, und aus dem Matheunterricht kennt man das: erst die x-Achse, dann y. X ist ja auch im Alphabet vor Y. In der Textwelt ist es aber meist: Erst Zeile, dann Spalte – auch der Röhrenfernseher baut das Bild zeilenweise auf, so wie man einen Text schreibt. Physiker! Dann gibt es noch die Anomalie, dass der 0-Punkt oben liegt und nach unten die Werte größer werden – sehr unmathematisch das Ganze.

Also das 32*48 Pixelbild wurde schon angezeigt, aber so gestaucht, dass die 48er Breite auf 32 runtergerechnet wurde, so dass die Höhe nur noch 2/3 von 32 betrug, also ca. 20 Pixel, und da gehen natürlich manche Säulen des Säulendiagramms verloren.

blogchart

32*48

Jetzt gibt es viele Plugins, die alles mögliche in die Kopfzeile, die man auch an den Fuß des Bildschirms legen kann, malen, etwa eine CPU-Überwachung, die sogar sekündlich aktualisiert wird. Das sollte doch irgendwie gehen. Ich versuchte rauszufinden, wie solche Plugins heißen, was leider nicht so trivial ist. Die meisten tauchen in der Konfigurationsliste mit einem Namen auf, zu dem man kein Programm findet, weil die Liste übersetzt ist, während die Programmnamen englisch sind.

Dann hatte ich mit Pythonskripten gerechnet, weil allüberall die Linuxer gerne Python machen und Python ist ja auch nicht verkehrt, verglichen mit anderen P-Sprachen, wie PHP oder Perl, was auf dem Server manchmal eingesetzt wird, wobei Perl eigentlich ein Kuhdorf, 1,6km von Apach entfernt ist, und Apach ist kein Webserver, aber das führt hier zu weit. Nur wo wir dabei sind: Wer da wohnt, der sollte doch mal ein Foto machen von einem Bus vor dem Ortschild von Perl, und auf dem Bus müsste „Apach“ stehen, und man müsste es so beschneiden, dass der Betrachter glauben kann, da folge noch ein e. Oder umgekehrt vor dem Ortschild von Apach mit einem Bus nach Perl.

Zurück zum Thema: Ich fand also plugins, aber das waren .so-Dateien. Das deutet auf compilierten C- oder C++-Code hin, Sprachen, die ich zwar mal gelernt habe, aber die sind sehr systemnah, und bei Fehlern schmiert einem das halbe System ab.

Also kurz gegoogelt, und die Lösung rasch fast auf dem Präsentierteller bekommen: Das XFCE4-Genmon-Plugin. Mon für montags… – für monitoring, und gen für generisch. Eine Anleitung gefunden, auch hier wieder gesucht, wie das Teil auf deutsch heißt, ob es vielleicht schon unbemerkt installiert ist (ist es nicht), installiert sowie auch ein paar fertige Beispielexemplare, die ich dann aber gar nicht angeschaut habe, Befehl dazu:

apt-get install xfce4-genmon-plugin xfce4-goodies

Da haben sich gleich verschiedene Lösungen angeboten. Ich dachte, eine kl. Grafik, 32×48 will ich und etwas Text, nämlich den Maximalwert der letzten 48 Stunden und den letzten Messwert, der, da am Rand, oft schlecht zu sehen ist, und im Falle eines Ausreißers mit sagen wir 200 Abrufen, da werden die Striche so klein, dass man schlecht noch abschätzen kann, ob das jetzt 10 oder 20 Abrufe waren, und müsste 48 Stunden warten, bis der Peak ausgewandert ist.

Man braucht einfach nur ein Script zu schreiben, das eine XML-Datei erzeugt, und diese verweist auf eine Grafik, die entsprechend der Einstellungen aktualisiert wird. Mein Script nannte ich blogchart.sh und legte erst 3s fest, um schnell zu sehen, ob sich was tut, dann später 30s, damit ich Zeit hatte, die vom Script erzeugte Grafik noch zu sichern, bevor der nächste Lauf sie überschreibt, und am Ende 3600s, weil das eine Stunde ist, und sich so oft mein .bloglog ändert.

  • Befehl: blogchart.sh
  • [ ] Beschriftung:
  • Intervall(s): 3600
#!/bin/bash
#
#
# Erweiterung wird unten wechselnd angehängt (xpm/png) 
img=/home/stefan/.blogchart
# Bei mehr oder weniger als 48 Stunden hier anpassen (aber auch in der Funktion asciiart):
views=($(tail -n 48 ~/.bloglog | awk '{print $2}' | column -x))
# Debug:
# views=(5 4 10 8 6 6 5 4 4 3 5 0)

Der Bildnamensvorname mit Pfad taucht öfter auf, also legt man eine Variable an, um es später kurz zu haben.

Views nimmt die letzten 48 Zeilen aus ~/.bloglog und awk filtert daraus die die 2. Spalte. Das ganze wird von column dann in eine Serie von Werten nebeneinander gestellt, statt in 48 Zeilen, was beim Debugging störend ist. Die runden Klammern mit dem $ sorgen dafür, dass die Ausgabe des Befehls ausgewertet werden kann, und die runden Klammern darum wieder, machen aus den Werten ein Array, so wie zwei Zeilen tiefer zu sehen, nur dass es da nicht 48 sind. Es ist auch störend, wenn man was berechnet hat beim Debuggen und sich an Werte gewöhnt hat, und dann sind 60 Minuten um und man hat ganz andere Werte.

max () {
 maximum=0
 for view 
 do
   test $view -gt $maximum && maximum=$view
 done
 echo $maximum 
}
m=$(max ${views[@]})
# Avoid Div/0:
test $m -eq 0 && m=1

Jetzt brauchen wir das Maximum und – man glaubt es nicht – die Bash hat keine fertige Maximumsfunktion! Gut – so oft braucht man die auch nicht; ich habe nämlich auch keine.

Diese Form der For-Loop ist etwas überraschend. Normal sieht man sowas wie:

  • for obst in apfel birne banane
  • for i in 3 4 7
  • for (( x=0;  x<10; x+=1 ))

aber hier – woher? Nun, von den Funktionsparametern bzw. hier dem Array, das ich oben definiert habe und mit dem ich die Funktion aufrufe, also den Abrufzahlen pro Stunde.

Für die Debugwerte sollte das 10 ergeben und tut es auch. max ${views[@]} ist der Funktionsaufruf mit dem kompletten Array (@), m=$(…) die Zuweisung der Ausgabe (deswegen echo) an die neue Variable m. Bitte keine Backticks verwenden!

Den Maximalwert brauchen wir aus zwei Gründen: Einmal um ihn anzuzeigen, einmal um die Messwerte so zu strecken, dass der Maximalwert genau die volle Höhe einnimmt, und die anderen Werte werden dann so umgerechnet, dass diese proportional dazu kleiner sind, bis auf Rundungsfehler.

Das macht meine Funktion auf32:

auf32 () {
 m=$1
 shift
 # echo Parameter: $#
 # Bei anderer Imagehöhe als 32 hier anpassen: 
 for hour
 do
   echo -n $((hour*32/m))" "
 done
 echo 
}

normalized=$(auf32 $m ${views[*]})

Klein m ist der Maximalwert, den ich als ersten Parameter der Funktion übergebe und da auch genauso benenne. Man könnte auch von der inneren Funktion auf die äußere, bereits definierte Variable zugreifen, aber globale Variablen sind bekanntlich von Übel. Das shift schiebt alle Parameter um eins nach vorne, hat man den ersten noch nicht ergriffen ist er jetzt endgültig weg. Jetzt ist also der m-Wert fort und nur noch das Array bildet die Parameter.

Was ich eben noch view nannte, und in der Einzahl kein guter Name ist, aber views war schon belegt, nenne ich hier hour. Gemeint sind die views per hour, also 5, 4, 10 nach den Testwerten. Mit $((…)) kann man in der Bash etwas Ganzzahlarithmetik betreiben. Mathematiker vorsicht! hour32/m ist hier nicht das gleiche wie hour/m32. Hour ist maximal so groß wie m, viele Werte sind kleiner. 10/10 ist also 1, alle anderen Werte sind kleiner/gleich 1 aber größer/gleich 0, wenn kein Fehler aufgetreten ist, und werden zu 0 abgeschnitten. Nicht gerundet – abgeschnitten. 0,99 wird 0. Und das kann man gerne mit 32 multiplizieren, das bleibt 0. Aber multipliziert man zuerst, dann wird aus 5, 4, 10 – ähm, (128+32=160), 128, 320. Das jeweils durch 10 sind 16, 12, 32. So soll das sein. Wer unbedingt runden will addiert zwischendrin 5, also (hour*32+5)/m, Punkt vor Strich akzeptiert die Shell, ansonsten von links nach rechts.

Außer m wäre Null, das könnte bei schlechtbesuchten Blogs ja in 48 Stunden mal vorkommen, daher oben die Sicherung für Div/0-Fehler.

Das echo -n unterdrückt die neue Zeile nach echo, die Leerstelle muss sein, damit die Werte nicht aneinanderkleben (161232). Das Ergebnis speichere ich in normalized. Diesmal benutze ich den * für das ganze Array:

${views[*]}

nicht das @, wieso weiß ich nicht, eine Laune, hier macht es keinen Unterschied. Wo macht es einen Unterschied? Ich glaube bei Strings mit Leerstellen:

t201:~/bin > namen=(a "b b" ccc)
t201:~/bin > for s in "${namen[@]}"; do echo $s"-"; done 
a-
b b-
ccc-
t201:~/bin > for s in "${namen[*]}"; do echo $s"-"; done 
a b b ccc-

Macht das Sinn? Nein. Kann man sich das merken? Nein. Man kann es nur rasch ausprobieren, dann weiß man es wieder. Oder man benutzt es so oft, dass man es automatisch lernt. Sich hinsetzen und sowas lernen, ohne es sicher zu brauchen, da vermüllt man sich das Hirn. Das Bashmanual kann man auch nicht lesen – es ist zu lang, und da gibt es noch mehr solcher Merkwürdigkeiten, etwa 3 unterschiedliche ifs.

In normalized steht jetzt also (16 12 32 …). Prima. Wir kommen zur letzten Funktion, dem 2.letzten Block und 3.letzten Thema. Wir lassen nämlich das XML der Funktion erst weg und konzentrieren uns aufs grafisch/mathematische.

asciiart () {
 # Und hier Bildhöhe anpassen, Pixelzahl
 for row in {32..1}
 do
   echo -n '"'
   for traffic in ${normalized[@]}
   do
     test $traffic -ge $row && echo -ne "* " || echo -ne "  " # 2 Leerzeichen
   done
   echo '",'
 done
}

Hier wurde ich der Devise mit den globalen Variablen untreu, wie mir gerade auffällt (normalized) aber der Reihe nach. {32..1} erzeugt einfach eine Serie Zahlen von 32 bis 1 und merkt von selbst, dass es rückwärts geht, also 32 31 30 29 … 3 2 1 wird hier erzeugt. Für jede Zeile der Asciiartdatei gebe ich Gänsefüßchen aus. Und dann laufe ich durch meine normalisierten Werte und schaue, ob sie größer oder gleich der Zeilenzahl sind. Wenn ja gebe ich ein „* “ aus, sonst “  “ (2 Leerzeichen). Statt -ne müsste bei echo eigentlich -n reichen – e ist für extended characters oder sowas. Und nach jeder Zeile Gänsefüßchen zu, und Komma.

Jetzt müssen wir uns das XPM-Format genau ansehen. Es gibt einige Freiheiten, die man selbst nachschlagen kann. Ich erkläre nur das nötigste.

Es muss mit diesem XPM in einem C-artigen Kommentar beginnen (s.u.). Anfangs hatte ich darum aus Nachlässigkeit auch Gänsefüßchen – ein schwer zu findender Fehler! Dann eine C-style Stringdefinition. Muss man nicht kennen, kann man Zeichen für Zeichen übernehmen. Dann kommt, in Gänsefüßchen, Breite, Höhe (4832), Zeichenlänge pro Pixel (2) und Anzahl der Farben (2). Als Zeichenlänge würde 1 natürlich genügen für 0 oder 1, schwarz oder weiß, aber da die Schriftzeichen bei Bildschirmschrift ca. doppelt so hoch wie breit sind wirkt dann alles gestreckt. 2 ist also auch für uns nicht verkehrt. Unser Hintergrund soll weiß sein, das ist „. „-codiert (“  „, die Balken schwarz, dafür nehme ich ein „M “ („ „, das ziemlich viele Pixel bedeckt. Keine schlechte Idee, außer um darüber bei WordPress zu berichten, welches mehrere Leerzeichen in Folge eindampft – in Wirklichkeit habe ich zwei Leerzeichen und ein Sternchen benutzt aber das ist normalerweise ziemlich wumpe. Man hätte auch zwei M verwenden können – immerhin haben wir gesagt, Zeichenlänge 2, das ergibt bei 80 legalen Zeichen (a-zA-Z0-9 und einigen Sonderzeichen) 80*80 darstellbare Farben. Eine Darstellungsoption ist die bekannte Hexcodierung #(rr)(gg)(bb) für die rot/grün/blau-Werte von 00 über 99 bis ff. Das kleine M in den zwei Farbkodierungen steht für monochrom aber auch c sollte hier funktionieren für color.

Wie Sie sehen sehen Sie nichts. Ja doch, aber nicht 48 Spalten und 32 Zeilen – ich habe es gekürzt, der Übersichts halber, und zähle jetzt nicht nach, wie breit und hoch das Bild wirklich ist. Nach dem 5zeiligen Header folgen dann die Bildpunkte als Text. Übrigens wurde ja schon angedeutet, dass vielfarbige XPMs gibt und das System mit einigen schon ankommt. Oft wird die Zeichenkodierung so gewählt, dass Buchstaben mit vielen Pixeln auch entsprechend dunklen Farbwerten zugeordnet sind, bzw. man erzeugt die  Grafikdateien programmatisch. So kann man sich einige ansehen:

cat $(locate er.xpm) | less

aber das nur am Rande. XPMEXT bedeutet, dass es XPM-Extensions am Ende der Datei gibt, die muss man deklarieren, wie Kippen beim Zoll, wenn man sie nutzen will.

 

/* XPM */
static char *XPM_example[] = {
"48 32 2 2 XPMEXT",
". m #ffffff",
"M m #000000",
". . . . . . . . . M . . . . . . ",
". . . . . . . . . M . . . . . . ",
". . . . . . . . . M . M . . . . ",
". . . . . . . . . M . M . . . . ",
". . . M . . . . . M . M . . . . ",
". . . M . . . . . M . M . . . . ",
". . . M . . . . . M . M . . . . ",
". . . M . . . . . M . M . . . . ",
". . M M . . . . . M . M . . M . ",
". . M M M . . . . M . M M . M . ",
". . M M M . M M . M . M M M M . ",
". . M M M . M M . M . M M M M . ",
". . M M M M M M . M . M M M M . ", 
"XPMEXT author demystifikation.wordpress.com GPLv3",
"XPMENDEXT"
};

Jetzt sehen wir auch die Extensions. Wie man sieht überflüssiger Kokolores, aber er ist aus einem Grund praktisch. Später dazu.

Hier der Code im ganzen, der das XML erzeugt:

asciiart () {
 echo -e '/* XPM */'
 echo -e 'static char *XPM_example[] = {'
 # Erste Zahl ist Breite, zweite ist Höhe, also 48 32 für 2 Tage bei 32 Pixeln, sonst hier anpassen
 echo -e '"48 32 2 2 XPMEXT",'
 echo -e '"  m #ffffff",'
 echo -e '"* m #000000",'
 # Und hier Bildhöhe anpassen, Pixelzahl
 for row in {32..1}
 do
   echo -n '"'
   for traffic in ${normalized[@]}
   do
     test $traffic -ge $row && echo -ne "* " || echo -ne "  " # 2 Blanks!
   done
   echo '",'
 done
 echo '"XPMEXT author demystifikation.worpress.com GPLv3",'
 echo '"XPMENDEXT"'
 echo '};'
}

Oben Ausgabe des Headers, dann die besprochenen For-Loops, dann die extension die auch explizit und so beendet werden muss. Das Problem hier wäre, dass man ohne Extension nach dem letzen Anführungszeichen kein Komma braucht, um gültigen C-Code zu erzeugen, ja dass ein abschließendes Komma vor der geschweiften Klammer-Zu im XPM ungültig wäre. Das könnte man mit einer if-Abfrage abfangen, aber eine Abfrage, die 32x geprüft wird, um nur 1x anzuschlagen – das ist irgendwie eklig. Eigentlich nicht schlimm – der Prozessor rechnet das gerne und als es ins Gewicht fiel habe ich noch nicht gelebt, aber ich kann nicht anders. Es ist zusätzliche Komplexität, und Komplexität ist von Übel. Man kann nicht jede Komlexität vermeiden und sollte auch nicht, so einfach ist es auch nicht. Nein, es ist selbst wiederum komplex. Also wenn so eine Extension noch nachkommt, dann schadet das Komma nicht in der Loop sondern ist sogar nötig, und dafür lassen wir es in der letzten Zeile ganz unauffällig weg, ohne ein if zu benötigen.

Dennoch baut man ja bei solchen Strings, die man ausgibt, und die selbst der Maskierung bedürfen (Apostrophe) und Syntax klammern, die in Sonderfällen und Ausnahmen und Ausnahmen von den Ausnahmen – kurz und gut, mein Ergebnis war erst schrottig, dann wollten manche Programme das XPM anzeigen, andere nicht, dann war es ganz schrottig, dann wieder besser und man sucht sich einen Wolf. Man sollte mal einen XPM-Validator schreiben, denn ich habe zwischendurch einen gesucht, aber im Netz keinen gefunden.

Gimp wollte meine XPM-Files nicht öffnen, display, identify und andere Tools aus ImageMagick schon, der EOG-Viewer nicht aber Ristretto oder war es umgekehrt? Xpmtoppm hat auch nicht geklagt aber die, die rumgezickt haben, haben meist nicht verraten an welcher Stelle in der Datei sie stolpern. Einmal hieß es „zu wenig Pixeldata“ aber das war falsch. :)

Aber statt Testcases zu schreiben kann man auch über die Entwicklung bloggen. Da denkt man ja schneller, als man schreiben kann, und hat dann pro Satz ½ Satz Zeit, sich mit dem Inhalt zu befassen, über den man eigentlich gerne schnell wegginge, und in diesen Pausen findet man dann die Fehler. 3 Stück habe ich gefunden. Ich sollte gleich ein Buch schreiben und Seminare anbieten, BDD, blog-driven-development, der neue, heiße Scheiß!

Aber vorher binden wir noch Zutaten zu einem Menü zusammen, husch, husch!

# echo ${views[@]}
# echo $m
# echo ${normalized[*]}

asciiart > $img.xpm
# convert $img.xpm $img.png 
# n=${#views[*]}
# echo "<txt>Max: $m Last: ${views[n-1]}</txt>"
# übler hack, hier auf row aus der Schleife der Funktion zuzugreifen. 
echo "<txt>Max: $m Last: $row</txt>"
# echo "<img>$img.png</img>"
echo "<img>$img.xpm</img>"
echo "<tool>views: ${views[@]} normalized: ${normalized[@]} </tool>"

Ein paar auskommentierte Debugmeldungen, dann der große Moment, Aufruf von asciiart, Ausgabe der XPM-Datei nach $img.xpm. Zwischenzeitlich habe ich, weil das Menü mein xpm nicht fressen wollte, dieses mit convert, das mehr gierig als pedantisch ist, in png gewandelt, und das dann angezeigt. Jetzt , dank gefundener Fehler, geht auch xpm. Weitere Debugmeldungen, auskommentiert. Dann geht es weiter mit XML, wie es GenMon erwartet. Txt ist Text, der ausgegeben wird, im Bild unten Max: 24 Last: 11. Kommt auch von den Säulenhöhen hin. Dann mit img die eben erzeugte xpm-Datei, also der Pfad/Name dahin. Dann ein optionaler Tooltiptext. Auch mehr zu Debugzwecken.

blogchart

Zusätzlich kann man noch definieren, was bei Klick auf die Grafik passieren soll und was bei Click auf den Text (<click>, <txtclick>) und eine Progressbar kann es geben, mehr dazu beim Genmon-Link unten. Ich könnte noch die aktuelle Zahl vom Blogcounter abholen, für zwischen den vollen Stunden bei click hier, und bei click da die Grafik mit convert größer skalieren und mit display anzeigen.

Update 1: Eine vergrößerte Ansicht habe ich jetzt realisiert, und zwar mit ohne convert, das macht display  (auch im Paket ImageMagick, falls ich das noch nicht geschrieben habe) alleine, durch die Codezeile:

echo "<click>display -resize 480x320 $img.xpm</click>"

Das war ja einfach.

Und ein Hinweis noch: Zum Synchronisieren des Plugins mit der Abfrage der Werte durch cron, bei mir immer zur vollen Stunde, kann man in der Kommandozeile ein at-Kommando absetzen (at, wie das englische at in at 2pm oder at teatime), gibt man, z.B. für die 17:00 Uhr-Abfrage, das Kommando:

at 17:02
xfce4-panel --plugin-event=genmon-X:refresh:bool:true
(Ctrl-D)

ein. Statt X müsst Ihr einen Wert eingeben; wo der herkommt steht auf der genmon-Seite die unten verlinkt ist.

(end of update)

Aber irgendwo ist auch noch der Wurm drinnen. Der Maximalwert stimmt, aber das Log stimmt nicht mit den Werten überein, die aber unverdächtig wirken. Das werde ich noch suchen, wenn es nicht vorher ein Leser findet und im Kommentar erklärt. Sonst Updates hier, eher kein neuer Beitrag.  Schreibt einen Kommentar, wenn Ihr drauf wartet. 

Update 2: Dem column-Programm muss man den Schalter -x übergeben, sonst formatiert es die Zahlen 1 2 3 4 5, jeweils in einer Zeile übergeben, so:

1 4
2 5
3

statt so:

1 2
3 4
5

(end of update)

Und noch 2 Worte zu bekannten Schwächen: Wenn man den Rechner ausschaltet, dann legt er keine Messung an. Beim Anschalten haben sich dann vielleicht viele Visits angesammelt, aber auch über viele Stunden verteilt. Ich habe beschlossen die Zeit, obwohl sie mitprotokolliert wird, nicht zu berücksichtigen. Man könnte damit dann zwar einen breiten Block anlegen, und die Abrufe darauf verteilen, also nach 15 Stunden und 150 Aufrufen würde man einfach das Mittel nehmen, 10 pro Stunde. Das würde das Programm aber sehr aufblähen und kompliziert machen. Das Programm zeigt also in Wahrheit die letzten 48 Messpunkte an, nicht 48 Stunden.

Generell habe ich mir wenig Gedanken gemacht, was alles schief gehen kann, und wie man dann die Situation am besten rettet. Da das Programm noch ganz frisch ist, sollte sich das im Laufe der Zeit von selbst ergeben.

Und bedanken muss ich mich bei den Entwicklern von GenMon. Das ist ja ein superflexibles Tool und einfach zu verwenden. Die Doku könnte noch ausführlicher sein, aber der erste Eindruck ist Klasse!

Hilfreiche Links:

Nachtrag:

Jetzt, wo ich meine eigene Lösung fertig habe, finde ich den neuen Ort, an dem WordPress die Ministatistik versteckt hat!

Und zwar wenn man den Blog in der Leseansicht offen hat, nicht im Bearbeitenmodus ist, und dann links oben „Meine Webseite“ klickt, dann klappt das Seitenmenü auf, und oben steht „Statistik“, daneben ein Balkendiagramm. Das ist nicht nur eine Erinnerungsgrafik für die, die vergessen haben, wie eine Statistik aussieht, sondern das sind die aktuellen Werte d. letzten 48 Stunden. Um das zu erkennen muss man freilich die aktuellen Werte kennen – gut, das war früher auch so. Auch dass es als Schaltfläche diente, um zur Statistikseite zu kommen. Ein Maximalwert zur Orientierung fehlt jetzt, aber wenn man die Zahl des letzten Tages kennt, kann man es wohl ungefähr abschätzen. Meine Lösung hat den Vorteil die Werte anzubieten, und immer sichtbar zu sein, aber den Nachteil Platz im Menü zu fressen. Ein anderer Vorteil für mich: Ich weiß jetzt wie es geht, wenn ich nochmal etwas derartiges brauche.

wp-statistik

Wie rechts nochmal zu sehen ist, mit anderer Proportion, sind das die gleichen Daten. Das hätte einem aber auch wer sagen können!

Und hier noch der Code als kompletter Block, ohne Gewähr:

#!/bin/bash
#
# (C) GPLv3, user unknown
#
# Erweiterung wird unten wechselnd angehängt (xpm/png) 
img=/home/stefan/.blogchart
# Bei mehr oder weniger als 48 Stunden hier anpassen (aber auch in der Funktion asciiart):
views=($(tail -n 48 ~/.bloglog | awk '{print $2}' | column -x))
# Debug:
# views=(5 4 10 8 6 6 5 4 4 3 5 0)
#
max () {
 maximum=0
 for view 
 do
   test $view -gt $maximum && maximum=$view
 done
 echo $maximum 
}

m=$(max ${views[@]})
# Avoid Div/0:
test $m -eq 0 && m=1

auf32 () {
 m=$1
 shift
 # echo Parameter: $#
 # Bei anderer Imagehöhe als 32 hier anpassen: 
 for hour
 do
   echo -n $((hour*32/m))" "
 done
 echo 
}

normalized=$(auf32 $m ${views[*]})

asciiart () {
 echo -e '/* XPM */'
 echo -e 'static char *XPM_example[] = {'
 # Erste Zahl ist Breite, zweite ist Höhe, also 48 32 für 2 Tage bei 32 Pixeln, sonst hier anpassen
 echo -e '"48 32 2 2 XPMEXT",'
 echo -e '"  m #ffffff",'
 echo -e '"* m #000000",'
 # Und hier Bildhöhe anpassen, Pixelzahl
 for row in {32..1}
 do
   echo -n '"'
   for traffic in ${normalized[@]}
   do
     test $traffic -ge $row && echo -ne "* " || echo -ne "  " 
   done
   echo '",'
 done
 echo '"XPMEXT author demystifikation.worpress.com GPLv3",'
 echo '"XPMENDEXT"'
 echo '};'
}

# echo ${views[@]}
# echo $m
# echo ${normalized[*]}

asciiart > $img.xpm
# convert $img.xpm $img.png 
# n=${#views[*]}
# echo "<txt>Max: $m Last: ${views[n-1]}</txt>"
# übler hack, hier auf row aus der Schleife der Funktion zuzugreifen. 
echo "<txt>Max: $m Last: $row</txt>"
# echo "<img>$img.png</img>"
echo "<img>$img.xpm</img>"
echo "<tool>views: ${views[@]} normalized: ${normalized[@]} </tool>"
echo "<click>display -resize 480x320 $img.xpm</click>"

 – Inventur 2016 – 

wp-tendenz

Die Besucherzahlen gingen erstmalig zurück. und lagen etwa in der Mitte zwischen den zwei besten und zugleich letzten Jahren.

 

bildschirmfoto_2016-12-31_18-08-34

Ursache dafür war vor allem der Postillion, der nicht mehr zulässt, dass ich in Kommentaren zu seinem Artikel auf meine Beiträge verlinke. Bis etwa April habe ich davon alle paar Tage mal Gebrauch gemacht, und das hatte mir immer viele Besucher auf einen Schwung gebracht.

top-ten-laender-15-16

Im Länderwettlauf zog die USA an der Schweiz vorbei, Frankreich machte 2 Plätze gut, Spanien gleich 4, aber die Top-10 von 2015 machten es unter sich aus.

Bis vor wenigen Wochen ging die alte Statistik  noch, mit einigen Vor- und manchen Nachteilen. Eine Auflistung die ich sehr vermisse ist die Gesamtstatistik über die gesamte Zeit.

Weiterlesen

– Blogfüllerstreik – 

blogfuellerstreikNach diesem aufreibenden DMD trete ich jetzt in einen Streik, wie die GDB, die Gewerkschaft der Blogfüller, empfiehlt.

Also zumindest von 11:00 bis 14:00 Uhr, oder sagen wir 11:30 bis 13:30 Uhr wird es heute keine weiteren Beiträge geben.

Poststreik

poststreikNicht speziell zu diesem Cartoon:

Wenn man mit der WordPresssuche nach Begriffen sucht, die man als Schlagworte vergeben hat, findet WordPress nix, wenn das Wort nicht auch im Text des Beitrags vorkommt – ein arges Handicap für Bildlastige Produkte.  Weiterlesen