Ich wollte nur [...] und dann ist das Universum explodiert.

Projects
Books
Archive
About









    Permalink
  1. Statistiken | Using R – The Nerd Way

    Momentan interessiere ich mich für R. Die Programmiersprache für Statistiken genießt aktuell ziemliche Popularität.

    Persönlich habe ich (in der kurzen Zeit, seitdem ich es benutze und kenne) R als eine Sprache kennengelernt, die nur begrenzt für coole Sachen benutzt wird. Kann an meiner Deklaration von “cool” liegen oder das sich die coolen Sachen bisher meiner Kenntnis entzogen. Aber mal davon abgesehen dass Statistiken immer interessant sind, wird R anscheinend meistens von irgendwelchen Sales-Druiden oder Marketing-Dudes verwendet, die Daten aus der DB ihres Online-Shops kratzen lassen um festzustellen wie viele Rosa Einhörner letzten Monat verkauft worden sind.

    Nunja, sagen wirs so. Ich hab überlegt für was ich R nutzen würde und etwas damit gespielt. Prinzipiell ist die vorgehensweise sehr einfach. Ich hab irgendwo ein LogFile o.ä. rumliegen (sozusagen die Rohdaten) und bringe diese mit ein bisschen Bash/Shell Zauber in ein Format welches ich R vorschmeissen kann. R unterstützt… naja so ziemlich alles, was einen halbwegs anständigen Delimiter vorweisen kann.

    R arbeitet in diesem Fall mit einer Interaktiven Shell, die die Eingaben interpretiert.
    ( $: Bash Shell. >: R Shell)

    Tweetstatistik meiner Timeline analysieren (via twidge)

    # Letzte 200 Tweets ausgeben
    $ twidge lsrecent --all > tweets
    # Usernamen sortieren und Tweets zählen
    $ grep '^<' tweets | awk '{print $1}' | sort | uniq -c | sort -rn
    # In R Shell wechseln
    $ R
    # Twitter Timeline einlesen
    > twittertimeline <- read.table("twitter/tweets", head=T, sep="" )
    # Kuchenansicht erstellen
    > pie(twittertimeline$Tweets, label=twittertimeline$User)

    An dieser Stelle kann es passieren, dass es bei zu vielen Daten wirklich sehr unübersichtlich wird. Was genau ich da falsch mache ist mir allerdings etwas schleierhaft. An der Skalierung lässt sich sicher noch arbeiten. Aber mit einem kleineren Satz von Daten, sieht es schon besser aus.
    # 20 meisten Twitterer heraussuchen
    $ grep '^<' tweets | awk '{print $1}' | sort | uniq -c | sort -n | tail -20 > tweets-20
    # Einlesen
    > twittertimeline20 <- read.table("twitter/tweets-20", head=T, sep="")
    # Balkendiagram erstellen
    > barplot(as.matrix(twittertimeline20$Tweets), main="Timeline", ylab="Tweets", xlab="Users", beside=TRUE, col=rainbow(20))

    Und damit das ganze auch was aussagt, kann man sogar eine kleine Legende anfügen.

    > legend( 1, 60,twittertimeline20$User, cex=0.6, fill=rainbow(20))

    History der Bash visualisieren
    Wer auf Kuchen steht, kann auch eifnach mal seine Bash History einlesen.
    # Command sortieren und zählen
    $ history | awk '{print $4}' | sort | uniq -c | sort -rn | head > sys/history
    Used Command
    1106 ls
    889 vim
    490 cd
    423 git
    116 screen
    116 rm
    81 ./tismc.bash
    76 ps
    75 less
    72 ./coming-home.bash
    # Das generierte File in R einlesen
    > history <- read.table("sys/history", head=T, sep="")
    # Aus dem Object history ein neues Object für Labels erstellen
    # in denen die prozentualen Werte der Commands stehen
    > history_labels <- paste(history$Command , " " , round(history$Used/sum(history$Used) * 100, 1) , "%", sep="")
    # Object und Labels zu einem Kuchendiagramm formen
    > pie(history$Used, main="Commands", label=history_labels, cex=0.8)
     

    Mailadressen aus mail.log
    Um noch ein 3. mal den Anwendungsbereich zu wechseln, kann man damit auch wunderbar das mail.log seines Mailservers unter die Lupe nehmen.

    > mailaddresses <- read.table("mail/mail_addresses", head=T, sep="")
    > pie(mailaddresses$Mails, main="Mail Adressen", col=rainbow(length(mailaddresses$Address) ), label=mailaddresses$Address)

    Egal, mein BWL Lehrer sagte immer: Traue nie einer Statistik, die du nicht selbst gefälscht hast.


  2. Permalink
  3. Bash | mailrequest

    Mal wieder was aus der “Faule Sysadmins” und “wie mache ich mir _noch_ weniger arbeit”-Sparte. Desöfteren rufen Kunden an die Probleme mit ihrem Mailkonto haben. Meistens drehen sich die Probleme um die selben Themen. Angeblich nicht versandte Mails, Login-Probleme oder um Postfachgrössen, die zu klein, zu voll oder gross sind.

    Where's my mail?

    Die Prozedur ist immer die gleiche. Logfiles untersuchen. Quota ausfindig machen. Mail nachverfolgen. Je nach User individueller Mailserver. Für die grobe Arbeit, hab ich mir jetzt ein kleines Skript geschrieben, mit welchem ich (easy-usage-like ;D) mir ca 5-6 Befehle spare. Ich nannte es mailrequest. Die Kreativität hat mich nämlich einfach überrannt -_-

    Das ganze läuft jetzt wie folgt ab.

    mailrequest -s stichwort
    #Nach Queue-id, Absender, Empfaenger im aktuellen Logfile suchen.

    mailrequest -r stichwort
    #Für alle Logfiles am Mailserver

    mailrequest -q user@foobar.de
    #Postfachgroesse ermitteln

    Bis dahin hat der Plan ganz gut geklappt. Nur die Auswahl spezieller Mailserver war mir noch nicht schön genug geregelt. Mailserver jedesmal per Parameter mit übergeben müssen? Fand ich zu doof. Aber Hard-Coded im Source ist fast noch ungünstiger gewesen. Den Mittelweg hat mir die Bash ermöglicht.

    $host=$3
    $defaulthost=mail.domain.de
    ${host:-$defaulthost}

    Klartext: Wenn kein 3. Parameter definiert (oder leer) ist, wird automatisch der $defaulthost gewählt. Sollte der Mailserver nun vom Standard abweichen, kann ich ihn mitgeben. Falls nicht, kann ich mir den 3. Parameter des Aufrufs sparen.

    mailrequest -s spam@zwetschge.org mail.zwetschge.org

    Das ganze Script zum begutachten, Kritik äußern, anflamen, besserwissen: http://zwetschge.org/paste/013

    Um es wie der Typ aus der Congstar-Werbung zu sagen: “I like”.


  4. Permalink
  5. Mail | Evolution und sein K.O.-Kriterium

    Vor längerer Zeit suchte ich mir einen neuen Mail-Client. Mein Thunderbird 2.XY (ich kann mich wirklich nicht mehr an den genauen Release in Xubuntu 9.10 erinnern) hat desöfteren zicken gemacht. Meine drei E-Mail-Konten werden allesamt von Thunderbird sortiert. Da dies IMAP-Postfächer sind, überträgt sich die Verschiebung von Mails auch auf meine anderen 3 Mail-Clients. Unter anderem Mail von Apple am Macbook, iPhone Mail und Xubuntu Thunderbird zuhause. So muss ich nur einen Regelsatz pflegen und hab trotzdem überall geordnete Mails.


    evo-logo3

    Nun der Single-Point-of-Failure (oder auch Arbeits-PC) der 24 Std in Betrieb ist und Mails sortiert, hängt sich ständig auf, stürzt ab oder ignoriert willkürlich Filter. Gerade als ich 4 Wochen nicht in der Arbeit und teils auch in den USA war, war es sehr ungünstig nach 3 Tagen festzustellen das im Posteingang 600 unsortierte Mails liegen. Ein Umstieg stand an. Habe mich für Evolution entschieden und fand das auch im ersten Moment sehr sehr schön gemacht. Es gibt nur einen riesen Nachteil. Es ist nicht möglich, dass eintreffende Mails automatisch sortiert werden.

    Auch der Lösungsansatz von http://ubuntuforums.org/showthread.php?t=99930 konnte mir nicht helfen.

    Jedesmal STRG + Y zu drücken kommt absolut nicht in Frage. Das funktioniert auch nicht, da ich nicht rund um die Uhr in der Arbeit bin. Später habe ich versucht dieses Event irgendwie über CronJob aus dem Source-Code starten zu lassen. Ohne Erfolg.

    Ich muss wirklich sagen, schöne Arbeit Evolution. Würde dieses tolle Mailprogramm auch sehr gerne weiterhin benutzen. Aber unter diesen Umständen auf keinen Fall. Schade, dass wirklich schöne Software immer an irgendwelchen Kleinigkeiten scheitern. Was keinen Vorwurf gegenüber der Software selbst darstellt. Eher ein kleines Makel was für einzelne User wichtig wäre. So bin ich nun zu Thunderbird 3.0 migriert und liege Nachts wach, aus Angst morgens von Mails überrollt zu werden ;)


  6. Permalink
  7. Mail | Postfix-Aliases mit MySQL-Backend erstellen

    Ich registrierte mich vor kurzem wiedermal bei einem etwas zwielichtigem Portal. Keine begründete Behauptung, es schien mir aber trotz allem so vorzukommen. Wie üblich loggte ich mich in meinen PHPMyAdmin ein und erstellte (um SpamEmails vorzubeugen) mithilfe meines MySQL-Backends von Postfix einen Alias. In einer Tabelle gesammelt liegen sämtliche aliase und deren Empfänger-Postfach.

    address | goto
    ubuntu@zwetschge.org | mail@zwetschge.org
    spam2@zwetschge.org | mail@zwetschge.org
    spam3@zwetschge.org | mail@zwetschge.org
    spam4@zwetschge.org | mail@zwetschge.org

    Es mag jetzt mit Sicherheit User geben die MySQL mit Postfix für unnötig halten, da die Steuerung über ConfigFiles ausreicht. Auf kurz oder lang gefällt mir die MySQL einfach besser. Einfach zuhandhaben. Flexibel. Schön. Das ständige eingelogge in HTpasswd, phpmyadmin-login und herumgeklicke war mir grad nur etwas zu blöd. Ich wollte ein kleines Skript basteln das mir das adden von Aliasen per CLI ermöglicht. In etwa so:

    aliasadd <alias> <recepient>

    Via echo lässt sich mysql (nach Authentifizierung) einen Befehl übergeben:

    echo "use maildb; insert into aliases values ('$1', '$2');" | mysql -u <user> --password=<pass>

    Damit wäre auch schon das gröbste geschafft. Zumindest das Einfügen. Ein Skript zeichnet allerdings mehr aus als nur die Aufgabe die es erledigen soll. Ein Skript muss zuverlässlich sicherstellen das die Aufgabe ausgeführt wurde und dies dem Benutzer nach Möglichkeit auch noch mitteilen.

    echo "use maildb; select * from aliases where address = '$1';" | mysql -u <user> --password=<pass>

    Die vorherige Zeile sieht eigentlich nur nach ob der eingegeben Alias wirklich in der Datenbank vorkommt. Freilich(wer findet ‘freilich’ eigentlich noch seltsam in Sätzen?) könnte ich jetzt noch nach Rückgabewerten mit $? Abfragen und ähnliche if-Vorraussetzungen einbauen. Aber für die 4-5 mal im Monat in denen ich es benutze wäre das übertrieben.

    Fertig sieht das ganze dann wie folgt aus:

    #!/bin/bash
    echo "use maildb; insert into aliases values ('$1', '$2');" | mysql -u <user> --password=<pass>
    echo "use maildb; select * from aliases where address = '$1';" | mysql -u <user> --password=<pass>

    Bildschirmfoto 2010-01-09 um 12.12.35

    nochmal als Plaintext:
    http://zwetschge.org/paste/6


  8. Permalink
  9. Mail | via Telnet persöhnlich abliefern

    Als ich vor kurzem meine Anmeldung zur Abschlussprüfung über die Post abgeschicken wollte, hab ich beim eintragen der Adresse gemerkt das die IHK nur 2 Häuser neben der Post ist bei der ich den Brief aufgeben wollte =) Also hab ich den Brief kurzerhand selbst zur IHK gebracht.
    So ähnlich funktioniert das auch mit E-Mails.

    Via Telnet-Verbindung zum Port 25 des Mailservers:
    telnet zwetschge.org 25

    identifizierung via helo:
    helo hostname

    Absender übermitteln
    mail from: flo@noqqe.de

    Empfänger übermitteln
    rcpt to: root@zwetschge.org

    Mail-Inhalt übermitteln
    data
    text
    text text

    Inhalt stoppen:
    .

    Message fertig übermittelt.Beenden:
    quit

    Ein netter alternativ-Weg zum versenden von Mails. Wird hauptsächlich zu Testzwecken von Mailservern verwendet. Wenn jemand es probieren will :) Meine email habt ihr ja jetzt :)