sábado, 14 de abril de 2012

Ruby en paralelo

Para la aportación de esta semana, hablaré acerca de un lenguaje de programación, llamado Ruby, algunos de mis compañeros tal vez ya lo conozcan ya que recuerdo que vimos algo de ello en lenguajes de programación hace algunos semestres.

Ruby es un lenguaje de programación que abarca diferentes paradigmas entre ellos podemos decir, que Ruby es un lenguaje interpretado, reflexivo y también orientado a objetos, inspirado en Python y Perl, para esta entrada hablaré de como poder utilizar este lenguaje en forma paralela.

Ruby por default viene instalado en sistemas operativos de Mac OS a diferencia de Ubuntu, en donde para instarlo debemos de seguir el tipico comando.


Luego de instalarlo, existe un gestor de paquetes para el lenguaje de programación Ruby, llamado RubyGems, en donde podemos portar librerías para Ruby, por lo que necesitamos instalarlo para poder tener la extensión paralela, por lo que pondremos en el terminal.


Ahora con todo esto, lo que necesitamos es la estensión paralela de ruby, para eso simplemente vamos a utilizar el siguiente comando (Ahora lo pondré en Mac OS, pero es lo mismo que en Ubuntu).


Ahora que tenemos todo instalado, vamos a probar si esto funciona correctamente, la extensión parallel para ruby es poderosa, ya que podemos correr cualquier código en procesos paralelos, para utilizar los recursos del CPU o tambien utilizar hilos, así generando código más eficiente.

Para este caso, modifiqué un código realizado aquí en donde se realiza un benchmark entre como de una forma secuencial, mandamos ping host a diferentes páginas web, luego por medio de hilos, luego por medio de bifuración, como lo hemos visto en la materia, teniendo los siguientes resultados.


Obteniendo resultados favorables al utilizar Hilos y Forks, por lo que podemos ver considerablemente el cambio en tiempo.

PD: ara poder hacer funcionar el código pongan cambien las páginas hosts, pongan otras, las que ustedes quieran, porque las que vienen en el ejemplo, hay 2 que ya no existen.

Expongo el código.

require 'rubygems'
require 'parallel'
require 'net/http'
require 'benchmark'


hacer_ping = lambda { |host| 10.times { Net::HTTP.new(host).head('/') } }
puts "#{Parallel.processor_count} procesador(es)"
hosts = ['www.facebook.com', 'www.google.com', 'www.yahoo.com', 'www.uanl.mx', 'www.wikipedia.org', 'www.ruby-lang.org']

Benchmark.bm do |x|
  x.report('Normal') { 
    hosts.each &hacer_ping
  }
  x.report('Hilos') { 
    Parallel.each(hosts, :in_threads => Parallel.processor_count, &hacer_ping)
  }
  x.report('Forks') { 
    Parallel.each(hosts, &hacer_ping)
  }
end 

Ahora modifiqué el código para que hiciera una simple división 100 millones de veces
Expongo el código.

require 'rubygems'
require 'parallel'
require 'benchmark'

div = lambda { 100000000.times { 4.0/2.0 } }
puts "#{Parallel.processor_count} procesador(es)"
 
Benchmark.bm do |x|
  x.report('Normal') { 
    hosts.each &div
  }
  x.report('Hilos') { 
    Parallel.each(hosts, :in_threads => Parallel.processor_count, &div)
  }
  x.report('Forks') { 
    Parallel.each(hosts, &div)
  }
end


Y aquí los resultados.


jueves, 29 de marzo de 2012

Mapa Logistica [Puntos extra]





Tarea 3: Pruebas estadísticas para los números pseudoaleatorios

Librería de generación de números pseudoaleatorios
Para realizar esta parte, lo primero que hice es generar numeros pseudo-aleatorios de manera teórica con octave para generar una gráfica en donde pudiera ver como varia la distriución de forma visual, en mi caso estoy utilizando la distribución de possion que utiliza la siguiente formula.



Por lo que hice esta función en octave:



En gnuplot genero esta gráfica.


Luego para generar la estadística, como sabemos debemos de generar mediante una unidad de tiempo saber cuando es mayor a uno y que esto regrese un numero aleatorio por medio de un random uniforme, por lo que generé otra función la cual da este numero.





Para luego, generar esta gráfica en gnuplot


Luego necesitamos un programa que genere y hacer "canastas" para normalizar los numeros.



Generando los siguientes resultados los cuales voy a utilizar para las pruebas.




Luego si comparamos las dos versiones de numeros pseudo-aleatorios, tenemos que una gráfica comprobando que pertenecen a la misma distribución


Pruebas estadísticas
Ahora, para verificar que lo que estoy generando, se apegan a la distribución de poisson, por lo que mediante una investigación en internet por lo que decidí hacer la prueba de chi cuadrado.


La prueba de chi cuadrado,sigue una distribución de chi cuadrada de Pearson, en donde mido la discrepancia entre una distribución observada y otra teórica, por lo que genere en una lista numeros desde la libreria de numpy con numeros de distribución de poission, comparados los numeros teóricos que generé, al igual que los numeros experimentales y para verificar que esto funciona, lo que hice fue compararlo con numeros que utilicen otra distribución, en donde tuvimos resultados satisfactorios teniendo Hipotesis contrarias.


Expongo el código.



Teniendo los siguientes resultados.

Por lo que podemos comprobar que al comparar con la distribución de poisson, tenemos un resultado satisfactorio pero al momento de comparar con una distribución normal, se rechaza.

Podemos concluir que los numeros generados si pertenecen a la distribución de poisson.

lunes, 26 de marzo de 2012

Medio curso: Reporte+Ponencia

Importancia/impacto esperado del proyecto


Esperamos que nuestro proyecto Cantamela! viene a crear una aplicación para las personas que desean el nombre de una canción pero que se saben la letra o la musica, puedan con un simple toque, saber cual es esa canción, esto puede tener muchos propósitos, ya que de alguna manera ayudamos a que las personas puedan de una manera relativamente facil obtener un resultado y una forma inovadora de buscar información sobre canciones.


Cantamela! será una aplicación compatible para android completamente en español, utilizando puras tecnologias que sean libres para cualquier persona, ya que las que existen actualmente en el mercado necesitan de cuotas para obtener referencias de canciones, incluso algunas otras utilizan algoritmos que ya se encuentran patentados los cuales no se pueden utilizar.


Podemos decir que cantamela! tambien viene a cubrir la necesidad del reconocimiento de canciones que no son muy conocidas o canciones que son puramente regionales o de nuestro país, por lo que esperamos hacer una de las bases de datos con mas diferencias de generos musicales y cantantes.


Es un reto realizar una aplicación de esta magnitud, ya que como hemos dicho, existen empresas enteras que llevan años desarrollando tecnologías para mejorar el servicio de este tipo, lo que nosotros estamos proponiendo es tomar la ayuda de APIs especializadas para así poder realizarlo.


Herramientas y tecnologías utilizadas


Android SDK, es uno de los sistemas operativos más robustos en el mercado de tecnologías móviles y es implementado en muchos dispositivos, desde celulares hasta tabletas, teniendo esa facilidad en hacerlo portable para dichas plataformas y tener una buena experiencia.


Echoprint “escucha” el audio de un teléfono para averiguar qué canción es, dado que cualquiera puede utilizar echoprint de forma gratuita, se puede instalar en nuestros propios servidores y aun esta en fase de desarrollo(es relativamente nueva), por lo que se espera que cada vez se puedan agregar más canciones y el objetivo es que sea una tecnología de música de identificación de facto.


Echoprint consta de tres partes: El generador de código, lo que hace es convertir el audio en códigos que luego el servidor almacena y genera códigos indices y datos que provienen de los socios de la libreria y otros usuarios de Echoprint.


El generador de código de tiempo calcula has de pares a partir de una señal de audio utilizando el procesamiento avanzado de señal, teniendo en cuenta el ruido y como se modifica este audio, a partir de una señal mono de 11kHz, se calcula un filtro de blanqueamiento, luego se descompone en una 8 sub-bandas y con esto se hace una búsqueda.


Tomado de http://echoprint.me






Calendarización 










Consideraciones de usabilidad relevantes al proyecto


Los usuarios a los cuales nos dirigimos es especialmente a los jóvenes, pero vemos la posibilidad de que cualquier persona ya sea niño u adulto pueda acceder a la aplicación para consultar información, por lo que esperamos incrementar la base de datos con un rango de todas las edades.


Podemos decir que los usuarios pueden conocer otras aplicaciones que hagan la misma operación que esta aplicación, a diferencia que esta tendrá la posibilidad de que con mayor grado conozca la canción que se esta buscando, por lo que tenemos que hacer la interfaz lo mas visible y minimalista para que los usuarios no busquen otras alternativas y encuentren nuestra propuesta mejor que las demás.


Como el usuario pensamos que va utilizar la aplicación en un contexto en el cual de manera rápida necesite la información y no tener que esperar mucho tiempo, simplemente queremos que mediante un toque pueda tener lo que necesite y no que navegue entre menus innecesarios para obtener dicho contenido.


Algo importante es hacer que las canciones recientes de la aplicación puedan estar visibles para que si el usuario olvidó que canción buscó, no tener que repetir la busqueda, si no simplemente navegar entre el menu.


Esperamos que si tenemos tiempo, realizar pruebas de usabilidad entre los compañeros del salón y entre personas objetivo para poder realizar mejoras en la interfaz del sistema y llevar un mejor producto.


En las siguientes diapositivas expongo la primera fase de la interfaz del proyecto al igual que contenido relevante sobre el mismo.



moviles