martes 9 de diciembre de 2008

Depuración de código usando Eclipse y Tomcat

Leyendo en la pagina debug_mode=ON encontre un post interesante y practico, que me gustaria compartir, el cual trata de lo siguiente:

La depuración de código es una de las tareas más habituales cuando programamos. Los IDEs como Eclipse ofrecen herramientas para hacer esta práctica de forma sencilla, pero cuando se trata de depurar código que se está ejecutando en un servidor remoto o independiente del entorno tenemos que hacer una pequeña configuración, pero muy útil.

El primer paso es configurar tomcat para que arranque en modo debug y envie la ejecución a un puerto en concreto. Para configurar tomcat editamos el archivo catalina.bat o catalina.sh, dependiendo de si nos encontramos en Windows o un Linux / Mac OS X, y buscamos la línea

set DEBUG_OPTS


Que por defecto se encuentra vacía y la modificamos con el siguiente texto



set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8002


Básicamente esta línea hace que tomcat se arranque en modo debug y le indica que el puerto al que debe mandar las cosas de debug es el 8002, podemos modificar este puerto a nuestra voluntad, siempre que sea un puerto disponible. Estas opciones son opciones de la máquina virtual (desde Java 5), con lo que en otros servidores simplemente habría que investigar dónde ponerlas, por lo demás sería igual.



Ahora toca configurar eclipse para que escuche ese puerto, en la IP en la que se encuentre el servidor. En el caso de este tutorial Eclipse y Tomcat se encuentran en la misma máquina, pero podrían estar en máquinas separadas siempre que se tenga acceso de una a otra.



Para crear una nueva configuración de debug en Eclipse pulsamos en 'Run' -> 'Open Debug Dialog ...' se abrirá una pantalla y en la columna de la izquierda seleccionamos 'Remote Java Application' y pulsamos el botón 'New'. Se nos abrirá una pantalla como la siguiente



3092588768_e08f6521bc_o



En el campo 'project' ponemos el nombre del proyecto en nuestro workspace, en el campo 'host' la ip donde se encuentra el servidor, en nuestro caso localhost y en el campo 'Port' el puerto que hemos configurado anteriormente en el Tomcat. Para finalizar y empezar a depurar sólo debemos hacer click en 'Debug' y poner lo breakpoints donde queramos.



Este post fue realizado por plunchete de la comunidad de debug_mode=ON.

viernes 24 de octubre de 2008

Nuevos WebCast MSDN

Se han organizado tres nuevos webcast para el cono sur los cuales han sido publicados en la lista de WebCast de este blog.

Los nuevos webcast son:

- Conviértase en un Desarrollador de Windows CE Embebido en 60 Minutos

- Dando valor agregado a su Producto: Integración con Network Access Protection (NAP)

- Desde la perspectiva del desarrollador de Software: Microsoft Expression Studio y Microsoft Visual Studio 2008

 

                                                 header_logo

martes 7 de octubre de 2008

Problema: menú de Agregar Vistas (Add View) no aparece.

Si el menú “Add View (with pressenter) and “Add WPF-View (with presenter)” no aparece al momento de crear una solución con SCSF – April 2008 en Visual Studio 2008 con el Services Pack 1 Beta.

ViewRecipesIssue

Causa

El Guidance Package verifica si es que el proyecto donde se agregaran las vistas (Views) se han agregado las siguientes referencias para habilitar “Add View (with presenter) and “Add WPF-View (with presenter)”:

- Microsoft.Practices.CompositeUI assembly

- Microsoft.Practices.ObjectBuilder assembly

- Insfractucture.Interface Project

El template del proyecto que es usado por SCSF tiene la variable $RootNamespace$ como prefijo en las propiedades del proyecto AssemblyName.

<AssemblyName>$RootNamespace$.Infrastructure.Interface</AssemblyName>

Parece ser que en el Visual Studio 2008 sin SP1, la opción “Create Smart Client Solution” ignora la variable $RootNamespace$ en el nombre del assembly. Por lo tanto el nombre del assembly siempre toma el valor como Insfractucture.Interface.

Solución

Para solucionar este inconveniente, es necesario que modifiquemos el código de nuestro Guidance Package, y tenemos que seguir los siguientes pasos:

- Abrir la solución GuidancePackage.sln

- En el Solution Explorer, abrimos el archivo ViewTemplateReferenceVB.cs ubicado en la carpeta References, del proyecto SmartClientFactoryPackage.

- Luego buscamos la siguiente línea de código en el archivo:

Line #154: if (reference.Identity == referenceIdentity) return true;

- Remplazamos esa línea de código por la siguiente:

Line #154: if (reference.Name == referenceIdentity) return true;

Repetimos el tercer y cuarto paso para el archive ViewTemplateReferenceCS.cs ubicado en la carpeta Reference, del proyecto SmartClientFactoryPackage (Línea de código 153).

viernes 26 de septiembre de 2008

WebCast MSDN Octubre

Se ha actualizado la sección de WebCast MSDN con el material proporcionado por Microsoft Cono Sur para el mes de Octubre.

Este mes están muy orientados a WPF (Windows Presentation Foundation).

 

                                  msdn

 

MSDN Media Center

martes 23 de septiembre de 2008

Tutorial Disconnected Service Agent

Esta documentación trata sobre cómo crear, implementar y usar DSA. Para llevar a cabo esta implementación se necesitan los siguientes componentes:

- SCSF May 2007

- Microsoft SQL Server Compact Edition 3.5

- Visual Studio 2005 con C#

Al momento de crear una aplicación con Composite Aplication Block lo que obtenemos en el Solution Explorer de Visual Studio lo podemos apreciar en la siguiente imagen.

clip_image002[4]

El Solution Explorer contiene los siguientes directorios:

- Infrastructure: Es te directorio contiene el stuff de Smart Client Software Factory.

- Business Modules: Acá se encuentra la GUI que consume los web services con WCF.

- WCFService: Contiene la definición del web services. Esto es opcional si es que lo quieren implementar en la misma solución que los demás directorios, también se puede crear en una solución totalmente aparte.

Bien, ahora los pasos a seguir para llevar a cabo la implementación de DSA son los siguientes:

Agregar Librerías de SQL

DSA necesita una base de datos para poder guardar los request queue, para ello tenemos que agregar unas librerías en nuestra solución, que las podemos encontrar en el siguiente directorio C:\Program Files\Microsoft SQL Server Compact Edition\v3.5.

Las librerías a agregar son:

- sqlceca35.dll

- sqlcecomact35.dll

- sqlceer35EN.dll

- sqlceme35.dll

- sqlceoledb35.dll

- sqlceqp35.dll

- sqlcese35.dll

- System.Data.SqlServerCe.Entity.dll

Nos quedaría el Shell como se muestra en la siguiente imagen:

clip_image002[6]

Agregar Base de Datos

Necesitamos de una base de datos para poder guardar nuestros request del web services. Para ello agregamos nuestra base de datos de tipo SQL Compact Edition (.sdf) al proyecto “Infrastructure.Module”.

Crear el DSA

La forma de crear el DSA es bastante simple gracias a que podemos usar el SCSF recipe para hacerlo. La forma de hacerlo es la siguiente.

Hacemos click con el botón derecho en la referencia del web services, que puede estar ubicada dentro de nuestro Business Module o también dentro de nuestro Shell, todo eso va depender donde tengamos ubicadas nuestras referencias a los web services. Luego seleccionamos “Smart Client Factory” y después “Create Disconnected Service Agent”, y aparecerá la siguiente ventana:

clip_image002[14]

Hacemos click en el botón “…” para elegir el tipo de proxy, el proxy fue generado cuando agregamos las referencias de nuestros web services, y elegimos la clase que contiene el “Client” del proxy.

clip_image002[10]

Luego de hacer esta tarea nos aparecerá el tipo de métodos que contiene el web services, a través del Client y también el Preview del Solution Explorer.

clip_image002[12]

Apretamos el botón Finish y podremos ver que se ha creado un nuevo directorio que contiene la carpeta DSA.

clip_image002[16]

Y así hemos creado nuestro Service Disconnected Agent.

Modificar el App.config

Ahora abrimos nuestro archivo de configuración de la aplicación que está en el Shell. Y configuramos las siguientes líneas de nuestro XML.

Agregamos en la sección de configuración lo siguiente:

<configSections>

<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings,

Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

<section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings,

Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

<section name="ConnectionMonitor" type="Microsoft.Practices.SmartClient.ConnectionMonitor.Configuration.ConnectionSettingsSection,

Microsoft.Practices.SmartClient.ConnectionMonitor" />

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,

Microsoft.Practices.EnterpriseLibrary.Data" />

</configSections>

Luego modificamos o agregamos la siguiente modificación:

<dataConfiguration defaultDatabase="QueueDatabase">

<providerMappings>

<add databaseType="Microsoft.Practices.SmartClient.EnterpriseLibrary.SmartClientDatabase, Microsoft.Practices.SmartClient.EnterpriseLibrary"

name="System.Data.SqlServerCe" />

</providerMappings>

</dataConfiguration>

Configuramos nuestro Connection Monitor:

<ConnectionMonitor>

<Networks>

<add Name="Internet" Address="http://www.carlodiban.com" />

</Networks>

</ConnectionMonitor>

Esto puede ser a elección de cada uno según los requerimientos que se necesiten.

Y por último configuramos nuestro Connection String:

<connectionStrings>

<remove name="LocalSqlServer" />

<add name="QueueDatabase" connectionString="DataSource=Requests.sdf" providerName="System.Data.SqlServerCe" />

</connectionStrings>

En DataSource tiene que ir el nombre de la base de datos que se creó. En mi caso es Requests.sdf

Request Manager y ConnectionMonitor

Nosotros para poder inicializar nuestro RequestManager lo haremos desde el proyecto “Insfractructure.Module” y abrimos el archivo “ModuleController.cs”. Luego agregamos los using correspondientes que son:

using microsoft.Practices.SmartClient.DisconnectedAgent;

using Microsoft.Practices.SmartClient.EnterpriseLibrary;

Después de hacer esta operación creamos una variable privada de tipo ConnectionMonitor y le decimos que cree su valor desde la configuración esto se hace de la siguiente manera:

private readonly ConnectionMonitor _connectionMonitor = ConnectionMonitorFactory.CreateFromConfiguration();

Después creamos una variable privada de tipo RequestManager.

private RequestManager _requestManager;

Y por ultimo modificamos el método AddServices() de la siguiente manera:

private void AddServices()

{

//TODO: add services provided by the Module. See: Add or AddNew method in WorkItem.Services collection or

// See: ms-help://MS.VSCC.v80/MS.VSIPCC.v80/ms.practices.2005Nov.cab/CAB/html/03-020-Adding%20Services.htm

_requestManager = DatabaseRequestManagerIntializer.Initialize();

_connectionMonitor.Connections.ConnectionStatusChanged += new EventHandler<ConnectionEventArgs>(Connections_ConnectionStatusChanged);

WorkItem.RootWorkItem.Services.Add(_requestManager.RequestQueue);

WorkItem.RootWorkItem.Services.AddNew<Agent>();

}

void Connections_ConnectionStatusChanged(object sender, ConnectionEventArgs e)

{

if (_connectionMonitor.IsConnected)

_requestManager.StartAutomaticDispatch();

}

Con esto inicializamos el Request Manager, luego si la conexión sufre algún cambio de estado se notificara y si estamos conectados se ejecutara el método StartAutomaticDispatch(), para enviar todos nuestros Request pendientes. Y si no hay conexión los Request seguirán almacenados en nuestra base de datos.

Y al final del método agregamos el servicio del Agent a nuestro rootWorkItem.

Consumir el DSA

Para consumir nuestro DSA lo que hay que hacer es asignarle a una variable de tipo Agent que cree una nueva instancia de este y le pasamos un Request Queue para que se cree en la clase Agent. Luego creamos una variable de tipo OfflineBehavior y le asignamos como valor el comportamiento que debe tener nuestro offlineBehavior según sea nuestro método del web services y por último llamamos al método que corresponde desde la clase Agent y le pasamos los parámetros, si es que el método requiere y nuestro offlineBehavior.

public IdCodeNameList GetAllCategorias()

{

IdCodeNameList result = null;

if (_connectionMonitor.IsConnected)

{

result = _coreDataClient.GetAllCategorias();

}

else

{

_agent = new Agent(RequestManager.Instance.RequestQueue);

OfflineBehavior offlineBehavior = Agent.GetGetAllCategoriasDefaultBehavior();

_agent.GetAllCategorias(offlineBehavior);

}

return result;

}

En el código muestro un ejemplo de lo recién redactado. Lo que estoy haciendo en el código, es preguntar si es que tengo conexión, llamo al servicio y todo funcionaria normal. Si no tengo conexión encolo mi requerimiento para el servicio, y así cuando se recupere la conexión sea enviado.

Clases del DSA

Nuestro directorio DSA contiene dos clases como pudieron ver una es la clase Agent.cs y la otra es la clase Callback.cs.

En la clase Agent los cambio que hay que hacer son casi nulos gracias al SCSF récipe, ya que al momento de configurarlo se generan todas las configuraciones de esta clase, si posteriormente queremos hacer algún cambio, por ejemplo el cambio del EndPoint lo debemos hacer en la clase Agent.

En la clase Callback, pueden haber dos sucesos el primero es que si obtenemos el resultado de nuestro método del servicio, podemos realizar una acción en el método de la clase Callback.cs On”NombreDelMetododelServicio”Return(Request request, object[] parameters, object returnValues)

Y en el segundo caso podemos recibir un error que haya ocurrido, por ende podemos manejarlo en el método On”NombreDelMetodoDelServicio”Exception(Request request, Exception ex).

Y ahí podemos lanzar un mensaje de erro o lo que casa usuario estime conveniente.

Un ejemplo de la clase CallBack.cs es el siguiente:

public class Callback : CallbackBase

{

public static event EventHandler<EventArgs<IdCodeNameList>> GetAllCategoriasReturn;

#region GetAllCategorias

public override void OnGetAllCategoriasReturn(Request request, object[] parameters, IdCodeNameList returnValue)

{

GetAllCategoriasReturn(this, new EventArgs<IdCodeNameList>(returnValue));

}

public override OnExceptionAction OnGetAllCategoriasException(Request request, Exception ex)

{

throw new NotImplementedException("Not implemented", ex);

}

#endregion GetAllCategorias

}

viernes 12 de septiembre de 2008

Publicado Marcadores Sociales MSDN

En junio de este año, se anuncio una vista previa de una aplicación de marcadores sociales (en inglés). Esta semana se ha publicado la versión 1.0 de Marcadores sociales de MSDN, TechNet, y Expression que permite a los profesionales técnicos compartir sus favoritos en la web, buscar y conectar con otros profesionales y publicar contenido creado por la comunidad directamente en estos sitios web.

Esta nueva versión de la aplicación de marcadores contiene nueva funcionalidad, incluyendo la habilidad de subscribir a gente y etiquetas, soporte en 12 idiomas diferentes, herramientas de importación desde otros servicios de marcadores que pueda estar utilizando actualmente, además de un diseño nuevo y mejorado.

bookmarks_small

La publicación de la nueva plataforma social también incluye una vista previa de MSDN Code Search (Búsqueda de código de MSDN) que tiene características especializadas en la búsqueda de código en varios sitios de Microsoft incluida MSDN Library mediante la extensión de la búsqueda de MSDN. En futuras versiones esta se expandirá para cubrir MSDN Code Gallery (galería de código de MSDN) y MSDN Foros entre otros. Para obtener más detalles sobre MSDN Code Search, incluyendo sugerencias para buscar código, consulte el blog de Rob Veliz (en inglés).

codesearch_small

 

fuente: http://blogs.msdn.com/somaespanol/

miércoles 27 de agosto de 2008

Introducción a Composite UI Application Block (CAB)

En este post dejo un excelente material correspondiente a Composite UI Application Block, el cual consta de seis parte explicando en detalle el funcionamiento de esta tecnología. El material lo encontré en el blog de Mariano Converti, integrante de SouthWorks y está completamente en español. Yo creo que este aporte es muy importante, ya que es difícil encontrar materiales sobre esta tecnología en español, pero un buen español.

Acá se encuentran los link del blog:

- Introducción a Composite UI Application Block (CAB) I

- Introducción a Composite UI Application Block (CAB) II

- Introducción a Composite UI Application Block (CAB) III

- Introducción a Composite UI Application Block (CAB) IV

- Introducción a Composite UI Application Block (CAB) V - UI Extension Sites

- Introducción a Composite UI Application Block (CAB) VI - Commands

                              

                               NewpnpheroA

 

 

fuente: http://blogs.southworks.net/mconverti