martes, 20 de septiembre de 2011

No se pueden enviar correos electrónicos desde combinar correspondencia con Word 2003

 PROBLEMA 

No se puede enviar correos electrónicos con formato HTML desde "combinar correspondencia" en Word 2003 usando Outlook 2007.

Word 2003 no dá ningún mensaje de error, simplemente no se envían los correos electrónicos generados en la combinación de correspondencia.




 SOLUCIÓN 

Instalar Word 2007. El envío de correos de tipo HTML en combinar correspondencia desde Word 2007 y Outlook 2007 funciona perfectamente.


viernes, 3 de junio de 2011

VBScript. Script para la realización diaria de copias de seguridad. Esquema Hijo-Padre-Abuelo.

Un método ideal para mantener diferentes versiones de copia de seguridad de nuestros códigos fuente durante el proceso de desarrollo.

El esquema de copia de seguridad Hijo-Padre-Abuelo permite mantener multitud de versiones diarias de copia de seguridad de una forma óptima. Los diferentes volúmenes de copia se identifican en 3 tipos: Hijo, Padre y Abuelo. Una implementación posible consta de la siguiente configuración de copias. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad incremental). Volumen Padre: Copia semanal (se realiza una copia diferencial). Volumen Abuelo: Copia mensual (se realiza una copia completa).
Con este esquema se consigue mantener versiones diarias de todos los archivos, de forma que se pueda recuperar la copia de un día determinado mediante un máximo de dos pasos: 1º recuperación de copia completa (abuelo), 2º recuperación de copia incremental (padre) y 3º recuperación de copia diferencial (hijo). Por otra parte, este esquema hace un uso óptimo del espacio de almacenamiento, pudiéndose reutilizar o deshechar las cinco copias Hijo semanalmente, las cuatro copias Padre mensualmente, y las copias Abuelo anualmente, en función de la cantidad de versiones que deseemos mantener.

- Copia completa. Copia de todos los archivos.
- Copia incremental. Copia de los cambios realizados respecto de la última copia completa.
- Copia diferencial. Copia de los cambios realizados respecto de la última copia completa o incremental.

Otra implementación posible mantiene los siguientes tipos de copia. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad diferencial). Volumen Padre: Copia semanal (se realiza una copia completa). Volumen Abuelo: Copia mensual (se realiza una copia completa). Esta implementación, aunque tiene mayores requerimientos de espacio, solo requiere dos pasos para la recuperación de cualquier copia. A continuación se muestra el código en vbScript que implementa este esquema.


Código en VBScript:
'Copias:
'    LUNES.         Copia HIJO. Incremental.
'    MARTES.        Copia HIJO. Completa.
'    MIERCOLES.    Copia HIJO. Incremental.
'    JUEVES.        Copia HIJO. Incremental.
'    PRIMER VIERNES DEL MES.    Copia ABUELO. Completa.
'    RESTO VIERNES DEL MES.    Copia PADRE. Completa.

option explicit

dim fso, ws
dim CarpetaOrigen, CarpetaDestino

'LECTURA DE ARGUMENTOS
if Wscript.Arguments.Count <> 2 then
    msgBox("Parámetros incorrectos")
    WScript.quit 1
end if
CarpetaOrigen = WScript.Arguments(0)
CarpetaDestino = WScript.Arguments(1)

set fso=CreateObject("Scripting.FileSystemObject")
set ws=CreateObject("WScript.Shell")

'Martes COPIA HIJO [COMPLETA]
if weekday(now)=3 then  
    if msgbox("¿Desea realizar la copia COMPLETA-HIJO del Martes para " & CarpetaOrigen & "?",4)=6 then
        'Borrar carpeta anterior
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /C /Y /E /H",1,True) then
             'OK 
        end if        
    end if

'Viernes COPIA PADRE [COMPLETA]  
elseif weekday(now)=6 and not ((day(now)\7)+1)=1 then  
    if msgbox("¿Desea realizar la copia COMPLETA-PADRE del Viernes para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & " /S /Q",1,True) then
              'OK
        end if
        'HACER COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Primer viernes del mes COPIA ABUELO [COMPLETA]  
elseif weekday(now)=6 and ((day(now)\7)+1)=1 then      
    if msgbox("¿Desea realizar la copia COMPLETA-ABUELO del mes actual" & month(now) & " para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\AB_" & month(now) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\AB_" & month(now) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Lunes [INCREMENTAL], Miercoles [INCREMENTAL], Jueves [INCREMENTAL]
elseif weekday(now)=2 or weekday(now)=4 or weekday(now)=5 then  
    if msgbox("¿Desea realizar la copia INCREMENTAL-HIJO del día para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA INCREMENTAL
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /M /C /Y /S",1,True) then
             'OK
        end if
    end if
end if
WScript.Quit



viernes, 8 de abril de 2011

Libros de ingeniería de programación


He abierto una nueva página en el blog para relacionar aquellos libros que me han ofrecido conocimientos interesantes en el campo de la ingeniería de programación. Compartiré allí mis opiniones sobre su contenido, así como, lo que me han aportado para mi trabajo diario.

Libros imprescindibles sobre ingeniería de software y metodologías de desarrollo.

La guía completa del Proceso Unificado escrita por sus creadores.
Ivar Jacobson, Grady Booch, James Rumbaugh.

viernes, 25 de marzo de 2011

Metodologías de desarrollo software para proyectos de Un-Solo-Trabajador. Problemática.



Los proyectos de software realizados por un sólo programador que hace las funciones de especificador, analista, diseñador de interfaces de usuario, arquitecto y programador, y que probablemente también atenderá los proyectos de mantenimiento tras la entrega, se enfrentan a no menos problemas de calidad que los proyectos más grandes realizados por grupos completos de desarrollo. Pero, además, estos proyectos de Un-Sólo-Trabajador caen con mayor facilidad en la falta de metodología y como consecuencia en incumplimientos de plazos, falta de documentación y dificultades de certificación o estandarización.

La mayoría de las metodologías bien definidas para proyectos de cierta envergadura y grupos de trabajo lo suficientemente grandes como para que permitan la asignación de diferentes roles no se suelen ajustar a los proyectos de Un-Sólo-Trabajador. Además en estos proyectos el programador, actuando como jefe de proyecto, raramente perjudicará su rendimiento, como generador de líneas de código, asignándose tareas de especificación de casos de uso, análisis o diseño de interfaces, todas ellas tareas cuyo producto final son textos y gráficos (nada más lejos de su objetivo primigenio).

Pero a pesar de todo ello, y sin contar con la ayuda de un departamento de calidad del software, el objetivo final de estos proyectos de Un-Sólo-Trabajador es el mismo que el de cualquier proyecto enorme, es decir:
  • Que el software final cumpla los requerimientos y expectativas del cliente.
  • Que el mantenimiento, en sus vertientes de rectificación, adaptación y mejora sean fácilmente afrontables, así como las posibles ampliaciones futuras.
  • Que se cumplan los plazos de tiempo y presupuesto.
En próximos artículos presentaré una posible implementación del Proceso Unificado de Desarrollo de Software para proyectos de Un-Sólo-Trabajador. Algo que llamaré PU-UST.

Licencia Creative Commons
Metodología de desarrollo de software para proyectos de Un-Solo-Trabajador por Jorge Ignacio Jover Bou se encuentra bajo una Licencia Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.

miércoles, 23 de marzo de 2011

ASP.NET. Error en postback. Error de la validación del estado de vista MAC.

 PROBLEMA 

Se produce el siguiente error al efectuar un postback tras un cierto tiempo de inactividad:

"Error de la validación del estado de vista MAC. Si un clúster o una batería de servidores Web alojan esta aplicación, asegúrese de que la configuración <machinekey> especifica la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede utilizar en un clúster."

 SOLUCIÓN 

Poner el atributo enableViewStateMac del elemento pages de web.config a false.
<pages enableViewStateMac="false">

Más información en http://technet.microsoft.com/es-es/library/cc739441(WS.10).aspx.


lunes, 21 de marzo de 2011

ASP.NET ¿Cómo encontrar un valor entre los elementos de una columna de un DataSet?

Código en VB.NET:
Dim dv As DataView = miDataSet.DefaultView
dv.RowFilter = "Nombre_Columna='" & miValor & "'"
If dv.Count > 0 Then
   encontrado = true
Else
   encontrado = false
End If



miércoles, 9 de marzo de 2011

Error ORA-01019 al acceder a Oracle desde web IIS7


 PROBLEMA 

Oracle contesta con el error "ORA-01019: unable to allocate memory in the user side" cuando se intenta acceder desde página web ASP.NET en IIS7.

 SOLUCIÓN 

En nuestro caso el problema se resolvió restaurando la variable ORACLE_HOME que por alguna razón desconocida se había perdido.

sábado, 15 de enero de 2011

ASP.NET. Error de credenciales al acceder a webservice


 PROBLEMA 

Error en páginas ASP.NET que acceden a webservice. El error se produce de forma intermitente.

En el navegador cliente se obtiene el siguiente mensaje:
"Sys.WebForms.PageRequestManagerServerErrorException: Error desconocido al procesar la solicitud en el servidor. El código de estado devuelto por el servidor era: 500"

En depuración se obtiene:
Message: "Se ha terminado la conexión: No se puede establecer una relación de confianza para el canal seguro SSL/TLS."
InnerException: "System.Security.Authentication.AuthenticationException: El certificado remoto no es válido según el procedimiento de validación."

 SOLUCIÓN 

Forzar explícitamente el establecimiento de las credenciales por defecto del webservice y evitar la validación del certificado si no se requiere.

Código en VB.NET:
System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf validarCertificado)


Dim miWebService1 As miWebService = New miWebService
miWebService1.Credentials = System.Net.CredentialCache.DefaultCredentials

Private Function validarCertificado(ByVal sender As Object, ByVal certificado As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal cadena As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslErrores As System.Net.Security.SslPolicyErrors) As Boolean
       Return True
End Function

martes, 11 de enero de 2011

Plesk y IIS. Error "Acceso denegado" al acceder a aplicación ASP.NET

 PROBLEMA
Error ASP.NET obtenido en servidor IIS con Plesk. "System.UnauthorizedAccessException: Acceso denegado. (Excepción de HRESULT: 0x80070005 (E_ACCESSDENIED))".

 CAUSA
Problema con los permisos establecidos para ASP.NET.

 SOLUCIÓN PASO A PASO
1) Ejecutar ventana de comandos en modo administrador.
2) Ejecutar el comando
cacls C:\Windows\assembly\GAC_MSIL /E /R psacln /T /C
3) Ejecutar el comando
cacls C:\Windows\assembly\GAC_MSIL /E /R psaadm /T /C
4) En caso de que siga sin funcionar, volver a subir web.config.