Cvičení 1: Úvodní cvičení

Přečtěte si organizační pokyny.

Úkol 1: Vytvořte si GIT repozitář pro odevzdávání domácích úkolů

Pro odevzdávání domácích úkolů je potřeba založit GIT repozitář ve fakultním gitlabu. Ve zkratce lze říct, že GIT je něco jako zálohovací nástroj, který je vhodný pro programátory (obecně pro práci s čistým textem), více se dozvíte třeba tady, tady a nakonec třeba i tady.

  • Přihlašte se do fakultního gitlabu.
  • V levém menu vyberte položku Projects.
  • Klikněte na zelené tlačítko New project.
  • Jako název projektu zvolte pb071 a viditelnost ponechte na privátní.
  • Přejděte na úvodní stránku projektu.
  • V nastavení (ozubené kolečko vpravo nahoře) klikněte na Members.
  • Zde nastane poslední věc, kterou je nutné nastavit, a to umožnit nástroji Kontr přístup pro čtení do vašeho repozitáře. To provedete tak, že přidáte uživatele Kon Tr s právem Reporter.

Úkol 2: Připojení na fakultní počítače

Teď je potřeba, abyste si vyzkoušeli pracovat na fakultním serveru, skrz který se odevzdávají domácí úkoly. Fakultní server je ale vhodný i na testování domácích úkolů před odevzdáním - server se může chovat trochu jinak než váš lapťop, což by mohlo způsobit, že vám neprojdou některé testy. A to nechcete.

Na serveru aisa běží operační systém Linux, ale není třeba se toho bát, na takové „domácí žvýkání programování“ vám plně postačí pár příkazů, které si teď vyzkoušíte.

První fáze: Připojení

Pokud používáte OS Windows, potřebujete spustit program Putty. Na školních počítačích je již k dispozici, program lze stáhnout třeba tady. Je třeba zadat adresu aisa.fi.muni.cz (pokud budete ve fakultní síti – wlan_fi, eduroam –, pak stačí jenom aisa) a připojit se. Terminálové okno se ještě zeptá na vaše přihlašovací údaje, které vyplníte. Nelekněte se, že se při zadávání hesla nezobrazují žádné znaky – je to bezpečnostní opatření.

Pokud jste na Linuxu, pak postačí v terminálu (terminál naleznete ve „start“ nabídce) spustit

ssh aisa
Pokud vám přijde, že je otrava při každém přihlášení zadávat jméno a heslo, když to „přece jste vy“, pak vězte, že to jde nastavit tak, abyste nemuseli nic zadávat. Doma si můžete najít návod, jak vytvořit soukromý a veřejný klíč a jak je použít pro SSH připojení.

Druhá fáze: Základní příkazy

Nejprve zjistěte, co máte ve svém domovském adresáři. To uděláte příkazem ls.

Teď si nastavíte v gitu svoje jméno a e-mail. Ne že by to bylo úplně nutné, ale je to vhodné.

git config --global user.name "Jméno Příjmení"
git config --global user.email "xlogin@fi.muni.cz"

Následně si stáhněte svůj repozitář z gitlabu:

git clone https://xlogin@gitlab.fi.muni.cz/xlogin/pb071.git

Po zadání hesla se vám stáhne (zatím) prázdný repozitář do nově vytvořeného adresáře pb071. Do adresáře vstoupíte pomocí příkazu cd pb071. Teď ale můžete využít skvělé vychytávky terminálu – klávesy TAB. Stačí, když zadáte cd p a stisknete tabulátor. Pokud existuje pouze jeden adresář se jménem začínajícím na p, terminál doplní zbytek názvu. V opačném případě dalším stiskem TAB zobrazíte všechny takové adresáře a postupným prolínáním dopisování názvu a stisků klávesy TAB se dostanete ke kýženému výsledku.

  • V adresáři pb071 si vytvořte adresář hello pomocí příkazu mkdir hello a vstupte do něj.
  • Teď zkuste vytvořit soubor hello.c, k čemuž využijete příkaz touch hello.c.
  • Pokud si vypíšete jeho obsah příkazem cat hello.c, zjistíte, že je prázdný.
  • Nějaký obsah do něho dostanete takto: echo "#include <stdio.h>" > hello.c.
  • Kontrolou pomocí příkazu cat hello.c si ověříte, že teď už soubor není prázdný.

Pokud chcete soubor editovat, napište příkaz nano hello.c. Spustí se jednoduchý textový terminálový editor. Ovládá se pomocí klávesových příkazů, kdy základní příkazy vidíte ve spodní části okna. ^O znamená Ctrl+O. Existují i sofistikovanější terminálové editory, ale zpočátku se spokojíte s tímto. Do souboru vložte následující obsah:

hello.c
#include <stdio.h>
 
int main(void)
{
    printf("Hello World\n");
    return 0;
}

Když máte hotový program, je na čase jej přeložit. To provedete příkazem gcc -std=c99 hello.c -o mojeHello. Tento příkaz je už trochu složitější, ale budete se s ním během semestru setkávat tak často, že vám to pak už ani nepřijde.

Pokud se vám podařilo program přeložit, můžete ho spustit: ./mojeHello (nebojte se použít tabulátor na doplnění).

Třetí fáze: Nahrání změn do repozitáře

Každá změna souboru se může v gitovém repozitáři nacházet v jednom z následujících stavů:

  1. rozpracovaná
  2. připravená
  3. uložená
  4. uložená na serveru

Stav se mění pomocí editoru a rozličných gitových příkazů. Ty nejzákladnější jsou:

  • git status – Tímto příkazem si zjistíte, v jakém stavu se vám nacházejí soubory.
  • git diff – Tímto příkazem zjistíte, co přesně se změnilo.
  • git add hello.c – Tímto příkazem změníte stav souboru hello.c z rozpracovaného na připravený.
  • git commit -m "úloha hello" – Tento příkaz slouží k uložení všech připravených změn.
  • git push – Tímto příkazem uložíte veškeré změny na fakultní server

Přidejte vámi vytvořený soubor do připravených pomocí git add hello.c. Proveďte commit a push.

Další zajímavé gitové příkazy
  • git reset hello.c – Tímto příkazem přesunete soubor hello.c zpět ze stavu připravený do stavu rozpracovaný.
  • git pull – Zkontrolujete, jestli a jak se liší váš lokální repozitář od toho na serveru, a stáhnete případné změny.
  • git pull --rebase – Vytvořili jste commit, který jste chtěli uložit na server, ale příkaz `git push` selhal, protože Updates were rejected because the tip of your current branch is behind its remote counterpart.
  • git checkout -- cesta/k/souboru – Udělali jste změny v soubor, které ale chcete vrátit do stavu „jako na začátku“.
  • git reset --soft HEAD~1 – Udělali jste commit, který je špatný, a rádi byste se ho zbavili (změna stavu z uložený na připravený).
  • git log – Zobrazí historii commitů.
  • git stash – Udělali jste změny, které si chcete na moment odložit.
  • git stash pop – Chcete si opět pracovat na odložených změnách.

Úkol 3: Odevzdání testovacího domácího úkolu

Když se vám podařilo vytvořit, „commitnout“ a „pushnout“ program, je na čase ho zkusit odevzdat. To provedete následujícím příkazem:

/home/kontr/odevzdavam pb071 hello nanecisto

Teď už stačí jenom počkat, až Kontr vyhodnotí vaši úlohu. Více o příkazu na odevzdávání domácích úloh naleznete tady.

Další šikovné linuxové příkazy

  • Chcete něco zkopírovat? cp co kam
  • Chcete něco přejmenovat/přesunout? mv co kam
  • Chcete smazat soubor? rm co
  • Chcete smazat složku? rm -rf co (POZOR – opravdu to smaže všechno, používejte s rozmyslem)
  • Chcete se dostat do domovského adresáře? Stačí zadat cd

Porovnávání souborů

Linux je velmi dobrý systém pro práci s textovými soubory. Co se vám bude velmi hodit, je textové porovnání dvou souborů. Zkuste si teď udělat malé demo:

  1. Skočte do složky ~/pb071/hello/ pokud v ní ještě nejste.
  2. Vytvořte soubor expected.txt s obsahem Hello World!. Například takto: echo 'Hello World!' > expected.txt
  3. Přesměrujte výstup programu ./mojeHello do souboru result.txt. To provedete takto: ./mojeHello > result.txt
  4. Zjistěte, jestli se soubory liší, příkazem diff -c expected.txt result.txt . Co z toho vyčtete?
  5. Opravte program tak, aby vypisoval to, co je v souboru expected.txt. Co vypíše příkaz diff?
$ diff -c expected.txt result.txt
*** expected.txt 2016-01-14 10:37:11.000000000 +0100
--- result.txt  2016-01-14 10:37:40.000000000 +0100
***************
*** 1 ****
! Hello World!
--- 1 ----
! Hello World

Co vůbec dělá zobátko?

Jednoduché zobátko doprava způsobí, že se výstup programu zapíše do souboru, místo toho, aby se vypsal na obrazovku. Když zobátko obrátíte, pak spuštěný program dostane obsah souboru na vstup – jako byste to psali na klávesnici vy.

Pokud byste chtěli převést do souboru chybový výstup programu, provede se to takto: program 2> chybovyVystup.txt

Pokud byste chtěli jenom přidat na konec souboru, použijete dvě zobátka namísto jednoho.

Vzorové řešení

Vzorové řešení není

Úlohu připravil Jiří Weiser – 374154 (zavináč) mail.muni.cz.

QR Code
QR Code public:pb071:cviceni01 (generated for current page)