Sunday, December 21, 2008

Love and Marriage

Nota: Puede leer este escrito en español aqui!
Gracias a mi viejo amigo que lo tradució y publicó en la revista virtual de este pais.

I was away in a little Mexican town, and had no electricity what so ever, this provoked that I started writing a bit, the following text is the result of the writings that I did in this lovely little Mexican town.


The phrase home sweet home is usually one of many fallacies that exist related to a married household, Tolstoi described it as hell, and I give him credit for this. Considering that both humans that decided to conform this marriage are normally not all that benevolent and are inclined to be a bit neurotic, why should they suddenly turn into angles after they were wed?
If we ears dropped on any married household we are certain to hear a number of nasty fights.

Furthermore if we started to ponder on what it means to select A Partner for the rest of our lives, we reach the following conclusion: When we are selecting a partner, we are placing a bet. Since it is impossible to know what the future evolution of the relationship will be, or what the future evolution of my partner will be.
Although I don’t think that the problem lays on the bet itself, I believe the problem rests in the fact that this selection of the person one will wed is usually not taken as a true decision.
Usually the newly wed have never really thought about what their chances of success with their current partner are . Their attention is usually diverted from the ethical problem, that they have, the bet like characteristic of an election of this kind is diminished by making the newly weds believe that they are together due to destiny, or because they just KNEW that they had to be together. In this way the decision part is completely lost and forgotten.
Since this KNOWLEDGE that they were meant to be, is likely to be imperfect and time limited, it should be placed with a guarantee The only guarantee that could be valid for this situation is the strength of our decision, in which we say that we will be with that person for the rest of our life, no matter what.

The important thing is to be aware that when making a decision of this kind, our decision is tied to a series of unfair situations that might arise and whose consequences we are engaged to assume, we might live happily ever after or we might not.
When choosing to marry someone, we are NOT telling that person, that they are the man or woman from our dreams who fills up all of our desires. That would be a lie we are keeping a mere illusion of that person, I am sure that after a few weeks of living with that individual and seeing them day in and day out the whole fantasy would be lost.
When choosing someone to marry what we are really saying is:I want to live with you, just the way you are. And what that means is : I have chosen you to share my life with, and that proves that I love you.

amor no pasional

A life that is united with mine for a life time. That is the miracle of marriage. A life that wants my well being because it is related to it’s own well being.
So the happiness in a marriage seeks for the well being of the loved one, and when one acts searching for the well being of others, one is following the word of Christ, Jesus Christ said we should love each other. Marriage is the image of love that Christ had. It is a love that is truly reciprocal, We love our partner just the way our partner is, we don’t love love, we don’t love the idea of love, we love our partner without idealization, just like God loves us with the form and limitations we have.

The main conflict that I believe arises in the married couple is that we live in a society, where the kind of love the Jesus Christ invoked and the kind of love in which marriage was established, is currently not a love that is valued.
The kind of love that our society values the most is passionate love.
But what is exactly passionate love?
Passion means suffering ,where destiny has complete power over that person, the person is no longer free or responsible. Passion means loving love more than the object of love, loving passion by itself, it is to love and to seek suffering. Passion-Love: desire for what hurts us and kills us in its triumph .
Love and death, mortal love is what the great majority of our poetry is about, or at least the kind that is the most popular, we see this theme in prose as well; we see it in our best movies, as well as our best songs. A happy love has no story, only mortal love is worth a tale.
We glorify passion, we have great enthusiasms for it, we no longer think of passion as what will hurt, we see it as a more lively life promise, it has a power that transfigures, we see it as something that is beyond happiness and suffering ,a sizzling beatification.
Why do we wish to feel this passion that hurts us even when our reason also condemns it? Why do we long for this love whose bloom can only be suicidal?
Wagner says it is due to our attraction for death, that attraction to know that we are in the limit.
This attraction for death that our society has, might have been influenced by a dualist world conception, this dualist conception sees in life a true tragedy, a disgrace ;but sees in death the ultimate victory , in which the being will be reintegrated to the unit, through death man is ascended to its god. In order to bring our sacrifice, a magnification of our desires is needed.
The kind of love that this dualism conception harvest is a kind of love that denies any kind of earthly love, it also denies any kind of earthly happiness.

passionate love

Having obstacles is what makes passion grow, having a preference for obstacles is saying YES to death , it is a progress toward a voluntary death. No earthy love can exist because its goal is the search for passion and passion means suffering, it is not about reciprocal love, it is about having a love that is not reciprocal or that agonizes from a series of conflicts.
This kind of conception is completely different to the kind of conception Christianity has, and the kind of conception in which marriage is settled in.
The Christian’s God turned himself into a man, a true man. The salvation of man kind is no longer through death, the Christian’s God, my God, said it was not necessary to distance oneself from this world in order to unite with him, he turned himself into a man and came close to us, he opened up a new door to his Kingdom, in which through sanctification one can enter. Sanctification is completely different to sublimation, which is an elusive getaway from life.
Love is no longer seen as something that one must run away from, or in which obstacles should be found. This kind of love turns and smiles at life. Love is turned into a positive action, a transforming action that is set to the present. It is transforming because through love we will be allowed to enter God’s Kingdome . It is on earth where our destiny is decided. Our salvation is no longer in the other realm, it is no longer in the desire that consumes life, it is here on earth by obeying God’s word.

Marriage is all about loving your partner day in and day out, giving love in the present, loving them just the way they are, I think that the problems marriage has been having are due to that fact that we are influenced by 2 different love perceptions, the Christian love and the dualism love conception. There might be a couple that gets married, but because of the dualism ideas that they may be predisposed to having, they could be seeking ,without knowing it, for obstacles. One of the obstacles in which married couples usually fall for, is infidelity.
I truly believe that faithfulness in our society, is seen as the least natural of all virtues and the one that brings the less happiness. They think that the success of a marriage is the result of an inhuman effort. They consider that faithfulness is an imposed discipline by an absurd or cruel ideal. We have the habit of exploring each situation to its maximum, without having any mechanisms that judge the situation. The acquired respect to the social system is what keeps the idea of faithfulness. Even when the obstacle is not that difficult to overcome, we find excuses to surrender to it.


I believe that to overcome this problem, or any kind of problem that might arise in a marriage, we should first of all follow Jesus words with all of our heart, and second of all we should have the will to carry out a project. This project is to have a constant need to act for the loved one, wishing to govern the real world and not escape it. This project allows us to build a true master piece and it gives us the opportunity of having glory through it.

I hope that understanding the context of where different kinds of love originated from, can help us be more aware of how we act, and allow us to take a true decision in our love lives of what kind of love we wish to pursue.


Monday, December 08, 2008

¿Qué es Samba y cómo instalo Samba ?

Al leer el título de ¿ cómo se instala?, se le debió haber ido al lector la loca idea, que hablaremos acerca de una danza brasileña.
Lamentable para varios, interesante para muchos otros, en esta ocasión tocaremos el tema de qué es el software de Samba, y cómo se puede instalar en una máquina, para tenerlo listo para usar.
En primera instancia es importante entender, ¿para qué usaríamos Samba?
Es claro que Linux es genial, y lo amamos, sin embargo no vivimos en un mundo aislado, esto es podemos tener nuestro sistema Linux, mas es muy comùn que queramos acceder a archivos en otros sistemas operativos--el más típico es uno que esté corriendo Microsoft Windows. El paquete de Samba se puede instalar en la distribución Linux que se tenga,para hacer posible que se puedan compartir archivos.
En si Samba es una herramienta para los sistemas UNIX que permite compartir archivos sobre una red que tenga Microsoft Windows o cualquier otro sistema operativo que soporte el modo de compartimiento de archivos que utiliza Microsoft Windows, Microsoft Windows file sharing, este protocolo se suele llamar SMB, el cual mantiene las siglas de Server Message Block,ie. Bloque de Mensaje de Servidor.

Para instalar Samba, simplemente se escribe en la consola:
sudo apt-get install samba

¡No se debe cerrar la terminal al concluir la instalaciòn, ya que la usaremos aún para otras tareas!

Ahora veremos cómo se debe configurar Samba.
Para ello primero detengamos a Samba

sudo /etc/init.d/samba stop

