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

 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)
Često sebe uhvatim kako bi napisao po nešto na neku programersku temu pa se predomislim (usput napravim belešku u google notes) misleći da je to verovatno već viđeno i da to samo još ja nisam provalio ;-)...

Onda se tako sretnem sa drugim ljudima i utvrdim da to ponekad nije u potpunosti tačno :-) Ono o čemu sam sada hteo da pišem i istrajao tiče se Visual Studio razvojnog okruženja. Microsoft je ovde napravio sjajan posao, omogućio je programerima brzinu, prilagodljivost i potpunu udobnost u radu. Nažalost nisu sve dobre stvari uključene u osnovnoj postavci VS-a a u zadnje vreme sam viđao vrlo loše primere korišćenja istog pa eto reših da napišem koju reč o tome. Evo par saveta i zapažanja a i meni će dobro doći kao podsetnik.

Jedna od prvih stvari koje su mi zasmetale je da po defaultu VS2005 ne prati aktivne iteme u Solution Exploreru. Video sam slučajeve gde ljudi po strukturi direktorijuma jure po 25 i više otvorenih fajlova, totalni haos.
Rešenje: Tools -> Options -> Projects and Solutions -> General. Uključiti Track Active Item in Solution Explorer.

Prilikom pokretanja build-a ne podiže se Output window koji je neophodan da bi se pratio tok kompajliranja. Zašto nam je to potrebno, pa ukoliko imamo 10 i više projekata u Solution-u može da se desi da prvi projekat koji se kompajlira pukne a da mi sačekamo kompajliranje ostalih devet vezanih i da gledamo stotine grešaka u Error output window dok ugledamo da smo izostavili recimo tačku-zarez u prvom. Ovako prekinemo build mnogo ranije i manje lutamo da dođemo do izvora problema.
Rešenje: Tools -> Options -> Projects and Solutions -> General. Uključiti Show Output window when build starts.

Korisno je od Toolbar-ova imati uključen View -> Toolbars -> Build da bi ste imali bolju kontrolu nad procesom kompajliranjem projekata ili solutiona. Naravno, najbolje je zapamtiti keyboard shortcuts za Build Solution - F6, Build Project - Shift F6, Cancel Build – CTRL Break (Pause dugme ;).

Klikom na url unutar koda odmah odlazite na isti. Teško je uraditi selekciju takvog teksta.
Rešenje: Tools -> Options -> Text Editor -> C# -> General. Isključiti Enable single-click URL navigation.

Po osnovnom podešavanju Tab se pretvara u 4 x space. Upotreba tastature se time ozbiljno ograničava kada počnete da se krećete kroz veću količinu koda a kod postaje mnogo nepreglednije kada vam uvlačenje i ravnjanje teksta negde „pobegne“.
Rešenje: Tools -> Options -> Text Editor -> C# -> Tabs. Indenting:  Smart, uključiti Keep tabs. Tab size podesite po ukusu.

Podesite okruženje da vidite brojeve linija koda.
Tools -> Optiones > Text Editor -> All languages -> General, Display – Line numbers

Da bi ste poboljšali čitljivost možete da naterate VS da u kodu prikaže i vertikalne linije (guides).
Otvorite regedit (Windows taster + R, pa kucajte regedit), nađite sledeći key [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\Text Editor]. U njega dodajte string value sledećeg formata: RGB(r, g, b) x1, x2, ..., x13. Vrednosti (r, g, b) čine vrednosti crvene, zelene i plave boje čijim mešanjem dobijamo boju kojom će biti ofarbane linije u editoru (moj favorit je 232, 232, 232). Vrednosti x1...x13 su pozicije linija kojih ukupno može da bude 13 (moji favoriti 4, 20, 36, 52, 68, 84, 100, 116, 132, 148, 164). Ako vas mrzi da kucate samo skinite ovu .reg datoteku i dva puta brzo kliknite na nju.

Kad smo već kod čitljivosti toplo preporučujem da skinete neki pravi programerski font i koristite umesto standardnog Currier New. Posetite http://www.proggyfonts.com/ pa probajte.

Primetio sam da dosta ljudi drži otvorenu gomilu toolbarova i prozora koje retko ili nikada ne koriste a vire u prozorče sa kodom veličine 500x600 piksela i muče sa kao da rade na VGA monitoru a ne na 22“. Daklem likvidirajte sve nepotrebne prozore i toolbarove i zadržite samo ono neophodno što se svede na skoro ništa ako dobro naučite keyboard shortcut-ove. Downloadujete i štampajte:  http://www.microsoft.com/downloads/details.aspx?FamilyID=6bb41456-9378-4746-b502-b4c5f7182203&DisplayLang=en.
Moji favoriti:
•    CTRL K C – zakomentariše selektovani blok koda, radi lepo u c#, javascript, html, xml...
•    CTRL K U – odkomenariše selektovani blok koda
•    F5 – debug
•    CTRL  F5 – pokretanje aplikacije bez debug-a, koristite F5 samo kada stvarno debugujete nešto
•    F9 – postavljanje i uklanjanje „brake point“
•    F12 – ide na definiciju svojstva, metoda, klasa...
•     CTRL Space – kompletira tekuću reč u intelisense-u
•    CTRL TAB – kretanje po listi otvorenih fajlova
•    itd


Na kraju kad već podesite okruženje (uklonite nepotrebne i postavite/dodate potrebne Toolbarove i podesite sitnice) lepo bi bilo da to podešavanje negde i sačuvate za pokoljenja. Tools –> Import and Export Settings -> Export selected environment settings pa odaberite koje grupe podešavanja želite da  sačuvate. Ja se ne maltreiram previše, odaberem sve i nosim sa sobom :-)

Sunday, 16 December 2007 23:30:48 (Central Europe Standard Time, UTC+01:00)
 Friday, 02 November 2007
Dragi prijatelji,

prošlo je već mesec i po dana od kada se Miloš Vlatković rodio. Vreme od tada je prošlo fantastično brzo pa eto tek sada sam se opasuljio da napišem koju reč.

Sve je počelo 25.09. ujutru kada smo primetili prve znake početka porođaja. Usledio je odlazak u bolnicu, ostanak u istoj i pripreme za veliki događaj za koga smo tada mislili da neće skoro. Elem 26.09.  posle ponoći je počela prava akcija. Posle 6-7 sati hrabre borbe fantastične mama Ane u 07:10 rodio se Miloš. Visok 51 cm i težak 3350 grama. Ljudina!

Nakon 4 dana u bolnici došli smo kući. Onda je krenulo provaljivanje fora, kada je gladan, žedan, uneređen, nenaspavan, živahan... Posle par dana Ani se ustalilo mleko pa smo tako malo ušli u dnevno noćni ritam. Hm, ritam, dobro, nekad normalan, nekada neparan, ono makedonsko 7/8, 11/8 :). Grčevi nas malo muče (da kucnem u drvo) i to za sada uspešno rešavamo Espumisan kapima u kombinaciji sa Canpol termoformom (www.nea.co.yu, www.canpol.com.pl) koji može da se kupi u Tempu ili Apotekarskoj ustanovi Beograd. Kumovi, fala na savet :).

I posle mesec dana imamo 900gr više, 2 cm smo duži. Da kucnem u drvo Miloš uopšte nije zahtevno dete, za sada. Počinje sve manje da spava uskoro se nadamo da će spojiti noć. Polako istražuje prostor oko sebe, vrlo je radoznao. Čini nam se da je počeo da nas prepoznaje i promene su svakodnevne tako da nas čeka puno zezanja sa njim :).

Evo malo sličica:
http://picasaweb.google.com/pvlatkovic/BebacPrveDveNedelje
http://picasaweb.google.com/pvlatkovic/BebacDrugeDveNedelje

Friday, 02 November 2007 10:20:55 (Central Europe Standard Time, UTC+01:00)
 Sunday, 20 May 2007
 #
 

Mnogi od vas već znaju ali evo i zvanično da objavim (u C# :-))

{
...
   Baby ourBaby = new Baby();
   ourBaby.DeliveryDate = new DateTime (2007, 9, 27);
   ourBaby.Sex = "M";

   Ana_and_Peca.Babies.Add(ourBaby);

}

 

Sunday, 20 May 2007 22:40:31 (Central Europe Standard Time, UTC+01:00)