Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Wednesday, 30 November 2011

What is the difference between Globalization, Localization, Internationalization

Posted on 04:01 by Unknown

Globalization se refera la formatarea elementelor precum data, ora, moneda, valori numerice .

Localization se refera la afisarea textului si a continutului in limba dorita.

Localization != Internationalization

Internationalizarea se refera la procesul de desing a unei aplicatii a.i. sa poata suporta limbi diferite. Pe cand localizarea se refera la procesul de adaptare a unei aplicatii pentru o anumita limba.

Read More
Posted in globalization, internationalization, localization | No comments

Detecting Session Timeouts

Posted on 02:32 by Unknown
Durata de viata a unei sesiune se poate seta din fisierul de configurare. Valoarea minima pe care o poate avea este 1 minut:
<sessionState mode="InProc"  timeout="1" />
Cand setati durata de viata la sesiune trebuie sa avegi grija ca IIS, by default face recyle la AppPool odata la 120 de minute. Ambele valori trebuie modificate daca doriti ca durata de viata a sesiunii sa fie mai mare.
Dintr-o aplicatie ASP.NET, folosid metoda Session_End din Global.asax nu o sa puteti prinde mereu acest eveniment. Pentru mai multe detalii: http://vunvulearadu.blogspot.com/2011/11/when-sessionend-is-called.html.
Pentru a putea detecta daca o sesiune este noua putem sa verificam valoarea propietatii Session.IsNewSession.Aceasta propietate este TRUE cand sesiune este noua.
Folosit aceasta propietate pe ASP.NET MVC3 ne putem declara un action filter prin intermediul caruia sa detectam daca sesiunea a expirat.
public class Sessi1onExpireFilterAttribute : ActionFilterAttribute 
{
        public override void OnActionExecuting( ActionExecutingContext filterContext ) 
{
             HttpContext context = HttpContext.Current;
            if ( context.Session != null ) {
                 if ( context.Session.IsNewSession ) {
                     string cookies= ctx.Request.Headers[ "Cookie" ];
                     if ( ( cookies != null) 
         && ( cookies.IndexOf ( "ASP.NET_SessionId" ) >= 0 ) ) {
                         context.Response.Redirect ( "~/Default/Index" );
                     }
                 }
             }
            base.OnActionExecuting ( filterContext );
}
}
Nu este de ajuns sa verificam valoarea propietatii IsNewSession. Trebuie sa ne dam seama daca sesiune a expirat sau este primul access a utilizatorului la noi pe site. Acest lucru este destul de usor de facut daca verificam avem deja ceva in cookies. Putem sa punem noi in cookies o anumita valoare sau sa verificam daca in cookies exista “ASP.NET_SessionId”.
Read More
Posted in ASP.NET, MVC 3, session | No comments

Tuesday, 29 November 2011

ViewBag don't contains items which are set in the partial view

Posted on 07:21 by Unknown

Astazi vreau sa vorbim despre ViewBag. Daca nu l-ati folosit pana acuma, in MVC 3 acesta este un dictionar dynamic, in care se pot pune valori pentru a fi trasmise de la controller la view date. Cel mai nice lucru la el este ca este un tip de data dynamic. Cea ce inseamna ca putem sa facem get/set la date folosind propietati pe post de keys.
In loc de:
    ViewData["DateNow"] = DateTime.Now;
    ViewData["Age"] = 55;
Avem:
    ViewBag.DateNow = DateTime.Now;
    ViewBag.Age = 55;
Sa trecem la lucruri mai interesante. Daca avem un View care contine un partial view in care populam ViewBag-ul( desii nu e sanatos poate sa apara cazul acesta), o sa observam ca in view-ul parinte sau in _Layout, ViewBag-ul nostru nu contine elementele pe care le-am adaugat.
Prima reactie este sa spunem ca este sa spunem ca este un bug. Daca ne uitam putin peste cum functioneaza MVC 3 o sa descoperim ca de fapt la partial view primeste propiul sau ViewBag.
Solutia pentru a rezolva aceasta problema este sa trasmitem ViewBag-ul mai departe la partial view. Il putem trasmite ca si un ViewDataDictionary, iar apoi in partial view sa il convertim spre un tip de data dynamic.
Pagina principala:
@{Html.RenderPartial("Elaborate", Model, new ViewDataDictionary { {"vb", ViewBag}});}
….
@ ViewBag.Age=25;
 Partial view:
@{
     var viewBag = ((dynamic)ViewData["vb"]);
     viewBag.Age = 20;
}
Ce parere aveti? Vedeti alte solutii?

Read More
Posted in ViewBag | No comments

Monday, 28 November 2011

Why to use/not to use Server.Transfer

Posted on 07:15 by Unknown
Care sunt avantajele/dezavantajele folosirii Server.Transfer in loc de Resposese.Redirect?
Server.Transfer nu trimite la brower un mesaj prin care ii spune sa incarce o alta pagina. Din aceasta cauza nu se mai face un drum pana la client pentru a face redirectarea. Prin acest mecanism serverul nu mai trebuie sa rezolve atatea cereri HTTP. Trebuie avut grija deoarece Server.Transfer pastreaza URL original la client. Cea ce poate sa ne induca in eroare la debug sau daca vrem sa facem SEO. Daca vrem sa redirectam userul spre o pagina externa( de exemplu www.google.ro), atunci Server.Transfer nu o sa poate sa fie folosit.
Server.Transfer are un parametru optional denumit “preserverForm”, care daca este setat pe TRUE, query-ul string-ului si toate variabilele din forma sunt trimise mai departe. Exista un bug care apare uneori cand vrem sa transferam aceste valori. Pentru a evita aceast bug putem sa setam "enableViewStateMac" pe TRUE pe pagina spre care facem redirectare.

Read More
Posted in Server.Transfer. Resposen.Redirect | No comments

When Session_End is called

Posted on 06:33 by Unknown

Intr-o aplicatie web, avem doua metode in Global.asax.cs care se apeleaza in momentul in care o sesiune este creata sau cand aceasta se termina:

  • Session_Start
  • Session_End

Daca Session_Start este apelat cand o sesiune este create, trebuie avut grija cu Session_End. Exista cateva cazuri cand aceasta metoda nu este apelata:

  • Este apelata doar daca sesiune este “InProc”. Daca tinem sesiune in AppFabric Cache sau pe SQL Server atunci Session_End nu o sa fie apelat.
  • Cand userul inchide browerul. Din cauza ca protocol HTTP este stateless, nu aveti cum sa detectati acest eveniment by default. In functie de brower acest eveniment se poate detecta, dar nu va face trigger la Session_End by default.
  • Daca in sesiune nu aveti nici o informatie atunci metoda Session_End nu o sa fie apelata.

Aceasta metoda este apelata de catre un worker processor. Din aceasta cauza pe thread-ul respective nu o sa aveti acces la toate resursele, chiar daca in Session_Start le-ati avut pe toate. De exemplu daca va conectati la o baza de date cu contul de Windows, conexiunea o sa mearga pe Session_Start, dar pe Session_End nu o sa puteti accesa baza de date.

Metoda Session_End este in urmatoarele cazuri:

  • Cand dupa un anumit interval de timp sesiune expira. Aceasta valoare se seteaza de obicei din fisierul de configurare.
  • Cand este apelata metoda Session.Abondon.

Read More
Posted in session, Session_End, Session_Start | No comments

Friday, 25 November 2011

#IF DEBUG can be replaces with Conditional attribute

Posted on 21:19 by Unknown
Pe un proiect legacy la care am lucrat anul acesta apareau destul de conditia urmatoare:
#if DEBUG
     //Some code
#endif
Natura proiectului ne obliga sa avem astfel de cod. Problema era ca uneori noi compilam proiectul configurat pentru RELEASE, faceam modificari la cod si in RELEASE totul parea in ordine, dar pe masina de build, aveam erori de compilare, deoarece acesta compila in DEBUG.
Am descoperit zilele acestea un nou atribut care poate sa inlocuiasca aceasta conditie urata.
[Conditional("DEBUG")]
public static void DoSomething()
{
     //Some code
}
Metoda DoSomething o sa fie apelata doar in cazul proiectul este compilat in DEBUG mode.
Cand putem sa folosim aceast atribut?
  • se poate folosi doar in interiorul unei clase sau a unei structuri. Nu incercati sa il puneti pe metoda unei interfete, deoarece o sa dea eroare la compilare
  • metoda pe care o decorati cu acest atribut nu trebuie sa fie neaparat statica, dar nu are voie sa fie implementarea  unei metode din interfata
  • metoda nu trebuie sa fie marcata cu override, dar poate sa contina atributul virtual
  • valoarea returnata de aceasta metoda trebuie obligatoriu sa fie void
Singurul lucru care poate sa  fie confusing este urmatorul cod:
public class Car
{
     public Car()
     {
          DoSomething();
     }     
     [Conditional("DEBUG")]
     public void DoSomething()
    {
          //Some code.
    }    
}
Ce o sa se intample la compilare daca avem setat RELEASE? O sa avem o eroare de compilare? Se va mai apela  metoda noastra? Raspunsul este ca codul general de IL nu va include si apelul la metoda DoSomething() daca compilam pentru RELEASE.
Personal incerc sa evit sa folosesc aceste conditii, nu sunt foarte sanatoase. Dar daca lucram deja pe un proiect care contine conditii de tip #if DEBUG, pentru a refactoriza codul si a scapa de aceste conditii, primul pas este sa le scoatem ca si metode separate, decorate cu atributul Conditional.
Read More
Posted in #if DEBUG, Conditional attribute | No comments

Prezentare CODECAMP - Windows Phone: multitasking and local database

Posted on 20:59 by Unknown
Astazi urmeaza sa tin o prezentare CODECAMP in Bucuresti. Ne vedem acolo.

When: 26 noiembrie 2011
Where: sediul Microsoft România din Piaţa Presei Libere nr. 3-5, Clădirea City Gate Sud, etaj 2, sala Remus
Title: Windows Phone: multitasking and local database
Presentation slides: http://www.slideshare.net/raduvunvulea/windows-phone-multitasking-and-local-database


Read More
Posted in bucuresti, codecamp, Mango, multitasking, SQL CE, Windows Phone | No comments

DateTime.AddDays(x)

Posted on 06:36 by Unknown
Care este greseala in codul de mai jos:
for(DateTime date=beginDate;date<=endDate;date.AddDays(1))
{
// Executa cod.
}
Problema apare in for, unde date va fi mereu mai mic ca endDate.
Cauza este AddDays, care nu adauga la data curenta o anumite valore ci returneaza o noua data. Nu trebuie sa uitam ca DateTime este un value type.
Codul corect este:
for(DateTime date=beginDate;date<=endDate;date = date.AddDays(1))
{

// Executa cod.

}
Read More
Posted in datetime | No comments

Thursday, 24 November 2011

No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172

Posted on 01:03 by Unknown
Trebuia sa fac un partial deploy pe Azure la un web role in aceasta dimineata. M-am trezit cu urmatoarea eroare:
No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:8172
Am inceput sa verific web rolul sa vad daca firewall-ul este pornit si daca blocheaza portul 8172. Totul parea in regula.
Problema a fost de cand am facut full deploy-ul. Uitasem ca activez optiunea de partial web deploy.
Va puteti da destul de usor seama daca ati activat partial deploy pe un web role daca incercati sa accesati adresa https://xxxx.cloudapp.net:8172/MsDeploy.axd . In cazul in care serverul nu raspunde atunci sunt mari sanse sunt ca partial deploy sa nu fie activ pe web rol-ul respectiv.
Read More
Posted in Azure, deploy | No comments

Monday, 21 November 2011

Mango ce versiune de Windows Phone 7 este?

Posted on 11:39 by Unknown

Versiunea de OS este 7.5 - Windows Phone 7.5
Versiunea de SDK pe care o folositi pentru dezvoltarea unei aplicatie pe Mango este 7.1 - Windows Phone SDK 7.1
Read More
Posted in Mango, Windows Phone | No comments

Sunday, 20 November 2011

What to use? Event or delegate?

Posted on 02:14 by Unknown
Un eveniment este de fapt un delegate mai special. Comportamentul este destul de asemanator a unui eveniment in interiorul clasei unde este declarat, dar in afara acestei clase singurul lucru care se poate face este subscribed si unsubscribed. In momentul cand cineva face (un)subscribed, putem sa executam actiuni specifice prin definirea explicita a actiunilor de "Add" si "Remove"( per event).
Chiar daca pentru un eveniment putem sa specificam nivelul de acces( public, protected, private, internal), asta nu inseamna ca oricine poate sa faca raise la eveniment. Doar clasa care contine evenimentul poate sa faca raise la eveniment.
In mod normal evenimentele nu trebuie sa execute o actiune pe obiectul care contine acest eveniment, ele trebuie doar sa notifice abonatii ca ceva s-a intamplat. Din aceasta cauza evenimentele trebuie privite ca ceva optional. Aruncarea evenimentului este ceva optional, iar orice exceptie aparuta in momentul respectiv nu ar trebuii sa afecteze logica blocului de cod care face raise la eveniment.
Din punctul meu de vedere evenimentele trebuie folosite cand vrem sa notificam 1 sau mai multi abonati ca ceva s-a intamplat. In cazul in care vrem ca abonatul sa faca o actiune care poate afecta clasa care a facut raise la eveniment, atunci este necesar sa folosim delegates.


Pentru mai multe informatii despre events si delegates:
  • Delegates - http://msdn.microsoft.com/en-us/library/ms173171%28v=vs.80%29.aspx
  • Events - http://msdn.microsoft.com/en-us/library/ms535863%28v=vs.85%29.aspx


Read More
Posted in delegate, event | No comments

Thursday, 17 November 2011

Windows Phone 7.5( Mango) support SQL CE

Posted on 07:39 by Unknown
Windows Phone 7.5( Mango) suporta SQL CE(SQL Compact Edition). Acest feature era de mult timp asteptat. Acuma sa vedem cum se foloseste.
Baza de date poate sa fie pusa in doua locatii:
  1. isolated storage
  2. installation folder
In functie de locatie si de parametrii, stringul de conexiune poate sa aibe urmatoarea forma:
  • Data Source = 'isostore:/MyDB.sdf; - cand baza de date este in isolated storage
  • Data Source = 'isostore:/MyDB.sdf';Password='1234'; - cand baza de date este in folderul unde aplicatia a fost instalata si este encriptata cu parola 1234
La stringul de conexiue putem sa setam si alte valori precum culture-ul( "Culture Identifier") si daca este case sensitive( "Case Sensitive").
Trebuie sa tinem cont ca avem cateva limitari pe Mango cand vrem sa folosim SQL CE:
  • fisierele sdf sunt stocate si deschise din isolation storage
  • daca dorim un mecanism de ORM este nevoie sa folosim LINQ2SQL
  • T-SQL queries nu este suportat( nu putem sa avem tranzactii)
  • o referinta la System.Data.Linq trebuie adaugata
  • pentru definierea modelului in acest moment avem doua optiuni SQLMetal pentru Windows Phone Mango sau code-first. By default nu avem un tool grafic pentru definirea acestor mapari.
  • formatul la string-ul de conexiune este unul specific
Versiune de SQL CE care este suportata este SQL CE 4.0. Se poate lucra direct cu EF 4.1.
Saptamana urmatoare o sa revin cu un exemplu intreg.












Read More
Posted in Compact Edition, Mango, sql, Windows Phone | No comments

Friday, 11 November 2011

Visual Studio 2010 extensions

Posted on 04:16 by Unknown
Zilele acestea am fost constrans de un upgrade la OS care mi-a omorat masina sa instalez de la 0 toate aplicatiile. Mai jos o sa gasiti lista de extensii pentru Visual Studio 2010 pe care le folosesc:
  • Code alligment - il folosesc cand am nevoie sa aliniez codul dupa un anumit caracter( de exemplu cand trebuie sa aliniez cateva linii de cod dupa '=').
  • Indent Guides - traseaza linii verticale pentru fiecare nivel de intentare in parte.
  • PowerCommands for Visual Studio 2010 -  mai multe comenzi pe partea de management la proiecte si soluții.
  • Productivity Power Tool - cel mai mare plus care l-a adus pentru mine a fost fereastra de add/remove references.
  • Spell Checker - face check la spelling pentru string-uri, comnent-uri si plain text.
  • VSCommands 2010 - coloreaza diferit codul scris iar cand dam click dreapta pe un fiser/director/proiect/solutie ne ofera noi functionalitati precum: deschidere CMD cu path-ul setat in directorul curent, copy class, copy full path etc.
Enjoy!
Read More
Posted in extension, visual studio | No comments

Thursday, 10 November 2011

How to store an array of booleans in a int

Posted on 08:03 by Unknown
Uneori ajungem sa ne dorim sa stocam intr-un int mai multe valori booleene( de obicei de dragul artei) pentru a salva a avea mesajele care se trimit pe tiava cat mai mici. O solutie pe care o propun este sa folosim BitArray.
Acesta ne permite sa lucram cu biti. Pentru a initializa si seta valoriile unui BitArray trebuie sa scriem urmatorul cod:  
BitArray bits = new BitArray(32); // 32 - numarul de biti pe care il ocupa un int 
bits[0] = true;
...
bits[31] = false; 
Urmatorul pas este sa convertim un BitArray in int. Acest lucru se face destul de usor cu metoda CopyTo:  
int[] valueConverted = new int[1];
bits.CopyTo(valueConverted,0); // 0 - reprezinta indexul de inceput 
int result = valueConverted[0]; 
In result am obtinut int-ul care contine BitArrat-ul nostru.Pentru a executa procesul invers, sa obtinem un BitArray dintr-un int este nevoie sa apelam metoda statica GetBytes a clasei BitConverter.  
BitArray bits = BitConverter.GetBytes(result); 
Ce alta solutie aveti pentru aceast task?
Read More
Posted in BitArray, int, store | No comments

How to manualy set the location from where a controller is loaded

Posted on 07:10 by Unknown
Uneori ajungem ca unul sau mai multe controale sa fie definite intr-un assembly diferit fata de proiectul MVC 3 pe care il avem. Pentru a putea controla mecanismul de incarcare a controalelor este nevoie sa ne definim propiul nostru controller factory.
Trebuie sa ne definim o clasa care sa implementeze interfata IControllerFactory. In cazul in care vrem sa pastram si vechia functionalitate care exista by default putem sa implementam clasa DefaultControllerFactory si sa facem override la CreateController. Aceasta metoda primeste doi parametrii
  • requestContext - care contine date despre request
  • controllerName - numele la controller
In interiorul acestei metode pe baza numelui la controler si a contextului trebuie sa returnam instanta controlerului nostru.

public class MyControllerFactory : DefaultControllerFactory
    {
        public override IController CreateController(
System.Web.Routing.RequestContext requestContext,
                                                     stringcontrollerName)
        {
            return Activator.CreateInstance(
customNamespaceController+controllerName);
        }
    }


Read More
Posted in | No comments

Evenimente IT de toamnă - CodeCamp și ITSpark

Posted on 05:44 by Unknown
http://itspark.ro/b/blog/archive/2011/11/10/evenimente-it-de-toamna-codecamp-si-itspark.aspx

In aceasta luna o sa aibe loc o serie de eveniment IT in Timisoara, Oradea, Cluj, Iasi si Bucuresti. Codecamp impreuna cu ITSpark si SQLServer.ro organizeaza aceasta serie de evenimente gratis.
Lista de evenimente, formularele de înscriere și agenda din fiecare locație le găsiți mai jos:
  • Timișoara - vineri, 18 noiembrie 2011
  • Oradea - sâmbătă, 19 noiembrie 2011
  • Cluj - marți, 22 noiembrie 2011
  • Iași - sâmbătă, 26 noiembrie 2011
  • București - sâmbătă, 26 noiembrie 2011
