martes, 13 de diciembre de 2011

Sitios precompilados y archivos de informes RDLC

Sintomas:
Publicas un sitio web precompilado siguiendo mis instrucciones en:
 Precompilar en vs2010 para agilizar un sitio ASP.NET
Desgraciadamente tienes errores al ir a cargar informes en formato RDLC.
Solución: 
El problema es que el compilador compila tambien los informes y no los copia al sitio web. Copia una marcador ficticio en su lugar.

Puedes copiar los archivos RDLC manualmente o definir una accion postcompilación, pero una solución mas elegante es buscar en el web.config la sección que fuerza la compilación de los archivos con extensión rdlc:

<buildProviders>
<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</buildProviders>


Y añadir una linea al final que quite la extensión: <remove extension=".rdlc"></remove>
La cosa quedara así:
<buildProviders>
<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove extension=".rdlc"></remove>
</buildProviders>

Por supuesto podriamos borrar la sección Add pero VisualStudio 2010 nos lo volveria añadir en cuanto hicieramos algo con los informes.

Fuente de la solución: http://connect.microsoft.com/VisualStudio/feedback/details/468068/rdlc-files-are-build-into-resources-during-publish-this-is-a-marker-file



Precompilar en vs2010 para agilizar un sitio ASP.NET

Enunciado:
Has trabajado largo y tendido para conseguir un buen sitio web. Líneas y líneas de código.
Pero cada vez que accedes a tú sitio este carga muy lento la prímera página, a partir de entonces y hasta el día siguiente funciona rápido.
Crees que esto te está robando usuarios. y buscas soluciones.
El problema es que los sitios tienen que reciclarse periodicamente, y entonces tu sitio se vuelve a compilar.
En versiones anteriores de visual Studio se podia establecer la opción para no compilar, desmarcando la casilla "permitir que este sitio precompilado sea actualizable". Pero ahora no la encuentras.
Solución:
Descarga Visual Studio® 2010 Web Deployment Projects
Haz clic derecho en el proyecto web que quieres publicar y añade un Web  Deployment Proyect
Te crea un proyecto en la solución cuyas propiedades contienen las opciones que necesitas.
Concretamente: Allow this precompiled site to be updatable que debes dejar SIN MARCAR
Cuando generas este proyecto el resultado te lo vuelca en Output Folder que puede ser  una carpeta virtualizada en tu IIS.
¡y carga rápido!
Si usas archivos RDLC puedes tener problemas lee mi siguiente post sobre este téma.

viernes, 25 de noviembre de 2011

Determinar al jerarquía de tiempo utilizada para cálculos basados en PARALLELPERIOD (SSAS)

Enunciado:
Tienes una base de datos donde usas una dimensión tiempo para la que has definido dos jerarquías, una basada en Trimestres y otra basada en cuatrimestres.
Tienes que utilizar PARALLELPERIOD para calcular por ejemplo el valor hace 12 meses.
Pero en los argumentos de PARALLELPERIOD se especifica la jerarquía y si utilizas la jerarquía basada en trimestres para calcular el valor 12 meses atrás de un cuatrimestre el resultado es erróneo.
Solución:
Leeme antes: Esta solución solo es valida para dos jerarquías. Lee la nota al final es importante.
En el script de cubo defines una miembro que te indicará la jerarquía, luego utilizas el resultado en un iif para el cálculo del miembro que deseas.

//CONTROL DE TIPO DE LA JERAQUÍA
 CREATE MEMBER CURRENTCUBE.[Measures].[Tipo Calendario] as

       IIF (
        [Calendario cuatrimestral].currentmember.level.ordinal=1
        ,'T'
        ,'C'
        )
    ,VISIBLE=0;

//Metros 12 meses antes
CREATE MEMBER CURRENTCUBE.[Measures].[M2 Antes]
 AS 
  (IIF ([Measures].[Tipo Calendario]='C'
        ,PARALLELPERIOD 
            ([Calendario cuatrimestral].[Año]
            ,1
            ,[Calendario cuatrimestral].currentmember
            )
        ,PARALLELPERIOD 
            ([Tiempo].[Calendario trimestral].[Año]
            ,1
            ,[Tiempo].[Calendario trimestral].currentmember
            )
    )    
    ,[Measures].[M2]
  ), 
FORMAT_STRING = "#,##0;-#,##0;0", 
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Mes\Metros' ,  ASSOCIATED_MEASURE_GROUP = 'Medidas'  ;
Nota importante:
Curiosamente la solución la encontré en el artículo: Time calculations in UDM: Parallel Period de Mosha Pasumansky comentando un articulo de A Different Approach to Implementing Time Calculations in SSAS - by David Shroyer. El segundo artículo no está disponible no hagas clic.

Mosha dice que esta solución puede conducir a resultados erróneos cuando usas atributos que figuran en ambas jerarquías. Sin embargo yo no he observado error alguno en mis resultados.


Agradecería que me advirtieraís si hay un error.

martes, 9 de agosto de 2011

En una consulta linq to LastOrDefault no funciona

Problema
Quieres encontrar el último elemento de una tabla que cumple una condición.

 Dim convocatoriaUltima = (From c In bd.Convocatoria 
              Where c.idConvocatoria=idConvocatoria  
              Order By c.FechaInicio ).LastOrDefault
Pero al ejecutar obtienes un error acerca de que LastOrDefault no esta soportado.

Solución
Ordena al reves y usa FirstOrdefault
 Dim convocatoriaUltima = (From c In bd.Convocatoria 
               Where c.idConvocatoria = idConvocatoria 
               Order By c.FechaInicio Descending).FirstOrDefault



viernes, 10 de junio de 2011

Exportar buzones de exchange 2010 SP1 a pst

Problema:
¿Cómo exportar los buzones de exchange a un archivo pst?
Solución:
Utiliza los mandados del powershell para exportación e importación
Referencia:
 http://technet.microsoft.com/en-us/library/ee633455.aspx#Exp
Un buen articulo:
 http://www.stevieg.org/2010/07/using-the-exchange-2010-sp1-mailbox-export-features-for-mass-exports-to-pst/
Un ejemplo
Creas las tareas de exportación:
foreach ($i in (Get-Mailbox -OrganizationalUnit 'empresa.org/UsuariosProxima Baja'))
                                           { New-MailboxExportRequest -Mailbox $i

                                              -FilePath "\\fichero\datos\BuzonesAnteriores\$($i.Alias).pst"
                                            }
Las consultas
Get-MailboxExportRequest|Get-MailboxExportRequestStatistics
Las borras cuando han terminado:
Get-MailboxExportRequest|remove-MailboxExportRequest

Importante: Solo funciona a partir del SP1

My,log.writeEntry y ApplicationPoolIdentity en ASP.NET IIS 7.5

Sintomas
En tu aplicación asp.net quieres registrar determinadas sitiaciones usando my.log.writeEntry ("texto a registrar"). Pero cuando vas a buscar el archivo de registro no lo encuentras.
Realmente lo que no encuentras es el perfil del usuario bajo c:\users
Si vas al pool de aplicaciones ves que el usuario es ApplicationPoolIdentity.
Pero sigue si estar.
Solución
Ves al pool y pon en true la opción Cargar perfil del usuario (Load user profile).
Reinicia el pool.
Entonces ya tienes un perfil usuario con el nombre del pool. Por ejemplo: ASP.NET v4.0
Navengando en el perfil como sigue encontraras el archivo de log.

c:\Users\ASP.NET v4.0\AppData\Roaming\Microsoft Corporation\Internet Information Services\7.5.7600.16385\w3wp.log

martes, 7 de junio de 2011

Problemas conexion TASKTASK de Ipad con exchange

Síntomas:
El programa tasktask para sincronizar las tareas con un servidor exchange no funciona.

Tips para solucionarlo en un entorno exchange forefront TMG
La clave esta en que se debe tener acceso a los servicios web del exchange (aplicación /EWS del IIS) desde el exterior.
Para verificarlo intentar navegar hasta:

https://exchange.tueempresa.com/EWS/Services.wsdl

Donde exchange.tuempresa.com es tu url de publicación exchange
Si no funciona hay que trabajar en esta línea:
El servicio Web está publicado en la misma regla que Outlook AnyWhere (por lo menos en mi caso), es posible que Outlook AnyWhere esté funcionando pero no funciones otros servicios o caminos publicados (EWS o OAB)
Puedes comprobar  y recibir información  con el botón prueba de la regla de publicación.

Yo tenía dos problemas la url externa de publicación y los metodos de autenticación.
La url externa de publicación por defecto era midominio.com/EWS y mientras que debia ser exchange.midominio.com/EWS. Por otro lado los metodos de autenticación en Exchange y Forefront no coincidian.
Para ver la configuración en el Shell de Exchange:

get-WebServicesVirtualDirectory |fl


Luego puedes modificar los valores con:
 
Set-WebServicesVirtualDirectory -Identity * -ExternalUrl https://www.contoso.com/EWS/exchange.asmx
Set-WebServicesVirtualDirectory -Identity * -WindowsAuthentication $true

Referencia set-webservicesvirtualdirectory

Forefront tmg: Se detuvo la consulta por un error mientras se ejecutaba

Sintoma
cuando quieres realizar una consulta de los registros del Forefront TMG te salta el error: se detuvo la consulta mientras se ejecutaba.
No aparece mas información en eventos o similar.
Solución definitiva
Instalar SP2 de Forefront TMG
Solución provisiona
Puede ser util  para futuros problemas :-)

 Sal de la consola de gestión
Borra el directorio: C:\Documents and Settings\%profile%\Application Data\Microsoft\MMC\msisa
Vuelve a entrar y es probable que esté resuelto
En caso contrario busca por: The query stopped because an error occurred while it was running."

miércoles, 1 de junio de 2011

Error al cargar el marco de trabajo de cliente ASP.NET AJAX y url-Rewrite

Sintoma:
No puedes cargar el modulo de trabajo de ASP.NET AJAX en los clientes.
Ocurre en las páginas que usan ToolScriptManager en lugar del Script manager.
El problema aparece al publicar en el servidor de producción.
Solución
En mi caso:
El servidor de producción utilizaba el modulo url-rewrite module 2.0 y tenía una regla de salida en el raíz sin precondiciones.
Ha bastado con añadirle una precondición del tipo RESPONSE_CONTENT_TYPE text/html para que todo funcione. El problema por lo visto no esta tanto por lo que hace la regla como por la ausencia de precondición.


    
         
         
         
   
         
             
             
   

martes, 31 de mayo de 2011

Reescritura de urls y webforms de ASP.NET

Existen distintas formas de reescribir una URL, un buen articulo es el el post en el Blog de Scott Guthrie donde se resumen las formas al que habría que añadir la existencia del modulo url-rewrite para iis7.

En el post de Scott Guthrie se recomienda el uso de modulos ya desarrollados, como el url-rewrite, pero mi experiencia es que estos modulos crean muchos problemas con referencias a estilos, imagenes, scripts.

Estos problemas se agravan cuando se usan webforms ASP.NET como adelanta la sección URL Rewriting for ASP.NET Web Forms en las páginas del modulo url-rewite para iis7.

Mi opinión es que el modulo url-rewrite es útil y lo recomiendocuando tienes que trabajar con código ajeno, pero si estas trabajando con un desarrollo propio y tu código está minimamente estructurado será mas eficiente implantar la reescritura de urls en tu codigo. Eficiente tanto en tiempo de ejecución como de desarrollo.

Recordemos que el problema es usar URL del tipo:
http://www.spaintiles.info/dirbeta/0-0-1-1-1-1-15-1-1-E-1/default.aspx
Cuando sabemos que a nuestras páginas les gusta mas del tipo:
http://www.spaintiles.info/dirbeta/default.aspx?P=0-0-1-1-1-1-15-1-1-E-1

El primer paso que equivale la regla de entrada (inbound rule) del Rewrite-module es transformar la URL primera en la segunda.

Para ello usamos el evento de aplicación beginRequest y el metodo rewritePath del contexto.  Dicho en simple, en global.asax editamos el procedimiento Application_BeginRequest con un código similar al que sigue.
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        ' Se desencadena al comienzo de cada solicitud
        Dim pathOriginal = Request.Url.ToString
        Dim rg As New System.Text.RegularExpressions.Regex("(?http\://\w*(\.\w*)*(?:\:\d*)?)(?/\w*/)(?:(?\w-\w(?:-\w*)*))/(?default\.aspx)(?.*)", RegexOptions.IgnoreCase)
        Dim captura = rg.Matches(pathOriginal)
        If captura.Count = 1 Then
            With captura(0)
                Dim pagina = .Groups("app").Value + "/default.aspx"
                If .Groups("queryString").Value.Length = 0 Then
                    pagina += "?P="
                Else
                    pagina += .Groups("queryString").Value + "&P="
                End If
                pagina += .Groups("argumentos").Value
                Context.RewritePath(pagina, False)
            End With
        End If
    End Sub

Este código podría ser mas simple como el ejemplo de
void Application_BeginRequest(object sender, EventArgs e) {

        string fullOrigionalpath = Request.Url.ToString();
        
        if (fullOrigionalpath.Contains("/Products/Books.aspx")) {
            Context.RewritePath("/Products.aspx?Category=Books");
        }
        else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) {
            Context.RewritePath("/Products.aspx?Category=DVDs");
        }
    }  
Pero a mi me gustan las expresiones regulares y tenerlo todo bien identificado.

Importante:
En mi código de ejemplo establezco a false el parametro rebaseClientpath:
  Context.RewritePath(pagina, False)
Con esto se resuelven muchos de los problemas relacionados con el uso del simbolo ~ en las urls de imagenes y otros controles web para referenciar la raiz de la aplicación.

El siguiente paso es reescribir las url para navegación entre páginas.  Outbound rule o regla de salida en un rewrite-module.
Aquí es donde puede depender de como estructuraste tu codigo. En mi  caso todas las url se generaban en un único procedimiento url(). A efectos de depuración introduje un setting de aplicación que me permite controlar el tipo de url que quiero generar.
Un primer paso es disponer es generar un patrón de url:
If tipoUrl = tiposDeUrl.caminoIzquierdaSimple Then
    dim privpagina=My.Request.uri.Absoluteuri
    Dim rg As New Regex( _
             "(?http\://\w*(\.\w*)*(?:\:\d*)?/\w*/)" + _
             "(?:(?\w-\w(?:-\w*)*)/)?" + _
             "(?default\.aspx)(?.*)?", _
                  RegexOptions.IgnoreCase)
    Dim capturas = rg.Matches(privpagina)
    If capturas.Count = 1 Then
        privpagina = capturas(0).Groups("raiz").Value + _
                     "{0}/" + _
                     capturas(0).Groups("pagina").Value
    End If
End If
El resultado es que en privPagina tendremos algo asi como:
http://www.spaintiles.info/dirbeta/{0}/default.aspx
Que nos será muy util para reemplazar con el valor del parametro:
Select Case tipoUrl
    Case tiposDeUrl.parametros
              resultado = String.Format("{0}?P={1}", pagina, camino)
    Case tiposDeUrl.caminoIzquierdaSimple
              resultado = String.Format(pagina, camino)
End Select
(recordar que por pruedencia tengo un setting para controlar el tipo de url que utilizo)

En este momento podemos probar porque igual todo funciona directamente.
Es posible que surgan problemas:
A) Al hacer click en un botón o similar.
El problema es que hacemos un post del form asp.net y el path está mal escrito.
Solución:
En el evento Load de la página añadid:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        form1.Action = Request.RawUrl
.........

B) No se cargan estilos o scripts.
En mi caso opté por cargarlos mediante código:
Public Function RaizApp() As String
     With me.Request
         If .ApplicationPath.EndsWith("/") Then
            Return .ApplicationPath
         Else
            Return .ApplicationPath + "/"
         End If
     End With
End Function
Sub CargaJava(ByVal nombre As String)
     Dim sc As New HtmlGenericControl("script")
     sc.Attributes("type") = "text/javascript"
     sc.Attributes("src") = String.Format("{0}Scripts/{1}.js", raizapp, nombre)
     me.Header.Controls.Add(sc)
End Sub

Sub CargaCSS(ByVal nombre As String)
Dim css As New HtmlLink
    css.Href = String.Format("{0}estilos/{1}.css", RaizApp, nombre)
    css.Attributes("type") = "text/css"
    css.Attributes("rel") = "stylesheet"
    css.Attributes("media") = "all"
    me.Header.Controls.Add(css)
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Event load de la página
    form1.Action = Request.RawUrl
    If Request.QueryString.AllKeys.Contains("_TSM_HiddenField") Then Exit Sub
    ToolkitScriptManager1.Scripts.Add(New UI.ScriptReference(RaizApp + "scripts/dfc.js"))
    CargaJava("jquery-1.3.2.min")
    CargaCSS("estilocomun")
    CargaCSS("estiloceramica")
    CargaCSS("findyourCeramic")
..........
Con esto y algun que otro parche ocasional te funcionará la reescritura de URLs.

Puedes encontrar mas información sobre parchear los paths relativos en  Fixing Relative Paths in C# ASP.NET When Using Url Rewriting.
Gracias a Walter Wang que me dió la última idea en http://www.eggheadcafe.com/software/aspnet/30412853/url-rewriting-and-file-paths.aspx (otro post interesante sobre el tema.

martes, 10 de mayo de 2011

Explotar un PDF en sus paginas y extraer textos claves

Problema:
Tienes un PDF generado por tu programa de nomina (pongamos A3NOM). En un solo archivo tienes las nominas de todos los empleados. Los textos en el PDF son accesibles, puedes copiar por ejemplo el DNI del empleado y el NIF de la empresa.
Tu necesitas guardar cada página en un fichero que tenga por nombre DNI-NIF.PDF

Solución:
Descargas itext desde http://sourceforge.net/projects/itextsharp/
Luego construyes una rutina que vaya recorriendo todas las páginas.
En cada una extraes el texto con GetTextFromPage
Luego extraes el dni y el nif con las expresiones regulares correspondientes.
Finalmente extraes y guardas la página en un archivo con el nombre deseado.
Mejor verlo en código:
Imports iTextSharp.text.pdf, System.Text, System.IO, System.Text.RegularExpressions

Sub recorrePaginas(ByVal archivo As String)
Dim rgDNI = New Regex("\d{8}[A-Z]")
Dim rgNIF = New Regex("[A-Z]\d{8}")
Dim lectorPDF = New PdfReader(archivo)
Dim TotalPaginas = lectorPDF.NumberOfPages
For Pagina = 1 To TotalPaginas
Console.WriteLine(Pagina.ToString + "\" + TotalPaginas.ToString)
Dim texto = parser.PdfTextExtractor.GetTextFromPage(lectorPDF, Pagina)
texto = Encoding.UTF8.GetString (ASCIIEncoding.Convert (Encoding.Default,
Encoding.UTF8, Encoding.Default.GetBytes(texto)))
Dim DNI = rgDNI.Match(texto).Value
Dim NIF = rgNIF.Match(texto).Value
Dim nombreArchivo = String.Format("c:\pruebas\{0}-{1}.pdf", DNI, NIF)
If File.Exists(nombreArchivo) Then File.Delete(nombreArchivo)
Dim doc = New iTextSharp.text.Document(lectorPDF.GetPageSizeWithRotation(Pagina))
Dim escritor = New PdfCopy(doc, File.Create(nombreARchivo))
doc.Open()
Dim paginaPDF = escritor.GetImportedPage(lectorPDF, Pagina)
escritor.AddPage(paginaPDF)
doc.Close()
escritor.Close()
Next
End Sub

Comentario:
Hay que ver como nos complican la vida los programadores de gestiones nominas y demás.
Con lo sencillo que sería dar la opción de generar en PDF separados la nominas y exportar en texto la información mas basica asociada al PDF.
¡Pero que se puede esperar de una gente que siempre escribe lo nombres de los campos en mayúsculas

lunes, 9 de mayo de 2011

SQL server, problema con las politicas si al crear un usuario las dejas activadas

Sintomas:
Creas un usuario en sql server 2008, le pones nombre y contraseña. Pero dejas activadas las politicas por defecto.
Resultado no te deja hacer login ni cambiar las opciones CHECK_POLICY ni CHECK_EXPIRATION mientras tengas activado MUST_CHANGE

Solución:
Cambia la contraseña de las siguiente forma:
ALTER LOGIN [LoginName]
WITH PASSWORD = 'newpassword',unlock
go
ALTER LOGIN [LoginName]
WITH PASSWORD = 'newpassword',unlock,
CHECK_POLICY = OFF,
CHECK_EXPIRATION = OFF

jueves, 28 de abril de 2011

Maquina virtual con una instantanea inexistente

Descripción del problema:
Necesitas compactar el disco de una maquina virtual hyper-V, pero no te deja porque dice que tiene instaneas (snapshots).
Tu no las ves y por tanto no puedes eliminarlas.
Cuando vas al directorio donde se almacena el disco ves un archivo .VHD y otro .AVHD
Solución:
Debes unir ambos archivos en un unico disco y luego crear una maquina virtual nueva que use ese disco.
Es recomendable guardar una copia de los dos archivos por si pasara algo.
Luego le cambias la extensión al .AVHD por .VHD.
Lo editas con el editor de discos (al que has renombrado) y lo combinas (merge) con su disco primario.
Finalmente creas una maquina virtual con ese disco y te olvidas de la otra.
(por supuesto ahora puedes compactar)
Esta descrito con muchas ilustraciones en:http://www.networkfoo.org/server-infrastructure/recovering-your-virtual-machine-how-manually-merge-hyper-v-snapshots-back-one-

martes, 26 de abril de 2011

No puedes comprimir (editar) un disco virtual hyper-V Windows 7

Sintoma:
Tienes una maquina virtual hyper-v con windows 7 y quieres reducir el tamaño de su disco virtual. El asistente te dice que la operración actual no puede hacerse por limitaciones del sistema operativo.
Solución:
Probablemente tengas copias sombra, shadow copies, instaneas, puntos de recuperación del sistema, o como quieras llamarlos. Cuidado no digo en hyper-v sino en la misma maquina windows 7.
Eliminalos con el mandato
vssadmin delete shadows /all
En consola de administrador.

viernes, 18 de marzo de 2011

Refrescar intellisense en Managament Studio SQL Server 2008 R2

Sintomas:
Cuando creas o modificas una base de datos el intellisense al escribir consultas marca en rojo los campos o tablas nuevas.
Solución:
Ctrl+Shift+R o Editar -> IntelliSense -> Actualizar la cache local.

sábado, 5 de marzo de 2011

Renovación certificados FNMT Firefox si viene Internet Explorer

Problema
Te llega el aviso de renovación del certificado de la FNMT (hacienda), accedes con Firefox te dá error, te vas al IE9 RC te dá error, pruebas con chrome error.
Solución
Tienes que preparar Firefox para los certificados.
En primer lugar cargas el certificado raíz de la FNMT: http://www.cert.fnmt.es/index.php?cha=cit&sec=4&page=139&lang=es
Luego exportas desde el Internet Explorer los certificados y los importas en Firefox.
Mas documentación en:
http://www.cert.fnmt.es/content/pages_std/docs/Renovacion_con_Mozilla_Firefox.pdf

viernes, 18 de febrero de 2011

GoogleBot no tiene idioma

Sintomas:
Una página dinámica que se visualiza correctamente en los exploradores no es leida por googlebot.
Causa:
Parece ser que Googlebot no suministra idioma a la página como hacen casi todos los exploradores.
En el caso de la página en cuestión el código consultaba la colección Request.UserLanguages para establecer el lenguaje por defecto.
Antes de consultar realizaba una comprobación erronea de que la lista no estaba vacía:
if infoASPX.Request.UserLanguages.Count > 0
Digo que era erronea porque la sentencia correcta es:
if infoASPX.Request.UserLanguages isnot nothing andalso infoASPX.Request.UserLanguages.Count > 0

Esos pequeños detalles.
Comentarios:
Lo cierto es que era frustrante, descubrí el problema cuando ví que no se indexaba esta porción de nuestro sitio. Afiné el fallo cuando probé con las herramientas para webmaster de Google. Al verificar la conformidad HTML con http://validator.w3.org/  obtuvé error 500.
Siguiendo la traza de errores con la utilidad correspondiente de IIS7.5 comprobé que solo había errores cuando accedía con GoogleBot y el validator.
Luego descubrí que si el idioma estaba establecido con un parametro en el querystring el error no aparecía y tirando del hilo.....

miércoles, 9 de febrero de 2011

Dar permisos a un usuario para enviar en nombre de un grupo en Exchange 2010

Objetivo:
Que un usuario pueda enviar en nombre de un grupo (send on behalf of).
Solución:
En exchange power shell usar:
Set-DistributionGroup GroupName -GrantSendOnBehalfTo UserName

Por supuesto el usuario deberá saber visualizar en Outlook en campo De de un mensaje.
Comentarios
Creo que la opción desapareció en el interfaz gráfico de exchange 2010.
Un aspecto interesante es que si quieres que todos los miembrosdel grupo puedan enviar en nombre del grupo puedes escribir:
Set-DistributionGroup GroupName -GrantSendOnBehalfTo GroupName

jueves, 3 de febrero de 2011

Subinformes RDLC en report cargado dinámicamente.

Sintomas
Creas un informe RDLC con subreports mediante visual studio.
Cargas dinámicamente el informe pero se produce un error al cargar el subinforme.
No encuentra el archivo.
Por otro lado ¿Cómo cargas los datos del subinforme.
Soluciones:
Debes cargar dinámicamente con loadsubrepordefinitión el subinforme utilizando como nombre del report el Reportname (el que rellenas en usar este informe como subinforme de las propiedades) y no el  del subinforme dentro del informe.
Ejemplo:
Dim informe As New LocalReport
Dim lector As New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoOrgsProd.rdlc")
informe.LoadReportDefinition(lector)
lector.Close()
lector = New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoProd.rdlc")
informe.LoadSubreportDefinition("ListadoProd.rdlc", lector)
lector.Close()
AddHandler informe.SubreportProcessing, AddressOf infoParametros

Por cierto que en la última línea se resuelve como establecer los datos de subinforme: hay que hacer establecer mediante addHandler la referencia a un procedimiento que se dispará cuando vaya a procesarse el informe:

Sub infoParametros(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)
     e.DataSources.Add(New ReportDataSource("dsProductos", datosProd))
End Sub

martes, 25 de enero de 2011

A partir de hoy, Red y Libertad

A partir de hoy, Red y Libertad


Consideramos imprescindible la retirada de la disposición final primera de la Ley de Economía Sostenible por los siguientes motivos:



1 -Viola los derechos constitucionales en los que se ha de basar un estado democrático en especial la presunción de inocencia, libertad de expresión, privacidad, inviolabilidad domiciliaria, tutela judicial efectiva, libertad de mercado, protección de consumidoras y consumidores, entre otros.



2 - Genera para la Internet un estado de excepción en el cual la ciudadanía será tratada mediante procedimientos administrativos sumarísimos reservados por la Audiencia Nacional a narcotraficantes y terroristas.



3 - Establece un procedimiento punitivo “a la carta” para casos en los que los tribunales ya han manifestado que no constituían delito, implicando incluso la necesidad de modificar al menos 4 leyes, una de ellas orgánica. Esto conlleva un cambio radical en el sistema jurídico y una fuente de inseguridad para el sector de las TIC (Tecnología de la Información y la Comunicación). Recordamos, en este sentido, que el intercambio de conocimiento y cultura en la red es un motor económico importante para salir de la crisis como se ha demostrado ampliamente



4 - Los mecanismos preventivos urgentes de los que dispone la ley y la judicatura son para proteger a toda ciudadanía frente a riesgos tan graves como los que afectan a la salud pública. El gobierno pretende utilizar estos mismos mecanismos de protección global para beneficiar intereses particulares frente a la ciudadanía. Además la normativa introducirá el concepto de "lucro indirecto", es decir: me pueden cerrrar el blog porque "promociono" a uno que "promociona" a otro que enlaza a un tercero que hace negocios presuntamente ilícitos.



5 - Recordamos que la propiedad intelectual no es un derecho fundamental contrariamente a las declaraciones del Ministro de Justicia, Francisco Caamaño. Lo que es un derecho fundamental es el derecho a la producción literaria y artística.



6 - De acuerdo con las declaraciones de la Ministra de Cultura, esta disposición se utilizará exclusivamente para cerrar 200 webs que presuntamente están atentando contra los derechos de autor. Entendemos que si éste es el objetivo de la disposición, esta no es necesaria, ya que con la legislación actual existen procedimientos que permiten actuar contra webs, incluso con medidas cautelares, cuando presuntamente se esté incumpliendo la legalidad. Por lo que no queda otra opción sino recelar de las verdaderas intenciones que la motivan ya que lo único que añade a la legislación actual es el hecho de dejar la ciudadanía en una situación de grave indefensión jurídica en el entorno digital.



7 - Finalmente, consideramos que la propuesta del gobierno no sólo es un despilfarro de recursos sino que será absolutamente ineficaz en sus presuntos propósitos y deja patente la absoluta incapacidad por parte del ejecutivo de entender los tiempos y motores de la Era Digital.



La disposición es una concesión más a la vieja industria del entretenimiento en detrimento de los derechos fundamentales de la ciudadanía en la era digital.



La ciudadanía no puede permitir de ninguna manera que sigan los intentos de vulnerar derechos fundamentales de las personas, sin la debida tutela judicial efectiva, para proteger derechos de menor rango como la propiedad intelectual. Dicha circunstancia ya fue aclarada con el dictado de inconstitucionalidad de la Ley Corcuera (o "Ley de patada en la puerta").



El Manifiesto en defensa de los derechos fundamentales en Internet, respaldado por más de 200 000 personas, ya avanzó la reacción y demandas de la ciudadanía ante la perspectiva inaceptable del gobierno.



Para impulsar un definitivo cambio de rumbo y coordinar una respuesta conjunta, el 9 de enero se ha constituido la "Red SOStenible" una plataforma representativa de todos los sectores de la sociedad civil afectados. El objetivo es iniciar una ofensiva para garantizar una regulación del entorno digital que permita expresar todo el potencial de la Red y de la creación cultural respetando las libertades fundamentales.



En este sentido, reconocemos como referencia para el desarrollo de la era digital, la Carta para la innovación, la creatividad y el acceso al conocimiento, un documento de síntesis elaborado por más de 100 expertos de 20 países que recoge los principios legales fundamentales que deben inspirar este nuevo horizonte.



En particular, consideramos que en estos momentos es especialmente urgente la implementación por parte de gobiernos e instituciones competentes, de los siguientes aspectos recogidos en la Carta para la innovación, la creatividad y el acceso al conocimiento:



1 - Las/os artistas como todos los trabajadores tienen que poder vivir de su trabajo (referencia punto 2 Demandas legales, párrafo B. "Estímulo de la creatividad y la innovación", de la Carta);



2 - La sociedad necesita para su desarrollo de una red abierta y libre (referencia punto 2 "Demandas legales", párrafo D "Acceso a las infraestructuras tecnológicas", de la Carta);



3 - El derecho a cita y el derecho a compartir tienen que ser potenciado y no limitado como fundamento de toda posibilidad de información y constitutivo de todo conocimiento (referencia punto 2 "Demandas legales", párrafo A "Derechos en un contexto digital", de la Carta);



4 - La ciudadanía debe poder disfrutar libremente de los derechos exclusivos de los bienes públicos que se pagan con su dinero, con el dinero publico (referencia punto 2 "Demandas legales", párrafo C "Conocimiento común y dominio público", de la Carta);



5 - Consideramos necesaria una reforma en profundidad del sistema de las entidades de gestión y la abolición del canon digital (referencia punto 2 Demandas legales", párrafo B. "Estímulo de la creatividad y la innovación", de la Carta).



Por todo ello hoy se inicia la campaña INTERNET NO SERA OTRA TELE y se llevarán a cabo diversas acciones ciudadanas durante todo el periodo de la presidencia española de la UE.



Consideramos particularmente importantes en el calendario de la presidencia de turno española el II Congreso de Economía de la Cultura (29 y 30 de marzo en Barcelona), la Reunión Informal de ministros de Cultura (30 y 31 de marzo en Barcelona) y la reunión de ministros de Telecomunicaciones (18 a 20 de abril en Granada).



La Red tiene previsto reunirse con representantes nacionales e internacionales de partidos políticos, representantes de la cultura y legaciones diplomáticas.



Firmado



Red SOStenible



http://Red-SOStenible.net



La Red Sostenible somos todos/as. Si quieres adherirte a este texto, cópialo, blogguéalo, difúndelo.