jump to navigation

notatki programisty (usar log4net en sharepoint) July 16, 2009

Posted by npaez in .NET, sharepoint.
Tags: ,
add a comment

Ja! puede que se pregunten que es “notatki programisty”, bueno resulta que como es costumbre por estos dias estabamos trabajando con SharePoint. En particular en esta ocasión intentábamos configurar log4net y mientras haciamos troubleshooting dimos con un blog en un idioma desconocido para nosotros (aunque Charly aventuró correctamente que se trataba de polaco). Si bien ninguno de nosotros manejaba ese idioma, entendimos lo suficiente para resolver nuestro issue. Por si les interesa el blog en cuestión es este:este blog (http://notatkiprogramisty.blogspot.com/2008/04/szybki-start-z-log4net.html)

Saludos!

Presentacion en UTN June 25, 2009

Posted by npaez in agile, noticia.
Tags: ,
add a comment

El martes pasado estuve de invitado en la clase de la materia Arquitectura de Proyecto IT de la Universidad Tecnológica Nacional (regional Buenos Aires). Durante la misma presenté nuestro caso de implementación de métodos ágiles. De los aproximadamente 20 alumnos presentes, solo unos 5 conocian de métodos ágiles y solo 2 habían aplicado. La participación de los alumnos fue buena y creo que la presentación les resulto interesante.

Aquí está publicado el material utilizado durante la presentación.

Como crear una master page propia en Sharepoint June 18, 2009

Posted by matiassnoop in .NET, Diseño, coding, sharepoint.
Tags: , , , ,
add a comment

A continuación describiré los pasos que se deben seguir para crear un feature con una master page:

1) Creamos un proyecto de tipo Class Library( llamemosle por ejemplo: DemoMasterPageFeature)

2)Creamos una carpeta llamada 12.

3) Agregamos una carpeta en 12, y le llamamos Template.

4) Agregamos una carpeta en Template, y le llamamos Features.

5) Agregamos una carpeta en Features, y le llamamos DemoMasterPage.

6)Agregamos tres carpetas en DemoMasterPage, y les llamamos MasterPages, Images y Styles.

7)En la carpeta MasterPages hacemos nuestra masterpage, llamemosla: demomasterpage.master

8)Por otro lado en las carpetas Images y Styles agregaremos las imágenes y los css correspondientes.

9)Agregamos un archivo xml llamado feature.xml  a la carpeta DemoMasterPage.

10)En el escribiremos el siguiente código:

<Feature Id=”95F25D4A-D256-4158-96FE-010F599149CC” Title=”Demo Master Page”
Scope=”Site” Version=”1.0.0.0″ Hidden=”FALSE” DefaultResourceFile=”core” xmlns=http://schemas.microsoft.com/sharepoint/ Description=”This Feature contains the demo master page”>
<ElementManifests>
<ElementManifest Location=”elements.xml” />
<ElementFile Location=”MasterPages\demomasterpage.master” />
</ElementManifests>
</Feature>

11)Agregamos un archivo xml llamado elements.xml  a la carpeta DemoMasterPage.

12) En el escribiremos el siguiente código:

<Elements xmlns=”http://schemas.microsoft.com/sharepoint/”>
<Module Name=”DemoMasterPage” Url=”_catalogs/masterpage” Path=”MasterPages” RootWebOnly=”FALSE”>
<File Url=”demomasterpage.master” Type=”GhostableInLibrary” />
</Module>
</Elements>

13)Realizamos un build en el proyecto para guardar los cambios.

Una vez que realizamos todos estos pasos debemos deployar el feature:

1)Copiamos la carpeta DemoMasterPage en %Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES.

2)Abrimos una command prompt del visual studio e ingresamos lo siguiente:

cd C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN.

3)Posteriormente ingresamos lo siguiente: stsadm -o installfeature -name DemoMasterPage -force

4)Finalmente: stsadm -o activatefeature -name DemoMasterPage -url http://mysitecollectionpath -force

Ahora debemos setear la nueva Master Page.

1)Trabajando en MOSS debemos ir a la configuración del sitio y acceder dentro de Aspecto al link Página Maestra.

2)Seleccionamos en el combo nuestra página y aceptamos.

Con todo estos pasos cumplidos ya tendríamos nuestra nueva MasterPage.

Para realizar el post me guíe en la siguiente pagina: http://sharepointmagazine.net/technical/development/deploying-the-master-page

Demo de cierre de iteración June 7, 2009

Posted by npaez in agile, practices.
Tags: ,
add a comment

El viernes pasado terminanos la tercer iteración del proyecto de portal de compras en el cual estamos trabajando actualmente. Un hecho interesante fue que la demo del producto construido la llevo adelante el product owner y su equipo. Personalmente me parece algo absolutamente normal que sea el product owner quien muestre el producto que el mismo definió, pero esto no parece ser normal para todo el mundo. La realidad es que el hecho de que lo muestre el product owner, no tiene que ver con cuan estable esté el producto sino con cuan acorde esté el producto con lo que el product owner esperaba.  Durante la iteración trabajamos en forma conjunta y validando con el product owner cada funcionalidad desarrollada y es por ello sabiamos que el producto era precisamente lo que el product owner queria.

Estilos en Sharepoint June 4, 2009

Posted by dariofederico in .NET, Diseño.
Tags: , ,
add a comment

Holas!! en mis andanzas por sharepoint me toco investigar los estilos que utiliza y me parece ideal comentar cuales fueron los sitios que me ayudaron a poder customizar un sitio en base a uno echo o a retocarlo desde 0.

Empezemos por mencionar este site el cual nos demuestra como crear un proyecto desde 0 para poder activar tema mediante un feature. http://sharepoint-puntodeencuentro.blogspot.com/

http://www.sharepointblogs.com/jeanmarc/archive/2007/07/20/3201.aspx (Exelente sitio que detalla el nombre de cada clase)

http://www.heathersolomon.com/content/sp07cssreference.htm(Otro exelente sitio con mas detalles)

http://www.sharepointcustomization.com/resources/tipstricks/wss_cssguide.htm(Otra guia de clases de css)

Bueno  con estos links es suficiente informacion para poder empezar a diseñar un sitio sharepoint a tu gusto.

Consejos para no cometer errores: procuren leer bien el primer site el cual nos dice cual es la hoja de estilo que se quiere retocar (mayormente se llama theme.css) . NUNCA se deberia de tocar la hoja de estilo default de sharepoint llamada core.css (ubicada en la carpeta  _layous) ya que podrian obtenerse resultados distintos.

PD: Nunca debe faltar el IE Developer Toolbar para poder inspeccionar algunas clases que no se encuentran en estas paginas o detalles muy pequeños para poder sobreescribirlos en la hoja de estilo que se ha creado ;)

Demonios en Sharepoint (timer jobs) May 29, 2009

Posted by npaez in .NET, Tools.
Tags: , ,
add a comment

Si bien es común ver a SharePoint como una herramienta demoniaca, este post no tiene nada que ver con el diablo o las particularidades demoniacas de este producto, sino con la posibilidad que ofrece SharePoint de ejecutar aplicaciones tipo “demonios” tambien conocidos en el mundo Microsoft como Windows Services. Bien, el nombre con que comunmente se conoce a estas aplicaciones en el mundo SharePoint Timer Jobs.

O sea, si necesitamos crear demonio que se ejecute en el contexto de SharePoint, simplemente debemos crear una clase que implemente Microsoft.SharePoint.Administration.SPJobDefinition. Dentro de dicha clase podremos redefinir el método Execute y hacer nuestro cometido.  Como es común en el desarrollo SharePoint esta clase deberá estar dentro de un assembly firmado que será instalado en la GAC.

Hasta aquí el desarrollo de la funcionalidad, ahora… ¿como lo hacemos correr? Bien, la cuestiones no es tan compleja, lo que debemos hacer es crear un feature que al activarse se encargue de la registración del Job y su calendarización. Hecho esto, solo resta la instalación de la feature y su activación lo cual es igual que con cualquier otra feature. Para tener un detalle del proceso completo recomiendo leer estos artículos de Andrew Connell: uno y otro.

Les dejo este pequeño detalle que me insumió un buen rato hasta que lo descubrí: típicamente este tipo de features suelen crearse como “ocultas”, lo que hace que su activación no pueda hacerse desde la interface web de SharePoint, sino que hay que hacerlas utilizados la herramienta de consola stsadm.exe.

Espero les haya resultado útil.

See U.

Como crear un WebPart en Sharepoint May 26, 2009

Posted by dariofederico in .NET.
Tags: , ,
add a comment

Buenas!! Como sabran estamos utilizando sharepoint y estamos en plena practica. Aca les muestro un mini tutorial de como agregar un web part en un proyecto del tipo sharpoint.

En nuestro caso lo que hicimos fue crear un proyecto del tipo web y ahi añadimos un user control.

Dentro del proyecto de sharepoint añadimos un web part con el nombre del user control ( ej: UserControlWebPart). En la carpeta del web part creado apareceran 3 archivos: UserControlWebPart.cs, UserControlWebPart.webpart y UserControlWebPart.xml.En el UserControlWebPart.cs debemos escribir la lógica para cargar el control

Una vez creado el web part debemos proceder a añadir un template en el proyecto sharepoint, el cual tendra un link al UserControl creado en el proyecto web. Para ello añadimos un template. Dentro de la carpeta template creamos el link añadiendo un archivo existente, elegimos el user control creado y en la opcion de agregar tenemos que elegir “Add As link”.

Una vez realizado estos pasos nos queda por definir que cargue el control en el UserControlWebPart.cs. Para ello debemos poner la siguiente linea de codigo:

protected override void CreateChildControls()
{
base.CreateChildControls();

try
{
//Loads a user control

UserControl userControl= (UserControl)Page.LoadControl(“~/_controltemplates/UserControl.ascx”);
this.Controls.Add(userControl);
}
catch (HttpException ex)
{
this.Controls.Add(new LiteralControl(“<br />An unexpected error occurred loading Web Part. ” + ex.Message));
}
}

Con esto ya tenemos cargado el control.

Si realizamos todos los pasos correctamente si ningun error, cuando ejecutemos deploy y levante el sharpoint, dentro de la aplicacion deberiamos entrar a los WebPart y elegir el control generado, el cual aparecera con un aviso de new! al lado (UserControlWebPart new!). Accedemos al web part y podremos ver la visualizacion del control que fue creado.

protected override void CreateChildControls()
{
base.CreateChildControls();

try
{
//Loads a user control

DetalleOferta detalleOferta = (DetalleOferta)Page.LoadControl(“~/_controltemplates/Ofertas/DetalleOferta.ascx”);
detalleOferta.Web = SPContext.Current.Web;
this.Controls.Add(detalleOferta);
}
catch (HttpException ex)
{
this.Controls.Add(new LiteralControl(“<br />An unexpected error occurred loading Web Part. ” + ex.Message));
}

Visual Studio Extension for Sharepoint issue May 22, 2009

Posted by npaez in .NET, Visual Studio.
Tags: , , , ,
add a comment

Continuando con la saga de Sharepoint esta vez tenemos para reportar un issue que nos causó un par molestias.

Resulta que una de nuestras máquinas de desarrollo tiene un windows 2003 en español. Una vez seteado todo el entorno con las herramientas correspondientes (iis, vs, sharepoint, y las extensiones para vs) comenzamos nuestro desarrollo utilizando los templates provistos por las extensiones de VS, pero resulta que al momento de querer desplegar nos tira un error quejándose por un caracter no válido. Si, el error es así de genérico. El problema está en que el proceso de despliegue quiere copiar un conjunto de archivo que genera al directorio temporal de windows, y resulta que dicho directorio cuando el windows está en español apunta a un directorio …..”configuración”….., si tal cual lo leen con acento y todo, y ese es precisamente el problema: el caracter con acento.

Para solucionar este issue basta con cambiar las variable de entorno “tmp” y “temp” para que apunten a una dirección simple como por ejemplo :”c:\temporal”.

Espero esto resulte de utilidad.

Saludos!

Como crear una pagina web en Sharepoint May 21, 2009

Posted by matiassnoop in .NET, Tools.
Tags: , ,
add a comment

A continuacion voy a describir los pasos:

1- Se crea un proyecto web y un proyecto Sharepoint (usando las visual studio extensions)*.

1.1 Eliminamos el Web.Config del proyecto web

1.2 Agregamos las siguientes librerias: Microsft.Sharepoint y Microsoft.Sharepoint.Security.

1.3 En el code behind de la pagina hacemos referencia a las siguientes librerias:

using Microsoft.SharePoint.Security;

using System.Security.Permissions;

using System.Collections.Generic;

using System.Collections.Specialized;

using Microsoft.SharePoint;

using System.Web.UI;

using System;

1.4 En el aspx, tenemos que poner el assembly con firma de cuatro partes. Por ejemplo:

Inherits=”CiaMega.PortalDeCompras.Forms.NuevaGestionDeCompra3, CiaMega.PortalDeCompras,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5″  Y tambien definimos la master page:

Ejemplo: MasterPageFile=”~masterurl/default.master”

1.5 Agregar debajo de esta linea lo siguiente:

<%@ Register Tagprefix=”SharePoint” Namespace=”Microsoft.SharePoint.WebControls”  Assembly=”Microsoft.SharePoint, Version=12.0.0.0,
Culture=neutral,  PublicKeyToken=71e9bce111e9429c” %>
<%@ Import Namespace=”Microsoft.SharePoint” %>

1.6 Creamos el contenido de nuestra pagina web dentro del ContentPlaceHolderId=”PlaceHolderMain”(existen otros tipos de ContentPlaceHolderId)

1.7 Dentro del proyecto de Sharepoint, agregamos un nuevo item del tipo de sharepoint llamado Module.

1.8 En la carpeta que se genero el Module.xml debemos añadir un link a la pagina aspx correspondiente (Add existing Item as Link).

1.9 En Module.xml debemos modificar la siguiente linea y agregarle la pagina aspx correspondiente: en este caso NuevaGestionDeCompra1.aspx

<File Path=”NuevaGestionDeCompra1.aspx” Url=”NuevaGestionDeCompra1.aspx” />

2.0 Con todo esto realizado deployamos el proyecto de Sharepoint y todo deberia andar correctamente.

*Nota: el hecho de trabajar con dos proyectos por separado obedece a las prácticas sugeridas por el Guidance de P&P.

Const Vs ReadOnly y Clases definidas como Static April 30, 2009

Posted by xdcarp in .NET, coding.
Tags: ,
add a comment

Constantes

Una constante es un valor invariable durante toda la ejecución de la aplicación (web, consola, de escritorio). En C# se declaran anteponiendo la palabra const y el tipo debe ser uno de los tipos integrados del lenguaje (int, string, bool, byte, char, decimal, entre otros http://msdn.microsoft.com/es-ar/library/ya5y69ds.aspx) excluyendo System.Object.

Si tratamos de cambiar el valor de una constante obtendremos el siguiente error de compilación.

const int T = 0;

T = T + 1;

The left-hand side of an assignment must be a variable, property or indexer

No se puede crear una variable de un tipo definido por el usuario ya que obtendremos el siguiente error de compilación:

public const TipoParaPrueba NOCONSTANTE = new TipoParaPrueba(1, 2);

‘ConstVsStaticVsReadOnly.Program.NOCONSTANTE’ is of type ‘ConstVsStaticVsReadOnly.TipoParaPrueba’. A const field of a reference type other than string can only be initialized with null.

Una constante puede ser declarada como public, private, protected, internal o protectedinternal pero no puede ser declarada como static porque se obtiene el siguiente error de compilación:

static public const int NUM = 9;

The constant ‘ConstVsStaticVsReadOnly.Program.NUM’ cannot be marked static

Si definimos la clase del ejemplo, la constante HOY mantendrá el valor 30 durante toda la ejecución del programa.

class Program

{

const int HOY = 30;

static void Main(string[] args)

{

Console.WriteLine(“Hoy = “ + HOY);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Hoy + 1 = “ + (HOY+1));

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

Cuando el compilador encuentra un identificador de constante en el código fuente de C# sustituye directamente el valor literal en el código de lenguaje intermedio (IL) que genera. Dado que no hay ninguna dirección de variable asociada a una constante en tiempo de ejecución, los campos const no se pueden pasar mediante referencia y no pueden aparecer como un valor literal en una expresión.

Si se quiere usar una constante definida en una clase distinta de aquella en la que fue definida se debe seguir la forma ClaseEnLaQueFueDefinida.Constante.

ReadOnly

A diferencia de una constante, un valor definido como readOnly puede ser inicializado al declararse y el valor no cambia durante la ejecución del programa, o puede ser inicializado una sola vez dentro del o de los constructores de una clase y su valor no varia durante toda la ejecución del programa. El siguiente ejemplo muestra lo descrito anteriormente:

class Program

{

static void Main(string[] args)

{

Prueba prueba1 = new Prueba();

Prueba prueba2 = new Prueba(20);

Prueba prueba3 = new Prueba(1,1);

Console.WriteLine(“Si creo una instancia de Prueba y muestro Var tiene el valor 10 = “ + prueba1.VAR);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Si creo un objeto con el constructor numero 2 Var tiene el valor pasado por parametro(20): “ + prueba2.VAR);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Si creo un objeto con el constructor numero 3 Var tiene como valor la suma de los parametros(1,1): “ + prueba3.VAR);

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

class Prueba

{

public readonly int VAR = 10;

public int A { get; set; }

public int B { get; set; }

//constructor 1

public Prueba()

{

}

//constructor 2

public Prueba(int prueba)

{

this.VAR = prueba;

this.A = 1;

this.B = 2;

}

//constructor 3

public Prueba(int a, int b)

{

this.A = a;

this.B = b;

this.VAR = a + b;

}

public int Sumar()

{

return this.A + this.B;

}

}

Como las constantes, no se puede cambiar el valor de una variable declarada como readonly porque se obtiene el error de compilación:

public readonly int VAR = 10;

VAR = 15;

The left-hand side of an assignment must be an l-value

A diferencia de una constante, el tipo de una variable readonly puede ser una clase, struct o array y ser inicializado una vez en tiempo de ejecución (en un constructor) pero no una puede ser una enumeración.

Clases Static

Si definimos una clase como static, no podemos crear instacias suyas, es decir, no se puede usar la palabra reservada new para crear una instancia. Para hacer referencia a sus métodos, es necesario usar el nombre de la clase, como en el siguiente ejemplo:

class Program

{

static void Main(string[] args)

{

Console.WriteLine(“Valor del campo A: “ + Prueba.A);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Valor del campo B: “ + Prueba.B);

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Suma 5 y 2: “ + Prueba.SumarDosNumeros(5,2));

Console.WriteLine(“Presione cualquier tecla para continuar…”);

Console.ReadKey();

Console.WriteLine(“Resta 7 menos 2: “ + Prueba.RestarDosNumeros(7, 2));

Console.WriteLine(“Presione cualquier tecla para salir…”);

Console.ReadKey();

}

}

static class Prueba

{

public static int A = 20;

public static int B

{

get

{

return 15;

}

}

public static int SumarDosNumeros(int a, int b)

{

return a + b;

}

public static int RestarDosNumeros(int a, int b)

{

return a – b;

}

}

Como podemos observar todos los miembros de la clase Prueba son estáticos, una clase estática no puede tener constructores de instancia pero si constructores estáticos si posee campos que deben ser inicializados con valores no triviales, no se instacia y está sellada (no se puede heredar de esta clase).