Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg
Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Thursday, 18 October 2012

How to NOT expose a read only collection in C#

Posted on 01:01 by Unknown
These days I had the opportunity to make a review over an ecommerce application. They tried to use CQRS and they almost succeeded. 
I notified a problem on their queries classes that can become a big problem in time, if you want to sell this solution as a platform. Also, from some perspective, these problems also violate the CQRS principle.
Let’s see some code now:
public class Order
{
Collection<OrderItem> _items;

public IEnumerable<OrderItem> Items
{
get
{
return _items;
}
}
...
}
What do you see here strange?  We want to expose the OrderItem collection as a read only collection. To do this, we convert it to IEnumerable.
Hmmm… sounds good? Nope. Big mistake! Nobody stop us to convert the Items back to an ICollection and Add/Remove items from it.
Order order = new Order();
…
var orderItems = (Collection<OrderItem>)oder.Items;
What should we do? .NET framework has specials collections that can be used in these situations. I this case we should use IReadOnlyCollection<T>. This class will let the user to access items but he will not be able to modify the list (add or remove items from the collection).
To obtain the list as a read only collection we will need to use the AsReadOnly() method:
public class Order
{
Collection<OrderItem> _items;

public IReadOnlyCollection<OrderItem> Items
{
get
{
return _items. AsReadOnly();
}
}

...
}
Under the hood, this method will create a new collection that point to our original items.
When expose items as “read-only”, you should always double check. There are many methods that permit us to cast items.
Read More
Posted in C#, list | No comments

Tuesday, 2 October 2012

Mixing UI controllers in a Windows Store App (Metro App) for Windows 8

Posted on 01:15 by Unknown
More and more people (especially developer) are very excited about Windows 8 and the new features that come with him. As you already know we have free native languages that can be used to write Windows Store Applications (Metro Apps):
  • C++ using DirectX or XAML
  • C# using XAML
  • JavaScript using HTML5
Also we can use Visual Basic and XAML.
One interesting feature is the mixing components support. We can use components written in C# or C++ and use them in project written in JavaScript, C++ or C#. This is what WinMD and WinRT offer to us.
Because of this we can imagine a lot of scenarios developing a part of the application in C# and the UI part in JavaScript for example. Sounds great and this is possible and also recommended. We can develop great application in this way.
Also, WinRT API is not 100% available in any language. Even if JavaScript, C# and C++ are native languages and WinRT is native for all of them, there are things that can be done only from a specific language. For example if we want to write Windows events from our Windows Store App, this can be done only from C++. But this wills not a problem from us. We can very easily develop a component written in C++ that do this thing and use it from a JavaScript or C# project.
But what about mixing UI controllers and components. I can imagine a lot of scenarios where we could develop UI controller in C# and XAML and use it in JavaScript. Or to have a HTML and JavaScript component that can be used easily from XAML.
I will describe each scenario in part and see what is possible to accomplish.

UI controller written in HTML 5 and JavaScript for a C#/C++ and XAML application

Even if all the languages are native we will not be able to use the full power of a Page Control written in JavaScript from XAML. Even if we have a UI controller in XAML that can render HTML, this has some limitations. Because of this from this JavaScript files we will not able to call WinRT API and also to use the UI features that are supported in a HTML 5/CSS + JavaScript application for Windows Store.
Also, the output of a project written in JavaScript and HTML is not a WinMD component. It is a collection of files (HTML, JS and CSS). Because of this we cannot add a reference to a component written in JS - it doesn’t exist.

UI controller written in XAML and C#/C++ for a HTML 5/CSS and JavaScript application

Like in the previous case this is not possible in this moment. Even if we will have a WinMD component that contains our custom controller written in XAML and we will be able to add a reference to our HTML5/JS project to our WinMD component. The problem will be with the XAML UI libraries, that don’t exist in a HTML5/JS project. Even if the UI controllers written for HTML5 and XAML looks the same and have the same features, their implementation is not 100% the same. One need to be able to be rendered in a XAML and the other one will be displayed using Chakra and Trident. Because of this a HTML5/JS project will not contain the library that need is able to render the XAML controller.
Another problem is related to the tags. We don’t have a tag that can host and render an XAML component.

UI controller written in XAML and C++ for a XAML application written in C#

This is full supported and we will not have any kind of problems. Both projects type will generate a WinMD controller that can be reused without any kind of problems. Both of them use the same WinMD component to render the XAML.

UI controller written in XAML and C# for a C++ application written in C++ that uses DirectX support

Like the previous case this is full supported. An example that I like to use for this case is when we develop a game in C++ and use DirectX. For this case, the menu of the game can be written is XAML and C# because is more easily. Without any problem we will be able to overlap the XAML controller over our application.

As you can see we can have a lot of combination and a part of them all full supported. Before starting an application we should know exactly what UI components we would like to reuse and in what type of applications. The most important thing that we need to remember is: “We cannot use XAML controllers in a HTML5/JS project – in this moment”.
Read More
Posted in C#, javascript, Metro App, windows 8, windows store application | No comments

Wednesday, 29 August 2012

C# error at compile time challenge

Posted on 07:47 by Unknown
Problem:
I have a challenge for you. You will find at the end of thispost a link to a zip that contains a .NET 4.0 projects. The challenge is tomake this project to compile and give me the cause of the problem. I will letyou until Friday morning.
Good luck.
https://skydrive.live.com/redir?resid=BB7D9F52E4FDB024!259&authkey=!APfTPi6HWX0VJQg


Solution:
In the ‘class’ word from the Foo class we had an odd character for Unicode world. The character named is ‘Zero with space’. Is like a space between words but without a visible space (width). Because Visual Studio can process also Unicode files, we have no limitation to add Unicode characters that are not visible using a normal editor. If we open the file with Total Commander viewer for example we will be able to see the character (in hex view for example).
Nice job :-)

Read More
Posted in C# | No comments

Wednesday, 20 June 2012

Applications bugs that can be caused by 'ref' keyword

Posted on 16:10 by Unknown
Zilele acestea ma uitam peste un cod si am intalnit urmatoarea linie de cod:
Foo foo1 = new Foo();
...
Foo foo2 = foo1;
...
DoSomeAction(ref foo1)
{
...
foo1 = new Foo();
...
}
...
Pentru unele cazuri se ajungea ca in interiorul metodei DoSomeAction sa se creeze o noua instanta a obiectului Foo. Iar in unele cazuri aplicatia crapa intr-o alta locatie destul de urat. Nu o sa incep sa explic ce face keyword-ul ref si out.
Totusi am adaugat un citiat din MSDN ca sa pornim de la un punct comun.
The ref keyword causes an argument to be passed by reference, not by value. The effect of passing by reference is that any change to the parameter in the method is reflected in the underlying argument variable in the calling method. The value of a reference parameter is always the same as the value of the underlying argument variable. An argument that is passed to a ref parameter must be initialized before it is passed. This differs from out parameters, whose arguments do not have to be explicitly initialized before they are passed. For more information

Problema care apare in acest caz apare atat in cazul la ref cat si in out, dar in cazul la out. In momentul cand s-a facut atribuirea "foo2 = foo1", adresa de memorie spre care bate foo2 o sa fie aceiasi cu foo1. In interiorul metodei DoSomeAction ajungem sa cream un nou obiect de tip Foo, iar adresa de memorie spre care puncteaza foo1 se schimba cu o valoare noua. Dar foo2 o sa continue sa puncteze spre vechia adresa din memorie.
Din aceasta cauza foo2 ajunge sa puncteze spre vechia valoare, iar foo1 spre noua valoare.
Acest comportament este normal pentru ref si out, nu este nici o anomalie a limbajului. Intrebarea mea este urmatoare: Codul scris mai sus face ce ar trebui sa faca?
Raspunsul meu este ca NU. Daca vrem sa inlocuim un obiect cu alt obiect trebuie sa avem grija sa facem update la toate referintele acestuia sau poate nu e nevoie sa facem new la obiect si ajunge sa schimba doar cateva valori interne din obiect.
Read More
Posted in C# | No comments

Friday, 15 June 2012

Some cool stuff debugging with Debugger Canvas

Posted on 06:34 by Unknown
Continui seria de posturi (1, 2) despre cum sa facem debug in Visual Studio cu un post dedicat Debugger Canvas.
Cati dintre voi ati apucat sa o folositi intr-un mediu real? Mai mult ca sigur v-ati jucat cu ea, dar ati reusit sa o folositi mereu? Eu va spun sincer ca nu. Sunt cazuri cand poate sa fie foarte utila, dar in unele situatii, cand vrem sa facem un debug simplu e mult prea complexa.
Acesta este un tool free, care poate sa instalat in Visual Studio. Il puteti download din urmatoarea locatie http://download.microsoft.com/download/5/A/7/5A7FB2E7-5720-4739-BDDE-28A684C5B291/Microsoft.DebuggerCanvas.vsix si daca ma intrebati pe mine, este unul din tool-urile care nu poate sa lipseasca din Visual Studio.
Cand mi se pare extrem de utila? In momentul in care este nevoie sa facem debug intr-un mediu cu multe thread-uri care ruleaza simultan sau cand avem parte de recursivitate. In aceste cazuri este extrem de usor sa urmarim valorile  la fiecare field sau variabila din call stack.

Odata ce ati instalat aplicatia, aceasta o se seataza automat ca si default debug tool. Puteti oricand sa o dezactivati din "Debug->Debugger Canvas". Totodata aveti cateva optiune la acest tool pe care le puteti schimba din "Tools->Options - DEbugger->Debugger Canvas". Ajunge cu teorie, sa vedem in practic ce putem face.
Intr-o fereastra separat, tot callstack-ul vi se afiseaza sub forma unor ferestre inlantuite. Este extrem de usor sa vedem de unde vine apelul, putand naviga in orice moment prin call stack si sa vedem ce valori au variabilele.
O functionalitate extrem de utila este lista de variabile locale la care se poate face snapshot. Nu mai este nevoie sa notam noi vechile valori. Putem direct sa facem un snapshot si sa ne continuam procesul de debug. Pentru fiecare snapshot se afiseaza si locatia de unde s-a facut. In orice moment cu daca faceti click dreapta o sa vi se afiseze un meniu care va permite sa adaugati notite sau sa salvati sesiune de debug ca un XPS ori sa o trimiteti pe email. Partea de save/send va spun sincer nu am folosito niciodata, cel mai des cred ca folosesc snapshot-ul.

Este bine de mentionat ca in momentul in care folositi Debugger Canvas, toate scurtaturile sau optiunile care le aveati intr-un debug clasic raman available, tot ce se schimba este modul in care vizualizati resultatele.
Un alt feature extrem de util este cand aveti mai multe thread-uri pornite si vreti sa vedeti in paralel call stack-urile. In mod normal acestea se refolosesc, dar daca mergeti la options si dezactivati optiunea "Reuse Bubbles When Content is the Same" o sa vedeti pentru fiecare thread in parte un alt set de ferestre.
Odata ce ati terminat procesul de debug, fereastra o sa ramana deschisa, cu toate datele care s-au afisat. Acest lucru putand sa fie extrem de util.
Cam asta ar fi despre Debugger Canvas. Aduce cateva feature dragute, care ne pot ajuta si fac uneori diferenta. Ce parere aveti de acest tool? L-ati folosii?
Read More
Posted in C#, debug, visual studio | No comments

Wednesday, 13 June 2012

Could this be a good case when to use 'params'

Posted on 02:19 by Unknown
In urma cu cateva saptamani am discutat putin despre keyword-ul params si cautam locuri unde acesta ar putea sa fie folosit cu un scop clar, nu doar de dragul de a il folosi. Zilele acestea am gasit un caz unde acesta ar putea sa isi gaseasca locul.
Sa presupunem ca scriem o metoda care genereaza semnatura unei metode pe baza. Numarul de parametrii a unei metode poate sa fie variat de la 1 la n si chiar 0. Din aceasta cauza pentru a putea sa acoperim cele doua cazuri ar fi nevoie sa avem ca si parametru o colectie de parametri care sa accepte sa fie si null.
public string GetMethodSignature(string methodName, List<object> parameters = null)
Acuma apar usoare probleme pentru cel care ne foloseste metoda. Pentru fiecare apel cand are unul sau mai multi parametri o sa fie nevoit sa creeze o lista de elemente.
myObj.GetMethodSignature( "FooAction" , new [] { param1 });
In acest caz, o implementare folosind params ne simplifica putin atat apelul cat si modul in care procesam datele:
public string GetMethodSignature(string methodName, params object[] parameters)
...
myObj.GetMethodSignature( "FooAction" , param1 );
myObj.GetMethodSignature( "FooActionNoParam");
Pentru cazul cand nu avem nici un parametru este de ajuns sa apelam metoda ca si mai sus, iar colectia noastra nu o sa aibe nici un element.
Cum vi se pare acest caz? Credeti ca in acest caz este folositor "params"?
Read More
Posted in C# | No comments

