Metronic Admin Dashboard with Django

This entry is part 6 of 6 in the series Python

metronic-previewI was searching for an admin dashboard with AngularJS support for a web application to provide stats / charts, metrics and forms in a suitable and visual way. I had a look into several dashboard themes, which are available and decided on Metronic (affiliate link). Click here to see the demo.

With the package bought, I got the theme in plain HTML with JavaScript / jQuery and an AngularJS version. But as I use Django for my projects and no Django module was provided, I had to do some changes to get it working. For those of you wondering why I’m writing this article in English: I searched for already existing tutorials on how to get Metronic working in Django, I stumbled across many requests and questions but not on a single answer. As all of them were in English, I decided to use that language so more readers can take advantage of this post.

First of all, I assume you already set up a Django project and created a virtual environment to work in. If you didn’t, please find more information here: Continue reading Metronic Admin Dashboard with Django

Ignorieren von Dateien in Git ohne Nutzung von gitignore

Gerade bei öffentlichen Repositories wird mit verschiedenen Entwicklungsumgebungen, Tools und ähnlichem gearbeitet. Viele von diesen legen anwendungsspezifische Dateien an, in welchen Informationen wie Pfade, Einstellungen, etc. gespeichert werden und welche nichts in Repositories zu suchen haben. Rein aus Gewohnheit wäre meine erste Wahl zum Ausschluss der Dateien auf die Datei .gitignore gefallen, mit Hilfe derer man Dateien von Repos ausschließen kann. Man stelle sich jedoch vor, in einem Open Source Projekt würden 100 Menschen arbeiten, welche 50 verschiedene Anwendungen nutzen, bei welchen Konfigurationen, etc. auszuschließen wären. Die .gitignore würde vmtl. unübersichtlich und die Wartung würde sich schwierig gestalten.

Eine Alternative, welche ich hier vorstellen möchte, .git/info/exclude. Hierin können Dateien oder gar Verzeichnisse vollständig _lokal_ von der Beachtung durch Git ausgeschlossen werden, ohne dass dies mit dem Repository synchronisiert wird. Wie dies funktioniert, beschreibe ich nun in den folgenden Schritten exemplarisch an dem öffentlichen Projekt “django-dashing“, an welchem ich gelegentlich mitwirke:  Continue reading Ignorieren von Dateien in Git ohne Nutzung von gitignore

Django gehostete Webseite über iFrame einbinden

This entry is part 7 of 6 in the series Python

Ich habe mir in den letzten Tagen vermehrt Django angeschaut, da ich gerne über Python Webseiten bzw. Webapplikationen  bereitstellen möchte. Nicht nur, dass ich der Meinung bin, dass Django Anfragen schneller bearbeitet und ressourcenschonender ist als Apache (inbesondere hinter Nginx), sondern auch, dass die Performance und Sicherheit PHP überlegen ist. Darüber hinaus bietet Python weitreichendere Funktionalität, wenn es z.B. um Websockets oder NoSQL-Datenbanken geht.

Auf Django selbst bin ich über das Buch “Test-Driven Web Development with Python” von Harry Percival aufmerksam geworden. Eigentlich wollte ich mich nur in das Thema “Test-Driven Development” einarbeiten, konnte dann aber dem Angebot von O’Reilly nicht widerstehen.

Nachdem ich mich ein wenig eingearbeitet habe und die nächsten Webseiten mit Ausrichtung auf Statistiken und Monitoring in der Planung habe, fiel mir ein, wie schön es doch wäre diese bzw. einen Teil dieser Seiten per iFrame auf andere Webseiten, wie z.B. Blog einzubinden. Damit ich es nicht vergesse und vielleicht auch jemand anderes hiervon profitiert, schreibe ich einfach einen kleinen Blogartikel hierzu: Continue reading Django gehostete Webseite über iFrame einbinden

Überprüfung der Performance von Funktionen in Python mit timeit

This entry is part 4 of 6 in the series Python

In einem meiner letzten Blogartikel wurde ich von Alex in den Kommentaren auf eine mögliche Verbesserung hingewiesen.

Und zwar ging es um den folgenden Codeschnipsel, mit welchem ich den Unix-Timestamp der vollen Stunde, bei Angabe eines beliebigen Timestamps, berechnet habe: Continue reading Überprüfung der Performance von Funktionen in Python mit timeit

Reload einer Konfigurationsdatei bei Änderung in Python mit watchdog Modul

This entry is part 3 of 6 in the series Python

Um Werte in einem Python-Script einfach ändern zu können, lege ich meist im Scriptverzeichnis eine config.py ab, welche die benötigten Werte und Einstellungen enthält. Ab und an, ist es jedoch notwendig, diese Werte anzupassen. Besonders schön wäre es, wenn das Python-Script diese Änderungen übernimmt, ohne neu gestartet werden zu müssen.

Für ein aktuelles Projekt, sieht die config.py aktuell wie folgt aus: Continue reading Reload einer Konfigurationsdatei bei Änderung in Python mit watchdog Modul

Python – Timestamp der letzten vollen Stunde

This entry is part 2 of 6 in the series Python

Ich erhalte innerhalb eines Scripts aus verschiedenen Datenquellen Informationen, in welchen ein Unix-Timestamp hinterlegt sind. Diese Daten möchte ich, jeweils für die volle Stunde, in eine Datenbank speichern. Die Aufgabe war daher, einen neuen Timestamp zu erzeugen, in welchem die Minuten und Sekunden des originalen Timestamps nicht berücksichtigt sind. Hier das Script mit der Lösung: Continue reading Python – Timestamp der letzten vollen Stunde

