# $pingwinowanie \ 4^2 - 2$
## Zadanie 1

## Co to są pakiety essential ?
Podstawowe pakiety, które są niezbędne do prawidłowego działania systemu.
## Jakie jest znaczenie priorytetów required, important, standard, optional, extra?
required - Pakiety o najwyższym priorytecie, niezbędne do prawidłowego funkcjonowania systemu. Usunięcie ich może spowodować, że system stanie się bezużyteczny.
important - Pakiety ważne, ale nie krytyczne jak required. Są niezbędne do podstawowego funkcjonowania systemu.
standard - Pakiety, które powinny być zainstalowane w większości standardowych instalacji systemu.
optional - Pakiety, które mogą być użyteczne, ale nie są niezbędne do podstawowego działania systemu.
extra - Pakiety o niskim priorytecie, często specjalistyczne lub rzadko używane.
## Do jakich sekcji może należeć pakiet?
main - Pakiety spełniające wytyczne Debiana dotyczące wolnego oprogramowania.
contrib - Pakiety wolne, ale zależne od niewolnych pakietów.
non-free - Pakiety, które nie spełniają wytycznych dotyczących wolnego oprogramowania.
multiverse - Pakiety, które mogą zawierać dodatkowe restrykcje prawne.
## Jakie jest znaczenie list pakietów: depends, pre-depends, recommends, suggests, breaks, conflicts,replaces, provides?
Depends: Określa pakiety, które muszą być zainstalowane, aby dany pakiet działał poprawnie.
Pre-Depends: Określa pakiety, które muszą być zainstalowane i skonfigurowane przed instalacją danego pakietu.
Recommends: Określa pakiety, które nie są niezbędne, ale ich instalacja jest zalecana dla pełnej funkcjonalności.
Suggests: Określa pakiety, które mogą być użyteczne w połączeniu z danym pakietem, ale nie są wymagane ani zalecane.
Breaks: Określa pakiety, które nie będą działać poprawnie, jeśli dany pakiet jest zainstalowany.
Conflicts: Określa pakiety, które nie mogą być zainstalowane razem z danym pakietem.
Replaces: Określa pakiety, które dany pakiet zastępuje.
Provides: Określa wirtualne pakiety, które dany pakiet może dostarczać.
## Co to jest debtag?
Debtags to system kategoryzacji pakietów Debiana, który umożliwia przypisywanie pakietom różnych tagów opisujących ich funkcjonalność, przeznaczenie, zależności i inne cechy. Umożliwia to bardziej zaawansowane wyszukiwanie i filtrowanie pakietów.
## Co to jest status dpkg/dselect pakietu?
Status pakietu w dpkg lub dselect odnosi się do jego aktualnego stanu w systemie, takiego jak:
install: Pakiet jest zainstalowany.
deinstall: Pakiet jest odinstalowany, ale pliki konfiguracyjne mogą pozostać.
purge: Pakiet jest całkowicie usunięty, włącznie z plikami konfiguracyjnymi.
hold: Pakiet jest zablokowany i nie będzie aktualizowany.
## Jakie dodatkowe stany pakietu przechowuje apt?
automatically installed: Pakiet został zainstalowany automatycznie jako zależność innego pakietu.
manual: Pakiet został zainstalowany ręcznie przez użytkownika.
## Jakie dodatkowe stany pakietu przechowuje aptitude?
automatically installed: Podobnie jak apt, oznacza pakiety zainstalowane jako zależności.
manually installed: Pakiety zainstalowane ręcznie przez użytkownika.
holds: Pakiety oznaczone do zablokowania przed aktualizacją.
forbidden: Pakiety, które nie powinny być instalowane.
## Na potrzeby instalatorów wprowadzono tasks. Co to jest? Jak uruchomić tasksel tak, żeby oferował dokładnie te same opcje, co podczas instalacji systemu?
Tasks to grupy pakietów, które razem zapewniają określoną funkcjonalność lub środowisko (np. środowisko graficzne GNOME, serwer WWW). Aby uruchomić tasksel tak, żeby oferował dokładnie te same opcje, co podczas instalacji systemu, należy wykonać polecenie:
## Co to są pakiety wirtualne?
Pakiety wirtualne to abstrakcyjne nazwy, które mogą być dostarczane przez różne rzeczywiste pakiety. Na przykład, różne serwery WWW mogą dostarczać pakiet wirtualny httpd.
## Co to są metapakiety? Co to są dummy packages, transitional packages?
Metapakiety: Pakiety, które nie zawierają rzeczywistego oprogramowania, ale zależności, które instalują grupy powiązanych pakietów. Przykładem jest build-essential, który instaluje podstawowe narzędzia do kompilacji oprogramowania.
Dummy packages: Pakiety puste, które mogą być używane do różnych celów, np. do zastępowania starszych wersji pakietów lub do dostarczania symbolicznych zależności.
Transitional packages: Pakiety używane do ułatwienia przejścia między starszymi i nowszymi wersjami pakietów, zwykle instalują nowe pakiety zastępując starsze.
## Zadanie 5

https://www.gnu.org/software/diffutils/manual/diffutils.pdf
### Jakieś omówienie
Mamy jakieś różne programiki:
1. diff
* po prostu pokazuje różnice między dwoma plikami
* takie różnice mogą być 'patchami', mi to przypomina RCS tzn
* diffem tworzysz patcha (różnicę), a później programem patch można nałożyć zmiany na inny plik
* dla binarek mówi tylko, że różne
* jakieś flagi
* -y -> output side by side
* -i -> ignore case
* -z -> ignoruj spacje na końcach linii
* -w -> ignoruj wszystkie białe znaki
2. cmp
* diff ale byte by byte
* jakieś falgi
* -b -> print bytes
* -n -> compare at most n bytes
3. diff3
* giga op diff, bo porównuje aż 3 pliki równocześnie, chyba taki gitowy tzn
* mamy 3 pliki -> oryginalny, ze zmianiami 1 osoby i ze zmianami 2 osoby
* diff3 może pokazać różnice między oryginalnym i zmienionymi
* poza tym może stworzyć nowy plik który jest merge'm obu zmian i informować o konfliktach
4. sdiff
* side-by-side merge
* do interaktywnego merge'owania dwóch plików
5. patch
* to co nas interere, program który aplikuje patche (diffy)
* bierze na input output diffa i nakłada różnice na kopię oryginalnego pliku tworząć zpatchowną(?) wersję
* jest na tyle mądry, że na podstawie headerów wie co patchować
* aplikuje kolejnymi hunkami, jeśli hunk nie pasuje idealnie, to są jakieś heurystyki żeby dopasować, a jeśli nawet to nie pomoże to nie palikuje i odrzucony hunk wrzuca do *.rej
* flagi
* -l -> czasem taby są zamieniane na spacje i vice versa (to utrudnia patch) ta flaga mówi ignoruj takie zmiany
* --dry-run
* -R -> reversed patch 
### Zadanko
1. Stwórz plik np. example.py
```py=
def greet(name):
return f"Hello, {name}!"
if __name__ == "__main__":
print(greet("World"))
```
2. cp example.py example2.py
3. Wprowadź jakieś modyfikacje
```py=
def greet(name):
return f"Hi, {name}!"
if __name__ == "__main__":
print(greet("World"))
```
4. diff -u example.py example2.py > example.patch
5. Wprowadź następne zmiany w oryginalnym
```py=
def greet(name):
return f"Hello, {name}!"
def bye(name):
return f"Bye, {name}!"
if __name__ == "__main__":
print(greet("World"))
print(bye("World!))
```
6. patch example.py < example.patch
7. Bonjour fajrancik