viernes, 11 de octubre de 2013

Testing. Probando aplicaciones

Una de las tareas básicas de control de calidad es verificar que las aplicaciones se comportan como deberían. En caso de que no sea así comunicar al desarrollador la incidencia y cuando la resuelva volver a probar.
Las pruebas de una aplicación abarcan todo el ciclo de desarrollo pero hoy voy a centrarme en las de interfaz. El rellenado de los datos, pulsar botones, cambiar configuraciones y demás se puede realizar de forma manual, lo que puede llevar a que las pruebas se realicen de una forma muy somera por ser una tarea agotadora y sobre todo muy aburrida. Por eso y como hay mucha gente de la idea "vamos a trabajar más para trabajar menos" (me declaro totalmente seguidor de esta religión) hay mecanismos para poder automatizar dichas pruebas.
Existen diversas herramientas para automatizar las pruebas de las interfaces y hoy me voy a centrar en Selenium que está enfocada a la validación de aplicaciones web y que será la cabeza de puente a otras que veremos posteriormente.
Selenium tiene dos formas de generar las pruebas: Mediante un IDE que nos ayuda a identificar los elementos de la página y verificar sus resultados. Directamente haciendo un código Java que implemente las pruebas.
Las pruebas instanciarán el navegador que hayamos elegido y comenzarán a realizar todas las acciones indicadas, de forma que podremos ver como "mágicamente" se van rellenado los campos y pulsando botones.
Una de las características de Selenium es que se pueden instalar servidores en distintas máquinas (modo Grid según nomenclatura Selenium) de forma que podemos lanzar las pruebas contra nuestra aplicación con varios navegadores y especificando las instancias de cada uno. Esto puede ser un test de carga para pobres pero se enfoca más a la validación automatizada de funcionamiento en múltiples plataformas.
Y eso es todo por el momento. En la siguiente entrada veremos como hacer una pequeña validación y los interiores de Selenium.

jueves, 10 de octubre de 2013

Un pequeño retraso

Retomo la actividad

Después de un tiempo abandonado vuelvo a crear una entrada en este blog.
En todo este tiempo he estado pensando en cosas a publicar, dejando entradas a medio hacer y teniendo el remordimiento de que no estaba publicando con la frecuencia que desearía aunque tenía muchas cosas en la cola de espera.
Así que he decidido dejar la perfección para otra vida y publicar las entradas en un estado "razonable". Afortunadamente esto es un blog y se puede corregir en cualquier momento.
Mis últimas incursiones han estado centradas en la prueba de aplicaciones, ingrata tarea nunca bien reconocida, y el acercamiento a Python. Los próximos comentarios irán por ahí

jueves, 30 de mayo de 2013

Técnica Pomodoro o el tomate productivo

Aprovechando que hoy es festivo (en Sevilla) y no trabajo voy a aprovechar para revisar algunos post que tengo a medio acabar desde hace demasiado tiempo.
Una técnica de productividad que me sorprendió por su sencillez de planteamiento y facilidad de obtener resultados es la Pomodoro Technique. Os comento un breve repaso de esta técnica.

Idea base

El funcionamiento no puede ser más simple: trabajar en una sóla tarea durante veinticinco minutos y luego descansar cinco antes de acometer otro periodo de veinticinco minutos.

La idea es focalizar nuestra energía en breves periodos evitando todo tipo de interrupciones; como los periodos son breves podemos, con algo de práctica, ser capaces de aprovecharlos de manera total.

Material necesario

El nombre viene de su desarrollo con un temporizador de cocina con forma de tomate y tiene como caraterística base no necesitar ninguna tecnología para llevarla a cabo. Sólo es imprescidible tener papel, lápiz y un temporizador / reloj de cocinar / cronómetro.


Funcionamiento


Antes de empezar a trabajar tendremos  una lista corta de las  tareas que deseamos realizar. Como en todas las técnicas similares deberemos ser lo más realistas posible con la selección de este conjunto de tareas porque aunque el tiempo sea relativo (gracias Albert) eso es una cosa y otra el optimismo intrínseco del ser humano que modela el tiempo como si fuese chicle.

Tras elegir una tarea nos dedicaremos a ella durante un periodo de trabajo y realizaremos anotaciones con cada una de las interrupciones que se produzcan. Si son exteriores sólo las indicaremos pero si son propias las gestionaremos en el menor tiempo posible para procrastinar lo menos posible; si nos acordamos de algo que hacer lo añadimos a la lista de cosas pendientes y en el descanso decidiremos si se hace en el próximo periodo o ni siquiera se hace hoy. No hay nada como ponerte con algo para que de pronto tu cerebro empiece a rebuscar cosas que hacer para tener cien razones de abandonarla y cambiar a otra cosa; hay mucha literatura sobre como reducir las interrupciones y no voy a abundar sobre ello más que recordar dos reglas de oro "desconexión y educación".

Terminado el periodo intentaremos en los cinco minutos alejarnos lo más posible de lo que estábamos haciendo, podemos aprovechar para escribir el correo tan urgente que teníamos pendiente, revisar el tiempo previsto o ir a picar algo. Lo fundamental es cambiar y despejarse al máximo. Cada cuatro periodos de esfuerzo se realiza un descanso grande de unos 30 minutos para descompresión.

La técnica propone el llevar la cuenta de cuantos pommodoros nos cuesta una tarea, los que se cancelan, ya sea por que el número de interrupciones es excesivo o por urgencias sobrevenidas, y las interrupciones que se provocan. Esta "contabilidad" nos dará
  •  una retroalimentación para estimar las tareas futuras
  •  un refuerzo de la mejora que vamos logrando 

Utilidad y reflexiones

Cuando cuento esta técnica a chavales, reyes absolutos de despistarse en mil cosas, con la idea de que la usen para estudiar siempre les propongo que intenten empezar por periodos de diez minutos y luego vayan incrementando el tiempo en bloques de cinco minutos. Aunque parezca que 10 minutos es poco tiempo supondría aprovechar el 66% del total de tiempo de trabajo y me conozco a más de uno que aumentaría su rendimiento de forma exponencial con ese porcentaje.

Evidentemente que en estos tiempos hipertecnológicos hay programas para cualquier plataforma (desde Android a OSX) que nos llevan el control del tiempo y las estadísticas pero que no son en absoluto imprescindibles.

Siempre que hablo de productividad hago hincapié en que la idea no es trabajar más tiempo sino hacer más durante el tiempo que nos dediquemos a trabajar, lo que puede  proporcionarnos más tareas realizadas o hacer un número de tareas en menos tiempo.

Para aquellos que conozcan las metodologías ágiles verán la similitud con un conjunto de sprints; yo diría que un sprint se divide en días y un día en pomodoros.

¿Realmente vale para algo? ¿Lo necesito? Posiblemente si eres alguien con varios años de trabajo a las espaldas pues no te será necesario que te ayuden a estar concentrado en una tarea media hora.
Otra cosa es que necesitemos acostumbrarnos a no desviarnos de lo fundamental de aquello que estamos haciendo; empezamos a corregir un error y nos pegamos 4 horas cambiando el color del fondo del botón una vez arreglado. 

Y otro "pecado" del trabajador experimentado es que no sabemos desconectar y pegarnos 5 horas seguidas con algo muchas veces nos impide ver otras opciones; en eso puede ayudar.

De todas formas creo que puede ser muy útil cuando no se tiene el hábito de trabajar o las hormonas provocan una dispersión infinita.

Resumiendo una técnica con reglas sencillas y objetivos simples que es fácil de llevar a cabo, espero que vuestra productividad mejore.

Para más información:

jueves, 18 de abril de 2013

Bloques personalizados (NXT-G) 6/6

Y con esta entrada termino la traducción del tutorial realizado por Dave Parker sobre programación de bloques en NXT-G. Espero que haya servido a alguien.

Organizar y compartir Mis Bloques

En esta última sección, vamos a ver algunas maneras de manejar y compartir su colección de Mis Bloques

Copiar, renombrar y borrar Mis Bloques

Como se muestra en la sección anterior Copia de un Mi Bloque , el comando Edición - Administrar Paleta Customizada se puede utilizar para abrir la carpeta de su equipo donde se almacenan Mis bloques (Figuras 38 a 40 ). Con esta carpeta abierta, puede copiar, renombrar o borrar Mis Bloques que ha creado al copiando, renombrando o borrando el fichero correspondiente (.Rbt). De esta manera, puede manejar su conjunto de Mis Bloques para hacer versiones alternativas, eliminar aquellos que no necesita más, etc

Los bloques rotos

Un programa de NXT-G que contiene un acceso a un Mi Bloque (una instancia de un Mi bloque insertada desde la paleta personalizada) en realidad no almacenará el contenido del Mi Bloque en el archivo principal del programa. En su lugar, el programa contiene sólo una referencia al Mi Bloque, que es esencialmente el nombre de la Mi Bloque junto con alguna información sobre la ubicación del fichero. Cuando se abre el programa, el software intenta localizar el archivo de Mi Bloque (el Archivo .rbt) utilizando esta información. Si el software no encuentra el Mi Bloque (debido a su archivo .Rbt se ha eliminado o cambiado de nombre, por ejemplo), entonces NXT-G mostrará un bloque roto en lugar del Mi Bloque correcto, y usted no será capaz de descargar el programa al NXT.
La Figura 53 muestra un ejemplo de un bloque roto. Este ejemplo fue creado mediante un programa que utiliza el Mi Bloque Forward500, cerrando el programa, borrando el bloque Forward500 (desde Edición - Administrar paleta customizada) y, a continuación, abrir el programa de nuevo. El software NXT-G sabe que el bloque fue nombrado Forward500, pero fue incapaz de encontrarlo, así que mostrará un bloque roto con el nombre Forward500 en la pantalla. Los bloques rotos en un programa tendrán que ser eliminados y sustituidos por los bloques adecuados, o los archivos Mis Bloques desaparecidos deben localizarse e instalarse antes de que el programa pueda ser utilizado.
Figura 53: Un Mi Bloque roto
Una causa común de los bloques rotos es cuando un usuario intenta compartir un programa NXT-G escrito en un ordenador en un equipo diferente (por transferencia o por correo electrónico del archivo de programa o publicación del archivo de programa en la web, por ejemplo). Si el programa contiene una referencia a un Mi bloque y éste no se transfiere también, el programa mostrará un Mi Bloque roto. Es posible transferir Mis Bloques e instalarlos en el equipo de destino también, pero una manera más fácil y mejor para compartir programas es utilizando la característica Empaquetar publicaciones como se describe en la siguiente sección.

Programas de intercambio con empaquetar publicaciones

En el menú Herramientas del software NXT 2.0 hay un comando llamado Crear Pack & Go... . Este comando es otra manera de grabar un programa de NXT-G que se guardará junto con una copia de todos los bloques, Mis sonidos y archivos gráficos que se utilizan en el programa. Normalmente, el grabar programa de NXT-G con Archivo - Guardar o Archivo - Guardar como salvará sólo el archivo de programa principal junto con referencias (a Mis Bloques, archivos de sonido y archivos de imagen) y el programa sólo funcionará en el equipo de destino si los archivos adicionales ya están en ese equipo o también se transfieren y se instalan correctamente. Guardar un programa con Herramientas - Crear Pack and Go... es una forma mucho más fácil y fiable para compartir programas con otros usuarios en otros equipos.

Nota: La Creación de empaquetar publicaciones no está disponible en las versiones del software NXT antes de NXT 2.0 y el formato de almacenamiento Pack&Go de archivos (.Rbtx) no puede ser leído por las versiones anteriores. Si guarda un programa en este formato, no será legible por los usuarios con el software NXT 1.X o el "NXT-G 2.0" software de LEGO Education.
La figura 54 muestra un programa que utiliza dos Mis Bloques, un archivo gráfico, y un archivo de sonido, y el comando Crear Pack and Go... se utiliza para guardar el programa. El diálogo Crear Pack and Go... le permite introducir un nombre para el programa guardado y una ubicación de carpeta para especificar la ubicación donde el archivo debe ser guardado. Cuando se utiliza Crear Pack and Go... para guardar un programa, el programa se guarda en un formato de archivo diferente al normal (.Rbt), como lo indica la extensión de archivo. Rbtx. El software NXT-G llama a este formato de una distribución, ya que está diseñado para distribuir el programa a otros equipos.
Figura 54: Pack and Go... graba un programa junto con sus
Mis Bloques, sonidos y gráficos necesarios en un solo archivo.
La parte inferior de la página Crear Empaquetar diálogo muestra los archivos que se incluyen en la distribución (.Rbtx). En este ejemplo, el programa principal PackTest se guarda junto con el gráfico Smile 01 utilizado por el bloque de la pantalla, el sonido Good Job utilizado por el bloque de sonido, y una copia de lo Mis Bloques LeftPivotAngle y OutAndBack. Además, los Mis Bloques Backward, BeepBeep y Forward también se incluyen porque son usados por el bloque OutAndBack. Esto permite que el archivo de distribución resultante sirva trabajar en cualquier computadora con el software NXT 2.0, independientemente de que los archivos auxiliares ya existan en ese equipo.

