domingo, 1 de junio de 2014

Árbol binario de expresión y Notación Posfija (II)

En una publicación anterior, hablaba sobre que es la notación posfija, para que puede ser útil y mostraba un pequeño ejemplo con una expresión aritmética simple:

(9 - (5 + 2)) * 3

Pues bien, hoy voy a mostraros como podemos crear el árbol binario correspondiente para analizar o evaluar esta expresión, haciendo uso del recorrido en postorden.

Lo primero que debemos hacer es crear el árbol, respetando las siguientes reglas:

⦁ Los nodos con hijos (padres) representarán los operadores de la expresión.
⦁ Las hojas (terminales sin hijos) representarán los operandos.
⦁ Los paréntesis generan sub-árboles.

A continuación podemos ver cómo queda el árbol para la expresión del ejemplo (9 - (5 + 2)) * 3:




Si queremos obtener la notación postfija a partir de este árbol de expresión, debemos recorrerlo en postorden (nodo izquierdo – nodo derecho – nodo central), obteniendo la expresión: 952+-3x

Así, si quisiéramos evaluar la expresión, podemos hacer uso de un algoritmo recursivo. A continuación tenemos el pseudocódigo que realiza esta tarea:

Recorrer en PostOrden(NODO)
    Si NODO es válido entonces
        Recorrer en PostOrden(NODO.Izquierdo)
        Recorrer en PostOrden(NODO.Derecho)
        Evaluar(NODO)

Escribir este algoritmo en alguno de los lenguajes de programación típicos (C, C++, C#, Javascript, Python, Perl, etc.) ya no tiene ningún misterio. Por ejemplo en C++, tendríamos algo como lo siguiente, obviamente no está completo, pero representa claramente la idea principal:
...
void MathHelpers::PostOrden(Arbol* pNodo)
{
     if (pNodo)
    {
         PostOrden(pNodo->Izq);
         PostOrden(pNodo->Der);
         pNodo->Eval;
    }
}
void Arbol::Eval()
{
     switch(pNodo->Operador)
     {
         case ‘-‘:
             this->Valor = this->Izq - this->Der;
         break;
         case ‘+’:
             this->Valor = this->Izq + this->Der;
         break;
         case ‘x’:
             this->Valor = this->Izq * this-Der;
         break;
         case ‘/’:
             this->Valor = this->Izq / this->Der;
         break;
      }
}

Apps de Android que acceden al IMEI


Que el sistema operativo Android, posee gran cuota del mercado de la telefonía móvil, además de encontrarse en otros muchos dispositivos, no es nada que no sepamos ya.

Que precisamente esa es la razón por la que la plataforma Android cuenta con gran cantidad de aplicaciones en su haber y que por eso, existen multitud de virus y demás especímenes (adware, spyware, crapware, etc), tampoco es ninguna novedad.

Y que este es el motivo por el que debemos extremar las precauciones a la hora de instalar una App en nuestro dispositivo (independientemente del SO), tampoco debiera ser nada nuevo.

Pero, ¿Qué buscan todas estas aplicaciones "malas"?

Pues el abanico de opciones es amplio, pero la inmensa mayoría van detrás de nuestros DATOS y buscan asaltar nuestra privacidad, los fines también son varios.

En cualquier caso, lo que pretendo comentar hoy, es algo relacionado con el IMEI de nuestros dispositivos. Si, ese número cuya finalidad es identificarlo de manera única e inequívoca a nivel mundial. Algo así como el DNI o Pasaporte para nosotros, o el chip de nuestras mascotas, pero en el ámbito tecnológico.

(Breve paréntesis): ¿Por qué ese afán de identificarlo todo de manera única y a nivel mundial? Personas, Mascotas, Dispositivos varios, ... respuestas hay muchas, buenas y malas también.

La finalidad del IMEI (International Mobile Equipment Identity), además de ser la de identificar a cada dispositivo que se conecta a la red de telefonía móvil, y permitirlo o no su acceso, va un paso más allá y es que, es el IMEI el que sirve para asociar un dispositivo móvil con una persona o cuando menos con la persona que a tramitado su alta (punto débil del IMEI).

Esto es así al menos en teoría, porque ¿qué pasa si modificamos el IMEI de nuestro teléfono móvil? Pues sencillamente, ya no tendrían manera de "asociar" nuestro teléfono (IMEI) con nuestra identidad personal (DNI, Pasaporte, etc.). Cierto es, que podrían re-asocinarnos por otros medios -ya comentaré algo en otro momento-, pero no por el IMEI.

Otro tema sería saber que IMEI habría que utilizar como sustituto, porque esto podría tener graves consecuencias, según quien fuera su propietario real, por ejemplo. Y ni que decir tiene, que ese nuevo IMEI tendría que estar dado de alta con algún operador.

¿Para qué podría querer alguien modificar el IMEI de su teléfono? Allá cada cual, a mí personalmente se me ocurren muchos motivos, que obviamente me reservo. Personalmente, y sobre todo por cuestiones de seguridad nacional, preferiría que el IMEI no se pudiera modificar bajo ningún concepto, o al menos por cualquier usuario. Es más, creo que se debieran de implementar sistemas de asociación (IMEI-Identidad personal) adicionales y se me ocurren unos cuantos.

Bueno, pues volviendo al tema de Android y la relación a la que quiero llegar, en la tienda de aplicaciones (Play-store o la que utilices), no es difícil encontrar aquellas que hacen uso del API que da acceso al IMEI de nuestro dispositivo. En concreto, hay que tener en cuenta la API "android.telephony.TelephonyManager".

TelephonyManager es una clase que nos da acceso a información relacionada con los servicios del teléfono y su estado. Nos facilita datos propios del servicio de suscripción como pueden ser el número de teléfono, el IMEI, el número de serie de la tarjeta SIM, nombre del operador, país, etc., eso sí, en "modo lectura" ;):

                TelephonyManager telephonymanager;

                ...

                telephonymanager.getDeviceId();

 

Así que, si una aplicación hace uso del IMEI, en mi opinión ya es para sospechar, pero si además hace uso del mismo, sin tan siquiera informar al usuario, además ya está saltándose las reglas y muy posiblemente incurriendo en un delito contra la privacidad. Además, las normas de Google al respecto son claras, si vas a hacer uso del IMEI del dispositivo, hay que avisar al usuario.

Y además, hay incluir en el manifiesto de la aplicación el siguiente permiso:

                uses-permission android:name="android.permission.READ_PHONE_STATE"

Por último, deciros que es mejor que vigiléis vuestras aplicaciones y a vuestros teléfonos, antes de que ellos os vigilen a vosotros, aunque esto no es tarea fácil.