Vlatkovic.NET

Web site o tehnologiji, programiranju, muzici, kuvanju, knjigama, u stvari o svemu i svačemu...
Dizajn: www.studio7designs.com opensource web templates.


Najnovije na blogu

 Wednesday, 04 March 2009

Neverovatna je količina svinjarija i bljuvotina o kojima se priča i raspravlja ovih dana. Te mažnjavanje para u RIK-u, te Jovica Stanišić i CIA, te lupetanje i nesposobnost vlasti da se nosi sa krizom, ukidanje presuda huliganima, sakrivanje i plaćanje grehova batinaša... Više ne reagujem na sve to (da sam svestan), povukao sam se u ilegalu i pokušavam da koliko toliko ostanem normalan. Ipak je sve to previše gluposti i kretenizma za jedan život, u ovom slučaju moj.

Elem, evo opet sedim i besno kucam nad novom mega idijotijom srpske birokratije koja mi je podigla pritisak na 200, minimum! Ukratko, Teodor fon Burg  je čist genije, nacionalno blago Srbije, sa 16 godina je učestvovao na gomili takmičenja za matematičke talente i sa svakog doneo po neku medalju. Država na svoju ogromnu sramotu ne nalazi za shodno da stipendira takav talenat. Pretpostavljam iz prostog razloga što mediokriteti koji odlučuju o tome ne shvataju važnost i veličinu imanja takvog genija u našoj okolini jer bi svoja mesta i mesta planirana za svoje potomke, neminovno, tokom vremena, morali da prepuste nekome neosporno pametnijem i sposobnijem. Al' dobro, najurili smo tolike genije zadnjih decenija, možemo da prebolimo još jednog. Bitno je da imamo dovoljno Voja, Miladina, Toma, Velja, Ivica, Marica, Bokica, Uroša... Sram te bilo Srbijo.

P.S. Nego da ne urlam samo, ako neko zna neka javi kako da se pomogne Teodoru, žiro računi, fondovi, demonstracije, bedževi "Pravda za Teodora"...

Wednesday, 04 March 2009 14:54:00 (Central Europe Standard Time, UTC+01:00)
 Friday, 25 July 2008
Evo posle stogodišnje pauze da se javim sa novim slikama. Gde sam bio i šta sam radio, nekom drugom prilikom, možda...

http://picasaweb.google.com/pvlatkovic/MiloIIvana
http://picasaweb.google.com/pvlatkovic/LondonJun2008
http://picasaweb.google.com/pvlatkovic/ProleEILeto2008


Friday, 25 July 2008 10:28:22 (Central Europe Standard Time, UTC+01:00)
 Thursday, 31 January 2008

Sećate li se onomad kada smo imali radikala na čelu skupštine. Tada je nastao kratak zapis na temu komaraca, horora, deja vu-a... No danas od komaraca ni traga ni glasa ali se vratio onaj mučni osećaj od pre par meseci. Tu noć sam koknuo komarca. Zato izađite na izbore ne čekajte da se gamad namnoži još više, već delajte odmah, dok ne porastu “k'o rode, jebote” i opet naprave haos.

Mnogo je skupo sada ne izaći na izbore, nema opravdanja a izbor je lak. Naravno da nije optimalan ali podsetite se i pročitajte ovo (http://www.mooshema.com/2008/01/23/drugi-krug-molitva-za-nezaborav/) pa donesite odluku.

I samo na trenutak da se osvrnem na one koji svih ovih godina ne izlaze na izbore a posle istih pričaju kako su Srbi stoka. Taj deo populacije zapravo stavlja sebe u isti rang sa onima koje naziva stokom. Ne izašavši  na izbore ta neozbiljna, fensi, kul, snobovska ekipa sama sebi (a i nama) kopa rupu i dopušta da se glas koji zagovara primitivnu, kratkovidu i zlonamernu politiku uzdiže i dobija na snazi.

Izađite na izbore da stvarno vidimo gde smo ako ništa drugo! Smrt fašizmu!

 

APDEJT - obavezno pročitati:

http://www.bebika.com/blog/politika/i-ja-malo-o-izborima/

http://www.bebika.com/blog/svakodnevnica/zna-on-koliko-je-tesko-biti-majka/

http://www.vesic.org/blog/politika/drugi-krug-svi-napolje-na-glasanje/

http://www.vesic.org/blog/politika/mali-sms-za-podsecanje/

Na izbore!

Thursday, 31 January 2008 11:44:16 (Central Europe Standard Time, UTC+01:00)
 Tuesday, 15 January 2008
I opet malo programiranja, ovog puta o proširivanju postojećih asp.net severskih kontrola na primeru GridView-a.

Cilj ovog teksta je da pokaže kako se postojeće ASP.NET serverske kontrole mogu relativno lako dograditi tako da im se poveća funkcionalnost. Kao primer sam uzeo GridView koji u osnovnoj postavi nema  multiselect ali uz malo dorade postaje vrlo sličan gridovima koje srećemo u windows programiranju. Ideja je da možemo da izaberemo više redova u GridView tako što ćemo prilikom izbora držati taster CTRL.

Realizacija je sledeća: kad god kliknemo na neki red u GridView kontroli izvrši se registracija tog klika i nakon postback-a se čitaju indeksi kliknutih redova na osnovu kojih vraćamo redove u kontroli koji su izabrani.

Prvi korak je da kreiramo novu klasu koja će predstavljati DataGrid sa multiselect opcijom. Ona će biti izvedena iz  System.Web.UI.WebControls.GridView klase i čime obezbeđujemo nasleđivanje svih osobina i metoda ove klase na koje smo navikli.

public class MultiSelectGridView : System.Web.UI.WebControls.GridView

Zatim je potrebno da na svaki red koji generiše osnovna  GridView klasa “zalepimo” onclick javascript događaj (event handler). To radimo tako što promenimo OnRowDataBound metodu iz osnovne klase.

1: protected override void OnRowDataBound(GridViewRowEventArgs e)
2:  {
3:   base.OnRowDataBound(e);
4:
5:   if (e.Row.DataItem != null)
6:   {
7:    e.Row.Attributes.Add("OnClick", "msel(event)");
8:
9:    _id = this.PageIndex + "." + e.Row.RowIndex.ToString();
10:    e.Row.Attributes.Add("index", _id);
11:   }
12:  }

Glavna stvar se nalazi u liniji 7, gde na Row element dodajemo atribut OnClick koji će izvršavati msel(event) javascript funkciju na svaki klik. Javascript funkcija msel registruje gde se izvršio click događaj i upisuje indeks kliknutog elementa u skriveno (hidden) polje čiju vrednost ćemo kasnije, u postback-u, da parsiramo. Ovu funkciju ćemo da kreiramo i registrujemo kasnije.
Sledeća stvar se nalazi na linijama 9 i 10. Naime, tu kreiramo indeks elementa koji je kliknut i vezujemo ga za sam element. Njegova konstrukcija je vrlo jednostavna, “_id = broj stranice + tačka + indeks trenutnog reda”. Dobijeni indeks se upisuje kao dodatni atribut u element koji predstavlja red u GridView-u.
Da bi na klijentskoj strani znali koji red je izabran kreiramo Javascript funkciju “msel“ koju ćemo kasije da registrujemo na strani (podvučeni delovi code-a se automatski generišu u runtime-u).

Pre nego što prokomentarišem javascript code, da kažem par reči o html code-u koji generiše standardni GridView. GridView je u stvari obična tabela tj <table><tr><td>... konstrukcija. <tr> tag predstavlja red u našoj kontroli (Row) i na njega se “lepi” OnClick event. Sam event se zapravo okida na <td> elementu ali se propagira do prvog roditeljskog (parent) elementa koji ima handler tj definisan onclick a to je <tr> element. I evo javascript-a koji se generiše.
Da prokomentarišemo javascript.

1:<script language="javascript">
2: function msel(e, o)
3: {

kreiramo referencu na skriveni (hidden) html element koji u sebi sadrži informacije koji redovi su selektovani

4:  var selected = document.getElementById(o);

Zatim kreiramo referencu prema Event-u koji je inicirao izvršenje funkcije. Ova referenca nam treba da bi saznali koji je objekat inicirao Event i da li je pri kliku bio pritisnut taster CTRL. Linija 6 daje neposredni objekat koji je inicirao event, u ovom slučaju <td> tj ćeliju koja se nalazi unutar <tr> elementa. Na liniji 7 hvatamo sam <tr> element koji nosi informaciju o tome koji je indeks kliknutog elementa.

5:  e = e ? e : ((window.event) ? event : null);
6:  var obj = e.target ? e.target : ((e.srcElement) ? e.srcElement : null);
7:  obj = obj.parentElement ? obj.parentElement : obj.parentNode;
8:  var objParent = obj.parentElement ? obj.parentElement : obj.parentNode;

Na linijama 9 i 10  kreiramo objekte String tipa koji redom nose podatke o izabranim redovima i o trenutno kliknutom objektu tj njegovom indeksu.

9:  var sel = new String(selected.value);
10:  var id = new String(obj.getAttribute("index"));
11:  var cssclass;
12:  

Linija 13 ispituje da li je prilikom klika bio pritisnut i taster CTRL. Ukoliko jeste na liniji 14 proveravamo da li je red već izabran. Ukoliko jeste, ukloni ga iz liste izabranih i promeni css klasu za tekuću liniju. U suprotnom ubaci ga na listu izabranih i promeni css klasu.

13:  if (e.ctrlKey) {
14:   if (sel.indexOf("-" + id + "-") > -1) {
15:    selected.value = sel.replace("-" + id + "-", "");
16:    obj.className = "CssClassRow";
17:   }
18:   else {
19:    selected.value = sel + "-" + id + "-";
20:    obj.className = "CssClassRowSelected";
21:   }
22:  }

Ukoliko CTRL nije pritisnut (linija 23) lista izabranih indeksa svodi se na trenutno izabran a css klase se menjaju tako da su svi objekti neselektovani. 

23:  else {
24:   if (sel.indexOf("-" + id + "-") > -1) {
25:    cssclass = "CssClassRow"; selected.value = "";
26:   }
27:   else {
28v    cssclass = "CssClassRowSelected";
29:    selected.value = "-" + id + "-";
30:   }
31:   var trs = objParent.getElementsByTagName("tr");
32:   for(i = 0; i < trs.length; i++)
33:    if (trs[i].getAttribute("index"))
34:     trs[i].className = "CssClassRow";obj.className = cssclass;
35:    }
36:  }

 Napomena: podvučeni delovi se generišu

Funkcija  disableSelection samo ne dozvoljava da se na kliknutim redovima izvrši selekcija teksta. Za detalje pogledajte http://www.dynamicdrive.com/dynamicindex9/noselect.htm.

37: function disableSelection(target) {  
38:  if (typeof target.onselectstart!="undefined")   
39:   target.onselectstart=function(){return false;};  
40:  else if (typeof target.style.MozUserSelect!="undefined")    
41:   target.style.MozUserSelect="none";   
42:  else   
43:   target.onmousedown=function(){return false;};  
44:  target.style.cursor = "default";
45: }
46:</script>


Ok, sledeća metoda koju menjamo u odnosu na originalnu GridView klasu je OnRowCreated.

1:protected override void OnRowCreated(GridViewRowEventArgs e)
2:{
3: base.OnRowCreated(e);
4:
5: _id = this.PageIndex + "." + e.Row.RowIndex.ToString();
6:
7: if (selected != null && selected.IndexOf("-" + _id + "-") > -1)
8:     e.Row.CssClass = CssClassRowSelected;
9: else
10:     e.Row.CssClass = CssClassRow;
11:}

Opet kreiramo indeks, linija 5, i ako je trenutni red u listi selektovanih onda mu menjamo css klasu.

I na kraju menjamo CreateChildcontrols metodu. Zapravo samo je proširujemo. Cilj je da između svakog postback-a očuvamo stanje selektovanih redova.

1:protected override void CreateChildControls()
2:{

Naravno pustimo da se kreiraju sve potrebne kontrole koje se kreiraju za GridView (Linija 3)

3: base.CreateChildControls();
4:
5: string[] selectedArray;
6:
7: if (!string.IsNullOrEmpty(selected))
8: {

Izdvojimo indekse redova selektovanih na client strani (linija 9.) .

9:  selectedArray = selected.Split('-');
10:

Kreiramo listu int vrednosti koja će sadržati indekse izabranih redova.

11:  SelectedIndexs = new List<int>();

Kreiramo string niz koji će u sebi sadržati tekuću stranu i tekući index na strani.

12:  string[] pageAndIndex;

Za svaki element u selectedArray a na osnovu stranice i indeksa preračunamo pravi indeks i ubacimo u  SelectedIndexs.

13:  foreach (string s in selectedArray)
14:  {
15:   if (s.Length > 0)
16:   {
17:    pageAndIndex = s.Split('.');
18:    SelectedIndexs.Add(int.Parse(pageAndIndex[0]) * this.PageSize + int.Parse(pageAndIndex[1]));
19:   }
20:  }
21: }
22:

Registrujemo skriveno html polje u koje upisujemo koji su izabrani redovi.

23: this.Page.ClientScript.RegisterHiddenField(selectedKey, selected);

Registrujemo blok sa javascript funkcijama opisanim gore.

24: this.Page.ClientScript.RegisterClientScriptBlock( ( (System.Web.UI.WebControls.GridView)this).GetType(), "MultiselectGridView_js", js);
25:

I na kraju na GridView kontrolu dodamo još jednu literal kontrolu koja u sebi sadrži poziv funkcije  disableSelection koja ne dozvoljava da se selektuje tekst na upravo kreiranoj kontroli.

26: Literal l = new Literal();
27: l.Text = "<script language=\"javacript\" type=\"text/javascript\">disableSelection(document.getElementById(\"" + this.ClientID + "\"));</script>";
28: this.Controls.Add(l);
29:}

I to je to, kompletan code možete da skinete ovde.

Tuesday, 15 January 2008 23:41:27 (Central Europe Standard Time, UTC+01:00)
 Tuesday, 08 January 2008

Ma ne bi ja ovo napisao nego me Peđa naterao. Nedavno u neke sitne sate mi kaže „... zapiši ovo i objavi, da ne zaboraviš, možda nekom i pomogneš...“. Zapisah i sada objavljujem. Tiče se problema kojeg sam imao prilikom registracije mog dragog auta i u kakvu agoniju može čovek da upadne ni kriv ni dužan. Ukratko, auto je trebao da se registruje i prebaci sa AR na BG tablice ali broj motora nije mogao da se očita. Neverovatno je da nigde i niko ne zna tačan postupak kako čovek da se ponaša kada se dese ovakvi problemi. Ni lizing kuće/banke, ni tehnički pregledi, ni policija, niko vam neće dati potpunu informaciju i jednostavan algoritam kako da postupite u situaciji a, b, c... Ako tražite usmenu informaciju od nadležnih organa najčešće udarite u tvrdi zid neznanja i neljubaznosti sa akcentom svaljivanja krivice što oni neznaju na vas („Hajde sad lepo sve priznaj a Đura će da ti oprosti što te tukao“ - Balkanski špijun). Ne daj Bože da to neko odštampa na par flajera i da podeli narodu, mnogo je skupo.  Važno je da besno proslavimo novu godinu i potrošimo teškom mukom zarađene pare ili pare koje nemamo. Dajte 'leba i igara pa posle nek pocrkamo.

I evo kako se sve dešavalo.

Četvrtak (18. oktobar 2007.)
Pred kraj oktobra mi je isticala registracija. Krenem ja u akciju. Mlad mi je auto, napunio dve godine, terali ga samo ja i žena, tip top je, mislim se, to ćemo mi za čas. ALI. Odem na prvi tehnički pregled na koji sam naleteo (Parking servis) i tu me strefi prvi šlog u nizu šlogova. Kažu da ne mogu da nađu serijski broj motora i da ne mogu da obavim tehnički pregled. Ostadoh zapanjen. Natezali smo se jedno pola sata da probaju da nađu broj ali bez uspeha.

Petak (19. oktobar 2007.)
Sutradan ujutro odem u autokuću Hit auto gde je auto kupljen da pokušam da uradim nešto pametno. Tamo mi kažu isto, ne može da se registruje jer se ne vidi broj motora. Reno označava motore samo reda radi, nekim sitnim i nikakvim slovima i ne tretiraju motor kao sastavni deo automobila već kao rezervni deo. Majstori koji su poukušali da ga pročitaju uz pomoć šmirgle samo su ga dokusurili. Nema ‘leba, mora da se ukuca novi broj. Ljudi u Renou mi otprilike objasne kakav je postupak dalje. Oni daju nalog za ekspertizu vozila u SUP-u (da sup proveri da nisam ne daj Bože prepakivao delove motora). Kada se utvrdi da je auto ok onda u Lermontovoj dobijete/platite nalog za ukucavanje novog broja motora a to se radi u firmi Kompresor u Francuskoj ulici. Elem odem ja sa nalogom u SUP u 29.Novembra (kako li se sada zove ta ulica). Tamo sedi “Gospodar duša automobila” nas ubogih vozača i odrezuje sudbinu. Da pojednostavim poesnički opis, namračen i nadrkan tip (izvinte na izrazu ali on je najbolji) sa cigarom u zubi u mračnoj, prljavoj i hladnoj garaži sedi i uz fantastično zgražavanje prema svojim sugrađanima a ujedno i ljudima koji ga plaćaju, uz ogromne količine cinizma, mržnje, zlovolje objašnjava mi sledeće: “...ti si dečko (pazi dečko!) registrovao kola u AR i to nema nikave veze sa nama, nalevo krug”. Ja opet fin, pitam šta da radim, tražim savet najuuljudnije moguće, imam par pitanja i potpitanja. “Gospodar duša automobila” sa ogromnom dozom smorenosti, cinizma i zlobe mi priča neku priču kako treba u AR da mi daju nalog za ekspertizu pa da vozim šlepom auto u Kragujevac na Mašinski fakultet gde se vrši ekspertiza dva puta nedeljno po jedan sat, utorkom i recimo sredom u 14:00. Na kraju uspevam da iskamčim sledeću korisnu informaciju. Treba da odjavim tablice iz AR pa da odem ponovo na tehnički gde bi mi ponovo izdali nalog za ekspertizu. Pa onda dođem kod njih da oni pogledaju sada neregistrovan auto i procedura ide dalje. Čujem se sa bratom Ivanom u Aranđelovcu, on se raspita i postupak je sledeći: odem na tehnički pregled, uzmem isti papir kao za tehnički, potpišem i sa tablicama i saobraćajnom pošaljem u AR. Hajd' jurim ponovo, sve to pokupim sa ljudima u Renou se dogovorim da mi sutra naprave opet nalog za ekspertizu ovog puta sa odjavljenom saobraćajnom i tablicama. Otrčim kući, skinem tablice, spakujem papire i pošaljem mom dobrom bratu Ivanu u AR. Odnese on sve u sup, kad ne lezi vraže, pošto je auto kupljen na lizing njima treba ovlašćenje od lizing kuće (u mom slučaju Rajfajzen) da mogu da odjavim tablice. Zovem Rajfajzen, natežem se minimum pola sata sa nekim ćatom da pošalje ovlašćenje SUP-a u AR a da ću ja da dođem po original. On mora da pita šefa, ne zna kako se piše to ovlašćenje, ja mu diktiram, nerviram se, kaže mi da zovem za 5 minuta pa ga posle nema a radno vreme SUP-a u AR je do 16:00. Na kraju se čovek smiluje, organizuje i pošalje faks u AR. Sve u poslednjem trenutku. Tačno u 16:00 Ivan me zove i kaže da smo zakasnili i da su službenici otišli kući. Zaćutah tri sekunde i onda se sa druge strane začuo urlik koji je govorio “naivčino” :-) sve je bilo gotovo i saobraćajna će mi stići kasnije tog dana. Laknulo mi je, još i vikend predamnom da se skupi malo snage.

Subota (20.oktobar 2007.
Po dogovoru odlazim u Reno da mi na osnovu odjavljene saobraćajne dozvole naprave nalog za ekspertizu na koju sam planirao da idem u ponedeljak ranom zorom. Odem tako kad ne radi sistem. Počnem da čupam kosu, “...kako bre ne radi sistem, gde je comp jel mogu da pogledam..”. Sve može dok se čeka “programer” da reši problem. Sednem za komp i posle par minuta čačkanja ukapiram da nema vezu sa serverom. Počnem da pratim kablove po kancelariji, naiđem na vazdušni switch (za neupućene, deo mrežne opreme zadužen za povezivanje računara u mrežu, koji visi na nekim polu iščupanim kablovima u nekom prašnjavom ćošku, česta meta zlih čistačica). Krenem da pritežem kablove, resetujem mašinu i posle par minuta sistem proradi! Aleluja, odštampasmo nalog i ja srećan krenem kući. Krenem kući lagano i kod Sava centra se na mene ustreme dva pandura sa onim bahatim “ličnu kartu, šta nosiš u torbi”. Od muke počnem da se smejem kad me jedan od njih (krupniji magarac) pita onako kabadahijski i preteće “šta je smešno” I tu mi pukne film, kažem mu ja da je ovo slobodna zemlja i da mogu da se smejem kad hoću i kome hoću i da me boli... Ovaj me je gledao tupo par sekundi i uto ovaj sitniji, valjda i malo pametniji spusti loptu i reče rmpaliji da krenu. Ja onako stojim i zurim u njih dok odlaze i pitam se da nije neko organizovao neku bolesnu skrivenu kameru, nadrealno... Dođem kući, izljubim ženu i dete i bi mi lakše.

Nedelja (21. oktobar 2007.)
Malo odmora i planiranje kojim skrovitim putem bez tablica da se domognem ozloglašene jazbine “Gospodara duša automobila” u ulici 29. novembra.

Ponedeljak (22. oktobar 2007.)
Još nije svanulo ali valja nam putovati. Preko Zvezdare, Novog groblja, Bogoslovije stižem do SUP-a. Parkiram kola i krećem u raspitivanje kada počinju da rade. Probudim policajca u kućici na ćošku, reče mi čovek da sam poranio ali nema veze, poučen i istreniram kao pravi Srbin strpljivo čekam. Uskoro počinju da se pojavljuju drugi sapatnici da zajedno drhtimo sa svojim malenim automobilima ispred jazbine znate već koga. Priče su razne, slične mojoj, ljudi kivni kako ih šetaju zezaju, vraćaju sa registracija zbog gluposti a svi radimo i nemamo vremena za gubljenje. Šta mog gazdu, tada u Švedskoj, briga što smo mi nenormalni. Oko devet se pojavljuje Onaj sa svitom, mi ponizno i u tišni predajemo papire i povlačimo se uz naklon da ne bi smo slučajno izazvali Njegov gnev i nastradali. Izvođenje rituala je najzad počinje. Naravno, he, pre nas je ušlo par debelih mercedesova i BMW-ova koje su vozile ćelave glave koje ona dva dripca iz Subote ne bi zaustavila u životu, nego bi verovatno pili kafu sa njima. Dolazim na red, On baci pogled od 0.5 ispod haube i kaže da izvezem auto napolje. Šta da kažem, čovek je ekspert. Tako je bilo sa svima. Kada su svi završili čekali smo da načelnik potpiše rešenja i da trčimo u Ljermontovu da završimo ostatak posla. Plupropisno parkiram auto bez tablica blizu SUP-a i napokon, posle sat vremena stižem u  Ljermontovu. Tamo sledi popunjavanje uplatnica i plaćanje taksi na sve i svašta. Ulazim u kancelariju gde se izdaju nalozi za čuveno prekucavanje broja i tu mi saopštavaju da mi treba ovlašćenje od lizinga da prekucam broj. Pokunjim se i sednem na bus pa na Tošin bunar u Lizing. Oni me naravno belo gledaju, neznaju kako da napišu ovlašćenje, opet cirkus ali na kraju ga dobijem pa nazad u Ljermontovu. Sačekam red i najzad dobijem nalog za kucanje broja. Sjurim se do 29. Novembra, sednem u auto i odem do Kompresora na ukucavanje. Tamo naravno red “kano klisurine”, sačekam i tu, ukucaju mi brojeve i odjurim u prvi servis sa tehničkim pregledom da završim i tu fazu. Tu uvek sedi neki polupismen duhoviti šimpanza koji sve zna i koji će sve papire da mi pripremi za registraciju “ma ne brini burazere”. Pripremi mi on, ja na taksi u sup Vračar da konačno uzmem tablice. Za divno čudo odmah dođem na red predam sav srećan papire koje mi šalterska službenica vrati nazad uz minut sa rečima “...ne može, fali ovlašćenje od Lizinga za preregistraciju vozila”. Molim, kumim, ali ne vredi. Već polulud, smejem se samom sebi kao ludak, hvatam taksi i jurim u Lizing, reči taksiste su mi slaba uteha. Sačeka me čovek, vrati nazad sa ovlašćenjem koga opet nisu umeli da napišu... Stižem u sup Vrčar kad tamo “red kano klisurina”. Popodne radi samo jedna službenica na regostracijama. Vrlo inteligentno, mislim se u sebi. Tri ih radi pre podne i za vreme našeg radnog vremena a kada mi imamo vremena da dođemo i kada je najveća gužva radi samo jedna. Eh, stanem u red, slušam kako veselo odjekuje zvuk pisaće mašine iz susedne sobe, pitam se gde su im silni računari, 21. vek itd i isključim mozak da ne bi izgoreo. Nešto pre sedam sati uzimam tablice i saobraćajnu, odem do parkinga gde sam ostavio auto i oko osam uveče stignem kući. Izljubim ženu i dete i bi mi lakše.

Epilog (23. oktobar 2007.)
Pregledam kući papire, posle natenane, vidim da su uzeli pogrešna ovlašćenja u SUP-u Vračar, mislim se, niste ni morali da me cimate da opet idem u nesrećni Lizing.
Razmišljao sam tih dana da napišem zapis na blogu ali sam se mislio da je nepotrebno da smaram narod sa nečim što je svako od nas već verovatno više puta proživeo. A i strašno me je mrzelo. No, eto, Peđa me je naterao. Da zapišem da ljudi znaju šta da rade ako im se slično desi. Hajde, mislim se ja, možda učinim dobro delo...

Tuesday, 08 January 2008 10:32:16 (Central Europe Standard Time, UTC+01:00)
 Thursday, 27 December 2007

Danas se navršilo tačno tri meseca i jedan dan od Miloševog rođenja pa evo jednog zapisa na temu roditeljovanja.

Pitanje koje nam ljudi najčešće postavljaju u zadnje je vreme kakvi su nam utisci kao novopečenim roditeljima. Pa jedino mogu reći da su izvanredni, naravno. Naporno je, ali divno i svakim danom je sve bolje i bolje. Posle početne zbunjenosti i neznanja sada smo već stare kajle ili iskusne kuke :-) pa stoga mogu reći da je, u suštini, roditeljstvo jako jednostavna i logična stvar :-). Ha ha ha, reći će svi iskusni roditelji. No ono što sam do sada video i iskusio samo potvrđuje ovu  izjavu :-). Kada dete satima neutešno plače to ne znači da je besno, da tera inat ili eto plače tek tako. Ono plače, trza se, ječi i ne spava kada mu nešto fali. To što nismo umeli da prepoznamo pravi uzrok problema nije značilo da je dete svojeglavo ili lošeg karaktera. Naprotiv. Naši problemi su se u najvećem broju slučajeva svodili na to da uzroke nismo na vreme uočili, protumačili i na posletku reagovali. Eh, kad se samo setim posle koliko pređenih kilometara i sa rukama otegnutim kao u orangutana ukapiram da je dete napravilo“štetu“ ili da ne bi bilo loše da mu malo savijem nogice uz stomak ne bi li ispustilo gasove. U stvari sve se svede na to da svaki dan rešavate neku vrstu testa inteligencije. Moram da se pohvalim da smo iz dana u dan sve bolji i bolji.

Trudimo se da se što više zezamo. Eto tako u tom zezanju je mališa dobio više nadimaka a sve u zavisnosti od izraza lica, agregatnog stanja u kome ga nalazimo ili zvukova koje ispušta (da, da progovorili smo) :-) Evo nekih:

  • Sumpor, posle obilnog i bučnog izbacivanja gasova
  • Vulkan, posle obilnog izbacivanja kake
  • Plankton, onako mali, miran kao bubica, samo promatra i “kuži svijet”
  • Jupiter/Jupi, gasni džin, stanje koje prethodi stanju Sumpora
  • Karlito, kada je mnogo glaaaadan
  • Vakuum, faza kada nešto stavi u usta i tako čvrsto drži da je to prosto zapanjujuće
  • Gaj Gaj, fraza koju vrlo često voli da izgovara

Gledamo da sve mučne radnje radimo uz što je moguće bogatiju koreografiju, zvučnu, plesnu, pantomimičnu. Igramo se mora, imamo čas fizičkog, krijemo se, letimo... ne mogu svega ni da se setim. Naravno, sve dečje pesmice smo naučili napamet. Kada se teško uspavljujemo pevamo do prestanka rada pluća (ovo izjavljuje nekad vrlo aktivan horski pevač... kuku).

I da sumiram: za tri meseca smo se jednom razboleli, primili dve vakcine, prebacili 6 kg težine i 60 cm visine i počeli da gučemo. Zadovoljni smo!

