Testy na inteligencję nie są dla każdego

Ten wpis jest kopią archiwalną z moich postów i komentarzy na pewnym wyjątkowym forum dla społeczności IT, na którym publikuję żarty, urządzam prowokacje, dzielę się refleksjami. Generalnie dokuczam kolegom i koleżankom z branży, inspiruję dyskusje i kłótnie.

(…) byliście kiedyś poddawani testom na inteligencje lub czemuś podobnemu?

Gdy chodziłem jeszcze do szkoły średniej zawezwano mnie i grupę innych chyba losowo wybranych osób na jakieś testy psychologiczne do lokalnej poradni psychologiczno-pedagogicznej, wrzucono do jednego pomieszczenia, rozdano każdemu serię arkuszy z zadaniami i nakazano wypełniać. Większość zadań była podobnych do testów IQ z Mensy (jakby ktoś nie wiedział jest to „największe i najstarsze stowarzyszenie ludzi o wysokim ilorazie inteligencji”), ale dodatkowo były też jakieś testy z wyobraźni przestrzennej i jakieś inne pomniejsze. Wyglądało to tak jakby ktoś chciał badać nasze techniczne umiejętności. Chodziłem do technikum elektronicznego, więc wydawało się to mieć sens.

No i teraz zerknijcie na pic related, takich zadań na teście było pełno. W skrócie chodzi o to, że podane są jakieś jedno lub dwuwymiarowe sekwencje albo układy czegoś i trzeba podać co powinno być brakującym elementem. Czyli przykładowo sekwencja „1, 2, 3” i co powinno być kolejne – przykładowo odpowiedzą może być 4. Miałem z tymi zadaniami pewien specyficzny problem. Mianowicie z mojej lekko autystycznej perspektywy każda odpowiedź była dobra, bo nie było dla mnie problemem dokonanie interpolacji funkcji matematycznej, która by łączyła dowolne trzy liczby z dowolną czwartą. Gdyby mnie się ktoś zapytał dlaczego do sekwencji „1,2,3” jako następną liczbę wyznaczyłem 23 to potrafiłbym sprawnie wyliczyć tej osobie odpowiednią funkcję matematyczną, która by je łączyła.

Rozumiałem, że nie tego się ode mnie oczekuje, lecz raczej podania schematycznej odpowiedzi takiej jakiej by się oczekiwało od kogoś, kto nie rozumie za dużo. Wypełniałem więc kolejne sekwencje liczbowe i później obrazkowe aż wraz z upływem czasu ogarnęła mnie tak potworna nuda, że zacząłem jednak wybierać mniej oczywiste odpowiedzi. Zanim doszedłem do końca długaśnego arkusza byłem już z nudów kompletnie zbuntowany i odpowiedzi były naprawdę dowolne (ale nie błędne w moim rozumieniu i w zasięgu moich umiejętności). Niestety, na końcu czekało mnie coś niespodziewanego.

Komiks.

Trzeba było uporządkować sekwencję zdarzeń przedstawioną w krótkim komiksie tak, aby miało to sens przyczynowo-skutkowy. Historie dotyczyły ludzi, ich interakcji, życia, codziennych spraw. Byłem już na tyle oddany wymyślaniu nietypowych (ale poprawnych) odpowiedzi w mojej głowie, że połączyłem obrazki komiksu w zupełnie szalone i fantazyjne fabuły. Zadowolony wpisałem to wszystko w arkusz.

Później się dowiedziałem skądś (bo nie otrzymałem do ręki żadnych oficjalnych wyników czy interpretacji), że wszystko, co wypełniałem, było świetnie do momentu komiksu, który był zdaniem oceniających tak źle, że absolutnie jedyne do czego się mogłem nadawać z takim zwichrowanym aspołecznym umysłem to informatyka. Nikt nie stwierdził mi wówczas żadnego autyzmu czegoś takiego chyba tylko dlatego, że tam nikt się nie znał na takich sprawach.

Dodatkowo były to czasy, w których ludzie śmiali się z tych, którzy nie poszli do liceum. Technika i zawodówki były widziane jako coś gorszego, szkoły dla podludzi. Dopiero kilka lat później się okazało, że nadchodząca polska rzeczywistość zadziała odwrotnie: osoby techniczne staną się królami rynku pracy a licealiści pójdą na nieprzydatne nikomu studia po których nie będzie pracy.

Na tych testach wszyscy ode mnie ściągali wszystko za wyjątkiem komiksu, bo to uznali, że umieją i pewnie tak było. Stąd podobno wszyscy wyszli na mądrzejszych ode mnie, miałem chyba najgorszy ostateczny wynik z grupy xD xD xD

Tak więc „smutna żaba, nie ma profitu” – tak to wtedy wyglądało.

Kulistość Ziemi a życie w symulacji

Judyta zrobiła ankietę o kulistości Ziemi i przypomniała mi się hipoteza, która nie jest oryginalnie moja, ale wyczytałem ją książce o tzw. symulacji przodków i mnie zainspirowała jako takie ćwiczenie intelektualne.

Otóż jesteśmy w grze komputerowej i tak jak w każdej współczesnej grze Ziemia jest taka jaka jest potrzebna aktualnego widoku gracza. Przykładowo: niech to będzie gra taka, że kierujesz światową grupą antyterrorystyczną, która ze swojej bazy wojskowej w USA lata superszybkim samolotem do różnych państw świata aby zwalczać akty terroru. Gdy planujesz do którego miejsca planety wysłać swoich agentów, Ziemia jawi się jako kula a na niej widzisz różne znaczniki, miasta itp. Dosłownie markery na globie, Google Earth. Gdy już wyślesz żołnierzy na miejsce, wówczas akcja przenosi się do „płaskiej” Ziemi, bo nie ma potrzeby symulowania kulistości (i marnowania zasobów symulatora). Może będzie to widok z góry (jak w grach typu RTS) albo widok z perspektywy pierwszej osoby (gry typu FPS). Toczysz w tym widoku np. akcję odbicia zakładników. Zaś w pewnych momentach Ziemia nie będzie ani płaska, ani kulista – np. gdy będzie mieć miejsce moment fabularny, w którym wizytujesz Biały Dom, bo wezwał Cię prezydent. Wszystko dzieje się wówczas w czterech ścianach Gabinetu Owalnego. Nie ma potrzeby symulować Ziemi dalej niż to, co widać zza okna.

Wszystko to wyżej opisane brzmi szalenie, ale niektóre badania zjawisk kosmicznych przynoszą dziwne wyniki, które łatwiej wyjaśnić powyższym podejściem niż innym. Np. obserwując pochodzenie niektórych cząstek kosmicznych naukowcy zauważyli, że te pojawiają się jakby znikąd, przelatują przez widoczny dla nas świat, i znikają jakby uderzyły w niewidzialną ścianę. Wydaje się to być analogiczne do symulacji ptaków w grach komputerowych. Silnik gry sprawia, że pojawiają się one najpierw losowo w dalekiej oddali, w powietrzu. Przelatują nad głowami graczami i po oddaleniu się na odpowiednią odległość znikają w przypadkowym momencie. Takich przykładów zjawisk sugerujących, że rzeczywistość objawia optymalizacje oraz tzw. „glicze” (zakłócenia), jest sporo, ludzie to starają się opisać i katalogować. Ja zapamiętałem ten przykład z ptakami i cząstkami.

Jeżeli uwierzymy, że nasze doświadczenie egzystencji na Ziemi jest tylko symulowaną egzystencją, to okaże się, że poglądy okrągłoziemców i płaskoziemców nie są niezgodne a ich współistnienie jest pośrednim dowodem symulacji. Po prostu ci pierwsi w tej grze częściej mają do czynienia z widokami wymagającymi okrągłej ziemi i symulator dostarcza im takiego świata. Ci drudzy mają odwrotnie, grają częściej w widokach płaskich, więc dla nich symulator nie traci zasobów na symulację kulistości i robi takie optymalizacje, że np. mogą oni dostrzegać odległe miejsca, które powinny być niewidzialne za krzywizną ziemi.

Interesujące jest to, że jeżeli założymy, iż symulator oszczędza zasoby dlatego, bo one nie są nieskończone, wówczas też można się zastanowić czy symulacja nie jest tak skonstruowana, aby uniemożliwić doświadczania kulistości dla zbyt dużej liczby osób. Gdyby tak było, wówczas:1) przyrost liczby ludności na świecie (zakładając, że to przyrost prawdziwych „graczy” a nie symulowanych sztucznych postaci, tzw. NPC) musiałby powodować wzrost występowania zjawisk „płaskości” czemu towarzyszyłby wzrost populacji płaskoziemców;2) można spróbować złośliwie „zawiesić symulację” prowadząc maksymalnie dużą ilość ludzi w kierunku sytuacji, w których kulistość powinna być symulowana maksymalnie dokładnie.

No i teraz:

Ad 1) Podobno wzrost populacji płaskoziemców ma miejsce. Może dlatego, że Internet umożliwił im łatwiejszą propagację poglądów, a może jest to wynik tego, że żyjemy w symulacji. Symulator może po cichu wspierać propagację takich poglądów w warunkach zagrożenia obciążeniem.

Ad 2) Może uszkodzenia rakiet i innych pojazdów kosmicznych, które opóźniają działania w kosmosie i podbój planet, nie są przypadkowe? Postęp technologiczny jest korzystny dla symulacji, gdy zamyka ludzi w pomieszczeniach (wtedy symulacja Ziemi ma najmniejsze wymagania) a niekorzystny, gdy ludzie zaczynają działać w powietrzu i kosmosie.

Bardzo ciekawe intelektualne rozważania można z tego wyprowadzić. I przede wszystkim można w tym znaleźć jakąś nową perspektywę spojrzenia na osoby o „szalonych” poglądach. Czy to szalonych w jedną czy drugą stronę.

Gdy wtyczki się aktualizują ale WordPress już nie

Zagadkowy taki przypadek mi się trafił ostatnio: serwis oparty o WP z jednej strony pozwalał bez przeszkód aktualizować wtyczki, ale niemożliwe było zaktualizowanie samego WordPressa. Nieustannie pojawiał się monit o podanie danych do FTP, aby móc wgrać pliki. Rozwiązałem tę sprawę, przyczyną było niewłaściwe działanie mechanizmu zabezpieczającego nazywającego się SELinux. Poniżej opisuję jak do tego doszedłem, aby innym dopomóc diagnozować podobne problemy.

Po pierwsze, jeżeli pojawia się monit o dostęp FTP, to znaczy to, że WP ma problem z zapisem i próbuje zaproponować jedną z kilku możliwości jego dokonania. Dopóki ta nie jest określona, to nic mądrzejszego się nie dowiemy. Stąd warto w wp-config.php dopisać taką linijkę:

define('FS_METHOD', 'direct' );

Co to daje? Narzuca metodę zapisu: bezpośrednio do plików. Teraz w widoku „Stan witryny” (w menu Narzędzia) pojawi się w podpowiedziach problemów lista plików, do których dostępu brakuje. Te pliki trzeba będzie sprawdzić. Należy się upewnić, że:

  • Należą do właściwego użytkownika systemowego lub właściwej grupy – te zapewne będzie można wyczytać z konfiguracji serwera WWW (np. /etc/httpd/conf/httpd.conf) lub konfiguracji PHP-FPM (np. /etc/php-fpm.d/www.conf);
  • Mają nadane odpowiednie uprawnienia do zapisu;
  • Sprawdzić kontekst SELinux (ls –context) czy nie jest ustawiony na tylko-do-odczytu.

W moim przypadku problemem było to ostatnie. Aby to naprawić, musiałem użyć polecenia chcon no narzucenia nowego kontekstu, bo odzyskanie za pomocą restorecon nic nie pomagało.

Odnajdywanie osób z KRS w mediach społecznościowych

Czasami istnieje potrzeba zlokalizowania jakiejś osoby, która widnieje tylko w KRS. Dzisiaj każdy ma Facebooka, ale poszukiwania „Jana Kowalskiego” zwrócą nam dziesiątki takich Janów. Jak rozpoznać właściwego? Nieoczywistym dla każdego jest powiązanie informacji obecnej w KRS, czyli daty urodzenia danej osoby, która jest zapisana w numerze PESEL. Datę urodzenia w social mediach potwierdzimy odnajdując życzliwe komentarze urodzinowe w danym dniu wpisane przez znajomych. Czasami też ktoś wprost poda swoją datę urodzenia.

Programowanie a oderwanie od podstaw

Niedawno czytałem wątek na Facebooku, w którym ktoś zapytał specjalistów od informatyki czy byliby w stanie sami zbudować od podstaw te różne urządzenia, z którymi pracują. Odpowiedzi były różne. Poczyniliśmy tak duży postęp techniczny, że niektórym się wydaje, że owszem, zrobią hurtownię danych, ale już pojedynczy tranzystor to kosmiczna technologia. Innymi słowy, specjalizacja, abstrakcja i miniaturyzacja oderwały niektórych profesjonalistów od źródeł ich zawodów. I nie ma w tym nic dziwnego, taki jest porządek rzeczy.

W programowaniu też widać zjawisko pewnego oderwania od podstaw, ale ma ono związek z dopasowaniem narzędzi pracy do umysłu pracującego. Weźmy na przykład kolorowanie składni. Jest tak powszechne i tak pomocne, że jej wyłączenie wprawić niektórych może w zakłopotanie, może wywołać poczucie zagubienia. Tymczasem dawniej często tak się pisało kod. I w dalszym ciągu w wielu przypadkach kod przychodzi pisać po dawnemu, gdy trzeba coś na szybko zmienić na serwerze z linii poleceń a tam czeka nas niedokonfigurowany edytor vi o niecodziennych skrótach klawiszowych.

Warto chyba przypomnieć, że programowanie nie tylko jest możliwe, ale jest całkiem wydajne w takich warunkach jak zwykły notepad. Czarno-białe litery, brak obsługi tabulatorów, brak podpowiedzi, brak podręcznego drzewa plików. To tylko przyzwyczajenia się zmieniły.

Jest to ważne także i dlatego, że wiele osób bardzo poważnie taktuje dzisiaj temat doboru narzędzi. Preferują pewne określone IDE czy określony program do administracji bazą danych oraz mają wyobrażenie takie, że te programy są niebywale złożone i koniecznie trzeba stosować te szczególnie wybrane.

Tymczasem ani nie ma takiej konieczności, ani te programy nie są szczytem złożoności. Wiele z nich można napisać samemu i w życiu programisty przychodzi taki moment, że zmuszony okolicznościami tworzy on np.:

  • Własne IDE
  • Własne webowe IDE
  • Własnego klienta SQL do administacji bazą
  • Własnego klienta GIT
  • Własnego klienta SSH, SCP, FTP
  • Własnego shella

Ze zdumieniem można wówczas odkryć, że podstawowe funkcjonalności tego oprogramowania da się wykonać w zaskakująco małych ilościach linii kodu. Te zaś przyrastają dopiero wtedy, gdy chce się wygładzić i wyspecjalizować określone obszary.

(W dawniejszych czasach nie było to rzadkością chcieć pisać własny system operacyjny, bo ludzie dzięki powszechności dyskietek i możliwości podglądu kodu BIOS-u mieli wiedzę o bootsectorach, systemach plików, zarządzaniu pamięcią. Dzisiaj to już jest wiedza nieco zapomniana.)

Użycie certyfikatów Let’s Encrypt do wielu serwisów na zwykłym hostingu

Wprowadzenie

Kiedyś pisałem o tym jak można dla serwisów umieszczonych na zwykłych hostingach WWW używać darmowych certyfikatów Let’s Encrypt. Procedura jest jednak żmudna, nudna i trzeba ją powtarzać co kilka miesięcy, co dla kogoś, kto utrzymuje wiele serwisów a nie tylko jeden, jest dosyć nużące. Jeżeli jednak wciąż nie chcemy iść w kierunku zakupu płatnych certyfikatów, to rozwiązaniem jest uruchomienie tzw. reverse proxy na tanim serwerze wirtualnym. Wyjaśnijmy sobie to po kolei.

Najtańsze płatne certyfikaty są obecnie na rynku za około 10 zł. Jeżeli ktoś opiekuje się 10 serwisami internetowymi, które są umiejscowione ma zwykłym hostingu na którym nie można w sposób zautomatyzowany korzystać z darmowych certyfikatów, to musi wydać 100 zł rocznie na certyfikaty. Nie jest to duża kwota a kłopotu jest troszeczkę mniej.

Innym rozwiązaniem jest wykupienie na rok taniego serwera wirtualnego. Ich oferta w Internecie jest spora a mówimy tutaj o wersji naprawdę bardzo ubogiej, bo wymagającej 1 procesora wirtualnego, około 5 GB miejsca dyskowego, od 512 do 1024 MB RAM. Można takie kupić płacąc za rok około 110 zł, czyli wiele więcej niż za certyfikaty – a stajemy się bogatsi o serwer VPS!

Przygotowanie VPSa

W moim przypadku zamówiłem serwer z systemem operacyjnym CentOS 8, aby móc na nim uruchomić skrypt konfiguracyjny, który rozwijam i którego kod jest w repozytorium na GitHub:

curl -s -L http://grzegorzkowalski.pl/install/ | bash

Skrypt będzie wykonywał wiele działań i zada kilka pytań. Odpowiedź „Y” należy udzielić na te:

  • Enable Apache [default port 80 and 443] ? [y/N]
  • Change timezone to Europe/Warsaw? [y/N]
  • Enable FirewallD ? [y/N]

Po tym wszystkim dostaniemy serwer z Apache’m i mnogością różnych użytecznych narzędzi (m.in. PHP 7.4, Python 2/3, NPM, Node.js, Composer, Certbot, wget, GIT). Nas interesuje głównie Apache, którego możemy skonfigurować w tryb reverse proxy.

Tworzymy sobie nowy plik konfiguracyjny do tego celu i jeżeli nasz hosting ma adres 123.123.123.123 to piszemy tak.:

vi /etc/httpd/conf.d/moje_proxy.conf

Wypełniamy go treścią:

<VirtualHost *:80>
ServerName grzegorzkowalski.pl
ServerAlias www.grzegorzkowalski.pl
ServerAlias kolejnyserwis.pl
ServerAlias innyserwis.pl
ServerAlias jeszczeinny.pl
ServerAlias itakdalej.pl
# ...
ServerAlias az_do_ostateniego.pl

DocumentRoot "/var/www/html/proxy"
ServerAdmin grzegorz.adam.kowalski@outlook.com

<Directory "/var/www/html/proxy">
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>

ProxyPreserveHost On
ProxyPass / http://123.123.123.123:80/
ProxyPassReverse / http://123.123.123.123:80/
RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
RequestHeader set X-Forwarded-SSL expr=%{HTTPS}
</VirtualHost>

W pliku konfiguracyjnym odwołujemy się do folderu, którego jeszcze nie ma, więc warto go stworzyć:

mkdir /var/www/html/proxy

Teraz w panelu konfiguracyjnym hostingu znajdźmy edycję stref DNS i zmieńmy we wszystkich domenach wskazanych w powyższym pliku konfiguracyjnym numer IP przypisany do tzw. rekordu „A” na adres IP naszego serwera VPS.

Gdy to wszystko jest gotowe, zresetujmy Apache na serwerze wirtualnym, aby nowa konfiguracja weszła w życie. W zależności od systemu może to wymagać trochę innego polecenia, na moim CentOS wygląda to tak:

service httpd restart

No i teraz przed nami zagadnienie wygenerowania certyfikatów. W systemie powinien już być zainstalowany i gotowy do użycia skrypt:

certbot-auto

Należy postępować zgodnie z pytaniami, które będą pojawiać się na ekranie a wynikiem będą wygenerowane certyfikaty, lekko rozszerzony plik konfiguracyjny Apache, który wcześniej stworzyliśmy oraz dodatkowo zostanie stworzony drugi plik konfiguracyjny przeznaczony tylko dla ruchu szyfrowanego na porcie 443.

Gdy WordPress odmawia współpracy

Teraz proxy jest już sprawne, certyfikaty również są zrobione. To,co jeszcze może nas spotkać to zaskoczenie, gdy np. nasz serwis oparty o WordPress odmówi posłuszeństwa a przeglądarka internetowa zwróci komunikat „Too many redirects” czyli „zbyt wiele przekierowań”.

Jak się okazuje, twórcy WordPressa zaszyli jedną ważną informację w instrukcji do tego systemu. W pliku wp-config.php należy ręcznie dopisać w dowolnym miejscu dwie linie kodu:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

Debugowanie zbyt wielu przekierowań

Jeżeli problem „Too many redirects” pojawia się pomimo odpowiedniej konfiguracji takiego czy innego systemu, warto zbadać zjawisko pomocniczym skryptem (jest to zmodyfikowana wersja tego skryptu):

#!/bin/bash
echo
for domain in $@; do
  echo --------------------
  echo $domain
  echo --------------------
  curl -sILk $domain | egrep 'HTTP|Loc|X-Redirect-By: ' | sed 's/Loc/ -> Loc/g'
  echo
done

Skrypt używamy np. tak:

skrypt-do-przekierowan.sh grzegorzkowalski.pl

W wyniku skryptu zobaczymy serię nagłówków HTTP wskazujących na typ przekierowania, docelowe miejsce przekierowania oraz kto zlecił przekierowanie. W przypadku np. WordPressa wyświetli się np. „WordPress 7.4.3”. Jest to informacja, że przyczyna problemu leży nie w konfiguracji Apache, nie w jakimś zabłąkanym pliku .htaccess na hostingu, ale np. w pluginie WordPressowym do obsługi HTTPS albo właśnie w braku wpisu w wp-config.php.

Kategorie rozpoznania (wywiadu)

Słowniczek różnego rodzaju uznanych oraz zupełnie nowych terminów określających kategorie działań rozpoznawczych, wywiadowczych:

  • ACINT – patrz: MASINT;
  • CBNINT – patrz: MASINT;
  • COMINT – patrz: SIGINT;
  • CYBINT – cyber intelligence; rozpoznanie oparte o informacje zebrane z cyberprzestrzeni;
  • DEWINT – patrz: MASINT;
  • DNINT – digital network intelligence, patrz: CYBINT;
  • EMPINT – patrz: MASINT;
  • ELECTRO-OPTINT – patrz: MASINT;
  • ELNIT – patrz: SIGINT;
  • FININT – financial intelligence, rozpoznanie finansowe;
  • GEOINT – geospatial intelligence, rozpoznawanie satelitarne;
  • HUMINT – „human intelligence”, rozpoznanie osobowe – oparte o informacje uzyskane od ludzi (zwiadowców, informatorów, szpiegów, osób przesłuchanych);
  • IMINT – imagery intelligence, rozpoznanie obrazowe na podstawie zdjęć (PHOTINT – photo intelligence), filmów, sygnałów z urządzeń elektrooptycznych pracujących w różnych pasmach elektromagnetycznych;
  • IRINT – patrz: MASINT;
  • LASINT – patrz: MASINT;
  • MARKINT – market intelligence, rozpoznanie rynkowe;
  • MASINT – measurement and signature intelligence, rozpoznanie pomiarowo-badawcze oparte o analizę danych i informacji z czujników pomiarowych; dzieli się na:
    • ACINT – acoustic intelligence, akustyczne (dźwiękowe),
    • RADINT – radar intelligence, radiolokacyjne,
    • RINT – unintentional radiatino intelligence, radiacyjne niezamierzone
    • IRINT – infrared intelligence, rozpoznanie oparte o analizę danych z czujników podczerwieni,
    • CBNINT – chemical and biological intelligence, chemiczne i biologiczne,
    • DEWINT – directed energy weapons intelligence, broni wiązkowej (energii kierowanej)
    • NUCINT – nuclear intelligence, nuklearne,
    • EMPINT – elentromagnetic pulse intelligence, impulsu elektromagentycznego,
    • ELEKTRO-OPTINT, electro-optical intelligence, elektro-optyczne,
    • LASINT, laser intelligence, laserowe.
  • NUCINT – patrz: MASINT;
  • OSINT – open source intelligence, tzw. biały wywiad, rozpoznanie w oparciu o dane z otwartych źródeł (ogólnodostępne rejestry, ewidencje, publicznie dostępna dokumentacja, media, Internet itp.);
  • PHOTINT – patrz: IMINT;
  • RADINT- patrz: MASINT;
  • RINT – patrz: MASINT;
  • RUMINT – „rumour intelligence”, rozpoznanie oparte o mało wiarygodne lub wręcz niewiarygodne źródła; rozpoznanie oparte bardziej o plotki niż fakty;
  • SIGINT – signal intelligence, rozpoznanie radioelektroniczne, elektromagnetyczne, które dzieli się na:
    • COMINT – communication intelligence, rozpoznanie radiowe;
    • ELINT – electronic intelligence, rozpoznanie radiolokacyjne;

Jak kupić adapter Bluetooth we właściwej wersji

Oferty adapterów podają tylko wersję większą (major), czyli jeżeli chcemy zakupić np. Bluetooth w wersji 5.1 to zastaniemy zdumiewający pozorny brak ofert adapterów tego typu na rynku. Bierze się to z tego powodu, że marketingowo wersja 5.1 sprzedawana jest jako wersja 5.0 i podobnie jest też z wersją 4.

Poprawny odczyt wersji pochodzi z wersji oprogramowania układowego, która ukryta jest pod skrótem LMP (Link Manager Protocol). Kupując adapter należy się dowiedzieć od sprzedawcy jakie jest LMP adaptera. Tabelka wersji wygląda tak:

LMP 0Bluetooth 1.0b
LMP 1Bluetooth 1.1
LMP 2Bluetooth 1.2
LMP 3Bluetooth 2.0 + Enhanced Data Rate
LMP 4Bluetooth 2.1 + Enhanced Data Rate
LMP 5Bluetooth 3.0 + High Speed
LMP 6Bluetooth 4.0 + Low Energy
LMP 7Bluetooth 4.1
LMP 8Bluetooth 4.2
LMP 9Bluetooth 5.0
LMP 10Bluetooth 5.1
LMP 11Bluetooth 5.2

Wersje LMP poniżej wersji 6 zostały już wycofane. LMP 5 czyli Bluetooth 3.0 + HS nadal uznawany jest za absolutne minimum w kontekście potrzeb współczesnych urządzeń.

Czemu warto szukać wyższych wersji Bluetooth? Lista zalet jest taka:

  • Stabilniejsza i szybsza transmisja danych,
  • Lepsze zarządzanie energią,
  • Rozmaite usprawnienia w zakresie łączenia urządzeń, wsparcie dla nowych funkcjonalności.

Dekodowanie base64 o zmienionym alfabecie

Serwis pewnej znanej państwowej instytucji zwraca sam dla siebie dane za pomocą interfejsu typu API REST, ale zwraca jest w postaci kodowanej. Wynik zaczyna się mniej więcej tak:

{"d":"enc!331aa1bb!45!3!!49!32!50!381ab1a7!45y25!45yy91b9y23yy4y1y1a1y231a2!391a1y...."}

No i zagadaka – co to jest i jak to odczytać? Skoro przeglądarka potrafi, to znaczy to, że gdzieś w skryptach strony jest dekoder. No rzeczywiście znajdujemy skrypt, który jednakże zdaje się być sam sobie również zaszyfrowany, jego początek wygląda tak:

eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('o a=["\b\d\b","\b\b\i","\b\b\j","\b\b\l","\b\b\s","\b\b\N","\b\b\m","\b\b\D","\b\b\z","\b\i\B","\b\i\b","\b\i\i","\b\i\j","\b\i\l","\b\i\s","\b\i\N","\b\i\m","\b\i\D","\b\i\z","\b\j\B","\e\j\e","\e\j\i","\e\j\j","\e\j\l","\e\j\s","\e\j\N","\e\j\m","\e\j\D","\e\j\z","\e\l\B","\e\l\e"

Początek „function packed” jest charakterystyczny dla standardowych zaciemniaczy kodu. Da się to względnie odszyfrować, jest wiele deszyfratorów online, np. https://freeseotool.org/javascript-unpacker.

Po deszyfracji wciąż nie jest łatwo. Zmienne mają dziwaczne nazwy, a tablice mają zwartości zapisane za pomocą kodów szesnastkowych. To ostatnie to drobiazg, bo jeżeli mam taką dziwną tablicę…

var _0xeae2=["\x79\x31\x79","\x79\x79\x32","\x79\x79\x33","\x79\x79\x34","\x79\x79\x35","\x79\x79\x36","\x79\x79\x37","\x79\x79\x38","\x79\x79\x39","\x79\x32\x30","\x79\x32\x79","\x79\x32\x32","\x79\x32\x33","\x79\x32\x34","\x79\x32\x35","\x79\x32\x36","\x79\x32\x37","\x79\x32\x38","\x79\x32\x39","\x79\x33\x30","\x21\x33\x21","\x21\x33\x32","\x21\x33\x33","\x21\x33\x34","\x21\x33\x35","\x21\x33\x36","\x21\x33\x37","\x21\x33\x38"

…to wystarczy są wrzucić w przeglądarkowy console.log i dostanę zwrot danych w ludzkiej postaci:

["y1y", "yy2", "yy3", "yy4", "yy5", "yy6", "yy7", "yy8", "yy9", "y20", "y2y", "y22", "y23", "y24", "y25", "y26", "y27", "y28", "y29", "y30", "!3!", "!32", "!33",

Hmm, znowu jakiś kod? Może, aczkolwiek jeżeli wrócimy do pierwotnej zaszyfrowanej wiadomości, to dostrzeżemy, że składała się właśnie z takich elementów. Wygląda więc to na jakiegoś rodzaju alfabet. W alfabecie nie ma jedynie początkowego trzyliterowego „enc”, które widać w danych zawracanych przez API, więc pewnie to jakiś taki rozpoznawczy ciąg znaków (zapewne pochodzący od „encoded” – zakodowany).

Wróćmy jednak na chwilę do nazw. Nazwy zmiennych są kodowane, ale nazwy funkcji nie – są takie jak kiedyś były. Znajdujemy w skrypcie cztery:

  • tajemnicza funkcja „bd”,
  • pospolicie brzmiąca „getIndex”,
  • pospolicie brzmiąca „addslashes”,
  • i pozornie pospolicie brzmiąca „_ut8_decode” – pozornie, bo ten underscore na początku jest nietypowy.

Wykorzystując ów nietypowy underscore możemy poszukać w Google, czy to nie jest jakaś znana funkcja. Jak się okazuje, istnieje tylko jeden skrypt, który zawiera tę funkcję oraz „addSlashes” i „getIndex” – to pochodzący z http://www.webtoolkit.info skrypt JS realizujący dekodowanie znaków „zakodowanych” algorytmem Base64.

No i faktycznie wydaje się, że to jest nasz skrypt, ale coś się nie zgadza. W oryginalnym skrypcie w jednym miejscu jest coś zupełnie inaczej. Zamiast tego dziwnego alfabetu wskazanego wcześniej jest zwyczajny alfabet o taki:

_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

Hmm, czyżby więc programiści z państwowej naszej instytucji jedynie podmienili alfabety?

Sprawdźmy! Fragment zakodowanego tekstu bez początkowego „enc” wrzucamy w zmienną „test”, podmieniamy alfabety i dekodujemy base64…

<?php
// fragment kodowanej wiadomości bez początkowego 'enc'
$test = '!331aa1bb!45!3!!49!32!50!381ab1a7!45y25!45yy91b9y23yy4y1y1a1y231a2!391a1y25y30!39!45y22yy3y20y29!36!33!401b8!38!471a0!52!38!491bb!45y25!45yy9171!35y29yy2!5!!39!49!32!49y26y29!40!53!35!34!36!44!391aby241a1!37!34yy21a3y25!49y28!44!38!49!32y27!381aby20!52!36!34y201a9!3!yy7!321bb!38!50!48y29!35!34yy21b8!39!50y27!5!!34yy3yy91b9y23yy4y1y1a1y231a2!391a1y25y30!40!39yy9!451a0!39yy9!47y28!44!38!49!32y29!35!34yy21b8!39!50y28y27!39!49yy61aa!38!49yy6y27!40!33y201bb!34yy3yy91bbyy9yy4y1y!52y251a1!39173y23yy4y1y1b9y23!46y231aay23!46!471aay26yy61b91b8!35y301a7!45y22yy3y20!3!!4!!34y1y!45y25!45y20y27yy9!451b9!45y30!49yy61a9!401abyy5!45y25!45y20y27!32!3!y20y23y29!3!y24!37y30!47yy5!43!3!1a4!52y22y30171!33yy2y27y29yy2y27y301a3y28y30!32yy5yy6!34y301a4!40yy2yy9yy51a8y29y22!46yy9!43y29!3!1a31b7y30!3!!48y22y30171!33yy2y27!3!!52yy2yy9yy51bay26!3!yy5!32y29y30!47!48y22y27y29yy2!34yy9yy6y24!37!33!3!y30yy6!43!3!172!34y271a4!3!!45y22yy3y20!34!381ab!52!48!401ab172!47!4!!50y281aa!381a1yy91a9yy9!471a4yy2!33!47172!34y29!3!!32yy4y291a3!48yy6yy9!451b9!45!3!yy71721aa!37!33yy61a3yy9!46!5!!45!391aa!521a8!36y23!33yy3!381aa!40!52!36!33y241b4!37y29yy91bbyy9!47!401ba!37!331a8!44yy9!46!5!!45!3!1aa!521a8!36y23!33yy3!381aa!40!52!36!33y23!45y22yy3y20y22!381aby28y27!381aby241a9!40yy71721aa!4!y29yy91a9yy9!46yy91aby22y30!3!1b9y23yy3yy91bbyy9';

$key = ["y1y", "yy2", "yy3", "yy4", "yy5", "yy6", "yy7", "yy8", "yy9", "y20", "y2y", "y22", "y23", "y24", "y25", "y26", "y27", "y28", "y29", "y30", "!3!", "!32", "!33", "!34", "!35", "!36", "!37", "!38", "!39", "!40", "!4!", "!42", "!43", "!44", "!45", "!46", "!47", "!48", "!49", "!50", "!5!", "!52", "!53", "1b4", "1bb", "1ba", "1b7", "1b8", "1b9", "1a0", "1a1", "1a2", "1a3", "1a4", "1ab", "1aa", "1a7", "1a8", "1a9", "170", "171", "172", "173", "174", "17b", "71a"];

$original = str_split("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=");

$pairs = [];

for ($i = 0; $i < 65; $i++) {
    $pairs[$key[$i]] = $original[$i];
}

echo base64_decode(strtr($test, $pairs));

…sprawdźcie sami, że wynik wygląda tak:

[{"Regon":"000237297","RegonLink":"<a href='javascript:danePobierzPelnyRaport(\"000237297\",\"DaneRaportPrawnaPubl\", 0);'>000237297<\/a>","Typ":"P","Nazwa":"PUBLICZNA SZKOŁA PODSTAWOWA NR.2 IM.MIKOŁAJA KOPERNIKA W SZYDŁOWCU","Wojewodztwo":"MAZOWIECKIE","Powiat":"szydłowiecki","Gmina":"Szydłowiec","KodPocztowy":"26-500",

Czyli sukces! 🙂

Przy okazji wyjaśnia się nazwa jednej z funkcji w skrypcie: „bd” to po prostu „base64_decode”.

Na koniec kilka pytań: po co właściwie te dane są kodowane? Przecież owa instytucja udostępnia informację publiczną. Jaki jest sens utrudniania korzystania z API? Tu nie ma żadnych tajemnic przecież. Mogą pojawić się dane osobowe, ale zwyczajnie podlegają pod RODO jeżeli ktoś chciałby na nich zbijać pieniądze.

Nie wiem po co takie dziwne utrudnienia. Dodatkowo, dane zwracane powyższym kodowaniem są objętościowo większe. Nie tylko dlatego, że base64 standardowo zwiększa objętość, ale i dlatego, że użyto alfabet o „literach” złożonych z wielu znaków.

Kupowanie kart graficznych

Przychodzi kiedyś czas, gdy kartę graficzną warto by wymienić. Powody mogą być różne, ale mogą nimi być np.:

  • dotychczasowa karta zbliża się do końca okresu gwarancji,
  • coś w niej trzeszczy, świszczy i dziwnie się grzeje a wizyty w serwisie pomagają tylko na jakiś czas;
  • do komputera dostawiono nowy monitor o wyższej rozdzielczości, częstotliwości i różnych bajerach, z których chcemy korzystać a obecna karta tego jednak nie obsłuży w 100%;
  • do komputera będzie podłączany sprzęt VR;
  • gry komputerowe;
  • intensywne matematyczne obliczenia wymagające wspomagania procesora karty graficznej.

Zakładając, że wszystkie inne sprawy w komputerze mamy dobrze (np. odpowiedni zasilacz), możemy chcieć kupić nową kartę. Kart na rynku jest bardzo dużo rożnych modeli, w różnych generacjach i wariantach. Aby się w tym rozeznać można się posiłkować publikowanymi w specjalistycznych serwisach internetowych pomiarach, porównaniach i zestawieniach wydajności. Tutaj czekają możliwe pułapki:

  • tzw. benchmarki czyli testy pomiarowe bywają obarczone wadami, przez co wyniki nie są wiarygodne – trzeba więc czytać wiele benchmarków na temat tych samych urządzeń;
  • stare wyniki benchmarków mogą się deaktualizować w wyniku rozwoju sterowników (oprogramowania) do kart graficznych – stąd takie przypadki, że kilka lat temu karta Radeon RX 280 była uważana za równorzędną dla GeForce GTX 1060 a w 2020 roku pomiary wykazały, że dogoniła kartę o klasę wyższą, czyli GTX 1070;
  • same benchmarki tez potrafią się zmieniać – czasami np. opierają się o wykorzystanie prawdziwych, wymagających gier komputerowych, które jednak są przez swoich twórców aktualizowane;

Jakby tego było mało, możemy rozważać zakup kart używanych, które potrafią być znacząco tańsze (nawet do 3 razy), ale mogą mieć następujące wady:

  • mogą już nie mieć gwarancji a mogą mieć ukryte wady i zepsuć się po miesiącu – dlatego warto je kupować będąc pod jakąś ochroną kupujących (np. płacąc kartą, Pay Palem, kupując na Allegro – tam są odpowiednie programy ochrony, chargeback itp.);
  • mogą mieć podmieniony BIOS, aby lepiej się sprawdzać w pewnych konkretnych zastosowaniach (np. kopanie kryptowalut) ale tracą wówczas na innych – i tutaj czasami oryginalny BIOS można odzyskać a czasami nie;
  • mogą mieć podmienione elementy chłodzenia – może na lepsze a może na gorsze;
  • albo odwrotnie: mogą mieć niezadbane chłodzenie (zaschnięta pasta, trzeszczące wentylatory) – z tym akurat można sobie jakoś poradzić;

Czym się kierować przy zakupie? Przede wszystkim wiedzieć:

  • do czego karta będzie realnie służyć,
  • jaki monitor karta będzie miała obsłużyć,
  • jaki zasilacz posiadamy i czy będzie on wystarczający do obsługi karty.

Warto też się zastanowić na ile zależy nam na kulturze pracy urządzenia, czyli jego głośności. Głośność zależy od ilości wentylatorów na karcie. Tych może być od 1 do 3. Mniejsza liczba wentylatorów to:

  • cichsza praca, gdy karta nie jest bardzo obciążona;
  • głośna i dłuższa wentylacja, gdy karta jest istotnie obciążona;
  • potencjalnie krótsza karta, co pozwala na zmieszczenie w małej obudowie (i nie zakłócanie przepływu powietrza, które musi sprawnie przepływać, aby chłodzić kartę graficzną oraz oddzielnie procesor);

Większa liczba wentylatorów to odwrotne konsekwencje.

Niektóre karty mogą pracować w trybie pasywnym – wtedy wentylatory są wyłączone i nie ma żadnego hałasu aż karta zostanie tak obciążona, że się nagrzeje i trzeba będzie ją chłodzić z użyciem wentylatorów.

Kolejny aspekt, który warto wziąć pod uwagę, to że awaryjność karty podobno jest zależna od tego jak długo karta pracowała i jakie wytwarzała ciepło. Jeżeli karta jest nowa, to bardzo nas to nie martwi, bo po pierwsze jeszcze nic nie pracowała a po drugie i tak mamy okres gwarancyjny. Natomiast w przypadku zakupu starych kart ma to znacznie. Im większy pobór mocy, tym więcej ciepła trzeba odprowadzić. Im więcej ciepła, tym większe rozszerzanie i kurczenie się elementów, tym większe zużycie systemu chłodzenia. Warto więc się dobrze zastanowić zanim zakupiona zostanie karta, która w swojej generacji należała do tych, które pobierają więcej watów.

Kupując kartę warto trochę poczytać o producentach. Są tacy, którzy np. słyną z obsługi gwarancyjnej. Z tego słynie obecnie firma EVGA, o której chodzą legendy, że są skłonni nawet wymienić całą kartę po upływie gwarancji. (To tylko przykład, nigdy osobiście nie posiadałem żadnego sprzętu tej firmy.)

Jeżeli kupując kartę chcesz wziąć pod uwagę jej późniejszą odsprzedaż, to weź pod uwagę, że:

  • Karty będące na gwarancji sprzedawane są za znacznie lepszą cenę niż po okresie gwarancji – postaraj się je sprzedać zanim gwarancja minie; później cenę karty będziesz musiał obniżyć nawet i 3- lub 4-krotnie w stosunku do oryginalnej ceny zakupu;
  • Wobec karty nie będących na gwarancji powstrzymaj się przed ich rozkręcaniem (aby je np. przeczyścić, wymienić pastę, nasmarować wiatraki), bo najpewniej zerwiesz plomby na śrubkach, co jest interpretowane przez kupujących jako „karta była uszkodzona i ktoś ją naprawiał” (takie plomby można oczywiście dokupić, ale tu już wchodzimy w obszar oszustwa);
  • Sprzedając kartę pokaż zdjęcie karty od spodu – dobrze zorientowany kupujący właśnie tam chcą zobaczyć plomby na śrubkach (i też zerknąć na to, czy na widocznych elementach elektronicznych nie ma śladów uszkodzeń, spalenizny), więc jeżeli ktoś nie pokazuje spodu karty to jest to niezachęcające, może nawet podejrzane;
  • Sprzedając kartę podaj dokładny model: producent, chipset, ilość pamięci itp.
  • Karty uszkodzone sprzedaje się w cenie do ~350 zł (są skupowane przez serwisy, które wyciągają z nich dobre elementy do naprawy innych kart)
  • W związku z powyższym naprawa istniejącej karty może sięgać kwoty ~350 plus robocizna.

A właśnie, jakoś tego nie napisałem wcześniej, ale nie kupuj kart uszkodzonych myśląc, że je jakoś naprawisz. To się z dużym prawdopodobieństwem nie stanie. Karty graficzne ulegają uszkodzeniom, które wymagają profesjonalnego sprzętu i zaawansowanej znajomości elektroniki, posiadania i czytania schematów elektronicznych kart. Tego w domowych warunkach się nie wykona. Czasami sprzedający przedstawiają uszkodzenie karty jako niewielkie albo nawet sugerują, że problem leży w czymś błahym z czym oni, zwykli zjadacze chleba, nie potrafią sobie poradzić, ale ktoś inteligentny mógłby. To tylko marketing, nie daj się na to złapać.