Skip to content

Nos vemos compilando

Llevaba bastante tiempo queriendo escribir esta pequeña nota, y al final como siempre la falta total de tiempo la ha demorado más allá de lo razonable.

Aunque la noticia llega tarde, mi compañero y amigo Víctor Fernández ha comenzado (ya era hora) a escribir un blog. Víctor tiene una capacidad de trabajando inmensa y una experiencia considerable. Sin embargo y aparte de estos detalles, para mi es el responsable de una gran parte de las cosas buenas que le han ocurrido a la empresa donde trabajo gracias a haber creado el concepto de soporte técnico que existe hoy en día en la misma. Justo éste último aspecto se ha acabado convirtiendo en la “marca de la casa”, bajo las premisas de máximo rigor técnico, amabilidad y rapidez.

Podéis (debéis) visitarlo en www.compilando.es y seguirlo en twitter como @vfportero.

Un saludo a todos

Categories: General.

Abrir mas puertos de escucha para el protocolo SMTP en Postfix

Lo dejo aquí como referencia.

Hay que añadir en el archivo de configuración ‘master.cf’ lo siguiente:

587 inet n – n – - smtpd

Donde 587 es el número del puerto. Acto seguido reiniciar y ya se podrán aceptar conexiones por ese puerto.

Espero que os sirva.

Categories: General.

Real World Architecture with ASP.NET MVC

http://channel9.msdn.com/Events/DevDays/DevDays-2011-Netherlands/Devdays072

Espero que os sea de utilidad.

Categories: General.

Metadatos con Chema Alonso en el foro Comunica.t Internet

Hoy ha pasado por Valencia gracias al foro Juan Luis Vives Chema Alonso, consultor de Informática 64 y seguramente más conocido por escribir “Un informático en el lado del mal“.  Hoy tocaba metadatos y FOCA.  La audiencia, muy poco técnica, parece haberlo pasado bastante bien y hay que reconocer la habilidad de Chema para enfrentarse a casi cualquier público.

Las transparencias exactas no sé si están colgadas, pero para ver el funcionamiento básico de la herramienta y poder valorar correctamente la amenaza que supone la fuga de información a través de los metadatos, se puede encontrar más información aquí:

http://www.elladodelmal.com/2009/04/la-foca-sale-libre.html

Categories: General.

Domitienda ofrece el framework 4.0 (.NET) en la modalidad de hosting compartido

Después de una larga espera ya podemos ofrecer en Domitienda el framework 4.0 de .NET. Está incluido a partir del plan básico, así que es bastante económico poder probar todo lo que ofrece.

Hemos escrito una pequeña reseña en el blog.

Saludos :)

Categories: General.

Tags: , , , ,

IRISRBL, el servicio anti-spam de RedIRIS

Es probable que las DNSBL constituyan una de las mejores y más sencillas maneras de luchar contra el correo no deseado. Son extremadamente fáciles de implementar en cualquier organización (casi todos los softwares servidores de correo están preparados para integrarlas) y protegen más que razonablemente sin consumir (prácticamente, nuestros) recursos. No es que se tenga que despreciar el coste de llamar a esta clase de servicios, pero en comparación con el coste de los sistemas de reglas tipo “SpamAssasin” ganan claramente. Son cosas distintas y no debería compararlas, pero me lo permito en este caso.

Los motivos por los cuales acabas dentro de una de estas listas son de carácter diverso: haber superado el umbral de puntuación de SPAM en varias ocasiones, enviar a direcciones no existentes (cuidado con esto) o caer en alguna de las múltiples ‘honeypots’ que existen por ahí para estos menesteres. El problema es que los proveedores de DNSBL son tan diversos como las razones para acabar teniendo problemas, y problemas de verdad es lo que vas a tener cuando tus clientes empiecen a llamar avisándote de que al parecer estás en algún tipo de lista negra, y vaya si lo estás.

Una vez metido en el gran marrón hay cosas que se deben suponer y otras que son deseables.

  • No estoy enviando conscientemente SPAM y si alguien lo ha hecho porque no he sido capaz de detectarlo voy a solventarlo.
  • En caso de haber enviado SPAM necesito conocer bajo qué criterios he sido juzgado e incluido en la lista.
  • Estoy metido en un buen lío, ya que una de mis IPs de envío está listada y eso significa clientes que no pueden recibir su servicio en tiempo y forma. ¿Cómo arreglo esto?. Necesito estar fuera de la lista YA.

En el trabajo hemos visto de todo, desde proveedores geniales que realmente están haciendo mejor internet y el correo electrónico hasta el más puro chantaje económico. Por ello, siempre que aparece un nuevo servicio hay que ver cómo implementa lo que implementa y sus formas. El último “encontronazo” ha sido con RedIRIS y su nuevo servicio IRISRBL. Y digo encontronazo porque nunca es plato de buen gusto, eso sí, su servicio es excelente.

  • Cumplen con una de las leyes básicas del correo electrónico, informar al emisor de que su correo no ha sido entregado por los motivos que sean.
  • Permiten quitar una IP de la lista de manera semiautomática.
  • Con la confirmación de la eliminación de la IP te llega un vínculo para acceder a un informe donde se puede consultar qué cuentas de correo son responsables y las cuentas a las que intentaron enviar.

Antes de darte cuenta ya lo has arreglado. Además es fácil tomar las medidas necesarias para que no se vuelva a producir ya que te informan exactamente del origen del problema en su componente más íntima, la/s cuenta/s responsable/s.

Desde mi punto de vista, el de bloqueado, el nivel de calidad es muy alto (tampoco esperaba menos de la institución).

Categories: General.

Tags: , , ,

etnassoft -> Programadores que no programan

Tampoco quiero comentar nada, sólo recomendar su lectura. Para algo su autor ha escrito un post impecable y bien documentado.

http://www.etnassoft.com/2011/01/16/programadores-que-no-programan/

Categories: General.

Tags: ,

Fatal error: Call to a member function isValid() on a non-object (remote_sender.php)

Quizá me falte mucha información sobre el sistema de centralización de Plesk con la herramienta Expand. Lo digo porque cada vez me sorprenden más ciertas decisiones de arquitectura o comportamiento que me encuentro trabajando con ella y lo expongo con todo el respeto del mundo. Sé que sostienen muchas funcionalidades y además algunas muy complejas, así que por algo será…

La última ha sobrevenido al realizar algunos cambios de contraseñas. La centralización se configura desde el Expand hacia los servidores ‘hijo’ Plesk. Sin embargo parte de la configuración (quizá más de la deseable) del Expand parece diseminarse en los hijos lo cual es un hervidero de problemas en caso de que alguno de los cambios no pueda actualizarse por cualquier motivo, como éste de las contraseñas. Si era necesario hacerlo así, quizá podrían explicitarlo más y que fuera menos oscuro. Al pulsar el botón de correo centralizado aparece el error:

  • Fatal error: Call to a member function isValid() on a non-object

Hay que utilizar el cliente que sea para acceder a la instancia de Plesk (MySQL para nosotros):

  • mysql -u admin -P8306 -p

Una vez correctamente identificado y con acceso a la plataforma es necesario ejecutar:

  • use psa;
  • select * from misc;

Si estáis ante el mismo problema que nos hemos encontrado nosotros, comprobaréis cómo los valores REMOTE_LOGIN, REMOTE_PASSWORD y REMOTE_SERVER no están actualizados. Para actualizar la contraseña tendríais que ejecutar:

  • update misc set val=’NUEVA_PASS’ where param=’REMOTE_PASSWORD’

Espero que sea de utilidad.

Categories: General.

I’m not a real programmer

“I’m not a real programmer. I throw together things until it works then I move on. The real programmers will say ‘yeah it works but you’re leaking memory everywhere. Perhaps we should fix that.’ I’ll just restart Apache every 10 requests.”

Rasmus Lerdorf (Creador del lenguaje PHP)

Categories: General.

Fotografias de las oficinas de FogCreek Software, NY

Os dejo unas fotografías de las oficinas de FogCreek Software, la empresa fundada por Joel Spolsky y Michael Pryor:

http://picasaweb.google.com/spolsky/FogCreekSNewOffice#

Categories: General.

0-day en ASP.Net (Poet, Thai Duong y Juliano Rizzo)

Hemos escrito una pequeña reseña en el blog de Domitienda.com hablando sobre la última zero-day de ASP.Net.

http://blog.domitienda.com/index.php/2010/09/28/importante-vulnerabilidad-en-asp-net/

Un saludo a todos,

Categories: General.

Retirar una IP del screening en los servidores de correo MDaemon (11.0)

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,

Categories: General.

Cuidado con la clase WMI MicrosoftDNS_Zone

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

  1. Ejecutar wbemtest.exe.
  2. Click sobre connect y luego root\microsoftdns en el namespace.
  3. Enum classes
  4. Recursive y click en OK
  5. Seleccionar __Win32Provider de la lista de clases y hacer doble click.
  6. Click en “Instances”.
  7. Seleccionar la instancia y doble click.
  8. Seleccionar “HostingModel” y hacer doble click.
  9. Cambiar el valor de “NetworkServiceHost” a“NetworkServiceHost:DNSProvHost” (Sin las comillas)
  10. Guardar propiedad
  11. Guardar el objeto
  12. 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.

Categories: General.

Guia de estilo basica en C#


Toda esta información está extraida en parte del imprescindible libroFramework 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.

Categories: General.

Tags: ,

Nuevos servidores virtuales (VPS) en Domitienda

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 ;)

Categories: General.

Extrayendo ensamblados de la GAC de nuestro PC

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:

Abrir una consola como administradores

Acto seguido accedemos a la ruta C:\Windows\Assembly\GAC_MSIL.

El directorio 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:

Ejemplo de la codificación de los directores que contienen los ensamblados

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,

Categories: General.

The George Clooney code

Sinceramente, sin estas 410 pastillas de Nespresso mi rendimiento caería bastante… :)

Buenos días a todos,

Categories: General.

Esencial si quieres trabajar con WMI

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í:

- Is WMI a real villain?

Espero que os sea de utilidad.

Categories: General.

Visual Studio 2010 disponible para suscriptores

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.

Categories: General.

RadGrid, manejador AJAX y EnableEventValidation

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.

Categories: General.

Tags: , , , ,