Archivo

Archivo para la Categoría "programación"

“Particionado funcional” económico en Amazon RDS… y cachea todo ¡estúpido!

marzo 17, 2013 6 comentarios

El miércoles pasado di una charla de cómo tenemos Menéame en Amazon AWS. Iba a explicar, al final de la charla, un truco de “particionado” [ver nota al final] económico, pero que no pudo ser: me tocó vivir en directo una saturación de la base de datos, producida por el nombramiento del nuevo Papa. Ahora explico cuál es ese “truco” de “particionado” económico y sencillo que sirve para ahorrar costes en RDS, y luego qué pasó y cómo solucioné la saturación de una de las bases de datos (de allí la frase “cachea todo ¡estúpido!”, el estúpido soy yo ;) ).

La base de datos principal de Menéame está en MySQL sobre Amazon RDS, con Multi AZ, lo que significa que tenemos failback y failover over automático y desantendido si el master falla. Da mucha comodidad, pero también tiene su coste: se paga el doble (el tamaño que tenemos es el large).

Leer más…

Un par de bellezas de algoritmos distribuidos que deberías implementar tú mismo

marzo 16, 2013 2 comentarios

Antes de irme a acostar pensé: “En vez de escribir quejas o de temas políticos-sociales, ¿qué tweet puedo dejar sobre temas de programación que entusiasme y sirva de algo a un programador”. Lo hice, pero luego pensé, son tweets a las 2:30 de la madrugada, los leerán sólo un par de insomnes frikis que no salen de marcha un viernes. Así que mejor lo dejo en mi blog (no pondré ningún enlace, todo está en Internet y es fácil encontrarlo con los nombres).

Este año me tocó dar Programación Concurrente y Distribuida, por lo que tuve que dedicar tiempo no sólo a aprender los algoritmos, sino a estudiarlos en profundidad para poder explicarlos, responder a todas las preguntas posibles, y además diseñar las prácticas en laboratorio. Así, de tanto estudiarlos llegó un momento que dije ¡hostia, que guapo y simple es!. Me pasó con el algoritmo de Chandy-Lamport para “snapshots” de sistemas distribuidos.

El estado de un sistema distribuido en un momento dado es imposible de obtener, ni tiene sentido. Pero sí que tiene encontrar un “estado consistente”. Este estado se refiere a qué mensajes se enviaron desde cada nodo (u ordenador), y qué mensajes estaban en tránsito en cada arista (o canal de comunicación). Es lo que hace el algoritmo de Chandy-Lamport. Si estás flojo en algoritmos distribuidos, o no recuerdas, o piensas que es muy complicado, te recomiendo que lo implementes. Es una “belleza”, en muchos sentidos. Pero mejor que lo saborees tú mismo ;)

Alerta

Implementar y probar algoritmos distribuidos en un único ordenador suele ser un coñazo. Hay muchos sistemas, pero hay que aprenderlos. Yo encontré que lo mejor es un sistema de paso de mensajes distribuidos, pero usándolo desde un único ordenador. Creo que no hay sistema de mensajes más simple, y con librerías para casi todos los lenguajes, que el Beanstalkd. Te lo recomiendo. De paso aprendes los conceptos básicos de estos sistemas, si es que no lo sabes. Recomendación: que cada nodo tenga un canal (o tubería en terminología beanstalkd) para recibir mensajes hacia él, es lo más simple, y simula perfectamente un sistema distribuido (cada nodo puede ser un proceso, o un hilo, tanto monta, siempre que las variables de los algoritmos no sean compartidas).

Quizás es recomendable implementar antes el algoritmo de “terminación distribuida” de Dijkstra-Scholten. Se usa la misma estructura de procesos y colas de mensajes, es más sencillo de entender (creo), y también es un algoritmo guapo.

Si implementas esto, y los entiendes, será como andar en bicicleta, no te olvidarás más. Y te gustará más la informática ;)

Categorías:píldoras, pijadas, programación Etiquetas:

Firefox OS, y expresiones de deseos más que realidades

enero 25, 2013 15 comentarios

Antonio Ortiz publicó en Xataka una entrevista a Carlos Domingo, CEO de Telefónica I+D. Por referencias, Carlos parece un ben profesional, pero critiqué en Twitter el lenguaje tan corporativo y vacío, en el sentido que se repite frases típicas, y no desvela nada interesante. A raíz de esos comentarios, tuve varias respuestas, repitiendo otra vez frases vacías y wishful thinking sobre lo que es Firefox OS, y su “innovación” en el mercado de móviles.

En primer lugar debo decir que me gusta mucho la creación de Firefox OS, por varios motivos.

Leer más…

Cálculo comparativo de la diversidad de votos mediante densidad de grafos

noviembre 4, 2012 27 comentarios

En Menéame teníamos desde 2008 un control de diversidad de votos. Éste se basaba en el control de los votos de los usuarios al autor de un envío, se tomaba en cuenta el porcentaje de noticias votadas al mismo usuario. Aunque cumplió con su papel, claramente era insuficiente. Las críticas de que un grupo de personas podían conseguir una “ventaja” de lo que salía en portada tenían algo de razón. El control existente no hacía un control más global, es decir, grupos de personas con un mismo patrón de votos, por lo que intencionadamente o no, si hay un centenar de personas muy activas y afines entre ellas, éstas consiguen que sus noticias se publiquen con mayor facilidad.

Llevaba años pensando en una solución al problema. Los algoritmos y técnicas usadas son en general basadas en “corpus completo”, se construye un grafo o sus correspondientes matrices con la información completa que se quiere analizar. Para ello se pueden usar algoritmos de clustering, centralidad y/o afinidad para obtener información del grado de “diversidad de votos” en cada noticia.

Leer más…

NoSQL no es la solución mágica [vídeo]

agosto 6, 2012 10 comentarios

Cada vez que comento de alguna optimización el SQL de la base de datos de Menéame, en el blog o en un tweet, surgen comentarios y tweets del tipo “Cambia a NoSQL”, o “Esa estructura es especial para NoSQL”. Están muy equivocados, no es una solución óptima pra todo, ni los NoSQL están optimizados para consultas a datos estructurados. Como me da pereza escribir un apunte largo para explicarlo (que se exige más cuidado y precisión que “hablar”), grabé un vídeo (en baja calidad, para no tardar tanto subiendo, pero lo importante es la voz, no el feo que sale en pantalla).

Nota 1: En el medio de la grabación se me ocurrió poner a Instagram como ejemplo de algo que puede hacerse con bases de datos relacionales. Aunque fallé por muy poco -”se puede implementar con MySQL-, luego lo busqué y usaron PostgreSQL (con Django, la misma combinación que usamos para SpokenPic).

Nota 2:  En Menéame siempre usamos MySQL con replicación master-slave. Ahora estamos usando RDS Multi-AZ (con MySQL), lo que implica que tenemos también master-master con failover automático.

Categorías:desarrollo, programación Etiquetas: , ,

«No intentes hacer lo que no dominas»

Hoy me decidí a hacer algo que deberia haber hecho hace años, leer y aprender de diseño gráfico. No es porque me quiera dedicar a eso, o porque piense que puedo hacer cosas maravillosas, sino porque llevo muchos años trabajando codo a codo con diseñadores, con frustración de no poder resolver poblemas básicos, de tomar malas decisiones, de ni siquiera saber comunicar los problemas, o proponer soluciones.

Leer más…

Consejos para usuarios de programas webs

Es muy habitual que cuando un servicio introduce modificaciones en sus programas o diseño, enseguida los usuarios critican duramente hasta los aspectos más superficiales: el color es malo, el espacio no es el adecuado, no se debería haber cambiado de lugar ese botón, debería haberse usado otro icono, ese enlace debería estar arriba y no abajo, la información se debería mostrar como estaba antes, etc.

Este tipo de críticas es proporcional a la popularidad del servicio o sitio. Pero voy a explicar algnas cosas. Aunque existen numerosos casos de decisiones muy estúpidas (prefiero no dar ejemplos, algunos son amigos… o yo mismo ;) ), la mayoría de las empresas más populares tienen programadores y arquitectos de software muy buenos, no son idiotas. O al menos, no todos, la media no es más estúpida de la media de los que escriben en blogs y Twitter. Lo que pasa es que en el desarrollo web se suelen aplicar unas pocas reglas que no suelen ser conocidas por los no programadores:

Leer más…

Categorías:desarrollo, programación Etiquetas:

Android, iOS, tiempos de respuestas y por qué nada es gratis en sistemas informáticos

diciembre 7, 2011 89 comentarios

Hace unas pocas horas escribí esta respuesta sobre Por qué iOS es más fluido que Android (con buen criterio, eliminaron la entrada). Obviamente, por cuestiones de longitud y la “respuesta rápida” que requiere un comentario, no me quedó todo lo completo que requiere el tema. Lo que me gustaría explicar daría para muchas horas de charlas. De hecho, enseño estos temas en mi asignatura de Sistemas Operativos (II), dedico al menos unas 12 hs de clase, y aún así no entramos en muchos detalles importantes. Pero intentaré resumirlo en este apunte, fundamentalmente para que se entiendan los problemas de arquitectura, y de cómo toda decisión que se tome en una arquitectura, lenguaje o programa tiene implicaciones positivas y negativas, siempre.

Leer más…

Almacenar y leer de base de datos propiedades arbitrarias de objetos de forma transparente

noviembre 1, 2011 8 comentarios

Voy a comentar un truco muy sencillo, pero que no recuerdo haberlo visto implementado (si no lo provee ya el framework que se use), a pesar de lo que simplifica la programación a la hora de almacenar en base de datos relacionales propiedades arbitrarias de un objeto. El siguiente es parte del código de profile.php de Menéame que almacena la “bio” de un usuario.

if(!empty($_POST['bio']) || $user->bio) {
	...
	if ($bio != $user->bio) $user->bio = $bio;
}

Este otro de libs/user.php, y almacena en la base de datos las actualizaciones del karma de un usuario (y su hora de modificación).

if (! empty($log) && mb_strlen($log) > 5) {
	$this->karma_log .= "$log: $inc, " . _('nuevo karma') . ": $this->karma\n";
	$this->karma_calculated = time();
}

Nota: “.=” es una concatenación, implica dos operaciones, “get” y luego “set”.

Las propiedades bio, karma_log y karma_calculated se almacenan en la base de datos, pero no están en la base de datos de usuarios como las demás. Como no son parte del fastpath (no se consultan ni visualizan en las páginas más vistas) estos datos se almacenan por separado, en la tabla genérica annotations.

Sin embargo, a la hora de acceder o almacenar esos datos, no tenemos que preocuparnos de leer e insertar en la base de datos, se hace de forma “automática”. Explico cómo hacerlo, es un buen patrón cuando se requieran almacenar y acceder a propiedades arbitrarias de un objeto. Además sirve para cualquier lenguaje orientado a objetos.

Leer más…

Categorías:menéame, programación Etiquetas: , ,

Optimizando obsesivamente las consultas al MySQL

febrero 2, 2011 54 comentarios

Para ir al grano y que no perdáis el tiempo los que no estéis interesados en esta frikada de optimización de consultas a base de datos [MySQL]: el código siguiente es el código SQL que selecciona y obtiene los datos de los enlaces que aparece en la portada del Menéame.

SELECT link_id AS id, link_author AS author, link_blog AS blog, /* muchas columnas adicionales del objeto */
	FROM links
	INNER JOIN users ON (user_id = link_author)
	LEFT JOIN (categories AS cat, categories AS meta) ON (cat.category_id = links.link_category AND meta.category_id = cat.category_parent)
	LEFT JOIN votes ON (link_date > @enabled_votes AND vote_type='links' AND vote_link_id = links.link_id AND vote_user_id = @user_id AND ( @user_id > 0  OR vote_ip_int = @ip_int ) )
	LEFT JOIN favorites ON (@user_id > 0 AND favorite_user_id =  @user_id and favorite_type = 'link' AND favorite_link_id = links.link_id)
	LEFT JOIN link_clicks AS clicks ON (clicks.id = links.link_id)
	INNER JOIN (SELECT link_id FROM links $from WHERE $where $order_by LIMIT $offset,$page_size) AS id USING (link_id)

Nota: Las variables que comienzan con $, como $from o $where son variables asignadas desde el PHP para definir las condiciones (publicadas o pendientes, ordenadas por fecha o por karma, etc). Las que comienzan con @, como @user_id o @ip_int, son variables de sesión del MySQL.

Leer más…

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 428 seguidores