Small place on earth

”Imagination is more important than knowledge” - Albert Einstein
Ce va conține C# 4.0

Acum 2 zile la PDC s-au anunțat feature-urile care vor fi prezente în următoarea versiune de C#. Prezentarea în care Anders a dezvăluit feature-urile o puteți găsi aici.

Pe scurt, feature-urile sunt:

Dynamic - introducerea unui nou pseudo tip de date prin care se permite întârzierea rezolvării unui apel de metodă până la run-time. Printre utilizările acestui tip de date se numara interactiunea cu COM și limbajele de programare dinamice (cele ce ruleaza pe DLR).

Named & Optional parameters - similar cu VB.NET, acum se vor putea consuma și declara parametrii optionali. De asemenea se vor putea specifica parametrii unei metode prin numele lor. Acest feature va face mult mai facilă programarea Office. Nu mai trebuie sa specificăm xx parametrii prin "ref missing" Smile

No-PIA - va permite deploymentul de aplicații fără PIA-ul asociat lor reducând astfel dimensiunea kit-ului de instalare. La compilare, din PIA-ul respectiv se vor extrage informatiile necesare făcând ne-necesară existența PIA-ului. La rulare, pe calculatorul tinta, aplicatia referita prin PIA trebuie sa fie instalată. De exemplu - nu va mai trebui să fac deployment la PIA-ul de Word/Excel atăta timp cât pe masina țintă am instalat Word/Excel

Co&contra variance - extinderea acestui feature (și de data asta corect) pentru interfete si delegates

Omit ref - DOAR pentru COM va putea omite specificarea modificatorului ref pentru apelurile de metodă care necesită acest modificator.

Feature-ul la care lucrez este dynamic si as vrea sa dezvolt subiectul. Nu stiu insa daca acesta este locul cel mai potrivit pentru a-l dezvolta.

Ca de obicei, astept comentarii si pareri.

Technorati tags: , , , , , , , ,

Ce o să fie în C# 4.0 ?

Dacă vrei să știi ce feature-uri o să fie prezente în C# 4.0, urmărește acest interviu cu echipa de design a limbajului C#.

http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team

Mai multe detalii tehnice despre C# 4.0 după PDC 2008.

Enjoy!

 

 

Technorati tags: , , ,

Visual Studio 2008 Service Pack 1 Beta a fost facut public.

Ieri dimineata a fost facut public VS 2008 SP1 Beta 1.

Mai multe informatii despre ce contine SP1 se pot gasi aici: http://support.microsoft.com/kb/945140.

Pentru download:

Daca aveti probleme la instalarea lui incercati aici: http://blogs.msdn.com/heaths/archive/2008/05/09/visual-studio-and-net-log-collection-utility.aspx

Un forum dedicat SP1 a fost deschis aici: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=2136&SiteID=1.

 

Technorati tags: , , , , , ,

PLINQ December CTP

Primul CTP de Parallel LINQ a fost făcut public. Cu aceeași ocazie s-a lansat și un portal dedicat calculului paralel.

Ce înseamnă, pe scurt, PLINQ: înseamnă că, în momentul execuției unui query LINQ se vor folosi în mod eficient toate procesoarele sistemului. Query-ul va fi împărțit în sub-task-uri și vor fi rulate pe procesoare diferite, iar rezultatul va fi reuniunea rezultatelor acelor sub-task-uri. Pentru mai multe informații vă recomand să citiți aici.

Technorati tags: , , , , , , , ,

Visual Studio 2008 & .NET Fx 3.5 s-au lansat!

Momentul mult așteptat este aici: Visual Studio 2008 împreună cu .NET Fx 3.5 s-au lansat. Edițiile Express pot fi descărcate de aici. Dacă vreți să încercați versiunile full de Visual Studio, edițiile trial de pot fi descărcate de aici. Pentru mai multe detalii, citiți blog-ul lui Soma. Există și un video pe Channel 9 cu Soma în care vorbește despre VS 2008. De asemenea, edițiile sunt disponibile pentru cei ce au o subscripție MSDN.

Visual Studio 2008 vine cu multe feature-uri noi, dar feature-ul care îmi place cel mai mult (la nivel de IDE) este suportul Intellisense pentru LINQ și C# 3.0. Pe locul 2 vine opțiunea de Remove and Sort Using statements care mi se pare extrem de utilă Smile.

După ce îl încercați aș fi foarte curios să aflu care este feature-ul care v-a plăcut cel mai mult! Mai multe informații despre instalare și dezinstalare puteți găsi în Readme-ul VSTS.

Technorati tags: , , , , , , , , ,

SQL Injection attacks - oops

Chiar e funny chestia asta: http://xkcd.com/327/

