Důležité!

Pozorně si přečtěte pokyny k výuce během rektorského volna!

Manuál PB071

Podrobná dokumentácia všetkých postupov a nástrojov používaných v predmete.

Akékoľvek návrhy, chyby a iné pripomienky prijímame emailom alebo v diskusnom fóre predmetu.

Spätnú väzbu oceníme a pomôže to tiež ostatným študentom! 🙂

Začíname

Návody v tomto manuáli slúžia na to, aby sme vedeli používať a nastaviť si všetky nástroje, ktoré počas predmetu budeme používať, či už doma, alebo na fakultných počítačoch.

Kapitoly manuálu sú rozdelené podľa operačných systémov, každému OS sa totiž viaže rozdielna sada nástrojov/postupov. Pri výbere určitej cesty je vhodné dohodnúť sa s cvičiacim. Nemusí nám totiž vedieť neskôr poradiť.

V úvode kapitoly sú uvedené možnosti, ako na danom OS pracovať:

Vývoj na Linuxe

Vývoj na Windows

Vývoj na macOS

Odovzdávanie a kontrola domácich úloh prebieha na študentskom serveri Aisa, s ktorým sa na začiatku zoznámime. Na fakultných počítačoch/Aise nemusia byť vždy dostupné všetky programy, ktoré potrebujeme, programy ale môžeme pridať cez modulový systém.

Na prvej prednáške tiež budú predstavené programy na spravovanie kódu, verzovacie systémy — konkrétne git, pomocou ktorého budeme ukladať svoj kód.

Rozdiely oproti jazyku Python

Po prvých cvičeniach tiež pravdepodobne budeme dosť uvažovať nad syntaxou C a odporúčame čerstvo po absolvovaní Úvodu do programovania pozrieť rozdiely oproti jazyku Python.

Kde hľadať dokumentáciu jazyka

  • Ak vyvíjame na Linuxe alebo macOS, najlepšie sú vstavané manuálové stránky — zobrazíme ich príkazom man.

    niektoré funkcie v C sa prekrývajú s názvami príkazov a vtedy je potrebné povedať, že chceme otvoriť kapitolu 3: man printf zobrazí bash príkaz, zatiaľ čo man 3 printf nám ukáže knižničnú funkciu, ktorú hľadáme.
  • en.cppreference.com/w/c

    Veľmi presná dokumentácia C/C++. Vyhľadávanie nefunguje na približné slová — je treba hľadať cez externý vyhľadávač.

  • devdocs.io/c

    Webová aplikácia zjednocujúca veľké množstvo dokumentácií. Pre C využíva údaje z cppreference.

  • stackoverflow.com Pozor, často obsahuje chybné informácie, aj keď sú schválené komunitou. Odpovede ale niekedy odkazujú na správne miesto v dokumentácii, kde môžeme s hľadaním pokračovať.

  • tutorialspoint.com, zjednodušená forma dokumentácie pre rýchle pochopenie. Pre začiatky stačí, po čase je lepšie prejsť na plnohodnotnú dokumentáciu ako cppreference.

  • cplusplus.com, časti webu sú neaktuálne a môžu obsahovať zavádzajúce informácie

Aisa a kontr, pripojenie pomocou ssh

Aisa je náš študentský fakultný server. Funguje na ňom program kontr, ktorý hodnotí domáce úlohy.

Na server sa pripájame programom ssh: ssh xlogin@aisa.fi.muni.cz
a na fakultných strojoch stačí iba ssh aisa.

Po prihlásení vyzerá spustenie skriptu na odovzdanie úlohy nasledovne:
/home/kontr/odevzdavam pb071 hw0X {nanecisto/naostro}.

terminal ssh
Pred každým odovzdaním úlohy si nezabudneme skontrolovať, že bez chýb sa skompiluje aj na Aise. Pravdepodobne na vlastnom stroji používame inú verziu kompilátora s inými prepínačmi, prípadne pri vývoji na Windows nepoužívame linuxové nástroje vôbec. Ich chovanie totiž nebýva vždy rovnaké.

Moduly

Viaceré programy sa užívateľovi sprístupnia až na požiadanie. Slúži na to príkaz module:

module add MODULE_NAME

načíta jednorazovo modul; môžeme využiť Tab na doplňovanie názvov

module list

zobrazí aktuálne načítané moduly

Na Aise môžeme potrebovať moduly:

Na fakultných počítačoch:

  • pre IDE: qtsdk pre Qt Creator a clion pre CLion.

  • llvm pre clang-tidy/format

Pri zadávaní mena modulu dvojnásobným Tab vyvoláme všetky možnosti, niekedy rôzne/novšie verzie.
U IDE si môžeme všimnúť aj verzie značené -local — tieto uprednostníme.

Automatické načítanie modulov

Možné pridaním príkazov do súboru .bashrc v domovskom adresári (~/.bashrc). Príkazy v .bashrc sa vykonávajú pri spustení programu bash, teda napríklad pri prihlásení. Pridanie modulov cmake-3.6.2 a llvm spolu s kontrolou, že máme k dispozícii moduly, vykonáme príkazom:

cat <<EOF >>~/.bashrc
# pb071
if type -t module >/dev/null; then
    module add cmake-3.6.2
	module add llvm
    # add other modules here if needed
fi
EOF

(voliteľné) SSH kľúče a automatické prihlasovanie

Slúžia miesto hesla na identifikáciu užívateľa voči serveru. S ich použitím teda pri prihlasovaní na Aisu programom ssh nepotrebujeme zadať heslo a rovnako to platí pre všetky nástroje, ktoré ssh využívajú — ako je git, scp a iné.

SSH kľúče fungujú na princípe asymetrickej kryptografie a existujú vždy v pároch:
  • súkromný kľúč, ktorý patrí iba nám a musíme ho bezpečne chrániť,

  • verejný kľúč, ktorý zverejníme svetu

Správy šifrované verejným kľúčom dokáže dešifrovať iba odpovedajúci privátny kľúč. Pri posielaní teda správy šifrujeme verejným kľúčom prijímateľa, pretože vieme, že iba on ich bude vedieť prečítať — teda to nám pri prenose utají obsah správy.

V praxi funguje prihlasovanie na server zjednodušene tak, že server nám pošle správu zašifrovanú pomocou nášho verejného kľúča a svoju identitu mu dokážeme tým, že ju naším súkromným kľúčom budeme vedieť prečítať.

Vygenerovanie vlastných kľúčov

  1. Pár súkromný/verejný kľúč vygenerujeme nástrojom ssh-keygen:

    ssh-keygen -t ed25519 -C "xlogin@fi"

    Prepínačom -t zvolíme novší a bezpečnejší formát a -C je nepovinný komentár, ktorý pomenuje kľúč.

  2. Nástroj sa nás spýta na miesto uloženia kľúčov, ktoré iba Enter potvrdíme, aby sme sa vyhli dodatočným nastaveniam.

  3. Ďalej sa nás spýta na heslo. Je veľmi dôležité chrániť kľúč šifrovaním, no nie je to vyžadované a heslo sa dá vynechať dvojitým Enter.

  4. Vypíše nám umiestnenie oboch kľúčov: Your identification has been saved in /home/<xlogin>/.ssh/id_ed25519. Your public key…​, cestu k nim budeme neskôr potrebovať.

Nastavenie automatického prihlasovania

  1. Svoj verejný kľúč uložíme na Aisu, do ~/.ssh/authorized_keys, pomocou ssh-copy-id:

    ssh-copy-id xlogin@aisa.fi.muni.cz
  2. Aby sme pri práci s gitom nemuseli zadávať heslo, svoj verejný kľúč uložíme do služby, ktorá spravuje repozitáre. Mali by sme ho nájsť v súbore ~/.ssh/id_ed25519.pub, ktorý vypíšeme na terminál príkazom cat ~/.ssh/id_ed25519.pub. Po skopírovaní kľúč vložíme do fakultného GitLabu.

  3. Následne sa už môžeme prihlasovať na Aisu bez zadávania hesla. Kľúč ssh automaticky rozpozná (preto sme nemenili jeho cestu alebo názov):

    ssh xlogin@aisa.fi.muni.cz

Poznámky

Šifrovanie kľúčov a SSH agenti

Nešifrovaný súkromný kľúč je ako heslo prilepené na monitore — hocikto s prístupom k nemu ho môže zneužiť. Pokiaľ ale kľúč šifrujeme heslom, musíme ho pri každom jeho použití zadať znova, čím sa nám zjavne stratí najväčšia výhoda v ich používaní — automatické prihlasovanie.

ssh agent

SSH agent je program, ktorý si po dobu prihlásenia dešifrovaný kľúč zapamätá a poskytne ho za nás.

Zmena hesla na privátnom kľúči bez zmeny kľúču
ssh-keygen -o -f ~/.ssh/id_rsa -p
Skratky, používanie viacero kľúčov naraz

Konfiguráciu môžeme uviesť v súbore ~/.ssh/config. Nasledujúci príkaz nám umožní pripájať sa na Aisu pomocou kľúču id_ed25519 iba pomocou ssh aisa:

cat <<EOF >>~/.ssh/config
Host aisa
    Hostname aisa.fi.muni.cz
    User XLOGIN
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_ed25519
EOF
Zle nastavené prístupové práva, ssh odmietne kľúče použiť

Ssh nám pri zlých prístupových právach na relevantných súboroch (~/.ssh/) odmietne pripojenie. Práva pre kľúč id_ed25519 opravíme príkazom:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

Vývoj na Linuxe

Linux je v učebniach bežný, používa ho tiež väčšina cvičiacich a kontr. Jeho prostredie je na vývoj programov v C ideálne, vzhľadom na to, že Linux, a teraz ako jadro operačného systému, je v C napísaný.

Možnosti

Textové editory

Na začiatok je možné kód editovať iba v termináli, v textovom editore ako napríklad vim. Je to náročnejšia cesta, vhodná skôr pre ľudí zaujímajúcich sa o Linux, lebo zároveň je potrebné učiť sa ovládať daný editor. Dá nám to ale dokonalé porozumenie toho, čo robíme, a v procese sa tiež často lepšie naučíme používať Linux. Chvíľami sa tiež môžeme cítiť ako hacker.

IDE

Vývoj v IDE, vývojovom prostredí, spočíva v jednom programe, ktorý má v sebe všetky nástroje, ktoré by sme inak spúšťali v termináli.

Qt Creator je odporučené IDE a pre začiatky je najlepší vďaka jednoduchému UI. Pokiaľ už skúsenosti s IDE máme, nie je problém skúsiť zaujímavejšiu variantu, uvádzame napríklad CLion. Na fakultných počítačoch si IDE pridáme aktivovaním modulov.

Pri používaní IDE často zabúdame na procesy, ktoré pred nami IDE skrýva — z jednoduchej kompilácie sa tak môže stať mágia. Práve preto môžu niektorí cvičiaci odporučiť skôr textový editor.

Shell a bash

Shell je vrchná vrstva operačného systému, ktorá nám ho umožňuje ovládať — nazývame ho užívateľským rozhraním. Bežne ho reprezentuje terminál (CLI) alebo grafické prostredie (GUI). Príkladom GUI je bežné desktopové prostredie s oknovým systémom, teda pracovná plocha a okná s programami.

Na Linuxe je okrem GUI bežné ovládanie pomocou textu — príkazového riadku, zadávaním príkazov do terminálu (dnes sa spomína aj názov konzola, kedysi mali pojmy iný význam, viď. wiki).

Bash je program, s ktorým v termináli komunikujeme — je implementáciou terminálového shellu. Interpretuje naše príkazy, umožňuje nám spúšťať programy a dokonca aj písať skripty.

terminal bash line

V príklade nám ukazuje užívateľské meno — xrehacek, na ktorom počítači sme — @home, v ktorom adresári sa nachádzame — ~/pb071 a za symbolom doláru $ očakáva náš príkaz (taký symbol s čakaním na vstup voláme prompt).

Užitočné znalosti

Pracovný adresár (current working directory/cwd) je aktuálne zvolený adresár, v ktorom robíme zmeny. V termináli je zobrazený pred našimi príkazmi.
Absolútna cesta začína vždy /, teda od koreňového adresára.
Relatívna cesta pokračuje od nášho pracovného adresára.
Vlnka ~ (en: tilde) je skratka pre náš domovský adresár (home directory), umiestnený v /home/USERNAME/, ktorý obsahuje naše súbory.

Ak sa nachádzame v domovskom adresári a chceme vstúpiť do adresáru pb071, môžeme vykonať cd pb071 (relatívna cesta) alebo cd /home/USERNAME/pb071 (absolútna cesta).
Ak by sme sa nachádzali mimo nášho dom. adresára, využijeme vlnku, teda cd ~/pb071.
Na vstup do domovského adresára použijeme iba cd.

terminal cd example

Každý adresár obsahuje dva špeciálne súbory: ., ktorá je odkazom na aktuálny adresár; a .. ako odkaz na rodičovský adresár. Cesta cd ../.. by nás dostala o dva adresáre vyššie.

Neštandardné programy (naše, ktoré budeme kompilovať) sa spúšťajú z bezpečnostných dôvodov pridaním ./ pred názov programu. Napríklad ./hw01. Potrebujeme totiž odlíšiť bežné programy/príkazy od tých, čo sú v aktuálnom adresári pod rovnakým názvom — aby sa nám nestalo, že ls zmaže celý systém.

Klávesové skratky

Tab požiada o inteligentné doplnenie príkazu. Doplňuje napríklad cestu u príkazov ako cd alebo mv. Dvojité stlačenie môže zobraziť všetky možnosti, napríklad u ls.

Ctrl+r hľadá v histórii príkazov

alebo prechádza cez históriu príkazov

Ctrl+c požiada program o ukončenie; zmaže rozpísaný riadok s príkazom

Ctrl+d vyšle na terminál symbol konca súboru (EOF, end of file). Ukončí tým načítavanie vstupu u niektorých príkazov (ako cat).

Ctrl+l vyčistí terminál

Extra tip: text býva po označení skopírovaný a môžeme ho vložiť pravým tlačidlom myši.

Základné príkazy

príkaz syntax a význam príklad

ls

výpis súborov
(list)

ls [options] [files]
ls vypíše názvy viditeľných súborov v riadku
ls pb071 vypíše súbory v adresári pb071
ls -la vypíše aj skryté súbory a s podrobnosťami
ll alebo la bývajú aliasy na niektoré možnosti (líši sa u distribúcií)

cd

zmena pracovného adresára
(current directory)

cd [options] [directory]
cd alebo cd ~ náš domovský adresár (/home/xlogin/)
cd pb071 vstúpime do adresára pb071
cd /home/xlogin/pb071
cd .. rodičovský adresár (.. je odkaz na adresár vyššie)
cd - nás vráti na predchádzajúci adresár

mkdir

vytvorenie adresárov
(make directory)

mkdir [options] directory_names
mkdir pb071
mkdir pb071-1 pb071-2 pb071-3 mkdir -p 1/2/3 vytvorí celú cestu, nezlyhá, ak už adresáre existujú

rm

zmazanie súborov bez potvrdenia
(remove)

rm [options] files
rm hello.c zmaže súbor hello.c
rm 1.c 2.c 3.c zmaže všetky tri súbory
rm *.o zmaže všetky súbory s príponou .o
rm -r hello/ prepínač -r (recursive) zabezpečí aj zmazanie adresára, spolu s celým obsahom

cat

výpis obsahu súboru, spájanie súborov
(concatenate)

cat [options] [files]
cat hello.c vypíše na štandardný výstup obsah hello.c
cat 1.c 2.c 3.c spojí všetky súbory a vypíše výsledný súbor (preto concatenate)

less

zobrazuje súbory (bez výpisu na terminál)

less hello.c

cp

kopíruje súbory a adresáre (bez -i prepisuje bez upozornenia)
(copy)

cp [options] sources target
cp hello.c ./pb071/1/ nakopíruje hello.c do pb071/1/
cp f1 f2 f3 dir skopíruje všetky tri súbory do adresára dir
cp -i hello.c dir vypýta si potvrdenie na prepísanie súboru, ak už v dir existuje cp -r dir1 dir2 prepínač -r (recursive) skopíruje celý adresár
cp -r dir1/* dir2 všetky súbory vnútri dir1 do dir2
cp *.c pb071 súbory s príponou .c

mv

premenuje alebo presunie súbory a adresáre (bez -i prepisuje bez upozornenia)
(move)

mv [options] from where
mv hello.c h.c premenuje hello.c
mv hello.c pb071/hello.c presunie hello.c do adresára pb071
mv -i hello.c h.c vypýta si potvrdenie na prepísanie súboru, ak h.c už existuje mv * ~ presunie všetky súbory aktuálneho adresára do domovského

grep

vyhľadáva v súboroch

grep [options] pattern [files]
grep 'My money' bar1 bar2 bar3 hľadá moje peniaze v troch baroch
grep -i 'My MoNEy' bar* vo všetkých baroch a case-insensitive
grep 'My money' * vo všetkých textových súboroch aktuálneho adresáru
grep -r 'My money' * v celom adresárovom strome
ls | grep 'file' hľadá vo výpise ls (operátor pipe)

man

zobrazí interaktívnu nápovedu
(manual)

man mv k bash príkazu mv
man printf k programu printf
man 3 printf k funkcii printf (v 3. kapitole, knižničných funkcií) — pod rovnakým menom môže byť viacero záznamov, čísla kapitol man man

Presmerovanie vstupu a výstupu

Operátor > dokáže uložiť výstup programu do súboru, výstup presmeruje z nášho terminálu.

prepíše out.txt výstupom programu hello (out.txt vytvorí, prípadne pred zápisom zmaže jeho obsah)
./a > out.txt

Operátor append >> využijeme, ak súbor nechceme prepísať:

obsah súboru hello.c zapíše za koniec súboru hello2.c
cat hello.c >> hello2.c

Napríklad v spojení s programom diff môžeme porovnať výstup svojho programu s referenčnou implementáciou, aby sme predišli ťažko všimnuteľným chýbam (často nadbytočné medzery, whitespace).

zapíše výstupy programov do súborov a vypíše medzi nimi rozdiel
./a > a.txt && ./b > b.txt && diff a.txt b.txt
cat bez parametrov nás nechá písať to, čo chceme uložiť, kým neohlásime koniec súboru (Ctrl+d)
cat > hello.c

Operátorom | (pipe, rúra) prepojí štandardný výstup programu vľavo so štandardným vstupom programu vpravo. Analógia rúry naozaj sedí: na jednom konci program do rúry posiela veci, ktoré tečú na druhý koniec rúry niekomu inému.

vyhľadávanie súboru „file“
ls -la | grep 'file'
Porovnanie výstupu programov
spustí oba programy a vypíše odlišnosti v ich výstupe (<(), process substitution)
diff <(./a) <(./b)
vizuálne porovnanie pomocou programu vim. Ľahko objavíme chyby s bielymi znakmi, whitespace
vimdiff <(./a) <(./b)

Terminálové nástroje

git

vim

cmake, make

gcc

valgrind

cppcheck, clang-tidy

clang-format

clang-tidy

iné

Inštalácia

Na Ubuntu všetky potrebné nástroje nainštalujeme príkazom:

sudo apt install git vim cmake gcc valgrind cppcheck clang-tidy clang-format
sudo

superuser do, je požiadanie o administrátorské práva pre nasledujúci príkaz (zjednodušene)

apt

je správca balíkov (package manager), umožňuje ľahko inštalovať/mazať programy

install

je príkaz pre apt a zároveň jeho prvý parameter. Oznámi, že nasledujúce parametre sú názvy programov

Počas inštalácie väčšieho množstva balíkov nás apt požiada o súhlas. Pokiaľ inštalácia skončí neúspešne, je možno potrebné aktualizovať zoznamy balíkov:

sudo apt update
terminal apt install valgrind
Na odlišnej distribúcii je potrebné nahradiť apt odpovedajúcim správcom balíkov.

git (verzovací systém)

V praxi najpoužívanejší nástroj na spravovanie kódu a v rámci predmetu ho budeme používať na odovzdávanie domácich úloh. Používa sa, pretože:

  • umožňuje spoluprácu viacerých ľudí alebo prácu na viacerých počítačoch naraz

  • je menšie riziko, že kód stratíme, lebo kópia repozitára môže byť aj na serveri

  • môžeme sa vrátiť k všetkým verziám kódu, porovnávať ich a tak napr. nájsť chybu

Repozitáre spravujeme cez webové rozhranie fakultného GitLabu.

Zadávanie hesla pri príkazoch je možné nahradiť SSH kľúčmi.

Zverejnenie repozitára pb071 s domácimi úlohami alebo pridanie iných členov do repozitára ako v inštrukciách je proti pravidlám a prísne sa trestá.
.gitignore

Súbor, ktorý gitu povie, ktoré súbory nemá verzovať — aby sme do repozitára nezaniesli súbory, ktoré sú nežiaduce: zostatky z kompilácie, dočasné súbory IDE a iné. Tieto súbory potom neukazuje ani git status. Podrobný popis v oficiálnej dokumentácii.

Do repozitára vložíme .gitignore vhodný pre náš predmet. Ak sa nachádzame v repozitári v termináli je to tiež možné príkazom:

wget https://www.fi.muni.cz/pb071/download/.gitignore
Veľkosť repozitára kontroluje Kontr pri odovzdávaní úloh. Po prekročení limitu úlohu odovzdať nepôjde a za nové založenie repozitára sa strhávajú body! Preto je .gitignore dôležitý.
Základné príkazy

git clone <repository_url>

vytvorí lokálnu kópiu repozitára do nového adresára

git pull
git pull --rebase

aktualizuje lokálny repozitár: stiahne zo vzdialeného repozitára všetky zmeny a pokúsi sa ich aplikovať
s parametrom --rebase pomôže vyriešiť konflikty, napríklad ak spravíme commit na neaktuálnom repozitári

git push

aktualizuje vzdialený repozitár: pokúsi sa naše zmeny odoslať do vzdialeného repozitára

git status

  • zobrazí aktuálnu vetvu

  • vypíše súbory, u ktorých nesledujeme zmeny (untracked)

  • súbory, v ktorých sme spravili zmeny, ale nepatria do nasledujúceho commitu (not staged for commit)

  • súbory, ktorých zmeny sme zaradili do ďalšieho commitu (staged)

git add <files>

zaradí súbory so zmenou do ďalšieho commitu (označí ich staged)

git commit -m "<message>"

zo zmien označených ako staged vytvorí novú verziu repozitára

Bežný postup
  1. aktualizovanie lokálneho repozitára, stiahneme zmeny z GitLabu: git pull --rebase

  2. programujeme

  3. zobrazíme si zmeny: git status

  4. zahrnieme súbory do commitu: git add

  5. znova git status, skontrolujeme, či do commitu patria len správne súbory

  6. vytvoríme commit: git commit -m "<message>"

  7. aktualizujeme repozitár na GitLabe, zverejníme zmeny: git push

    1. prvýkrát potrebné povedať kam: git push -u origin master

  8. skontrolujeme, či sú správne zmeny naozaj na GitLabe a prípadne odovzdáme úlohu

Ak sme pracovali stále na rovnakom počítači, môžeme vynechať kroky, ktoré majú za cieľ synchronizovať náš lokálny repozitár so vzdialeným, teda pull a push.

Väčšina IDE nám umožní git ovládať priamo z GUI, teda bez písania príkazov.

vim (textový editor)

Veľmi populárny textový editor. Je dostupný všade a tým umožňuje pracovať z ľubovoľného počítača, ktorý má aspoň možnosť vzdialeného pripojenia. Umožňuje rôzne úpravy vo forme pluginov, ktorých je dostupných ozaj mnoho. Vyžaduje znalosť klávesových skratiek a jeho učenie môže byť dlhší proces.

Výbornou príležitosťou ako sa zoznámiť so základmi je voľne dostupný ebook „Vim for humans“ od Vincenta Jousse (možné stiahnuť aj bez príspevku).

Agresívnym stláčaním ESC a napísaním :q! Enter sa vim zatvorí (možno).

Vzhľad s ukážkovými nastaveniami
Vzhľad s ukážkovými nastaveniami
Nastavenie, vimrc

Konfigurácia vimu sa načíta zo súborov ~/.vim/vimrc prípadne ~/.vimrc, ak existujú. V adresári ~/.vim/ často nájdeme aj iné súbory pre vim, napríklad farebné témy v colors.

Pre predmet sme pripravili ukážkový vimrc, ktorý nám nastaví základné veci, farby a okrem toho aj jednoduché zvýrazňovanie syntaktických chýb:

  1. vimrc stiahneme do adresára ~/.vim/:

    1. Najskôr overíme, že adresár neexistuje, očakávame chybu:

      ls ~/.vim
    2. Následne stiahneme pomocou web get:

      wget -P ~/.vim/ https://www.fi.muni.cz/pb071/download/vimrc
  2. Na zvýrazňovanie chýb potrebujeme vim aspoň verzie 8, na Aise potrebujeme aktivovať modul. Ak máme ale starší vim, nič sa nestane, iba nebude fungovať zvýrazňovanie. Verziu prípadne zistíme príkazom vim --version.

  3. Nainštalujeme správcu pluginov Plug:

    curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  4. Vim spustíme, mal by sa okrem iného sťažovať, že mu chýba farebná téma a vyžadovať Enter. Akonáhle sa nám vim zobrazí, ručne napíšeme nasledujúce (zobrazuje sa vľavo dole):

    :PlugInstall
  5. Počkáme, kým Plug nainštaluje pluginy a okno môžeme zatvoriť pomocou vim príkazu :q.

Zvýrazňovanie chýb nám zabezpečuje plugin ALE, nie je ale dokonalé – občas budeme mať vďaka chybám označený aj iný riadok. Dôležité je zamyslieť sa, čo chybu naozaj spôsobuje.

Vim ako predvolený editor (napríklad pre git) nastavíme príkazom:

printf "export VISUAL=vim\nexport EDITOR='\$VISUAL'\n" >> ~/.bashrc
Ovládanie
Režimy

ESC normal mode, zadávame v ňom príkazy pre vim
i    insert mode, umožní nám písať na mieste kurzoru
   o obdobne, ale vytvorí nový riadok za aktuálnym
v    visual mode, umožní nám vybrať text (pohyb ako obvykle) a manipulovať s ním príkazmi
V    visual line mode, vyberá celé riadky

Pohyb

Bez použitia šípiek

Slová

h j ↓ ↑ k l

w na (nasledujúci) začiatok slova
e koniec slova

Vyhľadávanie

Riadky

/<vyhľadávaný text>
n prejde na ďalší výskyt
N prejde na predchádzajúci výskyt

0 začiatok riadku
$ koniec riadku

gg prvý riadok
<n>G n-tý riadok
G posledný riadok

Príkazy (zadávajú sa v normal mode)

Súbor

Písanie

:w uloží súbor (write)
:q zatvorí súbor (quit)
:q! zahodí neuložené zmeny a zatvorí súbor
:wq alebo ZZ uloží a zatvorí súbor
:make spustí kompiláciu
Na vykonanie príkazu v termináli mimo vimu môžeme zadať :!<príkaz>, napríklad :!cmake ..

x zmaže znak
dd zmaže celý riadok
yy skopíruje riadok (yank)
p prilepí za kurzor
u vráti späť zmeny (undo)
Ctrl+r vráti späť odstránené zmeny (redo)
. zopakuje príkaz
Ctrl+šípka posúva riadok alebo celý označený text (podľa režimu) — toto je nastavené naším vimrc

Kombinácie (v normal mode)

Ako?

Príklady

operátor [číslo] pohyb

operátor   čo vykonať, napr. d, x, y…​
[číslo]   voliteľné, opakuje pohyb
pohyb   nad ktorým textom sa príkaz vykoná, napr. w na ďalšie slovo, $ do konca riadku

2w posunie kurzor o 2 slová ďalej
3e posunie kurzor na koniec 3. nasledujúceho slova
dw zmaže znaky až po nasledujúce slovo
d2w zmaže nasledujúce dve slová
10dd zmaže 10 riadkov

cmake, make (automatizácia prekladu)

Aby sme sa vyhli manuálnemu písaniu zložitých príkazov pri kompilácii, používajú sa build systémy, ktoré za nás budú riadiť celú kompiláciu. V predmete budeme na ich generovanie používať program CMake, ktorému povieme:

  • ako sa má program skompilovať

  • z ktorých súborov sa má skompilovať

  • aké súbory má vygenerovať

Tieto nastavenia ukladáme v CMakeLists.txt. Tento súbor zároveň predstavuje „projekt“, ktorý vedia načítať aj jednotlivé IDE.

Čo vlastne cmake robí? Vygeneruje pre náš projekt build systém. Dôležitý je najmä súbor Makefile, ktorý je vstupom pre ďalší nástroj, make. Generovanie spustíme v adresári projektu príkazom:

cmake -S . -Bbuild
-S .

znamená, že zdrojové súbory (source) sú v aktuálnom adresári (.)

-Bbuild

znamená, že generujeme do adresáru build

Na Aise je potrebné aktivovať novšiu verziu — Aisa/moduly.

Make je už nástroj, ktorý čítaním Makefile riadi build, teda zostavenie programu. Presunieme sa do adresáru, ktorý vygeneroval cmake, a spustíme ho bez parametrov:

cd build && make

Vo výstupe môžeme pozorovať, ako zadáva pokyny kompilátoru (typicky gcc). Výsledkom je už spustiteľný súbor, „binárka“. Ak program chceme spustiť, musíme pred jeho meno zadať ./ (objasňuje Linux/Užitočné znalosti).

terminal build
Celý proces prekladu pre program printer/drawer. Využívame automatické doplňovanie (Bash - skratky).

Veľkou výhodou je tiež to, že po zmene v jednom súbore sa nemusí znova kompilovať celý program, iba jeho časť, čo celý proces výrazne urýchli.

Súbory vygenerované pomocou make sa dajú typicky odstrániť vykonaním make clean.
Cmake volí kompilátor podľa premennej prostredia CC. export CC=gcc by vynútil kompilátor gcc.

gcc (kompilácia)

Na kompiláciu v tomto predmete využívame program gcc. Bežne ho ale neuvidíme, pretože príkazy za nás bude zadávať make. Alternatívnou voľbou môže byť kompilátor clang.

Ak by sme mali jednoduchý program, kompilácia bez make by vyzerala nasledovne:

gcc -std=c99 -o BINARY_NAME [sources]
-std=c99

upresní, že používame štandard/verziu jazyka c99

-o BINARY_NAME

názov výsledného programu (vynechaním vznikne a.out)

Kontr navyše kompiluje úlohy s prepínačmi:

-pedantic

prísnejšie vynúti štandard, upozorní, ak použijeme rozšírenie jazyka

-Wall -Wextra

zapne všetky upozornenia

-Werror

upozornenia zmení na kompilačné chyby

valgrind (ladenie)

Nástroj určený na hľadanie chýb pri práci s pamäťou. Upozorní napríklad na memory leaky, používanie neinicializovaných premenných, prístup do pamäte, ktorá nie je alokovaná, viacnásobné volanie free.

Kontrolu vykonáme príkazom:

valgrind --leak-check=full --show-reachable=yes ./<program_name>

Príklad použitia
Máme program, ktorý obsahuje iba jednu alokáciu, na ktorú zabudneme použiť free:
.leak.c

#include <stdlib.h>
int main(void)
{
    int *leak = malloc(sizeof(int));
    return 0;
}

Program skompilujeme s ladiacimi informáciami pomocou prepínača -g alebo -ggdb, aby nám valgrind ukázal čísla riadkov. Potom program vo valgrinde spustíme:

gcc -g -o leak leak.c
valgrind --leak-check=full --show-reachable=yes ./leak
terminal valgrind

Vo výstupe si všimneme:

 HEAP SUMMARY:
     in use at exit: 42 bytes in 1 blocks (1)
   total heap usage: 1 allocs, 0 frees, 42 bytes allocated (2)

 42 bytes in 1 blocks are definitely lost in loss record 1 of 1 (3)
    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) (4)
    by 0x10865B: main (leak.c:4) (5)

 LEAK SUMMARY:
    definitely lost: 42 bytes in 1 blocks
    ...
 ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
1 pri ukončení programu sa používalo 42B pamäte
2 alokovali sme jedenkrát pamäť, nič sme neuvoľnili, alokovaných bolo spolu 42B
3 nastal memory leak veľkosti 42B
4 leak spôsobila funkcia malloc
5 malloc volala funkcia main, v súbore leak.c, na 4. riadku

Statické analýzatory

Hľadajú podozrivé časti kódu, ktoré by mohli naznačovať chybu. Označujú sa ako statické, pretože kontrola prebieha bez spustenia programu. Nie všetky chyby sa ale dajú odhaliť automaticky.

cppcheck
Spustí kontrolu na súbore hello.c (môžeme zadať viac súborov naraz, prípadne *.c):
cppcheck hello.c
Nástroj na Aise nebol dostupný v čase písania manuálu (30. jan 2019).
clang-tidy
Spustí kontrolu na súbore hello.c:
clang-tidy hello.c -- -std=c99
Spustí kontrolu na všetkých .c súboroch:
clang-tidy *.c -- -std=c99
Na Aise je dostupný po aktivovaní modulu llvm.

clang-format (formátovanie kódu)

Automaticky naformátuje kód podľa štýlu, definovaného v súbore.

Do svojho repozitára vložíme štýl pre pb071 (.clang-format) a codestyle.txt. Kontr bude pri spustení hľadať názov štýlu v codestyle.txt, ktorý sa bude aplikovať, a clang-fomat bude hľadať konfiguráciu v .clang-format.

Naformátuje hello.c
clang-format -style=file -i hello.c
-style=file

má sa hľadať súbor so štýlom

-i

súbor sa hneď prepíše; bez prepínača sa opravený kód vypíše na štandardný výstup

Iné štýly sú k dispozícii na gitlab.fi.muni.cz/pb071/codestyles.

Iné užitočné nástroje

nano

veľmi jednoduchý textový editor, skratky na ovládanie sú v spodnej časti obrazovky

mc

midnight commander, súborový manažér

scp

zabezpečený prenos súborov cez ssh

  • scp xlogin@aisa.fi.muni.cz:~/hello.c .
    prenesie hello.c z Aisy na náš počítač, do aktuálneho adresára

  • syntax je scp čo kam, pomocou : predelíme adresu serveru a cestu k súborom

  • -r (recursive) povolí prenášať celé adresáre

sftp

podobný scp, viac interaktívny

rsync

nezabezpečený prenos väčšieho množstva/väčších súborov, oproti scp oveľa rýchlejší

wget

stiahnutie súboru z webu
wget http://muni.cz/file.zip uloží súbor do aktuálneho adresára

Terminal multiplexing

Umožňuje pracovať s viacerými programami v jednom terminálovom okne alebo si rozpracované veci uložiť ako sedenie a otvoriť na inom počítači. Slúžia na to terminálové multiplexery, konkrétne program tmux (Ham Vocke, A Quick and Easy Guide to tmux).

Po jeho spustení vytvorí sedenie (session), v ktorom môžeme deliť obrazovku na viac virtuálnych terminálov, prípadne otvárať nové okná. Ak sa odhlásime, sedenie nemusíme ukončiť — presunie sa iba do pozadia. Po opätovnom prihlásení si sedenie môžeme otvoriť a pokračovať s rovnakým rozdelením okna a aj otvorenými programami.

Pomerne novou možnosťou je program byobu, ktorý ale nie je naozaj terminálový multiplexer, ale moderná nadstavba nad tmux. Vyznačuje sa jednoduchým užívateľským rozhraním so zabudovanou nápovedou a oproti tmuxu sa ovláda najmä za pomoci funkčných kláves F1-F12, inak je funkcionalita oboch programov v podstate totožná.

terminal byobu
ukážka byobu

Vývoj na Windows

Na Windows máme viac možných ciest, používať budeme vývojové prostredia (viac o IDE).

Prvou a odporučenou možnosťou v predmete je pracovať s IDE Qt Creator. Qt nastavíme tak, aby používalo sadu nástrojov MinGW, ktoré nám na Windows umožnia vytvoriť program v C.

Na vlastnom počítači máme ale tiež dve možnosti vyskúšať Linux. Buď v podobe WSL, čo je simulácia Linuxu vytvorená Microsoftom, prípadne môžeme ozajstný Linux virtualizovať — spustiť bez inštalácie „v okne“. Tieto možnosti sú super, ak máme cvičenia v učebni s Linuxom.

Terminál je dostupný ako program Powershell. Pokiaľ máme WSL, používame bash terminál našej distribúcie rovnako ako na Linuxe.

V názvoch ciest nepoužívame medzery a používame iba znaky ASCII!
To platí na umiestnenie nástrojov pri ich inštalácii, a rovnako aj pri programovaní, kde máme uložené zdrojové súbory, respektíve repozitár. Problémový je v tom prípade adresár Program Files/ alebo názov užívateľa s medzerou/diakritikou v Users/.

Možnosti

1. Qt Creator + MinGW

S programovaním v IDE Qt Creator sa stretneme na väčšine cvičení. Vzhľadom na to, že úlohy sa kontrolujú na Linuxe, niekedy môže dôjsť k odlišnému správaniu a vždy potrebujeme program otestovať aj na Aise.

Qt
Qt Creator

Budeme potrebovať inštalovať niekoľko pomocných nástrojov. Postup je nasledujúci:

  1. Pripravíme dodatočné nástroje:

    1. CMake

    2. Git for Windows

    3. Dr. Memory

  2. Nainštalujeme Qt Creator.

2. Windows Subsystem for Linux + CLion/Vim

Linux, a teraz ako jadro operačného systému, je napísaný v C. Jeho prostredie je teda na C prirodzene prispôsobené. Viaceré nástroje — a nielen pre C, ale majoritu jazykov — sú pre Linux. Uvedomil si to aj Microsoft a aktívne vyvíja jeho simuláciu — WSL — priamo vo Windows, aby uľahčil vývojárom prácu.

CLion s WSL
CLion s WSL

Všetky potrebné nástroje budeme mať k dispozícii v jednom termináli. Neprídeme o grafické rozhranie — zvolíme IDE, ktoré podporuje spoluprácu s WSL, uvádzame návod pre CLion (alternatívnou možnosťou, ktorú manuál nepokrýva, je aj VS Code).

Postup je nasledujúci:

  1. Aktivujeme WSL.

  2. Nainštalujeme vo WSL nástroje.

  3. Pripravíme CLion:

    1. Získame študentskú licenciu a nainštalujeme CLion.

    2. Nainštalujeme nástroje pre CLion príkazom (v termináli WSL):

      sudo apt-get install cmake gcc clang gdb build-essential
    3. Spustíme skript, ktorý nastaví ssh server:

      wget https://raw.githubusercontent.com/JetBrains/clion-wsl/master/ubuntu_setup_env.sh && bash ubuntu_setup_env.sh
    4. Overíme, že ssh nám funguje na porte 2222 (príkaz upravíme podľa nášho username):

      ssh <USERNAME>@localhost -p2222
    5. Spustíme CLion a v Settings  Build, Execution, Deployment  Toolchains vytvoríme nový toolchain:

      1. v Credentials zadávame prihlasovacie údaje a port 2222

      2. do C Compiler vpíšeme gcc

      3. keď máme toolchain nastavený, predvolíme ho tak, že použijeme šípku hore (naľavo od formuláru, v stĺpci s definovanými toolchainami)

      4. správna konfigurácia potom vyzerá nasledovne:

        Toolchain pre WSL
        Toolchain pre WSL
        V prípade nejasností alebo problémov je k dispozícii aj dokumentácia JetBrains.
  4. S WSL ďalej pracujeme presne ako na Linuxe, používame rovnaké nástroje.

3. Virtualizácia Linuxu pomocou VirtualBoxu

Linux si spustíme „v okne“, bez vplyvu na zvyšok systému — pripravili sme pre vás hotový obraz celého systému, ktorý stačí otvoriť vo VirtualBoxe. Virtualizácia je náročná na výkon a nemusí byť vhodná pre slabšie počítače.

virtualizácia pomocou VirtualBoxu
virtualizácia pomocou VirtualBoxu
  1. Pripravíme virtualizáciu.

  2. Ako na stroji pracovať sa dozvieme v kapitole Vývoj na Linuxe.

Pripojenie na fakultný server

  • Z terminálu pomocou programu ssh. Pripojenie je popísané v kapitole Aisa a Kontr, SSH.

    • S WSL ako na Linuxe.

    • Cez Powershell, Windows 10 má od verzie 1803 (April 2018) ssh vstavané.

  • Ako záložná možnosť SSH klientom Putty.

Windows Subsystem for Linux (WSL)

Umožňuje vývojárom priamo vo Windows spúšťať programy určené pre Linux. Nespomaľuje systém.

Nevýhodou môže byť fakt, že k dispozícii nemáme plnohodnotné grafické prostredie, ako sme zvyknutí na typickej distribúcii Linuxu. Tento problém sa ale prekonať dá, viaceré IDE už totiž umožňujú s WSL spoluprácu — kedy IDE pobeží vo Windows, no všetky potrebné veci, ako napríklad kompiláciu a ladenie, vykonáva vo WSL. Možnosťou je tiež vyhnúť sa IDE úplne a programovať v textovom editore v termináli.

Existuje spôsob, ako prenášať aj grafické aplikácie — X11 forwarding — ktorému sa manuál nevenuje.

Aktivácia

WSL je dostupný iba na Windows 10!
  1. Spustíme Powershell ako správca a vykonáme:

     Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    • Počítač môže vyžiadať reštart.

  2. Nainštalujeme z Windows Store distribúciu Ubuntu 18.04 (Bionic Beaver) (pozn.: existuje prirodzene viacero možností, manuál je v súlade s uvedenou).

    wsl ubuntu

  3. Inicializujeme distribúciu prvým spustením, je dostupná medzi programami pod názvom Ubuntu 18.04. Budeme požiadaní o vytvorenie užívateľského konta, zvolíme ľahko zapamätateľné heslo — bude vyžadované, keď budeme neskôr žiadať administrátorské práva cez sudo.

    • Programy v distribúcii budú pravdepodobne neaktuálne. V termináli spustíme cez správcu programových balíkov apt aktualizáciu:

       sudo apt update && sudo apt upgrade

      Apt si pri nájdení aktualizácií vypýta povolenie (Y). Na konci zosumarizuje správou:
      X upgraded, X newly installed, X to remove and X not upgraded.

      terminal apt updates

    • Pri riešení problémov postupujeme podľa dokumentácie MS.

  4. Návrat na prípravu prostredia s WSL.

Virtualizácia

Umožňuje simulovať beh počítača. Pomocou programu VirtualBox si priamo vo Windowse spustíme virtuálny stroj s Linuxom.

  • Nainštalujeme VirtualBox.

  • Stiahneme si pripravený obraz virtuálneho stroja (formát .ova, 3,1 GB).

  • Importujeme stroj do VirtualBoxu:

    • na hlavnej obrazovke Tools  Import alebo Ctrl+i

    • zvolíme virtuálny stroj

    • v nastaveniach stroja ďalej môžeme zvoliť miesto, kam sa stroj uloží a prispôsobiť veľkosť RAM.

      virtualbox import settings
      VirtualBox: appliance import settings

      Nastavenia môžeme meniť aj po importe, zaujímavé sú najmä:

      General  Advanced

      kopírovanie

      System  Motherboard

      Base Memory aspoň 2GB, pokiaľ plánujeme využívať IDE

      System  Processor

      viac jadier

      Display  Screen

      Video Memory: 64/128MB, Enable 3D Acceleration)

  • Stroj je pripravený na spustenie.

Ide o x64 distribúciu Xubuntu 18.04 LTS, s predinštalovanými nástrojmi.

prihlasovacie údaje:
užívateľ: user (zapnutý autologin)
heslo: user

IDE je potrebné nainštalovať príkazmi:

pre Qt Creator

sudo apt install qtcreator

pre CLion

sudo snap install clion --classic

Inštalácia nástrojov

Git for Windows (verzovací systém)

Viac o git.

  1. Inštalujeme z oficiálnych stránok a volíme nasledujúce možnosti:

    install 1
    install 2
    install 5
  2. Po inštalácii je git dostupný v termináli, napríklad v Powershell. Nainštaluje nám aj program Git Bash, ktorý okrem gitu umožňuje niektoré iné príkazy z typického linux terminálu.

Na Windowse sa symboly nových riadkov v textových súboroch líšia od Linuxu. V prípade problémov nasledujúcim príkazom nastavíme automatický preklad medzi oboma verziami: git config --global core.autocrlf true

CMake

Viac o cmake.

  1. Z oficiálnych stránok nainštalujeme Latest Release, binárnu distribúciu, win64-x64 Installer.

    V názvoch ciest nepoužívame medzery a používame iba znaky ASCII!
    To platí aj pri inštalácii nástrojov, problémový je adresár Program Files/.
    cmake path

    Inštalujeme na systémový disk a nemeníme predvolené umiestnenie ak naozaj nemusíme.
    Ďalej zvolíme, že chceme cmake pridať do premennej PATH (nájde ho tak Qt a umožní nám tiež v termináli použiť iba názov cmake miesto celej cesty k programu):

Dr. Memory (ladenie)

Nástroj na hľadanie chýb pri práci s pamäťou. K dispozícii pre viaceré platformy, na Windowse nahradzuje nástroj valgrind.

Putty (SSH klient)

V nových verziách Windows je už v termináli ssh. Nemusíme teda inštalovať Putty a môžeme spustiť ssh napríklad Powershell.

putty.org
Umožňuje nám vzdialene sa pripojiť na linuxový server a odovzdať tak napríklad úlohu na Aise.

Prihlásenie na Aisu:

  1. Do programu zadáme adresu Host name v tvare xlogin@aisa.fi.muni.cz a port 22. Nastavenia si uložíme ako session:

    putty
  2. Po otvorení spojenia budeme požiadaní o heslo a mali by sme uvidieť Using username s naším xloginom:

    putty 2

Vývoj na macOS

Vďaka podobnosti s Linuxom sú návody zhodné s kapitolou Vývoj na Linuxe, teda až na inštaláciu nástrojov. Doporučuje sa tiež miesto valgrind používať Dr. Memory. Stačí teda pomocou Homebrew nainštalovať základné nástroje a Dr. Memory. IDE uvedené v manuáli sú multiplatformové a môžeme ich využiť rovnako. Navyše uvádzame iba prostredie špecifické pre macOS, Xcode.

Terminál otvárame z časti Launchpad  Others alebo pomocou rýchleho vyhľadávania +Space, do ktorého napíšeme jednoducho „Terminal“.

Homebrew a potrebné nástroje

Homebrew je správca balíkov podobný apt, ktorý nám sprístupní nástroje, ktoré náš macOS nemá.

  1. Podľa oficiálnej stránky nainštalujeme Homebrew príkazom:

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    Balíky následne inštalujeme príkazom:

    brew install <package_name>
  2. Nainštalujeme potrebné programy (no bude nám chýbať clang-tidy a valgrind):

    brew install git vim cmake gcc cppcheck clang-format
    Na macOS 10.14 (Mojave) zatiaľ nefunguje valgrind –

Xcode

Oficiálne IDE od firmy Apple. Najčastejšie sa využíva na vývoj aplikácii pre Apple výrobky. Má podporu pre jazyky ako Objective-C, Swift, avšak aj pre jazyky C a C++. Ak by ste raz chceli vyvíjať aplikácie práve pre firmu Apple, máte skvelú možnosť zoznámiť sa s ich IDE už teraz.

IDE (vývojové prostredie)

Softvér s grafickým rozhraním združujúci viaceré nástroje pre programátora. Bežné IDE obsahuje editor zdrojového kódu, kompilátor, integruje build a verzovacie systémy, debugger. Zvláda tiež inteligentne doplňovať kód, teda našepkáva programátorovi syntax, zvýrazňuje chyby a prípadne navrhuje opravy. Jednou z výhod sú aj jednoduché nástroje na refaktoring (zmena názvu premennej, predpisu funkcie, atp.).

Užívateľská prívetivosť je ale dvojsečná zbraň — to, že IDE pred nami skrýva viacero jednoduchých vecí, nám bráni porozumieť celému procesu, ktorý sa často, a úplne zbytočne, stane magickým. Z edukačného hľadiska odporúčame používať IDE, keď dokážeme pracovať iba v termináli.

Qt Creator

qt example

V predmete odporučené.

Vhodné IDE pre začiatok od firmy Qt Company. Základná verzia pre vývoj v C/C++ je open-source. Komerčná verzia obsahuje pre nás nepotrebnú knižnicu na tvorbu desktopových/embedded GUI aplikácií.

CLion

clion example

Multiplatformové C/C++ IDE od firmy Jetbrains. Komerčný softvér s bezplatnou licenciou pre študentov. Je v rovnakej rodine IDE ako IntelliJ IDEA, veľmi populárna voľba na programovanie v Jave. Identické UI môže byť výhodou pri prechode na iný jazyk, ktorý rodina zastrešuje (využiteľné vo viacerých predmetoch FI).

Vhodné skôr pre pokročilejších užívateľov, alebo tých, čo už používali IDE od JetBrains.


Za konzultácie a korektúry patrí vďaka Romanovi Lackovi, Lukášovi Zaoralovi a Lukášovi Ručkovi. Osobitná vďaka patrí tiež Matúšovi Talčíkovi, od ktorého som prebral časti starších návodov. A rovnako ďakujem študentom, ktorí nám pošlú spätnú väzbu!

 — Marko Řeháček