Srećna Nova godina,

         Miloša, Ana i Peca. 

Thursday, 27 December 2007 23:31:00 (Central Europe Standard Time, UTC+01:00)
 Monday, 24 December 2007

Moja drugarica Bebika opet ima jako interesantan post. Pročitajte i prosledite. Da ne tupim, ona je super objasnila celu stvar.

Bebi, svaka čast!

Monday, 24 December 2007 13:40:50 (Central Europe Standard Time, UTC+01:00)
 Saturday, 22 December 2007

Ovo je mali dodatak tekstu o podešavanju Visual Studio-a, ali važan. Nekada je u VS postojala opcija “Synchronize class view” koja je jako korisna kada imate malo složeniji klasni model od običnog Code Front – Code Behind modela. Kada ste u kodu klase i kliknete desnim dugmetom, izborom opcije “Synchronize class view” pozicionirate se u stablu klasa Class View-u. E ta je opcija uklonjena iz kontekstnog menija (onaj na desni klik) ali, 'vala Bogu, nije ukinuta. Evo kako da je vratite tamo gde treba.

Otvorite Visual Studio -> Options -> Customize i kliknite na “Context menus” u list Toolbars

Pređite na Commands, drugi tab u Customize dijalogu. Ujedno će se pojaviti i novi Toolbar.

