Skip to main content

Posts

Showing posts from October, 2010

Cum sa utilizam optiunea de Pinned Site pe IE9 impreuna cu Windows 7

A fost lansat IE9. Ca de obicei, uni sunt pro, alti sunt contra. Ce m-a facut sa instalez IE9 a fost opțiunea de pinned site. Daca pana acuma doar pe o aplicatie puteai sa faci pin/unpin, IE9 ne ofera aceasta posibilitate si pentru siturile care suporta acest lucru. Chrome are aceasta opțiune de ceva vreme, dar va spun sincer ca nu am remarcato pana acuma( FF fan here).
De ce meta date avem nevoie ca sa putem face ca o pagina web sa poata fi pinned:
application-name: numele la pagina. Daca acesta nu este setat se folosește titlul la pagina;msapplication-tooltip: textul care se afiseaza cand esti cu mouseul peste shortcut;msapplication-starturl: URL spre care duce pagina pe care a fost făcuta pinned( de exemplu daca folosti un master page, puteti face orice pinned sa duca spre prima pagina;msapplication-navbutton-color: culoarea la fundal si la text;msapplication-window: dimensiunile default la browser cand se da click pe shortcut;Toate acestea sunt opționale, ajunge doar sa apelam meto…

HTML 5 - efecte vizuale uimitoare

Se pare ca zilele in care se folosea Photoshop la greu pentru a crea efecte pe paginile HTML incep sa apuna. Java Script impreuna cu HTML 5 ofera posibilitatea de a face efecte vizuale pe care acu 2-3 ani doar le puteam visa.
Hai sa va dau si un exemplu: http://www.nevermindthebullets.com/
Este un site de benzi desenate. Nimic deosebit pana acuma. Dar daca ne uitam in codul HTML o sa observam ca foarte multe efecte vizuale la imagini sunt facute prin intermediul la Java Script.
Cum s-a ajuns la aceasta performanta? S-a inceput de la niste imagini in format PNG, care pot sa fie transparente sau "decupate". Prin acest mecanism se permite suprapunerea de imagini ca si in Photoshop( layer). Fiecare element din imagine este o imagine separata. Dar pe langa atributele normale care le putem gasi pentru tagurile HTML precum img sau p o sa observat niste atribute noi precum: cp:x, cp:ballon sau cp:text. Aceste atribute custom, prefixate cu cp pe care le-a introdus creatorul sitului nu s…

I. Windows Azure - prezentare generala

In urmatoarele saptamani o sa scriu o serie de posturi despre Windows Azure. O sa prezint pe scurt notiunile generale, impreuna cu exemple unde o sa fie cazul. Postarile nu o sa fie una dupa alta, dar o sa incerc ca macar doua posturi pe saptamana sa fie pe aceasta tema.
Iar acuma sa trecem la subiect.

Ce reprezinta cloud computing? Reprezinta un set de servere interconectare intre ele unde dezvoltatorii pot sa:
Instaleze si sa ruleze servicii;Sa stocheze si sa acceseze informatii;Windows Azure reprezinta o platforma de servicii pentru cloud oferite de catre Microsoft. Aceste servicii sunt oferite prin data centerele din toata lumea, prin intermediul cărora se ofera o metoda simpla, sigura si puternica pentru a crea aplicatii web si servicii.
Windows Azure este un sistem de operare creat special pentru cloud. Este de fapt un Windows 2008 Server fara interfata grafica la care au fost adaugate si alte functionalitati. Ca si o curiozitate, acest sistem de operare poate sa se instaleze si sa…

Cloud: Pret estimativ Windows Azure, Amazon, Google

Cu cateva saptamani in urma am fost la o prezentare tinuta de C. Jichici cu tema Windows Azure, iar apoi am tinut doua prezentari pe aceiasi tema. Intrebarea pe care am auzit-o cel mai des a fost: Cat costa estimativ?
Am incercat sa caut niste costuri estimative dar nu am gasit. Am realizat ca un calcul estimativ este foarte greu de facut, deoarece fiecare solutie pentru cloud( Azure, Amazon, Google) are costuri ascunse si/sau modul de calcul este foarte diferit.
O sa incerc sa fac un calcul estimativ pentru un set de cerinte pe care o sa le enumar mai jos. Vreau sa subliniez faptul ca aceste costuri sunt pur estimative, vreau sa fie doar un punct de pornire. O sa fac calcul pentru 4 variante: Azure, Amazon, Google si costul unui server propriu-zis.

Cerinte pentru o aplicatie pe perioada unei luni:Trafic out100GbTrafic in20Gb Spatiu de stocare20GbSpatiu de stocare in db2GbNumar de tranzactii total(db+fisiere stocate)1,000,000Compute time62In urma calculelor estimative pe care le-am facut…

Action filter in Ioc - injectable action filters

ASP MVC ofera posibilitatea declararii unor actiuni comune folosind action filter. Odata ce am implementat un action filter, orice controller sau actiune poate sa fie decorata cu comportamentul pe care noi l-am definit. Se aseamana oarecum cum AOP-ul. Pentru mai multe informatii puteti sa gasiti aici.
Dar daca folosim Ioc, ar fi frumos si uneori necesar sa putem injecta action filtere la runtime. Pentru acest lucru propun urmatorul mecanism:
public class ActionFilterInIocAttribute : ActionFilterAttribute, IActionFilter
{
private IActionFilter _actionFilter;

public ActionFilterInIocAttribute(Type filterType)
{
_actionFilter = Ioc.GetObject(filterType);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
_actionFilter.OnActionExecuted(filterContext);
}

public void OnActionExecuting(ActionExecutingContext filterContext)
{
_actionFilter.OnActionExecuting(filterContext);
}

jQuery - extension methods

De ceva vreme, Microsoft a inceput sa pompeze bani buni in jQuery. A fost integrat cu VS 2010( Visual Studio 2010), iar impreuna de MVC se integreaza perfect.
Am fost surprins sa descopar ca jQuery permite extension methods. Se pare ca Microsoft isi pune amprenta pe acesta, iar in acest caz eu cred ca intr-un mod placut.
Cum se declara:
$.extend({
[nume_metoda]: function([lista_parametri]) {
[corp_metda]
}
});
Cum se apeleaza:
$.[nume_metoda]([lista_parametrii])

Ar fi interesant de folosit aceste metoda cand vrem sa declaram evenimente noi la anumite controale sau pentru a elimina helperele pe care le declaram uneori pentru tot felul de operatii.


Diferenta intre doua date de tip DateTime

Sunt momente cand avem nevoie sa calculam diferenta a doua date. Pentru a putea calcula aceasta diferenta este nevoie doar sa folosim operatorul "-" intre cele doua date. Obiectul pe care il obtinem este de tip TimeSpan. Pana aici totul este in regula.
Dar ce reprezinta aceasta valorea? Poate sa fie negativa, positiva? Cum obtinem delta intre cele doua?
Obiectul de tip TimeSpan pe care il obtinem reprezinta diferenta intre cele doua date. Aceasta valoare poate sa fie negativa sau pozitiva. Daca apelam propietatiile din TimeSpan care ne returneaza minutele,secundele,... sau numarul total de minute, secunde,... acestea o sa ne returneaza valori negative sau pozitive, depinde de ce valori le comparam.
Daca dorim sa obtinem valoarea pozitiva a acestei diferente, putem sa folosim metoda "Duration()". Aceasta metoda returneaza un TimeSpan cu o valoarea pozitiva, care reprezinta timpul trecut intre cele doua date comparate.
Iata si un exemplu:
class Program
{
stati…

Lambda expression si recursivitatea

Astazi aveam de parcurs o structura arborescenta. Din punct de vedere a implementarii nu era cine stie si aveam doua optiuni:
o metoda care se apeleaza recursiv;un while care sa faca cautarea in interiorul la structura pe care o aveam;Dar am zis sa incerc sa folosesc expressi lambda si iata ce a iesit:
Func<Tree, Tree> searchParent =
currentCategorie =>
!currentCategorie.Parent != null
? currentCategorie
: searchParent(PlainTree.First(parentTree => parentTree == currentTree.Parent));

Sa va spun sincer am renutat la ea, din cauza ca nu era tocmai usor de inteles. Dar conteaza ca se poate, iar daca ne folosim imaginatia putem sa facem unele chestii destul de interesante.
Problema care o vad nu este la modul de implementare, nu este complicat deloc sa folosim doar expresii lambda( daca ne ajutam si de Func,Action si delegates putem sa facem aproape orice). Probleme o sa apara in momentul in care vrem sa fac…

Config class to XML

Nu de mult m-am jucat cu un feature de la Castle Project care permite persistarea fișierelor de configurare sub forma unor fisiere XML. Solutia data de ei este foarte usor de folosit. Daca combinam si cu Ioc oferit de Castle Project atunci metoda de persistare a datelor este aproape perfecta.
Si totusi, exista momente cand nu avem nevoie nevoie de o solutie atat de complexa. Dorim sa salvam intr-un fisiere de configurare doar cateva date pe care apoi sa le putem incarca. Am putea folosii app setings, in care putem pune in format key/value oricate date, dar nu recomand. Avem la indemana o solutie mult mai simpla si care ne ofer acces la date printr-un mecanism mult mai sigur.
Daca ne aducem aminte, exista o clasa numita XmlSerializer, de care uitam ca exista. Cu ajutorul ei putem sa serializam si sa deserializam obiecte.
Iata si o parte din codul care serializeaza si deserializa un obiect intr-un string:
/// <summary>
/// Serializeaza obiectul data in format xml ca si …

Arhivare/Dezarhivare in C#

Am avut zilele astea nevoie de a implementa o modalitate prin care sa dezarhivez un pachet zip intr-o anumita locatie. Toate bune si frumoase, am zis ca nu ar trebuii sa am nici o problema, GZipStream o sa functioneze perfect...
Dar nu a fost asa simplu, problema ca GZipStream stie sa manipuleze doar streamuri, iar daca ai un zip format dintr-o structura de directoare si fisiere nu prea ai sanse sa faca acest lucru out of the box.
O solutie era nevoie sa implementez acest mecanism. As fi putut face acest lucru, dar din punct de vedere a timpului depasea timpul pe care il aveam alocat pentru acest task.
Cautant o libratie deja scrisa, am gasit DotNetZip. O librarie destul de complexe, iti permite sa faci foarte multe lucruri, dar cu un API simplu si foarte usor de inteles.
De ce am ales aceasta solutie? Dupa ce am adăugato la referinta am luat copy/paste codul din exemplele pe care erau la ei pe site si a functionat fara probleme.
De exemplu pentru a adauga ceva in arhiva ajunge sa apelazi …

1 to n using Linq

Exista momente cand avem nevoie sa generam date care sa contina o valoare care sa creasca de la 1 la n. De exemplu avem nevoie sa generam pentru paginare valoriile: Page 1; Page 2; ... Page n.
Oare putem sa facem acest lucru fara for?
Iara raspunsul pe care l-am gasit eu:
staticvoid Main(string[] args)
{
StringBuilder sb = newStringBuilder();

Enumerable.Range(1, 10)
.ToList()
.ForEach(item => sb.AppendFormat("Page {0}; ", item));

Console.WriteLine(sb.ToString());
Console.ReadKey();
}




Copy a directory recursive

Ultima oara cand a fost nevoie sa fac asa ceva a fost in timpul facultății. In seara asta aveam de lucru la un proiect ce se ocupa cu un deploy si supriza, aveam nevoie de acest mecanism. Speram ca .NET 4.0 sa fie plin de surprize, dar din pacate nu. Asa ca am inceput sa implementez de manuta si uite ce a iesit:
public static class DirectoryHelper
{
///
/// Copy recursive a directory to a specific location.
///
/// Source directory.
/// Destination directory.
public static void Copy(string sourceDirecotry, string destionationDirectory)
{
if (!Directory.Exists(destionationDirectory))
{
Directory.CreateDirectory(destionationDirectory);
}
//Copy all files from the current directory.
foreach (string file in Directory.GetFiles(sourceDirecotry))
{
var fileName=Path.GetFileName(file);
File.Copy(Path.Combine(destionationDirectory,f…