RONUA Bucuresti, 6 martie 2012 , ora 18:30

Florin Matinca  va prezenta

API si aplicatii mobile

  • Scurta introducere despre utilizarea API-urilor in aplicatiile mobile
  • Ce optiuni avem daca dorim sa ne construim un API ?
  • DEMO 1 iOS – Utilizarea StackMob si Parse pentru a construi un API
  • DEMO 2 Windows Phone – Utilizarea ASP.NET Web API (http://www.asp.net/web-api) cu deploy in Windows Azure pentru a construi un API
  • Scurta introducere in Push Notifications
  • DEMO 3 Trimiterea de Push Notifications prin intermediul Windows Azure catre iOS si Windows Phone
  • Incheiere + Referinte utile

Update:
KINECT

Andrei Ignat va face un demo de programare cu Kinect, http://www.microsoft.com/en-us/kinectforwindows/.  Va fi prezentat SDK, modul de a salva imagini si de recunoastere a gesturilor.

Data:06.03.2012, ora 18:30

Locaţie: Sediul TeamNet , sala Training Multifunctionala.

Str. Splaiul Independentei, No. 319,  RIVER Place, RIVERVIEW House, etaj 8,Sector 6,
(la parter este o clinica CMU)

Harta: click aici (se va deschide în fereastra nouă)

Detalii acces: Evenimentul se desfăşoară în Sala E8.
Poți ajunge aici cu următoarele mijloace de transport în comun:

linia 40 (autobuz) sau Maxi-Taxi sau Metrou , statia Petrache Poenaru.

Dacă vrei să ne prezinţi ceva conex cu temele de mai sus, autopropune-te aici.

Trusa de scule 1- FileHelpers

Orice aplicatie are nevoie sa importe date. Cel mai simplu import de date este cel din fisiere de tip csv . Dar fiecare fisier CSV contine alte date –si trebuie de fiecare data sa facem maparea intre proprietatile clasei si pozitia in header. Mai mult, ce ar fi daca am vrea specificarea datei in doua moduri – yyyy-MM-dd si dd-MM-yyyy ?

Ca raspuns la aceasta exista FileHelpers – o librarie care va asigura importarea rapida a oricaror fisiere clar delimitate.

De exemplu sa presupunem ca vrem sa importam un fisier de GeoLocatii de la MaxMind, de forma

Copyright (c) 2007 MaxMind LLC.  All Rights Reserved.
locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
1,”O1″,””,””,””,0.0000,0.0000,,
2,”AP”,””,””,””,35.0000,105.0000,,
3,”EU”,””,””,””,47.0000,8.0000,,

….

Trebuie sa ignoram la import primele 2 linii( copyright + header) si sa importam liniile urmatoare.

E simplu atunci: cream o clasa identica

 

[DelimitedRecord(“,”)]
    public class GeoLocation
    {
        public int Id { get; set; }
        public string CountryCode { get; set; } // TODO : create an enum Country and a mapper string->enum
        public string RegionCode { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }

        public float Latitude { get; set; }
        public float Longitude { get; set; }
        public string metroCode{ get; set; }
        public string areaCode { get; set; }
        public GeoLocation()
        {
           
        }
    }

 

iar de importat o facem cu urmatoarele rinduri

 

public IEnumerable<GeoLocation> ImportLocations(string csvFilePath, int HeaderLines=2)
        {
            DelimitedFileEngine engine = new DelimitedFileEngine(typeof (GeoLocation));
            engine.Options.IgnoreFirstLines = HeaderLines;           
            return engine.ReadFile(csvFilePath) as GeoLocation[];
        }

 

Ati observat ca are

engine.Options.IgnoreFirstLines = HeaderLines;

Ca sa ignoram, asa cum am spus, primele 2 linii.

Ceea ce mai avem de facut este sa obtinem datele:

var locations = (new CsvImporter()).ImportLocations(@”GeoLiteCity-Location.csv”);

Note:

Tutorial online la http://www.codeproject.com/Articles/12170/FileHelpers-v2-0-Delimited-CSV-or-Fixed-Data-Impor

Free source la http://www.filehelpers.com/

2+2=4

Am decis sa reactivez cartea despre ce poti face cu VS2010 , Baby Steps in VS2010… .

O sa fac in curind o noua editie – cu coduri sursa cu tot. Despre ce e vorba?

In aceasta carte vom arata prin ce trece un programator incepator si ce poate face el usor in Visual Studio 2010 si .NET 4.0 .

Vom face o aplicatie simpla, pe care o vom trece prin mai multi pasi ca sa acoperim (aproape) toate domeniile aplicatiilor ce se pot dezvolta cu .NET.

Vom face abstractie ca majoritatea aplicatiilor pe care le dezvolta un programator sunt deja facute – si ca, de obicei, ce facem sunt imbunatatiri ale vechilor programe. La fiecare episod vi se va da o tema * si va invit sa rezolvati tema . Actorii principali vor fi Popescu – un programator incepator ce se lupta sa stapineasca VS2010 si Ion – tipul de la vinzari care vine cu idei noi.

Cuprinsul este acesta:

Episodul întâi – primul program consolă
Episodul al doilea– internaţionalizarea şi globalizarea
Episodul al treilea –refactorizare şi alte tipuri de proiecte
Episodul al patrulea–Generics şi dynamic
Episodul al cincilea : Argumente opţionale şi expresii lambda(funcţii)
Episodul al şaselea– use case şi  internet (înregistrarea clienţilor  şi asp.net )
Episodul al şaptelea –deschiderea aplicaţiei internet catre Alţii  WebService şi /sau WCF
Episodul al optulea – deschiderea catre lumea Office şi COM.
Episodul al nouălea – F#
Episodul al zecelea– Workflow cu WCF
Episodul al unsprezecelea– Sql Server CLR
Episodul al doisprezecelea – Window Phone 7
Partea întâi
Partea a doua : Windows Phone 7 consumind un WCF Service
Episodul al treisprezecelea – WPF
Episodul al paisprezecelea– Silverlight
Episodul al cincisprezecelea – Asp.NET MVC
Episodul al saisprezecelea – LightSwitch (WPF/Silverlight)
Episodul al saptisprezecelea – alte lucruri interesante şi enjoy the trip!

Ce mai ramine de facut:

TODO VS2010 : Azure, Reporting , Sharepoint, DatabaseProject, SetupProject, Extensibility, TestProject, CodeAnalysis,Help, Ajax cu Jquery ,MEF, etc

TODO .NET 4 : CodeContracts, Parallel Extensions, (contra)variance, Tuples, SortedSet ,BigInteger

Sper că v-a placut şi vă aştept cu sugestii şi participare!

Dacă vreţi să participaţi sau să primiţi următoarele versiuni, vă rog să îmi trimiteţi email .

De downloadat gasiti aici

http://ronua.ro/CS/media/p/216886.aspx

Ce am invatat de la PMKB–partea 1

Vorbesc acum din punct de vedere al codului

  1. Ca e bine sa iti scrii ce ai invatat despre cum se fac cererile Ajax – ca sa nu ai probleme cind vrei sa faci copy /paste de la tine http://bit.ly/mvc_ajax_jquery
  2. Ca se poate usor implementarea de plugin-uri in MVC – vezi proiectele Plugin_AddFile si Plugin_DisplayFavorites – care pun view-urile si controller-ele separat
  3. Ca EF4.1 si SqlServer CE merg bine impreuna – si  , mai ales, e usor de “mutat” proiectul pe oricare masina
  4. Ca e bine sa iti testezi sursele – macar dpdv integrare cu BD
  5. Ca e bine sa ai , chiar si pentru un proiect open source, un issue tracker http://pmkb.codeplex.com/workitem/list/advanced 
  6. Ca e bine sa cunosti cit mai multe tool-uri – de exemplu, PagedList si RazorGenerator sunt 2 dll-uri pe care le folosesc aproape la orice proiect MVC.
  7. Ca e bine sa ceri sfatul altora – care o sa vina cu idei ulterioare de dezvoltare.
  8. Ca e bine sa ai un ajutor – Alexandru Pascanu a descoperit ca nu aveam favicon si dadea eroare, m-a ajutat sa fac Validarea entitatilor …

 

Daca vreti sa participati la proiect, instalati EF4.1 si SqlServer Compact4.0,  descarcati proiectul de la adresa http://pmkb.codeplex.com/ si jucati-va cu el. Dupa aceea , uitati-va la issue-urile de la http://pmkb.codeplex.com/workitem/list/advanced si fie adaugati una, fie rezolvati una.

Lauda de sine cu Asp.NET(2)

image

 

A doua oara pe www.asp.net  cu Clearer : http://clearer.codeplex.com/  – un proiect in MVC prin care va puteti administra Application/Cache/Session/Cookies .

Gasiti sursele la http://clearer.codeplex.com/  , NuGet la https://nuget.org/packages/clearer si blog post in engleza la http://msprogrammer.serviciipeweb.ro/2012/01/30/clearer-mvc/

Si poate face cineva in ASP.NET WebForms – eu, din pacate, nu mai vreau sa fac in WebForms….

HTML 5 + javascript

In Bucuresti MSFT tine prezentare despre HTML5 . Bucata de javascript e deosebita- iar cea de HTML e buna.

Prezentatori: Catalin Criveteanu si Remus Pereni. Am fost si mi-a placut.

 

Daca v-am stirnit interesul , aveti detalii aici:

http://www.facebook.com/events/268081126591517/

(

Introducere în HTML5 și CSS3
– HTML5: navigation, semantics, video, storage
– CSS3: media queries, selectors, web fonts, transitions, multiple columns, multiple backgrounds, forms
• Exemplificarea noilor elemente într-un CMS
• ECMA 5 JavaScript – noutăți de limbaj și discuții detaliate pe diverse scenarii

)

Anul 2011 in review

Citez ( fara rusine Winking smile ) din newsletter-ul MSFT din ianuarie:

International

Browsere/JavaScript

Anul 2011 a fost anul in care JavaScript a fost la putere. In international aveti un tutorial excelent al lui Elijah Manor aici http://www.elijahmanor.com/2011/04/mix11-video-good-javascript-habits-for.html.

Si ce ar fi Javascript fara un browser bun? Asa ca IE9 a venit cu Developer Tools imbunatatit, http://msdn.microsoft.com/en-us/ie/aa740478 . Iar o comparatie intre diferite browsere gasiti aici : http://windows.microsoft.com/en-US/internet-explorer/products/ie-9/compare-browsers

Si , daca tot vorbim de browsere, IE 10 a ajuns la PlatformPreview 4 . – vedeti http://ie.microsoft.com/testdrive/

HTML5 si CSS3

Cum exista deja o mare tevatura in legatura cu HTML5, Visual Studio 2010 vine cu suport pentru HTML5. Cititi http://www.hanselman.com/blog/AnnouncingTheWebStandardsUpdateHTML5SupportForTheVisualStudio2010Editor.aspx

Si downloadati extensia de aici: http://visualstudiogallery.msdn.microsoft.com/a15c3ce9-f58f-42b7-8668-53f6cdc2cd83

Ca tot vorbim de extensii pentru Visual Studio, vedeti si http://visualstudiogallery.msdn.microsoft.com/site/search?f[0].Type=User&f[0].Value=Mads%20Kristensen – optimizare imagini, CSS cop si altele.

Entity Framework

EF a ajuns la versiunea 4.2 avind doua feature-uri mari:

1. Code First http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx

2. Compatibilitate cu Sql Server Compact 4.0 – in sfirsit puteti avea o aplicatie “compacta” – downloadabila fara a mai instala SqlServer

Visual Studio 2011 si aplicatii Metro

Cu VS 2011 puteti dezvolta aplicatii pentru Windows8 .Mai multe amanunte aici: http://blogs.msdn.com/b/jasonz/archive/2011/09/14/announcing-visual-studio-11-developer-preview.aspx

Romania

Evenimente

In Romania exista doua comunitati de dezvoltatori – www.ronua.ro si www.codecamp.ro

1. CodeCamp a avut doua evenimente in acest an – unul in primavara (Cluj + Iasi) si unul in toamna( Cluj,Oradea, Iasi, Bucuresti).

2. Ronua a avut un turneu de primavara(Sibiu, Cluj-Napoca ,Oradea ,Arad ,Timișoara ,Brașov ,București ,Iași ,Constanța ,Galați ,Târgu Mureș ) si unul de toamna( aceleasi)

3. In plus, Ronua Bucuresti a mai facut 2 intilniri – in martie si in septembrie 2010

4. Catalin Criveteanu si Dan Badea au tinut un curs de HTML5 si IE9 in decembrie 2010 Timisoara, Cluj, Bucuresti, Iasi, Constanta,Brasov

Concursuri

In acest an am avut doua concursuri

– Concurs de tutoriale video prin care ofeream o excursie de 5 zile la TechEd 2012 la Amsterdam – cistigat de Radu Vunvulea

– Concurs de aplicatie cloud – este inca in desfasurare . Vezi http://www.microsoft.com/romania/afacereatafaimata/competitie.aspx

Realizari

In 2012 avem un nou MVP pe Cloud pentru realizarile din 2011. Numele lui este Mihai Nadas, http://www.mihainadas.com/2012/01/windows-azure-mvp/

Lista de MVP pentru Romania o gasiti pe blogul lui Zoli, http://zoli.herczeg.ro/

Blogurile lui Andrei Ignat, http://msprogrammer.serviciipeweb.ro si Radu Enuca , http://weblogs.asp.net/raduenuca/, au ajuns recomandate la resurse de MVC http://msdn.microsoft.com/en-us/library/gg416514%28VS.98%29.aspx

Intilnire RONUA Bucuresti, 24 ianuarie 2012 , ora 18:30

Pentru ca a inceput un nou an si pentru ca multi recomanda sa invatam un nou limbaj in fiecare an , la aceasta intilnire RONUA ne vom juca cu un nou IDE:  LightSwitch.

Alexandru Badita va prezenta :

LightSwitch Out of the box
A. Environment – Explicatii, Logical View/File View
B. DAL – Data access – conectarea la diferite tipuri de date si strategii aici / DB – Triggers / internal programming best practices.
C. BL – business layer – discutie despre filtrare/sortare hardcodata/ din interfata (Ce e aia ?)
D. UI – client user interface – Silverlight integration with/without data access (Ce e asta?)
E. Deploy app – tipuri de deployment Desktop/IIS/Cloud

E1. Exemplu practic (crearea unei aplicatii complete + pachet distribuire desktop/IIS suport pentru prezentarea de mai sus)

Data: 24.01.2012, ora 18:30

Locatie: Sediul TeamNet , sala Training Multifunctionala.
Str. Splaiul Independentei, No. 319,  RIVER Place, RIVERVIEW House, etaj 8,Sector 6,
(la parter este o clinica CMU)

Va rog sa va aduceti BI / CI  pentru a intra.

Harta: click aici : http://www.teamnet.ro/stiri/harta01.html

Detalii acces:
Poți ajunge aici cu urmatoarele mijloace de transport in comun: metrou , statia Petrache Poenaru , fosta Semanatoarea.

Multumesc si te astept!
Andrei Ignat

PMKB 1- importanta generarii automate a codului

Pentru PMKB, http://pmkb.codeplex.com/ am dorit sa muncesc cit mai usor. Si, pentru ca adopt o strategie gen Table per Type am considerat ca designul bazei de date este cel al claselor.

Daca va uitati la proiectul PMKB_DAL o sa vedeti urmatoarele fisiere .tt

  1. Model1.Context.tt – genereaza EFContext si genereaza codul pentru Fluent API, ca de exemplu:
    modelBuilder.Entity<Link_Tag>().ToTable(HelperTables.NameTable(Tables_PMKBEntities.Link_Tag));
        		modelBuilder.Entity<Link_Tag>().HasKey(item => item.LinkTagID);
        
        		modelBuilder.Entity<Link_Tag>()
        				.HasRequired(item => item.Link_LinkID_Link_Tag_LinkID)
        				.WithMany(u => u.Link_LinkID_Link_Tag_LinkID)
        				.HasForeignKey(x => x.LinkID)
        				.WillCascadeOnDelete(false);    
    
  2. Model1.tt – genereaza codul pentru fiecare clasa + o interfata pentru ea:
     public interface I_Link
        {
        long LinkID{get;set;}
        string LinkName{get;set;}
        string LinkDescription{get;set;}
        string LinkUrl{get;set;}
        Nullable<long> CreationUserID{get;set;}
        Nullable<System.DateTime> LinkCreationDate{get;set;}
        string LinkShortURL{get;set;}
        }
        
        public partial class Link: FastDatabaseQuery.IReceiveVisitor, I_Link
        {
    
  3. ITList.tt – genereaza codul pentru clasa Lista – pentru fiecare tabela pot sa vreau sa incarc mai multe rinduri sau sa sterg ceva rapid:
     
     [System.Diagnostics.DebuggerDisplayAttribute("Link_List Count={Count}")]
        public partial class Link_List : ColList<Link>
        {
    //code
     public void Delete_LinkID(long value)
            {            
                    base.Conection.Database.ExecuteSqlCommand("delete from " + HelperTables.NameTable(Tables_PMKBEntities.Link) + " where LinkID = {0}",value);        
            }
    

    Astfel incit codul devine:

    using (Link_List ll = new Link_List(ConnectionName))
                {
    
                    if (string.IsNullOrEmpty(OrderBy))
                        OrderBy = Link_List.FieldNames.LinkID;
    
                    var iq = ll.LoadFromDB.LoadAllQ();
                    var ordered = Link_FindDB.OrderByField(iq, OrderBy);
                    if (!string.IsNullOrEmpty(Search))
                    {
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkUrlContainsMultipleDef(Search), false);
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkDescriptionContainsMultipleDef(Search), false);
                        ll.LoadFromDB.AddToCustomPredicate(Link_FindDB.fexp_LinkNameContainsMultipleDef(Search), false);
                        ordered = ll.LoadFromDB.LoadFindCustomPredicateOrderedQ(OrderBy);
                    }
    
                    return ordered.ToPagedList(pageNumber, PageSize);
    
                }
    
  4. Find.tt – genereaza codul pentru cautare in BD ( de exemplu, pentru date pot sa am between) . IN acest exemplu arat fexp_LinkUrlContainsMultipleDef care face Like din Sql :
      public static Func<string, Expression<Func<Link, bool>>> fexp_LinkUrlContainsMultipleDef = value => fexp_LinkUrlContainsMultiple(value, "%");
    
             public static Func<string,string, Expression<Func<Link, bool>>> fexp_LinkUrlContainsMultiple = (value,separator) => 
            	{
            		value=value.ToLower();
            		var arr=value.Split(new string[1]{separator}, StringSplitOptions.RemoveEmptyEntries);
            		switch(arr.Length)//TODO: use a better expression here rahter than based on length 
            		{
            			case 1:
            				return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(value));
            			case 2:
            				 {
            				  string v1=arr[0].Replace(separator,"");
            				  string v2=arr[1].Replace(separator,"");				
            				 return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(v1)  &&  item.LinkUrl.ToLower().Contains(v2) );		
            				}
            			default:
            				 {
            				   string v1=arr[0].Replace(separator,"");
            				  string v2=arr[1].Replace(separator,"");
            				  string v3=arr[2].Replace(separator,"");
            				return (item =>  item.LinkUrl != null  &&  item.LinkUrl.ToLower().Contains(v1) &&  item.LinkUrl.ToLower().Contains(v2) &&  item.LinkUrl.ToLower().Contains(v3) );
            				}
            
            		}
            			
            
            	};	 
    
    
    
  5. Resource.tt – genereaza codul pentru fisiere resx – de exemplu , pentru fiecare clasa am nevoie de “edit”, “delete”, “new” , nume de label pentru (aproape) fiecare proprietate
     <data name="Accessed_AddNew" xml:space="preserve"><value>Add new Accessed</value></data>
    <data name="Accessed_List" xml:space="preserve"><value>List of Accessed</value></data>
    <data name="Accessed_Found_Multi" xml:space="preserve"><value>found {0} Accesseds</value></data>
    <data name="Accessed_Found_One" xml:space="preserve"><value>One Accessed found</value></data>
    <data name="Accessed_Found_Zero" xml:space="preserve"><value>No Accessed found</value></data>
    <data name="Accessed_Save" xml:space="preserve"><value>Save Accessed</value></data>
    <data name="Accessed_Save_Error" xml:space="preserve"><value>Error saving Accessed</value></data>
    <data name="Accessed_Delete_Error" xml:space="preserve"><value>Error deleting Accessed</value></data>
    
    
  6. Visitor.tt – daca am nevoie sa generez ceva date despre fisiere. Implementeaza Visitor pattern din Design Patterns.
     public partial class Link: FastDatabaseQuery.IReceiveVisitor, I_Link
    
    public partial class Link_Visitor: FastDatabaseQuery.IPropertiesVisitor
        {
        
            
             public string Visited(FastDatabaseQuery.IReceiveVisitor i)
             {
    

Bineinteles ca fiecare cod are nevoie de imbunatatiri. De aceea imi trebuie cod intercalat – si, de obicei, profit de partial in (aproape ) toate formele sale:

1. la definitia clasei
De exemplu,clasa Link_OLAP trebuia sa implementeze si interfata I_Link . Asa incit am adaugat un fisier .cs in care am scris

partial class Link_OLAP:I_Link
    {
    }

2. la introducerea unor metode pe care pot sau nu sa le definesc in corpul clasei asociate.
De exemplu, pentru definirea Modelului trebuia sa spun ca LinkID nu este autogenerat( o problema stupida a EF, care incearca sa fie destept)
Cind am facut override la OnModelCreating am definit si urmatoarele:

partial void OnBeginModelCreating(DbModelBuilder modelBuilder,ref bool Continue);
    	partial void OnFinishModelCreating (DbModelBuilder modelBuilder);
    	protected override void OnModelCreating(DbModelBuilder modelBuilder)
    	{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    		bool Continue=true;
    		OnBeginModelCreating(modelBuilder, ref Continue);
    		if(!Continue)
    			return;
//construct default
modelBuilder.Entity<Accessed>().ToTable(HelperTables.NameTable(Tables_PMKBEntities.Accessed));
    		modelBuilder.Entity<Accessed>().HasKey(item => item.AccessedID);
//other code 
OnFinishModelCreating(modelBuilder);
    		
    	}

Asa ca am adaugat un nou fisier, am pus partial class si am definit OnFinishModelCreating ( Nu era obligatoriu – de ex., nu am definit OnBeginModelCreating)

public partial class PMKBEntities
    {
        partial void OnFinishModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Link_OLAP>().Property(item => item.LinkID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        }
    }

Deci, daca nu stiti ce sunt fisierele .tt, atunci cititi de la Hanselmann

http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

si mergeti mai departe.

Puteti downloada solutia de la http://pmkb.codeplex.com/

Rezumat

Fisierele .tt va fac viata mai usoara, daca aveti definita o structura de baza. Folositi-le!