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.

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.

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.