06
Mar 14

Con smartphones y tabletas se cambio de POP3 a IMAP

Hace muchos años que gestiono servidores de correo para empresas. Y siempre pasaba lo mismo, se configuraba el IMAP y el SSL pero casi no lo se utilizaba, menos de un 10% de los usuarios. Casi siempre utilizaban outlook o similar con POP3 sin ningún tipo de cifrado. Explique muchas veces las ventajas de IMAP y del SSL pero nunca los utilizaban.

Desde que empezaron a utilizar smartphones y tabletas en las empresas esto cambio radicalmente. Primero empezó a utilizarse el SSL en casi todas las conexiones y en los últimos meses, por primera vez, el uso de IMAP es mayor al uso de POP3.

Uso de POP3 vs IMAP 2013-2014

En este gráfico lo verde es IMAP y lo rojo es POP. Lo que es escuro, en los dos colores es el SSL. Se ve como al pasar los meses, lo verde va avanzando hasta ser la mayoría. Aún muchos usuarios utilizan POP3 pero ya son menos del 50%.

Esto es bueno para los usuarios, la seguridad y privacidad, movilidad, etc.. Pero no tan “bueno” para los servidores ahora se necesitan mucho más recursos que antes para atender a las mismas cuentas. El consumo de recursos con POP3 es muy bajo, especialmente si no se utiliza SSL. Pero con IMAP las conexiones se mantienen, lo que incrementa el consumo de ancho de banda, CPU y RAM para menter las conexiones con los túneles de SSL en cada una de ellas.

También aumenta el consumo de espacio en el disco duro. Con POP3 el usuario descargaba los correos a su ordenador cada 10 minutos y el servidor no guardaba nada. Ahora con IMAP el servidor almacena todo, y cada cuenta ahora ocupa barios cientos de MB, y no son pocos los que consumen varios GB.

Todo sea por el progreso!


27
Jan 14

Bloquear actualizaciones en WordPress y sin penalizar el rendimiento

En cada actualización de WordPress puede surgir alguna incompatibilidad. Por este motivo se suele bloquear las actualizaciones para evitar una actualización accidental, o hecha por un usuario que no conoce los detalles de la instalación (osea, el cliente :P)

Existe un código que está muy propagado por internet:

//Disable Theme Updates # 3.0+
remove_action( 'load-update-core.php', 'wp_update_themes' );
add_filter( 'pre_site_transient_update_themes', create_function( '$a', "return null;" ) );
wp_clear_scheduled_hook( 'wp_update_themes' );

//Disable Plugin Updates #3.0+
remove_action( 'load-update-core.php', 'wp_update_plugins' );
add_filter( 'pre_site_transient_update_plugins', create_function( '$a', "return null;" ) );
wp_clear_scheduled_hook( 'wp_update_plugins' );

//Diasable Core Updates # 3.0+
add_filter( 'pre_site_transient_update_core', create_function( '$a', "return null;" ) );
wp_clear_scheduled_hook( 'wp_version_check' );

Este código funciona pero hay un problema, que empeora el rendimiento de wordpress. Casi multiplica por 4 los tiempos de respuesta.

Sucede porque la función que se crea para engañar al sistema devuelve un valor “null”, así WordPress cree que no hay ninguna actualización. Pero como no sabe cuando se hizo la comprobación ni cual fué la última versión ni nada (porque es un null), vuelve a conectar a wordpress.org para comprobar datos. Es decir, que cada click que se hace en el sitio hace que nuestro WordPress vuelva a consultar a wordpress.org. Una perdida de tiempo.

Un forma más adecuada de hacer este “hack” o bloqueo es la siguiente:

function custom_fake_check_version($a) {
    global $wp_version;
    return (object) array(
        'last_checked' => time(),
        'version_checked' => $wp_version,
    );
}
add_filter('pre_site_transient_update_core',    'custom_fake_check_version');
add_filter('pre_site_transient_update_plugins', 'custom_fake_check_version');
add_filter('pre_site_transient_update_themes',  'custom_fake_check_version');

Es lo mismo que lo anterior, salvo que en lugar de devolver un “null” le estamos diciendo al sistema que la última vez que se comprobó la versión fue “ahora mismo” y que la versión es “la versión actual”. Por lo tanto, WordPress no volverá a consultar ese dato en los servidores de wordpress.org hasta que se eliminen estos filtros.


24
Jan 14

Scripts para probar la autenticación en IMAP, POP3 y SMTP

Hace casi un año escribí estos scripts para probar los métodos de autenticación en el servidor de correo que estaba instalando en ese momento. La idea es crear un fichero de configuración con los datos de usuario y los métodos que se desean probar. Así, de forma fácil y rápida se puede verificar si la autenticación mediante “PLAIN”, “LOGIN”, “CRAM-MD5″, etc…

He publicado el código en git en la siguiente dirección: https://github.com/gabrielperezs/Authentications-tools-for-mail-servers

Funciona de la siguiente forma, es muy simple:

Se crea un fichero con la configuración, como este, lo llamamos example.conf:

# Account to test
username=test@mydomain.com
password=the_account_password
server=mail.example.org
#auth=auto
auth=manual
authtype=PLAIN LOGIN CRAM-MD5 DIGEST-MD5

Se puede indicar el parámetro “auth” como “auto” para que el script detecte automáticamente los métodos de autenticación disponibles. Si se indica como “manual” (tal como el ejemplo) permite indicar los métodos de autenticación que se quiera o los scripts de perl soporten. Depende de los módulos de perl que estén instalados en el systema.

Cuando se ejecuta se verá algo así:

$ perl imap-test.pl ~/example.conf
PLAIN -> mail.example.org (test@mydomain.com): OK - SSL OK
LOGIN -> mail.example.org (test@mydomain.com): OK - SSL OK
CRAM-MD5 -> mail.example.org (test@mydomain.com): ERROR - SSL ERROR
DIGEST-MD5 -> mail.example.org (test@mydomain.com): ERROR - SSL ERROR

Esto indica que los métodos de autenticación PLAIN, y LOGIN funcionan correctamente. Tanto con como sin SSL. Y los métodos CRAM-MD5 y DIGEST-MD5 no funcionan.

Los otros dos scripts (smtp-test.pl, pop3-test.pl) funcionan exactamente igual.


20
Dec 13

Comparativa del Nexus 7 2012 y Nexus 7 2013

Esta es la prueba del nexus 7 2013

wpid-Screenshot_2013-12-16-20-28-30.png

wpid-Screenshot_2013-12-16-20-28-19.png

 

Y este es del 2012

Screenshot_2013-12-16-20-28-37

Screenshot_2013-12-16-20-28-22


16
Oct 13

La insensibilidad en el día mundial de la alimentación

Un vecino de Palma de Mallorca ha tenido la “gran idea” de colocar este cartel en un contenedor. Dudo que un insensible de este nivel sepa que hoy es el día mundial de la alimentación.

IMG_20131016_114041

Es increíble que alguien se tome el trabajo de escribir y pegar esto en un contenedor para llamar CERDO a una o varias personas  que buscan en la basura para poder alimentarse. Para este vecino el problema no está en que la gente tenga que buscar en la basura para comer, no, el problema está en que no limpian después de “comer”.


28
Aug 13

Detectar móvil, tablet o desktop en WordPress

La forma más económica de hacer una web compatible con todos los dispositivos es hacer una maqueta adaptable. Que el mismo diseño, la misma maqueta sea perfectamente navegable en las tres familias de dispositivos.

Cuando hay recursos se suele hacer una maqueta especifica para cada dispositivo. Pero en el mundo WordPress la idea es reducir costes en todo lo posible, por lo que se utiliza solo un theme (maqueta) y esta es adaptable.

Cuando se desarrollan estas maquetas siempre surge algún problema del tipo:

  • “quiero este slider en las tablet y escritorios pero NO en los móviles”
  • “El tamaño de las fotos debe ser menor en movil y tablet que en escritorio”
  • “Los espacios de publicidad deben ser diferentes o deben desaparecer de la versión móvil”

Este tipo de necesidades pueden ser por temas estéticos o técnicos (sobre todo cuando las versiones de escritorio son demasiado grandes y/o pesadas para un móvil).

Por eso hemos hecho un pequeño y simple wordpress plugin para facilitar esta detección, y así generar el html necesario para cada dispositivo. Lo hemos llamado ttt-devices, se llama así porque lo hemos hecho en 33themes.com

Su funcionamiento es muy simple. Solo hay que instalarlo y definir los “if” que hagan falta, por ejemplo:

<body>
<?php if (is_tttdevice('mobile')): ?>
   <h1>Titulo</h1>
   <img src="header-mobile.jpg">
<?php else: ?>
   <h1>Titulo</h1>
   <img src="header.jpg">
<?php endif; ?>
</body>

En la descripción del plugin en la página de wordpress se puede ver en detalle sus funcionalidades, espero que os sea útil.


23
Feb 13

De perfiles, sueldos y formación

El problema en España son los directivos.

Hace tiempo que tenía esta idea en la cabeza pero no estaba seguro si era cierta o no, pero he visto una entrevista a Bernardo Hernández (Product Director en Google) que me ha convencido del todo.

Pregunta: “Yo te preguntaba si hubiera sido posible una empresa como google/facebook en España, tu eres optimista…”

Respuesta: “Insisto en que sería perfectamente posible. La diferencia fundamental que nos separa los emprendedores Españoles y Americanos es la formación técnica. Si haces una lista de los emprendedores que han tenido éxito a los largo de los últimos 15-20 años en los Estados Unidos son todos ingenieros informáticos, todos ingenieros informáticos.  Haces una lista de los empresarios que hemos hecho alguna cosa en España, en el tema de la tecnología, la excepción es el ingeniero informático, casi ninguno.

La entrevista completa, la pregunta es en el minuto 13:

Este hombre lo tiene claro, tiene una amplia experiencia y no solo en Estados Unidos o en el sector tecnológico, por ejemplo trabajó en BBVA en España. También ha creado varias empresas e invierte en otras al mismo tiempo que trabaja en Google.

Sin embargo en España la mentalidad es otra y no parece que vaya a cambiar. Hoy leí un  informe contratado por el gobierno de España con fondos de la UE para conocer los perfiles que se van a necesitar en el futuro en el ámbito de los contenidos digitales.

Perfiles Profesionales más demandados en el ámbito de los Contenidos Digitales en España 2012 – 2017 – Profesionales TIC 2011

En este estudio separan los perfiles en grupos, en el área de “Negocio”, sub-grupo “Estrategia y gestión de negocio” definen al perfil del jefe, del director de la siguiente manera:

Conocimientos financieros, presupuestarios y de economía; Conocimientos generales de todas las fases de la creación y explotación de una publicación; Conocimientos sobre el mercado editorial y de medios de comunicación; Conocimiento sobre tendencias y nuevos modelos de negocio; Conocimientos sobre nuevas tecnologías y social media; Conocimientos sobre marketing, comunicación y publicidad;Nivel avanzado de inglés; Conocimientos sobre gestión comercial de canales, principalmente con los majors (Amazon,Google, Apple).

Sinceramente, dudo mucho que alguien con “conocimientos generales” pueda crear algo como facebook, Adwords, Netflix, etc… por no decir que es imposible. Y además, se da la -casualidad- de que estos perfiles no valoran en absoluto a los perfiles técnicos. Razón por la cual aquí los técnicos tienen salarios bajos, y no es por la crisis, en medio de la burbuja del ladrillo un buen albañil o un buen comercial de calle cobraba más que un buen programador, administrador de sistemas, un diseñador web o diseñador 3d.

Y como muestra esta oferta de empleo de la empresa Habitissimo de aquí de Palma de Mallorca. Recuerdo que en twitter ponían “Habitissimo busca talento“… y si piden talento, porque buscan un perfil con muchos conocimientos, conozco muy poca gente que sepa todo lo que piden. Eso sí, no piensan ofrecer un salario acorde, ofrecen de 18.000€ a 33.000€ al año. Cualquiera que tenga esos conocimientos puede trabajar por su cuenta y cobrar mucho más, así de claro. No encuentro razón alguna para que alguien con esos conocimientos acepte ese salario (el de 33.000€ claro, 18.000€ es una tomadura de pelo en toda regla). Y si alguien se encuentra en esa situación que no tenga miedo y monte un proyecto propio, aunque sea de servicios, solo hace falta ser autónomo y un ordenador. Y a facturar horas de servicios!

Luego dirán que no encuentran personal cualificado, que en España falta formación, que no hay buenos programadores, ingenieros o diseñadores…


10
Jan 13

Efecto menéame

Envié un enlace a meneame.net, a los pocos minutos recibió unos 80 clicks, como era tarde pensé que no llegaría a portada. El post es sobre una nueva ley que sanciona de forma penal el fraude a la Seguridad Social. Lo que me animó a enviarlo fue el comentario final del post, con el que estoy 100% de acuerdo:

Nuevo delito por fraude a la Seguridad Social. Ojo defraudadores!

[...]

Ya era hora que el fraude a todos, porque la seguridad social la pagamos todos…, fuera considerado una auténtica lacra social y una actitud equiparada a graves delitos. Los recursos, escasos actualmente, deben dedicarse, y en mayor cuantía, a los que realmente lo necesiten y perseguir toda situación que utilice fondos públicos para un fin no previsto. Lo realmente triste, serán aquellas situaciones de necesidad que por pura supervivencia, el desempleado que cobra 400 euros de ayuda deba mantener a su familia y se vea obligado a trabajar de lo que sea, lo den o no de alta… es duro pensar que a partir de ahora, esa persona a pesar de poder ser condenado a multas mínimas pase a tener la consideración de delincuente, en el ámbito penal…

José Manuel Raya Sánchez

Como siempre duermo muy tarde, volví a mirarlo a las 2 de la mañana, y apenas llegaba a los 100 clicks. Al día siguiente a las 9h me encuentro con que estaba en portada, y no solo en portada, era noticia destacada! Que alegría!. Justo después de la alegría empezó la preocupación ¿aguantará el servidor el efecto menéame?

Quería compartir los datos. Hace unos meses buscaba información sobre el efecto menéame ¿cuantas visitas? ¿en cuanto tiempo? ¿que tan -fuerte- es? y no encontré mayor cosa. Hace tiempo Enrique Dans escribió en su blog sobre el efecto menéame, su servicio de hosting no aguantó, cito:

El “efecto Menéame”, por ejemplo, fue prácticamente el único responsable del reciente cambio de servidor de este blog a uno dedicado: la caída de calidad de servicio que el blog mostraba los días que llegaba a la portada del Menéame (cinco veces en el último mes) era algo que claramente no interesaba ni a mi proveedor, ni a mí mismo, ni a quienes compartían conmigo el servidor anterior.

En algunas pantallas que muestra Erique Dans indican 1.000 visitas por salir en portada, claro, este post se escribió en el 2008. A día de hoy el efecto es mucho mayor. En este caso fueron 1.941 meneos y 7.890 clicks. Que nuestro servidor aguantase sin problemas este trafico sorpresa es motivo de orgullo sinceramente :)

Así que comparto estas gráficas del momento de más actividad, para aquellos que preparan servidores y quieren datos más concretos del “efecto menéame”.

efecto-mename-request

 

 

 

 

Efecto meneame, conecciones

Lógicamente el efecto menéame puede ser muy variado, hay noticias que tienen 300 meneos y 20.000 clicks. Pero la gráfica ya da una idea del trafico que puede llegar y en cuanto tiempo.

Estoy bastante contento con este caso (por eso publico el post) ya que todo el curro técnico que muchas veces no se valora (porque no se “ve”; optimización de código, test de stress, prueba de configuraciones, caches, actualizaciones, leer, leer, leer…) ahora se ha puesto a prueba y con buenos resultados. Por ejemplo, si esta web tuviera 10 CSS y 10 JS sin comprimir ( Minify JavaScript and CSS), solo con ese detalle, habrían muchos más “request” al servidor, 20 veces más. En los momentos de más tráfico habría superado a los 600 request por segundo.

Espero que la próxima vez que llegue a portada pueda escribir otro post igual de contento ;)


02
Jan 13

Primer proyecto con Python y django

Después de leer varios artículos de @Aaloy sobre django, python y sus virtudes (Toni es un super-mega-fan de django). Me picó la curiosidad, hice un par de pruebas y decidí desarrollar un nuevo proyecto en esta plataforma. Aún quedan unas semanas para que este proyecto salga a la luz, estoy en ello.

Sin experiencia previa en python, algún pequeño script y poco más, nunca desarrollé nada desde cero. Ha sido un poco complicado aprender el framework al mismo tiempo que el lenguaje, aveces hacía algo mal y no sabía si el fallo era por no utilizar bien alguna función de django o a nivel de python. Lo que está claro es que la curva de aprendizaje es baja, en menos de una semana ya estaba escribiendo “en serio”. Con otros lenguajes me tomó más de una semana, supongo que también influye la experiencia, programo en Perl desde hace 10 años y en PHP hace unos 7 años.

A continuación voy a contar lo más destacable de mi experiencia, lo bueno y lo malo. Como es mi primer proyecto esto no es una evaluación global o comparativa.

Lo bueno

Model Layers” o la capa de abstracción a base de datos

Esto sí que es impresionante. Es increíblemente sencillo crear las tablas con sus relaciones, tipos de datos, etc.. Lo mejor es que lo puedes organizar todo de tal manera que no te lías con los campos o los nombres. Cuando se crean las tablas a mano yo casi siempre me equivoco en algo, el nombre de un campo, o me olvido de poner alguna relación. Se arregla fácilmente pero son horas que con django te ahorras.

PyPI

Similar a CPAN del mundo Perl o Pear de PHP. Tiene una cantidad enorme de módulos, muy potentes, bien desarrollados, bien documentados. Y estos módulos no son de django, son de python por lo dispones de código para trabajar en cualquier capa (web, sistema de ficheros, base de datos, sistema operativo…)

Una parte del proyecto comprende un demonio, esto ya no tiene nada que ver con django, es python puro. He utilizado threding y twisted, entre muchos otros, la experiencia ha sido muy positiva.

Documentación de django

Es clara, con ejemplos, bien presentada, separado por versiones, esto último es muy bueno porque puedes ver claramente como adaptar tu código en caso de actualización. Tienen documentada hasta la versión “dev” es decir, que estás bien preparado para la próxima versión. Esto no lo he visto en otros lenguajes, cuando sale la actualización es cuando falla algo y te buscas la vida para arreglarlo.

Decorators

Esto me ha encantado. Evita escribir el mismo código varias veces para validar permisos, o si tienes todos los parámetros que necesitas, etc.. simplemente escribes el “decorator” como un “class” y lo añades en cualquier class o def (función) con un @tuDecorator. Muy práctico.

from django.contrib.auth.decorators import login_required

@login_required(redirect_field_name='my_redirect_field')
def my_view(request):
    ...

Más información http://wiki.python.org/moin/PythonDecorators

Las plantillas de django

Simplemente son geniales. He trabajado con otros sistemas de plantillas de Perl y PHP. Son más engorrosos, pesados, y añadir alguna funcionalidad aveces es muy lioso. Las plantillas de django son limpias, fáciles, rápidas y puedes añadir cualquier funcionalidad con muy pocas líneas.

Leer el código de python es muy fácil

Después de 10 años programando en Perl aveces me encuentro con código que me cuesta entender (da la impresión de que lo escriben para que no se entienda). Con python esto no pasa, es muy fácil de leer, al ser todo objetos se puede poner todo en una línea sin que sea confuso, y la organización de módulos es muy limpia.

Lo malo

Codificación (utf8, ascii, y la madre que los parió)

Con diferencia, este ha sido el asunto que más dolores de cabeza me ha dado. Me costó muchísimo. Tenía que tratar ficheros (externos, aportados por el usuario) que podrían estar en cualquier codificación, iso-8859-1, utf8… y siempre fallaba alguno, probé todo lo que encontraba por google y nada funcionaba al 100%. Implemente “codecs” para abrir, leer y escribir los ficheros, y nada, los problemas continuaban.

Hasta que encontré la explicación. En python el código (lo que escribe el programador) puede estar en una codificación (utf8,..) pero trabaja con otra. Y hay un cambio importante de python 2 a python 3 en este campo. Yo estaba trabajando con python 2.7 que es la que viene en ubuntu por defecto. Al final, después de muchas horas (demasiadas) encontré estas tres líneas y resuelven completamente el problema, trabaja a todos los niveles con utf8 y asunto resuelto. O mejor dicho, puedes controlar con que codificación trabaja.

if sys.version_info < (3, 0):
    reload(sys)
    sys.setdefaultencoding('utf8')

Para tratamiento de texto siempre utilicé Perl y jamás tuve un problema similar, de hecho es muy potente y versátil en este campo.

Instalar y configurar django

No es difícil una vez que sabes lo que hay que hacer. Tuve problemas al tener código por un lado, plantillas por otro, ficheros estáticos por otro. Una vez comprendes que debes poner en settings.py ya es bastante sencillo. Lo pongo como malo porque son muchos pasos solo para ponerlo en marcha. En otros lenguajes y frameworks esto es más rápido.

Documentación de python

La documentación oficial de python no me gusta, casi no hay ejemplos, es solo un “libro de referencias”. Como decía antes, django o php tienen mejor documentación.

Y esto es todo. Cualquier aclaración o corrección será bien recibida :)


27
Jul 12

Cambio de directorio para MySQL y AppArmor

Ayer me llevé una desagradable sorpresa en una actualización de Ubuntu Server, MySQL no arrancaba.

El error que vi en el syslog justo después de actualizar fue este:

apparmor="DENIED" operation="open" parent=1 profile="/usr/sbin/mysqld" name="/srv/mysql/mysql-bin.index" pid=3333 comm="mysqld" requested_mask="rwc" denied_mask="rwc" fsuid=106 ouid=106</pre>
apparmor="DENIED" operation="mknod" parent=1 profile="/usr/sbin/mysqld" name="/srv/mysql/w3.lower-test" pid=3361 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0

Suelo colocar los ficheros (las bases de datos) de MySQL en una carpeta distinta a /var/lib/mysql ya que creo una partición solo para MySQL (así puedo asignar parámetros diferentes para esa partición).

Con este “bloqueo” por parte de AppArmor MySQL no podía arrancar. El problema estaba en que se actualizaron los perfiles para MySQL en AppArmor de una forma más restrictiva, lo cual es bueno porque da mayor seguridad, en caso de ataque no se podrá utilizar MySQL para acceder a otros ficheros del sistema salvo los de la propia base de datos.

Esta directiva está definida en /etc/apparmor.d/usr.sbin.mysqld  pero NO SE DEBE MODIFICAR ESTE FICHERO. Si se modifica, en la próxima actualización el problema volverá.

Cualquier añadido se debe realizar en /etc/apparmor.d/local/usr.sbin.mysqld ya que está pensando para directivas locales y que no se tocarán con las actualizaciones.

En mi caso, he añadido estas directivas para que todo volviera a funcionar:

# File /etc/apparmor.d/local/usr.sbin.mysqld
# For MySQL on custom datadir
/srv/mysql/ r,
/srv/mysql/** rwk,

( El fichero donde se define la carpeta que debe utilizar MySQL está en /etc/mysql/my.cnf con la variable datadir )

Luego reiniciamos AppArmor y arrancamos MySQL.

service apparmor restart
service mysql start