preDispatcher - speed up my slow Concrete5 website
Meine Concrete5 Webseite wurde langsamer und langsamer. Sie wird auf einem Shared Hosting betrieben (was ohnehin nicht die schnellste Option sein kann) - hier kann ich zudem keinen Varnish oder auch nur irgendeinen anderen Caching Dienst installieren und davorschalten, sondern muss mich mit .htaccess und Standard-PHP-Mitteln behelfen können.
Das Initialisieren eines Requests in Concrete5 (Bootstrapping) braucht scheinbar sehr lange. Selbst statische Inhalts-Seiten, die ein aktives Fullpage Cache haben, benötigen für die Verarbeitung am Server mehr als 200 ms. Hinzu kommen für einen kompletten Request dann noch Netzwerkzeiten für Namensauflösung (DNS), Anfrage zum Server senden … und das Ergebnis zum Browser zurücksenden, was der Browser dann rendert. Meine schnellsten Seiten aus dem CMS waren bei 300 ms. Andere brauchten 3 Sekunden und mehr. Concrete5 ist einfach langsam.
Ich habe einen Cache geschrieben, der Concrete5 vorgeschaltet ist und im Filesystem seine Caching-Daten ablegt. Kurz er hat minimalste Anforderungen und arbeitet mit einem Shared Hoster. Dieses “Vorschalten” umgeht die lange Initialisierungszeit von Concrete5 - dies macht die Seite schnell.
Vor einigen Tagen habe ich eine erste Version meines preDispatchers eingespielt. Erwartungsgemäss muss man ein paar Kinderkrankheiten ausmerzen. Aber erste Ergebnisse in der Webseiten-Statistik (Matomo) zeigen, dass es eine gute Entscheidung war: die mittleren Seiten-Generierungs-Zeiten sanken von über 2s auf unter 0.4s
Der PreDispatcher besitzt eine Debugging-Ausgabe, die die Arbeitsweise veranschaulicht und den Unterschied deutlich macht. Das ist ein ungecachter Aufruf einer Seite mit Fullpage Cache in C5 - also inkl. Bootstrapping + Auslieferung einer in C5 gecachten Seite:
Der PreDispatcher speichert den Request, der nicht im Cache ist (oder dessen Caching Zeit abgelaufen ist). Der nächste Request auf dieselbe Seite wird dann schnell. Richtig schnell:
Wie lange eine Seite aus einem Cache kommt? Man definiert einen Default für alle Seiten. Mit einer Liste von Regex für aufzurufende URLS kann man die Standard-Vorgabe übersteuern und einen neuen Wert zuweisen.
Zudem gibt es eine Erkennung, was nicht gecacht werden darf - oder wo ein Cache verworfen werden muss. Ich kann mich im C5 Backend einloggen - und der Cache jeder mit Login aufgerufenen Seite wird verworfen.
Ich bin wohl auf dem richtigen Weg. Aber ein wenig Feintuning braucht es noch. Bei Interesse, schaut auf Github … oder fragt mich an :-)
Der PreDispatcher ist Freie Software - unter GNU GPL 3!
weiterführende Links:
- Github: pre-dispatcher for more speed
- Concrete5 webseite
A Touch Of Glass - Theme für Flatpress
Mein bisheriger Blog war über Jahre immer ein Custom style … aber eben nicht public.
Nun habe ich meinen erstes Theme für Flatpress veröffentlicht. Vom Look her ist es der klassische Blog Style mit einem hellen Theme als Basis. Wegen der Transparenzen taufte ich es “A Touch Of Glass”.
Warum überhaupt … es gibt ja bereits mehrere Themes?!
- Mich stört in Flatpress, dass man den Filter auf einen Monat oder eine Kategorie nicht visualisiert hat. Ich hatte es bis anhin mit einem Hack gelöst. In diesem Theme ist es mit Javascript implementiert: In der Widget-Box ist es nun hervorgehoben als auch im Headerbereich sichtbar.
- Mehrere Themes für ein 2 oder 3-Spalten-Layout? Das ist unnötig. Wer mag, darf es gern adaptieren. Im Flatpress-Backend platziert man Widgets in einzelne Bereiche. Von mind. 1 Widget benutzte Spalten werden angezeigt; ungenutzte nicht. Klingt banal. Und ist es per CSS an sich auch.
- Es fehlen Icons. Naja, an allen Ecken und Enden. Ich habe im Theme per CDN Fontawesome eingebunden und an so einigen Stellen per CSS im Frontend als auch Backend integriert.
- Ich wollte ein cooleres Backend. Es soll schliesslich auch 2019 Spass machen, einen neuen Blog-Eintrag zu machen.
Das Theme gibt etliche Rahmenbedingungen vor. Die Syles - 4 liefere ich einmal mit - sind nur noch extrem einfache CSS Dateien, die einige Default-Farben übersteuern.
Weitere Farb-Schemata zu erstellen wird zum Kinderspiel. Wer mag, kann sich eine style.css eines Farbschemas ansehen: es werden CSS Variablen definiert und diese in denjenigen CSS Selektoren angewendet, die übersteuert werden sollen.
Hey, wenn ihr es für gut befindet, empfehlt/ teilt es weiter :-)
UPDATE
- 19.06.2019: Es sind ein Freitextfilter mit Highligntning bei Kategorieen und auf- und zuklappbare Jahre im Archiv hinzugekommen. Ich hab es nun mal v1.0 genannt :-)
- 06.08.2019: Mein Twitter-Posting wurde auf dem Flatpress Channel eingefügt (s. Link [6])
weiterführende Links:
- Github: Projekt Seite des Themes
- Github: Theme A Touch Of Glass als ZIP
- Flatpress.org Blogging Engine in PHP ohne Datenbank
- Fontawesome Iconset
- Twitter: Axels Tweet
- Twitter: Flatpress Tweet … und Channel
Pimped Apache Status: über 500 Downloads im März
Ich bin leider erst soeben darüber gestolpert: diesen März gab es auf Sourceforge einen absoluten Peak von 565 Downloads im Monat.
Warum habe ich das nicht gesehen?
In die tageweise Statistik reingezoomt … davon waren 500 an einem Tag (19.3.) - ich glaube, da hat sich wer einen Scherz erlaubt und wget bemüht - oder gar öfter F5 im Browser gedrückt.
So schnell kann eine kleine Euphorieblase wieder platzen.
weiterführende Links:
- Axels Webseite - Docs Pimped Apache Status Get started - hier ist das Youtube Video
- Github: Pimped Apache Status
- Sourceforge: Pimped Apache Status
jsclasses.org - Top user rated classes
Oh, was für eine kleine nette Überraschung: Das da bin ja ich :-)
Mit dieser Klasse wird bei einem Passwort-Feld ein Div eingeblendet. Darin wird die Erfüllung der vorgegebenen Bedingungen (z.B. Anzahl Zeichen, Gross-/ Kleinschreibung, Anzahl Sonderzeichen) dargestellt - on the fly während der Passworteingabe.
Diese Klasse ist Freie Software und Open Source.
weiterführende Links:
Appmonitor Server Webgui auf AdminLTE portiert
Ich weiss ja auch nicht, was mich vor ein paar Jahre geritten hat, Oberfläche und CSS von Hand und selbst erstellen zu wollen. Weil es schlank ist. Aber eben nicht produktiv.
Nun habe ich die GUI auf AdminLTE portiert - und mir für die benötigten Elemente in AdminLTE die notwendigen Abstraktionen geschrieben. Nun ist es deutlich aufgeräumter!
GUI-Kram kann schon ziemlich lästig sein. Ich bin froh, bin ich damit durch. Nun kann ich mich wieder auf das Implementieren echter Features konzentrieren.
weiterführende Links:
Flatpress lebt weiter
Nachdem bei Flatpress über Jahre nicht mehr viel weiterging, habe ich Anpassungen (die in dessen Forum genannt wurden) für mich gemacht und gar angefangen ein anderes Blog Tool zu suchen. In meinem Blog sind Inhalte seit 2008. Die Inhalte zu übernehmen, ist so eine gewisse Hürde, die mich abschreckt.
Aber all das entfällt ja nun :-) Am 22. Februar gab es eine neue Version, die gar PHP 7.3 komptibel ist.
Ein Dankeschön an Arvid und seine Helfer!
Anbei die Beschreibung des Updates von 1.0x auf 1.1 mit Übernahme des Inhalts. Bei der Variante “Überschreiben der bestehenden Dateien” bleibt tendeziell Unnützes über.
Anm.: dies ist inoffiziell - es ist die Beschreibung des Vorgehens auf meiner Installation.
- Backup: das Verzeichnis des Blogs “/blog/” wurde umbenannt nach “/blog_OLD/”
- Unzip der version 1.1 nach “/blog/”
- Beiträge und Bilder: Kopieren des Verzeichnisses /blog/fp-content/
- Theme: Kopieren des Verzeichnisses /blog/fp-interface/themes/[theme]
- Plugins: gehe in das Backend des Blogs blog/admin.php?p=plugin … wenn ein fehlendes Plugin gemeldet wird: Kopieren des Verzeichhisses /blog/folder fp-plugins/[pluginname] (Kontrolle mit Reload im Browser)
- Die Toolbar des Editors habe ich mir erweitert - im BBCode plugin wurden einige weitere Buttons hinzugefügt /blog/fp-plugins/bbcode/tpls/toolbar.tpl
- Pretty-Urls waren aktiv? dann die /blog/.htaccess übertragen
- Flatpress-Index neu erstellen: Dazu anmelden, Wartung anklicken und den Link anklicken [Den Flatpress Index neu erstellen]
- Einmal den Browsercache löschen (Ctrl+Shift+Delete), damit Javascript- und CSS Elemente von der neuen Version geladen werden
UPDATE:
3.3.2019 - Dank an Matthias (Laborix): Neuerstellen des Index wurde hinzugefügt.
weiterführende Links:
AMC-Player - flat skin
Am Wochenende habe ich v0.33 meines Html 5 Audioplayers freigegeben.
Funktional soll es das erst einmal sein, was ich mir für Version 1 vorstelle. Nun erledige ich ein wenig Code Cleanup.
Und vielleicht noch eine kleine Skin Datei. Eine in einer Art flat Design habe ich da schon mal in Vorbereitung:
… und auch ein Dark Theme
Beide sind noch nicht im Repo verfügbar … seht es als Preview :-)
Updates:
- 22.11.2018 - ein dunkles Theme hinzugefügt
weiterführende Links:
- Axels Webseite
- Dokumentation (en)
- Git-Repository (en)
AMC Player - viel fehlt nicht mehr zur Version 1
Der auf meiner Webseite eingebundene Surround Audioplayer kommt der Version 1 immer näher.
In den letzten Tagen kam ein Feature zur Integration und Anzeige von Songinfos+Coverbild hinzu. Get-Funktionen in der API entsprechend auch.
Und so einige kleine Unschönheiten wuden ausgebügelt.
Natürlich kann der Player auch für stereo Medien verwendet werden.
Aktuell schreibe ich an Erweiterungen, die es erlauben, Radiostreams einzubinden - analog mit denselben Metadaten und einem Coverbild. Streams oder Audiodateien sollen automatisch erkannt werden - man könnte so Mediadateien und Streams mischen. Entsprechend Medientyp sollen sich die Steuerelemente und dieFortschrittsanzeige anpassen.
weiterführende Links:
- Axels Webseite
- Dokumentation (en)
- Git-Repository (en)
Linux: Cleanup-Jobs mit IML CLEANUP
Wir verwenden Puppet als Werkzeug zum Verteilen unserer Server-Konfigurationen auf Linux-Systeme. Für das Löschen von Dateien älterer N Tage in einem Startordner haben wir oft mehrere angepasste Shell-Skripte mit einem Suchbefehl verwendet.
Das IML CLEANUP macht einfach eine Aufteilung von Logik- und Konfigurationsdaten. Es ist einfacher, eine kleine Konfigurationsdatei zu erzeugen (besonders, wenn Sie Automatisierungswerkzeuge wie Puppet, Ansible oder Chef verwenden) anstatt mehrere Bereinigungsskripte zu bearbeiten.
Man kann mehrere Konfigurationsdateien anlegen, die jeweils etwa so aussehen:
dir = /your/starting/path filemask = *.log,*.gz maxage = 180 maxdepth = deleteemptydirs = 1 runas = root
Jene Angaben werden aus den Konfigurationen geparst und in Parameter des find-Kommandos übersetzt.
Wie man es zum Laufen bringt:
- In der Datei /etc/imlcleanup.d/ können Sie (beliebig viele) Konfigurationsdateien wie das obige Snippet ablegen.
- ein Shell-Skript durchläuft alle Konfigurationsdateien und führt die Aktionen aller conf-Dateien aus.
- Sie müssen zusätzlich einen Cronjob erstellen, um dieses Skript regelmäßig (z.B. einmal pro Tag) auszuführen.
Genaueres ist auf Github zu finden. Bitte auch die dortigen Security-Hinweise beachten.
weiterführende Links:
20 Jahre Opensource - Check an unserem Institut
20 Jahre OpenSource … und ich habe bei meinem Arbeitgeber (Institut für Medizinische Lehre der Universität Bern; ca. 70 Mitarbeiter) einmal grob überflogen, was ich da so aus meiner bescheidenen Perspektive so sehe. Nachfolgende Liste entstand, OHNE dass ich in den Teams deren Tools erfragt habe. Gut möglich, dass eine vollständige Liste doppelt so lang würde: es fehlen Werkzeuge verschiedener Teams genau so wie Desktop-Applikationen (das ginge mit dem Firefox Webbrowser ja schon los).
Ich wage dennoch zu behaupten: ohne Opensource ginge an unserem Institut nicht mehr sehr viel.
Betriebssysteme
etwa 97% unserer über 100 Server verwenden ein Linux. Bei uns sind im Einsatz
* CentOS - https://www.centos.org/
* Debian - https://www.debian.org/
* Ubuntu - https://www.ubuntu.com/
Verschlüsselung
* Mit https verschlüsselte Webseiten und applikationsinterne Kommunikation verwendet OpenSSL - https://www.openssl.org/
* wir haben Wrapper um das Backup-Werkzeug Dupicity im Einsatz - http://duplicity.nongnu.org/
* unsere Server verschlüsseln lokal ihre Daten mit GnuPG https://gnupg.org/ -
* SecureShell (SSH) für den selektiven Zugriff auf unsere Server per Shell, Filezilla oder getunnelte Zugriffe auf Datenbanken - https://www.openssh.com/
* Mittels Shibboleth können sich Accounts fremder Provider bei uns einloggen - https://www.shibboleth.net/
* Stunnel - Verschlüsselte Verbindung bei unverschlüsselten Protokollen - https://www.stunnel.org/
Virtualisierung
* Unsere Virtualisierungsserver arbeiten mit KVM - https://www.linux-kvm.org/
* Als Verwaltungssoftware für virtuelle Server verwenden wir OpenNebula, welches mit EU Fördergeldern unterstützt wurde - https://opennebula.org/
* Der Festplatten Cluster wird mit Ceph betrieben - https://ceph.com/
* lokale Instanzen von Virtualbox - https://www.virtualbox.org/
Softwareverteilung
* Puppet - https://puppet.com/
* Foreman - https://theforeman.org/
Programmiersprachen, Computing
* Javascript/ NodeJS - https://nodejs.org/
* OpenCpu - https://www.opencpu.org/
* Perl - https://www.perl.org/
* PHP - http://php.net/
* Python - https://www.python.org/
* R - https://www.r-project.org
* Ruby - https://www.ruby-lang.org
In Projekten sind div. kostenfreie Frameworks im Einsatz, darunter
* AngularJS - https://angularjs.org/
* Apache FOP Project - https://xmlgraphics.apache.org/fop/
* Bootstrap - http://getbootstrap.com/
* Fatfree PHP Framework - https://fatfreeframework.com
* FontAwesome (Iconset) - https://fontawesome.com/
* jQuery https://jquery.com/
* PureCSS - https://purecss.io/
* Ruby On Rails - http://rubyonrails.org/
* Symphony PHP Framework - https://symfony.com/
Entwicklertools
* Apache Studio https://directory.apache.org/studio/
* Mysql Workbench https://www.mysql.com/products/workbench/
* DBeaver - https://dbeaver.jkiss.org/
* Git - https://git-scm.com/
* Netbeans IDE - https://netbeans.org/
* Xamarin - https://www.xamarin.com/
Datenbanken
* CouchDB - https://couchdb.apache.org/
* OpenLDAP - https://www.openldap.org/
* Elasticsearch - https://www.elastic.co/
* Myslq - https://www.mysql.com/
* MariaDB - https://mariadb.org/
* Postgres - https://www.postgresql.org/
* Resin - https://resin.io/
* SqLite - https://sqlite.org/
Webserver
* Apache Httpd - https://httpd.apache.org/
* Nginx - https://www.nginx.com/
* HA-Proxy - http://www.haproxy.org/
Logging/ Monitoring
* CollectD - https://collectd.org/
* Grafana - https://grafana.com/
* Graylog https://www.graylog.org/
* Monit - https://mmonit.com/monit/
* Munin - http://munin-monitoring.org/
* Nagios - https://www.nagios.org/
* Sensu - https://sensuapp.org/
webbasierte Werkzeuge
* Alchemy CMS - https://alchemy-cms.com/
* Concrete5 - https://www.concrete5.org/
* Dokuwiki - https://www.dokuwiki.org/
* GitLab - https://about.gitlab.com/
* Ilias - https://www.ilias.de/
* Umfragen Limesurvey - https://www.limesurvey.org/de
* Webstatistik Mattomo - https://matomo.org/
* OpenProject - https://www.openproject.org/
* Raumplanung https://mrbs.sourceforge.io/
* Wordpress - https://de.wordpress.com/
Datenablagen, Datenaustausch
* Samba - https://www.samba.org/
* Nextcloud - https://nextcloud.com/
Ergänzt werden diese Tools durch eigene Entwicklungen: diverse Werkzeuge schreiben wir zusätzlich selbst.