Professional Documents
Culture Documents
Programista Junior 12
Programista Junior 12
Programista Junior 12
Inauguracja nowego roku szkolnego za nami! Zapewne będziecie mogli pochwalić się znajomym. Na sam koniec
stęskniliście się za kolegami i koleżankami, więc mamy zostawiliśmy małą perełkę: tworzenie własnego sklepu w
nadzieję, że z przyjemnością wróciliście do klas. Życzymy Robloxie!
powodzenia, jak najlepszych ocen, fantastycznych przygód Czy zastanawialiście się kiedyś, jakie czynności w przy-
i zdobywania nowej wiedzy. Mamy nadzieję, że aktualne szłości będą wykonywać za nas roboty oraz w czym będą
wydanie PJr pomoże Wam w niektórych zajęciach oraz spo- nas zastępować? Kto je zbuduje i zaprogramuje? W artyku-
woduje, że nie raz zaskoczycie nauczycieli, rodziców, opieku- le o LEGO Mindstorms odpowiemy na niektóre z tych pytań
nów oraz znajomych! A co znajdziecie w nowym numerze? oraz pokażemy Wam… jak zaprojektować własny joystick!
😉
Zapnijcie pasy i przygotujcie się na niezwykłą jazdę . Większość z Was ma już zapewne swój własny smart-
Tematem numeru są bazy danych. Jak pewnie wiecie, fon. Te małe urządzenia oferują dziś nie tylko komunikację
jednym z najważniejszych zadań komputera jest zapisywa- ze znajomymi, robienie zdjęć czy przeglądanie Internetu,
nie i przechowywanie różnego rodzaju danych. Z artykułu ale także coraz bardziej rozbudowane aplikacje i gry. Przy-
okładkowego dowiecie się, czym są i do czego służą bazy gotowaliśmy dla Was naprawdę ciekawy artykuł, z którego
danych, jakiego narzędzia można użyć do ich utworzenia, dowiecie się, jak stworzyć aplikację na Androida, w której
a także jak tworzyć tabele oraz dodawać, usuwać i mody- pościgamy się samochodami!
fikować w nich dane przy pomocy języka SQL. Serdecznie Temat prywatności podczas korzystania z Internetu po-
polecamy, bo działanie na bazach danych to nie tylko fajna jawia się coraz częściej jako przedmiot dyskusji zarówno
zabawa, ale i wiedza, która na pewno się Wam przyda. w koleżeńskich rozmowach dzieci, jak również w świecie
Czy słyszeliście kiedyś o fraktalach? Jeżeli nie, to warto dorosłych. Pewnie znane są już Wam takie nazwy jak VPN
sprawdzić, czym są te obiekty o tajemniczo brzmiącej na- czy TOR w kontekście rozwiązań pozwalających na ukry-
zwie oraz dlaczego fascynują matematyków, fizyków, przy- wanie tożsamości w Internecie. Dziś wyjaśnimy, czym jest
rodników, ale też artystów, grafików komputerowych czy VPN, do czego można go zastosować oraz przed jakimi za-
programistów na całym świecie. Przekonacie się, że mate- grożeniami nas nie ochroni.
matyka w połączeniu ze Scratchem… może być po prostu Ponadto w numerze kolejna porcja ciekawych zagadek
piękna! matematycznych oraz wyzwań w programowaniu. Gorąco
Wiemy, że większość z Was uwielbia gry komputerowe. zachęcamy do główkowania nad zadaniami zaproponowa-
Nic dziwnego, my też jesteśmy ich fanami. Gry w odpowied- nymi przez autorów!
niej dawce mogą być nie tylko rozrywką, ale i wartościo- Na koniec mamy dla Was coś nowego: ciekawe przygo-
wym narzędziem do nauki i poznawania świata. A wiecie, dy niezwykłego robota Scottiego w formie komiksu. Jeste-
co jest jeszcze lepsze niż granie? Tworzenie własnych gier śmy przekonani, że historyjki wciągną Was równie mocno
i niezwykłych światów! Z artykułu o tworzeniu gry RPG jak nas. A dodatkowo nauczycie się nowych sztuczek w pro-
w środowisku Unity dowiecie się, w jaki sposób wykorzy- gramowaniu.
stać zebrane surowce do wytwarzania broni, które pomogą
Redakcja PJr
nam stawić czoła przeciwnikom najeżdżającym naszą wio-
skę. Z kolejnej części serii poświęconej kreowaniu własnej
Ps. Dla nauczycieli mamy kolejny ciekawy scenariusz, dzięki
gry przygodowej Enigma dowiecie się natomiast, jak two-
któremu nauczycie dzieci, jak stworzyć algorytm sprawdzający
rzyć funkcje oraz jak wyświetlać grafiki w Pythonie. Będzie w językach Scratch i Python.
to kolejny krok do zostania mistrzem tego popularnego ję-
PS. 2. Kolejna część serii „Wstęp do języka Python” ukaże się
zyka programowania oraz do napisania świetnej gry, którą w następnym numerze.
Wprowadziliśmy nowe oznaczenia do artykułów: kolor oraz wiek czytelnika. Zielony oznacza poziom łatwy, żółty poziom średni,
a czerwony oznacza, że treść artykułu przeznaczona jest dla zaawansowanych Czytelników.
Bazy danych. Czyli jak programy przechowują informacje 6 Czym jest VPN? 66
Wojciech Sura Łukasz Basa
Czy matematyka może być piękna? O fraktalach słów kilka 14 Programistyczne wyzwania 70
Justyna Klimczyk Konrad Jagaciak
Średniowieczna przygoda – gra RPG w środowisku Unity. Zagadki matematyczne dla dzieci w wieku 11+ 72
Ostatnie starcie 22
Michał Kremzer
Tomasz Błaszczyk
Dwumiesięcznik Programista Junior wydawany jest przez Dom Wydawniczy Anna Adamczyk Nota prawna
Wydawca: Adres wydawcy: Redakcja zastrzega sobie prawo do skrótów
Anna Adamczyk Dereniowa 4/47, i opracowań tekstów oraz do zmiany planów
(annaadamczyk@programistajr.pl) 02-776 Warszawa wydawniczych, tj. zmian w zapowiadanych tematach
Redaktor naczelny: Strona internetowa: artykułów i terminach publikacji, a także nakładzie
Łukasz Łopuszański www.programistajr.pl i objętości czasopisma.
(llopuszanski@programistajr.pl) Druk: O ile nie zaznaczono inaczej, wszelkie prawa do
Redaktor prowadzący: http://www.edit.net.pl/ materiałów i znaków towarowych/firmowych
Mariusz "maryush" Witkowski Nakład: 5000 egz. zamieszczanych na łamach magazynu Programista
Korekta: Projekt okładki: Junior są zastrzeżone. Kopiowanie i rozpowszechnianie
Tomasz Łopuszański, Katarzyna Włodarczyk Maciek Empro ich bez zezwolenia jest Zabronione.
Skład: Współpraca:
Redakcja magazynu Programista Junior nie
Krzysztof Kopciowski Gynvael Coldwind, Rafał Kocisz, Wojciech Biały,
ponosi odpowiedzialności za szkody bezpośrednie
Dział reklamy: foxtrot_charlie , Paweł "KrzaQ" Zakrzewski,
i pośrednie, jak również za inne straty i wydatki
reklama@programistajr.pl Michał "Kafej" Zbyl, Sławomir Zborowski,
poniesione w związku z wykorzystaniem informacji
tel.: +48 663 220 102, Maciek Empro (fb/everybodywantstobeempro),
prezentowanych na łamach magazynu Programista
Prenumerata: Alicja Puszakowska
Junior.
prenumerata@programistajr.pl
PODSTAWY PROGRAMOWANIA
Wojciech Sura
Bazy danych
Czyli jak programy przechowują informacje
Jednym z najważniejszych zastosowań komputerów jest przechowywanie i przetwarzanie
danych. Czasami dane te są pojedyncze – jak na przykład zdjęcia z wakacji: każde z nich
znajduje się w osobnym pliku. Zdarza się jednak, że informacje są ze sobą w jakiś sposób
powiązane, a my wiedzę o tych powiązaniach chcemy zachować.
10+
6 [ 4 - 202 1 ]
Bazy danych
Poza tym każda z książek może być wypożyczona przez o nazwie SQLite Studio. Jest on napisany w taki sposób,
jednego z użytkowników (ale tylko przez jednego naraz). że nie trzeba go nawet instalować w systemie – wystar-
Zależności te są bardzo ważne, ponieważ niosą ze czy pobrać odpowiedni plik, rozpakować go i już można
sobą istotne informacje. Jeżeli bowiem przypiszemy z tego programu korzystać.
w odpowiedni sposób książki do gatunków, możemy Aby to zrobić:
pomóc komuś, komu spodobał się „Sherlock Holmes” 1. Przejdź pod adres https://sqlitestudio.pl.
i szuka kolejnego kryminału (niezależnie od autora i ty- 2. Odnajdź u góry link o nazwie „Download” i przejdź tam.
tułu). Analogicznie, jeżeli zapamiętamy powiązania po- 3. Przewiń stronę nieco w dół, by odnaleźć link do po-
między książkami i autorami, komuś, komu spodobała brania programu (w czasie pisania tego artykułu naj-
się „Awantura w Niekłaju” autorstwa Edmunda Niziur- nowszą wersją SQLite Studio była wersja 3.3.3, zaś
skiego, będziemy mogli polecić „Księgę Urwisów”. plik nazywał się SQLiteStudio-3.3.3.zip).
W projektach programistycznych bardzo często 4. Pobierz plik i rozpakuj go do dowolnego katalogu.
spotykamy się z sytuacją, w której zależy nam na zapa- SQLite Studio jest gotowe do pracy – wystarczy uru-
miętaniu informacji o zależnościach pomiędzy różnymi chomić program SQLiteStudio.exe.
danymi. W związku z tym powstały specjalne narzędzia,
które pozwalają przechowywać tego typu informacje. TABELA
Ponieważ wspomniane wcześniej zależności w facho- Zanim zaczniemy używać SQLite Studio, musimy do-
wym języku nazywane są relacjami, narzędzia te okre- wiedzieć się trochę, w jaki sposób bazy danych przecho-
ślane są mianem relacyjnych baz danych. I o nich wła- wują nasze informacje.
śnie chciałbym opowiedzieć w tym artykule. Jednym z najważniejszych pojęć w bazach danych
jest tabela. Jej zadaniem jest przechowywanie informacji
SQLITE dotyczących jednego, konkretnego rodzaju danych. Po-
Bazy danych nie są wbrew pozorom zagadnieniem niżej możemy zobaczyć przykładową tabelę przechowu-
bardzo skomplikowanym, ale najłatwiej jest nauczyć jącą informacje o książkach.
się ich obsługi, po prostu samodzielnie eksperymentu-
jąc. Na rynku dostępna jest bardzo duża liczba silników BOOKS
bazodanowych, czyli programów, które pomagają użyt- ID TITLE ORIGINALTI- PUBLISHY- PRINTEDBY
kownikom (ale również i innym programom) przecho- TLE EAR
wywać i wyszukiwać dane. Do najpopularniejszych nale- 1 Przygody The Adventu- 1892 Oficyna
żą między innymi Microsoft SQL Server, Oracle, MySQL Sherlocka res of Sher- Wydawni-
Holmesa lock Holmes cza RYTM
MariaDB czy PostgreSQL.
Instalacja i skonfigurowanie większości z nich zajmu- 2 Księga 1954 Greg
urwisów
je sporo czasu i wymaga trochę informatycznej wiedzy.
3 Awantura 1962 Greg
Serwery te są też często bardzo duże (zwykle zajmu-
w Niekłaju
ją kilkaset megabajtów), a do tego pracują cały czas w
4 Szatan z 1937 Nasza Księ-
tle, pochłaniając zasoby komputera. Wreszcie część z
VII klasy garnia
nich dostępna jest tylko odpłatnie, więc nie są one zbyt
5 Zbrojni Men at Arms 1993 Prószyński
atrakcyjne do nauki. Istnieje jednak silnik, który został
i S-ka
stworzony po to, by zajmować bardzo mało miejsca i ob-
6 Zbrojni Men at Arms 1993 Prószyński
sługiwać niewielkie bazy danych mieszczące się w jed-
i S-ka
nym pliku, który świetnie nada się do naszych potrzeb, a
nazywa się on SQLite.
Jeżeli macie ochotę przećwiczyć ze mną projekto- W środowisku baz danych każda tabela musi mieć swoją
wanie baz, a następnie wyszukiwanie w nich różnych unikalną nazwę – abyśmy mogli odróżnić jedną od dru-
danych, zachęcam do pobrania niewielkiego programu giej. Ponieważ w projektach programistycznych przyjęło
się korzystać z angielskiego nazewnictwa, tabelę prze- Zwróć uwagę, że w naszej tabeli „Zbrojni” autorstwa
chowującą informację o książkach nazwałem Books. Terry’ego Pratchetta występują dwukrotnie – ponieważ
Tabele w bazach danych składają się z wierszy w naszej bibliotece mamy dwa egzemplarze tej książki.
i kolumn. Oczywiście wszystkie dotyczące ich informacje są do-
Każdy wiersz reprezentuje pojedynczy element prze- kładnie takie same, więc bez takiej specjalnej kolumny
chowywany w tabeli: w naszym przypadku będą to in- nie bylibyśmy w stanie odróżnić jednej od drugiej. Ko-
formacje o pojedynczej książce. Warto wiedzieć, że lumna ta nosi bardzo ważną nazwę klucz główny.
w literaturze poświęconej bazom danych możecie spo- W naszym przypadku rolę klucza głównego pełni
tkać się również z innymi określeniami wiersza, takimi kolumna Id. Jest to bardzo popularna nazwa dla kluczy
jak rekord, encja albo (rzadziej) krotka. głównych, a pochodzi od skrótu – w różnych wersjach
W listach, które wstępnie przygotowaliśmy na po- – od Index (indeks), Identifier – (identyfikator) lub Iden-
czątku, przechowywaliśmy bardzo mało informacji. Na tification Data (dane identyfikacyjne). Klucz główny nie
przykład na liście książek znajdowały się tylko ich tytuły. musi być koniecznie liczbą, jednak rozwiązanie takie jest
Bazodanowa tabela pozwala jednak przechować w każ- dosyć wygodne, ponieważ bazy danych zawierają szereg
dym wierszu znacznie więcej informacji, a ich liczbę i ro- mechanizmów pomagających w obsłudze tej kolumny.
dzaj określamy, definiując dla tabeli kolumny. Dbanie o prawidłową wartość kolumny Id stanowi
Każda z kolumn opisuje pojedynczy aspekt, cechę pewien problem. Dane w bazie zmieniają się – są wsta-
elementu tabeli. W naszej przykładowej tabeli prze- wiane i usuwane, co powoduje, że numeracja przestaje
chowujemy pięć informacji o każdej książce. Jej unikal- być ciągła. Bez przejrzenia całej zawartości tabeli trudne
ny identyfikator (o którym za chwilę), tytuł (Title), tytuł może być ustalenie takiej wartości nowego wiersza, któ-
oryginału w przypadku książek obcojęzycznych (Origi- ra nie pokryje się z już istniejącą. Dlatego też bazy da-
nalTitle), rok pierwszej publikacji (PublishYear) oraz wy- nych oferują mechanizm autoinkrementacji, który ko-
dawnictwo (PrintedBy). lumnie Id nadaje pierwszą wolną, prawidłową wartość.
Decyzję o tym, ile kolumn (i jakiego typu) będzie mia- Na koniec wreszcie każda kolumna powinna mieć
ła tabela, podejmuje programista podczas projektowania zdefiniowany jednoznacznie typ. Baza danych musi wie-
bazy danych. Kieruje on się zwykle informacjami o tym, dzieć, czy wartość zapisywana w danej kolumnie będzie
ile danych użytkownicy aplikacji będą w stanie dostar- tekstem, liczbą całkowitą, zmiennoprzecinkową, warto-
czyć, a także które z nich są tak naprawdę warte prze- ścią typu bool (prawda/fałsz) czy datą lub czasem. Po-
chowania. W naszym przypadku moglibyśmy w tabeli zwala to na optymalizowanie sposobu, w który zapisy-
książek przechowywać również informacje o prawach wane są dane, a także otwiera drogę do wykonywania
autorskich, nazwisku ilustratora, adresie wydawnictwa, na danych różnych operacji (na przykład obliczania sum,
liczbie rozdziałów i tak dalej – jednak tego typu informa- średnich i tak dalej).
cje w bibliotece są zwykle mało użyteczne.
KOLUMNY
Ciekawostka
Bazy danych przewidują, że niektóre pola w wierszach
mogą pozostać niewypełnione. Dla przykładu kolum-
na OriginalTitle w przypadku tytułów polskojęzycznych
Klucz główny nie musi być pojedynczą kolumną. W niektó-
nie ma większego sensu – możemy więc zrezygnować
rych, rzadkich przypadkach klucz główny składa się z kilku
z wprowadzania do niej wartości. Podczas projektowania kolumn. W takiej sytuacji wszystkie wiersze muszą różnić
tabeli trzeba jednak jasno zaznaczyć, czy zgadzamy się się wartością przynajmniej jednej z nich. Gdyby na przykład
na to, żeby pole mogło być puste, czy też nie. klucz główny stanowiła para kolumn: Imię i Nazwisko, w
tabeli mogłyby znajdować się jednocześnie wpisy: Adam
Większość tabel powinna zawierać kolumnę, która
Kowalski, Michał Kowalski oraz Michał Nowak. Niedopusz-
jednoznacznie identyfikuje dany wiersz (to znaczy: nie czalne byłoby jednak istnienie dwóch Adamów Kowalskich.
istnieją dwa różne wiersze, które mają tę samą wartość).
8 [ 4 - 202 1 ]
Bazy danych
SQL
Gdy wymieniałem popularne serwery bazodanowe,
zwróciliście pewnie uwagę na to, że w większości z nich
zawarty jest skrót SQL. Rozwija się on do angielskiej na-
zwy: Structured Query Language, który przetłumaczy-
my jako język strukturalnych zapytań. Język ten został
zaprojektowany specjalnie do komunikacji z bazami da-
nych i przeważająca większość silników bazodanowych
(a już na pewno te z „SQL” w nazwie) potrafi go prawi-
dłowo zinterpretować.
Dobra wiadomość jest taka, że język SQL jest bardzo
czytelny. Polecenia pisane w tym języku przypominają
zdania napisane po angielsku – łatwo jest więc się go na-
uczyć. W dalszej części artykułu postaram się pokazać
kilka podstawowych poleceń, które pomogą nam utwo-
rzyć odpowiednie tabele, manipulować rekordami, a na- Ilustracja 2. Konfigurujemy nową bazę
Na koniec otwórzmy edytor SQL. Możemy zrobić programiści często mają taki właśnie nawyk, bo dzięki
to poprzez wciśnięcie skrótu klawiaturowego Alt+E lub temu zapytania czyta się nieco łatwiej. SQLite Studio tak
klikając na ikonkę skryptu (Ilustracja 4). Edytor SQL jest czy inaczej zawsze pogrubi je, co ułatwi ich odnalezienie.
podstawowym narzędziem, z którego będziemy korzy- CREATE TABLE jest wyrażeniem, które oznacza, że
stać najwięcej – warto więc się z nim zaznajomić. chcemy utworzyć nową tabelę. Zaraz za nim musimy
podać jej nazwę, a potem – w nawiasach – listę kolumn
oddzielonych przecinkami.
Każda z kolumn musi mieć minimalną postać Nazwa
Typ. Nazwa jest oczywiście nazwą kolumny, zaś Typ okre-
śla rodzaj danych, które chcemy w niej przechowywać.
Oprócz tego możemy również dołączyć dodatkowe in-
formacje, które bardziej szczegółowo opisują kolumnę.
Pierwsza kolumna o nazwie Id będzie przechowywać
liczby całkowite – INTEGER. Powiadamiamy też SQLite
Studio, że ma to być klucz główny (PRIMARY KEY) tej ta-
beli oraz że ma tam działać mechanizm autoinkremen-
tacji (AUTOINCREMENT). Dzięki temu podczas dodawania
nowych wierszy nie będziemy musieli zaprzątać sobie
głowy wprowadzeniem kolejnego unikalnego identyfi-
katora – baza danych zrobi to za nas.
Ilustracja 4. Otwieramy edytor SQL Kolejną kolumną jest Title, która przechowywać
będzie tekst (jak pamiętamy, ma być to tytuł książki).
TWORZYMY TABELĘ Kolumna ta jest obowiązkowa: wiersz chyba razem się
Aby utworzyć nową tabelę, musimy wykonać odpo- pisze nazwy książki nie ma dla nas żadnego sensu. Pi-
wiednie zapytanie. Zobaczmy najpierw, jak ono wygląda, sząc więc po niej NOT NULL, wymuszamy, by w każdym
a zaraz dowiemy się, z jakich elementów się ono składa. wierszu w tej kolumnie pojawiła się jakaś wartość. Bazy
danych są środowiskiem, w którym do spójności danych
Listing 1. Tworzymy nową tabelę przykładana jest naprawdę duża waga. W efekcie, jeże-
CREATE TABLE Books ( li oznaczymy kolumnę jako NOT NULL, nie ma żadnych
Id INTEGER PRIMARY KEY AUTOINCREMENT, szans, żeby udało się wstawić wiersz łamiący tę zasadę.
Title TEXT NOT NULL, Kolejne definicje kolumn możecie rozszyfrować sami.
OriginalTitle TEXT DEFAULT NULL, Pojawia się tam tylko jedna nieznana nam jeszcze kon-
PublishYear INTEGER NOT NULL, strukcja: DEFAULT NULL. Informuje ona SQLite Studio,
PrintedBy TEXT NOT NULL); że wartość tej kolumny może być pusta (nieustawiona)
i mało tego – domyślnie będzie właśnie taka. Oznacza
Osoby, które znają choć trochę język angielski, po- to, że podczas wprowadzania danych do tabeli można ją
winny bez większego problemu przeczytać powyższe pominąć – SQLite automatycznie ustawi ją na NULL (czyli
polecenie – SQL jest naprawdę bardzo czytelnym języ- na „brak wartości”).
kiem. Przyjrzyjmy się jednak powyższej komendzie i roz- Polecenia SQL kończymy średnikiem. Nie jest to
bierzmy ją na czynniki pierwsze. konieczne, ale stanowi dobry zwyczaj i jest pomocne
Przede wszystkim zwróć uwagę na to, że część słów szczególnie wówczas, gdy chcemy wykonać kilka pole-
jest pogrubiona i napisana wersalikami (TO ZNACZY W ceń naraz.
TAKI SPOSÓB), a część nie. Są to tak zwane słowa klu- Po wywołaniu komendy zauważymy, że nowa tabela
czowe SQL, czyli takie, które mają specjalne znaczenie. pojawiła się na liście tabel w naszej bazie (Ilustracja 5).
Nie ma konieczności pisania ich wielkimi literami, ale
10 [ 4 - 202 1 ]
Bazy danych
1993,
"Prószyński i S-ka"),
("Zbrojni",
"Men at Arms",
1993,
"Prószyński i S-ka");
zwalające pobrać dane z bazy na setki sposobów, łączyć ze do wierszy, zaś w drugiej – które wiersze chcemy w ten
sobą tabele, filtrować i sortować dane i przetwarzać je na sposób zmodyfikować.
całą masę sposobów. Możemy jednak skorzystać z jego naj- W naszym przypadku będziemy chcieli zmienić tylko
prostszej postaci, która po prostu prosi o pobranie wszyst- pojedynczy wiersz zawierający informacje o książce „Win-
kich danych z tabeli. Komenda ta wygląda tak: netou”. W takiej sytuacji najwygodniej będzie sprawdzić
wcześniej, jaka jest jej wartość kolumny Id (klucza głów-
Listing 4. Pobieramy dane z naszej tabeli nego naszej tabeli). Przy małej liczbie książek możemy po-
SELECT * FROM Books; brać znów całą tabelę – okazuje się, że wartością tą jest 7.
Możemy teraz napisać polecenie, które poprawi
Nareszcie! Teraz faktycznie możemy zobaczyć nasze błędny wpis.
dane (Ilustracja 6).
Zapytanie SELECT jest bardzo krótkie i raczej dosyć Listing 7. Poprawiamy błędny wpis
czytelne. Warto tylko wspomnieć, że symbol gwiazdki UPDATE Books
oznacza, że interesują nas wszystkie kolumny z tej tabe- SET OriginalTitle = "Winnetou", PublishYear = 1893
li. Gdybyśmy chcieli pobrać na przykład tylko identyfi- WHERE Id = 7;
kator i tytuł, moglibyśmy napisać tak:
Polecenie UPDATE rozpoczynamy, wskazując, którą ta-
Listing 5. Pobieramy tylko niektóre kolumny belę chcemy zmodyfikować – w naszym przypadku jest
z tabeli
to oczywiście tabela Books. Następnie – po słowie klu-
SELECT Id, Title FROM Books; czowym SET (oznaczającym „ustaw”) – wprowadzamy
listę zmian, które chcemy przeprowadzić: pole Orig-
MODYFIKACJA I USUWANIE inalTitle ustawić na „Winnetou”, zaś PublishYear na
Wprowadźmy nowy wiersz do naszej tabeli. 1893. Wreszcie przy pomocy słowa kluczowego WHERE
wskazujemy, które konkretnie wiersze chcemy zmienić.
Listing 6. Dodajemy kolejną książkę W naszym przypadku wymagamy, by wartość Id zmie-
INSERT INTO Books nianego rekordu była równa 7, co w efekcie zmieni tylko
(Title, pojedynczy wiersz.
OriginalTitle, Warto wiedzieć, że przy pomocy polecenia UPDATE
PublishYear, możemy wprowadzać hurtowe zmiany, czyli modyfi-
PrintedBy) kować wiele wierszy naraz. W takim przypadku należy
VALUES jednak bardzo uważnie opisać wiersze, które chcemy
("Winnetou", zmienić, bo możemy przypadkowo wprowadzić zmiany
NULL, w innym miejscu niż zamierzaliśmy.
1993, Załóżmy teraz, że ostatni czytelnik wypożyczoną
"Wydawnictwo Przez Lądy i Morza"); książkę (właśnie „Winnetou”) przyniósł w opłakanym
stanie. Nie ma strony tytułowej, w książce brakuje stron,
O kurczak, pomyliliśmy się! Winnetou został wyda- sama książka zaś rozlatuje się. Po analizie dochodzi-
ny w 1893 roku, a nie 1993. Poza tym polską nazwą jest my do wniosku, że książka ta jest już stara i zniszczo-
wprawdzie „Winnetou”, ale jest to książka w oryginale na w stopniu, który powoduje, że nie ma sensu jej dalej
obcojęzyczna, więc powinniśmy też wypełnić kolumnę wypożyczać. Decydujemy się więc usunąć ją z rejestru
OriginalTitle. książek dostępnych do wypożyczenia, a w jej miejsce za
Na szczęście SQL przewiduje możliwość zmienia- jakiś czas kupić nową.
nia istniejących już rekordów, a służy do tego specjal- Usuwanie rekordów z bazy odbywa się poprzez za-
na instrukcja UPDATE. Dzieli się ona na dwie części: w stosowanie polecenia DELETE. W naszym przypadku bę-
pierwszej określamy, jakie zmiany chcemy wprowadzić dzie ono wyglądało następująco:
12 [ 4 - 202 1 ]
Bazy danych
Listing 8. Usuwamy wpis z bazy pomocy bardzo wygodnego języka o nazwie SQL. Pisane
DELETE FROM Books w nim zapytania przypominają zdania pisane w języku an-
WHERE Id = 7; gielskim, co jeszcze bardziej upraszcza proces nauki.
W następnej części dowiemy się, jak powiązać ze
Składnia jest chyba bardzo czytelna – musimy najpierw sobą kilka tabel oraz jak wyciągać z nich potrzebne nam
wskazać, z której tabeli chcemy usunąć rekordy, a potem informacje.
wskazać, które konkretnie z nich są nam już niepotrzeb-
ne. Użycie klucza głównego – jak w powyższym przy-
padku – zawęzi wynik do jednego konkretnego wiersza. Wojciech Sura
Wykonanie zapytania z Listingu 4 powinno potwierdzić,
Programuje od 25 lat, z czego 10 komercyjnie; ma
że wiersz został prawidłowo usunięty. na koncie aplikacje desktopowe, webowe, mobilne
i wbudowane – pisane w C#, C++, Javie, Delphi, PHP,
CIĄG DALSZY NASTĄPI… JavaScript i w jeszcze kilku innych językach. Obecnie
Relacyjne bazy danych są bardzo wygodnym narzę- pracuje w firmie WSCAD, rozwijającej oprogramowa-
dziem pozwalającym na przechowywanie dużych ilości nie nowej generacji CAD dla elektrotechników.
danych oraz – co ważne – zależności pomiędzy nimi. Mo-
WOJCIECHSURA@GMAIL.COM
żemy operować na nich w stosunkowo łatwy sposób przy
!
Zapamiętaj Ćwicz w domu
օ Pobierz i zainstaluj lub rozpakuj program SQLite օ . Programy komputerowe często przechowują
Studio. informacje w bazach danych.
օ Użyj SQLite Studio, by zbudować opisaną w arty- օ Bazy danych pozwalają nie tylko na przechowywa-
kule bazę danych. nie dużych ilości informacji, ale również zależno-
ści pomiędzy nimi.
օ Spróbuj przy pomocy tego programu wstawić do
bazy dane. օ Do komunikacji z bazami danych wykorzystuje się
język SQL.
[ PPROGR
ROGR AMI STAJR . PL ] 13
JĘZYKI PROGRAMOWANIA
Justyna Klimczyk
12+
14 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka
Ilustracja 3. Przykłady występowania fraktali w przyrodzie. Od lewej aloes, szyszka, brokuł (źródła: https://pixa-
bay.com/pl/photos/aloes-soczysty-aloes-polyphylla-510113/ https://pixabay.com/pl/photos/szyszki-szyszka-jesie-
%c5%84-las-3026691/ https://pixabay.com/pl/photos/romanescu-romanesco-warzywo-3297134/)
Ciekawostka
Pojęcie fraktala zostało wprowadzone do matematyki przez
Benoît Mandelbrota w latach 70. ubiegłego wieku. Odkryty
przez niego zbiór Mandelbrota nie był jednak pierwszym
przykładem fraktala.
Szczególnymi fraktalami – jeszcze zanim zostały tak
nazwane – zajmowało się wielu matematyków, w tym Polak
Wacław Sierpiński (o tym później). Mandelbrot, używając
komputera do wizualizacji, uczynił z fraktali przedmiot in-
tensywnych badań. O ważności tego zagadnienia zadecydo-
wały zastosowania w różnych dziedzinach, zwłaszcza poza
matematyką.
Źródło: Wikipedia
Pod linkiem: https://math.hws.edu/eck/js/mandelbrot/
MB.html znajdziecie generator online fraktala Mandelbrota.
Umożliwia on wybór między innymi palety kolorów, mak-
Ilustracja 5. Fragment skryptu zawierający wywołanie
symalnej liczby iteracji oraz powiększenie dowolnej jego
procedury „drzewo(konar)”
części.
Cały skrypt można znaleźć pod adresem:
» https://scratch.mit.edu/projects/556219010
16 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka
FRAKTALNOŚĆ LIŚCI PAPROCI rekurencji stają się coraz krótsze. Zwróćcie uwagę na
fakt, że procedura Paproć(długość) wywołuje samą
siebie trzykrotnie. Spowoduje to znaczne wydłużenie
działania skryptu i przynajmniej kilkunastosekundowe
oczekiwanie na efekt końcowy jej działania. By od razu
zobaczyć wynik procedury, należy uruchomić w Scrat-
chu tryb turbo (patrz „Ciekawostka").
KRZYWA KOCHA
Ilustracja 8. Procedura „Paproć(długość)” Dość znanym przykładem fraktalności jest krzywa
Kocha. Połączenie trzech krzywych tworzy element
Parametr procedury paproć określa początkową dłu- przypominający płatek śniegu i nazywany jest płatkiem
gość łodygi, jest też punktem wyjścia do wyznaczania Kocha (od nazwiska szwedzkiego matematyka Nielsa Fa-
długości poszczególnych odgałęzień, które za sprawą biana Helge von Kocha).
Warto wiedzieć
Krzywa powstaje z odcinka, który dzielimy na 3 rów-
ne części i zastępujemy środkowy dwoma odcinkami
o tej samej długości, które wraz z usuniętą częścią two-
Dywan Sierpińskiego – fraktal otrzymany z kwadratu za
rzą trójkąt równoboczny. Czynność tą możemy powta- pomocą podzielenia go na dziewięć (3x3) mniejszych kwa-
rzać w nieskończoność, uzyskując coraz bardziej skom- dratów, usunięcia środkowego kwadratu i ponownego reku-
plikowany obraz. rencyjnego zastosowania tej samej procedury do każdego
z pozostałych ośmiu kwadratów. Jego konstrukcja została
podana przez polskiego matematyka Wacława Sierpińskiego
w 1915 roku.
Źródło: Wikipedia
18 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka
TRÓJKĄT SIERPIŃSKIEGO
Fraktalami zajmował się również polski matematyk
Wacław Sierpiński. Przyjrzymy się z bliska jednemu z tych
fraktali i stwórzmy procedurę, która rysuje dowolną jego
iterację.
Trójkąt Sierpińskiego – bo o nim mowa – powstaje STWÓRZMY WŁASNY FRAKTAL
w wyniku podziału trójkąta równobocznego na cztery Omówiliśmy kilka przykładów popularnych fraktali,
mniejsze trójkąty w wyniku łączenia środków boków czas spróbować stworzyć własny!
tego pierwszego. Następnie usuwany jest trójkąt środ- Wykorzystajmy duszka w postaci trójkąta (możecie
kowy, a operacja podziału powtarzana jest na pozosta- go stworzyć samodzielnie w zintegrowanym edytorze
łych trzech trójkątach. grafiki). W kolejnych krokach procedury tworzone są
coraz mniejsze trójkąty, a każdy z nich jest przesunięty
i odwrócony o kąt. Sześciokrotne wywołanie procedury,
połączone z przesunięciem o kąt, spowoduje powstanie
poniższego obiektu. Czy coś wam to przypomina?
20 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka
Ciekawostka
Nietrudno zauważyć, że fraktal zbudowany jest z kwa-
dratów. Na każdym etapie jego konstrukcji wymaga ry-
sowania dwóch kwadratów opartych na odpowiednich
bokach trójkąta prostokątnego (w tym przypadku trójką- W sytuacji, kiedy chcemy przyspieszyć wykonywanie rozbu-
ta prostokątnego równoramiennego), których własności dowanego skryptu, warto włączyć w Scratchu tryb „Turbo”.
Efekt działania będzie natychmiast widoczny na scenie.
ilustrują twierdzenia Pitagorasa - stąd jego nazwa. Tryb „Turbo” włączymy, klikając zieloną chorągiewkę przy
wciśniętym klawiszu Shift. Powtórzenie tej czynności przy-
wraca normalny tryb działania.
!
Zapamiętaj Ćwicz w domu
օ Fraktal – w dużym uproszczeniu figura, której օ Spróbuj zmodyfikować ostatni skrypt według wła-
część jest podobna do całości, inaczej figura snego pomysłu, tak aby powstająca w wyniku jej
samopodobna. wywołania figura zmieniła swój kształt.
օ Rekurencja – sytuacja, w której procedura wywo- օ Zastanów się, jak wykorzystać rekurencję
łuje samą siebie ze zmienionymi danymi. w ostatniej procedurze.
[ PPROGR
ROGR AMI STAJR . PL ] 21
PROGRAMOWANIE GIER
Tomasz Błaszczyk
Średniowieczna przygoda
– gra RPG w środowisku Unity
Ostatnie starcie
Poprzednie części artykułu pozwoliły nam zapoznać się z wieloma aspektami tworzenia
gier w Unity. Przebrnęliśmy zarówno przez podstawowe kwestie wizualne, jak i logiczne,
jednak nadal jest to tylko kropla w morzu możliwości, jakie oferuje nam silnik. Idąc o krok
dalej, w ostatniej już części tej serii damy graczowi możliwość wykorzystania zebranych
surowców do wytworzenia broni, które mogą okazać się przydatne w walce z przeciwnika-
mi najeżdżającymi naszą wioskę. Zapraszam!
12+
INTERFEJS
Komu udało się odwzorować utworzone ostatnim prostego interfejsu kuźni. Postępując analogicznie do
razem funkcjonalności, ten z pewnością ma już pełny utworzonego już ekwipunku, dodajemy nowy Canvas
ekwipunek zdobytych surowców. Chcąc nie chcąc, zmu- i zmieniamy jego nazwę w panelu hierarchii na przy-
szeni byliśmy do ich magazynowania z powodu braku ja- kład na SmithCanvas (smith to po angielsku kowal). Jak
kiegokolwiek kupca w okolicy... Lecz bez obaw, młodzi poprzednio, warto zwrócić uwagę na odpowiednie ska-
wojownicy, gdyż otrzymałem właśnie ważną wiadomość lowanie naszego płótna, stąd też pamiętajmy o dosto-
od wędrownego rzemieślnika, który postanowił osiąść sowaniu komponentu Canvas Scaler do rozdzielczości
na dłuższy czas w naszej wiosce w celu wytworzenia bazowej Full HD, czyli 1920x1080 pikseli. Tak przygoto-
broni dla wszystkich mieszkańców. Mówi się, że dostar- wane płótno możemy uzupełnić o kolejne elementy, ja-
czając odrobinę drewna i żelaza, jesteśmy w stanie uzy- kimi będą obiekty typu Text (napisy) oraz Image (obraz-
skać bardzo ciekawy oręż. Pomóżmy kowalowi rozłożyć ki). Wiemy już, jak z nich korzystać, więc zaproponuję
wszystkie potrzebne rzeczy! Zaczniemy od stworzenia tylko mój przykładowy układ (Ilustracja 1).
22 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity
24 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity
przeoczyć, czy proces już się zakończył, czy animacja Pora na utworzenie parametru wyzwalającego nasz
nadal sczytuje nowe wartości (Ilustracja 5). atak. W przypadku panelu ekwipunku używaliśmy typu
Bool, który poprzez swoje logiczne stany informował
animatora, która animacja ma zostać odtworzona. Tym
razem skorzystamy z Triggera. Hmm… Gdzieś padło już
to słowo! W tym przypadku nie będzie to jednak trigger
działający w oparciu o collider, a specjalny wyzwalacz
animacyjny, powodujący przejście do konkretnego blo-
ku. Aby go dodać, wybieramy zakładkę Parameters, na-
Ilustracja 5. Wizualne zmiany towarzyszące nagrywanej stępnie + i Trigger. Nazwijmy go na przykład Attack. Te-
animacji raz, by wszystko działało jak należy, wybieramy strzałkę
prowadzącą do animacji ataku i z prawej strony w sekcji
Dodajmy teraz kilka nowych punktów na osi czasu i przy Conditions wybieramy z listy nazwę nowo utworzone-
pomocy narzędzia do nagrywania odwzorujmy mniej lub go triggera. Jeśli chodzi o strzałkę powrotu, to pozostaje
bardziej realistyczny cios naszego ostrza. Każdorazowo ona bez przypisanego triggera, ponieważ każdorazowo
przy ukończeniu modyfikacji obiektu w czasie pamiętaj- po wykonaniu ataku mieczem chcemy, by przeszedł on
my o dezaktywacji czerwonego przycisku, aby uniknąć w stan bezczynności. W panelu animatora to w zasadzie
przypadkowych, niepożądanych zmian w edytowanym tyle. Teraz musimy jeszcze tylko wyłączyć zapętlenie
elemencie. Finalnie powinniśmy uzyskać coś na wzór użytych animacji, odnajdując je w jednym z folderów pa-
zamachu, szybkiego cięcia lub pchnięcia i powrotu do nelu projektowego i odznaczając pole Loop Time w pa-
pozycji początkowej. Nie przejmujmy się, jeżeli nie wyj- nelu inspektora. W porządku! Pora przejść do kolejnego
dzie nam za pierwszym razem, gdyż wymaga to nieco etapu, jakim będzie zaimplementowanie utworzonych
wyobraźni i wprawy. W tym przypadku dobrze jest dojść funkcjonalności w kodzie.
do perfekcji metodą prób i błędów, badając przebieg ani- W tym celu tworzymy nowy skrypt języka C# i na-
macji i modyfikując ustalone wartości. zywamy go na przykład SwordController. Na ten mo-
Jeśli wszystko jest gotowe, to możemy przejść do za- ment posłuży nam on jedynie do odtwarzania animacji
kładki Animator, w której nadamy klipom konkretne re- ataku, która wywoływana będzie z każdym naciśnięciem
lacje. Domyślnie na wejściu powinniśmy znaleźć animację wybranego przycisku. Po pierwsze, definiujemy w kla-
bezczynności, gdyż będzie to nasz stan początkowy. Klika- sie prywatne pole typu Animator, następnie pobiera-
jąc ją prawym przyciskiem myszy, wybieramy opcję Make my jego odwołanie funkcją GetComponent w domyślnej
Transition i prowadzimy utworzoną strzałkę do animacji metodzie Start. Możemy to zrobić, ponieważ skrypt ten
ataku. Analogicznie w drugą stronę, dzięki czemu uzyska- podpięty będzie do tego samego obiektu co komponent
my obustronną możliwość przejścia, jak na Ilustracji 6. animatora. Następnie w metodzie Update z każdą klat-
ką sprawdzamy, czy kliknięty został lewy przycisk myszy
(Mouse0). Jeżeli tak, wówczas na rzecz animatora wy-
wołujemy funkcję SetTrigger i w cudzysłowie podajemy
nazwę utworzonego przed chwilą parametru. Całość
prezentuje się jak w Listingu 2.
26 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity
dla pozycji Culling Mask odznaczamy naszą nowo utwo- Listing 3. Ciało klasy „ItemsController”
rzoną warstwę, co spowoduje ukrycie jej przedstawicieli public class ItemsController : MonoBehaviour
z obrazu kamery. Teraz przechodzimy do drugiej, po- {
mocniczej kamery i postępujemy dokładnie odwrotnie, public List<SwordController> swords;
czyli zaznaczamy naszą warstwę, a odznaczamy wszyst- private InventoryController inventoryController;
kie inne. Pojawia się jednak pytanie, której kamery ob-
void Start()
raz będzie brany pod uwagę jako pierwszy? Do określe-
{
nia ich priorytetu służy tak zwana głębia (ang. depth).
inventoryController = FindObjectOfType
W naszym przypadku pierwsza będzie renderowała
<InventoryController>();
kamera Main, stąd też w jej inspektorze pozostawiamy
}
domyślną wartość głębi (0), a kamera druga (podrzędna),
zgodnie z przyjętą regułą, dostanie wartość Depth rów- private void Update()
ną 1. Ostatnim krokiem będzie zmiana opcji Clear Flags {
na Depth only w kamerze pomocniczej, co spowoduje if (Input.GetKeyDown(KeyCode.Alpha1))
renderowanie z głębi w niewypełnionych obrazem miej- {
scach. Efekt widoczny jest na Ilustracji 9. ActiveSword(0);
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
ActiveSword(1);
}
if (Input.GetKeyDown(KeyCode.Alpha3))
{
ActiveSword(2);
}
}
Ilustracja 9. Naprawienie przenikania miecza przy uży- public void ActiveSword(int id)
ciu drugiej kamery {
for (int i = 0; i < swords.Count; i++)
Celowo zrzut ekranu został wykonany w tym samym {
miejscu co Ilustracja 8, aby dobrze zaobserwować po- swords[i].gameObject.SetActive
wstałą różnicę. (i == id && swords[i].isPurchased &&
!swords[i].gameObject.activeInHierarchy);
ZAKUP BRONI }
Kiedy wszystkie aspekty wizualne mamy już przygo- }
towane, możemy dezaktywować wszystkie obiekty bro-
public void BuySword(int id)
ni i przejść do napisania najważniejszego skryptu łączą-
{
cego wszystkie powyższe elementy w spójną, logiczną
int woodCost = 0;
całość. Tworzymy nowy plik języka C#, który nazywamy
int ironCost = 0;
na przykład ItemsController. Za jego pomocą zgodnie
z wcześniejszym planem będziemy chcieli móc dokonać switch (id)
zakupu wybranego miecza oraz obsłużyć jego aktywo- {
wanie w ręce gracza. Cały skrypt przedstawiony został case 0:
w Listingu 3. woodCost = 4;
28 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity
Na koniec, kiedy nasz skrypt jest już gotowy, cofnie- numerów, lecz w tym miejscu zostawiam was, młodzi
my się do początku, gdzie wspominaliśmy o obsłudze wojownicy i wojowniczki. Pamiętajcie, że średniowiecz-
zdarzeń klikniętych przycisków. Musimy teraz odszukać na przygoda nadal może trwać dzięki wam. Dlatego też
na Canvasie kuźni wszystkie nasze przyciski. W sekcji w materiałach na stronie internetowej PJr dorzucam
OnClick jako odwołanie przeciągamy obiekt ze skryp- ciekawą niespodziankę. Znajdziecie tam przygotowany
tem ItemsController, następnie rozwijamy listę z pra- przeze mnie prefab mrocznego rycerza, będącego na-
wej strony, wybieramy ItemsController > BuySword. Po jeźdźcą naszej wioski. Rozstawiając jego obiekty w świe-
wyborze metoda ta odsłoniła poniżej dodatkową rubry- cie gry, wioska nie będzie już taka spokojna. Dodałem
kę na wpisanie jej przyjmowanego parametru z identyfi- też skrypt AttackController, który pozwoli nam podjąć
katorem broni. W programowaniu indeksujemy od zera, walkę i pokonać rycerza przy pomocy wytworzonego
stąd też przycisk pierwszy zyska wartość 0, drugi 1, miecza. Uwaga! Konieczne jest podłączenie go w inspek-
a trzeci 2. Jeżeli wszystko udało się pomyślnie podpiąć, torze naszej postaci… Inaczej nie zadziała. Powodzenia!
możesz nazbierać trochę surowców i przejść do testów.
Kowal z pewnością nie może doczekać się pierwszego
klienta! Tomasz Błaszczyk
Autor książki „Tworzenie gier dla początkujących”,
PODSUMOWANIE na co dzień programista gier w katowickim studiu.
Na zakończenie pozostaje mi podziękować za tę Po godzinach korepetytor, pasjonat elektronicznej
wspólną przygodę, która, mam nadzieję, potwierdziła rozrywki oraz fan dobrej książki. Ceni sobie kre-
słowa, że w tworzeniu gier ogranicza nas jedynie nasza atywność, solidnie wykonaną pracę i pasję.
wyobraźnia. Temat, którego podjąłem się w serii swo-
HTTPS://TOMASZBLASZCZYK.GITHUB.IO/PORTFOLIO/
ich artykułów, jest na tyle wszechstronny, że można
TOMASZBLASZCZYK1998@GMAIL.COM
by rozbudowywać go jeszcze przez kolejne kilkanaście
30 [ 4 - 202 1 ]
PROGRAMOWANIE GIER
12+
32 [ 4 - 202 1 ]
Gra przygodowa „Enigma – Polacy, którzy uratowali świat”
Żeby nasz program działał bez błędów, w kodzie na Aktualizuje ono ekran, czyli powoduje „wyświetlenie
naszej platformie www.kodujwpythonie.pl wstawmy znak fizyczne na ekranie” wszystkich elementów, które usta-
komentarza na początku linii 36 (gdzie znajduje się kod liliśmy wcześniej. Musimy zwracać baczną uwagę na to,
„game_window()”) w skrypcie z Rozdziału 04. gdzie i ile razy wykonujemy tę funkcję w naszym pro-
Dla chętnych – możemy też zmienić definicję funkcji, gramie, ponieważ bardzo absorbuje pracę przeglądarki.
aby nasze parametry przyjmowały jakieś domyślne war- Jeśli będziemy wywoływać ją zbyt często, możemy spra-
tości. W takim przypadku nawet wywołanie bez argu- wić, że nasza przeglądarka w komputerze się „zawiesi”,
mentów da poprawny efekt. Jeśli chcemy tak zdefinio- a wtedy będziemy musieli ją zrestartować.
wać funkcję, używamy składni: Wróćmy do głównego programu. Wywołajmy naszą
zdefiniowaną funkcję game_window() z różnymi warto-
def nazwa_funkcji(parametr_1 = "wartość domyślna", ściami parametrów, a następnie każdorazowo funkcję
parametr_2 = 10): sleep(), aby przez kilka sekund zatrzymać obraz na
# ekranie. W ten sposób będziemy mogli zaobserwować
# blok kodu funkcji zmiany w obrazie.
Sprawdźmy, jak może wyglądać nasz przykładowy kod:
Ważna jest metoda pygame.image.load(file). Tworzy
ona specyficzny obiekt, który zawiera obraz z wczyta- # tworzymy pierwsze okno z tłem
nego pliku. Używamy go potem w poleceniu window. #
blit(background_picture, (0, 0)). import pygame
Skąd jednak wiemy, że możemy skorzystać z win- from time import sleep
dow_size oraz window dla metody blit()? Musimy
# definiujemy funkcję, która wyświetli obraz tła
opowiedzieć tu o koncepcji „przestrzeni nazw” w języku
# podany jako parametr
Python. Możemy ją (przynajmniej na wczesnym etapie
def game_window(title, background):
nauki programowania w języku Python) połączyć z klasą,
if not title or not background:
metodą lub funkcją. To nie są wszystkie możliwości, ale
return none
na początek będą w sam raz. W naszym przypadku mu-
simy zapamiętać pewną bardzo ważną zasadę. file = (
się do niego z każdej funkcji tego programu, jeśli funkcję # ustalimy tytuł okna, aby móc sprawdzać,
finiowanej klasy) jest rodzaju mutable, a obiekt window_ # wczytujemy plik tła
size (jako typ tuple) jest rodzaju immutable. O tych background_picture = pygame.image.load(file)
polecenie: pygame.display.update().
34 [ 4 - 202 1 ]
Gra przygodowa „Enigma – Polacy, którzy uratowali świat”
KATARZYNA.WASILKOWSKA@GMAIL.COM
36 [ 4 - 202 1 ]
PROGRAMOWANIE GIER
Przemysław Folholc
10+
38 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami
Klikamy przycisk FILE, który znajduje się w lewym Następnie przechodzimy do kategorii Security i włą-
górnym rogu ekranu, kolejno wybieramy z listy Publish czamy opcję Allow Third Party Sales. Pozwoli nam to
to Roblox. przeprowadzić test zakupu na uruchomionym lokalnie
serwerze. Po sprawdzeniu możesz wyłączyć tę opcję.
Nazwa projektu jest dowolna, można go nazwać na przy- Zaczynamy budowanie sklepu od dodania ScreenGui do
kład Gamepass Shop. StarterGui, które znajduje się w Explorerze.
Po uruchomieniu projektu przechodzimy do usta-
wień gry. Przycisk Game Settings znajdziesz w kategorii
HOME. Do tych ustawień można również dostać się za
pomocą przycisku FILE. Ilustracja 5. Dodany „ScreenGui”
Ciekawostka
Zmiana punktu zakotwiczenia „AnchorPoint” pozwala na
łatwiejsze wycentrowanie elementu GUI.
40 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami
W sklepie nie ma jeszcze żadnych przycisków do Zaznaczenie jej pozwoli na rozciągnięcie elementu gra-
przepustek. Aby to zmienić, dodaj dwa ImageButton do ficznego na pełny ekran.
Frame.
Wskazówka!
function Open()
-- zmień we Frame Dodanie danego elementu z Toolboxa polega na kliknię-
-- właściwość Visible na true ciu na niego lewym przyciskiem myszy.
script.Parent.Parent.Frame.Visible = true
end
function Exit()
-- zmień we Frame
-- właściwość Visible na false Ilustracja 18. Dodanie „GravityCoil”
script.Parent.Parent.Visible = false
end
Po napisaniu kodu można uruchomić grę i sprawdzić, Kiedy wybierzemy narzędzie, zostaniemy zapytani o to,
w jaki sposób działa otwieranie i zamykanie sklepu za czy umieścić narzędzie w starter pack. Zgadzamy się,
pomocą przycisków. Jak możesz zauważyć, w powyż- ponieważ należy je przetestować przed dodaniem go do
szym kodzie znajduje się również opcja zamykania skle- przepustki. Nie chcemy przecież, żeby ktoś zapłacił ro-
pu podczas skoku. Może się to przydać, kiedy gra zosta- buxami za niedziałające dodatkowe narzędzie.
nie uruchomiona na telefonie.
42 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami
TWORZENIE PRZEPUSTEK
Przechodzimy do strony Robloxa pod adres WWW:
https://www.roblox.com/home i klikamy Create lub
wykorzystujemy bezpośredni link: https://www.roblox.
com/develop. Przechodzimy do My Creations.
Ilustracja 21. Test „GravityCoil” Przy aktualnie tworzonym projekcie klikamy zębatkę,
a następnie wybieramy z listy Create Pass.
Jeżeli jakieś narzędzie nie działa, spróbuj poszukać inne-
go. Często zdarza się, że obiekty z Toolboxa nie działają
tak jak powinny.
Wskazówka!
44 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami
function AddToolSpeedCoil(player)
local cloneSC = sC:Clone()
Ilustracja 32. Zmieniamy nazwę Ilustracja 33. cloneSC.Parent = player.Backpack
Dodanie dwóch na „AddGravity- Elementy po end
„RemoteEvent” Coil” oraz „Add- zmianie nazwy
do „Replicated SpeedCoil” -- kiedy gracz zostanie dodany
Storage”
game.Players.PlayerAdded:Connect(function(player)
Kolejnym krokiem jest utworzenie odpowiedniego pro- -- oraz dodany Character
gramu serwerowego. Tworzymy więc nowy skrypt do player.CharacterAdded:Connect(function()
ServerScriptService i nazywamy go AddTools.
-- ustaw zmienne logiczne na false
local hasPassGC = false
local hasPassSC = false
CZAS NA TESTY!
Odpalamy grę, naciskając przycisk Play. W ten spo-
sób możemy sprawdzić, czy gracz, który zakupił prze-
pustkę, dostanie oczekiwany przedmiot. Nie musimy
kupować przepustek do tworzonego projektu, ponieważ
Ilustracja 36. Dodanie dwóch „LocalScript” właściciel posiada wszystkie przepustki tej gry.
46 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami
Przemysław Folholc
Programista oraz pasjonat tworzenia gier. Trener
w Gigantach Programowania. Produkcje, nad
którymi pracuje, można zobaczyć na jego profilu
w Robloxie pod nickiem PrzemekV5 i grupie „Dewe-
loperzy Robloxa” oraz na fanpage’u FoloGames na
Facebooku: https://www.facebook.com/fologames.
PFOLHOLC@GMAIL.COM
Ilustracja 45. Gracz otrzymał narzędzie
48 [ 4 - 202 1 ]
PROJEKTY
Natalia Trzaska
8+
CIEKAWOSTKA
Dzisiaj joystick kojarzony jest z padem, dzięki któremu
można grać na konsoli. Jednak został on opatentowany już
w 1926 roku i dopiero w latach 60. zaczął służyć graczom do
gry. Wcześniej był używany w lotnictwie i kosmonautyce.
Ilustracja 1. Przykładowy robot
50 [ 4 - 202 1 ]
Programowanie zdalnego sterowania
Warto wiedzieć
gramowania joystickow. W przykładzie robot będzie ru-
szał się zgodnie ze strzałkami, które zostaną naciśnięte.
Programując joystick, można dodać przyciski zmieniające Z zakładki „Zdalne sterowanie” przeciągnij bloczek
prędkość. Wówczas będziesz mieć nie tylko kontrolę nad (Ilustracja 8).
kierunkiem jazdy, ale też prędkością.
52 [ 4 - 202 1 ]
Programowanie zdalnego sterowania
Najtrudniejszym elementem jest jazda do tyłu, ponie- Ostateczny program powinien wyglądać tak jak na
waż powinieneś/powinnaś ustawić „Rozpocznij ruch w Ilustracji 13.
tył”, lecz nie ma takiego bloku.
Do rozwiązania tego problemu użyj ujemnej prędko- Natalia Trzaska
ści, to znaczy zamiast 100% ustawiamy –100%. Wtedy
Instruktorka robotyki w „Planecie Robotów”, stu-
twój robot będzie poruszał się do tyłu.
dentka Politechniki Warszawskiej oraz pasjonatka
Należy pamiętać o późniejszej zmianie ujemnej pręd- konstruowania i programowania robotów
kości. W przykładzie prędkość zmienia się za każdym ra-
zem, gdy nie naciskamy żadnego przycisku. TRZASKA.NATALIA01@GMAIL.COM
!
Zapamiętaj Ćwicz w domu
օ Stwórz dodatkowy suwak zmieniający prędkość. օ Przy pomocy robotów do nauki nauczysz się kon-
struować i programować roboty.
օ Do programu dodaj bloczki zajmujące się światłem
i dźwiękiem. օ Budowanie i programowanie robotów rozwija
nasze inżynierskie umiejętności i wyobraźnię
przestrzenną.
54 [ 4 - 202 1 ]
PROJEKTY
Urszula Piechota
10+
ANDROID STUDIO – PROGRAM, Takim środowiskiem dla Androida jest Android Studio.
W KTÓRYM PRACUJĄ PROFESJONALIŚCI Można je bez problemu pobrać ze strony https://deve-
Pewnie wiele razy zastanawialiście się, jak powstają loper.android.com/studio/index.html. Jego instalacja
aplikacje na smartfony. Co jest do tego potrzebne? Je- jest bardzo prosta, wystarczy podążać za poleceniami
śli myślicie, że smartfon, to macie trochę racji – w koń- instalatora. Aplikacja jest w języku angielskim, ale jak
cu na czymś trzeba testować tworzoną aplikację – ale wiesz, programista musi znać dobrze ten język. Na wy-
bez smartfona również da się programować. Trudno to padek, gdyby pojawily się problemy, instrukcję instalacji
natomiast zrobić bez środowiska programistycznego. w języku polskim, krok po kroku, znajdziecie na stronie
https://istis.pl/polonistka-programuje/przygotowuje-
my-piaskownice/ i kolejnych, widocznych po kliknięciu
przycisku „Następna lekcja” na dole każdego artykułu.
Jeśli udało ci się już zainstalować Android Studio,
Warto wiedzieć
możemy zacząć pracę nad naszą aplikacją. Kiedy uru-
chomisz środowisko po raz pierwszy, pojawi się okien-
Piaskownicą (ang. sandbox) informatycy nazywają wy- ko pozwalające zdecydować, co chcesz zrobić. Wybierz
dzielone środowisko, w którym uruchamiane są programy. pozycję „Start a New Android Studio Project”. Kiedy bę-
Program uruchomiony w takiej piaskownicy ma dostęp tylko dziesz uruchamiać Android Studio po raz kolejny, takie-
do tego, do czego mu pozwolimy. Dzięki temu aplikacja nie
go okienka już nie będzie – wtedy żeby stworzyć nowy
projekt, trzeba wybrać File→ New → New Project…
popsuje nam nic na komputerze. Takich piaskownic używa
się głównie do uruchamiania programów, którym nie ufamy.
56 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida
Wybierz takie, żeby później móc go łatwo znaleźć! Do- to taki wydzielony kawałek kodu, który ma za zadanie
myślnie jest to \users\USER\AndroidStudioProjects. robić jakąś konkretną rzecz. Metoda onCreate(Bundle
Ostatnim polem, które ustawimy, będzie Language – savedInstanceState) jest metodą androidową, czyli
wybierz w nim wartość Java. To pole pozwala wybrać ję- taką, która zawsze musi być uruchomiona. Takich metod
zyk programowania, którego będziemy używać podczas jest kilka, ta jest najważniejsza, ponieważ uruchamia się
pisania kodu. na samym początku.
Jak zapewne zauważyliście, na tym ekranie mamy » super.onCreate(savedInstanceState); – mówi sys-
jeszcze jedno ciekawe pole: Minimum SDK. Mówi nam temowi, że ma zrobić wszystko to, co domyślnie robi
ono, na jakiej najniższej wersji systemu Android aplika- się przy uruchamianiu każdej aplikacji. Dzięki temu
cja będzie działać. Zostawimy je ustawione domyślnie – będziemy mogli na przykład zrobić coś wcześniej
obecnie niewiele jest urządzeń mających niższą wersję (wtedy piszemy kod przed tą linijką) albo nie robić
systemu niż Lollipop. Jeśli jednak twój telefon ma starszy tego wcale, kiedy na przykład mamy zamiar sami po-
system, ustaw sobie w tym polu swoją wersję systemu wiedzieć aplikacji, co ma robić na początku.
i kliknij Finish. » setContentView(R.layout.activity_main); – mówi,
że wygląd pierwszego ekranu ma być taki, jak w pliku
ZACZYNAMY PISAĆ KOD activity_main.xml.
Android Studio stworzyło dla nas bardzo prostą ak-
tywność, która na razie jeszcze nic nie robi. Kod, który Przyjrzyj się teraz kolumnie widocznej po lewej stronie
powstał, wygląda tak: kodu. Masz tam pokazaną hierarchię plików w aplika-
cji – czyli pliki i ich położenie, podobnie jak możesz to
Listing 1. Klasa „MainActivity” zobaczyć w komputerze w Eksploratorze plików. Andro-
package com.example.samochodziki; id Studio pokazuje nam od razu położenie naszej klasy
import androidx.appcompat.app.AppCompatActivity; MainActivity, tak jak widać na Ilustracji 2. Jeśli w polu
import android.os.Bundle; na górze nie masz ustawionej wartości Project, tylko
inną, np. Android – przełącz ją na Project.
public class MainActivity
Jak widzisz, Android Studio stworzyło nam sporo
extends AppCompatActivity {
różnych katalogów i plików. Wszystkie one są ważne, ale
@Override nie musimy się nimi teraz zajmować. Interesuje nas te-
protected void onCreate(Bundle raz, oprócz klasy MainActivity, którą już obejrzeliśmy,
savedInstanceState) { layout activity_main.xml. Znajdziesz go w katalogu res/
super.onCreate(savedInstanceState); layout (Ilustracja 2). Otwórz go, klikając dwa razy myszką.
setContentView(R.layout.activity_main);
}
}
Warto wiedzieć
Plik, w którym znajduje się nasz kod, nazywamy klasą. Takie
pliki mają rozszerzenie .java, a w przypadku Kotlina – .kt.
Linijka public class MainActivity extends App Nazwy kolejnych wersji systemu Android są angielskimi
CompatActivity mówi nam, że klasa nazywa się Main- nazwami różnych słodyczy, zaczynającymi się od kolejnych
Activity (tak domyślnie nazywa się zwykle główną liter alfabetu. Lollipop, czyli Android 5.0, oznacza lizaka.
Kolejne wersje to Marshmallow, Nougat, Oreo, Pie (z angiel-
aktywność aplikacji – dosłownie znaczy to właśnie
skiego ciasto). Niestety później Google przestał nadawać
„główna aktywność”). Nie będziemy teraz omawiać ca- kolejnym wersjom słodkie nazwy. Obecnie najnowsza wersja
łości kodu, zrozumiesz go z czasem, skupimy się tylko na Androida to 11.
tym najważniejszym dla nas fragmencie, czyli na meto-
dzie onCreate(Bundle savedInstanceState). Metoda
58 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
Ilustracja 2. Hierarchia plików w „Android Studio” app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget
.ConstraintLayout>
Zobaczysz edytor graficzny, który pozwala na zbudo-
wanie layoutu. Layout oznacza po polsku „układ”. Jest to Ten kod nie jest napisany w Javie, a w XML– to specjal-
plik, w którym decydujemy o tym, jak ma wyglądać kon- ny język, używany do tworzenia dokumentów w sie-
kretny ekran naszej aplikacji. Nasz na razie jest pusty. ci WWW, który w Androidzie wykorzystywany jest do
Można go zmieniać za pomocą tego edytora graficzne- łatwego tworzenia grafiki. Każdy element ma wygląd
go, który widzisz, ale żeby zrobić coś bardziej skompli- <Typ> </Typ> – nazywamy to znacznikami. Pomiędzy
kowanego, będzie nam potrzebny widok kodu. Dlatego symbolami < i > możemy wstawić informacje o tym, jak
popatrz teraz na prawą stronę ekranu – znajdziesz tam ma wyglądać dany element, a między <Typ> i </Typ>
takie trzy przyciski, jak na Ilustracji 3. możemy wstawić inne elementy, które mają się znaleźć
w środku tego pierwszego. W naszym layoucie mamy już
wstawiony element typu ConstraintLayout, a wewnątrz
niego element TextView. O pozostałych polach wpisa-
Ilustracja 3. Przyciski do zmiany widoku
nych w elementy będziemy jeszcze mówić później. Teraz
Zaznaczony przycisk Design pozwala widzieć edytor wystarczy nam wiedza, że odpowiadają one za to, gdzie
graficzny. Przycisk Code pokazuje sam kod, a przycisk ma się element znaleźć i jak ma wyglądać. TextView to
Split – kod i edytor graficzny jednocześnie. Jest to naj- pole, w które można wpisać tekst. Wpisujemy go, dodając
wygodniejsza metoda pracy z layoutami, dlatego kliknij wewnątrz pola atrybut android:text="Hello World!".
teraz przycisk Split. Każde z tych pól zaczynających się od „android” lub
Na środkowej części ekranu zobaczysz taki mniej „app” nazywamy atrybutem.
więcej kod:
W okienku z rysunkiem zielonego robocika powinno Nie zamykaj emulatora, wtedy przy kolejnym uruchomie-
pojawić się app – to nazwa modułu w naszej aplikacji niu aplikacji nie będzie trzeba tyle czekać. A będziemy ją
(o modułach powiemy sobie innym razem). W okien- uruchamiać często, żeby zobaczyć efekt naszych działań.
ku z rysunkiem szarego telefonu powinieneś/powin-
naś zobaczyć nazwę swojego telefonu. Żeby uruchomić TWORZYMY SAMOCHODZIKI
aplikację, należy kliknąć zielony trójkącik, który znajdu- Teraz nareszcie możemy zacząć tworzyć nasze sa-
je się obok. Jeśli nie widzisz nazwy telefonu, to się nie mochodziki. Na początku będziesz potrzebować dwóch
60 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida
LinearLayout oznacza, że to, co tam umieścimy, będzie Jak widzisz, ImageView ma te same atrybuty
się samo układało w rządku, tak jak zaraz zobaczysz. android:layout_width i android:layout_height, co Lin-
Teraz wstawimy sobie do środka samochodziki. earLayout. Każdy element musi je mieć. Tym razem nada-
Znajdź swoją aplikację w Eksploratorze Windows – bę- jemy obrazkowi konkretny rozmiar – 80 dp na wysokość
dzie w tym katalogu, który podałeś/aś przy instalacji i 80 dp na szerokość. Za pomocą atrybutu android:src
Android Studio. U mnie jest to C:\AndroidAplikacje\Sa- ustawiamy w polu obrazek. Atrybut android:id pozwa-
mochodziki\, tak jak widać na Ilustracji 1. Teraz wejdź la na nadanie nazwy elementowi, żeby potem móc się
do katalogu app\src\main\res\drawable\ i tu wklej do niej odnieść w kodzie. Nazwa zawsze musi się zaczy-
obrazki samochodów. Nazwij je auto1.png i auto2.png. nać od @+id/ i nie może się powtarzać – każdy element
Teraz wróć do kodu. Wstawimy do niego element musi mieć inną nazwę.
ImageView, który służy do wyświetlania obrazków. Nasz Po prawej stronie możesz zobaczyć, jak teraz wy-
kod będzie teraz wyglądać tak: gląda nasz ekran – pojawił się nasz samochodzik! Teraz
wstawimy drugi, dokładnie tak samo.
Listing 3. Plik „activity_main.xml” z jednym samo-
chodzikiem Listing 4. Plik „activity_main.xml” z dwoma samo-
chodzikami
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas <?xml version="1.0" encoding="utf-8"?>
.android.com/apk/res/android" <LinearLayout xmlns:android=
android:layout_width="match_parent" "http://schemas.android.com/apk/res/android"
android:layout_height="match_parent" android:layout_width="match_parent"
> android:layout_height="match_parent"
>
<ImageView
android:id="@+id/auto1" <ImageView
android:layout_width="80dp" android:id="@+id/auto1"
android:layout_height="80dp" android:layout_width="80dp"
android:src="@drawable/auto1" android:layout_height="80dp"
/> android:src="@drawable/auto1"
</LinearLayout> />
<ImageView
android:id="@+id/auto2"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/auto2"
Ciekawostka
/>
</LinearLayout>
Skrót „dp” lub „dip” oznacza jednostkę gęstości ekranu, nie- Na ekranie mamy już dwa samochodziki, ale są usta-
zależną od fizycznej wielkości ekranu. Zamiast tego można
użyć też skrótu px (piksele), in (cale), mm (milimetry), pt wione jeden za drugim, a my chcemy, żeby były jeden
(punkty – jeden punkt to 1/72 cala). W przypadku czcionek pod drugim – inaczej nie mogłyby się ze sobą ścigać.
używa się skrótu „sp” (skala), który oznacza prawie to samo Dlatego dodamy teraz do LinearLayout atrybut, któ-
co „dp”, ale jest dostosowany do fontu. Najczęściej używa ry powie systemowi, że ma układać elementy pionowo:
się skrótu „dp” – dzięki temu obraz na różnych ekranach
wygląda podobnie. android:orientation="vertical". Nagłówek Linear-
Layout powinien teraz wyglądać tak:
62 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida
!
Zapamiętaj Ćwicz w domu
օ Obrazki przechowujemy w obiekcie „ImageView”. օ Spraw, żeby samochodzik poruszał się w pionie.
Animujemy je za pomocą obiektu „ObjectAnima-
օ Dodaj trzeci samochodzik.
tor”. Parametr „translationX” przesuwa obrazek
w poziomie, a „translationY” w pionie. օ Zmień wielkość samochodzika.
64 [ 4 - 202 1 ]
BEZPIECZEŃSTWO
Łukasz Basa
12+
ŚWIAT „WODNEGO INTERNETU” staje piękny dom z adresem nazywanym „adresem IP”.
Czyli jeden z sąsiadów mieszka na wyspie UPC pod ad-
resem 1.2.3.4, a drugi mieszka pod adresem 5.6.7.8. Może
Ważna informacja
też zdarzyć się, że wiele osób mieszka pod jednym ad-
Zanim przeczytasz: poniżej znajdziesz obrazowy opis resem (na przykład w hotelu czy biurowcu danej firmy).
działania rozwiązań VPN. Nie jest to tekst techniczny Mieszkańcy świata „wodnego Internetu” za każdym
i przyjmuje on poziom dużego uproszczenia. razem, gdy chcą przeczytać artykuł na stronie inter-
netowej bezpieczny.blog, muszą wybrać się w podróż
przez ocean Internetu na wyspę bezpieczny.blog. Jest
Wyobraź sobie, że Internet to wielki i nieskończony oce- to długa i czasem niebezpieczna wyprawa. Każdy z nich
an, na którym znajdują się różne wyspy. Wyspy te budu- płynie własną łódką w kierunku swojej docelowej wyspy.
ją najczęściej dostawcy Internetu (tak aby mógł na nich Świat Internetu jest tak skonstruowany, że na każdej ło-
zamieszkać ktoś taki jak ty), ale robią to także twórcy dzi wywieszona jest wielka flaga z adresem IP, z którego
stron internetowych. Mieszkańcy tych wysp nazywa- wyruszamy, oraz adresem wyspy, na którą płyniemy. Po
ją się „internautami”. Tak więc kupując Internet domo- drodze ci bardziej spostrzegawczy widzą innych inter-
wy od firmy UPC, zostajesz mieszkańcem „wyspy UPC”, nautów płynących w tym samym lub innym kierunku.
a kupując do swojego smartfona kartę SIM firmy Orange Widzą, jak są ubrani, skąd wracają, dokąd płyną. Potrafią
(wraz z pakietem Internetu) – zostajesz mieszkańcem nawet podpłynąć na tyle blisko, żeby podsłuchać, o czym
„wyspy Orange”. Każdy z mieszkańców danej wyspy do- rozmawiają z innymi internautami.
66 [ 4 - 202 1 ]
Czym jest VPN?
Tak właśnie (w bardzo dużym uproszczeniu) wyglą- stępują wtedy, gdy widzicie zamkniętą kłódkę na pasku
da Internet. Inni ludzie, będący w tej samej sieci, mogą adresu w przeglądarce internetowej. Warto zapamiętać,
obserwować twoją łódź lub śledzić twoje wyprawy że taki most jest szybko budowany, gdy internauta za-
(przy braku szyfrowania, o czym później), a serwer, któ- pragnie odwiedzić jakąś wyspę, która wspiera szyfrowa-
ry odwiedzasz, zna twój adres IP i wie dokładnie, skąd nie, a po zakończeniu wizyty jest bezpowrotnie niszczo-
„przypływasz”. ny (czyli technicznie połączenie jest zakończone). Dzięki
tym mostom właściciel wyspy docelowej nadal zna adres
BUDUJEMY MOSTY! internauty, ale nikt poza nimi dwoma nie wie, co w ra-
Z uwagi na zagrożenie dla poufności danych, które mach mostu jest przenoszone i o czym internauta roz-
z nami płyną, wiele wysp (takich jak na przykład banki, mawia z drugą stroną.
sklepy internetowe czy nawet strona, na której jesteście)
zdecydowało się na zbudowanie mostów bezpośrednio SCHODZIMY POD WODĘ!
z twojego domu, aż na wyspę docelową. Każdy internau- Aby zapewnić jeszcze większy poziom poufności, zbu-
ta ma swój most, oddzielny na każdą wyspę, i nikt inny dowane zostały wyspy o nazwie VPN ( Virtual Private Ne-
nie jest w stanie zobaczyć, co się na tym moście dzie- twork – Wirtualna Sieć Prywatna). Usługa ta działa w ten
je. Takie „mosty” nazywamy szyfrowaniem SSL (Secure sposób, że gdy internauta zapragnie odwiedzić jakąś
Socket Layer) lub TLS (Transport Layer Security). Wy- stronę internetową i jest aktualnie podłączony do VPN-a,
68 [ 4 - 202 1 ]
Czym jest VPN?
SKĄD WZIĄĆ VPN-A? kupić może jedynie osoba pełnoletnia, więc uzgodnij to
Jeżeli mamy odpowiednie umiejętności, serwer VPN najpierw ze swoimi rodzicami lub opiekunami.
najlepiej skonfigurować samodzielnie, wykorzystując do
tego na przykład zasoby chmury Google Cloud Platform, CZY VPN OD FIRMY TRZECIEJ TO JEDYNA
Amazon AWS czy Microsoft Azure. Jeżeli takich umiejęt- MOŻLIWOŚĆ?
ności nie mamy, pozostaje nam skorzystać z usługi firmy Oczywiście, że nie. Usługę VPN można także skon-
trzeciej, która za pewną opłatą udostępnia swoje serwe- figurować samemu, jeżeli posiadamy wykupiony serwer
ry. Na rynku istnieje bardzo wielu dostawców tego typu typu VPS (Virtual Private Server) lub inny, u dostawcy
usług – istnieją zarówno darmowe, jak i płatne wersje. takiego jak OVH, Google Cloud czy też Amazon. Wyma-
Przestrzegam jednak przed korzystaniem z darmowych ga to już jednak większej wiedzy technicznej. Osobom
sieci VPN, w myśl zasady, że wszędzie tam, gdzie nie zainteresowanym pragnę polecić skrypt automatyzujący
płacisz, to ty jesteś towarem. Tak więc, jeżeli potrzebu- cały proces, który jest dostępny w ramach repozytorium
jesz tego typu rozwiązania, to warto przeznaczyć pewną Github (https://github.com/trailof bits/algo). Świetnie
sumę pieniędzy, aby mieć pewność, że nasza komunika- sprawdza się w tym, aby w szybki i prosty sposób po-
cja nie jest podsłuchiwana, a informacje o tym, kiedy łą- stawić serwer IPSec na posiadanym przez nas hostin-
czyliśmy się z serwerem VPN i jak wyglądała nasza dalsza gu, a nawet wygenerować gotowe pliki konfiguracyjne
aktywność, nie są przechowywane i sprzedawane dalej. dla naszych urządzeń. W moim przypadku doskonale
Firmy oferujące usługi serwerów VPN wyrastają jak sprawdza się w połączeniu z usługą Amazon Lightsail.
grzyby po deszczu i prześcigają się w zapewnieniach, jak
bardzo dbają o naszą prywatność. Bardzo często są one NA KONIEC…
zarejestrowane w egzotycznych miejscach oraz przeko- Korzystanie z VPN nie zwalnia nikogo z obowiązku
nują, że ich polityką jest brak logowania działań użyt- przestrzegania prawa. Jeżeli jedyną motywacją do uży-
kownika (tak zwane „no logs policy”). Warto wiedzieć, cia VPN jest ukrycie swojej tożsamości w celu wykonania
że historia już niejednokrotnie pokazała drugą stronę niedozwolonej czynności (na przykład użytkowania po-
medalu: w przypadku podejrzenia popełnienia prze- branej z Internetu nielegalnej kopii oprogramowania), to
stępstwa i zwrócenia się przez organy ścigania firmy te nie warto tego robić.
udostępniają jednak wiele informacji na temat swoich
klientów. Oznacza to, że często „no logs policy” to jedy- Łukasz Basa
nie chwyt marketingowy. Bezpiecznik, entuzjasta technologii, miłośnik alter-
Nie będziemy tu polecać żadnego konkretnego do- natywnych metod parzenia kawy.
stawcy. Jeżeli jesteś zainteresowany/a skorzystaniem
z takiej usługi, to z pewnością znajdziesz ich całą listę, KONTAKT@BEZPIECZNY.BLOG
HTTPS://BEZPIECZNY.BLOG
korzystając z wyszukiwarki. Pamiętaj tylko, że usługi wy-
!
Zapamiętaj Ćwicz w domu
օ VPN pozwala na nawiązanie zdalnego, szyfrowane- օ Poszukaj w Internecie informacji o usłu-
go połączenia z drugim komputerem. gach VPN. Porównaj je i zobacz, czym się one
charakteryzują.
օ VPN nie zapewnia anonimowości w Internecie.
օ Sprawdź, jak zmienił się twój adres IP po połą-
օ Nie korzystaj z darmowych serwerów VPN, bo mogą
czeniu z VPN.
okazać się bardziej niebezpieczne niż ich brak.
[ PPROGR
ROGR AMI STAJR . PL ] 69
PROGRAMISTYCZNE WYZWANIA
Konrad Jagaciak
Programistyczne wyzwania
Kolejna odsłona programistycznych wyzwań to nowe zadania „z haczykiem”, które można
rozwiązać na różne sposoby. Mają one zainspirować do samodzielnej pracy, ale też udzie-
lić wskazówek, które mogą ci w tym pomóc. Przeczytaj zadania i spróbuj je samodzielnie
rozwiązać, a dopiero potem przeczytaj do nich wskazówki.
SCRATCH: JAK LOSOWAĆ WYRAZY? ze słowami, spośród których jedno ma zostać wylosowa-
W programie Scratch znajdziemy bloczek pozwa- ne. Tworząc nową listę, możesz jej nadać nazwę Słowa.
lający na wygenerowanie liczby z podanego przez nas
zakresu. Bloczek losuj liczbę od 0 do 10 znajdziemy w
kategorii Wyrażenia.
70 [ 4 - 202 1 ]
Programistyczne wyzwania
bloczek, będzie wylosowany – będziemy mieć mecha- na... znajdującego się w kategorii Czujniki. Trybem, jaki
nizm zwracający wylosowane słowo. należy wybrać na bloczku, jest bez przeciągania.
Michał Kremzer
72 [ 4 - 202 1 ]
Liczbę trzycyfrową zmniejszono o n% i otrzy-
Rozwiązania:
10. 4.
9. 100...5 (98 zer między jedynką i piątką).
8. m = 37, n = 18.
7. 0 lub 5.
6. 91.
5. 101.
4. 200.
3. 432.
2. a = -0,25; b = -1,75; c = -0,5n – 1; d = 0,5.
1. n = 100m, m jest liczbą całkowitą nieujemną.
Aleksandra Zacharska
Lubisz programować?
Dołącz do codeweekowej społeczności!
Rozpoczynamy odliczanie – już niebawem rusza największe w Europie święto programo-
wania. Jak co roku dziesiątki tysięcy uczniów, rodzin, a nawet całych szkół ze wszystkich
stron świata przez dwa tygodnie będą programować w ramach CodeWeek. Warto do nich
dołączyć!
Ciekawostka
zem programować, ale też ćwiczyć logiczne myślenie,
rozwiązywać zagadki, organizować wirtualne zajęcia czy
gry.
Europejski Tydzień Kodowania to jedyny taki tydzień w roku,
Takim wydarzeniem może być wspólny klasowy (albo który trwa… dwa tygodnie! W tym roku CodeWeek świętuje-
koleżeński) projekt w Scratch, minhackathon, turniej ła- my w dniach 9–24 października. Swoje wydarzenia możesz
migłówek logicznych, lekcja informatyki, na której opo- jednak zgłaszać cały rok. Koniecznie poszukaj ich na mapie
wiesz swoim kolegom o CodeWeek, a nawet konkurs CodeWeek!
plastyczny związany z programowaniem i wiele innych…
76 [ 4 - 202 1 ]
WYDARZENIA I EDUKACJA
Polska od kilku lat konsekwentnie zwiększa liczbę » kurs „Programowanie w Scratch Junior z Klubem
zorganizowanych inicjatyw związanych z nauką pro- Młodego Programisty” – skierowany do tych wszyst-
gramowania. Ubiegłoroczny wynik przeszedł nasze naj- kich, którzy nie mieli jeszcze okazji spróbować swo-
śmielsze oczekiwania! Zajrzyj na gov.pl/koduj/codeweek ich sił w kodowaniu;
i obejrzyj filmowe podsumowanie „Polska zwycięzcą » kurs „Programowanie w Scratch 3.0 z Klubem Mło-
CodeWeek 2020”. dego Programisty” – na ten kurs zapraszamy przede
Czy twoja szkoła też jest częścią CodeWeek? Jeśli nie, wszystkim starszych uczniów szkół podstawowych
koniecznie zeskanuj kod QR i sprawdź, jak możesz do- i tych, którzy czują, że w Scratchu Juniorze progra-
łączyć do inicjatywy, a potem zaproś do zabawy swoich mować mogą nawet z zamkniętymi oczami. 😉
nauczycieli i rodziców.
W ciągu ośmiu spotkań nauczysz się tworzyć – najpierw
ZAINSPIRUJ SIĘ mniej, a później już nieco bardziej złożone – programy,
Jak zaangażować się w #CodeWeek2021? Nie ma tutaj a wszystko poprzez przygotowywanie krótkich animacji
ograniczeń wiekowych, terytorialnych czy jakichkolwiek i gier. Musisz tego spróbować! Na uważnych i wytrwa-
innych. CodeWeek może być początkiem fantastycznej łych uczestników czeka ponadto certyfikat. Kto wie,
przygody, a nawet nowej pasji – dla wszystkich! może okaże się przydatny w dalszym rozwoju?
Jak powinno wyglądać takie wydarzenie? Wszystko Co to ma jednak wspólnego z CodeWeek? Jeśli zachę-
zależy od twojego pomysłu. Ważne, aby rozwijało umie- cisz do udziału w kursie swoich kolegów i koleżanki (a może
jętności związane z programowaniem i logicznym my- też nauczyciela informatyki albo matematyki?), a następnie
śleniem oraz wykorzystaniem narzędzi cyfrowych. Do zarejestrujesz tę inicjatywę na codeweek.eu/add – stajesz
CodeWeek można też zgłosić lekcje informatyki, które się częścią codeweekowej społeczności!
odbywają się w twojej szkole.
Jeśli pierwszy raz słyszysz o Europejskim Tygo- DO DZIEŁA!
dniu Kodowania, koniecznie zajrzyj na oficjalną stronę Jeżeli masz jakiekolwiek pytania lub wątpliwości do-
codeweek.eu oraz na naszą – koduj.gov.pl. Dowiesz się tyczące Europejskiego Tygodnia Kodowania, jesteśmy
tam więcej o polskiej edycji i znajdziesz szereg inspi- do twojej dyspozycji: programowanie@mc.gov.pl. Zrobi-
racji. Zawsze możesz też napisać do biura CodeWeek: my wszystko, by pomóc.
programowanie@mc.gov.pl. Zaczynamy więc wielkie odliczanie i wkrótce widzimy
Szczególnie polecamy udział w kursach programo- się na Europejskim Tygodniu Kodowania. Bądź z nami!
wania w Scratch na platformie OSE IT Szkoła, w których
uczestniczy już kilka tysięcy osób! Wystarczy wejść na Aleksandra Zacharska
it-szkola.edu.pl i wyszukać: NASK, ambasadorka CodeWeek w Polsce
78 [ 4 - 202 1 ]
Rok przestępny, czyli jak stworzyć algorytm
sprawdzający w Scratchu i Pythonie?
uczniowie klas 90 min
VII-VIII
Justyna Klimczyk
Przed rozpoczęciem tworzenia programu należy przypomnieć uczniom wykorzystywane w Pythonie operatory
porównania (==, =!), operatory logiczne (and, or) oraz operator arytmetyczny (%).
Należy zwrócić uwagę uczniów na to, że:
■ o ile w Scratchu mogliśmy obyć się bez zmiennej (wystarczy wykorzystać blok odpowiedź), o tyle w Pytho-
nie zmienna jest konieczna;
■ wcięcia odgrywają w Pythonie kluczową rolę.
5. Samodzielna praca ucznia (20 min).
Uczniowie pracują samodzielnie w oparciu o kartę pracy, udoskonalają skrypt. Nauczyciel wspiera uczniów
w rozwiązywaniu pojawiających się problemów dotyczących składni. Nie ingeruje w pomysł ucznia.
6. Podsumowanie zajęć i ewentualna ocena prac uczniów (5 min).