Sunday, December 13, 2009

Your cellphone can tell me what you did last summer

Our cellphones are nowadays an item, which we are very much accustomed to bringing along to every single place we go to. They are also devices that are very similar to little computers with multiple sensors and interaction modalities, they are equipped with GPS, Bluetooth, accelerometers, cameras, microphones,magnetometers,keyboards, and touch-sensitive displays,they also have great computation power and memory,graphics capabilities, and various communications capabilities.
All of these elements aside from providing a novel multi modal user interface experience give the means through which cellphones are a perfect device for tracing human activity. With all of the cellphone's sensors, one can obtain a collection of data, that is related with what a person did through out the day, then by using data-mining algorithms one can infer human relationships and behaviors, this is often refereed to as Reality Mining. The MIT Media Lab gives a far more formal definition of what Reality Mining is: "...R.M defines the collection of machine-sensed environmental data pertaining to human social behavior..."



The problem that is currently being faced is to understand exactly how the joint use of multiple modalities,like for example location and proximity to others, help understand a person’s routines. It is important to point out that many issues actually arise when one wishes to understand patterns in the life of an individual. It is not simple to automatically infer a person's activities as well as efficiently represent them . For example, having a stay home alone Thursday and a Thursday of Beer Hotness with friends at your place define entirely different social situations, yet they could be considered identical from the sole perspective of location. It is thus very important to have detailed descriptions of the activities done by a person for characterizing the users and their habits.

The big impact that reality mining has on us, is that it is able to create models of individual as well as group behavior from the recollected data, this could enable smart personal assistants, as well as monitoring of personal and community health.

References:
http://reality.media.mit.edu/
http://docs.google.com/fileview?id=0B4gV5GYvQzR1NjA2YmVkODMtZGMwYi00MjBjLTg0NDgtNDYzYzU5YjI0N2Zm&hl=en
http://docs.google.com/fileview?id=0B4gV5GYvQzR1YjVkZmM0N2QtYzM3ZC00NGYzLTg0OTMtYTA2ZTFjNGZhOWIz&hl=en

http://docs.google.com/fileview?id=0B4gV5GYvQzR1NTliNmYxM2MtNzM0Mi00NTViLWE2OGEtYzgzNjEzNzc3NWY1&hl=en

http://docs.google.com/fileview?id=0B4gV5GYvQzR1Y2I1MjA1ZjAtMjNhYy00MmFhLWFlZjQtMDBkMGM2YTk3NWMy&hl=en

Wednesday, November 11, 2009

Creando tus propios programas de multimedia en la tablet del n900

Ya tengo por fin mi nuevo telefono!!
Muchas gracias a mi querida universidad, la cual para una de las materias que estoy llevando consiguió una donación de nokia y nos regalaron a todos los alumnos un n900!
Las cosas sí que han sido ahora divertidas =)

Anyway,hoy hablaremos acerca de como utilizar gstreamer dentro del celular para poder hacer lindos programitas que puedan involucrar musica o incluso video! =)
Para empezar es importante entender lo que es Gstreamer y como es que nos ayuda a hacer applicaciones multimedia.
Gstreamer es un framework de multimedia que te ayuda a crear, editar y tocar multimedia al construir unos "pipelines" (como líneas de ensamblaje) que poseen elementos de multimedia. Simplemente se crea un pipeline, la cual posee muchos elementos que entre sí permiten que la musica se pueda tocar o que un video se pueda ver. Funciona de un modo muy similar a como son las líneas de ensamblaje en Linux/BSD/UNIX.

Con Gstreamer se atan a los elementos entre sí, y cada elemento lleva acabo algo en particular. Para demostrar esto, en una terminal escribe lo siguiente:
foo@bar:~$ gst-launch-0.10 filesrc location=jeans-ilusion_primer_amor.mp3 ! decodebin ! audioconvert ! alsasink


Cuando la línea anterior se corre, se escucha de pronto la grandiosa melodía de "...ni lo amigos saben que es lo que me paaasa,(...)con la ilusión del primer amor desesperado te amoooo..." ...ah good times ñ_ñ.
El comando gst-launch-0.10 se puede utilizar para correr pipelines de GStreamer y cada elemento esta ligado entre sí mediante el símbolo !. Puedes pensar que el ! es similar al pipe | que usas en la línea de comandos normalmente.
Ahora bien, como se pueden dar cuenta tenemos una serie de diversos elementos dentro de la línea de ensamblaje, estos son:
* filesrc – Este elemento permite cargar archivos que esten dentro del disco duro. Al ladito de este elemento se debe poner la dirección y el archivo que se quiere cargar
* decodebin – Necesitamos algo para poder descifrar al archivo que se acaba de cargar. Este elemento detecta el tipo de archivo con el cual deseamos trabajar y construye un elemento que lo decifrará.
* audioconvert – El tipo de información que posee u archivo de sonido y el tipo de información que necesitamos salga de las bocinas son diferentes, así que usamos a este elemento para hacer un buen mapeo entre lo que se tiene en el archivo de sonido y lo que se escuchará.
* alsasink – Este elemento escupe todo el audio a tu tarjeta de sonido usando ALSA.

Me parece que ya es claro que Gstreamer trabaja como un línea de ensamblaje, cada elemento le da como entrada al siguiente elemento su salida.
Ya que nos es claro que pex con Gstreamer, haremos ahora un pequeño código en C para probarlo.
Haremos un pequeño hola_mundo.c para Gstreamer. Desde la línea de comandos diremos que queremos que se toque y deberíamos posteriormente escuchar la cancioncita =)
El código, que usaremos es el siguiente:

#include gst/gst.h
#include stdbool.h

static GMainLoop *loop;

static gboolean bus_call (GstBus *bus,GstMessage *msg, gpointer user_data)
{
switch (GST_MESSAGE_TYPE (msg))
{
case GST_MESSAGE_EOS:
{
g_message ("End-of-stream");
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_ERROR:
{
gchar *debug;
GError *err;
gst_message_parse_error (msg, &err, &debug);
g_free (debug);
g_error ("%s", err->message);
g_error_free (err);
g_main_loop_quit (loop);
break;
}
default:
break;
}

return true;
}

void play_uri (gchar *uri)
{
GstElement *pipeline;
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_element_factory_make ("playbin", "player");
if (uri)
{

g_object_set (G_OBJECT (pipeline), "uri", uri, NULL);
}

{
GstBus *bus;

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, NULL);
gst_object_unref (bus);
}

gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);

g_main_loop_run (loop);

gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
}

int main (int argc,char *argv[])
{
gst_init (&argc, &argv);

play_uri (argv[1]);

return 0;
}



hmmm...creo que no tengo mucho tiempo de explicar el código...
Pero para compilarlo y probarlo, en la consola escriban:

gcc -Wall -g gstreame.c `pkg-config --cflags gtk+-2.0 gstreamer-0.10 gmodule-2.0` -o gstreame `pkg-config --libs gtk+-2.0 gstreamer-0.10` `pkg-config --libs gmodule-2.0`


Ahora bien, si lo quieren probar en su tablet de n900, lo que deben hacer es abrir su scratchbox, utilizar el target u objetivo de ARMEL, ( se pueden cambiar a ese objetivo escribiendo desde scratchbox: sb-conf se FREMANTLE_X86) y desde allí compilar el archivo, una vez que se tenga compilado, mediante scp pasaremos el binario a nuestro celular y ese binario será lo que correremos.
Para pasarlo a nuestra tableta de n900, es necesario primero saber el ip de nuestro celular, para hacerlo nos vamos al menu de applicaciones y hay un ícono que dice: More, ó Más, ó Mehr, dependiendo del idioma en que lo tengan configurado, dentro de ese ícono existe una ventanita negra, llamada X terminal, lo abrimos y tendremos la consola del celular! Allí simplemente escribimos ifconfig y apuntamos la dirección ip que se nos muestra.
Ahora,desde nuestra PC en scratchbox en el target de ARMEL escribimos:

scp gstreame user@192.168.0.12:


en donde gstreame es el binario que queremos pasar a nuestra tableta y 192.168.0.12 es la dirección IP de nuestro celular.
Para correrlo en la tableta n900, desde la consola X escribimos:

./gstreame "file://$PWD/test.wav"


En donde test.wav es el archivo que se escuchará. Es necesario escribirlo de esta forma debido a que el programa recibe una URL.
Y con esto, ya hemos ehcho un pequeño programa que toca musica desde nuestro n900!

Los dejo con un videito casero malo que hice,(non-ameteur porn) que muestra mi nuevo smart phone tocando una estación alemana, oh sí! el programa como recibe URI puede tocar estaciones de radio!! =)
Felices Hackeos!




Refrencias:
http://wiki.forum.nokia.com/index.php/GStreamer#
http://bluwiki.com/go/GStreamer/C_Hello_World
http://www.jonobacon.org/2006/08/28/getting-started-with-gstreamer-with-python/

Sunday, October 18, 2009

¡¡¡Quiero ver las fotos de mi amorcino desde mi celular!!!

Siendo que recibí muchas peticiones al respecto, he decido que expondré como hacer otra pequeña aplicación para el nokia n900.
Hoy expondré cómo hacer un programa para visualizar imágnes.
La dinámica es muy sencilla, el usuario en un textbox escribirá la dirección de la imágen que se desea visualizar y la aplicación buscará la imágen y la desplegará.

En el post anterior habia explicado como se podía hacer un pequeño hola_mundo.c para nuestro celular nokia n900, usaremos este mismo principio para hacer esta aplicación.
Para hacer la parte gráfica usaremos GTK. Quien necesite más ayuda en entender que demónios es GTK, recomiendo esta lectura.
Lo primero que haremos es el programa en C. Antes de emepzar el código, sería importante explicar como se manejan los eventos con GTK. Cuando digo eventos, me refiero al hecho de que el usuario oprima un botón por ejemplo. Cuando sucede algo así, debemos tener alguna manera de poder detectar que eso sucedió, y de decir, hmm el usuario oprimió el botón de enviar, entonces quiero, por ejemplo, leer lo que el usuario escribió en el textbox, y procesar después esa información.
Con GTK para poder hacer esto, lo que debemos hacer es conectar las señales que envía el botón (señales de que ya fue oprimido) con alguna función que hará lo que deseamos que suceda cuando se oprima ese botón. La función g_signal_connect, logra esto.
La funcion recibe los siguientes parámetros:
g_signal_connect(Objeto_Que_Emite_Las_Señales,tipo_de_señal_a_detectar,funcion_que_procesará_la_info,variable_a_procesar_en_la_funcion).
En este caso, esa función, nos quedaría de la siguiente manera:
g_signal_connect (G_OBJECT(button), "clicked",G_CALLBACK (on_button_clicked),&valorcitos);

En donde on_button_clicked, es la función que procesará que se hará cuando se oprima el botón.Y valorcitos, es de hecho una estructura que guardará todos los valores que queremos modificar en la función cuando se oprima el botón. En este caso, se escojió una estructura, porque en sí, sólo se puede enviar una variable a la función de on_button_clicked. Pero en este caso, necesitamos minímo enviar dos: la variable de tipo imagen, y la variable de tipo textbox, pues necesitamos leer lo que el usuario escribió, y dependiendo de eso, desplegar la imagen adecuada.

Resumiendo...Nuestro código nos quedaría de la siguiente forma:(Disculpen que los comentarios esten en inglés,no sé que me está sucediendo que programo ya con comentarios en inglés..:-(



/*
Program that displays a desired image
specified by the user.
by:saiph*/

#include stdlib.h/* EXIT_* */
#include stdio.h
/* Introduce types and prototypes of GTK+ for the compiler. */
#include gtk/gtk.h

/*This struct will store some of the variables that will be modified when the user clicks the button */

struct values
{

GtkWidget *image;
GtkWidget *entry;
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *label;
};

/*The function that will say what will happen when the user clicks the button, user_data stores the variables that we need to retrive from the main
function to play around with.
*/
G_MODULE_EXPORT void on_button_clicked(GtkButton *object, gpointer user_data)
{

gchar * name_file; /*gchar will store the name of the image that we wish to display*/
struct values *valorcitos;
valorcitos=user_data;/*we obtain a struct that stores the needed variables.*/

// we read the name of the image that the //user wants to display
name_file=(gchar*)gtk_entry_get_text(GTK_ENTRY
(valorcitos->entry));


/* we check to see if the image exists.
If it does, we will display it!=)
If not, we will print a label that says it doesn't */

if(g_file_test(name_file,
G_FILE_TEST_EXISTS))

{
/*The image exists, we will first remove the previous image we had*/
gtk_container_remove(GTK_CONTAINER
(valorcitos->vbox),valorcitos->image);

g_print ("File found it is %s. \n",name_file);
/*We read and assign the desired image to our variable image*/
valorcitos->image=
gtk_image_new_from_file((gchar*)
name_file);

/*We remove the pervious label we had, since it would say that
the image was not found. */
gtk_container_remove(GTK_CONTAINER
(valorcitos->table),valorcitos->label);

/*We set the adequete value for our lable*/
valorcitos->label = g_object_new(GTK_TYPE_LABEL,
"label", "Ex:pumas.jpg or pics/1.jpg",
NULL);
/*we place our lable adequetely where it belonged*/
gtk_table_attach_defaults((GtkTable * )valorcitos->table,valorcitos->
label,0,1,2,3);

/*we show our lable*/
gtk_widget_show(valorcitos->label);
/*we place the image where it belongs*/
gtk_box_pack_start(GTK_BOX(
valorcitos->vbox),(valorcitos->image),FALSE, FALSE,0);

/*we show our image*/
gtk_widget_show(valorcitos->image);

}

/*the image that the user wanted to see was
not found*/
else
{
g_print ("File not found. \n");
/*we remove the lable we had, since we wnat to tell the user that the image was not found*/
gtk_container_remove(GTK_CONTAINER(
valorcitos->table),valorcitos->label);

/* we prepare the lable to say that the image was not found*/
valorcitos->label = g_object_new(GTK_TYPE_LABEL,
"label", "That image was not found!",
NULL);
/*we place the lable adequetly*/
gtk_table_attach_defaults((GtkTable * )valorcitos->table,valorcitos->
label,0,1,2,3);

gtk_widget_show(valorcitos->label);
/* we remove the previous image that we were displaying.*/
gtk_container_remove(GTK_CONTAINER(
valorcitos->vbox),valorcitos->image);


}


}
int main(int argc, char** argv)
{
/* we create a struct that will store the variables that we will use when the button is clicked.*/
struct values valorcitos;

/* We create the other GTK+ widgets which we will use */
GtkWindow* window;

GtkWidget *label;

GtkWidget *button;
/* Initialize the GTK+ library. */
gtk_init(&argc, &argv);

/* Create a window with window border width of 12 pixels and a
title text. */
window = g_object_new(GTK_TYPE_WINDOW,
"border-width", 12,
"title", "Image Viewer",
NULL);

/* Create the label widget. */
label = g_object_new(GTK_TYPE_LABEL,
"label", "Type in the address of the image:",
NULL);
/*Prepare the lable we will modify when the user clicks the button*/
valorcitos.label = g_object_new(GTK_TYPE_LABEL,
"label", "Ex:pumas.jpg or pics/1.jpg",
NULL);
/*prepare the textbox*/
valorcitos.entry=gtk_entry_new();
int text_width =5; // Width of field in characters
gtk_entry_set_width_chars(
GTK_ENTRY(valorcitos.entry), text_width);

/*prepare the image*/
valorcitos.image=gtk_image_new();
/*prepare the button*/
button=gtk_button_new_with_label("OK");
/* connect the signals to the button, when clicked we will
call the on_button_clicked function and send in the struct valorcitos
that stores the variables we need to manipulate* */
g_signal_connect (G_OBJECT(button), "clicked",
G_CALLBACK (on_button_clicked),&valorcitos);

/*We prepare a virtical box that will store a table and the image*/
valorcitos.vbox=gtk_vbox_new(FALSE,0);
/*we prepare a table that will store the textbox,lables and button*/
valorcitos.table= gtk_table_new(1,1,TRUE);
/*We pack the table with the variables */
gtk_table_attach_defaults ((GtkTable * )valorcitos.table,label,0,1,0,1);
gtk_table_attach_defaults ((GtkTable * )valorcitos.table,valorcitos.entry,0,1,1,2);
gtk_table_attach_defaults((GtkTable * )valorcitos.table,valorcitos.label,0,1,2,3);
gtk_table_attach_defaults((GtkTable * )valorcitos.table,button,1,2,1,2);


/*we add the table to the vbox*/
gtk_box_pack_start(GTK_BOX(
valorcitos.vbox),valorcitos.table, FALSE, FALSE, 0);

/*we add the image to the vbox*/
gtk_box_pack_start(GTK_BOX(
valorcitos.vbox),valorcitos.image,FALSE, FALSE, 0);



/* Pack the vbox into the window layout. */
gtk_container_add(GTK_CONTAINER(
window), GTK_WIDGET(valorcitos.vbox));


/* Show all widgets that are contained by the window. */
gtk_widget_show_all(GTK_WIDGET(
window));


/* Start the main event loop. */
g_print("main: calling gtk_main\n");
gtk_main();
/* Display a message to the standard output and exit. */
g_print("main: returned from gtk_main and exiting with success\n");

/* The C standard defines this condition as EXIT_SUCCESS, and this
symbolic macro is defined in stdlib.h (which GTK+ will pull in
in-directly). There is also a counter-part for failures:
EXIT_FAILURE. */
return EXIT_SUCCESS;
}



Con esto tenemos ya listo el codigo, y ahora sólo falta compilar y correrlo.
Para ellos, llevaremos acabo los siguientes pasos.
1)Correr Xephyr, para ello desde una terminal escribimos simplemente:
Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
Y se nos deberá abrir una ventanita negra.
2)Preparamos todo en scratchbox
-En otra terminal, escribimos /scratchbox/login
-Creamos el programa que ejutaremos: nano imagencitas.c
y alli pegaremos el código que acabamos de escribir.
- Compilamos el programa:
gcc -Wall -g imagencitas.c `pkg-config --cflags gtk+-2.0 gmodule-2.0` -o imagencitas `pkg-config --libs gtk+-2.0` `pkg-config --libs gmodule-2.0`
-Preparamos el ambiente para dibujar en el Xephyr :
En una consola escribimos: export DISPLAY=:2
af-sb-init.sh start

Y ahora simplemente con el siguiente comando correremos nuestro programa:
run-standalone.sh ./imagencitas

Y con esto deberíamos tener los siguiente:


Allí el usuario ha escrito que quiere ver la Imágen Pumas, pero aun no aprieta el botón.
Una vez que lo haya apretado tendríamos lo siguiente:


Y si el usuario escribiera el nombre de una imágen que no existe dentro del sistema, recibiría lo siguiente:


Y así es como, se podría crear una aplicación para ver imágenes en el n900.
Supongo que el código está medio sucio, pero es mi primera vez usando GTK y tengo además muchas otras responsabilidades...=(
Espero seguir jugando con esto, y mejorando.
Los dejo con la imágen de un comic, que me dió mucha risa:



Thursday, September 24, 2009

¿Cómo hacer un HolaMundo para celulares nokia n900?

Hoy desperté con un humor muy peculiar, sentí de pronto unas INMENSAS ganas de tener un celular nuevo, y cuando digo un celular nuevo, realmente me refiero a lo más más nuevo. I'm talking about the NEW Nokia phone!
Sí el neuvo celular de nokia, que aún no sale al mercado. (Yo ya tengo mi pre-order listissimo.)
El nokia n900.



¿Que cosas tiene el n900?
En su página algunas de las especificaciones son:
* Procesador de tipo ARM CortexTM-A8 corriendo a 600 MHz. El cual es el primer procesador de aplicaciones basado en la arquitectura ARMv7 y es actualmente el procesador con mejor rendimiento y más efficiente con respecto al consumo de energía que ARM ofrece.
La arquitectura ARMv7 también incluye la tecnología NEON™ para incrementar el procesamiento digital de señales que se tiene en un 400% !
También ofrece una mejora en punto flotante, para poderse adaptar a las necesidades que existen con la siguiente generación de gráficos 3D, las leyes de física que se aplican a los juegos, así como aplicaciones de control embebidas.( Un controlador embebido, término que de hecho NO conocía ja!, es un dispositivo que lleva acabo control embebdio...Y control embebido es un subconjunto de la adquisición de datos, esto es, el sistema de entrada/salida que se tiene no está conectado con una PC externa, sino que la PC o el procesador que está corriendo está realmente incorporado fisicamente con el dispositivo de entrada y salida.)
*Hasta 1 GB de memoria para las aplicaciones (256 MB RAM, 768 MB memoria virtual)
* Un sistema operativo de tipo Linux
* Un acelerador de gráficos 3D con soporte para OpenGL ES 2.0 (Si son medios neewbies, como yo a esto, (which is totally cool too, en algun lado se empieza!) Un acelerador de gráficos es una especie de adaptador de video que contiene su propio procesador para mejor los niveles de rendimiento. Estos procesadores están especializados en las transformaciones de computo gráfico, así que alcanan mejores resultados que la CPU de uso general type que usa la computadora. Además liberan el resto del CPU, para que pueda hacer otras operaciones, mientras que el acelerador de gráficos se encarga del trabajo sucio i.e. las computaciones gráficas.)
*32 GB en almacenamiento interno
*Pantalla de tipo Touch Screen

...Y muchas muchas más cosas, que en la página oficial pueden checar...

Entremos ahora a lo interesante.
¿Cómo podría yo, una chica solitaria de ingeniería en la UNAM jugar a gusto con este dispositivo?

-Hmmm, pensemos un rato...Thinking thinking thinking hard...Podría usarlo! Es lo suficientemente lindo para divertirte mucho si lo pudiera usar, además está lindo para presumirse en todos lados!...Peeero eres una estudiante de ingeniería de la UNAM... y en computación, así que a eso AUN le falta!!....mmmm...oh I know!...Programemosle una aplicación hecha por nosotros!!!

Lo primero es que entendamos lo que queremos hacer:
Queremos crear un ambiente en el cual podamos probar y compilar aplicaciones que bajaremos al celular.Es entonces muy importante crear un ambiente que pueda compilar y correr programas tanto en plataformas ARM (la plataforma del celular)) como x86 (Plataforma de la PC). Debido a que el N800 corre en un procesador ARM, no podemos tomar los bianrios que se generen en nuestra máquina e insertarlos así nomás al celular y esperar que funcionen. No funcionará debido a que cada procesador tiene su PROPIO set de instruciones, así que el bianrio creado por un compilador en un procesador x86 no significará nada en un procesador ARM, es por esto que debemos agregar una capa de abstración:
La solución es INSTALAR Scratchbox.
Scratchbox es un compilador cruzado (Un compilador cruzado según Wikipedia es un compilador capaz de crear código ejecutable para otra plataforma distinta a aquélla en la que él se ejecuta.)
el cual hace el desarrollo de aplicaciones embebidas en Linux mucho más fácil, además de eso brinda una serie de herramientas para compilar cruzado e integrar toda una distribución de Linux.
Con los siguientes 3 comando, se instalará scratchbox, se volverá ejecutable y después se correrá:
wget http://repository.maemo.org/unstable/5.0beta2/maemo-scratchbox-install_5.0beta2.sh
chmod +x maemo-scratchbox-install_5.0beta.sh
(Entre este paso y el siguiente, recomiendo mucho salirse de su sesión actual que tienen en su máquina, en mi caso no cobró efecto imediatamente.)
./maemo-scratchbox-install_5.0beta2.sh –u USER -F

Con estos pasos se debió haber instalado scratchbox y haber recibido un mensaje como el siguiente:
Installation was successful!

----------------------------



You now have Scratchbox 1.1.4 'apophis' release installed.



Scratchbox cannot be run as user root. Instead, use your normal login

user account. Add additional scratchbox users and sandboxes with the

following command (outside scratchbox with root permissions):



# /scratchbox/sbin/sbox_adduser USER yes



Running this command will create sandbox environment for that user and

add user to the 'sbox' scratchbox user group.

You will need to start a new login terminal after being added to the

'sbox' group for group membership to be effective.



Login to scratchbox session using the following command (as user):



$ /scratchbox/login



Refer to scratchbox.org documentation for more information re scratchbox:

http://scratchbox.org/documentation/user/scratchbox-1.0/
saiph@ubunt:~$


Una vez que ya se corrió eso, en una terminal se debe escribir:
~$ /scratchbox/login
(Entre este paso y el anterior, recomiendo mucho salirse de la sesión actual que tienen en su máquina, en mi caso no cobró efecto imediatamente, y me dijo unas cosas acerca de que NO tenía los permisos para hacer esa operación)
Con ese comando debe salir lo siguiente:
You dont have active target in scratchbox chroot.
Please create one by running "sb-menu" before continuing
Welcome to Scratchbox, the cross-compilation toolkit!

Use 'sb-menu' to change your compilation target.

See /scratchbox/doc/ for documentation.



sb-conf: No current target

[sbox-: ~] >

Si ya se tiene el prompt de sbox es que se instaló scratchbox adecuadamente, ahora lo que se debe hacer es instalar el sdk de maemo dentro de nuestro entorno. (El sdk de maemo nos permitirá desarrollar aplicaciones para el celular,recordemos que el n900 corre sobre el sistema operativo de maemo.)
Para instalar se debe escribir:
wget http://repository.maemo.org/unstable/5.0beta2/maemo-sdk-install_5.0beta2.sh
chmod +x maemo-sdk-install_5.0beta2.sh
./maemo-sdk-install_5.0beta2.sh