Debido a que lo que se acaba de instalar de Samba, mete un archivo predefinido, que no hace mucho, lo vamos a renombrar, (siempre es bueno mantenerlo, por si ocurre cualquier cosa incómoda) para trabajar con el archivo original, y meterle las cosas que requerimos.
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.template
Después crearemos un archivo nuevo vacío.
sudo touch /etc/samba/smb.conf
finalmente necesitamos abrir el archivo dentro de algún editor.

sudo nano /etc/samba/smb.conf

Se deberá copiar/pegar el contenido de la sección que se muestra a continuación en el editor y continuar ...

; General server settings
netbios name = TU_NOMBRE_DE_HOST
server string =
announce version = 5.0

passdb backend = tdbsam
security = user
null passwords = true
username map = /etc/samba/smbusers
name resolve order = hosts wins bcast

wins support = yes

printing = CUPS
printcap name = CUPS

syslog = 1
syslog only = yes

; NOTE: If you need access to the user home directories uncomment the
; lines below and adjust the settings to your hearts content.
;valid users = %S
;create mode = 0600
;directory mode = 0755
;browseable = no
;read only = no
;veto files = /*.{*}/.*/mail/bin/

; NOTE: Only needed if you run samba as a primary domain controller.
; Not needed as this config doesn't cover that matter.
;path = /var/lib/samba/netlogon
;admin users = Administrator
;valid users = %U
;read only = no

; NOTE: Again - only needed if you're running a primary domain controller.
;path = /var/lib/samba/profiles
;valid users = %U
;create mode = 0600
;directory mode = 0700
;writeable = yes
;browseable = no

; NOTE: Inside this place you may build a printer driver repository for
; Windows - I'll cover this topic in another HOWTO.
path = /var/lib/samba/printers
browseable = yes
guest ok = yes
read only = yes
write list = root
create mask = 0664
directory mask = 0775

path = /tmp
printable = yes
guest ok = yes
browseable = no

; Uncomment if you need to share your CD-/DVD-ROM Drive
;[DVD-ROM Drive]
;path = /media/cdrom
;browseable = yes
;read only = yes
;guest ok = yes

path = /media/samba/
browseable = yes
read only = no
guest ok = no
create mask = 0644
directory mask = 0755
force group = TU_NOMBRE_DE_FRUPO
Ahora bien, para que funcione en su red esto, deberá hacer sólo algunos cambios al archivo, estos son:

-> netbios name = TU_NOMBRE_DE_HOST

en donde dice "TU_NOMBRE_DE_HOST", ponga su nombre de hostname ó de cliente.(Es importante, que NO SE USEN ESPACIOS!!) Lo mejor es poner el mismo nombre que se uso cuando se configuró la instalación.
netbios name = DAPPER

Otra cosa, que se deberá cambiar es el grupo de trabajo:
-> workgroup = TU_GRUPO_DE_TRABAJO

donde dice "TU_GRUPO_DE_TRABAJO" ponga el nombre de su grupo de trabajo, pero deberá ser el mismo que se tiene configurado en Windows.

Para encontrar el grupo de trabajo que se tiene en Windows, se deben seguir los siguientes pasos:

- De click en Inicio
- de Click en Panel de Control
- Click en sistema
- De click en la segunda pestaña que dice el nombre de la computadora, y encuentre el grupo de trabajo que se tiene alli.

workgroup = MSHOME

Donde dice
-> wins support = yes

Póngalo en no si su máquina no cuenta con una dirección ip estática.
En este caso no se tendrán los beneficios que tiene WINS :(

Donde dice
-> [MyFiles]
Este es el nombre de la carpeta que se mostrará para compartir, se puede dejar con ese nombre, o se puede poner otro nombre, sólo que no se deben usar más de 31 caracteres y evite los ESPACIOS!

Lo siguiente:
-> path = /media/samba/

sugiere que se ha montado una dispositivo, o que se ha hecho una partición. Aquí es donde todos los archivos compartidos se guardarán.

En linux podemos poner especificar también donde estará la carpeta que tendrá los archivos compartidos. Asumiendo que se desea poner dentro de la carpeta de home, haríamos lo siguiente, dentro de una nueva terminal:

sudo mkdir /home/samba
y en la otra consola que se tenía abierta, la que estaba con el edito, busque donde dice "path =" y ponga alli la dirección anterior.
path = /home/samba/

También se debe editar lo siguiente:

-> force user = SU_NOMBRE_DE_USUARIO
-> force group =SU_NOMBRE_DE_USUARIO

Remplace "SU_NOMBRE_DE_USUARIO" con el nombre que use para el login, o para iniciar sesión a su máqina.(sin ESPACIOS!)


force user = stormbringer
force group = stormbringer

Hemos ya completado la parte de editar smb.conf
Guarde el archivo y salga del editor

Debido a que vamos estar compartiendo el archivo con otros usuarios, debemos poner los permisos adecuados.

sudo chmod 0777 /media/samba

Eso es todo. :)
Ahora se deberá prender samba.

Para prender samba por primera vez, escriba:

sudo /etc/init.d/samba start
No debió haberse sucitado ningún error- si se obtuvieron errores, se deberá checar que todas las rutas estén bien, ó busque por errores de ortografía etc.
Ahora se deberá agregar a si mismo, como usuario samba.


sudo smbpasswd -L -a your_username
sudo smbpasswd -L -e your_username
Ya que se ha configurado samba y creado las cuentas de los usuarios, hemos terminado con la parte de Linux, sin embargo hay algo que se deberá poner en Windows.

Si escogió que no tenía IP estática, En la máquina con Windows:With WINS disabled:
- De click en INICIO
- botón derecho a mi PC
- Seleccione el mapa de drivers de la red
- Seleccione la letra del driver
- Escriba \\\MyFiles

- Dé click en Terminar

Eso es todo samba está arriba y corriendo! Pruebelo, jale una imagen ó un archivo X, a la carpeta que tiene compartida, este archivo deberá aparecer después de unos instantes en ambas carpetas para compartir.

Wednesday, November 26, 2008

Deine Indifferenz ist mir scheißegal!

Bien, la versión 4 del protocolo IP (Internet Protocol). Es el estándar actual de Internet para identificar dispositivos conectados a esta red.
Sin embargo, IPV4 no fue la primera versión del protocolo IP que existió, (esto es claro, debido a que es la versión 4!) Veremos ahora unas diferencias que existen entre la versiòn 4 y la versiòn 2, esto es IPV2.

En RFC 791,ó en IPV2, el mismo espacio de dirección así como los mismos campos de la cabecera IP (Las direcciones de destinatario y fuente) son usados para identificar y localizar, usualmente el identificador de un host es idéntico a su localizador,
este identificador es ùnico tanto en tiempo como en espacio.
En IPV4, es un hecho que las direcciones YA NO son globalmente únicas y no tienen un nivel de vida indefinido.

