09.30.07

DevJoker

Posted in .NET, Programación, Web at 3:46 pm by Miguel

Recomendado :)

http://www.devjoker.com

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

09.26.07

Buenas Prácticas: Definición de Excepciones Propias

Posted in Buenas Prácticas, Programación at 8:44 pm by Miguel

Inicio una nueva saga de opinión relacionado con las buenas prácticas. La primera, está relacionada con la programación, en concreto con la creación de excepciones propias, relacionadas con las clases que vayamos generando.

Para los que no conozcan o no hayan trabajado con excepciones, me ahorro la definición y me uno a la reutilización de código: http://es.wikipedia.org/wiki/Manejo_de_excepciones

Una vez situados en el contexto, paso a describir la práctica con un ejemplo.

Supongamos que utilizamos una clase que nos ayudará a extraer datos de un dispositivo GPS, que en un alarde originalidad vamos a llamar “GPS”. La clase tiene varios métodos y no tenemos acceso al código, ya que la importamos a traves de una dll.

1) CountSatelitesDisponibles(): Retorna el total de satélites disponibles para el dispositivo GPS
2) GetLongitud(): Retorna la longitud actual
3) GetLatitud(): Retorna la latitud actual
4) Conectar(): Conecta el dispositivo GPS
5) Desconectar(): Desconecta el dispositivo GPS
6) IsConexion(): Retorna verdadero si hay conexión con el gps, retorna falso en caso contrario

