Von nervenden Kindern, Überstunden und Mitarbeitermotivation

Letzte Woche war ja das berühmtberüchtigte Entdeckercamp von dem ich schon berichtet habe. Dort war auch ein Kind dabei, dass etwas extrem ist. Es schlägt öfters mal um sich und hat daher keine Freunde und wird auch sonst öfters abgewiesen. Selbst beim Spülen waren wir die meiste Zeit froh, wenn er nicht in unserer Nähe war.
Doch dann kam der Tag, an dem er Geburtstag hatte. Wir haben ihm ein Ständchen gesungen und von einem Betreuer (der auch berufsmäßig sein Betreuer an der Schule ist) hat ihm Age of Empires geschenkt. Dumm nur, dass sein Computer kaputt war. Also habe ich ihm angeboten, dass ich mal vorbei schaue und versuche ihn zu reparieren. Dazu haben wir später noch die Telefonnummern ausgetauscht und damit fing die Geschichte auch schon an. Er hat mich dann Sonntagabend noch angerufen, so dass ich montags nach der Fahrstunde zu ihm gefahren bin. Dort war die Sache relativ schnell klar: Die Grafikkarte war kaputt. Also zum Händler gefahren und eine neue eingebaut... Soweit, so gut. Damit lief der Rechner wieder. Ich habe ihm dann noch Windows XP installiert, da das vorhandene Windows Vista für seine Spiele einfach nichts taugte. Auch das ist an sich kein Problem. Doch wie es manchmal so ist, hat der Hersteller nur eine CD mit Treibern für Windows Vista beigepackt und es war mir nun nicht mehr wirklich möglich nach der Modellbezeichnung zu schauen. Nun hat alles funktioniert, bis auf die Soundausgabe. Ich hab dem Kind das auch so erklärt und er meinte dann: "Jaja ist doch alles OK. Danke erstmal, dass ich wieder spielen kann und dass du mir die Grafikkarte geschenkt hast!"
Zwei Tage später ruft er mich wieder abends an und meinte: "Du Tobi, mein Cousin und der Nachbar waren bei mir und meinten, ich soll dir sagen, dass du ein Idiot bist. Du hättest doch merken müssen, dass die Treiber nur für Vista funktionieren! Komm doch bitte nochmal vorbei und mach die Soundkarte wieder richtig!"
Nun denn, um die Sache noch abzuschließen gehe ich dann eben nochmal vorbei und schau ob ich doch noch irgendwie an eine Modellbezeichnung komme und somit an Treiber für Windows XP. Oh man, wenn das Kapitel abgeschlossen ist, mache ich drei Kreuze.

Dienstags bin ich wieder zur Arbeit gegangen und habe ich dann gleich mal eine neue Aufgabe bekommen. Die Synchronasation zwischen Lager und Warenwirtschaft geht ja schon grob und war nun nicht mehr wichtig. Nun solle ich "einfach" ein Programm schreiben, welches alle lieferbaren und fälligen Aufträge herausfischt und dem User herausfischt. Und als kleines Schmankerl darf ich, wenn die Sache zuverlässig funktioniert und produktiv eingesetzt werden kann die Firma zum Essen einladen. Bezahlt wird dann vom Cheffe.
Das habe ich dann die Tage auch schon angegangen und zuerst wild drauflos programmiert (grober Plan hatte ich ja im Kopf) und schon die ersten Schritte geschafft. Da der Chef nun im Sommerurlaub ist, habe ich 2 Wochen Zeit das Programm zu Ende zu schreiben und zu testen. Das Interessante ist ja, dass ca. 2000 Zeilen von der Datenbank ausgelesen werden müssen. Aber durch die aktive Filterung sind es dann doch wieder nur 1200 Zeilen, die ich dann in eine Exceldatei schreibe. Das Ganze muss man ja dann auch wieder sortieren können (alles automatisch) um es später wieder Zeile für Zeile auszulesen und weiterbearbeiten. Naja, wird noch etwas komplex, aber wird schon funktionieren... :)

Da der Artikel ja doch sehr lang ist, kommt hier mal was lustiges: Trinkgelder

