Béton brut

UserLAnd: chroot w kieszeni

Gdybym zeskanował teraz domową sieć trafiłbym pewnie na nie mniej niż cztery komputery z Linuksem. A jeśli starczyłoby mi gniazdek, to mogę dobić i do dziewięciu. To nie mówi zbyt wiele o samym systemie, a więcej o mojej nieumiejętności używania innego środowiska. Może to Syndrom sztokholmski, ale czuję się z tym doskonale! Dla niektórych „rok Linuksa na biurku” zaczął się w 1997.

Niedawno zapytano mnie „czy możesz nauczyć mnie Linuksa”. Trochę się tym strapiłem, bo mogę oczywiście, tylko nie wiem, co rozumieć przez „Linuksa”? Czy uczenie kogoś powłoki, potoków i pisania pomocniczych skryptów to nauka Linuksa, czy na przykład Basha? Czy stawianie serwera HTTP to nauka Linuksa? Embedded? Rzuciłem okiem na spisy treści już napisanych książek typu „Wstęp do…” i wyszło mi, że zwykle jest to książka w której autor opisuje jak okiełznuje się jego ulubioną dystrybucję.

Dla mnie pytanie o „naukę Linuksa” jest jak pytanie o „naukę młotka”. Do stolarki, budowlanki, morderstwa powodowanego pasją? Nie wiem, jak do tego podejść. Żeby nie utykać w filozofii tego pytania przeskoczyłem na grunt twardszy, jak uczyć kogoś, kto może nie ma wystarczająco zasobów i intuicji żeby mógł wybrać jedną z miliona opcji. Zainstalować na komputerze jako główny lub drugi system? Ciężko. Wirtualna maszyna? Trochę pokracznie. Raspberry Pi? Ból tyłka. WSL? Obiecujące, ale mam zero doświadczenia i jak coś się wywali to nie będę umiał odkręcić.

I wreszcie wpadłem na rozwiązanie, które mi się spodobało.

Każdy telefon z Androidem chodzi pod kontrolą kernela Linuksa i jakiś śmieci na górze, które służą do wyświetlania reklam. Teoretycznie nic nie stoi na przeszkodzie żeby „dorobić” telefonowi przedrostek GNU/. Przez lata było kilka takich projektów, nigdy nie przykładałem do nich jednak uwagi, gdyż jak wspomniałem na górze, mam dziewięć innych komputerów. Przebiegłem się po Biedronce Aplikacji i znalazłem jeden, który mi wybitnie odpowiada: UserLAnd.

Po pobraniu aplikacji i jej odpaleniu zostaniemy powitani przygotowanymi dystrybucjami, które możemy odpalić na swoim telefonie. Są to po prostu drzewa plików spakowane i gotowe do pobrania. Osobiście testowałem tylko Debiana, ale zakładam, że inne działają tak samo. Poza surowymi dystrybucjami można porać pojedyncze aplikacje, takie jak IDE Pythona, Firefoks, GIMP czy zork.

Wybór dystrybucji

Po kliknięciu rozpocznie się proces pobierania i ekstrakcji. Trzeba zwrócić uwagę na to, że pliki te trafią na miejsce z którego mogą być czytane przez inne aplikacje (albo nie: nie jestem na bieżąco z Androidem) więc składanie ważnych danych takich jak hasła, klucze SSH i dane osobiste nie jest polecane.

Konfiguracja użytkownika

Następnie zostaniemy poproszeni o podanie nazwy użytkownika i haseł do SSH i VNC. Nic prostszego.

Tworzenie połączenia

Potem deklarujemy jak się chcemy łączyć z naszą maszyną. Osobiście, co nie jest dziwne, preferuję SSH. Jak będę potrzebował okienek to zawsze mogę dodać -X.

I to wszystko. System podniesie się po chwili i możemy na niego wskoczyć. Ponieważ aplikacja nie może przypisać sobie niskich portów domyślnym jest 2022. Podczas uruchamiania sesji aplikacja będzie chciała użyć jednego z dostępnych klientów aby ustanowić połączenie na telefonie, ale możemy to zignorować. Ekran dotykowy plus magiczne | zaklęcia | z --toną --parametrów to nie jest świat w którym chcę żyć i którego i Wam nie życzę.

λ ~/ ssh emil@192.168.1.204 -p 2022
emil@192.168.1.204's password:
Welcome to Debian in UserLAnd!
emil@localhost:~$ uname -a
Linux localhost 4.9.117+ #2 SMP PREEMPT Thu Feb 13 01:10:05 CST 2020 aarch64 GNU/Linux

I już mamy „prawdziwego Linuksa” chodzącego pod kontrolą kernela dostępnego w Androidzie. Czy to metoda „lepsza” niż te, które wspomniałem wyżej? Wątpliwe. Ale wydaje się najmniej skomplikowana i inwazyjna.


Światy wytworzone

Kiedy usłyszałem jak dziecko koleżanki z pracy relacjonuje fantastycznego gola strzelonego przez Christiano Ronaldo ucieszyłem się w duchu. Było lato z turniejem piłkarskim i myślałem, że młody człowiek siedzi i ogląda zmagania na boisku, jak i ja. Nie mając specjalnego talentu do rozmawiania z dziećmi (choć kiedyś byłem dzieckiem jeśli wierzyć zdjęciom, pewnie zapomniałem co one robią w wolnym czasie) zagadałem do niego o inną spektakularną bramkę. Popatrzył na mnie podejrzliwie, coś burknął i wycofał się w kierunku matczynego biurka.

OK, nie wiem czego się spodziewałem, dyskusji o funkcji raumdeutera we współczesnym, ofensywnym futbolu? Nic to. Po pewnym czasie, łowiąc jednym uchem strzępki monologów odkryłem powód naszego braku porozumienia.

Ja mówiłem o Ronaldo z krwi i kości, a on mówił o jego podobiźnie zbudowanej z poligonów, którą kieruje grając w FIFĘ na konsoli. I to on jest tym prawdziwszym, choć w rzeczywistości to tylko faksymile Portugalczyka.

Trochę się zeźliłem, a w brzuchu zrobił mi się koktajl z ogórków konserwowych i jogurtu. Raz, że nie kumam bazy. Dwa, że jak tak można żyć z fałszywym obrazem kogoś! Kiedy wyszedłem z biura nie mogłem przestać myśleć o tym, jak dziwny to świat w którym można żyć kompletnie w oparach cyfrowych fatamorgan. Winiłem oczywiście współczesność, rozpasany konsumeryzm i głupotę dzieci, które grają w gry, których nawet nie trzeba wczytać z taśmy.

Im dłużej jednak nad tym myślałem tym bardziej dobijała się do mojej świadomości myśl w tle. I szeptała cicho Newcastle United… Newcastle United… — ale co, Newcastle? Ach.

Odkryłem nagle, czemu tak bardzo mnie ta myśl gnębiła od rana.

Przez kilka lat moim życiem zawładnęła gra komputerowa: Championship Manager (teraz: Football Manager). Był to symulator ekonomiczno-sportowy, który pozwalał się wcielić w rolę managera jednego z klubów angielskiej ligi. Gra z daleka wyglądała jak arkusz kalkulacyjny i nikt w temacie nie mógł zrozumieć czemu biały pasek wypełniający się po prawo powoduje, że wpadam z szału w ekstazę by zaraz wsiąść w pociąg powrotny do szału. Jednej wiosny postanowiliśmy z moim boiskowym kolegą że już się wystarczająco nauczyliśmy w tym roku szkolnym i możemy wziąć dwa miesiące wolnego i poświęcić się rzeczy, która jest na serio ważna: graniu od rana w Championship Managera.

Od razu był problem. Obydwaj chcieliśmy prowadzić Manchester United, który był tytanem piłkarskim tamtych lat. Kto by nie chciał być Fergusonem podwórka? Rzuciliśmy monetą i wyszło, że przegrałem. Musiałem wybrać inną drużynę. Mając nikłe pojęcie o angielskiej piłce postanowiłem przyjąć następującą heurystykę: Machester. United. Manchester City jest dziadowskie. Więc to nie pierwszy człon decyduje o sukcesie w piłce. W takim razie jasne jest, że to United jest sygnałem „to dobra drużyna”. Wybrałem więc Newcastle United.

Championship Manager

I zaczęliśmy grać. Po dwóch miesiącach okazało się, że nasze szkoły nie rozumieją potrzeby walki o ligowe tytuły i obaj zostaliśmy na tym samym roku. Co nam wybitnie pasowało, bo to znaczyło, że mamy dwa miesiące wakacji i dodatkowo mamy już wszystkie książki i zeszyty, więc nie musimy się nawet przygotowywać! Lekko 4 miesiące luzu, świetnie.

Jak pisałem wcześniej granie w Championship Managera wymagało wyobraźni. Cała gra to tylko kolumny cyfr i trochę tekstu. Ludzka natura lubi historie, uczłowieczaliśmy więc te ciągi znaków, dorobiliśmy się własnego zestawu przesądów, mieliśmy drużyny z którymi nie lubiliśmy grać. Wspominaliśmy ciekawe momenty w naszych karierach. Żyliśmy w alternatywnej rzeczywistości, gdzie nie pojedynczy piłkarz, a cała drużyna, była ofiarą naszej nieskrępowanej fantazji.

Statyski Matta Le-Tissiera

Ponieważ byłem bramkarzem szczególnie urzeczywistniałem w mojej głowie wyczyny mojego bramkarza Srok1. Któregoś dnia wyznaczyłem go do strzelania rzutów karnych. Strzelił. Dla żartu zostawiłem go jako egzekutora. I strzelił następnego. I następnego. A jego legenda rosła. Kiedy chciał zakończyć karierę próbowałem przerobić stan gry tak żeby został. Co się nie udało.

Przez lata myślałem o nim, o Hopperze, moim strzelającym karne bramkarzu Newcastle z rozrzewnieniem. Tyle wspaniałych wspomnień. I gdy odbiłem się od katalizującego incydentu z Ronaldo i synem koleżanki zdałem sobie sprawę, że… ja nie wiem nawet jak Hopper wygląda. Doszedłem do domu, usiadłem do komputera. OK, jest, widzę. Strasznie mało coś o nim. I w trzecim linku na Google czytam, co następuje.

Hooper started with a clean sheet against West Ham. But things soon declined as he was beaten by a long-range last- minute free-kick by Matt Le Tissier in a 2-1 loss.

Newcastle United’s Worst XI: Worst goalkeepers

Okazał się, że Hopper nigdy nie był bohaterem, nigdzie, poza moją głową. Był kiepskawym bramkarzem, który wyleciał z startowej jedenastki i praktycznie nigdy niczego nie dokonał. Ja się oburzyłem na kogoś, kto strzela bramki w FIFA, a sam mam 12 sezonów fałszywych wspomnień, które sobie opowiedziałem patrząc w kilka rubryczek. I kiedy on symuluje człowieka sukcesu odnosząc sukces, ja wymyśliłem człowieka sukcesu z piłkarskiego nikogo.

Kto jest bez winy niech pierwszy rozpocznie grę długim wyrzutem.


  1. „Sroki” to przydomek Newcastle United 


Szybkie życie

W Internecie bulgocze mem o tym, jak to w czasach zarazy mądrzy ludzie dokonali wielkich czynów i jakie ważne dzieła wyprodukowali. Oczywiście, jak w każdym inspirational porn pomijane są pewne fakty. Na ten przykład twórcy wspaniałych rzeczy nie wdzierali się na intelektualną scenę, a byli na niej już od dawna. Albo to, że nie musieli się w większości przejmować czynszem, zamkniętą szkołą, ani też doświadczać pierwszy raz zdalnej pracy.

Ja celuję dużo niżej. Każdemu jego dzieło w miarę możliwości.

Znudzony i niechętny pracy kręciłem się tu i tam, szukając ciekawego zajęcia. Wyciągnąłem stare numery „Młodego Technika”. Przeczytałem kawałek tekstu o tym jak działają świece zapłonowe. Nie było ognia w moim sercu. Wyciągnąłem Tołstoja, ale na pierwszej stronie było od razu pięć długich, dwuczłonowych rosyjskich nazwisk i wiedziałem, że nie ma szans żebym się odnalazł w tym bez tablicy korkowej i czerwonych sznurków do utworzenia relacji pomiędzy bohaterami historii.

Zastanawiałem się jak wygląda miasto. Od tygodnia wyszedłem z domu trzy razy. Na 5 minut. Dokupić alkoholu i jajek. Jajka jem na śniadanie, alkohol na kolację. Te dumania przypomniały mi o zapomnianej dziś instytucji „publicznych webcamów”. Kiedyś były bardzo popularne, ludzie oglądali obce miasta, kurze fermy, małpy, psy i co jeszcze komu wpadło do głowy. Wpisałem więc frazę w wyszukiwarkę i po chwili widziałem swoją okolicę. Popatrzyłem chwilę jak pan chodzi z miejsca w miejsce, zaparkował samochód, a później odjechał. Pan, śledzony nieustępliwie przez śmieciarkę na światłach, opróżniał kubły. Świat istniał, choć nie wyglądał ciekawie.

Pomyślałem, że mógłbym sobie rzucić to wideo na mały, dziesięciocalowy telewizorek, który stoi w kącie mojego biurka i zabawia mnie wyświetlając anime z lat 80 kiedy pracuję. Stworzyłbym sobie wirtualne okno na ulicę.

Biurko

Ostatecznie, gdzieś tam pod spodem, jest pewnie jakiś strumień wideo, który można zawinąć.

Poszedłem sprawdzić i oczywiście, jest jakiś. Po pierwsze lista M3U, po drugie powtarzający się cykl fragmentów wideo. Dla testu skopiowałem jeden z linków i podałem do wget. Coś się ściągnęło. mplayer odtworzył 2 sekund wideo z kamery. OK, czyli to tak działa. Wideo jest serwowane w tej serii plików i po osiągnięciu ostatniego, 92 fragmentu, lista zawraca do pierwszego, oznaczonego 42.

Dobra, a czy da się je jakoś seryjnie ściągnąć? Znaczy, na pewno się da, ale tak żebym potem mógł coś z tym zrobić? Otworzyłem nową powłokę terminala i wydałem klasyczne zaklęcie mkdir, git init, vi.

Wpierw wymyśliłem bardzo skomplikowany sposób pobierania tego, z wątkami, sprawdzaniem ETag i kto wie, co jeszcze. A potem uznałem, że głupia metoda jest równie dobra, a doprowadzi mnie do sukcesu szybciej.

Czyli tak:

  1. Wezmę wszystkie kawałki klipów w momencie odpalenia
  2. Zapiszę je sobie na boku
  3. Zobaczę ile czasu mi to zajęło i odejmę od maksymalnej długości wszystkich klipów
  4. go to 1
import requests # klient HTTP
from time import sleep # chcemy pauzować

# wpisany na twardo adres z którego będę pobierał informacje
URL = 'https://cdn-3-go.toya.net.pl:8081/kamery/lodz_piotrkowskaschillera_0{}.ts'

# formad do zapisywania, index poprzedzony dopełnieniem 12 zer
OUTPUT = 'output/{:012}_frame.mpg'

""" Żeby się było łatwiej kręcić, wartości [42…91] w liście """
frames = range(42, 92)

idx = 0
while True:
    # Cała lista otwarzania ma (92-42)*2 sekund 
    rotation_time = len(frames) * 2

    #Kiedy zaczynamy proces
    start_time = datetime.now()

    for frame in frames:
        print("Grabing {}".format(frame))
        # Klasyczny HTTP GET / i zapisanie pliku docelowego
        response = requests.get(URL.format(frame))
        if response.status_code == 200:
            with open(OUTPUT.format(idx), 'wb') as f:
                f.write(response.content)
            idx = idx + 1
    # Jak przelecieliśmy wszystkie ramki to czekamy resztę sekund, aż 
    # się wszystkie podmienią
    after_downloading = datetime.now()
    remaining_seconds = rotation_time - int((after_downloading - start_time).total_seconds())
    print("Clips fetched, sleeping for {}".format(remaining_seconds))
    # …i do łóżka
    sleep(remaining_seconds)

Udało się za pierwszym razem. Pokombinowałem jeszcze z nazwami i takimi tam, ale wyglądało na to, że całość ściągnęła się bez problemu. No dobra, ale co z tym teraz zrobić? Chwilowo nie miałem pomysłu, więc sklonowałem repozytorium na lodówkową RaspberryPi i pozwoliłem się jej kręcić, naciągnąć mi nieco danych.

Minął czas, a ja wymyśliłem. Zrobię tzw. timelapse czyli przyśpieszone wideo z źródłowych fragmentów. Mam w vimwiki całą stronę poświęconą rozmaitym zaklęciom, którymi można przymuszać ffmpeg do robienia fantastycznych rzeczy.

Kiedyś spędziłem wieczór na brzegu zalewu żeby zamienić 6 minutowy filmik z zachodu słońca w taki, który byłby ustabilizowany, krótszy i jeszcze miał muzykę. Wyzwanie: tylko przy użyciu połączenia SSH do domu. Wyszło OK, ale nie spektakularnie.

Nie było sensu zaprzęgać do tego Pythona, wsadziłem całość w prosty skrypt Basha. 1

#!/bin/bash