Si nos pusiéramos en marcha para utilizar la clase en nuestra aplicación, podríamos crear algo similar a esto (uso sintaxis C#)

public void miMetodo()
{
    try
    {
        GPS objeto = new GPS();
        objeto.Conectar();
        if (objeto.IsConexion())
        {
            if (objeto.countSatelitesDisponibles()>=4)
            {
                // mostrarPorPantalla es un
                // método que genera una pantalla
                // emergente
                mostrarPorPantalla(objeto.GetLongitud());
            }
        }
    }
    catch(Exception ex)
    {
        // tratarExcepcion es un método
       // que se encarga de mostrar el
       // mensaje por pantalla.
        tratarExcepcion(ex);
    }
    finally
    {
        objeto.Desconectar();
    }
}

¿Qué ocurriría si se produce alguna excepción en la ejecución del código? Pues se haría el catch con el objeto Exception, y tratarExcepcion se encargaría de mostrar un mensaje por pantalla. Si hemos tenido suerte que en la definición de la clase GPS el desarrollador incluyó una excepción genérica con un mensaje de texto, con suerte almenos en ex.Message tendremos parte de la descripción del error. Es todo lo que podríamos hacer desde la llamada a la clase GPS con las herramientas que nos brinda. No somos capaces de tratar la excepción en la conexión, o en el recuento de satélites desde nuestro código, ya que no sabemos cúando se produjo el error allí (si hay mensaje podríamos mirar el mensaje… pero eso es una cutrez nada recomendada y menos en este artículo)

A continuación dejo aquí lo que sería la definición del método Conectar de la clase GPS lanzando excepciones genéricas

public void Conectar()
{
    try
    {
        // Código encargado de conectar el dispositivo GPS
    }
    catch(Exception ex)
    {
        throw new Exception(“Error al conectar”);
    }
}

¿Y si en lugar de utilizar excepciones genéricas dejáramos definidas excepciones propias de la clase y las lanzáramos a estas en lugar de usar la excepción genérica?

public void Conectar()
{
    try
    {
        // Código encargado de conectar el dispositivo GPS
    }
    catch(Exception ex)
    {
        throw new NoSeHaPodidoConectarConElGPSException();
    }
}

public class NoSeHaPodidoConectarConElGPSException:Exception
{
    public NoSeHaPodidoConectarConElGPSException() : base(“Error Conectando”) { }
}

Esto ya es otra cosa, ya que ahora, desde nuestra aplicación podremos tratar exáctamente cual ha sido la excepción que se ha producido. Fijaros:

public void miMetodo()
{
    try
    {
        GPS objeto = new GPS();
        objeto.Conectar();
        if (objeto.IsConexion())
        {
            if (objeto.countSatelitesDisponibles()>=4)
            {
                // mostrarPorPantalla
                // es un método que genera
                // una pantalla emergente
                mostrarPorPantalla(objeto.GetLongitud());
            }
        }
    }
    catch(GPS.NoSeHaPodidoConectarConElGPSException ex)
    {
        //mandarEmailServicioTecnicoGPS se 
        //encarga de coger la excepción,
        // generar un email con la información
        // que incluye y mandarlo al técnico
       // con menor carga de trabajo de nuestra
       // organización.
        mandarEmailServicioTecnicoGPS(ex);
    }
    catch(Exception ex)
    {
        // tratarExcepcion es un método que
        // se encarga de mostrar el mensaje
        // por pantalla.
        tratarExcepcion(ex);
    }
    finally
    {
        objeto.Desconectar();
    }
}

¿Mucho mejor no? ¿Merece o no merece la pena el definir excepciones propias?

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

09.19.07

Desarrollador 5 Estrellas

Posted in .NET, Cursos, Framework, Programación, Web at 8:46 am by Miguel

No sé si conocéis el sistema de Formación/Certificación de Microsoft para Visual Studio 2005, llamado “Desarrollador 5 Estrellas”.

Se trata de una serie de cursos y exámenes que van desde un nivel de dificultad menor (1 estrella) hasta la máxima (5 estrellas). Por cada una de las estrellas existe un temario, con su correspondiente documentación, y unos exámenes tipo test. A medida que te vas viendo preparado tras leer la documentación puedes ir haciendo los test. Por cada test aprobado se abre la posibilidad de hacer los test de las estrellas superiores.

La verdad es que está muy muy bien, ya no sólo por “jugar” un poco y entretenerte si no que sirve bastante para aprender y probarte un poco. Si además añadimos que la documentación que ofrece por cada parte del temario está bastante bien, pues la suma de todo es que como poco váis a salir aprendiendo un montón.

Os dejo la URL
http://www.mslatam.com/latam/msdn/comunidad/dce2005/directory.aspx

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

09.16.07

El Ajax sin control… no sirve de nada

Posted in Programación, Web at 12:02 pm by Miguel

Y como ejemplo de una web donde a mi parecer se está usando Ajax de una forma muy coherente y correcta, tenemos la de AirEuropa http://www.aireuropa.com

No sé si estáis acostumbrados a comprar billetes de avión on-line, en mi caso es así (es lo que tiene haber nacido en una isla), y después de haber probado unas cuantas “engine” de reservas de billetes la que más me ha gustado con diferencia es la de AirEuropa. Tienes sus fallos, lo sé, hasta hace poco cascaba el diseño si entrabas con un Internet Explorer 7, y tiene unos pequeños problemas de usabilidad en el buscador inicial (si te olvidas de marcar que el viaje es únicamente de ida, una vez has seleccionado la fecha, te borra todo y tienes que volver a empezar).

Pero, la verdad, que la forma en que usan Ajax en la tramitación inicial de la reserva (lo que tiene que ver con la selección de origen-destino-fecha-billete), me parece realmente llamativa. Sobre la misma página no hay más que seguir tres pasos

1) Seleccionas billete ida o vuelta
2) Seleccionea Origen y Destino
3) Seleccionas Día
4) Seleccionas entre los vuelos disponibles ese día

La pregunta es ahora, ¿y qué tiene de diferente este flujo con el de resto de buscadores? En cuanto al flujo nada, pero la solución técnica con la que la han llevado a cabo me gusta mucho.

Aunque lo mejor será que lo probéis vosotros mismos, os cuento yo aquí mis sensaciones:

1) Selección de origen, te carga los destinos disponibles (Ajax, no hay recarga de página)
2) Selección de destino, en la parte inferior un calendario muy vistoso y claro se situa en el mes actual, los días que hay vuelo te marca en el día el precio más barato (Ajax, no recarga la página)
3) Selección del día, en la parte inferior aparece un listado con todos los vuelos de ese día, ordenado por horas, marcando el precio del billete de cada uno (Ajax, no recarga la página)
4) Una vez seleccionado el día, en la parte derecha marca el precio total, indicando el precio si eres residente balear (mi caso).
5) Aceptas y ya empezamos con la petición de datos personales, pago y blablabla…

Me parece realmente cómodo y bien diseñado, los pasos son los justos, la verdad es que invita a comprar desde allí.

Es uno de los ejemplos en aplicaciones comerciales y además con una concurrencia que debe ser alta (estamos hablando de la segunda aerolínea española), donde a mi parecer el Ajax se está utilizando en su justa medida, y se está utilizando para mejorar la experiencia del usuario sin pasarnos… una aplicación web no es una aplicación de escritorio, e intentar que eso sea así es para mi un error.

¿Tenéis experiencia en desarrollos con Ajax, podéis aportar vuestra experiencia? Da miedo aún el tomar la decisión tecnológica de usar Ajax en una aplicación web, ¿disponéis en vuestros equipos de trabajo de profesionales con experiencia con esta tecnología?

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

09.15.07

GTD y el cómo gestionar tu tiempo

Posted in Gestión de Proyectos, Libros, Metodologías at 7:17 pm by Miguel

Extraigo la descripción de GTD que incorpora wikipedia en el siguiente link http://es.wikipedia.org/wiki/Getting_Things_Done

“GTD se basa en el principio de que una persona necesita borrar de su mente todas las tareas que tiene pendientes guardándolas en un lugar específico. De este modo, se libera a la mente del trabajo de recordar todo lo que necesita hacer, y permitiéndole concentrarse en la realización de aquellas tareas. La psicología de GTD se basa en hacer fácil el almacenamiento, seguimiento y revisión de toda la información relacionada con las cosas que necesitas hacer. Allen (desarrollador de la teoría) sugiere que muchos de los bloqueos mentales en los que nos encontramos a la hora de completar ciertas tareas vienen dados por una planificación insuficiente (p.e., para cualquier trabajo nosotros debemos aclarar lo que se debe conseguir y que acciones se deben llevar a cabo para completarlo). Según Allen, es más práctico hacerlo reflexionando previamente sobre ello, generando una serie de acciones que hacer más tarde sin necesidad de volverlo a planificar durante su realización.”

Puestos además en serio, me acabo de comprar el libro en Amazon.com

Título: Getting Things Done: The Art of Stress-Free Productivity
Autor: David Allen
Idioma: Inglés

En cuanto esté algo más empapado del tema… os cuento con más profundidad.

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

PowerDesigner, algo más que mucho más allá

Posted in Bases de Datos, Herramientas at 5:05 pm by Miguel

Para los que necesitéis en el día a día de vuestro trabajo dedicar largas horas al modelado de datos, procesos, diagramas UML… existen bastantes herramientas en el mercado. La más famosa (que no la mejor) es Visio, pero existen otras como por ejemplo SmartDraw, y la que ocupa la cabecera de esta entrada, el PowerDesigner.

Hablando sólo de la parte que tiene que ver con el modelado de datos, a parte de las funcionalidades que ya existen en Visio, tenemos algunas otras muy interesantes que me han llamado mucho la atención, como por ejemplo que él mismo es capaz de generarte clases (Java, C#…) para gestionar las tablas que hayamos creado en el modelo de datos.

Links relacionados:

http://www.sybase.com
http://www.sybase.com/products/modelingmetadata/powerdesigner

Rating 3.00 out of 5
[?]

09.13.07

La importancia de la protección del modelo de datos en ámbitos de Software-Factory

Posted in Bases de Datos, Metodologías, Motivación, Programación at 8:25 pm by Miguel

A medida que voy conociendo nuevos proyectos y aplicaciones desarrolladas por otras personas, me doy aún más cuenta de la importancia de proteger y abstraer al desarrollador del modelo de datos en el que asienta una aplicación.

Proteger y abstraer siempre es algo básico, pero sobre todo, si el desarrollo de una aplicación va a llevarse en un modelo de desarrollo de Software-Factory. A continuación expongo alguna de las razones más importantes.

1) La volatidad de los profesionales que trabajan en este tipo de empresas es muy alta.

2) Es habitual que los proyectos estén integrados por un mayor porcentaje de profesionales con experiencia media/baja (becarios, programadores con un año o dos de experiencia…) elevado, liderados por un grupo reducido de profesionales con mayor experiencia (en proyectos de 4 o 5 personas estamos hablando de 1 profesional o 2 realmente qualificado).

3) La formación en las herramientas/tecnologías a utilizar por parte de los miembros del proyecto con menor experiencia es proporcional a los años de experiencia profesional que acumulan.

Con todo este panorama por delante, veo totalmente esencial que el acceso y manipulación del modelo de datos se deba llevar a cabo por los profesionales con más experiencia del grupo, abstrayendo al resto del problema, y centrándolos en el desarrollo de la vista y el controlador. Por supuesto que el desarrollo del controlador se va a basar en llamadas al modelo de datos que hemos protegido, siguiendo unos flujos que el analista funcional debe encargarse de transmitir a los programadores.

¿Cómo llevar a cabo dicha protección y abstracción? A mi modo de ver la mejor forma de realizar esta labor es llegando a crear la sensación al programador de que el modelo de datos no existe, que no hay base de datos. Únicamente disponemos de un conjunto de clases (agrupadas en un NameSpace, Package…), que representan el modelo de negocio y que cuentan ya con una serie de operaciones asociadas.

Y por supuesto dichas clases son una caja negra, de la cual sólo conocemos su estructura, pero para nada cómo funcionan por dentro. Con mi clase “Coche” podré realizar todas las operaciones asociadas a un Coche, es decir, Arrancar, Aparcar, Acelerar, Frenar, PonerFrenodeMano, BajarVentanilla, y podré acceder además a otra información como NumeroDePuertas, VelocidadActual, KilometrosRecorridos, Consumo, Marca, Modelo, Conductor…

Si necesito crear una aplicación que a partir de una ruta por una carretera calcule el consumo de diferentes modelos de coche dependiendo de su velocidad media y de si tiene las ventanillas bajadas, no tendría más que utilizar dos de mis clases Coche y Ruta de la siguiente manera.

// Definimos modelo de coche, abrimos la puerta
Coche.Modelo(Seat.SeisCientos);
Coche.AbrirPuerta();

// Creamos una nueva ruta a partir de alguna de las que tengamos definidas
Ruta.DefinirRuta(Rutas.Zaragoza-Barcelona-PorAP2); 

// Asociamos la ruta al coche, marcamos velocidad, puertas y definimos que el viaje se hará
// con las ventanillas bajadas… arrancamos y ala, a viajar
Coche.EstablecerRuta(Ruta);
Coche.VelocidadMedia = 120;
Coche.NumeroPuertas = 3;
Coche.BajarVentanilla();
Coche.Arrancar();
Coche.RealizarViaje();

// Guardamos los datos asociados al viaje
Coche.AlmacenarDatosConsumo();

Como podemos ver la protección y la encapsulación es máxima. Sabemos que para poder realizar un viaje primero hay que arrancar el coche, pero no sabemos si el arrancar el coche guardará en alguna tabla alguna información al respecto. Por supuesto no sabemos cómo se realiza el cálculo del consumo de carburante respecto a la velocidad media, ruta y estado de las ventanillas… llamando a “RealizarViaje” se calculará todo. Y lo que es más importante, se habrá consultado información sobre la ruta, modelo del coche… tal vez entren en juego 5, 6 o 20 tablas, pero a nosotros nos trae sin cuidado. Y finalmente, a la hora de almacenar los datos de consumo, tal vez tengamos un histórico de consumos asociados al coche, a la ruta… no lo sabemos, de eso se encargará la clase.

¿Por cierto, quién nos asegura que la información se esté guardando en una base de datos relacional? ¿tal vez se esté llevando acabo en un excel, o en un fichero plano separado por comas… o en una mysql, en un sql server o un oracle? ¿Es necesario si quiera que el desarrollador sepa qué es una select o un insert o un update?

Nuestro modelo de datos está 100% protegido a modificaciones llevadas de forma incorrecta.

Y en cuanto a la seguridad, podríamos dar acceso a un modelo de negocio a una tercera empresa para que se encargara del desarrollo de la aplicación, pero sin mostrarle realmente lo que hay detrás (¿en una dll, en un servicio web?)

Y en cuanto a la motivación del equipo de desarrollo, siguiendo esta forma de desarrollo, ¿quién siente realmente que está moviendo al coche? ¿todos?

Saludos.

Miguel.

Rating 3.00 out of 5
[?]

09.12.07

Cargador Nokia por USB

Posted in Tecnología at 8:22 pm by Miguel

Interesante, útil… un poco freak… ¿qué más se puede pedir?

 http://europe.nokia.com/A4317011

Saludos.

Rating 3.00 out of 5
[?]

09.02.07

Ruby On Rails, Active Record + Andamiaje en acción

Posted in Programación, Ruby On Rails, Web at 11:13 am by Miguel

Profundizando un poco más en Ruby on Rails llegamos a otro de los innovadores conceptos que nos ofrece, el Andamiaje.

Para explicar lo que es el Andamiaje en RoR, nada mejor que utilizar un ejemplo en el cual además os habréis visto miles de veces.

En todas las aplicaciones en las que hayáis trabajado existirán una serie de tablas maestras en base de datos, y como siempre, para tenerlas “al día”, tendréis que haber dedicado su tiempo al mantenimiento de las mismas (vamos, lo de siempre, insertar, editar y borrar). Seguramente muchos de vosotros tendréis el proceso automatizado, por lo que al crear una nueva tabla maestra dispondréis de herramientas que vosotros mismos habréis creado para facilitar dicho mantenimiento.

La historia de todo esto es que Ruby On Rails os provee la posibilidad de automatizar los mantenimientos de tablas maestras de forma automática, sencilla y práctica. Como sabremos ya, RoR es un Framework Web asentado totalmente en MVC, por lo que para mostraros la potencia del andamiaje, se van a utilizar conceptos relacionados con el mismo.

Empezamos con el ejemplo, vamos a crear una tabla maestra que se encargue de almacenar coches, para ello, en lugar de irnos a la base de datos y crearlo desde allí, utilizamos Active Record para hacerlo (ya hemos hablado de Active Record en este blog).

ruby script\generate model Coches

Veremos que RoR ha creado una nueva migración y la ha dejado en /db/migrate/create_coche.rb

La editamos, para que muestra finalmente el siguiente aspecto

class CreateCoches < ActiveRecord::Migration
    def self.up
        create_table “coches” do |t|
            t.column “nombre”, :string
            t.column “fecha_alta”, :datetime
        end
    end

    def self.down
        drop_table “coches”
    end
end

Sí, sí, aunque parezca mentira estáis definiendo vuestra tabla a través de código ruby. Y no sólo es eso, como veréis estáis definiendo como crear la tabla y como echarla “patrás” (contra-medidas). Esto es algo estupendo, vamos, estupendísimo, estáis creado los scripts de base de datos y sus contra-medidas de forma clara y totalmente automatizada, y lista para echarse para atrás en caso de ser necesario.

Bien, después de esto, ejecutamos el script (y todos los que hayamos necesitado crear)

rake migrate

A partir de aquí, magia, si consultamos nuestra base de datos veremos la tabla creada con los campos correspondientes, más un campo sorpresa que RoR genera de forma automática, el campo “id”, el cual crea como clave primaria de la tabla.

Bien, ahora si todo siguiera el curson normal tendríamos que dedicarnos a crear el mantenimiento de la tabla, pero… RoR nos va a volver a ayudar utilizando el Andamiaje. Para utilizar andamiaje lo deberemos hacer en el Controlador, y para ello

ruby script\generate controller Coches

Y añadimos el método “scaffold” al controlador

class CochesController < Application Controller
    scaffold :photo
end

Y voila! Ya tenemos el mantenimiento creado… Podréis verlo levantanto WebRick (el servidor web del propio RoR) entrando en http://localhost:3000/Coches… veréis que podréis editar, actualizar e insertar nuevos coches :) mola, no? :)

Eso sí, el interfaz gráfico deja mucho que desear, pero eso es algo que hablaremos más adelante :)

Saludos!

Rating 3.00 out of 5
[?]