Béton brut

ttyd

2019-12-24

W dzieciństwie jednym z moich ulubionych formatów kawałów był ten o magicznej istocie, która spełnia życzenia w sposób dosłowny, obracający pragnienie petenta w jego nieszczęście.

Żołnierz poszedł łowić do pobliskiej rzeki i zdziwił się, gdy dyndająca na końcu żyłki ryba przemówiła: „Oszczędź mnie, a spełnię Twoje życzenie”. Długo się nie zastanawiał i powiedział rybce: „Chcę być odznaczony ważnym orderem”. Puf! Gdy dym — jasny sygnał spełnionego zaklęcia — opadł, żołnierz zauważył, że stoi w okopie. Po lewej flance przedzierają się nieprzyjaciele, po prawej to samo. A frontem czołgi i karabiny maszynowe. Słyszy hasło „Naprzód!” i ściana kamratów popycha go do walki. Biegnąc myśli, „No kurwa, pośmiertny dała”.

Należy pamiętać żeby uważać czego się pragnie. Spełnienie może być gorsze niż pragnienie. Bo weźmy na przykład jedno z pragnień w sferze technologii: żeby napisać aplikację raz i odpalać ją na wielu różnych systemach. Przez dekady podejmowane były różne próby. A to systemy, które są kompatybilne na poziomie źródeł w stopniu wystarczającym by proces portowania był niezbyt bolesny (C/PM, POSIX), albo platformę sprzętową (MSX, czy potem x86), albo maszyny wirtualne i bytecode (Z-Machine czy JVM).

Jak się to wszystko powiodło? Trudno powiedzieć, to sytuacja jak z za krótką kołdrą. Jednym marzł nos, innym stopy, ale ogólnie zgadzano się, że kołdra jest dobrym pomysłem i któregoś dnia uda nam się uszyć taką o zadowalającej długości.

I wtedy ktoś poszedł wyłowić tę złotą rybkę siecią. I rybka dała nam uniwersalną platformę aplikacji: przeglądarkę internetową.

Ludzie często błędnie rozumieją ewolucję, myślą, że obecny stan wynika z jakiegoś planu, a nie tylko wypadkowych czynników, które promują jakąś właściwość nad inną. Tak samo w przypadku przeglądarki jako platformy aplikacji rzeczy nie rozwijały się pod okiem bogów, a były wypadkową dostępności, pewnej wolności, ceny i kilkuset sprytnych gości, którzy ciągnęli kołdrę w kierunku własnym, czyli słusznym. Tak jak w przypadku ewolucji organizmów prowadziło to czasem do dziwnych rezultatów: nasze oczy widzą świat do góry nogami i potem kradną cykle mózgu na obracanie obrazu, jest też JavaScript.

Nie da się ukryć, że jestem internetowym sceptykiem. To naturalna droga, którą przebywa każdy entuzjasta, gdy okazuje się, że „jego dziecko” pali za szkołą, przynosi same jedynki i nie chce zostać filozofem etyki medycznej. Głębokie rozczarowanie równe pokładanych nadziei.

Większość dnia, a już z pewnością jego produktywną część, spędzam ślepiąc w terminal tekstowy. Znajduję spokój w środowisku, które pokornie czeka mrugając na mnie zalotnie kursorem, aż powiem mu czego chcę. Proste aplikacje, które komunikują się tekstem. Kontrola, automatyzacja i surowa estetyka. I prawie ezoteryka, którą ciężko jest wytłumaczyć ot, tak.

A ten przydługi wstęp ma służyć wyłącznie temu żebym Wam mógł powiedzieć o moim odkryciu, które cieszy me serce i być może ucieszy Wasze. Jest to ttyd, serwer podający terminal przez przeglądarkę.

ttyd to serwer napisany w C, który serwuje jednostronicową aplikację opartą o xterm.js i WebSockety. Jest trywialna w użyciu i działa spektakularnie dobrze. Próbowałem praktycznie wszystkiego, czego używam na terminalu, nawet najbardziej fikuśnych aplikacji. Wystarczy wpisać na terminalu:

ttyd -p 3000 aplikacja

…i już na http://localhost:3000 mamy uruchomiony wirtualny terminal z którego możemy nią operować. Wspiera SSL, BASIC AUTH, autoryzację certyfikatami (bardzo przydatne w pewnych okolicznościach), tryb „tylko do odczytu”, pojedyncze i wielokrotne sesje.

Po co?! O dziwo znalazłem wiele zastosowań!

Po pierwsze używam tego do moich różnych eksperymentów z RaspberryPi. Nie wszyscy mają pod ręką klienta SSH i wystarczająco samozaparcia by zmieniać konfigurację, ale wystarczy, że powiem im „kliknijcie na ten adres i wpiszcie informacje”, podłączę skrypt w powłoce pod ttyd i voilà. I tak, mógłbym napisać webaplikację, ale zapewniam Was, że nawet używając mikroframeworku zejdzie mi dłużej dłubiąc HTML niż kilka razy wywołać input().

Po drugie, sytuacja podobna, często czytam logi używając tail -f, w połączeniu z trybem „tylko do odczytu” mogę go udostępnić ludziom, którzy mają może potrzebę zerknięcia, ale nie muszą mieć dostępu do systemu.

Po trzecie, to bardzo dobrze zbudowane narzędzie i strasznie mi się podoba. To będzie mój finalny i rozstrzygający argument.

A teraz czas na część wizualną dla tych, którzy przebrnęli przez te ściany tekstu. Uruchomię ttyd, które uruchomi browsh czyli terminalową przeglądarkę, która używa Firefoksa jako silnika, w Firefoksie. Pamiętajcie, „…bo mogę” to nie powiedzonko, to styl życia.