Skip to main content

Posts

Showing posts from April, 2011

Cum putem sincroniza un director cu un blob din cloud.

Ieri am vorbit despre modalitatea prin care una sau mai multe instante de SQL Azure se pot sincroniza.
Astazi o sa incerc sa o ofer o solutie pentru cazul in care un client adauga in mod deconectat date pe blob, pe care noi vrem mai tarziu sa le le sincronizam cu blob-urile din cloud.
Problema: Se da un client care lucreaza cu date din blob-uri in mod deconectat. Se doreste ca la reconectare sa se sincronizeze cele doua storage-uri.
Ati spune simplu, ne apucam sa ne scriem un mecanism prin care sa putem sincroniza cele doua containere de date. Da, e si asta o varianta, dar oare merita sa implementam de la zero acest mecanism. Ati putea spune ca putem vedeam cele doua storage-uri ca si doua directoare si atunci sa folosim un mecanism de sincronizare a directoarelor. Suna bine, dar am o solutie mult mai curata - Microsoft Sync Framework.
Se bazeaza pe idea de a vedea cele doua storage-uri ca si doua directoare( partitii). Folosindu-ne de Microsoft Sync Framework putem sa sincronizam aceste…

Single Responsibility Principle

Toata lumea a auzit de acest principiu. Pe scurt fiecare obiect trebuie sa aibe o singura responsabilitate.
Problema apare la interpretare. Fiecare persoana poate sa inteleaga diferit cand ne referim la responsabilitate.
Din cate am vazut pana acuma exista doua moduri in care se poate implementa SRP:
- fiecare metoda publica expusa de catre o clasa reprezinta o responsabilitate unica;
- fiecare obiect ar trebui sa aibe o singura responsabilitate.
Daca ne folosim de prima varianta, ajungem sa avem sute de interfete si clase abstracte, fiecare cu o singura metoda. In cazul in care respectam a doua varianta apare problema la interpretare. Cum putem spune ca o clasa are o singura responsabilitate si doar una.
De exemplu daca avem o entitate la care vrem sa adaugam metoda ToXml() am putea spune ca este corect din punct de vederea a SRP. Dar mai tarziu poate am avea nevoie de metoda ToString(). Aceste doua metode violeaza SRP.
Din pacate aceasta discutie ar putea sa continue la nesfarsit. Trebuie …

Cum sa sincronizam mai multe baza de date SQL Azure - Data Sync Service

Uneori avem nevoie de un mecanism prin care sa putem sincroniza una sau mai multe baza de date SQL Azure. Putem sa încercam sa scriem cod prin intermediul căruia sa ne sincronizam bazele de date din același data center sau din data center-uri diferite.
O alta soluție la îndemîna este Data Sync Service. Prin intermediul acestui mecanism putem sa ne sincronizam doua sau mai multe baza de date din cloud fara sa fie nevoie sa scriem nici o linie de cod. Nu mai este nevoie sa reinventam roata din nou.
De exemplu dacă avem 2 baze de date în norișor, una în Europa și alta în Asia pe care trebuie sa le sincronizam bidirecțional putem sa folosim cu încredere acesta soluție. Orice modificare făcuta într-o baza de date se va face în mod automat și în cealaltă baza de date din celalalt data center.
Nivelul de granularitate dupa care se poate face filtrarea in acest moment este tabela. Putem sa setam ca una sau mai multe tabele sa fie sincronizate. Din fericire in cazul in care acelasi continut este …

Adnotare enum cu mai multe valori

Cand dorim sa serializam un enum putem sa atasam la valoarea fiecarui item din enum atributul XmlEnumAttribute. Astfel la serializare/deserializare o sa putem lucra cu o valoarea string nu cu o valoare numerica.
Pana aici nici o problema, dar cum facem sa obtinem doar aceasta valoarea si nu un xml care contine si aceasta valoarea . De exemplu pentru enum-ul:
public enum Dimension
{
[XmlEnum(Name="BigT")]
Big
[XmlEnum(Name="SmallT")]
Small
}

am obține folosindu-ne de XmlSerializer un output care contine si un nod care specifica ce tip de data ii. Pentru a putea sa obtinem doar valoare BigT sau SmallT putem sa apelam la reflection si sa iteram prin atributele item-ului respectiv pana ajungem la un atribut de tip XmlEnumAttribute.
Acuma, daca ducem problema umpic mai departe, putem sa ajungem la cazuri in care elementele din enum au diferite valori. De exemplu daca lucram cu doua sau mai multe aplicații, putem sa avem doua sau mai multe reprezentări pentru ac…

Finala concursului scolii de cloud

Ieri, 29 martie 2011 a avut loc finala concursului scolii de cloud. Cei trei castigatori au fost:
Business Logic Systems cu aplicatia MMS GatewayZitec cu aplicatia HotelPeeps TrendsTeamnet cu aplicata Dosarul Electronic PacientiMai multe informati puteti sa gasici http://zoli.herczeg.ro/2011/04/19/c%C8%99tigatorii-concursului-%C8%99colii-de-cloud/
Aplicatia open source pe care am dezvoltato impreuna cu Andrei Ignat si Catalin Gheorghiu a ajuns pana in finala, dar nu a castigat nici un premiu. Daca sunteti curiosi sa aflati mai multe detalii despre aplicatia noastra Windows Azure Backup va invit sa vizitati pagina http://myazurebackup.codeplex.com/.
Aceasta aplicatie va ramane in continuare open source in varianta actuala. Exista si o sa existe si alte functionalitati care nu o sa fie incluse in proiectul open source, daca sunteti interesati si de solutie platita va rog sa ne contactati.
Multumesc companiei iQuest Technologies pentru sustinere.

Cum sa configuram Azure development storage pentru a putea fi accesat de catre toata echipa de dezvoltare

In mod default, cand pornim storage-ul local, acesta accesează 127.0.0.1. Dar ce ne facem daca avem o echipa de dezvoltare care doreste sa lucreze pe un storage comun. Prima posibilitatea este sa ne configuram un storage sus pe cloud, dar asta înseamna bani in plus si un lag, in cazul in care nu avem o conexiune foarte rapida.
O alta varianta este s schimbam configurarea pe mașinile de development, astfel incat acestea sa bata spre aceiasi adresa. Pentru a putea face acest lucru trebuie sa deschidem fisierul DSService.exe.config din directorul ~Program Files\Windows Azure SDK\v1.4\bin\devstore\DSService.exe.config. Sub nodul services o sa gasim lista de adrese pentru blobs, queue si tables.
Fiecare adresa a serviciului poate sa fie modificata, ca in exemplul de mai jos:
<services>
<service name="Blob" url="http://10.123.1.9:10000/"/>
<service name="Queue" url="http://10.123.1.9:10001/"/>
<service name="Table" url=&…

Eveniment .NET in Cluj-Napoca 26 27 mai 2011

Organizatorii acestui eveniment sunt persoane implicate activ în comunitatea dezvoltatorilor .NET, cu experiență în organizarea de prezentări și seminarii tehnice pentru dezvoltatori vizibile pe web la CodeCamp.ro, și în comunitatea ITSpark ce acoperă zona ITPro entry și mid-level, fiind orientată către specialiștii IT. Tocmai din acest motiv, sesiunile vor fi tehnice și foarte practice, dorind mai degrabă să arate cum se utilizează tehnologii de azi și mai puțin să prezinte tehnologii de mâine. Totuși, nu vor lipsi prezentari cu teme legate de viitoarele versiuni ale soluțiilor tehnice discutate.Cand: 26-27 maiUnde:Hotel Cluj Napoca Golden Tulip Ana Dome‎Inregistreazate: http://itcamp.ro/inregistrare.aspx#nav
Pentru mai multe detalii http://itcamp.ro/

Assembly comun intre mai multe tipuri de proiecte in Visual Studio

Uneori lucram cu proiecte care au assembly-uri atat pe Silverlight cat si solutii clasice .NET. Din pacate un assembly de Silverlight nu se fi adaugat ca si referinta la un proiect normal( sau invers).
O solutie la aceasta problema este sa adaugam fisierele ca si "Add as link" intr-unul din cele doua proiecte. Dar problema apare la compilare, in cazul in care apelam API care nu este suportat de una din platforme si uitam sa compilam fiecare solutie in parte pentru a face aceasta verificare.
Din aceasta cauza ne putem trezii cu neplaceri.
Ar fi frumos sa avem la dispozitie un proiect comun, pe care sa il putem referentia in orice proiect. Aici vine in ajutor Microsoft si ne pune la dispozitie Portable Library Tools.
Din pacate acest lucru trebuia facut in momentul in care au lansat Visual Studio 2010, dar niciodata nu este prea tarziu.
Cu ce ne ajuta acest tool? Avem posibilitatea sa avem un assembly comun intre Silverlight, XNA, Windows Phone, XBox si proiecte .NET clasice. Din p…

Cum putem sa verificam tipul unei variabile intr-un SWITCH

Sunt momente cand avem nevoie de a face anumite actiuni in functie de tipul variabilei. Din pacate SWITCH-ul nu ne permite acest lucru in mod direct si suntem nevoiți sa apelam la IF..ELSE. if (item is int)
{...}
else if (item is string)
{...}
else if (item is DateTime)
{...}
else if (item is ...)
Codul pe care il obtinem nu este foarte lizibil. Daca totusi am vrea sa folosim SWITCH am fi nevoiti sa lucram cu string-uri obtinand ceva asemanator cu: swtich( v.GetType().Name)
{
case typeof(int).Name:
...
break;
case typeof(DateTime).Name:
...
break;
...
}
Parca e mai bine decat codul precedent, dar ceea ce nu e tocmai bine este ca lucram cu string-uri. O solutie la aceasta problema este sa folosim TypeCode. Acest enum contine toate tipurile built-in din .NET. switch( Type.GetTypeCode(v.GetType)))
{
case TypeCode.Int32:
...
break;
case TypeCode.DateTime:
...
break;
...
}
In cazul in care lucram doar cu tipurile built-in din .NET totul este perfect. Ceea ce imi place la Typ…