Unable to find vcvarsall.bat bei Installation von Python-Paketen unter Windows

This entry is part 1 of 6 in the series Python

Ich arbeite derzeit an einem Projekt in Python, und benötige hierzu Twisted für TCP- und FTP-Verbindungen zwischen den Clients und Servern. Da Twisted jedoch auch C-Code im Bauch hat, muss bei der Installation des Moduls, der Quellcode kompiliert werden. Im Gegensatz zu unixoiden Betriebssystemen, welche gcc als Compiler oft mit an Bord haben, ist dies bei Windows nicht der Fall.

Aus diesem Grund erscheint bei der Installation bzw. dem Buildprozess folgender Fehler (Auszug): Continue reading Unable to find vcvarsall.bat bei Installation von Python-Paketen unter Windows

Das Portfolio von Hosteurope unter die Lupe genommen

Die Zeiten des Web 1.0 sind vorbei. Statisches HTML ist nicht nur seit Jahren out, es wird im besten Falle nur noch müde belächelt. Meiner Ansicht nach, sind wir derzeit in einem Wandel vom Web 2.0, in welchem Webseiten dynamisch und das Netz zu einem “Mitmach-Web” wurde, zu einem Web 3.0. Diese “next Generation” des Internets geht weg von einer Seite, welche lediglich Informationen, wenn auch dynamisch generiert, bereitstellt. Die Zukunft sind Applikationen, die Logik sowohl client- als auch serverseitig ausführen können und welche kaum von nativen Programmen, auf Rechnern oder mobilen Geräten auf iOS- oder Android-Basis, unterschieden werden können.

Doch welche Voraussetzungen müssen erfüllt werden, um Kunden und Nutzern solche Applikationen anbieten zu können? Die üblichen Webhosting-Pakete, bei denen meist lediglich Dateien auf den Webserver gelegt werden können, bieten hier mittlerweile nicht mehr genügend Möglichkeiten, um die o.g. Funktionalität zu bieten. Anbieter wie Hosteurope bieten daher als kleinste Option vServer und dedicated bzw. root-Server an. Hier ist die Besonderheit, dass ein SSH-Zugang, mit meist administrativem Zugriff, bereitgestellt wird, der einem die Möglichkeit gibt, Anwendungen, Dienste, etc. nachzuinstallieren und anzupassen. Möchte man mehr als ein einfaches CMS wie WordPress nutzen, ist dies zwingend erforderlich. Ich habe mir daher die verschiedenen Angebote von Hosteurope mal angeschaut: Continue reading Das Portfolio von Hosteurope unter die Lupe genommen

Apache access.log mit node.js in Realtime parsen und zur Weiterverabeitung in RabbitMQ queuen

This entry is part 3 of 3 in the series node.js

Für ein firmeninternes Projekt (nein, hier werden keine ‘Internals’ preisgegeben 😉 ) werte ich Apache access.log Dateien aus. Dies geschieht aktuell mittels eines Cronjobs, welcher ein PHP Script startet und das Log Zeile für Zeile ausliest, die Daten via Regular Expressions und StringSplit parsed und anschließend in eine MySQL-Datenbank schreibt. Das Problem hierbei ist, dass sowohl die Dateien (Logrotation ist auf 15 Minuten eingestellt) als auch die Zeilen seriell bearbeitet werden und dies natürlich sehr lange dauert. Zwischenzeitlich habe ich mir bereits gearman angeschaut, um trotz der Verwendung mit PHP diese Prozesse zu parallelisieren, jedoch habe ich hierbei bereits nach kurzer Zeit die Flinte ins Korn geworfen.

Nachdem ich mich nun mittlerweile seit einiger Zeit mit Node.js beschäftigt habe und nach einer knappen Woche auch gut mit RabbitMQ und dem Node.js-Modul node-amqp zurechtkomme, kam mir eine neue Idee. Warum nicht das access.log in Echtzeit auslesen, neu hinzugekommene Zeilen in eine RabbitMQ Queue zu schreiben und dann mit mehreren Worker-Prozessen parallel zu parsen und in eine Datenbank zu schreiben. Somit müsste nicht mehr auf die nächste Log-Rotation (15 min) und die Fertigstellung des Parsing-Scripts gewartet werden und es stünden die Daten nahezu in Echtzeit zur Verfügung.

Hier also die ersten Schritte, um das neue Konzept umzusetzen: Continue reading Apache access.log mit node.js in Realtime parsen und zur Weiterverabeitung in RabbitMQ queuen

Prozesse unter Linux anhand des Prozessnamen beenden

This entry is part 5 of 4 in the series PHP / Javascript

Dies ist vmtl. eher eine Notiz für mich, als ein ausgewachsener Artikel. Nichtsdestotrotz habe ich ab und an das Problem, dass sich PHP-Prozesse die über die CLI per Cron gestartet werden, nicht sauber beenden. Grundsätzlich sollte hier natürlich nach der Ursache des Problems gesucht werden, aber um erstmal wieder Herr über den Server und seine Prozesse zu werden, ist das Beenden dieser der erste Schritt.

Hierzu muss lediglich folgender Befehl ausgeführt werden: