Code!

„More time is spent reading code than writing code.“ Voll true, Alter.

Das heißt im Klartext, ein Programmierer – insbesondere ein guter – bekommt einen guten Stundensatz – gute Programmierer insbesondere einen sehr guten – um in dieser Zeit den Code zu lesen, den andere Programmierer bereits geschrieben haben.

Diese anderen Programmierer sind – wenn der Programmierer, der deren Code liest, ein guter ist – auch sehr gute Programmierer. Diese kosten sehr viel Geld pro Arbeitsstunde.

Schlechte Programmierer lesen – und verwenden – schlechten Code. Weil sie zu wenig guten Code zu Gesicht bekommen.

Und der Code ändert sich – bei guten Programmiersprachen – in regelmässigen Zyklen. Das ist nicht immer unter Beibehaltung von Abwärts-Kompatibilität möglich.

Manchmal kann so ein Monat für einen richtig guten Programmierer darin bestehen, fünf Zeilen Code zu schreiben.

A journey in the pursuit of excellence (2)

Uns‘ WordPress läuft in einem docker-Container. Beim Upgrade der WordPress-Installation gehen bei dem ältlichen Server, der die docker-engine antreibt, gerne die Bilder verloren!

Hier zwei kurze Tipps zur Wiederherstellung für alle, die wie ich bereits zweimal das Backup des wp-content/uploads-Ordners vergessen haben:

for i in *.png; do docker cp $i www.gebsattel.rocks:/var/www/html/wp-content/uploads/2020/02/; done

kopiert die im Dateisystem des docker-Hosts gespeicherten png-Bilder in den jeweiligen Ablage-Ordner des WordPress-Systems

und

for file in ' '; do mv -i -- "$file" "${file// /-}"; done

sucht nach einem Leerzeichen in den Dateinamen und ersetzt diese mit einem Minus, wie es WordPress beim Upload auch tut.

Teil der Reihe „A journey in the pursuit of excellence

OpenJ9 versus HotSpot JVM

OpenJ9 ist eine alternative Implementation der offiziellen Oracle HotSpot JVM engine. OpenJ9 stammt aus IBM’s Java SDK/IBM J9 und reicht zurück zu OTI Technologies Envy Smalltalk.

Während OpenJ9 im Speichermanagement die Nase vorn hat, sind die z.B. von adoptopenjdk (u.a.) angebotenen Versionen von OpenJDK, der freien Implementation des offiziellen Oracle JDK’s (inklusive HotSpot JVM engine), in der Ausnutzung vorhandener CPU-Leistung führend.

Die verschiedenen über SDKMAN! angebotenen JDK-Distributions finden sich unter https://sdkman.io/jdks.

Für Entwickler ist es neben den Vorzügen besserer Ausnutzung der für ein Projekt vorhandenen Hardware aber auch entscheidend, wie das Buildtool (z.B. gradle), ein Framework (z.B. Spring), dessen Versionskontrolle (z.B. Spring Boot) und die zusätzlich eingebundenen, externen Libraries (z.B. Lombok u.a.) inklusive aller Annotationen sich mit der jeweiligen JVM verhalten. Auch hier liegen trotz aller Hilfen durch das Framework und eine moderne IDE wieder genug Stolperfallen versteckt, um stundenlang an einer Zeile Code zu knabbern…

A journey in the pursuit of excellence

Mein Leben in der IT. Jeder Arbeitstag eine Berg- und Talfahrt. Heute mal wieder ein Ausblick von der Bergspitze über die Täler:

“The key to pursuing excellence is to embrace an organic, long-term learning process. Usually, growth comes at the expense of previous comfort or safety.”
― Josh Waitzkin, The Art of Learning: A Journey in the Pursuit of Excellence

Gefunden habe ich das Zitat bei Frau Naysan Saran. Gesucht hatte ich ein Fundstück auf Ihrer Website – wieder einmal: wie man präzise und mit wenig Aufwand unter Linux multiple Dateien durchsucht und dort Ersetzungen vornimmt (eine der vielzähligen Möglichkeiten):

$ grep -rl "old_string" . | xargs sed -i 's/old_string/new_string/g'

Danke dafür!

Hinweise:

  • grep benötigt zur Maskierung („Escapen“) mit dem Backslash „\“ im Suchstring die Option „-E“ (ERE – Extended Regular Expression)
  • der Backslash „\“ zum Maskieren („Escapen“) ist u.a. auch bei runden Klammern im String-Parameter von sed notwendig
  • mit dem Parameter –no-messages wird zusätzlich die Ausgabe von Fehlern im o.g. grep-Befehl unterdrückt

Sind sehr viele Dateien betroffen, lohnt es sich vom zeitlichen Aufwand erheblich, ein find davor zu schalten, z.B.:

$ find . -type f -name "*.php" | xargs grep -El --no-messages "header \(\"HTTP" | xargs sed -Ei 's/header \(\"HTTP/header\(\"HTTP/g'

Zum Thema tar-Archiv und bestmöglicher Kompression mit lzma2:

$ XZ_OPT=-9 tar -xvJf xz_file_name.tar.xz

oder einfach nur komprimieren:

$ xz -zv file_name

und dekomprimieren:

$ xz -d file_name.tar.xz

Hinweis: komprimierte Archive lassen sich mit

$ tar --diff --file=archive.tar.xz -C folder_name

nicht mit den Dateien bzw. Ordnern im Dateisystem vergleichen, das komprimierte Archiv kann dementsprechend auch nicht upgedatet werden. Bei einem 40GB-Archiv, in dem 59GB in 40090 Dateien

find /verzeichnis -type f | wc -l

unterteilt in  3339 Ordnern

find /verzeichnis -type d | wc -l

stecken, dauert das Dekomprimieren zum Abgleich auf einem ollen Server schon mal einige Zeit. Um diese zu messen, setzt man einfach ein time vor das Programm.

Der Vergleich selbst geht dann mit:

$ tar -dvf archive.tar
(aus dem Ordner heraus, mit dem verglichen werden soll)

Und das Faust’sche daran, wie üblich: ich bin mehr der Meer-Typ.

Das „Hyper Text Coffee Pot Control Protocol“…

Das HTCPCP/1.0 vom 1. April 1998 hat einen Nachfolger in RFC 7168 vom 1. April 2014. Die Entwicklung des Internets auf Siebenmeilenstiefeln. In Hobbes‘ Internet Timeline ist der erste am Netz der Netze angeschlossene Toaster bereits für 1990 dokumentiert.

In den Neunzigern des letzten Jahrhunderts waren Siemens, Mercedes, Bosch und die meisten anderen, die immer noch die „Liste der größten Unternehmen in Deutschland“ (laut Wikipedia) anführen, auch global bedeutende Firmen. Das hat sich aber drastisch geändert, in der Forbes-Liste darf man jetzt länger suchen…

Top 10 Firmen der Welt - ein Vergleich

Migration IPv4 zu IPv6

Ziel: Abschaltung von IPv4

Migrationstechniken:

  • Dualstack: beide Welten laufen nebeneinander, mehr „Admin-Overhead“
  • Tunneltechnologien (IPv6 in IPv4 oder umgekehrt, Insellösungen)
  • Tunnelbroker (falls Provider überhaupt kein IPv6 unterstützt, eher Home-Office)
  • 6to4 (Internet-Tunnel, Präfix: 2002::/16)
  • 6rd, Nachfolge von 6to4, Vorteil: beim Client  (Provider-Tunnel, im Internet nativ, Präfix: vom Provider abhängig)
  • ISATAP (Intranet-Tunnel, kein Präfix, aber IPv4-Adresse hinten angehängt
  • Teredo (NAT-Tunnel für Internet, Präfix: 2001::/32, also 2001:0::)
  • DSLite (Provider-Technologie, Zugangsnetz ist IPv6)
  • Translationstechnologien (IPv6 zu IPv4 oder umgekehrt)
  • NAT-PT (veraltet, zu komplex und fehleranfällig)
  • NAT64/DNS64 (aktuell genutzt, Funktionalität getrennt)
  • 464XLAT (für IPv4-only-Applikationen)

Quelle: Eric Amberg / Vorbereitung auf das Examen CompTIA Network+

DNS für IPv6

Der DNS (Domain Name Service) unter IPv6

  • DNS (Domain Name System) löst DNS-Namen (FQDNs) in IP-Adressen auf (sowohl bei IPv4 als auch bei IPv6)
  • DNS gewinnt bei IPv6 noch an Bedeutung (IPv6-Adressen nicht auf Lesbarkeit ausgelegt)
  • Die traditionellen DNS-Dienste können um IPv6-Funktionen erweitert werden. Es sind keine neuen Dienste notwendig
  • RFC 3596 definiert IPv6-Erweiterungen im Domain Name System (AAAA und IP6.ARPA)
  • Hosts erhalten in den Forward-Lookup-Zonen parallel Einträge für IPv4 und IPv6
  • Es müssen nur die IPv6-Adressen ergänzt werden, alle anderen Ressource Records verweisen auf Namen
  • DNS-Resolver (Clients) müssen Anfragen auf AAAA-Einträge stellen können
  • Die meisten DNS-Resolver fragen A und AAAA-Einträge an, wenn der Dualstack aktiv ist
  • Ist sowohl eine IPv6- als auch eine IPv4-Adresse vorhanden, wird in der Regel die IPv6-Adresse gewählt
  • DNS-Server, die IPv6-Namensauflösung bereitstellen, müssen nicht selbst über IPv6 erreichbar sein

AAAA (Quad-A)
Neuer RR (ResourceRecord) für IPv6-Namensauflösung
Forward Lookup-Namensauflösung: DNS-Name in IPv6-Adresse:

<Name>           IN AAAA           <IPv6-Adresse>

Beispiel:

server1           IN AAAA           2001:db8:affe:1::1

IP6.ARPA
Neue Domain für Reverse Lookup-Namensauflösungen:
IPv6-Adresse in DNS-Name

Die IPv6-Adresse wird von rechts nach links dargestellt, 4 Bits bilden eine Subdomain-Ebene, keine Kürzungen!

Beispiel:

Adresse: 2001:db8:2::affe:dead:beaf
(voll ausgeschrieben: 2001:0db8:0002:0000:0000:affe:dead:beef)

PTR-Eintrag:

f.e.e.b.d.a.e.d.e.f.f.a.0.0.0.0.0.0.0.0.2.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa