jueves, 29 de marzo de 2012

Reporte 8 - Paralelos

Como volvimos hacer el cluster desde 0, no he podido experimentar agusto porque todos tenemos que tener la misma configuracion y los mismos paquetes instalados.

Propuesta


En la clase de contexto la maestra nos puso un ejercicio, de intentar acomodar los números dentro de una matriz en este caso 5*5, el objetivo era que dentro del cuadro de 5*5 acomodaras los números del 4 al 28, sin que se repitieran y que sumados en horizontal, vertical y diagonal sumaran 80.  Recordé que los chinos o japoneses habían descubierto la forma de hacerlos. Busque en internet y ¡BRAVO! se llamaban cuadros mágicos, leei como se resolvía (arriba y derecha) y resolví el que la maestra había puesto de ejercicio, ganandome puntos extras (jahjhajahja :D).

Entonces se me ocurrio, ¿se podra hacer para cluster? y llege a la conclucion de que si se podria.

Modo Normal:

Supongamos que tenemos una matriz de n*n, entonces la forma de resolverlo es:

1.- Empezar con el primer numero, en la casilla de enmedio de la columna superior
2.- Moverte arriba y derecha, y poner el siguiente numero.
2.1.- Cuando la casilla este ocupada, poner el numero abajo y regresa al paso 2.
3.- Seguimos colocando numeros, hasta que se llene la matriz.
4.- Y al final comprobamos si la suma en diagonal, vertical y diagonal es igual a la cifra "magica".



Modo cluster:

Para hacerlo mas entendible, pongamos unos puntos de partida.
El cuadro ejemplo sera de  9*9



1.- Dividimos el MEGAcuadro 9*9 en 9 cuadritos de 3*3


1.1.-Como dice la regla "no podemos repertir lo números" entonces el cuadrito 2, empezara del numero 10 al 18; el cuadro 3, del 19 al 27 y asi sucesivamente.

2.- El primer cuadrito que se envía a algún nodo se le coloca un BANDERA, para cuando lo regresen al cuadro con la respuesta el "servidor" nadamas acomode (según la bandera).


3.- Cuando el nodo termine su trabajo regresar el cuadro y colocarlo en la posicion que esta asigando.




4.- cuando todos los nodos hallan terminado, tendremos una matriz de 9*9 resuelta en poco tiempo y sin perder la "cifra magica".


Esta es mi propuesta, en vacaciones trabajare con codigo, para correrlo en cluster.

Referencias

http://www.math.hmc.edu/funfacts/ffiles/10001.4-8.shtml#
http://gaussianos.com/cuadrados-magicos/

miércoles, 28 de marzo de 2012

Avance de medio curso





Reporte
IMPACTO ESPERADO DEL PROYECTO



    • Controlar robots/aparatos con nuestros celulares es algo que nos facilita mucho la vida, y para no quedarnos atrás, he decido hacer una aplicación para android que pueda controlar un "carro lego", el cual se podrá estacionar por si solo en paralelo.


    • Como dijo Isaias cuando presentaba su proyecto: "mientras mas sencillo, tiende a ser mejoro algo asi, mi interfaz sera una pantaña con 2 botones "conectar y estacionar" y un textView que diga "Conectado o Desconectado".




HERRAMIENTAS Y TECNOLOGIAS UTILIZADAS 








 *  Un Lego NXT

 *  2 sensores ultrasonicos
 *  IDE de eclipse
 *  Android
 *  Bluetooth






CALENDARIZACIÓN

Lo que resta de Marzo

  • Conexión Android - Lego.

Lo que resta, hasta mi fecha limite.

  • Hacer el programa para el Lego.
              Buscar()  
              Estacionar()

Mi fecha limite = 1 mes (28 de abril)



CONSIDERACIONES DE USABILIDAD RELEVANTES AL PROYECTO

  • Verificar que los botones no de desacomoden al momento de girar el telefono. 
  • Poner avisos (retroalimentación) abajo de los botones, para que el usuario, no este picando "OK" por cada cosa.
  • Checar el tamaño de los botones, asi como el color de las letras.

viernes, 23 de marzo de 2012

Reporte 7 - Distribuidos

Esta semana estubo buena, aclaramos puntos que teniamos que hacer, se puso en claro que es lo que habiamos logrado, y tambien lo que se logra hacer.

En la casa de Saúl, se vieron puntos como:

¿Con que distrubuccion trabajar?                                                                       = Ububtu 10.04
¿Cual es la mejor 32/64 bits?                                                                            = 64 bits
¿Cuales herramientas vamos a instalar para hacer nuestra distribucción?
¿Que lograremos?                                                                                            = conectar todas las pc por vpn
¿Fecha?                                                                                                          = empezamos el 26 de marzo

Ahora que esta todo en la mesa y las cartas repartidas, ya nadamas es cuestion de jugar un rato (con la configuración).

Mostrando avances


Leí sobre MPI y vi muchos códigos, PUNTOS EXTRAS para Emmanuel, por una entrada bien explicada el cual me guié. El objetivo de esta semana era modificar el código de Cecy (pi en paralelo) para hacerlo para cluster.

Este es el código que tengo hasta ahora, como pueden ver es el mismo código que Cecy, entonces, ¿que lo hace diferente? solamente 2 lineas (lo relevante).

import random
import math
import mpi

def enCirculo(x,y):
 acierta = false
 resultado = x**2 + y**2
 if resultado <= 1
  acierta = true
 return acierta

def piCalculo(n):
 c=0
 random.seed(mpi.rank)
 for i in range(n):
  x = random.random()
  y = random.random() 
  acierta = enCirculo(x,y)
  if acierta:
   c += 1
  pi = (4.0*c)/n
 return pi

if mpi.rank == 0:
 print "pi=", piCalculo(10000000/mpi.size), "para un rango", mpi.rank

pimpi = (1.0/mpi.size) * mpi.allreduce(pi,mpi.SUM)

if mpi.rank == 0
 print "valor calculado de PI en", mpi.size, "procesos es" ,pimpi
 print "usando", mpi.size*n, "numeros"


Lo Relevante

Se agregaron varias lineas, al final del código. Pero lo interesante ocurre en las siguientes 2 lineas

random.seed(mpi.rank)

Esto inicializa el generador de números aleatorios, lo que garantiza que nos da una secuencia diferentes
en cada proceso.

mpi.allreduce(pi,mpi.SUM)

Esto nos proporciona una forma de sumar los resultados obtenidos en los procesos. Este programa calcula pi, sumando el promedio de los resultados obtenidos en cada proceso individual.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
En estos momentos estoy peleando con instalando/configurando el cluster, para correr el ejemplo. El programa lo hice a mano y segun yo debe funcionar.

nadamas que el cluster este listo, pongo las impresiones de pantalla.

martes, 20 de marzo de 2012

R.java, la librería que no se toca.

Como ya hemos visto en varios proyectos, si has curioseado un rato, observaste que la librería R.java, al momento de modificarla, eclipse nos lanza una advertencia diciendo que no se puede modificar y que REGRESARA a los valores que tenia anteriormente.

Al principio es algo chistoso, porque piensas: “¿Por qué pasa esto? ¿Si no la puedo modificar a mano, entonces como?”. Esa es la pregunta que responderemos en esta entrada.

Android nos permite definir una serie de recursos para facilitar  la creación de aplicaciones. Pero, ¿que es un recurso? ¿Que tipo de recursos?. Bueno, en Android un recurso es un archivo (como uno de música), el titulo de un dialogo cualquier cosa que este ligado a una aplicaciones ejecutable, estos archivos podemos cambiarlos sin necesidad de recompilar la aplicación. ¿Interesante no?

Recurso “string” y su efecto en R.java

Android permite definir strings en uno o MAS archivos XML de recursos. Estos archivos están bajo el directorio /res/values. El nombre del archivo XML para este tipo de recursos pueden ser cualquiera, pero por convención se suele llamar strings.xml.

Veamos el ejemplo que trae Android por default.


    Hello World, PoderosoActivity!
    Poderoso



Cuando este archivo se crea o se modifica, el plugin ADT de eclipse automáticamente actualizará la clase R.java de nuestra aplicación que se encuentra en el directorio /gen, que contiene los ID’s únicos para las cadenas que se crean.

package el.poderoso.unico;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}
Como vemos como primero R.java define una clase principal en el paquete raiz: public final class R. Depues, define una clase interna llamada public static final class string. R.java crea esta clase estática interna como espacio de nombres para guardar los IDs de los recursos string.

La definición de los dos public static final int llamados app_name y hello son los IDs de los recursos que representan nuestras cadenas de texto. Podemos usar estos IDs en cualquier lugar de nuestro código mediante R.string.hello o R.string.app_name

Ahora agreguemos unas líneas de código para ver que pasa

strings.xml 

    Hello World, PoderosoActivity!
    Poderoso
    Hello, this is a test!
    Maximo


R.java

package el.poderoso.unico;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int app_name1=0x7f040003;
        public static final int hello=0x7f040000;
        public static final int hello1=0x7f040002;
    }
}
Y así es como se debe modificar R.java, eclipse por las malas o por las buenas nunca te dejara modificarla a mano. Siempre tendremos que modificar los XML de la aplicación.

miércoles, 14 de marzo de 2012

Estructura de un proyecto Android

Ahora que ya sabemos como crear nuestras aplicaciones, lo que sigue explicar  la estructura de un proyecto Android, esto fue algo en lo que también estuve batallando, ¿el porque de tantas carpetas? X_X

Cuando se crea un proyecto automaticamente se nos crean un monton de carpetas, todas ellas necesarias pero desconocidas, esta estructura es similar para cualquier tipo de aplicacion, sin importar el tamaño o complejidad.

















Expliquemos las partes importantes

/src/









Contiene todo el código fuente de la aplicación, código de la interfaz gráfica, clases auxiliares, etc. Inicialmente, Eclipse creará por nosotros el código básico de la pantalla (Activity) principal de la aplicación, siempre bajo la estructura del paquete java definido.

/gen/

 
Aquí aparecerán archivos que genera Eclipse de forma automática, como por ejemplo el archivo R.java. Estos archivos no deberemos editarlos, ya que será Eclipse el que se encargará de modificarlos automáticamente según otros parámetros del proyecto.


/Android 2.3.3/ y /assets



Android -> Es la librería de desarrollo de Android (SDK). Podemos ir desplegando el árbol para ver los paquetes y clases que incluye el SDK. Cuando añadamos nuevas librerías o paquetes a nuestro proyecto, aparecerán de la misma forma.

assets -> Es un directorio para guardar recursos que utilice tu aplicación. Para acceder a los recursos de este directorio necesitarás usar la clase AssetManager para leer los datos como un stream de bytes, por lo que es preferible utilizar el directorio /res ya que el acceso a los archivos es mucho más sencillo.

/res/ 











Es el directorio principal de recursos (resources). Aquí guardaremos imágenes o archivos multimedia que utilice nuestra aplicación. Los recursos colocados en este directorio son fácilmente accesibles desde la clase R.



/res/drawable-?dpi/












Es el directorio de recursos gráficos o imágenes que utilizará nuestra aplicación. Tiene tres subdirectorios: drawable-hdpi,drawable-ldpi y drawable-mdpi, en el que guardaremos las imágenes dependiendo de la densidad de puntos por pulgada que tenga el dispositivo en el que se ejecute la aplicación. Puedes consultar la sección Supporting Multiple Screens de la guía de desarrollo para Android para comprender mejor cómo programar para distintos tamaños de pantalla.

/res/layout/


En Android debemos separar el código de la aplicación de la interfaz gráfica. En este directorio es donde colocaremos los archivos xml que definen las vistas que utilizará la aplicación. Desde el código de la aplicación le indicaremos el archivo xml que queremos que use en cada momento, de forma que nos facilitará mucho modificar el código sin tener que tocar nada del entorno gráfico, y viceversa.

/res/values/


Al igual que separamos el código de la aplicación de la interfaz gráfica mediante vistas, conviene hacer lo mismo con cadenas de texto, arrays, paleta de colores que usará la interfaz… Este apartado cobra importancia en la localización de nuestra aplicación. Por ejemplo, podremos definir un archivo strings.xml en /res/drawable-es/ y otro en /res/drawable/. El primero se utilizará automáticamente si el usuario tiene configurado el terminal en el idioma español, mientras que en el resto de casos se utilizará el archivo que se encuentra en /res/drawable/.

AndroidManifest.xml
 
 

Es el archivo de configuración de nuestra aplicación. En él definiremos “qué puede hacer nuestra aplicación”, es decir, informaremos al sistema de que nuestra aplicación puede abrir archivos mp3, abrir enlaces http o que es capaz de manejar las llamadas telefónicas que recibamos. En este archivo también indicaremos las actividades o servicios que ejecutará nuestra aplicación y los permisos especiales que necesita utilizar en el caso de que quiera acceder a recursos compartidos del sistema, como el acceso a la lista de contactos, uso del GPS, o la posibilidad de enviar mensajes SMS.





project.properties y proguard.cfg  

Son archivos que genera automáticamente Eclipse y del que no deberemos preocuparnos por ahora.

Instalar Android + Eclipse

Lo primordial es saber que para desarrollar aplicaciones en Android tenemos que usar Ecplise, no porque sea la única forma, si no la mas sencilla, entonces empezamos.

Seguramente ya han visto este tutoríal en otras paginas, así que sin tanto show, intentare explicárselos de la forma mas sencilla.

1 - Descargar eclipse

Seguramente este IDE ya lo estés manejando, en caso de que no lo tengas, entras aquí, recomiendo descargar la versión mas reciente (3.7.2) Eclipse IDE for Java EE Developers, seleccionamos nuestro sistema operativo, esperamos a que la descarga termine, descomprimimos el archivo, lo movemos a un lugar definitivo de trabajo y ejecutamos el archivo eclipse. 

2 - Descargar el SDK de Android 

La versión actual del sdk es la r_16 y funciona perfectamente.
Lo que hacemos es descargar el sdk de acuerdo a nuestro sistema operativo (linux), esperamos a que la descarga termine, descomprimimos la carpeta, la movemos a un  lugar DEFINITIVO de trabajo y lo instalamos. 

Abrimos una terminal, nos movemos al directorio del sdk, y ejecutamos la sig. instrucción  tools/android update sdk --no-ui, esperamos (en mi caso fue como 30 min.) y listo. 


3 - Descargar el plugin Android para Eclipse.

Google pone a disposición de los desarrolladores un plugin para Eclipse llamado Android Development Tools (ADT) que facilita en gran medida el desarrollo de aplicaciones para la plataforma. Podéis descargarlo mediante las opciones de actualización de Eclipse, accediendo al menú “Help / Install new software…” e indicando la URL de descarga:
https://dl-ssl.google.com/android/eclipse/
Se debe seleccionar e instalar el paquete completo Developer Tools, formado por Android DDMS y Android Development Tools.

4 - Configurar el plugin ADT.

En la ventana de configuración de Eclipse (Window/Preferences), se debe acceder a la sección de Android e indicar la ruta en la que se ha instalado el SDK y damos Apply - OK.

5 - Configurar un AVD.

Para configurar el AVD (Window/AVD Manager/New) tan sólo tendremos que indicar un nombre descriptivo, el target de Android que utilizará, y las características de hardware del dispositivo virtual, como por ejemplo su resolución de pantalla, el tamaño de la tarjeta SD, o la disponibilidad de GPS.

Con esto ya podemos empezar a crear aplicaciones para android.

6 - Hola Mundo en Android.

Creamos un nuevo proyecto de tipo Android Project. Indicamos su nombre, el target deseado, el nombre de la aplicación, el paquete java por defecto para nuestras clases y el nombre de la clase (Activity) principal.





Para ejecutar el proyecto tal cual podremos hacerlo como cualquier otro proyecto java configurando una nueva entrada de tipo Android Applications en la ventana de Run Configurations. Al ejecutar el proyecto, se abrirá un nuevo emulador Android y se cargará automáticamente nuestra aplicación.

domingo, 11 de marzo de 2012

Reporte 6 - Paralelos

pyMPI lo básico
 
wikipedia:
pyMPI es un software que integra MPI con python.
Permite escribir programas paralelos utilizando el lenguaje Python.


Hay dos funciones importante:

mpi.send () ->El mpi.send() toma dos argumentos: los datos a enviar y luego el rango de la computadora a recibir.
mpi.recv () ->La función mpi.recv() por defecto no tiene argumentos.

Tanto mpi.send y mpi.recv estan bloqueados - el control no se devuelve a las funciones hasta que el envio no ha sido totalmente procesado.

Hay dos funciones más, mpi.irecv () y mpi.isend (), que proporcionan una funcionalidad similar, pero sin bloquear.

//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Esta semana estuve leyendo acerca de pympi, los blogs de Cecy y Ramón, para poder entender bien algunos conceptos que tenia "volando".

La PC que estaba usando para el cluster, por razones pequeñas y cercanas, se formateo y aun no le instalo nada ni configuro las IP's, espero hacerlo el primer dia de descanso entre examenes, y después a base el código de Cecy + pympi intentar correr ejemplos ya con varios procesos y ver esa diferencia de tiempo.




http://www.math.unl.edu/~s-bbockel1/dsweb/lesson4/index.php