31 de marzo de 2012

Hardware Móvil: Restricciones y Posibilidades

Ingeniería de Dispositivos Móviles
Laboratorio: Publicación 3

¿A qué me refiero con dispositivo móvil?


Una definición que puede quedar un tanto confusa pero nos da una idea más cercana de lo que es un dispositivo móvil, es aquel micro-ordenador que es lo suficientemente ligero y que no tenga dimensiones exageradas como para lograr ser transportados por una persona.

Estos disponen de una carga de batería suficiente para funcionar de forma autónoma, pero el uso de ciertas aplicaciones como son los juegos suelen reducir la carga de la batería al estar mucho tiempo en uso.

Normalmente un dispositivo móvil es una versión pequeña y restringida en funcionalidades de los ordenadores portátiles o de sobremesa. Y cabe mencionar que las netbook y notebook no son consideradas como dispositivos móviles, por el hecho de consumir más batería y suelen ser más pesados de lo que una persona espera lograr cargar sin incomodidades y suelen ser difíciles de transportar.


Ventajas y desventajas


Hablando de dispositivos móviles podemos mencionar algunas ventajas y desventajas de los mismos. Aquí menciono algunas que están a mi consideración.

Ventajas
  • Conectividad
  • Facilidad de transporte
  • Aplicaciones gratuitas para la mayoría de las plataformas
Desventajas
  • Tamaño de la pantalla
  • Precio de los dispositivos
  • Durabilidad del hardware

De las ventajas:

Conectividad
Son muy buenos con la conectividad, ya que es el recurso más usado en un móvil para la transmisión de datos, ya sea de un dispositivo a otro o para envió o recepción de información desde internet.

Facilidad de transporte
A pesar de que el tamaño de los teléfonos móviles actuales son ligeramente más grandes que los usados hace unos 5 años, debido a que se había llegado al punto de solo ser usados para llamadas y estos eran pequeños y delgados, y ahora por el incremento de componentes se han aumentado un poco en tamaño, aún así son muy fáciles de transportar, ya que el peso de ellos no suele sobrepasar los 200 gramos, y cargarlo en la bolsa del pantalón suele ser cómodo.

Uso de aplicaciones
Los sistemas de mayor auge como iOS, Android y BlackBerry de RIM, proveen de una gran cantidad de aplicaciones gratuitas y descargables en los diferentes dispositivos, que incrementan las funcionalidades básicas de uno de estos teléfonos inteligentes, ya sea desde juegos hasta herramientas de uso cotidiano.

Especificaciones técnicas


Un dispositivo móvil, refiriéndome a un teléfono inteligente, en nuestros días es cada vez más común ver que la gente los adquiere por la gran cantidad de tecnología que uno puede cargar en el bolsillo.

Estos se caracterizan por tener ciertos componentes que hacen que estos tengan una gran cantidad de funciones, y listo aquí algunas de las más sobresalientes de móviles de reciente tecnología.

  • Tienen un CPU encargado de manejar procesos a ya más de 800MHz.
  • Un GPU para visualizar la pantalla gráfica.
  • Conectividad por 3G, WiFi y Bluetooth
  • Receptor de radio FM
  • USB switch para conectar a la computadora
  • De una a dos cámaras, frontal para videollamada y trasera para fotos

Sensores:
  • Barómetro, sensor de presión
  • Giróscopo, para juegos y más
  • Brújula, que se muestra de forma digital en mapas
  • Sensor táctil capacitivo para la pantalla

Y existen algunos con muchas más cosas que las que menciono aquí, pero esto ya depende de cuanto se pague por ellos. Digamos que los mencionados anteriormente suelen estar incluidos en teléfonos de gamma media, es decir, con un precio moderado y con una buena cantidad de tecnología.

Referencias:
Dispositivos Móviles y Multimedia - César Tardáguila Moro

30 de marzo de 2012

API, SDK & IDE

Ingeniería de Dispositivos Móviles
Laboratorio: Publicación 2
En muchas ocasiones estos tres términos son confundidos, inclusive para algunos estos tres son lo mismo, lo cual no es así, por lo más que se puedan llegar a relacionar, son cosas con diferencias significativas y vamos a ver que es cada una de estas tres.

API


Las sigla API proviene del inglés Application Programming Interface, que al español lo traducimos como Interfaz de Programación de Aplicaciones. Una API es un conjunto de funciones y procedimientos que nos ofrece una biblioteca o librería para ser utilizada como capa de abstracción, donde el programador hace uso de ellas para desarrollar una nueva aplicación con los recursos que la API nos ofrece.

La interfaz de programación es una herramienta excelente para lograr comunicar directamente con los componentes del software del sistema operativo, que a la vez estos pueden hacer uso del hardware disponible en el dispositivo. Se trata del conjunto de llamadas a ciertas bibliotecas que ofrecen acceso a ciertos servicios desde los procesos y representa un método para conseguir abstracción en la programación, generalmente entre los niveles o capas inferiores y los superiores del software.

Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general, por ejemplo, para dibujar ventanas o iconos en la pantalla. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio.

AL elegir una cierta API hay que tomar en cuenta que se debe llegar a un cierto equilibrio entre la potencia, simplicidad y pérdida de flexibilidad.


Imagen de la página de la API de Blogger, para la obtención de información mediante JSON.

SDK


Es generalmente un conjunto de herramientas de desarrollo de software que le permite al programador crear aplicaciones para un sistema concreto, por ejemplo ciertos paquetes de software, frameworks, plataformas de hardware, computadoras, videoconsolas, sistemas operativos y más.

Un programador suele recibir el SDK del desarrollador del sistema para el que se está escribiendo el programa. Incluso, a veces el SDK puede descargarse de Internet. De hecho, muchos SDKs se distribuyen gratuitamente para animar a los desarrolladores a usar el sistema o el lenguaje.


La imagen muestra el panel de descarga para los paquetes de las diferentes versiones de SDK para la plataforma de Android.

IDE


El entorno de desarrollo integrado, IDE, es un programa informático compuesto por un conjunto de herramientas de programación. Puede dedicarse en exclusiva a un solo lenguaje de programación o bien poder utilizarse para varios.

Un IDE es un entorno de programación que ha sido empaquetado como un programa de aplicación, es decir, consiste en un editor de código, un compilador, un depurador y un constructor de interfaz gráfica.

Los IDE proveen un marco de trabajo amigable para la mayoría de los lenguajes de programación tales como C++, PHP, Python, Java, C#, Delphi, Visual Basic, etc. En algunos lenguajes, un IDE puede funcionar como un sistema en tiempo de ejecución, en donde se permite utilizar el lenguaje de programación en forma interactiva, sin necesidad de trabajo orientado a archivos de texto.

Los componentes que distinguen a un IDE son:
  • Editor de texto
  • Compilador
  • Intérprete
  • Depurador
  • Uso de clientes
  • Un sistema de control de versiones
  • Factibilidad para ayuda en la construcción de interfaces gráficas de usuario

Eclipse como ejemplo de IDE, y que nos permite crear un puente de este con la SDK de Android para poder crear y ejecutar aplicaciones desde esta interfaz.

Conclusiones


Una API es una interfaz con la que es posible acceder a recursos brindados por un sistema mayor, como en el caso de la API de Blogger, te dan métodos para obtener el flujo de datos directo de sus servidores, y este no depende de un lenguaje en específico de programación para obtenerlo, ya que se puede hacer uso de esta API desde PHP, Java, Go, JavaScript o Python.

El SDK en cambio suele estar creado para un lenguaje en particular, ejemplo de ello el SDK de Facebook disponible en PHP y JavaScript, y con el se pueden hacer uso módulos o funciones para tareas específicas que sean parte de un nuevo programa.

Y el IDE es una plataforma completa, comúnmente con interfaz gráfica que nos permite escribir código, diseñar aplicaciones, compilar, depurar, ejecutar y con gran secciones de ayuda. Eclipse es un buen ejemplo de ello, por ser el que en esta materia estamos usando la mayoría, y uno que también llegamos a usar fue el DevC++.

Bibliografía
Diferencia API y SDK
SDK
IDE

29 de marzo de 2012

Week 8

Distributed and Parallel Systems
Contribution: Week 8
Investigué algo para la posible opción de aplicación para nuestro cluster. Se trata de hacer un pronóstico del tiempo, el cual es comúnmente procesado por supercomputadoras que ayudan a analizar gran cantidad de datos y relaciones entre ellos para dar un estimado del futuro clima o cambio climático.

