Uwaga: dziekanat zyczy sobie wystawienia ocen _przed_ 4 lutym 2002,
a jak ktos nie zdazy, to nastepny termin jest 9 marca, i potem juz chyba
nie mozna, w zwiazku z tym czas na zaliczenia jest dosc ograniczony!
I w zwiazku z tym informuje: bede bral pod uwage raczej to, co kto umie,
niz to, na ile dopracuje program; trzeba raczej wiedziec, jak nalezaloby go
dopracowac, zeby dzialal lepiej, niz miec to zrobione.
Co do samego C: w zasadzie wypadaloby go znac, ale jest sciagawka:
z jezyka, fragment z biblioteki, i innych wiadomosci;
mozna tez ja sciagnac jako calosc w postaci tgz;
bylo to pisane do TurboC, wiec nie wszystko jest aktualne - C na Linuxie
nie ma 'bios.h', ani 'conio.h' (zamiast tego jest ncurses).
Zadania zaliczeniowe Programowanie II, 2001/2002.
- przerobic hh.c (lub hp.c) na serwer proxy:
- obsluga wielu polaczen, ograniczac ilosc
wskazowka: pamietac liste procesow obslugujacych polaczenia
- opoznianie przesylania (zalezne od pory dnia;
chodzi o to, zeby nie pozwalac na przeciazenie laczy)
- polaczenie na wiele przeslan (Keep-Alive)
wskazowka: to moze wymagac uzycia poll() lub select(), zeby
odebrac to, co przysle klient po tym, jak serwer HTTP zaczal
wysylac, wymaga tez rozpoznania, czy utrzymywac polaczenie
- SMTP: prosty serwer odbierajacy poczte dla lokalnych
uzytkownikow, lista uzytkownikow podana na pliku, jesli lista
trzymana w pamieci, to na sygnal SIGHUP wczytywanie listy;
Uwaga na rozpoznawanie i usuwanie kropek w tekstach listow!
(linia zaczynajaca sie od kropki otrzymuje dodatkowa kropke na
poczatku przy wysylaniu listu, usuwa sie ja przy odbieraniu)
- SMTP: klient do wysylania poczty z plikow (przeszukac katalog,
sprawdzic pliki o nazwach wedlug wzorca, czy zawieraja list
do wyslania, jesli tak, to polaczyc sie z serwerem SMTP
i wyslac list) - wymyslec jaki ma byc format listu, lub
uzyc formatu PMAIL-a: pierwsza linia $$adres_nadawcy, potem
kolejne zawieraja adresy odbiorcow, potem pusta linia, potem
zawartosc listu (to, co klient ma wyslac po DATA).
Uwaga na kropki - to klient SMTP ma je dodac gdy sa potrzebne!
- SMTP: serwer posredniczacy w przesylaniu poczty - np. podobnie jak
hh posredniczy w przesylaniu HTTP - zdefiniowy (np. parametr
przy uruchamianiu programu) serwer do ktorego przesyla
- serwer czegos w stylu CHAT: wysyla kazdemu, kto jest z nim
polaczony wszystko, co mu ktokolwiek wysle, z identyfikatorem
tego, kto to wyslal (identyfikator: tekst); oprocz tego podaje
informacje o dolaczeniu sie lub odlaczeniu dyskutantow; jesli
mozliwe uzyskuje informacje o uzytkowniku z uslugi IDENT; ma
obslugiwac wiele polaczen naraz - uzyc poll() albo select()
- klient do tego serwera: powinien wymagac podania: komputera
i portu serwera, identyfikatora uzytkownika; proponuje, zeby
tekst wpisywany przez uzytkownika pokazywac na gorze, a kiedy
serwer cos przysle dopisywac to na dole (z przewijaniem ekranu)
i ponownie wyswietlac tekst wprowadzany przez uzytkownika na
gorze ekranu; tez potrzebny poll() lub select(), bo trzeba
pokazywac na biezaco, co inni przyslali; wpisywany tekst moze
byc poprawiany przez Ctrl-H (cofniecie kursora) i Backspace
kasowanie znaku przed kursorem (to trzeba obslugiwac "recznie");
program waz.c pokazuje prosty sposob czytania
z terminala bez czekania, i wyswietlania z adresowaniem ekranu
(wskazane, zeby osoby robiace dwa powyzsze porozumiewaly sie
ze soba, zeby wspolnie testowac, i razem zglosily sie do zaliczania)
- przerobic program waz.c na "zamkniecie sesji"
- zeby sie konczyl po wpisaniu hasla; moze by tez cos ciekawszego
wyswietlac? Uwaga: moze byc problem, jesli uzytkownik zapomni hasla
i przerwie program przez 'kill' z innej konsoli - trzeba jakos wrocic
do normalnych ustawien terminala - moze utworzyc dodatkowy proces,
ktory wykryje, ze pierwszy sie skonczyl, i wtedy przywroci ustawienia?
- ten sam program mozna przerobic na gre "dlugi waz" - waz, ktory
robi sie coraz dluzszy, i ktorym trzeba kierowac uwazajac, zeby nie
zderzyc sie z nim samym lub z brzegiem ekranu, i zbierac punkty przez
"zjadanie" cyferek, ktore od czasu do czasu sie pojawiaja na ekranie
(i znikaja, jesli waz nie zdazy ich zjesc np. przez minute)
- lub przerobic na kilka wezy w roznych kolorach, zeby moglo grac kilka
osob, weze oczywiscie rosna, i zderzenie konczy gre tego, ktory wpadnie
na przeszkode; kierowanie najprosciej chyba bedzie zrobic dajac kazdemu
graczowi dwa klawisze (skret w lewo/w prawo), na przyklad a/s, f/g, j/k
i ;/' - a moze podawac klawisze w parametrach wywolania programu?
- inny pomysl na gre: "roboty" - przed ktorymi trzeba uciekac, bo jak
zlapia, to sie przegrywa, ale gonia w glupi sposob, bo robia ruch
w takim z osmiu kierunkow, zeby najbardziej zblizec sie do sciganego,
nie sprawdzajac, czy tam na cos nie wpadna, a jak wpadna na siebie,
to zostaje z nich kupa zlomu - jak ktorys potem na nia wpadnie, to tez
zamienia sie w zlom - i w ten sposob mozna z nimi walczyc, uciekajac
tak, zeby sie zderzaly; dodatkowo, mozna wcisnac 't', zeby wykonac
"teleport" - przeniesc sie w losowe miejsce na ekranie - ryzykowne,
ale jak nie bedzie innego wyjscia, to zawsze to jakas szansa
- choinka z edycja: zeby mozna bylo na ogladanej choince dodawac ozdoby
(lub usuwac - np. spacja, lub przez Del); trzeba pamietac polozenie
kursora, i ustawiac kursor po pokazaniu migniecia, i moze by wymyslec
sposob na synchroniczne miganie kilku ozdob?
- synchronizacja czasu z innego komputera w sieci: majac program
in_timed_client.c, ktory wypisuje roznice
czasu lokalnego i odczytanego z serwera przez protokol 'time' zrobic
program sprawdzajacy rzeczywista roznice z dokladnoscia do 0.01 sekundy,
o ile nie utrudnia tego zbyt duze opoznienie (jest mozliwa jego ocena);
unikac zapychania sieci duza iloscia zapytan; metoda polegac ma na tym,
zeby pytac o czas wtedy, gdy da to jakas informacje; do odczekania uzyc
poll(NULL,0,milisekundy); - jesli komputer nie jest za bardzo obciazony,
to tym mozna trafic w zaplanowany czas z dokladnoscia do 0.01 sekundy.
Wskazowka: jesli czas lokalny przed odczytem czasu z serwera jest tl0,
a po odczycie czasu z serwera rownym tr jest tl1, to roznica czasu (czas
lokalny - czas serwera) jest pomiedzy tl0-tr-1 a tl1-tr - pierwszy odczyt
daje ponad sekunde nieoznaczonosci, ale teraz mozna wybrac czas nastepnego
odczytu tak, by jednej z wartosci, jakie moga wyjsc odpowiadala mniej niz
polowa tej sekundym a drugiej - wiecej niz polowa; przy odrobinie
szczescia po siedmiu probach dokladnosc osiagnie 0.01 sekundy.
Uwaga: program dziala tylko w sieci lokalnej - jak to zmienic?
- program pokazujacy zegar z innego komputera (nazwe podaje sie przy
wywolaniu, do sciagania czasu mozna uzyc in_timed_client.c) w trybie
tekstowym, ale: albo duze cyfry skladane z segmentow, albo wskazowki;
do wypisywania na ekran uzyc fragmentow z programu choinka.c.
- gra na refleks, wykorzystujaca komunikacje przez semafory: komputer
losuje czas, w ktorym cos sie zmieni na ekranie, kto pierwszy wcisnie
Enter, otrzymuje punkt; oczywiscie trzeba wykrywac falstart - wcisniecie
Enter przed sygnalem; potrzeba do tego kilku semaforow: licznik graczy,
sygnalizator startu (zwiekszany o ilosc graczy), sygnalizator wcisniecia
Enter (zmniejszany w chwili wcisniecia); zeby to dzialalo, trzeba zeby
wszyscy gracze byli zalogowani na tym samym serwerze.
Przyklad wykorzystania semafora: program sem.c
- zadanie dla fizyka: wyniki eksperymentu zostaly zapisane przez program
w Fortranie przy uzyciu WRITE nieformatowanego, pierwszy rekord opisujacy
eksperyment nawiera po kolei: date (integer*4, 0 = 1 styczen 1900) i czas
(integer*4, milisekundy od polnocy) rozpoczecia eksperymentu, tytul (20
liczb integer*4 zawierajacych tekst przeczytany formatem 20A4); nastepne
zawieraja dane odczytane z detektorow, i kazdy z nich zawiera po kolei:
- czas od poczatku eksperymentu (integer*4, w milisekundach),
- ilosc detektorow, z ktorych przyszly jakies sygnaly,
- dane - ta ilosc razy:
- numer detektora (integer*2)
- maksywalna wartosc impulsu z detektora (real*4)
- wartosc calki z impulsu z detektora (real*4)
- czas martwy ukladu odczytu (integer*4, w mikrosekundach),
i na koncu jest rekord z iloscia odczytow 0, podajacy czas trwania
eksperymentu, jego "czas martwy" mozna zignorowac; trzeba to przeczytac,
wybrac z tego dane do dalszego przetwarzania, i zapisac w postaci, ktora
moglby przeczytac program napisany w jakims mniej "egzotycznym" jezyku,
na przyklad w C - najlepiej jako tekst w postaci rowno ulozonej tabelki,
mogloby to wygladac na przyklad tak:
tytul bardzo waznego eksperymentu
Data: nnnnnnnnn dd-mm-yyyy
Czas: nnnnnnnnn hh:mm:ss.sss
Rekord 0000001 czas nnnnnnnnn hh:mm:ss.sss, danych nn, wybrano nn
nn nnnnnnn.nnnn nnnnnnnn.nnnn nn nnnnnnn.nnnn nnnnnnnn.nnnn
nn nnnnnnn.nnnn nnnnnnnn.nnnn nn nnnnnnn.nnnn nnnnnnnn.nnnn
Dodatkowo nalezy wypisac na koncu pare danych "statystycznych": calkowity
czas trwania eksperymentu, laczny czas martwy i aktywny, ilosc sygnalow
ze wszystkich detektorow, ilosc sygnalow z tych rekordow, ktore zostaly
wybrane, ilosc sygnalow pokazanych w wybranych rekordach. Wybieranie ma
polegac na wybraniu tych rekordow, dla ktorych byl sygnal z choc jednego
detektora z podanej listy (czytac ja ze standardowego wejscia), i danych
tylko dla tych detektorow (moze lepiej nie probowac bardziej zaawansowanych
wyborow, ktore fizykowi sie przydaja, jak wymog, by z jakiejs grupy
detektorow co najmniej N dalo sygnal, albo by bylo N grup, w ktorych jakis
detektor dal sygnal, lub by sygnaly z jakichs detektorow zabranialy wybrania
danego rekordu - moze to byloby blizsze temu, co sie naprawde robi, ale za
trudne).
Jerzy Tarasiuk