Skip to main content

Posts

Showing posts from May, 2012

Windows 8: Error on video playing

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 for tables and viruses

Ieri seara am participant la un eveniment unde s-a prezentat si Windows 8. De data asta eram pe partea cealalta a baricadei (ca si participant), dar am vazut ca lumea spune destul de des: Abia astept sa apara virusi pentru Windows 8. Din acest punct de vedere, pentru versiunea normala de Windows 8 mai mult ca sigur o sa existe (din pacate), nu avem ce face. Dar pentru Windows 8 RT, versiunea care este destinata tabletelor, s-ar putea sa nu avem surprize nefericite. In primul rand fiecare aplicatie ruleaza intr-un sandbox si nu poate sa faca foarte multe schimbari. Fiecare aplicatie inainte sa ajunga in store este supusa la niste teste, unde se testeaza cat de sigura este pentru utilizator. Daca aceste verificari o sa se faca cum trebuie s-ar putea sa nu avem probleme cu aplicatiile. De exemplu pentru Windows Phone 7 nu am auzit de nici o problema de acest gen. Deja, foarte multe compani care creaza antivirusi pentru Windows, isi pregatesc si ultimele versiuni de soft pentru Window

Metro UI and Windows Metro Style Application is not the same thing

Am inceput sa vad o greseala care se face destul de des. Lumea a inceput sa incurce Metro UI cu Windows Metro Application. Acestea sunt doua lucruri total diferite. Metro UI este un set de reguli care definesc modul in care interfata grafica a unei aplicatii arata. Acesta are la baza stilul "Swiss" care a fost dezvoltat in Elvetia la inceputul anilor 1950. Stilul Swiss a fost dezvoltat pentru ziare si reviste. Pe baza acestuia a fost definit Metro UI care a aparut odata cu Windows Phone, iar acuma urmeaza sa fie folosit si pe Windows 8. Este bine de stiut ca acest style poate sa fie facut pentru orice fel de aplicatie si in orice limbaj (Windows Forms, WPF, SL, HTML and so on). Exista un set de reguli pentru stilul Metro, iar Microsoft a definit reguli clare si precise pentru a exista o fluiditate intre aplicatii. Windows Metro Application sau Windows Metro Style Application este tip de aplicatie care o sa ruleze pe Windows 8. Aceste tip de aplicatii trebuie sa fie scrise i

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

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.Writ

DataContractSerializer and list of abstract class

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 ad

The secret behind "params" keyword

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

Code Retreat Cluj-Napoca - 19/05/2012

Sambata, 19.05.2012, a avut loc in Cluj-Napoca o nou sesiune de Code Retreat.Au fost aproape 9 ore de programare si fun, unde am avut parte din plin de TDD si pair programming. Problema care am incercato sa o rezolvam de fiecare data a fost cea clasica, Game of Life (a lui Conway's). O problema simpla, care in varianta clasica nu pune nici un fel de probleme. Desii acesta a fost al doilea Code Retreat organizat, unde s-a rezolvat aceiasi problema, nu am simtit ca este ceva monoton. La fiecare runda am descoperit ceva nou, ceva care partenerul il facea diferit, de la TDD, la scurtaturi sau ceva legat de mediul de programare. Cand incepi sa scrii teste, cel mai greu sa primul test, nu stii cum sa incepi sau mai bine zis cu ce. Care e primul test care trebui scris, a.i. sa fie consistent si nici sa nu te aberezi. Asa cum se obisnuieste, ultima sesiune e destul mai speaciala, apar reguli mai ciudate. De data asta am ales ca sa fim intr-un mediu in care fiecare celula sa fie hexagona

InitializeComponent CLR error in Windows 8 Metro application

Daca incercati sa scrieti o aplicatie Metro pentru Windows 8 mai mult ca sigur o sa folositi convertoare la binding. Acestea, in general se definesc in App.xaml in zona de resurse sub forma urmatoare: <Converters:MyConverter x:Key="myConverter"/> In pagina voastra o sa puteti sa folosti convertorul pe care l-ati definit in felul urmator: <Button x:Uid="myButon" Visibility="{Binding IsOpen, Converter={StaticResource BoolToVisibilityConverter}}" Click="OnClick"/> La compilare nu o sa apara nici o eroare, dar la rulare o sa aveti o surpriza extrem de neplacuta. Pe metoda "InitializeComponent();" aplicatia o sa crape cu o eroare extrem de urata. Continutul erori nu o sa va zica prea mult despre cauza acesteia. Aceasta problema apare pe Windows 8 RC impreuna cu VS2011 BETA. Solutia pe care am gasito la aceasta problema este sa adaugam definitia convertorului in fiecare pagina unde avem nevoie de acesta. <Page.Resources>

Custom button image of AppBar in a Windows 8 Metro application

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"> <

Get current position in Metro app on Windows 8 freeze

Ati incercat pana acuma sa obtineti locatia GPS curenta intr-o aplicatie Metro pentru Windows 8? Daca nu, trebuie sa stiti ca nu e deloc complicat, este chiar la mintea cocosului API-ul. Geoposition currentPosition = await new Geolocator().GetGeopositionAsync(); Toate informatiile necesare o sa le puteti gasi intr-un obiect de tip Geoposition. Intr-o aplicatie simpla totul o sa mearga fara nici o problema. Apoi o sa ajungeti sa creati un provider de genul GPSProvider. Fiind o metoda asincrona, aceasta metoda o sa fie apelata cu await, iar codul vostru o sa arate in felul urmator: public class GPSProvider { public async Task<Geoposition> GetCurrentPositionAsync() { // some code. return async _geoLocator.GetPositionAsync(); } } In unele cazuri, cand o sa rulati codul pe un alt thread decat cel principal o sa va treziti ca locatia GPS nu poate sa fie rezolvata, codul ingheata la metoda GetPositionAsync(). Cauza pentru care se intampla acest lucru este ca codul nu ru

Azure - How to add custom settings to a Windows Azure project

In acest post o sa vedem cum se pot adauga configurari custom in cadrul proiectului Windows Azure, iar apoi sa le putem accesa din cod. O parte din configurariile unei aplicatii se tin de obicei in fisierul de configurare (app.config sau web.config - de la caz la caz). Insa, cand lucram la un proiect care o sa ajunga in Windows Azure putem sa facem aceste configuratii si in alta locatie. De exemplu putem ca aceste configuratii sa le tinem in proiectul de deploy pentru cloud. In felul acesta, putem sa avem mai multe configuratii pentru mai multe environment si/sau chiar sa avem configuratii diferite pentru local si cloud fara sa ne definim un mecanism special pentru acest caz. Primul pas care trebuie facut este sa deschim fisierul ServiceDefinition.csdef din proiectul de deploy pentru Windows Azure. In cadrul acestuia sub nodul WebRole sau WorkerRole (depinde unde aveti nevoie) este nevoie sa adaugam un nod denumit ConfigurationSettings. In acesta este nevoie sa ne definim lista de conf

What are the base async patterns in .NET world

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 format

What does Task.Result really do

Cu .NET 4.5 din ce in ce mai multa lume a inceput sa foloseasca apeluri asyncrone si implictit clasa Task. In exemplul de mai jos se apeleaza un task, iar apoi se face retrive la rezulvat: Task<string> myTask = new Task<string>( () => { ... } ); myTask.Start(); myTask.Wait(); var result = myTask.Result(); In primul rand daca avem Start, iar pe linia urmatoare avem un apel la metoda Wait, metoda Start nu mai are rost sa fie apelata. By default, cand metoda Wait este apelata, un task care inca nu este inca pornit o sa fie pornit automat de catre sistem. In cazul in care vrem sa obtinem rezultatul, iar intre apelul de Start/Wait si Result nu avem un alt cod de executa, atunci putem sa apelam automat Result. Aceasta metoda o sa faca start automat la task si va astepta pana cand acesta se va termina si va returna rezultatul. Codul de mai sus poate sa fie rescris in forma urmatoare: Task<string> myTask = new Task<string>( () => { ... } ); var result = myTask.Res

Performance Counter Setup on Windows Azure

Cand avem o aplicatie in cloud avem nevoie de a monitoriza diferiti parametrii. Acest lucru il facem asa cum il facem si pe un server normal folosindune de performance counter. Intrebarea ar putea sa fie usor diferita: Ce facem cu aceste valori odata ce le avem? Daca intram remote pe masina, puten sa ne folosim perfmon.exe pentru a monitoriza toti acest parametrii. Dar daca vrem mai mult de atata, daca vrem ca aceste valori sa le putem accesa remote sau sa le persistam in Azure Storage. In ajutor ne-a venit in ajutor Microsoft si ne-a oferit DiagnosticMonitor pentru Azure. Acesta poate sa fie configurat destul de usor in momentul in care aplicatia porneste si ne va permite sa scriem orice valoare in Azure Tables. In exemplul de mai jos o sa prezint cum se configureaza pentru a putea vedea load-ul la procesor: var config = DiagnosticMonitor.GetDefaultInitialConfiguration(); config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(30); config.PerformanceCounters.DataSour

How to change version of our solution assemblies

Am vazut cateva persoane care au ajuns pe blog cautand cum se face versionarea unui assembly. O sa prezint cea mai simpla metoda pentru a putea face versionarea unui proiect. By default, versiunea unui proiect din solutia noastra poate sa fie gasita in fisierul AssemblyInfo.cs, care se gaseste in Properties. Daca vrem sa schimbam versiunea unui assembly, trebuie sa facem update la atributele AssemblyVersion si AssemblyFileVersion. [assembly: AssemblyVersion("1.2.3.4")] [assembly: AssemblyFileVersion("1.2.3.4")] Sunt insa momente cand vrem sa controlam versiunea la toate assembly-urile generate de catre solutia noastra. Pentru a putea face schimbarea versiunii dintr-un singur loc, fara sa facem update la fiecare proiect in parte, putem sa extragem aceste doua atribute intr-un fisier separat. Acesta ar avea urmatoarea forma: using System.Reflection; [assembly: AssemblyVersion("1.2.3.4")] [assembly: AssemblyFileVersion("1.2.3.4")] Numele la ace

Use LINQ to get items of specific type

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

IT Camp 2012 - Cluj Napoca, 28,29 mai

CodeCamp È™i ITSpark organizează Conferinta IT Camp în perioada 28-29 mai la Grand Hotel Napoca din Cluj -Napoca, adresată profesioniÈ™tilor implicaÈ›i în implementări de tehnologie Microsoft È™i managerilor cu rol decizional, ce doresc să fie la curent cu ultimele tehnologii din domeniul IT, să-È™i îmbogățească cunoÈ™tinÈ›ele tehnice È™i care urmăresc participarea la training-uri cu adevărat eficiente, bazate pe tehnologiile disponibile astăzi.  Suntem foarte bucuroÈ™i să anunțăm ediÈ›ia a doua a conferinÈ›ei IT Camp , mai bogată È™i diversificată în conÈ›inut, È™i cu o prezență din ce în ce mai numeroasă. Suntem convinÈ™i că ediÈ›ia din 2012 este un pas hotărât înainte pentru ca IT Camp să devină o conferinÈ›a de referință în regiunea Europa Centrală È™i de Est pentru specialiÈ™tii care lucrează cu tehnologii Microsoft. Organizatorii au pregătit două zile în care dezvoltatorii, profesioniÈ™tii IT È™i arhiecÈ›ii pot beneficia de  peste 30 de sesiuni tehnice si open panel, prezentate de peste 30 de speake

How to deploy and debug remote on a Windows 8 tablet using Visual Studio

Si iata ca am ajuns in momentul in care putem sa testam aplicatii Metro pentru Windows 8 direct de pe tablete. Daca ati dezvoltat aplicatii pentru Windows Phone 7 pana acuma si ati facut deploy si debug pe device, trebuie sa stiti ca acest proces este destul de asemanator. Cea ce s-a schimbat este modul in care conectati device-ul la calculator. Daca telefonul se conecta prin intermediul unui cablu, iar pe masina era "have to" sa aveti instalat Zune, pentru a face deploy si debug la o aplicatie pe o tableta cu Windows 8, tot ce aveti nevoie pe langa device este ca acesta sa fie conectat la retea. Tableta poate sa fie conectata la retea atat prin WiFi, cat si prin cablu de retea (depinde de ce model aveti). Pentru a putea face deploy la aplicatie este nevoie ca sa instalati pe tableta Visual Studio 2011. Odata ce ati facut acest lucru in START o sa puteti gasi Remote Debugging Monitor (executabilul se numeste msvsmon.exe). Acesta trebuie pornit pe tableta si lasat sa ruleze.

Windows Azure Instance - Remote Access Problems

La orice instanta din Windows Azure, un user se poate conecta remote ca si pe orice alta masina. Acesta are acces la orice fel de resurse din sistemul de operate incepand de la task manager la event logs sau la Windows Services. Pentru a ne putea conecta remote la instanta unui rol este nevoie ca de portalul Windows Azure sa selectam instanta la care vrem sa ne conectam, iar apoi din meniul de sus sa apasam butonul "Connect". Browser-ul o sa faca download la un fisier cu extensia .rdp, care se foloseste pentru conextiune remote. Odata rulat acest fisier, totul o sa decurga normal, o sa fie nevoie sa introduceti credentialele si gata, sunteti conectat remote in Cloud. Pana aici nu o sa aveti nici o problema, totul o sa mearga ca uns. Insa in unele cazuri o sa va treziti ca instanta pe care o aveti nu poate sa fie gasita, orice ati face. Cand incercati sa dati conect, aplicatia sta cateva secunde iar apoi primiti o eroare de genul: The specified user name does not exist. Verif

Visual Studio 2011 BETA - XAML error report problems

In cazul in care lucrati cu Visual Studio 2011 BETA si sa trezici ca build-ul va crapa, desi nici o eroare nu se afiseaza, una din cauze poate sa fie XAML gresit. In unele cazuri, VS nu ne raporteaza ca XAML este gresit si doar in momentul in care MSBUILD ruleaza apare eroarea. Problema este ca aceasta nu este afisata, singurul lucru care se intampla este ca procesul de MSBUILD ramane agata si chiar daca incercam sa il inchidem din task manager, o sa ne trezim ca apare aceiasi problema la urmatorul build. Mesajul de eroare care se afiseaza nu are nici o legatura cu eroarea reala si ne v-a avertiza ca MSBUILD-ul nu poate sa stearga un assembly deoarece este folosit de un alt proces. Greseala in XAML pe care eu avuto cand bug-ul s-a reprodus este urmatoarea: x:Name={Binding Name} Spor!

How to get a valid daylight saving time - Part 2

Intr-un post anterior am povestim putin despre TimeZone si daily light saving. Prin metoda "IsDaylightSavingTime" a unui TimeZoneInfo spuneam ca se poate verifica daca pentru o anumita data avem ora de vara sau de iarna. Lucrurile se complica putin cand nu cunoastem TimeZoneInfo pe care il are clientul. In acest caz, pe baza orei trebuie sa identificam pe ce time zone se afla clientul. Acest lucru nu se poate determina in totalitate, dar putem identifica un time zone care partial asemanator. Un obiect de tip TipZoneInfo contine metoda "GetAdjustmentRules" care ne returneaza o lista de reguli care se folosesc pentru a ajusta ora (de exemplu ora de vara sau de iarna). Fiecare regula defineste perioda de inceput si de sfarsit dar din pacate perioada nu este definita la nivel de zi ci doar de luna. De exemplu ni se specifica ca in luna martie se termina perioada in care se aplica regula, dar nu se specifica data exacta cand aceasta se termina. A doua problema apare in

How to get a valid daylight saving time

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