Como rescatar de las llamas del infierno un MDF sin el LDF

agosto 11, 2009 07:27 by sergio

Tomando como referencia el tipo de redacción de mi colega DDAZ voy a escribir este POST haciendo alusión a un “posible” caso de la vida real. Quiero aclarar que no soy DBA y no soy una eminencia optimizando sentencias SQL o una cosa por el estilo. Los nombres utilizados y su parecido con la realidad son mera coincidencia. 

El DBA despistado 

Josué, el encargado de la integridad de la información  y de los aspectos ambientales de la información de de una prestigiada empresa prestadora de servicios de tecnología (DBA), consiente y preocupado ante cualquier proceso de recuperación de desastres, análisis de rendimiento y optimización de base datos, olvidó (“por error”). Programar ya sea incrementalmente, diferencialmente o totalmente respaldos propios de la información contenida en las bases de datos de la compañía. 

Un día (viernes, que raro), ocurrió algo que estaba contenido en el plan de recuperación a desastres y solo se pensaba que podría llegar a ocurrir si el experimento que se está realizando en Suiza (entre las montañas del Jura y el lago de Ginebra), generara un poderoso arranque de gravedad que comprimiera la materia y terminara con la vida tal cual la conocemos. Un simple apagón de energía eléctrica, lo cual ocasionó que se dañaran varios sectores en disco duro, se malogrará el sistema de arranque del sistema operativo y se perdieran los log de transacciones de todas las bases de datos (LDF).

Cabe mencionar que el SMBD era SQL Server. La empresa sufrió mucho operativamente y la información vital de la misma, jamás se pudo recuperar. JAMÁS!! 

¿Por qué Sucedió esto? 

Josué, como todo profesionista promedio, tuvo un escenario en donde la teoría no sirve para nada ante situaciones prácticas donde se requiere actuar rápido para mantener el negocio. Adicionalmente también desconocía las bondades y la importancia de realizar respaldos de sus bases de datos como lo detalla la siguiente tabla*: 

 

Respaldo

Archivos en Respaldo Ventajas Desventajas
Completo ("Full") Todos Con este respaldo únicamente es posible recuperar toda la información Tiempo de Ejecución
De Incremento ("Incremental") Archivos con archive bit activo.(Aquellos que hayan cambiado desde el último Respaldo Completo) Velocidad Requiere del último Respaldo Completo y de todos los Respaldos de Incremento que le siguieron para recuperar el Sistema
Diferencial ("Differential") Archivos con archive bit activo.(Aquellos que hayan cambiado desde el último Respaldo Completo) Sólo requiere del último Respaldo Completo y del último respaldo Diferencial Ocupa mayor espacio en discos comparado con Respaldos de Incremento

*Clasificación de Respaldos. Osmosis Latina - http://www.osmosislatina.com/soporte/respaldos.htm 

¿Qué hacer si ya valió? 

Cabe mencionar que la siguiente alternativa solo funciona para SQL Server y no es una opción muy “elegante” al problema, yo sigo la siguiente filosofía: “A problemas piñatas, soluciones piñatas”, no por algo tengo un diploma a las “marranadas” (hablando de soluciones tecnológicas). 

La solución propuesta sería: 

1.    Crear las bases de datos afectadas en blanco, detener el servicio de SQL Server y cambiar el MDF por el que rescataron del server caído (Q.E.P.D). 

2.    Eliminar el LDF que se generó en blanco y reiniciar el servicio de SQL. Dado esto debería marcar la base de datos como suspect. 

3.    Posicionarse en la base de datos MASTER (USE MASTER) 

4.    Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo. 

EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE 

5.    Cambiar el estado de la base de datos a MODO DE EMERGENCIA. 

UPDATE SYSDATABASES SET STATUS = 32768 WHERE NAME = 'NombreBaseDeDatos'  

6.    Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo

EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE 

7.    Cambiar la base de datos afectada a opción de usuario simple. 

EXEC sp_DBOption 'ArchivoIntegracion', 'SINGLE USER', 'TRUE' 

8.    Reconstruir el LOG de transacciones (LDF) de la base de datos (MDF). 

DBCC REBUILD_LOG ('NombreBaseDeDatos', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\NombreBaseDeDatos_Log.ldf') 

9.    Cambiar las opciones de configuración global del servidor actual para que permita hacer cambios al mismo. 

EXEC sp_Configure 'ALLOW UPDATES', 1
RECONFIGURE WITH OVERRIDE 

10. Cambiar el estado de la base de datos a MODO NORMAL. 

UPDATE SYSDATABASES SET STATUS = 0 WHERE NAME = 'NombreBaseDeDatos' 

11. Cambiar las opciones de configuración global del servidor actual para que ya no permita hacer cambios al mismo 

EXEC sp_Configure 'ALLOW UPDATES', 0
RECONFIGURE WITH OVERRIDE 

12. Cambiar la base de datos afectada a opción de usuarios múltiples. 

EXEC sp_dboption 'ArchivoIntegracion', 'SINGLE USER', 'FALSE' 


Y voila, ya quedó milagrosamente rescatado nuestro MDF sin necesidad de contar con el LDF respectivo. Josué ya puede estar más tranquilo al respecto y tener más cuidado para la próxima vez que ocurra esto en su organización (que esperemos y jamás vuelva a suceder).


Actualmente calificado con 5.0 por 3 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Festival de Instalación Internet Explorer 8 | Id. de evento: 1032417249

mayo 21, 2009 12:29 by sergio

Te invitamos al Festival de Instalación IE8, en el que podrás llevarte instalado en tu equipo la nueva versión de Internet Explorer así como diferentes herramientas que harán más fácil tu navegación en Internet. Asimismo, conocerás las nuevas experiencias Web que podrás ofrecer a los usuarios de tu sitio y te presentaremos cómo implementar las ventajas de IE8 en tu organización. Este evento se llevará a cabo de forma simultánea en diferentes ciudades del país y se transmitirá por video conferencia en tiempo real.

Cuando: 
Martes, 16 de junio de 2009 05:30 p.m. - martes, 16 de junio de 2009 07:00 p.m. Ciudad de México
Hora de recepción: 05:30 p.m.


Donde:
Instituto Tecnológico de Zacatecas
Carretera Panamericana entronque Guadalajara S/N
Domicilio conocido La Escondida Apartado Postal No. 245 Zacatecas Zacatecas
98000
Mexico.

Opciones de registro

Id. de evento:
1032417249

http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032417249&Culture=es-MX


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Soluciones REALES a problemas REALES - ¿Quién dijo que no se puede transformar con XSLT 2.0 dentro de nuestras aplicaciones .NET?

mayo 4, 2009 06:54 by sergio

XSLT 2.0 es un interesante paso adelante en la tecnología de transformación XML, con ella, es posible crear productos de software que produzcan contenidos para diferentes dispositivos y plataformas. Con XSLT 2.0 y XPath 2.0, podemos realizar transformaciones de una forma mucho más sencilla y rauda haciendo uso de los XSLT Extension Objects.

 

Dicha la teoría (la cual a la hora de la hora no sirve para nada), me he topado con la necesidad en diversas ocasiones de hacer uso de las bondades antes mencionadas (entre otras que mencionaremos más adelante), lamentablemente con mis herramientas de desarrollo actual (VS.NET 2003, VS 2005 y VS 2008) no he podido echar mi imaginación a volar (Si estoy equivocado y si lo trae por favor corríjanme, yo en lo personal nunca he podido hacer XSLT 2.0), y es que ante problemas “piñatas” siempre son necesarias soluciones “piñatas” que requieren opciones que se salen un poquito fuera de lo ordinario. Espero en las próxima versiones de estas herramientas (VS 2010), venga ya considerado este estándar (desconozco si en el CTP hasta el día del POST esté ya considerado).

 

De cualquier forma, hay una opción de nuestros amigos de Altova (http://www.altova.com/altovaxml.html) llamada AltovaXML, muy versátil para realizar este tipo de transformaciones, ya que es un poderoso:

  • Motor de validación XML
  • Motor XSLT 1.0
  • Motor XSLT 2.0
  • Motor XQuery 1.0
  • Motor de validación XBRL

Con los cuales podemos realizar todo tipo de operaciones soportadas por el estándar W3C (para aplicaciones COM, Java y .NET), con todo el vigor de Altova, ah, y también: ¡GRATIS!  

Pero bueno, ¿Cómo diantres lo usamos?, muy sencillo, solamente hay descargar la herramienta de: http://www.altova.com/altovaxml.html, isntalarla y agregar dentro de nuestro proyecto la referencia al assembly Altova.AltovaXML.dll (C:\Archivos de programa\Microsoft.NET\Primary Interop Assemblies\Altova.AltovaXML.dll por default). Si nos marca cosas extrañas, hay que procurar registrar el componente (AltovaXML_COM.exe /regserver)

 

Ya una vez realizado esto, creamos nuestra transformación XLST 2.0:

 

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:barreteros_funct="http://www.barreteros.net">            <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>            <xsl:template name="example" match="/">                        <xsl:value-of select="barreteros_funct:index-of-string('Sergio', 'gio')"/>            </xsl:template>            <xsl:function name="barreteros_funct:index-of-string">                        <xsl:param name="arg"/>                        <xsl:param name="substring"/>                        <xsl:sequence select="   if (contains($arg, $substring))  then (string-length(substring-before($arg, $substring))+1,        for $other in           barreteros_funct:index-of-string(substring-after($arg, $substring),                               $substring)        return          $other +          string-length(substring-before($arg, $substring)) +          string-length($substring))  else () "/>            </xsl:function>

</xsl:stylesheet>

Aquí estamos creando una función (y recursiva apa!) llamada barreteros_funct:index-of-string, la cual no da el index-of de una cadena contenida en otra, recibe dos parámetros como podemos ver: arg, que es la cadena original y substring que es la cadena que deseamos saber el index).  

Esta función, se manda llamar directamente desde el atributo select desde cualquier función xsl, como si se tratase de una función propia del estándar:  

<xsl:value-of select="barreteros_funct:index-of-string('Sergio', 'gio')"/> 

Esta nos arrojará como resultado un 4: 'Sergio', obvio. 

OJO: Si esta transformación la abrimos desde nuestro IDE de desarrollo comentado anteriormente, nos va a pintar un… grandioso mensaje de error a nivel <xsl:function subrayando la palabra de color azul (como si fuera una falta horrografía en Word). Pero no os preocupéis, si este error les causa problemas, cierren el archivo, así ya no lo verán. Ahora procederemos a realizar la transformación mediante AltovaXML: 

Protected Sub TransformarAltova(ByVal xslPath As String, ByVal strXML As String, ByVal TransformPath As String)

        Dim xslt2 As Altova.AltovaXML.IXSLT2 = New Altova.AltovaXML.Application().XSLT2()        xslt2.InputXMLFromText = strXML        xslt2.XSLFileName = xslPath        xslt2.Execute(TransformPath)    End Sub     Protected Function TransformarAltova(ByVal xslPath As String, ByVal strXML As String) As String        Dim xslt2 As Altova.AltovaXML.IXSLT2 = New Altova.AltovaXML.Application().XSLT2()        xslt2.InputXMLFromText = strXML        xslt2.XSLFileName = xslPath        Return xslt2.ExecuteAndGetResultAsString    End Function
 

 

Aquí hay dos funciones polimórficas, la primera realiza la transformación en una ruta determinada (TransformPath), la segunda regresa el resultado de la transformación en un arreglo de caracteres (As String). Simplemente se instancia el XSLT2 parser y llamamos el método Execute o ExecuteAndGetResultAsString según el escenario deseado.

 

De esta forma estamos solventando el problema REAL.

 

OJO: dada nuestra transformación mediante AltovaXML, necesitamos liberar el COM object de Altova:

System.Runtime.InteropServices.Marshal.ReleaseComObject(XSLT2) 

Si no realizamos esto, el proceso de Altova se queda corriendo dentro de los proceso de la maquina ejecutante y no se apaga o finaliza hasta que no se cierra la aplicación que lo manda ejecutar.

 

En nuestra próxima entrega veremos: ¿QUÉ TAN CHONCHO PUEDE SER UN XML PARA QUE LO PROCESE LINQ SIN PROBLEMAS?


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Soluciones REALES a problemas REALES - Request y Response Encriptados

marzo 28, 2009 14:30 by sergio

Quiero aprovechar para enviar un saludo a todos los miembros de la comunidad y para pedir una disculpa por esta ausencia tan larga que he tenido, por cuestiones laborales me ha sido complicado atender y compartir un poco de conocimiento.

En base a esto, he decidido comenzar a publicar soluciones REALES a problemas REALES con los que nos enfrentamos todos los días, ya estoy cansado de vagar por infinidad de sitios en donde no se dan SOLUCIONES a problemas cotidianos y en ocasiones PUERILES, pero que el desconocimiento de los mismos nos lleva a dolores de cabeza cuando los ambientes son PRODUCTIVOS con grandes volúmenes de transaccionalidad o cuando nos viciamos de dar una solución compleja a algo que no lo es. En este artículo vamos a ver un tema PUERIL, en el cual vamos a simular las clases del REQUEST y del RESPONSE, de tal forma que crearemos las nuestras y las mandemos llamar de forma tan natural que el uso es transparente pero encripta toda lo información contenida en el QueryString cuando la misma es muy sensible. 

1.     Primeramente vamos a crear un nuevo Sitio Web, en mi caso Visual Studio 2008, puede ser en cualquier versión del Framework, no estamos usando LINQ o alguna chuchería propia de la versión. 

2.     Vamos a crear 3 clases: MyRequest.cs, MyResponse.cs y MyEncriptor.cs, en esta ocasión voy a usar C#, no porque sea de los que están casados con algún lenguaje, sino que fue el primer lenguaje que me apareció en mi IDE cuando cree el proyecto. 

3.     Vamos a tirar código: 

MyResponse.cs 
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text.RegularExpressions; /// <summary>/// Clase que simula el Response pero de una URL encriptada/// </summary>public class MyResponse{    public static void Redirect(String url, Boolean endResponse)    {        var pagina = string.Empty; var query = string.Empty;        try        {            pagina = url.Split('?')[0].ToString();            query = url.Split('?')[1].ToString();            query += string.Format("?{0}", url.Split('?')[2].ToString());        }        catch (Exception ex)        {            Console.WriteLine(ex);        }        finally        {            System.Web.HttpContext.Current.Response.Redirect(pagina + "?" + MyEncriptor.Encriptar(query), endResponse);        }    }

}

Explicación: Se está creando una clase MyResponse, la cual contiene otra clase estática llamada Redirect, la cual recibe de parámetro la URL de destino y una variable boolena que indica el termino de la ejecución de la página (como se hace en el response tradicional). Lo que hace esta función es dividir la parte de la URL en cuestión del QueryString de la misma, una vez obtenidos estos valores por separado se hace una encripción del QueryString y se le concatena nuevamente a la URL, dado esto se hace el Redirect tradicional. 

System.Web.HttpContext.Current.Response.Redirect(pagina + "?" + MyEncriptor.Encriptar(query), endResponse);  

MyRequest.cs 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text.RegularExpressions; /// <summary>/// Clase que simula el Request pero de una URL encriptada/// </summary>public class MyRequest{    public class QueryString    {        public static String Get(String variable)        {            var res = string.Empty;            string Url = string.Empty;            try            {                Url = MyEncriptor.Desencriptar(System.Web.HttpUtility.UrlDecode(System.Web.HttpContext.Current.Request.Url.Query.Remove(0, 1)));                Regex r = new Regex(variable + "=(?<key>(.*?))(&|$)");                res = r.Match(Url).Result("${key}");            }            catch (Exception ex)            {                res = string.Empty;            }            return res;        }    }}

Explicación: Se está creando una clase MyRequest, la cual contiene otra clase estática llamada QueryString y la cual a su vez contiene una función estática llamada Get, esta recibe de parámetro una variable de tipo String y regresa de la misma forma el resultado de la obtención de un value determinado del QueryString. Lo interesante en esta clase es que obtenemos el QueryString actual (Ya encriptado), lo desencriptamos y mediante el uso de una expresión regular obtenemos la ocurrencia a sabiendas de cómo se forma un QueryString.                

Url = MyEncriptor.Desencriptar(System.Web.HttpUtility.UrlDecode(System.Web.HttpContext.Current.Request.Url.Query.Remove(0, 1)));                Regex r = new Regex(variable + "=(?<key>(.*?))(&|$)");                res = r.Match(Url).Result("${key}"); 

Esto como resultado nos arroja el valor esperado oculto dentro del chorizo de caracteres raros e ilegibles del QueryString. Este sencillo ejemplo es muy útil cuando necesitamos enviar información entre páginas y no queremos que el usuario malintencionado la cambie para fregarnos la existencia y ahorrarnos validaciones en código en caso de que alteren los parámetros dentro de la misma. 

Anexo un .ZIP (http://cid-a57150b9cc22cc3a.skydrive.live.com/self.aspx/Articles/RequestSiteExample.zip) con el código fuente utilizada. Si se están preguntando porque no pongo el código de la clase de encripción es porque la misma es irrelevante a la solución y puede ser cualquier tipo de algoritmo que creemos conveniente para realizar la misma. En este caso de ejemplo yo estoy utilizando una implementación del algoritmo DES tradicional. 


En nuestra próxima entrega veremos: ¿QUIEN FREGADOS DIJO QUE NO SE PUEDE TRANSFORMAR CON XSLT 2.0 DENTRO DE NUESTRAS APLICACIONES .NET?


Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Clases Abstractas vs Interfaces. ¿Cómo, Cuándo y Por Qué?

febrero 17, 2009 07:10 by sergio

Enviado por Johnatan Flores Carmona el 17 de febrero de 2009  

Saludos a todos, en esta nueva aportación quiero compartir con ustedes un tema que cuando se está iniciando en el aprendizaje de la programación orientada a objetos no se encuentra en ningún libro o bien, pocos instructores lo mencionan -debo admitir que cuando impartí la materia de Introducción a la Programación Orientada a Objetos en el Instituto Tecnológico de León ni siquiera lo mencioné- y me refiero a ¿Cuándo y por qué usar clases abstractas o interfaces?

El concepto de clases abstractas e interfaces puede ser un poco confuso para los principiantes en la programación orientada a objetos ya que una clase abstracta sin ninguna implementación se ve cómo una interface, sin embargo existen muchas diferencias y similitudes entre ellas.

¿Qué es una clase abstracta?

Una clase abstracta es una clase que no puede ser instanciada y que debe ser heredada. Una clase puede implementarse en su totalidad, pero lo más habitual es que se implemente parcialmente o no se implemente en absoluto, encapsulando funcionalidad común para clases heredadas. Para información más detallada, vea Clases abstractas.

¿Qué es una Interface?

Una interface describe un grupo de comportamientos relacionados que pueden pertenecer a cualquier clase o estructura. Las interfaces contienen las firmas de métodos, propiedades, eventos o indizadores. La implementación de los miembros se hace en la clase o la estructura que implementa la interfaz. Para información más detallada, vea Interfaces.

Diferencias y Similitudes

A continuación extraigo parte de una tabla del artículo Abstract Class versus Interface en la que se describen las diferencias y similitudes que existen entre las clases abstractas y las interfaces:

Característica

Interface

Clase abstracta

Herencia Múltiple

Una clase puede heredar tantas interfaces requiera.

Una clase sólo puede heredar una clase abstracta.

Implementación por defecto

Una interface no puede proporcionar ningún código de implementación, solo la firma.

Una clase abstracta puede proporcionar la implementación completa o parcial.

Modificadores de acceso

Una interface no puede tener modificadores de acceso, todas sus firmas son públicas.

Los miembros de una clase abstracta pueden tener modificadores de acceso.

Núcleo vs Periferia

Las interfaces son usadas para definir las habilidades periféricas de una clase. Un Humano y un Vehiculo pueden implementar una interface IMovible

Una clase abstracta define el núcleo de una clase y es usada para objetos del mismo tipo.

Campos y Constantes

No pueden ser definidas en una interface

Una clase abstracta puede contener campos y constantes.

Recomendaciones para el uso de clases abstractas vs interfaces

La opción de diseñar tu funcionalidad cómo una interface o cómo clase abstracta puede ser difícil en algunas ocasiones. Microsoft en su artículo Recommendations for Abstract Classes vs. Interfaces nos hace las siguientes recomendaciones que trataré de ejemplificar para mostrar las ventajas de seguirlas.

Múltiples Versiones

Si sabe de antemano que va a crear varias versiones del componente, cree una clase abstracta. Las clases abstractas proporcionan un medio fácil y sencillo para crear versiones de los componentes. Al actualiza la clase base, todas las clases heredadas se actualizan automáticamente con el cambio. Por el contrario, las interfaces no se pueden cambiar una vez creadas. Si necesita una nueva versión de una interfaz, deberá crear una totalmente nueva.

Ejemplo: Pensemos en el caso de crear el ABC de una base de datos que contiene la tabla Persona, y además dos especializaciones de esta llamadas Cliente y Empleado; también existe la regla de negocio que indica que no puede registrarse a una persona si no es registrada cómo cliente o cómo empleado.

Solución con Clases Abstractas: Se debería de crear una clase abstracta llamada Persona y que defina las propiedades comunes entre Empleado y Cliente así como los métodos que implementan los procesos de Alta, Baja, Cambio de la tabla Persona; adicional a esto se deben crear las clases Empleado y Cliente, ambas heredan de Persona. Cada una deberá definir las propiedades que los diferencian y sobrescribir los métodos Alta, Baja y Cambio de la clase padre, en la sobre escritura de los métodos, se tendrá que hacer una llamada al método base correspondiente y agregar la implementación para modificar la tabla correcta.

Solución con Interfaces: Se debería de crear una interface llamada IPersona y que defina las firmas de los procesos de Alta, Baja, Cambio; adicional a esto se deben crear las clases Empleado y Cliente, ambas que implementen la interface IPersona. Cada una deberá definir las propiedades y campos comunes tanto comunes como diferentes, ambas también deben codificar la implementación de los métodos Alta, Baja y Cambio que realizarán los procesos en la tabla Persona y en la tabla correspondiente.

Conclusión: Cómo se puede ver, utilizando clases abstractas se puede reutilizar mucho código al heredar los campos, propiedades y llamando a los métodos de la clase base; en cambio con interfaces tenemos que re-escribir los campos y propiedades comunes en todas las clases así cómo el código de los métodos.

Funcionalidad Común

Si la funcionalidad que está creando va a ser útil en una amplia gama de objetos diferentes, utilice una interfaz. Las clases abstractas deben utilizarse principalmente para objetos estrechamente relacionados, mientras que las interfaces son más adecuadas para proporcionar funcionalidad común a clases no relacionadas.   

Ejemplo: Se tiene el caso de querer implementar diferentes medios de transporte que existen y se han identificado el Autobus, Avión y Barco. ¿Cómo se implementaría con clases abstractas y cómo con interfaces?

Solución con Clases Abstractas: Se crearía una clase abstracta llamada Transporte que defina el método abstracto Transportar; Se crearán las clases Autobus, Avion y Barco, todas ellas heredarán de Transporte y deberán realizar la implementación del método abstracto.

Solución con Interfaces: Se debería de crear una interface llamada ITransporte que defina la firma del método Transportar; Se crearán las clases Autobus, Avion y Barco, todas ellas implementarán la interfaz ITransporte.

Conclusión: A simple vista se podría decir que ambas soluciones son iguales, ya que las dos le delegan la responsabilidad de implementar el método Transportar a las clases finales Autobus, Avion y Barco, pero la diferencia está en lo siguiente, ¡No existe herencia múltiple! Por lo tanto con la solución de clases abstractas estaremos desperdiciando una oportunidad de heredar de otra clase, pensemos en este caso, podríamos tener una clase padre llamada Avion y las clases hijas Avioneta, AvionComercial, etc., entonces hazte la siguiente pregunta ¿Avioneta y AvionComercial deberían heredar de Avion o de Transporte? En este caso claramente se ve que la mejor opción es utilizar interfaces.

Pequeña Funcionalidad

Si va a diseñar fragmentos pequeños y concisos de funcionalidad, utilice interfaces. Si va a diseñar unidades funcionales grandes, utilice una clase abstracta.

Conclusión: Esta recomendación va muy ligada a las dos anteriores, mientras más grande la funcionalidad es más recomendable la reutilización por lo que las clases abstractas son la mejor opción; con funcionalidad pequeña no es recomendable perder la oportunidad de heredar nuestra clase con una clase padre que tenga una funcionalidad grande para reutilizar sus propiedades y métodos por lo que la utilización de interfaces es nuestra mejor opción.

Funcionalidad común

Si desea proporcionar funcionalidad común e implementada en todas las implementaciones del componente, utilice una clase abstracta. Las clases abstractas permiten implementar parcialmente una clase, mientras que las interfaces no contienen ninguna implementación para ningún miembro.

Conclusión: Siempre que encuentres funcionalidad común entre dos o más clases, busca la manera de utilizar herencia para la reutilización de código (mientras menos escribas mejor).

Si deseas el código fuente utilizado para este discusión puedes descargarlo de:


Actualmente calificado con 4.2 por 5 personas

  • Currently 4,2/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Integración Multiempresas

diciembre 2, 2008 06:06 by sergio
Conforme las empresas han ido adquiriendo la necesidad de realizar negocios haciendo uso de las TI, su competencia para realizar negocio ha ido incrementándose significativamente. El fenómeno B2B ha envuelto diferentes aplicaciones, desde el Intercambio Electrónico de Información (EDI) hasta la compra de bienes y servicios que demanda flexibilidad y automaticidad al momento de interactuar con socios comerciales.

Muchos proyectos multiempresa están proliferando, desde el comercio electrónico tradicional, hasta la integración y conectividad entre sistemas, proveyendo de las bondades del software como servicios y los procesos de negocios como integraciones de servicios.

Otro conductor ha sido el aumento de presión en la industria para acortar los procesos de negocio críticos y de ejecución, tiempos de ciclo y por tanto, más procesos de cambio orientados a la interacción del tiempo.

Las empresas están más inclinados a tomar ventaja de servicios Web en diversos proyectos de TI, así como la aplicación proveedores (tales como Oracle y SAP), Proveedores de middleware (por ejemplo, Tibco y webMethods de Software) y B2B proveedores (como Axway y Sterling Commerce). El interés en los servicios Web ha sido impulsado por el éxito de su uso debido a su integración y su gran interoperabilidad.

Sin embargo, mientras aumenta la adopción de tanto SOA y los servicios Web, los enfoques tradicionales e interoperabilidad (entre ellos AS2, EDI, transferencia de archivos, XML / HTTP y RosettaNet) seguirá siendo útil. De hecho, en muchos proyectos, el uso de los enfoques tradicionales seguirá ampliando.

Actualmente calificado con 1.0 por 1 personas

  • Currently 1/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Fundamentos de Administración de Proyectos - Segunda Entrega

noviembre 22, 2008 13:12 by sergio

2. Gestión del Alcance del Proyecto

La Gestión del Alcance del Proyecto incluye los procesos necesarios para asegurarse que el proyecto incluya todo el trabajo requerido, y sólo el trabajo requerido, para completar el proyecto satisfactoriamente. La gestión del alcance del proyecto se relaciona principalmente con la definición y el control de lo que está y no está incluido en el proyecto.

Descargar aquí el Documento


Actualmente calificado con 3.0 por 2 personas

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Fundamentos de Administración de Proyectos - Primera Entrega

noviembre 22, 2008 12:59 by sergio

1. Administración de la Integración del Proyecto

El conocimiento del área de la administración de integración de proyectos incluye los procesos y actividades necesarias para identificar, definir, combinar, unificar y coordinar varios procesos y actividades de administración de proyectos incluidas en el Proceso de Administración de Proyectos. En el contexto de la administración de proyectos, la integración incluye características de unificación, consolidación, articulación y acciones integradoras cruciales para la conclusión del proyecto, necesidades de clientes y requerimientos de los involucrados.

Descargar aquí el Documento


Actualmente calificado con 1.0 por 1 personas

  • Currently 1/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Aplicaciones Web de Vanguardia con AJAX.NET y Silvelight

octubre 11, 2008 15:31 by sergio

Aplicaciones Web de Vanguardia con AJAX.NET y Silvelight 
Ya está disponible la presentación de la ponencia en el Simposium de Tecnología del ITZ el 30 de Septiembre.

 

Aplicaciones Web de Vanguardia
  • Introducción
  • El modelo AJAX
  • Cambiando el Paradigma
  • AJAX vs Aplicaciones Web Clásicas
  • ¿Por qué Silverlight?
  • Experiencia de Usuario con Silverlight
  • La Web se pone Interesante

Click para descargar:  Office 2007


Actualmente calificado con 5.0 por 2 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

AJAX JASON vs AJAX.NET

abril 18, 2008 09:28 by sergio

Este video a parte de explicar como implementar AJAX Json dentro de aplicaciones ASP.NET, confronta a la funcionalidad de AJAX.NET que en ciertas ocasiones nos queda muy limitada.


Para descargarla da click aquí 


Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5