a dev's blog

Some thoughts about thoughts.

Developer Toolbelt

Während der täglichen Arbeit als Software-Entwickler gibt es immer und immer wieder kleine Aufgaben, für man häufig Online-Dienste in Anspruch nimmt oder für die jeder Entwickler seine eigenen kleinen Shell-Skripte und Aliase gebastelt hat. Ich habe nun ein kleines go Programm Namens dt (dev toolbelt) geschrieben, welches einige dieser Aufgaben übernimmt.

In diesem Blog-Beitrag möchte ich dir einige Funktionen des Tools vorstellen.

Allgemein

Zunächst einmal ist dt einfach zu installieren. Entweder nimmt man ein vorkompiliertes Binary, welches für alle gängigen Betriebssysteme und Architekturen auf Github zu finden ist oder man installiert sich dt via Homebrew oder man kompiliert es sich aus den Sourcen. Eine genaue Anleitung zu allen möglichen Installationsarten findet sich in der Readme des Projekts auf Github.

Das Tool besitzt ein - wie ich finde - recht schickes CLI. Es gibt zu jedem Kommando eine Hilfe und wenn man einen typo im Aufruf hat, bekommt man Vorschläge für Kommandos die dem eingegebenen ähnlich sind.

Funktionen

Aber jetzt zu den Funktionen. Für einen ausführlichen Gesamtüberblick schaust du dich am besten auf Github um. Hier eine Kurzübersicht der Funktionen die ich selbst am meisten nutze:

Und der Vollständigkeit halber noch die restlichen Funktionen zum aktuellen Zeitpunkt:

  • URI (encoding und decoding von URIs)
  • Base64 (encoding und decoding von verschiedenen base64 Standards) (Zu)
  • Date (Konvertierung von Datumsangaben)
  • HTML (escaping und unescaping von HTML)

JWT

Ein Klassiker ist die Darstellung eines JWTs. Oftmals hat man einen entsprechenden base64 String zur Hand und möchte schauen, was nun darin steckt. Dann surft man jwt.io an, pasted dort seinen base64 String und bekommt den Inhalt präsentiert. Das macht man dann immer und immer wieder… Ab jetzt nicht mehr nötig. Ein simpler Kommandozeilen-Aufruf übernimmt genau das gleiche.

$ dt jwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmb28iLCJzdWIiOiJiYXIifQ.p2BXWExAD8A1F-OTRlZi9Uiy8IDl2rk6nzZsI-EGBgk

JOSE Header:
{
  "alg": "HS256",
  "typ": "JWT"
}

JWS Payload:
{
  "iss": "foo",
  "sub": "bar"
}

Zufallsstrings und Zahlen

Ob es nun ein Passwort, eine Zufallszahl oder ähnliches ist. Im Alltag benötigt man oft den Zufall. dt kann genau das und man kann dt sagen, ob man nun nur Buchstaben, Buchstaben und Zahlen, nur Zahlen oder Komplexe Produkte aus Zahlen, Buchstaben und Zeichen benötigt. Auch die Länge ist natürlich konfigurierbar und dt greift bei der Berechnung nicht auf die einfachen Random-Bibliotheken von go zurück, sondern nutzt ganz bewusst die crypto/rand Bibliothek um den Zufall wirklich zufällig wirken zu lassen. ;)

$ dt random -a alpha
oLeBLavgvE
$ dt random -a alphanum
nMHzmoP7VM
$ dt random -a complex
+e*B&kT%kN
$ dt random -a number
7577463164
$ dt random -a number -l 50
77863387898292432274050882067595113551003982087110

UUID

Auch UUIDs werden immer mal wieder gebraucht. Ich habe alle bisherigen fünf Varianten der UUID-Generierung in den dev-toolbelt eingebaut. Dabei wird der RFC 4122 sowie DCE 1.1 berücksichtigt.

$ dt uuid -v1
2c9406bb-4fa2-11e8-9a22-14109fd7a63b
$ dt uuid -v2
000001f7-4fa2-21e8-8500-14109fd7a63b
$ dt uuid -v3 -n 000001f7-4fa2-21e8-8500-14109fd7a63b foo
77ab115d-d8f9-36c4-a135-3b5f18289a81
$ dt uuid -v4
ba009083-4d63-46fa-a9f8-72b0e5c6d663
$ dt uuid -v5 -n 000001f7-4fa2-21e8-8500-14109fd7a63b foo
9ffdd5a9-a89f-53be-b7a1-e53fca989507

Hash

Der dev-toolbelt beherrscht verschiedene Hash-Funktionen. Von verschiedenen sha hashes über md5 bis hin zu bcrypt kann man alles finden.

$ dt hash -a md5 foo
acbd18db4cc2f85cedef654fccc4a4d8
$ dt hash -a sha1 foo
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
$ dt hash -a sha256 foo
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae
$ dt hash -a sha512 foo
f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7
$ dt hash -a sha3_256 foo
76d3bc41c9f588f7fcd0d5bf4718f8f84b1c41b20882703100b9eb9413807c01
$ dt hash -a sha3_512 foo
4bca2b137edc580fe50a88983ef860ebaca36c857b1f492839d6d7392452a63c82cbebc68e3b70a2a1480b4bb5d437a7cba6ecf9d89f9ff3ccd14cd6146ea7e7
$ dt hash -a bcrypt foo
$2a$10$y0I8Fgd9ht3TVTvTMKEIReenm8u3GZsQ6qwwBGzQrjdwd7BcHnazm
$ dt hash -a bcrypt -c 12 foo
$2a$12$MWSg.KHEzN2NUvKBh4qdg.x3aF.7rUD9l6gIaKsRQhyMHeYl9zBC.

Server

Wozu einen alias auf einen komplizierten Python oder Perl Aufruf, wenn auch das hier geht? :D

$ dt server /tmp
Serving /tmp on 0.0.0.0:3000

Zusammenfassung

Für meinen täglichen Arbeitseinsatz finde ich immer wieder Situationen, in denen mir dt einige Momente meiner Zeit spart.

Falls du Ideen und / oder Anregungen hast, welches Feature ausgebaut, verändert oder neu hinzu genommen werden sollte, so würde ich mich über einen Github Issue - oder noch besser - eine Contribution freuen.

Cheers!