Verwenden von declare strict_types in PHP

In PHP gibt es die Möglichkeit den type hint beim Abruf von Methoden und Funktionen für die Eingabe- aber auch die Rückgabeparameter festzulegen. Dabei gibt es allerdings noch geringfügige Unschärfen, da diese bei skalaren Datentypen nicht restriktiv verwendet werden.

Das bedeutet, wenn eine Zahl als String übergeben wird und der type hint ein Integer verlangt, dass dieser Aufruf dennoch valide ist.

<?php

function hello(integer $world) {
  echo $world;
}

hello("1000");

Dies gilt auch für andere Varianten. Da dies formal gesehen jedoch falsch ist kann eine absolute korrekte Typdeklaration und -überprüfung dessen erzwungen werden. Dafür wird zu Beginn der betroffenen PHP-Datei folgender Aufruf abgesetzt:

<?php

declare(strict_types=1);

function hello(integer $world) {
  echo $world;
}

hello("1000");

Damit ist es nun mit dem oben genannte Beispiel nicht mehr möglich das Skript auszuführen und es folgt in diesem Beispiel beim Abruf der Methode eine TypeError Fehlermeldung:

TypeError: Argument 1 passed to test() must be of the type int, string given

Hierbei ist es wichtig anzuerkennen, dass diese Defintion nur für die aktuelle Datei gilt. Dieses declare kann nicht global gesetzt und Projektübergreifend verwendet werden. Nicht auszudenken wie sich diese Einstellung auf vendor-Produkte anderer Projekte auswirken würde.

Es macht meiner Einschätzung nach Sinn diese Einstellung in Klassen zu verwenden bei denen eine ganz klare Typisierung für z.B. eine sichere Berechnung von Zahlen notwendig ist. Pauschal diese Definition in jede Klasse zu integrieren lehen ich allein aus Gründen der besseren Lesbarkeit und Wartung ab.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Installing sophos-xg-firewall on proxmox just failed with “error installing firmware”

I tried to install Sophos XG Firewall on a virtual machine on my proxmox system. But it failed during the installation with the error message “error installing firmware“.

After trying some different properties I found out that the memory size of the VM need to set on 2048 MBytes or higher.

After I’ve done that configuration on my host the server software was perfectly installed as a virtual machine.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Verzeichnis unter Windows auf der CLI Kommandozeile löschen

Ich möchte gerne unter Windows von der Kommandozeile heraus ein Verzeichnis löschen. Dafür hält Windows den Command rmdir für die Ausführung als CLI-Befehl bereit.

Man kann den Befehl in jedem beliebigen Verzeichnis ausführen

Leeres Verzeichnis auf Kommandozeile löschen

Um ein leeres Verzeichnis zu löschen führt man folgenden Befehl aus:

rmdir helloworld

Nicht leeres Verzeichnis auf Kommandozeile löschen

Um ein Verzeichnis mit beliebigen Inhalten zu löschen führt man folgenden Befehl aus:

rmdir /S helloworld

Verzeichnis auf Kommandozeile ohne Rückfrage löschen

Um ein Verzeichnis mit beliebigen Inhalten und ohne Rückfrage zu löschen führt man folgenden Befehl aus:

rmdir /S /Q helloworld

Verzeichnis mit Leerzeichen auf der Kommandozeile löschen

Um ein Verzeichnis mit Leerzeichen im Namen, beliebigen Inhalten und ohne Rückfrage zu löschen führt man folgenden Befehl aus:

rmdir /S /Q "hello world"

Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Linux Konsole: Dateien löschen die älter als X Tage sind

Ich möchte unter Linux Dateien löschen die älter als eine beliebige Anzahl von Tagen sind. Dies kann man mittels dem Kommando find ganz einfach lösen.

Mit diesem folgenden Beispiel lösche ich im Verzeichnis /var/log/httpd/ alle Dateien mit dem Muster access*.log und die älter als 180 Tage alt sind:

find /var/log/httpd/access*.log -type f -mtime +180 -delete &> /dev/null

Die Ausgabeumleitung habe ich an dieser Stelle noch zusätzlich ergänzt. Mit diesem Kniff wird im besonderen bei nicht vorhandenen Dateien ein hieraus resultierenden und in meinen Augen unnötiger Hinweis seitens find verworfen.

Bevor ich diesen Befehl auf der Konsole absetze führe ich selbigen gelegentlich ohne der Option delete und ohne meiner hinzugefügten Ausgabeumleitung aus. Damit stelle ich vor dem Löschen sicher, dass auch die von mir gewünschten Dateien enthalten sind:

find /var/log/httpd/access*.log -type f -mtime +180


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

MySQL Ausgabe mit vielen Spalten formatieren

Es passiert mir schon einmal öfters, dass ich in der Konsole eine SQL-Query absetze, die mehrere Spalten beinhaltet. Dabei sorgt die hohe Menge an Spalten in der Ausgabe für einen Zeilenumbruch der Standardformatierung von MySQL und die generierten Tabellenansichten sind nicht mehr übersichtlich. Solange das Fenster sich breit genug ziehen lässt ist dies grunsätzlich nicht problematisch. Jedoch bringt diese Formatierung einen schnell an die Grenzen, weil schon allein die Dateninhalte einer einzigen Spalte mal länger als eine Zeile sein können. Und spätestens dann wird es richtig ekelig zu erkennen welche Eintrag in welcher Spalte einer Zeile wo zu verorten ist.

Die Lösung ist einfacher als man glaubt, denn schon mit den Standardboardmitteln der MySQL Konsole lässt sich die Ausgabe der Spalten formatieren. Ein Resultset welches die für die aktuelle Ansicht einfach zu breit in der Ausgabe ist sieht exemplarisch wie folgt aus:

mysql> select now() as date_1, now() as date_2, now() as date_3, now() as date_4, now() as date_5, now() as date_6, now() as date_7, now() as date_8, now() as date_9 union all select now() as date_1, now() as date_2, now() as date_3, now() as date_4, now() as date_5, now() as date_6, now() as date_7, now() as date_8, now() as date_9;

+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| date_1              | date_2              | date_3              | date_4              | date_5              | date_6              | date_7              | date_8              | date_9              |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
| 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 |
| 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 | 2018-09-15 08:53:45 |
+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+
2 rows in set (0.00 sec)

Das Ergebnis sieht ziemlich kryptisch aus – oder?

Um diese Ausgabe übersichtlicher darzustellen gibt es die Option \G. Diese Option wird der vorhandenen Query einfach angehangen. Sodann wird die Ausgabe der Query jede Zeile des Resultsets in einem separaten Block darstellen. Jede Spalte Pro Block wird in einer eigenen Zeile inklusive einem Spaltenlabel ausgegeben.

Für das obige Beispiel sieht das Ergebnis in der Konsole dann wie folgt aus:

mysql> select now() as date_1, now() as date_2, now() as date_3, now() as date_4, now() as date_5, now() as date_6, now() as date_7, now() as date_8, now() as date_9 union all select now() as date_1, now() as date_2, now() as date_3, now() as date_4, now() as date_5, now() as date_6, now() as date_7, now() as date_8, now() as date_9 \G;

*************************** 1. row ***************************
date_1: 2018-09-15 08:54:15
date_2: 2018-09-15 08:54:15
date_3: 2018-09-15 08:54:15
date_4: 2018-09-15 08:54:15
date_5: 2018-09-15 08:54:15
date_6: 2018-09-15 08:54:15
date_7: 2018-09-15 08:54:15
date_8: 2018-09-15 08:54:15
date_9: 2018-09-15 08:54:15
*************************** 2. row ***************************
date_1: 2018-09-15 08:54:15
date_2: 2018-09-15 08:54:15
date_3: 2018-09-15 08:54:15
date_4: 2018-09-15 08:54:15
date_5: 2018-09-15 08:54:15
date_6: 2018-09-15 08:54:15
date_7: 2018-09-15 08:54:15
date_8: 2018-09-15 08:54:15
date_9: 2018-09-15 08:54:15
2 rows in set (0.00 sec)

Damit wird es möglich ziemlich einfach visuell zu erfassen welche Datenausgabe zu welcher Spalte gehört.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

stderr und stdout auf der Bash umleiten

Wenn ein Programm auf der Linux-Konsole gestartet wird gibt es zweierlei Ausgabedatenströme. Dies sind zum einen die stdout für Ausgaben mit denen das Programm arbeitet und zum anderen stderr für Ausgaben welche einem Fehlverhalten dessen zugrunde liegen.

Diese beiden Ausgabedatenströme kann man aus diversen Gründen zusammenlegen oder in eine andere Richtung umleiten. Dies gilt für diverse Kombinationen mit folgenden Direktiven:

Umleiten von Ausgaben in stderr nach stdout

echo "Hello World" 2>&1

Mit dieser Angabe werden alle Fehlerausgaben auf stdout zugleich mit stderr auf der Konsole zusammengefasst ausgegeben. Dies ist zumeist die häufigst verwendete Variante der Ausgabeumleitung. So kann der Bediener der Konsole alle Ausgaben des Programms unmittelbar sehen.

Umleiten von Ausgaben in stdout nach stderr

echo "Hello World" 1>&2

Alle Ausgaben werden nach stderr geschrieben. Damit werden keinerlei Ausgaben auf stdout ausgegeben und so bleibt die Konsole leer. Dies kann erwünscht sein, sofern den Bediener die Ausgaben nicht interessieren oder die Ausgaben ohnehin von dem ausführenden Programm nicht berücksichtigt werden.

Umleiten von stderr und stdout in eine Datei bzw. Datenstrom

Manchmal interessieren einen die Ausgaben schlicht und ergreifend nicht, da es die Verarbeitung nicht erfordert. Also können Ausgaben jeglicher Art ignoriert werden durch:

undefinedprogram &> /dev/null

Oder automatisierte Prozesse erfordern das Loggen aller Ausgaben in einer Datei. Diese können mit dieser Bash-direction zusammengefasst in eine separater Datei weggeschrieben werden.

undefinedprogram &> combined_output.log

Umleiten von stdout in eine Datei

Die wohl am häufigsten verwendete Verwendung um alle Standardausgaben eines Programms in eine Datei zu schreiben.

echo "Hello World" > output.log

Oder die Verwendung des doppelten > Zeichens um die Ausgaben einer bestehenden Datei anzuhängen:

echo "Hello World" >> output.log

Umleiten von stderr in eine Datei

echo "Hello World" 2> error.log

Diese Art der Bash-Umleitung leitet alle Fehler der Programmausführung in eine Datei. Dies ist dann nützlich wenn nur das Fehlverhalten der Software in eine Datei ausgespeichert werden sollen.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

PHP-Storm kommt aus indexing loop nicht mehr heraus

Manchmal habe ich das Problem, dass der PHP Storm nicht mehr aus dem Index-Loop herauskommt. Die IDE iteriert unablässig über den selben Ordner, welcher von selbiger beliebig bestimmt wurde. Auch die Auswahl von “Mark directory as excluded” des betroffenen Ordners funktioniert nicht, da PHP-Storm dann über einen anderen Ordner loopt.

Lösung

Menüleiste: File -> Invalidate Caches/Restart anklicken und im Dialog “Invalidate and restart” wählen. Die IDE startet neu und baut der Cache neu auf. Nach dieser vollständigen Neu-Indexierung wird sich in der Regel die Endlosschleife auflösen und PHP-Storm beruhig sich endlich.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Hilfe! Meine WordPress Seite ist nicht mehr im Google Index suchbar

Es kann schon mal passieren, dass die eigene Seite bei Google nicht aufzufinden ist. Damit die eigene WordPress-Seite im Google Index auffindbar ist müssen folgende Kriterien korrekt erfüllt sein:

  1. Google kennt Deine Seite nunmal wirklich nicht und auch keine andere Seite im Netz hat jemals darauf verlinkt. Daher muss diese erstmalig bei Google bekannt gemacht werden: 
    https://www.google.com/webmasters/tools/submit-url?hl=de
  2. Des weiteren sollte auch sichergestellt sein, dass in der betroffenen WordPressinstanz das Indexieren der Seite gestattet ist. Dies kann im Backend unter Einstellungen -> Lesen -> Sichtbarkeit für Suchmaschinen beeinflusst werden:
    Sofern diese Option aktiviert wurde, sind die Einstellungen welche in der robots.txt hinterlegt wurden um die Indexierung für die Seite zu aktivieren allen Suchmaschinenbetreiber egal. Durch diese Einstellung wird in das ausgelieferte HTML um folgende Zeile angereichert:

    <meta name="robots" content="noindex,follow"/>

    Durch anhaken dieser kleinen Checkbox kann im Laufe der Zeit die eigene Seite mal ganz schnell unauffindbar im ganzen Internet sein und niemand hat eine blassen Schimmer warum.

  3. Desweiteren kann eine Datei namentlich robots.txt im Hauptverzeichnis abgelegt werden. Eigentlich braucht man diese nicht, es empfiehlt sich jedoch diese anzulegen und der Inhalt derer sollte in einer Standard WordPress-Installation nicht mehr als folgende Inhalte haben:
    User-agent: *
    Disallow: /wp-admin/
    Allow: /wp-admin/admin-ajax.php
    
    Disallow: /wp-content/cache/cachify/

    In dieser Datei braucht in einer Standardinstallation auch nichts weiteres stehen, das möglicherweise dafür verantwortlich ist, dass die eigenen Seite vom Suchindex ausschließt. Steht dort etwa folgendes drin, fordert dies alle Suchmaschinenbetreiber dazu auf die Seite nicht in ihren Index aufzunehmen:

    User-agent: *
    Disallow: /

 


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Windows Fenster aus nicht sichtbaren Bereich wiederherstellen

