Artykuły dla programistów
Wyjaśnienia formatów kodowania, pracy z JSON i innych tematów przydatnych programistom, z linkami do odpowiednich narzędzi online tulzy.
Kodowanie
Base64: po co jest kodowanie i jak działa
Jak Base64 zamienia dane binarne na tekst ASCII i kiedy naprawdę jest to potrzebne.
Base32: czym różni się od Base64 i kiedy jest wygodniejszy
Alfabet Base32 niewrażliwy na wielkość liter i sytuacje, w których jest wygodniejszy od Base64.
URL Encode/Decode: percent-encoding w linkach
Jak znaki specjalne w adresach i parametrach zamieniają się w sekwencje %XX.
HTML Entities: jak bezpiecznie wyświetlać znaki specjalne
Dlaczego znaki < > & trzeba escapować i jak to zapobiega uszkodzeniu znaczników.
JWT: budowa tokenu i co znaczy „dekodowanie" JWT
Header, payload i signature tokenu JWT oraz dlaczego dekodowanie to nie to samo co weryfikacja podpisu.
Unicode Escape: co oznaczają sekwencje \uXXXX
Skąd biorą się sekwencje takie jak \u0041 w JSON i ciągach JS oraz co oznaczają.
ROT13 i szyfr Cezara: proste podstawianie znaków
Dlaczego przesunięcie o 13 liter sprawia, że ROT13 jest samoodwrotny, i po co się go dziś używa.
Punycode: jak umiędzynarodowione domeny działają w DNS
Jak domena z niełacińskimi znakami zamienia się w formę ASCII z prefiksem xn--.
Alfabet Morse'a: jak tekst zamienia się w kropki i kreski
Zasada kodowania liter jako kropek i kresek oraz gdzie alfabet Morse'a jest dziś stosowany.
Data URI: kiedy osadzać obrazy bezpośrednio w kodzie
Jak Data URI osadza zawartość pliku bezpośrednio w HTML lub CSS i kiedy się to opłaca.
Gzip + Base64: kompresja danych do przesyłania jako tekst
Dlaczego skompresowane dane binarne dodatkowo koduje się w Base64, zanim trafią do pola tekstowego.
XML Entities: escapowanie znaków w dokumentach XML
Pięć obowiązkowych encji XML, bez których dokument psuje się podczas parsowania.
JSON
JSON Formatter: formatowanie, minimalizacja i walidacja
Formatowanie dla czytelności, minimalizacja dla rozmiaru, walidacja dla poprawności — trzy różne zadania z JSON.
JSONPath: jak wyszukiwać dane w JSON bez ręcznego parsowania
Jak JSONPath pozwala wyciągnąć potrzebne wartości z dużego JSON jednym wyrażeniem zamiast ręcznego przeszukiwania.
JSON Diff: czym porównanie strukturalne różni się od tekstowego
Dlaczego kolejność kluczy nie powinna wpływać na porównanie dwóch dokumentów JSON.
JSON Schema: jak opisać i sprawdzić strukturę JSON
Jak JSON Schema pozwala automatycznie sprawdzić, czy dane odpowiadają oczekiwanemu kontraktowi.
JSON Flatten: zamiana zagnieżdżonej struktury na płaską listę
Jak głęboko zagnieżdżony JSON zamienia się w płaską listę kluczy w rodzaju user.address.city.
JSON Sort Keys: po co sortować klucze obiektu
Dlaczego kolejność kluczy w JSON nie jest ustalona, ale sortowanie i tak bywa przydatne.
JSON Repair: dlaczego JSON się psuje i jak to naprawić
Typowe przyczyny „zepsutego" JSON i co automatyczna naprawa może, a czego nie może poprawić.
Mock JSON Generator: po co są fałszywe dane
Jak dane mock pozwalają zacząć budować interfejs, zanim backend będzie gotowy.
JSON ↔ YAML/CSV/XML/TOML: kiedy i po co konwertować
Jakie dane giną przy konwersji JSON na CSV i dlaczego YAML i TOML są popularne w plikach konfiguracyjnych.
Tekst
Case Converter: po co istnieją różne style nazewnictwa
Dlaczego w jednym projekcie zmienne zapisuje się camelCase, a pliki kebab-case, i skąd wzięły się te zasady.
Text Diff: jak algorytmy znajdują różnicę między dwoma tekstami
Jak algorytm diff znajduje minimalny zestaw zmian między dwiema wersjami tekstu.
Wyrażenia regularne: podstawowa składnia i typowe wzorce
Jak czytać wyrażenie regularne i czym dopasowanie zachłanne różni się od leniwego.
Sortowanie i usuwanie duplikatów wierszy: do czego się przydaje
Dlaczego sortowanie numeryczne stawiające „10" przed „9" jest błędem, i jak tego uniknąć.
String Escape: dlaczego ten sam tekst trzeba escapować inaczej
Dlaczego ten sam cudzysłów jest escapowany inaczej w ciągu JS, w JSON i w poleceniu shell.
CRLF kontra LF: dlaczego znaki końca linii wciąż mają znaczenie
Dlaczego plik napisany w Windows może wyglądać jako „cały zmieniony" w gicie na Linuksie.
Liczenie znaków i słów: dlaczego to nie zawsze jest trywialne
Dlaczego emoji lub litera z akcentem może liczyć się jako kilka znaków naraz.
Lorem Ipsum: skąd wziął się tekst zastępczy i po co jest potrzebny
Dlaczego projektanci celowo używają „bezsensownego" tekstu zamiast prawdziwej treści w makietach.
Slugify: jak zamienić dowolny tekst w adres URL
Jak tytuł „Witaj, Świecie! Jak się masz?" zamienia się w kompatybilny z URL ciąg witaj-swiecie-jak-sie-masz.
Markdown: dlaczego prosta składnia tekstowa pokonała rozbudowane edytory
Dlaczego programiści wolą pisać dokumentację w Markdown niż w edytorze tekstu sformatowanego.
Spacje i niewidoczne znaki: ukryta przyczyna dziwnych błędów
Dlaczego dwa pozornie identyczne ciągi znaków mogą się nie zgadzać przez niewidoczny znak.
Text Reverse: dlaczego „odwrócenie tekstu" jest trudniejsze, niż się wydaje
Dlaczego naiwne odwrócenie ciągu znaków może zamienić emoji w nieużyteczne bajty.
Analiza częstotliwości tekstu: po co liczyć powtórzenia słów
Jak częstotliwość liter w zaszyfrowanym tekście pomaga złamać najprostsze szyfry podstawieniowe.
Hashe/Krypto
Hash Generator: czym różnią się MD5, SHA-1 i SHA-256
Dlaczego MD5 nadal jest używane do sprawdzania integralności plików, ale nie do haseł.
Checksum Verifier: jak sprawdzić, czy plik nie jest uszkodzony
Dlaczego zgodna suma kontrolna potwierdza integralność pliku, ale nie to, kto go stworzył.
HMAC: czym skrót z kluczem różni się od zwykłego skrótu
Dlaczego zwykły SHA-256 nie chroni przed sfałszowaniem wiadomości, a HMAC tak.
Bcrypt: dlaczego hasła haszuje się wolno, a nie szybko
Dlaczego szybki SHA-256 to zły wybór do haseł, a wolny bcrypt to właściwy.
UUID: jak generuje się identyfikatory, które prawie nigdy się nie powtarzają
Dlaczego UUID v4 można generować niezależnie na milionach maszyn bez ryzyka kolizji.
Generator haseł: co naprawdę czyni hasło silnym
Dlaczego długie hasło ze słów słownikowych jest silniejsze niż krótkie z symbolami i cyframi.
AES: jak działa szyfrowanie symetryczne
Dlaczego ten sam klucz szyfruje i deszyfruje dane w AES, i czym różni się to od szyfrowania asymetrycznego.
Argon2: dlaczego ten algorytm wygrał konkurs na haszowanie haseł
Jak Argon2 lepiej broni się przed atakami z użyciem kart graficznych niż starsze algorytmy haszowania haseł.
Scrypt: dlaczego algorytm potrzebuje tak dużo pamięci
Dlaczego scrypt celowo wymaga dużo pamięci, aby utrudnić łamanie na urządzeniach ASIC.
TOTP: jak działają jednorazowe kody w aplikacjach uwierzytelniających
Dlaczego kod w Google Authenticator działa bez internetu i synchronizuje się z serwerem tylko przez czas.
PBKDF2: najstarszy standard rozciągania klucza
Dlaczego zalecana liczba iteracji PBKDF2 rośnie z każdym rokiem.
X.509: co jest wewnątrz certyfikatu SSL
Co dokładnie przegląda przeglądarka w certyfikacie witryny, zanim pokaże zieloną kłódkę.
PGP: jak działa szyfrowanie kluczem publicznym i prywatnym
Dlaczego można swobodnie udostępniać klucz publiczny PGP, ale nigdy klucz prywatny.
Czas/Liczby
Czas Unix: dlaczego komputery liczą czas od 1970 roku
Dlaczego 1 stycznia 1970 roku stał się punktem odniesienia czasu dla większości systemów komputerowych.
Wyrażenia cron: jak odczytać harmonogram zadań
Jak odczytać wyrażenie takie jak */15 * * * * i dokładnie wiedzieć, kiedy zadanie się uruchomi.
Systemy liczbowe: po co istnieją system dwójkowy, ósemkowy i szesnastkowy
Dlaczego kolor #FF5733 w CSS zapisany jest cyframi szesnastkowymi, a nie dziesiętnymi.
Operacje bitowe: jak działają AND, OR i XOR na poziomie bitów
Czym bitowy AND różni się od logicznego, i po co w ogóle operować na pojedynczych bitach liczby.
Różnica między datami: dlaczego liczenie dni jest trudniejsze, niż się wydaje
Dlaczego naiwne odejmowanie dat może dać błędny wynik przez lata przestępne.
Obliczanie wieku: dlaczego to nie proste odejmowanie lat
Dlaczego proste odjęcie roku urodzenia może dać wiek o rok większy niż rzeczywisty.
Strefy czasowe: dlaczego UTC to nie to samo co GMT
Dlaczego UTC nigdy nie zmienia się dwa razy w roku, podczas gdy czas w Londynie (GMT/BST) tak.
Kalkulator czasu trwania: jak poprawnie dodawać godziny, minuty i sekundy
Dlaczego przy dodawaniu minut i sekund trzeba "przenosić" resztę do następnej pozycji, tak jak przy dodawaniu dziesiętnym.
ISO 8601 Duration: jak zapisać czas trwania w standardowym formacie
Dlaczego zapis PT1H30M oznacza „1 godzina 30 minut", a nie „1 minuta 30 godzin".
Numer tygodnia: dlaczego różne kraje liczą tygodnie inaczej
Dlaczego 1 stycznia czasem należy do 52. lub 53. tygodnia poprzedniego roku według standardu ISO 8601.
Liczby rzymskie: jak działa system bez zera i pozycji
Dlaczego IV oznacza 4, a nie 6, i jak działa zasada odejmowania w liczbach rzymskich.
IEEE 754: dlaczego 0.1 + 0.2 nie równa się 0.3 w kodzie
Dlaczego niemal w każdym języku programowania 0.1 + 0.2 wyświetla 0.30000000000000004.
Liczba słownie: po co zamieniać cyfry na słowa
Dlaczego w dokumentach bankowych kwotę zapisuje się jednocześnie cyframi i słownie.
Sieć/HTTP
Rozbiór URL: z jakich części składa się adres internetowy
Dlaczego URL ma część po symbolu #, której serwer nawet nie otrzymuje.
Query String kontra JSON: dlaczego parametry GET są tak ograniczone
Dlaczego przekazanie tablicy lub zagnieżdżonego obiektu przez query string URL nie jest tak proste jak przez JSON.
User-Agent: dlaczego ten ciąg jest takim bałaganem
Dlaczego Chrome, Safari i Edge zawierają jednocześnie słowa "Mozilla" i "Safari" w swoim User-Agent.
Basic Authentication: jak działa najprostszy sposób ochrony zasobu HTTP
Dlaczego Basic Auth koniecznie wymaga HTTPS, skoro Base64 to kodowanie, a nie szyfrowanie.
Nagłówki HTTP: co kryje się w każdym żądaniu i odpowiedzi
Dlaczego nagłówek Content-Type określa, jak przeglądarka interpretuje treść odpowiedzi serwera.
Cookies: jak niewielki fragment tekstu przechowuje stan sesji
Dlaczego atrybut HttpOnly chroni cookie przed kradzieżą przez złośliwy kod JavaScript.
CORS: dlaczego przeglądarka blokuje "zwykłe" żądania do innej domeny
Dlaczego błąd CORS pojawia się w przeglądarce, a nie po stronie serwera, i kto naprawdę blokuje żądanie.
Nagłówki email: jak prześledzić drogę wiadomości od nadawcy do ciebie
Dlaczego nagłówki Received trzeba czytać od dołu do góry, aby prześledzić drogę wiadomości.
SEO
Meta tagi: które naprawdę wpływają na wyszukiwarkę i media społecznościowe
Dlaczego wyszukiwarka czasem ignoruje twój meta description i sama generuje fragment z tekstu strony.
robots.txt: jak boty wyszukiwarek decydują, co mogą skanować
Dlaczego reguła Disallow w robots.txt nie ukrywa strony z wyników wyszukiwania, jeśli ktoś inny do niej linkuje.
Sitemap.xml: po co wyszukiwarkom mapa witryny
Dlaczego obecność w sitemap.xml nie gwarantuje, że wyszukiwarka zaindeksuje stronę.
Favicon: dlaczego jedna ikona wymaga tylu rozmiarów i formatów
Dlaczego jedno favicon.ico już nie wystarcza, aby poprawnie wyświetlać się na wszystkich urządzeniach.
Generowanie sitemap.xml: jak automatycznie zbudować mapę witryny
Dlaczego wyszukiwarki w większości ignorują pole priority w sitemap.xml, mimo że jest częścią specyfikacji.
Programowanie webowe
HEX, RGB, HSL: dlaczego istnieje tyle sposobów zapisu koloru
Dlaczego projektanci często wybierają HSL zamiast HEX przy ręcznym dobieraniu odcienia koloru.
Minifikacja CSS: co dokładnie jest usuwane z pliku i po co
Dlaczego zminifikowany CSS działa dokładnie tak samo w przeglądarce, mimo że staje się nieczytelny dla człowieka.
Minifikacja JavaScript: różnica między minifikacją a obfuskacją
Dlaczego zminifikowany kod nadal można przeczytać, jeśli się chce, a zobfuskowany — nie.
Minifikacja HTML: dlaczego spacje w znacznikach w ogóle mają znaczenie
Dlaczego usunięcie spacji wewnątrz <pre> lub textarea może zepsuć wygląd strony, w przeciwieństwie do niemal każdego innego miejsca.
Gradienty CSS: czym linear różni się od radial i conic
Dlaczego conic-gradient sprawdza się w wykresach kołowych, a radial-gradient daje efekt plamy światła.
Algorytm Luhna: jak sprawdza się poprawność numeru karty
Dlaczego numer karty poprawny według algorytmu Luhna nie oznacza, że ta karta naprawdę istnieje.
IBAN: jak zbudowany jest międzynarodowy numer konta bankowego
Dlaczego pierwsze dwie litery w IBAN to kod kraju, a nie część samego numeru konta.
Kody QR: jak link mieści się w kwadracie z pikseli
Dlaczego kod QR z logo na środku nadal się skanuje, mimo że część wzoru jest zasłonięta.
Kody kreskowe: czym Code 128 różni się od EAN-13
Dlaczego produkty na sklepowych półkach prawie zawsze mają EAN-13, a nie Code 128.
Obrazy placeholder: dlaczego fałszywe obrazki mają znaczenie podczas developmentu
Dlaczego deweloperzy celowo wstawiają szare prostokąty zamiast prawdziwych zdjęć, gdy layout jest jeszcze w budowie.