Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 26 maja 2026 18:53
  • Data zakończenia: 26 maja 2026 19:16

Egzamin zdany!

Wynik: 32/40 punktów (80,0%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Wskaź kod, który spowoduje wyświetlenie okna dialogowego przedstawionego na ilustracji. Dla uproszczenia kodu, zrezygnowano z atrybutów znaczników

Ilustracja do pytania
A. kod 4
B. kod 1
C. kod 2
D. kod 3
Odpowiedź, którą wybrałeś, to kod 2, i nie ma co do tego wątpliwości. Dobrze, że zauważyłeś wszystkie elementy, które były w oknie dialogowym. W tym kodzie masz TextBox na górze, który pozwala na wpisanie tekstu. Dwa CheckBoxy po lewej stronie to te typowe pola wyboru, które też były widoczne. Po prawej stronie masz trzy RadioButtony, które tworzą grupę przycisków - to jest właśnie to, co powinno być. Na dole widoczny jest przycisk Button z napisem Test, co też jest zgodne z obrazkiem. Takie rozmieszczenie to klucz do stworzenia dobrego interfejsu. Wiesz, w praktyce w wielu aplikacjach używa się właśnie tych elementów do prostych formularzy. Jeżeli rozumiesz, jak te komponenty działają i jak je ze sobą łączyć, to naprawdę dobrze ci to pójdzie w przyszłości w tworzeniu ładnych i funkcjonalnych interfejsów.

Pytanie 2

Co zostanie wyświetlone po wykonaniu poniższego kodu w PHP?

$x = 5;
$y = '5';
var_dump($x == $y);
var_dump($x === $y);
A. bool(true) bool(true)
B. bool(false) bool(true)
C. bool(true) bool(false)
D. bool(false) bool(false)
Odpowiedź bool(true) bool(false) jest prawidłowa, ponieważ w PHP porównania używane w tym kodzie różnią się pod względem operatorów. Pierwsze porównanie z użyciem operatora == jest porównaniem luźnym, co oznacza, że PHP dokonuje konwersji typów przed porównaniem. W tym przypadku zmienna $x o wartości 5 (typ integer) jest porównywana z $y, która ma wartość '5' (typ string). Po konwersji typów oba są interpretowane jako liczba 5, więc wynik to true. W drugim porównaniu operator === sprawdza zarówno wartość, jak i typ zmiennych. W tym przypadku $x jest integerem, a $y jest stringiem, więc ich typy się różnią. W związku z tym wynik to false. W praktyce, używanie operatora === jest zalecane, ponieważ pozwala uniknąć niespodzianek związanych z automatyczną konwersją typów, co jest często źródłem błędów w kodzie. Warto mieć to na uwadze przy pisaniu bardziej skomplikowanych skryptów, aby zapewnić, że porównania są jednoznaczne i wiarygodne.

Pytanie 3

Jaki środek ochronny najlepiej chroni przed hałasem w biurze?

A. Okna zamknięte
B. Mata antypoślizgowa
C. Panele akustyczne wygłuszające
D. Lampy biurowe o niskim poziomie natężenia światła
Wygłuszające panele akustyczne to jedno z najlepszych rozwiązań w celu ograniczenia hałasu w biurach i innych miejscach pracy. Panele te redukują odbicia dźwięku i zmniejszają natężenie hałasu, co przekłada się na poprawę koncentracji oraz zmniejszenie zmęczenia i stresu. W biurach typu open space panele akustyczne znacząco poprawiają komfort pracy, umożliwiając prowadzenie rozmów bez nadmiernego zakłócania pracy innych osób. Dodatkowo, wygłuszenie pomaga w ochronie zdrowia pracowników, redukując ryzyko utraty słuchu w miejscach, gdzie występuje wysoki poziom hałasu. Odpowiednie rozmieszczenie paneli pozwala także na lepsze zarządzanie akustyką całego pomieszczenia.

Pytanie 4

Jaką jednostkę zaleca się stosować przy projektowaniu interfejsu aplikacji?

A. pt
B. dp
C. mm
D. px
Wydaje się, że wybór jednostki do projektowania interfejsów to drobiazg, ale w praktyce ma ogromne znaczenie dla wygody użytkowników. Często spotykam się z przekonaniem, że skoro ekrany mają określoną liczbę pikseli, to właśnie px powinno być podstawową jednostką. Niestety, to myślenie prowadzi prosto do pułapki – piksele na różnych urządzeniach mają zupełnie inną wielkość fizyczną przez różne wartości gęstości ekranu (dpi). Coś, co na jednym wyświetlaczu wygląda dobrze, na innym może być kompletnie nieczytelne albo przesadnie duże. Z kolei mm, czyli milimetry, to jednostka fizyczna, ale ekrany rzadko odwzorowują tę wielkość precyzyjnie – w praktyce systemy operacyjne próbują przeliczać mm na piksele, ale często wychodzi to niedokładnie, bo nie każdy sprzęt ma idealnie skalibrowany ekran. Pt, czyli punkty typograficzne, mają trochę sensu w materiałach drukowanych czy w typografii desktopowej, ale w aplikacjach mobilnych niemal się ich nie używa, bo nie zapewniają spójności między różnymi urządzeniami. Takie podejścia – użycie px, mm albo pt – prowadzą do tego, że nasza aplikacja staje się trudna w obsłudze na różnych telefonach czy tabletach, a przecież chodzi o to, żeby wszędzie wyglądała dobrze i była wygodna w użyciu. Najlepszą praktyką branżową, polecaną przez Google i stosowaną w Material Design, jest korzystanie z dp (density-independent pixels). To najwygodniejsze i najbezpieczniejsze rozwiązanie – moim zdaniem, użycie innej jednostki jest uzasadnione chyba tylko, gdy robimy coś naprawdę nietypowego. Tak więc, warto od początku wdrażać dp jako podstawę i nie kombinować z innymi jednostkami, bo efekty są po prostu lepsze dla użytkowników.

Pytanie 5

Zaznaczone elementy w przedstawionych obramowaniach mają na celu:
Fragment kodu w WPF/XAML:

<Windows Title="Tekst"...>
Fragment kodu w Java:
public class Okno extends JFrame {
    ...
    public Okno() {
        super();
        this.setTitle("Tekst");
    }
    ...
A. przypisanie nazwy obiektu obrazującego okno aplikacji
B. ustawienie tytułu okna na "Tekst"
C. uzyskanie nazwy obiektu obrazującego okno aplikacji
D. zapisanie tytułu okna do obiektu Tekst
Wybrana odpowiedź dokładnie oddaje sens działania kodu zarówno w WPF/XAML, jak i w Javie z użyciem JFrame. W jednym i drugim przypadku chodzi o ustawienie tytułu okna aplikacji, czyli tego tekstu, który pojawia się na pasku tytułowym okienka po uruchomieniu programu. Z mojego doświadczenia, jest to jedna z pierwszych rzeczy, jakie użytkownicy widzą w każdej aplikacji okienkowej, więc warto pamiętać, jak ją ustawić. W WPF właściwość Title w tagu Window służy właśnie do wyświetlenia krótkiego opisu albo nazwy programu. Z kolei w Javie metoda setTitle pozwala dynamicznie przypisywać tekst, co jest bardzo przydatne przy pisaniu aplikacji z wieloma oknami albo zmieniającym się stanem (np. można dodać tam nazwę pliku, z którym pracujemy). Branżowe standardy zachęcają do tego, żeby tytuły okien były krótkie, jednoznaczne i faktycznie informowały użytkownika o funkcji aktualnego widoku. Co ciekawe, w niektórych frameworkach można nawet dodać ikonę do tego paska tytułowego. Samo ustawienie tytułu nie zmienia żadnych właściwości obiektu aplikacji poza tym, jak jest widoczny dla użytkownika. To mały detal, ale bardzo ważny w codziennej pracy programisty interfejsów graficznych.

Pytanie 6

Jakie zdarzenie jest wywoływane, gdy kliknięta zostaje myszą nieaktywna kontrolka lub okno?

A. keyup
B. blur
C. validating
D. focus
W momencie, kiedy klikamy na nieaktywną kontrolkę lub okno w aplikacji, wywoływane jest zdarzenie focus. To jest dość kluczowe w interakcji człowieka z interfejsem graficznym — focus decyduje, która kontrolka staje się „aktywnym” odbiorcą zdarzeń klawiatury oraz innych operacji wejścia. W praktyce, np. w aplikacjach webowych czy desktopowych, jeśli użytkownik kliknie w pole tekstowe, to właśnie focus oznacza, że to pole jest gotowe do przyjęcia tekstu. Co ciekawe, focus można też ustawiać programowo, np. za pomocą metody focus() w JavaScript, co jest często używane do poprawiania użyteczności formularzy (od razu ustawiamy kursor w pierwszym polu). Z mojego doświadczenia, dobrze jest zawsze przemyśleć, które elementy mogą i powinny otrzymywać focus, bo to wpływa na dostępność (ang. accessibility) aplikacji – osoby korzystające z klawiatury czy czytników ekranu są bardzo zależne od logiki focusowania. Branżowe standardy, szczególnie WCAG, mocno podkreślają, żeby nie blokować możliwości uzyskania focusa przez kluczowe kontrolki. Zdarzenie focus ma też kilka niuansów – na przykład nie bąbelkuje w DOM, co czasem zaskakuje początkujących. Moim zdaniem, zrozumienie roli focus w każdej aplikacji interaktywnej to taki absolutny fundament, bez którego łatwo pogubić się w późniejszych, bardziej złożonych interakcjach.

Pytanie 7

Jaki jest zasadniczy cel ataku phishingowego?

A. Kradzież haseł z pamięci operacyjnej urządzenia
B. Uniemożliwienie dostępu do usług internetowych
C. Zakłócanie pracy sieci przez nadmiarowe zapytania
D. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
Głównym celem ataku phishingowego jest przejęcie danych osobowych ofiary, co realizowane jest poprzez wykorzystanie fałszywych stron internetowych lub wiadomości. Atakujący tworzą atrakcyjne i wiarygodne kopie legalnych stron, często podszywając się pod znane instytucje bankowe, portale społecznościowe czy serwisy e-commerce. Użytkownik, nieświadomy zagrożenia, wprowadza swoje dane logowania, numery kart kredytowych lub inne wrażliwe informacje, które trafiają w ręce cyberprzestępców. Aby ułatwić ten proces, phisherzy często wykorzystują techniki inżynierii społecznej, takie jak fałszywe powiadomienia o konieczności weryfikacji konta. Przykłady skutecznych ataków phishingowych obejmują kampanie wysyłania e-maili, które informują użytkowników o rzekomych problemach z kontem, kierując ich na podszyte strony. Standardy bezpieczeństwa, takie jak DMARC, SPF i DKIM, są kluczowe dla ochrony przed tego rodzaju atakami, jednak ich brak lub niewłaściwe wdrożenie zwiększa podatność na phishing.

Pytanie 8

Jaki numer telefonu należy wybrać, aby skontaktować się z pogotowiem ratunkowym w Polsce?

A. 998
B. 112
C. 113
D. 997
Numer 112 to tzw. europejski numer alarmowy, który działa nie tylko w Polsce, ale i w całej Unii Europejskiej oraz kilku innych krajach. Z mojego doświadczenia wynika, że warto nawykowo korzystać właśnie z tego numeru, bo jest on uniwersalny i obsługiwany przez wszystkie sieci – zarówno stacjonarne, jak i komórkowe. W praktyce, dzwoniąc pod 112, łączymy się z centralą, która przekieruje nas do odpowiednich służb (pogotowie ratunkowe, policja, straż pożarna), w zależności od sytuacji. To ogromne ułatwienie, szczególnie gdy jesteśmy zestresowani albo w nieznanym miejscu. Moim zdaniem to też ważny aspekt, że osoby z zagranicy mogą łatwo uzyskać pomoc, bo 112 jest rozpoznawalny praktycznie wszędzie w Europie. Zgodnie z przepisami unijnymi, ten numer powinien być promowany jako podstawowy do wzywania pomocy w nagłych przypadkach – stąd jego obecność nawet na automatach telefonicznych czy instrukcjach bezpieczeństwa w zakładach pracy, szkołach, komunikacji miejskiej. Dodatkowo, jeśli nie wiemy, którą dokładnie służbę wezwać, operator 112 pomoże nam to ustalić i połączy z odpowiednim dyspozytorem. Osobiście uważam, że zapamiętanie tego numeru to podstawa, bo można uratować komuś życie – nawet przez przypadek, będąc świadkiem jakiegoś wypadku czy innego zdarzenia. Warto pamiętać, że 112 działa również, gdy telefon nie ma karty SIM (chociaż nie wszędzie to się sprawdza w praktyce, to z mojego rozeznania wynika, że w Polsce powinno zadziałać).

Pytanie 9

Jak najlepiej przełożyć oczekiwania klienta na dokumentację techniczną dla programistów?

A. Rozmawiając wyłącznie z zespołem programistów
B. Opracowując wizualne makiety bez dokładnych opisów
C. Tworząc szczegółowy dokument z funkcjami oraz wymaganiami technicznymi
D. Pomijając szczegółowe wymagania techniczne
Sporządzenie szczegółowego dokumentu z funkcjami i wymaganiami technicznymi to najlepszy sposób na przełożenie wymagań klienta na specyfikację techniczną. Dokumentacja techniczna jest podstawą do stworzenia aplikacji zgodnej z oczekiwaniami klienta i pozwala na precyzyjne określenie zakresu prac. Zawiera ona opisy funkcjonalności, diagramy architektury, wymagania dotyczące wydajności oraz harmonogram wdrożenia, co minimalizuje ryzyko błędów i nieporozumień podczas realizacji projektu.

Pytanie 10

Jaką rolę odgrywa pamięć operacyjna (RAM) w komputerowym systemie?

A. Zarządzanie transferem danych pomiędzy urządzeniami wejścia/wyjścia
B. Trwałe przechowywanie systemu operacyjnego
C. Umożliwienie tworzenia kopii zapasowej danych użytkownika
D. Tymczasowe magazynowanie danych i instrukcji dla procesora
Pamięć operacyjna, znana jako RAM (Random Access Memory), odgrywa kluczową rolę w funkcjonowaniu systemu komputerowego. Jej głównym zadaniem jest tymczasowe przechowywanie danych i instrukcji, które są niezbędne dla procesora w trakcie wykonywania programów. Kiedy uruchamiamy aplikację, jej kod oraz dane są ładowane z pamięci masowej (np. dysku twardego) do pamięci RAM, co umożliwia szybki dostęp do nich przez procesor. Dzięki dużej prędkości działania pamięć operacyjna znacząco przyspiesza procesy obliczeniowe, ponieważ operacje na danych przechowywanych w RAM są wielokrotnie szybsze niż na danych znajdujących się na dysku twardym. Współczesne komputery często wyposażone są w kilka gigabajtów pamięci RAM, co pozwala na efektywne zarządzanie wieloma uruchomionymi aplikacjami jednocześnie. Standardy takie jak DDR4 i DDR5 określają nie tylko wydajność, ale również szybkość przesyłania danych, co ma kluczowe znaczenie w kontekście wydajności systemu komputerowego. W efekcie, pamięć operacyjna jest niezbędna do płynnego działania systemu operacyjnego oraz aplikacji, a jej pojemność i szybkość mają bezpośredni wpływ na ogólną wydajność komputera.

Pytanie 11

W jakiej sytuacji należy umieścić poszkodowanego w bezpiecznej pozycji bocznej?

A. gdy osoba omdleje, ale oddycha
B. w przypadku urazu pleców, gdy osoba jest przytomna
C. gdy wystąpi uszkodzenie kręgosłupa
D. w sytuacji omdlenia i braku tętna
Umieszczenie poszkodowanego w pozycji bocznej bezpiecznej jest jedną z podstawowych czynności, których uczą ratownicy zarówno na kursach pierwszej pomocy, jak i w szkołach. Ta pozycja ma na celu przede wszystkim zabezpieczenie dróg oddechowych osoby, która jest nieprzytomna, ale wciąż oddycha samodzielnie. Chodzi o to, że w takiej sytuacji język i ewentualne płyny nie zablokują tchawicy – pozycja boczna zapobiega zadławieniu czy zakrztuszeniu. Moim zdaniem to jedna z najbardziej praktycznych procedur, bo życie pokazuje, że właśnie omdlenia oraz krótkotrwałe utraty przytomności bez zatrzymania oddechu są dość częste, czy to na ulicy, czy w pracy. Przepisy i dobre praktyki (np. wytyczne Europejskiej Rady Resuscytacji) jasno wskazują, że jeśli osoba nie reaguje, ale oddycha, to nie zostawiamy jej na plecach – groziłoby to zapadnięciem języka albo zachłyśnięciem wymiocinami. W praktyce najpierw oczywiście sprawdzasz oddech, potem delikatnie układasz człowieka na boku, zginając odpowiednio kończyny, żeby się nie przewrócił. Sam widziałem, jak taka szybka reakcja potrafi uratować komuś zdrowie albo i życie. Warto też pamiętać, że taka pozycja daje Ci czas na wezwanie pomocy i monitorowanie stanu poszkodowanego do przyjazdu ratowników.

Pytanie 12

Jakie jest podstawowe środowisko do tworzenia aplikacji desktopowych przy użyciu języka C#?

A. Eclipse
B. NetBeans
C. PyCharm
D. MS Visual Studio
MS Visual Studio to potężne zintegrowane środowisko programistyczne (IDE) zaprojektowane przez firmę Microsoft, które oferuje pełne wsparcie dla języka C#. Dzięki bogatym funkcjom, takim jak IntelliSense, które ułatwia pisanie kodu poprzez podpowiadanie składni oraz dostępność narzędzi do debugowania, programiści mogą efektywnie rozwijać aplikacje desktopowe. MS Visual Studio obsługuje różne frameworki, takie jak .NET Framework oraz .NET Core, co pozwala na budowanie aplikacji o różnej architekturze. W praktyce, programiści mogą tworzyć aplikacje w oparciu o Windows Presentation Foundation (WPF) lub Windows Forms, co umożliwia tworzenie rozbudowanych interfejsów użytkownika. Dodatkowo, MS Visual Studio oferuje szereg narzędzi do współpracy zespołowej, integracji z systemami kontroli wersji oraz wsparcie dla testowania jednostkowego. Jako standard w branży, MS Visual Studio jest często preferowanym wyborem w projektach komercyjnych i korporacyjnych, z uwagi na jego wszechstronność oraz wsparcie ze strony społeczności programistycznej.

Pytanie 13

Definicja konstruktora dla zaprezentowanej klasy w języku C++ może być sformułowana jak poniżej:

class Owoc
{
    public:
        double waga;
        string nazwa;
        Owoc(double waga, string nazwa);
};

Deklaracja 1:
Owoc::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 2:
Construct::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 3:
Construct::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}

Deklaracja 4:
Owoc::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}
A. Deklaracji 2
B. Deklaracji 3
C. Deklaracji 4
D. Deklaracji 1
Wiele osób, szczególnie na początku nauki, myli się tu przez znajomość składni z innych języków lub nie do końca rozumie, jak działa zakres nazw w C++. Najczęstszy błąd w przedstawionych błędnych deklaracjach polega na używaniu nieprawidłowej nazwy klasy w kwalifikatorze zasięgu, czyli przed '::'. W C++ implementując konstruktor poza ciałem klasy, musimy napisać Owoc::Owoc(...), a nie, na przykład, Construct::Owoc(...). To bardzo podstawowa, ale kluczowa kwestia, która wynika z zasad języka. Często osoby przesiadające się z innych języków, np. z Javy czy C#, próbują też używać notacji this.waga (z kropką), co niestety w C++ jest nieprawidłowe – tutaj operator dostępu do składowych przez wskaźnik to '->', bo this jest wskaźnikiem do obiektu. Takie subtelności bywają podchwytliwe i sam pamiętam, jak łatwo się na tym przejechać, zwłaszcza jak się przeskakuje pomiędzy językami. Jeszcze inny typowy błąd to mylenie konstruktora z zupełnie innymi funkcjami albo próba zadeklarowania konstruktora w przestrzeni nazw, która nie odpowiada klasie – przez co kompilator nie rozpoznaje takiej funkcji jako konstruktora i pojawiają się często niejasne błędy kompilacji. Warto mocno zapamiętać, że w C++ musimy bardzo pilnować zarówno nazewnictwa, jak i składni operatorów, bo automatycznych podpowiedzi na etapie pisania kodu czasem brakuje. Dobrą praktyką jest też sprawdzanie, czy używamy poprawnych typów dostępu do pól (-> zamiast .). Wreszcie, nie można używać innych nazw klas niż tej, której konstruktor rzeczywiście definiujemy. Każde odstępstwo od tej reguły prowadzi do sporych problemów i nieporozumień w kodzie. Z mojego doświadczenia wynika, że te drobiazgi, które wydają się mało istotne, potem najbardziej komplikują pracę i utrzymanie projektu. Warto więc od razu przyzwyczajać się do poprawnej składni i nie kombinować z rozwiązaniami "z innych światów" – C++ rządzi się swoimi prawami i trzymając się ich, można zyskać sporo pewności przy pisaniu kodu.

Pytanie 14

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora GUI przekształcającego kod do języka XAML
B. generatora kodu java
C. kompilatora dla interfejsu graficznego
D. debuggera analizującego wykonujący kod
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 15

Który z wymienionych poniżej przykładów ilustruje prawidłowy szkielet zarządzania wyjątkami w języku C++?

A. try { kod } handle { obsługa }
B. try { kod } catch { obsługa }
C. try { kod } finally { obsługa }
D. try { kod } except { obsługa }
Jak to wygląda w C++? Kluczowym elementem jest szkielet z blokami 'try' i 'catch'. W bloku 'try' piszesz kod, który może spowodować błąd, a 'catch' zajmuje się sytuacjami, kiedy coś pójdzie nie tak. Dzięki temu nie musisz się martwić, że program nagle przestanie działać, bo masz kontrolę nad tym, jak reagować w trudnych momentach. Obsługa wyjątków to naprawdę ważna sprawa w programowaniu, bo pomaga wyłapać różne problemy, czy to z danymi, z pamięcią, czy z plikami. Z mojego doświadczenia, to po prostu sprawia, że aplikacje są bardziej stabilne i działa to na korzyść zarówno programisty, jak i użytkownika.

Pytanie 16

Które z wymienionych praw autorskich nie wygasa po pewnym czasie?

A. Autorskie prawa majątkowe
B. Licencje wolnego oprogramowania
C. Autorskie prawa osobiste
D. Prawa pokrewne
Autorskie prawa osobiste to rodzaj praw autorskich, które nie wygasają po upływie określonego czasu i są bezterminowe. Obejmują one prawo do autorstwa, oznaczania dzieła swoim nazwiskiem oraz sprzeciwiania się wszelkim zmianom, które mogłyby naruszać reputację twórcy. Prawa osobiste są niezbywalne, co oznacza, że nie można ich przenieść na inną osobę ani sprzedać. Nawet po śmierci twórcy, prawo do ochrony integralności jego dzieła jest respektowane. W praktyce oznacza to, że choć prawa majątkowe mogą wygasnąć (np. po 70 latach od śmierci autora), prawo do bycia uznanym za twórcę trwa wiecznie.

Pytanie 17

Który z wymienionych frameworków służy do budowy aplikacji webowych w C#?

A. Django
B. ASP.NET Core
C. Angular
D. React.js
ASP.NET Core to nowoczesny, wydajny i skalowalny framework opracowany przez Microsoft, który jest przeznaczony do budowy aplikacji webowych w języku C#. ASP.NET Core umożliwia tworzenie dynamicznych stron internetowych, API oraz aplikacji mikroserwisowych. Jego modularność i wsparcie dla kontenerów (Docker) oraz chmury sprawiają, że jest to jeden z najczęściej wybieranych frameworków w środowiskach enterprise. ASP.NET Core obsługuje zarówno aplikacje serwerowe, jak i aplikacje klient-serwer, a dzięki technologii Razor Pages i Blazor pozwala na budowanie aplikacji, w których logika biznesowa jest ściśle zintegrowana z warstwą prezentacji. Dodatkowo ASP.NET Core oferuje wbudowane mechanizmy do zarządzania tożsamością użytkowników, autoryzacji i autentykacji, co czyni go doskonałym wyborem do tworzenia aplikacji biznesowych oraz korporacyjnych.

Pytanie 18

Jakie jest przeznaczenie komentarzy w kodzie źródłowym programu?

A. Do dokumentowania działania kodu i ułatwienia jego zrozumienia
B. Do optymalizacji wydajności kodu
C. Do uruchamiania kodu w trybie debugowania
D. Do definiowania zmiennych globalnych
Komentarze w kodzie źródłowym programu pełnią kluczową rolę w dokumentowaniu działania aplikacji. Dzięki nim programiści mogą opisywać, co robią poszczególne fragmenty kodu, jakie funkcje realizują oraz jakie są zależności między modułami. Komentarze nie wpływają na działanie programu, ale znacząco ułatwiają pracę nad nim w przyszłości, zwłaszcza gdy projekt jest rozwijany przez wielu programistów lub po dłuższej przerwie. Komentarze poprawiają czytelność kodu, minimalizując ryzyko błędów wynikających z niejasności lub złej interpretacji działania aplikacji. W dobrze napisanym kodzie komentarze są używane strategicznie – opisują kluczowe algorytmy, niestandardowe rozwiązania oraz obszary wymagające szczególnej uwagi. Przejrzysty i dobrze udokumentowany kod to fundament skalowalnych i łatwych w utrzymaniu aplikacji.

Pytanie 19

Które z wymienionych działań, które są częścią procesu kreowania prostej galerii zdjęć w formie aplikacji mobilnej, powinno być realizowane przez zespół?

A. Stworzenie dokumentacji kodu aplikacji
B. Przygotowanie i konfiguracja repozytorium dla projektu
C. Wdrożenie funkcji dodajZdjecie()
D. Przygotowanie testu jednostkowego dla funkcji przegladajZdjecia()
Pozostałe odpowiedzi są zadaniami, które w większości przypadków mogą być realizowane indywidualnie, co czyni je zadaniami jednostkowymi. Implementacja funkcji dodajZdjecie() dotyczy konkretnego aspektu programistycznego, który może być wykonany przez jednego dewelopera. Wymaga ona znajomości języka programowania oraz logiki potrzebnej do dodawania zdjęć do galerii, co zazwyczaj nie wymaga współpracy z innymi członkami zespołu. Przygotowanie i skonfigurowanie repozytorium dla projektu natomiast to techniczny proces, który również najczęściej realizuje jedna osoba, odpowiedzialna za ustawienie środowiska pracy. Tworzenie testu jednostkowego dla funkcji przegladajZdjecia() to kolejny krok, który można wykonać samodzielnie, koncentrując się na testowaniu konkretnej funkcji w izolacji, bez potrzeby angażowania innych programistów. W przypadku tych zadań, choć mogą one być częścią większego projektu, to ich realizacja nie wymaga współpracy zespołowej, co sprawia, że nie są to zadania zespołowe.

Pytanie 20

Przedstawiono funkcjonalnie równoważne fragmenty kodu aplikacji Angular oraz React.js.

Angular
submit(f) {
    console.log(f.value); 
}
<form #f="ngForm" (ngSubmit)="submit(f)">
    <input ngModel name="tytul" type="text" id="tytul">
    <button>Dodaj</button>
</form>
React
handleSubmit = e => {
    e.preventDefault();
    console.log('tytul: ' + e.currentTarget.tytul.value);
};
render() {
    return (
        <div>
            <form onSubmit={this.handleSubmit}>
                <input type="text" id="tytul" />
                <button>Dodaj</button>
            </form>
        </div>
    );
}
A. obsługę zdarzenia przesłania formularza
B. wyświetlanie w konsoli przeglądarki danych pobranych z pól formularza w czasie rzeczywistym, gdy użytkownik je wypełnia
C. funkcję, która wypełnia dane w formularzu podczas jego inicjalizacji
D. funkcję, która zapisuje do zmiennych f lub e dane z pola <input> formularza
Oba fragmenty kodu, zarówno w Angularze jak i React.js, pokazują obsługę zdarzenia zatwierdzenia formularza. W Angularze zdarzenie submit jest obsługiwane poprzez przypisanie funkcji submit do atrybutu ngSubmit. Ta funkcja otrzymuje jako argument obiekt formularza, a następnie wypisuje jego wartość w konsoli za pomocą f.value. Jest to zgodne z dobrymi praktykami Angulara, gdzie korzysta się z dwukierunkowego wiązania danych i obiektu formularza do zarządzania danymi wejściowymi. W przypadku React.js funkcja handleSubmit jest przypisywana do zdarzenia onSubmit formularza. W tej funkcji nie tylko logujemy dane wejściowe, ale również używamy e.preventDefault(), aby zapobiec domyślnemu działaniu formularza, co jest standardową praktyką w React.js, gdzie zarządzamy stanem komponentów samodzielnie. W obu przypadkach kluczową czynnością jest reakcja na zdarzenie wysłania formularza, co pozwala na dalsze przetwarzanie danych wejściowych, walidację lub wysyłanie ich do serwera.

Pytanie 21

Która z metodologii w zarządzaniu projektami umożliwia łatwe dostosowywanie się do zmieniających się potrzeb klienta?

A. Model Waterfall
B. Kanban
C. Scrum
D. Model spiralny
Waterfall to model sekwencyjny, który nie zakłada elastyczności – raz określone wymagania muszą być zrealizowane zgodnie z pierwotnym planem, co utrudnia adaptację do zmian. Kanban umożliwia optymalizację przepływu pracy, ale nie kładzie tak dużego nacisku na iteracyjne dostarczanie funkcjonalności jak Scrum. Model spiralny łączy prototypowanie i iteracje, ale jego struktura nie jest tak elastyczna jak w przypadku Scruma, gdzie zmiany mogą być wprowadzane niemal na każdym etapie sprintu.

Pytanie 22

Co oznacza walidacja kodu programu?

A. Czynnością polegającą na kompilowaniu kodu
B. Czynnością weryfikującą poprawność i zgodność kodu z założeniami
C. Czynnością dotyczącą publikacji aplikacji w sklepie
D. Czynnością związaną z tworzeniem dokumentacji kodu
Walidacja kodu programu to proces sprawdzania jego poprawności i zgodności z założeniami projektowymi oraz standardami programistycznymi. Celem walidacji jest wykrycie błędów logicznych, składniowych i zgodności kodu z wymaganiami aplikacji. Walidacja może obejmować analizę statyczną kodu (bez jego wykonywania) oraz testy jednostkowe i integracyjne, które sprawdzają funkcjonalność aplikacji. Dzięki walidacji programiści mogą uniknąć błędów na późniejszych etapach rozwoju projektu, co znacząco zwiększa niezawodność i stabilność aplikacji. Proces ten jest nieodzowny w metodykach Agile i Continuous Integration, gdzie regularne testowanie kodu stanowi podstawę dostarczania wysokiej jakości oprogramowania.

Pytanie 23

Który z wymienionych typów danych należy do typu logicznego?

A. char
B. float
C. bool
D. int
Typ danych 'bool' (boolean) jest typem logicznym, który przechowuje jedną z dwóch wartości: 'true' lub 'false'. Typy logiczne są nieodłącznym elementem programowania, ponieważ umożliwiają implementację warunków i pętli sterujących przepływem programu. Typ 'bool' znajduje zastosowanie w praktycznie każdym języku programowania, w tym C++, Java, Python i C#. Operacje logiczne, takie jak 'AND', 'OR' i 'NOT', opierają się na wartościach typu 'bool', co czyni je podstawą dla algorytmów decyzyjnych i strukturalnych. Zastosowanie typów logicznych zwiększa czytelność kodu i pozwala na efektywne zarządzanie warunkami logicznymi.

Pytanie 24

W programie desktopowym stworzono rozwijaną listę oraz przypisano cztery funkcje do obsługi zdarzeń tej kontrolki. Jaki komunikat pojawi się po dokonaniu wyboru w tej liście?
W XAML (uproszczona wersja):

<ComboBox SelectionChanged="Funkcja1" DragEnter="Funkcja2"
    LostFocus="Funkcja3" KeyDown="Funkcja4">
</ComboBox>
W kodzie:
private void Funkcja1(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show("Zdarzenie 1");
}
private void Funkcja2(object sender, DragEventArgs e)
{
    MessageBox.Show("Zdarzenie 2");
}
private void Funkcja3(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Zdarzenie 3");
}
private void Funkcja4(object sender, KeyEventArgs e)
{
    MessageBox.Show("Zdarzenie 4");
}
A. Zdarzenie 1
B. Zdarzenie 4
C. Zdarzenie 3
D. Zdarzenie 2
W zadaniu chodziło o to, jakie zdarzenie zostanie wywołane po dokonaniu wyboru w rozwijanej liście ComboBox. Wielu osobom może się wydawać, że zmiana wyboru w kontrolce może powodować aktywację różnych zdarzeń, takich jak LostFocus czy KeyDown, zwłaszcza jeśli wcześniej mieli styczność z WinForms lub innymi frameworkami UI. Zdarzenie LostFocus jednak zostaje wywołane tylko wtedy, gdy kontrolka traci fokus, czyli gdy użytkownik przestaje ją aktywnie obsługiwać, na przykład klikając gdzie indziej – nie podczas zwykłego wyboru elementu. KeyDown natomiast obsługuje sytuacje, w których użytkownik naciska klawisz na klawiaturze, więc ma to sens tylko, gdy wybór w ComboBox jest dokonywany za pomocą klawiatury, ale nawet wtedy domyślnie KeyDown nie informuje o zmianie wybranego elementu, tylko o naciśnięciu klawisza. DragEnter jest całkiem osobną kategorią – to zdarzenie wywołuje się tylko wtedy, gdy przeciągamy jakiś element nad ComboBoxem, co w praktyce nie ma nic wspólnego z normalnym wyborem z listy. Często spotykam się z przekonaniem, że Focus i jego utrata mają coś wspólnego z wyborem wartości, ale według dokumentacji Microsoftu oraz praktyki programistycznej to dwie różne sprawy. SelectionChanged to standardowy, branżowy sposób wykrywania zmiany wyboru w kontrolkach typu ComboBox – niezależnie od tego czy użytkownik używa myszki, klawiatury czy nawet ekranów dotykowych. Właśnie dlatego ta odpowiedź jest właściwa. Moim zdaniem nieporozumienia biorą się często z niejasnego rozumienia różnicy między różnymi zdarzeniami UI. W środowiskach takich jak WPF lub UWP bardzo się to rozdziela i dokumentacja zawsze to podkreśla. Dobrą praktyką jest przypisywanie każdej funkcji tylko do tych zdarzeń, które rzeczywiście dotyczą konkretnej akcji użytkownika – to pozwala uniknąć nieprzyjemnych bugów i nieoczekiwanych komunikatów w aplikacji.

Pytanie 25

Metodyka zwinna (ang. agile) opiera się na

A. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
B. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
C. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
D. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
Podejście kaskadowe (waterfall) zakłada podział projektu na kolejne etapy (projekt, programowanie, testy), ale nie dopuszcza powrotu do wcześniejszych faz, co czyni je mniej elastycznym niż agile. Projektowanie całej aplikacji na początku jest charakterystyczne dla tradycyjnych metodyk, takich jak V-model, ale nie odzwierciedla idei iteracyjnego rozwoju stosowanego w agile. Implementowanie testów po zakończeniu całości projektu ogranicza możliwość szybkiego reagowania na błędy i jest sprzeczne z filozofią agile, gdzie testy są integralną częścią każdego etapu iteracji.

Pytanie 26

Który z poniższych przykładów stanowi aplikację mobilną wykorzystującą bazę danych?

A. Aplikacja do robienia zdjęć
B. Aplikacja wyświetlająca lokalny czas
C. Aplikacja kalkulator
D. Aplikacja gromadząca listę kontaktów użytkownika
Aplikacja przechowująca listę kontaktów użytkownika korzysta z bazy danych do przechowywania, odczytywania i zarządzania danymi. Tego typu aplikacje mobilne muszą efektywnie zarządzać dużą ilością danych i zapewniać ich szybki dostęp. Bazy danych, takie jak SQLite czy Firebase, są szeroko stosowane w aplikacjach mobilnych, umożliwiając przechowywanie kontaktów, wiadomości, notatek i innych informacji użytkownika. Dzięki bazom danych możliwe jest także synchronizowanie danych pomiędzy urządzeniami i przechowywanie ich w chmurze.

Pytanie 27

W języku C++, zakładając, że przedstawiony fragment kodu poprawnie się skompiluje i zostanie wykonany, to zmiennej liczba przypisana zostanie wartość:

int liczba = rand() % 1000;
A. równa 1000
B. pseudolosowa nie większa niż 999
C. rzeczywista podzielna przez 1000
D. dowolna pseudolosowa z przedziału typu int
Linia kodu int liczba = rand() % 1000; w języku C++ używa funkcji rand() do generowania liczby pseudolosowej. Funkcja ta zwraca liczbę całkowitą z zakresu od 0 do RAND_MAX zdefiniowanego w standardowej bibliotece C++. Obliczenie rand() % 1000 wykonuje operację modulo na wygenerowanej liczbie, co oznacza, że wynik zawsze będzie liczbą z zakresu od 0 do 999. Jest to powszechna technika używana do ograniczenia zakresu wartości zwracanych przez funkcję rand() do konkretnego przedziału. Takie podejście jest często wykorzystywane do generowania pseudolosowych wartości całkowitych w określonym zakresie, co jest przydatne w wielu zastosowaniach, od prostych programów testowych po bardziej złożone aplikacje symulacyjne. Należy pamiętać, że funkcja rand() generuje liczby pseudolosowe, co oznacza, że sekwencja liczb będzie się powtarzać przy każdym uruchomieniu programu, chyba że zostanie zainicjowana za pomocą funkcji srand() z unikalnym ziarnem. Jest to zgodne z dobrymi praktykami, aby zapewnić różnorodność w generowanych liczbach pseudolosowych, zwłaszcza w kontekście testowania i symulacji komputerowych.

Pytanie 28

W jakiej fazie cyklu życia projektu informatycznego następuje integracja oraz testowanie wszystkich modułów systemu?

A. Faza wdrożenia
B. Etap planowania
C. Etap implementacji
D. Faza analizy
Faza implementacji to etap cyklu życia projektu informatycznego, w którym następuje integracja i testowanie wszystkich modułów systemu. Po zakończeniu fazy projektowania i programowania, elementy aplikacji są łączone w jeden spójny system. Integracja polega na połączeniu komponentów, co umożliwia sprawdzenie ich współpracy oraz poprawności przepływu danych. Następnie przeprowadzane są testy integracyjne i systemowe, których celem jest wykrycie błędów w interakcji między modułami. Proces ten jest niezbędny, aby zapewnić stabilność aplikacji przed wdrożeniem do środowiska produkcyjnego. Skuteczna integracja minimalizuje ryzyko awarii i zwiększa niezawodność systemu.

Pytanie 29

W zaprezentowanym kodzie stworzono abstrakcyjną klasę Figura oraz klasę Prostokąt, która po niej dziedziczy, zawierającą określone pola i konstruktory. Wskaż najprostszą implementację sekcji /* metody klasy */ dla klasy Prostokąt

Ilustracja do pytania
A. Kod 3
B. Kod 4
C. Kod 1
D. Kod 2
Kod 1 jest prawidłowy ponieważ zapewnia implementację abstrakcyjnych metod Pole i Obwod z klasy Figura co jest wymagane dla każdej klasy dziedziczącej po klasie abstrakcyjnej W Javie kiedy klasa dziedziczy po klasie abstrakcyjnej musi zaimplementować wszystkie jej abstrakcyjne metody Kod 1 definiuje metodę Pole która oblicza pole prostokąta jako iloczyn długości boków a i b oraz metodę Obwod która oblicza obwód jako sumę dwóch razy długości a i dwóch razy długości b Jest to zgodne z konwencjami programowania obiektowego które promują enkapsulację i polimorfizm Kod odnosi się bezpośrednio do konkretnego zastosowania jakim jest obliczanie parametrów prostokąta co jest częstym przypadkiem w programowaniu graficznym oraz w aplikacjach matematycznych Implementacja metod w ten sposób zapewnia prostotę oraz czytelność kodu co jest zgodne z dobrymi praktykami w inżynierii oprogramowania Ponadto dzięki poprawnej implementacji można z powodzeniem rozszerzać funkcjonalność obiektową programu umożliwiając jego łatwiejsze modyfikowanie i rozwijanie w przyszłości

Pytanie 30

Który język programowania jest używany do stylizacji stron internetowych?

A. CSS
B. PHP
C. JavaScript
D. HTML
CSS, czyli Cascading Style Sheets, jest językiem stylizacji, który służy do opisywania wyglądu dokumentów napisanych w HTML i XML. Umożliwia on oddzielenie treści od prezentacji, co jest kluczowe w tworzeniu nowoczesnych, responsywnych i estetycznie atrakcyjnych stron internetowych. Dzięki CSS można definiować różne aspekty stylów, takie jak kolory, czcionki, marginesy, a także układ elementów na stronie. Przykładowo, za pomocą prostych reguł CSS można zmienić kolor tła na zielony, a tekst na biały, co można osiągnąć przy pomocy następującego kodu: `body { background-color: green; color: white; }`. Współczesne standardy CSS, jak CSS3, wprowadzają także zaawansowane techniki, takie jak animacje czy przejścia, co daje jeszcze większe możliwości w stylizacji stron. Ponadto, dobre praktyki obejmują użycie arkuszy stylów w zewnętrznych plikach, co pozwala na ich ponowne wykorzystanie i lepszą organizację kodu, a także ułatwia zarządzanie stylem w dużych projektach.

Pytanie 31

W klasie o nazwie samochod przypisano atrybuty: marka, rocznik, parametry[]. Atrybuty te powinny zostać zdefiniowane jako

A. pola
B. funkcje
C. interfejsy
D. metody
Pola w klasie samochod to właśnie te elementy, które przechowują dane, takie jak marka, rocznik czy tablica parametry. To jest absolutna podstawa programowania obiektowego – najczęściej spotyka się to w językach takich jak Java, C# albo nawet w Pythonie, choć tam często nazywamy je po prostu atrybutami. Dla przykładu, jeśli tworzysz klasę Samochod w C#, to pole 'marka' będzie np. typu string, 'rocznik' – int, a 'parametry' możesz zadeklarować jako tablicę albo listę (List<T>) zależnie od potrzeb. Przechowywanie danych w polach pozwala na lepszą organizację, bo każda instancja klasy ma swoje własne wartości tych pól. Tak się właśnie tworzy modele danych, na których potem operuje cała aplikacja – czy to baza samochodów w warsztacie, czy system ubezpieczeń komunikacyjnych. Takie podejście jest zgodne z zasadami hermetyzacji i solidnych, nowoczesnych standardów pisania kodu. Dużo profesjonalnych frameworków i narzędzi (np. Entity Framework, Hibernate) korzysta z takiego podejścia, nawet jeśli potem te pola opakowujesz w właściwości (properties). Krótko mówiąc, pola to nieodłączny element każdej klasy, która coś reprezentuje, i moim zdaniem nie da się dobrze projektować kodu obiektowego bez zrozumienia tej konwencji.

Pytanie 32

W jednostce centralnej, za obliczenia na liczbach zmiennoprzecinkowych odpowiada

A. ALU
B. AU
C. IU
D. FPU
Funkcjonuje takie przekonanie, że wszystkie jednostki w procesorze ogarniają po trochu te same rzeczy, ale to nie do końca tak działa. ALU, czyli Arithmetic Logic Unit, rzeczywiście odpowiada za większość podstawowych operacji arytmetycznych oraz logicznych – dodawanie, odejmowanie, AND, OR czy XOR, ale jest zoptymalizowana do operacji na liczbach całkowitych. Kiedy jednak w grę wchodzą liczby zmiennoprzecinkowe, ALU sobie zwyczajnie nie radzi – nie została do tego zaprojektowana. Warto też wspomnieć o IU, czyli Integer Unit, która – jak sugeruje sama nazwa – jest odpowiedzialna za przetwarzanie liczb całkowitych. Spotkałem się z sytuacjami, gdzie niektórzy mylą IU z FPU, bo niby też coś liczy, ale jeśli chodzi o typy float czy double, to IU nic nie wskóra. AU natomiast, tak szczerze, nie jest powszechnie stosowanym terminem w kontekście architektury procesora. Może się czasem pojawić jako ogólne określenie Arithmetic Unit, ale to raczej archaiczne albo bardzo szerokie pojęcie, nie wskazujące konkretnie, które operacje są obsługiwane. Spotkałem się z tym głównie w starych podręcznikach lub bardzo ogólnych opisach sprzętu, ale dzisiaj nikt poważny nie mówi o AU w kontekście obliczeń zmiennoprzecinkowych. Typowym błędem myślowym jest założenie, że skoro coś jest „arytmetyczne”, to obsłuży dowolny typ liczby. W praktyce inżynierowie projektujący architekturę procesorów zawsze wyraźnie rozdzielają jednostki dla liczb całkowitych od tych dla zmiennoprzecinkowych, bo to zupełnie inne algorytmy i logika działania. Standardy takie jak IEEE 754 dotyczą właśnie FPU i precyzji operacji na floatach, a nie ALU czy IU. W praktycznym zastosowaniu, np. w oprogramowaniu do grafiki, multimediach czy symulacjach naukowych, to właśnie obecność FPU decyduje o wydajności i poprawności obliczeń. Dlatego akurat w tej dziedzinie nie ma miejsca na dowolność – każda jednostka procesora ma swoje konkretne zadanie i nie warto ich ze sobą mieszać.

Pytanie 33

Który z wymienionych elementów może stanowić część menu w aplikacji desktopowej?

A. MenuItem
B. Canvas
C. ScrollBar
D. CheckBox
MenuItem to podstawowy komponent, który stanowi część systemu menu w aplikacjach desktopowych. Jest to element, który pojawia się w rozwijanym menu i pozwala na wykonywanie określonych akcji, takich jak otwieranie plików, zapisywanie danych czy wywoływanie funkcji aplikacji. MenuItem jest szeroko stosowany w aplikacjach Windows w połączeniu z WPF i WinForms. Tworzenie strukturalnego menu, które ułatwia nawigację po aplikacji, jest kluczowe dla zapewnienia dobrej użyteczności i intuicyjności oprogramowania.

Pytanie 34

Jakie metody umożliwiają przesyłanie danych z serwera do aplikacji front-end?

A. protokołem SSH
B. biblioteki jQuery
C. metody POST
D. formatu JSON
JSON, czyli JavaScript Object Notation, to dość lekki format wymiany danych. Jest prosty do zrozumienia zarówno dla ludzi, jak i komputerów. To dlatego jest tak popularny w aplikacjach webowych, gdzie przesyła się dane między serwerem a klientem. Dzięki strukturze klucz-wartość łatwo jest mapować obiekty w JavaScript, co przyspiesza cały proces z danymi. Pomysł na zastosowanie? Na przykład, gdy przesyłasz dane użytkownika z serwera do swojej aplikacji, to często zamieniasz obiekt JavaScript na format JSON i wysyłasz go przez AJAX. A co ważne, JSON jest zgodny z różnymi standardami, więc możesz go używać praktycznie wszędzie. Co ciekawe, w nowoczesnych aplikacjach JSON jest zdecydowanie bardziej popularny niż XML, bo jest prostszy i mniej obciążający dla sieci. To wszystko sprawia, że strony ładują się szybciej, a użytkownicy mają lepsze doświadczenia.

Pytanie 35

Co to jest XSS (Cross-Site Scripting)?

A. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
B. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
C. Framework do tworzenia responsywnych stron internetowych
D. Protokół komunikacyjny używany w aplikacjach internetowych
Cross-Site Scripting (XSS) to luka bezpieczeństwa, która umożliwia atakującym wstrzykiwanie złośliwego kodu JavaScript do stron internetowych, które są następnie przeglądane przez innych użytkowników. W wyniku tego ataku, złośliwy kod może być wykonany w kontekście przeglądarki ofiary, co może prowadzić do kradzieży sesji, danych osobowych, czy też przejęcia kontroli nad kontem użytkownika. Aby zapobiegać XSS, programiści powinni stosować techniki takie jak walidacja i oczyszczanie danych wejściowych, a także korzystanie z nagłówków HTTP, takich jak Content Security Policy (CSP). Przykładem może być sytuacja, gdy aplikacja webowa przyjmuje dane w formularzach bez odpowiedniego sprawdzenia, co pozwala na umieszczenie skryptu, który zyskuje dostęp do cookies użytkownika. Zrozumienie i zabezpieczenie się przed XSS jest kluczowe w kontekście budowania bezpiecznych aplikacji webowych, co jest zgodne z najlepszymi praktykami branżowymi.

Pytanie 36

Które narzędzie służy do automatyzacji procesu budowania aplikacji?

A. Postman
B. Jenkins
C. Figma
D. Swagger
Postman jest narzędziem skoncentrowanym na testowaniu API, które pozwala na wysyłanie żądań do serwerów i analizowanie odpowiedzi. Chociaż Postman jest niezwykle użyteczny w procesie tworzenia i testowania interfejsów API, nie ma funkcji automatyzacji budowy aplikacji. W praktyce, użycie Postmana do tego celu może prowadzić do nieporozumień dotyczących jego rzeczywistego zastosowania, co może skutkować niewłaściwym podejściem do automatyzacji i niewykorzystaniem pełnego potencjału narzędzi CI/CD. Figma jest narzędziem do projektowania interfejsów użytkownika, które pozwala na tworzenie prototypów oraz współpracę zespołową nad projektami graficznymi. Pomimo że Figma jest nieoceniona w procesie tworzenia wizualnych aspektów aplikacji, nie ma nic wspólnego z automatyzacją budowy kodu. Swagger to narzędzie służące do dokumentowania API oraz generowania jego interfejsów. Choć Swagger wspiera dokumentację i umożliwia łatwe zrozumienie, jak działa API, nie jest to narzędzie do automatyzacji procesów budowania aplikacji. Typowe błędy myślowe przy wyborze niewłaściwych narzędzi często wynikają z mylnego przekonania, że każde narzędzie do automatyzacji zadań może obsługiwać każdy aspekt cyklu życia oprogramowania, co nie jest zgodne z rzeczywistością. Właściwe zrozumienie funkcji i przeznaczenia narzędzi jest kluczowe dla efektywnego zarządzania projektem oraz dla optymalizacji procesów developerskich.

Pytanie 37

Zamieszczony kawałek kodu w języku C# tworzy hasło. Wskaż prawdziwe stwierdzenie dotyczące cech tego hasła?

var random = new Random();
string pulaZnakow =
    "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
int dlPuli = pulaZnakow.Length - 1;
char znak;
string wynik = "";

for(int i = 0; i < 8; i++)  {
    znak = pulaZnakow[random.Next(0, dlPuli)];
    wynik += znak;
}
A. Może zawierać małe i wielkie litery oraz cyfry.
B. Może zawierać małe oraz wielkie litery, cyfry i znaki specjalne.
C. Ma 8 znaków lub więcej i zawiera małe oraz wielkie litery, a także cyfry.
D. Ma maksymalną długość 7 znaków, co ustala zmienna i.
Fragment programu w języku C# generuje hasło, które zawiera małe i wielkie litery oraz cyfry. W kodzie widzimy, że zmienna pulaZnakow zawiera wszystkie małe litery alfabetu, wszystkie wielkie litery oraz cyfry od 0 do 9. Zmienna dlPuli przechowuje długość ciągu znaków, co umożliwia losowe wybieranie znaków z pełnego zakresu dostępnych znaków. W pętli for odbywa się iteracja 8 razy, co oznacza, że każde generowane hasło ma długość 8 znaków. Każdy znak jest losowo wybierany z puli, co zapewnia różnorodność i brak uprzedzeń w doborze znaków. Warto również zwrócić uwagę na praktyczne użycie klasy Random, która jest standardem w przypadkowej generacji danych w C#. Takie podejście jest zgodne z najlepszymi praktykami, gdzie hasła powinny mieć różnorodne znaki, co zwiększa ich siłę i trudność złamania. Dobrym pomysłem jest również dodanie symboli specjalnych dla jeszcze większego bezpieczeństwa, co można łatwo zaimplementować modyfikując pule dostępnych znaków.

Pytanie 38

W przedstawionym filmie ukazano kreator interfejsu użytkownika, dla którego automatycznie powstaje

A. kod XML
B. obsługa wciśniętego przycisku
C. obsługa przycisku ekranu dotykowego
D. kod Java
Kod XML jest obecnie najczęściej stosowanym formatem do definiowania wyglądu interfejsów użytkownika w takich narzędziach jak Android Studio czy różnego rodzaju designery graficzne. Kiedy projektujesz layout aplikacji mobilnej albo desktopowej, duża część nowoczesnych narzędzi tworzy właśnie pliki XML, które następnie są interpretowane przez system w czasie uruchamiania aplikacji. Ułatwia to rozdzielenie logiki aplikacji od jej prezentacji, co wydaje się fundamentalne przy większych projektach. Moim zdaniem takie podejście daje ogromne korzyści – można łatwo modyfikować wygląd bez dotykania kodu źródłowego. W praktyce, jeśli używasz np. Android Studio, zbudujesz interfejs przeciągając przyciski czy pola tekstowe, a pod spodem dostaniesz czytelny plik XML. To przyspiesza pracę, zwiększa czytelność projektu i pozwala na późniejsze automatyczne generowanie dokumentacji albo testów interfejsu. Takie standardy są rekomendowane nie tylko przez Google, ale też szeroko stosowane w innych środowiskach, jak chociażby XAML w Microsoft czy FXML w JavaFX. Przezroczystość działania tych narzędzi sprawia, że łatwiej jest pracować zespołowo, bo każdy może szybko zorientować się w strukturze UI patrząc na XML-a. Samo generowanie kodu XML przez narzędzia graficzne to duży krok w kierunku lepszej organizacji pracy i zgodności ze współczesnymi praktykami branżowymi.

Pytanie 39

Jakie są różnice między dialogiem modalnym a niemodalnym?

A. Dialog modalny jest ograniczony wyłącznie do aplikacji konsolowych
B. Dialog modalny działa w tle, podczas gdy dialog niemodalny jest zawsze wyświetlany na pierwszym planie
C. Dialog modalny wymaga zamknięcia, aby powrócić do głównego okna aplikacji, natomiast dialog niemodalny tego nie wymaga
D. Dialog modalny umożliwia interakcję z innymi oknami aplikacji, a dialog niemodalny tego nie pozwala
Dialog modalny to okno dialogowe, które wymaga interakcji użytkownika przed powrotem do głównego okna aplikacji. Tego rodzaju okna są często wykorzystywane do wyświetlania komunikatów, potwierdzeń lub formularzy wymagających danych wejściowych. Modalność zapewnia, że użytkownik nie może przejść do innej części aplikacji bez uprzedniego zamknięcia okna dialogowego. To rozwiązanie pomaga w wymuszeniu ważnych akcji, takich jak potwierdzenie usunięcia pliku lub zatwierdzenie płatności. Dialog niemodalny natomiast pozwala na interakcję z resztą aplikacji nawet wtedy, gdy okno dialogowe jest otwarte, co sprawdza się w mniej krytycznych sytuacjach, np. podczas wyświetlania dodatkowych opcji.

Pytanie 40

Który fragment kodu ilustruje zastosowanie rekurencji?

Blok 1:
int fn(int a) {
  if(a==1) return 1;
  return fn(a-1)+2;
}
Blok 2:
int fn(int a) {
  if(a==1) return 1;
  return (a-1)+2;
}
Blok 3:
int fn(int a) {
  if(a==1) return 1;
  return fun(a-1)+2;
}
Blok 4:
int fn(int a) {
  if(a==1) return 1;
  return 2;
}
A. Blok 2
B. Blok 4
C. Blok 3
D. Blok 1
Blok 1 to typowy przykład rekurencji, czyli sytuacji, gdy funkcja wywołuje samą siebie z innym argumentem (tutaj fn(a-1)). Takie podejście pojawia się w programowaniu bardzo często, szczególnie przy rozwiązywaniu problemów, gdzie rozwiązanie można rozbić na mniejsze, podobne zadania. W Bloku 1 mamy tzw. przypadek bazowy (if(a==1) return 1), czyli moment, w którym dalsza rekurencja się zatrzymuje – bez tego każdy program rekurencyjny skończyłby się przepełnieniem stosu i błędem. Moim zdaniem, dobrze rozumiana rekurencja to jedna z podstaw algorytmiki – spotyka się ją choćby przy obliczaniu silni, ciągu Fibonacciego czy w algorytmach przeszukiwania struktur drzewiastych, np. w operacjach na drzewach binarnych. W praktyce branżowej warto wiedzieć, że rekurencja bywa bardzo elegancka i skraca kod, ale trzeba ją stosować z głową – łatwo przekroczyć limity stosu przy zbyt głębokim wywołaniu albo zapomnieć o przypadku bazowym, przez co program nie kończy działania. W standardach wielu języków (np. C, Java) rekurencja jest narzędziem jak każde inne, ale zawsze powinna być projektowana z myślą o czytelności i efektywności rozwiązania. Często spotykam się z sytuacją, gdzie początkujący próbują wszystko rozwiązywać rekurencyjnie, a to nie zawsze jest optymalne – niektóre problemy lepiej rozwiązać iteracyjnie, choćby ze względu na wydajność. W tym konkretnym kodzie zastosowanie rekurencji jest klasyczne i poprawne, więc zdecydowanie jest to dobry wzór do nauki.