reklama - zainteresowany?

Programowanie w j - Helion

Programowanie w j
ebook
Autor: Steve Klabnik, Carol Nichols
Tytuł oryginału: The Rust Programming Language, 2nd Edition
TÅ‚umaczenie: Lech Lachowski
ISBN: 978-83-289-1011-9
stron: 584, Format: ebook
Data wydania: 2024-09-03
Księgarnia: Helion

Cena książki: 96,75 zł (poprzednio: 129,00 zł)
Oszczędzasz: 25% (-32,25 zł)

Dodaj do koszyka Programowanie w j

Tagi: Inne - Programowanie

Rust

Dodaj do koszyka Programowanie w j

 

Osoby które kupowały "Programowanie w j", wybierały także:

  • Superinteligencja. Scenariusze, strategie, zagro
  • Poradnik design thinking - czyli jak wykorzysta
  • Kosymulacja. Elastyczne projektowanie i symulacja wielodomenowa
  • F# 4.0 dla zaawansowanych. Wydanie IV
  • Systemy reaktywne. Wzorce projektowe i ich stosowanie

Dodaj do koszyka Programowanie w j

Spis treści

Programowanie w języku Rust. Oficjalny podręcznik. Wydanie II eBook -- spis treści

Przedmowa

Wstęp

Podziękowania

Wprowadzenie

1. Pierwsze kroki

  • Instalacja
    • Instalowanie narzÄ™dzia rustup w systemie Linux lub macOS
    • Instalowanie narzÄ™dzia rustup w systemie Windows
    • RozwiÄ…zywanie problemów
    • Aktualizowanie i odinstalowywanie
    • Lokalna dokumentacja
  • Witaj, Å›wiecie!
    • Tworzenie katalogu projektu
    • Pisanie i uruchamianie programu Rusta
    • Anatomia programu Rusta
    • Kompilowanie i uruchamianie to oddzielne kroki
  • Witaj, Cargo!
    • Tworzenie projektu za pomocÄ… Cargo
    • Kompilowanie i uruchamianie projektu Cargo
    • Kompilowanie w celu wydania projektu
    • Cargo jako konwencja
  • Podsumowanie

2. Programowanie gry w zgadywanie

  • Konfigurowanie nowego projektu
  • Przetwarzanie zgadywania
    • Przechowywanie wartoÅ›ci za pomocÄ… zmiennych
    • Odbieranie danych wprowadzanych przez użytkownika
    • ObsÅ‚uga ewentualnego niepowodzenia za pomocÄ… typu Result
    • Wypisywanie wartoÅ›ci za pomocÄ… symboli zastÄ™pczych println!
    • Testowanie pierwszej części
  • Generowanie sekretnej liczby
    • Korzystanie ze skrzynki w celu uzyskania wiÄ™kszej funkcjonalnoÅ›ci
    • Generowanie liczby losowej
  • Porównywanie próby odgadniÄ™cia z sekretnÄ… liczbÄ…
  • Umożliwianie wielokrotnego zgadywania dziÄ™ki zastosowaniu pÄ™tli
    • ZakoÅ„czenie gry po odgadniÄ™ciu prawidÅ‚owej liczby
    • ObsÅ‚uga nieprawidÅ‚owych danych wejÅ›ciowych
  • Podsumowanie

3. Powszechne koncepcje programowania

  • Zmienne i mutowalność
    • StaÅ‚e
    • PrzysÅ‚anianie
  • Typy danych
    • Typy skalarne
    • Typy zÅ‚ożone
  • Funkcje
    • Parametry
    • Instrukcje i wyrażenia
    • Funkcje z wartoÅ›ciami zwracanymi
  • Komentarze
  • PrzepÅ‚yw sterowania
    • Wyrażenia if
    • Powtarzanie za pomocÄ… pÄ™tli
  • Podsumowanie

4. Własność

  • Czym jest wÅ‚asność?
    • ReguÅ‚y wÅ‚asnoÅ›ci
    • Zakres zmiennych
    • Typ String
    • Pamięć i alokacja
    • WÅ‚asność i funkcje
    • WartoÅ›ci zwracane i zakres
  • Referencje i pożyczanie
    • Referencje mutowalne
    • Referencje wiszÄ…ce
    • ReguÅ‚y referencji
  • Typ wycinka
    • Wycinki Å‚aÅ„cucha znaków
    • Inne wycinki
  • Podsumowanie

5. Wykorzystanie struktur do organizowania powiÄ…zanych ze sobÄ… danych

  • Definiowanie struktur i tworzenie ich instancji
    • Użycie skrótu inicjowania pól
    • Tworzenie instancji z innych instancji za pomocÄ… skÅ‚adni aktualizacji struktury
    • Tworzenie różnych typów za pomocÄ… struktur krotkowych bez nazwanych pól
    • Struktury jednostkowe bez żadnych pól
  • PrzykÅ‚adowy program wykorzystujÄ…cy struktury
    • Refaktoryzacja z wykorzystaniem krotek
    • Refaktoryzacja z wykorzystaniem struktur: dodanie znaczenia
    • Dodanie użytecznej funkcjonalnoÅ›ci za pomocÄ… cech pochodnych
  • SkÅ‚adnia metod
    • Definiowanie metod
    • Metody z wiÄ™kszÄ… liczbÄ… parametrów
    • Funkcje powiÄ…zane
    • Wiele bloków impl
  • Podsumowanie

6. Typy wyliczeniowe i dopasowywanie wzorców

  • Definiowanie typu wyliczeniowego
    • WartoÅ›ci wyliczenia
    • Enumeracja Option i jej zalety w porównaniu z wartoÅ›ciami zerowymi
  • Konstrukcja match przepÅ‚ywu sterowania
    • Wzorce, które powodujÄ… powiÄ…zanie z wartoÅ›ciami
    • Dopasowywania za pomocÄ… Option<T>
    • Dopasowywania sÄ… wyczerpujÄ…ce
    • Wzorce catch-all i symbol zastÄ™pczy _
  • ZwiÄ™zÅ‚y przepÅ‚yw sterowania z wykorzystaniem skÅ‚adni if let
  • Podsumowanie

7. ZarzÄ…dzanie rozwijajÄ…cymi siÄ™ projektami za pomocÄ… pakietów, skrzynek i moduÅ‚ów

  • Pakiety i skrzynki
  • Definiowanie moduÅ‚ów w celu kontrolowania zakresu i prywatnoÅ›ci
  • Åšcieżki odwoÅ‚ywania siÄ™ do elementów w drzewie moduÅ‚ów
    • UdostÄ™pnianie Å›cieżek za pomocÄ… sÅ‚owa kluczowego pub
    • Rozpoczynanie Å›cieżek wzglÄ™dnych od sÅ‚owa kluczowego super
    • Upublicznianie struktur i wyliczeÅ„
  • Wprowadzanie Å›cieżek do zakresu za pomocÄ… sÅ‚owa kluczowego use
    • Tworzenie idiomatycznych Å›cieżek use
    • Wprowadzanie nowych nazw za pomocÄ… sÅ‚owa kluczowego as
    • Ponowne eksportowanie nazw za pomocÄ… pub use
    • Korzystanie z pakietów zewnÄ™trznych
    • Skracanie dÅ‚ugich list instrukcji use za pomocÄ… zagnieżdżonych Å›cieżek
    • Operator glob
  • Rozdzielanie moduÅ‚ów na różne pliki
  • Podsumowanie

8. Powszechnie używane kolekcje

  • Przechowywanie list wartoÅ›ci za pomocÄ… wektorów
    • Tworzenie nowego wektora
    • Aktualizowanie wektora
    • Odczytywanie elementów wektorów
    • Iterowanie przez wartoÅ›ci w wektorze
    • Przechowywanie wielu typów za pomocÄ… wyliczenia
    • Porzucenie wektora powoduje porzucenie jego elementów
  • Wykorzystywanie typu String do przechowywania tekstu zakodowanego w UTF-8
    • Czym jest String?
    • Tworzenie nowej instancji String
    • Aktualizowanie instancji String
    • Indeksowanie wartoÅ›ci String
    • Tworzenie wycinków wartoÅ›ci String
    • Metody iterowania przez wartoÅ›ci String
    • Typy String nie sÄ… takie proste
  • Przechowywanie kluczy z powiÄ…zanymi wartoÅ›ciami w mapach mieszajÄ…cych
    • Tworzenie nowej instancji HashMap
    • Uzyskiwanie dostÄ™pu do wartoÅ›ci z mapy mieszajÄ…cej
    • Mapy mieszajÄ…ce i wÅ‚asność
    • Aktualizowanie instancji HashMap
    • Funkcje mieszajÄ…ce
  • Podsumowanie

9. ObsÅ‚uga bÅ‚Ä™dów

  • ObsÅ‚uga bÅ‚Ä™dów nieodwracalnych za pomocÄ… wywoÅ‚ania panic!
  • ObsÅ‚uga bÅ‚Ä™dów odwracalnych z wykorzystaniem typu Result
    • Dopasowywanie na podstawie różnych bÅ‚Ä™dów
    • Propagacja bÅ‚Ä™dów
  • Panikować czy nie panikować?
    • PrzykÅ‚ady, kod prototypów i testy
    • Przypadki, w których mamy wiÄ™cej informacji niż kompilator
    • Wskazówki dotyczÄ…ce obsÅ‚ugi bÅ‚Ä™dów
    • Tworzenie typów niestandardowych do celów walidacji
  • Podsumowanie

10. Typy sparametryzowane, cechy i czasy życia

  • Redukowanie duplikacji przez wyodrÄ™bnianie funkcji
  • Sparametryzowane typy danych
    • Typy sparametryzowane w definicjach funkcji
    • Typy sparametryzowane w definicjach struktur
    • Typy sparametryzowane w definicjach wyliczeÅ„
    • Typy sparametryzowane w definicjach metod
    • Wydajność kodu wykorzystujÄ…cego typy sparametryzowane
  • Cechy - definiowanie wspóÅ‚dzielonego zachowania
    • Definiowanie cechy
    • Implementowanie cechy w typie
    • Implementacje domyÅ›lne
    • Cechy jako parametry
    • Zwracanie typów, które implementujÄ… cechy
    • Używanie wiÄ…zaÅ„ cech do warunkowego implementowania metod
  • Walidacja referencji za pomocÄ… czasów życia
    • Używanie czasów życia do zapobiegania powstawaniu wiszÄ…cych referencji
    • Kontrola pożyczania
    • Sparametryzowane czasy życia w funkcjach
    • SkÅ‚adnia adnotacji czasów życia
    • Adnotacje czasów życia w sygnaturach funkcji
    • MyÅ›lenie w kategoriach czasów życia
    • Adnotacje czasów życia w definicjach struktur
    • Elizja czasów życia
    • Adnotacje czasów życia w definicjach metod
    • Statyczny czas życia
  • Parametry typów sparametryzowanych, wiÄ…zania cech i czasy życia razem wziÄ™te
  • Podsumowanie

11. Pisanie zautomatyzowanych testów

  • Jak pisać testy?
    • Anatomia funkcji testowej
    • Sprawdzenie wyników za pomocÄ… makra assert!
    • Testowanie równoÅ›ci za pomocÄ… makr assert_eq! i assert_ne!
    • Dodawanie niestandardowych komunikatów o bÅ‚Ä™dach
    • Sprawdzanie paniki za pomocÄ… atrybutu should_panic
    • Wykorzystanie w testach typu Result<T, E>
  • Kontrolowanie sposobu uruchamiania testów
    • Uruchamianie testów równolegle lub po kolei
    • WyÅ›wietlanie danych wyjÅ›ciowych funkcji
    • Uruchamianie podzbioru testów wedÅ‚ug nazwy
    • Ignorowanie niektórych testów i uruchamianie ich na specjalne żądanie
  • Organizowanie testów
    • Testy jednostkowe
    • Testy integracyjne
  • Podsumowanie

12. Projekt z wykorzystaniem operacji we-wy - budowanie programu wiersza poleceń

  • Przyjmowanie argumentów wiersza poleceÅ„
    • Odczytywanie wartoÅ›ci argumentów
    • Zapisywanie wartoÅ›ci argumentów w zmiennych
  • Odczyt pliku
  • Refaktoryzacja w celu poprawy moduÅ‚owoÅ›ci i obsÅ‚ugi bÅ‚Ä™dów
    • Separacja zagadnieÅ„ projektów binarnych
    • Naprawianie obsÅ‚ugi bÅ‚Ä™dów
    • WyodrÄ™bnianie logiki z funkcji main
    • Wydzielanie kodu do skrzynki biblioteki
  • Rozwijanie funkcjonalnoÅ›ci biblioteki za pomocÄ… programowania opartego na testach
    • Pisanie testu koÅ„czÄ…cego siÄ™ niepowodzeniem
    • Pisanie kodu w celu zapewnienia pozytywnego wyniku testu
  • Praca ze zmiennymi Å›rodowiskowymi
    • Pisanie niepomyÅ›lnego testu dla funkcji search nieuwzglÄ™dniajÄ…cej wielkoÅ›ci liter
    • Implementacja funkcji search_case_insensitive
  • Wypisywanie komunikatów o bÅ‚Ä™dach do standardowego strumienia bÅ‚Ä™dów, a nie do standardowego strumienia wyjÅ›ciowego
    • Sprawdzanie, gdzie sÄ… zapisywane bÅ‚Ä™dy
    • Wypisywanie bÅ‚Ä™dów do standardowego strumienia bÅ‚Ä™dów
  • Podsumowanie

13. Cechy języka funkcyjnego - iteratory i domknięcia

  • DomkniÄ™cia - funkcje anonimowe, które przechwytujÄ… swoje Å›rodowisko
    • Przechwytywanie Å›rodowiska za pomocÄ… domknięć
    • Inferowanie i adnotowanie typu domkniÄ™cia
    • Przechwytywanie referencji lub przenoszenie wÅ‚asnoÅ›ci
    • Przenoszenie przechwyconych wartoÅ›ci z domknięć i cechy Fn
  • Przetwarzanie serii elementów za pomocÄ… iteratorów
    • Cecha Iterator i metoda next
    • Metody, które konsumujÄ… iterator
    • Metody, które wytwarzajÄ… inne iteratory
    • Używanie domknięć, które przechwytujÄ… swoje Å›rodowisko
  • Ulepszenie projektu operacji we-wy
    • Usuwanie clone przy użyciu iteratora
    • ZwiÄ™kszanie czytelnoÅ›ci kodu dziÄ™ki adapterom iteratora
    • Wybór pomiÄ™dzy pÄ™tlami i iteratorami
  • Porównanie wydajnoÅ›ci pÄ™tli i iteratorów
  • Podsumowanie

14. Narzędzie Cargo i rejestr crates.io

  • Dostosowywanie kompilacji za pomocÄ… profili wydania
  • Publikowanie skrzynki w rejestrze Crates.io
    • Tworzenie przydatnych komentarzy dokumentujÄ…cych
    • Eksportowanie wygodnego publicznego API za pomocÄ… pub use
    • ZakÅ‚adanie konta w rejestrze Crates.io
    • Dodawanie metadanych do nowej skrzynki
    • Publikowanie w rejestrze Crates.io
    • Publikowanie nowej wersji istniejÄ…cej skrzynki
    • Dezaktualizowanie wersji z Crates.io za pomocÄ… polecenia cargo yank
  • Obszary robocze Cargo
    • Tworzenie obszaru roboczego
    • Tworzenie drugiego pakietu w obszarze roboczym
  • Instalowanie plików binarnych za pomocÄ… polecenia cargo install
  • Rozszerzanie Cargo przy użyciu niestandardowych poleceÅ„
  • Podsumowanie

15. Inteligentne wskaźniki

  • Używanie Box<T> do wskazywania danych na stercie
    • Używanie Box<T> do przechowywania danych na stercie
    • Zastosowanie boksów do używania typów rekurencyjnych
  • Wykorzystanie cechy Deref do traktowania inteligentnych wskaźników jak regularnych referencji
    • Podążanie za wskaźnikiem do wartoÅ›ci
    • Używanie Box<T> jak referencji
    • Definiowanie wÅ‚asnego inteligentnego wskaźnika
    • Implementacja cechy Deref
    • DomyÅ›lne wymuszenie wyÅ‚uskania w funkcjach i metodach
    • Jak wymuszenie wyÅ‚uskania wspóÅ‚dziaÅ‚a z mutowalnoÅ›ciÄ…?
  • Wykorzystanie cechy Drop do uruchamiania okreÅ›lonego kodu przy czyszczeniu
  • Rc<T> - inteligentny wskaźnik zliczania referencji
    • Używanie Rc<T> do udostÄ™pniania danych
    • Klonowanie Rc<T> zwiÄ™ksza liczbÄ™ referencji
  • RefCell<T> i wzorzec mutowalnoÅ›ci wewnÄ™trznej
    • Egzekwowanie reguÅ‚ pożyczania w czasie wykonywania za pomocÄ… RefCell<T>
    • Mutowalność wewnÄ™trzna - mutowalne pożyczanie niemutowalnej wartoÅ›ci
    • Wykorzystanie typów Rc<T> i RefCell<T>, aby mutowalne dane mogÅ‚y mieć wielu wÅ‚aÅ›cicieli
  • Cykle referencji mogÄ… powodować wycieki pamiÄ™ci
    • Tworzenie cyklu referencji
    • Zapobieganie cyklom referencji za pomocÄ… typu Weak<T>
  • Podsumowanie

16. Nieustraszona wspóÅ‚bieżność

  • Używanie wÄ…tków do jednoczesnego uruchomienia kodu
    • Tworzenie nowego wÄ…tku za pomocÄ… funkcji spawn
    • Wykorzystanie uchwytów metody join w celu zaczekania na zakoÅ„czenie wszystkich wÄ…tków
    • Używanie domknięć move z wÄ…tkami
  • Używanie przekazywania komunikatów do przesyÅ‚ania danych miÄ™dzy wÄ…tkami
    • KanaÅ‚y i przeniesienie wÅ‚asnoÅ›ci
    • WysyÅ‚anie wielu wartoÅ›ci i obserwowanie czekajÄ…cego odbiornika
    • Tworzenie wielu producentów przez klonowanie nadajnika
  • WspóÅ‚bieżność stanu wspóÅ‚dzielonego
    • Używanie muteksów w celu umożliwienia dostÄ™pu do danych z jednego wÄ…tku na raz
    • PodobieÅ„stwa miÄ™dzy typami RefCell<T> i Rc<T> a Mutex<T> i Arc<T>
  • Rozszerzanie funkcjonalnoÅ›ci wspóÅ‚bieżnoÅ›ci za pomocÄ… cech Send i Sync
    • Umożliwienie przenoszenia wÅ‚asnoÅ›ci miÄ™dzy wÄ…tkami za pomocÄ… cechy Send
    • Umożliwianie dostÄ™pu z wielu wÄ…tków za pomocÄ… cechy Sync
    • RÄ™czne implementowanie cech Send i Sync jest niezabezpieczone
  • Podsumowanie

17. Funkcjonalności programowania obiektowego

  • Cechy jÄ™zyków obiektowych
    • Obiekty zawierajÄ… dane i zachowania
    • Hermetyzacja, która ukrywa szczegóÅ‚y implementacji
    • Dziedziczenie jako system typów i wspóÅ‚dzielenie kodu
  • Używanie obiektów cech, które umożliwiajÄ… stosowanie wartoÅ›ci różnych typów
    • Definiowanie cech typowego zachowania
    • Implementowanie cechy
    • Obiekty cech wykonujÄ… dynamicznÄ… dyspozycjÄ™
  • Implementacja obiektowego wzorca projektowego
    • Definiowanie struktury Post i tworzenie nowej instancji w stanie Draft
    • Przechowywanie tekstu treÅ›ci wpisu
    • Upewnianie siÄ™, że treść wersji roboczej wpisu jest pusta
    • Żądanie korekty zmienia stan wpisu
    • Dodanie metody approve w celu zmiany zachowania metody content
    • Kompromisy wzorca stanu
  • Podsumowanie

18. Wzorce i dopasowywanie

  • Wszystkie miejsca, w których można używać wzorców
    • Ramiona wyrażenia match
    • Wyrażenia warunkowe if let
    • PÄ™tle warunkowe while let
    • PÄ™tle for
    • Instrukcje let
    • Parametry funkcji
  • Odrzucalność - czy dopasowywanie wzorca może siÄ™ nie powieść?
  • SkÅ‚adnia wzorców
    • Dopasowywanie literaÅ‚ów
    • Dopasowywanie zmiennych nazwanych
    • Wiele wzorców
    • Dopasowywanie przedziaÅ‚ów wartoÅ›ci za pomocÄ… ..=
    • Destrukturyzacja w celu rozkÅ‚adania wartoÅ›ci na poszczególne elementy
    • Ignorowanie wartoÅ›ci we wzorcu
    • Dodatkowe wyrażenia warunkowe ze strażnikami dopasowywania
    • WiÄ…zanie za pomocÄ… operatora @
  • Podsumowanie

19. Funkcjonalności zaawansowane

  • Niezabezpieczony Rust
    • Niezabezpieczone supermoce
    • WyÅ‚uskiwanie surowego wskaźnika
    • WywoÅ‚ywanie niezabezpieczonej funkcji lub metody
    • Uzyskiwanie dostÄ™pu do mutowalnej zmiennej statycznej lub modyfikowanie jej
    • Implementowanie niezabezpieczonej cechy
    • Uzyskiwanie dostÄ™pu do pól typu unii
    • Kiedy korzystać z niezabezpieczonego kodu?
  • Cechy zaawansowane
    • Typy powiÄ…zane
    • DomyÅ›lne parametry typu sparametryzowanego i przeciążanie operatora
    • Rozróżnianie metod o tej samej nazwie
    • Korzystanie z supercech
    • Używanie wzorca newtype do implementowania cech zewnÄ™trznych
  • Typy zaawansowane
    • Używanie wzorca newtype dla zapewnienia bezpieczeÅ„stwa typów i warstwy abstrakcji
    • Tworzenie synonimów typów za pomocÄ… aliasów typów
    • Typ never, który nigdy nie zwraca wartoÅ›ci
    • Typy o dynamicznie ustalanych rozmiarach i cecha Sized
  • Zaawansowane funkcje i domkniÄ™cia
    • Wskaźniki funkcji
    • Zwracanie domknięć
  • Makra
    • Różnica miÄ™dzy makrami i funkcjami
    • Makra deklaratywne z konstrukcjÄ… macro_rules! dla metaprogramowania ogólnego
    • Makra proceduralne do generowania kodu z atrybutów
    • Jak napisać niestandardowe makro derive?
    • Makra atrybutowe
    • Makra funkcyjne
  • Podsumowanie

20. Projekt końcowy - budowa wielowątkowego serwera WWW

  • Tworzenie jednowÄ…tkowego serwera WWW
    • NasÅ‚uchiwanie poÅ‚Ä…czenia TCP
    • Odczytywanie żądania
    • Analiza żądania HTTP
    • Pisanie odpowiedzi
    • Zwracanie prawdziwego HTML-a
    • Walidacja żądania i selektywne odpowiadanie
    • Odrobina refaktoryzacji
  • PrzeksztaÅ‚cenie serwera jednowÄ…tkowego w wielowÄ…tkowy
    • Symulowanie powolnego żądania
    • ZwiÄ™kszenie przepustowoÅ›ci przy użyciu puli wÄ…tków
  • Eleganckie zamykanie i czyszczenie
    • Implementacja cechy Drop w typie ThreadPool
    • Sygnalizowanie wÄ…tkom, aby przestaÅ‚y nasÅ‚uchiwać zadaÅ„
  • Podsumowanie

A. SÅ‚owa kluczowe

  • Obecnie używane sÅ‚owa kluczowe
  • SÅ‚owa kluczowe zarezerwowane do wykorzystania w przyszÅ‚oÅ›ci
  • Surowe identyfikatory

B. Operatory i symbole

  • Operatory
  • Symbole niezwiÄ…zane z operatorami

C. Cechy pochodne (zapożyczone)

  • Cecha Debug do uzyskiwania programistycznych danych wyjÅ›ciowych
  • Cechy PartialEq i Eq do porównania równoÅ›ci
  • Cechy PartialOrd i Ord do porównywania kolejnoÅ›ci
  • Cechy Clone i Copy do duplikowania wartoÅ›ci
  • Cecha Hash do mapowania wartoÅ›ci na wartość o staÅ‚ym rozmiarze
  • Cecha Default dla wartoÅ›ci domyÅ›lnych

D. Przydatne narzędzia programistyczne

  • Automatyczne formatowanie za pomocÄ… narzÄ™dzia rustfmt
  • Naprawianie kodu za pomocÄ… narzÄ™dzia rustfix
  • Lintery narzÄ™dzia Clippy
  • Integracja z IDE przy użyciu narzÄ™dzia rust-analyzer

E. Edycje

Dodaj do koszyka Programowanie w j

Code, Publish & WebDesing by CATALIST.com.pl



(c) 2005-2024 CATALIST agencja interaktywna, znaki firmowe należą do wydawnictwa Helion S.A.