sábado, 5 de julio de 2014

¡Si quieres pilotar un DRON, lee esto con atención!

Si quieres pilotar un DRON, debes saber que ya existe "algo" de legislación al respecto. Estas son algunas de las cosas que debemos tener en cuenta:
  • Normativa sobre el uso del espectro radioeléctrico.
  • Protección de datos o toma de imágenes aéreas.
  • Responsabilidad por los daños causados por la operación de la aeronave.
  • ¿Más de 25 Kg.? Pues a inscribirla en el Registro de matrícula de aeronaves y a sacar el certificado de aeronavegabilidad.
  • Placa de Identificación visible en la aeronave: nº de serie, nombre de la empresa operadora y datos de contacto.
  • y un montón de cosas más, según sea el peso de la aeronave: menor de 2Kgs., menor de 25Kgs., entre 25Kgs. y 150Kgs. y mayor de 150Kgs.
En cualquier caso, podéis encontrar más información en el Real Decreto Ley 08/2014 de 4 de julio. Prestad atención al artículo 50.

Legislación temporal para los DRONES

Bueno, pues si allá por Marzo decía que el DRON no tenía una legislación clara para el usuario, hoy parece que la cosa va cambiando y, mientras la ley se va definiendo, parece que ya hay un marco regulatorio temporal (OJO Temporal) para las operaciones con los drones.


y dice así:

El Real  Decreto  Ley  incluye  el  régimen  temporal  para  las  operaciones  con aeronaves pilotadas por control remoto, los llamados drones, de peso inferior a los 150 kilos al despegue, en el que se establecen las condiciones de explotación de estas aeronaves para la realización de trabajos técnicos y científicos. 

Esta nueva regulación responde a la necesidad de establecer un marco jurídico que permita el  desarrollo  en  condiciones  de  seguridad  de  un  sector  tecnológicamente  puntero  y emergente, y será desarrollada reglamentariamente en los próximos meses. 

Este reglamento temporal contempla los distintos escenarios en los que se podrán realizar los distintos  trabajos  aéreos  y  en  función  del  peso  de  la  aeronave.  Además,  las  condiciones ahora aprobadas se completan con el régimen general de la Ley sobre Navegación Aérea de 1960 y establecen las condiciones de operación con este tipo de aeronaves, además de otras obligaciones.

Este régimen permitirá que a partir de ahora se puedan utilizar drones para realización de trabajos  aéreos  como  son:  actividades  de  investigación  y  desarrollo;  tratamientos  aéreos, fitosanitarios y otros que supongan esparcir sustancias en el suelo o la atmósfera, incluyendo actividades de lanzamiento de productos para extinción de incendios; levantamientos aéreos; observación y vigilancia aérea incluyendo filmación y actividades de vigilancia de incendios forestales; publicidad aérea; emisiones de radio y TV; operaciones de emergencia, búsqueda y salvamento; y otro tipo de trabajos especiales.

De todos modos, en un primer momento, y hasta que no esté aprobada la reglamentación definitiva, las operaciones que se pueden realizar se limitarán al espacio aéreo no controlado y sobre zonas no pobladas.  

El régimen aprobado hoy establece requisitos en función del peso del aparato al despegue y los  clasifica  en  aeronaves de  más de  veinticinco  kilos,  de  menos de dos  kilos y  de  hasta veinticinco  kilos.  Pero,  independientemente  de  su  peso  hay  unos  requisitos  comunes para todas ellas, así como para los pilotos y las empresas que las operen.  


Requisitos comunes para todos


Todos  los  drones,  sin  excepción,  deben  llevar  fijada  en  su  estructura  una  placa  de identificación y las empresas operadoras de drones deberán tener, entre otros requisitos, un manual de operaciones y de un estudio aeronáutico de seguridad para cada operación (por ejemplo, con el viento máximo que va a volar). 

Todos  los pilotos de drones  deberán acreditar, entre otros  requisitos,  que  son  titulares  de cualquier  licencia  de  piloto,  incluyendo  la  de  piloto  de  ultraligero,  o  demostrar  de  forma fehaciente que disponen de los conocimientos teóricos necesarios para obtenerla. 

Una de las principales novedades de este Reglamento es que, al contrario de lo que ocurría hasta ahora, los drones de menos de veinticinco kilogramos al despegue no deberán estar inscritos  en  el  Registro  de  Matrícula  de  Aeronaves  y  disponer  de  un  certificado  de aeronavegabilidad, sí lo tienen que tener los que superen este peso. 

El cumplimiento  de  todos estos  requisitos  no  exime al operador, que  es,  en  todo  caso,  el responsable de  la aeronave y de la operación, del cumplimiento del resto de la normativa aplicable,  en  particular en relación  con el uso del espectro  radioeléctrico,  la  protección  de datos o la toma de imágenes aéreas, ni de su responsabilidad por los daños causados por la operación o la aeronave. 
Aquí tenéis el enlace al BOE con el PDF completo: www.boe.es/boe/dias/2014/07/05/pdfs/BOE-A-2014-7064.pdf

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.

viernes, 16 de mayo de 2014

Expresiones Aritméticas en Notación Postfija (I)

La Notación Polaca Inversa, Notación Posfija o RPN (Reverse Polish Notation) no es más que una forma de representación de expresiones aritméticas. Se trata de una notación que permite omitir los paréntesis en las expresiones, pero manteniendo el orden o prioridad de los distintos operadores y los cálculos se van realizando de forma secuencial en el momento en que se introduce un operador.


Si quieres programar una calculadora, un interprete, un evaluador de expresiones, un compilador, etc., sin duda te resultará muy interesante.

A modo de ejemplo, consideremos la siguiente expresión aritmética simple para obtener su notación en postfijo:

(9 - (5 + 2)) * 3

En primer lugar evaluamos el paréntesis interior, obteniendo la siguiente expresión:

(9 - (52+)) * 3

Ahora evualuamos el paréntesis exterior:

(952+-)

y finalmente el producto:

952+-3*

Con lo que finalmente hemos obtenido la notación posfija 952+-3* correspondiente a la expresión (9 - (5 + 2)) * 3

Ni que decir tiene, que para poder evaluar una expresión en notación postfija, tenemos que recorrerla de izquierda a derecha en busca del primer operador y posteriormente obtener los operandos inmediatamente a su izquierda:

952+-3* => 97-3* => 23* => 6

Como vemos, en el primer paso se llega al operador '+' y se hace la suma de 5+2=7, quedando la expresión como 97-3*. A continuación llegamos al operador resta '-', y hacemos la resta de 9-7=2 con lo que ya tenemos 23*. Y por último nos queda el operador del producto '*' obteniendo el valor 6 como resultado de la expresión.

Desde el punto de vista de la programación y de la estructura de datos necesaria para evaluar una expresión en postfijo, nos bastará con una simple PILA en la que iremos depositando los distintos operandos y en el momento de entrar un operador, lo que haremos será extraer de la pila los operandos correspondientes, aplicar la operación indicada por el operador y guardar el resultado en la pila.

Obviamente si lo que queremos es programar un "conversor" de expresiones algebraicas (en Infijo) a expresiones en Postfijo, podremos emplear una estructura de datos arbórea (AST - Arbol de Sintaxis Abstracta) y haciendo un recorrido del árbol en Postorden. También podríamos hacer uso del "Algoritmo Shunting Yard" inventado por Edsger Dijkstra, sin duda un gran físico y científico en materia computacional, por desgracia falleció en 2002 pero nos dejó un gran legado:


  •  Algoritmo de Dijkstra (Solución al problema del camino más corto)
  •  Algoritmo Shunting Yard (Notación Polaca Inversa - Postfijo)
  •  El Algoritmo del banquero (interbloqueo en Sistemas Operativos)
  •  Propuso el problema de la cena de filósofos (Sincronización de procesos en un Sistema Operativo)
  •  etc.

jueves, 1 de mayo de 2014

Descargar un archivo utilizando PowerShell

Hace tiempo publiqué como descargar un archivo alojado en un servidor remoto desde una aplicación programada en C# (Descargar archivo con C#)


Pues bien, en esta ocasión vamos a ver lo sumamente sencillo que resulta hacer la misma operación desde un script en PowerShell:


$url = "http://www.manuelvillasur.com"
$localFolder = "C:\FileName.txt"
$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $localFolder)


Así de fácil. Obviamente en $url debéis escribir la uri completa en la que se encuentra el archivo a descargar y en $localFolder la ubicación o el path completo de vuestro disco duro o unidad local de almacenamiento en la que queráis que sea guardado el archivo.

martes, 22 de abril de 2014

Data Binding con C# directamente en el Code Behind

Trabajar con Data Binding directamente en XAML es algo bastante trivial, aunque también puede dar algún que otro quebradero de cabeza. En cualquier caso, no es la única forma de hacerlo puesto que siempre podemos recurrir al data binding desde el code behind directamente.


Esto último quizás no sea muy recomendable cuando estamos trabajando con patrones de diseño como puede ser el MVVM por razones obvias propias del patrón, pero que no sea recomendable no significa que no podamos hacerlo o incluso que no sea conveniente hacerlo en determinados casos.


El enlace a datos en C# y desde el code behind lo podemos hacer de muchas formas, aquí voy a exponer una (a modo de concepto) que he utilizado recientemente.


El escenario es sencillo. Se tiene un control Grid al que queremos enlazar su propiedad Visibility con una propiedad de una clase de datos. Aquí podéis ver un extracto de código en donde se realiza la parte del DataBinding propiamente dicha:

 // Se crea la instancia de la clase Binding
 System.Windows.Data.Binding binding = new System.Windows.Data.Binding();
 // Se asigna la fuente de datos que contiene la propiedad a enlazar
 binding.Source = customersVM;
 // Se indica la propiedad que se va a enlazar de la clase de datos
 binding.Path = new PropertyPath("ShowCustomers");
 // Se indica el modo de enlace, en este caso TwoWay
 binding.Mode = System.Windows.Data.BindingMode.TwoWay;
 // En este caso, además se hace uso de un Conversor de Booleano a Visibility
 binding.Converter = new ViewModel.BoolToVisibilityConverter();
 // Además se utiliza un parámetro para el conversor
 binding.ConverterParameter = true;
 // Y finalmente se asocia el Binding con el grid
 grid.SetBinding(Grid.VisibilityProperty, binding);


Espero que le sea útil a mas de uno ... y de dos.