Enlace al wiki: Clima

28 de marzo de 2012

Plan de Proyecto

Ingeniería de Dispositivos Móviles
Plan de Proyecto
Plan de Proyecto - Dispositivos Móviles

27 de marzo de 2012

Sistema Caótico

Modelado y Simulación de Sistemas Dinámicos
Trabajo en Clase

Crecimiento de Población


Desde la siguiente página podemos ver la formula para conocer la evolución de la población, y nos permite cambiar el numero en las variables para ver los cambios que se producen.

The Logistic Map

Yo seleccione ciertas cantidades y aquí esta la gráfica generada desde la página web.


Ahora la tarea es crear un programa que incluyendo la formula propuesta, creemos una gráfica idéntica. Yo use octave para crear una función que haga eso, y en un archivo de texto plano guarde los datos que serán graficados.

Este es el código de mi programa.


Para generar la gráfica use gnuplot. Para eso cree un archivo con las instrucciones necesarias para la generación de la gráfica en un formato eps.


Y al cargar esas instrucciones en gnuplot, podemos ver como quedó la gráfica generada.


La gráfica es evidentemente igual que la generada por la página. Lo que nos hace saber que esto es un sistema caótico, lo comprobamos al cambiar el valor de L en la página o en nuestro código, y así veremos que con un pequeño cambio, que podría parecer insignificativo, la gráfica cambia drásticamente.

Páginas con contenido relacionado
Teoría del Caos
Método de Caos
Logistic

8 de marzo de 2012

Week 6

Distributed and Parallel Systems
Contribution: Week 6
Last week I was working in the Send File code, I changed the part of the clients and accept to many clients at the same time with threads and send the same file to several clients.

For this week I'm doing a quicksort in parallel.

Link to the wiki: (NULL)

Parallel Quicksort


Quicksort is a divide and conquer algorithm. Quicksort first divides a large list into two smaller sub-lists: the low elements and the high elements. Quicksort can then recursively sort the sub-lists.

The steps are:
* Pick an element, called a pivot, from the list.
* Reorder the list so that all elements with values less than the pivot come before the pivot, while all elements with values greater than the pivot come after it (equal values can go either way). After this partitioning, the pivot is in its final position. This is called the partition operation.
* Recursively sort the sub-list of lesser elements and the sub-list of greater elements.

The base case of the recursion are lists of size zero or one, which never need to be sorted.


Like merge sort, quicksort can also be parallelized due to its divide-and-conquer nature. Individual in-place partition operations are difficult to parallelize, but once divided, different sections of the list can be sorted in parallel. The following is a straightforward approach: If we have P processors, we can divide a list of N elements into P sublists in O(n) average time, then sort each of these in average time.

One advantage of this simple parallel quicksort over other parallel sort algorithms is that no synchronization is required, but the disadvantage is that sorting is still O(n) and only a sublinear speedup of O(log n) is achieved. A new thread is started as soon as a sublist is available for it to work on and it does not communicate with other threads. When all threads complete, the sort is done.

This is the code. I will put this in the wiki.
#include <stdio.h>
#include <stdio.h>
#include <pthread.h>

int acomodar(int *v, int b, int t) {
  int i;
  int pivote, valor_pivote;
  int temp;

  pivote = b;
  valor_pivote = v[pivote];
  for (i=b+1; i<=t; i++){
    if (v[i] < valor_pivote){
      pivote++;
      temp = v[i];
      v[i] = v[pivote];
      v[pivote] = temp; 
    }
  }
  temp = v[b];
  v[b] = v[pivote];
  v[pivote] = temp;
  return pivote;
}

void *quick(int* v, int b, int t) {
  int pivote;
  int th;
  pthread_t thread1, thread2;
  if(b < t) {
    pivote = acomodar(v, b, t);
    th = pthread_create(&thread1, NULL, quick(v, b, pivote-1), NULL);
    th = pthread_create(&thread2, NULL, quick(v, pivote+1, t), NULL);
    pthread_exit(NULL);
  }
}

int main(int argc, char** args) {
  int arreglo[100];
  int i;
  for (i=0; i<100; i++) {
    arreglo[i] = rand()%10000;
  }

  quick(arreglo, 0, 99);
  for (i=0; i<100; i++) {
    printf("  %d", arreglo[i]);
  }
  printf("\n");
}

Comparison BubbleSort vs. QuickSort


I like this video because we can see how QuickSort is faster than the BubbleSort. Imagine quicksort in parallel, two robots helping to compare at the same time.


Nominations:
No one

Links
Quicksort
Divide y Vencerás
Quicksort in neoteo
Quicksort in Wikipedia

6 de marzo de 2012

Tarea: Lenguaje Ensamblador

Cómputo Integrado
Tarea Intro

Definición


"El lenguaje ensamblador es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores, y otros circuitos integrados programables."

Un programa utilitario llamado ensamblador es usado para traducir las líneas del lenguaje ensamblador al código de máquina de la computadora en que se trabaja. El ensamblador realiza una traducción más o menos isomorfa desde las líneas hasta las instrucciones y datos de máquina.

Características principales del lenguaje ensamblador:
  • Existe una cierta dificultad de entender el código ya que es muy cercano al lenguaje máquina.
  • Tiene poca portabilidad, ya que depende del microprocesador.
  • Códigos bien estructurados suelen ser más rápidos y suelen usar menor memoria.

Ejemplo sencillo


Como la mayoría de mis compañeros, yo también hice primero algunas pruebas de ejemplos muy pequeños de código en C, para después pasarlos a ensamblador y ver el código que se generaba.

Y como normalmente hacemos todos, me dispuse a hacer el "Hola Mundo".


Después de haber generado el código en C, lo primero que hice fue probar si funcionaba correctamente, por lo tanto lo compile, como ya todos sabemos, de la siguiente forma.
esteban@presario:~/Documents/ensamblador$ gcc hola.c -o hola
Y luego ejecute para ver la impresión.
esteban@presario:~/Documents/ensamblador$ ./hola
Hola Mundo!
esteban@presario:~/Documents/ensamblador$
Ahora que ya sabía que si hacía lo que debía, pase el código de C a ensamblador desde la terminal.
esteban@presario:~/Documents/ensamblador$ gcc -S hola.c
Lo cual generó el siguiente archivo con lenguaje en ensablador.


Y así como este ejemplo anterior probé con algunos otros más, y puse el anterior para explicar de alguna forma como obtener el código ensamblador.

Programa un poco más complejo


Desde hace mucho que ya tenía pensado hacer mi tarea del programa en C para obtener el factorial, cuando le di un vistazo a los demás blogs vi que Juan Carlos ya había hecho el factorial, aunque el lo hizo en forma recursiva, también Pedro Miguel hizo el ejemplo del factorial, pero aproveche que nuestro código en C no era el mismo para poder hacer también el mio del factorial, él usaba iteraciones diferentes y condiciones que que yo no necesite, por lo que considere que era suficientemente diferente como para que no fuera a ser tomado como copia.

El siguiente es el código que cree en C.


Luego con lo siguiente, pase el código a ensamblador.
esteban@presario:~/Documents/ensamblador$ gcc -S fact.c
Y me generó lo siguiente.


El código tiene 57 líneas para obtener el resultado del factorial, y el siguiente es el código minimizado a 41 líneas. Ahí mismo deje los comentarios que explican cada línea.


Luego lo siguiente.
esteban@presario:~/Documents/ensamblador$ gcc factorial.s -o factorial
esteban@presario:~/Documents/ensamblador$ ./factorial
Numero: 5
Factorial: 120
esteban@presario:~/Documents/ensamblador$ ./factorial
Numero: 7
Factorial: 5040
esteban@presario:~/Documents/ensamblador$ 

Y eso fue lo que hice como tarea de ensamblador, pero para completar un poco más, hice un programa que es sencillo, pero empece desde cero y sin necesidad de crear primero el código en C.

Programa que empecé desde cero

Este programa lo que hace al momento de ejecutarse, es pedirte un valor, la cual estaba pensando en que se ingrese una calificación de entre 0 y 100, y si es mayor o igual a 70 te dice "Vamos bien" y si es menor a 70 te dice "El payaso viene por ti".



No puse los comentarios de este último código en ensamblador, pero espero poder explicarlo en clase.

Documentos y páginas consultadas
Explicación de las directivas
Tabla de referencia de instrucciones en ensamblador
Lenguaje ensamblador