viernes, 28 de diciembre de 2012

WSDualHttpBinding - Ejemplo sobre como usar WCF Dúplex (cliente)

Hoy nos disponemos a crear un cliente "Dúplex" para el servicio que creamos la semana pasada. El objetivo es suscribirnos al servicio de notificaciones al lanzar la aplicación, de este modo el servidor guardará nuestra referencia CallBack que usará cuando se produzca un evento que nos afecta para enviarnos las novedades. En resumen tenemos que seguir los siguientes pasos en este orden:

  • Crear un servicio alojado en cliente que implemente el contrato CallBack que tenemos en AreaTicShared para que el servidor pueda enviarnos las novedades cuando considere oportuno.

  • Crear un cliente WCF para podernos suscribir a las novedades al cual asociaremos nuestro CallBack.

Veamos como hacerlo:

En primer lugar para situarnos estamos trabajando en la solución AreaTicClient, es importante incluir la referencia del proyecto AreaTicShared que creamos la semana pasada. Para crear el servicio CallBack hemos de implementar la interfaz "AreaTicShared.Duplex.IServerNotificationsCallBack".
namespace AreaTicClient.Duplex
{
    public class ServiceNotificationsCallBack:IServerNotificationsCallBack
    {
        public void RecibeNotificaciones(List<Notification> pListaNotificaciones)
        {
            //Gestionar la lista que nos devuelve el servidor, mostrando la información por pantalla o haciendo lo que nos apetezca con la notificación. 
        }
    }
}
A continuación veremos como crear el cliente WCF Duplex, este bloque de código se encarga de crear un cliente que apunte al servicio Dúplex que definimos la semana pasada en servidor y lo asocia al CallBack que hemos definido en el paso anterior. Hemos de ubicar este código en algún punto que se ejecute cada vez que se arranque la aplicación cliente.
  ServiceNotificationsCallBack CallBack = new ServiceNotificationsCallBack();

  WSDualHttpBinding binding = new WSDualHttpBinding();

  binding.ClientBaseAddress = new Uri("http://IPCliente:2100/CallBack");
  
  DuplexChannelFactory<IServerNotifications> cf = new   DuplexChannelFactory<IServerNotifications>(CallBack, binding, new EndpointAddress("http://URLServidor:2100"));

  IServerNotifications wcfClient = cf.CreateChannel();

  wcfClient.SubscripcionListaNovedades(MiIDdeCliente);
En la propiedad ClientBaseAddress del binding hemos de asignar la dirección de respuesta del CallBack. Tanto el ejemplo servidor como cliente usa el puerto 2100 para comunicar pero podríamos usar cualquier otro, simplemente hemos de asegurarnos que la comunicación HTTP está habilitada entre las máquinas por ese puerto.

Nota: Asumo que cada cliente tendrá una dirección IP diferente, en caso que la aplicación cliente esté corriendo en algún TS o Citrix y se pueda dar el caso que varios clientes ejecuten simultáneamente la aplicación cliente compartiendo IP tendríamos que hacer que la URL del callback sea única para cada cliente... Se podría concatenar algún tipo de GUID o identificador único a la URL cliente para evitar este problema.

Con esto ya tendríamos la base de la comunicación Duplex que podríais adaptar cada uno a vuestro escenario. Espero os sirva no dudéis en comentar dudas o cualquier anotación que se os ocurra sobre el tema!! Recordar como siempre que podéis seguir areaTIC en las redes sociales o RSS, esperamos tu participación!


martes, 25 de diciembre de 2012

SQL Server: Uso de directivas y condiciones para saber si hay tablas sin índice cluster

En el artículo "SQL Server: Cómo saber si hay tablas sin índice cluster en una base de datos" de la semana pasada (17 de diciembre) os indicaba la forma de localizar las tablas sin índice cluster mediante una consulta... en este artículo os explicaré la forma de hacerlo mediante el uso de directivas y condiciones, funcionalidad incorporada a partir de SQL Server 2008.

La mejor forma de verlo será con un ejemplo utilizando la base de datos AdventureWorks, los pasos a realizar serían los siguientes:
  1. Lo primero que haremos es lanzar la consulta que comentaba en el artículo del 17 de diciembre para comprobar si hay en la base de datos AdventureWorks tablas sin índice cluster definido, aparecen cuatro: DatabaseLog, ProductProductPhoto, Sales_Summary y SSIS Configurations.

    -- Buscar tablas sin índice cluster en base de datos
    SELECT OBJECT_NAME(OBJECT_ID) as TableName
    FROM SYS.INDEXES
    WHERE INDEX_ID = 0
    AND OBJECTPROPERTY(OBJECT_ID,'IsUserTable') = 1
    ORDER BY TableName
    

  2. Vamos a " Administración\Administración de directivas", pulsamos botón derecho sobre "Condiciones" y seleccionamos la opción "Nueva condición..."


  3. Generamos una condición (conCheckClusteredIndex) con las siguientes características:

    Nombre de la condición: conCheckClusteredIndex
    Faceta: Table (tabla)
    Campo: @HasClusterdIndex (tiene índice cluster)
    Operador: =
    Valor: True
    

  4. Generamos otra condición (conDatabaseName) que nos servirá para aplicar la directiva sobre una base de datos concreta, para ello informamos en la siguiente pantalla:

    Nombre de la condición: conDatabaseName
    Faceta: Database (base de datos)
    Campo: @Name (nombre de la base de datos)
    Operador: =
    Valor: 'AdventureWorks'
    

  5. A continuación creamos la directiva (dirCheckClusteredIndex). Pulsamos botón derecho sobre "Directivas" y seleccionamos la opción "Nueva directiva". Introducimos en la pantalla que aparece los siguientes datos:
    Nombre de la directiva: dirCheckClusteredIndex
    Condición comprobación (Check condition): conCheckClusteredIndex
    Para destinos (Against targets): Every Table in conDatabaseName Database
    Modo de evaluación (Evaluation Mode): A demanda (On Demand)
    

  6. Seleccionamos la directiva que acabamos de crear y pulsamos botón derecho del ratón sobre ella y seleccionamos la opción "Evaluar", nos aparece la siguiente pantalla donde se muestra que ha fallado la directiva para las 4 mismas tablas que se han comentado en el punto 1.


Ahora que hemos comprobado que la directiva funciona podríamos cambiar el modo de evaluación a "On Schedule" y crear un trabajo para que la compruebe periódicamente. Si queréis ver el uso del modo de evaluación "On Schedule" podéis leer el artículo Control proactivo del espacio disponible en BDs SQL Server 2008 donde encontraréis más detalles de todo el proceso (creación de la programación, trabajo, alerta, envío al operador...).

Lo normal sería que ahora os preguntarais ¿y mediante el uso de directivas y políticas puedo evitar que se creen tablas sin índice cluster? Porque hay un modo de evaluación de directivas que es "On Change: Prevent" (Al cambiar - Prevenir)... La respuesta es no ya que este modo de evaluación no es aplicable a la faceta "Tabla" (que hemos seleccionado en el paso 3), si fuera aplicable podría ser posible pero no es el caso. Sobre los distintos modos de evaluación y aplicabilidad a las distintas facetas hablaremos en otro artículo, tiene contenido y complejidad suficiente para ello.

Espero que el artículo os haya sido interesante, dentro de areaTIC puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

sábado, 22 de diciembre de 2012

WSDualHttpBinding - Ejemplo sobre como usar WCF Dúplex (servidor)

En el artículo de hoy veremos un ejemplo paso a paso sobre como usar WCF Dúplex. ¿Qué nos permite WCF Dúplex? Por ejemplo, tenemos implementada una solución servidor que accede a negocio/datos y por otro lado tenemos aplicaciones cliente que intercambian información con el servidor vía servicios WCF. Podríamos definir un servicio de notificaciones en servidor que avise los clientes interesados cuando se produzcan determinados eventos que les afectan en servidor.

