No sé si es un bug generalizado, pero al menos en nuestro MDaemon versión 11 nos hemos dado cuenta de que no podemos quitar una IP de la monitorización de IPs (la monitorización permite rechazarlas y que no se llegue a producir el saludo típico del protocolo SMTP si la IP de origen está en la lista). A nivel de interfaz se quita correctamente, pero por el motivo que sea no se guarda el cambio en la configuración. Para realizarlo hemos tenido que pegarnos un repaso a los archivos .DAT del programa que contienen la configuración.
La información está contenida en IPScreen.dat, situado en la carpeta APP. El archivo está en texto plano y es bastante autoexplicativo.
Saludos,
Cuando estaba desarrollando la funcionalidad de gestión manual de registros de DNS en Domitienda me encontré con un problema bastante importante de rendimiento en la clase MicrosoftDNS_Zone de WMI. Básicamente, al utilizarla se disparaban dos procesos hasta copar el 100% de la CPU: El proceso del servidor de DNS de Microsoft (dns.exe) y el provider de WMI de la máquina (wmiprvse.exe).
Siempre he tenido claro que las consultas por WMI son tirando a lentas y que hay que restringir resultados todo lo posible (sin llegar a desnaturalizar el resultado devuelto). Sin embargo, en este caso, cualquier enumeración sobre esta clase provocaba los efectos ya descritos, todo sobre un Windows 2003 Server correctamente actualizado (aunque ciertamente, soportando muchas zonas).
No he llegado a descubrir a qué se debe semejante problema (que podía dejar la máquina colgada durante 50 segundos). Lo que he tenido claro es que al menos en el servidor en cuestión era necesario evitar comprobaciones de, por ejemplo, existencia de una zona concreta (es más “barato” crear la zona y tratar la excepción en caso de que ya exista). También, un modo de paliar esa sensación de cuelgue extremo es crear un provider de WMI aislado solamente para el servidor de DNS. De este modo, el resto de operaciones esperando para realizar alguna operación mediante WMI pueden usar el provider genérico. El planificador de tareas de Windows 2003 ya se encarga de repartir el tiempo lo mejor que puede entre ambos, y los resultados mejoran bastante (pese a que la CPU se siga pasando al 100% más de lo que toca).
En el blog de Jane Lewis puede leerse sobre esta técnica. Traduzco aquí para futura referencia:
Aislar WMIPRVSE.EXE en una instancia privada para el servidor de DNS de Microsoft
- Ejecutar wbemtest.exe.
- Click sobre connect y luego root\microsoftdns en el namespace.
- Enum classes
- Recursive y click en OK
- Seleccionar __Win32Provider de la lista de clases y hacer doble click.
- Click en “Instances”.
- Seleccionar la instancia y doble click.
- Seleccionar “HostingModel” y hacer doble click.
- Cambiar el valor de “NetworkServiceHost” a“NetworkServiceHost:DNSProvHost” (Sin las comillas)
- Guardar propiedad
- Guardar el objeto
- Cerrar wbemtest.exe.
Como siempre gracias al autor, Jane en este caso, por esta información.
Si tenéis cualquier información y queréis compartirla no dudéis en poneros en contacto.

Toda esta información está extraida en parte del imprescindible libro “Framework Design Guidelines“. Hasta dónde puedas aplicarlo dependerá de tu contexto, tipo de empresa, sector, etc. pero su lectura debería considerarse obligatoria. Voy a aprovechar para hacer una pequeña recopilación.
El mantenimiento de una guía de estilo no es sencilla y como cualquier marca de calidad que deseemos dejar en nuestros proyectos nos costará dinero. No obstante, el hábito que realmente es importante fomentar en el equipo de desarrollo es la consistencia en las prácticas más que el seguimiento de estas en concreto. Eso sí, ya que estamos enmarcando nuestros proyectos en el framework, no tendría ningún sentido no hacerlo.
La forma adecuada de utilizar las mayúsculas (Capitalization Conventions)
Hay dos tipos de codificaciones, PascalCasing y camelCasing. ¿Cuando se utiliza cada una?
PascalCasing: Nombres de clases, miembros públicos, propiedades, métodos, namespaces, etc.
camelCasing: Parámetros, variables privadas.
En cierto modo, todo lo público se escribe en Pascal, todo lo privado en camel. Se escriben en mayúsculas los acrónimos de hasta dos letras de longitud: IOStream, en caso concretario no es necesario: HtmlText .
Constructores
Los constructores son la primera operación que se ejecuta con la creación de una clase. Cuando un programador los utiliza no espera que tengan un coste excesivo, por ello un constructor debe ser sencillo y no hacer mucho más trabajo que inicializar las variables privadas (dejar el objeto en el estado que tiene que estar). Cualquier tarea más compleja debería ser un método aparte ya que esto permite una mayor riqueza de usos para el usuario de la clase (como la paralelización de ciertas tareas, o simplemente hacerle consciente de que está ejecutando una operación).
Métodos y propiedades
En muchas ocasiones a un programador le pueden surgir dudas con estas dos construcciones. ¿Hasta donde debe llegar una propiedad o cuando debería ser un método?.
¿Qué caracteriza a una propiedad?
- No dependen unas de otras
- No debería ser obligatorio llamarlas en ningún orden concreto
- No deben tener efectos colaterales sobre la instancia de la clase
- No deben lanzar excepciones
- El programador espera que se comporten como un simple campo, por lo tanto así deberían estar implementadas.
¿Qué caracteriza a un método?
- Altera de manera visible la instancia o realiza alguna conversión
- El orden de llamada es muy importante
- Devuelve un array
Codificación de los miembros de una clase
Siempre me ha generado cierta inquietud cómo debía nombrar a las variables miembro de una clase. Realmente, al usarlas en una función, es ideal utilizar la palabra reservada this para que de un solo vistazo se pueda indicar al lector del código que estamos hablando de una de estas variables. Otro modo es prefijar de algún modo estas variables (“m_Variable”). Aunque esto no está soportado mayoritariamente es interesante un comentario de Anthony Moore (Equipo BLC del Framework) con el cual coincido. Según él, el prefijado de estas variables puede evitar errores de programación entre variables locales y variables miembro, además de permitir diferenciarlas también de variables estáticas.
Espero que os sea de utilidad.
Hemos sacado en Domitienda nuestro nuevo producto: los servidores privados virtuales (VPS). Me gustaría hacerme eco de la oferta de salida:
- 6 meses adicionales
- 1 certificado SSL de 128 bits
- Aproximadamente sale a 26€ mensuales
La verdad es que poder disfrutar de, a efectos prácticos, un servidor privado por estos precios es una completa revolución. Además no están en absoluto cortos de RAM por lo que puede ser una interesante diversificación tecnológica en los productos de hosting de cualquier empresa. Por otro lado, como programador, es carta libre para hacer lo que quieras.
Espero que lo valoréis convenientemente
La “Global Assembly Cache” es un repositorio de ensamblados .NET, a la que se puede acceder en modo compartido por todo el software programado bajo esta tecnología, evitando lo que se conocía como el “infierno de las DLL” (incompatibilidad entre versiones, problemas de memoria compartida, problemas para actualizar todas las copias de la librería en el PC, etc). En definitiva, la GAC tiene una serie de propiedades que la hacen muy interesante y la convierten en un punto y aparte en el modo de abordar este problema en sistemas operativos Windows.
En ocasiones puede ser de gran utilidad extraer una DLL de la GAC, por ejemplo, para usarla en entornos de hosting compartido. Para una empresa de hosting es complejo tener instalado en el sistema una gran variedad de componentes de terceros, ya que pueden sobrecargar, requieren más mantenimiento y hay posibilidades de afectar al sistema durante la instalación. En este caso y según el componente que queramos usar, es posible subir la DLL a la carpeta BIN y de esta manera poder acceder a la librería sin necesidad de instalarla. La mayoría de componentes dejan las librerías instaladas en la cache y mantienen una copia en la carpeta de instalación, pero otras sin embargo quedan “encerradas” en la GAC (como algunas del espacio de nombres Microsoft.Reporting).
Si accedemos a C:\Windows\Assembly se nos presenta una interfaz que no nos permite manejarlas (copiar, pegar). Necesitamos abrir una consola con permisos de administrador:
Acto seguido accedemos a la ruta C:\Windows\Assembly\GAC_MSIL.
Nos aparecerán listadas una gran variedad de carpetas, cada una de ellas referida a un ensamblado. Deberemos acceder a la deseada y volver a listar:
Aparece una carpeta con un formato que viene dado por la versión del ensamblado en primer lugar y el PublicKeyToken en segundo. Dentro de esta carpeta podremos acceder a la DLL buscada y copiarla donde deseemos.
- copy *.dll c:\destino
Saludos,
Sinceramente, sin estas 410 pastillas de Nespresso mi rendimiento caería bastante…
Buenos días a todos,
Es muy útil seguir el blog del equipo que lleva el desarrollo de una tecnología vital para administrar grandes infraestructuras de TI distribuidas. Podéis encontrarlos en esta URL:
- Windows Management Infraestructure Blog
Concretamente, en cuanto a problemas de rendimiento relacionados con el ejecutable wmiprvse.exe (el provider de WMI en el que se apoyan todas las herramientas que lo necesiten), podéis averiguar como obtener las trazas aquí:
Espero que os sea de utilidad.
Tal y como ya ha aparecido en el blog de Domitienda, o bien en el del Guille ya está disponible el Visual Studio 2010 para suscriptores de la MSDN. Aparte de las mejoras en el IDE (desarrollado en WPF), lo más significativo es la integración total con el Framework 4.0.
No creo que pase mucho tiempo hasta que en Domitienda sea posible disponer de productos de hosting compartido en esta tecnología.
Hoy me he encontrado, de nuevo, con otro comportamiento extraño del componente RadGrid, de Telerik. Al parecer el manejador AJAX que incorpora de manera nativa tiene algún problema con las últimas versiones de Firefox. Al reportar un cliente esta circunstancia, el primer intento (y fallido) fue desactivar ésta propiedad. Al fin y al cabo, el postback en este caso no era un problema tan grande.
Sin embargo, como no podía ser de otro modo, la cosa se complicó. Al pulsar sobre uno de los controles de servidor alojados en el componente se producía la conocida excepción:
Argumento de devolución o de devolución de llamadas no válido. La validación de eventos se habilita usando <pages enableEventValidation=”true”/> en la configuración o <%@ Page EnableEventValidation=”true” %> en una página. Por motivos de seguridad, esta característica comprueba que los argumentos pasados a eventos de devolución o de devolución de llamadas se origina desde el control del servidor que inicialmente los procesó. Si los datos son válidos y son los que se esperaba, utilice el método ClientScriptManager.RegisterForEventValidation para registrar los datos de devolución o de devolución de llamadas para su validación.
Como se puede consultar en la MSDN, de manera predefinida todos los controles registran los eventos que causan postbacks de manera que puedan ser validados, reduciendo de este modo la posibilidad de que se produzcan peticiones al servidor que puedan causar un comportamiento no contemplado. No obstante, aunque no se debe desactivar, lo hice para probar el comportamiento del formulario web. Todos los controles de tipo servidor (runat=server) no lanzaban su evento de manera correcta.
Después de buscar un poco en Google, encontré la solución en el foro de la empresa:
http://www.telerik.com/community/forums/aspnet/ajax/invalid-postback-callback-argument.aspx
El problema estaba en que había una porción de código fuera de la siguiente comprobación:
1: if (!this.Page.IsPostBack())
2: {
3: this.Cargar();
4: }
5:
6: this.CargarSiempre();
Al parecer este código no protegido por la comprobación modificaba de algún modo la colección de controles que albergaba el RadGrid lo cual causaba que fallase la validación que se producía a posteriori. La solución en este caso ha resultado bastante sencilla y ha consistido en incluir todo el código dentro del If. De hecho, el motivo de que estuviera fuera era que se procesara en todas las peticiones a la web, también en las que se realizan mediante AJAX.
Espero que os sirva de ayuda.
El día 24 de Marzo se celebra el Asegur@IT 7 en la ciudad de Barcelona, evento organizado por Informatica 64. Es llamativa la charla de Leo Nve y Christian Martorella sobre hacking en entornos de comunicaciones basados en satélites. Ha salido publicado en Forbes:
- http://www.forbes.com/2010/02/02/hackers-cybercrime-cryptography-technology-security-satellite.html
Buscando en internet se puede encontrar más material.






