Skip to main content

Posts

Showing posts from November, 2011

What is the difference between Globalization, Localization, Internationalization

Globalization se refera la formatarea elementelor precum data, ora, moneda, valori numerice . Localization se refera la afisarea textului si a continutului in limba dorita. Localization != Internationalization Internationalizarea se refera la procesul de desing a unei aplicatii a.i. sa poata suporta limbi diferite. Pe cand localizarea se refera la procesul de adaptare a unei aplicatii pentru o anumita limba.

Detecting Session Timeouts

Durata de viata a unei sesiune se poate seta din fisierul de configurare. Valoarea minima pe care o poate avea este 1 minut: <sessionState   mode = " InProc "   timeout = "1" / > Cand setati durata de viata la sesiune trebuie sa avegi grija ca IIS, by default face recyle la AppPool odata la 120 de minute. Ambele valori trebuie modificate daca doriti ca durata de viata a sesiunii sa fie mai mare. Dintr-o aplicatie ASP.NET, folosid metoda Session_End din Global.asax nu o sa puteti prinde mereu acest eveniment. Pentru mai multe detalii: http://vunvulearadu.blogspot.com/2011/11/when-sessionend-is-called.html. Pentru a putea detecta daca o sesiune este noua putem sa verificam valoarea propietatii Session.IsNewSession.Aceasta propietate este TRUE cand sesiune este noua. Folosit aceasta propietate pe ASP.NET MVC3 ne putem declara un action filter prin intermediul caruia sa detectam daca sesiunea a expirat. public   class   Sessi1onExpireFilterAttribute  :

ViewBag don't contains items which are set in the partial view

Astazi vreau sa vorbim despre ViewBag. Daca nu l-ati folosit pana acuma, in MVC 3 acesta este un dictionar dynamic, in care se pot pune valori pentru a fi trasmise de la controller la view date. Cel mai nice lucru la el este ca este un tip de data dynamic. Cea ce inseamna ca putem sa facem get/set la date folosind propietati pe post de keys. In loc de:     ViewData["DateNow"] = DateTime.Now;     ViewData["Age"] = 55 ; Avem:     ViewBag.DateNow = DateTime.Now;     ViewBag.Age = 55; Sa trecem la lucruri mai interesante. Daca avem un View care contine un partial view in care populam ViewBag-ul( desii nu e sanatos poate sa apara cazul acesta), o sa observam ca in view-ul parinte sau in _Layout, ViewBag-ul nostru nu contine elementele pe care le-am adaugat. Prima reactie este sa spunem ca este sa spunem ca este un bug. Daca ne uitam putin peste cum functioneaza MVC 3 o sa descoperim ca de fapt la partial view primeste propiul sau ViewBag. Solutia pentr

Why to use/not to use Server.Transfer

Care sunt avantajele/dezavantajele folosirii Server.Transfer in loc de Resposese.Redirect? Server.Transfer nu trimite la brower un mesaj prin care ii spune sa incarce o alta pagina. Din aceasta cauza nu se mai face un drum pana la client pentru a face redirectarea. Prin acest mecanism serverul nu mai trebuie sa rezolve atatea cereri HTTP. Trebuie avut grija deoarece Server.Transfer pastreaza URL original la client. Cea ce poate sa ne induca in eroare la debug sau daca vrem sa facem SEO. Daca vrem sa redirectam userul spre o pagina externa( de exemplu www.google.ro), atunci Server.Transfer nu o sa poate sa fie folosit. Server.Transfer are un parametru optional denumit “preserverForm”, care daca este setat pe TRUE, query-ul string-ului si toate variabilele din forma sunt trimise mai departe. Exista un bug care apare uneori cand vrem sa transferam aceste valori. Pentru a evita aceast bug putem sa setam "enableViewStateMac" pe TRUE pe pagina spre care facem redirectare.

When Session_End is called

Intr-o aplicatie web, avem doua metode in Global.asax.cs care se apeleaza in momentul in care o sesiune este creata sau cand aceasta se termina: Session_Start Session_End Daca Session_Start este apelat cand o sesiune este create, trebuie avut grija cu Session_End . Exista cateva cazuri cand aceasta metoda nu este apelata: Este apelata doar daca sesiune este “InProc”. Daca tinem sesiune in AppFabric Cache sau pe SQL Server atunci Session_End nu o sa fie apelat. Cand userul inchide browerul. Din cauza ca protocol HTTP este stateless, nu aveti cum sa detectati acest eveniment by default. In functie de brower acest eveniment se poate detecta, dar nu va face trigger la Session_End by default. Daca in sesiune nu aveti nici o informatie atunci metoda Session_End nu o sa fie apelata. Aceasta metoda este apelata de catre un worker processor. Din aceasta cauza pe thread-ul respective nu o sa aveti acces la toate resursele, chiar daca in Session_Start le-ati avut pe toate. De

#IF DEBUG can be replaces with Conditional attribute

Pe un proiect legacy la care am lucrat anul acesta apareau destul de conditia urmatoare: #if DEBUG      //Some code #endif Natura proiectului ne obliga sa avem astfel de cod. Problema era ca uneori noi compilam proiectul configurat pentru RELEASE, faceam modificari la cod si in RELEASE totul parea in ordine, dar pe masina de build, aveam erori de compilare, deoarece acesta compila in DEBUG. Am descoperit zilele acestea un nou atribut care poate sa inlocuiasca aceasta conditie urata. [Conditional("DEBUG")] public static void DoSomething() {      //Some code } Metoda DoSomething o sa fie apelata doar in cazul proiectul este compilat in DEBUG mode. Cand putem sa folosim aceast atribut? se poate folosi doar in interiorul unei clase sau a unei structuri. Nu incercati sa il puneti pe metoda unei interfete, deoarece o sa dea eroare la compilare metoda pe care o decorati cu acest atribut nu trebuie sa fie neaparat statica, dar nu are voie sa fie implementarea 

Prezentare CODECAMP - Windows Phone: multitasking and local database

Astazi urmeaza sa tin o prezentare CODECAMP in Bucuresti. Ne vedem acolo. When: 26 noiembrie 2011 Where: sediul Microsoft România din Piaţa Presei Libere nr. 3-5, Clădirea City Gate Sud, etaj 2, sala Remus Title: Windows Phone: multitasking and local database Presentation slides : http://www.slideshare.net/raduvunvulea/windows-phone-multitasking-and-local-database

DateTime.AddDays(x)

Care este greseala in codul de mai jos: for(DateTime date=beginDate;date<=endDate;date.AddDays(1)) { // Executa cod. } Problema apare in for, unde date va fi mereu mai mic ca endDate . Cauza este AddDays, care nu adauga la data curenta o anumite valore ci returneaza o noua data. Nu trebuie sa uitam ca DateTime este un value type. Codul corect este: for(DateTime date=beginDate;date<=endDate;date = date.AddDays(1)) { // Executa cod. }

No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172

Trebuia sa fac un partial deploy pe Azure la un web role in aceasta dimineata. M-am trezit cu urmatoarea eroare: No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172 Am inceput sa verific web rolul sa vad daca firewall-ul este pornit si daca blocheaza portul 8172. Totul parea in regula. Problema a fost de cand am facut full deploy-ul. Uitasem ca activez optiunea de partial web deploy. Va puteti da destul de usor seama daca ati activat partial deploy pe un web role daca incercati sa accesati adresa https://xxxx.cloudapp.net:8172/MsDeploy.axd . In cazul in care serverul nu raspunde atunci sunt mari sanse sunt ca partial deploy sa nu fie activ pe web rol-ul respectiv.

What to use? Event or delegate?

Un eveniment este de fapt un delegate mai special. Comportamentul este destul de asemanator a unui eveniment in interiorul clasei unde este declarat, dar in afara acestei clase singurul lucru care se poate face este subscribed si unsubscribed. In momentul cand cineva face (un)subscribed, putem sa executam actiuni specifice prin definirea explicita a actiunilor de "Add" si "Remove"( per event). Chiar daca pentru un eveniment putem sa specificam nivelul de acces( public, protected, private, internal), asta nu inseamna ca oricine poate sa faca raise la eveniment. Doar clasa care contine evenimentul poate sa faca raise la eveniment. In mod normal evenimentele nu trebuie sa execute o actiune pe obiectul care contine acest eveniment, ele trebuie doar sa notifice abonatii ca ceva s-a intamplat. Din aceasta cauza evenimentele trebuie privite ca ceva optional. Aruncarea evenimentului este ceva optional, iar orice exceptie aparuta in momentul respectiv nu ar trebuii sa afec

Windows Phone 7.5( Mango) support SQL CE

Windows Phone 7.5( Mango) suporta SQL CE(SQL Compact Edition). Acest feature era de mult timp asteptat. Acuma sa vedem cum se foloseste. Baza de date poate sa fie pusa in doua locatii: isolated storage installation folder In functie de locatie si de parametrii, stringul de conexiune poate sa aibe urmatoarea forma: Data Source = ' isostore:/MyDB.sdf; - cand baza de date este in isolated storage Data Source = ' isostore :/ MyDB .sdf';Password='1234'; - cand baza de date este in folderul unde aplicatia a fost instalata si este encriptata cu parola 1234 La stringul de conexiue putem sa setam si alte valori precum culture-ul( "Culture Identifier") si daca este case sensitive( " Case Sensitive" ). Trebuie sa tinem cont ca avem cateva limitari pe Mango cand vrem sa folosim SQL CE: fisierele sdf sunt stocate si deschise din isolation storage daca dorim un mecanism de ORM este nevoie sa folosim LINQ2SQL T-SQL queries nu este suportat( n

Visual Studio 2010 extensions

Zilele acestea am fost constrans de un upgrade la OS care mi-a omorat masina sa instalez de la 0 toate aplicatiile. Mai jos o sa gasiti lista de extensii pentru Visual Studio 2010 pe care le folosesc: Code alligment - il folosesc cand am nevoie sa aliniez codul dupa un anumit caracter( de exemplu cand trebuie sa aliniez cateva linii de cod dupa '='). Indent Guides - traseaza linii verticale pentru fiecare nivel de intentare in parte. PowerCommands for Visual Studio 2010 -  mai multe comenzi pe partea de management la proiecte si soluÈ›ii. Productivity Power Tool - cel mai mare plus care l-a adus pentru mine a fost fereastra de add/remove references. Spell Checke r - face check la spelling pentru string-uri, comnent-uri si plain text. VSCommands 2010 - coloreaza diferit codul scris iar cand dam click dreapta pe un fiser/director/proiect/solutie ne ofera noi functionalitati precum: deschidere CMD cu path-ul setat in directorul curent, copy class, copy full path etc.

How to store an array of booleans in a int

Uneori ajungem sa ne dorim sa stocam intr-un int mai multe valori booleene( de obicei de dragul artei) pentru a salva a avea mesajele care se trimit pe tiava cat mai mici. O solutie pe care o propun este sa folosim BitArray. Acesta ne permite sa lucram cu biti. Pentru a initializa si seta valoriile unui BitArray trebuie sa scriem urmatorul cod:   BitArray bits = new BitArray(32); // 32 - numarul de biti pe care il ocupa un int  bits[0] = true; ... bits[31] = false;   Urmatorul pas este sa convertim un BitArray in int. Acest lucru se face destul de usor cu metoda CopyTo:   int[] valueConverted = new int[1]; bits.CopyTo(valueConverted,0); // 0 - reprezinta indexul de inceput  int result = valueConverted[0];   In result am obtinut int-ul care contine BitArrat-ul nostru.Pentru a executa procesul invers, sa obtinem un BitArray dintr-un int este nevoie sa apelam metoda statica GetBytes a clasei BitConverter.   BitArray bits = BitConverter.GetBytes(result);   Ce alta

How to manualy set the location from where a controller is loaded

Uneori ajungem ca unul sau mai multe controale sa fie definite intr-un assembly diferit fata de proiectul MVC 3 pe care il avem. Pentru a putea controla mecanismul de incarcare a controalelor este nevoie sa ne definim propiul nostru controller factory. Trebuie sa ne definim o clasa care sa implementeze interfata IControllerFactory. In cazul in care vrem sa pastram si vechia functionalitate care exista by default putem sa implementam clasa DefaultControllerFactory si sa facem override la CreateController. Aceasta metoda primeste doi parametrii requestContext - care contine date despre request controllerName - numele la controller In interiorul acestei metode pe baza numelui la controler si a contextului trebuie sa returnam instanta controlerului nostru. public   class   MyControllerFactory  :  DefaultControllerFactory     {          public   override   IController  CreateController( System.Web.Routing. RequestContext  requestContext,                       

Evenimente IT de toamnă - CodeCamp și ITSpark

http://itspark.ro/b/blog/archive/2011/11/10/evenimente-it-de-toamna-codecamp-si-itspark.aspx In aceasta luna o sa aibe loc o serie de eveniment IT in Timisoara, Oradea, Cluj, Iasi si Bucuresti. Codecamp impreuna cu ITSpark si SQLServer.ro organizeaza aceasta serie de evenimente gratis. Lista de evenimente, formularele de înscriere și agenda din fiecare locație le găsiți mai jos: Timișoara - vineri, 18 noiembrie 2011 Oradea - sâmbătă, 19 noiembrie 2011 Cluj - marți, 22 noiembrie 2011 Iași - sâmbătă, 26 noiembrie 2011 București - sâmbătă, 26 noiembrie 2011 Ne vedem acolo!.

ToLower - optimization

Mai mult ca sigur stiti ce face metoda ToLower( cand vreti sa transformati un string, pentru a avea toate caracterele mici este nevoie sa apelam la aceasta metoda). Daca ne uitam peste definitie, o sa observam ca exista 3 variante ToLower() ToLowerInvariant() ToLower(CultureInfo cultureInfo) Cele 3 metode fac acelasi lucru, cel mai mult m-a interesat daca exista diferente de performanta intre ele. Am rulat codul de mai jos de 100.000.000 de ori. string uppertText = "Salut. Ce MAI fACI?"; CultureInfo cultureInfo = CultureInfo.CurrentCulture; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for( int i=0; i<100000000; i++) { string lowerText = upperText.ToLower(); //string lowerText = upperText.ToLowerInvariant(); //string lowerText = upperText.ToLower(cultureInfo); } stopwatch.Stop(); Console.WriteLine("Elapsed type: {0}",stopwatch.Elapsed); Rezultatul pe care l-am obtinut este destul de interesant: ToLower() - 10.51 s ToLowerInvariant() - 17.32

How to use Bing Maps v7

In ziua de azi, de la o poza sau un document pana la un colet trimis prin curier sau localul la care ai iesit aseara poate sa fie track-uita pe harta. Aceste harti sunt oferite gratis (Bing, Maps, Google Maps etc), iar singurul lucru pe care trebuie sa il cunoastem sunt coordonate GPS. Un utilizator poate sa foloseasca aceste harti fara nici o problema, iar cea mai mare parte din persoanele care iti acceseaza web situl nu o sa aibe probleme cu folosirea unei harti. Mai jos o sa discutam despre cum putem sa integram si sa folosim Bing Maps in web situl nostru. Exista mai multe versiuni de API pentru Bing Maps, ultima versiune (vs 7.0) a fost regandita de la 0 si a devenit extrem de usor de folosit. O sa ne uitam peste versiunea 7.0, care este integrata in totalitate cu ajax. Tot setup-ul se face din java script. Primul pas este sa ne cream un obiect de tip Map si sa specificam zona de pe pagina unde sa apara: <head> ... <script type="text/javascript" src="h

.NET - Nice to have

In C# la crearea unui obiect putem sa iniÈ›ializam propietatiile acestuia prin următoarea sintaxa: Engine engine=new Engine(…) { Power = 101, Type = “ES12RW120TDI” }; Am simtit uneori nevoie sa pot face acelasi lucre si cu un obiect deja creat. Exista locuri cand obiectul este initalizat de un factory sau deja exista, si trebuie sa schimbam valoarea unor proprietati. Mi-ar placea sa pot face urmatorul lucru: Engine engine = InitEngine(…) { Power = 101, Type = “ES12RW120TDI” }; sau use (engine) { Power = 101, Type = “ES12RW120TDI” }; In loc de engine.Power = 101; engine.Type = “ES12RW120TDI”; Nu cred ca o sa vad vreodată acest feature si nici din punct de vedere a unui limbaj de programare sintaxa nu este tocmai corecta, dar ar fi nice to have, uneori ne-ar putea usura putin codul.

EWS - Reply command - odd behavior

In ultima perioada am inceput sa lucrez cu serverul de Exchange prin intermediul la EWS si am observat un comportament nenatural, care poate sa genereze erori daca nu exista unit-teste pentru acest flow. Se da actiunea de reply. Pe exchange avem o comanda separata, care genereaza automat mesajul de reply si face autofill la TO si CC. Pana aici nimic special, doar ca aceste doua liste nu ne sunt returnate de serverul de exchange, dar in momentul in care se face SEND, ele se completeaza automat. Dar ce se intampla daca vrem sa adaugam inca o adresa de email in lista de TO. Dupa ce adaugam un email si executam actiunea de send o sa avem parte de o surpriza. Mesajul este trims doar la persoana respectiva si atata. Ce se intampla? Se face override la lista, chiar daca avem o List si noi apelam metoda Add. Solutie : In mesajul de raspuns trebuie sa adaugam manual lista de adrese. Sa nu uita ca FROM devine TO.