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

 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)

Šta da kažem sem da je ova poseta naših drugara i kolega iz Švedske bila podjednako uspešna kao i ona prva. Doduše, manje piva je popijeno na samom startu ali je sve to kasnije nadoknađeno samopregornim zalaganjem svih učesnika ovog skupa :-). Program je bio isti s tim da smo sada nešto više vremena proveli u druženju nego u razgledanju grada. Malo smo promenili prioritete očigledno, a i vrućina je udarila (30-32c) što nije previše prijalo Nordijcima nenaviknutim na jako sunce i omorinu.

Beograd se i ovog puta pokazao dostojno titule glavnog grada. Čist, umiven, veseo i lep, ostavio je snažan utisak na naše goste. Čak toliko snažan da ćemo ova druženja pokušati da pretvorimo u tradiciju. E pa ŽIVELI!.

Sunday, 20 May 2007 22:32:03 (Central Europe Standard Time, UTC+01:00)
 Wednesday, 09 May 2007
 #
 
Pogledajte Bebikin novi post, vrrrrlo je poučan!


Wednesday, 09 May 2007 08:41:00 (Central Europe Standard Time, UTC+01:00)
 Tuesday, 08 May 2007

Ove godine su komarci rano krenuli da nas jedu. Jedan me je noćas, bolje reći jutros najstrašnije izmaltretirao. Toliko me je izujedao da sam oko četiri morao da ustanem i krenem da ga lovim. Naravno bezuspešan lov i razbijen san. Umijem se, pogledam na sat i kresnem TV da vidim da li vrli među nama spavaju. Kad ono prozivka. Posle 10 minuta krljanje. Samo je Sloba falio. Horor. Grizi brate, ne možeš ti da grizeš koliko ja mogu da trpim. Na kraju sam ga ucmekao. 

Tuesday, 08 May 2007 22:18:57 (Central Europe Standard Time, UTC+01:00)