Necesitaremos 3 soluciones; AreaTicServer, AreaTicClient y AreaTicShared.
  • AreaTicServer: Imaginemos que es una solución que expone diversos servicios WCF a los que acceden un número considerable de clientes y llevan a cabo acciones sobre la base de datos. Aquí implementaremos el servicio Duplex y simularemos algún evento para este ejemplo que devuelva notificaciones a los clientes que se han "suscrito".

  • AreaTicClient: Simularemos un cliente, aquí ubicaremos el código que conectará al servicio dúplex a modo de suscriptor y recibirá notificaciones cuando se produzcan eventos clave en servidor.

  • AreaTicShared: Es una biblioteca de clases que contiene clases/interfaces que se usarán en el intercambio de información entre cliente y servidor. Hemos de añadir este proyecto como referencia en ambas soluciones.

En primer lugar atacaremos el código compartido, necesitaremos crear un tipo (clase) Notification que usaremos en el intercambio.
namespace AreaTicShared.Duplex
{
    [DataContract]
    public class Notification
    {
        [DataMember]
        public int CodigoUsuario { get; set; }
        [DataMember]
        public NotificationType Tipo { get; set; }
        [DataMember]
        public string Detalle { get; set; }
    }
   
    public enum NotificationType
    {
        TipoNotificacion1,
        TipoNotificacion2
    }
}
Definiremos también en esta librería la interfaz para el CallBack, es importante incluir la referencia de esta dll tanto en Servidor como en Cliente ya que estas clases se usarán en ambas soluciones (hemos creado una tercera solución para evitar duplicar código).
namespace AreaTicShared.Duplex
{
    interface IServerNotificationsCallBack
    {
        [OperationContract(IsOneWay = true)]
        void RecibeNotificaciones(List<Notification> pListaNotificaciones);
    }
}
Ya hemos definido el contrato de CallBack, es importante fijarse en los atributos IsOneWay que son necesarios para este tipo de comunicación Dúplex. Veamos ahora como implementar el servicio dúplex, para ello como en todo servicio WCF necesitaremos una clase interfaz (servicecontract) y una clase que la implemente. La interfaz la definiremos en AreaTicShared porque se compartirá con la solución cliente. Es importante especificar el atributo CallBackContract.
namespace AreaTicShared.Duplex
{
    [ServiceContract(CallbackContract = typeof(IServerNotificationsCallBack))]
    interface IServerNotifications
    {
        [OperationContract(IsOneWay = true)]
        void SubscripcionListaNovedades(int pIdCliente);
    }
}
Crearemos ya en servidor una clase que se encargue de almacenar una lista persistente de suscripciones cliente (IdCliente,CallBackReference) a la que iremos añadiendo o quitando elementos en función de los clientes suscritos. Nos vale con un diccionario definido con el modificador static.
namespace WCFDuplexServer.Services
{
    public static class GestionCallBackClientes
    {
        public static Dictionary<int, IServerNotificationsCallBack> CallBackClientRelation = new Dictionary<int, IServerNotificationsCallBack>();
    }
}
El siguiente paso es crear un archivo ServerNotifications.cs que implemente la interfaz IServerNotifications.
namespace AreaTicServer.Services.Duplex
{
[ServiceBehavior(InstanceContextMode= InstanceContextMode.PerCall)]
public class ServerNotifications : IServerNotifications
{
  #region Miembros de IServerNotifications

   public void SubscripcionListaNotificaciones(int pIdCliente)
   {
     try
     {
      // Guardamos la referencia de callback en un lista persistente para utilizarla cuando sea necesario.

        if (!GestionCallBackClientes.CallBackClientRelation.ContainsKey(pIdCliente))
        {
          GestionCallBackClientes.CallBackClientRelation.Add(pIdCliente, OperationContext.Current.GetCallbackChannel<IServerNotificationsCallBack>());
        }
     }
     catch (Exception ex)
     {
       throw ex;
     }
  }

  #endregion
 }
}
En cualquier punto de la solución servidor podríamos usar el diccionario del siguiente modo para devolver información al cliente que creamos oportuno. Por ejemplo, vamos a ver como le pasaríamos una lista de notificaciones al cliente con id 2.
public void Evento()
{
  List<Notification> notificaciones = new List<Notification>();

  notificaciones.Add(new Notification(){ CodigoUsuario = 2, Detalle = "Se ha producido un evento en servidor que podría afectarle",Tipo=NotificationType.TipoNotificacion1});

 GestionCallBackClientes.CallBackClientRelation[2].RecibeNotificaciones(notificaciones);

}
Por último veremos como configurar el binding/endpoint para nuestro servicio por código que hemos de asegurarnos que se ejecute al iniciar la aplicación o web (la alternativa es añadir la configuración en app.config/web.config del proyecto).
mHost = new ServiceHost(typeof(IServerNotifications));
mHost.AddServiceEndpoint(typeof(IServerNotifications), new WSDualHttpBinding(), "http://personalizarURL:2100");
Hasta aquí el ejemplo de hoy, la semana que viene veremos como implementar la parte dúplex en cliente que se suscribirá al servicio de notificaciones y gestionaremos el callBack en caso de que nos llegue una lista de notificaciones procedentes del servidor. Os recordamos que podéis seguir areaTIC en las redes sociales!


lunes, 17 de diciembre de 2012

SQL Server: Cómo saber si hay tablas sin índice cluster en una base de datos

Si habitualmente realizas trabajos de DBA sobre una base de datos SQL Server con un número de tablas considerable y no eres el único que realiza este tipo de trabajos seguro que te has preguntado alguna vez, ¿todas mis tablas tienen definido un índice cluster?

Lo primero, recordar qué es un índice cluster (o agrupado), es un índice que almacenan ordenadas las filas de una tabla de acuerdo a los valores de la clave del índice. Varias consideraciones sobre los índices cluster:
  1. Sólo puede haber como máximo un índice cluster por tabla ya que las filas de una tabla sólo pueden almacenarse ordenadas de una única forma.

  2. Normalmente y salvo excepciones todas las tablas que definamos en una base de datos deberían incluir un índice clúster.

  3. En SQL Server cuando se crea una restricción PRIMARY KEY se crea automáticamente un índice único en las columnas de ésta. De forma predeterminada, este índice es cluster pero puede cambiarse a no cluster al crear la restricción.

  4. Es habitual que las columnas sobre las que se define un índice cluster participen en cláusulas JOIN, ORDER BY o GROUP BY. En el caso de las cláusulas ORDER BY o GROUP BY puede evitar que el motor de base de datos ordene los datos ya que las filas ya se encuentran ordenadas, por tanto, el rendimiento de las consultas aumenta.

  5. La estructura que SQL Server utiliza para construir y gestionar los índices son los árboles balanceados (balanced tree, B-tree). Quizás en un próximo artículo hable sobre este tema, de momento no entraremos en más detalle.

Bien, ahora que ya hemos refrescado el concepto de índice cluster vamos al tema, la siguiente consulta nos indica las tablas sin índice cluster que hay en una base de datos:

-- Buscar tablas sin índice cluster en base de datos
SELECT OBJECT_NAME(OBJECT_ID) as TableName
FROM SYS.INDEXES
WHERE INDEX_ID = 0
AND OBJECTPROPERTY(OBJECT_ID,'IsUserTable') = 1
ORDER BY TableName

A continuación os detallo cómo se ha construido la consulta anterior:
  • La instrucción OBJECT_NAME de Transact SQL devuelve el nombre del objeto para los objetos de ámbito de esquema a partir de un identificador proporcionado. Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_NAME).

  • La instrucción OBJECT_ID de Transact SQL devuelve el número de identificador de un objeto de ámbito de esquema.Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_ID).

  • La vista SYS.INDEXES contiene una fila para cada índice cluster, para cada índice no cluster y para cada tabla que no tiene definido un índice cluster. Es recomendable utilizar esta vista en lugar de la tabla SYS.SYSINDEXES que se mantiene por compatibilidad con SQL Server 2000 pero que desaparecerá en futuras versiones de SQL Server. Podéis encontrar más información sobre este tema en el siguiente enlace del MSDN (SYS.INDEXES).

  • La columna "INDEX_ID" de la vista SYS.INDEXES contiene los valores 0 (tabla sin índice cluster), 1 (índice cluster) y > 1 (índice no cluster). Cambiando el valor de este campo se puede obtener distinta información, no sólo las tablas sin índice cluster, interesante.

  • La instrucción OBJECTPROPERTY de Transact SQL devuelve información acerca de los objetos de ámbito de esquema. Para obtener el nombre del esquema en la consulta anterior necesitaremos utilizar la propiedad "SchemaId". Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECTPROPERTY).

Espero que el artículo os haya sido interesante, dentro de

areaTIC

puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

sábado, 15 de diciembre de 2012

SQLite, ejemplo sobre cómo hallar la ruta física de una base de datos en Google Chrome

Como vimos en este artículo,

SQLite

es una técnica de almacenamiento que soportan la mayoría de navegadores actuales y se está extendiendo su uso considerablemente en varios ámbitos.

Por defecto los navegadores no incorporan un administrador para esta base de datos si no que lo hacemos todo vía

Javascript

, desde la creación del esquema a la gestión de la información. Existen herramientas, gratuitas y de pago que permiten trabajar a nivel visual con la base de datos pero por norma general esto funciona de modo que abres el administrador y tienes que apuntar al fichero de base de datos. Bien, entonces nos preguntamos ¿dónde almacena el navegador físicamente la información de la base de datos?

A continuación veremos como localizar el archivo que contiene la información de nuestra base de datos en Google

Chrome

.

En un sistema operativo Windows,

Chrome

gestiona las bases de datos a nivel de usuario. Por tanto hemos de situarnos en la siguiente carpeta:
%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\databases
Usaremos SQLiteManager, que es uno de muchos administradores para

SQLite

que podemos encontrar por internet. Es de pago, pero la versión gratuita permite realizar lo básico y nos servirá para este ejemplo.

Si no hemos creado ninguna base de datos es posible que no veamos la carpeta databases, en todo caso podemos crear una base de datos con el siguiente código javascript.
db = openDatabase('ejemploareatic', '1.0', 'ejemploareatic', 20 * 1024 * 1024, null);
Una vez ejecutado el script si vamos a la ruta anterior deberíamos ver un archivo databases.db que podemos abrir con SQLiteManager y realizar la siguiente consulta SQL.
SELECT * FROM Databases WHERE name =  'ejemploareatic'

Chrome

, nombra al fichero físico con el id y organiza los archivos por nombre de host que ha ejecutado el script. En mi ejemplo tengo que buscar un fichero en la carpeta databases con nombre de archivo "25" en una carpeta "http_localhost:53610" o similar (es la url desde la cual he ejecutado el script).


Hacemos botón derecho sobre el archivo "25", "Abrir con...", seleccionamos SQLiteManager y ya accederíamos a la base de datos que acabamos de crear... podríamos gestionar el esquema de la base de datos o trabajar a nivel visual con la información de las tablas. Espero os sea de utilidad. Recordar que podéis seguir

areaTIC

en la redes sociales.


martes, 11 de diciembre de 2012

ITIL: Herramientas comerciales

En el artículo de la semana pasada os hacía una relación de herramientas

open source

que implementan las recomendaciones de

ITIL

, en el artículo de hoy os enumero algunas de las herramientas

comerciales

que más se comentan en los círculos en los que me muevo, simplemente son unas cuantas, ni mejores ni peores. Igual que en el artículo anterior las enumero alfabéticamente y ya sabéis, cualquier aportación que hagáis al respecto será bien recibida por los lectores de este blog. Os enumero algunas:
  1. Sin duda alguna

    BMC Remedy

    es una de las herramientas más potentes y completas que existen, os podéis hacer una idea viendo en cualquier web especializada las ofertas de empleo de programadores en

    Remedy

    .


    Dispone de funcionalidades como gestión de activos, del cambio, de la cadena de suministros, de servicios, CMDB, cuadros de mando,... en la web de BMC Remedy podeis encontrar más detalles sobre el producto, descargaros una versión de evaluación de 30 días, casos de éxito, gran cantidad de documentación... muy completa, la verdad. Para acabar este breve resumen, destacar que la herramienta se ofrece tanto en propiedad como en modalidad

    SaaS

    .

  2. De origen francés

    EasyVista 2012

    es otra herramienta que implementa las recomendaciones de

    ITIL

    . Dispone de funcionalidades como gestión de activos, creación automática del inventario, gestión del servicio, gestión del cambio, gestión financiera, cuadros de mando, gestión de proyectos,.... En la web de EasyVista podéis encontrar información del producto así como solicitar una demo (previa introducción formulario de contacto), vídeos,... Destacar que

    EasyVista 2012

    se puede tener también en propiedad o contratar en modalidad

    SaaS

    .


    Curiosamente uno de las empresas implantadoras de

    EasyVista

    en España es Exevi que da la casualidad, si no ando equivocado, que es el único asociado en España de OTRS (que mencioné la semana pasada en el artículo de herramientas ITIL open source). Así que ya tenéis un único distribuidor que implanta una herramienta

    comercial

    y otra

    open source

    , en el caso que estéis interesados seguro que os puede decir ventajas y desventajas de cada una de ellas.

  3. He estado dudando mucho si incluir a

    MS System Center 2012

    en esta lista o no, de hecho, todavía sigo dudando... la verdad es que

    MS System Center 2012

    no es una herramienta creada para la implantación de procesos siguiendo las recomendaciones de

    ITIL

    sino que está pensada para ayudar a administrar entornos de TI, captura conocimientos acerca de los sistemas, las políticas, los procesos y mejores prácticas, optimizando infraestructuras, permitiendo reducir costes y mejorarando la disponibilidad y prestación de servicios. Por lógica, cumple con algunas recomendaciones de

    ITIL

    pero no está creado en torno a ello. Por tanto no entraré en más detalles, si queréis más información podéis acceder a la web de

    MS System Center 2012

    .

  4. Particularmente

    ServiceDesk Plus

    es una de las herramientas que más me gusta, dispone de numerosas funcionalidades como gestión de activos, gestión de incidencias, gestión de problemas, CMDB, portal del usuario, gestión de contratos, catálogo de servicios, gestión de cambios, creación automática de inventario, gestión de activos de software,... En la web de

    ServiceDesk Plus

    podéis encontrar información detallada sobre el producto.


    Es importante destacar que hay disponible en este enlace una versión demo online de

    ServiceDesk Plus

    donde puedes entrar como técnico o como usuario. Hay diferentes versiones disponibles según las funcionalidades que se incluyen... destacar que la versión Standard hasta 5 técnicos es gratuita (portal de usuario, gestión de SLAs,... pero no dispone de gestión de activos, incidencias, problemas, CMDB...). Además

    ServiceDesk Plus

    se puede tener en propiedad o contratar en modalidad

    SaaS

    .

  5. De origen israelí

    SysAid

    es otra herramienta que implementa las recomendaciones de

    ITIL

    , dispone de funcionalidades como portal de usuario, gestión de activos, cuadros de mando, gestión de SLAs, CMDB, gestión de cambios, gestión de problemas, integración mediante API,... En la web de

    SysAid

    podéis encontrar más información sobre el producto, versiones disponibles, documentación, tutoriales...


    En el siguiente enlace hay accesible una demo online de

    SysAid

    en la que podemos ver el funcionamiento de varios apartados: gestión de activos, gestión de incidencias, gestión de problemas, reports, CMDB,... La aplicación está disponible en diversos idiomas (inglés, francés, español, alemán, italiano, ruso, portugués,...); hay distintas versiones, entre ellas una gratuita limitada a 2 administradores, 100 activos y 100 usuarios.

Esta aquí la relación de distintas herramientas pero seguro que en algún momento os habéis (o deberíais haber) preguntado, ¿y qué dice

Gartner

sobre esto? Bien, en el siguiente enlace encontramos el

cuadrante mágico de Gartner para herramientas de gestión de servicios IT

. Si observáis el cuadrante con detalle:

  • Aparecen algunas de las herramientas que he mencionado como

    BMC Remedy

    o

    EasyVista

    .
  • No aparecen otras que he comentado como

    MS System Center 2012

    o

    SysAid

    .
  • Aparecen otras que no he comentado como

    Cherwell Service Management

    ,

    HP Service Manager

    ,...
  • y por supuesto y muy importante los criterios de inclusión o exclusión de herramientas en el cuadrante.

Si estáis pensando seriamente en adquirir una herramienta comercial de este tipo os recomiendo que miréis con calma y atención el estudio de

Gartner

. Y hasta aquí el artículo de este martes, espero que os sea útil. Como siempre recordaros que dentro de

areaTIC

puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


sábado, 8 de diciembre de 2012

Error durante la serialización o deserialización mediante JavaScriptSerializer de JSON. La longitud de la cadena supera el valor establecido en la propiedad maxJsonLength

Estamos realizando una llamada a un servicio web con

ASP.NET

que se encarga de devolver cierta información con codificación

Json

y recibimos el siguiente error:

Respuesta Json del servicio
{"Message":"Error durante la serialización o deserialización mediante JavaScriptSerializer de JSON. La longitud de la cadena supera el valor establecido en la propiedad maxJsonLength.","StackTrace":"   en System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat)\r\n   en System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat)\r\n   en System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n   en System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

La solución a este problema es aumentar el valor por defecto del límite de elementos

json

que acepta el serializador que se usa en

.NET

. Para ello simplemente hemos de añadir el siguiente tag al archivo .config de nuestra aplicación.
  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="5000000"/>
      </webServices>
    </scripting>
  </system.web.extensions>
Hasta aquí el post de hoy, recordar que podéis seguir

areaTIC

en la redes sociales!


martes, 4 de diciembre de 2012

ITIL: Herramientas open source

Si estamos pensando en la implantación de procesos siguiendo las recomendaciones de

ITIL

en nuestra organización una de las primeras preguntas que nos haremos es ¿existen en el mercado

herramientas

que me ayuden? La respuesta es sí, por supuesto... ¿

open source

o comerciales? Ambas, cada una con sus pros y sus contras... no entraremos en este artículo a decantarnos por unas u otras ni a entrar en detalle de ninguna de ellas, simplemente, como cualquier interesado en implantar

ITIL

en su organización estoy mirando distintas alternativas y aquí os enumero las

open source

más interesantes que he encontrado y que he visto que destacaban distintos usuarios de blogs y foros.

Os hago una enumeración (por orden alfabético) y una breve descripción de cada una de ellas, son todas las que están pero por supuesto no están todas las que son... cualquier aportación será bien recibida por los seguidores de este blog.
  1. CMDBuild

    es una

    herramienta open source

    que implementa las recomendaciones de

    ITIL

    y que se distribuye bajo licencia GPL (GPU Public License). Nos permite gestionar el inventario, relacionar elementos del mismo, almacenar documentos (contratos, notas, manuales,...), programar tareas de mantenimiento para los operadores, multidioma,...

    En la web cmdbuild.org podéis encontrar más información sobre

    CMDBuild

    : capturas de pantalla, videos de demostración (en italiano),... pero no dispone de una demo on line. En la siguiente URL podéis descargaros la última versión y ver los requisitos necesarios en cuanto a hardware y software. La empresa Tecnoteca que mantiene el proyecto

    CMDBuild

    ofrece también soporte comercial.

  2. GLPI

    es otra

    herramienta open source

    de inventario de activos TI (servidores, PCs, impresoras, software,...) con funcionalidades de gestión de los mismos (problemas, incidencias, proveedores, presupuestos contratos...). Podéis encontrar más información en la web de GLPI; también podéis acceder a una versión demo on line. La aplicación es multidioma pero la demo está en inglés... eso dice en la web pero si pruebas con los usuarios admin_es y normal_es podrás acceder en español.


    Es integrable con OCS Inventory (

    herramienta open source

    de creación automática de inventarios de hardware, escaneo de red y distribución de paquetes de software). Podéis acceder a una demo on line a través del siguiente enlace.


  3. GMF

    es una

    herramienta open source

    que implementa las recomendaciones de

    ITIL

    y que se distribuye bajo licencia GPL (GPU Public License). Incluye módulos de gestión de incidencias, gestión de inventario, gestión del cambio...

    En la web genos.org podéis encontrar más información sobre

    GMF

    , también hay una demo on line disponible en el siguiente enlace donde podréis ver la herramienta según distintos perfiles; importante destacar que para ver la demo on line necesitaréis que vuestro navegador sea IE o Firefox, no funciona con Chrome u otros.


  4. iTOP

    es otra

    herramienta open source

    que implementa las recomendaciones de

    ITIL

    . Nos permite gestión del inventario, gestión de incidencias, gestión del cambio, gestión del servicio (SLAs, contratos con clientes y proveedores,...), importación de datos a partir de ficheros CSV, cuadros de mando...

    En la web de iTop podéis encontrar más información, también hay una demo on line disponible en el siguiente enlace donde podréis ver la herramienta según distintos perfiles: administrador, operador y portal de usuario.


  5. OneCMDB

    es una

    herramienta

    orientada a implementar

    ITIL

    en pequeña y mediana empresa. Nos permite realizar la gestión de activos así como sus relaciones. Dispone de una API que lo proporciona flexibilidad, creación automática de mapas de red, mecanismos de importación de datos, importación/exportación desde NAGIOS...

    En la web onecmdb.org podéis encontrar más información sobre

    OneCMDB

    : capturas de pantalla y un acceso a una demo on line... aunque si intentáis acceder veréis que no es posible.

  6. OTRS

    es una

    herramienta open source

    que incluye Help Desk, una solución para la gestión de servicios de IT compatible con

    ITIL

    , aplicación para iPhone. Por otro lado el grupo OTRS ofrece consultoría global, desarrollos a medida y servicios de soporte. En la web de OTRS podéis encontrar más información, también hay una demo on line disponible en el siguiente enlace donde podréis ver la herramienta según el perfil que acceda, realmente interesante. Destacar, según comentan en su web, que se integra fácilmente con

    SAP

    .


  7. Spiceworks

    es una

    herramienta open source

    de gestión, monitorización y resolución de problemas, creación automática de mapas de red, helpdesk (gestión de incidencias), inventario automático de hardware y software (gestión de licencias...), gestión de compras TI,... Puedes acceder a la web de SpiceWorks para descargarla, ¿una pega? Tiene publicidad incrustada.


Y hasta aquí el artículo de este martes, espero que os sea útil pero... el próximo martes... llega el turno de las herramientas comerciales que implementan

ITIL

, no os lo perdáis. Como siempre recordaros que dentro de

areaTIC

puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


viernes, 30 de noviembre de 2012

Cross-Domain en JQuery $.ajax, cuándo y cómo usar Json o Jsonp

Si nos disponemos a usar

Ajax

desde un script para comunicar con un servicio alojado en un dominio diferente al de la página que está originando la llamada hemos de tener en cuenta una serie de aspectos para evitar problemas de seguridad.

Aquí veremos un ejemplo sobre como hacer una llamada

Cross-Domain

con

ajax

a un servicio remoto. Por situarnos un poco, cuando realizamos una llamada a un servicio desde un script el navegador lanza una petición http a la Url y el servidor responde en formato

Json

. Si la Url está alojada en un dominio diferente, el concepto será el mismo, pero por motivos de seguridad hemos de tener en cuenta que el servidor no responderá al script con la respuesta

json

'plana', si no que la encapsulará en un método 'CallBack' que hemos de indicar en la URL desde cliente al invocar el servicio. Esta técnica se conoce como

Jsonp

(Json con Padding), veamos como adaptar el script en cliente.

Ejemplo Ajax mismo dominio:

Script
function localSample() {
        $.ajax({
            type: "POST",
            url: "UrlLocal",
            dataType: 'json',
            success: function (data) {
                //...
            },
            error: function (response) {
                //...
            }
        });   
}
Petición
http://UrlLocal
Respuesta
{"ObjetoJson":[{"id":1,"titulo":"blabla","descripcion":"blabla"},{"id":2,"titulo":"blabla","descripcion":"blabla"}]}
Ejemplo Cross-Domain:

Script
function login() {
        $.support.cors = true;
        $.ajax({
            type: "POST",
            url: "http://UrlRemota",
            dataType: 'jsonp',
            crossDomain: true,
            success: function (data) {
                //...
            },
            error: function (response) {
                //...
            }
        });
    }
}
Petición
http://UrlRemota?callback=jQuery16407422359699849039_1353499175935&_=1353499176045
Respuesta
jQuery16407422359699849039_1353499175935({"ObjetoJson":[{"id":1,"titulo":"blabla","descripcion":"blabla"},{"id":2,"titulo":"blabla","descripcion":"blabla"}]})
En el segundo ejemplo hemos alterado los valores de los atributos crossDomain y dataType del método

