jueves, 22 de marzo de 2012

Multiplexación

Una técnica que usaré en mi proyecto PIC, es el multiplexado o multiplexación. Esto significa en pocas palabras, que conectaré varios displays en paralelo, para ahorrar el número de pines, ya que si no lo hiciera de esta manera, me faltarían pines para mi proyecto. Primero, veamos como funcionan los displays.

Display de 7 Segmentos

El display de siete segmentos es una forma de representar números en equipos eléctronicos. Está compuesto de siete segmentos que se pueden encender o apagar individualmente. Cada segmento tiene la forma de una pequeña línea. 

Ahora, existen dos diferentes tipos de displays, de ánodo común, y de cátodo común.

  • En los de tipo de ánodo común, todos los ánodos de los leds o segmentos están unidos internamente a una patilla común que debe ser conectada a potencial positivo (nivel “1”). El encendido de cada segmento individual se realiza aplicando potencial negativo (nivel “0”) por la patilla correspondiente a través de una resistencia que límite el paso de la corriente.
  • En los de tipo de cátodo común, todos los cátodos de los leds o segmentos están unidos internamente a una patilla común que debe ser conectada a potencial negativo (nivel “0”). El encendido de cada segmento individual se realiza aplicando potencial positivo (nivel “1”) por la patilla correspondiente a través de una resistencia que límite el paso de la corriente.
Los diagramas de conexión de cada uno son los siguientes:



Como podemos ver, cada línea en el display, corresponde a una letra, y dicha letra es un pin del display, con lo cual podemos hacer una tabla de los diferentes números para cada tipo de display. (Nota: Hay que recordar que para los de cátodo, el pin debe proporcionar corriente positiva (1), y para los de ánodo corriente negativa (0), para encender los segmentos)


Con esta tabla podemos saber con que entradas al display, nos mostrará en la salida el número que deseamos.

Para hacer esto hay dos formas de controlar el display.

  1. Controlarlo directamente desde un microcontrolador. Para esto usariamos 7 salidas del PIC(o 8 si necesitamos el punto decimal). Una salida para cada letra, y así podemos controlar que númeroso mostrar.
  2. Utilizar además del microcontrolador, un circuito TTL que nos ayude a facilitar el control del display, y también nos ahorra salidas. En este caso, ocupariamos solo 4 salidas del PIC, con las cuales representaríamos en números binarios el número que deseamos mostrar en el PIC. Este número binario lo interpretaría el circuito TTL, y lo pasaría al display, encendiendo los segmentos correspondientes a ese número. Para este método, se usa el circuito integrado 7447 para displays de ánodo, y el 7448 para displays de cátodo.

Los diagramas de conexión son los mismos para ambos. La única diferencia es que el 7447 sirve para displays de ánodo y el 7448 para displays de cátodo.Cada salida corresponde a una letra, y esta se conecta a su equivalente en los pines del display. En cuanto a las entradas, el "1" representa la primera cifra binaria, el "2" la segunda, el "4", la tercera, y el "8" la cuarta. Si queremos mostrar otros números, debemos hacer combinaciones de estos. Por ejemplo, si queremos mostrar un 7, tendríamos que dar la salida binaria(desde el PIC) 0111, lo que significaría encender el pin "1", "2", y "4".

                           
Multiplexación de Displays





Al conectar los displays en paralelo, lo que por lógica de hardware debería suceder, es que si deseamos mostrar un número, éste número se mostraría en todos los displays, haciendo prácticamente inútil esta técnica. Pero el "truco", esta en en el defecto que tenemos los humanos en los ojos (persistencia de la retina) en donde nos da la sensación de ver una imagen cuando esta ya ha desaparecido.

Si tenemos un oscilador que nos controla el encendido y el apagado de un led, creando una intermitencia, en el momento que esta sea lo suficientemente rápida ya no apreciaremos que el led llega a apagarse, sino que nos dará la sensación que esta permanentemente encendido. Prácticamente a frecuencias superiores a 30hz ya no apreciamos el parpadeo.

Para controlar esto, además de las salidas que usemos para controlar el display, agregamos una salida más por display, que se conecta al ánodo o al cátodo del display. Así podemos "seleccionar" al display que queremos mostrar un determinado número, y apagar los demás para que no muestren ese número también. Haciendo esto de manera rápida, no se notaría la intermitencia.


Entonces, si queremos mostrar los números 1, 2, 3, 4 en 4 displays conectados en paralelo, el procedimiento sería:

  1. Seleccionar el display 1, y apagar los demás. Mandar las salidas para mostrar el número 1 en el display. 
  2. Esperar poco tiempo(milisegundos o menos), seleccionamos el display 2, y apagamos los demás. Mandamos las salidas para mostrar el número 2 en el display.
  3. Esperamos de nuevo, seleccionamos el display 3 y apagamos los demás. Mandamos las salidas para mostrar el número 3 en el display.
  4. Esperamos, de nuevo, seleccionamos el display 4 y apagamos los demás. Mandamos las salidas para mostrar el número 4 en el display.
Haciendo esto lo suficientemente rápido, el ojo humano no captara el parpadeo de los displays y podremos verlos todos encendidos al mismo tiempo, mostrando cada display un número diferente.


Ejemplo:

Para demostrar esto, usaré lo siguiente:

  • Protoboard.
  • 7 resistencias de 220 Ohms.
  • 4 displays de 7 segmentos de ánodo común.
  • 1 PIC16F628A
  • Cable para conexiones

El diagrama de conexiones:

   (Click en la imágen para ver en tamaño completo)

Nota: (Los Pines 5 y 14 del PIC se omiten por simplicidad, pero estos van conectados a Tierra y Voltaje Positivo respectivamente)

Código en MikroBasic:

program test
'Asignamos puertos para conectarlos al anodo del display para poder
'seleccionar cual deseamos mostrar (4 displays, 4 puertos)
  symbol select4 = PORTA.6
  symbol select3 = PORTA.7
  symbol select2 = PORTA.0
  symbol select1 = PORTA.1
'Arreglo con constantes binarias para poder mostrar cada numero distinto
'Ej. numeros[7] encenderia los segmentos a b y c para mostrar el 7
'(Por ser de anodo, 0 es encendido, 1 apagado)
const numeros as byte[10] = (%01000000, %01111001, 100100, 110000, 011001, 010010, 000010, %01111000, 000000, 011000)
  main:
    TRISB = 0   'Asignamos todos los puertos A y B como salidas
    TRISA = 0
    select1 = 0 'Inicialmente no seleccionamos ningun display
    select2 = 0
    select3 = 0
    select4 = 0
    while TRUE   'Ciclo infinito
      delay_ms(1) 
      select1 = 1   'Seleccionamos el display 1
      PORTB = numeros[1]  'Mostramos el numero 1
      delay_ms(1)    'Damos un delay de poco tiempo entre selecciones
      select1 = 0    'Apagamos el 1
      select2 = 1    'Seleccionamos el 2
      PORTB = numeros[2] ' Mostramos el numero 2
      delay_ms(1)    '....
      select2 = 0
      select3 = 1
      PORTB = numeros[3]
      delay_ms(1)
      select3 = 0
      select4 = 1
      PORTB = numeros[4]
      delay_ms(1)
      select4 = 0
    wend
end.


Video del circuito funcionando



Referencias:

domingo, 11 de marzo de 2012

MPI for Python

MPI for Python

This week for the laboratory I tried to test MPI for python for a better understanding of the MPI functions. This python MPI is easier than the C++ counterpart, it doesn't need to initialize or finalize the MPI, and it also provides tools to check which process I am and how many processes there are. With that, I will explain some easier examples of how those functions work.

Rank, Size, Name

The first code I'll explain is the MPI for Python Hello World in the mpi4py-1.3/demo directory. This code is perfect to understand how the rank, size and name functions work, and it is pretty simple.

Code:


from mpi4py import MPI
import sys

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

sys.stdout.write(    "Hello, World! I am process %d of %d on %s.\n"    % (rank, size, name))

Explanation:


from mpi4py import MPI
import sys

As we know, we first need to import the MPI module, and in this example we also use sys to write in the terminal the output.


size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

Using the  MPI.COMM_WORLD.Get_size() we can get the number of processes executing right now. This number is specified at the moment of the code execution. For example if we run this example like this:

  • The size would be 10, because we specified that we want 10 processes to run hello.py. 
  • The rank is the current processes in execution so we can tell which one is which.
  • And the name is the processor name to identify in which machine the process is running, which would be useful if we're running code in a computer cluster.


sys.stdout.write("Hello, World! I am process %d of %d on %s.\n"% (rank, size, name))

And finally we just write all of the previous data(size, name, rank) to see that this really works. Which should produce an output like this:


Send-Receive

The previous example was good to tell how the rank, size and name functions work, in order to differentiate processes, now lets see how we can use the rank to send data from a process to another. This is a point to point communication between to processes, so there will be no more than 2 involved.

Code: 


from mpi4py import MPI
import sys

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
name = MPI.Get_processor_name()

if rank == 0: 
  hello = "Hello" 
  world = "World!\n"
  comm.send(hello, dest = 1, tag = 1)
  comm.send(world, dest = 1, tag = 2)
elif rank == 1: 
  hello =  comm.recv(source = 0, tag = 1) 
  world = comm.recv(source = 0, tag = 2) 
  sys.stdout.write("%s %s"%(hello, world))

Explanation:


from mpi4py import MPI
import sys


Again, first we import the modules, MPI and sys.


comm = MPI.COMM_WORLD
rank = comm.Get_rank()
name = MPI.Get_processor_name()

Here is pretty much the same as before, but the code is simplified a little saving the MPI.COMM_WORLD contents in the variable comm, so it will be easier to call in order to get the rank, name and later on, the send and receive functions.


if rank == 0: 
  hello = "Hello" 
  world = "World!" 
  comm.send(hello, dest = 1, tag = 1)
  comm.send(world, dest = 1, tag = 2)

So, this will be a point to point communication, so we will need only two processes, and processes start from number 0 onwards, with this condition we make sure that process 0 will run this code, here we define the string hello, and world (I separated it in two, so we can see how processes tell which data is which when they send and receive it). Then the process 0 will send each string separately to the process 1, here we can see each send function has a different tag, this is so we can tell which data is the string hello, and which is the string world.


elif rank == 1: 
  hello = comm.recv(source = 0, tag = 1) 
  world = comm.recv(source = 0, tag = 2)   
  sys.stdout.write("%s %s I am process %d on %s.\n"%(hello, world, rank, name))

Now, process 1 runs this, waits to receive data from the process 0, tagged with 1(string hello) and then it waits to receive data again from 0, tagged with 2(string world). And we print it to see if it really was sent successfully. 

We can run this code with any number of processes, but using more than 2 would be unnecessary so try the following:


Broadcast

To explain the broadcast function I made an example where a string is sent to all processes through broadcast, and then each of them prints that string.

Code:


from mpi4py import MPI
import sys

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
 data = "Hello World!"
else:
 data = None

data = comm.bcast(data, root=1)
sys.stdout.write("Process %s received %s from 0\n"%(rank, data))

Explanation:



from mpi4py import MPI
import sys

As before, we first import the needed modules. MPI for the message passing functions and sys for writing outputs.


comm = MPI.COMM_WORLD
rank = comm.Get_rank()

Again we simplify things passing the contents of MPI.COMM_WORLD to comm, in order to call the rank and broadcast functions using comm.


if rank == 0:
 data = "Hello World!"
else:
 data = None

Then we check if the current process is process number 0, if it is process 0, then the string will be "Hello World!", if not the string will be None. This is so we can see later on how the root in the broadcast function works.


data = comm.bcast(data, root=0)
sys.stdout.write("Process %s received %s from 0\n"%(rank, data))

Finally, we broadcast the string, using process 0 as root, so process 0 will send its contents of the variable data. This will be the string "Hello World!", and running this code should produce the following output:



So if we modify the root from the broadcast function, making it 1 or larger(not bigger than the specified number of processes), that process should send None instead of the string "Hello World", we can see this in the following output:




References:

Wiki Contributions - Week 6

In this week, I finally understood the basics of MPI. Reading examples and modifying them I could make my own MPI programs. Right now I just can do simple stuff, like sending and receiving data, or running parallel stuff, but I'll try to understand more complex things in the near future.

As of today, March 11, the server is down, so I can't upload anything to the wiki right now, but I'll post it in my blog in the meantime, but I'll put it in the wiki when it is available.

The information to the wiki is the following:
For the laboratory I explained on detail the important basic functions used in MPI for Python with some examples.

Future contributions


I'll keep working with more complex things with MPI, but I also want to find out other things in which I can help, but I think I'll find out about that on the meeting.

Nominations

Rafael, for his initiative of joining all of us in a meeting. I plan to attend, providing I have money for wherever they want to met.

Message Passing Interface (MPI)

MPI


Message Passing Interface (MPI) is a standardized and portable message-passing system designed by a group of researchers from academia and industry to function on a wide variety of parallel computers. The standard defines the syntax and semantics of a core of library routines useful to a wide range of users writing portable message-passing programs.

Functions


MPI standard has many functions in it, approximately 125. However, many of the advanced routines represent functionality that can be ignored until one pursues added flexibility (data types), robustness (nonblocking send/receive), efficiency (``ready mode"), modularity (groups, communicators), or convenience (collective operations, topologies). MPI is said to be small because there are six indispensable functions from which many useful and efficient programs can be written.

The six functions are:

  1. MPI_Init(Omitted in python) - Initialize MPI 
  2. MPI_Comm_size - Find out how many processes there are 
  3. MPI_Comm_rank - Find out which process I am 
  4. MPI_Send - Send a message 
  5. MPI_Recv - Receive a message 
  6. MPI_Finalize(Omitted in python) - Terminate MPI

Explanation

MPI_Init. The call to MPI_Init is required in every MPI program and must be the first MPI call. It establishes the MPI execution environment.

 int MPI_Init(int *argc, char ***argv)

 Input:
       argc - Pointer to the number of arguments
       argv - Pointer to the argument vector


MPI_Comm_size. This routine determines the size (i.e., number of processes) of the group associated with the communicator given as an argument.


 int MPI_Comm_size(MPI_Comm comm, int *size)

 Input:
       comm - communicator (handle)
 Ouput:
       size - number of processes in the group of comm


MPI_Comm_rank. The routine determines the rank (i.e., which process number am I?) of the calling process in the communicator.

 int MPI_Comm_rank(MPI_Comm comm, int *rank)

 Input:
       comm - communicator (handle)
 Output:
       rank - rank of the calling process in the group of comm (integer)


MPI_Send. This routine performs a basic send; this routine may block until the message is received, depending on the specific implementation of MPI.

 int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest,
              int tag, MPI_Comm comm)

 Input:
      buf  - initial address of send buffer (choice)
    count - number of elements in send buffer (nonnegative integer) 
    datatype - datatype of each send buffer element (handle)
      dest - rank of destination (integer)
      tag  - message tag (integer)
      comm - communicator (handle)


MPI_Recv. This routine performs a basic receive.

 int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source,
              int tag, MPI_Comm comm, MPI_Status *status)

 Output:
      buf  - initial address of receive buffer 
    status - status object, provides information about message received;
          status is a structure of type MPI_Status, the element
          status.MPI_SOURCE is the source of the message received, 
          and the element status.MPI_TAG is the tag value.
          
 Input:
    count - maximum number of elements in receive buffer (integer)
    datatype - datatype of each receive buffer element (handle)
    source - rank of source (integer)
    tag  - message tag (integer)
    comm - communicator (handle)


MPI_Finalize. This routine terminates the MPI execution environment; all processes must call this routine before exiting.

 int MPI_Finalize(void)


MPI_Bcast. This routine broadcasts data from the process with rank "root" to all other processes of the group.

 int MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root,
               MPI_Comm comm)

 Input/Output:
    buffer - starting address of buffer (choice)
    count - number of entries in buffer (integer)
    datatype - data type of buffer (handle)
    root - rank of broadcast root (integer)
      comm - communicator (handle)


MPI_Reduce. This routine combines values on all processes into a single value using the operation defined by the parameter op.

 int MPI_Reduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype
                datatype, MPI_Op op, int root, MPI_Comm comm)

 Input:
    sendbuf - address of send buffer (choice)
    count - number of elements in send buffer (integer)
    datatype - data type of elements of send buffer (handle)
    op - reduce operation (handle) (user can create using MPI_Op_create
          or use predefined operations MPI_MAX, MPI_MIN, MPI_PROD, MPI_SUM,
          MPI_LAND, MPI_LOR, MPI_LXOR, MPI_BAND, MPI_BOR, MPI_BXOR,
          MPI_MAXLOC, MPI_MINLOC in place of MPI_Op op.
    root - rank of root process (integer)
    comm - communicator (handle)

 Output:
    recvbuf - address of receive buffer (choice, significant only at root )

References:

http://www.eecis.udel.edu/~saunders/courses/372/01f/manual/manual.html

sábado, 3 de marzo de 2012

Sistemas Operativos en los Dispositivos Móviles

Una de las partes más importantes de los dispositivos móviles, y en la que se hará enfoque en este post es el Sistema Operativo. Igual que las computadoras, los celulares poseen un sistema operativo que se encarga de manejar todos los procesos y tareas que el celular realiza. A lo largo del tiempo han existido muchos sistemas operativos para celulares, PDA's y tablets, pero se hará énfasis en los más conocidos.


Sistema Operativo Móvil




(Imágen tomada de: http://www.muymovil.com/wp-content/uploads/2011/03/Sistemas-operativos-moviles-500x360.jpg)


¿Qué hace un Sistema Operativo en los Dispositivos Móviles?


El Sistema Operativo de un dispositivo móvil controla el dispositivo al igual que en las PCs. Sin embargo, los sistemas operativos móviles son mucho más simples y están más orientados a la conectividad inalámbrica, los formatos multimedia para móviles y las diferentes maneras de introducir información en ellos.


Capas de un Sistema Operativo móvil

  • Kernel. El núcleo o kernel proporciona el acceso a los distintos elementos del hardware del dispositivo. Ofrece distintos servicios a las superiores como son los controladores o drivers para el hardware, la gestión de procesos, el sistema del archivos y el acceso y gestión de la memoria.
  • Middleware.  El middleware es el conjunto de módulos que hacen posible la propia existencia de aplicaciones para móviles. Es totalmente transparente para el usuario y ofrece servicios claves como el motor de mensajeria y comunicaciones, códecs multimedia, intérpretes de páginas web, gestión del dispositivo y seguridad.
  • Entorno de ejecución de aplicaciones. El entorno de ejecución de aplicaciones consiste en un gestor de aplicaciones y un conjunto de interfaces programables abiertas y programables por parte de los desarrolladores para facilitar la creación de software.
  • Interfaz de usuario. Las interfaces de usuario facilitan la interacción con el usuario y el diseño de la presentación visual de la aplicación. Los servicios que incluye son el de componentes gráficos (botones, pantallas, listas, etc.) y el del marco de interacción.

Sistemas Operativos Importantes

Android OS

Android es un sistema operativo basado en Linux para smartphones y tablets. Es desarrollado por la Open Handset Alliance liderada por Google. 
Android consiste en un kernel basado en Linux, con su middleware, librerías y APIs escritas en C, y aplicaciones corriendo en un framework de aplicaciones que incluye compatibilidad con librerías de Java basadas en Apache Harmony. La plataforma principal de hardware para android es una arquitectura ARM.
Menú Principal de un Smartphone con Android 4.0
Características:
Las características de Android más actuales son:
  • Almacenamiento. SQLite, una ligera base de datos relacional es usada para almacenar datos.
  • Conectividad. Android soporta tecnologías de conectividad como: GSM/EDGE, IDEN, CDMA, EV-DO, UMTS, Bluetooth, Wi-Fi, LTE, NFC y WiMAX.
  • Mensajería. Android ofrece SMS y MMS como formas de mensajería, incluyendo mensajería con texto enlazado y Android Cloud To Device Messaging.
  • Soporte de Lenguajes. Android ofrece soporte a múltiples lenguajes.
  • Navegador Web. El navegador web disponible en Android esta basado en el motor de código abierto WebKit, combinado con el motor Chrome V8 Javascript. 
  • Soporte para Java. Aunque no existe una JVM(Java Virtual Machine), android ofrece soporte para java compilando las clases en ejecutables Dalvik, y corriendolas en el mismo. Dalvik es una máquina virtual especialmente diseñada para Android y optimizada para dispositivos con bbaterías y con limitada memoria y CPU. Además, soporte para J2ME puede ser proporcionado mediante aplicaciones de terceros.
  • Soporte Multimedia. Android soporta los siguientes formatos multimedia: WebM, H.263, H.264(en contenedor 3GP o MP4), MPEG-4 SP, AMR, AMR-WB(en contenedor 3GP), AAC, HE-AAC( en contenedor MP4 o 3GP), MP3, MIDI, Ogg Vorbis, FLAC, WAV, JPEG, PNG, GIF, BMP.
  • Soporte de hardware adicional. Android puede usar cámaras, pantallas táctiles, GPS, acelerometros, giroscopios, barómetros, sensores de proximidad y presión, termómetros, y demás.
  • Reconocimiento de Voz. Búsquedas de Google mediante la voz están disponibles desde su lanzamiento. Acciones de voz para llamar, escribir, navegar y demás son soportadas en Android 2.1 en adelante.
  • Tethering. Soporte para usar el dispositivo móvil como un punto de acceso Wi-Fi
  • Capturas de Pantalla. Android soporta las capturas de pantalla presionando los botones de Power y Bajar el volúmen al mismo tiempo.
  • Almacenamiento Externo. La mayoría de los dispositivos con Android incluye un slot microSD, y puede leer tarjetas microSD con formato FAT32, Ext3fs, o Ext4fs. 
  • Otras.
    • Multi-touch
    • Bluetooth
    • Multi-Tasking
    • Video llamadas
    • Streaming Multimedia
Symbian OS

Symbian es un sistema operativo diseñado para smartphones. Generalmente, C++ es el lenguaje más usado en la mayoría de los sistemas de Symbian. Pero tambíen hace uso de Python, Visual Basic, OPL y Perl. 

Características:
  • Interfaz de Usuario. Symbian tiene un kit de herramientas para gráficos nativo desde su lanzamiento, conocido como AVKON, diseñado para ser manipulado mediante una metáfora de una interfaz parecida a un teclado, como los teclados mini-QWERTY. 
  • Navegador Web. Las versiones Symbian^3 y anteriores tienen un navegador basado en Webkit.
  • Soporte a múltiples lenguajes. La versión actual de Symbian(Symbian Belle) cuenta con soporte a 48 lenguajes.
  • Desarrollo de Aplicaciones
  • Video Conferencias
iOS


iOS, es un sistema operativo móvil desarrollado por Apple. Originalmente fue desarrollado para el  iPhone, pero se ha extendido para soportar otros dispositivos de Apple como el iPod Touch, iPad y la Apple TV. 

La interfaz de usuario de iOS esta basada en el concepto de la manipulación directa usando gestos multi-touch. Los controles de la interfaz consisten en deslizadores, switch, y botones. La respuesta a la interacción con el usuario es inmediata y provee una interfaz fluida. Las interacciones con el sistema operativo incluyen, dezlizar la pantalla, pulsarla, y otros, todos los cuales tienen definiciones específicas dentro del contexto de iOS y su interfaz multi-touch.

Algúnos dispositivos cuentan con acelerometros internos para responder al movimiento de agitar el dispositivo para tener como resultado voltear la pantalla de lado o girar alguna imagen en tres dimensiones.


Características:
  • Pantalla de Inicio. Muestra los iconos de las aplicaciones en una barra al fondo de la pantalla donde los usuarios pueden anclar sus aplicaciones favoritas. La pantalla de inicio aparece cuando los usuarios presionan el botón home, o cuando se enciende el dispositivo. También muestra información sobre la batería, la hora, y la intensidad de la señal.
  • Carpetas. Cualquier aplicación puede ser arrastrada sobre otra, creando una carpeta, y de ahí en adelante otras más pueden ser arrastradas con el mismo procedimiento. El título es seleccionado automáticamente basándose en el tipo de aplicaciones de su interior, pero puede ser editado por el usuario.
  • Centro de Notificaciones. Las notificaciones se acumulan en una ventana que se puede expandir desde la parte superior de la pantalla. Si el usuario selecciona una notificación, se abrirá la aplicación que envió la notificación.
  • Aplicaciones Incluidas. iOS cuenta con aplicaciones por defecto. Como las siguientes:
    • Teléfono
    • e-Mail
    • Navegador Web. Safari
    • Reproductor de Música y Videos. 
    • Mensajería Instantánea
    • Calendario
    • Cámara
    • Mapas
    • Video llamadas
    • Brújula
    • Control por voz (Siri)
    • Etc.
  • Multitasking. Desde iOS 4.0,  en dispositivos de tercera generación o superiores, multi-tasking es soportado en siete APIs de fondo.
    1. Audio de fondo. Aplicaciones que reproduzcan video o audio continuaran corriendo en el fondo.
    2. Voz sobre IP. La aplicación es suspendida cuando no haya una llamada en progreso.
    3. Localización de fondo. La aplicación es notificada cuando cambia la localización geográfica.
    4. Push Notifications
    5. Notificaciones Locales. La aplicación programa las notificaciones locales que serán entregadas en un tiempo predeterminado.
    6. Terminación de una tarea. La aplicación pide al sistema tiempo extra para terminar una tarea determinada.
    7. Cambio rápido de aplicaciones. La aplicación no ejecuta ningún código y  puede ser removida de la memoria en cualquier momento.
  • Game Center. Game Center es una red social de juegos multijugador en línea desarrollada por Apple. Permite a los usuarios invitar amigos para jugar algún juego, iniciar un juego mediante matchmaking, seguir sus logros y  compararlos con los de los demás jugadores.

Palm OS - Garnet OS


Palm OS/Garnet OS es un sistema operativo móvil inicialmente desarrollado por Palm para su uso en los PDAs( Personal Digital Assistants). Palm OS fue diseñado para uso sencillo mediante una interfaz de usuario basada en touchscreen. Provee aplicaciones básicas para manejo de información personal. Las últimas versiones del sistema operativo tienen soporte extendido con los smartphones. 


Características:
  • Ambiente simple que permite la ejecución de aplicaciones en pantalla completa, con una interfaz común.
  • Pantallas monocromáticas o a color de hasta 480x320 pixeles.
  • Sistema de reconocimiento de escritura a mano(Grafitti 2).
  • Tecnología HotSync para sincronización de datos con computadoras de escritorio.
  • Capacidad de reproducción y grabado de sonido.
  • Modelo de seguridad simple. El dispositivo puede ser bloqueado con un password y el historial de aplicaciones puede ser privado.
  • Acceso a redes TCP/IP.
  • Conexiones seriales, USB, infrarrojo, Bluetooth y Wi-Fi.
  • Soporte a expansión de tarjetas de memoria.
  • Formato de datos estándar definido para las aplicaciones de manejo de información personal, usado para guardar entradas de calendario, direcciones y notas, accesibles por aplicaciones de terceros.
Windows Phone

Windows Phone es un sistema operativo móvil desarrollado por Microsoft, anteriormente fue llamado Windows Mobile. Fue diseñado para su uso en smarpthones y otros dispositivos móviles. 

Se basa en el núcleo del sistema operativo Windows CE y cuenta con un conjunto de aplicaciones básicas utilizando las API de Microsoft Windows. Está diseñado para ser similar a las versiones de escritorio de Windows estéticamente.


Características:
  • Interfaz de Usuario. Presenta una nueva interfaz de  usuario, basado en el sistema de diseño llamado Metro. La pantalla inicial llamada "Start Screen", esta hecha de links a aplicaciones, características, funciones e objetos individuales como contactos, páginas web, etc. Los usuarios pueden agregar sus links, moverlos o borrarlos de esta pantalla. Son dinámicos y se actualizan en tiempo real. Windows Phone también hace uso de tecnología multi-touch para la navegación en el sistema operativo.
  • Reconocimiento de voz. El reconocimiento de voz permite que el habla sea convertido en mensajes de texto y también permite que los mensajes de texto sean convertidos en habla para que puedan ser escuchados.
  • Mensajería. Windows Phone combina la mensajería mediante hilos. Los hilos permiten al usuario de Windows Phone participar con sus contactos en Windows Live Messenger, Facebook chat y los tradicionales mensajes de texto. Los mensajes de texto también pueden ser escritos mediante reconocimiento de voz. 
  • Entrada de texto. Los usuarios ingresan texto mediante un teclado virtual en la pantalla, que tiene una tecla dedicada para insertar emoticons y características para revisión ortográfica y predicción de palabras. Los usuarios pueden cambiar una palabra después de que ésta haya sido escrita tocándola en la pantalla, lo que hará aparecer una lista con palabras similares. Presionar y mantener presionadas algunas teclas revela caracteres similares. Algunos teléfonos también pueden tener teclado físico para entrada de texto.
  • Navegador Web. Windows Phone 7.5 presenta una versión de Internet Explorer Móvil con un motor basado en Internet Explorer 9. Internet Explorer Móvil permite al usuario mantener una lista de las páginas web favoritas y links a las mismas en la pantalla de inicio. El navegador soporta hasta 6 pestañas, las cuales se pueden cargar en paralelo.
  • Contactos. Los contactos son organizados en el "People Hub". Los contactos pueden ser manualmente ingresados en la lista de contactos o importados desde Facebook, Windows Live, Twitter y Linkedln. Existe una sección "What's New" muestra las noticias más recientes y una sección "Pictures" donde se muestran fotos de los contactos. Una sección "Me" muestra el estado actual y el muro del usuario propio en las redes sociales, y permite a los usuarios actualizar su estado.
  • Email. Windows Phone soporta Hotmail, Exchange, Yahoo! Mail y Gmail de forma nativa, y soporta otros servicios mediante los protocolos POP y IMAP. Para  tipos de cuenta nativos, los contactos y calendarios pueden ser sincronizados también. Los usuarios pueden buscar en sus correos usando el asunto, cuerpo, remitente, destinatario como palabra de búsqueda. 
  • Multimedia. Zune para Windows Phone es una aplicación integrada que provee funciones para entretenimiento y sincronización entre Windows Phone y PCs. La experiencia multimedia de Windows Phone esta dividida en dos distintos hubs, "Music + Videos" y "Pictures".
  • Juegos. Xbox Live en Windows Phone provee algunas características de Xbox 360 en dispositivos con Windows Phone mostrando el avatar del usuario en 3D. A través del "Games Hub", los usuarios pueden interactuar con el avatar, ver su puntuación, mandar mensajes a sus amigos en Xbox Live y otras funciones.
  • Búsqueda. Bing es el motor de búsqueda por defecto en los dispositivos con Windows Phone debido a su profunda integración con sus funciones, que también utilizan el servicio de mapa para búsquedas de localizaciones. Aun así, otros motores de búsqueda pueden ser usados.
  • Suite Office. El "Office Hub" organiza todas las aplicaciones y documentos de Microsoft Office. Además provee conjunción entre Windows Phone y la versión de escritorio de Microsoft Office. Word Móvil, Excel Móvil, PoweerPoint móvil, OneNote Móvil y SharePoint Workspace Móvil permite que la mayoría de los formatos de Microsoft Office sean vistos y editados directamente desde un dispositivo Windows Phone.
  • Multitasking. En Windows Phone 7, multitasking esta limitado a las aplicaciones incluidas. Las aplicaciones pueden quedarse corriendo aun cuando no estén a la vista mediante "Agentes Live". En otros casos, las aplicaciones son suspendidas y pueden ser reanudadas rápidamente.

Referencias:

jueves, 1 de marzo de 2012

Reporte 2 - Distribuciones Discretas y Continuas

Mi problema - Ruleta rusa


La ruleta rusa es un juego de azar potencialmente letal, en donde los participantes colocan una bala dentro del revólver, giran el cilindro, colocan la punta del arma en la cabeza, y jalan el gatillo. El juego es llamado así por el supuesto orígen ruso del juego. Es comúnmente jugado por apostadores desesperados, que dan todas sus pertenencias en una apuesta de vida y muerte, además de que también otra gente apuesta para quién sobrevivirá. 



Existen diferentes revolvers con diferentes tamaños de cilindro. Los más comúnes son los de 6 balas, y es el que se usará como ejemplo en este post.



Hay diferentes variaciones del juego, algunas son:
  • Girar el cilindro cada turno. El "jugador" gira el cilindro al iniciar su turno, jala el gatillo, y si sigue con vida el siguiente repite lo mismo hasta que alguna persona muera. De este modo, las probabilidades de que toque una bala y el  jugador muera es de 1/6(asumiendo que el revolver no fallara en disparar), ya que cada vez que se gira el revolver es como si se reiniciara la probabilidad.
  • Girar solo al inicio. Una persona neutral gira el cilindro al iniciar el juego. Y alguno de los jugadores inicia con jalar el gatillo, si sigue con vida, el siguiente jugador jalara el gatillo, y así sucesivamente.Así incialmente el primer jugador tiene 1/6 de probabilidad de morir, el segundo 1/5, el tercero 1/4. Si el arma no ha sido disparada, la probabilidad de morir en el sexto turno sería de 100%. 



Como se puede ver, en el peor caso en cuanto a posición de la bala, el sexto jugador tendría 100% de probabilidad de morir(o de usar la bala de forma creativa, ¿por qué no?).

Se usará la primer variación debido a que es la más justa y sencilla.

Planteamiento

"Si una persona juega ruleta rusa tradicional (con un revólver de 6 balas, usando una sola en el barril, y el barril se gira cada turno), cuál es la probabilidad de morir en el N-ésimo round?"

Distribución Discreta


Las distribuciones discretas son aquellas en las que la variable puede pude tomar un número determinado de valores. Ejemplo: si se lanza una moneda al aire puede salir cara o cruz; si se tira un dado puede salir un número de 1 al 6

Algunas distribuciones de probabilidad discretas son:
  • Distribución binomial
  • Distribución binomial negativa
  • Distribución Poisson
  • Distribución geométrica
  • Distribución hipergeométrica
  • Distribución de Bernoulli
Distribución Binomial

La distribución binomial es una distribución de probabilidad discreta que mide el número de éxitos en una secuencia de nensayos de Bernoulli independientes entre sí, con una probabilidad fija p de ocurrencia del éxito entre los ensayos. 

Por ejemplo:
  • Se lanza un dado diez veces y se cuenta el número X de treses obtenidos: entonces X ~ B(10, 1/6)
  • Se lanza una moneda dos veces y se cuenta el número X de caras obtenidas: entonces X ~ B(2, 1/2)
Pero pensar en esta distribución discreta para mi problema no es algo muy bueno, ya que involucra fallas espantosas en la lógica del mismo, veamos por qué.

En mi problema, esta distribución se podría aplicar para dos cosas:
  1. Para contar el número de veces que sobrevivió una persona en "N" rounds de ruleta rusa jugados. No tiene mucho sentido, ya que en algún momento, la persona moriría, y ya no se debería seguir contando si sobrevivió o no.
  2. Contar el número de veces que una persona "moriría" al jugar "N" rounds de ruleta rusa. Igual que en el anterior, se puede calcular, pero el estudio de lo mismo carece de sentido.
Por lo tanto descartaré la distribución binomial para el problema de la ruleta rusa por no ser convencional, y en su lugar utilizaré la probabilidad geométrica.


Distribución Geométrica


La distribución geométrica es cualquiera de las dos distribuciones de probabilidad discretas siguientes:
  1. La distribución de probabilidad del número X del ensayo de Bernoulli necesaria para obtener un éxito, contenido en el conjunto { 1, 2, 3,...} o
  2. La distribución de probabilidad del número Y = X − 1 de fallos antes del primer éxito, contenido en el conjunto { 0, 1, 2, 3,... }.
Como el planteamiento dice, si buscamos la probabilidad de morir en el N-ésimo round, eso significa que se debió haber sobrevivido N-1 rounds. Dicho eso, lo siguiente se saca por lógica:

p(Probabilidad de Sobrevivir) = 5/6

q(Probabilidad de Morir) = 1 - p = 1/6

Ahora, como obviamente estamos pensando que la probabilidad de sobrevivir siempre será 5/6, es decir que se girará el barril cada turno, para obtener la probabilidad de sobrevivir N rounds simplemente debemos multiplicar esta probabilidad por si misma el número de rounds que se jugará. Entonces la probabilidad de sobrevivir N rounds, es una fórmula simple:

PSobrevivir N juegos(Turno) = p^N

Como se puede ver, la probabilidad va decreciendo conforme aumentan los turnos, esto ya que estamos pensando que siempre se va a reiniciar la probabilidad.

De esta forma podemos saber, cual es la probabilidad de morir al N-ésimo juego, esto usando la fórmula anterior, ya que si murió al N-ésimo juego, entonces el exponente debería ser N-1, y multiplicarlo por la probabilidad de morir al final, de la siguiente manera.

PMorir en el N-ésimo juego(N) = q*p^(N-1)


Como podemos ver, la probabilidad de que este evento suceda es aún más pequeña, ya que la probabilidad de morir en sí es de 1/6.

El código usado para encontrar ésta probabilidad fue el siguiente:


Es el de la clase, pero se le realizo un cambio, ya que como en mi caso deseaba calcular la probabilidad de que la persona sobreviviera N-1 rounds, y muriera al round N, modifique la fórmula para elevar p^(k-1) en vez de q. Es decir, solo cambie el orden de p y q en la fórmula. Además cambie de lugar el contador para comenzar desde 1, nada fuera de lo común.


Distribución Continua


Las distribuciones continuas son aquellas que presentan un número infinito de posibles soluciones.

Ejemplo: El peso medio de los alumnos de una clase puede tomar infinitos valores dentro de cierto intervalo (42,37 kg, 42,3764 kg, 42, 376541kg, etc); la esperanza media de vida de una población (72,5 años, 7,513 años, 72, 51234 años).

Busqué distribuciones continuas que se comportaran en una gráfica de manera similar a la mia, en esto encontre la Distribución Exponencial.

Distribución Exponencial


La distribución exponencial es el equivalente continuo de la distribución geométrica discreta. Esta ley de distribución describe procesos en los que:

  • Nos interesa saber el tiempo hasta que ocurre determinado evento, sabiendo que,
  • el tiempo que pueda ocurrir desde cualquier instante dado t, hasta que ello ocurra en un instante tf, no depende del tiempo transcurrido anteriormente en el que no ha pasado nada.
Ejemplos de este tipo de distribuciones son:

  • El tiempo que tarda una partícula radiactiva en desintegrarse. El conocimiento de la ley que sigue este evento se utiliza en Ciencia para, por ejemplo, la datación de fósiles o cualquier materia orgánica mediante la técnica del carbono 14, C14.
Ahora esto en mi problema no es posible enunciarlo, ya que el tiempo NO es realmente un factor en la ruleta rusa, no importa lo mucho que esperes, no afectara si te toca bala o no. Pero es la única manera posible de que encontré de modelarlo matemáticamente de forma discreta a continua.

Buscando sobre la distribución continua, encontré que la funcion densidad de la probabilidad se comporta de la misma manera que mi gráfica en forma geométrica, como se puede ver enseguida.

Exponential distribution pdf.png

Viendo esto, procedí a reemplazar en el código pasado, la fórmula para calcular la probabilidad, con la fórmula para calcular la densidad de la probabilidad, que es la siguiente:

\begin{displaymath}{
\mbox{\fbox{$\displaystyle
f(x) =
\lambda e^{-\lambda x} \mbox{si } 0<x
$ } }
}
\end{displaymath} 

El nuevo código es el siguiente:




Lambda en sí es una variable aleatoria, e intente usar diferentes lambdas para ver el comportamiento de la gráfica, tuve algunos resultados como los siguientes:



Aquí como se puede ver, la gráfica no se asemeja a su forma discreta, por lo tanto intente aumentar el valor, con nada de éxito. Pero al disminuirlo, note que la gráfica se asemejaba más y más al su versión discreta. Fue entonces cuando note que en la gráfica anterior, la función tocaba el eje y, cerca de .18. Por lo tanto eso fue lo que le di de valor a lambda, y eureka, la gráfica quedo exactamente como su versión discreta, como se puede ver.


Referencias:

Wiki Contributions - Week 5

For this week, I searched a little about sockets in order to program a client-server instance of mergesort in python. At first the script just accepted a single client, which wasn't any good, but later on after reading a little bit about sockets I realized the problem was just that, I had the accept routine before the server script entered the loop, so it wouldn't accept any more clients.

Anyway the script is in the wiki, I tried to comment it the most I could so it would be understandable, but it is not very difficult to understand

For the laboratory, I made this post explaining personally my python client-server mergesort:



Future Contributions

I've been also working with MPI for Python but until now I don't have any good results to share, so I will keep on trying with that.

Nominations


- Juan Carlos and Cecilia