Nivel básico

Patrones de Diseño


A lo largo de las próximas semanas intentaré, dentro de mis posibilidades, realizar un acercamiento a uno de los conceptos que todo ingeniero de software que se precie debe saber manejar con soltura: los patrones de diseño.

Un patrón de diseño no es más que una “receta” que trata de proporcionar una solución genérica a un problema concreto que se repite con frecuencia durante el desarrollo de software.

Para que un patrón de diseño sea considerado como tal debe cumplir una serie de requisitos, como el haber demostrado su efectividad a la hora de resolver el problema que afirma solventar y ser adaptable a cualquier entorno y tecnología, es decir, ser lo suficientemente genérico para asegurar su reutilización.

Por tanto, un patrón de diseño es un artefacto, por definición, abstracto. Sé que existe multitud de documentación al respecto, pero muchas de las explicaciones que se ofrecen se componen de un montón de terminología que, si bien es perfectamente familiar para un ingeniero experimentado, resulta terriblemente difícil de digerir para un recién iniciado en el mundo de la arquitectura y el diseño. Dicen que Einstein dijo en una ocasión que “no entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela”. Pues bien, abuela, esta serie de artículos va por ti.

(más…)

WCF (III): Creación de un cliente de un webservice


Ahora que ya hemos creado nuestro primer servicio, es el momento de consumirlo. Al igual que hicimos en ejemplos anteriores, comenzaremos creando un nuevo proyecto, por ejemplo de consola.

Es importante tener a mano la dirección del servicio, ya que nos hará falta para referenciarlo. Si estamos desarrollando el cliente en el mismo equipo en el que desarrollamos el webservice, bastará con copiar la dirección del WCF Test Client que Visual Studio creará por nosotros y que vimos en el artículo anterior.

Seleccionaremos la sección References del proyecto y haremos click derecho sobre ella, seleccionando la opción Add Service Reference… para añadir una referencia de servicio.

En el campo Address (dirección), insertaremos el valor que copiamos previamente. El hecho de que la dirección termine en mex indica que se trata el servicio de metadatos creado por defecto, que proporcionará la información sobre el resto de endpoints del servicio web. Más adelante profundizaremos en el concepto de endpoint y aprenderemos qué son, cómo configurarlos y cómo acceder a ellos.

(más…)

WCF (II) : Creación de un servicio web simple


Comprendidos los principios sobre los que se basa Windows Communication Foundation, es momento de crear un pequeño servicio básico que maneje una lista interna de clientes. No haremos uso de bases de datos, puesto que el objetivo principal de este artículo es centrarnos en la comunicación. El último artículo dedicado a Entity Framework desarrolla, precisamente, un ejemplo más específico del uso de Entity Framework para desarrollar un servicio web RESTful mediante WCF.

Como vimos en el artículo anterior, a grandes rasgos un servicio WCF se compondrá de cuatro elementos:

  • Contrato de datos: estructura de datos que será intercambiada por el servicio.
  • Contrato de servicio: interfaz que expondrá los métodos que pueden ser invocados por el cliente.
  • Implementación del servicio: codificación del contrato de servicio, incorporará la lógica interna del servicio.
  • Configuración: fichero XML con información sobre dirección, nombre o protocolo.

Comenzaremos creando el servicio para pasar, a continuación, por el primero de estos elementos: el contrato de datos.

Creación del servicio

Para comenzar la codificación de nuestro servicio, crearemos un nuevo proyecto WCF, específicamente del tipo WCF Service Library, que generará una biblioteca DLL que contendrá la funcionalidad del servicio.

(más…)

WCF (I): Introducción a Windows Communication Foundation


La plataforma .NET sufrió su gran transformación a partir de sus versiones 3.0/3.5, momento en el que surgen oficialmente las ahora conocidas como Foundations, orientadas a especializar secciones completas del framework. Windows Communication Foundation, originalmente conocida por el nombre de Indigo, es la parte encargada, como su propio nombre indica, de las comunicaciones y mensajería, aunque su principal uso son los servicios web.

Hasta el momento, el servicio de mensajería entre aplicaciones se realizaba mediante los protocolos COM, DCOM o MSQM, que obligaba a los programadores a ceñirse no sólo a una forma de programación concreta, sino que también estaba atada a la plataforma y al lenguaje de programación. Los servicios web surgen con el propósito de cambiar esta filosofía, permitiendo hacer la comunicación independiente de lenguaje de programación y plataforma gracias a la creación de estándares de comunicación. No importará si un servicio está codificado en Java o .NET, ni si corre en una plataforma Windows o Linux: lo importante será que respeten los estándares del protocolo sobre el cual está construido, del mismo modo que ocurre con los servidores web.

Tipos de servicios web

A día de hoy existe una gran variedad de protocolos sobre los que los servicios web pueden operar, pero son dos los protocolos estrella que la práctica totalidad de los servicios web utilizan hoy día:

  • SOAP: Simple Object Access Protocol. Creado en 1998, se sirve de mensajes XML para el intercambio de mensajes. Puede operar sobre cualquier protocolo de transporte, aunque lo más común es que lo haga sobre HTTP o HTTPS. Es el protocolo más común en servicios web de carácter privado.
  • REST: REpresentational State Transfer. Concepto surgido en el año 2000, hace uso del protocolo HTTP para el envío de mensajes, y puede utilizar lenguajes como XML o JSON.

(más…)

Permitir conexiones locales a IIS y SQL Server en Windows 7


A la hora de desarrollar una aplicación .NET / ASP.NET con persistencia de datos, será necesario establecer una conexión con un servidor de base de datos. Generalmente, .NET suele hacer uso del binomio ASP.NET/SQL Server, para lo cual suelen darse, dejando a un lado los entornos de pruebas, integración y producción, dos escenarios típicos:

  • Utilizar una base de datos local en la que “cacharrear” y otra base de datos de desarrollo común a todos los desarrolladores de la aplicación.
  • Utilizar directamente una base de datos de desarrollo sin hacer uso de una base de datos local.

El segundo escenario típicamente suele consistir en un servidor SQL Server en red local, que bien puede ser dedicado (preferiblemente) o directamente (aunque sea mala práctica) el equipo de un compañero concreto.

Sin embargo, el acceso al equipo de un equipo en red local, políticas de red aparte, no es automático, sino que requiere permitir que tanto el servidor web (IIS 7 en nuestro caso) como el servidor de base de datos (ejemplificaremos con SQL Server 2012) permita el acceso a conexiones remotas y no sólo locales. Veremos a continuación cómo lograr este objetivo. (más…)

Crear un diálogo personalizado en Android


Ya hemos visto como crear un diálogo de confirmación de forma “express” a través de un AlertDialog.Builder. Sin embargo, muchas veces necesitaremos que el usuario, además de confirmar una acción, realice una selección rápida de un dato concreto a través de un diálogo. Los ejemplos más típicos suelen ser la selección de una fecha, de un nombre, un número o un color.

En el siguiente ejemplo aprenderemos cómo crear un nuevo diálogo personalizado que permitirá al usuario generar un color a partir de los tres componentes RGB y enviarselo a la actividad que lo solicita. Cuando finalicemos, nuestro diálogo tendrá un aspecto similar al siguiente:

ColorPickerDialog

(más…)

Diálogos modales en Android (AlertDialog)


Una de las desventajas de las interfaces táctiles es que en ocasiones pulsamos por error elementos que no deseamos. Por ello es conveniente realizar diálogos de confirmación en aquellas operaciones que tengan un carácter sensible, como por ejemplo la eliminación de un registro de la base de datos o la ejecución de una transacción financiera.

Para crear diálogos modales haremos uso de la clases android.app.AlertDialog y android.app.AlertDialog.Builder. El proceso a realizar será el siguiente:

  • Crear un método que genere el diálogo. En él construiremos paso a paso los elementos que queremos mostrar y utilizar, como mensajes, botones y acciones a realizar.
  • Llamar al método show() para mostrar el diálogo.

Imaginemos que en nuestra Activity deseamos realizar una conexión a un dispositivo Bluetooth, y el método destinado a ello recibe el nombre de conectarDispositivo(). Este método recibirá una cadena de texto que indicará la dirección del dispositivo, que se utilizará para obtener una referencia del dispositivo en sí. Olvidémonos del funcionamiento interno de la función y centrémonos en el hecho de que se trata de un método de nuestra Activity y que necesita parámetros para su ejecución:

(más…)

Recuperar una contraseña almacenada automáticamente mediante Javascript


Últimamente existe una cruenta batalla en la plataforma Windows entre Internet Explorer y Firefox. Personalmente, yo no me decanto hacia uno ni otro: utilizo Opera desde su versión 6.05, allá por 2002. Indico que utilizo Opera porque es un navegador que posee una funcionalidad llamada “varita mágica”, que no es más que un gestor de contraseñas en las que, pulsando ALT+ENTER se introducen automáticamente el nombre de usuario y la contraseña de una web en la que se hayan almacenado estos datos previamente.

