YoProgramo.NET Blog
Anotaciones de Programador

¿Como puedo crearme una cuenta OpenID?

openid

OpenID es un sistema de membresía descentralizado que permite mantener nuestros perfiles y passwords seguros en un solo lugar y compartirlo con los sitios que deseamos tener acceso. El sistema OpenID remplaza el popular “Login” y “password” de los diferentes sitios que accedemos por un sistema abierto, estándar y completamente seguro.

Existen muchísimos proveedores de OpenID, casi todas las empresas proveedoras de servicios importantes en la red brindan un servicio de OpenID para sus usuarios.

Para crear una cuenta OpenID deberás primer escoger un proveedor de la lista, luego crear tu perfil (que es algo muy parecido a crear un perfil en cualquier otro servicio web) y luego podrás acceder a tus datos de OpenID para utilizarlos en los servicios que desees.

Algunos Proveedores OpenID:

Ver lista completa de Proveedores OpenID

February 26, 2010 09:33 by fabianfigueredo
Categorías: General

Reformas en YoProgramo.NET

Lo necesitábamos. Un lavado de cara para este sitio ;). Gracias a los reportes de errores y sugerencias de ustedes es que ahora estoy implementando esta nueva versión del portal que implementa nuevas características y un gran cambio en su morfología interna.

lavado de cara 
Foto: flickr.com

Luego de unos meses de trabajo en el rediseño de yoprogramo.net pongo en línea las nuevas reformas en el sitio.

Casi un 90% del código lo escribí en el IDE MonoDevelop, en su momento tenia esperanzas de instalar esta nueva versión sobre Linux con Apache (mod_mono). Pero esto no pudo ser por las incompatibilidades con MONO en distintas DLLs como NhIbernate y Castle.

Informe de incompatibilidades de MoMA:

MoMA

Cambios en yoprogramo.net:

  • Login OpenID: La membresía de yoprogramo.net ahora está basada en DotNetOpenAuth. Con esta fantástica librería pude incluir fácilmente esta característica al portal.
    Con respecto a los usuarios de la anterior versión, pasaron a ser todos usuarios anónimos. Si lo deseas, puedes registrarte ahora con tu cuenta OpenID desde aquí.
  • Usuarios anónimos: Ahora no es necesario ser usuario del portal para enviar una respuesta a una pregunta, solo será necesario que introduzcas tu nombre, email y sitio web.
  • Visualización de código: Cambié los estilos para las porciones de código, ahora uso SyntaxHighlighter
    SyntaxHighlighter
  • Otros cambios: Quizás los cambios más importantes no se vean, pero hay muchos cambios en la estructura del portal y el modelo. Por ejemplo, antes habían objetos como Post y Respuesta, ahora todo es tomado como simples posts. De esta manera logre simplificar mucho los procesos en los servicios y el diseño de las tablas.

No quiero terminar este post sin antes agradecer a todos los que me apoyaron en este sitio, José, Mario, Jorge, Milagros, Darío, Alan y la lista no termina ;). Muchas gracias y espero que les gusten estos cambios. Cualquier duda que tengan, informe de errores o sugerencias será siempre bienvenida.

February 24, 2010 04:08 by fabianfigueredo
Categorías: YoProgramo

YoProgramo lanza Fantastic DSL

Con esta impresionante herramienta podremos mapear nuestros objetos sin necesidad de crear un solo XML o cualquier otra clase de archivo, también es posible crear tests, etc.

Aquí podemos ver un ejemplo donde es posible apreciar el poderío de esta fantástica herramienta.

var fObj = FantasticDSL()
            .LoadModel(“model.dll”)
            .UseNH.CreateDataMaps
            .PersistenceIn.SQLServer2008;

bool tests = fObj.CreateUnitTests.UsexUnit.Run.AllTests();

¡Que la inocencia les valga! ;)

December 28, 2009 03:52 by fabianfigueredo
Categorías: General

Feliz Navidad Programadores!

Navidad

Desde yoprogramo.net va un sincero y fuerte abrazo para todos los programadores deseándoles una muy, pero muy, feliz navidad.

December 24, 2009 05:18 by fabianfigueredo
Categorías: General

Manejo de Especificaciones con el delegado Func

Al leer el post de Darío llamado “Predicados y Especificaciones” y luego de hablar ayer con José quise implementar lo que Darío escribió en ese post usando lo que me enseño José. La idea es utilizar el delegado Func<T, bool> en vez de un delegado común.

En el código fuente de yoprogramo.net existen muchas partes donde necesito especificar cosas, ya sea para consultas, etc. Para esto el patrón de especificaciones anda perfecto, les muestro lo que yo hice.

Mi función antes de usar especificaciones:

public IList<IPost> TraerPostsParaHome(int? top)
{
    var query = (from s in TraerTodosSinSpam()
                 where !s.Bloqueado
                 orderby s.PostedAt descending
                 select s).Take(top ?? 100).ToList();
}

Y ahora, luego del refactory quedó así:

public IList<IPost> TraerPostsParaHome(int? top)
{
    return TraerTodosSinSpam()
            .Where(PostEspecificacion.EsApto)
            .OrderByDescending(PostEspecificacion.OrdenarHomePor)
            .Take(top ?? 100)
            .ToList();
}

Mi clase PostEspecificacion:

namespace YoProgramo.Core.Especificaciones
{
    public class PostEspecificacion
    {
        public static Func<IPost, bool> EsApto
        {
            get
            {
                return x => !x.Bloqueado;
            }            
        }

        public static Func<IPost, DateTime> OrdenarHomePor
        {
            get
            {
                return x => x.PostedAt;
            }
        }
    }
}
December 23, 2009 11:35 by fabianfigueredo
Categorías: C#

DDD: Controladores gordos

FatLos controladores son una parte vital de nuestra aplicación, en ellos ocurren procesos importantes del lado del servidor y muchas veces los controladores culminan albergando muchas líneas de código.

Tener controladores gordos no está muy bien que digamos. Particularmente, cuando programo controladores no me gusta llamar a Repositorios, prefiero utilizar instancias de servicios.

Para despejarme estas dudas pregunté esto en la comunidad AltnetHispano y muy gentilmente los muchachos me contestaron.

¿Porque los controladores suben de peso?

  • Al usar directamente Repositorios en nuestros Controladores es probable que terminemos incluyendo Lógica de Negocio en ellos.
  • Hacer reiterativas llamadas a servicios también es malo. En general, si esto es necesario es probable que necesites replantearte donde deberían ir esas líneas de código.

DDD 

Recordemos, que en arquitecturas DDD, los repositorios pertenecen al Dominio pero en realidad son implementados o inyectados en la capa de infraestructura.
En la capa de servicios de aplicación, solo existen interfaces de servicios que luego son inyectados por algún IoC a los servicios con comportamiento.
Un controlador debería poder acceder al dominio para tener acceso a las interfaces de las entidades.

Conclusión:

Usar servicios de aplicación y que estos sean los encargados de acceder a los repositorios es definitivamente una buena idea.
Y recordemos siempre, los controladores deben ser lo más pequeños posibles y fáciles de entender.

Más información: The Fat Controller must die!

December 22, 2009 07:56 by fabianfigueredo
Categorías: C# | Arquitectura | ASP.NET

TDD: Test Driven Development

Definición de TDD:

TDD es una metodología de trabajo donde su principal área de trabajo son los Tests, el desarrollo de una aplicación basada en TDD consiste en  diseñar los tests y luego ir superándolos por medio del refactoreo de la aplicación.

Muchos también dicen que TDD es la suma de dos técnicas de programación: TFD y Refactorización. Con respecto a TFD, es la técnica que a muchos programadores les parecerá extraña y establece inicialmente una pauta que consiste en la creación de los tests primero antes que todo, inclusive antes de cualquier porción de código de nuestra aplicación.

Ciclos TDD:

En esta metodología existen pocos pero importantes pasos a seguir, dichos pasos forman el corazón de TDD y no deberíamos saltear ninguno de ellos.

tdd 

Crear un Test: Escribimos un código que representará a nuestro test o prueba para un determinado requerimiento a superar.

Creación de código y refactoreo: Este es uno de los puntos más importante de TDD, dado que en el es donde modelamos la aplicación basándonos en superar nuestras pruebas.

Ejecutar tests: Consiste en correr todos los tests y verificar que no hayan fallos. En caso de haberlos deberemos refactorizar para lograr pasar las pruebas satisfactoriamente.

Crear nuevos test: El desarrollo continúa y agregamos mas tests para dar comienzo otra vez a todo el ciclo.

December 21, 2009 07:12 by fabianfigueredo
Categorías: TDD

“SELECT NOT IN” en Linq

Para los que quieran hacer un “not in” en Linq es muy fácil, solo hay que usar el operador ! en el clausula Where. Aquí publico el método TraerTodosSinSpam() del servicio PostServicio de la nueva versión de este portal:

public IList<IPost> TraerTodosSinSpam()
{
    var spamsReportados = 
        _spamReportadoServicio.TraerTodasLasEntidades();

    var query = (from c in _postRepositorio.TraerTodos()
                where !(from o in spamsReportados
                        select o.Id).Contains(c.Id)
                 select c).ToList<IPost>();

    return query;            
}
December 11, 2009 07:37 by fabianfigueredo
Categorías: C#

Rediseñando el logo de AltnetHispano

Jorge, José y todos los muchachos de AltnetHispano necesitan de nuestra ayuda, buscan nuevas alternativas para el logo de la comunidad.

Quisiera dar un pequeño aporte y aquí va.

Logo 1:

Altnet

Logo 2:

Altnet

Logo 3:

Altnet

Logo 4:

Altnet 

Me gustaría escuchar *leer* sus opiniones.

December 9, 2009 18:11 by fabianfigueredo
Categorías: General

TDD Falsos Repositorios para Servicios

Ayer, Mario y Ángel me señalaron algunos errores en mi post anterior, en realidad es posible evitar tener que escribir la clase FalsoPostRepositorio.

Aquí les muestro como quedo mi test Crear_post_Test() donde utilizo Callback de moq.

        [TestMethod()]
        public void Crear_post_Test()
        {
            Dictionary<long, IPost> posts = new Dictionary<long, IPost>();
            var falso_repositorio = new Mock<IPostRepositorio>();
            falso_repositorio
                .Setup(x => x.Agregar(It.IsAny<IPost>()))
                .Callback((IPost p) => posts.Add(p.Id, p));
            
            IPostServicio servicioPost = new PostServicio(falso_repositorio.Object);
            IPost post = new Post();
            post.Id = 1;
            post.Title = "Prueba";

            servicioPost.Crear(post);

            Assert.AreEqual(posts.Count, 1);
            Assert.AreEqual(posts[1], post);
        }

y el test que prueba la actualización seria el siguiente:

        [TestMethod()]
        public void Actualizar_post()
        {
            Dictionary<long, IPost> posts = new Dictionary<long, IPost>();
            IPost post = new Post();
            post.Id = 1;
            post.Title = "Prueba";
            posts.Add(1, post);
            var falso_repositorio = new Mock<IPostRepositorio>();
                falso_repositorio
                    .Setup(x => x.Actualizar(IsAny<IPost>()))
                    .Callback<IPost>((p) => posts.ActualizarPost(p));

            IPostServicio servicioPost = new PostServicio(falso_repositorio.Object);
            post = new Post();
            post.Id = 1;
            post.Title = "Prueba actualizada";

            servicioPost.Actualizar(post);

            Assert.AreEqual(posts[1].Title, "Prueba actualizada");
        }

ActualizarPost() es un método de extensión.

December 3, 2009 08:10 by fabianfigueredo
Categorías: C# | TDD