Symlinks – Was sind symbolische Links

Bei einem aktuellen Projekt bin ich auf ein außergewöhnliches deployment gestoßen. Außergewöhnlich aber nicht negativ wertend gemeint. Halt nicht “state of the art”. Stack: Amazon EC2 Server mit einem NGINX Webserver. Der Ablauf ist wie folgt. Der Order html unter dem Pfad /usr/share/nginx/html war ein Symlink auf ein Verzeichnis im selben Pfad. Nennen wir den Ordner usr/share/nginx/kundenwebsite-2022-01-11 .

Ich nahm an das der frühere Entwickler von seiner lokalen Machine die Dateien via scp hochgespielt hatte und dann den Symlink angepasst hat. Kann man machen aber ich finde das birgt eine Menge an Risikopotenzial. Außerdem kommt man eher selten in die Verlegenheit Symlinks selber zu setzen. Heißt man muss sich immer wieder einlesen. Aus diesem Grund schreibe ich diesen Artikel. Es soll ein kleines How To Symlink sein.

Ein Symlink wird gesetzt mit: ln -s /absoluter/pfad/zum/ziel /absoluter/pfad/der/verknüpfung

Im Kontext zum obigen Beispiel beduetet es: ln -s usr/share/nginx/kundenwebsite-2022-01-11 usr/share/nginx/html

Erklärung: Wer jetzt auf usr/share/nginx/ ein ls -la macht wird folgende Ausgabe erhalten: html -> kundenwebsite-2022-01-11

drwxr-xr-x  1 nginx  nginx    50 26. Jan 11:22 html -> kundenwebsite-2022-01-11
drwxr-xr-x  5 nginx nginx 4096 31. Aug 2021  kundenwebsite-2022-01-11

Heißt das der Symlink erfolgreich gesetzt ist und html eine Referenz auf den kundenwebsite-2022-01-11 Ordner enthält.

Wenn man nun ein Feature eingebaut hat und es im März auf den sever schiebt, passt man den Symlink wie folgt an:

ln -sfn $PWD/kundenwebsite-2022-03-01 $PWD/html

Somit wird die alte Referenez überschrieben.

Wenn man dann die Schnauze voll hat von so einem Deployment löscht man den Symlink ganz easy mit: rm $PWD/html .

Bemerkung: $PWD gibt der den aktuellen Standpunkt deines aufenhalts im Verzeichnissystem wieder. Also achte beim ausführen mit der Systemvariable $PWD wo du gerade bist. Du musst in unserem beispiel hier sein: ln -sfn $PWD/src2/ $PWD/target/Daten.

Hoffe es hat geholfen das Wissen über Symlinks etwas aufzufrischen?

JS flat()

Es kommt schon mal vor das man geschachtelte arrays bekommt.
Zum Beispiel: Man möchte aus einem geschachteltem Array alle Werte in einem Array sammeln. Mit der array Funktion flat() ist das kein Problem.

const arr1 = [1, 2, [3, 4]];

arr1.flat();
// [1, 2, 3, 4]

Auch mehrstuffig verschachtelte Arrays kann man geradeziehen (flatten). Indem man der flat Funktion die Anzahl der verschachtelungen die aufgelöst werden sollen, mitgibt. Da man ansonsten in seinem result array die oberen verschachtelung mitgelistet bekommt.

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]

NVM – Noder Version Manager

Als Fullstack oder Frontendentwickler benötigt man heute eigentlich immer
NodeJS. Zumindest bei einem modernen Stack. Um zum Beispiel JS, CSS Dateien zu kompilieren oder in verschiedene Packages zu bündeln um es dann in das Projekt zu laden. Oder seine lokale Entwicklungsumgebung mit nützlichen Tools zu bereichern wie zum Beispiel Linter, Typescript.

Wenn man mehrer verschiedene Projekte hat, dann kann es sehr schnell vorkommen das man diese unagenehmen roten Error Meldungen von NPM erhält wenn man zum Beispiel ein npm script (npm run dev, nem run watch, etc.) startet.

Meiner Erfahrung nach sollte man immer zuerst die Nodeversion checken. Den Node verändert sich regelmäßig. Man kann sich natürlich Docker hier zu nutze
machen. Also einen node Docker Container der genau die Noderversion bereithält die man für das Projekt benötigt. Man kann aber auch lokal node installieren.

Aber das würde ich nicht nativ machen sondern ein nützliches Tool nutzen. Ich
spreche von NVM. NVM steht wohl für NodeVersionManager. Hier kann man leicht
zwischen den Node Versionen wechseln. Man installiert auch sehr leicht mit nvm eine neue Version.

Meiner Meinung nach ein wirklich gutes und nützliches Tool für alle die
Frontendarbeiten erledigen müssen.

Q: https://github.com/nvm-sh/nvm#manual-install

CSS position Pattern

Take a look to this pattern and you will understand how it works. Assign your container position: relative;. There child assign position:absolute;. The absolute elements you can positioning by using top, bottom, left, right.

body {
  background: gray;
} 

.container {  
  position: relative;
  width: 50%;
  height: 100vh;
  border: 3px solid #73AD21;
  margin: 0px auto;
  text-align:center;  
}

.container div {
  padding: 10px;
}

.container div:nth-child(1) {
  background: yellow;
  position: absolute;
  width: 200px;
  height: 200px;  
  top: 50%;
  left: 20%;
}

.container div:nth-child(2) {
  background: green;
  position: absolute;
  width: 100px;
  height: 100px;  
  top: 20%;
  right: 20%;
}

.container div:nth-child(3) {
  background: red;
  position: absolute;
  width: 50px;
  height: 50px;  
  top: 10px;
  right: 10px;  
}

.container div:nth-child(4) {
  background: yellowgreen;
  position: absolute;
  width: 300px;
  height: 30px;  
  top: 10px;
  left: -20px;  
}
<div class="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>FLAG</div>
</div>

DEMO: https://codepen.io/mike-lowrey/pen/BamodMQ

InnoDB vs MyISAM

InnoDB setzt man ein um schnell Daten auszulesen. SELECT Anfragen werden hier schnell ausgeführt. MyISAM hingegen ist bei SELECT anfragen etwas langsamer aber dafür bei INSERT und UPDATE Anfragen schnell wie der Blitz. Daher kommt es häufig vor, dass man in einer Datenbank beide Formate vortrifft. Ich habe ein Projekt bei dem ich die Pageviews / Impressions tracke. Hier schreibe ich die Views in eine MyISAM Datenbank. Die Models der einzelnen Seiten speicher ich dagegen in eine InnoDB. Weil ich sie schnell ausgeliefert haben möchte.

Jetzt komme ich aber zu einem kritischen Punkt der genaue beide Vorteile der beiden Engines benötigt. Eine Volltextsuche. MyISAM hat hier die Nase vorne. Sie bietet eine integrierte Voltextsuche an. Sie ist aber langsamer beim ausliefern. Hier wäre eine Hybridengine wünschenswert.

Bei kleinen Anwednungen mag das nichts ins gewicht fallen aber bei größeren schon. Vor allem bei XHR Suggestion Anfragen. Und hier kommen dann SearchEngines wie Solr oder ElasticSearch ins Spiel. Was den Wartungsaufwand um einiges erhöht. Aber so ist es halt.

Javascript – Fakultät berechnen

Ab und an braucht man das und nicht nur in der Kombinatorik.

function fac(n) {
   return Array.from({length: n}).map((_,i) => i+1).reduce((a,b) => a * b, 1);
 }
 fac(4)
// 4 * 3 * 2 * 1 = 24

Wer es etwas übersichtlicher braucht (und dazu zähle ich mich auch) kann es auch in einer for schleife machen.

function fac(n) {  r = [];   for (let i = n; i > 0; --i) {     r.push(i)       }   return r.reduce((a,b) => a * b, 1);; } console.log( makeArr(4) );

Javascript – Was ist eigentlich Promisification?


“Promisification” ist ein lange Wort für eine ganz simple Sache. Es geht eigentlich um die immer gleiche Frage, sobald man das erste Mal in JS eine API Anfrage stellt. Wie krieg ich das Zeug in den globalen Scope?

Man bedient sich ganz einfach damit, die asynchronität zu stoppen und mal ein päuschen einzulegen. Sobald dann Daten da sind werden sie mit return an eine wartende Variable zugewiesen. Wie geht den das? Man wrapped die ganze Anfrage mit einem Promise Objekt. Bei erhalt der Daten übergibt man die erhaltenden Daten in ein resolve()oder reject(). Sobald das passiert ist der Promise aufgelösst. Solange ist er sonst im pending Modus.

Hier ein kleines Besipiel:

const api = "https://api.coingecko.com/api/v3/simple/price?ids=Bitcoin%2Cdai%2Csolana&vs_currencies=usd&include_market_cap=true&include_24hr_vol=true";
const obj = await new Promise((resolve, reject) => fetch(api)
 .then(res => res.json())
 .then(data => resolve(data))
 .catch(err => reject(err))
);

console.log('OBJ',obj) 

Aber, sollte man es verwenden?

Nein! Es ist ein absolutes Antipattern! https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it

Git Branch master zu main umbennen

Zuerst benennen wir unser Master in Main lokal um:

git branch -m master main  

2. Nun möchten wir auf unserem entferntem Repository das selbe tun.

Ändert den master auf main in eurem entfernetem Repository (GitLab, GitHub etc.). Dann könnt ihr von lokal aus:

git push -u origin main

den neuen branch bespielen. Um den master jetzt zu löschen folgendes eingeben:

git push origin --delete master

Ich persönlich fand es unnötig und zu politisiert. In der Sache zwar richtig aber im grunde nicht zu ende gedacht. Grundsätzlich sind Menschen keine Heiligen und tun immer und ständig schlimme Dinge. Und das der eine Mensch den anderen Menschen beherrschen möchte gehört leider auch zum Menschsein dazu. Sklaverei hat auch viele Gesichter. Von Sklaverei auf der arabischen Halbinsel oder Nordost Afrika (Lybien) bis hin zur modernen Arbeitssklaverei in Indien, Pakistan. [Q: https://weltkirche.katholisch.de/Aktuelles/20190205_Moderne_Sklaverei_auf_der_Arabischen_Halbinsel] Selbst im privat, persönlichem Raum gibt es Abhängigkeiten die drauf aufbauen. Ich finde das war, ist und bleibt leider auch so. Egal ob man sein Hauptbranch jetzt main oder master nennt. Vielleicht ist es gerde nur en vogue.

Unsere System macht “Hintz und Kuntz” in der westlichen Welt, egal ob sie es einsehen oder nicht, zu Mastern. Jeder der ein Smartphone hat, jeder der ein Auto fährt, jeder der eine Fußball-Weltmeisterschaft in Katar sehen möchte, jeder der ständig neue Klamotten kauft ist ein Master. Denn er beutet indirekt woanders Menschen aus. Gegen Rassismus muss man andere Hebel in Gang setzen. Aber das würde eventuell den “Mainler” bzw. “Mastern” nicht gefallen und somit bleibt es so wie es ist.

Also Leute. Lange rede gar kein Sinn. Aber das ganze hat so was von “nichts” mit Git zu tun.

SeoTheater Autoren