Ne vedem acolo!.

Read More
Posted in 2011, codecamp, eveniment, ITCamp, itspark | No comments

Friday, 4 November 2011

ToLower - optimization

Posted on 02:13 by Unknown
Mai mult ca sigur stiti ce face metoda ToLower( cand vreti sa transformati un string, pentru a avea toate caracterele mici este nevoie sa apelam la aceasta metoda).
Daca ne uitam peste definitie, o sa observam ca exista 3 variante
  • ToLower()
  • ToLowerInvariant()
  • ToLower(CultureInfo cultureInfo)
Cele 3 metode fac acelasi lucru, cel mai mult m-a interesat daca exista diferente de performanta intre ele. Am rulat codul de mai jos de 100.000.000 de ori.
string uppertText = "Salut. Ce MAI fACI?";
CultureInfo cultureInfo = CultureInfo.CurrentCulture;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for( int i=0; i<100000000; i++)
{
string lowerText = upperText.ToLower();
//string lowerText = upperText.ToLowerInvariant();
//string lowerText = upperText.ToLower(cultureInfo);
}
stopwatch.Stop();
Console.WriteLine("Elapsed type: {0}",stopwatch.Elapsed);

Rezultatul pe care l-am obtinut este destul de interesant:
  • ToLower() - 10.51 s
  • ToLowerInvariant() - 17.32 s
  • ToLower(CultureInfo cultureInfo) - 8.52 s
Daca vreti o performanta si mai mare, puteti sa va implementati propia metoda care parcurge sirul de caractere si pentru fiecare caracter care este litera mare sa il faca lower case. Pentru aceasta implementare am obtinut un timp de 1.89 s.
 public static string ToLowerTest(this string value)
{
char[] output = value.ToCharArray();
for (int i = 0; i < output.Length; i++)
{
if (output[i] >= 'A' &&
output[i] <= 'Z')
{
output[i] = (char)(output[i] + 32);
}
}
return new string(output);
}
Read More
Posted in C#, optimization, string, ToLower | No comments

Thursday, 3 November 2011

How to use Bing Maps v7

Posted on 08:12 by Unknown
In ziua de azi, de la o poza sau un document pana la un colet trimis prin curier sau localul la care ai iesit aseara poate sa fie track-uita pe harta. Aceste harti sunt oferite gratis (Bing, Maps, Google Maps etc), iar singurul lucru pe care trebuie sa il cunoastem sunt coordonate GPS.
Un utilizator poate sa foloseasca aceste harti fara nici o problema, iar cea mai mare parte din persoanele care iti acceseaza web situl nu o sa aibe probleme cu folosirea unei harti. Mai jos o sa discutam despre cum putem sa integram si sa folosim Bing Maps in web situl nostru.
Exista mai multe versiuni de API pentru Bing Maps, ultima versiune (vs 7.0) a fost regandita de la 0 si a devenit extrem de usor de folosit. O sa ne uitam peste versiunea 7.0, care este integrata in totalitate cu ajax.
Tot setup-ul se face din java script. Primul pas este sa ne cream un obiect de tip Map si sa specificam zona de pe pagina unde sa apara:
<head>
...
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<script type="text/javascript">
var map = null;
function getMap()
{
map = new Microsoft.Maps.Map(document.getElementById('mapDiv'), null);
}
</script>
</head>
<body onload="getMap();">
<div id='mapDiv' style="position:relative; width:600px; height:500px;"></div>
</body>
In momentul de fata avem harta afisata, dar avem un mesaj de eroare cane ne indeamna sa folosim credentiale valide. Harta se poate folosii si asa, doar ca banerul cu mesajul de eroare nu o sa il putem sterge. Ca sa scapam de el trebuie sa ne inregistram la adresa http://www.microsoft.com/maps/developers/web.aspx .
O sa primim o cheie unica pe care o sa o setam cand cream un nou obiect de tip map.
map = new Microsoft.Maps.Map(document.getElementById('myMap'),
{
credentials: '[CheieUnica]'
});
Avem harta pe pagina noastra, putem sa facem zoom in si zoom out si sa ne pozitionam oriunde vrem pe harta.
Urmatorul pas este sa adaugam cateva puncte( pushpin-uri). Ce este important la aceste pushpin-uri sunt coordonatele GPS. In exemplul de mai jos, unul din pushpin-uri va puncta spre o locatia data, iar celalat spre centrul hartii.
function updatePushpinLocation()
{
var pushpinLocatieData= new Microsoft.Maps.Pushpin(map.getCenter(), null);
map.entities.push(pushpinLocatieData);
pushpinLocatieData.setLocation(new Microsoft.Maps.Location(48, 52));

var pushpinCentruHarta= new Microsoft.Maps.Pushpin(map.getCenter(), null);
map.entities.push(pushpinCentruHarta);
}
In cazul in care pe evenimentul de click la un pushpin dorim sa afisam un info box, putem sa folosim obiecte de tip Infobox in loc de pushpin, iar de restul de ocupa API-ul de la Bing Maps. Fiecare infobox poate sa aibe un titlu si o descriere care sa se afiseze cand se da click pe acesta. Este bine de stiut ca putem insera si cod html, doar ca atunci trebuie sa folosim metoda setHtmlContent a obiectului Infobox.
var infoboxOptions = { title:'Titlu', description:'Descriere ...'};
var pushpin = new Microsoft.Maps.Infobox(map.getCenter(), infoboxOptions );
map.entities.push(pushpin);
Pe fiecare pushpin sau infobox putem sa adaugam evenimente precum click, etc.
pushpinClick= Microsoft.Maps.Events.addHandler(pushpin, 'click', clickEventInfo);
clickEventInfo= function (e) { alert("Click"); }
Orice eveniment pe harta poate sa fie prins si manipulat. In cazul in care dorim sa stergem toate punctele de pe harta este nevoie sa apelam functia map.entities.clear().
Unele browsere ne permit sa accesam locatia GPS a aparatului si sa localizam userul pe harta. Trebuie sa tinem cont ca utilizatorul o sa fie intrebat daca face share la aceasta informatie de catre brower.

var geoLocationProvider = new Microsoft.Maps.GeoLocationProvider(map);
geoLocationProvider.getCurrentPosition();
Ce mi s-a parut cel mai interesant am lasat la sfarsit. Putem sa incarcam sau sa folosim module scrise de alte persoane pentru a personaliza harta sau sa extindem functionalizatiile. Inregistrarea unui modul se face prin intermediul comenzii Microsoft.Maps.registerModule. Build-in putem sa incarcam module precum:
  • Traffic Module
  • Clustering Module
  • Direction Module
  • VenueMaps Module
  • Navigation Bar Module
Cel mai interesant modul mi se pare ca este Clustering Module, care ne permite sa grupam 1..n locatii pe harta sunt prea apropiate. Pe codeplex, puteti sa gasiti o colectie de module destul de utile bingmapsv7modules.codeplex.com.
O alta functionalitate este cautare pe harta. Tot ce trebuie sa facem este sa apelam un serviciu REST oferit de Bing Maps.

map.getCredentials(function(credentials) {
var searchRequest = 'http://dev.virtualearth.net/REST/v1/Locations/ClujNapoca?output=json&jsonp=SearchServiceCallback&key=' + credentials;
var mapscript = document.createElement('script');
mapscript.type = 'text/javascript';
mapscript.src = searchRequest;
document.getElementById('SDKmap').appendChild(mapscript);
});
Puteti sa gasiti exemple de cod in urmatoarea locatie http://www.bingmapsportal.com/ISDK/AjaxV7.

Enjoy.
Read More
Posted in ajax, bing maps v7, java script, tutorial | No comments

Wednesday, 2 November 2011

.NET - Nice to have

Posted on 00:15 by Unknown

In C# la crearea unui obiect putem sa inițializam propietatiile acestuia prin următoarea sintaxa:

Engine engine=new Engine(…)
{
Power = 101,
Type = “ES12RW120TDI”
};
Am simtit uneori nevoie sa pot face acelasi lucre si cu un obiect deja creat. Exista locuri cand obiectul este initalizat de un factory sau deja exista, si trebuie sa schimbam valoarea unor proprietati. Mi-ar placea sa pot face urmatorul lucru:
Engine engine = InitEngine(…)
{
Power = 101,
Type = “ES12RW120TDI”
};
sau
use (engine)
{
Power = 101,
Type = “ES12RW120TDI”
};
In loc de
engine.Power = 101;
engine.Type = “ES12RW120TDI”;
Nu cred ca o sa vad vreodată acest feature si nici din punct de vedere a unui limbaj de programare sintaxa nu este tocmai corecta, dar ar fi nice to have, uneori ne-ar putea usura putin codul.
Read More
Posted in .NET nice to have | No comments

Tuesday, 1 November 2011

EWS - Reply command - odd behavior

Posted on 01:46 by Unknown
In ultima perioada am inceput sa lucrez cu serverul de Exchange prin intermediul la EWS si am observat un comportament nenatural, care poate sa genereze erori daca nu exista unit-teste pentru acest flow.
Se da actiunea de reply. Pe exchange avem o comanda separata, care genereaza automat mesajul de reply si face autofill la TO si CC. Pana aici nimic special, doar ca aceste doua liste nu ne sunt returnate de serverul de exchange, dar in momentul in care se face SEND, ele se completeaza automat.
Dar ce se intampla daca vrem sa adaugam inca o adresa de email in lista de TO. Dupa ce adaugam un email si executam actiunea de send o sa avem parte de o surpriza. Mesajul este trims doar la persoana respectiva si atata.
Ce se intampla? Se face override la lista, chiar daca avem o List si noi apelam metoda Add.
Solutie: In mesajul de raspuns trebuie sa adaugam manual lista de adrese. Sa nu uita ca FROM devine TO.
Read More
Posted in ews, exchange, reply command | No comments
Newer Posts Older Posts Home
Subscribe to: Comments (Atom)

Popular Posts

  • Service Bus Topic - Automatic forward messages from a subscription to a topic
    Windows Azure Service Bus Topic is a service that enables us to distribute the same messages to different consumers without having to know e...
  • 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 ...
  • 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...
  • 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...
  • Patterns in Windows Azure Service Bus - Message Splitter Pattern
    In one of my post about Service Bus Topics from Windows Azure I told you that I will write about a post that describe how we can design an a...
  • 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...
  • 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...
  • Cum sa salvezi un stream direct intr-un fisier
    Cred ca este a 2-a oara când întâlnesc aceasta cerința in decurs de câteva săptămâni. Se da un stream și o locație unde trebuie salvat, se c...
  • Task.Yield(...), Task.Delay(...)
    I think that a lot of person already heard about these new methods. In this post I want to clarify some things about these new methods that ...
  • 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...

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)
    • ►  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)
      • What is the difference between Globalization, Loca...
      • Detecting Session Timeouts
      • ViewBag don't contains items which are set in the ...
      • Why to use/not to use Server.Transfer
      • When Session_End is called
      • #IF DEBUG can be replaces with Conditional attribute
      • Prezentare CODECAMP - Windows Phone: multitasking ...
      • DateTime.AddDays(x)
      • No connection could be made because the target mac...
      • Mango ce versiune de Windows Phone 7 este?
      • What to use? Event or delegate?
      • Windows Phone 7.5( Mango) support SQL CE
      • Visual Studio 2010 extensions
      • How to store an array of booleans in a int
      • How to manualy set the location from where a contr...
      • Evenimente IT de toamnă - CodeCamp și ITSpark
      • ToLower - optimization
      • How to use Bing Maps v7
      • .NET - Nice to have
      • EWS - Reply command - odd behavior
    • ►  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