 Hallo zusammen, das ist der Sebastian. Der Sebastian wird euch gleich sehr viel über QR-Kurz erzählen. Mehr als ich weiß. Und wer sich fragt, warum ich dann hier stehe, es gibt auf der GBM einen neuen Service für Speaker Harold, die kurz die Speaker ankündigen, was leider in der Waterhack vergessen wurde. Deswegen muss ich es hier noch kurz erzählen. Und wenn ihr euch auch als Harold betätigen wollt, meldet ihr euch nach dem Vortrag einfach bei mir oder bei Sarah. Das wäre sehr nett, weil wir sucht noch Händering nach Menschen, die uns da hilft. Und ja, viel Spaß mit den QR-Kurz und dem Sebastian. Hi. Genau. Gleich mal vorne weg, immer wenn irgendwie Fragen auftauchen, einfach melden. Dann können wir das live machen, wenn es angebracht ist. Ja, ich will über QR-Kurz reden. Wer weiß denn nicht, was QR-Kurz sind? Wer hat denn noch nie einen QR-Kurz gescannt? Wer hat den QR-Kurz noch nicht gescannt? Ja, sehr gut. Wer hat es versucht und nicht hinbekommen? Aha, aha. Ja, aber ich kann euch schon verraten, es gibt keinen optimalen Sitzplatz heute. Mal kurz allgemein zu QR-Kurz. QR steht für Quick Response, also schnelle Antwort. Es gibt mehrere Spezifikationen von QR-Kurz. Die erste war 2000, was wir jetzt in dem Vortrag bereden ist, die von 2006. Und es gibt noch eine neue von 2015, die kostet aber knapp 200 Schweizer Franken. Das waren wir ein bisschen viel. Deswegen gibt es jetzt einen Vortrag zu dem Alten. Ich weiß auch nicht, was sind wir neu in Neues. So viel werden sie aber nicht gemacht haben. Was es auch noch kurz zu erwähnen gibt, es gibt Patente an QR-Kurz. Also es gibt die Firma Denzo Wave aus Japan. Die hat sich den Namen QR-Kurz patentieren lassen. Und sie sagt, sie verzichtet sozusagen auf Klagen oder die rechte Einsfordern, solange man sich an diese Spezifikation hält. So, so viel mal kurz vorne weg. Wir gucken uns jetzt mal direkt die QR-Kurz an. Wie sind die überhaupt aufgebaut? Was man am meisten aufhält, sind diese Feiner-Patterns in den QR-Kurz. Die sind einfach dazu da, damit man den QR-Kurz erkennen kann. Und die sind auch dazu da, den QR-Kurz richtig zu drehen. Also einen QR-Kurz kann man beliebig gedreht scannen. Und man kann halt immer an diesen drei Feiner-Patterns den sozusagen richtig hin drehen, so dass hier halt rechts unten kein feiner Pattern ist. Und dann ist er sozusagen richtig gedreht. Was es dann noch gibt, sind die sogenannten Alignment-Patterns. Das sind die hier. Und die Timing-Patterns, die sind hier an der Seite. Die übersieht man gerne mal, wenn man sie nicht kennt. Die sind einfach dazu da, dass wenn ich das Maschinellese, dass der Leser oder der Scanner dann immer ungefähr weiß, wo er ist. Also damit er sich irgendetwas hat, woran er sich orientieren kann. Das erlaubt halt irgendwie gebölbte QR-Kurz und sowas zu lesen und dann immer noch gut zu erkennen. Okay, was habe ich noch? Es gibt diese Formatinformationen, die sind zum Sikodieren danach her wichtig. Die sind hier unten redundant. Die sind halt nah an den feiner Patterns, damit ich die gut auslesen kann. Es gibt Versionsinformationen, die sind erst in größeren QR-Kurz vorhanden. Die sind hier unten auch nochmal redundant. Die sagen dann für größere QR-Kurz, also ab Größe 7, wir lernen gleich, was das bedeutet, sagen die, okay, der QR-Kurz ist wirklich so und so groß. Und was viele nicht wissen, offensichtlich ist die Quiet Zone. Das ist das grüne Hill drumherum. Der Standard schreibt vor, dass um jedes, um jeden QR-Kurz, also das, was man normalerweise als QR-Kurz interpretiert, sozusagen nochmal vier Module, also diese Pixels, Module, Module weiß ist oder die helle Hintergrundfarbe, wenn man so will. Wenn man das nicht macht, hält man sich nicht an den Standard. Wollts nun mal gesagt haben. Okay, was gibt es dann so für Spielarten von QR-Kurz? Es gibt die Versionen 1 bis 40, die geben im Prinzip die Größe der QR-Kurz an. Also das, gerade waren mittlerer QR-Kurz. Mit jeder Version wächst die Breite und also die Größe allgemein um vier Module. Das heißt, um so größere Diversionen, um so mehr Daten kann ich halt unterbringen. Was QR-Kurz auch noch können, sind Fehlerkoregien. Und da kann ich auch angeben, was für ein Fehlerkorrekturlevel ich haben möchte. Und das geht von L wie Low, das ist dann 7% der Daten, die ich wiederherstellen kann, bis halt High wie 30% Daten, die ich wiederherstellen kann. Natürlich, wenn ich viel Fehlerkorrektur habe, kann ich halt weniger Daten oder Nutzdaten codieren. Das ist klar. Okay, was wir jetzt mal machen wollen, damit ihr wisst, wie QR-Kurz funktionieren, ist, wir wollen mal den String GPN 17 codieren in Versionen 1, also sozusagen den kleinst verfügbaren QR-Kurz und mit Fehlerkorrektur Level L, also dem niedrigsten. So, damit wir das machen, müssen wir erstmal diesen String GPN 17 irgendwie in Bits umwandeln, die wir dann auf den Modulen platzieren können. Dazu gibt es vordefinierte Methoden oder Codierungen, die das machen können. Und ich habe dann mehrere Segmenten, die immer sagen, okay, ich benutze jetzt eine gewisse Codierung, das ist dann durch diese Indikator-Bits dargestellt. Und dann kommt eine Länge. Also wie viel Zeichen folgen denn überhaupt jetzt? Wie viel Bits diese Länge hat, hängt dann von den Versionen ab, jeweils von dem QR-Kod. Bei großen QR-Kod kann ich halt mehr Daten codieren, brauche ich auch mehr Bits, um darzustellen, wie viele Zeichen da kommen. Und dann kommen die Daten an sich. Ich habe jetzt hier mal ein Beispiel. Unten, wenn ich GPN 17 beidweise codiere, dann habe ich also erstmal dieses Indikator-Bits hier, dieses Pattern. Dann kommt die Länge, also bei uns irgendwie 5, wie näher codiert. Und dann kommen halt die Walgen Asci-Werte für GPN 17. Und dann kommt der Terminator, der sagt mir, okay, die Nachricht ist zu Ende. Jetzt habe ich aber nicht nur Bits, ich habe irgendwie die Möglichkeit, numerisch, also Ziffern zu codieren. Ich kann Alphanumerisch, also Zahlen und Ziffern. Ich kann Kanji, japanische Zeichen oder japanische chinesische Zeichen codieren. Ist halt deswegen drin, weil das aus Japan kommt. Und ich muss mir natürlich erstmal überlegen, wie codiere ich jetzt meinen String am effizientesten. Das wird zum Beispiel mal ausprobieren können. Also das Byte-Encoding ist vielleicht nicht das Effiziente, was wir hier machen können. Wir probieren einfach mal aus, die 17 numerisch und das GPN alphanumerisch zu codieren. Dann lernen wir gleich, wie das funktioniert. Das ist jetzt alphanumerisch für die GPN. Da haben wir also irgendwie eine Tabelle von 45 Zeichen, die wir codieren können. Und entsprechend wandeln wir dann die GPN, also die einzelnen Buchstaben, erstmal in den entsprechenden Wertungen. Das wären es bei uns 16, 25 und 23. Und dann fassen wir immer Paare von Werten zu einem neuen Wert zusammen. Da es 45 Werte sind, gibt es für die Paare 2025 Möglichkeiten. Das ist halt nah an 2048 dran. Das lässt sich schön in Elfbit codieren. Deswegen fasst man das zusammen. Bei uns ist jetzt so, dass wir die 16 und 25 zusammenfassen, indem wir halt 16 mit 45 motivieren und dann 25 addieren. Die 23 bleibt alleine stehen. Das funktioniert, weil wir vorher angegeben haben, wie viele Zeichen kommen. Das heißt, wir können die einzelnen codieren und wissen dann, okay, wir brauchen hier nur 6 Bit, um die 23 zu codieren. Und das sieht entsprechend so aus am Ende und steht für GPN. Für die 17, von der GPN 17, funktioniert das so, dass ich immer drei Zeichen zusammenfasse. Damit habe ich 1000 Möglichkeiten. Ist nah an 1024, lässt sich also schön in 10 Bit codieren. In unserem Fall haben wir aber nicht mal 3, wir haben nur 2. Und demnach reichen uns 7 Bit. Sieht dann so aus. Alles zusammen kommen wir dann auf 50 statt 56 Bits. Da haben wir viel gewonnen. Das Problem ist einfach, dass wir halt diesen Codierungsmodus, also dass wir hier ein neues Segment aufmachen. Und dadurch müssen wir halt nochmal angeben, okay, jetzt kommt ein neues Segment. Das ist so und so codiert und das ist so und so lang. Das kostet natürlich auch Bits. Jetzt können wir aber merken, Alphanomärisch hat irgendwie auch das Wort numerisch drin. Vielleicht können wir GPN 17 komplett alphanomärisch codieren. Und das geht natürlich auch. Also hier die Spalte und so, das ist ja andersrum hier links immer. Das sind ja genau die Ziffern. Das heißt, wir machen nochmal komplett GPN 17 alphanomärisch. Haben wir jetzt auch schon gelernt, wie das geht. Also bilden wir die Paare, die 6 und die 95, die 23 und die 1 und die 7 allein. Und damit kommen wir dann auf 45 Bit. Und das ist schon ein bisschen besser. So, was wir jetzt als nächstes gerne machen würden, wäre Fehler-Kollektur. Das Problem ist, die Fehler-Kollektur braucht eine gewisse Bitanzahl. Und deswegen kommt noch ein Zwischenschritt. Wir müssen nämlich Padding, Bits und Code Wörter einfügen. Das funktioniert so, dass wir haben jetzt am Ende 5 Bit stehen. Die müssen wir erstmal mit Nullen füllen, bis wir ein komplettes Bei zusammen haben. Und dann füllen wir auf halt die Kapazität von unserem Code auf mit einem festen Bitmuster. Das sieht man hier in der Hexadezimale. Das ist immer EC 11 Hexadezimal. Das ist einfach immer dasselbe, so lange bis wir sozusagen voll sind. So, und dann können wir letztendlich da Fehler-Kollektur drauf loslassen. Das ist Reed Solomon, wem das was sagt. Das ist für uns erstmal magisch, was da passiert. Das heißt, da kommen einfach Bits dran und mit diesen Bits oder mit diesen Wörtern. Das ist beidweise funktioniert die. Und wir dann irgendwie Fehler, die beim Lesen passiert sind, korrigieren. So, jetzt sind wir so weit, dass wir unsere ganzen Bits in den Modulen platzieren können. Ich habe jetzt hier mal alles blau gemacht, was irgendwie anderweitig belegt ist. Und das, was jetzt weiß ist, ist sozusagen der Platz, wo dann unsere Daten hinkommen. So, und das geht wie im Kindergarten. Also wir fangen hier rechts unten an und machen dann immer in zweier Reihe, arbeiten wir uns vor. Das heißt, die Null kommt dann hierhin, dann die Null und dann geht das immer so weiter. Und irgendwann sind wir oben angekommen. Wenn wir oben angekommen sind, dann geht es rückwärts weiter. Also jetzt gehen wir wieder nach unten. Auch wieder schön, Kindergarten, zweier Reihe, bis wir unten sind. Und dann geht es wieder nach oben. So, und dann, also ich kürze mal ein bisschen ab. Dann geht das schön durch. Was jetzt passieren könnte, passiert hier nicht, dass noch Module übrig bleiben. Also nicht komplette Bites, aber es könnten zum Beispiel jetzt 3 Module oder 7 Module übrig bleiben. Dann ist auch vorgeschrieben, wie man die entsprechend auffüllt. Oder welche Daten man da rein platziert. So, jetzt gucken wir uns das mal irgendwie ohne Gitter an. Und was man jetzt sieht, ist folgendes Problem. Ihr stellt euch vor, ihr seid so ein maschineller Scanner. Und dann seht ihr hier so einen langen weißen, oder ihr scannet das seienweise und seht dann so was langes weißes und denkt so, uah, wie lange waren das jetzt eigentlich, war das gewölbt und ist deswegen kürzer als es sein soll oder wie. Das heißt, es gibt so ein paar Dinge, die für maschinelle Scanners nicht so schön sind. Und das sind halt zum Beispiel lange einfarbige Streifen oder auch vertikal genauso. Es sind aber auch irgendwie große Blöcke von einer Farbe, ist nicht so schön. Was auch nicht so schön ist, wenn dieses Muster hier, also so ein dunkles, ein helles, 3 dunkle, ein helles, und dann irgendwie 4 helle vorne oder hinten dran, also nach vorne oder hinten dran. Wenn das irgendwie im Code selbst vorkommt, dann könnte der Scanner denken, oh, ich habe so ein feiner Pattern gefunden, der QR Code ist komisch gedreht oder wie auch immer. Das mögen wir also auch nicht und was wir auch nicht mögen ist irgendwie, wenn insgesamt über den ganzen QR Code viel mehr schwarz als weiß vorkommt. Also, was ich möchte, ist im Prinzip ein Schachbrettmuster. Also, das werde ich nie erreichen natürlich, aber ich möchte irgendwie viel Kontrast haben, ich möchte viel Wechsel haben, wenn ich das gerne, damit ich mich besser orientieren kann. Deswegen gibt es da entsprechend, ich sage mal, Strafpunkte, wenn man so ein Muster drin hat. Wie man die genau berechnet, ist meiner Meinung nach im Standard sehr schwammig abgehandelt. Deswegen werde ich das jetzt auch irgendwie keine Zahlen dahinschreiben, aber soweit, sei es mal gesagt, das ist böse. So, und was wir machen, um das ein bisschen lieber zu machen, ist, wir haben Masken. Die Masken legen wir über die Daten drüber, also versorgen das und hoffen dann, dass es besser wird. Es gibt acht vordefinierte Masken und wir probieren alle aus und nehmen dann die Beste. So, und hier habe ich jetzt einfach mal alle aufgezählt. Ihr könnt ja mal so gefühlt sagen, was das Beste ist. Das ist zum Beispiel hier wieder irgendwie ein bisschen doof, das sieht okay aus. Da gibt es auch wieder so ein bisschen große Flächen, weiß man alles nicht. Also, die werden jetzt einfach durchprobiert und bewertet und am Ende, sag mal, das ist zum Beispiel sehr schlecht dieses Ding, weil hier ist so ein feiner Pattern. Also, wenn ihr das seht, eins, drei, eins, das ist, die Maske wird schon mal rausfliegen. Ich habe jetzt für den Vortrag einfach mal beschlossen, wir nehmen diese Maske, weil das die Software, die ich da benutzt habe, um Referenzdaten zu haben, einfach gemacht hat. Meine Software habe ich auch mal Scores ausrechnen lassen, die war für eine andere Maske, was interessant ist. Was aber vielleicht auch daran liegt, dass diese Software, die ich benutzt habe, hier diese Formatinformation, die hier noch hinkommt und hier und hier vorher platziert und dann diese Bewertung macht und der Standard sagt, muss du nicht. Was ein bisschen komisch ist, eigentlich soll der Standard sagen, platziert die Bits dahin oder die Module und guckt ihr dann den QR-Code an. Okay, also wir wählen einfach mal diese Maske, die sieht einigermaßen brauchbar aus. Und damit machen wir jetzt weiter und wollen jetzt genau diese Formatinformation ausrechnen. In der Formatinformation stehen zwei Dinge drin, nämlich erstmal das Fehler-Karaktur-Level und die gewählte Maske. Fehler-Karaktur-Level haben wir gesagt, ist L bei uns. Maske haben wir gerade ausgewählt, Nummer 6. Das L hat einfach eine Bineerkodierung, es gibt vier Korrektur-Level. L steht halt einfach per Konvention für 0,1 und Maske 6 wird halt bineerkodiert, es 1,1,0. So, dann machen wir da auch Fehler-Karaktur-Magie. WCH-Code nennt sich das. Plasen von diesen 15-Bit auf und haben dann die schöne Eigenschaft, dass drei Bit falsch sein dürfen und wir immer noch das richtige Datenwort rausdrehen. Sehr auch nett, weil wenn ich da irgendwie falsch lese, ist natürlich blöd. Damit kommen wir also auf diesen schönen Bit-String. Was wir machen, bevor wir das in den QR-Code noch reinhauen, ist das nochmal mit einem festen Bit-Muster maskieren und dann haben wir unsere finalen Formatinformation und die wollen wir jetzt im QR-Code platzieren. Ich habe anfangs schon erwähnt, dass die redundant vorhanden sind. Also man sieht einmal, dass die Formatinformationen hier stehen. Ich habe jeweils die sozusagen Bit-Positionen hingeschrieben und sie stehen auch nochmal hier unten an dem und hier oben unter diesem Bit, unter diesem Finer-Pattern. Das heißt, falls da irgendwo ein Klecks auf dem QR-Code ist, zum Beispiel hier so, kann ich immer noch an anderer Stelle die Formatinformation auslesen und dann halt den QR-Code dekodieren. So, das machen wir jetzt einfach mal, platzieren da die Bit-Stringen und dann sind wir soweit fertig. Jetzt müssen wir nur noch, was hier blau hinterlegt ist, einfach tatsächlich in den QR-Code zeichnen, schön viel Platz drum herum und dann ist der QR-Code fertig. Sollte funktionieren, bitte. Einer scammed, sitzt soweit vorn. Irgendwer, okay, einer hat es gescanned gekriegt. So, was passiert jetzt beim dekodieren, werde ich natürlich ein bisschen schneller drüber gehen, weil wir jetzt im Prinzip die Struktur schon verstanden haben. Beim dekodieren gucke ich jetzt erstmal die Finer-Patterns und die Struktur um die Finer-Patterns an. Das heißt, ich finde erstmal diese Finer-Patterns, orientiere den QR-Code entsprechend und was ich auch machen kann, ist, wenn der QR-Code farbinvertiert ist, also schwarz und weiß vertauscht, das darf man machen, dann kann ich das auch an den Finer-Patterns feststellen und entsprechend umwandeln. So, dann lese ich die Formatinformation. Die haben wir gerade hier geplaziert zum Beispiel. Ich habe also jetzt den Failure-Correct-Tour-Level, habe die Maske, die ich benutze, lese die Versionsinformation. Die ist jetzt bei uns nicht drin, die ist erst ab Version 7 drin. Wir haben Version 1 Grad, also da müssen wir jetzt nichts machen. Und dann wende ich meine Maske auf die Daten an, das habe ich jetzt mal hier gemacht, dann lese ich natürlich die Daten, gucke, ob da irgendwie Fehler drin sind, korrigiere die Fehler, wenn möglich. Und dann zerlege ich meine Daten in diese Sekmente, wo die Kodierungen drin standen, also wo ich sage, okay, das ist Alphanomerisch kodiert und so weiter. Und die kodiere ich diese Sekmente dann entsprechend. So, gibt es soweit Fragen? Yay! Alle eingeschlefert. Ja, super. Ja, jede Version gibt dir vor, also das hängt ab von irgendwie deinem Fehler-Karaktur-Level und deiner Version, die du gewählt hast. Und du hast aber einfach eine riesige Tabelle sozusagen, wo drin steht, okay, für Fehler-Karaktur Level L und Version 1, 19 Datenworte. Also das kannst du einfach nachgucken sozusagen im Standard. Das ist ja völlig lieb. Ja, aber genau, dafür ist die länge Information da. Und die Padding-Code-Worte kommen mir erst nachdem du gesagt hast, okay, hier ist das Nachricht. Es gibt ja extra so 0000, das sagt, okay, Nachricht zu Ende. Hier kommt nichts mehr außer Padding-Information. So, dann kommen wir jetzt zum lustigen Teil. QART. Also QART soll irgendwie so eine Mischung aus QR und Art sein, also Kunst, basiert auf einem Block-Post oder eingeführt von einem Block-Post von Rustcox und sieht ungefähr so aus. Das ist jetzt das Gomaskottchen. Die Idee ist also, ich habe ein QR-Code und ich möchte da irgendwie ein Bild reinmachen. Wie funktioniert das? Und ich möchte es auch so machen, dass ich nicht die Fehler-Karaktur kaputt mache. Also ich kann immer ein QR-Code nehmen, ich kann sagen, maximal Fehler-Karaktur, klatscht ein Bild drauf, geht natürlich. Aber dann, wenn dann noch irgendwie ein Fehler in dem QR-Code ist, hat es halt der Leser, also der ist gerne schwieriger. Plus Denzo-Wave ist da ein bisschen empfindlich, mindestens wenn das Bild farbig ist. Also er versucht sich maximal an die QR-Code-Spezifikation zu halten. So, wie ist die Idee? Die Idee ist, ja, häufig habe ich halt URLs in QR-Codes und URLs kann man so ein Hash dranhängen und dann kommt ein beliebiges Label und der Proser sucht dann dieses Label und wenn er es nicht findet, ist es auch nicht schlimm. Das heißt, ich kann hinter diesem Label einfach beliebig Daten codieren. Und dann wähle ich die Daten halt so, dass da dieses Bild rauskommt. Warum nicht? Was ist jetzt das Problem dabei? Also erstmal muss ich irgendwie diese Daten so codieren, dass der Proser nicht denkt, oh, jetzt kommt eine neue URL oder jetzt kommt ein neuer TAP mit einer neuen URL oder sowas. Also ich muss aufpassen, dass da keine Sonnerzeichen vorkommen. Und was ich außerdem mir überlegen muss, ist, wenn diese Daten irgendwie, oder wenn das Bild, was ich darstellen will, den Bereich überdeckt, wo Fehler-Calculature-Informationen drin sind. Über die habe ich ja keine Kontrolle. Wie kriege ich dann dieses Bild sozusagen in die Fehler-Calculature-Daten rein? Gucken wir uns an. Diese Daten hat er jetzt einfach nur mehr skudiert. Damit habe ich irgendwie 1.000 von 1.024 Daten oder Encodings, die ich darstellen kann. Wenn ich jetzt irgendwie wirklich Bilddaten habe, die ich halt nicht in diesen 1.000 Encodings drin ist, verlasse ich mich halt auf die Fehler-Calculature, macht auch nichts. Also Bandspruch die Fehler-Calculature auf jeden Fall deutlich weniger, als wenn ich einfach ein Bild drauf klatsche. Das heißt, dieses Bild, was wir eben, oder den QR-Code, den wir gesehen haben, der sieht so aus, ist halt auf die Go Home Page, dann ist dieses Label da und das hat halt irgendwie komische Binnert, also komische Ziffern, die halt genau dieses Bild codieren. Okay, das klappt also schon mal ganz gut. Jetzt wird es ein bisschen komplizierter. Fehler-Calculature. Fehler-Calculature hatte ich schon erwähnt, hat ein Resolomon-Code und die haben eine schöne Eigenschaft, nämlich, dass sie in Unterwechterraum bilden. Das heißt das, wenn ich irgendwie einen gültigen Resolomon-Code habe und noch einen gültigen Resolomon-Code und ich nehme exklusives oder Fasso, die sozusagen, dann kommt wieder ein gültiger Resolomon-Code raus. Und damit sind wir sofort in der Linie an Algebra und Basis und überhaupt. Damit haben wir also Struktur, die wir nutzen können. So, wie sieht das hier aus? In dem Beispiel habe ich jetzt den Blaumarketen bereit. Das sind sozusagen die Daten, über die wir verfügen können. Also die Daten können wir angeben. Das sind jetzt hier 16-Bit, also zwei Code-Württel. Und dann haben wir die Fehler-Calculature-Daten, die sind hier rechts. Über die habe ich halt keine Kontrolle. Das heißt, die resultieren dann aus dem Code-Württel. So, was ich jetzt mache, ist erstmal mir eine Basis bilden von meinem Daten, die ich codieren möchte. Und das mache ich folgendermaßen. Ich sage einfach, okay, mein erstes Wort oder mein ersten Basis-Vektor hat einfach das erste Bit gesetzt und den Rest 0. Zweite Basis-Vektor, also das zweite Bit gesetzt, Rest 0 und so weiter. Das heißt, wir haben einmal so die Hauptdiagonale runter. Das sind alles meine schönen Basis-Vektoren. Und mit denen kann ich mir meine Nutztaten beliebig zusammenbauen. Ja, also wenn ich hier irgendwie 0, 0, 1, 1 haben will, dann nehme ich halt den ersten nicht, den zweiten nicht, wunderbar, klappt ohne Probleme, keine Konflikte, gar nichts. Schwieriger wird es halt, wenn ich irgendwie in diesen Daten, die für die Feder-Kektur da sind, hier mal eine 1 haben will. Und was ich dann mache, oder was ich machen kann, eventuell, ist eine Basis-Transformer 2. Und zwar gucke ich jetzt mal für die 1, wer kann denn die beeinflussen und finde ich diesen, ich gucke ein bisschen schräg, das ist schwierig, finde ich diesen Eintrag und der gehört zu diesem hier. Und der wird nicht irgendwie benutzt, um schon Daten zu schreiben. Das heißt, ich kann jetzt einfach die entsprechende Zeile mal nehmen und oben auf die restlichen Einträge drauf verdienen oder versorgen damit. Das sieht dann so aus, dann habe ich hier plötzlich mehr 1 drin stehen, aber ich habe hier eine einzige 1 und damit habe ich jetzt plötzlich eine andere Basis, die aber dieses Bit mitbestimmt. Das kann ich sozusagen nicht, also klar, ich kann das beliebig oft machen, aber ich werde damit nie irgendwie mehr Bits auf einmal darstellen können, sondern ich verliere halt genau dann Kontrolle hier drüber wieder. Also ich kann mir aber so ein bisschen die Bits aussuchen, über die ich Kontrolle habe. Das heißt, wenn ich das Bild in die Feder-Kektur Bits reinschiebe, ist es gar nicht so schlimm. Ich kann das irgendwie da so ein bisschen rumpfrickelen mit linearer Algebra-Magie und dann geht das wieder. So, für dieses Bit dahinten wird es aber ein bisschen schwieriger, weil diese 3 Bits, die das beeinflussen können, sind schon hier vorne irgendwie festgelegt und die sind dummerweise alle 0. Das heißt, wir werden hier immer eine 0 kriegen, egal was wir machen, und die 1 werden wir nie hinkriegen. Das heißt, das ist jetzt nicht ein Alheimittel, aber so ansatzweise funktioniert es schon ganz gut. So, was er dann in diesem Blog-Post macht, ist zu sagen, okay, ich habe halt hier unten meine Daten, die ich haben möchte, und die sortiere ich dann nach Wichtigkeit. Wichtigkeit ist bei ihm hoher Kontrast. Also wenn ich irgendwie eine weiße Fläche habe und da taucht plötzlich mal so ein schwarzes Modul auf, überhaupt nicht schlimm. Ich erkenne das Bild trotzdem noch. Wenn ich dann viel Kontrast an irgendeiner Stelle habe, dann ist vielleicht wichtig, dass da der Pixel die richtige Farbe hat, oder das Modul. Deshalb sortiert er das und dann versucht er immer die Basis so zu transformieren, dass halt die Basis-Vektoren entsprechend dieses Modul abdecken. Und entweder es klappt, dann ist es gut oder es klappt nicht, dann machen wir halt mit dem nächsten weiter. Und dann kommen halt Bilder raus, wie wir es eben gesehen haben. Also es klappt schon ziemlich gut, würde ich sagen. So, wir können das auch anders darstellen. Wir können auch sagen, okay, wir haben hier ein großes Linears-Gleichungssystem, wo wir sagen, okay, Basis 0. Was dieser Punkt ist, ist halt 0, Basis 1 ist 0. Und dann haben wir immer hier entsprechend die Einträge. Und bei den Federkorrektur-Bits wird es halt ein bisschen komplizierter. Da haben wir hier für diesen zum Beispiel Basis 2, 3 und 10, die zusammen exklusiv verodert 1 ergeben müssen. Und bei dem hier halt 0, 1 und 8. Nur blöderweise sind halt 8, 1 und 0, schon alle 0. Deswegen wird das halt nicht löstbar sein, dieses Gleichungssystem. Aber wir können das genauso so modulieren, wenn wir halt eine exakte Lösung haben wollen. Also wenn wir sagen, dieses Bild und keinen Pixel anders, können wir das auch als Linears-Gleichungssystem modulieren. So. Das geht noch weiter. Also irgendwann bin ich mal über dieses Quad gestoßen und dann habe ich mir das angeguckt, so ein bisschen nachgedacht und irgendwann habe ich mich gefragt, können wir eigentlich so ein QR-Code, also wir können Bilder oder Daten da reinkodieren, die beliebig aussehen. Können wir es eigentlich so machen, dass ein QR-Code in dem QR-Code ist? Also nicht in dem Sinne, dass ich einen riesigen QR-Code habe und da drin ist ein kleiner QR-Code. Nein, anders. Ich habe Nachricht A, wenn ich den QR-Code normal scanne. Wenn ich den QR-Code spiege und scanne ihn nochmal, kriege ich eine andere Nachricht. Wer da reingegangen ist, der war so ein Aufsteller. Ich sag es nur. Also Titelfolie. Also ist genau hier der Fall, hier kommt Nachricht A raus, hier kommt Nachricht B raus. A, B. Könnt ihr gerne probieren? Lasst euch ein bisschen Zeit. Kann man was trinken in der Zeit? Jemand hingekriegt, das A zu scannen? Jemand hingekriegt, das B zu scannen? Ja, okay. Wir haben beides mal gesehen. Also, es geht offensichtlich, aber wie? Das erste Problem ist irgendwie Formatinformation. Vielleicht überlegen wir nochmal kurz, was das bedeutet, einen QR-Code zu spiegeln. Stellt euch das so vor, als wenn ihr den kompletten QR-Code an der Hauptdiagonale spiegelt. Also, für Formatinformation heißt das irgendwie, Bit 14, Bit 0 werden getauscht, 13 und 1 und so weiter. Hier unten ist das... Also erst mal ist es ideal, weil ich lande genau wieder auf Formatinformation, Bits. Das ist schon mal nicht schlecht. Hier ist es ein bisschen komplizierter, Beziehung wird hier mit diesem Modul getauscht, was immer schwarz ist. Also, es gibt ein Modul, was immer schwarz ist, neben QR-Code und nicht zu irgendwie feiner Patterns oder so gehört. Das ist dieses Ding. Okay, also, ich möchte irgendwie Formatinformationen haben, die, wenn ich sie so rumlese, okay sind. Und wenn ich sie so rumlese, okay sind. Und wenn dieses Bit schwarz ist, wäre es auch nicht verkehrt. Und es stellt sich heraus, dass es funktioniert. Beispielsweise mit Maske 1 und Maske 4, jeweils Skulptur Level L. Die untere Maske ist jetzt schon invertiert, also dieses sozusagen rückwärts dargestellt. Und was wir dann haben, ist irgendwie nur 3 Bits, die sich unterscheiden. Die können wir jetzt noch verteilen sozusagen auf die verschiedenen Formatinformationen. Jetzt sagen wir hier, Maske 2 hat halt irgendwie 2 falsche Bits, Maske 4 hat ein falsches Bit. Unsere Formatinformation kann irgendwie 3 Bit korrigieren, alles gut. Also, ein Federkollektur ist gar nicht so schlecht. Wunderbar. Dann können wir das schon mal reinsetzen. Dann kann es ja weitergehen. So, jetzt gucken wir uns nochmal unsere Nachrichten an. Nachricht A ist wieder alphanomerisch kodiert. Nachricht B ist diesmal beidweise kodiert aus didaktischen Gründen. Ich erkläre gleich, was passiert wäre, wenn ich das auch alphanomerisch kodiert hätte. Und die platzieren wir jetzt einfach mal in unseren Daten. Da der gespiegelt ist, geht das hier halt nicht nach oben, sondern nach links. So, das kennen wir schon. Das ist gespiegelt. Jetzt haben wir Daten. Sind aber noch nicht fertig, weil irgendwie gab es ja noch diese komischen Masken. Okay. Jetzt haben wir irgendwie ein Problem. Jetzt ist hier irgendwie schwarz, schwarz, schwarz. Und hier ist so weiß, weiß, schwarz. Ist irgendwie doof. Also, hier haben wir so Konflikte. Wenn wir B auch alphanomerisch kodiert hätten, hätten wir die nicht. Deswegen aus didaktischen Gründen. So, jetzt muss man irgendwie damit umgehen. Also, umso mehr Daten ich habe, die wachsen ja hier auch wieder runter. Das wird immer schlimmer, je mehr Daten ich da irgendwie, oder je länger die Informationen sind, die ich da reinkodiere. Wie man damit umgeht, ist einfach, dass man sagt, okay, das Ding hat Fehlerkollektur. Die nutzen wir halt. Und dann muss ich eben diese, sozusagen, Module, die sich uneinig sind zwischen den QR-Codes, muss ich halt irgendwie verteilen auf die beiden QR-Codes, sodass die Fehlerkollektur das noch korrigieren kann. In dem Fall ist es nur eins. Das ist nicht so schlimm, das kriegen wir auf jeden Fall hin. Wir sagen jetzt hier einfach mal, der linke QR-Code, also QR-Code A, hat hier, sozusagen, fehlerhafte Bits oder Module, und weisen dem das zu. So, und was wir dann machen, ist ein riesiges lineares Gleichungssystem aufstellen. Das sieht dann etwa so aus. Das ist jetzt immer nur für diese vier Bits. Wir haben wieder Basis-Vektoren, mit denen wir herantieren, die entsprechen halt am Anfang den Bits, weil das halt genau die Daten sind, die am Anfang kommen. So, und jetzt sagen wir hier irgendwie unser erster Basis-Vektor mit dem entsprechenden maskierten Bit. Also, was halt die Maske sagt, ob ich da irgendwie maskieren muss oder nicht, soll halt eins ergeben. Das nächste auch, wobei ich hier halt ein Fehler habe. Das wird immer 1 sein. Das ist jetzt nur hier als E1 markiert, damit man es hier mal sozusagen wieder erkennt. Und hier entsprechend auch zu 1 werden und da 0. Das heißt, wir haben hier 1, 1, also 1, 1, 1, 0. Und hier drüben auf der B-Seite haben wir entsprechend, hier fangen wir an, 1, 0, 0, so. Und mittendrin kommt sozusagen das verbindende Client. Das sagt einfach, okay, und diese Module sollen bitte gleich sein. Also das, was ich hinterher sehe, soll bitte die gleiche Farbe sein. Und das wird halt einfach so gemacht, indem ich hier die entsprechende Seite nehme und gleichsetze. Das stimmt nicht. Ich glaube, hier muss das eh nicht drin sein, weil jetzt setze ich ja irgendwie 0, 0 mit 1, 1 gleich. Korrigiere ich für die Version, die hochgeladen wird. So, jedenfalls kann ich das gleiche System lösen und kommen halt, wie gesagt, diese beiden QR-Codes, der ist jetzt mal sozusagen richtig orientiert. Und jetzt habe ich schon mal 2 QR-Codes oder 2 Nachrichten, irgendwie ein 1 QR-Code kodiert, was sehr lustig ist, speziell, wenn man irgendwie durchsichtige Flächen hat. Also so QR-Codes immer auf Folie drucken. Folie und Rückseite ist ganz toll. So, wir sind aber noch nicht fertig. Weil damit kann man natürlich auch irgendwie Bilder reinbassen. Wir haben ja am Anfang gesehen, da war so ein großes Tortenstück. Das ist jetzt auch nicht mehr schwierig, nachdem wir das alles da haben. Wir sagen einfach, okay, irgendwie halt AI, also unser Basisvektor E und die Maske E. Also das kann auch irgendwie ein längerer Ausdruck sein, wenn wir Fehlerkrakturbits haben. Soll halt einfach unser Pixel Wert sein und entsprechend für B. Und die Gleichheit brauchen wir dann nicht mehr, weil wir sagen ja, welcher Wert das sein soll. Und dann, wenn das löstbar ist, das Gleichungssystem, kriegen wir auch einen QR-Code, wo dann das Bild perfekt drin ist. So, lustigerweise kann man auch einfach verschiedene Pixel angeben. Man kann sagen so, bei einem bitte hell, bei einem dunkel, warum will man das? Man könnte so einen QR-Code basteln und wenn man den ausmacht, kriegt man einen anderen QR-Code. Zum Beispiel, also es gibt Anwendungen dafür. Könnt ihr gerne probieren. Also der ist gut zu scannen, der ist schwieriger zu scannen. Weil der ist sozusagen der, der gespiegelt ist, das machen manche Apps nicht mit. Jemand hingekriegt, so Achtung, gucken, dass sich nur das Herz ändert. Wie gesagt, der geht besser. Schon mal cool. So, jetzt bin ich viel schneller durch, als ich eigentlich durch sein wollte. Das heißt, ich habe viel Zeit zu fragen am Ende. Ich wollte noch ein bisschen was über Software erzählen. Also ich habe ja mit dem Zeug so ein bisschen rumgespielt. Hab natürlich ein paar Apps probiert. Hab natürlich immer kurz gehabt, die irgendwie Federkoktor ausnutzen, die komische Formatbits haben, wo Fehler drin sind. Und was halt ganz gut funktioniert, ist ZIPAR Crossings. Das ist tollerweise auch irgendwie online verfügbar und es ist open source und überhaupt. Einfach nettes Projekt funktioniert auch. Bei den Generatoren, also wenn man sagt, okay, man möchte jetzt normalen QR-Code generieren, gibt es auch jede Menge Webseiten, die haben dann auch jede Menge Premium-Angebote. Das heißt so, die Webseite, die einfach nur das macht und sonst die Klappe hält, habe ich jetzt spontan nicht gefunden. Aber ich meine, funktionieren tun sie trotzdem. Und es gibt auch irgendwie so Offline-Tools, also QR-Encode. Habe ich zum Beispiel immer benutzt, um irgendwie mal Referenzdaten zu haben, wenn ich das damit rumgespielt habe. Ist auch open source, also auch wunderbar. So, zu dem QR-Art gibt es wie gesagt ein Blog-Post. Wenn ihr jetzt angefix seid und sagt, oh, das ist spannend, könnt ihr euch gerne mal durchlesen, das ist ziemlich interessant. Steht auch ein bisschen mehr drin zu Themen, die ich jetzt nicht erzählt habe. Und es gibt auch eine Webseite, wo ihr sagen könnt, okay, ich möchte den QR-Code dieses Bild machen. Das heißt, das kann man online ausprobieren, unbedingt machen. Und ich möchte jetzt, wenn ich rausgehe, nur euch vor diesen Bildern sitzen sehen. Okay, ja, ich habe meinen Software noch nicht irgendwie online. Kommt aber noch. Das ist mein GPN-Projekt. Okay, damit wären wir sozusagen durch. Ihr wisst jetzt, man kann tolle Sachen mit QR-Codes machen, man kann die irgendwie schön machen, man kann Bilder reinmachen. Macht das doch mal. Also, macht das und vergesst nicht irgendwie die Qualität. Also, immer schön ran drumherum. Ja, es ist tatsächlich schlimm. Also, wenn man mal rumgeht und jetzt guckt mal, ihr wisst so vier Module Platz ist bei jedem zweiten QR-Code nicht. Also, könnt dann ein bisschen klug scheißen. So, jetzt Fragen. Da gab es schon eine. Die Frage war, wenn ich halt zu wenig Qualitation habe und damit nicht die Explikation entspricht, dann muss ich dann Lizenzgebühren zahlen. Man muss natürlich nicht, du läufst halt Gefahr, also verklagt zu werden sozusagen. Ja, also, ob jetzt so eine Klage durchkommen würde, ist natürlich immer noch mal so eine eigene Sache. Bis jetzt hat Densowave noch nicht wegen der fehlenden Qualitation geklagt. Also, nicht, dass ich wüsste. Sag es mal so. Noch Fragen. Ja, da kann man QR-Code in der Shell anzeigen lassen. Ich kenne kein Tool, ich habe aber auch irgendwie nicht das benötigst. Aber hier vorne werden sich... Also, hier vorne wird gesagt, es gibt fertige Tools. Auf der Vortrags-Seite, die Vortrags-Seite ist eine Wiki-Seite. Da wird dann Link auftauchen, gehe ich fest davon aus. Noch Fragen. Die Frage war, wie schaut das mit mehrfarbigen QR-Codes aus? In dem Sinne, dass ich zwar ein RGB-Image habe und ich habe im R-Kanal einen QR-Code und in den anderen Kanälen auch, geht natürlich. Kann kein Schwein scannen, also muss natürlich wieder... Also, will man auch nicht scannen, natürlich. Aber du kannst natürlich die Kanäle kombinieren in einem Bild und du musst es halt zum Scannern wieder dekodieren. Hatt ich auch schon als Geocache so ein Drehzel, sag ich mal. Also, gibt es... Die Frage war, gibt es Ansätze, um QR-Codes mit mehreren Graustufen zum Beispiel zu bauen? Nicht, dass ich wüsste. Also, generell ist es so, dass Densowave halt für farbige QR-Codes so ein bisschen allergisch reagiert. Also, da könnte ich mir schon vorstellen, dass wir dann irgendwann mal anfangen zu klagen. Also, da steht explizit zu sagen... Also, es gibt QR-Code.com, ist das, glaube ich, von denen eine Webseite, da ist ein FAQ dazu. Und da steht sozusagen drauf, wenn ihr irgendwie Bilder oder Dinge über euren QR-Code drüberlegt, kontaktiert uns doch vorher. Ja, da gibt es eine Anmerkung. Also, hier wurden schon bunte QR-Codes gesichtet. Generell, also farbig machen kann man die. Aber halt zweifarbig, immer. Das geht, prinzipiell. Es gibt auch Projekte, da hatte ich leider nicht die Zeit, das noch auf Folien zu gießen, wo wirklich QR-Codes, sag ich mal, künstlerisch ein bisschen verfremdet wurden. Ich habe zum Beispiel mal ein Paper in der Hand gehabt. Da haben sie gesagt, okay, wir nehmen wirklich ein Hochauflösungsbild und stellen das dann mit ganz feinen grauen Punkten da, die halt auf die Summe gesehen, gerade so schwarz sind oder gerade so weiß. Aber ich habe viel mehr Möglichkeiten, wie ich diese Module darstelle. Also, ein Modul besteht dann aus vielen kleinen Pixeln in verschiedenen Graustufen. Und wenn der QR-Scanner gut ist, kann er das trotzdem noch scannen. Kann ich, wenn ihr wollt, auch gerne irgendwie nochmal raussuchen und entsprechend auf der Seite zu dem Vortrag verlinken. Frage. Hier kam gerade die Anmerkung zu, der Anmerkung eben. Microsoft, was hast du gesagt? Bicode, B-Tech, ja, könnten das auch. Also, sind so farbig und bestehen aus drei Ecken. Noch eine Frage. Die Frage war gerade, warum Handyhersteller in die Kamera-App keinen QR-Cod-Ride eingebaut haben, sondern warum man extra Apps dafür installieren muss. Weiß ich nicht. Aber, ach, also Motorola kann das, kam gerade hier. Also, ein paar haben das anscheinend nach Anmerkung aus dem Publikum. Die Frage war, ob ich Fehlerkorrektur-Eigenschaften verliere durch dieses QR-Art. Eben nicht, indem ich das in Nutzdaten codiere, verliere ich keine Fehlerkorrektur-Eigenschaft. Also, ich habe genauso Fehlerkorrektur-Eigenschaften wie normaler QR-Code. Motorola halt diesen 24 von 1.024 Möglichkeiten, wo ich sage, okay, das kann ich jetzt gerade nicht als Ziffernfolge darstellen. Da kann mal ein Fehler drin sein, aber das kommt halt eher selten vor. Noch Fragen. Wie reagieren die Apps, wenn sie falsch sind? Exzellente Frage. Gar nicht. Also, den ist das völlig Nutz. Die Sachen, die ich gezeigt habe, nutzen das aus. Also, wenn du so ein QR-Quadrat, wie ich es ja genannt habe, Code baust, der sagt immer, okay, hier ist der QR-Code zu Ende und jetzt kommen irgendwelche Daten. Und das hat nichts mit Padding zu tun. Also, das wird aktiv ausgenutzt. Das ist nicht so, warum machst du so komische Heshs und Ziffern? Macht halt auch einfach Daten rein. Was er halt wollte, ist sozusagen sich möglichst an die Spitzagation halten. Die halt sagt, da müssten muss Padding rein. Die Scanner an sich, also ich habe noch keinen Scanner gesehen, der irgendwie nach guckt, das Padding ist richtig oder nicht, sondern die sagen einfach, okay, hier wird die Nachricht auf. Alles gut. Die Frage war für diese QR-Quadrat-Codes, ob ich die komplett selbst geschrieben habe. Ich habe es probiert, woran ich am Ende gescheitert bin, war das Riesolomon Fehlerkollektur, aber der Rest ist komplett selbst geschrieben. Wenn sich jemand mit Riesolomon Fehlerkollektur auskommt, kommt doch mal zu mir. Die Frage war, was habe ich da mit Nutz für das Riesolomon? Ich habe tatsächlich irgendwo ein Riesolomon gefunden, habe das einfach reinkopiert, dass es im Moment der Grund, warum das noch nicht veröffentlicht ist, dass man das irgendwie nochmal mit Lizenz guckt, wie das da läuft. Aber wenn das sozusagen geklärt ist, ist der Weg frei, dass ich das auch irgendwie mal auf GitHub stelle. Noch Fragen. Wir haben noch ein bisschen Zeit. Gut, wenn es keine Fragen mehr gibt, dann Dankeschön. Auf mein Skin.