# Wczytaj z katalogu output wszystkie pliki *.mpg
for file in output/*.mpg ; do
    # Weź obecną nazwę, utnij ją przy kropce, dodaj png
    new_file=`echo $file | cut -d. -f1`.png
    echo $new_file
    # Weź pierwszą klatkę animacji i zapisz pod nową nazwą
    ffmpeg -i $file -vf "select=eq(n\,0)" -vframes 1 $new_file
done

# Zakoduj nowopowstałe klatki w mp4/h264 żeby się przeglądarki nie czepiały
ffmpeg -pattern_type glob -i 'output/*.png'  -an -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3 out.mp4

Po kilku testach postanowiłem, że osiągnąłem znośny efekt (mimo kilku momentów w których uzyskałem duplikaty serii klatek. Mogłem usunąć to post factum ale jak mówił Bob Ross, “There are no mistakes, just happy accidents“), wysłałem wszystko na RaspberryPi i postanowiłem dać się całości kręcić przez noc.

Wysłałem jeszcze e-mail do mojego przyjaciela Łukasza żebrząc o jakiś utwór muzyczny z mojej ulubionej płyty jego projektu, Coffee Sounds. Na moje szczęście zgodził się, za co chcę mu jeszcze raz podziękować.

Wstałem o piątej, zebrałem 17200 klatek i oto przed Wami efekt bezcelowej, nocnej dłubaniny. Łódź, Piotrkowska, Pasaż Schillera. Od 22:30 do 8:00.

  • :15 zaczyna padać deszcz, ulice się świecą odbitym światłem latarni
  • :37 „Do Poloneza? Ale Panie Władzo, ja nie tańczę”
  • 3:15 wschód słońca

Te, zdecydowanie zbyt rzadkie, momemty w moim życiu gdy zamieniam „czy da się?” w „da się” przy pomocy śliny, mchu i oglądania problemu przez palce sprawiają mi zawsze najwięcej radości.

Polecam Wam zaprzęgać komputery do bezużytecznej, kreatywnej pracy. Komputer jako odpalarka do przeglądarki to takie marnotrastwo nieomal nieograniczonej mocy.

Czas szybciej płynie, gdy dłubiesz. Lokatorzy więzień próbujący wykonać podkop też Wam to powiedzą.


  1. Potem trochę pozmieniałem rzeczy, całość dostępna jest w repozytorium git 


ttyd

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.


Klik, klik. Dziadek znikł.

Zdjęcie gór

Robiła się późna niedziela, a to znaczyło, że muszę powoli wyrwać się z ciszy otaczających mnie gór i wrócić na łono ogarniętego świątecznym amokiem miasta. Ciągnąłem więc nogę za nogą i oddawałem się mojej pasji oglądania lokalnego życia. Natrafiłem na przykład na szyld, który nie tylko oferował wideofilmowanie, ale także usługę przegrywania kaset VHS na płyty DVD. Jak przepisywanie kamiennych tablic na papirus. To zawsze napełnia mnie radością, że mogę uciec w miejsca, gdzie technologiczny postęp jest na chorobowym.

Jak większość górskich dróg ta też była pełna dzikich zakrętów, a przy jednym z nich zauważyłem kolejny szyld: „zakład pogrzebowy”. Uśmiechnąłem się do siebie: taki ostry zakręt i zakład pogrzebowy to doskonałe miejsce na skecz o tym jak klient dosłownie sam stuka do drzwi biznesu.

Pokonałem zakręt i co widzę na jego końcu. Drugi zakład pogrzebowy, po przeciwnej stronie ulicy. Jak stacje benzynowe obsługujące wielopasmową autostradę. To spowodowało, że rozbudowałem moje gdybania: jak dwa zakłady pogrzebowe znajdują wystarczająco biznesu dla osady, która ma cztery tysiące dusz?1

Wykluczając scenariusz taniego horroru w którym oba zakłady pogrzebowe wynajmują morderców, którzy są kołem zamachowym biznesu, zacząłem gdybać jak funkcjonuje tak specyficzny biznes w obliczu konkurencji. Czy drzwi do gabinetu lokalnego dyrektora szpitala zamykają się non-stop za właścicielami tych zakładów, trzymających pod pachą coraz to wykwintniejsze butelki alkoholi? A może kosze owoców.

I jak ja, adept współczesnego świata, mógłbym im pomóc w polepszeniu „lejka konwersji” trupa w przelew.

Na początek należy zacząć od rzeczy prostych. Reklama na Facebooku dla targetu, zgromadzić marketingowe dane o umieralności, posegregować w grupy docelowe: ludzie, którzy umierają normalnie, ze starości. Ludzie, którzy konsumują alkohol aby zapomnieć. Operatorzy maszyn rolniczych zakończonych ostrzami. Zaoferować zniżki dla tych, którzy wybiorą usługi zanim utracą zdolność decydowania.

Potem trzeba przejść do argumentów cięższych. Zakupienie danych o zdrowiu i nawykach od firm, które inwigilują obywateli w ramach „darmowych usług”. Od producentów elektronicznych krokomierzy przez producentów urządzeń podsłuchowych, które potrafią powiedzieć jaka jest pogoda, co pozwala inwigilowanym na zaprzestanie wyglądania przez okno. Tak uzyskane informacje, wielka-mała data, nadaje się idealna do wsadzenia do paszczy modeli sztucznej inteligencji. Wyłuskane dane trzeba skorelować z już istniejącymi informacjami o denatach i wejść w biznesowy układ z okolicznymi sklepami aby promować zachowania, które są denatogenne.

Hasła jak „Na co ci fura, pij denaturat”, „Siała baba mak i zrobiła kompot dla dzieci” oraz „Bądź eko, usuwaj odpady, pal oponami” powinny pomóc we wzroście.

Nie można też zapominać o klientach drugiego stopnia, tj. rodzinie i bliskich, którzy pozostają po zmarłym. Mobilna aplikacja pozwalająca na zatrudnienie aktorów w rolach „płaczek”, wybierania im strojów i ról, zatrudnienie blogera do napisania przemowy kaznodziei, nagrobek z NFC pozwalających odhaczyć się rodzinie wraz z tabelą wyników. Mikropłatności za duszę przez BLIK. Streaming dla tych, którzy wyjechali za chlebem do San Francisco.

To wszystko zrodziło się w mojej głowie jako cyniczna obserwacja bezdusznej maszyny, która pożera ludzkie interakcje i nas samych, dlatego też jestem pewien, że ktoś właśnie siada do pisania biznesplanu i wysyła e-maile do znajomych kapitalistów wysokiego ryzyka. Do tej osoby: proszę mi odpalić z 5% żebym mógł dłużej siedzieć w lesie i snuć okropne wizje. Gwarantuje, że mam jeszcze paskudniejsze pomysły, które da się zrealizować.


  1. Ponieważ wróciłem znów w to samo miejsce udało mi się znaleźć trzeci zakład pogrzebowy. Skala przemysłowa. 


Mrygaj, mrygaj mała gwiazdko

Człowiek potrafi się nabawić kompleksów. Bez względu na wiek, dokonania czy stancję w życiu w głębi duszy wiemy, że dookoła są ludzie mądrzejsi, ładniejsi i lepiej poukładani. W mojej prywatnej księdze przewin i uchybień dodałem kilka lat temu paragraf pt. „nawet dzieci teraz robią rzeczy elektroniczne podłączone do Raspberry, a Ty może przeczytałeś kiedyś na Wikipedii opis SPI i tyle”.

Czułem się z tym po dwójnasób źle, że od elektroniki zaczęła się moja przygoda z byciem dziwakiem. Jak zapomnienie pierwszej miłości tak bardzo, że nie możesz przywołać jak miała na imię. I ta nękająca wątpliwość: może jej nigdy nie kochałem? A może nawet nie istniała?

Podczas grzebania na Allegro trafiłem na segment diod LED. Zagooglałem za symbolem i widzę, że ktoś już odwalił za mnie całą robotę i jestem jedno PIP-nięcie od wejścia w posiadanie działającego sterownika. Dziewięć nowych polskich złotych zmieniło ręce. Przyszła paczka. Otwieram. Jedyną dokumentacją załączoną do płytki był paragon fiskalny, a one zwykle niewiele pomagają w podłączaniu elektroniki. No trudno, zalogowałem się na Raspberry, która leży pod moim łóżkiem i powiedziałem poweroff.

Na szczęście dokumentacja biblioteki zawierała instrukcje podłączenia. Pomyliłem się tylko raz, co było spowodowane w większości przez moje grube pazury. Zainstalowałem biblitekę odpowiedzialną za gadanie do MAX7219 i sklonowałem repozytorium żeby mieć katalogów przykładów pod ręką.

I ruszyło! Lecą napisy, pięknie. Polałem sobie drinka żeby dołączyć do setek tysięcy równie uzdolnionych dzieci ze szkół podstawowych. Po krótkiej zabawie stwierdziłem, że przesuwanie tekstów niezbyt mnie cieszy, a nawet wywołuje przykre skojarzenia z <marquee>1 i szyldami reklamowymi. Przy matrycy 8x8 jest to trochę komiczne. Oczywiście będę indywidualnie zapalał piksele. Tylko jak? Wyniki wyszukiwań prowadziły do przykładów, które nie działają już w obecnej wersji. Ale przecież musi być jakiś sposób.

Zerknąłem do kodu źródłowego i oczywiście! Jest metoda display, która przyjmuje monochromatyczny obraz reprezentowany przez PIL.Image. A skoro tak, to mogę przecież od ręki zrobić obrazek i go wstawić.

x = randint(0, 7)
y = randint(0, 7)
image = Image.new("1", (8, 8))
image.putpixel((x, y), 255)

Wcisnąłem to do mojego skrawka kodu i zaświeciły mi się losowo diody. Czułem jak pnę się po drabinie kompetencji. Już widzę jak ze szczytu macha mi Wielki Elektronik. No to teraz trzeba zaprogramować jakieś obrazki. I tu stał się problem. Mam gust, ale nie mam talentu. Bez wątpienia należy ten problem zwalić na kogoś innego.

Napisałem więc „interpretator”, który potrafi zamienić tekst w obrazek i oddałem sprawę mojemu demoscenowemu przyjacielowi, thungowi. On akurat nie miał czasu, ale „narysował” mi ludka.

...**...
..*..*..
...**...
.******.
...**...
..*..*..
..*..*..
........

Prawdziwa sztuka!

Następnego dnia przybyłem na stadion siatkarek ełkaesu godzinę za wcześnie.2 To był dobry czas żeby zrobić z wcześniejszego kodu „format animacji”, tak żebym mógł wyprodukować serię obrazów z jednego pliku. Jak postanowiłem, tak zrobiłem i chwilę przed gwizdkiem sędziny miałem już gotowy prymitywny generator serii obrazków.

Wlazłem znów pod łóżko żeby odpiąć Jeżynę i zniosłem ją na biurko. Stosując metodologię Sir Copy’ego i Lorda Paste nawtykałem jeden kod w drugi.

I stało się. Eppur si muove, parabole tańczą, ludek skacze.

To prawie krępujące chwalić się takimi bzdurami, ale na serio byłem z siebie zadowolony. Nie tylko zabrałem się za coś od razu, ale nawet osiągnąłem wszystko co chciałem i nikt nie musiał nade mną stać i obijać kijem. Pomyślałem: zaskoczę wszystkich jeszcze bardziej jak napiszę notkę. Prawdziwy hat-trick zdziwienia.

Gdy żyjesz życie pełne Logiki Biznesowej, Formatów Wymiany Danych, Garbage In / Kłopoty Out, każda dioda LED świeci jak prywatne słońce, co budzi do życia florę i faunę, która żyje w mojej głowie.


  1. kiedy zagooglacie za <marquee> bo nie jesteście pewni pisowni zwróćcie uwagę, że górny status wyników wyszukiwania przesuwa się w dobrze znany sposób. 

  2. po ekscytującym meczu wygraliśmy 3:1 


Rodzina

Coraz częściej zauważam pełzający wolno, ale nieustępliwie, rozpad podstawowej komórki społecznej, którą jak wiemy jest rodzina. Ale i dalej, wygasającą potrzebę bliskości i czułości. Chińskie z dowozem, zdalna praca, anonimowe ruchaj-randki, a najbliższy kontakt to karta/terminal płatniczy.

I to wszystko jest prawda, ale czy trzeba z tego powodu załamywać ręce i wpadać głową do przodu w okopy konserwatyzmu?

Nie trzeba!

Wśród tysięcy głosów, szepczących wam do ucha słowa pełne lęku, ja niosę wam ukojenie. Narodziła się bowiem nowa forma rodziny, która uniknęła socjologicznej analizy i pierwszej strony prasy kolorowej. Forma rodziny, która może zaspokoić potrzeby wielu.

Zbudowania na zaufaniu i wolnorynkowa, ale też gardząca strukturą i płciami. Nowoczesna, niezbędna, sycąca.

Patrzę z dumą jak w biurach rodzą się nowe rodziny. Tu trzy, tam cztery osoby biorą się pod ramiona i mówią sobie szczerze: weźmiemy pakiety rodziny platformy streamującej seriale. Tam znów, jawnie i z podniesionym czołem, powstaje homoseksualny związek, gdzie chłopak może mieszkać z innym chłopakiem pod jednym dachem Spotify.

Wolna miłość (za niewielką opłatą) wreszcie przybyła.


Demonów okiełznanie

Internet jest jak ogrodzone płotem osiedle. Nowe, błyszczące, praktycznie wszyscy żyją tu na cudzym, a sąsiedzi są anonimowymi wałami do których w najlepszym wypadku czujemy zimną obojętność.

Ktoś non stop donosi też dzielnicowemu o wszystkich małych przewinieniach i szeptanych słowach, a on, zdaje się, zawsze ma kary nieprzystające do ich wagi. Mówią, że tylko dlatego nikt nie szcza na klatkach, co jest ceną wartą płacenia. Zwłaszcza, gdy płacą inni.

Ja? Ja jestem ostatnim rdzennym mieszkańcem tych regionów. A przynajmniej lubię tak o sobie myśleć, bo daje mi to poczucie godności. Jestem pasożytem tego ekosystemu, jedząc z jego śmietników i gdy nikt nie widzi, wygrażając pięścią w kierunku sączącego się z okien światła.

Tyle metafora.

Nienawidzę, gdy strony nie mają kanału wiadomości. Jeszcze bardziej, gdy mają, ale jest zepsuty przez miesiące i nikt nie reaguje na moje ponaglające e-maile donoszące o tej sprawie. Równie niedobrze jest, gdy strona, której zmuszony jestem używać, zakłada, że mój komputer jest identyczny jak ten suto opłacanych rozwijaczy. „U mnie nie tylko działa, u mnie nawet wygląda”, zdają się mi szeptać do ucha.

Ostatnim przykładem jest strona z ramówką w serwisie Eleven Sports. Dwa paski do przewijania, które zwykle wymagają indywidualnego masażu myszką aby ujawnić jakie drużyny kopiące piłkę mogę zobaczyć na żywo tego wieczoru. Każdego dnia czułem się z tym coraz gorzej, aż wreszcie postanowiłem, że zadaniem komputerów jest przetwarzanie informacji.

Napisałem więc mały serwis, który kradnie informacje, przetwarza je i zamienia w format wymiany informacji o kalendarzach.

Klik, klik, klik: Eleven Sports w ICS

Plik kalendarzowy wyświetlony w calcurse

Teraz mogę wreszcie żyć jak człowiek, nie muszę naciskać guzików na domofonie licząc, że ktoś mieszkający na osiedlu mi powie, kto gra.


Trzy kolory: seledynowy

Bywacie czasem nieszczęśliwi? Co wtedy robicie? Pijecie? Palicie? Snujecie się po zaułkach? Programujecie?

Ja robię wszystko powyżej, naraz. W ramach nieustającej akcji „im więcej myślisz, tym bardziej nie chcesz” znalazłem się w momencie, gdzie potrzebowałem dnia ucieczki od zgiełku zwykłego dnia. Zamiast iść do biura poszedłem zwiedzać, a podczas zwiedzania wpadł mi do głowy pomysł na zajęcie umysłu. Na Twitterze jest sobie taki bot, który produkuje — zabawnie nazywane — palety kolorów. Nazywa się toto colorschemer.

Oto przykład:

schemer

Myślę sobie: a gdyby napisał bota, który potrafi wyekstrahować kolory z załączanych na Twitterze obrazków tym samym doprowadzając do SKYNET-u? Mógłbym generować z nich arkusze stylów z deklaracjami, palety do GIMP-a, czy to tam.

Brzmi jak marnowanie czasu!

Konsumujemy

Zanim zaczniemy naszą podróż po obrazku musimy zamienić plik znajdujący się na dysku w kupkę informacji. Dla Pythona dostępna jest biblioteka Pillow zawierająca w sobie wszystkie potrzebne funkcje. Użyjemy jej aby uzyskać piksele, kolory oraz rozmiar obrazka.

Na boku Bardziej zaawansowani czytelnicy mogą się skrzywić, że piszę funkcje zawierające tylko return — normalnie używam takich funkcji aby ułatwić sobie odpluskwianie i obsługę błędów. W tym przykładzie nie chcę dodatkowo zaciemniać, więc pozostawiłem tak, jak jest, no i funkcje mają bardziej zrozumiałe nazwy niż oryginalne metody.

def load_image(filename: str):
    return Image.open(filename)

def get_pixels(image: Image):
    return image.load()

def get_bounds(image: Image):
    return image.getbbox()

I tak, w kolejności: load_image wczytuje obrazek z dysku, get_pixels zwraca piksele na których możemy dokonywać analizy, get_bounds zwraca cztery wartości, które określają obszar zajmowany przez obraz.

Kolory na ekranie

Ekran komputera możemy reprezentować jako dwuwymiarową płaszczyznę której każdy punkt reprezentuje para wartości X i Y. X odpowiada za oś lewo-prawo, a Y, odpowiednia góra-dół. Pozycje zaczynamy liczyć od lewa w prawo i od góry w dół. To znaczy, że miara koordynat (0, 0) to piksel znajdujący się w górnym, lewym rogu.

Jeśli obraz ma rozdzielczość 1980x1080 to jego prawy dolny róg znajduje się na (1979, 1079) gdyż liczymy od zera.

Pod każdym z tych punktów kryje się święta trójca, Zielony, Czerwony i Niebieski, składowe kolorów w systemie RBG.

Kolory w RBG są reprezentowane przez bajt, który to bajt może przechowywać wartości numeryczne od 0 do 255. Czyli jeden piksel to trzy bajty informacji przybite do jakiejś pozycji na ekranie. Gdybyśmy chcieli sobie wyobrazić bardzo mały kwadrat, który ma bok składający się z dwóch pikseli, to moglibyśmy zapisać te dane w następujący sposób:

square = (
             (255, 0, 0), (0, 255, 0),
             (0, 0, 255), (128, 128, 128)
     )

Kolory RBG

Skoro wiemy w jaki sposób otrzymamy dane, zobaczmy, z czym nam przyjdzie pracować.

Pierwszy krok: w którą stronę ciąć

Przykładowy obrazków

Wszystkie obrazki zamieszczane na koncie przychodzą w dwóch formatach. Kolory są ułożone góra/dół lub lewo/prawo. Wykrycie typu obrazka będzie naszym pierwszym zadaniem. Utworzymy sobie typ wyliczeniowy (enum) żeby było nam łatwiej czytać kod.

Nazwałem mój enum Gravity, bo wydawało mi się, że to dobra, wiele mówiąca nazwa. „W którą stronę «spadają» kolory. Kiedy usiadłem do tego tekstu stało się oczywiste, że dużo lepszą nazwą byłoby Orientation. Udowodniłem tym samym teorię, że nazywanie rzeczy w programowaniu jest sztuką trudną.

class Gravity(Enum):
    VERTICAL = 0
    HORIZONTAL = 1

Zastanówmy się, jak wykryć, czy powinniśmy badać kolory idąc z góry w dół, czy też idąc z lewa w prawo.

Jeśli weźmiemy piksel znajdujący się pod koordynatami (0, 0), a potem weźmiemy piksel znajdujący się w przeciwległym rogu (0, szerokość obrazka) to jeśli są one takie same, znaczy, że układ obrazka jest góra/dół, bo cała pierwsza linia jest jednego koloru! Proste! W przeciwnym przypadku obrazek zorientowany jest lewo/prawo, gdyż wiemy, że kolor w lewym rogu jest inny niż ten w prawym.

Jak wykryć kierunek

Zrobimy z tego funkcję, która zwróci nam typ „grawitacji”.

def detect_gravity(pixels, bounds):
    max_width  = bounds[2]
    max_height = bounds[3]

    top_left_corner = pixels[0, 0]

    top_right_corner = pixels[0, max_width - 1]
    bottom_left_corner = pixels[0, max_height - 1]

    if top_left_corner == top_right_corner:
        return Gravity.HORIZONTAL
    return Gravity.VERTICAL

Wszystkie te kolory

OK, wiemy już jakiego typu obrazek wczytaliśmy. Teraz naszym zadaniem jest wybranie unikalnych kolorów. Zrobimy to idąc po linii i zapisując znalezione kolory. Powinno być całkiem prosto, wystarczy wybrać kierunek, zwiększać licznik o jeden i zapisywać do tablicy rezultatów unikalne wartości RGB.

Zerknijmy na kod.

def extract_distinct_colors(pixels, gravity, bounds):

    idx = 0

    if gravity == Gravity.VERTICAL:
        max_travel = bounds[3]
    else:
        max_travel  = bounds[2]

    distinct_colors = []

    while idx < max_travel:
        if gravity == Gravity.VERTICAL:
            pixel = pixels[0, idx]
        else:
            pixel = pixels[idx, 0]
        idx += 1
        if pixel not in distinct_colors:
            distinct_colors.append(pixel)
    return distinct_colors

Ustawiamy indeks idx na zero, ustawiamy rozmiar boku, którym będziemy podróżowali zależnie od «grawitacji», tworzymy pustą tablicę na rezultaty. Następnie kręcimy się aż do wyczerpania boku i sprawdzamy, czy właśnie odnaleziony piksel (dokładniej, trójca jego kolorów) jest już w distinct_colors, jeśli nie ma, dodajemy. Po zakończeniu operacji zwracamy zawartość tablicy.

Odpaliłem kod i wszystko działało, może nawet za dobrze, bo otrzymałem piętnaście kolorów, gdy spodziewałem się trzech. Dałem się nabrać swoim starym oczom, ale też udało mi się zapomnieć o faktach dotyczących obrazków w Internecie: kompresji. Jeśli popatrzymy na ofiarę naszej inspecji będziemy jasno widzieć (dosłownie) trudne do wyodrębnienia wahania w kolorze. Wahania, które ten naiwny kod, który szuka tylko unikalności, dokłada do listy. I dobrze robi, bo są to unikalne kolory, ale nie to chcieliśmy uzyskać.

Wiele kolorów w jednym pasku

Co teraz? Podglądanie obrazka pod lupą upewniło mnie, że te przekłamania w kolorze występują w niewielu miejscach, głównie tam, gdzie spotykają się dwa różne kolory. Rozsądnym sposobem byłoby liczenie ilości wystąpień. To pozwoli nam odrzucić sieroty po kompresji. Zmodyfikowałem więc kod w następujący sposób: dodałem occurance_counter, który zawiera liczniki wystąpień danego koloru. W bloku try…except sprawdzam w jakim miejscu w liście znajduje się obecnie odkryty kolor, a jeśli się nie znajduje (co podniesie wyjątek ValueError na metodzie .index()) znaczy, że widzimy go pierwszy raz. Tym razem z funkcji zwracamy dwie wartości: listę kolorów oraz ich liczniki.

def extract_distinct_colors(pixels, gravity, bounds):

    idx = 0

    if gravity == Gravity.VERTICAL:
        max_travel = bounds[3]
    else:
        max_travel  = bounds[2]

    distinct_colors = []
    occurance_counter = {}

    while idx < max_travel:
        if gravity == Gravity.VERTICAL:
            pixel = pixels[0, idx]
        else:
            pixel = pixels[idx, 0]
        idx += 1

        try:
            found_at_index = distinct_colors.index(pixel)
            occurance_counter[ found_at_index ] = occurance_counter[ found_at_index ] + 1
        except ValueError as e:
            distinct_colors.append(pixel)
            occurance_counter [ distinct_colors.index(pixel) ] = 1
    return (distinct_colors, occurance_counter)

Teraz muszę dodać tylko funkcję, która użyje obu tych informacji i zwróci mi n najczęściej występujących kolorów. Muszę przyznać, że byłem tu już trochę zmęczony, siedziałem na ławce w ciemnym parku, offline, paląc papierosy. Dlatego funkcja filter_top_entries nie jest może najbardziej przyjazna dla oczu początkujących, dlatego rozłożę ją może na czynniki pierwsze.

def filter_top_entries(count, distinct_colors, occurance_counter):
    filtered = sorted(occurance_counter.items(), key=lambda x: x[1], reverse=True)[0:count]
    return [distinct_colors[ x[0] ] for x in filtered]

Pierwszym paraemetrem jest liczba elementów, które chcemy uzyskać, dwa pozostałe to produkt extract_distinct_colors.

occurance_counter zawiera dane w następującym formacie:

    {
      '0': 12,
      '4': 1,
      '2': 34,
      []
    }

Indeksem w tym słowniku jest pozycja koloru w distinct_colors, a jego wartością jest liczba wystąpień. W Pythonie słownik posiada metodę .items(), która zwraca pary elementów, czyli gdybyśmy użyli jej na tym przykładowym kodzie, otrzymalibyśmy ( ('0', 12), ('4', 1), ('2', 34)). To właśnie przekazujemy do sortowania. Ale sorted() nie wie jak posortować dwuelementową listę. Dlatego też w parametrze key podajemy kawałek kodu, który wskaże jaki element z tej listy jest parametrem, który nalezy posortować. Pod indeksem 0 znajduje się pozycja koloru, pod indeksem 1 znajduje się liczba wystąpień. x: x[1] znaczy „do sortowania użyj ilości wystąpień, które znajdziesz w liście na pozycji pierwszej.

Ponieważ sorted() domyślnie sortuje od najmniejszej do największej musimy też poprosić o odwrócenie tego zachowania, gdyż szukamy najczęściej występujących kolorów. Do tego właśnie służy parametr reversed=True.

Produktem sorted() jest lista, więc możemy na niej użyć pythonowej składni do przycinania list, w tym wypadku [0:count] zwróci nam tylko fragment posortowanej listy do ilości podanej w pierwszym parametrze.

I to jest pierwsza linia. ;-)

Python posiada wygodną składnię do „kompresowania” wyrażeń normalnie zamykanych w for, to właśnie robi druga linia. Można ją przeczytać „dla każdego elementu w filtered, które uzyskaliśmy z sorted() weź element pod indeksem zero, który jest indeksem koloru na liście «unikalności» i zwróć to wszystko jako tablicę”

Alternatywnie możnaby to zapisać jako:

results = []
for x in filtered:
    results.append(distinct_colors[ x[0] ])

I już! Teraz powinniśmy mieć możliwość uzyskania trzech najważniejszych kolorów!

Składanie tego wszystkiego do kupy

Teraz możemy przetestować wszystko razem. Normalnie nie pisze się kodu testującego bezpośrednio w bibliotece, ale… wiecie, jak to jest. Zrobiłem sobie listę obrazków skradzionych z Twittera, wsadziłem je do listy i dla każdej z nich wywołałem wszystkie, dyskutowane wcześniej, funkcje.

Dopisałem jeszcze to_hex_expression, które zamienia RGB w znany nam dobrze format heksadecymalny używany w programach graficznych oraz CSS.

test_cases = [
    'test-cases/Dk82gZuVsAAcGho.jpg',
    'test-cases/Dk666IVUUAALxRx.jpg',
    'test-cases/Dk7kG4qU0AAJ5RL.jpg',
    'test-cases/Dk8oxdUVAAY6-JY.jpg',
    'test-cases/Dk9EPPVV4AA0obD.jpg',

]

from writers import to_hex_expression

for test in test_cases:
    print()
    image = load_image(test)

    bounds = get_bounds(image)
    pixels = get_pixels(image)

    gravity = detect_gravity(pixels, bounds)

    distinct_colors, occurance_counter = extract_distinct_colors(pixels, gravity, bounds)
    colors = filter_top_entries(3, distinct_colors, occurance_counter)
    for color in colors:
        print(to_hex_expression(color))

A oto rezultat:

test-cases/Dk82gZuVsAAcGho.jpg Gravity.VERTICAL
#446bae
#a10499
#35530b

test-cases/Dk666IVUUAALxRx.jpg Gravity.HORIZONTAL
#fcf779
#77ab56
#1fa874

test-cases/Dk7kG4qU0AAJ5RL.jpg Gravity.VERTICAL
#9eff00
#ff5c01
#cc406f

test-cases/Dk8oxdUVAAY6-JY.jpg Gravity.HORIZONTAL
#7f8f4e
#aca588
#ff6bb5

test-cases/Dk9EPPVV4AA0obD.jpg Gravity.VERTICAL
#24ff29
#1fb47a
#4a5d98

Trzy kolory „wyssane” z obrazka. Pełen sukces, dzień zmarnowany, wszyscy są szczęśliwi. Niestety, nie dotarłem do momentu w którym nauczyłbym kod łażenia „osobiście” na Twitter i podkradania obrazków, gdyż skończył się mi dzień.

Jeśli ktoś z czytelników uważa, że jest sens napisać drugą cześć, gdzie wpadlibyśmy grabić via API to można mi zostawić e-mail.

Przepraszam też jeśli ten tekst był zbyt chaotyczny i/lub bezużyteczny. Próbuję pobić prokrastynację przez brute force. Repozytorium z kodem jest dostepne na bitbucket, bronikowski/kaleidoscope.


Palec w oko

Homo erectus, homo sapiens, homo vatis1. Człowiek, co powstał z kolan, pomyślał po to, by opowiadać historie z dużego i małego „ha”. Człowiek z natury chce się wygadać, a czasem nawet chce być wysłuchany, ale głównie gadać.

Opowiadanie historii demokratyzowało się przez cały nasz czas na tej planecie. Od garstki liderów religii tłumaczących początek świata i bogów, aż po miliony użytkowników sieci społecznościowych z których wielu tłumaczy, jak świat się skończy i kto (zwykle „Oni”) się do tego przyczyni.

Gdzieś pomiędzy teraz a wtedy istniał świat w którym dostęp do technologii był ograniczony, ale ludzie nadal chcieli gadać. Był to świat w którym komputery osobiste były nadal zabawkami, a obliczeniowych mięśni dostarczały systemy UNIX-owe, popularne głównie w instytucjach naukowych, militarnych i uniwersytetach.

Każdy pracownik i student posiadał swoje konto, które było centrum cyfrowego życia. To tu przychodziły e-maile, tu kompilowało się oprogramowanie, tu odpalało aplikacje. Nic dziwnego, że katalogi użytkowników znajdowały się na partycji nazywanej tradycyjnie /home, był to prawdziwy dom dla e-bytów.

Ktoś w 1977 wpadł na pomysł protokołu, który pozwalałby „zapytać” systemu o fakty dotyczące danego użytkownika. Kiedy ostatnio był zalogowany, a jeśli jest, jak dawno dotknął klawiszy, jaki jest najnowszy e-mail czekający nań w skrzynce, kiedy ostatnio czytał pocztę, jak się nazywa i kilka innych, zbytecznych rzeczy.

Protokół ten został nazwany finger.

Informacje uzyskane tą drogą wydają się być trochę dziwne, ale jeśli weźmiemy pod uwagę, że „wsadzało się palec” w konto kolegi lub koleżanki z pracy/studiów, wiedza o tym, czy są przy terminalu i czy czytali już pocztę od czasu, gdy wysłaliście e-maila jest całkiem użyteczna.

Finger działał też w Internecie, gdy ten stał się faktem, człowiek mógł dla własnej frajdy dziabać paluchem znanych ludzi. No, znanych ludzi, którzy mieli konta na maszynach UNIX-owych, choć nie wiem, kto chciałby znać innych.

Co to ma jednak wspólnego z moim wstępem o potrzebie wygadania się? Finger czytał też dwa pliki z katalogu domowego użytkownika: .project i .plan.

W zamyśle miało to pomóc w organizacji pracy, gdzie .project opisywałby nasze długoterminowe działania, a .plan byłby zdaniem odpowiadającym na pytanie „co dziś robisz?”.

Niektórzy ludzie używali tych dwóch plików zgodnie z przeznaczeniem, związani obowiązkiem służbowym lub kompletnym brakiem poczucia humoru. Inni wsadzali do .planu tyrady o jedzeniu na stołówce, żarty, cytaty z książek, matematyczne dowody o wyższości Star Treka nad Star Wars i wszystko, co przyszło im do głowy.

Homo vatis1 nie zrodziło się wraz z erą Facebookiem, MySpace czy Twittera. Jeśli dacie ludziom możliwość napisania zdania, to znajdą się natychmiast ludzie piszący zdania ważne, zabawne i irytujące. Oraz ich czytelnicy.

W latach dziewięćdziesiątych finger został uznany przez większość administratorów za daemon niebezpieczny: program uruchamiany zewnętrznie, przez Internet, który czyta prywatne pliki z katalogu domowego użytkownika, czasem z podwyższonym dostępem to źródło potencjalnego bólu głowy.

Jeden z pierwszych robali używających Internetu do rozprzestrzeniania się, Morris, używał dziury znajdującej się w implementacji protokołu.

Tym samym popularność .plan spadła niemal natychmiast do zera. Ludzie jednak nie przestali opowiadać historii, zmieniły się tylko platformy i media, od rylca do glinianych tablic po pióra wieczne, od .plan do mediów społecznościowych. Nikt nie zamknie nam ust póki jest miejsce gdzie można napisać zdanie, szalet miejski jest na to dowodem ostatecznym.

* * *

W Internecie ciężko znaleźć jakieś archiwa wpisów do .plan, jego natura była bardzo efemeryczna. Jedyne popularne archiwum to .plan Johna Carmacka, autora wolf3d.exe i quake.exe.


  1. człowiek bard w kłamczo-łacinie 


Wolniej

Wiek średni to taki okres w życiu człowieka, gdy mimowolnie staje się „kołczem rozwoju osobistego” zaskarbiając sobie nienawiść wśród ludzi bliskich i przygodnych. Wszystkie błędy popełnione w życiu przepasuje czerwoną wstążką i obnosi je jak relikwie nie potrafiąc rozpoznać, że nie ma w nich nic wyjątkowego ani odkrywczego.

Uprawomocniony wchodzeniem w ostatni zakręt — już mocno przedłużonej — młodości, chciałbym Wam powiedzieć coś o uczeniu się. Jest to podwójnie skandaliczne, gdyż mury szkoły widziałem tylko od strony szarego tynku, gdy odbijałem odeń piłkę.

Struktura społeczeństwa zmieniła się już nie raz. Tak jak kiedyś chudy i spalony słońcem był z pewnością chłopem, którego jedynym dorobkiem jest garb tak bladaporcelanowa i pulchna była Hrabina. I gdy nawiniemy taśmę czasu w nasze okolice, sygnały statusu odwróciły się.

To samo stało się z „wolnym czasem”, choć w ogóle rzecz taka jak „wolny czas” w naszym rozumieniu jest produktem zupełnie nowym na rynku kultury. Kiedyś człowiek, co mógł się wyciągnąć na tapczanie i tak po prostu leżeć i wypierdywać dziury w materiale, był królem życia. Dziś kto nie uprawia wspinaczki i garncarstwa, najlepiej za jednym zamachem, jest prostakiem po stokroć. Wolny czas należy wypełnić zajęciami tak szczelnie żeby narastało w człowieku marzenie o rozwinięciu talentu do wypróżniania się w biegu, jak to czynią konie, między galopem od jednej aktywności do drugiej.

Są tylko dwie ważne rzeczy w uczeniu się nowych zdolności. Jak drogi jest sprzęt zakupiony do uprawiania hobby i jakiej klasy ludzie widzą Cię podczas go uprawiania. Kpię oczywiście.

Pierwszą rzeczą, o dziwno często pomijaną podczas skoku w nowe zajęcie, jest fakt, że trzeba te hobby na serio uprawiać. Mam pełen strój bramkarski, ale boisko widziałem pewnie 10 lat temu, nie wypada mi się nazywać „bramkarzem”, nawet „były bramkarz” brzmi głupio, jak „byłe dziecko”.

Jestem zwolennikiem pozytywistyczno-praktycznej definicji. Piszesz? Jesteś pisarzem. Nie piszesz? Nie jesteś. Biegasz? Jesteś biegaczem. Nie biegasz, nie jesteś. I może nie jesteś najszybszym biegaczem albo najbłyskotliwszym pisarzem. To jednak ocena wartości, a świat nosi wielu twórców, którzy są lepsi ode mnie, a nie naplułbym im na łeb, gdyby się palili. To wszystko są truizmy, ale bardzo łatwo się je zapomina, czasem nawet z premedytacją, gdy podczas wiosennego sprzątania przekładasz notatnik Moleskine z jedną zapisaną stroną (zakupy), buty do biegania i gitarę z zerwaną struną.

To prawda pierwsza: jeśli chcesz mieć jakąś przyjemność z uczenia się nowej rzeczy musisz ją uprawiać. Bardzo łatwo odstawiać teatr i grać przed sobą komedię. Ale nikt się nie śmieje, bo nikt tego nie ogląda.

Prawda druga: czym wolniej się uczysz tym większa szansa, że się nie poddasz.

W świecie zoptymalizowanym pod natychmiastową gratyfikację ciężko jest się przestawić na żmudną drogę. Jakby Jezusowi powiedzieć: „będziesz cierpiał, ale jaka to historia z tego wyjdzie”. Dlatego współczesnych synów bożych separuje się od zdrowego społeczeństwa w zakładach psychiatrycznych, komu by pasowała taka opcja!

Od miesięcy próbowałem nauczyć się Rusta. I moja droga zawsze przebiegała tak samo. Pobieżnie skonsumowany wstęp w dokumentacji. Kompilacja println!("Twoja stara");. Próba napisania czegoś. Frustracja. Porzucenie nauki na miesiące. GO TO 10.

Kilka dni temu postanowiłem, że przestanę skakać z jednego miejsca dokumentacji w drugie, próbując zmusić kompilator do respektowania mojego autorytetu wieloletniego programisty.

Godzina po godzinie, tworzyłem sobie katalog z nazwą jakiegoś elementu języka np. 03.array, 04.struct, 05.enum i mozolnie, pokornie, przepisywałem przykłady, modyfikowałem je, wymyślałem inne, testowałem hipotezy. Czasami aż mnie szczypało w dupę, że muszę znów pisać kod, który „wypisuje wszystkie elementy z tablicy wraz z ich indeksem”. I kiedy wreszcie zesztywniał mi kark okazało się, że podczas tych zupełnie głupich zajęć nie tylko załapałem idee, których opisy czytałem wcześniej na wyrywki, byłem też wewnętrznie zadowolony mimo że nie stworzyłem niczego oczywistego.

Teraz myślę do siebie, że „wolno” to może złe słowo, lepszym byłoby „metodycznie”, ale dychotomia „wolno” ↔ „szybko” brzmi mi lepiej niż „metodycznie” ↔ „chaotycznie”.

„Szybkość” to to, co marketingowcy umieszczają w dużym czerwonym kółku w nadziei, że odmieni Ci się to w głowie na „wygodę”. I w pewnym sensie jest to prawda. Ludzie spędzili wiele lat budując świat w którym 20% dostępnej wiedzy pozwala wykonać 80% zadań z zadowalającym skutkiem.

Dlatego dobicie do 21% spowoduje, że pobijesz większość. Dlaczego? Bo wolno.


Nazwa pliku jako UX

Ze wszystkich mądrych rzeczy, które powiedziałem i napisałem przez lata, tak o życiu, jak i o programowaniu, szczególne miejsce w moim sercu ma ta obserwacja:

Bardzo łatwo rozpoznać interface projektowany przez programistę: „godzina i piętnaście minut” jest wyrażone jako 1.25

Ta obserwacja była formą samokrytyki, gdyż podczas prowadzenia dema zauważyłem, że sam wykonałem takiego „międzymordziowego bazyliszka”. Od tego czasu, aż do teraz, oddałem wszystkie prace związane z tworzeniem interakcji ludziom, którzy się na tym znają. A przynajmniej powinni.

Zaszyłem się więc w ciemnej norze backendu, gdzie użytkownicy istnieją tylko jako miraże, tworzone i niszczone na potrzeby automatycznych testów. Bez historii, bez potrzeb, nie wysyłają świątecznych kartek. Perfekcyjna harmonia.

Ostatni projekt zmusił mnie jednak do opuszczenia mojej kryjówki, gdyż przypadła mi kluczowa rola, a że i projekt przypadł mi do gustu, byłem całkiem zadowolony i dałem nura.

Jednym z produktów systemu, który pisałem, były dokumenty do druku, gdyż część z naszych użytkowników jest cyfrowo wykluczona i nie chcemy aby potrzeba posiadania komputera z dostępem do Internetu była barierą. Ponieważ jedna osoba może mieć maksymalnie sto takich dokumentów, wymyśliłem i przeforsowałem zmianę. Dokumenty można scalać w pojedynczą grupę dokument, będący dla systemu równoważnikiem. Każdy dokument zawiera numer seryjny oraz sygnaturę kryptograficzną, dlatego zbudowanie takiej paczki jest całkiem proste i pozwala na łatwą weryfikację spójności.

Przepchnąłem ten pomysł zaczynając od współpracowników, przez kierownika projektu ze strony klienta, kończąc na akceptacji urzędu marszałkowskiego. Kiedy dostałem glejt z pieczęcią „no dobra, rób” usiadłem i zaprogramowałem.

Wszyscy żyli szczęśliwie kilka miesięcy, aż do momentu w którym Panie z rozliczeń zaczęły zwracać uwagę na rosnącą liczbę pomyłek przy zdawaniu paczek dokumentów. Bardzo dziwne, bardzo dziwne. Zalogowałem się jako użytkownik i poszedłem oglądać.

I wtedy zrozumiałem, że znów mam 1.25 jak w cytacie wyżej.

Dla własnej wygody trzymam paczkę jako SHA512 robiący za sumę kontrolną. To oczywiste, że tak robię. Kiedy piszę automatyczny test mogę od razu stwierdzić, czy dokument zapisany na dysku zgadza się z tym, czego się spodziewałem.

Dla mnie SHA512 jest oczywiste. Dla użytkownika natomiast otrzymanie pliku 4143aaf85e1a825463a8a202b9ee6ffa486[…]9a5edc944e3e473f89a889c85e093abe7adce5164dfefef0f3eded1e.pdf niesie bardzo niewiele informacji. W sytuacji, gdy mamy jedną paczkę problem rozwiązuje się naturalnie. Gdy użytkownik ma tych plików 12, heksadecymalny jazgot jest nie do przetrawienia.

Pracownik za kwadrans do fajrantu nie ma już mocy na sprawdzanie każdego dokumentu. A to rodzi błędy.

Dodałem więc nagłówek Content-Disposition: attachment; filename="%s_%s_%d" i sformatowałem nazwę pliku używając imienia, nazwiska i liczby dokumentów w paczce. Jan_Kowalski_15.pdf jest trudniej źle zinterpretować.

Od tego czasu liczba błędów spadła do zera.

Jedna linijka, a taka różnica. Nie wiem, czy być dumny z tej, szybkiej, reakcji czy też zawstydzony, że nadal mentalnie siedzę w backendowej jaskini.


Za kwadrans wiosna

Otworzyłem okno. Mimo ostrzeżeń o zanieczyszczeniu powietrza podjąłem decyzję, że lepszy jest dym płonących opon unoszący się z kominów łódzkich slumsów niż moja własna tytoniowa wędzarnia. Przez szparę wlał się chłód będący idealnym towarem zastępczym świeżości.

Usiadłem na fotelu i patrzyłem się tak w okno. Laptopa zostawiłem w biurze żeby się odtruć, widocznie nawyku patrzenia się w okna z tępym wyrazem na twarzy nie da się wyzbyć w jeden dzień odwyku. Kontemplowałem wszechświat, ale bardzo krótko, bojąc się że przez przypadek coś odkryję i będę musiał temu stawić czoło.

Zabrałem się za odpisywanie na listy i okłamywanie się, że nie jest mi zimno z powodu tego okna. Jak ludy prymitywne wierzyłem, że moje przekonanie o komforcie udzieli się, zwykle nie zważającym na byt ludzki, sferom niebieskim. I że będzie wiosna.

Po trzech godzinach, gdy wiosna się nie zjawiła, a w jej miejsce przyszła noc, musiałem uznać przewagę materii nad umysłem. Zamknąłem okno. Zapaliłem papierosa żeby nie dać się tej nowo nabytej świeżości zbyt łatwo.

I wtedy usłyszałem to leniwe, monotoniczne bzyczenie.

Tłusta mucha, pobudzona jak i ja, tą pierwszą obietnicą wiosny, podniosła swój zielony brzuch i zaczęła latać mi nad łbem.

Ja pisałem do paryżanki o chińskim atramencie, a ona przerywała mi co zdanie.

Zdałem sobie sprawę, że sam doprowadziłem do tej sytuacji. Nie przez otwieranie okna, nie. Widzicie, to wszystko przez technologię. 15 lat temu zwinąłbym w rulon gazetę i postawił się w roli sędziego, oskarżyciela i kata w jednej osobie. Po krótkiej gonitwie zgniótłbym ją na jakiejś płaszczyźnie i wydał z siebie pomruk zadowolenia; prymat homo sapiens zostałby zachowany.

Po upadku prasy papierowej mógłbym jej najwyżej przyjebać tabletem.

W sumie i tak nic na nim nie czytam.


Umówiłem się z nią na @833

Internet od zawsze był przestrzenią przyjazną eksperymentom i wynalazczości. I zgodnie z nazwą mojej ulubionej kolumny w „Młodym Techniku” — „Pomysły genialne, zwariowane i takie sobie”1 niektóre przetrwały nie tylko próbę czasu, ale stały się budulcem współczesnego świata. Inne wypadły z rąk twórców i z hukiem roztrzaskały się na betonowej posadzce rzeczywistości.

Pomysł, o którym chciałem Wam dziś opowiedzieć, tańczy na granicy tych trzech przymiotników. No, chyba, że będziemy patrzeć z punktu widzenia przyjęcia rozwiązania na rynku, wtedy nawet „takie sobie” to raczej laurka niż opis stanu faktycznego. Popatrzmy na niego oczami cyber-futurystów roku pańskiego 1998, kiedy Internet miał już pierwszy zarost.

Najważniejszym zadaniem sieci było połączyć nas wszystkich i stworzyć Globalną Wioskę, gdzie wektory wiedzy, różnorodności i zaradności dodadzą się rodząc sytuację, w której co drugi obywatel będzie Królem Filozofem. Dziś z perspektywy czasu widać, że idea wioski się spełniła: kumoterstwo, plotkarstwo i disko polo ma się dobrze.

Zostawmy jednak cynizm.

Kiedy zaczęliśmy pracować w globalnej wiosce okazało się, że wszyscy tyrają w systemie trójzmianowym. Idziesz do piekarza, a on śpi, gdyż jest na innym kontynencie, choć metaforycznie, na wyciągnięcie e-ręki. Strefy czasowe podstawiły nogę rozpędzającej się, globalnej, ekonomii. Próba umówienia się z kimś wymagała powtórki z geografii, ustalenia stref czasowych wszystkich uczestników, oraz tego, czy używają obecnie czasu letniego czy zimowego.

Swatch wpadł na pomysł jak rozwiązać ten nowy — na tę skalę — problem, sprzedając przy okazji niezłą górę zegarków. Swatch Internet Time!

Francja, po rewolucji, wprowadziła czas decymalny, oparty na 10 godzinach, które składały się z 100 minut po 100 sekund. Jako że ciężko się patentuje rozwiązania, które są jasno opisane w podręcznikach do historii, Swatch dokonał lekkiej modyfikacji: doba składała się z 1000 .beat, nie posiadały one strefy czasowej, więc były uniwersalne dla świata. Wystarczało, że umówisz się z nią na @833, weźmiesz od szefa akonto i wszyscy będą wiedzieć, kiedy to jest! Proste!

Oczywiście to nie zmieniło niczego w fakcie, że podróżujemy dookoła kuli plazmy i ludzie nadal śpią gdzieś kiedy zegarek Swatcha „wybija” @833.

Ja jednak byłem urzeczony pomysłem i choć nie miałem kontaktów z nikim, kto potrzebowałby się ze mną umówić w różnych strefach czasowych, dumnie włączyłem renderowanie ilości .beat na belce systemowej mojej Amigi. Próbowałem nawet nieśmiało podawać tak sformatowaną godzinę różnym znerdziałym znajomym, ale oni patrzyli tylko na mnie jak na dziwaka. Dwadzieścia lat później sytuacja nie uległa zmianie w tej kwestii.

Swatch nie był zadowolony z tego, że ich wynalazek jest tak beztrosko implementowany przez różnych obszarpańców, co pewnie nie mają zegarka ni garnituru i zrobił to, co każde lajfstajlowe korpo, zaczął ścigać „nielegalne dzielenie”, aż do momentu w którym nikt nie chciał się w to bawić. Trudno wymagać żeby każdy, z kim się umawiasz, miał zegarek tego samego producenta.

Dodatkowo Swatch, chcąc zapewne podbić wartość swojego wynalazku, wprowadził swoją własną strefę czasową, Biel/Switzerland, od której liczony był czas bazowy dla Internet Time.

Ktoś mógłby zapytać, czy jest jakaś merytoryczna różnica między umawianiem się na godzinę wg. UTC a tym oto wynalazkiem? Jest jedna, oczywista. Godzina z prefiksem @ jest bardziej e-cyber.

I tak pomysł genialny, bo stymulował fantazję o Jednym Świecie, zwariowany, bo ciężko wyobrazić sobie coś tak radykalnie dobrego żeby cały świat entuzjastycznie przytaknął, ale też taki sobie, bo w przeciwieństwie do innych zdobyczy epoki internetowej nie dane mu było oderwać się od cyca korpowładców.

A piszę o tym dlatego, że wracając wczoraj, lekko intelektualnie zmęczony imprezą, przypomniałem sobie o tym moim zegarku na belce Amigi i wymyśliłem, że dopiszę sobie to samo, tylko jako element belki tmuxa. Sama procedura jest trywialna.

  1. Weź obecną godzinę
  2. Policz ile sekund minęło od północy
  3. Ponieważ w 24h jest 86400 sekund, a chcemy 1000 jednostek, dzielimy to przez 86.4 i odrzucamy resztę
  4. Dzwoniący telefon to prawnicy szwajcarskich zegarmistrzów
  5. No division is illegal, hack the planet

Natychmiast po napisaniu kodu zdałem sobie sprawę, że jestem o godzinę za daleko. Jasne, muszę przekręcić datę na ich strefę czasową. Programowanie z uwzględnieniem stref czasowych przechodzi atrofię za każdym razem, gdy przestaję o nim myśleć. Poszedłem więc czytać dokumentację, ale za nic na świecie nie mogłem się dobrać do, nieoficjalnej przecież, strefy czasowej Swatcha.

Rzutem na taśmę odkryłem, że jest on równoważny UTC+1, dodałem więc brzydką arytmetykę na datach. Jestem pewien, że zrobiłem coś źle. Apple dwa lata wydawało iOS z błędem, który przestawiał budziki użytkownikom, a Microsoft miał firmware w Zune, które spowodowało, że jeden dzień nie dało się włączyć odtwarzacza. Skoro oni nie wiedzą, co robią, to ja też sobie pozwolę.

Efekt działania na terminalu:

Zrzut z ekranu pokazujący program w działaniu

#!/usr/bin/env python3
from datetime import datetime, timedelta
import pytz
import sys

def swatch_time(datetime_object = None, timezone_literal = 'Europe/Warsaw'):

    reset_clock = {
            'hour': 0,
            'minute': 0,
            'second': 0,
            'microsecond': 0
    }

    if not datetime_object:
        datetime_object = datetime.now()

    if not datetime_object.tzinfo:
        timezone = pytz.timezone(timezone_literal)
        datetime_object = timezone.localize(datetime_object)

    # Biel TZ is a unrecognized TZ that can be expressed as UTC+1
    # Thanks, Swatch
    swatch_timezone = pytz.timezone('UTC')
    datetime_object = datetime_object.astimezone(swatch_timezone) + timedelta(hours=1)

    midnight = datetime_object.replace(**reset_clock)
    time_delta = datetime_object - midnight

    if time_delta.seconds == 0:
        # don't divide against zero
        return 0

    return int(time_delta.seconds / 86.4)

if __name__ == "__main__":
    print("@{}".format(swatch_time()))
  1. Dział ten nazywałem też „Nygusem”, gdyż numery z lat 80-tych miały pana leżącego niedbale dookoła liter loga, standardowym zawołaniem bojowym w weekendy było „Babcia, poczytaj mi «Nygusa»”.

Opóźniona gratyfikacja

Ze wszystkich rzeczy, które najbardziej oczarowały mnie w tym całym komputerowym bajzlu, musiałbym wymienić automatyzację na pierwszym miejscu.

Mimo płynących lat nadal odnajduję okruchy magii w tym, że komputer, raz nauczony, potrafi powtarzać rzeczy bez czujnego oka operatora. Kiedy otrzymałem swoje pierwsze konto z dostępem do powłoki, napisałem na szybko dwa skrypty, które wysyłały e-maile na specjalny adres, przesyłający informację dalej na telefon komórkowy via SMS. Pierwszy informował mnie o loginach na mój shell. Siadałem do terminala, logowałem się i… pik! Drugi śledził mój /var/spool/mail/opi i przysyłał mi każdego ranka informację o ilości e-maili. Serce aż bije mocniej, gdy wspomnę tę ekscytację czymś, co dziś brzmi jak błahostka. Zabawne, że dziś moje skrypty działają odwrotnie i ukrywają pocztę, która do mnie przyszła. Odwrotność miłości to nie nienawiść — to obojętność.

Zanim otrzymałem to konto cierpliwie wertowałem „książkę do nauki Linuksa”, jedną z tych książek, które leniwie tłumaczą to, co i tak jest dostępne na stronach podręcznika man, ale to było jak uczenie się języka przez zapamiętywanie słówek, bez wymowy, bez kontekstu, ale z pełnym nabożeństwem iluzji zdobywania wiedzy.

Tam też natknąłem się na atd, daemon wykonujący polecenie — bądź serie poleceń — opóźnione o zadany czas. Prawie zemdlałem. Idea, że jest komputer, który nie tylko jest non-stop włączony, ale także non-stop „w Internecie”, a do tego mogę mu powiedzieć, co zrobić za kilka godzin wydawała mi się jak odkrycie podróży międzyplanetarnych przy użyciu puszki mielonki, kawałka sznurka i bardzo silnego postanowienia woli: niesamowite, a w ogóle nieprawdopodobnie, że ludzie nie siedzą godzinami wymyślając, co komputer może zrobić za godzinę! To musi zmienić cały świat.

Nie zmieniło świata, a wraz z upływającym czasem ludzie w ogóle przestali wiedzieć o atd. Kiedy zainstalowałem Debiana na nowym laptopie atd nie było w standardowym zestawie pakietów. Jak wtedy, gdy Twoja matka komunikuje Ci na obiedzie, że znalazła twoje stare magazyny i wyrzuciła je do śmieci. Maska dorosłości przykrywająca doskonale uczucie żalu.

Mimo to, myślę sobie, at jest jedną z tych rzeczy, która spadła za ladę i może znajdzie się jak będziecie malować, w przyszłości. Nie wiem, jak ludzie żyją bez tego, ale może to tylko ja. Może po prostu nikt nie powiedział ludziom, że mają non-stop takie nisko-profilowe cudeńko w systemie? Może jeśli im powiem, na ten przykład w notce, trochę wstawiony, to odnajdziemy wspólny język.

at to komenda, która jest klientem daemona atd, pozwalająca na uruchomienie polecenia, lub serii poleceń. W odróżnieniu od Crontaba zadania te są jednokrotnego użytku. Można oczywiście wywoływać skrypty.

Przykładowo, mój skrypt odpowiedzialny za deploy nowej wersji oprogramowania ma linijkę:

echo "./skrypt.sh" | at 1:00

Znaczy to ni mniej, ni więcej że o pierwszej w nocy, kiedy użytkownicy już zasną, pojęte zostaną działania integracyjne, które teraz powodowałyby ból zębów użytkowników. Gdybym używał do tego Crona lub innego cyklicznego odpalacza musiałbym przekazać w jakiś sposób stan, stworzyć pusty plik albo odłożyć wartość do redisa, to tylko komplikuje rzeczy.

Kiedy wychodzę z domu, a pasek „podstępu” pobierania tego czy owego waha się non-stop pomiędzy 30 a 40 minutami piszę:

sudo at now+1 hour, podaję hasło i w linii poleceń at piszę poweroff. Za godzinę komputer złoży się bez mojej interwencji i nie będzie marnował prądu.

Mieliście kiedyś do wykonania zadanie na serwerze, który jest pod sporym obciążeniem, które to obciążenie powoduje, że zadanie wykonywałoby się zdecydowanie zbyt długo lub — co gorsza — spowodowało śmierć ważnych części systemu przez wysycenie I/O? W skład at wchodzi polecenie batch, które nie czeka na dopełnienie się konkretnej daty, odpala zadane kiedy load spadnie do 1.5; jeśli wydaje się Wam to bezużyteczne nigdy nie widzieliście aplikacji, która rozpędzona łyka zasoby jak odkurzacz-fetyszysta.

Kolejkę oczekujących zadań obsługujemy przy pomocy atq, które wyświetla listę wraz z unikalnym identyfikatorem, którego możemy użyć wraz z atrm celem usunięcia.

Tak wiele, tak niewiele.

I wiem, że jest pewnie lepszy, współcześniejszy, daemon. Wysyła powiadomienia na Slacka, całuje użytkownika w czółko i w ogóle. Ale! Te narzędzia nie przeżyły tyle lat jako część *NIX-a dlatego, że panowie z workami, na których widnieje symbol dolara, sypali mamoną aż do momentu w którym krytykanci się poddali i odlecieli prywatnymi odrzutowcami. To po prostu jednofunkcyjne narzędzie, które robi, co powinno.

KISS your atd.


Rozszczepienie

Zanim Reddit stał się pierwszą stroną Internetu, był trzecią. Nie istniał jeszcze ekosystem pozwalający zwykłym użytkownikom na relatywnie tani dostęp do zawszedostępnego składu informacji, a serwisy hostujące obrazki dzieliły się na trzy rodzaje.

Ofertę darmową, obsraną wyskakującymi okienkami, obwieszoną reklamami, pod których ciężarem usługa czołgała się, irytując użytkowników. Ofertę płatną, obłożoną ograniczenami transferów i relatywnie kosztowną, często powiązaną z życiem profesjonalnym lub prywatnym, które może nie każdy chciał wiązać ze swoimi postami na Reddicie, gdzie tematem przewodnim jest dmuchanie kreskówkowych postaci, dosłownie. Istniały wreszcie serwisy chałupnicze, które studenci budowali w ramach podpieprzania zasobów serwera .edu.pl. Serwisy te często zapewniały szybkość i wygodę, a także pewność, że znikną one prędzej czy później bez słowa wyjaśnienia, grzebiąc twoje bardzo zabawne zdjęcia i łamiąc nieskończoną ilość odnośników ućkanych po forach.

Nie było dobrze, zwłaszcza w świecie, w którym obrazki — na serwisach takich jak Reddit, będących bezpośrednią ewolucją imageboardów — są największym dobrem.

Ktoś rzucił kiedyś pomysł, żebyśmy sfinansowali jeden z serwisów, który został demokratycznie wybranym docelowym miejscem do wieszania obrazków, bo prawdopodobieństwo podzielenia przez niego losu innych „dobrych serwisów powstałych z potrzeby społeczności bez pieniędzy” zaczęło oscylować dookoła jedynki.

Ludzie rzucili jakieś dolary i orkiestra grała dalej. O tym, że też rzuciłem, dowiedziałem się po latach z e-maila z podziękowaniami. Jestem tak szczodry, że nawet się nie chwalę i nie pamiętam, czyj serwis ratuję przed zgonem. Skromnie.

Minęły lata. Życie z datków, reklam i „sponsorowanych obrazków” było ciężkim chlebem.

W przemyśle podwykonawczym nie ma miłości. Nikt nie kocha gościa obierającego ziemniaki na zapleczu czy pilnującego, żeby mieszadło mieszało z dobrą szybością. Reddit używał serwisu Imgur tak, jak się używa podwykonawcy: z obojętnością, kiedy wszystko idzie dobrze, z nienawiścią, jeśli coś nie działa.

Nie widząc innej szansy na przetrwanie, Imgur postanowił zbudować własną społeczność, umożliwiając komentowanie i gromadzenie się pod różnymi banderami — sprawdzony przepis na zwabienie ludzi. Był dużo mniej przerażający niż Reddit (nie widzę młodych ludzi, którzy zacierają ręce, myśląc „Ojej, spartański design, gdzie w wątku o meczu są tysiące — wątkowanych! — komentarzy i osiem lat kultury opartej na sraniu we własne gniazdo! Dołączam!”). Użytkownicy wsiąkali więc na tyle szybko, że pojawili się nawet kapitaliści wysokiego ryzyka (cudzego) z workiem pełnym twardej waluty.

Większość użytkowników Reddita nadal używa Imgur jako miejsca zrzutu obrazków.

Uf, to historia, której mogłem nie pisać, ale mam pół litra zielonej herbaty do wypicia.

Użytkownicy Reddita wrzucają obrazki na Imgur bezwiednie, często anonimowo, półautomatycznie lub nawet automatycznie. Wszyscy nadal myślą o nim w kontekście serwisu usługowego. Gdy czasem kliknę jakąś galerię (praktycznie jedyny przypadek, kiedy ląduję na stronie ich serwisu bezpośrednio), widzę to, co widzi ich społeczność. I tu ostatnio zadumałem się.

Mamy sytuację, gdy jedna strona traktuje drugą przedmiotowo, ale ta druga, bez wiedzy pierwszej, rozwinęła własną kulturę i społeczność. Wszystkie obrazki trafiają więc do mieszkańców serwisu obrazkowego bez jakiegokolwiek kontekstu, a sam wrzucający nie ma najmniejszego powodu, żeby podejmować interakcję z elementem lokalnym.

Serwisy się widzą

Nie uderzyłoby mnie to, gdybym któregoś dnia nie nadganiał galerii subreddita /r/fountainpens — który, jak nazwa wskazuje, służy do chwalenia się piórami lub charakterem pisma („those who can’t, buy”) — i nie poczytał załączonych komentarzy. Ludzie pisali jakieś bzdety, bzdety, jakich nikt zainteresowany tym hobby by nie pisał. Popatrzyłem jeszcze, sytuacja się powtarzała.

Wyobraź sobie, że żyjesz gdzieś, gdzie jest nowocześnie i młodzieżowo. Co jakiś czas twój dom najeżdzają barbarzyńcy i wieszają na ścianach barokowe obrazy podpisane łaciną. Nigdy nie mówią nic, nie usprawiedliwiają się i nie tłumaczą. Wieszają i wychodzą. Żyjecie w dwóch przenikających się wszechświatach, obserwujecie to samo, widząc zupełnie coś innego. Nie w materialnym sensie, bo piksele są te same, ale cały sens pojawiający się wraz z odpowiednio umocowanym punktem widzenia jest inny.

Ten tekst nie zawiera żadnej puenty, gdyż do niczego Was nie przekonuję. To tylko jedna z tych obserwacji, od których robię „huh…”. Kiedyś bym ją zamienił w zbyt długą notkę o niczym.

Punkt widzenia zależy od zalogowania się.


Tay, otwórz drzwi

Technologia nie zwalnia. Przeszliśmy od komputerów, których nie można podnieść, przez komputery, które można, następnie takie, które można rzucić, aby zakończyć na tych, które upuszczamy niechący. Wielkimi krokami nadchodzi era osobistych asystentów w ogóle odpiętych od idei „urządzenia, które się posiada”, takich jak Amazon Echo czy Google Assistant.

Sukces jest jednak daleko, bo mimo olbrzymich skoków, nadal technologie Udające Inteligencję podczas interakcji bardziej przypominają grę w 20 pytań niż dramatyczny dialog z HAL-em 9000 o zamykaniu drzwi. Wielkie firmy już dawno zauważyły, że ciężko jest zbudować taką technologię bez dobrego źrodła informacji. Jeśli algorytmy mogą być „uprzedzone” uprzedzeniami autorów, to co dopiero dane, które są dużo mniej rygorystyczne w swej naturze. Czasem myślę, że Douglas Adams stworzył Marvina, robota z depresją, jako ostrzeżenie przed uczeniem algorytmów sztucznej inteligencji na korpo-poczcie i zgłoszeniach błędów, których z pewnością międzygalaktyczny rząd miał pod dostatkiem.

Najtańszą siłą roboczą na rynku są obecnie użytkownicy. Nie tylko robią rzeczy za darmo (ewentualnie za „odznaki”, które można spieniężyć), ale reprezentują w miarę szeroką gamę opinii, pochodzą z różnych kultur, rozmawiają różnymi językami. Nie ma takiej akcji świadomościowej, która mogłaby wtłoczyć w firmy technologiczne równie zróżnicowany wycinek świata.

Użytkownik skataloguje obrazki, użytkownik zabawi parser lingwistyczny rozmowami o życiu, użytkownik otaguje i utworzy listy. Użytkownik nie ma związków zawodowych, nie ma też wolnego.

W świecie synergii biznesowej firmy udostępniają swoich użytkowników innym firmom tak jak pożyczasz sąsiadowi młotek czy szklankę cukru — normalne zachowanie pozwalające budować partnerstwo i wzajemne zaufanie.

Tak właśnie Microsoft wpadł na pomysł, żeby zapędzić użytkowników serwisu Twitter — który to serwis służy do niszczenia wyobrażeń o aktorach i politykach oraz jako efektywny transmiter krótkich utarczek słownych — do „pracy przez zabawę”, tj. rozmawiania z ich botem, którego przebrano za nastolatkę i nadano odpowiednie imię: Tay. Taka forma międzymordzia (pomiędzy algorytmem danych rozgryzającym zdania na części mowy celem łatwiejszego połknięcia a białym pudełkiem, w które wpisuje się wypowiedzi) miała zmiejszyć napięcia zawsze budujące się w interakcji między człowiekiem a maszyną. Oraz zawęzić grupę biorącą udział w pracy przy pomocy naturalnego filtru społecznego („kto rozmawia z nastolatkami na Twitterze?”).

Microsoft, firma przechodząca drugą młodość, po pozbyciu się starych ludzi zyskała wigor, ale straciła też wiedzę zdobytą przez lata: pytanie Internetu to rosyjska ruletka w wersji „ciężko”, pięć kul i jedna wolna komora.

Tay zaczęła jako pogodna nastolatka z ograniczonym zasobem zainteresowań i ubogim słownikiem. Blogi technologiczne, widząc opcję na odfajkowanie jeszcze jednego wpisu, przepisały notkę prasową, co zamieniło się znów w zainteresowanie. Twitter gadał do Tay, ona słuchała.

Wiadomości dosięgnęły wreszcie podbrzusza Internetu, o którym z wypiekami na twarzy korporobotnicy czytają na smartfonach w kolejce do okienka. Tajemne, mroczne, skandaliczne, bezwzględne, składające się głównie z innych znudzonych korporobotników za siedmioma serwerami proxy.

Następnego dnia Microsoft zamknął projekt. Tay, przyuczona przez element anarchistyczny, stała się grubiańska, głosiła niepopularne tezy podszyte ksenofobią i rasizmem. W jeden dzień z cichej nastolatki na Twitterze wykluł się potwór, rasista, cynik, automaton powtarzający głupoty za swoimi rówieśnikami, a przecież spuszczony z oczu tylko na chwilę przez rodziców, którzy mieli dobre intencje.

Najbardziej boli mnie, że ludzie, zamiast gratulować Microsoftowi, wieszali na nim psy. Nikt nigdy wcześniej nie dokonał tak kompletnej, dokładnej symulacji bycia nastolatkiem. Ktoś powinien dać im nagrodę. To absolutny przełom.

Być może następnym produktem będzie para botów. Na start każdy z nich będzie przekonany 100% o swojej racji i niech skalibrują się wzajemnie. Najlepiej na Fecebooku1.

  1. Kaja zgłosiła jako literówkę, ale zostawiam, gdyż piękne.

Lista Osobista: podkasty, część trzecia

Listy z rzeczami do klikania cieszą się niezmiennie popularnością w Internecie. Nie wymagają wielkiego poświęcenia ze strony autora, są bezbolesne dla czytelnika. Cała filozofia zamyka się w wymienianiu rzeczy, czasem w kolejności, która ma wykazać „dobrość” lub „słabość” tematu listy, czasem bez tego rodzaju zobowiązań.

Nie chcąc kompletnie stracić rynku list internetowych, przedstawiam Wam trzecią edycję podcastowej listy przebojów wprost z mojego odtwarzacza. Napisałem już tyle wariacji tej listy — prywatnie, e-mailem, na życzenie — że w przyszłości skrócę sobie pracę i będę mógł wysłać tylko odnośnik.

Rozrywka, kultura i sztuka w słuchawki stuka

Kultura

99% Invisible

http://99percentinvisible.org/

Otwieram podcastem, który jest pierwszy na tej liście tylko dlatego, że taka jest natura sortowania w mojej aplikacji do grania. I nie, to nie jest zły podcast, to jest bardzo dobry podcast. Tak dobry, że często przeskakuję odcinki (wydawane w cyklu tygodniowym).

Brzmi bez sensu? 99% Invisible często produkuje odcinki, które są w 100%1 absorbujące. Są krótkie, więc jeśli coś przeoczę, próbując np. przejść przez ulicę, to zaraz się irytuję. Jeśli dam się znów wciągnąć kompletnie w materię odcinka, to przechodzę przez ulicę na ślepo.

99pi to nie jest radioreportaż, jaki pamiętacie, ale taki, jak sobie wyobrażaliście.

Odcinek startowy2: Holdout

Double Feature

https://doublefeature.fm/

Recenzowanie filmów to trzecie pod względem popularności zajęcie w Internecie. Drugie to recenzowanie gier komputerowych, a pierwsze — bycie padalcem. Pośród setek podobnych tematycznie podcastów Double Feature pozostaje niezmiennie moim wyborem numero uno. Połączenie osobowości prowadzących z ich wiedzą na temat filmów oraz wyborami samych tytułów do recenzji powoduje, że mogę często udawać wśród ludzi, że oglądałem filmy, przedrukowując językiem opinie, które usłyszałem w programie internetowym.

History of Philosophy Without Any Gaps

http://hopwag.podbean.com/

Podcast, którego tytuł mówi wszystko o zawartości. Jeden z niewielu, które radzę — jeśli już słuchać chcecie — słuchać od początku.

Philosophize This!

http://www.philosophizethis.org/

Podobnie jak podcast wyżej, ten też zajmuje się filozofią, ale jest mniej systematyczny (co nie jest złe dla odbiorców, którzy nie potrzebują 200 odcinków, aby dojść do tematu, o którym chcieli się dowiedzieć).

Odcinek startowy: Henry David Thoreau

Myths and Legends

http://www.mythpodcast.com/

Moja najnowsza perełka. Mity i legendy, historie, które znasz, w wersjach odmienionych przez kalejdoskop kultur, krajów i czasów.

Rekomendacja: przesłuchałem całość. Niektóre odcinki więcej niż raz.

The Reith Lectures

http://www.bbc.co.uk/programmes/b00729d9

Trudno to nawet nazwać podcastem. To seria wykładów, które odbywają się co jakiś czas z błogosławieństwa BBC. Zdecydowanie nie polecam jako „tła do pracy”, nawet gdy słucham na leżąco, wyskakuje mi żyła na czole od intelektualnych przysiadów.

Odcinek startowy: Democracy has a Bad Taste

Sztuka

The Pen Addict

https://www.relay.fm/penaddict

Pióra. Atrament. Notatniki. Plecaki. Piórniki. Pióra.

Czasem zdrajcy wspomną o długopisach, ale jednak pióra.

Moja ziemia obiecana.

Art Supply Posse

http://www.artsupplyposse.com/

Akwarele. Farby olejne. Ołówki. Pióra. Papier.

Czasem wywiady z ludźmi, którzy tych rzeczy używają.

Rozrywka

Listen to Lucy

http://www.acast.com/ft-lucy-kellaway

Dobrego komika można poznać po tym, że od lat bije po tym samym temacie, a ten puchnie ciągle w różnych miejscach, przynosząc radość obserwatorom tej masakry.

Lucy, felietonistka Financial Time, tydzień w tydzień nawiedza moją duszę esejem o tematyce w zakresach: koszmary komunikacji w biznesie, koszmary kultury w biznesie, koszmary kultury komunikacji w biznesie.

Każdego tygodnia łączę się z nią sercem w nienawiści do okrągłych przemów, które osuszone z przymiotników stają się mniej groźne i mniej ważne.

nerdy nocą

http://nerdynoca.pl/

Podcast po polsku! Kaja rozmawia z ludźmi, którzy znają się na różnych rzeczach. Audycje dla koneserów wiedzy wszelakiej. Jest na to wyraz: nerdów. Można słuchać za dnia.

Odcinek startowy: Sprawy atomowe

No Such Thing As A Fish

https://audioboom.com/channel/nosuchthingasafish

Wspominałem wyżej, że wielokrotnie polecam ludziom różne e-słuchowiska. To jedyne, które ma 100% sukcesu wśród słuchaczy.

Program komediowo-naukowy, brytyjskie akcenty, anegdoty o genitaliach. Triumwirat smaku.

Sawbones: A Marital Tour of Misguided Medicine

http://sawbones.libsyn.com/

Historia medycyny to historia nauki, tylko bardziej, bo była praktycznie połączona z przeżywalnością populacji — wynajdywanie pojazdu do latania napędzanego siłą mięśni zabijało najwyżej wynalazcę, przepisywanie upuszczania krwi na każdą przypadłość miało dużo gorsze konsekwencje. Każdy odcinek to naukowo-historyczna analiza jednego zabiegu czy leku, który z perspektywy czasu wydaje się być okropnym żartem.

The F Plus

https://thefpl.us/

Internet połączył wszystkich. Ten błąd, teraz nienaprawialny, pozwolił grupce ludzi zbierać się co jakiś czas i czytać rzeczy, które ludzkość wypisuje w Internecie.

Fora niszowych fetyszy, manifesty programowe partii rządzących nieistniejącymi mikro-narodami, pojedynki między fanami rzeczy głupich, to wszystko zostanie przeczytane ku uciesze gawiedzi.

Odcinek startowy: The Sound Quality Is Inaudible

Komputery, komputerów od cholery

Amigos Amiga Podcast

http://www.amigospodcast.com/search/label/podcast

Stary amigowiec i amigowy neofita grają w gry, to w sumie wszystko.

Garbage

http://garbage.fm/

Rzadki przypadek technologicznego podcastu, gdzie nie mieli się nagłówków z internetowej prasy kolorowej. Znaczy czasem też mówi się o gadżetach, ale nie tylko, gdyż obaj prowadzący są okazjonalnymi ulepszaczami projektu OpenBSD, możecie więc słuchać o tym, jakie problemy są z pisaniem sterowników do USB-ETH lub jak ciężko odpalić kernel BSD na Google Pixel.

Linux Voice Podcast

http://www.linuxvoice.com/

Audycja powiązana z magazynem (papierowym!) pod tym samym tytułem.

The Bike Shed

http://bikeshed.fm/

Podobne trochę tematycznie do Garbage, z tym że bardziej skłania się ku dyskusjom o niuansach języków programowania i aplikacjach pisanych przez prowadzących (którzy co jakiś czas się zmieniają — podcast ten jest piarowym frontem studia konsultacji dla klientów ze zjebanym produktem, więc ludzi do gadania jest wystarczająco). Obecnie główny przechył tematyczny to Rails, Rust i Eliksir.

Retro Asylum

http://castaway.media/retroasylum

Brytyjski program retro-komputerowy o wszystkim, choć z mocnym naciskiem na gry. Dwukrotny laureat nagrody „najlepszego podcastu na świecie” i ostateczny dowód na to, że głosowania w Internecie, a zwłaszcza ludzie biorący wyniki tych głosowań na serio, doprowadzą do świata, w którym nikt nie będzie szczęśliwy, a wszyscy będą źli.

Retro Computing Roundtable

http://rcrpodcast.com/episodes/

Cotygodniowy przegląd wydarzeń, nowinek i ciekawostek ze świata komputerów, które nie mają Snapchata. Takie „e-7 Dni Świat” dla starych ludzi.

Piłka Nożna Gola!

Długie lata broniłem się przed sprawdzaniem świata podcastowego pod kątem kopanej. A kiedy wreszcie się namówiłem, trafiłem na pole tak suche i zaniedbane, że nawet górska koza pokręciłaby łbem na ofertę zamieszkania. To oczywiście działo się w czasach przedrenesansowych, gdy jakąkolwiek jakość miały tylko audycje okołotechnologiczne.

Miesiąc temu, może trochę wcześniej, Filip po raz kolejny zasugerował mi, żebym dał szansę programowi o naszej lokalnej piłce. Ponieważ darzę polską piłkę podobną niechęcią co polskie podcasty3, ignorowałem jego sugestie z pełną świadomością popełnianego czynu. Aż któregoś dnia wyrzuciło mnie na kilkukilometrowy spacer i kliknąłem wtedy „plej”.

Skracając długą historię: zaskoczony pozytywnym doświadczeniem poszedłem po dokładkę.

Football Weekly

https://www.theguardian.com/football/series/footballweekly

Nacisk idzie głównie na futbol brytyjski (duh, Guardian), ale każda audycja zawiera też przegląd ważniejszych wydarzeń na boiskach europejskich. Całkiem zabawne, duża grupa komentatorów (w tym zagraniczni), odcinki specjalne, ogólnie: doskonały skrót dla ludzi, którzy przepuścili weekend piłkarski.

Hattrick

http://soundcloud.com/hattrickpl

Moją genezę podłączenia się pod to słuchowisko o kartofliskach już pisałem. Słucham, bo jest jakaś chemia wśród prowadzących, słucham też dlatego, że mam Schadenfreude na polską ligę. Pewnie to ukryty smutek po tym, że zatopiono (a raczej: załoga wycelowała armatę w dno statku i podpaliła lont) mi „mój” ełkaes, który obecnie błąka się po ligach tak niskich, że małe dziecko potrzebuje palców do ich policzenia.

Przykładowy odcinek: HattrickPL 34

The Final Third

http://soundcloud.com/thefinalthird

To trochę antyteza do Football Weekly, bo amatorski i irlandzko-szkocki, a trochę synteza, gdyż zarówno komentarz, jak i opinie pochodzą od ludzi, którzy rozumieją sport. No i bluzgają, bo trochę antyteza.

Zawsze Zielone

Polecane już we wcześniejszych odcinkach i „na zawsze w mym sercu”.

The Jeff and Casey Show

https://jeffandcaseyshow.com/jacs_all_podcast.rss

Anime World Order Podcast

http://www.animeworldorder.com/

Dan Carlin’s Hardcore History

http://www.dancarlin.com/

Overthinking It Podcast

https://www.overthinkingit.com/

Posłowie

Mój proces filtrowania podcastów jest bezlitosny. Jeśli moje serce nie trzepocze z ekscytacji na widok nowego odcinka, znaczy to, że już niedługo się z audycją pożegnam. Dość powiedzieć, że usunąłem kilka z tej listy podczas pisania. Otrzymujecie więc zestaw sprawdzony i wystarczy, że będziecie identyczni ze mną pod względem charakteru, ideałów i zainteresowań, aby cieszyć się nim bez ograniczeń.

A kto się nie cieszy, ma swoje własne propozycje lub po prostu chce wskazać literówki i lapsusy, może zawsze napisać mi e-mila.

  1. prawdziwi jednoprocentowcy
  2. taki odcinek, który mniej więcej reprezentuje, co się zwykle dzieje
  3. Jest to wynik mojego uprzedzenia, jak i złości, że sam nigdy nic nie zrobiłem. O szczegóły trzeba zapytać mojego psychoanalityka

Etos Zróbtosamowca

Wychodzi mi na to, że cała moja kariera internetowego pisarczyka zamyka się w syzyfowym cyklu wpadania na doskonały pomysł i patrzeniu, jak ten pomysł toczy mi się na sam dół, na karty notatnika. Nawet teraz, pisząc o tym, nie piszę o czym miałem. A miałem pisać o Linuksie. Osiem lat temu myślałem, że miałbym doskonały tekst o mojej dziesięciolatce z tym systemem, potem przepuściłem piętnastoletnią rocznicę, bo myślałem, że szesnastoletnia będzie doskonała jako żart, bo to taka okrągła rocznica.

To było dwa lata temu i mogę Wam obiecać, że za dwa lata też nie napiszę na dwudziestą. Prawdopodobnie. Szczerze mówiąc nawet nie wiem, co można powiedzieć, zmiany w tych latach są tak daleko idące, że nie potrafiłbym ich wymienić. Te na gorsze łatwiej, bo człowiek współczesny żyje lepiej w trybie auto-wzburzenia. Jeśli nie mogę zebrać się na jakiś sensowny raport z tego, co było, może lepszym tekstem byłby moje zeznania: „czemu się skazałeś na taki los?”.

Kiedy zaczynałem z Linuksem, system ten miał przypiętą łatkę ziemi obiecanej dla smutnych, zbyt chudych, zbyt grubych, brodatych, cytujących religijnie programy komediowe, ateistów z twarzami naznaczonymi binarnie pryszczami, mieszkających w ciemnych norach, w których nocami popychają kijami od szczotki pakiety. Wpasowując się idealnie w ten stereotyp wiedziałem, że to miejsce, gdzie odnajdę — jeśli nie szczęście — zadowolenie.

To oczywiście żart. Trochę. Moją krótką przygodę z Windowsem (2001-2002) zakończyło uzależnienie się od radykalnej i bezwzględnej wolności do robienia tego, co mi się podoba. Automatyzacji. Zmieniania. Zestawiania ze sobą rzeczy, które osiągają masę krytyczną niszcząc system, oraz wiedza, że mogę go odbudować, jeśli tylko zrozumiem dlaczego eksplozja nastąpiła. Wiele z tego to tylko żonglerka piłami łańcuchowymi, gdzie widz podziwia bezużyteczną umiejętność i ma trochę nadzieję, że żongler złapie za którymś razem za ostrą część. Jest jednak druga strona, ktoś kto ma 12 pił będących jego źródłem utrzymania bardzo szybko uczy się, jak się je oliwi, ile trzeba wlać paliwa na jeden pokaz żeby było ekonomicznie i wreszcie, jak nie łapać za tę część, która przynosi natychmiastowy ból i odbiera zdolność liczenia do 10 bez ściągania butów.

Któregoś dnia, zaproszony na piwo przez sąsiadów którzy mieli jakieś tam znajomości z moją ówczesną dziewczyną, próbowałem im wytłumaczyć jak działa to całe otwarte oprogramowanie. Byli to bardzo grzeczni ludzie, jedyną rzeczą wychylającą się poza normę, było to że jeździli motorynką po mieszkaniu, więc słuchali uważnie i typowym dla gospodarzy zainteresowaniem, gdzie nie spoglądasz na zegarek. Wysnułem analogię: jest wielu autorów opowiadań oraz ktoś, kto zbiera je do kupy i wydaje antologię. Wydawało mi się, że to bardzo dobra analogia, bo nikt nie robi jednego i drugiego dla fortuny. Nie wiem, czy to kupili.

Bezcelowa anegdota, ale ukazuje co mnie zwabiło.

Komputer osobisty nazywa się tak dlatego, że mamy do niego fizyczny dostęp i przechowuje nasze prywatne dane. Ja posiadam komputer swojski, jak smak matczynej pomidorówki z ryżem. Robi to, co mu mówię. Chyba że popełniam błąd, ale za radykalną wolnością idzie też odpowiedzialność za czyny. Kiedy mówię mu „skacz!” pyta, „jak wysoko?”. Odpowiadam: 129, a on zapada się pod ziemię. 1

Postanowiłem o tym napisać, gdyż dziś, mimo zaaplikowania dopiero jednej kawy, ukazał mi się bóg wszystkich Zoś-Samoś i wyszeptał mi do ucha, „ha ha, niezły haks, ziom.”, więc opowiem, jak było.

Do czytania poczty używam Mutta, którego sloganem jest „wszystkie klienty poczty ociągają, Mutt mniej”, co jest prawdą. Ponieważ moje życie spędzam przybity do konsoli terminala, używam wraz z nią programu tmux, który pozwala na uruchamianie wielu aplikacji podczas jednej sesji i umieszczenia ich w tabach, tak ja Wy to robicie z kartami przeglądarki. Nieustannie, przez nieuwagę lub zwykłe zapomnienie, odpalam kilka kopii Mutta, co zwykle nie powoduje problemów, ale często psuje mi ciąg pracy, bo trafiam na złego. Linuks nie pyta, po co Ci 37 klientów pocztowych, widocznie masz taką potrzebę. Znów, radykalna wolność do bycia niekompetentnym. Kiedy o 9 rano doszedłem do trzeciego Mutta coś we mnie strzeliło i pomyślałem, „nie no, kurwa, to już jakieś żarty, zaraz się wścieknę i to naprawię!”.

Ponieważ musiałem wejść do biura postanowiłem przemyśleć problem człapiąc się ulicami. Dosłownie człapiąc, gdyż skręciłem nogę i trasa, która zajmuje mi normalnie nie więcej niż kwadrans teraz potrafi się przeciągnąć nawet do minut czterdziestu.

Przeczytałem dokumentację, drugą i zanim wypiłem pierwszą szklankę kawy w biurze, miałem rozwiązanie. Skrypt, który, jeśli wywołuję polecenie po raz drugi, nie odpala aplikacji kolejny raz, przełącza tab na ten, który ją zawiera. Zatarłem ręce i zaśmiałem się do siebie. Dwanaście pił łańcuchowych krążyło w powietrzu, bez widowni, a ja byłem zadowolony, że osiemnaście lat nie poszło na marne! Tylko w życiu osobistym, ale ono, oczywiście, nie przychodzi z kodem źródłowym, a Jahwe nie akceptuje patchy.

wideo usunięte bo mi gdzieś zginęło!

  1. ciężki żart

Buenos Aires

Podchodzi do mnie facet na skrzyżowaniu, rękę ma wyciągniętą i jasne jest, że oczekuje uścisku. Patrzy mi się prosto w oczy i kiedy wreszcie podaję mu dłoń, potrząsa nią energicznie, jakby spotkał przyjaciela, który przepadł w odmętach historii. Czyżbym znów padł ofiarą prosopagnosii, choroby, na którą z pewnością nie cierpię, a która często służy mi za wymówkę w takich właśnie sytuacjach? Pytam więc typa, czy się znamy, a jeśli tak, to gdzie się poznaliśmy.

— Cztery lata temu kupił Pan ode mnie uszczelkę.

— Kupiłem uszczelkę?

— Bez wątpienia.

Ta historia nigdy się nie wydarzyła - na ulicy miasta. Dzieje się non-stop w mojej skrzynce pocztowej, gdzie Firma Nieznana na przemian z Firmą Anonimową składają mi szczere życzenia z okazji naszej iluś-tam-letniej współpracy, która polegała na tym, że zakupiłem od nich jakiś drobiazg, albo, w ramach uprawiania startupowej rozwiązłości, założyłem konto, żeby zbadać, co niesie przyszłość.

Przyszłość przyniosła tylko e-maile o naszej przeszłości.

Wiadomo, że utrzymywanie kontaktu z klientem jest niezmiernie ważne. Niezmiernie fałszywie brzmi jednak list, który udaje, że świetnie się znamy i dzwonimy do siebie w niedzielne wieczory, by opowiedzieć o swoich smutkach, nadziei nadchodzącego tygodnia i kobietach, które kochamy. W dobie wtykania przyuczania mechanicznego i „sztucznej inteligencji” wydawałoby się, że sprofilowanie odbiorcy nie będzie wielkim problemem. A tu nie. Obcy ludzie wyciągają dłonie w geście powitania.

To nie jest jednak najgorsze. Rozumiem, że nie każdy, kto wynajmuje serwer za piątaka i internetowy sklep by przemo™, musi wychodzić mentalnie poza model ulotek wciskanych do skrzynki.

Kiedy rdio, serwis streamingowy (który już wyciągnął nogi) pojawił się na polskim rynku, założyłem konto, żeby „rzucić uchem” na ofertę. Przed bliższym zapoznaniem się powstrzymała mnie inercja i tarcie: na Spotify jest Lan, a Lan ma najlepsze listy odtwarzania. Przesłuchałem dwa utwory i zostawiłem, żeby sobie gniło.

Kilka tygodni później otrzymałem e-mail od rdio, że mój najukochańszy zespół, ten, którego dwa utwory przesłuchałem wcześniej, jest mi polecany.

Sytuacja powtórzyła się znów. I znów. Dwa odsłuchania spowodowały, że w oczach serwisu stałem się kompletnym fanem kapeli Maanam. Z pewnego punktu widzenia mieli rację: 100% odsłuchań.

Siedziałem w lesie i opowiadałem tę historię pijanemu przyjacielowi. Czwarta nad ranem, on już nie rozumie, a może ja nie potrafię tego opowiedzieć. Ptaki śpiewają, ognisko jeszcze pracuje nad poranną mgłą.

Tablet robi pik.

Maanam wydało singla.

Za kilka dni kolejny numer njuslettera do czytania. Można się zapisać.


We’re fine. We’re fine here now, thank you. How are you?

Star Wars było kamieniem węgielnym na którym wielu z nas zbudowało swoje dziwaczne kościoły, pełne zabobonów, zwyczajów i cytowania materiału źródłowego, aż do odpadnięcia uszu przypadkowego słuchacza.

Nie moim. Dużo większy wkład w moje przyszłe życie miały Tron i Wizard. Ten drugi miałem nawet kiedyś zrecenzować 1 ale ostatecznie się poddałem. Tron? Tron wiadomo. Programiści, programy.

To nie znaczy, że nie ma w moim sercu miejsca na Gwiezdne Wojny.

Moja historia z Skywalkerem jest trochę inna, jest naznaczona.

Był któryś rok, przypominając sobie jak wyglądała moja siostra, zgaduję, że jeszcze przed latami dziewięćdziesiątymi. Od kilku lat byliśmy szczęśliwymi posiadaczami odtwarzacza wideo, który Ojciec kupił gdzieś z zachodniego przemytu, w stanie, który dziś na Allegro opisuje się jako „nieprzetestowany”. Głowica była martwa. Na szczęście, nieznanymi dla mnie drogami, zapasowa głowica znalazła się we Wrocławiu.

Ojciec, zaraz po zatrzymaniu się na Wrocławiu Głównym, udał się do ZOO, gdzie zakupił nielegalnie głowicę od pana Gucwińskiego. Tu mógłbym skończyć opowiadanie, bo handel nielegalnym osprzętem elektronicznym w PRL-u to było coś. W zeszłym miesiącu kupiłem naklejki z USA i się zgubiły po drodze. Ach, gdzie ci przemytnicy zeszłych lat, cyberpank nic na was nie ma.

W każdym razie mamy wideo, a ja na imieniny dostałem własną kasetę; kasetę, którą mogłem kompletnie rządzić. Co jest na niej, co zostanie skasowane. Poezja.

Dostaję informację, że w weekend będzie w telewizji Bardzo Dobry Film. Był to też weekend w którym mieliśmy odwiedzić prababcię Annę w celu okołorodzinnym.

Ustawiłem więc timer, ponieważ technika zawsze była miękka w moich dłoniach i pojechałem z rodziną. Już zupełnym dodatkiem było to, że dużo starszy kuzyn zaprezentował mi tam Myszkę Miki zbierającą jajka, przenośną grę nieznanej mi firmy Game & Watch Nintendo.

Minął czas, Ojciec odpalił Syrenę i wróciliśmy do domu. Kaseta wystawała z paszczy odtwarzacza, tak jak to zaplanowałem.

Włożyłem ją i zacząłem oglądać.

Każdy wie, jak to idzie: Darth Absolutny Drań Vader, dwa zachodzące słońca, Wuj Obi, zespół z kantyny, Han strzela pierwszy, scena w zsypie na śmieci. Wszystko to opanowało mnie na przynajmniej rok. A gdy minął (a może więcej?), dostaję informację, że w weekend będzie w telewizji Bardzo Dobry Film. Był to też weekend w który mieliśmy odwiedzić prababcię Anię w celu okołorodzinnym.

Na rynku były już rosyjskie podróbki Game & Watch.

Nie byłem pewien, czy chcę skasować Gwiezdne Wojny. Znałem je na pamięć, ale to przecież nic nie znaczy. Ojciec namawiał. Mówił, że jest więcej dobrych filmów. Dałem się przekonać.

Kaseta była wysunięta, gdy wróciliśmy. Znak, że znów się udało. Pamiętam podniecenie na myśl, co przyniesie mi kolejny Dobry Film!

Zacząłem oglądać i z każdą minutą rosło moje rozczarowanie, złość i żal, po skasowanym hicie. Nagrałem Odyseję Kosmiczną 2001: film z pewnością wspaniały, ale kompletnie nie do zrozumienia dla umysłu prawdopodobnie-mniej-niż-dziesięciolatka. A końcowe sceny? Kompletny dadaizm.

Gdzie jest triumf dobra nad złem? Eksplozja? Ceremonia wręczania orderów? 2

Minęło już wiele lat, nowelkę przeczytałem przynajmniej kilka razy (pierwszy raz nie łącząc jej nawet z filmem, który wyparłem) ale nadal nie mogę wybaczyć Kubrickowi, że puścili go wtedy na Jedynce. I za każdym razem, gdy słucham kulturoznawców mówiących o przełomowym filmie science-fiction nie mogę nie skomentować w swojej głowie „że chuj tam, że sztuka, skasowałem przez to Gwiezdne Wojny, nic się nie działo, a potem stary facet jadł zupę”.

A jutro idę o północy zobaczyć premierę nowych Star Warsów, a gdy wrócę, zjem zupę, gdyż też jestem starym człowiekiem.

  1. zrobiłem nawet filmową plejlistę do czytania
  2. w fanowskiej wersji Chewie dostaje medal, jestem zadowolony

Humanum TERMINATED est

Diamenty potłuczonego szkła rozsypały się po ulicy. Za nimi podążyły drzazgi framugi i odgłos dudnienia. Dudnienie zbliżało się.

Przedwczoraj wszystko było w porządku. Przedwczoraj odpalaliśmy nasz wielki projekt. A dziś nasz wielki projekt położy nam kres.

Nikt już nie wie, czy utraciliśmy kontrolę, czy może programiści — jak zwykle — dostarczyli kod pełen dziur i nieprzetestowanych zakamarków. Bez względu na wagę swej pracy programiści nie mogą się nigdy wznieść nad swój zwykły poziom. Strona pizzerii, na której nie działa koszyk zamówień, i łódź podwodna, której włazy otwierają się automatycznie o 12:38, traktowane są z taką samą powagą. Obie sytuacje mogły być nawet spowodowane tym samym błędem.

Robot. Właściwie tylko lekko humanoidalny czołg – nikt nie miał w budżecie kasy na danie mu emocji, skomplikowanych wspomnień z czasów, zanim istniał, żeby miał konflikt wewnętrzny. Nie miał nawet twarzy, o ile nie liczyć reflektorów, miał rakiety, działa, gąsienice płaszczące wszystko bez dyskryminacji. Był to pragmatyczny robot: żadnych snów o owcach, za to doskonały układ celowniczy.

Wczoraj nic nie było w porządku. Wczoraj miasto skonsumował ogień. Szczątki obywateli zalepiały szczeliny między ogniwami gąsienicy. Na szczęście w swojej pracy robot był metodyczny i spopielał blok za blokiem, zgodnie z mapą topograficzną miasta.

Działka budowlana? Napalm. Działka z budynkiem? Napalm. Fabryka napalmu? To samo.

Biedne dzielnice, które trzymały się pazurami brzegów miasta, zostały już spopielone i teraz, powoli, padną parki. Padną butiki. Padną ławki stojące na czystym bruku. Spopieleją kawiarnie, czarnymi kałużami spłyną sklepy z winylowymi płytami.

Na szczęście nikt już nie stanie się gąsienicowym smarem. Mieszkancy wyciągnęli wnioski i pod osłoną nocy wynieśli się za granicę zasieków ustawionych przez połączone siły wojska i policji.

Dziś robot stoi w okolicach parku prowadzącego wprost do centrum. Nie pada żaden strzał, napalm jest letni, a brak drżenia gąsienic sugeruje zamarcie silników.

W sztabie dowodzenia konsternacja. Czy to pułapka? Czy jednak przepowieści z książek fantastyczno-naukowych się spełniły – gąsienice poznały smak ludzkiej krwi i teraz czekają na więcej?

Zapadła decyzja: zobaczymy, co się stanie. Przyszło jutro i nie stało się nic.

Ekipa złożona z żołnierzy i naukowców przesuwała się nieśmiało ulicami w kierunku zasłaniającego wschodzące słońce robota. Stanęli wreszcie w obecności niedawnego niszczyciela i dyskutowali, który z nich spróbuje dotrzeć do panelu kontrolnego, sprawdzić, co się stało, i ewentualnie przyłożyć rękę do utrwalenia tego stanu.

Drogą losowania wybrano ochotnika. Nieszczęśnik, uzbrojony w płaski śrubokręt, zaatakował.

Klapa ochronna nie stawiała wielkiego oporu, zresztą nie była kompletnie dokręcona: z czterech śrub trzymały tylko dwie. Ekran obudził się. Ochotnik złapał się za głowę i, nie montując ponownie osłony, zszedł do ciasno zbitej grupki kolegów.

Pomachał im, dając znaki, że nie ma zagrożenia, a kiedy zbliżył się na słyszalną odległość, powiedział:

— Mamy szczęście, że jesteśmy głupimy nierobami. Nasza głupota nas dziś uratowała. Robota można zaciągnąć do fabryki. No, jak będzie fabryka – spojrzał w kierunku spalonych części miasta – w przyszłości. Okazało się, że nie załadowaliśmy mu kompletu map, a gdy chciał to naprawić, pobierając aktualizację… bum! Sprawdzanie certyfikatów jest passé, prawda?

Naukowiec przestał mówić, machnął ręką z rezygnacją i oddał śrubokręt pierwszej napotkanej osobie, po czym poszedł w kierunku dowództwa.

Kiedy grupa dotarła do ekranu konsoli, dało się przeczytać:

Miejski dostęp do Internetu, proszę się zalogować.


Wyciek godny zaufania

Nieważne jak mówią, ważne, żeby mówili: to powiedzonko jest przykazaniem ludzi, którzy żyją ze sławy. Mam nierozsądne opinie o piosenkarzach, których muzyki nigdy nie słyszałem. To bardzo złe podejście, ale też zupełnie naturalne. W ogóle mnie zatem nie dziwi, że jednym z najważniejszych narzędzi w rękach nastolatka szukającego społecznej akceptacji w grupie jest udawanie niewiedzy o popularnych wydarzeniach i osobach.

Też nie czytałem Coelho, gdyż śmierdzi chujem.

Ludzie sławni żyją w symbiozie z tymi, którzy ich nienawidzą. Weźmy nastoletniego kanadyjskiego piosenkarza, który powiedział coś głupiego — mówienie głupich rzeczy jest wbudowane w nastoletniość. Ci, którzy go nie znoszą, mogą odczuwać przyjemność moralnej wyższości, natomiast jego fani mogą zewrzeć się jeszcze mocniej w oblężonej twierdzy, pozbyć się nieprawomyślnych ze swoich szeregów i, chwytając się za ręce, stawić opór.

Wszyscy wygrali.

Prawdziwy problem narodził się wraz z urzeczywistnieniem powiedzenia: „każdy ma w życiu swój kwadrans sławy”. Na własne życzenie lub organicznie, dzięki mediom społecznościowym.

Trzy miesiące temu w Internecie pojawiła się informacja o wycieku danych z serwisu randkowego reklamującego się jako idealne miejsce dla ludzi, którzy szukają przygód poza związkiem.

Nie czytałem nazbyt uważnie, bo wycieki danych w 2015 nie powinny dziwić nikogo, kto „robi w Internecie”. Pod sztandarem “move fast and break things” nie ma miejsca na bezpieczeństwo. Bezpieczeństwo danych jest nudne, żmudne i wymaga obecności ludzi, którzy poświęcą problemowi dodatkową uwagę. To wszystko kosztuje, a oprogramowanie zjada świat dlatego, że taniej zainstalować najpopularniejszy framework niż zbudować fabrykę. Włam do systemu to nie kwestia „czy”, ale „kiedy”.

Ktoś, kto podjął się zadania pozyskania informacji, ma cały wachlarz metod technicznych. Jednak może też zwyczajnie zaczaić się na parkingu, poczekać na najchudszego programistę, dać mu w ryj i uciec z laptopem, który z pewnością zawiera zrzut bazy.

Czasem trzeba naprawić problem na „prawdziwych danych” i taka baza się przydaje! W ten sposób usprawiedliwiam takie sytuacje przed sobą. Wy macie pewnie własne wymówki.

W każdym razie: dane wyciekły do Ciemnej Strony Internetu, a stamtąd, niemal tradycyjnie, do zainteresowanych programistów, którzy lubią dłubać w zwłokach cudzych projektów. Zawsze można zebrać kilka darmowych głasków na Hacker News za analizę metody składowania haseł. To dobrze, że próbujemy uczyć się na cudzych błędach.

Następnym punktem programu jest serwis, w którym można sprawdzić, czy twoje dane znajdują się w wycieku. Jakiś sprytny osobnik wyłuskuje identyfikowalną informację (tu: adres e-mail) i powiadamia cię, czy w zbiorach znajduje się wpis z nią skojarzony. Zazwyczaj jest to sygnał dla ciebie do zmiany haseł, obserwowania innych kont na okoliczność prób nieuprawnionego dostępu, ogólnie — do zachowania informatycznej higieny.

Zwykle taka przeszukiwarka danych z wycieku jest niezmiernie pożyteczną usługą, która zwalnia zwykłego użytkownika z konieczności przebycia szybkiego kursu poruszania się po Ciemnej Stronie Internetu, instalowania i konfiguracji bazy danych, importowania skradzionych informacji i potwierdzania obecności własnych danych. Tym razem było inaczej: serwis, do którego się włamano, miał własny ciężar moralny. Zdrada! Tematy blognotek pisały się same.

Minęły dni i w świat poszła kolejna analiza. Serwis okazał się nie tylko męską szatnią, dodatkowo duża część damskich kont wyglądała jak sztuczne twory. O samej analizie dowiedziałem się z Twittera dzięki linkowi, który wrzuciła Paulina. W ramach empatii z autorami kodu chciałem trochę ich bronić. Zacząłem tłumaczyć — spopularyzowaną przez twórców reddita — metodę urzeczywistniania serwisu za pomocą tworzenia sztucznego ruchu przez pracowników. Podczas rozruchu systemu, który jeszcze nie ma użytkowników, projekt wygląda na martwy dla odwiedzających. Budowniczy reddita pozakładali więc wiele kont, z których sami dodawali linki i komentowali, budując złudzenie istniejącej społeczności.

Jeżeli “growth hacking” jest moralny w serwisie z odnośnikami, jest też moralny w serwisie randkowym. Albo tak samo niemoralny.

Rozmawialiśmy głównie o płynnej granicy między tym, co kto pojmuje za zdradę. Czy zdrada jest zdradą tylko jeśli jest czynem aktywnym? Gdzie na tej skali aktywności znajduje się założenie konta na serwisie randkowym? Podczas tej wymiany zdań potknąłem się o prawdziwy temat tego tekstu. Żeby go lepiej przedstawić, posłużę się anegdotą.

Piotr Waglowski jest znanym autorem, który często-gęsto na łamach swojego serwisu opisuje problemy związane z prawem oraz informacją publiczną i dostępem do niej. Kilka lat temu zajął się sprawą policyjnego monitoringu 1. Podczas próby wyjaśnienia Piotr otrzymał anonimową kopertę zawierającą dowody, które popierały jego hipotezę. Nie pamiętam już, jakim kanałem się o tym dowiedziałem, ale byłem pod wrażeniem. Ktoś, komu po cichu daje się dowody, musi być człowiekiem zaufania publicznego. Zapytałem, kiedy ma zamiar udostępnić te informacje. Nie zamierzał. Kiedy spytałem dlaczego, powiedział mi, że nie ma jak ich zweryfikować i równie dobrze ktoś mógł mu zostawić wygodną dla niego narrację i na przykład próbować pozbyć się uciążliwego kolegi z pracy, umieszczając w tych materiałach jego nazwisko.

Do dziś pamiętam moje zdziwienie, że nigdy o tym nie pomyślałem! Być może Piotr jest paranoikiem węszącym spiski? A może ja jestem supernaiwniakiem i on doskonale wie, o czym mówi. Rachunek sumienia wskazał mi, że jednak to drugie.

Załóżmy — hipotetycznie — że wchodzę w posiadanie bazy danych serwisu zliludzie-zleczyny.com.pl (.com.pl, gdyż nic dobrego nie ma w com.pl). Buduję więc serwis, który pozwala zlokalizować użytkowników, i oddaję go w szpony Internetu. Dla żartu piszę jedno UPDATE, które zmienia imię i nazwisko posła partii politycznej na imię i nazwisko kolegi z ławki, który nie oddał mi kasety od 27 lat.

Teraz — nadal hipotetycznie — ciekawy współpracownik lub bliska mu osoba wklepuje jego adres e-mail. Dowiaduje się, że żyje ze złym człowiekiem.

Pewnie myślicie, że przecież można wytłumaczyć taką rzecz bliskiej osobie. Czyli brakuje Wam doświadczenia i empatii. Spróbujcie wytłumaczyć partnerowi obecność na serwisie randkowym zoptymalizowanym pod zdradę.

A teraz, kiedy już przegraliście z tą myślą, wytłumaczcie losowym osobom na mediach społecznościowych swoją obecność na serwisie, którego profil kładzie się cieniem na wasz charakter.

Kanadyjski piosenkarz z początku tekstu ma swoich spinmasterów i ludzi od PR, ma też fanów. Wy macie wielki chuj.

Dane pochodzące z włamów do systemów powinny być witane z większym sceptycyzmem, niż ma to miejsce do tej pory. Dodanie lub zmiana danych jest trywialna dla osoby zaznajomionej z tematem. Na końcu wszystkie dane są tekstem.

Przenieśmy się znów do krainy fantazji. Mój przyjaciel Piotr wychodzi z nudnego spotkania i zostawia laptop na stole. Mam kilka minut.

piotr@mak ~/.mozilla/firefox/msqq1vhj.default sqlite3 places.sqlite 
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 
INSERT INTO moz_places (
 url, 
 title, 
 rev_host, 
 visit_count
) VALUES (
  'http://strasznapornografia.com.pl/chaos',
  'pornografia tak straszna, że oko pęka',
  'http://strasznapornografia.com.pl', 
  '666'
);

Teraz czekam, aż Piotr wróci i podłączy się do rzutnika. Niedbale żartuję, że ogląda straszną pornografię, a gdy zaprzecza, proszę go, żeby zaczął wpisywać adres strony, która taką treść zawiera. Szok, horror! ODWIEDZA!

Integralność danych w systemach informatycznych często polega na zaufaniu i dostępie. Gdy bezpieczeństwo dostępu zostaje złamane — bez względu na to, czy to włam, czy tylko ja usiadłem w cudzym miejscu na dwie minuty — zaufanie do danych spada do zera.

Być może brzmię jak apologeta ludzi, którzy robią złe rzeczy i zostają przyłapani na gorącym uczynku. Moje hipotetyczne scenariusze nie mają umocowania w rzeczywistości, przedstawiam tylko techniczną możliwość ich wykonania.

Być może wszyscy obecni w bazie serwisu randkowego zapisali się do niego. Może profile kobiet były dodane przez autorów serwisu w niecnym celu. Jeśli przyłożycie mi do gardła brzytwę Ockhama, to się zgodzę, oczywiście.

Internet to zespół naczyń połączonych, a ciecz, która się w nich przelewa i stabilizuje, to głównie szambo.

Nie chcę jednak, żebyśmy porzucali zdrowy sceptycyzm tylko dlatego, że ktoś pozyskał dane. Nie mamy technicznej możliwości sprawdzenia ich wiarygodności, bo takie potwierdzenie musiałoby pochodzić od autora włamu, a to, czy wierzyć autorowi włamu, musicie rozważyć we własnym sercu.

Technologia wkradła się tak gwałtownie do życia ludzi, że w zbiorowej świadomości istnieje nadal jako coś, co ma znamiona magii. Kiedy ktoś słyszy, że dane pochodzą wprost z bazy danych, to brzmi jak najmocniejsze zapewnienie. Baza danych to kamień, na którym zbuduje swój kościół. Gdyby ludzie znali podbrzusze technologii, wiedzieliby, że to nie magia, a kuglarstwo. Podwójne dno w kapeluszu, znaczone karty i odwracające uwagę gesty.

Technologia jest amoralna, ale jej zastosowanie nie. Dlatego naszym obowiązkiem jako „ludzi od Worda i poziomu atramentu w drukarce” jest tłumaczenie nowej rzeczywistości, w której przyszło wszystkim żyć.

Coś, co mogło być kiedyś tematem na thriller technologiczny, dziś, w świecie w którym rządy podkładają sobie nieprzyjemne oprogramowanie, zaczyna być codziennością. Dlatego jestem za ograniczeniem zaufania elektronicznych artefaktów życia społecznego. Do pokonania tego progu rozwoju potrzebujemy więcej edukacji, lepszych narzędzi i pewnie lepszego społeczeństwa. Tymczasowym rozwiązaniem (wobec brak wcześniej wymienionych czytelników) jest rozwaga i sceptycyzm.

  1. mogę się mylić, że chodzi o tę konkretną sprawę, to było lata temu i nie jest kluczowe

Zbieractwo: Holes in your pocket

Zbieractwo wszelkiego rodzaju niesie ze sobą konekwencje. Do niedawna musieliśmy się borkykać z pułapkami zastawianymi na nas przez rzeczywistość: „gdzie to wszystko upchnąć?”.

Amator statków w butelce mógł ich zgromadzić tylko tyle, ile miał dostępnej przestrzeni. Kiedy odwiedzający znajomi muszą przesunąć pół marynarki wojennej żeby skorzystać z ubikacji, na horyzoncie pojawia się perspektywa interwencji. To wbudowany w zbieractwo hamulec, zaciągany przez bliskich lub administrację budynku.

Wszystko zmieniło się wraz z postępem technologii. Dzięki, technologio. Teraz zbieracz może kolekcjonować wszystkie animowane GIF-y z kotami, przepisy kulinarne i odnośniki jakie tylko przewiną się przez ekran. Eldorado dla fanów gromadzenia cyfrowego gruzu, gdzie nikt nie sądzi cię na podstawie katalogu „pobrane”.

Niby nic w tym zdrożnego, co komu szkodzi, że mam kilka gigabajtów instrukcji i schematów do C64 na zawsze uwięzionych w Dropboksie? Kiedyś je przeczytam, ręka na moim czarnym sercu.

Moje ulubione powiedzonko o prokrastynacji idzie tak: z prokrastynacją jest jak z masturbacją, frajda jest, ale na końcu nadchodzi czas na refleksję, sam się wyruchałeś. Co to ma wspólnego z e-chomikowaniem? To ta sama natychmiastowa gratyfikacja (odłożyłem ten artykuł o bardzo ważnym problemie programistycznym) wywodząca się z budowanie własnego obrazu człowieka, który czyta ważne rzeczy.

To odpowiednik magazynu opinii rzuconego na stolik w salonie, nie służy on do czytania, ale jako sygnifikator kulturowo-klasowy. Jego bracia i siostry z poprzednich tygodni są już wyściółką dla kuwety, w tym wygrywają ze zbieractwem postępowym, przydają się nawet w drugim obiegu.

Weźmy moją przyjaciółkę, Lan. Oboje uwielbiamy aplikację Pocket, pozwalającą na archiwizację napotkanych w sieci artykułów. Opcja przetwarzani ich w wersje pozbawione dekoracji i dostęp offline znacząco poprawiały moje samopoczucie w ostatnich latach, gdy dużą część czasu przebywałem pozbawiony dostępu do Internetu.

Pocket ma też wygodną opcję dzielenia się znaleziskami. Jedno kliknięcie i już cyfrowy odpowiednik statku w butelce pojawia się na ekranie ofiary. Używam go tak często, jak mogę.

Różnica między mną a Lan jest następująca: jestem pozbawiony skrupułów. Jeżeli patrzę na tekst drugi raz i nie mogę przebrnąć przez lead in to bezceremonialnie go kasuję. Ona je trzyma. Za każdym razem kiedy wysyłam kolejny tekst, odczuwam ukłucie wyrzutów sumienia. Znów dokładam się do jej nieszczęścia, kolejny tekst na wieki uwięziony i omijany, walczący o uwagę z setkami innych.

Zażartowałem kiedyś, że napiszę programik, który przyjdzie i wyrzuci jej wszystko, co jest stare. Nie można wierzyć osobom uzależnionym, potrzebny jest zewnętrzny arbiter. Arbiter powinien być arbitralny, pozbawiony emocji, więc najlepiej zaprogramowany.

Po raz kolejny technologia pozwoli mi rozwiązać problem stworzony przez technologię!

Minął tydzień, potem drugi. Aplikacji nie pisałem, gdyż jestem rzemieślnikiem programowania, a kto to widział żeby rzeźnik po powrocie do domu podcinał gardła dla zabawy. Kiedy wreszcie udało mi się zebrać, Lan powiedziała, że odmawia! No ładnie. Nie pozostaje mi nic innego jak zaofiarować go innym, potencjalnym ofiarom.

Holes in my pocket, kliknij, gdyż link.

Zasada funkcjonowania jest prosta. Autoryzujemy się, sprawdzam, czy są jakieś teksty, które są starsze niż 30 dni i oferuję archiwizację. Klik i poszły. Dodałem też możliwość cofnięcia tej procedury dla tych, co się poddali i chcą znów zboczyć ze słusznej ścieżki.

W ramach podkręcenia ironii w tekście o czyszczeniu kolejki Pocketa: używasz IFTTT i Pocket? Pozwól mi dołożyć się do chaosu.


Jeszcze prawie trzy kilometry, mam czas sobie to zapisać

Jest poniedziałek, więc wracam spacerem do domu. Przynajmniej ja to nazywam spacerem, dla innych perspektywa pijackiego marszu przez osiem kilometrów nazywa się inaczej, bardziej złowieszczo. Niestety, pochodzę z rodziny, gdzie miejską legendą jest kartka, którą mojej babci zostawił ojciec i wujek w wigilię wakacji:

„Mamo, poszliśmy nad morze.”

Przejść się nad morze jest ciężko, zwłaszcza z Łodzi, ale się przeszli. Kim bym był, gdybym dosiadał nocnego autobusu, kłaniał się automatom biletowym?

Zupełnie jednak nie o tym chciałem: idąc tak myślałem. Głównie nad pierdołami, ale jakoś tak z boku zaszła mnie myśl o ulicy Ogrodowej jako metaforze ostatnich 20-tu lat zmian ogólnie.

Ulica Ogrodowa w Łodzi była zawsze kłamstwem. Jedyną rzeczą, która miała jakikolwiek związek z ogrodami, były dwa — przylegające do siebie — cmentarze, gdzieś w jej środku.

Poza tym była to łódzka ulica do szpiku kości. Z jednej strony mocne kamienice, bramy pełne twardych ludzi, a głębiej, obsrane przez psy podwórka, duszne od dymu tanich papierosów palonych przez babcie-wrony, obsiadające krzywe ławki, które opowiadają jak im było lepiej za Stalina.

W jednej z takich bram napadli mnie kibice ŁKS-u. Co jest jedną z większych życiowych zagadek dla mnie: będąc kibicem tego klubu przez całą swoją stadionową karierę napadali mnie tylko ełkaesiacy.

Skopali mi plecak w którym niosłem twardy dysk. Kiedy kilka dni później udało mi się ich dopaść z grupą kolegów, w ramach akcji odwetowej, wytłumaczyli mi dlaczego:

„Na chuj nosisz po mieście koszulkę Amica (Wronki)?” 1

Polonistka miała rację, co do zagrożeń, które niesie ze sobą upadek czytelnictwa. Na koszulce było „Amiga”.

Po drugiej stronie ulicy stała fabryka. Wielka, zasłaniająca słońce mieszkańcom kamienic, zimna, martwa, zakurzona.

Fabryka kiedyś musiała coś produkować, ale ciężko było sobie wyobrazić, co można produkować mają do dyspozycji taką przestrzeń. Ile tam musiało wejść komputerów osobistych w dziewiętnastym wieku?

Dumając nad swoją przyszłością, siedząc w jednym ze szczytowych mieszkań kamienicy, gdzie mieliśmy swoją nerdowską melinę, nie mogliśmy pominąć fabryki. Co w przyszłości będzie z fabryką?

Wiadomo, w fabryce będą koncerty techno, gdzie kurz będzie strzelał spod butów rejwerów, jak na “No Good” The Prodigy. A po północy piętra będą przejmować pancerni gabbrzy i deptać deski ciężkimi buciorami.

To miało sens. Powiedziano nam, że będzie lepiej, a jak może być lepiej niż kilometry kwadratowe skaczących, szczęśliwych ludzi? Miało kompletny sens.

Teraz fabryka wreszcie żyje: klinkierowa cegła chroni hotelowych gości przed estetycznym dyskomfortem. Na dachu jest przeszklony basen, z którego okna-dna machają do spacerowiczów pływacy.

I to jest metafora, w tym sensie, że wszystko jest lepiej, jeśli mierzyć obiektywnie, ale zupełnie inaczej, niż sobie wyobrażałem.

Tak jakbym leżał rozciągnięty na podłodze, masują szczękę, kiedy po rozłożeniu planszy do gry w warcaby, drugi gracz wyciągnął figury szachowe, by zaraz po ich ustawieniu przywalić mi prosto w ryj: techniczny knockout.

Po prostu nikt nie wiedział w co gramy.

  1. taki klub piłkarski

3.5mm do nieba

W drodze do Olki postanowiłem zatrzymać się w jakiejś knajpie i wrzucić coś do wielkiego, pustego brzucha. Wybrałem lokal, wpakowałem się, złożyłem zamówienie i usiadłem.

Podkręciłem głośność słuchanego podcastu, a z plecaka wyciągnąłem laptopa żeby napisać Olce e-maila o potencjalnym spóźnieniu.

W polu mojego widzenia pojawiła się damska ręka, podniosłem głowę i zobaczyłem kelnerkę, która przyjmowała zamówienie. Przyniosła narzędzia kulinarne: nóż, widelec, talerz. Kiedy przesunąłem szybko rzeczy na bok i podziękowałem, nadal w słuchawkach, usłyszałem że Pani mówi coś do mnie.

Zsunąłem słuchawki.

— Przepraszam bardzo – powiedziała – czy mogę zobaczyć te słuchawki?

— Eeee… Tak? – ściągnąłem je i podałem pytającej dziewczynie, która podsunęła sobie krzesło do mojego stolika.

Przez chwilę przewracała je w dłoniach by po chwili wsadzić je na głowę.

— Proszę coś puścić.

O jeżu malinowy: coś puścić? Z moich list odgrywających? Co? Słowackie ska, japoński hip hop, polski dżez? Czyżbym padł ofiarą własnego gustu. 1 Będę się musiał wytłumaczyć czemu wokalista krzyczy do akompaniamentu trąbek?

Leciałem w dół listy utworów, a po osiągnięciu końca odbijałem się znów ku górze. W tym czasie komitet testowania moich słuchawek: sztuk jeden, czekał spokojnie.

Wreszcie wybrałem coś, co wydawało mi się mało krępujące i kliknąłem plej, patrząc w stół podczas gdy komisja testowała.

Co trzeba wiedzieć o tym spacerze, dla pokreślenia tego, co nastąpi za chwilę: wracałem ze spotkania, gdzie śpiewano peany na temat moich technologicznych zdolności. Jestem raczej skromnym człowiekiem, ale potok zapewnień o tym jak ważnym trybikiem w świecie e-maszyn jestem wreszcie przecisnął się do mojej świadomości.

Słuchawki wylądowały na stole, a pani uśmiechnęła się do mnie i powiedziała, że całkiem dobre. Ucieszyłem się, że ktoś docenia mój zakup, który wykonałem metodą „ile mogę wydać, bo poprzednie się urwały”.

I wtedy się zaczęło, ta bardzo przystojna, pewnie z 15 lat ode mnie młodsza, blondynka zaczęła wymieniać listę parametrów, które rozważa podczas zakupu następnych słuchawek.

Było o paśmie przenoszenia i o Ohmach, gdzie wtrąciłem jak kretyn, że „wiem, co to są Ohmy!” tylko po to by dogonić kompletnie uciekającą mi dyskusję o technologii, co było lekką nowością. Zwykle mogę przynajmniej kreatywnie udawać.

Kiedy usłyszałem o relacji głośności, rezystancji, potęgach dwójki, typach wyciszenia i trendach na rynku postanowiłem uznać się za kompletnie pokonanego i powtarzałem tylko: „Uhu”, „Ehe” i „Nie wiem, prze pani, ja tylko podkastów słucham…”

Kiedy werbalne lanie się skończyło, Pani jeszcze raz uśmiechnęła się do mnie i poszła do kuchni po mój obiad.

Patrzyłem się w pieczarkę na talerzu i myślałem, że przynajmniej ona wie jeszcze mniej niż ja o akustyce.

Ale tylko ja będę musiał z tym żyć.

I ją zjadłem.

  1. Hipster detected

Game Days 2015: tête-à-tête

IMG_8439_M

Ludzie

Pod koniec mojej rozmowy z jedym z gości naszego piętra pełnego starych komputerów zostałem zapytany, czy jestem może pracownikiem “CD-ACTION”. Pytanie nie było strzałem z biodra, po sali kręciło się kilka osób w ich koszulkach. Zaprzeczyłem, a wtedy dopytał mnie, czy w takim razie jestem jakąś „ważną indywiualnością”. Zaprzeczyłem ponownie, bo przecież nie jestem. Pan odszedł, a ja wróciłem do tańca między biurkami, na których spoczywały lata historii technologicznej. Tej znanej szerzej i tej kompletnie nieznanej.

Zanim pójdę dalej, muszę się do czegoś przyznać. Nie lubię ludzi. Znaczy ogólnie ludzi jako takich — tak, jestem nawet fanem ludzkości, ale gdy są dookoła mnie en masse, zaczynam robić się niespokojny. Rozmawianie z obcymi ludźmi zwykle wysyła mnie do piekła zdenerwowania: czy jestem zziajany? A jak powiem coś głupiego? Czy czuć ten ostatni papieros w moim oddechu, a może rozpiął mi się rozporek? Nieustająca karuzela wątpliwości aż do mdłości.

IMG_8378_M

Przypadłość ta powoduje, że jestem zwykle bezużyteczny jako organizator, sprzedawca siebie i swoich pomysłów oraz „człowiek warty zapamiętania”. Jeżeli ludzie mają personal brand, to ja jestem “TESCO VALUE”.

Kiedy kolejna fala gości opadła i wycofała się do innych pokojów, zdałem sobie sprawę, że wykonałem niesamowite postępy w byciu normalnym człowiekiem. Zaskoczony tym sukcesem postanowiłem głośno (ale we własnej głowie), że może nie jestem ważną osobistością zwykle, ale stojąc na tej pododze, wśród komputero-archeologicznych eksponatów, pełnię bardzo ważną funkcję: jestem klechą tego kościoła.

A ludzie, którzy do niego przychodzą, chcą się wyspowiadać i uzyskać odpuszczenie.

Przeszłość w naszej głowie to wyidealizowany obraz ludzi o przekłamanych charakterach oraz kaców, które nie były straszne, choć były. Nikt nie jest pewien, czy „tak rzeczywiście było”. A ja, jak każda religijna instytucja, dostarczam im pewności.

Tak, była taka gra. Tak, Amiga była najlepszym komputerem. Tak, C64 był najlepszym komputerem. Tak, gry wczytywały się tyle czasu. Nie, gry wczytywały się szybciej.

Niczym dickensowski duch świąt przeszłych pokazuję ludziom, jak wyglądał świat, zanim zdziczeli, dorośli.

No i rozgrzeszam.

Przestawiałem głowicę w magnetofonie. Kiedy grałem z kolegą, zawsze dawałem mu gorszy joystick. Do tej pory nie oddałem pożyczonej kopii tego a tego.

Pokuty nigdy nie są ciężkie, partyjka w Space Invaders, rundka w Cannabalt na C64. Za najcięższe występki karzę grą w Lotus Turbo Esprit III na Atari ST na dwóch graczy.

Pojawiają się czasem biskupi, którzy bez mojej interwencji zajmują miejsce przy komputerze i wprawnym ruchem uruchamiają swoją ulubioną grę, a po kilku rundkach wstają, potakują mi zza stołu i przechodzą dalej. Raz zawitał nawet papież — instalator i programista komputerów Odra. Ucałowałem jego token-ring.

IMG_8601_M

Gry

U mnie z grami jest tak, że wiem tylko jakie mi się podobają. Podobają mi się głównie te, które już znam i managery piłkarskie, choć do nich nie mam już cierpliwości.

Obserwując dziesiątki ludzi w różnym wieku, różnych płci i różnego, już nabytego, zainteresowania komputerami dokonałem destylacji własności i funkcji gry doskonałej.

Aby skoczyć, skocz

Żadna z często wybieranych gier nie posiadała części „uczącej”. Nauka zasad wynikała z gry. Pewna Pani po którymś kolejnym nabiciu się na miecz strażnika w Prince of Persia zrozumiała, że należy się uzbroić.

IMG_8404_M

Dwóch graczy, jedna konsola

W świecie, gdzie gry z trybem multiplayer drukują miliony dolarów wydawcom, świat zapomniał o tym, że można podłączyć więcej niż jeden kontroler i grać razem na jednym ekranie.

Kiedy ktoś z silnym rosyjskim akcentem powie Ci przez słuchawki, że sypia z Twoją matką odpowiesz najwyżej wzruszeniem ramionami. Kiedy ktoś siedzący obok Ciebie powie Ci to samo odczucie jest dużo intensywniejsze. Zwłaszcza, gdy grasz z Ojcem.

IMG_8414_M

Co świeci, co buczy, nie bawi, nie tłuczy

Space Invaders na ośmiobitowym Atari było jednym z hitów wystawy, tak wśród młodych jak i starych. Gra prezentuje się na zielonym monitorze Neptun jak produkt jelita obciążonego szpinakiem, a brzmi jak wypadek w którym udział brał TIR pełen tablic szkolnych uderzający w salon urody z dobrze zaopatrzonym działem sztucznych paznokci.

Nikt nie powiedział złego słowa o tym fakcie, wszyscy zajęli się eksterminacją najeźdźców.

IMG_8490_M

[Tu wkładam bezwstydnie reklamę właśnie powstającej książki o projektowaniu gier „Inżynieria Gier. Level design dla początkujących”.]

Podsumowując: trudna gra na dwóch graczy, w którą grasz z Tatą, wyglądająca jakkolwiek, którą przegrywasz non-stop dzięki krępującym wrzutom rodziciela.

Podziękowania

Chciałbym serdecznie podziękować „Muzeum Historii Komputerów i Informatyki” za zaproszenie nas do wzięcia udziału w Game Days, gościom za znoszenie mojego nagabywania do dania C64 szansy oraz Irze i Piotrowi Poterze oraz Tomaszowi Marcinkowskiemu za odtworzenie atmosfery kolonijnego pokoju: od picia alkoholu w łóżku po śmianie się z tego, że ktoś pierdzi pod kołdrą. Póki człowieka śmieszy pierd po 29h pracy skondensowanej w dwa dni póty jest nadzieja, że ten świat nie jest skazany na zagładę.

Zdjęcia: Ira Potera


Retroboat 2015: widok z okopu

Piotrek jest organizatorem. Ciężko jest żyć z organizatorami, ciągle coś wymyślają, a ich filtr samokrytyki bywa przykręcony w okolice zera. Nasza znajomość polega na tym, że on wymyśla, a ja mu skreślam. Jestem osobistą kotwicą hamującą jego transatlantyk, bo z mojej pozycji często widać, że na burcie napisano „Titanic”.

W zeszłym roku zasugerował, że moglibyśmy przejąć jedno z muzeów podczas corocznej imprezy kulturalnej. Potakiwałem, wiedząc, że przy takiej rozbiegówce pomysł rozmieni się na drobne, a te drobne wydamy na piwo.

Niestety, ku mojemu zdziwieniu, dzień po zamknięciu listy instytucji chcących uczestniczyć w wydarzeniu, Piotrek zerwał się z miejsca i zaczął organizować.

Między e-mailem do jednej łódzkiej firmy, odbieraniem banerów i gadżetów (mój faworyt to składany karmnik dla ptaków), e-mailem do drugiej firmy i logistyką wymęczoną jak my sami, okazało się, że jednej nocy mamy stanąć na trzecim piętrze Muzeum Włókiennictwa. Mamy odpalić te wszystkie wspaniałe komputery z naszej młodości, które tyle nam dały, których radością z obcowania chcieliśmy się podzielić. Ktoś miał też przynieść Atari.

Będąc cynikiem, a cynikiem nie stajesz się genetycznie, tylko przez doświadczenie, spodziewałem się że nasza praca zaowocuje liczbą gości policzalną na palcach wszystkich organizatorów.

Około 18:00, chwilę po podłączeniu ostatnich maszyn, muzeum szykowało się do otwarcia wrót. Ktoś poszedł sprawdzić sytuację i wrócił, obwieszczając, że dzicz stoi pod bramą, gotowa na realizację naszego statutowego założenia wystawy: „proszę dotykać eksponaty”.

Osiemset to była przesada. Obserwator pewnie nigdy nie był na imprezie masowej i liczył, używając takich pojęć, jak grupka, wiele, liczba Dunbara, ponad osiemset, nieprzeliczalne. Nie żeby jego dokładność cokolwiek zmieniła — do pustej sali wlał się tłum ludzi, którzy natychmiast zasiedli przed komputerami i domagali się żeby odpalić im dokładnie tę grę, której nie dali rady 25 lat temu. Poczułem się trochę jak poeta na wieczorku poetyckim, tylko z widownią złożoną z ludzi innych niż poeci i znajomi.

Ludzie

Tłum wijący się dookoła mojego sektora wypluwa w moim kierunku dwie kobiety prowadzone przez współorganizatora.

— Proszę pana, taka gra, facet w kapelusiku skakał przez czaszki…

Montezuma’s Revenge?

TAK!

— A taki samolocik, co leci do gó… — wtrąciła się druga.

River Raid?

— Wow — powiedziały obie.

Trzydzieści pięć lat marnowania życia wreszcie wypłaciło dywidendy w endorfinach.

Potem przy Amidze 1200 sadzam panią z córką i pytam małą, w co chciałaby zagrać. Pani mówi, żebym wybrał jakąś grę „dla dziewczynek”. Odpowiadam jej, że wszystkie gry są dla dziewczynek, i wkładam dyskietkę z Ruff’n’Tumble.

Sodarówna

* * *

Byłem zbyt zajęty, żeby znaleźć w tym rozgardiaszu spójną narrację. Mam tylko obrazki.

* * *

Ktoś zostawił na A3000 odpalony Mortal Kombat II. Siada do niego dwójka znajomych, jeden z nich w towarzystwie dziewczyny. Pojedynek za pojedynkiem, pojedynek za pojedynkiem. Dziewczyna kładzie głowę na blacie, a jej szare oczy powtarzają bezgłośnie w kierunku (prawdopodobnie) chłopaka: „Serio? Serio, serio?”.

Po jakimś czasie odchodzą, by wrócić po mniej niż godzinie. „Odpali nam pan Mortala?”. Odpalam i znów mam zero na karmicznym rachunku z płcią piękną, bo dziewczyna kładzie się na blacie, ale tym razem ja jestem ofiarą jej wzroku.

MKII

* * *

Obok stoi Mak. Odpaliłem na nim Quake’a, bo to zawsze pewny magnes. Karuzela na krześle trwa, a ja, kiedy tylko zauważę nową osobę, krzyczę, że „nie wasd, tylko strzałki, bo ktoś nie bindował”. Rozważam nawet przestawienie, ale jestem zbyt zajęty. W czwartej godzinie znajduję dziewczynkę, ma może siedem lat, która kręci kursorem dookoła ekranu.

Podchodzę, witam, mówię o strzałkach.

— Nie, nie. „w” się idzie. — dla potwierdzenia wciska „w”. — Boję się tylko zejść po tych schodach, bo jest ciemno.

Koryguję gammę.

* * *

Pani z wózkiem woła „czy ktoś chce zagrać z moim mężem w Sensible World of Soccer?”.

W mojej głowie przetłumaczyło się to na „Kto chce lanie od Emila”.

On mnie pyta, czy można grać na klawiszach. Odpowiadam, że na Amidze nie można, ale nie ma różnicy, bo nie jestem za dobry. Gramy FC Parma (ja) i Czerwone Diabły (on). Strzelam mu pierwszą bramkę w trzy sekundy po gwizdku. Potem następną. Cantona zmniejsza rozmiary porażki.

Bierze ode mnie wizytówkę żeby się kiedyś ustawić na granie.

* * *

Godzinę po rozpoczęciu wszystkiego rozlega się huk. Ira włączyła czajnik żeby zrobić nam kawy. Czajnik wyłączył bezpiecznik. Dziesięć minut biegania i wyginania rąk, pełzania pod ławkami, przerzucania przedłużaczy nad ozdobnymi, przeszklonymi drzwiami oddzielającymi nas od sztuki właściwej.

* * *

Coraz bliżej końca. Palę papierosa i rozmyślam, czy nie włączyć znów czajnika, sabotując swoją własną pracę. Macham jednak ręką i czołgam się w kierunku lobby. Drugimi drzwiami nadciąga Pan i Pani oraz gromadka dzieci.

Oni patrzą na mnie, ja na nich. Oni są zmęczeni, ja jestem zmęczony. Pada uwaga do stadka ludzkich szczeniaków: to ostatnie miejsce, najwyżej pierwsze piętro!

Odwracam się po pokonaniu kilku schodów i przemawiam:

— Proszę Państwa, zapraszam Państwa na trzecie piętro, gdzie są komputery!

Tłum dzieci zbił się w kupę a potem eksplodował w węża, którego wszystkie głowy krzyczały „Jeeee, komputery” kiedy wspinały się po schodach. Opiekunowie podążyli.

Nigdy więcej nie będę cierpiał sam tej nocy.

Konsole

* * *

Jest pierwsza ileśtam. Strzelają korki szampanów, rozmawiamy z dyrektorką muzeum. Jest zadowolona, jesteśmy zadowoleni. Pomagam trochę pakować, ale ledwie już stoję na nogach. Idę na pieszo do domu.

O drugiej siadam za biurkiem i otwieram piwo. Włączam Dragonball Z. Jestem zbyt zmęczony by zasnąć.

Tak samo o piątej.

Usypiam o wpół do szóstej. Wstaję o dziesiątej, nie mogę się ruszyć, ale mam jeszcze 365 dni żeby odpocząć.

Oranizatorzy

Za udział się wzięli(od lewej): moi, Krzysiek Chwałowski, Kamil “OSH”, Przemek Wrona, Tomasz “Alt_” Marcinkowski, Michał “mwb113”. Dół: Piotr & Ira Potera.

Częściowa kurekta: Kaja Zdjęcia: Ira Potera.


Złe słowa

Kiedyś usłyszałem cytat, oczywiście nie pamiętam czyj, o tym, że polscy pisarze mają przekichane z pisaniem o seksie. Mamy albo język rynsztokowy, albo język medyczny. Można też użyć kulawych porównań i namalować obraz kobiety dosiadającej jednookiego rumaka, ale trudno się nabrać na rozpustę, czytając jedną ręką. Druga zakrywa usta przed wybuchami śmiechu.

Podobnie ma się sprawa z przyganami, połajankami i przytykami. Możesz być częścią genitaliów lub wieść żywot medycznie skomplikowany. Kiedy przekrzykujemy się podczas dramatycznych rozmów o życiu, sztuce i sensie życia, adwersarz jest głównie chujem lub kretynem, do tego czyta autorów, którzy są w poszanowaniu tylko głupich pizd.

A to smutek jest i rozpacz. Dorobiliśmy się przecież więcej niż kilku słów, którymi można przywalić w wyżej wspomniane genitalia językiem. Oj, chyba się zapędziłem.

Oto wyimki z opisów zmyślonych wydarzeń stworzone przez wyimaginowanych autorów. Aby uchronić fantomowych pisarzy, zmieniliśmy im imiona na brak imion.

— W dzisiejszym wystąpieniu premier omówił nową ustawę o czystości języka polskiego. Ustawa ta mogła zostać napisana tylko przez kogoś, kto w głębi duszy jest chuliganem ciskającym kamieniami w wystawy kultury wysokiej. Tylko rzezimieszek wysokiego kalibru śmie podnieść rękę na wolnorynkowe prawo do „adresowania poprawek”, które to prawo wywalczyła sobie blogosfera technologiczna krwią, potem i lokowaniem reklam.

— Prawdziwą ozdobą ostatniego występu naszych piłkarzy była samobójcza bramka strzelona z animuszem przez obrońcę–niezgrabę. Jak prawdziwy szabrownik pola karnego skradł swojej własnej drużynie bramkę, która może nie odbierała nam szansy na zwycięstwo czy nawet remis, ale zwiększyła rozmiary porażki. Po meczu trener gości potwierdził, że zawodnik jest pacanem, ale o złotym sercu, które zostanie mu usunięte operacyjnie i sprzedane celem pokrycia roszczeń.

– Kanclerz Niemiec wyraziła ogromne zdziwienie, kiedy jeden z goszczących dyplomantów powiedział, że dzieci protestujące we Wrześni to były zwykłe huncwoty. Trzeba było się uczyć języków, Panie dyplomato, a tak wyszedł Pan na obwiesia i prostaka.

– W wywiadzie udzielonym gazecie znana autorka poezji śpiewanej dała upust swojej niechęci do nowego porządku świata w następujących słowach: „Młodzi ludzie to teraz tylko nicponie i ancymony. Słuchają afroamerykańskiej muzyki, robią hałas, jeżdżąc na zmotoryzowanych rowerach, czytają poezję tylko w Krytyce Politycznej, gagatki. Mówię im, żeby zaśpiewali mi o Bieszczadach, a jeden z drugim urwisem robią tylko miny i pokazują mi gangsterskie symbole na palcach. Jan Paweł II nie chodził po Bronksie.”

— Znany chwalipięta, gangster S., okazał się być skarżypytą, co jest strategią złą lub wręcz fatalną, jeśli człowiek otacza się rozrabiakami, łapserdakami i ludźmi, którzy lekko opacznie rozumieją moralność i są uzbrojeni. Na pogrzeb gagatka nie trzeba było długo czekać.


Przypowieść o otwartych okienkach

Kiedy Indianie chcieli więcej bawolego mięsa, zabijali dwa zwierzęta, zamiast szukać jednego wielkiego. Kiedy w świecie mikroprocesorów wojna megahercowa przygasała na dobre, bo osiągnięto już górną granicę miniaturyzacji, a przyśpieszanie cykli zegara powodowało już tylko efekt cieplny, projektanci sięgneli po asa w rękawie: zwiększono liczbę rdzeni.

Siedziałem na fotelu i rozmawiałem z przyjacielem. W jego pokoju przewalają się góry starych komputerów. Amigi, Commodore’y, Apple jeszcze sprzed ery powrotu Jobsa, a nawet takie wydane chwilę przed jego przepędzeniem. W takim otoczeniu myśli naturalnie zwracają się ku technologicznej przeszłości. Oczywiście ludzie zapatrzeni wstecz, jak my, gloryfikują rzeczy zaszłe i patrzą ze sceptycyzmem na rozwiązania nowe. Tak też dobrneliśmy do tematu „Commodore 64 był gotowy do pracy w sekundę po włączeniu, a mój Mac bootuje się minutę lub dwie”. To jedna z tych dyskusji, że kiedyś Pink Floyd, a teraz tylko biali raperzy znad Wisły — pełna kłamstw, przymykania oka i wybielania przeszłości.

Padło pytanie: mam cztery rdzenie, a mój komputer nie działa cztery razy szybciej, jaki jest sens?

Moje wytłumaczenie było pokrętne, potrzebowałem nawet kartki, żeby narysować kilka strzałek wskazujących prostokąty.

W świecie technologii rzadko rzeczy dodają się jak w matematyce. Indianie wybrali dwa bizony, ale zabicie dwóch bizonów wymaga lepszej organizacji, narzędzi, no i odrobiny szczęścia. Tak samo jest z rdzeniami.

Do wyjaśnienia sytuacji użyjemy mojej podstawowej broni — analogii. Analogie są jak ryby w beczce, stłoczone, niedługo skończy im się tlen i jeszcze ktoś próbuje je zastrzelić z niewiadomego powodu. Moja będzie idealnie niedokładna i podniesie ciśnienie oraz włosy ludziom, którzy odebrali edukację w programowaniu.

Wyobraźmy sobie Urząd. Każdy z czytelników może sobie wybrać dowolny, na myśl o którym cierpnie mu skóra. Urząd ma kolejkę petentów i okienka, w których są obsługiwani.

Na początek mamy kolejkę ludzi z podaniami i jedno otwarte okienko. Petent podchodzi, wyjaśnia sprawę i otrzymuje pieczątkę. Im pracownik okienka lepiej obeznany ze sprawami Urzędu, tym szybciej topnieje kolejka.

Proste.

Po kilku godzinach otwiera się drugie okienko. Ludzie przechodzą więc do tego, które akurat jest wolne. Jaki będzie czas obsługi kolejki? Krótszy o połowę? Tak, ale w sytuacji, kiedy obaj pracownicy Urzędu posiadają tę samą wiedzę. Jeżeli drugie okienko jest obstawione przez praktykanta, który musi skonsultować sprawę co któregoś klienta z literą prawa, przynajmniej jeden z czekających utknie w okienku.

A co się dzieje, jeśli wykładnia prawa nie jest jasna i pracownik drugiego okienka musi co pewien czas zasięgnąć języka u swojego kompetentnego kolegi z okienka pierwszego? Wtedy mamy dwie osoby tupiące nogą. Przy odpowiednio wysokim współczynniku nieszczęścia klientów otwarcie drugiego okienka może dać odwrotne rezultaty, niż pryncypał Urzędu miał na myśli, podejmując decyzje o dołożeniu drugiego rdzenia… czy też pracownika.

Analogia druga.

Oto pudełko puzzli. Ma 2048 elementów. To ładna, okrągła liczba. Układasz je więc i kończysz w n-czas + tyle, ile zajęło Ci dopasowanie tych cholernych kawałków nieba.

Oto drugie pudełko, które zawiera tyle samo elementów. Tym razem masz jeszcze trzech gości, którzy postanowili pomóc Ci w układaniu, ale są strasznymi introwertykami i każdy chce układać w swoim kącie. Na środku leżą wysypane części, a co jakiś czas każdy bierze kilka i próbuje je dopasować do swojego kawałka.

Bez wątpienia zdarzy się, że ktoś podbierze element potrzebny w Twojej części układanki. Jeśli zauważy szybko, że nie ma gdzie wstawić głowy ptaka, zapyta głośno o osobę, która potrzebuje tego właśnie kawałka. Cztery osoby przerwą układanie i po naradzie ptasi dziób trafi w odpowiednie ręce. Kiedy wszyscy skończą, trzeba jeszcze zebrać się razem i dopasować Wasze mniejsze części w całość. Niech bogowie Was chronią, jeśli ktoś spędził zbyt wiele czasu w ubikacji i jest teraz opóźnionu w stosunku do reszty. Trzy czwarte układanki to zero układanki. Czekacie więc, aż maruder Was dogoni.

Chyba że macie gorszy pomysł i dzielicie się pozostałymi kawałkami, próbując mu pomóc. Teraz spowolniliście spowolnienie.

I co z tego?

Tak jak dziewięć kobiet nie urodzi dziecka w miesiąc, tak większa liczba dostępnych rdzeni w Waszym systemie nie będzie magicznie oznaczać przewagi. Wiele problemów w programowaniu stawia solidny opór przed rozbiciem na kawałki, którymi można zająć się indywidualnie i potem zestawić w całość. Już kilka razy w swojej programistycznej karierze próbowałem zmierzyć się z takimi problemami. Zwykle osiągam tylko zwiększoną komplikację i prawie zerową korzyść w szybkości przetwarzania. Może to mówi więcej o moim talencie programistycznym niż o samym problemie, ale nawet bardziej utalentowani ludzie, patrząc na używane zazwyczaj przeze mnie narzędzia, podchodzą do sprawy z pewną rezerwą, a czasem nawet niechęcią.

Czy dobrze jest mieć więcej niż jeden rdzeń? Oczywiście. Nawet najbardziej idiotyczne, jednowątkowe programy zyskają na tym, że te mniej idiotyczne nie muszą się z nimi dzielić czasem. Jednak jak już powinniśmy byli nauczyć się z historii, magia liczb, które wyciągają z kapelusza czarodzieje-marketingowcy, nie zawsze idzie w parze z tym, co możemy osiągnąć.

— Proszę kupić nasz nowy samochód: ma siedem kół, trzy kierownice i zero drzwi, ale kompensuje to bardzo obszerny szyberdach!