Zkouska 20.6.2006

Veslar
Matfyz(ák|ačka) level I
Příspěvky: 19
Registrován: 20. 6. 2006 19:39

Zkouska 20.6.2006

Příspěvek od Veslar »

Zdravim,
Jelikoz na dnesnim terminu bylo 22 lidi, a "kdyz jsem zkousel zadani z minulych roku, tak dopadlo tragicky" dostali jsme na vyber mezi nekolika novyma ulohama. Probehlo hlasovani a vyhrala to uloha tusim cislo 7, jmeno ulohy je BAF :]

Udajne jsme si vybrali dobre [ ja si nestezuji :].

O co slo:
Napsat script, ktery provede synchronizaci danych dvou adresaru [a samozrejme i jejich podadresaru atd]. Skript dostane 2 parametry - adresare ktere ma ze syncrhonizovat. Po tud by to jeste bylo celkem v poho :]

Aby to nebylo tak jednoduche:
V kazdem adresari [bud adresar1 nebo adresar2] muze [a taky nemusi] byt soubor _default.baf, ve kterem jsou radky ve formatu:
+neco.o
-*.o
kde prvni znak je + nebo -, dale nasleduje regexp, respektive wildcard [mohli jsme si vybrat]. Pokud soubor,respektive dir matchuje s jednim z wildcardu [projizdim je od shora], pokud je tam +, provedu na nem dalsi akce, pokud -, tak s nim nic nedelam. Konkretne priklad nahore co jsem psal povoli soubor neco.o, ale vsechny ostatni .o soubory nas script bude ignorovat [v danem adresari, kde je _default.baf]. Vsechny soubory, ktere nematchnou se zadnym z wildcardu [regexpu] jsou implicitne povolene. Pokud soubor _default.baf neni v prvnim strome adresaru, veme se z druheho stromu, pokud je v obou, vyberu si jeden z nich. A ted pozor. Pokud neni ani v jednom, vezme se nejblizsi _default.baf z obou podstromu. [Forst nam rikal, jak tedy musime hledat zpetne v tech direch v obou podstromech dany config, ale nevim kdo by to delal tak debilne :].
Pokud tedy dane dir/soubor matchuje mohlo nastat nekolik pripadu, podle kterych se script rozhodne co delat:
1. dir vs dir:
[=v prvnim strome je dany zaznam dir a v druhem taky]

a) pokud dir existuje prave v jednom podstrome:
nabidne uzivateli nasledujici moznosti : skip [defaultne-pokud zmacnkne jen enter], create, delete, tree.
Pricemz skip dany adresar [ a vsechny jeho poadadresare a soubory v nich] preskoci a script uz je resit nebude. create vytvori dany adresar a pokracuje v nem. delete smaze cely podstrom toho adresare. Prikaz tree zkopiruje cely podstrom z jednoho adresare do druhy, uzivatele uz se na nic nepta [porad ale respektuje config soubory]

b) diry existuji v obou podstromech:
Pokracuje rekurzivne v nich

2. file vs file
[= v prvnim stromu je to file v druhem taky]

a) prave v jednom diru:
nabidne uzivateli : skip, copy, delete. Pricemz copy zachovava datum a cas!

b) v obou direch:
b1) shoduji se ve velikosti a datumech : preskoci je
b2) lisi se: nabidne uzivateli skip, copy, delete, revoke.
Pricemz copy kopiruje novejsi na starsi, delete smaze oba a revoke zkopiruje starsi na novejsi [a zmeni jeho datum].

3. dir vs jinej typ | file vs jienj typ
Zahlasi chybu a pokracuje dal. Ale POZOR, pokud je v jenom z pripadu [nebo i ve dvou] dany file link na druhej, je tento link treba nasledovat a tam to vyresit [bacha na zacykleni!]. Nicmenne nevim o nikom, kdo by toto dopodrobna implementoval, ono toho bylo DOST i bez toho, takze na toto se dalo vykaslat, kdyz jste meli zbytek. Ja jsem napriklad vsude napsal jen:
if [ -l $name ]; then
#DODELAT
fi

Tot vse vpodstate.

Vysledky: Na terminu nas bylo nakonec 22 [melo byt 24], 2 to tusim hned vzdali.

Bez ptani:
4x1
2x2
2x3

dalsi tusim 4 si forst vzal k sobe, nicmenne pocitam, ze to nic jineho nez 3 uz byt nemohlo. Zbytek se s panem Forstem jeste uvidi.

No az bude trocha casu, tak sem pastnu aji ideu reseni.

Moje dojmy: Ze zacatku jsem byl DOST zaskocenej, rikal jsem si, ze naprogramovat toto bude teda hnusne a neda se to stihnout, nicmenne, ukazalo se, ze to zase takova hruza neni. Rekurzivni prolizani diru v subshellech, reseni vsech pripadu je nekolik ifu [coz sice byla drbacka, ale zase tak hrozne to neni :], prolizani configuraku vyresil jeden while read a za nim case s promennou :] Mno a option tree bez ptani se da vyresit promennou TREE, ktera je bud 1 nebo 0. pokud je 1, tak se uzivatele na nic nepta, pokud 0 tak ano...
Dulezite bylo spoustet rekurzivne tu fci v subshellu, at si neprepisuju promenne.
Vpodstate jsem to mel vse [ samozrejme mselo tam byt dost chyb, na ktere se nastesti tak moc nehledelo], pokud pominu sublinky, ty jsem opravdu neresil. Ono na konci sice bylo 5-10min casu, ale komu by se chtelo s tim drbat, lepsi je si to po sobe precist a zjistit jestli by to vazne takto mohlo fungovat. :]] Mno a na jednicku to stacilo. Toz tak.

BTW: docela me dostalo, ze jedna holka vyresila problem s configurakem ak, ze pomoci neho vygenerovala awk script, kterej se pak spoustel :o Huste :shock:
Trouble? I call it sport.
Odpovědět

Zpět na „2005“