$ tree
.
├── dir
│ ├── my data
│ │ ├── 1.txt
│ │ └── 3.txt
│ └── my_data
│ ├── 2.txt
│ └── 3.txt
└── Super[something]
├── super!
│ └── chaszcze#5
└── super🕴
└── gąszcz
$ ./fix_names --allowed 'a-z0-9ąćęłńóśźź' --case-insensitive --replacement '_' --merge dir
$ tree
.
├── dir
│ └── my_data
│ ├── 1.txt
│ ├── 2.txt
│ ├── 3.txt
│ └── 3.txt.1
└── Super[something]
├── super!
│ └── chaszcze#5
└── super🕴
└── gąszcz
$ ./fix_names --allowed 'a-z0-9ąćęłńóśźź' --case-insensitive --replacement '_' --suffix dir 'Super[something]'
$ tree
.
├── dir
│ └── my_data
│ ├── 1.txt
│ ├── 2.txt
│ ├── 3.txt
│ └── 3.txt.1
└── Super_something_
├── super_
│ └── chaszcze_5
└── super_.1
└── gąszcz
++++
**~~Temat.#~~.**
Wykres bieżącego użycia sieci.
\\
Skrypt odczytuje z systemu informacje o ilości przesłanych i odebranych bajtów
przez wyspecyfikowaną w argumentach skryptu kartę sieciową //ifname//.
Na tej podstawie co jakiś czas (określony w argumentach skryptu) oblicza prędkość
odbioru i wysłania danych jako różnicę bajtów podzieloną przez czas od poprzedniego
pomiaru. Po każdym pomiarze skrypt uaktualnia rysowane przez siebie wykresy
prędkości wysłania i odbierania danych.
Razem wykresy muszą zajmować całe dostępne okno terminala i muszą mieć czas
jako poziomą oś. Dodatkowo skrypt ma używać wybranych znaków Unicode pozwalających
na większą dokładność niż cały znak (np. ''⢀⢠⢰⢸⡀⣀⣠⣰⣸⡄⣄⣤⣴⣼⡆⣆⣦⣶⣾⡇⣇⣧⣷⣿'',
''▁▂▃▄▅▆▇█'' czy ''▗▐▖▄▟▌▙█'').
\\
Liczbę wysłanych/odebranych znaków można odczytać z pliku ''/sys/class/net/%%%%//ifname//%%%%/statistics/tx_bytes'' i ''…/rx_bytes'', bądź z wyników komend ''ethtool --statistics ifname'' oraz ''ip [--json] --statistics show dev //ifname//''.
\\
Zaleca się użycie znaków sterujących (por. ''man console_codes'') do przesuwania
kursora w wybrane miejsce ekranu.
**~~Temat.#~~.**
Automatyzacja uruchamiania benchmarków i robienia wykresów z wynikami.
\\
Temat wymaga wybrania na początku programu który dla różnej wartości jednego
parametru generuje powiązany z nim wynik (bądź inną metrykę).
\\
Skrypt przyjmuje kilka argumentów: listę bądź zakres wartości parametru, liczbę
powtórzeń i pierwszą część nazwy tworzonych przez skrypt plików.
\\
Skrypt ma uruchamiać wybrany program z kolejnymi wartościami parametru,
powtarzając uruchomienie z każdą wartością parametru tyle razy ilu powtórzeń
zażądano w argumentach skryptu. Skrypt ma umieszczać wyniki w pliku/plikach
tekstowych.
\\
Następnie skrypt ma wygenerować obrazek (np. svg/png) z wykresem (np. punktowym,
liniowym) zależności wyniku od wartości parametru. Na wykresie dla każdej
wartości parametru ma być umieszczona średnia z wyników wraz ze słupkiem błędu.
\\
Wykresy możesz generować narzędziami takimi jak ''gnuplot'' czy ''R''.
\\
Jeśli nie masz pomysłu na program do ewaluacji, możesz użyć komendy szukającej
liczby pierwszej o długości ''//N//'' bitów – ''openssl prime -generate -bits //N//'' –
i użyć czasu wykonania jako metryki (wyniku).
**~~Temat.#~~.**
Skrypt testujący program z kombinacjami dwóch parametrów.
\\
Na początku skryptu ma znajdować się lista możliwych wartości każdego z dwóch
zmienianych parametrów oraz komenda do uruchamiania z miejscem na wstawienie
wartości tych parametrów.
\\
Skrypt ma za zadanie uruchomić podaną komendę dla wszystkich kombinacji parametrów.
Standardowe wyjście testowanego programu (bądź produkowany plik, jeśli program
tworzy plik z wynikiem zamiast pisać do standardowego wyjścia) ma zostać umieszczone
w pliku o nazwie jednoznacznie wskazującej na parametry z którymi został uruchomiony program.
Pliki mają zostać umieszczone w katalogu którego nazwa zawiera nazwę testowanego programu
oraz datę i godzinę uruchomienia skryptu. Każdy gotowy plik ma być kompresowany.
\\
Skrypt ma wyświetlać na standardowym wyjściu bieżąco testowaną kombinację parametrów
i czas uruchomienia bieżącego testu.
\\
Wybór testowanego programu dowolny. Przykładowy program który można testować to
program ''fio'', testujący wydajność operacji wejścia-wyjścia. Przykładowo do
badania wydajności dysku można w Bashu użyć komendy:
\\
''fio <(echo -e "[foo] \n time_based \n runtime=1s \n filename=/tmp/testFile \n filesize=10M \n ioengine=posixaio \n readwrite=randrw \n rwmixread=10 \n blocksize=4k")''
\\
Parametry do zmiany to np. rozmiar bloku i procent odczytów.
**~~Temat.#~~.**
Przygotowywanie i uruchomienie testu na zdalnej maszynie.
\\
Skrypt ma utworzyć tymczasowy katalog w którym umieści pliki z listy (lista
czytana z pliku lub konfigurowalna na początku skryptu). Następnie skrypt ma
przygotować plik konfiguracyjny i umieścić w nim wartości podane jako
argumenty skryptu. Następnie pliki mają być skopiowane do maszyny zdalnej (adres
maszyny ma być ustawialny w zmiennej na początku skryptu) i na zdalnej maszynie
ma zostać uruchomiony wskazany program (też ustawialny w zmiennej na początku
skryptu). Standardowe wyjście i standardowy błąd uruchomionego programu mają
trafić do pliku z nazwą programu i bieżącą datą.
\\
Wybór testowanego programu i format pliku konfiguracyjnego dowolny. Przykładowy
program który można testować i format pliku konfiguracyjnego można wziąć z
poprzedniego tematu.
**~~Temat.#~~.**
Przypomnienie o najbliższych urodzinach.
\\
Skrypt korzysta z pliku w którym znajdują się cykliczne wydarzenia – daty i opisy
(format pliku dowolny, przykład formatu: ''12.31 imieniny Sylwestra'').
\\
Bez argumentów, skrypt wyświetla wszystkie wydarzenia które dotyczą najbliższych
dwóch tygodni, lub jeśli w przeciągu dwóch tygodni są mniej niż trzy wydarzenia,
to wyświetla trzy najbliższe wydarzenia.
\\
Z właściwymi argumentami skrypt dodaje nowe wydarzenia, usuwa istniejące bądź wypisuje
najbliższe wystąpienie każdego wydarzenia porządkując wyniki chronologicznie.
**~~Temat.#~~.**
Pokaz slajdów / prezentacja w Bashu.
\\
Skrypt ma wyświetlać w terminalu po kolei pliki znajdujące się we wskazanym
w argumentach skryptu katalogu.
Nawigacja między kolejnymi "slajdami" ma odbywać się przy wykorzystaniu
odpowiednich klawiszy z klawiatury, po naciśnięciu których skrypt ma przechodzić
do kolejnego slajdu, przechodzić do poprzedniego slajdu, oraz wyświetlać listę
plików i z tej listy przejść do dowolnego slajdu.
Na każdym slajdzie, poza treścią pliku, ma znajdować się pasek stanu z numerem
slajdu, łączną liczbą slajdów i nazwą pliku.
\\
Jeśli któryś z plików jest kodem źródłowym, ma on zostać wypisany z kolorowaniem
składni.
\\
W Bashu, komenda ''read -sn1'' wczytuje pojedynczy znak bez wypisywania go na ekran.
Zauważ, że strzałka generuje trzy znaki.
\\
Do kolorowania składni użyj zewnętrznego narzędzia (np. ''pygmentize'').
**~~Temat.#~~.**
Generowanie miniaturek.
\\
Skrypt przyjmuje jako argument listę katalogów.
Skrypt generuje dla każdego obrazu znajdującego się bezpośrednio w podanych
katalogach miniaturę o określonym rozmiarze i umieszcza ją w podkatalogu ''tn''
w katalogu w którym znajduje się obraz. Miniaturkom ustawia czasy modyfikacji,
zmiany i dostępu na identyczne jak odpowiednie czasy obrazu.
Dodatkowo w każdym podkatalogu ''tn'' skrypt tworzy obraz o nazwie ''cover.jpg''
z pierwszymi 25 miniaturkami ułożonymi w siatce 5x5.
\\
Skrypt wypisuje na ekranie nazwę każdego przetwarzanego obrazu.
\\
W zadaniu zaleca się skorzystać z programu ''file'' do wykrywania typu MIME
i pakietu narzędzi imagemagick do operacji na obrazkach (tzn. programów
''convert''/''magick'' oraz ''montage'').
**~~Temat.#~~.**
Tworzenie śladów GPX z geotagowanych zdjęć.
\\
Skrypt ma przeglądać rekurencyjnie podane katalogi w poszukiwaniu plików ''.jpg''.
Dla każdego znalezionego pliku skrypt ma wyciągnąć pozycję GPS (//GPSPosition//)
oraz datę i czas wykonania zdjęcia (//CreateDate//) z tagów (metadanych) EXIF.
Na tej podstawie ma zostać utworzony plik GPX zawierający ślady (pozycja + data)
oraz ścieżki (pozycja + URL do zdjęcia).
Odcinki śladów/ścieżek mają być tworzone tak, by kolejne zdjęciami w jednym
odcinku dzieliło mniej niż ustalony czas (np. godzina).
Zdjęcia bez wymaganych tagów mają być pomijane.
Skrypt ma wypisywać podsumowanie: łączną liczbę zdjęć, liczbę zdjęć z tagami,
oraz liczbę wygenerowanych śladów/ścieżek.
\\
Do napisania i testowania skryptu potrzebujesz geotagowanych zdjęć – proszę je
zorganizować we własnym zakresie, np. robiąc zdjęcia telefonem bądź aparatem
fotograficznym z działającym odbiornikiem GPS.
\\
Polecenie ''exiftool'' pozwala wyciągać metadane z plików.
Liczne narzędzia, np. ''gpxsee'', wyświetlą plik GPX (pod warunkiem że będzie
zgodny z odpowiednim standardem).
++++ Przykładowy (uproszczony) plik GPX |
2024.04.01
2024.04.01
/home/user/zdjecia/1.jpg image/jpeg
<img width=128 height=128 src="/home/user/zdjecia/1.jpg">
/home/user/zdjecia/2.jpg image/jpeg
<img width=128 height=128 src="/home/user/zdjecia/2.jpg">
++++
**~~Temat.#~~.**
Porządkowanie zdjęć.
\\
Skrypt przyjmuje jako pierwszy argument katalog docelowy, a jako kolejne listę
katalogów źródłowych.
\\
Skrypt ma porządkować katalog ze zdjęciami. Ma przenieść każdy plik z katalogów
źródłowych (rekurencyjnie) do podkatalogu ''rok/miesiąc/dzień'' w katalogu
docelowym i zmienić plikom nazwy na ''godzina_minuta_sekunda__//stara_nazwa//''.
Jako datę skrypt ma brać dane EXIF (//CreateDate//, //DateTimeOriginal//) lub datę
modyfikacji pliku jeśli plik nie ma danych EXIF.
Jeśli dwa pliki z katalogów źródłowych mają tę samą nazwę i daty, skrypt ma
dodawać na koniec nazwy (przed rozszerzenie) kolejne numery tak żeby nie
stracić żadnego pliku.
\\
W trackie pracy skrypt ma wypisywać linię ''plik źródłowy --> plik docelowy''
\\
W zadaniu zaleca się skorzystać z programu ''exiftool'' do wyciągania metadanych o pliku.
**~~Temat.#~~.**
Ściąganie obrazków ze strony.
\\
Skrypt przyjmuje jako argument listę adresów URL do stron www.
\\
Skrypt pobiera wskazane strony i wyciąga z nich adresy obrazów (przez obraz
należy rozumieć tag ''