Friday, 25 May 2012

Windows 8: Error on video playing

Posted on 00:27 by Unknown
Pentru aplicatiile Metro in Windows 8, adaugarea de video la un view se face destul de simplu, utilizand componente precum MediaPlayer .
<MediaPlayer x:Name="VideoMediaPlayer" AutoPlay="False" Loaded="VideoMediaPlayer_Loaded"/>
...
private void VideoMediaPlayer_Loaded(object sender, RoutedEventArgs e)
{
MediaPlayer player = (MediaPlayer)sender;
IRandomAccessStream videoStream = GetVideoStream();
player.SetSource(videoStream, "video/mp4");
}
Binding-ul la source se poate face in diferite moduri. Nu are importanta cum il faceti. In schimb pe versiunea curenta de Windows 8 ( Consumer Preview) aplicatia voastra o sa crape uneori cand userul face play/stop sau schimba pagina curenta.
Eroarea care se arunca are forme asemanatoare cu aceasta:
Windows.UI.Xaml.UnhandledExceptionEventArgs
Exception from HRESULT: 0xC00D3E85
Call to UIASendMessageTimeout failed
Nu incercati sa faceti FIX la aceasta problema in codul vostru. Problema este un bug pe care Windows 8 CP il are si care o sa fie fix-uit in urmatoarea versiune.
Tot din aceasta cauza uneori poate as apara e eroare de genul:
Error loading from server.
in bare unde se face play/pauze la un video.
Speram ca in urmatorul release aceste probleme se rezolva.
Read More
Posted in C#, windows 8 | No comments

Wednesday, 23 May 2012

Use lock in a block that contains a call to an async method (await keyword)

Posted on 23:47 by Unknown
Citeam urmatorul post http://qedcode.com/content/awaitable-critical-section, in care se explica o modalitate de a face lock in cazul in care in block-ul de lock contine un apel la o metoda async.
Pe scurt, pentru a evita ca doua sau mai multe thread-uri sa scrie simultan in acelasi fisier, se incerca sa se faca lock. Dar .NET 4.5 nu ne lasa sa avem urmatorul cod (si foarte bine face):
lock( this )
{
var f = await storageFile.OpenAsync();
...
await file.WriteAsync("some content");
}
Eroarea pe care o primim arata in felul urmator:
The 'await' operator cannot be used in the body of a lock statement.
In link-ul pe care l-am dat mai sus, s-a incercat implementarea unei solutii custom care face lock la o anumita portiune de cod. O alta varianta ar putea sa fie sa incerca sa folosim Task.Run. Cea ce am obtine ar fi ceva asemanator cu urmatorul cod
lock( this )
{
var f = await storageFile.OpenAsync();
...
Task.Run(async () => {await f.WriteAsync("some content") }).Wait();
}
Codul s-ar compila fara nici o problema dar la rulare am vedea ca aplicatia nu mai raspunde cand ajunge pe linia de cod care contine Task.Run. Din aceasta cauza se poate ajunge sa implementam ceva asemanator cu link-ul dat la inceputul postului.
Cea ce nu imi place la nici o solutie este ca combinatia dintre lock si async nu suna foarte bine. De ce ai vrea sa faci un lock si sa te asiguri ca doar un singur apel asyncron se executa. De foarte multe ori problema poate sa fie de design. Nu degeaba .NET nu iti permite aceasta funcționalitate.
Un await in interiorul unui lock poate sa genereze foarte usor un deadlock. Problema este destul de asemanatoare cu deadlock-ul care se obtinea cand apelam Monitor.Exit in interiorul unui ExisDisposable.Dispose.
Cand se face resume la cod in general ajungem pe acelasi thread, dar acest lucru nu e obligatoriu, din aceasta cauza putem sa ajungem pe un alt thread, care ar face unlock la un lock facut pe un alt thread.
Be aware, cand folositi await, nimeni nu va garanteaza ca la resume o sa ajungeti pe acelasi thread. Trebuie sa mai tinem cont de inca un lucru, o metoda la care facem await nu stim cat o dureze, iar un lock ar trebui sa fie facut pentru o perioada cat mai mica de timp. Pentru acest lucru putem sa facem lock pe codul pe care il executam inainte si dupa apelul la metoda await.
Codul pe care l-am obtine ar avea urmatoare forma:
var f = await storageFile.OpenAsync();
lock(this)
{
...
}
await f.WriteAsync("some content");
lock(this)
{
...
}
Da stiu, se doreste ca metoda WriteAsync sa fie executa intr-un lock. Dar acest lucru nu e sanatos. Daca vrem doar noi sa avem drept de scriere, atunci trebuie sa deschide fisierul in asa fel incat doar dintr-un singur loc sa se poata scrie. Pentru a putea face acest lucru este nevoie sa specificam ca parametru la metoda OpenAsync FileAccessMode.
var f = await storageFile.OpenAsync(File.AccessMode.ReadWriteNoCopyOnWrite);
sau (in functie de caz)
var f = await storageFile.OpenAsync(File.AccessMode.ReadWrite);
In concluzie, cand ajungeti la un caz cand aveti nevoie de a face lock pe un block de cod care contine apeluri de metode asincrone, ar fi bine sa faceti un review la cod si sa vedeti daca chiar aveti nevoie de asa ceva si daca nu este o greseala in design-ul aplicatiei.
Read More
Posted in async, C#, lock, sincronizare | No comments

DataContractSerializer and list of abstract class

