przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
so
»
2025
»
skrypty_tematy
so:2025:skrypty_tematy
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
==== Skrypty powłoki ==== Do zaliczenia przedmiotu każda osoba musi napisać dwa wybrane przez siebie skrypty i wysłać je jako dwa osobne załączniki mailem do **7 czerwca** (AoE). Proszę o wpisanie ''[SO]'' na początku tematu maila. Poniżej lista tematów skryptów. Do listy tematów mogę dopisać inne – proszę o propozycje mailem. ----------- Jeżeli skrypt tworzy tymczasowe pliki na czas swojego działania, to trzeba zapewnić że: * nie nadpisze istniejących plików, * wszystkie tymczasowe pliki zostaną usunięte przy zakończeniu pracy (zarówno normalnym, jak przez sygnał INT lub TERM), * uruchomienie skryptu współbieżnie ze sobą samym musi nie psuć się z powodu użycia tych samych plików tymczasowych. ==== Lista tematów ==== **~~Temat.#~~.** Samorozpakowujący się skrypt kompilujący i sprawdzający poprawność działania skompilowanego programu \\ Skrypt ma osadzone [[https://en.wikipedia.org/wiki/Archive_file|archiwum]] z kodem źródłowym wybranego programu. Po uruchomieniu skrypt sprawdza czy spełnione są określone wymagania, m. inn: czy są dostępne potrzebne kompilatory i biblioteki, czy jest dość miejsca na dysku, czy wskazany katalog docelowy nie istnieje bądź jest pusty. Następnie skrypt rozpakowuje kod źródłowy do wskazanego katalogu docelowego i kompiluje go. Po skompilowaniu skrypt tworzy środowisko testowe (np. pliki testowe) do sprawdzenia czy skompilowany kod działa poprawnie, wykonuje testy i po przejściu testów usuwa niepotrzebne pliki (środowisko testowe, pośrednie pliki kompilacji, kod źródłowy). **~~Temat.#~~.** Skrypt instalujący i konfigurujący LAMP na wybranej dystrybucji Linuksa. \\ Skrypt ma być uruchamiany jako root na konkretnej dystrybucji Linuksa. Najpierw ma zainstalować wybrany serwer HTTP (np. apache, nginx, lighttpd…), wybrany serwer bazy danych (mysql, mariadb, postgresql, …) oraz PHP. Następnie skrypt ma skonfigurować zainstalowane serwery – umieścić wcześniej przygotowaną stronę w głównym katalogu serwera HTTP, stworzyć bazę danych i konfigurować dostęp do niej, oraz skonfigurować działanie PHP na serwerze HTTP. \\ Dostęp do bazy danych musi być chroniony losowym hasłem, umieszczanym w trakcie działania skryptu w pliku konfiguracyjnym instalowanej strony. \\ <small>[[https://en.wikipedia.org/wiki/LAMP_(software_bundle)|LAMP]] to nazwa na typowy zestaw programów potrzebnych do działania wielu popularnych aplikacji webowych.</small> **~~Temat.#~~.** Rekurencyjne oczyszczanie nazw plików. \\ Skrypt ma rekurencyjnie poprawiać nazwy plików we wszystkich podanych jako argumenty katalogach tak, by zawierały w nazwach tylko znaki z listy dozwolonych znaków. Skrypt przyjmuje przełączniki, które: określają dozwolone znaki w nazwach plików, wybierają na co są zastępowane niedozwolone znaki, wybierają co ma się dziać jeśli po oczyszczeniu wiele nazw katalogów mapuje się na tę samą nazwę – czy zawartości katalogów są łączone czy na koniec nazw katalogów dodawane są końcówki (np. kolejne liczby). Skrypt musi wspierać wielobajtowe znaki (np. Unicode) w liście dozwolonych znaków. Żaden plik nie może zostać utracony w wyniku działania skryptu; jeśli nazwy dwóch zwykłych plików po oczyszczeniu są identyczne, do nazwy jednego z plików należy dodać końcówkę (np. kolejne liczby). \\ <small> Podpowiedź: ''sed 's/[^//dozwolone//]/_/g//i//'' zastępuje wszystkie znaki spoza listy ''//dozwolone//'' na ''_''. Końcówka ''//i//'' ignoruje wielkość liter. <html><div style="margin-top:-1.2em"></div></html> ++++ Przykładowe wywołanie skryptu i wynik działania | <html><pre style="line-height:1em"> <b>$ tree</b> . ├── dir │ ├── my data │ │ ├── 1.txt │ │ └── 3.txt │ └── my_data │ ├── 2.txt │ └── 3.txt └── Super[something] ├── super! │ └── chaszcze#5 └── super🕴 └── gąszcz <b>$ ./fix_names --allowed 'a-z0-9ąćęłńóśźź' --case-insensitive --replacement '_' --merge dir</b> <b>$ tree</b> . ├── dir │ └── my_data │ ├── 1.txt │ ├── 2.txt │ ├── 3.txt │ └── 3.txt.1 └── Super[something] ├── super! │ └── chaszcze#5 └── super🕴 └── gąszcz <b>$ ./fix_names --allowed 'a-z0-9ąćęłńóśźź' --case-insensitive --replacement '_' --suffix dir 'Super[something]'</b> <b>$ tree</b> . ├── dir │ └── my_data │ ├── 1.txt │ ├── 2.txt │ ├── 3.txt │ └── 3.txt.1 └── Super_something_ ├── super_ │ └── chaszcze_5 └── super_.1 └── gąszcz </pre></html> ++++ </small> **~~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. <small>''⢀⢠⢰⢸⡀⣀⣠⣰⣸⡄⣄⣤⣴⣼⡆⣆⣦⣶⣾⡇⣇⣧⣷⣿''</small>, <small>''▁▂▃▄▅▆▇█''</small> czy <small>''▗▐▖▄▟▌▙█''</small>). \\ <small> 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. \\ Dla inspiracji możesz spojrzeć jak formatuje wykresy program ''[[https://github.com/aristocratos/btop|btop]]''. </small> **~~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. \\ <small> 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). </small> **~~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. \\ <small> 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. </small> **~~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ą. \\ <small> 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. </small> <html><!-- **~~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. --> </html> **~~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. \\ <small> 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''). </small> **~~Temat.#~~.** Generowanie miniaturek i tworzenie prostego indeksu HTML. \\ 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żdy katalogu w którym był przynajmniej jeden obraz skrypt generuje plik ''index.html''. Plik ma być poprawną stroną HTML o tytule identycznym jak nazwa katalogu. Strona ma zawierać, dla każdego pliku obrazu, jeden element ''%%<div style="display:inline-block">%%'' w którym znajduje się miniaturka obrazu i jego nazwa, a kliknięcie w ten element musi otwierać ten obraz. \\ Skrypt wypisuje na ekranie nazwę każdego przetwarzanego obrazu. \\ <small> W zadaniu zaleca się skorzystać z programu ''file'' do wykrywania typu MIME i pakietu narzędzi imagemagick do operacji na obrazkach (tzn. programu ''magick''). </small> **~~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. \\ <small> 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). <html><div style="margin-top:-1.2em"></div></html> ++++ Przykładowy (uproszczony) plik GPX | <code xml> <gpx version="1.1"> <trk> <name>2024.04.01</name> <trkseg> <trkpt lat="52.40417" lon="16.95063"> <time>2024-04-01T12:00:00Z</time> </trkpt> <trkpt lat="52.40292" lon="16.94928"> <time>2024-04-01T12:01:00Z</time> </trkpt> </trkseg> </trk> <rte> <name>2024.04.01</name> <rtept lat="52.40417" lon="16.95063"> <link href="file:///home/user/zdjecia/1.jpg"><text>/home/user/zdjecia/1.jpg</text><type>image/jpeg</type></link> <desc><img width=128 height=128 src="/home/user/zdjecia/1.jpg"></desc> </rtept> <rtept lat="52.40292" lon="16.94928"> <link href="file:///home/user/zdjecia/2.jpg"><text>/home/user/zdjecia/2.jpg</text><type>image/jpeg</type></link> <desc><img width=128 height=128 src="/home/user/zdjecia/2.jpg"></desc> </rtept> </rte> </gpx> </code> ++++ </small> **~~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'' \\ <small> W zadaniu zaleca się skorzystać z programu ''exiftool'' do wyciągania metadanych o pliku. </small> <html><!-- **~~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 ''<img …'' z argumentem ''src''). Następnie skrypt ściąga wszystkie obrazy z nazwami nie istniejącymi w bieżącym katalogu. Skrypt ściąga obrazy równolegle, ale z określoną górną ilością współbieżnych pobierań. \\ Skrypt wypisuje na ekranie każdy znaleziony na stronie obraz, wypisuje czy istnieje w bieżącym katalogu czy też będzie pobrany, oraz wypisuje komunikat o zakończeniu pobierania każdego obrazu. \\ <small> W zadaniu zaleca się skorzystać z programu ''wget'' lub ''curl'' do pobierania plików z sieci. </small> --></html> **~~Temat.#~~.** Wyszukiwanie identycznych plików. \\ Skrypt przyjmuje jako argument listę katalogów. \\ Skrypt przeszukuje rekurencyjnie podane katalogi w poszukiwaniu identycznych plików. Najpierw grupuje znalezione pliki rozmiarami, następnie w każdej grupie w której jest więcej niż jeden plik liczy sumy MD5 każdego pliku. Jeśli dwa lub więcej plików ma tę samą sumę MD5, porównuje je dla pewności programem ''cmp''. \\ Skrypt wypisuje na standardowe wyjście grupy identycznych plików (każda nazwa w osobnej linii) oddzielone od siebie pustą linią. **~~Temat.#~~.** Rekurencyjne wyszukiwanie tekstu w katalogach. \\ Skrypt przyjmuje jako pierwszy argument wyszukiwane wyrażenie, jako kolejne listę katalogów. \\ Skrypt wyszukuje w plikach w podanych katalogach (rekurencyjnie) podanego wyrażenia. Skrypt sprawdza rodzaj pliku i dla formatów zawierających tekst, ale nie będących plikami tekstowymi ma w locie (bez tworzenia plików na dysku) przetworzyć plik na tekst i w nim wyszukiwać podanego wyrażenia. Skrypt ma obsługiwać przynajmniej wyciąganie strumienia tekstu z plików PDF (''pdftotext''), ma szukać w plikach skompresowanych (''.gz''/''.bz2''/''.xz''…) używając odpowiednio ''zgrep''/''bzgrep''/''xzgrep''…, oraz w archiwach ZIP takich jak pliki ''.zip'', książki elektroniczne (''.epub''/''.mobi''/…), dokumenty MS Office (''.docx''/''.pptx''/…) czy pliki Open Document Format (''.odt''/''.odp''/…), używając np. ''unzip -c'' do ich rozpakowania. \\ Skrypt pozwala za pomocą przełączników wybrać format wyjścia: albo same nazwy pasujących plików, albo dla każdego pliku w którym jest szukany tekst wypisuje nazwę pliku oddzieloną dwukropkiem od pierwszej pasującej linii, albo dla wszystkich pasujących linii wypisuje nazwę pliku oddzieloną dwukropkiem od tej linii. \\ Skrypt ma nie wyświetlać komunikatów o braku dostępu do plików. **~~Temat.#~~.** Kopie zapasowe z wykorzystaniem ''rsync''. \\ Skrypt ma wykonywać różnicową kopię zapasową, używając: listy katalogów źródłowych umieszczonej w osobnym pliku oraz listy wzorców ścieżek które mają być wykluczone z kopii zapasowej. Kopie zapasowe mają trafiać do określonego (w zmiennej na początku skryptu) katalogu na zdalnej maszynie (rsync wspiera przesyłanie plików po SSH). Po wykonaniu skryptu wskazana ścieżka ma zawierać katalogi nazwane jak katalogi na w liście katalogów źródłowych, z identyczną zawartością jak katalogi źródłowe, za wyjątkiem plików których ścieżka pasuje do listy wykluczeń. Każdorazowe uruchomienie skryptu ma tworzyć osobny katalog z datą uruchomienia skryptu do którego trafiają zmienione od ostatniego uruchomienia skryptu pliki. \\ (NB: program ''rsync'' z odpowiednimi argumentami automatycznie wykona powyższe zadania.) \\ Po wykonaniu kopii skrypt ma stworzyć plik z listą plików usuniętych od ostatniego uruchomienia skryptu, plik z listą zmienionych plików oraz plik z listą nowych plików, pod nazwami składającymi się z daty uruchomienia skryptu oraz przyrostków ''.del'', ''.mod'' i ''.new''. \\ W trakcie działania skrypt ma wypisywać co robi. Po skończeniu, skrypt ma wypisać ile czasu zajęło zrobienie kopii zapasowej i jak duży jest katalog z usuniętymi i zmodyfikowanymi plikami. \\ <small> W skrypcie należy użyć programu ''rsync'' z opcjami ''--backup'', ''--backup-dir'' oraz ''--exclude-from''. Zaleca się też skorzystać z programów ''find'' i ''comm'' do generowania list plików. </small> <html><!-- **~~Temat.#~~.** Porównanie metod kompresji. \\ Skrypt przyjmuje jeden argument – nazwę pliku. \\ Skrypt kompresuje podany plik używając przynajmniej programów ''gzip'', ''bzip2'', ''xz'' i ''zstd'' z przynajmniej trzema porównywalnymi ustawieniami (profilami) dla każdego z tych programów (np. domyślne ustawienia, najwyższy poziom kompresji, średni poziom kompresji i użycie wielu wątków). \\ Skrypt mierzy czas kompresji i rozmiar skompresowanych plików i na tej podstawie wyświetla na ekranie tabele czasu kompresji i poziomu kompresji mające w kolumnach nazwy programów a w wierszach profile (ewentualnie na odwrót). \\ Tabele mają być powtórzone dla wartości bezwzględnych (tzn. w mega-/kilo-/bajtach i sekundach) oraz wartościach procentowych względem rozmiaru oryginalnego pliku i najkrótszego czasu. \\ Skrypt ma kompresować plik do plików tymczasowych usuwanych po wykonaniu pomiarów, oraz nie może nadpisać ani usunąć żadnego z istniejących plików (rozważ użycie programu ''mktemp''). --> </html> **~~Temat.#~~.** Sprawdzanie czy program generuje poprawny wynik. \\ Skrypt przyjmuje jako argument nazwę polecenia. \\ Skrypt z pliku (o nazwie ustawionej jako zmienna na początku skryptu) czyta kolejno ścieżki do pliku z poprawnymi wynikami oraz listę argumentów z którymi takie wyniki powinny zostać otrzymane. Dla każdego takiego pliku skrypt uruchamia podane polecenie z odpowiadającymi argumentami i porównuje wynik polecenia z oczekiwanym. Skrypt ma uruchamiać polecenie równolegle, tak by wykorzystywać wszystkie dostępne wątki procesorów. \\ Skrypt wyświetla na standardowym wyjściu kolejne nazwy plików z oczekiwanymi wynikami i jeśli testowany program wygenerował poprawne wyniki, to dodaje słowo ''pass'', a jeśli nie, dodaje na czerwono słowo ''FAIL'' i wypisuje pierwszą różniącą się linię. Jeśli w trakcie uruchomienia testowany program wypisał jakieś dane na standardowy błąd, to skrypt pod linią dotyczącą testowanych argumentów ma wyświetlić te dane, wcinając każdą linię tabulatorem. <html> <!-- brainstorm: setting up sound levels, mouse sensitivity, keyboard something, ''.bashrc'' that for interactive sessions sets aliases, prompt, configures history and PATH, creates a function, and outputs something fancy on screen - too easy, expand that? re-write inxi? simple munin? cron script display disk use for all mounted fses? sixel based something creating keys for public key based infrastructure exercise a target pid with perf, flamegraph, lsof, get memory maps to a file, record proc contents, ... dot some graph? **~~Temat.#~~** Histogram odpowiedzi w pytaniach z kolokwium. \\ Skrypt przyjmuje jako argument ścieżkę do pliku z wynikami kolokwium. Przykładowy plik wejściowy zamieszczony jest poniżej. Fragment ''Q14[A+,D-]'' oznacza, że w pytaniu 14 zaznaczono poprawną odpowiedź A i błędną D. \\ Skrypt dla każdego pytania liczy ile razy padła dana odpowiedź, następnie wypisuje nazwę pytania i dla każdej odpowiedzi wypisuje linię składającą się z odpowiedniej litery i znaku ''='' powtórzonego tyle razy ile ta odpowiedź została zaznaczona. Linie z poprawnymi odpowiedziami mają być wypisane kolorem zielonym, z błędnymi kolorem czerwonym. \\ <html><a class="folder" href="#folded_b4309ce23b05322cc91df4196088516a_1">Przykładowy plik wejściowy</a> <div class="folded hidden" id="folded_b4309ce23b05322cc91df4196088516a_1"> <pre style="line-height:1em"> 07.16.52:8.6:17:Q6[A+](1);Q85[A+](1);Q83[E-](0);Q80[D+](1);Q58[E+](1);Q26[D-](0);Q61[D-](0);Q4[B+,A+](1);Q77[A+](1);Q69[B+](1);Q31[F+](1);Q94[A+](1);Q28[A+](1);Q57[D-,C-](0);Q70[D-,B+](0.5);Q23[A+](1);Q16[C-](0);Q89[C-](0);Q48[A+](1);Q20[D-](0);Q46[E-,B+](0.5);Q67[C+](1);Q40[B+,A+](1);Q12[A+](1);Q54[C-](0);Q39[A+](1) 07.18.23:10.1:19.5:Q79[D+](1);Q73[D+](1);Q29[A+](1);Q55[D+](1);Q84[E-](0);Q18[A+](1);Q91[A+](1);Q60[D+](1);Q5[A+](1);Q3[A+,B+](1);Q22[B-](0);Q44[A+,B-](0.5);Q50[B+](1);Q37[E-](0);Q40[A+,B+](1);Q63[C+](1);Q70[B+,A+](1);Q26[D-](0);Q66[B+](1);Q15[D-](0);Q35[C+](1);Q51[A+](1);Q81[B+,A+](1);Q89[A+](1);Q69[E-](0);Q12[A+](1) 07.19.14:10.8:17:Q59[C+](1);Q32[A+](1);Q13[A+](1);Q41[B-](0);Q69[B+](1);Q27[C-](0);Q85[A+](1);Q23[A+](1);Q47[F-,B+](0.5);Q7[D-](0);Q65[G-,E+](0.5);Q3[B+,A+](1);Q57[C-,A+](0.5);Q80[D+](1);Q48[A+](1);Q53[A-](0);Q20[B-](0);Q89[A+](1);Q62[B+](1);Q12[A+](1);Q81[H-,B+](0.5);Q77[A+](1);Q91[A+](1);Q30[A+](1);Q37[C-](0);Q71[E-](0) 07.20.12:12:16.5:Q54[E-](0);Q84[A+](1);Q10[F-](0);Q25[D-](0);Q39[A+](1);Q74[E-](0);Q72[A+](1);Q43[A+,E-](0.5);Q63[C+](1);Q4[B+,A+](1);Q55[D+](1);Q29[A+](1);Q49[E+](1);Q60[D+](1);Q16[A+](1);Q87[A+](1);Q7[D-](0);Q22[B-](0);Q68[B+](1);Q79[D+](1);Q34[D-](0);Q83[E-](0);Q40[A+,B+](1);Q20[D-](0);Q90[A+](1);Q64[C+,E+](1) 07.22.06:13.7:19:Q62[B+](1);Q80[D+](1);Q68[B+](1);Q10[B+](1);Q56[E+](1);Q72[A+](1);Q26[D-](0);Q33[E-,D+](0.5);Q42[A+](1);Q89[A+](1);Q67[C+](1);Q7[D-](0);Q86[B-](0);Q82[A+,D-](0.5);Q16[A+](1);Q17[A+](1);Q38[B-](0);Q59[C+](1);Q29[A+](1);Q54[D-](0);Q91[A+](1);Q49[E+](1);Q22[B-](0);Q43[A+,D+](1);Q73[D+](1);Q1[F+,A+](1) 07.23.10:14.9:24:Q91[A+](1);Q68[B+](1);Q60[D+](1);Q1[F+,A+](1);Q48[A+](1);Q17[A+](1);Q6[A+](1);Q39[A+](1);Q80[D+](1);Q88[A+](1);Q30[A+](1);Q84[A+](1);Q45[D+,B+](1);Q57[A+,C-](0.5);Q63[C+](1);Q27[B+](1);Q65[B+,A-](0.5);Q72[C-](0);Q83[A+](1);Q53[B+](1);Q16[A+](1);Q11[A+](1);Q32[A+](1);Q73[D+](1);Q22[A+](1);Q41[A+](1) 07.23.33:15.2:21:Q39[A+](1);Q40[B+,A+](1);Q79[D+](1);Q68[B+](1);Q60[D+](1);Q62[B+](1);Q50[B+](1);Q43[D+,A+](1);Q19[D-](0);Q9[A+](1);Q3[B+,A+](1);Q33[D+,B+](1);Q74[D+](1);Q88[A+](1);Q29[A+](1);Q91[A+](1);Q8[A+](1);Q64[C+,E+](1);Q56[E+](1);Q27[C-](0);Q81[B+,A+](1);Q84[B-](0);Q23[A+](1);Q72[C-](0);Q14[B+,A+](1);Q53[A-](0) 07.24.54:16.7:23.5:Q75[A+](1);Q63[C+](1);Q80[D+](1);Q72[A+](1);Q25[A+](1);Q85[A+](1);Q6[A+](1);Q55[D+](1);Q67[C+](1);Q82[C-,A+](0.5);Q34[A+](1);Q69[B+](1);Q3[A+,B+](1);Q89[A+](1);Q60[D+](1);Q21[A+](1);Q50[B+](1);Q42[A+](1);Q12[A+](1);Q18[A+](1);Q37[A-](0);Q29[A+](1);Q51[A+](1);Q47[B+,D+](1);Q91[A+](1);Q16[C-](0) 07.25.14:16.9:19:Q9[A+](1);Q71[A+](1);Q82[C-,A+](0.5);Q59[C+](1);Q63[C+](1);Q49[E+](1);Q26[D-](0);Q8[C-](0);Q15[C-,D-](0);Q3[B+,A+](1);Q87[A+](1);Q40[B+,A+](1);Q18[A+](1);Q44[A+,E-](0.5);Q28[A+](1);Q22[A+](1);Q66[A-](0);Q55[D+](1);Q79[D+](1);Q92[A+](1);Q39[A+](1);Q68[B+](1);Q85[A+](1);Q34[A+](1);Q51[B-](0);Q73[C-](0) 07.25.28:17.2:20.5:Q90[A+](1);Q38[C-](0);Q53[A-](0);Q87[A+](1);Q50[B+](1);Q62[B+](1);Q27[A-](0);Q7[C-](0);Q73[D+](1);Q59[C+](1);Q18[A+](1);Q1[F+,A+](1);Q78[D+](1);Q42[A+](1);Q72[A+](1);Q23[A+](1);Q56[E+](1);Q43[A+,D+](1);Q35[C+](1);Q69[B+](1);Q10[B+](1);Q14[C-,D-](0);Q85[A+](1);Q64[E+,F-](0.5);Q82[B+,A+](1);Q29[A+](1) 07.25.47:17.4:20:Q63[C+](1);Q93[B-](0);Q70[B+,D-](0.5);Q85[A+](1);Q74[E-](0);Q87[D-](0);Q53[A-](0);Q50[B+](1);Q34[A+](1);Q18[A+](1);Q80[D+](1);Q5[A+](1);Q81[A+,B+](1);Q67[C+](1);Q23[A+](1);Q14[A+,D-](0.5);Q55[D+](1);Q42[A+](1);Q27[A-](0);Q28[A+](1);Q1[F+,A+](1);Q60[D+](1);Q10[B+](1);Q37[B+](1);Q68[B+](1);Q47[D+,B+](1) 07.30.21:22.1:16.5:Q69[B+](1);Q57[C-,B+](0.5);Q23[A+](1);Q33[D+,B+](1);Q83[E-](0);Q9[A+](1);Q30[A+](1);Q27[B+](1);Q8[C-](0);Q18[A+](1);Q78[D+](1);Q38[C-](0);Q14[D-,A+](0.5);Q87[A+](1);Q85[A+](1);Q76[D-](0);Q48[A+](1);Q1[A+,F+](1);Q67[C+](1);Q52[C-](0);Q42[A+](1);Q62[B+](1);Q93[D-](0);Q43[E-,A+](0.5);Q71[D-](0);Q59[B-](0) 07.31.09:22.9:17.5:Q42[B-](0);Q60[D+](1);Q33[B+,D+](1);Q84[A+](1);Q21[E-](0);Q79[D+](1);Q17[A+](1);Q14[C-,D-](0);Q61[C-](0);Q82[D-,A+](0.5);Q6[A+](1);Q88[A+](1);Q56[C-](0);Q9[A+](1);Q51[A+](1);Q73[D+](1);Q48[A+](1);Q44[C+,A+](1);Q70[B+,A+](1);Q68[B+](1);Q26[D-](0);Q29[C-](0);Q39[A+](1);Q1[A+,F+](1);Q94[D-](0);Q65[B+,E+](1) 07.31.24:23.1:25:Q16[A+](1);Q62[B+](1);Q11[A+](1);Q58[E+](1);Q94[A+](1);Q45[B+,D+](1);Q23[A+](1);Q80[D+](1);Q87[A+](1);Q30[A+](1);Q49[E+](1);Q57[A+,B+](1);Q1[A+,F+](1);Q41[A+](1);Q76[A+](1);Q6[A+](1);Q82[A+,B+](1);Q27[C-](0);Q32[A+](1);Q64[E+,C+](1);Q38[A+](1);Q70[A+,B+](1);Q84[A+](1);Q69[B+](1);Q20[A+](1);Q54[B+](1) 09.02.43:7.2:20.5:Q78[D+](1);Q91[A+](1);Q20[D-](0);Q52[B+](1);Q4[B+,A+](1);Q71[E-](0);Q31[F+](1);Q28[A+](1);Q49[E+](1);Q58[A-](0);Q9[A+](1);Q25[B-](0);Q61[A+](1);Q5[A+](1);Q76[A+](1);Q89[A+](1);Q66[B+](1);Q81[B+,A+](1);Q86[A+](1);Q41[A+](1);Q23[A+](1);Q69[B+](1);Q46[B+,A-](0.5);Q14[D-,C-](0);Q57[A+,B+](1);Q38[A+](1) 09.04.59:9.5:12.5:Q87[A+](1);Q46[C-,A-](0);Q41[E-](0);Q28[A+](1);Q54[C-](0);Q12[A+](1);Q49[E+](1);Q20[D-](0);Q8[B-](0);Q83[E-](0);Q72[A+](1);Q57[B+,D-](0.5);Q64[E+,C+](1);Q69[A-](0);Q86[C-](0);Q16[A+](1);Q4[B+,A+](1);Q25[D-](0);Q63[C+](1);Q74[E-](0);Q38[B-](0);Q21[E-](0);Q80[D+](1);Q91[A+](1);Q58[B-](0);Q33[D+,B+](1) 09.05.50:10.2:15:Q1[B-,F+](0.5);Q42[A+](1);Q33[F-,B+](0.5);Q38[D-](0);Q30[A+](1);Q50[E-](0);Q20[D-](0);Q23[A+](1);Q11[A+](1);Q61[A+](1);Q67[C+](1);Q44[B-,D-](0);Q86[A+](1);Q68[B+](1);Q72[A+](1);Q56[E+](1);Q6[A+](1);Q81[E-,H-](0);Q60[D+](1);Q88[A+](1);Q76[D-](0);Q16[B-](0);Q90[A+](1);Q52[C-](0);Q78[C-](0);Q26[B-](0) 09.06.11:10.6:20:Q94[D-](0);Q6[A+](1);Q89[A+](1);Q21[A+](1);Q53[A-](0);Q10[F-](0);Q70[C-,B+](0.5);Q27[C-](0);Q69[B+](1);Q15[D-,B+](0.5);Q34[B-](0);Q37[B+](1);Q61[A+](1);Q42[A+](1);Q79[D+](1);Q49[E+](1);Q29[A+](1);Q81[B+,A+](1);Q43[D+,A+](1);Q60[D+](1);Q55[D+](1);Q18[A+](1);Q64[C+,E+](1);Q77[A+](1);Q4[A+,B+](1);Q84[A+](1) 09.06.12:10.7:16:Q34[E-](0);Q72[B-](0);Q29[C-](0);Q85[A+](1);Q94[A+](1);Q24[A+](1);Q67[C+](1);Q49[E+](1);Q88[A+](1);Q39[A+](1);Q17[B-](0);Q68[B+](1);Q1[A+,F+](1);Q57[F-,B+](0.5);Q61[D-](0);Q8[A+](1);Q22[B-](0);Q81[B+,A+](1);Q14[D-,C-](0);Q52[B+](1);Q40[B+,F-](0.5);Q60[D+](1);Q79[D+](1);Q73[B-](0);Q46[A-,E-](0);Q12[A+](1) 09.07.17:11.8:15:Q72[A+](1);Q19[D-](0);Q48[A+](1);Q21[E-](0);Q3[A+,B+](1);Q46[D+,A-](0.5);Q54[D-](0);Q15[D-,B+](0.5);Q64[D-,C+](0.5);Q80[D+](1);Q36[D+](1);Q10[F-](0);Q61[A+](1);Q92[A+](1);Q27[A-](0);Q8[](0);Q81[G-,B+](0.5);Q59[C+](1);Q57[A+,B+](1);Q29[A+](1);Q35[C+](1);Q89[D-](0);Q41[B-](0);Q75[D-](0);Q85[A+](1);Q69[B+](1) 09.07.36:12.1:18.5:Q49[E+](1);Q83[E-](0);Q6[A+](1);Q37[B+](1);Q85[A+](1);Q61[A+](1);Q78[D+](1);Q87[A+](1);Q9[B-](0);Q35[C+](1);Q41[D-](0);Q16[B-](0);Q73[C-](0);Q53[A-](0);Q24[A+](1);Q23[A+](1);Q60[D+](1);Q66[B+](1);Q55[D+](1);Q71[A+](1);Q46[B+,F-](0.5);Q91[A+](1);Q28[A+](1);Q19[D-](0);Q4[B+,A+](1);Q69[B+](1) 09.11.55:16.4:14:Q29[A+](1);Q9[F-](0);Q1[F+,A+](1);Q78[B-](0);Q71[D-](0);Q58[A-](0);Q73[C-](0);Q18[A+](1);Q91[A+](1);Q41[A+](1);Q48[A+](1);Q6[A+](1);Q13[A+](1);Q87[D-](0);Q54[D-](0);Q24[B-](0);Q36[D+](1);Q32[A+](1);Q45[D+,B+](1);Q82[D-,A+](0.5);Q65[E+,F-](0.5);Q61[D-](0);Q84[E-](0);Q55[D+](1);Q21[E-](0);Q68[B+](1) 09.13.46:18.2:22:Q57[A+,B+](1);Q30[A+](1);Q37[B+](1);Q1[A+,F+](1);Q58[A-](0);Q10[B+](1);Q82[B+,A+](1);Q51[C-](0);Q41[A+](1);Q34[A+](1);Q69[B+](1);Q86[A+](1);Q88[C-](0);Q13[A+](1);Q7[A+](1);Q23[A+](1);Q61[A+](1);Q78[D+](1);Q72[A+](1);Q24[A+](1);Q43[D+,A+](1);Q67[C+](1);Q90[A+](1);Q48[A+](1);Q75[A+](1);Q19[D-](0) 09.15.25:19.8:19.5:Q49[A-](0);Q66[B+](1);Q82[A+,E-](0.5);Q90[A+](1);Q56[F-](0);Q6[A+](1);Q11[D-](0);Q40[B+,A+](1);Q68[B+](1);Q16[A+](1);Q77[A+](1);Q25[A+](1);Q89[B-](0);Q4[B+,A+](1);Q78[D+](1);Q32[A+](1);Q85[A+](1);Q70[B+,A+](1);Q22[B-](0);Q17[A+](1);Q60[F-](0);Q53[B+](1);Q30[A+](1);Q61[A+](1);Q37[B+](1);Q43[A+,D+](1) 09.17.13:21.7:19.5:Q43[B-,D+](0.5);Q42[A+](1);Q7[C-](0);Q54[D-](0);Q60[F-](0);Q79[D+](1);Q88[A+](1);Q48[A+](1);Q56[E+](1);Q9[A+](1);Q29[B-](0);Q64[D-,C+](0.5);Q69[B+](1);Q25[A+](1);Q21[A+](1);Q85[A+](1);Q33[D+,B+](1);Q81[B+,A+](1);Q94[A+](1);Q3[B+,A+](1);Q17[A+](1);Q70[A+,B+](1);Q37[B+](1);Q15[D-,B+](0.5);Q76[C-](0);Q61[A+](1) 09.18.56:23.3:20.5:Q9[A+](1);Q81[A+,B+](1);Q21[E-](0);Q4[B+,A+](1);Q84[A+](1);Q71[A+](1);Q69[B+](1);Q33[E-,D+](0.5);Q90[A+](1);Q66[B+](1);Q51[B-](0);Q39[A+](1);Q48[A+](1);Q80[D+](1);Q55[D+](1);Q44[A+,C+](1);Q18[A+](1);Q76[A+](1);Q62[B+](1);Q27[D-](0);Q58[A-](0);Q41[A+](1);Q88[A+](1);Q30[A+](1);Q6[A+](1);Q15[D-,C-](0) 09.20.33:24.9:15.5:Q78[D+](1);Q58[A-](0);Q35[C+](1);Q30[D-](0);Q37[A-](0);Q54[B+](1);Q5[C-](0);Q21[A+](1);Q25[C-](0);Q66[B+](1);Q20[A+](1);Q48[A+](1);Q63[B-](0);Q87[A+](1);Q12[A+](1);Q42[B-](0);Q86[C-](0);Q73[B-](0);Q57[B+,D-](0.5);Q83[D-](0);Q2[A+,E+](1);Q13[A+](1);Q44[C+,A+](1);Q91[A+](1);Q68[B+](1);Q72[A+](1) 12.48.03:14.4:18:Q16[B-](0);Q63[C+](1);Q77[D-](0);Q59[C+](1);Q57[B+,A+](1);Q2[A+,E+](1);Q6[A+](1);Q22[B-](0);Q50[A-](0);Q80[B-](0);Q41[A+](1);Q53[B+](1);Q91[A+](1);Q85[A+](1);Q29[A+](1);Q46[D+,B+](1);Q31[F+](1);Q11[A+](1);Q67[C+](1);Q89[A+](1);Q83[B-](0);Q20[A+](1);Q72[B-](0);Q26[D-](0);Q39[A+](1);Q69[B+](1) 12.53.22:19.7:12:Q6[B-](0);Q9[A+](1);Q19[D-](0);Q80[B-](0);Q73[A-](0);Q23[A+](1);Q48[A+](1);Q71[A+](1);Q34[D-](0);Q67[C+](1);Q28[B-](0);Q89[B-](0);Q81[B+,A+](1);Q63[A-](0);Q26[B-](0);Q37[C-](0);Q15[D-,C-](0);Q55[D+](1);Q54[B+](1);Q69[B+](1);Q93[D-](0);Q43[A+,D+](1);Q60[F-](0);Q4[A+,B+](1);Q86[C-](0);Q42[A+](1) 12.53.36:20.5:14:Q19[A+](1);Q77[A+](1);Q55[A-](0);Q45[D+,A-](0.5);Q36[D+](1);Q94[A+](1);Q85[A+](1);Q78[D+](1);Q48[A+](1);Q4[A+,B+](1);Q83[D-](0);Q61[E-](0);Q53[A-](0);Q5[A+](1);Q29[C-](0);Q41[C-](0);Q72[B-](0);Q58[A-](0);Q68[B+](1);Q31[F+](1);Q25[A+](1);Q11[C-](0);Q13[B-](0);Q65[B+,F-](0.5);Q88[A+](1);Q21[E-](0) 12.54.10:20.5:16.5:Q29[D-](0);Q68[B+](1);Q50[E-](0);Q45[A-,D+](0.5);Q62[B+](1);Q25[D-](0);Q66[B+](1);Q55[D+](1);Q6[A+](1);Q53[A-](0);Q31[F+](1);Q70[A+,B+](1);Q19[D-](0);Q21[A+](1);Q83[C-](0);Q13[A+](1);Q88[A+](1);Q73[B-](0);Q39[A+](1);Q60[D+](1);Q79[D+](1);Q42[A+](1);Q1[F+,A+](1);Q86[C-](0);Q90[A+](1);Q11[D-](0) 12.55.36:22.1:19.5:Q68[B+](1);Q85[A+](1);Q24[A+](1);Q72[A+](1);Q23[A+](1);Q18[A+](1);Q48[A+](1);Q53[A-](0);Q80[D+](1);Q30[A+](1);Q59[C+](1);Q12[A+](1);Q13[A+](1);Q4[A+,B+](1);Q61[A+](1);Q36[D+](1);Q56[C-](0);Q40[B+,A+](1);Q83[C-](0);Q87[D-](0);Q35[A-](0);Q92[A+](1);Q47[B+](0.5);Q67[C+](1);Q75[E-](0);Q5[A+](1) 12.55.36:22.1:17.5:Q34[E-](0);Q60[D+](1);Q72[C-](0);Q78[D+](1);Q18[A+](1);Q49[E+](1);Q93[C-](0);Q2[E+,A+](1);Q40[B+,A+](1);Q44[A+,D-](0.5);Q25[A+](1);Q84[A+](1);Q61[B-](0);Q57[A+,B+](1);Q7[B-](0);Q67[C+](1);Q77[A+](1);Q38[B-](0);Q83[E-](0);Q89[A+](1);Q28[A+](1);Q23[A+](1);Q69[B+](1);Q54[B+](1);Q15[B+,A+](1);Q11[D-](0) 12.55.42:20.7:15.5:Q55[D+](1);Q25[B-](0);Q82[E-,A+](0.5);Q38[B-](0);Q59[B-](0);Q80[C-](0);Q91[A+](1);Q42[A+](1);Q45[B+,E-](0.5);Q12[B-](0);Q72[B-](0);Q31[F+](1);Q53[A-](0);Q84[A+](1);Q62[B+](1);Q3[A+,B+](1);Q23[A+](1);Q88[A+](1);Q48[A+](1);Q76[A+](1);Q30[C-](0);Q68[B+](1);Q65[E+,F-](0.5);Q6[B-](0);Q16[A+](1);Q19[A+](1) 12.56.24:22.7:13:Q65[B+,F-](0.5);Q7[D-](0);Q85[A+](1);Q29[A+](1);Q27[C-](0);Q38[B-](0);Q62[C-](0);Q4[B+,A+](1);Q59[B-](0);Q53[A-](0);Q56[C-](0);Q49[E+](1);Q77[A+](1);Q32[A+](1);Q93[C-](0);Q72[E-](0);Q89[A+](1);Q47[C-,B+](0.5);Q16[A+](1);Q69[B+](1);Q20[C-](0);Q12[A+](1);Q79[D+](1);Q42[A+](1);Q83[C-](0);Q23[B-](0) 12.57.35:23.8:19.5:Q29[A+](1);Q70[B+,A+](1);Q79[D+](1);Q16[A+](1);Q23[A+](1);Q41[B-](0);Q48[A+](1);Q77[A+](1);Q60[C-](0);Q31[D-](0);Q53[A-](0);Q12[A+](1);Q18[A+](1);Q68[B+](1);Q82[A+,E-](0.5);Q93[A+](1);Q45[B+,D+](1);Q1[A+,F+](1);Q62[B+](1);Q67[C+](1);Q8[A+](1);Q56[B-](0);Q38[A+](1);Q89[A+](1);Q85[A+](1);Q26[B-](0) 12.57.45:24.1:17:Q31[F+](1);Q8[C-](0);Q9[A+](1);Q49[E+](1);Q62[B+](1);Q28[A+](1);Q40[C-,F-](0);Q43[A+,D+](1);Q57[B+,A+](1);Q79[D+](1);Q22[A+](1);Q26[B-](0);Q39[A+](1);Q71[E-](0);Q75[A+](1);Q93[D-](0);Q17[D-](0);Q3[B+,A+](1);Q83[C-](0);Q52[B+](1);Q69[B+](1);Q14[D-,C-](0);Q86[A+](1);Q89[A+](1);Q64[E+,C+](1);Q60[C-](0) 12.57.51:24.3:22:Q54[B+](1);Q76[A+](1);Q2[A+,E+](1);Q38[A+](1);Q12[A+](1);Q57[A+,B+](1);Q72[D-](0);Q5[A+](1);Q68[B+](1);Q49[E+](1);Q60[D+](1);Q33[E-,D+](0.5);Q30[C-](0);Q87[E-](0);Q94[A+](1);Q41[A+](1);Q62[B+](1);Q19[A+](1);Q64[E+,C+](1);Q23[A+](1);Q79[D+](1);Q25[A+](1);Q82[A+,B+](1);Q13[A+](1);Q46[A-,B+](0.5);Q84[A+](1) 12.58.05:24.6:17:Q17[A+](1);Q36[D+](1);Q9[A+](1);Q85[A+](1);Q30[D-](0);Q52[C-](0);Q26[C-](0);Q8[C-](0);Q73[D+](1);Q22[B-](0);Q67[C+](1);Q45[C-,B+](0.5);Q49[E+](1);Q42[A+](1);Q16[A+](1);Q62[B+](1);Q34[A+](1);Q88[C-](0);Q72[B-](0);Q56[C-](0);Q78[D+](1);Q69[B+](1);Q59[C+](1);Q1[A+,F+](1);Q82[E-,A+](0.5);Q91[A+](1) 12.58.40:25.2:11:Q2[E+,A+](1);Q63[A-](0);Q82[B+,C-](0.5);Q20[B-](0);Q14[C-,D-](0);Q86[A+](1);Q38[A+](1);Q11[C-](0);Q22[E-](0);Q78[A-](0);Q90[A+](1);Q43[D+,A+](1);Q30[C-](0);Q87[E-](0);Q52[C-](0);Q72[B-](0);Q64[B-,E+](0.5);Q32[A+](1);Q41[A+](1);Q75[A+](1);Q56[D-](0);Q8[C-](0);Q48[A+](1);Q58[A-](0);Q27[D-](0);Q69[B+](1) 13.01.07:27.4:15.5:Q89[C-](0);Q90[A+](1);Q9[D-](0);Q7[D-](0);Q80[D+](1);Q18[A+](1);Q36[F-](0);Q4[B+,A+](1);Q33[F-,B+](0.5);Q54[C-](0);Q59[C+](1);Q24[A+](1);Q30[A+](1);Q83[B-](0);Q13[A+](1);Q69[B+](1);Q74[B-](0);Q64[E+,C+](1);Q47[B+,D+](1);Q63[C+](1);Q48[A+](1);Q41[C-](0);Q84[A+](1);Q72[A+](1);Q57[C-,F-](0);Q22[B-](0) </pre></div></html> --> </html> ~~META: language = pl ~~
so/2025/skrypty_tematy.txt
· ostatnio zmienione: 2025/05/21 02:14 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry