db4o analyzer at june newsletter

El bueno de Germán Viscuso me acaba de avisar que mencionaron adb4o analyzer en el db4o newsletter de junio en la parte de projects, que buena noticia.

Tutorial de NHibernate, primeros pasos

Acabo de publicar este tutorial: Tutorial de NHibernate - Primeros Pasos. Espero que sea de ayuda para comenzar a utilizar NHibernate. Cualquier consulta ó duda me pueden enviar un correo ó suscribirte a NHibernate Hispano, así lo discutimos entre todos.

Oren Eini en dnrTV hablando de NHibernate

Hace un tiempo Ayende (Oren) estuvo en Dot net Rocks pero tambien realizó un screencast de NHibernate en dnrTV. Aquí les dejo el link para que lo vean.
El video muestra a NHibernate como funciona, un ejemplo de como conectarse con NHibernate, con la generacion del esquema de la base, muestra un ejemplo de herencia y las 2 formas de implementarlos: por medio de discriminadores y también con 2 tablas (una para la superclase y la otra para la subclase) sin decirle nada a NHibernate sobre la relación estas, solamente basandose en la relación de herencia entre las clases. A lo último muestra su herramienta NHibernate Query Generator, que se integra al Visual Studio y permite por medio de los mappings files generar codigo para realizar las consultas.
Y como dijo Ayende: “Very, very cool”. Y que lo disfruten.

Nuevo screenshot de Mono.Sms

Esta screenshot fue tomada corriendo en .Net Framework de Microsoft. Dentro de poco liberaremos la release.

Mono.Sms y Windsor Container

Para ponerle un poco de sabor al Core de Mono.Sms, una de las cosas que me encargué de añadir es la capacidad solicitar los proveedores que estén disponibles para enviar mensajes por medio de un container de IoC. Para los que no sepan que es esto, pueden tener una introducción aquí con Spring.Net, o aquí utilizando Windsor.

Para dicha Inversion de Control (IoC) estoy usando Windsor Container.

Este caso todos los proveedores son inyectados, es decir, dejo que el container me entregue en mano, todas la implementaciones existentes de IProvider para la aplicación. Cada proveedor implementa la interfaz IProvider:

namespace Mono.Sms.Core.Provider
{
    public interface IProvider
    {
        string Name { get; set; }
        string Domain { get; set; }
        bool UseSmtp { get; set; }
        string HostName { get; set; }
        string DataPost { get; }
        string Sign { get; }
        string Message { get; set; }
        CelNumber CelNumber { get; set; }
        int NumberOfCharacters { set; get; }
        string Description { get; set; }
    }
}

 y luego configuro los proveedores para que Windsor sepa sobre ellos y pueda crear los objetos: 

  <castle>
    <components>
      <component
        id=”ProviderPersonalPost”
        service=”Mono.Sms.Core.Provider.IProvider, Mono.Sms”
        type=”Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms”
        lyfestyle=”singleton”
        >
        <parameters>
          <Name>Personal</Name>
          <Domain>@personal-net.com.ar</Domain>
          <UseSmtp>false</UseSmtp>
          <HostName>host25.200-43-139.telecom.net.ar</HostName>
          <Port>80</Port>
          <NumberOfCharacters>138</NumberOfCharacters>
          <Description>Este proveedor permite la entrega de
          mensajes a un celular Personal</Description>
        </parameters>
      </component>

      <component
      id=”ProviderPersonalMail”
      service=”Mono.Sms.Core.Provider.IProvider, Mono.Sms”
      type=”Mono.Sms.Core.Provider.PersonalProvider, Mono.Sms”
      lyfestyle=”singleton”
        >
        <parameters>
          <Name>Personal</Name>
          <Domain>@personal-net.com.ar</Domain>
          <UseSmtp>true</UseSmtp>
          <HostName>host25.200-43-139.telecom.net.ar</HostName>
          <Port>80</Port>
          <NumberOfCharacters>110</NumberOfCharacters>
          <Description>Este proveedor permite la entrega de mensajes
          a un celular Personal utilizando mails.</Description>
        </parameters>
      </component>
    </components>
  </castle>

En este caso hemos creado 2 implementaciones para enviar mensajes a una misma empresa, una forma es haciendo un post, y la otra utilzando mails. Hablando en el idioma de Windsor container, hemos creado aquí 2 Componentes (ProviderPersonalPost y ProviderPersonalMail), para un mismo Servicio (IProvider).

Luego para pedirle al container que nos entregue todas las implementaciones de los servicios IProvider, realizo esta siguiente iteración:

  public IList<IProvider> GetAllProviders()
        {
            IHandler[] handles = container.Kernel.GetHandlers(typeof (IProvider));
            IList<IProvider> providersImpl = new List<IProvider>();

            foreach (IHandler hdlr in handles)
            {
                providersImpl.Add((IProvider)hdlr.Resolve(CreationContext.Empty));
            }

            return providersImpl;
        }

Se puede ver que agrego a una lista providersImpl todos los proveedores y los retorno. Y con esto tengo en mano a todos los proveedores con los que puedo mandar mensajes.

Se preguntarán: “Es necesario todo esto para una simple aplicación de sms?”, la respuesta es “No”. Como se sabe, IoC es un principio de diseño, y no un requerimiento indispensable.

Opiniones ? Sientanse como en casa :)

Mono.Sms para enviar mensajes

Mono.Sms es una aplicación que se escribió para mandar mensajes de texto en Argentina a clientes de empresas como Personal, Cti, y Movistar. La ventaja es que lo podemos correr tanto en Linux y Windows. Aquí les mando un screenshot del preview:

 

Dentro de poco se podrá bajar el binario para usarlo, con los nombres de los coders de esta app.

Ejemplo de Aplicación en Capas con Spring y Db4o

Hace algún tiempo había hecho un ejemplo usando Spring y Db4o. Así se me pasó blogguearlo. Para los que quieren bajarlo está:

SalesDb4oSpring - v0.0.1.zip , Ã³

VentasDb4oSpring - v0.0.1.zip.

En la capa de acceso a datos tenemos:

  • ClienteRepositorio
  • RepositorioBase

En la capa de negocio tenemos:

  • Cliente 
  • ClienteBizComponent 
  • BaseBizComponent

Por ahora la capa de presentación está hecha en una consola. Pero despues haré algún ejemplo más complejo, quizás con bindeo de objetos y winforms.

Mostrar fields en Db4o Analyzer

Estuve mirando en Db4o Analyzer y Object Manager la forma en que muestran las collecciones:

En Object Manager:

y en db4o Analyzer:

El problema está en que si un campo es una collección, muestra el tipo de dato de la collección. No muy útil por parte ambos.

Object Manager tampoco muestra el valor del Guid en el campo Id, esto creo que puede corregirse sin mucho código.

Voy a tratar de corregir esto de las collecciones en Db4o Analyzer, algo más a la lista del TODO.

días de refactoring para db4oanalyzer

En estos días estuve un poco ocupado para continuar agregandole features db4oanalyzer, pero si estuve haciendo un poco de refactoring. Aún quedán muchas cosas por hacer.

Estuve escribiendo algunas lineas para un parser para assemblies, de modo de poder crear funciones especializadas para trabajar con nuestras clases dentro de db4oanalyzer, quizás algún día se pueda realizar algún Query Maker a partir de una interfaz gráfica amigable y que genere el código para nosotros. Para el parseo del assembly estoy usando Mono.Cecil, un aplauso para JB Evain por esta librería !!! Inspeccionar assemblies con esta librería es facil, aparte de poder generar assemblies del formato ECMA CIL. Héchenle un vistazo aquí:

http://www.mono-project.com/Cecil

o aquí van a encontrar post sobre Cecil:

http://evain.net/blog/articles/category/cecil

Entre las otras cosas que pude hacer es mejorar el look-and-feel del árbol de objetos:

LG R1 y Ubuntu 7.04

Estoy usando Ubuntu 7.04 muy conforme, solamente tuve problemas para configurar la resolución del monitor, es una laptop LG R1 pro Express Dual con Monitor de 14.1″ en un Ubuntu 7.04. Pero lo solucioné.
Para poder configurar la resolucion 1280×768 en este monitor widescreen (una resolución muy particular), debemos cambiar de driver de video haciendo:

$sudo apt-get install xserver-xorg-video-intel

El gestor se encargará de desinstalar el paquete xserver-xorg-video-i810 que habia instalado automáticamente.
Eso es todo.