Posted on 06:21 by Unknown
Plecam de la urmatoarea structura:
public abstract class BaseCar
{
public string Name { get; set; }
}
public class SportCar : BaseCar { }
public class UtilityCar : BaseCar { }
public Foo
{
public Foo()
{
Cars = new List<BaseCar>();
}
public List<BaseCar> Cars { get; set; }
}
...
Foo myFoo = new Foo();
myFoo.Cars.Add( new SportCar());
DataContractSerializer serializer = new DataContractSerializer(typeof(Foo));
serializer.WriteObject(myXmlWriter, myFoo);
Cand nu avem specificat nici un atribut de tip DataContract, toate campurile care sunt publice se serializeaza. In cazul nostru codul se compileaza fara probleme si obtinem un obiect serializat. Problema apare cand vrem sa deserializam obiectul nostru si ne trezim ca proprietatea Cars este null. Chiar daca in constructor inializam aceasta proprietate obtinem in continuare NULL.
Cand ne uitam peste cod realizam ca lucram cu o clasa abstracta, iar in acest caz avem nevoie de atributul KnownTypes pe care il si adaugam sub forma:
[KnownTypes(typeof(SportCar))]
[KnownTypes(typeof(UtilityCar))]
clasei Foo. Cand testam din nou aplicatia nici o schimbare. Daca problema ar fi fost de la KnownTypes, am fi obtinut o eroare specifica care ne spune ca nu se poate serializa/deserializa.
Totusi problema persista si ne horaram sa specificam explicit ce proprietati vrem sa serializam. Clasele noastre ajung sa aibe urmatoarea forma:
[DataContract]
public abstract class BaseCar
{
[DataMember]
public string Name { get; set; }
}
[DataContract]
public class SportCar : BaseCar { }
[DataContract]
public class UtilityCar : BaseCar { }
[KnownTypes(typeof(SportCar))]
[KnownTypes(typeof(UtilityCar))]
[DataContract]
public Foo
{
public Foo()
{
Cars = new List<BaseCar>();
}
[DataMember]
public List<BaseCar> Cars { get; set; }
}
Rulam din nu codul si observam ca acuma totul functioneaza fara nici o problema. Lista noastra de masini este serializata si deserializata fara nici o problema. Am incercat sa caut pe MSDN o locatie unde sa ni se precizeze ca trebuie explicit sa folosim aceste doua atribute cand avem lista de clase abstracte, dar din pacate nu am gasit. Am fost directionat de catre un coleg in urmatoarea locatie unde sunt enumerate regulile deja cunoscute, dar despre acest comportament nu era specificat nimica. http://msdn.microsoft.com/en-us/library/cc656732%28v=vs.100%29.aspx
Read More
Posted in C#, serialization | No comments

Sunday, 20 May 2012

The secret behind "params" keyword