Nota: El formato Pack and Go (.Rbtx) también se comprime, lo que resulta en archivos mucho más pequeños, incluso para un solo archivo de programa con ningún otro archivo de apoyo.
Además, la compresión utilizada es el estándar "zip" el formato, por lo que si se cambia el nombre al archivo (.Rbtx) para que tenga la extensión ". Zip", entonces se puede abrir con cualquier extractor de zip (incorporado en muchas sistemas operativos) y acceder a los archivos individuales del interior (incluso si no tiene el software NXT 2.0).

Haciendo un submenú en la paleta personalizada

Si llegas al punto de crear una gran cantidad de Mis Bloques, puede ser útil organizarlos en grupos, para que no todos aparezcan en una larga lista en la paleta customizada ( Figura 10 ). También puede ser útil agrupar todos los Mis bloques que están diseñados para un determinado proyecto juntos. Afortunadamente, NXT-G permite crear menús adicionales en la paleta personalizada donde podrá organizar sus bloques en grupos.
Para crear un menú adicional en la paleta personalizada, utilice el comando Edición - comando Administrar paleta customizada para abrir la carpeta de almacenamiento de la paleta personalizada (Figura 55). En esta carpeta, las dos subcarpetas Mis Bloques y Web Blocks corresponden a los dos menús estándar de la paleta personalizada. Para crear su propio menú, basta con crear otra subcarpeta en el mismo nivel que la subcarpeta Mis Bloques. A continuación, puede mover los archivos de mi bloque (.Rbt) de la carpeta Mis bloques a la nueva carpeta.
Figura 55: La creación de una nueva carpeta al lado de la carpeta Mis Bloques
creará un nuevo menú de la paleta personalizada.
En la figura 55, he creado una subcarpeta denominada Pinball para reunir Mis Bloques que fueron diseñados específicamente para el proyecto de la máquina de pinball que he diseñado. La figura 56 muestra los siete archivos de Mi Bloque (.Rbt) que moví a la carpeta Pinball, y la figura 57 muestra el menú que aparece en la paleta personalizada con los siete Mis Bloques para el proyecto de la máquina de pinball en él.
Figura 56: La carpeta Pinball contiene todos los bloques Mis específicos del proyecto Pinball.

Figura 57: El Submenú Pinball contiene siete Mis Bloques y un icono de menú personalizado.

El menú de Pinball en la Figura 57 se muestra como un círculo negro porque he personalizado el icono correspondiente. NXT-G hace que sea fácil personalizar tus propios iconos de menú. La Figura 56 muestra dos archivos adicionales denominados PaletteIcon.txt y PaletteIcon.png que se han colocado en la carpeta Pinball. El archivo PaletteIcon.png es un archivo gráfico que especifica el icono que se utiliza en el menú, y el archivo PaletteIcon.txt es un archivo de texto que especifica el texto informativo que se muestra sobre las herramientas cuando se coloca el cursor sobre el icono de menú. Si estos archivos (llamado exactamente así) están presentes en la carpeta, el icono del menú se puede personalizar, de lo contrario, se mostrará el icono estándar y mensaje habitual.

Nota: El archivo PaletteIcon.txt en la carpeta Mis Block sólo se tiene en cuenta si el archivo PaletteIcon.png también está presente, por lo que si desea una descripción personalizada para un menú de Mi Bloques, también debe hacer un icono personalizado para él.
El archivo PaletteIcon.png debe ser un archivo gráfico en formato PNG de 45 x 45 píxeles de tamaño. En un equipo que ejecuta Windows, puede crear este archivo con el programa accesorio Paint. En el programa Paint, utilice Imagen - Atributos para definir el tamaño de la imagen a 45 por 45, pinte y/o pegue cualquier imagen que desee y a continuación, guarde el archivo en formato PNG (PNG.). El archivo PaletteIcon.txt se pueden crear en un ordenador con Windows utilizando el programa de accesorios Bloc de notas para crear un archivo de texto simple.

Bloques personalizados (NXT-G) 5/6

La penúltima entrega de la traducción del tutorial realizado por Dave Parker sobre programación de bloques en NXT-G.

Crear Mis Bloques más complejos

En las secciones siguientes, se muestran dos ejemplos más de Mis Bloque que muestran algunas técnicas que se pueden utilizar para hacer cosas más complejas. En primer lugar vamos a crear un Mi Bloque llamado OutAndBack que se basa en los bloques que hemos creado hasta el momento para hacer un robot avanzar una distancia especificada, de la vuelta la misma distancia para volver al punto de partida y suenen los pitidos antes de cada movimiento. A continuación, vamos a dar un repaso a través de la creación de un Mi Bloque más complejo llamado LimitNumber que se puede utilizar para probar y modificar un valor numérico asegurándose que está dentro de un rango especificado. El bloque LimitNumber es lo suficientemente complejo para requerir una cuidadosa planificación y prueba. Finalmente terminaremos mostrando un proceso paso a paso que se puede utilizar como guía en el proceso de creación de Mis Bloques más complejos.

Uso de Mis Bloques dentro de otros Mis Bloques

Para construir el Mi Bloque OutAndBack, podemos notar que las tres cosas que queremos hacer ya se han desarrollado en los bloques Forward, Backward y BeepBeep. Afortunadamente, un Mi bloque puede contener usos de Mi Bloque, por lo que el bloque OutAndBack será fácil de crear usando estos otros tres bloques. La figura 43 muestra el programa utilizado para crear el bloque OutAndBack. La principal funcionalidad se logra simplemente insertando los bloques previamente creados desde la paleta personalizada. Puesto que el bloque OutAndBack tendrá dos parámetros de entrada (Distance cm y Power), dos bloques de constantes se utilizan como fuentes de datos para estos valores antes de crear el Mi Bloque.
Figura 43: Un Mi Bloque se puede crear uniendo de otros Mi Bloque.

 

Utilizar parámetros de entrada más de una vez dentro de un Mi Bloque

Como se muestra en la Figura 43, los parámetros de entrada Power y Distance cm se utilizan dentro del Mi Bloque en los bloques Forward y Backward. Cuando un parámetro de entrada se utiliza más de una vez en el contenido de un Mi Bloque, es importante que todos los usos del parámetros se conecten al mismo bloque constante (o fuente de datos) en el programa que se utiliza para crear el Mi Bloque. Esto garantiza que todos los diferentes usos reciben el mismo valor y que un único parámetro se convertirá en la fuente de todos los usos. Recuerde que a la hora de seleccionar los bloques para formar el mi bloque, los bloques seleccionados todos deben ser contiguos, de modo que los bloques constantes en la Figura 43 deben estar colocados al principio de la secuencia.
En cuanto a la selección de bloques de la Figura 43 que se seleccionan para formar el Mi Bloque, se observa que cuatro cables cruzan la frontera de la selección. Sin embargo, estos cuatro cables sólo representan dos diferentes rutas de datos, debido a que algunos de los cables se unen a la misma fuente de datos. Sólo se crea un parámetro por para cada fuente de datos diferente que está fuera de la selección, por lo que en este caso sólo se crean dos parámetros de entrada. La figura 44 muestra el contenido del Mi Bloque OutAndBack resultante. Hay dos bloque de conexión de parámetros, cada uno de los cuales se utiliza dos veces dentro del bloque.
Figura 44: El Mi Bloque OutAndBack utiliza otros Mis bloques en su interior
y utiliza cada parámetro de entrada dos veces.

 

Creación de un Mi Bloque con un puerto de salida de datos

En las siguientes secciones, vamos a construir un Mi Bloque más complejo llamado LimitNumber, que incluirá un puerto de salida de datos en su centro de datos. Esto permitirá que el Bloque pueda pasar un valor de resultado de vuelta al programa que utiliza el bloque. Este Mi Bloque será más difícil de probar que mis otros bloques que hemos creado hasta el momento, por lo que se mostrará un método de comprobación antes y después de crear el Bloque.
El Bloque LimitNumber aceptará un parámetro de entrada Number junto con otros dos parámetros de entrada llamados Min y Max. Comprobará si Number está en el rango numérico de Min a Max y producirá un valor de salida que está dentro de ese rango. Específicamente, el resultado de LimitNumber puede especificarse como sigue:
  • Si el Number es mayor que Max, el resultado es Max.
  • Si el Number es inferior al Min, el resultado es Min.
  • Si el Number está en el rango de Min a Max, el resultado es Number.
Como LimitNumber tendrá tres parámetros de entrada, vamos a empezar con tres bloques de constantes que sean las fuentes de datos para estos parámetros. Estas constantes se denominan Min, Max,y Number en la Figura 45.
Para el resultado de salida, también necesitamos un lugar para conectar un cable de datos que contiene los datos de los resultados a una ubicación fuera del bloque que conforman el Mi Bloque. Inversamente a la forma en que se crean los parámetros de entrada cuando una selección de bloques se convierte en un Mi Bloque, un puerto de salida de datos se creará para cada ruta de datos que se origina en el interior de los bloques seleccionados y se conecta a un lugar fuera de los bloques seleccionados.

Regla: Un puerto de salida se creará para cada ruta de datos que se origina en el interior de los bloques seleccionados para crear Mi Bloque y que está conectado a un lugar fuera de (detrás) de los bloques seleccionados.
Una manera fácil de crear esta conexión es utilizar un bloque de escritura Variable para recibir el resultado de la salida. Para mayor claridad, se puede usar Edición - Definir variables para definir una variable del tipo apropiado con un nombre descriptivo. Para un puerto de salida, el bloque de escritura variable debe ser colocado en el extremo de la secuencia utilizada para crear el Mi Bloque como se muestra en la Figura 45.
Figura 45: Preparación para hacer un Mi Bloque con tres parámetros de entrada y un puerto de salida de datos.

 

Usando una variable local en un Mi Bloque

Para una fórmula compleja, como la especificación del resultado LimitNumber basada en los valores de Number, Min y Max que se muestra más arriba, a menudo es útil usar una o más variables temporales para almacenar y modificar resultados intermedios antes de producir el resultado final. Si tuviéramos una variable temporal denominada TempResult, entonces se podría aplicar la fórmula para LimitNumber mediante la siguiente secuencia ordenada de acciones:
  1. Almacene en la variable TempResult el valor de Number.
  2. Comparar Number con Max, y si Number es superior a Max a continuación, sobrescribir la variable TempResult con el valor de Max.
  3. Comparar Number con Min, y si el Number es menor que Min sobrescribe la variable TempResult con el valor de Min.
  4. Conecte la variable TempResult a la ruta de datos de salida.
La variable temporal TempResult en esta secuencia se utiliza sólo en el interior de los contenidos del Bloque y no es necesario antes o después de que Mi Bloque se ejecute. Sin embargo, un posible problema con el uso de una variable temporal dentro de un Mi Bloque es que si la variable tiene un nombre que coincide con otra variable utilizada por un programa que usa el bloque, la variable temporal sobreescribirá a la variable del programa y probablemente creará un error. Algunos lenguajes de programación ofrecen una manera de crear algo que se llama una variable local, lo cual no afectará el programa fuera, pero NXT-G no, así que vamos a utilizar una convención de denominación de variables para evitar este problema.

Nota: Todas las variables en NXT-G son "globales", lo que significa que dos variables con el mismo nombre se refieren a la misma ubicación de almacenamiento. No se puede definir una variable "local" garantizando que afecta sólo al contenido de Mi Bloque.
Usando una convención de nomenclatura para variables significa seguir unas normas acerca de cómo deletrear las variables que se utilizan en diferentes lugares, con el fin de evitar conflictos de nombres. Una variable temporal con un nombre como TempResult es, por desgracia muy probable que entre en conflicto con otra variable que se utiliza en el programa (incluso si no tiene una variable llamada así ahora, puede agregarla más adelante).
La convención de nomenclatura para las variables que sugiero es:
  • Las variables temporales de un Mi bloque empiezan con una letra minúscula y tienen el nombre del Bloque al final después de un guión bajo ("_").
  • Las variables normales comienzan con una letra mayúscula.
Esta convención se asegurará de que las variables temporales no interfieran con las variables normales en un programa o cualquier variable temporal en otros Mis bloques. También hace más fácil identificar las variables temporales de un vistazo porque comienzan con una letra minúscula. La figura 46 muestra una variable temporal number_LimitNumber para su uso en el Bloque LimitNumber.
Figura 46: convención de nomenclatura para las variables "locales" utilizadas sólo en el interior de un Mi Bloque.
La Figura 47 muestra un programa que puede ser utilizado para crear Mi Bloque LimitNumber utilizando la variable temporal number_LimitNumber y la secuencia de las acciones planificadas anteriormente. Tenga en cuenta que sólo una parte del nombre de las variables temporales es visible en los bloques de variables, pero todavía se puede ver la parte importante del nombre al principio.
Figura 47: Un programa para crear el Mi Bloque LimitNumber ( clic para ampliar ).
Como se mencionó en el ejemplo anterior OutAndBack, todos los usos de un parámetro de entrada necesitan ser conectados a la misma ruta de datos que conduce al bloque constante para ese parámetro. Para Mi Bloques largos, puede ser difícil hacer esto. Por ejemplo, tenga en cuenta que la ruta de datos para el parámetro Min en la Figura 47 es bastante larga. Si es demasiado difícil de cablear el acceso a un parámetro de entrada en todos los lugares necesarios, puede introducir otra variable temporal para almacenar una copia del parámetro de entrada. En este caso se utiliza un bloque de escritura Variable para copiar el valor del parámetro de entrada a la variable temporal al inicio del bloque, entonces puede utilizar varios bloques de lectura variable para acceder a la variable temporal en todo el programa.

Nota: El programa de la figura 47 incluye algunos comentarios para su claridad, pero por lo general tendrá que esperar hasta después de la creación de Mi Bloque antes de añadir los comentarios, ya que puede ser necesario cambiarlos de posición después de crear el Mi Bloque.


Prueba de un Mi Bloque antes y después de crearlo

El programa LimitNumber que se muestra en la Figura 47 es más complejo que los otros programas que hemos creado hasta el momento, y también es más difícil de probar, ya que no da lugar a ningún movimiento, sonidos, o mostrar algo en la pantalla del robot. Para probar el programa, es necesario ser capaz de ver el valor de la variable de Result al final. La figura 48 muestra algunos bloques adicionales que pueden ser utilizados para esta prueba. La variable Result se convierte a texto y se muestra en la pantalla NXT, y luego un bucle infinito vacío hace la espera hasta que se aborte el programa (de modo que el resultado no se borrará de la pantalla cuando el programa termina).
Figura 48: Bloques adicionales utilizados para la prueba antes de crear el Mi Bloque LimitNumber.
Los bloques de prueba en la figura 48 deben añadirse al final del programa de la figura 47 antes de crear el Mi Bloque, y entonces el programa se puede probar (antes de que se cree Mi Bloque) ejecutándolo varias veces, modificando cada vez los valores para las constantes Number, Min, y Max al comienzo del programa y observando que el valor de Result que se muestra para asegurarse de que se comporta como se espera. Lo mejor es hacer la prueba antes de crear el Mi Bloque, porque algunas cosas no se pueden cambiar (o no se pueden cambiar fácilmente) después. La figura 49 muestra el programa completo para probar y crear el Mi Bloque LimitNumber con los bloques de prueba adicional.
Figura 49: Selección de los bloques que van dentro del Mi Bloque LimitNumber ( clic para ampliar ).

Nota: Antes de crear un Mi Bloque, es importante guardar una copia del programa (aparte de con la que se está trabajando, y que también se debe guardar) en caso de que el Mi Bloque no salga como esperas es necesario volver al programa original para realizar los cambios. Puede guardar una copia con el comando de menú Archivo - Guardar como.
Por ejemplo, puede utilizar Guardar como para guardar una copia del programa que se muestra en la Figura 49 con nombre LimitNumberProg1 y luego en Guardar como otra copia nombrada LimitNumberProg2, y luego crear el Mi Bloque desde LimitNumberProg2.

Para crear el Mi Bloque LimitNumber desde el programa completo, seleccione los bloques después de los bloques de Constantes al principio y antes del bloque que escribe el resultado en la variable de salida Result (Figura 49). Esta selección presenta tres fuentes de datos de entrada fuera de la selección al comienzo, que se convertirán en los tres parámetros de entrada, y una ruta de datos fuera de la selección en el extremo, lo que resultará en el puerto de salida de datos. El programa resultante con la selección sustituida por el Mi Bloque se muestra en la Figura 50. Tenga en cuenta que los bloques de pruebas todavía están allí después del bloque LimitNumber. Puede probar de nuevo el programa en este momento si lo desea, pero debe comportarse igual que lo hacía el programa completo antes de crear el Mi Bloque.
Figura 50: El programa de pruebas después de crear el Mi Bloque LimitNumber.
El contenido del Mi Bloque LimitNumber se muestra en la Figura 51. Aquí los parámetros se han cambiado de nombre, se ha añadido un comentario de encabezado del bloque, y los cables y los comentarios fueron reordenados. Tenga en cuenta que los resultados de los puertos de salida crean un bloque de conexión similar a los parámetros de entrada y también se pueden cambiar.
Figura 51: El contenido del Mi Bloque LimitNumber terminado ( clic para ampliar ).
Como prueba final del bloque LimitNumber, puede crear un nuevo programa que tiene una nueva copia del bloque LimitNumber conectado directamente a los bloques de prueba (Figura 52), y probar las diferentes combinaciones de los parámetros de entrada introduciéndolos directamente en el panel de configuración del bloque LimitNumber.
Figura 52: Prueba final con una nueva copia del Mi Bloque LimitNumber.

 

Un proceso paso a paso para crear y probar un Mi Bloque complejo

Como vimos en el Mi Bloque LimitNumber de la sección anterior, hay varios pasos que realizar en la creación de un Mi Bloque complejo, y momentos estratégicos durante el proceso en el que debe guardar y poner a prueba su trabajo. En esta sección se resume el proceso paso a paso que puede utilizar para guiarse en este proceso.

Un proceso paso a paso para crear y probar un Mi Bloque complejo:
  1. Decida qué parámetros de entrada, puertos de salida de datos y variables utilizará Mi Bloque para comunicarse con los programas que lo utilizan. No se puede cambiar el número o tipo de parámetros o puertos después de la creación de un mi bloque, por lo que es una buena idea tratar de pensar en esto antes.
  2. Crear un nuevo programa que se usará para probar y crear el Mi Bloque. Llamemos a este el programa de pruebas.
  3. En el programa de pruebas, insertar un bloque constante para cada parámetro de entrada en el inicio del programa, y un bloque de escritura variable para cada puerto de salida de datos al final del programa ( Figura 45 ).
  4. Definir las variables temporales para el uso dentro del Mi Bloque utilizando una convención de nomenclatura que evita conflictos de nombres con otras variables. Se sugiere que las variables temporales empiecen con una letra minúscula y se añada el nombre del Mi Bloque al final después de un guión bajo ("_") y las variables normales comienzan con una letra mayúscula ( Figura 46 ).
  5. Crear el contenido del Mi Bloque en el programa de pruebas como una secuencia contigua de bloques entre los bloques de parámetro de entrada constante y los bloques de variables de salida ( Figura 47 ).
  6. Asegúrese de que si un parámetro de entrada se utiliza varias veces todos los accesos están conectados a la misma ruta de datos que conduce al bloque constante original para ese parámetro de entrada. Si una ruta de datos se hace demasiado larga o compleja de gestionar, se puede introducir una variable temporal para almacenar el valor de un parámetro de entrada y acceder a ella a partir de la variable temporal en su lugar.
  7. Añadir bloques de prueba al principio y/o al final del programa de pruebas para ayudarle a comprobar que funciona como se espera ( Figura 48 ).
  8. Ejecutar varios casos de prueba, modificando los valores de los parámetros de entrada en los bloques de constantes entre ejecuciones para poner a prueba todas los casos posibles. Haga los cambios necesarios en el programa de pruebas.
  9. Guarde dos copias del programa de prueba utilizando Guardar como, para que siempre tenga una copia de seguridad antes de que se creara el Mi Bloque.
  10. Seleccione la secuencia de los bloques que conforman el contenido del Mi Bloque. Esto debería incluir todos los bloques después de los bloques constantes de parámetros de entrada y antes de cualquier bloque de salida Escribir variable, y no debe incluir los bloques añadidos para la prueba ( Figura 49 ).
  11. Haga clic en el botón Crear mi Bloquear de la barra de herramientas y utilice el Mi Generador de Bloques para especificar el nombre y el icono de Mi Bloque ( figuras 3 a 5 ).
  12. Compruebe que el programa de prueba modificado todavía parece correcto después de Mi Bloque haya sido sustituido, en especial las rutas de datos para los parámetros de entrada y los puertos de salida. Realice hacer más ejecuciones de prueba en este momento si lo desea ( Figura 50 ).
  13. Haga doble clic en el Mi Bloque en el programa de pruebas para abrir su contenido. Cambie el nombre de los parámetros de entrada y puertos de salida a nombres descriptivos, añada un comentario de encabezado de bloque y otros comentarios sobre los contenidos, y coloque la posición de las rutas de cables como se desee. Todos los trazados de cables que sean demasiado difícil de gestionar se pueden borrar y volver a crear cuando sea necesario ( Figura 51 ).
  14. Guardar el contenido de mi bloque con Archivo - Guardar.
  15. Crear un nuevo programa para probar la última versión de Mi Bloque. Inserte una nueva copia del Mi Bloque de la paleta personalizada y añada cualquier código de prueba necesario para probarlo, y luego realice una serie completa de pruebas de funcionamiento de nuevo (Figura 52 ).

sábado, 6 de abril de 2013

Bloques personalizados (NXT-G) 4/6

Esta es la cuarta entrega de la traducción del tutorial realizado por Dave Parker sobre programación de bloques en NXT-G. 

Hacer una copia modificada de un Mi Bloque

El bloque Forward desarrollado en las secciones anteriores proporciona una manera razonablemente flexible para hacer un robot vaya hacia adelante, pero ¿y para ir hacia atrás?. El bloque de Mover estándar tiene un parámetro de Dirección que se puede utilizar para especificar si desea ir adelante o atrás, pero nuestro bloque Forward no lo tiene. Podríamos hacer otra versión de Mi Bloque que incluyera otro parámetro de entrada para especificar la dirección, pero otra opción es crear un nuevo Mi Bloque de nombre Backward que va hacia atrás en vez de hacia adelante. Esta opción tiende a hacer el programa más fácil de leer, ya que verá los nombres de los bloques que indican claramente "Adelante" y "Atrás" en el programa. Esta sección le mostrará cómo hacer una copia modificada de un Mi Bloque existente con un nombre diferente, lo cual es útil en situaciones como ésta, así como muchas otras situaciones (es posible que desee probar algunas variantes diferentes de un bloque, por ejemplo ).

Copia de un Mi Bloque

Queremos crear un Mi Bloque Backward, que va a ser exactamente igual que Mi Bloque Forward con excepción de la dirección del movimiento, por lo que puede hacer una copia de Mi Bloque Forward, realizar el cambio de dirección, y luego cambiar el nombre a Backward. Para hacer una copia nueva de un Mi Bloque, comience usando el comando Edición - comando Administrar paleta customizada (Figura 38).

Nota: También puede utilizar el comando Archivo - Guardar como para crear una nueva copia de un Mi Bloque con un nombre diferente, pero en Guardar como también reemplazará los actuales usos del Bloque en programas abiertos con el nuevo nombre, que no es probable que sea lo que quiere, por lo que lo normal es que desee utilizar Administrar paleta customizada en su lugar.
La opción de menú Edición - comando Administrar paleta customizada abrirá la carpeta de su ordenador donde se almacenan los bloques de la paleta personalizada, que es una carpeta llamada Mis Bloques en el lugar donde se almacenan los programas NXT-G para el perfil de usuario.

Figura 38: El comando de menú Gestionar Paleta Customizada
abre la ubicación donde se almacenan Mis Bloques.
En la carpeta de bloques, abra la subcarpeta denominada Mis Bloques, que es la carpeta en donde se almacenan. En la carpeta Mis bloques, puede seleccionar el Mi Bloque que desea copiar, utilice Edición - Copiar y Editar - Pegar para crear una copia (Figura 39), a continuación, seleccione y cambie el nombre del archivo (Figura 40).
Figura 39: Cómo hacer una copia de un Mi Bloque (RBT). El archivo creará otra copia de Mi Bloque.
Figura 40: Cambiar el nombre de un archivo de Mi Bloque cambiará el nombre del bloque.
Una vez que haya creado y cambiado el nombre de la copia, puede hacer doble clic en él para abrirlo y, a continuación, realice los cambios necesarios en el contenido. La figura 41 muestra el contenido de la Mi Bloque Backward.
Figura 41: El Mi Bloque Backward es como el Bloque Forward Block en el que se
invierte la dirección del motor y modificado el comentario de cabecera.

Cambiar el icono de un Mi Bloque

En el caso de los mis bloques Forward y Backward puede estar bien que para los dos bloques se muestre el mismo icono en el frontal pero en algunos casos, cuando se crea una copia modificada de un Mi Bloque, puede quererse cambiar el icono del nuevo bloque. La figura 42a muestra una situación en la que se copió un Mi Bloque llamado LeftPivotAngle y modificado para crear un bloque similar llamado RightPivotAngle. En este caso, tendrá que cambiar el icono del bloque RightPivotAngle nuevo.
Para cambiar el icono de Mi Bloque, es necesario seleccionar la utilización de un bloque (no se puede cambiar el icono dentro de los contenidos del Mi Bloque), a continuación, utilice el comando Edición - Editar icono Mi Bloque. Este comando la segunda etapa de Mi Generador de Bloques ( Figura 5 ), que le permitirá modificar o reemplazar el icono(Figura 42b). Una vez que haya cambiado el icono, se cambia para todos los nuevos usos del Mi Bloque.

Figura 42a / b: Cambiar el icono de Mi un bloque (antes y después).

sábado, 30 de marzo de 2013

Bloques personalizados (NXT-G) 3/6

Y con ésta entrada llegamos a la mitad del tutorial que surge de la traducción del que original realizado por Dave Parker

Variables, cableado, y la edición de un Mi Bloque

El uso de parámetros de entrada es una manera en que un programa de NXT-G pueda enviar datos a un Mi Bloque. Otra forma es mediante el uso de variables. En esta sección, vamos a utilizar el bloque de Variables para enviar una pieza adicional de datos para el bloque de movimiento Forward que hemos desarrollado en el apartado anterior, a fin de que el bloque Forward tenga más capacidad y flexibilidad. De paso, vamos a aprender un par de otras técnicas que son útiles al editar o trabajar con Mi Bloques complejos.

Uso de variables para enviar datos a un Mi Bloque


Como se indicó en la sección anterior, Mi Bloque Forward supone que el robot está utilizando los neumáticos estándar NXT 2.0 en las ruedas con el fin de ser capaz de convertir centímetros de distancia del recorrido deseado a los grados de rotación del motor. Pero si un robot utilizase en su lugar orugas (o diferentes neumáticos), la conversión no sería correcta. Especialmente para un robot como el multi-Bot que puede llevar orugas y neumáticos, sería bueno si pudiéramos hacer un Mi Bloque que trabajase tanto para orugas como neumáticos. Podríamos cambiar el Mi Bloque Forward para agregar un tercer parámetro para esto (lo que requeriría empezar de nuevo, ya que no se puede agregar un parámetro a una existente Mi Bloque), pero aquí vamos a hacer esto con una variable.
Igual que una variable en NXT-G puede ser escrita en un punto de un programa y luego leerse en otro punto, usándose para pasar información de un punto a otro, una variable también se puede utilizar para pasar información entre un programa y un Mi Bloque. Para ampliar nuestro bloque Forward para hacer los cálculos correctos si se utilizan bandas de rodadura (orugas) o el estándar NXT 2.0, vamos a definir una variable de tipo lógico (el valor es verdadero o falso) de nombre Treads. Esta variable tendrá el valor Verdadero si el robot está utilizando bandas de rodadura, o Falso si se utilizan neumáticos. En concreto, en el programa principal se escribe el valor de la variable al principio del programa, y el contenido de Mi Bloque Forward lee la variable para decidir qué hacer. Si Treads es falso (el robot está utilizando neumáticos como antes), entonces cada centímetro de viaje requiere 27 grados de rotación del motor como antes. Sin embargo, si Treads es True, entonces cada centímetro requerirá 36 grados de rotación del motor (determinado por experimentación con un robot con orugas).

Definición de variables en un Mi Bloque


A diferencia de agregar un parámetro a un Mi Bloque, añadir una variable no requiere volver a empezar con la creación Mi Bloque, basta con abrir el contenido de Mi Bloque Forward y hacer nuestros cambios allí. El primer paso es definir la variable en Mi Bloque. La figura 31 muestra la variable Treads se define utilizando comando de menú Edición - Definir Variables en el contenido de Mi Bloque Forward.
Figura 31: Las variables definidas en el contenido de un Mi bloque puede ser utilizadas para enviar datos al bloque.

 

Reescribiendo el contenido de un Mi Bloque


Después de definir la variable Treads en Mi Bloque Forward, estamos dispuestos a modificar el contenido de la Mi Bloque Forward para usarla. Utilizar la variable de la forma deseada en realidad dará lugar a un cambio sustancial en la forma en que fue escrito el bloque, por lo que en este punto, es útil saber que una vez que Mi Bloque ha sido creado, pueden realizarse cambios importantes, hasta el punto de volver a escribirlo casi completamente si lo desea. De hecho, las únicas cosas que no puede cambiar de un Mi Bloque son el número y los tipos de los parámetros. Todo lo demás se puede borrar y volver a crear si es necesario.
La figura 32 muestra el contenido de Mi Bloque Forward después de eliminar los anteriores cálculos de cm a grados e iniciar el proceso de utilización de variable Treads para hacer esto de una manera diferente. El comentario de cabecera de bloque también se ha revisado para agregar una mención de la utilización de la variable Treads. Tenga en cuenta que los dos bloques de parámetros de conexión no se pueden eliminar, pero puede eliminar los cables que van de ellos y luego volver a conectarlos a los bloques nuevos o modificados, como vamos a hacer a continuación.
Figura 32: Empieza a escribir el Mi Bloque Forward utilizando la variable Treads.

Cables compartidos en una bifurcación


Con el fin de obtener el comportamiento que queremos de la variable de Treads en el bloque Forward, utilizaremos la técnica de cableado en un bloque de bifuración. Aunque no es específico para Mi Bloquess, esta técnica es especialmente útil cuando se trabaja con ellos debido a la necesidad de compartir los accesos a un parámetro, por lo que lo veremos a través de un ejemplo.
Una Bifurcación se utiliza para comprobar el valor de la variable Treads y decidir si se debe multiplicar el parámetro Distancia cm por 27 para neumáticos (cuando Treads es falso) o por 36 para orugas (cuando Treads cuando es verdadera). La Figura 33 muestra la primera parte del conmutador (Treads es verdadera) completada y cableada hasta un bloque Math que se multiplica por 36. Tenga en cuenta que la bifurcación debe tener la opción Vista plana sin marcar para mostrar la vista de pestañas, que permite pasar los cables de datos del exterior al interruptor.
Figura 33: La pestaña verdadera de la Bifurcaicón utiliza un bloque de matemáticas para multiplicar por 36 cm de distancia.
La figura 34 muestra el panel de control después de seleccionar la pestaña Falso y añadir otro bloque de matemáticas que se multiplica por 27 en lugar de 36.
Figura 34: Pestaña falsa del conmutador utiliza un bloque de matemáticas para multiplicar Distance cm por 27.
Ahora podemos conectar este bloque Math a los dos puntos de conexión ocultos que se crearon en el límite de la Bifurcación cuando la parte Veradero estaba visible. Para ello, se dibujan cables desde el bloque de Matemáticas y terminando en los dos puntos de conexión en los bordes de la bifurcación, como se muestra en la Figura 35a / b.
Figura 35a / b: Los puertos del bloque de matemáticas en la pestaña Falso de la Bifurcación se conectan a los puntos donde los cables entraron y salieron del conmutador en la pestaña Verdadero.

El resultado final es que los dos bloques matemáticos (una en cada pestaña de la Bifurcación) usan la mismo parámetro de entrada Distance cm (aunque sólo uno de ellos se ejecutará, en función del valor de la variable de Treads), y el valor del resultado del bloque matemático que fue elegido enviará sus datos al puerto Duración del bloque Mover.
 

Uso de Mis Variables de Mi Bloque en el Programa Principal


Una vez que se ha modificado el contenido de Mi Bloque Forward para leer la variable de Treads y modificar en consecuencia sus cálculos, podemos cambiar el programa principal para utilizarlo. El programa principal tendrá que escribir el valor de la variable Treads al valor correcto para el robot antes de que la variable de Treads sea leída por el bloque Forward. Sin embargo, antes de que podamos escribir la variable de Treads en el programa principal, primero debemos definirla. A pesar de que ya se ha definido la variable en el contenido del bloque Forward, tenemos que definirla de nuevo en el programa principal, como se muestra en la Figura 36. Es importante cuidar que el nombre de la variable sea exactamente el mismo que el definido en el bloque, incluyendo la capitalización (mayúsculas y minúsculas).
Nota: Cada programa y Mi Bloque tiene su propia lista de variables que se han definido y se pueden utilizar en su interior. Sin embargo, si una variable en un programa tiene el mismo nombre que una variable en un Mi Bloque utilizado por ese programa, las dos variables se refieren a la misma ubicación de almacenamiento, y por lo tanto se puede utilizar para pasar datos entre el programa y el Mi Bloque. Esto se refiere a veces como una variable "global" en otros lenguajes de programación, y de hecho todas las variables en NXT-G son globales en este sentido.
Figura 36: una variable definida en el programa principal con el mismo nombre que
una variable en un Mi Bloque tendrá acceso a la misma ubicación de almacenamiento.

La figura 37 muestra un ejemplo de programa de prueba que utiliza Mi Bloque Forward con la variable Treads. Al comienzo del programa, la variable Treads está actualizada con el valor Verdadero para indicar que el robot utiliza bandas de rodadura y no neumáticos. A continuación, el bloque Forward se utiliza dos veces junto con el bloque BeepBeep que hemos creado antes. Aunque el bloque Forward se utiliza dos veces, sólo necesita escribir el valor de la variable Treads una vez al principio del programa, y todas las instancias del bloque utilizan ese valor.
Nota: Si usted no escribe un valor en una variable antes de que se lea, entonces una variable de tipo lógico tendrá el valor Falso, una variable de tipo Number tendrá el valor 0 (cero), y una variable de tipo String estará vacía. Sin embargo, incluso si este es el valor deseado para una variable concreta, es una buena idea siempre escribir explícitamente el valor deseado de la variable antes de leerlo, para reducir la confusión y para ayudar a recordar a usted (y cualquier otro que lea de su programa) que la variable se usa más tarde.
Figura 37: Una variable escrita en el programa principal puede ser leída por los Mi Bloques.

Ahora bien, si más tarde decido modificar nuestro robot para utilizar los neumáticos en lugar de bandas de rodadura, podríamos simplemente cambiar el bloque de variable Treads al principio del programa para establecerla en Falso en vez de Verdarero, y todos los usos del bloque Forward automáticamente se adaptarán correctamente. Tenga en cuenta que si hubiéramos decidido utilizar un tercer parámetro de entrada para el bloque Forward para enviar el valor de Treads en lugar de utilizar una variable, cada uso de Forward en el programa tendría que ser cambiado para especificar el valor nuevo de Treads, por lo que en este caso utilizando una variable en lugar del parámetro parece mejor. En general, si el valor de un elemento de datos que necesita un Mi Bloque no va a cambiar mientras se ejecuta un programa, se puede considerar el uso de una variable en lugar de un parámetro de entrada.
Nota: Las variables también se puede utilizar para enviar datos desde un Mi Bloque al programa que usa el bloque. Un resultado calculado por mi un bloque que fue almacenado en una variable podría ser leído posteriormente por el programa principal u otros Mi Bloques en el programa.