U listi Categories izaberite View a sa desne strane nađite “Synchronize Class View”. Kliknite na tu stavku, držite miša i prevucite Synchronize Class View komandu na toolbar koji se pojavio u sledećem koraku i to u Editor Context Menu -> Code Window. Spustite komandu gde mislite da vam je najpogodnije, recimo ispod “Go To Reference” komande. 

Zatvorite Customize dijalog i to je to, srećno sinhronisanje.

Saturday, 22 December 2007 23:07:36 (Central Europe Standard Time, UTC+01:00)

Ljudi obožavaju da trpaje sve živo u web.config (uopšte u .config fajlove). To je u principu ok ali ako naletite na projekat u kome ima preko stotinu raznih vrednosti koje treba podesiti da bi radilo onda 'oće i muka da pripadne. E sad, od količine ne može da se pobegne ali ako se ta količina organizuje i sistematizuje onda podešavanje web.cofig-a i ne mora da bude tako mučna operacija. Ovo je moj skromni predlog kako da se reši problem.

Konfiguracioni fajlovi u .Net (web.config, app.config) podržavaju simpatičnu stvar koja se zove <configSections>. Unutar ovih tagova možete proizvoljno da definišete <sectionGroups> i <section> tagove. Ovo znači da možete da kreirate bilo kakvu logičku strukturu podataka i svom .config fajlu. Pretpostavimo da radimo WEB projekat koji u solution-u sadrži DAL (data access layer) projekat zadužen da komunicira sa bazom i tumba podatke i BLL (business logic layer) koji sadrži neku poslovnu logiku između DAL i WEB projekta.

solExpl.gif

Svaki od ovih projekata može potencijalno da vuče vrednosti iz konfiguracionog fajla. Na primer, očigledno je da DAL projektu (onaj što se igra sa bazom) treba string koji mu govori gde je baza podataka i koju bazu gađa. Ili, projektu BLL onaj koji sadrži neku logiku treba podatak sa kog web servisa recimo da vuče neke podatke. Da te tražene vrednosti ne stoje samo kao lista poželjno je da napravimo strukturu koja će odražavati našu logičku organizaciju. I evo primera kako može da izgleda:


Ovako počinje web.config

<configSections>
        <sectionGroup name="VlatkovicNET.TestApp">
            <!-- Common -->
            <section name="CommonApp" type="System.Configuration.NameValueSectionHandler"/>
            <!-- Util -->
            <section name="Util" type="System.Configuration.NameValueSectionHandler"/>
            <sectionGroup name="DAL">
                <section name="ConnectionStrings" type="System.Configuration.NameValueSectionHandler"/>
                <section name="StoragePaths" type="System.Configuration.NameValueSectionHandler"/>
                <section name="XMLStorage" type="System.Configuration.NameValueSectionHandler"/>
            </sectionGroup>
            <sectionGroup name="BLL">
                <section name="WebServices" type="System.Configuration.NameValueSectionHandler"/>
                <section name="CacheServers" type="System.Configuration.NameValueSectionHandler"/>
            </sectionGroup>
        </sectionGroup>
    </configSections>

