Das Doomsday-Argument

Unter der Annahme, dass die Anzahl \(Y\) aller Menschen, die jemals geboren wurden und irgendwann geboren werden, begrenzt ist, sei \(x\) Deine absolute Position vom Beginn der Liste. Dann ist \(0 < \frac{x}{Y} \leq 1\). Wir können nun mit einer Wahrscheinlichkeit von \(95\%\) sagen, dass Du unter den letzten \(95\%\) aller jemals geborenen Menschen bist, also \(0,05 < \frac{x}{Y} \leq 1\) und damit \(Y < \frac{x}{0,05} = \frac{100 \cdot x}{5} = 20 \cdot x\).

.­.­.

Trinkerparadoxon

Der folgende Satz ist als das "Trinkerparadoxon" bekannt: "Es ist jemand in der Kneipe, sodass wenn er oder sie trinkt, dann trinken alle in der Kneipe." Dabei spielt es keine Rolle, ob diese eine Person andere dazu anstiftet, zu trinken oder eine andere Hintertüre existiert, wie wir gleich sehen werden. Es handelt sich um ein schönes Beispiel aus der mathematischen Prädikatenlogik.

.­.­.

Zahlenraten

Ein Junge denkt sich eine Zahl aus, die \(1\), \(2\) oder \(3\) ist, und ein Mädchen darf dann nur eine Frage zu dieser Zahl stellen. Der Junge kann nur mit "Ja", "Nein" oder "Ich weiß es nicht" antworten. Das Mädchen schafft es durch eine geschickte Fragestellung, die korrekte Zahl, an die der Junge gedacht hat, zu nennen, nachdem der Junge ihr geantwortet hat. Wie lautet ihre Frage?

.­.­.

Schwarzes Loch

Die Zahl \(4\) wird auch als Zahl des Schwarzen Lochs bezeichnet, die alles in sich verschluckt. Man denke an ein beliebiges Wort, einen Namen, eine Sache, etc. das einen zufällig in den Sinn kommt – zum Beispiel hat das Wort "Donaudampfschifffahrtsgesellschaft" vierunddreißig Buchstaben. Nun beginnt das kleine Gedankenexperiment, bei dem wir immer am Ende bei der \(4\) landen werden.

.­.­.

Gegenstand ohne Ursprung

Stell Dir vor, Du erhältst eines Tages ein mysteriöses Paket ohne Absender. Neugierig öffnest Du das Paket und findest einen Ring, den Du Deiner Tochter schenkst. Jahrzehnte später ist sie es, die mit Hilfe eines Wurmlochs Gegenstände in die Vergangenheit senden kann. Sie tut das mit dem Ring, den sie einst von Dir bekommen hat, eingepackt in einem Paket, dass sie an Dich adressiert. Die Frage ist: Woher kommt der Ring?

.­.­.

CI mit GitHub Actions

Als Alternative zum hoch geschätzten Travis CI bietet sich seit geraumer Zeit auch GitHub Actions an, das als Continuous Integration Tool sehr gut auf der Code-Plattform GitHub integriert ist und inzwischen sehr stabil läuft. GitHub Actions basieren auf YAML-Konfigurationsdateien, die in dem Repository abgelegt werden, in dem der Workflow ausgeführt werden soll.

.­.­.

Stein's Paradox

1961 veröffentlichten James und Stein das Paper "Estimation with Quadratic Loss". Man nehme normalverteilte Daten mit einem unbekannten Mittelwert \(\mu\) und Varianz \(1\). Wählt man nun einen zufälligen Wert \(x\) aus diesen Daten und muss auf Basis dessen den Mittelwert \(\mu\) schätzen, ist intuitiv \(x\) ein vernünftiger Schätzwert für \(\mu\) (da eine Normalverteilung vorliegt, befindet sich das zufällig gewählte \(x\) wahrscheinlich in der Nähe von \(\mu\)).

.­.­.

Zugriff mit PHP auf Exchange/Office 365

Lange angekündigtnun Realität: Microsoft hat die Authentifizierung per Passwort für bestimmte Protokolle in Exchange Online ab September 2022 zu Gunsten von oAuth2 abgeschaltet. Die GitHub Issues vieler Libraries und Backup-Scripte verdeutlichen, dass die Umstellung viele Administratoren kalt erwischt hat. Nachfolgend zeigen wir einen Weg, wie man mit Hilfe von oAuth2 per PHP via IMAP weiterhin auf die Inhalte seines Exchange-Postfachs zugreifen kann.

.­.­.

UUIDs in Datenbanken

UUIDs (Universally Unique Identifiers) ​​sind 128-Bit-Werte, die u.a. in Datenbanken dazu verwendet werden, um Tabelleneinträge eindeutig zu identifizieren. Sie werden als hexadezimale Zeichenfolge, die in fünf durch Bindestriche getrennte Gruppen unterteilt ist, dargestellt (Beispiel: 09fe49b3-4d2b-471c-ac04-36c9e706b85f). Es gibt zahlreiche Diskussionen über die Vor- und Nachteile von UUIDs in Datenbanken – in verteilten Systemen sind sie unumgänglich.

.­.­.

Git Historie bereinigen Teil 2

Sensible Daten oder zu hoher Speicherplatzverbrauch: Es gibt gute Gründe den Wunsch zu hegen, die Git-Historie zu verändern. In diesem Blogbeitrag habe ich erklärt, wie man mit Hilfe von BFG Dateien aus der Git-Historie tilgt. Ein Schwachpunkt von BFG ist die fehlende Unterstützung von direkten Pfaden, sodass man nicht gezielt Dateien oder Ordner in Unterordnern aus der Historie entfernen kann. Damit ist es Zeit, alternative Lösungen anzusehen.

.­.­.

Memory Limit in WordPress

tl;dr: Manuell gesetzte Wert oder die Default-Werte von WP_MEMORY_LIMIT/WP_MAX_MEMORY_LIMIT haben keinen Effekt, wenn WP_MEMORY_LIMIT/WP_MAX_MEMORY_LIMIT kleiner oder gleich als das Memory Limit von PHP (im Weiteren memory_limit genannt) ist. Sie dienen dazu, zu niedrige Werte von memory_limit dynamisch auf ein empfohlenes Minimum anzuheben.

.­.­.

Quick Tip: Iframe modifizieren

Wenn man einen Iframe eines Drittanbieters (zum Beispiel ein Widget) einbindet, kann man weder mit CSS noch mit JavaScript (aufgrund der sog. Same-origin policy) auf dessen Inhalt zugreifen. Es gibt jedoch ein sehr einfaches Verfahren, um trotzdem beliebigen Code (auch in weiteren Dateien, die innerhalb des Iframes nachgeladen werden) zu modifizieren. Dazu leitet man die URL durch einen eigenen PHP-Proxy und modifiziert den Inhalt nach Belieben.

.­.­.

Coins in der ANTON-App

ANTON gehört zu den beliebtesten Lernapps für Schüler der 1.-10. Klasse. Der Gamification-Aspekt durch das Erwerben von Münzen ("Coins") mag auf den ersten Blick für Erwachsene befremdlich wirken – die Motivation nicht nur meiner Kinder wird dadurch aber spürbar vervielfacht. Es wird sich sogar ein kleines "Polster" an Münzen angespart, das man ja nicht anfasst.

.­.­.

Über die Robustheit der IBAN

Die deutsche IBAN besteht bekanntlich aus Ländercode (DE), einer zweistelligen Prüfziffer (gemäß ISO 7064), der Bankleitzahl (8-stellig) sowie der Kontonummer (inkl. Unterkontonummer, 10-stellig, fehlende Stellen mit führenden Nullen aufgefüllt) und ist damit 22-stellig. Zur Berechnung der Prüfziffer wird zunächst die sog. BBAN (Bankleitzahl und Kontonummer) sowie der numerischen Länderkennung \(1314\) für Deutschland sowie der Prüfziffer \(00\)) gebildet.

.­.­.

Mathematik im Spiel Dobble

Beim letzten Familienabend wurde das Spiel Dobble (in der Harry Potter Edition) begeistert von den Kindern zu Tisch gebracht. Nach der 5ten verlorenen Runde (ohne sichtbaren Treffer meiner Karte mit der Spielkarte) wurde mir unter meinem Erstaunen mitgeteilt, dass jeder Spieler in jeder Runde immer einen Treffer finden kann. Doch meine Ungläubigkeit wurde nur mit weiteren, verlorenen Runden quittiert – die Kinder waren einfach schneller.

.­.­.

Bitcoin Blockzeit

Sie wissen: Die zu erwartende Zeit zwischen zwei Bitcoin-Blöcken beträgt im Schnitt \(10\) Minuten. Nun tätigen Sie eine wichtige Bitcoin-Transaktion und warten gespannt, ob und wann sie im nächsten Block auftaucht:

e50bfacc95975a4e7545d83d8954645f

.­.­.

Corona-Mathematik

Im RKI-Wochenbericht vom 11.11.2021 ist auf S. 22 aufgeführt, dass \(36\%\) der über 60-jährigen Corona-Patienten auf der Intensivstation bereits vollständig geimpft waren. In dieser Altersgruppe waren zu diesem Zeitpunkt \(87\%\) vollständig geimpft (siehe S. 18).

.­.­.

Berechnung des SISTRIX Sichtbarkeitsindex

Das Tool SISTRIX ist neben Xovi das in Deutschland am meisten genutzte Analyseprogramm im Bereich SEO. Der Sichtbarkeitsindex hat sich dabei zu einem Quasi-Standard für die Sichtbarkeit einer Seite in der Google-Suche etabliert. Die Parameter, die in dessen Berechnung mit einfließen, sind zwar beispielsweise hier und hier und hier und hier und hier erläutert, eine genaue Berechnungsformel dazu wird aber offiziell nicht veröffentlicht. Es folgen die Resultate meiner halbjährigen persönlichen Recherche, die weder Anspruch auf Vollständigkeit noch Richtigkeit erheben.

.­.­.

Dezimalbrüche

Endliche Dezimalzahlen bezeichnet man als Dezimalbrüche, denn sie sind eine andere Darstellung für Brüche mit Zehnerpotenzen im Nenner. So ist:

$$\frac{z}{n} = \frac{q_1}{1} + \frac{q_2}{10} + \dots + \frac{q_k}{10^k}$$

mit \(k \in \mathbb{N}\) und \(q_k\) der \(k-1\)-ten Stelle rechts nach dem Komma.

.­.­.

Quick Tip: Automatisch Node-Version wechseln

Zum schnellen Installieren und Wechseln von Node-Versionen empfiehlt sich der Einsatz von nvm. Will man in einem Projekt explizit die benötigte Node-Version vorgeben, legt man eine Datei namens .nvmrc mit der genauen Versionsnummer (z.B. "12.10.0") in denselben Ordner, in dem die package.json liegt. Wechselt man nun in den Ordner, führt folgende Erweiterung der Datei ~/.bash_profile für die Bash den Befehl nvm use aus, der diese Version automatisch einstellt:

fe497e1c7f9f1547263eb3bffe15f9f6

.­.­.

Container Queries schon heute nutzen

Seitdem es responsives Webdesign gibt, fragen Entwickler nach der Möglichkeit, DOM-Elemente basierend auf der Ihrer eigentlichen Größe und nicht auf der Größe des Viewports im Browser (mit Hilfe von Media Queries) zu gestalten. In der Tat sind Container Queries (anfangs Element Queries) wahrscheinlich die am häufigsten geforderte CSS-Funktion, die es in Browsern immer noch nicht gibt.

.­.­.

Git Historie bereinigen

Sensible Daten wie Passwörter sollten in .env-Dateien liegen und wenn möglich nicht in Git-Repositories landen. Doch wahrscheinlich ist es jedem von uns schon mindestens einmal aus Versehen passiert: Schnell ein nettes Google Maps JS API Script auf GitHub Gists (als "public") veröffentlicht und dabei den eigenen privaten Maps-API-Key aus versehen nicht verschleiert.

.­.­.

Mit clip-path SVGs aus Bildern ausstanzen

Will man ein Bild mit Hilfe eines SVGs ausstanzen, empfiehlt sich der Einsatz der CSS-Property clip-path. Das folgende Script löst etwas holprigen Barrieren: Die SVGs können mit Hilfe von Illustrator abgespeichert werden, man kann die (relative oder absolute) URL eines SVGs angeben (Chrome unterstützt bis dato nativ ausschließlich Inline-SVGs) und der Ausschnitt ist außerdem komplett responsive.

.­.­.

Quick Tip: WP_Query & mehrzeilige Felder

Mit Hilfe des Attributs meta_query in der mächtigen WordPress-Klasse WP_Query lassen sich Posts filtern, die bestimmte Werte in Ihren Meta-Feldern haben. Hat man ein mehrzeiliges Meta-Feld (z.B. mit Hilfe von Advanced Custom Fields) angelegt und will nur Posts finden, die einen bestimmten Wert in diesem durch Zeilenumbrüche getrennten Feld enthält, empfiehlt sich die REGEX-Welt von MySQL.

.­.­.

Adobe Animate Animationen nativ einbinden

Ich habe in einem vergangenen Artikel geschildert, wie man über den Umweg eines APNG-Exports Animationen aus Adobe Animate einfach in eine Webseite einbinden kann. Es gibt auch den native Weg über den HTML5 Canvas Export, aber wer schon einmal damit gearbeitet hat, wird feststellen, dass es dort an allen Ecken und Enden klemmt (unzureichende responsive Unterstützung, umständliches Einbinden in bestehende Webseite, keine unterschiedlichen Frameraten pro Animation, usw.). Abhilfe schafft hier die Library adobe-animate-embed.

.­.­.

Google Maps ohne API Key

Normalerweise arbeitet man beim Einbinden von Google-Maps-Karten mit der Maps JavaScript API, die einen API-Key voraussetzt und bei höheren Zugriffszahlen nicht zu unterschätzende Kosten verursachen kann. Dabei gibt es tolle Alternativen wie mapbox oder OpenStreetMap, die aber noch nicht die Featurevielfalt von Google erreichen. Google selbst bietet auch einen Weg ohne API Key über die Teilen-Funktion an, die wir für unsere Zwecke nutzen können.

.­.­.

Adobe Animate APNG Export

Der Browser-Support für animierte PNG Dateien ist inzwischen so gut, sodass Animationen, die mit Animate CC angefertigt wurden, mit einfachen Mitteln zu APNG exportiert und dann in einem simplen <img>-Tag in eine Webseite eingebaut werden können. Dies stellt eine einfache und qualitativ gute Alternative zum Veröffentlichungsweg in Animate CC, der JavaScript erzeugt, dar. Nachfolgend sind die Schritte beschrieben, die man dazu tun muss.

.­.­.

WordPress Suche erweitern

Will man die native WordPress-Suche um beispielsweise Meta-Felder erweitern, empfiehlt sich ein Blick in die gefeuerten Filter. Damit die Paginierung weiterhin funktioniert und man auch zukünftige Verbesserungen in der Suche nicht aushebelt, empfiehlt sich der Hook posts_search. Folgender Code erweitert unter zu Hilfenahme der Funktionen REGEXP und ExtractValue diese Suche um Posts, die in allen Meta-Feldern einen der eingegebenen Suchwörter beinhaltet.

.­.­.

Gödels Meisterwerk

Als Kurt Gödel 1931 seine berühmten Unvollständigkeitssätze veröffentlichte, führte das zu einer Erschütterung der Grundlagen der mathematischen Logik: Er widerlegte, dass alle Axiome, die man als mögliche Grundlage aufstellen kann, unweigerlich unvollständig sind, um alle Aussagen über Zahlen zu beweisen – und zerstörte den Traum von Hilbert, die Widerspruchsfreiheit der mathematischen Theorie zu beweisen.

.­.­.

WhatsApp per API nutzen

Trotz aller Datenschutzbedenken ist WhatsApp nach wie des Deutschen liebste Messenger-App. Facebook hat neben der speziellen WhatsApp Business App auch eine offizielle Schnittstelle, die WhatsApp Business API geschaffen, um auch für Unternehmen interessanter zu werden. Will man programmatisch WhatsApp-Nachrichten aus seiner Webanwendung heraus versenden, bieten sich daneben aber auch andere Wege an.

.­.­.

Seite per CSS hinter Overlay weichzeichnen

Setzt man Elemente wie Overlays ein (was in Zeiten von GDPR-Aktionismus die Regel ist) und will den Bereich hinter dem Overlay beispielsweise weichzeichnen, stößt man häufig auf das Problem des Stacking Contexts. Hat man nämlich beispielsweise absolut oder fixiert positionierte Elemente, werden diese plötzlich anders dargestellt als ohne angewendeten Filter. Doch es gibt Abhilfe.

.­.­.

Quick Tip: Split Testing mit Apache

Man muss kein mächtiges Tool wie Google Optimize für einfache URL-Split-Tests bemühen, sondern kann auch den Apachen per .htaccess lösen. Das folgende Code-Snippet verteilt für die beiden Seiten https://vielhuber.de/test1.php (Variante 1) und https://vielhuber.de/test2.php (Variante 2) dessen Besucher gleichmäßig auf beide Versionen. Die Randomisierung erfolgt auf Basis der aktuellen Serverzeit.

.­.­.

Über die Notation verzweigter Funktionen

Bei der Notation von Funktionsdefinitionen mit Fallunterscheidung verwendet man geschweifte Klammern. Wir gehen der einfachen Frage nach, ob man diese Darstellung auch eliminieren kann und die Funktion auf eine Notation zurückführen kann, die ohne sie auskommt. Lässt sich beispielsweise die Funktion

$$f: \mathbb{R} \to \mathbb{R}, f(x) = \left\{\begin{matrix} 42, & \text{falls } x = 0 \\ x, & \text{sonst} \end{matrix}\right.$$

mit Hilfe der vier Grundrechenarten mit Hilfe eines einzeiligen Terms darstellen?

.­.­.

Datumsreihen in Google Sheets

Bei der Visualisierung von Daten in Google Sheets stößt man auf das Problem, dass die \(x\)-Achse bei Textwerten (wie beispielsweise bei Kalenderwochen) die fehlenden Lücken nicht automatisch auffüllen kann. Um das Problem zu lösen, generiert man eine fortlaufende Datumsreihe, zählt die vorkommenden Zellen selbst und visualisiert im Anschluss die kumulierten Summen.

.­.­.

Quick Tip: PHP clearstatcache

Finde den Fehler:

72aaa2dbd201d49fc2ee429ebf68f15b

.­.­.

Google Translation API Hacking

Google bietet im Rahmen seiner Google Cloud die Google Translation API mit einer nutzungsbasierten Kostenstruktur an. Daneben gibt es eine undokumentierte, ohne Key nutzbare API, die jedoch schon nach wenigen Requests den Dienst verweigert. Bei der Benutzung der Webseiten-Übersetzungsfunktion von Google Chrome fällt auf, dass hier ohne spürbare Begrenzung Seiten in sehr guter Qualität übersetzt werden können.

.­.­.

Quick Tip: Git Auto-Tagging

Verknüpft man Github mit Composer, ist zwingend die Vergabe einer Versionsnummer via git tag erforderlich. Folgender Kommandozeilenbefehl ermittelt den aktuellen Tag und erhöht ihn (laut SemVer) um eine Versionsnummer. So folgt beispielsweise nach 1.0.9 die Version 1.1.0. Ist kein Tag vergeben, wird die Version automatisch mit 1.0.0 getaggt. Tools wie flimsy oder auch git hooks verkürzen diese Zeichenwüste.

8cd852c96ec1e60e8a5ac1f3614b2397

.­.­.

MySQL-Trigger editieren

MySQL bietet leider keine Funktion ALTER TRIGGER an. Um einen bestehenden Trigger zu editieren, muss man diesen zunächst löschen und dann neu generieren. Das CREATE TRIGGER Statement lässt sich indirekt über das information_schema auslesen. Damit können wir über einen Umweg Triggers ändern. Dazu nimmt man im Ergebnis des folgenden SELECT-Befehls (vorher Datenbank- und Triggername ändern) seine Änderungen vor und führt das Query aus.

.­.­.

Change-Events in VanillaJS auslösen

VanillaJS ist seit ES6 quasi in allen Bereichen dem Urgestein jQuery ebenbürtig und inzwischen weit überlegen. So lohnt es sich, Legacy-Code nach und nach weg von jQuery zu migrieren. Beim Auslösen von manuellen Change-Events muss man jedoch aufpassen. So triggert document.addEventListener beispielsweise nicht auf jQuery.change(). Die nachfolgende Übersicht fasst die Besonderheiten zusammen.

.­.­.

Cookies kontrollieren mit PHP und JS

Das Setzen von Cookies durch eigene oder fremde Skripte lässt sich sowohl mit Hilfe von PHP und JavaScript fein steuern. Obwohl dies keine ausreichende Lösung für die Umsetzung von Cookie-Lösungen nach dem Gerichtsurteil gegen Planet49 darstellt (hier ist es entscheidend, dass Tracking-Tools wie Google Analytics gar nicht erst nicht mittracken und damit in der Folge auch keine Cookies setzen), kann es sinnvoll sein, Cookies generell zu white-/blacklisten.

.­.­.

Geräte per Script deaktivieren in Windows

Um Strom zu sparen oder die eigene Überwachungs-Paranoia zu mindern, empfiehlt es sich, nicht benutzte Geräte am eigenen Rechner komplett vom Strom zu trennen. Geräte wie Soundboxen oder Webcams kann man ganz klassisch über den Geräte-Manager de/aktivieren. Das Ganze funktioniert aber auch per Script. Früher war hierfür der Standardweg devcon. Inzwischen bietet Windows 10 über die PowerShell einen bequemeren Weg, dies zu realisieren.

.­.­.

Skype Background Blur

Skype hat eine nette, etwas versteckte Funktion: Bei Videoübertragungen lässt sich durch Klick auf den Video-Button und der Funktion "Meinen Hintergrund weichzeichnen" ganz einfach der Hintergrund automatisch unscharf stellen. Mit Hilfe künstlicher Intelligenz funktioniert das mit jeder Kamera auch ohne Tiefeninformationen. Das Ganze wirkt dann professioneller und blendet private oder für das Gespräch unwichtige Dinge im Hintergrund aus.

.­.­.

SVG Export aus Illustrator

Im heutigen Web spielen SVGs eine zentrale Rolle. Sie haben nicht nur Iconfonts verdrängt, sondern bieten auch die Möglichkeit der Manipulation via CSS oder JavaScript. Will man eine Vektorgrafik für das Web aus Adobe Illustrator als SVG abspeichern, sind einige Einstellungen zu treffen, um Fallstricke zu vermeiden und Ladezeiten zu reduzieren, die ich im nachfolgenden Artikel vorstelle.

.­.­.

Project Euler: Lattice paths

Project Euler ist eine Serie von spannenden Programmier-Problemen, die oft einen mathematisch Hintergrund haben. Die Probleme sind oft so gestellt, das man raffinierte Algorithmen entwickeln muss, um in einer vernünftigen Laufzeit zum Ziel zu kommen. Heute lösen wir Problem 15: Lattice paths, bei dem man mit einfachen kombinatorischen Mitteln an die Lösung kommt.

.­.­.

Automatische WordPress-Updates

WordPress hat seit Version 3.7 Background Updates nativ implementiert und automatisch für Minor Releases aktiviert. Man kann mit Hilfe von Filtern das Verhalten genauer steuern, was genau automatisch aktualisiert wird. Eine permanente, vollautomatische Installation aller Minor-, Major-, Plugin-, Theme- und Translation-Updates ist jedoch nicht vorgesehen, jedoch leicht anderweitig zu bewerkstelligen.

.­.­.

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.

.­.­.

Google Sheets: Formeln ausdehnen

Um innerhalb von Google Sheets Formeln auf ganze Spalten auszudehnen, empfiehlt sich der Einsatz der nützlichen Funktion ARRAYFORMULA. Leider funktioniert diese nicht in Kombination mit einigen anderen wichtigen Funktionen wie QUERY oder INDIREKT, weshalb eine komplette Individualprogrammierung der Logik mit Hilfe von Google Apps Script oder alternativ das manuelle Kopieren der Formel bis hin zur letzten Zeile übrig bleibt.

.­.­.

Das Simpson-Paradoxon

Das simpsonsche Paradoxon gehört zu den einfach verständlichen und zugleich verblüffenden Phänomenen der Statistik. Es tritt immer dann auf, wenn Gruppen von Daten einen bestimmten Trend anzeigen, dieser Trend sich jedoch umkehrt, wenn die Gruppen miteinander kombiniert werden. Anhand eines einfachen Beispiels lässt sich das Paradoxon sofort nachvollziehen.

.­.­.

Quick Tip: Google Tag Manager

Der Google Tag Manager hat sich zum De-Facto-Standard für die Einbindung von Tracking-Scripten etabliert. Damit trennt man zum einen die Zuständigkeiten (Online-Marketing vs. Programmierung) sauber ab und kann zum anderen über einen weiteren Deployment-Kanal schnell Trackings aufsetzen und modifizieren. Anbei folgen zwei kleine Tipps für das Aufsetzen von Triggern.

.­.­.

Quick Tip: FRITZ!Box WLAN-Hotspot

Ab FRITZ!OS 07.10 hat man bei ausgefallenem Internet temporär die Möglichkeit, dass die FRITZ!Box den WLAN-Hotspot eines Handys als Fallback nutzt. Die Funktion verbirgt sich unter Internet > Zugangsdaten > Internetanbieter > vorhandener Zugang über WLAN. Die FRITZ!Box arbeitet dann selbst als Router und stellt ein Netzwerk mit eigenem Adressbereich zur Verfügung. Steht das Internet wieder zur Verfügung, stellt man die Einstellung einfach wieder zurück. Ich musste zusätzlich noch die Optionen WLAN > Funknetz > 2,4-GHz-Frequenzband aktiv sowie Internet > Zugangsdaten > IPv6 > IPv6-Unterstützung aktiv anhaken.

.­.­.

Flower of Life

Bei der Blume des Lebens handelt es ich um ein bekanntes, blumenähnliches, geometrisches Muster, das seit tausenden von Jahren in Tempeln, Manuskripten und seit geraumer Zeit in der Popkultur zu finden ist. Auch in der Esoterik spielt das Muster eine Rolle. Wir lassen all das an dieser Stelle außer Acht und konzentrieren uns auf die einfache Konstruktion der geometrischen Form, die sich aus mehreren gleichmäßig verteilten, überlappenden Kreisen zusammensetzt.

.­.­.

E-Mail-Delaying in Outlook

Das asynchrone Kommunikationsmedium E-Mail zählt – aller Unkenrufe rund um Slack und Discord zum Trotz – weltweit zum dominierenden Kommunikationsmedium im geschäftlichen Bereich. Neben Inbox Zero von Merlin Mann gibt es zahlreiche andere Strategien im Umgang mit der täglichen E-Mail-Flut, darunter das sog. E-Mail-Delaying, also die verzögerte Zustellung von E-Mails.

.­.­.

Eine Zahlenspirale

In den letzten Tagen habe ich mich mit der folgenden Frage auf StackExchange über eine Spirale aus Ganzzahlen beschäftigt. Dabei suchen wir eine geschlossene Formel für die Koordinaten des \(n\)-ten Elements in der folgenden Ganzzahl-Spirale, die sich vom Ursprung nach außen hin immer weiter ins Unendliche ausdehnt:

..  9 10 11 12
23  8  1  2 13
22  7  0  3 14
21  6  5  4 15
20 19 18 17 16
.­.­.

Leserechte in Google Sheets

Bei der Arbeit mit Google Sheets lassen sich innerhalb eines Spreadsheets feine, userbasierte Regeln für das Editieren von Tabellenblättern, Spalten und Zeilen festlegen. Leider gibt es keine Möglichkeit, Leserechte einzuschränken. Dies wäre jedoch in vielen Szenarien sehr hilfreich. So zeigt man seinen Kunden nur diejenigen Tickets, die ihn betreffen oder dem Mitarbeiter nur die Projekte, an denen er arbeitet.

.­.­.

Yarn Plug'n'Play

npm ist der Standardpaketmanager für Node.js. Dabei hat Facebook bereits seit längerem eine alternative Paketverwaltungslösung namens Yarn entwickelt. Yarn scheint aus den Github-Readmes als Standardlösung langsam wieder zu verschwinden und die Stats auf der offiziellen Seite zeigen, dass nur ein Bruchteil der Packages durch Yarn durchgeführt werden. Trotzdem lohnt sich der Blick über den Tellerrand.

.­.­.

PDF in LaTeX konvertieren


Das Textsatzsystem \(\TeX\) wurde 1977 vom legendären Donald E. Knuth entwickelt. Das Softwarepaket \(\LaTeX\) gehört dabei heutzutage immer noch zum Standard-Repertoire beim Erstellen von wissenschaftlichen Arbeiten. Mit den folgenden beiden Tools lassen sich bereits generierte PDFs sowie handschriftliche Notizen vollautomatisch in TeX umwandeln. Die Ergebnisse sind dabei durchaus vielversprechend.

.­.­.

Das Simulationsargument

Das Simulationsargument von Nick Bostrom ist bestechend einfach und klar formuliert. Es versucht nicht zu beweisen, dass wir in einer Simulation leben, sondern formuliert stattdessen elegant drei Möglichkeiten, von denen eine wahr sein muss. Auch Elon Musk vertritt eine ähnliche These, wodurch die Idee einer breiten Öffentlichkeit bekannt wurde. Das offizielle Paper ist dabei schon über 14 Jahre alt und ebenso viele Seiten kurz. Dabei ist die zentrale Aussage leicht verständlich und kompakt.

.­.­.

Kritischer Bug beim Einsatz von WPML + ACF

Die mächtigen Plugins WPML für Mehrsprachigkeit und Advanced Custom Fields für eigene Felder gehören bei vielen Installationen zur Grundausstattung. Ärgerlich ist es, wenn es im Zusammenspiel zu Fehlfunktionen mit Datenverlust kommt. Die Bugreports zu dem Thema sind schon einige Jahre alt und unbeantwortet (hier und hier und hier und hier und hier). Ich habe mir das Problem nun einmal genauer angesehen.

.­.­.

Dateiupload im Facebook In App Browser

Auf einigen Android-Telefonen verhält sich sowohl der Facebook- als auch der Instagram-In-App-Browser (Stand heute) fehlerhaft, wenn innerhalb einer beworbenen oder verlinkten Landing-Page ein Upload-Feld das accept-Attribut angegeben hatte. Der Button war dadurch ohne Funktion. Öffnet man die Seite im externen, normalen Browser außerhalb der Facebook-App, ist alles in Ordnung. Das ist ärgerlich (zumal schon lange reportet), lässt sich aber mit einem Workaround lösen.

.­.­.

Chrome Devtools: DOM-Elemente verschieben

Die Developer Tools von Google Chrome gehören zu den mächtigsten am Browsermarkt. Monatlich prasseln neue Features herein, die Google in komprimierter Form auf YouTube vorstellt. Doch oft sind es die kleinen Dinge des Lebens, die erfreuen. Will man im Google Chrome DOM-Elemente löschen, gelingt das mit der Entfernen-Taste. Doch erst heute habe ich gemerkt, dass man DOM-Elemente auch einfach per Drag & Drop verschieben kann:

.­.­.

Quick Tip: git status --r

Eine goldene Regel im git-Universum lautet: „Do commit early and often“. War die Nacht etwas länger oder will man einfach nur einen Überblick über die aktuelle Situation auf dem eigenen Rechner, führt der Befehl

d8a38f92d0baa14f9d4568826c13ad46

ein "git status" für alle Repositories, die sich im aktuellen Ordner oder in einem beliebigen Unterordner befinden, aus und kumuliert die Werte in einer schönen Übersicht:

.­.­.

LAMP-Stack im Windows Subsystem for Linux

Auf der Suche nach der optimalen Entwicklungsumgebung bieten sich unter Windows 10 neben Komplettlösungen wie XAMPP, WAMP und MAMP, einer nativen Installation von Hand auch Virtualisierungs-Lösungen wie Vagrant (Scotch Box) und Docker (Devilbox, Laradock) an. Doch an meinen Anforderungen wie freier Konfigurierbarkeit, echte Wildcard-SSL-Zertifikate, Zugriff von allen Endgeräten im lokalen Netzwerk aus sowie hohe Stabilität und Performance scheiterten alle Lösungen – bis auf eine.

.­.­.

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.

.­.­.

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.

.­.­.

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.

.­.­.

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.

.­.­.