¡Recomienda este blog!

lunes, 11 de abril de 2011

Código Fuente Cliente-Servidor: Ahorcado remoto.

Código fuente del Servidor:

/*************************************************************************
*
* Servidor del juego Ahorcado en TCP.
* Asignatura: Redes II.
* Autores:
* Gabriel Cebrián Márquez.
* Estefanía Coronado Calero.
* Iván Durango Blanco.
*
************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

#include 
/*extern int errno;*/

#include "error.h"
#include "socket_utils.h"

#define _USE_BSD
#define QLEN     32 /* Longitud máxima de la cola de conexiones */
#define BUFSIZE   4096
#define MAXDICT     32 /* Máximo tamaño de la palabra del ahorcado */
#define MAXLINEA MAXDICT + 10
#define NUM_PALABRAS     15

void reaper(int);
int escogeAleatorio();
int ahorcadoSrv(int desc);

/*************************************************************************
*
* main - Servidor concurrente para el servicio del ahorcado remoto.
*
*************************************************************************/

int main(int argc, char *argv[])
{
char *service = "8041"; /* Nombre del servicio o número de puerto */
struct sockaddr_in fsin; /* Dirección del cliente   */
unsigned int alen;  /* Tamaño de la dirección del cliente  */
int msock;   /* Socket del servidor maestro   */
int ssock;   /* Socket del servidor esclavo   */

switch (argc)
{
case 1:
break;
default:
errexit("Uso del programa: Ahorcado_servidor\n");
}

/* Se crea un socket pasivo */
msock = passiveTCP(service, QLEN);
(void) signal(SIGCHLD, reaper);

while (1)
{
alen = sizeof(fsin);

/* Cambiamos el identificador del socket */
ssock = accept(msock, (struct sockaddr *)&fsin, &alen);

if (ssock < 0)
{
if (errno == EINTR)
continue;
errexit("Error ACCEPT: %s\n", strerror(errno));
}

switch (fork())
{
case 0:  /* Hijo */
(void) close(msock);
exit(ahorcadoSrv(ssock));
default: /* Padre */
(void) close(ssock);
break;
case -1:
errexit("Error FORK: %s\n", strerror(errno));
}
}
}

/*************************************************************************
*
* ahorcadoSrv - Función que gestiona el juego en el servidor.
* 
*************************************************************************/

int ahorcadoSrv(int desc)
{
/* Diccionario de palabras para el juego */
char diccionario[NUM_PALABRAS][MAXDICT] = { 
"CARACOL",
"MOTOCICLETA",
"HORMIGA",
"GUACAMAYO",
"HECHICERO",
"JUGUETE",
"LICENCIA",
"INSECTICIDA",
"JINETE",
"LADRILLO",
"LEVADIZO",
"JEROGLIFICO",
"LEVITACION",
"IMPACIENCIA",
"IMPERMEABILIDAD"};

char auxiliar[MAXLINEA];
char solucion[MAXLINEA] = "Correcta: "; /* Array auxiliar para mostrar la palabra correcta al final. */
char ahorcado[] = "AHORCADO"; /* Array auxiliar para mostrar ahorcado*/
char buffer[BUFSIZ];
char solucionSrv[MAXDICT + 26] = "La palabra a adivinar es: "; /* Solución que se mostrará en el servidor. */

int cc;
int aleatorio = escogeAleatorio(); /* Indice aleatorio del array*/

int i;
int encontrados;
int NumCaracteresAEncontrar = 0;
int errores = 0;

/* Mostramos la palabra que se debe adivinar en la terminal del servidor. */
printf("%s\n", strcat(solucionSrv, diccionario[aleatorio]));

/* Inicializamos el vector auxiliar a espacios vacíos. */
for (i = 0; i < MAXLINEA; i++)
auxiliar[i] = ' ';

/* Colocamos los asteriscos de la palabra elegida. */
for (i = 10; diccionario[aleatorio][i-10] != '\0'; i++)
auxiliar[i] = '*'; 
auxiliar[i] = '\0';

/* Pongo el limite de caracteres que deben ser encontrados. */
NumCaracteresAEncontrar = i - 10;

/* Enviamos la primera pista al cliente, todavía sin haber realizado ningún intento. */
if (write(desc, auxiliar, MAXLINEA) < 0) 
errexit("Error WRITE (primera pista): %s\n", strerror(errno));

/* Mientras no superemos el número de errores, no hayamos ganado y leamos algo del cliente */
while ((NumCaracteresAEncontrar > 0) && (errores < 8) && (cc = read(desc, buffer, sizeof(buffer))) )
{
if (cc < 0)
errexit("No se ha leído la letra correctamente: %s\n", strerror(errno));

/* Inicializamos encontrados, que servirá para ver si se encuentra la letra recibida todavía sin descubrir. */
encontrados = 0;

/* Recorremos todas las letras de la palabra del diccionario */
for (i = 10; diccionario[aleatorio][i-10] != '\0'; i++)
{
/* Miramos que no la hayamos introducido anteriormente. */
if ((toupper(buffer[0]) == diccionario[aleatorio][i-10]) && (toupper(buffer[0]) != auxiliar[i]))
{
auxiliar[i] = toupper(buffer[0]);
encontrados++;
NumCaracteresAEncontrar--;
}
}

if (encontrados == 0) errores++;

/* Ponemos la palabra AHORCADO según el número de errores. */
for (i = 0; i < errores; i++)
auxiliar[i] = ahorcado[i];

if ( NumCaracteresAEncontrar != 0 && errores < 8)
{
if (write(desc, auxiliar, MAXLINEA) < 0) 
errexit("Error WRITE (envío pista): %s\n", strerror(errno));
}

}


if (errores >= 8)
{
if (write(desc, "FIN DE LA PARTIDA. ¡Has sido ahorcado!", MAXLINEA) < 0) 
errexit("Error WRITE (envío final de partida): %s\n", strerror(errno));
}
else
{
if (write(desc, "FIN DE LA PARTIDA. ¡Has ganado!", MAXLINEA) < 0)
errexit("Error WRITE (envío final de partida): %s\n", strerror(errno));
}

/* Enviamos la palabra correcta */
if (write(desc, strcat(solucion, diccionario[aleatorio]), MAXLINEA) < 0)
errexit("Error WRITE (envío solución): %s\n", strerror(errno));

/* Cerramos socket */
close(desc);
return 0;
}

