Zawiodłem się na Fakapie, czyli recenzja podwójna

Okładka Zawód

Tytuł: Zawód Opowieści o pracy w Polsce To o nas
Autor: Kamil Fejfer
Rok: 2017
ISBN: 978-83-770-0294-0

Pierwsza z książek, której przyjrzymy się dzisiaj, jest chyba najważniejszą w 2017 roku książką poruszającą kwestie społeczne. Tyle tylko, że jest to książka marna. Mamy tu mieszankę treści wartościowych. Chociażby historię ratownika medycznego, laureatki studenckiego nobla, która nie za bardzo może znaleźć pracę zgodną z kwalifikacjami czy nawrócenia uberkuca po kuracji MLMem. Oraz treści chujowych jak płacz dziewczyny, która postanowiła studiować hobby (teatrologię czy coś w ten deseń) czy narzekania dziennikarki-freelancerki. I szkoda mi tej książki, bo autor spierdolił koncertowo arcyciekawy temat.
Czego mi w tej książce zabrakło? Przede wszystkim głębszej analizy, dlaczego rynek pracy wygląda tak, a nie inaczej. Rzuciła mi się w oczy wzmianka o „mentalności folwarcznej”, które to pojęcie, zresztą źle zapisane, bo chodzi o relację folwarczną, pochodzi z eseju Andrzeja Ledera pod tym samym tytułem. Weźmy teraz to pojęcie i zestawmy je z historią Katji Schrodinger, czyli autorki bloga o życiu z zespołem AspergeraW. Tyle tylko, żeby to zrobić trzeba umieć coś więcej niż wstawianie memów w internety.
Podsumowując. Mam wrażenie, że autor chce między wierszami powiedzieć „mi się udało frajerzy”. Tyle tylko, że wystarczy podejść do tej książki na spokojnie i widać miałkość. No cóż… w kapitalizmie nie wygrywa się umiejętnościami, a odpowiednim zapleczem. Niech ono nawet składa się z ludzików, lubiących dłuższe teksty na memach…

Okładka Fakap

Tytuł: Fakap. Moja przygoda z korpoświatem
Autor: Dan Lyons
Rok: 2017
ISBN: 978-83-240-4220-3

To może coś zza oceanu. Dan Lyons to dziennikarz zwolniony z Newsweeka w ramach redukcji. Po dość długim okresie bezrobocia trafia do tzw. „fabryki kontentu” w HubSpocieW, czyli startupie. 52-letni dziennikarz technologiczny, który ma na koncie poważne artykuły i jest autorem wywiadów z najważniejszymi osobami w świecie IT, musi zmierzyć się z całkowicie innym światem. Światem słabo opłacanych dzieciaków, którym zrobiono pranie mózgów i wmówiono, że pracują w najlepszej firmie na świecie. Mamy tu, oczywiście, elementy typowego korpoświata z kopaniem się po jajach, podkładaniem świni i podpierzaniem zasług. Całość doprawiona wszechobecnym sloganem „jest bosko”.
I właśnie tu wychodzi największa zaleta tej książki. Jak na dłoni widać, że w Polsce to my jesteśmy jeszcze daleko za cywilizacją białego człowieka, funfact w HotSpocie pracują praktycznie sami biali, co jest nie lada wyczynem w USA.
Warsztatowo książka jest świetna, widać tu rękę profesjonalisty. To, czego mi brakuje, to próba analizy, dlaczego system działa. Autor wskazuje co prawda na mechanizm opcji i stara się go wytłumaczyć w prosty i zrozumiały sposób, ale dla osób spoza amerykańskiego kręgu kulturowego ten mechanizm może wydawać się niejasny. Szczególnie że sposób wyceny oraz wyznaczania granicy opłacalności wymaga trochę rozeznania w mechanizmach giełdowych.
Podsumowując. Fajne czytadło. Nie jest to typowy reportaż, ale też nie jest to opowiadanie „na faktach”. Epilog „miażdży”, a dla zainteresowanych artykuł wspomniany w książce znajdziecie tu.

Na koniec warto się pokusić o porównanie tych dwóch książek. Obie dotykają tego samego problemu. Rynek pracy zmienił się wraz ze wdrożeniem neoliberalnych reform pod koniec lat 70-tych. Problemy, które obserwujemy w Polsce, nie są niczym niezwykłym w gospodarkach opartych na liberalnym podejściu. Rzecz w tym, że USA miały za sobą cztery dekady budowania bogactwa, gdy zdecydowano się na odejście od keynesowskiego modelu gospodarczego. Polska nie miała okazji na stworzenie odpowiedniego zaplecza społecznego, przed przyjęciem „dobrodziejstw” neoliberalizmu. I to niestety widać.

ps. następna w kolejce recenzenckiej jest „Prześniona rewolucja” Ledera. Więc będzie grubo.

RoomOverflowError, czyli o JDD 2017

W dużym skrócie było zacnie.

W szczegółach to powiem tak. Jarek Ratajski zjechał adnotacje z góry do dołu. Następnie wykonał nawrót i poprawił. Świetna prezentacja o tym, że warto czasami wrócić do podstaw języka, zamiast korzystać z rozwiązań w rodzaju Springa. Później Tomek Kleszczyński opowiedział o Kotlnie. Bardzo podstawy, ale miało to ręce i nogi. W tym samym czasie Przemysław Hojnacki mówił o chatbotach. Trochę wyszła z tego prezentacja marketingowa narzędzi i jakoś tak sztywno było. Nie sztywno było za to na prezentacji Tomka Borka, który przeszedł przez historię Javy, a następnie skompilował to, co będzie w i o Javie 9 na JDD. Szkoda tylko, że organizacja dała ciała z rzutnikami.

Potem był obiadek i młodzi programiści mogli przeżyć chwilę „historycznej grozy”, stojąc w kolejkach po papu.

Po obiadku poszedłem na prezentację Heinza Kabutza o Fork/Join i sposobach na zwiększenie utylizacji sprzętu. Z prezentacji twardych to była chyba najlepsza w pierwszym dniu. Przy okazji załapałem się na promocję kursów robionych przez jego firmę. Wyglądają całkiem zacnie. Potem udałem się na prezentację Piotra Wittchena o reactive streamach w bibliotece standardowej. Może byłem już nieogarnięty, ale jakoś tak mi to nie pasowało. Odpuściłem po 20 minutach. Ostatnia sesja tego dnia, w której uczestniczyłem to opowieść Mateusza Gajewskiego o germańskim oprawcy. Dla niezorientowanych:

Świetna prezentacja o tym, jak działa dług techniczny i jak sobie z nim radzić. Później udałem się do speakers cornera by pozalegać…

A później była impreza… i zaprawdę powiadam wam alkohol to zuo…

Drugi dzień zacząłem od prezentacji Jarka Pałki o Javie 10. Była moc… może troszkę wczorajsza, ale była. Jarek mówił nie tylko o tym, co nas czeka, ale też opowiedział, dlaczego niektóre rzeczy działają tak, a nie inaczej. Później znowu odstaliśmy w kolejce po obiad, a potem coś pierdolnęło i się zrobił RoomOverflowError. Slajdy tutaj. Dzień zakończyłem na prezentacji Ewa Nestorowicz i Dominika Dzienia o tokenach U2F. Fajna mięsna prezentacja z dodatkami hardwerowymi (żeby między ząbkami chrupało). Na koniec poszedłem na prezentację Piotrka Przybyła o graylogu. Powiem tak, ze wszystkich prezentacji na tegorocznym JDD, ta była chyba najlepszą w kategorii „pójdę jutro do pracy i to wdrożę”. Świetnie opowiedziane i były przykłady.

Podsumowując. W końcu dotarłem na JDD. Było super. Tyle tylko, że znalazłem trzy wady. Po pierwsze, całość na strasznym zadupiu. Po drugie drugiego dnia koniec o 18:15 to był mocno poroniony pomysł. Po trzecie drugiego dnia przerwy na kawę po obiedzie były na wodzie i sokach, bo kawa się skończyła, a co gorsze nie było nic na ząbek 🙁 Po 17 to prawie wszyscy już o jedzeniu myśleli.

Sendbajt

Bo w speakers cornerze na jdd pojawił się ten temat

Sendbajt
Copyright 1998 by oscyloskop

Jest to opowiesc o najbardziej chyba spektakularnej grupie hackerskiej w historii Netu oraz najgenialniejszym hackerze wsrod seniorow. Pan Jan S. , bo o nim mowa zaczal sie co prawda interesowac komputerami dopiero w wieku 68 lat lecz efekty jego zainteresowan przerosly jego nasmielsze oczekiwania.
Ale zacznijmy od poczatku.
– Pamietam jak dzis. To bylo w 1987 roku… bylem wlasnie wtedy na poczcie po swoja emeryture (u pani Halinki z 3 okienka) kiedy po raz pierwszy zobaczylem komputer. Stal na biurku przykryty pokrowcem – wspomina pan Jan. Wtedy jeszcze nic nie wskazywalo na to ze komputery stana sie zyciowym hobby pana Jana.
– W roku 1989 w bibliotece wojewodzkiej, gdzie czesto zagladalem tez byly juz komputery… pamietam, ze po raz pierwszy (i ostatni) usiadlem wtedy przed klawiatura. Kompletnie nie wiedzialem co mam zrobic, wiec najpierw przeczytalem cztery razy to co bylo napisane na monitorze. Potem jakos juz poszlo… Tego samego dnia wypozyczylem ksiazke o rosyjskich maszynach cyfrowych z ktorej dowiedzialem sie co to jest bit i bajt oraz kto to jest Lenin.
Od tej pory zaczal sie intesywny okres w zyciu pana S. Cale dnie spedzal w czytelni pochlanialac ksiazki o komputerach, systemach operacyjnych, sieciach komputerowych , ale nie tylko. W kregu zainteresowan pana Jana znalazla sie rowniez telefonia i budowa modemow, co zreszta zaowocowalo w pozniejszym czasie rewolucyjnymi metodami stosowanymi przez grupe „Sendbajt” Ale nie uprzedzajmy faktow. Na poczatku 1989 roku poznal pan S. niejakiego Mieczyslawa R., rowniez emeryta, ktory wiekszosc zycia spedzil na instalowaniu sieci telefonicznych oraz pracy na Strowgerze. Mietek (jak o nim mawial pan Jan) byl wtedy zgorzknialym 64 letnim emerytem, dysponowal jednak duza wiedza praktyczna i dlatego wlasnie pan Jan postanowil zawrzec z nim spolke w celu wyciagniecia od niego mozliwie duzo wiedzy (byc moze juz wtedy istnialy w glowie Jana S. zarysy szatanskiego planu ktory pozniej przyniosl slawe jemu oraz grupie „Sendbajt”).
Kolejny rok pan Jan spedzil razem z Mietkiem na dalszym intensywnym szkoleniu w bibliotekach i nie tylko. Prenumerata „Bajtka” otorzyla mu oczy na wiele zagadnien o komputerach o ktorych dotad nie wiedzial nic. Nieodzownym elementem zycia staly sie nocne rozmowy z Mietkiem przy kubku kakao, w czasie ktorych prowadzili ozywione duskusje a to o plikach, a to o sytemach Dos, Unix a to o protokolach sieciowych lub modemowych. Czasami w domu pana Jana pojawiala sie takze pani Bozenka – zona pana Mietka. Przygotowywala im kakao i przysluchiwala sie o czym rozmawiaja. Czasem tez zadawala pytania, ktore jednak nie zawsze mialy sens.
Gdzies tak w sierpniu 1990 pan Jan stworzyl swoj pierwszy program – byl to generator liczb losowych totolotka napisany w basicu commodore 64. Niestety program istnial tylko na kartce z notesu, a to z tego prostego powodu, iz pana Jana nie bylo stac nawet na najtanszy komputer 8 bitowy. Pozniej przyszla nauka assemblera. Okazalo sie ze pan S. ma do tego nadzwyczajny talent. Juz po miesiacu nauczyl sie wszystkich rozkazow procesora 8086. Po kolejnych 3 miesiacach zmudnej nauki mial opanowane wszystkie przerwania i byl w stanie pisac i debuggowac programy w assemblerze i to jedynie za pomoca kilku kartek papieru kancelaryjnego i olowka z gumka.Kiedy pan Jan dowiedzial sie juz dostatecznie duzo o komputerach i systemach operacyjnych przyszla pora na gruntowne studiowanie sieci, zwlaszcza rozleglych. W ciagu pol roku intensywnego wkuwania polaczonego z cwiczeniami praktycznymi pan Jan zdobyl tak wiele informacji, ze mogl np. zakodowac dowolny tekst na ciag znakow ASCII po czym zamienic to na ciag zer i jedynek oraz podzielic na pakiety wyposazone w sume kontrolna, bity stopu, parzystosci i takie tam. Po wielu treningach okazalo sie ze potrafi on z pamieci podac 1 kB plik binarny (ewentualnie zaszyfrowac go np. metoda xor w czasie rzeczywistym). Pan Mietek takze nie proznowal – na polecenie pana Jana zbudowal specjalny aparat telefoniczny z dwoma mikrofonami oraz z trzema sluchawkami.
Mowi pan Jan:
– Tak pod koniec roku 1991 mialem juz duzo wiadomosci i wiedzialem dokladnie czego chce. Chcialem dostepu do niezliczonych zasobow wiedzy zgromadzonej na wszystkich komputerach swiata. – Mowiac to pan Jan wzrusza sie bardzo i widac, ze silnie to przezywa.
– Przelomem byl styczen 1992. Czytalem wlasnie o najnowszych metodach modulacji sygnalu w pasmie telefonicznym, kiedy wpadl Mietek z nowym „Bajtkiem”. Byla tam opublikowana lista wszystkich BBS-ow w Polsce. Postanowilismy sprawdzic te numery. Pozniewaz ja nie mam telefonu, ubralem sie cieplo i poszlismy nie opodal do automatu. Wg „Bajtka” w naszym miescie byly 3 BBSy. Drzacymi rekoma wykrecilem numer pierwszego BBSu i w chwili gdy chcialem wrzucic zeton Mietek powstrzymal mnie i sam energicznie przywalil w aparat centralnie od frontu. Spojarzalem na niego ze zdziwieniem, ale nie bylo czasu na wyjasnienia gdyz w tym momencie nastapilo polaczenie, a ja w sluchawce uslyszalem dzikie piski o duzym natezeniu wpadajace wprost do mego ucha. W pierszym odruchu wypuscilem sluchawke z reki, ale zaraz sie opamietalem i Mietek podal mi sluchawke znowu. Tym razem bylem juz przygotowany i staralem sie rozroznic poszczegolne dzwieki. W mlodosci bylem miedzy innymi muzykiem jazzowym, wiec od razu wylapalem czestotliwosc nosna na 1200 Hz. Slychac bylo regularne sekwencje piskow. Powtorzylo sie to w sumie szesc razy i modem po drugiej stronie sie wylaczyl. Czasu nie bylo duzo, ale juz po tym pierwszym polaczeniu zorientowalem sie, ze mam do czynienia z jakims modemem 2400 a takze rozpoznalem rodzaj modulacji. Za chwile wykrecilismy ten sam numer raz jeszcze i tym razem sprobowalem nawiazac lacznosc. Gwizdanie do mikrofonu niewiele pomoglo, wiec wpadlem na pomysl zeby Mietek wymawial „aaaaaaaa” na czestotliwosci ok 2400 hz a ja w tym czasie wydawalem odpowiednie piski w celu przeprowadzenia handshake’u oraz uzyskania polaczenia z komputerem odleglym z predkoscia przynajmniej 300 bps. Probowalismy jakies 4 razy zanim sie to udalo. Jednak po odebraniu wiadomosci wstepnych oraz zalogowaniu sie do BBSa jako anonymous polaczenie zostalo przerwane, poniewaz Mietek zaniosl sie nagle straszliwym kaszlem. Mnie zreszta tez rozbolalo gardlo od wydawania piskow, oraz reka od notowania zer i jedynek. Prace takze utrudnial fakt, ze musialem jednoczesnie nadawac i deszyfrowac dane. Nalezalo zdecydowanie opuscic budke i udac sie do domu w celu obmyslenia innej strategii, zwlaszcza, ze wokolo zebral sie tlumek mlodych osob przygladajacych sie nam dosc dziwnie. No coz, to moje pierwsze polaczenie z modemem bylo moze niezbyt udane ale za to wiele sie nauczylem.
Co robil pan Jan S. w nastepnych dniach? Otoz zdal on sobie sprawe ze w pojedynke z Mietkiem wiele nie zdzialaja. Potrzebowali pomocy fachowcow. Na pierwszy ogien poszla pani Bozenka, ktora jako regularna bywalczyni coniedzielnej mszy swietej dysponowala odpowim glosem z ktorym pan S. wiazal duze nadzieje.
– Pani Bozenko, pani bedzie pelnila w naszej grupie funkcje generatora fali nosnej.
– Lo Jezu! A co to jest? W imie ojca!
– Spokojnie pani Bozenko, to nic trudnegom niech no pani powie „aaa”.
– Aa
– Ale tak dlugo „aaaaaa” i tutaj, do mikrofonu prosze.
– Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
– Dobrze. No widzi pani? Trudne? Nietrudne. Panie Mietku, odczytal pan czestotliwosc na oscyloskopie?
– Niewiarygodne! Dokladnie 2400 Hz panie Janie!
– Fantastycznie! Jest pani najstarszym generatorem fali nosnych telefonicznych na swiecie.
– No wie pan?
– Zartowalem, he he.
– Panie Janie a jak bedzie sie nazywala nasza grupa?
– Juz to przemyslalem proponuje „Sendbajt”. Moze byc ?
– Eee. Dobra.
W kolejnych dniach pan Jan pokazywal pani Bozence jak ma sie zachowywac generator fali nosnej, zwlaszcza w przypadku renegocjacji polaczenia oraz zaklocen na linii. Pan Mietek przechodzil intensywny kurs HTMLa (oczywiscie w wersji zerojedynkowej). Po tygodniu do grupy „Sendbajt” dolaczyla jeszcze pani Wanda – dobra znajoma pani Bozenki, ktora wg niej spiewala najglosniej i najpiekniej w calym kosciele.
– Bardzo dobrze! – ucieszyl sie pan Jan – pani bedzie naszym nadajnikiem oraz modulatorem!
– Ale nic nie wiem! Nie umiem! – plakala pani Wanda.
– Jak to nic ? Niech pani powie „pi pi pi pioooupipaupioiopppipipiapappe pi pi”
– pi pi pi pioooupipaupi… jak bylo dalej?
– …oiopppipipiapappe pi pi …jeszcze raz!
– pi pi pi pioooupipaupioiopppipipiappe pi pi …dobrze?
– Opuscila pani jedno pa, ale korekcja bledow modemu odbiorczego powinna sobie z tym poradzic.Poza tym doskonale.Panie Mietku!
– Slucham.
– Prosze przebudowac nasz aparat tak aby drugi mikrofon byl polaczony szeregowo z pierwszym poprzez uklad, ktory pan zaprojektuje tak aby sygnal z drugiego mikrofonu modulowal sygnal pierwszego fazowo, amplitudowo lub czestotliwosciowo w zaleznosci od polozenia przelacznika p3… Druga sluchawka ma miec dodatkowy filtr srodkowoprzepustowy na 1200 Hz …zreszta tu ma pan wstepny projekt.
– Jasna sprawa, tylko co z tymi krokodylkami, zostaja jak sa ?
– tak, i niech pan skoluje jakies 50 metrow czarnego kabla telefonicznego.
– To sie da zrobic.
Nastepny tydzien uplynal na przygotowaniach. Pan Jan zarywal noce symulujac na kartce mala siec ethernet na szesc komputerow. Bawil sie kopiujac pliki miedzy stanowiskami lub uruchamiajac programy na serwerze. Zabawa ta kosztowala go co prawda dwie ryzy papieru do kserokopiarek ale jego wiedza o dzialaniu sieci wzrosla niepomiernie.
– Nasza pierwsza akcja? No coz, to bylo w piwnicy naszego bloku. Okolo godziny 23:00 zaopatrzeni w latarki, hackomat (jak nazwalismy nasz przyrzad) oraz koszyk na ziemniaki i torbe na kompoty zeszlismy do piwnicy. Mietek od razu odszukal skrzynke z napisem >TP< i wyjal z torby pek kluczy. Po chwili nasz hackomat byl na lini i mielismy dialtone.Wg planu najpierw wykrecilem numer do naszego znajomego BBSu. Panie zajely miejsca przy mikrofonach, Mietek przylozyl swoja sluchawke do ucha, ja swoja i przygotowalem papier i kredki (olowki mi sie juz wtedy skonczyly) Pierwsza proba zalogowania sie nie powiodla, poniewaz pani Wanda z wrazenia krzyknela do mikrofonu i zdalny modem nas rozlaczyl. Jednak za drugim razem udalo sie doprowadzic do polaczenia, co prawda tylko 120 bps, ale jak na poczatek to chyba i tak niezle. Mietek szybko zalapal o co chodzi pozniej juz sam odbieral i deszyfrowal wiadomosci. Dzieki temu ja moglem sie zajac przetwarzaniem danych. Naprawde byloby z nami krucho, gdybu nie to, ze Mietek pozyczyl od swojego syna kalkulator. To byl taki prosty kalkulator, ale mial co trzeba, tzn dodawanie i mnozenie. Kiedy juz sie zalogowalem do systemu pierwsza rzecza jaka zrobilem bylo przejecie praw menedzera BBSu wg mojej metody obmyslonej z pol roku wczesniej. Nie spodziewalem sie ze pojdzie az tak latwo. Niestety po 15 minutach polaczenia pani Bozenka nie wytrzymala i powiedziala ze nie moze dluzej krzyczec "aaaa", ze ona tez chce byc procesorem i inne takie bzdury. Przez nia zerwalismy takie swietnie zapowiadajace sie haczenie. Ale nic to. Zdazylem i tak skasowac wiekszosc plikow systemowych. Kiedy Mietek doprowadzil swoja zone do porzadku i moglismy juz kontynuowac postanowilismy sprobowac czegos innego.Polaczylismy sie z serwerem dosyc duzej firmy L*** z naszego miasta. Okazalo sie ze maja aktywne konto guest. Nic prostszego. Po wejsciu do systemu w ciagu 5 minut zdobylem uprawnienia roota i ku mojej nieopisanej radosci okazalo sie ze serwer ma lacze z inernetem. Niedowierzajac sprawdzilem cala kartke obliczen czy sie nie pomylilem czasem przy dodawaniu liczb ujemnych w systemie osemkowym, bo z tym mialem zawsze troche klopotu. No ale wszystko sie potwierdzilo. Zakrylem mikrofon reka i krzyknalem do Mietka: Udalo sie! Jestesmy w Internecie! niestety nasze panie wytwarzaly taki zgielk, ze prawdopodobnie mnie i tak nie usluszal. Ale ja juz bylem tam gdzie chcialem byc zawsze. Pierwsze co zrobilem do polaczylem sie z serwerem firmy Seagate Technologies (znalem dobrze ich system operacyjny z jednej ksiazki) i wlamalem sie na strone WWW. Nie tracac czasu przekazalem paleczke naszemu specowi od HTMLa , czyli panu Mietkowi, sam zas zajalem jego miejsce. Tak jak sie umowilismy wczesniej Mietek dokonal zmian bezposrednio w kodzie html przy pomocy edytora dysku na serwerze. Teraz trudne zadanie czekalo pania Wande. Musiala nadawac przez 20 minut tekst naszego manifestu... Kolejne miesiace plynely grupie "sendbajt" szybko. Po pierwszych sukcesach na stronach WWW probowali wlamywania na amerykanskie serwery wojskowe i rzadowe, co bylo od zawsze skrytym marzeniem Jana S. Niestety, pomimo poprawienia (na skutek zaprawy czlonkow "Sendbajt") parametrow transmisji (dochodzila ona do 1200 bps ) nie dalo sie w dalszym ciagu sciagac wiekszych plikow binarnych. Rekordem grupy byl download kodu zrodlowego do Internet Explorera v 2.0 (po wlamaniu na serwer firmy Microsoft). Poprawilo to nawigacje w sieci www gdyz pan Mietek nauczyl sie tego kodu na pamiec i robil po prostu za przegladarke (jak bylo trzeba to szkicowal na kartce jpgi i gify zeby kazdy mogl podziwiac szate graficzna danej strony). Tymczasem pan Jan zaliczal coraz to nowe miejsca www, haczyl i ewentualnie niszczyl serwery internetowe jeden za drugim. Jednym slowem grupa rozwijala sie i z dnia na dzien stawala sie w Sieci coraz bardziej popularna. Na wszystkich administratorow padl blady strach. Wiekszosc z nich zaczela do wymiany informacji uzywac tradycyjnej poczty snail-mail, do tego stopnia byli sterroryzowani przez czlonkow grupy "Sendbajt". Oczywiscie przez caly ten czas grupa korzystala podczas uprawiania swego procederu z roznych numerow telefononow, poczatkowo sasiadow z bloku, ale pozniej pan Mietek wynalazl swietne miejsce kolo przedszkola dwie ulice dalej. Chodzili tam wiec nocami, wpinali hackomat i siadali w krzakach, z daleka od ludzi. Pewnie sie spodziewacie, ze w koncu policja nakryla grupe "Sendbajt" i zirytowani admini ukamienowali za miastem jej czlonkow, wzglednie Jan S. wyladowal w wiezieniu jak przystalo na hackera-legende ? Otoz nie. Dzialalnosc grupy trwalaby zapewne po dzis dzien gdyby pan Jan nie odkryl nowej pasjii zyciowej - mianowicie wedkarstwa. No niestety bez pana Jana grupa "Sendbajt" szybko sie rozpadla. Spotykaja sie jednak czasem w piwnicy jak za starych czasow i przesiaduja na IRCu lub pan Jan sciaga sobie stronki o wedkarstwie. Poza tym sa szczesliwi. Admini tez, ze cala sprawa przycichla... Nadal wydaje im sie ze ich systemy sa dobrze zabezpieczone i moga spac spokojnie. Niech spia...

