Programování 1 – 8. cvičení
Git
Instalace
Poznámka: na labových počítačích je Git už nainstalovaný.
Jděte na https://git-scm.com/downloads a vyberte si váš operační systém.
Instalace na Windows má grafické rozhraní, kde si můžete vybrat některá nastavení. Moje doporučení je brát výchozí hodnoty kromě:
- Choosing the default editor used by Git: vyberte si editor, který vám vyhovuje, např. VS Code. Pokud byste editor později chtěli změnit, jde to.
- Choosing the SSH executable: pokud už máte SSH klient (což zjistíte třeba příkazem
ssh -V
), zvolte Use external OpenSSH.
Po instalaci možná bude potřeba zavřít a znovu otevřít váš terminál (případně textový editor), aby v něm začal fungovat příkaz git -v
.
Prvotní nastavení
Aby Git mohl zaznamenávat, kdo udělal kterou změnu, musíte si nastavit svoji identitu pomocí příkazů:
git config --global user.name "Vaše Jméno"
git config --global user.email "your_email_address@example.com"
Přihlášení do MFF GitLabu
MFF GitLab najdete na adrese https://gitlab.mff.cuni.cz/. Pro přihlášení do Username zadejte vaše přihlašovací jméno do SISu (např. topfermi
; ne vaše číslo) a Password je vaše heslo do SISu.
Poznámka: používáme MFF GitLab, což je něco jiného než GitLab.com.
Vytvoření projektu
Po přihlášení do GitLabu si můžete vytvořit nový projekt (modré tlačítko New Project vpravo nahoře). Zvolte Create blank project a na další stránce ho pojmenujte a vyberte, kam se má uložit: v Project URL zvolte vaše uživatelské jméno (v sekci Users).
Stažení projektu (clone
)
Jsou dvě možnosti, jak přistupovat ke GitLabu a stáhnout si odtamtud váš projekt (a později tam taky nahrát změny, které uděláte):
- HTTPS – přihlášení pomocí jména a hesla (případně speciálního access tokenu). Pro každou operaci (stažení, nahrání) se musíte znovu přihlásit. Naštěstí má Git zabudovaný Credential Manager, který si vaše jméno a heslo umí pamatovat, takže ho nemusíte pokaždé zadávat. Tuhle možnost si ukážeme na cvičení.
Credential Manager automaticky ukládá vaše heslo, což není bezpečné, pokud počítač používá více lidí (jako třeba ten v labu). Proto je lepší místo hesla používat access token. Navíc u něj jde nastavit, že má platit je po omezenou dobu. Token jde vytvořit buď
- pro jeden konkrétní projekt (otevřete si projekt, v levém menu zvolte Settings, Access Tokens, pak Add new token, Select a role nastavte na Maintainer a v Select scopes vyberte write_repository; pokud byste chtěli víc podrobností, jděte do dokumentace), nebo
- pro celý váš účet (klikněte na váš obrázek vlevo nahoře, Preferences, Access Tokens, pak Add new token a v Select scopes vyberte write_repository; dokumentace).
Pokud byste potřebovali vymazat vaše přihlašovací údaje, tak na počítačích s Windows (tedy třeba v labu) jděte do Ovládací panely (Control Panel) / Uživatelské účty (User Accounts) / Spravovat přihlašovací údaje (Credential Manager) / Přihlašovací údaje systému Windows (Windows Credentials) / Obecné přihlašovací údaje (Generic Credentials) a tam najděte git:https://gitlab.mff.cuni.cz
a smažte.
- SSH – přihlášení pomocí klíče (návod na nastavení).
Pro stažení projektu z GitLabu na stránce projektu klikněte na modré tlačítko Clone a zkopírujte si adresu z Clone with HTTPS. V terminálu si otevřete složku, kam projekt chcete uložit, a spusťte příkaz git clone ADRESA
(např. git clone https://gitlab.mff.cuni.cz/topfermi/zasobnik.git
). Mělo by se vám otevřít okno, kam zadáte jméno a access token (nebo heslo) a pak by se váš projekt měl stáhnout do nové složky. Pokud se vám nedaří přihlásit, můžete použít access token přímo v adrese: git clone https://USERNAME:TOKEN@gitlab.mff.cuni.cz/topfermi/zasobnik.git
(dokumentace).
Pokud se vám nechce pracovat s terminálem, můžete po kliknutí na Clone zvolit Visual Studio Code (HTTPS), což vám dovolí vybrat, kam se projekt uloží, z grafického rozhraní.
Poznámka: na labovém počítači mi nefungovalo stažení projektu na síťový disk (např. Z:
). Nicméně na lokálním disku D:
mi to fungovalo bez problémů.
Ignorování souborů
Některé soubory nechceme ukládat na server (třeba zkompilované programy, pomocné soubory našeho editoru, ...). Nejjednodušší způsob, jak to udělat, je pomocí souboru .gitignore
. Pro Python si stáhněte soubor Python.gitignore
(pro další jazyky jsou doporučené soubory tady). Po stažení ho přesuňte do kořenové složky vašeho projektu a přejmenujte na .gitignore
(tedy odeberte z názvu staženého souboru slovo "Python", ale tečku a vše za ní tam nechte).
Uložení změn
Ve VS Code můžete s Gitem snadno pracovat ze záložky Source Control (levé menu). Pomocí tlačítka + (Stage changes) vyberte soubory, které chcete uložit. Pak do Message napište popis změn a klikněte na Commit, čímž se aktuální změny uloží jako nová verze projektu. Následně pomocí tlačítka Sync changes nahrajete tyto změny i na GitLab.
Pokud by vám nějaké z tlačítek nefungovalo nebo byste potřebovali operace udělat ručně, odpovídající příkazy jsou:
git status
: přehled nových změn, které zatím nejsou uložené,git add .
: připraví všechny změněné soubory k uložení (případněgit add SOUBOR
, pokud chcete jako novou verzi uložit změny jen v některých souborech),git commit -m "Popis změn"
: uloží připravené změny jako novou verzi,git push
: nahraje novou verzi na GitLab.
Další užitečné příkazy případně najdete v taháku nebo se je dozvíte v LS na Úvodu do Linuxu.
Cvičení na Git
Nainstalujte si Git a vyzkoušejte si, že vám z vašeho počítače jde stáhnout a nahrát projekt na GitLab. Budete to potřebovat, až budete pracovat na svém zápočtovém programu. Podrobnější instrukce jsou v ReCodExu.
Stream
Představte si, že chcete společné rozhraní pro vstupně-výstupní komunikaci (pro jednoduchost pouze textovou) – tedy pro objekty, ze kterých jde číst (metoda read
) a jde do nich zapisovat (metoda write
). Příklady takových objektů jsou třeba soubory (čtení/psaní z/do souboru) nebo síťová komunikace přes TCP/IP (přijímání/posílání zpráv po síti). Společné rozhraní nazveme Stream
.
Zkuste tento příklad zapsat v Pythonu za pomoci abstraktní třídy Stream
s metodami read
(přečte a vrátí textový řetězec) a write
(dostane textový řetězec a zapíše ho). Vytvořte několik tříd dědících od Stream
, například:
MemoryStream
– stream uložený v paměti,FileStream
– čte/píše z/do souboru (cestu nastavíme v konstruktoru),NetworkStream
– přijímá/posílá zprávy po síti.
Cílem příkladu je jen vyzkoušet si zapsat definice tříd a dědičnosti. Místo skutečné implementace metod read
a write
v nich jen udělejte print
(a vraťte hodnotu správného typu).
Výhodou společného rozhraní pro streamy je, že zbytek programu nemusí vůbec řešit, jestli data dostává od uživatele nebo ze souboru nebo po síti. Zkuste si pak zavolat následující metodu s různými streamy:
write_data(stream: Stream):
stream.write("data")
Struktura tříd je znázorněna také na následujícím UML diagramu:
Pozn.: Příklad vychází ze třídy Stream
v implementaci .NET.