KDL (Kernel Debugging Land) oferuje nam wiele konsolowych narzędzi, które służą do analizowania przyczyn problemu z systemem. Jeżeli pojawi się KDL, to znaczy, że dzieje się coś niedobrego z Haiku i należy zgłosić to na bugliście. Istnieje to do tego kilka wbudowanych narzędzi i sposobów. Jednym z nich jest posiadanie dwóch komputerów z kablem i portami szeregowymi. Praktykują go z reguły deweloperzy, ponieważ potrzeba poprawnie skopiować plik syslog z /common/var/log/. Innym sposobem jest zrobienie zdjęcia ekranu z monitora z wyświetlanymi informacjami. Bardzo pomocne jest też wykonanie kolejnej fotografii, po użyciu polecenia bt (backtrace).

Oczywiście nie zawsze odpowiednie informacje zapiszą się w syslogu, mogą się też nadpisać po ponownym starcie Haiku, a zdjęcia potrafią być niewyraźne, zwłaszcza gdy ktoś ma monitor CRT. Często trudno jest zrobić fotkę bez ucięcia jakiejś informacji, czasem robi się przez to ich kilka, albo gdy je zbytnio skompresujemy, to wyglądają jak byśmy je robili za pomocą camera obscura.

Aby zaradzić tej sytuacji, Michael Lotz wprowadził generowanie kodów QR, bezpośrednio przez KDL. Pomysł swój oparł na bibliotece qrencode.

qrencode - KDL

Kody QR to alfanumeryczne, dwuwymiarowe, matrycowe i kwadratowe kody kreskowe. Posiadają one zakodowane na przemian informacje, za pomocą czarnych i białych bloków. Zawierają także wzorce wyrównania i korekcję błędów, dzięki czemu są łatwo odczytywane maszynowo. Nawet niskiej jakości kod QR, może być łatwo przechwycony i zdekodowany. Kolejną ważną informacją jest to, że coraz bardziej popularne smartfony, są je w stanie odczytać za pomocą aparatu w telefonie komórkowym. Poza tym programy potrafiące rozszyfrować kody QR, są dostępne na niemal każdej platformie. Oznacza to, że zamiast zrobić szereg fotografii, czy nawet czasochłonnie przepisać, można po prostu zeskanować kilka kodów QR.

Ma to oczywiście wadę w ilości zapisanych danych na daneh przestrzeni. Stała wielkość bloku która jest obecnie wspierana przez KDL, pozwala szybko wypełnić ekran, ale można uzyskać jedynie kilkaset bajtów. Domyślna konfiguracja wytwarza kod QR w wersji 19, z niskim poziomem odzyskiwania i umożliwia przechowanie 792 bajtów danych. Jeśli by wziąć więcej miejsca na ekranie, to można by skonfigurować większe kody QR, z maksymalnym, teoretycznym rozmiarem 177×177 bloków, co by nam dało 2953 bajtów informacji. Ze względu na ograniczenia pamięci w KDL, te wyższe rozdzielczości mogą nie działać poprawnie. Nie będąc w stanie przechować wielu informacji w jednym QR kodzie, oznacza to, że będzie trzeba generować kolejne QR kody dla zabezpieczenia wszystkich danych.

Obecne ograniczenia

Add-on debuggera jądra qrencode, jest ładowalnym modułem który używa publicznego API jądra, do instalowania poleceń debuggera. Podczas gdy KDL implementuje potok w niektórych poleceniach, to qrencode nie, bo nie jest to częścią publicznego API. Dodatkowo buforowanie danych i opróżnianie pamięci z danych, muszą być wywoływane ręcznie, co niweluje zalety potoku.

Generowanie kodów QR

Istnieją dwa ogólne sposoby generowania kodów QR:

  1. Użycie polecenia qrencode, które bezpośrednio wygeneruje QR kody dla jednego wiersza wejścia
  2. Można też buforować wiele wierszy z danymi wyjściowymi, używając polecenia qrappend, a następnie wygenerować kody QR z wykorzystaniem komendy qrflush

Polecenie qrencode jest zwykle mało pomocne, ponieważ zawsze będzie tylko generować kod QR, wyświetlać go i powracać. To oznacza, że jeśli nasz potok zawiera wiele linii tekstu z danymi wyjściowymi, to pokaże się kilka kodów QR, a my nie będziemy mieli czasu na ich zeskanowanie. Również każdy z tych poszczególnych kodów QR będzie zawierać tylko jedną linię i marnować resztę miejsca w macierzy.

Można jednak wykorzystać qrencode, dla pojedynczego wiersza wejścia, które dostarczymy jako argument. Może to być przydatne w dwóch sytuacjach. Aby dowiedzieć się jaki jest najbardziej odpowiedni rozmiar kodu QR i gdy chcemy szybko dostać się do ostatniego wiersza danych wyjściowych, np. wyniku polecenia. Możemy także uruchomić komendę qrencode wraz z ciągiem jako argumentem:

kdebug> qrencode test

Lub jako cel potoku:

kdebug> call 10 - 3 | qrencode

Aby uzyskać więcej funkcji, można użyć bufora QR, który to może być manipulowany za pomocą poleceń: qrappend, qrflush i qrclear. Pierwsza komenda załącza wiersz do bufora QR. Dlatego też idealnie się nadaje do odbierania końca potoku. Uruchommy jakąś komendę i wykonajmy potokowanie do qrappend:

kdebug> sc | qrappend

Wyniki na wyjściu polecenia (sc, w tym przypadku realizuje stos wywołań bieżącego wątku) zostaną dołączone do bufora QR. Bufor QR ma ograniczony rozmiar, co oznacza, że wypełnienie go przez qrappend może powodować osiągnięcie końca zakresu działania. Kiedy tak się stanie, to zostaną automatycznie wygenerowane kody QR, aby opróżnić bufor QR i zrobić wolne miejsce dla wprowadzenia nowych danych. Jeśli dane wyjściowe są na tyle krótkie, że nie dojdą do limitu bufora, to polecenie zakończy się bez wydrukowania rezultatu i oznacza to, że wiersze z powodzeniem zostały załączone do bufora QR. Następnie należy użyć komendy qrflush, która opróżni ze wszystkiego bufor QR i wygeneruje kod QR.

Zauważ, że z powodu ograniczeń wymienionych powyżej, polecenie qrappend początkowo nie wie kiedy potok jest zrobiony, dlatego nie można automatycznie opróżnić bufora QR. Nawet jeśli użycie qrappend spowodowało ukryte opróżnienie bufora, to ostatnia zawartość bufora nadal pozostaje. Trzeba użyć polecenia qrflush po każdym zastosowaniu komendy qrappend.

Jeśli chcemy usunąć bufor QR bez generowania kodów, lub upewnić się zawczasu, że jest on pusty przed uruchomieniem polecenia qrappend, powinniśmy użyć komendy qrclear. To polecenie nie przyjmuje żadnych argumentów, po prostu resetuje bufor QR, by był on pusty.

Generowanie adresów URL z danymi

Do tej pory wyprodukowane kody QR, zawierają tylko zwykły tekst. W zależności od sytuacji jest to w pełni wystarczające. A czytnik kodów QR którego używasz, może dostarczać wygodne funkcje, do dalszego przetwarzania informacji. Jednak kiedy trzeba zebrać wiele kodów QR, czyli gdy chcesz przenieść dużo danych wyjściowych poza KDL(np. cały syslog), to zebranie w całość wszystkich kodów, które są partiami tekstu, może być uciążliwe. Na szczęście add-on debuggera jądra qrencode przychodzi tutaj z pomocą. Mianowicie, możemy wykorzystać polecenie qrwebpost, które generuje kod QR z adresem URL zamiast czystego tekstu. Komenda qrwebpost stosuje “start” lub “stop” jako pierwszy argument. Argument “start” oznacza, że chcesz rozpocząć generowanie adresu URL i wymaga drugiego argumentu “id”, którego chcesz użyć. Id jest krótkim ciągiem znaków służącym do identyfikacji danych wyjściowych po stronie serwera, gdzie dane są później gromadzone. Nie ma żadnej logiki wbudowanej w serwer, co oznacza, że może nastąpić kolizja identyfikatorów i dane przesyłane od różnych ludzi nadpiszą się. Dlatego należy stosować unikatowe identyfikatory.

Aby rozpocząć generowanie adresów URL za pomocą polecenia qrwebpost, możesz postąpić w podobny sposób:

kdebug> qrwebpost start test

Spowoduje to natychmiastowe wygenerowanie początkowego kodu QR, z samym adresem URL. Jeśli zeskanujesz ten kod QR, to powinieneś otrzymać link zamiast czystego tekstu. Większość czytników pozwala otwierać linki bezpośrednio po skanowaniu, co czyni ten sposób pracy dość wygodnym. Jeśli otworzysz początkowy link, to poprzednie przechowywane treści mające to samo id, zostaną usunięte. Kiedy zaczynasz od nowa to ma to sens, bo upewnia Cię to, że nie są przechowywany na serwerze jakieś stare dane. Jeśli chcesz by były one przechowane, to po prostu nie skanuj nowego kodu QR, albo nie otwieraj linka.

Kiedy masz już wszystko ustawione, to możesz rozpocząć generowanie kodów QR tak jak poprzednio (używając qrencode lub qrappend i qrflush). Wszystkie generowane kody QR będą formatowane jako adres URL i zawierać blok danych w ciągu zapytania (query string – inaczej kwerenda, np. służy do uzyskania odpowiedzi z bazy danych). Otwarcie takiego adresu URL przeniesie Cię na stronę serwera, gdzie dane zawarte w ciągu zapytania są automatycznie dołączane do bufora o podanym identyfikatorze. Usługa będzie również wyświetlać link, byś mógł ponownie odebrać dane. Jeśli klikniesz w link to zobaczysz stronę z nagromadzonymi danymi dla tego id i skąd będziesz mógł je pobrać w formacie RAW, albo usunąć jeśli Ci nie są już potrzebne.

Jeśli chcemy z powrotem przełączyć wygenerowane kody QR na zwykły tekst, wydajemy polecenia qrwebpost z argumentem stop.

Minimalizowanie ilości danych wyjściowych

Przechwytywanie wielu kodów QR jest żmudną pracą, która wymaga zaplanowania, jak wielu danych potrzebujemy. W tym celu możemy użyć komend head, tail i grep do filtrowania danych wyjściowych swoich poleceń, np. do odpowiednich sekcji, punktów.

Konfigurowanie wersji kodów QR

Domyślną wersję generowanych kodów jest wariant 19, co przekłada się na macierz o rozmiarach 93×93 bloków. Ten rozmiar idealnie pasuje na ekranie o rozdzielczości 800×600, ale to może być nieoptymalne dla nas. Jeśli mamy więcej miejsca do wykorzystania na ekranie, to możemy zwiększyć rozmiar do wersji 40 (macierz 177×177 bloków). Należy jednak pamiętać, że z powodu ograniczeń pamięci, może być niemożliwe użycie wyższych wersji, bez dostosowania debuggera i jego ponownej kompilacji. Użyjemy polecenia qrencode z dołączonym ciągiem tekstowym test, by sprawdzić czy kody QR działają poprawnie po zmianie wersji. Możemy także obniżyć wersję, jeśli przechwycenie naszym urządzeniem dużego kodu QR, stanie się problematyczne.

Podsumowanie

Korzystanie z kodów QR pozwala wyodrębnić dane tekstowe z KDL, za pomocą smartfona lub podobnego urządzenia. Ograniczenia w gęstości zapisu może nie uczyniły tej metody zbyt wygodnej, ale może pozwoli ona pokonać konieczność eksperymentowania z fotografiami, czy o zgrozo ręczne przepisywanie.