Que el 2016 se presente lleno de cumplimientos de sueños, con disposición a practicar la empatía, para generarnos un mundo mucho mejor para todos!
El año que se está yendo, 2015, fue fuerte, y aportó mucho al crecimiento. Deseo que sean las bases de ese "Imperio de Sueños Realizados" que se viene para todos. Creetelo!!
miércoles, 23 de diciembre de 2015
| Cantidad de Visitas al Articulo: |
Muy Felices Fiestas!
Publicado por Gustavo Suhit en 3:32:00 p. m. 0 comentarios
miércoles, 1 de enero de 2014
| Cantidad de Visitas al Articulo: |
Feliz Año 2014!!!
Muy feliz año 2014 para todos.
Que el 2014 se presente lleno de buena nuevas!!
El año 2013 se presentó con muchas circunstancias potentes, así que agradecido por todo lo bueno recibido, los premios a esfuerzos individual y en conjunto, y por la linda familia y amigos con los que he elegido vivir.
Espero este año volver a escribir en el blog, esperando tener mas tiempos para desarrollar mis pasiones. Así lo he decretado para hacerlo desde aquí en mas.
So Far, So good!
Leer más...Publicado por Gustavo Suhit en 2:04:00 p. m. 0 comentarios
lunes, 24 de diciembre de 2012
| Cantidad de Visitas al Articulo: |
Feliz Navidad y muy Próspero Año 2013!!
Igual que el año pasado, veo que mi última entrada es el saludo del año pasado!! Ufff, que año por favor! A mil, y todavía el pollo sin vender .
Ojalá que este próximo año sea próspero, que nuestros sueños se conviertan en prioridad, y que nos demos cuenta, que lo esencial está en los afectos, por mas que lo material ayude.
Hubo muchos cambios en el mundo, y todos fuimos testigos. Algunas cosas buenas (como River de nuevo en la primera ). Otras no tanto. Lo que si creo, es que las grandes estructuras, rígidas, poco a poco están desmoronándose, y depende de cada uno de nosotros “crear” un nuevo modelo. Mejor calidad de vida que se le llama a veces. Al menos, el mundo no se terminó
, y seguimos andando.
No más, para no hacerlo tedioso, felicidades, y ordenemos las prioridades para que todo fluya mejor.
Felicidades a todos!!!
So Far, So good!
Leer más...Publicado por Gustavo Suhit en 7:42:00 p. m. 0 comentarios
jueves, 22 de diciembre de 2011
| Cantidad de Visitas al Articulo: |
Feliz Navidad y Muy Próspero Año 2012!
Veo que mi última entrada es el saludo del año pasado!! Ufff, que año por favor! A mil, y todavía el pollo sin vender .
Ojalá que este próximo año sea próspero, que nuestros sueños s conviertan en prioridad, y que nos demos cuenta, que lo esencial está en los afectos, por mas que lo material ayude.
Hubo muchos cambios en el mundo, y todos fuimos testigos. Algunas cosas impensadas (como River en el descenso , pero ya vamos a volver, como dijo el dólar, “volveré y seré millones”). Otras no tanto. Lo que si creo, es que las grandes estructuras, rígidas, poco a poco están desmoronándose, y depende de cada uno de nosotros “crear” un nuevo modelo. Mejor calidad de vida que se le llama a veces.
No más, para no hacerlo tedioso, felicidades, y ordenemos las prioridades para que todo fluya mejor.
Felicidades a todos!!!
So Far, So good!
Leer más...Publicado por Gustavo Suhit en 9:09:00 a. m. 0 comentarios
jueves, 23 de diciembre de 2010
| Cantidad de Visitas al Articulo: |
Feliz Navidad y Próspero Año Nuevo!
Un año mas para los optimistas, un año menos para los no tanto. Un año bueno para mi, porque siempre es bueno cuando se tiene una familia que uno ama cerca. Lo demás…es música…
Para darle un toque diferente a este saludo, un poco de humor informático…
¿Saben cuántos programadores hacen falta para cambiar una bombilla? – Crick… crick…
R: Ninguno... es un problema de hardware.
Y un consejo navideño, si dejas el computador prendido, que no quede al alcance de los pequeños curiosos, para que no recibas la alarmante pregunta: Papá papaaaá, que quiere decir "formateando c:?
Felicidades a todos!!!
So Far, So good!
Leer más...Publicado por Gustavo Suhit en 10:00:00 a. m. 0 comentarios
domingo, 26 de septiembre de 2010
| Cantidad de Visitas al Articulo: |
Estándares… y la puerta al mundo…
Tengo una par de horas en el aeropuerto de Tampa, esperando para embarcar a Miami y de allí a Santiago, retornando luego de la Biometric Consortium.
Muy buena la organización, excelentes instalaciones (Tampa Convention Center), buena exposición.
Ahora bien, entrando en tema. Una línea que seguí fue la de los estándares. Obviamente aquí se trataron los estándares de biometría. Se vieron tanto los temas mas técnicos con los status de cada línea, próximos pasos, etc., así como tips comerciales que justifican ampliamente la adopción de los mismos.
Comparto en este artículo algunos de los temas que creo mas importantes de estas conferencias.
Lo que me quedó claro, les aseguro, es que la adopción de los estándares es la llave para abrir, esa puerta al mundo.
Introducción
Para aquellos que no saben de lo que significan los estándares, lo graficaré con un ejemplo.
Imaginen que vamos a una conferencia mundial, donde cada uno de los exponentes hablara en idiomas diferentes. Para que los demás entiendan las exposiciones, existen dos opciones:
- Hablar el mismo idioma del exponente.
- Usar servicios de traducción en línea.
Otra opción es que se defina un lenguaje común, que esté extendido y sea aceptado por todos como “el lenguaje estándar” de comunicación. Por ejemplo el inglés.
De eso tratan los estándares de cualquier tipo. Definir la forma de interoperabilidad entre diversos universos para que la comunicación sea fluida mas allá de lo como esté implementado por detrás.
Beneficios de los Estándares
Una de las conferencias, dictada por Catherine Tilton, se basó en aspectos menos técnicos y mas comerciales. Su título fue: “The ROI of standards – Direct and Indirect Costs and Benefits”. Su título lo dice todo.
El presupuesto estimado a adopción de estándares en las empresas a nivel mundial es de aproximadamente 1.5 billones de dólares. Esto es un parámetro no menor de la importancia.
Algunas de las ventajas de los estándares son:
- Baja, o al menos controla, los costos de licencias de los productos.
- Estimula la innovación.
- Reduce costos de desarrollo.
- Reduce costos de documentación.
- Facilita la comunicación con personas a nivel mundial.
- Permite entregar información importante de nuestros productos SIN dejar al descubierto secretos industriales.
- Asegura interoperabilidad entre diversos ambientes.
- Mejora la seguridad de la información manejada.
Existe un beneficio indirecto llamado “Recovery of Participation”, que indica el valor ahorrado por los problemas encontrados en los procesos de testing para las certificaciones en los estándares. Estos problemas, de no haber sido encontrados en esa etapa, se hubieran traducido en costos operativos en procesos instalados en producción. Está estimado en un valor mínimo de 19 mil dólares en software simples, y hasta 400 mil en software complejos.
Por último las ventajas dependiendo del participante en la adopción de estándares, puedo señalar:
- Vendedor: genera influencia con sus productos. Se puede transformar en líder de un nicho.
- Integrados: Reduce costos de desarrollo, testing y documentación de sus productos, además de conseguir software de clase mundial.
- Cliente Final: Obtiene una reducción de costos de licencias, y la tranquilidad de estar libre para seleccionar o incluso cambiar un proveedor, sin que le afecte a su operación.
Costos de Adopción y Formas
Con respecto a los costos para adoptar un estándar, depende mucho del tipo de producto que sea (hardware o software) y del tipo de estándar que se quiera implementar.
En le caso de software, nuevamente dependiendo del tipo de estándar a adoptar, es factible hacerlo de dos formas:
Implementación Propia: Se compra la definición realizada por la entidad correspondiente de acuerdo al estándar, y se implementa siguiendo los lineamientos definidos en dicho documento. Cada documento (1 por estándar) cuesta desde 10 dólares en adelante.
- Implementación a través de Librerías Externas: Se adquiere unas librerías (SDK – Software Development Kit) y se integra en nuestro producto. Dependerá de cada librería y su modelo de licenciamiento para determinar el valor final.
La opción 1 es mas “económica” si solo vemos el dinero, pero dependiendo de los pasos de certificación de cada estándar, además del desarrollo en sí y testing, puede significar que se convierta en mas costosa.
La ventaja principal en la opción 2 es la celeridad con la que podemos agregar estándares en nuestros productos, con la seguridad que funcionan bien si están certificados.
Existen alternativamente opciones gratuitas de algunos estándares como por ejemplo BioAPI, que son ofrecidos gratuitos por algunas instituciones en Java o C# por ejemplo. Normalmente son ejemplos de implementaciones, que luego deben ser certificadas.
Lo que viene
El NIST está preparando un laboratorio de certificación de diversos productos que será debidamente informado cuando esté operativo.
De todas formas, existen ahora mecanismos definidos en el sitio de NIST para certificación de los diversos estándares.
Espero esto les haya servido de introducción, y cualquier duda me avisan.
So Far, So Good
Leer más...Publicado por Gustavo Suhit en 6:23:00 p. m. 0 comentarios
Categorias: Biometría, Conferencias, Desarrollo, Estándares, Informática, Innovación
jueves, 9 de septiembre de 2010
| Cantidad de Visitas al Articulo: |
Biometrika First Wednesday 01/09/2010
Publico aquí la presentación realizada en el Colegio de Ingenieros el día 01 de Septiembre de 2010, en el ciclo denominado First Wednesday.
Biometrika First Wednesday 01/09/2010 View more presentations from Gustavo Suhit. |
So Far, So good!
Publicado por Gustavo Suhit en 11:48:00 p. m. 0 comentarios
Categorias: Biometría, Conferencias, Emprendimiento, Negocios
miércoles, 25 de agosto de 2010
| Cantidad de Visitas al Articulo: |
Expositor en Evento First Wednesday

Publicado por Gustavo Suhit en 6:01:00 p. m. 0 comentarios
Categorias: Emprendimiento, General, Informática, Innovación, Prensa
lunes, 2 de agosto de 2010
| Cantidad de Visitas al Articulo: |
JTwain - Utilizando el scanner desde Java – Parte 2
Hace varios meses escribí un artículo acerca de la utilización del estándar TWAIN, que resultó ser el mas visitado por lejos. Evidentemente un tema que fue útil.
Desde ya hace algunos días, he recibido varias peticiones a mi mail para que enviara las librerías de mmscomputing, debido a que su sitio no estaba mas en el aire. Es por eso que decidí dejarlas en un sitio compartido para cualquiera que las necesite.
Pueden descargar las librerías aquí.
Cualquier consulta por favor, hacerla a través de los comentarios de este o al anterior artículo.
So far, So good!
Imágenes by TinyPic
Leer más...Publicado por Gustavo Suhit en 11:42:00 a. m. 36 comentarios
Categorias: Desarrollo, Informática, Java, Software
jueves, 29 de abril de 2010
| Cantidad de Visitas al Articulo: |
III Seminario Aprender a Emprender

Publicado por Gustavo Suhit en 8:33:00 p. m. 2 comentarios
Categorias: Emprendimiento, General, Informática, Innovación, Prensa
viernes, 5 de marzo de 2010
| Cantidad de Visitas al Articulo: |
Buscando Personas luego del Terremoto
Este servicio está disponible, por favor agréguenlo en todos los canales que puedan.
Gracias.
So Far, So Good!!
Leer más...Publicado por Gustavo Suhit en 9:26:00 a. m. 0 comentarios
Categorias: General, Solidaridad
lunes, 21 de diciembre de 2009
| Cantidad de Visitas al Articulo: |
Feliz Navidad y Muy Próspero 2010 !!!
Muy lejos de querer ser creativo en este saludo de fin de año, solo quiero desearles lo mejor.
Este año ha sido bastante raro para mi, en muchos aspectos. Pero de todo se aprende.
Ojalá la ansiada “recuperación económica” se de pronto, y nos esclarezca las ideas para poder construir castillos de bases sólidas en el futuro, sin repetir errores del pasado.
Para mi particularmente, este año será especial, y espero ser lo suficientemente flexible para adaptarme a lo que la vida me proponga.
Feliz Año Nuevo!!
Que se cumplan todos nuestros deseos!!!
So Far, So Good!!
Leer más...Publicado por Gustavo Suhit en 11:51:00 p. m. 0 comentarios
domingo, 18 de octubre de 2009
| Cantidad de Visitas al Articulo: |
Download en Sharepoint
Hace un tiempo escribí un artículo introductorio acerca de Sharepoint. Mas específicamente sobre los web services de MOSS.
Para complementar este artículo, ahora entrego una rutina de descarga de documentos desde Sharepoint, sin usar sus web services, dado que en ciertas ocasiones se producen errores en las descargas, debido a fallas de configuración, diferencias configuración y de permisos (especialmente cuando se hacen entregas en desarrollo, QA y Producción), etc.
Los tiempos de descarga incluso son algo mejores, y la seguridad de acceso está garantizada debido a las credenciales presentadas.
Espero les sirva.
Download vía WS de MOSS
No desarrollaré este tema, dado que ya lo hice en el artículo anterior, y allí pueden encontrar el detalle.
Solo decir, que en mi caso, algunas veces tuve problemas, pero no con la versión actual del documento sino con la descarga de las versiones anteriores de los mismos. Por ese motivo, utilicé la segunda opción, que detallo ahora.
Nueva Forma de Download
Una forma fácil y rápida de download, pero no solo de download desde Sharepoint sino desde cualquier sitio web, es utilizando algo por estilo:
public int BajarDocumento(String url, out byte[] arreglo)
{
try {
WebClient request = new WebClient();
request.Credentials = _Credential;
byte[] newFileData = request.DownloadData(url);
arreglo = newFileData;
if (newFileData != null && newFileData.Length > 0)
{
return RET_SUCCEFUL;
}
else
{
return RET_ERR_UNKNOWN;
}
} catch (Exception ex) {
log.error(ex);
}
}
En _Credential, se debe definir las credenciales de autenticación al sitio, de la forma:
_Credential = new NetworkCredential(_User, _Psw, _Domain);
De esta forma, se consigue descargar un documento, de cualquier tipo, y dar la posibilidad de descarga o visualización.
So far, So good!
Leer más...Publicado por Gustavo Suhit en 12:00:00 p. m. 0 comentarios
Categorias: Desarrollo, Informática, Sharepoint, Software
lunes, 27 de julio de 2009
| Cantidad de Visitas al Articulo: |
Microsoft Reporting Services (MRS) – Parte I
Comenzaré en este artículo, con una serie dedicada a ésta herramienta sumamente potente de Microsoft
MRS es un servidor de reportes, habilitados a través de una URL, y que pueden ser accedidos de diferentes formas.
El producto forma parte de las herramientas adicionales que vienen incluidas con la base de datos de Microsoft, SQL Server. En la versión 2005, se agregaron varias mejoras sustanciales, y en la 2008, varias mas. De todas formas, me centraré en la mayor cantidad de características incluidas en todas las versiones.
Algunas de las características mas importantes que puedo mencionar para comenzar son:
| Fácil de instalar | |
| Fácil de configurar | |
| Potente en la generación de reportes de varios tipos | |
| Seguro en la conexión a la base de datos | |
| Fácil de integrar a las aplicaciones |
A través de los diversos artículos cubriré diferentes aspectos del tema, algunos que parecen triviales, pero a la hora de hacerlos, es mejor contar con ayuda.
Go Ahead…
Requerimientos
Los requerimientos básicos son:
| Hardware |
|
| Software |
|
Presentación de MRS y algo mas…
La instalación se realiza desde el mismo instalador que SQL Server, y se seleccionan ciertos parámetros necesarios.
No me extenderé en este (ni en otros temas) dado que los derivaré al blog de Fran Díaz, donde comienza su seguidilla de artículos acerca de Reporting Services con una presentación del producto. Desde allí, podrán encontrar varios puntos importantes relacionados con MRS que están muy claramente explicados.
Solo agregaré algunos trucos que me toco desarrollar en mis proyectos, y algunos detalles que no están relacionados directamente con el producto, pero que afectan al proyecto en última instancia.
Comenzamos
Para poder desarrollar un reporte en MRS, se debe instalar como dije antes, las herramientas necesarias. Cuando se instala MRS en nuestra máquina, aparece un ambiente similar al de VS2005, si es que no lo teníamos instalado desde antes. Si lo teníamos, lo que hace el instalador, es agregar los templates necesarios para crear Proyectos de Reportes.
Nota Importante: Puede pasar que cuando tenemos instalado el VS2005, e instalamos VS2005, se eliminen desde la carpeta correspondiente, los templates de VS2005. Esto ocasiona que cuando abrimos el VS2005, y pedimos crear un nuevo proyecto, solo se muestre el template de reportes. Un forma fácil de corregir el problema, sin tener que reinstalar VS2005, es copiar los templates desde la carpeta global a los de nuestro perfil, de tal forma que vuelvan a aparecer. Eso se logra copiando desde la carpeta C:\Archivos de programa\Microsoft Visual Studio 8\Common7\IDE a la carpeta C:\Documents and Settings\<usuario>\Mis documentos\Visual Studio 2005\Templates, las carpetas ItemTemplates y ProjectTemplates.
Lo primero es crear un proyecto del tipo de reportes.
Luego, se pueden definir DataSources o Reportes.
- DataSources: son conexiones a bases de datos, con sus correspondientes credenciales. Estos DataSources son los utilizados por los reportes para conseguir los datos.
- Reportes: Archivos .rdl, donde se dibuja el reporte y se definen comportamientos específicos a cada lógica de negocios.
La gran ventaja de los DataSources, es que se definen una única vez, y estos son mantenidos por un administrados de bases de datos, y los desarrolladores solo hacen referencia a estos DataSources desde sus reportes, olvidándose en tiempos de ejecución de enviar las credenciales de conexión a la base de datos.
Al seleccionar el Asistente, éste nos guía para rápidamente genera reportes con diferentes temas, subreportes, cortes de control, etc. Luego, una vez hecho este primer paso, podemos agregarle mejoras gráficas e incluso condiciones de visualización mas complejas dependiendo del tipo de informe.
Cuando visualizamos el reporte de la forma:
aparecen en la barra de herramientas, unos controles para utilizar de la forma:
Con estos controles es factible hacer casi cualquier tipo de reporte, haciéndolos no solo útiles sino vistosos.
Por último, es necesario realizar la consulta SQL para acceder a los datos. Para esto, se accede a la lengüeta Datos, en la misma ventana de reportes. Allí se selecciona uno de los DataSources generados, y desde allí se seleccionan las tablas necesarias para obtener los datos correctos. Luego se puede escribir la consulta SQL directamente o trabajar con un asistente. Se ve de la forma:
Para comenzar con un reporte básico, paso a paso, les recomiendo seguir también la ayuda en línea de Microsoft.
En los próximos artículos d esta serie,expondré algunos trucos prácticos para mejorar la calidad de los reportes, así como temas determinantes en el éxito de los proyectos que utilizan MRS.
So far, So good!
Imágenes by Tinypic
Leer más...Publicado por Gustavo Suhit en 12:00:00 p. m. 0 comentarios
Categorias: Desarrollo, Informática, Microsoft, Reporting Services, Software
jueves, 14 de mayo de 2009
| Cantidad de Visitas al Articulo: |
Office Communicator 2007 - Alertas
Debido a un proyecto en el que estoy involucrado, tuve que investigar como integrar a nuestro sistema, el uso del Office Communicator 2007 (OC) para el envío de alertas a los usuarios.
Poco sabía del producto, y bastante me costó encontrar información de utilidad para poder hacerlo.
Aquí expongo algunos tips que creo de utilidad para poder realizar ésta tarea, con ejemplo concretos.
Espero les sirva, para no tener que navegar. tanto por internet :-).
Contexto
Office Communicator 2007 es un sistema de mensajería desarrollado por Microsoft, que permite establecer comunicaciones entre usuarios de un dominio, ya sea a través de mensajes instantáneos o voz, y compartir información.
Tiene varias características de ayuda al negocio, que pueden revisar en la descripción del producto en el sitio oficial.
El Desafío
Nuestro sistema es web. Es un manejador documental que permite un flujo manual de documentos, con bandejas de entradas y salidas de documentos.
El pedido concreto era que un usuario al que se le enviara un documento en esa bandeja de entrada, recibiera un alerta en su Communicator corporativo, con un texto del tipo: “Ud. ha recibido un el documento DDD de parte del usuario UUU. Ingrese a URL …”, a través de un IM (Instant Message)
(Esto es posible en esta compañía, porque el usuario en el momento en que se loguea en su máquina, automáticamente abre el OC).
Dado que el IM es una comunicación de máquina a máquina, y se hace a través del OC, que es una aplicación local, no es factible utilizar una especie de repositorio o cola en un servidor.
La Solución
En primer lugar, para poder trabajar desde C#, lenguaje utilizado en nuestro caso, debimos descargar la API del producto para poder instanciarlo desde programa.
Luego, debimos comprender que se trata de una aplicación stand alone, por lo que no es un sistema de mensajería como el mail, donde el encargado de “rutear” el mensaje es el servidor.
Para poder enviar un mensaje se debe instanciar el OC, a través de la instrucción:
using CommunicatorAPI;
private Messenger _communicator;
private IMessengerAdvanced _communicatorAdvanced;
if (_communicator == null)
{
_communicator = new Messenger();
_communicatorAdvanced = _communicator as IMessengerAdvanced;
_communicator.OnSignin += new DMessengerEvents_OnSigninEventHandler(communicator_OnSignin);
_communicator.OnSignout += new DMessengerEvents_OnSignoutEventHandler(communicator_OnSignout);
_communicator.OnIMWindowCreated += new DMessengerEvents_OnIMWindowCreatedEventHandler(communicator_OnIMWindowCreated);
_communicator.OnIMWindowDestroyed += new DMessengerEvents_OnIMWindowDestroyedEventHandler(communicator_OnIMWindowDestroyed);
_communicator.OnAppShutdown += new DMessengerEvents_OnAppShutdownEventHandler(communicator_OnAppShutdown);
}
luego hacer el LogIn:
_communicator.Signin(0, _userIM, _pswIM);
donde el _userIM es un usaurio que se conectará al sistema, y que debe ser un usuario válido, sino fallará el proceso. Esto significa que se debe tener un usuario genérico de conexión por cada servidor redundante de nuestro sistema, desde donde se desea enviar alarmas.
Una vez logueado, para enviar un mensaje IM, nos debemos “colgar” del evento de apertura de una ventana (DMessengerEvents_OnIMWindowCreatedEventHandler) de la forma:
void communicator_OnIMWindowCreated(object pIMWindow)
{
try
{
IMessengerConversationWndAdvanced imWindow = (IMessengerConversationWndAdvanced)pIMWindow;
if (((IMessengerConversationWndAdvanced)pIMWindow).HWND == windowHandle)
{
// outgoing
if (!String.IsNullOrEmpty(_messageIM))
imWindow.SendText(_messageIM);
imWindow.Close();
windowHandle = 0;
_messageIM = null;
}
else
{
// incoming
windowHandle = imWindow.HWND;
}
}
catch (COMException comException)
{
log.Error(communicator_OnIMWindowCreated [comException].", comException);
}
catch (Exception exception)
{
log.Error("communicator_OnIMWindowCreated [exception].", exception);
}
}
Donde el envío se hace exactamente en la línea:
if (!String.IsNullOrEmpty(_messageIM))
imWindow.SendText(_messageIM);
Siendo _messageIM una variable global antes completada.
Pero para enviar el mensaje se debe abrir la ventana. Para esto podemos usar:
public void SendIM(string userIM, string msgIM)
{
try
{
if (msgIM != null) _messageIM = msgIM;
// Find the Contact using the SipUri
IMessengerContact contact = null;
if (userIM != null)
contact = (IMessengerContact)_communicator.GetContact(userIM, _communicator.MyServiceId);
// Use IMessenger.InstantMessage to send an IM
if (contact != null)
{
IMessengerWindow window = (IMessengerWindow)_communicator.InstantMessage(contact);
windowHandle = window.HWND; // Capture window handle
System.Threading.Thread.Sleep(_timeToSleepBetweebnMsgIM);
log.Debug("OCSender.SendAllIM - Contacto encontrado " + userIM +
", para enviar mensaje: " + msgIM);
}
else
{
log.Debug("OCSender.SendAllIM - No encontro el contacto " + userIM +
", para enviar mensaje: " + msgIM);
}
}
catch (Exception e)
{
log.Error("SendIM [exception].", e);
}
}
Donde userIM es un usuario corporativo, definido por su mail o userid, y msgIM el mensaje propiamente dicho.
Notarán que existe un Sleep, y esto se debe a que se debe dar el tiempo suficiente a la apertura de la ventana y la ejecución del correspondiente código en el evento de apertura, para evitar saltear mensajes.
Ahora bien, si existe la posibilidad de concurrencia en la emisión de alertas, deberíamos manejar una cola de mensajes, y tener una rutina que agregue mensajes a la cola y otra rutina que envíe en algún momento todos los mensajes encolados. Para acceder a dicha cola se podría acceder bloqueándola, para evitar problemas, de la forma:
lock (_colaMsg)
{
_colaMsg.Add(new MensajeIM(toUserIM, messageIM));
}
Donde MensajeIM es un clase que tiene dos propiedades para efectuar luego los envíos.
Espero les sirva, y de necesitar algún soporte, no duden en contactarme. Les puedo enviar una clase que hace todo esto.
So far, So good!
Leer más...Publicado por Gustavo Suhit en 12:27:00 a. m. 3 comentarios
Categorias: Desarrollo, Informática, Microsoft, Office Communicator, Software
martes, 21 de abril de 2009
| Cantidad de Visitas al Articulo: |
Sharepoint – Usando sus Web Services
Dado un proyecto en el que estoy involucrado directamente, he tenido que meterme fuerte en el uso de Sharepoint 2007 (MOSS) para utilizarlo como repositorio de documentos desde un sistema externo.
Aquí comparto con Uds. algunos detalles importantes que me toco investigar, con los típicos “detalles” que terminan haciéndote pasar momentos difíciles.
Si bien aquí desarrollo algo muy básico, les aseguro que si necesitan desarrollar algo del estilo, este artículo les servirá, porque en definitiva, recopila información recogida a lo largo de varias horas de navegación en la web, y luego de probarlo en un ambiente real.
Es factible probar todo esto contra una máquina virtual con Windows 2003 Server Trial y Sharepoint 2007 Trial, que tiene una duración de 60 días, y se pueden descargar desde Microsoft Download Center..
El Contexto
Lo primero que hay que aclarar es que Sharepoint es una herramienta mucho mas amplia que un simple repositorio de documentos. Como explica el link al site de MOSS, este producto permite la colaboración entre equipos, compartiendo información fácil y rápidamente, incluso definiendo workflow a los documentos, lo que lo hace muy potente.
Es factible definir colecciones de sitios web, desde plantillas predefinidas, permitiendo luego que cada usuario personalice su propio sitio, e incluso configure los permisos de acceso a su espacio de trabajo. Todos los permisos están relacionados directamente al AD de Windows.
Como todo repositorio, es factible alojar documentos de diversos tipos, como office, pdf, musicales, videos, imágenes, etc.
Se pueden definir cotas de espacio por sites, por tipos de documentos, e incluso por base de datos, utilizadas para el almacenamiento. Esto permite, desde el punto de vista administrativo, tener un control en el uso de espacio, dado que los usuarios solemos desestimar ese tema, hasta que nos quedamos sin espacio para trabajar. Cada site puede tener asociada una base de datos, o compartirla con otras. Esto queda a criterio del administrador del sistema, pero normalmente se opta por separar las bases de datos, para acelerar los procesos de recuperación en caso de ser necesario, y para tener mas control por aplicación de negocios o espacios específicos de colaboración. Lo importante, es que TODO se almacena en base de datos SQL Server, y no se usa filesystem para nada. Podría se factible desarrollar un provider para almacenamiento en otro repositorio, pero habría que analizar bien la necesidad para justificar en ese caso, la pérdida de seguridad y eventualmente falta de integridad, características que son nativas de MOSS cuando se utiliza SQL Server.
Para trabajar con MOSS, es factible hacerlo de 3 formas:
- A través de su interface (Web), accediendo al sitio en que tenemos permisos, y utilizando las opciones habilitadas según nuestro perfil.
- A través de la API MOSS, pero SOLO si estamos en la misma máquina donde está instalado el producto.
- A través de Web Services estándares de MOSS, que se publican en cada uno de los sites que se crean, sea principal o secundario, y que permiten hacer casi la totalidad de las operaciones que se pueden hacer desde la interface web standard. En caso de existir alguna operación que no se pueda hacer con estos web services, se desarrolla uno nuevo con la API MOSS, se la publica en el sitio que se necesita, y se lo consume tal cual los web services estándares.
Nuestro Ejemplo
Mas allá de las pocas características antes enumeradas, lo que utilizamos en nuestro proyecto fue solo la capacidad de almacenamiento y versionamiento de documentos, en lo que MOSS denomina Document Libraries (Biblioteca de Documentos). Básicamente una DL es un espacio físico que almacena documentos de cualquier tipo, dentro de la estructura de directorios que definamos.
Aquí comienzan a aparecer los problemas típicos de tamaños, espacios, etc. Una limitante que tiene MOSS 2007, cuando utilizamos SQL Server 2005, es que podemos almacenar documentos menores a 2Gb. Esto es porque la limitante se hereda del SQL Server 2005, donde es imposible almacenar una fila mas grande que ese tamaño. No es el caso del SQL Server 2008, que no tiene cota máxima.
De todas formas, el tamaño de los documentos, no es solo por las cotas, sino por la congestión de la red, en caso que sean demasiado grandes y/o que las conexiones sean algo lentas.
Según recomendaciones de Microsoft, es mejor no sobrepasar ciertos límites de cantidades de documentos por carpetas, para evitar problemas en el uso de la interface web. Cuando trabajamos como en nuestro caso programáticamente, pero sin usar la interface nativa, ese límite es mas flexible.
Un tema importante que mencione al pasar antes, es el versionamiento automático que se puede definir en las DL, para que cada vez que subamos un documento, MOSS se encargue de éste tema. Luego es factible recuperar la lista de versiones así como los documentos correspondientes a cada una.
Acerca de la lista de web services estándares, no haré demasiados comentarios, porque aquí pueden encontrar mucha información al respecto, así como en web. Luego, es mucho de prueba y error, para ver como se comportan cada uno de ellos. Es importante aclarar que no todos tienen el mismo tipo de salida, es decir, el resultado retornado no es siempre del mismo tipo, lo que hace mas dificultoso la programación, pero luego de un poco de pruebas, se generalizan las operaciones mas importantes.
Algunos Tips importantes para la programación
Si deseamos hacer un upload de un documento programáticamente a través de los web services estándares de MOSS, podemos hacer algo del estilo:
using (Copy ws = new Copy())
{
try
{
ws.Timeout = _Timeout;
ws.Credentials = _Credential;
string[] copyDest = { <URL de MOSS> };
FieldInformation myFieldInfo1 = new FieldInformation();
myFieldInfo1.InternalName = "Title"; //Titulo
myFieldInfo1.DisplayName = "Título"; //Titulo
myFieldInfo1.Type = FieldType.Text;
myFieldInfo1.Value = filename;
FieldInformation[] myFieldInfoArray = { myFieldInfo1 };
CopyResult myCopyResult1 = new CopyResult();
CopyResult[] myCopyResultArray = { myCopyResult1 };
//Hago el upload propiamente dicho
uint myCopyUint = ws.CopyIntoItems("http://null", copyDest,myFieldInfoArray, file, out myCopyResultArray);
if (myCopyUint == 0)
{
if (myCopyResultArray[0].ErrorMessage != null)
{
log.Error("MOSSHelper.UploadDocument [ErrorCode=" + myCopyResultArray[0].ErrorCode + " - ErrorMessage=" + myCopyResultArray[0].ErrorMessage + "]");
return ParseErrorCopy(myCopyResultArray[0].ErrorCode);
}
}
Copy hace referencia al WS Copy.asmx.
Nota Importnate: Tengan especial cuidado cuando utilicen FieldInformation, para agregar un metadato asociado al documento, dado que si no se completan tanto el Inernal como el DisplayName, ademas del Type y el Value, se completa el upload pero no se llena ese metadata. Y si despues se necesita ese metadata para efecutar búsquedas, estarás en problemas. Además, dependiendo de la versión (inglés, español, etc) el InternalName cambia, y ocurre lo mismo que si no se llenara.
Un Download del mismo archivo podría ser:
using (Copy ws = new Copy())
{
try
{
ws.Timeout = _Timeout;
ws.Credentials = _Credential;
string urlSource = <URL total del docuemnto en MOSS>;
FieldInformation[] myFieldInfoArray;
CopyResult myCopyResult1 = new CopyResult();
//Hago el download propiamente dicho
uint myCopyUint = ws.GetItem(urlSource, out myFieldInfoArray, out file);
if (myCopyUint != 0)
{
ret = (int)myCopyUint;
}
else if (file == null)
{
ret = RET_ERR_DOCUMENT_NOT_FOUNT_IN_MOSS;
}
}
}
Crear un DL:
using (Lists ws = new Lists())
{
try
{
ws.Timeout = _Timeout;
ws.Credentials = _Credential;
string strResult = "";
System.Xml.XmlNode nodeListItems = ws.AddList(nameDL, descripcionDL, 101);
ret = ParseErrorCreateDL(nodeListItems);
} }
Aquí usamos el WS Lists.asmx.
Utilizando DWS.asmx, es factible crear carpetas, con CreateFolder.
Por último, con Versions.asmx, se pueden recuperar las versiones de un documento, y luego, a través de su URL completa, y con ayuda nuevamente de Copy, se pueden recuperar.
Espero les sirvan estos comentarios, y cualquier duda me avisan, para ver si puedo ayudarlos, y de paso, sigo aprendiendo.
So far, So good!
Leer más...
Publicado por Gustavo Suhit en 6:45:00 p. m. 3 comentarios
Categorias: Desarrollo, Informática, Microsoft, Sharepoint, Software
miércoles, 18 de febrero de 2009
| Cantidad de Visitas al Articulo: |
NHibernate – Tips Útiles para el Desarrollo Efectivo
Desde hace ya tiempo utilizo como framework de base de datos Hibernate o NHibernate. Si bien Hibernate ha tenido un desarrollo constante, NHibernate, además de aparecer posteriormente, no ha tenido el empuje de su “hermano mayor”.
De todas formas, la experiencia que he tenido con NHibernate es mas que buena hasta el momento, y seguiré usándolo, debido a que permite a los desarrolladores de productos como yo, una gran flexibilidad a la hora de vender sus productos.
Un tema que en Hibernate ya estaba solucionado desde hace buen tiempo, que era la generación automática de las clases y los archivos de mapeo tomando como base las tablas desde la base de datos en cuestión, en NHibernate no estaba tan desarrollado. Hoy, buceando en internet encontré una herramienta mas que interesante, que no solo genera los mapeos y class para NHibernate, sino para varios templates mas.
En este artículo haré algunas referencias rápidas para temas importantes en el uso de NHibernate, y posteriormente desarrollaré una introducción a la herramienta mencionada, debido a que permite una forma rápida y consistente de adelantar trabajo, por demás tedioso si se lo intenta manual.
NHibernate – Que és y qué ventaja tiene?
NHibernate, es un framework de O/RM (Object/Relational Mapping), un port de Hibernate de Java, que tiene como función principal mapear los objetos desde una aplicación .Net a una base de datos Relacional.
La ventaja fundamental, es que el programador se abstrae de la base de datos con la que está trabajando, y solo trabaja a nivel de clases C#.NET o VB.NET, y NHibernate se preocupa de hacer los mapeos entre las propiedades y las columnas de la base de datos, generando dinámicamente las sentencias SQL para interactuar con la base de datos, según sea la base definida en el archivo de configuración.
NHibernate – Algunas Características
| Bases de Datos Soportadas Están soportadas una lista bastante amplia entre las que se encuentran las bases de datos mas utilizadas a nivel de mercado, tales como Oracle, SQL Server, MySQL, etc. | |
| Relaciones | |
| Performance |
NHibernate – Herramientas de Apoyo
Una de las tareas mas engorrosas es la generación de los archivos de mapeo, que relacionan los nombres de las propiedades en una clase, y las columnas de la base de datos. Esto se genera en XML que debe ser compilado como Embebed Resource en un proyecto .NET.
Una opción es hacerlo manualmente, generando el XML necesario y detallando cada propiedad.
Otra opción, por demás mas productiva, es utilizar herramientas como MyGeneration, con la cual configurando la conexión a la base de datos que con la que deseamos trabajar, y descargando una plantilla de NHibernate de las varias que existen, es factible generar, al mismo tiempo, una clase por cada tabla de la base de datos seleccionada, junto con el archivo de mapeo XML asociado, incluyendo relaciones, claves y hasta vistas.
Desde la ventana principal de la aplicación, si seleccionamos Template Browser, haciendo click en el icono del mundo, podemos descargar mas plantillas, no solo de NHibernate.
Luego, seleccionamos el template deseado, presionamos Execute, y la aplicación generará el código definido (C#, VB, o lo que sea según el template seleccionado) y en el caso específico de estar generando para NHibernate, se generará el archivo de mapeo XML de la forma:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyAsembly.BtrIdentity,MyAsembly" table="btr_identity" lazy="true">
<id name="IdentId" column="ident_id" type="int">
<generator class="native" />
</id>
<property type="string" length="80" name="IdentNick" column="[ident_nick]" />
<property type="string" not-null="true" length="10" name="IdentTipodocumento" column="[ident_tipodocumento]" />
<property type="string" not-null="true" length="20" name="IdentNrodocumento" column="[ident_nrodocumento]" />
<property type="string" length="50" name="IdentNombre" column="[ident_nombre]" />
<property type="string" length="50" name="IdentApellido" column="[ident_apellido]" />
<property type="string" length="1" name="IdentSexo" column="[ident_sexo]" />
<bag name="FkBtrBirBtrIdentity" inverse="true" lazy="true" cascade="all">
<key column="ident_id" />
<one-to-many class="MyAsembly.BtrBir,MyAsembly" />
</bag>
</class>
</hibernate-mapping>
Incluso, hay algunos templates de NHibernate, que generan hasta el proyecto VS2005 o VS2003, con el correspondiente archivo de configuración para establecer la conexión a la base de datos en cuestión.
So far, So good!
Leer más...Publicado por Gustavo Suhit en 12:39:00 a. m. 0 comentarios
Categorias: Desarrollo, Informática, Software


