Saturday, March 21, 2009

Sharepoint Tips y Tricks I Parte

Tip 1- Comprando libros

El primer consejo que les puedo dar es, compren libros, muchos libros, pero que ojalá y obviamente sean buenos. Para ahorrarles en gastos innecesarios, dejenme recomedarles dos biblias excelentes. Muy claramente un libro es sobre Windows Sharepoint Services 3.0 y el otro es sobre MOSS 2007. Estos dos engendros se han convertido en mi mejor fuente de información, por su claridad y excelente forma de explicar cada concepto de estos dos sabores de Sharepoint. Les dejo el enlace de Amazon para que detallen y analicen si los adquieren o no, yo lo hice a ojo cerrado:

http://www.amazon.com/Mastering-Windows-SharePoint-Services-3-0/dp/0470127287/ref=sr_1_16?ie=UTF8&s=books&qid=1237687347&sr=1-16

http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&s=books&qid=1237687534&sr=1-1

Tip 2- Lean estos artículos antes de...

La revista MSDN Magazine llega con un muy interesante artículo, donde los autores comparten experiencias de la vida real y hacen unas excelentes recomendaciones, que dada mi experiencia uno debería tomar en cuenta antes de hacer cualquier cosa con Sharepoint, llamese WSS 3.0 o MOSS 2007.

http://msdn.microsoft.com/es-co/magazine/dd458798.aspx

Igualmente detallen cada uno de los artículos que el citado enlaza poque son igualmente muy buenos, sobre todo si somos desarrolladores marca Sharepoint.

Tip 3- Ya me leí los artículos y ahora?

Después de tener conceptos claros, por lo menos lo básico, es hora de destapar la caja e instalar Sharepoint, aclaro que la instalación debió ser tema de lectura antes de, porque es todo un proceso de cuidado. Si la intención es un ambiente de desarrollo, les recomiendo mucho tener claro el punto del artículo recomendado en Tip 2 "Desarrollando sin Servidor", es decir, que no necesariamente tenemos porque instalar Visual Studio .NET en el servidor donde reside Sharepoint, la idea consumir los Web Services que ofrece la plataforma http://msdn.microsoft.com/es-co/library/ms458094.aspx. Si es un máquina virtual lo que ustedes desean pues simplemente instalen todo ahi. Mi recomendación es que dejen la máquina virtual para juegos con muñecas, en un proyecto real, lo mejor es tener un buen servidor donde desarrollador y diseñador puedan trabajar a la par, ya que las exigencias de negocio de cada cliente exigirán la presencia de estos dos individuos, porque no hay cosa que el usuario final deteste más que el diseño por defecto de Sharepoint. Quieren comenzar a modificar el diseño básico de Sharepoint? todo un reto, y les recomiendo leer sobre Branding en Sharepoint. Si su diseñador es hábil, como en mi afortunado caso, presentenle Sharepoint Designer, aunque igual este señor los regañará, porque realmente lo que Designer hace con el HTML de las páginas, es sencillamente desastrozo, o bueno por lo menos desde la perspectiva del diseñador, quien está acostumbrado a ver cosas más "limpias". Pero no habiendo más, es hora de explotar Sharepoint designer, así que una buena idea es comenzar viendo a los mejores: http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&displaylang=en

No desperdicien dinero en libros de este engendro, que quede claro, no lo veo nada necesario.

Mis consejos son:

- Dejen las páginas maestras de Sharepoint quietas, no las modifiquen, creen sus propias páginas maestras, ojalá basadas en las por defecto y de ahi comiencen el embellecimiento.

- Estudien los formularios ASPX propios de Sharepoint, esos utilizan páginas maestras por defecto de Sharepoint, y por lo tanto no se renderizan con su página maestra, pero aclaro, pueden ponerlos apuntar a la que ustedes construyan. Sinceramente esos formularios propios de Sharepoint, deberían tratar de dejarlos como vienen, a no ser que el cliente les exija que debe conservarse el diseño en todos los rincones, hasta en los más reconditos. Esas formas son por ejemplo: DispForm.aspx, EditForm.aspx, NewForm.aspx.

- Dejen su página mestra global a todo sitio de su proyecto Sharepoint. How To? Primero coloquen su nueva master en el sitio raíz y en cada subsitio que la requiere sencillamente apunten con esta línea en sus páginas ASPX: MasterPageFile="~sitecollection/_catalogs/masterpage/miMaestra.master"

No se inventen más de dos páginas maestras por sitio, es decir máximo yo aconsejo tener la maestra del Home, cuando el cliente requiere que este sea totalmente diferente de lo demás, y su maestra global a cada subsitio. Esto ahorrará dolores de cabeza a ustedes y al adminstrador final.

- Como para el diseñador no hay vida después de las hojas de estilo o CSS, sencillamente estas serán creadas desde cero para su nueva personalización y será enlazada a través de su página mestra global: <link rel="stylesheet" type="text/css" href="miCSS.css"/>

Algo que deberán enfrentar seguramente, si nuevamente cuentan con un gran diseñador que quiere hacer retoques especiales a cosas como WebParts, es que se debe sobreescribir los estilos definidos en CORE.CSS, la hoja de estilos propia de Sharepoint, lo cual se puede lograr en miCSS.css. Les doy un ejemplo, imaginen que quieren ocultar el header de sus webparts, donde sharepoint coloca los titulos de las columnas que se muestran en cada webpart. Hacen esto en su CSS y listo, el estilo por defecto queda sobreescrito:

.default .ms-viewheadertr {
    display:none;
}

Pero deben tener cuidado que lo anterior afectará todos y cada uno de los formularios ASPX que muestran webparts, lo cual no puede ser muy deseable, pero esto ya será vuestro problema.

Esta es mi primera entrada sobre temas relacionados a Sharepoint, que espero poder seguir escribiendo para dar guia y recibir su retroalimentación y así compartir las lecciones aprendidas.

Un abrazo!!

Saturday, November 29, 2008

Arquitectura Empresarial

Hola de nuevo. No se si han escuchado acerca del tema de Arquitectura Empresarial o EA por sus siglas en inglés. Quiero hacer esta pequeña entrada para recomendarles leer y enterarse más de este tema, sus metodologías, frameworks, y el por qué está causando tanto interés y aplicación en grandes compañías, que actualmente se encuentran en una encrucijada a causa de la cantidad de soluciones informáticas, heterogeneidad, y demás problemas a causa de la infinidad de proyectos en los que estas grandes compañías se embarcan con rumbo desconocido. Para eso aparece la EA, intentado poner orden, pero teniendo en cuenta la Estrategia, Procesos, Infraestructura, y Soluciones Software, entre muchos otros detalles, vitales para tratar de poner orden y establecer una carta de navegación para el futuro tecnológico de las empresas.
Quiero recomendarles leer sobre TOGAF, uno de los frameworks y metodologías más utilizados actualmente para apoyar los procesos de EA.

http://www.opengroup.org

Felíz arquitectura.

Friday, November 30, 2007

y LinQ?...

Hola de nuevo.

Esta ves demos cabida a un tema que me llama mucho la atención, y ha de ser del gusto de muchos porque es una nueva herramienta sobre el tapete, para consultar y manipular información, pero no al estilo SQL, no señores, un estilo más c#, con muchas características interesantes que quiero describir en breve:

  • Dicen por ahi que LinQ, es el lenguaje de consultas integrado para el Framework de .NET. Es un conjunto de extensiones de C# y VB.NET, con un modelo de programación unificado que extiende el Framework de .NET para ofrecer consulta integrada de objetos, bases de datos, y XML.
  • Cualquier colección que soporte la interfaz System.Collections.Generic.IEnumerable, o la interfaz genérica IEnumerable<T>, es considerada una secuencia y puede ser operada utilizando los nuevos operadores de consulta de LINQ.
  • Vale la pena mencionar la característica de inferencia de tipos, entre lo nuevo de C#, ya que le permite a las variables locales ser automáticamente tipadas por su expresión de inicialización.

