Gdy wyświetli nam się KDL( Kernel Debugging Land), to dzieje się coś niedobrego z Haiku. KDL oferuje nam wtedy wiele konsolowych narzędzi, które nam pomogą sprawdzić co było przyczyną problemu i dokładnie opisać błąd na bugliście.
Aby to było możliwe, musimy jakoś skopiować dane dostarczone nam przez KDL, czy raczej któreś z jego narzędzi. Jednym ze sposobów jest posiadanie dwóch komputerów z portami i kablem szeregowym. Oczywiście ten sposób jest najbardziej problematyczny dla zwykłego usera, dlatego na ogół praktykują to deweloperzy Haiku. Jeśli możemy poprawnie zabootować Haiku, to powinno wystarczyć skopiowanie pliku syslog z /common/var/log/. Jeśli jednak nie możemy, albo błąd jest losowy, rzadki, czy istnieje jakikolwiek inny powód, to na ogół wykonujemy wtedy zdjęcie ekranu monitora z wyświetlanymi informacjami. Bardzo pomocne jest też wykonanie kolejnej fotografii, po użyciu polecenia bt( backtrace). Z tego co zaobserwowałem, to chyba wszystkie zgłoszone błędy mają albo załączony syslog, bądź zdjęcia, lub mix obu sposobów. 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 pomóc w tej sytuacji, dodać kolejną możliwość, to Michael Lotz wprowadził generowanie kodów QR, bezpośrednio przez KDL. Pomysł swój oparł na bibliotece qrencode.
Kody QR to “alfanumeryczne, dwuwymiarowe, matrycowe i kwadratowe kody kreskowe”. Jak widać powyżej, informacje są zakodowane na przemian czarnymi i białymi blokami. 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( no i dzięki smartfonom upowszechniły się). 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!
Choć jest to wygodne, ma to pewną wadę. Mianowicie gęstość zapisanych danych jest niska. 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ć pewnie. 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
Najpierw trzeba nam przedstawić pewne ograniczenia, które powodują, że przebieg pracy nie jest intuicyjny. Mianowicie 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 niestety nie jest to częścią publicznego API. Funkcjonalność potoku polega na tym, że dane wyjściowe jednego polecenia, stają się automatycznie danymi wejściowymi drugiego polecenia, zostają przekierowane. Przez co dane wyjściowe wysyłane do qrencode są przetwarzane jako jeden wiersz tekstu naraz. Buforowanie danych i opróżnianie pamięci z danych, muszą być wywoływane ręcznie!
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.
Można korzystać z któregoś z obu sposobów, zależnie od tego co chcemy osiągnąć. 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 Twój potok zawiera wiele linii tekstu z danymi wyjściowymi, to pokaże się kilka kodów QR, a Ty nie będziesz miał 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żesz jednak korzystać z qrencode do generowania kodów QR dla pojedynczego wiersza wejścia, które dostarczysz jako argument. Może to być przydatne w dwóch sytuacjach. Aby dowiedzieć się jaki jest najbardziej odpowiedni rozmiar kodu QR i gdy chcesz szybko dostać się do ostatniego wiersza danych wyjściowych, np. wyniku polecenia. Możesz 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 funkcjonalności, można użyć bufora QR, który to może być manipulowany za pomocą poleceń qrappend, qrflush i qrclear. Jak sama nazwa wskazuje, komenda qrappend 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 chcesz usunąć bufor QR bez generowania kodów, lub upewnić się zawczasu, że jest on pusty przed uruchomieniem polecenia qrappend, powinieneś 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 chcesz z powrotem przełączyć wygenerowane kody QR na zwykły tekst, to po prostu użyj polecenia qrwebpost z argumentem stop.
Minimalizowanie ilości danych wyjściowych
Mimo tego, że można teraz wygodniej pobrać dane wyjściowe, to jeśli musisz przechwycić wiele kodów QR, to będzie to nużące. Dlatego należy zaplanować ile tak na prawdę potrzebujemy danych. Możesz 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 Ciebie. Jeśli masz więcej miejsca do wykorzystania na ekranie, to możesz 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żyj polecenia qrencode z dołączonym ciągiem tekstowym test, by sprawdzić czy kody QR działają poprawnie po zmianie wersji. Możesz także obniżyć wersję, jeśli przechwycenie Twoim 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.