Dentro de esta instalación, yo selecioné los valores que venían por default.
Una vez que se termina la instalación se nos presenta en la consola un mensaje que dice lo siguiente:


Nokia EUSA binaries

-------------------



The package maemo-explicit is a metapackage of Nokia EUSA licensed

binaries which can be installed to scratchbox targets. It is highly

recommended to install this package on both targets to ensure a fully

working system.



If you want to install these, login to scratchbox (see commands above)

and run the command 'fakeroot apt-get install maemo-explicit' for both

armel (CHINOOK_ARMEL) and i386 (CHINOOK_X86) targets.



Happy hacking!

Lo que este mensaje basicamente nos está diciendo es que el paquete que acabamos de instalar contiene binarios que se pueden instalar como objetivos o "targets" dentro de scratchbox.Un target u Objetivo dentro de Scratchbox es una "caja de arena" configurada.(y una "caja de arena" dentro de Scratchbox es simplemente un área definida para cada usuario.)
Así que precisamente hagamos esto que nos dice el mensajito:
Nos volvemos a meter a scratchbox:

pete@ubunt:~$ /scratchbox/login



Welcome to Scratchbox, the cross-compilation toolkit!



Use 'sb-menu' to change your compilation target.

See /scratchbox/doc/ for documentation.



[sbox-CHINOOK_ARMEL: ~] >


Instalaremos el paquete explicito de maemo, al correr lo siguiente:

fakeroot apt-get install maemo-explicit

Una vez que la actualización sucedió. nos debemos cambiar al otro obejtivo que está ya "build" al invocar el comando en el menu sb.Esto hara que salga un sistema de menu, y usanado las flechitas selecione la opcion de Activate a target, y escoje el ambiente que aun no se ha actualizado, en este caso es CHINOOK_X86. Se debe correr el mismo comando de la vez pasada y ya deberíamos tener ambos ambientes listos calistos!

Ahora lo probaremos graficamente:
Abriremos otra terminal para probar graficamente que el sistema maemo está ya corriendo, también compilaremos un programa de prueba y lo correremos sobre el objetivo ARMEL .
En la nueva terminal, correremos primero los siguientes comandos:

sudo apt-get install xserver-xephyr


Con este comando se instala el X server embebido, el cual se requiere para probar correr la emulación gráfica del N900.
Posteriormente se deberá correr el siguiente comando:

$ Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac -kb &

Con esto se prende el servidor Xephyr .( el servidor Xephyr es un servidor basado en KDrive, KDrive es una pequeña implementación del server que hay en el sistema X Window.Xephyr tiene como objetivo o "target" de framebuffer una ventana localizada dentro de un host X Server.->Un framebuffer representa cada uno de los píxeles de la pantalla como localidades de memoria en RAM)
Con esto lo que se verá es que se abrió una nueva ventana:

* Ahora entremos a Scratchbox y al objetivo de X86.

$ /scratchbox/login
[sbox->:~]> sb-conf se FREMANTLE_X86

* Hacemos que la variable DISPLAY corresponda a la configuración dada para el display que hay en el servidor Xephyr.

[sbox-FREMANTLE_X86: ~] > export DISPLAY=:2

* Prendemos el framework de la IU (Interfaz de Usuario) .

[sbox-FREMANTLE_X86: ~] > af-sb-init.sh start

Con esto se verá el framework de la UI lista y corriendo en la ventana Xephyr



El framework UI realmente es suuuper lindo. Después jugaremos más con él.
Por ahora sólo quería que todos lo tuvieran trabajando. Regresemos a lo que queríamos hacer...
Un aplicación "HolaMundo" para el n900:
Abra otra terminal y vayas a su directorio de home y allí debes crear un nuevo archivo en el cual pegaremos lo siguiente:


#include stdlib.h /* EXIT_* */
#include stdio.h
/* Introduce types and prototypes of GTK+ for the compiler. */
#include

int main(int argc, char** argv)
{

/* We'll have two references to two GTK+ widgets. */
GtkWindow* window;
GtkLabel* label;
GtkWidget *image;

/* Initialize the GTK+ library. */
gtk_init(&argc, &argv);

/* Create a window with window border width of 12 pixels and a
title text. */
window = g_object_new(GTK_TYPE_WINDOW,
"border-width", 12,
"title", "Hello GTK+",
NULL);

/* Create the label widget. */
label = g_object_new(GTK_TYPE_LABEL,
"label", "Hello World!",
NULL);

/* Pack the label into the window layout. */
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(label));

/* Show all widgets that are contained by the window. */
gtk_widget_show_all(GTK_WIDGET(window));

/* Start the main event loop. */
g_print("main: calling gtk_main\n");
gtk_main();

/* Display a message to the standard output and exit. */
g_print("main: returned from gtk_main and exiting with success\n");

/* The C standard defines this condition as EXIT_SUCCESS, and this
symbolic macro is defined in stdlib.h (which GTK+ will pull in
in-directly). There is also a counter-part for failures:
EXIT_FAILURE. */
return EXIT_SUCCESS;
}


Guarda el archivo como maemo_hello.c. y copialo como se demuestra a continuación:(Se ha dejado mientras prendido el scratchbox, asi como se dejó corriendo la ventana Xephyr )

cp maemo_hello.c /scratchbox/users/saiph/home/saiph/


Observese donde esá su directorio de home dentro de scratchbox, ahora si en la ventana que tiene corriendo scratchbox escribes ls, deberás de ver un archivo maemo_hello.c dentro de tu directorio de home:
[sbox-FREMANTLE_X86: ~] > ls
:~] maemo-sdk-rootstrap_5.0beta2_armel.tgz maemo_hello sb-conf
MyDocs maemo-sdk-rootstrap_5.0beta2_i386.tgz maemo_hello.c

Y ahora usando el mismo comando de sb-menu que habiamos usado antes,verificamos que estemos sobre el objetivo de ARMEL. (Esto hace que los binarios que compilemos sean hechos especificamente para el N800) .
Ahora simplemente compilamos:
gcc -o maemo_hello maemo_hello.c `pkg-config --cflags gtk+-2.0 hildon-1` -ansi -Wall `pkg-config --libs gtk+-2.0 hildon-1`

El archivo bianrio generado puede ser copiado a cualquier celular n900 y corrido sin ningun problema. Ahora lo unico que debemos hacer, es probarlo sobre nuestro ambiente de scratchbox (Que justamente está emulando el celular, tonz aunque no tengamos aun el celular, nos permitirá ver la aplicación como si se hubiese corrrido sobre el n900)
Para probarlo, sobre la terminal que tiene el scratchbox, ponemos a la variable de display=2, lo cual como ya se explicó antes, provoca que se apunte al Xephyr server, posteriormente corremos el script para prender el ambiente de prueba de maemo:n
export DISPLAY=:2

af-sb-init.sh start

Saldrán muchas letritas aqui, espera a que termine, y una vez listo aprieta enter, verás el prompt de scratchbox de regreso, y ahora ponremos:
./maemo_hello
Y finalmente deberás tener una ventanita similar a lo siguiente:


Y así hemos hecho nuestro propio HolaMundo para celulares n900!! ñ_ñ
OJO:Los pasos puestos en el blog, son para maquinas de 64 bits!!
Refrencias:
http://maemo.org/development/sdks/maemo_5_beta_2_sdk_installation/#close=1
http://www.reviewlinux.com/forums/news/12492-pete-savage-howto-scratchbox-maemo-4-0-ubuntu-gutsy-nokia-n800-dev-environment.html


Saturday, June 27, 2009

BING== But It's Not Google

Ha sido una gran semana. A pretty amazing week.
Me parece que lo mejor, fue tener un cierre tan agradable de la carrera. El fin de semana, específicamente de Jueves a Domingo, estuve en San Francisco y tuve la grandiosa oportunidad de visitar Google en Mountain View, y recibir charlas de muchos de sus proyectos actuales. La oportunidad de tener un viaje todo pagado, i.e. avion de México City-San Francisco, hospedaje en Hilton de SF, todas las comidas y transporte pagado, me fue brindado gracias a una de las becas que brinda esta compañía, más espicífico, es la beca de Google en memoria de Anita Borg. Anita Borg fue una revolucionaria en el campo de la computación. Ella buscó traer más mujeres a está área, ya que las mujeres siempre eran y hasta cierto punto, siguen siendo, una minoría. Anita murió de cancer en 2003, pero en su honor Google apoya a las mujeres en la tecnolgía. Google busca promover que estas chicas sobre salgan en la computación-tecnología y sean dentro de esta área modelos a seguir...

