Google CodeJam – India

No creo que mucha gente de la India revise este blog, pero como la convocatoria es para todos, apunto el dato. Desde el 20 de marzo, queda inaugurada otra edición del Google CodeJam, esta vez en la India. 

Para los interesados, pueden encontrar más informacion aquí.

 

Saludos

 

 

Hello elbruno,

 

As a participant of past Code Jams, we thought you would be interested in hearing about Google Code Jam India, Powered by TopCoder.  This exciting competition puts you head-to-head with some of the best coders. Take this opportunity to contend for prize money galore, because Google is giving away Rs. 1,500,000 in cash and prizes. You may not only win money, but a prospect to land a job for the future.

 

Registration is now open for the competition and will remain open through March 20, 2006 at 9AM IST (GMT +5:30).  Anyone intending to compete in this competition must register for the event through the registration path that has been set up exclusively for the tournament: www.google.com/Indiacodejam

FxCop 1.35 Beta

Entre pruebas, betas y otros proyectos, he estado utilizando mucho .Net 2.0. Y después de escribir bastante código se me ocurrió ver la consistencia del mismo. Para mi sorpresa, hace unos días que ya salió la versión 1.35 Beta 1 de FXCop para .Net 2.0. Se puede bajar desde aquí.

Luego de las pruebas, veremos los resultados.

Saludos

Programar vs Programar

Cuando hay que afrontar un nuevo trabajo en equipo, los que me conocen saben que no soy un fanático de las metodologías y también saben lo que me cuesta adaptarme a las mismas. Esto no quiere decir, que el trabajo diario sea siempre diferente, sino que hay pautas que son demasiado estrictas y que, personalmente, pienso que no aportan mucho dentro del proceso de desarrollo. Creo que el resultado final de un proyecto, es tratar de terminarlo en tiempo y forma, agregar un valor agregado a nuestro cliente, respetando siempre las necesidades y capacidades del mismo (aquí rescato una frase del blog de RamonB: … quien va a pagar los salarios no es esta empresa, sino los clientes de esta empresa. El trabajo que hacemos para nuestros clientes es nuestra única fuente de ingresos…)

Si estoy en un pequeño proyecto, donde se me solicita el desarrollo de un portal (por ejemplo), el proyecto está estimado en un par de meses y posee un presupuesto muy limitado. Lo más probable es que no le ofrezca herramientas de ultima generación, de alto coste, ni que tampoco implemente un gran proceso de desarrollo, gestionaré esos pocos recursos para obtener el mejor producto que satisfaga al cliente y que me ofrezca el mejor beneficio posible. Sin embargo, una cosa que no haré es bajar la calidad del producto final.

Para facilitar el proceso de desarrollo tengo a mi alcance muchas buenas herramientas. Un ejemplo, si miramos la nueva generación de .Net, Visual Studio 2005. Podemos apreciar que el mismo, ya incluye muchos componentes que antes debíamos incluir y configurar "a mano" dentro del IDE en Visual Studio 2003. Como por ejemplo, NUnit. Partiendo de esta base, no puedo aceptar la no utilización de estas herramientas. El no utilizarlas es casi como demostrar un total desinterés y desconocimiento sobre un proceso "ágil" de desarrollo. Y cuando hablo de un proceso Ágil, no me refiero a una metodología 100% Agile Programming, sino a saber aprovechar las ventajas que nos brinda la utilización de las pruebas unitarias. (Es muy fácil pasar de "ágil" a "frágil")

Volviendo al caso anterior, por más limitado que sea el presupuesto de mi proyecto, siempre mantendré un nivel de calidad aceptable en el producto final. Para lograrlo, se han desarrollado muchas variantes basadas en TDD, por ejemplo, que podemos implementar. Podemos incluir herramientas gratis y lograr resultados increíbles. Podemos utilizar aprovechar diferentes Frameworks que nos facilitan muchísimo el diseño y la codificación de la aplicación.

Si tenemos acceso a Internet, no tenemos excusas para no brindar un buen resultado final. El MSDN, Google, GotDotNet y algunos blogs, son una fuente inagotable de recursos.

Saludos.

 

PD: Por lo general enfoques de este tipo conllevan un retraso en los proyectos y cuando los proyectos se atrasan o se complican, por lo general hay tres opciones para elegir:

Reproyectar el trabajo a realizar y eliminar una serie de funcionalidades del proyecto (restar funcionalidad, pero mantener la calidad del producto final)

  • Terminar el proyecto, a coste de bajar la calidad del mismo. (terminamos el trabajo, pero no aseguramos la buena calidad del producto final)
  • Crear días de 49 horas y terminar lo que se pueda cuando se pueda (una de las opciones más conocidas, en la que trabajando más horas, por lo general no sabemos hasta donde llegaremos y mucho menos de que manera llegaremos)

    Ninguna es agradable.

    Outlook Security Warning

    Hace un tiempo comentaba como durante el desarrollo de FlowRuler, Microsoft decidió "securizar" un poco más el modelo de objetos de Outlook y casi nos arruina el proyecto. Cuando una aplicación que utilizaba este modelo de objetos, aparecía el siguiente mensaje de Outlook.

     

    Como la base de nuestra aplicación, era la integración con Outlook, tuvimos que buscar una solución. Después de leer bastante, mi amigo Mario encontró un set de componentes que brindaban la misma funcionalidad de Outlook, pero sin mostrar el mensaje de seguridad. Este producto se llama Outlook Redemption e internamente utiliza MAPI y recrea un modelo de objetos semejante al de Outlook. Pero a nivel programación el trabajo es casi igual.

    Hace unos días encontré otra empresa que brinda la misma funcionalidad. MapiLab proporciona un set de componentes que evitan el molesto modelo de objetos de Outlook, ademas de otros productos interesantes, como pueden ser Add-Ins para Outlook, Office e inclusive Outlook Express. Probando algunos de estos productos, veo que son de una calidad muy buena y un precio más que razonable. (Inclusive regalan sus productos a los MVPs, como una campaña promocional supongo )

    Saludos

    Lexico – Lenguaje orientado a objetos en Español

    Supongo que las personas que estén relacionadas con el mundo de la programación pueden comprender lo siguiente:

    tarea:
    {
    los objetos contador, número_de_personas, edad, mayor_edad son cantidades
    los objetos nombre, persona_de_más_edad son caracteres
    entre número_de_personas
    copie 0 en contador, mayor_edad
    variando contador desde 1 hasta número_de_personas haga:
         {
         entre nombre, edad
         es edad > mayor_edad ?
    si:
    {
    copie edad en mayor_edad
    copie nombre en persona_de_más_edad
    }
         }
    muestre "La persona de más edad es:   ", persona_de_más_edad
    }

    Pues bien, es parte de una propuesta orientada a crear un lenguaje de programacion en Español.

    Lexico (Lenguaje experimental introductorio a la computación con objetos) es un apoyo didáctico para quienes se inician en la disciplina de la programación orientada a objetos, está aún en desarrollo y posee algunas características que buscan evitarle al novato la complejidad gramatical de los lenguajes de producción y más bien hacerles la vida fácil en su tarea prioritaria: la adquisición de habilidades en lógica de la programación y elaboración de algoritmos orientados a objetos (POO, OOP).

    Este lenguaje compila para .Net Framework 1.0, 1.1 o 2.0, y la verdad es que viendo un poco las especificaciones del mismo, puedo decir que esta muy trabajado. Han tenido en cuenta todos los operadores de lenguaje, asi como todas las posibles variantes que propone .Net. My bueno 😀

    Pueden encontrar mas informacion –>

    Saludos

    10 AddIns para Visual Studio 2003

    Hace unos días, en MSDN Magazine, apareció un artículo muy interesante sobre los 10 AddIns que todos los desarrolladores deben poseer, si utilizan Visual Studio 2003. La lista completa de productos era la siguiente;

    A algunos los conocía, pero realmente me quedé fascinado con el "documentador" GhostDoc y con el VSMouseBindings (por fin puedo aprovechar mim mouse al 100% !!!)

    El primero, es un nuevo addin, que documenta codigo, pero partiendo de la estructura de los nombres que se deben documentar, realiza una ingenieria inversa y genera el código para documentacion correspondiente.

    Por ejemplo, si poseemos la declaracion de la siguiente funcion:

    public System.Data.DataSet GetCustomer(string CustomerId){}

    Luego de aplicar el proceso de documentacion, se generan lo siguiente.

    /// <summary>

    /// Gets the customer.

    /// </summary>

    /// <param name="CustomerId">The customer id.</param>

    /// <returns></returns>

    public System.Data.DataSet GetCustomer(string CustomerId){} 

    Para los constructores, el proceso es similar.

    public Customers(){}

       

    /// <summary>

    /// Initializes a new instance of the <see cref="Customers"/> class.

    /// </summary>

    public Customers(){}  

    Me ha dejado con :D, ya que es bastante útil y posee un pequeño editor de reglas, donde se puede personalizar aun mas las capacidades de generación de documentación.

    Un detalle –> VB.NET.Enabled = False :S

    Saludos.

    PD: Me hizo acordar a aquellos días, hace bastante tiempo, cuando con Gustavo creamos el bCodeDevUtils para Visual Studio 2003, he aqui una pequeña demo. Lástima que ya con Visual Studio 2005, no tiene sentido mantener este AddIn ya que toda esa funcionalidad la posee internamente Visual Studio 2005.

    Error NDoc.Core.DocumenterException

    Mucho más para contar sobre NDoc, no tengo. Además supongo que todo el mundo lo conoce (y lo utiliza :d).
    Sin embargo, me ha sucedido algo bastante raro mientras lo utilizaba. Estaba generando un proyecto com muchos assemblies dentro del mismo y me apareció el siguiente error:


    An error occured while trying to build the documentation.
      Exception: NDoc.Core.DocumenterException
    This document already has a DocumentElement node.
      Exception: System.InvalidOperationException
    This document already has a DocumentElement node.
      Exception: NDoc.Core.DocumenterException at NDoc.Documenter.Msdn.MsdnDocumenter.Build(Project project) at NDoc.Gui.BuildWorker.ThreadProc()
      Exception: System.InvalidOperationException at System.Xml.XmlDocument.IsValidChildType(XmlNodeType type) at System.Xml.XmlDocument.AppendChildForLoad(XmlNode newChild, XmlDocument doc) at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at NDoc.Documenter.Msdn.MsdnDocumenter.Build(Project project)


    No encontré mucha ayuda en internet, ni tampoco en los foros. Pero se me ocurrió probar, generar la documentacion con la version vieja de NDoc (v1.2), y … funcionaba !!!
    Todavía no se muy bien que causó este error, pero por suerte la version 1.2 de NDoc, me saco de apuros 😀

    Saludos

    Autenticacion de Usuarios con Active Directory

    Hace un tiempo que estoy desarrollando un componente para la autenticacion con varios sistemas que manejan usuarios. No todos son LDAP compatibles, por lo que hay que "personalizarlos" un poco, antes de ponerlos en marcha. En el caso concreto de Active Directory, despues de probar varias funciones, la mejor que encontré fue la siguiente:

    public bool IsAuthenticated(string domain, string username, string pwd)

    {

     string domainAndUsername = domain + @"\" + username;

     DirectoryEntry entry = new DirectoryEntry( _path, domainAndUsername, pwd);

     

     try

     {

      // Bind to the native AdsObject to force authentication.

      Object obj = entry.NativeObject;

      DirectorySearcher search = new DirectorySearcher(entry);

      search.Filter = "(SAMAccountName=" + username + ")";

      search.PropertiesToLoad.Add("cn");

      SearchResult result = search.FindOne();

      if(null == result)

      {

       return false;

      }

      // Update the new path to the user in the directory

      _path = result.Path;

      _filterAttribute = (String)result.Properties["cn"][0];

     }

     catch (Exception ex)

     {

      throw new Exception("Error authenticating user. " + ex.Message);

     }

     return true;

    }

    Esta función trabaja con los objetos de la librería System.DirectoryServices. y para "reflejar" a un usuario dentro de los objetos de Active Directory, se utiliza el objeto DirectoryEntry. Este objeto encapsula la funcionalidad de un Nodo de Active Directory, y en este caso se presenta como un usuario. Para crear un objeto de este tipo se utiliza el Constructor que inicializa una nueva instancia de la clase DirectoryEntry con las propiedades Path, Username y Password.

    path
    Ruta de acceso de DirectoryEntry. La propiedad Path se inicializa en este valor.
    username
    Nombre de usuario que se va a utilizar para autenticar el cliente. La propiedad Username se inicializa en este valor.
    password
    Contraseña que se va a utilizar para autenticar el cliente. La propiedad Password se inicializa en este valor.

    Y personalmente, me ha sido muy útil 😀

    Saludos

    PD: La funcion original y un artículo completísimo sobre desarrollo de aplicaciones seguras se puede encontrar en el MSDN, aqui –>.

    Función: IsEmailValid

    Aqui les presento una función que siempre hace falta y (en mi caso) nunca tengo a mano.

    Un función para validar direcciones de EMail.

    Public Function IsEmailValid(ByVal sEmail As String) As Boolean

        Dim sEmailRegex As String = "^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"

        Dim oRegex As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(sEmailRegex)

        If Not (oRegex.IsMatch(sEmail)) Then

        Return False

        Else

        Return True

        End If

    End Function

    En su versión C# quedaría así;

    public bool IsEmailValid(string sEmail)

    {

     string sEmailRegex = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";

     System.Text.RegularExpressions.Regex oRegex = new System.Text.RegularExpressions.Regex(sEmailRegex);

     if (!((oRegex.IsMatch(sEmail)))) {

       return false;

     } else {

       return true;

     }

    }

    Saludos y espero que les sea ta útil como a mi.

    PD: La función original la obtuve de un CodeSnippet para VS2003 de desde CodeXChange. Les aconsejo este AddIn para Vs2003 ya que se encuentran cosas muy interesantes,