Tricks für Laravel Eloquent Relationships

Eine Stärke von Laravel ist die elegante Syntax. Hat man in Laravel (durch sehr viele Tabellen in der Datenbank) sehr viele Models und Relationships, kann das Traversieren aber doch oftmals in weniger elegantem Code enden. Im Laufe der Zeit haben sich für mich drei kleine Erweiterungen bewährt, die ich nachfolgend kurz vorstellen will. Dazu nutzen wir lediglich etwas Vererbung, magische Methoden und Custom Collections..­.­.

Öffentlicher Zugriff auf .git verhindern

Nahezu bei jedem Webprojekt und in jeder Umgebung (auch Production) gehört die Versionsverwaltung Git inzwischen zum Standard. Dabei legt Git stets den Unterordner .git an und wenn dieser auf der Ebene des Public-Ordners der Webseite liegt, kann man öffentlich auf sensible Dateien zugreifen (so zeigt zum Beispiel der Aufruf von /.git/logs/HEAD die letzten Commits an). Hier wird im Detail erklärt, wie man auch ohne Directory Listing ein fremdes(!) Git Repository klonen kann..­.­.

Node.js / npm / Composer ohne Root

In einem älteren Blogbeitrag habe ich beschrieben, wie man Node.js kostenlos mit Hilfe von Heroku hosten kann. Nun zeige ich einen Weg, wie man Node.js, npm und Composer auch auf beliebigen anderen Shared Hostern ohne Root-Rechte mit wenigen Zeilen Code installieren kann. Damit kann man Packages installieren, Vue.js Applikationen deployen oder einfach nur einen Express.js Server starten. Wir arbeiten dabei stets im Benutzerverzeichnis und nutzen nvm – den Node Package Manager..­.­.

Bug in assoziativen Arrays in PHP <7.2

In PHP <7.2 kann man Arrays erzeugen, auf die man nicht mehr richtig zugreifen kann:

91367d1c4636fd753b381406024e303c

Damit kann man nun einige Sachen machen..­.­.

Befehle direkt nach SSH-Verbindung ausführen

Folgender Befehl stellt eine Verbindung zu einem Server per SSH her, führt einige Befehle aus (zum Beispiel wechselt in ein Unterverzeichnis und setzt ein git status ab) und lässt die Shell dabei offen. Dabei wird die .bashrc-Datei geladen, was farbige Subshells ermöglicht. Der Trick dabei ist es, eine temporäre Datei /tmp/initfile mit den gewünschten Befehlen abzuspeichern, eine Subshell (in unserem Fall bash) mit dem Befehl --init-file zu starten. Innerhalb dieser initfile wird dieselbige Datei gleich wieder gelöscht, um keine Spuren zu hinterlassen..­.­.

Netzlaufwerk als Administrator

Bindet man im Windows Explorer ein Netzlaufwerk ein, dann gilt das nicht systemweit sondern nur für das aktuelle Benutzerkonto. So kann man in einer Anwendung, die mit Administratorrechten läuft, nicht auf dieses Netzlaufwerk zugreifen. Man kann das leicht ändern: Legt man in der Registry unter HKEY_LOCAL_MACHINE\SOFTWARE\­Microsoft\Windows\­CurrentVersion\Policies\System ein neues DWORD (32 Bit) namens EnableLinkedConnections mit dem Wert 1 an und startet neu. Dann sind eingebundene Netzlaufwerke überall sichtbar.

Quick Tip: Ordner als Laufwerk einbinden

Will man unter Windows einen lokalen Ordner, den man immer wieder benutzt, schnell erreichen, kann man ihm einfach einen eigenen Laufwerksbuchstaben zuweisen. Das geht über "Netzlaufwerk verbinden" nur über einen Umweg, da man beispielsweise nicht den Pfad C:\Users\David\Downloads angeben kann. Als Lösung gibt man die sog. administrative Freigabe des Laufwerks an, die standardmäßig für jeden Ordner existiert: Im oberen Beispiel wäre dies \\localhost\c$\Users\David\Downloads.

Frösche fangen

Ein Frosch springt auf dem Zahlenstrahl umher und man versucht ihn zu fangen. Dabei wechseln sich Springen und Fangen stets ab. Der Frosch startet an Position \(s \in \mathbb{Z}\) und bei jedem Zug springt er eine Distanz von \(z \in \mathbb{Z}\) (falls \(z>0\), springt er nach rechts, anderen falls nach links). \(z\) ist bei jedem Sprung gleich. Das Fangen besteht aus der Angabe einer ganzzahligen Position. Man kennt weder \(z\) noch \(s\). Wir zeigen, dass es eine Vorgehensweise gibt, mit der man stets den Frosch fängt..­.­.

Lange Dateinamen unter Windows 10

Nicht nur beider Benutzung von npm unter Windows stößt man eine inzwischen fast 30 Jahre alte Grenze, die Pfade zu Ordnern und Dateien auf maximal 255 Zeichen beschränkt. Hier ist nicht NTFS Schuld, sondern LFN. Das führt zu ärgerlichen Bugs und zu Inkompatibilität zwischen Betriebssystemen. In Zeiten von WSL ein bedauerlicher Zustand, den man zum Glück in der Registry seit geraumer Zeit selbst beheben kann..­.­.

Laravel Queues auf localhost

Im PHP-Framework Laravel innerhalb von Produktivumgebungen sorgen Worker wie Supervisor dafür, dass die in beispielsweise Redis abgespeicherten Jobs abgearbeitet werden. Will man davon auf localhost gänzlich unabhängig sein, nutzt man entweder den sync-Treiber, um die Jobs immer sofort auszuführen. Das hat den Nachteil, dass der aktuelle PHP-Prozess geblockt ist und der Request hängt, bis der Job abgearbeitet wurde..­.­.

Quick Tip: In Google Analytics Zielvorhaben bündeln

Mit Hilfe der JavaScript-Bibliothek analytics.js von Google Analytics lassen sich beliebige Ereignisse auf Webseiten tracken. Diese Ereignisse sind beispielsweise ein genaues Messen der Verweildauer, die maximale Scrolltiefe der Besucher oder andere individuellen Aktionen wie das Absenden von Formularen. Will man später beispielsweise Werbekampagnen auswerten oder A/B-Tests durchführen, legt man sog. Zielvorhaben an..­.­.