Posted on 03:13 by Unknown
Jucandu-ma putin cu codul din C# am redescoperit "params". Acesta in general poate sa fie gasit intr-o aplicatie consola in Main, dar putem sa il folosim si in alte cazuri.
Prin intermediul acestui keyword putem sa specificam o lista de parametri despartiti prin virgula.
public void MyMethod(params string[] words)
{
foreach(string word in words)
{
Console.WriteLine(word);
}
}
Nu este nimic special cu acest keyword. Cand am inceput sa invatam limbajul C#, am vazut ca exista, dar nu l-am vazut niciodata folosit intr-un cod de productie si mi-am pus intrebarea DE CE?
In primul rand vrea sa vedem ce putem face cu acesta. De exemplu avem o metoda care accepta zero, unu sau mai multe elemente de acelasi tip (o lista de elemente). In mod normal am avea urmatorul cod:
public void MyMethod(string[] items)
{
// Some action.
}
Pentru a putea folosi aceasta metoda am avea urmatoarele apeluri:
MyMethod();    // Eroare la compilare.
MyMethod(new string[0]); // Nici un element in lista.
MyMethod(new string[]{ "item1" }); // Un singur element in vector.
MyMethod(new string[]{ "item1", item2" }); // Doua elemente in vector.
Ca sa putem avea si un apel de forma "MyMethod();" este nevoie sa schimba definitia metodei, ca sa aibe urmatoarea forma:
public void MyMethod(string[] items = null)
{
// Some action.
}
Daca ne-am folosii de keyword-ul params am avea urmatoare metoda si apeluri acceptate:
public void MyMethod(params string[] items)
{
// Some action.
}
MyMethod();
MyMethod("item1");
MyMethod("item1", "item2");
MyMethod(new string[0]);
MyMethod(new string[]{ "item1", item2" });
Dupa cum putem observa, putem sa avem diferite apeluri, putem sa specificam un sigur element, fara sa fim obligati sa ne definim un vector cu un singur element. La fel putem sa ne specificam nici un parametru, caz in care vectorul o sa fie un vector cu nici un element. In acez caz ne-am astepta ca vectorul sa fie null, dar acesta nu o sa fie null, nu o sa contina nici un element (aveti grija la acest comportament).
O alta utilizare interesanta a acestui keyword mi s-a parut in contructor. Da, in contructor, il putem folosi fara nici o problema si in constructori.
public class Foo
{
public Foo(paramas string[] items)
{
// Ceva cod
}
}
params este foarte util cand avem cazui cand elementele din vector pot sa contina 0 sau doar un element, iar aceste valori sunt obtinute din divese surse (nu le obtinem mereu sub forma unui vector).
Am vazut ce putem facem cu acest keyword, unele cazuri cand acesta se poate folosi sunt chiar interesante (nici un element specificat, un singur element fara sa ne declaram un vector sau in contructor). Problema apare ca din cauza ca nu este destul de des folosit in general cel care citeste codul o sa fie nevoit sa caude pe net sa vada ce reprezinta acest keyword sau de ce este folosit intr-un anumit fel. Tot din aceasta cauza s-ar putea sa nu fie folosit la potentialul sau maxim. Din cauza ca o metoda care foloseste params, poate sa fie apelata primind un vector, avem o oarecare compatibilitate cu varianta cand nu folosim keyword-ul params.
Prin folosirea acestui keyword, s-ar putea ca API pe care il expunem sa nu fie usor de inteles sau sa provoace o usoara dezorientare pentru dezvoltator, dar cred ca pot sa existe cazuri cand acesta sa ne simplice putin codul.
Pana acuma nu l-am folosit niciodata in productie, dar in viitor s-ar putea daca o sa gasesc cazuri cand chiar isi are rostul. In acelasi timp o sa am grija sa documentez codul destul de bine incat sa argumentez de ce l-am folosit si sa dau exemple de apeluri. Din cauza ca acest keyword nu este folosit si cunoscut in totalitate, poate sa provoace confuzie, iar acest lucru trebuie evitat.
Totusi parca exista un smell cand vrem sa introducem "params", aveti grija.

Voi l-ati folosit pana acuma? Credeti ca merita folosit?
Read More
Posted in C# | No comments

Friday, 18 May 2012

Custom button image of AppBar in a Windows 8 Metro application

Posted on 12:16 by Unknown
Intr-o aplicatie Metro pentru Windows 8, in partea de jos avem un app bar in care putem sa punem diferite comenzi. Este extrem de asemanator cu app bar-ul de pe pe Windows Phone 7. By default, framework-ul contine o lista de icoane pe care le putem folosi pentru aceste comenzi.
Pe langa aceste imagini, sunt cazuri cand dorim sa avem iconite custom, pe care noi le-am definit. Aceste imagini trebuie adaugate sub forma unor resurse png. (48px pe 48px). In general avem cel putin doua resurse, una cand butonul este selectat, iar cealalta pentru starea normala.
Urmatorul pas este sa ne definim un stil pentru a avea un efect pe buton cand acesta este apasat. Acesta se poate face ca in felul urmator:
   <Style x:Key="CustomMyCommandAppBarButtonStyle" TargetType="Button" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<StackPanel Height="70" Orientation="Vertical" Margin="{TemplateBinding Margin}">
<Image Source="/Assets/normalStateButton.png" x:Name="nonpressedImage"/>
<Image Source="/Assets/pressedStateButton.png"
Visibility="Collapsed" x:Name="pressedImage"/>
<TextBlock Text="{TemplateBinding AutomationProperties.Name}"
HorizontalAlignment="Center"
Margin="0,0,2,0"
FontSize="12"
TextAlignment="Center"
Width="88"
MaxHeight="32"
TextTrimming="WordEllipsis"
Style="{StaticResource BasicTextStyle}"/>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver" />
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="pressedImage" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" >
<DiscreteObjectKeyFrame.Value>Visible</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="nonpressedImage" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" >
<DiscreteObjectKeyFrame.Value>Collapsed</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Totul pare destul de simplu, dar va atrag atentia la un lucru, daca nu setati si visual state-ul pentru actiune de mouse over, chiar daca nu definim nici o actiune pentru acesta, dupa ce se apasa butonul, imaginea care o sa ramana afisata o sa fie tot cea care se afiseaza cand butonul este apasat.
<VisualState x:Name="MouseOver" />
Pentru acesta problema este nevoie sa adaugam si visual state-ul pentru mouse over. Lasandul fara nici o actiune custom, o sa fie folosita cea default. Prin acest mod, ii putem spune la buton sa revina la normal dupa ce se face click pe el.
Din cauza ca nu sunt un expert in XAML, mi-a trebuit ceva vreme pana sa imi dau seama care era problema. Sper sa nu patit si voi la fel.
Era sa uit, dupa ce va definiti acest style, tot ce mai este nevoie sa il aplicati stilul pe butonul vostru din AppBar.
Read More
Posted in C#, windows 8 | No comments

Wednesday, 16 May 2012

What are the base async patterns in .NET world

Posted on 06:51 by Unknown
In momentul de fata exista diferite paternuri care sunt folosite pentru apeluri asyncrone. Am observat ca destul de multa lume incurca aceste paternuri si se face un mix intre acestea.
Din cate am observat pana acuma exista 3 paternuri principale care sunt folosite in general in .NET (mai putin 4.5, despre care o sa vorbim separat).
EAP (Event based Asynchronous Pattern) - in acest patern orice schimbare de stare (actiune se termina de executat, apare o eroare, progresul) sunt notificate prin intermediul unor evenimente.
public class FooEAP
{
public void CalculateAsync(int value1, int value2)
{
int sum = value1 + value2;
OnCalculateComplete(sum);
}
public event CalculateCompleteEventHandler CalculateComplete;
private void OnCalculateComplete(int result)
{
if( CalculateComplete != null )
{
CalculateComplete(this, new FooCalculateEventArgs(result));
}
}
}
APM (Asynchronous Programming Model) - paternul este destul de usor de recunoscut prin formatul BeginXXX si EndXXX. In momentul in care un utilizator apeleaza BeginXXX, task-ul incepe sa se execute. Aceasta metoda o sa returneze o implementare a interfetei IAsyncResult care are urmatoarea forma:
public interface IAsyncResult
{
WaitHandle AsyncWaitHandle { get; }
Boolean IsCompleted { get; }
Object AsyncState { get; }
Boolean CompletedSynchronously { get; }
}
Aceasta interfata se poate folosii pentru a verifica in ce stare se afla actiunea noastra sau sa vedem progresul. Acest patern este destul de intalnit in WCF.
public class FooAPM
{
IAsyncResult calculateAsyncResult;
public IAsyncResult BeginCalculate(int value1, int value2)
{
...
}
public void EndInvoke()
{
// Wait the task to finish
}
}
TPL (Task Parallel Library) - se bazeaza pe task-uri care au fost introduse cu .NET 4.0. Nu reprezinta un patern in sine, dar din .NET 4.5 mai ales o sa fim nevoiti sa le folosim din ce in ce mai des. In general acestea se foloseste cand lucram cu API care se bazeaza pe task-uri. TPL simplifica foarte mult paternul asyncron. Folosind TPL ne este mult mai usor sa scriem si sa folosim cod asyncron.
public class FooTPL
{
public Task<int> Calculate(int value1, int value2)
{
return new Task<int>(() => { return value1 + value2; });
}
}
Task-urile sunt destul de complexe din puct de vedere a API-ului. Sunt extrem de usor de folosit, dar trebuie folosite cu cap deoarece pot sa faca mai mult rau decat bine.
Odata cu .NET 4.5 au aparut async si await, iar orice apel poate sa fie executat asyncron fara sa mai scrim nici o linie de cod. In spate ele se bazeaza pe task-uri si fac parte din TPL si vin in ajutor programatorului. Folosinf aceste doua chei ne este multi mai usor sa scriem si sa facem apeluri asyncrone. In general aceste metode sunt denumite sub forma XXXAsync.
public class FooTPL
{
public async Task<int> CalculateAsync(int value1, int value2)
{
int sum = await CalculateHelper.SumAsync(value1, value2);
return sum;
}
}
Despre cum functioneaza await, o sa revin intr-un post viitor.
Sper ca dupa citirea acestui post va este putin mai clar fiecare din aceste "paternuri". Toate fac acelasi lucru, doar ca in diferite moduri.
Read More
Posted in async, Asynchronous programming, asyncron, C# | No comments

Wednesday, 9 May 2012

Use LINQ to get items of specific type

Posted on 03:57 by Unknown
Ma uitam peste un cod scris de mine in urma cu cateva zile si am gasit urmatoarea linie de cod:
var fooCollection = items.Where( x => x is Foo).Select(x => x as Foo);
In cazul in care vrem sa extragem elementele dintr-o colectie care sunt de un anumit tip putem sa folosim metoda OfType. Aceasta metoda returneaza toate elementele din colectie de un anumit tip. Colectia pe care o returneaza o sa contina doar elemente de tipul specificat de catre noi.
Daca rescriu linia de mai sus o sa obtinem:
var fooCollection = items.OfType<Foo>();
Colectia returnata o as fie de tipul dupa care filtram datele. In exemplul dat de mine, rezultatul returnat o sa fie de tip IEnumerable. Astfel incat nu mai este nevoie sa facem nici un fel de conversie.
Mai jos gasiti un link pagina MSDN care descrie aceasta functie:
http://msdn.microsoft.com/en-us/library/bb360913%28v=vs.110%29.aspx
Read More
Posted in C#, linq, visual studio | No comments

Thursday, 3 May 2012

How to get a valid daylight saving time

Posted on 03:43 by Unknown
Foarte multi dezvoltatori s-au lovit de problema legate de datetime si offsetul timpului in functie de locatie.
Daca avem o data si vrem sa verificam daca pentru aceasta data daylight saving este activ sau nu putem sa verificam folosind metoda IsDaylighSavingTime.
TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Parse("01/04/2012"))
Aceasta metoda o sa ne returneze TRUE daca daylight saving este activ pentru data respectiva. Trebuei avut grija ca in functie de locatia de pe glob dayling saving poate sa inceapa sau sa se termine intr-o zi diferita.
Odata ce ne-am setat current culture pe cultura dorita am avea si daylight saving time setat pentru zona respectiva.
Thread.CurrentThread.CurrentCulture = myCulture;
Thread.CurrentThread.CurrentUICulture = myCulture;
TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Parse("01/04/2012"))
Dar o sa avem o surpriza neplacuta. TimeZoneInfo.Local o sa ne returneze timezone-ul local a masinii si nu cel pe care noi l-am setat prin intermediul culture-ului.
De ce se intampla acest lucru? Este destul de simplu, o cultura nu are o singur time-zone. Poate sa aibe 2,3 chiar si mai multe time-zone-uri.
Pentru a putea face verificarea este nevoie sa stim exact cu ce time-zone lucram si sa il setam explicit. O lista cu toate time-zone-urile se poate obtine prin metoda TimeZoneInfo.GetSystemTimeZones().
Read More
Posted in C#, date time, datetime | No comments

Friday, 27 April 2012

Directory.GetFiles - odd result

Posted on 01:23 by Unknown
Cei mai multi dintre noi am folosit Directory.GetFiles. Aceasta metoda statica ne permite sa obtinem lista de fisere dintr-un director dat. De exemplu pentru a obtine toate fisierele din directorul 'C:\Temp' care incep cu 'Test' este nevoie sa apelam metoda GetFiles in felul urmator:
var files = Directory.GetFiles("C:\Temp","Test*");
Exemplul acesta este la mintea cocosului. Dar sa vedem ce se intampa daca vrem toate fiserele cu extensia rar.
var files = Directory.GetFiles("C:\Temp","*.rar");
In cazul in care directorul contine urmatoarele fisiere:
1.rar
2.rar
3.exe
4.rar.tmp
5.rar1
Rezultatul returnat o sa contina urmatoarele fisiere:
1.rar
2.rar
4.rar.tmp
5.rar1
Se pare ca avem o problema, ce cauta ultimele 2 fisiere in rezultat. Ne-am astepta sa fi avut ca rezultat doar 1.rar si 2.rar. Din capate in modul in care am facut noi cautarea, o sa ni se returneze orice fisere care incepe cu regula de cautare pe care noi am folosito. Rezultatul este clar nu cel asteptat.
Cauza la acest comportament este urmatoarea: metoda GetFiles() apeleaza la randul ei API de Win32 (metoda FindNextFile). Iar din cauza ca Windows-ul are atat extensii scurte de 3 caractere cat si extensi lungi (8 caractere), rezultatul returnat este cel de mai sus.
O solutie la aceasta problema este sa verificam ca rezultatul returnat se termina cu extensia pe care noi am cautato.
var files = Directory.GetFiles("C:\Temp","*.rar")
.Where( x => x.EndsWIth("*.rar");
Read More
Posted in C#, Windows | No comments

Monday, 23 April 2012

DataContract and XMLIgnore attribute

Posted on 05:52 by Unknown
Intr-un post anterior am discutat despre cum putem sa serializam un IDictionary in format XML. In mod normal o clasa care nu este decorata cu atributul DataContract o sa poata fi serializata folosind DataContractSerializer fara nici o problema. In acest caz, toate proprietatiile si field-urile publice o sa fie serializate.
In specificatiile la DataContractSerializer, ne este specificat ca orice atribut folosit pentru serializare in format XML (XmlIgnore, XmlArray, Serializable etc.) sunt ignorate. Totusi cand obiectul de mai jos era serializat, atributul XmlIgnore este luat in considerare.
public Foo
{
public string Name
{
get;
set;
}
[XmlIgnore]
public string Value
{
get;
private set;
}
}
In prima faza cea ce se intampla este destul de ciudat. In mod normal acesta nu ar trebui sa fie ignorat, dar practic proprietatea este ignorata in totalitate.
In realitate DataContractSerializer functioneaza asa cum ne-am astepta. Dar daca ne uitam mai atenti la modul in care este definita proprietatea Value, putem sa observam ca set-ul este private. DataContractSerializer serializeaza toate proprietatiile publice, iar Value nu este public. Aceasta are doar get-erul public, iar set-erul este private. Cu sau fara atributul XmlIgnore, aceasta proprietate nu este serializata.
Enjoy!
Read More
Posted in C#, serializare, serialization, xml | No comments

Cannot serialize member ... because it implements IDictionary

Posted on 01:42 by Unknown
Cat de cunoscuta vi se pare urmatoarea eroare:
Cannot serialize member [FooMember]
... because it implements IDictionary.
Primul lucru pe care oamenii il spun cand intalnesc aceasta eroare este: "Pai logic ca crapa, un dictionar nu e serializabil". Da, intr-o oarecare masura enuntul de mai sus este adevarat, dar nu in totalitate.
Nu toate serializatoarele sunt capabile sa serializeze un IDictionary. Cele mai dese probleme de acest gen apare cand se lucreaza cu XmlSerializer. Trebuie tinut cont ca aceasta problema nu apare la serializare ci la deserializare. Deserializatorul nu stie cu ce obiecte lucreaza, nu gaseste nici o informatie despre tipul lor.
O solutie destul de simpla, care este la indemana oricui este sa folosim DataContractSerializer pentru a serializa/deserializa un dictionar. Schimbariile care trebuie facute pentru a trece de la XmlSerializer la DataContractSerializer sunt destul de putin.
Primul pas este sa marcam clasa pe care o dorim sa o serializam cu DataContract, iar toate elementele pe care dorim sa le serializam cu atributul DataMember. Acest pas nu este obligatoriu pentru .NET 3.5 SP1 +. Daca folositi .NET 3.5 SP1, .NET 4.0 sau .NET 4.5 acest pas este optional. By default tot ce e public se serializare. In cazul in care aveti propietati pe care nu vreti sa le serializati, este nevoie sa adaugati aceste atribute.
Urmatorul pas este sa folosim pentru serializare si deserializare DataContractSerializer, iar metodele Serializer si Deserialize o sa fie inlocuite cu WriteObject si ReadObject.
Mai jos puteti sa gasiti un exemplu de cod in C# 4.5 care poate sa fie folosit pe Windows 8 Metro Style App fara nici o problema:
// Serialize
using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
using (StreamWriter streamWriter = new StreamWriter(stream, _encoder.Current))
{
using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter))
{
serializer.WriteObject(xmlWriter, obj);
xmlWriter.Flush();
}
stream.Seek(0, SeekOrigin.Begin);
// TODO: save or manipulate streamWriter
}
}
// Deserialize
using (StringReader reader = new StringReader(_encoder.ToString(content)))
{
XmlReader xmlReader = XmlReader.Create(reader);
XmlSerializer serializer = GetSerializer(typeof (TEntity));

return (TEntity) serializer.Deserialize(xmlReader);
}
Daca am fi fost intr-o aplicatie non-metro style am fi putut lucra cu XmlTextWriter unde sa avem propietatea Formatting setata cu valoare Formating.Indented. In acest caz XML generat ar fi fost mult mai usor de citit de catre oameni. Dar putem sa traim fara nici o problema fara aceasta optiune.
Enjoy!
Read More
Posted in C#, error, serializare, serialization, windows 8 | No comments

Wednesday, 11 April 2012

URI in Windows 8 Metro Style App

Posted on 02:00 by Unknown
Intr-o aplicatie Windows 8 Metro App putem sa specificam printr-un URI locatia de unde sa incarcam continutul unui fisier. Folosirea path-urilor absolute nu este recomandata, deoarece in mod normal nu avem acces la orite path. De exemplu daca folosim un path de forma: "C:\Foo\content.txt" o sa ne trezim cu o eroare de genul "Access is denied".
Este foarte important de stiut ca o aplicatie de tip Metro App are access doar la un numar limitat de locatii. Nu o sa avem access la orice locatie de pe masina. Singura varianta pentru a accesa locatii la care nu avem acces este ca userul sa specifice locatie prin intermediul unui file picker.
URI are urmatoare forma: [scheme]://[numeDomeniu]/[path]
[scheme] poate sa aibe 3 valori predefinite:
  • ms-appx - care va indica locatia unde este pachetul aplicatiei (locatia de unde ruleaza aplicatia)
  • ms-appdata - care indica locatia unde se salveaza datele pe care le-am downloadat de pe internet
  • ms-resource - locatia care contine fisiere de resurse localizabile
Numele de domeniu poate sa fie ignorat, caz in care se va folosii domeniul curent.
In exemplul de mai jos incarcam logo-ul aplicatiei din directorul 'images'.
IAsyncOperation<StorageFile> storageFileAsyncOp = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///images/AppLogo.png""));

