Mi primer libro ya está a la venta

Después de meses de trabajo por fin puedo decir que mi primer libro ya está a la venta. Sigue el link para saber más información del libro así como sus contenidos. Más de 650 páginas hablando de Asp. Net se ha convertido en una buena guía práctica para poder entrar con los conocimientos suficientes a trabajar con esta tecnología a nivel profesional.

Espero que no sea el único que pueda escribir.
Agradezco a Danysoft la oportunidad que me ha dado para poder escribir este libro y espero que si lo compras te pueda ser de gran utilidad.

Mañana hago la presentación, por si quieres asistir.

El meu primer llibre ja està a la venda

Després de mesos de feina per fi puc dir que el meu primer llibre ja està a la venda. Segueix el link per saber més informació del llibre com també els seus continguts. Més de 650 pàgines parlant d’Asp.net s’ha convertit en una bona guia pràctica per poder entrar amb els coneixements suficients a treballar amb aquesta tecnologia a nivell professional.

Espero que no sigui l’únic que pugui escriure.

Agraeixo a Danysoft la oportunitat que m’ha donat per poder escriure aquest llibre i espero que si el compres et pugui ser de gran utilitat.

Demà en faig la presentació, per si vols assistir.

 

Cómo mostrar un ensamblado en el cuadro de diálogo “Agregar referencia”

En el anterior post hablaba de como cambiar la referencia a un ensamblado sin necesidad de regenerar todo el proyecto.

Con este explicar de que es posible pedir a Visual Studio que muestre en el cuadro de dialogo de “Agregar Referencia” otros ensamblados que podamos tener en cualquier carpeta.

La clave esta en modificar el registro añadiendo una clave.
Para mostrar el ensamblado en el cuadro de diálogo Agregar referencia , puede agregar una clave del registro, como la siguiente, que señala a la ubicación del ensamblado

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\ MyAssemblies] @ = "C:\\ MyAssemblies"

Fuente y mejor explicación

Canviar les referencies sense tornar a compilar

Les aplicacions amb .Net utilitzen referències que seleccionem amb el Visual Studio 2010 via “Agregar Referencia”. Aquesta referència és estàtica. Compilem i construïm l’aplicació (.exe) utilitzant aquesta referència.

Les referencies son ensamblats i com a tals s’identifiquen per el nom, la cultura i opcionalment per el publickeytoken.

MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f5393b7416a1ef9b, processorArchitecture=MSIL

Es pot canviar aquesta referència sense necessitat de recompilar el projecte. Aquest escenari passa quan MyLibrary canvia de versió . Si sabem que el canvi de versió no implica canvis en el codi, podem sense reconstruir l’aplicació demanar al CLR que utilitzi aquest nou ensamblat. La clau està en afegir un fitxer de configuració d’aplicacions: app.config

App.config es un fitxer de configuració que s’acaba convertint amb myApplication.exe.config quan fem el Build del projecte.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
 <assemblyIdentity name="MyLibrary"
 publicKeyToken="f5393b7416a1ef9b"
 culture="neutral"/>
 <bindingRedirect oldVersion="1.0.0.0"
 newVersion="1.0.0.1"/>

 </dependentAssembly>
 </assemblyBinding>
 </runtime>
</configuration>

Amb aquest exemple demanem al CLR que carregui la versió 1.0.0.1 enlloc de la versió 1.0.0.0 que és la utilitzada en el moment de la compilació.

Lambda

Si ja sé que es el famoso logotipo de Half-life, pero aqui de la expresión lambda de C# y VB.NET y el simbolo a parte de traerme buenos recuerdos me gusta.

Es una expresión que aparece en el .Net 3.5 que te permite indicar el tipo FUNC en una sola linea. La expresión Lambda se caracteriza por tener el símbolo “=>” en C# o Function(…) en Visual Basic.

C# 
IEnumerable<string> cincoCaracs=nombres.Where<String>(s=>s.Length==5);

Vb.Net 
cincoCaracs=nombres.Where(Function(s) s.Length=5)

La expresión lambda se lee de la siguiente manera: La parte izquierda de la expresión (entiéndase la parte izquierda de => o lo que esta entre los paréntesis de la palabra Function(…)) son las variables que vamos a utilizar y que su tipo es inferido por los tipos genéricos del FUNC. La parte derecha es la implementación necesaria para devolver el tipo expresado como tipo de retorno en el FUNC. Por tanto, según el ejemplo, Where necesita un Func que devuelva un boolean (s.Length=5) y un parámetro que viene determinado por el genérico (en el caso de C#) o por los elementos de la lista en el caso de Visual Basic aunque no sea siempre así (“s” es tipo String) En .Net 3.5 las expresiones lambda solo podían tener una linea de implementación. En .Net 4 ya pueden tener más de una tal y como puedes ver en el siguiente ejemplo:

C# 

lista.Where<int>(c=>
{
  var x = c + 3;
  x = x * 4;
  return x==3;
 }).Select<int,int>(c=>c);

Vb.Net 

lista.Where(Function(c)
  Dim x = c + 3
  x = x * 4
  Return x = 3
 End Function).Select(Of Integer)(Function(c) c)

Entiendo y así me ocurre en todos los cursos que cuesta un poco entenderlo a primer vista, pero ten en cuenta que es muy fácil, lo único que necesitas es practicarlo un poco, yo te pongo unos ejemplos para que te ayuden a practicar.

C# 

//Buscar los enteros que sean mayor a tres
lista.Where<int>(c=>c>3);

//Buscar los mayores a tres ordenados de mayor a menor
lista.Where<int>(c=>c>3).OrderByDescending<int,int>(c=>c);

//De la lista de enteros recuperar otra lista con un tipo personalizado
lista.Select<int,ElEntero>(c=>new ElEntero {ElValor=c});

//De la lista de enteros recuperar otra lista con un tipo anónimo
lista.Select(c=>new {ElValor=c});

Vb.Net 

//Buscar los enteros que sean mayor a tres
lista.Where(Function(c) c>3)

//Buscar los mayores a tres ordenados de mayor a menor
lista.Where(Function(c) c>3).OrderByDescending(Of Integer)(Function(c) c)

//De la lista de enteros recuperar otra lista con un tipo personalizado
lista.Select(Of ElEntero)(Function(c) new ElEntero With {.ElValor=c})

//De la lista de enteros recuperar otra lista con un tipo anónimo
lista.Select(Function(c) new With {.ElValor=c});

Html 5 ara o més endavant?

Com a professional de les noves tecnologies tinc que estar sempre al dia de totes les coses noves que apareixen relacionades amb les tecnologies de Microsoft i de les TIC en general. És per això que sóc formador de .Net i Sharepoint i Certificat per Microsoft. Html 5 és una cosa que l’havia anat deixant al calaix pendent per estudiar/analitzar/documentar per els meus cursos i avui he decidit començar a experimentar amb aquesta tecnologia per poder-ho aplicar als meus cursos i perquè no poder fer cursos de Html 5.

Al no ser una tecnologia de Microsoft no havia estat una prioritat però després de sentir com grans portals/serveis web s’havien migrat a Html 5 m’ha fet decidir. Així que posat al tema veig que el SP1 del Visual Studio 2010 dóna suport a Html 5 en quant a la comprovació de la sintaxi, no pas per templates. Així que agafant els primers manuals per entendre Html 5 veig el següent exemple senzill que diu:

<input placeholder="Esriu el teu nom"/>

És una simple etiqueta que escriu una caixa de text amb una marca d’aigua que només es veu quan aquest està buit o no està amb el focus.

Quina decepció quan provant amb un IE9 això no funciona. Després de revisar que la meva única línia de codi no tingués cap error he visitat la següent web que testeiga els navegadors per comprovar la compatibilitat de Html 5.

Els resultats son preocupants: IE9 té una puntuació de 141, Chrome 16 de 374, Firefox 4 281 i Safari 5 302 sobre un total de 475. Però què significa això? doncs que de moment 100% suportat no el té ningú i IE que representa que és un dels navegadors més utilitzats no arriba ni a la meitat. Consulta la pàgina perquè es detalla per característica quines estan suportades i quines no.

Aquest altre web caniuse.com et mostra amb més detall el tema de les compatibilitats.

Juntament amb Html 5 hi ha CSS 3 i tot i que IE 9 n’és més compatible no m’acaba de convencer. És el moment de posar-s’hi? Canviarà significativament tot plegat a mesura que els navegadors es vagin adaptant? com puc fer formació d’una cosa que no puc testejar amb cap navegador?

Per el què sembla ASP.NET 4.5 amb el Visual Studio 2011 hi ha molt més suport tal i com es veu en aquest extens video i també per el que sembla IE10 millorarà molt la compatibilitat segons diu la web caniuse.com

Per cert, amb MVC ja trobem suport amb el VS 2010, des d’aquí et pots descarregar un toolkit que conté un conjunt de controls que es creen amb Html 5.

FUNC (El delegado genérico)

FUNC se define como un delegado que devuelve un valor y genérico.

C#
public delegate TResult Func<T,TResult>(T arg)
public delegate TResult Func<T1,T2,TResult>(T1 arg1,T2 arg2)
public delegate TResult Func<T1,T2,T3,TResult>(T1 arg1,T2 arg2,T3 arg3)
public delegate TResult Func<T1,T2,T3,T4,TResult>(T1 arg1,T2 arg2,T3 arg3,T4 arg4)
public delegate TResult Func<TResult>()

Vb.Net
Public Delegate Function Func(Of T,TResult)(arg as T) As TResult
Public Delegate Function Func(Of T1,T2,TResult)(arg1 as T1,arg2 as T2) As TResult
Public Delegate Function Func(Of T1,T2,T3,TResult)(arg1 as T1,arg2 as T2,arg3 as T3) As TResult Public Delegate Function Func(Of T1,T2,T3,T4,TResult)              (arg1 as T1,arg2 as T2,arg3 as T3,arg4 as T4)              As TResult Public Delegate Function Func(Of TResult)              ()              As TResult

Tal y como puedes ver en las definiciones siempre se sigue la misma regla: El ultimo tipo declarado en el genérico es el tipo devuelto por la función que implemente este delegado. Muchas de los métodos LINQ que extienden toman como parámetro un FUNC. Como por ejemplo:

C#
Where<TSource>(Func<TSource,bool> predicate)
Where<TSource>(Func<TSource,int,bool> predicate)
Select<TSource,TResult>(Func<TSource,int,TResult> selector)
Select<TSource,TResult>(Func<TSource,TResult> selector)

Vb.Net
Where(predicate as Func(Of TSource, Boolean))
Where(predicate as Func(Of TSource, Integer, Boolean))
Select(Of TResult)(selector as Func(Of TSource,Integer,TResult))
Select(Of TResult)(selector as Func(Of TSource,TResult))

Para poder utilizar este tipo de métodos con esos parámetros debes crear primero la función que implementa el FUNC, para ello debes crear una función con la misma signatura que el definido por el FUNC.

C# 
Func<string,bool> filtro=delegate (string s)
{
   return s.Length==5;
}
IEnumerable<string> cincoCaracs=nombres.Where<String>(filtro);

Vb.Net 
Function FiltroCaracs(i As String) As Boolean        
  Return i.Length=5
End Function
Dim filtro as Func(Of String,Boolean) filtro = AddressOf FiltroCaracs
Dim cincoCaracs as IEnumerable(Of String) cincoCaracs=nombres.Where(filtro)

En el siguiente post vas a ver como puedes indicar un tipo FUNC más fácilmente.