Mmmm...to make a long story short, creo que quiero ahora contar lo que viví en mi visita en Google.
Un camión pasó, por todos los becari@s de Google, incluyendo no sólo a las lindas becarias de Anita Borg sino también a todos los becaRI@s de los demás grupos, (which you can check out here ) Llegamos a las 10 am y a las 10:15 el vice presidente nos dió una charla de bienvenida.
Dentro de esta charla, se habló acerca de lo importante que era para Google tener diversidad. Dijo que contratando los mejores talentos, diversidad en perspectivas, ideas y culturas llevaba a la creación de mejores productos y servicios brindados a los usuarios.
También nos contó, que la compañía estaba trabajando en un algoritmo para detectar cuando ciertos "cerebros" se dejaban de sentir agusto en la compañía y querían por ende dejarla, renunciar a su empleo. La compañía empezó a analizar en una fórmula matemática, información relacionada con los comentarios y promociones de los empleados así como de su historial de pago,para identificar cual de sus 20,000 empleados tiene más probablidad de querer renunciar.
Este algoritmo de retención, es una de las últimas medidas que ha adaptado Google para prevenir que sus mejores ingenieros, diseñadores, y ejecutivos de ventas se vayan.
...I guess, other things were touched here, but I DO not remember them..:S
Después de esta plática, llegó un hindú guiado por un labrador, pues era ciego este presentador, y nos habló acerca del proyecto de "Eyes Free Android" El proyecto de Eyes-Free ( Ojos libres) analiza lo siguiente: normalmente para usar tu celular es necesario que utilices dos de tus sentidos, el tacto y la visión. Sin embargo, existen muchas ocasiones en los cuales podrías tener tus ojos ocupados, y por ende cualquier operación con el celular se dificulta, tal es el caso de cuando nos encontramos manejando. Se busca que el proyecto de Eyes Free se use cuando las personas NO pueden ver el display de su celular.
Las aplicaciones que tiene Eyes Free son:
  • Talking Dialer== Marcador Oral: una inovación que se tiene es que permite la marcación de números con una mano, sin ver, utilizando el touch screen. Funciona de la siguiente manera: El usuario presiona alguna parte de la pantalla, apartir de aquí se crea la matriz de numeros, se toma el lugar donde presionó el usuario como centro, y se localiza allí el 5, alrededor se situán los demás números del mismo modo en el cual suelen acomodarse. You know, 6 after 5, 2 above 5 etc. Además, Cuando el usuario pasa sobre uno de los números, se escucha una voz que dice sobre que número se está pasando. De este modo, el usuario puede marcar un número telefónico sin necesidad de tener que ver la pantalla de su cel.

  • Knowing Your Location==Conoce tu localización: Esta aplicación te dice tu localización actual, usando información adquirida mediante el GPS y la red del celular. Usando un compás magnético presente en la mayoría de los celulares, te dice también si vas hacia el norte, sur, etc, y usando Google Maps te dice que edificios o localizaciones están cerca y que calles hay.

Aquí les presentó un pequeño video acerca de este proyetco:


Después de esta charla, nos dividimos en diversas sesiones, cada sesión hablaba de algún producto en particular de Google. Podíamos escojer entre una charla acerca de android, otra acerca de chrome o la que yo elegí que fue Street view. La persona que dió la charla fue un Francés, que está actualemtne a cargo de este proyecto. Es una persona que tiene mucha experriencia y ha hecho mucha investigación en Visión y en Procesamiento digital de imágnes. Me parece que la mayoría de las personas, sabe de que se trata el proyecto de street view, sin embargo, no está demás dar un pequeño resumén de él. Con Street View, es posible ver fotografías a nivel calle,hacer paseos virtuales en diversas ciudades del mundo,encontrar tiendas, parques, hoteles etc.
Google Street View surgió apartir de una idea que tuvo Larry Page, el cual equipado con su cámara, recorría las calles Standford filmando las calles y edificios. Esta idea crecio con la creacion de Google Maps.
Ahora bien, a simple vista el proyecto de Street View, podria parecer un proyectp 2/3 sencillon, no es acaso un simple video en line de las calles que hay en el mundo?
Sin embargo, existen realmente muchas cosas que se deben considerar y trabajar con ellas, dentro de este proyecto. Por ejemplo, cuando se esta decidiendo como capturar la imagen de una calle, mientras se esta manejando,se puede considerar lo siguiente:
El plano de una imagen normal proveniente de una camara produce un dibujo rectangular:

Esto, no esta mal, sin embargo,cuando se tiene una camara que se encuentra en movimiento, este metodo no se puede usar, ya que cuando se rota la camara, cambian con este metodo las perspectivas que se tienen de los objetos, de un modo drastico,se cambian las percepeciones de los objetos. Es por esto, que es necesario utilizar otra tecnica. Una bastante util para estas situaciones es una llamada Pushbroom. En esta tecnica lo que se hace es tomar un cacho vertical de la perspectiva rectagular, ubicada justo en frente de la camara y se recorta este cacho de la demas imagen. Asi mientras se mueve la camara, se tienen peque~os cachitos, los cuales se pueden unir, para producir asi una imagen cotinua, mientras la camara se mueve.
Sin embargo, existen aqui algunos problemas con la profundidad, ya que cada cahito se ve como si uno estuviera viendo directamente a el. Y si cada cachito se une, no se observa por ende la profundidad. La siguiente imagen muestra esto claramente:


En esta imagen, los coches se amontonan y los callejones no tienen nada de profundidad. Google resolvio este problem, combinando la perspectiva de pinhole con la de pushbroom. La perspectiva en 'y' se mantiene, se optimizo la perspectiva obtenida en x en cda una de las imagenes segmentadas, con el fin de minimizar la distorcion.La siguiente imagen, muestra el uso de este metodo:


Observese que en esta imagen, la cual es una con multiples perspectivas, existe un punto de fuja en el callejon y un punto de fuja diferente en la interseccion.

Bien, de este modo tenemos ya un flujo de imagene que realmente se ven en 3D, con profundidad y todo.Sin embargo en calles que no son lisas, como las que se tienen en San Francisco, este metodo hara que la imagen NO se vea real. Lo que hace Google para tomar calles empinadas es usar un jiroscopio para orientar a la camara, de modo que estos caminos mantienen el mismo angulo, a como si uno viniera caminando por una de esas lindas calles San fransicanas.=)

View Larger Map

Ahora bien, otra cosa interesante que esta aplicando Google a Street View, son numerosos filtros para que las imagenes que toma el auto de Google, se puedan ver con claridad independientemente de la hora del dia, en la que se hayan tomado. Entendi, que en numerosas ocasiones, toman varias veces una calle, y hacen una especie de promedio entre las fotos tomadas y la imagen resultante es la que se muestra. Se tambien, que analizan los caminos por los cuales, pasara el carro filmador de Google, para encontrar rutas mas cortas, y hacer todo del modo mas eficiente posible.
En la conferencia, se hablo tambien de varios problemas tecnicos que se han presentado, como son los ajustes a la camara, momentos en los cuales la camara apunta al sol e incluso brindar la suficiente energia para todas las actividades del auto. (El auto es alimentado, con muchas baterias!)

Ahora bien, una de las cosas que mas me llamo la atencion del proyecto de Street View, fue el reciente trabajo que se ha puesto, para borrar las caras de las personas que salen en las calles y respetar asi cuestiones de seguridad. A pesar de que muchas camaras ya traen integrados aplicacones de deteccion de caras, hay que tomar en cuenta, que estas aplicaciones siempre llevan acabo la detecion cuando las personas, estan puestas de frente a la camara. Es decir, si las personas estan volteando, en alguna posicion en la cual el rostro no esta de frente a la camara, la deteccion de rostro se vuelve bastante complicado. Lo peor de todo, es que estos casos, son los que mas se presentan en estas fotografias, las personas evidentemente NO estan posando para la foto. Muchas universidades han contribuido a solucionar este problema, Google tomo algoritmos elaborado por otras universidades, y elaboro un "out of the box detector" bastante robusto.Me habria agradado que hablara el frances mas acerca de este algoritmo, creo que tiene una publicacion del tema. But for now, ando en mi casa, y todos los articulos de la IEEE estan fuera de mi alcance :(
Ire ma~ana a la UNAM, y lo intentare, chance commento mas acerca de esto. (Ma~ana es mi graduacion, para any stalker que quiera felicitarme ! n_n

Hubo otra muy buena platica, que en otra ocasion hablare de ella, que trato acerca de las traducciones que hace Google, y como han encontrado que es mas eficiente, hacerlas basandose en mucha informacion de mapeo de frases. (Tu sabes, de documentos que vienen en dos idiomas> Welcome to the XXX strip joint> Bienvenido al table dance XXX....)que mejorando el algoritmo e traduccion tal cual. Basicamente lo que hacen, es que les llega una oracion, digamos: "Rainy days and sun days always get me down"
Y la quieren traducir al espa~ol, lo que suelen hacer, es ir calcuando, la probabilidad que una cierta traduccion sea equivalente otra. Calculan la probablidad de ser de cada palabra en la oracion traducida. Se escojen siempre las palabras con la mayor probabilidad, la probabilidad de ser de cada palabra selecionada se selecciona basandose en el numero de veces que ese mapeo de palabras se dio, esto es, hacen una busqueda en la red, y buscaran el numero de veces que Rainy por ejemplo, haya tenido un mapeo con lluvioso. Se observan todos los mapeos encontrados en la red con la palabra, y a cada mapeo encontrado se asigna una probabilidad, basandose n el numero de veces que fue encontrado.Ahora bien, aun no se ha terminado, se calcula tambien la probabilidad que dicha palabra selecionaa, observada en el mapeo, en este caso lluvioso, sea adecuada segun la gramatica de la lengua a la cual se esta traduciendo. De hecho, a esta probabilidad le asignan un mayor peso.(lo elevan a 1.5, on lo que se pierde la propiedad que la probabilidad de uno, pero asi es como ha resultado ser mas eficiente.)
Asi es como funciona la traduccion que brinda Google, se basan en datos encotnrados en la red =)

Tuesday, May 26, 2009

Well it's a marvelous night for a moondance..


Así que muchos de ustedes visitan mi blog, y no saben por qué se llama Marvelous night for a moondance. Well it comes from one of my favorite songs from all times.
I guess I'll share it.

Moondance
By Van Morrison

Well it's a marvelous night for a moondance
With the stars up above in your eyes
A fantabulous night to make romance
'Neath the cover of October skies
And all the leaves on the trees are falling
To the sound of the breezes that blow
And I'm trying to please to the calling
Of your heart-strings that play soft and low
You know the night's magic
Seems to whisper and hush
And all the soft moonlight
Seems to shine in your blush...

Can I just have one a' more moondance with you, my love?
Can I just make some more romance with a' you, my love?

Well I wanna make love to you tonight
I can't wait till the morning has come
And I know now the time is just right
And straight into my arms you will run
And when you come my heart will be waiting
To make sure that you're never alone
There and then all my dreams will come true dear
There and then I will make you my own
And every time I touch you, you just tremble inside
And I know how much you want me that, you can't hide...

Can I just have one more moondance with you, my love?
Can I just make some more romance with you, my love?

Well it's a marvelous night for a moondance
With the stars up above in your eyes
A fantabulous night to make romance
'Neath the cover of October skies
And all the leaves on the trees are falling
To the sound of the breezes that blow
And I'm trying to please to the calling
Of your heart-strings that play soft and low
You know the night's magic
Seems to whisper and hush
And all the soft moonlight
Seems to shine in your blush...

One more moondance with you
In the moonlight
On a magic night
la, la, la, la, there's a moonlight
On a magic night
Can't I just have one more dance
With you my love?

Sunday, May 17, 2009

Los top 3 métodos más estúpidos para brindar seguridad a una WLAN

  1. Filtrado por MAC: Este método es similar a darle a un guardia de seguridad una hojita con una lista de nombres. Posteriomente cuando alguien llega a la puerta y busca entrar, el guardia de seguridad ve el gafete con nombre que la persona trae y comparará este con su lista de nombres. El problema aquí es claro. Lo único que un extraño necesita hacer para entrar es robarse el gafete de alguien que SÍ este autoriado para entrar. La comparación con una red WLAN es que el gafete con el nombre de la persona es la dirección MAC. La dirección MAC es tan sólo un numero HEX de 12 dígitos que se puede obtener de una máquina externa mediante el uso de un sniffer. Una vez que la dirección MAC de una máquina en la red se tiene, en menos de 10 segundos se puede cortar y pegar la dirección MAC obtenida, en la configuración del adaptador de ethernet inalámbrico y así penetrarse en la red. Filtrar mediante MAC es inutil, ya que es uno de los esquemas que más facilmente se pueden atacar, gracias al hecho de que es posible clonar direcciones MAC. ( Es interesnate notar, que la clonación de direcciones MAC es permitido debido a que en ocasiones es necesario debido a cuestiones de configuración de ISP)
  2. Esconder SSID :Dentro de la configuración web de muchos routers, existe una pestaña titulada: Wireless y entro de esta pestaña, existen varias sub-pestañas que brindan más elementos a configurar. Uno de ellos es el permitir o no, el broadcast del SSID. Es interesante aquí notar que uno podría pensar que escondiendo el SSID se podría estar “ a salvo” y se tendría un buena técnica para resguardar a la red inalámbrica. Sin embargo realmente no existe ninguna manera de esconder el SSID.Existen otros 4 mecanismos que transmiten el SSID sobre el espectro de 2.4 o 5 GHz: probe requests, probe responses, association requests, y re-association requests. Así que en escencia se está escondiendo 1 de los 5 mecanismos para trasmitir el SSID. Nada realmente se esconde y lo único que se ha ganado es causar problemas en el roaminf de Wi-Fi cuando u cliente pasa de un AP a otro.
  3. Localización de la antena: Hay personas que dicen, que para detener a los hackers se debe poner el Punto de Acceso o AP en el centro del edificio donde tienen su WLAN y ponerlo a trabajar a su potencia mínima. Esto, definitivamente NO detenrá a los hackers ya que ellos siempre contarpan con una antena mayor que nosotros, y podrán captar nuestra señal desde sus casas situadas a 1km de distancia. Hacer más débil la WLAN tan sólo sirve para hacer la WLAN inservible. La localización y potencia de la antena se debe seleccionar para que cubra lo máximo y presenta la menor interferencia posible. Nunca se debería utilizar como un mecanism de seguridad!


Aclaraciones:
Es importante comentar que no se consideró a la seguridad WEP dentro de "Los top 3 métodos más estúpidos para brindar seguridad a una WLAN" ya que a pesar de que tan sólo toma un par de minutos romper en una red que utiliza seguridad WEP, romper una WEP requiere de mucha más técnica, no es tan sencillo lanzar los ataques por inyección de paquetes y además toma un poco más de tiempo que ingresar a una red que utiliza el filtrado por MAC.

Saturday, May 09, 2009

Top 5 favorite love poems

It's been a while since I've had a chance to read poetry. I used to be a big fan of it, and also enjoyed writing some of my own. Unfortunately I don't really know why I haven't given Poetry much time or thought anymore. All my "artistic and cultural time" is spent in learning German and some Philosophy books, Poetry has long been forgotten.

So, I wanted to give a moment to remember some of my favorite English poems. I like them because they are simple and express many of the feelings that I have gone through.
I will list them in a time period, listing the year in which I identified with what the poem said. They are not showed in a Likeness order, they are showed in reference to the chronology of my Life.
5)


"After the Lunch" by Wendy Cope-
Late May 2005

On Waterloo Bridge, where we said our goodbyes,
the weather conditions bring tears to my eyes.
I wipe them away with a black woolly glove
And try not to notice I've fallen in love.

On Waterloo Bridge I am trying to think:
This is nothing. you're high on the charm and the drink.
But the juke-box inside me is playing a song
That says something different. And when was it wrong?

On Waterloo Bridge with the wind in my hair
I am tempted to skip. You're a fool. I don't care.
the head does its best but the heart is the boss-
I admit it before I am halfway across.


4)


Lover of Friend? by Liz Loxley-
March 2006

Whether I came
As lover or friend
I lacked the certainty
of a relationship.

I know we kissed
and we held hands
but lover and friends
make both demands.

We shared some wine
We shared some bread
and later on
we shared your bed.

But we shared no knowledge.
of who we were
In the social terms of
"Are he and her?"

We shared the darkness
The sounds from the street
And sometime in the night
A hand crossed the sheet.

"Halt who goes there?
Lover or friend?"
In the darkness I recognize you
As one and the same.


3)







We'll go no more a-roving
Lord Byron- late June 2006

So, we’ll go no more a roving
So late into the night,
Though the heart be still as loving,
And the moon be still as bright.

For the sword outwears its sheath,
And the soul wears out the breast
And the hearth must pause to breathe,
And love itself have rest.

Though the night was made for loving,
And the days return too soon,
Yet we’ll go no more a roving
By the light of the moon.

2)

Being Boring -Wendy Cope
March 2007
"may you live in interesting times" - Chinese curse
If you ask me "What's new?" - I have nothing to say
Except that the garden is growing.
I had a slight cold but it's better today.
I'm content with the way things are going.
Yes, he is the same as he usually is,
Still eating and sleeping and snoring.
I get on with my work, he gets on with his. I
know this is all very boring.

There was drama enough in my turbulent past:
Tears and passion - I've used up a tankful.
No news is good news, and long may it last.
If nothing much happens, I'm thankful.
A happier cabbage you never did see,
my vegetable spirits are soaring.
If you're after excitement, steer well clear of me.
I want to go on being boring.

I don't go to parties. Well, what are they for,
if you don't need to find a new lover?
You drink and you listen and drink a bit more
And you take the next day to recover.
Someone to stay home with was all my desire
And, now that I've found a safe mooring,
I've just one ambition in life, I aspire
To go on and on being boring.


1)

Please Please Me - James Kelly
April-2009

Promise never to leave me
lie, cheat or otherwise deceive me
And don't run around with my best friend
it would drive me daft - clean round the bend.

If I'm bad in bed please fake it
Never tell the truth, I couldn't take it.
Don't ignore me when I greet you
and please turn up when I'm waiting to meet you.

Don't break my heart and steal my pride.
Tear me apart and kill me inside.
Because that's the day I'll turn and flee
The day you turn round and behave like me.

Monday, May 04, 2009

¿Cuál es la diferencia entre TCP y UDP????

Existen 2 protocolos muy populare para transferir datos por internet. Estos son el protocolo TCP y el protocolo UDP.
¿Cual es la diferencia entre estos dos protocolos??

1)El protocolo UDP, a diferencia de lo mucho que hace el protocolo tcp, es de lo más simple. Aparte de la función de multiplexeo/demultiplexing y alguna revisión mínimo de errores, no adiciona nada nuevo al IP. De hecho si el programador selecciona usar UDP en vez de TCP, entonces la aplicación tendrá interación casi directa con IP. UDP toma mensajes de applicaciones, para los servicios de multiplexeo/demultiplexing adiciona los campos de puerto fuente y puerto destino,agrega también 2 otros campos que no poseen mucha importancia y entrega el segmento resultante a la capa de red.
La capa de red encapsula al segmento en un datagrama de IP, y después hace su máximo esfuerzo por entregar el segmento al host correspondinete. Si el segmento llega de forma satisfactoria con el host, UDP entrega los números de puerto,la direcciónn de IP de la fuente, y la dirección de IP del destino a la aplicación de proceso correspondiente.
Es importante notar, que con UDP antes de enviar los datos, no existe ningún tipo de handshaking entre las entidades que envían y reciben datos. Es por esto que se dice que UDP trabaja sin conxión.
TCP a diferencia de UDP utiliza 3 modos distintos de handshake antes de empezar a transferir datos. UDP sólo empieza a transferir sin dar preliminares formales. Por lo anterior es claro que UDP no introduce ningún tipo de retraso cuando envia información. UDP es por ende más rápido que TCP.

Por otro lado, TCP mantiene el estado de conexión de todas sus terminales. Este estado de conexión incluye buffers enviados,bufers recibidos, control de parametros de congestión, parametros de acknowledgment, o reconocimiento. ( Esta información es muy útil para TCP, lo utiliza para tener un transfernecia de datos muy confiable, además le brinda control en momentos de congestión.)
UDP no mantiene ningún estado de conexión y no guarda ninguno de estos parametros. Por ende, un servidor devoto a una aplicación en partícular puede tener más clientes activos cuando la aplicación corra sobre UDP que cuando corra sobre TCP.

El segmento de TCP posee un segmento de cabecera de 20 bytes, mientras que el segmento UDP sólo posee una cabecera de 8 bytes.

TCP cuenta con un mecanismo de control de congestión , que acelera al transmisor cuando 2 ó más links ó ligas entre el transmisior o receptor se tornan excesivamente congestionadas. Esta aceleración puede tener un impacto severo en aplicaciones a tiempo real que pueden tolerar perdidas en sus paquetes, pero requieren usar una cierta tasa de transferencia.
Con respecto a UDP, para enviar datos la única restricción que presenta en la velocidad de envió, es el ciclo de reloj que posee la CPU desde la cual se están enviando los datos, así como el ancho de banda de acceso a Internet. Aunque debemos tomar en cuenta, que el host receptor no necesariamente recibirá todos los datos que se envían, cuando la red está congestiondada. Una fracción significante de los datos transmitidos se podrían perder debido a un sobreflujo del buffer del router. Por ende, la tasa de recpeción, está limitada por la congestión de la red, aun cuandp la tasa de envió no este restringida.


Friday, April 17, 2009

Como monitoreo un dispositivo con MRTG?

En el post anterior explicamos como monitorear el wireless asi como el ethernet de nuestra maquina. Sin embargo, puede suceder que por alguna loca razon queramos monitorear nuestra impresora , o nuestro switch, o nuestro router.

Para hacerlo, hay que llevar acabo algunos pasos un poco diferentes a los que ya antes hicimos.
Partiremos ahora, que ya se tiene instalado MRTG,SNMP y APACHE2.
Dentro del archivo de snmpd.conf se debe agregar lo siguiente:

rocommunity public 192.168.3.0/24
rwcommunity private 192.168.3.100

donde 192.168.3.0/24 es el rango de IP que su maquina puede tener, y 192.168.3.100 es la IP que tiene el dispositivo que quieren monitorear.

Dentro de Ubuntu, MRTG automaticamente crea /var/www/mrtg. En otras distribuciones, se crea en una area diferente, asi que se debe cambiar la variable 'WorkDir:' al escenario en donde MRTG este instalado.

En este caso, para evitar confusiones, creare un directorio /etc/mrtg en vez de mover el archivo mrtg.cfg a /etc/.

mkdir /etc/mrtg

mv /etc/mrtg.cfg /etc/mrtg/

Ahora corremos el comando de cfgmaker para tener las cosas listas y corriendo:

cfgmaker --global 'WorkDir:/var/www/mrtg' --global 'Options[_]: bits,growright' --output /etc/mrtg/mrtg.cfg public@

Tenemos tambien que ver que las siguientes lineas se hayan agregado correctamente al archivo de /etc/mrtg/mrtg.cfg Si no estan alli, entocnes se deben agregar:

EnableIPv6: no
RunAsDaemon: Yes
Interval: 5
Logdir: /var/log/mrtg

Ahora corre:

indexmaker --output=/var/www/mrtg/index.html /etc/mrtg/mrtg.cfg

Lo cual creara un index.html , para que se pueda ver la salida.

Despues corro este comando, para preparar una variable de entorno. (similar al comando mrtg que corriamos el post pasado.)

env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg

Finalmente abra : http://localhost/mrtg/index.html

Deberias de poder ver una grafiquita. Espera un rato para verla en accion!





Sunday, April 12, 2009

Un rápidin para tener SNMP y MRTG

El objetivo de este post, es que el lector logre tener gráficas del tráfico de la interfaz principal que tenga su servidor, su estación de trabajo ó inclusive su firewall de un modo eficiente y rápido.
Se explicará aquí, cómo se puede monitorear el tráfico de una interfaz y con ello examinar el uso de la red que la computadora tiene.

El sistema es bastante sencillo y consiste de las siguientes partes:

1. El servidor SNMP: el servidor SNMP permite que mediante el protocolo SNMP se tenga acceso a las estadísticas de la interfaz de red así como otros datos.

2. El MRTG: Es un script escrito en Perl, el cual jala información del servidor SNMP y acumula información acerca del uso de la red. Corre periodicamente y genera gráficas en intervalos definidos. Al parecer es Cron quien lo corre.
( Cron según Wikipedía,se podría definir como el "equivalente" a Tareas Programadas de Windows.)

Es importante notar, que se puede colecionar y graficar lo que se desee con estas herramientas- No están limitadas a estadísticas de red. Además se pueden manejar muchos aspectos del servidor que se tenga gracias a SNMP.

Ahora bien, debido a que MRTG está escrito en Perl, para poderlo usar es necesario tener instalado Apache con soporte para Perl.
Para instalar Apache en Debian, desde consola se puede poner el siguiente comando:
#apt-get install apache2

Después de instalar se deberá reiniciar Apache con el siguiente comando:

#/etc/init.d/apache2 restart

Se puede probar que todo haya salido bien, al escribir en un navegador:

http://localhost/

Y obtener un letrerito que diciendo :

It works!

Una vez que ya se tiene apache instalado, se verá como llevar acabo:

La configuración del servidor SNMP

Lo primero que se debe hacer, es obtener un servidor SNMP que brinde cuando se le pida las estadísticas de la interfaz de red:

# apt-get install snmpd

Posteriormente se deberá editar la configuración, ya que por default no permite que se tenga ninguna conexión. Para editarlo ejecute el siguiente comando:

sudo nano /etc/snmp/snmpd.conf


Se deberá comentar lo siguiente con el prefijo de #:

com2sec paranoid default public

Y se deberá insertar lo siguiente justo abajo de lo que se acaba de comentar:

com2sec readonly default public

Eso hace que cualquiera que tenga acceso al servidor SNMP tenga acceso de sólo lectura a la comunidad pública. Esta comunidad es la que contiene las estadísticas de la interfaz.

Para aplicar los cambios, resetee snmpd:

/etc/init.d/snmpd restart

Instalación de MRTG

Para instalar MRTG, se debe ejecutar el siguiente comando:

# apt-get install mrtg

Se puede generar manualmente ó automáticamente el archivo de configuración para mrtg. Yo recomiendo hacerlo automátcamente ya que es mucho más fácil. Escríbase el siguiente comando:

# cfgmaker --global 'WorkDir: /var/www/mrtg' \ --output /etc/mrtg.cfg public@127.0.0.1

Esto generará el archivo de congiguración. Después se debe hacer un archivo índice que contenga todas las interfaces:

# indexmaker /etc/mrtg.cfg --columns=1 \
--output /var/www/mrtg/index.html

Posteriormente se deberá ejecutar mrtg:

# mrtg
Esto es ejecutado cada 5 minutos por cron, ese trabajito de cron fue adicionado por dpkg (dpkg es la base del sistema de gestión de paquetes de Debian GNU) así que no se tiene que configurar.

Finalmente es tiempo de inspeccionar sus resultados!
Al principio no verá gráficas rasonablemente buenas, pero dele tiempo. Relax Baby!

Thursday, March 26, 2009

Wednesday, March 25, 2009

La rola para cuando todavía no te dice esa cosita <3

Hay una canción del grupo alemán, Wir sind Helden (Nosotros somos los hereos), que no sé por qué razón, me encanta y me fascina escucharla una y otra y otra vez.
Debido a que me parece que NO hay traducción al español de esta canción en la red, decidí escribirla aquí, para que alguna chica o chico de latina america que le agrade también la canción, pueda entender que moños se está diciendo en ella.
Así que aprovechemos mis clases en el Cele!
Here goes, Wir sind Helden-Nur ein Wort in Spanish!








Nur ein Wort

Ich sehe, dass du denkst
Ich denke dass du fühlst
Ich fühle dass du willst
aber ich hör dich nicht


ich
hab mir ein Wörterbuch geliehen
dir A bis Z ins Ohr geschrieen
Ich stapel tausend wirre Worte auf
die dich am Ärmel ziehen

Und wo du hingehen willst
Ich häng an deinen Beinen
Wenn du schon auf den Mund fallen musst
Warum dann nicht auf meinen

Oh bitte gib mir nur ein Wort
Bitte gib mir nur ein Oh
Bitte gib mir nur ein
Bitte bitte gib mir nur ein Wort

Es ist verrückt wie schön du schweigst
Wie du dein hübsches Köpfchen neigst
Und so der ganzen lauten Welt und mir
die kalte Schulter zeigst

Dein Schweigen ist dein Zelt
Du stellst es mitten in die Welt

Spannst die Schnüre und staunst stumm wenn
Nachts ein Mädchen drüber fällt

Zu deinen Füssen red ich mich
um Kopf und Kragen
Ich will in deine tiefen Wasser
Große Wellen schlagen

Oh bitte gib mir nur ein Wort

In meinem Blut werfen
die Endorphine Blasen
Wenn hinter deinen stillen
Hasenaugen die Gedanken rasen



Sólo una palabra


Yo veo, que tu piensas
Yo pienso que tu sientes
yo siento que tu quieres...
pero yo no escucho nada de ti.

Tome prestado un diccionario
y en tu oreja las palabras de la A a la Z grité
He hecho montoncitos de miles de palabras
los cuales jalan de tus mangas.

Y hacia donde tu te dirigas,
me cuelgo de tus piernas
Tu ya deberías de tener el don de hablar elocuentemente,
pero entonces por qué no lo tienes conmigo?


Ay por favor dime sólo una palabra
Por favor dime sólo una Ay
Porfis dime sólo una
Porfis Porfis dime sólo una palabra

Está muy loco como te mantienes callado
como bajas tu cabecita linda
y entonces le muestras al ruidoso mundo y a mi,
tus frios hombros.

Tu silencio es tu casa de campaña.
Y la pones en medio del mundo

Preparas los hilos de tu casa de campaña, y te quedas sin parpadear cuando una chica en la noche con ellos se enreda y cae.

A tus pies arriesgo mi cabeza al hablar
de tonterias.
Quiero en tus aguas profundas crear grandes ondas.

Ay porfis dime tan sólo una palabra

En mi sangre las endorfinas burbujean,
cuando atrás de tus quietos ojos,
los pensamientos corren.






Uff esa es mi traducción de Nur ein Wort. Si alguien sabe alemán, estaría padre que contribuyeran y comentaran lo que opinan, fue más dificil de lo que creía hacerlo, ya que cambia mucho el significado de las palabras dependiendo del contexto. Por ejemplo, werfen es aventar, y blasen es soplar, pero werfen Blasen es burbujear!
En fin, ojala lo disfruten.Los dejo con la canción para que canten, um zu mitsingen! Y para que sepan que moños andan cantando :)

Por cierto que quería comentar, gran parte de la canción, decidí traducirla en un modo literal, sin embargo creo que hay muchas metaforas que sería interesante analizar. En general creo que el significado de la canción es que, ella le pide que le diga una palabra, la palabra que creo que ella busca es amor, ella quiere que él, se abra que quite su casa de campaña, y le diga que también la ama, como ella cree que la ama.




ESta es la versión que más me gusta: =)


ENJOY!

Sunday, March 15, 2009

Más allá de WIMP, y una cierta explicación de por qué la ciencia cognitiva trabaja hoy día con la computación

Cuando en computación se habla de WIMP, no se refieren al chico torpe cobarde al que los gringos se suelen referir. Sino que se refiere a interfaces gráficas para usuarios, que tienen ventanas (Windows),iconos (ICONS), menús,(Menu)y dispositivos en los que se apunta y se hace click ( point-and-click devices)

Sin embargo este tipo de interfaz gráfica para usuarios,GUI, por sus siglas en inglés de graphical user interface , no es una interfaz ideal.Ya que por ejemplo, los usuarios expertos, los que llevan usando mucho tiempo alguna aplicación, encuentran muchas veces a este tipo de interfaces sumamente lentas y por ende terminan usando los hotkeys ó los atajos del teclado.

Aunque esa no es la limitación más seria que tiene WIMP, la limitación más fuerte es que es una interfaz que fue diseñada para ser usada en un escritorio con teclado-mouse.Por ende con WIMP se crean interfaces que sólamente toman ventaja de la visión y de una interacción primitiva de tacto.

Por ende, un nuevo objetivo que la humanidad tiene, es diseñar interfaces que sean compatibles con la percepción humana,con la actividad cognitiva y manipulativa humana, así como tomar en consideración las habilidades sociales. Se busca poder interactuar de una forma natural con las computadoras y dispositivos inteligentes, interactuar del mismo modo en el que se hace con otros humanos, o del mismo modo en el cual manipulamos nuestros ambientes físicos.

Recordemos que las computadoras han facilitado la comunicación humana, la colaboración, así como la interación social, es por esto que la humanidad se tiene que concentrar en la interación humano a humano, no sólo en la interación de humano-computadora. Este cambio en el enfoque no sólo se verá refleja en el cambio en el uso de la computadora, sino que también en el hecho de que las computadoras se volverán poco a poco (si no es que ya está sucediendo) en algo que está presente en nuestro medio ambiente, mas invisible a nosotros. (Cuando digo, que está presente en nuesto medio ambiente, mas invisible a nosotros, me refiero al hecho de por ejemplo tener una computadora en nuestro refirgerador que podría darnos la comida requerida para nuestra dieta y esconder la que no DEBEMOS comer, si es que queremos usar ese sensual bikini para semana santa. La computadora en el refrigerador evidentemente está presente, sin embargo se convertiría en algo del entorno, por ende el usuario no se daría cuenta de su existencia.) Por cierto que este tipo de tecnología se conoce, como Computación Ubicua,en donde el procesamiento de información, se ha integrado por completo en las actividades y objetos cotidianos.


Por otro lado, el posible uso de interfaces futuras para personas con discapacidad es fenomenal!
Por ende, a pesar de los retos que pudiesen existir en cuanto a la tecnología, el reto principal es entender las capacidades humanas para poder analizar como se debería integrar ese entendimiento con nuevas tecnologías de diseño, con nuevas interfaces de usuario.
Aquí hay un video de un librillo que usa la realidad aumentada y muestra otro tipo de interación entre las máquinas y los humanos