Archives for the month of: April, 2014

El fenómeno del microblogging está en pleno auge y es una manera muy interesante de llegar a mucha gente. Muchas de las cuentas activas de Twitter no generan movimiento, algunos ni si quiera han publicado algún Tweet. Es algo que no debería ser así, sobretodo si hablamos de profesionales. Debemos considerar Twitter como una herramienta […]

The post ¿Por qué utilizar Twitter? appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1pJ1ttK

El pasado mes de marzo, entre los días 26 y 28, tuvieron lugar las VIII Jornadas de SIG libre, organizadas por el Servicio de Información Geográfica y Teledetección (SIGTE) de la Universitat de Girona. Entre los patrocinadores, se encontraba la Universitat Oberta de Catalunya, en el contexto del postgrado de Sistemas de Información Geográfica y Geotelemática y del máster de Software Libre.

 Plano de Gerunda. Coordenadas: 41° 59′ 14.36″ N, 2° 49′ 32.25″ E

Plano de Gerunda. Coordenadas: 41° 59′ 14.36″ N, 2° 49′ 32.25″ E (Licencia GNU Free Documentation License, Version 1.2)

Si el tiempo lo permite, haremos una serie de entradas sobre las ponencias realizadas en las jornadas, pero quizás en esta primera sería conveniente destacar las jornadas en sí, que, a mi entender, son un ejemplo de cómo organizar un evento que se ha convertido en uno de los referentes de los sistemas de información geográfica (SIG) en España y, me atrevería a decir, en Hispanoamérica.

¿Qué hace que estas Jornadas hayan triunfado de esta manera?

  1. El SIGTE: son siempre quienes organizan las jornadas y siempre en el mismo emplazamiento. El SIGTE es referente en el sector y sus integrantes son personas conocidas y reconocidas. Con su buen hacer consiguen que todos y cada uno de los que participamos en las jornadas nos sintamos como en casa. Quizás esto parecería una tontería, pero de esta forma se consigue que todo el mundo pueda expresarse en un clima de confianza.
  2. El formato: un primer día de talleres, que son opcionales, y un día y medio de jornadas. Las jornadas empiezan con 4 sesiones plenarias y terminan con otra sesión plenaria. Los talleres permiten conocer y profundizar en las nuevas tecnologías: así, en un día, parece que uno ya se ha enterado de qué se ha cocido ese año. Al día siguiente, las sesiones plenarias acaban de poner a todo el mundo en contexto. En las plenarias, en general, los ponentes son personas de ámbitos distintos que tratan temáticas de amplio espectro que, de una manera u otra pueden tener importancia para el SIG libre. Así, encontramos desde el tratamiento de los datos que se envían desde el satélite GAIA, hasta los retos que afronta el Open Data, pasando por el diseño de un receptor GPS que traslada el procesamiento desde el hardware al software (paciencia, algo hablaremos de ello en futuras entradas). En el resto de las jornadas son los participantes los que presentan sus trabajos (si han sido aceptados). Además, se aprovecha para realizar mesas redondas, reuniones de asociaciones (como OsGEO o ACTIG), y muchas otras actividades.
  3. Los asistentes:  este año éramos unos 160, distribuidos a partes más o menos iguales entre universidad, empresa privada y administración pública. En estas jornadas la transferencia de tecnología es algo natural que se hace a la hora del café (bueno, de uno de los cafés, porque todos sabemos que en las jornadas se toma mucho café). ¿Cuántos congresos no querrían una mezcla así de tres sectores?
  4. El objetivo: el objetivo está claro, SIG libre, pero entendido en sentido amplio. Y lo más importante, a las jornadas se va a trabajar. Los talleres van de las 9 de la mañana a las 7 de la tarde y este año la mesa redonda de las jornadas acabó pasadas las 8 de la noche. Después hay eventos lúdicos, pero por la noche. Recuerdo algunos congresos de 3 días en los que después de 2 ó 3 horas de sesiones se hacían excursiones de 5 ó 6 horas: ¡a un congreso se va a trabajar, no a holgar!
  5. El precio: al ser unas jornadas orientadas a trabajar (y no a holgar) y en las que no se pretende hacer negocio, el precio está perfectamente ajustado y, si se toca algo para ajustar precios, siempre es de la parte accesoria y no del “core“.
  6. Y por descontado, la profesionalidad. El personal del SIGTE es capaz de crear el clima de confianza que se comentaba en el punto 1), pero lo hacen, sobre todo, a través de su profesionalidad. Las jornadas funcionan como un reloj bien engrasado y todos los que participamos allí queremos contribuir a que sean un éxito. Son un evento de todos y para todos.