Y viendo código en acción, simplemente creen un proyecto de consola y escriban lo siguiente, para que ejecuten su primer ejemplo utilizando LINQ, sobre colecciones en memoria.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinQ1
{
  class Program
  {
    static void Main(string[] args)
   { 
     NumQuery(); 
   }
   static void NumQuery()
   {
   var numbers = new int[] { 1, 4, 9,  16,25, 36 };
   var evenNumbers = from p in numbers where (p % 2) == 0  select p; Console.WriteLine("Result:");
    foreach (var val in evenNumbers)
      Console.WriteLine(val);
   }
  }
}

Si notaron el uso de la expresión var, aqui es donde el compilador de C# hace inferencia, y determina el tipo de dato correcto sobre la variable. Cabe notar también como la expresión foreach ha sido extendida para utilizar la inferencia de tipos también.

Por ahora esto es solo el inicio, ya iremos viendo cosas mucho más sofisticadas y entendiendo otros temas importantes alrededor de LINQ.

Feliz consulta!!

Monday, November 12, 2007

Eventos Noviembre 8, 9 y 10 de 2007

Hola de nuevo.

En esta entrada quiero dedicar un poco a los eventos de Office System 2007 y metodologia para desarrollo de aplicaciones, que tuve el placer de dictar en Barranquilla y Popayán.
Comencemos por Barranquilla, ciudad calurosa para alguien que ya lleva 2 años en Bogotá, con un calor humano estupendo, gente linda que te recibe sin prevenciones y te hacen sentir como en casa. Estuve exactamente en un evento de la Coporación Universitaria de la Costa, rodeado de estudiantes y expositores de talla internacional. Estos personajes tocaron temas de alta investigación, que me hicieron regresar a tiempos atras cuando estudiaba ingeniería física. Pero entre todo esto, yo entré con una charla de solo 30 minutos sobre programación para Office System 2007. Creo que la gente se llevó lo que iban buscando, ya que el auditorio estaba lleno, a la expectativa del representante de Microsoft. En fin un dia sensacional en el Hotel Dann Carlton, girando al rededor del hermozo mar y el impresionante rio Magdalena. Un abrazo hermanos barranquilleros y ojala pueda volver por allá.

DSC00163
Antes del suculento pescado en salsa de coco y camarones!!

Con pocas horas de sueño, partí hacía mi linda Popayán, donde me esperaban en el Colegio Mayor, con la charla sobre metodologías para deasrrollo de software. Sin palabras, auditorio lleno, y gente muy entusiasmada por escuchar unos cuantos tips e ideas nuevas que les permitan seguir adelante, desarrollandose en sus carreras. Un abrazo a todos los que me recibieron tan amablemente, Mr JD/C gracias Totales!!

Mis hermanos, amigos, en fin super heroes de la Célula UNICAUCA.NET, un recibiemiento como ningun otro. Que nostálgia pero que alegria, saber que dejé ese camino abierto que han continuado abriendo alrededor de la tecnología .NET. Pero más que tecnología se siente un gran calor humano, aunque bastante frio mi Popayán, todo estuvo de maravilla. Gracias por la pizza muchachos. Al dia siguiente una maratón de programación sin muchos ganadores, pero nuevamente viendo gente comprometida, y unos super premios que no pudieron ser entregados por falta de ganadores, pero para la próxima muchachos. A ver si no ponen ejercicios tan díficiles, jejeje, no mentira!!

DSC00217
Hablando de Office System 2007

En fin, una maratón de eventos, sensacional, donde creo todos quedaron satisfechos, y ojala podamos seguir unidos alrededor de la tecnología .NET, un abrazo a todos!!

DSC00233
De izquierda a derecha, heroés de .NET!!

Solo me resta decirle a INETA y a Microsoft gracias por esta oportunidad, y ojala sigamos difundiendo la tecnología .NET para que el nuevo año sea lleno de satisfacciones. Nilda, Sergio, Zulma, muchas gracias!!

Sunday, October 28, 2007

Más y más novedades

Comenzaré por indicarles los sitios específicos para acceder a todo lo referente con Silverlight 1.0 y 1.1. Descargas, ejemplos, y más recursos para acomodarse en primera fila, y poder aprender una tecnología que muy pronto estaré compitiendo fuertemente con el ya conocido Flash y demás engendros!!
http://www.microsoft.com/silverlight/halo3.aspx
http://weblogs.asp.net/scottgu/
http://silverlight.net/
http://silverlight.net/learn/learnvideos.aspx
Ayuda intellisense para Silverlight aqui:
http://weblogs.asp.net/scottgu/archive/2007/08/01/vs-2008-javascript-intellisense-for-silverlight.aspx
Y si quiere un alfa de Silverlight 1.1 para trabajrlo desde VS.NET
http://silverlight.net/getstarted/

El señor Miguel de Icaza y Su Moonlight, el Silverlight para Linux, mmm.
http://mono-project.com/Moonlight
Yo le sugeriria a los de Mono que primero organicen mejor esta página.

Y esto si para comprar palomitas. Microsoft libera el Service Pack I de Microsoft .NET Micro Framework SDX 2.0, para todo lo referente con Hardware Miniatura, ofreciendo las siguientes características:

  • Integración con VS
  • Librerias y drivers de código manejado
  • Emulador extensible
  • Protecciónde memoria flash
  • Herramienta de gestión de la memoeria flash
  • Herramienta de generación de fuentes

Para mayor información:
http://www.microsoft.com/downloads/details.aspx?FamilyID=32f5df20-6c95-4fe8-a76c-0ed56a839ad2&DisplayLang=en

Friday, October 19, 2007

ListBox Multiselect

Hola de nuevo

Hace unos dias, adicioné un control ListBox a una de mis páginas. El control debería utilizar la propiedad SelectionMode = Multiple, permitiendome seleccionar varias opciones del control.  Para mi sorpresa, cuando intentaba hacer esto, y en mi código detectar las opciones seleccionadas, sencillamente solo me retornaba como seleccionada, la primera opción.
Supongamos que cargo mi control en el primer postback de este modo:

if

(!Page.IsPostBack)
{
  ListBox1.Items.Add(
new ListItem("Rock and Roll","1"));
  ListBox1.Items.Add(
new ListItem("Country","1"));
  ListBox1.Items.Add(
new ListItem("Salsa", "1"));
}

Diganme que notan algo peculiar, porque a mí me tomó medio dia darme cuenta del causante de este problema. Si señores, el código asociado a cada opción es el mismo, ese es el "problema". No es cuestión de fijarle AutoPostback=true al control, como sugieren algunos foros, no es fijar la propiedad SmartNavigation=true en VS.NET 2003, no es la forma de recorrer el control para saber qué opciones están seleccionadas, no señores, deben es evitar que el código se repita, y de este modo el problema desaparace. Por ejemplo cuando tengan esto en un botón que me permita imprimir los items seleccionados, el programa debe funcionar sin ningun problema, y sin mostrar como seleccionada solo la primera opción de su listado.

foreach
(ListItem miItem in ListBox1.Items)
{
  if (miItem.Selected)
    Response.Write(miItem.Text);
}

Dos moralejas, primera hay foros alimentados por personas realmente perversas que terminan confundiendo a sus usuarios y segunda, a mí modo de ver aqui hay o un bug o algo que a mí parecer no debería tener este comportamiento.

Feliz solución!!

Saturday, October 13, 2007

Escribiendo buen código parte I

Hola de nuevo

