Skip to main content

Posts

Showing posts from March, 2012

What is HTML5 for native Windows 8 applications

Am vazut ca foarte multa lume se plange de faptul ca codul HTML5 scris pentru aplicatii native for Windows 8 nu este compatibil pe alte browsere.
Cea ce trebuie subliniat este faptul ca aplicatiile scrise pentru WinRT nu sunt cross-platform. De exemplu daca apelan din JavaScript API de WinRT pentru a vedea locatia GPS atunci ne putem lua adio de la notiunea de cross-platform. Trebuie avut grija ca API de WinRT nu se refera doar la functionalitati apelate din JavaScript. Cand folosim un layout specific din HTML folosind atribute custom pe care le gasim doar pe desktop application for Windows 8, sau avem un CSS cu style care se gaseste doar pe Windows 8 atunci noi deja folosim WinRT API, iar partea de compatibilitate este total pierduta.
Pentru partea de compatibilitate ar exista cateva solutii. De exemplu sa ne definim un wrapper peste API care foloseste aceste resurse si in functie de unde ruleaza pagina noastra sa incarcam diferite JavaScript-uri.
Dar cel mai important lucru care tr…

How to use C# library from JavaScript in Windows 8

Nu stiu daca v-ati jucat pana acuma cu Windows 8 si Visual Studio 2011, dar o sa aveti o surpriza. Aplicatiile pe care le puteti scrie pentru desktop pot sa fie XAML (impreuna cu C#) sau HTML5 (HTML, CSS, JavaScript).
WinRT (Windows Runtime) ne permite sa avem interoperabilitate intre C++, C#, JavaScript. Este asemanator cu ce era COM+ pe vechiul Windows. Prin intermediul sau putem sa comunicam intre cele trei limbaje. Din punct de vedere tehnicec, WinRT este mult mai simplu decat P/Invoke, avand o sintaxa destul de simpla. Un fisier ".winmd", o sa contina tot API pe care noi il expunem intr-un format destul de asemanator cu cel de .NET.
Metadatele dintr-un ".winmd" descriu codul care a fost scris pentru WinRT. Prin intermediul acestor informatii, putem apela atat API sistemului de operare cat si librarii scrise in alte limbaje de programare. Tot API-ul sistemului de operare pe care noi il accesam din orice limbaj se face prin intermediul WinRT.
Mai jos o sa prezin…

Structure and "Cannot modify the return value of XXX because it is not a variable" error

In ziua de azi aproape toata lumea foloseste clase. Cand aude cineva de struct, se uita la tine ciudat, de parca ai venit din evul mediu. In unele cazuri o structura este o optiune mult mai buna decat o clasa, dar nu despre asta o sa discutam astazi. O sa discutam putin despre o eroare pe care multa lume o primeste cand lucreaza cu struct.
Cannot modify the return value of XXX because it is not a variableCod sursa:
struct Foo
{
public int Value { get; set; }
}

class FooContainer
{
public FooContainer()
{
Foo = new Foo() {Value = 1};
}
public Foo Foo { get; private set; }
}
...
FooContainer fooContainer=new FooContainer();
fooContainer.Foo.Value = 2; // !!!
Cauza la aceasta eroare nu este limbajul, Visual Studio sau orice alt dezvoltator care a lucrat la proiect. Este vina celui care vrea schimbe valoarea unei date dintr-o structura.
O structura poate sa contina constante, field-uri, propietati, operatori, evenimente, index-uri etc. Aceasta se poate folosii 'oarecum' …

Post event - Intâlnire CodeCamp la Cluj-Napoca - 24 martie 2012

Ieri, 24 martie 2012, a avut loc un nou eveniment de primavara pentru comunitate. Acesta a fost organizat de catre CodeCamp in Cluj-Napoca. Fata de alte evenimente CodeCamp pe care le-am organizat in Cluj, acesta a fost cel mare de pana acuma (peste 115 persoane). Speram ca si in viitor sa avem acelasi numar de participant. Pe aceasta cale vreau sa le multumesc tuturor pentru participare.
Au fost 5 prezentari foarte interesante despre diferite subiecte.
Mihai Nadăș - Globally distributed DNS service with Windows Azure's Traffic Manager
Florin Coros - Good Unit Tests Ask For Quality Code
Radu Vunvulea - ASP.NET MVC 3 - Bad practices
Levente Veres - How to create easily Workflows and present with Visio in SharePoint 2010
Mihai Tataran -    
Building elastic, autoscalable solutions with Windows Azure
Daca in viitor doriti sa tineti prezentari in Cluj-Napoca si nu numai, va rog sa ma contactati.
As vrea sa le multumesc sponsoriilor ca ne-au ajutat sa organizam acest eveniment. Pe langa o loc…

How to get friendly format for GetType().Name

Pornim de la urmatorul exemplu:
List<string> list = new List<string>();
Console.WriteLine(list.GetType().Name);
Asa cum ne-am astepta ne este returnat "List`1". Dar uneori nu ne este de ajuns atata, vrem sa vedem si tipul generci. Ceva de genul acesta "List". Pentru acest lucru avem nevoie sa apelam metoda GetGenericArguments pentru a obtine tipuriile generice.
Mai jos gasiti un extension method la Type care returneaza numele la type asa cum l-am prezentat mai sus.
public static class TypeExtensions
{
private const string TypeSeparator=",";
private const char UnusedSymbol = '`';
private const string TypeFormat = "{0}<{1}>";

public static string ToGenericTypeString(this Type type)
{
if (!type.IsGenericType)
{
return type.Name;
}

return string.Format(TypeFormat,
GetGenericTypeName(type),
GetGenericArgumentsName(type));
}

private static string GetGenericArgumentsName(Type type)
{
retur…

One way to persist objects in isolated storage

In unele cazuri avem nevoie sa stocam date in isolated storage. In cazul in care numarul de date pe vrem sa le stocam nu este foarte mare, putem sa le serializam direct si sa le salvam sub forma unui fisier in isolated storage.
In exemplul de mai jos, datele le-am serializat folosind DataContractSerializer. Din aceasta cauta, clasele pe care vrem sa le salvam trebuie sa fie decorate cu atributul DataContract, iar fiecare proprietate pe care dorim sa o salvam trebuie decorata cu atributul DataMember.
[DataContract] class Foo { [DataMember] public string Name { get; set; } public int Age {get; set; } } In exemplul dat mai sus o sa salvam doar proprietatea Name.
Mai jos puteti sa gasiti o clasa generica care salveaza un obiect dat. In metodele Save si Load as fi putut sa trimit ca si parametru numele la fisier, dar am ales ca numele de fisier sa se genereze pe baza tipului. Se poate si in alte moduri.
public class IsolatedStorageRepository<TItem> { public void Save…

Can we mock an extension method?

Pentru teste mai mult ca sigur ati folosit un framework petru a face mock pe diferite obiecte. In general am folosit Moq pentru a putea face mock la date. Este destul de usor de folosit, mai jos puteti sa gasiti un exemplu:
Mock<IService> serviceMock = new Mock<IService>(); serviceMock .Setup(x=>x.Call(It.IsAny<string>)) .Returns(()=> new Result()); Mai sus am creat un mock pentru IService, iar in momentul in care se apeleaza metoda Call cu orice parametru de tip string, se returneaza un nou obiect de tip Result.
Nimic deosebit pana acuma. Dar ce se intampla daca vrem sa facem mock la un extension method. Vestea proasta este ca nu se poate face. Majoritatea framework-urilor pentru mock-ing nu suporta aceasta functionalitate.
Cea mai buna solutie este sa refactorizam codul daca putem. Dar exista cazuri cand acest lucru nu il putem face sau extension method nu este declarat de noi si vine dintr-un assembly exterior.
O solutie comuna, care poate sa fie folo…

Access a property using reflection

Cum putem face get/set la o proprietate prin intermediul la reflection. Odata ce avem tipul obiectului care contine proprietate, este de ajuns sa apelam InvokeMember si sa specificam numele proprietatii.
private TReturn GetProperty<TReturn>(object obj, string propertyName)
{
return (TReturn) obj.GetType().InvokeMember(
propertyName,
BindingFlags.GetProperty,
null,
obj,
null);
}

private void SetProperty(object obj, string propertyName, object value)
{
obj.GetType().InvokeMember(
propertyName,
BindingFlags.SetProperty,
null,
obj,
new object[] { value });
}
BindingsFlags se poate seta printr-un OR logic, in functie de proprietatea cu care lucram( publica, privata, statica, etc). De exemplu, pentru o proprietate publica si care nu este statica putem sa avem urmatorul apel:
obj.GetType().InvokeMember(
propertyName,

How to extract a file extension from a string path

Cautand ceva printr-o aplicatie am gasit urmatoarele linii de cod:
foreach (Foo foo in contaner.Foos)
{
if ( foo .FileName.EndsWith(".exe") )
{
// executa o actiune
}
}
Ce vi se pare ciudat in codul de mai sus?
Ce mi-a sarit mie in ochi in primul moment a fost modul in care se verifica daca extensia la fisier este ".exe". .NET ne pune la dispoztie clasa System.IO.Path, prin intermediul careia putem sa extragem numele de fisier, extensia, full path-ul, root path etc.
In cazul nostru putem sa folosim metoda Path.GetExtension(string). Aceasta metoda o sa ne returneze extensia fisierului, daca fisierul are extensie, iar in cazul in care fisierul nostru nu are extensie atunci o sa returneze stringul gol( String.Empty).
Dar ce se intampla in cazul in care path-ul pe care noi il dam este NULL? Valoarea care o sa fie returnata o sa fie la randul ei NULL.
Codul de mai sus l-am putea rescrie in felul urmator:
foreach (Foo foo in contaner.Foos)
{
if ( Path.GetExtens…

Intâlnire CodeCamp la Cluj-Napoca - 24 martie 2012

Si iată ca am pregătit un eveniment de primăvara pentru dezvoltatorii din Cluj-Napoca. Va așteptam pe toți în 24 martie, de la ora 9:45, la Grand Hotel Napoca în sala Ambasador. Participarea la eveniment este gratuita. Mulțumim în special sponsorilor pentru susținere. Formular inregistrare

Agenda
9:45-10:00 Sosirea participanților 10:00-11:00 Globally distributed DNS service with Windows Azure's Traffic Manager Mihai Nadăș Windows Azure Traffic Manager is a load balancing solution that enables the distribution of incoming traffic among different hosted services in your Windows Azure subscription, regardless of their physical location. . In this session an introduction to the Traffic Manager service from the Windows Azure suite will be presented, covering performance, disaster recovery and upgrade and testing scenarios. 11:00-12:00 Good Unit Tests Ask For Quality Code
Florin CorosThe greatest benefit you will gain by writing good unit
tests is the quality of your code design. Good uni…

Can we write a network sniffer in .NET using only .NET API?

Impreuna cu un coleg de birou am fost curiosi sa vedem daca putem sa scriem un sniffer cu API de .NET, fara sa folosim alte librari.
Pe internet exista destul de multe librari care fac acest lucru. Cea mai populara am vazut ca este WinPCap. Pentru al putea folosii este nevoie sa instalam niste drivere care o sa ne permita sa accesam orice packet de date care circula pe fir.
Acuma sa vedem ce putem sa facem din .NET. Prin intermediul clasei Socket, putem sa ajungem sub layer-ul de transport si sa accesam layer-ul de retea( network). Atat .NET cat si sistemul de operate ne limiteaza accesul doar la packetele care au ca sursa sau destinatie calculatorul nostru. Nu va asteptati sa puteti accesa packete care nu va sunt destinate. Din ce am gasit pana acuma, nu este posibil sa interceptam pachetele de date dintre alte doua device-uri din reteaua noastra. Acest lucru se poate face din .NET daca ne folosim de un wrapper peste WinPCap.
Folosind direct API-ul .NET nu o sa putem sa facem un sniffer…

Resources from base class

Pornim de la urmatoarea problema:
O clasa de baza expune printr-o propietate o resursa de orice fel. Prin modul in care este implementata clasa de baza, clasele care mostenesc clasa noastra de baza nu sunt obligate sa initializeze propietatea noastra.
class BasePC
{
public string SomeData { get; private set; }

public BasePC(){ }

public BasePC(string someData)
{
SomeData = someData;
}
}

class DesktopPC : BasePC
{
public DesktopPC()
: base()
{

}
}
Ce parere aveti despre aceasta propietate neinitializata. Este corect ca sa existe propietati in clasa de baza care sa nu fie initializate?
Nu ar fi prima data cand am avea aceasta problema. Exista diferite modalitati sa verificam daca aceasta propietate poate sa fie folosita sau nu, dar ...
In exemplul dat mai sus, cel care o sa foloseasca clasa DesktopPC se va astepta ca resursele care ii sunt puse la dispozitie sa fie deja initializate si sa le poata folosi fara nici o problema.
In exemplul dat mai sus, vorbim doa…

How to improve our MVVM application using CallerMemberName

Zilele astea am descoperit cateva noi atribute in .NET 4.5 care ne sunt f. utile intr-o aplicatie MVVM si nu numai.
In namespace-ul System.Runtime.CompilerServices o sa gasim cateva atribute noi care ne permite sa accesam informatii despre cine a apelat metoda, la ce linie si locatia fisierului cs. Aceste informatii ne pot ajuta cand vrem sa scriem in log anumite date. In loc sa transmitem ca si parametru de fiecare data cine face apelul, putem sa specificam prin intermediul acestor atribute. In exemplul de mai jos, o logam cine a apelat metoda, locatia fisierului care a apelato si numarul linii de cod de unde s-a facut apelul:
public void WriteLog(
[CallerMemberName] string memberName = "",
[CallerFilePath] string filePath = "",
[CallerLineNumber] int lineNumber = 0)
{
Debug.WriteLine(String.Format("{0}-{1}: {2} ", filePath, lineNumber, memberName));
}
...
WriteLog(); // apel metoda
Orice …

One way to use Dispatcher in a Silverlight application

Daca suntem intr-o aplicatie MVVM folosind Siverlight, in unele situatii o sa avem nevoie Dispatcher pentru a executa cod pe UI thread.
O varianta este de a trasmite o instanta la Dispatcher prin constructor sau cand se face apelul la o metoda data.
public class Context()
{
...
Context(Dispatcher dispatcher)
{
_dispatcher = dispatcher;
}
..
{
_dispatcher.BeginInvoke( () => { ... } );
}
}
O alta varianta destul de des intalnita este sa se obtina o referinta la Distapcher direct prin apelul:
Deployment.Current.Dispatcher
Ambele variante functioneaza fara nici o problema. Problema este ca clasele care folosesc acest Dispatcher o sa fie coupled. Aceasta problema se poate observa cel mai usor in momentul in care se scriu teste. Daca testele o sa reluze din brower de exemplu, pana la sfarsitul testelor, threadul de UI o sa fie blocat de rularea acestora, din aceasta cauza nu o sa se ajunga ca codul apelat prin Dispatcher sa fie executat. Pe langa acest lucru in teste dorim sa putem controla…

How to access RSS feeds from code

.NET ne permite sa accesam feed-uri in format RSS sau ATOM fara nici o problema. XML returnat de un RSS nu trebuie sa il procesam noi manual, exista deja clase in .NET care pot sa faca acest lucru.
In postul de astazi o sa ne vedem cum putem sa incarcam un feed de tip RSS din cod.
Dupa cum stiti, formatul unui feed RSS este XML. Acest format este deja standardizat si nu ar trebui sa ne trezim cu campuri noi. In general un feed RSS contine date despre cine ne furnizeaza aceste date precum titlu, descriere, link, data publicarii, etc. Iar fiecare element( feed) contine: titlu, descriere, id unic( GUID), descriere si data publicarii. Mai jos puteti sa gasiti un exemplu de fisier RSS versiunea 2.0 care contine un singur feed:
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>RSS Title</title>
<description>This is an example of an RSS feed</description>
<link>http://www.…

How to compare two generic dictionaries

Zilele acestea mi-a fost pusa urmatoarea intrebare:
Intr-un unit test care este cea mai buna modalitate de a compara doua colectii?
Daca va aduceti aminte, in urma cu cateva saptamani am discutat despre CollectionAssert. Aceasta contine o metoda denumita AreEquivalent, care verifica daca doua colectii sunt echivalente. Testul o sa treaca de acest assert daca:
numarul de elemente este egalcele doua colectii contin aceleasi elemente( indiferent de ordinea in care apar)Doua elemente din colectie sunt egale nu daca puncteaza spre acelasi element ci daca sunt egale prin continut( se apeleaza metoda Equals, pentru a face aceasta verificare). In cazul nostru, metoda AreEquivalent o sa itereze prin intreaga colectie de element KeyValuePair pe care un dictionar le contine.
Dictionary<string,string> collection1=new Dictionary<string, string>();
Dictionary<string, string> collection2 = new Dictionary<string, string>();
...
CollectionAssert.AreEquivalent(collection1,collection2);