Ganz selten passiert es mir schon einmal, dass mir ein Fenster einer beliebigen Anwendung unter Windows in den nicht sichtbaren Bereich verrutscht. Sei es, dass das Fenster beim Verschieben hinter der Taskleiste losgelassen wurde, geänderte Monitoreinstellungen dies blockieren oder aus einem beliebigen anderen Grund. Dies gilt für Windows 7 gleichermaßen wie Windows 8 und Windows 10.
Das einzige was jetzt noch möglich ist, man kann über Rechtsklick in der Taskleiste das Fenster in den Vollbildmodus bringen. Jedoch will man dies Wiederherstellen ist es wieder im nicht sichtbaren Bereich positioniert und kommt dann wieder einfach nicht daran.

Man könnte die Anwendung zwar jetzt auch einfach beenden und erneut starten. Je nach Anwendung ist dies aber auch nicht gewünscht oder gar Zeitintensiv. Wem dies nichts ausmacht, der kann sich mit dieser Lösung zufrieden geben:

Lösung in älteren Windows Versionen

Man fährt mit dem Mauszeiger auf die betroffene Anwendung in der Taskleiste, verweilt dort eine Sekunde bis das Vorschaubild der Anwendung aufploppt und klickt hierauf mit einem Rechtsklick.

Dort wählt man dann Verschieben und drückt nun – und dies ist der entscheidende Akt – auf eine der vier Cursortasten mit denen man üblicherweise durch Text navigiert.

Nachdem man nur einmal kurz eine dieser Tasten gedrückt hat kann man im Anschluss mit dem Mauszeiger das gewählte Fenster verschieben – ohne einen weiteren Klick zu tätigen – und das Fenster wird somit wieder in den sichtbaren Bereich geholt.

Lösung ab Windows 7

Man aktiviert zunächst das betroffene Fenster durch Klick in der Taskleiste. Anschließend kannst Du nun durch drücken und halten der Windows-Taste und mehrmaligen drücken der rechts/links Pfeiltasten in die selbe Richtung durch die aktiven Monitore hindurchreichen und so wieder sichtbar machen.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!

Festplatte unter Linux formatieren und mit ext4 Dateisystem mounten

Eine neue Festplatte unter Linux einzubinden ist gar nicht so schwierig. Nachdem eine neue Festplatte einbaut wurde ist die Verwirrung für einen Linux-Newbee möglicherweise groß. Sobald die notwendigen Befehle bekannt sind, so ist das formatieren und mounten einer neuen Festplatte – sei es eine klassische HDD oder eine SSD – ziemlich einfach umzusetzen.

Dazu muss man nur folgende Schritte verstehen und umsetzen.

Beachte alle nachfolgenden Befehle als Benutzer root auszuführen. Bevor ich mit einem Set an Befehlen für root-Aktivitäten beginne führe ich immer zuvor folgenden Befehl als erstes aus:

sudo -i

Welche Festplatten sind in meinem System enthalten und welche davon ist denn jetzt meine neue Platte?

Mittels nachfolgendem Befehl können die im System laufenden Festplatten auflisten. Damit lassen sich Informationen zu Speichergröße, Plattenname, Größe sowie weitere technischen Details herausfinden:

fdisk -l | grep "/dev/sd"

Die hieraus resultierenden Information dient dazu anhand der Größe den technischen Festplattennamen herauszufinden. Reichen diese Information nicht, so kann man diesen anhand folgendem Befehl eindeutiger bestimmen. Dies setzt dann allerdings vorraus, dass man weiß was denn so alles auf dem aufgeklebten Label der Festplatte oder dem USB-Gehäuse drauf steht:

ls -la /dev/disk/by-id/

Neue Festplatte partionieren

Mit meinen Recherchen im System habe ich nun herausgefunden, dass die Platte /dev/sdb jene Festplatte ist, die ich meinem System einbinden möchte. Dazu starten wir dann das Partitionierungsprogramm um eine einzige Partition einzurichten, da ich den gesamten Speicherplatz der Platte an einer einzigen Stelle integrierten möchte.

fdisk /dev/sdb

Es öffnet sich nun das Programm fdisk, welches mittels einfacher Befehle steuern lässt. Via “m” kann man sich eine Liste der verfügbaren Befehle anzeigen lassen. 

Sofern diese Platte noch nicht formatiert ist, da diese möglicherweise zuvor in einem anderen System verwendet wurde, muss dieser Schritt noch vorgenommen werden. Ist diese nicht der Fall so kann dieser übersprungen werden. Ansonsten wird mittels “d” die vorhandene Partition(en) gelöscht. Da kann man nicht viel falsch machen sofern es die richtige Platte ist und man am Ende die gesamte Platte nutzen möchte.

Nun wird eine neue Partition mittels “n” erzeugt. Die vorgenommenen Änderungen müssen nun noch einmal mit dem Kommand “p” fortgesetzt werden. Dazu müssen noch ein paar Angaben vervollständigt werden, welche einfach mittels Enter und den Vorgabwerten mittels ENTER bestätigt werden können um die volle Kapazität der Platte zu nutzen. Abschließend werden diese Änderungen an der Festplatte mittels dem Command “w” bestätigt und dauerhaft im Bootrecord der Platte gespeichert.

Formatierung der Festplatte vornehmen

Formatieren Sie der nun erzeugten Partition erfolgt mit folgendem Befehl:

mkfs.ext4 -j /dev/sdb1

Die neue Festplatte mounten

Nachdem nun die neue Festplatte betriebsbereit ist muss diese an einem festen Punkt eingebunden werden um darauf zugreifen zu können. Dazu legt man einen Ordner an und mountet die Platte wie folgt:

mkdir /mnt/data
mount /dev/sdb1 /mnt/data

Da diese Aktion mit dem nächsten Neustart verloren geht, muss das Mounten der Platte in der fstab festgelegt werden um dies dauerhaft zu erhalten.

Durch nachfolgenden Befehl findet man nun heraus welche UUID allen gemounteten Platten zugeordnet sind. Nun ist es möglich die Platte nicht mittels /dev/sdb1 zu mounten sondern über die eindeutige ID. Dies ist notwendig, da die Reihenfolge der Zuordnung sich nach einem Reboot ändern kann, insbesondere wenn man mit externen Festplatten oder USB-Sticks an dem Rechner arbeitet.

ls -la /dev/disk/by-uuid/ | grep sdb1

Hieraus erhalten wir nun die ID der Platte. In meinem Fall ist das folgende ID:

41c8a09b-819d-7a31-abf6-8b53ba6698a1

Nun bearbeiten wir die fstab und ergänzen diese am Ende der Datei in einer separaten Zeile um einen weiteren Eintrag.

vi /etc/fstab

Dort fügen wir – in meinem Fall mit meiner oben genannten ID – folgenden Inhalt am Ende der Datei an:

UUID=41c8a09b-819d-7a31-abf6-8b53ba6698a1 /mnt/data ext4 defaults 0 1

Anzeige der erfolgreich gemounteter Festplatten

Nun kann man sich die im Betriebssystem erfolgreich hinzugefügte Festplatte anzeigen lassen, die künftig auch nach einem Reboot erhalten bleibt.

root@deathstar:/~# df -h

Filesystem       Size Used Avail Use% Mounted on
/dev/mapper/root  55G  37G   16G  70% /
/dev/sdd2        253M 288K  252M   1% /boot/efi
/dev/sdc1        458G 3.4G  431G   1% /mnt/filebase
/dev/sdb1        458G  73M  435G   1% /mnt/backup

Standby Zeit der Festplatte festlegen

Abschließend lohnt es sich ggf. noch die Standby-Zeit der Platte festzulegen, sofern die Platte auf einem System läuft, das 24/7 verfügbar ist, jedoch nicht fortwährend benötigt wird und dazu auch keine SSD ist. Dazu kann mit hdparm die Spin-Down Zeit der Festplatte festlegen. Nachfolgender Befehl fährt die Festplatte nach 10 Minuten Inaktivität in den Ruhemodus:

 hdparm -S 120 /dev/sdb

Damit ist die neue Festplatte unter Linux betriebsbereit und kann ihrem gewünschten Verwendungszweck zugeführt werden.


Hat Dir mein Beitrag gefallen?

Unterstütze meine Arbeit und werde noch heute Patreon!