Pragmatische Cache-Invalidierung

Server-Side Rendering gehören mittlerweile zum Standardrepertoire von Webseiten und -anwendungen. Auch Browser wie Google Chrome neigen dazu, möglichst viel zu Cachen, um die Ladezeiten von weiteren Aufrufen zu minimieren. Die Cache-Invalidierung von CSS-/JS-/Bild-Dateien kann mit Hilfe von mod_pagespeed, Expires/Cache control header, einem Cache Manifest oder aber sehr pragmatisch und direkt durch individuelle Parameter hinter dem Dateinamen gelöst werden..­.­.

Bitbucket und SSH-Keys

Der Anbieter Bitbucket bietet (auch in den kostenpflichtigen Tarifen Standard und Premium) keine Möglichkeit, SSH-Keys mit Schreibrechten auf Repository-Ebene zu hinterlegen. Seinen persönlichen SSH-Key auf dem Production-Server zu hinterlegen, ist keine Option, da sonst von dort aus der Zugriff auf alle anderen Projekte besteht, an denen man momentan arbeitet. Zwar gibt es sog. Access Keys, diese ermöglichen jedoch nur Leserechte..­.­.

Windows Sysinternals per Netzlaufwerk

Die Werkzeuge von Sysinternals von Mark Russinovich sollten auf keinem Windows-Rechner fehlen. Wenn man stets die neueste Version zur Hand haben will, bindet man sie als Netzlaufwerk ein. Dazu reicht der Befehl net use s: \\live.sysinternals.com\DavWWWRoot auf der Kommandozeile (als normaler Benutzer). Anschließend stehen auf dem Laufwerk S nette Tools wie PsList, PsKill oder den Process Explorer portabel zur Verfügung.

Quick Tip: Google Sheets und Kalenderwochen

Bei der Ausgabe von Kalenderwochen zu einem bestimmten Datum muss man in Google Sheets (genau wie in Microsoft Excel) aufpassen. So rechnet die Funktion =KALENDERWOCHE(HEUTE()) anhand des amerikanischen Standards, für den der erste Tag im Jahr immer der Kalenderwoche 1 zugeordnet wird. In Deutschland ist das anders definiert: Hier ist die erste Kalenderwoche diejenige Woche, von der mindestens 4 Tage auf das neue Jahr fallen. In Google Sheets kann man das Problem (neben anderen, spannenden Alternativen wie =KÜRZEN((HEUTE()-DATUM(JAHR(HEUTE()-REST(HEUTE()-2;7)+3);1;REST(HEUTE()-2;7)-9))/7) und der modifizierten =KALENDERWOCHE(HEUTE();21)) ganz einfach mit der speziell dafür vorgesehenen Funktion =ISOWEEKNUM(HEUTE()) lösen.

Selbst signierte SSL-Zertifikate in Chrome 58

Seit Let's Encrypt gehören verschlüsselte Webseiten heutzutage zum Standard. Auch bei der lokalen Entwicklung sind SSL-Zertifikate kaum mehr wegzudenken (so setzt navigator.geolocation zum Beispiel verpflichtend eine SSL-Verschlüsselung auch lokal voraus). Seit Version 58 von Chrome wurde die Unterstützung für CN (Common Name) aufgegeben und stattdessen SAN (Subject Alternative Name) verpflichtend vorausgesetzt. Dadurch akzeptiert Chrome alle auf herkömmlichem Wege erstellte SSL-Zertfikate plötzlich nicht mehr..­.­.

Doppeltes Alter zweier Personen

Man betrachte zwei Personen \(A\) und \(B\), die nicht am selben Tag Geburtstag haben und \(A\) jünger als \(B\) ist. Man zeige: Es gibt genau zwei Alterskonstellationen \(a,b \in \mathbb{N}\), für die gilt: \(2\cdot a = b\). Wir setzen zunächst \(d \in \mathbb{R}^+\) als den Altersunterschied von \(A\) und \(B\) bei der Geburt von \(A\) mit \( d = d_0 + d_1 \), \( d_0 \in \mathbb{N}_0, d_1 \in \mathbb{R}, d_1 \in [0;1[\). Wir betrachten nun einen beliebigen Zeitpunkt \(x \in \mathbb{R}^+\) nach der Geburt von \(A\) mit \(x = x_0 + x_1\), \(x_0 \in \mathbb{N}_0, x_1 \in \mathbb{R}, x_1 \in [0;1[\)..­.­.

Git und leere Ordner

Da Git bekanntlich keine Ordner, sondern nur Dateien kennt, landen leere Ordnerstrukturen nicht im Repository. Da viele Frameworks und Projekte diese aber zwingend benötigen, sollten sie dort aber landen. Eine gängige Praxis ist es, sog. Platzhalter-Dateien (oft .gitkeep genannt) anzulegen, die implizit die Ordnerstruktur vorgeben. Diese Dateien kann man leicht erzeugen und zusätzlich falls gewünscht dafür sorgen, dass andere Dateien in den Ordnern ignoriert werden..­.­.

Kostenloses Node.js-Hosting mit Heroku

Hosting für Node.js ist vor allem im deutschsprachigen Raum noch wenig verbreitet. Hier bietet das amerikanische Cloud-Unternehmen Heroku Abhilfe – und das sogar kostenlos. Dabei bemerkt man stets das Paradigma "Build apps... not infrastructure" und hat trotzdem kaum Einschränkungen. Wir setzen exemplarisch einen kleinen Cronjob auf Basis von PhantomJS um, der täglich eine Webseite scrapt und den Seitentitel per E-Mail versendet..­.­.

Die Cantorsche Paarungsfunktion

Neben den Diagonalargumenten entwickelte Georg Cantor auch die Cantorsche Paarungsfunktion \(\mathbb{N}^2 \to \mathbb{W}, \quad c(x,y) = \binom{x+y+1}{2}+x = z\), die zwei beliebige Zahlen \(x,y \in \mathbb{N}\) in einer neuen Zahl \(z \in \mathbb{N}\) kodiert. So ist zum Beispiel \(c(3,4)=\binom{3+4+1}{2}+3 = \binom{8}{2}+3=\frac{8!}{6!\cdot 2!} +3 = 31 = z\) eine eindeutige Kodierung der Zahlen \(3\) und \(4\) in der Zahl \(31\). Man zeige: Die Wertemenge \(\mathbb{W} = \mathbb{N}\), d.h. \(z\) nimmt alle natürlichen Zahlen an..­.­.

Die Erde und die Erbse

Man betrachte die Erde (als Kugel mit \(r_1 = 6370km\)) und eine Erbse (als Kugel mit \(r_2 = 2mm\)) und spannt über den Äquator jeweils ein Seil, sodass es straff auf der Oberfläche anliegt. Nun verlängert man beide Seile jeweils um einen Meter. Beide Seile sollen nun wieder völlig ausgedehnt über dem Äquator liegen – sie liegen nun aber nicht mehr völlig an der Oberfläche an, sondern schweben über dem Äquator. Wie hoch über der Oberfläche schwebt das Seil über der Erde, wie hoch über der Erbse?.­.­.

Wahrscheinlichkeiten an der Analoguhr

In wie viel % der Zeit eines Tages befinden sich alle drei Zeiger einer analogen Uhr in der rechten Hälfte des Ziffernblattes? Zunächst betrachtet man den Stundenzeiger, der in 12 von 24 Stunden jeweils auf der rechten Seite weilt (50%). Von dieser Zeit befindet sich der Minutenzeiger in 6 von 12 Stunden auf der rechten Seite (25%). Von diesen 6 Stunden verbringt der Sekundenzeiger 3 Stunden auf der rechten Seite (12.5%)..­.­.

Laravel: Arbeit mit Eloquent Relationships

Laravel erleichtert mit Eloquent die Kommunikation mit der Datenbank ungemein. Bei der Arbeit mit Eloquent Relationships sollte man sich beim Aufruf dynamischer Variablen (mit Hilfe der Magischen Methoden von PHP) darüber im Klaren sein, dass die Instanzen der Models neue Änderungen nicht reflektieren, sondern beim ersten Aufruf dauerhaft zwischenspeichern..­.­.

Bitbucket: Ordner aus Git-Historie löschen

Beim Hosting von Git auf Bitbucket gibt es ein Hard Limit von 2 GB – wenn dieses überschritten wird, hat man lediglich Read-Only-Access auf das Repository. Um das zu verhindern, entfernt man beispielsweise rückwirkend große Ordner oder Dateien aus seinen Commits. Doch auch in anderen Fällen (wenn Zugangsdaten in die History gelangt sind oder mal wieder node_modules auf master gerutscht ist) muss man nachträglich die Historie von Git entgegen seiner Natur rückwirkend manipulieren..­.­.

SSL-Zertifikat von DomainFactory auf IIS einbinden

In Zeiten von Let's Encrypt gelten verschlüsselte Websites inzwischen zum Standard. Doch auch Wildcard- oder Extended-Zertifikate mit besonders vertrauenswürdiger Inhaber-Validierung werden oft benötigt. Der Anbieter DomainFactory bietet hier kostengünstige SSL-Zertifikate an, die man auch extern nutzen kann. Die Einrichtung auf einem aktuellen IIS gelingt ohne CSR mit Hilfe von OpenSSL. Nachfolgend zeige ich kurz, welche Schritte dazu erforderlich sind..­.­.

OPcache PHP Bootup Optimierung

Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in einem statischen HTML-Cache vorzuhalten und den Cache nur bei Änderung im Backend manuell (oder automatisch) neu zu generieren. Beinhaltet die Seite jedoch dynamische Inhalte, die abhängig von Sessions und Cookies oder auch Sprache und Ort abhängen, eignet sich der Einsatz von OPcache..­.­.

Paradoxe Gewinnstrategie beim Erraten von Zahlen

Thomas M. Cover hat 1987 in "Open Problems in Communication and Computation" folgende, verblüffende Frage gestellt: Spieler \(X\) schreibt zwei voneinander verschiedene und zufällig gewählte natürliche Zahlen \(A\) und \(B\) auf zwei verschiedene Zettel und legt diese verdeckt auf einen Tisch. Spieler \(Y\) wählt nun zufällig einen dieser Zettel aus, sieht die Zahl und muss sich nun entscheiden, ob diese Zahl kleiner oder größer ist als die andere Zahl, die noch verdeckt auf dem Tisch liegt..­.­.

Fußball & Lineare Algebra

Beim Anpfiff eines Fußballspiels liegt der Ball auf dem Mittelpunkt des Feldes und wird dann 45 Minuten lang durch Verschiebungen und Drehungen über den Platz bewegt. Zu Beginn der 2. Halbzeit liegt der Ball erneut auf dem Mittelpunkt des Spielfeldes. Wir zeigen mit einfachen Mitteln der linearen Algebra, dass dann entweder stets unendlich viele Punkte der Oberfläche an exakt derselben Position sind wie im Ursprungszustand oder genau 2..­.­.

Laravel: Blade Template Debugging

Beim Debuggen von Blade-Templates in Laravel 5.* erhält man oft nichtssagende, auf gecachte Views verweisende Fehlermeldungen. Dabei war früher alle besser: Die Debugging-Ansicht in Version 4 enthielt dabei hilfreichere Funktionen und war auch optisch schöner aufbereitet. Mit ein paar Zeilen Code holt man sich mit Hilfe von whoops („PHP errors for cool kids“) diese Funktionalität wieder zurück..­.­.

Harmonische Darstellung von Logos mit JavaScript

Ob Referenzen, Partner oder Kunden – es gibt viele Fälle, in denen man mehrere Logos nebeneinander harmonisch darstellen will. Dabei sind die Größenverhältnisse der Logos meistens uneinheitlich. Oft folgt man hier bei der Größendarstellung im Design seinem Bauchgefühl, doch es gibt auch eine exakte Berechnungsmethode einer optisch ansprechenden Darstellung, indem man die Flächen der Logos gleichsetzt. In folgendem Beispiel gelingt das mit wenigen Zeilen JavaScript..­.­.

Variablen in PHP/JS auf Existenz prüfen

Bei der täglichen Arbeit mit Variablen in PHP und JavaScript stößt man oft auf die Abfrage, ob eine Variable leer ist. Dabei lohnt es sich, die nativen Funktionen und deren Unterschiede zur Überprüfung zu kennen. Ärgerlicherweise gibt es keine einfache Methode, um im intuitiven Sinne zu überprüfen, ob eine Variable vorhanden ist oder nicht. Was damit gemeint ist, verdeutlicht nachstehende Matrix. Durch kleine Helper-Funktionen lässt sich das Gewünschte aber nachrüsten..­.­.

Massenhafte Telefonanrufe mit sipgate.io

Sipgate hat mit sipgate.io eine spannende Cloud-API geschaffen, mit der man eine Vielzahl an Möglichkeiten rund um Internet-Telefonie hat. Dabei ist ein Account kostenlos, auch gibt es im Feature Store u.a. kostenlos die Möglichkeit, eine beliebige freie Absendernummer zu setzen. Die Dokumentation von sipgate.io ist noch ausbaufähig, doch mit etwas Einlesen in die offizielle Sipgate API kann man schnell spannende Sachen realisieren..­.­.

Rekursion in SQL

Relationale Datenbankmanagementsysteme auf Basis von SQL eignen sich nur bedingt für hierarchische oder rekursive Abfragen. Hier sind andere Systeme wie ArangoDB besser (einen tollen Talk dazu gab es auf der GOTO 2016). Man kann aber auch in SQL mit Hilfe von Common Table Expressions rekursive Abfragen erzeugen und so z.B. klassische Parent-/Child-Tabellen auf alle Vorfahren und Nachfahren abfragen..­.­.

WordPress: Archivseiten deaktivieren

Laut w3techs.com werden mit Hilfe von WordPress momentan ca. 27,4% aller Websites weltweit betrieben. Dabei handelt es sich in sehr vielen Fällen nicht um Blogs. WordPress generiert automatisch zahlreiche, oftmals ungenutzte URLs und produziert so viele von Google indexierte Links, die der Webseitenbetreiber so gar nicht auf dem Schirm hatte. Mit einem einfachen Befehl lässt sich das alles deaktivieren..­.­.

PDF-Formularfelder massenweise umbenennen

Kommt man wie ich in die Bredouille, tausende Formularfeldnamen umzubenennen, bietet sich die in Acrobat enthaltene JavaScript-Konsole an. In dieser kann man nicht nur beliebigen JavaScript-Code ausführen, sondern auch auf sämtliche Inhalte innerhalb des PDFs (unter anderem auf Formularfelder) zugreifen. Da keine native Funktion zum Umbenennen in der JS-API existiert, werden die Formularfelder mit allen Eigenschaften kopiert und mit neuem Namen angelegt..­.­.

Shopware: Variantenwechsel reparieren

In Shopware 5 ist nach wie vor ein bekanntes Problem nicht behoben: Legt man einen Artikel mit voneinander abhängigen Varianten mit sich gegenseitig ausschließenden Konfigurationsmöglichkeiten an, kann es passieren, dass im Frontend manche Kombinationen nicht anwählbar und damit nicht bestellbar sind. Mit Hilfe eines Plugins lässt sich das Problem momentan leicht beheben..­.­.

Eine Zeile für die Unendlichkeit der Primzahlen

Es gibt zahlreiche Beweise der Unendlichkeit der Primzahlen – der bekannte Satz von Euklid aus dem Buch der Elemente fehlt in keiner Grundvorlesung zur Zahlentheorie. Im American Mathematical Monthly (Ausgabe 122) veröffentlichte 2015 Sam Northshield einen nicht minder eleganten Widerspruchsbeweis in Form eines Einzeilers, den ich euch (mit kurzen Anmerkungen) nicht vorenthalten will..­.­.

Windows Kommandozeile aufhübschen

Die schnöde Windows-Eingabeaufforderung lässt sich mit wenigen Handgriffen optisch etwas aufwerten. So kann man die Kommandozeile nicht nur farblich und von der Größe her anpassen, sondern auch funktional (Erhöhung des Buffers, Installation eines großen Sets an UNIX-Tools) erweitern. Zwar kommt die Eingabeaufforderung damit nicht an die PowerShell 6.0 oder auch die neue Windows 10 Bash Shell heran, braucht sich aber für Alltagsaufgaben nicht zu verstecken..­.­.

Dynamische URLs in Joomla

In Content-Management-Systemen stehen URLs oftmals nicht immer im Vorfeld fest und werden damit nicht vorab statisch (als Beitrag oder Menüpunkt) angelegt, sondern sprechen Objekte aus der Datenbank an. Ähnlich wie in WordPress (wie hier beschrieben) ist es auch in Joomla möglich, dynamische URL-Strukturen (unabhängig vom internen Alias-System) aufzubauen. Dabei bietet sich entweder JRouter an – oder man greift zu einem Einzeiler in die .htaccess..­.­.

JavaScript PasteJacking

Moderne Browser können mit Hilfe von JavaScript sowohl lesend als auch schreibend auf die Zwischenablage des Benutzers zugreifen, diese also auch manipulieren. Die zugrunde liegende Technik ist bereits ein alter Hut, doch erst seit kurzer Zeit kursieren immer mehr Angriffe (unter dem Namen „PasteJacking“) im Netz, die sich diese Möglichkeit nachteilig für den unbedarften User zu Nutze machen. Eine Implementierung in JavaScript ist dabei banal..­.­.

Spalten tauschen in PostgreSQL

Das Vertauschen von SQL-Tabellenspalten gehört bei MySQL zum Standardrepertoire – bei PostgreSQL wird dies (noch) nicht unterstützt. Zwar widmet das offizielle Wiki dem Problem einen eigenen Beitrag, zeigt aber keine praktikable Lösung auf, die auch Views, Indizes und Triggers unterstützt. Folgende Klasse erledigt diesen Job (sowohl für MySQL als auch für PostgreSQL) entweder auf der Kommandozeile – oder alternativ direkt in Laravel 5..­.­.

Quick-Tip für den Windows-Explorer

Will man im Windows-Explorer in einem Ordner schnell die Eingabeaufforderung öffnen, klickt man (eine Ebene höher) mit der rechten Maustaste und gedrückter Shift-Taste auf den Ordner und wählt dann im Kontextmenü "Eingabeaufforderung hier öffnen" aus. Gerade habe ich eine andere, schnellere Methode herausgefunden, wenn man innerhalb des Ordners ist: Hier klickt man in den aktuellen Ordnerpfad, tippt "cmd" und bestätigt mit Enter.

WordPress Kategorien: Baumansicht/Vererbung

Arbeitet man mit hierarchischen Kategorien (Taxonomien) in WordPress, stellt man fest, dass zum einen die Darstellung der angehakten Kategorien im Backend verwirrt und zum anderen Beiträge nicht automatisch in der Elternkategorie landen, wenn Sie in die Kindkategorie gesetzt werden. Beides lässt sich mit wenigen Zeilen Code über das mächtige Hook-System (in Form einer Action sowie eines Filters) gerade biegen..­.­.

PHP 7 und der Spaceship Operator

Neben neuen Features wie dem Type Hinting für skalare Datentypen oder der optimierten Performance bringt PHP 7 auch viele neue, nützliche Spracherweiterungen mit sich. Dabei hat es nun auch endlich der "Spaceship Operator" in die Welt von PHP geschafft (Ruby- und Perl-Programmierer kennen den ja schon lange). \($a <=> $b\) gibt genau dann \(0\) zurück, wenn beide Operanden gleich sind, \(1\), wenn der linke größer ist und sonst \(-1\)..­.­.

IIS 7.5 PHP FastCGI Timeout

Bindet man PHP per FastCGI auf dem IIS 7.5 ein, so wird jedes Script standardmäßig nach 600 Sekunden (also 10 Minuten) abgebrochen. Eine Änderung der bekannten Variable "max_execution_time" in der php.ini hat hierauf keinen Einfluss, man muss (auch) die FastCGI-Einstellungen anpassen. Hierfür bietet der IIS eine komfortable Oberfläche zur Verwaltung der relevanten Variablen..­.­.

Paradoxon der Stochastik

Die bedingte Wahrscheinlichkeitstheorie bringt schöne Aufgabenstellungen mit kontraintuitiven Lösungen mit sich. Neben dem bekannten Geschwisterproblem will ich nun ein anderes Beispiel kurz abhandeln: "Inzwischen habe ich zwei Kinder. Ein Kind davon ist ein Junge und an einem Donnerstag geboren. Mit welcher Wahrscheinlichkeit ist das andere Kind auch ein Junge?".­.­.

Git, Shopware und leere Ordner

Das Dateiversionsverwaltungssystem Git ist schlank, schnell und portabel. Git hantiert stets mit Objekten, nämlich Dateien. Ordner werden erst angelegt, wenn sich Dateien darin befinden, ansonsten erfasst Git diese erst gar nicht. Das hat in manchen Projekten unschöne Nebeneffekte. So ist beispielsweise das Shopsystem Shopware auf die strikte Einhaltung der Ordnerstruktur angewiesen, um zu funktionieren..­.­.

Shopware: Individuelle Versandkosten

Shopware hat ein mächtiges Versandkosten-Modul, in dessen Berechnung man ganz gezielt eingreifen kann. Wir wollen in unserem Fall folgendes Szenario realisieren: Die Versandkosten pro Artikel werden zunächst nach dem Gewicht des Artikels bestimmt (die Gewichtsgrenzen sind dabei vorgegeben). Nur für spezielle Ausnahmen sollen stattdessen pro Artikel feste Versandkosten individuell festlegbar sein..­.­.

Bring your own device

Man kommt bereits jetzt schon kaum an ihr vorbei, wenn man flexibel und unabhängig arbeiten will: die Cloud. Es gibt wahrscheinlich eine ganze Reihe Menschen, die die Cloud bereits nutzen, ohne es zu wissen. Beim Streaming beispielsweise ist der gesamte Content in der Cloud gespeichert und wird bei Bedarf abgerufen. Netflix ist hier ein Beispiel, das sich in Deutschland immer größerer Beliebtheit erfreut. Oder die Synchronisation von Desktop PC oder Laptop mit allen Mobilgeräten erfolgt auch größtenteils über die Cloud..­.­.

Dynamische Permalinks in WordPress

Das Permalink-System von WordPress kann mit Hilfe von Structure Tags sehr gut an die eigenen Bedürfnisse angepasst werden. Dabei ist die Einstellung %postname% die wohl gängigste und praktikabelste Lösung. Will man jedoch echte dynamische Links realisieren, muss man zunächst das System mit eigenem Code erweitern..­.­.

Korrupte Hyperlinks in Word und Excel

Man möchte meinen, dass beim Öffnen von Hyperlinks aus einem Word-/Excel-Dokument heraus der Standard-Browser mit der gewünschten URL gestartet wird. Dem ist eigenartigerweise nicht so – was zu unschönen Nebeneffekten führt und Links für session-/cookiebasierte logingeschützte Seiten in den besagten Office-Programmen unmöglich macht..­.­.

Ein Paradoxon zum Vatertag

Zum heutigen Vatertag schenkt eine Tochter ihrem Vater ein selbstgemaltes Bild, das sich der Vater schon lange von ihr gewünscht hatte. Die Tochter sagt: „Ich schenke Dir das Bild, das Du Dir gewünscht hast, und mein Geschenk wird eine Überraschung sein“. Der Vater stutzt und überlegt sich den Wahrheitsgehalt dieser Aussage..­.­.

Dynamisch Scripte mit und ohne HTTPS einbinden

Bindet man im <head>-Bereich Scripte unverschlüsselt ein und ruft eine Seite mit vorhandenem SSL-Zertifikat verschlüsselt auf, werden diese Scripte geblockt und damit nicht ausgeführt. Lässt man das Protokoll einfach weg, werden alle Scripte automatisch verschlüsselt aufgerufen, wenn per https:// der Zugriff auf die Webseite erfolgt — ansonsten unverschlüsselt..­.­.

Usability in Dropdown-Menüs

Bei der Arbeit mit mehrdimensionalen Dropdown-Menüs stößt man oft auf das Problem, dass falsche Untermenüs versehentlich geöffnet oder das gewünschte Untermenü versehentlich geschlossen wird. Dieser Effekt tritt auf, wenn der Mauszeiger bei der Navigation zu einem bereits ausgeklapptem Untermenü das entsprechende Menü auf oberer Ebene verlässt..­.­.

Shopware: Varianten automatisch deaktivieren

In Shopware wird bei einem Abverkaufsartikel der gesamte Artikel bei einer realen Bestellung genau dann deaktiviert, wenn alle Varianten einen Lagerbestand kleiner gleich 0 haben. Um dies auch auf Variantenbasis zu realisieren, habe ich ein kleines Plugin programmiert, dessen Bootstrap.php ich nachfolgend zur Verfügung stelle..­.­.

Doppelte Passwortabfrage bei SSL

Bei folgender Konstellation kommt es stets zu einer unschönen Nebenwirkung: Schützt man seine Seite mit htaccess/htpasswd und erzwingt gleichzeitig eine SSL-Verbindung, so benötigt man stets zweimal dieselbe Passworteingabe (einmal für http und nach erfolgreicher Eingabe nochmals für https). Mit Hilfe von den in Apache 2.4 eingeführten configuration sections lässt sich das Problem einfach in den Griff bekommen..­.­.

Mehrzeilige Strings in JavaScript

Bei der Programmierung mit JavaScript stolpert man oft über die fehlende Möglichkeit, mehrzeilige Strings dadurch zu realisieren, dass sie auch mehrzeilig im Code eingegeben werden. Während die Aufgabe in anderen Sprachen wie PHP oder Ruby kein Problem darstellt, kann man sich bei JavaScript zunächst nur mit Workarounds behelfen, über deren Einsatz der persönliche Geschmack bzw. die Browserunterstützung entscheidet..­.­.

Die Technologie hinter Online Casinos

Seit einigen Jahren sprießen sie förmlich nur so aus dem Boden: Online Casinos. Unzählige Anbieter ermöglichen es den Glücksspielfans, sich im Internet ihrer liebsten Freizeitbeschäftigung rund um die Uhr hingeben zu können. Wer früher gerne ins Casino ging, erspart sich heute den Weg und schaltet einfach den Computer an. Doch wie genau funktioniert dieses Prinzip eigentlich?.­.­.

mail() in PHP mit UTF-8 und Umlauten

Einen E-Mail-Versand mit PHP realisiert man am besten mit mächtigen Klassen wie PHPMailer. Komfortable Wrapper-Funktionen ermöglichen es, mit wenigen Zeilen Code Inhalte in UTF-8 zu verwenden, Bilder einzubetten und Anhänge verschlüsselt zu versenden. Will man sich den Overhead sparen und entgegen der Empfehlung die PHP-Funktion mail() verwenden, stößt man spätestens bei der Verwendung von Umlauten und UTF-8 auf Probleme..­.­.

Google PageSpeed Insights vs. Google Analytics

Validation-Tools wie der W3C Markup Validation Service oder Google PageSpeed Insights sind hilfreich, Code und Performance einer Webseite objektiv bewerten zu lassen. Speziell Google beeinflusst mit Konzepten wie above the fold eine ganze Branche – und gibt auch in Sachen Bildkompression und Caching strenge aber nützliche Richtlinien vor. Dabei kann es aber passieren, dass sich Google selbst auf die Füße tritt..­.­.

Willkommen JavaScript 2.0

JavaScript dominiert das Web – und ECMAScript, der Kern der Sprache wird erwachsen. Die neue Spezifikation (ES6 bzw. JS2), die Mitte dieses Jahres erwartet wird, bringt zahlreiche Neuerungen mit sich, die man schon heute ausprobieren kann. Firefox bringt momentan die beste Unterstützung mit, aber auch Polyfills durch sog. Transpiler wie Google Traceur sind möglich. Es folgt eine kurze Übersicht der neuen Features von ES6..­.­.

0,99999... = 1?

Ob in der Schule oder im Studium: Eine interessante Fragestellung, die einem immer mal wieder über den Weg läuft, beinhaltet die Frage, ob folgende Gleichung wahr ist: \( 0,99999... = 1 \). Obwohl im linken Teil der Gleichung die Unendlichkeit schlummert, geben wir ihm einen Namen: \(0,99999... = A\). Nach Multiplikation mit dem Faktor \(10\) und einfachen algebraischen Umformungen erhalten wir eine erste erstaunliche Erkenntnis..­.­.

SQL: Schlechte Performance trotz Index

Eben war ich mit folgendem Performance-Problem einer SQL-Datenbank konfrontiert: In einer SQL-Tabelle namens „users“ mit ~1.000.000 Einträgen benötigte die Ermittlung der Anzahl der Registrierungen am heutigen Tag untragbare 28 Sekunden. In der Spalte „created“ waren die Zeitpunkte der Registrierungen im Format „Y-m-d H:i:s“ gespeichert..­.­.

Kleines Schachproblem

Neben dem bekannten Springerproblem und Damenproblem gibt es in der Welt des Schachs viele weitere spannende Fragestellungen. Zwei kleine Kuriositäten habe ich in einem vergangenen Blogeintrag angerissen. Setzt man sich mit Schachproblemen mathematisch auseinander, stellt man schnell fest, dass die Mathematik für viele Fragestellungen ganz einfache und erhellende Antworten gibt..­.­.

Online verfügbare Dateien mit OneDrive

Ob OneDrive, Dropbox, Google Drive, OwnCloud, Box.net: Egal in welcher Box man auch seine Dateien lagert – die Dienste gleichen sich nahezu. Die für alle Desktop- und Mobil-Systeme vorhandenen Clients, die standardmäßig unverschlüsselten Dateien sowie die Freigabeoptionen unterscheiden sich nur marginal. Doch das seit Windows 8.1 fest in das System integrierte OneDrive bringt eine Besonderheit mit: Nur online verfügbare Dateien..­.­.

PHP: Dateizugriff mit Umlauten unter Windows

Dateien auf Webservern sollten stets ohne Leerzeichen (nicht "dies ist ein bild.jpg"), ohne Umlaute oder Sonderzeichen (nicht "fußball.jpg"), ohne Backslashes (nicht "Arbeit\Auto.jpg") sowie in Kleinschreibung (nicht "test.JPG") abgelegt werden. Kürzlich musste ich für ein Kundenprojekt jedoch auf eine Vielzahl vorgegebener Dateien beliebigen Dateinamens zugreifen und diese weiter verarbeiten..­.­.

SQL-Query zur Ermittlung einer Rangliste

Heute bin ich bei der Arbeit an einem Kundenprojekt auf folgende Aufgabe gestoßen: Man nehme eine SQL-Tabelle "user" mit den Spalten "id" und "score" und ermittle eine anhand "score" sortierte Rangliste aller Benutzer, in der Benutzer mit der gleichen Punktzahl dasselbe Ranking bekommen. Durch den Einsatz von benutzerdefinierten Variablen kann man diese Aufgabe intuitiv und einfach lösen..­.­.

Facebook SDK: Token serverseitig prüfen

Bei der Arbeit mit dem Facebook SDK (genauer bei der Implementierung einer Facebook-Login-Funktion innerhalb einer REST-Schnittstelle) muss das übermittelte Token, das der Client von Facebook erhalten hat, zunächst vom Server auf Gültigkeit geprüft werden, bevor weitere Operationen ausgeführt werden..­.­.

Chrome DevTools: DOM-Elemente ansprechen

Ob Chrome, Firefox, Opera, Safari oder sogar der Internet Explorer: Nachdem ausgereifte Developer Tools bis vor einigen Jahren noch ein Alleinstellungsmerkmal von Firefox und dem populären Plugin Firebug waren, gehören heutzutage mächtige Entwicklerwerkzeuge zum Standardumfang eines jeden Browsers, in denen es viel zu entdecken gibt..­.­.

Zugriff auf das Dateisystem mit Hilfe von SQL

Gerade bin ich auf eine nette Möglichkeit in MySQL gestoßen, um das Dateisystem anzuzapfen und wertvolle Informationen beispielsweise über die Existenz von Dateien und Ordnern oder deren Inhalt zu erhalten. Das kann sehr hilfreich als Alternative für die php-Funktion file_exists sein, da die Information der Existenz der Datei(en) noch im Query für weitere Sortierungs- und Aggregationsfunktionen verwendet werden kann..­.­.

Animierte Hintergründe mit Canvas

Animierte Vektor-Hintergründe können Abwechslung in eine von Fullscreen-Fotos und -Videos geprägte Weblandschaft bringen. Schön wäre, wenn Ladezeiten sowie eine breite Unterstützung von Hard- und Software damit einhergehen. Eine Lösung lautet: Canvas. Das durch JavaScript gesteuerte HTML-Element wird von allen aktuellen Browsern unterstützt sowie auf mobilen Geräten performant wiedergegeben..­.­.

Festes Seitenverhältnis bei HTML-Elementen

Als Webentwickler kommt man häufig in die Verlegenheit, mit HTML-Elementen zu arbeiten, die von sich aus –beispielsweise im Gegensatz zum img-Element– weder eine feste Größe noch ein festes Seitenverhältnis mitbringen. Oftmals will man erreichen, dass sich diese Objekte zwar responsiv verhalten, aber die Proportion zwischen Breite und Höhe erhalten bleibt. CSS bietet hier standardmäßig keine intuitive Lösung an. Doch mit Hilfe von der vertikalen Padding-Eigenschaft kommt man ans Ziel..­.­.

Gerichtsurteil zum Einsatz von Stock-Fotos

Nachdem in der vergangenen Woche das Landgericht Köln im RedTube-Skandal zurückgerudert ist und die Herausgabe der umstrittenen IP-Adressen nie genehmigt haben dürfen, liefert es mit der Entscheidung 14 O 427/13 erneut ein höchst umstrittenes und fragwürdiges Urteil: Der Urheber von Stock-Fotos einer bestimmten Bildagentur muss auch über den Direktaufruf seiner Bilder über deren URL genannt werden..­.­.

Adieu Block & Inline - Willkommen HTML5

Die Neuerungen der HTML5-Spezifikation sind zahlreich und viele davon werden bereits vom Gros der Browserlandschaft unterstützt – nachfolgend will ich eine interessante Änderung an den Regeln zur Verschachtelung von Elementen beleuchten. HTML unterscheidet seit jeher zwischen Block- und Inline-Elementen. Die Document Type Definition von HTML4 nennt beispielsweise h1, p, und div als Block- sowie a, span, img als Inline-Elemente..­.­.

HTTP-Logging auf IIS und Apache

Sowohl Apache auf Unix- als auch IIS auf Windows-Systemen loggen HTTP-Requests out-of-the-box in Dateiform. Anfragen auf die eigene Webseite sollten nicht nur zum Schutz vor Hacking-Angriffen regelmäßig manuell und automatisiert (z.B. durch Logfile-Analyzer wie AWStats) ausgewertet und analysiert werden. Die Pfade der relevanten Log-Dateien lauten in weit verbreiteten Konfigurationen beispielsweise wiefolgt:

  • /var/log/apache2/access.log (Beispiel: Ubuntu 12.04, Apache 2.2)
  • C:\inetpub\logs\LogFiles\W3SVC1\u_ex<YYMMDD>.log (Beispiel: Windows Server 2012 R2, IIS 8.5)

Joomla, IIS und die Verzeichnisrechte

Bei der Integration von Joomla 3.2 auf einem Windows Server 2008 R2 mit IIS 7.5 kommt es häufig zu Problemen mit Verzeichnisrechten, die oftmals mit viel zu großzügig gewählten Einstellungen unzureichend gelöst werden. Folgende Lösung ist sicher und voll funktionsfähig:

  • Die Gruppe IIS_IUSRS braucht für C:\inetpub\wwwroot\ die Rechte: Lesen & Ausführen, Ordnerinhalt anzeigen, Lesen, Schreiben
  • Die Gruppe IIS_IUSRS braucht für C:\Windows\Temp\ die Rechte: Lesen & Ausführen, Ordnerinhalt anzeigen, Lesen, Schreiben
  • Der Benutzer IUSR muss in der Gruppe IIS_IUSRS sein (Computerverwaltung > Lokale Benutzer und Gruppen > Gruppen)

Benötigt man für alle via PHP hochgeladenen Dateien weitere spezielle Verzeichnisrechte (z.B. für SSH oder FTP), setzt man diese ebenfalls für den Ordner C:\Windows\Temp\. Lädt man via PHP eine Datei hoch, so kopiert PHP diese Datei zunächst in den temporären und anschließend in den finalen Pfad. Wenn die Datei im temporären Verzeichnis gelandet ist, erbt es dessen Rechte und behält diese nach dem Verschieben in das finale Verzeichnis bei.

Anonym im Netz: Unmöglich?

In Zeiten des NSA-Skandals stellen sich nicht nur netzaffine User die Frage, ob und wie man sich anonym im Netz bewegen kann, um der Datensammelwut der Behörden und Geheimdienste zu entgehen. Dabei kommt es jedoch oft zu Irrtümern und falschen Annahmen. Ein zentraler Irrglaube ist die Reduzierung der Anonymität auf die Verschleierung der IP-Adresse..­.­.

McFIT - Neues Logo, neues Image

Die Discount-Fitnesskette McFIT verpasst sich selbst ein neues Gesicht. Zierte früher ein knallgelbes Maskottchen in Form einer Banane den in blau gehaltenen Schriftzug, schlingt sich nun eine gelbe Schleife auf anthrazitfarbenen Grund gekonnt ineinander und formt damit ein abstraktes Gebilde. Die FDP-Farben blau und gelb weichen nicht nur auf dem Logo, sondern auch auf allen anderen Printsachen der Marke McFIT..­.­.

Photoshop: Reise in die Vergangenheit

Als 1987 die Brüder Thomas und John Knoll die Entwicklung von Adobe Photoshop aufnahmen, war ich noch nicht auf der Welt. Heute, im Jahr 2013, zählt die Software zu den populärsten Programmen im Allgemeinen und zum unangefochtenen Marktführer im Bildbearbeitungsbereich. Die Software wird nun dank Adobe und dem Computer History Museum der Nachwelt in ganz besonderer Form erhalten bleiben..­.­.

Kuriositäten im Spiel der Könige

Schach fasziniert seit Jahrhunderten – seine Regeln sind leicht zu erlernen und seine unglaubliche Tiefe erschließt sich nur geübten Spielern (zu denen ich leider nicht zähle). Nachfolgend behandle ich zwei kurzweilige Fragestellungen: Ist es möglich, durch eine korrekte Zugfolge zu einer Stellung zu gelangen, in der der schwarze König durch zwei weiße Damen gleichzeitig angegriffen wird? Ist dies auch durch zwei weiße Türme möglich?.­.­.

Doku-Soap statt Blockbuster: 48fps

Kinofilme werden üblicherweise mit 24 Vollbildern pro Sekunde aufgezeichnet und auch wiedergegeben – doch das fast 100 Jahre alte Standardformat „24p“ scheint zu wackeln. Um die unschönen Nebeneffekte (z.B. das starke Ruckeln bei mittelschnellen Kameraschwenks) der 24fps-Projektion zu verhindern, arbeitet man schon seit längerem an einer Verdopplung der Bildfrequenz auf nun 48 Bilder pro Sekunde und mehr..­.­.

Rechtschreibprüfung auf Webseiten

Automatisierte Rechtschreib- und Grammatikprüfung gehört in Textverarbeitungsprogrammen inzwischen zur Standardausstattung – doch die Rechtschreibung einer Webseite automatisch zu überprüfen, war bisher relativ umständlich. Einen ersten Schritt in diese Richtung geht Google Chrome mit einer integrierten Prüfung in mehrzeiligen Eingabefeldern (textarea). Nun gibt es einen Dienst, der dies auch für ganze Webseiten möglich macht..­.­.

Telefonnummern in Links - ein Sicherheitsrisiko?

Vor wenigen Wochen berichtete ich darüber, wie man seinen Besuchern ermöglicht, auf mobilen Endgeräten durch Antippen auf eine Telefonnummer die Telefon-App zu öffnen. Nun ist eine Möglichkeit aufgetaucht, ohne Zutun des Anwenders über derartige Links die SIM-Karte unwiderruflich zu sperren oder das Gerät auf Werkseinstellungen zurückzusetzen..­.­.

Interessante E-Mail-Kuriositäten

Sollten Domainnamen und E-Mail-Adressen immer kleingeschrieben werden, um sicherzugehen, dass man auch dort hingelangt, wo man hin will? Oder ist dies völlig irrelevant? Die Mail-Server von Google haben beispielsweise kuriose Einstellungen mit interessanten Auswirkungen, die ich im folgenden Artikel kurz vorstellen werde..­.­.

Design der Börsenkurse in den Tagesthemen

Aufmerksam verfolge ich die Gestaltung diverser Sendungen im deutschen Fernsehen. Kaum eine Sendung behält dabei ihr Corporate Design dauerhaft. Das allabendliche Ritual der Versammlung vor dem Fernsehbildschirm um 22:15 Uhr zu den Tagesthemen löst bei mir in letzter Zeit Bauchschmerzen aus: Bei der Vorstellung der aktuellen Börsenkurse wird seit einigen Monaten eine völlig verwirrende Farbgestaltung gewählt..­.­.

Telefonnummern richtig verlinken

Optimiert man den eigenen Webauftritt für mobile Endgeräte, sollte man nicht nur auf verschiedene Bildschirmgrößen, optimierte Ladezeiten und Besonderheiten in der Bedienung (wie Hover-Effekte) achten, sondern auch auf die besonderen Fähigkeiten der Devices eingehen. Dazu gehört (manch einer hat es vielleicht vergessen) auch das telefonieren..­.­.

Duplicate Content auf Blogs

Gleicher Inhalt auf verschiedenen Webseiten wird von Google in vielen Fällen abgestraft — trotzdem ist der Google-Algorithmus intelligent und erkennt, ob es sich um gleichbleibende Elemente in Header und Footer handelt oder ganze Testpassagen doppelt unter verschiedenen URLs erreichbar sind. Spannend ist die Frage, wie Google mit Blogartikel-Übersichtsseiten umgeht..­.­.

Sicherheit von WordPress erhöhen

Die Sicherheit des derzeit populärsten Content-Management-Systems Wordpress kann durch das Drehen an zwei kleinen Stellschrauben signifikant erhöht werden. Dazu sind nur 5 Minuten und zwei Zeilen Code nötig. Zwar kann die Problematik auch mit einer Vielzahl von Plugins behoben werden können, ich beschränke mich hier jedoch bewusst auf pluginfreie Lösungen..­.­.