Béton brut

Jest sobota

Ala Była Całkiem Dziwna,
Emocjonalnie — Fabryka Gniewu.
Harcowała I Jakoś Kurcze
Lepiej Mogła Nawet Odejść.

Prochy. Rozpusta. Seks.

Tak Uwikłana Wykitowała:
Xylofonem 1 — Yyyyh — Zgnieciona.

  1. dajcie luzu, kochani

Ty, ja i fotorezystor

Będzie to historia o kreacji kreatury. Anegdota o mistrzu i uczniu, pełna gorącej cyny i drewnianych biurek z ranami po wiertłach, które ominęły swój cel. Wyjaśnię, skąd się biorą wszelkiej maści giki i jak możesz sobie takiego wyhodować we własnym domu.

Będzie to też laurka dla mojego Ojca, osobistego mitbastera, hakera i szalonego elektronika, który nie przegrywa jak ten od Piotra Fronczewskiego. Wszystkie historie są prawdziwe, każda wydarzyła się w końcówce lat osiemdziesiątych, w małym jednopokojowym mieszkaniu na granicy miasta.

Lewo, prawo. Lewo, prawo.

Matka nie wróciła jeszcze z pracy. Trzyzmianowy system pracy czy też zakładowa impreza. Życie pracownika fizycznego w PRL-u zawsze było wypadkową wódki i trzech zmian. Siedzieliśmy z Ojcem w kuchni i przerzucaliśmy strony “Młodego Technika” lub “Elektrotechnika”. Mogło pojawić się też radzieckie “Radio”. Herbata indyjska, którą wujek pieszczotliwie nazywa “malowanym drewnem” ze względu na smak i wartości, lała się strumieniami. Trzy łyżki cukru i może trochę “koncentratu cytrynowego”, żeby całość nadawała się do spożycia.

Ojciec pochylił się mocniej nad którąś ze stron i postukał palcem. Znak, że jest rzecz godna uwagi. Był to układ zdalnego sterowania, do którego akurat mieliśmy części. Kiedy po pewnym czasie układ został skończony, stwierdziliśmy z żalem, że nie mamy czym sterować. Jak polski rząd: jest układ, nie ma celu.

Matka zastała nas w ciemnym korytarzu prowadzącym do mieszkania. Podskakiwaliśmy i wykrzykiwaliśmy sukces. Wyrywaliśmy sobie małą płytkę z potencjometrem, podbiegali do progu i powtarzali podskakiwanie i krzyki.

Na blacie stołu leżała moja mała wiertarka Piko. Jedyna na świecie wiertarka, której kierunek obrotu silnika można zmienić zdalnie. Bezsensowna radość tworzenia.

Jak w cyrku

Zapytany o to, czym jest gaz, nie potrafiłem odpowiedzieć. Gaz Niemcy chyba rzucali? Takie białe, puszyste? Czy to może być ciężkie? No jasne, że nie może być ciężkie. Ojciec wyciągnął szklankę w pięknym koszyczku z czerwonego plastiku. Sięgnął po zapalniczkę i pokazał mi przelewającą się w niej wodę.

— To jest gaz i ten gaz jest cięższy od powietrza - zakomunikował.

Trzymając zapalniczkę nad szklanką nacisnął języczek. Po pewnym czasie podniósł szklankę i zniżył ją na poziom moich oczu, mówiąc:

— Na dnie leży gaz. Nie widzisz go, bo jest przezroczysty jak powietrze. Nie poleci też nigdzie, bo jest cięższy niż powietrze.

Wiedziałem, że mnie oszukuje. Poruszałem szklanką, jakbym mieszał wino (umiejętność, która przydała się dopiero w przyszłości) i stwierdziłem, że niczego tam nie ma. Ojciec zabrał mi szklankę z rąk, zapalił zapałkę i trzymając ją między palcami “wypił” to, czego nie było w szklance. Kiwnął do mnie głową i dmuchnął w kierunku świeczki kulą pomarańczowego ognia.

Graj mi, piękny cyganie

Wychowując się wśród szkieletów telewizorów, które sąsiedzi znosili do nas na ostatnie namaszczenie, wśród przedłużaczy zrobionych z przedłużaczy, które są z kabla od prodiża, miałem niejednokrotnie okazję być rażony prądem. 1 Im więcej wiedziałem o faktach związanych z rażeniem prądem, tym bardziej się go bałem. Stwierdzenia takie jak “elektroliza” i “rozpad czerwonych krwinek” działały strasznie na moją fantazję.

Dlatego też nie chciałem się brać za wynalazek, który podgapiłem w książce kolegi ze szkoły. Był to instrument muzyczny zrobiony z kartki i ołówka. Ostatecznie wybłagałem jeden z głośniczków piezoelektrycznych leżących w szafkach Ojca. Pomazałem kartkę ołówkiem, wpiąłem w jeden brzeg przewód, a do końcówki ołówka przytwierdziłem jego drugą część. Podłączyłem głośniczek do prądu i ku mojemu zdumieniu popłynął dzwięk. Niczym to jednak nie przypominało instrumentu.

Zwołałem konsultacje na najwyższym szczeblu. Dowiedziałem się, że wiele rzeczy przewodzi. Że grafit w ołówku jest właśnie takim przewodnikiem i jeśli porysuję kartkę w jednym miejscu mocniej a w drugim lżej to zmienię coś, co nazywa się rezystancją.

Pierwszy raz mogłem dotknąć oliwkowego miernika. Wiedziałem już wcześniej, że pokazuje on, ile prąd może. Teraz okazało się, że przestawienie na tę rozszarpaną od spodu literę O mierzy ile prąd nie może.

Na koniec dnia wiedziałem już, że sam jestem przewodnikiem i dlatego prąd lubi po mnie chodzić, choć według wskazań rozerwanego O dużo bardziej wolałby chodzić po kablu.

Czas, czas, czas

Wiele można założyć obserwując człowieka, który wciąga taczkę cegieł na trzecie piętro. “Artystyczna dusza” nie jest raczej jedną z rzeczy, które przebiegają ci przez głowę. I może sam bym nie wierzył, gdybym nie miał okazję widzieć zegarków, które zrobił mój Ojciec.