via: http://www.schneier.com/blog/archives/2007/10/sql_injection_a.html

Technorati tags: , ,

Prezentare C# 3.0 & LINQ în București și Iași

În București pe data de 15 Octombrie la ora 16:00 și în Iași pe data de 17 Octombrie la ora 18:00, vă invit la o prezentare de C# 3.0 și LINQ în care vom vedea care sunt noutățile aduse în C# 3.0 precum și ce anume înseamnă LINQ.

Pentru mai multe detalii și pentru confirmarea prezenței: http://ronua.ro/CS/forums/thread/139786.aspx și http://ronua.ro/CS/forums/thread/141257.aspx.

Ne vedem acolo!

Pentru și mai multe detalii vedeți blog-ul lui Petru Smile.

Technorati tags: , , , , , , ,

NASA + Microsoft = Naveta Endeavour prin Photosynth

Este pentru prima dată când oamenii din întreaga lume pot vedea imagini din zona de lansare a navetei Endeavour. Ceea ce este impresionant este nivelul de detalii pe care îl poți vedea cât și faptul că ai acces la un model 3-D al navetei și al zonei înconjurătoare. Ceea ce este cel mai interesant este faptul că întregul model a fost creat pe baza fotografiilor făcute din diferite puncte de vedere asupra respectivei zone.

Dacă nu ați încercat încă Photosynth, acesta este cel mai bun moment să în încercați. Nivelul de detaliu este fascinant!

http://labs.live.com/Rocket+Science+Synthing+The+Space+Shuttle.aspx

Technorati tags: , , , , , ,

Visual Studio 2008 - beta 2

A trecut ceva vreme de când nu am mai scris nimic, dar revin acum cu o veste bună: Visual Studio 2008 a ajuns in beta 2!!!

Dacă vreți să încercați versiunea Beta 2, puteți să o descărcați de aici: http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx.

Sunt multe îmbunătățiri aduse de la Beta 1, cea mai importantă fiind faptul că acum există suport complet pentru C# 3.0 în IDE. Mai exact LINQ este integrat complet în IDE (auto-complete) șamd.

Vă invit să încercați această versiune și să reveniți cu părerile voastre despre Beta 2 de Visual Studio 2008.

Mai este un pic și ajungem să vedem și RTM-ul!

Technorati tags: , , , , ,

Crezi că Vista are vulnerabilități de securitate?
 

"In all four cases studied for the 6 month period after ship, Windows Vista appears to have a lower vulnerability fix and disclosure rate than the other products analyzed, including the reduced Linux installations" Jeff Jones.

 

Mai multe detalii aici. Și dacă vă întrebați cine face această afirmație, citiți aici.

Technorati tags: , , ,

Visual Studio Codename Orcas Beta 1 și Windows Longhorn Server Beta 3 - disponibile pentru download

Dacă vă interesează să încercați noua versiune de Visual Studio (Codename "Orcas") puteți descărca o imagine virtuală a acestui produs de aici. Printre noutățile aduse de această versiune se numără LINQ, integrarea cu WPF la nivel de designer și multe, multe altele. De asemenea, sunt disponibile și versiunile Express la adresa: http://msdn.microsoft.com/vstudio/express/future/default.aspx.

Dacă vreți să încercați următoarea generație de servere Windows (Longhorn Server) acum aveți ocazia. Beta 3 a acestui produs a fost publicată la adresa http://www.microsoft.com/getbeta3 . Tot pe acel site puteți vedea care sunt cerințele minime de sistem precum și ce variante de server vor fi disponibile.

Dacă ați încercat aceste produse sunt curios ce impresie v-au lăsat și unde credeți că ar mai fi loc de mai bine.

Technorati tags: , , , ,

De unde atâta nesimţire?!?

Zilele astea am avut de făcut mai multe cumpărături, în special de natură tehnică. Peste tot am dat numai peste nişte "meseriaşi" care făceau totul într-un sictir desăvârşit.

Prima reprezentaţie s-a dat la sediul unei firme ce vinde componente hardware. Am făcut comanda online, am fost sunat de reprezentantul de vânzări pentru a confirma şi totul părea ok. Ajung acolo, plătesc comanda şi vine o tipă din spate cu două plăcuţe de memorie SDRAM în mână (adică fără nici un fel de protecţie) şi mi le pune senină în mână. Zic: Şi ceva în care să le pun? Răspuns: Pot să vă ofer o foaie de hârtie A4. Iniţial am crezut că glumeşte... Dar nu, a scos prompt o foaie de hârtie ca să le împachetez...

După care, în Ploieşti la un magazin de calculatoare de unde am vrut să iau un cablu de date inversat (crossover) şi două CD-uri blank. Ar părea aşa o comandă simplă, numai că a durat 30 de minute (pe ceas). Întâi a durat câteva minute să mi se preia comanda (că nu se poate face o comandă telefonică...), după care am stat la o altă coadă ca să plătesc comanda. Abia după ce am plătit factura s-au apucat de treabă... Nu cumva să dau comanda şi să plec. Crearea cablului a mai durat vreo 15 minute. Ce or fi făcând atâta, nu ştiu. Oricum, după ce mi-au oferit cablul am cerut să fie testat în faţa mea, ca să mă asigur că nu avea probleme. Răspunsul: L-am testat eu, şi merge. Zic, bine, bine, dar vreau să văd şi eu. Păi nu se poate, că nu avem baterie în tester şi nu avem cum să vă arătăm, dar l-am băgat în switch şi a mers... Bine că avea garanţie(!).

Ajung în Bucureşti şi intru la un mare magazin care presupune că totul în universul ăsta este legat de media. Căutam nişte DVD-uri goale ca să îmi scriu nişte filme pe ele. După ceva căutare prin magazin (că nu era mai nimeni pe acolo) dau în sfârşit de standul de CD-uri şi DVD-uri. Acolo nu erau preţuri decât pentru vreo jumătate din produse. Merg să caut pe cineva pe care să întreb - nimic. Dau în cele din urmă de o tipă care stătea pe lângă casele de marcat şi o întreb. Răspunsul: nu mai este nimeni acolo. A plecat acasă... O fi fost obosit.

După care am mers într-un depozit să caut o cameră web. Intru în magazin şi întreb de o cameră web. Mă trimite persoana pe care o întrebasem la un coleg de-al ei. După câteva ping-pong-uri de la o persoană la alta, ajung în final la "meseriaşul" care se ocupa de camere web. Numai că era ocupat. După ce s-a eliberat, încep să îl înteb de camere web. Răspunsurile veneau cu atâta sictir, încât ziceai că este sub demnitatea lui să se ocupe de camere web...Probabil că aştepta promovarea la asamblare PC-uri.

Şi ultima aventură, tot la depozit. La alt depozit. Găsesc acolo tot ce am nevoie şi zic că vreau să plătesc cu cardul. Totul părea ok. Numai că numele de pe card nu corespundea cu numele din buletin. Aşa ceva nu se poate spuse vânzătorul. Zic eu nedumerit: Dar de ce?!? Pentru că de unde ştiu eu că nu aţi furat cardul şi apoi aţi venit să plătiţi cu el. Pare logic, nu? Fur un card de credit, aflu pin-ul acelui card (prin spiritism probabil) şi apoi vin CU BULETINUL la un magazin să cumpăr o cameră web. Aşa ar face orice hoţ, nu? Deci trebuie să ne păzim. Numai că, dacă vin cu banii numerar, nu mai are nimeni nimic de comentat (chiar dacă banii au fost scoşi de pe acelaşi card)...

Unde am vrut să ajung cu toate aceste povestiri? La concepţia vânzătorului cum că el este cel mai important şi nu clientul. Ce dacă respectivul client nu mai vine niciodată să cumpere de acolo? Cu ce îl atinge pe vânzător această situaţie? Cu nimic. Iar dacă firma la care lucrează respectiva persoană are şi o poziţie monopolistă pe piaţă (nu mai are nimeni respectivul produs) nesimţirea vânzătorilor creşte proporţional. Singura metodă de răspuns la nesimţirea vânzătorilor este să vorbeşti cu managerul lor (cel puţin asta este părerea mea). Din păcate şi managerii vânzătorilor au aceeaşi mentalitate.

S-a mai întâlnit cineva cu situaţii similare? Sau sunt un caz izolat şi am avut ghinion?

Technorati tags: , ,

Orcas March CTP

Wow!

Chiar dacă au întârziat un pic faţă de ceea ce anunţaseră iniţial, aşteptarea a meritat. Noul CTP vine cu o groază de lucruri noi. Din punctul meu de vedere, unul dintre cele mai cool lucruri introduse acum este suportul de IntelliSense pentru tipurile anonime, precum şi suport complet pentru sintaxa LINQ.

În plus, mi se pare interesant şi faptul că acum Visual Studio ştie să calculeze complexitatea ciclomatică a codului (sper că am scris corect), împreună cu alţi câţiva indicatori. Aceşti indicatori pot fi consideraţi metrici de scriere a codului, metrici la îndemâna oricui.

De asemenea, în sfârşit, există suport în IDE pentru dezvoltarea aplicaţiilor pentru .NET 3.0 (WPF, WCF, WF) ceea ce va uşura munca celor care dezvoltă aplicaţii în aceste tehnologii.

Pentru mai multe detalii despre ce conţine acest CTP, vizitaţi pagina oficială de download. Download-ul are 4GB, dar dacă vreţi să vă faceţi o părere asupra noului Visual Studio, merită!

PS: Nu recomand instalarea lui pe o maşină din producţie (încă).

Technorati tags: , , , , , , , ,

Orcas February CTP

Se pare că următorul CTP de Orcas va veni în martie şi nu în februarie aşa cum era anunţat iniţial. CTP-ul din martie va avea (în sfârşit) aceleaşi funcţionalităţi (în ceea ce priveşte LINQ) ca şi CTP-ul din Mai 2006 pentru LINQ. Probabil că de acum înainte nu vom mai avea CTP-uri separate pentru LINQ, ci numai CTP-uri de Orcas.

Detalii pe forum-ul LINQ: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1180478&SiteID=1

Technorati tags: , , , ,

System.Numeric.BigInteger

În versiunea Orcas de .NET s-a introdus un nou namespace: System.Numeric. În acest namespace se regăseşte momentan (doar) tipul de date BigInteger. Pe viitor probabil că se vor implementa şi alte tipuri de date (sau operaţii) care să folosească numere mari. Bine că a apărut... Java îl avea de ceva vreme. Pe de altă parte, dacă nu a apărut decât acum înseamnă că nu prea a fost cerut/folosit până acum.

Când spun mari, înseamnă mari Smile. Nu mai sunt limitate numerele la tipurile de bază (int, long, etc). Mai multe detalii pe blog-ul echipei BCL: http://blogs.msdn.com/bclteam/archive/2007/01/16/introducing-system-numeric-biginteger-inbar-gazit.aspx.

Las cititorului ca exerciţiu implementarea unui tip de date BigFloat care să permită operaţii cu numere reale (folosind BigInteger).

Technorati tags: , ,

Tipuri anonime în C# 3.0

Un alt feature introdus în C# 3.0 este reprezentat de tipurile anonime. Înainte de a vedea ce înseamnă acest lucru, să vorbim despre cuvântul cheie var ce a fost introdus în C# 3.0 şi cu ajutorul căruia vom putea defini tipuri anonime (şi nu numai).

Cuvântul cheie var este folosit pentru a spune compilatorului că tipul variabilei trebuie să fie determinat din context. De exemplu construcţiile

var i = 1; 
var s = "Un text";

sunt echivalente cu:

int i = 1;
string s = "Un text";


Compilatorul determină în mod automat tipul de date al variabilelor pe baza expresiei de iniţializare. Trebuie menţionat faptul că var nu înseamnă că în respectiva variabilă se poate stoca orice tip de date. Tipul de date pentru variabila respectivă este determinat de compilator şi nu se modifică la rularea programului. De asemenea, var nu vine de la variant şi nici din JavaScript. Dacă vreţi, var reprezintă pur şi simplu o scurtătură în scrierea tipurilor de date.

Dictionary<string, List<Pair<int, string>>> myObject = 
   new Dictionary<string, List<Pair<int, string>>>(); 

Aceeaşi structură din punct de vedere sintactic poate fi obţinută prin:

var myObject = new Dictionary<string, List<Pair<int, string>>>();

Motivul pentru care există acest cuvânt cheie în C# este că, uneori, nu ştiu numele tipului pe care vreau să îl folosesc. În exemplul de mai sus, ştiu clar că myObject va fi de tipul Dictionary<string, List<Pair<int, string>>>(), iar cuvântul cheie var mă scapă de scrierea de două ori a aceluiaşi lucru. Totuşi, în construcţia de mai jos, acest lucru nu mai este valabil:

var myTip = new { Nume = "Ion", Prenume = "Marinescu" };

De ce tip este variabila myTip? Variabila myTip este definită folosind un tip anonim care nu este definit nicăieri. Fără existenţa cuvântului cheie var nu aş fi avut cum să definesc o variabilă de un tip anonim pentru că, pur şi simplu nu aş cunoaşte numele tipului. Folosind var acest lucru nu mai este imposibil deoarece compilatorul se va ocupa de "partea murdară" a lucrurilor:

  • Va genera un tip de date corespunzător pe baza expresiei de iniţializare a variabilei
  • Va defini variabila myTip de tipul generat de el.

După definirea variabilei myTip ca mai sus, aceasta va putea fi folosită ca şi cum ar exista un tip de date cu cele două proprietăţi. De fapt, un asemenea tip de date există! Este definit de compilator şi arată cam aşa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[CompilerGenerated, DebuggerDisplay(@"\{ Nume = {Nume}, Prenume = {Prenume} }", Type="<Anonymous Type>")]
internal sealed class <>f__AnonymousType0<<>j__AnonymousTypeTypeParameter1,
<>j__AnonymousTypeTypeParameter2>
{
// Methods
[DebuggerHidden]
public <>f__AnonymousType0();
[DebuggerHidden]
public override bool Equals(object);
[DebuggerHidden]
public override int GetHashCode();
[DebuggerHidden]
public override string ToString();
// Properties
public <>j__AnonymousTypeTypeParameter1 Nume { [DebuggerHidden] get; [DebuggerHidden] set; }
public <>j__AnonymousTypeTypeParameter2 Prenume { [DebuggerHidden] get; [DebuggerHidden] set; }
// Fields
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private <>j__AnonymousTypeTypeParameter1 <>i__AnonymousTypeField3;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private <>j__AnonymousTypeTypeParameter2 <>i__AnonymousTypeField4;
}

Deoarece compilatorul generează tipul de date, construcţia rămâne type-safe (în Nume nu voi putea pune altceva decât un string).

Tipurile anonime sunt extrem de utile în conjuncţie cu LINQ. LINQ permite rularea de interogări (similare cu interogările SQL) asupra obiectelor. Una dintre operaţiile des folosite în SQL este cea de proiecţie (extragerea unor anumite coloane dintr-o tabelă). În lumea obiectelor, operaţia de proiecţie se traduce prin construirea de noi obiecte care să conţină doar proprietăţile cerute prin operaţia de proiecţie. Iar aceste tipuri de date sunt tipuri anonime, generate în mod automat de compilator.

De exemplu:

var s = from c in Customers 
where c.City == "Bucureşti" 
select new { Nume = c.CustomerName, id = c.CustomerID }; 

Structura de mai sus determină preluare din variabila Customers (care trebuie să implementeze IEnumerable<T> sau Iqueryable<T>) doar acei clienţi pentru care oraşul este "Bucureşti". Din toate proprietăţile obiectelor din colecţia Customers mă interesează doar CustomerName şi CustomerID pe care vreau să le selectez într-un nou obiect (definit de un tip de date anonim) şi să le schimb numele în Nume şi id. Acum se pot folosi obiectele definite de noi pentru afişare aşa:

foreach (var v in s) 
{ 
  Console.WriteLine(string.Format("{0} {1}", v.Nume, v.id)); 
} 

Observaţi folosirea cuvântului var în cadrul buclei foreach. Cum nu ştiu cum se numeşte tipul de date care stochează datele mele, îl las pe compilator să determine care este acest tip şi apoi pot să folosesc proprietăţile definite de mine în cadrul interogării.

Compilatorul va avea grijă să creeze tipul de date anonim care să conţină cele două proprietăţi, şi ca acestea să fie invocate la momentul potrivit. De asemenea, va avea grijă să refolosească tipurile anonime definite, astfel încât să nu genereze mai multe tipuri de date decât este nevoie.

Am auzit remarci de genul: înlocuirea declaraţiei tipului de date cu var (ca în exemplul cu Dicţionarul) va face codul mai greu de citit. Acest lucru este posibil, numai că nu ne forţează nimeni să folosim de acum înainte numai cuvântul cheie var pentru a defini tipul variabilei.

Tipurile anonime au fost introduse pentru a suporta LINQ, iar folosirea elementelor introduse şi în afara LINQ nu sunt altceva decât "bonus-uri".

Sper că această expunere v-a lămurit ce sunt tipurile anonime, de unde apar şi la ce sunt bune.

Technorati tags: , , , ,

Technorati şi StudentClub

Dacă aveţi un blog pe StudentClub şi nu doriţi funcţionalitatea aceasta, vă rog să îmi daţi un semn.

Pe scurt ce face acel modul: Preia categoriile definite pentru un post şi adaugă la sfârşitul postului link-uri către categoriile echivalente din Technorati.

Technorati tags: , ,

GlobalTagsModule pentru Community Server 2.1

O facilitate pe care aş fi dorit să o văd în motorul de blogging de la Community Server este legăturilor cu un motor de categorisire extern (gen Technorati). E drept, Community Server vine cu un motor care permite categorisirea post-urilor în oricâte categorii, dar aceste categorii sunt limitate la comunitatea care le-a definit. Eu aş fi dorit ca toate categoriile definite pentru un post să fie (şi) legături către un site extern, de exemplu Technorati. În acest fel, posturile scrise de mine să fie puse la un loc cu posturile scrise de alţi bloggeri din întreaga lume.

Din păcate, o asemenea funcţionalitate nu există "out-of-the-box" în Community Server. Din fericire, Community Server este o platformă deschisă, care permite dezvoltarea de module care să extindă funcţionalitatea iniţială a platformei.

