Skip to main content

Posts

Showing posts from February, 2012

How NOT to use AS keyword

Mai mult ca sigur ati folosit pana acuma "as". Prin intermediul sau se poate face cast unui obiect la un tip dat, iar in cazul in care cast-ul nu se poate face, valoarea returnata este null.
BaseItem item = val as BaseItem; // returneaza null daca nu poate sa faca conversia
BaseItem item = (BaseItem) val; // arunca exceptie daca nu poate sa faca conversia
Despre "as" am mai discutat in acest post: http://vunvulearadu.blogspot.com/search/label/C%23%20AS%20Keyword%20Cast%20speed%20performance
Mai jos o sa va prezint un mod mai ciudat de a folosii keyword-ul "as". A fost folosit pentru a detecta daca un element este de un anumit. Iata cum a fost folosit:
BaseItem item;
...
if ( item as CarItem != null )
{
...
}
else if ( item as BookItem != null )
{
...
}
else if ( item as ClassItem != null )
{
...
}
Ce mi s-a parut interesant este cum a fost folosit "as". In locul sau se poate folosii fara probleme "is". Acesta o sa returneze true daca u…

Default value and TryParse

Ce vi se pare ciudat in urmatorul cod?
int value;
if(!int.TryParse(text.ToString(), out value))
{
value = 0;
}
In mod default, toate tipurile de numere de tip value type au valoarea default 0. Din aceasta cauza nu mai este nevoie sa setam value 0. Ajunge sa avem doar urmatorul cod:
int value;
int.TryParse(text.ToString(), out value);
In cazul in care vrem sa obtinem valoarea default pentru orice tip de data putem sa ne folosim de "default". Acest keyword returneaza null pentru toate tipurile referinta si 0 (zero) pentru value type. In cazul structuriilor acesta o sa returneze structura noastra, iar fiecare element din structura o sa fie inializat cu default value pentru acesta.
var value1 = default(int); // 0
var value2 = default(double); // 0
public struct Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
var value3 = default(Point); // X si Y o sa fie 0
var value 4 = default(MyCustomClass) // null

In cazul in care vrem c…

Field like events and polymorphic invocation

Ce vi se pare gresit in codul de mai jos:
public class Base
{
public virtual event EventHandler EventOne;
}
public class Derived : Base
{
public override event EventHandler EventOne;
public void DoAction()
{
...
EventOne(this, args);
}
}
In clasa de baza avem un eveniment la care se poate face override in orice clasa derivata. Desi la prima vedere totul pare sa fie in ordine daca ne uitam mai atent, putem sa observam o problema care poate sa apara din cauza la override.
EventOne o sa existe in doua locatii diferite, atat in clasa de baza cat si in clasa derivata. Din aceasta cauza o sa fie momente cand EventOne din clasa de baza nu o sa fie niciodata instantiat.
Din aceasta cauza, in cazul in care evenimentul este apelat din clasa de baza ne putem trezi cu un comportament ciudat, precum NullReferenceException sau sa se execute cod la aruncarea unui eveniment pe care noi nu ne-am astepta sa se execute.
Ce putem sa facem ca sa rezolvam aceasta problema?
Avem la indeman…

The string representation of a bool

Ce parere aveti de urmatorul cod:
var result = service.Call("True");
Totul pare destul de okay mai putin string-ul "True". O solutie ar putea sa fie sa il punem intr-o constanta, dar tot nu e destul de bine.
In cazul in care avem nevoie de reprezentarea sub forma unui string a unei valori boolean este nevoie sa folosim:
bool.TrueString
sau
bool.FalseString
Codul dat in exemplu mai sus ar arata in felul urmator:
var result = service.Call(bool.TrueString );
Enjoy!

WCF and Silverlight - How to add custom information to a message header

In acest post am discutat despre cum se pot pune informatii in header-ul unui mesaj care este trimis prin WCF. In cazul in care incercati sa folositi aceasta solutie pentru un client pe Silverlight, o sa observati ca desi serverul adauga proprietatiile in header-ul mesajului acestea nu ajung la client, chiar daca pe sarma sunt adaugate.
Din Silverlight nu avem acces la toate proprietatiile care sunt trimise in header. Avem acces doar la cateva proprietati. De exemplu una din propietati este StatusCode. Acesta are valoarea 200 daca apelul s-a terminat cu success.
Datele care le punem in header pentru un client Siverlight, trebuie sa fie puse ca un nou Header. Mai jos gasiti cum puteti adauga un nou header de pe server, iar clientul cum il poate accesa. Al doilea parametru pe care l-am setat cu empty string reprezinta namespace URI pentru header-ul nostru.
public class ServerTokenInspector : IDispatchMessageInspector
{
public void BeforeSendReply(ref Message reply, object correlati…

Windows Live - SkyDrive

Windows LIVE series:
IntroducereWeb AuthenticationLive ConnectBasic OperationsSkyDriveAstazi o sa vorbim despre cum putem accesa SkyDrive.
Pentru a putea avea acces la datele pe care un user le are pe SkyDrive este nevoie ca la logare sa setam scopul "wl.skydrive". Avand setat acest scope o sa putem accesa orice informatie pe care userul o are pe SkyDrive.
WL.init({ client_id: {idClient}, redirect_uri: {ourRedirectUrl} });
WL.login(
{ "scope": "wl.skydrive" },
function (response) {
if (response.status == "connected") {
alert("Utilizator conectat");
}
else {
alert("Autentificare esuata");
}
});
Dupa ce utilizatorul s-a logat tot ce ne-a mai ramas este sa apelam API-ul care il avem la dispozitie. Fiecare element care ne vine dupa o interogare o sa contina date precum tipul ementului( daca e folder sau fisier - ce tip de fisier), nume fisier, id, dimensiune etc. Aceste informatii sunt foarte asemanatoare cu cele pe car…

WCF - How to add custom information to a message header

De obicei intr-o aplicatie client-server folosim WCF pentru a putea comunica intre client si server. WCF este un framework destul de complex si desi este usor de integrat intr-o aplicatie, cand dorim sa facem ceva mai complex putem sa ne trezim pierduti intre tot felul de documentatii si carti despre WCF.
In acest post o sa prezint cum putem adauga in header-ul mesajului care se trimite la client un continut custom( date suplimentare).
O sa pornim de la urmatarea cerinta: fiecare mesaj care vine de la server trebuie sa vina insotit de un token unic a serverului.
O solutie la aceasta problema ar putea fi ca fiecare mesaj( contract) pe care il primim de la server sa fie incapsulat intr-o clasa de tip Response care contina tokenul nostru. Aceasta solutie este destul de buna, dar ce ne facem daca avem nevoie sa adaugam alte date pe langa token? O sa fie nevoie sa facem update imediat la clienti, servicile pe care le expunem prin WCF trebuie versionate si alte probleme de acest gen. Plus ca r…

Post Event - CodeCamp la Cluj-Napoca, 18 feb. 2012

Ieri in Cluj-Napoca a avut loc un eveniment Codecamp, unde au participat peste 50 de persoane. S-a discutat despre:
Access Control ServiceWindows Phone 7KinectLine of Bussines Application on SilverlightCat de curand o sa punem toate prezentariile pe codecamp.ro. Eu am tinut o prezentare despre Kinect, unde am vorbit despre partea hardware a acestuia cat si despre SDK oficial lansat de Microsoft. Mai jos puteti sa gasiti prezentarea mea.Kinect SDK preview View more PowerPoint from Radu Vunvulea
Cateva poze de la acest eveniment puteti sa gasiti pe contul meu de Facebook:
http://www.facebook.com/radu.vunvulea
Inregistrarea vocala o puteti gasi aici: http://www.livescribe.com/cgi-bin/WebObjects/LDApp.woa/wa/MLSOverviewPage?sid=V2bpHq7xsdtk ( multumim Razvan Burz)

Va asteptam pe toti si la alte evenimente IT din Cluj-Napoca.

Debug Silverlight application - breakpoint not hit

In cazul in care lucrati cu o aplicatie Silverlight si vreti sa faceti debug s-ar putea sa va treziti nici un brake point nu este atins. Cele mai comune cauze la aceasta probleme sunt:
proiectul web care contine XAP nu este setat sa permita debug si la Silverlight. Acest lucru se poate activa in felul urmator: click dreapta pe proiectul web care contine xap-ul. Sub tabul Web in zona de Debuggers, verificati sa fie selectat si Silverlightputeti incerca tot din Properties de pe proiectul web din tab-ul Silverlight Applications sa stergeti link-ul spre proiectul Silverlight si sa il adaugati din nou( in cazul in care nu aveti proiectul adaugat ca si link, checkboxul de la punctul precedent nu o sa fie vizibilverificati ca in browser rulati un url care contine http// si nu file//. Debugul spre linkuri spre local file system este dezactivatnu sunteti atasati la procesul care trebuie( aceasta este o problema a Visual Studio care nu se ataseaza la procesul care trebuie). Pentru a va atasa la …

DateTime.ToString() formats

Zilele astea m-am trezit cu niste probleme la o aplicatie la care am lucrat impreuna cu niste colegi. Formatul la ora nu era consistent in toata aplicatia. In unele locatii aparea sub forma 04:50, iar in alte locatii aparea sub forma 16:50.
Problema principala a fost ca s-a folosit formatarea fara a se cunoaste exact ce se afiseaza cand se foloseste HH sau hh.
Mai jos as vrea sa ne uitam la metoda ToString a unui DateTime. Aceasta primeste ca si parametru un string prin intermediul caruia se poate specifica modul de formatare a datei.
yyyy - o sa afiseze anul in formatul 2012MMMM - luna in litere( iulie, august, ...)MM - luna in cifre( 07, 08)dddd - ziua din saptamana in litere( luni, marti)ddd - ziua in litere dar prescurtadd - ziua curenta din luna( 20, 31, ...)H - ora in format 24, iar daca ora e mai mica ca 10 se va afisa o singura cifra, fara 0( 1, 2, 14)HH - ora in format 24, iar daca ora e mai mica ca 10 se va afisa un 0 la inceput( 01, 02, 14)h - ora in format AM/PM, iar daca ora…

Kinect SDK preview

Kinect este un dispozitiv periferic care permite utilizatorilor sa controleze un calculator sau o consola doar prin intermediul gesturiilor. Acesta a fost lansat impreuna cu XBOX 360 in 2010. In 1 februarie 2012 a fost lansata o versiunea finala a SDK-ului pentru PC. Acesta ne permite sa scriem aplicatie pentru PC care sa foloseasca senzorii de pe Kinect. Ce trebuie sublineat aici este ca acest SDK se poate folosi doar pentru aplicatii non-comerciale in cazul in care aveti un Kinect pentru XBOX si nu pentru PC.
Din punct de vedere hardware, acest device contine:
camera video de 640x480 folosita pentru capturarea imaginii camera cu infrarosu folosita pentru a calcula la ce distanta se afla obiectele un microfon pentru capturarea sunetuluiCamera cu infrarosu este cea care diferentiaza acest device de orice alt device de pe piata. Aceasa ne permite sa putem stii cu precizie la ce distanta se afla fiecare obiect. SDK-ul care este disponibil in acest moment nu ne permite doar sa ca…

MVC - What a view should never contain( part 2)

Part 1
Ieri am promis ca revin cu un post despre ce nu ar trebuii sa contina un view.
Pornim de la o clasa PersonModel care are urmatoarea definitie:
public class PersonModel
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
Pentru acest model avem urmatorul view:
@model PersonModel

@{
Layout = null;
}

<!DOCTYPE html>

<html>
<head>
<title>Person</title>
</head>
<body>
<fieldset>
<legend>PersonModel</legend>

<div class="display-label">Name</div>
<div class="display-field">
@Html.DisplayFor(model => model.Name)
</div>

<div class="display-label">Age</div>
<div class="display-field">
@Html.DisplayFor(model => model.Age)
</div>

<div class="display-label">Address</div>
<div cl…

MVC - What a view should never contain( part 1)

Part 2
Suntem intr-o aplicatie MVC. Un model poate sa fie folosit de 1 sau mai multe viewuri.
Intrebarea de unde a pornit totul este Ce ar trebuii sa contina un view?
Daca ne luam dupa carte: Un View trebuie sa contina codul prin intermediul caruia se genereaza interfara grafica asteptata. Viewul se ocupa cu partea de render la date pentru a afisa modelul corespunzator.
In acest caz ce este un Model? Raspunsul scurt si sec pe care il primesc mereu este: o clasa care contine datele ce trebuie afisate in view.
Citisem anul trecut ca un model poate sa fie reprezentat de un web service, de un repository sau de catre un alt bussines layer. Aceasta afirmatie este falsa. Da sursa datelor poate sa fie un web-service, un repository sau un bussines layer, dar datele care o sa fie afisate tot ca o colectie de la 1 la n de de obiecte pe care le primim. Indifierent ca este o colectie de stringuri, o clasa, sau un singur string. Aceste date pot sa fie modelate ca si o clasa.
Daca ne intoarcem la prima af…

Interop - release COM objects( Excel.EXE hanging)

Pentru mine "interopul" a fost mereu o provocare. Nu neaparat modul prin care se pot face apelurile ci modul in care se face dispose la acestea si eliberarea resurselor.
O sa ma duc pe un exemplu concret - interopul cu Excel. Cand lucram cu acesta viata noastra poate sa devina un iad daca nu eliberam resursele corespunzator. Daca avem un serviciu windows care proceseaza fisiere Excel, foarte usor ne putem trezii ca avem 100 de procese EXCEL.EXE ramase agatate in sistem cu care nu stim ce sa facem. Dar asta nu e tot, fisierele raman agate pe disk pana cand cineva omoara procesul.
Sa incepem cu inceputul. Pentru a putea accesa un fisier Excel folosind Microsoft Office, avem un cod asemanator cu acesta:
Application application = new Application()
{
Visible = false,
UserControl = true,
};
Workbook workbook = Application.Workbooks.Open(fileName, 0, false, 5, "", "", true, XlPlatform.xlWindows, "\t",true,false, 0, true, 1, 0);
Workshee…

Intâlnire CodeCamp la Cluj-Napoca - 18 feb. 2012

http://codecamp-cluj-2012.eventbrite.co.uk/
Si iată ca am pregătit încă un eveniment pentru dezvoltatorii din Cluj-Napoca. Va așteptam pe toți in 18 februatie, de la ora 9:50 pe Calea Dorobanţilor, Nr. 18-20, etaj 7( sediul Yonder).Participarea la eveniment este gratuita. Mulțumim în special sponsoriilor pentru sustinere.Agenda 9:50-10:00 Sosirea participanților
10:00-11:00 O introducere in Access Control Service Mihai Nadăș Un nou mod de a implementa scenarii hibride de autentificare folosind Windows Azure, Facebook, Twitter sau Active Directory. 11:00-12:00 Introducere in Windows Phone 7 Paul Țirban O introducere in lumea WP7. Incepand de la API si tooluri pentru dezvoltare, pana la markerplace.12:00-12:30 Pauza de masa Delicious Lunch (courtesy of our sponsors) 12:30-13:30 Discover the power of Kinect Radu Vunvulea Discover the power of Kinect as the hardware device equipped with a very simple and powerful SDK. Face recognition or object tracking can be made with the based API without headache…

How to change Windows wallpaper from .NET

Din core-ul de .NET, nu avem nici o posibilitate sa schimbam imaginea de fundal a sistemului de operare sau sa schimbam modul in care se afiseaza - in mod direct. Ca sa putem face acest lucru, putem sa schimbam valorile din registri care stocheaza modul in care se afiseaza imaginea de fundal. Iar imaginea de fundal se schimba apeland direct API sistemului de operare.
Sub directorul userului curent, in path-ul "ControlPanel\Desktop" o sa gasim cheile necesare pentru a seta modul in care se afiseaza imagina de fundal.
Cheia WallpaperStyle impreuna cu TileWallpaper ne permite sa setam felul in care se centreaza imaginea. Urmatarele combinatii de valori se pot face:
(WallpaperStyle = 2, TileWallpaper = 0) - se face stretch la imagine ca sa acopere tot spatil ecranului(WallpaperStyle = 0, TileWallpaper = 1) - se face tile pe imagine pana cand ecranul este umplut(WallpaperStyle = 0, TileWallpaper = 0) - imaginea se afiseaza centratAceste valori se pot seta in felul urmator
publ…

How to display simple math formulas using .NET

Cum sa formatam un text astfel incat sa avem ceva de genul:
By default, acest lucru se poate folosind Unicode. Trebuie sa avem doar rabdare sa formatam textul. De exemplu pentru a scris (x+1)^2 este nevoie de urmatorul artificiu:
String.Format("(x+1){0,-3}",'\u00B2');
Pentru a scrix (x+1)^3 este nevoie sa scriem urmatoarea linie de cod:
String.Format("(x+1){0,-3}",'\u00B3');
Teoretic, cu destula imaginatie putem sa afisam orice formula matematica, dar pentru acest lucru exista nenumarate tool-uri care ne pot ajuta. La formule complexe pot sa apara probleme de afisare in functie platforma, versiune etc.
Pentru lucruri simple merita merita sa folosim formatarea, deoarece textul afisat de catre noi o sa arate mult mai bine.
Lista tuturor caracterelor Unicode o puteti gasii aici: http://www.tamasoft.co.jp/en/general-info/unicode.html

Short brief - Request-Response, Asynchron and Fire and Forget patterns

Un apel spre un serviciu poate sa fie facut in diferite moduri. Cele mai uzuale moduri sunt cele care respecta paternul Request-Response si Asynchron. Pe langa aceste doua paternuri mai exista inca unul, dar care este mai rar folosit Fire and Forget.
Request-Response pattern- se refera la faptul ca pentru fiecare request facut se asteapta raspunsul.
Response response = service.CallService(request)
Asynchron pattern - este un patern bazat pe evenimente. Odata ce un apel a fost facut, aplicatia nu asteapta raspunsul de la server. Cel care face apelul trebuie sa se inregistreze la un eveniment care o sa fie declansat cand raspunsul soseste.
service.ResponseEvent += new EventHandler(ResponseReceived);
service.CallServiceAsync(request);
Fire and Forget pattern - este destul de asemanator cu paternul Asynchron, doar ca odata comanda trimisa nu ne mai intereseaza ce se intampla cu aceasta.
service.CalService(request); // Metoda nu returneaza nimica
Exista diferite scenarii cand Fire and Forget es…

Windows Live - Basic operations

Windows LIVE series:
IntroducereWeb AuthenticationLive ConnectBasic OperationsSkyDriveAstazi o sa incepem sa vorbim despre serviciile de tip CORE care exista pe Windows Live Connect. Nu imi este foarte clar daca sa ofer exemplele in C# sau in JavaScript. Cred ca ar fi mai interesant sa prezint exemplele in JavaScript si din cand in cand o sa prezint si exemple in C#. In .NET avem o librărie, este destul de simplu, iar modul în care totul funcționează este destul de ascuns.
Înainte sa începem trebuie știut ceva foarte importat. Cand un utilizator nou accesează aplicația noastră pentru prima data, iar noi dorim sa accesam anumite servicii ca și cum am fi utilizatorul respectiv, acesta o sa trebuiască sa ne de-a dreptul ca putem sa accesam aceasta informație. In general apare un pop-up, asemănător cu cel de logare, unde userul își da acordul ca aplicația noastră sa acceseze o colecție de servicii în numele sau. In funcție de modul în care facem request-ul acest drept poate sa aibe o durata…

CRUD operation on Windows Task from .NET

Zilele trecute am gasit o librarie simpla si foarte usor de folosit pentru a crea task-uri sub Windows. Aceasta poarta numele de Task Scheduler Managed Wrappe si o puteti gasi la urmatoarea adresa: http://taskscheduler.codeplex.com/
Primul lucru care mi-a atras atentia a fost cat de usor se poate integra intr-o aplicatia deja existenta.
Clasa de baza, in jurul careia se invarte totul este TaskService, prin intermediul caruia putem sa inregistram task-uri noi sau sa le manipulam pe cele deja existente. Fiecare task se identifica unic printr-un nume. Pe baza acestui nume putem sa obtinem un task deja existent.
La fiecare task putem sa inregistram una sau mai multe actiuni care sa se execute. Actiunile pot sa fie de orice fel, incepand de la trimiterea unui email sau rularea unui executabil pana la afisarea unui mesaj la utilizator.
Acelasi lucru se intampla si cu trigerurile, toate cele existente pe Windows exista si in aceasta librarie:
EventTriggerDailyTriggerWeeklyTriggerMonthlyTriggerIdl…

Dictionary - custom key type

In ultimele 2 saptamani am luat la puricat .NET Collections si m-am gandit ca merita sa vorbim astazi putin despre cheile unui dictionar( Dictionary) - map.
In general lucram cu chei care sunt de tip value type.
Dictionary<int, Door> map = new Dictionary<int, Door>(); map.Add(1,door1); map.Add(2,door2); ... var door1 = map[1]; In acest caz, cheia o sa fie gasita fara nici o problema. Dar ce se intampla cand cheia noastra este reprezentata de un tip declarat de noi?
Dictionary<DoorKey,Door> map = new Dictionary<DoorKey, Door>(); map.Add(doorKey1, door1); map.Add(doorKey2, door2); .... var door1 = map[copyOfDoorKey1]; In momentul cand o sa dorim sa facem retrive la element pe baza de cheie, o sa observam ca elementul nu este gasit( o eroare de tip KeyNotFoundException o sa fie aruncata). In debug daca ne uitam la ce elemente contine dictionarul, o sa observam ca avem doua elemente cu cheiule pe care le-am astepta, dar totusi nu putem sa facem retrive la date.
Fieca…