Nun wieder sachlich weiter im Text:
Zur gleichen Zeit wurde auch beschlossen, dass man auf die neue Version upgraden könnte. Das habe ich dann auch gemacht, nachdem ich diese getestet habe (und doch einen Fehler übersehen habe!). Normalerweise brauche ich für solche Aktionen nicht länger als 3 Stunden. Doch ich wollte danach noch die Routine-Überprüfung drüberlaufen lassen. Diese hat sich dann bei einer Datenbank bis um 23Uhr30 hinausgezogen. Danach habe ich meine Sachen gepackt und noch von daheim aus weiter draufgeschaut. Als diese Überprüfung um 0Uhr immer noch nicht fertig war, wurde eben diese Aktion abgebrochen und die Reorganisation angestoßen. Diese war dann wenigstens um 1Uhr fertig. Naja um halb 8 bin ich dann wieder aufgewacht und nach einer langsamen Dusche und einem ordentlichen Frühstück war ich dann statt um 8Uhr eben um 8Uhr30 wieder Geschäft.

Das war also echt eine herrliche Woche mit einem nervigen Kind, das mir irgendwie leid tut, einer neuen Herausforderung mit super Belohnung, einem langen Arbeitstag und gaaaaaaaaanz viiiiiiiiiiiiiiiiieeeel Kaffee. Da war sicher kein Tag dabei, an dem ich weniger als 5 Tassen Kaffee getrunken habe.

Aber der Abschluss war dann gestern abend bei einer Geburtstagfeier. Da gabs dann lecker Sandwichtoast, nette Gespräche und ein paar "Cheers for Beers!" So eine krasse Woche hatte ich irgendwie schon länger nicht mehr.

Kaffeebild von hier geklaut. Danke an xenonb. für das tolle Bild.

Der ganz normale IT-Wahnsinn

Zur Zeit geht auf der Arbeit IT-mäßig alles drunter und drüber. Nicht, dass letzte Woche eines morgens sogar einmal das komplette System still stand, erst nach langwieriger Datenprüfungen wieder lief und danach ziemlich viel Stress angesagt war. Nein, es kommen auch manchmal Fehler zutage, die ich nicht richtig nachvollziehen kann. Beispielsweise macht man ein Update von Office 2003 auf Office 2010 und übernimmt einfach mal einen IMAP Account. Natürlich möchte man nun auch seine gesendeten Mails im Gesendete Objekte Ordner nach dem Senden abgelegt haben. Also stellt man dies in den Kontoeinstellungen ein und sendet zum Test mal eine Mail. Was passiert? Nichts. Die Mail kommt zwar beim Empfänger an, aber wo ist die Kopie abgeblieben? Richtig, sie ist nicht mehr da...
Man ist ja nicht von gestern und löscht einfach mal das Konto, schließt Outlook, startet es wieder und richtet ein neues Konto ein.
Doch egal, was man einstellt und an welcher Schraube man dreht: Es ändert sich nichts an der Tatsache, dass keine Kopie einer versendeten Mail im Gesendeten Ordner abgelegt ist. Schließlich werden andere Clients, wie Thunderbird oder sogar auf einem anderen Rechner ausprobiert. Überall tut es und sogar mit Outlook 2010 auf einem anderen Rechner. *harhar*
Da der Rechner sowieso immer wieder einfriert, trotz neuer Hardware (i5 750 mit ordentlichem RAM und recht schneller Festplatte) wird eben ein neuer Rechner für den User eingerichtet. Sofort mal das IMAP Konto mit Outlook eingerichtet und getestet. Tut alles... ;) Solche Probleme nerven auf Dauer dann doch echt. Aber nun ist es ja gelöst, zumindest im Geschäft. Beim User daheim gibt es wahrscheinlich noch die gleichen Probleme. :)