/*************************************************************************
*
* escogeAleatorio - Función que gestiona el juego en el servidor.
* 
*************************************************************************/

int escogeAleatorio()
{
int i, n, aleatorio, P, U;

/* Indices, entre 0 y NUM_PALABRAS-1. Son NUM_PALABRAS palabras*/
P = 0;

U = NUM_PALABRAS-1;

srand(time(NULL));

aleatorio = P+(int)(((U-P+1.0)*rand())/(RAND_MAX+1.0));

return aleatorio;
}

/*************************************************************************
*
* reaper - Limpia los hijos en estado zombie.
* 
*************************************************************************/

void reaper(int sig)
{
int status;

while (wait3(&status, WNOHANG, (struct rusage *)0) >= 0)
/* empty */;
}

Código fuente del Cliente:

/*************************************************************************
*
* Cliente del juego Ahorcado en TCP.
* Asignatura: Redes II.
* Autores:
* Gabriel Cebrián Márquez.
* Estefanía Coronado Calero.
* Iván Durango Blanco.
*
************************************************************************/

#include 
#include 
#include 
#include 
#include 

#include 
/*extern int errno;*/

#include "error.h"
#include "socket_utils.h"

/* Librerías incluídas */
#include "miconio.h"

int ahorcadoCli(const char *host, const char *service);
int comparacion(char *c1);
void leerDeServidor(char *buf, int socket);

#define MAXLINEA  42 /* Máximo tamaño de la línea que recibiremos. */

/*************************************************************************
*
* Main - Cliente ahorcado TCP.
*
************************************************************************/

int main(int argc, char *argv[])
{
char *host = "localhost"; /* Host que se usa si no se indica ninguno */
char *service = "8041"; /* Nombre del servicio por defecto     */
char nombreServidor[256]; /* Almacenará el nombre del servidor, si fuera necesario. */

switch (argc)
{
case 1:
printf("Indica el nombre del host o IP al que conectar: ");
scanf("%s", nombreServidor);
fflush(stdin);
host = nombreServidor;
break;
case 2:
host = argv[1];
break;
default:
fprintf(stderr, "Uso del programa: Ahorcado_cliente [host]\n");
exit(1);
}
ahorcadoCli(host, service);
exit(0);
}

/*************************************************************************
*
* ahorcadoCli - Función que gestiona el juego para el cliente.
*
************************************************************************/

