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.