viernes, 16 de mayo de 2014

Pulse audio: Servidor remoto de audio

¿Quieres escuchar todas tus PCs en una sóla PC?

En la PC que fungirá como servidor ejecutamos

$ pactl load-module module-native-protocol-tcp auth-ip-acl=xxx.xxx.xxx.0/24 auth-anonymous=1
22

Donde xxx.xxx.xxx.0/24 representa que le quiere dar permiso a PC de su red local, por ejemplo:

192.168.1.0/24

El número que da  se usa para apagar el módulo con

$ pactl unload-module 22

En el/los cliente(s):

 $ pax11publish -e -S xxx.xxx.xxx.xxx

donde las xxx.xxx.xxx.xxx representa la dirección ip del servidor, (ej. 192.168.1.3). Con la siguiente instrucción regresamos el audio al cliente.

 $ pax11publish -e -r


Si el servidor es ubuntu y tienen el firewall activado, con

$ sudo ufw allow 4713/tcp

abren el puerto.

Otro comando del lado del servidor muy útil es

$ pactl load-module module-loopback latency_msec=10

Con esto podremos escuchar la entrada del micrófono, si hay mucho ruido, con el alsamixer o el gnome-alsamixer, disminuyen el nivel de "Mic Boos".

viernes, 31 de enero de 2014

La aventura de los cursos en línea (IV)

Coursera (parte II):

"VLSI CAD: Logic to Layout": Todo un tema, sobre todo porque me gusta, te da una visión de lo que las herramientas para el desarrollo de circuitos tienen que hacer. [Computational boolean algebra; logic verification; logic synthesis(2 level and multi-level); technology mapping; timing analysis; ASIC placement and routing]

"Exploring Quantum Physics": ¿Han escuchado el término de medicina cuántica? Si es así, entra en este curso para darte cuenta que los que los que la promueven usan el termino en forma abusiva para darle un toque de realismo y hacer creer que tienen bases científicas para sus afirmaciones.

"The Hardware/Software Interface": Buen curso para aprender lenguaje ensamblador, desensamblar programas, y ver las formas en como nuestros sistemas operativos administran la memoria.

"Computational Neuroscience": Técnicas computacionales para analizar, modelar y entender el comportamiento de las neuronas.

"Archaeology's Dirty Little Secrets": Curiosidad! ¿Qué esperas? Buen curso para saber que hay detrás de bambalinas en el trabajo de los arqueólogos.

"Computational Molecular Evolution": Introducción a la teoría de la evolución molecular a través  de algoritmos computacionales.

"Coding the Matrix: Linear Algebra through Computer Science Applications": Aprendes álgebra lineal a través de la programación.

"Linear and Integer Programming": El instructor de este curso es uno de los mejores que he visto, ya que tiene la capacidad de explicar la teoría que ha detrás de la Programación Lineal de forma que cualquiera lo pueda entender, y lo mejor que afianzas los conceptos realizando, paso a paso, tu propio programa.

"From the Big Bang to Dark Energy": No podía dejarlo pasar, este es otro tour por nuestro universo.

"Initiation à la programmation (en C++)" y "Initiation à la programmation (en Java)": ¿Quieres afinar el oído para el Francés y programar al mismo tiempo? Estos son tus cursos, si no, no te preocupes se puede demostrar que las matemáticas no son el único lenguaje universal, también la programación es un lenguaje universal :).

"C++ For C Programmers": El curso perfecto para aprender programación orientada a objetos en C++, entender las principales funciones de este lenguaje, y los que hacer y no hacer. Durante el curso se programó el juego de Hex.

$ ./HexGame
Welcome to the Hex Board Game
Hello Human, dou you want to beat me.
I'm so confident that I will play under your rules, muaja, muaja ...
Select Board size (7-?) : 7
Select your color (BLUE|RED) BLUE always play first : BLUE
   0  1  2  3  4  5  6
 0   .  .  .  .  .  .  .  
   1   .  .  .  .  .  .  .  
     2   .  .  .  .  .  .  .  
       3   .  .  .  .  .  .  .  
         4   .  .  .  .  .  .  .  
           5   .  .  .  .  .  .  .  
             6   .  .  .  .  .  .  .  
Human move (x y) : 4 4
   0  1  2  3  4  5  6
 0   .  .  .  .  .  .  .  
   1   .  .  .  .  .  .  .  
     2   .  .  .  .  .  .  .  
       3   .  .  .  .  .  .  .  
         4   .  .  .  .  B  .  .  
           5   .  .  .  .  .  .  .  
             6   .  .  .  .  .  .  .  
Computer move (x y) : 4 1 (Elapsed time = 3.05 seconds)
   0  1  2  3  4  5  6
 0   .  .  .  .  .  .  .  
   1   .  .  .  .  .  .  .  
     2   .  .  .  .  .  .  .  
       3   .  .  .  .  .  .  .  
         4   .  R  .  .  B  .  .  
           5   .  .  .  .  .  .  .  
             6   .  .  .  .  .  .  .  
Human move (x y) : 


Otros:
A través de los foros del curso de VLSI CAD llegué a un curso llamado Digital ASIC (http://go.distance.ncsu.edu/digital-asic/), a pesar de que por cuestiones de tiempo no fue posible finalizar completamente el último ejercicio (arreglar un bug), aprendí sobre la programación en verilog, además de conceptos que ha detrás de un buen diseño.

MiriadaX
  "Desarrollo de Aplicaciones en HTML5 y para Dispositivos Móviles Firefox O.S.": Este es la primera entrega de una serie de cursos destinados a enseñar el diseño de aplicaciones para los dispositivos que vengan el SO de Mozilla.

La aventura de las cursos en línea (III)

Coursera (parte I):

Esta es la plataforma en la que he estado más activo, así que lo voy a dividir.

"Model Thinking": Todo es modelable, desde lo económico hasta el comportamiento humano, en alguna u otra forma ¡somos todos unos borregos noooooooooooo!.

"Cryptography I": Entro los conceptos, los ejercicios y la programación fue todo un reto. WEP ya se porque eres malo, muy malo.

"Algorithms: Design and Analysis, Part 1": Son de ese tipo de cursos que son un parte aguas, de esos cursos que te hacen cambiar de una programación estilo fuerza bruta a pensarle en los algoritmos y las estructuras de datos para optimizar nuestros programas.

"Probabilistic Graphical Models": Este pertenece a una lista de los cursos que más me han gustado.

"Fundamentals of Pharmacology": !Oh curiosidad¡ No podía dejar pasar la oportunidad de conocer como interactúan los medicamentos en nuestro cuerpo.

"Quantum Mechanics and Quantum Computation": Son de esos temas que llaman mucho la atención, tienes un conjunto de compuertas con las que puedes trabajar. Me lo imagino como los GAL, donde tienes un arreglo de compuertas lógicas que combinas de tal forma que realicen la operación u/o algoritmo que desees.

"Introduction to Mathematical Thinking": El instructor mostró una gran pasión (contagiosa) por lo que hace, explicando de forma clara, precisa y con entusiasmo el arte de las demostraciones y del pensamiento matemático, en lugar del proponer algo mecanizado con un "porque yo lo digo".

"Writing in  the Sciences": Buen curso para tomar conciencia de los que hacer y no hacer cuando realizas un escrito científico. Aunque muchas veces suele ser difícil modificar los hábitos.

"Computing for Data Analysis": Mostraron los conceptos y las metodologías más comunes para realizar un análisis estadístico usando R.

"An Introduction to Interactive Programming in Python": Otra forma de aprender python.

"Introduction to Astronomy": Todo un tour guiado por el Universo de Newton, los Planetas, las estrellas, la evolución estelar, la relatividad y los hoyos negros, galaxias y una breve introducción a la cosmología. Muy gratificante y recreacional.

"Galaxies and Cosmology": Una mirada más profunda a la evolución de las galaxias y de nuestro universo.

"Game Theory": Son de esos cursos cuyas ideas y conceptos planteados en ellos jamás olvidas, y te cambian la perspectiva.

"Image and video processing: From Mars to Hollywood with  a stop at the hospital": Técnicamente es procesamiento de imágenes.

"Intermediate Algebra", "Calculus One" , "Calculus: Single Variable" y "Calculus Two: Sequences and Series": Una serie de cursos para re-aprender, afianzar y/o ver como en otros lados enseñan estos temas.

"Control of Mobil Robots": Te has preguntado porque tu robot móvil no funciona adecuadamente, entra y te darás cuenta porque.

La aventura de los cursos en línea (II)

Continuemos con EDX.

"CS169.1x Software as a Service": Esta es la primera parte de un curso enfocado a enseñar las técnicas y conceptos usados en el desarrollo de las apliciones en la nube. En este curso se uso Ruby on Rails.

"CS188.1x Artificial Intelligence": De nuevo, pues si, pero con otro enfoque, me acabé de dar cuenta que mi coco son las heurísticas, jajajaja, era divertido ver al packman suicida corriendo a las garras de los fantasmas, o completamente temeroso incapaz moverse.

"Stat2.2 Introduction to Statitics: Probability": Nunca se termina de aprender, sobre todo porque, según el área de conocimiento de cada instructor, las interpretaciones que le da a cada concepto pueden llegar a ser un poco distintas.

"CS1156x Learning From Data": Todo algoritmo en "Machine Learning" tiene sus fundamentos, y este es un buen curso para comenzar a adquirirlos. Cuenta con un buen balance entre teoría y práctica.

"6.00x Introduction to Computer Science and Programming": Un tour completo en el mundo de la programación, los algoritmos, etc. Se usó python.

"CS50x Introduction to Computer Science I": Versión y visión de Harvardx de lo que una introducción al mundo de las Ciencias Computacionales.

"2.01x Elements of Structures":  Oh curiosidad!. Fuerzas, Momentos, Cargas Axiales, Torque, etc. etc. Casi me termino doblando :) .

"MCB80.1x Fundamentals of Neuroscience, Part 1: The Electrical Properties of the Neuron": Todas esas animaciones y simulaciones fueron imprescindibles para visualizar el funcionamiento de las neuronas. Existe la opción de comprar un kit para que no te digan, que no te cuenten, si lo puedes comprobar por ti mismo.

La aventura de las cursos en línea (I)

Esta aventura la comencé con las primeras ofertas que fueron "Introduction to Artificial Intelligence" por parte de Sebastian Thrun y Peter Norving, "Introdution to Databases" por Jennifer Widom y "Machine Learning" por Andrew Ng.

Grandiosa experiencia fue el tomar esos cursos y más el haberlos terminado, porque de los miles que se inscribieron, por diversas causas, sólo un porcentaje pequeño fueron los que terminaron.

Estas plataformas representan una forma alternativa de explorar varios puntos de vistas y formas de enseñar una misma materia, explorar otras ramas del conocimiento humano y una fuente inagotable de conocimientos.

"Introduction to Artificial Intelligence": Nunca había tenido contacto con este tema, pero es algo fascinante ver y programar algunos de los algoritmos que ayudan a que una máquina realice algo que parezca inteligente.

"Introduction to Databases": Aquí aprendí que las bases de datos son más que un select,insert, update. La lógica y el álgebra que están detrás son impresionantes. Mis más sinceros respetos a los que las diseñan.

"Machine Learning": Sin palabras.

De este experimento surgieron las plataformas UDACITY y COURSERA. Sin dejar al lado otro experimento (MITx) del cual surgió la plataforma EDX.

6002x Circuits and Electronics (Agarwal): Gran experiencia, sobre todo la parte cómica, en la que presentaba algunos conceptos.

En este y otros post hablaré brevemente de cada uno de los cursos que he finalizado en cada una de las plataformas.

Iniciemos por UDACITY, cuyo objetivo es que te la lleves tranquilo y a tu propio ritmo:

"Introduction to Computer Science": Aprendes los conceptos básicos de la programación (python) por medio de un proyecto donde se realiza un web crawler.

"Artificial Intelligene for Robotics": Continuación de la saga "Introduction to Artificial Intelligence".

"Intro to Statistics": Siempre es bueno recordar y/o pedir una segunda opinión. Buen curso si se quiere iniciar o recordar, además de programar en python.

"Design of Computer Programs": Un tour guiado en la programación usando python aprovechando algunas características avanzadas de este lenguaje.

"Applied Cryptography": Excelente curso para entender las bases de los algoritmos usados para encriptar nuestras comunicaciones entre otras cosas.

Lo bueno: Con el beneficio que da el llevarlo a tu propio ritmo, no tienes fechas límites más las que uno se imponga. Puedes iniciar cualquier curso en cualquier tiempo, a diferencia de las otras plataformas.
Lo malo: Si no se tiene cuidado se puede terminar inscribiéndose a todos los cursos, y de tantos no saber por cual ir.

viernes, 24 de enero de 2014

Instalando Tiva C Launchpad en Ubuntu GNU/Linux

Con motivo de curso ofrecido en la plataforma www.edx.org llamado Embedded Systems - Shape The World (https://www.edx.org/course/utaustinx/utaustinx-ut-6-01x-embedded-systems-1172), he adquirido el Tiva C Launchpad de TI. Pero como usarlo en Linux, ya que es el SO que más uso.

Toolchain

Primero añadimos el PPA del toolchain, para ellos abrimos una terminal y ejecutamos los siguientes comandos.

sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded
sudo apt-get update
sudo apt-get install gcc-arm-none-eabi


lm4flash

Instalamos los siguientes paquetes:

sudo apt-get install flex bison libgmp3-dev libmpfr-dev libncurses5-dev libmpc-dev autoconf texinfo build-essential libftdi-dev git libusb-1.0-0-dev


Clonamos el repositorio del lm4tools:

git clone https://github.com/utzig/lm4tools.git
cd lm4tools/lm4flash/
make
sudo cp lm4flash /usr/bin/


Añadimos una nueva regla udev para darle acceso al Tiva C Launchpad a los usuarios normales.

$ cat /etc/udev/rules.d/99-tivac.rules
ATTR{idVendor}=="15ba", ATTR{idProduct}=="0004", GROUP="plugdev", MODE="0660" # Olimex Ltd. OpenOCD JTAG TINY
ATTR{idVendor}=="067b", ATTR{idProduct}=="2303", GROUP="plugdev", MODE="0660" # Prolific Technology, Inc. PL2303 Serial Port
ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", GROUP="plugdev", MODE="0660" # USB Serial
ATTR{idVendor}=="1cbe", ATTR{idProduct}=="00fd", GROUP="plugdev", MODE="0660" # TI TivaC/Stellaris Launchpad

sudo udevadm control --reload-rules

Tiva C Ware

Descargamos SW-EK-TM4C123GXL-1.0.exe de http://www.ti.com/tool/sw-ek-tm4c123gxl. Si no tienen cuenta se va a tener que crear para poder descargarlo.

Ya descargado procedemos a descomprimirlo con unzip y lo compilamos

unzip SW-EK-TM4C123GXL-1.0.exe
make

Si todo ha ido bien podremos subir alguno de los ejemplos en nuestra tarjeta de desarrollo

$ lm4flash examples/boards/ek-tm4c123gxl/blinky/gcc/blinky.bin


lunes, 26 de diciembre de 2011

Simulación BPSK en python/numpy/matplotlib

Una pequeña prueba



import numpy as np
from scipy.special import erfc
#from scipy import weave
#from scipy.weave import converters
import matplotlib.pyplot as plt
from time import time

N = 5000000
ip = np.random.rand(1,N)>0.5;
s = 2*ip-1
t = time()
n = 1.0/np.sqrt(2.0)*(np.random.randn(1,N)+1j*np.random.randn(1,N))
print(time()-t)
Eb_N0_dB = np.arange(-3.0,11.0,1.0) #-3 a 10 dB
errors = []
terrors = []
for EbN0 in Eb_N0_dB:
t = time()
y = s+10**(-EbN0/20.0)*n
ipHat = y.real>0
err = float((ip != ipHat).sum())/N
errors.append(err)
terrors.append(0.5*erfc(np.sqrt(10**(EbN0/10.0))))
print("time = %s, EbN0 = %s, ber = %s"%(time()-t,EbN0,err))
plt.semilogy(Eb_N0_dB,errors,'-o')
plt.semilogy(Eb_N0_dB,terrors,':v')
plt.legend(('simulation','theory'),'upper right',shadow=True,fancybox=True)
plt.title('Bit Error Rate for BPSK')
plt.xlabel(r'$\frac{Eb}{N0}$, dB')
plt.ylabel('Bit Error Rate')
plt.grid(True)
plt.show()