int ahorcadoCli(const char *host, const char *service)
{
char buf[MAXLINEA+1]; /* Buffer para intercambio de información */
int socket;   /* Descripción del socket    */
int outchars;  /* Número de caracteres enviados   */

socket = connectTCP(host, service);

printf("\n=======================================");
printf("\n          AHORCADO REMOTO");
printf("\n=======================================");
printf("");
printf("\nInstrucciones: El servidor elegirá aleatoriamente una palabra que usted tendrá");
printf("\n  que adivinar.");
printf("\nDispone de 8 intentos para acertarla. En cada intento podrá elegir una letra.");
printf("\nSi la palabra a adivinar la contiene, esta aparecerá en su lugar.");
printf("\nSi usted repite una letra se le añadirá un fallo a su lista. El juego finalizará");
printf("\n  si usted adivina la palabra o por el contrario se muestra la palabra AHORCADO.");
printf("\n\n\nErrores:  Palabra a adivinar:");
printf("\n\n");

/* Leemos la cadena del servidor donde se nos ofrece la primera pista. */
leerDeServidor(buf, socket);
printf("%s\n",buf);

while (buf[0] = getch())
{
if (((buf[0] >= 'A') && (buf[0] <= 'Z')) || ((buf[0] >= 'a') && (buf[0] <= 'z')))
{ 
buf[MAXLINEA] = '\0'; /* Fin de linea */
outchars = strlen(buf);
if (send(socket, buf, outchars) < 0)
errexit("Error SEND: %s\n", strerror(errno));;

/* Se lee del servidor */
leerDeServidor(buf, socket);

if(comparacion(buf) == 1)
{
printf("%s\n",buf); /* Hemos llegado al final, ganando o perdiendo, imprimimos dos líneas. */
leerDeServidor(buf, socket);
printf("%s\n",buf);

close(socket);
exit(0);
}

printf("%s\n",buf);
}
}
}

/*************************************************************************
*
* comparacion - Función que determina cuando finaliza el cliente, acabará
* cuando el servidor responde FIN.
* Si hemos llegado al final retorna 1. De lo contrario retorna 0.
*
************************************************************************/

int comparacion(char *c1)
{ 
char palabra[] = "FIN";
int i;

for (i = 0; i<3; i++)
{
if (c1[i]!=palabra[i])
return 0;
}

return 1;
}

/*************************************************************************
*
* leerDeServidor - Función que recoje lo que el servidor envía.
*
**************************************************************************/

void leerDeServidor(char *buf, int socket)
{
int inchars;
int n;

for (inchars = 0; inchars < MAXLINEA; inchars += n)
{
n = read(socket, &buf[inchars], MAXLINEA - inchars);

if (n < 0)
errexit("Error READ: %s\n", strerror(errno));
}
}

Link para descargar el código fuente:

Codigo_fuente_ahorcado

Para más información sobre como ejecutar, como a sido diseñado, etc visitar:

http://aprendiendo2veces.blogspot.com/2011/04/aplicacion-cliente-servidor-ahorcado.html

jueves, 7 de abril de 2011

La ley Sinde. ¿De verdad servirá para algo?

En este breve artículo, se intenta dar una opinión personal sobre el impacto social y cultural que la ley Sinde está originando tras su creación y posterior aprobación. Para esto, se intentaran dar razones sustancialmente razonadas, donde se explicará, desde un punto de vista objetivo el porqué de la oposición que genera esta ley.

Tras un análisis profundo, llego a la conclusión de que estoy desacuerdo con algunas de las ideas que se exponen actualmente sobre este tema, aunque también en desacuerdo con otras.
Está claro que la Ley Sinde, se hace exclusivamente para proteger la propiedad intelectual en internet, si bien es cierto, que es creada para proteger los intereses no de una forma general, si no de una forma muy privada.

Este razonamiento cobra sentido al pensar en el tanto porciento “irrisorio” que se llevan de beneficio los autores por sus obras y en ver como los intermediarios son los que realmente se llevan el mayor beneficio sin crear absolutamente nada. Aunque parezca algo sorprendente, esto no solo ocurre en el ámbito de la propiedad intelectual, que tanto está de moda, sino que también podemos observar como los agricultores que son realmente quienes realizan la producción de los productos agropecuarios (sus autores), reciben por estos cantidades completamente grotescas y como los intermediarios sacan beneficios totalmente desproporcionados.

Por este motivo, es completamente comprensible que muchos autores españoles estén en contra de esta ley, siendo realmente los intermediarios los interesados en su creación.

Desde mi punto de vista, es una buena idea crear una ley que regule los derechos de autor, pero no de esta forma tan restrictiva y prohibitoria, si no tomando medidas de verdad y llegando al fondo del asunto.

Si bien es cierto que la cultura vive hoy más esplendor que en el pasado debido a su facilidad de difusión y acceso con el uso de las nuevas tecnologías, pero el problema de la piratería no se centra en esta facilidad de acceso, si no en el coste tan elevado de productos con propiedad intelectual como CDs de música, películas, videojuegos etc.

En este aspecto, me parecen una buena idea servicios existentes en la actualidad como "spotify", en los cuales se tiene acceso a toda tu música favorita con costes muy reducidos e incluso gratis. Pero no solo eso, si no que, al disponer de todas las canciones sin necesidad de descargas, la piratería se reduce en gran proporción. ¿ Por que no se progresa en esa línea?

Desde otra perspectiva, es cierto, que la esencia de Internet son los enlaces, contra los que arremete la ley Sinde, y que esta herramienta es de gran importancia en el futuro, pero estoy en contra de lo que se expone en algunos artículos al decir que la realidad es que “La música en Internet ES GRATIS”, ya que esto es solo un pensamiento debido a la cultura pro-piratería que vivimos actualmente y creado por una sociedad que ve como normal realizar descargas de forma ilegal, y no se para a pensar que esto es un delito contra la propiedad intelectual y sobre todo contra los autores.

miércoles, 23 de marzo de 2011

Programación de Socket en C: Servidor multiprotocolo ECHO.

El problema que se propone es la realización mediante socket de una aplicación con arquitectura cliente-servidor lo más sencilla posible para la mayor comprensión de este tipo de programación.

Para ello implementaremos un servidor ECHO multiprotocolo y con concurrencia aparente en el que podremos realizar conexiones con varios clientes que usen protocolo UDP o TCP, de forma simultanea.

Para aquellos que estén un poco perdidos, comentar que el servidor ECHO, es un servicio ya implementado en linux, el cual se limita a devolver el "string" que es enviado por un cliente, pero se realizará una implementación diferente.


#include
#include
#include
#include
#include

#include
#include
#include
#include

#include "error.h"
#include "socket_utils.h"

#define MAX_BUFF_SIZE 128

int main(int argc, char *argv[]) {

struct sockaddr_in cli_addr;
unsigned int cli_size;

int ms, cs, auxsock, nfds, usock;/* sock. maestro, cliente y aux, y número total de descriptores en el sistema */
fd_set rfds; /* conjunto de sockets para lectura */
fd_set afds; /* conjunto de sockets activos */

char buff[MAX_BUFF_SIZE];
int n;

/* obtenemos número máximo de descriptores en el sistema */
nfds = getdtablesize();

FD_ZERO(&afds);

ms = passiveTCP("echo", 5);
usock = passiveUDP("echo");

FD_SET(ms, &afds);

while (1) {

FD_SET(usock,&afds);

memcpy(&rfds, &afds, sizeof(rfds));
if (select(FD_SETSIZE, &rfds, (fd_set*)0, (fd_set*)0, (struct timeval *) 0) == -1)
errexit("select: %s\n", strerror(errno));

/* Cliente TCP */
if (FD_ISSET(ms, &rfds)) {
/* hay actividad sobre el socket maestro*/
cli_size = sizeof (cli_addr);
cs = accept (ms, (struct sockaddr *)&cli_addr, &cli_size);
if (cs != -1)
FD_SET(cs, &afds);
}

/* Cliente UDP */
if (FD_ISSET(usock, &rfds)) {
cli_size = sizeof(cli_addr);
if (recvfrom(usock, buff, sizeof(buff), 0,(struct sockaddr *)&cli_addr, &cli_size) < auxsock="0;" if="" auxsock="" n="recv"> 0))
send (auxsock, buff, n, 0);
if (n == 0) {
close(auxsock);
FD_CLR(auxsock, &afds);
}
}
}
(void) close(ms);
}

jueves, 3 de marzo de 2011

Estudio sobre Domótica: Vivienda familiar completamente autónoma.

Para la realización de este estudio, se centrará la atención en una vivienda unifamiliar, que posee un sistema de control integrado, para asegurar a los usuarios un aumento del confort, de la seguridad, del ahorro energético y de las facilidades de comunicación dentro de la vivienda y hacia el exterior con otros entes inteligentes, como por ejemplo la compañía de suministro eléctrico, el departamento de bomberos, un hospital o el supermercado.

Así concebida, una construcción inteligente debe buscar funcionalidad, flexibilidad y economía, generando un aumento de la productividad de los que la habitan. Si entendemos como productividad el mejor aprovechamiento del tiempo y una disminución de costes y riesgos.

Descripción detallada de la Vivienda Domotizada.

En general, en los sistemas de automatización de casas, el software que controla el funcionamiento de la casa debe ser ajustado para que responda al estilo de vida de los habitantes de la casa, y debe ser reprogramado, de forma sencilla, si la familia cambia sus referencias. También se dispondrá de un mando central, con el que pueden manejarse todos los elementos de la casa, de forma rápida.

En el diseño de la vivienda, se atiende especialmente, y con las particulares del caso, a los aspectos o necesidades primarias, que son el confort, seguridad y gestión de la misma. Desde el punto de vista del confort, la vivienda dispondrá de varios elementos inteligentes, enumerados a continuación:

- Se tendrá la opción de encender el equipo de audio y la televisión mediante un detector de voz.

- El aire acondicionado se enciende cuando entramos en nuestro hogar.

- El televisor bajará el volumen automáticamente si suena el teléfono.

- La lavadora enviará un mensaje a nuestro teléfono móvil, indicando que el ciclo de lavado terminó.

- Las persianas de la vivienda pueden subirse y bajarse de forma automática mediante palmadas o usando el mando central.

Automáticamente se tendrá lista el agua en la bañera a una hora determinada, los días que el usuario indique.

- El frigorífico de forma automática, dará un aviso sobre aquellos productos que están a punto de caducar. También al retirar un producto de éste, comprobará la cantidad disponible, y tendrá la capacidad de realizar la compra de forma automática si está por debajo de la cantidad programada.

- La posibilidad de mostrar en el televisor, la persona que está llamando a la puerta en ese momento, y permitirle pasar a la vivienda de forma automática.

- Sistema automático de regado y cortado del césped.

Para poder desarrollar este proyecto es necesario que por toda la casa se disponga de sensores que proveen información como la temperatura y luz ambiente, sonidos, movimientos, etc, y de actuadores que alteran las variables de ese ambiente en función de cómo se haya programado su sistema de control central.

Si nos centramos en cuestiones de seguridad, en la vivienda dispondremos de:

-Un Sistema de prevención de alarmas ante siniestros, mediante un detector de inundación con aviso y corte de agua, un detector de escape de gas con aviso y corte de gas, detectores de humo y detectores de intrusión.

- Un Sistema inteligente o simulación de presencia, que es capaz de darle vida a la vivienda cuando los usuarios no van a estar en ella por una larga temporada, para ello se podrá poner el sistema en modo vacaciones y la vivienda encenderá varias luces, subirá y bajará las persianas etc.

- Un sistema de vídeo vigilancia.

- Un dispositivo de alerta médica, tanto dentro como fuera de la vivienda, que se ponga encontacto de forma automática con los servicios de emergencia.

Para tratar la gestión de la vivienda de una forma óptima se tratará de racionalizar los distintos consumos energéticos en función de la ocupación de la vivienda, tarifas energéticas y nivel de potencia contratada, entre otros criterios. Además de la incorporación a la vivienda de elementos de auto-abastecimiento de energía como placas solares.

Cuando la demanda de energía eléctrica de nuestro hogar es superior a la contratada, el sistema puede desconectar los circuitos eléctricos a los que están conectados equipos de un uso no prioritario y con un consumo significativo, para evitar un corte del suministro eléctrico. Esto nos permite reducir la potencia contratada, reduciendo al mismo tiempo el coste mensual de la factura eléctrica. Al mismo tiempo existen equipos domésticos que pueden entrar en funcionamiento en horas distintas a las normales (lavadoras, lavavajillas, secadoras, calefacción eléctrica por acumuladores, etc.).

Todos ellos podrían funcionar aprovechando las condiciones más económicas de las posibles tarifas (tarifa nocturna.).A su vez, podemos controlar independientemente el consumo de los electrodomésticos para contratar la potencia exacta en nuestro hogar. Dentro de este campo, también es interesante que el sistema controle la iluminación de la vivienda, haciendo que el sistema controle cada una de las estancias según el nivel de luminosidad ambiente y presencia de usuarios, evitando con esto que haya estancias que tengan un consumo innecesario de energía.

Para finalizar, me gustaría hacer hincapié en que el uso de la domótica puede ser muy interesante para personas con cualquier tipo de dificultad, y que podría ser capaz de ayudar a personas con alguna discapacidad (física, sensorial y/o intelectual), así como a ancianos para que puedan vivir en sus casas de una forma independiente y autónoma. Por ejemplo usando dispositivos capaces de modificar la altura de la encimera de la cocina, para permitir un uso adecuado a personas con dificultades etc.

miércoles, 23 de febrero de 2011

Me paso al Libro electrónico: E-Book Bq Avant XL

Las nuevas tecnologías siguen avanzando a un ritmo casi incontrolable. Con toda esta evolución surgen los E-Book, libros electrónicos o como a mi me gusta llamarlo, ecolibro.

Aunque este término es ambiguo, ya que se hace referencia tanto a libros en formato digital como a los lectores de estos, en esta ocasión nos centraremos en los lectores.

Para todos aquellos que estén un poco perdidos, deciros que hoy en día casi cualquier aparato como PDA, PC, móvil. etc. puede usarse como lector de libros, aunque al tener por lo general pantallas LCD y TFT con Retroiluminacíon es una autentica tortura para la vista.

Para solucionar este problema en abril de 1997, el MIT ( Instituto de tecnología de Massachusets) crea la compañía E ink para desarrollar una tecnología de tinta electrónica.

Actualmente se implementan 2 tipos de tinta electrónica (tipo E-ink):

- Pequeñas esferas blancas por un lado, negras por otro. Las esferas rotan electrónicamente.

- Tubillos con líquido coloreado y esferas de contraste.

Ambas dan la sensación de estar leyendo un libro real, produciendo el mismo cansancio que en estas lecturas.

Pues bien esta tecnología es la que utilizan los lectores de libros electrónicos, y una de sus mayores ventajas es el gran ahorro de papel que supone (pensemos por ejemplo en la cantidad de papel diario que se utiliza para la creación de periódicos cuyo periodo de vida es de 24 horas).

Tras investigar un poco sobre el mundo de los e-book y su funcionamiento, para la asignatura Human Computer Interaction (HCI), decido mirar el mercado para comparar precios, rendimientos etc.

Pasados unos cuantos días me decido a comprar el lector Bq Avant XL, ya que me supondría un gran ahorro de fotocopias para los apuntes, de libros para la carrera y podría leer todos los libros que tengo en mente (que no son pocos), por un precio más económico e incluso de forma gratuita.

Este dispositivo dispone de una pantalla de 9 pulgadas, con tinta electrónica SIPIX mas AUO y una resolución de 1024 * 768, 150 ppp y 16 niveles de grises. Lo mejor es que es táctil, con lo que se pueden tomar notas directamente en los libros.

La autonomía de la batería es de hasta 10000 páginas (tras 2 meses, solo he tenido que realizar 2 cargas). Lee perfectamente los libros en PDF, epub, rtf, html, fb2 y txt, doc entre otros.

El lector Avant XL, con WiFi, grosor de 10 mm, peso de más de 400 gramos, memoria interna de 2 Gb y ranura para tarjetas de memoria microSD (con 2 Gb es suficiente), está disponible en color blanco.

Después de 2 meses de uso intensivo con mi Avant, puedo decir que es una de las mejores compras que he hecho, ya que con su gran pantalla me permite leer todo (incluso comics y el periódico) de forma muy sencilla, intuitiva y natural.


viernes, 18 de febrero de 2011

Cultura Activa UCLM: III Concurso de Blog.

Tras ver el programa que este año ofrece la UCLM en el periodo de concursos culturales para el desarrollo del plan Cultura Activa, descubro el concurso de Blog y como no podría ser de otra forma decido inscribirme.

Para todo el que esté interesado, deciros que tenéis hasta el 18 de este mes para inscribiros y presentar vuestro Blog. Animaros que no perdéis nada y es algo muy interesante para intercambiar opiniones entre nosotros, además de los premios que se otorgaran a los 3 primeros ( 500, 300 y 150 €).

Os dejo el Link con todas las actividades que se van a realizar.