Šta ovde imamo? Prvi blok “definicija sekcija početak” odnosi se na kreiranje strukture podataka koja će se upisati u .config fajl. Poželjno je da struktura konfiguracije prati strukturu aplikacije. <configSections> definiše grupu koja nosi ime sastavljeno od imena Namespace-a i imena projekta “VlatkovicNET.TestApp” koja u sebi pak definiše grupe koje će da sadrže podešavanja karakteristična za BLL i DAL projekte. Type=”System.Configuration.NameValueSectionHandler” unutar definicije sekcija govori koji handler će da obrađuje našu strukturu parova. U ovom slučaju to je .NET handler NameValueSectionHandler . Možete da pišete i svoj ali to nije predmet ovog teksta. I još jedna napomena, struktura ovde nema nikakve veze sa funkcionalnošću već samo sa organizacijom i preglednošću.

Sledeći blok su same definicije vrednosti za prethodno definisanu strukturu. Na primer:

    <VlatkovicNET.TestApp>
        <CommonApp>
            <add key="CompanyName" value="VlatkovicNET"></add>
            <add key="ContactEmail" value="pera@test.com"></add>
            <add key="SmtpServer" value="127.0.0.1"></add>
        </CommonApp>
        <Util>
            <add key="HelpUrl" value="http://www.helpme.com"></add>
            <add key="Language" value="en"></add>
        </Util>
        <DAL>
            <ConnectionStrings>
                <add key="MSSql"    value="..."></add>
                <add key="MySql"    value="..."></add>
                <add key="Oracle"    value="..."></add>
            </ConnectionStrings>
            <StoragePaths>
                <add key="Images"    value="..."></add>
                <add key="Docs"    value="..."></add>
            </StoragePaths>
            <XMLStorage>
                <add key="path1"    value="..."></add>
                <add key="path2"    value="..."></add>
                <add key="path3"    value="..."></add>                        
            </XMLStorage>
        </DAL>
        <BLL>
            <WebServices>
                <add key="service1" value="http://server1/service1.asmx" ></add>
                <add key="service2" value="http://server1/service2.asmx"></add>
            </WebServices>
            <CacheServers>
                <add key="server1" value="cacheServer1" ></add>
                <add key="server2" value="cacheServer2"></add>
            </CacheServers>
        </BLL>
    </VlatkovicNET.TestApp>

