lunes, 27 de febrero de 2012

Ford OpenXC [Lab]

Una de las hábitos más importantes que nosotros como futuros ingenieros en software debemos de tener, es el leer sobre actualizaciones ya que como sabemos, la tecnología avanza rápidamente y tenemos que saber sobre noticias nuevas para no quedarnos atrás.


Hace unos días, encontré una plataforma que me pareció interesante y se las comparto, es OpenXC, el cual es una combinación de hardware de código abierto y software que permite personalizar un carro con aplicaciones y módulos conectables, utilizando estándares, herramientas la cuales estamos trabajando este semestre para así nosotros como desarrolladores podamos utilizar y desarrollar nuestras ideas.




OpenXC es una API para un carro, por lo que instalando un módulo de hardware podemos obtener datos de la red interna de carros inteligentes e incluso hacerlos accesibles a aplicaciones de Android utilizando esta librería, por lo que se pueden desarrollar aplicaciones tales como, minimizar la distracción cuando alguien conduce, o saber un conocimiento más profundo de como esta el coche en una simple aplicación.


La Ford y Bug Labs se unieron para hacer mediante un estándar de software y hardware accesorios para sus vehículos, como sabemos cada carro nuevo que hay en el mercado tienen muchísimas computadoras y equipos electrónicos, por lo que existe el interés de realizar sistemas para aplicaciones de terceros inclusive mediante web.


La versión actual de OpenXC es una combinación de las plataformas de Arduino y Android, por lo que nos abre las posibilidades de crear nuevos componentes y aplicaciones, por lo que solo nos resta hechar a andar la imaginación para programar, como dice en la pagina, tan fácil como un teléfono inteligente.


Algunas de las cosas que se pueden hacer con esta API es por ejemplo, leer datos del vehículo en tiempo real, así como la posición del GPS, la velocidad del vehículo, por lo que, como todavía esta en desarrollo, todavía esta en versión beta pero en este año se libera, si quieres saber mas información sobre esto, puedes registrarte en su página, al igual que la documentación de este.


Algunos de los vehículos que tienen compatibilidad son:
  • 2011-2012 Focus
  • 2012 Mustang
  • 2012 Fiesta
  • 2011 Figo
Los cuales contienen un Digilent chipKIT Max32 y un Arduino compatible con microcontroladores PIC32 y con Android puedes utilizar un dispositivo el cual está alimentado por un micro-USB.


Aquí un video, de hace unas dos semanas, en el CES 2012, si bien, no hablan acerca de especialmente OpenXC pero podemos ver las tecnologias que existen en los automóviles.





Les dejo unos links de interés.
OpenXC Platform
Engadget OpenXC beta
CNET Ford+OpenXC

NDK de Android [Lab]

Luego de instalar android, me topé con el problema de la librería, que necesitamos para realizar nuestro proyecto de la materia de móviles, ya que no se encuentra del todo disponible para android, pero encontré una forma de hacer la librería, de manera que sea compatible con el sistema, pero tenía que descargar el NDK de android, algo que nunca había escuchado y me llamó la atención, así que en esta entrada explico un poco que es el NDK (ojo, no confundir con el SDK) y para que les puede servir a mis compañeros.





El NDK [Native Development Kit] de Android son herramientas con las cuales podemos agregar ciertos componentes, que necesitan el uso de código nativo en aplicaciones de Android, por lo que con el uso del NDK podemos implementar parte de nuestras aplicaciones, usando el código nativo con los lenguajes de C y C++, proporcionando ciertos beneficions ya que puedes reutilizar el código existente y algunas veces obtener un aumento de velocidad.

Por lo tanto, con el uso del NDK por medio de las herramientas nos dan la posibilidad de generar bibliotecas, utilizando código fuenta nativo en C y C++, pudiendo integrar bibliotecas en un paquete de aplicaciones para poderlas utilizar en el dispositivo móvil con el sistema, al igual que bibliotecas nativas del sistema que se utilizan para OS posteriores del 2.3, sportando conjuntos de instrucciones ARM como ARMc5TE (Thumb-1), ARMc7-A(Thumb-2), VFPv3-D16 (NEON/VFPv3-D32), entre otros, hay que tener en cuenta que algunos de estos arquitecturas tienen restricciones dependiendo si el CPU es compatible.

El NDK nos da librerías estables, como la librería de C, la librería matemática libm, OpenGL para gráficos en 3D, interfaz JNI (Java Native Interface), entre otras.

Es claro destacar, que no es nada mas de utilizar el NDK sin tener claro para que lo vas a usar en tu aplicación, por lo que hay que saber que no beneficiará a todos las aplicaciones, por lo que debemos de saber cuales son las ventajas y desventajas de utilizar código nativo en el sistema, por lo que esto no quiere decir que utlizar este tipo de código vamos a tener un aumento automático de performance, algunas veces aumentamos la complejidad de nuestra programación, por lo que debemos de tener en cuenta que el código nativo se debe de utlizar solamente cuando es esencial para el desarrollo de la aplicación y no decir "porque quiero hacer una app de Android en C",  no, para eso no sirve.

Algunas ejemplos de cuando utilizar en NDK, sería apliacaciones autónomas de las cuales se necesitan operaciones intensivas al CPU, pero que no necesitan mucha memoria, como por ejemplo el procesamiento de señales, o si queremos realizar simulaciones de física, por lo que no nada mas el hecho de hacer un método en C va a realizar un aumento en general al rendimiento, por lo que tenemos que cuestionarnos si es necesario el desarrollar en código nativo o ver si la API de android tiene lo que necesitamos.

Tenemos dos maneras de utilizar el código nativo de Android:
  • Escribir nuestra aplicaciones usando el framework de Android y usar el JNI para accesar a las APIs que nos da el Android NDK.
  • Escribir una actividad nativa, lo cual nos permite implementar el ciclo de vida que nos sirve para saber que regresa dicha función en código nativo.

El NDK proporciona librerías de sistema para las APIs nativas, garantizando la compatibilidad de todas las versiones de Android, como por ejemplo;
  • libc (Librería de C)
  • libm (Librería de matemáticas)
  • JNI (Java native interface)
  • libz (compresión Zlib)
  • liblog (logging de Android)
  • OpenGL ES 1.1 y OpenGL ES 2.0 (Gráficas 3D)
  • libjnigraphics (Acceso al buffer de pixeles)
  • OpenSL ES (Librería para audio)

Links útiles.

miércoles, 22 de febrero de 2012

Tarea 2: Procesos estocásticos discretos y contínuos

Podemos decir que, cuando en una X empresa se generan diferentes productos, por ejemplo, zapatos en una máquina constructora, es normal pensar que podríamos tener productos de los cuales tengan fallas y si en un futuro se nos llega a presentar este tipo de problema, podemos argumentar que este es modelo escolástico ya que  es tomado como un dato al azar y se relacionan las variables por funciones probabilisticas en donde consideramos que si tenemos un fallo seria un éxito y un fracaso el no tenerlo, si el interés de esta empresa es saber de una cierta cantidad de productos encontrar el numero de productos con fallos, tenemos que realizar un análisis de distribución binomial  

Como lo vimos en clase, el experimento de Bernoulli es un experimento que se hace aleatoriamente con solamente dos resultados, esto es si tenemos éxito o tenemos fracaso, por lo que la probabilidad del éxito le podemos decir p y la probabilidad seria un 1 - p, al cual podemos decir que es un binario en el cual 1 es éxito y 0 es fracaso, por lo que cuando realizamos el experimento de Bernoulli, se cuenta el numero de éxitos que tenemos en solamente un experimento.

Aplicado en el ejemplo que he propuesto, si se nos pide que tomemos solamente un zapato al azar y examinarlo para decidir si este producto tiene falla o no, por lo que este es un experimento de Bernoulli, pero tengo bien definido que únicamente voy a escoger un solo zapato de estos, en el caso del uso de la distribución binomial tenemos que tener en cuenta cuantos éxitos tenemos en repitiendo varias veces el experimentos de Bernoulli, en donde entonces podemos argumentar que el experimento viene siendo base para el binomial.

Proponiendo que, si el 17% de los zapatos hechos en la empresa tienen fallas, podemos decir que X es el número de zapatos con falla de una caja con 6 pares (o sea, 12 zapatos o productos). Considerando que X es el número de éxitos en 12 experimentos de Bernoulli separados con un parámetro de 0.17.

En una variable binomial, tenemos dos parámetros base los cuales son n, que es el número de experimentos que vamos a necesitar y p que es la probabilidad que tenemos de una respuesta favorable o éxito. Por lo que en el ejemplo propuesto podemos decir que X es una binomial con n = 17 y p = 0.17



Entonces en esta imagen, podemos ver que, como la probabilidad de P[X = 0] = 1 - p, P[X = 0] = 0.83 y como tenemos 12 zapatos y que cada uno tiene su probabilidad de que sea bueno de 0.83 por lo que la probabilidad es 0.83 12 = 0.1068


Si por ejemplo se nos pide encontrar la probabilidad de que tengamos solamente un zapato con fallo, podemos decir que P[X = 1] es de 12 * 0.17 * 0.83 11 = 0.262, en donde el 12 es el numero de veces que vamos a hacer el experimento porque son 12 zapatos, el 0.17 la probabilidad de que haya un fallo y el 0.8311 los zapatos restantes.


Si P[X = 2] entonces es cuando la probabilidad de que haya solamente dos fallas, por lo que podemos ver que P[X = 2] es de 0.172 * 0.8310 pero ahora multiplicado por el número que se necesita para que los zapatos se cambien en diferentes posiciones con fallas, por lo que este numero lo podemos sacar con el coeficiente binomial, en donde tenemos el numero de subconjuntos que hay en un conjunto, en este caso bincoeff(12, 2) = 66, el cual utiliza la formula


Por lo que al ver estos casos podemos argumentar la formula.

  • P[X = 0] = bincoeff( 12, 0) * 0.83 12
  • P[X = 1] = bincoeff( 12, 1) * 0.17 * 0.83 11
  • P[X = 2] = bincoeff(12, 2) * 0.172 * 0.8310
  • ….. etc….

Por lo que en general tenemos que.
P[X = k] = bincoeff(12, k)* 0.17k * 0.08312-k

en donde k = 0, 1, 2, 3, 4 …. 12.

Por lo que decimos que la función probabilidad de la distribución binomial


en donde k = 0, 1, 2, …., n.

Entonces vemos que este cuenta el número de éxitos que tenemos en n repeticiones que se hacen en un experimento de Bernoulli con probabilidad de éxito p.

Con el problema dado, he generado con el código que vimos en la clase (aquí) una gráfica.


En esta gráfica vemos la comparación con las diferentes probabilidades en la distribución binomial.


Version continua.
Podemos decir que la version continua de la distribución binomial es la distribución normal puede ser por ejemplo si se nos pide sacar el plastico del zapato tiene una distribución normal con una media de 72 y desviación tipica de 3 (medidas en micras), y si el plastico se consdera "garantizado" si el espesor del plastico esta entre 60 y 75 ¿Cual es el porcentaje de plastico de zapato que cumple con este requisito?.

Para poder realizar esto podemos utilizar octave con la función normcdf normalizando el calculo y obtener el resultado.


Entonces tenemos un resultado de 0.84 entonces el porcentaje del problema descrito con version de distribución normal es de 84.1%

Según esto, lo que modifiqué del código es que la k estuviera modificandose cada 0.1 para obtener una grafica mas definida, la verdad no estoy seguro que esté bien y espero que mis compañeros que enrealidad entendieron me puedan ayudar.

Expongo mi código.


  
Y genero esta gráfica.


Referencias
Notas de clase - Estadística - Universidad de Coruña

jueves, 16 de febrero de 2012

Pagerank [Tarea extra]

¿Qué es PageRank?
PageRank o PR, es un algoritmo para analizar las conexiones simultáneas que existen sobre un sistema de clasificación de páginas Web, el cual es utilizado como el motor de búsqueda de Google, para así poder medir cuantitativamente la popularidad de una página web y clasificar los resultados de la búsqueda.

Podemos decir, que los nodos que tenemos en el siguiente grafo son los estados de las páginas web y que suponiendo que cada nodo tiene k ligas que salen de estas, tenemos que la probabilidad de transición de una página a otra, va a ser de 1/k para cada uno, esto sería como cuando una persona solamente navega dando clicks al azar, solamente siguiendo de una página a otra.

Si suponemos que todas las páginas web estan conectadas entre ellos, nos proporciona una probabilidad de que cada cierto tiempo que nosotros llegamos a ésa página, esto quiere decir que, el pagerank nos dice que tan fácil es llegar a esta página, por lo que si ésta es importante, muchas otras páginas van a estar apuntando a ti, entonces si una persona navega al azar, frecuentemente va a llegar a una página que esta apuntado a ti y con esta mayor probabilidad, va a llegar a ver ésa página importante.

Ejemplo:
Para hacer este procedimiento, he dibujado un grafo simulando una mini red de 10 páginas, las cuales están todas conectadas entre si, pero algunas tienen mas ligas que otras, en este caso, podemos ver que las que están en rojo solamente tienen una liga a ellas, las amarillas tienen dos ligas y la verde es la que tiene mas ligas en la red, por lo tanto es la que se considera más importante.
Dibujo grafo

Representación gráfica




Aquí podemos ver la matriz de adyacencia, que es la que dice si hay o no liga, si tenemos un 1 quiere decir que esta tiene liga con la coordenada correspondiente, si tiene un 0 no tiene liga, haciendo una matriz binaria, luego para poder obtener el pagerank, tenemos que convertir esta matriz de adyacencia en una matriz estocástica, según sus transciones, por lo que cada uno sumará un total de k ligas y dividimos entre cada uno de estos elementos para obtener que la suma sea un uno y sea estocástica, luego con esto sacamos el eigenvector valor izquierdo, obteniendo el vector que nos va a decir cuales son las páginas más importantes.




Luego de esto, vemos que los valores grandes son los más importantes, para luego ligar este  que en su caso es página 2, que comparado con otras, tiene que ser mayor.






Obtenemos como resultado en el vector, la importancia de cada una de las páginas, en donde tenemos por muy superior a la página 2.




Por medio del comando spy, podemos obtener una gráfica sobre como está la matriz y cuales son sus ligas.


Referencias.
¿Qué es un eigenvector?
¿Qué es pagerank?
Algoritmo de pagerank
Octave