Jak zapewne starsze z Was pamiętają z serialu, wcale nie było o wojnie, tylko o konflikcie pokoleń. Sąsiadka z góry, Irena (Janowska), pośredniczy często w kłótniach między sąsiadką z domu (Kwiatkowska) a jej nastoletnim synem, Pawłem (Musiał-Janczar). W drugim tomie do mieszkania narratorki wprowadza się tymczasowo Anula (Góralczyk), siostrzenica, której matka jest permanentnie w szpitalu, więc ciocina zyskuje własny egzemplarz nastolatki do nieledwie entomologicznej obserwacji. Kręcą się jeszcze panowie - ojciec Pawła (Rudzki), wiecznie w delegacjach (“bada, dlaczego ludzie tak
mało produkują, a tak dużo konsumują”), a podczas krótkich pobytów w domu wychowujący syna krzykiem i zakazami oraz mąż Ireny (Szczepkowski), głównie przebywający w biurze. Kłótnie to może duże słowo, raczej nieporozumienia, bo przedwojenni rodzice - mimo że naprawdę próbujący zrozumieć - nie nadążają za zmieniającymi się modami na muzykę (jazz, trzeci nurt, blues, Szczepanik i Presley), modę (spodnie tak wąskie, że nie da się zgiąć nóg w kolanach, a potem nagle szerokie; berety zarzucone na korzyść czap z końskiego włosia), aktywności fizyczne (przepisywany skrzętnie podręcznik do jogi!) czy wyznaczniki bycia chuliganami.
Towary deficytowe: żyletki, zielone koszulki gimnastyczne, groszek w puszce (bywa rumuński), pomarańcze (przed świętami), banany (ale nikt nie kupuje, bo na pewno będą na wierzchu zielone, a w środku zgnite), szynka (wydzielana na specjalne okazje), ptasie mleczko (kitrane w bieliźniarce), radio odbierające stację Luksemburg.
Znak czasów: Adenauer coś knuje, doktor Kildare z telewizji, erwupegie, herbatniki 22 lipca, ormowcy, Kirszenstein, Sartre nie przyjmuje nagrody Nobla.
Się je: knedle z mrożonych śliwek, omlet z cebulką, wczorajszą zupę, zimny schab z surówką na Wielkanoc, rybę faszerowaną i w galarecie, sałatkę śledziową, zimny schab, zimną cielęcinę i pół kilo tatara (wszystko ze sklepu) na Boże Narodzenie, rosół.
Się przywozi z terenu: zająca, czeski naszyjnik ze sztucznych brylantów i rubinów oraz takież
kolczyki.
Się pali: „Silesie” (okropne), „Carmeny”, fajkę (a w zasadzie nie pali, tylko trzyma w zębach, bo trzeba coś palić, ale i dbać o płuca), w klasie i tramwaju.
Się stoi: w kolejkach za wszystkim (i można całą “Trylogię” przeczytać).
Gender codzienny: kobiety tracą pieniądze niewiadomo na co, bo są kapuścianymi głowami do matematyki.
Się pożycza: cukier, wanilię, pieniądze do pierwszego.
Się odejmuje: lata podczas wypisywania życiorysu, bo była wojna i nikt nie sprawdzi.
Się pije: również w pracy, mąż narratorki wraca lekko nieużyteczny z biura i odsypia imieniny Karola czy Jadwigi.
Się (krypto)reklamuje:
Anula bez słowa zakasała rękawy, włożyła fartuch i nalała do zlewu płynu do zmywania „Ludwik”. Otworzyła kran i zapieniło się wspaniale. Od czasu, jak znalazłam w sklepie „Ludwika”, Anula zmywa na ochotnika.
Się jest w związku:
Mąż, który mimo że jesteśmy piętnaście .lat po ślubie, wciąż zachowuje się przyzwoicie, wstał nawet dość szybko z fotela i poszedł otworzyć.
Poszłam się umyć i kiedy wychodziłam z łazienki, zauważyłam, jak mąż cichutko odwija paczuszkę z szynką i wyjmuje plasterek. Udałam, że nie widzę. Ostatecznie całą pensję do domu
przynosi, nie pije, nie pali i ma lekki chód, tak że prawie nie zdziera obcasów.
Najnowszy film znanego holenderskiego reżysera i scenarzysty, Paula Verhoevena, prezentuje nam życie św. Bernadetty. Nie chciałem tutaj jednak omawiać, czy oceniać filmu. Mnie interesuje jego parodystyczny wydźwięk.
Być może jest to przykład mojego dyletanctwa, ale za szczególne dzieło w dorobku wspomnianego twórcy, uważam „Żołnierzy Kosmosu”. Ów to adaptacja powieści o tym samym tytule. Na tyle udana, że do dziś fani oryginału korzystają z estetyki zaprezentowanej w filmie. I to mimo tego, że jeśli oglądać go dokładnie, to pomiędzy strzelaniem do wielkich robali i czymś na rodzaj licealnego romansidła, można dostrzec kpinę z materiału źródłowego. Mało tego, z całego przesłania powieści! Kpiny, której nie wszyscy owi fani dostrzegli. Dlatego bardzo cenię sobie to, że „Żołnierzy …” miałem okazję obejrzeć.
No dobrze, ale co ma SF do filmu o żyjącej w czasie epidemii Czarnej Śmierci zakonnicy? Otóż w mojej opinii autor (Verhoeven jest autorem scenariusza i reżyserem), próbował tego samego efektu: zrobić coś, co na pierwszy rzut oka jest laurką – w tym wypadku wiary – ale pod powierzchnią, jawnie szydzi sobie ze wszystkich, których jego pastelowe kolory zwiodły.
„Bernadette” zaczyna się jak typowy chrześcijański film hagiograficznych: nastolatka jedzie z rodzicami do klasztoru. I już w tej krótkiej scenie wykazuje swoją wielką wiarę i mocy czynienia cudu. Małego, ale dziewczyna jest dopiero młoda. Mnie to wystarczyło abym zaczął kwestionować sens oglądania dalej. Dobrze znam tę manierę, niestety miałem szczęście doświadczyć polskiej edukacji świeckiej. Ale to jedynie reżyser bawi się oczekiwaniami widzą, bo już w kolejnej scenie widzimy, jak opatka klasztoru, niezwykle przyziemnie, ostro targuje się o cenę przyjęcia nowej dziewczyny.
Mamy więc z jednej strony mamy wiarę i cuda, z drugiej własny interes przykrywany zbożnymi deklaracjami. Jeśli intencją scenarzystą było chwianie się na pomiędzy tymi dwoma obrazami, to w mojej skromnej opinii mu się nie udało. Mianowicie bardzo szybko dostrzegamy, że tytułowa bohaterka ma silną motywację, aby mieć wizje. Dzięki nim staje się centrum uwagi, na czym jej pewnie zależało, a potem awansuje w zakonnej hierarchii, gdyż może i biskupi sami jej nie wierzą, ale widzą, że inni jej wierzą. Wierzą więc i oni, bo mają w tym interes.
Więc w środku średniowieczu, w wnętrzu klasztoru prawdziwa wiara ma małe znacznie. Cuda, motywowane są bardzo ludzkimi przywarami, są jedynie teatrem, któremu szczęśliwie dopomagają zbiegi okoliczności od czasu do czasu. Ale mimo to, niczym przebiśniegi, pojawia się tu i ówdzie, tych kilku świadectw autentycznego zaangażowania w swoją religię. I może to stanowi sedno tego filmu?
W małym miasteczku 10 lat wcześniej ktoś popełnił samobójstwo, skacząc z mostu, co zapoczątkowało wielowątkowo całą serię wydarzeń, która ostatecznie doprowadziła do nieudanego śledztwa w sprawie napadu na bank i tzw. hostage situation (owszem, było to przestępstwo o niskiej szkodliwości, bo bank był bezgotówkowy, a żadnej z osób zamkniętych w mieszkaniu z porywaczem nic się nie stało). Jeden wątek to śledztwo, prowadzone przez Jacka i Jima, ojca i syna; robota nie jest specjalnie wdzięczna, bo przesłuchiwani zakładnicy nie są pomocni, bywają niegrzeczni albo zachowują się jak idioci, a najgorsze, że przestępca jakoś ulotnił się z obstawionego mieszkania bez drugiego wyjścia. W drugim wątku narracja przeskakuje do wydarzeń, które zmusiły osobę napadającą do takiego zachowania oraz do samego porwania zakładników podczas oglądania mieszkania na sprzedaż, co jest dość nietypowe, bo nikt się nie boi, nawet pod lufą pistoletu. Kolejny wątek to terapia Zary, dyrektorki banku, która hobbystycznie chodzi oglądać cudze mieszkania, do czego nie chce się przyznać terapeutce (oraz czemu od 10 lat nosi w torebce list).
Na poziomie intelektualnym oczywiście schemat goni schemat, zaskoczka co do osoby napadacza/porywacza jest dość łatwa do rozszyfrowania, podobnie związki między na pozór przypadkowymi uczestnikami dramatu, ale i tak całość składa się w świetną całość. Z innych książek wiedziałam już, że autor umie w “bohaterowie nie są tym, kim się wydają”, ale i tak zostałam zaskoczona maestrią, jaką wygrał zupełnie niespotykaną sytuację, bez patosu pokazując drugie dno różnych na pozór oczywistych ludzkich zachowań. Do tego jeszcze dochodzi język - mnóstwo ironii i łagodnego sarkazmu, niektóre zdania są jakby żywcem wyjęte z Pratchetta. Świetne, chcę natychmiast wszystkie książki tego autora i niech pisze następne.
Na dzisiaj zaplanowałem wrzucenie opisu pierwszej z moich ulubionych nadnoteckich tras. Notka jest gotowa jedynie w ~75%, bo moją uwagę zaprzątnęło coś innego. Coś malutkiego, piszczącego i kosmatego.
W piątek ktoś podrzucił nam na podwórze kociaka. Maleńki kłębuszek nieszczęścia z zaropiałymi oczkami. Schował się pod daszkiem, gdzie na paletach trzymamy drewno do paleniska. Nie było jak go wyciągnąć, ani nie było wiadomo, gdzie dokładnie siedzi. Gdy tylko pochodziłem, to przestawał piszczeć i nie mogłem go namierzyć. Wsunąłem mu tam tackę z rozciapaną z wodą karmą i chodziłem co jakiś czas sprawdzać, czy wyszedł i mogę go jakoś złapać.
Przesiedział tam dzień i noc. Jedzenie zniknęło z tacki, więc nałożyłem nową porcję i znowu przychodziłem co jakiś czas, aż w końcu okazało się, że przeszedł pod mniejszą paletę stojącą osobno. Szybko go stamtąd wypłoszyłem i złapałem, gdy próbował wrócić do poprzedniej kryjówki.
Prychał na mnie, syczał i próbował mnie zamordować :)
Trafił do dużego plastikowego kubła wysłanego gazetami. Dostał kolejną porcję karmy i wodę. Zamknąłem go w piwnicy, żeby nie przyniósł czegoś naszej domowej kotce. Gdy tylko zostawał sam, to wrzeszczał dalej, ale już z przerwami na jedzenie i spanie. A spał jak kamień.
Już w niedzielę rano po wypuszczeniu z „niewoli” na czas sprzątania, mogłem go złapać w rękę bez rękawiczki. Nawet gdy przemywałem mu oczy ciepłą wodą.
Po południu, po dwóch wysadzeniach do kuwety, gdy zauważyłem, że się szykuje do załatwiania, trzeci raz wskoczył sam. Wtedy uznałem, że można go już puścić luzem w tym pomieszczeniu.
Zabezpieczyłem wszystkie miejsca, do których nie powinien wejść, jego pudło położyłem na boku i zrobiłem mu legowisko z kawałków starego prześcieradła. Obok postawiłem „paśnik”, a do zabawy dostał kulkę z papieru i parę mniejszych orzechów włoskich.
Bardzo szybko odnalazł się w nowym położeniu. Śpi na legowisku, popiskuje gdy przyjdę, żeby wysępić kolejną porcję jedzenia, wędruje grzecznie do kuwety i bawi się gdy zostaje sam, bo zabawki są za każdym razem w innym miejscu.
W poniedziałek byliśmy u wety. Dostał środek na odrobaczanie i kolejny na pchełki. Poza tym trzy razy dziennie zakraplam mu oczka antybiotykiem i raz dziennie do żarcia dostaje coś na wzmocnienie. Lekarka powiedziała, że wygląda bardzo dobrze, jak na okoliczności, w jakich do nas trafił.
Najprawdopodobniej nie będziemy szukali mu domu i u nas zostanie. Na razie zastanawiamy się z synem nad imieniem. On proponuje Oscara, po „niezatapialnym” kocie z Bismarcka. Ja mówię Mordek, ale odpowiada mi też Demon, nie tylko jako kontynuacja po poprzedniku, który miał na imię Szatan. Nowy jest łaciaty jak dalmatyńczyk, a jak dalmatyńczyki, to i Cruella De Mon xD
Lata 90. Gabriel mieszka w Burundi, bo jego rodzice - ojciec Francuz i matka, Rwandyjka z plemienia Tutsi - przenieśli się z rodzinnego kraju matki z powodu toczącej się przewlekle wojny. Gaby jest szczęśliwy, bo Burundi ma wiele zalet - zielono, spokojnie, rodzice są zamożni i żyją w dobrej dzielnicy, a dodatkowo ma swoich kumpli z ulicy, z którymi kradnie mango i bawi się w opuszczonym samochodzie. Nie interesuje go tęsknota matki za rodzinnym krajem, nie czuje też zagrożenia. Sielskość dzieciństwa przerywają najpierw coraz wyraźniejsze sygnały z Rwandy o narastającym konflikcie między Hutu a Tutsi, potem podobne niepokoje zaczynają się dziać również w Burundi. Rodzice są przekonani, że ich znajomości i europejskie pochodzenie ojca sprawi, że zarówno w Burundi, jak i w Rwandzie będą w stanie - jakby co - opuścić zagrożone miejsca i schronić się poza konfliktem. Nie jest niespodzianką, że przerażająca bratobójcza wojna (mimo wspólnego języka i wspólnego boga) rozpala pożar tak gwałtowny, że rodzina Gabriela rozpada się, a on i jego siostra - osieroceni - lądują w rodzinie zastępczej we Francji. Książka to próba opowiedzenia o brutalnym przejściu z dzieciństwa do przedwczesnej dorosłości, opowiedzeniu nieopowiadalnego, traumie i próbie zdefiniowania tego punktu w czasie, kiedy wszyscy poczuli zagrożenie.
Zauważyłem skandaliczne zaniedbanie: nie mam żadnego wpisu o Linuksie i drukarkach na blogu. Jest jeden jedyny ślad w postaci opisu zużycia prądu przez HP DeskJet 854c na eksperymentalnym blogu wattmeter. A przecież drukarki to taki wdzięczny temat. Można pisać tomy o praktykach rynkowych producentów, czyli dymaniu konsumentów, o wolności, o ekologii… Last but not least drukarka miała ważny wkład w powstanie wolnego oprogramowania. Przy okazji, jeśli ktoś nie czytał Free as in Freedom, to polecam, jest dostępne za darmo.
Tym razem jednak będzie nieco mniej wodolejstwa, a więcej techniki. Nowoczesny sprzęt nieco odmówił posłuszeństwa i musiałem wrócić do korzeni, czyli tytułowej drukarki. W dodatku instalując ją na nowym sprzęcie. Instalacja drukarki na Linuksie jest prosta, ale system działa latami bez reinstalacji, więc stwierdziłem, że po prostu nie pamiętam jak to zrobić. Świetny pretekst do zrobienia wpisu.
HP DeskJet 920c to stara drukarka atramentowa. Ma te same kartridże co 854c, ze zintegrowanymi głowicami, co przeważyło o jej przyjęciu. Trafiła do mnie bowiem jako sprzęt przestarzały moralnie. Ot, kiedyś ktoś w firmie kupił nowy, lepszy sprzęt i oddawał stary. Tymczasem ja drukuję niewiele, a wieki temu nauczyłem się szybko i skutecznie napełniać kolor czarny w tych kartridżach i od tej pory jestem wierny HP. Tym bardziej, że tolerancja na różne tusze uzupełniające też jest spora. Co prawda staram się trzymać w miarę możliwości przeznaczonych do tego modelu lub linii, ale różnie z tym bywało. A drukuje zawsze dobrze, cokolwiek wleję.
Kolor niby napełnia się analogicznie, ale wychodziło mi to gorzej i drukowało zawsze nieidealnie – jakieś przerwy, paski itp. Może mniej używane i głowica zaschła? W każdym razie dwa czy trzy razy podchodziłem do tematu i mimo różnych tricków, które działały dla tuszu czarnego, nigdy nie było dobrze. Ponieważ niespecjalnie potrzebowałem koloru, zniechęciłem się i zaprzestałem dalszych prób.
Podłączenie i instalacja
Instalacja przeprowadzona została na Debianie Bullseye, ale z tego co pamiętam wcześniej wyglądała analogicznie.
Po podłączeniu drukarki lsusb pokazuje:
Bus 003 Device 006: ID 03f0:1504 HP, Inc DeskJet 920c
natomiast dmesg:
[ 165.918646] usb 3-1.4: new full-speed USB device number 6 using ehci-pci [ 166.079696] usb 3-1.4: New USB device found, idVendor=03f0, idProduct=1504, bcdDevice= 1.00 [ 166.079706] usb 3-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 166.079712] usb 3-1.4: Product: DeskJet 920C [ 166.079715] usb 3-1.4: Manufacturer: Hewlett-Packard [ 166.079719] usb 3-1.4: SerialNumber: CN1596C025BI [ 166.111410] usblp 3-1.4:1.0: usblp1: USB Bidirectional printer dev 6 if 0 alt 0 proto 2 vid 0x03F0 pid 0x1504
Najpierw instalujemy pakiety, a w zasadzie pakiet. CUPS zostanie doinstalowany w ramach spełniania zależności.
apt install hplip
Następnie dodajemy wybranego użytkownika USER do grupy z uprawnieniami administracyjnymi do drukarki.
adduser USER lpadmin
Resztę można wyklikać. I tak jest najłatwiej. Aby dostać się do interfejsu zarządzania CUPS, w przeglądarce wchodzimy na http://localhost:631 Przechodzimy do administration, wybieramy add printer. Uwierzytelniamy się jako użytkownik, któremu wcześniej przyznaliśmy dostęp. I działamy, czyli w zasadzie klikamy continue. Seria zrzutów ekranu poniżej.
Wybieramy lokalną drukarkę:
Ustawiamy jej nazwę:
Jeśli chcemy, możemy także w tym miejscu ustawić udostępnianie drukarki. Następnie wybieramy sterownik drukarki:
Nie wiem, czemu pokazał tyle sterowników. Wybrałem pierwszy z brzegu. Na koniec ustawiamy domyślne ustawienia drukowania:
I to tyle, jeśli chodzi o instalację HP DeskJet 920c na Linuksie. Od tej pory możemy korzystać z drukarki.
Bar mleczny w godzinach późno popołudniowych. Nieliczna klientela spożywa zupy pomidorowe i pierogi z serem. Słońce rozświetla puste stoliki. A pod jedną ze ścian, przy jednym z nich starsza kobieta peroruje na całą salę rozmawiając przez telefon.
— Ja ci tylko mówię, że Jacek obiecał, że przyjdzie do babci!
— Tylko ci przypominam, miał przyjść i do dziś go nie było.
— Abyś pamiętał jak będziesz rozmawiał, że obiecał i babci pleców nie pomasował.
…
Rozmowa trwała w nieskończoność, i z każdą łyżką pomidorowej wszyscy dokładnie już pamiętali o tym, że Jacek nie pomasował babci pleców, a obiecał, jak puentowała każdy swój wywód kobieta.
Oczami wyobraźni widziałem drugą stronę słuchawki i jakiegoś mężczyznę, który pewnie bronił jak lew swojej strony rodziny.
Ale jak można tłumaczyć Jacka, skoro nie pomasował babci pleców, a obiecał?!
Gdy zaczynałem blogowanie na JoggerPL, do pisania notek używałem głównie klientów Jabbera, rzadziej interfejsu samego serwisu. Po przejściu na WordPress testowałem wiele różnych edytorów blogowych, zarówno samodzielnych, jak i w formie dodatków do przeglądarki, by ostatecznie zostać przy UI WordPressa.
W czasie szykowania się do powrotu do pisania doszedłem do wniosku, że potrzebuję czegoś lokalnego. Aplikacji, którą mogę szybko odpalić, dopisać zdanie czy dwa — tyle, na ile akurat uda mi się zebrać i zamknąć do następnego razu.
Nie chciałem włączać przeglądarki, logować się do panelu WP i odpalać edytora za każdym razem, gdy akurat będę miał ochotę coś dopisać.
Zacząłem rozglądać się za jakimś programem do pisania. Przez chwilę myślałem o najprostszym rozwiązaniu, czyli o notowaniu w gedicie (gedit to w GNOME taki nieco bardziej rozbudowany odpowiednik windowsowego Notatnika). Ale zamarzyło mi się coś innego.
Chciałem aplikacji, która:
obsługuje składnię Markdown
pozwala na uporządkowanie wpisów wg kategorii i szybkie przełączanie pomiędzy notkami
automatycznie zapisuje tekst
ma sprawdzanie pisowni
ma minimalistyczny interfejs (i tryb bez rozpraszania, podobny do tego z WP)
wygląda jak część mojego biurka GNOME
jest open source
Znalazłem kilka programów spełniających większość oczekiwań i ostatecznie przetestowałem cztery: Joplin, MarkText, Paper i ThiefMD.
Joplin
Joplin to program odróżniający się od reszty możliwościami synchronizacji notatek przy użyciu ich własnego rozwiązania Joplin Cloud, a także Dropboksa i OneDrive. Nie mam w planach pisania na innych urządzeniach niż mój desktop, więc nie jest to dla mnie istotną cechą.
Dużo ciekawszym rozwiązaniem jest ich WebClipper, rozszerzenie do przeglądarki (Firefox i Chrome), pozwalający na zapisywanie jako notek stron www lub ich fragmentów, także w postaci zrzutów ekranu. Szkoda tylko, że nie można od razu wskazać, do której notki Clipper ma podpinać to, co zapisuje.
Minusem Joplina jest dla mnie przeładowany interfejs — jest tego wszystkiego po prostu za dużo. Menu, ikony, przełączniki… A mimo tego nie widzę możliwości zwiększenia interlinii.
Kolejną wadą jest to, że w przeciwieństwie do pozostałych testowanych programów nie wczytuje automatycznie katalogu z notatkami, trzeba go ręcznie zaimportować.
Joplin jest dostępny dla Linuksa, Windows, macOS, Androida i iOS.
Pozwala na eksport notatek do formatu Markdown, HTML oraz PDF.
MarkText
Przeciwieństwem przeładowanego interfejsu Joplina jest ten z MarkText. Brak pasków z ikonami i menu ułatwia mi skupienie się nad tym co piszę, a po włączeniu trybu maszyny do pisania (tekst przesuwa się do góry i piszmy zawsze na tej samej wysokości ekranu) oraz trybu skupienia (cały tekst poza aktualnym paragrafem jest wyszarzony i słabo widoczny) jest już naprawdę dobrze. Niestety, te tryby zostają wyłączone przy zamknięciu aplikacji i za każdym razem trzeba je włączać ponownie.
Bardzo fajną funkcją jest możliwość przełączenia panelu bocznego z listy plików na spis treści dokumentu, generowany na podstawie tagów Markdown oznaczających nagłówki. A początkującym z tą składnią pomoże popup z menu znaczników pojawiający się po zaznaczeniu fragmentu tekstu.
Minusem na pewno jest nieotwieranie przy starcie ostatnio pisanej notatki. Doklikiwanie się do niej na razie jest trochę niewygodne, ale przy większej ilości tekstów w katalogu pewnie będzie upierdliwe. Musiałbym zacząć archiwizować już opublikowane i zostawiać tylko te, nad którymi jeszcze pracuję.
Nie byłbym bym sobą, gdybym nie uznał za wadę odstawania wyglądem od reszty aplikacji. Można co prawda włączyć natywną dekorację okna, ale wtedy zamiast hamburgerowego menu w kącie okna pojawia się pełne menu z tekstowymi etykietami.
MarkText jest dostępny dla Linuksa, Windows i macOS.
Pozwala na eksport notatek do formatu Markdown, HTML i PDF.
Paper
Paper w pierwszej chwili był bardzo blisko zostania moim edytorem. Przede wszystkim używa biblioteki libadwaita, dzięki czemu idealnie dopasowuje się do GNOME, łącznie z responsywnym UI skalującym się do jednej kolumny przy zmniejszeniu rozmiaru okna. Możliwość ustawienia, jak będą wyświetlać się zeszyty z wpisami na bocznym panelu też jest bonusem, jak i wyraźnie szybszy start niż u poprzedników.
Niestety, gdy tylko zacząłem w nim pracować, pokazały się niedostatki. Przede wszystkim brak możliwości ustawienia rozmiaru czcionki i interlinii. Nie ma automatycznego zapisu. Nie zapamiętuje, która notatka była otwarta ostatnio. Brak eksportu do innych formatów. Irytującym mankamentem jest brak trybu skupienia i maszyny do pisania.
Szkoda, Paper ma zadatki na bardzo fajną aplikację, ale chyba nie ma za dużo szans na rozwój, bo w opisie na Gitlabie jest informacja not actively developed.
Paper jest dostępny dla Linuksa.
Zapisuje pliki wyłącznie w formacie Markdown.
ThiefMD
Ostatecznie wybrałem właśnie program ThiefMD i to w nim piszę tę notkę. Ma trochę denerwujących niedoróbek, ale także jedną funkcję, którą zyskał przewagę nad resztą kandydatów.
Jak widać na powyższym zrzucie ThiefMD wygląda jak reszta aplikacji dla GNOME, jego interfejs jest minimalistyczny, a można jeszcze ukryć pasek narzędzi i przełączyć aplikację w tryb pełnoekranowy.
Są tryby maszyny do pisania oraz skupienia (do wyboru paragraf, zdanie i słowo!). Ten drugi niestety wyłącza się po zamknięciu programu. Wysłałem bug report w tej sprawie, ale nie liczę na naprawienie. Rozwój programu jest raczej powolny, delikatnie mówiąc i od kilku miesięcy nic się nie działo w repo na GitHubie.
Dobrze by było, gdyby chociaż moje tłumaczenie Złodzieja na polski zostało kiedyś włączone do repo. Na razie sam skompilowałem sobie przetłumaczoną wersję z drobną poprawką przywracającą brakującą ikonkę.
Inną upierdliwością jest poprzedzanie masą wolnego tekstu w podglądzie, jeżeli aktywny jest tryb maszyny do pisania, zupełnie jakbyśmy zaczynali pisać w połowie kartki. Też poszło zgłoszenie.
Zgłosiłem również feature request, by załączone do tekstu ilustracje wyświetlały się w trybie eksperymentalnym edycji. Domyślnie ThiefMD pokazuje całą składnię MarkDown i tylko w tym dodatkowym trybie pokazuje odnośniki w sposób uproszczony i bardziej czytelny.
Notatki są automatycznie zapisywane, a przy starcie aplikacja otwiera ostatnio edytowany plik. Zamiast zaczynać pisanie tekstu od nowa, można po prostu zaimportować istniejący z pliku Odt, DocX czy HTML.
Sympatycznym bajerem jest podawanie rozmiaru tekstu nie tylko jako ilości słów, ale i także szacowanego trybu czytania. Jeżeli wierzyć tym szacunkom ten wpis zajmie szanownym czytelnikom około sześciu minut.
A teraz wspomniany wcześniej killer feature: ThiefMD ma możliwość podłączenia do platform blogowych, takich jak WriteFreely czy Medium i oczywiście WordPress.
To dla mnie spore ułatwienie, bo nie muszę notatki przeklejać do edytora WP, czy używać wtyczki importującej dokumenty Markdown, tylko paroma klikami przesyłam tekst na bloga. Do wyboru jako opublikowany wpis, albo szkic. Tu również wysłałem feature request na GitHubie: przydałaby się aktualizacja biblioteki eksportu tak, by używała blokowego edytora wpisów.
ThiefMD jest dostępny dla Linuksa.
Pozwala na eksport notatek do formatu Markdown, DocX, ePUB, HTML i PDF.
Mój wybór
Najwygodniej używa mi się ThiefMD, mimo wielu niedoróbek, na których naprawienie raczej nie ma szansy. Aż mi się zamarzyło nauczenie Vali, żeby zrobić forka projektu i popoprawiać to i owo. Ale na to szanse są jeszcze mniejsze xD
Gdybym nie upierał się przy gnomowym wyglądzie i gdyby nie przywiązanie się do programu w czasie tłumaczenia, to pewnie przerzuciłbym się na MarkText. Wystarczyłoby dodać do Silva rerum wtyczkę importu Markdown, żeby obejść brak bezpośredniego eksportu. Chociaż nie znalazłem jeszcze takiej, która importowałaby również załączone do tekstu ilustracje.
Może w przyszłości MarkText dostanie możliwość wrzucania wpisów na WordPressa? A może Paper się obudzi i nadrobi braki? Zobaczymy, na razie zostaję przy blogowaniu ze Złodziejem :)
W zeszłym tygodniu w ramach różnych takich odczytów krakowskich miałem okazję wziąć udział w mikropanelu, na którym pewien profesor wykazywał między innymi, że doszukiwanie się zbyt daleko idących analogii jest przejawem osobowości szczególnie podatnej na teorie spiskowe [na dzielny brak podawania definicji owej teorii spiskowej spuszczam chwilowo zasłonę milczenia].
A teraz oglądam właśnie Kanał Sportowy z drem Draganem, na którym twierdzi on, że siłą i jednym z wyróżników AI jest wynajdywanie analogii pomiędzy mało analogicznymi rzeczami i zjawiskami.
Więc niech się może nauka określi wreszcie jednoznacznie, czy ze swoją kompetencją wyszukiwania nieoczywistych związków kwalifikuję się do psychiatryka, czy raczej do przejęcia władzy nad światem.
Zeszły rok był dla mnie zdecydowanie rokiem zawodowego startu z nowym. Oprócz podstawowej zmiany, czyli języka backendowego, z dotychczasowego PHP na C#, zacząłem też przygodę z Angularem. Nie miałem z nim wcześniej do czynienia i w Idea Banku pewnie długo jeszcze bym nie miał, bo nasz główny projekt był aplikacją monolityczną, a ze względu na swój rozmiar nie byłoby nawet rozmowy o jego przepisaniu.
Stack w postaci backendu na mikroserwisach + frontend nie był mi obcy, w tematyce REST-owych API czułem się dość dobrze, jednak nigdy nie dotykałem frontu na nowoczesnych frameworkach, jak właśnie Angular czy React. Bardzo długo miałem też do tego typu podejścia negatywny stosunek, uważając to za ślepą uliczkę w rozwoju technologii. Nie wiem, czy argumenty, którymi sobie to tłumaczyłem, były sensowne, czy była to po prostu racjonalizacja sobie braku znajomości tematu w czasach, gdy od dłuższego czasu świat zaczynał w ten sposób pracować.
Uprzedzenie mogło wpływać na moje podejście do Angulara na początku pracy, a już na pewno negatywny wpływ miał mój sposób myślenia i przyzwyczajenia wynikające z pracy w dotychczasowym stacku technologicznym. I to właśnie początki procesu poznawania Angulara chcę opisać w tym wpisie, póki mam je relatywnie na świeżo w głowie. Jest to przy okazji opis tego, jak nie powinno się do tego podchodzić.
Rozpoczynając przygodę z nowymi rozwiązaniami dotychczas najlepiej wychodziło mi klasyczne podejście: na początku poznanie suchej teorii przez lekturę dokumentacji, a dopiero potem z tą wiedzą rozpoczęcie programowania. Nie miałem na to czasu zarówno w przypadku opisywanej poprzednio nauki C#, jak i w przypadku Angulara. Po prostu zostałem przydzielony do nowego projektu i po tasku wdrożeniowym trzeba było przejść do prawdziwych zagadnień.
Początek był toporny. Taska wdrożeniowego zrobiłem w zasadzie kopiując istniejące rozwiązanie w całości i refaktoryzując drobne jej części, bez większego zrozumienia. Nie miałem pojęcia o frameworku, praktycznie żadnego o TypeScripcie, więc nie korzystałem samodzielnie z jego dobrodziejstw w stosunku do JS, nie znałem struktury projektu. Rok wcześniej miałem kilkudniowe szkolenie z Angulara, jednak tutaj czułem się, jakby było to coś zupełnie innego (bo w rzeczywistości było, o czym później). Zbieżne z tym szkoleniem były jedynie podstawowe składowe projektu angularowego.
Brak rozpoznania struktury projektu był moim podstawowym błędem. Oprócz Angulara korzystamy z NgRx do obsługi store’a i RxJS do programowania reaktywnego. Nie wiedziałem tego i traktowałem całość jako części Angulara, więc przeszukiwanie internetu pod kątem rozwiązywania problemów w Angularze – co naturalne – zwracało zupełnie niepasujące wyniki. Flow aplikacji z grubsza wyczułem po kilku wykonanych taskach, ale nadal była to znajomość po łebkach i bez solidnych podstaw, więc o ile coś nie było określone jawnie w kodzie, to było dla mnie magią i działo poza świadomością sposobu, w którym przebiegało. To powodowało, że z powtarzalnymi problemami jako tako sobie radziłem, jednak każde odstępstwo od tej “magii” było dla mnie dużym problemem. Więc na początek – rozpoznaj strukturę projektu, jeżeli chcesz to zrobić dobrze i nie popełnić moich błędów.
Zanim w pełni świadomie dowiedziałem się o NgRx i RxJS, frustrował mnie flow aplikacji, którego nie rozumiałem. Całe zawodowe życie byłem przyzwyczajony do podejścia (w uproszczeniu): “pobierz wiersz z modelu (opartego na bazie danych), ewentualnie przetwórz, przekaż do widoku, renderuj”. I z takim podejściem starałem się pracować w Angularze. Tyle, że nie zawsze się dało – tam, gdzie było to możliwe, próbowałem pobierać dane w resolverach, by móc się w komponencie dobrać do statycznego snapshota z interesującymi danymi, a strumieni nie rozumiałem, bo – znowu – nie znałem podstaw.
W międzyczasie, gdy już dowiedziałem się, że mamy w projekcie zaprzęgnięty NgRx i RxJS, dotarcie do odpowiednich materiałów było znacznie prostsze. Wtedy też zacząłem oglądać na YouTube tutoriale z nimi związane. Było to dość późno, po ładnych kilku miesiącach (może niecałej połowie roku?) pracy przy aplikacjach napisanych w Angularze. Ale właśnie wtedy coś mi w głowie zaskoczyło. Gdy rozeznałem się już w RxJS, siłą rzeczy musiałem poznać lepiej observbables i regularne operacje na nich. Zmieniłem sposób myślenia z zafiksowania na “pobieranie” wierszy, zamieniając to na operacje na observables, kolejne komunikaty z nich, ich przetwarzanie, subskrypcje, itd. A przynajmniej przestałem się ich bać. W podobnym czasie zaczęło mi się w głowie klarować podejście do store’a – poza znanymi z zastanego kodu akcjami i efektami też pierwsze operacje na state. A więc kolejna rada, jak oszczędzić sobie czasu – zmień sposób myślenia, poznaj strumienie i podstawy operacji na nich. Nie da się efektywnie (o ile w ogóle) pracować na Angularze z takim podejściem, jak moje inicjalne. Jest to zresztą jedna z największych zalet pracy z Angularem – gdy już to poznasz, większość dynamicznej aktualizacji treści masz z głowy, zrobi się “sama”.
Od ww. momentu pracowało mi się już sprawniej mimo, że nadal świadomie wielu rzeczy nie znałem (i nie znam do tej pory). Pracując jednak na już istniejącym projekcie można sobie na taki luksus pozwolić i część zagadnień na samym początku zignorować, aby wrócić do nich, gdy przyjdzie taka potrzeba lub w ramach własnego harmonogramu nauki. I w taki sposób doszedłem po pewnym czasie do bardziej świadomej pracy ze state’em: do selektorów, reducerów, itd. Z czasem poznawałem sposób realizacji w Angularze formularzy, kolejne komponenty material UI, komunikację między komponentami, itd. Stąd też kolejna rada – ułóż swoje priorytety w nauce. Nie wszystko trzeba (a nawet się da) opanować od razu.
Dalsze kroki to już stopniowe poznawanie kolejnych rzeczy, których nie ruszałem wcześniej lub nie miałem świadomości ich istnienia. Ważne jest też zdobywanie doświadczenia przy rozwiązywaniu problemów. Pamiętam swoje zrezygnowanie, gdy pominięcie jednego importu w module skutkowało całą litanią błędów z kaskady powiązanych komponentów. W takich sytuacjach bardzo przydatny jest mentor, który służy swoim doświadczeniem i może nakierować na źródło różnych problemów. W tej kwestii jestem na bardzo dobrej pozycji, bo mamy w zespole kolegę, którego pomoc w zakresie Angulara jest nieoceniona, co na pewno ma kluczowe znaczenie w nauce. Jeżeli pracujesz samodzielnie, warto poszukać mentoringu na zewnątrz. W przypadku konkretnych problemów polecam jak zawsze Stack Overflow – dobre odpowiedzi tam prezentują nie tylko suchy, techniczny kod, ale też nakreślają tło odpowiedzi, co jest też konfrontowane przez innych użytkowników w komentarzach.
Tak jak cała masa osób na całym świecie, w czasie pandemicznych lockdownów zabrałem się za pieczenie chleba. Zabrałem się z takim entuzjazmem, że zostało mi do dzisiaj. Nabrałem nawet trochę wprawy i podobno chleb mi wychodzi całkiem niezły. Podzielę się dzisiaj z wami przepisem, który dopracowałem przez ten czas.
Wstępna przymiarka
Przymierzałem się do tego już wcześniej, od czasu gdy moja Żona zaczęła piec swój chleb na zakwasie. Przepyszny, gęsty, pełny ziaren. Niestety, nie znalazłem w archiwum jego porządnych zdjęć.
Wyglądał jak brykiet, ale za to jak smakowałJej chleb i nasz dżem z mirabelek
Pozazdrościłem jej i też chciałem piec chleb, tylko bardziej podobny do sklepowego. Oczyma duszy widziałem już piękne bochny. Zrobiłem wtedy całkiem solidny research, znalazłem przepisy i instrukcję, jak wyhodować swój zakwas. Ale gdy zobaczyłem, ile z tym jest dłubania, to mi się odechciało. Ot, cały ja.
Pandemia
Przeskok do 2020 i początku pandemii. Nie chciałem, żeby mój ojciec dalej jeździł codziennie do sklepu po pieczywo i gazetę, więc przerzuciłem mu prenumeratę na cyfrową i zabrałem się za pieczenie.
Znalazłem przepisy Joshuy Weissmana na starter i prosty chleb. Było z tym trochę babrania, ale mój zakwas się rozkręcił, jak należy i po ~10 dniach nadawał do pieczenia. I żyje do dzisiaj, bo nadal używam tego, co wyrosło ponad trzy lata temu.
Moje pierwsze podejście do chleba na zakwasie było przepiękną porażką. Wyszło mi coś na kształt przerośniętego naleśnika.
Może i nie wyrósłAle za to miał dziurawy wierzch :D
Na szczęście był smaczny, więc to mnie utrzymało przy pieczeniu. Kolejne podejście było już bardziej udane, ale nie byłem zachwycony, więc poszukałem innego przepisu.
Zamiast pojedynczej receptury odnalazłem prawdziwy skarbiec: kanał Bake with Jack na YouTube. Przerzuciłem się na jego „Sourdough Loaf for Begginers” i tego przepisu używam do teraz, z pewnymi zmianami, o których opowiem za chwilę. Poza tym bardzo przydał mi się jego film o zakwasie — okazało się, że nie trzeba się tym tak przejmować i karmić regularnie. Można po prostu na dnie słoika zostawić resztki i przechowywać tygodniami w lodówce. Mój rekord to nieco ponad trzy tygodnie bez karmienia, po czym zakwas ruszył normalnie, a chleb wyrósł bez problemów.
Gdzieś w okolicach zmiany przepisów, po krótkim eksperymentowaniu z wyrastaniem chleba w durszlakach wyłożonych bawełnianymi ręcznikami kuchennymi, kupiłem koszyki do garowania ciasta. Wtopy już się prawie nie zdarzały i zaczynałem się coraz lepiej bawić.
Chleb nasz codziennyI odświętny, z kłosem
Aż w końcu dotarło do mnie, że te coraz piękniej wyrastające chleby o otwartym miękiszu może i sprawdzają się, gdy trzeba poszpanować w sieci, ale masło i dżem przez nie przelatują jak przez sito. I zacząłem kombinować, jak mieć gęste ciasto, ale bez produkowania naleśników.
Zmieniając przy kolejnych podejściach różne elementy, takie jak ilość wody, czas wyrastania, rodzaj mąki, długość garowania, udało mi się wypracować formułę, która wydaje się działać.
Magiczna formuła
Przepis nie wymaga wiele pracy, ale sporo czasu. Z czego przez większość zakwas i ciasto sobie po prostu leżą. Nadaje się na wolny dzień, gdy można sobie co jakiś czas zajrzeć do kuchni i coś tam chwilę porobić. Na HO też się nada.
Podaję ilości składników na dwa spore bochenki, około 800 gramów każdy. Wygodniej mi załatwić oba na raz, a potem upiec w dwóch rzutach.
Jak wygląda rozciąganie i składanie (stretch and fold) możecie zobaczyć w filmie Jacka, z przepisu linkowanego wyżej. Warto go obejrzeć, bo tłumaczy sporo ważnych rzeczy z zakresu pracy z ciastem na zakwasie, które ja tu opuszczę i skupię się tylko na różnicach w porównaniu z jego metodą.
10:00
Wyciągam słój z zakwasem z lodówki i karmię:
100 gramów mąki żytniej razowej (typ 2000)
100 gramów letniej wody.
Potem zostawiam słoik w miarę ciepłym miejscu (ale bez przesady, np. na włączonym kaloryferze będzie za ciepło).
Zakwas zaraz po nakarmieniuPo wyrastaniu przez 5,5 godziny
15:30
Ciasto po zarobieniu
Zarabiam ciasto:
200 g zakwasu
550 g wody
250 g mąki chlebowej żytniej (typ 720)
650 g mąki chlebowej pszennej (typ 750)
16 g soli
Mieszam, aż nie będzie widać mąki. Przykrywam miskę bawełnianym ręcznikiem kuchennym i zostawiam na pół godziny.
Resztki zakwasu zdrapuję ze ścianek w równą warstwę na dnie i słoik wędruje do lodówki do następnego razu.
Pierwsze składanie
Po pierwszym składaniu
Już po pół godziny wyrastania ciasto będzie się inaczej zachowywać i da się lekko rozciągać bez zrywania.
Zazwyczaj składam je wtedy ok. 10 razy, po czym ciasto robi się wyraźnie gładsze. Warto je w tym momencie lekko zwilżyć (wystarczy przetrzeć mokrą dłonią), żeby nie wysychało za bardzo.
Przykrywam miskę i zostawiam na godzinę.
Drugie składanie
Po drugim składaniu
Może i wygląda podobnie, jak po poprzednim składaniu, ale po dotknięciu czuć, że gluten robi już swoją robotę. Ciasto jest teraz bardziej elastyczne niż wcześniej i można je rozciągać całkiem mocno bez obawy o zerwanie.
Znowu składam dziesięć razy, po czym kulę zwilżam i zostawiam w przykrytej misce na kolejną godzinę.
Trzecie składanie
Po trzecim składaniu
Teraz warto się przyjrzeć ciastu dokładniej, jeżeli wyrasta na tyle mocno, że robią się na nim duże bąble, to znaczy, że mam w kuchni cieplej niż zazwyczaj i może trzeba opuścić jedno wyrastanie i przejść od razu do następnego etapu.
Jeżeli jednak ciasto jest gładkie, ewentualnie z niedużymi pęcherzami, to składam ponownie i zostawiam na pół godziny.
Podział i wstępne formowanie
Po wstępnym formowaniu
Wyciągam ciasto z miski na delikatnie posypany mąką blat i dzielę je na dwie, w miarę równe części.
Najwygodniej podzielić używając skrobki z tworzywa. To bardzo przydatne narzędzie, używam go również przy wygarnianiu ciasta z misy. I do robienia kopytek oraz leniwych :)
Każdą z nich formuję w ciasną kulę (jak to zrobić znajdziecie w wyżej linkowanym wideo Jacka), posypuję lekko mąką i przykrywam ręcznikiem. Zostawiam na pół godziny.
Formowanie
Przygotowuje koszyki: wysypuję je mąką (mieszanka 50:50 ryżowej i pszennej chlebowej) i daję na dno trochę maku lub sezamu. Jeżeli chcę się pobawić w wycinanie wzorków, to zostawiam samą mąkę.
Formuję bochenki i wkładam do koszyków. Boczki poprawiam im jeszcze lekko tą samą mączną mieszanką, a wierzch posypuję otrębami żytnimi.
Przygotowane koszykiSkończone bochenki
Tak przygotowane bochenki wstawiam do lodówki na dwa dni. Jeżeli piekłbym już następnego dnia, to chleb wyrośnie bardzo mocno i będzie miał spore dziury. Jeżeli odpowiada wam taki rezultat, to nie musicie czekać dłużej.
Pieczenie
Przez godzinę nagrzewam kamień w piekarniku w 230 stopniach. Wykładam bochenek z koszyka na dechę do pizzy, tak żeby strona posypana otrębami była na spodzie.
Posypany ziarnami wierzch nacinam i chleb wędruje do pieca. Przykrywam go dużym naczyniem żaroodpornym i piekę 27 minut.
Tuż przed pieczeniemI już w piecu
Nie bawię się w żadną parę, tace z wodą czy spryskiwanie. I tak będzie pycha.
Po 27 minutach zdejmuję naczynie i oceniam, ile jeszcze brakuje do wypieczenia. Dopiekam jeszcze od 3 do 5 minut, tym razem bez przykrycia.
Jeszcze ciepłyTaki lubię najbardziej
Po upieczeniu studzę bochenek na kratce, robię zdjęcia do wrzucenia na socjale i drepczę dookoła. Czekam, aż ostygnie, z wegańskim masełkiem w pogotowiu.
Drugi bochenek zazwyczaj piekę dwa dni później. Przy dłuższej przerwie straci wigor i wyjdzie płaski.
Smacznego!
No i to cała tajemnica: mniej wody, domieszka żytniej mąki, krótsze wyrastanie i dłuższe leżakowanie w lodówce powodują, że chleb nadal pięknie rośnie w piecu, ale nie ma za dużych dziur, tylko równy miękisz. Idealny pod masło i dżem.
Jeżeli w czasie lockdownów nie zdarzyło wam się pobawić w pieczenie chleba, to polecam spróbować. Wiele fajnych rzeczy przygotowałem w kuchni, ale żadna nie dała takiej satysfakcji, jak wyciągnięcie z pieca bochenka chleba, który zrobiło się samemu. I to wyłącznie z mąki, wody i soli.
Ten linkowany wyżej tekst i wideo Jacka są świetnym startem do własnych kombinacji. I na początek wystarczy wam zwykła mąka, leżakowanie w durszlaku wyłożonym czystą bawełnianą ściereczką i pieczenie na blasze.
Bawcie się dobrze, ja idę nagrzać piekarnik na następny bochenek.
I tak sobie radośnie aktualizacje leżą od blisko dwóch miesięcy. To może nie być po prostu dłuższy urlop…
W każdym razie, jeśli ktoś korzysta z powyższych list i zależy mu na aktualizacjach, to polecam przepiąć się na wersję bezpośrednio ze strony projektu. Dostępnej pod linkiem download local copy dla każdej z list. Te są aktualizowane.
I tak to się w tym IT/security kręci…
UPDATE: To nie jest tak, że powstał ten wpis i over. Założyłem kolejne issue, na wypadek gdyby autor przeoczył wcześniejsze. Napisałem też maila. Póki co cisza.
Dzisiaj napiszę o sieciach (mój konik), problemie z opóźnieniami i dwóch rozwiązaniach
(krótko- i długoterminowym).
Problem
Problem miała firma Meta (wtedy jeszcze nazywała się Facebook), a winne były:
geografia i fizyka. Pierwsza, bo firma serwerownie miała tylko w Stanach Zjednoczonych,
natomiast produkt^W klientów np. w Azji. Druga, fizyka – bo światło z Indii do Kalifornii
leci prawie 50 milisekund, a w światłowodzie to, o panie!, nawet 75 ms.
Trzecim winnym jest historyczny stos protokołów – TCP/IP, HTTP, TLS. I ich gadatliwość, zanim można coś użytecznego
odebrać. Pamiętając o tych nieskracalnych 75 milisekundach w jedną stronę, wyobraźmy sobie Prakesha chcącego otworzyć
stronę Facebook. Załóżmy, że lokalny DNS zna już adres IP.
Nawiązanie połączenia TCP/IP wymaga wymiany przez obie strony 3 pakietów (z flagamia SYN→, SYN+ACK← i ACK→).
Zestawienie połączenia musi potrwać co najmniej 225 milisekund.
Cool, możemy rozmawiać z serwerem FB. No to uzgodnijmy szyfrowanie, powiedzmy TLS1.2. Ta pogadanka to już 4 pakiety.
Kolejne +300 milisekund przy dobrych wiatrach.
Teraz już możemy wysłać zapytanie HTTP (+75ms) i dostać odpowiedź (+75ms).
W ten sposób od żądania do otrzymania pierwszego bajtu minęło prawie ¾ sekundy. O ile Prakesh jeszcze czeka (bo
przy obecnych attention spans mógł już się znudzić i pójść gdzieś indziej), zacznie mu się powoli ładować strona
Facebooka. Powoli, bo każdy element strony to osobne zapytanie i odpowiedź HTTP (+150ms).
Jeśli przeglądarka jest w miarę ogarnięta, to otworzy kilka połączeń i będzie równolegle wysyłać zapytania.
„W locie” możemy mieć dużo pakietów, ale każda między każdą parą zapytania-odpowiedzi musi minąć czas
fizycznej propagacji.
Rozwiązanie na szybko
Inżynierowie Facebooka chcieli ułatwić życie użytkownik z Azji, wdrożyli więc rozwiązanie
w postaci lokalnych punktów obecności (ang. points of presence, PoP). To taki punkt łączności
znajdujący się (sieciowo) blisko Prakesha. Blisko, to znaczy nie 150 ms stąd, ale powiedzmy ~10 ms.
Wciąż nawiązanie szyfrowanego połączenia to wymiana kilku pakietów, ale ponieważ cel jest blisko,
to pierwsze pełnoprawne zapytanie można wysłać już po 50 milisekundach.
W pierwszej chwili może się wydawać, że zapytanie do PoP nie ma większego sensu. Dane i tak
są przecież w serwerowni FB w Stanach, 75 ms stąd, i tam trzeba sięgnąć. Ale tutaj dzieje się
ważna rzecz. PoP ma pewną pulę uprzednio zestawionych, szyfrowanych połączeń z serwerownią w USA.
Nie trzeba otwierać nowego za każdym razem. Zapytanie użytkownika z Azji można od razu wysłać
i po 150 ms dostać odpowiedź.
W ten sposób zamiast po 750 ms, pierwsze bajty dotrą już po 50+150+50 ms, czyli 3× szybciej.
Not great, not terrible. Całość strony też załaduje się odpowiednio szybciej.
Rozwiązanie poprawne
Point-of-presence to fajny hack, ale długofalowe rozwiązanie wymagało dużych inwestycji,
lat pracy i współpracy różnych podmiotów.
Lokalne serwerownie. Duży wydatek i wysiłek organizacyjny, ale też duży uzysk.
Z Singapuru do Indii jest tylko 16 ms (tj. około
3,5 tys. km). Na innych kontynentach Meta też postawiła kilka lokalnych DC.
Jak inaczej można jeszcze dorzucić do pieca?
TCP Fast Openhttps://en.wikipedia.org/wiki/TCP_Fast_Open było próbą otwierania połączeń
TCP/IP szybciej, mniejszą liczbą pakietów (pamiętamy, że każdy kosztuje nas 150 ms). Nie zażarło,
ale za to…
Protokół QUIC pozbył się w ogóle TCP. “U” w nazwie jest od UDP, które jest bezpołączeniowe
i pozwala zacząć rozmowę szybciej. Przyjął się, za chwilę do niego wrócimy. Jak również do
zbliżonego protokołu SPDY, który próbował być szybszym HTTP z użyciem TCP.
TLS1.3. Szyfrowanie było najwolniejszym elementem nawiązywania połączenia (4 pakiety!). Opracowanie trybu
0rtt pozwoliło na nawiązywanie szyfrowanych sesji już pojedyńczą wymianą, o ile strony rozmawiały
ze sobą wcześniej.
HTTP/2 i HTTP/3. W końcu samo wysyłanie zapytań o elementy strony też poprawiono. Co prawda
już HTTP/1.1 z końca ubiegłego wieku pozwalało na wysłanie kilku zapytań na raz, zamiast sekwencyjnie
(tzw. pipelinining), ale działało to tak se. W wyższych wersjach jest to dobrze rozwiązane.
Nie musząc zestawiać nowych połączeń można dostać całą stronę szybciej.
Wspomniany wcześniej protokół SPDY był podstawą opracowania HTTP/2. Natomiast QUIC jest
fundamentem na którym działa HTTP/3.
Points of Presence były sprytnym, szybkim rozwiązaniem. Dogłębne rozpykanie problemu
wymagało współpracy wielu podmiotów – Meta, Google, programistów Linuksa, IETF i twórców przeglądarek.
Ale dzięki temu możemy oglądać kotki szybciej.
Jest taki żartobliwy przepis na przekroczenie prędkości światła: łączymy dwa koła w taki sposób, żeby jeden obrót pierwszego przekładał się na dziesięć obrotów drugiego, potem analogicznie łączymy drugie z trzecim, trzecie z czwartym i tak dalej, aż do dziesiątego. Jeden obrót pierwszego koła będzie się wtedy przekładać na 109, czyli miliard, obrotów ostatniego. Teraz wystarczy tak rozpędzić pierwsze koło, żeby punkt na jego obwodzie osiągnął skromną prędkość trzydziestu centymetrów na sekundę – punkt na obwodzie ostatniego koła osiągnie wówczas trzysta tysięcy kilometrów na sekundę, czyli ciut powyżej prędkości światła. Szach mat, Einsteinie!
W rzeczywistości takie coś naturalnie nie miałoby prawa zadziałać – nawet gdyby teoria względności była fałszywa. Przełożenie obrotów jeden do miliarda oznacza, że rozkręcenie całej maszynerii także wymagałoby miliard razy większej siły niż w poruszenie jednego koła. Żeby przedstawić rzecz obrazowo: aby trybik na pierwszym kole przesunął się zaledwie o milimetr, trybik na ostatnim musi pokonać – bagatela – tysiąc kilometrów. Jeżeli to koło ma, dla równego rachunku, metr obwodu, oznacza to milion obrotów – a więc ten milimetrowy ruch wymagałby tyle wysiłku, co obrócenie koła milion razy, nie licząc oporów spowodowanych tarciem i siły potrzebnej do obrócenia wszystkich pośrednich kół.
Drugi problem jest taki, że nawet dysponując odpowiednią siłą, i tak nie byłoby sensu próbować, bo z czegokolwiek byśmy tych kół nie zrobili, nie wytrzymałyby one tak wielkich obciążeń – zanim byśmy w ogóle dali radę cokolwiek ruszyć, trybiki z pewnością by nam popękały. A nawet gdyby wynaleźć jakiś niedorzecznie wytrzymały materiał i wprawić koła w ruch, to na długo przed osiągnięciem prędkości światła rozgrzałyby się one od tarcia (atmosferycznego i o siebie wzajemnie) i zaczęły topić, albo rozerwałaby je siła odśrodkowa (proporcjonalna do kwadratu prędkości, więc rosnąca bardzo szybko). Krótko mówiąc: nie próbujcie tego w domu!
Konstrukcja, którą zbudowałem z klocków Lego, nie ma oczywiście ambicji przekraczania prędkości światła, ani nawet dźwięku – posłuży tylko do zademonstrowania w mikroskali problemów opisanych w drugim akapicie.
Duże kółka mają po dwadzieścia ząbków, a małe po dwanaście, co oznacza przełożenie 1,67 między sąsiednimi osiami – sporo mniej niż dziesięć, ale dobre i to. Cztery białe pokrętła z tyłu mają zatem przełożenia, kolejno od lewej:
1,673 ≈ 4,63
1,676 ≈ 21,43
1,679 ≈ 99,23
1,6712 ≈ 459,39
Czyli jeden obrót ostatniego pokrętła przekłada się na prawie pięćset obrotów śmigła po lewej.
Tyle teorii, a jak to działa w praktyce?
Jak widać na załączonym filmiku, przełożenie to nie wszystko: trzecie pokrętło wcale już nie daje szybszych obrotów niż drugie, bo jego obracanie wymaga więcej wysiłku, a czwarte w ogóle trudno ruszyć – i też trochę strach, bo jesteśmy już niebezpiecznie blisko granicy wytrzymałości klocków; gdybym dodał jeszcze dwie-trzy kolejne osie, ta granica mogłaby już zostać przekroczona.
A największą prędkość pozwala uzyskać czarne pokrętło z przodu, z przełożeniem 1,678 ≈ 59,54. Niby nie tak wiele, ale na prawo od niego opór narasta już szybciej niż przełożenie, więc uzyskiwana szybkość zaczyna spadać. Mógłbym oczywiście zrobić dłuższe i poręczniejsze pokrętła, którymi dałbym radę kręcić szybciej, ale wtedy znowu zacząłbym się obawiać o wytrzymałość klocków. Co innego, gdyby kółka były z żelaza – ale wtedy z kolei byłyby cięższe, więc stawiałyby większy opór… Tak czy siak, maksimum pewnie by się znacząco nie zmieniło.
Wniosek z tego taki, że przy przełożeniu 1/10 już przy czterech kółkach byłoby bardzo ciężko tym kręcić – a że każde kolejne zwiększa wymaganą siłę o kolejne zero z kawałkiem, to nawet przy użyciu potężnego silnika i kół z tytanu, granicą możliwości byłoby pewnie sześć, góra siedem kółek.
Podsumowując: testować teorię względności trzeba w innym trybie – albo i bez żadnego trybu.
Dostałem maila od Google. Na stronie wykryto błędy, kod błędu 403. Sprawa mnie zaintrygowała. Co prawda chodziło tylko o jeden URL, ale czemu 403? Błędy 5xx czy 404 bym zrozumiał jeszcze, zwłaszcza na blogu, ale 403? Coś się tu zdecydowanie nie zgadza.
Rozpocząłem dochodzenie i zrobiło się dziwniej. Bowiem chodziło o zupełnie egzotyczny URL ( hxxps://zakr.es/tststs/ ). Na oko poprawny, ale ewidentnie tymczasowy i testowy. I zdecydowanie nie należący do bloga. W ogóle byłem zdziwiony, że Google o nim wie.
And he knows I’m right
Pierwsze co przyszło mi do głowy to robots.txt. Może dlatego, że sugerują sprawdzenie, czy dostęp nie jest tam blokowany? W każdym razie pudło. Zresztą nawet gdyby tam URL był, to raczej jako wykluczenie dla botów. A wtedy zgłaszanie braku dostępu byłoby sporą bezczelnością.
Zajrzałem do katalogu na serwerze i przypomniało mi się, że testowałem pewną rzecz. Powiedzmy, że okolice bug bounty. Tak, robienie tego na podstawowej domenie to zwykle kiepski pomysł, ale tym razem kluczowa miała być obecność naturalnego ruchu. Tak czy inaczej nic z tego nie wyszło, tj. nie udało mi się wykorzystać w planowany sposób. A katalog pozostał, choć już niewykorzystany. I nielinkowany.
Analiza
Google webmaster tools[1] pokazuje, skąd jest linkowana dana strona. W tym przypadku podał dwie strony na blogu. Jedną z konkretnym wpisem, drugą zbiorczą.
Tyle, że w podglądzie źródła tego ostatniego wpisu to ja tego URLa w żaden sposób nie widzę.
Jak to wygląda czasowo? Kolejna ciekawostka to kolejne dwie daty w Google webmaster tools:
Data pierwszego wykrycia: 31.08.2022
Zapewne wtedy się bawiłem. Daty utworzenia plików potwierdzają – wszystkie pliki mają 03.08.2022. Ma to jakiś sens, tylko musiałbym zostawić pliki podlinkowane na miesiąc? Raczej niemożliwe, bo wtedy zostałyby na stałe. A nie ma. No i skąd by się wzięły w tak starym wpisie?
Ostatnie skanowanie 5 maj 2023, 11:47:16
To oczywiście możliwe, tym bardziej, że Google zauważyło błąd 403 dokładnie 3 maja 2023. Po ponad pół roku?
I’ve been talking to Google all my life
Jeśli chodzi o Google, to mamy love hate relationship. Z jednej strony doceniam firmę za GCTF, czy zabezpieczenia poczty i kont. Z drugiej strony to, co robią z prywatnością userów, nachalność reklam, tragiczny, scamerski content części reklam bąbelkowanie w wyszukiwarce i wreszcie samo bycie globalną korporacją mocno mnie odstręczają.
Ostatecznie jest tak, że umiarkowanie korzystam z ich usług. Trochę, bo wygodne, trochę, bo wypada znać. Mam webmaster tools, mam reklamy AdSense, ale tylko w wybranych miejscach. Pozwalam indeksować blog. Raczej nie korzystam z ich wyszukiwarki, tj. sięgam do niej tylko, jeśli nie znajdę wyników w podstawowej, czyli rzadko. Inne usługi Google, czyli np. Maps, Waze, translate, calendar, drive, docs – różnie, raczej korzystam, choć w ograniczonym stopniu.
Część rzeczy się zgadza, np. wizyty kiedy Google zauważyło i zaindeksowało URL, po miesiącu od zamieszczenia plików. Widać też wizyty 03.05, kiedy sobie o nim ni stąd ni zowąd przypomniało. Mogło się też zdarzyć, że do testów wziąłem jakiś stary wpis z 2015.
Nadal nie zgadza się – albo nie mogę sobie przypomnieć – jak to się stało, że URL został na miesiąc, a nie został na stałe. I słodką tajemnicą Google pozostanie, czemu zapomniało o tym URLu na bite osiem miesięcy.
Usunąłem katalog z serwera. Może teraz Google, gdy dostanie 404, zapomni o nim na dobre?
[1] Obecnie Google Search Console, ale przywykłem do starej nazwy, więc przy niej zostanę, przynajmniej w tym wpisie.