Tambièn han existido mucha evoluciòn en el modo de hacer routing desde que IP se especificò por primera vez [RFC 791]. Muchos de los principios de Routing han pasado a ña historia, algunos principios sí se han perservado, mientras que nuevas principios han sido introducidos.
Más información, se puede leer aqui->
  • Click hier,um etwas schön zu sehen!
  • Wednesday, November 19, 2008

    Von zeit zur zeit denke ich an dich und mich...

    No es sencillo en Windows, (a partir de Windows XP), sacar datos por el puerto paralelo.
    El sistema operativo simplemente no da permisos para hacerlo, los sistemas operativos Windows 2000 y XP no permiten que los programas tengan acceso directo a este puerto!
    Es mucho más fácil hacerlo en Linux Gnu, pero si uno está obsesionado con hacerlo en Windows XP, aquí están los pasos que deberá seguir para tener acceso a la escritura en este puerto:

    1. Baja y descomprime el archivo UserPort

    2. Copia el archivo userport.sys al directorio C:\WINDOWS\SYSTEM32\DRIVERS

    3. Ejecuta el programa userport.exe, y sin tocar nada mas, presiona el botón "Start", luego cierra el userport.Esto tendrás que hacerlo cada vez que reinicies el ordenador.

    4. Finalmente ejecuta el programa que daba problemas en modo de compatibilidad para “Windows 98”. ¿como se hace esto? Muy sencillo:

    Para establecer las propiedades de compatibilidad de un programa:

    * Haga clic en el botón derecho del ejecutable o en el acceso directo al mismo, y haga clic en Propiedades.
    * Seleccione la casilla de Ejecutar este programa en modo compatibilidad.
    * Seleccione de la lista el sistema operativo Windows 98.
    * Ejecute el programa de nuevo cuando haya terminado de cambiar la configuración.

    Ahora bien, se "supone" que con esto debemos poder tener acceso al puerto paralelo, claro está que es necesario probarlo, para hacerlo se puede hacer un sencillo programa en C++, y usar la siguiente función:
    Esta función, localizada en la librería de Conio.h, (uuuh Conio...gag me with a spoon!) recibe 2 parámetros, " a" es el puerto al cual se desea escribir, en este caso es el puerto paralelo y por ende se pondría aquí 0x378, que es el número asigando a este puerto, y "b", que es el valor que se desea enviar a esta puerto. b es un valor entero, y el valor máximo que puede tomar es 255,esto se debe a la configuración del puerto paralelo que usé, contaba con 8 bits de salida, y los demás representaban tierra y uno extra la señal de storbe.
    Recordemos que el bianrio 11111111 equivale a 255, y por ende es el mayor valor que se puede representar con esta salida, ahora bien el menor valor es cero, y es cuando tenemos 00000000.

    Un programa simple, para verificar que nuestro puerto paralelo está funcionado adecuadamente se presenta a continuación: (Este programa lo corrí en Visual Studio 2003)

    int main()
    char c='s';
    int orden, alphacommand = 1, betacommand = 2;

    while (tolower(c)=='s')
    printf("\n1 = alphacommand\n");
    printf("2 = betacommand\n");
    printf("Elija el comando (1/2): ");
    if (orden==alphacommand)
    _outp(0x378, 0x1);
    else if (orden==betacommand)
    _outp(0x378, 0x0);

    printf("\nComando Realizado.\n\nDesea Continuar?:(S/N)");
    c = getch();

    return 0;

    El programa anterior cuando se escoje el alfacomando, prenderá un bit del puerto paralelo, con un multimetro se puede verificar que esto se lleve acabo realmente.
    Esperemos que este post ahorre el tiempo de las personas...und sie können mit dieser Zeit eine gute Liebe finden

    Tuesday, November 18, 2008

    Un mensajito no de amor, sino de ICMP...:(

    Los errores de mensajes ICMP, se usan por los routers y los hosts ó clientes, para decirle a un dispositivo enviador de datagramas, que se tuvieron problemas recibiéndolo.
    En la versión original de ICMP, 5 diferentes mensajes de error son definidos. Estos mensajes se describen en el estándar ICMP, RFC 792.
    Veamos ahora los mensajes de error que presenta ICMPv4:

    Mensaje de "Destino Inalcanzable" : Los cuales se envían cuando existen fallos en el envió del datagrama.
    Seamos reales, el protocolo de internet es uno que no es muy confiable, no existe garantía que un datagrama que es enviado por dispositivo hacia otro vaya realmente a llegar. Toda la red de clientes y routers hará su mayor esfuerzo para entregar un datagrama, pero es posible que no llegue a su destino por un sin fin de razones. Claro está, que los dispositivos que se encuentran en una red IP entienden esto, y se diseñan adecuadamente.

    Ahora bien, a pesar de que IP está diseñado para fallar, no se deben tomar estas fallas a la ligera. Se necesita un mecanismo que le diga al dispositivo fuente, que algo "malo" está sucediendo, además se le deberá decir la razón de ello.
    En IPV4 este servicio se brinda através de la transmisión del mensaje "Destino Inalcanzable". Estos mensajes, incluyen la porción de los datagramas que no se pudieron entregar, esto ayuda a que emisor entienda en dónde se tuvo el error.

    Se muestra a continuación el formato que tiene el mensaje de Destino Incalcanzable


    Se muestran a continuación códigos de los subtipos de errores (Error Subtype) que presenta este tipo de mensajes:

    Valor de código

    Subtipo de mensaje



    Red inalcanzable

    El datagrama no pudo ser entregado a la red que se especificó en el campo de ID de red en la porción de la dirección IP. Se peude deber a un problema en el routing, aunque también puede ser causado por tener una mala dirección


    Cliente inalcanzable

    El datagrama logró llegar a la red que se especificó, mas no pudo ser entregado al host que se indicó en la dirección. Esto suele ser de nuevo un problema relacionado con el ruteo.


    Protocolo inalcanzable

    El protocolo que se especifico en el campo del protocolo fue inválido para el cliente al cual el datagrama fue entregado.


    Puerto inalcanzable

    El puerto destino, especificado en la cabecera UDP ó TCP fue inválido.

    Mensajes de Fuente sofocada: Se utiliza para decirle al dispositivo que deberá enviar los datagramas a una menor tasa.
    Si un destinatario, está recibiendo datagramas a una tasa relativamente lenta, es posible que procese cada uno de los datagramas al vuelo, en el momento en el que los recibe. Sin embargo, la recepción de datagramas en una red tienede a ser disparejo, debido a las tasas altas y bajas de tráfico existente. Para esos momentos en los cuales se reciben datagramas a una frecuencia mayor que en la que se pudiesen estos procesar, todos los dispositivos cuentan con un buffer en donde pueden temporalmente guardar a los datagramas que reciben, se guardarán allí hasta que ya tengan tiempo para procesarlos.
    Sin embargo el buffer es en si de un tamaño limitado, y pueden existir casos en los que el tráfico se recibe tan rápido que el buffer se llena. Cuando esto sucede, el dispositivo se ve obligado a desahacerse, descartar todos los nuevos datagramas que le lleguen. El receptor deberá por ende enviar un mensaje de retroalimentación a la fuente y explicarle su problema.

    En IPv4,un dispositivo que es obligado a "tirar" datagramas debido a una congestion, le envía al receptor retroalimentación a la fuente, mediante los mensajes de Sofocamiento de la fuente. Es una manera cortés de decirle a la fuente: " ¡¡No tan rápido!!" . Cuando un dispositivo recibe este tipo de mensajes, sabe que debe disminuir la frecuencia a la cual envía los datagramas al receptor en cuestión.
    Se muestra continuación el formato de este tipo de mensaje:

    Nombre del Campo

    Tamaño (bytes)




    Tipo: Identifica el tipo de mensaje ICMP. Para mensajes de Sofocamiento de fuente, este valor se pone en 4.



    Code: Identifica el subtipo de error siendo comunciado, en este caso no se usa y se deja en 0.



    Checksum: Campo de 16 bits usado en la cabecera del ICMP



    SinUSO: 4 bytes que se dejan en blanco y no se usan

    Porción original del Datagrama


    Porción original del Datagrama: Incluye toda La cabecera así como los primero 8 bytes del datagrama que fueron descartados debido a congetionamiento.

    Mensaje de tiempo excedido: Se envía cuando un datagrama ha estado viajando por la red demasiado tiempo, ó cuando se está tardando mucho en unir los distintos fragmentos del datagrama, para re esamblarlo.

    Mensaje de Redirección: Este mensaje permite que el router dé retro alimentación respecto a mejores rutas que existen para llegar a un cliente.

    Mensaje de Problema con los Parámetros: Este es un mensaje genérico, usado para todos los demás problemas que pudiesen existir que no están cubiertos en los otros mensajes de error de ICMP.
    Si un dispositivo encuentra problemas serios con cualquiera de los parametros dentro de la cabecera de un datagrama IP, deberá descartar o deshacerse del datagrama. AHora bien, debido a que se trata de una situación crítica, deberá comunciarse con el emisor del datagrama y reportr su problema. Esto se logra através del uso del mensaje "Problema de Parametro" que ICMPv4 brinda.
    Este es un tipo de mensaje que peude ser usado, para indicar cualquier tipo de error que exista en la cabecera de un datagramaIP.sage had the problem.

    Nombre del Campo

    Tamaño (bytes)




    Tipo: Identifica el tipo de mensaje ICMP, este valor se pone en 12.



    Code: Identifica el subtipo de error siendo comunciado, se muestra una tabla abajo de esta que indica el tipo de suberrores que pueden existir.



    Checksum: Campo de 16 bits usado en la cabecera del ICMP



    Apuntador: Apunta a la localización del datagrama donde se ocasionó el problema.
    Se utiliza este campo, sólo cuando el valor del código es 0.



    SinUSO: 4 bytes que se dejan en blanco y no se usan

    Porción original del Datagrama


    Porción original del Datagrama: Incluye toda La cabecera así como los primero 8 bytes del datagrama que fueron descartados debido a congetionamiento.

    Ahora se muestran los parámetros para interpretar los códigos de error

    Valor del Códig

    Tipo de Submensaje



    El apuntador indica el error

    El apuntador indica donde se localiza el error.


    Falta un campo requerido

    Debido a que el apuntador no puede señalar donde existió este tipo de error, debido a que el campo NO existe, es necesario manejarlo de este modo.


    Longitud incorrecta

    La longitud total de datagrama fue incorrecta, lo cual indica un problema general con todo el datagrama. De nuevo el apuntador no es de mucha ayuda.

    Monday, October 06, 2008

    Why I no longer hate networking, as much as before

    Creo, que los algoritmos de deodificación, me agradan bastante. ¿Ya conocían el de Viterbi?
    Está bastante interesante como funciona, usa likelihood probabilities, en Aprendizaje o Machine Learning, se usa mucho para diversos métodos de aprendizaje.
    No conocía en lo personal yo el de Markov, y de hecho Viterbi se basa en este método para su funcionamiento ,Belive it or no, es bastante straight foward.
    Je, veamos sí es tan cierto,intentaré explicarlo:

    Viterbi: Es un algoritmo de decodificación, desarrollado a finales de 1960 por Andrew Viterbi. Los decodificadores Viterbi, han sido la manera más efectiva de decodificar comunciaciones de voz inalámbricas en transmisiones satelitales y de celular. Viterbi saca ya sea 0 o 1, dependiendo de lo que estima, que es el bit de entrada.El algoritmo de Viterbi, brinda una manera eficiente de encontrar la secuencia de caracetres con mayor probablidad a posteriori, (MAP)

    Para ilustrar como funciona el algorimto de Viterbi, daré un pequeño ejemplo:
    Assúmase, que se tiene un alfabeto de 4 letras, A={T,A,C,O}, y que se tiene un Optical Character Readers , un lector de caracteres, el cual intentará leer palabras que sean válidas del inglés. Supónase, que la cadena observada por la maquina OCR es: Z= -CAT-, donde el "-" denota espacios en blanco. Los vectores característicos z1, z2, and z3 son obtenidos cuando el extractor de característica detecta a C,A,T. (GATO en español, y es una palabra válida del idioma inglés.)
    La información disponible obtained y relevante que el algoritmo Viterbi utliza para tomar una decisión, se expresa en término de la gráfica direccionada, que se muestra a continuación. Todos los nodos, excpetos los que están en blanco "-", poseen una probablidad ascosciada a ellos.


    Vemos, de la figura , que cualquier camino , de un nodo principio, hasta un nodo final, represneta una secuencia de letras, mas no necesariamente una palabra válida. Se trata de hallar la sequencia de letras que maximizen el producto de probabilidades en su camino. Esto se puede lograr, al porcesar los nodos verticales, paso por paso de izqueirda a derecha. De este modo, si se agregan los logaritmos de las orillas, y las probabildiades de nodo, del camino, obtenemos:

    gGAT(z1,Z2,Z3)=logp(z1|C)+logp(z2|A)+ logp(Z3|T)+log[P(C|-)P(A|C)P(T|A)P(-|T)]

    Con este modelo, las letras del idioma inglés se visualizan como salidas, de un proceso de M estados de Markov, donde M es el número de caracteres distinguibles, si se trata de letras, el número será de 26, ya que el alfabeto del idioma inglés, pose 26 letras. En cada etapa de la secuencia (palabra), las 26 más probables secuencias se procesarán, la secuencia más probable que terminé en A, la secuencia más probable que termine en B, etc. En la etapa final, la secuencia más probable es seleccionada.

    Saturday, September 27, 2008

    Stay home saturday...

    Sometimes I just can't be bothered with the Bingo or going down the local strip joint and just want a quiet night in and sometimes I don't get a choice.

    I sometimes have to make up an excuse to friends if I want to stay in as they would not accept the truth. They think I'm sad if I forsake the chance of fun and frolics (and maybe prizes) or having some jigglies thrust in my face for a night in at Casa Ham&Onion.

    Do you agree with my friends and think it is sad to stay in on a Saturday night? Or do you think it is fine enjoy one's own company and the telly with a plate of chips and some neopolitan icecream?

    I don't tell them about the Babyliss Foot Spa I have.

    Saturday, September 20, 2008

    Cantando con Radio Felicidad...

    My 64 bit Kubuntu, finally has the freaking flash plug in!!
    This webpage is really good :

    It explains everything soooo clearly! step by step, for dummies like mua.
    To celebrate, let's sing an old fashion love song:

    Wednesday, September 17, 2008

    Battery Mattery...

    Pilas: Se puede leer el nivel de las pilas, con el reporte 0x20. Se recibe este reporte, cuando se conecta algo estern al Wiimte. O se peude solicitar, al enviar un reporte 0x15, con el payload puesto en cualqueir valor , aunque el bit 1 debe estar encendido. (a1) 20 00 00 02 00 00 C0
    el 0xC0, al final indica el nivel de pila. Depende mucho, de la marca, ya que algunas pueden rgistrar valores de 0xC8, al estar totalmente cargadas.
    Es importante notar, que se puede obtener este mensaj sin solicitud, cuando esto suceda, se tendrá que enviar un reporte 0x12 con el numero de reporte deseado, para poder recibir información nueva y de otro tipo.

    Memoria que tiene abordo el wiimote

    Memoria Flash: En un Wiimote que está en blanco, es decir uno que se haya comprado por separado del Wii, y que nunca se haya conectado a el. La memoria, estará estructurada de la siguiente manera:
    Direcciones 0x0000 a la 0x003F:

    A1 AA 8B 99 AE 9E 78 30 A7 74 D3 1 AA 8B 99 AE
    9E 78 30 A7 74 D3 82 82 82 15 9C 9C 9E 38 40 3E
    82 82 82 15 9C 9C 9E 38 40 3E 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Estas son basicamente dos secuencias, cada una repetida dos veces:
    A1 AA 8B 99 AE 9E 78 30 A7 74 D3
    A1 AA 8B 99 AE 9E 78 30 A7 74 D3
    82 82 82 15 9C 9C 9E 38 40 3E
    82 82 82 15 9C 9C 9E 38 40 3E
    Los tres bytes empezando en 0x16 y 0x20 (Los tres primeros bytes de la tercera y cuarta linea ) guardan la los offsets de los zeros calibrados del accelerometro.
    Se cree que el 9C 9C 9E guardan la fuerza de gravedad que hay en esos ejes.
    Direcciones 0x0040 a 0x0FC9: Todos estan en ceros en un Wiimote recien comprado Direcciones 0x0FCA a 0x12B9: Es el bloque 1 Mii Data , esta todo en ceros en un Wiimote recien comprado.
    Direcciones 0x12BA a 0x15A9: Mii Data bloque 2 , esta todo en ceros en un Wiimote recien comprado.
    Direcciones 0x15AA a 0x15FF: esta todo en ceros en un Wiimote recien comprado.
    Direcciones 0x1600 a 0xFFFF: No existen, se regresa un error, si uno trata de leer de ellas. Aunque no se obtendrá el error, si uno empeiza a leer antes o en la dirección límite 0x15FF. En ese caso, Sólo se obtendrán ceros , para los bytes invalidos

    Para la memoria Flash, la dirección está hecha de sólo 2 bytes. Entonces, la dirección 0x010000 se trata de la misma manera que la dirección 0x0000. Esto se cumple hasta la dirección 0xFF0000. Ese Byte (0x00FF0000) siempre se ignora, a menos que el byte mas significativo (0xFF000000) tenga un 2 (0x04) puesto

    Con respecto a la memoria EEPROM, que posee también el dispositivo, parece ser, que la porción leible por el Bluetooth, empieza en la dirección 0x0070.

    Leer y Escribir: Se pueden leer datos con el siguiente comando: (52) 17 FF FF FF FF SS SS

    HID my ass...

    Interfaz HID
    El estándar HID, permite que los dispositivos se puedan describir a si mismos, utilizando un bloque descriptor de HID. Este bloque incluye una enumeración de reportes que el dispositivo entiende.Un reporte, puede ser visto como un puerto de una red, que está asigando con algún servicio en particular. La única diferencia, es que los reportes son unidireccionales, y el descriptor HID lista para cada puerto la dirección, ya sea de salida o de entrada, también dice cual sera el tamaño payload para cada uno de los puertos. Como todos los dispositivos HID, el Wiimote reporta su bloque descriptor HID, cuando se le pide información usando el protocolo SDP. Su descriptor, se ve de la siguiente forma:


    ID del Reporte Tamaño
    0x11 1 Player LEDs, Rumble
    0x12 2 Tipo de reporte/ID
    0x13 1 Habilita el sensor infrarojo
    0x14 1 Habilita bocina
    0x15 1 Controla el estátus
    0x16 21 Escribe datos
    0x17 6 Lee datos
    0x18 21 Le da datos a la bocina
    0x19 1 Pone a la bocina en silencio
    0x1a 1 Habilita el sensor infrarojo 2


    Reporte ID Tamaño
    0x20 6 Puerto de expansión
    0x21 21 Lee datos
    0x22 4 Escribe datos
    0x30 2 Es sólo para los botonesButtons only
    0x31 5 Da un reporte de sensado de los botones.
    0x32 16 Es puerto de expansión para los botones
    0x33 17 Da un reporte del sensado del movimiento , así como de los botones.
    0x34 21 Puerto de expansión del infrarojo
    0x35 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x36 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x37 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x38 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x3d 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x3e 21 Da un reporte del sensado del movimiento , así como de los botones.
    0x3f 21 Da un reporte del sensado del movimiento , así como de los botones.

    Nótese que "salida" se refiere a paquetes, que son enviados del host al wiimote, y "entrada" se refiere a paquetes que van del Wiimote al host.

    La notación de escritura, que se llevará acabo, es:

    Incluir la cabecera del Bluetooth en paréntesis, el ID del reporte, y finalmente el payload. Cada byte se escribe en hexadecimal, sin tomar el prefijo 0x y separado por espacios.
    Por ejemplo:
    (a1) 30 00 00

    Es un paquete de datos de entrada (0xa1), en el canal 0x30, con 2 bytes de payload 0x00, 0x00.

    You got an incomming call from Mr. Wiimote

    El Wiimote se puede comunicar a la computadora, vía Bluetooth. El controlador Bluetooth que se utiliza es el chip Broadcom 2042. El cual es diseñado para ser utilizado con dispositivos, que siguen el estándar Bluetooth de dispositivos de Interfaces Humanas, (HID por sus siglas en inglés) como pueden ser teclados o mice. El Bluetooth HID se basa directamente en el estándar USB, y mucha de la misma documentación es aplicable.

    La computadora, le puede pedir información al Wiimote, mediante el protocolo de descubrimiento de servicios, (SDP, por sus siglas en inglés). En este caso, el Wiimote reportará y regresará una gran cantidad de información.
    En particular reporta:
    Nombre :Nintendo RVL-CNT-01
    ID Vendedor0:x057e
    ID del Producto :0x0306

    El Wiimote envía reportes al host, con una frecuencia máxima de 100 reportes por segundo. Del estándar Bluetooth, El Wiimote no utiliza ninguna de sus validaciónes o codificaciónes.

    Ahora bien, para que la computadora tenga conexión con él, uno debe poner al control en modo de descubrimiento de servicios, esto se logra al apretar los botones 1 y 2 al mismo tiempo, o al apretar el botón rojo de sincronización, que se encuentra en la parte de atrás, cerca de la batería. Una vez que se encuentra en este modo, el HID driver del host, puede empezar a pedirle información al Wiimote.
    Pero, si el driver HID del host no logra conectarse con el Wiimote, en menos de 20 segundos, el Wiimote se apagará . Apretando los botones 1 y 2 continuamente, hará que el Wiimote, se tenga que mantener en modo de descubrimiento, por lo que no se apagará. Esto, no funciona cuando se utiliza el botón de sincronizar.
    Cuando se encuentra en modo de descubrimiento, los LEDS del Wiimote parpadearán. El número de parpadeos es directamente proporcional con lo que le queda de vida a la pila.

    Tuesday, September 16, 2008

    What wiitle Wiimote gives out...

    El Wiimote (Control Remoto Wii ) es el control principal de la consola Wii de Nintendo. Sus características más destacables son la capacidad de detección de movimiento en el espacio y la habilidad de apuntar hacia objetos en la pantalla. Este control, se está usando mucho ya, en video juegos, que pueden ser corridos en una PC, sin necesidad de la consola Wii. El Wiimote mantiene comunciación con la computadora, mediate Bluetooth.

    Analicemos ahora, la salidas que posee este control


    LEDS:Se encuentran en la punta del control, son 4 LEDS azules. Mientras se está jugando, estos LEDS se usan para indicar que el wiimote se encuentra en modo descubrible de Bluetooth (cuando parpadea, indica el nivel de batería) también sirven estos LEDS, para indicar el número de jugador al que corresponde ese control. (si es el número de jugador es 2, se prenderían dos LEDS) Los LEDS se pueden controlar de manera independiente.

    El rumble se da via un motor, que posee un peso desbalanceado, este motor puede ser activado para hacer así que el control vibre. El motor puede ser activado, al enviar un paquete de salida
    [SET_REPORT] a los canales 0x11, 0x13, 0x14, 0x15, 0x19 o 0x1a con el bit menos significativo puesto en: (52) 13 01
    La vibración, se puede eliminar al poner ese bit en cero: (52) 13 00
    Se puede utilizar cualquiera de los canales anteriores, aunque el canal 0x11 no es muy recomendable, ya que también se usa para controlar a los LEDS .

    El Wiimote, posee una pequeña bocina de baja calidad, la cual se utiliza para dar durante el juego efectos de sonidos cortos. El flujo de sonido que se debe tocar, se obtiene del host directamente.
    La bocina, es controlada mediante 3 reportes de salida, el reporte 0x14 se utiliza para habilitar o deshabilitar la bocina. Al poner en alto el segundo bit, se habilita la bocina, y al ponerlo en bajo, se deshabilita. Por ejmplo, para habiliar la bocina, se enviaría: (52) 14 04
    El reporte 0x19, se usa para silenciar o des-silenciar la bocina, funciona de la misma manera, que el reporte 0x14. 0x04 callaría a la bocina, y 0x00 haría que nuevamente sonará. (Una especie de mute y de unmute!)
    El reporte 0x18, se usa para enviar datos de sonido a la bocina. 1-20 bytes se pueden enviar en un sólo paquete.
    Ejemplo de un paquete que se podría enviar a la bocina:

    LL especifica el tamaño del dato que se enviará. Los bytes DD son el dato de sonido. Cuando el dato, posee un tamaño que es menor al de 20 bytes, se deben rellenar los lugares restantes. Los datos de sonido, por otro lado, se deben enviar a una frecuencia adeucada, se puede escojer la freucncia de muestreo durante la inicialización.

    Secuencia de Inicialización de la bocina.
    Las siguientes secuencias, inicializarían a la bocina:

    *Habilita la bocina (Envia 0x04 la salida del reporte 0x14)
    *Pon en silencio a la bocina (Envia 0x04 a la salida del reporte 0x19)
    *Escribe 0x01 al registro 0x04a20009
    *Escribe 0x08 al registro 0x04a20001
    *Escribe una configuración de 7 byte a los registros 0x04a20001-0x04a20008
    *Escribe 0x01al registro 0x04a20008 (La configuraión de 7 byte de la bocin, controlan justo la configuarión de la bocina, como es su frecuencia de muestreo. )
    *Regresa el sonido a la bocina (Envía 0x00 al reporte de salida 0x19)

    Formato del dato de sonido: Parece ser un sonido ADPCM de 4 bits. ADPCM (Adaptive Differential Pulse Code Modulation) utiliza una modulación, de modo que en vez de cuantificar la señal directamente, como el PCM, cuantifican la diferencia entre la señal y una predicción hecha a partir de la señal, por lo que se trata de una codificación diferencial

    Monday, September 15, 2008

    Undressing the Wiimote on a mexican night

    Veremos más de cerca al Wiimote.

    Empezaremos analizando su origen: Es manufacturado por Mitsumi (FCC ID POO-WC45) y Foxconn (FCC ID UMB-WCF7).

    Los componentes que conforman al Wiimote son:

    Parte Functiones Localizacion
    ADXL330 Acelerómetro Se encuentra en la parte de arriba, a la izquierda del botón A Data Sheet, Schematic
    H7824HE Driver del la bocina Arriba, entre la bocina y el botón 1 Data sheet
    ST 4128 BWP EEPROM Arriba entre home y botón A Data Sheet(?)
    BCM2042 Bluetooth, 8051 core, RAM/ROM Hasta abajo, localizado un poco arriba de las baterías. Product Info
    M 626 3322 ? Arriba, a la derecha del boton 1
    U7849 6Q63 Audio DAC?
    Convertidor digital analogico
    Abajo, junto al boton naranja para sincronizar, cerca de la batería ?

    Sí, es una foto de un Wiimote, que se compró por separado. Viendo su linda envoltura, uno se pregunta que secretos oscuros guarda este artefacto.

    Abriéndolo, empezamos a descubrir todos sus "dirty little secrets":

    Adentro, vemos algunas de las cosas que brinda Nintendo. La bocina, es el disco negro con las dos pestañas. El acelerómetro, ADXL330, está localizado justo donde se encuentra la cabeza del desarmador de la imagen anterior.

    En esta vista, que está un poco de lado vemos muchos otros componentes. En la parte de abajo, encontramos un pequeño motor vibrador, que sirve para dar el efecto de "rumbling". Asimismo, tenemos al final el senor infrarojo. Pegado al sensor infrarojo, se encuentra un capacitor de 4V 3300uF . Pero, ¿Para qué serviría un capacitor tan grande? Se cree que se utiliza, para limpiar el circuito DC,es decir para mantener estable el voltaje de entrada.
    Otra teoría, es que el capacitor funciona como una pequeña fuente de energia.
    Lo que sucede, es que si un jugador, se encuentra jugando muy efusivamente, las baterias AA, pueden comprimir los resortes lo suficiente, para desconectarlas temporalemente, al menos medio segundo. El gran capacitor, por ello, serviría para brindar energía al sistema momentaneamente.

    En la siguiente imagen, tenemos el botón scan push, y los muy elegantes clips para la batería AA.

    Todas las "cositas redondas" (330,100,4R7) son inductores 33uH, 10uH, and 4.7uH. Son usados principlamente para corriente directa a corriente directa con entradas altas o entradas bajas. Se pueden usar, para hacer filtreo. El filtreo es muy importante para tener una señal de radio frecuencia proveniente del circuito integrado Broadcom del Bluethooth limpia.

    BCM2042 es un circuito integrado de Broadband, de bajo costo para mouse/teclado inalambrico de Bluetooth. Utiliza un 8051 core, y una memoria RAM/ROM que guarda el perfil HID (HID, por sus siglas en inglés, human interface device , que significa dispositivo de interfaz con humanos, esto es un dispositvo de computadora que interacciona directamente con usuarios, toma entradas de humanos, y puede tener también una salida para entregar directo a humanos.) del bluetooth y la pila.

    El wiimote, tiene además un pequeño cristal de 24MHz.

    La imagen inferior, muestra el acelerometro y el EEPROM:

    Finalmente tenemos al ADXL330, o acelerómetro, con código 0614 (Lo cul significa que este chip fue construido en la primera semana de Abril del 2006!) asi como las muy esperadas tapas de los 3 ejes y la capa de sumistro de energía.

    La parte ST 4128 BWP , parece ser una EEPROM serial. Su hoja de especificaciones se encuentra : Aquí.
    Los pines 1 al 4, se encuentran conectados a tierra. Vcc es el pin 8, el pin 7 tiene el control de la escritura, y está atado con la resistencia R38. Los pines 6 y 5 son las lineas de los datos seriales y reloj serial. La EEPROM, guarda información acerca del identificador Bluetooth, asi como algunos valores, que sirven para hacer cortes en las grandes cantidades de valores que arroja el acelerómetro ó el sensor infrarojo. Contiene muchas constantes como el ID del Bluetooth, revision de firmware etc.

    Una gran parte de la funcionalidad del Wiimote se quema dentro del circuito integrado BCM2042 ,el cual es producido por Broadcom Corportation (Es importante saber, que Broadcom Corporation es una compañia norteamericana que construye circuitos integrados para comunciaciones de banda ancha) Allí, se guarda la pila HID del Bluetooth así como su protocolo.
    Uno, se podría preguntar, ¿Dónde hace su entrada aquí la EEPROM?
    La EEPROM aparece, debido a que durante el booting, se hace un ping a ella, para que devuelva el firmware del controlador del Wii. Por otro lado, se ha visto que la EEPROM, también guarda 'Miis'. Un Mii es un personaje personalizado, creado por el usuario, que participa en los juegos del Wii. La EEPROM guarda la información de este personaje.

    Monday, September 08, 2008

    Las entradas del Wiimote

    Aquí un poco de información, acerca de las entradas que tiene nuestro querido Wiimote:


    Existen 12 botones, en el wiimote, 4 de ellos están en la cruzecita que sirve para dar dirección, y los demás están exparcidos a lo largo de todo el control.

    Cuando algún botón, se presiona o se suelta, un paquete es enviado a la comptadora via un reporte de entrada HID (Un reporte HID se usa para transimitir datos de tipo HID control de y hacia dispositivos HIDClass, es importante aclarar de una vez, que un HD control, es una fuente de información ascoiada a un HIDClass devicereport) 30H, este paquete contiene una máscara de bit, con el estado actual de todos los botones. El estado de los botones, parece siempre incluirse en todos los reportes que brinda el Wimote a la computadora, esta información suele estar en los primeros dos bits.

    Por ejemplo, cuando se presiona el boton A, el paquete de entrada HID DATA que recibe la computadora es:

     (a1) 30 00 08

    y cuando se suelta, el paquete que se recibe es:

    (a1) 30 00 00

    La asignación de bit para los botones es:

    Botón Numero (dec) Valor (hex)
    Two 1 0x0001
    One 2 0x0002
    B 3 0x0004
    A 4 0x0008
    Minus 5 0x0010
    ? motion ? 6 0x0020
    ? motion ? 7 0x0040
    Home 8 0x0080
    9 0x0100
    10 0x0200
    11 0x0400
    12 0x0800
    13 0x1000
    ? motion ? 14 0x2000
    ? motion ? 15 0x4000
    ? Reading Mii ? 16 0x8000

    El boton de encendido, es inusual debido a que cuando se aprieta, envia una petición de desconectar en vez de enviar un código normal de botón

    Sensor de movimiento:


    El movimiento del control, se sensa gracias a un acelerometro de 3 ejes lineal localizado a la izquierda de donde está el botón A. El circuto integrado es el ADXL330 , el cual es construido por Analog Devices. Este dispositivo se calibra para que pueda medir aceleraciones que se encuentran en un rango de +/- 3g con 10% de sensiblidad.

    Dentro del chip, se encuentra una pequeña estructura micromecánica, la cual es sujetada por unos resortes hechos de silicon. Mediciones de diferencias en capacitancias, permiten que el desplazamiento neto de la pequeña masa, pueda ser convertido en un voltaje, el cual es digitalizado. Es importante aclarar, que el sensor no mide la aceleración del Wiimote, sino la fuerza ejercida por la masa de prueba a los resortes que la sujetan. Gracias a la convención de signo que se usa, esa cantidad es proporcional a la fuerza neta que ejerce la mano del jugador sobre el wiimote cuando lo agarra. Por eso, cuando se deja el wiimote sobre una mesa, el acelerometro marca la fuerza vertical de +g (la masa puede ser normalizada en unidades arbitrarias) y cuando cae se reporta una fuerza de casi zero.

    El sensor utiliza un sistema coordenado de mano derecha, con el eje X positivo a la izquierda, y ele eje Z positivo apuntando hacia arriba.

    El Wiimote, no suele reportar lecturas de los sensores a la computadora, aunque si se peuden pedir estos valores, al enviar al canal 0x12 SET_REPORT:

     (52) 12 00 31

    El tercer byte de la cadena anterior es una máscara de bit. 0x01 habilita el rumble o el vibreo del wiimote, 0x04 habiltia que las salida sean continuas. si 0x04 no está habilitado, los paquets sólo se sacan cuando sus valores cambian. (casi siempre, si es que el sensor de movimiento esta habilitado) . El Wiimote enivará a la computadora paquetes , donde los bytes 5, 6 y 7 contienen información acerca de las lecturas de X, Y y Z en el acelerómetro.

    Un ejemplo del paquete que se envia cuando el Wiimote esta acostado hacia arriba en una mesa es:

     (a1) 31 40 20 86 8a a5

    donde 0x86 es la medicion del eje de la X, 0x8a es la lectura en el eje Y, 0xa5, es la lectura en el eje Z.

    Se pueden escojer otro canales para los reortes de movimientos, como peude ser 0x31, 0x33, 0x35, 0x37, 0x3e y 0x3f. Si 0x3e o 0x3f son seleccionados, entocnes las lecturas de los sensores se alternarán entre estos dos canales.

    Se pude parar de hacer reportes de movimiento, al enviar al canal de salida un 0x30.
     (52) 12 00 30

    Parece ser, que modo del canal es relamente un modo selección por máscara de bits. La salida de los botones, siempre se haya habilitada. el modo 0x30 son sólo boones, 0x31 es sólo sensado de movimiento, 0x32 se cree que es la cámara infraroja, y 0x33 es tanto la cámara infraroja, como el sensor de movimeinto.

    Los puntos de inicio, es decir los puntos que se consideran cero, asi como los valores de gravedad para los 3 ejes del acelerometro, se guardan al principio de la memoria Flash del Wiimote. La informacion se empieza a guardar apartir de la direccion 0x16 de la memoria. Esta informacion se repite en la direccion

    0x20.0x16 punto cero para el eje X
    0x17 Punto cero para el eje Y
    0x18 Punto cero para el eje Z
    0x19 no se sabe que guarda
    0x1A +1G punto para el eje X
    0x1B +1G punto para el eje Y
    0x1C +1G punto para el eje Z
    0x1D no se sabe
    0x1E-0x1F checksum?

    Friday, September 05, 2008

    keep walking...

    When real people fall down in life, they get right back up and keep walking...

    Ja, mi robot no logró llegar a la final...better luck next year, pero seguiré trabajando!! :D

    Friday, August 29, 2008

    Una noche conociendo al Sr.Amplificador de Voltaje...

    Amplificador de voltaje: Es un amplificador diseñado para hacer crecer el voltaje de una señal.
    En generl,por su diseño, los amplifciadores pueden hacer que se tenga una ganacia grande de voltaje o una gran ganancia en corriente. Los amplificadores de voltaje son diseñados par maximizar la ganacia en voltaje, generalmente a expensas de una ganancia en corriente.

    Basicamnete, el Amplificador de Voltaje, no es más que un amplificador diferencial, que amplifica la diferencia entre dos entradas. Una entrada tiene un efecto positivo en la señal de salida, la otra entrada tiene un efecto negativo en la salida. El amplificador de voltaje, se suele representar mediante:

    2. Al amplificador de voltaje se le suele llamar Operacional, debido a que también puede servir para ejecutar numerosas operaciones, una de las más básicas funciones del amplificador de voltaje, es la de comparar voltajes. Aquí dos entradas se usan para comprar a dos voltajes diferentes. Si el voltaje de entrada , en la entrada + es mayor que el voltaje que existe en la entrada -, entocnes la sálida será 1000000 veces, la diferencia entre esas dos entradas.
    Por ejemplo, si la entrada al +, fuese +3.2 vDC, y la entrada al -, fuese de 3.215vDC, entocnes el voltaje de salida, sería de 1000000 X -0.015vDC= -15000vDC. Ahora bien, debido a que el amplifciador no puede dar un voltaje mayor a lo que recibió de entrada, la salida sería de -20vDC.

    Asimismo puede funcionar también como Seguidors: aquel circuito que proporciona a la salida la misma tensión que a la entrada
    Seguidor de tensión
    Se usa como un buffer, para eliminar efectos de carga o para adaptar impedancias (conectar un dispositivo con gran impedancia a otro con baja impedancia y viceversa)Como la tensión en las dos patillas de entradas es igual: Vout = Vin
  • Zin = ∞
  • También peude funcionar como un Inversor

    Amplificador inversor

    Se denomina inversor ya que la señal de salida es igual a la señal de entrada (en forma) pero con la fase invertida 180 grados.

    • El análisis de este circuito es el siguiente:
      • V+ = V- = 0
      • Definiendo corrientes: \frac{V_{in}-0}{R_{in}}=-\frac{V_{out}-0}{R_{f}} y de aquí se despeja
      • V_{OUT}=-V_{in}\frac{R_f}{R_{in}}
    • Para el resto de circuitos el análisis es similar.
    • Zin = Rin

    Por lo cual podemos controlar la impedancia de entrada mediante la elección de R1

    • V_{o} = -\frac{R_2}{R_1}*V_{in}
    Esta configuracion es una de las mas importantes, porque gracias a esta configuracion, se puede elaborar otras configuraciones, como la configuracion del derivador, integrador, sumador.

    No inversor Amplificador no inversor

    Sumador inversor

    Amplificador sumador de n entradas

    • La salida está invertida
    • Para resistencias independientes R1, R2,... Rn
      • V_{out}=-R_f(\frac{V_1}{R_1}+\frac{V_2}{R_2}+...+\frac{V_n}{R_n})
    • La expresión se simplifica bastante si se usan resistencias del mismo valor
    • Impedancias de entrada: Zn = Rn


    Amplificador diferenciador

    • Para resistencias independientes R1,R2,R3,R4:
      •  V_{out} = V_2 \left( { \left( R_3 + R_1 \right) R_4 \over \left( R_4 + R_2 \right) R_1} \right) - V_1 \left( {R_3 \over R_1} \right)
    • Igual que antes esta expresión puede simplificarse con resistencias iguales
    • La impedancia diferencial entre dos entradas es Zin = R1 + R2

    Integrador ideal

    Amplificador integrador

    • Integra e invierte la señal (Vin y Vout son funciones dependientes del tiempo)
    •  V_{out} = \int_0^t - {V_{in} \over RC} \, dt + V_{inicial}
      • Vinicial es la tensión de salida en el origen de tiempos

    Nota: El integrador no se usa en la práctica de forma discreta ya que cualquier señal pequeña de DC en la entrada puede ser acumulada en el capacitor hasta saturarlo por completo. Este circuito se usa de forma combinada en sistemas retroalimentados que son modelos basados en variables de estado (valores que definen el estado actual del sistema) donde el integrador conserva una variable de estado en el voltaje de su capacitor.

    Derivador ideal

    Amplificador derivador

    • Deriva e invierte la señal respecto al tiempo
    •  V_{out} = - R C \, {d V_{in} \over dt}
    • Este circuito también se usa como filtro

    NOTA: Es un circuito que no se utiliza en la práctica porque no es estable, esto se debe a que al amplificar más las señales de alta frecuencia se termina amplificando el ruido por mucho.


    • Convertidores carga-tensión
    • Convertidores corriente-tensión
    • Filtros activos
    • Girador permite construir convertidores de inmitancias (empleando un condensador simular un inductor , por ejemplo)

    3) La salida de un amplifciador operacional esta dado por:

    donde A es la ganancia de ciclo abierto del amplificador, Vp es el voltaje positivo de la entrada, Vn es el voltaje negativo de entarda. Es interesnate señalar, que A suele estar en el orden de

    5. Se suele asumir que un Amplificador Operacional tiene las siguientes características:
    *Ganancia Infinita
    *Una impedancia de entrada infinita, lo que hace que no haya corriente en las entradas.
    *Cero impedancia en la salida.

    Figure 1

    Ahora bien, hay ciertos conceptos, que debemos entender, para comprender mucho mejor, como es que funciona el amplificador operacional. Estos conceptos son:
    *Voltaje de Offset:
    El voltaje de offset es el voltaje equivalente en la entrada de un amplificador operacional.
    Si un amplificador tiene un voltaje de ganancia de 10, y un voltaje de entrada de offset de 10 microvolts, se tendrían 100 microvolts a la salida, cuando no se presentase voltaje de entrada.

    En electronica, la ganancia mide la habilidad de un circuito para incrementar el voltaje o amplitud de una señal. Se suele medir, como un cociente, este cociente posee a la señal de salida del sistema, así como la señal de entrada del mismo. Tambien se puede definir como un logarimto base 10 de la racion anterior.

    *Voltaje Pico a pico: no es otra cosa que la suma de las dos amplitudes máximas de la corriente alterna, la del sentido directo y la del inverso.

    Sunday, August 17, 2008

    Como funciona el teclado

    Un teclado, se parece mucho a una computadora en miniatura. Posee su propio procesador y circuitos, que sacan y reciben información de ese procesador. Una gran parte de esos circuitos,conforman la matriz de teclas. La matriz de teclas, es una especie de rejilla que se encuentra debajo de las teclas. Cada uno de los circuitos, se rompe en algún punto debajo de cada una de las teclas.
    Cuando se aprieta una tecla, se presiona un switch, el cual hace que se cierre el circuito, lo cual provoca que una pequeña cantidad de corriente pueda fluir por él.

    Cuando el procesador encuentra que un circuito se ha cerrado, compara la localización del circuito en la matriz de teclas, con el mapa de caracteres que posee en su ROM. Un mapa de caracteres es básicamente un "lookup table" o una especie de catalogo. Le dice al procesador, la posición de cada tecla en la matriz, y lo que cada combinación de teclas significa, por ejemplo, el mapa de caracteres, le dice al procesador, que apretar la tecla 'a' por si sola, corresponde a la letra en minúscula 'a', pero que la combinación de Shift y 'a' corresponde a la letra en mayúscula 'A'.

    Así que mientras uno escribe, el teclado analiza a la matriz de teclas, y determina que caracteres enviar a la computadora. Mantiene estos caracteres en su memoria buffer un tiempo, y después envía estos datos.
    El teclado, puede enviar estos datos ya sea por cable o por wireless, la señal del teclado es monitoreada por el controlador de teclado de la computadora. El cual es un circuito integrado, que procesa todo los datos que vienen del teclado y lo reenvía al sistema operativo. Cuando el sistema operativo, es notificado que el teclado ha enviado datos, checa si los datos son comandos a nivel de sistema. Un ejemplo claro, para entender esto, es cuando se presiona Ctrl-Alt-Delete en una computadora corriendo Windows, el sistema operativo se reiniciará.
    Si no se trata de ningún comando de sistema, el sistema operativo pasará la información del teclado a la aplicación que este corriendo.
    La aplicación determinará, si los datos del teclado, son un comando, como Alt-f, que abre el menú de archivo en una aplicación de Windows. Si los datos no son un comando, la aplicación, los aceptará como contenido. Ahora bien, si la aplicación actual, no acepta datos del teclado, simplemente ignorará la información.
    Todo este proceso es casi instantánea.

    Si pensamos que la relación CPU- memoria es una relación de marido-mujer, la relación de CPU-teclado, se podría considerar como una realción de buenos amigo. El CPU recibe la información, primero checa si es un comando de sistema, para checar si es un comando de sistema, se alia con su querida esposa MEMORIA. La esposa llamada Memoria, es un mujer un tanto timida, lista pero timida, que ayuda a entretener a los amigos de su esposo. Dependiendo del contexto en el cual se haye su marido y su amigo teclado, ella ya tiene lista sus tablas que entrega felizmente a su esposo CPU, su esposo CPU interpreta la información que le fue brindada, y hace con ellas maravillas. Se podría decir que el Sr. Teclado es un invitado en la casa de los CPU-Memoria. Un invitado el cual es entretendio por la audaz memoria y listo CPU

    Sunday, August 03, 2008

    guilt is like a seat belt for your soul.

    People are free to live whatever lives they so choose, but must be prepared to accept whatever consequences stem from their actions.

    Friday, July 25, 2008

    New Stupid Stuff that I Have learned with JavaScript

    So this has been a very exciting summer for me, full of programming fun!
    While my dad and brother were busy visiting China, and my mom was god knows where, I was home working on some dhtml for a web page I am currently working on.I had not been able to play much with javascript before, but this summer I learned some interesting stupid things I didn't know:

    To declare a button in HTML, we normally write:
    "< input name="myButton" value="Press Me!" id="myButton" type="button">"

    but what would happen, if we wished to dynamically create buttons, in some part of our document, when some random action occurred?

    If we are using JavaScript, we can use the createElement( ) method. When using this kind of method, we have to state what kind of element we wish to create, therefore we can write:
    document.createElement( KindOfElementToCreate)

    Now, because I wished to make a button, I thought, I would need to do the following:
    document.createElement( "button")
    This kinda makes sense ,right?
    The element I wanted to create was a button, so I send to the createElement method, the specification that the kind of object that I wanted, was "duh" a... button!

    But Oh! ...I had to learn the wrong way, that this is INCORRECT!
    If we look at the html closely, we see that a button is really an input object, and we make this input object of the button type. The type, is a kind of attribute that the input object has.
    Therefore we would really need to write the following:

    var myButton = document.createElement('input'); /* Here we are creating the input object*/

    /*here we are specifying what the values, of the attributes of our input object are:*/

    myButton.type = 'button';
    myButton.value = '-';
    myButton.disabled = 'disabled';

    So we have now created a button, but we still need to add this button to our html form.

    I wrote a special SPAN with ID="inserthrhere" at the point where I want the button to appear. We can use the appendChild() method on the SPAN and the button is made a child of the SPAN and it will magically appear were we wish.

    Removing it is slightly more complex. First I create a temporary variable node to store the SPAN, then I tell it to remove its first child (myButton).

    var node = document.getElementById('inserthrhere')

    I actually had some trouble here, because in an internet tutorialI read, said that instead of writing
    node.childNodes[0], inside the removeChild method, I could also write:


    which does make sense, because childNodes is an array that contains all children of a node X . These children, are of course objects, so when using the removeChild method, we are stating what child, from the parent node, we wish to remove. So I supposed that with the document.getElementById('myButton') method, I would obtain the same result. But I got a weird bogus error there. I really don't understand why that happened...
    I will keep reading, and try to figure out what the heck is going on there...

    It is important to say that for understanding all this parents node, children nodes stuff, it is important perhaps to have a nice overview of:
    DOM, which is a Document Object Model,a model of how the various objects of a document are related to each other. In the Level 1 DOM, each object, whatever it may be exactly, is a Node. So if you do
    <"P">This is a paragraph<"/p">

    you have created two nodes: an element P and a text node with content 'This is a paragraph'. The text node is inside the element, so it is considered a child node of the element. Conversely, the element is considered the parent node of the text node.

    If you do

    <"P">This is a <"B">paragraph

    the element node P has two children, one of which has a child of its own:

    | |
    This is a <"B">

    More about this matter can be read here:

    Happy coding!

    Monday, June 23, 2008

    Sending Information from wiimote through sockets II

    In our last session, I made an introduction, of the current project I have just developed, and explained how to obtain basic information about the wiimote.
    I wanted the server to pass this information, to clients that requested it.
    The basic work flow of my program is as follows:

    One Client makes a petition of the information to the Server,The Server asks the wiimote for this information, the wiimote gives back the desired information. The Server then sends this info to the Client. The Server, then takes another petition, a petition which can come from the same Client, or from another completely different one. This cycle is repeated till the end of time, or till America's Next Top Model is on, and we need to start doing important stuff.

    My project is therefore divided into 2 parts, the server part and the client part.
    The Server part, is divided into:
    • Creating the Server, have it listening on a certain address and Port for petitions.
    • Having the Server always accept incoming connections to it.
    • Once the server has a connection, the Server must attend this Client. It will create a Thread, for each of the Clients that want a connection with him.
    • The "Thread Function" will receive a petition of what it's client wants. One Thread will receive from it's client a petition to obtain the Wii's Acceleration, another Thread might receive the petition to give the Pitch angle that the Wii has etc. Each Thread will receive a petition of a desired info from it's Client.
      The Thread, in order to get this info, will call a function that depending on the String of text it receives, will send information to the client about the wiimote. This function, that sends to the Client it's desired information, receives therefore a *char,with the kind of information it wants, and the accept Socket,so this function can once and for all, write back to client, and send him the desired info.

    Now, because Thread Functions can only be created with this
    DWORD WINAPI ThreadProc(LPVOID lpParameter)  syntax, we need to do a whole lot of 
    hassel of packing arguments in a temporary wrapper object andt hen unpacking
    them inside some wrapper function. To understand how I managed it, I recommend you guys read this article,
    it gives a nice explanation of the problem, and solves it in a very neat manner.

    The Client on the otherhand:
    • Tries to connect to the desired Server, if the desired Server is not available, the program finishes.
    • Once it is connected to the Server, it sends to it, a command, if the command doesn't exist, the server sends back to the Client an error message, if the command does exists, the Server interprets, what kind of info the Client is looking for, according to the command it sent.

    As for the part of Server, Client connections, I based my program on this tutorial. And it also helped me to know
    that the accept function, only returns after it has received a connection!!!!!

    I will post later a link to where my code can be downloaded. It is not that complicated, but it took me a while, to
    understand how things were working, and to plan my program.