Komentáře k projektům z roku 2013/14
Vazeni studenti,
podle vseho bude letosni rok mimoradne bohaty na fenomenalni programatorske konstrukce ve vasich projektech. Rekl jsem si, ze se s vami o ne budu delit.
1) navratova hodnota:
Nikdo mi nezabrani delit nulou.
return 0.0 / 0.0;
2) pointeru neni nikdy dost
Facility Error: this should not happen f;
pak nasledovalo rozsahle alokovani pole pointeru na pointery, pole pointeru a objektu Facility. Program pochopitelne po spusteni lehl.
3) kdyz nahodnost, tak absolutni!
pred kazdym Random bylo nastaveni seed:
RandomSeed(0);
r = Random();
..... r bude porad stejne....
4) proc ta aproximace nepasuje na muj namereny vzorek dat (tyka se temer vsech projektu na stochasticke jevy)?
Postup:
1) mam vzorek dat slozeny ze 150 hodnot
2) tipnu si aproximaci napr. Normal(10, 2)
3) vygeneruju 150 hodnot z Normal(10, 2)
4) histogram z 1) a 3) na sebe nepasuji...proc? Zkuste opakovane delat histogramy ze vzorku 150 vygenerovanych cisel ze stejneho generatoru. Histogramy budou pokazde JINE!!! 150 hodnit holt neni statisticky prukazny vzorek.
5) jak nejlepe vygenerovat 100 procesu (velmi typicke...alespon dnes)?
Program:
int kolikJichChci;
class Pr : Process {}
class Generator : Event {
...
Behavior() {
if (kolikJichChci>0) {
(new Pr)-Activate();
kolikJichChci–;
Activate();
}
}
}
....
kolikJichChci = 100;
(new Generator)-Activate();
6) muj program bezi silene dlouho, protoze v nem jsou miliony procesu.
Vsechny ovsem cekaji ve WaitUntil(cond). Simlib v kazdem kroku simulace (vytazeni zaznamu z kalendare) projede vsechny registrovane procesy s WaitUntil. Tj., v kazdem kroce projde kolekci milionu vyhodnoceni podminek.
7) 8 z 10 studentu odmita prijmout algoritmus spojite simulace.
Posetile zadam studenty, aby ke vsem pojmum z IMS psali cislo slajdu, odkud ho prebiraji. Delam si nadeji, ze aspon na okamzik ten slajd uvidi a vezmou si z nej informace. Neni to tak. Osm z deseti studentu cituje slajd s Eulerovou metodou, tento alg. dokonce opisi do sve zpravy a pak nakonec v programu pokazi.
Je sakra rozdil mezi programem:
1) pro vsechny integratory spoctu a ULOZIM jejich aktualni vstup
2) provedu krok Eulera (posledni_vystup + vstupkrok) a ulozim novou hodnotu vystupu integratoru
a programem:
1) pro vsechny integratory nasobim aktualni vstup krok + posledni_vystup a hned ulozim novou hodnotu integratoru
- >v tomto provedeni se nektere integratory pocitaji ze stavu integratoru, ktere uz jsou nove, tj. michaji se nove a stare hodnoty integratoru v jednom kole simulace (evaluace vstupu integratoru je brana z jinych integratoru)
8) Tema "Volebni infrastruktura v CR" borti navykle koncepty SHO.
Ve vsech demoprikladech a ostatnich projektech se pracuje s pojmem "proces prichodu pozadavku". V prubehu modeloveho casu v jakychsi intervalech dynamicky vznikaji a zanikaji procesy. Ve vetsine projektu c.9 to tak neni. U studentu panovala obava (a ve studiich o ni pisi), ze procesu vznikne nekolik milionu. Nejspis z te obavy je proto v programech vetsina studentu vytvori NAJEDNOU a hned nazacatku. Muzeme tomu rikat "utok na pamet pocitace". Videl jsem ruzna provedeni:
8-A) vsechny procesy se alokuji najednou a priradi se jim cas aktivace. Tudiz je v kalendari 8 mil. zaznamu a s kazdym nove zarazenym se provede sort kalendare.
8-B) vsechny procesy se alokuji najednou a naplanuji pro spusteni HNED. Vznikne mega kalendar a procesy se po jednom spousti. Tudiz se pro ne jeste navic alokuje ZASOBNIK. Studentovi vadila predstava, ze by se do volebni mistnosti nahrnuli najednou a proto je na zacatku behavior volice seize na linku "volebni mistnost". Tudiz VSICHNI na pocatku jsou v jeji fronte (znacne dlouhe). Nastesti maji vsichni stejnou prioritu procesu a proto se nemusi delat sort fronty s kazdym nove zarazenym. Do volebni mistnosti vstupuji usporadane po jednom.
8-C) tady student dosahl absolutni dokonalosti. Z neznameho duvodu mel potrebu hned na zacatku urcit casove intervaly mezi vznikajicimi procesy. Proc to musel vedet na zacatku simulace?! Vygenerovane pseudo-nahodne intervaly nacpal do kolekce a po jednom je z ni tahal a vytvarel v case rozlozene procesy. Chyba se stala v tom, ze tou kolekci bylo std::setfloat, tudiz byla kolekce automaticky razena vzestupne dle zapsanych casu. Na zacatku modeloveho casu tak chodili v kratsich intervalech nez pozdeji. Navic kazde erase(set.begin()) vyvola preusporadani stromu, ktery implementuje mnozinu. Kdyz uz tak prosim prochazet iteratorem.
9) Kazdy akademicky rocnik je jiny a kazdy ma sve specifikum. Specifikem tohoto rocniku je "this-" pred kazdou instancni promennou objektu. C++ neni Python!
class Trida {
int A, B;
...
void metoda() {
this-A = this-B; ;-)
}
}
10) v SHO netreba front.
Student ignoroval potrebu fronty a jeho transakce provadela:
while (!finished) {
if (zarizeni.Busy() == false) {
finished = true;
Seize(zarizeni)
} else Wait(0.1);
}
Kdy se asi transakce dostane na linku? Jak toto probiha, pokud tento kod vykonava 1000 procesu?
11) diskretni a spojite nahodne procesy
Student povazoval za prirozene, aby pocet deti narozenych kazdy den byl float. Pripadnych 2.3 ditete lze zaokrouhlit na int ;-)
Vase projekty jsou si navzajem velmi podobne a nektere myslenky a konstrukce v nich jsou dokonce stejne. Zrejme u vas dochazi k nejake synchronizaci a komunikaci. Lze vytusit, ze nekde v internetu je nejaky rozsahly zdroj bludu, ktery si z vas nejspis dela srandu. Jinak si nedovedu vysvetlit to sireni hovadin ve vasich projektech.
12) RandomSeed(X) se stale snoubi s Random.
Generator pseudo-nahodnych cisel je skutecne dobre na ZACATKU programu nejak inicializovat, tj. dat mu "seed". Pokud je RandomSeed(X) volano pred kazdym Random(), pak je uplne irelevantni, jestli to je:
A) X = libovolna konstanta
B) X = time(), nebot vase programy stejne bezi jenom jednu sekundu, tj. time() dava stale stejne hodiny v [s]
Znovu tedy:
RandomSeed(time(NULL)) nebo RandomSeed(0);
r = Random();
// r bude porad stejne cislo
Ve velmi specialnich pripadech se hodi mit generatoru vice, kdyz si to clovek nejak zduvodni (napr. vice-vlaknova aplikace).
Autor perly c.12 dal vlastni generator kazdemu procesu v SHO. Kazdy generator extra inicializoval RandomSeed viz vyse...Dusledek: vsechny procesy v SHO mely STEJNE CHOVANI - stejne intervaly, doby obsluh a podobne. Presto v zaveru tvrdil, ze "model je validni, coz ostatne potvrdil i pan XY".
13) Uz nejsou zadne transakce, ktere by mely vlastni instancni promenne. V reseni diskretniho simulatoru byl pouze jeden objekt, ktery mel X zaznamu v kalendari. Pochopitelne odpada jakekoliv zjistovani statistik, protoze si nemuze pamatovat pro vsechny svoje interni posloupnosti udalosti (zdraham se rict rovnou procesy) jejich okamziky vzniku, vstoupeni do fronty, zapoceti obsluhy a podobne.
14) Seize ma novy parametr volani a je jim casovy udaj modelujici dobu setrvani v zarizeni.
Obsluha Seize rovnou naplanuje do kalendare i re-aktivaci procesu a jeho release. Skvele, usporne. Ma to drobnou chybku: jak muzu zabrat najednou vice zarizeni a AZ POTOM ZAPOCIT NEJAKOU PRACI???
15) Simulator netreba validovat.
Autor perly prohlasil svuj simulator za bezchybny, protoze jeho prostredky vyjadril demopriklad Kravin ze cviceni, ktery - jak prohlasil - je SAM O SOBE UZ VALIDNI. Validni model udela ze simulatoru validni simulator. Autoruv simulator obsahoval kombinaci vyse uvadenych perel. Kravin (coz je dokonala smyslenost) z nej udelal bezchybny program.
16) DELETE neni konec, smrti zivot nekonci aneb posmrtny zivot objektu.
Uvazujme dva po sobe nasledujici radky programu:
delete this;
this-startTime = ...;
Program nelehl, protoze se sem nikdy nedostal. Proto byl prohlasen za bezchybny.
Dealokovat objekt, jehoz metodu zrovna volani delete vykonava si muze dovolit pouze znaly programator. Pak se pochopitelne nesmi sahat na instancni promenne this- a nejlepe z metody hned vypadnout.
17) Trojnasobny pointer byl prekonan. Mame tu CTYR-nasobny !!!
FacilityError: this should not happenError: this should not happenf;
Pozoruhodne je dale, ze 4hvezdickovi autori maji podobny projekt jako 3hvezdickovi. Kdyz opisujete, neopisujte takove NAPADNE pasaze. Ruzoveho slona pres letistni kontrolu snadno neprotahnete. Autori 4 by se mohli stavit o tom se mnou pohovorit.
Kolega Peringer se domniva, ze se letos dockame 5.
Datove struktury jsou nosnym prvkem programu. Kdo je nezvladne, nebude nikdy delat dobry software. Vyvojari STL se pritom tak snazi: mame set, vector, deque, map, ... Pokud ma nekdo potrebu vyrabet takova 4 pole, pak je v jeho programu neco ve velkem neporadku a prave v MODELOVANI by se nad tim mohl zamyslet.
18) Hezky program se lepe vyviji a ladi.
Sazba vasich zdrojovych textu muze po par hodinach u ctenare (me) vyvolat pocatek deprese nebo jinych zavaznych psychickych onemocneni.
Autori perly c.18 proti tomu bojuji svym ASCII artem. Slozene zavorky otvirajici a zavirajici blok funkce maji trojite.
void funkce()
{{{
}}}
Netradicni, ale napadite. Zbytek programu byl taky prehledny. Chvalim ;-).
Nicmene, jsou tu nejake zvyklosti. Nema smysl na sebe upozornovat timhle punkovym vystrelkem.
19) Tatka proces se musi postarat o decko proces.
Kouknu na Behavior jednoho procesu a vidim, ze prvni jeho radek je:
assert(facility.in == this);
To se tak nekdo narodi a uz vlastni vyrobni linku ;-) Pokud by ji tesne po narozeni nemel mit, program slitne.
Hledal jsem ve zdrojacich pricinu takoveto suverenity procesu. Nasel jsem proces "tatka" s nasledujicim chovanim:
Seize(facility);
Process decko = new....
...
// nejaka cinnost...
...
facility.Q1.Insert(decko);
// proces tatka je paranoidni - co kdyby mu to zarizeni nekdo sebral...
assert(facility.in == this);
// ted ho "prevedu" na decko
Release(facility);
// a jeste overim
assert(facility.in == decko);
// az ted je mozne decko privest k zivotu
decko->Activate();
// tatka opousti system....
Kdyby v prubehu cinnosti do systemu vlezl jiny tatka, tak se zastavi na prvnim Seize(facility) a ve fronte na facility bude pred deckem. Program by pak slitnul.
Pokud mate mit dva takto pevne svazane procesy, tak je rozlozeni na dve chovani pouze opticke a neni modelove spravne. Ma to byt jeden proces.
20) Generovani procesu.
Tento rok panuje presvedceni, ze proces lze spustit pouze z Behavior nejakeho objektu Event. Verte, jde to i odjinud. Studenti alokuji a aktivuji Event jenom na to, aby alokoval a aktivoval jeden proces. Event pak konci - poslouzil, muze jit...
V jednom takovem Event jsem narazil na zajimavost:
.........
p = Uniform(10, 20);
if (p0)
new Proces()-Activate();
........
Jakou hodnotu autor c.20 ocekaval? Pokud hrozi nebezpeci, ze volana funkce vrati nejakou neocekavanou hodnotu, pak takovou situaci bude dobre asi nejak osetrit, tj.
if (je_vysledek_korektni)
cosi;
else
hlas_chybu;
21) Sednu a uvidim.
Mejme proces prichodu ruznych typu pozadavku. Podle me jsou to nezavisle jevy a kazdy je modelovan jinym stochastickym procesem (tzn. pak generatorem). Vetsina z vas modeluje proud anonymnich pozadavku, ktere az po vzniku zjisti, co vlastne chcou. Pripomina mi to ten vtip o rozdilnem pristupu k zachodu u muze a zeny: zena sedne a uvidi...
22) Vic zarizeni najednou.
Mame F1, F2, F3, ... a proces bud vezme vsechny najednou nebo stoji ve fronte. Autori c.22 to implementovali na mnoha mistech programu konstrukci:
.....
if (F1.volne() AND F2.volne() AND ...) {
zaber_a_pracuj();
} else {
fronta.in(this); Passivate(); goto REPE;
}
//
release vseho a uvolneni prvniho z fronty.
....
Kdyz uz je to v programu 2x, je to signal, ze by bylo dobre nad tim udelat abstrakci, tj. obdobu Facility s multi-pozadavkem. Opravdu to zprehledni program. A jak znamo, copy-paste v programu kopiruje i chyby.
23) Opakuj, dokud neda....
a = Exp(3);
while (a=0) {
a = Exp(3);
}
.....
Jak melo vypadat to rozlozeni??? Lze tu ocekavat zapornou hodnotu nebo nulu? Kdyz si ujasnite ten proces, tak mozna dojdete k procesu "Exp(3)+0.1"
24) Vsechno je new jak v Jave.
Kolega mi nedavno vypravel, ze se v jeho rocniku rozmohlo new na vsecko mozne.
....
doublep = new double;
p = 3;
.....
Po dvaceti letech praxe mam zasadu, ze kazde "new" v programu je novy-dalsi problem. Specificky, pokud clovek nema jasno, kdo vsechno referencuje ten objekt a kdo je majitelem objektu (odpovida za delete).
Autor c.24 dosel k hybridnimu reseni:
....
class ProcessA {
struktura B;
ProcessA(struktura b) : B(b) {
}
};
...
b = new Struktura(parametry);
x = new ProcessA(b);
delete b;
....
Alokuje tedy objekt tridy Struktura, copy-construktorem ho zkopiruje do ProcessA::B a pak dealokuje. Ehm, urcite existuje reseni, pri kterem se Struktura vytvari pouze jednou. Porad si rikam, ze mate zbytecne silne pocitace a to skodi vasemu stylu programovani.
25) SHO bez obsluznych linek.
Nejsou tu konecne zdroje, aby nas omezovaly! Celkem prekvapive v tomto systemu mohlo soucasne pracovat NEOMEZENY pocet transakci. Vsechny provadely nejakou abstraktni cinnost Wait(X) a X se cpalo do statistik. Mozna vliv EU. To bych chtel taky, takovy server.
26) Kronika prichodu.
Histogram hist;
void Process::Behavior() {
hist(Time);
...
}
....
Co autor c.26 ocekaval od teto statistiky, kdyz mu do systemu proudi kontinualni tok pozadavku s nejakou stredni dobou mezi prichody??? Histogram byl pekne rovnomerny.
27) Tesne pred smrti ho nechali cekat ve fronte a pak stejne nic nedostal.
Proces Tatka mel nasledujici chovani:
void Tatka::Behavior() {
// vic nic se po tom chlapovi asi v jeho zivote nechce! ;-)
new Decko(this);
}
...
// Decko zacina tim, ze VE SVEM KONSTRUKTORU da Tatku do fronty
Decko::Decko(Tatka tatka)
{
fronta.insert(tatka);
tatka->Passivate();
...
Activate();
}
//
Celkem bych to chapal, kdyby pozdejsi aktivace Tatky vedla k nejake dalsi cinnosti, ale mu pak stejne nezbyva nez Terminate()
28) Proces bez chovani nedava smysl.
Proces je z definice posloupnost udalosti. Pokud je posloupnost prazdna, tak nemuze tvorit proces. Studenti pristupuji k instancim tridy Process jako k jedine moznosti vyjadrit existenci cehokoliv:
...
class MujProces : Process {
void Behavior();
};
....
Kdyz se MujProces alokuje a AKTIVUJE, pak po dokonceni Behavior() je objekt SIMLIBem automaticky dealokovan. Jak tomu chteji studenti zabranit? Pasivuji ho...
...
void MujProces::Behavior()
{
Passivate();
}
...
Tak zabrani SIMLIBu jim zabit objekt. Ehm, jeste bych chapal, kdyby v tride MujProces byly nejake atributy, do kterych by si okoli procesu neco psalo. Ale mnohdy nebyvaji. Takova konstrukce je pak k nicemu.
Reseni:
1) muzete si data modelu davat i do jinych struktur nez do instanci Process
2) kdyz uz chcete zabranit dealokaci procesu, tak ho ani neaktivujte
... Kazdopadne je proces bez chovani blbost, ze...
29) Objektove (Tridne) strukturovany kod je humorne dogma.
Jeden student mi letos vypravel, ze neni ve zdrojacich SIMLIBu schopen neco najit (napr. tridu XXX), ponevadz SIMLIB nema tu objektove strukturovanou konzistenci. Vyptavanim se na tento pojem jsem zjistil, ze je tim mineno vytvareni souboru XXX.cpp a XXX.h pro kazdou tridu XXX. Pro studenta bylo asi velkym problemem jeho tridu XXX ve zdrojacich najit grepem: "grep XXX.cpp".
...
V letosnich zdrojacich se rozbijeni textu do mensich a mensich souboru stalo nejakou modou. Je silene komfortni zkoumat cinnost programu pres 10 ruznych souboru, ktere maji dohromady 200 radku. Pochopitelne v souborech XXX.cpp a XXX.h nenajdete typicky tridu XXX, ale nejakou YYY a mnohdy jeste ve spolecnosti dalsi ZZZ.
...
Pak se najdou studenti, kteri tak silene touzi po vice-souborovosti sveho zdrojaku, ze puvodni src.cpp v pulce rozdeli na src.h a src.cpp. V src.h pochopitelne nejsou jenom hlavicky funkci a trid, ale libovolny dalsi kod.
30) Dejte mu plastelinu, at si neco z ni neco vymodeluje.
Existuji pojmy model a modelovani. Slovo VYmodelovat v teorii modelovani a simulace nemame. Pokud bychom pripustili volnost morfologie nad terminologii naseho oboru, mohli bychom pokracovat dale: DOmodelovat, ODmodelovat, PREmodelovat, Zmodelovat, Umodelovat, ....
31) Facility jako bool priznak v programu.
Jeden proces dle sveho uvazeni provadi Seize/Release nad F. Ostatni zkoumaji, zda-li je F "busy". Pokud je "busy", pak je cosi true, jinak false. Existuje prirozenejsi zpusob?
32) Dejte mi kilo(gram) bananu a pet kilo(radku) programu.
Nasel jsem proceduru, ktera v sobe obsahovala prikaz switch (zname...). Switch mel dve zvlastnosti:
- mel TRI vnoreni (switch-case-switch-case...)
- byl na 4300 radcich.
Kazde "case" nastavovalo sadu parametru objektu, nad kterym se pracovalo. Premitam nad tim, jak asi zdrojak vznikal.
33) Pozadavky na zarizeni - to je parametr, se kterym se rodime.
Autor c.33 mel "pozadavek" jako atribut obecne transakce. Odvozene transakce pristupovaly na linky a mohly si vybirat pouze ty linky. Pocet zdroju za ne rozhodovala "geneticka dispozice" transakce - tj. "enter(linka)". Ta se rozhodla v konstruktoru objektu transakce a byla platna po celou dobu jeji existence.
34) Jednou se to uklidi.
V dynamickem pridelovani pameti se objekty prubezne alokuji a dealokuji. Autor c.34 nechaval dealokaci na konec programu. Aby vsak na zadny objekt nezapomnel, daval si je do kolekce (ta se prihodne jmenovala eventsToRemove). Pri destrukci hlavniho objektu se v cyklu provedlo i odlozene dealokovani objektu. Na konci programu uz nema smysl uklizet, udela to totiz operacni system. Existuje vsak mnohem prozaictejsi vysvetleni: autor c.34 nema pod kontrolou, kdy se objekt prestane pouzivat. Radeji ho v pameti ponecha, at mu to moc nepada.
35) Proces je sice posloupnost udalosti, ale nema smysl nejak explicitne udavat jeho stav.
Predstame si model pro procesne orientovanou simulaci, tj. ocekavame prepinani zasobniku. Po reaktivaci procesu proces pokracuje z posledniho mista programu dal. Jde to udelat i bez prepinani zasobniku? Jde, ale vysledek stejne nefunguje dle ocekavani. Autor c.35 volal opakovane stejnou proceduru Behavior sve transakce, pouze nad tim zavedl (dle meho soudu neucinny) system znaceni, ktere radky se uz provedly a snad i ktere radky se teprve provedou. Hodlal tim odhalit misto, kde byl posledne jeho "proces" prerusen. Transakce pochopitelne nesmela delat zadne zbytecne aktivity mimo ramec jeho sledovani, aby se tyto neprovadely opakovane. Program mel nejspis naprosto nahodne chovani.
36) ... byl to totiz drobny skudlil...
std::string je velmi popularni a pouziva ho i autor c.36. Pouze vsak v jednom miste v metode opakovane provadi:
...
char s[10];
sprintf(s, "CUSTOMER %d", (int) cosi);
...
Zasobnik ho nezradil a program tudiz nelehl. Dnes uz na to mame bezpecnejsi zpusoby, jako napr std::stringstream.
Uzaverka zazitku z projektu IMS 2013/14.
Kdyz nekdo vymysli blbost, tak ji siri dal. Nejspis proto, aby v tom nebyl sam. V baliku cca 200 projektu jsem nasel pouze par malo desitek originalnich praci a ostatni byly nejake jejich klony. Pokud hodlate v zivote takto sdilet a kolaborativne pracovat, nelze mnohym z vas vestit uspesnou profesni budouctnost. Taky premyslim, proc 80 procent praci v poslednim rocniku bakalarskeho studia ma datum posledni modifikace 9.12. 23:56. Dokonce jsem nasel kusy, ktere zacaly vznikat rano 9.12.
Symbolem letosniho hodnoceni projektu se stal simulacni prikaz "Wait(Random())" z jednoho projektu - nevim, jak dlouho to ma trvat a je mi to celkem jedno. Konstanty padaly bez uvazeni a casto jejich vypocet nemel v zaveru ani casovou jednotku.
Z dnesniho hodnoceni vybiram par perel:
37) Ve jmenech musi byt poradek.
Autor zavedl v relativne kratkem programu cca 5 namespace, kde v kazdem bylo 5-7 konstant. V programu pak kazdy identifikator mel tvar X::Y::Z - velmi prehledne. Bojim se, jak by vypadal program o 50 tis. radcich ;-)
38) Pokazde to vyjde jinak.
Jeden model a tri integracni metody. S kazdou to vyslo uplne jinak - myslim tim UPLNE JINAK (jeden graf sel nahoru, druhy dolu, ...). Student to nepovazoval za problem a nemel potrebu to ani zduvodnovat.
39) Static, static a zase static.
Par autoru melo letos naprostou fixaci na static ve zdrojovych textech. Co muze znamenat nasledujici tridni metoda:
...
static int method()
{
static int Method;
return &Method;
}
....
40) Vychazi nam to numericky blbe? Budeme srovnavat jiny ukazatel.
Autori se rozhodli neukazat numericke srovnani sveho simulatoru se Simlibem, tak aspon publikovali studii o zmerenych dobach vypoctu.
41) Nechteli by ho ani v Cine.
Autor ve zprave pripustil, ze ke svemu dilu dosel - cituji - reverznim inzenyrstvim Simlibu. Cina na tomto pristupu kdysi odstartovala sve hospodarstvi. Autor c.41 to vsak stejne okopiroval chybne.
42) Bezi to moc rychle.
Autor c.42 umistil do sveho algoritmu brzdici element ve forme usleep(X). Zrejme proto, aby stihal na obrazovce sledovat tok mezivysledku.
43) Stop-signal muj vypocet zastavovat nebude.
Dlouho jsem premyslel nad nasledujicim kodem. Co tim bylo mineno?
...
while (cosi) {
if (!stop_signal) {
//proved iteraci
} else
stop_signal = false;
}
...
Je treba poznamenat, ze v programu byla jakasi torza pokusu o multi-vlaknovost.
44) Aproximace nahodneho jevu ze SEDMI vzorku.
Zduraznoval jsem, at se radeji venujete aproximaci procesu s charakterem intervalu mezi prichody. Presto se nasli jedinci, kteri merili pocet prichodu za jednotku casu. Tech bloku namerili rekneme 7-15 a chteli na tom budovat aproximaci. Tech par vzorku rozhodne nemuze dat v histogramu nejaky tvar, ktery by sel rozumne nahradit analytickym vyjadrenim. Muze nekdo chtit rozhodnout o budouctnosti na zaklade sedmi pozorovani?
45) Popularni vztah procesu Tatka-Decko.
Ma-li proces zahajit nejakou pod-cinnost (alokovat a aktivovat jiny proces) a aktivne chce cekat na jeji dokonceni, pak se jedna o podprogram (proceduru) procesu. Hezke to bylo na dnesni ukazce:
Behavior Tatky:
Seize(fac);
Deckod = (new Decko);
d->Activate();
WaitUntil(decko nezkonci);
Release(fac);
...
Ovsem i decko chtelo "fac". Jak to zaridit? Vezme si ho s vetsi prioritou obsluhy:
Behavior Decka:
Seize(fac, 1);
// decko neco dela
Release(fac);
// konec decka
46) Priority operatoru.
Autor c.46 pohrdnul generatory ze Simlib a zprovoznil svuj vlastni:
...
- define MGEN rand() % 100 0.01
...
Po mnoha letech praxe nemam duveru k matematickym vyrazum, ktere s ruznymi nazory prekladace na prioritu operatoru davaji ruzne vysledky. Autor navic nechtel, aby se mu makro michalo se zbytkem vyrazu v miste pouziti, a proto vzdy psal:
if ( (MGEN) cosi) ... ;
Zpusob pouzivani (MGEN) autorem v modelu navic ukazal, ze si s mnoha vecmi nedela starosti.
.....
.....
Vsichni autori s vyjimkou jednoho prohlasili svuj model/simulator za validni ci bezchybne funkcni. Pokud prohlasite neco za bezchybne, pak staci najit jeden detail, aby toto tvrzeni bylo vyvraceno. Budte opatrni s takto silnymi vyjadrenimi. Modely jsou platne po serii experimentalnich overeni, ktera jsou dukladne rozebrana. Rozbor experimentu provedlo letos mene nez 5 autoru. Prekvapiva spousta autoru se k experimentum vubec nedostala (koncili 9.12. 23:56). Je to jako vrcholovy sportovec, ktery se za zivot nezucastni zadneho zavodu.
Taky jsou modely platne pouze se splnenim predem predpokladanych okolnosti.
.....
mh.
Link to this Page