$.ajax

. Automáticamente se generará un método CallBack en runtime que tiene como función interpretar la respuesta

json

del servicio y cuya referencia se pasa como parámetro en la petición http al servidor.

Por lo que respecta a servidor hemos de tener en cuenta que el servicio debe estar preparado para procesar respuestas cross-domain. Si tenemos el control del código servidor y no está preparado por defecto podemos investigar como tratar este tipo de peticiones en función del lenguaje en que esté desarrollado el servicio.

Espero os sea útil, como siempre os recuerdo que podéis seguir

areaTIC.net

en las redes sociales!


martes, 27 de noviembre de 2012

Blogger: Gadget Entradas Relacionadas

En el pie de esta entrada podéis apreciar una sección

Entradas Relacionadas

; si intentáis buscarla entre los

gadgets de Blogger

no lo encontaréis, debéis ir a la página de LinkWithin para configurarlo. Os indico los pasos a seguir:
  1. Entramos en la web de LinkWithin, rellenamos el formulario correspondiente y pulsamos sobre "Get Widget".
  2. Nos aparece la siguiente pantalla con instrucciones para la instalación, pulsamos el botón "Install widget".
  3. En la siguienet página podremos modificar el título para nuestro

    gadget de Entradas Relacionadas

    y ver el contenido que se añadirá a nuestra página; pulsamos sobre el botón "Añadir artilugio".
  4. Una vez pulsado el botón "Añadir artilugio" si vamos a la sección Diseño de

    Blogger

    veremos que se ha añadido un

    gadget "LinkWithin"

    , son nuestras

    Entradas Relacionadas

    . Las podremos ubicar donde mejor nos vaya, en este blog están puestas bajo las entradas.
  5. Si pulsamos editar sobre el

    gadget

    podremos cambiar el título o el código insertado pero... ¿es posible personalizar más el

    gadget

    ? Pues sí es posible, lo haremos personalizando el CSS de nuestra plantilla, editamos el HTML (si no sabes cómo hacerlo puedes ver la explicación en este otro artículo del blog) y localizamos el siguiente código:
    ]]></b:skin>
    
  6. Justo encima del código anterior insertamos los siguientes estilos, puedes personalizarlos (o eliminar los que no necesites) como creas oportuno.
    /* Estilos personalizados para LinkWithin */
    
    .linkwithin_div {
      background: #FFFFFF;  /* Color de fondo */
      padding: 0 10px;
    }
    
    .linkwithin_text {
      font-family: Verdana; /* Estilo de la fuente del título */
      font-size: 11px;      /* Tamaño del título del widget */
      color: #000000;       /* Color del título del widget */
      font-weight: bold;    /* Estilo fuente en negrita */
    }
    
    .linkwithin_posts {
      width: 500px;         /* Ancho del widget */
    }
    
    .linkwithin_title {
      color: #2288BB;       /* Color de los títulos de las entradas */
      font-family: Verdana; /* Estilo fuente títulos de las entradas */
      font-size: 11px;      /* Tamaño de los títulos de las entradas */
      line-height: 14px;
      text-align:center;
      text-decoration: none;
    }
    
    .linkwithin_title:hover {
      color: #000000;       /* Color de los títulos al pasar cursor */
      font-weight: bold;    /* Estilo fuente en negrita */ 
    }
    
    .linkwithin_posts a {
      border: 0; 
      padding-right: 10px; 
    }
    
    .linkwithin_posts a:hover {
      background: #819FF7;  /* Color de fondo al pasar el cursor */
      -webkit-border-radius: 10px;
      -moz-border-radius: 10px;
      border-radius: 10px;
    }
    
    a#linkwithin_logolink_0, a#linkwithin_logolink_1, 
    a#linkwithin_logolink_2, a#linkwithin_logolink_3, 
    a#linkwithin_logolink_4, a#linkwithin_logolink_5, 
    a#linkwithin_logolink_6, a#linkwithin_logolink_7, 
    a#linkwithin_logolink_8, a#linkwithin_logolink_9, 
    a#linkwithin_logolink_10, a#linkwithin_logolink_11, 
    a#linkwithin_logolink_12, a#linkwithin_logolink_13, 
    a#linkwithin_logolink_14, a#linkwithin_logolink_15, 
    a#linkwithin_logolink_16, a#linkwithin_logolink_17, 
    a#linkwithin_logolink_18, a#linkwithin_logolink_19, 
    a#linkwithin_logolink_20 {
      display:none;         /* Elimina enlace a LinkWithin del gadget */
    }
    
    .linkwithin_img_0 div, div.linkwithin_img_0,
    .linkwithin_img_1 div, div.linkwithin_img_1,
    .linkwithin_img_2 div, div.linkwithin_img_2,
    .linkwithin_img_3 div, div.linkwithin_img_3,
    .linkwithin_img_4 div, div.linkwithin_img_4,
    .linkwithin_img_5 div, div.linkwithin_img_5,
    .linkwithin_img_6 div, div.linkwithin_img_6,
    .linkwithin_img_7 div, div.linkwithin_img_7,
    .linkwithin_img_8 div, div.linkwithin_img_8,
    .linkwithin_img_9 div, div.linkwithin_img_9,
    .linkwithin_img_10 div, div.linkwithin_img_10,
    .linkwithin_img_11 div, div.linkwithin_img_11,
    .linkwithin_img_12 div, div.linkwithin_img_12,
    .linkwithin_img_13 div, div.linkwithin_img_13,
    .linkwithin_img_14 div, div.linkwithin_img_14,
    .linkwithin_img_15 div, div.linkwithin_img_15,
    .linkwithin_img_16 div, div.linkwithin_img_16,
    .linkwithin_img_17 div, div.linkwithin_img_17,
    .linkwithin_img_18 div, div.linkwithin_img_18,
    .linkwithin_img_19 div, div.linkwithin_img_19,
    .linkwithin_img_20 div, div.linkwithin_img_20 { 
      -webkit-border-radius: 10px; /* Bordes redondeados */
      -moz-border-radius: 10px;
      border-radius: 10px;
      border:0 !important;
    }
    
Espero que con lo anterior tengáis todo lo necesario para añadir y personalizar vuestro

gadget de Entradas Relacionadas

. Dentro de

areaTIC

puedes encontrar otros artículos interesantes, no dudeis en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...).


viernes, 23 de noviembre de 2012

Cómo depurar Javascript en Google Chrome

A continuación explicaremos como depurar código

Javascript

en

Google Chrome

. En la actualidad podríamos considerar Javascript como una técnica emergente en desarrollos web ya que con la aparición de

Html5

y librerías como

JQuery

permite realizar operaciones en marco cliente que hace unos años eran impensables. Cada vez más, en entorno web, se está extendiendo el uso de Css y el manejo dinámico de elementos del DOM con scripts. Este tipo de lenguajes interpretados se combina en muchas ocasiones con lenguajes servidor compilados, lo cual dificulta al desarrollador disponer de un entorno unificado de desarrollo en el que poder depurar y analizar código.

La mayoría de IDE's siguen esta tendencia y están proporcionando mejoras para facilitar desarrollo javascript-css pero siempre queda todo un poco ligado a compañía, navegador, versión del producto, etc. Otra opción recomendable a día de hoy es depurar scripts cliente directamente en el navegador en que estás ejecutando la página, independientemente del entorno de desarrollo que uses. En este artículo veremos como hacerlo en

Google Chrome

.

En primer lugar hemos de añadir la instrucción

debugger;

en el punto que queremos simular un break-point o punto de interrupción en nuestro código.
function login() {
    if ($("#fieldEmail").val().length > 0)
    {
        //llamada al script servidor
        $.ajax({
            type: "POST",
            url: "http://www.areaTIC.net/Servicios/Ejemplo...",
            dataType: 'json',
            success: function (data) {
                debugger;
                var user = data.usuarios;
                //acción...
            },
            error: function (response) {
                debugger;
                //interesa analizar el motivo del error...
                alert('No ha sido posible comunicar con el servidor.');
            }
        });
    }
}
Lo siguiente, una vez estamos ejecutando la página ya desde Google Chrome usamos la combinación de teclas 'Ctrl + Mayus + j' para acceder a la

Consola Javascript

y esperamos que el hilo de ejecución se sitúe en el punto de interrupción.

Una vez se detiene la ejecución, si navegamos por la consola veremos que se asemeja a las herramientas habituales que nos proporciona cualquier entorno de desarrollo.


De este modo sin complicarse demasiado las cosas ya podríamos depurar código javascript y salir de algún apuro, si esta explicación se queda corta podéis visitar este enlace para profundizar en la herramienta que ofrece Google Chrome para desarrolladores.

Recuerda visitar el archivo de

areaTIC

, también puedes hacerte seguidor en las redes sociales para estar al tanto de las novedades. Esperamos tu participación!


martes, 20 de noviembre de 2012

SQL Server: Cómo saber si hay columnas Identity en una base de datos

Si estáis haciendo algún tipo de importación sobre una base de datos os puede resultar necesario saber si sobre alguna de las tablas en las que se van a insertar datos existen columnas Identity ya que se debe tener especial cuidado con la inserción de valores en este tipo de columnas. La siguiente consulta os servirá para saber esquema y tabla de las columnas Identity que existan en una base de datos:

-- Buscar columnas identity en base de datos
SELECT SCHEMA_NAME(OBJECTPROPERTY(OBJECT_ID,'SchemaId')) AS SchemaName,
       OBJECT_NAME(OBJECT_ID) AS TableName,
       name AS ColumnName
FROM  SYS.COLUMNS
WHERE is_identity = 1
ORDER BY SchemaName, TableName, ColumnName

A continuación os detallo cómo se ha construido la consulta anterior:
  • La instrucción SCHEMA_NAME de Transact SQL devuelve el nombre de esquema asociado a un identificador de esquema. Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (SCHEMA_NAME).

  • La instrucción OBJECTPROPERTY de Transact SQL devuelve información acerca de los objetos de ámbito de esquema. Para obtener el nombre del esquema en la consulta anterior necesitaremos utilizar la propiedad "SchemaId". Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECTPROPERTY).

  • La instrucción OBJECT_ID de Transact SQL devuelve el número de identificador de un objeto de ámbito de esquema.Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_ID).

  • La instrucción OBJECT_NAME de Transact SQL devuelve el nombre del objeto para los objetos de ámbito de esquema a partir de un identificador proporcionado. Podéis encontrar más información sobre esta instrucción en el siguiente enlace del MSDN (OBJECT_NAME).

  • La vista SYS.COLUMNS devuelve una fila por cada columna de cada tabla y vista, y una fila por cada parámetro de un procedimiento almacenado. Es recomendable utilizar esta vista en lugar de la tabla SYS.SYSCOLUMNS que se mantiene por compatibilidad con SQL Server 2000 pero que desaparecerá en futuras versiones de SQL Server. Podéis encontrar más información sobre este tema en el siguiente enlace del MSDN (SYS.COLUMNS).

  • La columna "name" de la vista SYS.COLUMNS contiene el nombre de la columna de tabla, vista o parámetro de procedimiento.

  • La columna "is_identity" de la vista SYS.COLUMNS contiene los valores 0 (no es columna Identity) o 1 (es columna Identity).

Espero que el artículo os haya sido interesante, dentro de areaTIC puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

viernes, 16 de noviembre de 2012

SQL Server: Insertar valor en columna Identity

Es posible que alguna ocasión os hayáis encontrado con una tabla en la que tenéis una columna identity [AddressID] (normalmente primary key) y queréis rellenar los valores libres en la columna (debido a eliminaciones) o queráis importar un conjunto de datos que queréis que tengan determinados valores en esa columna; en este ejemplo es explicaré cómo hacerlo, es muy sencillo.

  • Lo primero, supongamos que creamos la siguiente tabla donde la columna identity se inicializa con el valor 2 y se incrementa en 1 en cada inserción.
    -- Creación de la tabla con la columna [AddressID] identity
    CREATE TABLE [Address](
        [AddressID] [int] IDENTITY(2,1) NOT NULL,
        [Address] [varchar](100) NOT NULL,
        [City] [varchar](30) NOT NULL,
        [PostalCode] [varchar](15) NOT NULL,
    CONSTRAINT [PK_Address_AddressID] PRIMARY KEY CLUSTERED ([AddressID] ASC)
    
  • Una inserción cualquiera en la tabla sería:
    -- Inserción de un fila sin asignar valor a columna identity
    INSERT INTO [Address]         
        ([Address]
        ,[City]
        ,[PostalCode])
         VALUES
        ('Paseo de Gracia 25'
        ,'Barcelona'
        ,'08007')
    
    Si hacemos un SELECT sobre la tabla nos devolverá 1 registro y veremos que el valor de la columna [AddressID] es 2. Una observación importante, si queremos saber el valor que se asigna a la columna identity (por ejemplo, porque ese valor será foreign key en otra columna de otra tabla) la forma correcta de hacerlo sería:
    -- Iniciamos transacción
    BEGIN TRANSACTION
    
    -- Inserción de un fila sin asignar valor a columna identity
    INSERT INTO [Address]         
        ([Address]
        ,[City]
        ,[PostalCode])
         VALUES
        ('Paseo de Gracia 25'
        ,'Barcelona'
        ,'08007')
    
    -- Obtenemos valor asignado a la columna identity 
    SELECT IDENT_CURRENT('[Address]')
    
    -- ... otras instrucciones
    
    -- Confirmamos transacción
    COMMIT TRANSACTION
    
    Si queréis más información sobre la instrucción IDENT_CURRENT de Transact-SQL podéis encontrarla en este enlace del MSDN.

  • Bien, ahora supongamos que queremos insertar una fila con valor 1 en la columna identity ([AddressID]) de la tabla, la instrucción a ejecutar sería la siguiente.
    -- Activar inserción de valores explícitos en columna identity
    SET IDENTITY_INSERT [Address] ON;
    
    -- Inserción de un fila asignando valor a columna identity
    INSERT INTO [Address]         
        ([AddressID],
        ,[Address]
        ,[City]
        ,[PostalCode])
         VALUES
        (1
        ,'Paseo de Gracia 23'
        ,'Barcelona'
        ,'08007')
    
    -- Desactivar inserción de valores explícitos en columna identity
    SET IDENTITY_INSERT [Address] OFF;
    
    Lo que hacemos en este caso es primero activar la inserción de valores explícitos en la columna identity, posteriormente hacemos el INSERT incluyendo el nombre de la columna y el valor correspondientes a la columna identity y por último desactivamos la inserción de valores explícitos. Igual que en el caso anterior podemos utilizar la instrucción IDENT_CURRENT de Transact-SQL... ¿qué valor nos devolverá? Pues seguirá devolviendo 2 y no 1 ya que siempre devuelve el último valor de identidad generado para una tabla o vista especificadas (el 1 no es generado sino asignado explícitamente a la columna de la tabla).

    Si queréis más información sobre la instrucción SET IDENTITY_INSERT de Transact-SQL podéis obtenerla en el siguiente enlace del MSDN.

Espero que el artículo os haya sido interesante, dentro de areaTIC puedes encontrar otros artículos, no dudes en consultar nuestro archivo; también puedes seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...)


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

martes, 13 de noviembre de 2012

Generar classes (.cs/.vb) a partir de un documento XML o plantilla XSD

El siguiente artículo resume los pasos sobre como obtener las clases .cs o .vb a partir de un esquema Xsd o documento Xml.

Usaremos la herramienta xsd.exe que viene con Visual Studio o si no lo tenemos podríamos obtenerla descargando el SDK del framework 2.0. Como alternativa se podría llegar a hacer lo mismo usando svcutil.exe.

En caso de tener Visual Studio instalado vamos al menú de inicio, Visual Studio, Visual Studio Tools y pulsamos en "Símbolo de sistema de Visual Studio". Veremos que nos abre una pantalla MS-DOS. En caso de no tener visual studio podríamos usar Xsd si vamos a la línea de comando (cmd) y nos situamos manualmente en el directorio que esté el ejecutable xsd.exe.

Una vez situado en el directorio que toca, ejecutamos el siguiente comando para convertir de Xml a Xsd:
C:\Program Files\Microsoft Visual Studio 10.0\VC>xsd.exe /c /l:CS c:\archivo.xml /o:c:\

Utilidad de compatibilidad para esquemas Xml y DataTypes de Microsoft (R)
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Escribiendo el archivo 'C:\archivo.xsd'.
Ejecutamos posteriormente el siguiente comando. Si partimos de un Xsd en vez de un Xml podríamos obviar el paso anterior lo cual sería la situación ideal porque una plantilla Xsd contiene más información sobre los tipos que se han de generar en la clase que un documento Xml.
C:\Program Files\Microsoft Visual Studio 10.0\VC>xsd.exe /c /l:CS c:\archivo.xsd /o:c:\

Utilidad de compatibilidad para esquemas Xml y DataTypes de Microsoft (R)
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Escribiendo el archivo 'C:\archivo.cs'.
Con esto ya podríamos agregar la clase 'archivo.cs' a nuestro proyecto .NET y usar los objetos generados automáticamente a partir del Xsd. Para volverlos a pasar a formato Xml podríamos serializar el objeto en disco usando XmlSerializer o DataContractSerializer combinado con XmlWriter.

Espero a alguien le sea útil, son bienvenidos todo tipo de comentarios. Recuerda que puedes seguir areaTIC en las redes sociales!


viernes, 9 de noviembre de 2012

ASP.NET - Configuración Session Mode

Hoy en areaTIC trataremos los modos de almacenamiento de la información de una sesión ASP.NET.

En este otro artículo vimos a modo introducción las diferentes alternativas que ASP.NET ofrece para mantener cierta información y hacer que persista entre varias peticiones http de un mismo cliente.

En este caso veremos como configurar Session Mode con el modo de almacenamiento de la información de sesión que nos interese en cada caso para evitar posibles problemas y optimizar el rendimiento del site.

Los diferentes modos de session que nos ofrece ASP.NET están contenidos en la enumeración System.Web.SessionState.SessionStateMode y son los siguientes:
  • InProc (defecto): Es la opción que ASP.NET usará por defecto para almacenar la información relacionada con los objetos de session que estemos usando en nuestro site. Este modo de almacenamiento usa la memória RAM de la máquina servidor en la que está alojada el site.

  • StateServer: Delegamos el trabajo relacionado con la gestión de la sesión a un servicio windows de un servidor remoto o local.

  • SQLServer: Permite definir una base de datos SQLServer para almacenar la información relacionada con los objetos de sesión.

  • Custom: Permite personalizar el modo de sesión.

  • Off: Deshabilita el uso de objetos Session en nuestro site.

Para modificar el modo de sesión que ASP.NET plantea por defecto hemos de añadir el siguiente tag al archivo web.config en la sección <System.Web>
<sessionState mode="InProc"/>
En la mayoría de situaciones usando el modo InProc, por defecto, no deberíamos tener problemas aunque se podría dar el caso que almacenemos mucha información en objetos de sesión y/o tengamos muchos usuarios concurrentes, esto podría originar que se supere la RAM asignada para tal propósito en el servidor con lo cual se reiniciaría la sesión de los usuarios y se perdería toda la información asociada. En este tipo de escenarios es recomendable modificar SessionMode para delegar la gestión de los objetos de sesión a una base de datos o bien un servicio. Veamos como hacerlo:

SQLServer :
<sessionState mode="SQLServer" sqlConnectionString ="...">
    </sessionState>
Si delegamos la gestión a una base de datos SQLServer es necesario tener instalado mínimo un SQLServerExpress e indicar la cadena de conexión del servidor. A modo opcional también podríamos definir los atributos sqlCommandTimeout y sqlRetryInteval.

StateServer:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" />
En el ejemplo estamos apuntando al mismo servidor en que está alojado el site y le asignamos el rol de StateServer, aunque también podríamos apuntar a un equipo remoto. Un requisito para que funcione StateServer es habilitar el servicio de windows correspondiente para realizar esta gestión. En caso de no hacerlo recibiremos el siguiente error al iniciar una sesión.

No se puede realizar una solicitud de estado de sesión al servidor de estado de sesión. Compruebe que el servicio de estado ASP.NET se ha iniciado y que los puertos de cliente y servidor son los mismos. Si el servidor se encuentra en un equipo remoto, compruebe el valor de HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection para asegurarse de que acepta más solicitudes. Si el servidor se encuentra en el equipo local y si el mencionado valor del registro no existe o está establecido en 0, la cadena de conexión del servidor de estado debe utilizar 'localhost' o '127.0.0.1' como nombre de servidor.

Para solucionarlo hemos de ir a Inicio -> Ejecutar y teclear Services.msc para abrir la consola de administración de servicios del servidor que hayamos indicado en el atributo stateConnectionString. A continuación nos situamos en el servicio "Servicio de estado ASP.NET", lo iniciamos y además modificamos el tipo de inicio a modo automático.

Hasta aquí el post de esta semana, os recordamos que podéis seguir areaTIC en las redes sociales o vía RSS!


martes, 6 de noviembre de 2012

Control proactivo del espacio disponible en BDs SQL Server 2008

Seguramente si llevas tiempo trabajando con SQL Server te habrás encontrado alguna vez con el siguiente error:
No pudo asignar espacio para el objeto 'TableName' de base de datos 'DatabaseName' porque el grupo de archivos 'FilegroupName' está lleno. Elimine archivos innecesarios, quite objetos del grupo de archivos, agregue archivos adicionales al grupo de archivos o establezca la opción de crecimiento automático para los archivos existentes en el grupo de archivos con el fin de crear espacio...
Bien la solución puede ser tan "sencilla" como añadir un nuevo archivo en el grupo, aumentar el tamaño de un archivo del grupo.... hay distintas opciones, y pongo "sencilla" entre comillas porque no siempre tenemos disponible ese espacio en disco necesario para crear un nuevo archivo o aumentar el tamaño de uno existente. Mientras estemos con este error posiblemente tengamos ciertas aplicaciones fuera de servicio y eso puede suponer un grave problema para servicios en producción...

El objetivo de este artículo no es indicar cómo solucionar el problema (es relativamente sencillo para cualquier usuario con cierta experiencia en SQL Server) sino indicar cómo hacer un control proactivo del espacio disponible en una base de datos SQL Server de manera que sepamos con cierta antelación que se está agotando el espacio disponible y podamos actuar antes de producirse el error "No pudo asignar espacio para el objeto 'TableName' de base de datos 'DatabaseName' porque el grupo de archivos 'FilegroupName' está lleno....

Hasta SQL Server 2005 la cosa tenía cierta complejidad pero una de las novedades que incorporó SQL Server 2008 fue la posibilidad de administrar servidores basándonos en directivas, condiciones y facetas (policies, conditions y facets en inglés). Esta nueva funcionalidad nos ayudará a controlar proactivamente el espacio disponible en nuestra base de datos, a continuación os muestro un sencillo ejemplo. Antes de empezar quizás sería conveniente que consultarais el siguiente enlace de la Technet para haceros una mejor idea de lo que es la administración basada en directivas.

Vayamos a por el ejemplo concreto que supongo es lo que os interesa. Lo que haremos es (en la base de datos AdventureWorks) que cuando el fichero de datos del grupo de archivos 'PRIMARY' tenga un espacio disponible inferior a 100 Mb se envíe una alerta al operador correspondiente; de esta manera podemos actuar antes de quedarnos sin espacio, los pasos a realizar serían los siguientes:
  1. Abrimos el SSMS, vamos a " Administración\Administración de directivas", pulsamos botón derecho sobre "Condiciones" y seleccionamos la opción "Nueva condición..."


  2. Generamos una condición (conSpaceAvailableData100) que nos compruebe que el espacio disponible es superior a 100 MB, para ello informamos en la siguiente pantalla:
    Nombre de la condición: conSpaceAvailableData100
    Faceta: Data File (fichero de datos)
    Campo: @AvailableSpace (espacio disponible en el fichero de datos)
    Operador: >
    Valor: 1024000 (100 Mb en kilobytes)
    

  3. Generamos otra condición (conDatabaseName) que nos servirá para aplicar la directiva sobre una base de datos concreta, para ello informamos en la siguiente pantalla:
    Nombre de la condición: conDatabaseName
    Faceta: Database (base de datos)
    Campo: @Name (nombre de la base de datos)
    Operador: =
    Valor: 'AdventureWorks'
    

  4. A continuación creamos la directiva (dirDatabaseSpaceAvailable) para controlar el espacio disponible. Pulsamos botón derecho sobre "Directivas" y seleccionamos la opción "Nueva directiva". Introducimos en la pantalla que aparece los siguientes datos:
    Nombre de la directiva: dirDatabaseSpaceAvailable
    Condición comprobación (Check condition): conSpaceAvailableData100
    Para destinos (Against targets): Every File in Every Filegroup in conDatabaseName Database
    Modo de evaluación (Evaluation Mode): Al programar (On schedule)
    Programación: [Hay que crear una nueva pulsando el botón correspondiente, lo comento más adelante]
    

    Como comentaba anteriormente hay que crear una nueva programación pulsando el botón correspondiente, la llamaremos por ejemplo "schDatabaseAvailable" y la crearemos con los valores indicados en la siguiente imagen.


  5. Si en el SSMS expandimos el nodo " Administración\Administración de directivas" veremos que se nos ha creado la directiva "dirDatabaseSpaceAvailable" fuera de conexión. Si expandimos el nodo "Trabajos" vemos que se nos ha creado uno nuevo con un nombre generado automáticamente y tb fuera de conexión: lo renombramos a "jobDatabaseSpaceAvailable".


  6. Editamos el trabajo que hemos renombrado en el paso anterior, vamos a la sección de alertas y pulsamos el botón correspondiente para crear una nueva.


  7. Introducimos los datos para la nueva alerta en la sección "General":
    Nombre: aleDatabaseSpaceAvailable
    Tipo: Alerta de evento de SQL Server (SQL Server event alert)
    Número de error: 34052
    
    El error 34052 es el error correspondiente a infracción de una directiva en modo "Al programar". Se puede encontrar más información sobres los distintos errores en el siguiente enlace de la Technet.


  8. Vamos a la sección "Respuesta" (Response) de la alerta, seleccionamos la opción de notificar a operadores y marcamos el envío por email a uno de los operadores existentes. Si quieres saber más sobre envío de alertas a operadores de SQL Server puedes consultar nuestro artículo de julio de 2012.


  9. Para acabar con el tema de la alerta vamos a la sección "Opciones" (Options), marcamos la opción de incluir un texto de error en la alerta que enviamos por mail y definimos un mensaje adicional para que se vea más clara la directiva que se está infringiendo, algo del estilo "Directiva dirDatabaseSpaceAvailable: el espacio en el fichero de datos de la DB AdventureWorks es inferior a 100 Mb. Realice las opciones de mantenimiento oportunas.". Informamos el retardo entre respuestas y pulsamos aceptar para dar por concluida la configuración de la alerta.


  10. Ya volviendo al trabajo y para acabar también con su configuración en la sección "Notificaciones" aprovecharemos para hacer que si el trabajo falla se envíe por mail una notificación al operador y también se guarde en el registro de Windows el error correspondiente.


  11. Ya para finalizar, volvemos a la directiva que hemos creado en el punto 4, hacemos botón derecho del ratón sobre ella y pulsamos "Habilitar". Hacemos exactamente lo mismo para el trabajo que también creamos en el apartado 4, ahora tenemos directiva y trabajo habilitados. Si queremos probar el funcionamiento de la directiva pulsamos botón derecho del ratón sobre ella y pulsamos "Evaluar", me aparece la siguiente pantalla.


    Si pulsamos para ver los detalles...


    Puede parecer (por los iconos) que hay un error en la directiva pero no es así, sale el icono rojo porque se ha producido una infracción en la directiva que hemos creado: el espacio disponible en el fichero de datos de AdventureWorks es de 3.16 Mb cuando en la directiva hemos indicado que se produzca una infracción cuando el tamaño sea inferior a 100 Mb. El funcionamiento es correcto, con el trabajo que hemos programado, de lunes a viernes a las 00:00 se evaluará la directiva y si se produce una infracción se enviará un mail al operador indicado para que realice las operaciones oportunas.

Espero que os sea útil este artículo (mi tiempo me ha llevado escribirlo), con directivas, facetas y condiciones se simplifican notablemente las tareas de administración de SQL Server, os recomiendo que leáis sobre el tema. Recuerda que dentro de areaTIC puedes encontrar otros artículos interesantes, no dudes en consultar nuestro archivo.


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET