blog.andreas-klingler.de

Notizen und Gedanken von Andreas Marc Klingler

Kategorie: Softwareentwicklung (Seite 1 von 2)

Code-Realität

In Vorlesungen hört man ja ab und zu Horror-Geschichten über „die Realität“(tm). Man lacht dann meist darüber und fragt sich, ob es denn stimmen kann, das in freier Wildbahn wirklich dermaßen unglaublich schrecklicher Code existieren kann. So blöd kann ja keiner sein.

Letzte Woche habe ein solches Beispiel erlebt, bei dessen Code-Analyse ich minutenlang nicht mehr aus dem Lachen herauskam. Auch wenn Weinen wohl angemessener gewesen wäre.

Es ging um eine Webplattform, die trotz 8-Kern-Systems mit 32 GB RAM kaum noch benutzbar war aufgrund extrem langer Antwortzeiten im Minutenbereich. Ein Hauptproblem war eine Mehode, die folgendes gemacht hat:

  • Lade zu Beginn erstmal alle Objekte aus der Datenbank in eine Variable.
  • Lade, weil’s so schön ist, auch direkt alle abgeleiteten Objekte abgeleiteter Tabellen in Variable.
  • Führe diverse Transformationen mit allen diesen Objekten aus (deren Sinn sich mir nicht zu 100% erschlossen hat).
  • Filtere ca. 80% der Objekte raus.
  • Führe mit der verbleibenden Objekten weitere Transformationen durch.
  • Ermittle schließlich die Anzahl der Elemente, die in der „Hauptvariable“ noch drin sind, und …
  • verwende diesen Wert nie wieder.

Überflüssig zu sagen, dass auch die anderen Variablen überhaupt nicht verwendet werden. Tja…

Willkommen in der Realität! (Fluchtmöglichkeiten sind nicht ausgeschildert.)

(Nachtrag: Zum Thema: devopsreactions.tumblr.com, codinghumor.tumblr.com uvm.)

MyPlaces: Orte organisieren auf eigenem Server

In Madrid habe ich nach einigen Wochen angefangen, eine Google Maps-Karte zu erstellen, auf der ich interessante Orte markiert habe – sonst hätte ich sie nicht wiedergefunden.

In Berlin habe ich vor einiger Zeit wieder das gleiche Problem gehabt: Ständig sind mir neue Orte aufgefallen, die ich mir zu einem späteren Zeitpunkt mal genauer habe ansehen wollen. Aber ich wollte nicht wieder auf einer quasi-öffentlichen Karte markieren, für welche komischen Interesse ich bestimmte Orte interessant finde. (Ja, ja, ja – natürlich kann man bei Google Maps Karten als „privat“ markieren. Völlig privat. Schon klar. :-/ )

Ich habe daher nebenbei eine kleine Anwendung geschrieben, mit der ich Orte hier privat verwalten kann. Die Ruby-on-Rails-Anwendung mit dem schrecklich kreativen Namen MyPlaces ist auf github verfügbar.

Mit ihr kann man

  • Orte auf dem Mobilgerät wie auf dem Desktop schnell hinzufügen,
  • in Kategorien verwalten und
  • anzeigen.

Die Anwendung muss auf dem eigenen Server gehostet werden. Eine Demo-Anwendung läuft unter http://my-places.naturtrunken.de.

Für mich ist die Anwendung erstmal gut benutzbar, allerdings kann noch einiges verbessert werden, was ich die nächsten Wochen und Monate wahrscheinlich immer mal wieder zwischendurch tun werde. Wer die Software nützlich findet, kann sich gerne die offenen Tickets ansehen oder eigene Verbesserungen vornehmen.

Und wer in Berlin ist, kann auch mal Dienstags oder ab und zu Samstags im co.up bei dem Coding-Amigos-Treffen vorbeischauen. Da habe ich die Anwendung größtenteils entwickelt und werde sie dort ab und zu auch weiterentwickeln.

Neue Möglichkeiten mit WebRTC

Ich habe mir schon vor längerem vorgenommen, mich mal ausgiebig mit WebRTC zu beschäftigen. Mit dieser noch in der Entwicklung befindlichen Web-Technik wird es möglich, beliebige Daten in Echtzeit direkt zwischen Browsern zu übertragen. Zum Beispiel ist damit eine Anwendung wie Skype nativ im Browser möglich – ohne den Umweg über US-Server, die alles unbegrenzt speichern.

Sehr spannend. Letzten Montag fand im Betahaus das erste WebRTC-Treffen statt; mit tollen Leuten und Vorträgen. Einige Notizen:

  • In Mac OS ist seit einiger Zeit der Dienst AirDrop eingebaut. Damit kann man im lokalen Netz zwischen zwei Macs Dateien austauschen. Und zwar idiotensicher. Genau diesen Dienst gibt es jetzt auch als Web-Plattform unter sharedrop.io. Im lokalen Netz kann man zwischen zwei Rechnern damit auch plattformunabhängig Dateien austauschen, ohne irgendwelche Server-/Client-Geschichten aufsetzen zu müssen.
  • Browser-zu-Browser-Telefonie wird möglich. Zwischen zwei Browsern klappt das direkt, und mit einem Proxy-Dienst auch mit dem Festnetz. Die Live-Demo eines Testprojekts lief einwandfrei.
  • Falls aufgrund von NAT oder anderen Netzwerkeinschränkungen keine direkte Verbindung zwischen zwei Browsern möglich ist, kann man einen Dienst auf einem gemeinsamen Server aufsetzen, der beide „verbindet“. Wenn die Daten über diesen Server laufen, ist das natürlich sicherheitstechnisch erstmal nicht so schön, aber das garantiert wenigstens die Verfügbarkeit. Und da die Technik dezentral ist, lassen sich hunderttausende WebRTC-Server natürlich auch nicht so einfach überwachen wie z.B. nur Skype-Server.
  • Ich dachte bisher bei dem Begriff WebRTC bisher primär an „Skype ohne Überwachungsinfrastruktur direkt im Browser“. Aber abstrakt gesehen geht es um direkten Austausch beliebiger Daten zwischen Browsern. Das eröffnet ein gewaltiges Feld an neuen Möglichkeiten.

Ich glaube, wir werden in Zukunft viele Dienste mit dieser Technik sehen, welche die Grenze zwischen Desktop- und Browser-Anwendung weiter verwischen werden.

Ruby on Rails, i18n: Fehlende Übersetzungen

Problem: In einem Ruby on Rails-Projekt wurden einige Übersetzungen nicht gefunden. Obwohl alles korrekt in den i18n-locale-Dateien eingetragen war, die auch alle geladen wurden.

Lösung: i18n-Locale-Dateien werden in Rails sequentiell eingelesen. Datei für Datei. Wird ein neuer Schlüssel gefunden, wird dieser definiert. Ist der Schlüssel aber schon vorhanden, wird er überschrieben. Gibt es also mehrere Schlüssel in mehreren Dateien (oder in einer Datei, das liefe auf das gleiche hinaus), sind in der Anwendung nur diejenigen Übersetzungen desjenigen Schlüssels vorhanden, der zuletzt eingelesen wurde. Fies.

 

Ruby on Rails: perform_caching und Flash-Meldungen

Bei einem Ruby-on-Rails-Projekt funktionierte lokal alles – aber in der Umgebung production (unter nginx) verschwanden die Flash-Meldungen (zum Beispiel nach dem Login über Devise) nicht mehr – beziehungsweise erst, als eine Seite gerändert wurde, die von einem anderen Controller verwaltet wird.

Da das Projekt Devise teilweise per Ajax nutzt und die einige Flash-Meldungen selbst ausgibt, dachten wir erst an alles andere; bis wir, als uns nach etlichen Stunden Debugging langsam die Optionen ausgingen, wir einfach mal den Inhalt der development– und production-Dateien in config/environments austauschten. Und siehe da, das Problem war weg.

Der Grund des Problems war folgende Einstellung:

config.action_controller.perform_caching = true

Nachdem wir sie in production auf false gesetzt haben, funktionierten die Flash-Meldungen wieder.  Rückblickend ist das eigentlich klar, aber darauf zu kommen, hat gedauert.

Merke daher: Gibt es Probleme mit dem Anzeigen von Flash-Meldungen, immer auch an diese Caching-Einstellung denken.

Allmächtiges Frontend

Ich experimentiere seit einiger Zeit hin und wieder mit JavaScript-Frameworks wie Angular.js oder Ember.js. Darin kann man mittlerweile komplette MVC-Anwendungen schreiben, die komplett im Browser laufen können und ggf. höchstens noch per JSON/XML mit einem Server-Skript zur persistenten Datenspeicherung kommunizieren müssen. (Wobei auch das teilweise schon lokal geht.)

Ein interessanter Aspekt, der mir heute Abend bei einem Gespräch auf dem Angular.js-Meetup gekommen ist: Es gibt einen Trend, immer mehr Logik in das Frontend (→ Browser) zu verschieben.

In den meisten Webanwendungen wird derzeit die meiste Logik im Backend in einer eigenständigen (Skript-) Sprache geschrieben und daraus HTML-/JS-/CSS-/usw.-Code erzeugt und vom Browser gerendert. Zwar wird die Darstellung zwar oft noch per JavaScript gerendert, aber die wesentliche Logik liegt im Backend.

Die JavaScript-Frameworks laufen dagegen vollständig im Browser ab. Daraus folgt dann aber auch, dass die gesamte Logik öffentlich wird. Jeder kann sich im Browser durch die JavaScript-Dateien hangeln, die komplette Logik nachvollziehen, auf Schwachstellen analysieren und gar komplett herunterladen, verändern und woanders manipuliert hochladen.

Das eröffnet nebenbei völlig neue Möglichkeiten zum „Plattformklau“ oder zu Angriffen, bei denen man nicht mal mehr andere Seiten nachbauen muss, weil man sie komplett auf einen eigenen Server kopieren kann. Schnell noch eine Vertipper-Domain registrieren und dann mal schauen, wer sich so anmeldet. Die Anmeldedaten kann man dann auch gleich speichern, um damit auf der richtigen Plattform fremde Nutzerkonten übernehmen zu können.

In diesem Zusammenhang lohnt sich auch ein Blick auf die Seite nobackend.org, auf der bereits Ideen und Lösungen gesammelt werden für eine Welt, die vollständig ohne Backend auskommt.

Die Idee finde ich für einige Anwendungsfälle ganz interessant und ich werde das auch weiterhin beobachten. Aber es fühlt sich irgendwie komisch an, eine Plattform so leicht komplett kopieren zu können. Vielleicht bin ich da aber auch nur zu voreingenommen, weil ich es bisher anders nicht kenne. Mal schauen, wie sich das entwickelt.

Nagios-Plugin zur Überprüfung von Gemfile-Aktualisierungen

Für Nagios gibt es fast alles – aber ein Modul zum Überwachen für (Ruby on Rails-) Gems scheinbar noch nicht. Ich beschreibe daher im folgenden kurz ein Bash-Skript und dessen Einbindung in einer Nagios-NRPE-Instanz, mit der man das Vorhandensein von Gem-Aktualisierungen mit Nagios überwachen kann.

Kern des Skripts ist der Aufruf von gem obsolet, das eine Liste mit allen Gems zurückliefert, für die Aktualisierungen vorhanden sind. Das Skript zählt mit wc einfach die Anzahl der zurückgegebenen Zeilen der Standardausgabe STDOUT. Wird keine Zeile zurückgegeben, sind alle installierten Gems auf dem aktuellen Stand.

Weiterlesen

Exzellentes Blog über Softwaretechnik und -entwicklung

Vor einiger Zeit bin ich auf ein wunderbares Blog gestoßen, dass ich allen ans Herz legen möchte, die Software auch entwickeln: Joel on Software.

Es handelt um Softwaretechnik und -entwicklung sowie einer größeren Epsilon-Umgebung davon. Viele Artikel sind Augen-öffnend und zumindest ich habe in den gut vier Wochen, in denen ich das Blog „ausgelesen“ habe, sehr viel erkannt und gelernt. (Untere anderem auch gute Gründe dafür, warum man in der Praxis oft Dinge tut, für die es im akademischen Bereich aber auch gute Gründe gibt, sie zu verpönen.)

Auf der Hauptseite gibt es in der zweiten Spalte eine sehr lange Liste auf gute Artikel aus verschiedenen Bereichen. Ein guter Anfang. Über die Archiv-Seite kann man dann geordnet alle Beiträge ab März 2000 lesen.

Ursprünglich habe ich an dieser Stelle auch noch eine Auswahl hervorragender Zitate aus dem Blog anbringen wollen. Ich habe mich bei der großen Menge, die ich mir herauskopiert habe, nicht mehr entscheiden können und gebe daher allen Interessierten lieber den Rat, das Blog selbst auszulesen. Man kann sich ja auch damit Zeit lassen, die Artikel laufen ja nicht weg. :-)

Ältere Beiträge