Der Spam, der keiner war

Guck ma, ich weiß mein WordPress Passwort noch!

Unter vielen Freunden bin ich bekannt als jemand, der viel Spam bekommt. Dabei habe ich mir das gar nicht ausgesucht! Aber nach meinem Fauxpas vor drei Jahren war die Adresse, die ich heute immer noch benutze, nun mal infiziert. Dazu kommt, was ich nebenbei gesagt extrem unverschämt finde, dass auch meine quasi-öffentliche Support-Adresse für allerlei Open-Source-iges inzwischen betroffen ist.

Ich sehe das Ganze ziemlich gelassen und sammel die sogar, unter dem Vorwand, dass ich die besten Betreffszeilen irgendwann mal hier verbloggen will. Das ist schon fast Routine, Thunderbird markiert den Spam, ich sortier ihn ein. Ich will das nicht automatisch machen lassen aus Sorge, dass ich etwas wichtiges übersehen könnte.

Gut, dass ich den Spam heute nicht übersehen habe. Ich bekomme also eine merkwürdige Mail auf die besagte Open Source Adresse. Jemand bittet mich um Support für ein Programm, von dem ich noch nie etwas gehört habe. Das Deutsch war zu gut für eine dieser schlecht übersetzten Spam-Mails aus Lampukistan, selbst der Source war komplett unauffällig – die Mail war “menschlich”. Das Programm, das der Autor erwähnte, gab es allerdings gar nicht…

Ohne lange zu überlegen bat ich also höflich um mehr Information. Und tatsächlich, ich bekam eine Antwort! Diese war allerdings noch verwirrender: Man gehe in die Einstellungen auf dem iPad, dann auf besagtes Programm und unten in der Liste stünde “ich” als Support-Adresse.

Wieso werde ich in einer wildfremden iOS-App als Support aufgelistet?! Jetzt wollte ich wirklich mehr über die App wissen und fing diesmal an, den App Store zu durchsuchen (die originale Mail hatte iOS gar nicht erwähnt). Wieder nichts. Mit verschiedenen Suchbegriffen klapperte ich das Netz ab bis ich irgendwann auf ein Forum stieß, durch das sich schließlich feststellen ließ, dass der App-Name falsch geschrieben war – die App war in Wirklichkeit Filterstorm Neue.

Beim Lesen der App-Beschreibung fiel es mir wie Schuppen von den Augen. Na, errät’s einer? Unter “Andere Features” steht dort aufgelistet: “Export über FTP”.

Und hier ist der Screenshot, der mich zum Supporter von Filterstorm macht:

image1Meine verdammten Kontaktinformationen stehen in der Lizenz für FTPManager. Lizenztechnisch ist es nicht notwendig, diese tatsächlich in ein Programm einzubauen (lediglich der Copyright-Hinweis und die folgenden zwei Absätze sind erforderlich), aber klar, ich hätte sie auch mitgenommen, better safe than sorry. Was ich mir damals dabei gedacht habe, ist mir schleierhaft.

Unglücklich ist hierbei, dass FTPManager als letzte Komponente aufgeführt wird und ich zwischen Lizenz und Kontaktinfos auch noch zwei Leerzeilen stehen habe. Somit ist es letztendlich wie immer – alle Beteiligten haben sich komplett korrekt und nachvollziehbar verhalten, ich habe wieder aus eigener Dummheit lernen können.

Vielen Dank an Herrn S. für das kleine aber sehr amüsante Rätsel. Ich habe eine Paid-App gefunden, die meinen Source Code verwendet, was auch mal nett ist. Und ja, natürlich habe ich sie gekauft und ausprobiert, der FTP-Upload funktioniert einwandfrei. Fazit:

Spam, der keiner war, hat mich letztendlich zum Kauf einer 3,49€-App verleitet.

Tester gesucht für libmftp

It’s been a long time. How have you been?

Also mein Semester ist jetzt, so wie ich das sehe, vorbei und ich kann mich auf die wichtigen Sachen des Lebens konzentrieren – essen und schlafen. Typisch Studenten eben. Nein, natürlich nicht, selbstverständlich wird fleißig gearbeitet und wenn ich zu Hause bin weitergearbeitet. Über die Uni kann ich später noch was sagen, jetzt erst mal was neues aus der Codeküche, und es geht schon wieder um FTP.

Wer FTPManager kennt, weiß, dass ich schon eine Open Source Library für iOS und OS X geschrieben habe, mit der man sich mit FTP-Servern verbinden und deren Inhalte lesen und ändern kann. Die ist eigentlich nur ein Wrapper für Apple’s CFNetwork Framework und dementsprechend starr und unportabel. Außerdem weiß ich nicht, was die da intern verbrochen haben, “grundlegende” Features wie Timeouts gibts nur mit kreativen Hacks und auch sonst ist das Framework… naja, halt wie ein Apple-Framework, Code Jail. Und habt ihr ftp.c gesehen? Da kriegt man Hunger auf Pasta.

Es ist ärgerlich dass es keine gute und moderne Open Source Alternative für einen FTP Client gibt, die meiste verfügbare Software immer noch ihr eigenes Süppchen kocht und damit aus diesem großen Spezifikations-Durcheinander FTP ein noch größeres Durcheinander macht. Und wenn ich in meiner C-Anwendung mal “schnell” nen FTP Zugriff brauche schaue ich doof aus der Wäsche.

Deswegen libmftp, eine vollständig nach den offiziellen und neuesten FTP Standards entwickelte C Library für FTP-Zugriff. Multigethreadet, IPv6 und TLS-fähig, vernünftiges Error-Handling und leicht zu benutzen. Kompatibel zu modernen und uralten Servern und sogar IIS. Die Library ist momentan “benutzbar”, allerdings noch nicht bereit für den Produktiveinsatz, da ich sie zuvor noch mit möglichst vielen FTP-Servern testen möchte (die verhalten sich nämlich gerne mal falsch und und nicht der Spezifikation entsprechend). Dafür hab ich ein strenges Testprogramm entwickelt, und solange dieses nicht jeder Server besteht bin ich nicht zufrieden.

Deshalb hier auch noch mal die Bitte: Wenn ihr einem kleinen Open Source Projekt helfen wollt auf die Beine zu kommen und zufällig einen FTP Server zur Verfügung habt, dann testet es doch bitte. Es sind nur ein paar Terminal-Befehle und der eigentliche Test passiert ganz von alleine.

Eine Anleitung für den Test findet ihr auf der Projektseite auf GitHub. Danke für’s Lesen!

WTF-Monat des Moments.

Hier bin ich wieder. Vermisst? Nein? Okay. Ich bleib auch nicht für lange. Leider wird hier wohl demnächst weniger los sein als mal früher. Ich studiere jetzt, arbeite nebenbei und habe auch noch andere “Hobbies” außer Blogging die ich gerne fortführen möchte. Damit sage ich nicht, dass ich den Blog verwahrlosen lasse, ich werde nur eben in Zukunft in größeren Abständen Blogeinträge schreiben, welche dann allerdings hoffentlich von der Qualität besser sein werden. Na klar, als ob ich dieses Versprechen halten könnte.

Als Entschädigung für die Ruhe kommt hier der WTF-Moment von… naja, so von allen Monaten in denen ich keinen WTF-Moment mehr geschrieben habe.

Platz 5: Candy

5Neues Candy. Seems legit.

Platz 4: Die Hitze ist doch egal

4Mein MacBook hatte schon immer ein Problem mit seiner Temperatur. Letztens habe ich aber meinen Rekord gebrochen – 101°C und der Lüfter ist quasi im Leerlauf. Schon traurig, aber anscheinend will es Selbstmord begehen.

Platz 3: SFTP

3Der SFTP-Client auf OS X ist absolute Kacke. Er kann keine Tab-Vervollständigung und stellt sich auch sonst ziemlich dämlich an, so wie auch hier. Alzheimer, was?

Platz 2: Siri kann aber auch gar nichts

2Das war nicht gut. 2 von 10 Punkten.

Platz 1: Google spioniert mal wieder

1Google und ihre “Don’t Do Evil” Policy. Man kann sagen was man will, aber ich finde, dass Google seine “Creepy Line” schon lange überschritten hat. Und nein, ich habe nicht die Spracherkennung aktiviert ;)

Ach ja, zu meiner Verteidigung, die Werbung die ihr hier ab und zu seht ist nicht für mich und ich hab sie nicht bestellt. Die kommt, weil ihr einfach zu oft hier seid und WordPress entschieden hat, sich die Traffickosten zurückzuholen. So ist das nun mal ;)

Statistiken

Jetzt wo Ferien Countdown schon eine Zeit lang eingestampft ist und zu Beginn der Sommerferien die alte Version 2.0 ausläuft (2.1 läuft wie versprochen mindestens bis Sommer 2014), bleibt mir eigentlich nur noch, die bisherigen Serverstatistiken auszuwerten und in nette Diagramme zu verwandeln. In 2.1 habe ich den Update-Mechanismus grundlegend geändert (das ist auch der Grund warum die älteren Versionen die neuen Datenbanken nicht mehr bekommen) und zu diesem Anlass gleich serverseitig ein kleines Statistikmodul geschrieben, welches ganz anonym die Update-Anfragen zählt.

Gestern habe ich mir dann in C ein Auswertungs-Programm gebaut. Ganz nebenbei: Ich habe übrigens ein neues Git-Repo, in das ich ab und zu kleinere C-Tools hochlade die ich ganz nützlich finde.

Zurück zu den Statistiken:

Bildschirmfoto 2013-07-20 um 20.23.59

Eigentlich uninteressant, denn bis auf meine “Belastungstests” am Anfang, den Release der 2.1 und einigen kleinen oder größeren Serverpannen erkennt man eigentlich nix. Ich dachte, dass zumindest kurz vor den jeweiligen Ferien ein kleiner Peak zu sehen sein würde, aber ich bin halt auch kein Marktforscher. Interessanter finde ich da schon das:

Bildschirmfoto 2013-07-20 um 20.25.08

Man erkennt hier einen schönen Trend in Richtung 21 Uhr, außerdem kleinere Peaks um 6-7 Uhr (also vor der Schule) und um 10 Uhr herum (1. große Pause). Man könnte sogar eine ungenaue Durchschnittszeit ermitteln, zu der der durchschnittliche Ferien Countdown User schlafen geht ;)

Ich hab’s mir nicht nehmen lassen, auch die Device Family aufzuzeichnen. Welches iOS-Gerät benutzt der Otto-Normalferiencountdownverbraucher also?

Bildschirmfoto 2013-07-20 um 20.26.04

Dass gerade mal 1/4 Ferien Countdown auf einem iPod Touch benutzt haben, überrascht mich etwas. Ansonsten wird man als Schüler (der nicht so nerdig ist wie ich) wohl eher kein iPad besitzen, und dass die iPhone-Besitzer dominieren war auch klar.

Nochmal als Disclaimer, diese Daten sind aus den Logs des Update-Servers generiert und mehr hab ich auch nicht, weder eure Namen, noch Kontakte, noch Standort, nicht mal eure Softwareversion. Ich bin nicht Facebook. Jede Webseite die ihr besucht zeichnet wesentlich mehr auf als das.

Das Speicherproblem Teil 2

IMG_0400Nachdem es mir gestern gelungen ist, mit einer extrem eingeschränkten Zeichentabelle 6 Zeilen des Bildschirms zu füllen, hab ich heute am Code weitergearbeitet und es geschafft, den ganzen Bildschirm zu nutzen und alle druckbaren Zeichen auch wirklich anzeigen zu können.

Bildschirmfoto 2013-06-26 um 00.28.42Ich kann jetzt also bei der momentanen Schriftgröße (8×8) insgesamt 726 Zeichen anzeigen. Schon allein diese Anzahl ist größer, als der mir zur Verfügung stehende Arbeitsspeicher. Nicht zu vergessen die insgesamt 222 Zeichen in der Schrifttabelle, die theoretisch noch mal 1776 Byte Platz belegen würden.

Um das Unmögliche möglich zu machen habe ich das Text-Rendering und die Schrifttabelle komplett überarbeitet. Ich habe nichts komprimiert, weil das Dekomprimieren auf 16 Mhz nicht schnell genug machbar gewesen wäre, aber habe mir die immerhin noch 10KB freien Speicherplatz im Flash zunutze gemacht. So wird der Font-Buffer von bislang 208 Byte auf 8 Byte reduziert – dafür gibt es eine Funktion, die diesen bei Bedarf aus Font-Daten des Flash-Speichers konstruiert. Das dauert zwar, aber in diesem Fall ist der ePaper-Bildschirm noch klar der Flaschenhals, sodass das nicht wirklich auffällt.

Für den Textpuffer habe ich mir den Speicher der Ansteuerungseinheit des Displays zunutze gemacht, welche immerhin einen Framebuffer hat, den ich zwar nicht direkt ansteuern, aber, wie letztes Mal schon gesagt, zeilenweise füttern kann. Mein Programm speichert sich also jetzt nur noch die letzte Zeile des angezeigten Textes und rendert diese, wenn sie voll ist, direkt in das Display. So kann ich eine Funktion ähnlich wie printf realisieren, welche auch mehrfach in die gleiche Zeile schreiben kann.

Wenn die letzte Zeile voll ist, bin ich leider nicht dazu in der Lage, den ganzen Text nach oben zu schieben, da das Programm schon längst vergessen hat, was in den oberen Zeilen steht. Mal sehen ob ich irgendwie den Inhalt des Framebuffers auslesen und ihn dann versetzt wieder schreiben kann.

Bildschirmfoto 2013-06-26 um 00.26.29Fazit Speicherverbrauch: Der Flash-Speicher ist bis zum Rand voll (15,5 von 16 KB). Allerdings ist dafür der RAM noch schön leer, und theoretisch müsste ich das Programm sogar, wie gestern scherzhaft angedeutet, mit einer kleineren Schrifttabelle auf den schwächeren Chip mit 256 Byte übertragen können. Dieser hat allerdings anscheinend einen Unterschied in der Übertragung und schreibt nur wirres Zeug auf das Display. Ich hab trotzdem aus Spaß auf dem größeren Chip parallel zum Text-Schreiben ein malloc(256) laufen lassen und er hatte keine Probleme, mir den Speicher zu reservieren – also sagen wir mal, ich habe theoretisch die Speicher-Hürde geschafft.

Und nur mal ganz nebenbei gesagt – Sublime Text ist episch geil. Ich wäre sonst beim Konvertieren der Schrifttabelle durchgedreht.

Das Speicherproblem

IMG_0397Ich hab mir für die lernfreie Zeit mal ein neues Gadget gegönnt, nämlich ein TI LaunchPad (das ist ein Programmierboard für Embedded-Chips) und dazu ein richtig cooles ePaper-Display. Warum? Weil ePaper geil ist. Ich mag diese Technik und ich denke mal dass da noch was richtig großes draus werden kann.

Mit so einem Ding bewegt man sich programmiertechnisch so weit Low Level, noch einen Schritt weiter runter und man hängt am Assembler-Code. Das heißt abgespeckte C Library, wenig Speicher, Interrupts, Vektoren und vieles mehr. Man muss dem Compiler sogar sagen, wo er einzelne Funktionen hinkompilieren soll, denn der Chip führt bei einem Interrupt einfach eine feste Speicheradresse aus.

Und das macht tatsächlich Spaß und man lernt, wie man beim Programmieren richtig den Speicher und die CPU schont, schließlich arbeitet der Chip mit 16 MHz. Einen gnädigen Flash-Speicher von 16KB gibt’s auch noch – es passiert also gerne mal dass das fertige Programm gar nicht mehr auf den Chip passt. Noch härter hat’s den RAM erwischt – ich hab 512 Byte zur Verfügung. Das heißt ein malloc(512) und der Speicher ist voll.

Und hier liegt die Herausforderung, vor die ich mich hartnäckigerweise gestellt habe. Das 2,7″ ePaper-Display ist monochrom und hat eine Auflösung von 264×176 Pixeln. Wenn ich pro Bit eine Information speichere, liegt mein Speicherverbrauch bei ca. 5,8 KB. Tja, zu groß.

Also ist nix mit Bildschirmpuffer, und es wird noch böser, denn der Bildschirm will sein Futter zeilenweise haben, also ist auch nix mit einer setPixel()-Funktion. printf gibt’s natürlich auch nicht – noch nicht einmal eine Schriftart. Für das Display wird eine GFX-Library angeboten, mit welcher man Kreise und Text zeichnen kann – diese sprengt auf meinem Chip (MSP430G2553) sowohl bei RAM als auch Flash jeden Rahmen. Für diese Bildschirmgröße soll die nicht einmal auf einem Arduino Mega laufen.

Bildschirmfoto 2013-06-25 um 02.02.21Also macht man’s eben selbst. Mein Programm benutzt einen Textpuffer für insgesamt 198 Zeichen, einen Zeilenpuffer für die momentan bearbeitete Zeile und eine 6×8 Bitmap-Schrift-Tabelle mit 26 Zeichen. Damit ist der Speicher dann auch voll. Nach viel Verzweiflung und Herumgefrickel kann ich jetzt tatsächlich Buchstaben wie oben im Bild anzeigen.

Ich muss das bei Zeit noch mal ausbauen, denn wie man sieht ist es noch nicht wirklich gut. Ich bin in der Lage ca. 30% des Bildschirms auszunutzen und habe gerade mal alle Großbuchstaben und ein Leerzeichen zur Auswahl. Bill Gates hat mal gesagt dass 640 KB RAM für immer ausreichen sollten, und ich bin mir sicher dass ich diese 512 Byte RAM noch zu Höchstleistungen überreden kann. Und dann portiere ich das auf den anderen Chip mit 256 Byte RAM, der hier auch noch irgendwo rumfliegt (auf den passt die Schrifttabelle nur knapp drauf…) ;)

Ich werde da noch mal drüber berichten, wenn ich den Code “optimiert” hab. Wenn ich bedenke wie viele unserer Haushaltsgeräte solche Embedded-Chips beinhalten, ist es wahrscheinlich gar keine schlechte Idee, sich damit auseinanderzusetzen. Es gibt auch weder frustrierte User noch schlechte App Store Bewertungen oder sinnlose Feature-Wünsche! :)

WTF-Moment des Monats: Ein bisschen Sommer ’13

Buh! Damit habt ihr nicht gerechnet, was? Nein, ich hab diese “Reihe” nicht “abgesetzt”, mir hat nur irgendwie das Material gefehlt und ich wollte jetzt auch nix ramschiges aus der Grabbelkiste raussuchen. Vielleicht mach ich da mal ‘nen eigenen Beitrag für, mal sehen.

Platz 5: Die Must-Have App

5Die will man sich doch direkt installieren. Ich meine, die ganzen Features! Ganz klar die App des Jahres.

Platz 4: SSL oder SSL?

4Microsoft stellt einen manchmal echt vor Probleme. Will ich SSL oder doch lieber SSL? Man muss das abwägen: SSL bietet Verschlüsselung, im Gegensatz dazu kann man bei SSL die Identität des Servers feststellen. Welches nimmt man also bloß?

Platz 3: Siri in ihrem Element

3Und sie sagt noch, ich solle mir keine Sorgen machen. Ich mach mir aber Sorgen!

Platz 2: Hilfe

2“Nico, warum benutzt du eigentlich kein gdb mehr?” – Wir haben uns… auseinandergelebt.

Platz 1: Unschön

1Ich hab mal aus Langeweile alle Schriftarten gelöscht. Ich erwartete ein Terminal-Fenster ohne Schrift aber ich bekam ein Terminal-Fenster mit ganz miserablem Kerning. Wo er diese Schriftart aufgegabelt hat bleibt wohl für immer ein Rätsel.