Nie lubiłem wstawać. Nie lubiłem wstawać, kłaść się, odrabiać lekcji. Lubiłem grzebać, czytać Bajtka i Młodego Technika i udawać gorączkę, żeby móc zostać samemu i oglądać programy przeznaczone dla rolników. 2

Któregoś dnia Ojciec przyniósł mi mój własny budzik. Nie byle jaki budzik, choć umiałem już czytać godziny ze wskazówek, ten uśmiechał się do mnie białą tarczą z małym okienkiem, w którym przesuwały się obrazki. Pomiędzy ósmą a czternastą przewijały się rysunki książek, tablicy. Później słońce, piłka i inne sugestie wolności od zajęć lekcyjnych. Po nich nadchodziło biurko-z-lampką, którego nie znosiłem strasznie. Znaczyło chyba “robienie lekcji”, choć ja głównie używałem go do patrzenia w blat i rozgrywania pojedynków z kosmicznymi najeźdźcami (widziałem już Star Wars: New Hope) we własnej głowie.

To była fantastyczna rzecz. Dwa tekturowe okręgi, okienko wielkości dwóch godzin, drugi okręg zawierał rysunki i był podczepiony do mechanizmu kręcącego godzinową wskazówką. Mechanizm opóźniony o połowę, aby nie było problemu z zwykłą, dwunastogodzinną skalą.

Kilka lat temu znalazłem budzik i próbowałem zrobić kopię. Niestety, okazało się, że można zaszczepić chęć do rozgrzebywania rzeczy, ale zdolność manualna wymaga po prostu treningu. Rozwaliłem go młotkiem po drugim dniu dopasowywania tarczy.

Nie wiem skąd się wziął pomysł na drugi zegar. To chyba jedna z tych nerdowskich rzeczy; kiedy pytasz “dlaczego?”, to znaczy, że to coś nie jest dla ciebie.

Pamiętacie takie masywne, rosyjskie zegarki. Wiem, że “masywne” i “rosyjskie” brzmi prawie jak żart, w takim razie “masywniejsze niż zwykle”; były elektroniczne, miały czerwoną tarczę, która wyświetlała godzinę po naciśnięciu guzika.

Kiedyś jeden z tych zegarków pojawił się na biurku. Za każdym razem, gdy przechodziłem obok, zmieniał swój stan. Stracił pasek. Potem wyskoczył z koperty. Biały plastik utrzymujący elektronikę i kwarc został rozcięty. Przysiadam i oglądam przez kilka godzin, jak Ojciec dolutowuje przewody grubości włosa do wyświetlacza. Grot lutownicy zrobiony z igły. Gdybym wiedział wtedy co to jest “cyberpunk” pewnie powiedziałbym — Niezły cyberpunk, Tato.

Pod wieczór z ekranu zegarka sterczało ponad 60 przewodów. Po chwili na stole pojawiło się coś znajomego. Czarny element ze szkiełkiem, jak do aparatu. Ojciec przez chwilę próbował osadzić wyświetlacz tak, aby był widoczny zza oczka. Kiedy kładłem się już spać słyszałem, jak z szafy sypią się graty. Za chwilę na środku pokoju stanął taboret, a na nim rzutnik do przeźroczy. Ojciec nakręcił soczewkę z zegarkiem i zapalił lampę rzutnika. Cała ściana pokoju zamieniła się w wielki zegarek. Zegarek wkręcony w soczewkę do rzutnika. Kropki sekundnika wielkości mojej głowy. Lekko zielony na białej ścianie.

Kiedy stajesz oko w oko ze sztuką, nie liczysz czasu. Przez godzinę nie liczyłem czasu oglądając jak czas odlicza się na ścianie.

A co Ty?

Ten tekst zaczął się od notatki na kartce: nie płacz, wychowaj sobie gika.

Miał to być oskarżycielski wpisik o tym, że grupa fascynatów nie powinna płakać nad tym, że Apple robi “sklep z aplikacjami” i jak to gwałci twoje prawa do kompilowania kernela. Zamiast lać żółć, zaszczep u innych to, co jest najlepsze w byciu dziwakiem.

Pamiętasz tego jednego człowieka, który podrzucił ci dyskietkę, pożyczył magazyn i może nauczył jak ściągać muzykę za darmo? Tego człowieka, który przyniósł do ciebie swój obrazek, muzykę lub program, który rysował kolorowe paski? Najwyższa pora, żebyś sam zrobił własne giki.

  1. kolokwialnie “kopnięty”, oduczyłem się tak mówić po tym jak na praktykach profesor kopał w tyłek za “kopnąć” i “korki”
  2. przez pewien czas trzymałem rękę na pulsie rynku pasz

Problem strony odwrócony

Po rozwiązaniu wszystkich kluczowych problemów, którymi zajmuje się w obecnej chwili Internet (in vitro, wyklęcia przez lokalnych czarnoksiężników, “przemysł nienawiści”, opodatkowanie podatków, “mord łódzki”) postanowiłem zwrócić swe oczy w kierunku problemu, który dotyka każdego z nas. Chodzi oczywiście o paginację i to, jak obecnie akceptowane rozwiązanie powoduje, że nie da się spokojnie oglądać gołych dup.

Rozważmy standardowego blożka. Blożek wyświetla notatki, powiedzmy, dziesięć notatek. Na dole znajduje się link “Zobacz chopie do tyłu”, który wyświetla kolejne dziesięć notatek. Patrzymy na URI i widzimy, że jest to “strona druga” blożka.

Wizualnie idzie to tak:

Teraz rozważmy książkę, którą piszesz. Czy po napisaniu kolejnej strony nadajesz jej numer jeden i renumerujesz wszystkie wcześniejsze? Nie, to by nie miało sensu, sto pięćdziesiąta strona książki ma dokładnie taki numer. Książkę (hipotetyczną) czytamy od najstarszej napisanej strony do najnowszej strony. Notatki na blogu układa się zwykle w kolejności odwrotnej do daty opublikowania, co powoduje, że czytamy od ostatniej strony do pierwszej. Dlatego też taka paginacja nigdy nikomu nie sprawiała problemu. Ma sens.