En esta ocasión quiero comenzar con una serie de ejemplos que muestren cómo se debe escribir buen código en las aplicaciones. Es decir, tener en cuenta los recursos de la máquina en la que se van a ejecutar nuestras aplicaciones, ya que aunque hoy en dia el hardware nos favorece en gran medida nuestras metidas de pata con el software, en cualquier momento nuestras aplicaciones se van a ver seriamente afectadas en rendimiento, y por lo tanto llegar a causar errores o el serio aburrimiento de nuestros usuarios.

Utilizar propiedades en nuestras aplicaciones es mi primer recomendado:

1. No más variables públicas, no más métodos al estilo get y set.
2. Las propiedades son el mejor remedio para la encapsulación, si señores ellas exponen nuestros miembros de datos como parte de una interfaz pública.
3. Las propiedades nos permiten acceder nuestras variables y al mismo tiempo manipular su comportamiento, ya que las propiedades utilizan métodos.
4. Escribiendo propiedades tenemos acceso en un solo punto, para cambiar, o agregar funcionalidad según lo necesitemos. Por ejemplo, si decidimos que nuestro cliente no deberá aceptar nombres en blanco podemos hacer lo siguiente:

public class Customer
{
  private string _name;
  public string Name
  {
    get
    {
      return _name;
    }
    set
    {
      if (( value == null ) ||
        ( value.Length == 0 ))
        throw new ArgumentException( "Name cannot be blank",
          "Name" );
      _name = value;
    }
  }

  // ...
}

Con esto ya no tenemos el problema causado por las variables públicas, donde tendríamos que buscar en cada lugar de nuestro mar de código, donde esa variable se utilizó para hacer algo similar en muchas partes del código.

5. Adicionar manejo de hilos es mucho más sencillo, o si no que lo diga el ejemplo:

public string Name
{
  get
  {
    lock( this )
    {
      return _name;
    }
  }
  set
  {
    lock( this )
    {
      _name = value;
    }
  }
}

6. Ya que técnicamente las propiedades son métodos, estas heredan todas sus características, por ejemplo poder ser virtuales:
public class Customer
{
  private string _name;
  public virtual string Name
  {
    get
    {
      return _name;
    }
    set
    {
      _name = value;
    }
  }

  // remaining implementation omitted
}

Propiedades abstractas, o quiza ser parte de una definición de interfaces:

public interface INameValuePair
{
  object Name
  {
    get;
  }
  object Value
  {
    get;
    set;
  }
}

7. En C# 2.0 podemos establecer diferentes modificadores de acceso para los métodos get y set de nuestras propiedades. Por ejmplo, esto es válido:

// Legal C# 2.0:
public class Customer
{
  private string _name;
  public virtual string Name
  {
    get
    {
      return _name;
    }
    protected set
    {
      _name = value;
    }
  }

  // remaining implementation omitted
}

8. Igualmente el uso de indexadores en las propiedades es permitido, haciendo de esto algo muy poderoso:

public int this [ int index ]
{
  get
  {
    return _theValues [ index ] ;
  }
  set
  {
    _theValues[ index ] = value;
  }
}

// Accessing an indexer:
int val = MyObject[ i ];

9. La legibilidadd del código es una ventaja más, ya que accedemos a nuestros miembros de clases utilizando nombres significativos y fáciles de entender para asignar u obtener la data.
string name = customerOne.Name;
customerOne.Name = "This Company, Inc.";

Esto y otras consideraciones son muy importantes, y nos pueden ahorrar dolores de cabeza más adelante. Les queda de tarea analizar por ejemplo qué ocurre con el MSIL generado para nuestras propiedades. Y finalmente decilres que a nivel de desempeño, entre propiedades y métodos normales que accedan campos públicos, aunque estos últimos pudieran en algun momento dado ser más rápidos, la verdad es que el comportamiento inline de los métodos definidos para las propiedades, hace que el JIT o el compilador justo a tiempo del Framework, ponga a la par en rendimiento las diferentes técnicas. No olviden, los miembros deben ser privados y nuestras propiedades serán los puntos por los cuales accedemos y modificamos la información de dichos miembros.

Feliz buena práctica!!