Eindeutigkeit der UUIDs

Auf digitalbunker.dev wurde ein interessanter Artikel gepostet, der erklärt wie UUIDs generiert werden.

Ein paar Punkte fand ich sehr interessante. Zum einen, dass es mehrere Versionen und Varianten gibt, wie die UUIDs generiert werden. Und die verwendete Version und Variation steht in der UUID immer drin an einer bestimmten stelle.

Zum anderen wurde die Frage gestellt, wie „eindeutig“ diese UUIDs sind. Also könnte es nicht doch vorkommen, dass ein Duplikat generiert wird. Theoretisch stimmt das, aber die Wahrscheinlichkeit ist doch eher gering. So schreibt der Autor, dass bei 10,000,000,000,000 [10 Billionen] UUIDs, die Chance auf zwei gleiche UUIDs wohl bei 0.00000006 % liegt. (Bei Version 4, die PRNG verwendet)

Wenn man Version 1 verwendet, die einen Timestamp nutzt, müsste man sein System schon für über 1.500 Jahre laufen lassen, bis sich der Timestamp im Jahre 3603 wiederholt. Wer so lange plant, sein System zu nutzen, der hat sicherlich noch andere Probleme, als UUIDs.

Datenbank mittels CLI command öffenen

Der Tipp kommt nicht von mir, aber ich finde die Idee super. Freek Van der Herten hat auf Twitter einen Tipp geteilt, wie er die aktuelle Datenbank, die in .env hinterlegt ist, in seiner Datenbank GUI (SequelPro, TablePlus, etc.) öffnen kann mit einem simplem CLI Script.

https://twitter.com/freekmurze/status/1306633113590738944?s=09

Der Trick ist, dass man eine Datenbank als URI beschreiben kann, und im Browser öffnet. Der Browser öffnet dann das dafür zuständige Programm.

function opendb () {
   [ ! -f .env ] && { echo "No .env file found."; exit 1; }

   DB_CONNECTION=$(grep DB_CONNECTION .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)
   DB_HOST=$(grep DB_HOST .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)
   DB_PORT=$(grep DB_PORT .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)
   DB_DATABASE=$(grep DB_DATABASE .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)
   DB_USERNAME=$(grep DB_USERNAME .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)
   DB_PASSWORD=$(grep DB_PASSWORD .env | grep -v -e '^\s*#' | cut -d '=' -f 2-)

   DB_URL="${DB_CONNECTION}://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_DATABASE}"

   echo "Opening ${DB_URL}"
   open $DB_URL
}

Quelle: github.com/freekmurze/dotfiles

Das Beispiel funktioniert mit dem Laravel Framework, aber lässt sich einfach für andere Projekte, z.B. WordPress, umschreiben.

Zufällige Zahlen in MySQL generieren und speichern

Ich hatte heute das Problem, dass ich für ein Demo Projekt tausende Zahlen brauchte um meine Datenbank zu befüllen. Sicherlich kann man das auch mit PHP & Co. machen, aber es geht tatsächlich auch direkt in SQL.

Ich hatte drei Anwendungsfälle:

  1. Ich brauche ganze Zahlen (integer)
  2. Ich brauche Geldbeträge (float)
  3. Ich möchte einen Bereich (min, max) angeben können, um die Demo Daten glaubhafter zu machen.

Der SQL Befehl sieht wie folgt aus:

SELECT FLOOR( RAND() * (maximum - minimum) + minimum) as randomValue;

Mit RAND() kann man eine Zahl zw. 0 und 1 generieren und mit etwas Math-Magic kann man dann auch noch einen Bereich festlegen. Und mittels FLOOR() wird draus eine natürliche Zahl.

Beispiel für eine Zahl zw. 20 und 100:

SELECT FLOOR( RAND() * (100 - 20) + 20) as randomValue;
+-------------+
| randomValue |
+-------------+
| 50          |
+-------------+
1 row in set (0.00 sec)

Beispiel für einen Geldbetrag zwischen 0,50 und 100,00: (wir generieren einen Cent Betrag und rechnen anschließend durch 100)

SELECT FLOOR( RAND() * (10000 - 50) + 50) / 100 as randomValue;
+-------------+
| randomValue |
+-------------+
| 45,65       |
+-------------+
1 row in set (0.00 sec)

Das Speichern ist dann nun ein leichtes. Ich hab so z.B. ein UPDATE durchgeführt, weil die Spalten mit leeren Werten schon existierten:

UPDATE facts
SET value = FLOOR( RAND() * (10000 - 50) + 50)
WHERE id IN (1,2,3,4)

Dozer: Menu-Icons verstecken

Ich habe einige Dienste auf meinem Mac laufen, die alle ihr eigenes Menu-Icon platzierne. Das ist schön und gut um schnell darauf zuzugreifen, aber mit der Zeit ist die Liste doch etwas lang und stielt mir die Übersicht. Ich hatte langezeit Bartender 2 im Einsatz und die App ist wirklich gut und ihr Geld wert. Inzwischen ist Bartender 3 erschienen und ich hätte ein kostenpflichtiges Update kaufen müssen. Wie gesagt, die App ist gut und definitiv ihr Geld wert und einige Features können sich sehen lassen, aber ich bin doch nochmal auf die Suche gegangen nach einer Alternativen und habe etwas gefunden.

Dozer ist eine kostenlose open source Lösung, die genau das tu was ich will: Man kann einzelne Icons verstecken bzw. über einen Klick/Tastenkürzel wieder anzeigen.

Für mich funktioniert das super und ich bin froh über dieses kleine Tool. Endlich ist meine Menubar wieder ansehbar.

MySQL Fehler: ERROR 2002 (HY00)

Ich entwickel lokal mit Valet, dabei wird PHP und MariaDB mittels Brew verwaltet. Nun hatte ich in letzter Zeit mehrmals das Problem, dass der Datenbankserver nicht erreichbar war, ergo keine Webseite funktioniert hat. Ich bekam nur folgende Fehlermeldung:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Ich hab viel gesucht und fand die verschiedensten Lösung aber es hatte nichts funktioniert bis ich endlich die Lösung hatte. Es gab keinen Fehler mit dem Datenbankserver ansicht, sondern dieser lief einfach nicht. Ich konnte den aber über Brew auch nicht starten, wie es normalerweise Valet macht.

Die Lösung war:

$ mysql.start

Mit dem Befehl wir der Datenbankserver normal gestartet und der Socket wieder angelegt. Das war mal wieder so ein 🤦🏼‍♂️ Moment.