Zadanie 1 - KOMIKSY BIS ======================= WPROWADZENIE ============ Celem tego zadania jest napisanie skryptu służącego do tworzenia i zarządzania podręcznym zbiorkiem ulubionych komiksów. Zajrzyj tutaj: http://www.gocomics.com Możesz wybierać z bogatej oferty komiksów, z których większość ma nowe odcinki codziennie. Na przykład: http://www.gocomics.com/garfield http://www.gocomics.com/adamathome Naszym celem jest usprawnienie ściągania nowych odcinków ulubionych komiksów tak, aby nie trzeba było codziennie uruchamiać przeglądarki, wchodzić na strony itd... Na przykład obrazek z Garfieldem znajduje się zawsze w pliku http://images.ucomics.com/comics/ga/YYYY/gaYYMMDD.gif gdzie Y-rok, M-miesiac, D-dzień. Podobnie mają inne komiksy (zajrzyj do źródeł strony). Wystarczy ograniczyć się do takich komiksów, które pasują do tej reguły nazewnictwa (niektóre trochę odbiegają np. Calvin and Hobbes). Skrypt powinien umożliwiać ściąganie kilku komiksów z bieżącego dnia. Na stronie gocomics można przeglądać poprzednie odcinki każdego komiksu, do miesiąca wstecz. Niektóre obrazki są lepsze, a inne gorsze. Chcielibyśmy mieć możliwość łączenia komiksów w grupy "ulubionych" komiksów, z których każda byłaby opisana jakas krótką nazwą. Podział na grupy odbywałby się osobno w obrębie każdego komiksu. Wreszcie skrypt ma służyć do wyświetlania komiksów według typu, daty lub przynależności do ulubionej grupy. SZCZEGÓŁY ========= Rozwiązaniem zadania jest skrypt o nazwie comic, który ściąga co najmniej 2 różne komiksy (ustalone przez rozwiązującego). Wszystkie dane skryptu i ściągnięte obrazki powinny być przechowywane w katalogu .comic w katalogu domowym użytkownika, który skrypt wywołał. Do rozwiązania proszę dołączyć kompletny katalog .comic zawierający choć kilka obrazków (żebym miał od czego zacząć). Skrypt obsługuje następujące opcje: comic list ---------- Wypisuje obsługiwane komiksy. Najlepiej, żeby ich nazwy były krótkie, bo będą często używane np. "gar", "cal", "adam". Przykład: ./comic list gar adam comic show _komiks [_n] ----------------------- Pokazuje _n ostatnich odcinków komiksu _komiks. Jeśli nie podano _n wtedy jakąś stałą liczbę np. 5. Przykład: ./comic show gar 3 comic today ----------- Pokazuje wszystkie komiksy z dzisiaj. Jeżeli dzisiejszych nie ma, to pokazuje dla każdego komiksu ostatni odcinek, który jest. comic get [_n] -------------- Jeśli nie podano _n to ściąga dzisiejsze komiksy. W przeciwnym razie ściąga komiksy z _n ostatnich dni. Jeżeli odcinek z jakiegoś dnia jest już na dysku, to nie wolno pobierać go ponownie (minimalizujemy interakcję z siecią). Można założyć że użytkownik nie poprosi o komiksy z okresu który jest już niedostępny na stronie. comic fav _komiks _grupa [_data] -------------------------------- Dodaj odcinek z dnia _data komiksu _komiks do ulubionej grupy o nazwie _grupa. Opis grupy to jedno krótkie słowo bez spacji. Każdy odcinek może należeć do co najwyżej jednej grupy (może do żadnej) [patrz FAQ na końcu]. Podanie nazwy grupy, która dotychczas nie istniała automatycznie ją tworzy. Jeżeli data nie jest podana to chodzi o dzisiejszy odcinek. Przykład: ./comic fav gar randki-johna comic favList _komiks --------------------- Pokaż listę ulubionych grup z komiksu _komiks. Przy każdej grupie powinna być podana jej nazwa oraz liczba odcinków. Ostatnia powinna być sztuczna grupa obejmująca te odcinki, które nie są w żadnej innej grupie. Przykład: ./comic favList gar odie, 5 dieta, 8 randki-johna, 3 Inne, 5 comic favShow _komiks _grupa [_n] --------------------------------- Wyświetl wszystkie odcinki komiksu _komiks które należą do grupy _grupa. Użytkownik może podać tylko fragment nazwy grupy - jeżeli do podanego fragmentu pasuje dokładnie jedna nazwa grupy, to wyświetlamy tę grupę, a w przeciwnym razie informujemy o niejednoznaczonści. Jeżeli nie ma odpowiedniej grupy to też wyświetlamy komunikat. Obrazki z grupy należy pokazywać w kolejności chronologicznej, od najstarszych. Parametr _n jest opcjonalny - jeśli podany to wyświetlamy tylko _n najnowszych obrazków z danej grupy. Przykłady: ./comic favShow gar dieta [pokazuje obrazki z grupy dieta] ./comic favShow gar randki 3 [pokazuje 3 obrazki z serii randki-johna] ./comic favShow gar die 6 Niejednoznaczna nazwa grupy comic archive _komiks _rok _miesiac ----------------------------------- Tworzy w katalogu domowym użytkownika archiwum .tgz z wszystkimi posiadanymi odcinkami komiksu _komiks z miesiaca _miesiac roku _rok. Archiwum powinno mieć nazwę: _komiks-_rok-_miesiac.tgz Przykład: ./comic archive gar 2007 10 Powstaje plik gar-2007-10.tgz UWAGI ===== Do ściągania stron, obrazków itp. z WWW służy program wget. Do wyświetlania obrazka lub listy obrazków służy wiele programów np. ee, qiv, display. Przykłady: wget -nd "http://images.ucomics.com/comics/ga/2007/ga071019.gif" display obr1.gif obr2.gif obr3.gif Po każdej operacji byłoby miło wypisać jakiś krótki komunikat co się stało. Jeżeli w wywołaniu brakuje obowiązkowych parametrów to też. Skrypt powinien sprawdzić, czy używany program do wyświetlania obrazków jest zainstalowany w systemie - jeżeli nie to odmówić działania. Do uznania rozwiązującego pozostawiam organizację danych w katalogu .comic oraz format daty wczytywanej od użytkownika. Hint1: przy odpowiedniej organizacji danych obsługa ulubionych grup jest o wiele mniej pracochłonna niż się na pierwszy rzut oka wydaje! Hint2: man date. TERMIN ITP. =========== Proszę wysłać skrypt i jakąś małą bazkę spakowane w jednym archiwum do 30.11.2006 na aszek@mimuw.edu.pl. Tam też wszelkie pytania, problemy itp. PS. === Polecam ponadto: http://xkcd.com http://www.phdcomics.com/comics.php FAQ === Q: Czy muszę sprawdzać, czy użytkownik nie chce przypisać komiksu do kilku grup? W moim rozwiązaniu łatwiej nie wprowadzać takiego ograniczenia. A: Nie ma problemu - jeśli tak będzie wygodniej, to komiks może należeć do wielu grup. W rozwiązaniu które miałem na myśli łatwiej było jeśli komiks mógł być tylko w jednej grupie a przy wstawianiu do innej grupy znikał z poprzedniej. Można też zrobić tak, że przy próbie wstawienia do nowej grupy nic się nie dzieje - komiks zostaje w starej. Do wyboru, do koloru. Q: Czy skrypt ma być idiotoodporny? A: Nie musi, zakładamy że użytkownik nie będzie się wygłupiał, np. nie odbierze sobie uprawnień do katalogu z danymi, nie wpisze "ala" tam gdzie oczekiwano liczby, będzie się trzymał oczekiwanego formatu daty itp. itd.