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.

Advertisements

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.

Xcode-Weisheiten über Git

Xcode unterstützt Git, wenn auch eher schlecht als recht. Ich liebe Git und benutze es dementsprechend häufig – nicht nur auf GitHub sondern für Closed Source und zukünftige Sachen auch über meinen eigenen Git-Server. Um den zu erreichen musste ich, obwohl ich das sonst mit SourceTree (beste Git-App wo gibt!!) mache, die Git-URL in Xcode eintragen. Letzteres hat eigene Vorstellungen davon, was eine gültige Adresse ist und was nicht.

Was für Xcode gültige Git-URLs sind:

Bildschirmfoto 2013-05-21 um 21.02.48

Wikipedia. Is‘ ja klar, die haben alles.

Bildschirmfoto 2013-05-21 um 21.10.47

Raute. Er hat sich sogar testweise damit verbunden um zu merken dass er den Server von Raute nicht erreichen kann.

Was für Xcode keine gültige Git-URL ist:

Bildschirmfoto 2013-05-21 um 21.02.36

Natürlich, die funktionierende URL wird natürlich erst gar nicht überprüft, die „Verbindungsanzeige“ direkt mal aus Protest ausgeblendet und der Next-Knopf gesperrt. Ist ja auch verständlich, so Zahlen mit Punkten und dann noch ein @ und ein Doppelpunkt dazwischen, wer soll damit denn klar kommen.

Im neuesten Xcode haben sie an Git noch mal gut rumgewerkelt – selbst wenn immer noch keine Submodules funktionieren ist dieser Bug behoben. Fand ich trotzdem kurios.

Was war eigentlich mit dem BYOB-Film?

Bildschirmfoto 2013-05-18 um 14.16.59Als ich letztens zur Fehlermeldung rechts gefragt wurde, ist mir aufgefallen, dass ich nie die Story mit meinem BYOB-Film erzählt habe.

Ich habe damals für den Informatik-Unterricht dieses Projekt gemacht, das daraus bestand, in BYOB, einer Drag&Drop Programmierumgebung, einen zweiminütigen Film zu bauen und diesen vorzustellen.

Darauf habe ich 15 Punkte bekommen und den Film unter Copyright vielleicht etwas voreilig online gestellt. Dabei bin ich davon ausgegangen, dass diesen Blog wegen des doch eher spezielleren Themas nur Personen lesen, die wenigstens etwas mit Urheberrecht anfangen können. Doch schon Kant sagte damals das natürliche Böse des Menschen voraus – ich irrte mich gewaltig.

Dass jemand so faul ist, dass er lieber Google benutzt, ein zufälliges Projekt von einer zufälligen Website runterlädt und extrem unprofessionell abändert, wäre mir damals nicht wirklich in den Sinn gekommen. Aber es ist ja nicht nur das. Denn dass jemand so doof ist, nicht wenigstens den Autor zu überprüfen und festzustellen, dass dieser im Parallelkurs mit dem gleichen Lehrer sitzt… oh mann, ich kann mir nur jedes mal an den Kopf fassen wenn ich daran denke. Kein Wunder dass das Abitur immer weniger wert wird.

Ich bin ja für Open Source, aber das geht gar nicht. Der Typ hat übrigens noch einen Punkt bekommen für die Mühe, „byob film gut 15 punkte“ in das Google-Suchfeld einzugeben. Eine Entschuldigung habe ich nie von ihm bekommen und noch heute überlege ich, auf wie viel Geld man ihn hätte abmahnen können. Andererseits halte diejenigen, die willkürlich andere abmahnen, für Abschaum der Globalisierung… was soll’s.

Und deshalb ist der Download nicht mehr online.

Der Mac-Hipster

„Ich habe schon Macs benutzt bevor sie uncool waren.“ Nein, im Ernst jetzt.

Der echte Mac-Hipster…

  • hat ein MacBook Pro mit Retina Display. Aber nur Standardausstattung, man ist ja schließlich kein Geldscheißer.
  • benutzt Dock Skins und ändert das Finder-Icon.
  • hat ständig 10 Programme gleichzeitig offen, damit Mission Control nicht leer aussieht.
  • benutzt Find My Mac für das unter Pizzakartons vergrabene MacBook.
  • spart auf ein Apple Thunderbolt Display.
  • hat sich Final Cut Pro X gekauft und mit iTunes-Gutscheinen bezahlt.
  • hat iBooks Author installiert, ohne dass er jemals vor hat ein Buch zu schreiben. Aber es ist von Apple und gratis.
  • hat iPhoto im Dock und behauptet, dass die „bewegten Hintergründe“ bei ihm einwandfrei funktionieren.
  • hat immer irgendwo ein gecracktes Photoshop auf der Festplatte.
  • baut eine SSD ein, nur um das MacBook anschließend ständig demonstrativ auf Tische und Betten knallen zu lassen.
  • benutzt CoverFlow im Finder.
  • sendet Absturz-Berichte von Drittanbieter-Apps an Apple.
  • benutzt die Kabel-Aufroll-Klemmen am MagSafe-Netzteil.
  • verschwendet übermäßig viel Zeit damit, den Akku „gleichmäßig“ zu entladen.
  • suchen immer nach der Position, an der die meisten Leute den leuchtenden Apfel „bewundern“ können.
  • benutzt auf 27″ den Vollbild-Modus.