Schon seit längerer Zeit beschweren sich die Nutzer, dass das Netzwerk manchmal extrem hängt. Man wundert sich schon seit Jahren darüber. Über die Jahre hinweg, hab ich einiges ausprobiert. Hintergrunddienste ausgemistet und zuletzt überall die Windowssearch aus dem Autostart ausgesteckt bzw. beim Server deaktiviert. Weiter dann noch alle Clients auf 100Mbit/s gedrosselt. Da wir dann einen neuen Mailserver bekommen haben, habe ich mal mal spaßeshalber die Geschwindigkeit des Server-RAIDs gemessen. *harhar* Von 130 Mbit/s Spitze mal abgesehen, war während des Tests die Geschwindigkeit meistens zwischen 1,2 Mbit/s und 15 Mbit/s. Und dann wundert sich noch einer, warum die User immer jammern, weil alles einfriert?!? :)
Die Ursache war dann aber recht schnell ausgedoktert. Schon seit jeher wurden aus Backup-Gründen die PST-Dateien von den Usern immer auf dem Netzlaufwerk ausgelagert. Wenn die User nicht immer E-Mails aufbewahren würden, wäre das auch nie ein großes Problem geworden. Nun ist es aber so, dass damals 10 Mitarbeiter mit Outlook gearbeitet haben und heute 20 Mitarbeiter am Schaffen sind und kaum einer seine E-Mails aussortiert. Kann man ja alles irgendwann noch gebrauchen! Mach ich privat ja auch so, da Googlemail ja ewig Speicher hat.
Doch dummerweise hat Microsoft die PST-Dateien nicht für Netzlaufwerke ausgelegt. Denn sobald eine neue Mail kommt, wird diese in die Datei geschrieben. Und sobald eine E-Mail gelöscht wird, bleibt diese aber weiterhin als Leiche in der PST-Datei. Außer man komprimiert die Datei hin und wieder mal. :)
Bei ein paar Clients, die gleichzeitig mit Outlook arbeiten kommen damit viele Lese und Schreibanforderungen auf den Server zu. Gleichzeitig läuft da drauf noch ein WaWi. Kein Wunder also, dass alles langsam ist. Der Server ist ansonsten nicht von schlechten Eltern. 2 XEON Prozessoren mit 2,8 GHz. 4 GB RAM mit ECC. Leider aber noch den langsamen mit 400 MHz oder sogar 333 MHz. Doch an und für sich reicht das noch locker aus, man muss nur mal die Mailgeschichte in den Griff bekommen.

Unsere Lösung ist nun IMAP. Damit ist zwar auch alles auf dem Server, aber jede E-Mail als einzelne Datei und vor allem auf einem anderen Server. Das hat natürlich auch für die iPhone User immense Vorteile. Man kann von unterwegs aus mal eben seine Mails checken oder auch schreiben. :)

So ziemlich parallel habe ich auch mal die ehrenwerte Aufgabe bekommen eine Lösung zur Synchronisation mit der COM-Schnittstelle zu programmieren. Über die COM-Schnittstelle habe ich mich ja schon Anfang des Jahres ausgekotzt und damals das durch fremde Hilfe und externe Programmaufrufe lösen können. Nun musste ich das aber selbst lösen. Durch ein paar Tipps in die richtige Richtung und mal genauerem Lesen der Dokumentation ist es mir dann doch leichter gefallen. Das war fast sogar schon leichter, als die ewige Fehlersuche bei dem Performanceproblem und dem blöden Outlook-Problem. Nebenbei bemerkt mag ich VB.NET nun richtig gerne. Klar sieht C# eleganter aus, doch wenn man mal keine ; schreiben muss, ist das doch auch toll. Performancetechnisch macht das heute ja eh kein Unterschied mehr. Mit den ganzen Sicherheitsroutinen und der großen Rechenleistung geht ja alles flott. Nur bei den COM-Aufrufen muss man sinnvoll programmieren, sonst dauert alles ewig. ;)

Genug gekotzt. Jetzt kommt endlich auch mal ein WLAN in unser Netz (natürlich Fremdnetz), damit unsere Besucher auch noch arbeiten können. Manche Kollegen freuen sich darüber auch. Denn WLAN ist doch um einiges schneller als das Handy-Internet.
Nebenbei habe ich endlich auch wieder Zeit gefunden um meine persönlichen Dokumentationen für die Aufgaben, die wiederkehren (Rechner installieren, Netzwerkkonfig, Excelformeln) zu pflegen. Irgendwie war das Ganze also auch sinnvoll. :) Meistens macht man sich ja nicht die Mühe die Doku zu pflegen und in ein paar Wochen, Monaten oder gar Jahren kommt dann große Erwachen und die ewige Sucherei: Wie ging das nochmal?

Projekt Abnehmen – Woche 5

Also diese Woche hab ich eine gute und eine schlechte Nachricht! Die Schlechte: Als ich mich heute morgen nach dem Aufstehen wieder gewogen habe, waren es wieder 113,7 KG. Die Gute: Als ich gestern nach dem Aufstehen gewogen habe, waren es 112,2 KG. Das gestrige Gewicht lässt sich leicht erklären, da ich freitagabends noch mit Toni im Fitnessstudio war und ein bisschen mit den Gewichten rumgespielt habe und allgemein nicht viel an dem Tag gegessen habe (zuerst die großen und dann kam aber ganz schnell der Moment, in dem nicht mehr viel ging. Das war auch mal besser, als ich weniger müde war).
Und warum es heute so viel war lässt sich auch gut erklären: Gestern war nicht viel los, mit Agron bei nem Verwandten am Computer was machen, danach Essen. Später wieder in Calw war die Besprechung fürs Zeltlager dran und schon wieder ein bisschen Kuchen essen. Danach war es abends und es gab noch Abendessen, und weil ich Agron noch bei ner Bewerbung helfen sollte, gab es hinterher noch einen Essen.
Ihr seht: Ich habe gut gegessen, aber wenig getan, dass erklärt wohl alles. :D
Daher habe ich heute also mal wieder eine Gewichtszunahme von 1,3 KG gegenüber letzten Sonntag zu vermelden.
Somit entwickelt sich langsam eine kleine Sinuskurve (hat natürlich auch was für sich. ), doch mein Ziel für nächsten Sonntag: Mindestens 111,9 KG zu wiegen und dann konstant jede Woche mindestens ein halbes Kilo abnehmen. Ich glaube, das müsste zu schaffen sein und werde mich auch dran halten.

Da ja auch manche meiner Kollegen mitlesen: Erinnert mich doch bitte daran, dass ich bis 7. März vorhabe ein Gewicht von 110 Kilo oder weniger zu wiegen. Danach wird's dann wieder einen leckeren Tiroler-Nuss-Kuchen oder den einen mit Kirschen geben. Falls ich es nicht schaffen sollte, gibt's 10 Euronen in die vordere Tasse. Meine Motivation sind natürlich die 110 Kilo!

[Update]Lösungsansätze für Lesen von Muster aus einer Textdatei

Nachdem ich vor kurzem mal auf mein Problem mit der COM-Programmierung hingewiesen habe und ein paar Anregungen bekommen habe, bin ich nun einen Schritt weiter.

1. Ich habe eine Möglichkeit gefunden den Text aus einer PDF mit dem Tool pdftotext in eine Textdatei umzuwandeln. Bei meiner Testpdf (die übrigens auch als Referenz für zukünftige Auftragsbestätigungen genommen werden kann) hat das super hingehauen.
Dazu genügt es einfach folgenden Code zu verwenden:

pdftotext -layout datei1.pdf ausgabe1.txt

2. Nun sind die ABs zwar in einer grafischen Logik dargestellt, aber mit dem Computer nur mühsam zu verarbeiten. Doch für was gibt es denn Reguläre Ausdrücke? Richtig um Muster zu finden. Die von mir benötigen Daten folgen glücklicherweise immer einem bestimmten Muster. Zum Beispiel ein Datum ist immer gleich aufgebaut und die Artikelnummern. Doch leider sind RegEx sehr schwer zu kapieren. Durch eine Googlesuche nach "Regex Generator" bin ich auf diese tolle Seite gestoßen: txt2re
Sie mag auf den ersten Blick sehr verwirrend sein, doch auf den zweiten Blick ist es einfach nur genial. Man gibt oben eine Zeile ein und kann unten per Mausklick auswählen, welche Muster man verarbeiten möchte und das Ganze dann auch noch in einer von vielen verbreiteten Sprachen.

Den zweiten Punkt werde ich morgen noch ausführlich testen in VB.NET und dann hoffentlich endlich ein Ergebnis bekommen. Wenn ich dann diese Datei habe, wird ein Export nicht mehr allzu schwer werden.

3. Ich muss nun noch nach der Syntax zum Lesen einer Datei in VB.NET googlen und das schreiben in der Datei. In C und PHP wüsste ich es noch einigermaßen, aber grafisch aufbereitet ist das ja immer etwas anders.

//Update:
Nun hab ich es endlich auch geschafft, was zu coden:

Imports System.IO
Imports System.Text.RegularExpressions

Module Module1

    Dim objDateiMacher As StreamWriter
    Dim objDateiLeser As StreamReader
    Sub Pdf2Txt(ByVal pdfFile As String, ByVal txtFile As String)
        Dim arguments As String = "-layout" & " " & pdfFile & " " & txtFile
        'make sure to provide the path with the pdfFile and the txtFile
        System.Diagnostics.Process.Start("c:\xpdf\pdftotext.exe", arguments)
    End Sub
    Sub Main()
        Call Pdf2Txt("C:\xpdf\datei\eingabe.pdf", "C:\xpdf\datei\ausgabe.txt" )
        Dim txt As String
        objDateiLeser = New StreamReader("C:\xpdf\datei\ausgabe.txt" )

        Dim re1 As String = ".*?"           'Non-greedy match on filler
        Dim re2 As String = "(BL[0-9]{7})"    'Word 1
        Dim r As Regex = New Regex(re1 + re2, RegexOptions.IgnoreCase Or RegexOptions.Singleline)

        Do
            txt = objDateiLeser.ReadLine

            Dim m As Match = r.Match(txt)

            If (m.Success) Then
                Dim word1 As Group = m.Groups(1)

                Debug.WriteLine(word1.ToString)
            End If

        Loop Until objDateiLeser.EndOfStream

        objDateiLeser.Close()
        objDateiLeser = Nothing
        Console.ReadKey()
    End Sub

End Module

Nach ein paar Änderungen am Code dank diesem Forum hier, tut das Programm auch und der unten abgebildete Fehler ist endlich weg.

Doch nun hapert es noch ein bisschen an den Regulären Ausdrücken, doch Übung macht der Meister. Probieren geht über Studieren.

[Gesucht] Hilfe für COM Programmierung

Nachdem ich mich mit Flash noch nicht richtig beschäftigen konnte, kommt schon wieder die nächste Herausforderung: COM-Schnittstellenprogrammierung

Der grobe Ablauf:
1. Text aus einer PDF (eine Auftragsbestätigung mit Terminen und Preisen vom Lieferant) in ein lesbares umwandeln, so dass ich die Daten per Skript bearbeiten kann.
2. Per COM-Zugriff eine Liste von den offenen Bestellungen beim Lieferanten aus der Warenwirtschaft auslesen.
3. Liste mit den Positionen aus der Warenwirtschaft mit den Auftragsbestätigungsdaten abgleichen und somit eine Liste mit neuen Lieferterminen und gegenfalls Preisen erstellen
4. Die fertige Liste dem Bearbeiter anzeigen und mit OK zurück in die Warenwirtschaft einspielen.

Punkte 2-4 kann ich recht logisch nachvollziehen, da ich öfters mit der internen Import/Export Schnittstelle arbeite und somit es nicht als großes Problem ansehe. Bei den Import/Export muss man ja auch immer die entsprechenden Feldnamen auswählen und zuordnen.

Nun mal eine Frage an euch: Welche Sprache empfiehlt sich für COM-Programmierung?
Ich dachte mal Visual Basic.NET, Windows Scripting Host, oder eben das VBA was im Ecxel enthalten ist. Da ich so oder so eine neue Sprache lernen muss, wäre mir eine grafische Oberfläche sehr recht. Der Kollege soll später eine GUI vor sich haben um den Pfad zur Auftragsbestätigung des Lieferanten angeben zu kommen, ansonsten nur OK. Die Programmlogik soll automatisch ablaufen.

Kennt sich jemand mit VB, VBA und PDF Bearbeitung aus? Es gibt ja auch Tools wie PDFtoText, aber damit komm ich in dem Fall nicht gut weiter. Mir wäre es recht, wenn ich einen bestimmten Bereich definieren könnte, der als Tabelle bearbeitet werden soll.

Hat jemand dazu eine Idee?