Esta “comodidad” tiene un precio: a veces, de tanto utilizar este sistema, se me olvida alguna contraseña a causa del desuso, lo que causa que mi navegador la conozca y yo no.

0811_01

Para paliar esta posibilidad, teniendo acceso a la página con el nombre de usuario y la contraseña, es posible averiguar el contenido del campo oculto entre asteriscos mediante una pequeña “treta” en Javascript. Lo primero que deberemos hacer será visualizar el código fuente de nuestra página (normalmente, haciendo click derecho sobre la misma y pulsando “Ver código fuente” o algo así, dependiendo del navegador).

Una vez visualizado, comprobamos la etiqueta que se muestra antes del campo que alberga la contraseña. En GMail, por ejemplo, “Contraseña”. Buscaremos este texto en el código fuente, obteniendo algo como lo que sigue: Como podemos observar, nos encontramos con un Input con un campo ID.

0811_02

El valor de esa variable, en nuestro caso “Passwd”, es lo que nos interesa. Volveremos a nuestra página, y escribiremos lo siguiente en nuestra barra de navegación:


javascript:alert((document.getElementById('Passwd')).value);

Lo que le estamos diciendo a nuestro navegador es: “Ejecuta el siguiente código javascript: muestrame una alerta con el valor del elemento cuyo ID es ‘Passwd'”.

0811_03

Acto seguido, se mostrará el contenido del campo en texto plano.

0811_04

Es ahora tarea del usuario el ejecutar este código lejos de la vista de un posible mirón y, por supuesto, en un PC no comprometido… 😉

Variables de servidor en ASP.NET


Nuestro servidor ASP.NET aloja una gran cantidad de información útil que, en determinado momento, puede salvarnos de situaciones complejas. Este conjunto de variables puede consultarse mediante el objeto Request.ServerVariables[<NombreVariable>]. Así, si realizamos la siguiente consulta:

string navegador = Request.ServerVariable[&quot;HTTP_USER_AGENT&quot;];

La variable navegador alojará, como intuitivamente podremos imaginar, el navegador que está utilizando el cliente que se conecta a nuestro servidor, dato utilizado, por ejemplo, para estadísticas. En nuestro caso, el dato devuelto será el siguiente:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Hay cantidad de variables de servidor cuya consulta puede hacernos la vida más fácil. Como ejemplo, indicaremos algunas de ellas:

VARIABLE SIGNIFICADO EJEMPLO
SERVER_PROTOCOL Protocolo de conexión HTTP/1.1
REMOTE_ADDR Dirección IP Remota 80.24.53.11
LOCAL_ADDR Direccion IP Local 127.0.0.1
PATH_INFO Ruta de la aplicación /MiAplicacion/Pagina.aspx
URL URL de la página /MiAplicacion/Pagina.aspx
AUTH_TYPE Tipo de autenticación Forms
SERVER_PORT Puerto HTTP 80
HTTP_USER_AGENT Navegador del usuario Mozilla/4.0 (compatible; MSIE 8.0;…
HTTP_HOST Nombre del host MyMachine
SERVER_NAME Nombre del servidor MyMachine
SERVER_SOFTWARE Servidor web Microsoft-IIS/6.0
APPL_PHYSICAL_PATH Ruta física de la aplicación C:\Inetpub\wwwroot\MiAplicacion\
HTTPS ¿Usa SSL? off
AUTH_USER Usuario autenticado administrador
REMOTE_USER Usuario remoto administrador
HTTP_CONNECTION Tipo de conexión HTTP Keep alive
HTTP_ACCEPT_LANGUAGE Idioma es

Existen más variables de servidor, y basta con recorrer con un bucle su contenido para echarle un vistazo a todas:


Hashtable hs = new Hashtable();

foreach (string s in Request.ServerVariables.AllKeys)
{
hs.Add(s, Request.ServerVariables[s]);
}

Almacenamiento y recuperación de parámetros en Sesión y ViewState


Muchas veces necesitamos utilizar parámetros entre distintos métodos de un mismo formulario web, o incluso entre formularios distintos. Una forma dinámica de realizar este intercambio de datos es la utilización del ViewState y del espacio de sesión.

Antes de embarcarnos a almacenar datos y datos en estos dos espacios de memoria, hay que dejar claras dos cosas:

  • El ViewState se intercambia continuamente entre cliente y servidor, por lo que es aconsejable no sobrecargarlo. Al aumentar el ViewState, aumentará el tamaño de la página, y por consiguiente, el tráfico de datos y la velocidad de carga de la misma.
  • La sesión se almacena en servidor, por lo que si nuestro sitio web posee una carga de datos moderada – alta, el rendimiento del mismo se verá penalizado. Nuevamente, es aconsejable utilizar con cautela este espacio de memoria.

Teniendo claros estos dos conceptos, utilizaremos el ViewState para almacenar datos locales (de una misma página) y la sesión para pasar parámetros entre distintas páginas sin hacer uso de la QueryString. Para los profanos en la materia, explicaremos que la QueryString es la colección de parámetros que pueden, opcionalmente, acompañar a la dirección de la página. Éstos parámetros ofrecen información directamente recopilable por nuestro formulario web, pero cuenta con la desventaja de que es visible para el usuario.

(más…)

Eliminar la hora a una fecha en SQL Server 2005


Hay veces que pese a recibir un parámetro en formato fecha que almacene dia y hora, nos interese únicamente almacenar (o recuperar) la parte correspondiente a la fecha.
Aquellos que hayan realizado alguna vez comparaciones de fechas situadas en un intervalo probablemente sepan de qué hablo: ¿Comparar entre un día a las 00:00:00 y el siguiente a las 00:00:00? ¿Entre el mismo día entre las 00:00:00 y las 23:59:59?

Una forma simple de ahorrarnos dolores de cabeza sería almacenar la fecha sin hora. Para ello haremos uso de los distintos formatos de fecha que nos permite promocionar SQL Server y escribiríamos algo así:

 UPDATE NombreTabla SET CampoFecha = convert(datetime, convert(varchar(10), CampoFecha, 103))  

Con lo cual, almacenaremos nuestra fecha en formato DD:MM:AAAA 00:00:00.

Implementación de interfaces en C#


Una técnica imprescindible para lograr un adecuado nivel de abstracción es la utilización de interfaces.

Hablando en llano, una interfaz no es más que una estructura de datos que muestra únicamente las firmas de los métodos de una clase. A partir de ahí, una clase que herede de la interfaz estará obligada a “rellenar” la implementación de dichos métodos. De forma simple, una interfaz sería algo así:

Interfaz Motor
    Arrancar();
    Detener();

(más…)

Concatenar campos nulos en una consulta SQL


Hay ocasiones en las que puede que se nos pidan consultas del siguiente tipo:

SELECT Nombre + ' ' + Apellido1 + ' ' + Apellido2 AS NombreCompleto FROM Usuario

Es decir: concatenar varios campos y devolverlo como uno solo. Ante esto existe un problema bastante común: ¿Qué ocurre cuando uno de estos campos es NULL?
Si uno de estos campos es NULL, por defecto el registro devolverá NULL. Esto es, si tenemos un usuario llamado Santiago, cuyo primer apellido es López y su segundo apellido no consta en la base de datos, el resultado de concatenar Santiago + López + NULL será NULL.

Una posible solución a este problema es utilizar condicionales dentro de la propia sentencia T-SQL, haciendo algo así:

SELECT U.IdUsuario, U.Nombre + ' ' + CASE 
     WHEN U.Apellido1 is NULL THEN '' 
     ELSE U.Apellido1 END + ' ' + CASE 
     WHEN U.Apellido2 is NULL THEN ' ' 
     ELSE U.Apellido2 END AS NombreCompleto
FROM Usuario U

Esto nos devolverá una columna “NombreCompleto” con los campos concatenados correctamente, sin temor a que éstos sean NULL.

Ejecutando programas externos a nuestra aplicación


En cierta ocasión almacené en DVD una serie de instaladores de los programas que utilizaba con más frecuencia. Me planteé que sería buena idea utilizar una aplicación de autoarranque con un menú navegable en el que se accediese directamente a la instalación del programa seleccionado. ¿Cómo ejecutar un programa ajeno a nuestra aplicación desde código? Creando un nuevo proceso y asignándole la información necesaria para “saber” qué tiene que ejecutar.
Como ejemplo simple, lanzaremos una consola en la que el directorio de trabajo sea C:\. En tres pasos tendremos nuestra aplicación funcionando:

  • Crearemos una instancia de la clase Process
  • Informaremos de los datos oportunos (ruta del ejecutable, parámetros, directorio de trabajo…)
  • Lanzaremos el proceso.

' Declaramos un objeto que identificará al nuevo proceso
 Dim proceso As New Process()

 ' Indicamos la ruta del ejecutable que queremos lanzar
 proceso.StartInfo.FileName = "cmd.exe"

 ' Indicamos el directorio de trabajo
 proceso.StartInfo.WorkingDirectory = "C:\"

 ' En caso de ser necesario, podemos indicarle argumentos.
 proceso.StartInfo.Arguments = "/T:0A"

 ' Indicamos el estilo de la ventana
 proceso.StartInfo.WindowStyle = ProcessWindowStyle.Normal

 ' Por último, lanzamos el proceso
 proceso.Start()

Como vemos, hemos obtenido lanzar la orden cmd.exe /T:0A (el argumento /T cambia los colores de la consola) en el directorio de trabajo C:\.

ejemploCmd

Como podremos imaginar, así podremos ejecutar cualquier programa a cuya ruta tengamos acceso.

Instalando PHP en Internet Information Server (IIS)


Para comenzar la instalación de PHP bajo Internet Information Server, necesitaremos en primer lugar descargar la versión para Windows de PHP. Para ello, nos dirigiremos a la página http://www.php.net/downloads.php y seleccionaremos la versión más actual de los binarios para Windows (Windows Binaries).
Descarga de PHPDescarga de PHP
Hecho esto, descomprimiremos el contenido del fichero que acabamos de descargar en una carpeta local, por ejemplo, C:\PHP.

PHPIIS_02 - Carpeta
En el interior de la carpeta buscaremos un fichero denominado php.ini-recommended, en el cual se encuentra la configuración por defecto recomendada para prácticamente cualquier sistema.

PHPIIS_03 - Configuracion Recomendada
Renombraremos el fichero como php.ini, pasando a continuación a editarlo.

PHPIIS_04 - Configuracion Recomendada 2

Asignaremos valores a las siguientes variables:<br/>

short_open_tag = On
extensión_dir = “c:\php\ext”
cgi.force_redirect = 0
doc_root = c:\inetpub\wwwroot

PHPIIS_05 - Configuracion Recomendada 3

Como paso previo a la configuración del IIS, editaremos las variables del sistema para incluir el PATH de php en el PATH del sistema. Para ello, haremos click derecho sobre Mi PC y seleccionaremos [Propiedades] (o bien utilizaremos el atajo de teclado [Tecla de Windows] + [Pausa]). Una vez en el menú, seleccionaremos la pestaña [Opciones Avanzadas] y haremos click sobre el botón [Variables de Entorno]. En el menú inferior, buscaremos la variable llamada “Path” y pulsaremos sobre el botón [Modificar].

PHPIIS_07 - PATH
Por último, añadiremos en el valor de la variable “;C:\PHP” para añadir la ruta de nuestro directorio de PHP.

Hecho esto, deberemos configurar nuestro IIS para que reconozca PHP. Para ello abriremos la consola de configuración de IIS, por lo que iremos a [Inicio] > [Herramientas] > [Panel de Control] > [Herramientas Administrativas] > [Servicios de Internet Information Server]. Desplegaremos el equipo local y haremos click derecho sobre Sitio Web Predeterminado, seleccionando la opción [Propiedades].

PHPIIS_08 - Propiedades
A continuación seleccionaremos la pestaña [Home Directory], y haremos click sobre el botón [Configuration].

PHPIIS_09 - HomeDirectory
Se abrirá una ventana en la que se nos mostrarán las distintas extensiones ISAPI.

PHPIIS_10 - AppConfigurationComo queremos registrar una nueva extensión (.php), pulsaremos sobre el botón [Add…].
Hecho esto, seleccionaremos el fichero php5isapi.dll de nuestro directorio PHP y añadiremos como extensión .php.

PHPIIS_11 - ExtensionMapping
Con esto, la extensión .php quedaría registrada.

Finalmente, reiniciamos IIS escribiendo iisreset desde consola…

PHPIIS_13 - iisreset
…y creamos un directorio virtual en el que crearemos un fichero llamado index.php en el que incluiremos el siguiente texto:




Prueba de PHP



<pre>
</pre>




Con esto, entrando en la página “http://localhost/<Directorio Virtual>/index.php”, deberíamos visualizar una página con información sobre la versión.

PHPIIS_14 - ok

Si esto ocurre, la instalación habrá tenido éxito.