Así pues, las Jornadas de SIG libre son un objeto destacable en sí mismo, y por eso les he querido dedicar una entrada exclusivamente a ellas. Creo que son un ejemplo a imitar.

Antoni Pérez Navarro es profesor de los Estudios de Informática, Multimedia y Telecomunicación de la UOC, responsable de la asignatura de Física I del GTT, coordinador de postgrado y director académico del Posgrado en sistemas de información geográfica de la UOC.

via iNFoRMáTiCa++ http://ift.tt/1iuK0QU

¿Cuándo comenzó este bonito fenómeno de las cadenas de favores? No lo recuerdo, pero sí sé que cada vez son más las personas que se unen a este tipo de cadenas, incluso asociaciones que funcionan con esa filosofía. Vamos a ver el por qué de estas iniciativas en Facebook y cómo funcionan. Eso de tener detalles con […]

The post Las cadenas de favores en Facebook appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1j6BjvT

Ver un programa de televisión, una serie o cualquier película no es como antes. A día de hoy Twitter se ha convertido en el compañero de sofá para ver la tele, con quien podemos comentar con el resto del mundo todo lo que estás viendo, lo que te parece, tus ideas y las críticas que […]

The post El poder de la televisión en Twitter appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1nLUETu

En una entrada anterior comenté que las bibliotecas criptográficas, si bien están diseñadas para ocultar mediante abstracción su funcionamiento interno, a veces nos pueden acarrear sorpresas si no sabemos exactamente qué está pasando en su interior. Algo de lo más normal, ya que precisamente intentan ocultar todo. Pero diseñar una caja negra es algo que debe hacerse muy bien, ya que se tiene que evitar que su comportamiento tenga elementos inesperados o sin sentido para el observador externo. En caso contrario, la abstracción “gotea”.

Si se me permite explicar una batallita más, otro aspecto un tanto misterioso con el que me he encontrado trabajando también en el desarrollo de aplicaciones criptográficas en Java basadas en cifrado de clave pública está en la generación de certificados digitales. Los certificados digitales están muy bien explicados con detalle en otros recursos, por lo que no me alargaré, pero si quisiera definirlos en una sola frase, diría que es la manera de asociar una identidad a una clave pública, conceptualmente, de manera similar a como un DNI asocia una foto a un nombre.

Dado que el uso de certificados es el sistema estándar para interoperar entre bibliotecas y aplicaciones que necesitan intercambiar claves públicas, poder generar certificados es muy útil. Si buscamos atentamente entre la multitud de clases criptográficas que ofrece Java, podremos encontrar clases asociadas a certificados. Por ejemplo “X509Certificate”, que representa certificados según el estándar X.509, es el más usado (utilizado para conexiones seguras en un navegador). Sin embargo, nuestro gozo en un pozo. Si bien es posible cargar certificados ya existentes desde fichero o un almacén criptográfico seguro (keystore), por más que uno busque por la API, no habrá manera de encontrar cómo generar uno desde cero, a partir de una clave pública generada en nuestro propio código. ¡Mala suerte! Parece que si se desea crear un certificado, es necesario usar bibliotecas externas, como BouncyCastle, una muy popular. Durante un tiempo acepté este hecho como algo inevitable.

Un certificado digital para nuestro blog

Sin embargo, la caja negra posee una pequeña rendija por donde gotean algunos detalles. Esta rendija se encuentra en la relación que existe entre las classes Java y una herramienta llamada keytool.

Esta herramienta es un pequeño programa auxiliar distribuido entre los binarios del entorno de desarrollo de Java que sirve para gestionar claves criptográficas. Así pues, una funcionalidad muy útil de keytool es la de poder generar fácilmente pares de claves para algoritmos de clave pública. Siempre que keytool genera un par de claves, automáticamente guarda la clave pública dentro un certificado digital autofirmado. Si bien un certificado autofirmado, generado por uno mismo y no por una autoridad de confianza, no sería el que se emplearía en un entorno real (seria como un DNI impreso por nosotros mismos) éste es más que suficiente para poder hacer algunas pruebas en nuestros programas. Solo debemos hacer lo siguiente:

keytool -genkey -alias miAlias -keyalg RSA -keystore almacenClaves.jks -keysize 2048

¡Y voilà! Ya tenemos una nuevas claves y su certificado almacenados de manera segura en el fichero “almacenClaves.jks”.

Una particularidad especial de keytool es que, aún tratándose de un binario en código nativo, todas sus funciones dependen de ejecutar bytecode de métodos de las clases Java definidas en sus bibliotecas criptográficas, mediante JNI. Por lo tanto, en cierto modo, sirve tanto como herramienta auxiliar de gestión de claves, como de pequeña demostración de las capacidades criptográficas del lenguaje. El binario por sí solo es incapaz de hacer nada. Si se ejecutara sin el entorno Java, se “quejaría” de que no encuentra clases (i.e. ClassNotFoundException). En ese sentido, su rol se asemeja un poco al de otra “navaja suiza criptográfica”, OpenSSL, pero más limitado en sus funcionalidades y ligado exclusivamente al entorno Java.

Sin embargo, al conocer esta particularidad aparece el gran misterio. Keytool es capaz de generar certificados digitales desde cero, pero sin embargo, se basa exclusivamente en la invocación de las bibliotecas criptográficas de Java en su entorno de desarrollo por defecto. Y esta API no ofrece ningún mecanismo a primera vista. Entonces ¿cómo lo hace?

Si bien me costó un poco descubrirlo, el caso es que Java dispone de un conjunto de APIs ocultas, que permiten llevar a cabo operaciones no documentadas. Si buscamos la carpeta con los ficheros “.jar” que contienen las bibliotecas básicas del runtime Java, concretamente  el fichero “rt.jar”, veremos que hay muchas más clases que las que aparecen en la API. Concretamente, entre ellas podemos encontrar la clase “sun.security.x509.X509CertImpl”, que es la implementación interna usada para generar certificados digitales. Igualmente, encontramos muchas otras auxiliares que le dan soporte.

Vaya, vaya…

A quién se le ocurre ocultar funcionalidades tan importantes… Sin saber como funciona internamente keytool, jamás se me hubiera ocurrido mirar y hubiera dado por hecho que Java no permite generar certificados por sí mismo. Eso sí, el uso de una API oculta es un “hack” en toda regla, y un tanto arriesgado, ya que los desarrolladores no garantizan su continuidad entre versiones. Pero mientras exista una keytool con las mismas funcionalidades actuales, habrá algún método para generar certificados, oculto entre las clases de Java. A fin de cuentas, si ni siquiera Oracle respeta su propia ocultación de datos, no voy a ser yo el que deje de ahorrarse el uso de bibliotecas externas para aplicaciones simples.

Y, por si a alguien le fuese útil, aquí os dejo un código de ejemplo para generar un certificado con estas clases ocultas.

import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Date;
import sun.security.x509.*;

public class CertIssuer {

//Medida de las claves
public static final int KEY_LEN = 2048;

//Fecha de expiración
private static final int EXPIRATION = 365;

//Algoritmo de firma a usar
private static final String ALGORITHM = "SHA1withRSA";

/** Genera un certificado autofirmado
*
* @param subName Nombre del propietario.
* @param pubKey Clave pública del propietario.
* @param issName Nombre del emisor..
* @param issKey Clave privada del emisor, para firmar el certificado.
* @return Certificado X.509.
* @throws Exception Error.
*/
public X509Certificate generateCertificate(String subName, PublicKey pubKey, String issName, PrivateKey issKey) throws Exception {

//Todo certificado tiene un número de serie único
BigInteger sn = new BigInteger(64, new SecureRandom());

//Calcular fecha de expiración
Date from = new Date();
Date to = new Date(from.getTime() + EXPIRATION * 86400000l);
CertificateValidity interval = new CertificateValidity(from, to);

//Se generan las identidades de propietario y emisor
X500Name owner = new X500Name(subName);
X500Name issuer = new X500Name(issName);

//Se genera la información del certificado
X509CertInfo info = new X509CertInfo();
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(sn));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(owner));
info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuer));
info.set(X509CertInfo.KEY, new CertificateX509Key(pubKey));
info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
AlgorithmId algo = new AlgorithmId(AlgorithmId.sha1WithRSAEncryption_oid);
info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(algo));

//Se firma el certificado
X509CertImpl cert = new X509CertImpl(info);
cert.sign(issKey, ALGORITHM);

//Se actualiza el campo del algoritmo y se vuelve a firmar
algo = (AlgorithmId)cert.get(X509CertImpl.SIG_ALG);
info.set(CertificateAlgorithmId.NAME + "." + CertificateAlgorithmId.ALGORITHM, algo);
cert = new X509CertImpl(info);
cert.sign(issKey, ALGORITHM);
return cert;
}

/** Se genera un certificado autofirmado a partir de un par de claves al azar.
*/
public static void main (String[] args) throws Exception {

CertIssuer certIssue = new CertIssuer();

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(KEY_LEN);
KeyPair kPair = keyGen.genKeyPair();

String subject = "CN=Blog Informatica,O=UOC,OU=EIMT,L=BCN,ST=Cataluña,C=ES";
X509Certificate cert = certIssue.generateCertificate(subject, kPair.getPublic(), subject, kPair.getPrivate());

FileOutputStream certFile = new FileOutputStream("certificado.crt");
certFile.write(cert.getEncoded());
certFile.close();
}
}

Joan Arnedo Moreno es profesor de los Estudios de Informática, Multimedia y Telecomunicaciones en la UOC. Coordinador de las asignaturas de la rama de seguridad y director académico del postgrado de Cisco Networking Technologies, también cuenta con más de 30 años de experiencia jugando a videojuegos.

via iNFoRMáTiCa++ http://ift.tt/1hnBTF6

Delantal, cuchillos, sartenes… ¡LISTOS! Ha nacido Foodinterest, la red social de la cocina, de los amantes de la gastronomía, de los que disfrutan cocinando, aprendiendo a cocinar y enseñando las artes de los fogones. Los que saben lo que quieren y los que adoran el contacto con gente que comparta sus aficiones. Será el punto […]

The post Foodinterest, la red social de la cocina appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1ihodXT

La interfaz de Facebook cambió, a mi parecer no nos han dado nada mejor. Twitter también ha decidido dar una vuelta de hoja a sus perfiles. No a la interfaz completa, solo a la página de perfil personal con la intención de que al usuario le sea más fácil mostrarse a sí mismo. ¡Me encanta! […]

The post El nuevo perfil de Twitter, más tú appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1jKj9hi

Acabo de hacer una búsqueda en google de la pregunta “¿me puedes dar un ejemplo?” y me han salido más de 64 millones de resultados. La gente pide ejemplos de cartas de presentación, de canciones medievales, de técnicas de adiestramiento de perros, o de qué ropa ponerse para ir a una entrevista de trabajo. El caso es que cuando queremos entender algo o aprender algo, un buen ejemplo nos ayuda. Y digo un buen ejemplo, porque un mal ejemplo, tomado como bueno, puede llegar a darnos serios problemas.

De la misma forma que las personas aprendemos de los ejemplos, las máquinas también lo hacen. Y para que una máquina aprenda bien un determinado concepto necesita que le demos buenos ejemplos. Pero, ¿qué es un buen ejemplo? ¿Todos los ejemplos pueden explicar o ilustrar correctamente un concepto? La respuesta es no. Para explicar un concepto a una máquina deberemos elegir ejemplos que le resulten claros para que entienda bien lo que queremos que aprenda. La dificultad está en que no siempre es obvio cómo encontrar buenos ejemplos y muchas veces un ejemplo puede inducir a una confusión inesperada (véase Fig 1).

Figura 1. Confusión

Dentro del contexto de la visión por computador tenemos evidencias claras de que algunos ejemplos son bastante mejores que otros. Y entender bien si un ejemplo es bueno o no es importante, porque cada vez habrá más máquinas a nuestro alcance capaces de aprender, y cuando necesitemos que aprendan algo tendremos que saber cómo enseñarlas.

De hecho hoy en día ya es posible enseñarle a nuestro iPhone a ver objetos. Podemos hacerlo con la aplicación gratuita DetectMe, diseñada y desarrollada en el Massachusetts Institute of Technology. Con esta aplicación nuestro móvil puede aprender a detectar un objeto cualquiera después de haber visto algunas imágenes de este objeto. Y una de las cosas que hemos observado es que algunos usuarios son mucho más hábiles que otros a la hora de enseñarle a ver.

Para poder estudiar las dificultades que tiene el público al usar este tipo de aplicaciones se han creado, dentro de DetectMe, algunas competiciones para entrenar* objetos concretos (tazas, sillas, mesas…). En estas competiciones cada usuario puede entrenar un detector tomando fotos que se usan como ejemplos para el sistema. Luego los detectores se testean con una base de datos fijada y el test da a cada detector una puntuación que depende de lo preciso que es. Si la puntuación es alta esto quiere decir que el detector es bueno.

Figura 2. Tabla de puntuaciones de la competición de tazas

En la Fig. 2 podemos ver la tabla de puntuaciones de la competición de tazas, así cómo los ejemplos que se han usado para entrenar el mejor detector y el detector que está en la posición 9. Fijaros que el mejor detector ha sido entrenado con un solo ejemplo mientras que el noveno se ha entrenado con 11 imágenes. El sistema de aprendizaje que hay detrás es exactamente el mismo, pero parece obvio que la satisfacción del usuario que obtiene 729 puntos va a ser muy diferente que el que obtiene sólo 23. El primero ha conseguido entrenar un detector de tazas que va a ver tazas con una fiabilidad aceptable, pero el segundo os aseguro que se debe sentir bastante frustrado, porque su detector no va a ver nada y además se ha tomado la molestia de hacer 11 fotos de tazas.

La gente usa DetectMe para entrenar una gran variedad de objetos (gafas, camisetas, plátanos, cepillos de dientes, bicicletas) y este tipo de comportamiento en las puntuaciones lo observamos para cualquier categoría. Y a veces los mejores detectores están entrenados con muchas menos imágenes que los peores. Esto es especialmente sorprendente porque, en general, lo mejor para entrenar sistemas de aprendizaje artificial es usar la mayor cantidad de datos posibles. Sin embargo, estamos viendo que también es esencial que los ejemplos sean buenos representantes del concepto a aprender. Y no es evidente saber cómo se tienen que tomar las fotos para que los ejemplos resultantes sean claros para una máquina, así que caracterizar qué es un buen ejemplo es un problema importante.

Entre las cosas que hemos estado estudiando hemos desarrollado un sistema que permite visualizar la información que aporta un ejemplo. Para ello usamos un cierto conocimiento adicional: sabemos qué tipo de características extrae el sistema de la imagen y también qué algoritmo de aprendizaje usa la máquina. En pocas palabras, la idea detrás de estas visualizaciones es crear una especie de caricatura de cada ejemplo que muestre que es lo que más destaca en él y lo que lo hace más diferente al resto de imágenes del mundo. Esto nos permite entender que es lo que ve la maquina y que es lo que le puede crear confusión.

Figura 3. Visualizaciones del detector de bicicletas

En la Fig. 3 podéis ver algunas visualizaciones para el caso de un detector de bicicletas. En los ejemplos buenos (arriba) la información visual más relevante de la imagen parece ir asociada con el objeto que queremos que aprenda a detectar. La prueba es que seguimos identificando claramente la bicicleta en las imágenes filtradas (a la derecha). En el caso de los ejemplos “malos del todo” (a bajo) ya parecía más intuitivo que esto no iba a ir bien, porque el objeto en la imagen original está cortado y medio oculto. Y nuestras visualizaciones confirman que la información que hay en estas imágenes no va muy asociada al concepto de bicicleta, ya que después de filtrar las imágenes es difícil reconocer el objeto. Sin embargo, lo que pasa en el caso de los ejemplos “un poco malos” es menos intuitivo. Las visualizaciones de estos ejemplos nos evidencian que la información relevante de la imagen no va asociada al objeto sino a otros contornos de la imagen. Esto quiere decir que el ejemplo está dando información confusa al sistema.

Y volviendo a la Fig. 1, ¿nos permite esta visualización entender qué está pasando? Podéis ver el resultado en la Fig. 4.

Figura 4. Visualización de la confusión

Nuestro objetivo, al final, es tener un sistema que permita saber automáticamente si un ejemplo es bueno o no. Y con ello podremos orientar al público en general a poder usar satisfactoriamente este tipo de herramientas sin la necesidad de tener una base técnica en visión por computador. En el futuro nos gustaría extender esta idea a otros ámbitos que no sean necesariamente imágenes. Nuestro sistema se podría usar para analizar textos y ver, por ejemplo, qué palabras son las que están dando la información relevante en un párrafo. En educación esto podría servir para analizar si se está describiendo bien un determinado concepto o si una definición es clara o no. De esta forma usaríamos técnicas de aprendizaje artificial para encontrar pautas que permitan mejorar nuestras propias metodologías de enseñanza y aprendizaje.

entrenar* : es el término que se usa en aprendizaje artificial para la acción de enseñar a una máquina a hacer algo.

REFERENCIA

Agata Lapedriza, Hamed Pirsiavash, Zoya Bylinskii, Antonio Torralba. Are all training examples equally valuable? (http://ift.tt/1bmnOWw)

Àgata Lapedriza es licenciada en matemáticas por la Universitat de Barcelona y doctora en informática por la Universitat Autònoma de Barcelona. Es profesora e investgadora de la Universitat Oberta de Catalunya (UOC), en los Estudios de Informática, Multimedia y Telecomunicación. También es investigadora en el Massachusetts Institute of Technology. En la UOC coordina asignaturas de matemáticas y estadística, y dirige tesis de doctorado y proyectos de grado y máster en el ámbito de la inteligencia artificial. Su actividad de investigación se centra en temas de visión por computador y aprendizaje computacional.

Antonio Torralba es licenciado en Telecomunicaciones por la Universitat Politècnica de Catalunya (UPC) y doctor en informática en tratamiento del señal, la imagen y procesamiento del habla por el Institut National Polytechnique de Grenoble (Francia). Es profesor e investigador del departamento Computer Science and Artificial Intelligence Laboratory (CSAIL), en el Massachusetts Institute of Technology (MIT). Es editor de las revistas IEEE Trans. on Pattern Analysis and Machine Intelligence e International Journal in Computer Vision. Ha recibido los premios National Science Foundation (NSF) Career award (2008), best student paper award at the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (2009), i J. K. Aggarwal Prize from the International Association for Pattern Recognition (IAPR) (2010).

via iNFoRMáTiCa++ http://ift.tt/1fj714q

Esta noticia estaba tardando en llegar. Facebook es una plataforma muy potente como para no tener una herramienta de publicidad similar a AdWords, y es que si nos paramos a pensar, gran parte de nuestras horas diarias las pasamos en Facebook, al menos gran parte de las horas que estamos delante del ordenador o el […]

The post ¿AdWords en Facebook? appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/PpuYQr

No dejéis viajar vuestras mentes sucias tan pronto, amigos. Esta vez va en serio. Restuento es la red social de restauración, y oye, empezaba a ser necesaria, ¿no creéis? Tenemos redes sociales para todo, durante estos meses hemos visto especialmente muchas muy curiosas. También tenemos restaurantes para todo, pero ¿cuál es el mejor en cada […]

The post Restuento, una red social para comer bien appeared first on Redes Sociales.

via Redes Sociales http://ift.tt/1eTAZRD