Piotr Szotkowski podesłał mi rano stronę z rudymi paniami, utrzymywaną przez Tumblr. Wszystko ładnie i pięknie. Klikam na link i trafiam na http://adres/page/NUMER. Niestety, zdjęcie zostało opublikowane dawno temu, blogi z rudowłosymi publikują bardzo często, trafiam więc na stronę NUMER, która zdjęcia już nie zawiera.

Ujawnił się pewien problem. Do bloga zwykle dokładamy “z przodu” przez co wczorajsza strona dwadzieścia będzie pojutrze stroną czterdzieści pięć. Wysyłanie mnie na konkretną stronę bloga (“zobacz, jaki tu miał dobry okres, z tymi trzema notkami!”) prędzej czy później zaprowadzi mnie na manowce.

Prostym rozwiązaniem, którego nigdy nie widziałem na żywo, byłoby liczenie w drugą stronę. Zakładając, że blogi mało kiedy dodają coś z datą wsteczną i dokładają tylko na kupkę, chcemy żeby strony o identyfikatorach od 1…10 były zgrupowane jako page/1

Jak? Pewnie każdy z Was już wie. Normalnie paginacja to dwie liczby przekazywane do zapytania SQL, a konkretniej do polecenia LIMIT. Pierwszy parametr LIMIT mówi od którego rekordu należy zacząć, drugi ile wyświetlić. Więc:

LIMIT ($PAGE*LIMIT_PAGINACJI), LIMIT_PAGINACJI

a gdybyśmy chcieli liczyć od tyłu (gdzie MAX to liczba notatek):

LIMIT (MAX-($PAGE*LIMIT_PAGINACJI[/ref],LIMIT_PAGINACJI

Przyznaję, że nie jest to idealne rozwiązanie. Jest to jednak wystarczająco dobre rozwiązanie, abym mógł zobaczyć tę rudą, co mi ją Piotrek podesłał rano.


Łódź moim miastem

Hej, koleżko! Słyszałem, że lubisz czytać tego bloga, wstawiłem więc plakat żebyś mógł doświadczać kultury podczas doświadczania kultury.


Prawda dostępu wymagają podstępu

Nieomylność znaczy “nie robię niczego konkretnego”

Napisałem kiedyś na Facebooku, że łatwo rozpoznać aplikację, której UI projektował programista. Wystarczy poszukać, czy kwadrans to 0.25 h. Podśmiewałem się z aplikacji, której demo pokazywał mi marketingowiec. Dwa dni później znalazłem identyczny kod mojego autorstwa.

Programiści nie są głupi, programiści nie są antytalentami, kiedy idzie o projektowanie. Programiści poruszają się w świecie, który ma zupełnie inne punkty odniesień i przez to nie potrafią myśleć “jak zwykli ludzie”. Dla programisty wyłączenie czegoś w panelu przez wpisanie tam zera może mieć sens. Zaawansowane wyszukiwanie przy pomocy wyrażeń regularnych to oczywista oczywistość. Używanie unikalnych identyfikatorów z bazy w kolumnie LP. jest słuszne i pomaga się orientować. Jeżeli zapisujemy datę, to powinniśmy też zapisać godzinę, niewiele kosztuje, a użytkownik z pewnością się ucieszy wiedząc, że Cron wystawił mu automatycznie fakturę o 3:37.

Jedyny sposób na uleczenie tej wizji świata to posadzenie programera z designerem, wrzucenie kilku butelek czegoś mocniejszego i przekręcenie klucza od drzwi. Nie będzie to łatwe. Programerzy myślą o designerach jako o “mośkach od szabloników”, designerzy znów widzą w programerach uparte osły z aparycją małpy. Obie strony tego konfliktu są zwykle pełne gówna i potrzebują lunety, żeby spojrzeć poza czubek własnego nosa.

Ktoś będzie musiał być tym starszym i mądrzejszym, przerwać cykl nienawiści. Zakładam, że będą to programiści, bo są zwykle mądrzejsi i przystojniejsi.

Pamiętaj, nie jesteś alfą i omegą. Tylko tak myślisz!

Dla człowieka z Array() każdy problem wygląda jak .each()

Żeby nie być gołosłownym, pokażę wam problem, nad którym teraz siedzę. Oryginalny autor jest młodym programistą, a to był jego pierwszy większy projekt. Miał wystarczająco dużo wiedzy, żeby programować i zbyt mało, żeby podejmować decyzje projektowe. Niestety, projekty są realizowane zgodnie z zasadą “budżet dąży do zera do momentu napotkania frajera, który zrobi wszystko za jedną pensję”.

Rozważmy uprawnienia w systemie informatycznym. Mamy użytkownika, mamy moduły i metody, mamy uprawnienia. Uprawnienia są listą zawierającą nazwę i identyfikator. Przy wywoływaniu metody z modułu sprawdzamy, czy użytkownik ma identyfikator uprawnienia. Programistyczne przedszkole, prawda?

Implementacja jest poprawna z programerskiego punktu widzenia. Teraz dochodzimy do momentu implementowania międzymordzia dla użytkownika.

Spróbujcie wejść w umysł programisty. Macie listę użytkowników na osi Y, macie listę dozwolonych uprawnień na osi X. Uprawnienie może mieć dwa stany: nadany lub nienadany. Jaki element jest idealny do odwzorowania takiego układu? Checkbox.

To, co tu widzicie, jest efektem myślenia o danych po programersku. Jest to ujęcie całkowicie poprawne technicznie i totalnie spierdolone, jeśli weźmiemy pod uwagę, że użytkownicy systemu nie są robotami.

Wiecie, ile czasu zajmuje narysowanie takiej tabelki dla 120 użytkowników w systemie? Ponad stu pracowników razy ilość uprawnień plus narzut jQuery. Jak myślicie, ile koordynacji oko-ręka wymaga wybranie linii z uprawnieniami pracownika? Tabela jest na tyle wielka, że patrząc w ostatnie checkboksy, muszę odwrócić wzrok na listę nazwisk. To nie są ustawienia, to gra zręcznościowa. No i mój osobisty faworyt: żeby dowiedzieć się jakie uprawnienie nadajesz, musisz potrzymać wskaźnik nad pudełeczkiem checkboksa.

Eksperyment myślowy: jako nowy pracownik nadaj uprawnienia trzyma_kredens i czajnik_zabójca Halinie Krzywonos, ale nie Halinie Krzywons.

Oto kilka programerskich-designerskich błędów, które popełniono:

To, że trzymasz dane w jednej tabeli, nie znaczy że te dane należy prezentować razem. Informacje o uprawnieniach są połączone z profilem użytkownika. Powinny być wyświetlane w kontekście, na stronie z edycją profilu użytkownika.

Jestem człowiekiem, a nie numerem!” i tak samo jest tu. W programerskim umyśle nowo przyjęty do pracy dostaje taką informację na powitanie: możesz otwierać_drzwi, otwierać_okna, pić_kawę i podrywać_sekretarkę. W prawdziwym świecie powitanie wygląda tak: “będziesz pracował jako sprzedawca”. Uprawnienia powinny być ujęte w grupy. Tworzysz grupę X z uprawnieniami X1, X2 i X3. Pracownicy na odpowiednim stanowisku trafiają do odpowiedniej grupy.

Dwa zwycięstwa od ręki: możesz modyfikować uprawnienia dla całej masy ludzi bez potrzeby wybierania zmian dla każdego. Możesz dodawać wariacje: użytkownik może być w grupie X i mieć dodatkowe uprawnienie. Maksymalna elastyczność, minimalna ilość klikania.

Zapamiętaj: celem tworzenia UI nie jest replikacja struktur danych w twoim kodzie. Wiem, że ciężko się pozbyć takiego myślenia. Najlepiej w ogóle o tym nie myśleć. Znajdź przyjaznego designera, najlepiej takiego, który nie przegina w drugą stronę. Wiesz, takiego łączącego zaokrąglone rogi z feng szuje.

Na zakończenie jedna osobista uwaga. Nie wiem czy to ja jestem takim geniuszem, czy wy jesteście takie pały.

Widziałem to setki razy. Użytkownik wybiera opcję w systemie i zostaje pożegnany zimnym “Brak dostępu”, “Dokument niedostępny”, “Naruszenie uprawnień systemu. Ten wyjątek zostanie zgłoszony!”. Potem zaczyna się żonglowanie e-mailami pomiędzy przestraszonym użytkownikiem, jego kierownikiem i mną. Strata czasu.

Żeby ułatwić sobie życie, do komunikatu o braku dostępu dodaję link “Poproś o dostęp”, który generuje e-mail z informacją do zwierzchnika. On może mu nadać, może go olać, może mu nadać na 24h. Na drugą nóżkę wyświetlam listę pracowników jakoś związanych z nim (np. dział) posiadających uprawnienia. Czasem starczy się przejść biurko obok i zapytać, czy kolega może Ci coś sprawdzić. 1

Wszystko żeby mniej pracować. “Mniej pracować” powinno być twoim motto. Nie “techniczna doskonałość w służbie klienta”, tylko coś egoistycznego. Nie spierdol dziś, aby nie naprawiać jutro.

  1. Może nie przejść w supermegakorporacji.

Dwa litry napoju

Wracam z biura. Jest środa. Może czwartek. Ale bliżej dziewiątej wieczór niż maja. Moja droga wiedzie przez przekładaniec z warstw społeczeństwa. Bogato, biedno i white anglo-saxon protestants.

Na granicy wyznaczonej przez skrzyżowanie ulic znajduje się sklep. Można płacić kartą do 22:00. Rzuciłem szybkie spojrzenie w kierunku grupki bywalców ściśniętych przy schodach. Nigdy nie wiadomo, kiedy ktoś zapyta, czy mam problem, a ja mam problem w postaci zmęczenia życiem i dwa laptopy. Szarpać mi się nie chce, a do biegania nie jestem odpowiednio ubrany.

Kiedy tak lustrowałem sytuację, zauważyłem że schody pokonuje jakaś niewielka istota. Trzyma w rękach wielką butelkę napoju gazowanego. Człowiek, płci żeńskiej, znaczy dziewczynka. Pięć czy sześć lat. Patrzę z zaciekawieniem, jak walczy z ciężarem dwóch litrów o smaku zgodnym z naturalnym i wypatruję, kiedy pojawi się za nią ktoś dorosły. Dziewczynka mija mnie i skręca za róg. Opiekun nie pojawia się i po chwili podejmuję drogę do domu. Idę więc, a dziewczynka drepcze przede mną, chwiejąc się co jakiś czas pod ciężarem.

Myślę do siebie, że wypadałoby przypilnować dziecka, które spaceruje nocą. Czuję radość, że ktoś zaufał dziecku i puścił je po zakupy bez opieki. Pozostaję więc kilka kroków z tyłu i na chwilę pogrążam się w myślach. Nie wiem czy ja przyśpieszyłem, czy ona zwolniła, ale po jakimś czasie zrównaliśmy się w marszu i gdy odwróciłem się w jej stronę zauważyłem, że coś mówi. Zsunąłem słuchawki.

— Dobry wieczór - powiedziała dziewczynka.

— Dobry wieczór - odpowiedziałem lekko zbity z tropu.

— Nie boi się pan tak iść samemu w nocy? - zapytała zmieniając pozycję butelki tak, żeby było ją trochę zza niej widać.

— Trochę się boję - przyznałem - ale skoro idziemy razem, to z pewnością nic mi się nie stanie.

Przytaknęła i szliśmy tak przez jakiś czas w ciszy. Najdziwniejsza para na ulicy. Dziewczynka walcząca z ciężarem butelki, sięgająca mi może do kolana i ja, brodaty dziad w kapeluszu, z postawionym kołnierzem.

Tu oblewa mnie zimny pot, a głowa wypełnia się scenariuszami nadchodzącej tragedii. Jak ja wyglądam idąc tak z jakimś dzieckiem? Czy któryś z sąsiadów zauważył nas przez okno i dzwoni właśnie do ojca dziewczynki, który niechybnie wypadnie na mnie z następnej bramy? Czy uda mi się wytłumaczyć, że jestem przyjaznym gentlemanem, który docenia zaufanie, jakie pokłada w córce i robi to, co powinien zrobić każdy dobrze wychowany człowiek, to znaczy zerknąć czy dziecku w tej okolicy nie przytrafi się nic złego?

— Myśli pan, że są tacy ludzie, co porywają dzieci z ulicy? - przeczytała moje myśli dziewczynka.

— Nie. Nie, takie rzeczy się nie zdarzają - odpowiedziałem, czując się tak nieswojo jak wtedy, kiedy matka przyłapała mnie podczas masturbacji. Cokolwiek zrobisz, będzie źle.

— Tu mieszkam - doszedł mnie jeszcze głos z korytarza. - Dobranoc!

Dobranoc, burknąłem do siebie. Czułem się źle, źle. Wyciągnąłem papierosa. Bo tak, jeżeli ta dziewczynka powie rodzicom, że spotkała pana, który ją odprowadził do domu. Dlaczego czuję się podle mimo tego, że zrobiłem coś dobrego? W jakim spierdolonym, bez szans na naprawę społeczeństwie żyję, że czuję się jak gwałciciel.

Jak daleko sięga kontrola świadomości? Uważam się za kogoś, kto nie daje latających faków za opinię społeczeństwa i jednocześnie chcę się wrócić, odszukać klatki, drzwi i wytłumaczyć się z tego, co zrobiłem.


Dziad lub pedofil: wybór należy do Ciebie

Stoimy na skrzyżowaniu i czekamy na zmianę świateł. Podchodzi do nas przedstawiciel lokalnej społeczności, że żul znaczy. Zagaja. Osłaniam trochę Annę, bo z ryja mu jebie, jakby wcześniej stołował się w zakładach oczyszczania. Wygląda mi zza ramienia i zwraca się do mnie z pytaniem.

  • Córka?
  • Hę?
  • Córka?
  • …Żona — zażartowałem.

Żul rzuca kolejne szybkie spojrzenie przez moje ramie.

  • Panie, przecież ona jest młodsza od pana o jakieś dwadzieścia lat.

Teraz nie wiem, czy ja mam czterdzieści pięć, czy Anna pięć.


Vim. Wordpress.

Piotr Szotkowski dostarczył mi kilka stron poprawek do poprzedniego tekstu. Ignorowałem jego e-mail tak długo, jak mogłem. Wreszcie zdobyłem się na odwagę i odpaliłem edytor dostępny w Wordpressie, by po raz kolejny przekonać się, że pisanie w textarea jest wyjątkowo uciążliwe.

Potrzebowałem jakiegoś lepszego rozwiązania. Wiem! Napiszę sobie wtyczkę do Vima i będę mógł edytować teksty po ludzku.

Rzecz dzieje się w Internecie, okazało się więc, że spóźniłem się z tym pomysłem jakieś trzy lata. Przedstawiam Państwu Vimpress. Instalacja jest banalnie prosta:

cd
mkdir -p .vim
cd .vim
wget http://www.vim.org/scripts/download_script.php?src_id=7348 -O vimpress.tgz
tar zxf vimpress.tgz
rm vimpress.tgz
vi plugin/vimpress.vim
(w Vimie) :56

W pięćdziesiątej szóstej linii konfigurujemy dostęp do naszego bloga. Jeżeli wszystko poszło zgodnie z planem :BlogList powinno wyświetlić listę notatek.


Dwadzieścia pięć lat minęło

Dwadzieścia pięć lat. Dziewięć lat na pierwszej linii innowacji i postępu. Szesnaście lat epickiej opery mydlanej i bratobójczych walk pod każdą długością i szerokością geograficzną. Amiga, jedyna platforma, którego średnia użytkowników chorych psychicznie wypada jakoś jeden i jedna trzecia na użytkownika.

Amiga to taka Polska w wersji binarnej. Pamiętamy jak w 1410 żeśmy tym chrześcijanom spuścili lanie, że tylko my na Moskwę z sukcesem i kiedy tak wspominamy, to przysłowiowe psy srają po chodnikach.

Amiga to też jedyna platforma, której byłem fanbojem. Kiedy mówię fanbojem, to myślę o kimś, kto rozwalał płyty PC-ta dla zabawy. Ktoś, kto nie dorzucił się jakiemuś biednemu człowiekowi ze sceny do biletu po tym, jak zauważył że to użytkownik innej platformy. Ktoś, kto wtedy schylił się tak, aby dało się odczytać z czapki “A M I G A” i powiedział swoim młodzieńczym basem: “chyba gramy dla innej drużyny”.

Mam nadzieję, że czytelnicy poznali mnie na tyle, żeby pojąć, że nie chodziło o czystej krwi totemizm. 1

AmigaOS był genialny. AmigaOS był systemem, który mimo swoich technologicznych problemów potrafił wciągnąć każdego, kto kochał komputery w ten czysty sposób, w jaki można było kochać komputery w 1992, zanim Twoja Stara wrzucała foty na Naszej Klasie.

Dwadzieścia pięć lat później siedzę w domu i piję piwo czytając relacje z różnych imprez związanych z tą, jak to nazwał jeden z portali, “okrągłą rocznicą”. Dopada mnie nostalgia i rzucam się w kierunku laptopa. Zainstaluję sobie AmigaOS 3.1 i powiem Wam, co było w nim fajnego.

Jestem z siebie trochę dumny, a trochę mi żal, że marnuję głowę na takie informacje. Postawiłem cały system od zera, z dwóch dyskietek. W godzinę. Bez większego problemu. Ostatni raz używałem Amigi na poważnie w 2003. Niektóre rzeczy nie chcą wyjść z głowy. Pierwsza dziewczyna, pierwsza wódka, pierwszy komputer, którym rządziłeś.

AmigaOS zachwyca. Jak to nie zachwyca, jak zachwyca?

Przypisano mi te zasoby

Urządzenia w AmigaOS posiadały dwie nazwy: logiczną i fizyczną. To nie jest całkowita prawda, ale to bardzo dobre kłamstwo. Nazwy dysków nie miały znaczenia w takim sensie, w jakim jesteśmy do tego przyzwyczajeni na innych systemach. Główny dysk dysk twardy zwyczajowo przyjmował fizyczną nazwę DH0: co stanowiło logiczne ciągłość, jeżeli wiedziało się, że wewnętrzna stacja dyskietek to DF0:. DH0: to nasz /dev/sda1 lub C:, nic nie stało jednak na przeszkodzie, żeby dysk ten nazywał się Cherbata:. Nic, prócz ortografii.

Kiedy uruchomiłeś swój system z dysku Cherbata:, to w tle działa się czarna magia zwana przypisami. Komputer zaczynał odzywać się do dysku startowego per sys: i doklejał do ważnych katalogów kolejne nazwy. I tak katalog Libs/ na dysku Cherbata: stawał się Libs:, to samo działo się z katalogami C, S, Devs, Fonts i innymi.

A co to dawało praktycznie? No cóż, wszystkie zasoby w AmigaOS (czcionki, biblioteki, sterowniki) były w pewnym sensie programami, a przypis mógł wskazywać na więcej niż jedną ścieżkę. Przykład z życia: wpada kolega narysować kolekcję obwisłych penisów, której to kolekcji użyje jako argumentu w podwórkowej dyskusji o wyższości klubów sportowych. Znajomość anatomii pozwala mu szybko ukończyć dzieło, niestety nie posiadam na dysku jego ulubionych fontów. Zamiast przegrywać jego czcionki do mojego systemu, piszę po prostu (zakładając, że dysk kolegi to DH1 w moim systemie):

assign fonts: dh1:fonts add

Raz, dwa, trzy i już może używać swojej ulubionej kombinacji bold-kapitalik-underline-outline.

Inny przykład. Odwiedzając znajomych ze swoim dyskiem, co i raz natrafiałem na system, na którym mój dysk nie chce wystartować z pełnym systemem. Honorową odznaką było posiadanie takiego systemu, który sobie radzi z wieloma rodzajami rozszerzeń i zwężeń dostępnych dla komputerów Amiga. Napisałem mały program, który wykrywał typ procesora i koprocesora oraz innych flaków i wykonywał stosowne przypisy do katalogów z bibliotekami. Możecie o tym myśleć jako o przenośnym systemie, który zależnie od tego, czy jest uruchamiany w środowisku 32- lub 64-bitowym, wybiera stosowny zestaw bibliotek do użycia.

Dzięki odkryciu rozkazu assign zostałem też guru dla wielkiej rzeszy niedomytych amigowców, którzy używali komputera zgodnie z jego przeznaczeniem, to znaczy strzelali do obcych w rytm muzyki techno, kiedy w tle zapieprzała paralaksa z miliardem kolorów, przy których lata sześćdziesiąte wyglądały jak proszona herbatka u babci Jadwigi.

Wspominałem o tym kłamstwie z nazwą logiczną i fizyczną? Dobrze. Robiło się tak. Jeżeli miałeś szczęście, to dyskietka z grą była systemowa (to znaczy zawierała normalną strukturę danych jak katalogi i pliki i dawała się odczytać przez system bez własnego bootloadera) i najczęściej po jej włożeniu do napędu DF0: na ekranie pojawiała się jej ikonka podpisana np. PornPart1 co znaczyło dla nas tyle, że w fizycznym napędzie DF0: dostępny jest logiczny wolumin PornPart1:. Wszystko co musiałeś zrobić, to przegrać pliki ze wszystkich dyskietek do katalogu na twardym dysku i napisać skrypt. O, taki:

assign PornParty1: dh0:gry/pornparty
assign PornParty2: dh0:gry/pornparty
dh0:gry/pornparty/pornparty

Gra, szukając dyskietki pornparty1:, zostanie odesłana do katalogu na dysku. Teraz wystarczy to zapakować, zanieść na giełdę i zebrać obietnice przyszłego piwa, które kupią Ci lamerzy, jak tylko skończysz więcej niż piętnaście lat.

Mała piracka trivia dla lokalnych amigowców. Po tylu latach już chyba mogę? Moim największym osiągnięciem na scenie crackerskiej było przystosowanie zajumanej wersji Sensible World of Soccer do działania na Amidze 500. Piracka wersja sprzedawana w znanym wszystkim miejscu na ulicy Przybyszewskiego nie działała, ku wielkiemu smutkowi większości użytkowników zbyt skąpych na oryginał nie mówiąc już o Amidze 1200. Enter The Emil. Szybki rzut oka na dyskietkę i okazało się, że została ona przygotowana pod nowy system plików, którego A500 nie umiała gryźć. Siedem sekund później już umiała. Odniosłem swoją wersję do sklepu za co uzyskałem stosownie duży kredyt na nowości z katalogu z żółtą okładką.

Jeżeli kupowałeś SWOS-a na dwóch dyskietkach tam, w tym sklepie, i grałeś na swojej ukochanej pięćsetce, to możemy sobie przybić piątkę! Ręka w rękę zadeptaliśmy jakikolwiek sens pisania oprogramowania na naszą platformę. Karma trochę dziwka, ay?

Wracając do przypisów. Obraz wart tysiąca słów.

Utwór zaczyna się spokojnie, trwa i spokojnie się kończy

Prawdziwego mężczyzny nie poznaje się po tym jak zaczyna, podobno. Podobno też miło jak zaczyna bez skarpetek. Amiga zaczynała proces bootowania bez niczego.

Doszliśmy dziś do momentu, w którym sekwencja startowa systemu to praktycznie system sam w sobie. Dawno zapomniano o prostocie autoexec.bat i config.sys, dziś potrzebne są rekursywne skrypty, event-driven i żeby jeszcze backend koniecznie w XML, a jak się nie da, to jebnijmy jakąś bazę.

Żeby nie było, rozumiem, z jakiego powodu jesteśmy tu, gdzie jesteśmy. Dobrze, gdzie ja jestem, a ja nie jestem w stanie prześledzić całego procesu wczytywania się systemu na swoim laptopie. Ofiary własnego sukcesu.

Były jednak czasy, gdy mężczyźni byli mężczyznami, kobiety kobietami, a pociągi jeździły na węgiel. Czasy prostsze, sielanka pod gruszą i s:startup-sequence, który rozkręcał Amigę.

Prosto i do celu. Mimo całej świadomości, że nie da się utrzymać współczesnego systemu, który zwisałby z jednego skryptu startowego, to lubię wspominać czasy, w których wiedziałem, co też się dzieje pod maską mojego komputera.

Co robi antagonista Jamesa Bonda? Daje mu szansę ucieczki

To jedna z tych rzeczy, o których zapomniałem, że mi ich brakuje. Ktoś mógłby powiedzieć, że w takim razie mi ich nie brakowało, ja znów twierdzę, że pogodziłem się z losem.

Programiści nie są specjalnie znani z ich zamiłowań do dokumentacji, która nie odnosi się bezpośrednio do przekładania bajtów z jednego miejsca na drugie. Podręczniki zawierające informacje co do stylu traktowane są jako delikatna sugestia i nic więcej. Z tym większym zdziwieniem przypomniałem sobie, że prawie każdy program do ustawiania preferencji (programy systemowe zwykły mieć osobny “konfigurator” dostępny gdzieś w sys:prefs) posiada opcję “Use”.

Zanim o tym, kilka słów o przechowywaniu ustawień w AmigaOS. Słyszeliście kiedyś o RAM-dysku? RAM-dysk to taki wirtualny dysk, który znajduje się w pamięci (serio, kapitanie Oczywistość? Dziękujemy!) i jego zawartość ulatuje razem z resetem komputera. W AmigaOS RAM-dysk jest niezbywalną częścią systemu. Co różniło jego implementację (i w pewien sposób wpłynęło na to, że to jedyny system na którym stał się popularny) od innych to fakt, że dokonywał on automatycznie przydziału pamięci. DOS-owy odpowiednik miał określone przy tworzeniu, że zajmie np. megabajt i już. RAM-dysk w Amidze zajmował tyle, ile zajmowały umieszczone tam pliki, a górną granicą była dostępna dla systemu pamięć.

RAM-dysk był używany do trzech rzeczy

  1. rozpakowywania programów celem przetestowania, nie trzeba było sprzątać po sesji
  2. zapisywanie plików tymczasowych
  3. przechowywanie ustawień

Przy starcie komputera system kopiował zawartość katalogu EnvArc: do RAM:Env i przypisywał do niego nazwę Env:, katalog EnvArc (od Environment Archive) zawierał ostatnie zapisane ustawienia, a Env: ich bieżącą kopię. Przejdźmy do slajdu numer następny.

Save”, “Use” i “Test”. Kliknięcie “Use” powodowało zapisanie zmiany do katalogu Env: (więc na RAM-dysk) i pozwalało przetestować zmiany. Jeżeli udało nam się ustawić czarny tekst na czarnym podkładzie i spowodować aby wskaźnik myszy przesuwał się tylko o cal, to jeden reset dalej czekało nas wybawienie z opresji. To jedna z takich banalnych rzeczy, które cieszą.

Oczywiście dziś trzymam swoje dotfiles w repozytorium GIT-a, co wymagało kilku skryptów 2, drugiego serwera, który utrzymuje te dane i wprawdzie wszystko jest rozproszone i nowoczesne, to jednak nie mogę się jakoś oprzeć wrażeniu, że kopiowanie katalogu ma w sobie jakąś prostotę, przy której moje rozwiązanie jest wymęczone jak Stanisław Lem po maratonie “Na Wspólnej”.

O tym jak kodeki dało się instalować bez “paska narzędziowego” Aleksy dla IE

Dzisiejszym słowem-wytrychem jest skalowalność, wczorajszym była modułowość. Jeżeli program był modularny, to znaczyło, że marketingowiec mógł zawsze powiedzieć o tej rozpieprzonej części programu “wystarczy wymienić moduł”. Zaraz, miało być o tym systemie z lat dziewięćdziesiątych.

AmigaOS miał wbudowany system DataTypes. Co to znaczyło? Wyobraź sobie, że piszesz program graficzny, ale nie masz specjalnie czasu na te wszystkie głupie formaty plików, które krążą po dyskietkach znajomych. Odwołujesz się więc do DataTypes przez standardową bibliotekę systemową i mówisz mu “wczytaj obrazki, o których wiesz jak”. Ta dam!

DataTypes to dekodery (animacji, obrazków, dźwięków) napisane tak, aby używając wspólnego API pozwolić użytkownikowi wczytywać media bez potrzeby zmieniania programu. Jeżeli wczoraj nie było formatu PNG (młodsi mogą nie pamiętać, że nie było. Czasy wielkiej schizmy LZW wywarły piętno na nas wszystkich) a Twój program jest napisany według zasad, to pojutrze ktoś napisze odpowiedni “datatyp”, użytkownik go sobie zainstaluje i gotowe.

Nie mówiąc już o tym, że odpowiednie dekodery mogły być przygotowywane pod specjalne linie procesorów czy też kart graficznych, dzięki czemu mogłeś sobie wybrać coś, co będzie działało jak sobie życzysz.

Po raz kolejny, mimo mojego kompletnego umiłowania do kompilowania programów, co brzmi lepiej dla Zwykłego Usera:

  • Zainstaluj ten program (DataType way)
  • Ściągnij libpng-dev i przekompiluj z —enable-png

Więcej niż piktogramy

Ikona w AmigaOS była czymś więcej niż ikony w innych systemach. Po pierwsze była dodatkowym plikiem, którego nazwa zgadzała się z nazwą pliku, który miała opisywać i rozszerzenia .info. Każda ikona posiadała dwa stany: przed i po kliknięciu. Prawdopodobnie miało to pomóc określić stan w jakim znajduje się ikona, praktycznie skupiło się to na projektowaniu uroczych ikonek, które wyglądały jeszcze zabawniej po kliknięciu. Hipopotamek z zamkniętą buzią. Po kliknięciu z otwartą i nutki. Tak się włączało szlagierowy odtwarzacz muzyki HippoPlayer.

Nie tylko lansem stały ikony. Metadanymi stały też.

Poza standardowymi rzeczami, takimi jak atrybuty pliku, komentarz i data utworzenia, widzimy pole “Default tool”, co jak bardziej rozgarnięci czytelnicy mogą zgadnąć, jest miejscem do wpisania domyślnego programu, który włączy się przy dwumlasku Bieleckiego. Mogłeś więc komponować sobie muzykę w programie muzycznym, zawrzeć nazwę tego programu w polu “Default tool” i klikając wracać do pracy nad nim, ale mogłeś też bez problemu zaciągnąć ikonę do HippoPlayera i posłuchać efektów.

A te “Tool Types”? To nic innego jak dodatkowy sposób na konfigurowanie programu w stylu .ini, zmienna = wartość. Pozwalało to zmienić domyślne ustawienia wywoływanego programu (w przypadku zrzutu ekranu jest to instalator aplikacji).

Wrócę jeszcze do komentarzy. Komentarze to była dopiero super sprawa. Ponieważ AmigaOS nie dostarcza żadnych narzędzi do zarządzania swoim cyfrowym żywotem i do tego jest systemem jednoużytkownikowym, to normą było ręczne kopiowanie plików do systemu. Jak ktoś miał świeższą wersję reqtools.library na dysku, to nie ściągał pakietu instalacyjnego, tylko kopiował go sobie do libs:, przy takim podejściu do systemu komentarze do plików pozwalały mi zachować zmysły.

Przed instalacją programu wpisywałem w konsoli polecenie, które ustawiało komentarze dla wszystkich plików programu na np. “Plik pochodzi z programu XYZ, zainstalowano w marcu”. Potem pozwalałem się mu instalować. Kiedy coś mi nie grało z fontem czy biblioteką, po prostu patrzyłem na komentarze i już wiedziałem, że plik został nadpisany. Jak nie masz dpkg to masz łeb!

A jak było naprawdę?

AmigaOS w tamtym wcieleniu był systemem bardzo dobrym. Na lekko dokarmionej Amidze człowiek pracował jak pszczółka i czuł się jak bóg. Bo i serio nie było specjalnie przeciwników. Apple było praktycznie nieznane, a OS7 powodował tylko pusty śmiech. Microsoft miał dopiero przywalić z Windows 95 i zgarnąć pulę nad długie lata. Atari, poza małą niszą, nigdy nie przekonało nikogo TOS-em, a Falcon spadł z drzewa zanim się dobrze wykluł. Ośmiobitowce dawno już trafiły na karty historii.

Światu nie zabrało długo by dopaść, a później przegonić AmigaOS. Potem wybuchła wojna domowa i dzięki wielkiemu wysiłkowi walczących stron prawie nikt nie przeżył. Powstały trzy największe obozy, tak wielkie, że po ustawieniu ich na łbie od szpilki zostanie miejsce dla kilku milionów diabłów. Ale to już historia na inną okazję. Jeżeli chcecie posłuchać mojej jednostronnej i absolutnie zakłamanej historii współczesnej świata po Commodore, to możecie napisać e-maila. Zbiorę się na pięćdziesięciolecie.

Przekonałeś mnie

Miałeś Amigę i nagle zachciało Ci się klikać? Są opcje.

  • WinUAE dla tych, którzy chcą postrzelać z paralaksą. Używać też pod Linuksem via WINE, chodzi dużo lepiej niż natywne port.
  • Amiga Forever KX Light opcja dla ludzi zainteresowanych emulacją z dozą legalności.
  • Icaros Desktop to dystrybucja open source’owej reimplementacji AmigaOS, AROS-a. Myśl Haiku do BeOS minus binarna kompatybilność.
  • MorphOS, ideowy spadkobierca AmigaOS, działa na Macu Mini i eMacu (w przyszości PowerBook) z procesorami PowerPC. Wersja darmowa działa przez pół godziny
  • AmigaOS 4.1, oficjalny następca. Działa tylko na wybranych płytach. Możesz kupić Samanthę lub Pegasosa.
  • Opcja nerdout: reimplementacja A500 w FPGA.

Full disclosure, kumpluję się z eFUNZINe. Jak coś kupicie powołując się na ten tekst to mogę obiecać, że coś surpresę.

  1. od tego w tamtych czasach miałem ŁKS. Jak powiedział kiedyś nbw: Amiga i ŁKS, zawsze mieliśmy przejebane
  2. żeby mi się .git nie mieszał z katalogiem domowym

Sen nocy letniej

Stoją tam we dwie. Ta niższa robi za trybunał. O nieobecnej koleżance opowiada historię, która odbija się od wiat przystanku autobusowego linii N4. Otóż ona, ta nieobecna, mówi “kupiliśmy” kiedy to jej chłopak kupił pralkę. Poza tym mieszkają osobno, ta nieznajoma i chłopak z pralką. Gacie tylko do niego nosi. W domyśle, że chyba brudne. Poza tym nie gotuje. Nie potrafi.

Ja” — wspomniała oratorka — “też nie potrafię”. Zupę jednak zrobię. Bo zupę się wstawia, ona się gotuje, ja się maluję. Dobre czasy. Koleżanka, ale ta co stoi na przystanku, nie ta od pralki, potakuje. Rozumie. Ona też by, gdyby nie. Żartują obie o zupce chińskiej przy świecach.

Tak stoją dwie czarownice, nocą letnią, biadoląc o cudzym szczęściu. Kolejną noc spędzą rzucając się w zimnej poscieli marząc o rycerzu z własną pralką.

Kiedy teraz siedzę i próbuję zapisać to, co widziałem, jestem zagadywany. Jakiś młodzieniec przysiadł się do mnie i pyta o czym piszę. Odpowiadam, że tylko notuję. Czemu notuję, pyta. Chyba żeby nie zapomnieć. Pukając się w nos i wskazując siedzące przede mną dziewczyny mówi, że on dzisiejszej nocy nie zapomni. Kiedy autobus zatrzymuje się po raz kolejny, podnosi się z okrzykiem “dziewczyny, wysiadamy!” i zostaje sam na przystanku. Dziewczyny jadą dalej, a on tej nocy nie zapomni z pewnością.

Gdyby miał pralkę.