Skip to main content

Posts

Showing posts from January, 2012

MSTEST - CollectionAssert

In orice proiect ar trebuii sa existe unit teste. In general, pentru validare, fiecare test poate sa contina Assert-uri de forma:
Assert.IsNotNull(result); Assert.AreEqual(1,result.Count); ... In cazul in care este nevoie sa validam o lista, folosim un foreach sau orice mod de a itera o lista:
foreach(var item in result.Items) { Assert.IsTrue(baseResult.Contains(item)); } .NET ne pune la dispoztie pe langa Assert si clasa CollectionAssert, prin intermediul careia putem sa validam o colectie. Mai jos o sa trec peste cateva metode care mi s-au parut mai importante:
CollectionAssert.AreNotNull - verifica ca toate elementele din colectie sa nu fie NULLCollectionAssert.AllItemsAreInstancesOfType - verifica daca toate elementele din colectie sunt de un anumit tip( tipul poate sa fie si o interfata)CollectionAssert.AllItemsAreUnique - verifica daca toate elementele din colectie sunt diferite( fiecare element din colectie se compara cu restul folosind metoda Equal). Optional se poate spe…

Microsoft Live - Live Connect

Windows LIVE series:
IntroducereWeb AuthenticationLive ConnectBasic OperationsSkyDrive
Si am ajuns la lucruri mai interesante. O sa incep azi sa povestim despre Live Connect. Ce putem sa facem cu Live Connect? Un user conectat la aplicatia noastra se poate conecta la email, SkyDrive, messeaging sau orice alt serviciu folosind un Live ID.
Cum il folosim? Partea buna in toata nebunia asta este ca API-ul de Live Connect este conform standardului OAuth 2.0 si suporta atat JSON cat si protocolul XMPP. Acesta poate sa fie integrat in orice fel de aplicatie, indiferent de limbaj sau platforma.
Daca e prima data cand auziti de XMPP, trebuie sa stiti ca acesta este un standard de comunicare pentru aplicatiile de chat, care permite ca sa ne integram aplicatiile proprii de chat cu Messenger-ul de la Microsoft faca nici o problema.
In urmatorul exemplu o sa vedem ce trebuie sa facem ca un utilizator sa se autentifice prin apeluri de tip REST:
- redirectam userul spre urmatoarea pagina, unde r…

Windows Live - Web Authentication

Windows LIVE series:
IntroducereWeb AuthenticationLive ConnectBasic OperationsSkyDriveLive ID se poate folosii pentru doua lucruri:
autentificarea userilor in aplicatia noastra folosind contul de Live IDaccesul aplicatiei noastre la servicii pe care un user de LIVE ID are access( photo sharing, agenda, calendar, etc)Astazi o sa discutam despre cum poate un utilizator sa se autentifice in aplicatia noastra folosind contul de de Live ID.
Mai jos o sa prezint vechiul mod de autentificare, care a devenit absolute, odata cu lansarea "Live Connect", despre care o sa povestim cat de curand. Prefer sa prezint si acest mecanism in cazul in care lucrati cu aplicatii deja facute care folosesc vechiul mecanism de autentificare.
Acest mecanism de autentificare a fost denumit de cei de la Microsoft "Windows Live ID Web Authetification", dar nu are nimic mai special. In momentul in care userul doreste sa se autentifice, acesta este redirectat spre pagina Windows Live ID, unde isi va…

Code Retreat Sibiu

Sambata, 28 ianuarie 2012, sunteti invitati la birourile iQuest din Sibiu la o sesiune de Code Retreat.
Code Retreat este o oportunitate ca pe parcursul unei intregi zile sa scrieti cod doar de fun, fara presiunea deadline-urilor. Chiar daca nu reusesti sa termini decat cateva linii de cod, daca sunt “perfecte”, te consideram totusi “de-al nostru.” Este o ocazie in plus sa practicam ceea ce, ca dezvoltatori profesionisti de software, predicam: conceperea de cod minunat Idea este simpla: se gaseste cate un partener de TDD pentru o problema de programare (tema) pentru 2×3 sesiuni de cate 45 de minute in orice limbaj doriti. Daca nu ati mai folosit TDD sau daca nu ati mai programat in echipa sa nu va fie teama: suntem prietenosi si nu va mancam de vii pentru asa ceva Dupa fiecare sesiune perechile vor imparti pareri si cunostinte dobandite. Pentru mai multe informatii: http://www.iquest.ro/blog/2012/01/26/iquest-code-retreat-sibiu/#.TyEYVvlactk

Update: Dupa acest eveniment, cea…

Web application end - how to determine why has stopped

Sa spunem ca avem o aplicatie web care se afla pe IIS. Observam ca aplicatia uneori moare si nu reusimg sa ne dam seama din ce cauza. Din anumite motive "exceptia" care se intampla in aplicatie nu poate sa fie prinsa si aplicația moare fără sa logeze nici o informație. De ce spun "exceptie", deoarece uneori poate sa fie vorba de un pool recycle care sa genereze acest comportament( cauza nu este mereu o exceptie in adevaratul sens al cuvântului).
Ce putem face? O solutie este ca in Global.asax.cs, in metoda Application_End sa obtinem date despre motivul pentru care aplicatie se termina si sa scriem aceste date in trace sau sa le logam undeva. Aceasta metoda o sa fie apelata de fiecare data cand aplicatia este oprita. Din pacate informatiile pentru care aplicatia este oprita se pot obtine doar prin intermedul reflection. Nu avem o alta modalitate sa obtinem aceste date. Daca aplicatia primeste un semnal din exterior ca trebuie sa se opreasca metoda Application_Error …

Office document and custom properties in .NET 3.5

In documentele Office( Excel, Word, ..) putem sa stocam meta-propietati. Aceste meta-propietati sunt denumite custom properties. O parte din ele sunt definite de catre fiecare utilizator in parte, iar altele exista by default.
Informatii precum "Last Saved Time" sau "Last Author" sunt setate automat de catre Office in momentul in care lucram cu un document. In cazul in care dorim sa accesam aceste informatii din .NET 4.0 este destul de simplu, dynamic types isi face perfect treaba aici.
Partea interesanta este cand este nevoie sa accesam aceste date din .NET 3.5 de exemplu, unde dynamic types exista, dar nu ne permite sa il folosim asa cum am dorii.
Pentru a putea sa accesam custom properties dintr-un document Office, in .NET 3.5 trebuie sa ne reintoarcem putin in timp. Orice incercare de a accesa aceste propietati direct, o sa termine cu o eroare de COM la runtime.
((DocumentProperties)docWorkbook.BuiltinDocumentProperties)["Last Author"]
((DocumentProperties…

KeyedByTypeCollection

Cati dintre voi ati folosit pana acuma KeyedByTypeCollection? Sa va spun sincer, pana nu de mult nici nu stiam ca exista. Aceasta colectie este un dictionar unde cheile acesteia sunt reprezentate de tipul valorii adaugate in colectie.
KeyedByTypeCollection<object> collection = new KeyedByTypeCollection<object>(); collection.Add("Car"); collection.Add(1); collection.Add(1.1); collection.Add("Dog"); // Aceasta linie o sa arunce exceptie. Ultima linie o sa arunce exceptie deoarece avem deja in colectie un element de tip string. La prima vedere aceasta colectie pare destul de ciudata si poate genera urmatoarea intrebare:
La ce este folositoare?Un scenariu in care aceasta colectie poate sa foarte folositoare este cand vrem sa avem un factory care sa pastreze obiectele ca si singleton. Folosind aceasta colectie implementarea factory poate sa aibe urmatoarea forma:
public class SingletonFactory<T> { private readonly KeyedByTypeCollection<T>…

MVC3 - After RedirectToAction ViewBag is null

Intr-un post anterior am discutat putin despre ViewBag.
Sa vedem ce se intampla daca il folosim in urmatorul mod:
public ActionResult Index()
{

ViewBag.Error = “some error”;
return RedirectToAction(“Error”,”Home”);
}
In cazul in care o sa dorim in actiune Error din controlerul Home sa accesam ViewBag.Error, o sa observam ca acesta este null. Informatile din ViewBag sunt pierdute in momentul in care se face un RedirectToAction.
O solutie destul de simpla este sa folosim TempData, care persista intre doua actiune. TempData se poate folosii cu success cand dorim sa trimitem date intre requestul current si urmatorul. Durata de viata a obiectelor din TempData, o sa fie pana la urmatorul redirect (inclusiv). Dupa momentul respective aceste date se pierd. Valoriile din TempData sunt tinute pe sesiune intre actine curenta si urmatorea actiune accesata printr-un redirect.
public ActionResult Index()
{

TempData.Error = “some data”;
return RedirectToAction(“Error”,”Home”);
}

Windows Live - Introducere

Windows LIVE series:
IntroducereWeb AuthenticationLive ConnectBasic OperationsSkyDrive
Acesta este primul post dintr-o serie de posturi in care osa discutam despre Microsoft Live ID. O sa discutam mai ales din perspectivaunui dezvoltator. Inainte sa incepem sa vorbim despre Live ID, cred ca estenecesar sa vedem ce inseamna OpenID. OpenID is an open standard that describes how users can be authenticated in a decentralized manner, eliminating the need for services to provide their own ad hoc systems and allowing users to consolidate their digital identities. Sursa: Wikipedia Pentru noi, ca si dezvoltatori de aplicatii web, mobile saudesktop acest lucru inseamna ca putem sadezvoltam aplicatii care permit utilizatoriilor sa se autentifice cu un user deLive Id, Facebook, Yahoo, Google. Open ID ne ofera mecanismul prin care putemsa verificam identitatea unui user, userul X este perosana care predinte caeste defapt. Din cei trei de AAA(Authentification, Autorization, Accounting), OpenID ne ajuta …

LINQ: ToDictionary

Se da o lista de obiecte care trebuie convertite intr-un dictionar.
O prima implementare la aceasta ar putea sa fie:
Dictionary<string,Car> dictionary=new Dictionary<string, Car>();
foreach (var car in cars)
{
dictionary.Add(car.Code,car);
}

Putem avea diferite implementări, in diferite moduri. Ce nu trebuie sa uitam ca LINQ ne ofera aceasta posibilitate folosind metoda "ToDictionary".
Cea mai simpla varianta primeste un singur parametru, care specifica cheia key-ul care o sa fie folosit pentru fiecare element care se adauga in dictionar:
Dictionary<string,Car> dictionary= cars.ToDictionary(car => car.Code);

Un alt overload la aceasta metoda ne permite sa specificam si item-ul care se adauga pentru key-ul dat:
Dictionary<string, string> dictionary = cars.ToDictionary(car => car.Code, car => car.Model);


Spor!.

ReadOnlyDictionary in .NET 4.0 and 4.5

.NET 4.5 aduce destul de multe feature noi. Insa pana o sa fie adoptat pe proiectele in curs o sa treaca o perioada destul de lunga. Unele din aceste feature le putem avea si in .NET 4.0, doar ca trebuie sa scriem putin cod.
In .NET 4.5 daca avem nevoie de un dictionar care sa fie read-only este destul de simplu. Avem la dispozitie interfata IReadOnlyDictionary si implementarea acesteia. Implementarea poate sa fie gasita in namespace-ul System.Collections.Generic din 4.5.
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "first");
dictionary.Add(2, "second");

ReadOnlyDictionary<string, int> readOnlyDictionary =
new ReadOnlyDictionary<string, int>(dictionary);

Ce este bine de stiut ca operatiile de add/edit/delete inca exista, doar ca in momentul in care acestea o sa fie apelate o sa arunce o exceptie de tip NotSupportedException.
Daca ati lucrat cu API-ul de Team…

What Is Clean Code?

Reciteam "Clean Code" zilele astea și am dat peste definițiile date de către mai multi programatori a cea ce înseamna un cod curat. Mai jos găsiți aceste citate:
I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well.
Bjarne Stroustrup

Clean code is simple and direct. Clean codereads like well-written prose. Clean code neverobscures the designer’s intent but rather is fullof crisp abstractions and straightforward linesof control.
Grady Booch

Clean code can be read, and enhanced by adeveloper other than its original author. It hasunit and acceptance tests. It has meaningfulnames. It provides one way rather than manyways for doing one thing. It has minimal dependencies,which…

How to normalize text to English base

Cand avem o aplicatie care este accesata din mai multe tari, poate sa apara o problema cand se pune problema cautarii sau stocarii datelor. Daca avem o adresa scrisa in limba romana de exemplu o sa avem caractere precum 'â', 'ț', ... dar cand un utilizator dintr-o alta tara o sa caute o anumita adresa de exemplu vrem sa normalizam textul.
O varianta destul de simpla la aceasta problema este sa normalizam tot textul spre caractere ascii base. In acest caz de exemplu 'ț' o sa devina 't'.
Acest lucru se face destul de simplu folosind metoda Normalize, făcând o descompunere canonica a textului.
string normalizeText = sourceText.Normalize(Normalize.FormD);
Trebuie sa avem grija la unele semne de legatura precum 'ß', pentru care trebuie sa facem manual transformarea( dacă dorim).
Mai jos gasiti implementarea pe care eu o propun:
private static readonly char[] SplitChars;
private static readonly Dictionary<char, char> SpecialChars;
static Constructor()

Timer - run action at a specific time interval

Nu odată am întâlnit requirement-uri la o aplicație de genul:
Se da un proces ce trebuie executat la un anumit interval de timp. Un proces se poate executa doar dacă a trecut un anumit interval de timp de la terminarea ultimei procesări.
Exista mai multe soluții la aceasta problema. Thread-uri, timer, sleep and so on. Pentru a vedea cum se folosește un timer click aici.
Soluția care mi-e mi s-a părut cat de cat curata se bazează pe un timer setat sa ruleze o singura data, iar după fiecare procesare acesta este pornit din nou.
Trebuie avut grija la următoarele posibile probleme care pot sa apară:
     1. Când se face Start, Stop la timer trebuie avut grija ca suntem într-un mediu multi-thread, din aceasta cauza trebuie sa ne asiguram ca avem un mecanism de lock-ing.
     2. La fiecare execuție a callback-ului pe care timer-ul îl arunca trebuie verificat dacă timer-ul nu a fost oprit deja prin intermediul altui thread.
     3. In callback trebuie sa avem grija sa avem grija sa prindem e…