Przejdź do treści

Blog

Programowanie, systemy operacyjne i cyberbezpieczeństwo – 70 artykułów.

Grafy w praktyce: BFS, DFS, Dijkstra i A*, czyli jak wyznacza się trasę

algorytmyPython

Ostatnia część serii o strukturach danych. Trzy algorytmy przeszukiwania na jednej mapie: BFS liczy kroki, Dijkstra koszt, A* dokłada heurystykę i przestaje błądzić. Do tego reprezentacja grafu, DFS i sortowanie topologiczne, struktura zbiorów rozłącznych z odwrotną funkcją Ackermanna oraz odpowiedź na pytanie, dlaczego prawdziwa nawigacja nie liczy Dijkstry na żywo, tylko przelicza mapę wcześniej.

Czytaj dalej →

Kopce i kolejki priorytetowe: heapq, schedulery i token bucket

algorytmyPython

Piąta część serii o strukturach danych. Kopiec binarny zapisany w zwykłej tablicy, budowa w czasie liniowym i trzy operacje, które z niego wynikają. Po co utrzymywać częściowy porządek zamiast pełnego, jak wybrać dziesięć największych elementów bez sortowania miliona, czym jest heapq.merge przy danych większych niż pamięć i jak z kolejki priorytetowej robi się scheduler oraz ogranicznik ruchu.

Czytaj dalej →

B-drzewa: dlaczego indeks w bazie nie jest zwykłym drzewem

algorytmyMySQLbazy danych

Czwarta część serii o strukturach danych. Co się zmienia, gdy dane przestają mieścić się w pamięci: dlaczego drzewo binarne o wysokości 30 jest na dysku katastrofą, jak B-drzewo mieści setki kluczy w jednym węźle i schodzi do trzech poziomów przy miliardzie wierszy. Strona 16 KB w InnoDB, indeks klastrowy i wtórny, reguła lewego prefiksu w indeksie złożonym oraz pięć sytuacji, w których indeks nie pomoże.

Czytaj dalej →

Drzewa poszukiwań: BST, AVL i czerwono-czarne

algorytmyPython

Trzecia część serii o strukturach danych. Jak drzewo poszukiwań binarnych trzyma porządek bez przesuwania tablicy, dlaczego na danych posortowanych degeneruje się do listy i wykonuje dokładnie tyle samo porównań co sortowanie bąbelkowe, oraz jak temu zaradzić rotacjami. AVL kontra drzewa czerwono-czarne, animacja obu przypadków i odpowiedź na pytanie, po co komu drzewo, skoro jest szybszy słownik.

Czytaj dalej →

Wyszukiwanie liniowe i binarne: dwie pętle, w których łatwo się pomylić

algorytmyPython

Druga część serii o strukturach danych. Kiedy wyszukiwanie liniowe wystarcza, kiedy opłaca się posortować dane, jak napisać wyszukiwanie binarne bez pętli nieskończonej i skąd wziął się błąd przepełnienia, który siedział w bibliotece standardowej Javy przez dziewięć lat. Do tego moduł bisect, wyszukiwanie wykładnicze i rachunek, po ilu zapytaniach sortowanie zwraca się z nawiązką.

Czytaj dalej →

Tablice mieszające: co naprawdę siedzi w słowniku i tablicy asocjacyjnej

algorytmyPythonbezpieczeństwo

Pierwsza część serii o strukturach danych. Jak z funkcji skrótu robi się dostęp w czasie stałym, co się dzieje przy kolizjach, czym różni się łańcuchowanie od adresowania otwartego i dlaczego słownik czasem nagle zwalnia. Kontrakt hash i eq w Pythonie, klucz, który gubi dane, koszt amortyzowany przy rozrastaniu tablicy oraz trzy różne rzeczy nazywane tym samym słowem hash: skrót do wyszukiwania, kryptograficzny i do haseł.

Czytaj dalej →

Kiedy złożoność staje się podatnością: HashDoS, ReDoS i inne ataki na algorytmy

bezpieczeństwoalgorytmyPython

Tabelki złożoności czyta też atakujący. Jak kilka kilobajtów dobranego wejścia zajmuje rdzeń procesora na sekundy: kolizje w tablicach mieszających (HashDoS z 2011 roku), katastrofalny nawrót w wyrażeniach regularnych (27 minut awarii Cloudflare w 2019), pesymistyczny przypadek quicksorta, bomby dekompresyjne i encje XML. Z pomiarami w Pythonie, prawdziwymi liczbami i listą obron, które faktycznie działają.

Czytaj dalej →

Jak sortuje twój język: TimSort, Powersort, pdqsort i reszta

algorytmyPythonJavaScript

Ostatnia część cyklu o sortowaniu: co naprawdę dzieje się po wywołaniu sorted() w Pythonie, Arrays.sort w Javie, std::sort w C++, sort() w PHP i JavaScripcie oraz sort_unstable w Ruście. Powersort od CPythona 3.11, dual-pivot quicksort dla typów prostych, stabilność wymuszona specyfikacją, sortowanie zewnętrzne, quickselect zamiast sortowania i klasyczne pułapki: sortowanie liczb jak napisów oraz niespójny komparator.

Czytaj dalej →

Sortowanie bez porównań: zliczanie, pozycyjne i kubełkowe

algorytmyPythonmatematyka

Trzecia część cyklu o algorytmach sortowania. Skąd bierze się granica n log n dla wszystkich algorytmów porównawczych, dlaczego jest nieprzekraczalna i jak sortowanie przez zliczanie, pozycyjne i kubełkowe przechodzą pod nią suchą stopą, nie porównując ani razu dwóch elementów. Implementacje w Pythonie, animacje z licznikiem porównań ustawionym na zero oraz uczciwy rachunek kosztów: pamięć, zakres kluczy i rozkład danych.

Czytaj dalej →

Dziel i zwyciężaj: Merge, Quick, Heap, Tree, IntroSort i TimSort

algorytmyPython

Druga część cyklu o algorytmach sortowania: sortowanie przez scalanie, szybkie, przez kopcowanie i drzewiaste, a potem hybrydy, które naprawdę pracują w bibliotekach – IntroSort z C++ i TimSort z Pythona oraz Javy. Implementacje w Pythonie, animacje, wybór pivota, przypadek pesymistyczny quicksorta na żywo i pytanie, dlaczego szybkie bije scalanie mimo identycznej złożoności.

Czytaj dalej →

Algorytmy sortowania w akcji: od bąbelkowego do Shella

algorytmyPython

Wyścig dziewięciu algorytmów sortowania na żywo w przeglądarce, a potem spokojny rozbiór tych najprostszych: bąbelkowego, koktajlowego, grzebieniowego, gnoma, przez wybieranie, przez wstawianie i Shella. Implementacje w Pythonie, liczniki porównań i zapisów, stabilność, sortowanie w miejscu i adaptacyjność. Oraz to, o czym podręczniki milczą: kiedy O(n kwadrat) naprawdę wygrywa.

Czytaj dalej →

Dlaczego godzina ma 60 minut, a doba 24 godziny

matematykaPythonJavaScript

W kieszeni nosisz babiloński kalkulator sprzed czterech tysięcy lat. Skąd wziął się system sześćdziesiątkowy i liczenie na paliczkach, czemu 60 i 12 wygrywają z 10 liczbą dzielników, jak Egipcjanie podzielili noc na 12 godzin, skąd pochodzą słowa minuta i sekunda – i dlaczego rewolucyjna Francja przegrała z 10-godzinną dobą, choć jej dziesiętny czas przeżył w uniksowym timestampie.

Czytaj dalej →

Cyfry kontrolne – jak PESEL, NIP, IBAN i numer karty łapią literówki

matematykaJavaScriptPython

Ostatnia cyfra PESEL-u, NIP-u, numeru karty płatniczej i dwie cyfry w IBAN-ie nie są losowe – to sumy kontrolne oparte na arytmetyce modularnej. Jakie błędy człowiek robi najczęściej, dlaczego wagi i moduł pierwszy łapią przestawione cyfry, algorytm Luhna w 15 linijkach oraz implementacje walidacji PESEL, NIP i IBAN w Pythonie, PHP i JavaScript.

Czytaj dalej →

Od dni do sekund – uniksowy timestamp, problem roku 2038 i strefy czasowe

JavaScriptPythonLinux

Trzecia część cyklu o czasie: komputery nie liczą dat, tylko sekundy od 1970 roku. Skąd się bierze problem roku 2038 (i kogo naprawdę dotknie), czym są sekundy przestępne i dlaczego znikną do 2035, oraz czemu strefy czasowe to baza danych IANA, a nie matematyka – z dniami, które nie istnieją, i godzinami, które zdarzają się dwa razy.

Czytaj dalej →

Flask, FastAPI, Django – jak poznawałem trzy Pythony do weba

PythonFlaskFastAPI

Nie ranking z internetu, tylko moja droga: Flask, gdy chciałem najszybciej wystawić HTML; FastAPI, gdy potrzebowałem szybkiego API z walidacją i /docs; Django, gdy chciałem użytkowników, panel i ORM z pudełka. Trzy frameworki przez pryzmat roboty, do której po nie sięgałem – z kodem i szczerą tabelą decyzyjną.

Czytaj dalej →

Jak dodałem WebMCP i frontową wyszukiwarkę – blog gotowy na agenty AI

GEOWebMCPLighthouse

Analiza i praktyka: czy statyczny blog (bez backendu) da radę wystawić WebMCP i czy da się ubić pełne 6/6 w Lighthouse Przeglądanie agentowe. Imperatywne navigator.modelContext.registerTool, deklaratywne adnotacje formularza (toolname/tooldescription), kliencka wyszukiwarka i szczera analiza, co naprawdę znaczy ten wynik.

Czytaj dalej →

Platforma webowa dogoniła biblioteki – co możesz dziś usunąć z projektu

Front-endCSSJavaScript

jQuery, lodash, moment, Popper, jQuery UI datepicker – całe pokolenie bibliotek łatało dziury w przeglądarce. Dziś tych dziur już nie ma: CSS, HTML i natywny JavaScript przejęły to, co latami doklejaliśmy zależnościami, a miejscami CSS wyprzedził JavaScript. Przegląd z konkretnymi przykładami before/after i aktualnym stanem Baseline.

Czytaj dalej →

Zamiana Liczb: Od Dziesiętnego do Binarnego

phpJavaScriptPython

Zamiana liczb dziesiętnych na binarne – z częścią całkowitą i (rzadko porządnie tłumaczoną) częścią ułamkową. Algorytm mnożenia przez 2, kiedy ułamek jest skończony, a kiedy nieskończony, wykrywanie okresu oraz implementacje w Pythonie, JavaScript, PHP i C++. Plus most do niedokładności liczb zmiennoprzecinkowych.

Czytaj dalej →

Kalendarz w czystym JavaScript – bez jQuery

Front-endJavaScriptWeb Components

Ten sam kalendarz miesięczny co w serii z jQuery, ale bez żadnych zależności: Web Component, natywne API DOM, Intl do nazw miesięcy i dni oraz fetch zamiast AJAX-a. Pokazuję, że w 2026 jQuery jest po prostu zbędne.

Czytaj dalej →