sábado, 12 de febrero de 2011

.Net 3.0: ¿Vale la pena usar la palabra reservada var?

Ya hace tiempo cuando estuve trabajando con LINQ en una de las empresas que estuve, mi jefe me explicó las ventajas de usar la palabra reservada "var", que aunque no es algo así como muy milagroso, si vale la pena mencionar sus ventajas, muy pocas ventajas, pero que si me parecen muy interesantes!.

Como todos bien saben, o si no lo sabían, en .Net todas las variables deben ser fuertemente tipificadas; es decir, tenemos que especificar de qué tipo será la variable, por ejemplo: int, short, long, un tipo definido por el usuario, etc.

Ahora bien, con la entrada de la versión de .Net 3.0 aparece la palabra reservada "var" con la cual podemos declarar variables en forma implícita; esto significa que no es necesario que especifiquemos el tipo de la variable, dejando ese trabajo al compilador.

Muchos programadores pensarían que eso es una "mala práctica de programación" porque estamos forzando más trabajo para el compilador y que el producto final que se instala en producción no será eficiente, etc.

Si siguen leyendo está entrada se darán cuenta que NO ES CIERTO tal afirmación, usar var es algo normal, jaja!.

1º) Originalmente "var" se creó para utilizarlo con los tipos anónimos, que hablando de temas de LINQ se hace muy claro la existencia de "var".

2º) var se puede utilizar en cualquier código que queramos hacer, con las siguientes excepciones:

a)- Al declarar una variable implícita, siempre debemos asignarle un valor; es decir, no podemos poner:

var resultado;

Lo anterior no funciona porque el compilador no va a poder definir de que tipo debe ser la variable.

b) var, solo se puede usar dentro de métodos de una clase.

c) No es posible retonar un tipo var y los parámetros tampoco pueden ser var; es decir, si queremos definir una función tal como:

public var Cuadrado(var base){
      return base*base;
}

Lo anterior no funciona!


Ahora, las ventajas:

1º) No tenemos que estar escribiendo el tipo de la variable y ni siquiera el namespace reduciendo la línea de código en gran medida.:

     var resultado = gridDatos.ItemsSource as List<Productos>;

En el ejemplo anterior se usa la clase List genérica con el tipo Productos, donde Productos es una clase definida por el usuario. La línea de código anterior sin usar var quedaría así:

ObservableCollection<Productos> resultado = gridDatos.ItemsSource as ObservableCollection<Productos>;

Notar como se está especificando en el ejemplo anterior, el tipo en ambos lados, lo cual es entendible pero innecesario, en lo personal, ahora que conozco la existencia de var.

Ahora consideren cuando el programador gusta poner el nombre de namespace completo (sin usar alias), la línea de código quedaría extremadamente larga. Además por si no lo sabían, el optimizador del compilador quita los namespace largos y los combierte en alias o simplemente los quita y deja solo el nombre del tipo exacto sin especificar todas las partes del namespace.

2º) Como mencioné anteriormente, muchos programadores piensan que usar var no es eficiente para el producto final que entregamos al cliente; está afirmación es falsa, porque el compilador se encarga de inferir los tipos de datos donde existe var generando un ensamblado en donde reemplaza las palabras var por el tipo que se le está asignando a la variable. Es decir, los ensamblados generados son iguales si nosotros declaramos explícitamente o implícitamente las variables.

Veamos éste sencillo ejemplo donde se declara una variable usando var.



Ahora vean el código des-ensamblado, donde se observa que el compilador dedujo el tipo de datos, en éste caso es int.




Igualmente en el código MSIL (Microsoft Intermediate Language) tenemos que el tipo de datos para la variable "i" es int:



Por cierto en Visual Basic .Net, el equivalente de var es la palabra reservada Dim, por ejemplo: Dim miVariable = 5 * 5.

Referencia:

El excelente libro que leí hace mucho tiempo: LINQ IN ACTION de Fabrice Marguerie, Steve Eichert y Jim Wooley.

martes, 25 de enero de 2011

WCF: Problemas con WCF?

Me estaba apareciendo el siguiente error y luego de una hora para variar y después de googlear un rato, la solución era ni más ni menos que actualizar la referencia del WCF en el proyecto. (En el directorio Services References seleccionar el WCF que se está trabajando, luego sacar el menú contextual de ese archivo y seleccionar Update Service References).

A continuación el error que aparecía (encontré cientos de soluciones pero ninguna funcionó, hasta que se me ocurrió actualizar la referencia del WCF, jajajaja):
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter. Expecting state Element Encountered Text with name '', namespace ''.'. Please see InnerException for more details.


martes, 4 de enero de 2011

SQL SERVER: Cantidad de días en un mes

La siguiente consulta devuelve la cantidad de días que tiene un mes de acuerdo al número de mes que le pasemos como parámetro:

declare @mes int
set @mes = 2
select day(dateadd(day,-1,left(convert(varchar(8),dateadd(month,@mes,getdate()),112),6)+'01'))

miércoles, 29 de diciembre de 2010

Ajax: Especificación XMLHttpRequest

Documentación del estandar hecho por la W3C para XMLHttpRequest Level 3. Level 3 es la propuesta final, la propuesta Level 2 la encontramos en XmlHttpRequest Level 2.

XMLHttpRequest es la interfaz para poder realizar peticiones a los servidores web con el protocolo HTTP o HTTPS en forma síncrona o asíncrona. Como bien se sabe, XmlHttpRequest es el objeto principal en los navegadores para implementar la tecnología Ajax.

viernes, 19 de noviembre de 2010

Silverlight: Enlaces de ayuda para Silverlight y SketchFlow

Ahora que tengo que usar Silverlight y Silverlight Sketchflow, me he dado la tarea de investigar un poco y poner como siempre los links de las páginas que me han ayudado a ganar en conocimiento:

1) Ejemplo Online sobre Sketckflow por: Lukas Zdechovan.

2) No hay quite!, en mi segundo día con Silverlight SketchFlow, ya me estaba quejando que no tenemos por lo menos un Grid para poner en las escenas. La solución la tiene Philipp Sumi con su Sketchables Framework que llega a complementar el set de controles entre ellos está el que yo andaba buscando. (En otra entrada explicaré como se instala Sketchables Add-in).

Una alternativa más rápida para diseñar es Balsamiq Mockups o Pencil. Con respecto a los diseños de prototipos de pantalla conocidos también como Wireframes o  Blueprints, se realizan éstos para concentrarse en la estructura del contenido que tendrá el sistema y no en aspectos visuales, considera además, un enfoque en aspectos generales del sistema sin entrar en detalles. De ésta forma los programadores, diseñadores y los clientes pueden entrar en discusión y toma de decisiones más rápido y como resultado beneficioso serán menos cambios a futuro reduciendo costos y tiempo.

3) Controles para mostrar texto, los tipos de fuentes, controles que no permiten seleccionar el texto, etc. en Texto y fuentes

4) Ejemplos donde se demuestra como navegar entre páginas XAML:
- Ejemplo #1
- Ejemplo #2
- Ejemplo #3. La forma correcta de navegar entre páginas. También vale mucho la pena leer The Silverlight Navigation Framework
- Ejemplo #4: Otro ejemplo de la forma correcta para navegar entre páginas XAML

- Ejemplo #5: Y sigo jodiendo con el tema sobre la forma correcta de navegar entre páginas XAML.

sábado, 6 de noviembre de 2010

Ubuntu: Sonido de TvTime no funciona

No podía escuchar sonido en TvTime con Ubuntu 10.10, por suerte encontré una solución en los foros de Ubuntu.

Lo anterior aplica para capturadoras TV Kworld con chip philips SAA7134/SAA7135HL que es la que tengo en mí máquina.

martes, 2 de noviembre de 2010

Ajax .Net: Web Method no se está ejecutando.

Me preguntó un colega de progra si he tenido un error con Ajax cuando ocurre una excepción que dice algo como "Sys.Net.WebServiceFailedException ......".

Resulta que ese error me a ocurrido más de una vez, jeje!, y por suerte me acuerdo que específicamente para ese mensaje, dicho error ocurre porque no se está controlando la respuesta de una llamada de un "Static Web Server". Los Static Web Server o Static Web Method, son algo muy común en Ajax y ni que decir en los Ajax Control Tool Kit.

El problema se da cuando se hace clic sobre un botón el cual llama a una función del objeto WebMethods. Resulta que al dar clic sobre el botón se estaría enviando dos órdenes: 1º Un refresh de la página, 2º una llamada a un Web Method. Los dos puntos anteriores provocan el error. La solución es simplemente cancelar la orden del refresh de la página (o del roundtrip). Al cancelar el refresh, el web method hace el viaje de vuelta en forma exitosa.

Para mayor claridad, recomiendo revisar en el siguiente foro de Ajax .Net, donde de hecho en Agosto del 2010 puse mi comentario al respecto!

domingo, 31 de octubre de 2010

Inglés: Pasado de los verbos regulares

Jeje, ésta entrada nada que ver con la computación, pero lo pongo porque siempre se me olvidan estas reglas del inglés.

¿Cómo se forma el pasado de los verbos regulares?