Slowsort w Elixirze i testująca dokumentacja

Za trzy dni będzie premiera Javy 9. Dlatego właśnie czas napisać coś o Elixirze. Dziś na tapecie ląduje jeden z ciekawszych elementów języka, czyli wykonywalna dokumentacja.

Chwila teorii

Gdy dokumentujemy jakiś fragment kodu, to często aż prosi się dołączyć jakiś przykład. Coś w rodzaju dla takich danych otrzymasz taki rezultat. Wszystko fajnie, bo taki przykładowy happy path pozwala na zrozumienie kodu. Z drugiej strony przykład zazwyczaj kopiujemy z testów, bo tam jest gotowe, a później, jak się testy zmienią, to już niekoniecznie aktualizujemy dokumentację.
A gdyby tak w dokumentacji zaszyć testy i niech narzędzia martwią się jak to uruchomić?

Chwila praktyki

Na tapetę wziąłem algorytm SlowsortW. Z kilku powodów. Po pierwsze jestem w trakcie pisania kursu ze struktur danych na potrzeby naszego centrum szkoleniowego i implementacja slowsorta jest całkiem fajnym ćwiczeniem. Proste, a jednocześnie nietypowe. Po drugie chcę wykorzystać ten kod w czasie mojej prezentacji na JDD. Po trzecie, jak już implementować coś głupiego, to niech to będzie naprawdę głupie 😀

Kod wygląda tak:

Listing 1. implementacja Slowsort w Elixirze

defmodule Slowsort do
  @moduledoc """
  Documentation for Slowsort.
  """

  @doc """
  Example implementation of Slowsort algorithm.

  ## Examples

      iex> Slowsort.sort([0])
      [0]

      iex> Slowsort.sort([1,0])
      [0, 1]

      iex> Slowsort.sort([3, 11,  1, 0, 22, 2])
      [0, 1, 2, 3, 11, 22]
  """
  def sort(numbers) do
    l = length numbers
    slowsort(numbers, 0, l - 1) # we need maximum index that is length - 1
  end

  defp slowsort(numbers, i, j) when i>=j, do: numbers

  defp slowsort(numbers, i, j) do
    m = Integer.floor_div((i + j), 2)
    slowsort(numbers, i, m)
              |> slowsort(m + 1, j)
              |> swap(j, m)
              |> slowsort(i, j - 1)
  end

  defp swap(numbers, j, m) do
       max_left = Swap.nth(numbers, m);
       max_rigth = Swap.nth(numbers, j);
       swap(numbers, j, m, max_rigth, max_left)
   end

   defp swap(numbers, j, m, mr, ml) when mr < ml, do: Swap.of(numbers, j, m)
   defp swap(numbers, _, _, mr, ml) when mr >= ml, do: numbers
end

Do tego oczywiście są jeszcze testy:

Listing 2. Zestaw testów

defmodule SlowsortTest do
  use ExUnit.Case
  @moduletag timeout: 1000
  doctest Slowsort

  test "the empty array" do
    sorted  = Slowsort.sort []
    assert sorted === []
  end

  test "the simple array of two elements" do
    sorted  = Slowsort.sort [1, 0]
    assert sorted === [0, 1]
  end

  test "the array of many elements" do
    sorted  = Slowsort.sort [3, 11,  1, 0, 22, 2]
    assert sorted === [0, 1, 2, 3, 11, 22]
  end
end

Technicznie są tu dwa zestawy testów. Zwróćcie uwagę na dokumentację funkcji sort. Zdefiniowana jest tam sekcja Examples, która wygląda jak fragment kodu w markdownie. I rzeczywiście, jeżeli wygenerujemy dokumentację, to otrzymamy jakiś nagłówek. Znacznie ciekawiej jest, jeżeli uruchomimy testy za pomocą mix test.

Listing 4. Zrzut z testów

Compiling 1 file (.ex)
......

Finished in 0.1 seconds
6 tests, 0 failures

Uruchomiono sześć testów. Trzy zdefiniowanie w slowsort_test i trzy zdefiniowane w dokumentacji.

Podsumowanie

Możliwość zdefiniowania prostych testów bezpośrednio w dokumentacji jest bardzo fajnym rozwiązaniem. Pozwala to na jednoczesną aktualizację testów, jak i dokumentacji. Szkoda, że w Javie nie ma takiego narzędzia. Oj szkoda…

Kod dostępny jest tutaj.

Przekwalifikowanie się na…

Dziś super krótko, bo ostatnie dwa tygodnie miałem mocno obłożone, a kolejne trzy udowadniają, że można jeszcze więcej.

Jak ktoś w dyskusji podnosi argument, że zawsze można się przekwalifokować, to polecam lekturę Tuwima

Murarz domy buduje,
Krawiec szyje ubrania,
Ale gdzieżby co uszył,
Gdyby nie miał mieszkania?

A i murarz by przecie
Na robotę nie ruszył,
Gdyby krawiec mu spodni
I fartucha nie uszył.

Piekarz musi mieć buty,
Więc do szewca iść trzeba,
No, a gdyby nie piekarz,
Toby szewc nie miał chleba.

Tak dla wspólnej korzyści
I dla dobra wspólnego
Wszyscy muszą pracować,
Mój maleńki kolego.

Bo kto cię uratuje, jak ratownik medyczny zostanie web developerem?

Poniedziałkowo

I pamiętaj, ktoś może mieć gorszy poniedziałek niż ty. Nawet jeżeli jest tylko bakterią:

ps. wiem, że nie ma nic wspólnego z programowaniem, ale powinno trafić na JVMBloggers

Gdzie trenować swoje umiejętności?

Ta naprawdę to nie jest post, a jedynie zaproszenie na stronę, na której zbieram linki do serwisów, gdzie można trenować kodowanie. Forma strony jest lepsza, bo aktualizacja jest prostsza w porównaniu z aktualizacją posta 😀

Gdzie trenować swoje umiejętności?

Odchudzanie komputera z nadmiarowego acz potrzebnego softu

Mam okazję pracować na kilku różnych komputerach. W domu jest to całkiem potężna maszyna z procesorem i7-6700k i 16GB RAM (mało, ale na razie OutOfMoneyError) oraz mocno przedpotopowy laptop (i5-430M 8GB RAM). W pracy mam desktopa, który próbuje działać i laptopa, który nawet nie próbuje. W domu Ubuntu, w biurze Win7. Problem komputerów biurowych jest nienaprawialny, ale na domowym laptopie postanowiłem trochę się pobawić.

Problem

Wraz z upływem czasu instalujemy różne oprogramowanie. A to potrzebny jest mySQL, a to Postgres, a to Tomcat7 albo jakiś Glassfish. Nie wspominając już o wszelakich MongoDB, Jenkinsach itp. wynalazkach. Po prostu nasza codzienna praca wymaga pewnych narzędzi na lokalnej maszynie. Po pewnym czasie ilość narzędzi i dodatków drastycznie wzrasta, a services mówi nam, że nie jest dobrze:

Listing 1. Aktywne serwisy na moim laptopie (wycinek)

$ services --status-all
 [ + ]  jenkins
 [ + ]  mongodb
 [ + ]  mysql
 [ + ]  postgresql
 [ + ]  virtualbox

A teraz niech jeszcze się okaże, że taki postgres potrzebny jest w kilku wersjach, bo coś tam, albo potrzebujemy bazę Oracle. O ile na dużej maszynie, to jeszcze jakoś zadziała, to na starym laptopie będzie już kiepsko. Co więcej serwisów tych potrzebujemy tylko wtedy, gdy pracujemy. Cały pozostały czas, to zapychacze pamięci i procesora. Co prawda skala problemu może nie być duża, bo takie mongo pochłania 1% CPU na 5 sekund. Przy ośmiu rdzeniach to tyle co nic, ale to jest puste mongo…

Rozwiązania

Zastanówmy się zatem, jak można rozwiązać ten problem – działania zbędnych serwisów. Od razu mówię, że rozwiązań jest kilka i wybór konkretnego jest mocno uzależniony od konkretnej sytuacji. Rozwiązanie preferowane przeze mnie nie musi być najlepsze dla ciebie. Choć w 95% przypadków i tak je wybierzesz 🙂

Nie uruchamianie serwisów przy starcie systemu

Pozwolę sobie to podsumować obrazkowo:

Jeżeli coś instalujemy jako serwis, to chcemy mieć serwis, ze wszystkimi konsekwencjami. Oczywiście, nie jest to takie proste. Jeżeli chcemy mieć kilka wersji postgresa, to możemy wybrać jedną, która będzie „tą główną”, a reszta będzie startować na żądanie. Jednak jak już mamy kilka wersji postgresa, to raczej będziemy chcieli inaczej zarządzać tym majdanem.

Delegacja

Delegacja jest chyba pierwszym pomysłem, jaki przychodzi do głowy wielu osobom, gdy mówimy o pracy z wieloma instancjami baz danych albo z CI. Polega na użyciu zdalnego rozwiązania. Tyle tylko, że my chcemy mieć serwis lokalnie. Takie rozwiązanie ma swoje zalety, bo uniezależnia nas od naszego komputera. Musimy zmienić komputer, nie ma problemu, bo dane są „gdzieś w sieci”. Tyle tylko, że brak sieci, to brak dostępu do danych. Zazwyczaj to prowadzi nas do instalacji lokalnych.

Pełna wirtualizacja

Pod pojęciem pełnej wirtualizacji rozumiem wykorzystanie na przykład VirtualBoxa. Tworzymy maszynę wirtualną, na niej instalujemy jakiś system operacyjny i następnie instalujemy interesujące nas oprogramowanie. Wszystko ładnie i pięknie działa. To rozwiązanie stosowałem już w kilku miejscach i zazwyczaj świetnie się sprawdzało. Ma ono jedynie tę wadę, że wymaga dość dużo zasobów. Narzut jest na tyle duży, że do naszej maszyny wirtualnej powinny trafić różne rzeczy, co oczywiście jest OK, ale w pewnym momencie mamy ten sam problem. Tyle że na wirtualce. Możemy jednak pójść w to rozwiązanie jeżeli chcemy pracować z technologiami z innego systemu operacyjnego. Na przykład mamy jakiegoś UX-a, a musimy skorzystać ze sraczyka… znaczy sie z IIS+MSSQLa.

Konteneryzacja

I to jest oczywiste rozwiązanie 🙂 Bierzemy Dockera i przygotowujemy sobie kilka obrazów. Jak potrzeba nam jakiegoś konkretnego softu, to uruchamiamy taki obraz i działa. Ale… no właśnie jest jedno, a w zasadzie dwa, ale. Pierwsze dotyczy uruchamiania oprogramowania, które nie jest przeznaczone dla naszego systemu operacyjnego. W tym przypadku się nie da, względnie takie oprogramowanie wymaga kombinowania. Drugim jest konieczność odpowiedniego, dodatkowego skonfigurowania oprogramowania. Przykładowo, jeżeli chcemy mieć kilka instancji postgresa, to niezbyt dobrym pomysłem jest składowanie danych w domyślnym katalogu. Po prostu będzie się to gryźć samo ze sobą. Dlatego musimy odpowiednio przygotować własny obraz albo skrypt, który uruchomi nam obraz z odpowiednimi parametrami. Zaletą jest stosunkowo niewielki narzut po stronie dockera (w sumie zerowy, bo wykorzystujemy istniejące mechanizmy jądra) oraz łatwość w użyciu.
Co więcej, jeżeli koniecznie chcemy całość odizolować, to możemy naszego dockera zamknąć w jakimś vagrancie, ale to już sztuka dla sztuki… choć użytkownicy maców często tak robią. Może wpływ opiatów?

Podsumowanie

Mojego prywatnego laptopa powoli przestawiam na model z dockerem. Jest to o tyle ważne, że ma on już kilka dobrych lat i po prostu nie działa już tak szybko, jak bym chciał. Wyczerpałem też możliwości rozbudowy zarówno jeśli chodzi o RAM, jak i dysk ssd. Pozostaje zatem kombinowanie z oprogramowaniem. Docker wydaje się odpowiednią ścieżką. Będzie działać z Ubuntu 14.04. Zapewnia znaczną elastyczność i łatwość w migrowaniu. Będzie dobrze 🙂

Część wspólna zbiorów z Guavą

Szybkie rozwiązanie problemu opisanego tutaj. Mamy dwa zbiory A i B, chcemy sprawdzić, czy wszystkie elementy ze zbioru A są obecne w zbiorze B. Najprościej jest to zrobić w następujący sposób:

Listing 1. Wykorzystanie API

public class SetsIntersectionExample {

	public static void main(String[] args) {
		// Smoki i gołe baby
		Fairy fairy = Fairy.create();

		Set<String> persons = Stream.generate(() -> fairy.person(PersonProperties.male())).limit(100)
				.map(Person::firstName)
				.collect(Collectors.toSet());
		// Magia, bo chcemy mieć pewność, że mamy istniejące imiona.
		Set<String> names = Sets.newHashSet((String) persons.toArray()[0], (String) persons.toArray()[1]);
		// end: Smoki i gołe baby
		
		System.out.println(persons);
		System.out.println(names);
		System.out.println(persons.containsAll(names));
	}
}

Takie rozwiązanie podał Jakub Dyszkiewicz i prościej się nie da. Cytując dokumentację:

Returns true if this set contains all of the elements of the specified collection. If the specified collection is also a set, this method returns true if it is a subset of this set.

źródło

Przy czym jest, to dość słabo zaimplementowane:

Listing 2. AbstractCollection.containsAll wygląda tak:

public boolean containsAll(Collection<?> c) {
    for (Object e : c)
        if (!contains(e))
            return false;
    return true;
}

Sprawa trochę się komplikuje, gdy chcemy mieć informację o części wspólnej obu zbiorów. Tu jednak z pomocą przychodzi Guava, która ma klasę narzędziową Sets, która znowuż zawiera metodę intersection:

Listing 3. Użycie Sets.intersection

public class SetsIntersectionExample {

	public static void main(String[] args) {
		// Smoki i gołe baby
		Fairy fairy = Fairy.create();

		Set<String> persons = Stream.generate(() -> fairy.person(PersonProperties.male())).limit(100)
				.map(Person::firstName)
				.collect(Collectors.toSet());
		// Magia, bo chcemy mieć pewność, że mamy istniejące imiona.
		Set<String> names = Sets.newHashSet((String) persons.toArray()[0], (String) persons.toArray()[1]);
		// end: Smoki i gołe baby

		System.out.println(persons);
		System.out.println(names);
		System.out.println(persons.containsAll(names));
		System.out.println(Sets.intersection(persons, names).size() == names.size()); // to samo co wyżej
		System.out.println(Sets.intersection(persons, names));
	}
}

Implementacja jest w tym przypadku podobna (taka sama złożoność), ale trochę bardziej skomplikowana, bo wynikiem jest SetView. Jedyny problem, jaki będzie tu nas drażnił, to duże zbiory danych. W takim wypadku wyszukiwanie części wspólnej będzie długotrwałe.

Z Javy 8 na Javę 9, czyli co wybuchnie

Małe rzeczy zawsze cieszą. Jedną z nich jest możliwość bezproblemowego migrowania z Javy 8 na Javę 9. Fajnie by było, gdyby taka migracja przeszła bez większych zgrzytów, dlatego warto czasami rzucić okiem, co wypluwa nam nasz kompilator.

A wypluć może on na przykład:

Listing 1. Co nam mówi kompilator

Warning:(30, 53) java: '_' used as an identifier
  (use of '_' as an identifier might not be supported in releases after Java SE 8)

Co prawda, jeżeli użyjemy podkreślenia jako parametru wyrażenia lambda, to będzie klasycznie fail:

Listing 2. Co nam mówi kompilator w lambdzie

Error:(30, 32) java: '_' used as an identifier
  (use of '_' as an identifier is forbidden for lambda parameters)

Jednak warto o tym pamiętać. W czym rzecz. W Javie 8 zaczęto wycofywać znak podkreślenia _ jako prawidłowy identyfikator zmiennej/parametru. Uzasadnienie od Briana Goetza jest takie:

Yes, we are „reclaiming” the syntactic real estate of „_” from the space of
identifiers for use in future language features. However, because there are
existing programs that might use it, it is a warning for identifiers that occur
in existing syntactic positions for 8, and an error for lambda formals (since
there is no existing code with lambdas.)

Your suspicion is mostly right, except that we are certainly NOT going to do
Scala’s „wunderbar”. However, things it might be used for include things like
„I don’t want to give this variable a name” (such as catch parameters that are
never used.)

źródło

Zatem, zanim przejdziemy na Javę 9, to warto przejrzeć swój kod źródłowy pod kątem tego problemu. W szczególności dotyczy to kodu starszego niż Java 8. Tu nie mamy żadnego ostrzeżenia.

Co w zamian?

Znak podkreślenia jest powszechnie stosowany jako marker „do olania”, ale w tej sytuacji nie można go już stosować w Javie. W zamian pozostaje stosowanie podwójnego znaku podkreślenia tzn. __ albo znaku dolara $.