Pentru a extinde Community Server cu o asemenea funcţionalitate am decis să îmi implementez propriul modul care să preia categoriile asociate cu un post şi să creeze o listă de link-uri către un site extern de categorisire. În cazul meu, motorul extern este Technorati, dar se poate modifica acest lucru printr-o setare în fişierul de configurare. Deoarece este posibil ca nu toată lumea să dorească această funcţionalitate, tot prin intermediul unei setări se pot specifica blog-urile pentru care nu se va face această procesare.

Dezvoltarea unui astfel de modul se reduce la implementarea unei interfeţe (ICSModule) definite în CommunityServer.Components.dll. Interfaţa defineşte o singură metodă:

1
public void Init(CommunityServer.Components.CSApplication csa, System.Xml.XmlNode node) 

În cadrul acestei metode se pot defini handlere pentru o serie de evenimente lansate de către CommunityServer în timpul procesării unui post. Pentru a interveni în procesul de afişare al unui post, este suficient să se adauge un handler pentru evenimentul PreRenderPost:

csa.PreRenderPost += new CommunityServer.Components.CSPostEventHandler(csa_PreRenderPost);

Acel eveniment se va apela de fiecare dată când se doreşte afişarea unui post. În cadrul acestui handler construiesc lista de link-uri către site-ul extern şi îl adaug la textul deja existent:

1
2
3
4
5
6
7
8
9
10
11
void csa_PreRenderPost(CommunityServer.Components.IContent content,
CommunityServer.Components.CSPostEventArgs e)
{
if (e.ApplicationType == CommunityServer.Components.ApplicationType.Weblog)
{
if (content.GetType() == typeof(CommunityServer.Blogs.Components.WeblogPost))
{
content.FormattedBody += BuildCategories(content);
}
}
}

Iar funcţia care construieşte lista este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private string BuildCategories(CommunityServer.Components.IContent content) 
{
try
{
WeblogDataProvider myProvider = WeblogDataProvider.Instance();
WeblogPost myFullPost = myProvider.GetWeblogPost(
(content as WeblogPost).PostID,
true,
(content as WeblogPost).IsApproved);
//if the blog is configured not to have its categories transformed,
//then we return string.Empty.
if (myRemovedBlogs.Count > 0)
{
if (myRemovedBlogs.Contains(myFullPost.Weblog.ApplicationKey))
{
return string.Empty;
}
}
StringBuilder myBuilder = new StringBuilder();
if (myFullPost.HasCategories)
{
myBuilder.AppendFormat("<p>{0}", myDisplayText);
foreach (string myCategory in myFullPost.Categories)
{
myBuilder.AppendFormat("<a href=\"{0}\" rel=\"tag\">{1}</a>, ",
string.Concat(mySiteAddress, "/", HttpUtility.UrlEncode(myCategory)),
myCategory);
}
myBuilder.Remove(myBuilder.Length - 2, 2);
myBuilder.Append("</p>");
}
return myBuilder.ToString();
}
catch { return string.Empty; }
}

Acesta este tot codul necesar pentru a transforma categoriile definite în Community Server în link-uri spre categorii definite pe site-uri externe.

Instalarea acestui modul este la fel de simplă:

  • Se copiază dll-ul GlobalTagsModule.dll în directorul bin al Community Server
  • Se adaugă la secţiunea <CSModules> din CommuniyServer.config următorul nod. (Atributele DisplayText şi SiteAddress pot lipsi, valorile lor default fiind cele de mai jos)
<add name="CategoryTags"
     type="Ghiondea.GlobalTags.CSModule,GlobalTagsModule" 
     DisplayText="Technorati Tags: " 
     SiteAddress="http://www.technorati.com/tag">
</add> 

Dacă sunt blog-uri pentru care nu se doreşte această funcţionalitate, acestea se pot specifica în felul următor:

<add name="CategoryTags" 
     type="Ghiondea.GlobalTags.CSModule,GlobalTagsModule" 
     DisplayText="Technorati Tags: " 
     SiteAddress="http://www.technorati.com/tag"> 
  <remove>AppKey</remove>
</add>
  • Se restartează aplicaţia (prin modificarea web.config)

Modulul este ataşat acestui post.

Technorati tags: , , , ,

Extension Methods în C# 3.0

Una dintre cele mai interesante facilităţi introduse în C# 3.0 este, după părerea mea, noţiunea de Extension Methods. Problema pe care încearcă să o rezolve aceste metode este aceea în care există o clasă ce implementează un anumit comportament (i.e. de business). Respectiva clasă a fost dezvoltată de o firmă şi a fost gândită să fie sealed, astfel încât să nu poată fi moştenită şi să nu se poată adăuga noi funcţionalităţi la ea. Peste ceva timp, se descoperă că mai este nevoie să se adauge o funcţionalitate în cadrul clasei respective. Din păcate, cel care a scris iniţial clasa nu doreşte să o adauge şi nici să facă respectiva clasă "unsealed".

Care ar fi soluţia? Păi, implementarea unui wrapper peste clasa respectivă care să adauge funcţionalitatea dorită, iar apelurile către acea clasă să fie făcute prin intermediul acelui wrapper. Din păcate, această soluţie este un pic murdară, în sensul că se complică foarte mult codul.

Prin intermediul Extension Methods se pot adăuga metode noi unor clase deja existente, fără a fi nevoie să fie modificate respectivele clase. Aceste metode vor putea fi apelate ca şi cum ar fi metode "native" ale clasei.

Să luăm de exemplu cazul în care avem de implementat un program care face foarte multe operaţii aritmetice pe liste de numere întregi. Mi-ar fi util ca atunci când programez să pot să scriu, pentru fiecare obiect ce conţine numere întregi ceva de genul:

int[] numere = { 1, 2, 3, 4, 5, 6 }; 
double media = numere.Media(); 

Metoda Media() este o Extension Method care a fost definită de mine şi care calculează media aritmetică a unui set de numere. Această metodă poate fi acum aplicată asupra oricărui obiect care implementează IEnumerable<int>, iar acest lucu mă ajută pe mine să scriu cod mult mai lizibil şi mult mai repede. În plus, se pot grupa aceste Extension Methods în librării pentru a fi mai uşor de folosit.

Ce anume se întâmplă la compilare cu structura de mai sus? Compilatorul va determina care este Extension Method-ul invocat şi îl va apela, trimiţând ca parametru obiectul asupra căruia se aplică metoda. Codul generat de compilator este:

double num1 = MyExtension.Media(new int[] { 1, 2, 3, 4, 5, 6 });

După cum se poate observa, în cele din urmă aceste Extension Methods nu sunt altceva decât "syntactic sugar", adică nişte artificii de sintaxă care ne fac viaţa mai uşoară. Compilatorul este responsabil de transformarea sintaxei numere.Media() în apeluri ale metodei definite de mine.

Extension Methods sunt definite sub forma unor metode statice definite în nişte clase statice. Pentru ca un grup de Extension Methods să fie luate în considerare de către compilator, namespace-ul în care acestea sunt definite trebuie să fie importat, folosind directiva using: using MyExtensions; La compilare se vor verifica Extension Method-urile definite în namespace-urile referite şi, dacă se găseşte o metodă cu numele şi semnătura potrivită, se va înlocui cu apel similar cu cel prezentat mai sus.

Modul în care sunt definite Extension Method-urile este unul simplu. După cum am spus mai sus, aceste metode sunt metode statice, definite în interiorul unor clase statice. Pentru a fi recunoscute ca şi Extension Methods, metodele trebuie să definească primul parametru de tipul de date extins prefixat de cuvântul cheie this. Dacă este nevoie, se pot defini şi alţi parametrii pentru un Extension Method.

public static double Media(this IEnumerable<int> ListaNumere) 
{ 
  double media = 0; int index = 0; 
  foreach (int i in ListaNumere) 
    { media += i; index++; } 
  return media / index; 
} 

În C# 3.0 acest mecanism numit Extension Methods stă la baza LINQ. Operaţiile suportate de către LINQ (Select, Where, GroupBy, etc.) sunt implementate folosind Extension Methods deoarece, în acest fel se pot extinde tipurile de date deja existente cu capabilităţi de interogare. Despre celelalte feature-uri apărute în C# 3.0 vom vorbi cu altă ocazie. Până atunci, încercaţi să folosiţi Extension Methods ca să vă convingeţi de utilitatea lor.

Technorati tags: , , , ,

Obţinerea diplomei de absolvent al UPB

Pentru cei care au absolvit anul 5 mai este un hop care trebuie trecut: obţinerea diplomei şi a suplimentului de diplomă. Lucrurile ar trebui să fie simple: te prezinţi la secretariat, depui o cerere şi apoi ridici diploma.

Pe adeverinţa eliberată de facultate după absolvire se specifică valabilitatea acesteia ca fiind de 1 an, adică până la 30 iulie 2007. Totuşi, dacă vrei să îţi iei diploma mai devreme, se poate. Mai ales că diplomele sunt gata din noiembrie 2006!

Întrebarea (retorică) este: ce poate dura atât de mult? De ce nu se pot obţine diplomele decât la un an diferenţă? Ei bine, este un mit. Singura piedică în obţinerea mai repede a diplomei este secretariatul facultăţii care trebuie să emită suplimentul de diplomă, supliment ce este, de fapt, foaia matricolă (cu notele). Acest supliment este şi tradus în engleză, lucru care te scuteşte de nişte bani daţi pe traducere. Dar de drumul la notar tot nu scapi pentru că diploma nu este tradusă. Oare nu se putea face în aşa fel încât diploma să fie şi ea tradusă?

Trecând peste acest aspect, dacă vreţi să vă obţineţi diploma, mergeţi la decanatul facultăţii şi depuneţi cererea. Probabil că va dura câteva zile bune (dacă nu staţi pe capul lor) dar se poate. Ştiu asta pentru că eu am fost primul din Facultatea de Automatică şi Calculatoare / Automatizări care şi-a luat diploma şi, mai important, suplimentul.

Asta înseamnă că tot ce putea să meargă mai prost (formulare incomplete, alergare după completarea formularelor, etc) deja a mers prost. Prin urmare, reiau şi eu ideea lui Ovidiu de a merge în masă să vă cereţi diploma. Se poate şi nu depinde decât de secretariatul facultăţii. Pentru unii o veste bună, pentru alţii un început de coşmar.

Baftă!

Technorati tags: , , ,

Visual Studio codename "Orcas"

Zilele recute s-a lansat un nou CTP pentru următoarea versiune de Visual Studio, cu numele de cod "Orcas".

Acest CTP este prima versiune care poate fi instalată, versiunile anterioare fiind distribuite ca şi imagini de maşini virtuale. Şi această versiune poate fi descărcată ca şi imagine de Virtual PC, iar pe site-ul de download se recomandă instalarea produsului pe o maşină care nu este folosită în producţie.

Noutatea majoră (din punctul meu de vedere) cu care vine acest CTP este integrarea cu LINQ la nivelul CTP-ul din mai al acestuia (Linq).

Pentru a descărca această versiune vizitaţi Microsoft Downloads. Pentru mai multe informaţii despre LINQ vizitaţi site-ul MSDN.

Technorati tags: , , , ,

Despre LINQ, C# 3.0 şi programarea funcţională

Pentru cei interesaţi de LINQ, Eric White, developer în echipa de XLINQ a scris o serie de articole în care prezintă LINQ din prisma programării funcţionale.

Articolul este plin de detalii tehnice pe care eu le apreciez, precum şi de exemple din lumea reală. El prezintă modul în care a folosit XLINQ la extragerea codului şi comentariilor dintr-un fişier Word 2007. Cool!

Adresa este: http://blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx

Technorati tags: , , ,

La mulţi ani 2007!

La mulţi ani şi tot ce vă doriţi de la noul an să se împlinească!

Cum anul acesta, înainte de sărbători am trecut printr-o operaţie destul de migăloasă, sărbătorile le-am făcut în familie. A fost super frumos.

De Revelion am vrut să ne uităm, ca în fiecare an, la programul de revelion de la TV. Numai că nu prea am avut de unde alege. În afară de manele şi seriale româneşti nu prea ai avut la ce să te uiţi. Cred că anul ăsta am avut cel mai nasol program TV de Revelion. Dar, chiar şi aşa, am găsit, când la o televiziune, când la alta, ceva la care să ne uităm. Ne-am uitat un pic şi la cuvântările EuroParlamentarilor sau ce or fi, care au venit să ne ureze bine aţi venit în UE. Ce m-a şocat este că am nimerit tocmai când o doamnă parlamentar a decis că, la cumpăna dintre ani, este momentul propice pentru a saluta comunitatea maghiară din România, în limba maghiară. Nu vreau să credeţi că am ceva cu ungurii. Am buni prieteni care sunt maghiari. Numai că gestul acestei doamne m-a dezgustat profund. Nu se face aşa ceva!

Bun. Şi acum că v-am spus ce m-a enervat pe mine de Revelion, vă urez încă o dată "La mulţi ani!", multe reuşite şi tot ce vă doriţi! Să ne auzim (citim) cu bine şi în 2007.

Technorati tags: , ,

Acum şi SP2

Sebi tocmai mi-a spus că a apărut SP2 pentru Community Server. Cum sunt câteva bugfix-uri în SP2, de acum StudentClub.ro rulează Community Server 2.0 SP2.

Tot Sebi lucrează la un tool de migrare a datelor din mai multe baze de date de Community Server într-una singură. În ritmul ăsta de lansări de Service Pack-uri, treaba lui Sebi devine pe zi ce trece mai ingrată Smile, pentru că fiecare Service Pack schimbă structura bazei de date.

Technorati tags: , ,

La mulţi ani! Microsoft România

Ieri, Microsoft România a sărbătorit 10 ani de existenţă. Petrecerea de sărbătorire a fost la Ateneul Român, a cuprins un concert şi a fost super! 

La mulţi ani! şi la multe succese!

Technorati tags: ,

More Posts Next page »