Enjoy!
Read More
Posted in C#, windows 8 | No comments

Monday, 9 April 2012

VS2011 BETA: Error : DEP3000 : Attempts to stop the application failed. This may cause the deployment to fail

Posted on 02:23 by Unknown
Scriam cateva teste pentru o aplicatie metro pe Windows8 cand m-am trezit cu urmatoarea eroare:
    Error : DEP3000 : Attempts to stop the application failed. This may cause the deployment to fail.
AppX packages may only be shutdown as part of a Visual Studio build operation.
Error : DEP1100 : Cannot delete file "Assets\Logo.png" from the layout.
Access to the path 'C:\..\bin\x86\Debug\AppX\Assets\Logo.png' is denied.
An internal error occurred while launching test executor for Windows Metro style app.
Tot ce trebuie sa faceti este sa stergeti directorul 'bin' din proiectul de teste si problema ar trebuie sa dispara.

Putin mai tarziu cand scriam testele m-am trezit cu urmatoarea eroare:

An internal error occured while launching test executor for Windows Metro style ap.
Din pacate aceasta eroare nu iti spune foarte multe si nu stii care poate sa fie cauza. Dupa ce m-am jucat putin cu proiectul am descoperit si problema. In proiectul de deste aveam referit un proiect de UI (Windows Metro style project).
Solutia a fost simpla, am eliminat proiectul referit. Dar as fi vrut sa adaug si teste pentru View Module. Acest lucru nu este posibil in acest moment, deoarece nu se pot face teste pentru proiectele de tipul Windows Metro style. In schimb puteti sa adaguti View Module-urile intr-un proiect separat de tip library.
Sistem de operare: Windows 8 Consumer Preview
VS: Visual Studio 2011 BETA

Spor.
Read More
Posted in C#, windows 8 | No comments

Wednesday, 28 March 2012

How to use C# library from JavaScript in Windows 8

Posted on 01:08 by Unknown
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 prezint cum putem sa scriem cod C# care sa fie folosit de JavaScript si ce probleme pot sa apara.
Odata ce am creeat proiectul .NET, putem sa ii schimbam output type-ul la "WinMD". In momentul cand facem acest lucru procesul de build o sa se schimbe putin. Pentru a crea assembly-ul o sa se folosesca un tool cu numele "Windows Metadata Explorer". Odata ce am facut acest pas o sa vedem o multime de warning-uri si erori din cauza ca clasele trebuie sa respecte cateva reguli.
O clasa pe care vrem sa o expunem pentru a putea sa fie consumata de JavaScript trebuie sa fie sealed. Clasele pe care nu dorim sa poata fi consumate de JavaScript trebuie sa aibe atributul [EnableComposition]. Destul de interesant mi se s-a parut ca in cazul in care avem o clasa goala, o sa avem parte de eroare, chiar daca e sealed.
In cazul in care lucrati cu liste (input paramas sau return value), sa nu uitati sa folositi interfete. De exemplu folositi IList si nu List. Partea buna este ca nu suntem obligati sa folosim un array. In cazul in care uitati de acest lucru o sa va treziti cu o eroare de genul:
Method Ex.Foo.GetAll()' has a parameter of type 'System.Collections.Generic.List' in its signature. Although this type is not a valid Windows Runtime type, it implements interfaces which are valid Windows Runtime types. Consider changing the method signature to instead use one of the following types: 'System.Collections.Generic.IList, System.Collections.Generic.IReadOnlyList, System.Collections.Generic.IEnumerable'.
Partea buna este ca mesajul ne da destule informatii despre care este problema si o solutie la aceasta problema. As vrea sa vad mai des erori care ne indica si solutii, nu doar sa urle ca nu e in regula.
Nu incercati sa va definiti interfete generice, clase generice sau metode generice. In acest moment acest lucru nu este suportat in acest moment. Poate din cauza ca notiunea de generic nu exista sau nu are acelasi sens in toata limbajele. Acelasi lucru se intampla si cu metodele declarate virtual. Nu putem sa avem metode virtual.

public sealed Foo
{
private IList<string> _items;
public IList<string> GetAll()
{
return _items;
}
public string DefaultItem { get; set; }
}
Apelurile pe care le putem face pot sa fie atat sincrone, dar si asincrone. In cazul in care vreti sa faceti apeluri asincrone puteti sa folositi Task<...>. Daca incercati sa faceti acest lucru o sa vedeti o eroare din cauza ca Task<...> nu este inclus in WinRT. O solutie la aceasta problema este ca in loc sa returnam Task<...> sa returnam un IAsyncOperation<...>.
Prin intermediul acestuia putem sa facem un apel asincron. Trebuie abut grija deoarece de la developer preview la consumer preview lucrurile s-au schimbat putin. Inainte era folosita metoda urmatoare pentru a crea un nou IAsyncOperation
AsyncFactory.Create(() => { ... } );
Daca incercam sa folosim AsyncFactory o sa ne trezim cu urmatorul mesaj de eroare:
The name 'AsyncFactory' does not exist in the current context
Dar o sa ne trezim ca nu mai putem sa gasim aceast factory. Pentru a putea returna un IAsyncFactory putem sa facem in felul urmator:
return Task.Run<string>( async () =>
{
return "someString";
}).AsAsyncOperation();
Mai jos puteti sa gasiti codul scris in C# si JavaScript pentru a putea apela cod C# din JavaScript. Nu uitati ca in proiectul care contine JavaScript sa adaugati o referinta la proiectul vostru.
C#
public sealed class Foo()
{
public IAsyncOperation<string> GetDefault()
{
return Task.Run<string>( async () =>
{
return "Default"
}).AsAsyncOperation();
}
}
JavaScript
var foo = new MyNamespace.Foo();
foo.GetDefault().then(
function(result)
{
// Do something with result
}
)
In mare am vazut cam ce se poate face. Mi se pare un feature destul de dragut, care in cazul aplicatiilor complexe o sa ne ajute extrem de mult.
Enjoy!
Read More
Posted in C#, javascript, windows 8, WinRT | No comments
Older Posts Home
Subscribe to: Posts (Atom)

Popular Posts

  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • NetCamp 2012 - Windows 8 development experience
    During this week I participate to NetCamp 2012.  This was the 6th NetCamp event and is organizing by Evensys. NetCamp is a dedicated event f...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Password/Token/PIN definition
    Password, Token, PIN, Passcode… every day we use this items when we need to authenticate in different systems. I observed that there are tim...
  • Shared Access Signature and URL encoding on Windows Azure
    Playing a little with Shared Access Signature was quite nice. In this moment this new functionality has a great potential. Playing a little ...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...
  • Content Types - Level 5: Courseware
    Level 5: Content and Courseware NOTE: This is part 6 of 7 in a continuing series; please see earlier posts for more background information. ...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ▼  2013 (139)
    • ▼  November (17)
      • Service Bus - Optimize consumers using prefetch an...
      • Extract relative Uri using MakeRelativeUri method
      • Sync Group - Let's talk about Performance
      • [PostEvent] Slides from MSSummit 2013, Bucharest
      • How to get the instance index of a web role or wor...
      • Sync Group - A good solution to synchronize SQL Da...
      • Throttling and Availability over Windows Azure Ser...
      • How to monitor clients that access your blob storage?
      • Digging through SignalR - Dependency Resolver
      • [Event] Global Day of Coderetreat in Cluj-Napoca! ...
      • Windows Azure Service Bus - What ports are used
      • Debugging in production
      • Simple load balancer for SQL Server Database
      • [PostEvent] MSSummit 2013, Bucharest
      • How to read response time when you run a performan...
      • VM and load balancer, direct server return, availa...
      • Bugs that cover each other
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ►  April (17)
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ►  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ►  February (20)
    • ►  January (15)
  • ►  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ►  March (14)
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile