Blog ·
Ein Etikett, das einen Hostnamenwechsel überlebt
Ein Aufkleber auf einem Server ist ein öffentliches Dokument. Was daraufsteht, warum der QR-Code keine URL trägt, und wie eine Barcode-Tabelle geprüft wird.
Von Provibr
Ein Aufkleber auf einem Server ist ein öffentliches Dokument. Er fährt in einem Kurierwagen mit, er wird von Remote-Hands-Personal gelesen, das für ein Unternehmen arbeitet, mit dem Sie nie einen Vertrag hatten, und irgendwann wird die Maschine ausgemustert und der Aufkleber geht mit dem Gehäuse in den Container. Alles, was darauf gedruckt ist, ist über die Lebensdauer der Maschine hinweg veröffentlicht.
Diese eine Beobachtung entscheidet fast alles darüber, was auf einem Etikett im Rechenzentrum stehen sollte, und sie schließt das meiste von dem aus, was Leute daraufschreiben.
Was daraufsteht und was nicht
Drei Dinge: ein undurchsichtiger Locator, die Revisionsnummer dieses Drucks und derselbe Locator noch einmal in menschenlesbarer Form, in Vierergruppen, damit ihn jemand tippen kann, wenn der Code nicht scannt.
Nicht darauf: der Kundenname, die Organisation, die Seriennummer, der Asset-Tag, das Rack, in dem die Maschine gerade steht, der Hostname, ein Logo oder ein Token irgendeiner Art. Ein Etikett ist eine Identität, kein Datensatz.
Über das Rack wird am meisten gestritten, denn es auf den Aufkleber zu schreiben ist bequem, bis genau zu dem Moment, in dem eine Maschine zum ersten Mal umzieht. Dann behauptet der Aufkleber selbstbewusst einen falschen Ort, und ein falscher Ort, der amtlich aussieht, ist schlimmer als gar keiner. Eine Ebene tiefer ist das auch der Grund, warum eine Rackposition keinen Aufkleber bekommt: Eine U-Position ist kein Ding, sondern eine Koordinate, und sie hört in dem Moment auf zu bedeuten, was sie bedeutet hat, in dem die Start-Unit des Racks korrigiert wird.
Warum der QR-Code keine URL enthält
Die Voreinstellung bei allem mit einem QR-Code ist, einen Link zu kodieren. Wir kodieren den nackten Locator, aus drei Gründen, nach Gewicht geordnet.
Ein Aufkleber überlebt einen Hostnamen. Ein Konto, das später auf eine eigene Domain umzieht, hätte sonst tausend gedruckte Etiketten, die auf eine Adresse zeigen, die es nicht mehr bedient, und niemand druckt tausend Etiketten neu.
Eine URL sagt mehr als ein Locator. Sie benennt die Plattform, und auf der eigenen Domain eines Kunden benennt sie den Kunden. Das ist genau die Kategorie von Information, von der das Etikett frei sein soll: Eine URL ist keine Abkürzung, sie ist ein zusätzliches Feld, und es ist das Feld mit den meisten Umstehenden.
Und es gibt genau einen Eingabeweg. Eine Handykamera, ein USB-Scanner, der in ein Feld tippt, und ein Mensch, der von Hand abschreibt, erzeugen alle dieselbe Zeichenfolge in demselben Feld. Eine URL würde eine vierte Form schaffen, die nur die Kamera je erzeugt, und eine vierte Form ist eine vierte Sache, die man falsch machen kann.
Der Locator ist kein Bearer-Token
Das ist der Teil, der den Rest sicher macht. Den Locator zu besitzen bringt Ihnen nichts.
Ein Scan ist eine gewöhnliche authentifizierte Handlung. Das Tor der Organisation greift, die Leseberechtigung wird geprüft, die Abfrage ist auf das Konto begrenzt, und erst dann sagt der Server, ob es diesen Locator hier gibt. Ein Locator aus einem anderen Konto erzeugt genau dieselbe Antwort wie einer, den jemand erfunden hat: unbekannt. Ein widerrufener bekommt eine eigene Ablehnung, denn das ist eine andere Tatsache, und wer den Aufkleber in der Hand hält, hat es verdient zu wissen, welche von beiden es ist.
Es gibt außerdem kein Herstellerpräfix. Ein Schema davor würde es der Software erlauben, unseren Aufkleber von dem Barcode zu unterscheiden, den der Hersteller schon aufgeklebt hat, und es würde jedem, der den Aufkleber findet, verraten, zu welcher Plattform er gehört. Die Form erledigt diese Aufgabe stillschweigend: Ein Locator sind sechzehn Zeichen aus einem bekannten Alphabet, und alles, was diese Form nicht hat, wird als Asset-Tag oder als Seriennummer nachgeschlagen, was der Scanablauf ohnehin braucht: für den Barcode des Herstellers und für jemanden, der eine Nummer vom Gehäuse abliest.
Sechzehn Zeichen, und warum sechzehn
Das Alphabet ist Crockford base32: die Ziffern und die Buchstaben ohne I, L, O und U. I und L sind mit der Ziffer Eins verwechselbar, O mit der Null; das U lässt der Standard weg, um zufällige Obszönitäten zu vermeiden. Wir folgen ihm, weil zwei andere Codes in diesem Produkt es schon tun, und zwei Alphabete wären ein Fehler, der auf seinen Moment wartet.
Sechzehn Zeichen aus einem Alphabet von zweiunddreißig Zeichen sind achtzig Bit. Die Länge wurde nicht wegen der Erratbarkeit gewählt, denn Raten bringt nichts: Die Abfrage wird ohnehin autorisiert. Sie wurde wegen der Kollisionen gewählt. Achtzig Bit machen eine Dublette über Millionen von Etiketten hinweg vernachlässigbar, der eindeutige Index darunter erzwingt also nie einen Wiederholungsversuch, den ein Benutzer bemerken würde. Sechzehn ist außerdem ungefähr die längste Zeichenfolge, die jemand in vier Vierergruppen ohne Fehler abschreibt.
Die Normalisierung läuft über alles, was hereinkommt: trimmen, in Großbuchstaben wandeln, Leerzeichen und Bindestriche entfernen, dann I und L auf Eins und O auf Null abbilden. Niemand, der von einem Aufkleber abtippt, sollte wissen müssen, dass diese Buchstaben fehlen. Das U hat bewusst keine Abbildung: Keine Ziffer ähnelt ihm, ein U ist also ein echter Tippfehler und gehört in eine Ablehnung statt in eine stille Ersetzung.
Code 128, von Hand geschrieben und geprüft statt geglaubt
Der QR-Code benutzt eine Bibliothek, die für die Zwei-Faktor-Authentifizierung schon in der Lockfile stand: keine Laufzeitabhängigkeiten und ein Renderer, der SVG erzeugt, ohne ein Canvas oder ein DOM anzufassen. Das wiederzuverwenden schlägt das Schreiben eines zweiten QR-Encoders.
Für Code 128 gab es hier kein solches Paket. Die Kandidaten, die die Aufgabe erledigen, schleppen eine Zeichenschicht mit, die auf ein Canvas oder einen Browser zielt, und das ist das Einzige, was ein serverseitig gerendertes SVG nicht haben darf, und sie sind zwei Größenordnungen größer als die Sache selbst. Code 128 ist klein: eine Tabelle von Mustern, ein Startzeichen, eine Prüfsumme modulo einhundertdrei und ein Stoppzeichen. Das sind ein paar hundert Zeilen und keine Lieferkette für eine Tabelle, die sich seit 1981 nicht geändert hat.
Das Problem daran, eine Standardtabelle aus einer Spezifikation abzutippen, ist, dass ein Fehler darin still fehlschlägt. Das SVG sieht perfekt aus, die Tests laufen durch, und Monate später liest ein Scanner in einem Rechenzentrum ein anderes Zeichen. Die Tabelle wird deshalb durch vier unabhängige Invarianten und einen Decoder geprüft, alle in der Testdatei:
- Einhundertsechs Muster außer dem Stoppzeichen, jedes aus genau sechs Elementen, die sich zu elf Modulen summieren.
- Gerade Parität in den Balken. Jedes Code-128-Zeichen hat eine gerade Summe über seine drei Balken; das ist die Eigenschaft, mit der ein Scanner herausfindet, in welcher Richtung er liest, und sie gilt für alle einhundertsechs. Eine einzige falsch getippte Ziffer bricht entweder dies oder die Summe darüber.
- Elementbreiten zwischen eins und vier, und alle einhundertsechs Muster verschieden.
- Das Stoppzeichen, das einzige Muster mit sieben Elementen und dreizehn Modulen.
- Ein Decoder im Test, der die erzeugten Balkenbreiten zurückliest und die Eingabezeichenfolge wiederherstellen muss, Prüfzeichen eingeschlossen.
Eine Tabelle, die vier unabhängige Invarianten und einen Rundlauf übersteht, ist nicht „wahrscheinlich richtig“, und dieser Unterschied ist der ganze Grund, sie zu schreiben.
Wir sind in Subset B geblieben, statt automatisch umzuschalten. Das Etikett trägt Großbuchstaben und Ziffern, die Subset B in einem Durchgang abdeckt. Subset C würde Ziffernpaare halbieren, aber ein Locator ist keine Ziffernfolge, ein automatisches Umschalten wäre also ein Zweig, der nie auslöst.
Das Bogenlayout folgt aus dem Barcode
Vierundzwanzig Etiketten je A4-Seite, drei nebeneinander und acht untereinander. Diese Zahl ist keine gestalterische Vorliebe, sie ist Arithmetik, die in die andere Richtung läuft.
Ein Code 128 mit sechzehn Zeichen ist zweihundertelf Module breit: elf für den Start, elf je Zeichen, elf für das Prüfzeichen und dreizehn für den Stopp. Rechnen Sie zwei Ruhezonen von je zehn Modulen dazu, und Sie brauchen zweihunderteinunddreißig Module in der Breite. Die praktische Untergrenze für einen gewöhnlichen Scanner ist ein Modul von einem Viertelmillimeter, darunter wird das Lesen von zuverlässig zu gelegentlich. Das sind achtundfünfzig Millimeter Barcode.
Vier Spalten auf einem A4 ergeben ein Etikett von etwa zweiundfünfzig Millimetern Breite und ein Modul von knapp zwei Zehntelmillimetern: ein Bogen, der aufgeräumter aussieht und in einem kalten Gang nicht liest. Drei mal acht ergibt ein Etikett von siebzig mal siebenunddreißig Millimetern, eine nutzbare Breite von vierundsechzig und ein Modul von 0,277 Millimetern. Die Anzahl folgt aus dem Code und nicht umgekehrt. Die Seite ist bewusst voll, mit dem Rand innerhalb jedes Etiketts statt um das Raster herum, damit ein Druckertreiber nie etwas skalieren muss, und Skalieren ist das Einzige, was ein Barcode nicht verträgt.
Diese Untergrenze ist eine Konstante im Quelltext statt eines Kommentars, ein Test misst also die Modulbreite des gerenderten SVG dagegen. Eine Layoutänderung, die den Barcode zu dünn quetscht, ist ein roter Test statt einer Beschwerde aus dem Gang.
Ein aktives Etikett je Objekt
Neudrucke sind der Normalfall, die Invariante trägt deshalb die Datenbank und nicht der Code. Zwei partielle eindeutige Indizes, einer für Maschinen und einer für Racks, die einzigen beiden Dinge, die ein Etikett tragen, erlauben höchstens eines, das nicht widerrufen wurde. Ohne sie hinterlässt ein Neudruck, der auf halbem Weg scheitert, zwei gültige Aufkleber auf einer Maschine, und niemand kann sagen, welcher der echte ist. Ein zweites Paar hält die Revision je Objekt eindeutig, ein Neudruck zählt also hoch und wiederholt sich nie. Drei Stellen sind die Obergrenze: Die Zahl muss lesbar bleiben, und tausend Neudrucke einer Maschine sind kein Etikettierungsproblem.
Was wir aufschreiben würden
- Behandeln Sie den Aufkleber als veröffentlicht, und entscheiden Sie über seinen Inhalt mit der Frage, wer ihn in fünf Jahren liest.
- Kodieren Sie die Kennung, nicht einen Link. Sie überlebt einen Domainwechsel, eine neue Marke und eine Übernahme; eine URL überlebt keines davon.
- Machen Sie die Kennung für sich allein wertlos, damit ein verlorener Aufkleber ein Logistikproblem ist und kein Sicherheitsproblem.
- Prüfen Sie eine Normtabelle mit Invarianten und einem Rundlauf, denn diese Fehlerklasse schlägt nie laut fehl.
- Leiten Sie das Drucklayout aus dem kleinsten lesbaren Modul ab, und verankern Sie diese Untergrenze als Konstante, die ein Test messen kann.
Zur Ehrlichkeit über unseren eigenen Stand: Die Arbeit am Rechenzentrum liegt hinter einem Rollout-Schalter, der standardmäßig aus ist, mit einer Einstellung je Organisation darüber, das hier ist also die Beschreibung eines Entwurfs und keine Ankündigung. Zwei Dinge sind ausdrücklich unbewiesen. Die QR-Matrix ist nicht von einer unabhängigen Umsetzung dekodiert worden, denn in diesem Repository gibt es keinen Decoder. Und es ist nichts auf Papier gedruckt und in einem Gang gescannt worden, was für einen Barcode der einzige Test ist, der wirklich zählt. Dieselbe Überlegung dazu, was eine Komponente wissen darf, taucht hier auch anderswo auf: Zugangsdaten bleiben auf dem Host, und der Agent verbindet sich ausschließlich nach außen.
Aus der Rechenzentrumsarbeit bei Provibr. Was zwei Menschen daran hindert, dieselbe Rack-Unit zu beanspruchen, steht in die einzige echte Grenze der Rackbelegung.