Hurricane Electric Free DNS – Moje odkrycie roku

W trakcie formatu mojego VPS’a (o którym pisałem w poprzednim poście) dotarło do mnie, że WordOps nie ogarnia DNS’ów. Nie był to dla mnie problem, bo korzystałem kiedyś z MaraDNS, który wg mnie jest o niebo bardziej czytelny i lepszy od rozpowszechnionego i antycznego Bind9 (mogę w sumie kiedyś o tym napisać więcej). Ale nie chciałem chyba się znowu pchać w utrzymywanie serwera DNS na własnym VPS’ie. Co prawda były tego zalety, ale nie po to przenosiłem się na WordOps, żeby teraz znowu dokładać sobie manualnej roboty. Przypomniałem sobie, że lata temu czytałem gdzieś, że ktoś gdzieś mówił, że amerykański dostawca Hurricane Electric, udostępnia darmowy serwer DNS. Wtedy z tego zrezygnowałem, bo wydawało mi się, że muszę przecież mieć serwer DNS lokalnie, ale dzisiaj dotarło do mnie, że no nie muszę. Postanowiłem więc przyjrzeć się niemu bliżej.

Na pierwszy rzut oka

Strona Hurricane Electric jest dość… niepozorna. Kojarzy się raczej z jakąś stroną nie zmienianą od 2001 roku.

Screenshot storny głównej he.net

Link do darmowego serwera DNS to po prawej „Free DNS” (zaznaczyłem na czerwono). Co ciekawe każda podstrona jest inna pod względem linków. Nawigacja po systemie jest dla mnie dość wymagająca, ale chyba powoli się przyzyczajam (no i porobiłem sobie zakładki, do tego czego potrzebuje 😉 ).

Polecam sobie poczytać „ficzery” jakie wspomniana usługa posiada:

  • Wsparcie zarówno dla zapytań przez IPv4 jak i natywnego IPv6.
  • Obsługa rekordów A, AAAA, ALIAS, CNAME, CAA, MX, NS, TXT, SRV, SSHFP, SPF, RP, NAPTR, HINFO, LOC i PTR
  • Jakiś tam „sprytny tryb” do ogarniania odwrotnej stref (reverse zones)
  • Wsparcie dla „slavów”.
  • Wiele formatów odwrotnych stref: Standard, RFC 4183, RFC 2317, DeGroot.
  • Odpytywanie geograficznie najbliższego serwera HE.
  • Sprawdzanie poprawności delegacji stref (w obie strony).
  • Podstawowe sprawdzanie składni rekordów.
  • Wiele domen dla jednego konta.

Jak na darmową obsługę, to muszę powiedzieć, że jestem w szoku. W dodatku 0 reklam na stronie.

Konto

Do korzystania z konta trzeba zarejestrowć darmowe konto. Niestety formularz rejestracyjny jest dość długi (trzeba podać wszystkie dane teleadresowe).

Widok prezentujący formularz rejestracji na he.net

Plusem jest to, że jedno konto gwarantuje nam dostęp do wszystkich usług HE.

Na pochwałę zasługuje możliwość włączenia uwierzytelnienia wieloskładnikowego (co z resztą czym prędzej uczyniłem).

Minusem jest to, że do każdej usługi musimy logować się osobno. Jest to zapewne związane z bezpieczeństwem. Podejrzewam, że twórcy używają ciasteczek do trzymania sesji, i nie chcieli używać wildcarda dla wszystkich subdomen *.he.net (co z resztą jest mądrym posunięciem). A tak to już jest, że najczęściej się wybiera: albo UX, albo security, albo ficzery.

Usługa

UI jest ponownie skromny, ale czytelny. Po lewej mamy to co zapewne najbardziej zainteresuje, a więc „Add a new domain”. Po kliknięciu pojawia się modal z polem do wpisania nazwy domeny. Przejście dalej spowoduje nie tylko dodanie domeny do naszej listy, ale także sprawdzenie czy na pewno domeny są skierowane na odpowiednie serwery he.net.

Widok prezentujący listę domen na dns.he.net

Po dodaniu pojawia nam się widok szczegółów domeny (ten sam jak byśmy kliknęli daną domenę na liście). Ponownie: widok jest prosty i czytelny. Przyciski w wierszu tuż nad tabelką pozwalają w bardzo szybko dodać nowe rekordy, których potrzebujemy. Skonfigurowanie wszystkich moich domen zajęło mi może 10 minut. Zero bawienia się z dokumentacją Bind9, itp.

Widok stonry dns.he.net, który prezentuje szczegóły domeny marverix.blog

Działa

DNSPerf dał he.net 41/71 pozycję w rankingu. Czy to daleko? Cóż, pewnie do takich gigantów jak Google czy CloudFlare. Ale za 0zł otrzymujemy dostęp do usługi, która z Europy odpowiada w 30ms (z mojego komputera 35ms), uptime 99.97% i prosty UI, bez reklam i pierdyliardem okienek do zamknięcia. Jasne, mógłbym pewnie zapłacić za utrzymanie na płatnym serwerze, ale czy ktoś zauważy różnicę? 35ms to naprawdę dla mnie niewiele (zwłaszcza, że DNSy są później cachowane lokalnie, więc to tylko za pierwszym razem dodatkowy czas).

Zrzut ze strony DNSPerf przedstawiającą wyniki testów wydajności dla he.net

Najfajniejsze dla mnie jest to, że to po prostu działa. Koniec z utrzymywaniem serwera u siebie. Koniec z bawieniem się w dodatkowe serwery mirrorowe.  Mi to totalnie wystarcza i nie zapowiada się, żebym w najbliższych latach zmieniał usługodawcę 🙂

Virtualmin? Nigdy więcej

Virtualmin to  panel administracyjny o otwartym źródle (ale istnieje też płatna wersja Pro), który ma być alternatywą chociażby dla cPanel’u czy Plesk’a. Zainstalowałem go 5 lat temu na swoim VPS’ie. Na początku zaimponował mi możliwościami i mnogością opcji.

Panel ma wbudowane mega dużo funkcji, które pozwalają za skonfigurowanie i zarządzanie swoim serwerem. Ale po czasie ta mnogość zaczęła mnie przytłaczać. Dlaczego? Bo jest rzucona użytkownikowi na twarz. UI jest stary i toporny (co prawda jest „nowa” wersja, ale umówmy się, że to taki bardziej 2013 niż 2021). Nauka gdzie jest jaka opcja zajęło mi trochę czasu.

Do tego UI’a można się przyzwyczaić. Mój VPS ma 4 wirtualne rdzenie i 8GB RAM’u. Ktoś powie, że mało jak na dzisiejsze czasy, ale ja powiem, że mi to wystarcza. Mimo tego, było gołym okiem widać jak Virtualmin kocha zasoby. Nic dziwnego – w końcu ten system robi tak dużo. Ale ponownie – jeżeli ktoś np. chce znaleźć darmowy system dla swojej startującej firmy hostingowej… no to ok. Podejrzewam, że będzie miał sprzęt lepszy niż mój.

Nie mam na to dowodu, ale nie grzebałem w konfiguracji manualnie. Wszystkimi konfiguracjami Apache’a, MySQL’a, PHP’a itp zarządzał on. Ale gdy odpalałem np. bloga mojej żony, to „strona potrafiła myśleć” najpierw 10 sekund zanim cokolwiek się otworzyło. Na wykresach Virtualmin’a było ewidentnie widać jakieś dziwne piki zużycia CPU. Po co? Dlaczego? Jak to zdebugować? Nie wiem. Wiem jedno – na moim hostingu na Linuxpl.com, gdzie nie miałem nawet pół rdzenia procesora, ta sama strona po prostu śmigała.

Ostatnio robiłem stronę radiodroga.net, i szukałem jakieś prostego panelu lub narzędzia, który szybko skonfiguruje za mnie Ngnix’a, PHP’a i inne takie. I tak natrafiłem w sieci na CLI WordOps. Zainstalowaliśmy. Instalacja i postawienie działającego WordPress’a trwało 5 minut, a może nawet mniej. Byłem w szoku. Szybko, bez zbędnego UI’a, który zżera zasoby. No i twórcy zarzekają się, że projekt jest „security-oriented”.

Postanowiłem spróbować u mnie. Zgodnie z instrukcją na stronie WordOps o migracji z innych serwerów (ale nie systemów!) zrobiłem backup baz WordPress’ów. Skopiowałem pliki. Sprawdziłem 5 razy czy wszystko mam i postanowiłem odinstalować Virtualmina… Na stronie panelu jest „jednolinijkowiec”, który (teoretycznie) robi deinstalację. Spróbowałem.

Gdy skrypt skończył, okazało się, że tak, odinstalował wszystkie swoje paczki, ale syf konfiguracyjny jaki po sobie pozostawił to była tragedia. Wszyscy użytkownicy i grupy? Zostawione (nawet „webmin” i „virtualmin”!). Usługi? Część wyłączona, a część nie. Konfiguracje usług? Zostawione. Efekt był taki, że WordOps nie mógł dobić się do MySQL’a (MariaDB).  Robiłem apt purge, szukałem na necie how-to, próbowałem wszystkiego. Nic. Jeden problem rozwiązywałem, pojawiał się kolejny i kolejny.

Usiadłem do tego o 21, bo miałem nadzieję, że w godzinę się uwinę. Od konsoli SSH do mojego VPS’a odszedłem zrezygnowany i załamany o 00:30. Odinstalowanie Virtualmin’a rozpierniczyło mojego VPS’a. Wyjście było jedno… format. Na szczęście w panelu klienta OVH to 3 kliknięcia.

Jako programista, oprogramowanie, które nie potrafi posprzątać po sobie, jest nic warte. Jeżeli umiesz napisać instalator, to napisz kuźwa porządny deinstalator. Zwłaszcza jeżeli chodzi o coś, co ma pracować na serwerach, które są gdzieś hen daleko i nie masz do niego fizycznego dostępu.

Moją przygodę z Virtualmin’em mogę porównać chyba jak do jakiegoś toksycznego związku. Gdy masz dość i ogłaszasz, że czas się rozejść, to druga połowa robi scenę i za karę demoluje ci mieszkanie.

Nigdy więcej. Nie polecam.

Komputer masz w swojej kieszeni

Popatrz na swój telefon komórkowy. Co widzisz? Urządzenie, które służy do dzwonienia i pisania SMSów, i nic więcej? Czy może widzisz multimedialny kombajn do czytania wiadomości ze świata, robienia zdjęć, serfowania po internecie, odpisywania na maile, oglądania filmów i seriali oraz grania? A teraz wyobraź sobie laptopa (domowego, nie służbowego). Co na nim robisz? Czyżby lista była podoba?

Nie wiem jak Ty, ale ja jak patrzę na mój telefon komórkowy, to widzę komputer. I tak postrzegam to małe urządzenie już od liceum – od kiedy kupiłem swoją pierwszą Nokię z Symbianem. Tak, dzisiejsze smartfony to (nie boję się tego powiedzieć) pełnoprawne komputery, czasami wielokrotnie przewyższające wydajnością laptopy „w super cenie” z różnych popularnych marketów elektronicznych. Ba, myślę, że czasami biją na głowę niektóre komputery stacjonarne.

Aktualnie przeciętny smartfon, ma co najmniej 8 rdzeni, 6GB RAM, 64GB pamięci wbudowanej (+ często można spotkać możliwość rozbudowy), wyświetlacz, WiFi, Bluetooth, i port USB-C. I to ostatnie jest bardzo istotne. Bo USB-C to nie tylko nowe „dwustronne gniazdko do ładowania telefonu”.

Moc USB-C

Port, o którym mowa, to ten w kształcie toru wyścigowego – prostokąt z zaokrąglonymi kątami. Możesz go głównie kojarzyć z bardzo szybkim ładowaniem telefonu. I chociaż jest to prawda, to jest to jedynie muśnięcie jego możliwości.

Nie będę tutaj zanudzać specyfikacją techniczną (zainteresowanych odsyłam to bardzo dobrego artykułu na angielskojęzycznej Wikipedii). To co jest istotne, że USB-C jest trochę jak pierścień Saurona z Władcy Pierścieni – jeden by rządzić wszystkimi. Dzięki swobodzie jaką daje możliwość zdefiniowania własnego trybu działania USB-C, potencjał jest teoretycznie nieogarniczony. Aktualnie za pomocą tego portu można:

  • ładować telefon
  • ładować komputer (patrz chociażby MacBooki)
  • przesyłać dźwięk (patrz na przejściówki USB-C –> mini jack)
  • przesyłać obraz
    • pracować jako port HDMI
    • pracować jako port DisplayPort
  • obsługa VR (cokolwiek to znaczy)
  • no i oczywiście podłączać wszystkie urządzenia pracujące pod USB 2.0, USB 3.0 itp

Możesz się zastanawiać czy to nie jakiś żart. Jak to możliwe, że jeden mały port może służyć do tylu rzeczy? Ponownie – nie wdając się w szczegóły – ma to swoją cenę. Dosłownie i w przenośni. Pełnoprawne kable USB-C (nie wykastrowane z poszczególnych ścieżek) są o wiele droższe od swoich poprzedników. Wszystko przez to, że taki kabel ma ścisłe wymagania jakościowe. Oglądając 2 lata temu filmik z fabryki w Chinach gdzie produkowano kable USB-C, byłem w szoku jak skomplikowany jest to proces. Nijak się to ma to prostych 4-żyłowych kabelków poprzedniej generacji.

Ale wracając do tematu. Jeżeli w Twojej głowie zrodziło się pytanie „Marek, chcesz powiedzieć, że mój telefon obsługuje wszystkie te rzeczy?”, to jest to bardzo dobre pytanie.

Teoria kontra praktyka

Czysto teoretycznie? Tak. Niestety producenci telefonów szukając oszczędności ucinają możliwości USB-C. Tzn. że tak, to jest port USB-C, ale tylko z zewnątrz. Czyli fizycznie, więszość styków na płycie głównej nie jest nigdzie podłączona. Wystarczy wejść np. na GSMArena i poszukać swojego modelu telefonu, a następnie zjechać do sekcji „USB”. Jeżeli widzisz napis typu „USB Type-C 2.0”, no to masz okrojoną wersję i niestety nie będziesz w stanie przetestować tego co będę dalej pokazywał.

A jeżeli wspiera? No potrzebujesz tylko jednej rzeczy: hub.

Replikator portów

To urządzenie można znaleźć pod wieloma nazwami: hub usb-c, replikator portów usb-c, stacja dokująca usb-c… Ale jest to jedno i to samo urządzenie, które ma jeden cel: umożliwić podłączenie urządzeń korzystających z różnych gniazdek, pod jedno gniazdko USB-C.

Cena takiego urządzenia jest zależna od tego co ma mieć (jakie porty obsługiwać), no i firmy (a więc najczęściej – jakości [aczkolwiek nie jest to pewnik]). I tutaj z doświadczenia napiszę, że naprawdę nie warto żyłować 20zł mniej. Tak jak wspomniałem wcześniej, USB-C to naprawdę wymagający standard.

Będziemy szukać huba, który ma HDMI, co najmniej jeden port USB (typu A [a więc ten duży prostokątny co nigdy nie wiadomo, w którą stronę wtyczkę włożyć]) i co najmniej jeden port USB-C.

Ja po krótkich poszukiwaniach znalazłem kilka ofert wartych zastanowienia:

Osobiście bardzo lubię produkty naszego południowego sąsiada – marki i-tec. Korzystam zarówno w pracy, jak i w domu i nigdy nie było problemów.

Niech stanie się światłość

Możesz zastanawiać się o co mi w ogóle chodzi w tym wpisie? Miało być o komputerze w kieszeni, a tu o jakimś USB-C, replikatorach portów itp. I ta droga sprowadza się właśnie do tego. Podłącz kabel HDMI, myszkę i klawiaturę (ja mam bezprzewodową w jednym „donglu” USB), oraz ładowarkę do portu USB-C (na replikatorze!), a następnie replikator do komórki:

(Jak widać, ja mam jeszcze połączony kabel sieciowy, bo tak – to też działa bez najmniejszego problemu 😉 )

Jeżeli twój telefon obsługuje HDMI przez USB-C, to Android powinien pokazać coś w tym stylu:

Klikam w „Tryb pulpitu” i…

A nie mówiłem?

Co to za czary?

Żadne czary. Tak jak w tytule – Twój smartfon to pełnoprawny komputer. A od wielu lat Huawei i Samsung bardzo mocno rozwijają właśnie ten aspekt ich nakładek na system Android – żeby użytkownik mógł korzystać z telefonu jak z komputera. Udało się? Oceńcie sami.

Rozglądnijmy się

Mamy ikonki na pulpicie. Mamy „Start” w dolnym lewym rogu. W prawym głośność, komunikacja, bateria, zegar. Znajome? No i kursor też jest – bo steruje się normalnie myszką 🙂 (Swoją drogą mój telefon może pracować jako touchpad w tym trybie!)

Kliknięcie prawy przyciskiem myszki w daną ikonkę otwiera menu podręczne.

Po kliknięciu w ikonkę „Start” (nie wiem jak się on naprawdę nazywa, ale każdy wie o co chodzi) pojawia się lista zainstalowanych aplikacji.

A tak wygląda „Centrum powiadomień”.

Nie ma przycisku wyłączenia, ale jest możliwość zablokowania ekranu (tak, kombinacja klawiszy Win+L działa).

Obsługa aplikacji

Aplikacje otwierają się w okienku. Można je zminimalizować, powiększyć, przesywać, zmieniać rozmiar itp.

Bez problemu odtwarzał się film w jakości 1080p, w tle chodził Firefox i foobar2000.

Działa skrót klawiszowy do przełączania między aplikacjami (Alt+Tab):

Z tego co mi wiadomo, twórca aplikacji może sam zdefiniować jak ma wyświetlać się jego aplikacja w trybie desktop. A w dodatku może całkowicie zablokować używanie aplikacji w takim trybie. Nie mniej, jeżeli deweloper nie zdefiniuje tego, to system Android (a może nakładka EMUI od Huawei?) zrobi co w jego mocy, żeby wyświetlić poprawnie aplikację.

Pisanie

Jeszcze 4 lata temu Android bardzo kiepsko obsługiwał polski język na fizycznej klawiaturze. A dziś ku mojemu bardzo pozytywnemu zaskoczeniu jest to banalnie proste. W Ustawieniach wpisałem klawiatura, a wyszukiwarka podpowiedziała klawiatura fizyczna.

Kliknąłem w moją klawiaturę Logitech K350 i z listy wybrałem polski. Działa?

Ekstra!

A jak z programami typu Word? No bo jest Word na Androida. Jak się okazało… wujek Microsoft się wycfanił, i jeżeli aplikacja wykryje, że pracujemy w trybie desktop to… każe wykupić pakiet Office 365. Tzn. nie spodziewałem się chyba niczego mniej. Na szczęście można aktywować 30 dniowy okres próbny (po podaniu karty kredytowej).

Pomijając to, że musiałem aktywować abonament to byłem pozytywnie zaskoczony. Co prawda nie jest to tak zaawansowane jak na wersji Windowsowej, czy jak LibreOffice, ale myślę, że zaspokoi potrzeby większości ludzi.

Zastosowania profesjonalne

Cóż, jako programista fajnie by było zobaczyć jakieś podstawowe IDE. Marzyło mi się VSCode, ale ponieważ używa Electrona pod spodem, a twórcy Elecrona powiedzieli, że nie będą wspierać Androida… no to niestety.

Byłem natomiast bardzo mile zaskoczony jak dobrze działa Termux w tym trybie. Po podłączeniu się przez ssh do swojej głównej maszyny obawiałem się, że raczej nie ma co liczyć żeby działały takie programy jak nnn czy nano. Ale ku mojemu ogromenu zaskoczeniu wszystko śmigało jak należy. To znaczy, że wystarczy podłączyć się przez VPN do swojej sieci domowej, (o ile nie masz nic przeciwko pracy w terminalu [ja nie mam]) zainstalować jakieś konsolowe IDE i wio!

Inne

Do replikatora portów możemy podłączyć też oczywiście inne urządzenia USB. Jak chociażby pendrive czy zewnętrzny dysk twardy. Ja używam programu Cx File Explorer, który bez problemu wykrył i pozwolił mi przeglądać pliki:

Za piękne by mogło być prawdziwe

Gdzieś wcześniej wspomniałem o dwóch producentach: Samsung i Huawei… A reszta? No cóż. Pomijając już ograniczenia fizyczne, o których wspominałem, to Android od wersji 10 ma ukrytą (bo nieskończoną) obsługę trybu desktop. Na internecie można znaleźć filmiki jak to sobie włączyć. Ale ni jak ma się to tego co zaimplementował Huawei. I chociaż daleko mi do bycia szurem i dopatrywania się wszędzie teorii spiskowych, to myślę, że jest to po prostu nie po drodze wujkowi Google. Firma rozwija przecież własny system operacyjny na dekstopy – Chrome OS. Gdyby producent Androida skończył implementować natywną obsługę trybu pulpitu, to Google miałoby dwa systemu operacyjne, które robią praktycznie to samo. A konkurenja wewnątrz firmy zazwyczaj prowadzi do zjawiska tzw. kanibalizmu, czyli jedno w końcu pożarłoby drugie. Jest to wg mnie jedyne logiczne wytłumaczenie dlaczego tak ogromna firma od 2 wersji (a więc 2 lat) nie skończyła tej funkcjonalności. Od dwóch, no bo Google ostatnio wypuściło Android 12 Beta i jakoś cichosza o desktop mode…

Pomijajać natywne wsparcie, to niestety własny desktop mode rozwija aktualnie wyłącznie Huawei i Samsung (LG też rozwijało, ale LG już nie produkuje telefonów). Z informacji, które udało mi się znaleć, to kompatybilne telefony to:

  • Samsung Galaxy S8, S8+, S9, S9+, S10, S10+, S20, S20 FE, S20+, S20 Ultra, S21, S21 Ultra, Fold, Fold 2, Note 8, Note 9, Note 10, Note 10+, Note 20, Note 20 Ultra
  • Huawei Mate 10, 10 Pro, 20, 20 Pro, 20 Pro X, 30, 30 X, 30 Xs
  • Huawei P20, P20 Pro, P30, P30 Pro, P40, P40 Pro
  • Honor Note 10, View 20
  • LG G8 Thinq, V50 Thinq

Podsumowanie

Pracując w trybie pulpitu, były momenty w których zapominałem, że to „tylko telefon”. Moment uświadomienia sobie tego z powrotem było taką chwilą szoku i niedowierzania. Jakby widzę to, ale nie dociera to do mnie. Chyba to, że trzymam takie małe urządzenie w kieszeni jest bardzo zwodnicze. Nie uzmysławiam sobie na codzień, jak potężny komputer osobisty mam non stop przy sobie. A więc powstaje pytanie: czy człowiek 2021 roku potrzebuje laptopa w domu? A tym bardziej komputera stacjonarnego. Śmiem twierdzić, że nie. Większość ludzi do pracy ma laptopy firmowe. Dzieci dzisiaj częściej grają na komórce (lub konsoli) niż na komputerze. Dla przeciętnego użytkownika, nie ma rzeczy, której nie mogłby zrobić smartfon. Ba, co więcej komórka ma wbudowane aparaty. Wystarczy kupić statyw za 30zł i możesz prowadzić konferencję z Zooma, Teamsa czy innego programu. Wszystko jest.

Patrząc na to w ten sposób, może następnym razem, gdy będziesz wybierał(a) telefon komórowy dla siebie, może warto wziąć to pod uwagę. Może warto dopłacić 300zł i mieć telefon, który obsługuje tryb pulpitu? I tym samym pozbyć się starej stacjonarki, która już nie daje rady. A tak – wszystko w jednym miejscu i zawsze z sobą. Koniec problemów typu zalany, wolny i przegrzewający się laptop. Fajna wizja, co nie?

Obsługa FTP znika z Firefoxa

W trakcie, gdy pracowałem nad postawieniem Alpine Linux na Pandaboardzie, potrzebowałem szybko pobrać kilka plików z serwera FTP polskiego mirrora dla tejże dystrybucji linuxa. Wtem pojawiło się takie onkienko:

Myślę sobie „O co chodzi?”, przecież Firefox zawsze pięknie listował zawartość serwera FTP pozwalając na łatwe przeglądanie i pobieranie plików. Po krótkich poszukiwaniach dowiedziałem się, że od wersji 88 przeglądarki, obsługa FTP nadal jest wbudowana, ale domyślnie wyłączona. Natomiast Mozilla na swoim blogu poinformowała, że od wersji 90 zniknie całkowicie.

Wydawca tłumaczy się, że FTP jest już bardzo przestarzałą technologią i chodzi o bezpieczeństwo użytkowników.

No i ok. FTP jest już mega stare (starsze chyba od wszystkich, którzy czytają tego bloga – pierwsze wydanie w 1971 roku). Ale nadal używamy bardzo dużo starych i niebezpiecznych technologii. Chociażby SMSy. Wiadomości są nieszyfrowane. Czyli posiadając radio umożliwiające nasłuchiwanie na częstotliwościach 2G i 3G (bo zakładam, że nadal część ludzi nie ma komórek z 4G, nie mówiąc „rakotwórczym” o 5G) każdy użytkownik jest w stanie przeczytać wszystkie wiadomości, jakie „lecą” do/z komórek wokół niego. Ale jakoś nadal używamy SMSów.

Moim zdaniem Mozilla po prostu szukała argumentu jak pozbyć się z kodu niewygodnej funkcjonalności, której nie chce im się już wspierać (i tym samym łatać jej dziur). Co z resztą pokrywałoby się z „bezpieczeństwem użytkowników” o którym mówią.

Dobra wiadomość? Dla przeciętnego użytkownika nic się nie zmieni. Jeszcze nie widziałem, żeby jakiś zwykły użytkownik szukał czegoś na serwerach lustrzanych. Raczej wszyscy aktualnie wystawiają wszystko przez HTTP. A że HTTP już też jest „be”, to zdecydowana większość ruchu sieciowego leci już przez HTTPS. A tzw. power userzy? No cóż, oni umieją doinstalować sobie i używać zewnętrznego klienta FTP takiego jak FileZilla czy WinSCP.

A, no i ponieważ w wersji 88 i 89 ta funkcja jeszcze jest wbudowana, to wystarczy wejść w about:config, poszukać właściwości network.ftp.enabled i przestawić na true.

Ja tak zrobiłem i jeszcze przez dwie wersje zrobię na złość Mozilli 😀

Alpine Linux na Pandaboard ES Rev B3

W poprzednim wpisie było trochę o historii tej płytki. Dziś pokażę jak można postawić na nim Alpine Linux.

Krótko o Alpine Linux

Dla nie wtajemniczonych, Alpine to bardzo minimalistyczna dystrybucja Linuxa oparta o busybox. Dystrybucja jest bardzo popularnym wyborem jako OS dla kontenerów dockerowych. Co nie oznacza, że nadaje się tylko do tego. Ma własnego menedżera pakietów pt. „apk”. Bez problemu śmiga na nim Python 3, nginx, php, mysql itp.

Ze źródła krok po kroku

Na wstępie zaznaczam, że instrukcję piszę głównie dla siebie – żebym mógł później zajrzeć i przypomnieć sobie jak zrobiłem to, czy tamto 🙂 Instrukcja będzie głównie opierała się o świetny tutorial ze strony DigiKey.com. Nie ukrywam, że jest to w pewnym sensie archiwizacja tego wpisu, jako że zauważyłem, że strona zmieniła się już któryś raz, i po prostu boję się, że instrukcję czeka ten sam los co główna strona projektu – pandaboard.org – a więc przestanie isnieć.

Prerequisite

Radzę stworzyć sobie jakiś folder (np. pandaboard) i robić wszystko w nim:

mkdir pandaboard
cd pandaboard

Przygotowujemy kompilator

Ściągamy gcc-linaro:

wget -c https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

Rozpakowujemy:

tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

Ścieżkę eksportujemy na czas trwania sesji terminala:

export CC=`pwd`/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

Testujemy czy działa:

${CC}gcc --version

Powinno pojawić się coś takiego:

arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Przygotowujemy bootloader (U-Boot)

Klonujemy branch v2019.04. Uwaga: Jest to ostatnia wersja, dla której są potrzebne nam patche dla rewizji B3!

git clone -b v2019.04 https://github.com/u-boot/u-boot --depth=1
cd u-boot/

i aplikujemy patche:

wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-omap4_common-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-omap4_common-uEnv.txt-bootz-n-fixes.patch

W końcu konfigurujemy i budujemy:

make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} omap4_panda_defconfig
make ARCH=arm CROSS_COMPILE=${CC}

Jeżeli wszystko zbudowało się prawidłowo, to powinniśmy uzyskać przede wszystkim MLO i u-boot.img:

$ ls -l | grep -e "MLO\|u-boot.img"
-rw-rw-r--   1 marverix marverix   41860 mar 19 22:06 MLO
-rw-rw-r--   1 marverix marverix  365136 mar 19 22:06 u-boot.img

Wracamy do naszego katalogu pandaboard:

cd ..

Kernel

Klonujemy repo:

git clone https://github.com/RobertCNelson/armv7-multiplatform
cd armv7-multiplatform/

Proponuję scheckoutować najnowszą wersję 4.xx. W moim wypadku było to 4.20.x:

git checkout origin/v4.20.x -b tmp

No i budujemy:

./build_kernel.sh

Jeżeli wszystko poszło w porządku, to pod koniec mniej-więcej powinno być coś takiego:

-----------------------------
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=4.20.17-armv7-x15]
-----------------------------

Kopiujemy to export kernel_version=… i wykonujemy:

export kernel_version=4.20.17-armv7-x15

Natomiast w podkatalogu deploy powinniśmy zobaczyć pliki:

$ ls -l deploy
-rw-rw-r-- 1 marverix marverix  4806577 maj 22 13:20 4.20.17-armv7-x15-dtbs.tar.gz
-rw-rw-r-- 1 marverix marverix 19001283 maj 22 13:20 4.20.17-armv7-x15-modules.tar.gz
-rwxrwxr-x 1 marverix marverix  9433600 maj 22 13:19 4.20.17-armv7-x15.zImage

Wracamy do naszego katalogu pandaboard:

cd ..

Rootfs

Ściągamy minirootfs Alpine Linuxa dla architektury armv7 (lub bardziej generycznej armhf). I chociaż najnowszy działa (w momencie jak to piszę, to jest to 3.13.5), to na końcu całego procesu potrafi się bardzo długo włączać, bo jakiś proces crashuje. Szczerze mówiąc nie spodziewałem się, żeby najnowsza wersja systemu operacyjnego działała na tym sprzęcie bez żadnego „ale”. Natomiast Alpine Linux oficjalnie wspirało Pandę do +/- 2019 roku. A więc wersja 3.7.x, dokładniej 3.7.3. Tak więc takowej będę używał:

wget -c https://dl-cdn.alpinelinux.org/alpine/v3.7/releases/armhf/alpine-minirootfs-3.7.3-armhf.tar.gz

Będzie nam też potrzebny „gotowy” obraz w tej samej wersji i architekturze. Można go rozpoznać po tym, że posiada człon „u-boot” w linku:

wget -c https://dl-cdn.alpinelinux.org/alpine/v3.7/releases/armhf/alpine-uboot-3.7.3-armhf.tar.gz

Minirootfs to naprawdę takie minimum minimum (w końcu ma niecałe 2MB!). Są  to najbardziej podstawowe komendy, ale brak jest obsługi jakichkolwiek usług (w tym DHCP czy SSH). Dlatego potrzebujemy paczek, które umożliwą nam pracę w normalnych warunkach. Możemy ściągać te paczki jedna po drugiej, a możemy skorzystać z folderu apks, który znajduje się w tym „gotowcu”.
Wypakowujemy zawartość pierwszej paczki do folderu rootfs:

mkdir rootfs
tar xf alpine-minirootfs-3.7.3-armhf.tar.gz -C rootfs

Wypakowujemy folder apks:

tar xf alpine-uboot-3.7.3-armhf.tar.gz -C rootfs ./apks

A także podstawowe ustawienia:

tar xf alpine-uboot-3.7.3-armhf.tar.gz ./alpine.apkovl.tar.gz
tar xf alpine.apkovl.tar.gz -C rootfs/

Przygotowujemy kartę SD

Sprawdzamy jak się nazywa nasze urządzenie blokowe:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    1  29,9G  0 disk 

I dla ułatwienia:

export DISK=/dev/sda

Czyścimy kartę:

sudo dd if=/dev/zero of=${DISK} bs=1M count=10

Instalujemy bootloader:

sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k

Partycjonujemy:

sudo sfdisk ${DISK} <<-EOF
4M,,L,*
EOF

A następnie formatujemy na ext4:

sudo mkfs.ext4 -L rootfs ${DISK}1

Montujemy:

export ROOTFS=/media/rootfs
sudo mkdir -p ${ROOTFS}/
sudo mount ${DISK}1 ${ROOTFS}/

Firmware WiFi

Po prostu klonujemy:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git --depth=1

Kopiujemy rzeczy

Rootfs:

sudo cp -r rootfs/* ${ROOTFS}
sync
sudo chown root:root ${ROOTFS}/
sudo chmod 755 ${ROOTFS}/

Dajemy odpowiednie uprawnienia busybox:

sudo chmod 4755 ${ROOTFS}/bin/busybox

Tworzymy tymczasowego użytkownika sheldon z hasłem bazinga:

sudo sh -c "echo 'sheldon:x:1000:1000:Sheldon Cooper:/tmp:/bin/ash' >> ${ROOTFS}/etc/passwd"
sudo sh -c "echo 'sheldon:\$1\$bbt\$SY4ikXOUxJn9uf666cVtp.:0:0:99999:7:::' >> ${ROOTFS}/etc/shadow"
sudo sh -c "echo 'sheldon:x:1000:sheldon' >> ${ROOTFS}/etc/group"

Enablujemy użytkownika root i zmieniamy mu hasło na toor (oczywiście później należy zmienić za pomocą passwd):

sudo sed -i "1s/root:\!:/root:\$1\$bbt\$3YaV3qqIqN3RzpOd92eju0:/" ${ROOTFS}/etc/shadow

Tworzymy plik eEnv.txt:

sudo mkdir -p ${ROOTFS}/boot
sudo sh -c "echo 'uname_r=${kernel_version}' >> ${ROOTFS}/boot/uEnv.txt"
sudo sh -c "echo 'dtb=omap4-panda-es-b3.dtb' >> ${ROOTFS}/boot/uEnv.txt"

Kernel i wszystko co z nim związane:

sudo cp -v ./armv7-multiplatform/deploy/${kernel_version}.zImage ${ROOTFS}/boot/vmlinuz-${kernel_version}
sudo mkdir -p ${ROOTFS}/boot/dtbs/${kernel_version}/
sudo tar xfv ./armv7-multiplatform/deploy/${kernel_version}-dtbs.tar.gz -C ${ROOTFS}/boot/dtbs/${kernel_version}/
sudo tar xfv ./armv7-multiplatform/deploy/${kernel_version}-modules.tar.gz -C ${ROOTFS}/

Firmware WiFi:

sudo mkdir -p ${ROOTFS}/lib/firmware/ti-connectivity
sudo cp -v ./linux-firmware/ti-connectivity/* ${ROOTFS}/lib/firmware/ti-connectivity

fstab:

sudo sh -c "echo '/dev/mmcblk0p1  /  auto  remount,rw  0  1' >> ${ROOTFS}/etc/fstab"

Upewniamy się, że wszystko zostało zsynchronizowane:

sync

Odmontowujemy:

sudo umount ${ROOTFS}

Setup

Odpinamy kartę, podpinamy HDMI, RJ45, klawiaturę i myszkę, no i kartę. Odpalamy. Jeżeli wszystko się udało, to powinniśmy zobaczyć terminal z zachętą do zalogowania. Logujemy się na sheldona.
Teraz możemy się zmienić użytkownika na root:

su root

Przemontowujemy:

mount -t proc proc /proc
mount -o remount,rw /

Instalujemy wszystkie paczki:

apk add /apks/armhf/*.apk

Nie przejmuj się warningami i errorami, że nie może znaleźć adresu URL. Wszystko dlatego, że serwer DHCP nie działa, więc nic dziwnego. Jeżeli natomiast dostaniesz błąd, że nie może wybrać jakiejś paczki, bo coś tam breaks, no to przenieś na chwilę psującą tą paczkę np. folder wyżej – tak żeby nie trzeba było instalować jej. Najbardziej nas interesuje wszystko co zaczyna się na alpine, busybox oraz openrc
Rebootujemy maszynę.

reboot

Tym razem powinniśmy mogli odrazu wbić się na roota (bez potrzeby najpierw logowania się na sheldona).

(Opcjonalnie) Jeżeli mamy podłączony kabel sieciowy, a ale diody nie świecą, to oznacza, że najprawdopodobniej moduł ethernet nie jest załadowany:

modprobe -a smsc95xx

Odpalamy DHCP:

rc-service networking start

Przechodzimy główny setup:

setup-alpine

Aktualizujemy repozytorium:

apk update
apk upgrade

No i włączamy automatyczne odpalanie sieci i daemona ssh:

rc-update add networking
rc-update add sshd

Skończone!

Instalowanie paczek

Jeżeli chcemy zaintalować np. nano i Pythona 3 to wykonujemy:

apk add nano python3

Gotowiec

Jeżeli nie chce Ci się robić tego zgodnie z powyższą instrukcją (nie dziwię się), to możesz skorzystać z gotowca. Najważniejsze skompilowane pliki wrzuciłem na OneDrive.

Wystarczy pobrać skompresowany backup (alpine-3.7-250521.img.xz) i następnie:

cat alpine-3.7-250521.img.xz | unxz | sudo dd of=/dev/sdX

Gdzie X to oczywiście odpowiednia litera, zgodnie z tym co pokazuje lsblk.

Uwaga: Backup był robiony dla karty 4GB, więc jest to minimalny rozmiar na jaki można przywrócić obraz. Oczywiście może być większy. W takim wypadku po zakończonym procesie proponuję odpalić jakieś narzędzie do zarządania partycjami (np. gparted) i po prostu rozszerzyć partycję na całą wolną przestrzeń karty.

 

Pandaboard ES Rev B3

Ze względu na zmiany w mojej firmie, dostałem do moich rąk trochę szrotu. Mianowicie Pandaboard ES Rev B3.

Jest to minikomputer oczywiście na procesorze ARM, a dokładniej OMAP4460. Był to jeden z wielu minikomputerów, które wyrosły niczym grzyby po deszczu, zaraz po ogłoszeniu Raspberry Pi. No bo każdy chciał pokazać, że umie lepiej, a co ważniejsze – ugryźć chociaż kawałek tortu.

Krótko o specyfikacji

Sprzęt został wydany w 2010 roku, a więc 11 lat temu. Pierwsze rewizje wyposażono w 2 rdzeniowy Cortex-A9 o taktowaniu 1GHz. Wspierany był przez 1GB DDR2. W dodatku wbudowane została karta WLAN i BT, Port Ethernet, 2x USB 2.0 + chyba jeszcze 2 na konektorach, no i czytnik kart SDHC (max 32GB). Gwóździem programu miało być GPU z hardwarowym wsparciem filmów FullHD (30fps). Dzisiaj może to szału nie robi, ale wtedy? Pamiętam, jak te maszynki pojawiły się w firmie. Akceleracja sprzętowa FHD na takim  małym sprzęcie to naprawdę robiła wrażenie.

Rewizji było więcej, a ostateczna nazywała się właśnie ES. Zamiast początkowego OMAP4430, użyto 4460 (o którym wspomniałem na samym początku). Miał on taktowanie 200Mhz większe, a więc 2x 1.2Ghz.

Pandaboard szczycił się mnogością konektorów na mobo. Popatrzcie tylko na diagram powyżej. Do kamerki, 2x dla rozszerzeń (w tym GPIO, UART, I2C), LCD, JTAG, no i debugowanie przez wbudowny port RS-232. Czego chcieć więcej?

Jeżeli siedzisz trochę w IT (a zwłaszcza w minikomputerach), możesz się zastanawiać „Skoro to był taki fajny sprzęt, to dlaczego nigdy o nim nie słyszałem/am?”. I jest to bardzo dobre pytanie. Myślę, że powodów jest wiele.

The good, the bad and the ugly

Rozmiary

Czy płytka jest duża? No… nie. 10cm na 11cm to nie aż tak dużo przecież. Ale nie jest też tak mała jak malinka. A moim zdaniem, w sukcesie malinki ogromną rolę odegrała kompaktowość. Płyta po zamknięciu w pudełko spokojnie mieści się w kieszeni nastolatka. A Pandaboard? No właśnie. Jest taki… pokraczny. Ni to mały, ni to duży. W dodatku port ethernet jest portem combo z dwoma USB poniżej. Czyli sam ten element, ma 3,3cm wysokości. Do tego producenci chcieli dobrze… i dokleili na stałe gumowe nóżki pod spód płyty. Nóżki mają 7mm. Czyli cała płyta ma już 4cm wysokości.

Z 2 lata temu projektowałem obudowę do tej płytki (żeby wydrukować na drukarce 3D). Skończyłem na wymiarach 12x12x4. A to trzeba było pamiętać o karcie SD co wystaje, a to o porcie COM… Najgorsze było to, że pudełko miało bardzo dużo niezagospodarowanego miejsca. Zarówno pod, jak i nad i po bokach płytki. Myślę, że nie skłamię, gdy powiem, że 80% pudełka to była wolna przestrzeń.

Zasilanie

Pandaboard jest zasilany za pomocą zasilacza zakończonego popularnym „bolcem”. Dołączany jest zasilacz 5V 4A. Tak, 4A. Co prawda z moich testów panda nie zjadała więcej niż 8.8W z gniazdka, ale zapewne są one niepełne, bo (jak zaraz się dowiesz) nie można używać w pełni wbudowanego GPU. Czy zatem nie można komputerka zasilić za pomocą USB (ponownie – jak w malince)? Tak, można. Manual podaje, że można zasilić za pomocą USB OTG. Ale…

USB OTG to port USB mini. Ja wiem, że mogę sie czepiać, ale dlaczego USB mini? Nie micro? W 2011 każdy miał kabelek i ładowarkę USB micro. A z tego co kojarzę, to przejściówki OTG przychodziły właśnie w formie USB micro – USB A, a nie USB mini – USB A. Jeszcze rozumiem, gdyby producent dodawał taki kabelek w zestawie. Ale nie – dostawało się tylko pudełko, płytkę i zasilacz.

Załóżmy, że jednak port USB mini to nie problem. Czeka nas natomiast kolejny zawód. Nawet jeżeli jesteśmy w posiadaniu ładowarki USB 5V 4A to panda będzie działać… wolniej. Tak, wolniej. Otóż wg manuala gniazdko USB OTG jak i normalne gniazdko zasilania idą przez układ, który hardwarowo steruje mocą procesora. Nie wiem o jakim spadku mocy mówimy (jeszcze nie robiłem testów), ale no nie jest to wesoła wiadomość.

Sterowniki

Pamiętasz jak pisałem, że panda ma układ graficzny wspierający sprzętową akceleracje zarówno filmów FullHD (H.264) jak i grafiki 3D (OpenGL)? Tak… nigdy nie zdołałem zobaczyć tego w akcji. Bo widzisz, producent wybrał układ PowerVR SGX540, który wspiera OpenGL ES 2.0, OpenGL ES 1.1, OpenVG 1.1 i EGL 1.3. Super. Tylko że… producent wspomnianego układu nie otworzył sterowników. A więc – nie ma do tego dostępnych sterowników. Wypuszczono 1 paczkę z Ubuntu 12.04, gdzie były dedykowane sterowniki wyłącznie dla tego systemu operacyjnego, oraz jedną paczkę z Androidem 4.4 (tak, można było na tym odpalić Androida). Co więcej, producent SGX540 nie udostępnił nawet dokumentacji, żeby ktoś mógł sobie sam napisać sterowniki.

Także kupujący pandusię w momencie zakupu byli na przegranej pozycji. Minikomputer, który na tamte czasy zdawał się wręcz idealny jako komputer pod TV… tracił praktycznie największego asa w rękawie. Bo softwarowe dekodowanie filmów na tym procesorze, uwierz mi, delikatnie mówiąc – działa słabo.

Oczywiście byli odważni, którzy próbowali to obejść, ale z tego co wiem, wszystkie (2) inicjatywy padły jeszcze w 2012 roku.

Wsparcie

Ja nie zliczę ile razy podchodziłem w pracy do tematu tych płytek. Nie lubię gdy sprzęt leży nieużywany. Mierzwiło mnie, że w 4 pudełkach leżą 4 komputery, praktycznie nigdy nie używane. I niszczeją. Ale ile razy siadałem do tematu – przegrywałem. Nie jestem specem od komputerów na bazie ARM. Ponieważ te komputery rządzą się swoimi prawami. Nie mają BIOSu czy UEFI. Zazwyczaj wszystko sprowadza się do czytania dokumentacji producenta, i jak on sobie wymyślił, że jaka zworka musi być w jakiej pozycji, i na którym bajcie na karcie SD (lub pendrivie) ma rozpoczynać się bootloader. I nie daj Boże, jeżeli nie wiesz jakie dokładnie masz kości pamięci.

Z mojego doświadczenia, bez wsparcia odpalenie czegokolwiek na tym sprzęcie graniczyło z cudem. Nie mówię wyłącznie o wsparciu producenta, ale przede wszystkim community.  A Panda miała dość „małą” rzeszę fanów. Dolicz jeszcze wspomniane problemy powyżej i masz przepis na gwarantowany sukces. Myślę, że dużo się skłamię, jeżeli stwiedzę, że panda prawdziwego community nie miała, a większość linuxów usunęła pandaboarda z listy wspieranych platform do 2017 roku.

Rewizje

Możesz spytać „Marek, ale jak to – chcesz mi powiedzieć, że producent nie udostępniał obrazu Ubuntu na swojej stronie?”. Tak, udostępniał… dla pierwszych 2 rewizji. A one nie były ze sobą kompatybilne. Obraz dla rewizji A3 nie działał dla rewizji B3. I to było dla mnie największym mindfuckiem. Jak można namieszać tak bardzo we własnym ekosystemie. Nie zliczę ile razy miałem sytuację, że już znalazłem instrukcję jak odpalić Ubuntu ze sterownikami GPU (!!!), ale… dla pierwszej wersji pandy. Nie ES Rev B3 (czyli ostatniej).

Możesz zatem spytać „Ale to była, aż taka duża różnica? Nie wystarczyło gdzieś zamienić A na B i już?”. Pandaboard ma CPU, RAM i GPU na jednym kawałku krzemu. Czyli jak w rewisji ES B3 producent postawnowił użyć kości Elpida, to cały krzem był inny. A co za tym idzie adresy w pamięci. Do dziś, jak chcesz bootloader (u-boot’a) dla ES B3, to najpierw musisz ściągnąć osobno źródła u-boot’a, i później osobno patche dla kości Elpida. No i na końcu zbudować to ze źródła.

Ciepełko

Jestem starym PCtowcem, więc mam wyrobione zdanie o Intel, AMD, NVIDIA czy nawet zapomnianej już VIA. Ale rynek ARM to dla mnie trochę czarna magia. Ciężko mi więc wypowiadać się na temat procesora OMAP4460. Wiem jedno: grzeje się. Oj, grzeje. Po zakończenu aktualizacji Ubuntu palca na krzemie nie położysz. No, tzn. położysz ale bardzo szybko zdejmiesz 😉 I to jest chyba dla mnie największe zdziwienie – dlaczego producent, nie zamontował żadnego radiatora fabrycznie? Ja kupiłem na znanym serwisie (już nie) aukcyjnym  kilka aluminiowych radiatorów + klej termoprzewodzący. Ale mimo tego, procesor bez problemu osiaga 70 stopni.

Podsumowanie

Tak więc nie dziwie się, że pandaboardy nie stały się hitem. A ile one w ogóle kosztowały? Z informacji, które znalazłem, w 2010 roku $174. Po uwzględnieniu inflacji, dzisiejsze $214. Revolut pokazuje mi 798,85zł. Dla porównania Raspberry Pi 4 z 4GB RAM kosztuje dzisiaj ok. 290zł.  Jest różnica, prawda?

Nie mniej, skoro mam takowe w rączkach, postaram się je jakoś wykorzystać.

W następnym poście: instalowanie Alpine Linux na Pandaboard ES Rev B3! 🙂