1) Los verbos que terminan en vocal "e", agregan "d":

     live   ==>  lived
    date  ==>  dated
    hate  ==>  hated

2) Los verbos que terminan en consonante seguida de "y", convierten la "y" en "i" y agregan "ed":

    try      ==>  tried
    dry     ==> dried
    cry     ==> cried

3) Los verbos que terminan en vocal seguida de consonante que no sea "w" o "y", doblan la consonante y agregan "ed":

    plan        ==>  planned
    commit   ==>  committed
    shop       ==>  shopped

4) El resto de verbos incluyendo los que terminan con "w", agregan "ed":

    fill      ==>   filled
    serve  ==>  served
    smell  ==>  smelled
    show  ==>  showed


Pronunciación:

1) Todos los verbos regulares que terminan con: p – k – s – ch – sh – f – x – h, pronuncian ED como “T”. Ejemplos de verbos que suenan con "T" al final: asked, baked, fixed, joked

2) Todos los verbos regulares que terminan con: l – v – n – m – r – b – v – g – w – y – z, y sonido vocal, pronuncian la "ED" como "D".Ejemplos: allowed, agreed, appeared, believed, cried, moved, shared.

3) Todos los verbos regualres que terminan en "T" o "D", pronuncian el "ED" como "ID". Ejemplos: accepted, afforded, ended, invited, painted, planted.


Referencias:
Reglas Verbos Regulares
Pronunciación de verbos regulares
Lista de verbos regulares

sábado, 30 de octubre de 2010

ASP .NET: iTextSharp no funciona en sitios web en producción

iTextSharp es un ensamblado OpenSource para .Net, que permite crear archivos en formato PDF. Muy útil cuando queremos convertir archivos HTML a PDF. Sin embargo existe un problema con la dll en producción.

El problema es que después de instalar en el servidor de producción, obtenemos el sisguiente error: "That assembly does not allow partially trusted callers"

La solución es modificar el código fuente de iTextSharp, para que permita ensamblados en modo "Partially Trusted Callers" en lugar de full trust.

Lo único que se debe hacer es modificar el archivo AssemblyInfo.cs, establecediendo las siguientes líneas de código:

using System.Security;
using System.Security.Permissions;

[assembly: AllowPartiallyTrustedCallers]

Referencia: www.techparadise.gr

jueves, 14 de octubre de 2010

domingo, 26 de septiembre de 2010

Linq: Usar operadores de Linq en lugar de un foreach

Éste es un caso en el que quería llenar un DropDownList utilizando el CascadingDropDown. En el método del WebService, quise usar el método AddRange, y así evitar tener que implementar un foreach para iterar por la colección de filas de un DataTable.

Por ejemplo, tengo un método que se llama Clientes.Listar(), el cual devuelve la lista de filas en un objeto DataTable, entonces para llenar al DropDownList tengo que usar un foreach para recuperar el valor que se va a mostrar en el DropDown y el valor llave que se utilizaría para saber cuál item se seleccionó. Utilizando el método AddRange del tipo List y las técnicas de Linq, tenemos el siguiente código de ejemplo:

--------------------
List valores = new List();
Clientes clientes = new Clientes();

valores.AddRange
(
    from fila in clientes.Listar().AsEnumerable()
    select new CascadingDropDownNameValue(fila["NOMBRE"].ToString(), fila["CODIGO"].ToString())
);
return values.ToArray();

--------------------
Otra alternativa de Linq pero expresada en secuencia de operadores de Linq sería de la siguiente forma:

--------------------
values.AddRange(clientes.Listar().AsEnumerable().Select(
fila => new CascadingDropDownNameValue
(
    fila["NOMBRE"].ToString(),
    fila["CODIGO"].ToString()
)));
--------------------

Cualquiera de los dos casos anteriores sirven para reemplazar el siguiente código:

foreach (DataRow fila in clientes.Listar().Rows)
{
     values.Add(new CascadingDropDownNameValue(fila["NOMBRE"].ToString(),   
     fila["CODIGO"].ToString()));
}

La diferencia, entre éste foreach y el uso de Linq es que Linq me permite hacer muchas cosas en una sola línea de código, en el peor de los casos tengo que agregar otras líneas, pero con las técnicas tradicionales, en lo personal, el código se vuelve para mí muy tedioso y en ocasiones dificil de entender.

Algunos dicen que Linq es más rápido, otros dicen que no siempre es el más rápido, independientemente de la eficiencia con que resuelva Linq el problema, prefiero Linq porque me permite codificar mejor casos difíciles donde tengo que dar tratamiento a por ejemplo muchos campos de una tabla o muchos datos de un arreglo, etc.