Primer:

<VlatkovicNET.TestApp>
   <DAL>
      <ConnectionStrings>
         <add key="MSSql" value="..."></add>

unutar projekta DAL koji pripada namespace-u VlatkovicNET.TestApp definišemo grupu ConnectionStrings koja sadrži vrednost za MSSql connection string.


Sada ostaje da samo pročitamo ove vrednosti iz .config fajla. Jednostavno, pošto je .config xml file dovoljno je da definišemo XPath izraz do svakog ključa (key) a njegova vrednost je value iz NameValue para koga ćemo da čitamo. Ako niste bliski sa XPath-om nedajte da vas to obeshrabri, bar u ovom slučaju on je jako jednostavan a i nije loše da se nešto novo nauči (brrr ne sviđa mi se ova rečenica, učite ono što volite). So, evo ga primer:


Prvo definišemo metode za dobijanje vrednosti:

    public class ConfigurationManager
    {
        private static object lock_GetIntFromConfig = new object();

        /// <summary>
        /// Gets the int from config.
        /// </summary>
        /// <param name="path2Key">The path to key.</param>
        /// <param name="key">The key.</param>
        /// <param name="defaultValue">The default value.</param>
        /// <returns></returns>
        public static int GetIntFromConfig(string path2Key, string key, int defaultValue)
        {
            lock (lock_GetIntFromConfig)
            {
                string val = GetValueFromConfig(path2Key, key);

                if (val != null)
                    int.TryParse(val, out defaultValue);

                return defaultValue;
            }
        }


        private static object lock_GetDecimalFromConfig = new object();
        /// <summary>
        /// Gets the decimal from config.
        /// </summary>
        /// <param name="path2Key">The path to key.</param>
        /// <param name="key">The key.</param>
        /// <param name="defaultValue">The default value.</param>
        /// <returns></returns>
        public static decimal GetDecimalFromConfig(string path2Key, string key, decimal defaultValue)
        {
            lock (lock_GetDecimalFromConfig)
            {
                string val = GetValueFromConfig(path2Key, key);

                if (val != null)
                    decimal.TryParse(val, out defaultValue);

                return defaultValue;
            }
        }



        private static object lock_GetValueFromConfig = new object();
        /// <summary>
        /// Gets the value from config.
        /// </summary>
        /// <param name="path2Key">The path to key.</param>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        public static string GetValueFromConfig(string path2Key, string key)
        {
            lock (lock_GetValueFromConfig)
            {
                NameValueCollection nvc = (NameValueCollection)ConfigurationSettings.GetConfig(path2Key);
                if (nvc != null)
                    return nvc[key];
                else
                    return null;
            }
        }
    }

Primer: vraćanje vrednosti specifičnog connection stringa za projekat
GetValueFromConfig("VlatkovicNET.TestApp/DLL/ConnectionStrings", "MSSql");

Primer: direktno uzimanje int vrednosti iz .config-a
GetIntFromConfig("VlatkovicNET.TestApp/BLL/Timeouts", "Cache", 5)

Kao što vidite XPath izraz se piše jednostavno, sa znakom “/” odvajate grupe i dodajete sekciju na kraju. I metodama prosledite XPath i key koji obeležava vrednost.

Metode ispisane ovde možete po želji da stavite u osnovnu klasu za vaše strane i kontrole ili u neki zaseban framework koji ćete da vučete sa sobom gde god da krenete. Ovde možete da skinete primer cele aplikacije pa da pogledate. Primer je samo ilustracija, nije reprezentativan :-) Primer možete da proširujete normalno pa da recimo kreirate malli generator klase koja opisuje vašu konfiguraciju u .config fajlu. Gledaću da u budućnosti napišem pravi generator sa code DOM.

Za kraj, nadam se da nisam izmislio toplu vodu i udavio vas u njoj :-) I da ne zaboravim, zahvaljujem se gospodinu Dejanu Miličiću na recenziji i više nego korisnim savetima.

Primer code-a

Saturday, 22 December 2007 13:52:10 (Central Europe Standard Time, UTC+01:00)
 Sunday, 16 December 2007
 #
 
Svašta se dešavalo zadnjih mesec ipo dana pa evo malo foto zapisa.

Beba Miloš, još koji dan pa tri meseca

Krštenje kumčeta Nikole

Festival nauke sa Olgom i Pavlom



Sunday, 16 December 2007 23:49:43 (Central Europe Standard Time, UTC+01:00)